struct net_local *lp = netdev_priv(ndev);
u32 regval;
u32 len = 0;
+ u32 leninbd = 0;
unsigned int bdcount = 0;
unsigned int bdpartialcount = 0;
unsigned int sop = 0;
rp = &lp->tx_skb[lp->tx_bd_ci];
skb = rp->skb;
- BUG_ON(skb == NULL);
- len += skb->len;
+ leninbd = cur_p->ctrl & XEMACPS_TXBUF_LEN_MASK;
+ len += leninbd;
#ifdef CONFIG_XILINX_PS_EMAC_HWTSTAMP
if ((lp->hwtstamp_config.tx_type == HWTSTAMP_TX_ON) &&
}
#endif /* CONFIG_XILINX_PS_EMAC_HWTSTAMP */
- dma_unmap_single(&lp->pdev->dev, rp->mapping, skb->len,
+ dma_unmap_single(&lp->pdev->dev, rp->mapping, leninbd,
DMA_TO_DEVICE);
+ if (skb != NULL)
+ dev_kfree_skb(skb);
rp->skb = NULL;
- dev_kfree_skb(skb);
/* log tx completed packets and bytes, errors logs
* are in other error counters.
*/
frag++;
}
- lp->tx_skb[lp->tx_bd_tail].skb = skb;
+ if (i == 0)
+ lp->tx_skb[lp->tx_bd_tail].skb = skb;
+ else
+ lp->tx_skb[lp->tx_bd_tail].skb = NULL;
lp->tx_skb[lp->tx_bd_tail].mapping = mapping;
-
cur_p->addr = mapping;
/* Preserve only critical status bits. Packet is NOT to be