liquidio: fix inaccurate count of napi-processed rx packets reported to Octeon
authorPrasad Kanneganti <prasad.kanneganti@cavium.com>
Thu, 25 May 2017 17:54:29 +0000 (10:54 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 26 May 2017 18:41:48 +0000 (14:41 -0400)
lio_enable_irq (called by napi poll) is reporting to Octeon an inaccurate
count of processed rx packets causing Octeon to eventually stop forwarding
packets to the host.  Fix it by using this formula for an accurate count:

    processed rx packets = droq->pkt_count - droq->pkts_pending

Also increase SOFT_COMMAND_BUFFER_SIZE to match what the firmware expects.

Signed-off-by: Prasad Kanneganti <prasad.kanneganti@cavium.com>
Signed-off-by: Felix Manlunas <felix.manlunas@cavium.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/cavium/liquidio/octeon_device.c
drivers/net/ethernet/cavium/liquidio/octeon_iq.h

index b5be7074f3dedfdb95a8ae4388bd41898522d733..3b7cc9320deb15eecdf226c0def9962de20e43dd 100644 (file)
@@ -1429,13 +1429,15 @@ int lio_get_device_id(void *dev)
 void lio_enable_irq(struct octeon_droq *droq, struct octeon_instr_queue *iq)
 {
        u64 instr_cnt;
+       u32 pkts_pend;
        struct octeon_device *oct = NULL;
 
        /* the whole thing needs to be atomic, ideally */
        if (droq) {
+               pkts_pend = (u32)atomic_read(&droq->pkts_pending);
                spin_lock_bh(&droq->lock);
-               writel(droq->pkt_count, droq->pkts_sent_reg);
-               droq->pkt_count = 0;
+               writel(droq->pkt_count - pkts_pend, droq->pkts_sent_reg);
+               droq->pkt_count = pkts_pend;
                /* this write needs to be flushed before we release the lock */
                mmiowb();
                spin_unlock_bh(&droq->lock);
index 5063a12613e53646b9930f10090eae13c32301e3..5c3c8da976f7332b0db0449bd35969555332059f 100644 (file)
@@ -251,7 +251,7 @@ union octeon_instr_64B {
 
 /** The size of each buffer in soft command buffer pool
  */
-#define  SOFT_COMMAND_BUFFER_SIZE      1536
+#define  SOFT_COMMAND_BUFFER_SIZE      2048
 
 struct octeon_soft_command {
        /** Soft command buffer info. */