aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/qlogic/qlcnic
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/qlogic/qlcnic')
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic.h4
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c4
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c48
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
929static u8 qlcnic_dcb_get_app(struct net_device *netdev, u8 idtype, u16 id) 929static 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
429static int qlcnic_fdb_dump(struct sk_buff *skb, struct netlink_callback *ncb, 429static 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
2983static void qlcnic_dump_tx_rings(struct qlcnic_adapter *adapter) 2984static 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
3021static void qlcnic_tx_timeout(struct net_device *netdev) 3049static 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}