static int wl1271_cmd_wait_for_event(struct wl1271 *wl, u32 mask) { int ret; ret = wl1271_cmd_wait_for_event_or_timeout(wl, mask); if (ret != 0) { wl12xx_queue_recovery_work(wl); return ret; } return 0; }
/* use this function to stop ibss as well */ int wl12xx_cmd_role_stop_sta(struct wl1271 *wl, struct wl12xx_vif *wlvif) { struct wl12xx_cmd_role_stop *cmd; int ret; bool timeout = false; if (WARN_ON(wlvif->sta.hlid == WL12XX_INVALID_LINK_ID)) return -EINVAL; cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); if (!cmd) { ret = -ENOMEM; goto out; } wl1271_debug(DEBUG_CMD, "cmd role stop sta %d", wlvif->role_id); cmd->role_id = wlvif->role_id; cmd->disc_type = DISCONNECT_IMMEDIATE; cmd->reason = cpu_to_le16(WLAN_REASON_UNSPECIFIED); ret = wl1271_cmd_send(wl, CMD_ROLE_STOP, cmd, sizeof(*cmd), 0); if (ret < 0) { wl1271_error("failed to initiate cmd role stop sta"); 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); out_free: kfree(cmd); out: return ret; }