mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 14:42:37 +02:00
sh_eth: advance 'rxdesc' later in sh_eth_ring_format()
[ Upstream commit d0ba913488 ]
Iff dma_map_single() fails, 'rxdesc' should point to the last filled RX
descriptor, so that it can be marked as the last one, however the driver
would have already advanced it by that time. In order to fix that, only
fill an RX descriptor once all the data for it is ready.
Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
a95fc0f757
commit
8352a292fe
|
|
@ -1185,11 +1185,8 @@ static void sh_eth_ring_format(struct net_device *ndev)
|
|||
break;
|
||||
sh_eth_set_receive_align(skb);
|
||||
|
||||
/* RX descriptor */
|
||||
rxdesc = &mdp->rx_ring[i];
|
||||
/* The size of the buffer is a multiple of 32 bytes. */
|
||||
buf_len = ALIGN(mdp->rx_buf_sz, 32);
|
||||
rxdesc->len = cpu_to_edmac(mdp, buf_len << 16);
|
||||
dma_addr = dma_map_single(&ndev->dev, skb->data, buf_len,
|
||||
DMA_FROM_DEVICE);
|
||||
if (dma_mapping_error(&ndev->dev, dma_addr)) {
|
||||
|
|
@ -1197,6 +1194,10 @@ static void sh_eth_ring_format(struct net_device *ndev)
|
|||
break;
|
||||
}
|
||||
mdp->rx_skbuff[i] = skb;
|
||||
|
||||
/* RX descriptor */
|
||||
rxdesc = &mdp->rx_ring[i];
|
||||
rxdesc->len = cpu_to_edmac(mdp, buf_len << 16);
|
||||
rxdesc->addr = cpu_to_edmac(mdp, dma_addr);
|
||||
rxdesc->status = cpu_to_edmac(mdp, RD_RACT | RD_RFP);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user