]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: hibmcge: move dma_rmb() after dma_sync_single_for_cpu() in RX path
authorJijie Shao <shaojijie@huawei.com>
Mon, 25 May 2026 14:45:25 +0000 (22:45 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 28 May 2026 10:59:36 +0000 (12:59 +0200)
The dma_rmb() barrier was placed before dma_sync_single_for_cpu(), which
is incorrect. DMA sync must complete first to make the buffer accessible
to the CPU, then the rmb barrier ensures subsequent descriptor reads
observe the latest data written by the hardware.

Reorder the operations so dma_sync_single_for_cpu() is called before
dma_rmb() to guarantee the driver reads consistent data from the DMA
buffer.

Fixes: f72e25594061 ("net: hibmcge: Implement rx_poll function to receive packets")
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
Link: https://patch.msgid.link/20260525144525.94884-3-shaojijie@huawei.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/hisilicon/hibmcge/hbg_txrx.c

index a4ea92c31c2feafc779175e9f01967c3cf28025d..0ae314994676930bb79aa9a0855a5bab0b170d09 100644 (file)
@@ -452,12 +452,12 @@ static bool hbg_sync_data_from_hw(struct hbg_priv *priv,
 {
        struct hbg_rx_desc *rx_desc;
 
-       /* make sure HW write desc complete */
-       dma_rmb();
-
        dma_sync_single_for_cpu(&priv->pdev->dev, buffer->page_dma,
                                buffer->page_size, DMA_FROM_DEVICE);
 
+       /* make sure HW write desc complete */
+       dma_rmb();
+
        rx_desc = (struct hbg_rx_desc *)buffer->page_addr;
        return FIELD_GET(HBG_RX_DESC_W2_PKT_LEN_M, rx_desc->word2) != 0;
 }