diff --git a/drivers/net/wireless/intel/iwlwifi/fw/file.h b/drivers/net/wireless/intel/iwlwifi/fw/file.h index 197c88c25f72..a26ed82a8106 100644 --- a/drivers/net/wireless/intel/iwlwifi/fw/file.h +++ b/drivers/net/wireless/intel/iwlwifi/fw/file.h @@ -112,6 +112,7 @@ enum iwl_ucode_tlv_type { IWL_UCODE_TLV_FW_NUM_LINKS = IWL_UCODE_TLV_CONST_BASE + 1, IWL_UCODE_TLV_FW_NUM_BEACONS = IWL_UCODE_TLV_CONST_BASE + 2, IWL_UCODE_TLV_FW_NUM_MCAST_KEY_ENTRIES = IWL_UCODE_TLV_CONST_BASE + 3, + IWL_UCODE_TLV_FW_NAN_MAX_CHAN_SWITCH_TIME = IWL_UCODE_TLV_CONST_BASE + 4, IWL_UCODE_TLV_TYPE_DEBUG_INFO = IWL_UCODE_TLV_DEBUG_BASE + 0, IWL_UCODE_TLV_TYPE_BUFFER_ALLOCATION = IWL_UCODE_TLV_DEBUG_BASE + 1, diff --git a/drivers/net/wireless/intel/iwlwifi/fw/img.h b/drivers/net/wireless/intel/iwlwifi/fw/img.h index 75b1344f6cbe..95b45a253641 100644 --- a/drivers/net/wireless/intel/iwlwifi/fw/img.h +++ b/drivers/net/wireless/intel/iwlwifi/fw/img.h @@ -54,6 +54,7 @@ struct iwl_ucode_capabilities { u32 num_links; u32 num_beacons; u32 num_mcast_key_entries; + u16 nan_max_chan_switch_time; DECLARE_BITMAP(_api, NUM_IWL_UCODE_TLV_API); DECLARE_BITMAP(_capa, NUM_IWL_UCODE_TLV_CAPA); diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c index 488524529538..842586d4fc5c 100644 --- a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c +++ b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c @@ -1337,6 +1337,12 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv, capa->num_mcast_key_entries = le32_to_cpup((const __le32 *)tlv_data); break; + case IWL_UCODE_TLV_FW_NAN_MAX_CHAN_SWITCH_TIME: + if (tlv_len != sizeof(u32)) + goto invalid_tlv_len; + capa->nan_max_chan_switch_time = + le32_to_cpup((const __le32 *)tlv_data); + break; case IWL_UCODE_TLV_UMAC_DEBUG_ADDRS: { const struct iwl_umac_debug_addrs *dbg_ptrs = (const void *)tlv_data; diff --git a/drivers/net/wireless/intel/iwlwifi/mld/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mld/mac80211.c index 92858b8f7395..56e0c19e0f81 100644 --- a/drivers/net/wireless/intel/iwlwifi/mld/mac80211.c +++ b/drivers/net/wireless/intel/iwlwifi/mld/mac80211.c @@ -291,8 +291,13 @@ static void iwl_mld_hw_set_nan(struct iwl_mld *mld) NAN_DEV_CAPA_NUM_RX_ANT_POS) & NAN_DEV_CAPA_NUM_RX_ANT_MASK); - /* Maximal channel switch time is 4 msec */ - hw->wiphy->nan_capa.max_channel_switch_time = 4 * USEC_PER_MSEC; + /* Maximal channel switch time - use FW TLV value if available */ + if (mld->fw->ucode_capa.nan_max_chan_switch_time) + hw->wiphy->nan_capa.max_channel_switch_time = + mld->fw->ucode_capa.nan_max_chan_switch_time; + else + hw->wiphy->nan_capa.max_channel_switch_time = + 4 * USEC_PER_MSEC; hw->wiphy->nan_capa.phy.ht = mld->nvm_data->nan_phy_capa.ht; hw->wiphy->nan_capa.phy.vht = mld->nvm_data->nan_phy_capa.vht;