struct rswitch_ext_desc *desc;
        struct sk_buff *skb;
 
-       for (; rswitch_get_num_cur_queues(gq) > 0;
-            gq->dirty = rswitch_next_queue_index(gq, false, 1)) {
-               desc = &gq->tx_ring[gq->dirty];
-               if ((desc->desc.die_dt & DT_MASK) != DT_FEMPTY)
-                       break;
-
+       desc = &gq->tx_ring[gq->dirty];
+       while ((desc->desc.die_dt & DT_MASK) == DT_FEMPTY) {
                dma_rmb();
+
                skb = gq->skbs[gq->dirty];
                if (skb) {
                        rdev->ndev->stats.tx_packets++;
                        dev_kfree_skb_any(gq->skbs[gq->dirty]);
                        gq->skbs[gq->dirty] = NULL;
                }
+
                desc->desc.die_dt = DT_EEMPTY;
+               gq->dirty = rswitch_next_queue_index(gq, false, 1);
+               desc = &gq->tx_ring[gq->dirty];
        }
 }
 
        gq->skbs[(gq->cur + nr_desc - 1) % gq->ring_size] = skb;
        gq->unmap_addrs[(gq->cur + nr_desc - 1) % gq->ring_size] = dma_addr_orig;
 
+       dma_wmb();
+
        /* DT_FSTART should be set at last. So, this is reverse order. */
        for (i = nr_desc; i-- > 0; ) {
                desc = &gq->tx_ring[rswitch_next_queue_index(gq, true, i)];
                        goto err_unmap;
        }
 
-       wmb();  /* gq->cur must be incremented after die_dt was set */
-
        gq->cur = rswitch_next_queue_index(gq, true, nr_desc);
        rswitch_modify(rdev->addr, GWTRC(gq->index), 0, BIT(gq->index % 32));