From: Birger Koblitz Date: Sat, 1 Jan 2022 13:22:41 +0000 (+0100) Subject: realtek: Fix Ethernet driver IRQ service routine for SMP X-Git-Url: http://git.openwrt.org/?a=commitdiff_plain;h=1b1f05f6826e35eefbf74a68ee313f9f2cc29b5d;p=openwrt%2Fstaging%2Fldir.git realtek: Fix Ethernet driver IRQ service routine for SMP Do not lock the register structure in IRQ context. It is not necessary and leads to lockups under SMP load. Signed-off-by: Birger Koblitz --- diff --git a/target/linux/realtek/files-5.10/drivers/net/ethernet/rtl838x_eth.c b/target/linux/realtek/files-5.10/drivers/net/ethernet/rtl838x_eth.c index 9e5dfe9640..39d28ae896 100644 --- a/target/linux/realtek/files-5.10/drivers/net/ethernet/rtl838x_eth.c +++ b/target/linux/realtek/files-5.10/drivers/net/ethernet/rtl838x_eth.c @@ -331,7 +331,6 @@ bool rtl931x_decode_tag(struct p_hdr *h, struct dsa_tag *t) /* * Discard the RX ring-buffers, called as part of the net-ISR * when the buffer runs over - * Caller needs to hold priv->lock */ static void rtl838x_rb_cleanup(struct rtl838x_eth_priv *priv, int status) { @@ -439,7 +438,6 @@ static irqreturn_t rtl83xx_net_irq(int irq, void *dev_id) pr_debug("IRQ: %08x\n", status); - spin_lock(&priv->lock); /* Ignore TX interrupt */ if ((status & 0xf0000)) { /* Clear ISR */ @@ -482,7 +480,6 @@ static irqreturn_t rtl83xx_net_irq(int irq, void *dev_id) rtl839x_l2_notification_handler(priv); } - spin_unlock(&priv->lock); return IRQ_HANDLED; } @@ -497,7 +494,6 @@ static irqreturn_t rtl93xx_net_irq(int irq, void *dev_id) pr_debug("In %s, status_tx: %08x, status_rx: %08x, status_rx_r: %08x\n", __func__, status_tx, status_rx, status_rx_r); - spin_lock(&priv->lock); /* Ignore TX interrupt */ if (status_tx) { @@ -528,7 +524,6 @@ static irqreturn_t rtl93xx_net_irq(int irq, void *dev_id) rtl838x_rb_cleanup(priv, status_rx_r); } - spin_unlock(&priv->lock); return IRQ_HANDLED; }