aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/cns3xxx/patches-4.14/140-fix-ethernet-irq-imbalance.patch
blob: 3538586f6ff80b5c8c7ffad752a03e7f1dd8059a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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);