]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
realtek: eth: provide helper for irq reenabling
authorMarkus Stockhausen <markus.stockhausen@gmx.de>
Mon, 23 Feb 2026 17:44:16 +0000 (18:44 +0100)
committerRobert Marko <robimarko@gmail.com>
Fri, 27 Feb 2026 17:24:25 +0000 (18:24 +0100)
Once again there is a family_id check. This time around the irq
reactivation in the receive path. For cleanup and better readability
add a helper directly besides its already existing counterpart
rteth_confirm_and_disable_irqs(). With that drop unneeded defines.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22156
Signed-off-by: Robert Marko <robimarko@gmail.com>
target/linux/realtek/files-6.12/drivers/net/ethernet/rtl838x_eth.c
target/linux/realtek/files-6.12/drivers/net/ethernet/rtl838x_eth.h

index 6b83163fb4a32c4038e39ab2b52074e48802d7fd..1e43cefbff4564ede02b1739dc610a9700e691a7 100644 (file)
@@ -194,6 +194,17 @@ struct rteth_ctrl {
        struct rteth_tx         *tx_data;
 };
 
+static inline void rteth_reenable_irq(struct rteth_ctrl *ctrl, int ring)
+{
+       u32 shift = ctrl->r->rx_rings % 32;
+       u32 reg = ctrl->r->rx_rings / 32;
+       unsigned long flags;
+
+       spin_lock_irqsave(&ctrl->lock, flags);
+       sw_w32_mask(0, BIT(ring + shift), ctrl->r->dma_if_intr_msk + reg * 4);
+       spin_unlock_irqrestore(&ctrl->lock, flags);
+}
+
 static inline void rteth_confirm_and_disable_irqs(struct rteth_ctrl *ctrl,
                                                  unsigned long *rings, bool *l2)
 {
@@ -1075,7 +1086,6 @@ static int rtl838x_poll_rx(struct napi_struct *napi, int budget)
 {
        struct rtl838x_rx_q *rx_q = container_of(napi, struct rtl838x_rx_q, napi);
        struct rteth_ctrl *ctrl = rx_q->ctrl;
-       unsigned long flags;
        int ring = rx_q->id;
        int work_done = 0;
 
@@ -1087,15 +1097,8 @@ static int rtl838x_poll_rx(struct napi_struct *napi, int budget)
                work_done += work;
        }
 
-       if (work_done < budget && napi_complete_done(napi, work_done)) {
-               /* Re-enable rx interrupts */
-               spin_lock_irqsave(&ctrl->lock, flags);
-               if (ctrl->r->family_id == RTL9300_FAMILY_ID || ctrl->r->family_id == RTL9310_FAMILY_ID)
-                       sw_w32_mask(0, RTL93XX_DMA_IF_INTR_RX_MASK(ring), ctrl->r->dma_if_intr_rx_done_msk);
-               else
-                       sw_w32_mask(0, RTL83XX_DMA_IF_INTR_RX_MASK(ring), ctrl->r->dma_if_intr_msk);
-               spin_unlock_irqrestore(&ctrl->lock, flags);
-       }
+       if (work_done < budget && napi_complete_done(napi, work_done))
+               rteth_reenable_irq(ctrl, ring);
 
        return work_done;
 }
index ce8ad5add8dd0124a0b35c7108adb304a6fdf880..32656fade2a3851d716b7651d76771d85ed83bf2 100644 (file)
 #define RTL931X_L2_NTFY_IF_INTR_STS            (0x09E8)
 
 #define RTL839X_DMA_IF_INTR_NOTIFY_MASK                GENMASK(22, 20)
-#define RTL83XX_DMA_IF_INTR_RX_DONE_MASK       GENMASK(15, 8)
-#define RTL83XX_DMA_IF_INTR_RX_RUN_OUT_MASK    GENMASK(7, 0)
-#define RTL83XX_DMA_IF_INTR_RX_MASK(ring)      (BIT(ring + 8))
-#define RTL93XX_DMA_IF_INTR_RX_MASK(ring)      (BIT(ring))
 
 /* MAC address settings */
 #define RTL838X_MAC                            (0xa9ec)