diff options
Diffstat (limited to 'drivers/net/ethernet/qlogic/qlcnic')
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 48 |
3 files changed, 43 insertions, 13 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h index be618b9e874f..16039d1497b8 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | |||
@@ -39,8 +39,8 @@ | |||
39 | 39 | ||
40 | #define _QLCNIC_LINUX_MAJOR 5 | 40 | #define _QLCNIC_LINUX_MAJOR 5 |
41 | #define _QLCNIC_LINUX_MINOR 3 | 41 | #define _QLCNIC_LINUX_MINOR 3 |
42 | #define _QLCNIC_LINUX_SUBVERSION 60 | 42 | #define _QLCNIC_LINUX_SUBVERSION 61 |
43 | #define QLCNIC_LINUX_VERSIONID "5.3.60" | 43 | #define QLCNIC_LINUX_VERSIONID "5.3.61" |
44 | #define QLCNIC_DRV_IDC_VER 0x01 | 44 | #define QLCNIC_DRV_IDC_VER 0x01 |
45 | #define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\ | 45 | #define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\ |
46 | (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION)) | 46 | (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION)) |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c index 561cb11ca58c..a72bcddf160a 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c | |||
@@ -926,7 +926,7 @@ static int qlcnic_dcb_get_num_tcs(struct net_device *netdev, int attr, u8 *num) | |||
926 | } | 926 | } |
927 | } | 927 | } |
928 | 928 | ||
929 | static u8 qlcnic_dcb_get_app(struct net_device *netdev, u8 idtype, u16 id) | 929 | static int qlcnic_dcb_get_app(struct net_device *netdev, u8 idtype, u16 id) |
930 | { | 930 | { |
931 | struct qlcnic_adapter *adapter = netdev_priv(netdev); | 931 | struct qlcnic_adapter *adapter = netdev_priv(netdev); |
932 | struct dcb_app app = { | 932 | struct dcb_app app = { |
@@ -935,7 +935,7 @@ static u8 qlcnic_dcb_get_app(struct net_device *netdev, u8 idtype, u16 id) | |||
935 | }; | 935 | }; |
936 | 936 | ||
937 | if (!test_bit(QLCNIC_DCB_STATE, &adapter->dcb->state)) | 937 | if (!test_bit(QLCNIC_DCB_STATE, &adapter->dcb->state)) |
938 | return 0; | 938 | return -EINVAL; |
939 | 939 | ||
940 | return dcb_getapp(netdev, &app); | 940 | return dcb_getapp(netdev, &app); |
941 | } | 941 | } |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c index 3187bc0c471b..59846daf1379 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | |||
@@ -427,16 +427,17 @@ static int qlcnic_fdb_add(struct ndmsg *ndm, struct nlattr *tb[], | |||
427 | } | 427 | } |
428 | 428 | ||
429 | static int qlcnic_fdb_dump(struct sk_buff *skb, struct netlink_callback *ncb, | 429 | static int qlcnic_fdb_dump(struct sk_buff *skb, struct netlink_callback *ncb, |
430 | struct net_device *netdev, int idx) | 430 | struct net_device *netdev, |
431 | struct net_device *filter_dev, int idx) | ||
431 | { | 432 | { |
432 | struct qlcnic_adapter *adapter = netdev_priv(netdev); | 433 | struct qlcnic_adapter *adapter = netdev_priv(netdev); |
433 | 434 | ||
434 | if (!adapter->fdb_mac_learn) | 435 | if (!adapter->fdb_mac_learn) |
435 | return ndo_dflt_fdb_dump(skb, ncb, netdev, idx); | 436 | return ndo_dflt_fdb_dump(skb, ncb, netdev, filter_dev, idx); |
436 | 437 | ||
437 | if ((adapter->flags & QLCNIC_ESWITCH_ENABLED) || | 438 | if ((adapter->flags & QLCNIC_ESWITCH_ENABLED) || |
438 | qlcnic_sriov_check(adapter)) | 439 | qlcnic_sriov_check(adapter)) |
439 | idx = ndo_dflt_fdb_dump(skb, ncb, netdev, idx); | 440 | idx = ndo_dflt_fdb_dump(skb, ncb, netdev, filter_dev, idx); |
440 | 441 | ||
441 | return idx; | 442 | return idx; |
442 | } | 443 | } |
@@ -2980,17 +2981,43 @@ static inline void dump_tx_ring_desc(struct qlcnic_host_tx_ring *tx_ring) | |||
2980 | } | 2981 | } |
2981 | } | 2982 | } |
2982 | 2983 | ||
2983 | static void qlcnic_dump_tx_rings(struct qlcnic_adapter *adapter) | 2984 | static void qlcnic_dump_rings(struct qlcnic_adapter *adapter) |
2984 | { | 2985 | { |
2986 | struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; | ||
2985 | struct net_device *netdev = adapter->netdev; | 2987 | struct net_device *netdev = adapter->netdev; |
2988 | struct qlcnic_host_rds_ring *rds_ring; | ||
2989 | struct qlcnic_host_sds_ring *sds_ring; | ||
2986 | struct qlcnic_host_tx_ring *tx_ring; | 2990 | struct qlcnic_host_tx_ring *tx_ring; |
2987 | int ring; | 2991 | int ring; |
2988 | 2992 | ||
2989 | if (!netdev || !netif_running(netdev)) | 2993 | if (!netdev || !netif_running(netdev)) |
2990 | return; | 2994 | return; |
2991 | 2995 | ||
2996 | for (ring = 0; ring < adapter->max_rds_rings; ring++) { | ||
2997 | rds_ring = &recv_ctx->rds_rings[ring]; | ||
2998 | if (!rds_ring) | ||
2999 | continue; | ||
3000 | netdev_info(netdev, | ||
3001 | "rds_ring=%d crb_rcv_producer=%d producer=%u num_desc=%u\n", | ||
3002 | ring, readl(rds_ring->crb_rcv_producer), | ||
3003 | rds_ring->producer, rds_ring->num_desc); | ||
3004 | } | ||
3005 | |||
3006 | for (ring = 0; ring < adapter->drv_sds_rings; ring++) { | ||
3007 | sds_ring = &(recv_ctx->sds_rings[ring]); | ||
3008 | if (!sds_ring) | ||
3009 | continue; | ||
3010 | netdev_info(netdev, | ||
3011 | "sds_ring=%d crb_sts_consumer=%d consumer=%u crb_intr_mask=%d num_desc=%u\n", | ||
3012 | ring, readl(sds_ring->crb_sts_consumer), | ||
3013 | sds_ring->consumer, readl(sds_ring->crb_intr_mask), | ||
3014 | sds_ring->num_desc); | ||
3015 | } | ||
3016 | |||
2992 | for (ring = 0; ring < adapter->drv_tx_rings; ring++) { | 3017 | for (ring = 0; ring < adapter->drv_tx_rings; ring++) { |
2993 | tx_ring = &adapter->tx_ring[ring]; | 3018 | tx_ring = &adapter->tx_ring[ring]; |
3019 | if (!tx_ring) | ||
3020 | continue; | ||
2994 | netdev_info(netdev, "Tx ring=%d Context Id=0x%x\n", | 3021 | netdev_info(netdev, "Tx ring=%d Context Id=0x%x\n", |
2995 | ring, tx_ring->ctx_id); | 3022 | ring, tx_ring->ctx_id); |
2996 | netdev_info(netdev, | 3023 | netdev_info(netdev, |
@@ -3013,9 +3040,10 @@ static void qlcnic_dump_tx_rings(struct qlcnic_adapter *adapter) | |||
3013 | netdev_info(netdev, "Total desc=%d, Available desc=%d\n", | 3040 | netdev_info(netdev, "Total desc=%d, Available desc=%d\n", |
3014 | tx_ring->num_desc, qlcnic_tx_avail(tx_ring)); | 3041 | tx_ring->num_desc, qlcnic_tx_avail(tx_ring)); |
3015 | 3042 | ||
3016 | if (netif_msg_tx_done(adapter->ahw)) | 3043 | if (netif_msg_tx_err(adapter->ahw)) |
3017 | dump_tx_ring_desc(tx_ring); | 3044 | dump_tx_ring_desc(tx_ring); |
3018 | } | 3045 | } |
3046 | |||
3019 | } | 3047 | } |
3020 | 3048 | ||
3021 | static void qlcnic_tx_timeout(struct net_device *netdev) | 3049 | static void qlcnic_tx_timeout(struct net_device *netdev) |
@@ -3025,16 +3053,18 @@ static void qlcnic_tx_timeout(struct net_device *netdev) | |||
3025 | if (test_bit(__QLCNIC_RESETTING, &adapter->state)) | 3053 | if (test_bit(__QLCNIC_RESETTING, &adapter->state)) |
3026 | return; | 3054 | return; |
3027 | 3055 | ||
3028 | if (++adapter->tx_timeo_cnt >= QLCNIC_MAX_TX_TIMEOUTS) { | 3056 | qlcnic_dump_rings(adapter); |
3029 | netdev_info(netdev, "Tx timeout, reset the adapter.\n"); | 3057 | |
3058 | if (++adapter->tx_timeo_cnt >= QLCNIC_MAX_TX_TIMEOUTS || | ||
3059 | netif_msg_tx_err(adapter->ahw)) { | ||
3060 | netdev_err(netdev, "Tx timeout, reset the adapter.\n"); | ||
3030 | if (qlcnic_82xx_check(adapter)) | 3061 | if (qlcnic_82xx_check(adapter)) |
3031 | adapter->need_fw_reset = 1; | 3062 | adapter->need_fw_reset = 1; |
3032 | else if (qlcnic_83xx_check(adapter)) | 3063 | else if (qlcnic_83xx_check(adapter)) |
3033 | qlcnic_83xx_idc_request_reset(adapter, | 3064 | qlcnic_83xx_idc_request_reset(adapter, |
3034 | QLCNIC_FORCE_FW_DUMP_KEY); | 3065 | QLCNIC_FORCE_FW_DUMP_KEY); |
3035 | } else { | 3066 | } else { |
3036 | netdev_info(netdev, "Tx timeout, reset adapter context.\n"); | 3067 | netdev_err(netdev, "Tx timeout, reset adapter context.\n"); |
3037 | qlcnic_dump_tx_rings(adapter); | ||
3038 | adapter->ahw->reset_context = 1; | 3068 | adapter->ahw->reset_context = 1; |
3039 | } | 3069 | } |
3040 | } | 3070 | } |