wlcore: wait for command completion event when sending CMD_ROLE_STOP
We need to wait for the command completion event when we send the CMD_ROLE_STOP event otherwise we may try to send CMD_ROLE_START too soon and get out-of-sync with the firmware. In some cases, the firmware may not send the event, so we wait for the event or for the timeout, whichever comes first. This patch is based on an earlier version by Eliad. Cc: Eliad Peller <eliad@wizery.com> Signed-off-by: Luciano Coelho <coelho@ti.com>
This commit is contained in:
parent
cc31a3c9ae
commit
5285eb5442
|
@ -497,6 +497,7 @@ int wl12xx_cmd_role_stop_sta(struct wl1271 *wl, struct wl12xx_vif *wlvif)
|
||||||
{
|
{
|
||||||
struct wl12xx_cmd_role_stop *cmd;
|
struct wl12xx_cmd_role_stop *cmd;
|
||||||
int ret;
|
int ret;
|
||||||
|
bool timeout = false;
|
||||||
|
|
||||||
if (WARN_ON(wlvif->sta.hlid == WL12XX_INVALID_LINK_ID))
|
if (WARN_ON(wlvif->sta.hlid == WL12XX_INVALID_LINK_ID))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -519,6 +520,17 @@ int wl12xx_cmd_role_stop_sta(struct wl1271 *wl, struct wl12xx_vif *wlvif)
|
||||||
goto out_free;
|
goto out_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sometimes the firmware doesn't send this event, so we just
|
||||||
|
* time out without failing. Queue recovery for other
|
||||||
|
* failures.
|
||||||
|
*/
|
||||||
|
ret = wl1271_cmd_wait_for_event_or_timeout(wl,
|
||||||
|
ROLE_STOP_COMPLETE_EVENT_ID,
|
||||||
|
&timeout);
|
||||||
|
if (ret)
|
||||||
|
wl12xx_queue_recovery_work(wl);
|
||||||
|
|
||||||
wl12xx_free_link(wl, wlvif, &wlvif->sta.hlid);
|
wl12xx_free_link(wl, wlvif, &wlvif->sta.hlid);
|
||||||
|
|
||||||
out_free:
|
out_free:
|
||||||
|
|
Loading…
Reference in New Issue