diff options
author | Amit Kumar Salecha <amit.salecha@qlogic.com> | 2011-06-29 20:00:50 (GMT) |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-07-01 05:32:50 (GMT) |
commit | e1428d26b404133dcbcc8f758f0f4f6575afd7b7 (patch) | |
tree | 4357abcd05b07f0da8dc1ee42a5f0d134f587ef1 /drivers/net/qlcnic/qlcnic_ethtool.c | |
parent | 0209bcd4d9ee66569d4ea76f9ab2de3a9c740c71 (diff) | |
download | linux-fsl-qoriq-e1428d26b404133dcbcc8f758f0f4f6575afd7b7.tar.xz |
qlcnic: add external loopback support
o Add external loopback test in self test:
- Send set external loopback mode request to fw.
To quiscent other storage functions.
- Perform test
- Send unset loopback mode request to fw.
o Rename ilb to lb.
o Update driver version 5.0.20.
Signed-off-by: Sucheta Chakraborty <sucheta.chakraborty@qlogic.com>
Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/qlcnic/qlcnic_ethtool.c')
-rw-r--r-- | drivers/net/qlcnic/qlcnic_ethtool.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/drivers/net/qlcnic/qlcnic_ethtool.c b/drivers/net/qlcnic/qlcnic_ethtool.c index 743035e..3ea04e7 100644 --- a/drivers/net/qlcnic/qlcnic_ethtool.c +++ b/drivers/net/qlcnic/qlcnic_ethtool.c @@ -85,7 +85,8 @@ static const char qlcnic_gstrings_test[][ETH_GSTRING_LEN] = { "Register_Test_on_offline", "Link_Test_on_offline", "Interrupt_Test_offline", - "Loopback_Test_offline" + "Internal_Loopback_offline", + "External_Loopback_offline" }; #define QLCNIC_TEST_LEN ARRAY_SIZE(qlcnic_gstrings_test) @@ -709,7 +710,7 @@ int qlcnic_check_loopback_buff(unsigned char *data, u8 mac[]) return memcmp(data, buff, QLCNIC_ILB_PKT_SIZE); } -static int qlcnic_do_ilb_test(struct qlcnic_adapter *adapter) +static int qlcnic_do_lb_test(struct qlcnic_adapter *adapter) { struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; struct qlcnic_host_sds_ring *sds_ring = &recv_ctx->sds_rings[0]; @@ -735,19 +736,19 @@ static int qlcnic_do_ilb_test(struct qlcnic_adapter *adapter) dev_kfree_skb_any(skb); if (!adapter->diag_cnt) - dev_warn(&adapter->pdev->dev, "ILB Test: %dth packet" + dev_warn(&adapter->pdev->dev, "LB Test: %dth packet" " not recevied\n", i + 1); else cnt++; } if (cnt != i) { - dev_warn(&adapter->pdev->dev, "ILB Test failed\n"); + dev_warn(&adapter->pdev->dev, "LB Test failed\n"); return -1; } return 0; } -static int qlcnic_iloopback_test(struct net_device *netdev) +static int qlcnic_loopback_test(struct net_device *netdev, u8 mode) { struct qlcnic_adapter *adapter = netdev_priv(netdev); int max_sds_rings = adapter->max_sds_rings; @@ -755,7 +756,8 @@ static int qlcnic_iloopback_test(struct net_device *netdev) int loop = 0; int ret; - netdev_info(netdev, "%s: in progress\n", __func__); + netdev_info(netdev, "%s loopback test in progress\n", + mode == QLCNIC_ILB_MODE ? "internal" : "external"); if (adapter->op_mode == QLCNIC_NON_PRIV_FUNC) { netdev_warn(netdev, "Loopback test not supported for non " "privilege function\n"); @@ -772,7 +774,7 @@ static int qlcnic_iloopback_test(struct net_device *netdev) sds_ring = &adapter->recv_ctx->sds_rings[0]; - ret = qlcnic_set_lb_mode(adapter, QLCNIC_ILB_MODE); + ret = qlcnic_set_lb_mode(adapter, mode); if (ret) goto free_res; @@ -790,7 +792,7 @@ static int qlcnic_iloopback_test(struct net_device *netdev) goto free_res; } - ret = qlcnic_do_ilb_test(adapter); + ret = qlcnic_do_lb_test(adapter); qlcnic_clear_lb_mode(adapter); @@ -822,10 +824,16 @@ qlcnic_diag_test(struct net_device *dev, struct ethtool_test *eth_test, if (data[2]) eth_test->flags |= ETH_TEST_FL_FAILED; - data[3] = qlcnic_iloopback_test(dev); + data[3] = qlcnic_loopback_test(dev, QLCNIC_ILB_MODE); if (data[3]) eth_test->flags |= ETH_TEST_FL_FAILED; + if (eth_test->flags & ETH_TEST_FL_EXTERNAL_LB) { + data[4] = qlcnic_loopback_test(dev, QLCNIC_ELB_MODE); + if (data[4]) + eth_test->flags |= ETH_TEST_FL_FAILED; + eth_test->flags |= ETH_TEST_FL_EXTERNAL_LB_DONE; + } } } |