Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

wcn36xx: del BA session on TX stop

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

authored by

Loic Poulain and committed by
Kalle Valo
84da2a84 4b965be5

+5 -4
+2 -1
drivers/net/wireless/ath/wcn36xx/main.c
··· 1140 1140 session); 1141 1141 break; 1142 1142 case IEEE80211_AMPDU_RX_STOP: 1143 - wcn36xx_smd_del_ba(wcn, tid, get_sta_index(vif, sta_priv)); 1143 + wcn36xx_smd_del_ba(wcn, tid, 0, get_sta_index(vif, sta_priv)); 1144 1144 break; 1145 1145 case IEEE80211_AMPDU_TX_START: 1146 1146 spin_lock_bh(&sta_priv->ampdu_lock); ··· 1164 1164 sta_priv->ampdu_state[tid] = WCN36XX_AMPDU_NONE; 1165 1165 spin_unlock_bh(&sta_priv->ampdu_lock); 1166 1166 1167 + wcn36xx_smd_del_ba(wcn, tid, 1, get_sta_index(vif, sta_priv)); 1167 1168 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid); 1168 1169 break; 1169 1170 default:
+2 -2
drivers/net/wireless/ath/wcn36xx/smd.c
··· 2466 2466 return ret; 2467 2467 } 2468 2468 2469 - int wcn36xx_smd_del_ba(struct wcn36xx *wcn, u16 tid, u8 sta_index) 2469 + int wcn36xx_smd_del_ba(struct wcn36xx *wcn, u16 tid, u8 direction, u8 sta_index) 2470 2470 { 2471 2471 struct wcn36xx_hal_del_ba_req_msg msg_body; 2472 2472 int ret; ··· 2476 2476 2477 2477 msg_body.sta_index = sta_index; 2478 2478 msg_body.tid = tid; 2479 - msg_body.direction = 0; 2479 + msg_body.direction = direction; 2480 2480 PREPARE_HAL_BUF(wcn->hal_buf, msg_body); 2481 2481 2482 2482 ret = wcn36xx_smd_send_and_wait(wcn, msg_body.header.len);
+1 -1
drivers/net/wireless/ath/wcn36xx/smd.h
··· 135 135 u8 direction, 136 136 u8 sta_index); 137 137 int wcn36xx_smd_add_ba(struct wcn36xx *wcn, u8 session_id); 138 - int wcn36xx_smd_del_ba(struct wcn36xx *wcn, u16 tid, u8 sta_index); 138 + int wcn36xx_smd_del_ba(struct wcn36xx *wcn, u16 tid, u8 direction, u8 sta_index); 139 139 int wcn36xx_smd_trigger_ba(struct wcn36xx *wcn, u8 sta_index, u16 tid, u8 session_id); 140 140 141 141 int wcn36xx_smd_update_cfg(struct wcn36xx *wcn, u32 cfg_id, u32 value);