qcacld-3.0: Limit the wait for first CSA beacon TX completion

During channel switch in AP, Driver send beacon with CSA count
and wait for first beacon tx complete to initiate the host timer
every beacon interval to send the beacon template with updated CSA
count till CSA count become 0 and then do the vdev restart.

If driver doesn't get first beacon tx complete, the state machine
get stuck waiting for CSA to complete and can lead to functional
and stability issues.

So wait maximum for MAX_WAIT_FOR_BCN_TX_COMPLETE time for first
beacon tx complete and if not received, start the timer for every
beacon interval to send the beacon template with updated CSA count.

Change-Id: I90fab62d0851144906a7e7bd56285e64729c568c
CRs-Fixed: 2423079
This commit is contained in:
Abhishek Singh 2019-03-19 17:43:43 +05:30 committed by nshrivas
parent b492bae0b3
commit 8c54e38f56
3 changed files with 24 additions and 0 deletions

View File

@ -5571,6 +5571,7 @@ static void lim_process_sme_dfs_csa_ie_request(struct mac_context *mac_ctx,
uint8_t session_id;
tLimWiderBWChannelSwitchInfo *wider_bw_ch_switch;
enum offset_t ch_offset;
QDF_STATUS status;
if (!msg_buf) {
pe_err("Buffer is Pointing to NULL");
@ -5673,6 +5674,24 @@ skip_vht:
/* Send CSA IE request from here */
lim_send_dfs_chan_sw_ie_update(mac_ctx, session_entry);
/*
* Wait for MAX_WAIT_FOR_BCN_TX_COMPLETE ms for tx complete for beacon.
* If tx complete for beacon is received before this timer expire,
* stop this timer and then this will be restarted for every beacon
* interval until switchCount become 0 and bcn template with new
* switchCount will be sent to firmware.
* OR
* If no tx complete for beacon is recived till this timer expire
* this will be restarted for every beacon interval until switchCount
* become 0 and bcn template with new switchCount will be sent to
* firmware.
*/
pe_debug("start ap_ecsa_timer for %d ms", MAX_WAIT_FOR_BCN_TX_COMPLETE);
status = qdf_mc_timer_start(&session_entry->ap_ecsa_timer,
MAX_WAIT_FOR_BCN_TX_COMPLETE);
if (QDF_IS_STATUS_ERROR(status))
pe_err("cannot start ap_ecsa_timer");
if (dfs_csa_ie_req->ch_params.ch_width == CH_WIDTH_80MHZ)
ch_offset = BW80;
else

View File

@ -7787,6 +7787,9 @@ void lim_process_ap_ecsa_timeout(void *data)
return;
}
/* Stop the timer if already running */
qdf_mc_timer_stop(&session->ap_ecsa_timer);
if (session->gLimChannelSwitch.switchCount) {
/* Decrement the beacon switch count */
session->gLimChannelSwitch.switchCount--;

View File

@ -101,6 +101,8 @@ typedef enum {
/* To check if HT 20mhz detection bit set */
#define OBSS_DETECTION_IS_HT_20MHZ(_m) ((_m) & OBSS_DETECTION_HT_20MHZ_BIT_MASK)
#define MAX_WAIT_FOR_BCN_TX_COMPLETE 4000
#ifdef WLAN_FEATURE_11W
typedef union uPmfSaQueryTimerId {
struct {