main.c 55.4 KB
Newer Older
1
/*
2
 * Copyright (c) 2008-2009 Atheros Communications Inc.
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#include <linux/nl80211.h>
S
Sujith 已提交
18
#include "ath9k.h"
19
#include "btcoex.h"
20

S
Sujith 已提交
21 22
static void ath_update_txpow(struct ath_softc *sc)
{
23
	struct ath_hw *ah = sc->sc_ah;
S
Sujith 已提交
24

S
Sujith 已提交
25 26
	if (sc->curtxpow != sc->config.txpowlimit) {
		ath9k_hw_set_txpowerlimit(ah, sc->config.txpowlimit);
S
Sujith 已提交
27
		/* read back in case value is clamped */
F
Felix Fietkau 已提交
28
		sc->curtxpow = ath9k_hw_regulatory(ah)->power_limit;
S
Sujith 已提交
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
	}
}

static u8 parse_mpdudensity(u8 mpdudensity)
{
	/*
	 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
	 *   0 for no restriction
	 *   1 for 1/4 us
	 *   2 for 1/2 us
	 *   3 for 1 us
	 *   4 for 2 us
	 *   5 for 4 us
	 *   6 for 8 us
	 *   7 for 16 us
	 */
	switch (mpdudensity) {
	case 0:
		return 0;
	case 1:
	case 2:
	case 3:
		/* Our lower layer calculations limit our precision to
		   1 microsecond */
		return 1;
	case 4:
		return 2;
	case 5:
		return 4;
	case 6:
		return 8;
	case 7:
		return 16;
	default:
		return 0;
	}
}

67 68 69 70 71 72 73 74 75 76 77 78 79
static struct ath9k_channel *ath_get_curchannel(struct ath_softc *sc,
						struct ieee80211_hw *hw)
{
	struct ieee80211_channel *curchan = hw->conf.channel;
	struct ath9k_channel *channel;
	u8 chan_idx;

	chan_idx = curchan->hw_value;
	channel = &sc->sc_ah->channels[chan_idx];
	ath9k_update_ichannel(sc, hw, channel);
	return channel;
}

S
Sujith 已提交
80
bool ath9k_setpower(struct ath_softc *sc, enum ath9k_power_mode mode)
81 82 83 84
{
	unsigned long flags;
	bool ret;

85 86 87
	spin_lock_irqsave(&sc->sc_pm_lock, flags);
	ret = ath9k_hw_setpower(sc->sc_ah, mode);
	spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
88 89 90 91

	return ret;
}

92 93
void ath9k_ps_wakeup(struct ath_softc *sc)
{
94
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
95
	unsigned long flags;
96
	enum ath9k_power_mode power_mode;
97 98 99 100 101

	spin_lock_irqsave(&sc->sc_pm_lock, flags);
	if (++sc->ps_usecount != 1)
		goto unlock;

102
	power_mode = sc->sc_ah->power_mode;
103
	ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE);
104

105 106 107 108 109
	/*
	 * While the hardware is asleep, the cycle counters contain no
	 * useful data. Better clear them now so that they don't mess up
	 * survey data results.
	 */
110 111 112 113 114 115
	if (power_mode != ATH9K_PM_AWAKE) {
		spin_lock(&common->cc_lock);
		ath_hw_cycle_counters_update(common);
		memset(&common->cc_survey, 0, sizeof(common->cc_survey));
		spin_unlock(&common->cc_lock);
	}
116

117 118 119 120 121 122
 unlock:
	spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
}

void ath9k_ps_restore(struct ath_softc *sc)
{
123
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
124 125 126 127 128 129
	unsigned long flags;

	spin_lock_irqsave(&sc->sc_pm_lock, flags);
	if (--sc->ps_usecount != 0)
		goto unlock;

130 131 132 133
	spin_lock(&common->cc_lock);
	ath_hw_cycle_counters_update(common);
	spin_unlock(&common->cc_lock);

134 135 136 137
	if (sc->ps_idle)
		ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_FULL_SLEEP);
	else if (sc->ps_enabled &&
		 !(sc->ps_flags & (PS_WAIT_FOR_BEACON |
S
Sujith 已提交
138 139 140
			      PS_WAIT_FOR_CAB |
			      PS_WAIT_FOR_PSPOLL_DATA |
			      PS_WAIT_FOR_TX_ACK)))
141
		ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_NETWORK_SLEEP);
142 143 144 145 146

 unlock:
	spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
}

147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
static void ath_start_ani(struct ath_common *common)
{
	struct ath_hw *ah = common->ah;
	unsigned long timestamp = jiffies_to_msecs(jiffies);
	struct ath_softc *sc = (struct ath_softc *) common->priv;

	if (!(sc->sc_flags & SC_OP_ANI_RUN))
		return;

	if (sc->sc_flags & SC_OP_OFFCHANNEL)
		return;

	common->ani.longcal_timer = timestamp;
	common->ani.shortcal_timer = timestamp;
	common->ani.checkani_timer = timestamp;

	mod_timer(&common->ani.timer,
		  jiffies +
			msecs_to_jiffies((u32)ah->config.ani_poll_interval));
}

168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
static void ath_update_survey_nf(struct ath_softc *sc, int channel)
{
	struct ath_hw *ah = sc->sc_ah;
	struct ath9k_channel *chan = &ah->channels[channel];
	struct survey_info *survey = &sc->survey[channel];

	if (chan->noisefloor) {
		survey->filled |= SURVEY_INFO_NOISE_DBM;
		survey->noise = chan->noisefloor;
	}
}

static void ath_update_survey_stats(struct ath_softc *sc)
{
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
	int pos = ah->curchan - &ah->channels[0];
	struct survey_info *survey = &sc->survey[pos];
	struct ath_cycle_counters *cc = &common->cc_survey;
	unsigned int div = common->clockrate * 1000;

189 190 191
	if (!ah->curchan)
		return;

192 193
	if (ah->power_mode == ATH9K_PM_AWAKE)
		ath_hw_cycle_counters_update(common);
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209

	if (cc->cycles > 0) {
		survey->filled |= SURVEY_INFO_CHANNEL_TIME |
			SURVEY_INFO_CHANNEL_TIME_BUSY |
			SURVEY_INFO_CHANNEL_TIME_RX |
			SURVEY_INFO_CHANNEL_TIME_TX;
		survey->channel_time += cc->cycles / div;
		survey->channel_time_busy += cc->rx_busy / div;
		survey->channel_time_rx += cc->rx_frame / div;
		survey->channel_time_tx += cc->tx_frame / div;
	}
	memset(cc, 0, sizeof(*cc));

	ath_update_survey_nf(sc, pos);
}

S
Sujith 已提交
210 211 212 213 214
/*
 * Set/change channels.  If the channel is really being changed, it's done
 * by reseting the chip.  To accomplish this we must first cleanup any pending
 * DMA, then restart stuff.
*/
215 216
int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
		    struct ath9k_channel *hchan)
S
Sujith 已提交
217
{
218
	struct ath_wiphy *aphy = hw->priv;
219
	struct ath_hw *ah = sc->sc_ah;
220
	struct ath_common *common = ath9k_hw_common(ah);
L
Luis R. Rodriguez 已提交
221
	struct ieee80211_conf *conf = &common->hw->conf;
S
Sujith 已提交
222
	bool fastcc = true, stopped;
223
	struct ieee80211_channel *channel = hw->conf.channel;
224
	struct ath9k_hw_cal_data *caldata = NULL;
225
	int r;
S
Sujith 已提交
226 227 228 229

	if (sc->sc_flags & SC_OP_INVALID)
		return -EIO;

230 231 232 233 234
	del_timer_sync(&common->ani.timer);
	cancel_work_sync(&sc->paprd_work);
	cancel_work_sync(&sc->hw_check_work);
	cancel_delayed_work_sync(&sc->tx_complete_work);

235 236
	ath9k_ps_wakeup(sc);

237 238 239 240 241 242 243 244 245 246
	/*
	 * This is only performed if the channel settings have
	 * actually changed.
	 *
	 * To switch channels clear any pending DMA operations;
	 * wait long enough for the RX fifo to drain, reset the
	 * hardware at the new frequency, and then re-enable
	 * the relevant bits of the h/w.
	 */
	ath9k_hw_set_interrupts(ah, 0);
247
	stopped = ath_drain_all_txq(sc, false);
248 249 250

	spin_lock_bh(&sc->rx.pcu_lock);

251 252
	if (!ath_stoprecv(sc))
		stopped = false;
S
Sujith 已提交
253

254 255 256
	/* XXX: do not flush receive queue here. We don't want
	 * to flush data frames already in queue because of
	 * changing channel. */
S
Sujith 已提交
257

258
	if (!stopped || !(sc->sc_flags & SC_OP_OFFCHANNEL))
259 260
		fastcc = false;

261 262 263
	if (!(sc->sc_flags & SC_OP_OFFCHANNEL))
		caldata = &aphy->caldata;

264
	ath_print(common, ATH_DBG_CONFIG,
265
		  "(%u MHz) -> (%u MHz), conf_is_ht40: %d fastcc: %d\n",
266
		  sc->sc_ah->curchan->channel,
267 268
		  channel->center_freq, conf_is_ht40(conf),
		  fastcc);
S
Sujith 已提交
269

270 271
	spin_lock_bh(&sc->sc_resetlock);

272
	r = ath9k_hw_reset(ah, hchan, caldata, fastcc);
273
	if (r) {
274
		ath_print(common, ATH_DBG_FATAL,
275
			  "Unable to reset channel (%u MHz), "
276 277
			  "reset status %d\n",
			  channel->center_freq, r);
278
		spin_unlock_bh(&sc->sc_resetlock);
279
		spin_unlock_bh(&sc->rx.pcu_lock);
280
		goto ps_restore;
S
Sujith 已提交
281
	}
282 283 284
	spin_unlock_bh(&sc->sc_resetlock);

	if (ath_startrecv(sc) != 0) {
285 286
		ath_print(common, ATH_DBG_FATAL,
			  "Unable to restart recv logic\n");
287
		r = -EIO;
288
		spin_unlock_bh(&sc->rx.pcu_lock);
289
		goto ps_restore;
290 291
	}

292 293
	spin_unlock_bh(&sc->rx.pcu_lock);

294
	ath_update_txpow(sc);
P
Pavel Roskin 已提交
295
	ath9k_hw_set_interrupts(ah, ah->imask);
296

297 298
	if (!(sc->sc_flags & (SC_OP_OFFCHANNEL))) {
		ath_beacon_config(sc, NULL);
299
		ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0);
300
		ath_start_ani(common);
301 302
	}

303
 ps_restore:
304
	ath9k_ps_restore(sc);
305
	return r;
S
Sujith 已提交
306 307
}

308 309 310
static void ath_paprd_activate(struct ath_softc *sc)
{
	struct ath_hw *ah = sc->sc_ah;
311
	struct ath9k_hw_cal_data *caldata = ah->caldata;
312
	struct ath_common *common = ath9k_hw_common(ah);
313 314
	int chain;

315
	if (!caldata || !caldata->paprd_done)
316 317 318
		return;

	ath9k_ps_wakeup(sc);
319
	ar9003_paprd_enable(ah, false);
320
	for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
321
		if (!(common->tx_chainmask & BIT(chain)))
322 323
			continue;

324
		ar9003_paprd_populate_single_table(ah, caldata, chain);
325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341
	}

	ar9003_paprd_enable(ah, true);
	ath9k_ps_restore(sc);
}

void ath_paprd_calibrate(struct work_struct *work)
{
	struct ath_softc *sc = container_of(work, struct ath_softc, paprd_work);
	struct ieee80211_hw *hw = sc->hw;
	struct ath_hw *ah = sc->sc_ah;
	struct ieee80211_hdr *hdr;
	struct sk_buff *skb = NULL;
	struct ieee80211_tx_info *tx_info;
	int band = hw->conf.channel->band;
	struct ieee80211_supported_band *sband = &sc->sbands[band];
	struct ath_tx_control txctl;
342
	struct ath9k_hw_cal_data *caldata = ah->caldata;
343
	struct ath_common *common = ath9k_hw_common(ah);
344 345 346 347 348 349 350
	int qnum, ftype;
	int chain_ok = 0;
	int chain;
	int len = 1800;
	int time_left;
	int i;

351 352 353
	if (!caldata)
		return;

354 355 356 357 358 359 360 361 362 363 364
	skb = alloc_skb(len, GFP_KERNEL);
	if (!skb)
		return;

	tx_info = IEEE80211_SKB_CB(skb);

	skb_put(skb, len);
	memset(skb->data, 0, len);
	hdr = (struct ieee80211_hdr *)skb->data;
	ftype = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_NULLFUNC;
	hdr->frame_control = cpu_to_le16(ftype);
365
	hdr->duration_id = cpu_to_le16(10);
366 367 368 369 370 371 372 373
	memcpy(hdr->addr1, hw->wiphy->perm_addr, ETH_ALEN);
	memcpy(hdr->addr2, hw->wiphy->perm_addr, ETH_ALEN);
	memcpy(hdr->addr3, hw->wiphy->perm_addr, ETH_ALEN);

	memset(&txctl, 0, sizeof(txctl));
	qnum = sc->tx.hwq_map[WME_AC_BE];
	txctl.txq = &sc->tx.txq[qnum];

374
	ath9k_ps_wakeup(sc);
375 376
	ar9003_paprd_init_table(ah);
	for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
377
		if (!(common->tx_chainmask & BIT(chain)))
378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395
			continue;

		chain_ok = 0;
		memset(tx_info, 0, sizeof(*tx_info));
		tx_info->band = band;

		for (i = 0; i < 4; i++) {
			tx_info->control.rates[i].idx = sband->n_bitrates - 1;
			tx_info->control.rates[i].count = 6;
		}

		init_completion(&sc->paprd_complete);
		ar9003_paprd_setup_gain_table(ah, chain);
		txctl.paprd = BIT(chain);
		if (ath_tx_start(hw, skb, &txctl) != 0)
			break;

		time_left = wait_for_completion_timeout(&sc->paprd_complete,
396
				msecs_to_jiffies(ATH_PAPRD_TIMEOUT));
397 398 399 400 401
		if (!time_left) {
			ath_print(ath9k_hw_common(ah), ATH_DBG_CALIBRATE,
				  "Timeout waiting for paprd training on "
				  "TX chain %d\n",
				  chain);
402
			goto fail_paprd;
403 404 405 406 407
		}

		if (!ar9003_paprd_is_done(ah))
			break;

408
		if (ar9003_paprd_create_curve(ah, caldata, chain) != 0)
409 410 411 412 413 414 415
			break;

		chain_ok = 1;
	}
	kfree_skb(skb);

	if (chain_ok) {
416
		caldata->paprd_done = true;
417 418 419
		ath_paprd_activate(sc);
	}

420
fail_paprd:
421 422 423
	ath9k_ps_restore(sc);
}

S
Sujith 已提交
424 425 426 427 428 429 430
/*
 *  This routine performs the periodic noise floor calibration function
 *  that is used to adjust and optimize the chip performance.  This
 *  takes environmental changes (location, temperature) into account.
 *  When the task is complete, it reschedules itself depending on the
 *  appropriate interval that was calculated.
 */
S
Sujith 已提交
431
void ath_ani_calibrate(unsigned long data)
S
Sujith 已提交
432
{
433 434
	struct ath_softc *sc = (struct ath_softc *)data;
	struct ath_hw *ah = sc->sc_ah;
435
	struct ath_common *common = ath9k_hw_common(ah);
S
Sujith 已提交
436 437 438 439
	bool longcal = false;
	bool shortcal = false;
	bool aniflag = false;
	unsigned int timestamp = jiffies_to_msecs(jiffies);
440
	u32 cal_interval, short_cal_interval, long_cal_interval;
441
	unsigned long flags;
442 443 444 445 446

	if (ah->caldata && ah->caldata->nfcal_interference)
		long_cal_interval = ATH_LONG_CALINTERVAL_INT;
	else
		long_cal_interval = ATH_LONG_CALINTERVAL;
S
Sujith 已提交
447

448 449
	short_cal_interval = (ah->opmode == NL80211_IFTYPE_AP) ?
		ATH_AP_SHORT_CALINTERVAL : ATH_STA_SHORT_CALINTERVAL;
S
Sujith 已提交
450

451 452 453 454 455 456
	/* Only calibrate if awake */
	if (sc->sc_ah->power_mode != ATH9K_PM_AWAKE)
		goto set_timer;

	ath9k_ps_wakeup(sc);

S
Sujith 已提交
457
	/* Long calibration runs independently of short calibration. */
458
	if ((timestamp - common->ani.longcal_timer) >= long_cal_interval) {
S
Sujith 已提交
459
		longcal = true;
460
		ath_print(common, ATH_DBG_ANI, "longcal @%lu\n", jiffies);
461
		common->ani.longcal_timer = timestamp;
S
Sujith 已提交
462 463
	}

S
Sujith 已提交
464
	/* Short calibration applies only while caldone is false */
465 466
	if (!common->ani.caldone) {
		if ((timestamp - common->ani.shortcal_timer) >= short_cal_interval) {
S
Sujith 已提交
467
			shortcal = true;
468 469
			ath_print(common, ATH_DBG_ANI,
				  "shortcal @%lu\n", jiffies);
470 471
			common->ani.shortcal_timer = timestamp;
			common->ani.resetcal_timer = timestamp;
S
Sujith 已提交
472 473
		}
	} else {
474
		if ((timestamp - common->ani.resetcal_timer) >=
S
Sujith 已提交
475
		    ATH_RESTART_CALINTERVAL) {
476 477 478
			common->ani.caldone = ath9k_hw_reset_calvalid(ah);
			if (common->ani.caldone)
				common->ani.resetcal_timer = timestamp;
S
Sujith 已提交
479 480 481 482
		}
	}

	/* Verify whether we must check ANI */
483 484
	if ((timestamp - common->ani.checkani_timer) >=
	     ah->config.ani_poll_interval) {
S
Sujith 已提交
485
		aniflag = true;
486
		common->ani.checkani_timer = timestamp;
S
Sujith 已提交
487 488 489 490 491
	}

	/* Skip all processing if there's nothing to do. */
	if (longcal || shortcal || aniflag) {
		/* Call ANI routine if necessary */
492 493
		if (aniflag) {
			spin_lock_irqsave(&common->cc_lock, flags);
494
			ath9k_hw_ani_monitor(ah, ah->curchan);
495
			ath_update_survey_stats(sc);
496 497
			spin_unlock_irqrestore(&common->cc_lock, flags);
		}
S
Sujith 已提交
498 499 500

		/* Perform calibration if necessary */
		if (longcal || shortcal) {
501
			common->ani.caldone =
502 503 504 505
				ath9k_hw_calibrate(ah,
						   ah->curchan,
						   common->rx_chainmask,
						   longcal);
S
Sujith 已提交
506 507 508
		}
	}

509 510
	ath9k_ps_restore(sc);

511
set_timer:
S
Sujith 已提交
512 513 514 515 516
	/*
	* Set timer interval based on previous results.
	* The interval must be the shortest necessary to satisfy ANI,
	* short calibration and long calibration.
	*/
517
	cal_interval = ATH_LONG_CALINTERVAL;
518
	if (sc->sc_ah->config.enable_ani)
519 520
		cal_interval = min(cal_interval,
				   (u32)ah->config.ani_poll_interval);
521
	if (!common->ani.caldone)
522
		cal_interval = min(cal_interval, (u32)short_cal_interval);
S
Sujith 已提交
523

524
	mod_timer(&common->ani.timer, jiffies + msecs_to_jiffies(cal_interval));
525 526
	if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_PAPRD) && ah->caldata) {
		if (!ah->caldata->paprd_done)
527 528 529 530
			ieee80211_queue_work(sc->hw, &sc->paprd_work);
		else
			ath_paprd_activate(sc);
	}
S
Sujith 已提交
531 532 533 534 535
}

/*
 * Update tx/rx chainmask. For legacy association,
 * hard code chainmask to 1x1, for 11n association, use
536 537
 * the chainmask configuration, for bt coexistence, use
 * the chainmask configuration even in legacy mode.
S
Sujith 已提交
538
 */
539
void ath_update_chainmask(struct ath_softc *sc, int is_ht)
S
Sujith 已提交
540
{
541
	struct ath_hw *ah = sc->sc_ah;
542
	struct ath_common *common = ath9k_hw_common(ah);
543

544
	if ((sc->sc_flags & SC_OP_OFFCHANNEL) || is_ht ||
545
	    (ah->btcoex_hw.scheme != ATH_BTCOEX_CFG_NONE)) {
546 547
		common->tx_chainmask = ah->caps.tx_chainmask;
		common->rx_chainmask = ah->caps.rx_chainmask;
S
Sujith 已提交
548
	} else {
549 550
		common->tx_chainmask = 1;
		common->rx_chainmask = 1;
S
Sujith 已提交
551 552
	}

553
	ath_print(common, ATH_DBG_CONFIG,
554
		  "tx chmask: %d, rx chmask: %d\n",
555 556
		  common->tx_chainmask,
		  common->rx_chainmask);
S
Sujith 已提交
557 558 559 560 561 562 563 564
}

static void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta)
{
	struct ath_node *an;

	an = (struct ath_node *)sta->drv_priv;

565
	if (sc->sc_flags & SC_OP_TXAGGR) {
S
Sujith 已提交
566
		ath_tx_node_init(sc, an);
S
Sujith 已提交
567
		an->maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
568 569
				     sta->ht_cap.ampdu_factor);
		an->mpdudensity = parse_mpdudensity(sta->ht_cap.ampdu_density);
570
		an->last_rssi = ATH_RSSI_DUMMY_MARKER;
571
	}
S
Sujith 已提交
572 573 574 575 576 577 578 579 580 581
}

static void ath_node_detach(struct ath_softc *sc, struct ieee80211_sta *sta)
{
	struct ath_node *an = (struct ath_node *)sta->drv_priv;

	if (sc->sc_flags & SC_OP_TXAGGR)
		ath_tx_node_cleanup(sc, an);
}

582 583 584 585 586 587 588 589 590 591 592 593 594
void ath_hw_check(struct work_struct *work)
{
	struct ath_softc *sc = container_of(work, struct ath_softc, hw_check_work);
	int i;

	ath9k_ps_wakeup(sc);

	for (i = 0; i < 3; i++) {
		if (ath9k_hw_check_alive(sc->sc_ah))
			goto out;

		msleep(1);
	}
595
	ath_reset(sc, true);
596 597 598 599 600

out:
	ath9k_ps_restore(sc);
}

S
Sujith 已提交
601
void ath9k_tasklet(unsigned long data)
S
Sujith 已提交
602 603
{
	struct ath_softc *sc = (struct ath_softc *)data;
604
	struct ath_hw *ah = sc->sc_ah;
605
	struct ath_common *common = ath9k_hw_common(ah);
606

S
Sujith 已提交
607
	u32 status = sc->intrstatus;
F
Felix Fietkau 已提交
608
	u32 rxmask;
S
Sujith 已提交
609

610 611
	ath9k_ps_wakeup(sc);

612
	if (status & ATH9K_INT_FATAL) {
613
		ath_reset(sc, true);
614
		ath9k_ps_restore(sc);
S
Sujith 已提交
615
		return;
S
Sujith 已提交
616
	}
S
Sujith 已提交
617

618 619 620
	if (!ath9k_hw_check_alive(ah))
		ieee80211_queue_work(sc->hw, &sc->hw_check_work);

F
Felix Fietkau 已提交
621 622 623 624 625 626 627
	if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
		rxmask = (ATH9K_INT_RXHP | ATH9K_INT_RXLP | ATH9K_INT_RXEOL |
			  ATH9K_INT_RXORN);
	else
		rxmask = (ATH9K_INT_RX | ATH9K_INT_RXEOL | ATH9K_INT_RXORN);

	if (status & rxmask) {
628
		spin_lock_bh(&sc->rx.pcu_lock);
F
Felix Fietkau 已提交
629 630 631 632 633 634 635

		/* Check for high priority Rx first */
		if ((ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) &&
		    (status & ATH9K_INT_RXHP))
			ath_rx_tasklet(sc, 0, true);

		ath_rx_tasklet(sc, 0, false);
636
		spin_unlock_bh(&sc->rx.pcu_lock);
S
Sujith 已提交
637 638
	}

639 640 641 642 643 644
	if (status & ATH9K_INT_TX) {
		if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
			ath_tx_edma_tasklet(sc);
		else
			ath_tx_tasklet(sc);
	}
S
Sujith 已提交
645

646
	if ((status & ATH9K_INT_TSFOOR) && sc->ps_enabled) {
647 648 649 650
		/*
		 * TSF sync does not look correct; remain awake to sync with
		 * the next Beacon.
		 */
651 652
		ath_print(common, ATH_DBG_PS,
			  "TSFOOR - Sync with next Beacon\n");
S
Sujith 已提交
653
		sc->ps_flags |= PS_WAIT_FOR_BEACON | PS_BEACON_SYNC;
654 655
	}

656
	if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE)
657 658 659
		if (status & ATH9K_INT_GENTIMER)
			ath_gen_timer_isr(sc->sc_ah);

S
Sujith 已提交
660
	/* re-enable hardware interrupt */
P
Pavel Roskin 已提交
661
	ath9k_hw_set_interrupts(ah, ah->imask);
662
	ath9k_ps_restore(sc);
S
Sujith 已提交
663 664
}

665
irqreturn_t ath_isr(int irq, void *dev)
S
Sujith 已提交
666
{
S
Sujith 已提交
667 668 669 670 671
#define SCHED_INTR (				\
		ATH9K_INT_FATAL |		\
		ATH9K_INT_RXORN |		\
		ATH9K_INT_RXEOL |		\
		ATH9K_INT_RX |			\
F
Felix Fietkau 已提交
672 673
		ATH9K_INT_RXLP |		\
		ATH9K_INT_RXHP |		\
S
Sujith 已提交
674 675 676
		ATH9K_INT_TX |			\
		ATH9K_INT_BMISS |		\
		ATH9K_INT_CST |			\
677 678
		ATH9K_INT_TSFOOR |		\
		ATH9K_INT_GENTIMER)
S
Sujith 已提交
679

S
Sujith 已提交
680
	struct ath_softc *sc = dev;
681
	struct ath_hw *ah = sc->sc_ah;
682
	struct ath_common *common = ath9k_hw_common(ah);
S
Sujith 已提交
683 684 685
	enum ath9k_int status;
	bool sched = false;

S
Sujith 已提交
686 687 688 689 690 691 692
	/*
	 * The hardware is not ready/present, don't
	 * touch anything. Note this can happen early
	 * on if the IRQ is shared.
	 */
	if (sc->sc_flags & SC_OP_INVALID)
		return IRQ_NONE;
S
Sujith 已提交
693

S
Sujith 已提交
694 695 696

	/* shared irq, not for us */

697
	if (!ath9k_hw_intrpend(ah))
S
Sujith 已提交
698 699 700 701 702 703 704 705 706
		return IRQ_NONE;

	/*
	 * Figure out the reason(s) for the interrupt.  Note
	 * that the hal returns a pseudo-ISR that may include
	 * bits we haven't explicitly enabled so we mask the
	 * value to insure we only process bits we requested.
	 */
	ath9k_hw_getisr(ah, &status);	/* NB: clears ISR too */
P
Pavel Roskin 已提交
707
	status &= ah->imask;	/* discard unasked-for bits */
S
Sujith 已提交
708

S
Sujith 已提交
709 710 711 712
	/*
	 * If there are no status bits set, then this interrupt was not
	 * for me (should have been caught above).
	 */
713
	if (!status)
S
Sujith 已提交
714
		return IRQ_NONE;
S
Sujith 已提交
715

S
Sujith 已提交
716 717 718 719 720 721 722 723 724 725
	/* Cache the status */
	sc->intrstatus = status;

	if (status & SCHED_INTR)
		sched = true;

	/*
	 * If a FATAL or RXORN interrupt is received, we have to reset the
	 * chip immediately.
	 */
F
Felix Fietkau 已提交
726 727
	if ((status & ATH9K_INT_FATAL) || ((status & ATH9K_INT_RXORN) &&
	    !(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)))
S
Sujith 已提交
728 729
		goto chip_reset;

730 731
	if ((ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) &&
	    (status & ATH9K_INT_BB_WATCHDOG)) {
732 733 734

		spin_lock(&common->cc_lock);
		ath_hw_cycle_counters_update(common);
735
		ar9003_hw_bb_watchdog_dbg_info(ah);
736 737
		spin_unlock(&common->cc_lock);

738 739 740
		goto chip_reset;
	}

S
Sujith 已提交
741 742 743 744 745 746
	if (status & ATH9K_INT_SWBA)
		tasklet_schedule(&sc->bcon_tasklet);

	if (status & ATH9K_INT_TXURN)
		ath9k_hw_updatetxtriglevel(ah, true);

F
Felix Fietkau 已提交
747 748 749 750 751 752 753
	if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) {
		if (status & ATH9K_INT_RXEOL) {
			ah->imask &= ~(ATH9K_INT_RXEOL | ATH9K_INT_RXORN);
			ath9k_hw_set_interrupts(ah, ah->imask);
		}
	}

S
Sujith 已提交
754
	if (status & ATH9K_INT_MIB) {
S
Sujith 已提交
755
		/*
S
Sujith 已提交
756 757 758
		 * Disable interrupts until we service the MIB
		 * interrupt; otherwise it will continue to
		 * fire.
S
Sujith 已提交
759
		 */
S
Sujith 已提交
760 761 762 763 764 765
		ath9k_hw_set_interrupts(ah, 0);
		/*
		 * Let the hal handle the event. We assume
		 * it will clear whatever condition caused
		 * the interrupt.
		 */
766
		spin_lock(&common->cc_lock);
767
		ath9k_hw_proc_mib_event(ah);
768
		spin_unlock(&common->cc_lock);
P
Pavel Roskin 已提交
769
		ath9k_hw_set_interrupts(ah, ah->imask);
S
Sujith 已提交
770
	}
S
Sujith 已提交
771

772 773
	if (!(ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
		if (status & ATH9K_INT_TIM_TIMER) {
S
Sujith 已提交
774 775
			/* Clear RxAbort bit so that we can
			 * receive frames */
776
			ath9k_setpower(sc, ATH9K_PM_AWAKE);
777
			ath9k_hw_setrxabort(sc->sc_ah, 0);
S
Sujith 已提交
778
			sc->ps_flags |= PS_WAIT_FOR_BEACON;
S
Sujith 已提交
779
		}
S
Sujith 已提交
780 781

chip_reset:
S
Sujith 已提交
782

783 784
	ath_debug_stat_interrupt(sc, status);

S
Sujith 已提交
785 786
	if (sched) {
		/* turn off every interrupt except SWBA */
P
Pavel Roskin 已提交
787
		ath9k_hw_set_interrupts(ah, (ah->imask & ATH9K_INT_SWBA));
S
Sujith 已提交
788 789 790 791
		tasklet_schedule(&sc->intr_tq);
	}

	return IRQ_HANDLED;
S
Sujith 已提交
792 793

#undef SCHED_INTR
S
Sujith 已提交
794 795
}

796
static u32 ath_get_extchanmode(struct ath_softc *sc,
797
			       struct ieee80211_channel *chan,
S
Sujith 已提交
798
			       enum nl80211_channel_type channel_type)
799 800 801 802 803
{
	u32 chanmode = 0;

	switch (chan->band) {
	case IEEE80211_BAND_2GHZ:
S
Sujith 已提交
804 805 806
		switch(channel_type) {
		case NL80211_CHAN_NO_HT:
		case NL80211_CHAN_HT20:
807
			chanmode = CHANNEL_G_HT20;
S
Sujith 已提交
808 809
			break;
		case NL80211_CHAN_HT40PLUS:
810
			chanmode = CHANNEL_G_HT40PLUS;
S
Sujith 已提交
811 812
			break;
		case NL80211_CHAN_HT40MINUS:
813
			chanmode = CHANNEL_G_HT40MINUS;
S
Sujith 已提交
814 815
			break;
		}
816 817
		break;
	case IEEE80211_BAND_5GHZ:
S
Sujith 已提交
818 819 820
		switch(channel_type) {
		case NL80211_CHAN_NO_HT:
		case NL80211_CHAN_HT20:
821
			chanmode = CHANNEL_A_HT20;
S
Sujith 已提交
822 823
			break;
		case NL80211_CHAN_HT40PLUS:
824
			chanmode = CHANNEL_A_HT40PLUS;
S
Sujith 已提交
825 826
			break;
		case NL80211_CHAN_HT40MINUS:
827
			chanmode = CHANNEL_A_HT40MINUS;
S
Sujith 已提交
828 829
			break;
		}
830 831 832 833 834 835 836 837
		break;
	default:
		break;
	}

	return chanmode;
}

838
static void ath9k_bss_assoc_info(struct ath_softc *sc,
S
Sujith 已提交
839
				 struct ieee80211_vif *vif,
840
				 struct ieee80211_bss_conf *bss_conf)
841
{
842
	struct ath_hw *ah = sc->sc_ah;
843
	struct ath_common *common = ath9k_hw_common(ah);
844

845
	if (bss_conf->assoc) {
846 847 848
		ath_print(common, ATH_DBG_CONFIG,
			  "Bss Info ASSOC %d, bssid: %pM\n",
			   bss_conf->aid, common->curbssid);
849

850
		/* New association, store aid */
851
		common->curaid = bss_conf->aid;
852
		ath9k_hw_write_associd(ah);
853 854 855 856 857 858

		/*
		 * Request a re-configuration of Beacon related timers
		 * on the receipt of the first Beacon frame (i.e.,
		 * after time sync with the AP).
		 */
S
Sujith 已提交
859
		sc->ps_flags |= PS_BEACON_SYNC;
860

861
		/* Configure the beacon */
862
		ath_beacon_config(sc, vif);
863

864
		/* Reset rssi stats */
865
		sc->sc_ah->stats.avgbrssi = ATH_RSSI_DUMMY_MARKER;
866

867
		sc->sc_flags |= SC_OP_ANI_RUN;
868
		ath_start_ani(common);
869
	} else {
870
		ath_print(common, ATH_DBG_CONFIG, "Bss Info DISASSOC\n");
871
		common->curaid = 0;
872
		/* Stop ANI */
873
		sc->sc_flags &= ~SC_OP_ANI_RUN;
874
		del_timer_sync(&common->ani.timer);
875
	}
876
}
877

878
void ath_radio_enable(struct ath_softc *sc, struct ieee80211_hw *hw)
879
{
880
	struct ath_hw *ah = sc->sc_ah;
881
	struct ath_common *common = ath9k_hw_common(ah);
882
	struct ieee80211_channel *channel = hw->conf.channel;
883
	int r;
884

885
	ath9k_ps_wakeup(sc);
V
Vivek Natarajan 已提交
886
	ath9k_hw_configpcipowersave(ah, 0, 0);
887

888 889 890
	if (!ah->curchan)
		ah->curchan = ath_get_curchannel(sc, sc->hw);

891
	spin_lock_bh(&sc->rx.pcu_lock);
S
Sujith 已提交
892
	spin_lock_bh(&sc->sc_resetlock);
893
	r = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false);
894
	if (r) {
895
		ath_print(common, ATH_DBG_FATAL,
896
			  "Unable to reset channel (%u MHz), "
897 898
			  "reset status %d\n",
			  channel->center_freq, r);
899 900 901 902 903
	}
	spin_unlock_bh(&sc->sc_resetlock);

	ath_update_txpow(sc);
	if (ath_startrecv(sc) != 0) {
904 905
		ath_print(common, ATH_DBG_FATAL,
			  "Unable to restart recv logic\n");
906
		spin_unlock_bh(&sc->rx.pcu_lock);
907 908
		return;
	}
909
	spin_unlock_bh(&sc->rx.pcu_lock);
910 911

	if (sc->sc_flags & SC_OP_BEACONS)
912
		ath_beacon_config(sc, NULL);	/* restart beacons */
913 914

	/* Re-Enable  interrupts */
P
Pavel Roskin 已提交
915
	ath9k_hw_set_interrupts(ah, ah->imask);
916 917

	/* Enable LED */
918
	ath9k_hw_cfg_output(ah, ah->led_pin,
919
			    AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
920
	ath9k_hw_set_gpio(ah, ah->led_pin, 0);
921

922
	ieee80211_wake_queues(hw);
923
	ath9k_ps_restore(sc);
924 925
}

926
void ath_radio_disable(struct ath_softc *sc, struct ieee80211_hw *hw)
927
{
928
	struct ath_hw *ah = sc->sc_ah;
929
	struct ieee80211_channel *channel = hw->conf.channel;
930
	int r;
931

932
	ath9k_ps_wakeup(sc);
933
	ieee80211_stop_queues(hw);
934

935 936 937 938 939 940 941 942
	/*
	 * Keep the LED on when the radio is disabled
	 * during idle unassociated state.
	 */
	if (!sc->ps_idle) {
		ath9k_hw_set_gpio(ah, ah->led_pin, 1);
		ath9k_hw_cfg_gpio_input(ah, ah->led_pin);
	}
943 944 945 946

	/* Disable interrupts */
	ath9k_hw_set_interrupts(ah, 0);

S
Sujith 已提交
947
	ath_drain_all_txq(sc, false);	/* clear pending tx frames */
948 949 950

	spin_lock_bh(&sc->rx.pcu_lock);

951 952 953
	ath_stoprecv(sc);		/* turn off frame recv */
	ath_flushrecv(sc);		/* flush recv queue */

954
	if (!ah->curchan)
955
		ah->curchan = ath_get_curchannel(sc, hw);
956

957
	spin_lock_bh(&sc->sc_resetlock);
958
	r = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false);
959
	if (r) {
960
		ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_FATAL,
961
			  "Unable to reset channel (%u MHz), "
962 963
			  "reset status %d\n",
			  channel->center_freq, r);
964 965 966 967
	}
	spin_unlock_bh(&sc->sc_resetlock);

	ath9k_hw_phy_disable(ah);
968 969 970

	spin_unlock_bh(&sc->rx.pcu_lock);

V
Vivek Natarajan 已提交
971
	ath9k_hw_configpcipowersave(ah, 1, 1);
972
	ath9k_ps_restore(sc);
973
	ath9k_setpower(sc, ATH9K_PM_FULL_SLEEP);
974 975
}

S
Sujith 已提交
976 977
int ath_reset(struct ath_softc *sc, bool retry_tx)
{
978
	struct ath_hw *ah = sc->sc_ah;
979
	struct ath_common *common = ath9k_hw_common(ah);
980
	struct ieee80211_hw *hw = sc->hw;
981
	int r;
S
Sujith 已提交
982

S
Sujith 已提交
983 984 985
	/* Stop ANI */
	del_timer_sync(&common->ani.timer);

S
Sujith 已提交
986 987
	ieee80211_stop_queues(hw);

S
Sujith 已提交
988
	ath9k_hw_set_interrupts(ah, 0);
S
Sujith 已提交
989
	ath_drain_all_txq(sc, retry_tx);
990 991 992

	spin_lock_bh(&sc->rx.pcu_lock);

S
Sujith 已提交
993 994 995 996
	ath_stoprecv(sc);
	ath_flushrecv(sc);

	spin_lock_bh(&sc->sc_resetlock);
997
	r = ath9k_hw_reset(ah, sc->sc_ah->curchan, ah->caldata, false);
998
	if (r)
999 1000
		ath_print(common, ATH_DBG_FATAL,
			  "Unable to reset hardware; reset status %d\n", r);
S
Sujith 已提交
1001 1002 1003
	spin_unlock_bh(&sc->sc_resetlock);

	if (ath_startrecv(sc) != 0)
1004 1005
		ath_print(common, ATH_DBG_FATAL,
			  "Unable to start recv logic\n");
S
Sujith 已提交
1006

1007 1008
	spin_unlock_bh(&sc->rx.pcu_lock);

S
Sujith 已提交
1009 1010 1011 1012 1013 1014 1015
	/*
	 * We may be doing a reset in response to a request
	 * that changes the channel so update any state that
	 * might change as a result.
	 */
	ath_update_txpow(sc);

1016
	if ((sc->sc_flags & SC_OP_BEACONS) || !(sc->sc_flags & (SC_OP_OFFCHANNEL)))
1017
		ath_beacon_config(sc, NULL);	/* restart beacons */
S
Sujith 已提交
1018

P
Pavel Roskin 已提交
1019
	ath9k_hw_set_interrupts(ah, ah->imask);
S
Sujith 已提交
1020 1021 1022 1023 1024

	if (retry_tx) {
		int i;
		for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
			if (ATH_TXQ_SETUP(sc, i)) {
S
Sujith 已提交
1025 1026 1027
				spin_lock_bh(&sc->tx.txq[i].axq_lock);
				ath_txq_schedule(sc, &sc->tx.txq[i]);
				spin_unlock_bh(&sc->tx.txq[i].axq_lock);
S
Sujith 已提交
1028 1029 1030 1031
			}
		}
	}

S
Sujith 已提交
1032 1033
	ieee80211_wake_queues(hw);

S
Sujith 已提交
1034 1035 1036
	/* Start ANI */
	ath_start_ani(common);

1037
	return r;
S
Sujith 已提交
1038 1039
}

1040
static int ath_get_hal_qnum(u16 queue, struct ath_softc *sc)
S
Sujith 已提交
1041 1042 1043 1044 1045
{
	int qnum;

	switch (queue) {
	case 0:
1046
		qnum = sc->tx.hwq_map[WME_AC_VO];
S
Sujith 已提交
1047 1048
		break;
	case 1:
1049
		qnum = sc->tx.hwq_map[WME_AC_VI];
S
Sujith 已提交
1050 1051
		break;
	case 2:
1052
		qnum = sc->tx.hwq_map[WME_AC_BE];
S
Sujith 已提交
1053 1054
		break;
	case 3:
1055
		qnum = sc->tx.hwq_map[WME_AC_BK];
S
Sujith 已提交
1056 1057
		break;
	default:
1058
		qnum = sc->tx.hwq_map[WME_AC_BE];
S
Sujith 已提交
1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069
		break;
	}

	return qnum;
}

int ath_get_mac80211_qnum(u32 queue, struct ath_softc *sc)
{
	int qnum;

	switch (queue) {
1070
	case WME_AC_VO:
S
Sujith 已提交
1071 1072
		qnum = 0;
		break;
1073
	case WME_AC_VI:
S
Sujith 已提交
1074 1075
		qnum = 1;
		break;
1076
	case WME_AC_BE:
S
Sujith 已提交
1077 1078
		qnum = 2;
		break;
1079
	case WME_AC_BK:
S
Sujith 已提交
1080 1081 1082 1083 1084 1085 1086 1087 1088 1089
		qnum = 3;
		break;
	default:
		qnum = -1;
		break;
	}

	return qnum;
}

1090 1091
/* XXX: Remove me once we don't depend on ath9k_channel for all
 * this redundant data */
1092 1093
void ath9k_update_ichannel(struct ath_softc *sc, struct ieee80211_hw *hw,
			   struct ath9k_channel *ichan)
1094 1095 1096 1097 1098 1099 1100 1101 1102
{
	struct ieee80211_channel *chan = hw->conf.channel;
	struct ieee80211_conf *conf = &hw->conf;

	ichan->channel = chan->center_freq;
	ichan->chan = chan;

	if (chan->band == IEEE80211_BAND_2GHZ) {
		ichan->chanmode = CHANNEL_G;
S
Sujith 已提交
1103
		ichan->channelFlags = CHANNEL_2GHZ | CHANNEL_OFDM | CHANNEL_G;
1104 1105 1106 1107 1108
	} else {
		ichan->chanmode = CHANNEL_A;
		ichan->channelFlags = CHANNEL_5GHZ | CHANNEL_OFDM;
	}

L
Luis R. Rodriguez 已提交
1109
	if (conf_is_ht(conf))
1110 1111 1112 1113
		ichan->chanmode = ath_get_extchanmode(sc, chan,
					    conf->channel_type);
}

S
Sujith 已提交
1114 1115 1116 1117
/**********************/
/* mac80211 callbacks */
/**********************/

1118
static int ath9k_start(struct ieee80211_hw *hw)
1119
{
1120 1121
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1122
	struct ath_hw *ah = sc->sc_ah;
1123
	struct ath_common *common = ath9k_hw_common(ah);
1124
	struct ieee80211_channel *curchan = hw->conf.channel;
S
Sujith 已提交
1125
	struct ath9k_channel *init_channel;
1126
	int r;
1127

1128 1129 1130
	ath_print(common, ATH_DBG_CONFIG,
		  "Starting driver with initial channel: %d MHz\n",
		  curchan->center_freq);
1131

1132 1133
	mutex_lock(&sc->mutex);

1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154
	if (ath9k_wiphy_started(sc)) {
		if (sc->chan_idx == curchan->hw_value) {
			/*
			 * Already on the operational channel, the new wiphy
			 * can be marked active.
			 */
			aphy->state = ATH_WIPHY_ACTIVE;
			ieee80211_wake_queues(hw);
		} else {
			/*
			 * Another wiphy is on another channel, start the new
			 * wiphy in paused state.
			 */
			aphy->state = ATH_WIPHY_PAUSED;
			ieee80211_stop_queues(hw);
		}
		mutex_unlock(&sc->mutex);
		return 0;
	}
	aphy->state = ATH_WIPHY_ACTIVE;

1155
	/* setup initial channel */
1156

1157
	sc->chan_idx = curchan->hw_value;
1158

1159
	init_channel = ath_get_curchannel(sc, hw);
S
Sujith 已提交
1160 1161

	/* Reset SERDES registers */
1162
	ath9k_hw_configpcipowersave(ah, 0, 0);
S
Sujith 已提交
1163 1164 1165 1166 1167 1168 1169 1170

	/*
	 * The basic interface to setting the hardware in a good
	 * state is ``reset''.  On return the hardware is known to
	 * be powered up and with interrupts disabled.  This must
	 * be followed by initialization of the appropriate bits
	 * and then setup of the interrupt mask.
	 */
1171
	spin_lock_bh(&sc->rx.pcu_lock);
S
Sujith 已提交
1172
	spin_lock_bh(&sc->sc_resetlock);
1173
	r = ath9k_hw_reset(ah, init_channel, ah->caldata, false);
1174
	if (r) {
1175 1176 1177 1178
		ath_print(common, ATH_DBG_FATAL,
			  "Unable to reset hardware; reset status %d "
			  "(freq %u MHz)\n", r,
			  curchan->center_freq);
S
Sujith 已提交
1179
		spin_unlock_bh(&sc->sc_resetlock);
1180
		spin_unlock_bh(&sc->rx.pcu_lock);
1181
		goto mutex_unlock;
S
Sujith 已提交
1182 1183 1184 1185 1186 1187 1188 1189
	}
	spin_unlock_bh(&sc->sc_resetlock);

	/*
	 * This is needed only to setup initial state
	 * but it's best done after a reset.
	 */
	ath_update_txpow(sc);
1190

S
Sujith 已提交
1191 1192 1193 1194 1195 1196 1197 1198
	/*
	 * Setup the hardware after reset:
	 * The receive engine is set going.
	 * Frame transmit is handled entirely
	 * in the frame output path; there's nothing to do
	 * here except setup the interrupt mask.
	 */
	if (ath_startrecv(sc) != 0) {
1199 1200
		ath_print(common, ATH_DBG_FATAL,
			  "Unable to start recv logic\n");
1201
		r = -EIO;
1202
		spin_unlock_bh(&sc->rx.pcu_lock);
1203
		goto mutex_unlock;
1204
	}
1205
	spin_unlock_bh(&sc->rx.pcu_lock);
1206

S
Sujith 已提交
1207
	/* Setup our intr mask. */
F
Felix Fietkau 已提交
1208 1209 1210 1211 1212
	ah->imask = ATH9K_INT_TX | ATH9K_INT_RXEOL |
		    ATH9K_INT_RXORN | ATH9K_INT_FATAL |
		    ATH9K_INT_GLOBAL;

	if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
1213 1214 1215
		ah->imask |= ATH9K_INT_RXHP |
			     ATH9K_INT_RXLP |
			     ATH9K_INT_BB_WATCHDOG;
F
Felix Fietkau 已提交
1216 1217
	else
		ah->imask |= ATH9K_INT_RX;
S
Sujith 已提交
1218

1219
	ah->imask |= ATH9K_INT_GTT;
S
Sujith 已提交
1220

1221
	if (ah->caps.hw_caps & ATH9K_HW_CAP_HT)
P
Pavel Roskin 已提交
1222
		ah->imask |= ATH9K_INT_CST;
S
Sujith 已提交
1223 1224

	sc->sc_flags &= ~SC_OP_INVALID;
1225
	sc->sc_ah->is_monitoring = false;
S
Sujith 已提交
1226 1227

	/* Disable BMISS interrupt when we're not associated */
P
Pavel Roskin 已提交
1228 1229
	ah->imask &= ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS);
	ath9k_hw_set_interrupts(ah, ah->imask);
S
Sujith 已提交
1230

1231
	ieee80211_wake_queues(hw);
S
Sujith 已提交
1232

1233
	ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0);
1234

1235 1236
	if ((ah->btcoex_hw.scheme != ATH_BTCOEX_CFG_NONE) &&
	    !ah->btcoex_hw.enabled) {
1237 1238
		ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT,
					   AR_STOMP_LOW_WLAN_WGHT);
1239
		ath9k_hw_btcoex_enable(ah);
1240

1241 1242
		if (common->bus_ops->bt_coex_prep)
			common->bus_ops->bt_coex_prep(common);
1243
		if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE)
1244
			ath9k_btcoex_timer_resume(sc);
1245 1246
	}

1247
	pm_qos_update_request(&sc->pm_qos_req, 55);
1248

1249 1250 1251
mutex_unlock:
	mutex_unlock(&sc->mutex);

1252
	return r;
1253 1254
}

1255 1256
static int ath9k_tx(struct ieee80211_hw *hw,
		    struct sk_buff *skb)
1257
{
S
Sujith 已提交
1258
	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1259 1260
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1261
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
S
Sujith 已提交
1262
	struct ath_tx_control txctl;
1263 1264
	int padpos, padsize;
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
1265
	int qnum;
S
Sujith 已提交
1266

1267
	if (aphy->state != ATH_WIPHY_ACTIVE && aphy->state != ATH_WIPHY_SCAN) {
1268 1269 1270
		ath_print(common, ATH_DBG_XMIT,
			  "ath9k: %s: TX in unexpected wiphy state "
			  "%d\n", wiphy_name(hw->wiphy), aphy->state);
1271 1272 1273
		goto exit;
	}

1274
	if (sc->ps_enabled) {
1275 1276 1277 1278 1279 1280 1281
		/*
		 * mac80211 does not set PM field for normal data frames, so we
		 * need to update that based on the current PS mode.
		 */
		if (ieee80211_is_data(hdr->frame_control) &&
		    !ieee80211_is_nullfunc(hdr->frame_control) &&
		    !ieee80211_has_pm(hdr->frame_control)) {
1282 1283
			ath_print(common, ATH_DBG_PS, "Add PM=1 for a TX frame "
				  "while in PS mode\n");
1284 1285 1286 1287
			hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM);
		}
	}

1288 1289 1290 1291 1292 1293 1294
	if (unlikely(sc->sc_ah->power_mode != ATH9K_PM_AWAKE)) {
		/*
		 * We are using PS-Poll and mac80211 can request TX while in
		 * power save mode. Need to wake up hardware for the TX to be
		 * completed and if needed, also for RX of buffered frames.
		 */
		ath9k_ps_wakeup(sc);
1295 1296
		if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
			ath9k_hw_setrxabort(sc->sc_ah, 0);
1297
		if (ieee80211_is_pspoll(hdr->frame_control)) {
1298 1299
			ath_print(common, ATH_DBG_PS,
				  "Sending PS-Poll to pick a buffered frame\n");
S
Sujith 已提交
1300
			sc->ps_flags |= PS_WAIT_FOR_PSPOLL_DATA;
1301
		} else {
1302 1303
			ath_print(common, ATH_DBG_PS,
				  "Wake up to complete TX\n");
S
Sujith 已提交
1304
			sc->ps_flags |= PS_WAIT_FOR_TX_ACK;
1305 1306 1307 1308 1309 1310 1311 1312 1313
		}
		/*
		 * The actual restore operation will happen only after
		 * the sc_flags bit is cleared. We are just dropping
		 * the ps_usecount here.
		 */
		ath9k_ps_restore(sc);
	}

S
Sujith 已提交
1314
	memset(&txctl, 0, sizeof(struct ath_tx_control));
1315

1316 1317 1318 1319 1320 1321 1322
	/*
	 * As a temporary workaround, assign seq# here; this will likely need
	 * to be cleaned up to work better with Beacon transmission and virtual
	 * BSSes.
	 */
	if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) {
		if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)
S
Sujith 已提交
1323
			sc->tx.seq_no += 0x10;
1324
		hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
S
Sujith 已提交
1325
		hdr->seq_ctrl |= cpu_to_le16(sc->tx.seq_no);
1326
	}
1327

1328
	/* Add the padding after the header if this is not already done */
1329 1330 1331
	padpos = ath9k_cmn_padpos(hdr->frame_control);
	padsize = padpos & 3;
	if (padsize && skb->len>padpos) {
1332 1333 1334
		if (skb_headroom(skb) < padsize)
			return -1;
		skb_push(skb, padsize);
1335
		memmove(skb->data, skb->data + padsize, padpos);
1336 1337
	}

1338 1339
	qnum = ath_get_hal_qnum(skb_get_queue_mapping(skb), sc);
	txctl.txq = &sc->tx.txq[qnum];
S
Sujith 已提交
1340

1341
	ath_print(common, ATH_DBG_XMIT, "transmitting packet, skb: %p\n", skb);
1342

1343
	if (ath_tx_start(hw, skb, &txctl) != 0) {
1344
		ath_print(common, ATH_DBG_XMIT, "TX failed\n");
S
Sujith 已提交
1345
		goto exit;
1346 1347
	}

S
Sujith 已提交
1348 1349 1350
	return 0;
exit:
	dev_kfree_skb_any(skb);
1351
	return 0;
1352 1353
}

1354
static void ath9k_stop(struct ieee80211_hw *hw)
1355
{
1356 1357
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1358
	struct ath_hw *ah = sc->sc_ah;
1359
	struct ath_common *common = ath9k_hw_common(ah);
1360
	int i;
1361

S
Sujith 已提交
1362 1363
	mutex_lock(&sc->mutex);

1364 1365
	aphy->state = ATH_WIPHY_INACTIVE;

1366 1367 1368
	if (led_blink)
		cancel_delayed_work_sync(&sc->ath_led_blink_work);

1369
	cancel_delayed_work_sync(&sc->tx_complete_work);
1370
	cancel_work_sync(&sc->paprd_work);
1371
	cancel_work_sync(&sc->hw_check_work);
1372

1373 1374 1375 1376 1377 1378
	for (i = 0; i < sc->num_sec_wiphy; i++) {
		if (sc->sec_wiphy[i])
			break;
	}

	if (i == sc->num_sec_wiphy) {
1379 1380 1381 1382
		cancel_delayed_work_sync(&sc->wiphy_work);
		cancel_work_sync(&sc->chan_work);
	}

S
Sujith 已提交
1383
	if (sc->sc_flags & SC_OP_INVALID) {
1384
		ath_print(common, ATH_DBG_ANY, "Device not present\n");
S
Sujith 已提交
1385
		mutex_unlock(&sc->mutex);
S
Sujith 已提交
1386 1387
		return;
	}
1388

1389 1390 1391 1392 1393
	if (ath9k_wiphy_started(sc)) {
		mutex_unlock(&sc->mutex);
		return; /* another wiphy still in use */
	}

1394 1395 1396
	/* Ensure HW is awake when we try to shut it down. */
	ath9k_ps_wakeup(sc);

1397
	if (ah->btcoex_hw.enabled) {
1398
		ath9k_hw_btcoex_disable(ah);
1399
		if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE)
1400
			ath9k_btcoex_timer_pause(sc);
1401 1402
	}

S
Sujith 已提交
1403 1404
	/* make sure h/w will not generate any interrupt
	 * before setting the invalid flag. */
1405
	ath9k_hw_set_interrupts(ah, 0);
S
Sujith 已提交
1406

1407
	spin_lock_bh(&sc->rx.pcu_lock);
S
Sujith 已提交
1408
	if (!(sc->sc_flags & SC_OP_INVALID)) {
S
Sujith 已提交
1409
		ath_drain_all_txq(sc, false);
S
Sujith 已提交
1410
		ath_stoprecv(sc);
1411
		ath9k_hw_phy_disable(ah);
S
Sujith 已提交
1412
	} else
S
Sujith 已提交
1413
		sc->rx.rxlink = NULL;
1414
	spin_unlock_bh(&sc->rx.pcu_lock);
S
Sujith 已提交
1415 1416

	/* disable HAL and put h/w to sleep */
1417 1418
	ath9k_hw_disable(ah);
	ath9k_hw_configpcipowersave(ah, 1, 1);
1419 1420 1421
	ath9k_ps_restore(sc);

	/* Finally, put the chip in FULL SLEEP mode */
1422
	ath9k_setpower(sc, ATH9K_PM_FULL_SLEEP);
S
Sujith 已提交
1423 1424

	sc->sc_flags |= SC_OP_INVALID;
1425

1426
	pm_qos_update_request(&sc->pm_qos_req, PM_QOS_DEFAULT_VALUE);
1427

1428 1429
	mutex_unlock(&sc->mutex);

1430
	ath_print(common, ATH_DBG_CONFIG, "Driver halt\n");
1431 1432
}

1433
static int ath9k_add_interface(struct ieee80211_hw *hw,
1434
			       struct ieee80211_vif *vif)
1435
{
1436 1437
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
P
Pavel Roskin 已提交
1438 1439
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
1440
	struct ath_vif *avp = (void *)vif->drv_priv;
1441
	enum nl80211_iftype ic_opmode = NL80211_IFTYPE_UNSPECIFIED;
1442
	int ret = 0;
1443

1444 1445
	mutex_lock(&sc->mutex);

1446
	switch (vif->type) {
1447
	case NL80211_IFTYPE_STATION:
1448
		ic_opmode = NL80211_IFTYPE_STATION;
1449
		break;
B
Bill Jordan 已提交
1450 1451 1452
	case NL80211_IFTYPE_WDS:
		ic_opmode = NL80211_IFTYPE_WDS;
		break;
1453 1454
	case NL80211_IFTYPE_ADHOC:
	case NL80211_IFTYPE_AP:
1455
	case NL80211_IFTYPE_MESH_POINT:
1456 1457 1458 1459
		if (sc->nbcnvifs >= ATH_BCBUF) {
			ret = -ENOBUFS;
			goto out;
		}
1460
		ic_opmode = vif->type;
1461 1462
		break;
	default:
1463
		ath_print(common, ATH_DBG_FATAL,
1464
			"Interface type %d not yet supported\n", vif->type);
1465 1466
		ret = -EOPNOTSUPP;
		goto out;
1467 1468
	}

1469 1470
	ath_print(common, ATH_DBG_CONFIG,
		  "Attach a VIF of type: %d\n", ic_opmode);
1471

S
Sujith 已提交
1472
	/* Set the VIF opmode */
S
Sujith 已提交
1473 1474 1475
	avp->av_opmode = ic_opmode;
	avp->av_bslot = -1;

1476
	sc->nvifs++;
1477

1478
	ath9k_set_bssid_mask(hw, vif);
1479

1480 1481 1482
	if (sc->nvifs > 1)
		goto out; /* skip global settings for secondary vif */

S
Sujith 已提交
1483
	if (ic_opmode == NL80211_IFTYPE_AP) {
P
Pavel Roskin 已提交
1484
		ath9k_hw_set_tsfadjust(ah, 1);
S
Sujith 已提交
1485 1486
		sc->sc_flags |= SC_OP_TSF_RESET;
	}
S
Sujith 已提交
1487 1488

	/* Set the device opmode */
P
Pavel Roskin 已提交
1489
	ah->opmode = ic_opmode;
S
Sujith 已提交
1490

1491 1492 1493 1494
	/*
	 * Enable MIB interrupts when there are hardware phy counters.
	 * Note we only do this (at the moment) for station mode.
	 */
1495 1496 1497
	if ((vif->type == NL80211_IFTYPE_STATION) ||
	    (vif->type == NL80211_IFTYPE_ADHOC) ||
	    (vif->type == NL80211_IFTYPE_MESH_POINT)) {
1498 1499
		if (ah->config.enable_ani)
			ah->imask |= ATH9K_INT_MIB;
P
Pavel Roskin 已提交
1500
		ah->imask |= ATH9K_INT_TSFOOR;
1501 1502
	}

P
Pavel Roskin 已提交
1503
	ath9k_hw_set_interrupts(ah, ah->imask);
1504

1505
	if (vif->type == NL80211_IFTYPE_AP    ||
1506
	    vif->type == NL80211_IFTYPE_ADHOC) {
1507
		sc->sc_flags |= SC_OP_ANI_RUN;
1508
		ath_start_ani(common);
1509
	}
1510

1511
out:
1512
	mutex_unlock(&sc->mutex);
1513
	return ret;
1514 1515
}

1516
static void ath9k_remove_interface(struct ieee80211_hw *hw,
1517
				   struct ieee80211_vif *vif)
1518
{
1519 1520
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1521
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1522
	struct ath_vif *avp = (void *)vif->drv_priv;
1523
	bool bs_valid = false;
1524
	int i;
1525

1526
	ath_print(common, ATH_DBG_CONFIG, "Detach Interface\n");
1527

1528 1529
	mutex_lock(&sc->mutex);

1530
	/* Stop ANI */
1531
	sc->sc_flags &= ~SC_OP_ANI_RUN;
1532
	del_timer_sync(&common->ani.timer);
J
Jouni Malinen 已提交
1533

1534
	/* Reclaim beacon resources */
1535 1536 1537
	if ((sc->sc_ah->opmode == NL80211_IFTYPE_AP) ||
	    (sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC) ||
	    (sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT)) {
1538
		ath9k_ps_wakeup(sc);
S
Sujith 已提交
1539
		ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq);
1540
		ath9k_ps_restore(sc);
J
Jouni Malinen 已提交
1541
	}
1542

1543
	ath_beacon_return(sc, avp);
1544
	sc->sc_flags &= ~SC_OP_BEACONS;
1545

1546
	for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++) {
1547
		if (sc->beacon.bslot[i] == vif) {
1548 1549 1550
			printk(KERN_DEBUG "%s: vif had allocated beacon "
			       "slot\n", __func__);
			sc->beacon.bslot[i] = NULL;
1551
			sc->beacon.bslot_aphy[i] = NULL;
1552 1553 1554 1555 1556 1557 1558 1559 1560
		} else if (sc->beacon.bslot[i])
			bs_valid = true;
	}
	if (!bs_valid && (sc->sc_ah->imask & ATH9K_INT_SWBA)) {
		/* Disable SWBA interrupt */
		sc->sc_ah->imask &= ~ATH9K_INT_SWBA;
		ath9k_ps_wakeup(sc);
		ath9k_hw_set_interrupts(sc->sc_ah, sc->sc_ah->imask);
		ath9k_ps_restore(sc);
1561 1562
	}

S
Sujith 已提交
1563
	sc->nvifs--;
1564 1565

	mutex_unlock(&sc->mutex);
1566 1567
}

1568
static void ath9k_enable_ps(struct ath_softc *sc)
1569
{
P
Pavel Roskin 已提交
1570 1571
	struct ath_hw *ah = sc->sc_ah;

1572
	sc->ps_enabled = true;
P
Pavel Roskin 已提交
1573 1574 1575 1576
	if (!(ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) {
		if ((ah->imask & ATH9K_INT_TIM_TIMER) == 0) {
			ah->imask |= ATH9K_INT_TIM_TIMER;
			ath9k_hw_set_interrupts(ah, ah->imask);
1577
		}
1578
		ath9k_hw_setrxabort(ah, 1);
1579 1580 1581
	}
}

1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601
static void ath9k_disable_ps(struct ath_softc *sc)
{
	struct ath_hw *ah = sc->sc_ah;

	sc->ps_enabled = false;
	ath9k_hw_setpower(ah, ATH9K_PM_AWAKE);
	if (!(ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) {
		ath9k_hw_setrxabort(ah, 0);
		sc->ps_flags &= ~(PS_WAIT_FOR_BEACON |
				  PS_WAIT_FOR_CAB |
				  PS_WAIT_FOR_PSPOLL_DATA |
				  PS_WAIT_FOR_TX_ACK);
		if (ah->imask & ATH9K_INT_TIM_TIMER) {
			ah->imask &= ~ATH9K_INT_TIM_TIMER;
			ath9k_hw_set_interrupts(ah, ah->imask);
		}
	}

}

1602
static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
1603
{
1604 1605
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1606 1607
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
1608
	struct ieee80211_conf *conf = &hw->conf;
1609
	bool disable_radio;
1610

1611
	mutex_lock(&sc->mutex);
1612

1613 1614 1615 1616 1617 1618
	/*
	 * Leave this as the first check because we need to turn on the
	 * radio if it was disabled before prior to processing the rest
	 * of the changes. Likewise we must only disable the radio towards
	 * the end.
	 */
1619
	if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1620 1621 1622
		bool enable_radio;
		bool all_wiphys_idle;
		bool idle = !!(conf->flags & IEEE80211_CONF_IDLE);
1623 1624 1625

		spin_lock_bh(&sc->wiphy_lock);
		all_wiphys_idle =  ath9k_all_wiphys_idle(sc);
1626 1627
		ath9k_set_wiphy_idle(aphy, idle);

1628
		enable_radio = (!idle && all_wiphys_idle);
1629 1630 1631 1632 1633 1634 1635

		/*
		 * After we unlock here its possible another wiphy
		 * can be re-renabled so to account for that we will
		 * only disable the radio toward the end of this routine
		 * if by then all wiphys are still idle.
		 */
1636 1637
		spin_unlock_bh(&sc->wiphy_lock);

1638
		if (enable_radio) {
1639
			sc->ps_idle = false;
1640
			ath_radio_enable(sc, hw);
1641 1642
			ath_print(common, ATH_DBG_CONFIG,
				  "not-idle: enabling radio\n");
1643 1644 1645
		}
	}

1646 1647 1648 1649 1650 1651
	/*
	 * We just prepare to enable PS. We have to wait until our AP has
	 * ACK'd our null data frame to disable RX otherwise we'll ignore
	 * those ACKs and end up retransmitting the same null data frames.
	 * IEEE80211_CONF_CHANGE_PS is only passed by mac80211 for STA mode.
	 */
1652
	if (changed & IEEE80211_CONF_CHANGE_PS) {
1653 1654
		unsigned long flags;
		spin_lock_irqsave(&sc->sc_pm_lock, flags);
1655 1656
		if (conf->flags & IEEE80211_CONF_PS)
			ath9k_enable_ps(sc);
1657 1658
		else
			ath9k_disable_ps(sc);
1659
		spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
1660 1661
	}

S
Sujith 已提交
1662 1663 1664
	if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
		if (conf->flags & IEEE80211_CONF_MONITOR) {
			ath_print(common, ATH_DBG_CONFIG,
1665 1666 1667 1668 1669 1670
				  "Monitor mode is enabled\n");
			sc->sc_ah->is_monitoring = true;
		} else {
			ath_print(common, ATH_DBG_CONFIG,
				  "Monitor mode is disabled\n");
			sc->sc_ah->is_monitoring = false;
S
Sujith 已提交
1671 1672 1673
		}
	}

1674
	if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
1675
		struct ieee80211_channel *curchan = hw->conf.channel;
1676
		int pos = curchan->hw_value;
1677 1678 1679 1680 1681
		int old_pos = -1;
		unsigned long flags;

		if (ah->curchan)
			old_pos = ah->curchan - &ah->channels[0];
J
Johannes Berg 已提交
1682

1683 1684
		aphy->chan_idx = pos;
		aphy->chan_is_ht = conf_is_ht(conf);
1685 1686 1687 1688
		if (hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
			sc->sc_flags |= SC_OP_OFFCHANNEL;
		else
			sc->sc_flags &= ~SC_OP_OFFCHANNEL;
1689

1690 1691 1692 1693 1694 1695 1696 1697 1698 1699
		if (aphy->state == ATH_WIPHY_SCAN ||
		    aphy->state == ATH_WIPHY_ACTIVE)
			ath9k_wiphy_pause_all_forced(sc, aphy);
		else {
			/*
			 * Do not change operational channel based on a paused
			 * wiphy changes.
			 */
			goto skip_chan_change;
		}
1700

1701 1702
		ath_print(common, ATH_DBG_CONFIG, "Set channel: %d MHz\n",
			  curchan->center_freq);
1703

1704
		/* XXX: remove me eventualy */
1705
		ath9k_update_ichannel(sc, hw, &sc->sc_ah->channels[pos]);
1706

1707
		ath_update_chainmask(sc, conf_is_ht(conf));
S
Sujith 已提交
1708

1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733
		/* update survey stats for the old channel before switching */
		spin_lock_irqsave(&common->cc_lock, flags);
		ath_update_survey_stats(sc);
		spin_unlock_irqrestore(&common->cc_lock, flags);

		/*
		 * If the operating channel changes, change the survey in-use flags
		 * along with it.
		 * Reset the survey data for the new channel, unless we're switching
		 * back to the operating channel from an off-channel operation.
		 */
		if (!(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL) &&
		    sc->cur_survey != &sc->survey[pos]) {

			if (sc->cur_survey)
				sc->cur_survey->filled &= ~SURVEY_INFO_IN_USE;

			sc->cur_survey = &sc->survey[pos];

			memset(sc->cur_survey, 0, sizeof(struct survey_info));
			sc->cur_survey->filled |= SURVEY_INFO_IN_USE;
		} else if (!(sc->survey[pos].filled & SURVEY_INFO_IN_USE)) {
			memset(&sc->survey[pos], 0, sizeof(struct survey_info));
		}

1734
		if (ath_set_channel(sc, hw, &sc->sc_ah->channels[pos]) < 0) {
1735 1736
			ath_print(common, ATH_DBG_FATAL,
				  "Unable to set channel\n");
1737
			mutex_unlock(&sc->mutex);
1738 1739
			return -EINVAL;
		}
1740 1741 1742 1743 1744 1745 1746 1747

		/*
		 * The most recent snapshot of channel->noisefloor for the old
		 * channel is only available after the hardware reset. Copy it to
		 * the survey stats now.
		 */
		if (old_pos >= 0)
			ath_update_survey_nf(sc, old_pos);
S
Sujith 已提交
1748
	}
1749

1750
skip_chan_change:
1751
	if (changed & IEEE80211_CONF_CHANGE_POWER) {
S
Sujith 已提交
1752
		sc->config.txpowlimit = 2 * conf->power_level;
1753 1754
		ath_update_txpow(sc);
	}
1755

1756 1757 1758 1759
	spin_lock_bh(&sc->wiphy_lock);
	disable_radio = ath9k_all_wiphys_idle(sc);
	spin_unlock_bh(&sc->wiphy_lock);

1760
	if (disable_radio) {
1761
		ath_print(common, ATH_DBG_CONFIG, "idle: disabling radio\n");
1762
		sc->ps_idle = true;
1763
		ath_radio_disable(sc, hw);
1764 1765
	}

1766
	mutex_unlock(&sc->mutex);
1767

1768 1769 1770
	return 0;
}

1771 1772 1773 1774
#define SUPPORTED_FILTERS			\
	(FIF_PROMISC_IN_BSS |			\
	FIF_ALLMULTI |				\
	FIF_CONTROL |				\
1775
	FIF_PSPOLL |				\
1776 1777
	FIF_OTHER_BSS |				\
	FIF_BCN_PRBRESP_PROMISC |		\
1778
	FIF_PROBE_REQ |				\
1779
	FIF_FCSFAIL)
1780

1781 1782 1783 1784
/* FIXME: sc->sc_full_reset ? */
static void ath9k_configure_filter(struct ieee80211_hw *hw,
				   unsigned int changed_flags,
				   unsigned int *total_flags,
1785
				   u64 multicast)
1786
{
1787 1788
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1789
	u32 rfilt;
1790

1791 1792
	changed_flags &= SUPPORTED_FILTERS;
	*total_flags &= SUPPORTED_FILTERS;
1793

S
Sujith 已提交
1794
	sc->rx.rxfilter = *total_flags;
1795
	ath9k_ps_wakeup(sc);
1796 1797
	rfilt = ath_calcrxfilter(sc);
	ath9k_hw_setrxfilter(sc->sc_ah, rfilt);
1798
	ath9k_ps_restore(sc);
1799

1800 1801
	ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_CONFIG,
		  "Set HW RX filter: 0x%x\n", rfilt);
1802
}
1803

1804 1805 1806
static int ath9k_sta_add(struct ieee80211_hw *hw,
			 struct ieee80211_vif *vif,
			 struct ieee80211_sta *sta)
1807
{
1808 1809
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1810

1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825
	ath_node_attach(sc, sta);

	return 0;
}

static int ath9k_sta_remove(struct ieee80211_hw *hw,
			    struct ieee80211_vif *vif,
			    struct ieee80211_sta *sta)
{
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;

	ath_node_detach(sc, sta);

	return 0;
1826 1827
}

1828
static int ath9k_conf_tx(struct ieee80211_hw *hw, u16 queue,
1829
			 const struct ieee80211_tx_queue_params *params)
1830
{
1831 1832
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1833
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1834 1835
	struct ath9k_tx_queue_info qi;
	int ret = 0, qnum;
1836

1837 1838
	if (queue >= WME_NUM_AC)
		return 0;
1839

1840 1841
	mutex_lock(&sc->mutex);

1842 1843
	memset(&qi, 0, sizeof(struct ath9k_tx_queue_info));

1844 1845 1846 1847 1848
	qi.tqi_aifs = params->aifs;
	qi.tqi_cwmin = params->cw_min;
	qi.tqi_cwmax = params->cw_max;
	qi.tqi_burstTime = params->txop;
	qnum = ath_get_hal_qnum(queue, sc);
1849

1850 1851 1852 1853 1854
	ath_print(common, ATH_DBG_CONFIG,
		  "Configure tx [queue/halq] [%d/%d],  "
		  "aifs: %d, cw_min: %d, cw_max: %d, txop: %d\n",
		  queue, qnum, params->aifs, params->cw_min,
		  params->cw_max, params->txop);
1855

1856 1857
	ret = ath_txq_update(sc, qnum, &qi);
	if (ret)
1858
		ath_print(common, ATH_DBG_FATAL, "TXQ Update failed\n");
1859

1860
	if (sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC)
1861
		if ((qnum == sc->tx.hwq_map[WME_AC_BE]) && !ret)
1862 1863
			ath_beaconq_config(sc);

1864 1865
	mutex_unlock(&sc->mutex);

1866 1867
	return ret;
}
1868

1869 1870
static int ath9k_set_key(struct ieee80211_hw *hw,
			 enum set_key_cmd cmd,
1871 1872
			 struct ieee80211_vif *vif,
			 struct ieee80211_sta *sta,
1873 1874
			 struct ieee80211_key_conf *key)
{
1875 1876
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1877
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1878
	int ret = 0;
1879

1880 1881 1882
	if (modparam_nohwcrypt)
		return -ENOSPC;

1883
	mutex_lock(&sc->mutex);
1884
	ath9k_ps_wakeup(sc);
1885
	ath_print(common, ATH_DBG_CONFIG, "Set HW Key\n");
1886

1887 1888
	switch (cmd) {
	case SET_KEY:
1889
		ret = ath_key_config(common, vif, sta, key);
1890 1891
		if (ret >= 0) {
			key->hw_key_idx = ret;
1892 1893
			/* push IV and Michael MIC generation to stack */
			key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1894
			if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
1895
				key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
1896 1897
			if (sc->sc_ah->sw_mgmt_crypto &&
			    key->cipher == WLAN_CIPHER_SUITE_CCMP)
1898
				key->flags |= IEEE80211_KEY_FLAG_SW_MGMT;
1899
			ret = 0;
1900 1901 1902
		}
		break;
	case DISABLE_KEY:
1903
		ath_key_delete(common, key);
1904 1905 1906 1907
		break;
	default:
		ret = -EINVAL;
	}
1908

1909
	ath9k_ps_restore(sc);
1910 1911
	mutex_unlock(&sc->mutex);

1912 1913
	return ret;
}
1914

1915 1916 1917 1918 1919
static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
				   struct ieee80211_vif *vif,
				   struct ieee80211_bss_conf *bss_conf,
				   u32 changed)
{
1920 1921
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1922
	struct ath_hw *ah = sc->sc_ah;
1923
	struct ath_common *common = ath9k_hw_common(ah);
1924
	struct ath_vif *avp = (void *)vif->drv_priv;
1925
	int slottime;
S
Sujith 已提交
1926
	int error;
1927

1928 1929
	mutex_lock(&sc->mutex);

S
Sujith 已提交
1930 1931 1932 1933
	if (changed & BSS_CHANGED_BSSID) {
		/* Set BSSID */
		memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
		memcpy(avp->bssid, bss_conf->bssid, ETH_ALEN);
1934
		common->curaid = 0;
1935
		ath9k_hw_write_associd(ah);
1936

S
Sujith 已提交
1937 1938
		/* Set aggregation protection mode parameters */
		sc->config.ath_aggr_prot = 0;
1939

S
Sujith 已提交
1940 1941 1942
		/* Only legacy IBSS for now */
		if (vif->type == NL80211_IFTYPE_ADHOC)
			ath_update_chainmask(sc, 0);
1943

S
Sujith 已提交
1944 1945 1946
		ath_print(common, ATH_DBG_CONFIG,
			  "BSSID: %pM aid: 0x%x\n",
			  common->curbssid, common->curaid);
1947

S
Sujith 已提交
1948 1949 1950
		/* need to reconfigure the beacon */
		sc->sc_flags &= ~SC_OP_BEACONS ;
	}
1951

S
Sujith 已提交
1952 1953 1954 1955 1956 1957 1958
	/* Enable transmission of beacons (AP, IBSS, MESH) */
	if ((changed & BSS_CHANGED_BEACON) ||
	    ((changed & BSS_CHANGED_BEACON_ENABLED) && bss_conf->enable_beacon)) {
		ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq);
		error = ath_beacon_alloc(aphy, vif);
		if (!error)
			ath_beacon_config(sc, vif);
1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977
	}

	if (changed & BSS_CHANGED_ERP_SLOT) {
		if (bss_conf->use_short_slot)
			slottime = 9;
		else
			slottime = 20;
		if (vif->type == NL80211_IFTYPE_AP) {
			/*
			 * Defer update, so that connected stations can adjust
			 * their settings at the same time.
			 * See beacon.c for more details
			 */
			sc->beacon.slottime = slottime;
			sc->beacon.updateslot = UPDATE;
		} else {
			ah->slottime = slottime;
			ath9k_hw_init_global_settings(ah);
		}
1978 1979
	}

S
Sujith 已提交
1980 1981 1982
	/* Disable transmission of beacons */
	if ((changed & BSS_CHANGED_BEACON_ENABLED) && !bss_conf->enable_beacon)
		ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq);
1983

S
Sujith 已提交
1984 1985 1986 1987 1988 1989 1990 1991 1992
	if (changed & BSS_CHANGED_BEACON_INT) {
		sc->beacon_interval = bss_conf->beacon_int;
		/*
		 * In case of AP mode, the HW TSF has to be reset
		 * when the beacon interval changes.
		 */
		if (vif->type == NL80211_IFTYPE_AP) {
			sc->sc_flags |= SC_OP_TSF_RESET;
			ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq);
1993 1994 1995
			error = ath_beacon_alloc(aphy, vif);
			if (!error)
				ath_beacon_config(sc, vif);
S
Sujith 已提交
1996 1997
		} else {
			ath_beacon_config(sc, vif);
1998 1999 2000
		}
	}

2001
	if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2002 2003
		ath_print(common, ATH_DBG_CONFIG, "BSS Changed PREAMBLE %d\n",
			  bss_conf->use_short_preamble);
2004 2005 2006 2007 2008
		if (bss_conf->use_short_preamble)
			sc->sc_flags |= SC_OP_PREAMBLE_SHORT;
		else
			sc->sc_flags &= ~SC_OP_PREAMBLE_SHORT;
	}
2009

2010
	if (changed & BSS_CHANGED_ERP_CTS_PROT) {
2011 2012
		ath_print(common, ATH_DBG_CONFIG, "BSS Changed CTS PROT %d\n",
			  bss_conf->use_cts_prot);
2013 2014 2015 2016 2017 2018
		if (bss_conf->use_cts_prot &&
		    hw->conf.channel->band != IEEE80211_BAND_5GHZ)
			sc->sc_flags |= SC_OP_PROTECT_ENABLE;
		else
			sc->sc_flags &= ~SC_OP_PROTECT_ENABLE;
	}
2019

2020
	if (changed & BSS_CHANGED_ASSOC) {
2021
		ath_print(common, ATH_DBG_CONFIG, "BSS Changed ASSOC %d\n",
2022
			bss_conf->assoc);
S
Sujith 已提交
2023
		ath9k_bss_assoc_info(sc, vif, bss_conf);
2024
	}
2025 2026

	mutex_unlock(&sc->mutex);
2027
}
2028

2029 2030 2031
static u64 ath9k_get_tsf(struct ieee80211_hw *hw)
{
	u64 tsf;
2032 2033
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
2034

2035 2036 2037
	mutex_lock(&sc->mutex);
	tsf = ath9k_hw_gettsf64(sc->sc_ah);
	mutex_unlock(&sc->mutex);
2038

2039 2040
	return tsf;
}
2041

2042 2043
static void ath9k_set_tsf(struct ieee80211_hw *hw, u64 tsf)
{
2044 2045
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
2046

2047 2048 2049
	mutex_lock(&sc->mutex);
	ath9k_hw_settsf64(sc->sc_ah, tsf);
	mutex_unlock(&sc->mutex);
2050 2051
}

2052 2053
static void ath9k_reset_tsf(struct ieee80211_hw *hw)
{
2054 2055
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
2056

2057
	mutex_lock(&sc->mutex);
2058 2059

	ath9k_ps_wakeup(sc);
2060
	ath9k_hw_reset_tsf(sc->sc_ah);
2061 2062
	ath9k_ps_restore(sc);

2063
	mutex_unlock(&sc->mutex);
2064
}
2065

2066
static int ath9k_ampdu_action(struct ieee80211_hw *hw,
2067
			      struct ieee80211_vif *vif,
2068 2069 2070
			      enum ieee80211_ampdu_mlme_action action,
			      struct ieee80211_sta *sta,
			      u16 tid, u16 *ssn)
2071
{
2072 2073
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
2074
	int ret = 0;
2075

2076 2077
	local_bh_disable();

2078 2079
	switch (action) {
	case IEEE80211_AMPDU_RX_START:
2080 2081
		if (!(sc->sc_flags & SC_OP_RXAGGR))
			ret = -ENOTSUPP;
2082 2083 2084 2085
		break;
	case IEEE80211_AMPDU_RX_STOP:
		break;
	case IEEE80211_AMPDU_TX_START:
2086
		ath9k_ps_wakeup(sc);
2087 2088 2089
		ret = ath_tx_aggr_start(sc, sta, tid, ssn);
		if (!ret)
			ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
2090
		ath9k_ps_restore(sc);
2091 2092
		break;
	case IEEE80211_AMPDU_TX_STOP:
2093
		ath9k_ps_wakeup(sc);
S
Sujith 已提交
2094
		ath_tx_aggr_stop(sc, sta, tid);
2095
		ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
2096
		ath9k_ps_restore(sc);
2097
		break;
2098
	case IEEE80211_AMPDU_TX_OPERATIONAL:
2099
		ath9k_ps_wakeup(sc);
2100
		ath_tx_aggr_resume(sc, sta, tid);
2101
		ath9k_ps_restore(sc);
2102
		break;
2103
	default:
2104 2105
		ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_FATAL,
			  "Unknown AMPDU action\n");
2106 2107
	}

2108 2109
	local_bh_enable();

2110
	return ret;
2111 2112
}

2113 2114 2115 2116 2117
static int ath9k_get_survey(struct ieee80211_hw *hw, int idx,
			     struct survey_info *survey)
{
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
2118
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
2119
	struct ieee80211_supported_band *sband;
2120 2121 2122 2123 2124 2125 2126
	struct ieee80211_channel *chan;
	unsigned long flags;
	int pos;

	spin_lock_irqsave(&common->cc_lock, flags);
	if (idx == 0)
		ath_update_survey_stats(sc);
2127 2128 2129 2130 2131 2132

	sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
	if (sband && idx >= sband->n_channels) {
		idx -= sband->n_channels;
		sband = NULL;
	}
2133

2134 2135
	if (!sband)
		sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
2136

2137 2138 2139
	if (!sband || idx >= sband->n_channels) {
		spin_unlock_irqrestore(&common->cc_lock, flags);
		return -ENOENT;
2140
	}
2141

2142 2143 2144 2145 2146 2147
	chan = &sband->channels[idx];
	pos = chan->hw_value;
	memcpy(survey, &sc->survey[pos], sizeof(*survey));
	survey->channel = chan;
	spin_unlock_irqrestore(&common->cc_lock, flags);

2148 2149 2150
	return 0;
}

2151 2152
static void ath9k_sw_scan_start(struct ieee80211_hw *hw)
{
2153 2154
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
2155

2156
	mutex_lock(&sc->mutex);
2157 2158
	if (ath9k_wiphy_scanning(sc)) {
		/*
2159 2160 2161 2162 2163
		 * There is a race here in mac80211 but fixing it requires
		 * we revisit how we handle the scan complete callback.
		 * After mac80211 fixes we will not have configured hardware
		 * to the home channel nor would we have configured the RX
		 * filter yet.
2164
		 */
2165
		mutex_unlock(&sc->mutex);
2166 2167 2168 2169 2170
		return;
	}

	aphy->state = ATH_WIPHY_SCAN;
	ath9k_wiphy_pause_all_forced(sc, aphy);
2171
	mutex_unlock(&sc->mutex);
2172 2173
}

2174 2175 2176 2177
/*
 * XXX: this requires a revisit after the driver
 * scan_complete gets moved to another place/removed in mac80211.
 */
2178 2179
static void ath9k_sw_scan_complete(struct ieee80211_hw *hw)
{
2180 2181
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
2182

2183
	mutex_lock(&sc->mutex);
2184
	aphy->state = ATH_WIPHY_ACTIVE;
2185
	mutex_unlock(&sc->mutex);
2186 2187
}

2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199
static void ath9k_set_coverage_class(struct ieee80211_hw *hw, u8 coverage_class)
{
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
	struct ath_hw *ah = sc->sc_ah;

	mutex_lock(&sc->mutex);
	ah->coverage_class = coverage_class;
	ath9k_hw_init_global_settings(ah);
	mutex_unlock(&sc->mutex);
}

2200
struct ieee80211_ops ath9k_ops = {
2201 2202 2203 2204 2205 2206 2207
	.tx 		    = ath9k_tx,
	.start 		    = ath9k_start,
	.stop 		    = ath9k_stop,
	.add_interface 	    = ath9k_add_interface,
	.remove_interface   = ath9k_remove_interface,
	.config 	    = ath9k_config,
	.configure_filter   = ath9k_configure_filter,
2208 2209
	.sta_add	    = ath9k_sta_add,
	.sta_remove	    = ath9k_sta_remove,
2210 2211 2212 2213
	.conf_tx 	    = ath9k_conf_tx,
	.bss_info_changed   = ath9k_bss_info_changed,
	.set_key            = ath9k_set_key,
	.get_tsf 	    = ath9k_get_tsf,
2214
	.set_tsf 	    = ath9k_set_tsf,
2215
	.reset_tsf 	    = ath9k_reset_tsf,
2216
	.ampdu_action       = ath9k_ampdu_action,
2217
	.get_survey	    = ath9k_get_survey,
2218 2219
	.sw_scan_start      = ath9k_sw_scan_start,
	.sw_scan_complete   = ath9k_sw_scan_complete,
J
Johannes Berg 已提交
2220
	.rfkill_poll        = ath9k_rfkill_poll_state,
2221
	.set_coverage_class = ath9k_set_coverage_class,
2222
};