diff options
author | John W. Linville <linville@tuxdriver.com> | 2010-12-15 16:33:28 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-12-15 16:33:28 -0500 |
commit | 1fcfe76a760e78d7774a254608557c84071b0cfb (patch) | |
tree | 2659028625a15a6bcbef350d16ace21982f714d4 | |
parent | 0c8173385e549f95cd80c3fff5aab87b4f881d8d (diff) | |
parent | 56e6417b49132d4f56e9f2241d31942b90b46315 (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.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-1000.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-6000.c | 12 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-eeprom.c | 88 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-lib.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-eeprom.h | 25 | ||||
-rw-r--r-- | drivers/net/wireless/libertas/cfg.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/p54/p54usb.c | 6 | ||||
-rw-r--r-- | net/bluetooth/rfcomm/core.c | 1 | ||||
-rw-r--r-- | net/mac80211/ibss.c | 4 | ||||
-rw-r--r-- | net/mac80211/work.c | 5 |
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 | ||
316 | struct iwl_cfg iwl100_bg_cfg = { | 317 | struct 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 | ||
329 | MODULE_FIRMWARE(IWL1000_MODULE_FIRMWARE(IWL1000_UCODE_API_MAX)); | 331 | MODULE_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 | ||
569 | struct iwl_cfg iwl6005_2abg_cfg = { | 570 | struct 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 | ||
584 | struct iwl_cfg iwl6005_2bg_cfg = { | 586 | struct 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 | ||
599 | struct iwl_cfg iwl6030_2agn_cfg = { | 602 | struct 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 | ||
619 | struct iwl_cfg iwl6030_2abg_cfg = { | 623 | struct 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 | ||
638 | struct iwl_cfg iwl6030_2bgn_cfg = { | 643 | struct 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 | ||
658 | struct iwl_cfg iwl6030_2bg_cfg = { | 664 | struct 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 | ||
677 | struct iwl_cfg iwl1030_bgn_cfg = { | 684 | struct 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 | ||
697 | struct iwl_cfg iwl1030_bg_cfg = { | 705 | struct 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 | ||
798 | struct iwl_cfg iwl6050_2abg_cfg = { | 808 | struct 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 | ||
846 | struct iwl_cfg iwl130_bg_cfg = { | 857 | struct 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 | ||
864 | MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX)); | 876 | MODULE_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 | */ |
436 | void iwlcore_eeprom_enhanced_txpower(struct iwl_priv *priv) | 436 | static 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 | |||
498 | static void | ||
499 | iwlcore_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 | |||
536 | static 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 | |||
573 | void 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 | ||
132 | enum 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 | */ |
148 | struct iwl_eeprom_enhanced_txpwr { | 160 | struct 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 | ||
44 | static struct usb_device_id p54u_table[] __devinitdata = { | 44 | static 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) { |