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);
        }
 }
 
        /* 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.
                 */
 
                        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);
        }
 }
 
        /* 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.
                 */