aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl3945-base.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl3945-base.c')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl3945-base.c42
1 files changed, 33 insertions, 9 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
index 23b31e6dcacd..05f118529fea 100644
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
@@ -1570,6 +1570,7 @@ static void iwl3945_print_event_log(struct iwl_priv *priv, u32 start_idx,
1570 u32 event_size; /* 2 u32s, or 3 u32s if timestamp recorded */ 1570 u32 event_size; /* 2 u32s, or 3 u32s if timestamp recorded */
1571 u32 ptr; /* SRAM byte address of log data */ 1571 u32 ptr; /* SRAM byte address of log data */
1572 u32 ev, time, data; /* event log data */ 1572 u32 ev, time, data; /* event log data */
1573 unsigned long reg_flags;
1573 1574
1574 if (num_events == 0) 1575 if (num_events == 0)
1575 return; 1576 return;
@@ -1583,26 +1584,38 @@ static void iwl3945_print_event_log(struct iwl_priv *priv, u32 start_idx,
1583 1584
1584 ptr = base + EVENT_START_OFFSET + (start_idx * event_size); 1585 ptr = base + EVENT_START_OFFSET + (start_idx * event_size);
1585 1586
1587 /* Make sure device is powered up for SRAM reads */
1588 spin_lock_irqsave(&priv->reg_lock, reg_flags);
1589 iwl_grab_nic_access(priv);
1590
1591 /* Set starting address; reads will auto-increment */
1592 _iwl_write_direct32(priv, HBUS_TARG_MEM_RADDR, ptr);
1593 rmb();
1594
1586 /* "time" is actually "data" for mode 0 (no timestamp). 1595 /* "time" is actually "data" for mode 0 (no timestamp).
1587 * place event id # at far right for easier visual parsing. */ 1596 * place event id # at far right for easier visual parsing. */
1588 for (i = 0; i < num_events; i++) { 1597 for (i = 0; i < num_events; i++) {
1589 ev = iwl_read_targ_mem(priv, ptr); 1598 ev = _iwl_read_direct32(priv, HBUS_TARG_MEM_RDAT);
1590 ptr += sizeof(u32); 1599 time = _iwl_read_direct32(priv, HBUS_TARG_MEM_RDAT);
1591 time = iwl_read_targ_mem(priv, ptr);
1592 ptr += sizeof(u32);
1593 if (mode == 0) { 1600 if (mode == 0) {
1594 /* data, ev */ 1601 /* data, ev */
1595 IWL_ERR(priv, "0x%08x\t%04u\n", time, ev); 1602 IWL_ERR(priv, "0x%08x\t%04u\n", time, ev);
1596 trace_iwlwifi_dev_ucode_event(priv, 0, time, ev); 1603 trace_iwlwifi_dev_ucode_event(priv, 0, time, ev);
1597 } else { 1604 } else {
1598 data = iwl_read_targ_mem(priv, ptr); 1605 data = _iwl_read_direct32(priv, HBUS_TARG_MEM_RDAT);
1599 ptr += sizeof(u32);
1600 IWL_ERR(priv, "%010u\t0x%08x\t%04u\n", time, data, ev); 1606 IWL_ERR(priv, "%010u\t0x%08x\t%04u\n", time, data, ev);
1601 trace_iwlwifi_dev_ucode_event(priv, time, data, ev); 1607 trace_iwlwifi_dev_ucode_event(priv, time, data, ev);
1602 } 1608 }
1603 } 1609 }
1610
1611 /* Allow device to power down */
1612 iwl_release_nic_access(priv);
1613 spin_unlock_irqrestore(&priv->reg_lock, reg_flags);
1604} 1614}
1605 1615
1616/* For sanity check only. Actual size is determined by uCode, typ. 512 */
1617#define IWL3945_MAX_EVENT_LOG_SIZE (512)
1618
1606void iwl3945_dump_nic_event_log(struct iwl_priv *priv) 1619void iwl3945_dump_nic_event_log(struct iwl_priv *priv)
1607{ 1620{
1608 u32 base; /* SRAM byte address of event log header */ 1621 u32 base; /* SRAM byte address of event log header */
@@ -1624,6 +1637,18 @@ void iwl3945_dump_nic_event_log(struct iwl_priv *priv)
1624 num_wraps = iwl_read_targ_mem(priv, base + (2 * sizeof(u32))); 1637 num_wraps = iwl_read_targ_mem(priv, base + (2 * sizeof(u32)));
1625 next_entry = iwl_read_targ_mem(priv, base + (3 * sizeof(u32))); 1638 next_entry = iwl_read_targ_mem(priv, base + (3 * sizeof(u32)));
1626 1639
1640 if (capacity > IWL3945_MAX_EVENT_LOG_SIZE) {
1641 IWL_ERR(priv, "Log capacity %d is bogus, limit to %d entries\n",
1642 capacity, IWL3945_MAX_EVENT_LOG_SIZE);
1643 capacity = IWL3945_MAX_EVENT_LOG_SIZE;
1644 }
1645
1646 if (next_entry > IWL3945_MAX_EVENT_LOG_SIZE) {
1647 IWL_ERR(priv, "Log write index %d is bogus, limit to %d\n",
1648 next_entry, IWL3945_MAX_EVENT_LOG_SIZE);
1649 next_entry = IWL3945_MAX_EVENT_LOG_SIZE;
1650 }
1651
1627 size = num_wraps ? capacity : next_entry; 1652 size = num_wraps ? capacity : next_entry;
1628 1653
1629 /* bail out if nothing in log */ 1654 /* bail out if nothing in log */
@@ -2575,9 +2600,8 @@ static void __iwl3945_down(struct iwl_priv *priv)
2575 iwl3945_hw_txq_ctx_stop(priv); 2600 iwl3945_hw_txq_ctx_stop(priv);
2576 iwl3945_hw_rxq_stop(priv); 2601 iwl3945_hw_rxq_stop(priv);
2577 2602
2578 iwl_write_prph(priv, APMG_CLK_DIS_REG, 2603 /* Power-down device's busmaster DMA clocks */
2579 APMG_CLK_VAL_DMA_CLK_RQT); 2604 iwl_write_prph(priv, APMG_CLK_DIS_REG, APMG_CLK_VAL_DMA_CLK_RQT);
2580
2581 udelay(5); 2605 udelay(5);
2582 2606
2583 /* Stop the device, and put it in low power state */ 2607 /* Stop the device, and put it in low power state */