diff options
author | Amit Kumar Salecha <amit.salecha@qlogic.com> | 2011-07-13 23:16:54 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-07-14 11:49:44 -0400 |
commit | fef0c0600b265ea5d4b1e39574801e6509a1dae6 (patch) | |
tree | fbd9e67f698d17bcfb69ecb47c6f9fca5585a02d /drivers/net/qlcnic | |
parent | f127f4727f3f60359570b6daa136ac1156e38fbf (diff) |
qlcnic: define error code for loopback test
o Defined error code such as fw not responding, test already running and
cable not connected.
o Check Fw capability before performing loopback test.
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')
-rw-r--r-- | drivers/net/qlcnic/qlcnic.h | 9 | ||||
-rw-r--r-- | drivers/net/qlcnic/qlcnic_ethtool.c | 27 | ||||
-rw-r--r-- | drivers/net/qlcnic/qlcnic_init.c | 6 |
3 files changed, 30 insertions, 12 deletions
diff --git a/drivers/net/qlcnic/qlcnic.h b/drivers/net/qlcnic/qlcnic.h index 3ae24501911..f6e54a8e349 100644 --- a/drivers/net/qlcnic/qlcnic.h +++ b/drivers/net/qlcnic/qlcnic.h | |||
@@ -822,6 +822,7 @@ struct qlcnic_mac_list_s { | |||
822 | #define QLCNIC_FW_CAPABILITY_BDG BIT_8 | 822 | #define QLCNIC_FW_CAPABILITY_BDG BIT_8 |
823 | #define QLCNIC_FW_CAPABILITY_FVLANTX BIT_9 | 823 | #define QLCNIC_FW_CAPABILITY_FVLANTX BIT_9 |
824 | #define QLCNIC_FW_CAPABILITY_HW_LRO BIT_10 | 824 | #define QLCNIC_FW_CAPABILITY_HW_LRO BIT_10 |
825 | #define QLCNIC_FW_CAPABILITY_MULTI_LOOPBACK BIT_27 | ||
825 | 826 | ||
826 | /* module types */ | 827 | /* module types */ |
827 | #define LINKEVENT_MODULE_NOT_PRESENT 1 | 828 | #define LINKEVENT_MODULE_NOT_PRESENT 1 |
@@ -936,6 +937,12 @@ struct qlcnic_ipaddr { | |||
936 | #define QLCNIC_READD_AGE 20 | 937 | #define QLCNIC_READD_AGE 20 |
937 | #define QLCNIC_LB_MAX_FILTERS 64 | 938 | #define QLCNIC_LB_MAX_FILTERS 64 |
938 | 939 | ||
940 | /* QLCNIC Driver Error Code */ | ||
941 | #define QLCNIC_FW_NOT_RESPOND 51 | ||
942 | #define QLCNIC_TEST_IN_PROGRESS 52 | ||
943 | #define QLCNIC_UNDEFINED_ERROR 53 | ||
944 | #define QLCNIC_LB_CABLE_NOT_CONN 54 | ||
945 | |||
939 | struct qlcnic_filter { | 946 | struct qlcnic_filter { |
940 | struct hlist_node fnode; | 947 | struct hlist_node fnode; |
941 | u8 faddr[ETH_ALEN]; | 948 | u8 faddr[ETH_ALEN]; |
@@ -1007,7 +1014,7 @@ struct qlcnic_adapter { | |||
1007 | u8 max_mac_filters; | 1014 | u8 max_mac_filters; |
1008 | u8 dev_state; | 1015 | u8 dev_state; |
1009 | u8 diag_test; | 1016 | u8 diag_test; |
1010 | u8 diag_cnt; | 1017 | char diag_cnt; |
1011 | u8 reset_ack_timeo; | 1018 | u8 reset_ack_timeo; |
1012 | u8 dev_init_timeo; | 1019 | u8 dev_init_timeo; |
1013 | u16 msg_enable; | 1020 | u16 msg_enable; |
diff --git a/drivers/net/qlcnic/qlcnic_ethtool.c b/drivers/net/qlcnic/qlcnic_ethtool.c index 3ea04e7da91..72a723d5c98 100644 --- a/drivers/net/qlcnic/qlcnic_ethtool.c +++ b/drivers/net/qlcnic/qlcnic_ethtool.c | |||
@@ -756,6 +756,11 @@ static int qlcnic_loopback_test(struct net_device *netdev, u8 mode) | |||
756 | int loop = 0; | 756 | int loop = 0; |
757 | int ret; | 757 | int ret; |
758 | 758 | ||
759 | if (!(adapter->capabilities & QLCNIC_FW_CAPABILITY_MULTI_LOOPBACK)) { | ||
760 | netdev_info(netdev, "Firmware is not loopback test capable\n"); | ||
761 | return -EOPNOTSUPP; | ||
762 | } | ||
763 | |||
759 | netdev_info(netdev, "%s loopback test in progress\n", | 764 | netdev_info(netdev, "%s loopback test in progress\n", |
760 | mode == QLCNIC_ILB_MODE ? "internal" : "external"); | 765 | mode == QLCNIC_ILB_MODE ? "internal" : "external"); |
761 | if (adapter->op_mode == QLCNIC_NON_PRIV_FUNC) { | 766 | if (adapter->op_mode == QLCNIC_NON_PRIV_FUNC) { |
@@ -765,8 +770,7 @@ static int qlcnic_loopback_test(struct net_device *netdev, u8 mode) | |||
765 | } | 770 | } |
766 | 771 | ||
767 | if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) | 772 | if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) |
768 | return -EIO; | 773 | return -EBUSY; |
769 | |||
770 | 774 | ||
771 | ret = qlcnic_diag_alloc_res(netdev, QLCNIC_LOOPBACK_TEST); | 775 | ret = qlcnic_diag_alloc_res(netdev, QLCNIC_LOOPBACK_TEST); |
772 | if (ret) | 776 | if (ret) |
@@ -778,20 +782,21 @@ static int qlcnic_loopback_test(struct net_device *netdev, u8 mode) | |||
778 | if (ret) | 782 | if (ret) |
779 | goto free_res; | 783 | goto free_res; |
780 | 784 | ||
785 | adapter->diag_cnt = 0; | ||
781 | do { | 786 | do { |
782 | msleep(500); | 787 | msleep(500); |
783 | qlcnic_process_rcv_ring_diag(sds_ring); | 788 | qlcnic_process_rcv_ring_diag(sds_ring); |
784 | if (loop++ > QLCNIC_ILB_MAX_RCV_LOOP) | 789 | if (loop++ > QLCNIC_ILB_MAX_RCV_LOOP) { |
785 | break; | 790 | netdev_info(netdev, "firmware didnt respond to loopback" |
791 | " configure request\n"); | ||
792 | ret = -QLCNIC_FW_NOT_RESPOND; | ||
793 | goto free_res; | ||
794 | } else if (adapter->diag_cnt) { | ||
795 | ret = adapter->diag_cnt; | ||
796 | goto free_res; | ||
797 | } | ||
786 | } while (!QLCNIC_IS_LB_CONFIGURED(adapter->ahw->loopback_state)); | 798 | } while (!QLCNIC_IS_LB_CONFIGURED(adapter->ahw->loopback_state)); |
787 | 799 | ||
788 | if (!QLCNIC_IS_LB_CONFIGURED(adapter->ahw->loopback_state)) { | ||
789 | netdev_info(netdev, "firmware didnt respond to loopback " | ||
790 | "configure request\n"); | ||
791 | ret = adapter->ahw->loopback_state; | ||
792 | goto free_res; | ||
793 | } | ||
794 | |||
795 | ret = qlcnic_do_lb_test(adapter); | 800 | ret = qlcnic_do_lb_test(adapter); |
796 | 801 | ||
797 | qlcnic_clear_lb_mode(adapter); | 802 | qlcnic_clear_lb_mode(adapter); |
diff --git a/drivers/net/qlcnic/qlcnic_init.c b/drivers/net/qlcnic/qlcnic_init.c index 6ec1baa85f6..ee8a3982395 100644 --- a/drivers/net/qlcnic/qlcnic_init.c +++ b/drivers/net/qlcnic/qlcnic_init.c | |||
@@ -1354,10 +1354,16 @@ qlcnic_handle_fw_message(int desc_cnt, int index, | |||
1354 | break; | 1354 | break; |
1355 | case 1: | 1355 | case 1: |
1356 | dev_info(dev, "loopback already in progress\n"); | 1356 | dev_info(dev, "loopback already in progress\n"); |
1357 | adapter->diag_cnt = -QLCNIC_TEST_IN_PROGRESS; | ||
1358 | break; | ||
1359 | case 2: | ||
1360 | dev_info(dev, "loopback cable is not connected\n"); | ||
1361 | adapter->diag_cnt = -QLCNIC_LB_CABLE_NOT_CONN; | ||
1357 | break; | 1362 | break; |
1358 | default: | 1363 | default: |
1359 | dev_info(dev, "loopback configure request failed," | 1364 | dev_info(dev, "loopback configure request failed," |
1360 | " ret %x\n", ret); | 1365 | " ret %x\n", ret); |
1366 | adapter->diag_cnt = -QLCNIC_UNDEFINED_ERROR; | ||
1361 | break; | 1367 | break; |
1362 | } | 1368 | } |
1363 | break; | 1369 | break; |