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

Commit 93966b71 authored by Timur Tabi's avatar Timur Tabi Committed by David S. Miller
Browse files

net: qcom/emac: disable interrupts before calling phy_disconnect



There is a race condition that can occur if EMAC interrupts are
enabled when phy_disconnect() is called.  phy_disconnect() sets
adjust_link to NULL.  When an interrupt occurs, the ISR might
call phy_mac_interrupt(), which wakes up the workqueue function
phy_state_machine().  This function might reference adjust_link,
thereby causing a null pointer exception.

Signed-off-by: default avatarTimur Tabi <timur@codeaurora.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f0076436
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -1021,14 +1021,18 @@ void emac_mac_down(struct emac_adapter *adpt)
	napi_disable(&adpt->rx_q.napi);

	phy_stop(adpt->phydev);
	phy_disconnect(adpt->phydev);

	/* disable mac irq */
	/* Interrupts must be disabled before the PHY is disconnected, to
	 * avoid a race condition where adjust_link is null when we get
	 * an interrupt.
	 */
	writel(DIS_INT, adpt->base + EMAC_INT_STATUS);
	writel(0, adpt->base + EMAC_INT_MASK);
	synchronize_irq(adpt->irq.irq);
	free_irq(adpt->irq.irq, &adpt->irq);

	phy_disconnect(adpt->phydev);

	emac_mac_reset(adpt);

	emac_tx_q_descs_free(adpt);