mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-18 18:23:53 +08:00
net: ll_temac: Add more error handling of dma_map_single() calls
This adds error handling to the remaining dma_map_single() calls, so that
behavior is well defined if/when we run out of DMA memory.
Fixes: 9274498953
("net: add Xilinx ll_temac device driver")
Signed-off-by: Esben Haabendal <esben@geanix.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
84823ff80f
commit
d07c849cd2
@ -367,6 +367,8 @@ static int temac_dma_bd_init(struct net_device *ndev)
|
||||
skb_dma_addr = dma_map_single(ndev->dev.parent, skb->data,
|
||||
XTE_MAX_JUMBO_FRAME_SIZE,
|
||||
DMA_FROM_DEVICE);
|
||||
if (dma_mapping_error(ndev->dev.parent, skb_dma_addr))
|
||||
goto out;
|
||||
lp->rx_bd_v[i].phys = cpu_to_be32(skb_dma_addr);
|
||||
lp->rx_bd_v[i].len = cpu_to_be32(XTE_MAX_JUMBO_FRAME_SIZE);
|
||||
lp->rx_bd_v[i].app0 = cpu_to_be32(STS_CTRL_APP0_IRQONEND);
|
||||
@ -863,12 +865,13 @@ temac_start_xmit(struct sk_buff *skb, struct net_device *ndev)
|
||||
skb_dma_addr = dma_map_single(ndev->dev.parent, skb->data,
|
||||
skb_headlen(skb), DMA_TO_DEVICE);
|
||||
cur_p->len = cpu_to_be32(skb_headlen(skb));
|
||||
if (WARN_ON_ONCE(dma_mapping_error(ndev->dev.parent, skb_dma_addr)))
|
||||
return NETDEV_TX_BUSY;
|
||||
cur_p->phys = cpu_to_be32(skb_dma_addr);
|
||||
ptr_to_txbd((void *)skb, cur_p);
|
||||
|
||||
for (ii = 0; ii < num_frag; ii++) {
|
||||
lp->tx_bd_tail++;
|
||||
if (lp->tx_bd_tail >= TX_BD_NUM)
|
||||
if (++lp->tx_bd_tail >= TX_BD_NUM)
|
||||
lp->tx_bd_tail = 0;
|
||||
|
||||
cur_p = &lp->tx_bd_v[lp->tx_bd_tail];
|
||||
@ -876,6 +879,25 @@ temac_start_xmit(struct sk_buff *skb, struct net_device *ndev)
|
||||
skb_frag_address(frag),
|
||||
skb_frag_size(frag),
|
||||
DMA_TO_DEVICE);
|
||||
if (dma_mapping_error(ndev->dev.parent, skb_dma_addr)) {
|
||||
if (--lp->tx_bd_tail < 0)
|
||||
lp->tx_bd_tail = TX_BD_NUM - 1;
|
||||
cur_p = &lp->tx_bd_v[lp->tx_bd_tail];
|
||||
while (--ii >= 0) {
|
||||
--frag;
|
||||
dma_unmap_single(ndev->dev.parent,
|
||||
be32_to_cpu(cur_p->phys),
|
||||
skb_frag_size(frag),
|
||||
DMA_TO_DEVICE);
|
||||
if (--lp->tx_bd_tail < 0)
|
||||
lp->tx_bd_tail = TX_BD_NUM - 1;
|
||||
cur_p = &lp->tx_bd_v[lp->tx_bd_tail];
|
||||
}
|
||||
dma_unmap_single(ndev->dev.parent,
|
||||
be32_to_cpu(cur_p->phys),
|
||||
skb_headlen(skb), DMA_TO_DEVICE);
|
||||
return NETDEV_TX_BUSY;
|
||||
}
|
||||
cur_p->phys = cpu_to_be32(skb_dma_addr);
|
||||
cur_p->len = cpu_to_be32(skb_frag_size(frag));
|
||||
cur_p->app0 = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user