Skip to content

Commit 4b91cb6

Browse files
LorenzoBianconiPaolo Abeni
authored andcommitted
net: airoha: Add size check for TX NAPIs in airoha_qdma_cleanup()
If airoha_qdma_init routine fails before airoha_qdma_tx_irq_init() runs successfully for all TX NAPIs, airoha_qdma_cleanup() will unconditionally runs netif_napi_del() on TX NAPIs, triggering a NULL pointer dereference. Fix the issue relying on q_tx_irq size value to check if the TX NAPIs is properly initialized in airoha_qdma_cleanup(). Moreover, run netif_napi_add_tx() just if irq_q queue is properly allocated. Fixes: 23020f0 ("net: airoha: Introduce ethernet support for EN7581 SoC") Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Link: https://patch.msgid.link/20260420-airoha_qdma_init_rx_queue-fix-v2-2-d99347e5c18d@kernel.org Signed-off-by: Paolo Abeni <pabeni@redhat.com>
1 parent 3790509 commit 4b91cb6

1 file changed

Lines changed: 8 additions & 3 deletions

File tree

drivers/net/ethernet/airoha/airoha_eth.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,8 +1020,6 @@ static int airoha_qdma_tx_irq_init(struct airoha_tx_irq_queue *irq_q,
10201020
struct airoha_eth *eth = qdma->eth;
10211021
dma_addr_t dma_addr;
10221022

1023-
netif_napi_add_tx(eth->napi_dev, &irq_q->napi,
1024-
airoha_qdma_tx_napi_poll);
10251023
irq_q->q = dmam_alloc_coherent(eth->dev, size * sizeof(u32),
10261024
&dma_addr, GFP_KERNEL);
10271025
if (!irq_q->q)
@@ -1031,6 +1029,9 @@ static int airoha_qdma_tx_irq_init(struct airoha_tx_irq_queue *irq_q,
10311029
irq_q->size = size;
10321030
irq_q->qdma = qdma;
10331031

1032+
netif_napi_add_tx(eth->napi_dev, &irq_q->napi,
1033+
airoha_qdma_tx_napi_poll);
1034+
10341035
airoha_qdma_wr(qdma, REG_TX_IRQ_BASE(id), dma_addr);
10351036
airoha_qdma_rmw(qdma, REG_TX_IRQ_CFG(id), TX_IRQ_DEPTH_MASK,
10361037
FIELD_PREP(TX_IRQ_DEPTH_MASK, size));
@@ -1450,8 +1451,12 @@ static void airoha_qdma_cleanup(struct airoha_qdma *qdma)
14501451
}
14511452
}
14521453

1453-
for (i = 0; i < ARRAY_SIZE(qdma->q_tx_irq); i++)
1454+
for (i = 0; i < ARRAY_SIZE(qdma->q_tx_irq); i++) {
1455+
if (!qdma->q_tx_irq[i].size)
1456+
continue;
1457+
14541458
netif_napi_del(&qdma->q_tx_irq[i].napi);
1459+
}
14551460

14561461
for (i = 0; i < ARRAY_SIZE(qdma->q_tx); i++) {
14571462
if (!qdma->q_tx[i].ndesc)

0 commit comments

Comments
 (0)