entry = stmmac_jumbo_frm(priv, tx_q, skb, csum_insertion);
if (unlikely(entry < 0) && (entry != -EINVAL))
goto dma_map_err;
+ } else {
+ bool last_segment = (nfrags == 0);
+
+ dma_addr = dma_map_single(priv->device, skb->data,
+ nopaged_len, DMA_TO_DEVICE);
+ if (dma_mapping_error(priv->device, dma_addr))
+ goto dma_map_err;
+
+ stmmac_set_tx_skb_dma_entry(tx_q, first_entry, dma_addr,
+ nopaged_len, false);
+
+ stmmac_set_desc_addr(priv, first_desc, dma_addr);
+
+ if (last_segment)
+ stmmac_set_tx_dma_last_segment(tx_q, first_entry);
+
+ if (unlikely((skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) &&
+ priv->hwts_tx_en)) {
+ /* declare that device is doing timestamping */
+ skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
+ stmmac_enable_tx_timestamp(priv, first_desc);
+ }
+
+ /* Prepare the first descriptor without setting the OWN bit */
+ stmmac_prepare_tx_desc(priv, first_desc, 1, nopaged_len,
+ csum_insertion, priv->descriptor_mode,
+ 0, last_segment, skb->len);
}
for (i = 0; i < nfrags; i++) {
if (priv->sarc_type)
stmmac_set_desc_sarc(priv, first_desc, priv->sarc_type);
- /* Ready to fill the first descriptor and set the OWN bit w/o any
- * problems because all the descriptors are actually ready to be
- * passed to the DMA engine.
- */
- if (likely(!is_jumbo)) {
- bool last_segment = (nfrags == 0);
-
- dma_addr = dma_map_single(priv->device, skb->data,
- nopaged_len, DMA_TO_DEVICE);
- if (dma_mapping_error(priv->device, dma_addr))
- goto dma_map_err;
-
- stmmac_set_tx_skb_dma_entry(tx_q, first_entry, dma_addr,
- nopaged_len, false);
-
- stmmac_set_desc_addr(priv, first_desc, dma_addr);
-
- if (last_segment)
- stmmac_set_tx_dma_last_segment(tx_q, first_entry);
-
- if (unlikely((skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) &&
- priv->hwts_tx_en)) {
- /* declare that device is doing timestamping */
- skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
- stmmac_enable_tx_timestamp(priv, first_desc);
- }
-
- /* Prepare the first descriptor setting the OWN bit too */
- stmmac_prepare_tx_desc(priv, first_desc, 1, nopaged_len,
- csum_insertion, priv->descriptor_mode,
- 0, last_segment, skb->len);
- }
-
if (tx_q->tbs & STMMAC_TBS_EN) {
struct timespec64 ts = ns_to_timespec64(skb->tstamp);
stmmac_set_desc_tbs(priv, tbs_desc, ts.tv_sec, ts.tv_nsec);
}
+ /* Set the OWN bit on the first descriptor now that all descriptors
+ * for this skb are populated.
+ */
stmmac_set_tx_owner(priv, first_desc);
netdev_tx_sent_queue(netdev_get_tx_queue(dev, queue), skb->len);