qcacld-3.0: Refactor channel switch
When channel switch, don't use tpSwitchChannelParams, fill wma_vdev_start_req directly in LIM lim_send_switch_chnl_params. Update wma_set_channel(struct wma_vdev_start_req *req) PE/LIM call wma API directly for channel switch, don't post msg. Clean up useless tpSwitchChannelParams. Change-Id: I876207909ff0bc50f9ec1fbff639c0e9b7d03907 CRs-Fixed: 2529018
This commit is contained in:
parent
a440567c76
commit
e9fbc3f7b8
@ -2744,7 +2744,7 @@ typedef struct sSirChanChangeRequest {
|
||||
|
||||
typedef struct sSirChanChangeResponse {
|
||||
uint8_t sessionId;
|
||||
uint8_t newChannelNumber;
|
||||
uint8_t new_op_freq;
|
||||
uint8_t channelChangeStatus;
|
||||
} tSirChanChangeResponse, *tpSirChanChangeResponse;
|
||||
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include "host_diag_core_log.h"
|
||||
#endif /* FEATURE_WLAN_DIAG_SUPPORT */
|
||||
#include "lim_utils.h"
|
||||
#include "wma.h"
|
||||
|
||||
/**
|
||||
* lim_send_beacon_params() - updates bcn params to WMA
|
||||
@ -118,8 +119,7 @@ QDF_STATUS lim_send_switch_chnl_params(struct mac_context *mac,
|
||||
uint32_t cac_duration_ms,
|
||||
uint32_t dfs_regdomain)
|
||||
{
|
||||
tpSwitchChannelParams pChnlParams = NULL;
|
||||
struct scheduler_msg msgQ = {0};
|
||||
struct wma_vdev_start_req req = {0};
|
||||
struct pe_session *pe_session;
|
||||
|
||||
pe_session = pe_find_session_by_session_id(mac, peSessionId);
|
||||
@ -128,79 +128,69 @@ QDF_STATUS lim_send_switch_chnl_params(struct mac_context *mac,
|
||||
peSessionId);
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
pChnlParams = qdf_mem_malloc(sizeof(tSwitchChannelParams));
|
||||
if (!pChnlParams)
|
||||
return QDF_STATUS_E_NOMEM;
|
||||
pChnlParams->ch_freq = wlan_reg_chan_to_freq(mac->pdev, chnlNumber);
|
||||
pChnlParams->ch_center_freq_seg0 =
|
||||
wlan_reg_chan_to_freq(mac->pdev, ch_center_freq_seg0);
|
||||
pChnlParams->ch_center_freq_seg1 =
|
||||
wlan_reg_chan_to_freq(mac->pdev, ch_center_freq_seg1);
|
||||
pChnlParams->ch_width = ch_width;
|
||||
qdf_mem_copy(pChnlParams->selfStaMacAddr, pe_session->self_mac_addr,
|
||||
sizeof(tSirMacAddr));
|
||||
pChnlParams->maxTxPower = maxTxPower;
|
||||
pChnlParams->peSessionId = peSessionId;
|
||||
pChnlParams->vhtCapable = pe_session->vhtCapability;
|
||||
if (lim_is_session_he_capable(pe_session))
|
||||
lim_update_chan_he_capable(mac, pChnlParams);
|
||||
pChnlParams->dot11_mode = pe_session->dot11mode;
|
||||
pChnlParams->nss = pe_session->nss;
|
||||
pe_debug("dot11mode: %d, vht_capable: %d nss value: %d",
|
||||
pChnlParams->dot11_mode, pChnlParams->vhtCapable,
|
||||
pChnlParams->nss);
|
||||
|
||||
req.vdev_id = pe_session->vdev_id;
|
||||
req.op_chan_freq = wlan_reg_chan_to_freq(mac->pdev, chnlNumber);
|
||||
req.chan_width = ch_width;
|
||||
if (cds_is_5_mhz_enabled())
|
||||
req.is_quarter_rate = 1;
|
||||
else if (cds_is_10_mhz_enabled())
|
||||
req.is_half_rate = 1;
|
||||
req.chan_freq_seg0 =
|
||||
wlan_reg_chan_to_freq(mac->pdev, ch_center_freq_seg0);
|
||||
req.chan_freq_seg1 =
|
||||
wlan_reg_chan_to_freq(mac->pdev, ch_center_freq_seg1);
|
||||
req.dot11_mode = pe_session->dot11mode;
|
||||
req.cac_duration_ms = cac_duration_ms;
|
||||
/*Set DFS flag for DFS channel */
|
||||
if (ch_width == CH_WIDTH_160MHZ) {
|
||||
pChnlParams->isDfsChannel = true;
|
||||
req.is_dfs = true;
|
||||
} else if (ch_width == CH_WIDTH_80P80MHZ) {
|
||||
pChnlParams->isDfsChannel = false;
|
||||
req.is_dfs = false;
|
||||
if (wlan_reg_get_channel_state(mac->pdev, chnlNumber) ==
|
||||
CHANNEL_STATE_DFS ||
|
||||
wlan_reg_get_channel_state(mac->pdev,
|
||||
pChnlParams->ch_center_freq_seg1 -
|
||||
ch_center_freq_seg1 -
|
||||
SIR_80MHZ_START_CENTER_CH_DIFF) ==
|
||||
CHANNEL_STATE_DFS)
|
||||
pChnlParams->isDfsChannel = true;
|
||||
req.is_dfs = true;
|
||||
} else {
|
||||
if (wlan_reg_get_channel_state(mac->pdev, chnlNumber) ==
|
||||
CHANNEL_STATE_DFS)
|
||||
pChnlParams->isDfsChannel = true;
|
||||
req.is_dfs = true;
|
||||
else
|
||||
pChnlParams->isDfsChannel = false;
|
||||
req.is_dfs = false;
|
||||
}
|
||||
req.beacon_intval = 100;
|
||||
req.dtim_period = 1;
|
||||
req.max_txpow = maxTxPower;
|
||||
req.ssid = pe_session->ssId;
|
||||
req.hidden_ssid = pe_session->ssidHidden;
|
||||
if (pe_session->nss == 2) {
|
||||
req.preferred_rx_streams = 2;
|
||||
req.preferred_tx_streams = 2;
|
||||
} else {
|
||||
req.preferred_rx_streams = 1;
|
||||
req.preferred_tx_streams = 1;
|
||||
}
|
||||
if (lim_is_session_he_capable(pe_session))
|
||||
req.he_capable = true;
|
||||
req.vht_capable = pe_session->vhtCapability;
|
||||
|
||||
pChnlParams->restart_on_chan_switch = is_restart;
|
||||
pChnlParams->cac_duration_ms = cac_duration_ms;
|
||||
pChnlParams->dfs_regdomain = dfs_regdomain;
|
||||
pChnlParams->reduced_beacon_interval =
|
||||
mac->sap.SapDfsInfo.reduced_beacon_interval;
|
||||
pe_debug("dot11mode: %d, vht_capable: %d nss value: %d",
|
||||
req.dot11_mode, req.vht_capable,
|
||||
pe_session->nss);
|
||||
|
||||
pChnlParams->ssid_hidden = pe_session->ssidHidden;
|
||||
pChnlParams->ssid = pe_session->ssId;
|
||||
if (cds_is_5_mhz_enabled())
|
||||
pChnlParams->ch_width = CH_WIDTH_5MHZ;
|
||||
else if (cds_is_10_mhz_enabled())
|
||||
pChnlParams->ch_width = CH_WIDTH_10MHZ;
|
||||
pe_debug("ch width %d, freq %d, maxTxPower %d",
|
||||
req.chan_width, req.op_chan_freq, req.max_txpow);
|
||||
|
||||
pe_session->ch_switch_in_progress = true;
|
||||
|
||||
/* we need to defer the message until we
|
||||
* get the response back from WMA
|
||||
*/
|
||||
SET_LIM_PROCESS_DEFD_MESGS(mac, false);
|
||||
msgQ.type = WMA_CHNL_SWITCH_REQ;
|
||||
msgQ.reserved = 0;
|
||||
msgQ.bodyptr = pChnlParams;
|
||||
msgQ.bodyval = 0;
|
||||
pe_debug("Sending CH_SWITCH_REQ, ch_width %d, ch_freq %d, maxTxPower %d",
|
||||
pChnlParams->ch_width,
|
||||
pChnlParams->ch_freq, pChnlParams->maxTxPower);
|
||||
MTRACE(mac_trace_msg_tx(mac, peSessionId, msgQ.type));
|
||||
if (QDF_STATUS_SUCCESS != wma_post_ctrl_msg(mac, &msgQ)) {
|
||||
qdf_mem_free(pChnlParams);
|
||||
pe_err("Posting CH_SWITCH_REQ to WMA failed");
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
pe_session->ch_switch_in_progress = true;
|
||||
wma_set_channel(&req);
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
@ -1931,7 +1931,7 @@ lim_send_sme_ap_channel_switch_resp(struct mac_context *mac,
|
||||
struct vdev_start_response *rsp)
|
||||
{
|
||||
struct scheduler_msg mmhMsg = {0};
|
||||
tpSwitchChannelParams pSmeSwithChnlParams;
|
||||
struct sSirChanChangeResponse *chan_change_rsp;
|
||||
uint8_t channelId;
|
||||
bool is_ch_dfs = false;
|
||||
enum phy_ch_width ch_width;
|
||||
@ -1940,30 +1940,27 @@ lim_send_sme_ap_channel_switch_resp(struct mac_context *mac,
|
||||
qdf_runtime_pm_allow_suspend(&pe_session->ap_ecsa_runtime_lock);
|
||||
qdf_wake_lock_release(&pe_session->ap_ecsa_wakelock, 0);
|
||||
|
||||
pSmeSwithChnlParams = qdf_mem_malloc(sizeof(tSwitchChannelParams));
|
||||
if (!pSmeSwithChnlParams)
|
||||
chan_change_rsp =
|
||||
qdf_mem_malloc(sizeof(struct sSirChanChangeResponse));
|
||||
if (!chan_change_rsp)
|
||||
return;
|
||||
|
||||
channelId = wlan_reg_freq_to_chan(mac->pdev, pe_session->curr_op_freq);
|
||||
pSmeSwithChnlParams->ch_freq = pe_session->curr_op_freq;
|
||||
pSmeSwithChnlParams->status = rsp->status;
|
||||
|
||||
ch_width = pe_session->ch_width;
|
||||
ch_center_freq_seg1 = pe_session->ch_center_freq_seg1;
|
||||
|
||||
chan_change_rsp->new_op_freq = pe_session->curr_op_freq;
|
||||
chan_change_rsp->channelChangeStatus = rsp->status;
|
||||
/*
|
||||
* Pass the sme sessionID to SME instead
|
||||
* PE session ID.
|
||||
*/
|
||||
pSmeSwithChnlParams->peSessionId = rsp->vdev_id;
|
||||
chan_change_rsp->sessionId = rsp->vdev_id;
|
||||
|
||||
mmhMsg.type = eWNI_SME_CHANNEL_CHANGE_RSP;
|
||||
mmhMsg.bodyptr = (void *)pSmeSwithChnlParams;
|
||||
mmhMsg.bodyptr = (void *)chan_change_rsp;
|
||||
mmhMsg.bodyval = 0;
|
||||
lim_sys_process_mmh_msg_api(mac, &mmhMsg);
|
||||
|
||||
if (QDF_IS_STATUS_ERROR(rsp->status)) {
|
||||
pe_err("failed to change sap channel to %u", channelId);
|
||||
pe_err("failed to change sap freq to %u",
|
||||
pe_session->curr_op_freq);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1973,7 +1970,9 @@ lim_send_sme_ap_channel_switch_resp(struct mac_context *mac,
|
||||
* channel, PE will receive an explicit request from
|
||||
* upper layers to start the beacon transmission .
|
||||
*/
|
||||
|
||||
ch_width = pe_session->ch_width;
|
||||
ch_center_freq_seg1 = pe_session->ch_center_freq_seg1;
|
||||
channelId = wlan_reg_freq_to_chan(mac->pdev, pe_session->curr_op_freq);
|
||||
if (ch_width == CH_WIDTH_160MHZ) {
|
||||
is_ch_dfs = true;
|
||||
} else if (ch_width == CH_WIDTH_80P80MHZ) {
|
||||
|
@ -7157,12 +7157,6 @@ void lim_update_session_he_capable(struct mac_context *mac, struct pe_session *s
|
||||
pe_debug("he_capable: %d", session->he_capable);
|
||||
}
|
||||
|
||||
void lim_update_chan_he_capable(struct mac_context *mac, tpSwitchChannelParams chan)
|
||||
{
|
||||
chan->he_capable = true;
|
||||
pe_debug("he_capable: %d", chan->he_capable);
|
||||
}
|
||||
|
||||
void lim_set_he_caps(struct mac_context *mac, struct pe_session *session, uint8_t *ie_start,
|
||||
uint32_t num_bytes)
|
||||
{
|
||||
|
@ -1134,15 +1134,6 @@ void lim_update_stads_he_capable(tpDphHashNode sta_ds, tpSirAssocReq assoc_req);
|
||||
*/
|
||||
void lim_update_session_he_capable(struct mac_context *mac, struct pe_session *session);
|
||||
|
||||
/**
|
||||
* lim_update_chan_he_capable(): Update he_capable in chan switch params
|
||||
* @mac: pointer to MAC context
|
||||
* @chan: pointer to channel switch params
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
void lim_update_chan_he_capable(struct mac_context *mac, tpSwitchChannelParams chan);
|
||||
|
||||
/**
|
||||
* lim_set_he_caps() - update HE caps to be sent to FW as part of scan IE
|
||||
* @mac: pointer to MAC
|
||||
@ -1293,11 +1284,6 @@ static inline void lim_update_session_he_capable(struct mac_context *mac,
|
||||
{
|
||||
}
|
||||
|
||||
static inline void lim_update_chan_he_capable(struct mac_context *mac,
|
||||
tpSwitchChannelParams chan)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void lim_set_he_caps(struct mac_context *mac, struct pe_session *session,
|
||||
uint8_t *ie_start, uint32_t num_bytes)
|
||||
{
|
||||
|
@ -9091,50 +9091,33 @@ static QDF_STATUS sme_process_channel_change_resp(struct mac_context *mac,
|
||||
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
||||
struct csr_roam_info *roam_info;
|
||||
eCsrRoamResult roamResult;
|
||||
tpSwitchChannelParams pChnlParams = (tpSwitchChannelParams) msg_buf;
|
||||
uint32_t SessionId = pChnlParams->peSessionId;
|
||||
uint8_t session_id;
|
||||
|
||||
roam_info = qdf_mem_malloc(sizeof(*roam_info));
|
||||
if (!roam_info)
|
||||
return QDF_STATUS_E_NOMEM;
|
||||
|
||||
roam_info->channelChangeRespEvent =
|
||||
qdf_mem_malloc(sizeof(tSirChanChangeResponse));
|
||||
if (!roam_info->channelChangeRespEvent) {
|
||||
status = QDF_STATUS_E_NOMEM;
|
||||
qdf_mem_free(roam_info);
|
||||
return status;
|
||||
}
|
||||
if (msg_type == eWNI_SME_CHANNEL_CHANGE_RSP) {
|
||||
roam_info->channelChangeRespEvent->sessionId = SessionId;
|
||||
roam_info->channelChangeRespEvent->newChannelNumber =
|
||||
wlan_reg_freq_to_chan(mac->pdev, pChnlParams->ch_freq);
|
||||
(struct sSirChanChangeResponse *)msg_buf;
|
||||
|
||||
if (pChnlParams->status == QDF_STATUS_SUCCESS) {
|
||||
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
|
||||
"sapdfs: Received success eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
|
||||
SessionId);
|
||||
roam_info->channelChangeRespEvent->channelChangeStatus =
|
||||
1;
|
||||
roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_SUCCESS;
|
||||
} else {
|
||||
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
|
||||
"sapdfs: Received failure eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
|
||||
SessionId);
|
||||
roam_info->channelChangeRespEvent->channelChangeStatus =
|
||||
0;
|
||||
roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE;
|
||||
}
|
||||
|
||||
csr_roam_call_callback(mac, SessionId, roam_info, 0,
|
||||
eCSR_ROAM_SET_CHANNEL_RSP, roamResult);
|
||||
session_id = roam_info->channelChangeRespEvent->sessionId;
|
||||
|
||||
if (roam_info->channelChangeRespEvent->channelChangeStatus ==
|
||||
QDF_STATUS_SUCCESS) {
|
||||
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
|
||||
"sapdfs: Received success eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
|
||||
session_id);
|
||||
roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_SUCCESS;
|
||||
} else {
|
||||
status = QDF_STATUS_E_FAILURE;
|
||||
sme_err("Invalid Channel Change Resp Message: %d",
|
||||
status);
|
||||
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
|
||||
"sapdfs: Received failure eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
|
||||
session_id);
|
||||
roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE;
|
||||
}
|
||||
qdf_mem_free(roam_info->channelChangeRespEvent);
|
||||
|
||||
csr_roam_call_callback(mac, session_id, roam_info, 0,
|
||||
eCSR_ROAM_SET_CHANNEL_RSP, roamResult);
|
||||
|
||||
qdf_mem_free(roam_info);
|
||||
|
||||
return status;
|
||||
|
@ -3325,7 +3325,6 @@ QDF_STATUS csr_roam_call_callback(struct mac_context *mac, uint32_t sessionId,
|
||||
struct csr_roam_session *pSession;
|
||||
tDot11fBeaconIEs *beacon_ies = NULL;
|
||||
uint8_t chan1, chan2;
|
||||
uint8_t new_chan_num;
|
||||
|
||||
if (!CSR_IS_SESSION_VALID(mac, sessionId)) {
|
||||
sme_err("Session ID: %d is not valid", sessionId);
|
||||
@ -3393,10 +3392,8 @@ QDF_STATUS csr_roam_call_callback(struct mac_context *mac, uint32_t sessionId,
|
||||
pSession->bRefAssocStartCnt--;
|
||||
} else if (roam_info && (u1 == eCSR_ROAM_SET_CHANNEL_RSP)
|
||||
&& (u2 == eCSR_ROAM_RESULT_CHANNEL_CHANGE_SUCCESS)) {
|
||||
new_chan_num =
|
||||
roam_info->channelChangeRespEvent->newChannelNumber;
|
||||
pSession->connectedProfile.op_freq =
|
||||
wlan_reg_chan_to_freq(mac->pdev, new_chan_num);
|
||||
roam_info->channelChangeRespEvent->new_op_freq;
|
||||
} else if (u1 == eCSR_ROAM_SESSION_OPENED) {
|
||||
ret = (u2 == eCSR_ROAM_RESULT_SUCCESS) ?
|
||||
QDF_STATUS_SUCCESS : QDF_STATUS_E_FAILURE;
|
||||
|
@ -2591,4 +2591,12 @@ QDF_STATUS wma_send_peer_assoc_req(struct bss_params *add_bss);
|
||||
*/
|
||||
QDF_STATUS wma_get_rx_chainmask(uint8_t pdev_id, uint32_t *chainmask_2g,
|
||||
uint32_t *chainmask_5g);
|
||||
|
||||
/**
|
||||
* wma_set_channel() - API to set or switch channel
|
||||
* @req: channel switch request
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
void wma_set_channel(struct wma_vdev_start_req *req);
|
||||
#endif
|
||||
|
@ -172,16 +172,6 @@ static inline bool wma_is_peer_he_capable(tpAddStaParams params)
|
||||
return params->he_capable;
|
||||
}
|
||||
|
||||
/**
|
||||
* wma_update_vdev_he_capable() - update vdev start request he capability
|
||||
* @req: pointer to vdev start request
|
||||
* @params: pointer to chan switch params
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
void wma_update_vdev_he_capable(struct wma_vdev_start_req *req,
|
||||
tpSwitchChannelParams params);
|
||||
|
||||
/**
|
||||
* wma_update_he_ops_ie() - update the HE OPS IE to firmware
|
||||
* @wma: pointer to wma context
|
||||
@ -304,11 +294,6 @@ static inline bool wma_is_peer_he_capable(tpAddStaParams params)
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline void wma_update_vdev_he_capable(struct wma_vdev_start_req *req,
|
||||
tpSwitchChannelParams params)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void wma_set_he_vdev_param(struct wma_txrx_node *intr,
|
||||
WMI_VDEV_PARAM param_id, uint32_t value)
|
||||
{
|
||||
|
@ -723,55 +723,6 @@ typedef struct {
|
||||
tSirMacAddr peer_mac;
|
||||
} tUpdateUserPos, *tpUpdateUserPos;
|
||||
|
||||
/**
|
||||
* struct tSwitchChannelParams - switch channel request parameter
|
||||
* @ch_freq: channel frequency ID
|
||||
* @localPowerConstraint: local power constraint
|
||||
* @secondaryChannelOffset: scondary channel offset
|
||||
* @peSessionId: PE session id
|
||||
* @txMgmtPower: TX mgmt power
|
||||
* @maxTxPower: max tx power
|
||||
* @selfStaMacAddr: self mac address
|
||||
* @bssId: bssid
|
||||
* @status: QDF status
|
||||
* @chainMask: chanin mask
|
||||
* @smpsMode: SMPS mode
|
||||
* @isDfsChannel: is DFS channel
|
||||
* @vhtCapable: VHT capable
|
||||
* @ch_center_freq_seg0: ch freq segment for primary channel(center frequency)
|
||||
* @ch_center_freq_seg1: ch freq segment for secondary channel(center frequency)
|
||||
* @dot11_mode: 802.11 mode
|
||||
* @cac_duration_ms: cac duration in milliseconds
|
||||
* @dfs_regdomain: dfs region
|
||||
* @reduced_beacon_interval: reduced beacon interval value
|
||||
* @ssid_hidden: the sap ssid is hidden
|
||||
* @ssid: sap ssid
|
||||
*/
|
||||
typedef struct {
|
||||
uint32_t ch_freq;
|
||||
uint8_t peSessionId;
|
||||
int8_t maxTxPower;
|
||||
tSirMacAddr selfStaMacAddr;
|
||||
QDF_STATUS status;
|
||||
uint8_t isDfsChannel;
|
||||
uint8_t vhtCapable;
|
||||
enum phy_ch_width ch_width;
|
||||
uint32_t ch_center_freq_seg0;
|
||||
uint32_t ch_center_freq_seg1;
|
||||
uint8_t dot11_mode;
|
||||
|
||||
uint8_t restart_on_chan_switch;
|
||||
uint8_t nss;
|
||||
#ifdef WLAN_FEATURE_11AX
|
||||
bool he_capable;
|
||||
#endif
|
||||
uint32_t cac_duration_ms;
|
||||
uint32_t dfs_regdomain;
|
||||
uint16_t reduced_beacon_interval;
|
||||
uint8_t ssid_hidden;
|
||||
tSirMacSSid ssid;
|
||||
} tSwitchChannelParams, *tpSwitchChannelParams;
|
||||
|
||||
/**
|
||||
* struct tEdcaParams - EDCA parameters
|
||||
* @bss_idx: BSSID index
|
||||
|
@ -291,8 +291,6 @@ QDF_STATUS wma_roam_scan_bmiss_cnt(tp_wma_handle wma_handle,
|
||||
QDF_STATUS wma_roam_scan_offload_command(tp_wma_handle wma_handle,
|
||||
uint32_t command, uint32_t vdev_id);
|
||||
|
||||
void wma_set_channel(tp_wma_handle wma, tpSwitchChannelParams params);
|
||||
|
||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||
void wma_set_ric_req(tp_wma_handle wma, void *msg, uint8_t is_add_ts);
|
||||
#endif
|
||||
|
@ -1336,12 +1336,6 @@ void wma_vdev_set_he_config(tp_wma_handle wma, uint8_t vdev_id,
|
||||
pd_min, pd_max, sec_ch_ed, tx_pwr);
|
||||
}
|
||||
|
||||
void wma_update_vdev_he_capable(struct wma_vdev_start_req *req,
|
||||
tpSwitchChannelParams params)
|
||||
{
|
||||
req->he_capable = params->he_capable;
|
||||
}
|
||||
|
||||
QDF_STATUS wma_update_he_ops_ie(tp_wma_handle wma, uint8_t vdev_id,
|
||||
tDot11fIEhe_op *he_op)
|
||||
{
|
||||
|
@ -8443,11 +8443,6 @@ static QDF_STATUS wma_mc_process_msg(struct scheduler_msg *msg)
|
||||
(tSirUpdateChanList *) msg->bodyptr);
|
||||
qdf_mem_free(msg->bodyptr);
|
||||
break;
|
||||
case WMA_CHNL_SWITCH_REQ:
|
||||
wma_set_channel(wma_handle,
|
||||
(tpSwitchChannelParams) msg->bodyptr);
|
||||
qdf_mem_free(msg->bodyptr);
|
||||
break;
|
||||
case WMA_ADD_BSS_REQ:
|
||||
wma_add_bss(wma_handle, (struct bss_params *) msg->bodyptr);
|
||||
break;
|
||||
|
@ -3496,95 +3496,36 @@ void wma_process_roam_synch_complete(WMA_HANDLE handle, uint8_t vdev_id)
|
||||
}
|
||||
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
|
||||
|
||||
/**
|
||||
* wma_set_channel() - set channel
|
||||
* @wma: wma handle
|
||||
* @params: switch channel parameters
|
||||
*
|
||||
* Return: none
|
||||
*/
|
||||
void wma_set_channel(tp_wma_handle wma, tpSwitchChannelParams params)
|
||||
void wma_set_channel(struct wma_vdev_start_req *req)
|
||||
{
|
||||
struct wma_vdev_start_req req;
|
||||
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
||||
uint8_t vdev_id, peer_id;
|
||||
void *peer;
|
||||
struct cdp_pdev *pdev;
|
||||
struct wma_txrx_node *intr = wma->interfaces;
|
||||
uint8_t vdev_id = req->vdev_id;
|
||||
tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
|
||||
struct cdp_pdev *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
|
||||
struct wma_txrx_node *intr = &wma->interfaces[vdev_id];
|
||||
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
|
||||
uint16_t beacon_interval_ori;
|
||||
uint8_t chan;
|
||||
struct vdev_start_response rsp = {0};
|
||||
bool restart;
|
||||
uint16_t reduced_beacon_interval;
|
||||
|
||||
WMA_LOGD("%s: Enter", __func__);
|
||||
if (!wma_find_vdev_by_addr(wma, params->selfStaMacAddr, &vdev_id)) {
|
||||
WMA_LOGP("%s: Failed to find vdev id for %pM",
|
||||
__func__, params->selfStaMacAddr);
|
||||
status = QDF_STATUS_E_FAILURE;
|
||||
goto send_resp;
|
||||
}
|
||||
pdev = cds_get_context(QDF_MODULE_ID_TXRX);
|
||||
if (!pdev) {
|
||||
WMA_LOGE("%s: Failed to get pdev", __func__);
|
||||
status = QDF_STATUS_E_FAILURE;
|
||||
goto send_resp;
|
||||
}
|
||||
|
||||
peer = cdp_peer_find_by_addr(soc,
|
||||
pdev,
|
||||
intr[vdev_id].bssid, &peer_id);
|
||||
restart =
|
||||
wma_get_channel_switch_in_progress(intr);
|
||||
if (restart && intr->beacon_filter_enabled)
|
||||
wma_remove_beacon_filter(wma, &intr->beacon_filter);
|
||||
|
||||
qdf_mem_zero(&req, sizeof(req));
|
||||
req.vdev_id = vdev_id;
|
||||
req.op_chan_freq = params->ch_freq;
|
||||
req.chan_width = params->ch_width;
|
||||
reduced_beacon_interval =
|
||||
wma->mac_context->sap.SapDfsInfo.reduced_beacon_interval;
|
||||
if (wma_is_vdev_in_ap_mode(wma, vdev_id) && reduced_beacon_interval) {
|
||||
|
||||
if (params->ch_width == CH_WIDTH_10MHZ)
|
||||
req.is_half_rate = 1;
|
||||
else if (params->ch_width == CH_WIDTH_5MHZ)
|
||||
req.is_quarter_rate = 1;
|
||||
|
||||
req.vht_capable = params->vhtCapable;
|
||||
req.chan_freq_seg0 = params->ch_center_freq_seg0;
|
||||
req.chan_freq_seg1 = params->ch_center_freq_seg1;
|
||||
req.dot11_mode = params->dot11_mode;
|
||||
wma_update_vdev_he_capable(&req, params);
|
||||
|
||||
WMA_LOGI(FL("vht_capable: %d, dot11_mode: %d"),
|
||||
req.vht_capable, req.dot11_mode);
|
||||
|
||||
if (params->nss == 2) {
|
||||
req.preferred_rx_streams = 2;
|
||||
req.preferred_tx_streams = 2;
|
||||
} else {
|
||||
req.preferred_rx_streams = 1;
|
||||
req.preferred_tx_streams = 1;
|
||||
}
|
||||
|
||||
req.max_txpow = params->maxTxPower;
|
||||
req.beacon_intval = 100;
|
||||
req.dtim_period = 1;
|
||||
req.is_dfs = params->isDfsChannel;
|
||||
req.cac_duration_ms = params->cac_duration_ms;
|
||||
req.dfs_regdomain = params->dfs_regdomain;
|
||||
req.ssid = params->ssid;
|
||||
|
||||
/* In case of AP mode, once radar is detected, we need to
|
||||
* issuse VDEV RESTART, so we making is_channel_switch as
|
||||
* true
|
||||
*/
|
||||
if ((wma_is_vdev_in_ap_mode(wma, req.vdev_id) == true) ||
|
||||
(params->restart_on_chan_switch == true)) {
|
||||
req.hidden_ssid = params->ssid_hidden;
|
||||
}
|
||||
|
||||
if (params->restart_on_chan_switch == true &&
|
||||
wma->interfaces[req.vdev_id].beacon_filter_enabled)
|
||||
wma_remove_beacon_filter(wma,
|
||||
&wma->interfaces[req.vdev_id].beacon_filter);
|
||||
|
||||
if ((wma_is_vdev_in_ap_mode(wma, req.vdev_id) == true) &&
|
||||
(params->reduced_beacon_interval)) {
|
||||
/* Reduce the beacon interval just before the channel switch.
|
||||
* This would help in reducing the downtime on the STA side
|
||||
* (which is waiting for beacons from the AP to resume back
|
||||
@ -3595,23 +3536,22 @@ void wma_set_channel(tp_wma_handle wma, tpSwitchChannelParams params)
|
||||
*/
|
||||
|
||||
WMA_LOGD("%s: Changing beacon interval to %d",
|
||||
__func__, params->reduced_beacon_interval);
|
||||
__func__, reduced_beacon_interval);
|
||||
|
||||
/* Add a timer to reset the beacon interval back*/
|
||||
beacon_interval_ori = req.beacon_intval;
|
||||
req.beacon_intval = params->reduced_beacon_interval;
|
||||
beacon_interval_ori = req->beacon_intval;
|
||||
req->beacon_intval = reduced_beacon_interval;
|
||||
if (wma_fill_beacon_interval_reset_req(wma,
|
||||
req.vdev_id,
|
||||
vdev_id,
|
||||
beacon_interval_ori,
|
||||
RESET_BEACON_INTERVAL_TIMEOUT)) {
|
||||
|
||||
WMA_LOGD("%s: Failed to fill beacon interval reset req",
|
||||
__func__);
|
||||
__func__);
|
||||
}
|
||||
}
|
||||
|
||||
status = wma_vdev_start(wma, &req, wma_get_channel_switch_in_progress(
|
||||
&wma->interfaces[req.vdev_id]));
|
||||
status = wma_vdev_start(wma, req, restart);
|
||||
if (status != QDF_STATUS_SUCCESS) {
|
||||
WMA_LOGP("%s: vdev start failed status = %d", __func__,
|
||||
status);
|
||||
@ -3622,18 +3562,14 @@ void wma_set_channel(tp_wma_handle wma, tpSwitchChannelParams params)
|
||||
* Record monitor mode channel here in case HW
|
||||
* indicate RX PPDU TLV with invalid channel number.
|
||||
*/
|
||||
if (intr[vdev_id].type == WMI_VDEV_TYPE_MONITOR) {
|
||||
chan = wlan_reg_freq_to_chan(wma->pdev, req.op_chan_freq);
|
||||
if (intr->type == WMI_VDEV_TYPE_MONITOR) {
|
||||
chan = wlan_reg_freq_to_chan(wma->pdev, req->op_chan_freq);
|
||||
cdp_record_monitor_chan_num(soc, pdev, chan);
|
||||
}
|
||||
|
||||
return;
|
||||
send_resp:
|
||||
WMA_LOGD("%s: ch_freq %d ch_width %d txpower %d status %d", __func__,
|
||||
params->ch_freq, params->ch_width,
|
||||
params->maxTxPower,
|
||||
status);
|
||||
WMA_LOGI("%s: wma switch channel rsp,, status = 0x%x",
|
||||
WMA_LOGI("%s: wma switch channel rsp, status = 0x%x",
|
||||
__func__, status);
|
||||
rsp.status = status;
|
||||
rsp.vdev_id = vdev_id;
|
||||
|
Loading…
Reference in New Issue
Block a user