diff options
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-1000.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-3945.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-3945.h | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-4965.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-5000.c | 4 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-6000.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 185 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.c | 187 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.h | 14 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-debugfs.c | 8 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-tx.c | 6 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 31 | ||||
| -rw-r--r-- | drivers/platform/x86/sony-laptop.c | 9 | ||||
| -rw-r--r-- | include/net/wext.h | 1 | ||||
| -rw-r--r-- | net/core/net-sysfs.c | 12 | ||||
| -rw-r--r-- | net/mac80211/mlme.c | 18 | ||||
| -rw-r--r-- | net/wireless/sme.c | 5 | ||||
| -rw-r--r-- | net/wireless/wext-sme.c | 8 | ||||
| -rw-r--r-- | net/wireless/wext.c | 11 |
19 files changed, 274 insertions, 235 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c index a95caa014143..2716b91ba9fa 100644 --- a/drivers/net/wireless/iwlwifi/iwl-1000.c +++ b/drivers/net/wireless/iwlwifi/iwl-1000.c | |||
| @@ -99,6 +99,8 @@ static struct iwl_lib_ops iwl1000_lib = { | |||
| 99 | .setup_deferred_work = iwl5000_setup_deferred_work, | 99 | .setup_deferred_work = iwl5000_setup_deferred_work, |
| 100 | .is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr, | 100 | .is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr, |
| 101 | .load_ucode = iwl5000_load_ucode, | 101 | .load_ucode = iwl5000_load_ucode, |
| 102 | .dump_nic_event_log = iwl_dump_nic_event_log, | ||
| 103 | .dump_nic_error_log = iwl_dump_nic_error_log, | ||
| 102 | .init_alive_start = iwl5000_init_alive_start, | 104 | .init_alive_start = iwl5000_init_alive_start, |
| 103 | .alive_notify = iwl5000_alive_notify, | 105 | .alive_notify = iwl5000_alive_notify, |
| 104 | .send_tx_power = iwl5000_send_tx_power, | 106 | .send_tx_power = iwl5000_send_tx_power, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c index e9a685d8e3a1..e70c5b0af364 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c | |||
| @@ -2839,6 +2839,8 @@ static struct iwl_lib_ops iwl3945_lib = { | |||
| 2839 | .txq_free_tfd = iwl3945_hw_txq_free_tfd, | 2839 | .txq_free_tfd = iwl3945_hw_txq_free_tfd, |
| 2840 | .txq_init = iwl3945_hw_tx_queue_init, | 2840 | .txq_init = iwl3945_hw_tx_queue_init, |
| 2841 | .load_ucode = iwl3945_load_bsm, | 2841 | .load_ucode = iwl3945_load_bsm, |
| 2842 | .dump_nic_event_log = iwl3945_dump_nic_event_log, | ||
| 2843 | .dump_nic_error_log = iwl3945_dump_nic_error_log, | ||
| 2842 | .apm_ops = { | 2844 | .apm_ops = { |
| 2843 | .init = iwl3945_apm_init, | 2845 | .init = iwl3945_apm_init, |
| 2844 | .reset = iwl3945_apm_reset, | 2846 | .reset = iwl3945_apm_reset, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.h b/drivers/net/wireless/iwlwifi/iwl-3945.h index f24036909916..21679bf3a1aa 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945.h | |||
| @@ -209,6 +209,8 @@ extern int __must_check iwl3945_send_cmd(struct iwl_priv *priv, | |||
| 209 | struct iwl_host_cmd *cmd); | 209 | struct iwl_host_cmd *cmd); |
| 210 | extern unsigned int iwl3945_fill_beacon_frame(struct iwl_priv *priv, | 210 | extern unsigned int iwl3945_fill_beacon_frame(struct iwl_priv *priv, |
| 211 | struct ieee80211_hdr *hdr,int left); | 211 | struct ieee80211_hdr *hdr,int left); |
| 212 | extern void iwl3945_dump_nic_event_log(struct iwl_priv *priv); | ||
| 213 | extern void iwl3945_dump_nic_error_log(struct iwl_priv *priv); | ||
| 212 | 214 | ||
| 213 | /* | 215 | /* |
| 214 | * Currently used by iwl-3945-rs... look at restructuring so that it doesn't | 216 | * Currently used by iwl-3945-rs... look at restructuring so that it doesn't |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c index 3259b8841544..a22a0501c190 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c | |||
| @@ -2298,6 +2298,8 @@ static struct iwl_lib_ops iwl4965_lib = { | |||
| 2298 | .alive_notify = iwl4965_alive_notify, | 2298 | .alive_notify = iwl4965_alive_notify, |
| 2299 | .init_alive_start = iwl4965_init_alive_start, | 2299 | .init_alive_start = iwl4965_init_alive_start, |
| 2300 | .load_ucode = iwl4965_load_bsm, | 2300 | .load_ucode = iwl4965_load_bsm, |
| 2301 | .dump_nic_event_log = iwl_dump_nic_event_log, | ||
| 2302 | .dump_nic_error_log = iwl_dump_nic_error_log, | ||
| 2301 | .apm_ops = { | 2303 | .apm_ops = { |
| 2302 | .init = iwl4965_apm_init, | 2304 | .init = iwl4965_apm_init, |
| 2303 | .reset = iwl4965_apm_reset, | 2305 | .reset = iwl4965_apm_reset, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c index a6391c7fea53..eb08f4411000 100644 --- a/drivers/net/wireless/iwlwifi/iwl-5000.c +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c | |||
| @@ -1535,6 +1535,8 @@ struct iwl_lib_ops iwl5000_lib = { | |||
| 1535 | .rx_handler_setup = iwl5000_rx_handler_setup, | 1535 | .rx_handler_setup = iwl5000_rx_handler_setup, |
| 1536 | .setup_deferred_work = iwl5000_setup_deferred_work, | 1536 | .setup_deferred_work = iwl5000_setup_deferred_work, |
| 1537 | .is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr, | 1537 | .is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr, |
| 1538 | .dump_nic_event_log = iwl_dump_nic_event_log, | ||
| 1539 | .dump_nic_error_log = iwl_dump_nic_error_log, | ||
| 1538 | .load_ucode = iwl5000_load_ucode, | 1540 | .load_ucode = iwl5000_load_ucode, |
| 1539 | .init_alive_start = iwl5000_init_alive_start, | 1541 | .init_alive_start = iwl5000_init_alive_start, |
| 1540 | .alive_notify = iwl5000_alive_notify, | 1542 | .alive_notify = iwl5000_alive_notify, |
| @@ -1585,6 +1587,8 @@ static struct iwl_lib_ops iwl5150_lib = { | |||
| 1585 | .rx_handler_setup = iwl5000_rx_handler_setup, | 1587 | .rx_handler_setup = iwl5000_rx_handler_setup, |
| 1586 | .setup_deferred_work = iwl5000_setup_deferred_work, | 1588 | .setup_deferred_work = iwl5000_setup_deferred_work, |
| 1587 | .is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr, | 1589 | .is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr, |
| 1590 | .dump_nic_event_log = iwl_dump_nic_event_log, | ||
| 1591 | .dump_nic_error_log = iwl_dump_nic_error_log, | ||
| 1588 | .load_ucode = iwl5000_load_ucode, | 1592 | .load_ucode = iwl5000_load_ucode, |
| 1589 | .init_alive_start = iwl5000_init_alive_start, | 1593 | .init_alive_start = iwl5000_init_alive_start, |
| 1590 | .alive_notify = iwl5000_alive_notify, | 1594 | .alive_notify = iwl5000_alive_notify, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c index 82b9c93dff54..c295b8ee9228 100644 --- a/drivers/net/wireless/iwlwifi/iwl-6000.c +++ b/drivers/net/wireless/iwlwifi/iwl-6000.c | |||
| @@ -100,6 +100,8 @@ static struct iwl_lib_ops iwl6000_lib = { | |||
| 100 | .setup_deferred_work = iwl5000_setup_deferred_work, | 100 | .setup_deferred_work = iwl5000_setup_deferred_work, |
| 101 | .is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr, | 101 | .is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr, |
| 102 | .load_ucode = iwl5000_load_ucode, | 102 | .load_ucode = iwl5000_load_ucode, |
| 103 | .dump_nic_event_log = iwl_dump_nic_event_log, | ||
| 104 | .dump_nic_error_log = iwl_dump_nic_error_log, | ||
| 103 | .init_alive_start = iwl5000_init_alive_start, | 105 | .init_alive_start = iwl5000_init_alive_start, |
| 104 | .alive_notify = iwl5000_alive_notify, | 106 | .alive_notify = iwl5000_alive_notify, |
| 105 | .send_tx_power = iwl5000_send_tx_power, | 107 | .send_tx_power = iwl5000_send_tx_power, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 00457bff1ed1..cdc07c477457 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
| @@ -1526,6 +1526,191 @@ static int iwl_read_ucode(struct iwl_priv *priv) | |||
| 1526 | return ret; | 1526 | return ret; |
| 1527 | } | 1527 | } |
| 1528 | 1528 | ||
| 1529 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
| 1530 | static const char *desc_lookup_text[] = { | ||
| 1531 | "OK", | ||
| 1532 | "FAIL", | ||
| 1533 | "BAD_PARAM", | ||
| 1534 | "BAD_CHECKSUM", | ||
| 1535 | "NMI_INTERRUPT_WDG", | ||
| 1536 | "SYSASSERT", | ||
| 1537 | "FATAL_ERROR", | ||
| 1538 | "BAD_COMMAND", | ||
| 1539 | "HW_ERROR_TUNE_LOCK", | ||
| 1540 | "HW_ERROR_TEMPERATURE", | ||
| 1541 | "ILLEGAL_CHAN_FREQ", | ||
| 1542 | "VCC_NOT_STABLE", | ||
| 1543 | "FH_ERROR", | ||
| 1544 | "NMI_INTERRUPT_HOST", | ||
| 1545 | "NMI_INTERRUPT_ACTION_PT", | ||
| 1546 | "NMI_INTERRUPT_UNKNOWN", | ||
| 1547 | "UCODE_VERSION_MISMATCH", | ||
| 1548 | "HW_ERROR_ABS_LOCK", | ||
| 1549 | "HW_ERROR_CAL_LOCK_FAIL", | ||
| 1550 | "NMI_INTERRUPT_INST_ACTION_PT", | ||
| 1551 | "NMI_INTERRUPT_DATA_ACTION_PT", | ||
| 1552 | "NMI_TRM_HW_ER", | ||
| 1553 | "NMI_INTERRUPT_TRM", | ||
| 1554 | "NMI_INTERRUPT_BREAK_POINT" | ||
| 1555 | "DEBUG_0", | ||
| 1556 | "DEBUG_1", | ||
| 1557 | "DEBUG_2", | ||
| 1558 | "DEBUG_3", | ||
| 1559 | "UNKNOWN" | ||
| 1560 | }; | ||
| 1561 | |||
| 1562 | static const char *desc_lookup(int i) | ||
| 1563 | { | ||
| 1564 | int max = ARRAY_SIZE(desc_lookup_text) - 1; | ||
| 1565 | |||
| 1566 | if (i < 0 || i > max) | ||
| 1567 | i = max; | ||
| 1568 | |||
| 1569 | return desc_lookup_text[i]; | ||
| 1570 | } | ||
| 1571 | |||
| 1572 | #define ERROR_START_OFFSET (1 * sizeof(u32)) | ||
| 1573 | #define ERROR_ELEM_SIZE (7 * sizeof(u32)) | ||
| 1574 | |||
| 1575 | void iwl_dump_nic_error_log(struct iwl_priv *priv) | ||
| 1576 | { | ||
| 1577 | u32 data2, line; | ||
| 1578 | u32 desc, time, count, base, data1; | ||
| 1579 | u32 blink1, blink2, ilink1, ilink2; | ||
| 1580 | |||
| 1581 | if (priv->ucode_type == UCODE_INIT) | ||
| 1582 | base = le32_to_cpu(priv->card_alive_init.error_event_table_ptr); | ||
| 1583 | else | ||
| 1584 | base = le32_to_cpu(priv->card_alive.error_event_table_ptr); | ||
| 1585 | |||
| 1586 | if (!priv->cfg->ops->lib->is_valid_rtc_data_addr(base)) { | ||
| 1587 | IWL_ERR(priv, "Not valid error log pointer 0x%08X\n", base); | ||
| 1588 | return; | ||
| 1589 | } | ||
| 1590 | |||
| 1591 | count = iwl_read_targ_mem(priv, base); | ||
| 1592 | |||
| 1593 | if (ERROR_START_OFFSET <= count * ERROR_ELEM_SIZE) { | ||
| 1594 | IWL_ERR(priv, "Start IWL Error Log Dump:\n"); | ||
| 1595 | IWL_ERR(priv, "Status: 0x%08lX, count: %d\n", | ||
| 1596 | priv->status, count); | ||
| 1597 | } | ||
| 1598 | |||
| 1599 | desc = iwl_read_targ_mem(priv, base + 1 * sizeof(u32)); | ||
| 1600 | blink1 = iwl_read_targ_mem(priv, base + 3 * sizeof(u32)); | ||
| 1601 | blink2 = iwl_read_targ_mem(priv, base + 4 * sizeof(u32)); | ||
| 1602 | ilink1 = iwl_read_targ_mem(priv, base + 5 * sizeof(u32)); | ||
| 1603 | ilink2 = iwl_read_targ_mem(priv, base + 6 * sizeof(u32)); | ||
| 1604 | data1 = iwl_read_targ_mem(priv, base + 7 * sizeof(u32)); | ||
| 1605 | data2 = iwl_read_targ_mem(priv, base + 8 * sizeof(u32)); | ||
| 1606 | line = iwl_read_targ_mem(priv, base + 9 * sizeof(u32)); | ||
| 1607 | time = iwl_read_targ_mem(priv, base + 11 * sizeof(u32)); | ||
| 1608 | |||
| 1609 | IWL_ERR(priv, "Desc Time " | ||
| 1610 | "data1 data2 line\n"); | ||
| 1611 | IWL_ERR(priv, "%-28s (#%02d) %010u 0x%08X 0x%08X %u\n", | ||
| 1612 | desc_lookup(desc), desc, time, data1, data2, line); | ||
| 1613 | IWL_ERR(priv, "blink1 blink2 ilink1 ilink2\n"); | ||
| 1614 | IWL_ERR(priv, "0x%05X 0x%05X 0x%05X 0x%05X\n", blink1, blink2, | ||
| 1615 | ilink1, ilink2); | ||
| 1616 | |||
| 1617 | } | ||
| 1618 | |||
| 1619 | #define EVENT_START_OFFSET (4 * sizeof(u32)) | ||
| 1620 | |||
| 1621 | /** | ||
| 1622 | * iwl_print_event_log - Dump error event log to syslog | ||
| 1623 | * | ||
| 1624 | */ | ||
| 1625 | static void iwl_print_event_log(struct iwl_priv *priv, u32 start_idx, | ||
| 1626 | u32 num_events, u32 mode) | ||
| 1627 | { | ||
| 1628 | u32 i; | ||
| 1629 | u32 base; /* SRAM byte address of event log header */ | ||
| 1630 | u32 event_size; /* 2 u32s, or 3 u32s if timestamp recorded */ | ||
| 1631 | u32 ptr; /* SRAM byte address of log data */ | ||
| 1632 | u32 ev, time, data; /* event log data */ | ||
| 1633 | |||
| 1634 | if (num_events == 0) | ||
| 1635 | return; | ||
| 1636 | if (priv->ucode_type == UCODE_INIT) | ||
| 1637 | base = le32_to_cpu(priv->card_alive_init.log_event_table_ptr); | ||
| 1638 | else | ||
| 1639 | base = le32_to_cpu(priv->card_alive.log_event_table_ptr); | ||
| 1640 | |||
| 1641 | if (mode == 0) | ||
| 1642 | event_size = 2 * sizeof(u32); | ||
| 1643 | else | ||
| 1644 | event_size = 3 * sizeof(u32); | ||
| 1645 | |||
| 1646 | ptr = base + EVENT_START_OFFSET + (start_idx * event_size); | ||
| 1647 | |||
| 1648 | /* "time" is actually "data" for mode 0 (no timestamp). | ||
| 1649 | * place event id # at far right for easier visual parsing. */ | ||
| 1650 | for (i = 0; i < num_events; i++) { | ||
| 1651 | ev = iwl_read_targ_mem(priv, ptr); | ||
| 1652 | ptr += sizeof(u32); | ||
| 1653 | time = iwl_read_targ_mem(priv, ptr); | ||
| 1654 | ptr += sizeof(u32); | ||
| 1655 | if (mode == 0) { | ||
| 1656 | /* data, ev */ | ||
| 1657 | IWL_ERR(priv, "EVT_LOG:0x%08x:%04u\n", time, ev); | ||
| 1658 | } else { | ||
| 1659 | data = iwl_read_targ_mem(priv, ptr); | ||
| 1660 | ptr += sizeof(u32); | ||
| 1661 | IWL_ERR(priv, "EVT_LOGT:%010u:0x%08x:%04u\n", | ||
| 1662 | time, data, ev); | ||
| 1663 | } | ||
| 1664 | } | ||
| 1665 | } | ||
| 1666 | |||
| 1667 | void iwl_dump_nic_event_log(struct iwl_priv *priv) | ||
| 1668 | { | ||
| 1669 | u32 base; /* SRAM byte address of event log header */ | ||
| 1670 | u32 capacity; /* event log capacity in # entries */ | ||
| 1671 | u32 mode; /* 0 - no timestamp, 1 - timestamp recorded */ | ||
| 1672 | u32 num_wraps; /* # times uCode wrapped to top of log */ | ||
| 1673 | u32 next_entry; /* index of next entry to be written by uCode */ | ||
| 1674 | u32 size; /* # entries that we'll print */ | ||
| 1675 | |||
| 1676 | if (priv->ucode_type == UCODE_INIT) | ||
| 1677 | base = le32_to_cpu(priv->card_alive_init.log_event_table_ptr); | ||
| 1678 | else | ||
| 1679 | base = le32_to_cpu(priv->card_alive.log_event_table_ptr); | ||
| 1680 | |||
| 1681 | if (!priv->cfg->ops->lib->is_valid_rtc_data_addr(base)) { | ||
| 1682 | IWL_ERR(priv, "Invalid event log pointer 0x%08X\n", base); | ||
| 1683 | return; | ||
| 1684 | } | ||
| 1685 | |||
| 1686 | /* event log header */ | ||
| 1687 | capacity = iwl_read_targ_mem(priv, base); | ||
| 1688 | mode = iwl_read_targ_mem(priv, base + (1 * sizeof(u32))); | ||
| 1689 | num_wraps = iwl_read_targ_mem(priv, base + (2 * sizeof(u32))); | ||
| 1690 | next_entry = iwl_read_targ_mem(priv, base + (3 * sizeof(u32))); | ||
| 1691 | |||
| 1692 | size = num_wraps ? capacity : next_entry; | ||
| 1693 | |||
| 1694 | /* bail out if nothing in log */ | ||
| 1695 | if (size == 0) { | ||
| 1696 | IWL_ERR(priv, "Start IWL Event Log Dump: nothing in log\n"); | ||
| 1697 | return; | ||
| 1698 | } | ||
| 1699 | |||
| 1700 | IWL_ERR(priv, "Start IWL Event Log Dump: display count %d, wraps %d\n", | ||
| 1701 | size, num_wraps); | ||
| 1702 | |||
| 1703 | /* if uCode has wrapped back to top of log, start at the oldest entry, | ||
| 1704 | * i.e the next one that uCode would fill. */ | ||
| 1705 | if (num_wraps) | ||
| 1706 | iwl_print_event_log(priv, next_entry, | ||
| 1707 | capacity - next_entry, mode); | ||
| 1708 | /* (then/else) start at top of log */ | ||
| 1709 | iwl_print_event_log(priv, 0, next_entry, mode); | ||
| 1710 | |||
| 1711 | } | ||
| 1712 | #endif | ||
| 1713 | |||
| 1529 | /** | 1714 | /** |
| 1530 | * iwl_alive_start - called after REPLY_ALIVE notification received | 1715 | * iwl_alive_start - called after REPLY_ALIVE notification received |
| 1531 | * from protocol/runtime uCode (initialization uCode's | 1716 | * from protocol/runtime uCode (initialization uCode's |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index fd26c0dc9c54..484d5c1a7312 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
| @@ -1309,189 +1309,6 @@ static void iwl_print_rx_config_cmd(struct iwl_priv *priv) | |||
| 1309 | IWL_DEBUG_RADIO(priv, "u8[6] bssid_addr: %pM\n", rxon->bssid_addr); | 1309 | IWL_DEBUG_RADIO(priv, "u8[6] bssid_addr: %pM\n", rxon->bssid_addr); |
| 1310 | IWL_DEBUG_RADIO(priv, "u16 assoc_id: 0x%x\n", le16_to_cpu(rxon->assoc_id)); | 1310 | IWL_DEBUG_RADIO(priv, "u16 assoc_id: 0x%x\n", le16_to_cpu(rxon->assoc_id)); |
| 1311 | } | 1311 | } |
| 1312 | |||
| 1313 | static const char *desc_lookup_text[] = { | ||
| 1314 | "OK", | ||
| 1315 | "FAIL", | ||
| 1316 | "BAD_PARAM", | ||
| 1317 | "BAD_CHECKSUM", | ||
| 1318 | "NMI_INTERRUPT_WDG", | ||
| 1319 | "SYSASSERT", | ||
| 1320 | "FATAL_ERROR", | ||
| 1321 | "BAD_COMMAND", | ||
| 1322 | "HW_ERROR_TUNE_LOCK", | ||
| 1323 | "HW_ERROR_TEMPERATURE", | ||
| 1324 | "ILLEGAL_CHAN_FREQ", | ||
| 1325 | "VCC_NOT_STABLE", | ||
| 1326 | "FH_ERROR", | ||
| 1327 | "NMI_INTERRUPT_HOST", | ||
| 1328 | "NMI_INTERRUPT_ACTION_PT", | ||
| 1329 | "NMI_INTERRUPT_UNKNOWN", | ||
| 1330 | "UCODE_VERSION_MISMATCH", | ||
| 1331 | "HW_ERROR_ABS_LOCK", | ||
| 1332 | "HW_ERROR_CAL_LOCK_FAIL", | ||
| 1333 | "NMI_INTERRUPT_INST_ACTION_PT", | ||
| 1334 | "NMI_INTERRUPT_DATA_ACTION_PT", | ||
| 1335 | "NMI_TRM_HW_ER", | ||
| 1336 | "NMI_INTERRUPT_TRM", | ||
| 1337 | "NMI_INTERRUPT_BREAK_POINT" | ||
| 1338 | "DEBUG_0", | ||
| 1339 | "DEBUG_1", | ||
| 1340 | "DEBUG_2", | ||
| 1341 | "DEBUG_3", | ||
| 1342 | "UNKNOWN" | ||
| 1343 | }; | ||
| 1344 | |||
| 1345 | static const char *desc_lookup(int i) | ||
| 1346 | { | ||
| 1347 | int max = ARRAY_SIZE(desc_lookup_text) - 1; | ||
| 1348 | |||
| 1349 | if (i < 0 || i > max) | ||
| 1350 | i = max; | ||
| 1351 | |||
| 1352 | return desc_lookup_text[i]; | ||
| 1353 | } | ||
| 1354 | |||
| 1355 | #define ERROR_START_OFFSET (1 * sizeof(u32)) | ||
| 1356 | #define ERROR_ELEM_SIZE (7 * sizeof(u32)) | ||
| 1357 | |||
| 1358 | static void iwl_dump_nic_error_log(struct iwl_priv *priv) | ||
| 1359 | { | ||
| 1360 | u32 data2, line; | ||
| 1361 | u32 desc, time, count, base, data1; | ||
| 1362 | u32 blink1, blink2, ilink1, ilink2; | ||
| 1363 | |||
| 1364 | if (priv->ucode_type == UCODE_INIT) | ||
| 1365 | base = le32_to_cpu(priv->card_alive_init.error_event_table_ptr); | ||
| 1366 | else | ||
| 1367 | base = le32_to_cpu(priv->card_alive.error_event_table_ptr); | ||
| 1368 | |||
| 1369 | if (!priv->cfg->ops->lib->is_valid_rtc_data_addr(base)) { | ||
| 1370 | IWL_ERR(priv, "Not valid error log pointer 0x%08X\n", base); | ||
| 1371 | return; | ||
| 1372 | } | ||
| 1373 | |||
| 1374 | count = iwl_read_targ_mem(priv, base); | ||
| 1375 | |||
| 1376 | if (ERROR_START_OFFSET <= count * ERROR_ELEM_SIZE) { | ||
| 1377 | IWL_ERR(priv, "Start IWL Error Log Dump:\n"); | ||
| 1378 | IWL_ERR(priv, "Status: 0x%08lX, count: %d\n", | ||
| 1379 | priv->status, count); | ||
| 1380 | } | ||
| 1381 | |||
| 1382 | desc = iwl_read_targ_mem(priv, base + 1 * sizeof(u32)); | ||
| 1383 | blink1 = iwl_read_targ_mem(priv, base + 3 * sizeof(u32)); | ||
| 1384 | blink2 = iwl_read_targ_mem(priv, base + 4 * sizeof(u32)); | ||
| 1385 | ilink1 = iwl_read_targ_mem(priv, base + 5 * sizeof(u32)); | ||
| 1386 | ilink2 = iwl_read_targ_mem(priv, base + 6 * sizeof(u32)); | ||
| 1387 | data1 = iwl_read_targ_mem(priv, base + 7 * sizeof(u32)); | ||
| 1388 | data2 = iwl_read_targ_mem(priv, base + 8 * sizeof(u32)); | ||
| 1389 | line = iwl_read_targ_mem(priv, base + 9 * sizeof(u32)); | ||
| 1390 | time = iwl_read_targ_mem(priv, base + 11 * sizeof(u32)); | ||
| 1391 | |||
| 1392 | IWL_ERR(priv, "Desc Time " | ||
| 1393 | "data1 data2 line\n"); | ||
| 1394 | IWL_ERR(priv, "%-28s (#%02d) %010u 0x%08X 0x%08X %u\n", | ||
| 1395 | desc_lookup(desc), desc, time, data1, data2, line); | ||
| 1396 | IWL_ERR(priv, "blink1 blink2 ilink1 ilink2\n"); | ||
| 1397 | IWL_ERR(priv, "0x%05X 0x%05X 0x%05X 0x%05X\n", blink1, blink2, | ||
| 1398 | ilink1, ilink2); | ||
| 1399 | |||
| 1400 | } | ||
| 1401 | |||
| 1402 | #define EVENT_START_OFFSET (4 * sizeof(u32)) | ||
| 1403 | |||
| 1404 | /** | ||
| 1405 | * iwl_print_event_log - Dump error event log to syslog | ||
| 1406 | * | ||
| 1407 | */ | ||
| 1408 | static void iwl_print_event_log(struct iwl_priv *priv, u32 start_idx, | ||
| 1409 | u32 num_events, u32 mode) | ||
| 1410 | { | ||
| 1411 | u32 i; | ||
| 1412 | u32 base; /* SRAM byte address of event log header */ | ||
| 1413 | u32 event_size; /* 2 u32s, or 3 u32s if timestamp recorded */ | ||
| 1414 | u32 ptr; /* SRAM byte address of log data */ | ||
| 1415 | u32 ev, time, data; /* event log data */ | ||
| 1416 | |||
| 1417 | if (num_events == 0) | ||
| 1418 | return; | ||
| 1419 | if (priv->ucode_type == UCODE_INIT) | ||
| 1420 | base = le32_to_cpu(priv->card_alive_init.log_event_table_ptr); | ||
| 1421 | else | ||
| 1422 | base = le32_to_cpu(priv->card_alive.log_event_table_ptr); | ||
| 1423 | |||
| 1424 | if (mode == 0) | ||
| 1425 | event_size = 2 * sizeof(u32); | ||
| 1426 | else | ||
| 1427 | event_size = 3 * sizeof(u32); | ||
| 1428 | |||
| 1429 | ptr = base + EVENT_START_OFFSET + (start_idx * event_size); | ||
| 1430 | |||
| 1431 | /* "time" is actually "data" for mode 0 (no timestamp). | ||
| 1432 | * place event id # at far right for easier visual parsing. */ | ||
| 1433 | for (i = 0; i < num_events; i++) { | ||
| 1434 | ev = iwl_read_targ_mem(priv, ptr); | ||
| 1435 | ptr += sizeof(u32); | ||
| 1436 | time = iwl_read_targ_mem(priv, ptr); | ||
| 1437 | ptr += sizeof(u32); | ||
| 1438 | if (mode == 0) { | ||
| 1439 | /* data, ev */ | ||
| 1440 | IWL_ERR(priv, "EVT_LOG:0x%08x:%04u\n", time, ev); | ||
| 1441 | } else { | ||
| 1442 | data = iwl_read_targ_mem(priv, ptr); | ||
| 1443 | ptr += sizeof(u32); | ||
| 1444 | IWL_ERR(priv, "EVT_LOGT:%010u:0x%08x:%04u\n", | ||
| 1445 | time, data, ev); | ||
| 1446 | } | ||
| 1447 | } | ||
| 1448 | } | ||
| 1449 | |||
| 1450 | void iwl_dump_nic_event_log(struct iwl_priv *priv) | ||
| 1451 | { | ||
| 1452 | u32 base; /* SRAM byte address of event log header */ | ||
| 1453 | u32 capacity; /* event log capacity in # entries */ | ||
| 1454 | u32 mode; /* 0 - no timestamp, 1 - timestamp recorded */ | ||
| 1455 | u32 num_wraps; /* # times uCode wrapped to top of log */ | ||
| 1456 | u32 next_entry; /* index of next entry to be written by uCode */ | ||
| 1457 | u32 size; /* # entries that we'll print */ | ||
| 1458 | |||
| 1459 | if (priv->ucode_type == UCODE_INIT) | ||
| 1460 | base = le32_to_cpu(priv->card_alive_init.log_event_table_ptr); | ||
| 1461 | else | ||
| 1462 | base = le32_to_cpu(priv->card_alive.log_event_table_ptr); | ||
| 1463 | |||
| 1464 | if (!priv->cfg->ops->lib->is_valid_rtc_data_addr(base)) { | ||
| 1465 | IWL_ERR(priv, "Invalid event log pointer 0x%08X\n", base); | ||
| 1466 | return; | ||
| 1467 | } | ||
| 1468 | |||
| 1469 | /* event log header */ | ||
| 1470 | capacity = iwl_read_targ_mem(priv, base); | ||
| 1471 | mode = iwl_read_targ_mem(priv, base + (1 * sizeof(u32))); | ||
| 1472 | num_wraps = iwl_read_targ_mem(priv, base + (2 * sizeof(u32))); | ||
| 1473 | next_entry = iwl_read_targ_mem(priv, base + (3 * sizeof(u32))); | ||
| 1474 | |||
| 1475 | size = num_wraps ? capacity : next_entry; | ||
| 1476 | |||
| 1477 | /* bail out if nothing in log */ | ||
| 1478 | if (size == 0) { | ||
| 1479 | IWL_ERR(priv, "Start IWL Event Log Dump: nothing in log\n"); | ||
| 1480 | return; | ||
| 1481 | } | ||
| 1482 | |||
| 1483 | IWL_ERR(priv, "Start IWL Event Log Dump: display count %d, wraps %d\n", | ||
| 1484 | size, num_wraps); | ||
| 1485 | |||
| 1486 | /* if uCode has wrapped back to top of log, start at the oldest entry, | ||
| 1487 | * i.e the next one that uCode would fill. */ | ||
| 1488 | if (num_wraps) | ||
| 1489 | iwl_print_event_log(priv, next_entry, | ||
| 1490 | capacity - next_entry, mode); | ||
| 1491 | /* (then/else) start at top of log */ | ||
| 1492 | iwl_print_event_log(priv, 0, next_entry, mode); | ||
| 1493 | |||
| 1494 | } | ||
| 1495 | #endif | 1312 | #endif |
| 1496 | /** | 1313 | /** |
| 1497 | * iwl_irq_handle_error - called for HW or SW error interrupt from card | 1314 | * iwl_irq_handle_error - called for HW or SW error interrupt from card |
| @@ -1506,8 +1323,8 @@ void iwl_irq_handle_error(struct iwl_priv *priv) | |||
| 1506 | 1323 | ||
| 1507 | #ifdef CONFIG_IWLWIFI_DEBUG | 1324 | #ifdef CONFIG_IWLWIFI_DEBUG |
| 1508 | if (iwl_get_debug_level(priv) & IWL_DL_FW_ERRORS) { | 1325 | if (iwl_get_debug_level(priv) & IWL_DL_FW_ERRORS) { |
| 1509 | iwl_dump_nic_error_log(priv); | 1326 | priv->cfg->ops->lib->dump_nic_error_log(priv); |
| 1510 | iwl_dump_nic_event_log(priv); | 1327 | priv->cfg->ops->lib->dump_nic_event_log(priv); |
| 1511 | iwl_print_rx_config_cmd(priv); | 1328 | iwl_print_rx_config_cmd(priv); |
| 1512 | } | 1329 | } |
| 1513 | #endif | 1330 | #endif |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h index 7ff9ffb2b702..e50103a956b1 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.h +++ b/drivers/net/wireless/iwlwifi/iwl-core.h | |||
| @@ -166,6 +166,8 @@ struct iwl_lib_ops { | |||
| 166 | int (*is_valid_rtc_data_addr)(u32 addr); | 166 | int (*is_valid_rtc_data_addr)(u32 addr); |
| 167 | /* 1st ucode load */ | 167 | /* 1st ucode load */ |
| 168 | int (*load_ucode)(struct iwl_priv *priv); | 168 | int (*load_ucode)(struct iwl_priv *priv); |
| 169 | void (*dump_nic_event_log)(struct iwl_priv *priv); | ||
| 170 | void (*dump_nic_error_log)(struct iwl_priv *priv); | ||
| 169 | /* power management */ | 171 | /* power management */ |
| 170 | struct iwl_apm_ops apm_ops; | 172 | struct iwl_apm_ops apm_ops; |
| 171 | 173 | ||
| @@ -540,7 +542,19 @@ int iwl_pci_resume(struct pci_dev *pdev); | |||
| 540 | /***************************************************** | 542 | /***************************************************** |
| 541 | * Error Handling Debugging | 543 | * Error Handling Debugging |
| 542 | ******************************************************/ | 544 | ******************************************************/ |
| 545 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
| 543 | void iwl_dump_nic_event_log(struct iwl_priv *priv); | 546 | void iwl_dump_nic_event_log(struct iwl_priv *priv); |
| 547 | void iwl_dump_nic_error_log(struct iwl_priv *priv); | ||
| 548 | #else | ||
| 549 | static inline void iwl_dump_nic_event_log(struct iwl_priv *priv) | ||
| 550 | { | ||
| 551 | } | ||
| 552 | |||
| 553 | static inline void iwl_dump_nic_error_log(struct iwl_priv *priv) | ||
| 554 | { | ||
| 555 | } | ||
| 556 | #endif | ||
| 557 | |||
| 544 | void iwl_clear_isr_stats(struct iwl_priv *priv); | 558 | void iwl_clear_isr_stats(struct iwl_priv *priv); |
| 545 | 559 | ||
| 546 | /***************************************************** | 560 | /***************************************************** |
diff --git a/drivers/net/wireless/iwlwifi/iwl-debugfs.c b/drivers/net/wireless/iwlwifi/iwl-debugfs.c index fb844859a443..a198bcf61022 100644 --- a/drivers/net/wireless/iwlwifi/iwl-debugfs.c +++ b/drivers/net/wireless/iwlwifi/iwl-debugfs.c | |||
| @@ -410,7 +410,7 @@ static ssize_t iwl_dbgfs_nvm_read(struct file *file, | |||
| 410 | pos += scnprintf(buf + pos, buf_size - pos, "0x%.4x ", ofs); | 410 | pos += scnprintf(buf + pos, buf_size - pos, "0x%.4x ", ofs); |
| 411 | hex_dump_to_buffer(ptr + ofs, 16 , 16, 2, buf + pos, | 411 | hex_dump_to_buffer(ptr + ofs, 16 , 16, 2, buf + pos, |
| 412 | buf_size - pos, 0); | 412 | buf_size - pos, 0); |
| 413 | pos += strlen(buf); | 413 | pos += strlen(buf + pos); |
| 414 | if (buf_size - pos > 0) | 414 | if (buf_size - pos > 0) |
| 415 | buf[pos++] = '\n'; | 415 | buf[pos++] = '\n'; |
| 416 | } | 416 | } |
| @@ -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 | iwl_dump_nic_event_log(priv); | 439 | priv->cfg->ops->lib->dump_nic_event_log(priv); |
| 440 | 440 | ||
| 441 | return count; | 441 | return count; |
| 442 | } | 442 | } |
| @@ -909,7 +909,7 @@ static ssize_t iwl_dbgfs_traffic_log_read(struct file *file, | |||
| 909 | "0x%.4x ", ofs); | 909 | "0x%.4x ", ofs); |
| 910 | hex_dump_to_buffer(ptr + ofs, 16, 16, 2, | 910 | hex_dump_to_buffer(ptr + ofs, 16, 16, 2, |
| 911 | buf + pos, bufsz - pos, 0); | 911 | buf + pos, bufsz - pos, 0); |
| 912 | pos += strlen(buf); | 912 | pos += strlen(buf + pos); |
| 913 | if (bufsz - pos > 0) | 913 | if (bufsz - pos > 0) |
| 914 | buf[pos++] = '\n'; | 914 | buf[pos++] = '\n'; |
| 915 | } | 915 | } |
| @@ -932,7 +932,7 @@ static ssize_t iwl_dbgfs_traffic_log_read(struct file *file, | |||
| 932 | "0x%.4x ", ofs); | 932 | "0x%.4x ", ofs); |
| 933 | hex_dump_to_buffer(ptr + ofs, 16, 16, 2, | 933 | hex_dump_to_buffer(ptr + ofs, 16, 16, 2, |
| 934 | buf + pos, bufsz - pos, 0); | 934 | buf + pos, bufsz - pos, 0); |
| 935 | pos += strlen(buf); | 935 | pos += strlen(buf + pos); |
| 936 | if (bufsz - pos > 0) | 936 | if (bufsz - pos > 0) |
| 937 | buf[pos++] = '\n'; | 937 | buf[pos++] = '\n'; |
| 938 | } | 938 | } |
diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c index a7422e52d883..c18907544701 100644 --- a/drivers/net/wireless/iwlwifi/iwl-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c | |||
| @@ -197,6 +197,12 @@ void iwl_cmd_queue_free(struct iwl_priv *priv) | |||
| 197 | pci_free_consistent(dev, priv->hw_params.tfd_size * | 197 | pci_free_consistent(dev, priv->hw_params.tfd_size * |
| 198 | txq->q.n_bd, txq->tfds, txq->q.dma_addr); | 198 | txq->q.n_bd, txq->tfds, txq->q.dma_addr); |
| 199 | 199 | ||
| 200 | /* deallocate arrays */ | ||
| 201 | kfree(txq->cmd); | ||
| 202 | kfree(txq->meta); | ||
| 203 | txq->cmd = NULL; | ||
| 204 | txq->meta = NULL; | ||
| 205 | |||
| 200 | /* 0-fill queue descriptor structure */ | 206 | /* 0-fill queue descriptor structure */ |
| 201 | memset(txq, 0, sizeof(*txq)); | 207 | memset(txq, 0, sizeof(*txq)); |
| 202 | } | 208 | } |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 4f2d43937283..c390dbd877e4 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
| @@ -1481,6 +1481,7 @@ static inline void iwl_synchronize_irq(struct iwl_priv *priv) | |||
| 1481 | tasklet_kill(&priv->irq_tasklet); | 1481 | tasklet_kill(&priv->irq_tasklet); |
| 1482 | } | 1482 | } |
| 1483 | 1483 | ||
| 1484 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
| 1484 | static const char *desc_lookup(int i) | 1485 | static const char *desc_lookup(int i) |
| 1485 | { | 1486 | { |
| 1486 | switch (i) { | 1487 | switch (i) { |
| @@ -1504,7 +1505,7 @@ static const char *desc_lookup(int i) | |||
| 1504 | #define ERROR_START_OFFSET (1 * sizeof(u32)) | 1505 | #define ERROR_START_OFFSET (1 * sizeof(u32)) |
| 1505 | #define ERROR_ELEM_SIZE (7 * sizeof(u32)) | 1506 | #define ERROR_ELEM_SIZE (7 * sizeof(u32)) |
| 1506 | 1507 | ||
| 1507 | static void iwl3945_dump_nic_error_log(struct iwl_priv *priv) | 1508 | void iwl3945_dump_nic_error_log(struct iwl_priv *priv) |
| 1508 | { | 1509 | { |
| 1509 | u32 i; | 1510 | u32 i; |
| 1510 | u32 desc, time, count, base, data1; | 1511 | u32 desc, time, count, base, data1; |
| @@ -1598,7 +1599,7 @@ static void iwl3945_print_event_log(struct iwl_priv *priv, u32 start_idx, | |||
| 1598 | } | 1599 | } |
| 1599 | } | 1600 | } |
| 1600 | 1601 | ||
| 1601 | static void iwl3945_dump_nic_event_log(struct iwl_priv *priv) | 1602 | void iwl3945_dump_nic_event_log(struct iwl_priv *priv) |
| 1602 | { | 1603 | { |
| 1603 | u32 base; /* SRAM byte address of event log header */ | 1604 | u32 base; /* SRAM byte address of event log header */ |
| 1604 | u32 capacity; /* event log capacity in # entries */ | 1605 | u32 capacity; /* event log capacity in # entries */ |
| @@ -1640,6 +1641,16 @@ static void iwl3945_dump_nic_event_log(struct iwl_priv *priv) | |||
| 1640 | iwl3945_print_event_log(priv, 0, next_entry, mode); | 1641 | iwl3945_print_event_log(priv, 0, next_entry, mode); |
| 1641 | 1642 | ||
| 1642 | } | 1643 | } |
| 1644 | #else | ||
| 1645 | void iwl3945_dump_nic_event_log(struct iwl_priv *priv) | ||
| 1646 | { | ||
| 1647 | } | ||
| 1648 | |||
| 1649 | void iwl3945_dump_nic_error_log(struct iwl_priv *priv) | ||
| 1650 | { | ||
| 1651 | } | ||
| 1652 | |||
| 1653 | #endif | ||
| 1643 | 1654 | ||
| 1644 | static void iwl3945_irq_tasklet(struct iwl_priv *priv) | 1655 | static void iwl3945_irq_tasklet(struct iwl_priv *priv) |
| 1645 | { | 1656 | { |
| @@ -3683,21 +3694,6 @@ static ssize_t dump_error_log(struct device *d, | |||
| 3683 | 3694 | ||
| 3684 | static DEVICE_ATTR(dump_errors, S_IWUSR, NULL, dump_error_log); | 3695 | static DEVICE_ATTR(dump_errors, S_IWUSR, NULL, dump_error_log); |
| 3685 | 3696 | ||
| 3686 | static ssize_t dump_event_log(struct device *d, | ||
| 3687 | struct device_attribute *attr, | ||
| 3688 | const char *buf, size_t count) | ||
| 3689 | { | ||
| 3690 | struct iwl_priv *priv = dev_get_drvdata(d); | ||
| 3691 | char *p = (char *)buf; | ||
| 3692 | |||
| 3693 | if (p[0] == '1') | ||
| 3694 | iwl3945_dump_nic_event_log(priv); | ||
| 3695 | |||
| 3696 | return strnlen(buf, count); | ||
| 3697 | } | ||
| 3698 | |||
| 3699 | static DEVICE_ATTR(dump_events, S_IWUSR, NULL, dump_event_log); | ||
| 3700 | |||
| 3701 | /***************************************************************************** | 3697 | /***************************************************************************** |
| 3702 | * | 3698 | * |
| 3703 | * driver setup and tear down | 3699 | * driver setup and tear down |
| @@ -3742,7 +3738,6 @@ static struct attribute *iwl3945_sysfs_entries[] = { | |||
| 3742 | &dev_attr_antenna.attr, | 3738 | &dev_attr_antenna.attr, |
| 3743 | &dev_attr_channels.attr, | 3739 | &dev_attr_channels.attr, |
| 3744 | &dev_attr_dump_errors.attr, | 3740 | &dev_attr_dump_errors.attr, |
| 3745 | &dev_attr_dump_events.attr, | ||
| 3746 | &dev_attr_flags.attr, | 3741 | &dev_attr_flags.attr, |
| 3747 | &dev_attr_filter_flags.attr, | 3742 | &dev_attr_filter_flags.attr, |
| 3748 | #ifdef CONFIG_IWL3945_SPECTRUM_MEASUREMENT | 3743 | #ifdef CONFIG_IWL3945_SPECTRUM_MEASUREMENT |
diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c index f9f68e0e7344..afdbdaaf80cb 100644 --- a/drivers/platform/x86/sony-laptop.c +++ b/drivers/platform/x86/sony-laptop.c | |||
| @@ -1041,6 +1041,9 @@ static int sony_nc_resume(struct acpi_device *device) | |||
| 1041 | sony_backlight_update_status(sony_backlight_device) < 0) | 1041 | sony_backlight_update_status(sony_backlight_device) < 0) |
| 1042 | printk(KERN_WARNING DRV_PFX "unable to restore brightness level\n"); | 1042 | printk(KERN_WARNING DRV_PFX "unable to restore brightness level\n"); |
| 1043 | 1043 | ||
| 1044 | /* re-read rfkill state */ | ||
| 1045 | sony_nc_rfkill_update(); | ||
| 1046 | |||
| 1044 | return 0; | 1047 | return 0; |
| 1045 | } | 1048 | } |
| 1046 | 1049 | ||
| @@ -1078,6 +1081,8 @@ static int sony_nc_setup_rfkill(struct acpi_device *device, | |||
| 1078 | struct rfkill *rfk; | 1081 | struct rfkill *rfk; |
| 1079 | enum rfkill_type type; | 1082 | enum rfkill_type type; |
| 1080 | const char *name; | 1083 | const char *name; |
| 1084 | int result; | ||
| 1085 | bool hwblock; | ||
| 1081 | 1086 | ||
| 1082 | switch (nc_type) { | 1087 | switch (nc_type) { |
| 1083 | case SONY_WIFI: | 1088 | case SONY_WIFI: |
| @@ -1105,6 +1110,10 @@ static int sony_nc_setup_rfkill(struct acpi_device *device, | |||
| 1105 | if (!rfk) | 1110 | if (!rfk) |
| 1106 | return -ENOMEM; | 1111 | return -ENOMEM; |
| 1107 | 1112 | ||
| 1113 | sony_call_snc_handle(0x124, 0x200, &result); | ||
| 1114 | hwblock = !(result & 0x1); | ||
| 1115 | rfkill_set_hw_state(rfk, hwblock); | ||
| 1116 | |||
| 1108 | err = rfkill_register(rfk); | 1117 | err = rfkill_register(rfk); |
| 1109 | if (err) { | 1118 | if (err) { |
| 1110 | rfkill_destroy(rfk); | 1119 | rfkill_destroy(rfk); |
diff --git a/include/net/wext.h b/include/net/wext.h index 6d76a39a9c5b..3f2b94de2cfa 100644 --- a/include/net/wext.h +++ b/include/net/wext.h | |||
| @@ -14,6 +14,7 @@ extern int wext_handle_ioctl(struct net *net, struct ifreq *ifr, unsigned int cm | |||
| 14 | void __user *arg); | 14 | void __user *arg); |
| 15 | extern int compat_wext_handle_ioctl(struct net *net, unsigned int cmd, | 15 | extern int compat_wext_handle_ioctl(struct net *net, unsigned int cmd, |
| 16 | unsigned long arg); | 16 | unsigned long arg); |
| 17 | extern struct iw_statistics *get_wireless_stats(struct net_device *dev); | ||
| 17 | #else | 18 | #else |
| 18 | static inline int wext_proc_init(struct net *net) | 19 | static inline int wext_proc_init(struct net *net) |
| 19 | { | 20 | { |
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index 7d4c57523b09..821d30918cfc 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c | |||
| @@ -16,7 +16,7 @@ | |||
| 16 | #include <net/sock.h> | 16 | #include <net/sock.h> |
| 17 | #include <linux/rtnetlink.h> | 17 | #include <linux/rtnetlink.h> |
| 18 | #include <linux/wireless.h> | 18 | #include <linux/wireless.h> |
| 19 | #include <net/iw_handler.h> | 19 | #include <net/wext.h> |
| 20 | 20 | ||
| 21 | #include "net-sysfs.h" | 21 | #include "net-sysfs.h" |
| 22 | 22 | ||
| @@ -363,15 +363,13 @@ static ssize_t wireless_show(struct device *d, char *buf, | |||
| 363 | char *)) | 363 | char *)) |
| 364 | { | 364 | { |
| 365 | struct net_device *dev = to_net_dev(d); | 365 | struct net_device *dev = to_net_dev(d); |
| 366 | const struct iw_statistics *iw = NULL; | 366 | const struct iw_statistics *iw; |
| 367 | ssize_t ret = -EINVAL; | 367 | ssize_t ret = -EINVAL; |
| 368 | 368 | ||
| 369 | read_lock(&dev_base_lock); | 369 | read_lock(&dev_base_lock); |
| 370 | if (dev_isalive(dev)) { | 370 | if (dev_isalive(dev)) { |
| 371 | if (dev->wireless_handlers && | 371 | iw = get_wireless_stats(dev); |
| 372 | dev->wireless_handlers->get_wireless_stats) | 372 | if (iw) |
| 373 | iw = dev->wireless_handlers->get_wireless_stats(dev); | ||
| 374 | if (iw != NULL) | ||
| 375 | ret = (*format)(iw, buf); | 373 | ret = (*format)(iw, buf); |
| 376 | } | 374 | } |
| 377 | read_unlock(&dev_base_lock); | 375 | read_unlock(&dev_base_lock); |
| @@ -505,7 +503,7 @@ int netdev_register_kobject(struct net_device *net) | |||
| 505 | *groups++ = &netstat_group; | 503 | *groups++ = &netstat_group; |
| 506 | 504 | ||
| 507 | #ifdef CONFIG_WIRELESS_EXT_SYSFS | 505 | #ifdef CONFIG_WIRELESS_EXT_SYSFS |
| 508 | if (net->wireless_handlers && net->wireless_handlers->get_wireless_stats) | 506 | if (net->wireless_handlers || net->ieee80211_ptr) |
| 509 | *groups++ = &wireless_group; | 507 | *groups++ = &wireless_group; |
| 510 | #endif | 508 | #endif |
| 511 | #endif /* CONFIG_SYSFS */ | 509 | #endif /* CONFIG_SYSFS */ |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 97a278a2f48e..8d26e9bf8964 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
| @@ -1388,8 +1388,8 @@ ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata, | |||
| 1388 | 1388 | ||
| 1389 | reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code); | 1389 | reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code); |
| 1390 | 1390 | ||
| 1391 | printk(KERN_DEBUG "%s: disassociated (Reason: %u)\n", | 1391 | printk(KERN_DEBUG "%s: disassociated from %pM (Reason: %u)\n", |
| 1392 | sdata->dev->name, reason_code); | 1392 | sdata->dev->name, mgmt->sa, reason_code); |
| 1393 | 1393 | ||
| 1394 | ieee80211_set_disassoc(sdata, false); | 1394 | ieee80211_set_disassoc(sdata, false); |
| 1395 | return RX_MGMT_CFG80211_DISASSOC; | 1395 | return RX_MGMT_CFG80211_DISASSOC; |
| @@ -1675,7 +1675,7 @@ static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata, | |||
| 1675 | 1675 | ||
| 1676 | /* direct probe may be part of the association flow */ | 1676 | /* direct probe may be part of the association flow */ |
| 1677 | if (wk && wk->state == IEEE80211_MGD_STATE_PROBE) { | 1677 | if (wk && wk->state == IEEE80211_MGD_STATE_PROBE) { |
| 1678 | printk(KERN_DEBUG "%s direct probe responded\n", | 1678 | printk(KERN_DEBUG "%s: direct probe responded\n", |
| 1679 | sdata->dev->name); | 1679 | sdata->dev->name); |
| 1680 | wk->tries = 0; | 1680 | wk->tries = 0; |
| 1681 | wk->state = IEEE80211_MGD_STATE_AUTH; | 1681 | wk->state = IEEE80211_MGD_STATE_AUTH; |
| @@ -2502,9 +2502,6 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, | |||
| 2502 | struct ieee80211_mgd_work *wk; | 2502 | struct ieee80211_mgd_work *wk; |
| 2503 | const u8 *bssid = NULL; | 2503 | const u8 *bssid = NULL; |
| 2504 | 2504 | ||
| 2505 | printk(KERN_DEBUG "%s: deauthenticating by local choice (reason=%d)\n", | ||
| 2506 | sdata->dev->name, req->reason_code); | ||
| 2507 | |||
| 2508 | mutex_lock(&ifmgd->mtx); | 2505 | mutex_lock(&ifmgd->mtx); |
| 2509 | 2506 | ||
| 2510 | if (ifmgd->associated && &ifmgd->associated->cbss == req->bss) { | 2507 | if (ifmgd->associated && &ifmgd->associated->cbss == req->bss) { |
| @@ -2532,6 +2529,9 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, | |||
| 2532 | 2529 | ||
| 2533 | mutex_unlock(&ifmgd->mtx); | 2530 | mutex_unlock(&ifmgd->mtx); |
| 2534 | 2531 | ||
| 2532 | printk(KERN_DEBUG "%s: deauthenticating from %pM by local choice (reason=%d)\n", | ||
| 2533 | sdata->dev->name, bssid, req->reason_code); | ||
| 2534 | |||
| 2535 | ieee80211_send_deauth_disassoc(sdata, bssid, | 2535 | ieee80211_send_deauth_disassoc(sdata, bssid, |
| 2536 | IEEE80211_STYPE_DEAUTH, req->reason_code, | 2536 | IEEE80211_STYPE_DEAUTH, req->reason_code, |
| 2537 | cookie); | 2537 | cookie); |
| @@ -2545,9 +2545,6 @@ int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, | |||
| 2545 | { | 2545 | { |
| 2546 | struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; | 2546 | struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; |
| 2547 | 2547 | ||
| 2548 | printk(KERN_DEBUG "%s: disassociating by local choice (reason=%d)\n", | ||
| 2549 | sdata->dev->name, req->reason_code); | ||
| 2550 | |||
| 2551 | mutex_lock(&ifmgd->mtx); | 2548 | mutex_lock(&ifmgd->mtx); |
| 2552 | 2549 | ||
| 2553 | /* | 2550 | /* |
| @@ -2561,6 +2558,9 @@ int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, | |||
| 2561 | return -ENOLINK; | 2558 | return -ENOLINK; |
| 2562 | } | 2559 | } |
| 2563 | 2560 | ||
| 2561 | printk(KERN_DEBUG "%s: disassociating from %pM by local choice (reason=%d)\n", | ||
| 2562 | sdata->dev->name, req->bss->bssid, req->reason_code); | ||
| 2563 | |||
| 2564 | ieee80211_set_disassoc(sdata, false); | 2564 | ieee80211_set_disassoc(sdata, false); |
| 2565 | 2565 | ||
| 2566 | mutex_unlock(&ifmgd->mtx); | 2566 | mutex_unlock(&ifmgd->mtx); |
diff --git a/net/wireless/sme.c b/net/wireless/sme.c index 7fae7eee65de..93c3ed329204 100644 --- a/net/wireless/sme.c +++ b/net/wireless/sme.c | |||
| @@ -762,9 +762,8 @@ int __cfg80211_connect(struct cfg80211_registered_device *rdev, | |||
| 762 | wdev->conn->params.ssid = wdev->ssid; | 762 | wdev->conn->params.ssid = wdev->ssid; |
| 763 | wdev->conn->params.ssid_len = connect->ssid_len; | 763 | wdev->conn->params.ssid_len = connect->ssid_len; |
| 764 | 764 | ||
| 765 | /* don't care about result -- but fill bssid & channel */ | 765 | /* see if we have the bss already */ |
| 766 | if (!wdev->conn->params.bssid || !wdev->conn->params.channel) | 766 | bss = cfg80211_get_conn_bss(wdev); |
| 767 | bss = cfg80211_get_conn_bss(wdev); | ||
| 768 | 767 | ||
| 769 | wdev->sme_state = CFG80211_SME_CONNECTING; | 768 | wdev->sme_state = CFG80211_SME_CONNECTING; |
| 770 | wdev->connect_keys = connkeys; | 769 | wdev->connect_keys = connkeys; |
diff --git a/net/wireless/wext-sme.c b/net/wireless/wext-sme.c index bf725275eb8d..5615a8802536 100644 --- a/net/wireless/wext-sme.c +++ b/net/wireless/wext-sme.c | |||
| @@ -30,7 +30,8 @@ int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev, | |||
| 30 | if (wdev->wext.keys) { | 30 | if (wdev->wext.keys) { |
| 31 | wdev->wext.keys->def = wdev->wext.default_key; | 31 | wdev->wext.keys->def = wdev->wext.default_key; |
| 32 | wdev->wext.keys->defmgmt = wdev->wext.default_mgmt_key; | 32 | wdev->wext.keys->defmgmt = wdev->wext.default_mgmt_key; |
| 33 | wdev->wext.connect.privacy = true; | 33 | if (wdev->wext.default_key != -1) |
| 34 | wdev->wext.connect.privacy = true; | ||
| 34 | } | 35 | } |
| 35 | 36 | ||
| 36 | if (!wdev->wext.connect.ssid_len) | 37 | if (!wdev->wext.connect.ssid_len) |
| @@ -229,8 +230,7 @@ int cfg80211_mgd_wext_giwessid(struct net_device *dev, | |||
| 229 | data->flags = 1; | 230 | data->flags = 1; |
| 230 | data->length = wdev->wext.connect.ssid_len; | 231 | data->length = wdev->wext.connect.ssid_len; |
| 231 | memcpy(ssid, wdev->wext.connect.ssid, data->length); | 232 | memcpy(ssid, wdev->wext.connect.ssid, data->length); |
| 232 | } else | 233 | } |
| 233 | data->flags = 0; | ||
| 234 | wdev_unlock(wdev); | 234 | wdev_unlock(wdev); |
| 235 | 235 | ||
| 236 | return 0; | 236 | return 0; |
| @@ -306,8 +306,6 @@ int cfg80211_mgd_wext_giwap(struct net_device *dev, | |||
| 306 | wdev_lock(wdev); | 306 | wdev_lock(wdev); |
| 307 | if (wdev->current_bss) | 307 | if (wdev->current_bss) |
| 308 | memcpy(ap_addr->sa_data, wdev->current_bss->pub.bssid, ETH_ALEN); | 308 | memcpy(ap_addr->sa_data, wdev->current_bss->pub.bssid, ETH_ALEN); |
| 309 | else if (wdev->wext.connect.bssid) | ||
| 310 | memcpy(ap_addr->sa_data, wdev->wext.connect.bssid, ETH_ALEN); | ||
| 311 | else | 309 | else |
| 312 | memset(ap_addr->sa_data, 0, ETH_ALEN); | 310 | memset(ap_addr->sa_data, 0, ETH_ALEN); |
| 313 | wdev_unlock(wdev); | 311 | wdev_unlock(wdev); |
diff --git a/net/wireless/wext.c b/net/wireless/wext.c index 5b4a0cee4418..60fe57761ca9 100644 --- a/net/wireless/wext.c +++ b/net/wireless/wext.c | |||
| @@ -470,7 +470,7 @@ static iw_handler get_handler(struct net_device *dev, unsigned int cmd) | |||
| 470 | /* | 470 | /* |
| 471 | * Get statistics out of the driver | 471 | * Get statistics out of the driver |
| 472 | */ | 472 | */ |
| 473 | static struct iw_statistics *get_wireless_stats(struct net_device *dev) | 473 | struct iw_statistics *get_wireless_stats(struct net_device *dev) |
| 474 | { | 474 | { |
| 475 | /* New location */ | 475 | /* New location */ |
| 476 | if ((dev->wireless_handlers != NULL) && | 476 | if ((dev->wireless_handlers != NULL) && |
| @@ -773,10 +773,13 @@ static int ioctl_standard_iw_point(struct iw_point *iwp, unsigned int cmd, | |||
| 773 | essid_compat = 1; | 773 | essid_compat = 1; |
| 774 | else if (IW_IS_SET(cmd) && (iwp->length != 0)) { | 774 | else if (IW_IS_SET(cmd) && (iwp->length != 0)) { |
| 775 | char essid[IW_ESSID_MAX_SIZE + 1]; | 775 | char essid[IW_ESSID_MAX_SIZE + 1]; |
| 776 | unsigned int len; | ||
| 777 | len = iwp->length * descr->token_size; | ||
| 776 | 778 | ||
| 777 | err = copy_from_user(essid, iwp->pointer, | 779 | if (len > IW_ESSID_MAX_SIZE) |
| 778 | iwp->length * | 780 | return -EFAULT; |
| 779 | descr->token_size); | 781 | |
| 782 | err = copy_from_user(essid, iwp->pointer, len); | ||
| 780 | if (err) | 783 | if (err) |
| 781 | return -EFAULT; | 784 | return -EFAULT; |
| 782 | 785 | ||
