aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn W. Linville <linville@tuxdriver.com>2010-12-15 16:33:28 -0500
committerJohn W. Linville <linville@tuxdriver.com>2010-12-15 16:33:28 -0500
commit1fcfe76a760e78d7774a254608557c84071b0cfb (patch)
tree2659028625a15a6bcbef350d16ace21982f714d4
parent0c8173385e549f95cd80c3fff5aab87b4f881d8d (diff)
parent56e6417b49132d4f56e9f2241d31942b90b46315 (diff)
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6
Conflicts: drivers/net/wireless/iwlwifi/iwl-1000.c drivers/net/wireless/iwlwifi/iwl-6000.c drivers/net/wireless/iwlwifi/iwl-core.h
-rw-r--r--drivers/bluetooth/hci_ldisc.c6
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-1000.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-6000.c12
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-eeprom.c88
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-lib.c6
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.h1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-eeprom.h25
-rw-r--r--drivers/net/wireless/libertas/cfg.c2
-rw-r--r--drivers/net/wireless/p54/p54usb.c6
-rw-r--r--net/bluetooth/rfcomm/core.c1
-rw-r--r--net/mac80211/ibss.c4
-rw-r--r--net/mac80211/work.c5
12 files changed, 148 insertions, 10 deletions
diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c
index 720148294e64..3c6cabcb7d84 100644
--- a/drivers/bluetooth/hci_ldisc.c
+++ b/drivers/bluetooth/hci_ldisc.c
@@ -311,8 +311,10 @@ static void hci_uart_tty_close(struct tty_struct *tty)
311 311
312 if (test_and_clear_bit(HCI_UART_PROTO_SET, &hu->flags)) { 312 if (test_and_clear_bit(HCI_UART_PROTO_SET, &hu->flags)) {
313 hu->proto->close(hu); 313 hu->proto->close(hu);
314 hci_unregister_dev(hdev); 314 if (hdev) {
315 hci_free_dev(hdev); 315 hci_unregister_dev(hdev);
316 hci_free_dev(hdev);
317 }
316 } 318 }
317 } 319 }
318} 320}
diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c
index 3c983e426f25..af85458401a4 100644
--- a/drivers/net/wireless/iwlwifi/iwl-1000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-1000.c
@@ -311,6 +311,7 @@ struct iwl_cfg iwl100_bgn_cfg = {
311 .base_params = &iwl1000_base_params, 311 .base_params = &iwl1000_base_params,
312 .ht_params = &iwl1000_ht_params, 312 .ht_params = &iwl1000_ht_params,
313 .led_mode = IWL_LED_RF_STATE, 313 .led_mode = IWL_LED_RF_STATE,
314 .use_new_eeprom_reading = true,
314}; 315};
315 316
316struct iwl_cfg iwl100_bg_cfg = { 317struct iwl_cfg iwl100_bg_cfg = {
@@ -324,6 +325,7 @@ struct iwl_cfg iwl100_bg_cfg = {
324 .mod_params = &iwlagn_mod_params, 325 .mod_params = &iwlagn_mod_params,
325 .base_params = &iwl1000_base_params, 326 .base_params = &iwl1000_base_params,
326 .led_mode = IWL_LED_RF_STATE, 327 .led_mode = IWL_LED_RF_STATE,
328 .use_new_eeprom_reading = true,
327}; 329};
328 330
329MODULE_FIRMWARE(IWL1000_MODULE_FIRMWARE(IWL1000_UCODE_API_MAX)); 331MODULE_FIRMWARE(IWL1000_MODULE_FIRMWARE(IWL1000_UCODE_API_MAX));
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c
index 808942cc2991..a848ca06dc6f 100644
--- a/drivers/net/wireless/iwlwifi/iwl-6000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-6000.c
@@ -564,6 +564,7 @@ struct iwl_cfg iwl6005_2agn_cfg = {
564 .need_dc_calib = true, 564 .need_dc_calib = true,
565 .need_temp_offset_calib = true, 565 .need_temp_offset_calib = true,
566 .led_mode = IWL_LED_RF_STATE, 566 .led_mode = IWL_LED_RF_STATE,
567 .use_new_eeprom_reading = true,
567}; 568};
568 569
569struct iwl_cfg iwl6005_2abg_cfg = { 570struct iwl_cfg iwl6005_2abg_cfg = {
@@ -579,6 +580,7 @@ struct iwl_cfg iwl6005_2abg_cfg = {
579 .need_dc_calib = true, 580 .need_dc_calib = true,
580 .need_temp_offset_calib = true, 581 .need_temp_offset_calib = true,
581 .led_mode = IWL_LED_RF_STATE, 582 .led_mode = IWL_LED_RF_STATE,
583 .use_new_eeprom_reading = true,
582}; 584};
583 585
584struct iwl_cfg iwl6005_2bg_cfg = { 586struct iwl_cfg iwl6005_2bg_cfg = {
@@ -594,6 +596,7 @@ struct iwl_cfg iwl6005_2bg_cfg = {
594 .need_dc_calib = true, 596 .need_dc_calib = true,
595 .need_temp_offset_calib = true, 597 .need_temp_offset_calib = true,
596 .led_mode = IWL_LED_RF_STATE, 598 .led_mode = IWL_LED_RF_STATE,
599 .use_new_eeprom_reading = true,
597}; 600};
598 601
599struct iwl_cfg iwl6030_2agn_cfg = { 602struct iwl_cfg iwl6030_2agn_cfg = {
@@ -614,6 +617,7 @@ struct iwl_cfg iwl6030_2agn_cfg = {
614 .adv_pm = true, 617 .adv_pm = true,
615 /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ 618 /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
616 .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, 619 .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
620 .use_new_eeprom_reading = true,
617}; 621};
618 622
619struct iwl_cfg iwl6030_2abg_cfg = { 623struct iwl_cfg iwl6030_2abg_cfg = {
@@ -633,6 +637,7 @@ struct iwl_cfg iwl6030_2abg_cfg = {
633 .adv_pm = true, 637 .adv_pm = true,
634 /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ 638 /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
635 .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, 639 .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
640 .use_new_eeprom_reading = true,
636}; 641};
637 642
638struct iwl_cfg iwl6030_2bgn_cfg = { 643struct iwl_cfg iwl6030_2bgn_cfg = {
@@ -653,6 +658,7 @@ struct iwl_cfg iwl6030_2bgn_cfg = {
653 .adv_pm = true, 658 .adv_pm = true,
654 /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ 659 /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
655 .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, 660 .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
661 .use_new_eeprom_reading = true,
656}; 662};
657 663
658struct iwl_cfg iwl6030_2bg_cfg = { 664struct iwl_cfg iwl6030_2bg_cfg = {
@@ -672,6 +678,7 @@ struct iwl_cfg iwl6030_2bg_cfg = {
672 .adv_pm = true, 678 .adv_pm = true,
673 /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ 679 /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
674 .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, 680 .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
681 .use_new_eeprom_reading = true,
675}; 682};
676 683
677struct iwl_cfg iwl1030_bgn_cfg = { 684struct iwl_cfg iwl1030_bgn_cfg = {
@@ -692,6 +699,7 @@ struct iwl_cfg iwl1030_bgn_cfg = {
692 .adv_pm = true, 699 .adv_pm = true,
693 /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ 700 /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
694 .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, 701 .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
702 .use_new_eeprom_reading = true,
695}; 703};
696 704
697struct iwl_cfg iwl1030_bg_cfg = { 705struct iwl_cfg iwl1030_bg_cfg = {
@@ -711,6 +719,7 @@ struct iwl_cfg iwl1030_bg_cfg = {
711 .adv_pm = true, 719 .adv_pm = true,
712 /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ 720 /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
713 .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, 721 .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
722 .use_new_eeprom_reading = true,
714}; 723};
715 724
716/* 725/*
@@ -793,6 +802,7 @@ struct iwl_cfg iwl6150_bgn_cfg = {
793 .ht_params = &iwl6000_ht_params, 802 .ht_params = &iwl6000_ht_params,
794 .need_dc_calib = true, 803 .need_dc_calib = true,
795 .led_mode = IWL_LED_RF_STATE, 804 .led_mode = IWL_LED_RF_STATE,
805 .use_new_eeprom_reading = true,
796}; 806};
797 807
798struct iwl_cfg iwl6050_2abg_cfg = { 808struct iwl_cfg iwl6050_2abg_cfg = {
@@ -841,6 +851,7 @@ struct iwl_cfg iwl130_bgn_cfg = {
841 .adv_pm = true, 851 .adv_pm = true,
842 /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ 852 /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
843 .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, 853 .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
854 .use_new_eeprom_reading = true,
844}; 855};
845 856
846struct iwl_cfg iwl130_bg_cfg = { 857struct iwl_cfg iwl130_bg_cfg = {
@@ -859,6 +870,7 @@ struct iwl_cfg iwl130_bg_cfg = {
859 .adv_pm = true, 870 .adv_pm = true,
860 /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ 871 /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
861 .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, 872 .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
873 .use_new_eeprom_reading = true,
862}; 874};
863 875
864MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX)); 876MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX));
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-eeprom.c b/drivers/net/wireless/iwlwifi/iwl-agn-eeprom.c
index dbada761624d..cf9194baadac 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-eeprom.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-eeprom.c
@@ -433,7 +433,7 @@ static s8 iwl_update_channel_txpower(struct iwl_priv *priv,
433/** 433/**
434 * iwlcore_eeprom_enhanced_txpower: process enhanced tx power info 434 * iwlcore_eeprom_enhanced_txpower: process enhanced tx power info
435 */ 435 */
436void iwlcore_eeprom_enhanced_txpower(struct iwl_priv *priv) 436static void iwlcore_eeprom_enhanced_txpower_old(struct iwl_priv *priv)
437{ 437{
438 int eeprom_section_count = 0; 438 int eeprom_section_count = 0;
439 int section, element; 439 int section, element;
@@ -460,7 +460,8 @@ void iwlcore_eeprom_enhanced_txpower(struct iwl_priv *priv)
460 * always check for valid entry before process 460 * always check for valid entry before process
461 * the information 461 * the information
462 */ 462 */
463 if (!enhanced_txpower->common || enhanced_txpower->reserved) 463 if (!(enhanced_txpower->flags || enhanced_txpower->channel) ||
464 enhanced_txpower->delta_20_in_40)
464 continue; 465 continue;
465 466
466 for (element = 0; element < eeprom_section_count; element++) { 467 for (element = 0; element < eeprom_section_count; element++) {
@@ -493,3 +494,86 @@ void iwlcore_eeprom_enhanced_txpower(struct iwl_priv *priv)
493 } 494 }
494 } 495 }
495} 496}
497
498static void
499iwlcore_eeprom_enh_txp_read_element(struct iwl_priv *priv,
500 struct iwl_eeprom_enhanced_txpwr *txp,
501 s8 max_txpower_avg)
502{
503 int ch_idx;
504 bool is_ht40 = txp->flags & IWL_EEPROM_ENH_TXP_FL_40MHZ;
505 enum ieee80211_band band;
506
507 band = txp->flags & IWL_EEPROM_ENH_TXP_FL_BAND_52G ?
508 IEEE80211_BAND_5GHZ : IEEE80211_BAND_2GHZ;
509
510 for (ch_idx = 0; ch_idx < priv->channel_count; ch_idx++) {
511 struct iwl_channel_info *ch_info = &priv->channel_info[ch_idx];
512
513 /* update matching channel or from common data only */
514 if (txp->channel != 0 && ch_info->channel != txp->channel)
515 continue;
516
517 /* update matching band only */
518 if (band != ch_info->band)
519 continue;
520
521 if (ch_info->max_power_avg < max_txpower_avg && !is_ht40) {
522 ch_info->max_power_avg = max_txpower_avg;
523 ch_info->curr_txpow = max_txpower_avg;
524 ch_info->scan_power = max_txpower_avg;
525 }
526
527 if (is_ht40 && ch_info->ht40_max_power_avg < max_txpower_avg)
528 ch_info->ht40_max_power_avg = max_txpower_avg;
529 }
530}
531
532#define EEPROM_TXP_OFFS (0x00 | INDIRECT_ADDRESS | INDIRECT_TXP_LIMIT)
533#define EEPROM_TXP_ENTRY_LEN sizeof(struct iwl_eeprom_enhanced_txpwr)
534#define EEPROM_TXP_SZ_OFFS (0x00 | INDIRECT_ADDRESS | INDIRECT_TXP_LIMIT_SIZE)
535
536static void iwlcore_eeprom_enhanced_txpower_new(struct iwl_priv *priv)
537{
538 struct iwl_eeprom_enhanced_txpwr *txp_array, *txp;
539 int idx, entries;
540 __le16 *txp_len;
541 s8 max_txp_avg, max_txp_avg_halfdbm;
542
543 BUILD_BUG_ON(sizeof(struct iwl_eeprom_enhanced_txpwr) != 8);
544
545 /* the length is in 16-bit words, but we want entries */
546 txp_len = (__le16 *) iwlagn_eeprom_query_addr(priv, EEPROM_TXP_SZ_OFFS);
547 entries = le16_to_cpup(txp_len) * 2 / EEPROM_TXP_ENTRY_LEN;
548
549 txp_array = (void *) iwlagn_eeprom_query_addr(priv, EEPROM_TXP_OFFS);
550 for (idx = 0; idx < entries; idx++) {
551 txp = &txp_array[idx];
552
553 /* skip invalid entries */
554 if (!(txp->flags & IWL_EEPROM_ENH_TXP_FL_VALID))
555 continue;
556
557 max_txp_avg = iwl_get_max_txpower_avg(priv, txp_array, idx,
558 &max_txp_avg_halfdbm);
559
560 /*
561 * Update the user limit values values to the highest
562 * power supported by any channel
563 */
564 if (max_txp_avg > priv->tx_power_user_lmt)
565 priv->tx_power_user_lmt = max_txp_avg;
566 if (max_txp_avg_halfdbm > priv->tx_power_lmt_in_half_dbm)
567 priv->tx_power_lmt_in_half_dbm = max_txp_avg_halfdbm;
568
569 iwlcore_eeprom_enh_txp_read_element(priv, txp, max_txp_avg);
570 }
571}
572
573void iwlcore_eeprom_enhanced_txpower(struct iwl_priv *priv)
574{
575 if (priv->cfg->use_new_eeprom_reading)
576 iwlcore_eeprom_enhanced_txpower_new(priv);
577 else
578 iwlcore_eeprom_enhanced_txpower_old(priv);
579}
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
index d941910e7ef4..7c8010f7ce56 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
@@ -568,6 +568,12 @@ static u32 eeprom_indirect_address(const struct iwl_priv *priv, u32 address)
568 case INDIRECT_REGULATORY: 568 case INDIRECT_REGULATORY:
569 offset = iwl_eeprom_query16(priv, EEPROM_LINK_REGULATORY); 569 offset = iwl_eeprom_query16(priv, EEPROM_LINK_REGULATORY);
570 break; 570 break;
571 case INDIRECT_TXP_LIMIT:
572 offset = iwl_eeprom_query16(priv, EEPROM_LINK_TXP_LIMIT);
573 break;
574 case INDIRECT_TXP_LIMIT_SIZE:
575 offset = iwl_eeprom_query16(priv, EEPROM_LINK_TXP_LIMIT_SIZE);
576 break;
571 case INDIRECT_CALIBRATION: 577 case INDIRECT_CALIBRATION:
572 offset = iwl_eeprom_query16(priv, EEPROM_LINK_CALIBRATION); 578 offset = iwl_eeprom_query16(priv, EEPROM_LINK_CALIBRATION);
573 break; 579 break;
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
index 568920ac982d..9df33d6af8bb 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
@@ -412,6 +412,7 @@ struct iwl_cfg {
412 u8 scan_tx_antennas[IEEE80211_NUM_BANDS]; 412 u8 scan_tx_antennas[IEEE80211_NUM_BANDS];
413 enum iwl_led_mode led_mode; 413 enum iwl_led_mode led_mode;
414 const bool adv_pm; 414 const bool adv_pm;
415 const bool use_new_eeprom_reading; /* temporary, remove later */
415}; 416};
416 417
417/*************************** 418/***************************
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.h b/drivers/net/wireless/iwlwifi/iwl-eeprom.h
index 583916db46e4..8994b5b23593 100644
--- a/drivers/net/wireless/iwlwifi/iwl-eeprom.h
+++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.h
@@ -129,6 +129,17 @@ struct iwl_eeprom_channel {
129 s8 max_power_avg; /* max power (dBm) on this chnl, limit 31 */ 129 s8 max_power_avg; /* max power (dBm) on this chnl, limit 31 */
130} __packed; 130} __packed;
131 131
132enum iwl_eeprom_enhanced_txpwr_flags {
133 IWL_EEPROM_ENH_TXP_FL_VALID = BIT(0),
134 IWL_EEPROM_ENH_TXP_FL_BAND_52G = BIT(1),
135 IWL_EEPROM_ENH_TXP_FL_OFDM = BIT(2),
136 IWL_EEPROM_ENH_TXP_FL_40MHZ = BIT(3),
137 IWL_EEPROM_ENH_TXP_FL_HT_AP = BIT(4),
138 IWL_EEPROM_ENH_TXP_FL_RES1 = BIT(5),
139 IWL_EEPROM_ENH_TXP_FL_RES2 = BIT(6),
140 IWL_EEPROM_ENH_TXP_FL_COMMON_TYPE = BIT(7),
141};
142
132/** 143/**
133 * iwl_eeprom_enhanced_txpwr structure 144 * iwl_eeprom_enhanced_txpwr structure
134 * This structure presents the enhanced regulatory tx power limit layout 145 * This structure presents the enhanced regulatory tx power limit layout
@@ -136,21 +147,23 @@ struct iwl_eeprom_channel {
136 * Enhanced regulatory tx power portion of eeprom image can be broken down 147 * Enhanced regulatory tx power portion of eeprom image can be broken down
137 * into individual structures; each one is 8 bytes in size and contain the 148 * into individual structures; each one is 8 bytes in size and contain the
138 * following information 149 * following information
139 * @common: (desc + channel) not used by driver, should _NOT_ be "zero" 150 * @flags: entry flags
151 * @channel: channel number
140 * @chain_a_max_pwr: chain a max power in 1/2 dBm 152 * @chain_a_max_pwr: chain a max power in 1/2 dBm
141 * @chain_b_max_pwr: chain b max power in 1/2 dBm 153 * @chain_b_max_pwr: chain b max power in 1/2 dBm
142 * @chain_c_max_pwr: chain c max power in 1/2 dBm 154 * @chain_c_max_pwr: chain c max power in 1/2 dBm
143 * @reserved: not used, should be "zero" 155 * @delta_20_in_40: 20-in-40 deltas (hi/lo)
144 * @mimo2_max_pwr: mimo2 max power in 1/2 dBm 156 * @mimo2_max_pwr: mimo2 max power in 1/2 dBm
145 * @mimo3_max_pwr: mimo3 max power in 1/2 dBm 157 * @mimo3_max_pwr: mimo3 max power in 1/2 dBm
146 * 158 *
147 */ 159 */
148struct iwl_eeprom_enhanced_txpwr { 160struct iwl_eeprom_enhanced_txpwr {
149 __le16 common; 161 u8 flags;
162 u8 channel;
150 s8 chain_a_max; 163 s8 chain_a_max;
151 s8 chain_b_max; 164 s8 chain_b_max;
152 s8 chain_c_max; 165 s8 chain_c_max;
153 s8 reserved; 166 u8 delta_20_in_40;
154 s8 mimo2_max; 167 s8 mimo2_max;
155 s8 mimo3_max; 168 s8 mimo3_max;
156} __packed; 169} __packed;
@@ -195,6 +208,8 @@ struct iwl_eeprom_enhanced_txpwr {
195#define EEPROM_LINK_CALIBRATION (2*0x67) 208#define EEPROM_LINK_CALIBRATION (2*0x67)
196#define EEPROM_LINK_PROCESS_ADJST (2*0x68) 209#define EEPROM_LINK_PROCESS_ADJST (2*0x68)
197#define EEPROM_LINK_OTHERS (2*0x69) 210#define EEPROM_LINK_OTHERS (2*0x69)
211#define EEPROM_LINK_TXP_LIMIT (2*0x6a)
212#define EEPROM_LINK_TXP_LIMIT_SIZE (2*0x6b)
198 213
199/* agn regulatory - indirect access */ 214/* agn regulatory - indirect access */
200#define EEPROM_REG_BAND_1_CHANNELS ((0x08)\ 215#define EEPROM_REG_BAND_1_CHANNELS ((0x08)\
@@ -398,6 +413,8 @@ struct iwl_eeprom_calib_info {
398#define INDIRECT_CALIBRATION 0x00040000 413#define INDIRECT_CALIBRATION 0x00040000
399#define INDIRECT_PROCESS_ADJST 0x00050000 414#define INDIRECT_PROCESS_ADJST 0x00050000
400#define INDIRECT_OTHERS 0x00060000 415#define INDIRECT_OTHERS 0x00060000
416#define INDIRECT_TXP_LIMIT 0x00070000
417#define INDIRECT_TXP_LIMIT_SIZE 0x00080000
401#define INDIRECT_ADDRESS 0x00100000 418#define INDIRECT_ADDRESS 0x00100000
402 419
403/* General */ 420/* General */
diff --git a/drivers/net/wireless/libertas/cfg.c b/drivers/net/wireless/libertas/cfg.c
index 300be1931826..698a1f7694ed 100644
--- a/drivers/net/wireless/libertas/cfg.c
+++ b/drivers/net/wireless/libertas/cfg.c
@@ -617,7 +617,7 @@ static int lbs_ret_scan(struct lbs_private *priv, unsigned long dummy,
617 print_ssid(ssid_buf, ssid, ssid_len), 617 print_ssid(ssid_buf, ssid, ssid_len),
618 LBS_SCAN_RSSI_TO_MBM(rssi)/100); 618 LBS_SCAN_RSSI_TO_MBM(rssi)/100);
619 619
620 if (channel || 620 if (channel &&
621 !(channel->flags & IEEE80211_CHAN_DISABLED)) 621 !(channel->flags & IEEE80211_CHAN_DISABLED))
622 cfg80211_inform_bss(wiphy, channel, 622 cfg80211_inform_bss(wiphy, channel,
623 bssid, le64_to_cpu(*(__le64 *)tsfdesc), 623 bssid, le64_to_cpu(*(__le64 *)tsfdesc),
diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c
index dd4d8fc9ad7a..21713a7638c4 100644
--- a/drivers/net/wireless/p54/p54usb.c
+++ b/drivers/net/wireless/p54/p54usb.c
@@ -43,6 +43,7 @@ MODULE_FIRMWARE("isl3887usb");
43 43
44static struct usb_device_id p54u_table[] __devinitdata = { 44static struct usb_device_id p54u_table[] __devinitdata = {
45 /* Version 1 devices (pci chip + net2280) */ 45 /* Version 1 devices (pci chip + net2280) */
46 {USB_DEVICE(0x0411, 0x0050)}, /* Buffalo WLI2-USB2-G54 */
46 {USB_DEVICE(0x045e, 0x00c2)}, /* Microsoft MN-710 */ 47 {USB_DEVICE(0x045e, 0x00c2)}, /* Microsoft MN-710 */
47 {USB_DEVICE(0x0506, 0x0a11)}, /* 3COM 3CRWE254G72 */ 48 {USB_DEVICE(0x0506, 0x0a11)}, /* 3COM 3CRWE254G72 */
48 {USB_DEVICE(0x06b9, 0x0120)}, /* Thomson SpeedTouch 120g */ 49 {USB_DEVICE(0x06b9, 0x0120)}, /* Thomson SpeedTouch 120g */
@@ -56,9 +57,13 @@ static struct usb_device_id p54u_table[] __devinitdata = {
56 {USB_DEVICE(0x0846, 0x4220)}, /* Netgear WG111 */ 57 {USB_DEVICE(0x0846, 0x4220)}, /* Netgear WG111 */
57 {USB_DEVICE(0x09aa, 0x1000)}, /* Spinnaker Proto board */ 58 {USB_DEVICE(0x09aa, 0x1000)}, /* Spinnaker Proto board */
58 {USB_DEVICE(0x0cde, 0x0006)}, /* Medion 40900, Roper Europe */ 59 {USB_DEVICE(0x0cde, 0x0006)}, /* Medion 40900, Roper Europe */
60 {USB_DEVICE(0x0db0, 0x6826)}, /* MSI UB54G (MS-6826) */
59 {USB_DEVICE(0x107b, 0x55f2)}, /* Gateway WGU-210 (Gemtek) */ 61 {USB_DEVICE(0x107b, 0x55f2)}, /* Gateway WGU-210 (Gemtek) */
60 {USB_DEVICE(0x124a, 0x4023)}, /* Shuttle PN15, Airvast WM168g, IOGear GWU513 */ 62 {USB_DEVICE(0x124a, 0x4023)}, /* Shuttle PN15, Airvast WM168g, IOGear GWU513 */
63 {USB_DEVICE(0x1435, 0x0210)}, /* Inventel UR054G */
64 {USB_DEVICE(0x15a9, 0x0002)}, /* Gemtek WUBI-100GW 802.11g */
61 {USB_DEVICE(0x1630, 0x0005)}, /* 2Wire 802.11g USB (v1) / Z-Com */ 65 {USB_DEVICE(0x1630, 0x0005)}, /* 2Wire 802.11g USB (v1) / Z-Com */
66 {USB_DEVICE(0x182d, 0x096b)}, /* Sitecom WL-107 */
62 {USB_DEVICE(0x1915, 0x2234)}, /* Linksys WUSB54G OEM */ 67 {USB_DEVICE(0x1915, 0x2234)}, /* Linksys WUSB54G OEM */
63 {USB_DEVICE(0x1915, 0x2235)}, /* Linksys WUSB54G Portable OEM */ 68 {USB_DEVICE(0x1915, 0x2235)}, /* Linksys WUSB54G Portable OEM */
64 {USB_DEVICE(0x2001, 0x3701)}, /* DLink DWL-G120 Spinnaker */ 69 {USB_DEVICE(0x2001, 0x3701)}, /* DLink DWL-G120 Spinnaker */
@@ -94,6 +99,7 @@ static struct usb_device_id p54u_table[] __devinitdata = {
94 {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */ 99 {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */
95 {USB_DEVICE(0x1668, 0x1050)}, /* Actiontec 802UIG-1 */ 100 {USB_DEVICE(0x1668, 0x1050)}, /* Actiontec 802UIG-1 */
96 {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */ 101 {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */
102 {USB_DEVICE(0x2001, 0x3705)}, /* D-Link DWL-G120 rev C1 */
97 {USB_DEVICE(0x413c, 0x5513)}, /* Dell WLA3310 USB Wireless Adapter */ 103 {USB_DEVICE(0x413c, 0x5513)}, /* Dell WLA3310 USB Wireless Adapter */
98 {USB_DEVICE(0x413c, 0x8102)}, /* Spinnaker DUT */ 104 {USB_DEVICE(0x413c, 0x8102)}, /* Spinnaker DUT */
99 {USB_DEVICE(0x413c, 0x8104)}, /* Cohiba Proto board */ 105 {USB_DEVICE(0x413c, 0x8104)}, /* Cohiba Proto board */
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c
index c1e2bbafb549..ff8aaa736650 100644
--- a/net/bluetooth/rfcomm/core.c
+++ b/net/bluetooth/rfcomm/core.c
@@ -311,6 +311,7 @@ static void rfcomm_dlc_clear_state(struct rfcomm_dlc *d)
311 d->state = BT_OPEN; 311 d->state = BT_OPEN;
312 d->flags = 0; 312 d->flags = 0;
313 d->mscex = 0; 313 d->mscex = 0;
314 d->sec_level = BT_SECURITY_LOW;
314 d->mtu = RFCOMM_DEFAULT_MTU; 315 d->mtu = RFCOMM_DEFAULT_MTU;
315 d->v24_sig = RFCOMM_V24_RTC | RFCOMM_V24_RTR | RFCOMM_V24_DV; 316 d->v24_sig = RFCOMM_V24_RTC | RFCOMM_V24_RTR | RFCOMM_V24_DV;
316 317
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c
index 410d104b1347..53c7077ffd4f 100644
--- a/net/mac80211/ibss.c
+++ b/net/mac80211/ibss.c
@@ -780,6 +780,9 @@ void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
780 780
781 mutex_lock(&sdata->u.ibss.mtx); 781 mutex_lock(&sdata->u.ibss.mtx);
782 782
783 if (!sdata->u.ibss.ssid_len)
784 goto mgmt_out; /* not ready to merge yet */
785
783 switch (fc & IEEE80211_FCTL_STYPE) { 786 switch (fc & IEEE80211_FCTL_STYPE) {
784 case IEEE80211_STYPE_PROBE_REQ: 787 case IEEE80211_STYPE_PROBE_REQ:
785 ieee80211_rx_mgmt_probe_req(sdata, mgmt, skb->len); 788 ieee80211_rx_mgmt_probe_req(sdata, mgmt, skb->len);
@@ -797,6 +800,7 @@ void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
797 break; 800 break;
798 } 801 }
799 802
803 mgmt_out:
800 mutex_unlock(&sdata->u.ibss.mtx); 804 mutex_unlock(&sdata->u.ibss.mtx);
801} 805}
802 806
diff --git a/net/mac80211/work.c b/net/mac80211/work.c
index de43753076d2..36305e0d06ef 100644
--- a/net/mac80211/work.c
+++ b/net/mac80211/work.c
@@ -1074,11 +1074,13 @@ void ieee80211_work_purge(struct ieee80211_sub_if_data *sdata)
1074{ 1074{
1075 struct ieee80211_local *local = sdata->local; 1075 struct ieee80211_local *local = sdata->local;
1076 struct ieee80211_work *wk; 1076 struct ieee80211_work *wk;
1077 bool cleanup = false;
1077 1078
1078 mutex_lock(&local->mtx); 1079 mutex_lock(&local->mtx);
1079 list_for_each_entry(wk, &local->work_list, list) { 1080 list_for_each_entry(wk, &local->work_list, list) {
1080 if (wk->sdata != sdata) 1081 if (wk->sdata != sdata)
1081 continue; 1082 continue;
1083 cleanup = true;
1082 wk->type = IEEE80211_WORK_ABORT; 1084 wk->type = IEEE80211_WORK_ABORT;
1083 wk->started = true; 1085 wk->started = true;
1084 wk->timeout = jiffies; 1086 wk->timeout = jiffies;
@@ -1086,7 +1088,8 @@ void ieee80211_work_purge(struct ieee80211_sub_if_data *sdata)
1086 mutex_unlock(&local->mtx); 1088 mutex_unlock(&local->mtx);
1087 1089
1088 /* run cleanups etc. */ 1090 /* run cleanups etc. */
1089 ieee80211_work_work(&local->work_work); 1091 if (cleanup)
1092 ieee80211_work_work(&local->work_work);
1090 1093
1091 mutex_lock(&local->mtx); 1094 mutex_lock(&local->mtx);
1092 list_for_each_entry(wk, &local->work_list, list) { 1095 list_for_each_entry(wk, &local->work_list, list) {