qcacld-3.0: Process get cu_req for 2 GHz band connection
Process GET_CU_FOR_EACH_SUB_BW request from the upper layer in case DUT is connected with a channel width of 40 MHz and the connected frequency is in the 2 GHz band. Change-Id: Idc748f83af72baed946340c61d5c6a0bba1baf00 CRs-Fixed: 3506871
This commit is contained in:

committed by
Rahul Choudhary

parent
e563cf7379
commit
966ceefe89
@@ -369,6 +369,16 @@ struct ft_context {
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
* struct connect_chan_info - store channel info at the time of association
|
||||
* @ch_width_orig: channel width at the time of initial connection
|
||||
* @sec_2g_freq: secondary 2 GHz freq
|
||||
*/
|
||||
struct connect_chan_info {
|
||||
enum phy_ch_width ch_width_orig;
|
||||
qdf_freq_t sec_2g_freq;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mlme_connect_info - mlme connect information
|
||||
* @timing_meas_cap: Timing meas cap
|
||||
@@ -388,7 +398,7 @@ struct ft_context {
|
||||
* @ese_tspec_info: ese tspec info
|
||||
* @ext_cap_ie: Ext CAP IE
|
||||
* @assoc_btm_cap: BSS transition management cap used in (re)assoc req
|
||||
* @ch_width_orig: channel width at the time of initial connection
|
||||
* @chan_info_orig: store channel info at the time of association
|
||||
*/
|
||||
struct mlme_connect_info {
|
||||
uint8_t timing_meas_cap;
|
||||
@@ -414,7 +424,7 @@ struct mlme_connect_info {
|
||||
#endif
|
||||
uint8_t ext_cap_ie[DOT11F_IE_EXTCAP_MAX_LEN + 2];
|
||||
bool assoc_btm_cap;
|
||||
enum phy_ch_width ch_width_orig;
|
||||
struct connect_chan_info chan_info_orig;
|
||||
};
|
||||
|
||||
/** struct wait_for_key_timer - wait for key timer object
|
||||
@@ -854,6 +864,15 @@ struct del_bss_resp {
|
||||
*/
|
||||
QDF_STATUS mlme_init_rate_config(struct vdev_mlme_obj *vdev_mlme);
|
||||
|
||||
/**
|
||||
* mlme_init_connect_chan_info_config() - initialize channel info for a
|
||||
* connection
|
||||
* @vdev_mlme: pointer to vdev mlme object
|
||||
*
|
||||
* Return: Success or Failure status
|
||||
*/
|
||||
QDF_STATUS mlme_init_connect_chan_info_config(struct vdev_mlme_obj *vdev_mlme);
|
||||
|
||||
/**
|
||||
* mlme_get_peer_mic_len() - get mic hdr len and mic length for peer
|
||||
* @psoc: psoc
|
||||
|
@@ -85,7 +85,7 @@ mlme_fill_freq_in_scan_start_request(struct wlan_objmgr_vdev *vdev,
|
||||
enum phy_ch_width associated_ch_width;
|
||||
uint8_t i;
|
||||
struct chan_list *scan_chan_list;
|
||||
uint16_t first_freq, operation_chan_freq;
|
||||
qdf_freq_t first_freq, operation_chan_freq, sec_2g_freq;
|
||||
char *chan_buff = NULL;
|
||||
uint32_t buff_len, buff_num = 0, chan_count = 0;
|
||||
|
||||
@@ -94,7 +94,8 @@ mlme_fill_freq_in_scan_start_request(struct wlan_objmgr_vdev *vdev,
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
|
||||
operation_chan_freq = wlan_get_operation_chan_freq(vdev);
|
||||
associated_ch_width = mlme_priv->connect_info.ch_width_orig;
|
||||
associated_ch_width =
|
||||
mlme_priv->connect_info.chan_info_orig.ch_width_orig;
|
||||
if (associated_ch_width == CH_WIDTH_INVALID) {
|
||||
mlme_debug("vdev %d : Invalid associated ch width for freq %d",
|
||||
req->scan_req.vdev_id, operation_chan_freq);
|
||||
@@ -115,6 +116,30 @@ mlme_fill_freq_in_scan_start_request(struct wlan_objmgr_vdev *vdev,
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
if (wlan_reg_is_24ghz_ch_freq(operation_chan_freq) &&
|
||||
associated_ch_width == CH_WIDTH_40MHZ) {
|
||||
sec_2g_freq =
|
||||
mlme_priv->connect_info.chan_info_orig.sec_2g_freq;
|
||||
if (!sec_2g_freq) {
|
||||
mlme_debug("vdev %d : Invalid sec 2g freq for freq: %d",
|
||||
req->scan_req.vdev_id, operation_chan_freq);
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
if (operation_chan_freq > sec_2g_freq) {
|
||||
req->scan_req.chan_list.chan[0].freq = sec_2g_freq;
|
||||
req->scan_req.chan_list.chan[1].freq =
|
||||
operation_chan_freq;
|
||||
} else {
|
||||
req->scan_req.chan_list.chan[0].freq =
|
||||
operation_chan_freq;
|
||||
req->scan_req.chan_list.chan[1].freq = sec_2g_freq;
|
||||
}
|
||||
|
||||
req->scan_req.chan_list.num_chan = 2;
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
range = wlan_reg_get_bonded_chan_entry(operation_chan_freq,
|
||||
associated_ch_width, 0);
|
||||
if (!range) {
|
||||
@@ -489,7 +514,8 @@ mlme_fill_freq_in_wide_scan_start_request(struct wlan_objmgr_vdev *vdev,
|
||||
if (!mlme_priv)
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
|
||||
associated_ch_width = mlme_priv->connect_info.ch_width_orig;
|
||||
associated_ch_width =
|
||||
mlme_priv->connect_info.chan_info_orig.ch_width_orig;
|
||||
if (associated_ch_width == CH_WIDTH_INVALID) {
|
||||
mlme_debug("vdev %d :Invalid associated ch_width",
|
||||
req->scan_req.vdev_id);
|
||||
@@ -675,6 +701,22 @@ QDF_STATUS mlme_init_rate_config(struct vdev_mlme_obj *vdev_mlme)
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
QDF_STATUS mlme_init_connect_chan_info_config(struct vdev_mlme_obj *vdev_mlme)
|
||||
{
|
||||
struct mlme_legacy_priv *mlme_priv;
|
||||
|
||||
mlme_priv = vdev_mlme->ext_vdev_ptr;
|
||||
if (!mlme_priv) {
|
||||
mlme_legacy_err("vdev legacy private object is NULL");
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
mlme_priv->connect_info.chan_info_orig.ch_width_orig = CH_WIDTH_INVALID;
|
||||
mlme_priv->connect_info.chan_info_orig.sec_2g_freq = 0;
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
QDF_STATUS mlme_get_peer_mic_len(struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
|
||||
uint8_t *peer_mac, uint8_t *mic_len,
|
||||
uint8_t *mic_hdr_len)
|
||||
|
@@ -1401,6 +1401,7 @@ QDF_STATUS vdevmgr_mlme_ext_hdl_create(struct vdev_mlme_obj *vdev_mlme)
|
||||
return QDF_STATUS_E_NOMEM;
|
||||
|
||||
mlme_init_rate_config(vdev_mlme);
|
||||
mlme_init_connect_chan_info_config(vdev_mlme);
|
||||
mlme_cm_alloc_roam_stats_info(vdev_mlme);
|
||||
vdev_mlme->ext_vdev_ptr->connect_info.fils_con_info = NULL;
|
||||
mlme_init_wait_for_key_timer(vdev_mlme->vdev,
|
||||
|
@@ -6797,6 +6797,11 @@ wlan_mlme_send_ch_width_update_with_notify(struct wlan_objmgr_psoc *psoc,
|
||||
QDF_STATUS status;
|
||||
enum phy_ch_width associated_ch_width;
|
||||
struct wlan_channel *des_chan;
|
||||
struct mlme_legacy_priv *mlme_priv;
|
||||
|
||||
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
||||
if (!mlme_priv)
|
||||
return QDF_STATUS_E_INVAL;
|
||||
|
||||
des_chan = wlan_vdev_mlme_get_des_chan(vdev);
|
||||
if (!des_chan)
|
||||
@@ -6808,8 +6813,10 @@ wlan_mlme_send_ch_width_update_with_notify(struct wlan_objmgr_psoc *psoc,
|
||||
return QDF_STATUS_E_NOSUPPORT;
|
||||
}
|
||||
|
||||
associated_ch_width = wlan_cm_get_associated_ch_width(psoc, vdev_id);
|
||||
if (ch_width > associated_ch_width) {
|
||||
associated_ch_width =
|
||||
mlme_priv->connect_info.chan_info_orig.ch_width_orig;
|
||||
if (associated_ch_width == CH_WIDTH_INVALID ||
|
||||
ch_width > associated_ch_width) {
|
||||
mlme_debug("vdev %d: Invalid new chwidth:%d, assoc ch_width:%d",
|
||||
vdev_id, ch_width, associated_ch_width);
|
||||
return QDF_STATUS_E_INVAL;
|
||||
|
@@ -1028,7 +1028,7 @@ cm_fw_roam_sync_propagation(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
|
||||
cm_connect_info(vdev, true, &connect_rsp->bssid, &connect_rsp->ssid,
|
||||
connect_rsp->freq);
|
||||
|
||||
cm_update_associated_ch_width(vdev, true);
|
||||
cm_update_associated_ch_info(vdev, true);
|
||||
|
||||
status = cm_sm_deliver_event_sync(cm_ctx, WLAN_CM_SM_EV_ROAM_DONE,
|
||||
sizeof(*roam_synch_data),
|
||||
|
@@ -1679,7 +1679,7 @@ cm_connect_complete_ind(struct wlan_objmgr_vdev *vdev,
|
||||
vdev);
|
||||
wlan_p2p_status_connect(vdev);
|
||||
cm_update_tid_mapping(vdev);
|
||||
cm_update_associated_ch_width(vdev, true);
|
||||
cm_update_associated_ch_info(vdev, true);
|
||||
}
|
||||
|
||||
mlo_roam_connect_complete(vdev);
|
||||
|
@@ -151,7 +151,7 @@ wlan_cm_enable_roaming_on_connected_sta(struct wlan_objmgr_pdev *pdev,
|
||||
#endif
|
||||
|
||||
/**
|
||||
* cm_update_associated_ch_width() - to save channel width in mlme priv obj at
|
||||
* cm_update_associated_ch_info() - to save channel info in mlme priv obj at
|
||||
* the time of initial connection
|
||||
* @vdev: Pointer to vdev
|
||||
* @is_update: to distinguish whether update is during connection or
|
||||
@@ -159,8 +159,8 @@ wlan_cm_enable_roaming_on_connected_sta(struct wlan_objmgr_pdev *pdev,
|
||||
*
|
||||
* Return: none
|
||||
*/
|
||||
void cm_update_associated_ch_width(struct wlan_objmgr_vdev *vdev,
|
||||
bool is_update);
|
||||
void
|
||||
cm_update_associated_ch_info(struct wlan_objmgr_vdev *vdev, bool is_update);
|
||||
|
||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||
#define wlan_is_roam_offload_enabled(lfr) \
|
||||
@@ -727,14 +727,16 @@ static inline QDF_STATUS wlan_cm_host_roam_start(struct scheduler_msg *msg)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* wlan_cm_get_associated_ch_width() - get associated channel width
|
||||
* wlan_cm_get_associated_ch_info() - get associated channel info
|
||||
* @psoc: psoc pointer
|
||||
* @vdev_id: vdev id
|
||||
* @chan_info: channel info to get
|
||||
*
|
||||
* Return: enum phy_ch_width
|
||||
* Return: none
|
||||
*/
|
||||
enum phy_ch_width
|
||||
wlan_cm_get_associated_ch_width(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id);
|
||||
void wlan_cm_get_associated_ch_info(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id,
|
||||
struct connect_chan_info *chan_info);
|
||||
|
||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||
/**
|
||||
|
@@ -123,10 +123,11 @@ ucfg_cm_update_session_assoc_ie(struct wlan_objmgr_psoc *psoc,
|
||||
cm_update_session_assoc_ie(psoc, vdev_id, assoc_ie);
|
||||
}
|
||||
|
||||
static inline enum phy_ch_width
|
||||
ucfg_cm_get_associated_ch_width(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
|
||||
static inline void
|
||||
ucfg_cm_get_associated_ch_info(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
|
||||
struct connect_chan_info *chan_info)
|
||||
{
|
||||
return wlan_cm_get_associated_ch_width(psoc, vdev_id);
|
||||
wlan_cm_get_associated_ch_info(psoc, vdev_id, chan_info);
|
||||
}
|
||||
|
||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||
|
@@ -128,29 +128,41 @@ wlan_roam_update_cfg(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
|
||||
|
||||
#endif
|
||||
|
||||
void cm_update_associated_ch_width(struct wlan_objmgr_vdev *vdev,
|
||||
bool is_update)
|
||||
void
|
||||
cm_update_associated_ch_info(struct wlan_objmgr_vdev *vdev, bool is_update)
|
||||
{
|
||||
struct mlme_legacy_priv *mlme_priv;
|
||||
struct wlan_channel *des_chan;
|
||||
struct connect_chan_info *chan_info_orig;
|
||||
|
||||
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
||||
if (!mlme_priv)
|
||||
return;
|
||||
|
||||
chan_info_orig = &mlme_priv->connect_info.chan_info_orig;
|
||||
if (!is_update) {
|
||||
mlme_priv->connect_info.ch_width_orig = CH_WIDTH_INVALID;
|
||||
goto print;
|
||||
chan_info_orig->ch_width_orig = CH_WIDTH_INVALID;
|
||||
return;
|
||||
}
|
||||
|
||||
des_chan = wlan_vdev_mlme_get_des_chan(vdev);
|
||||
if (!des_chan)
|
||||
return;
|
||||
mlme_priv->connect_info.ch_width_orig = des_chan->ch_width;
|
||||
chan_info_orig->ch_width_orig = des_chan->ch_width;
|
||||
|
||||
print:
|
||||
mlme_debug("update associated ch width :%d, is_update:%d",
|
||||
mlme_priv->connect_info.ch_width_orig, is_update);
|
||||
if (WLAN_REG_IS_24GHZ_CH_FREQ(des_chan->ch_freq) &&
|
||||
des_chan->ch_width == CH_WIDTH_40MHZ) {
|
||||
if (des_chan->ch_cfreq1 == des_chan->ch_freq + BW_10_MHZ)
|
||||
chan_info_orig->sec_2g_freq =
|
||||
des_chan->ch_freq + BW_20_MHZ;
|
||||
if (des_chan->ch_cfreq1 == des_chan->ch_freq - BW_10_MHZ)
|
||||
chan_info_orig->sec_2g_freq =
|
||||
des_chan->ch_freq - BW_20_MHZ;
|
||||
}
|
||||
|
||||
mlme_debug("ch width :%d, ch_freq:%d, ch_cfreq1:%d, sec_2g_freq:%d",
|
||||
chan_info_orig->ch_width_orig, des_chan->ch_freq,
|
||||
des_chan->ch_cfreq1, chan_info_orig->sec_2g_freq);
|
||||
}
|
||||
|
||||
char *cm_roam_get_requestor_string(enum wlan_cm_rso_control_requestor requestor)
|
||||
@@ -2118,31 +2130,37 @@ QDF_STATUS wlan_cm_update_fils_ft(struct wlan_objmgr_psoc *psoc,
|
||||
}
|
||||
#endif
|
||||
|
||||
enum phy_ch_width
|
||||
wlan_cm_get_associated_ch_width(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
|
||||
void wlan_cm_get_associated_ch_info(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id,
|
||||
struct connect_chan_info *chan_info)
|
||||
{
|
||||
struct wlan_objmgr_vdev *vdev;
|
||||
struct mlme_legacy_priv *mlme_priv;
|
||||
enum phy_ch_width ch_width = CH_WIDTH_INVALID;
|
||||
|
||||
chan_info->ch_width_orig = CH_WIDTH_INVALID;
|
||||
chan_info->sec_2g_freq = 0;
|
||||
|
||||
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
|
||||
WLAN_MLME_NB_ID);
|
||||
|
||||
if (!vdev) {
|
||||
mlme_err("vdev%d: vdev object is NULL", vdev_id);
|
||||
goto ret;
|
||||
return;
|
||||
}
|
||||
|
||||
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
||||
if (!mlme_priv)
|
||||
goto release;
|
||||
|
||||
ch_width = mlme_priv->connect_info.ch_width_orig;
|
||||
mlme_debug("vdev %d: associated_ch_width:%d", vdev_id, ch_width);
|
||||
chan_info->ch_width_orig =
|
||||
mlme_priv->connect_info.chan_info_orig.ch_width_orig;
|
||||
chan_info->sec_2g_freq =
|
||||
mlme_priv->connect_info.chan_info_orig.sec_2g_freq;
|
||||
|
||||
mlme_debug("vdev %d: associated_ch_width:%d, sec_2g_freq:%d", vdev_id,
|
||||
chan_info->ch_width_orig, chan_info->sec_2g_freq);
|
||||
release:
|
||||
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
|
||||
ret:
|
||||
return ch_width;
|
||||
}
|
||||
|
||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||
|
@@ -26033,25 +26033,44 @@ static void wlan_hdd_fill_subband_scan_info(struct hdd_context *hdd_ctx,
|
||||
uint8_t idx, info_index, freq_info_num;
|
||||
enum phy_ch_width ch_width;
|
||||
const struct bonded_channel_freq *range = NULL;
|
||||
uint32_t start_freq, end_freq;
|
||||
qdf_freq_t start_freq, end_freq, sec_2g_freq;
|
||||
uint8_t vdev_id = info->subband_info.vdev_id;
|
||||
struct connect_chan_info chan_info_orig;
|
||||
|
||||
ch_width = ucfg_cm_get_associated_ch_width(hdd_ctx->psoc,
|
||||
info->subband_info.vdev_id);
|
||||
ucfg_cm_get_associated_ch_info(hdd_ctx->psoc, vdev_id, &chan_info_orig);
|
||||
ch_width = chan_info_orig.ch_width_orig;
|
||||
if (ch_width == CH_WIDTH_INVALID) {
|
||||
hdd_debug("vdev %d: Invalid ch width",
|
||||
info->subband_info.vdev_id);
|
||||
hdd_debug("vdev %d: Invalid ch width", vdev_id);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ch_width == CH_WIDTH_20MHZ) {
|
||||
start_freq = info->freq;
|
||||
end_freq = info->freq;
|
||||
} else if (wlan_reg_is_24ghz_ch_freq(info->freq) &&
|
||||
ch_width == CH_WIDTH_40MHZ) {
|
||||
sec_2g_freq = chan_info_orig.sec_2g_freq;
|
||||
if (!sec_2g_freq) {
|
||||
mlme_debug("vdev %d : Invalid sec 2g freq for freq:%d",
|
||||
info->subband_info.vdev_id, info->freq);
|
||||
return;
|
||||
}
|
||||
|
||||
hdd_debug("vdev %d :assoc freq %d sec_2g_freq:%d, bw %d",
|
||||
info->subband_info.vdev_id, info->freq,
|
||||
sec_2g_freq, ch_width);
|
||||
if (info->freq > sec_2g_freq) {
|
||||
start_freq = sec_2g_freq;
|
||||
end_freq = info->freq;
|
||||
} else {
|
||||
start_freq = info->freq;
|
||||
end_freq = sec_2g_freq;
|
||||
}
|
||||
} else {
|
||||
range = wlan_reg_get_bonded_chan_entry(info->freq, ch_width, 0);
|
||||
if (!range) {
|
||||
hdd_err("vdev %d: bonded_chan_array is NULL for freq %d, ch_width %d",
|
||||
info->subband_info.vdev_id, info->freq,
|
||||
ch_width);
|
||||
vdev_id, info->freq, ch_width);
|
||||
return;
|
||||
}
|
||||
start_freq = range->start_freq;
|
||||
@@ -26062,7 +26081,7 @@ static void wlan_hdd_fill_subband_scan_info(struct hdd_context *hdd_ctx,
|
||||
info_index = 0;
|
||||
|
||||
hdd_debug("vdev %d: freq :%d bw %d, range [%d-%d], num_freq:%d",
|
||||
info->subband_info.vdev_id, info->freq, ch_width, start_freq,
|
||||
vdev_id, info->freq, ch_width, start_freq,
|
||||
end_freq, freq_info_num);
|
||||
|
||||
for (idx = 0; idx < NUM_CHANNELS; idx++) {
|
||||
|
@@ -495,11 +495,13 @@ static inline enum eSirMacHTChannelWidth get_max_bw(void)
|
||||
static void hdd_cm_restore_ch_width(struct wlan_objmgr_vdev *vdev,
|
||||
struct hdd_adapter *adapter)
|
||||
{
|
||||
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
|
||||
struct mlme_legacy_priv *mlme_priv;
|
||||
enum eSirMacHTChannelWidth max_bw;
|
||||
struct wlan_channel *des_chan;
|
||||
int ret;
|
||||
uint8_t vdev_id = wlan_vdev_get_id(vdev);
|
||||
enum phy_ch_width ch_width_orig;
|
||||
|
||||
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
||||
if (!mlme_priv)
|
||||
@@ -509,11 +511,12 @@ static void hdd_cm_restore_ch_width(struct wlan_objmgr_vdev *vdev,
|
||||
if (!des_chan)
|
||||
return;
|
||||
|
||||
if (mlme_priv->connect_info.ch_width_orig == CH_WIDTH_INVALID ||
|
||||
mlme_priv->connect_info.ch_width_orig == des_chan->ch_width)
|
||||
ch_width_orig = mlme_priv->connect_info.chan_info_orig.ch_width_orig;
|
||||
if (!ucfg_mlme_is_chwidth_with_notify_supported(hdd_ctx->psoc) ||
|
||||
ch_width_orig == CH_WIDTH_INVALID)
|
||||
return;
|
||||
|
||||
cm_update_associated_ch_width(vdev, false);
|
||||
cm_update_associated_ch_info(vdev, false);
|
||||
|
||||
max_bw = get_max_bw();
|
||||
ret = hdd_set_mac_chan_width(adapter, max_bw);
|
||||
|
Reference in New Issue
Block a user