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

Commit 8cfcbe99 authored by Stephen Hemminger's avatar Stephen Hemminger Committed by Jeff Garzik
Browse files

sky2: recovery deadlock fix



Prevent deadlock in sky2 recovery logic. sky2_down calls napi_synchronize
which gets stuck if napi was already disabled.

Fix by rearranging slightly and not calling napi_disable until after
both ports are stopped. The napi_disable probably is being overly
paranoid, but it is safe now.

Signed-off-by: default avatarStephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 4c537e63
Loading
Loading
Loading
Loading
+2 −4
Original line number Original line Diff line number Diff line
@@ -2906,16 +2906,14 @@ static void sky2_restart(struct work_struct *work)
	int i, err;
	int i, err;


	rtnl_lock();
	rtnl_lock();
	sky2_write32(hw, B0_IMSK, 0);
	sky2_read32(hw, B0_IMSK);
	napi_disable(&hw->napi);

	for (i = 0; i < hw->ports; i++) {
	for (i = 0; i < hw->ports; i++) {
		dev = hw->dev[i];
		dev = hw->dev[i];
		if (netif_running(dev))
		if (netif_running(dev))
			sky2_down(dev);
			sky2_down(dev);
	}
	}


	napi_disable(&hw->napi);
	sky2_write32(hw, B0_IMSK, 0);
	sky2_reset(hw);
	sky2_reset(hw);
	sky2_write32(hw, B0_IMSK, Y2_IS_BASE);
	sky2_write32(hw, B0_IMSK, Y2_IS_BASE);
	napi_enable(&hw->napi);
	napi_enable(&hw->napi);