summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--target/linux/cns3xxx/patches-4.14/140-fix-ethernet-irq-imbalance.patch77
1 files changed, 77 insertions, 0 deletions
diff --git a/target/linux/cns3xxx/patches-4.14/140-fix-ethernet-irq-imbalance.patch b/target/linux/cns3xxx/patches-4.14/140-fix-ethernet-irq-imbalance.patch
new file mode 100644
index 0000000000..3538586f6f
--- /dev/null
+++ b/target/linux/cns3xxx/patches-4.14/140-fix-ethernet-irq-imbalance.patch
@@ -0,0 +1,77 @@
+--- a/drivers/net/ethernet/cavium/cns3xxx_eth.c
++++ b/drivers/net/ethernet/cavium/cns3xxx_eth.c
+@@ -712,26 +712,20 @@ static int eth_poll(struct napi_struct *
+ }
+
+ rx_ring->cur_index = i;
+- if (!received) {
+- napi_complete(napi);
+- enable_irq(sw->rx_irq);
+- budget = 0;
+-
+- /* If 1 or more frames came in during IRQ enable, re-schedule */
+- if (rx_ring->desc[i].cown)
+- eth_schedule_poll(sw);
+- }
+-
+- spin_lock_bh(&tx_lock);
+- eth_complete_tx(sw);
+- spin_unlock_bh(&tx_lock);
+
+ cns3xxx_alloc_rx_buf(sw, received);
+-
+ wmb();
+ enable_rx_dma(sw);
+
+- return budget;
++ if (received < budget && napi_complete_done(napi, received)) {
++ enable_irq(sw->rx_irq);
++ }
++
++ spin_lock_bh(&tx_lock);
++ eth_complete_tx(sw);
++ spin_unlock_bh(&tx_lock);
++
++ return received;
+ }
+
+ static void eth_set_desc(struct sw *sw, struct _tx_ring *tx_ring, int index,
+@@ -856,18 +850,6 @@ static void cns3xxx_get_drvinfo(struct n
+ strcpy(info->bus_info, "internal");
+ }
+
+-static int cns3xxx_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+-{
+- struct port *port = netdev_priv(dev);
+- return phy_ethtool_gset(port->phydev, cmd);
+-}
+-
+-static int cns3xxx_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+-{
+- struct port *port = netdev_priv(dev);
+- return phy_ethtool_sset(port->phydev, cmd);
+-}
+-
+ static int cns3xxx_nway_reset(struct net_device *dev)
+ {
+ struct port *port = netdev_priv(dev);
+@@ -876,8 +858,8 @@ static int cns3xxx_nway_reset(struct net
+
+ static struct ethtool_ops cns3xxx_ethtool_ops = {
+ .get_drvinfo = cns3xxx_get_drvinfo,
+- .get_settings = cns3xxx_get_settings,
+- .set_settings = cns3xxx_set_settings,
++ .get_link_ksettings = phy_ethtool_get_link_ksettings,
++ .set_link_ksettings = phy_ethtool_set_link_ksettings,
+ .nway_reset = cns3xxx_nway_reset,
+ .get_link = ethtool_op_get_link,
+ };
+@@ -1177,7 +1159,7 @@ static int eth_init_one(struct platform_
+ goto err_remove_mdio;
+ }
+
+- strcpy(napi_dev->name, "switch%d");
++ strcpy(napi_dev->name, "cns3xxx_eth");
+ napi_dev->features = NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_FRAGLIST;
+
+ SET_NETDEV_DEV(napi_dev, &pdev->dev);