diff options
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-3945.h | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 76 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.c | 5 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.h | 8 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-debugfs.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 74 |
6 files changed, 130 insertions, 37 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.h b/drivers/net/wireless/iwlwifi/iwl-3945.h index a41f0e098cf6..ecc23ec1f6a4 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945.h | |||
| @@ -227,7 +227,7 @@ extern void iwl3945_rx_replenish(void *data); | |||
| 227 | extern void iwl3945_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq); | 227 | extern void iwl3945_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq); |
| 228 | extern unsigned int iwl3945_fill_beacon_frame(struct iwl_priv *priv, | 228 | extern unsigned int iwl3945_fill_beacon_frame(struct iwl_priv *priv, |
| 229 | struct ieee80211_hdr *hdr,int left); | 229 | struct ieee80211_hdr *hdr,int left); |
| 230 | extern void iwl3945_dump_nic_event_log(struct iwl_priv *priv); | 230 | extern void iwl3945_dump_nic_event_log(struct iwl_priv *priv, bool full_log); |
| 231 | extern void iwl3945_dump_nic_error_log(struct iwl_priv *priv); | 231 | extern void iwl3945_dump_nic_error_log(struct iwl_priv *priv); |
| 232 | 232 | ||
| 233 | /* | 233 | /* |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 927131192572..9b04b25f0e57 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
| @@ -1696,8 +1696,6 @@ void iwl_dump_nic_error_log(struct iwl_priv *priv) | |||
| 1696 | 1696 | ||
| 1697 | } | 1697 | } |
| 1698 | 1698 | ||
| 1699 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
| 1700 | |||
| 1701 | #define EVENT_START_OFFSET (4 * sizeof(u32)) | 1699 | #define EVENT_START_OFFSET (4 * sizeof(u32)) |
| 1702 | 1700 | ||
| 1703 | /** | 1701 | /** |
| @@ -1758,10 +1756,42 @@ static void iwl_print_event_log(struct iwl_priv *priv, u32 start_idx, | |||
| 1758 | spin_unlock_irqrestore(&priv->reg_lock, reg_flags); | 1756 | spin_unlock_irqrestore(&priv->reg_lock, reg_flags); |
| 1759 | } | 1757 | } |
| 1760 | 1758 | ||
| 1759 | /** | ||
| 1760 | * iwl_print_last_event_logs - Dump the newest # of event log to syslog | ||
| 1761 | */ | ||
| 1762 | static void iwl_print_last_event_logs(struct iwl_priv *priv, u32 capacity, | ||
| 1763 | u32 num_wraps, u32 next_entry, | ||
| 1764 | u32 size, u32 mode) | ||
| 1765 | { | ||
| 1766 | /* | ||
| 1767 | * display the newest DEFAULT_LOG_ENTRIES entries | ||
| 1768 | * i.e the entries just before the next ont that uCode would fill. | ||
| 1769 | */ | ||
| 1770 | if (num_wraps) { | ||
| 1771 | if (next_entry < size) { | ||
| 1772 | iwl_print_event_log(priv, | ||
| 1773 | capacity - (size - next_entry), | ||
| 1774 | size - next_entry, mode); | ||
| 1775 | iwl_print_event_log(priv, 0, | ||
| 1776 | next_entry, mode); | ||
| 1777 | } else | ||
| 1778 | iwl_print_event_log(priv, next_entry - size, | ||
| 1779 | size, mode); | ||
| 1780 | } else { | ||
| 1781 | if (next_entry < size) | ||
| 1782 | iwl_print_event_log(priv, 0, next_entry, mode); | ||
| 1783 | else | ||
| 1784 | iwl_print_event_log(priv, next_entry - size, | ||
| 1785 | size, mode); | ||
| 1786 | } | ||
| 1787 | } | ||
| 1788 | |||
| 1761 | /* For sanity check only. Actual size is determined by uCode, typ. 512 */ | 1789 | /* For sanity check only. Actual size is determined by uCode, typ. 512 */ |
| 1762 | #define MAX_EVENT_LOG_SIZE (512) | 1790 | #define MAX_EVENT_LOG_SIZE (512) |
| 1763 | 1791 | ||
| 1764 | void iwl_dump_nic_event_log(struct iwl_priv *priv) | 1792 | #define DEFAULT_DUMP_EVENT_LOG_ENTRIES (20) |
| 1793 | |||
| 1794 | void iwl_dump_nic_event_log(struct iwl_priv *priv, bool full_log) | ||
| 1765 | { | 1795 | { |
| 1766 | u32 base; /* SRAM byte address of event log header */ | 1796 | u32 base; /* SRAM byte address of event log header */ |
| 1767 | u32 capacity; /* event log capacity in # entries */ | 1797 | u32 capacity; /* event log capacity in # entries */ |
| @@ -1806,19 +1836,37 @@ void iwl_dump_nic_event_log(struct iwl_priv *priv) | |||
| 1806 | return; | 1836 | return; |
| 1807 | } | 1837 | } |
| 1808 | 1838 | ||
| 1809 | IWL_ERR(priv, "Start IWL Event Log Dump: display count %d, wraps %d\n", | 1839 | #ifdef CONFIG_IWLWIFI_DEBUG |
| 1810 | size, num_wraps); | 1840 | if (!(iwl_get_debug_level(priv) & IWL_DL_FW_ERRORS)) |
| 1811 | 1841 | size = (size > DEFAULT_DUMP_EVENT_LOG_ENTRIES) | |
| 1812 | /* if uCode has wrapped back to top of log, start at the oldest entry, | 1842 | ? DEFAULT_DUMP_EVENT_LOG_ENTRIES : size; |
| 1813 | * i.e the next one that uCode would fill. */ | 1843 | #else |
| 1814 | if (num_wraps) | 1844 | size = (size > DEFAULT_DUMP_EVENT_LOG_ENTRIES) |
| 1815 | iwl_print_event_log(priv, next_entry, | 1845 | ? DEFAULT_DUMP_EVENT_LOG_ENTRIES : size; |
| 1816 | capacity - next_entry, mode); | 1846 | #endif |
| 1817 | /* (then/else) start at top of log */ | 1847 | IWL_ERR(priv, "Start IWL Event Log Dump: display last %u entries\n", |
| 1818 | iwl_print_event_log(priv, 0, next_entry, mode); | 1848 | size); |
| 1819 | 1849 | ||
| 1820 | } | 1850 | #ifdef CONFIG_IWLWIFI_DEBUG |
| 1851 | if ((iwl_get_debug_level(priv) & IWL_DL_FW_ERRORS) || full_log) { | ||
| 1852 | /* | ||
| 1853 | * if uCode has wrapped back to top of log, | ||
| 1854 | * start at the oldest entry, | ||
| 1855 | * i.e the next one that uCode would fill. | ||
| 1856 | */ | ||
| 1857 | if (num_wraps) | ||
| 1858 | iwl_print_event_log(priv, next_entry, | ||
| 1859 | capacity - next_entry, mode); | ||
| 1860 | /* (then/else) start at top of log */ | ||
| 1861 | iwl_print_event_log(priv, 0, next_entry, mode); | ||
| 1862 | } else | ||
| 1863 | iwl_print_last_event_logs(priv, capacity, num_wraps, | ||
| 1864 | next_entry, size, mode); | ||
| 1865 | #else | ||
| 1866 | iwl_print_last_event_logs(priv, capacity, num_wraps, | ||
| 1867 | next_entry, size, mode); | ||
| 1821 | #endif | 1868 | #endif |
| 1869 | } | ||
| 1822 | 1870 | ||
| 1823 | /** | 1871 | /** |
| 1824 | * iwl_alive_start - called after REPLY_ALIVE notification received | 1872 | * iwl_alive_start - called after REPLY_ALIVE notification received |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index 2e0fb2804ad0..3629aea250ab 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
| @@ -1362,11 +1362,10 @@ void iwl_irq_handle_error(struct iwl_priv *priv) | |||
| 1362 | clear_bit(STATUS_HCMD_ACTIVE, &priv->status); | 1362 | clear_bit(STATUS_HCMD_ACTIVE, &priv->status); |
| 1363 | 1363 | ||
| 1364 | priv->cfg->ops->lib->dump_nic_error_log(priv); | 1364 | priv->cfg->ops->lib->dump_nic_error_log(priv); |
| 1365 | priv->cfg->ops->lib->dump_nic_event_log(priv, false); | ||
| 1365 | #ifdef CONFIG_IWLWIFI_DEBUG | 1366 | #ifdef CONFIG_IWLWIFI_DEBUG |
| 1366 | if (iwl_get_debug_level(priv) & IWL_DL_FW_ERRORS) { | 1367 | if (iwl_get_debug_level(priv) & IWL_DL_FW_ERRORS) |
| 1367 | priv->cfg->ops->lib->dump_nic_event_log(priv); | ||
| 1368 | iwl_print_rx_config_cmd(priv); | 1368 | iwl_print_rx_config_cmd(priv); |
| 1369 | } | ||
| 1370 | #endif | 1369 | #endif |
| 1371 | 1370 | ||
| 1372 | wake_up_interruptible(&priv->wait_command_queue); | 1371 | wake_up_interruptible(&priv->wait_command_queue); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h index ecba0f46bac5..cf7d3df0744e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.h +++ b/drivers/net/wireless/iwlwifi/iwl-core.h | |||
| @@ -167,7 +167,7 @@ struct iwl_lib_ops { | |||
| 167 | int (*is_valid_rtc_data_addr)(u32 addr); | 167 | int (*is_valid_rtc_data_addr)(u32 addr); |
| 168 | /* 1st ucode load */ | 168 | /* 1st ucode load */ |
| 169 | int (*load_ucode)(struct iwl_priv *priv); | 169 | int (*load_ucode)(struct iwl_priv *priv); |
| 170 | void (*dump_nic_event_log)(struct iwl_priv *priv); | 170 | void (*dump_nic_event_log)(struct iwl_priv *priv, bool full_log); |
| 171 | void (*dump_nic_error_log)(struct iwl_priv *priv); | 171 | void (*dump_nic_error_log)(struct iwl_priv *priv); |
| 172 | int (*set_channel_switch)(struct iwl_priv *priv, u16 channel); | 172 | int (*set_channel_switch)(struct iwl_priv *priv, u16 channel); |
| 173 | /* power management */ | 173 | /* power management */ |
| @@ -579,14 +579,10 @@ int iwl_pci_resume(struct pci_dev *pdev); | |||
| 579 | * Error Handling Debugging | 579 | * Error Handling Debugging |
| 580 | ******************************************************/ | 580 | ******************************************************/ |
| 581 | void iwl_dump_nic_error_log(struct iwl_priv *priv); | 581 | void iwl_dump_nic_error_log(struct iwl_priv *priv); |
| 582 | void iwl_dump_nic_event_log(struct iwl_priv *priv, bool full_log); | ||
| 582 | #ifdef CONFIG_IWLWIFI_DEBUG | 583 | #ifdef CONFIG_IWLWIFI_DEBUG |
| 583 | void iwl_dump_nic_event_log(struct iwl_priv *priv); | ||
| 584 | void iwl_print_rx_config_cmd(struct iwl_priv *priv); | 584 | void iwl_print_rx_config_cmd(struct iwl_priv *priv); |
| 585 | #else | 585 | #else |
| 586 | static inline void iwl_dump_nic_event_log(struct iwl_priv *priv) | ||
| 587 | { | ||
| 588 | } | ||
| 589 | |||
| 590 | static inline void iwl_print_rx_config_cmd(struct iwl_priv *priv) | 586 | static inline void iwl_print_rx_config_cmd(struct iwl_priv *priv) |
| 591 | { | 587 | { |
| 592 | } | 588 | } |
diff --git a/drivers/net/wireless/iwlwifi/iwl-debugfs.c b/drivers/net/wireless/iwlwifi/iwl-debugfs.c index 5adf0b606202..21e0f6699daf 100644 --- a/drivers/net/wireless/iwlwifi/iwl-debugfs.c +++ b/drivers/net/wireless/iwlwifi/iwl-debugfs.c | |||
| @@ -436,7 +436,7 @@ static ssize_t iwl_dbgfs_log_event_write(struct file *file, | |||
| 436 | if (sscanf(buf, "%d", &event_log_flag) != 1) | 436 | if (sscanf(buf, "%d", &event_log_flag) != 1) |
| 437 | return -EFAULT; | 437 | return -EFAULT; |
| 438 | if (event_log_flag == 1) | 438 | if (event_log_flag == 1) |
| 439 | priv->cfg->ops->lib->dump_nic_event_log(priv); | 439 | priv->cfg->ops->lib->dump_nic_event_log(priv, true); |
| 440 | 440 | ||
| 441 | return count; | 441 | return count; |
| 442 | } | 442 | } |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 5b7e80e5bab4..5e3c35314ffe 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
| @@ -1482,7 +1482,6 @@ static inline void iwl_synchronize_irq(struct iwl_priv *priv) | |||
| 1482 | tasklet_kill(&priv->irq_tasklet); | 1482 | tasklet_kill(&priv->irq_tasklet); |
| 1483 | } | 1483 | } |
| 1484 | 1484 | ||
| 1485 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
| 1486 | static const char *desc_lookup(int i) | 1485 | static const char *desc_lookup(int i) |
| 1487 | { | 1486 | { |
| 1488 | switch (i) { | 1487 | switch (i) { |
| @@ -1613,10 +1612,42 @@ static void iwl3945_print_event_log(struct iwl_priv *priv, u32 start_idx, | |||
| 1613 | spin_unlock_irqrestore(&priv->reg_lock, reg_flags); | 1612 | spin_unlock_irqrestore(&priv->reg_lock, reg_flags); |
| 1614 | } | 1613 | } |
| 1615 | 1614 | ||
| 1615 | /** | ||
| 1616 | * iwl3945_print_last_event_logs - Dump the newest # of event log to syslog | ||
| 1617 | */ | ||
| 1618 | static void iwl3945_print_last_event_logs(struct iwl_priv *priv, u32 capacity, | ||
| 1619 | u32 num_wraps, u32 next_entry, | ||
| 1620 | u32 size, u32 mode) | ||
| 1621 | { | ||
| 1622 | /* | ||
| 1623 | * display the newest DEFAULT_LOG_ENTRIES entries | ||
| 1624 | * i.e the entries just before the next ont that uCode would fill. | ||
| 1625 | */ | ||
| 1626 | if (num_wraps) { | ||
| 1627 | if (next_entry < size) { | ||
| 1628 | iwl3945_print_event_log(priv, | ||
| 1629 | capacity - (size - next_entry), | ||
| 1630 | size - next_entry, mode); | ||
| 1631 | iwl3945_print_event_log(priv, 0, | ||
| 1632 | next_entry, mode); | ||
| 1633 | } else | ||
| 1634 | iwl3945_print_event_log(priv, next_entry - size, | ||
| 1635 | size, mode); | ||
| 1636 | } else { | ||
| 1637 | if (next_entry < size) | ||
| 1638 | iwl3945_print_event_log(priv, 0, next_entry, mode); | ||
| 1639 | else | ||
| 1640 | iwl3945_print_event_log(priv, next_entry - size, | ||
| 1641 | size, mode); | ||
| 1642 | } | ||
| 1643 | } | ||
| 1644 | |||
| 1616 | /* For sanity check only. Actual size is determined by uCode, typ. 512 */ | 1645 | /* For sanity check only. Actual size is determined by uCode, typ. 512 */ |
| 1617 | #define IWL3945_MAX_EVENT_LOG_SIZE (512) | 1646 | #define IWL3945_MAX_EVENT_LOG_SIZE (512) |
| 1618 | 1647 | ||
| 1619 | void iwl3945_dump_nic_event_log(struct iwl_priv *priv) | 1648 | #define DEFAULT_IWL3945_DUMP_EVENT_LOG_ENTRIES (20) |
| 1649 | |||
| 1650 | void iwl3945_dump_nic_event_log(struct iwl_priv *priv, bool full_log) | ||
| 1620 | { | 1651 | { |
| 1621 | u32 base; /* SRAM byte address of event log header */ | 1652 | u32 base; /* SRAM byte address of event log header */ |
| 1622 | u32 capacity; /* event log capacity in # entries */ | 1653 | u32 capacity; /* event log capacity in # entries */ |
| @@ -1657,8 +1688,17 @@ void iwl3945_dump_nic_event_log(struct iwl_priv *priv) | |||
| 1657 | return; | 1688 | return; |
| 1658 | } | 1689 | } |
| 1659 | 1690 | ||
| 1660 | IWL_ERR(priv, "Start IWL Event Log Dump: display count %d, wraps %d\n", | 1691 | #ifdef CONFIG_IWLWIFI_DEBUG |
| 1661 | size, num_wraps); | 1692 | if (!(iwl_get_debug_level(priv) & IWL_DL_FW_ERRORS)) |
| 1693 | size = (size > DEFAULT_IWL3945_DUMP_EVENT_LOG_ENTRIES) | ||
| 1694 | ? DEFAULT_IWL3945_DUMP_EVENT_LOG_ENTRIES : size; | ||
| 1695 | #else | ||
| 1696 | size = (size > DEFAULT_IWL3945_DUMP_EVENT_LOG_ENTRIES) | ||
| 1697 | ? DEFAULT_IWL3945_DUMP_EVENT_LOG_ENTRIES : size; | ||
| 1698 | #endif | ||
| 1699 | |||
| 1700 | IWL_ERR(priv, "Start IWL Event Log Dump: display last %d count\n", | ||
| 1701 | size); | ||
| 1662 | 1702 | ||
| 1663 | /* if uCode has wrapped back to top of log, start at the oldest entry, | 1703 | /* if uCode has wrapped back to top of log, start at the oldest entry, |
| 1664 | * i.e the next one that uCode would fill. */ | 1704 | * i.e the next one that uCode would fill. */ |
| @@ -1669,18 +1709,28 @@ void iwl3945_dump_nic_event_log(struct iwl_priv *priv) | |||
| 1669 | /* (then/else) start at top of log */ | 1709 | /* (then/else) start at top of log */ |
| 1670 | iwl3945_print_event_log(priv, 0, next_entry, mode); | 1710 | iwl3945_print_event_log(priv, 0, next_entry, mode); |
| 1671 | 1711 | ||
| 1672 | } | 1712 | #ifdef CONFIG_IWLWIFI_DEBUG |
| 1713 | if ((iwl_get_debug_level(priv) & IWL_DL_FW_ERRORS) || full_log) { | ||
| 1714 | /* if uCode has wrapped back to top of log, | ||
| 1715 | * start at the oldest entry, | ||
| 1716 | * i.e the next one that uCode would fill. | ||
| 1717 | */ | ||
| 1718 | if (num_wraps) | ||
| 1719 | iwl3945_print_event_log(priv, next_entry, | ||
| 1720 | capacity - next_entry, mode); | ||
| 1721 | |||
| 1722 | /* (then/else) start at top of log */ | ||
| 1723 | iwl3945_print_event_log(priv, 0, next_entry, mode); | ||
| 1724 | } else | ||
| 1725 | iwl3945_print_last_event_logs(priv, capacity, num_wraps, | ||
| 1726 | next_entry, size, mode); | ||
| 1673 | #else | 1727 | #else |
| 1674 | void iwl3945_dump_nic_event_log(struct iwl_priv *priv) | 1728 | iwl3945_print_last_event_logs(priv, capacity, num_wraps, |
| 1675 | { | 1729 | next_entry, size, mode); |
| 1676 | } | 1730 | #endif |
| 1677 | 1731 | ||
| 1678 | void iwl3945_dump_nic_error_log(struct iwl_priv *priv) | ||
| 1679 | { | ||
| 1680 | } | 1732 | } |
| 1681 | 1733 | ||
| 1682 | #endif | ||
| 1683 | |||
| 1684 | static void iwl3945_irq_tasklet(struct iwl_priv *priv) | 1734 | static void iwl3945_irq_tasklet(struct iwl_priv *priv) |
| 1685 | { | 1735 | { |
| 1686 | u32 inta, handled = 0; | 1736 | u32 inta, handled = 0; |
