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)