net: ll_temac: Enable DMA when ready, not before
As soon as TAILDESCR_PTR is written, DMA transfers might start. Let's ensure we are ready to receive DMA IRQ's before doing that. Signed-off-by: Esben Haabendal <esben@geanix.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
7e97a194ac
commit
73f7375d3e
@ -314,17 +314,21 @@ static int temac_dma_bd_init(struct net_device *ndev)
|
||||
CHNL_CTRL_IRQ_EN | CHNL_CTRL_IRQ_ERR_EN |
|
||||
CHNL_CTRL_IRQ_DLY_EN | CHNL_CTRL_IRQ_COAL_EN);
|
||||
|
||||
lp->dma_out(lp, RX_CURDESC_PTR, lp->rx_bd_p);
|
||||
lp->dma_out(lp, RX_TAILDESC_PTR,
|
||||
lp->rx_bd_p + (sizeof(*lp->rx_bd_v) * (RX_BD_NUM - 1)));
|
||||
lp->dma_out(lp, TX_CURDESC_PTR, lp->tx_bd_p);
|
||||
|
||||
/* Init descriptor indexes */
|
||||
lp->tx_bd_ci = 0;
|
||||
lp->tx_bd_next = 0;
|
||||
lp->tx_bd_tail = 0;
|
||||
lp->rx_bd_ci = 0;
|
||||
|
||||
/* Enable RX DMA transfers */
|
||||
wmb();
|
||||
lp->dma_out(lp, RX_CURDESC_PTR, lp->rx_bd_p);
|
||||
lp->dma_out(lp, RX_TAILDESC_PTR,
|
||||
lp->rx_bd_p + (sizeof(*lp->rx_bd_v) * (RX_BD_NUM - 1)));
|
||||
|
||||
/* Prepare for TX DMA transfer */
|
||||
lp->dma_out(lp, TX_CURDESC_PTR, lp->tx_bd_p);
|
||||
|
||||
return 0;
|
||||
|
||||
out:
|
||||
@ -789,6 +793,7 @@ temac_start_xmit(struct sk_buff *skb, struct net_device *ndev)
|
||||
skb_tx_timestamp(skb);
|
||||
|
||||
/* Kick off the transfer */
|
||||
wmb();
|
||||
lp->dma_out(lp, TX_TAILDESC_PTR, tail_p); /* DMA start */
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
|
Loading…
Reference in New Issue
Block a user