diff options
Diffstat (limited to 'drivers/net/wireless/intel/iwlwifi/mvm/ops.c')
| -rw-r--r-- | drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 90 | 
1 files changed, 37 insertions, 53 deletions
| diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c index 53283d052e18..b7dcae76a05d 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c @@ -18,7 +18,7 @@  #include "iwl-modparams.h"  #include "mvm.h"  #include "iwl-phy-db.h" -#include "iwl-eeprom-parse.h" +#include "iwl-nvm-utils.h"  #include "iwl-csr.h"  #include "iwl-io.h"  #include "iwl-prph.h" @@ -41,12 +41,8 @@ static const struct iwl_op_mode_ops iwl_mvm_ops_mq;  struct iwl_mvm_mod_params iwlmvm_mod_params = {  	.power_scheme = IWL_POWER_SCHEME_BPS, -	/* rest of fields are 0 by default */  }; -module_param_named(init_dbg, iwlmvm_mod_params.init_dbg, bool, 0444); -MODULE_PARM_DESC(init_dbg, -		 "set to true to debug an ASSERT in INIT fw (default: false");  module_param_named(power_scheme, iwlmvm_mod_params.power_scheme, int, 0444);  MODULE_PARM_DESC(power_scheme,  		 "power management scheme: 1-active, 2-balanced, 3-low power, default: 2"); @@ -153,7 +149,7 @@ static void iwl_mvm_rx_esr_mode_notif(struct iwl_mvm *mvm,  	struct ieee80211_vif *vif = iwl_mvm_get_bss_vif(mvm);  	/* FW recommendations is only for entering EMLSR */ -	if (!vif || iwl_mvm_vif_from_mac80211(vif)->esr_active) +	if (IS_ERR_OR_NULL(vif) || iwl_mvm_vif_from_mac80211(vif)->esr_active)  		return;  	if (le32_to_cpu(notif->action) == ESR_RECOMMEND_ENTER) @@ -471,7 +467,7 @@ static const struct iwl_rx_handlers iwl_mvm_rx_handlers[] = {  		       iwl_mvm_time_sync_msmt_confirm_event, RX_HANDLER_SYNC,  		       struct iwl_time_msmt_cfm_notify),  	RX_HANDLER_GRP(MAC_CONF_GROUP, ROC_NOTIF, -		       iwl_mvm_rx_roc_notif, RX_HANDLER_SYNC, +		       iwl_mvm_rx_roc_notif, RX_HANDLER_ASYNC_LOCKED,  		       struct iwl_roc_notif),  	RX_HANDLER_GRP(SCAN_GROUP, CHANNEL_SURVEY_NOTIF,  		       iwl_mvm_rx_channel_survey_notif, RX_HANDLER_ASYNC_LOCKED, @@ -572,6 +568,7 @@ static const struct iwl_hcmd_names iwl_mvm_legacy_names[] = {  	HCMD_NAME(D0I3_END_CMD),  	HCMD_NAME(LTR_CONFIG),  	HCMD_NAME(LDBG_CONFIG_CMD), +	HCMD_NAME(DEBUG_LOG_MSG),  };  /* Please keep this array *SORTED* by hex value. @@ -579,6 +576,7 @@ static const struct iwl_hcmd_names iwl_mvm_legacy_names[] = {   */  static const struct iwl_hcmd_names iwl_mvm_system_names[] = {  	HCMD_NAME(SHARED_MEM_CFG_CMD), +	HCMD_NAME(SOC_CONFIGURATION_CMD),  	HCMD_NAME(INIT_EXTENDED_CFG_CMD),  	HCMD_NAME(FW_ERROR_RECOVERY_CMD),  	HCMD_NAME(RFI_CONFIG_CMD), @@ -593,8 +591,10 @@ static const struct iwl_hcmd_names iwl_mvm_system_names[] = {   * Access is done through binary search   */  static const struct iwl_hcmd_names iwl_mvm_mac_conf_names[] = { +	HCMD_NAME(LOW_LATENCY_CMD),  	HCMD_NAME(CHANNEL_SWITCH_TIME_EVENT_CMD),  	HCMD_NAME(SESSION_PROTECTION_CMD), +	HCMD_NAME(CANCEL_CHANNEL_SWITCH_CMD),  	HCMD_NAME(MAC_CONFIG_CMD),  	HCMD_NAME(LINK_CONFIG_CMD),  	HCMD_NAME(STA_CONFIG_CMD), @@ -603,7 +603,10 @@ static const struct iwl_hcmd_names iwl_mvm_mac_conf_names[] = {  	HCMD_NAME(STA_DISABLE_TX_CMD),  	HCMD_NAME(ROC_CMD),  	HCMD_NAME(ROC_NOTIF), +	HCMD_NAME(CHANNEL_SWITCH_ERROR_NOTIF), +	HCMD_NAME(MISSED_VAP_NOTIF),  	HCMD_NAME(SESSION_PROTECTION_NOTIF), +	HCMD_NAME(PROBE_RESPONSE_DATA_NOTIF),  	HCMD_NAME(CHANNEL_SWITCH_START_NOTIF),  }; @@ -627,6 +630,8 @@ static const struct iwl_hcmd_names iwl_mvm_data_path_names[] = {  	HCMD_NAME(DQA_ENABLE_CMD),  	HCMD_NAME(UPDATE_MU_GROUPS_CMD),  	HCMD_NAME(TRIGGER_RX_QUEUES_NOTIF_CMD), +	HCMD_NAME(WNM_PLATFORM_PTM_REQUEST_CMD), +	HCMD_NAME(WNM_80211V_TIMING_MEASUREMENT_CONFIG_CMD),  	HCMD_NAME(STA_HE_CTXT_CMD),  	HCMD_NAME(RLC_CONFIG_CMD),  	HCMD_NAME(RFH_QUEUE_CONFIG_CMD), @@ -653,6 +658,21 @@ static const struct iwl_hcmd_names iwl_mvm_statistics_names[] = {  /* Please keep this array *SORTED* by hex value.   * Access is done through binary search   */ +static const struct iwl_hcmd_names iwl_mvm_debug_names[] = { +	HCMD_NAME(LMAC_RD_WR), +	HCMD_NAME(UMAC_RD_WR), +	HCMD_NAME(HOST_EVENT_CFG), +	HCMD_NAME(DBGC_SUSPEND_RESUME), +	HCMD_NAME(BUFFER_ALLOCATION), +	HCMD_NAME(GET_TAS_STATUS), +	HCMD_NAME(FW_DUMP_COMPLETE_CMD), +	HCMD_NAME(FW_CLEAR_BUFFER), +	HCMD_NAME(MFU_ASSERT_DUMP_NTF), +}; + +/* Please keep this array *SORTED* by hex value. + * Access is done through binary search + */  static const struct iwl_hcmd_names iwl_mvm_scan_names[] = {  	HCMD_NAME(CHANNEL_SURVEY_NOTIF),  	HCMD_NAME(OFFLOAD_MATCH_INFO_NOTIF), @@ -705,6 +725,7 @@ static const struct iwl_hcmd_arr iwl_mvm_groups[] = {  	[PROT_OFFLOAD_GROUP] = HCMD_ARR(iwl_mvm_prot_offload_names),  	[REGULATORY_AND_NVM_GROUP] =  		HCMD_ARR(iwl_mvm_regulatory_and_nvm_names), +	[DEBUG_GROUP] = HCMD_ARR(iwl_mvm_debug_names),  	[STATISTICS_GROUP] = HCMD_ARR(iwl_mvm_statistics_names),  }; @@ -740,20 +761,18 @@ static void iwl_mvm_tx_unblock_dwork(struct work_struct *work)  	struct ieee80211_vif *tx_blocked_vif;  	struct iwl_mvm_vif *mvmvif; -	mutex_lock(&mvm->mutex); +	guard(mvm)(mvm);  	tx_blocked_vif =  		rcu_dereference_protected(mvm->csa_tx_blocked_vif,  					  lockdep_is_held(&mvm->mutex));  	if (!tx_blocked_vif) -		goto unlock; +		return;  	mvmvif = iwl_mvm_vif_from_mac80211(tx_blocked_vif);  	iwl_mvm_modify_all_sta_disable_tx(mvm, mvmvif, false);  	RCU_INIT_POINTER(mvm->csa_tx_blocked_vif, NULL); -unlock: -	mutex_unlock(&mvm->mutex);  }  static void iwl_mvm_fwrt_dump_start(void *ctx) @@ -770,21 +789,12 @@ static void iwl_mvm_fwrt_dump_end(void *ctx)  	mutex_unlock(&mvm->mutex);  } -static bool iwl_mvm_fwrt_fw_running(void *ctx) -{ -	return iwl_mvm_firmware_running(ctx); -} -  static int iwl_mvm_fwrt_send_hcmd(void *ctx, struct iwl_host_cmd *host_cmd)  {  	struct iwl_mvm *mvm = (struct iwl_mvm *)ctx; -	int ret; -	mutex_lock(&mvm->mutex); -	ret = iwl_mvm_send_cmd(mvm, host_cmd); -	mutex_unlock(&mvm->mutex); - -	return ret; +	guard(mvm)(mvm); +	return iwl_mvm_send_cmd(mvm, host_cmd);  }  static bool iwl_mvm_d3_debug_enable(void *ctx) @@ -795,7 +805,6 @@ static bool iwl_mvm_d3_debug_enable(void *ctx)  static const struct iwl_fw_runtime_ops iwl_mvm_fwrt_ops = {  	.dump_start = iwl_mvm_fwrt_dump_start,  	.dump_end = iwl_mvm_fwrt_dump_end, -	.fw_running = iwl_mvm_fwrt_fw_running,  	.send_hcmd = iwl_mvm_fwrt_send_hcmd,  	.d3_debug_enable = iwl_mvm_d3_debug_enable,  }; @@ -851,8 +860,7 @@ get_nvm_from_fw:  		ret = iwl_mvm_init_mcc(mvm);  	} -	if (!iwlmvm_mod_params.init_dbg || !ret) -		iwl_mvm_stop_device(mvm); +	iwl_mvm_stop_device(mvm);  	mutex_unlock(&mvm->mutex);  	wiphy_unlock(mvm->hw->wiphy); @@ -862,7 +870,7 @@ get_nvm_from_fw:  		IWL_ERR(mvm, "Failed to run INIT ucode: %d\n", ret);  	/* no longer need this regardless of failure or not */ -	mvm->pldr_sync = false; +	mvm->fw_product_reset = false;  	return ret;  } @@ -1360,24 +1368,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,  	trans_cfg.no_reclaim_cmds = no_reclaim_cmds;  	trans_cfg.n_no_reclaim_cmds = ARRAY_SIZE(no_reclaim_cmds); -	switch (iwlwifi_mod_params.amsdu_size) { -	case IWL_AMSDU_DEF: -		trans_cfg.rx_buf_size = IWL_AMSDU_4K; -		break; -	case IWL_AMSDU_4K: -		trans_cfg.rx_buf_size = IWL_AMSDU_4K; -		break; -	case IWL_AMSDU_8K: -		trans_cfg.rx_buf_size = IWL_AMSDU_8K; -		break; -	case IWL_AMSDU_12K: -		trans_cfg.rx_buf_size = IWL_AMSDU_12K; -		break; -	default: -		pr_err("%s: Unsupported amsdu_size: %d\n", KBUILD_MODNAME, -		       iwlwifi_mod_params.amsdu_size); -		trans_cfg.rx_buf_size = IWL_AMSDU_4K; -	} +	trans_cfg.rx_buf_size = iwl_amsdu_size_to_rxb_size();  	trans->wide_cmd_header = true;  	trans_cfg.bc_table_dword = @@ -1437,9 +1428,6 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,  		goto out_free;  	} -	IWL_INFO(mvm, "Detected %s, REV=0x%X\n", -		 mvm->trans->name, mvm->trans->hw_rev); -  	if (iwlwifi_mod_params.nvm_file)  		mvm->nvm_file_name = iwlwifi_mod_params.nvm_file;  	else @@ -1507,8 +1495,6 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,  	iwl_fw_flush_dumps(&mvm->fwrt);  	iwl_fw_runtime_free(&mvm->fwrt); -	if (iwlmvm_mod_params.init_dbg) -		return op_mode;  	iwl_phy_db_free(mvm->phy_db);  	kfree(mvm->scan_cmd);  	iwl_trans_op_mode_leave(trans); @@ -1912,12 +1898,10 @@ static bool iwl_mvm_set_hw_rfkill_state(struct iwl_op_mode *op_mode, bool state)  	bool rfkill_safe_init_done = READ_ONCE(mvm->rfkill_safe_init_done);  	bool unified = iwl_mvm_has_unified_ucode(mvm); -	if (state) { +	if (state)  		set_bit(IWL_MVM_STATUS_HW_RFKILL, &mvm->status); -		wake_up(&mvm->rx_sync_waitq); -	} else { +	else  		clear_bit(IWL_MVM_STATUS_HW_RFKILL, &mvm->status); -	}  	iwl_mvm_set_rfkill_state(mvm); |