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:
abhinav kumar
2023-05-29 17:47:57 +05:30
committed by Rahul Choudhary
parent e563cf7379
commit 966ceefe89
11 changed files with 158 additions and 46 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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,

View File

@@ -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;

View File

@@ -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),

View File

@@ -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);

View File

@@ -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
/**

View File

@@ -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

View File

@@ -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

View File

@@ -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++) {

View File

@@ -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);