> From: Ivan Vecera [mailto:ivec...@redhat.com]
> Sent: Wednesday, September 16, 2015 6:28 AM
>
> Check for DMA mapping errors, recover from them and register them in
> ethtool stats like other errors.
Acked-by: Rasesh Mody
Thanks!
Rasesh
> Cc: Rasesh Mody
> Signed-off-by: Ivan Vecera
> ---
> drivers/net/ethernet/brocade/bna/bna_tx_rx.c| 2 ++
> drivers/net/ethernet/brocade/bna/bna_types.h| 1 +
> drivers/net/ethernet/brocade/bna/bnad.c | 29
> -
> drivers/net/ethernet/brocade/bna/bnad.h | 2 ++
> drivers/net/ethernet/brocade/bna/bnad_ethtool.c | 4
> 5 files changed, 37 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/brocade/bna/bna_tx_rx.c
> b/drivers/net/ethernet/brocade/bna/bna_tx_rx.c
> index 5d0753c..04b0d16 100644
> --- a/drivers/net/ethernet/brocade/bna/bna_tx_rx.c
> +++ b/drivers/net/ethernet/brocade/bna/bna_tx_rx.c
> @@ -2400,6 +2400,7 @@ bna_rx_create(struct bna *bna, struct bnad *bnad,
> q0->rcb->id = 0;
> q0->rx_packets = q0->rx_bytes = 0;
> q0->rx_packets_with_error = q0->rxbuf_alloc_failed = 0;
> + q0->rxbuf_map_failed = 0;
>
> bna_rxq_qpt_setup(q0, rxp, dpage_count, PAGE_SIZE,
> &dqpt_mem[i], &dsqpt_mem[i], &dpage_mem[i]);
> @@ -2428,6 +2429,7 @@ bna_rx_create(struct bna *bna, struct bnad *bnad,
> : rx_cfg->q1_buf_size;
> q1->rx_packets = q1->rx_bytes = 0;
> q1->rx_packets_with_error = q1->rxbuf_alloc_failed
> = 0;
> + q1->rxbuf_map_failed = 0;
>
> bna_rxq_qpt_setup(q1, rxp, hpage_count,
> PAGE_SIZE,
> &hqpt_mem[i], &hsqpt_mem[i],
> diff --git a/drivers/net/ethernet/brocade/bna/bna_types.h
> b/drivers/net/ethernet/brocade/bna/bna_types.h
> index e0e797f..c438d03 100644
> --- a/drivers/net/ethernet/brocade/bna/bna_types.h
> +++ b/drivers/net/ethernet/brocade/bna/bna_types.h
> @@ -587,6 +587,7 @@ struct bna_rxq {
> u64 rx_bytes;
> u64 rx_packets_with_error;
> u64 rxbuf_alloc_failed;
> + u64 rxbuf_map_failed;
> };
>
> /* RxQ pair */
> diff --git a/drivers/net/ethernet/brocade/bna/bnad.c
> b/drivers/net/ethernet/brocade/bna/bnad.c
> index 506047c..21a0cfc 100644
> --- a/drivers/net/ethernet/brocade/bna/bnad.c
> +++ b/drivers/net/ethernet/brocade/bna/bnad.c
> @@ -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_a