diff options
Diffstat (limited to 'sys/contrib/dev/iwlwifi/mvm/debugfs.c')
| -rw-r--r-- | sys/contrib/dev/iwlwifi/mvm/debugfs.c | 130 | 
1 files changed, 41 insertions, 89 deletions
| diff --git a/sys/contrib/dev/iwlwifi/mvm/debugfs.c b/sys/contrib/dev/iwlwifi/mvm/debugfs.c index 24bcffe67235..eb8ae6d574fa 100644 --- a/sys/contrib/dev/iwlwifi/mvm/debugfs.c +++ b/sys/contrib/dev/iwlwifi/mvm/debugfs.c @@ -1,6 +1,6 @@  // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause  /* - * Copyright (C) 2012-2014, 2018-2023 Intel Corporation + * Copyright (C) 2012-2014, 2018-2023, 2025 Intel Corporation   * Copyright (C) 2013-2015 Intel Mobile Communications GmbH   * Copyright (C) 2016-2017 Intel Deutschland GmbH   */ @@ -16,6 +16,7 @@  #include "debugfs.h"  #include "iwl-modparams.h"  #include "iwl-drv.h" +#include "iwl-utils.h"  #include "fw/error-dump.h"  #include "fw/api/phy-ctxt.h" @@ -462,7 +463,6 @@ static ssize_t iwl_dbgfs_amsdu_len_write(struct ieee80211_link_sta *link_sta,  	if (amsdu_len) {  		mvm_link_sta->orig_amsdu_len = link_sta->agg.max_amsdu_len;  		link_sta->agg.max_amsdu_len = amsdu_len; -		link_sta->agg.max_amsdu_len = amsdu_len;  		for (i = 0; i < ARRAY_SIZE(link_sta->agg.max_tid_amsdu_len); i++)  			link_sta->agg.max_tid_amsdu_len[i] = amsdu_len;  	} else { @@ -537,47 +537,12 @@ static ssize_t iwl_dbgfs_disable_power_off_write(struct iwl_mvm *mvm, char *buf,  	return ret ?: count;  } -static ssize_t iwl_dbgfs_fw_ver_read(struct file *file, char __user *user_buf, -				     size_t count, loff_t *ppos) -{ -	struct iwl_mvm *mvm = file->private_data; -	char *buff, *pos, *endpos; -	static const size_t bufsz = 1024; -	int ret; - -	buff = kmalloc(bufsz, GFP_KERNEL); -	if (!buff) -		return -ENOMEM; - -	pos = buff; -	endpos = pos + bufsz; - -	pos += scnprintf(pos, endpos - pos, "FW id: %s\n", -			 mvm->fwrt.fw->fw_version); -	pos += scnprintf(pos, endpos - pos, "FW: %s\n", -			 mvm->fwrt.fw->human_readable); -	pos += scnprintf(pos, endpos - pos, "Device: %s\n", -			 mvm->fwrt.trans->name); -	pos += scnprintf(pos, endpos - pos, "Bus: %s\n", -#if defined(__linux__) -			 mvm->fwrt.dev->bus->name); -#elif defined(__FreeBSD__) -			"<bus>"); -#endif - -	ret = simple_read_from_buffer(user_buf, count, ppos, buff, pos - buff); -	kfree(buff); - -	return ret; -} -  static ssize_t iwl_dbgfs_tas_get_status_read(struct file *file,  					     char __user *user_buf,  					     size_t count, loff_t *ppos)  {  	struct iwl_mvm *mvm = file->private_data; -	struct iwl_mvm_tas_status_resp tas_rsp; -	struct iwl_mvm_tas_status_resp *rsp = &tas_rsp; +	struct iwl_tas_status_resp *rsp = NULL;  	static const size_t bufsz = 1024;  	char *buff, *pos, *endpos;  	const char * const tas_dis_reason[TAS_DISABLED_REASON_MAX] = { @@ -587,6 +552,8 @@ static ssize_t iwl_dbgfs_tas_get_status_read(struct file *file,  			"Due To SAR Limit Less Than 6 dBm",  		[TAS_DISABLED_REASON_INVALID] =  			"N/A", +		[TAS_DISABLED_DUE_TO_TABLE_SOURCE_INVALID] = +			"Due to table source invalid",  	};  	const char * const tas_current_status[TAS_DYNA_STATUS_MAX] = {  		[TAS_DYNA_INACTIVE] = "INACTIVE", @@ -613,6 +580,10 @@ static ssize_t iwl_dbgfs_tas_get_status_read(struct file *file,  	if (!iwl_mvm_firmware_running(mvm))  		return -ENODEV; +	if (iwl_fw_lookup_notif_ver(mvm->fw, DEBUG_GROUP, GET_TAS_STATUS, +				    0) != 3) +		return -EOPNOTSUPP; +  	mutex_lock(&mvm->mutex);  	ret = iwl_mvm_send_cmd(mvm, &hcmd);  	mutex_unlock(&mvm->mutex); @@ -629,23 +600,19 @@ static ssize_t iwl_dbgfs_tas_get_status_read(struct file *file,  	pos += scnprintf(pos, endpos - pos, "TAS Conclusion:\n");  	for (i = 0; i < rsp->in_dual_radio + 1; i++) { -		if (rsp->tas_status_mac[i].band != TAS_LMAC_BAND_INVALID && -		    rsp->tas_status_mac[i].dynamic_status & BIT(TAS_DYNA_ACTIVE)) { +		if (rsp->tas_status_mac[i].dynamic_status & +		    BIT(TAS_DYNA_ACTIVE)) {  			pos += scnprintf(pos, endpos - pos, "\tON for ");  			switch (rsp->tas_status_mac[i].band) { -			case TAS_LMAC_BAND_HB: +			case PHY_BAND_5:  				pos += scnprintf(pos, endpos - pos, "HB\n");  				break; -			case TAS_LMAC_BAND_LB: +			case PHY_BAND_24:  				pos += scnprintf(pos, endpos - pos, "LB\n");  				break; -			case TAS_LMAC_BAND_UHB: +			case PHY_BAND_6:  				pos += scnprintf(pos, endpos - pos, "UHB\n");  				break; -			case TAS_LMAC_BAND_INVALID: -				pos += scnprintf(pos, endpos - pos, -						 "INVALID BAND\n"); -				break;  			default:  				pos += scnprintf(pos, endpos - pos,  						 "Unsupported band (%d)\n", @@ -663,6 +630,14 @@ static ssize_t iwl_dbgfs_tas_get_status_read(struct file *file,  			 rsp->tas_fw_version);  	pos += scnprintf(pos, endpos - pos, "Is UHB enabled for USA?: %s\n",  			 rsp->is_uhb_for_usa_enable ? "True" : "False"); + +	if (fw_has_capa(&mvm->fw->ucode_capa, +			IWL_UCODE_TLV_CAPA_UHB_CANADA_TAS_SUPPORT)) +		pos += scnprintf(pos, endpos - pos, +				 "Is UHB enabled for CANADA?: %s\n", +				 rsp->uhb_allowed_flags & +				 TAS_UHB_ALLOWED_CANADA ? "True" : "False"); +  	pos += scnprintf(pos, endpos - pos, "Current MCC: 0x%x\n",  			 le16_to_cpu(rsp->curr_mcc)); @@ -691,20 +666,16 @@ static ssize_t iwl_dbgfs_tas_get_status_read(struct file *file,  		pos += scnprintf(pos, endpos - pos, "TAS status for ");  		switch (rsp->tas_status_mac[i].band) { -		case TAS_LMAC_BAND_HB: +		case PHY_BAND_5:  			pos += scnprintf(pos, endpos - pos, "High band\n");  			break; -		case TAS_LMAC_BAND_LB: +		case PHY_BAND_24:  			pos += scnprintf(pos, endpos - pos, "Low band\n");  			break; -		case TAS_LMAC_BAND_UHB: +		case PHY_BAND_6:  			pos += scnprintf(pos, endpos - pos,  					 "Ultra high band\n");  			break; -		case TAS_LMAC_BAND_INVALID: -			pos += scnprintf(pos, endpos - pos, -					 "INVALID band\n"); -			break;  		default:  			pos += scnprintf(pos, endpos - pos,  					 "Unsupported band (%d)\n", @@ -727,11 +698,9 @@ static ssize_t iwl_dbgfs_tas_get_status_read(struct file *file,  		pos += scnprintf(pos, endpos - pos, "Dynamic status:\n");  		dyn_status = (rsp->tas_status_mac[i].dynamic_status); -		for_each_set_bit(tmp, &dyn_status, sizeof(dyn_status)) { -			if (tmp >= 0 && tmp < TAS_DYNA_STATUS_MAX) -				pos += scnprintf(pos, endpos - pos, -						 "\t%s (%d)\n", -						 tas_current_status[tmp], tmp); +		for_each_set_bit(tmp, &dyn_status, TAS_DYNA_STATUS_MAX) { +			pos += scnprintf(pos, endpos - pos, "\t%s (%d)\n", +					 tas_current_status[tmp], tmp);  		}  		pos += scnprintf(pos, endpos - pos, @@ -1163,13 +1132,9 @@ static ssize_t iwl_dbgfs_fw_restart_write(struct iwl_mvm *mvm, char *buf,  	mutex_lock(&mvm->mutex); -	/* allow one more restart that we're provoking here */ -	if (mvm->fw_restart >= 0) -		mvm->fw_restart++; -  	if (count == 6 && !strcmp(buf, "nolog\n")) {  		set_bit(IWL_MVM_STATUS_SUPPRESS_ERROR_LOG_ONCE, &mvm->status); -		set_bit(STATUS_SUPPRESS_CMD_ERROR_ONCE, &mvm->trans->status); +		iwl_trans_suppress_cmd_error_once(mvm->trans);  	}  	/* take the return value to make compiler happy - it will fail anyway */ @@ -1312,7 +1277,7 @@ static ssize_t iwl_dbgfs_inject_packet_write(struct iwl_mvm *mvm,  		return -EIO;  	/* supporting only MQ RX */ -	if (!mvm->trans->trans_cfg->mq_rx_supported) +	if (!mvm->trans->mac_cfg->mq_rx_supported)  		return -EOPNOTSUPP;  	rxb._page = alloc_pages(GFP_ATOMIC, 0); @@ -1413,9 +1378,9 @@ static int _iwl_dbgfs_inject_beacon_ie(struct iwl_mvm *mvm, char *bin, int len)  		if (iwl_fw_lookup_cmd_ver(mvm->fw,  					  BEACON_TEMPLATE_CMD, 0) >= 14) { -			u32 offset = iwl_mvm_find_ie_offset(beacon->data, -							    WLAN_EID_S1G_TWT, -							    beacon->len); +			u32 offset = iwl_find_ie_offset(beacon->data, +							WLAN_EID_S1G_TWT, +							beacon->len);  			beacon_cmd.btwt_offset = cpu_to_le32(offset);  		} @@ -1499,29 +1464,20 @@ static ssize_t iwl_dbgfs_fw_dbg_conf_write(struct iwl_mvm *mvm,  	return ret ?: count;  } -static ssize_t iwl_dbgfs_fw_dbg_collect_write(struct iwl_mvm *mvm, -					      char *buf, size_t count, -					      loff_t *ppos) -{ -	if (count == 0) -		return 0; - -	iwl_dbg_tlv_time_point(&mvm->fwrt, IWL_FW_INI_TIME_POINT_USER_TRIGGER, -			       NULL); - -	iwl_fw_dbg_collect(&mvm->fwrt, FW_DBG_TRIGGER_USER, buf, -			   (count - 1), NULL); - -	return count; -} -  static ssize_t iwl_dbgfs_fw_dbg_clear_write(struct iwl_mvm *mvm,  					    char *buf, size_t count,  					    loff_t *ppos)  { -	if (mvm->trans->trans_cfg->device_family < IWL_DEVICE_FAMILY_9000) +	if (mvm->trans->mac_cfg->device_family < IWL_DEVICE_FAMILY_9000)  		return -EOPNOTSUPP; +	/* +	 * If the firmware is not running, silently succeed since there is +	 * no data to clear. +	 */ +	if (!iwl_mvm_firmware_running(mvm)) +		return count; +  	mutex_lock(&mvm->mutex);  	iwl_fw_dbg_clear_monitor_buf(&mvm->fwrt);  	mutex_unlock(&mvm->mutex); @@ -1968,14 +1924,12 @@ MVM_DEBUGFS_READ_WRITE_FILE_OPS(disable_power_off, 64);  MVM_DEBUGFS_READ_FILE_OPS(fw_rx_stats);  MVM_DEBUGFS_READ_FILE_OPS(drv_rx_stats);  MVM_DEBUGFS_READ_FILE_OPS(fw_system_stats); -MVM_DEBUGFS_READ_FILE_OPS(fw_ver);  MVM_DEBUGFS_READ_FILE_OPS(phy_integration_ver);  MVM_DEBUGFS_READ_FILE_OPS(tas_get_status);  MVM_DEBUGFS_WRITE_FILE_OPS(fw_restart, 10);  MVM_DEBUGFS_WRITE_FILE_OPS(fw_nmi, 10);  MVM_DEBUGFS_READ_WRITE_FILE_OPS(scan_ant_rxchain, 8);  MVM_DEBUGFS_READ_WRITE_FILE_OPS(fw_dbg_conf, 8); -MVM_DEBUGFS_WRITE_FILE_OPS(fw_dbg_collect, 64);  MVM_DEBUGFS_WRITE_FILE_OPS(fw_dbg_clear, 64);  MVM_DEBUGFS_WRITE_FILE_OPS(dbg_time_point, 64);  MVM_DEBUGFS_WRITE_FILE_OPS(indirection_tbl, @@ -2168,7 +2122,6 @@ void iwl_mvm_dbgfs_register(struct iwl_mvm *mvm)  	MVM_DEBUGFS_ADD_FILE(force_ctkill, mvm->debugfs_dir, 0200);  	MVM_DEBUGFS_ADD_FILE(stations, mvm->debugfs_dir, 0400);  	MVM_DEBUGFS_ADD_FILE(disable_power_off, mvm->debugfs_dir, 0600); -	MVM_DEBUGFS_ADD_FILE(fw_ver, mvm->debugfs_dir, 0400);  	MVM_DEBUGFS_ADD_FILE(fw_rx_stats, mvm->debugfs_dir, 0400);  	MVM_DEBUGFS_ADD_FILE(drv_rx_stats, mvm->debugfs_dir, 0400);  	MVM_DEBUGFS_ADD_FILE(fw_system_stats, mvm->debugfs_dir, 0400); @@ -2177,7 +2130,6 @@ void iwl_mvm_dbgfs_register(struct iwl_mvm *mvm)  	MVM_DEBUGFS_ADD_FILE(scan_ant_rxchain, mvm->debugfs_dir, 0600);  	MVM_DEBUGFS_ADD_FILE(prph_reg, mvm->debugfs_dir, 0600);  	MVM_DEBUGFS_ADD_FILE(fw_dbg_conf, mvm->debugfs_dir, 0600); -	MVM_DEBUGFS_ADD_FILE(fw_dbg_collect, mvm->debugfs_dir, 0200);  	MVM_DEBUGFS_ADD_FILE(fw_dbg_clear, mvm->debugfs_dir, 0200);  	MVM_DEBUGFS_ADD_FILE(dbg_time_point, mvm->debugfs_dir, 0200);  	MVM_DEBUGFS_ADD_FILE(send_echo_cmd, mvm->debugfs_dir, 0200); | 
