diff options
-rw-r--r-- | drivers/net/wireless/ipw2200.c | 51 | ||||
-rw-r--r-- | drivers/net/wireless/ipw2200.h | 1 |
2 files changed, 39 insertions, 13 deletions
diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c index 15258301b643..ea14b55e2633 100644 --- a/drivers/net/wireless/ipw2200.c +++ b/drivers/net/wireless/ipw2200.c | |||
@@ -6169,7 +6169,7 @@ static void ipw_add_scan_channels(struct ipw_priv *priv, | |||
6169 | } | 6169 | } |
6170 | } | 6170 | } |
6171 | 6171 | ||
6172 | static int ipw_request_scan(struct ipw_priv *priv) | 6172 | static int ipw_request_scan_helper(struct ipw_priv *priv, int type) |
6173 | { | 6173 | { |
6174 | struct ipw_scan_request_ext scan; | 6174 | struct ipw_scan_request_ext scan; |
6175 | int err = 0, scan_type; | 6175 | int err = 0, scan_type; |
@@ -6200,19 +6200,29 @@ static int ipw_request_scan(struct ipw_priv *priv) | |||
6200 | } | 6200 | } |
6201 | 6201 | ||
6202 | memset(&scan, 0, sizeof(scan)); | 6202 | memset(&scan, 0, sizeof(scan)); |
6203 | scan.full_scan_index = cpu_to_le32(ieee80211_get_scans(priv->ieee)); | ||
6203 | 6204 | ||
6204 | if (priv->config & CFG_SPEED_SCAN) | 6205 | if (type == IW_SCAN_TYPE_PASSIVE) { |
6206 | IPW_DEBUG_WX("use passive scanning\n"); | ||
6207 | scan_type = IPW_SCAN_PASSIVE_FULL_DWELL_SCAN; | ||
6208 | scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = | ||
6209 | cpu_to_le16(120); | ||
6210 | ipw_add_scan_channels(priv, &scan, scan_type); | ||
6211 | goto send_request; | ||
6212 | } | ||
6213 | |||
6214 | /* Use active scan by default. */ | ||
6215 | if (priv->config & CFG_SPEED_SCAN) | ||
6205 | scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] = | 6216 | scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] = |
6206 | cpu_to_le16(30); | 6217 | cpu_to_le16(30); |
6207 | else | 6218 | else |
6208 | scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] = | 6219 | scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] = |
6209 | cpu_to_le16(20); | 6220 | cpu_to_le16(20); |
6210 | 6221 | ||
6211 | scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN] = | 6222 | scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN] = |
6212 | cpu_to_le16(20); | 6223 | cpu_to_le16(20); |
6213 | scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = cpu_to_le16(120); | ||
6214 | 6224 | ||
6215 | scan.full_scan_index = cpu_to_le32(ieee80211_get_scans(priv->ieee)); | 6225 | scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = cpu_to_le16(120); |
6216 | 6226 | ||
6217 | #ifdef CONFIG_IPW2200_MONITOR | 6227 | #ifdef CONFIG_IPW2200_MONITOR |
6218 | if (priv->ieee->iw_mode == IW_MODE_MONITOR) { | 6228 | if (priv->ieee->iw_mode == IW_MODE_MONITOR) { |
@@ -6249,7 +6259,7 @@ static int ipw_request_scan(struct ipw_priv *priv) | |||
6249 | * | 6259 | * |
6250 | * TODO: Move SPEED SCAN support to all modes and bands */ | 6260 | * TODO: Move SPEED SCAN support to all modes and bands */ |
6251 | scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = | 6261 | scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = |
6252 | cpu_to_le16(2000); | 6262 | cpu_to_le16(2000); |
6253 | } else { | 6263 | } else { |
6254 | #endif /* CONFIG_IPW2200_MONITOR */ | 6264 | #endif /* CONFIG_IPW2200_MONITOR */ |
6255 | /* If we are roaming, then make this a directed scan for the | 6265 | /* If we are roaming, then make this a directed scan for the |
@@ -6275,6 +6285,7 @@ static int ipw_request_scan(struct ipw_priv *priv) | |||
6275 | } | 6285 | } |
6276 | #endif | 6286 | #endif |
6277 | 6287 | ||
6288 | send_request: | ||
6278 | err = ipw_send_scan_request_ext(priv, &scan); | 6289 | err = ipw_send_scan_request_ext(priv, &scan); |
6279 | if (err) { | 6290 | if (err) { |
6280 | IPW_DEBUG_HC("Sending scan command failed: %08X\n", err); | 6291 | IPW_DEBUG_HC("Sending scan command failed: %08X\n", err); |
@@ -6285,11 +6296,19 @@ static int ipw_request_scan(struct ipw_priv *priv) | |||
6285 | priv->status &= ~STATUS_SCAN_PENDING; | 6296 | priv->status &= ~STATUS_SCAN_PENDING; |
6286 | queue_delayed_work(priv->workqueue, &priv->scan_check, | 6297 | queue_delayed_work(priv->workqueue, &priv->scan_check, |
6287 | IPW_SCAN_CHECK_WATCHDOG); | 6298 | IPW_SCAN_CHECK_WATCHDOG); |
6288 | done: | 6299 | done: |
6289 | mutex_unlock(&priv->mutex); | 6300 | mutex_unlock(&priv->mutex); |
6290 | return err; | 6301 | return err; |
6291 | } | 6302 | } |
6292 | 6303 | ||
6304 | static int ipw_request_passive_scan(struct ipw_priv *priv) { | ||
6305 | return ipw_request_scan_helper(priv, IW_SCAN_TYPE_PASSIVE); | ||
6306 | } | ||
6307 | |||
6308 | static int ipw_request_scan(struct ipw_priv *priv) { | ||
6309 | return ipw_request_scan_helper(priv, IW_SCAN_TYPE_ACTIVE); | ||
6310 | } | ||
6311 | |||
6293 | static void ipw_bg_abort_scan(void *data) | 6312 | static void ipw_bg_abort_scan(void *data) |
6294 | { | 6313 | { |
6295 | struct ipw_priv *priv = data; | 6314 | struct ipw_priv *priv = data; |
@@ -9378,15 +9397,19 @@ static int ipw_wx_set_scan(struct net_device *dev, | |||
9378 | union iwreq_data *wrqu, char *extra) | 9397 | union iwreq_data *wrqu, char *extra) |
9379 | { | 9398 | { |
9380 | struct ipw_priv *priv = ieee80211_priv(dev); | 9399 | struct ipw_priv *priv = ieee80211_priv(dev); |
9381 | struct iw_scan_req *req = NULL; | 9400 | struct iw_scan_req *req = (struct iw_scan_req *)extra; |
9382 | if (wrqu->data.length | 9401 | |
9383 | && wrqu->data.length == sizeof(struct iw_scan_req)) { | 9402 | if (wrqu->data.length == sizeof(struct iw_scan_req)) { |
9384 | req = (struct iw_scan_req *)extra; | ||
9385 | if (wrqu->data.flags & IW_SCAN_THIS_ESSID) { | 9403 | if (wrqu->data.flags & IW_SCAN_THIS_ESSID) { |
9386 | ipw_request_direct_scan(priv, req->essid, | 9404 | ipw_request_direct_scan(priv, req->essid, |
9387 | req->essid_len); | 9405 | req->essid_len); |
9388 | return 0; | 9406 | return 0; |
9389 | } | 9407 | } |
9408 | if (req->scan_type == IW_SCAN_TYPE_PASSIVE) { | ||
9409 | queue_work(priv->workqueue, | ||
9410 | &priv->request_passive_scan); | ||
9411 | return 0; | ||
9412 | } | ||
9390 | } | 9413 | } |
9391 | 9414 | ||
9392 | IPW_DEBUG_WX("Start scan\n"); | 9415 | IPW_DEBUG_WX("Start scan\n"); |
@@ -10618,6 +10641,8 @@ static int ipw_setup_deferred_work(struct ipw_priv *priv) | |||
10618 | INIT_WORK(&priv->down, (void (*)(void *))ipw_bg_down, priv); | 10641 | INIT_WORK(&priv->down, (void (*)(void *))ipw_bg_down, priv); |
10619 | INIT_WORK(&priv->request_scan, | 10642 | INIT_WORK(&priv->request_scan, |
10620 | (void (*)(void *))ipw_request_scan, priv); | 10643 | (void (*)(void *))ipw_request_scan, priv); |
10644 | INIT_WORK(&priv->request_passive_scan, | ||
10645 | (void (*)(void *))ipw_request_passive_scan, priv); | ||
10621 | INIT_WORK(&priv->gather_stats, | 10646 | INIT_WORK(&priv->gather_stats, |
10622 | (void (*)(void *))ipw_bg_gather_stats, priv); | 10647 | (void (*)(void *))ipw_bg_gather_stats, priv); |
10623 | INIT_WORK(&priv->abort_scan, (void (*)(void *))ipw_bg_abort_scan, priv); | 10648 | INIT_WORK(&priv->abort_scan, (void (*)(void *))ipw_bg_abort_scan, priv); |
diff --git a/drivers/net/wireless/ipw2200.h b/drivers/net/wireless/ipw2200.h index a1df67f3ede8..dad5eedefbf1 100644 --- a/drivers/net/wireless/ipw2200.h +++ b/drivers/net/wireless/ipw2200.h | |||
@@ -1296,6 +1296,7 @@ struct ipw_priv { | |||
1296 | struct work_struct system_config; | 1296 | struct work_struct system_config; |
1297 | struct work_struct rx_replenish; | 1297 | struct work_struct rx_replenish; |
1298 | struct work_struct request_scan; | 1298 | struct work_struct request_scan; |
1299 | struct work_struct request_passive_scan; | ||
1299 | struct work_struct adapter_restart; | 1300 | struct work_struct adapter_restart; |
1300 | struct work_struct rf_kill; | 1301 | struct work_struct rf_kill; |
1301 | struct work_struct up; | 1302 | struct work_struct up; |