dmadesc_set(priv, tx_cb_ptr->bd_addr, mapping, length_status);
 
-       /* Decrement total BD count and advance our write pointer */
-       ring->free_bds -= 1;
-       ring->prod_index += 1;
-       ring->prod_index &= DMA_P_INDEX_MASK;
-
        return 0;
 }
 
                    (frag->size << DMA_BUFLENGTH_SHIFT) | dma_desc_flags |
                    (priv->hw_params->qtag_mask << DMA_TX_QTAG_SHIFT));
 
-
-       ring->free_bds -= 1;
-       ring->prod_index += 1;
-       ring->prod_index &= DMA_P_INDEX_MASK;
-
        return 0;
 }
 
 
        skb_tx_timestamp(skb);
 
-       /* we kept a software copy of how much we should advance the TDMA
-        * producer index, now write it down to the hardware
-        */
+       /* Decrement total BD count and advance our write pointer */
+       ring->free_bds -= nr_frags + 1;
+       ring->prod_index += nr_frags + 1;
+       ring->prod_index &= DMA_P_INDEX_MASK;
+
        bcmgenet_tdma_ring_writel(priv, ring->index,
                                  ring->prod_index, TDMA_PROD_INDEX);