aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWey-Yi Guy <wey-yi.w.guy@intel.com>2010-03-30 20:57:53 -0400
committerReinette Chatre <reinette.chatre@intel.com>2010-04-09 14:28:30 -0400
commit461ef382fd68f02b7bac8f94f7f2b85162bad896 (patch)
tree83bc8015c0dafcf239dd4096de14fcebc21e3a80
parent05d5752027d02ca9204d1ece5074d41000fee23d (diff)
iwlwifi: add more debug info in error event dump
When sys assert happen, driver will dump the error table information provided by uCode. There are more information available but is not being display by the driver; adding program counter and last host command the to log to help uCode debugging. Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c10
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-commands.h27
2 files changed, 32 insertions, 5 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index 3526d5ee4755..8a002c6f3a61 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -1843,6 +1843,7 @@ void iwl_dump_nic_error_log(struct iwl_priv *priv)
1843 u32 data2, line; 1843 u32 data2, line;
1844 u32 desc, time, count, base, data1; 1844 u32 desc, time, count, base, data1;
1845 u32 blink1, blink2, ilink1, ilink2; 1845 u32 blink1, blink2, ilink1, ilink2;
1846 u32 pc, hcmd;
1846 1847
1847 if (priv->ucode_type == UCODE_INIT) 1848 if (priv->ucode_type == UCODE_INIT)
1848 base = le32_to_cpu(priv->card_alive_init.error_event_table_ptr); 1849 base = le32_to_cpu(priv->card_alive_init.error_event_table_ptr);
@@ -1865,6 +1866,7 @@ void iwl_dump_nic_error_log(struct iwl_priv *priv)
1865 } 1866 }
1866 1867
1867 desc = iwl_read_targ_mem(priv, base + 1 * sizeof(u32)); 1868 desc = iwl_read_targ_mem(priv, base + 1 * sizeof(u32));
1869 pc = iwl_read_targ_mem(priv, base + 2 * sizeof(u32));
1868 blink1 = iwl_read_targ_mem(priv, base + 3 * sizeof(u32)); 1870 blink1 = iwl_read_targ_mem(priv, base + 3 * sizeof(u32));
1869 blink2 = iwl_read_targ_mem(priv, base + 4 * sizeof(u32)); 1871 blink2 = iwl_read_targ_mem(priv, base + 4 * sizeof(u32));
1870 ilink1 = iwl_read_targ_mem(priv, base + 5 * sizeof(u32)); 1872 ilink1 = iwl_read_targ_mem(priv, base + 5 * sizeof(u32));
@@ -1873,6 +1875,7 @@ void iwl_dump_nic_error_log(struct iwl_priv *priv)
1873 data2 = iwl_read_targ_mem(priv, base + 8 * sizeof(u32)); 1875 data2 = iwl_read_targ_mem(priv, base + 8 * sizeof(u32));
1874 line = iwl_read_targ_mem(priv, base + 9 * sizeof(u32)); 1876 line = iwl_read_targ_mem(priv, base + 9 * sizeof(u32));
1875 time = iwl_read_targ_mem(priv, base + 11 * sizeof(u32)); 1877 time = iwl_read_targ_mem(priv, base + 11 * sizeof(u32));
1878 hcmd = iwl_read_targ_mem(priv, base + 22 * sizeof(u32));
1876 1879
1877 trace_iwlwifi_dev_ucode_error(priv, desc, time, data1, data2, line, 1880 trace_iwlwifi_dev_ucode_error(priv, desc, time, data1, data2, line,
1878 blink1, blink2, ilink1, ilink2); 1881 blink1, blink2, ilink1, ilink2);
@@ -1881,10 +1884,9 @@ void iwl_dump_nic_error_log(struct iwl_priv *priv)
1881 "data1 data2 line\n"); 1884 "data1 data2 line\n");
1882 IWL_ERR(priv, "%-28s (#%02d) %010u 0x%08X 0x%08X %u\n", 1885 IWL_ERR(priv, "%-28s (#%02d) %010u 0x%08X 0x%08X %u\n",
1883 desc_lookup(desc), desc, time, data1, data2, line); 1886 desc_lookup(desc), desc, time, data1, data2, line);
1884 IWL_ERR(priv, "blink1 blink2 ilink1 ilink2\n"); 1887 IWL_ERR(priv, "pc blink1 blink2 ilink1 ilink2 hcmd\n");
1885 IWL_ERR(priv, "0x%05X 0x%05X 0x%05X 0x%05X\n", blink1, blink2, 1888 IWL_ERR(priv, "0x%05X 0x%05X 0x%05X 0x%05X 0x%05X 0x%05X\n",
1886 ilink1, ilink2); 1889 pc, blink1, blink2, ilink1, ilink2, hcmd);
1887
1888} 1890}
1889 1891
1890#define EVENT_START_OFFSET (4 * sizeof(u32)) 1892#define EVENT_START_OFFSET (4 * sizeof(u32))
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h
index 6383d9f8c9b3..74d6887c7500 100644
--- a/drivers/net/wireless/iwlwifi/iwl-commands.h
+++ b/drivers/net/wireless/iwlwifi/iwl-commands.h
@@ -512,8 +512,9 @@ struct iwl_init_alive_resp {
512 * 512 *
513 * Entries without timestamps contain only event_id and data. 513 * Entries without timestamps contain only event_id and data.
514 * 514 *
515 *
515 * 2) error_event_table_ptr indicates base of the error log. This contains 516 * 2) error_event_table_ptr indicates base of the error log. This contains
516 * information about any uCode error that occurs. For 4965, the format 517 * information about any uCode error that occurs. For agn, the format
517 * of the error log is: 518 * of the error log is:
518 * 519 *
519 * __le32 valid; (nonzero) valid, (0) log is empty 520 * __le32 valid; (nonzero) valid, (0) log is empty
@@ -529,6 +530,30 @@ struct iwl_init_alive_resp {
529 * __le32 bcon_time; beacon timer 530 * __le32 bcon_time; beacon timer
530 * __le32 tsf_low; network timestamp function timer 531 * __le32 tsf_low; network timestamp function timer
531 * __le32 tsf_hi; network timestamp function timer 532 * __le32 tsf_hi; network timestamp function timer
533 * __le32 gp1; GP1 timer register
534 * __le32 gp2; GP2 timer register
535 * __le32 gp3; GP3 timer register
536 * __le32 ucode_ver; uCode version
537 * __le32 hw_ver; HW Silicon version
538 * __le32 brd_ver; HW board version
539 * __le32 log_pc; log program counter
540 * __le32 frame_ptr; frame pointer
541 * __le32 stack_ptr; stack pointer
542 * __le32 hcmd; last host command
543 * __le32 isr0; isr status register LMPM_NIC_ISR0: rxtx_flag
544 * __le32 isr1; isr status register LMPM_NIC_ISR1: host_flag
545 * __le32 isr2; isr status register LMPM_NIC_ISR2: enc_flag
546 * __le32 isr3; isr status register LMPM_NIC_ISR3: time_flag
547 * __le32 isr4; isr status register LMPM_NIC_ISR4: wico interrupt
548 * __le32 isr_pref; isr status register LMPM_NIC_PREF_STAT
549 * __le32 wait_event; wait event() caller address
550 * __le32 l2p_control; L2pControlField
551 * __le32 l2p_duration; L2pDurationField
552 * __le32 l2p_mhvalid; L2pMhValidBits
553 * __le32 l2p_addr_match; L2pAddrMatchStat
554 * __le32 lmpm_pmg_sel; indicate which clocks are turned on (LMPM_PMG_SEL)
555 * __le32 u_timestamp; indicate when the date and time of the compilation
556 * __le32 reserved;
532 * 557 *
533 * The Linux driver can print both logs to the system log when a uCode error 558 * The Linux driver can print both logs to the system log when a uCode error
534 * occurs. 559 * occurs.