diff --git a/drivers/staging/qca-wifi-host-cmn/dp/wifi3.0/dp_rx.c b/drivers/staging/qca-wifi-host-cmn/dp/wifi3.0/dp_rx.c index eebc90a648c0..352832d0b6c4 100644 --- a/drivers/staging/qca-wifi-host-cmn/dp/wifi3.0/dp_rx.c +++ b/drivers/staging/qca-wifi-host-cmn/dp/wifi3.0/dp_rx.c @@ -2808,8 +2808,15 @@ done: } /* Get TID from struct cb->tid_val, save to tid */ - if (qdf_nbuf_is_rx_chfrag_start(nbuf)) + if (qdf_nbuf_is_rx_chfrag_start(nbuf)) { tid = qdf_nbuf_get_tid_val(nbuf); + if (tid >= CDP_MAX_DATA_TIDS) { + DP_STATS_INC(soc, rx.err.rx_invalid_tid_err, 1); + qdf_nbuf_free(nbuf); + nbuf = next; + continue; + } + } if (qdf_unlikely(!peer)) { peer = dp_peer_get_ref_by_id(soc, peer_id, diff --git a/drivers/staging/qca-wifi-host-cmn/dp/wifi3.0/dp_stats.c b/drivers/staging/qca-wifi-host-cmn/dp/wifi3.0/dp_stats.c index b5356e6b5bee..84d3409cd460 100644 --- a/drivers/staging/qca-wifi-host-cmn/dp/wifi3.0/dp_stats.c +++ b/drivers/staging/qca-wifi-host-cmn/dp/wifi3.0/dp_stats.c @@ -6661,6 +6661,8 @@ dp_print_soc_rx_stats(struct dp_soc *soc) soc->stats.rx.rxdma2rel_route_drop); DP_PRINT_STATS("Reo2rel route drop:%d", soc->stats.rx.reo2rel_route_drop); + DP_PRINT_STATS("Rx invalid TID count:%d", + soc->stats.rx.err.rx_invalid_tid_err); } #ifdef FEATURE_TSO_STATS diff --git a/drivers/staging/qca-wifi-host-cmn/dp/wifi3.0/dp_types.h b/drivers/staging/qca-wifi-host-cmn/dp/wifi3.0/dp_types.h index 8dd06f7b1efb..637801776a70 100644 --- a/drivers/staging/qca-wifi-host-cmn/dp/wifi3.0/dp_types.h +++ b/drivers/staging/qca-wifi-host-cmn/dp/wifi3.0/dp_types.h @@ -1072,6 +1072,8 @@ struct dp_soc_stats { uint32_t peer_unauth_rx_pkt_drop; /* MSDU len err count */ uint32_t msdu_len_err; + /* Rx invalid tid count */ + uint32_t rx_invalid_tid_err; } err; /* packet count per core - per ring */ diff --git a/drivers/staging/qca-wifi-host-cmn/hif/src/hif_runtime_pm.c b/drivers/staging/qca-wifi-host-cmn/hif/src/hif_runtime_pm.c index b6f76644901b..4704cbab3088 100644 --- a/drivers/staging/qca-wifi-host-cmn/hif/src/hif_runtime_pm.c +++ b/drivers/staging/qca-wifi-host-cmn/hif/src/hif_runtime_pm.c @@ -1596,7 +1596,7 @@ int hif_runtime_lock_init(qdf_runtime_lock_t *lock, const char *name) { struct hif_pm_runtime_lock *context; - hif_info("Initializing Runtime PM wakelock %s", name); + hif_debug("Initializing Runtime PM wakelock %s", name); context = qdf_mem_malloc(sizeof(*context)); if (!context) @@ -1626,7 +1626,7 @@ void hif_runtime_lock_deinit(struct hif_opaque_softc *hif_ctx, return; } - hif_info("Deinitializing Runtime PM wakelock %s", context->name); + hif_debug("Deinitializing Runtime PM wakelock %s", context->name); /* * Ensure to delete the context list entry and reduce the usage count diff --git a/drivers/staging/qca-wifi-host-cmn/os_if/linux/qca_vendor.h b/drivers/staging/qca-wifi-host-cmn/os_if/linux/qca_vendor.h index 79c9f625a22b..cd800e6c3143 100644 --- a/drivers/staging/qca-wifi-host-cmn/os_if/linux/qca_vendor.h +++ b/drivers/staging/qca-wifi-host-cmn/os_if/linux/qca_vendor.h @@ -8471,6 +8471,14 @@ enum qca_wlan_vendor_attr_wifi_test_config { */ QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_6GHZ_SECURITY_TEST_MODE = 51, + /* 8-bit unsigned value to configure the driver to transmit data with + * ER SU PPDU type. + * + * 0 - Default behavior, 1 - Enable ER SU PPDU type TX. + * This attribute is used for testing purposes. + */ + QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ER_SU_PPDU_TYPE = 52, + /* keep last */ QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_AFTER_LAST, QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_MAX = diff --git a/drivers/staging/qca-wifi-host-cmn/umac/cmn_services/crypto/inc/wlan_crypto_global_api.h b/drivers/staging/qca-wifi-host-cmn/umac/cmn_services/crypto/inc/wlan_crypto_global_api.h index 49251a52c4b2..4f1eaf957603 100644 --- a/drivers/staging/qca-wifi-host-cmn/umac/cmn_services/crypto/inc/wlan_crypto_global_api.h +++ b/drivers/staging/qca-wifi-host-cmn/umac/cmn_services/crypto/inc/wlan_crypto_global_api.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -1068,7 +1069,7 @@ wlan_crypto_selective_clear_sae_single_pmk_entries( struct wlan_objmgr_vdev *vdev, struct qdf_mac_addr *conn_bssid); /** - * wlan_crypto_set_sae_single_pmk_bss_cap - Set the peer SAE sinlge pmk + * wlan_crypto_set_sae_single_pmk_bss_cap - Set the peer SAE single pmk * feature supported status * @vdev: Vdev * @bssid: BSSID for which the flag is to be set @@ -1078,6 +1079,16 @@ wlan_crypto_selective_clear_sae_single_pmk_entries( void wlan_crypto_set_sae_single_pmk_bss_cap(struct wlan_objmgr_vdev *vdev, struct qdf_mac_addr *bssid, bool single_pmk_capable_bss); + +/** + * wlan_crypto_set_sae_single_pmk_info - Set the peer SAE single pmk info + * @vdev: Vdev + * @roam_sync_pmksa: pmk info for roamed AP + */ +void +wlan_crypto_set_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev, + struct wlan_crypto_pmksa *roam_sync_pmksa); + #else static inline void wlan_crypto_selective_clear_sae_single_pmk_entries( @@ -1091,6 +1102,12 @@ void wlan_crypto_set_sae_single_pmk_bss_cap(struct wlan_objmgr_vdev *vdev, bool single_pmk_capable_bss) { } + +static inline void +wlan_crypto_set_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev, + struct wlan_crypto_pmksa *roam_sync_pmksa) +{ +} #endif #ifdef WLAN_FEATURE_FILS_SK diff --git a/drivers/staging/qca-wifi-host-cmn/umac/cmn_services/crypto/src/wlan_crypto_global_api.c b/drivers/staging/qca-wifi-host-cmn/umac/cmn_services/crypto/src/wlan_crypto_global_api.c index 72649ff046a2..6b496baa3dbf 100644 --- a/drivers/staging/qca-wifi-host-cmn/umac/cmn_services/crypto/src/wlan_crypto_global_api.c +++ b/drivers/staging/qca-wifi-host-cmn/umac/cmn_services/crypto/src/wlan_crypto_global_api.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -4675,6 +4676,42 @@ void wlan_crypto_set_sae_single_pmk_bss_cap(struct wlan_objmgr_vdev *vdev, single_pmk_capable_bss; } } + +void +wlan_crypto_set_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev, + struct wlan_crypto_pmksa *roam_sync_pmksa) +{ + struct wlan_crypto_params *crypto_params; + struct wlan_crypto_comp_priv *crypto_priv; + int i; + + crypto_priv = (struct wlan_crypto_comp_priv *) + wlan_get_vdev_crypto_obj(vdev); + + if (!crypto_priv) { + crypto_err("crypto_priv NULL"); + return; + } + + crypto_params = &crypto_priv->crypto_params; + + for (i = 0; i < WLAN_CRYPTO_MAX_PMKID; i++) { + if (!crypto_params->pmksa[i]) + continue; + if (qdf_is_macaddr_equal(&roam_sync_pmksa->bssid, + &crypto_params->pmksa[i]->bssid) && + roam_sync_pmksa->single_pmk_supported && + roam_sync_pmksa->pmk_len) { + crypto_params->pmksa[i]->single_pmk_supported = + roam_sync_pmksa->single_pmk_supported; + crypto_params->pmksa[i]->pmk_len = + roam_sync_pmksa->pmk_len; + qdf_mem_copy(crypto_params->pmksa[i]->pmk, + roam_sync_pmksa->pmk, + roam_sync_pmksa->pmk_len); + } + } +} #endif void wlan_crypto_reset_vdev_params(struct wlan_objmgr_vdev *vdev) diff --git a/drivers/staging/qca-wifi-host-cmn/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c b/drivers/staging/qca-wifi-host-cmn/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c index 0b36790db167..d35c7a9452c5 100644 --- a/drivers/staging/qca-wifi-host-cmn/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c +++ b/drivers/staging/qca-wifi-host-cmn/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -1415,7 +1416,7 @@ QDF_STATUS wlan_vdev_get_bss_peer_mac(struct wlan_objmgr_vdev *vdev, peer = wlan_objmgr_vdev_try_get_bsspeer(vdev, WLAN_MLME_OBJMGR_ID); if (!peer) { - obj_mgr_err("not able to find bss peer for vdev %d", + obj_mgr_debug("not able to find bss peer for vdev %d", wlan_vdev_get_id(vdev)); return QDF_STATUS_E_INVAL; } diff --git a/drivers/staging/qca-wifi-host-cmn/umac/regulatory/core/src/reg_build_chan_list.c b/drivers/staging/qca-wifi-host-cmn/umac/regulatory/core/src/reg_build_chan_list.c index d20271009038..f6e70bd26ead 100644 --- a/drivers/staging/qca-wifi-host-cmn/umac/regulatory/core/src/reg_build_chan_list.c +++ b/drivers/staging/qca-wifi-host-cmn/umac/regulatory/core/src/reg_build_chan_list.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -1019,12 +1020,118 @@ reg_modify_disable_chan_list_for_unii1_and_unii2a( #ifdef CONFIG_BAND_6GHZ #ifdef CONFIG_REG_CLIENT + +#ifdef CONFIG_AFC_SUPPORT +/** + * reg_append_mas_chan_list_for_6g_sp() - Append SP channels to the master + * channel list + * @pdev_priv_obj: Pointer to pdev private object + * + * This function appends SP channels to the master channel list + * + * Return: void. + */ +static void +reg_append_mas_chan_list_for_6g_sp(struct wlan_regulatory_pdev_priv_obj + *pdev_priv_obj) +{ + struct regulatory_channel *master_chan_list_6g_client_sp; + + master_chan_list_6g_client_sp = pdev_priv_obj->afc_chan_list; + + qdf_mem_copy(&pdev_priv_obj->mas_chan_list[MIN_6GHZ_CHANNEL], + master_chan_list_6g_client_sp, + NUM_6GHZ_CHANNELS * + sizeof(struct regulatory_channel)); +} +#else +static inline void +reg_append_mas_chan_list_for_6g_sp(struct wlan_regulatory_pdev_priv_obj + *pdev_priv_obj) +{ +} +#endif + +/** + * reg_append_mas_chan_list_for_6g_lpi() - Append LPI channels to the master + * channel list + * @pdev_priv_obj: Pointer to pdev private object + * + * This function appends LPI channels to the master channel list + * + * Return: void. + */ +static void +reg_append_mas_chan_list_for_6g_lpi(struct wlan_regulatory_pdev_priv_obj + *pdev_priv_obj) +{ + struct regulatory_channel *master_chan_list_6g_client_lpi; + uint8_t i, j; + + if (!pdev_priv_obj->reg_rules.num_of_6g_ap_reg_rules[REG_INDOOR_AP]) { + reg_debug("No LPI reg rules"); + return; + } + + master_chan_list_6g_client_lpi = + pdev_priv_obj->mas_chan_list_6g_client[REG_INDOOR_AP] + [pdev_priv_obj->reg_cur_6g_client_mobility_type]; + + for (i = MIN_6GHZ_CHANNEL, j = 0; + i <= MAX_6GHZ_CHANNEL && j < NUM_6GHZ_CHANNELS; i++, j++) { + if ((pdev_priv_obj->mas_chan_list[i].state == + CHANNEL_STATE_DISABLE) || + (pdev_priv_obj->mas_chan_list[i].chan_flags & + REGULATORY_CHAN_DISABLED)) { + qdf_mem_copy(&pdev_priv_obj->mas_chan_list[i], + &master_chan_list_6g_client_lpi[j], + sizeof(struct regulatory_channel)); + } + } +} + +/** + * reg_append_mas_chan_list_for_6g_VLP() - Append VLP channels to the master + * channel list + * @pdev_priv_obj: Pointer to pdev private object + * + * This function appends VLP channels to the master channel list + * + * Return: void. + */ +static void +reg_append_mas_chan_list_for_6g_vlp(struct wlan_regulatory_pdev_priv_obj + *pdev_priv_obj) +{ + struct regulatory_channel *master_chan_list_6g_client_vlp; + uint8_t i, j; + + if (!pdev_priv_obj->reg_rules.num_of_6g_ap_reg_rules[REG_VERY_LOW_POWER_AP]) { + reg_debug("No VLP reg rules"); + return; + } + + master_chan_list_6g_client_vlp = + pdev_priv_obj->mas_chan_list_6g_client[REG_VERY_LOW_POWER_AP] + [pdev_priv_obj->reg_cur_6g_client_mobility_type]; + + for (i = MIN_6GHZ_CHANNEL, j = 0; + i <= MAX_6GHZ_CHANNEL && j < NUM_6GHZ_CHANNELS; i++, j++) { + if ((pdev_priv_obj->mas_chan_list[i].state == + CHANNEL_STATE_DISABLE) || + (pdev_priv_obj->mas_chan_list[i].chan_flags & + REGULATORY_CHAN_DISABLED)) { + qdf_mem_copy(&pdev_priv_obj->mas_chan_list[i], + &master_chan_list_6g_client_vlp[j], + sizeof(struct regulatory_channel)); + } + } +} + static void reg_append_mas_chan_list_for_6g(struct wlan_regulatory_pdev_priv_obj *pdev_priv_obj) { - struct regulatory_channel *master_chan_list_6g_client; - if (pdev_priv_obj->reg_cur_6g_ap_pwr_type >= REG_CURRENT_MAX_AP_TYPE || pdev_priv_obj->reg_cur_6g_client_mobility_type >= REG_MAX_CLIENT_TYPE) { @@ -1032,14 +1139,20 @@ reg_append_mas_chan_list_for_6g(struct wlan_regulatory_pdev_priv_obj return; } - master_chan_list_6g_client = - pdev_priv_obj->mas_chan_list_6g_client[REG_INDOOR_AP] - [pdev_priv_obj->reg_cur_6g_client_mobility_type]; + /* Client should be able to scan all types of APs, so prepare the + * client list which has all the enabled channels, first priority is + * given to AFC power type and then second priority is decided based on + * gindoor_channel_support ini value + */ + reg_append_mas_chan_list_for_6g_sp(pdev_priv_obj); - qdf_mem_copy(&pdev_priv_obj->mas_chan_list[MIN_6GHZ_CHANNEL], - master_chan_list_6g_client, - NUM_6GHZ_CHANNELS * - sizeof(struct regulatory_channel)); + if (pdev_priv_obj->indoor_chan_enabled) { + reg_append_mas_chan_list_for_6g_lpi(pdev_priv_obj); + reg_append_mas_chan_list_for_6g_vlp(pdev_priv_obj); + } else { + reg_append_mas_chan_list_for_6g_vlp(pdev_priv_obj); + reg_append_mas_chan_list_for_6g_lpi(pdev_priv_obj); + } } static void diff --git a/drivers/staging/qca-wifi-host-cmn/wmi/inc/wmi_unified_param.h b/drivers/staging/qca-wifi-host-cmn/wmi/inc/wmi_unified_param.h index 0fa5f924d1c1..fef218d11b82 100644 --- a/drivers/staging/qca-wifi-host-cmn/wmi/inc/wmi_unified_param.h +++ b/drivers/staging/qca-wifi-host-cmn/wmi/inc/wmi_unified_param.h @@ -2655,12 +2655,14 @@ struct set_fwtest_params { * @WFA_CONFIG_CSA: configure the driver to ignore CSA * @WFA_CONFIG_OCV: configure OCI * @WFA_CONFIG_SA_QUERY: configure driver/firmware to ignore SAquery timeout + * @WFA_FILS_DISCV_FRAMES: FD frames TX enable disable config */ enum wfa_test_cmds { WFA_CONFIG_RXNE, WFA_CONFIG_CSA, WFA_CONFIG_OCV, WFA_CONFIG_SA_QUERY, + WFA_FILS_DISCV_FRAMES, }; /** diff --git a/drivers/staging/qca-wifi-host-cmn/wmi/src/wmi_unified_nan_tlv.c b/drivers/staging/qca-wifi-host-cmn/wmi/src/wmi_unified_nan_tlv.c index de5706c8f514..04e1867401e8 100644 --- a/drivers/staging/qca-wifi-host-cmn/wmi/src/wmi_unified_nan_tlv.c +++ b/drivers/staging/qca-wifi-host-cmn/wmi/src/wmi_unified_nan_tlv.c @@ -75,18 +75,21 @@ extract_nan_event_rsp_tlv(wmi_unified_t wmi_handle, void *evt_buf, } nan_msg_hdr = (nan_msg_header_t *)event->data; - if (!wmi_service_enabled(wmi_handle, wmi_service_nan_dbs_support) && - !wmi_service_enabled(wmi_handle, wmi_service_nan_disable_support)) { - evt_params->evt_type = nan_event_id_generic_rsp; - return QDF_STATUS_SUCCESS; - } - switch (nan_msg_hdr->msg_id) { case NAN_MSG_ID_ENABLE_RSP: nan_evt_info = event->event_info; if (!nan_evt_info) { - wmi_err("Fail: NAN enable rsp event info Null"); - return QDF_STATUS_E_INVAL; + if (!wmi_service_enabled(wmi_handle, + wmi_service_nan_dbs_support) && + !wmi_service_enabled(wmi_handle, + wmi_service_nan_disable_support + )) { + evt_params->evt_type = nan_event_id_generic_rsp; + break; + } else { + wmi_err("Fail: NAN enable rsp event info Null"); + return QDF_STATUS_E_INVAL; + } } evt_params->evt_type = nan_event_id_enable_rsp; evt_params->mac_id = nan_evt_info->mac_id;