diff --git a/os_if/linux/qca_vendor.h b/os_if/linux/qca_vendor.h index 2508e3ace88a..0e2568cda2b2 100644 --- a/os_if/linux/qca_vendor.h +++ b/os_if/linux/qca_vendor.h @@ -4823,6 +4823,19 @@ enum qca_wlan_vendor_attr_config { */ QCA_WLAN_VENDOR_ATTR_CONFIG_FT_OVER_DS = 80, + /* + * 8-bit unsigned value. This attribute can be used to configure the + * firmware to enable/disable ARP/NS offload feature. Possible values + * for this attribute are 0-Disable and 1-Enable. + * + * This attribute is only applicable for STA/P2P-Client interface, + * and is optional, default behavior is APR/NS offload Enable. + * + * This attribute can be set in disconncted and connected state, and + * will restore to default behavior if interface is closed. + */ + QCA_WLAN_VENDOR_ATTR_CONFIG_ARP_NS_OFFLOAD = 81, + /* 8-bit unsigned value, whenever wifi calling (wfc) begin or end, * Userspace sends this information to driver/firmware to configure * wfc state. Driver/Firmware uses this information to diff --git a/umac/regulatory/core/src/reg_build_chan_list.c b/umac/regulatory/core/src/reg_build_chan_list.c index 825d03469a52..6059b406d57b 100644 --- a/umac/regulatory/core/src/reg_build_chan_list.c +++ b/umac/regulatory/core/src/reg_build_chan_list.c @@ -722,7 +722,9 @@ static void reg_modify_chan_list_for_cached_channels( { uint32_t i, j; uint32_t num_cache_channels = pdev_priv_obj->num_cache_channels; - struct regulatory_channel *chan_list = pdev_priv_obj->cur_chan_list; + struct regulatory_channel *cur_chan_list = pdev_priv_obj->cur_chan_list; + struct regulatory_channel *sec_chan_list = + pdev_priv_obj->secondary_cur_chan_list; struct regulatory_channel *cache_chan_list = pdev_priv_obj->cache_disable_chan_list; @@ -730,15 +732,24 @@ static void reg_modify_chan_list_for_cached_channels( return; if (pdev_priv_obj->disable_cached_channels) { - for (i = 0; i < num_cache_channels; i++) - for (j = 0; j < NUM_CHANNELS; j++) + for (i = 0; i < num_cache_channels; i++) { + for (j = 0; j < NUM_CHANNELS; j++) { if (cache_chan_list[i].center_freq == - chan_list[j].center_freq) { - chan_list[j].state = + cur_chan_list[j].center_freq) { + cur_chan_list[j].state = CHANNEL_STATE_DISABLE; - chan_list[j].chan_flags |= + cur_chan_list[j].chan_flags |= REGULATORY_CHAN_DISABLED; } + if (cache_chan_list[i].center_freq == + sec_chan_list[j].center_freq) { + sec_chan_list[j].state = + CHANNEL_STATE_DISABLE; + sec_chan_list[j].chan_flags |= + REGULATORY_CHAN_DISABLED; + } + } + } } } #else @@ -1278,8 +1289,6 @@ void reg_compute_pdev_current_chan_list(struct wlan_regulatory_pdev_priv_obj reg_modify_chan_list_for_chan_144(pdev_priv_obj->cur_chan_list, pdev_priv_obj->en_chan_144); - reg_modify_chan_list_for_cached_channels(pdev_priv_obj); - reg_modify_chan_list_for_srd_channels(pdev_priv_obj->pdev_ptr, pdev_priv_obj->cur_chan_list); @@ -1292,6 +1301,8 @@ void reg_compute_pdev_current_chan_list(struct wlan_regulatory_pdev_priv_obj cur_chan_list); reg_populate_secondary_cur_chan_list(pdev_priv_obj); + + reg_modify_chan_list_for_cached_channels(pdev_priv_obj); } void reg_reset_reg_rules(struct reg_rule_info *reg_rules)