aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/wil6210/wmi.c
diff options
context:
space:
mode:
authorVladimir Kondratiev <QCA_vkondrat@QCA.qualcomm.com>2015-07-30 06:51:53 -0400
committerKalle Valo <kvalo@qca.qualcomm.com>2015-08-06 02:42:38 -0400
commit3e9191fce2d6b36a429dc046cdc1f7e8ec70465c (patch)
treeaae9397af5b1515ee04d2c93d3001dfe9d6fc175 /drivers/net/wireless/ath/wil6210/wmi.c
parent8a9d1dc5741da8575e3393de392cc1704ecd4fe7 (diff)
wil6210: wait for del_station to complete
Multiple del_station requests may be sent to the driver by the supplicant when turning down AP. This may overflow mailbox between the FW and ucode Wait till disconnect of one STA completed before sending next command. Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
Diffstat (limited to 'drivers/net/wireless/ath/wil6210/wmi.c')
-rw-r--r--drivers/net/wireless/ath/wil6210/wmi.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath/wil6210/wmi.c b/drivers/net/wireless/ath/wil6210/wmi.c
index c759759afbb2..362ce7a257e8 100644
--- a/drivers/net/wireless/ath/wil6210/wmi.c
+++ b/drivers/net/wireless/ath/wil6210/wmi.c
@@ -1129,15 +1129,42 @@ int wmi_get_temperature(struct wil6210_priv *wil, u32 *t_bb, u32 *t_rf)
1129 1129
1130int wmi_disconnect_sta(struct wil6210_priv *wil, const u8 *mac, u16 reason) 1130int wmi_disconnect_sta(struct wil6210_priv *wil, const u8 *mac, u16 reason)
1131{ 1131{
1132 int rc;
1133 u16 reason_code;
1132 struct wmi_disconnect_sta_cmd cmd = { 1134 struct wmi_disconnect_sta_cmd cmd = {
1133 .disconnect_reason = cpu_to_le16(reason), 1135 .disconnect_reason = cpu_to_le16(reason),
1134 }; 1136 };
1137 struct {
1138 struct wil6210_mbox_hdr_wmi wmi;
1139 struct wmi_disconnect_event evt;
1140 } __packed reply;
1135 1141
1136 ether_addr_copy(cmd.dst_mac, mac); 1142 ether_addr_copy(cmd.dst_mac, mac);
1137 1143
1138 wil_dbg_wmi(wil, "%s(%pM, reason %d)\n", __func__, mac, reason); 1144 wil_dbg_wmi(wil, "%s(%pM, reason %d)\n", __func__, mac, reason);
1139 1145
1140 return wmi_send(wil, WMI_DISCONNECT_STA_CMDID, &cmd, sizeof(cmd)); 1146 rc = wmi_call(wil, WMI_DISCONNECT_STA_CMDID, &cmd, sizeof(cmd),
1147 WMI_DISCONNECT_EVENTID, &reply, sizeof(reply), 1000);
1148 /* failure to disconnect in reasonable time treated as FW error */
1149 if (rc) {
1150 wil_fw_error_recovery(wil);
1151 return rc;
1152 }
1153
1154 /* call event handler manually after processing wmi_call,
1155 * to avoid deadlock - disconnect event handler acquires wil->mutex
1156 * while it is already held here
1157 */
1158 reason_code = le16_to_cpu(reply.evt.protocol_reason_status);
1159
1160 wil_dbg_wmi(wil, "Disconnect %pM reason [proto %d wmi %d]\n",
1161 reply.evt.bssid, reason_code,
1162 reply.evt.disconnect_reason);
1163
1164 wil->sinfo_gen++;
1165 wil6210_disconnect(wil, reply.evt.bssid, reason_code, true);
1166
1167 return 0;
1141} 1168}
1142 1169
1143int wmi_addba(struct wil6210_priv *wil, u8 ringid, u8 size, u16 timeout) 1170int wmi_addba(struct wil6210_priv *wil, u8 ringid, u8 size, u16 timeout)