bmips: check for DMA error when refilling Rx
dma_mapping_error() should be called as dma_map_single() could fail and return error. Signed-off-by: Sieng-Piaw Liew <liew.s.piaw@gmail.com>
This commit is contained in:
parent
a6a54135ef
commit
65ebe31130
1 changed files with 20 additions and 8 deletions
|
@ -270,6 +270,7 @@ static int bcm6368_enetsw_refill_rx(struct net_device *dev, bool napi_mode)
|
||||||
|
|
||||||
if (!priv->rx_buf[desc_idx]) {
|
if (!priv->rx_buf[desc_idx]) {
|
||||||
unsigned char *buf;
|
unsigned char *buf;
|
||||||
|
dma_addr_t p;
|
||||||
|
|
||||||
if (likely(napi_mode))
|
if (likely(napi_mode))
|
||||||
buf = napi_alloc_frag(priv->rx_frag_size);
|
buf = napi_alloc_frag(priv->rx_frag_size);
|
||||||
|
@ -279,11 +280,15 @@ static int bcm6368_enetsw_refill_rx(struct net_device *dev, bool napi_mode)
|
||||||
if (unlikely(!buf))
|
if (unlikely(!buf))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
p = dma_map_single(&priv->pdev->dev, buf + NET_SKB_PAD,
|
||||||
|
priv->rx_buf_size, DMA_FROM_DEVICE);
|
||||||
|
if (unlikely(dma_mapping_error(&priv->pdev->dev, p))) {
|
||||||
|
skb_free_frag(buf);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
priv->rx_buf[desc_idx] = buf;
|
priv->rx_buf[desc_idx] = buf;
|
||||||
desc->address = dma_map_single(&priv->pdev->dev,
|
desc->address = p;
|
||||||
buf + NET_SKB_PAD,
|
|
||||||
priv->rx_buf_size,
|
|
||||||
DMA_FROM_DEVICE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
len_stat = priv->rx_buf_size << DMADESC_LENGTH_SHIFT;
|
len_stat = priv->rx_buf_size << DMADESC_LENGTH_SHIFT;
|
||||||
|
@ -563,6 +568,7 @@ bcm6368_enetsw_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||||
struct bcm6368_enetsw_desc *desc;
|
struct bcm6368_enetsw_desc *desc;
|
||||||
u32 len_stat;
|
u32 len_stat;
|
||||||
netdev_tx_t ret;
|
netdev_tx_t ret;
|
||||||
|
dma_addr_t p;
|
||||||
|
|
||||||
/* lock against tx reclaim */
|
/* lock against tx reclaim */
|
||||||
spin_lock(&priv->tx_lock);
|
spin_lock(&priv->tx_lock);
|
||||||
|
@ -597,13 +603,19 @@ bcm6368_enetsw_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||||
data = skb_put_zero(skb, needed);
|
data = skb_put_zero(skb, needed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* fill descriptor */
|
||||||
|
p = dma_map_single(&priv->pdev->dev, skb->data, skb->len,
|
||||||
|
DMA_TO_DEVICE);
|
||||||
|
if (unlikely(dma_mapping_error(&priv->pdev->dev, p))) {
|
||||||
|
dev_kfree_skb(skb);
|
||||||
|
ret = NETDEV_TX_OK;
|
||||||
|
goto out_unlock;
|
||||||
|
}
|
||||||
|
|
||||||
/* point to the next available desc */
|
/* point to the next available desc */
|
||||||
desc = &priv->tx_desc_cpu[priv->tx_curr_desc];
|
desc = &priv->tx_desc_cpu[priv->tx_curr_desc];
|
||||||
priv->tx_skb[priv->tx_curr_desc] = skb;
|
priv->tx_skb[priv->tx_curr_desc] = skb;
|
||||||
|
desc->address = p;
|
||||||
/* fill descriptor */
|
|
||||||
desc->address = dma_map_single(&priv->pdev->dev, skb->data, skb->len,
|
|
||||||
DMA_TO_DEVICE);
|
|
||||||
|
|
||||||
len_stat = (skb->len << DMADESC_LENGTH_SHIFT) & DMADESC_LENGTH_MASK;
|
len_stat = (skb->len << DMADESC_LENGTH_SHIFT) & DMADESC_LENGTH_MASK;
|
||||||
len_stat |= DMADESC_ESOP_MASK | DMADESC_APPEND_CRC |
|
len_stat |= DMADESC_ESOP_MASK | DMADESC_APPEND_CRC |
|
||||||
|
|
Loading…
Reference in a new issue