Message ID | 38ddca4c73bb4dbf835a84133035dbfb@ti.com (mailing list archive) |
---|---|
State | RFC |
Delegated to: | Kalle Valo |
Headers | show |
* Reizer, Eyal <eyalr@ti.com> [180522 13:28]: > Actually the below patch removing the call to wlcore_fw_sleep() avoids this error. > The downside is that the wl8 firmware remains fully active during supend, so we > Would need to find the root cause why the last call allowing the wilink8 firmware > To go into ELP mode during suspend is only completing on resume and not during > Suspend enter. > > diff --git a/drivers/net/wireless/ti/wlcore/main.c > b/drivers/net/wireless/ti/wlcore/main.c > index 4c297aa..8df1ae6 100644 > --- a/drivers/net/wireless/ti/wlcore/main.c > +++ b/drivers/net/wireless/ti/wlcore/main.c > @@ -1789,7 +1789,6 @@ static int wl1271_op_suspend(struct ieee80211_hw *hw, > goto out_sleep; > > out_sleep: > - pm_runtime_put_noidle(wl->dev); > mutex_unlock(&wl->mutex); > > if (ret < 0) { > @@ -1821,15 +1820,7 @@ static int wl1271_op_suspend(struct ieee80211_hw *hw, > */ > cancel_delayed_work(&wl->tx_watchdog_work); > > - /* > - * Use an immediate call for allowing the firmware to go into power > - * save during suspend. > - * Using a workque for this last write was only hapenning on resume > - * leaving the firmware with power save disabled during suspend, > - * while consuming full power during wowlan suspend. > - */ > - wlcore_fw_sleep(wl); > - > + pm_runtime_put_noidle(wl->dev); > return 0; > } OK try replacing the pm_runtime_put_noidle() above with just pm_runtime_put_sync(). The reason why I put noidle there was the wlcore_fw_sleep() call, with that gone put_sync should do the trick. Regards, Tony
> > * Reizer, Eyal <eyalr@ti.com> [180522 13:28]: > > Actually the below patch removing the call to wlcore_fw_sleep() avoids this > error. > > The downside is that the wl8 firmware remains fully active during supend, so > we > > Would need to find the root cause why the last call allowing the wilink8 > firmware > > To go into ELP mode during suspend is only completing on resume and not > during > > Suspend enter. > > > > diff --git a/drivers/net/wireless/ti/wlcore/main.c > > b/drivers/net/wireless/ti/wlcore/main.c > > index 4c297aa..8df1ae6 100644 > > --- a/drivers/net/wireless/ti/wlcore/main.c > > +++ b/drivers/net/wireless/ti/wlcore/main.c > > @@ -1789,7 +1789,6 @@ static int wl1271_op_suspend(struct > ieee80211_hw *hw, > > goto out_sleep; > > > > out_sleep: > > - pm_runtime_put_noidle(wl->dev); > > mutex_unlock(&wl->mutex); > > > > if (ret < 0) { > > @@ -1821,15 +1820,7 @@ static int wl1271_op_suspend(struct > ieee80211_hw *hw, > > */ > > cancel_delayed_work(&wl->tx_watchdog_work); > > > > - /* > > - * Use an immediate call for allowing the firmware to go into power > > - * save during suspend. > > - * Using a workque for this last write was only hapenning on resume > > - * leaving the firmware with power save disabled during suspend, > > - * while consuming full power during wowlan suspend. > > - */ > > - wlcore_fw_sleep(wl); > > - > > + pm_runtime_put_noidle(wl->dev); > > return 0; > > } > > OK try replacing the pm_runtime_put_noidle() above with just > pm_runtime_put_sync(). The reason why I put noidle there was the > wlcore_fw_sleep() call, with that gone put_sync should do the trick. > I have tried that already. Same problem. The last call to: ret = wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_SLEEP) which allows the firmware to get into ELP state during wowlan suspend is only completing after system resume for some unknown reason... Best Regards, Eyal
* Reizer, Eyal <eyalr@ti.com> [180522 13:50]: > > > > OK try replacing the pm_runtime_put_noidle() above with just > > pm_runtime_put_sync(). The reason why I put noidle there was the > > wlcore_fw_sleep() call, with that gone put_sync should do the trick. > > > > I have tried that already. Same problem. The last call to: > ret = wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_SLEEP) > > which allows the firmware to get into ELP state during wowlan suspend is > only completing after system resume for some unknown reason... Hmm maybe try also adding wl1271_power_off(wl) after put_sync()? Regards, Tony
> > > > > > OK try replacing the pm_runtime_put_noidle() above with just > > > pm_runtime_put_sync(). The reason why I put noidle there was the > > > wlcore_fw_sleep() call, with that gone put_sync should do the trick. > > > > > > > I have tried that already. Same problem. The last call to: > > ret = wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_SLEEP) > > > > which allows the firmware to get into ELP state during wowlan suspend is > > only completing after system resume for some unknown reason... > > Hmm maybe try also adding wl1271_power_off(wl) after put_sync()? > No, we don't want to power off the chip in wowlan mode. We power it of only during standard suspend. The trick is that it stays on during suspend and can be used As a wakeup source to the host on specific packets received by The firmware over the air. BR, Eyal
* Reizer, Eyal <eyalr@ti.com> [180522 14:07]: > > > > > > > > OK try replacing the pm_runtime_put_noidle() above with just > > > > pm_runtime_put_sync(). The reason why I put noidle there was the > > > > wlcore_fw_sleep() call, with that gone put_sync should do the trick. > > > > > > > > > > I have tried that already. Same problem. The last call to: > > > ret = wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_SLEEP) > > > > > > which allows the firmware to get into ELP state during wowlan suspend is > > > only completing after system resume for some unknown reason... > > > > Hmm maybe try also adding wl1271_power_off(wl) after put_sync()? > > > > No, we don't want to power off the chip in wowlan mode. > We power it of only during standard suspend. > > The trick is that it stays on during suspend and can be used > As a wakeup source to the host on specific packets received by > The firmware over the air. Oh right, then in theory pm_runtime_put_sync() should do the here. Regards, Tony
diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c index 4c297aa..8df1ae6 100644 --- a/drivers/net/wireless/ti/wlcore/main.c +++ b/drivers/net/wireless/ti/wlcore/main.c @@ -1789,7 +1789,6 @@ static int wl1271_op_suspend(struct ieee80211_hw *hw, goto out_sleep; out_sleep: - pm_runtime_put_noidle(wl->dev); mutex_unlock(&wl->mutex); if (ret < 0) { @@ -1821,15 +1820,7 @@ static int wl1271_op_suspend(struct ieee80211_hw *hw, */ cancel_delayed_work(&wl->tx_watchdog_work); - /* - * Use an immediate call for allowing the firmware to go into power - * save during suspend. - * Using a workque for this last write was only hapenning on resume - * leaving the firmware with power save disabled during suspend, - * while consuming full power during wowlan suspend. - */ - wlcore_fw_sleep(wl); - + pm_runtime_put_noidle(wl->dev); return 0; }