case CPL_SGE_EGR_UPDATE: {
                /*
-                * We've received an Egress Queue status update message.
-                * We get these, as the SGE is currently configured, when
-                * the firmware passes certain points in processing our
-                * TX Ethernet Queue.  We use these updates to determine
-                * when we may need to restart a TX Ethernet Queue which
-                * was stopped for lack of free slots ...
+                * We've received an Egress Queue Status Update message.  We
+                * get these, if the SGE is configured to send these when the
+                * firmware passes certain points in processing our TX
+                * Ethernet Queue or if we make an explicit request for one.
+                * We use these updates to determine when we may need to
+                * restart a TX Ethernet Queue which was stopped for lack of
+                * free TX Queue Descriptors ...
                 */
                const struct cpl_sge_egr_update *p = (void *)cpl;
                unsigned int qid = EGR_QID(be32_to_cpu(p->opcode_qid));
                struct sge_txq *tq;
                struct sge_eth_txq *txq;
                unsigned int eq_idx;
-               int hw_cidx, reclaimable, in_use;
 
                /*
                 * Perform sanity checking on the Queue ID to make sure it
                        break;
                }
 
-               /*
-                * Skip TX Queues which aren't stopped.
-                */
-               if (likely(!netif_tx_queue_stopped(txq->txq)))
-                       break;
-
-               /*
-                * Skip stopped TX Queues which have more than half of their
-                * DMA rings occupied with unacknowledged writes.
-                */
-               hw_cidx = be16_to_cpu(txq->q.stat->cidx);
-               reclaimable = hw_cidx - txq->q.cidx;
-               if (reclaimable < 0)
-                       reclaimable += txq->q.size;
-               in_use = txq->q.in_use - reclaimable;
-               if (in_use >= txq->q.size/2)
-                       break;
-
                /*
                 * Restart a stopped TX Queue which has less than half of its
                 * TX ring in use ...
 
  */
 int t4vf_eth_xmit(struct sk_buff *skb, struct net_device *dev)
 {
+       u32 wr_mid;
        u64 cntrl, *end;
        int qidx, credits;
        unsigned int flits, ndesc;
                goto out_free;
        }
 
+       wr_mid = FW_WR_LEN16(DIV_ROUND_UP(flits, 2));
        if (unlikely(credits < ETHTXQ_STOP_THRES)) {
                /*
                 * After we're done injecting the Work Request for this
                 * packet, we'll be below our "stop threshhold" so stop the TX
-                * Queue now.  The queue will get started later on when the
-                * firmware informs us that space has opened up.
+                * Queue now and schedule a request for an SGE Egress Queue
+                * Update message.  The queue will get started later on when
+                * the firmware processes this Work Request and sends us an
+                * Egress Queue Status Update message indicating that space
+                * has opened up.
                 */
                txq_stop(txq);
+               wr_mid |= FW_WR_EQUEQ | FW_WR_EQUIQ;
        }
 
        /*
         */
        BUG_ON(DIV_ROUND_UP(ETHTXQ_MAX_HDR, TXD_PER_EQ_UNIT) > 1);
        wr = (void *)&txq->q.desc[txq->q.pidx];
-       wr->equiq_to_len16 = cpu_to_be32(FW_WR_LEN16(DIV_ROUND_UP(flits, 2)));
+       wr->equiq_to_len16 = cpu_to_be32(wr_mid);
        wr->r3[0] = cpu_to_be64(0);
        wr->r3[1] = cpu_to_be64(0);
        skb_copy_from_linear_data(skb, (void *)wr->ethmacdst, fw_hdr_copy_len);