diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c index 6b8d6841655f..4fd7804c29a9 100644 --- a/core/hdd/src/wlan_hdd_cfg.c +++ b/core/hdd/src/wlan_hdd_cfg.c @@ -6352,6 +6352,9 @@ void hdd_cfg_print(hdd_context_t *pHddCtx) hdd_debug("Name = [%s] value = [%u]", CFG_RANDOMIZE_NDI_MAC_NAME, pHddCtx->config->is_ndi_mac_randomized); + hdd_debug("Name = [%s] value = [%u]", + CFG_DOT11P_MODE_NAME, + pHddCtx->config->dot11p_mode); } diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 65de39ba2fd6..e6682a5c3595 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -248,6 +248,9 @@ static const struct ieee80211_channel hdd_channels_5_ghz[] = { HDD5GHZCHAN(5785, 157, 0), HDD5GHZCHAN(5805, 161, 0), HDD5GHZCHAN(5825, 165, 0), +}; + +static const struct ieee80211_channel hdd_channels_dot11p[] = { HDD5GHZCHAN(5852, 170, 0), HDD5GHZCHAN(5855, 171, 0), HDD5GHZCHAN(5860, 172, 0), @@ -12049,6 +12052,7 @@ int wlan_hdd_cfg80211_init(struct device *dev, { int i, j; hdd_context_t *pHddCtx = wiphy_priv(wiphy); + int len = 0; ENTER(); @@ -12180,18 +12184,41 @@ 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; - wiphy->bands[HDD_NL80211_BAND_5GHZ]->channels = + + 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); + + 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) { - hdd_err("Not enough memory to allocate channels"); - qdf_mem_free(wiphy-> - bands[HDD_NL80211_BAND_2GHZ]->channels); - wiphy->bands[HDD_NL80211_BAND_2GHZ]->channels = NULL; - return -ENOMEM; + 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], - sizeof(hdd_channels_5_ghz)); } for (i = 0; i < HDD_NUM_NL80211_BANDS; i++) { @@ -12266,6 +12293,14 @@ int wlan_hdd_cfg80211_init(struct device *dev, EXIT(); return 0; + +mem_fail: + hdd_err("Not enough memory to allocate channels"); + if (wiphy->bands[HDD_NL80211_BAND_2GHZ]->channels != NULL) { + qdf_mem_free(wiphy->bands[HDD_NL80211_BAND_2GHZ]->channels); + wiphy->bands[HDD_NL80211_BAND_2GHZ]->channels = NULL; + } + return -ENOMEM; } /**