diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl3945-base.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 42 |
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 | |||
1606 | void iwl3945_dump_nic_event_log(struct iwl_priv *priv) | 1619 | void 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 */ |