Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 655e6d6d authored by Emmanuel Grumbach's avatar Emmanuel Grumbach
Browse files

iwlwifi: mvm: kill iwl_mvm_fw_error_rxf_dump



Its content can move to the caller.
While at it, move iwl_mvm_fw_error_rxf_dump to caller.

Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
parent 78dae98f
Loading
Loading
Loading
Loading
+100 −0
Original line number Original line Diff line number Diff line
@@ -80,6 +80,8 @@
#include "fw-api-scan.h"
#include "fw-api-scan.h"
#include "iwl-phy-db.h"
#include "iwl-phy-db.h"
#include "testmode.h"
#include "testmode.h"
#include "iwl-fw-error-dump.h"
#include "iwl-prph.h"


static const struct ieee80211_iface_limit iwl_mvm_limits[] = {
static const struct ieee80211_iface_limit iwl_mvm_limits[] = {
	{
	{
@@ -645,6 +647,104 @@ static void iwl_mvm_cleanup_iterator(void *data, u8 *mac,
	mvmvif->phy_ctxt = NULL;
	mvmvif->phy_ctxt = NULL;
}
}


#ifdef CONFIG_IWLWIFI_DEBUGFS
static void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
{
	struct iwl_fw_error_dump_file *dump_file;
	struct iwl_fw_error_dump_data *dump_data;
	struct iwl_fw_error_dump_info *dump_info;
	const struct fw_img *img;
	u32 sram_len, sram_ofs;
	u32 file_len, rxf_len;
	unsigned long flags;
	u32 trans_len;
	int reg_val;

	lockdep_assert_held(&mvm->mutex);

	if (mvm->fw_error_dump)
		return;

	img = &mvm->fw->img[mvm->cur_ucode];
	sram_ofs = img->sec[IWL_UCODE_SECTION_DATA].offset;
	sram_len = img->sec[IWL_UCODE_SECTION_DATA].len;

	/* reading buffer size */
	reg_val = iwl_trans_read_prph(mvm->trans, RXF_SIZE_ADDR);
	rxf_len = (reg_val & RXF_SIZE_BYTE_CNT_MSK) >> RXF_SIZE_BYTE_CND_POS;

	/* the register holds the value divided by 128 */
	rxf_len = rxf_len << 7;

	file_len = sizeof(*dump_file) +
		   sizeof(*dump_data) * 3 +
		   sram_len +
		   rxf_len +
		   sizeof(*dump_info);

	trans_len = iwl_trans_dump_data(mvm->trans, NULL, 0);
	if (trans_len)
		file_len += trans_len;

	dump_file = vmalloc(file_len);
	if (!dump_file)
		return;

	mvm->fw_error_dump = dump_file;

	dump_file->barker = cpu_to_le32(IWL_FW_ERROR_DUMP_BARKER);
	dump_file->file_len = cpu_to_le32(file_len);
	dump_data = (void *)dump_file->data;

	dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_DEV_FW_INFO);
	dump_data->len = cpu_to_le32(sizeof(*dump_info));
	dump_info = (void *) dump_data->data;
	dump_info->device_family =
		mvm->cfg->device_family == IWL_DEVICE_FAMILY_7000 ?
			cpu_to_le32(IWL_FW_ERROR_DUMP_FAMILY_7) :
			cpu_to_le32(IWL_FW_ERROR_DUMP_FAMILY_8);
	memcpy(dump_info->fw_human_readable, mvm->fw->human_readable,
	       sizeof(dump_info->fw_human_readable));
	strncpy(dump_info->dev_human_readable, mvm->cfg->name,
		sizeof(dump_info->dev_human_readable));
	strncpy(dump_info->bus_human_readable, mvm->dev->bus->name,
		sizeof(dump_info->bus_human_readable));

	dump_data = iwl_fw_error_next_data(dump_data);
	dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_RXF);
	dump_data->len = cpu_to_le32(rxf_len);

	if (iwl_trans_grab_nic_access(mvm->trans, false, &flags)) {
		u32 *rxf = (void *)dump_data->data;
		int i;

		for (i = 0; i < (rxf_len / sizeof(u32)); i++) {
			iwl_trans_write_prph(mvm->trans,
					     RXF_LD_FENCE_OFFSET_ADDR,
					     i * sizeof(u32));
			rxf[i] = iwl_trans_read_prph(mvm->trans,
						     RXF_FIFO_RD_FENCE_ADDR);
		}
		iwl_trans_release_nic_access(mvm->trans, &flags);
	}

	dump_data = iwl_fw_error_next_data(dump_data);
	dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_SRAM);
	dump_data->len = cpu_to_le32(sram_len);
	iwl_trans_read_mem_bytes(mvm->trans, sram_ofs, dump_data->data,
				 sram_len);

	if (trans_len) {
		void *buf = iwl_fw_error_next_data(dump_data);
		u32 real_trans_len = iwl_trans_dump_data(mvm->trans, buf,
							 trans_len);
		dump_data = (void *)((u8 *)buf + real_trans_len);
		dump_file->file_len =
			cpu_to_le32(file_len - trans_len + real_trans_len);
	}
}
#endif

static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm)
static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm)
{
{
#ifdef CONFIG_IWLWIFI_DEBUGFS
#ifdef CONFIG_IWLWIFI_DEBUGFS
+0 −6
Original line number Original line Diff line number Diff line
@@ -595,8 +595,6 @@ struct iwl_mvm {
	/* -1 for always, 0 for never, >0 for that many times */
	/* -1 for always, 0 for never, >0 for that many times */
	s8 restart_fw;
	s8 restart_fw;
	void *fw_error_dump;
	void *fw_error_dump;
	u32 *fw_error_rxf;
	u32 fw_error_rxf_len;


#ifdef CONFIG_IWLWIFI_LEDS
#ifdef CONFIG_IWLWIFI_LEDS
	struct led_classdev led;
	struct led_classdev led;
@@ -730,10 +728,6 @@ void iwl_mvm_hwrate_to_tx_rate(u32 rate_n_flags,
			       struct ieee80211_tx_rate *r);
			       struct ieee80211_tx_rate *r);
u8 iwl_mvm_mac80211_idx_to_hwrate(int rate_idx);
u8 iwl_mvm_mac80211_idx_to_hwrate(int rate_idx);
void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm);
void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm);
#ifdef CONFIG_IWLWIFI_DEBUGFS
void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm);
void iwl_mvm_fw_error_rxf_dump(struct iwl_mvm *mvm);
#endif
u8 first_antenna(u8 mask);
u8 first_antenna(u8 mask);
u8 iwl_mvm_next_antenna(struct iwl_mvm *mvm, u8 valid, u8 last_idx);
u8 iwl_mvm_next_antenna(struct iwl_mvm *mvm, u8 valid, u8 last_idx);


+0 −83
Original line number Original line Diff line number Diff line
@@ -550,7 +550,6 @@ static void iwl_op_mode_mvm_stop(struct iwl_op_mode *op_mode)


	kfree(mvm->scan_cmd);
	kfree(mvm->scan_cmd);
	vfree(mvm->fw_error_dump);
	vfree(mvm->fw_error_dump);
	kfree(mvm->fw_error_rxf);
	kfree(mvm->mcast_filter_cmd);
	kfree(mvm->mcast_filter_cmd);
	mvm->mcast_filter_cmd = NULL;
	mvm->mcast_filter_cmd = NULL;


@@ -821,88 +820,6 @@ static void iwl_mvm_nic_restart(struct iwl_mvm *mvm)
	}
	}
}
}


#ifdef CONFIG_IWLWIFI_DEBUGFS
void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
{
	struct iwl_fw_error_dump_file *dump_file;
	struct iwl_fw_error_dump_data *dump_data;
	struct iwl_fw_error_dump_info *dump_info;
	const struct fw_img *img;
	u32 sram_len, sram_ofs;
	u32 file_len;
	u32 trans_len;

	lockdep_assert_held(&mvm->mutex);

	if (mvm->fw_error_dump)
		return;

	img = &mvm->fw->img[mvm->cur_ucode];
	sram_ofs = img->sec[IWL_UCODE_SECTION_DATA].offset;
	sram_len = img->sec[IWL_UCODE_SECTION_DATA].len;

	file_len = sizeof(*dump_file) +
		   sizeof(*dump_data) * 3 +
		   sram_len +
		   mvm->fw_error_rxf_len +
		   sizeof(*dump_info);

	trans_len = iwl_trans_dump_data(mvm->trans, NULL, 0);
	if (trans_len)
		file_len += trans_len;

	dump_file = vmalloc(file_len);
	if (!dump_file)
		return;

	mvm->fw_error_dump = dump_file;

	dump_file->barker = cpu_to_le32(IWL_FW_ERROR_DUMP_BARKER);
	dump_file->file_len = cpu_to_le32(file_len);
	dump_data = (void *)dump_file->data;

	dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_DEV_FW_INFO);
	dump_data->len = cpu_to_le32(sizeof(*dump_info));
	dump_info = (void *) dump_data->data;
	dump_info->device_family =
		mvm->cfg->device_family == IWL_DEVICE_FAMILY_7000 ?
			cpu_to_le32(IWL_FW_ERROR_DUMP_FAMILY_7) :
			cpu_to_le32(IWL_FW_ERROR_DUMP_FAMILY_8);
	memcpy(dump_info->fw_human_readable, mvm->fw->human_readable,
	       sizeof(dump_info->fw_human_readable));
	strncpy(dump_info->dev_human_readable, mvm->cfg->name,
		sizeof(dump_info->dev_human_readable));
	strncpy(dump_info->bus_human_readable, mvm->dev->bus->name,
		sizeof(dump_info->bus_human_readable));

	iwl_mvm_fw_error_rxf_dump(mvm);

	dump_data = iwl_fw_error_next_data(dump_data);
	dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_RXF);
	dump_data->len = cpu_to_le32(mvm->fw_error_rxf_len);
	memcpy(dump_data->data, mvm->fw_error_rxf, mvm->fw_error_rxf_len);

	dump_data = iwl_fw_error_next_data(dump_data);
	dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_SRAM);
	dump_data->len = cpu_to_le32(sram_len);
	iwl_trans_read_mem_bytes(mvm->trans, sram_ofs, dump_data->data,
				 sram_len);

	kfree(mvm->fw_error_rxf);
	mvm->fw_error_rxf = NULL;
	mvm->fw_error_rxf_len = 0;

	if (trans_len) {
		void *buf = iwl_fw_error_next_data(dump_data);
		u32 real_trans_len = iwl_trans_dump_data(mvm->trans, buf,
							 trans_len);
		dump_data = (void *)((u8 *)buf + real_trans_len);
		dump_file->file_len =
			cpu_to_le32(file_len - trans_len + real_trans_len);
	}
}
#endif

static void iwl_mvm_nic_error(struct iwl_op_mode *op_mode)
static void iwl_mvm_nic_error(struct iwl_op_mode *op_mode)
{
{
	struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);
	struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);
+0 −43
Original line number Original line Diff line number Diff line
@@ -519,49 +519,6 @@ void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm)
		iwl_mvm_dump_umac_error_log(mvm);
		iwl_mvm_dump_umac_error_log(mvm);
}
}


#ifdef CONFIG_IWLWIFI_DEBUGFS
void iwl_mvm_fw_error_rxf_dump(struct iwl_mvm *mvm)
{
	int i, reg_val;
	unsigned long flags;

	if (!mvm->ucode_loaded || mvm->fw_error_rxf || mvm->fw_error_dump)
		return;

	/* reading buffer size */
	reg_val = iwl_trans_read_prph(mvm->trans, RXF_SIZE_ADDR);
	mvm->fw_error_rxf_len =
		(reg_val & RXF_SIZE_BYTE_CNT_MSK) >> RXF_SIZE_BYTE_CND_POS;

	/* the register holds the value divided by 128 */
	mvm->fw_error_rxf_len = mvm->fw_error_rxf_len << 7;

	if (!mvm->fw_error_rxf_len)
		return;

	mvm->fw_error_rxf =  kzalloc(mvm->fw_error_rxf_len, GFP_ATOMIC);
	if (!mvm->fw_error_rxf) {
		mvm->fw_error_rxf_len = 0;
		return;
	}

	if (!iwl_trans_grab_nic_access(mvm->trans, false, &flags)) {
		kfree(mvm->fw_error_rxf);
		mvm->fw_error_rxf = NULL;
		mvm->fw_error_rxf_len = 0;
		return;
	}

	for (i = 0; i < (mvm->fw_error_rxf_len / sizeof(u32)); i++) {
		iwl_trans_write_prph(mvm->trans, RXF_LD_FENCE_OFFSET_ADDR,
				     i * sizeof(u32));
		mvm->fw_error_rxf[i] =
			iwl_trans_read_prph(mvm->trans, RXF_FIFO_RD_FENCE_ADDR);
	}
	iwl_trans_release_nic_access(mvm->trans, &flags);
}
#endif

/**
/**
 * iwl_mvm_send_lq_cmd() - Send link quality command
 * iwl_mvm_send_lq_cmd() - Send link quality command
 * @init: This command is sent as part of station initialization right
 * @init: This command is sent as part of station initialization right