diff --git a/umac/regulatory/core/src/reg_services_common.c b/umac/regulatory/core/src/reg_services_common.c index 169f7704f34a..d4a7b876e3c9 100644 --- a/umac/regulatory/core/src/reg_services_common.c +++ b/umac/regulatory/core/src/reg_services_common.c @@ -3338,11 +3338,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; @@ -3356,7 +3356,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) @@ -3457,34 +3457,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; } @@ -3642,7 +3652,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; @@ -3671,7 +3681,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 || @@ -3723,8 +3732,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, @@ -3732,13 +3745,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 = diff --git a/umac/regulatory/dispatcher/inc/reg_services_public_struct.h b/umac/regulatory/dispatcher/inc/reg_services_public_struct.h index 99c48da4250e..8887cdad7540 100644 --- a/umac/regulatory/dispatcher/inc/reg_services_public_struct.h +++ b/umac/regulatory/dispatcher/inc/reg_services_public_struct.h @@ -845,10 +845,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; };