Commit af7efaff authored by David S. Miller's avatar David S. Miller

Merge branch 'qlcnic-next'

Harish Patil says:

====================
qlcnic: Enhance Tx timeout debug data collection.

The following set of patches are for enhancing Tx timeout debug collection

- Collect a firmware dump on first Tx timeout if netif_msg_tx_err() is set
- Log Receive and Status ring info on Tx timeout, in addition to Tx ring info
- Log additional Tx ring info if netif_msg_tx_err() is set
- Update driver version to 5.3.61

Please apply this series to net-next.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents fb0d164c 28470572
...@@ -39,8 +39,8 @@ ...@@ -39,8 +39,8 @@
#define _QLCNIC_LINUX_MAJOR 5 #define _QLCNIC_LINUX_MAJOR 5
#define _QLCNIC_LINUX_MINOR 3 #define _QLCNIC_LINUX_MINOR 3
#define _QLCNIC_LINUX_SUBVERSION 60 #define _QLCNIC_LINUX_SUBVERSION 61
#define QLCNIC_LINUX_VERSIONID "5.3.60" #define QLCNIC_LINUX_VERSIONID "5.3.61"
#define QLCNIC_DRV_IDC_VER 0x01 #define QLCNIC_DRV_IDC_VER 0x01
#define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\ #define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\
(_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION)) (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION))
......
...@@ -2980,17 +2980,43 @@ static inline void dump_tx_ring_desc(struct qlcnic_host_tx_ring *tx_ring) ...@@ -2980,17 +2980,43 @@ static inline void dump_tx_ring_desc(struct qlcnic_host_tx_ring *tx_ring)
} }
} }
static void qlcnic_dump_tx_rings(struct qlcnic_adapter *adapter) static void qlcnic_dump_rings(struct qlcnic_adapter *adapter)
{ {
struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx;
struct net_device *netdev = adapter->netdev; struct net_device *netdev = adapter->netdev;
struct qlcnic_host_rds_ring *rds_ring;
struct qlcnic_host_sds_ring *sds_ring;
struct qlcnic_host_tx_ring *tx_ring; struct qlcnic_host_tx_ring *tx_ring;
int ring; int ring;
if (!netdev || !netif_running(netdev)) if (!netdev || !netif_running(netdev))
return; return;
for (ring = 0; ring < adapter->max_rds_rings; ring++) {
rds_ring = &recv_ctx->rds_rings[ring];
if (!rds_ring)
continue;
netdev_info(netdev,
"rds_ring=%d crb_rcv_producer=%d producer=%u num_desc=%u\n",
ring, readl(rds_ring->crb_rcv_producer),
rds_ring->producer, rds_ring->num_desc);
}
for (ring = 0; ring < adapter->drv_sds_rings; ring++) {
sds_ring = &(recv_ctx->sds_rings[ring]);
if (!sds_ring)
continue;
netdev_info(netdev,
"sds_ring=%d crb_sts_consumer=%d consumer=%u crb_intr_mask=%d num_desc=%u\n",
ring, readl(sds_ring->crb_sts_consumer),
sds_ring->consumer, readl(sds_ring->crb_intr_mask),
sds_ring->num_desc);
}
for (ring = 0; ring < adapter->drv_tx_rings; ring++) { for (ring = 0; ring < adapter->drv_tx_rings; ring++) {
tx_ring = &adapter->tx_ring[ring]; tx_ring = &adapter->tx_ring[ring];
if (!tx_ring)
continue;
netdev_info(netdev, "Tx ring=%d Context Id=0x%x\n", netdev_info(netdev, "Tx ring=%d Context Id=0x%x\n",
ring, tx_ring->ctx_id); ring, tx_ring->ctx_id);
netdev_info(netdev, netdev_info(netdev,
...@@ -3013,9 +3039,10 @@ static void qlcnic_dump_tx_rings(struct qlcnic_adapter *adapter) ...@@ -3013,9 +3039,10 @@ static void qlcnic_dump_tx_rings(struct qlcnic_adapter *adapter)
netdev_info(netdev, "Total desc=%d, Available desc=%d\n", netdev_info(netdev, "Total desc=%d, Available desc=%d\n",
tx_ring->num_desc, qlcnic_tx_avail(tx_ring)); tx_ring->num_desc, qlcnic_tx_avail(tx_ring));
if (netif_msg_tx_done(adapter->ahw)) if (netif_msg_tx_err(adapter->ahw))
dump_tx_ring_desc(tx_ring); dump_tx_ring_desc(tx_ring);
} }
} }
static void qlcnic_tx_timeout(struct net_device *netdev) static void qlcnic_tx_timeout(struct net_device *netdev)
...@@ -3025,16 +3052,18 @@ static void qlcnic_tx_timeout(struct net_device *netdev) ...@@ -3025,16 +3052,18 @@ static void qlcnic_tx_timeout(struct net_device *netdev)
if (test_bit(__QLCNIC_RESETTING, &adapter->state)) if (test_bit(__QLCNIC_RESETTING, &adapter->state))
return; return;
if (++adapter->tx_timeo_cnt >= QLCNIC_MAX_TX_TIMEOUTS) { qlcnic_dump_rings(adapter);
netdev_info(netdev, "Tx timeout, reset the adapter.\n");
if (++adapter->tx_timeo_cnt >= QLCNIC_MAX_TX_TIMEOUTS ||
netif_msg_tx_err(adapter->ahw)) {
netdev_err(netdev, "Tx timeout, reset the adapter.\n");
if (qlcnic_82xx_check(adapter)) if (qlcnic_82xx_check(adapter))
adapter->need_fw_reset = 1; adapter->need_fw_reset = 1;
else if (qlcnic_83xx_check(adapter)) else if (qlcnic_83xx_check(adapter))
qlcnic_83xx_idc_request_reset(adapter, qlcnic_83xx_idc_request_reset(adapter,
QLCNIC_FORCE_FW_DUMP_KEY); QLCNIC_FORCE_FW_DUMP_KEY);
} else { } else {
netdev_info(netdev, "Tx timeout, reset adapter context.\n"); netdev_err(netdev, "Tx timeout, reset adapter context.\n");
qlcnic_dump_tx_rings(adapter);
adapter->ahw->reset_context = 1; adapter->ahw->reset_context = 1;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment