From: VSR Burru <veerasenareddy.bu...@cavium.com>

If there are no egress packets pending, then don't look for tx completions
in napi poll.  Also, fix broken tx queue wakeup logic.

Signed-off-by: VSR Burru <veerasenareddy.bu...@cavium.com>
Signed-off-by: Felix Manlunas <felix.manlu...@cavium.com>
Signed-off-by: Satanand Burla <satananda.bu...@cavium.com>
Signed-off-by: Derek Chickles <derek.chick...@cavium.com>
---
 drivers/net/ethernet/cavium/liquidio/lio_main.c    | 20 +++++++++++---------
 drivers/net/ethernet/cavium/liquidio/lio_vf_main.c | 19 +++++++++++--------
 2 files changed, 22 insertions(+), 17 deletions(-)

diff --git a/drivers/net/ethernet/cavium/liquidio/lio_main.c 
b/drivers/net/ethernet/cavium/liquidio/lio_main.c
index be9c0e3..9124e63 100644
--- a/drivers/net/ethernet/cavium/liquidio/lio_main.c
+++ b/drivers/net/ethernet/cavium/liquidio/lio_main.c
@@ -959,14 +959,13 @@ static void update_txq_status(struct octeon_device *oct, 
int iq_num)
                        INCR_INSTRQUEUE_PKT_COUNT(lio->oct_dev, iq_num,
                                                  tx_restart, 1);
                        netif_wake_subqueue(netdev, iq->q_index);
-               } else {
-                       if (!octnet_iq_is_full(oct, lio->txq)) {
-                               INCR_INSTRQUEUE_PKT_COUNT(lio->oct_dev,
-                                                         lio->txq,
-                                                         tx_restart, 1);
-                               wake_q(netdev, lio->txq);
-                       }
                }
+       } else if (netif_queue_stopped(netdev) &&
+                  lio->linfo.link.s.link_up &&
+                  (!octnet_iq_is_full(oct, lio->txq))) {
+               INCR_INSTRQUEUE_PKT_COUNT(lio->oct_dev,
+                                         lio->txq, tx_restart, 1);
+               netif_wake_queue(netdev);
        }
 }
 
@@ -2435,8 +2434,11 @@ static int liquidio_napi_poll(struct napi_struct *napi, 
int budget)
        /* Flush the instruction queue */
        iq = oct->instr_queue[iq_no];
        if (iq) {
-               /* Process iq buffers with in the budget limits */
-               tx_done = octeon_flush_iq(oct, iq, budget);
+               if (atomic_read(&iq->instr_pending))
+                       /* Process iq buffers with in the budget limits */
+                       tx_done = octeon_flush_iq(oct, iq, budget);
+               else
+                       tx_done = 1;
                /* Update iq read-index rather than waiting for next interrupt.
                 * Return back if tx_done is false.
                 */
diff --git a/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c 
b/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c
index 9d5e035..585ea70 100644
--- a/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c
+++ b/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c
@@ -692,13 +692,12 @@ static void update_txq_status(struct octeon_device *oct, 
int iq_num)
                        netif_wake_subqueue(netdev, iq->q_index);
                        INCR_INSTRQUEUE_PKT_COUNT(lio->oct_dev, iq_num,
                                                  tx_restart, 1);
-               } else {
-                       if (!octnet_iq_is_full(oct, lio->txq)) {
-                               INCR_INSTRQUEUE_PKT_COUNT(
-                                   lio->oct_dev, lio->txq, tx_restart, 1);
-                               wake_q(netdev, lio->txq);
-                       }
                }
+       } else if (netif_queue_stopped(netdev) && lio->linfo.link.s.link_up &&
+                  (!octnet_iq_is_full(oct, lio->txq))) {
+               INCR_INSTRQUEUE_PKT_COUNT(lio->oct_dev,
+                                         lio->txq, tx_restart, 1);
+               netif_wake_queue(netdev);
        }
 }
 
@@ -1620,8 +1619,12 @@ static int liquidio_napi_poll(struct napi_struct *napi, 
int budget)
        /* Flush the instruction queue */
        iq = oct->instr_queue[iq_no];
        if (iq) {
-               /* Process iq buffers with in the budget limits */
-               tx_done = octeon_flush_iq(oct, iq, budget);
+               if (atomic_read(&iq->instr_pending))
+                       /* Process iq buffers with in the budget limits */
+                       tx_done = octeon_flush_iq(oct, iq, budget);
+               else
+                       tx_done = 1;
+
                /* Update iq read-index rather than waiting for next interrupt.
                 * Return back if tx_done is false.
                 */

Reply via email to