/******************************************************************************* NAME $RCSfile: nicI210DiagDrv.c,v $ SUMMARY Intel Ethernet Controller (I210) diagnostics VERSION $Revision: 1.0 $ UPDATE DATE $Date: 2014/07/30 04:16:50 $ PROGRAMMER $Author: TCS $ COPYRIGHT: DESCRIPTION: REFERENCE: *******************************************************************************/ int igbLinkTest(const char *name) { struct net_device *netdev = dev_get_by_name(&init_net, name); struct igb_adapter *adapter = netdev_priv(netdev); u64 data; u16 autoneg_advertised; u8 forced_speed_duplex; u8 autoneg; dev_put(netdev); rtnl_lock(); set_bit(__IGB_TESTING, &adapter->state); /* save speed, duplex, autoneg settings */ autoneg_advertised = adapter->hw.phy.autoneg_advertised; forced_speed_duplex = adapter->hw.mac.forced_speed_duplex; autoneg = adapter->hw.mac.autoneg; igb_link_test(adapter, &data); /* restore speed, duplex, autoneg settings */ adapter->hw.phy.autoneg_advertised = autoneg_advertised; adapter->hw.mac.forced_speed_duplex = forced_speed_duplex; adapter->hw.mac.autoneg = autoneg; clear_bit(__IGB_TESTING, &adapter->state); rtnl_unlock(); return ((int)data); } EXPORT_SYMBOL(igbLinkTest); int igbEepromTest(const char *name) { struct net_device *netdev = dev_get_by_name(&init_net, name); struct igb_adapter *adapter = netdev_priv(netdev); u64 data; u16 autoneg_advertised; u8 forced_speed_duplex; u8 autoneg; bool if_running = netif_running(netdev); dev_put(netdev); rtnl_lock(); set_bit(__IGB_TESTING, &adapter->state); if (if_running) /* indicate we're in test mode */ dev_close(netdev); else igb_reset(adapter); /* save speed, duplex, autoneg settings */ autoneg_advertised = adapter->hw.phy.autoneg_advertised; forced_speed_duplex = adapter->hw.mac.forced_speed_duplex; autoneg = adapter->hw.mac.autoneg; igb_eeprom_test(adapter, &data); /* restore speed, duplex, autoneg settings */ adapter->hw.phy.autoneg_advertised = autoneg_advertised; adapter->hw.mac.forced_speed_duplex = forced_speed_duplex; adapter->hw.mac.autoneg = autoneg; /* force this routine to wait until autoneg complete/timeout */ adapter->hw.phy.autoneg_wait_to_complete = 1; igb_reset(adapter); adapter->hw.phy.autoneg_wait_to_complete = 0; clear_bit(__IGB_TESTING, &adapter->state); if (if_running) dev_open(netdev); rtnl_unlock(); return ((int)data); } EXPORT_SYMBOL(igbEepromTest); int igbIntrTest(const char *name) { struct net_device *netdev = dev_get_by_name(&init_net, name); struct igb_adapter *adapter = netdev_priv(netdev); u64 data; u16 autoneg_advertised; u8 forced_speed_duplex; u8 autoneg; bool if_running = netif_running(netdev); dev_put(netdev); rtnl_lock(); set_bit(__IGB_TESTING, &adapter->state); if (if_running) /* indicate we're in test mode */ dev_close(netdev); else igb_reset(adapter); /* save speed, duplex, autoneg settings */ autoneg_advertised = adapter->hw.phy.autoneg_advertised; forced_speed_duplex = adapter->hw.mac.forced_speed_duplex; autoneg = adapter->hw.mac.autoneg; igb_intr_test(adapter, &data); /* restore speed, duplex, autoneg settings */ adapter->hw.phy.autoneg_advertised = autoneg_advertised; adapter->hw.mac.forced_speed_duplex = forced_speed_duplex; adapter->hw.mac.autoneg = autoneg; /* force this routine to wait until autoneg complete/timeout */ adapter->hw.phy.autoneg_wait_to_complete = 1; igb_reset(adapter); adapter->hw.phy.autoneg_wait_to_complete = 0; clear_bit(__IGB_TESTING, &adapter->state); if (if_running) dev_open(netdev); rtnl_unlock(); return ((int)data); } EXPORT_SYMBOL(igbIntrTest); int igbLoopbackTest(const char *name, LOOPBACK_TYPE type, struct block_cus blocks) { struct net_device *netdev = dev_get_by_name(&init_net, name); struct igb_adapter *adapter = netdev_priv(netdev); u64 data; u16 autoneg_advertised; u8 forced_speed_duplex; u8 autoneg; bool if_running = netif_running(netdev); dev_put(netdev); rtnl_lock(); set_bit(__IGB_TESTING, &adapter->state); // Need to change E1000 /* save speed, duplex, autoneg settings */ autoneg_advertised = adapter->hw.phy.autoneg_advertised; forced_speed_duplex = adapter->hw.mac.forced_speed_duplex; autoneg = adapter->hw.mac.autoneg; if (if_running) /* indicate we're in test mode */ dev_close(netdev); else igb_reset(adapter); /* force this routine to wait until autoneg complete/timeout */ //adapter->hw.phy.autoneg_wait_to_complete = 1; //igb_reset(adapter); //adapter->hw.phy.autoneg_wait_to_complete = 0; adapter->loopback_type = type; adapter->igb_blocks = blocks; igb_reset(adapter); /* power up link for loopback test */ igb_power_up_link(adapter); igb_loopback_test(adapter, &data); /* restore speed, duplex, autoneg settings */ adapter->hw.phy.autoneg_advertised = autoneg_advertised; adapter->hw.mac.forced_speed_duplex = forced_speed_duplex; adapter->hw.mac.autoneg = autoneg; /* force this routine to wait until autoneg complete/timeout */ adapter->hw.phy.autoneg_wait_to_complete = 1; igb_reset(adapter); adapter->hw.phy.autoneg_wait_to_complete = 0; clear_bit(__IGB_TESTING, &adapter->state); if (if_running) dev_open(netdev); rtnl_unlock(); return ((int)data); } EXPORT_SYMBOL(igbLoopbackTest); int igbMDIORead(const char *name, int page, int reg, u16 *PHY_data) { struct net_device *netdev = dev_get_by_name(&init_net, name); struct igb_adapter *adapter = netdev_priv(netdev); int err = 0; int address = 0; dev_put(netdev); rtnl_lock(); set_bit(__IGB_TESTING, &adapter->state); // Need to change E1000 address = ((page & 0x0FFFF) << 16) | (reg & 0x0FFFF); err = e1000_read_phy_reg(&adapter->hw, address, PHY_data); clear_bit(__IGB_TESTING, &adapter->state); rtnl_unlock(); return err; } EXPORT_SYMBOL(igbMDIORead); int igbMDIOWrite(const char *name, int page, int reg, u16 PHY_data) { struct net_device *netdev = dev_get_by_name(&init_net, name); struct igb_adapter *adapter = netdev_priv(netdev); int err = 0; int address = 0; dev_put(netdev); rtnl_lock(); set_bit(__IGB_TESTING, &adapter->state); // Need to change E1000 address = ((page & 0x0FFFF) << 16) | (reg & 0x0FFFF); err = e1000_write_phy_reg(&adapter->hw, address, PHY_data); clear_bit(__IGB_TESTING, &adapter->state); rtnl_unlock(); return err; } EXPORT_SYMBOL(igbMDIOWrite);