|
@@ -82,8 +82,7 @@ static const struct netxen_nic_stats netxen_nic_gstrings_stats[] = {
|
|
|
#define NETXEN_NIC_STATS_LEN ARRAY_SIZE(netxen_nic_gstrings_stats)
|
|
|
|
|
|
static const char netxen_nic_gstrings_test[][ETH_GSTRING_LEN] = {
|
|
|
- "Register_Test_offline", "EEPROM_Test_offline",
|
|
|
- "Interrupt_Test_offline", "Loopback_Test_offline",
|
|
|
+ "Register_Test_on_offline",
|
|
|
"Link_Test_on_offline"
|
|
|
};
|
|
|
|
|
@@ -394,19 +393,12 @@ netxen_nic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void
|
|
|
-netxen_nic_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
|
|
|
-{
|
|
|
- wol->supported = WAKE_UCAST | WAKE_MCAST | WAKE_BCAST | WAKE_MAGIC;
|
|
|
- /* options can be added depending upon the mode */
|
|
|
- wol->wolopts = 0;
|
|
|
-}
|
|
|
-
|
|
|
static u32 netxen_nic_test_link(struct net_device *dev)
|
|
|
{
|
|
|
struct netxen_port *port = netdev_priv(dev);
|
|
|
struct netxen_adapter *adapter = port->adapter;
|
|
|
__u32 status;
|
|
|
+ int val;
|
|
|
|
|
|
/* read which mode */
|
|
|
if (adapter->ahw.board_type == NETXEN_NIC_GBE) {
|
|
@@ -415,11 +407,13 @@ static u32 netxen_nic_test_link(struct net_device *dev)
|
|
|
NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS,
|
|
|
&status) != 0)
|
|
|
return -EIO;
|
|
|
- else
|
|
|
- return (netxen_get_phy_link(status));
|
|
|
+ else {
|
|
|
+ val = netxen_get_phy_link(status);
|
|
|
+ return !val;
|
|
|
+ }
|
|
|
} else if (adapter->ahw.board_type == NETXEN_NIC_XGBE) {
|
|
|
- int val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_XG_STATE));
|
|
|
- return val == XG_LINK_UP;
|
|
|
+ val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_XG_STATE));
|
|
|
+ return (val == XG_LINK_UP) ? 0 : 1;
|
|
|
}
|
|
|
return -EIO;
|
|
|
}
|
|
@@ -606,100 +600,21 @@ netxen_nic_set_pauseparam(struct net_device *dev,
|
|
|
|
|
|
static int netxen_nic_reg_test(struct net_device *dev)
|
|
|
{
|
|
|
- struct netxen_port *port = netdev_priv(dev);
|
|
|
- struct netxen_adapter *adapter = port->adapter;
|
|
|
- u32 data_read, data_written, save;
|
|
|
- __u32 mode;
|
|
|
-
|
|
|
- /*
|
|
|
- * first test the "Read Only" registers by writing which mode
|
|
|
- */
|
|
|
- netxen_nic_read_w0(adapter, NETXEN_NIU_MODE, &mode);
|
|
|
- if (netxen_get_niu_enable_ge(mode)) { /* GB Mode */
|
|
|
- netxen_nic_read_w0(adapter,
|
|
|
- NETXEN_NIU_GB_MII_MGMT_STATUS(port->portnum),
|
|
|
- &data_read);
|
|
|
-
|
|
|
- save = data_read;
|
|
|
- if (data_read)
|
|
|
- data_written = data_read & NETXEN_NIC_INVALID_DATA;
|
|
|
- else
|
|
|
- data_written = NETXEN_NIC_INVALID_DATA;
|
|
|
- netxen_nic_write_w0(adapter,
|
|
|
- NETXEN_NIU_GB_MII_MGMT_STATUS(port->
|
|
|
- portnum),
|
|
|
- data_written);
|
|
|
- netxen_nic_read_w0(adapter,
|
|
|
- NETXEN_NIU_GB_MII_MGMT_STATUS(port->portnum),
|
|
|
- &data_read);
|
|
|
-
|
|
|
- if (data_written == data_read) {
|
|
|
- netxen_nic_write_w0(adapter,
|
|
|
- NETXEN_NIU_GB_MII_MGMT_STATUS(port->
|
|
|
- portnum),
|
|
|
- save);
|
|
|
-
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- /* netxen_niu_gb_mii_mgmt_indicators is read only */
|
|
|
- netxen_nic_read_w0(adapter,
|
|
|
- NETXEN_NIU_GB_MII_MGMT_INDICATE(port->
|
|
|
- portnum),
|
|
|
- &data_read);
|
|
|
-
|
|
|
- save = data_read;
|
|
|
- if (data_read)
|
|
|
- data_written = data_read & NETXEN_NIC_INVALID_DATA;
|
|
|
- else
|
|
|
- data_written = NETXEN_NIC_INVALID_DATA;
|
|
|
- netxen_nic_write_w0(adapter,
|
|
|
- NETXEN_NIU_GB_MII_MGMT_INDICATE(port->
|
|
|
- portnum),
|
|
|
- data_written);
|
|
|
-
|
|
|
- netxen_nic_read_w0(adapter,
|
|
|
- NETXEN_NIU_GB_MII_MGMT_INDICATE(port->
|
|
|
- portnum),
|
|
|
- &data_read);
|
|
|
-
|
|
|
- if (data_written == data_read) {
|
|
|
- netxen_nic_write_w0(adapter,
|
|
|
- NETXEN_NIU_GB_MII_MGMT_INDICATE
|
|
|
- (port->portnum), save);
|
|
|
- return 0;
|
|
|
- }
|
|
|
+ struct netxen_adapter *adapter = netdev_priv(dev);
|
|
|
+ u32 data_read, data_written;
|
|
|
|
|
|
- /* netxen_niu_gb_interface_status is read only */
|
|
|
- netxen_nic_read_w0(adapter,
|
|
|
- NETXEN_NIU_GB_INTERFACE_STATUS(port->
|
|
|
- portnum),
|
|
|
- &data_read);
|
|
|
+ netxen_nic_read_w0(adapter, NETXEN_PCIX_PH_REG(0), &data_read);
|
|
|
+ if ((data_read & 0xffff) != PHAN_VENDOR_ID)
|
|
|
+ return 1;
|
|
|
|
|
|
- save = data_read;
|
|
|
- if (data_read)
|
|
|
- data_written = data_read & NETXEN_NIC_INVALID_DATA;
|
|
|
- else
|
|
|
- data_written = NETXEN_NIC_INVALID_DATA;
|
|
|
- netxen_nic_write_w0(adapter,
|
|
|
- NETXEN_NIU_GB_INTERFACE_STATUS(port->
|
|
|
- portnum),
|
|
|
- data_written);
|
|
|
+ data_written = (u32)0xa5a5a5a5;
|
|
|
|
|
|
- netxen_nic_read_w0(adapter,
|
|
|
- NETXEN_NIU_GB_INTERFACE_STATUS(port->
|
|
|
- portnum),
|
|
|
- &data_read);
|
|
|
+ netxen_nic_reg_write(adapter, CRB_SCRATCHPAD_TEST, data_written);
|
|
|
+ data_read = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_SCRATCHPAD_TEST));
|
|
|
+ if (data_written != data_read)
|
|
|
+ return 1;
|
|
|
|
|
|
- if (data_written == data_read) {
|
|
|
- netxen_nic_write_w0(adapter,
|
|
|
- NETXEN_NIU_GB_INTERFACE_STATUS
|
|
|
- (port->portnum), save);
|
|
|
-
|
|
|
- return 0;
|
|
|
- }
|
|
|
- } /* GB Mode */
|
|
|
- return 1;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static int netxen_nic_diag_test_count(struct net_device *dev)
|
|
@@ -713,26 +628,20 @@ netxen_nic_diag_test(struct net_device *dev, struct ethtool_test *eth_test,
|
|
|
{
|
|
|
if (eth_test->flags == ETH_TEST_FL_OFFLINE) { /* offline tests */
|
|
|
/* link test */
|
|
|
- if (!(data[4] = (u64) netxen_nic_test_link(dev)))
|
|
|
+ if ((data[1] = (u64) netxen_nic_test_link(dev)))
|
|
|
eth_test->flags |= ETH_TEST_FL_FAILED;
|
|
|
|
|
|
- if (netif_running(dev))
|
|
|
- dev->stop(dev);
|
|
|
-
|
|
|
/* register tests */
|
|
|
- if (!(data[0] = netxen_nic_reg_test(dev)))
|
|
|
+ if ((data[0] = netxen_nic_reg_test(dev)))
|
|
|
eth_test->flags |= ETH_TEST_FL_FAILED;
|
|
|
- /* other tests pass as of now */
|
|
|
- data[1] = data[2] = data[3] = 1;
|
|
|
- if (netif_running(dev))
|
|
|
- dev->open(dev);
|
|
|
} else { /* online tests */
|
|
|
- /* link test */
|
|
|
- if (!(data[4] = (u64) netxen_nic_test_link(dev)))
|
|
|
+ /* register tests */
|
|
|
+ if((data[0] = netxen_nic_reg_test(dev)))
|
|
|
eth_test->flags |= ETH_TEST_FL_FAILED;
|
|
|
|
|
|
- /* other tests pass by default */
|
|
|
- data[0] = data[1] = data[2] = data[3] = 1;
|
|
|
+ /* link test */
|
|
|
+ if ((data[1] = (u64) netxen_nic_test_link(dev)))
|
|
|
+ eth_test->flags |= ETH_TEST_FL_FAILED;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -783,7 +692,6 @@ struct ethtool_ops netxen_nic_ethtool_ops = {
|
|
|
.get_drvinfo = netxen_nic_get_drvinfo,
|
|
|
.get_regs_len = netxen_nic_get_regs_len,
|
|
|
.get_regs = netxen_nic_get_regs,
|
|
|
- .get_wol = netxen_nic_get_wol,
|
|
|
.get_link = ethtool_op_get_link,
|
|
|
.get_eeprom_len = netxen_nic_get_eeprom_len,
|
|
|
.get_eeprom = netxen_nic_get_eeprom,
|