qlcnic: additional driver statistics
authorAmit Kumar Salecha <amit.salecha@qlogic.com>
Thu, 22 Apr 2010 02:51:35 +0000 (02:51 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 22 Apr 2010 22:28:26 +0000 (15:28 -0700)
Added additional driver statistics to track errors in rcv/tx path.

Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/qlcnic/qlcnic.h
drivers/net/qlcnic/qlcnic_ethtool.c
drivers/net/qlcnic/qlcnic_init.c
drivers/net/qlcnic/qlcnic_main.c

index 28c148cbe37b3084a2add2ed46abc5abf8c1c998..6c1da71025e1ec74e5414f215d08f44ee1645981 100644 (file)
@@ -428,6 +428,10 @@ struct qlcnic_adapter_stats {
        u64  xmit_on;
        u64  xmit_off;
        u64  skb_alloc_failure;
+       u64  null_skb;
+       u64  null_rxbuf;
+       u64  rx_dma_map_error;
+       u64  tx_dma_map_error;
 };
 
 /*
index 08d6f105371ffe81ac0c25abe50c73b6c23ce6a3..6cdc5ebb7411d7ba6daf63425fa04f8712ca2314 100644 (file)
@@ -69,6 +69,14 @@ static const struct qlcnic_stats qlcnic_gstrings_stats[] = {
                QLC_SIZEOF(stats.xmit_off), QLC_OFF(stats.xmit_off)},
        {"skb_alloc_failure", QLC_SIZEOF(stats.skb_alloc_failure),
                QLC_OFF(stats.skb_alloc_failure)},
+       {"null skb",
+               QLC_SIZEOF(stats.null_skb), QLC_OFF(stats.null_skb)},
+       {"null rxbuf",
+               QLC_SIZEOF(stats.null_rxbuf), QLC_OFF(stats.null_rxbuf)},
+       {"rx dma map error", QLC_SIZEOF(stats.rx_dma_map_error),
+                                        QLC_OFF(stats.rx_dma_map_error)},
+       {"tx dma map error", QLC_SIZEOF(stats.tx_dma_map_error),
+                                        QLC_OFF(stats.tx_dma_map_error)},
 
 };
 
index 01ce74ee99f9abc3cb25d26e74c9fbe8206f2af7..9ef9f58f84dd7c35e6bbf4e1d2a13806973853c7 100644 (file)
@@ -1287,6 +1287,7 @@ qlcnic_alloc_rx_skb(struct qlcnic_adapter *adapter,
                        rds_ring->dma_size, PCI_DMA_FROMDEVICE);
 
        if (pci_dma_mapping_error(pdev, dma)) {
+               adapter->stats.rx_dma_map_error++;
                dev_kfree_skb_any(skb);
                buffer->skb = NULL;
                return -ENOMEM;
@@ -1311,8 +1312,10 @@ static struct sk_buff *qlcnic_process_rxbuf(struct qlcnic_adapter *adapter,
                        PCI_DMA_FROMDEVICE);
 
        skb = buffer->skb;
-       if (!skb)
+       if (!skb) {
+               adapter->stats.null_skb++;
                goto no_skb;
+       }
 
        if (likely(adapter->rx_csum && cksum == STATUS_CKSUM_OK)) {
                adapter->stats.csummed++;
@@ -1502,6 +1505,8 @@ qlcnic_process_rcv_ring(struct qlcnic_host_sds_ring *sds_ring, int max)
 
                if (rxbuf)
                        list_add_tail(&rxbuf->list, &sds_ring->free_list[ring]);
+               else
+                       adapter->stats.null_rxbuf++;
 
 skip:
                for (; desc_cnt > 0; desc_cnt--) {
index e4fd5dcdfb4c5c1a74714a4abd199a578a8970ac..5845dc0616b1edd69e666670f0a8c0e4cdf87aae 100644 (file)
@@ -1589,8 +1589,10 @@ qlcnic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
 
        pdev = adapter->pdev;
 
-       if (qlcnic_map_tx_skb(pdev, skb, pbuf))
+       if (qlcnic_map_tx_skb(pdev, skb, pbuf)) {
+               adapter->stats.tx_dma_map_error++;
                goto drop_packet;
+       }
 
        pbuf->skb = skb;
        pbuf->frag_count = frag_count;