Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
此提交包含在:
@@ -705,7 +705,7 @@ qca8k_setup(struct dsa_switch *ds)
|
||||
BIT(0) << QCA8K_GLOBAL_FW_CTRL1_UC_DP_S);
|
||||
|
||||
/* Setup connection between CPU port & user ports */
|
||||
for (i = 0; i < DSA_MAX_PORTS; i++) {
|
||||
for (i = 0; i < QCA8K_NUM_PORTS; i++) {
|
||||
/* CPU port gets connected to all user ports of the switch */
|
||||
if (dsa_is_cpu_port(ds, i)) {
|
||||
qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(QCA8K_CPU_PORT),
|
||||
@@ -1077,7 +1077,7 @@ qca8k_sw_probe(struct mdio_device *mdiodev)
|
||||
if (id != QCA8K_ID_QCA8337)
|
||||
return -ENODEV;
|
||||
|
||||
priv->ds = dsa_switch_alloc(&mdiodev->dev, DSA_MAX_PORTS);
|
||||
priv->ds = dsa_switch_alloc(&mdiodev->dev, QCA8K_NUM_PORTS);
|
||||
if (!priv->ds)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@@ -339,10 +339,12 @@ int rtl8366_vlan_prepare(struct dsa_switch *ds, int port,
|
||||
const struct switchdev_obj_port_vlan *vlan)
|
||||
{
|
||||
struct realtek_smi *smi = ds->priv;
|
||||
u16 vid;
|
||||
int ret;
|
||||
|
||||
if (!smi->ops->is_vlan_valid(smi, port))
|
||||
return -EINVAL;
|
||||
for (vid = vlan->vid_begin; vid < vlan->vid_end; vid++)
|
||||
if (!smi->ops->is_vlan_valid(smi, vid))
|
||||
return -EINVAL;
|
||||
|
||||
dev_info(smi->dev, "prepare VLANs %04x..%04x\n",
|
||||
vlan->vid_begin, vlan->vid_end);
|
||||
@@ -370,8 +372,9 @@ void rtl8366_vlan_add(struct dsa_switch *ds, int port,
|
||||
u16 vid;
|
||||
int ret;
|
||||
|
||||
if (!smi->ops->is_vlan_valid(smi, port))
|
||||
return;
|
||||
for (vid = vlan->vid_begin; vid < vlan->vid_end; vid++)
|
||||
if (!smi->ops->is_vlan_valid(smi, vid))
|
||||
return;
|
||||
|
||||
dev_info(smi->dev, "add VLAN on port %d, %s, %s\n",
|
||||
port,
|
||||
|
@@ -507,7 +507,8 @@ static int rtl8366rb_setup_cascaded_irq(struct realtek_smi *smi)
|
||||
irq = of_irq_get(intc, 0);
|
||||
if (irq <= 0) {
|
||||
dev_err(smi->dev, "failed to get parent IRQ\n");
|
||||
return irq ? irq : -EINVAL;
|
||||
ret = irq ? irq : -EINVAL;
|
||||
goto out_put_node;
|
||||
}
|
||||
|
||||
/* This clears the IRQ status register */
|
||||
@@ -515,7 +516,7 @@ static int rtl8366rb_setup_cascaded_irq(struct realtek_smi *smi)
|
||||
&val);
|
||||
if (ret) {
|
||||
dev_err(smi->dev, "can't read interrupt status\n");
|
||||
return ret;
|
||||
goto out_put_node;
|
||||
}
|
||||
|
||||
/* Fetch IRQ edge information from the descriptor */
|
||||
@@ -537,7 +538,7 @@ static int rtl8366rb_setup_cascaded_irq(struct realtek_smi *smi)
|
||||
val);
|
||||
if (ret) {
|
||||
dev_err(smi->dev, "could not configure IRQ polarity\n");
|
||||
return ret;
|
||||
goto out_put_node;
|
||||
}
|
||||
|
||||
ret = devm_request_threaded_irq(smi->dev, irq, NULL,
|
||||
@@ -545,7 +546,7 @@ static int rtl8366rb_setup_cascaded_irq(struct realtek_smi *smi)
|
||||
"RTL8366RB", smi);
|
||||
if (ret) {
|
||||
dev_err(smi->dev, "unable to request irq: %d\n", ret);
|
||||
return ret;
|
||||
goto out_put_node;
|
||||
}
|
||||
smi->irqdomain = irq_domain_add_linear(intc,
|
||||
RTL8366RB_NUM_INTERRUPT,
|
||||
@@ -553,12 +554,15 @@ static int rtl8366rb_setup_cascaded_irq(struct realtek_smi *smi)
|
||||
smi);
|
||||
if (!smi->irqdomain) {
|
||||
dev_err(smi->dev, "failed to create IRQ domain\n");
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto out_put_node;
|
||||
}
|
||||
for (i = 0; i < smi->num_ports; i++)
|
||||
irq_set_parent(irq_create_mapping(smi->irqdomain, i), irq);
|
||||
|
||||
return 0;
|
||||
out_put_node:
|
||||
of_node_put(intc);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rtl8366rb_set_addr(struct realtek_smi *smi)
|
||||
|
@@ -1896,7 +1896,9 @@ static int sja1105_set_ageing_time(struct dsa_switch *ds,
|
||||
return sja1105_static_config_reload(priv);
|
||||
}
|
||||
|
||||
/* Caller must hold priv->tagger_data.meta_lock */
|
||||
/* Must be called only with priv->tagger_data.state bit
|
||||
* SJA1105_HWTS_RX_EN cleared
|
||||
*/
|
||||
static int sja1105_change_rxtstamping(struct sja1105_private *priv,
|
||||
bool on)
|
||||
{
|
||||
@@ -1953,16 +1955,17 @@ static int sja1105_hwtstamp_set(struct dsa_switch *ds, int port,
|
||||
break;
|
||||
}
|
||||
|
||||
if (rx_on != priv->tagger_data.hwts_rx_en) {
|
||||
spin_lock(&priv->tagger_data.meta_lock);
|
||||
if (rx_on != test_bit(SJA1105_HWTS_RX_EN, &priv->tagger_data.state)) {
|
||||
clear_bit(SJA1105_HWTS_RX_EN, &priv->tagger_data.state);
|
||||
|
||||
rc = sja1105_change_rxtstamping(priv, rx_on);
|
||||
spin_unlock(&priv->tagger_data.meta_lock);
|
||||
if (rc < 0) {
|
||||
dev_err(ds->dev,
|
||||
"Failed to change RX timestamping: %d\n", rc);
|
||||
return -EFAULT;
|
||||
return rc;
|
||||
}
|
||||
priv->tagger_data.hwts_rx_en = rx_on;
|
||||
if (rx_on)
|
||||
set_bit(SJA1105_HWTS_RX_EN, &priv->tagger_data.state);
|
||||
}
|
||||
|
||||
if (copy_to_user(ifr->ifr_data, &config, sizeof(config)))
|
||||
@@ -1981,7 +1984,7 @@ static int sja1105_hwtstamp_get(struct dsa_switch *ds, int port,
|
||||
config.tx_type = HWTSTAMP_TX_ON;
|
||||
else
|
||||
config.tx_type = HWTSTAMP_TX_OFF;
|
||||
if (priv->tagger_data.hwts_rx_en)
|
||||
if (test_bit(SJA1105_HWTS_RX_EN, &priv->tagger_data.state))
|
||||
config.rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_EVENT;
|
||||
else
|
||||
config.rx_filter = HWTSTAMP_FILTER_NONE;
|
||||
@@ -2004,12 +2007,12 @@ static void sja1105_rxtstamp_work(struct work_struct *work)
|
||||
|
||||
mutex_lock(&priv->ptp_lock);
|
||||
|
||||
now = priv->tstamp_cc.read(&priv->tstamp_cc);
|
||||
|
||||
while ((skb = skb_dequeue(&data->skb_rxtstamp_queue)) != NULL) {
|
||||
struct skb_shared_hwtstamps *shwt = skb_hwtstamps(skb);
|
||||
u64 ts;
|
||||
|
||||
now = priv->tstamp_cc.read(&priv->tstamp_cc);
|
||||
|
||||
*shwt = (struct skb_shared_hwtstamps) {0};
|
||||
|
||||
ts = SJA1105_SKB_CB(skb)->meta_tstamp;
|
||||
@@ -2030,7 +2033,7 @@ static bool sja1105_port_rxtstamp(struct dsa_switch *ds, int port,
|
||||
struct sja1105_private *priv = ds->priv;
|
||||
struct sja1105_tagger_data *data = &priv->tagger_data;
|
||||
|
||||
if (!data->hwts_rx_en)
|
||||
if (!test_bit(SJA1105_HWTS_RX_EN, &data->state))
|
||||
return false;
|
||||
|
||||
/* We need to read the full PTP clock to reconstruct the Rx
|
||||
@@ -2279,6 +2282,7 @@ static int sja1105_probe(struct spi_device *spi)
|
||||
tagger_data = &priv->tagger_data;
|
||||
skb_queue_head_init(&tagger_data->skb_rxtstamp_queue);
|
||||
INIT_WORK(&tagger_data->rxtstamp_work, sja1105_rxtstamp_work);
|
||||
spin_lock_init(&tagger_data->meta_lock);
|
||||
|
||||
/* Connections between dsa_port and sja1105_port */
|
||||
for (i = 0; i < SJA1105_NUM_PORTS; i++) {
|
||||
|
@@ -423,7 +423,8 @@ int sja1105_static_config_upload(struct sja1105_private *priv)
|
||||
rc = static_config_buf_prepare_for_upload(priv, config_buf, buf_len);
|
||||
if (rc < 0) {
|
||||
dev_err(dev, "Invalid config, cannot upload\n");
|
||||
return -EINVAL;
|
||||
rc = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
/* Prevent PHY jabbering during switch reset by inhibiting
|
||||
* Tx on all ports and waiting for current packet to drain.
|
||||
@@ -432,7 +433,8 @@ int sja1105_static_config_upload(struct sja1105_private *priv)
|
||||
rc = sja1105_inhibit_tx(priv, port_bitmap, true);
|
||||
if (rc < 0) {
|
||||
dev_err(dev, "Failed to inhibit Tx on ports\n");
|
||||
return -ENXIO;
|
||||
rc = -ENXIO;
|
||||
goto out;
|
||||
}
|
||||
/* Wait for an eventual egress packet to finish transmission
|
||||
* (reach IFG). It is guaranteed that a second one will not
|
||||
|
新增問題並參考
封鎖使用者