int t4_sge_eth_txq_egress_update(struct adapter *adap, struct sge_eth_txq *eq,
                                 int maxreclaim)
 {
+       unsigned int reclaimed, hw_cidx;
        struct sge_txq *q = &eq->q;
-       unsigned int reclaimed;
+       int hw_in_use;
 
        if (!q->in_use || !__netif_tx_trylock(eq->txq))
                return 0;
        /* Reclaim pending completed TX Descriptors. */
        reclaimed = reclaim_completed_tx(adap, &eq->q, maxreclaim, true);
 
+       hw_cidx = ntohs(READ_ONCE(q->stat->cidx));
+       hw_in_use = q->pidx - hw_cidx;
+       if (hw_in_use < 0)
+               hw_in_use += q->size;
+
        /* If the TX Queue is currently stopped and there's now more than half
         * the queue available, restart it.  Otherwise bail out since the rest
         * of what we want do here is with the possibility of shipping any
         * currently buffered Coalesced TX Work Request.
         */
-       if (netif_tx_queue_stopped(eq->txq) && txq_avail(q) > (q->size / 2)) {
+       if (netif_tx_queue_stopped(eq->txq) && hw_in_use < (q->size / 2)) {
                netif_tx_wake_queue(eq->txq);
                eq->q.restarts++;
        }