diff options
Diffstat (limited to 'drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c')
| -rw-r--r-- | drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c | 392 | 
1 files changed, 281 insertions, 111 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c b/drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c index 402846650cbe..c1c9c489edc9 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c @@ -7,7 +7,7 @@   *   * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.   * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH - * Copyright(c) 2016 Intel Deutschland GmbH + * Copyright(c) 2016 - 2017 Intel Deutschland GmbH   *   * This program is free software; you can redistribute it and/or modify   * it under the terms of version 2 of the GNU General Public License as @@ -34,6 +34,7 @@   *   * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.   * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH + * Copyright(c) 2016 - 2017 Intel Deutschland GmbH   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -72,7 +73,7 @@  #include "sta.h"  #include "iwl-io.h"  #include "debugfs.h" -#include "iwl-fw-error-dump.h" +#include "fw/error-dump.h"  static ssize_t iwl_dbgfs_ctdp_budget_read(struct file *file,  					  char __user *user_buf, @@ -82,7 +83,8 @@ static ssize_t iwl_dbgfs_ctdp_budget_read(struct file *file,  	char buf[16];  	int pos, budget; -	if (!mvm->ucode_loaded || mvm->cur_ucode != IWL_UCODE_REGULAR) +	if (!iwl_mvm_firmware_running(mvm) || +	    mvm->cur_ucode != IWL_UCODE_REGULAR)  		return -EIO;  	mutex_lock(&mvm->mutex); @@ -102,7 +104,8 @@ static ssize_t iwl_dbgfs_stop_ctdp_write(struct iwl_mvm *mvm, char *buf,  {  	int ret; -	if (!mvm->ucode_loaded || mvm->cur_ucode != IWL_UCODE_REGULAR) +	if (!iwl_mvm_firmware_running(mvm) || +	    mvm->cur_ucode != IWL_UCODE_REGULAR)  		return -EIO;  	mutex_lock(&mvm->mutex); @@ -116,18 +119,30 @@ static ssize_t iwl_dbgfs_tx_flush_write(struct iwl_mvm *mvm, char *buf,  					size_t count, loff_t *ppos)  {  	int ret; -	u32 scd_q_msk; +	u32 flush_arg; -	if (!mvm->ucode_loaded || mvm->cur_ucode != IWL_UCODE_REGULAR) +	if (!iwl_mvm_firmware_running(mvm) || +	    mvm->cur_ucode != IWL_UCODE_REGULAR)  		return -EIO; -	if (sscanf(buf, "%x", &scd_q_msk) != 1) +	if (kstrtou32(buf, 0, &flush_arg))  		return -EINVAL; -	IWL_ERR(mvm, "FLUSHING queues: scd_q_msk = 0x%x\n", scd_q_msk); +	if (iwl_mvm_has_new_tx_api(mvm)) { +		IWL_DEBUG_TX_QUEUES(mvm, +				    "FLUSHING all tids queues on sta_id = %d\n", +				    flush_arg); +		mutex_lock(&mvm->mutex); +		ret = iwl_mvm_flush_sta_tids(mvm, flush_arg, 0xFF, 0) ? : count; +		mutex_unlock(&mvm->mutex); +		return ret; +	} + +	IWL_DEBUG_TX_QUEUES(mvm, "FLUSHING queues mask to flush = 0x%x\n", +			    flush_arg);  	mutex_lock(&mvm->mutex); -	ret =  iwl_mvm_flush_tx_path(mvm, scd_q_msk, 0) ? : count; +	ret =  iwl_mvm_flush_tx_path(mvm, flush_arg, 0) ? : count;  	mutex_unlock(&mvm->mutex);  	return ret; @@ -139,7 +154,8 @@ static ssize_t iwl_dbgfs_sta_drain_write(struct iwl_mvm *mvm, char *buf,  	struct iwl_mvm_sta *mvmsta;  	int sta_id, drain, ret; -	if (!mvm->ucode_loaded || mvm->cur_ucode != IWL_UCODE_REGULAR) +	if (!iwl_mvm_firmware_running(mvm) || +	    mvm->cur_ucode != IWL_UCODE_REGULAR)  		return -EIO;  	if (sscanf(buf, "%d %d", &sta_id, &drain) != 2) @@ -172,7 +188,7 @@ static ssize_t iwl_dbgfs_sram_read(struct file *file, char __user *user_buf,  	size_t ret;  	u8 *ptr; -	if (!mvm->ucode_loaded) +	if (!iwl_mvm_firmware_running(mvm))  		return -EINVAL;  	/* default is to dump the entire data segment */ @@ -205,7 +221,7 @@ static ssize_t iwl_dbgfs_sram_write(struct iwl_mvm *mvm, char *buf,  	u32 offset, len;  	u32 img_offset, img_len; -	if (!mvm->ucode_loaded) +	if (!iwl_mvm_firmware_running(mvm))  		return -EINVAL;  	img = &mvm->fw->img[mvm->cur_ucode]; @@ -258,7 +274,7 @@ static ssize_t iwl_dbgfs_set_nic_temperature_write(struct iwl_mvm *mvm,  {  	int temperature; -	if (!mvm->ucode_loaded && !mvm->temperature_test) +	if (!iwl_mvm_firmware_running(mvm) && !mvm->temperature_test)  		return -EIO;  	if (kstrtoint(buf, 10, &temperature)) @@ -305,7 +321,7 @@ static ssize_t iwl_dbgfs_nic_temp_read(struct file *file,  	int pos, ret;  	s32 temp; -	if (!mvm->ucode_loaded) +	if (!iwl_mvm_firmware_running(mvm))  		return -EIO;  	mutex_lock(&mvm->mutex); @@ -320,6 +336,49 @@ static ssize_t iwl_dbgfs_nic_temp_read(struct file *file,  	return simple_read_from_buffer(user_buf, count, ppos, buf, pos);  } +#ifdef CONFIG_ACPI +static ssize_t iwl_dbgfs_sar_geo_profile_read(struct file *file, +					      char __user *user_buf, +					      size_t count, loff_t *ppos) +{ +	struct iwl_mvm *mvm = file->private_data; +	char buf[256]; +	int pos = 0; +	int bufsz = sizeof(buf); +	int tbl_idx; +	u8 *value; + +	if (!iwl_mvm_firmware_running(mvm)) +		return -EIO; + +	mutex_lock(&mvm->mutex); +	tbl_idx = iwl_mvm_get_sar_geo_profile(mvm); +	if (tbl_idx < 0) { +		mutex_unlock(&mvm->mutex); +		return tbl_idx; +	} + +	if (!tbl_idx) { +		pos = scnprintf(buf, bufsz, +				"SAR geographic profile disabled\n"); +	} else { +		value = &mvm->geo_profiles[tbl_idx - 1].values[0]; + +		pos += scnprintf(buf + pos, bufsz - pos, +				 "Use geographic profile %d\n", tbl_idx); +		pos += scnprintf(buf + pos, bufsz - pos, +				 "2.4GHz:\n\tChain A offset: %hhd dBm\n\tChain B offset: %hhd dBm\n\tmax tx power: %hhd dBm\n", +				 value[1], value[2], value[0]); +		pos += scnprintf(buf + pos, bufsz - pos, +				 "5.2GHz:\n\tChain A offset: %hhd dBm\n\tChain B offset: %hhd dBm\n\tmax tx power: %hhd dBm\n", +				 value[4], value[5], value[3]); +	} +	mutex_unlock(&mvm->mutex); + +	return simple_read_from_buffer(user_buf, count, ppos, buf, pos); +} +#endif +  static ssize_t iwl_dbgfs_stations_read(struct file *file, char __user *user_buf,  				       size_t count, loff_t *ppos)  { @@ -371,7 +430,7 @@ static ssize_t iwl_dbgfs_disable_power_off_write(struct iwl_mvm *mvm, char *buf,  {  	int ret, val; -	if (!mvm->ucode_loaded) +	if (!iwl_mvm_firmware_running(mvm))  		return -EIO;  	if (!strncmp("disable_power_off_d0=", buf, 21)) { @@ -583,7 +642,11 @@ iwl_dbgfs_bt_force_ant_write(struct iwl_mvm *mvm, char *buf,  	mvm->bt_force_ant_mode = bt_force_ant_mode;  	IWL_DEBUG_COEX(mvm, "Force mode: %s\n",  		       modes_str[mvm->bt_force_ant_mode]); -	ret = iwl_send_bt_init_conf(mvm); + +	if (iwl_mvm_firmware_running(mvm)) +		ret = iwl_mvm_send_bt_init_conf(mvm); +	else +		ret = 0;  out:  	mutex_unlock(&mvm->mutex); @@ -605,15 +668,15 @@ static ssize_t iwl_dbgfs_fw_rx_stats_read(struct file *file,  	int pos = 0;  	char *buf;  	int ret; -	/* 43 is the size of each data line, 33 is the size of each header */ -	size_t bufsz = -		((sizeof(struct mvm_statistics_rx) / sizeof(__le32)) * 43) + -		(4 * 33) + 1; +	size_t bufsz; -	struct mvm_statistics_rx_phy *ofdm; -	struct mvm_statistics_rx_phy *cck; -	struct mvm_statistics_rx_non_phy *general; -	struct mvm_statistics_rx_ht_phy *ht; +	if (iwl_mvm_has_new_rx_stats_api(mvm)) +		bufsz = ((sizeof(struct mvm_statistics_rx) / +			  sizeof(__le32)) * 43) + (4 * 33) + 1; +	else +		/* 43 = size of each data line; 33 = size of each header */ +		bufsz = ((sizeof(struct mvm_statistics_rx_v3) / +			  sizeof(__le32)) * 43) + (4 * 33) + 1;  	buf = kzalloc(bufsz, GFP_KERNEL);  	if (!buf) @@ -621,96 +684,157 @@ static ssize_t iwl_dbgfs_fw_rx_stats_read(struct file *file,  	mutex_lock(&mvm->mutex); -	ofdm = &mvm->rx_stats.ofdm; -	cck = &mvm->rx_stats.cck; -	general = &mvm->rx_stats.general; -	ht = &mvm->rx_stats.ofdm_ht; -  	pos += scnprintf(buf + pos, bufsz - pos, fmt_header,  			 "Statistics_Rx - OFDM"); -	PRINT_STATS_LE32(ofdm, ina_cnt); -	PRINT_STATS_LE32(ofdm, fina_cnt); -	PRINT_STATS_LE32(ofdm, plcp_err); -	PRINT_STATS_LE32(ofdm, crc32_err); -	PRINT_STATS_LE32(ofdm, overrun_err); -	PRINT_STATS_LE32(ofdm, early_overrun_err); -	PRINT_STATS_LE32(ofdm, crc32_good); -	PRINT_STATS_LE32(ofdm, false_alarm_cnt); -	PRINT_STATS_LE32(ofdm, fina_sync_err_cnt); -	PRINT_STATS_LE32(ofdm, sfd_timeout); -	PRINT_STATS_LE32(ofdm, fina_timeout); -	PRINT_STATS_LE32(ofdm, unresponded_rts); -	PRINT_STATS_LE32(ofdm, rxe_frame_lmt_overrun); -	PRINT_STATS_LE32(ofdm, sent_ack_cnt); -	PRINT_STATS_LE32(ofdm, sent_cts_cnt); -	PRINT_STATS_LE32(ofdm, sent_ba_rsp_cnt); -	PRINT_STATS_LE32(ofdm, dsp_self_kill); -	PRINT_STATS_LE32(ofdm, mh_format_err); -	PRINT_STATS_LE32(ofdm, re_acq_main_rssi_sum); -	PRINT_STATS_LE32(ofdm, reserved); +	if (!iwl_mvm_has_new_rx_stats_api(mvm)) { +		struct mvm_statistics_rx_phy_v2 *ofdm = &mvm->rx_stats_v3.ofdm; + +		PRINT_STATS_LE32(ofdm, ina_cnt); +		PRINT_STATS_LE32(ofdm, fina_cnt); +		PRINT_STATS_LE32(ofdm, plcp_err); +		PRINT_STATS_LE32(ofdm, crc32_err); +		PRINT_STATS_LE32(ofdm, overrun_err); +		PRINT_STATS_LE32(ofdm, early_overrun_err); +		PRINT_STATS_LE32(ofdm, crc32_good); +		PRINT_STATS_LE32(ofdm, false_alarm_cnt); +		PRINT_STATS_LE32(ofdm, fina_sync_err_cnt); +		PRINT_STATS_LE32(ofdm, sfd_timeout); +		PRINT_STATS_LE32(ofdm, fina_timeout); +		PRINT_STATS_LE32(ofdm, unresponded_rts); +		PRINT_STATS_LE32(ofdm, rxe_frame_lmt_overrun); +		PRINT_STATS_LE32(ofdm, sent_ack_cnt); +		PRINT_STATS_LE32(ofdm, sent_cts_cnt); +		PRINT_STATS_LE32(ofdm, sent_ba_rsp_cnt); +		PRINT_STATS_LE32(ofdm, dsp_self_kill); +		PRINT_STATS_LE32(ofdm, mh_format_err); +		PRINT_STATS_LE32(ofdm, re_acq_main_rssi_sum); +		PRINT_STATS_LE32(ofdm, reserved); +	} else { +		struct mvm_statistics_rx_phy *ofdm = &mvm->rx_stats.ofdm; + +		PRINT_STATS_LE32(ofdm, unresponded_rts); +		PRINT_STATS_LE32(ofdm, rxe_frame_lmt_overrun); +		PRINT_STATS_LE32(ofdm, sent_ba_rsp_cnt); +		PRINT_STATS_LE32(ofdm, dsp_self_kill); +		PRINT_STATS_LE32(ofdm, reserved); +	}  	pos += scnprintf(buf + pos, bufsz - pos, fmt_header,  			 "Statistics_Rx - CCK"); -	PRINT_STATS_LE32(cck, ina_cnt); -	PRINT_STATS_LE32(cck, fina_cnt); -	PRINT_STATS_LE32(cck, plcp_err); -	PRINT_STATS_LE32(cck, crc32_err); -	PRINT_STATS_LE32(cck, overrun_err); -	PRINT_STATS_LE32(cck, early_overrun_err); -	PRINT_STATS_LE32(cck, crc32_good); -	PRINT_STATS_LE32(cck, false_alarm_cnt); -	PRINT_STATS_LE32(cck, fina_sync_err_cnt); -	PRINT_STATS_LE32(cck, sfd_timeout); -	PRINT_STATS_LE32(cck, fina_timeout); -	PRINT_STATS_LE32(cck, unresponded_rts); -	PRINT_STATS_LE32(cck, rxe_frame_lmt_overrun); -	PRINT_STATS_LE32(cck, sent_ack_cnt); -	PRINT_STATS_LE32(cck, sent_cts_cnt); -	PRINT_STATS_LE32(cck, sent_ba_rsp_cnt); -	PRINT_STATS_LE32(cck, dsp_self_kill); -	PRINT_STATS_LE32(cck, mh_format_err); -	PRINT_STATS_LE32(cck, re_acq_main_rssi_sum); -	PRINT_STATS_LE32(cck, reserved); +	if (!iwl_mvm_has_new_rx_stats_api(mvm)) { +		struct mvm_statistics_rx_phy_v2 *cck = &mvm->rx_stats_v3.cck; + +		PRINT_STATS_LE32(cck, ina_cnt); +		PRINT_STATS_LE32(cck, fina_cnt); +		PRINT_STATS_LE32(cck, plcp_err); +		PRINT_STATS_LE32(cck, crc32_err); +		PRINT_STATS_LE32(cck, overrun_err); +		PRINT_STATS_LE32(cck, early_overrun_err); +		PRINT_STATS_LE32(cck, crc32_good); +		PRINT_STATS_LE32(cck, false_alarm_cnt); +		PRINT_STATS_LE32(cck, fina_sync_err_cnt); +		PRINT_STATS_LE32(cck, sfd_timeout); +		PRINT_STATS_LE32(cck, fina_timeout); +		PRINT_STATS_LE32(cck, unresponded_rts); +		PRINT_STATS_LE32(cck, rxe_frame_lmt_overrun); +		PRINT_STATS_LE32(cck, sent_ack_cnt); +		PRINT_STATS_LE32(cck, sent_cts_cnt); +		PRINT_STATS_LE32(cck, sent_ba_rsp_cnt); +		PRINT_STATS_LE32(cck, dsp_self_kill); +		PRINT_STATS_LE32(cck, mh_format_err); +		PRINT_STATS_LE32(cck, re_acq_main_rssi_sum); +		PRINT_STATS_LE32(cck, reserved); +	} else { +		struct mvm_statistics_rx_phy *cck = &mvm->rx_stats.cck; + +		PRINT_STATS_LE32(cck, unresponded_rts); +		PRINT_STATS_LE32(cck, rxe_frame_lmt_overrun); +		PRINT_STATS_LE32(cck, sent_ba_rsp_cnt); +		PRINT_STATS_LE32(cck, dsp_self_kill); +		PRINT_STATS_LE32(cck, reserved); +	}  	pos += scnprintf(buf + pos, bufsz - pos, fmt_header,  			 "Statistics_Rx - GENERAL"); -	PRINT_STATS_LE32(general, bogus_cts); -	PRINT_STATS_LE32(general, bogus_ack); -	PRINT_STATS_LE32(general, non_bssid_frames); -	PRINT_STATS_LE32(general, filtered_frames); -	PRINT_STATS_LE32(general, non_channel_beacons); -	PRINT_STATS_LE32(general, channel_beacons); -	PRINT_STATS_LE32(general, num_missed_bcon); -	PRINT_STATS_LE32(general, adc_rx_saturation_time); -	PRINT_STATS_LE32(general, ina_detection_search_time); -	PRINT_STATS_LE32(general, beacon_silence_rssi_a); -	PRINT_STATS_LE32(general, beacon_silence_rssi_b); -	PRINT_STATS_LE32(general, beacon_silence_rssi_c); -	PRINT_STATS_LE32(general, interference_data_flag); -	PRINT_STATS_LE32(general, channel_load); -	PRINT_STATS_LE32(general, dsp_false_alarms); -	PRINT_STATS_LE32(general, beacon_rssi_a); -	PRINT_STATS_LE32(general, beacon_rssi_b); -	PRINT_STATS_LE32(general, beacon_rssi_c); -	PRINT_STATS_LE32(general, beacon_energy_a); -	PRINT_STATS_LE32(general, beacon_energy_b); -	PRINT_STATS_LE32(general, beacon_energy_c); -	PRINT_STATS_LE32(general, num_bt_kills); -	PRINT_STATS_LE32(general, mac_id); -	PRINT_STATS_LE32(general, directed_data_mpdu); +	if (!iwl_mvm_has_new_rx_stats_api(mvm)) { +		struct mvm_statistics_rx_non_phy_v3 *general = +			&mvm->rx_stats_v3.general; + +		PRINT_STATS_LE32(general, bogus_cts); +		PRINT_STATS_LE32(general, bogus_ack); +		PRINT_STATS_LE32(general, non_bssid_frames); +		PRINT_STATS_LE32(general, filtered_frames); +		PRINT_STATS_LE32(general, non_channel_beacons); +		PRINT_STATS_LE32(general, channel_beacons); +		PRINT_STATS_LE32(general, num_missed_bcon); +		PRINT_STATS_LE32(general, adc_rx_saturation_time); +		PRINT_STATS_LE32(general, ina_detection_search_time); +		PRINT_STATS_LE32(general, beacon_silence_rssi_a); +		PRINT_STATS_LE32(general, beacon_silence_rssi_b); +		PRINT_STATS_LE32(general, beacon_silence_rssi_c); +		PRINT_STATS_LE32(general, interference_data_flag); +		PRINT_STATS_LE32(general, channel_load); +		PRINT_STATS_LE32(general, dsp_false_alarms); +		PRINT_STATS_LE32(general, beacon_rssi_a); +		PRINT_STATS_LE32(general, beacon_rssi_b); +		PRINT_STATS_LE32(general, beacon_rssi_c); +		PRINT_STATS_LE32(general, beacon_energy_a); +		PRINT_STATS_LE32(general, beacon_energy_b); +		PRINT_STATS_LE32(general, beacon_energy_c); +		PRINT_STATS_LE32(general, num_bt_kills); +		PRINT_STATS_LE32(general, mac_id); +		PRINT_STATS_LE32(general, directed_data_mpdu); +	} else { +		struct mvm_statistics_rx_non_phy *general = +			&mvm->rx_stats.general; + +		PRINT_STATS_LE32(general, bogus_cts); +		PRINT_STATS_LE32(general, bogus_ack); +		PRINT_STATS_LE32(general, non_channel_beacons); +		PRINT_STATS_LE32(general, channel_beacons); +		PRINT_STATS_LE32(general, num_missed_bcon); +		PRINT_STATS_LE32(general, adc_rx_saturation_time); +		PRINT_STATS_LE32(general, ina_detection_search_time); +		PRINT_STATS_LE32(general, beacon_silence_rssi_a); +		PRINT_STATS_LE32(general, beacon_silence_rssi_b); +		PRINT_STATS_LE32(general, beacon_silence_rssi_c); +		PRINT_STATS_LE32(general, interference_data_flag); +		PRINT_STATS_LE32(general, channel_load); +		PRINT_STATS_LE32(general, beacon_rssi_a); +		PRINT_STATS_LE32(general, beacon_rssi_b); +		PRINT_STATS_LE32(general, beacon_rssi_c); +		PRINT_STATS_LE32(general, beacon_energy_a); +		PRINT_STATS_LE32(general, beacon_energy_b); +		PRINT_STATS_LE32(general, beacon_energy_c); +		PRINT_STATS_LE32(general, num_bt_kills); +		PRINT_STATS_LE32(general, mac_id); +	}  	pos += scnprintf(buf + pos, bufsz - pos, fmt_header,  			 "Statistics_Rx - HT"); -	PRINT_STATS_LE32(ht, plcp_err); -	PRINT_STATS_LE32(ht, overrun_err); -	PRINT_STATS_LE32(ht, early_overrun_err); -	PRINT_STATS_LE32(ht, crc32_good); -	PRINT_STATS_LE32(ht, crc32_err); -	PRINT_STATS_LE32(ht, mh_format_err); -	PRINT_STATS_LE32(ht, agg_crc32_good); -	PRINT_STATS_LE32(ht, agg_mpdu_cnt); -	PRINT_STATS_LE32(ht, agg_cnt); -	PRINT_STATS_LE32(ht, unsupport_mcs); +	if (!iwl_mvm_has_new_rx_stats_api(mvm)) { +		struct mvm_statistics_rx_ht_phy_v1 *ht = +			&mvm->rx_stats_v3.ofdm_ht; + +		PRINT_STATS_LE32(ht, plcp_err); +		PRINT_STATS_LE32(ht, overrun_err); +		PRINT_STATS_LE32(ht, early_overrun_err); +		PRINT_STATS_LE32(ht, crc32_good); +		PRINT_STATS_LE32(ht, crc32_err); +		PRINT_STATS_LE32(ht, mh_format_err); +		PRINT_STATS_LE32(ht, agg_crc32_good); +		PRINT_STATS_LE32(ht, agg_mpdu_cnt); +		PRINT_STATS_LE32(ht, agg_cnt); +		PRINT_STATS_LE32(ht, unsupport_mcs); +	} else { +		struct mvm_statistics_rx_ht_phy *ht = +			&mvm->rx_stats.ofdm_ht; + +		PRINT_STATS_LE32(ht, mh_format_err); +		PRINT_STATS_LE32(ht, agg_mpdu_cnt); +		PRINT_STATS_LE32(ht, agg_cnt); +		PRINT_STATS_LE32(ht, unsupport_mcs); +	}  	mutex_unlock(&mvm->mutex); @@ -800,11 +924,14 @@ static ssize_t iwl_dbgfs_fw_restart_write(struct iwl_mvm *mvm, char *buf,  {  	int __maybe_unused ret; +	if (!iwl_mvm_firmware_running(mvm)) +		return -EIO; +  	mutex_lock(&mvm->mutex);  	/* allow one more restart that we're provoking here */ -	if (mvm->restart_fw >= 0) -		mvm->restart_fw++; +	if (mvm->fw_restart >= 0) +		mvm->fw_restart++;  	/* take the return value to make compiler happy - it will fail anyway */  	ret = iwl_mvm_send_cmd_pdu(mvm, REPLY_ERROR, 0, 0, NULL); @@ -817,7 +944,12 @@ static ssize_t iwl_dbgfs_fw_restart_write(struct iwl_mvm *mvm, char *buf,  static ssize_t iwl_dbgfs_fw_nmi_write(struct iwl_mvm *mvm, char *buf,  				      size_t count, loff_t *ppos)  { -	int ret = iwl_mvm_ref_sync(mvm, IWL_MVM_REF_NMI); +	int ret; + +	if (!iwl_mvm_firmware_running(mvm)) +		return -EIO; + +	ret = iwl_mvm_ref_sync(mvm, IWL_MVM_REF_NMI);  	if (ret)  		return ret; @@ -857,6 +989,9 @@ iwl_dbgfs_scan_ant_rxchain_write(struct iwl_mvm *mvm, char *buf,  {  	u8 scan_rx_ant; +	if (!iwl_mvm_firmware_running(mvm)) +		return -EIO; +  	if (sscanf(buf, "%hhx", &scan_rx_ant) != 1)  		return -EINVAL;  	if (scan_rx_ant > ANT_ABC) @@ -911,7 +1046,11 @@ static ssize_t iwl_dbgfs_indirection_tbl_write(struct iwl_mvm *mvm,  	netdev_rss_key_fill(cmd.secret_key, sizeof(cmd.secret_key));  	mutex_lock(&mvm->mutex); -	ret = iwl_mvm_send_cmd_pdu(mvm, RSS_CONFIG_CMD, 0, sizeof(cmd), &cmd); +	if (iwl_mvm_firmware_running(mvm)) +		ret = iwl_mvm_send_cmd_pdu(mvm, RSS_CONFIG_CMD, 0, +					   sizeof(cmd), &cmd); +	else +		ret = 0;  	mutex_unlock(&mvm->mutex);  	return ret ?: count; @@ -931,6 +1070,9 @@ static ssize_t iwl_dbgfs_inject_packet_write(struct iwl_mvm *mvm,  	int bin_len = count / 2;  	int ret = -EINVAL; +	if (!iwl_mvm_firmware_running(mvm)) +		return -EIO; +  	/* supporting only 9000 descriptor */  	if (!mvm->trans->cfg->mq_rx_supported)  		return -ENOTSUPP; @@ -1004,11 +1146,14 @@ static ssize_t iwl_dbgfs_cont_recording_write(struct iwl_mvm *mvm,  	struct iwl_continuous_record_cmd cont_rec = {};  	int ret, rec_mode; +	if (!iwl_mvm_firmware_running(mvm)) +		return -EIO; +  	if (!dest)  		return -EOPNOTSUPP;  	if (dest->monitor_mode != SMEM_MODE || -	    trans->cfg->device_family != IWL_DEVICE_FAMILY_8000) +	    trans->cfg->device_family < IWL_DEVICE_FAMILY_8000)  		return -EOPNOTSUPP;  	ret = kstrtoint(buf, 0, &rec_mode); @@ -1034,6 +1179,9 @@ static ssize_t iwl_dbgfs_fw_dbg_conf_write(struct iwl_mvm *mvm,  	unsigned int conf_id;  	int ret; +	if (!iwl_mvm_firmware_running(mvm)) +		return -EIO; +  	ret = kstrtouint(buf, 0, &conf_id);  	if (ret)  		return ret; @@ -1052,8 +1200,12 @@ static ssize_t iwl_dbgfs_fw_dbg_collect_write(struct iwl_mvm *mvm,  					      char *buf, size_t count,  					      loff_t *ppos)  { -	int ret = iwl_mvm_ref_sync(mvm, IWL_MVM_REF_PRPH_WRITE); +	int ret; + +	if (!iwl_mvm_firmware_running(mvm)) +		return -EIO; +	ret = iwl_mvm_ref_sync(mvm, IWL_MVM_REF_PRPH_WRITE);  	if (ret)  		return ret;  	if (count == 0) @@ -1184,7 +1336,8 @@ static ssize_t iwl_dbgfs_bcast_filters_write(struct iwl_mvm *mvm, char *buf,  	       &filter, sizeof(filter));  	/* send updated bcast filtering configuration */ -	if (mvm->dbgfs_bcast_filtering.override && +	if (iwl_mvm_firmware_running(mvm) && +	    mvm->dbgfs_bcast_filtering.override &&  	    iwl_mvm_bcast_filter_build_cmd(mvm, &cmd))  		err = iwl_mvm_send_cmd_pdu(mvm, BCAST_FILTER_CMD, 0,  					   sizeof(cmd), &cmd); @@ -1256,7 +1409,8 @@ static ssize_t iwl_dbgfs_bcast_filters_macs_write(struct iwl_mvm *mvm,  	       &mac, sizeof(mac));  	/* send updated bcast filtering configuration */ -	if (mvm->dbgfs_bcast_filtering.override && +	if (iwl_mvm_firmware_running(mvm) && +	    mvm->dbgfs_bcast_filtering.override &&  	    iwl_mvm_bcast_filter_build_cmd(mvm, &cmd))  		err = iwl_mvm_send_cmd_pdu(mvm, BCAST_FILTER_CMD, 0,  					   sizeof(cmd), &cmd); @@ -1473,6 +1627,9 @@ iwl_dbgfs_send_echo_cmd_write(struct iwl_mvm *mvm, char *buf,  {  	int ret; +	if (!iwl_mvm_firmware_running(mvm)) +		return -EIO; +  	mutex_lock(&mvm->mutex);  	ret = iwl_mvm_send_cmd_pdu(mvm, ECHO_CMD, 0, 0, NULL);  	mutex_unlock(&mvm->mutex); @@ -1519,6 +1676,9 @@ MVM_DEBUGFS_READ_WRITE_FILE_OPS(bcast_filters_macs, 256);  #ifdef CONFIG_PM_SLEEP  MVM_DEBUGFS_READ_WRITE_FILE_OPS(d3_sram, 8);  #endif +#ifdef CONFIG_ACPI +MVM_DEBUGFS_READ_FILE_OPS(sar_geo_profile); +#endif  static ssize_t iwl_dbgfs_mem_read(struct file *file, char __user *user_buf,  				  size_t count, loff_t *ppos) @@ -1534,6 +1694,9 @@ static ssize_t iwl_dbgfs_mem_read(struct file *file, char __user *user_buf,  	size_t delta;  	ssize_t ret, len; +	if (!iwl_mvm_firmware_running(mvm)) +		return -EIO; +  	hcmd.id = iwl_cmd_id(*ppos >> 24 ? UMAC_RD_WR : LMAC_RD_WR,  			     DEBUG_GROUP, 0);  	cmd.op = cpu_to_le32(DEBUG_MEM_OP_READ); @@ -1586,6 +1749,9 @@ static ssize_t iwl_dbgfs_mem_write(struct file *file,  	u32 op, len;  	ssize_t ret; +	if (!iwl_mvm_firmware_running(mvm)) +		return -EIO; +  	hcmd.id = iwl_cmd_id(*ppos >> 24 ? UMAC_RD_WR : LMAC_RD_WR,  			     DEBUG_GROUP, 0); @@ -1685,6 +1851,10 @@ int iwl_mvm_dbgfs_register(struct iwl_mvm *mvm, struct dentry *dbgfs_dir)  	MVM_DEBUGFS_ADD_FILE(cont_recording, mvm->debugfs_dir, S_IWUSR);  	MVM_DEBUGFS_ADD_FILE(indirection_tbl, mvm->debugfs_dir, S_IWUSR);  	MVM_DEBUGFS_ADD_FILE(inject_packet, mvm->debugfs_dir, S_IWUSR); +#ifdef CONFIG_ACPI +	MVM_DEBUGFS_ADD_FILE(sar_geo_profile, dbgfs_dir, S_IRUSR); +#endif +  	if (!debugfs_create_bool("enable_scan_iteration_notif",  				 S_IRUSR | S_IWUSR,  				 mvm->debugfs_dir,  |