wcn36xx: don't delete invalid bss indices
authorDaniel Mack <daniel@zonque.org>
Tue, 3 Apr 2018 16:51:54 +0000 (18:51 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 10 Apr 2018 14:34:20 +0000 (17:34 +0300)
The firmware code cannot cope with requests to remove BSS indices that have
not previously been added. This primarily happens when the device is
suspended and then resumed. ieee80211_reconfig() then calls into
wcn36xx_bss_info_changed() with an empty bssid and BSS_CHANGED_BSSID set,
which subsequently leads to a firmware crash:

[   43.647928] qcom-wcnss-pil a204000.wcnss: fatal error received: halMsg.c:4964:halMsg_DelBss: Invalid BSSIndex 0
[   43.647959] remoteproc remoteproc0: crash detected in a204000.wcnss: type fatal error

To fix this, set bss_index to WCN36XX_HAL_BSS_INVALID_IDX for all bss
that have not been configured in the firmware, and don't call into the
firmware with invalid indices.

Signed-off-by: Daniel Mack <daniel@zonque.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ath/wcn36xx/main.c
drivers/net/wireless/ath/wcn36xx/smd.c

index 69d6be59d97f00a402ea3c238c6a1f561142554a..32bbd6e2fd099181cb26ab56d4c15621df63a556 100644 (file)
@@ -953,6 +953,7 @@ static int wcn36xx_add_interface(struct ieee80211_hw *hw,
 
        mutex_lock(&wcn->conf_mutex);
 
+       vif_priv->bss_index = WCN36XX_HAL_BSS_INVALID_IDX;
        list_add(&vif_priv->list, &wcn->vif_list);
        wcn36xx_smd_add_sta_self(wcn, vif);
 
index 8932af5e4d8df85e2571a3cd8909184791fdff76..5be07e40a86da7daad6ea24f6c96d20abb1d8770 100644 (file)
@@ -1446,6 +1446,10 @@ int wcn36xx_smd_delete_bss(struct wcn36xx *wcn, struct ieee80211_vif *vif)
        int ret = 0;
 
        mutex_lock(&wcn->hal_mutex);
+
+       if (vif_priv->bss_index == WCN36XX_HAL_BSS_INVALID_IDX)
+               goto out;
+
        INIT_HAL_MSG(msg_body, WCN36XX_HAL_DELETE_BSS_REQ);
 
        msg_body.bss_index = vif_priv->bss_index;
@@ -1464,6 +1468,8 @@ int wcn36xx_smd_delete_bss(struct wcn36xx *wcn, struct ieee80211_vif *vif)
                wcn36xx_err("hal_delete_bss response failed err=%d\n", ret);
                goto out;
        }
+
+       vif_priv->bss_index = WCN36XX_HAL_BSS_INVALID_IDX;
 out:
        mutex_unlock(&wcn->hal_mutex);
        return ret;