scan.c 29.7 KB
Newer Older
1 2 3 4
/******************************************************************************
 *
 * GPL LICENSE SUMMARY
 *
J
Johannes Berg 已提交
5
 * Copyright(c) 2008 - 2013 Intel Corporation. All rights reserved.
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
 * USA
 *
 * The full GNU General Public License is included in this distribution
22
 * in the file called COPYING.
23 24
 *
 * Contact Information:
25
 *  Intel Linux Wireless <ilw@linux.intel.com>
26 27
 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
 *****************************************************************************/
28
#include <linux/slab.h>
29
#include <linux/types.h>
30
#include <linux/etherdevice.h>
31
#include <net/mac80211.h>
32

33 34
#include "dev.h"
#include "agn.h"
35 36 37 38

/* For active scan, listen ACTIVE_DWELL_TIME (msec) on each channel after
 * sending probe req.  This should be set long enough to hear probe responses
 * from more than one AP.  */
T
Tomas Winkler 已提交
39 40 41 42 43
#define IWL_ACTIVE_DWELL_TIME_24    (30)       /* all times in msec */
#define IWL_ACTIVE_DWELL_TIME_52    (20)

#define IWL_ACTIVE_DWELL_FACTOR_24GHZ (3)
#define IWL_ACTIVE_DWELL_FACTOR_52GHZ (2)
44 45 46 47 48 49 50 51

/* For passive scan, listen PASSIVE_DWELL_TIME (msec) on each channel.
 * Must be set longer than active dwell time.
 * For the most reliable scan, set > AP beacon interval (typically 100msec). */
#define IWL_PASSIVE_DWELL_TIME_24   (20)       /* all times in msec */
#define IWL_PASSIVE_DWELL_TIME_52   (10)
#define IWL_PASSIVE_DWELL_BASE      (100)
#define IWL_CHANNEL_TUNE_TIME       5
52
#define MAX_SCAN_CHANNEL	    50
53

54 55 56
/* For reset radio, need minimal dwell time only */
#define IWL_RADIO_RESET_DWELL_TIME	5

57 58 59 60 61
static int iwl_send_scan_abort(struct iwl_priv *priv)
{
	int ret;
	struct iwl_host_cmd cmd = {
		.id = REPLY_SCAN_ABORT_CMD,
62
		.flags = CMD_SYNC | CMD_WANT_SKB,
63
	};
64
	__le32 *status;
T
Tomas Winkler 已提交
65

66 67 68
	/* Exit instantly with error when device is not ready
	 * to receive scan abort command or it does not perform
	 * hardware scan currently */
D
Don Fry 已提交
69 70
	if (!test_bit(STATUS_READY, &priv->status) ||
	    !test_bit(STATUS_SCAN_HW, &priv->status) ||
D
Don Fry 已提交
71
	    test_bit(STATUS_FW_ERROR, &priv->status))
72
		return -EIO;
T
Tomas Winkler 已提交
73

74
	ret = iwl_dvm_send_cmd(priv, &cmd);
75 76 77
	if (ret)
		return ret;

78 79
	status = (void *)cmd.resp_pkt->data;
	if (*status != CAN_ABORT_STATUS) {
80 81 82 83 84 85
		/* The scan abort will return 1 for success or
		 * 2 for "failure".  A failure condition can be
		 * due to simply not being in an active scan which
		 * can occur if we send the scan abort before we
		 * the microcode has notified us that a scan is
		 * completed. */
86 87
		IWL_DEBUG_SCAN(priv, "SCAN_ABORT ret %d.\n",
			       le32_to_cpu(*status));
88
		ret = -EIO;
89 90
	}

91
	iwl_free_resp(&cmd);
92 93
	return ret;
}
94

95 96 97 98 99 100 101 102
static void iwl_complete_scan(struct iwl_priv *priv, bool aborted)
{
	/* check if scan was requested from mac80211 */
	if (priv->scan_request) {
		IWL_DEBUG_SCAN(priv, "Complete scan in mac80211\n");
		ieee80211_scan_completed(priv->hw, aborted);
	}

J
Johannes Berg 已提交
103
	priv->scan_type = IWL_SCAN_NORMAL;
104 105 106 107
	priv->scan_vif = NULL;
	priv->scan_request = NULL;
}

108 109 110 111
static void iwl_process_scan_complete(struct iwl_priv *priv)
{
	bool aborted;

112
	lockdep_assert_held(&priv->mutex);
113

D
Don Fry 已提交
114
	if (!test_and_clear_bit(STATUS_SCAN_COMPLETE, &priv->status))
115 116
		return;

117 118 119 120
	IWL_DEBUG_SCAN(priv, "Completed scan.\n");

	cancel_delayed_work(&priv->scan_check);

D
Don Fry 已提交
121
	aborted = test_and_clear_bit(STATUS_SCAN_ABORTING, &priv->status);
122 123 124
	if (aborted)
		IWL_DEBUG_SCAN(priv, "Aborted scan completed.\n");

D
Don Fry 已提交
125
	if (!test_and_clear_bit(STATUS_SCANNING, &priv->status)) {
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
		IWL_DEBUG_SCAN(priv, "Scan already completed.\n");
		goto out_settings;
	}

	if (priv->scan_type != IWL_SCAN_NORMAL && !aborted) {
		int err;

		/* Check if mac80211 requested scan during our internal scan */
		if (priv->scan_request == NULL)
			goto out_complete;

		/* If so request a new scan */
		err = iwl_scan_initiate(priv, priv->scan_vif, IWL_SCAN_NORMAL,
					priv->scan_request->channels[0]->band);
		if (err) {
			IWL_DEBUG_SCAN(priv,
				"failed to initiate pending scan: %d\n", err);
			aborted = true;
			goto out_complete;
		}

		return;
	}

out_complete:
	iwl_complete_scan(priv, aborted);

out_settings:
	/* Can we still talk to firmware ? */
D
Don Fry 已提交
155
	if (!iwl_is_ready_rf(priv))
156 157 158 159 160
		return;

	iwlagn_post_scan(priv);
}

161
void iwl_force_scan_end(struct iwl_priv *priv)
162
{
163
	lockdep_assert_held(&priv->mutex);
164

D
Don Fry 已提交
165
	if (!test_bit(STATUS_SCANNING, &priv->status)) {
166 167 168 169
		IWL_DEBUG_SCAN(priv, "Forcing scan end while not scanning\n");
		return;
	}

170
	IWL_DEBUG_SCAN(priv, "Forcing scan end\n");
D
Don Fry 已提交
171 172 173 174
	clear_bit(STATUS_SCANNING, &priv->status);
	clear_bit(STATUS_SCAN_HW, &priv->status);
	clear_bit(STATUS_SCAN_ABORTING, &priv->status);
	clear_bit(STATUS_SCAN_COMPLETE, &priv->status);
175 176 177
	iwl_complete_scan(priv, true);
}

178 179 180
static void iwl_do_scan_abort(struct iwl_priv *priv)
{
	int ret;
181

182
	lockdep_assert_held(&priv->mutex);
183

D
Don Fry 已提交
184
	if (!test_bit(STATUS_SCANNING, &priv->status)) {
185 186
		IWL_DEBUG_SCAN(priv, "Not performing scan to abort\n");
		return;
187 188
	}

D
Don Fry 已提交
189
	if (test_and_set_bit(STATUS_SCAN_ABORTING, &priv->status)) {
190 191 192 193 194 195 196
		IWL_DEBUG_SCAN(priv, "Scan abort in progress\n");
		return;
	}

	ret = iwl_send_scan_abort(priv);
	if (ret) {
		IWL_DEBUG_SCAN(priv, "Send scan abort failed %d\n", ret);
197
		iwl_force_scan_end(priv);
198
	} else
L
Lucas De Marchi 已提交
199
		IWL_DEBUG_SCAN(priv, "Successfully send scan abort\n");
200 201 202 203 204 205 206 207
}

/**
 * iwl_scan_cancel - Cancel any currently executing HW scan
 */
int iwl_scan_cancel(struct iwl_priv *priv)
{
	IWL_DEBUG_SCAN(priv, "Queuing abort scan\n");
J
Johannes Berg 已提交
208
	queue_work(priv->workqueue, &priv->abort_scan);
209 210
	return 0;
}
211

212 213 214 215 216
/**
 * iwl_scan_cancel_timeout - Cancel any currently executing HW scan
 * @ms: amount of time to wait (in milliseconds) for scan to abort
 *
 */
217
void iwl_scan_cancel_timeout(struct iwl_priv *priv, unsigned long ms)
218
{
219 220
	unsigned long timeout = jiffies + msecs_to_jiffies(ms);

221
	lockdep_assert_held(&priv->mutex);
222

223
	IWL_DEBUG_SCAN(priv, "Scan cancel timeout\n");
224

225 226 227
	iwl_do_scan_abort(priv);

	while (time_before_eq(jiffies, timeout)) {
D
Don Fry 已提交
228
		if (!test_bit(STATUS_SCAN_HW, &priv->status))
229
			goto finished;
230
		msleep(20);
231
	}
232 233 234 235 236 237 238 239 240 241 242 243 244 245 246

	return;

 finished:
	/*
	 * Now STATUS_SCAN_HW is clear. This means that the
	 * device finished, but the background work is going
	 * to execute at best as soon as we release the mutex.
	 * Since we need to be able to issue a new scan right
	 * after this function returns, run the complete here.
	 * The STATUS_SCAN_COMPLETE bit will then be cleared
	 * and prevent the background work from "completing"
	 * a possible new scan.
	 */
	iwl_process_scan_complete(priv);
247 248 249
}

/* Service response to REPLY_SCAN_CMD (0x80) */
250
static int iwl_rx_reply_scan(struct iwl_priv *priv,
251
			      struct iwl_rx_cmd_buffer *rxb,
252
			      struct iwl_device_cmd *cmd)
253 254
{
#ifdef CONFIG_IWLWIFI_DEBUG
Z
Zhu Yi 已提交
255
	struct iwl_rx_packet *pkt = rxb_addr(rxb);
256
	struct iwl_scanreq_notification *notif = (void *)pkt->data;
257

258
	IWL_DEBUG_SCAN(priv, "Scan request status = 0x%x\n", notif->status);
259
#endif
260
	return 0;
261 262 263
}

/* Service SCAN_START_NOTIFICATION (0x82) */
264
static int iwl_rx_scan_start_notif(struct iwl_priv *priv,
265
				    struct iwl_rx_cmd_buffer *rxb,
266
				    struct iwl_device_cmd *cmd)
267
{
Z
Zhu Yi 已提交
268
	struct iwl_rx_packet *pkt = rxb_addr(rxb);
269 270
	struct iwl_scanstart_notification *notif = (void *)pkt->data;

271
	priv->scan_start_tsf = le32_to_cpu(notif->tsf_low);
272
	IWL_DEBUG_SCAN(priv, "Scan start: "
273 274 275 276
		       "%d [802.11%s] "
		       "(TSF: 0x%08X:%08X) - %d (beacon timer %u)\n",
		       notif->channel,
		       notif->band ? "bg" : "a",
T
Tomas Winkler 已提交
277 278 279
		       le32_to_cpu(notif->tsf_high),
		       le32_to_cpu(notif->tsf_low),
		       notif->status, notif->beacon_timer);
280

281
	return 0;
282 283 284
}

/* Service SCAN_RESULTS_NOTIFICATION (0x83) */
285
static int iwl_rx_scan_results_notif(struct iwl_priv *priv,
286
				      struct iwl_rx_cmd_buffer *rxb,
287
				      struct iwl_device_cmd *cmd)
288 289
{
#ifdef CONFIG_IWLWIFI_DEBUG
Z
Zhu Yi 已提交
290
	struct iwl_rx_packet *pkt = rxb_addr(rxb);
291
	struct iwl_scanresults_notification *notif = (void *)pkt->data;
292

293
	IWL_DEBUG_SCAN(priv, "Scan ch.res: "
294
		       "%d [802.11%s] "
295
		       "probe status: %u:%u "
296
		       "(TSF: 0x%08X:%08X) - %d "
297
		       "elapsed=%lu usec\n",
298 299
		       notif->channel,
		       notif->band ? "bg" : "a",
300
		       notif->probe_status, notif->num_probe_not_sent,
301 302 303
		       le32_to_cpu(notif->tsf_high),
		       le32_to_cpu(notif->tsf_low),
		       le32_to_cpu(notif->statistics[0]),
304
		       le32_to_cpu(notif->tsf_low) - priv->scan_start_tsf);
305
#endif
306
	return 0;
307 308 309
}

/* Service SCAN_COMPLETE_NOTIFICATION (0x84) */
310
static int iwl_rx_scan_complete_notif(struct iwl_priv *priv,
311
				       struct iwl_rx_cmd_buffer *rxb,
312
				       struct iwl_device_cmd *cmd)
313
{
Z
Zhu Yi 已提交
314
	struct iwl_rx_packet *pkt = rxb_addr(rxb);
315
	struct iwl_scancomplete_notification *scan_notif = (void *)pkt->data;
316

317
	IWL_DEBUG_SCAN(priv, "Scan complete: %d channels (TSF 0x%08X:%08X) - %d\n",
318 319 320 321
		       scan_notif->scanned_channels,
		       scan_notif->tsf_low,
		       scan_notif->tsf_high, scan_notif->status);

322
	IWL_DEBUG_SCAN(priv, "Scan on %sGHz took %dms\n",
J
Johannes Berg 已提交
323
		       (priv->scan_band == IEEE80211_BAND_2GHZ) ? "2.4" : "5.2",
S
Stanislaw Gruszka 已提交
324
		       jiffies_to_msecs(jiffies - priv->scan_start));
325

326 327 328 329 330 331 332 333
	/*
	 * When aborting, we run the scan completed background work inline
	 * and the background work must then do nothing. The SCAN_COMPLETE
	 * bit helps implement that logic and thus needs to be set before
	 * queueing the work. Also, since the scan abort waits for SCAN_HW
	 * to clear, we need to set SCAN_COMPLETE before clearing SCAN_HW
	 * to avoid a race there.
	 */
D
Don Fry 已提交
334 335
	set_bit(STATUS_SCAN_COMPLETE, &priv->status);
	clear_bit(STATUS_SCAN_HW, &priv->status);
J
Johannes Berg 已提交
336
	queue_work(priv->workqueue, &priv->scan_completed);
337

338
	if (priv->iw_mode != NL80211_IFTYPE_ADHOC &&
339
	    iwl_advanced_bt_coexist(priv) &&
340
	    priv->bt_status != scan_notif->bt_status) {
341 342 343 344 345 346 347 348 349 350 351 352 353 354 355
		if (scan_notif->bt_status) {
			/* BT on */
			if (!priv->bt_ch_announce)
				priv->bt_traffic_load =
					IWL_BT_COEX_TRAFFIC_LOAD_HIGH;
			/*
			 * otherwise, no traffic load information provided
			 * no changes made
			 */
		} else {
			/* BT off */
			priv->bt_traffic_load =
				IWL_BT_COEX_TRAFFIC_LOAD_NONE;
		}
		priv->bt_status = scan_notif->bt_status;
J
Johannes Berg 已提交
356
		queue_work(priv->workqueue,
357
			   &priv->bt_traffic_change_work);
358
	}
359
	return 0;
360 361 362 363 364 365 366 367 368 369 370 371 372
}

void iwl_setup_rx_scan_handlers(struct iwl_priv *priv)
{
	/* scan handlers */
	priv->rx_handlers[REPLY_SCAN_CMD] = iwl_rx_reply_scan;
	priv->rx_handlers[SCAN_START_NOTIFICATION] = iwl_rx_scan_start_notif;
	priv->rx_handlers[SCAN_RESULTS_NOTIFICATION] =
					iwl_rx_scan_results_notif;
	priv->rx_handlers[SCAN_COMPLETE_NOTIFICATION] =
					iwl_rx_scan_complete_notif;
}

373 374
static u16 iwl_get_active_dwell_time(struct iwl_priv *priv,
				     enum ieee80211_band band, u8 n_probes)
375 376
{
	if (band == IEEE80211_BAND_5GHZ)
T
Tomas Winkler 已提交
377 378
		return IWL_ACTIVE_DWELL_TIME_52 +
			IWL_ACTIVE_DWELL_FACTOR_52GHZ * (n_probes + 1);
379
	else
T
Tomas Winkler 已提交
380 381
		return IWL_ACTIVE_DWELL_TIME_24 +
			IWL_ACTIVE_DWELL_FACTOR_24GHZ * (n_probes + 1);
382 383
}

J
Johannes Berg 已提交
384 385 386
static u16 iwl_limit_dwell(struct iwl_priv *priv, u16 dwell_time)
{
	struct iwl_rxon_context *ctx;
387 388 389 390 391
	int limits[NUM_IWL_RXON_CTX] = {};
	int n_active = 0;
	u16 limit;

	BUILD_BUG_ON(NUM_IWL_RXON_CTX != 2);
J
Johannes Berg 已提交
392 393 394

	/*
	 * If we're associated, we clamp the dwell time 98%
395 396 397 398 399
	 * of the beacon interval (minus 2 * channel tune time)
	 * If both contexts are active, we have to restrict to
	 * 1/2 of the minimum of them, because they might be in
	 * lock-step with the time inbetween only half of what
	 * time we'd have in each of them.
J
Johannes Berg 已提交
400 401
	 */
	for_each_context(priv, ctx) {
402 403 404
		switch (ctx->staging.dev_type) {
		case RXON_DEV_TYPE_P2P:
			/* no timing constraints */
405
			continue;
406 407 408 409 410 411 412 413 414 415 416 417 418 419 420
		case RXON_DEV_TYPE_ESS:
		default:
			/* timing constraints if associated */
			if (!iwl_is_associated_ctx(ctx))
				continue;
			break;
		case RXON_DEV_TYPE_CP:
		case RXON_DEV_TYPE_2STA:
			/*
			 * These seem to always have timers for TBTT
			 * active in uCode even when not associated yet.
			 */
			break;
		}

421
		limits[n_active++] = ctx->beacon_int ?: IWL_PASSIVE_DWELL_BASE;
J
Johannes Berg 已提交
422 423
	}

424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439
	switch (n_active) {
	case 0:
		return dwell_time;
	case 2:
		limit = (limits[1] * 98) / 100 - IWL_CHANNEL_TUNE_TIME * 2;
		limit /= 2;
		dwell_time = min(limit, dwell_time);
		/* fall through to limit further */
	case 1:
		limit = (limits[0] * 98) / 100 - IWL_CHANNEL_TUNE_TIME * 2;
		limit /= n_active;
		return min(limit, dwell_time);
	default:
		WARN_ON_ONCE(1);
		return dwell_time;
	}
J
Johannes Berg 已提交
440 441
}

442 443
static u16 iwl_get_passive_dwell_time(struct iwl_priv *priv,
				      enum ieee80211_band band)
444
{
T
Tomas Winkler 已提交
445
	u16 passive = (band == IEEE80211_BAND_2GHZ) ?
446 447 448
	    IWL_PASSIVE_DWELL_BASE + IWL_PASSIVE_DWELL_TIME_24 :
	    IWL_PASSIVE_DWELL_BASE + IWL_PASSIVE_DWELL_TIME_52;

J
Johannes Berg 已提交
449
	return iwl_limit_dwell(priv, passive);
450 451
}

452 453
/* Return valid, unused, channel for a passive scan to reset the RF */
static u8 iwl_get_single_channel_number(struct iwl_priv *priv,
454
					enum ieee80211_band band)
455
{
456
	struct ieee80211_supported_band *sband = priv->hw->wiphy->bands[band];
457
	struct iwl_rxon_context *ctx;
458
	int i;
459

460
	for (i = 0; i < sband->n_channels; i++) {
461 462 463
		bool busy = false;

		for_each_context(priv, ctx) {
464
			busy = sband->channels[i].hw_value ==
465 466 467 468 469 470 471 472
				le16_to_cpu(ctx->staging.channel);
			if (busy)
				break;
		}

		if (busy)
			continue;

473 474
		if (!(sband->channels[i].flags & IEEE80211_CHAN_DISABLED))
			return sband->channels[i].hw_value;
475 476
	}

477
	return 0;
478 479
}

480 481 482 483
static int iwl_get_channel_for_reset_scan(struct iwl_priv *priv,
					  struct ieee80211_vif *vif,
					  enum ieee80211_band band,
					  struct iwl_scan_channel *scan_ch)
484 485
{
	const struct ieee80211_supported_band *sband;
486
	u16 channel;
487 488 489 490

	sband = iwl_get_hw_mode(priv, band);
	if (!sband) {
		IWL_ERR(priv, "invalid band\n");
491
		return 0;
492 493 494 495 496 497
	}

	channel = iwl_get_single_channel_number(priv, band);
	if (channel) {
		scan_ch->channel = cpu_to_le16(channel);
		scan_ch->type = SCAN_CHANNEL_TYPE_PASSIVE;
498 499 500 501
		scan_ch->active_dwell =
			cpu_to_le16(IWL_RADIO_RESET_DWELL_TIME);
		scan_ch->passive_dwell =
			cpu_to_le16(IWL_RADIO_RESET_DWELL_TIME);
502 503 504 505 506 507
		/* Set txpower levels to defaults */
		scan_ch->dsp_atten = 110;
		if (band == IEEE80211_BAND_5GHZ)
			scan_ch->tx_gain = ((1 << 5) | (3 << 3)) | 3;
		else
			scan_ch->tx_gain = ((1 << 5) | (5 << 3));
508 509 510 511 512
		return 1;
	}

	IWL_ERR(priv, "no valid channel found\n");
	return 0;
513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546
}

static int iwl_get_channels_for_scan(struct iwl_priv *priv,
				     struct ieee80211_vif *vif,
				     enum ieee80211_band band,
				     u8 is_active, u8 n_probes,
				     struct iwl_scan_channel *scan_ch)
{
	struct ieee80211_channel *chan;
	const struct ieee80211_supported_band *sband;
	u16 passive_dwell = 0;
	u16 active_dwell = 0;
	int added, i;
	u16 channel;

	sband = iwl_get_hw_mode(priv, band);
	if (!sband)
		return 0;

	active_dwell = iwl_get_active_dwell_time(priv, band, n_probes);
	passive_dwell = iwl_get_passive_dwell_time(priv, band);

	if (passive_dwell <= active_dwell)
		passive_dwell = active_dwell + 1;

	for (i = 0, added = 0; i < priv->scan_request->n_channels; i++) {
		chan = priv->scan_request->channels[i];

		if (chan->band != band)
			continue;

		channel = chan->hw_value;
		scan_ch->channel = cpu_to_le16(channel);

547
		if (!is_active || (chan->flags & IEEE80211_CHAN_NO_IR))
548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584
			scan_ch->type = SCAN_CHANNEL_TYPE_PASSIVE;
		else
			scan_ch->type = SCAN_CHANNEL_TYPE_ACTIVE;

		if (n_probes)
			scan_ch->type |= IWL_SCAN_PROBE_MASK(n_probes);

		scan_ch->active_dwell = cpu_to_le16(active_dwell);
		scan_ch->passive_dwell = cpu_to_le16(passive_dwell);

		/* Set txpower levels to defaults */
		scan_ch->dsp_atten = 110;

		/* NOTE: if we were doing 6Mb OFDM for scans we'd use
		 * power level:
		 * scan_ch->tx_gain = ((1 << 5) | (2 << 3)) | 3;
		 */
		if (band == IEEE80211_BAND_5GHZ)
			scan_ch->tx_gain = ((1 << 5) | (3 << 3)) | 3;
		else
			scan_ch->tx_gain = ((1 << 5) | (5 << 3));

		IWL_DEBUG_SCAN(priv, "Scanning ch=%d prob=0x%X [%s %d]\n",
			       channel, le32_to_cpu(scan_ch->type),
			       (scan_ch->type & SCAN_CHANNEL_TYPE_ACTIVE) ?
				"ACTIVE" : "PASSIVE",
			       (scan_ch->type & SCAN_CHANNEL_TYPE_ACTIVE) ?
			       active_dwell : passive_dwell);

		scan_ch++;
		added++;
	}

	IWL_DEBUG_SCAN(priv, "total channels to scan %d\n", added);
	return added;
}

585 586 587 588 589
/**
 * iwl_fill_probe_req - fill in all required fields and IE for probe request
 */

static u16 iwl_fill_probe_req(struct ieee80211_mgmt *frame, const u8 *ta,
590 591
			      const u8 *ies, int ie_len, const u8 *ssid,
			      u8 ssid_len, int left)
592 593 594 595 596 597 598 599 600 601 602
{
	int len = 0;
	u8 *pos = NULL;

	/* Make sure there is enough space for the probe request,
	 * two mandatory IEs and the data */
	left -= 24;
	if (left < 0)
		return 0;

	frame->frame_control = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ);
J
Johannes Berg 已提交
603
	eth_broadcast_addr(frame->da);
604
	memcpy(frame->sa, ta, ETH_ALEN);
J
Johannes Berg 已提交
605
	eth_broadcast_addr(frame->bssid);
606 607 608 609 610 611 612
	frame->seq_ctrl = 0;

	len += 24;

	/* ...next IE... */
	pos = &frame->u.probe_req.variable[0];

613 614
	/* fill in our SSID IE */
	left -= ssid_len + 2;
615 616 617
	if (left < 0)
		return 0;
	*pos++ = WLAN_EID_SSID;
618 619 620 621 622
	*pos++ = ssid_len;
	if (ssid && ssid_len) {
		memcpy(pos, ssid, ssid_len);
		pos += ssid_len;
	}
623

624
	len += ssid_len + 2;
625 626 627 628 629 630 631 632 633 634 635 636

	if (WARN_ON(left < ie_len))
		return len;

	if (ies && ie_len) {
		memcpy(pos, ies, ie_len);
		len += ie_len;
	}

	return (u16)len;
}

637 638 639 640 641 642 643 644 645 646
static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
{
	struct iwl_host_cmd cmd = {
		.id = REPLY_SCAN_CMD,
		.len = { sizeof(struct iwl_scan_cmd), },
		.flags = CMD_SYNC,
	};
	struct iwl_scan_cmd *scan;
	struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
	u32 rate_flags = 0;
647
	u16 cmd_len = 0;
648 649 650
	u16 rx_chain = 0;
	enum ieee80211_band band;
	u8 n_probes = 0;
651
	u8 rx_ant = priv->nvm_data->valid_rx_ant;
652 653 654 655
	u8 rate;
	bool is_active = false;
	int  chan_mod;
	u8 active_chains;
656
	u8 scan_tx_antennas = priv->nvm_data->valid_tx_ant;
657
	int ret;
658 659 660
	int scan_cmd_size = sizeof(struct iwl_scan_cmd) +
			    MAX_SCAN_CHANNEL * sizeof(struct iwl_scan_channel) +
			    priv->fw->ucode_capa.max_probe_length;
661 662
	const u8 *ssid = NULL;
	u8 ssid_len = 0;
663

664 665 666
	if (WARN_ON(priv->scan_type == IWL_SCAN_NORMAL &&
		    (!priv->scan_request ||
		     priv->scan_request->n_channels > MAX_SCAN_CHANNEL)))
667
		return -EINVAL;
668

669
	lockdep_assert_held(&priv->mutex);
670 671 672 673 674

	if (vif)
		ctx = iwl_rxon_ctx_from_vif(vif);

	if (!priv->scan_cmd) {
675
		priv->scan_cmd = kmalloc(scan_cmd_size, GFP_KERNEL);
676 677 678 679 680 681 682
		if (!priv->scan_cmd) {
			IWL_DEBUG_SCAN(priv,
				       "fail to allocate memory for scan\n");
			return -ENOMEM;
		}
	}
	scan = priv->scan_cmd;
683
	memset(scan, 0, scan_cmd_size);
684 685 686 687

	scan->quiet_plcp_th = IWL_PLCP_QUIET_THRESH;
	scan->quiet_time = IWL_ACTIVE_QUIET_TIME;

J
Johannes Berg 已提交
688
	if (iwl_is_any_associated(priv)) {
689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719
		u16 interval = 0;
		u32 extra;
		u32 suspend_time = 100;
		u32 scan_suspend_time = 100;

		IWL_DEBUG_INFO(priv, "Scanning while associated...\n");
		switch (priv->scan_type) {
		case IWL_SCAN_RADIO_RESET:
			interval = 0;
			break;
		case IWL_SCAN_NORMAL:
			interval = vif->bss_conf.beacon_int;
			break;
		}

		scan->suspend_time = 0;
		scan->max_out_time = cpu_to_le32(200 * 1024);
		if (!interval)
			interval = suspend_time;

		extra = (suspend_time / interval) << 22;
		scan_suspend_time = (extra |
		    ((suspend_time % interval) * 1024));
		scan->suspend_time = cpu_to_le32(scan_suspend_time);
		IWL_DEBUG_SCAN(priv, "suspend_time 0x%X beacon interval %d\n",
			       scan_suspend_time, interval);
	}

	switch (priv->scan_type) {
	case IWL_SCAN_RADIO_RESET:
		IWL_DEBUG_SCAN(priv, "Start internal passive scan.\n");
720 721 722 723 724 725
		/*
		 * Override quiet time as firmware checks that active
		 * dwell is >= quiet; since we use passive scan it'll
		 * not actually be used.
		 */
		scan->quiet_time = cpu_to_le16(IWL_RADIO_RESET_DWELL_TIME);
726 727 728 729 730
		break;
	case IWL_SCAN_NORMAL:
		if (priv->scan_request->n_ssids) {
			int i, p = 0;
			IWL_DEBUG_SCAN(priv, "Kicking off active scan\n");
731 732 733 734 735 736 737
			/*
			 * The highest priority SSID is inserted to the
			 * probe request template.
			 */
			ssid_len = priv->scan_request->ssids[0].ssid_len;
			ssid = priv->scan_request->ssids[0].ssid;

738 739 740 741 742
			/*
			 * Invert the order of ssids, the firmware will invert
			 * it back.
			 */
			for (i = priv->scan_request->n_ssids - 1; i >= 1; i--) {
743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768
				scan->direct_scan[p].id = WLAN_EID_SSID;
				scan->direct_scan[p].len =
					priv->scan_request->ssids[i].ssid_len;
				memcpy(scan->direct_scan[p].ssid,
				       priv->scan_request->ssids[i].ssid,
				       priv->scan_request->ssids[i].ssid_len);
				n_probes++;
				p++;
			}
			is_active = true;
		} else
			IWL_DEBUG_SCAN(priv, "Start passive scan.\n");
		break;
	}

	scan->tx_cmd.tx_flags = TX_CMD_FLG_SEQ_CTL_MSK;
	scan->tx_cmd.sta_id = ctx->bcast_sta_id;
	scan->tx_cmd.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE;

	switch (priv->scan_band) {
	case IEEE80211_BAND_2GHZ:
		scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK;
		chan_mod = le32_to_cpu(
			priv->contexts[IWL_RXON_CTX_BSS].active.flags &
						RXON_FLG_CHANNEL_MODE_MSK)
				       >> RXON_FLG_CHANNEL_MODE_POS;
769 770
		if ((priv->scan_request && priv->scan_request->no_cck) ||
		    chan_mod == CHANNEL_MODE_PURE_40) {
771 772 773 774 775 776 777 778 779
			rate = IWL_RATE_6M_PLCP;
		} else {
			rate = IWL_RATE_1M_PLCP;
			rate_flags = RATE_MCS_CCK_MSK;
		}
		/*
		 * Internal scans are passive, so we can indiscriminately set
		 * the BT ignore flag on 2.4 GHz since it applies to TX only.
		 */
780 781
		if (priv->lib->bt_params &&
		    priv->lib->bt_params->advanced_bt_coexist)
782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822
			scan->tx_cmd.tx_flags |= TX_CMD_FLG_IGNORE_BT;
		break;
	case IEEE80211_BAND_5GHZ:
		rate = IWL_RATE_6M_PLCP;
		break;
	default:
		IWL_WARN(priv, "Invalid scan band\n");
		return -EIO;
	}

	/*
	 * If active scanning is requested but a certain channel is
	 * marked passive, we can do active scanning if we detect
	 * 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.
	 *
	 * This was fixed in later versions along with some other
	 * scan changes, and the threshold behaves as a flag in those
	 * versions.
	 */
	if (priv->new_scan_threshold_behaviour)
		scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH_DEFAULT :
						IWL_GOOD_CRC_TH_DISABLED;
	else
		scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH_DEFAULT :
						IWL_GOOD_CRC_TH_NEVER;

	band = priv->scan_band;

	if (band == IEEE80211_BAND_2GHZ &&
823 824
	    priv->lib->bt_params &&
	    priv->lib->bt_params->advanced_bt_coexist) {
825 826 827 828 829 830 831 832 833 834
		/* transmit 2.4 GHz probes only on first antenna */
		scan_tx_antennas = first_antenna(scan_tx_antennas);
	}

	priv->scan_tx_ant[band] = iwl_toggle_tx_ant(priv,
						    priv->scan_tx_ant[band],
						    scan_tx_antennas);
	rate_flags |= iwl_ant_idx_to_flags(priv->scan_tx_ant[band]);
	scan->tx_cmd.rate_n_flags = iwl_hw_set_rate_n_flags(rate, rate_flags);

J
Johannes Berg 已提交
835 836 837 838
	/*
	 * In power save mode while associated use one chain,
	 * otherwise use all chains
	 */
D
Don Fry 已提交
839
	if (test_bit(STATUS_POWER_PMI, &priv->status) &&
J
Johannes Berg 已提交
840
	    !(priv->hw->conf.flags & IEEE80211_CONF_IDLE)) {
841 842 843 844 845 846 847 848 849 850 851
		/* rx_ant has been set to all valid chains previously */
		active_chains = rx_ant &
				((u8)(priv->chain_noise_data.active_chains));
		if (!active_chains)
			active_chains = rx_ant;

		IWL_DEBUG_SCAN(priv, "chain_noise_data.active_chains: %u\n",
				priv->chain_noise_data.active_chains);

		rx_ant = first_antenna(active_chains);
	}
852 853
	if (priv->lib->bt_params &&
	    priv->lib->bt_params->advanced_bt_coexist &&
854 855 856 857 858 859 860
	    priv->bt_full_concurrent) {
		/* operated as 1x1 in full concurrency mode */
		rx_ant = first_antenna(rx_ant);
	}

	/* MIMO is not used here, but value is required */
	rx_chain |=
861
		priv->nvm_data->valid_rx_ant << RXON_RX_CHAIN_VALID_POS;
862 863 864 865 866 867
	rx_chain |= rx_ant << RXON_RX_CHAIN_FORCE_MIMO_SEL_POS;
	rx_chain |= rx_ant << RXON_RX_CHAIN_FORCE_SEL_POS;
	rx_chain |= 0x1 << RXON_RX_CHAIN_DRIVER_FORCE_POS;
	scan->rx_chain = cpu_to_le16(rx_chain);
	switch (priv->scan_type) {
	case IWL_SCAN_NORMAL:
868
		cmd_len = iwl_fill_probe_req(
869 870 871 872
					(struct ieee80211_mgmt *)scan->data,
					vif->addr,
					priv->scan_request->ie,
					priv->scan_request->ie_len,
873
					ssid, ssid_len,
874
					scan_cmd_size - sizeof(*scan));
875 876 877
		break;
	case IWL_SCAN_RADIO_RESET:
		/* use bcast addr, will not be transmitted but must be valid */
878
		cmd_len = iwl_fill_probe_req(
879 880
					(struct ieee80211_mgmt *)scan->data,
					iwl_bcast_addr, NULL, 0,
881
					NULL, 0,
882
					scan_cmd_size - sizeof(*scan));
883 884 885 886 887 888 889 890 891 892 893 894
		break;
	default:
		BUG();
	}
	scan->tx_cmd.len = cpu_to_le16(cmd_len);

	scan->filter_flags |= (RXON_FILTER_ACCEPT_GRP_MSK |
			       RXON_FILTER_BCON_AWARE_MSK);

	switch (priv->scan_type) {
	case IWL_SCAN_RADIO_RESET:
		scan->channel_count =
895
			iwl_get_channel_for_reset_scan(priv, vif, band,
896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917
				(void *)&scan->data[cmd_len]);
		break;
	case IWL_SCAN_NORMAL:
		scan->channel_count =
			iwl_get_channels_for_scan(priv, vif, band,
				is_active, n_probes,
				(void *)&scan->data[cmd_len]);
		break;
	}

	if (scan->channel_count == 0) {
		IWL_DEBUG_SCAN(priv, "channel count %d\n", scan->channel_count);
		return -EIO;
	}

	cmd.len[0] += le16_to_cpu(scan->tx_cmd.len) +
	    scan->channel_count * sizeof(struct iwl_scan_channel);
	cmd.data[0] = scan;
	cmd.dataflags[0] = IWL_HCMD_DFL_NOCOPY;
	scan->len = cpu_to_le16(cmd.len[0]);

	/* set scan bit here for PAN params */
D
Don Fry 已提交
918
	set_bit(STATUS_SCAN_HW, &priv->status);
919 920

	ret = iwlagn_set_pan_params(priv);
921 922
	if (ret) {
		clear_bit(STATUS_SCAN_HW, &priv->status);
923
		return ret;
924
	}
925

926
	ret = iwl_dvm_send_cmd(priv, &cmd);
927
	if (ret) {
D
Don Fry 已提交
928
		clear_bit(STATUS_SCAN_HW, &priv->status);
929 930 931 932 933 934
		iwlagn_set_pan_params(priv);
	}

	return ret;
}

T
Tomas Winkler 已提交
935 936
void iwl_init_scan_params(struct iwl_priv *priv)
{
937
	u8 ant_idx = fls(priv->nvm_data->valid_tx_ant) - 1;
T
Tomas Winkler 已提交
938
	if (!priv->scan_tx_ant[IEEE80211_BAND_5GHZ])
T
Tomas Winkler 已提交
939
		priv->scan_tx_ant[IEEE80211_BAND_5GHZ] = ant_idx;
T
Tomas Winkler 已提交
940
	if (!priv->scan_tx_ant[IEEE80211_BAND_2GHZ])
T
Tomas Winkler 已提交
941
		priv->scan_tx_ant[IEEE80211_BAND_2GHZ] = ant_idx;
T
Tomas Winkler 已提交
942 943
}

J
Johannes Berg 已提交
944 945 946 947
int __must_check iwl_scan_initiate(struct iwl_priv *priv,
				   struct ieee80211_vif *vif,
				   enum iwl_scan_type scan_type,
				   enum ieee80211_band band)
948
{
J
Johannes Berg 已提交
949 950
	int ret;

951
	lockdep_assert_held(&priv->mutex);
J
Johannes Berg 已提交
952

J
Johannes Berg 已提交
953 954
	cancel_delayed_work(&priv->scan_check);

D
Don Fry 已提交
955
	if (!iwl_is_ready_rf(priv)) {
956
		IWL_WARN(priv, "Request scan called when driver not ready.\n");
J
Johannes Berg 已提交
957 958 959
		return -EIO;
	}

D
Don Fry 已提交
960
	if (test_bit(STATUS_SCAN_HW, &priv->status)) {
961
		IWL_DEBUG_SCAN(priv,
J
Johannes Berg 已提交
962 963 964 965
			"Multiple concurrent scan requests in parallel.\n");
		return -EBUSY;
	}

D
Don Fry 已提交
966
	if (test_bit(STATUS_SCAN_ABORTING, &priv->status)) {
967
		IWL_DEBUG_SCAN(priv, "Scan request while abort pending.\n");
J
Johannes Berg 已提交
968 969 970
		return -EBUSY;
	}

971
	IWL_DEBUG_SCAN(priv, "Starting %sscan...\n",
J
Johannes Berg 已提交
972 973
			scan_type == IWL_SCAN_NORMAL ? "" :
			"internal short ");
J
Johannes Berg 已提交
974

D
Don Fry 已提交
975
	set_bit(STATUS_SCANNING, &priv->status);
J
Johannes Berg 已提交
976
	priv->scan_type = scan_type;
977
	priv->scan_start = jiffies;
J
Johannes Berg 已提交
978
	priv->scan_band = band;
979

980
	ret = iwlagn_request_scan(priv, vif);
J
Johannes Berg 已提交
981
	if (ret) {
D
Don Fry 已提交
982
		clear_bit(STATUS_SCANNING, &priv->status);
J
Johannes Berg 已提交
983
		priv->scan_type = IWL_SCAN_NORMAL;
J
Johannes Berg 已提交
984 985
		return ret;
	}
986

J
Johannes Berg 已提交
987
	queue_delayed_work(priv->workqueue, &priv->scan_check,
J
Johannes Berg 已提交
988
			   IWL_SCAN_CHECK_WATCHDOG);
989 990 991 992

	return 0;
}

993

994 995 996 997
/*
 * internal short scan, this function should only been called while associated.
 * It will reset and tune the radio to prevent possible RF related problem
 */
J
Johannes Berg 已提交
998
void iwl_internal_short_hw_scan(struct iwl_priv *priv)
999
{
J
Johannes Berg 已提交
1000
	queue_work(priv->workqueue, &priv->start_internal_scan);
J
Johannes Berg 已提交
1001 1002
}

1003
static void iwl_bg_start_internal_scan(struct work_struct *work)
J
Johannes Berg 已提交
1004 1005 1006 1007
{
	struct iwl_priv *priv =
		container_of(work, struct iwl_priv, start_internal_scan);

1008 1009
	IWL_DEBUG_SCAN(priv, "Start internal scan\n");

1010
	mutex_lock(&priv->mutex);
1011

J
Johannes Berg 已提交
1012
	if (priv->scan_type == IWL_SCAN_RADIO_RESET) {
1013 1014 1015 1016
		IWL_DEBUG_SCAN(priv, "Internal scan already in progress\n");
		goto unlock;
	}

D
Don Fry 已提交
1017
	if (test_bit(STATUS_SCANNING, &priv->status)) {
1018
		IWL_DEBUG_SCAN(priv, "Scan already in progress.\n");
J
Johannes Berg 已提交
1019
		goto unlock;
1020
	}
J
Johannes Berg 已提交
1021

J
Johannes Berg 已提交
1022
	if (iwl_scan_initiate(priv, NULL, IWL_SCAN_RADIO_RESET, priv->band))
J
Johannes Berg 已提交
1023
		IWL_DEBUG_SCAN(priv, "failed to start internal short scan\n");
J
Johannes Berg 已提交
1024
 unlock:
1025
	mutex_unlock(&priv->mutex);
1026 1027
}

1028
static void iwl_bg_scan_check(struct work_struct *data)
1029 1030 1031 1032
{
	struct iwl_priv *priv =
	    container_of(data, struct iwl_priv, scan_check.work);

1033 1034
	IWL_DEBUG_SCAN(priv, "Scan check work\n");

1035 1036 1037
	/* Since we are here firmware does not finish scan and
	 * most likely is in bad shape, so we don't bother to
	 * send abort command, just force scan complete to mac80211 */
1038
	mutex_lock(&priv->mutex);
1039
	iwl_force_scan_end(priv);
1040
	mutex_unlock(&priv->mutex);
1041
}
S
Samuel Ortiz 已提交
1042

1043
static void iwl_bg_abort_scan(struct work_struct *work)
1044 1045 1046
{
	struct iwl_priv *priv = container_of(work, struct iwl_priv, abort_scan);

1047 1048
	IWL_DEBUG_SCAN(priv, "Abort scan work\n");

1049 1050
	/* We keep scan_check work queued in case when firmware will not
	 * report back scan completed notification */
1051
	mutex_lock(&priv->mutex);
1052
	iwl_scan_cancel_timeout(priv, 200);
1053
	mutex_unlock(&priv->mutex);
1054 1055
}

J
Johannes Berg 已提交
1056 1057 1058 1059
static void iwl_bg_scan_completed(struct work_struct *work)
{
	struct iwl_priv *priv =
		container_of(work, struct iwl_priv, scan_completed);
J
Johannes Berg 已提交
1060

1061
	mutex_lock(&priv->mutex);
J
Johannes Berg 已提交
1062
	iwl_process_scan_complete(priv);
1063
	mutex_unlock(&priv->mutex);
1064 1065
}

1066 1067
void iwl_setup_scan_deferred_work(struct iwl_priv *priv)
{
1068
	INIT_WORK(&priv->scan_completed, iwl_bg_scan_completed);
1069
	INIT_WORK(&priv->abort_scan, iwl_bg_abort_scan);
J
Johannes Berg 已提交
1070
	INIT_WORK(&priv->start_internal_scan, iwl_bg_start_internal_scan);
1071 1072 1073
	INIT_DELAYED_WORK(&priv->scan_check, iwl_bg_scan_check);
}

1074 1075 1076 1077 1078 1079 1080
void iwl_cancel_scan_deferred_work(struct iwl_priv *priv)
{
	cancel_work_sync(&priv->start_internal_scan);
	cancel_work_sync(&priv->abort_scan);
	cancel_work_sync(&priv->scan_completed);

	if (cancel_delayed_work_sync(&priv->scan_check)) {
1081
		mutex_lock(&priv->mutex);
1082
		iwl_force_scan_end(priv);
1083
		mutex_unlock(&priv->mutex);
1084 1085
	}
}