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);