aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorHimanshu Madhani <himanshu.madhani@qlogic.com>2014-01-23 17:18:29 -0500
committerDavid S. Miller <davem@davemloft.net>2014-01-23 19:13:09 -0500
commit95b3890ae39f60ad1d446b02f9439d12f01066be (patch)
treeefc61a6d5855388e58c5dc4bbefb51c70ffd26b2 /drivers/net
parent72ebe3495f6f6829306ccf6c6a8b1b92c2c9b672 (diff)
qlcnic: Enhance Tx timeout debugging.
o Dump each Tx queue details with all descriptors, queue indices and Tx queue stats to imporve data colletion in situations where Tx timeout occurs. Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c69
2 files changed, 51 insertions, 20 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
index f19cec860695..90a2dda351ec 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
@@ -383,7 +383,7 @@ static int qlcnic_83xx_idc_tx_soft_reset(struct qlcnic_adapter *adapter)
383 qlcnic_up(adapter, netdev); 383 qlcnic_up(adapter, netdev);
384 netif_device_attach(netdev); 384 netif_device_attach(netdev);
385 clear_bit(__QLCNIC_RESETTING, &adapter->state); 385 clear_bit(__QLCNIC_RESETTING, &adapter->state);
386 dev_err(&adapter->pdev->dev, "%s:\n", __func__); 386 netdev_info(adapter->netdev, "%s: soft reset complete.\n", __func__);
387 387
388 return 0; 388 return 0;
389} 389}
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index e2ee2bb5cd5c..39b631049b77 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -2007,7 +2007,7 @@ qlcnic_reset_hw_context(struct qlcnic_adapter *adapter)
2007 netif_device_attach(netdev); 2007 netif_device_attach(netdev);
2008 2008
2009 clear_bit(__QLCNIC_RESETTING, &adapter->state); 2009 clear_bit(__QLCNIC_RESETTING, &adapter->state);
2010 dev_err(&adapter->pdev->dev, "%s:\n", __func__); 2010 netdev_info(adapter->netdev, "%s: soft reset complete\n", __func__);
2011 return 0; 2011 return 0;
2012} 2012}
2013 2013
@@ -2747,12 +2747,58 @@ int qlcnic_check_temp(struct qlcnic_adapter *adapter)
2747 return rv; 2747 return rv;
2748} 2748}
2749 2749
2750static void qlcnic_tx_timeout(struct net_device *netdev) 2750static inline void dump_tx_ring_desc(struct qlcnic_host_tx_ring *tx_ring)
2751{ 2751{
2752 struct qlcnic_adapter *adapter = netdev_priv(netdev); 2752 int i;
2753 struct cmd_desc_type0 *tx_desc_info;
2754
2755 for (i = 0; i < tx_ring->num_desc; i++) {
2756 tx_desc_info = &tx_ring->desc_head[i];
2757 pr_info("TX Desc: %d\n", i);
2758 print_hex_dump(KERN_INFO, "TX: ", DUMP_PREFIX_OFFSET, 16, 1,
2759 &tx_ring->desc_head[i],
2760 sizeof(struct cmd_desc_type0), true);
2761 }
2762}
2763
2764static void qlcnic_dump_tx_rings(struct qlcnic_adapter *adapter)
2765{
2766 struct net_device *netdev = adapter->netdev;
2753 struct qlcnic_host_tx_ring *tx_ring; 2767 struct qlcnic_host_tx_ring *tx_ring;
2754 int ring; 2768 int ring;
2755 2769
2770 if (!netdev || !netif_running(netdev))
2771 return;
2772
2773 for (ring = 0; ring < adapter->drv_tx_rings; ring++) {
2774 tx_ring = &adapter->tx_ring[ring];
2775 netdev_info(netdev, "Tx ring=%d Context Id=0x%x\n",
2776 ring, tx_ring->ctx_id);
2777 netdev_info(netdev,
2778 "xmit_finished=%llu, xmit_called=%llu, xmit_on=%llu, xmit_off=%llu\n",
2779 tx_ring->tx_stats.xmit_finished,
2780 tx_ring->tx_stats.xmit_called,
2781 tx_ring->tx_stats.xmit_on,
2782 tx_ring->tx_stats.xmit_off);
2783 netdev_info(netdev,
2784 "crb_intr_mask=%d, hw_producer=%d, sw_producer=%d sw_consumer=%d, hw_consumer=%d\n",
2785 readl(tx_ring->crb_intr_mask),
2786 readl(tx_ring->crb_cmd_producer),
2787 tx_ring->producer, tx_ring->sw_consumer,
2788 le32_to_cpu(*(tx_ring->hw_consumer)));
2789
2790 netdev_info(netdev, "Total desc=%d, Available desc=%d\n",
2791 tx_ring->num_desc, qlcnic_tx_avail(tx_ring));
2792
2793 if (netif_msg_tx_done(adapter->ahw))
2794 dump_tx_ring_desc(tx_ring);
2795 }
2796}
2797
2798static void qlcnic_tx_timeout(struct net_device *netdev)
2799{
2800 struct qlcnic_adapter *adapter = netdev_priv(netdev);
2801
2756 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) 2802 if (test_bit(__QLCNIC_RESETTING, &adapter->state))
2757 return; 2803 return;
2758 2804
@@ -2765,22 +2811,7 @@ static void qlcnic_tx_timeout(struct net_device *netdev)
2765 QLCNIC_FORCE_FW_DUMP_KEY); 2811 QLCNIC_FORCE_FW_DUMP_KEY);
2766 } else { 2812 } else {
2767 netdev_info(netdev, "Tx timeout, reset adapter context.\n"); 2813 netdev_info(netdev, "Tx timeout, reset adapter context.\n");
2768 for (ring = 0; ring < adapter->drv_tx_rings; ring++) { 2814 qlcnic_dump_tx_rings(adapter);
2769 tx_ring = &adapter->tx_ring[ring];
2770 netdev_info(netdev, "Tx ring=%d\n", ring);
2771 netdev_info(netdev,
2772 "crb_intr_mask=%d, producer=%d, sw_consumer=%d, hw_consumer=%d\n",
2773 readl(tx_ring->crb_intr_mask),
2774 readl(tx_ring->crb_cmd_producer),
2775 tx_ring->sw_consumer,
2776 le32_to_cpu(*(tx_ring->hw_consumer)));
2777 netdev_info(netdev,
2778 "xmit_finished=%llu, xmit_called=%llu, xmit_on=%llu, xmit_off=%llu\n",
2779 tx_ring->tx_stats.xmit_finished,
2780 tx_ring->tx_stats.xmit_called,
2781 tx_ring->tx_stats.xmit_on,
2782 tx_ring->tx_stats.xmit_off);
2783 }
2784 adapter->ahw->reset_context = 1; 2815 adapter->ahw->reset_context = 1;
2785 } 2816 }
2786} 2817}