diff options
author | David S. Miller <davem@davemloft.net> | 2009-09-28 17:50:06 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-09-28 17:50:06 -0400 |
commit | eb1cf0f8f7a9e5a6d573d5bd72c015686a042db0 (patch) | |
tree | ee5e1e52ef663e1a4d19c7abd6477a8ed75fda41 | |
parent | 47379052b5c87707bc6e20a2a4f6ac156fb8357c (diff) | |
parent | a0d97d6c7ceddc176b5eed171aa2a52e32cf3eda (diff) |
Merge branch 'master' of ssh://master.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6
-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 | ||