/******************************************************************************* NAME $RCSfile: nicX550DiagDrv.c,v $ SUMMARY Intel Ethernet Controller (X550) diagnostics VERSION $Revision: 1.0 $ UPDATE DATE $Date: 2014/07/30 04:16:50 $ PROGRAMMER $Author: TCS $ COPYRIGHT: DESCRIPTION: REFERENCE: *******************************************************************************/ int ixgbeLinkTest(const char *name) { struct net_device *netdev = dev_get_by_name(&init_net, name); struct ixgbe_adapter *adapter = netdev_priv(netdev); u64 data; u16 autoneg_advertised; //u8 forced_speed_duplex; //u8 autoneg; dev_put(netdev); rtnl_lock(); set_bit(__IXGBE_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; ixgbe_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(__IXGBE_TESTING, &adapter->state); rtnl_unlock(); return ((int)data); } EXPORT_SYMBOL(ixgbeLinkTest); int ixgbeEepromTest(const char *name) { struct net_device *netdev = dev_get_by_name(&init_net, name); struct ixgbe_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(__IXGBE_TESTING, &adapter->state); if (if_running) /* indicate we're in test mode */ dev_close(netdev); else ixgbe_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; ixgbe_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; ixgbe_reset(adapter); //adapter->hw.phy.autoneg_wait_to_complete = 0; clear_bit(__IXGBE_TESTING, &adapter->state); if (if_running) dev_open(netdev); rtnl_unlock(); return ((int)data); } EXPORT_SYMBOL(ixgbeEepromTest); int ixgbeIntrTest(const char *name) { struct net_device *netdev = dev_get_by_name(&init_net, name); struct ixgbe_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(__IXGBE_TESTING, &adapter->state); if (if_running) /* indicate we're in test mode */ dev_close(netdev); else ixgbe_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; ixgbe_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; ixgbe_reset(adapter); //adapter->hw.phy.autoneg_wait_to_complete = 0; clear_bit(__IXGBE_TESTING, &adapter->state); if (if_running) dev_open(netdev); rtnl_unlock(); return ((int)data); } EXPORT_SYMBOL(ixgbeIntrTest); int ixgbeLoopbackTest(const char *name, LOOPBACK_TYPE type, struct block_cus blocks) { struct net_device *netdev = dev_get_by_name(&init_net, name); struct ixgbe_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(__IXGBE_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 ixgbe_reset(adapter); /* force this routine to wait until autoneg complete/timeout */ //adapter->hw.phy.autoneg_wait_to_complete = 1; //ixgbe_reset(adapter); //adapter->hw.phy.autoneg_wait_to_complete = 0; adapter->loopback_type = type; adapter->ixgbe_blocks = blocks; ixgbe_reset(adapter); /* power up link for loopback test */ //ixgbe_power_up_link(adapter); ixgbe_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; ixgbe_reset(adapter); //adapter->hw.phy.autoneg_wait_to_complete = 0; clear_bit(__IXGBE_TESTING, &adapter->state); if (if_running) dev_open(netdev); rtnl_unlock(); return ((int)data); } EXPORT_SYMBOL(ixgbeLoopbackTest); int ixgbeMDIORead(const char *name, int page, int reg, u16 *PHY_data) { struct net_device *netdev = dev_get_by_name(&init_net, name); struct ixgbe_adapter *adapter = netdev_priv(netdev); int err = 0; int address = 0; dev_put(netdev); rtnl_lock(); set_bit(__IXGBE_TESTING, &adapter->state); // Need to change E1000 address = ((page & 0x0FFFF) << 16) | (reg & 0x0FFFF); err = ixgbe_read_phy_reg(&adapter->hw, address, 0, PHY_data); clear_bit(__IXGBE_TESTING, &adapter->state); rtnl_unlock(); return err; } EXPORT_SYMBOL(ixgbeMDIORead); int ixgbeMDIOWrite(const char *name, int page, int reg, u16 PHY_data) { struct net_device *netdev = dev_get_by_name(&init_net, name); struct ixgbe_adapter *adapter = netdev_priv(netdev); int err = 0; int address = 0; dev_put(netdev); rtnl_lock(); set_bit(__IXGBE_TESTING, &adapter->state); // Need to change E1000 address = ((page & 0x0FFFF) << 16) | (reg & 0x0FFFF); err = ixgbe_write_phy_reg(&adapter->hw, address, 0, PHY_data); clear_bit(__IXGBE_TESTING, &adapter->state); rtnl_unlock(); return err; } EXPORT_SYMBOL(ixgbeMDIOWrite);