]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
bnxt_en: Fix DMA unmapping of the RX buffers in XDP mode during shutdown.
authorMichael Chan <michael.chan@broadcom.com>
Tue, 28 Mar 2017 23:47:31 +0000 (19:47 -0400)
committerSomasundaram Krishnasamy <somasundaram.krishnasamy@oracle.com>
Tue, 11 Jul 2017 00:04:08 +0000 (17:04 -0700)
Orabug: 264025332632559926366387

In bnxt_free_rx_skbs(), which is called to free up all RX buffers during
shutdown, we need to unmap the page if we are running in XDP mode.

Fixes: c61fb99cae51 ("bnxt_en: Add RX page mode support.")
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3ed3a83e3f3871c57b18cef09b148e96921236ed)
Signed-off-by: Brian Maly <brian.maly@oracle.com>
Signed-off-by: Somasundaram Krishnasamy <somasundaram.krishnasamy@oracle.com>
Conflicts:
drivers/net/ethernet/broadcom/bnxt/bnxt.c

drivers/net/ethernet/broadcom/bnxt/bnxt.c

index 8c5d40f314f63fc05cc46b940d801582ef70b4be..d224dbde3c55074fdd1f6e0c4065cfabd9886fa4 100644 (file)
@@ -2010,21 +2010,26 @@ static void bnxt_free_rx_skbs(struct bnxt *bp)
 
                for (j = 0; j < max_idx; j++) {
                        struct bnxt_sw_rx_bd *rx_buf = &rxr->rx_buf_ring[j];
+                       dma_addr_t mapping = rx_buf->mapping;
                        void *data = rx_buf->data;
 
                        if (!data)
                                continue;
 
-                       dma_unmap_single_attrs(&pdev->dev, rx_buf->mapping,
-                                              bp->rx_buf_use_size, bp->rx_dir,
-                                              &attrs);
-
                        rx_buf->data = NULL;
 
-                       if (BNXT_RX_PAGE_MODE(bp))
+                       if (BNXT_RX_PAGE_MODE(bp)) {
+                               mapping -= bp->rx_dma_offset;
+                               dma_unmap_page_attrs(&pdev->dev, mapping,
+                                                    PAGE_SIZE, bp->rx_dir,
+                                                    &attrs);
                                __free_page(data);
-                       else
+                       } else {
+                               dma_unmap_single_attrs(&pdev->dev, mapping,
+                                                       bp->rx_buf_use_size,
+                                                       bp->rx_dir, &attrs);
                                kfree(data);
+                       }
                }
 
                for (j = 0; j < max_agg_idx; j++) {