Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a8184003 authored by Rabin Vincent's avatar Rabin Vincent Committed by David S. Miller
Browse files

dwc_eth_qos: fix interrupt enable race



We currently enable interrupts before we enable NAPI. If an RX interrupt
hits before we enabled NAPI then the NAPI callback is never called and
we leave the hardware with RX interrupts disabled, which of course leads
us to never handling received packets.  Fix this by moving the interrupt
enable to after we've enable NAPI and the reclaim tasklet.

Fixes: cd5e4123 ("dwc_eth_qos: do phy_start before resetting hardware")
Signed-off-by: default avatarRabin Vincent <rabinv@axis.com>
Signed-off-by: default avatarLars Persson <larper@axis.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 53080fe9
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -1622,13 +1622,7 @@ static void dwceqos_init_hw(struct net_local *lp)
		DWCEQOS_MMC_CTRL_RSTONRD);
	dwceqos_enable_mmc_interrupt(lp);

	/* Enable Interrupts */
	dwceqos_write(lp, REG_DWCEQOS_DMA_CH0_IE,
		      DWCEQOS_DMA_CH0_IE_NIE |
		      DWCEQOS_DMA_CH0_IE_RIE | DWCEQOS_DMA_CH0_IE_TIE |
		      DWCEQOS_DMA_CH0_IE_AIE |
		      DWCEQOS_DMA_CH0_IE_FBEE);

	dwceqos_write(lp, REG_DWCEQOS_DMA_CH0_IE, 0);
	dwceqos_write(lp, REG_DWCEQOS_MAC_IE, 0);

	dwceqos_write(lp, REG_DWCEQOS_MAC_CFG, DWCEQOS_MAC_CFG_IPC |
@@ -1905,6 +1899,15 @@ static int dwceqos_open(struct net_device *ndev)
	netif_start_queue(ndev);
	tasklet_enable(&lp->tx_bdreclaim_tasklet);

	/* Enable Interrupts -- do this only after we enable NAPI and the
	 * tasklet.
	 */
	dwceqos_write(lp, REG_DWCEQOS_DMA_CH0_IE,
		      DWCEQOS_DMA_CH0_IE_NIE |
		      DWCEQOS_DMA_CH0_IE_RIE | DWCEQOS_DMA_CH0_IE_TIE |
		      DWCEQOS_DMA_CH0_IE_AIE |
		      DWCEQOS_DMA_CH0_IE_FBEE);

	return 0;
}