main.c 51.2 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);
}

S
Sujith 已提交
157 158 159 160 161
/*
 * 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.
*/
162 163
int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
		    struct ath9k_channel *hchan)
S
Sujith 已提交
164
{
165
	struct ath_hw *ah = sc->sc_ah;
166
	struct ath_common *common = ath9k_hw_common(ah);
L
Luis R. Rodriguez 已提交
167
	struct ieee80211_conf *conf = &common->hw->conf;
S
Sujith 已提交
168
	bool fastcc = true, stopped;
169 170
	struct ieee80211_channel *channel = hw->conf.channel;
	int r;
S
Sujith 已提交
171 172 173 174

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

175 176
	ath9k_ps_wakeup(sc);

177 178 179 180 181 182 183 184 185 186
	/*
	 * 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 已提交
187
	ath_drain_all_txq(sc, false);
188
	stopped = ath_stoprecv(sc);
S
Sujith 已提交
189

190 191 192
	/* XXX: do not flush receive queue here. We don't want
	 * to flush data frames already in queue because of
	 * changing channel. */
S
Sujith 已提交
193

194 195 196
	if (!stopped || (sc->sc_flags & SC_OP_FULL_RESET))
		fastcc = false;

197
	ath_print(common, ATH_DBG_CONFIG,
L
Luis R. Rodriguez 已提交
198
		  "(%u MHz) -> (%u MHz), conf_is_ht40: %d\n",
199
		  sc->sc_ah->curchan->channel,
L
Luis R. Rodriguez 已提交
200
		  channel->center_freq, conf_is_ht40(conf));
S
Sujith 已提交
201

202 203 204 205
	spin_lock_bh(&sc->sc_resetlock);

	r = ath9k_hw_reset(ah, hchan, fastcc);
	if (r) {
206
		ath_print(common, ATH_DBG_FATAL,
207
			  "Unable to reset channel (%u MHz), "
208 209
			  "reset status %d\n",
			  channel->center_freq, r);
210
		spin_unlock_bh(&sc->sc_resetlock);
211
		goto ps_restore;
S
Sujith 已提交
212
	}
213 214 215 216 217
	spin_unlock_bh(&sc->sc_resetlock);

	sc->sc_flags &= ~SC_OP_FULL_RESET;

	if (ath_startrecv(sc) != 0) {
218 219
		ath_print(common, ATH_DBG_FATAL,
			  "Unable to restart recv logic\n");
220 221
		r = -EIO;
		goto ps_restore;
222 223 224 225
	}

	ath_cache_conf_rate(sc, &hw->conf);
	ath_update_txpow(sc);
P
Pavel Roskin 已提交
226
	ath9k_hw_set_interrupts(ah, ah->imask);
227 228

 ps_restore:
229
	ath9k_ps_restore(sc);
230
	return r;
S
Sujith 已提交
231 232
}

233 234 235 236 237 238 239 240 241
static void ath_paprd_activate(struct ath_softc *sc)
{
	struct ath_hw *ah = sc->sc_ah;
	int chain;

	if (!ah->curchan->paprd_done)
		return;

	ath9k_ps_wakeup(sc);
242
	ar9003_paprd_enable(ah, false);
243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282
	for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
		if (!(ah->caps.tx_chainmask & BIT(chain)))
			continue;

		ar9003_paprd_populate_single_table(ah, ah->curchan, chain);
	}

	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;
	int qnum, ftype;
	int chain_ok = 0;
	int chain;
	int len = 1800;
	int time_left;
	int i;

	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);
283
	hdr->duration_id = cpu_to_le16(10);
284 285 286 287 288 289 290 291
	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];

292
	ath9k_ps_wakeup(sc);
293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313
	ar9003_paprd_init_table(ah);
	for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
		if (!(ah->caps.tx_chainmask & BIT(chain)))
			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,
314
				msecs_to_jiffies(ATH_PAPRD_TIMEOUT));
315 316 317 318 319
		if (!time_left) {
			ath_print(ath9k_hw_common(ah), ATH_DBG_CALIBRATE,
				  "Timeout waiting for paprd training on "
				  "TX chain %d\n",
				  chain);
320
			goto fail_paprd;
321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337
		}

		if (!ar9003_paprd_is_done(ah))
			break;

		if (ar9003_paprd_create_curve(ah, ah->curchan, chain) != 0)
			break;

		chain_ok = 1;
	}
	kfree_skb(skb);

	if (chain_ok) {
		ah->curchan->paprd_done = true;
		ath_paprd_activate(sc);
	}

338
fail_paprd:
339 340 341
	ath9k_ps_restore(sc);
}

S
Sujith 已提交
342 343 344 345 346 347 348
/*
 *  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 已提交
349
void ath_ani_calibrate(unsigned long data)
S
Sujith 已提交
350
{
351 352
	struct ath_softc *sc = (struct ath_softc *)data;
	struct ath_hw *ah = sc->sc_ah;
353
	struct ath_common *common = ath9k_hw_common(ah);
S
Sujith 已提交
354 355 356 357
	bool longcal = false;
	bool shortcal = false;
	bool aniflag = false;
	unsigned int timestamp = jiffies_to_msecs(jiffies);
358
	u32 cal_interval, short_cal_interval;
S
Sujith 已提交
359

360 361
	short_cal_interval = (ah->opmode == NL80211_IFTYPE_AP) ?
		ATH_AP_SHORT_CALINTERVAL : ATH_STA_SHORT_CALINTERVAL;
S
Sujith 已提交
362

363 364 365 366 367 368
	/* Only calibrate if awake */
	if (sc->sc_ah->power_mode != ATH9K_PM_AWAKE)
		goto set_timer;

	ath9k_ps_wakeup(sc);

S
Sujith 已提交
369
	/* Long calibration runs independently of short calibration. */
370
	if ((timestamp - common->ani.longcal_timer) >= ATH_LONG_CALINTERVAL) {
S
Sujith 已提交
371
		longcal = true;
372
		ath_print(common, ATH_DBG_ANI, "longcal @%lu\n", jiffies);
373
		common->ani.longcal_timer = timestamp;
S
Sujith 已提交
374 375
	}

S
Sujith 已提交
376
	/* Short calibration applies only while caldone is false */
377 378
	if (!common->ani.caldone) {
		if ((timestamp - common->ani.shortcal_timer) >= short_cal_interval) {
S
Sujith 已提交
379
			shortcal = true;
380 381
			ath_print(common, ATH_DBG_ANI,
				  "shortcal @%lu\n", jiffies);
382 383
			common->ani.shortcal_timer = timestamp;
			common->ani.resetcal_timer = timestamp;
S
Sujith 已提交
384 385
		}
	} else {
386
		if ((timestamp - common->ani.resetcal_timer) >=
S
Sujith 已提交
387
		    ATH_RESTART_CALINTERVAL) {
388 389 390
			common->ani.caldone = ath9k_hw_reset_calvalid(ah);
			if (common->ani.caldone)
				common->ani.resetcal_timer = timestamp;
S
Sujith 已提交
391 392 393 394
		}
	}

	/* Verify whether we must check ANI */
395 396
	if ((timestamp - common->ani.checkani_timer) >=
	     ah->config.ani_poll_interval) {
S
Sujith 已提交
397
		aniflag = true;
398
		common->ani.checkani_timer = timestamp;
S
Sujith 已提交
399 400 401 402 403 404
	}

	/* Skip all processing if there's nothing to do. */
	if (longcal || shortcal || aniflag) {
		/* Call ANI routine if necessary */
		if (aniflag)
405
			ath9k_hw_ani_monitor(ah, ah->curchan);
S
Sujith 已提交
406 407 408

		/* Perform calibration if necessary */
		if (longcal || shortcal) {
409
			common->ani.caldone =
410 411 412 413
				ath9k_hw_calibrate(ah,
						   ah->curchan,
						   common->rx_chainmask,
						   longcal);
S
Sujith 已提交
414 415

			if (longcal)
416
				common->ani.noise_floor = ath9k_hw_getchan_noise(ah,
S
Sujith 已提交
417 418
								     ah->curchan);

419 420 421 422
			ath_print(common, ATH_DBG_ANI,
				  " calibrate chan %u/%x nf: %d\n",
				  ah->curchan->channel,
				  ah->curchan->channelFlags,
423
				  common->ani.noise_floor);
S
Sujith 已提交
424 425 426
		}
	}

427 428
	ath9k_ps_restore(sc);

429
set_timer:
S
Sujith 已提交
430 431 432 433 434
	/*
	* Set timer interval based on previous results.
	* The interval must be the shortest necessary to satisfy ANI,
	* short calibration and long calibration.
	*/
435
	cal_interval = ATH_LONG_CALINTERVAL;
436
	if (sc->sc_ah->config.enable_ani)
437 438
		cal_interval = min(cal_interval,
				   (u32)ah->config.ani_poll_interval);
439
	if (!common->ani.caldone)
440
		cal_interval = min(cal_interval, (u32)short_cal_interval);
S
Sujith 已提交
441

442
	mod_timer(&common->ani.timer, jiffies + msecs_to_jiffies(cal_interval));
443 444 445 446 447 448 449
	if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_PAPRD) &&
	    !(sc->sc_flags & SC_OP_SCANNING)) {
		if (!sc->sc_ah->curchan->paprd_done)
			ieee80211_queue_work(sc->hw, &sc->paprd_work);
		else
			ath_paprd_activate(sc);
	}
S
Sujith 已提交
450 451
}

452
static void ath_start_ani(struct ath_common *common)
S
Sujith 已提交
453
{
454
	struct ath_hw *ah = common->ah;
S
Sujith 已提交
455
	unsigned long timestamp = jiffies_to_msecs(jiffies);
456 457 458 459
	struct ath_softc *sc = (struct ath_softc *) common->priv;

	if (!(sc->sc_flags & SC_OP_ANI_RUN))
		return;
S
Sujith 已提交
460

461 462 463
	common->ani.longcal_timer = timestamp;
	common->ani.shortcal_timer = timestamp;
	common->ani.checkani_timer = timestamp;
S
Sujith 已提交
464

465
	mod_timer(&common->ani.timer,
466 467
		  jiffies +
			msecs_to_jiffies((u32)ah->config.ani_poll_interval));
S
Sujith 已提交
468 469
}

S
Sujith 已提交
470 471 472
/*
 * Update tx/rx chainmask. For legacy association,
 * hard code chainmask to 1x1, for 11n association, use
473 474
 * the chainmask configuration, for bt coexistence, use
 * the chainmask configuration even in legacy mode.
S
Sujith 已提交
475
 */
476
void ath_update_chainmask(struct ath_softc *sc, int is_ht)
S
Sujith 已提交
477
{
478
	struct ath_hw *ah = sc->sc_ah;
479
	struct ath_common *common = ath9k_hw_common(ah);
480

481
	if ((sc->sc_flags & SC_OP_SCANNING) || is_ht ||
482
	    (ah->btcoex_hw.scheme != ATH_BTCOEX_CFG_NONE)) {
483 484
		common->tx_chainmask = ah->caps.tx_chainmask;
		common->rx_chainmask = ah->caps.rx_chainmask;
S
Sujith 已提交
485
	} else {
486 487
		common->tx_chainmask = 1;
		common->rx_chainmask = 1;
S
Sujith 已提交
488 489
	}

490
	ath_print(common, ATH_DBG_CONFIG,
491
		  "tx chmask: %d, rx chmask: %d\n",
492 493
		  common->tx_chainmask,
		  common->rx_chainmask);
S
Sujith 已提交
494 495 496 497 498 499 500 501
}

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

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

502
	if (sc->sc_flags & SC_OP_TXAGGR) {
S
Sujith 已提交
503
		ath_tx_node_init(sc, an);
S
Sujith 已提交
504
		an->maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
505 506
				     sta->ht_cap.ampdu_factor);
		an->mpdudensity = parse_mpdudensity(sta->ht_cap.ampdu_density);
507
		an->last_rssi = ATH_RSSI_DUMMY_MARKER;
508
	}
S
Sujith 已提交
509 510 511 512 513 514 515 516 517 518
}

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

519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537
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 已提交
538
void ath9k_tasklet(unsigned long data)
S
Sujith 已提交
539 540
{
	struct ath_softc *sc = (struct ath_softc *)data;
541
	struct ath_hw *ah = sc->sc_ah;
542
	struct ath_common *common = ath9k_hw_common(ah);
543

S
Sujith 已提交
544
	u32 status = sc->intrstatus;
F
Felix Fietkau 已提交
545
	u32 rxmask;
S
Sujith 已提交
546

547 548
	ath9k_ps_wakeup(sc);

549
	if (status & ATH9K_INT_FATAL) {
S
Sujith 已提交
550
		ath_reset(sc, false);
551
		ath9k_ps_restore(sc);
S
Sujith 已提交
552
		return;
S
Sujith 已提交
553
	}
S
Sujith 已提交
554

555 556 557
	if (!ath9k_hw_check_alive(ah))
		ieee80211_queue_work(sc->hw, &sc->hw_check_work);

F
Felix Fietkau 已提交
558 559 560 561 562 563 564
	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 已提交
565
		spin_lock_bh(&sc->rx.rxflushlock);
F
Felix Fietkau 已提交
566 567 568 569 570 571 572

		/* 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 已提交
573
		spin_unlock_bh(&sc->rx.rxflushlock);
S
Sujith 已提交
574 575
	}

576 577 578 579 580 581
	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 已提交
582

583
	if ((status & ATH9K_INT_TSFOOR) && sc->ps_enabled) {
584 585 586 587
		/*
		 * TSF sync does not look correct; remain awake to sync with
		 * the next Beacon.
		 */
588 589
		ath_print(common, ATH_DBG_PS,
			  "TSFOOR - Sync with next Beacon\n");
S
Sujith 已提交
590
		sc->ps_flags |= PS_WAIT_FOR_BEACON | PS_BEACON_SYNC;
591 592
	}

593
	if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE)
594 595 596
		if (status & ATH9K_INT_GENTIMER)
			ath_gen_timer_isr(sc->sc_ah);

S
Sujith 已提交
597
	/* re-enable hardware interrupt */
P
Pavel Roskin 已提交
598
	ath9k_hw_set_interrupts(ah, ah->imask);
599
	ath9k_ps_restore(sc);
S
Sujith 已提交
600 601
}

602
irqreturn_t ath_isr(int irq, void *dev)
S
Sujith 已提交
603
{
S
Sujith 已提交
604 605 606 607 608
#define SCHED_INTR (				\
		ATH9K_INT_FATAL |		\
		ATH9K_INT_RXORN |		\
		ATH9K_INT_RXEOL |		\
		ATH9K_INT_RX |			\
F
Felix Fietkau 已提交
609 610
		ATH9K_INT_RXLP |		\
		ATH9K_INT_RXHP |		\
S
Sujith 已提交
611 612 613
		ATH9K_INT_TX |			\
		ATH9K_INT_BMISS |		\
		ATH9K_INT_CST |			\
614 615
		ATH9K_INT_TSFOOR |		\
		ATH9K_INT_GENTIMER)
S
Sujith 已提交
616

S
Sujith 已提交
617
	struct ath_softc *sc = dev;
618
	struct ath_hw *ah = sc->sc_ah;
S
Sujith 已提交
619 620 621
	enum ath9k_int status;
	bool sched = false;

S
Sujith 已提交
622 623 624 625 626 627 628
	/*
	 * 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 已提交
629

S
Sujith 已提交
630 631 632

	/* shared irq, not for us */

633
	if (!ath9k_hw_intrpend(ah))
S
Sujith 已提交
634 635 636 637 638 639 640 641 642
		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 已提交
643
	status &= ah->imask;	/* discard unasked-for bits */
S
Sujith 已提交
644

S
Sujith 已提交
645 646 647 648
	/*
	 * If there are no status bits set, then this interrupt was not
	 * for me (should have been caught above).
	 */
649
	if (!status)
S
Sujith 已提交
650
		return IRQ_NONE;
S
Sujith 已提交
651

S
Sujith 已提交
652 653 654 655 656 657 658 659 660 661
	/* 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 已提交
662 663
	if ((status & ATH9K_INT_FATAL) || ((status & ATH9K_INT_RXORN) &&
	    !(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)))
S
Sujith 已提交
664 665
		goto chip_reset;

666 667 668 669 670 671
	if ((ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) &&
	    (status & ATH9K_INT_BB_WATCHDOG)) {
		ar9003_hw_bb_watchdog_dbg_info(ah);
		goto chip_reset;
	}

S
Sujith 已提交
672 673 674 675 676 677
	if (status & ATH9K_INT_SWBA)
		tasklet_schedule(&sc->bcon_tasklet);

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

F
Felix Fietkau 已提交
678 679 680 681 682 683 684
	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 已提交
685
	if (status & ATH9K_INT_MIB) {
S
Sujith 已提交
686
		/*
S
Sujith 已提交
687 688 689
		 * Disable interrupts until we service the MIB
		 * interrupt; otherwise it will continue to
		 * fire.
S
Sujith 已提交
690
		 */
S
Sujith 已提交
691 692 693 694 695 696
		ath9k_hw_set_interrupts(ah, 0);
		/*
		 * Let the hal handle the event. We assume
		 * it will clear whatever condition caused
		 * the interrupt.
		 */
697
		ath9k_hw_procmibevent(ah);
P
Pavel Roskin 已提交
698
		ath9k_hw_set_interrupts(ah, ah->imask);
S
Sujith 已提交
699
	}
S
Sujith 已提交
700

701 702
	if (!(ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
		if (status & ATH9K_INT_TIM_TIMER) {
S
Sujith 已提交
703 704
			/* Clear RxAbort bit so that we can
			 * receive frames */
705
			ath9k_setpower(sc, ATH9K_PM_AWAKE);
706
			ath9k_hw_setrxabort(sc->sc_ah, 0);
S
Sujith 已提交
707
			sc->ps_flags |= PS_WAIT_FOR_BEACON;
S
Sujith 已提交
708
		}
S
Sujith 已提交
709 710

chip_reset:
S
Sujith 已提交
711

712 713
	ath_debug_stat_interrupt(sc, status);

S
Sujith 已提交
714 715
	if (sched) {
		/* turn off every interrupt except SWBA */
P
Pavel Roskin 已提交
716
		ath9k_hw_set_interrupts(ah, (ah->imask & ATH9K_INT_SWBA));
S
Sujith 已提交
717 718 719 720
		tasklet_schedule(&sc->intr_tq);
	}

	return IRQ_HANDLED;
S
Sujith 已提交
721 722

#undef SCHED_INTR
S
Sujith 已提交
723 724
}

725
static u32 ath_get_extchanmode(struct ath_softc *sc,
726
			       struct ieee80211_channel *chan,
S
Sujith 已提交
727
			       enum nl80211_channel_type channel_type)
728 729 730 731 732
{
	u32 chanmode = 0;

	switch (chan->band) {
	case IEEE80211_BAND_2GHZ:
S
Sujith 已提交
733 734 735
		switch(channel_type) {
		case NL80211_CHAN_NO_HT:
		case NL80211_CHAN_HT20:
736
			chanmode = CHANNEL_G_HT20;
S
Sujith 已提交
737 738
			break;
		case NL80211_CHAN_HT40PLUS:
739
			chanmode = CHANNEL_G_HT40PLUS;
S
Sujith 已提交
740 741
			break;
		case NL80211_CHAN_HT40MINUS:
742
			chanmode = CHANNEL_G_HT40MINUS;
S
Sujith 已提交
743 744
			break;
		}
745 746
		break;
	case IEEE80211_BAND_5GHZ:
S
Sujith 已提交
747 748 749
		switch(channel_type) {
		case NL80211_CHAN_NO_HT:
		case NL80211_CHAN_HT20:
750
			chanmode = CHANNEL_A_HT20;
S
Sujith 已提交
751 752
			break;
		case NL80211_CHAN_HT40PLUS:
753
			chanmode = CHANNEL_A_HT40PLUS;
S
Sujith 已提交
754 755
			break;
		case NL80211_CHAN_HT40MINUS:
756
			chanmode = CHANNEL_A_HT40MINUS;
S
Sujith 已提交
757 758
			break;
		}
759 760 761 762 763 764 765 766
		break;
	default:
		break;
	}

	return chanmode;
}

767
static void ath9k_bss_assoc_info(struct ath_softc *sc,
S
Sujith 已提交
768
				 struct ieee80211_vif *vif,
769
				 struct ieee80211_bss_conf *bss_conf)
770
{
771
	struct ath_hw *ah = sc->sc_ah;
772
	struct ath_common *common = ath9k_hw_common(ah);
773

774
	if (bss_conf->assoc) {
775 776 777
		ath_print(common, ATH_DBG_CONFIG,
			  "Bss Info ASSOC %d, bssid: %pM\n",
			   bss_conf->aid, common->curbssid);
778

779
		/* New association, store aid */
780
		common->curaid = bss_conf->aid;
781
		ath9k_hw_write_associd(ah);
782 783 784 785 786 787

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

790
		/* Configure the beacon */
791
		ath_beacon_config(sc, vif);
792

793
		/* Reset rssi stats */
794
		sc->sc_ah->stats.avgbrssi = ATH_RSSI_DUMMY_MARKER;
795

796
		sc->sc_flags |= SC_OP_ANI_RUN;
797
		ath_start_ani(common);
798
	} else {
799
		ath_print(common, ATH_DBG_CONFIG, "Bss Info DISASSOC\n");
800
		common->curaid = 0;
801
		/* Stop ANI */
802
		sc->sc_flags &= ~SC_OP_ANI_RUN;
803
		del_timer_sync(&common->ani.timer);
804
	}
805
}
806

807
void ath_radio_enable(struct ath_softc *sc, struct ieee80211_hw *hw)
808
{
809
	struct ath_hw *ah = sc->sc_ah;
810
	struct ath_common *common = ath9k_hw_common(ah);
811
	struct ieee80211_channel *channel = hw->conf.channel;
812
	int r;
813

814
	ath9k_ps_wakeup(sc);
V
Vivek Natarajan 已提交
815
	ath9k_hw_configpcipowersave(ah, 0, 0);
816

817 818 819
	if (!ah->curchan)
		ah->curchan = ath_get_curchannel(sc, sc->hw);

S
Sujith 已提交
820
	spin_lock_bh(&sc->sc_resetlock);
821
	r = ath9k_hw_reset(ah, ah->curchan, false);
822
	if (r) {
823
		ath_print(common, ATH_DBG_FATAL,
824
			  "Unable to reset channel (%u MHz), "
825 826
			  "reset status %d\n",
			  channel->center_freq, r);
827 828 829 830 831
	}
	spin_unlock_bh(&sc->sc_resetlock);

	ath_update_txpow(sc);
	if (ath_startrecv(sc) != 0) {
832 833
		ath_print(common, ATH_DBG_FATAL,
			  "Unable to restart recv logic\n");
834 835 836 837
		return;
	}

	if (sc->sc_flags & SC_OP_BEACONS)
838
		ath_beacon_config(sc, NULL);	/* restart beacons */
839 840

	/* Re-Enable  interrupts */
P
Pavel Roskin 已提交
841
	ath9k_hw_set_interrupts(ah, ah->imask);
842 843

	/* Enable LED */
844
	ath9k_hw_cfg_output(ah, ah->led_pin,
845
			    AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
846
	ath9k_hw_set_gpio(ah, ah->led_pin, 0);
847

848
	ieee80211_wake_queues(hw);
849
	ath9k_ps_restore(sc);
850 851
}

852
void ath_radio_disable(struct ath_softc *sc, struct ieee80211_hw *hw)
853
{
854
	struct ath_hw *ah = sc->sc_ah;
855
	struct ieee80211_channel *channel = hw->conf.channel;
856
	int r;
857

858
	ath9k_ps_wakeup(sc);
859
	ieee80211_stop_queues(hw);
860

861 862 863 864 865 866 867 868
	/*
	 * 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);
	}
869 870 871 872

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

S
Sujith 已提交
873
	ath_drain_all_txq(sc, false);	/* clear pending tx frames */
874 875 876
	ath_stoprecv(sc);		/* turn off frame recv */
	ath_flushrecv(sc);		/* flush recv queue */

877
	if (!ah->curchan)
878
		ah->curchan = ath_get_curchannel(sc, hw);
879

880
	spin_lock_bh(&sc->sc_resetlock);
881
	r = ath9k_hw_reset(ah, ah->curchan, false);
882
	if (r) {
883
		ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_FATAL,
884
			  "Unable to reset channel (%u MHz), "
885 886
			  "reset status %d\n",
			  channel->center_freq, r);
887 888 889 890
	}
	spin_unlock_bh(&sc->sc_resetlock);

	ath9k_hw_phy_disable(ah);
V
Vivek Natarajan 已提交
891
	ath9k_hw_configpcipowersave(ah, 1, 1);
892
	ath9k_ps_restore(sc);
893
	ath9k_setpower(sc, ATH9K_PM_FULL_SLEEP);
894 895
}

S
Sujith 已提交
896 897
int ath_reset(struct ath_softc *sc, bool retry_tx)
{
898
	struct ath_hw *ah = sc->sc_ah;
899
	struct ath_common *common = ath9k_hw_common(ah);
900
	struct ieee80211_hw *hw = sc->hw;
901
	int r;
S
Sujith 已提交
902

S
Sujith 已提交
903 904 905
	/* Stop ANI */
	del_timer_sync(&common->ani.timer);

S
Sujith 已提交
906 907
	ieee80211_stop_queues(hw);

S
Sujith 已提交
908
	ath9k_hw_set_interrupts(ah, 0);
S
Sujith 已提交
909
	ath_drain_all_txq(sc, retry_tx);
S
Sujith 已提交
910 911 912 913
	ath_stoprecv(sc);
	ath_flushrecv(sc);

	spin_lock_bh(&sc->sc_resetlock);
914
	r = ath9k_hw_reset(ah, sc->sc_ah->curchan, false);
915
	if (r)
916 917
		ath_print(common, ATH_DBG_FATAL,
			  "Unable to reset hardware; reset status %d\n", r);
S
Sujith 已提交
918 919 920
	spin_unlock_bh(&sc->sc_resetlock);

	if (ath_startrecv(sc) != 0)
921 922
		ath_print(common, ATH_DBG_FATAL,
			  "Unable to start recv logic\n");
S
Sujith 已提交
923 924 925 926 927 928

	/*
	 * 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.
	 */
929
	ath_cache_conf_rate(sc, &hw->conf);
S
Sujith 已提交
930 931 932 933

	ath_update_txpow(sc);

	if (sc->sc_flags & SC_OP_BEACONS)
934
		ath_beacon_config(sc, NULL);	/* restart beacons */
S
Sujith 已提交
935

P
Pavel Roskin 已提交
936
	ath9k_hw_set_interrupts(ah, ah->imask);
S
Sujith 已提交
937 938 939 940 941

	if (retry_tx) {
		int i;
		for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
			if (ATH_TXQ_SETUP(sc, i)) {
S
Sujith 已提交
942 943 944
				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 已提交
945 946 947 948
			}
		}
	}

S
Sujith 已提交
949 950
	ieee80211_wake_queues(hw);

S
Sujith 已提交
951 952 953
	/* Start ANI */
	ath_start_ani(common);

954
	return r;
S
Sujith 已提交
955 956
}

957
static int ath_get_hal_qnum(u16 queue, struct ath_softc *sc)
S
Sujith 已提交
958 959 960 961 962
{
	int qnum;

	switch (queue) {
	case 0:
963
		qnum = sc->tx.hwq_map[WME_AC_VO];
S
Sujith 已提交
964 965
		break;
	case 1:
966
		qnum = sc->tx.hwq_map[WME_AC_VI];
S
Sujith 已提交
967 968
		break;
	case 2:
969
		qnum = sc->tx.hwq_map[WME_AC_BE];
S
Sujith 已提交
970 971
		break;
	case 3:
972
		qnum = sc->tx.hwq_map[WME_AC_BK];
S
Sujith 已提交
973 974
		break;
	default:
975
		qnum = sc->tx.hwq_map[WME_AC_BE];
S
Sujith 已提交
976 977 978 979 980 981 982 983 984 985 986
		break;
	}

	return qnum;
}

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

	switch (queue) {
987
	case WME_AC_VO:
S
Sujith 已提交
988 989
		qnum = 0;
		break;
990
	case WME_AC_VI:
S
Sujith 已提交
991 992
		qnum = 1;
		break;
993
	case WME_AC_BE:
S
Sujith 已提交
994 995
		qnum = 2;
		break;
996
	case WME_AC_BK:
S
Sujith 已提交
997 998 999 1000 1001 1002 1003 1004 1005 1006
		qnum = 3;
		break;
	default:
		qnum = -1;
		break;
	}

	return qnum;
}

1007 1008
/* XXX: Remove me once we don't depend on ath9k_channel for all
 * this redundant data */
1009 1010
void ath9k_update_ichannel(struct ath_softc *sc, struct ieee80211_hw *hw,
			   struct ath9k_channel *ichan)
1011 1012 1013 1014 1015 1016 1017 1018 1019
{
	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 已提交
1020
		ichan->channelFlags = CHANNEL_2GHZ | CHANNEL_OFDM | CHANNEL_G;
1021 1022 1023 1024 1025
	} else {
		ichan->chanmode = CHANNEL_A;
		ichan->channelFlags = CHANNEL_5GHZ | CHANNEL_OFDM;
	}

L
Luis R. Rodriguez 已提交
1026
	if (conf_is_ht(conf))
1027 1028 1029 1030
		ichan->chanmode = ath_get_extchanmode(sc, chan,
					    conf->channel_type);
}

S
Sujith 已提交
1031 1032 1033 1034
/**********************/
/* mac80211 callbacks */
/**********************/

1035
static int ath9k_start(struct ieee80211_hw *hw)
1036
{
1037 1038
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1039
	struct ath_hw *ah = sc->sc_ah;
1040
	struct ath_common *common = ath9k_hw_common(ah);
1041
	struct ieee80211_channel *curchan = hw->conf.channel;
S
Sujith 已提交
1042
	struct ath9k_channel *init_channel;
1043
	int r;
1044

1045 1046 1047
	ath_print(common, ATH_DBG_CONFIG,
		  "Starting driver with initial channel: %d MHz\n",
		  curchan->center_freq);
1048

1049 1050
	mutex_lock(&sc->mutex);

1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071
	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;

1072
	/* setup initial channel */
1073

1074
	sc->chan_idx = curchan->hw_value;
1075

1076
	init_channel = ath_get_curchannel(sc, hw);
S
Sujith 已提交
1077 1078

	/* Reset SERDES registers */
1079
	ath9k_hw_configpcipowersave(ah, 0, 0);
S
Sujith 已提交
1080 1081 1082 1083 1084 1085 1086 1087 1088

	/*
	 * 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);
1089
	r = ath9k_hw_reset(ah, init_channel, false);
1090
	if (r) {
1091 1092 1093 1094
		ath_print(common, ATH_DBG_FATAL,
			  "Unable to reset hardware; reset status %d "
			  "(freq %u MHz)\n", r,
			  curchan->center_freq);
S
Sujith 已提交
1095
		spin_unlock_bh(&sc->sc_resetlock);
1096
		goto mutex_unlock;
S
Sujith 已提交
1097 1098 1099 1100 1101 1102 1103 1104
	}
	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);
1105

S
Sujith 已提交
1106 1107 1108 1109 1110 1111 1112 1113
	/*
	 * 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) {
1114 1115
		ath_print(common, ATH_DBG_FATAL,
			  "Unable to start recv logic\n");
1116 1117
		r = -EIO;
		goto mutex_unlock;
1118
	}
1119

S
Sujith 已提交
1120
	/* Setup our intr mask. */
F
Felix Fietkau 已提交
1121 1122 1123 1124 1125
	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)
1126 1127 1128
		ah->imask |= ATH9K_INT_RXHP |
			     ATH9K_INT_RXLP |
			     ATH9K_INT_BB_WATCHDOG;
F
Felix Fietkau 已提交
1129 1130
	else
		ah->imask |= ATH9K_INT_RX;
S
Sujith 已提交
1131

1132
	if (ah->caps.hw_caps & ATH9K_HW_CAP_GTT)
P
Pavel Roskin 已提交
1133
		ah->imask |= ATH9K_INT_GTT;
S
Sujith 已提交
1134

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

1138
	ath_cache_conf_rate(sc, &hw->conf);
S
Sujith 已提交
1139 1140 1141 1142

	sc->sc_flags &= ~SC_OP_INVALID;

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

1146
	ieee80211_wake_queues(hw);
S
Sujith 已提交
1147

1148
	ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0);
1149

1150 1151
	if ((ah->btcoex_hw.scheme != ATH_BTCOEX_CFG_NONE) &&
	    !ah->btcoex_hw.enabled) {
1152 1153
		ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT,
					   AR_STOMP_LOW_WLAN_WGHT);
1154
		ath9k_hw_btcoex_enable(ah);
1155

1156 1157
		if (common->bus_ops->bt_coex_prep)
			common->bus_ops->bt_coex_prep(common);
1158
		if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE)
1159
			ath9k_btcoex_timer_resume(sc);
1160 1161
	}

1162 1163 1164
mutex_unlock:
	mutex_unlock(&sc->mutex);

1165
	return r;
1166 1167
}

1168 1169
static int ath9k_tx(struct ieee80211_hw *hw,
		    struct sk_buff *skb)
1170
{
S
Sujith 已提交
1171
	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1172 1173
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1174
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
S
Sujith 已提交
1175
	struct ath_tx_control txctl;
1176 1177
	int padpos, padsize;
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
1178
	int qnum;
S
Sujith 已提交
1179

1180
	if (aphy->state != ATH_WIPHY_ACTIVE && aphy->state != ATH_WIPHY_SCAN) {
1181 1182 1183
		ath_print(common, ATH_DBG_XMIT,
			  "ath9k: %s: TX in unexpected wiphy state "
			  "%d\n", wiphy_name(hw->wiphy), aphy->state);
1184 1185 1186
		goto exit;
	}

1187
	if (sc->ps_enabled) {
1188 1189 1190 1191 1192 1193 1194
		/*
		 * 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)) {
1195 1196
			ath_print(common, ATH_DBG_PS, "Add PM=1 for a TX frame "
				  "while in PS mode\n");
1197 1198 1199 1200
			hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM);
		}
	}

1201 1202 1203 1204 1205 1206 1207
	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);
1208 1209
		if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
			ath9k_hw_setrxabort(sc->sc_ah, 0);
1210
		if (ieee80211_is_pspoll(hdr->frame_control)) {
1211 1212
			ath_print(common, ATH_DBG_PS,
				  "Sending PS-Poll to pick a buffered frame\n");
S
Sujith 已提交
1213
			sc->ps_flags |= PS_WAIT_FOR_PSPOLL_DATA;
1214
		} else {
1215 1216
			ath_print(common, ATH_DBG_PS,
				  "Wake up to complete TX\n");
S
Sujith 已提交
1217
			sc->ps_flags |= PS_WAIT_FOR_TX_ACK;
1218 1219 1220 1221 1222 1223 1224 1225 1226
		}
		/*
		 * 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 已提交
1227
	memset(&txctl, 0, sizeof(struct ath_tx_control));
1228

1229 1230 1231 1232 1233 1234 1235
	/*
	 * 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 已提交
1236
			sc->tx.seq_no += 0x10;
1237
		hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
S
Sujith 已提交
1238
		hdr->seq_ctrl |= cpu_to_le16(sc->tx.seq_no);
1239
	}
1240

1241
	/* Add the padding after the header if this is not already done */
1242 1243 1244
	padpos = ath9k_cmn_padpos(hdr->frame_control);
	padsize = padpos & 3;
	if (padsize && skb->len>padpos) {
1245 1246 1247
		if (skb_headroom(skb) < padsize)
			return -1;
		skb_push(skb, padsize);
1248
		memmove(skb->data, skb->data + padsize, padpos);
1249 1250
	}

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

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

1256
	if (ath_tx_start(hw, skb, &txctl) != 0) {
1257
		ath_print(common, ATH_DBG_XMIT, "TX failed\n");
S
Sujith 已提交
1258
		goto exit;
1259 1260
	}

S
Sujith 已提交
1261 1262 1263
	return 0;
exit:
	dev_kfree_skb_any(skb);
1264
	return 0;
1265 1266
}

1267
static void ath9k_stop(struct ieee80211_hw *hw)
1268
{
1269 1270
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1271
	struct ath_hw *ah = sc->sc_ah;
1272
	struct ath_common *common = ath9k_hw_common(ah);
1273
	int i;
1274

S
Sujith 已提交
1275 1276
	mutex_lock(&sc->mutex);

1277 1278
	aphy->state = ATH_WIPHY_INACTIVE;

1279 1280 1281
	if (led_blink)
		cancel_delayed_work_sync(&sc->ath_led_blink_work);

1282
	cancel_delayed_work_sync(&sc->tx_complete_work);
1283
	cancel_work_sync(&sc->paprd_work);
1284
	cancel_work_sync(&sc->hw_check_work);
1285

1286 1287 1288 1289 1290 1291
	for (i = 0; i < sc->num_sec_wiphy; i++) {
		if (sc->sec_wiphy[i])
			break;
	}

	if (i == sc->num_sec_wiphy) {
1292 1293 1294 1295
		cancel_delayed_work_sync(&sc->wiphy_work);
		cancel_work_sync(&sc->chan_work);
	}

S
Sujith 已提交
1296
	if (sc->sc_flags & SC_OP_INVALID) {
1297
		ath_print(common, ATH_DBG_ANY, "Device not present\n");
S
Sujith 已提交
1298
		mutex_unlock(&sc->mutex);
S
Sujith 已提交
1299 1300
		return;
	}
1301

1302 1303 1304 1305 1306
	if (ath9k_wiphy_started(sc)) {
		mutex_unlock(&sc->mutex);
		return; /* another wiphy still in use */
	}

1307 1308 1309
	/* Ensure HW is awake when we try to shut it down. */
	ath9k_ps_wakeup(sc);

1310
	if (ah->btcoex_hw.enabled) {
1311
		ath9k_hw_btcoex_disable(ah);
1312
		if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE)
1313
			ath9k_btcoex_timer_pause(sc);
1314 1315
	}

S
Sujith 已提交
1316 1317
	/* make sure h/w will not generate any interrupt
	 * before setting the invalid flag. */
1318
	ath9k_hw_set_interrupts(ah, 0);
S
Sujith 已提交
1319 1320

	if (!(sc->sc_flags & SC_OP_INVALID)) {
S
Sujith 已提交
1321
		ath_drain_all_txq(sc, false);
S
Sujith 已提交
1322
		ath_stoprecv(sc);
1323
		ath9k_hw_phy_disable(ah);
S
Sujith 已提交
1324
	} else
S
Sujith 已提交
1325
		sc->rx.rxlink = NULL;
S
Sujith 已提交
1326 1327

	/* disable HAL and put h/w to sleep */
1328 1329
	ath9k_hw_disable(ah);
	ath9k_hw_configpcipowersave(ah, 1, 1);
1330 1331 1332
	ath9k_ps_restore(sc);

	/* Finally, put the chip in FULL SLEEP mode */
1333
	ath9k_setpower(sc, ATH9K_PM_FULL_SLEEP);
S
Sujith 已提交
1334 1335

	sc->sc_flags |= SC_OP_INVALID;
1336

1337 1338
	mutex_unlock(&sc->mutex);

1339
	ath_print(common, ATH_DBG_CONFIG, "Driver halt\n");
1340 1341
}

1342
static int ath9k_add_interface(struct ieee80211_hw *hw,
1343
			       struct ieee80211_vif *vif)
1344
{
1345 1346
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
P
Pavel Roskin 已提交
1347 1348
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
1349
	struct ath_vif *avp = (void *)vif->drv_priv;
1350
	enum nl80211_iftype ic_opmode = NL80211_IFTYPE_UNSPECIFIED;
1351
	int ret = 0;
1352

1353 1354
	mutex_lock(&sc->mutex);

P
Pavel Roskin 已提交
1355
	if (!(ah->caps.hw_caps & ATH9K_HW_CAP_BSSIDMASK) &&
1356 1357 1358 1359 1360
	    sc->nvifs > 0) {
		ret = -ENOBUFS;
		goto out;
	}

1361
	switch (vif->type) {
1362
	case NL80211_IFTYPE_STATION:
1363
		ic_opmode = NL80211_IFTYPE_STATION;
1364
		break;
1365 1366
	case NL80211_IFTYPE_ADHOC:
	case NL80211_IFTYPE_AP:
1367
	case NL80211_IFTYPE_MESH_POINT:
1368 1369 1370 1371
		if (sc->nbcnvifs >= ATH_BCBUF) {
			ret = -ENOBUFS;
			goto out;
		}
1372
		ic_opmode = vif->type;
1373 1374
		break;
	default:
1375
		ath_print(common, ATH_DBG_FATAL,
1376
			"Interface type %d not yet supported\n", vif->type);
1377 1378
		ret = -EOPNOTSUPP;
		goto out;
1379 1380
	}

1381 1382
	ath_print(common, ATH_DBG_CONFIG,
		  "Attach a VIF of type: %d\n", ic_opmode);
1383

S
Sujith 已提交
1384
	/* Set the VIF opmode */
S
Sujith 已提交
1385 1386 1387
	avp->av_opmode = ic_opmode;
	avp->av_bslot = -1;

1388
	sc->nvifs++;
1389

P
Pavel Roskin 已提交
1390
	if (ah->caps.hw_caps & ATH9K_HW_CAP_BSSIDMASK)
1391 1392
		ath9k_set_bssid_mask(hw);

1393 1394 1395
	if (sc->nvifs > 1)
		goto out; /* skip global settings for secondary vif */

S
Sujith 已提交
1396
	if (ic_opmode == NL80211_IFTYPE_AP) {
P
Pavel Roskin 已提交
1397
		ath9k_hw_set_tsfadjust(ah, 1);
S
Sujith 已提交
1398 1399
		sc->sc_flags |= SC_OP_TSF_RESET;
	}
S
Sujith 已提交
1400 1401

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

1404 1405 1406 1407
	/*
	 * Enable MIB interrupts when there are hardware phy counters.
	 * Note we only do this (at the moment) for station mode.
	 */
1408 1409 1410
	if ((vif->type == NL80211_IFTYPE_STATION) ||
	    (vif->type == NL80211_IFTYPE_ADHOC) ||
	    (vif->type == NL80211_IFTYPE_MESH_POINT)) {
1411 1412
		if (ah->config.enable_ani)
			ah->imask |= ATH9K_INT_MIB;
P
Pavel Roskin 已提交
1413
		ah->imask |= ATH9K_INT_TSFOOR;
1414 1415
	}

P
Pavel Roskin 已提交
1416
	ath9k_hw_set_interrupts(ah, ah->imask);
1417

1418 1419
	if (vif->type == NL80211_IFTYPE_AP    ||
	    vif->type == NL80211_IFTYPE_ADHOC ||
1420 1421
	    vif->type == NL80211_IFTYPE_MONITOR) {
		sc->sc_flags |= SC_OP_ANI_RUN;
1422
		ath_start_ani(common);
1423
	}
1424

1425
out:
1426
	mutex_unlock(&sc->mutex);
1427
	return ret;
1428 1429
}

1430
static void ath9k_remove_interface(struct ieee80211_hw *hw,
1431
				   struct ieee80211_vif *vif)
1432
{
1433 1434
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1435
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1436
	struct ath_vif *avp = (void *)vif->drv_priv;
1437
	int i;
1438

1439
	ath_print(common, ATH_DBG_CONFIG, "Detach Interface\n");
1440

1441 1442
	mutex_lock(&sc->mutex);

1443
	/* Stop ANI */
1444
	sc->sc_flags &= ~SC_OP_ANI_RUN;
1445
	del_timer_sync(&common->ani.timer);
J
Jouni Malinen 已提交
1446

1447
	/* Reclaim beacon resources */
1448 1449 1450
	if ((sc->sc_ah->opmode == NL80211_IFTYPE_AP) ||
	    (sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC) ||
	    (sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT)) {
1451
		ath9k_ps_wakeup(sc);
S
Sujith 已提交
1452
		ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq);
1453
		ath9k_ps_restore(sc);
J
Jouni Malinen 已提交
1454
	}
1455

1456
	ath_beacon_return(sc, avp);
1457
	sc->sc_flags &= ~SC_OP_BEACONS;
1458

1459
	for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++) {
1460
		if (sc->beacon.bslot[i] == vif) {
1461 1462 1463
			printk(KERN_DEBUG "%s: vif had allocated beacon "
			       "slot\n", __func__);
			sc->beacon.bslot[i] = NULL;
1464
			sc->beacon.bslot_aphy[i] = NULL;
1465 1466 1467
		}
	}

S
Sujith 已提交
1468
	sc->nvifs--;
1469 1470

	mutex_unlock(&sc->mutex);
1471 1472
}

1473 1474
void ath9k_enable_ps(struct ath_softc *sc)
{
P
Pavel Roskin 已提交
1475 1476
	struct ath_hw *ah = sc->sc_ah;

1477
	sc->ps_enabled = true;
P
Pavel Roskin 已提交
1478 1479 1480 1481
	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);
1482
		}
1483
		ath9k_hw_setrxabort(ah, 1);
1484 1485 1486
	}
}

1487
static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
1488
{
1489 1490
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1491
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1492
	struct ieee80211_conf *conf = &hw->conf;
1493
	struct ath_hw *ah = sc->sc_ah;
1494
	bool disable_radio;
1495

1496
	mutex_lock(&sc->mutex);
1497

1498 1499 1500 1501 1502 1503
	/*
	 * 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.
	 */
1504
	if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1505 1506 1507
		bool enable_radio;
		bool all_wiphys_idle;
		bool idle = !!(conf->flags & IEEE80211_CONF_IDLE);
1508 1509 1510

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

1513
		enable_radio = (!idle && all_wiphys_idle);
1514 1515 1516 1517 1518 1519 1520

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

1523
		if (enable_radio) {
1524
			sc->ps_idle = false;
1525
			ath_radio_enable(sc, hw);
1526 1527
			ath_print(common, ATH_DBG_CONFIG,
				  "not-idle: enabling radio\n");
1528 1529 1530
		}
	}

1531 1532 1533 1534 1535 1536
	/*
	 * 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.
	 */
1537 1538
	if (changed & IEEE80211_CONF_CHANGE_PS) {
		if (conf->flags & IEEE80211_CONF_PS) {
S
Sujith 已提交
1539
			sc->ps_flags |= PS_ENABLED;
1540 1541 1542 1543
			/*
			 * At this point we know hardware has received an ACK
			 * of a previously sent null data frame.
			 */
S
Sujith 已提交
1544 1545
			if ((sc->ps_flags & PS_NULLFUNC_COMPLETED)) {
				sc->ps_flags &= ~PS_NULLFUNC_COMPLETED;
1546
				ath9k_enable_ps(sc);
1547
                        }
1548
		} else {
1549
			sc->ps_enabled = false;
S
Sujith 已提交
1550 1551
			sc->ps_flags &= ~(PS_ENABLED |
					  PS_NULLFUNC_COMPLETED);
1552
			ath9k_setpower(sc, ATH9K_PM_AWAKE);
1553 1554 1555
			if (!(ah->caps.hw_caps &
			      ATH9K_HW_CAP_AUTOSLEEP)) {
				ath9k_hw_setrxabort(sc->sc_ah, 0);
S
Sujith 已提交
1556 1557 1558 1559
				sc->ps_flags &= ~(PS_WAIT_FOR_BEACON |
						  PS_WAIT_FOR_CAB |
						  PS_WAIT_FOR_PSPOLL_DATA |
						  PS_WAIT_FOR_TX_ACK);
P
Pavel Roskin 已提交
1560 1561
				if (ah->imask & ATH9K_INT_TIM_TIMER) {
					ah->imask &= ~ATH9K_INT_TIM_TIMER;
1562
					ath9k_hw_set_interrupts(sc->sc_ah,
P
Pavel Roskin 已提交
1563
							ah->imask);
1564
				}
1565 1566 1567 1568
			}
		}
	}

S
Sujith 已提交
1569 1570 1571 1572 1573 1574 1575 1576
	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;
		}
	}

1577
	if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
1578
		struct ieee80211_channel *curchan = hw->conf.channel;
1579
		int pos = curchan->hw_value;
J
Johannes Berg 已提交
1580

1581 1582 1583
		aphy->chan_idx = pos;
		aphy->chan_is_ht = conf_is_ht(conf);

1584 1585 1586 1587 1588 1589 1590 1591 1592 1593
		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;
		}
1594

1595 1596
		ath_print(common, ATH_DBG_CONFIG, "Set channel: %d MHz\n",
			  curchan->center_freq);
1597

1598
		/* XXX: remove me eventualy */
1599
		ath9k_update_ichannel(sc, hw, &sc->sc_ah->channels[pos]);
1600

1601
		ath_update_chainmask(sc, conf_is_ht(conf));
S
Sujith 已提交
1602

1603
		if (ath_set_channel(sc, hw, &sc->sc_ah->channels[pos]) < 0) {
1604 1605
			ath_print(common, ATH_DBG_FATAL,
				  "Unable to set channel\n");
1606
			mutex_unlock(&sc->mutex);
1607 1608
			return -EINVAL;
		}
S
Sujith 已提交
1609
	}
1610

1611
skip_chan_change:
1612
	if (changed & IEEE80211_CONF_CHANGE_POWER) {
S
Sujith 已提交
1613
		sc->config.txpowlimit = 2 * conf->power_level;
1614 1615
		ath_update_txpow(sc);
	}
1616

1617 1618 1619 1620
	spin_lock_bh(&sc->wiphy_lock);
	disable_radio = ath9k_all_wiphys_idle(sc);
	spin_unlock_bh(&sc->wiphy_lock);

1621
	if (disable_radio) {
1622
		ath_print(common, ATH_DBG_CONFIG, "idle: disabling radio\n");
1623
		sc->ps_idle = true;
1624
		ath_radio_disable(sc, hw);
1625 1626
	}

1627
	mutex_unlock(&sc->mutex);
1628

1629 1630 1631
	return 0;
}

1632 1633 1634 1635
#define SUPPORTED_FILTERS			\
	(FIF_PROMISC_IN_BSS |			\
	FIF_ALLMULTI |				\
	FIF_CONTROL |				\
1636
	FIF_PSPOLL |				\
1637 1638 1639
	FIF_OTHER_BSS |				\
	FIF_BCN_PRBRESP_PROMISC |		\
	FIF_FCSFAIL)
1640

1641 1642 1643 1644
/* FIXME: sc->sc_full_reset ? */
static void ath9k_configure_filter(struct ieee80211_hw *hw,
				   unsigned int changed_flags,
				   unsigned int *total_flags,
1645
				   u64 multicast)
1646
{
1647 1648
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1649
	u32 rfilt;
1650

1651 1652
	changed_flags &= SUPPORTED_FILTERS;
	*total_flags &= SUPPORTED_FILTERS;
1653

S
Sujith 已提交
1654
	sc->rx.rxfilter = *total_flags;
1655
	ath9k_ps_wakeup(sc);
1656 1657
	rfilt = ath_calcrxfilter(sc);
	ath9k_hw_setrxfilter(sc->sc_ah, rfilt);
1658
	ath9k_ps_restore(sc);
1659

1660 1661
	ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_CONFIG,
		  "Set HW RX filter: 0x%x\n", rfilt);
1662
}
1663

1664 1665 1666
static int ath9k_sta_add(struct ieee80211_hw *hw,
			 struct ieee80211_vif *vif,
			 struct ieee80211_sta *sta)
1667
{
1668 1669
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1670

1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685
	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;
1686 1687
}

1688
static int ath9k_conf_tx(struct ieee80211_hw *hw, u16 queue,
1689
			 const struct ieee80211_tx_queue_params *params)
1690
{
1691 1692
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1693
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1694 1695
	struct ath9k_tx_queue_info qi;
	int ret = 0, qnum;
1696

1697 1698
	if (queue >= WME_NUM_AC)
		return 0;
1699

1700 1701
	mutex_lock(&sc->mutex);

1702 1703
	memset(&qi, 0, sizeof(struct ath9k_tx_queue_info));

1704 1705 1706 1707 1708
	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);
1709

1710 1711 1712 1713 1714
	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);
1715

1716 1717
	ret = ath_txq_update(sc, qnum, &qi);
	if (ret)
1718
		ath_print(common, ATH_DBG_FATAL, "TXQ Update failed\n");
1719

1720
	if (sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC)
1721
		if ((qnum == sc->tx.hwq_map[WME_AC_BE]) && !ret)
1722 1723
			ath_beaconq_config(sc);

1724 1725
	mutex_unlock(&sc->mutex);

1726 1727
	return ret;
}
1728

1729 1730
static int ath9k_set_key(struct ieee80211_hw *hw,
			 enum set_key_cmd cmd,
1731 1732
			 struct ieee80211_vif *vif,
			 struct ieee80211_sta *sta,
1733 1734
			 struct ieee80211_key_conf *key)
{
1735 1736
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1737
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1738
	int ret = 0;
1739

1740 1741 1742
	if (modparam_nohwcrypt)
		return -ENOSPC;

1743
	mutex_lock(&sc->mutex);
1744
	ath9k_ps_wakeup(sc);
1745
	ath_print(common, ATH_DBG_CONFIG, "Set HW Key\n");
1746

1747 1748
	switch (cmd) {
	case SET_KEY:
1749
		ret = ath9k_cmn_key_config(common, vif, sta, key);
1750 1751
		if (ret >= 0) {
			key->hw_key_idx = ret;
1752 1753 1754 1755
			/* push IV and Michael MIC generation to stack */
			key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
			if (key->alg == ALG_TKIP)
				key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
1756 1757
			if (sc->sc_ah->sw_mgmt_crypto && key->alg == ALG_CCMP)
				key->flags |= IEEE80211_KEY_FLAG_SW_MGMT;
1758
			ret = 0;
1759 1760 1761
		}
		break;
	case DISABLE_KEY:
1762
		ath9k_cmn_key_delete(common, key);
1763 1764 1765 1766
		break;
	default:
		ret = -EINVAL;
	}
1767

1768
	ath9k_ps_restore(sc);
1769 1770
	mutex_unlock(&sc->mutex);

1771 1772
	return ret;
}
1773

1774 1775 1776 1777 1778
static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
				   struct ieee80211_vif *vif,
				   struct ieee80211_bss_conf *bss_conf,
				   u32 changed)
{
1779 1780
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1781
	struct ath_hw *ah = sc->sc_ah;
1782
	struct ath_common *common = ath9k_hw_common(ah);
1783
	struct ath_vif *avp = (void *)vif->drv_priv;
1784
	int slottime;
S
Sujith 已提交
1785
	int error;
1786

1787 1788
	mutex_lock(&sc->mutex);

S
Sujith 已提交
1789 1790 1791 1792
	if (changed & BSS_CHANGED_BSSID) {
		/* Set BSSID */
		memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
		memcpy(avp->bssid, bss_conf->bssid, ETH_ALEN);
1793
		common->curaid = 0;
1794
		ath9k_hw_write_associd(ah);
1795

S
Sujith 已提交
1796 1797
		/* Set aggregation protection mode parameters */
		sc->config.ath_aggr_prot = 0;
1798

S
Sujith 已提交
1799 1800 1801
		/* Only legacy IBSS for now */
		if (vif->type == NL80211_IFTYPE_ADHOC)
			ath_update_chainmask(sc, 0);
1802

S
Sujith 已提交
1803 1804 1805
		ath_print(common, ATH_DBG_CONFIG,
			  "BSSID: %pM aid: 0x%x\n",
			  common->curbssid, common->curaid);
1806

S
Sujith 已提交
1807 1808 1809
		/* need to reconfigure the beacon */
		sc->sc_flags &= ~SC_OP_BEACONS ;
	}
1810

S
Sujith 已提交
1811 1812 1813 1814 1815 1816 1817
	/* 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);
1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836
	}

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

S
Sujith 已提交
1839 1840 1841
	/* Disable transmission of beacons */
	if ((changed & BSS_CHANGED_BEACON_ENABLED) && !bss_conf->enable_beacon)
		ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq);
1842

S
Sujith 已提交
1843 1844 1845 1846 1847 1848 1849 1850 1851
	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);
1852 1853 1854
			error = ath_beacon_alloc(aphy, vif);
			if (!error)
				ath_beacon_config(sc, vif);
S
Sujith 已提交
1855 1856
		} else {
			ath_beacon_config(sc, vif);
1857 1858 1859
		}
	}

1860
	if (changed & BSS_CHANGED_ERP_PREAMBLE) {
1861 1862
		ath_print(common, ATH_DBG_CONFIG, "BSS Changed PREAMBLE %d\n",
			  bss_conf->use_short_preamble);
1863 1864 1865 1866 1867
		if (bss_conf->use_short_preamble)
			sc->sc_flags |= SC_OP_PREAMBLE_SHORT;
		else
			sc->sc_flags &= ~SC_OP_PREAMBLE_SHORT;
	}
1868

1869
	if (changed & BSS_CHANGED_ERP_CTS_PROT) {
1870 1871
		ath_print(common, ATH_DBG_CONFIG, "BSS Changed CTS PROT %d\n",
			  bss_conf->use_cts_prot);
1872 1873 1874 1875 1876 1877
		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;
	}
1878

1879
	if (changed & BSS_CHANGED_ASSOC) {
1880
		ath_print(common, ATH_DBG_CONFIG, "BSS Changed ASSOC %d\n",
1881
			bss_conf->assoc);
S
Sujith 已提交
1882
		ath9k_bss_assoc_info(sc, vif, bss_conf);
1883
	}
1884 1885

	mutex_unlock(&sc->mutex);
1886
}
1887

1888 1889 1890
static u64 ath9k_get_tsf(struct ieee80211_hw *hw)
{
	u64 tsf;
1891 1892
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1893

1894 1895 1896
	mutex_lock(&sc->mutex);
	tsf = ath9k_hw_gettsf64(sc->sc_ah);
	mutex_unlock(&sc->mutex);
1897

1898 1899
	return tsf;
}
1900

1901 1902
static void ath9k_set_tsf(struct ieee80211_hw *hw, u64 tsf)
{
1903 1904
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1905

1906 1907 1908
	mutex_lock(&sc->mutex);
	ath9k_hw_settsf64(sc->sc_ah, tsf);
	mutex_unlock(&sc->mutex);
1909 1910
}

1911 1912
static void ath9k_reset_tsf(struct ieee80211_hw *hw)
{
1913 1914
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1915

1916
	mutex_lock(&sc->mutex);
1917 1918

	ath9k_ps_wakeup(sc);
1919
	ath9k_hw_reset_tsf(sc->sc_ah);
1920 1921
	ath9k_ps_restore(sc);

1922
	mutex_unlock(&sc->mutex);
1923
}
1924

1925
static int ath9k_ampdu_action(struct ieee80211_hw *hw,
1926
			      struct ieee80211_vif *vif,
1927 1928 1929
			      enum ieee80211_ampdu_mlme_action action,
			      struct ieee80211_sta *sta,
			      u16 tid, u16 *ssn)
1930
{
1931 1932
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1933
	int ret = 0;
1934

1935 1936
	local_bh_disable();

1937 1938
	switch (action) {
	case IEEE80211_AMPDU_RX_START:
1939 1940
		if (!(sc->sc_flags & SC_OP_RXAGGR))
			ret = -ENOTSUPP;
1941 1942 1943 1944
		break;
	case IEEE80211_AMPDU_RX_STOP:
		break;
	case IEEE80211_AMPDU_TX_START:
1945
		ath9k_ps_wakeup(sc);
S
Sujith 已提交
1946
		ath_tx_aggr_start(sc, sta, tid, ssn);
1947
		ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1948
		ath9k_ps_restore(sc);
1949 1950
		break;
	case IEEE80211_AMPDU_TX_STOP:
1951
		ath9k_ps_wakeup(sc);
S
Sujith 已提交
1952
		ath_tx_aggr_stop(sc, sta, tid);
1953
		ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1954
		ath9k_ps_restore(sc);
1955
		break;
1956
	case IEEE80211_AMPDU_TX_OPERATIONAL:
1957
		ath9k_ps_wakeup(sc);
1958
		ath_tx_aggr_resume(sc, sta, tid);
1959
		ath9k_ps_restore(sc);
1960
		break;
1961
	default:
1962 1963
		ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_FATAL,
			  "Unknown AMPDU action\n");
1964 1965
	}

1966 1967
	local_bh_enable();

1968
	return ret;
1969 1970
}

1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989
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;
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
	struct ieee80211_conf *conf = &hw->conf;

	 if (idx != 0)
		return -ENOENT;

	survey->channel = conf->channel;
	survey->filled = SURVEY_INFO_NOISE_DBM;
	survey->noise = common->ani.noise_floor;

	return 0;
}

1990 1991
static void ath9k_sw_scan_start(struct ieee80211_hw *hw)
{
1992 1993
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
S
Sujith 已提交
1994
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1995

1996
	mutex_lock(&sc->mutex);
1997 1998
	if (ath9k_wiphy_scanning(sc)) {
		/*
1999 2000 2001 2002 2003
		 * 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.
2004
		 */
2005
		mutex_unlock(&sc->mutex);
2006 2007 2008 2009 2010
		return;
	}

	aphy->state = ATH_WIPHY_SCAN;
	ath9k_wiphy_pause_all_forced(sc, aphy);
2011
	sc->sc_flags |= SC_OP_SCANNING;
S
Sujith 已提交
2012
	del_timer_sync(&common->ani.timer);
2013
	cancel_work_sync(&sc->paprd_work);
2014
	cancel_work_sync(&sc->hw_check_work);
S
Sujith 已提交
2015
	cancel_delayed_work_sync(&sc->tx_complete_work);
2016
	mutex_unlock(&sc->mutex);
2017 2018
}

2019 2020 2021 2022
/*
 * XXX: this requires a revisit after the driver
 * scan_complete gets moved to another place/removed in mac80211.
 */
2023 2024
static void ath9k_sw_scan_complete(struct ieee80211_hw *hw)
{
2025 2026
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
S
Sujith 已提交
2027
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
2028

2029
	mutex_lock(&sc->mutex);
2030
	aphy->state = ATH_WIPHY_ACTIVE;
2031
	sc->sc_flags &= ~SC_OP_SCANNING;
S
Sujith 已提交
2032
	sc->sc_flags |= SC_OP_FULL_RESET;
S
Sujith 已提交
2033
	ath_start_ani(common);
S
Sujith 已提交
2034
	ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0);
2035
	ath_beacon_config(sc, NULL);
2036
	mutex_unlock(&sc->mutex);
2037 2038
}

2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050
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);
}

2051
struct ieee80211_ops ath9k_ops = {
2052 2053 2054 2055 2056 2057 2058
	.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,
2059 2060
	.sta_add	    = ath9k_sta_add,
	.sta_remove	    = ath9k_sta_remove,
2061 2062 2063 2064
	.conf_tx 	    = ath9k_conf_tx,
	.bss_info_changed   = ath9k_bss_info_changed,
	.set_key            = ath9k_set_key,
	.get_tsf 	    = ath9k_get_tsf,
2065
	.set_tsf 	    = ath9k_set_tsf,
2066
	.reset_tsf 	    = ath9k_reset_tsf,
2067
	.ampdu_action       = ath9k_ampdu_action,
2068
	.get_survey	    = ath9k_get_survey,
2069 2070
	.sw_scan_start      = ath9k_sw_scan_start,
	.sw_scan_complete   = ath9k_sw_scan_complete,
J
Johannes Berg 已提交
2071
	.rfkill_poll        = ath9k_rfkill_poll_state,
2072
	.set_coverage_class = ath9k_set_coverage_class,
2073
};