diff options
| author | David S. Miller <davem@davemloft.net> | 2010-05-11 01:53:41 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2010-05-11 01:53:41 -0400 |
| commit | de02d72bb3cc5b3d4c873db4ca8291723dd48479 (patch) | |
| tree | c937017bdc271d23ef75c4e0214d45e59227b2d9 | |
| parent | f0ecde1466f21edf577b809735f4f35f354777a0 (diff) | |
| parent | 79733a865c7fd778ce45e3503962b3a875b0a153 (diff) | |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6
| -rw-r--r-- | drivers/net/wireless/ath/ar9170/usb.c | 11 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ar9170/usb.h | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-commands.h | 4 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-scan.c | 23 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 3 | ||||
| -rw-r--r-- | net/mac80211/mlme.c | 3 |
6 files changed, 37 insertions, 8 deletions
diff --git a/drivers/net/wireless/ath/ar9170/usb.c b/drivers/net/wireless/ath/ar9170/usb.c index 99a6da464bd3..e1c2fcaa8bed 100644 --- a/drivers/net/wireless/ath/ar9170/usb.c +++ b/drivers/net/wireless/ath/ar9170/usb.c | |||
| @@ -727,12 +727,16 @@ static void ar9170_usb_firmware_failed(struct ar9170_usb *aru) | |||
| 727 | { | 727 | { |
| 728 | struct device *parent = aru->udev->dev.parent; | 728 | struct device *parent = aru->udev->dev.parent; |
| 729 | 729 | ||
| 730 | complete(&aru->firmware_loading_complete); | ||
| 731 | |||
| 730 | /* unbind anything failed */ | 732 | /* unbind anything failed */ |
| 731 | if (parent) | 733 | if (parent) |
| 732 | down(&parent->sem); | 734 | down(&parent->sem); |
| 733 | device_release_driver(&aru->udev->dev); | 735 | device_release_driver(&aru->udev->dev); |
| 734 | if (parent) | 736 | if (parent) |
| 735 | up(&parent->sem); | 737 | up(&parent->sem); |
| 738 | |||
| 739 | usb_put_dev(aru->udev); | ||
| 736 | } | 740 | } |
| 737 | 741 | ||
| 738 | static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context) | 742 | static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context) |
| @@ -761,6 +765,8 @@ static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context) | |||
| 761 | if (err) | 765 | if (err) |
| 762 | goto err_unrx; | 766 | goto err_unrx; |
| 763 | 767 | ||
| 768 | complete(&aru->firmware_loading_complete); | ||
| 769 | usb_put_dev(aru->udev); | ||
| 764 | return; | 770 | return; |
| 765 | 771 | ||
| 766 | err_unrx: | 772 | err_unrx: |
| @@ -858,6 +864,7 @@ static int ar9170_usb_probe(struct usb_interface *intf, | |||
| 858 | init_usb_anchor(&aru->tx_pending); | 864 | init_usb_anchor(&aru->tx_pending); |
| 859 | init_usb_anchor(&aru->tx_submitted); | 865 | init_usb_anchor(&aru->tx_submitted); |
| 860 | init_completion(&aru->cmd_wait); | 866 | init_completion(&aru->cmd_wait); |
| 867 | init_completion(&aru->firmware_loading_complete); | ||
| 861 | spin_lock_init(&aru->tx_urb_lock); | 868 | spin_lock_init(&aru->tx_urb_lock); |
| 862 | 869 | ||
| 863 | aru->tx_pending_urbs = 0; | 870 | aru->tx_pending_urbs = 0; |
| @@ -877,6 +884,7 @@ static int ar9170_usb_probe(struct usb_interface *intf, | |||
| 877 | if (err) | 884 | if (err) |
| 878 | goto err_freehw; | 885 | goto err_freehw; |
| 879 | 886 | ||
| 887 | usb_get_dev(aru->udev); | ||
| 880 | return request_firmware_nowait(THIS_MODULE, 1, "ar9170.fw", | 888 | return request_firmware_nowait(THIS_MODULE, 1, "ar9170.fw", |
| 881 | &aru->udev->dev, GFP_KERNEL, aru, | 889 | &aru->udev->dev, GFP_KERNEL, aru, |
| 882 | ar9170_usb_firmware_step2); | 890 | ar9170_usb_firmware_step2); |
| @@ -896,6 +904,9 @@ static void ar9170_usb_disconnect(struct usb_interface *intf) | |||
| 896 | return; | 904 | return; |
| 897 | 905 | ||
| 898 | aru->common.state = AR9170_IDLE; | 906 | aru->common.state = AR9170_IDLE; |
| 907 | |||
| 908 | wait_for_completion(&aru->firmware_loading_complete); | ||
| 909 | |||
| 899 | ar9170_unregister(&aru->common); | 910 | ar9170_unregister(&aru->common); |
| 900 | ar9170_usb_cancel_urbs(aru); | 911 | ar9170_usb_cancel_urbs(aru); |
| 901 | 912 | ||
diff --git a/drivers/net/wireless/ath/ar9170/usb.h b/drivers/net/wireless/ath/ar9170/usb.h index a2ce3b169ceb..919b06046eb3 100644 --- a/drivers/net/wireless/ath/ar9170/usb.h +++ b/drivers/net/wireless/ath/ar9170/usb.h | |||
| @@ -71,6 +71,7 @@ struct ar9170_usb { | |||
| 71 | unsigned int tx_pending_urbs; | 71 | unsigned int tx_pending_urbs; |
| 72 | 72 | ||
| 73 | struct completion cmd_wait; | 73 | struct completion cmd_wait; |
| 74 | struct completion firmware_loading_complete; | ||
| 74 | int readlen; | 75 | int readlen; |
| 75 | u8 *readbuf; | 76 | u8 *readbuf; |
| 76 | 77 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h index 6383d9f8c9b3..f4e59ae07f8e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-commands.h +++ b/drivers/net/wireless/iwlwifi/iwl-commands.h | |||
| @@ -2621,7 +2621,9 @@ struct iwl_ssid_ie { | |||
| 2621 | #define PROBE_OPTION_MAX_3945 4 | 2621 | #define PROBE_OPTION_MAX_3945 4 |
| 2622 | #define PROBE_OPTION_MAX 20 | 2622 | #define PROBE_OPTION_MAX 20 |
| 2623 | #define TX_CMD_LIFE_TIME_INFINITE cpu_to_le32(0xFFFFFFFF) | 2623 | #define TX_CMD_LIFE_TIME_INFINITE cpu_to_le32(0xFFFFFFFF) |
| 2624 | #define IWL_GOOD_CRC_TH cpu_to_le16(1) | 2624 | #define IWL_GOOD_CRC_TH_DISABLED 0 |
| 2625 | #define IWL_GOOD_CRC_TH_DEFAULT cpu_to_le16(1) | ||
| 2626 | #define IWL_GOOD_CRC_TH_NEVER cpu_to_le16(0xffff) | ||
| 2625 | #define IWL_MAX_SCAN_SIZE 1024 | 2627 | #define IWL_MAX_SCAN_SIZE 1024 |
| 2626 | #define IWL_MAX_CMD_SIZE 4096 | 2628 | #define IWL_MAX_CMD_SIZE 4096 |
| 2627 | #define IWL_MAX_PROBE_REQUEST 200 | 2629 | #define IWL_MAX_PROBE_REQUEST 200 |
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c index 12e455a4b90e..741e65ec8301 100644 --- a/drivers/net/wireless/iwlwifi/iwl-scan.c +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c | |||
| @@ -813,16 +813,29 @@ static void iwl_bg_request_scan(struct work_struct *data) | |||
| 813 | rate = IWL_RATE_1M_PLCP; | 813 | rate = IWL_RATE_1M_PLCP; |
| 814 | rate_flags = RATE_MCS_CCK_MSK; | 814 | rate_flags = RATE_MCS_CCK_MSK; |
| 815 | } | 815 | } |
| 816 | scan->good_CRC_th = 0; | 816 | scan->good_CRC_th = IWL_GOOD_CRC_TH_DISABLED; |
| 817 | } else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) { | 817 | } else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) { |
| 818 | band = IEEE80211_BAND_5GHZ; | 818 | band = IEEE80211_BAND_5GHZ; |
| 819 | rate = IWL_RATE_6M_PLCP; | 819 | rate = IWL_RATE_6M_PLCP; |
| 820 | /* | 820 | /* |
| 821 | * If active scaning is requested but a certain channel | 821 | * If active scanning is requested but a certain channel is |
| 822 | * is marked passive, we can do active scanning if we | 822 | * marked passive, we can do active scanning if we detect |
| 823 | * detect transmissions. | 823 | * transmissions. |
| 824 | * | ||
| 825 | * There is an issue with some firmware versions that triggers | ||
| 826 | * a sysassert on a "good CRC threshold" of zero (== disabled), | ||
| 827 | * on a radar channel even though this means that we should NOT | ||
| 828 | * send probes. | ||
| 829 | * | ||
| 830 | * The "good CRC threshold" is the number of frames that we | ||
| 831 | * need to receive during our dwell time on a channel before | ||
| 832 | * sending out probes -- setting this to a huge value will | ||
| 833 | * mean we never reach it, but at the same time work around | ||
| 834 | * the aforementioned issue. Thus use IWL_GOOD_CRC_TH_NEVER | ||
| 835 | * here instead of IWL_GOOD_CRC_TH_DISABLED. | ||
| 824 | */ | 836 | */ |
| 825 | scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH : 0; | 837 | scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH_DEFAULT : |
| 838 | IWL_GOOD_CRC_TH_NEVER; | ||
| 826 | 839 | ||
| 827 | /* Force use of chains B and C (0x6) for scan Rx for 4965 | 840 | /* Force use of chains B and C (0x6) for scan Rx for 4965 |
| 828 | * Avoid A (0x1) because of its off-channel reception on A-band. | 841 | * Avoid A (0x1) because of its off-channel reception on A-band. |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index b55e4f39a9e1..b74a56c48d26 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
| @@ -2967,7 +2967,8 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
| 2967 | * is marked passive, we can do active scanning if we | 2967 | * is marked passive, we can do active scanning if we |
| 2968 | * detect transmissions. | 2968 | * detect transmissions. |
| 2969 | */ | 2969 | */ |
| 2970 | scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH : 0; | 2970 | scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH_DEFAULT : |
| 2971 | IWL_GOOD_CRC_TH_DISABLED; | ||
| 2971 | band = IEEE80211_BAND_5GHZ; | 2972 | band = IEEE80211_BAND_5GHZ; |
| 2972 | } else { | 2973 | } else { |
| 2973 | IWL_WARN(priv, "Invalid scan band count\n"); | 2974 | IWL_WARN(priv, "Invalid scan band count\n"); |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 4aefa6dc3091..875c8dec940a 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
| @@ -2030,7 +2030,8 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, | |||
| 2030 | continue; | 2030 | continue; |
| 2031 | 2031 | ||
| 2032 | if (wk->type != IEEE80211_WORK_DIRECT_PROBE && | 2032 | if (wk->type != IEEE80211_WORK_DIRECT_PROBE && |
| 2033 | wk->type != IEEE80211_WORK_AUTH) | 2033 | wk->type != IEEE80211_WORK_AUTH && |
| 2034 | wk->type != IEEE80211_WORK_ASSOC) | ||
| 2034 | continue; | 2035 | continue; |
| 2035 | 2036 | ||
| 2036 | if (memcmp(req->bss->bssid, wk->filter_ta, ETH_ALEN)) | 2037 | if (memcmp(req->bss->bssid, wk->filter_ta, ETH_ALEN)) |
