wcn36xx: del BA session on TX stop
authorLoic Poulain <loic.poulain@linaro.org>
Mon, 8 Feb 2021 11:32:11 +0000 (13:32 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 9 Feb 2021 07:23:38 +0000 (09:23 +0200)
Deleting BA session was not correcly performed, causing communication
issues with APs that dynamically stop/start new BA sessions.

Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/1611328304-1010-1-git-send-email-loic.poulain@linaro.org
drivers/net/wireless/ath/wcn36xx/main.c
drivers/net/wireless/ath/wcn36xx/smd.c
drivers/net/wireless/ath/wcn36xx/smd.h

index 5867bd9..afb4877 100644 (file)
@@ -1140,7 +1140,7 @@ static int wcn36xx_ampdu_action(struct ieee80211_hw *hw,
                                       session);
                break;
        case IEEE80211_AMPDU_RX_STOP:
-               wcn36xx_smd_del_ba(wcn, tid, get_sta_index(vif, sta_priv));
+               wcn36xx_smd_del_ba(wcn, tid, 0, get_sta_index(vif, sta_priv));
                break;
        case IEEE80211_AMPDU_TX_START:
                spin_lock_bh(&sta_priv->ampdu_lock);
@@ -1164,6 +1164,7 @@ static int wcn36xx_ampdu_action(struct ieee80211_hw *hw,
                sta_priv->ampdu_state[tid] = WCN36XX_AMPDU_NONE;
                spin_unlock_bh(&sta_priv->ampdu_lock);
 
+               wcn36xx_smd_del_ba(wcn, tid, 1, get_sta_index(vif, sta_priv));
                ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
                break;
        default:
index 28d3ee3..d0c3a15 100644 (file)
@@ -2466,7 +2466,7 @@ out:
        return ret;
 }
 
-int wcn36xx_smd_del_ba(struct wcn36xx *wcn, u16 tid, u8 sta_index)
+int wcn36xx_smd_del_ba(struct wcn36xx *wcn, u16 tid, u8 direction, u8 sta_index)
 {
        struct wcn36xx_hal_del_ba_req_msg msg_body;
        int ret;
@@ -2476,7 +2476,7 @@ int wcn36xx_smd_del_ba(struct wcn36xx *wcn, u16 tid, u8 sta_index)
 
        msg_body.sta_index = sta_index;
        msg_body.tid = tid;
-       msg_body.direction = 0;
+       msg_body.direction = direction;
        PREPARE_HAL_BUF(wcn->hal_buf, msg_body);
 
        ret = wcn36xx_smd_send_and_wait(wcn, msg_body.header.len);
index b1d8083..4628605 100644 (file)
@@ -135,7 +135,7 @@ int wcn36xx_smd_add_ba_session(struct wcn36xx *wcn,
                u8 direction,
                u8 sta_index);
 int wcn36xx_smd_add_ba(struct wcn36xx *wcn, u8 session_id);
-int wcn36xx_smd_del_ba(struct wcn36xx *wcn, u16 tid, u8 sta_index);
+int wcn36xx_smd_del_ba(struct wcn36xx *wcn, u16 tid, u8 direction, u8 sta_index);
 int wcn36xx_smd_trigger_ba(struct wcn36xx *wcn, u8 sta_index, u16 tid, u8 session_id);
 
 int wcn36xx_smd_update_cfg(struct wcn36xx *wcn, u32 cfg_id, u32 value);