316 lines
10 KiB
Diff
316 lines
10 KiB
Diff
|
From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
|
||
|
Date: Tue, 28 Oct 2014 08:11:25 +0200
|
||
|
Subject: iwlwifi: mvm: kill iwl_mvm_fw_error_rxf_dump
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
Origin: https://git.kernel.org/linus/655e6d6db21b0c0d411aef9d816816fb68b0496c
|
||
|
Bug-Debian: https://bugs.debian.org/767088
|
||
|
|
||
|
Its content can move to the caller.
|
||
|
While at it, move iwl_mvm_fw_error_rxf_dump to caller.
|
||
|
|
||
|
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
|
||
|
---
|
||
|
drivers/net/wireless/iwlwifi/mvm/mac80211.c | 100 ++++++++++++++++++++++++++++
|
||
|
drivers/net/wireless/iwlwifi/mvm/mvm.h | 6 --
|
||
|
drivers/net/wireless/iwlwifi/mvm/ops.c | 83 -----------------------
|
||
|
drivers/net/wireless/iwlwifi/mvm/utils.c | 43 ------------
|
||
|
4 files changed, 100 insertions(+), 132 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
|
||
|
index 98556d0..ed10e55 100644
|
||
|
--- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
|
||
|
+++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
|
||
|
@@ -80,6 +80,8 @@
|
||
|
#include "fw-api-scan.h"
|
||
|
#include "iwl-phy-db.h"
|
||
|
#include "testmode.h"
|
||
|
+#include "iwl-fw-error-dump.h"
|
||
|
+#include "iwl-prph.h"
|
||
|
|
||
|
static const struct ieee80211_iface_limit iwl_mvm_limits[] = {
|
||
|
{
|
||
|
@@ -637,6 +639,104 @@ static void iwl_mvm_cleanup_iterator(void *data, u8 *mac,
|
||
|
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)
|
||
|
{
|
||
|
#ifdef CONFIG_IWLWIFI_DEBUGFS
|
||
|
diff --git a/drivers/net/wireless/iwlwifi/mvm/mvm.h b/drivers/net/wireless/iwlwifi/mvm/mvm.h
|
||
|
index e084fc6..e99b7f1 100644
|
||
|
--- a/drivers/net/wireless/iwlwifi/mvm/mvm.h
|
||
|
+++ b/drivers/net/wireless/iwlwifi/mvm/mvm.h
|
||
|
@@ -586,8 +586,6 @@ struct iwl_mvm {
|
||
|
/* -1 for always, 0 for never, >0 for that many times */
|
||
|
s8 restart_fw;
|
||
|
void *fw_error_dump;
|
||
|
- u32 *fw_error_rxf;
|
||
|
- u32 fw_error_rxf_len;
|
||
|
|
||
|
#ifdef CONFIG_IWLWIFI_LEDS
|
||
|
struct led_classdev led;
|
||
|
@@ -717,10 +715,6 @@ void iwl_mvm_hwrate_to_tx_rate(u32 rate_n_flags,
|
||
|
struct ieee80211_tx_rate *r);
|
||
|
u8 iwl_mvm_mac80211_idx_to_hwrate(int rate_idx);
|
||
|
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 iwl_mvm_next_antenna(struct iwl_mvm *mvm, u8 valid, u8 last_idx);
|
||
|
|
||
|
diff --git a/drivers/net/wireless/iwlwifi/mvm/ops.c b/drivers/net/wireless/iwlwifi/mvm/ops.c
|
||
|
index 94506ec..172c1d4 100644
|
||
|
--- a/drivers/net/wireless/iwlwifi/mvm/ops.c
|
||
|
+++ b/drivers/net/wireless/iwlwifi/mvm/ops.c
|
||
|
@@ -549,7 +549,6 @@ static void iwl_op_mode_mvm_stop(struct iwl_op_mode *op_mode)
|
||
|
|
||
|
kfree(mvm->scan_cmd);
|
||
|
vfree(mvm->fw_error_dump);
|
||
|
- kfree(mvm->fw_error_rxf);
|
||
|
kfree(mvm->mcast_filter_cmd);
|
||
|
mvm->mcast_filter_cmd = NULL;
|
||
|
|
||
|
@@ -820,88 +819,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)
|
||
|
{
|
||
|
struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);
|
||
|
diff --git a/drivers/net/wireless/iwlwifi/mvm/utils.c b/drivers/net/wireless/iwlwifi/mvm/utils.c
|
||
|
index 15db97c..ac249da 100644
|
||
|
--- a/drivers/net/wireless/iwlwifi/mvm/utils.c
|
||
|
+++ b/drivers/net/wireless/iwlwifi/mvm/utils.c
|
||
|
@@ -519,49 +519,6 @@ void iwl_mvm_dump_nic_error_log(struct iwl_mvm *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
|
||
|
* @init: This command is sent as part of station initialization right
|