]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
qualcommax: qca-edma: make RX descriptor endianness explicit
authorRobert Marko <robimarko@gmail.com>
Sun, 12 Jul 2026 19:44:07 +0000 (21:44 +0200)
committerRobert Marko <robimarko@gmail.com>
Mon, 13 Jul 2026 10:34:33 +0000 (12:34 +0200)
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 <robimarko@gmail.com>
target/linux/qualcommax/files/drivers/net/ethernet/qualcomm/qca_edma.c

index f3dc7d7afaafbd8496a5392bd54413b9ac3b318e..2845c88b315fb347ddcae461fbde90d98486d1ce 100644 (file)
@@ -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)