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:
		 Sieng-Piaw Liew
					Sieng-Piaw Liew
				
			
				
					committed by
					
						 Álvaro Fernández Rojas
						Álvaro Fernández Rojas
					
				
			
			
				
	
			
			
			 Álvaro Fernández Rojas
						Álvaro Fernández Rojas
					
				
			
						parent
						
							a6a54135ef
						
					
				
				
					commit
					65ebe31130
				
			| @@ -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 | | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user