mirror of
https://github.com/torvalds/linux.git
synced 2024-12-26 12:52:30 +00:00
iwlwifi: wrt: add 22000 device familiy prph dump support
Add prph dump addresses to support prph dump in 22000 HW. Signed-off-by: Shahar S Matityahu <shahar.s.matityahu@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
This commit is contained in:
parent
1122135df0
commit
7e08baeb3c
@ -469,6 +469,93 @@ static const struct iwl_prph_range iwl_prph_dump_addr_9000[] = {
|
||||
{ .start = 0x00a02400, .end = 0x00a02758 },
|
||||
};
|
||||
|
||||
static const struct iwl_prph_range iwl_prph_dump_addr_22000[] = {
|
||||
{ .start = 0x00a00000, .end = 0x00a00000 },
|
||||
{ .start = 0x00a0000c, .end = 0x00a00024 },
|
||||
{ .start = 0x00a0002c, .end = 0x00a00034 },
|
||||
{ .start = 0x00a0003c, .end = 0x00a0003c },
|
||||
{ .start = 0x00a00410, .end = 0x00a00418 },
|
||||
{ .start = 0x00a00420, .end = 0x00a00420 },
|
||||
{ .start = 0x00a00428, .end = 0x00a00428 },
|
||||
{ .start = 0x00a00430, .end = 0x00a0043c },
|
||||
{ .start = 0x00a00444, .end = 0x00a00444 },
|
||||
{ .start = 0x00a00840, .end = 0x00a00840 },
|
||||
{ .start = 0x00a00850, .end = 0x00a00858 },
|
||||
{ .start = 0x00a01004, .end = 0x00a01008 },
|
||||
{ .start = 0x00a01010, .end = 0x00a01010 },
|
||||
{ .start = 0x00a01018, .end = 0x00a01018 },
|
||||
{ .start = 0x00a01024, .end = 0x00a01024 },
|
||||
{ .start = 0x00a0102c, .end = 0x00a01034 },
|
||||
{ .start = 0x00a0103c, .end = 0x00a01040 },
|
||||
{ .start = 0x00a01048, .end = 0x00a01050 },
|
||||
{ .start = 0x00a01058, .end = 0x00a01058 },
|
||||
{ .start = 0x00a01060, .end = 0x00a01070 },
|
||||
{ .start = 0x00a0108c, .end = 0x00a0108c },
|
||||
{ .start = 0x00a01c20, .end = 0x00a01c28 },
|
||||
{ .start = 0x00a01d10, .end = 0x00a01d10 },
|
||||
{ .start = 0x00a01e28, .end = 0x00a01e2c },
|
||||
{ .start = 0x00a01e60, .end = 0x00a01e60 },
|
||||
{ .start = 0x00a01e80, .end = 0x00a01e80 },
|
||||
{ .start = 0x00a01ea0, .end = 0x00a01ea0 },
|
||||
{ .start = 0x00a02000, .end = 0x00a0201c },
|
||||
{ .start = 0x00a02024, .end = 0x00a02024 },
|
||||
{ .start = 0x00a02040, .end = 0x00a02048 },
|
||||
{ .start = 0x00a020c0, .end = 0x00a020e0 },
|
||||
{ .start = 0x00a02400, .end = 0x00a02404 },
|
||||
{ .start = 0x00a0240c, .end = 0x00a02414 },
|
||||
{ .start = 0x00a0241c, .end = 0x00a0243c },
|
||||
{ .start = 0x00a02448, .end = 0x00a024bc },
|
||||
{ .start = 0x00a024c4, .end = 0x00a024cc },
|
||||
{ .start = 0x00a02508, .end = 0x00a02508 },
|
||||
{ .start = 0x00a02510, .end = 0x00a02514 },
|
||||
{ .start = 0x00a0251c, .end = 0x00a0251c },
|
||||
{ .start = 0x00a0252c, .end = 0x00a0255c },
|
||||
{ .start = 0x00a02564, .end = 0x00a025a0 },
|
||||
{ .start = 0x00a025a8, .end = 0x00a025b4 },
|
||||
{ .start = 0x00a025c0, .end = 0x00a025c0 },
|
||||
{ .start = 0x00a025e8, .end = 0x00a025f4 },
|
||||
{ .start = 0x00a02c08, .end = 0x00a02c18 },
|
||||
{ .start = 0x00a02c2c, .end = 0x00a02c38 },
|
||||
{ .start = 0x00a02c68, .end = 0x00a02c78 },
|
||||
{ .start = 0x00a03000, .end = 0x00a03000 },
|
||||
{ .start = 0x00a03010, .end = 0x00a03014 },
|
||||
{ .start = 0x00a0301c, .end = 0x00a0302c },
|
||||
{ .start = 0x00a03034, .end = 0x00a03038 },
|
||||
{ .start = 0x00a03040, .end = 0x00a03044 },
|
||||
{ .start = 0x00a03060, .end = 0x00a03068 },
|
||||
{ .start = 0x00a03070, .end = 0x00a03070 },
|
||||
{ .start = 0x00a0307c, .end = 0x00a03084 },
|
||||
{ .start = 0x00a0308c, .end = 0x00a03090 },
|
||||
{ .start = 0x00a03098, .end = 0x00a03098 },
|
||||
{ .start = 0x00a030a0, .end = 0x00a030a0 },
|
||||
{ .start = 0x00a030a8, .end = 0x00a030b4 },
|
||||
{ .start = 0x00a030bc, .end = 0x00a030c0 },
|
||||
{ .start = 0x00a030c8, .end = 0x00a030f4 },
|
||||
{ .start = 0x00a03100, .end = 0x00a0312c },
|
||||
{ .start = 0x00a03c00, .end = 0x00a03c5c },
|
||||
{ .start = 0x00a04400, .end = 0x00a04454 },
|
||||
{ .start = 0x00a04460, .end = 0x00a04474 },
|
||||
{ .start = 0x00a044c0, .end = 0x00a044ec },
|
||||
{ .start = 0x00a04500, .end = 0x00a04504 },
|
||||
{ .start = 0x00a04510, .end = 0x00a04538 },
|
||||
{ .start = 0x00a04540, .end = 0x00a04548 },
|
||||
{ .start = 0x00a04560, .end = 0x00a04560 },
|
||||
{ .start = 0x00a04570, .end = 0x00a0457c },
|
||||
{ .start = 0x00a04590, .end = 0x00a04590 },
|
||||
{ .start = 0x00a04598, .end = 0x00a04598 },
|
||||
{ .start = 0x00a045c0, .end = 0x00a045f4 },
|
||||
{ .start = 0x00a0c000, .end = 0x00a0c018 },
|
||||
{ .start = 0x00a0c020, .end = 0x00a0c028 },
|
||||
{ .start = 0x00a0c038, .end = 0x00a0c094 },
|
||||
{ .start = 0x00a0c0c0, .end = 0x00a0c104 },
|
||||
{ .start = 0x00a0c10c, .end = 0x00a0c118 },
|
||||
{ .start = 0x00a0c150, .end = 0x00a0c174 },
|
||||
{ .start = 0x00a0c17c, .end = 0x00a0c188 },
|
||||
{ .start = 0x00a0c190, .end = 0x00a0c198 },
|
||||
{ .start = 0x00a0c1a0, .end = 0x00a0c1a8 },
|
||||
{ .start = 0x00a0c1b0, .end = 0x00a0c1b8 },
|
||||
};
|
||||
|
||||
static void iwl_read_prph_block(struct iwl_trans *trans, u32 start,
|
||||
u32 len_bytes, __le32 *data)
|
||||
{
|
||||
@ -478,15 +565,20 @@ static void iwl_read_prph_block(struct iwl_trans *trans, u32 start,
|
||||
*data++ = cpu_to_le32(iwl_read_prph_no_grab(trans, start + i));
|
||||
}
|
||||
|
||||
static void iwl_dump_prph(struct iwl_trans *trans,
|
||||
struct iwl_fw_error_dump_data **data,
|
||||
static void iwl_dump_prph(struct iwl_fw_runtime *fwrt,
|
||||
const struct iwl_prph_range *iwl_prph_dump_addr,
|
||||
u32 range_len)
|
||||
u32 range_len, void *ptr)
|
||||
{
|
||||
struct iwl_fw_error_dump_prph *prph;
|
||||
struct iwl_trans *trans = fwrt->trans;
|
||||
struct iwl_fw_error_dump_data **data =
|
||||
(struct iwl_fw_error_dump_data **)ptr;
|
||||
unsigned long flags;
|
||||
u32 i;
|
||||
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
IWL_DEBUG_INFO(trans, "WRT PRPH dump\n");
|
||||
|
||||
if (!iwl_trans_grab_nic_access(trans, &flags))
|
||||
@ -552,37 +644,47 @@ static struct scatterlist *alloc_sgtable(int size)
|
||||
return table;
|
||||
}
|
||||
|
||||
static int iwl_fw_get_prph_len(struct iwl_fw_runtime *fwrt)
|
||||
static void iwl_fw_get_prph_len(struct iwl_fw_runtime *fwrt,
|
||||
const struct iwl_prph_range *iwl_prph_dump_addr,
|
||||
u32 range_len, void *ptr)
|
||||
{
|
||||
u32 prph_len = 0;
|
||||
int i;
|
||||
u32 *prph_len = (u32 *)ptr;
|
||||
int i, num_bytes_in_chunk;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(iwl_prph_dump_addr_comm);
|
||||
i++) {
|
||||
if (!prph_len)
|
||||
return;
|
||||
|
||||
for (i = 0; i < range_len; i++) {
|
||||
/* The range includes both boundaries */
|
||||
int num_bytes_in_chunk =
|
||||
iwl_prph_dump_addr_comm[i].end -
|
||||
iwl_prph_dump_addr_comm[i].start + 4;
|
||||
num_bytes_in_chunk =
|
||||
iwl_prph_dump_addr[i].end -
|
||||
iwl_prph_dump_addr[i].start + 4;
|
||||
|
||||
prph_len += sizeof(struct iwl_fw_error_dump_data) +
|
||||
*prph_len += sizeof(struct iwl_fw_error_dump_data) +
|
||||
sizeof(struct iwl_fw_error_dump_prph) +
|
||||
num_bytes_in_chunk;
|
||||
}
|
||||
}
|
||||
|
||||
if (fwrt->trans->cfg->mq_rx_supported) {
|
||||
for (i = 0; i <
|
||||
ARRAY_SIZE(iwl_prph_dump_addr_9000); i++) {
|
||||
/* The range includes both boundaries */
|
||||
int num_bytes_in_chunk =
|
||||
iwl_prph_dump_addr_9000[i].end -
|
||||
iwl_prph_dump_addr_9000[i].start + 4;
|
||||
static void iwl_fw_prph_handler(struct iwl_fw_runtime *fwrt, void *ptr,
|
||||
void (*handler)(struct iwl_fw_runtime *,
|
||||
const struct iwl_prph_range *,
|
||||
u32, void *))
|
||||
{
|
||||
u32 range_len;
|
||||
|
||||
prph_len += sizeof(struct iwl_fw_error_dump_data) +
|
||||
sizeof(struct iwl_fw_error_dump_prph) +
|
||||
num_bytes_in_chunk;
|
||||
if (fwrt->trans->cfg->device_family >= IWL_DEVICE_FAMILY_22000) {
|
||||
range_len = ARRAY_SIZE(iwl_prph_dump_addr_22000);
|
||||
handler(fwrt, iwl_prph_dump_addr_22000, range_len, ptr);
|
||||
} else {
|
||||
range_len = ARRAY_SIZE(iwl_prph_dump_addr_comm);
|
||||
handler(fwrt, iwl_prph_dump_addr_comm, range_len, ptr);
|
||||
|
||||
if (fwrt->trans->cfg->mq_rx_supported) {
|
||||
range_len = ARRAY_SIZE(iwl_prph_dump_addr_9000);
|
||||
handler(fwrt, iwl_prph_dump_addr_9000, range_len, ptr);
|
||||
}
|
||||
}
|
||||
return prph_len;
|
||||
}
|
||||
|
||||
static void iwl_fw_dump_mem(struct iwl_fw_runtime *fwrt,
|
||||
@ -747,9 +849,9 @@ _iwl_fw_error_dump(struct iwl_fw_runtime *fwrt,
|
||||
fifo_len += iwl_fw_txf_len(fwrt, mem_cfg);
|
||||
|
||||
/* Make room for PRPH registers */
|
||||
if (!fwrt->trans->cfg->gen2 &&
|
||||
iwl_fw_dbg_type_on(fwrt, IWL_FW_ERROR_DUMP_PRPH))
|
||||
prph_len += iwl_fw_get_prph_len(fwrt);
|
||||
if (iwl_fw_dbg_type_on(fwrt, IWL_FW_ERROR_DUMP_PRPH))
|
||||
iwl_fw_prph_handler(fwrt, &prph_len,
|
||||
iwl_fw_get_prph_len);
|
||||
|
||||
if (fwrt->trans->cfg->device_family == IWL_DEVICE_FAMILY_7000 &&
|
||||
iwl_fw_dbg_type_on(fwrt, IWL_FW_ERROR_DUMP_RADIO_REG))
|
||||
@ -941,16 +1043,8 @@ _iwl_fw_error_dump(struct iwl_fw_runtime *fwrt,
|
||||
if (iwl_fw_dbg_is_paging_enabled(fwrt))
|
||||
iwl_dump_paging(fwrt, &dump_data);
|
||||
|
||||
if (prph_len) {
|
||||
iwl_dump_prph(fwrt->trans, &dump_data,
|
||||
iwl_prph_dump_addr_comm,
|
||||
ARRAY_SIZE(iwl_prph_dump_addr_comm));
|
||||
|
||||
if (fwrt->trans->cfg->mq_rx_supported)
|
||||
iwl_dump_prph(fwrt->trans, &dump_data,
|
||||
iwl_prph_dump_addr_9000,
|
||||
ARRAY_SIZE(iwl_prph_dump_addr_9000));
|
||||
}
|
||||
if (prph_len)
|
||||
iwl_fw_prph_handler(fwrt, &dump_data, iwl_dump_prph);
|
||||
|
||||
out:
|
||||
dump_file->file_len = cpu_to_le32(file_len);
|
||||
|
Loading…
Reference in New Issue
Block a user