struct ring_info {
struct sk_buff *skb;
dma_addr_t mapping;
+ size_t len;
};
/* DMA buffer descriptor structure. Each BD is two words */
skb = lp->rx_skb[lp->rx_bd_ci].skb;
dma_unmap_single(lp->ndev->dev.parent,
lp->rx_skb[lp->rx_bd_ci].mapping,
- XEMACPS_RX_BUF_SIZE,
+ lp->rx_skb[lp->rx_bd_ci].len,
DMA_FROM_DEVICE);
/* setup received skb and send it upstream */
| (new_skb_baddr);
lp->rx_skb[lp->rx_bd_ci].skb = new_skb;
lp->rx_skb[lp->rx_bd_ci].mapping = new_skb_baddr;
+ lp->rx_skb[lp->rx_bd_ci].len = XEMACPS_RX_BUF_SIZE;
cur_p->ctrl = 0;
cur_p->addr &= (~XEMACPS_RXBUF_NEW_MASK);
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;
- leninbd = cur_p->ctrl & XEMACPS_TXBUF_LEN_MASK;
- len += leninbd;
+ len += (cur_p->ctrl & XEMACPS_TXBUF_LEN_MASK);
#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, leninbd,
+ dma_unmap_single(&lp->pdev->dev, rp->mapping, rp->len,
DMA_TO_DEVICE);
if (skb != NULL)
dev_kfree_skb(skb);
if (!(cur_p->ctrl & XEMACPS_TXBUF_ERR_MASK)) {
lp->stats.tx_packets++;
lp->stats.tx_bytes += len;
+ len = 0;
}
}
if (lp->rx_skb && lp->rx_skb[i].skb) {
dma_unmap_single(lp->ndev->dev.parent,
lp->rx_skb[i].mapping,
- XEMACPS_RX_BUF_SIZE,
+ lp->rx_skb[i].len,
DMA_FROM_DEVICE);
dev_kfree_skb(lp->rx_skb[i].skb);
if (lp->tx_skb && lp->tx_skb[i].skb) {
dma_unmap_single(lp->ndev->dev.parent,
lp->tx_skb[i].mapping,
- lp->tx_skb[i].skb->len,
+ lp->tx_skb[i].len,
DMA_TO_DEVICE);
dev_kfree_skb(lp->tx_skb[i].skb);
| (new_skb_baddr);
lp->rx_skb[i].skb = new_skb;
lp->rx_skb[i].mapping = new_skb_baddr;
+ lp->rx_skb[i].len = XEMACPS_RX_BUF_SIZE;
wmb();
}
cur_p = &lp->rx_bd[XEMACPS_RECV_BD_CNT - 1];
else
lp->tx_skb[lp->tx_bd_tail].skb = NULL;
lp->tx_skb[lp->tx_bd_tail].mapping = mapping;
+ lp->tx_skb[lp->tx_bd_tail].len = len;
cur_p->addr = mapping;
/* Preserve only critical status bits. Packet is NOT to be