qcacmn: populate bw value from chan_params

Currently, host sends bw value to upper layer in response
of GET_USABLE_CHAN command. but upper layer requires bw
value in form of nl80211_chan_width enum and considering
bw value as invalid and resulting into 0 bw.

Fix is to populate bw value from ch_params.ch_width instead
of populating from curr channel list and then convert to
nl80211_chan_width from phy_ch_width in hdd.

Change-Id: I1937ac2b3282224861a200a5d956a6e92109328e
CRs-Fixed: 2957055
Цей коміт міститься в:
sheenam monga
2021-05-28 14:45:03 +05:30
зафіксовано Madan Koyyalamudi
джерело c459923dd6
коміт 9738504384
2 змінених файлів з 53 додано та 41 видалено

Переглянути файл

@@ -3344,11 +3344,11 @@ reg_update_usable_chan_resp(struct wlan_objmgr_pdev *pdev,
int index = *count;
for (i = 0; i < len; i++) {
/*
* In case usable channels are required for multiple filter mask,
* Some frequencies may present in res_msg . To avoid frequency
* duplication, only mode mask is updated for existing freqency.
*/
/* In case usable channels are required for multiple filter
* mask, Some frequencies may present in res_msg . To avoid
* frequency duplication, only mode mask is updated for
* existing freqency.
*/
if (is_freq_present_in_resp_list(pcl_ch[i], res_msg, *count)) {
res_msg[i].iface_mode_mask |= 1 << iface_mode_mask;
continue;
@@ -3362,7 +3362,7 @@ reg_update_usable_chan_resp(struct wlan_objmgr_pdev *pdev,
pdev,
pcl_ch[i],
0, &ch_params);
res_msg[index].freq = pcl_ch[i];
res_msg[index].freq = (qdf_freq_t)pcl_ch[i];
res_msg[index].iface_mode_mask |= 1 << iface_mode_mask;
res_msg[index].bw = ch_params.ch_width;
if (ch_params.center_freq_seg0)
@@ -3463,34 +3463,44 @@ reg_get_usable_channel_con_filter(struct wlan_objmgr_pdev *pdev,
int *count)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
uint32_t iface_mode_mask = req_msg.iface_mode_mask;
if (req_msg.iface_mode_mask & 1 << IFTYPE_AP) {
status =
reg_update_conn_chan_list(pdev, res_msg, PM_SAP_MODE,
IFTYPE_AP, req_msg.band_mask, count);
}
if (req_msg.iface_mode_mask & 1 << IFTYPE_STATION) {
status =
reg_update_conn_chan_list(pdev, res_msg, PM_STA_MODE,
IFTYPE_STATION, req_msg.band_mask,
count);
}
if (req_msg.iface_mode_mask & 1 << IFTYPE_P2P_GO) {
status =
reg_update_conn_chan_list(pdev, res_msg, PM_P2P_GO_MODE,
IFTYPE_P2P_GO, req_msg.band_mask,
count);
}
if (req_msg.iface_mode_mask & 1 << IFTYPE_P2P_CLIENT) {
status =
reg_update_conn_chan_list(pdev, res_msg, PM_P2P_CLIENT_MODE,
IFTYPE_P2P_CLIENT, req_msg.band_mask,
count);
}
if (req_msg.iface_mode_mask & 1 << IFTYPE_NAN) {
status =
reg_update_conn_chan_list(pdev, res_msg, PM_NAN_DISC_MODE,
IFTYPE_NAN, req_msg.band_mask, count);
while (iface_mode_mask) {
if (req_msg.iface_mode_mask & 1 << IFTYPE_AP) {
status =
reg_update_conn_chan_list(pdev, res_msg, PM_SAP_MODE,
IFTYPE_AP, req_msg.band_mask,
count);
iface_mode_mask &= ~(1 << IFTYPE_AP);
} else if (req_msg.iface_mode_mask & 1 << IFTYPE_STATION) {
status =
reg_update_conn_chan_list(pdev, res_msg, PM_STA_MODE,
IFTYPE_STATION,
req_msg.band_mask, count);
iface_mode_mask &= ~(1 << IFTYPE_STATION);
} else if (req_msg.iface_mode_mask & 1 << IFTYPE_P2P_GO) {
status =
reg_update_conn_chan_list(pdev, res_msg, PM_P2P_GO_MODE,
IFTYPE_P2P_GO,
req_msg.band_mask, count);
iface_mode_mask &= ~(1 << IFTYPE_P2P_GO);
} else if (req_msg.iface_mode_mask & 1 << IFTYPE_P2P_CLIENT) {
status =
reg_update_conn_chan_list(pdev, res_msg,
PM_P2P_CLIENT_MODE,
IFTYPE_P2P_CLIENT,
req_msg.band_mask, count);
iface_mode_mask &= ~(1 << IFTYPE_P2P_CLIENT);
} else if (req_msg.iface_mode_mask & 1 << IFTYPE_NAN) {
status =
reg_update_conn_chan_list(pdev, res_msg,
PM_NAN_DISC_MODE, IFTYPE_NAN,
req_msg.band_mask, count);
iface_mode_mask &= ~(1 << IFTYPE_NAN);
} else {
reg_err("invalid mode");
break;
}
}
return status;
}
@@ -3648,7 +3658,7 @@ reg_get_usable_channel_coex_filter(struct wlan_objmgr_pdev *pdev,
{
struct wlan_regulatory_psoc_priv_obj *psoc_priv_obj;
enum channel_enum chan_enum;
uint32_t index = 0, i = 0;
uint32_t i = 0;
struct ch_avoid_freq_type freq_range;
struct wlan_objmgr_psoc *psoc;
QDF_STATUS status = QDF_STATUS_SUCCESS;
@@ -3677,7 +3687,6 @@ reg_get_usable_channel_coex_filter(struct wlan_objmgr_pdev *pdev,
reg_remove_freq(res_msg, chan_enum);
}
}
index++;
}
if (req_msg.iface_mode_mask & 1 << IFTYPE_AP ||
req_msg.iface_mode_mask & 1 << IFTYPE_P2P_GO ||
@@ -3729,8 +3738,12 @@ reg_add_usable_channel_to_resp(struct wlan_objmgr_pdev *pdev,
enum channel_enum chan_enum;
struct ch_params ch_params = {0};
QDF_STATUS status = QDF_STATUS_SUCCESS;
uint32_t mode_mask = 0;
for (chan_enum = 0; chan_enum < *count; chan_enum++) {
mode_mask = reg_calculate_mode_mask(iface_mode_mask);
for (chan_enum = 0; chan_enum < *count &&
chan_enum < NUM_CHANNELS; chan_enum++) {
ch_params.ch_width = CH_WIDTH_MAX;
reg_set_channel_params_for_freq(
pdev,
@@ -3738,13 +3751,12 @@ reg_add_usable_channel_to_resp(struct wlan_objmgr_pdev *pdev,
chan_list[chan_enum].max_bw, &ch_params);
res_msg[chan_enum].freq = chan_list[chan_enum].center_freq;
res_msg[chan_enum].iface_mode_mask =
reg_calculate_mode_mask(iface_mode_mask);
res_msg[chan_enum].iface_mode_mask = mode_mask;
if (!res_msg[chan_enum].iface_mode_mask) {
reg_err("invalid iface mask");
return QDF_STATUS_E_FAILURE;
}
res_msg[chan_enum].bw = chan_list[chan_enum].max_bw;
res_msg[chan_enum].bw = ch_params.ch_width;
res_msg[chan_enum].state = chan_list[chan_enum].state;
if (ch_params.center_freq_seg0)
res_msg[chan_enum].seg0_freq =

Переглянути файл

@@ -872,10 +872,10 @@ enum usable_channels_filter {
* iface_mode_mask: interface mode mask
**/
struct get_usable_chan_res_params {
uint32_t freq;
qdf_freq_t freq;
uint32_t seg0_freq;
uint32_t seg1_freq;
uint32_t bw;
enum phy_ch_width bw;
uint32_t iface_mode_mask;
enum channel_state state;
};