Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6

This commit is contained in:
David S. Miller 2010-05-10 22:53:41 -07:00
commit de02d72bb3
6 changed files with 37 additions and 8 deletions

View File

@ -727,12 +727,16 @@ static void ar9170_usb_firmware_failed(struct ar9170_usb *aru)
{ {
struct device *parent = aru->udev->dev.parent; struct device *parent = aru->udev->dev.parent;
complete(&aru->firmware_loading_complete);
/* unbind anything failed */ /* unbind anything failed */
if (parent) if (parent)
down(&parent->sem); down(&parent->sem);
device_release_driver(&aru->udev->dev); device_release_driver(&aru->udev->dev);
if (parent) if (parent)
up(&parent->sem); up(&parent->sem);
usb_put_dev(aru->udev);
} }
static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context) 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)
if (err) if (err)
goto err_unrx; goto err_unrx;
complete(&aru->firmware_loading_complete);
usb_put_dev(aru->udev);
return; return;
err_unrx: err_unrx:
@ -858,6 +864,7 @@ static int ar9170_usb_probe(struct usb_interface *intf,
init_usb_anchor(&aru->tx_pending); init_usb_anchor(&aru->tx_pending);
init_usb_anchor(&aru->tx_submitted); init_usb_anchor(&aru->tx_submitted);
init_completion(&aru->cmd_wait); init_completion(&aru->cmd_wait);
init_completion(&aru->firmware_loading_complete);
spin_lock_init(&aru->tx_urb_lock); spin_lock_init(&aru->tx_urb_lock);
aru->tx_pending_urbs = 0; aru->tx_pending_urbs = 0;
@ -877,6 +884,7 @@ static int ar9170_usb_probe(struct usb_interface *intf,
if (err) if (err)
goto err_freehw; goto err_freehw;
usb_get_dev(aru->udev);
return request_firmware_nowait(THIS_MODULE, 1, "ar9170.fw", return request_firmware_nowait(THIS_MODULE, 1, "ar9170.fw",
&aru->udev->dev, GFP_KERNEL, aru, &aru->udev->dev, GFP_KERNEL, aru,
ar9170_usb_firmware_step2); ar9170_usb_firmware_step2);
@ -896,6 +904,9 @@ static void ar9170_usb_disconnect(struct usb_interface *intf)
return; return;
aru->common.state = AR9170_IDLE; aru->common.state = AR9170_IDLE;
wait_for_completion(&aru->firmware_loading_complete);
ar9170_unregister(&aru->common); ar9170_unregister(&aru->common);
ar9170_usb_cancel_urbs(aru); ar9170_usb_cancel_urbs(aru);

View File

@ -71,6 +71,7 @@ struct ar9170_usb {
unsigned int tx_pending_urbs; unsigned int tx_pending_urbs;
struct completion cmd_wait; struct completion cmd_wait;
struct completion firmware_loading_complete;
int readlen; int readlen;
u8 *readbuf; u8 *readbuf;

View File

@ -2621,7 +2621,9 @@ struct iwl_ssid_ie {
#define PROBE_OPTION_MAX_3945 4 #define PROBE_OPTION_MAX_3945 4
#define PROBE_OPTION_MAX 20 #define PROBE_OPTION_MAX 20
#define TX_CMD_LIFE_TIME_INFINITE cpu_to_le32(0xFFFFFFFF) #define TX_CMD_LIFE_TIME_INFINITE cpu_to_le32(0xFFFFFFFF)
#define IWL_GOOD_CRC_TH cpu_to_le16(1) #define IWL_GOOD_CRC_TH_DISABLED 0
#define IWL_GOOD_CRC_TH_DEFAULT cpu_to_le16(1)
#define IWL_GOOD_CRC_TH_NEVER cpu_to_le16(0xffff)
#define IWL_MAX_SCAN_SIZE 1024 #define IWL_MAX_SCAN_SIZE 1024
#define IWL_MAX_CMD_SIZE 4096 #define IWL_MAX_CMD_SIZE 4096
#define IWL_MAX_PROBE_REQUEST 200 #define IWL_MAX_PROBE_REQUEST 200

View File

@ -813,16 +813,29 @@ static void iwl_bg_request_scan(struct work_struct *data)
rate = IWL_RATE_1M_PLCP; rate = IWL_RATE_1M_PLCP;
rate_flags = RATE_MCS_CCK_MSK; rate_flags = RATE_MCS_CCK_MSK;
} }
scan->good_CRC_th = 0; scan->good_CRC_th = IWL_GOOD_CRC_TH_DISABLED;
} else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) { } else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) {
band = IEEE80211_BAND_5GHZ; band = IEEE80211_BAND_5GHZ;
rate = IWL_RATE_6M_PLCP; rate = IWL_RATE_6M_PLCP;
/* /*
* If active scaning is requested but a certain channel * If active scanning is requested but a certain channel is
* is marked passive, we can do active scanning if we * marked passive, we can do active scanning if we detect
* detect transmissions. * transmissions.
*
* There is an issue with some firmware versions that triggers
* a sysassert on a "good CRC threshold" of zero (== disabled),
* on a radar channel even though this means that we should NOT
* send probes.
*
* The "good CRC threshold" is the number of frames that we
* need to receive during our dwell time on a channel before
* sending out probes -- setting this to a huge value will
* mean we never reach it, but at the same time work around
* the aforementioned issue. Thus use IWL_GOOD_CRC_TH_NEVER
* here instead of IWL_GOOD_CRC_TH_DISABLED.
*/ */
scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH : 0; scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH_DEFAULT :
IWL_GOOD_CRC_TH_NEVER;
/* Force use of chains B and C (0x6) for scan Rx for 4965 /* Force use of chains B and C (0x6) for scan Rx for 4965
* Avoid A (0x1) because of its off-channel reception on A-band. * Avoid A (0x1) because of its off-channel reception on A-band.

View File

@ -2967,7 +2967,8 @@ static void iwl3945_bg_request_scan(struct work_struct *data)
* is marked passive, we can do active scanning if we * is marked passive, we can do active scanning if we
* detect transmissions. * detect transmissions.
*/ */
scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH : 0; scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH_DEFAULT :
IWL_GOOD_CRC_TH_DISABLED;
band = IEEE80211_BAND_5GHZ; band = IEEE80211_BAND_5GHZ;
} else { } else {
IWL_WARN(priv, "Invalid scan band count\n"); IWL_WARN(priv, "Invalid scan band count\n");

View File

@ -2030,7 +2030,8 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
continue; continue;
if (wk->type != IEEE80211_WORK_DIRECT_PROBE && if (wk->type != IEEE80211_WORK_DIRECT_PROBE &&
wk->type != IEEE80211_WORK_AUTH) wk->type != IEEE80211_WORK_AUTH &&
wk->type != IEEE80211_WORK_ASSOC)
continue; continue;
if (memcmp(req->bss->bssid, wk->filter_ta, ETH_ALEN)) if (memcmp(req->bss->bssid, wk->filter_ta, ETH_ALEN))