> Add missing dma_rmb() in airoha_qdma_rx_process routine to make sure the > DMA read operations are completed when the NIC reports the processing on > the current descriptor is done. Moreover, add missing READ_ONCE() in > airoha_qdma_rx_process() for DMA descriptor control fields in order to > avoid any compiler reordering. > > Fixes: 23020f0493270 ("net: airoha: Introduce ethernet support for EN7581 SoC") > Signed-off-by: Lorenzo Bianconi > --- > drivers/net/ethernet/airoha/airoha_eth.c | 14 +++++++++----- > 1 file changed, 9 insertions(+), 5 deletions(-) Please drop this version, I will post v2 to add a missing READ_ONCE() for airoha_qdma_get_gdm_port(). Regards, Lorenzo > > diff --git a/drivers/net/ethernet/airoha/airoha_eth.c b/drivers/net/ethernet/airoha/airoha_eth.c > index 95ba99b89428e4cafb91ff7813e43ffeb38e6d9b..29dea8b35f64bfdcf88bc09fd711e0d8b4f7b6fa 100644 > --- a/drivers/net/ethernet/airoha/airoha_eth.c > +++ b/drivers/net/ethernet/airoha/airoha_eth.c > @@ -612,15 +612,17 @@ static int airoha_qdma_rx_process(struct airoha_queue *q, int budget) > while (done < budget) { > struct airoha_queue_entry *e = &q->entry[q->tail]; > struct airoha_qdma_desc *desc = &q->desc[q->tail]; > - u32 hash, reason, msg1 = le32_to_cpu(desc->msg1); > - struct page *page = virt_to_head_page(e->buf); > - u32 desc_ctrl = le32_to_cpu(desc->ctrl); > + u32 hash, reason, msg1, desc_ctrl; > struct airoha_gdm_port *port; > int data_len, len, p; > + struct page *page; > > + desc_ctrl = le32_to_cpu(READ_ONCE(desc->ctrl)); > if (!(desc_ctrl & QDMA_DESC_DONE_MASK)) > break; > > + dma_rmb(); > + > q->tail = (q->tail + 1) % q->ndesc; > q->queued--; > > @@ -637,6 +639,7 @@ static int airoha_qdma_rx_process(struct airoha_queue *q, int budget) > if (p < 0 || !eth->ports[p]) > goto free_frag; > > + page = virt_to_head_page(e->buf); > port = eth->ports[p]; > if (!q->skb) { /* first buffer */ > q->skb = napi_build_skb(e->buf, q->buf_size); > @@ -670,8 +673,8 @@ static int airoha_qdma_rx_process(struct airoha_queue *q, int budget) > * DMA descriptor. Report DSA tag to the DSA stack > * via skb dst info. > */ > - u32 sptag = FIELD_GET(QDMA_ETH_RXMSG_SPTAG, > - le32_to_cpu(desc->msg0)); > + u32 msg0 = le32_to_cpu(READ_ONCE(desc->msg0)); > + u32 sptag = FIELD_GET(QDMA_ETH_RXMSG_SPTAG, msg0); > > if (sptag < ARRAY_SIZE(port->dsa_meta) && > port->dsa_meta[sptag]) > @@ -679,6 +682,7 @@ static int airoha_qdma_rx_process(struct airoha_queue *q, int budget) > &port->dsa_meta[sptag]->dst); > } > > + msg1 = le32_to_cpu(READ_ONCE(desc->msg1)); > hash = FIELD_GET(AIROHA_RXD4_FOE_ENTRY, msg1); > if (hash != AIROHA_RXD4_FOE_ENTRY) > skb_set_hash(q->skb, jhash_1word(hash, 0), > > --- > base-commit: ec7067e661193403a7a00980bda8612db5954142 > change-id: 20260402-airoha_qdma_rx_process-fix-reordering-722308255b65 > > Best regards, > -- > Lorenzo Bianconi >