diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h index e379c5fdc3..e41929c9dc 100644 --- a/core/hdd/inc/wlan_hdd_cfg.h +++ b/core/hdd/inc/wlan_hdd_cfg.h @@ -9002,6 +9002,30 @@ enum dot11p_mode { #define CFG_DOT11P_MODE_MIN (WLAN_HDD_11P_DISABLED) #define CFG_DOT11P_MODE_MAX (WLAN_HDD_11P_CONCURRENT) +/* + * + * etsi13_srd_chan_in_master_mode - Enable/disable ETSI SRD channels in + * master mode PCL and ACS functionality + * @Min: 0 + * @Max: 1 + * @Default: 0 + * + * etsi13_srd_chan_in_master_mode is to enable/disable ETSI SRD channels in + * master mode PCL and ACS functionality + * + * Related: None + * + * Supported Feature: SAP/P2P-GO + * + * Usage: Internal/External + * + * + */ +#define CFG_ETSI13_SRD_CHAN_IN_MASTER_MODE "etsi13_srd_chan_in_master_mode" +#define CFG_ETSI13_SRD_CHAN_IN_MASTER_MODE_DEF (0) +#define CFG_ETSI13_SRD_CHAN_IN_MASTER_MODE_MIN (0) +#define CFG_ETSI13_SRD_CHAN_IN_MASTER_MODE_MAX (1) + /* * * gEnable_go_cts2self_for_sta - Indicate firmware to stop NOA and @@ -14845,6 +14869,7 @@ struct hdd_config { bool fastpath_enable; #endif uint8_t dot11p_mode; + bool etsi13_srd_chan_in_master_mode; uint8_t rx_mode; uint32_t ce_service_max_yield_time; uint8_t ce_service_max_rx_ind_flush; diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c index 4c1c660e12..ec8c4820b0 100644 --- a/core/hdd/src/wlan_hdd_cfg.c +++ b/core/hdd/src/wlan_hdd_cfg.c @@ -3510,6 +3510,13 @@ struct reg_table_entry g_registry_table[] = { CFG_DOT11P_MODE_MIN, CFG_DOT11P_MODE_MAX), + REG_VARIABLE(CFG_ETSI13_SRD_CHAN_IN_MASTER_MODE, WLAN_PARAM_Integer, + struct hdd_config, etsi13_srd_chan_in_master_mode, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_ETSI13_SRD_CHAN_IN_MASTER_MODE_DEF, + CFG_ETSI13_SRD_CHAN_IN_MASTER_MODE_MIN, + CFG_ETSI13_SRD_CHAN_IN_MASTER_MODE_MAX), + #ifdef FEATURE_WLAN_EXTSCAN REG_VARIABLE(CFG_EXTSCAN_ALLOWED_NAME, WLAN_PARAM_Integer, struct hdd_config, extscan_enabled, diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index e280db837f..06628d8fe1 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -250,6 +250,7 @@ static const struct ieee80211_channel hdd_channels_5_ghz[] = { HDD5GHZCHAN(5825, 165, 0), }; +#ifdef WLAN_FEATURE_DSRC static const struct ieee80211_channel hdd_channels_dot11p[] = { HDD5GHZCHAN(5852, 170, 0), HDD5GHZCHAN(5855, 171, 0), @@ -267,6 +268,12 @@ static const struct ieee80211_channel hdd_channels_dot11p[] = { HDD5GHZCHAN(5915, 183, 0), HDD5GHZCHAN(5920, 184, 0), }; +#else +static const struct ieee80211_channel hdd_etsi13_srd_ch[] = { + HDD5GHZCHAN(5845, 169, 0), + HDD5GHZCHAN(5865, 173, 0), +}; +#endif static struct ieee80211_rate g_mode_rates[] = { HDD_G_MODE_RATETAB(10, 0x1, 0), @@ -1631,11 +1638,11 @@ static int wlan_hdd_set_acs_ch_range( } else if (hw_mode == QCA_ACS_MODE_IEEE80211A) { sap_cfg->acs_cfg.hw_mode = eCSR_DOT11_MODE_11a; sap_cfg->acs_cfg.start_ch = WLAN_REG_CH_NUM(CHAN_ENUM_36); - sap_cfg->acs_cfg.end_ch = WLAN_REG_CH_NUM(CHAN_ENUM_165); + sap_cfg->acs_cfg.end_ch = WLAN_REG_CH_NUM(CHAN_ENUM_173); } else if (hw_mode == QCA_ACS_MODE_IEEE80211ANY) { sap_cfg->acs_cfg.hw_mode = eCSR_DOT11_MODE_abg; sap_cfg->acs_cfg.start_ch = WLAN_REG_CH_NUM(CHAN_ENUM_1); - sap_cfg->acs_cfg.end_ch = WLAN_REG_CH_NUM(CHAN_ENUM_165); + sap_cfg->acs_cfg.end_ch = WLAN_REG_CH_NUM(CHAN_ENUM_173); } if (ht_enabled) @@ -2356,7 +2363,7 @@ static int __wlan_hdd_cfg80211_do_acs(struct wiphy *wiphy, struct hdd_context *hdd_ctx = wiphy_priv(wiphy); tsap_config_t *sap_config; struct sk_buff *temp_skbuff; - int ret, i; + int ret, i, ch_cnt = 0; struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_ACS_MAX + 1]; bool ht_enabled, ht40_enabled, vht_enabled; uint8_t ch_width; @@ -2364,6 +2371,7 @@ static int __wlan_hdd_cfg80211_do_acs(struct wiphy *wiphy, QDF_STATUS qdf_status; uint8_t conc_channel; mac_handle_t mac_handle; + bool skip_etsi13_srd_chan = false; /* ***Note*** Donot set SME config related to ACS operation here because * ACS operation is not synchronouse and ACS for Second AP may come when @@ -2536,6 +2544,22 @@ static int __wlan_hdd_cfg80211_do_acs(struct wiphy *wiphy, goto out; } + skip_etsi13_srd_chan = + !hdd_ctx->config->etsi13_srd_chan_in_master_mode && + wlan_reg_is_etsi13_regdmn(hdd_ctx->hdd_pdev); + + if (skip_etsi13_srd_chan) { + for (i = 0; i < sap_config->acs_cfg.ch_list_count; i++) { + if (wlan_reg_is_etsi13_srd_chan(hdd_ctx->hdd_pdev, + sap_config->acs_cfg. + ch_list[i])) + sap_config->acs_cfg.ch_list[i] = 0; + else + sap_config->acs_cfg.ch_list[ch_cnt++] = + sap_config->acs_cfg.ch_list[i]; + } + sap_config->acs_cfg.ch_list_count = ch_cnt; + } hdd_debug("get pcl for DO_ACS vendor command"); /* consult policy manager to get PCL */ @@ -14972,6 +14996,60 @@ static void wlan_hdd_cfg80211_set_dfs_offload_feature(struct wiphy *wiphy) } #endif +#ifdef WLAN_FEATURE_DSRC +static void wlan_hdd_get_num_dsrc_ch_and_len(struct hdd_config *hdd_cfg, + int *num_ch, int *ch_len) +{ + *num_ch = QDF_ARRAY_SIZE(hdd_channels_dot11p); + *ch_len = sizeof(hdd_channels_dot11p); +} + +static void wlan_hdd_copy_dsrc_ch(char *ch_ptr, int ch_arr_len) +{ + if (!ch_arr_len) + return; + qdf_mem_copy(ch_ptr, &hdd_channels_dot11p[0], ch_arr_len); +} + +static void wlan_hdd_get_num_srd_ch_and_len(struct hdd_config *hdd_cfg, + int *num_ch, int *ch_len) +{ + *num_ch = 0; + *ch_len = 0; +} + +static void wlan_hdd_copy_srd_ch(char *ch_ptr, int ch_arr_len) +{ +} + +#else + +static void wlan_hdd_get_num_dsrc_ch_and_len(struct hdd_config *hdd_cfg, + int *num_ch, int *ch_len) +{ + *num_ch = 0; + *ch_len = 0; +} + +static void wlan_hdd_copy_dsrc_ch(char *ch_ptr, int ch_arr_len) +{ +} + +static void wlan_hdd_get_num_srd_ch_and_len(struct hdd_config *hdd_cfg, + int *num_ch, int *ch_len) +{ + *num_ch = QDF_ARRAY_SIZE(hdd_etsi13_srd_ch); + *ch_len = sizeof(hdd_etsi13_srd_ch); +} + +static void wlan_hdd_copy_srd_ch(char *ch_ptr, int ch_arr_len) +{ + if (!ch_arr_len) + return; + qdf_mem_copy(ch_ptr, &hdd_etsi13_srd_ch[0], ch_arr_len); +} +#endif + /* * FUNCTION: wlan_hdd_cfg80211_init * This function is called by hdd_wlan_startup() @@ -14983,7 +15061,8 @@ int wlan_hdd_cfg80211_init(struct device *dev, { int i, j; struct hdd_context *hdd_ctx = wiphy_priv(wiphy); - int len = 0; + int len_5g_ch = 0, num_ch, ch_arr_size; + int num_dsrc_ch, len_dsrc_ch, num_srd_ch, len_srd_ch; uint32_t *cipher_suites; hdd_enter(); @@ -15107,41 +15186,30 @@ int wlan_hdd_cfg80211_init(struct device *dev, (eHDD_DOT11_MODE_11b_ONLY != pCfg->dot11Mode) && (eHDD_DOT11_MODE_11g_ONLY != pCfg->dot11Mode))) { wiphy->bands[HDD_NL80211_BAND_5GHZ] = &wlan_hdd_band_5_ghz; + wlan_hdd_get_num_dsrc_ch_and_len(pCfg, &num_dsrc_ch, + &len_dsrc_ch); + wlan_hdd_get_num_srd_ch_and_len(pCfg, &num_srd_ch, &len_srd_ch); + num_ch = QDF_ARRAY_SIZE(hdd_channels_5_ghz) + num_dsrc_ch + + num_srd_ch; + len_5g_ch = sizeof(hdd_channels_5_ghz); + ch_arr_size = len_5g_ch + len_dsrc_ch + len_srd_ch; - if (pCfg->dot11p_mode) { - wiphy->bands[HDD_NL80211_BAND_5GHZ]->channels = - qdf_mem_malloc(sizeof(hdd_channels_5_ghz) + - sizeof(hdd_channels_dot11p)); - if (wiphy->bands[HDD_NL80211_BAND_5GHZ]->channels == - NULL) { - goto mem_fail; - } - wiphy->bands[HDD_NL80211_BAND_5GHZ]->n_channels = - QDF_ARRAY_SIZE(hdd_channels_5_ghz) + - QDF_ARRAY_SIZE(hdd_channels_dot11p); + wiphy->bands[HDD_NL80211_BAND_5GHZ]->channels = + qdf_mem_malloc(ch_arr_size); + if (!wiphy->bands[HDD_NL80211_BAND_5GHZ]->channels) + goto mem_fail; + wiphy->bands[HDD_NL80211_BAND_5GHZ]->n_channels = num_ch; - qdf_mem_copy(wiphy->bands[HDD_NL80211_BAND_5GHZ]-> - channels, &hdd_channels_5_ghz[0], - sizeof(hdd_channels_5_ghz)); - len = sizeof(hdd_channels_5_ghz); - qdf_mem_copy((char *)wiphy-> - bands[HDD_NL80211_BAND_5GHZ]->channels - + len, - &hdd_channels_dot11p[0], - sizeof(hdd_channels_dot11p)); - - } else { - wiphy->bands[HDD_NL80211_BAND_5GHZ]->channels = - qdf_mem_malloc(sizeof(hdd_channels_5_ghz)); - if (wiphy->bands[HDD_NL80211_BAND_5GHZ]->channels == - NULL) { - goto mem_fail; - } - qdf_mem_copy(wiphy-> - bands[HDD_NL80211_BAND_5GHZ]->channels, - &hdd_channels_5_ghz[0], - sizeof(hdd_channels_5_ghz)); - } + qdf_mem_copy(wiphy->bands[HDD_NL80211_BAND_5GHZ]->channels, + &hdd_channels_5_ghz[0], len_5g_ch); + if (num_dsrc_ch) + wlan_hdd_copy_dsrc_ch((char *)wiphy->bands[ + HDD_NL80211_BAND_5GHZ]->channels + + len_5g_ch, len_dsrc_ch); + if (num_srd_ch) + wlan_hdd_copy_srd_ch((char *)wiphy->bands[ + HDD_NL80211_BAND_5GHZ]->channels + + len_5g_ch, len_srd_ch); } for (i = 0; i < HDD_NUM_NL80211_BANDS; i++) { @@ -15644,7 +15712,7 @@ QDF_STATUS wlan_hdd_validate_operation_channel(struct hdd_adapter *adapter, if (hdd_pConfig_ini->sapAllowAllChannel) { /* Validate the channel */ - for (count = CHAN_ENUM_1; count <= CHAN_ENUM_165; count++) { + for (count = CHAN_ENUM_1; count <= CHAN_ENUM_173; count++) { if (channel == WLAN_REG_CH_NUM(count)) { fValidChannel = true; break; @@ -22347,8 +22415,8 @@ void wlan_hdd_init_chan_info(struct hdd_context *hdd_ctx) num_5g = QDF_ARRAY_SIZE(hdd_channels_5_ghz); for (; (index - num_2g) < num_5g; index++) { - if (WLAN_REG_IS_11P_CH( - hdd_channels_5_ghz[index - num_2g].hw_value)) + if (wlan_reg_is_dsrc_chan(hdd_ctx->hdd_pdev, + hdd_channels_5_ghz[index - num_2g].hw_value)) continue; hdd_ctx->chan_info[index].freq = hdd_channels_5_ghz[index - num_2g].center_freq; diff --git a/core/hdd/src/wlan_hdd_ext_scan.c b/core/hdd/src/wlan_hdd_ext_scan.c index 2aaeeb0339..7e4a478b36 100644 --- a/core/hdd/src/wlan_hdd_ext_scan.c +++ b/core/hdd/src/wlan_hdd_ext_scan.c @@ -2381,8 +2381,10 @@ static void hdd_remove_dsrc_channels(struct hdd_context *hdd_ctx, int i; for (i = 0; i < *num_channels; i++) { - if (!WLAN_REG_IS_11P_CH(wlan_reg_freq_to_chan(hdd_ctx->hdd_pdev, - chan_list[i]))) { + if (!wlan_reg_is_dsrc_chan(hdd_ctx->hdd_pdev, + wlan_reg_freq_to_chan( + hdd_ctx->hdd_pdev, + chan_list[i]))) { chan_list[num_chan_temp] = chan_list[i]; num_chan_temp++; } diff --git a/core/hdd/src/wlan_hdd_hostapd_wext.c b/core/hdd/src/wlan_hdd_hostapd_wext.c index 9a48bba556..653cb5b555 100644 --- a/core/hdd/src/wlan_hdd_hostapd_wext.c +++ b/core/hdd/src/wlan_hdd_hostapd_wext.c @@ -1932,7 +1932,7 @@ static int __iw_get_channel_list(struct net_device *dev, uint32_t num_channels = 0; uint8_t i = 0; uint8_t band_start_channel = CHAN_ENUM_1; - uint8_t band_end_channel = CHAN_ENUM_184; + uint8_t band_end_channel = MAX_5GHZ_CHANNEL; struct hdd_adapter *hostapd_adapter = (netdev_priv(dev)); struct channel_list_info *channel_list = (struct channel_list_info *) extra; @@ -1964,15 +1964,11 @@ static int __iw_get_channel_list(struct net_device *dev, band_end_channel = CHAN_ENUM_14; } else if (BAND_5G == cur_band) { band_start_channel = CHAN_ENUM_36; - band_end_channel = CHAN_ENUM_184; + band_end_channel = MAX_5GHZ_CHANNEL; } - if (cur_band != BAND_2G) { - if (hdd_ctx->config->dot11p_mode) - band_end_channel = CHAN_ENUM_184; - else - band_end_channel = CHAN_ENUM_173; - } + if (cur_band != BAND_2G) + band_end_channel = MAX_5GHZ_CHANNEL; if (hostapd_adapter->device_mode == QDF_STA_MODE && hdd_ctx->config->enableDFSChnlScan) { diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 93115f0743..24041ac9df 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -10256,15 +10256,19 @@ static int hdd_features_init(struct hdd_context *hdd_ctx) struct sme_5g_band_pref_params band_pref_params; int ret; mac_handle_t mac_handle; + struct hdd_config *cfg; hdd_enter(); + cfg = hdd_ctx->config; /* FW capabilities received, Set the Dot11 mode */ mac_handle = hdd_ctx->mac_handle; sme_setdef_dot11mode(mac_handle); sme_set_prefer_80MHz_over_160MHz(mac_handle, hdd_ctx->config->sta_prefer_80MHz_over_160MHz); - + sme_set_etsi13_srd_ch_in_master_mode(mac_handle, + cfg-> + etsi13_srd_chan_in_master_mode); if (hdd_ctx->config->fIsImpsEnabled) hdd_set_idle_ps_config(hdd_ctx, true); diff --git a/core/hdd/src/wlan_hdd_oemdata.c b/core/hdd/src/wlan_hdd_oemdata.c index 8e38241a77..97587e69f7 100644 --- a/core/hdd/src/wlan_hdd_oemdata.c +++ b/core/hdd/src/wlan_hdd_oemdata.c @@ -403,8 +403,8 @@ void hdd_update_channel_bw_info(struct hdd_context *hdd_ctx, cds_chan_to_freq(ch_params.center_freq_seg0); if (ch_params.ch_width < CH_WIDTH_INVALID) - phy_mode = wma_chan_phy_mode(chan, - ch_params.ch_width, wni_dot11_mode); + phy_mode = wma_chan_phy_mode(chan, ch_params.ch_width, + wni_dot11_mode); else /* * If channel width is CH_WIDTH_INVALID, It mean channel is diff --git a/core/hdd/src/wlan_hdd_regulatory.c b/core/hdd/src/wlan_hdd_regulatory.c index 12cd93e990..d31b15d0ef 100644 --- a/core/hdd/src/wlan_hdd_regulatory.c +++ b/core/hdd/src/wlan_hdd_regulatory.c @@ -219,6 +219,8 @@ static void reg_program_config_vars(struct hdd_context *hdd_ctx, config_vars->band_capability = hdd_ctx->config->nBandCapability; config_vars->restart_beaconing = hdd_ctx->config-> restart_beaconing_on_chan_avoid_event; + config_vars->enable_srd_chan_in_master_mode = + hdd_ctx->config->etsi13_srd_chan_in_master_mode; } diff --git a/core/mac/inc/wni_cfg.h b/core/mac/inc/wni_cfg.h index 1e44ebc816..c00c12de1a 100644 --- a/core/mac/inc/wni_cfg.h +++ b/core/mac/inc/wni_cfg.h @@ -506,7 +506,7 @@ enum { #define WNI_CFG_LISTEN_INTERVAL_STADEF 1 #define WNI_CFG_CURRENT_CHANNEL_STAMIN 0 -#define WNI_CFG_CURRENT_CHANNEL_STAMAX 165 +#define WNI_CFG_CURRENT_CHANNEL_STAMAX 173 #define WNI_CFG_CURRENT_CHANNEL_STADEF 1 #define WNI_CFG_RATE_ADAPTATION_TYPE_FIXED 0 diff --git a/core/mac/src/pe/lim/lim_process_tdls.c b/core/mac/src/pe/lim/lim_process_tdls.c index 48ba41675a..60ff957a6c 100644 --- a/core/mac/src/pe/lim/lim_process_tdls.c +++ b/core/mac/src/pe/lim/lim_process_tdls.c @@ -251,7 +251,7 @@ static void populate_dot11f_tdls_offchannel_params( validChan[i], nss_5g, nss_2g); continue; } else { - if (WLAN_REG_IS_11P_CH(validChan[i])) { + if (wlan_reg_is_dsrc_chan(pMac->pdev, validChan[i])) { pe_debug("skipping channel: %d from the valid channel list", validChan[i]); continue; diff --git a/core/sap/inc/sap_api.h b/core/sap/inc/sap_api.h index c9fdd42c0c..8ad1a367f4 100644 --- a/core/sap/inc/sap_api.h +++ b/core/sap/inc/sap_api.h @@ -736,6 +736,7 @@ typedef struct tagSapStruct { #endif /* FEATURE_AP_MCC_CH_AVOIDANCE */ bool acs_with_more_param; bool enable_dfs_phy_error_logs; + bool enable_etsi13_srd_chan_support; } tSapStruct, *tpSapStruct; typedef struct sap_SoftapStats_s { diff --git a/core/sap/src/sap_ch_select.c b/core/sap/src/sap_ch_select.c index 5a08ec190a..83258a1efb 100644 --- a/core/sap/src/sap_ch_select.c +++ b/core/sap/src/sap_ch_select.c @@ -157,6 +157,8 @@ sapSafeChannelType safe_channels[NUM_CHANNELS] = { {157, true}, {161, true}, {165, true}, + {169, true}, + {173, true}, }; #endif @@ -689,7 +691,11 @@ static bool sap_chan_sel_init(tHalHandle halHandle, } /* Skip DSRC channels */ - if (WLAN_REG_IS_11P_CH(*pChans)) + if (wlan_reg_is_dsrc_chan(pMac->pdev, *pChans)) + continue; + + if (!pMac->sap.enable_etsi13_srd_chan_support && + wlan_reg_is_etsi13_srd_chan(pMac->pdev, *pChans)) continue; if (true == chSafe) { @@ -2112,7 +2118,7 @@ static void sap_sort_chl_weight_vht160(tSapChSelSpectInfo *pSpectInfoParams) /* * Assign max weight(SAP_ACS_WEIGHT_MAX * 8) to 2.4 Ghz channels - * and channel 132-165 as they cannot be part of a 160Mhz channel + * and channel 132-173 as they cannot be part of a 160Mhz channel * bonding. */ pSpectInfo = pSpectInfoParams->pSpectCh; @@ -2120,7 +2126,7 @@ static void sap_sort_chl_weight_vht160(tSapChSelSpectInfo *pSpectInfoParams) if ((pSpectInfo[j].chNum >= WLAN_REG_CH_NUM(CHAN_ENUM_1) && pSpectInfo[j].chNum <= WLAN_REG_CH_NUM(CHAN_ENUM_14)) || (pSpectInfo[j].chNum >= WLAN_REG_CH_NUM(CHAN_ENUM_132) && - pSpectInfo[j].chNum <= WLAN_REG_CH_NUM(CHAN_ENUM_165))) + pSpectInfo[j].chNum <= WLAN_REG_CH_NUM(CHAN_ENUM_173))) pSpectInfo[j].weight = SAP_ACS_WEIGHT_MAX * 8; } @@ -2181,7 +2187,7 @@ static void sap_allocate_max_weight_ht40_5_g( spect_info = spect_info_params->pSpectCh; for (j = 0; j < spect_info_params->numSpectChans; j++) { if ((spect_info[j].chNum >= WLAN_REG_CH_NUM(CHAN_ENUM_36) && - spect_info[j].chNum <= WLAN_REG_CH_NUM(CHAN_ENUM_165))) + spect_info[j].chNum <= WLAN_REG_CH_NUM(CHAN_ENUM_173))) spect_info[j].weight = SAP_ACS_WEIGHT_MAX * 2; } } diff --git a/core/sap/src/sap_fsm.c b/core/sap/src/sap_fsm.c index f7565ffb43..0c2884628f 100644 --- a/core/sap/src/sap_fsm.c +++ b/core/sap/src/sap_fsm.c @@ -3350,10 +3350,14 @@ static QDF_STATUS sap_get_channel_list(struct sap_context *sap_ctx, * - DFS scan disable but chan in CHANNEL_STATE_ENABLE */ if (!(((true == mac_ctx->scan.fEnableDFSChnlScan) && - wlan_reg_get_channel_state(mac_ctx->pdev, loop_count)) || + wlan_reg_get_channel_state(mac_ctx->pdev, + WLAN_REG_CH_NUM(loop_count))) + || ((false == mac_ctx->scan.fEnableDFSChnlScan) && (CHANNEL_STATE_ENABLE == - wlan_reg_get_channel_state(mac_ctx->pdev, loop_count))))) + wlan_reg_get_channel_state(mac_ctx->pdev, + WLAN_REG_CH_NUM(loop_count))) + ))) continue; /* @@ -3375,6 +3379,14 @@ static QDF_STATUS sap_get_channel_list(struct sap_context *sap_ctx, WLAN_REG_CH_NUM(loop_count))) continue; + /* Dont scan ETSI13 SRD channels if the ETSI13 SRD channels + * are not enabled in master mode + */ + if (!wlan_reg_is_etsi13_srd_chan_allowed_master_mode(mac_ctx-> + pdev) && + wlan_reg_is_etsi13_srd_chan(mac_ctx->pdev, + WLAN_REG_CH_NUM(loop_count))) + continue; /* * If we have any 5Ghz channel in the channel list * and bw is 40/80/160 Mhz then we don't want SAP to diff --git a/core/sap/src/sap_module.c b/core/sap/src/sap_module.c index 671833d329..cbd4ff1eeb 100644 --- a/core/sap/src/sap_module.c +++ b/core/sap/src/sap_module.c @@ -2323,18 +2323,22 @@ void wlansap_extend_to_acs_range(tHalHandle hal, uint8_t *startChannelNum, (*endChannelNum + ACS_2G_EXTEND) : 14; } else if (*startChannelNum >= 36 && *endChannelNum >= 36) { *bandStartChannel = CHAN_ENUM_36; - *bandEndChannel = CHAN_ENUM_165; + *bandEndChannel = CHAN_ENUM_173; tmp_startChannelNum = (*startChannelNum - ACS_5G_EXTEND) > 36 ? (*startChannelNum - ACS_5G_EXTEND) : 36; - tmp_endChannelNum = (*endChannelNum + ACS_5G_EXTEND) <= 165 ? - (*endChannelNum + ACS_5G_EXTEND) : 165; + tmp_endChannelNum = (*endChannelNum + ACS_5G_EXTEND) <= + WNI_CFG_CURRENT_CHANNEL_STAMAX ? + (*endChannelNum + ACS_5G_EXTEND) : + WNI_CFG_CURRENT_CHANNEL_STAMAX; } else { *bandStartChannel = CHAN_ENUM_1; - *bandEndChannel = CHAN_ENUM_165; + *bandEndChannel = CHAN_ENUM_173; tmp_startChannelNum = *startChannelNum > 5 ? (*startChannelNum - ACS_2G_EXTEND) : 1; - tmp_endChannelNum = (*endChannelNum + ACS_5G_EXTEND) <= 165 ? - (*endChannelNum + ACS_5G_EXTEND) : 165; + tmp_endChannelNum = (*endChannelNum + ACS_5G_EXTEND) <= + WNI_CFG_CURRENT_CHANNEL_STAMAX ? + (*endChannelNum + ACS_5G_EXTEND) : + WNI_CFG_CURRENT_CHANNEL_STAMAX; } /* Note if the ACS range include only DFS channels, do not cross range diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index a7b462b825..485bd0fcb7 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -1197,6 +1197,11 @@ QDF_STATUS sme_register_for_dcc_stats_event(tHalHandle hHal, void *context, ocb_callback callback); QDF_STATUS sme_deregister_for_dcc_stats_event(tHalHandle hHal); +static inline void +sme_set_etsi13_srd_ch_in_master_mode(tHalHandle hal, + bool etsi13_srd_chan_support) +{ +} #else static inline void sme_set_dot11p_config(tHalHandle hal, bool enable_dot11p) { @@ -1271,7 +1276,20 @@ static inline QDF_STATUS sme_deregister_for_dcc_stats_event(tHalHandle hHal) { return QDF_STATUS_SUCCESS; } + +/** + * sme_set_etsi13_srd_ch_in_master_mode() - master mode UNI-III band ch support + * @hal: HAL pointer + * @srd_chan_support: ETSI SRD channel support + * + * This function set master ETSI SRD channel support + * + * Return: None + */ +void sme_set_etsi13_srd_ch_in_master_mode(tHalHandle hal, + bool etsi13_srd_chan_support); #endif + void sme_add_set_thermal_level_callback(tHalHandle hal, sme_set_thermal_level_callback callback); diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index c5a0963e97..4eabd1f6ba 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -9373,6 +9373,16 @@ QDF_STATUS sme_deregister_for_dcc_stats_event(tHalHandle h_hal) return status; } +#else +void sme_set_etsi13_srd_ch_in_master_mode(tHalHandle hal, + bool etsi13_srd_chan_support) +{ + tpAniSirGlobal mac; + + mac = PMAC_STRUCT(hal); + mac->sap.enable_etsi13_srd_chan_support = etsi13_srd_chan_support; + sme_debug("srd_ch_support %d", mac->sap.enable_etsi13_srd_chan_support); +} #endif void sme_get_recovery_stats(tHalHandle hHal) diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index a434571fc9..9913139fdb 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -1035,8 +1035,8 @@ QDF_STATUS csr_update_channel_list(tpAniSirGlobal pMac) continue; /* Scan is not performed on DSRC channels*/ - if (pScan->base_channels.channelList[i] >= - WLAN_REG_MIN_11P_CH_NUM) + if (wlan_reg_is_dsrc_chan(pMac->pdev, + pScan->base_channels.channelList[i])) continue; channel = pScan->base_channels.channelList[i]; @@ -13561,7 +13561,7 @@ QDF_STATUS csr_get_cfg_valid_channels(tpAniSirGlobal pMac, uint8_t *pChannels, return QDF_STATUS_E_FAILURE; for (i = 0; i < *pNumChan; i++) { - if (!WLAN_REG_IS_11P_CH(pChannels[i])) { + if (!wlan_reg_is_dsrc_chan(pMac->pdev, pChannels[i])) { pChannels[num_chan_temp] = pChannels[i]; num_chan_temp++; } diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h index 7eb51329e0..29cc5c2db8 100644 --- a/core/wma/inc/wma.h +++ b/core/wma/inc/wma.h @@ -2268,7 +2268,7 @@ QDF_STATUS wma_get_cca_stats(tp_wma_handle wma_handle, struct wma_ini_config *wma_get_ini_handle(tp_wma_handle wma_handle); WLAN_PHY_MODE wma_chan_phy_mode(u8 chan, enum phy_ch_width chan_width, - u8 dot11_mode); + u8 dot11_mode); #ifdef FEATURE_OEM_DATA_SUPPORT QDF_STATUS wma_start_oem_data_req(tp_wma_handle wma_handle, diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index c1a67e449a..014bbbbfe3 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -666,6 +666,7 @@ WLAN_PHY_MODE wma_chan_phy_mode(u8 chan, enum phy_ch_width chan_width, { WLAN_PHY_MODE phymode = MODE_UNKNOWN; uint16_t bw_val = wlan_reg_get_bw_value(chan_width); + t_wma_handle *wma = cds_get_context(QDF_MODULE_ID_WMA); if (WLAN_REG_IS_24GHZ_CH(chan)) { if (((CH_WIDTH_5MHZ == chan_width) || @@ -717,7 +718,7 @@ WLAN_PHY_MODE wma_chan_phy_mode(u8 chan, enum phy_ch_width chan_width, break; } } - } else if (WLAN_REG_IS_11P_CH(chan)) + } else if (wlan_reg_is_dsrc_chan(wma->pdev, chan)) phymode = MODE_11A; else { if (((CH_WIDTH_5MHZ == chan_width) ||