main.c 55.0 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);
S
Sujith 已提交
247
	ath_drain_all_txq(sc, false);
248 249 250

	spin_lock_bh(&sc->rx.pcu_lock);

251
	stopped = ath_stoprecv(sc);
S
Sujith 已提交
252

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

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

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

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

269 270
	spin_lock_bh(&sc->sc_resetlock);

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

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

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

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

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

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

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

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

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

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

	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;
341
	struct ath9k_hw_cal_data *caldata = ah->caldata;
342
	struct ath_common *common = ath9k_hw_common(ah);
343 344 345 346 347 348 349
	int qnum, ftype;
	int chain_ok = 0;
	int chain;
	int len = 1800;
	int time_left;
	int i;

350 351 352
	if (!caldata)
		return;

353 354 355 356 357 358 359 360 361 362 363
	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);
364
	hdr->duration_id = cpu_to_le16(10);
365 366 367 368 369 370 371 372
	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];

373
	ath9k_ps_wakeup(sc);
374 375
	ar9003_paprd_init_table(ah);
	for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
376
		if (!(common->tx_chainmask & BIT(chain)))
377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394
			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,
395
				msecs_to_jiffies(ATH_PAPRD_TIMEOUT));
396 397 398 399 400
		if (!time_left) {
			ath_print(ath9k_hw_common(ah), ATH_DBG_CALIBRATE,
				  "Timeout waiting for paprd training on "
				  "TX chain %d\n",
				  chain);
401
			goto fail_paprd;
402 403 404 405 406
		}

		if (!ar9003_paprd_is_done(ah))
			break;

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

		chain_ok = 1;
	}
	kfree_skb(skb);

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

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

S
Sujith 已提交
423 424 425 426 427 428 429
/*
 *  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 已提交
430
void ath_ani_calibrate(unsigned long data)
S
Sujith 已提交
431
{
432 433
	struct ath_softc *sc = (struct ath_softc *)data;
	struct ath_hw *ah = sc->sc_ah;
434
	struct ath_common *common = ath9k_hw_common(ah);
S
Sujith 已提交
435 436 437 438
	bool longcal = false;
	bool shortcal = false;
	bool aniflag = false;
	unsigned int timestamp = jiffies_to_msecs(jiffies);
439
	u32 cal_interval, short_cal_interval, long_cal_interval;
440
	unsigned long flags;
441 442 443 444 445

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

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

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

	ath9k_ps_wakeup(sc);

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

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

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

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

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

508 509
	ath9k_ps_restore(sc);

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

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

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

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

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

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

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

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

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);
}

581 582 583 584 585 586 587 588 589 590 591 592 593
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);
	}
594
	ath_reset(sc, true);
595 596 597 598 599

out:
	ath9k_ps_restore(sc);
}

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

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

609 610
	ath9k_ps_wakeup(sc);

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

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

F
Felix Fietkau 已提交
620 621 622 623 624 625 626
	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) {
627
		spin_lock_bh(&sc->rx.pcu_lock);
F
Felix Fietkau 已提交
628 629 630 631 632 633 634

		/* 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);
635
		spin_unlock_bh(&sc->rx.pcu_lock);
S
Sujith 已提交
636 637
	}

638 639 640 641 642 643
	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 已提交
644

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

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

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

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

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

S
Sujith 已提交
685 686 687 688 689 690 691
	/*
	 * 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 已提交
692

S
Sujith 已提交
693 694 695

	/* shared irq, not for us */

696
	if (!ath9k_hw_intrpend(ah))
S
Sujith 已提交
697 698 699 700 701 702 703 704 705
		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 已提交
706
	status &= ah->imask;	/* discard unasked-for bits */
S
Sujith 已提交
707

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

S
Sujith 已提交
715 716 717 718 719 720 721 722 723 724
	/* 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 已提交
725 726
	if ((status & ATH9K_INT_FATAL) || ((status & ATH9K_INT_RXORN) &&
	    !(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)))
S
Sujith 已提交
727 728
		goto chip_reset;

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

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

737 738 739
		goto chip_reset;
	}

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

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

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

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

chip_reset:
S
Sujith 已提交
781

782 783
	ath_debug_stat_interrupt(sc, status);

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

	return IRQ_HANDLED;
S
Sujith 已提交
791 792

#undef SCHED_INTR
S
Sujith 已提交
793 794
}

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

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

	return chanmode;
}

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

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

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

		/*
		 * 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 已提交
858
		sc->ps_flags |= PS_BEACON_SYNC;
859

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

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

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

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

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

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

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

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

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

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

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

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

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

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

934 935 936 937 938 939 940 941
	/*
	 * 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);
	}
942 943 944 945

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

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

	spin_lock_bh(&sc->rx.pcu_lock);

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

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

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

	ath9k_hw_phy_disable(ah);
967 968 969

	spin_unlock_bh(&sc->rx.pcu_lock);

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

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

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

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

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

	spin_lock_bh(&sc->rx.pcu_lock);

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

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

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

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

S
Sujith 已提交
1008 1009 1010 1011 1012 1013 1014
	/*
	 * 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);

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

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

	if (retry_tx) {
		int i;
		for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
			if (ATH_TXQ_SETUP(sc, i)) {
S
Sujith 已提交
1024 1025 1026
				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 已提交
1027 1028 1029 1030
			}
		}
	}

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

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

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

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

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

	return qnum;
}

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

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

	return qnum;
}

1089 1090
/* XXX: Remove me once we don't depend on ath9k_channel for all
 * this redundant data */
1091 1092
void ath9k_update_ichannel(struct ath_softc *sc, struct ieee80211_hw *hw,
			   struct ath9k_channel *ichan)
1093 1094 1095 1096 1097 1098 1099 1100 1101
{
	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 已提交
1102
		ichan->channelFlags = CHANNEL_2GHZ | CHANNEL_OFDM | CHANNEL_G;
1103 1104 1105 1106 1107
	} else {
		ichan->chanmode = CHANNEL_A;
		ichan->channelFlags = CHANNEL_5GHZ | CHANNEL_OFDM;
	}

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

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

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

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

1131 1132
	mutex_lock(&sc->mutex);

1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153
	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;

1154
	/* setup initial channel */
1155

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

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

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

	/*
	 * 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.
	 */
1170
	spin_lock_bh(&sc->rx.pcu_lock);
S
Sujith 已提交
1171
	spin_lock_bh(&sc->sc_resetlock);
1172
	r = ath9k_hw_reset(ah, init_channel, ah->caldata, false);
1173
	if (r) {
1174 1175 1176 1177
		ath_print(common, ATH_DBG_FATAL,
			  "Unable to reset hardware; reset status %d "
			  "(freq %u MHz)\n", r,
			  curchan->center_freq);
S
Sujith 已提交
1178
		spin_unlock_bh(&sc->sc_resetlock);
1179
		spin_unlock_bh(&sc->rx.pcu_lock);
1180
		goto mutex_unlock;
S
Sujith 已提交
1181 1182 1183 1184 1185 1186 1187 1188
	}
	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);
1189

S
Sujith 已提交
1190 1191 1192 1193 1194 1195 1196 1197
	/*
	 * 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) {
1198 1199
		ath_print(common, ATH_DBG_FATAL,
			  "Unable to start recv logic\n");
1200
		r = -EIO;
1201
		spin_unlock_bh(&sc->rx.pcu_lock);
1202
		goto mutex_unlock;
1203
	}
1204
	spin_unlock_bh(&sc->rx.pcu_lock);
1205

S
Sujith 已提交
1206
	/* Setup our intr mask. */
F
Felix Fietkau 已提交
1207 1208 1209 1210 1211
	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)
1212 1213 1214
		ah->imask |= ATH9K_INT_RXHP |
			     ATH9K_INT_RXLP |
			     ATH9K_INT_BB_WATCHDOG;
F
Felix Fietkau 已提交
1215 1216
	else
		ah->imask |= ATH9K_INT_RX;
S
Sujith 已提交
1217

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

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

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

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

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

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

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

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

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

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

1251
	return r;
1252 1253
}

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

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

1273
	if (sc->ps_enabled) {
1274 1275 1276 1277 1278 1279 1280
		/*
		 * 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)) {
1281 1282
			ath_print(common, ATH_DBG_PS, "Add PM=1 for a TX frame "
				  "while in PS mode\n");
1283 1284 1285 1286
			hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM);
		}
	}

1287 1288 1289 1290 1291 1292 1293
	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);
1294 1295
		if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
			ath9k_hw_setrxabort(sc->sc_ah, 0);
1296
		if (ieee80211_is_pspoll(hdr->frame_control)) {
1297 1298
			ath_print(common, ATH_DBG_PS,
				  "Sending PS-Poll to pick a buffered frame\n");
S
Sujith 已提交
1299
			sc->ps_flags |= PS_WAIT_FOR_PSPOLL_DATA;
1300
		} else {
1301 1302
			ath_print(common, ATH_DBG_PS,
				  "Wake up to complete TX\n");
S
Sujith 已提交
1303
			sc->ps_flags |= PS_WAIT_FOR_TX_ACK;
1304 1305 1306 1307 1308 1309 1310 1311 1312
		}
		/*
		 * 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 已提交
1313
	memset(&txctl, 0, sizeof(struct ath_tx_control));
1314

1315 1316 1317 1318 1319 1320 1321
	/*
	 * 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 已提交
1322
			sc->tx.seq_no += 0x10;
1323
		hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
S
Sujith 已提交
1324
		hdr->seq_ctrl |= cpu_to_le16(sc->tx.seq_no);
1325
	}
1326

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

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

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

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

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

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

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

1363 1364
	aphy->state = ATH_WIPHY_INACTIVE;

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

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

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

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

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

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

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

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

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

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

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

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

	sc->sc_flags |= SC_OP_INVALID;
1424

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

1427 1428
	mutex_unlock(&sc->mutex);

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

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

1443 1444
	mutex_lock(&sc->mutex);

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

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

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

1475
	sc->nvifs++;
1476

1477
	ath9k_set_bssid_mask(hw, vif);
1478

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

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

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

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

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

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

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

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

1524
	ath_print(common, ATH_DBG_CONFIG, "Detach Interface\n");
1525

1526 1527
	mutex_lock(&sc->mutex);

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

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

1541
	ath_beacon_return(sc, avp);
1542
	sc->sc_flags &= ~SC_OP_BEACONS;
1543

1544
	for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++) {
1545
		if (sc->beacon.bslot[i] == vif) {
1546 1547 1548
			printk(KERN_DEBUG "%s: vif had allocated beacon "
			       "slot\n", __func__);
			sc->beacon.bslot[i] = NULL;
1549
			sc->beacon.bslot_aphy[i] = NULL;
1550 1551 1552
		}
	}

S
Sujith 已提交
1553
	sc->nvifs--;
1554 1555

	mutex_unlock(&sc->mutex);
1556 1557
}

1558
static void ath9k_enable_ps(struct ath_softc *sc)
1559
{
P
Pavel Roskin 已提交
1560 1561
	struct ath_hw *ah = sc->sc_ah;

1562
	sc->ps_enabled = true;
P
Pavel Roskin 已提交
1563 1564 1565 1566
	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);
1567
		}
1568
		ath9k_hw_setrxabort(ah, 1);
1569 1570 1571
	}
}

1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591
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);
		}
	}

}

1592
static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
1593
{
1594 1595
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1596 1597
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
1598
	struct ieee80211_conf *conf = &hw->conf;
1599
	bool disable_radio;
1600

1601
	mutex_lock(&sc->mutex);
1602

1603 1604 1605 1606 1607 1608
	/*
	 * 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.
	 */
1609
	if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1610 1611 1612
		bool enable_radio;
		bool all_wiphys_idle;
		bool idle = !!(conf->flags & IEEE80211_CONF_IDLE);
1613 1614 1615

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

1618
		enable_radio = (!idle && all_wiphys_idle);
1619 1620 1621 1622 1623 1624 1625

		/*
		 * 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.
		 */
1626 1627
		spin_unlock_bh(&sc->wiphy_lock);

1628
		if (enable_radio) {
1629
			sc->ps_idle = false;
1630
			ath_radio_enable(sc, hw);
1631 1632
			ath_print(common, ATH_DBG_CONFIG,
				  "not-idle: enabling radio\n");
1633 1634 1635
		}
	}

1636 1637 1638 1639 1640 1641
	/*
	 * 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.
	 */
1642
	if (changed & IEEE80211_CONF_CHANGE_PS) {
1643 1644
		unsigned long flags;
		spin_lock_irqsave(&sc->sc_pm_lock, flags);
1645 1646
		if (conf->flags & IEEE80211_CONF_PS)
			ath9k_enable_ps(sc);
1647 1648
		else
			ath9k_disable_ps(sc);
1649
		spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
1650 1651
	}

S
Sujith 已提交
1652 1653 1654
	if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
		if (conf->flags & IEEE80211_CONF_MONITOR) {
			ath_print(common, ATH_DBG_CONFIG,
1655 1656 1657 1658 1659 1660
				  "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 已提交
1661 1662 1663
		}
	}

1664
	if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
1665
		struct ieee80211_channel *curchan = hw->conf.channel;
1666
		int pos = curchan->hw_value;
1667 1668 1669 1670 1671
		int old_pos = -1;
		unsigned long flags;

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

1673 1674
		aphy->chan_idx = pos;
		aphy->chan_is_ht = conf_is_ht(conf);
1675 1676 1677 1678
		if (hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
			sc->sc_flags |= SC_OP_OFFCHANNEL;
		else
			sc->sc_flags &= ~SC_OP_OFFCHANNEL;
1679

1680 1681 1682 1683 1684 1685 1686 1687 1688 1689
		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;
		}
1690

1691 1692
		ath_print(common, ATH_DBG_CONFIG, "Set channel: %d MHz\n",
			  curchan->center_freq);
1693

1694
		/* XXX: remove me eventualy */
1695
		ath9k_update_ichannel(sc, hw, &sc->sc_ah->channels[pos]);
1696

1697
		ath_update_chainmask(sc, conf_is_ht(conf));
S
Sujith 已提交
1698

1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723
		/* 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));
		}

1724
		if (ath_set_channel(sc, hw, &sc->sc_ah->channels[pos]) < 0) {
1725 1726
			ath_print(common, ATH_DBG_FATAL,
				  "Unable to set channel\n");
1727
			mutex_unlock(&sc->mutex);
1728 1729
			return -EINVAL;
		}
1730 1731 1732 1733 1734 1735 1736 1737

		/*
		 * 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 已提交
1738
	}
1739

1740
skip_chan_change:
1741
	if (changed & IEEE80211_CONF_CHANGE_POWER) {
S
Sujith 已提交
1742
		sc->config.txpowlimit = 2 * conf->power_level;
1743 1744
		ath_update_txpow(sc);
	}
1745

1746 1747 1748 1749
	spin_lock_bh(&sc->wiphy_lock);
	disable_radio = ath9k_all_wiphys_idle(sc);
	spin_unlock_bh(&sc->wiphy_lock);

1750
	if (disable_radio) {
1751
		ath_print(common, ATH_DBG_CONFIG, "idle: disabling radio\n");
1752
		sc->ps_idle = true;
1753
		ath_radio_disable(sc, hw);
1754 1755
	}

1756
	mutex_unlock(&sc->mutex);
1757

1758 1759 1760
	return 0;
}

1761 1762 1763 1764
#define SUPPORTED_FILTERS			\
	(FIF_PROMISC_IN_BSS |			\
	FIF_ALLMULTI |				\
	FIF_CONTROL |				\
1765
	FIF_PSPOLL |				\
1766 1767
	FIF_OTHER_BSS |				\
	FIF_BCN_PRBRESP_PROMISC |		\
1768
	FIF_PROBE_REQ |				\
1769
	FIF_FCSFAIL)
1770

1771 1772 1773 1774
/* FIXME: sc->sc_full_reset ? */
static void ath9k_configure_filter(struct ieee80211_hw *hw,
				   unsigned int changed_flags,
				   unsigned int *total_flags,
1775
				   u64 multicast)
1776
{
1777 1778
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1779
	u32 rfilt;
1780

1781 1782
	changed_flags &= SUPPORTED_FILTERS;
	*total_flags &= SUPPORTED_FILTERS;
1783

S
Sujith 已提交
1784
	sc->rx.rxfilter = *total_flags;
1785
	ath9k_ps_wakeup(sc);
1786 1787
	rfilt = ath_calcrxfilter(sc);
	ath9k_hw_setrxfilter(sc->sc_ah, rfilt);
1788
	ath9k_ps_restore(sc);
1789

1790 1791
	ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_CONFIG,
		  "Set HW RX filter: 0x%x\n", rfilt);
1792
}
1793

1794 1795 1796
static int ath9k_sta_add(struct ieee80211_hw *hw,
			 struct ieee80211_vif *vif,
			 struct ieee80211_sta *sta)
1797
{
1798 1799
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1800

1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815
	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;
1816 1817
}

1818
static int ath9k_conf_tx(struct ieee80211_hw *hw, u16 queue,
1819
			 const struct ieee80211_tx_queue_params *params)
1820
{
1821 1822
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1823
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1824 1825
	struct ath9k_tx_queue_info qi;
	int ret = 0, qnum;
1826

1827 1828
	if (queue >= WME_NUM_AC)
		return 0;
1829

1830 1831
	mutex_lock(&sc->mutex);

1832 1833
	memset(&qi, 0, sizeof(struct ath9k_tx_queue_info));

1834 1835 1836 1837 1838
	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);
1839

1840 1841 1842 1843 1844
	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);
1845

1846 1847
	ret = ath_txq_update(sc, qnum, &qi);
	if (ret)
1848
		ath_print(common, ATH_DBG_FATAL, "TXQ Update failed\n");
1849

1850
	if (sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC)
1851
		if ((qnum == sc->tx.hwq_map[WME_AC_BE]) && !ret)
1852 1853
			ath_beaconq_config(sc);

1854 1855
	mutex_unlock(&sc->mutex);

1856 1857
	return ret;
}
1858

1859 1860
static int ath9k_set_key(struct ieee80211_hw *hw,
			 enum set_key_cmd cmd,
1861 1862
			 struct ieee80211_vif *vif,
			 struct ieee80211_sta *sta,
1863 1864
			 struct ieee80211_key_conf *key)
{
1865 1866
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1867
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1868
	int ret = 0;
1869

1870 1871 1872
	if (modparam_nohwcrypt)
		return -ENOSPC;

1873
	mutex_lock(&sc->mutex);
1874
	ath9k_ps_wakeup(sc);
1875
	ath_print(common, ATH_DBG_CONFIG, "Set HW Key\n");
1876

1877 1878
	switch (cmd) {
	case SET_KEY:
1879
		ret = ath_key_config(common, vif, sta, key);
1880 1881
		if (ret >= 0) {
			key->hw_key_idx = ret;
1882 1883
			/* push IV and Michael MIC generation to stack */
			key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1884
			if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
1885
				key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
1886 1887
			if (sc->sc_ah->sw_mgmt_crypto &&
			    key->cipher == WLAN_CIPHER_SUITE_CCMP)
1888
				key->flags |= IEEE80211_KEY_FLAG_SW_MGMT;
1889
			ret = 0;
1890 1891 1892
		}
		break;
	case DISABLE_KEY:
1893
		ath_key_delete(common, key);
1894 1895 1896 1897
		break;
	default:
		ret = -EINVAL;
	}
1898

1899
	ath9k_ps_restore(sc);
1900 1901
	mutex_unlock(&sc->mutex);

1902 1903
	return ret;
}
1904

1905 1906 1907 1908 1909
static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
				   struct ieee80211_vif *vif,
				   struct ieee80211_bss_conf *bss_conf,
				   u32 changed)
{
1910 1911
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1912
	struct ath_hw *ah = sc->sc_ah;
1913
	struct ath_common *common = ath9k_hw_common(ah);
1914
	struct ath_vif *avp = (void *)vif->drv_priv;
1915
	int slottime;
S
Sujith 已提交
1916
	int error;
1917

1918 1919
	mutex_lock(&sc->mutex);

S
Sujith 已提交
1920 1921 1922 1923
	if (changed & BSS_CHANGED_BSSID) {
		/* Set BSSID */
		memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
		memcpy(avp->bssid, bss_conf->bssid, ETH_ALEN);
1924
		common->curaid = 0;
1925
		ath9k_hw_write_associd(ah);
1926

S
Sujith 已提交
1927 1928
		/* Set aggregation protection mode parameters */
		sc->config.ath_aggr_prot = 0;
1929

S
Sujith 已提交
1930 1931 1932
		/* Only legacy IBSS for now */
		if (vif->type == NL80211_IFTYPE_ADHOC)
			ath_update_chainmask(sc, 0);
1933

S
Sujith 已提交
1934 1935 1936
		ath_print(common, ATH_DBG_CONFIG,
			  "BSSID: %pM aid: 0x%x\n",
			  common->curbssid, common->curaid);
1937

S
Sujith 已提交
1938 1939 1940
		/* need to reconfigure the beacon */
		sc->sc_flags &= ~SC_OP_BEACONS ;
	}
1941

S
Sujith 已提交
1942 1943 1944 1945 1946 1947 1948
	/* 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);
1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967
	}

	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);
		}
1968 1969
	}

S
Sujith 已提交
1970 1971 1972
	/* Disable transmission of beacons */
	if ((changed & BSS_CHANGED_BEACON_ENABLED) && !bss_conf->enable_beacon)
		ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq);
1973

S
Sujith 已提交
1974 1975 1976 1977 1978 1979 1980 1981 1982
	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);
1983 1984 1985
			error = ath_beacon_alloc(aphy, vif);
			if (!error)
				ath_beacon_config(sc, vif);
S
Sujith 已提交
1986 1987
		} else {
			ath_beacon_config(sc, vif);
1988 1989 1990
		}
	}

1991
	if (changed & BSS_CHANGED_ERP_PREAMBLE) {
1992 1993
		ath_print(common, ATH_DBG_CONFIG, "BSS Changed PREAMBLE %d\n",
			  bss_conf->use_short_preamble);
1994 1995 1996 1997 1998
		if (bss_conf->use_short_preamble)
			sc->sc_flags |= SC_OP_PREAMBLE_SHORT;
		else
			sc->sc_flags &= ~SC_OP_PREAMBLE_SHORT;
	}
1999

2000
	if (changed & BSS_CHANGED_ERP_CTS_PROT) {
2001 2002
		ath_print(common, ATH_DBG_CONFIG, "BSS Changed CTS PROT %d\n",
			  bss_conf->use_cts_prot);
2003 2004 2005 2006 2007 2008
		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;
	}
2009

2010
	if (changed & BSS_CHANGED_ASSOC) {
2011
		ath_print(common, ATH_DBG_CONFIG, "BSS Changed ASSOC %d\n",
2012
			bss_conf->assoc);
S
Sujith 已提交
2013
		ath9k_bss_assoc_info(sc, vif, bss_conf);
2014
	}
2015 2016

	mutex_unlock(&sc->mutex);
2017
}
2018

2019 2020 2021
static u64 ath9k_get_tsf(struct ieee80211_hw *hw)
{
	u64 tsf;
2022 2023
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
2024

2025 2026 2027
	mutex_lock(&sc->mutex);
	tsf = ath9k_hw_gettsf64(sc->sc_ah);
	mutex_unlock(&sc->mutex);
2028

2029 2030
	return tsf;
}
2031

2032 2033
static void ath9k_set_tsf(struct ieee80211_hw *hw, u64 tsf)
{
2034 2035
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
2036

2037 2038 2039
	mutex_lock(&sc->mutex);
	ath9k_hw_settsf64(sc->sc_ah, tsf);
	mutex_unlock(&sc->mutex);
2040 2041
}

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

2047
	mutex_lock(&sc->mutex);
2048 2049

	ath9k_ps_wakeup(sc);
2050
	ath9k_hw_reset_tsf(sc->sc_ah);
2051 2052
	ath9k_ps_restore(sc);

2053
	mutex_unlock(&sc->mutex);
2054
}
2055

2056
static int ath9k_ampdu_action(struct ieee80211_hw *hw,
2057
			      struct ieee80211_vif *vif,
2058 2059 2060
			      enum ieee80211_ampdu_mlme_action action,
			      struct ieee80211_sta *sta,
			      u16 tid, u16 *ssn)
2061
{
2062 2063
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
2064
	int ret = 0;
2065

2066 2067
	local_bh_disable();

2068 2069
	switch (action) {
	case IEEE80211_AMPDU_RX_START:
2070 2071
		if (!(sc->sc_flags & SC_OP_RXAGGR))
			ret = -ENOTSUPP;
2072 2073 2074 2075
		break;
	case IEEE80211_AMPDU_RX_STOP:
		break;
	case IEEE80211_AMPDU_TX_START:
2076
		ath9k_ps_wakeup(sc);
2077 2078 2079
		ret = ath_tx_aggr_start(sc, sta, tid, ssn);
		if (!ret)
			ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
2080
		ath9k_ps_restore(sc);
2081 2082
		break;
	case IEEE80211_AMPDU_TX_STOP:
2083
		ath9k_ps_wakeup(sc);
S
Sujith 已提交
2084
		ath_tx_aggr_stop(sc, sta, tid);
2085
		ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
2086
		ath9k_ps_restore(sc);
2087
		break;
2088
	case IEEE80211_AMPDU_TX_OPERATIONAL:
2089
		ath9k_ps_wakeup(sc);
2090
		ath_tx_aggr_resume(sc, sta, tid);
2091
		ath9k_ps_restore(sc);
2092
		break;
2093
	default:
2094 2095
		ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_FATAL,
			  "Unknown AMPDU action\n");
2096 2097
	}

2098 2099
	local_bh_enable();

2100
	return ret;
2101 2102
}

2103 2104 2105 2106 2107
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;
2108
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
2109
	struct ieee80211_supported_band *sband;
2110 2111 2112 2113 2114 2115 2116
	struct ieee80211_channel *chan;
	unsigned long flags;
	int pos;

	spin_lock_irqsave(&common->cc_lock, flags);
	if (idx == 0)
		ath_update_survey_stats(sc);
2117 2118 2119 2120 2121 2122

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

2124 2125
	if (!sband)
		sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
2126

2127 2128 2129
	if (!sband || idx >= sband->n_channels) {
		spin_unlock_irqrestore(&common->cc_lock, flags);
		return -ENOENT;
2130
	}
2131

2132 2133 2134 2135 2136 2137
	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);

2138 2139 2140
	return 0;
}

2141 2142
static void ath9k_sw_scan_start(struct ieee80211_hw *hw)
{
2143 2144
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
2145

2146
	mutex_lock(&sc->mutex);
2147 2148
	if (ath9k_wiphy_scanning(sc)) {
		/*
2149 2150 2151 2152 2153
		 * 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.
2154
		 */
2155
		mutex_unlock(&sc->mutex);
2156 2157 2158 2159 2160
		return;
	}

	aphy->state = ATH_WIPHY_SCAN;
	ath9k_wiphy_pause_all_forced(sc, aphy);
2161
	mutex_unlock(&sc->mutex);
2162 2163
}

2164 2165 2166 2167
/*
 * XXX: this requires a revisit after the driver
 * scan_complete gets moved to another place/removed in mac80211.
 */
2168 2169
static void ath9k_sw_scan_complete(struct ieee80211_hw *hw)
{
2170 2171
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
2172

2173
	mutex_lock(&sc->mutex);
2174
	aphy->state = ATH_WIPHY_ACTIVE;
2175
	mutex_unlock(&sc->mutex);
2176 2177
}

2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189
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);
}

2190
struct ieee80211_ops ath9k_ops = {
2191 2192 2193 2194 2195 2196 2197
	.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,
2198 2199
	.sta_add	    = ath9k_sta_add,
	.sta_remove	    = ath9k_sta_remove,
2200 2201 2202 2203
	.conf_tx 	    = ath9k_conf_tx,
	.bss_info_changed   = ath9k_bss_info_changed,
	.set_key            = ath9k_set_key,
	.get_tsf 	    = ath9k_get_tsf,
2204
	.set_tsf 	    = ath9k_set_tsf,
2205
	.reset_tsf 	    = ath9k_reset_tsf,
2206
	.ampdu_action       = ath9k_ampdu_action,
2207
	.get_survey	    = ath9k_get_survey,
2208 2209
	.sw_scan_start      = ath9k_sw_scan_start,
	.sw_scan_complete   = ath9k_sw_scan_complete,
J
Johannes Berg 已提交
2210
	.rfkill_poll        = ath9k_rfkill_poll_state,
2211
	.set_coverage_class = ath9k_set_coverage_class,
2212
};