When inserting the TSB, keep track of how many times we had to do it and
if there was a failure in doing so, this helps profile the driver for
possibly incorrect headroom settings.

Signed-off-by: Florian Fainelli <f.faine...@gmail.com>
---
 drivers/net/ethernet/broadcom/bcmsysport.c | 5 +++++
 drivers/net/ethernet/broadcom/bcmsysport.h | 2 ++
 2 files changed, 7 insertions(+)

diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c 
b/drivers/net/ethernet/broadcom/bcmsysport.c
index 6c40cf6090ab..faba55fd656a 100644
--- a/drivers/net/ethernet/broadcom/bcmsysport.c
+++ b/drivers/net/ethernet/broadcom/bcmsysport.c
@@ -284,6 +284,8 @@ static const struct bcm_sysport_stats 
bcm_sysport_gstrings_stats[] = {
        STAT_MIB_SOFT("alloc_rx_buff_failed", mib.alloc_rx_buff_failed),
        STAT_MIB_SOFT("rx_dma_failed", mib.rx_dma_failed),
        STAT_MIB_SOFT("tx_dma_failed", mib.tx_dma_failed),
+       STAT_MIB_SOFT("tx_realloc_tsb", mib.tx_realloc_tsb),
+       STAT_MIB_SOFT("tx_realloc_tsb_failed", mib.tx_realloc_tsb_failed),
        /* Per TX-queue statistics are dynamically appended */
 };
 
@@ -1220,6 +1222,7 @@ static void bcm_sysport_poll_controller(struct net_device 
*dev)
 static struct sk_buff *bcm_sysport_insert_tsb(struct sk_buff *skb,
                                              struct net_device *dev)
 {
+       struct bcm_sysport_priv *priv = netdev_priv(dev);
        struct sk_buff *nskb;
        struct bcm_tsb *tsb;
        u32 csum_info;
@@ -1232,12 +1235,14 @@ static struct sk_buff *bcm_sysport_insert_tsb(struct 
sk_buff *skb,
                nskb = skb_realloc_headroom(skb, sizeof(*tsb));
                if (!nskb) {
                        dev_kfree_skb_any(skb);
+                       priv->mib.tx_realloc_tsb_failed++;
                        dev->stats.tx_errors++;
                        dev->stats.tx_dropped++;
                        return NULL;
                }
                dev_consume_skb_any(skb);
                skb = nskb;
+               priv->mib.tx_realloc_tsb++;
        }
 
        tsb = skb_push(skb, sizeof(*tsb));
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.h 
b/drivers/net/ethernet/broadcom/bcmsysport.h
index 046c6c1d97fd..a7a230884a87 100644
--- a/drivers/net/ethernet/broadcom/bcmsysport.h
+++ b/drivers/net/ethernet/broadcom/bcmsysport.h
@@ -607,6 +607,8 @@ struct bcm_sysport_mib {
        u32 alloc_rx_buff_failed;
        u32 rx_dma_failed;
        u32 tx_dma_failed;
+       u32 tx_realloc_tsb;
+       u32 tx_realloc_tsb_failed;
 };
 
 /* HW maintains a large list of counters */
-- 
2.17.1

Reply via email to