diff options
Diffstat (limited to 'recipes-networking/dpdk/files/igb_ethdev_loopback.patch')
-rw-r--r-- | recipes-networking/dpdk/files/igb_ethdev_loopback.patch | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/recipes-networking/dpdk/files/igb_ethdev_loopback.patch b/recipes-networking/dpdk/files/igb_ethdev_loopback.patch new file mode 100644 index 0000000..6b979ca --- /dev/null +++ b/recipes-networking/dpdk/files/igb_ethdev_loopback.patch | |||
@@ -0,0 +1,96 @@ | |||
1 | Index: dpdk/lib/librte_pmd_e1000/igb_ethdev.c | ||
2 | =================================================================== | ||
3 | --- dpdk.orig/lib/librte_pmd_e1000/igb_ethdev.c 2014-03-11 12:35:49.267083184 +0200 | ||
4 | +++ dpdk/lib/librte_pmd_e1000/igb_ethdev.c 2014-03-11 12:36:23.015082260 +0200 | ||
5 | @@ -701,50 +701,67 @@ | ||
6 | E1000_WRITE_REG(hw, E1000_EITR(0), 0xFFFF); | ||
7 | } | ||
8 | |||
9 | - /* Setup link speed and duplex */ | ||
10 | - switch (dev->data->dev_conf.link_speed) { | ||
11 | - case ETH_LINK_SPEED_AUTONEG: | ||
12 | + if (dev->data->dev_conf.lpbk_mode == 1) { | ||
13 | + uint32_t reg; | ||
14 | + | ||
15 | + reg = E1000_READ_REG(hw, E1000_RCTL); | ||
16 | + reg |= E1000_RCTL_LBM_MAC; | ||
17 | + E1000_WRITE_REG(hw, E1000_RCTL, reg); | ||
18 | + | ||
19 | + reg = E1000_READ_REG(hw, E1000_CTRL); | ||
20 | + reg |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX | E1000_CTRL_FD | | ||
21 | + E1000_CTRL_SPD_1000); | ||
22 | + E1000_WRITE_REG(hw, E1000_CTRL, reg); | ||
23 | + | ||
24 | + reg = E1000_READ_REG(hw, E1000_EEER); | ||
25 | + reg |= (1 << 28); | ||
26 | + E1000_WRITE_REG(hw, E1000_EEER, reg); | ||
27 | + } else { | ||
28 | + /* Setup link speed and duplex */ | ||
29 | + switch (dev->data->dev_conf.link_speed) { | ||
30 | + case ETH_LINK_SPEED_AUTONEG: | ||
31 | if (dev->data->dev_conf.link_duplex == ETH_LINK_AUTONEG_DUPLEX) | ||
32 | - hw->phy.autoneg_advertised = E1000_ALL_SPEED_DUPLEX; | ||
33 | + hw->phy.autoneg_advertised = E1000_ALL_SPEED_DUPLEX; | ||
34 | else if (dev->data->dev_conf.link_duplex == ETH_LINK_HALF_DUPLEX) | ||
35 | - hw->phy.autoneg_advertised = E1000_ALL_HALF_DUPLEX; | ||
36 | + hw->phy.autoneg_advertised = E1000_ALL_HALF_DUPLEX; | ||
37 | else if (dev->data->dev_conf.link_duplex == ETH_LINK_FULL_DUPLEX) | ||
38 | - hw->phy.autoneg_advertised = E1000_ALL_FULL_DUPLEX; | ||
39 | + hw->phy.autoneg_advertised = E1000_ALL_FULL_DUPLEX; | ||
40 | else | ||
41 | - goto error_invalid_config; | ||
42 | + goto error_invalid_config; | ||
43 | break; | ||
44 | - case ETH_LINK_SPEED_10: | ||
45 | + case ETH_LINK_SPEED_10: | ||
46 | if (dev->data->dev_conf.link_duplex == ETH_LINK_AUTONEG_DUPLEX) | ||
47 | - hw->phy.autoneg_advertised = E1000_ALL_10_SPEED; | ||
48 | + hw->phy.autoneg_advertised = E1000_ALL_10_SPEED; | ||
49 | else if (dev->data->dev_conf.link_duplex == ETH_LINK_HALF_DUPLEX) | ||
50 | - hw->phy.autoneg_advertised = ADVERTISE_10_HALF; | ||
51 | + hw->phy.autoneg_advertised = ADVERTISE_10_HALF; | ||
52 | else if (dev->data->dev_conf.link_duplex == ETH_LINK_FULL_DUPLEX) | ||
53 | - hw->phy.autoneg_advertised = ADVERTISE_10_FULL; | ||
54 | + hw->phy.autoneg_advertised = ADVERTISE_10_FULL; | ||
55 | else | ||
56 | - goto error_invalid_config; | ||
57 | + goto error_invalid_config; | ||
58 | break; | ||
59 | - case ETH_LINK_SPEED_100: | ||
60 | + case ETH_LINK_SPEED_100: | ||
61 | if (dev->data->dev_conf.link_duplex == ETH_LINK_AUTONEG_DUPLEX) | ||
62 | - hw->phy.autoneg_advertised = E1000_ALL_100_SPEED; | ||
63 | + hw->phy.autoneg_advertised = E1000_ALL_100_SPEED; | ||
64 | else if (dev->data->dev_conf.link_duplex == ETH_LINK_HALF_DUPLEX) | ||
65 | - hw->phy.autoneg_advertised = ADVERTISE_100_HALF; | ||
66 | + hw->phy.autoneg_advertised = ADVERTISE_100_HALF; | ||
67 | else if (dev->data->dev_conf.link_duplex == ETH_LINK_FULL_DUPLEX) | ||
68 | - hw->phy.autoneg_advertised = ADVERTISE_100_FULL; | ||
69 | + hw->phy.autoneg_advertised = ADVERTISE_100_FULL; | ||
70 | else | ||
71 | - goto error_invalid_config; | ||
72 | + goto error_invalid_config; | ||
73 | break; | ||
74 | - case ETH_LINK_SPEED_1000: | ||
75 | + case ETH_LINK_SPEED_1000: | ||
76 | if ((dev->data->dev_conf.link_duplex == ETH_LINK_AUTONEG_DUPLEX) || | ||
77 | - (dev->data->dev_conf.link_duplex == ETH_LINK_FULL_DUPLEX)) | ||
78 | - hw->phy.autoneg_advertised = ADVERTISE_1000_FULL; | ||
79 | + (dev->data->dev_conf.link_duplex == ETH_LINK_FULL_DUPLEX)) | ||
80 | + hw->phy.autoneg_advertised = ADVERTISE_1000_FULL; | ||
81 | else | ||
82 | - goto error_invalid_config; | ||
83 | + goto error_invalid_config; | ||
84 | break; | ||
85 | - case ETH_LINK_SPEED_10000: | ||
86 | - default: | ||
87 | + case ETH_LINK_SPEED_10000: | ||
88 | + default: | ||
89 | goto error_invalid_config; | ||
90 | + } | ||
91 | + e1000_setup_link(hw); | ||
92 | } | ||
93 | - e1000_setup_link(hw); | ||
94 | |||
95 | /* check if lsc interrupt feature is enabled */ | ||
96 | if (dev->data->dev_conf.intr_conf.lsc != 0) | ||