From: Robert Marko Date: Sun, 12 Jul 2026 19:44:07 +0000 (+0200) Subject: qualcommax: qca-edma: make RX descriptor endianness explicit X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bf70dd5fb5b3e7b14aaecdfa351f062e335a1e57;p=thirdparty%2Fopenwrt.git qualcommax: qca-edma: make RX descriptor endianness explicit RX descriptor fields use little-endian byte order. Decode the DMA address and status with the matching helpers before consuming them. This makes the byte order explicit and keeps the code portable. The conversions remain no-ops on little-endian IPQ60xx. Link: https://github.com/openwrt/openwrt/pull/24203 Signed-off-by: Robert Marko --- diff --git a/target/linux/qualcommax/files/drivers/net/ethernet/qualcomm/qca_edma.c b/target/linux/qualcommax/files/drivers/net/ethernet/qualcomm/qca_edma.c index f3dc7d7afaa..2845c88b315 100644 --- a/target/linux/qualcommax/files/drivers/net/ethernet/qualcomm/qca_edma.c +++ b/target/linux/qualcommax/files/drivers/net/ethernet/qualcomm/qca_edma.c @@ -344,12 +344,15 @@ static u32 edma_clean_rx(struct edma_priv *priv, int budget, cons = val & EDMA_RXDESC_CONS_IDX_MASK; while (cons != prod && done < budget) { - rxdesc = EDMA_RXDESC_DESC(rxdesc_ring, cons); + u32 desc_addr, desc_status; - rxph = phys_to_virt(rxdesc->buffer_addr); + rxdesc = EDMA_RXDESC_DESC(rxdesc_ring, cons); + desc_addr = le32_to_cpu(rxdesc->buffer_addr); + desc_status = le32_to_cpu(rxdesc->status); + rxph = phys_to_virt(desc_addr); page = virt_to_head_page(rxph); - pkt_len = rxdesc->status & EDMA_RXDESC_PACKET_LEN_MASK; + pkt_len = desc_status & EDMA_RXDESC_PACKET_LEN_MASK; page_pool_dma_sync_for_cpu(priv->page_pool, page, 0, EDMA_RX_PREHDR_SIZE + pkt_len); @@ -628,8 +631,11 @@ static void edma_rxdesc_drain(struct edma_priv *priv, struct edma_ring *rxdesc_r prod = val & EDMA_RXDESC_PROD_IDX_MASK; while (cons != prod) { + u32 desc_addr; + rxdesc = EDMA_RXDESC_DESC(rxdesc_ring, cons); - page = virt_to_head_page(phys_to_virt(rxdesc->buffer_addr)); + desc_addr = le32_to_cpu(rxdesc->buffer_addr); + page = virt_to_head_page(phys_to_virt(desc_addr)); page_pool_put_full_page(priv->page_pool, page, false); if (++cons == rxdesc_ring->count)