main.c 54.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

21 22
static void ath_cache_conf_rate(struct ath_softc *sc,
				struct ieee80211_conf *conf)
S
Sujith 已提交
23
{
24 25 26
	switch (conf->channel->band) {
	case IEEE80211_BAND_2GHZ:
		if (conf_is_ht20(conf))
27
			sc->cur_rate_mode = ATH9K_MODE_11NG_HT20;
28
		else if (conf_is_ht40_minus(conf))
29
			sc->cur_rate_mode = ATH9K_MODE_11NG_HT40MINUS;
30
		else if (conf_is_ht40_plus(conf))
31
			sc->cur_rate_mode = ATH9K_MODE_11NG_HT40PLUS;
32
		else
33
			sc->cur_rate_mode = ATH9K_MODE_11G;
34 35 36
		break;
	case IEEE80211_BAND_5GHZ:
		if (conf_is_ht20(conf))
37
			sc->cur_rate_mode = ATH9K_MODE_11NA_HT20;
38
		else if (conf_is_ht40_minus(conf))
39
			sc->cur_rate_mode = ATH9K_MODE_11NA_HT40MINUS;
40
		else if (conf_is_ht40_plus(conf))
41
			sc->cur_rate_mode = ATH9K_MODE_11NA_HT40PLUS;
42
		else
43
			sc->cur_rate_mode = ATH9K_MODE_11A;
44 45
		break;
	default:
46
		BUG_ON(1);
47 48
		break;
	}
S
Sujith 已提交
49 50 51 52
}

static void ath_update_txpow(struct ath_softc *sc)
{
53
	struct ath_hw *ah = sc->sc_ah;
S
Sujith 已提交
54

S
Sujith 已提交
55 56
	if (sc->curtxpow != sc->config.txpowlimit) {
		ath9k_hw_set_txpowerlimit(ah, sc->config.txpowlimit);
S
Sujith 已提交
57
		/* read back in case value is clamped */
F
Felix Fietkau 已提交
58
		sc->curtxpow = ath9k_hw_regulatory(ah)->power_limit;
S
Sujith 已提交
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
	}
}

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

97 98 99 100 101 102 103 104 105 106 107 108 109
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 已提交
110
bool ath9k_setpower(struct ath_softc *sc, enum ath9k_power_mode mode)
111 112 113 114
{
	unsigned long flags;
	bool ret;

115 116 117
	spin_lock_irqsave(&sc->sc_pm_lock, flags);
	ret = ath9k_hw_setpower(sc->sc_ah, mode);
	spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
118 119 120 121

	return ret;
}

122 123 124 125 126 127 128 129
void ath9k_ps_wakeup(struct ath_softc *sc)
{
	unsigned long flags;

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

130
	ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE);
131 132 133 134 135 136 137 138 139 140 141 142 143

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

void ath9k_ps_restore(struct ath_softc *sc)
{
	unsigned long flags;

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

144 145 146 147
	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 已提交
148 149 150
			      PS_WAIT_FOR_CAB |
			      PS_WAIT_FOR_PSPOLL_DATA |
			      PS_WAIT_FOR_TX_ACK)))
151
		ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_NETWORK_SLEEP);
152 153 154 155 156

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

157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
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));
}

178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
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;

	ath_hw_cycle_counters_update(common);

	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 已提交
216 217 218 219 220
/*
 * 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.
*/
221 222
int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
		    struct ath9k_channel *hchan)
S
Sujith 已提交
223
{
224
	struct ath_wiphy *aphy = hw->priv;
225
	struct ath_hw *ah = sc->sc_ah;
226
	struct ath_common *common = ath9k_hw_common(ah);
L
Luis R. Rodriguez 已提交
227
	struct ieee80211_conf *conf = &common->hw->conf;
S
Sujith 已提交
228
	bool fastcc = true, stopped;
229
	struct ieee80211_channel *channel = hw->conf.channel;
230
	struct ath9k_hw_cal_data *caldata = NULL;
231
	int r;
S
Sujith 已提交
232 233 234 235

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

236 237 238 239 240
	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);

241 242
	ath9k_ps_wakeup(sc);

243 244 245 246 247 248 249 250 251 252
	/*
	 * 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 已提交
253
	ath_drain_all_txq(sc, false);
254
	stopped = ath_stoprecv(sc);
S
Sujith 已提交
255

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

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

263 264 265
	if (!(sc->sc_flags & SC_OP_OFFCHANNEL))
		caldata = &aphy->caldata;

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

272 273
	spin_lock_bh(&sc->sc_resetlock);

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

	if (ath_startrecv(sc) != 0) {
286 287
		ath_print(common, ATH_DBG_FATAL,
			  "Unable to restart recv logic\n");
288 289
		r = -EIO;
		goto ps_restore;
290 291 292 293
	}

	ath_cache_conf_rate(sc, &hw->conf);
	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 594 595 596 597 598 599
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);
	}
	ath_reset(sc, false);

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) {
S
Sujith 已提交
612
		ath_reset(sc, false);
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) {
S
Sujith 已提交
627
		spin_lock_bh(&sc->rx.rxflushlock);
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);
S
Sujith 已提交
635
		spin_unlock_bh(&sc->rx.rxflushlock);
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
		ath9k_hw_proc_mib_event(ah);
P
Pavel Roskin 已提交
766
		ath9k_hw_set_interrupts(ah, ah->imask);
S
Sujith 已提交
767
	}
S
Sujith 已提交
768

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

chip_reset:
S
Sujith 已提交
779

780 781
	ath_debug_stat_interrupt(sc, status);

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

	return IRQ_HANDLED;
S
Sujith 已提交
789 790

#undef SCHED_INTR
S
Sujith 已提交
791 792
}

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

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

	return chanmode;
}

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

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

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

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

858
		/* Configure the beacon */
859
		ath_beacon_config(sc, vif);
860

861
		/* Reset rssi stats */
862
		sc->sc_ah->stats.avgbrssi = ATH_RSSI_DUMMY_MARKER;
863

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

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

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

885 886 887
	if (!ah->curchan)
		ah->curchan = ath_get_curchannel(sc, sc->hw);

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

	ath_update_txpow(sc);
	if (ath_startrecv(sc) != 0) {
900 901
		ath_print(common, ATH_DBG_FATAL,
			  "Unable to restart recv logic\n");
902 903 904 905
		return;
	}

	if (sc->sc_flags & SC_OP_BEACONS)
906
		ath_beacon_config(sc, NULL);	/* restart beacons */
907 908

	/* Re-Enable  interrupts */
P
Pavel Roskin 已提交
909
	ath9k_hw_set_interrupts(ah, ah->imask);
910 911

	/* Enable LED */
912
	ath9k_hw_cfg_output(ah, ah->led_pin,
913
			    AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
914
	ath9k_hw_set_gpio(ah, ah->led_pin, 0);
915

916
	ieee80211_wake_queues(hw);
917
	ath9k_ps_restore(sc);
918 919
}

920
void ath_radio_disable(struct ath_softc *sc, struct ieee80211_hw *hw)
921
{
922
	struct ath_hw *ah = sc->sc_ah;
923
	struct ieee80211_channel *channel = hw->conf.channel;
924
	int r;
925

926
	ath9k_ps_wakeup(sc);
927
	ieee80211_stop_queues(hw);
928

929 930 931 932 933 934 935 936
	/*
	 * 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);
	}
937 938 939 940

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

S
Sujith 已提交
941
	ath_drain_all_txq(sc, false);	/* clear pending tx frames */
942 943 944
	ath_stoprecv(sc);		/* turn off frame recv */
	ath_flushrecv(sc);		/* flush recv queue */

945
	if (!ah->curchan)
946
		ah->curchan = ath_get_curchannel(sc, hw);
947

948
	spin_lock_bh(&sc->sc_resetlock);
949
	r = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false);
950
	if (r) {
951
		ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_FATAL,
952
			  "Unable to reset channel (%u MHz), "
953 954
			  "reset status %d\n",
			  channel->center_freq, r);
955 956 957 958
	}
	spin_unlock_bh(&sc->sc_resetlock);

	ath9k_hw_phy_disable(ah);
V
Vivek Natarajan 已提交
959
	ath9k_hw_configpcipowersave(ah, 1, 1);
960
	ath9k_ps_restore(sc);
961
	ath9k_setpower(sc, ATH9K_PM_FULL_SLEEP);
962 963
}

S
Sujith 已提交
964 965
int ath_reset(struct ath_softc *sc, bool retry_tx)
{
966
	struct ath_hw *ah = sc->sc_ah;
967
	struct ath_common *common = ath9k_hw_common(ah);
968
	struct ieee80211_hw *hw = sc->hw;
969
	int r;
S
Sujith 已提交
970

S
Sujith 已提交
971 972 973
	/* Stop ANI */
	del_timer_sync(&common->ani.timer);

S
Sujith 已提交
974 975
	ieee80211_stop_queues(hw);

S
Sujith 已提交
976
	ath9k_hw_set_interrupts(ah, 0);
S
Sujith 已提交
977
	ath_drain_all_txq(sc, retry_tx);
S
Sujith 已提交
978 979 980 981
	ath_stoprecv(sc);
	ath_flushrecv(sc);

	spin_lock_bh(&sc->sc_resetlock);
982
	r = ath9k_hw_reset(ah, sc->sc_ah->curchan, ah->caldata, false);
983
	if (r)
984 985
		ath_print(common, ATH_DBG_FATAL,
			  "Unable to reset hardware; reset status %d\n", r);
S
Sujith 已提交
986 987 988
	spin_unlock_bh(&sc->sc_resetlock);

	if (ath_startrecv(sc) != 0)
989 990
		ath_print(common, ATH_DBG_FATAL,
			  "Unable to start recv logic\n");
S
Sujith 已提交
991 992 993 994 995 996

	/*
	 * 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.
	 */
997
	ath_cache_conf_rate(sc, &hw->conf);
S
Sujith 已提交
998 999 1000

	ath_update_txpow(sc);

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

P
Pavel Roskin 已提交
1004
	ath9k_hw_set_interrupts(ah, ah->imask);
S
Sujith 已提交
1005 1006 1007 1008 1009

	if (retry_tx) {
		int i;
		for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
			if (ATH_TXQ_SETUP(sc, i)) {
S
Sujith 已提交
1010 1011 1012
				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 已提交
1013 1014 1015 1016
			}
		}
	}

S
Sujith 已提交
1017 1018
	ieee80211_wake_queues(hw);

S
Sujith 已提交
1019 1020 1021
	/* Start ANI */
	ath_start_ani(common);

1022
	return r;
S
Sujith 已提交
1023 1024
}

1025
static int ath_get_hal_qnum(u16 queue, struct ath_softc *sc)
S
Sujith 已提交
1026 1027 1028 1029 1030
{
	int qnum;

	switch (queue) {
	case 0:
1031
		qnum = sc->tx.hwq_map[WME_AC_VO];
S
Sujith 已提交
1032 1033
		break;
	case 1:
1034
		qnum = sc->tx.hwq_map[WME_AC_VI];
S
Sujith 已提交
1035 1036
		break;
	case 2:
1037
		qnum = sc->tx.hwq_map[WME_AC_BE];
S
Sujith 已提交
1038 1039
		break;
	case 3:
1040
		qnum = sc->tx.hwq_map[WME_AC_BK];
S
Sujith 已提交
1041 1042
		break;
	default:
1043
		qnum = sc->tx.hwq_map[WME_AC_BE];
S
Sujith 已提交
1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054
		break;
	}

	return qnum;
}

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

	switch (queue) {
1055
	case WME_AC_VO:
S
Sujith 已提交
1056 1057
		qnum = 0;
		break;
1058
	case WME_AC_VI:
S
Sujith 已提交
1059 1060
		qnum = 1;
		break;
1061
	case WME_AC_BE:
S
Sujith 已提交
1062 1063
		qnum = 2;
		break;
1064
	case WME_AC_BK:
S
Sujith 已提交
1065 1066 1067 1068 1069 1070 1071 1072 1073 1074
		qnum = 3;
		break;
	default:
		qnum = -1;
		break;
	}

	return qnum;
}

1075 1076
/* XXX: Remove me once we don't depend on ath9k_channel for all
 * this redundant data */
1077 1078
void ath9k_update_ichannel(struct ath_softc *sc, struct ieee80211_hw *hw,
			   struct ath9k_channel *ichan)
1079 1080 1081 1082 1083 1084 1085 1086 1087
{
	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 已提交
1088
		ichan->channelFlags = CHANNEL_2GHZ | CHANNEL_OFDM | CHANNEL_G;
1089 1090 1091 1092 1093
	} else {
		ichan->chanmode = CHANNEL_A;
		ichan->channelFlags = CHANNEL_5GHZ | CHANNEL_OFDM;
	}

L
Luis R. Rodriguez 已提交
1094
	if (conf_is_ht(conf))
1095 1096 1097 1098
		ichan->chanmode = ath_get_extchanmode(sc, chan,
					    conf->channel_type);
}

S
Sujith 已提交
1099 1100 1101 1102
/**********************/
/* mac80211 callbacks */
/**********************/

1103
static int ath9k_start(struct ieee80211_hw *hw)
1104
{
1105 1106
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1107
	struct ath_hw *ah = sc->sc_ah;
1108
	struct ath_common *common = ath9k_hw_common(ah);
1109
	struct ieee80211_channel *curchan = hw->conf.channel;
S
Sujith 已提交
1110
	struct ath9k_channel *init_channel;
1111
	int r;
1112

1113 1114 1115
	ath_print(common, ATH_DBG_CONFIG,
		  "Starting driver with initial channel: %d MHz\n",
		  curchan->center_freq);
1116

1117 1118
	mutex_lock(&sc->mutex);

1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139
	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;

1140
	/* setup initial channel */
1141

1142
	sc->chan_idx = curchan->hw_value;
1143

1144
	init_channel = ath_get_curchannel(sc, hw);
S
Sujith 已提交
1145 1146

	/* Reset SERDES registers */
1147
	ath9k_hw_configpcipowersave(ah, 0, 0);
S
Sujith 已提交
1148 1149 1150 1151 1152 1153 1154 1155 1156

	/*
	 * 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.
	 */
	spin_lock_bh(&sc->sc_resetlock);
1157
	r = ath9k_hw_reset(ah, init_channel, ah->caldata, false);
1158
	if (r) {
1159 1160 1161 1162
		ath_print(common, ATH_DBG_FATAL,
			  "Unable to reset hardware; reset status %d "
			  "(freq %u MHz)\n", r,
			  curchan->center_freq);
S
Sujith 已提交
1163
		spin_unlock_bh(&sc->sc_resetlock);
1164
		goto mutex_unlock;
S
Sujith 已提交
1165 1166 1167 1168 1169 1170 1171 1172
	}
	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);
1173

S
Sujith 已提交
1174 1175 1176 1177 1178 1179 1180 1181
	/*
	 * 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) {
1182 1183
		ath_print(common, ATH_DBG_FATAL,
			  "Unable to start recv logic\n");
1184 1185
		r = -EIO;
		goto mutex_unlock;
1186
	}
1187

S
Sujith 已提交
1188
	/* Setup our intr mask. */
F
Felix Fietkau 已提交
1189 1190 1191 1192 1193
	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)
1194 1195 1196
		ah->imask |= ATH9K_INT_RXHP |
			     ATH9K_INT_RXLP |
			     ATH9K_INT_BB_WATCHDOG;
F
Felix Fietkau 已提交
1197 1198
	else
		ah->imask |= ATH9K_INT_RX;
S
Sujith 已提交
1199

1200
	ah->imask |= ATH9K_INT_GTT;
S
Sujith 已提交
1201

1202
	if (ah->caps.hw_caps & ATH9K_HW_CAP_HT)
P
Pavel Roskin 已提交
1203
		ah->imask |= ATH9K_INT_CST;
S
Sujith 已提交
1204

1205
	ath_cache_conf_rate(sc, &hw->conf);
S
Sujith 已提交
1206 1207 1208 1209

	sc->sc_flags &= ~SC_OP_INVALID;

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

1213
	ieee80211_wake_queues(hw);
S
Sujith 已提交
1214

1215
	ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0);
1216

1217 1218
	if ((ah->btcoex_hw.scheme != ATH_BTCOEX_CFG_NONE) &&
	    !ah->btcoex_hw.enabled) {
1219 1220
		ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT,
					   AR_STOMP_LOW_WLAN_WGHT);
1221
		ath9k_hw_btcoex_enable(ah);
1222

1223 1224
		if (common->bus_ops->bt_coex_prep)
			common->bus_ops->bt_coex_prep(common);
1225
		if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE)
1226
			ath9k_btcoex_timer_resume(sc);
1227 1228
	}

1229 1230 1231
mutex_unlock:
	mutex_unlock(&sc->mutex);

1232
	return r;
1233 1234
}

1235 1236
static int ath9k_tx(struct ieee80211_hw *hw,
		    struct sk_buff *skb)
1237
{
S
Sujith 已提交
1238
	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1239 1240
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1241
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
S
Sujith 已提交
1242
	struct ath_tx_control txctl;
1243 1244
	int padpos, padsize;
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
1245
	int qnum;
S
Sujith 已提交
1246

1247
	if (aphy->state != ATH_WIPHY_ACTIVE && aphy->state != ATH_WIPHY_SCAN) {
1248 1249 1250
		ath_print(common, ATH_DBG_XMIT,
			  "ath9k: %s: TX in unexpected wiphy state "
			  "%d\n", wiphy_name(hw->wiphy), aphy->state);
1251 1252 1253
		goto exit;
	}

1254
	if (sc->ps_enabled) {
1255 1256 1257 1258 1259 1260 1261
		/*
		 * 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)) {
1262 1263
			ath_print(common, ATH_DBG_PS, "Add PM=1 for a TX frame "
				  "while in PS mode\n");
1264 1265 1266 1267
			hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM);
		}
	}

1268 1269 1270 1271 1272 1273 1274
	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);
1275 1276
		if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
			ath9k_hw_setrxabort(sc->sc_ah, 0);
1277
		if (ieee80211_is_pspoll(hdr->frame_control)) {
1278 1279
			ath_print(common, ATH_DBG_PS,
				  "Sending PS-Poll to pick a buffered frame\n");
S
Sujith 已提交
1280
			sc->ps_flags |= PS_WAIT_FOR_PSPOLL_DATA;
1281
		} else {
1282 1283
			ath_print(common, ATH_DBG_PS,
				  "Wake up to complete TX\n");
S
Sujith 已提交
1284
			sc->ps_flags |= PS_WAIT_FOR_TX_ACK;
1285 1286 1287 1288 1289 1290 1291 1292 1293
		}
		/*
		 * 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 已提交
1294
	memset(&txctl, 0, sizeof(struct ath_tx_control));
1295

1296 1297 1298 1299 1300 1301 1302
	/*
	 * 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 已提交
1303
			sc->tx.seq_no += 0x10;
1304
		hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
S
Sujith 已提交
1305
		hdr->seq_ctrl |= cpu_to_le16(sc->tx.seq_no);
1306
	}
1307

1308
	/* Add the padding after the header if this is not already done */
1309 1310 1311
	padpos = ath9k_cmn_padpos(hdr->frame_control);
	padsize = padpos & 3;
	if (padsize && skb->len>padpos) {
1312 1313 1314
		if (skb_headroom(skb) < padsize)
			return -1;
		skb_push(skb, padsize);
1315
		memmove(skb->data, skb->data + padsize, padpos);
1316 1317
	}

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

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

1323
	if (ath_tx_start(hw, skb, &txctl) != 0) {
1324
		ath_print(common, ATH_DBG_XMIT, "TX failed\n");
S
Sujith 已提交
1325
		goto exit;
1326 1327
	}

S
Sujith 已提交
1328 1329 1330
	return 0;
exit:
	dev_kfree_skb_any(skb);
1331
	return 0;
1332 1333
}

1334
static void ath9k_stop(struct ieee80211_hw *hw)
1335
{
1336 1337
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1338
	struct ath_hw *ah = sc->sc_ah;
1339
	struct ath_common *common = ath9k_hw_common(ah);
1340
	int i;
1341

S
Sujith 已提交
1342 1343
	mutex_lock(&sc->mutex);

1344 1345
	aphy->state = ATH_WIPHY_INACTIVE;

1346 1347 1348
	if (led_blink)
		cancel_delayed_work_sync(&sc->ath_led_blink_work);

1349
	cancel_delayed_work_sync(&sc->tx_complete_work);
1350
	cancel_work_sync(&sc->paprd_work);
1351
	cancel_work_sync(&sc->hw_check_work);
1352

1353 1354 1355 1356 1357 1358
	for (i = 0; i < sc->num_sec_wiphy; i++) {
		if (sc->sec_wiphy[i])
			break;
	}

	if (i == sc->num_sec_wiphy) {
1359 1360 1361 1362
		cancel_delayed_work_sync(&sc->wiphy_work);
		cancel_work_sync(&sc->chan_work);
	}

S
Sujith 已提交
1363
	if (sc->sc_flags & SC_OP_INVALID) {
1364
		ath_print(common, ATH_DBG_ANY, "Device not present\n");
S
Sujith 已提交
1365
		mutex_unlock(&sc->mutex);
S
Sujith 已提交
1366 1367
		return;
	}
1368

1369 1370 1371 1372 1373
	if (ath9k_wiphy_started(sc)) {
		mutex_unlock(&sc->mutex);
		return; /* another wiphy still in use */
	}

1374 1375 1376
	/* Ensure HW is awake when we try to shut it down. */
	ath9k_ps_wakeup(sc);

1377
	if (ah->btcoex_hw.enabled) {
1378
		ath9k_hw_btcoex_disable(ah);
1379
		if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE)
1380
			ath9k_btcoex_timer_pause(sc);
1381 1382
	}

S
Sujith 已提交
1383 1384
	/* make sure h/w will not generate any interrupt
	 * before setting the invalid flag. */
1385
	ath9k_hw_set_interrupts(ah, 0);
S
Sujith 已提交
1386 1387

	if (!(sc->sc_flags & SC_OP_INVALID)) {
S
Sujith 已提交
1388
		ath_drain_all_txq(sc, false);
S
Sujith 已提交
1389
		ath_stoprecv(sc);
1390
		ath9k_hw_phy_disable(ah);
S
Sujith 已提交
1391
	} else
S
Sujith 已提交
1392
		sc->rx.rxlink = NULL;
S
Sujith 已提交
1393 1394

	/* disable HAL and put h/w to sleep */
1395 1396
	ath9k_hw_disable(ah);
	ath9k_hw_configpcipowersave(ah, 1, 1);
1397 1398 1399
	ath9k_ps_restore(sc);

	/* Finally, put the chip in FULL SLEEP mode */
1400
	ath9k_setpower(sc, ATH9K_PM_FULL_SLEEP);
S
Sujith 已提交
1401 1402

	sc->sc_flags |= SC_OP_INVALID;
1403

1404 1405
	mutex_unlock(&sc->mutex);

1406
	ath_print(common, ATH_DBG_CONFIG, "Driver halt\n");
1407 1408
}

1409
static int ath9k_add_interface(struct ieee80211_hw *hw,
1410
			       struct ieee80211_vif *vif)
1411
{
1412 1413
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
P
Pavel Roskin 已提交
1414 1415
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
1416
	struct ath_vif *avp = (void *)vif->drv_priv;
1417
	enum nl80211_iftype ic_opmode = NL80211_IFTYPE_UNSPECIFIED;
1418
	int ret = 0;
1419

1420 1421
	mutex_lock(&sc->mutex);

1422
	switch (vif->type) {
1423
	case NL80211_IFTYPE_STATION:
1424
		ic_opmode = NL80211_IFTYPE_STATION;
1425
		break;
B
Bill Jordan 已提交
1426 1427 1428
	case NL80211_IFTYPE_WDS:
		ic_opmode = NL80211_IFTYPE_WDS;
		break;
1429 1430
	case NL80211_IFTYPE_ADHOC:
	case NL80211_IFTYPE_AP:
1431
	case NL80211_IFTYPE_MESH_POINT:
1432 1433 1434 1435
		if (sc->nbcnvifs >= ATH_BCBUF) {
			ret = -ENOBUFS;
			goto out;
		}
1436
		ic_opmode = vif->type;
1437 1438
		break;
	default:
1439
		ath_print(common, ATH_DBG_FATAL,
1440
			"Interface type %d not yet supported\n", vif->type);
1441 1442
		ret = -EOPNOTSUPP;
		goto out;
1443 1444
	}

1445 1446
	ath_print(common, ATH_DBG_CONFIG,
		  "Attach a VIF of type: %d\n", ic_opmode);
1447

S
Sujith 已提交
1448
	/* Set the VIF opmode */
S
Sujith 已提交
1449 1450 1451
	avp->av_opmode = ic_opmode;
	avp->av_bslot = -1;

1452
	sc->nvifs++;
1453

1454
	ath9k_set_bssid_mask(hw, vif);
1455

1456 1457 1458
	if (sc->nvifs > 1)
		goto out; /* skip global settings for secondary vif */

S
Sujith 已提交
1459
	if (ic_opmode == NL80211_IFTYPE_AP) {
P
Pavel Roskin 已提交
1460
		ath9k_hw_set_tsfadjust(ah, 1);
S
Sujith 已提交
1461 1462
		sc->sc_flags |= SC_OP_TSF_RESET;
	}
S
Sujith 已提交
1463 1464

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

1467 1468 1469 1470
	/*
	 * Enable MIB interrupts when there are hardware phy counters.
	 * Note we only do this (at the moment) for station mode.
	 */
1471 1472 1473
	if ((vif->type == NL80211_IFTYPE_STATION) ||
	    (vif->type == NL80211_IFTYPE_ADHOC) ||
	    (vif->type == NL80211_IFTYPE_MESH_POINT)) {
1474 1475
		if (ah->config.enable_ani)
			ah->imask |= ATH9K_INT_MIB;
P
Pavel Roskin 已提交
1476
		ah->imask |= ATH9K_INT_TSFOOR;
1477 1478
	}

P
Pavel Roskin 已提交
1479
	ath9k_hw_set_interrupts(ah, ah->imask);
1480

1481 1482
	if (vif->type == NL80211_IFTYPE_AP    ||
	    vif->type == NL80211_IFTYPE_ADHOC ||
1483 1484
	    vif->type == NL80211_IFTYPE_MONITOR) {
		sc->sc_flags |= SC_OP_ANI_RUN;
1485
		ath_start_ani(common);
1486
	}
1487

1488
out:
1489
	mutex_unlock(&sc->mutex);
1490
	return ret;
1491 1492
}

1493
static void ath9k_remove_interface(struct ieee80211_hw *hw,
1494
				   struct ieee80211_vif *vif)
1495
{
1496 1497
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1498
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1499
	struct ath_vif *avp = (void *)vif->drv_priv;
1500
	int i;
1501

1502
	ath_print(common, ATH_DBG_CONFIG, "Detach Interface\n");
1503

1504 1505
	mutex_lock(&sc->mutex);

1506
	/* Stop ANI */
1507
	sc->sc_flags &= ~SC_OP_ANI_RUN;
1508
	del_timer_sync(&common->ani.timer);
J
Jouni Malinen 已提交
1509

1510
	/* Reclaim beacon resources */
1511 1512 1513
	if ((sc->sc_ah->opmode == NL80211_IFTYPE_AP) ||
	    (sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC) ||
	    (sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT)) {
1514
		ath9k_ps_wakeup(sc);
S
Sujith 已提交
1515
		ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq);
1516
		ath9k_ps_restore(sc);
J
Jouni Malinen 已提交
1517
	}
1518

1519
	ath_beacon_return(sc, avp);
1520
	sc->sc_flags &= ~SC_OP_BEACONS;
1521

1522
	for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++) {
1523
		if (sc->beacon.bslot[i] == vif) {
1524 1525 1526
			printk(KERN_DEBUG "%s: vif had allocated beacon "
			       "slot\n", __func__);
			sc->beacon.bslot[i] = NULL;
1527
			sc->beacon.bslot_aphy[i] = NULL;
1528 1529 1530
		}
	}

S
Sujith 已提交
1531
	sc->nvifs--;
1532 1533

	mutex_unlock(&sc->mutex);
1534 1535
}

1536
static void ath9k_enable_ps(struct ath_softc *sc)
1537
{
P
Pavel Roskin 已提交
1538 1539
	struct ath_hw *ah = sc->sc_ah;

1540
	sc->ps_enabled = true;
P
Pavel Roskin 已提交
1541 1542 1543 1544
	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);
1545
		}
1546
		ath9k_hw_setrxabort(ah, 1);
1547 1548 1549
	}
}

1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569
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);
		}
	}

}

1570
static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
1571
{
1572 1573
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1574 1575
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
1576
	struct ieee80211_conf *conf = &hw->conf;
1577
	bool disable_radio;
1578

1579
	mutex_lock(&sc->mutex);
1580

1581 1582 1583 1584 1585 1586
	/*
	 * 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.
	 */
1587
	if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1588 1589 1590
		bool enable_radio;
		bool all_wiphys_idle;
		bool idle = !!(conf->flags & IEEE80211_CONF_IDLE);
1591 1592 1593

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

1596
		enable_radio = (!idle && all_wiphys_idle);
1597 1598 1599 1600 1601 1602 1603

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

1606
		if (enable_radio) {
1607
			sc->ps_idle = false;
1608
			ath_radio_enable(sc, hw);
1609 1610
			ath_print(common, ATH_DBG_CONFIG,
				  "not-idle: enabling radio\n");
1611 1612 1613
		}
	}

1614 1615 1616 1617 1618 1619
	/*
	 * 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.
	 */
1620
	if (changed & IEEE80211_CONF_CHANGE_PS) {
1621 1622
		unsigned long flags;
		spin_lock_irqsave(&sc->sc_pm_lock, flags);
1623 1624
		if (conf->flags & IEEE80211_CONF_PS)
			ath9k_enable_ps(sc);
1625 1626
		else
			ath9k_disable_ps(sc);
1627
		spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
1628 1629
	}

S
Sujith 已提交
1630 1631 1632 1633 1634 1635 1636 1637
	if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
		if (conf->flags & IEEE80211_CONF_MONITOR) {
			ath_print(common, ATH_DBG_CONFIG,
				  "HW opmode set to Monitor mode\n");
			sc->sc_ah->opmode = NL80211_IFTYPE_MONITOR;
		}
	}

1638
	if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
1639
		struct ieee80211_channel *curchan = hw->conf.channel;
1640
		int pos = curchan->hw_value;
1641 1642 1643 1644 1645
		int old_pos = -1;
		unsigned long flags;

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

1647 1648
		aphy->chan_idx = pos;
		aphy->chan_is_ht = conf_is_ht(conf);
1649 1650 1651 1652
		if (hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
			sc->sc_flags |= SC_OP_OFFCHANNEL;
		else
			sc->sc_flags &= ~SC_OP_OFFCHANNEL;
1653

1654 1655 1656 1657 1658 1659 1660 1661 1662 1663
		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;
		}
1664

1665 1666
		ath_print(common, ATH_DBG_CONFIG, "Set channel: %d MHz\n",
			  curchan->center_freq);
1667

1668
		/* XXX: remove me eventualy */
1669
		ath9k_update_ichannel(sc, hw, &sc->sc_ah->channels[pos]);
1670

1671
		ath_update_chainmask(sc, conf_is_ht(conf));
S
Sujith 已提交
1672

1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697
		/* 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));
		}

1698
		if (ath_set_channel(sc, hw, &sc->sc_ah->channels[pos]) < 0) {
1699 1700
			ath_print(common, ATH_DBG_FATAL,
				  "Unable to set channel\n");
1701
			mutex_unlock(&sc->mutex);
1702 1703
			return -EINVAL;
		}
1704 1705 1706 1707 1708 1709 1710 1711

		/*
		 * 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 已提交
1712
	}
1713

1714
skip_chan_change:
1715
	if (changed & IEEE80211_CONF_CHANGE_POWER) {
S
Sujith 已提交
1716
		sc->config.txpowlimit = 2 * conf->power_level;
1717 1718
		ath_update_txpow(sc);
	}
1719

1720 1721 1722 1723
	spin_lock_bh(&sc->wiphy_lock);
	disable_radio = ath9k_all_wiphys_idle(sc);
	spin_unlock_bh(&sc->wiphy_lock);

1724
	if (disable_radio) {
1725
		ath_print(common, ATH_DBG_CONFIG, "idle: disabling radio\n");
1726
		sc->ps_idle = true;
1727
		ath_radio_disable(sc, hw);
1728 1729
	}

1730
	mutex_unlock(&sc->mutex);
1731

1732 1733 1734
	return 0;
}

1735 1736 1737 1738
#define SUPPORTED_FILTERS			\
	(FIF_PROMISC_IN_BSS |			\
	FIF_ALLMULTI |				\
	FIF_CONTROL |				\
1739
	FIF_PSPOLL |				\
1740 1741
	FIF_OTHER_BSS |				\
	FIF_BCN_PRBRESP_PROMISC |		\
1742
	FIF_PROBE_REQ |				\
1743
	FIF_FCSFAIL)
1744

1745 1746 1747 1748
/* FIXME: sc->sc_full_reset ? */
static void ath9k_configure_filter(struct ieee80211_hw *hw,
				   unsigned int changed_flags,
				   unsigned int *total_flags,
1749
				   u64 multicast)
1750
{
1751 1752
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1753
	u32 rfilt;
1754

1755 1756
	changed_flags &= SUPPORTED_FILTERS;
	*total_flags &= SUPPORTED_FILTERS;
1757

S
Sujith 已提交
1758
	sc->rx.rxfilter = *total_flags;
1759
	ath9k_ps_wakeup(sc);
1760 1761
	rfilt = ath_calcrxfilter(sc);
	ath9k_hw_setrxfilter(sc->sc_ah, rfilt);
1762
	ath9k_ps_restore(sc);
1763

1764 1765
	ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_CONFIG,
		  "Set HW RX filter: 0x%x\n", rfilt);
1766
}
1767

1768 1769 1770
static int ath9k_sta_add(struct ieee80211_hw *hw,
			 struct ieee80211_vif *vif,
			 struct ieee80211_sta *sta)
1771
{
1772 1773
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1774

1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789
	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;
1790 1791
}

1792
static int ath9k_conf_tx(struct ieee80211_hw *hw, u16 queue,
1793
			 const struct ieee80211_tx_queue_params *params)
1794
{
1795 1796
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1797
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1798 1799
	struct ath9k_tx_queue_info qi;
	int ret = 0, qnum;
1800

1801 1802
	if (queue >= WME_NUM_AC)
		return 0;
1803

1804 1805
	mutex_lock(&sc->mutex);

1806 1807
	memset(&qi, 0, sizeof(struct ath9k_tx_queue_info));

1808 1809 1810 1811 1812
	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);
1813

1814 1815 1816 1817 1818
	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);
1819

1820 1821
	ret = ath_txq_update(sc, qnum, &qi);
	if (ret)
1822
		ath_print(common, ATH_DBG_FATAL, "TXQ Update failed\n");
1823

1824
	if (sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC)
1825
		if ((qnum == sc->tx.hwq_map[WME_AC_BE]) && !ret)
1826 1827
			ath_beaconq_config(sc);

1828 1829
	mutex_unlock(&sc->mutex);

1830 1831
	return ret;
}
1832

1833 1834
static int ath9k_set_key(struct ieee80211_hw *hw,
			 enum set_key_cmd cmd,
1835 1836
			 struct ieee80211_vif *vif,
			 struct ieee80211_sta *sta,
1837 1838
			 struct ieee80211_key_conf *key)
{
1839 1840
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1841
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1842
	int ret = 0;
1843

1844 1845 1846
	if (modparam_nohwcrypt)
		return -ENOSPC;

1847
	mutex_lock(&sc->mutex);
1848
	ath9k_ps_wakeup(sc);
1849
	ath_print(common, ATH_DBG_CONFIG, "Set HW Key\n");
1850

1851 1852
	switch (cmd) {
	case SET_KEY:
1853
		ret = ath_key_config(common, vif, sta, key);
1854 1855
		if (ret >= 0) {
			key->hw_key_idx = ret;
1856 1857
			/* push IV and Michael MIC generation to stack */
			key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1858
			if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
1859
				key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
1860 1861
			if (sc->sc_ah->sw_mgmt_crypto &&
			    key->cipher == WLAN_CIPHER_SUITE_CCMP)
1862
				key->flags |= IEEE80211_KEY_FLAG_SW_MGMT;
1863
			ret = 0;
1864 1865 1866
		}
		break;
	case DISABLE_KEY:
1867
		ath_key_delete(common, key);
1868 1869 1870 1871
		break;
	default:
		ret = -EINVAL;
	}
1872

1873
	ath9k_ps_restore(sc);
1874 1875
	mutex_unlock(&sc->mutex);

1876 1877
	return ret;
}
1878

1879 1880 1881 1882 1883
static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
				   struct ieee80211_vif *vif,
				   struct ieee80211_bss_conf *bss_conf,
				   u32 changed)
{
1884 1885
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1886
	struct ath_hw *ah = sc->sc_ah;
1887
	struct ath_common *common = ath9k_hw_common(ah);
1888
	struct ath_vif *avp = (void *)vif->drv_priv;
1889
	int slottime;
S
Sujith 已提交
1890
	int error;
1891

1892 1893
	mutex_lock(&sc->mutex);

S
Sujith 已提交
1894 1895 1896 1897
	if (changed & BSS_CHANGED_BSSID) {
		/* Set BSSID */
		memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
		memcpy(avp->bssid, bss_conf->bssid, ETH_ALEN);
1898
		common->curaid = 0;
1899
		ath9k_hw_write_associd(ah);
1900

S
Sujith 已提交
1901 1902
		/* Set aggregation protection mode parameters */
		sc->config.ath_aggr_prot = 0;
1903

S
Sujith 已提交
1904 1905 1906
		/* Only legacy IBSS for now */
		if (vif->type == NL80211_IFTYPE_ADHOC)
			ath_update_chainmask(sc, 0);
1907

S
Sujith 已提交
1908 1909 1910
		ath_print(common, ATH_DBG_CONFIG,
			  "BSSID: %pM aid: 0x%x\n",
			  common->curbssid, common->curaid);
1911

S
Sujith 已提交
1912 1913 1914
		/* need to reconfigure the beacon */
		sc->sc_flags &= ~SC_OP_BEACONS ;
	}
1915

S
Sujith 已提交
1916 1917 1918 1919 1920 1921 1922
	/* 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);
1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941
	}

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

S
Sujith 已提交
1944 1945 1946
	/* Disable transmission of beacons */
	if ((changed & BSS_CHANGED_BEACON_ENABLED) && !bss_conf->enable_beacon)
		ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq);
1947

S
Sujith 已提交
1948 1949 1950 1951 1952 1953 1954 1955 1956
	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);
1957 1958 1959
			error = ath_beacon_alloc(aphy, vif);
			if (!error)
				ath_beacon_config(sc, vif);
S
Sujith 已提交
1960 1961
		} else {
			ath_beacon_config(sc, vif);
1962 1963 1964
		}
	}

1965
	if (changed & BSS_CHANGED_ERP_PREAMBLE) {
1966 1967
		ath_print(common, ATH_DBG_CONFIG, "BSS Changed PREAMBLE %d\n",
			  bss_conf->use_short_preamble);
1968 1969 1970 1971 1972
		if (bss_conf->use_short_preamble)
			sc->sc_flags |= SC_OP_PREAMBLE_SHORT;
		else
			sc->sc_flags &= ~SC_OP_PREAMBLE_SHORT;
	}
1973

1974
	if (changed & BSS_CHANGED_ERP_CTS_PROT) {
1975 1976
		ath_print(common, ATH_DBG_CONFIG, "BSS Changed CTS PROT %d\n",
			  bss_conf->use_cts_prot);
1977 1978 1979 1980 1981 1982
		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;
	}
1983

1984
	if (changed & BSS_CHANGED_ASSOC) {
1985
		ath_print(common, ATH_DBG_CONFIG, "BSS Changed ASSOC %d\n",
1986
			bss_conf->assoc);
S
Sujith 已提交
1987
		ath9k_bss_assoc_info(sc, vif, bss_conf);
1988
	}
1989 1990

	mutex_unlock(&sc->mutex);
1991
}
1992

1993 1994 1995
static u64 ath9k_get_tsf(struct ieee80211_hw *hw)
{
	u64 tsf;
1996 1997
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1998

1999 2000 2001
	mutex_lock(&sc->mutex);
	tsf = ath9k_hw_gettsf64(sc->sc_ah);
	mutex_unlock(&sc->mutex);
2002

2003 2004
	return tsf;
}
2005

2006 2007
static void ath9k_set_tsf(struct ieee80211_hw *hw, u64 tsf)
{
2008 2009
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
2010

2011 2012 2013
	mutex_lock(&sc->mutex);
	ath9k_hw_settsf64(sc->sc_ah, tsf);
	mutex_unlock(&sc->mutex);
2014 2015
}

2016 2017
static void ath9k_reset_tsf(struct ieee80211_hw *hw)
{
2018 2019
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
2020

2021
	mutex_lock(&sc->mutex);
2022 2023

	ath9k_ps_wakeup(sc);
2024
	ath9k_hw_reset_tsf(sc->sc_ah);
2025 2026
	ath9k_ps_restore(sc);

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

2030
static int ath9k_ampdu_action(struct ieee80211_hw *hw,
2031
			      struct ieee80211_vif *vif,
2032 2033 2034
			      enum ieee80211_ampdu_mlme_action action,
			      struct ieee80211_sta *sta,
			      u16 tid, u16 *ssn)
2035
{
2036 2037
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
2038
	int ret = 0;
2039

2040 2041
	local_bh_disable();

2042 2043
	switch (action) {
	case IEEE80211_AMPDU_RX_START:
2044 2045
		if (!(sc->sc_flags & SC_OP_RXAGGR))
			ret = -ENOTSUPP;
2046 2047 2048 2049
		break;
	case IEEE80211_AMPDU_RX_STOP:
		break;
	case IEEE80211_AMPDU_TX_START:
2050
		ath9k_ps_wakeup(sc);
2051 2052 2053
		ret = ath_tx_aggr_start(sc, sta, tid, ssn);
		if (!ret)
			ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
2054
		ath9k_ps_restore(sc);
2055 2056
		break;
	case IEEE80211_AMPDU_TX_STOP:
2057
		ath9k_ps_wakeup(sc);
S
Sujith 已提交
2058
		ath_tx_aggr_stop(sc, sta, tid);
2059
		ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
2060
		ath9k_ps_restore(sc);
2061
		break;
2062
	case IEEE80211_AMPDU_TX_OPERATIONAL:
2063
		ath9k_ps_wakeup(sc);
2064
		ath_tx_aggr_resume(sc, sta, tid);
2065
		ath9k_ps_restore(sc);
2066
		break;
2067
	default:
2068 2069
		ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_FATAL,
			  "Unknown AMPDU action\n");
2070 2071
	}

2072 2073
	local_bh_enable();

2074
	return ret;
2075 2076
}

2077 2078 2079 2080 2081
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;
2082
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
2083
	struct ieee80211_supported_band *sband;
2084 2085 2086 2087 2088 2089 2090
	struct ieee80211_channel *chan;
	unsigned long flags;
	int pos;

	spin_lock_irqsave(&common->cc_lock, flags);
	if (idx == 0)
		ath_update_survey_stats(sc);
2091 2092 2093 2094 2095 2096

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

2098 2099
	if (!sband)
		sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
2100

2101 2102 2103
	if (!sband || idx >= sband->n_channels) {
		spin_unlock_irqrestore(&common->cc_lock, flags);
		return -ENOENT;
2104
	}
2105

2106 2107 2108 2109 2110 2111
	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);

2112 2113 2114
	return 0;
}

2115 2116
static void ath9k_sw_scan_start(struct ieee80211_hw *hw)
{
2117 2118
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
2119

2120
	mutex_lock(&sc->mutex);
2121 2122
	if (ath9k_wiphy_scanning(sc)) {
		/*
2123 2124 2125 2126 2127
		 * 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.
2128
		 */
2129
		mutex_unlock(&sc->mutex);
2130 2131 2132 2133 2134
		return;
	}

	aphy->state = ATH_WIPHY_SCAN;
	ath9k_wiphy_pause_all_forced(sc, aphy);
2135
	mutex_unlock(&sc->mutex);
2136 2137
}

2138 2139 2140 2141
/*
 * XXX: this requires a revisit after the driver
 * scan_complete gets moved to another place/removed in mac80211.
 */
2142 2143
static void ath9k_sw_scan_complete(struct ieee80211_hw *hw)
{
2144 2145
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
2146

2147
	mutex_lock(&sc->mutex);
2148
	aphy->state = ATH_WIPHY_ACTIVE;
2149
	mutex_unlock(&sc->mutex);
2150 2151
}

2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163
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);
}

2164
struct ieee80211_ops ath9k_ops = {
2165 2166 2167 2168 2169 2170 2171
	.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,
2172 2173
	.sta_add	    = ath9k_sta_add,
	.sta_remove	    = ath9k_sta_remove,
2174 2175 2176 2177
	.conf_tx 	    = ath9k_conf_tx,
	.bss_info_changed   = ath9k_bss_info_changed,
	.set_key            = ath9k_set_key,
	.get_tsf 	    = ath9k_get_tsf,
2178
	.set_tsf 	    = ath9k_set_tsf,
2179
	.reset_tsf 	    = ath9k_reset_tsf,
2180
	.ampdu_action       = ath9k_ampdu_action,
2181
	.get_survey	    = ath9k_get_survey,
2182 2183
	.sw_scan_start      = ath9k_sw_scan_start,
	.sw_scan_complete   = ath9k_sw_scan_complete,
J
Johannes Berg 已提交
2184
	.rfkill_poll        = ath9k_rfkill_poll_state,
2185
	.set_coverage_class = ath9k_set_coverage_class,
2186
};