I believe there are defects in the code supporting manual configuration of port link speed and link duplex to values other than auto-negotiate. The TESTPMD application from DPDK version 1.8.0 was executed on 2 different systems having 4x1G NICs with the following Ethernet controllers:
* Intel Corporation 82576 Gigabit Network Connection (rev 01) * Intel Corporation I350 Gigabit Network Connection (rev 01) There appears to be two issues in the code: * "hw->mac.autoneg? is always set to true (1). The force speed and duplex code path is not followed. * "hw->mac.forced_speed_duplex" is never set. A forced link speed configuration will always default to 10Mb regardless of whether configured for 100Mb or 10Mb. For example, e1000_phy_force_speed_duplex_setup() will always configure link speed to 10mb since it checks for the following condition "if (mac->forced_speed_duplex & E1000_ALL_100_SPEED)?. Changes are needed within ?igb_ethdev.c? and ?em_ethdev.c? within ?lib/librte_pmd_e1000?. The switch statements that setup link speed and link duplex within these files need to manually set "hw->mac.autoneg" and "hw->mac.forced_speed_duplex" as shown below: [root at box librte_pmd_e1000]# pwd /home/marc/dpdk/dpdk-1.8.0/lib/librte_pmd_e1000 [root at box librte_pmd_e1000]# diff -p igb_ethdev.c.orig igb_ethdev.c *** igb_ethdev.c.orig 2015-01-08 09:59:52.937215791 -0500 --- igb_ethdev.c 2015-01-08 10:01:44.073730592 -0500 *************** eth_igb_start(struct rte_eth_dev *dev) *** 871,876 **** --- 871,878 ---- hw->phy.autoneg_advertised = ADVERTISE_10_FULL; else goto error_invalid_config; + hw->mac.autoneg = 0; + hw->mac.forced_speed_duplex |= hw->phy.autoneg_advertised; break; case ETH_LINK_SPEED_100: if (dev->data->dev_conf.link_duplex == ETH_LINK_AUTONEG_DUPLEX) *************** eth_igb_start(struct rte_eth_dev *dev) *** 881,886 **** --- 883,890 ---- hw->phy.autoneg_advertised = ADVERTISE_100_FULL; else goto error_invalid_config; + hw->mac.autoneg = 0; + hw->mac.forced_speed_duplex |= hw->phy.autoneg_advertised; break; case ETH_LINK_SPEED_1000: if ((dev->data->dev_conf.link_duplex == ETH_LINK_AUTONEG_DUPLEX) || *************** eth_igb_start(struct rte_eth_dev *dev) *** 888,893 **** --- 892,899 ---- hw->phy.autoneg_advertised = ADVERTISE_1000_FULL; else goto error_invalid_config; + hw->mac.autoneg = 0; + hw->mac.forced_speed_duplex |= hw->phy.autoneg_advertised; break; case ETH_LINK_SPEED_10000: default: [root at box librte_pmd_e1000]# After only setting hw->mac.autoneg = 0 in the switch statement cases described above I experimented with configuring the peer (switch) ports for 100Mb full duplex. Within TESTPMD the ports were also configured for 100Mb full duplex using ?port config all speed 100 duplex full?. The links failed to establish. I enabled debug statements within ?e1000_phy_force_speed_duplex_setup()? found in ?lib/librte_pmd_e1000/e1000/e1000_phy.c? to display whether 100mb or 10mb was being forced. It was observed that 10Mb was being forced when the link speed was manually configured for 100Mb. Setting ?hw->mac.force_speed_duplex? as shown above seemed to resolve this issue and the links came up. Are these known issues? -Marc