summaryrefslogtreecommitdiffstats
path: root/recipes-networking/dpdk/files/igb_ethdev_loopback.patch
blob: 6b979ca6c8cb537ec03b5ba3fb5d8f580bc04917 (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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
Index: dpdk/lib/librte_pmd_e1000/igb_ethdev.c
===================================================================
--- dpdk.orig/lib/librte_pmd_e1000/igb_ethdev.c	2014-03-11 12:35:49.267083184 +0200
+++ dpdk/lib/librte_pmd_e1000/igb_ethdev.c	2014-03-11 12:36:23.015082260 +0200
@@ -701,50 +701,67 @@
 		E1000_WRITE_REG(hw, E1000_EITR(0), 0xFFFF);
 	}
 
-	/* Setup link speed and duplex */
-	switch (dev->data->dev_conf.link_speed) {
-	case ETH_LINK_SPEED_AUTONEG:
+	if (dev->data->dev_conf.lpbk_mode == 1) {
+	    uint32_t reg;
+
+	    reg = E1000_READ_REG(hw, E1000_RCTL);
+	    reg |= E1000_RCTL_LBM_MAC;
+	    E1000_WRITE_REG(hw, E1000_RCTL, reg);
+
+	    reg = E1000_READ_REG(hw, E1000_CTRL);
+	    reg |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX | E1000_CTRL_FD |
+		    E1000_CTRL_SPD_1000);
+	    E1000_WRITE_REG(hw, E1000_CTRL, reg);
+
+	    reg = E1000_READ_REG(hw, E1000_EEER);
+	    reg |= (1 << 28);
+	    E1000_WRITE_REG(hw, E1000_EEER, reg);
+	} else {
+	    /* Setup link speed and duplex */
+	    switch (dev->data->dev_conf.link_speed) {
+	    case ETH_LINK_SPEED_AUTONEG:
 		if (dev->data->dev_conf.link_duplex == ETH_LINK_AUTONEG_DUPLEX)
-			hw->phy.autoneg_advertised = E1000_ALL_SPEED_DUPLEX;
+		    hw->phy.autoneg_advertised = E1000_ALL_SPEED_DUPLEX;
 		else if (dev->data->dev_conf.link_duplex == ETH_LINK_HALF_DUPLEX)
-			hw->phy.autoneg_advertised = E1000_ALL_HALF_DUPLEX;
+		    hw->phy.autoneg_advertised = E1000_ALL_HALF_DUPLEX;
 		else if (dev->data->dev_conf.link_duplex == ETH_LINK_FULL_DUPLEX)
-			hw->phy.autoneg_advertised = E1000_ALL_FULL_DUPLEX;
+		    hw->phy.autoneg_advertised = E1000_ALL_FULL_DUPLEX;
 		else
-			goto error_invalid_config;
+		    goto error_invalid_config;
 		break;
-	case ETH_LINK_SPEED_10:
+	    case ETH_LINK_SPEED_10:
 		if (dev->data->dev_conf.link_duplex == ETH_LINK_AUTONEG_DUPLEX)
-			hw->phy.autoneg_advertised = E1000_ALL_10_SPEED;
+		    hw->phy.autoneg_advertised = E1000_ALL_10_SPEED;
 		else if (dev->data->dev_conf.link_duplex == ETH_LINK_HALF_DUPLEX)
-			hw->phy.autoneg_advertised = ADVERTISE_10_HALF;
+		    hw->phy.autoneg_advertised = ADVERTISE_10_HALF;
 		else if (dev->data->dev_conf.link_duplex == ETH_LINK_FULL_DUPLEX)
-			hw->phy.autoneg_advertised = ADVERTISE_10_FULL;
+		    hw->phy.autoneg_advertised = ADVERTISE_10_FULL;
 		else
-			goto error_invalid_config;
+		    goto error_invalid_config;
 		break;
-	case ETH_LINK_SPEED_100:
+	    case ETH_LINK_SPEED_100:
 		if (dev->data->dev_conf.link_duplex == ETH_LINK_AUTONEG_DUPLEX)
-			hw->phy.autoneg_advertised = E1000_ALL_100_SPEED;
+		    hw->phy.autoneg_advertised = E1000_ALL_100_SPEED;
 		else if (dev->data->dev_conf.link_duplex == ETH_LINK_HALF_DUPLEX)
-			hw->phy.autoneg_advertised = ADVERTISE_100_HALF;
+		    hw->phy.autoneg_advertised = ADVERTISE_100_HALF;
 		else if (dev->data->dev_conf.link_duplex == ETH_LINK_FULL_DUPLEX)
-			hw->phy.autoneg_advertised = ADVERTISE_100_FULL;
+		    hw->phy.autoneg_advertised = ADVERTISE_100_FULL;
 		else
-			goto error_invalid_config;
+		    goto error_invalid_config;
 		break;
-	case ETH_LINK_SPEED_1000:
+	    case ETH_LINK_SPEED_1000:
 		if ((dev->data->dev_conf.link_duplex == ETH_LINK_AUTONEG_DUPLEX) ||
-				(dev->data->dev_conf.link_duplex == ETH_LINK_FULL_DUPLEX))
-			hw->phy.autoneg_advertised = ADVERTISE_1000_FULL;
+		    (dev->data->dev_conf.link_duplex == ETH_LINK_FULL_DUPLEX))
+		    hw->phy.autoneg_advertised = ADVERTISE_1000_FULL;
 		else
-			goto error_invalid_config;
+		    goto error_invalid_config;
 		break;
-	case ETH_LINK_SPEED_10000:
-	default:
+	    case ETH_LINK_SPEED_10000:
+	    default:
 		goto error_invalid_config;
+	    }
+	    e1000_setup_link(hw);
 	}
-	e1000_setup_link(hw);
 
 	/* check if lsc interrupt feature is enabled */
 	if (dev->data->dev_conf.intr_conf.lsc != 0)