|
|
@@ -399,7 +399,13 @@ bnad_rxq_refill_page(struct bnad *bnad, struct bna_rcb *rcb, u32 nalloc)
|
|
|
}
|
|
|
|
|
|
dma_addr = dma_map_page(&bnad->pcidev->dev, page, page_offset,
|
|
|
- unmap_q->map_size, DMA_FROM_DEVICE);
|
|
|
+ unmap_q->map_size, DMA_FROM_DEVICE);
|
|
|
+ if (dma_mapping_error(&bnad->pcidev->dev, dma_addr)) {
|
|
|
+ put_page(page);
|
|
|
+ BNAD_UPDATE_CTR(bnad, rxbuf_map_failed);
|
|
|
+ rcb->rxq->rxbuf_map_failed++;
|
|
|
+ goto finishing;
|
|
|
+ }
|
|
|
|
|
|
unmap->page = page;
|
|
|
unmap->page_offset = page_offset;
|
|
|
@@ -454,8 +460,15 @@ bnad_rxq_refill_skb(struct bnad *bnad, struct bna_rcb *rcb, u32 nalloc)
|
|
|
rcb->rxq->rxbuf_alloc_failed++;
|
|
|
goto finishing;
|
|
|
}
|
|
|
+
|
|
|
dma_addr = dma_map_single(&bnad->pcidev->dev, skb->data,
|
|
|
buff_sz, DMA_FROM_DEVICE);
|
|
|
+ if (dma_mapping_error(&bnad->pcidev->dev, dma_addr)) {
|
|
|
+ dev_kfree_skb_any(skb);
|
|
|
+ BNAD_UPDATE_CTR(bnad, rxbuf_map_failed);
|
|
|
+ rcb->rxq->rxbuf_map_failed++;
|
|
|
+ goto finishing;
|
|
|
+ }
|
|
|
|
|
|
unmap->skb = skb;
|
|
|
dma_unmap_addr_set(&unmap->vector, dma_addr, dma_addr);
|
|
|
@@ -3025,6 +3038,11 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|
|
unmap = head_unmap;
|
|
|
dma_addr = dma_map_single(&bnad->pcidev->dev, skb->data,
|
|
|
len, DMA_TO_DEVICE);
|
|
|
+ if (dma_mapping_error(&bnad->pcidev->dev, dma_addr)) {
|
|
|
+ dev_kfree_skb_any(skb);
|
|
|
+ BNAD_UPDATE_CTR(bnad, tx_skb_map_failed);
|
|
|
+ return NETDEV_TX_OK;
|
|
|
+ }
|
|
|
BNA_SET_DMA_ADDR(dma_addr, &txqent->vector[0].host_addr);
|
|
|
txqent->vector[0].length = htons(len);
|
|
|
dma_unmap_addr_set(&unmap->vectors[0], dma_addr, dma_addr);
|
|
|
@@ -3056,6 +3074,15 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|
|
|
|
|
dma_addr = skb_frag_dma_map(&bnad->pcidev->dev, frag,
|
|
|
0, size, DMA_TO_DEVICE);
|
|
|
+ if (dma_mapping_error(&bnad->pcidev->dev, dma_addr)) {
|
|
|
+ /* Undo the changes starting at tcb->producer_index */
|
|
|
+ bnad_tx_buff_unmap(bnad, unmap_q, q_depth,
|
|
|
+ tcb->producer_index);
|
|
|
+ dev_kfree_skb_any(skb);
|
|
|
+ BNAD_UPDATE_CTR(bnad, tx_skb_map_failed);
|
|
|
+ return NETDEV_TX_OK;
|
|
|
+ }
|
|
|
+
|
|
|
dma_unmap_len_set(&unmap->vectors[vect_id], dma_len, size);
|
|
|
BNA_SET_DMA_ADDR(dma_addr, &txqent->vector[vect_id].host_addr);
|
|
|
txqent->vector[vect_id].length = htons(size);
|