main.c 57.8 KB
Newer Older
1
/*
2
 * Copyright (c) 2008-2011 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>
18
#include <linux/delay.h>
S
Sujith 已提交
19
#include "ath9k.h"
20
#include "btcoex.h"
21

22 23 24
static void ath9k_set_assoc_state(struct ath_softc *sc,
				  struct ieee80211_vif *vif);

25
u8 ath9k_parse_mpdudensity(u8 mpdudensity)
S
Sujith 已提交
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
{
	/*
	 * 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;
	}
}

60 61 62 63 64 65 66 67 68 69 70 71 72
static bool ath9k_has_pending_frames(struct ath_softc *sc, struct ath_txq *txq)
{
	bool pending = false;

	spin_lock_bh(&txq->axq_lock);

	if (txq->axq_depth || !list_empty(&txq->axq_acq))
		pending = true;

	spin_unlock_bh(&txq->axq_lock);
	return pending;
}

73
static bool ath9k_setpower(struct ath_softc *sc, enum ath9k_power_mode mode)
74 75 76 77
{
	unsigned long flags;
	bool ret;

78 79 80
	spin_lock_irqsave(&sc->sc_pm_lock, flags);
	ret = ath9k_hw_setpower(sc->sc_ah, mode);
	spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
81 82 83 84

	return ret;
}

85 86
void ath9k_ps_wakeup(struct ath_softc *sc)
{
87
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
88
	unsigned long flags;
89
	enum ath9k_power_mode power_mode;
90 91 92 93 94

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

95
	power_mode = sc->sc_ah->power_mode;
96
	ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE);
97

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

111 112 113 114 115 116
 unlock:
	spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
}

void ath9k_ps_restore(struct ath_softc *sc)
{
117
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
F
Felix Fietkau 已提交
118
	enum ath9k_power_mode mode;
119
	unsigned long flags;
S
Sujith Manoharan 已提交
120
	bool reset;
121 122 123 124 125

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

S
Sujith Manoharan 已提交
126 127 128
	if (sc->ps_idle) {
		ath9k_hw_setrxabort(sc->sc_ah, 1);
		ath9k_hw_stopdmarecv(sc->sc_ah, &reset);
F
Felix Fietkau 已提交
129
		mode = ATH9K_PM_FULL_SLEEP;
S
Sujith Manoharan 已提交
130 131 132 133
	} else if (sc->ps_enabled &&
		   !(sc->ps_flags & (PS_WAIT_FOR_BEACON |
				     PS_WAIT_FOR_CAB |
				     PS_WAIT_FOR_PSPOLL_DATA |
134 135
				     PS_WAIT_FOR_TX_ACK |
				     PS_WAIT_FOR_ANI))) {
F
Felix Fietkau 已提交
136
		mode = ATH9K_PM_NETWORK_SLEEP;
137 138
		if (ath9k_hw_btcoex_is_enabled(sc->sc_ah))
			ath9k_btcoex_stop_gen_timer(sc);
S
Sujith Manoharan 已提交
139
	} else {
F
Felix Fietkau 已提交
140
		goto unlock;
S
Sujith Manoharan 已提交
141
	}
F
Felix Fietkau 已提交
142 143 144 145 146

	spin_lock(&common->cc_lock);
	ath_hw_cycle_counters_update(common);
	spin_unlock(&common->cc_lock);

147
	ath9k_hw_setpower(sc->sc_ah, mode);
148 149 150 151 152

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

153
static void __ath_cancel_work(struct ath_softc *sc)
S
Sujith 已提交
154
{
155 156 157
	cancel_work_sync(&sc->paprd_work);
	cancel_work_sync(&sc->hw_check_work);
	cancel_delayed_work_sync(&sc->tx_complete_work);
158
	cancel_delayed_work_sync(&sc->hw_pll_work);
S
Sujith Manoharan 已提交
159

160
#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
S
Sujith Manoharan 已提交
161 162
	if (ath9k_hw_mci_is_enabled(sc->sc_ah))
		cancel_work_sync(&sc->mci_work);
163
#endif
164
}
165

166 167 168 169 170
static void ath_cancel_work(struct ath_softc *sc)
{
	__ath_cancel_work(sc);
	cancel_work_sync(&sc->hw_reset_work);
}
171

S
Sujith Manoharan 已提交
172 173 174 175
static void ath_restart_work(struct ath_softc *sc)
{
	ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0);

176
	if (AR_SREV_9340(sc->sc_ah) || AR_SREV_9330(sc->sc_ah))
S
Sujith Manoharan 已提交
177 178 179 180
		ieee80211_queue_delayed_work(sc->hw, &sc->hw_pll_work,
				     msecs_to_jiffies(ATH_PLL_WORK_INTERVAL));

	ath_start_rx_poll(sc, 3);
S
Sujith Manoharan 已提交
181
	ath_start_ani(sc);
S
Sujith Manoharan 已提交
182 183
}

184
static bool ath_prepare_reset(struct ath_softc *sc)
185 186
{
	struct ath_hw *ah = sc->sc_ah;
187
	bool ret = true;
188

189
	ieee80211_stop_queues(sc->hw);
190

191
	sc->hw_busy_count = 0;
S
Sujith Manoharan 已提交
192
	ath_stop_ani(sc);
193
	del_timer_sync(&sc->rx_poll_timer);
S
Sujith 已提交
194

195
	ath9k_hw_disable_interrupts(ah);
196

197
	if (!ath_drain_all_txq(sc))
198
		ret = false;
199

F
Felix Fietkau 已提交
200
	if (!ath_stoprecv(sc))
201 202
		ret = false;

203 204
	return ret;
}
S
Sujith 已提交
205

206 207 208 209
static bool ath_complete_reset(struct ath_softc *sc, bool start)
{
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
210
	unsigned long flags;
211 212

	if (ath_startrecv(sc) != 0) {
213
		ath_err(common, "Unable to restart recv logic\n");
214
		return false;
215 216
	}

217 218
	ath9k_cmn_update_txpow(ah, sc->curtxpow,
			       sc->config.txpowlimit, &sc->curtxpow);
219 220

	clear_bit(SC_OP_HW_RESET, &sc->sc_flags);
221
	ath9k_hw_set_interrupts(ah);
222
	ath9k_hw_enable_interrupts(ah);
223

224
	if (!(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL) && start) {
225 226 227 228 229 230 231 232
		if (!test_bit(SC_OP_BEACONS, &sc->sc_flags))
			goto work;

		if (ah->opmode == NL80211_IFTYPE_STATION &&
		    test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) {
			spin_lock_irqsave(&sc->sc_pm_lock, flags);
			sc->ps_flags |= PS_BEACON_SYNC | PS_WAIT_FOR_BEACON;
			spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
233 234
		} else {
			ath9k_set_beacon(sc);
235 236
		}
	work:
S
Sujith Manoharan 已提交
237
		ath_restart_work(sc);
238 239
	}

240 241 242 243 244
	ieee80211_wake_queues(sc->hw);

	return true;
}

245
static int ath_reset_internal(struct ath_softc *sc, struct ath9k_channel *hchan)
246 247 248 249 250 251 252 253 254
{
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
	struct ath9k_hw_cal_data *caldata = NULL;
	bool fastcc = true;
	int r;

	__ath_cancel_work(sc);

255
	tasklet_disable(&sc->intr_tq);
256
	spin_lock_bh(&sc->sc_pcu_lock);
257

258
	if (!(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)) {
259 260 261 262 263 264 265 266 267
		fastcc = false;
		caldata = &sc->caldata;
	}

	if (!hchan) {
		fastcc = false;
		hchan = ah->curchan;
	}

268
	if (!ath_prepare_reset(sc))
269 270
		fastcc = false;

271
	ath_dbg(common, CONFIG, "Reset to %u MHz, HT40: %d fastcc: %d\n",
272
		hchan->channel, IS_CHAN_HT40(hchan), fastcc);
273 274 275 276 277

	r = ath9k_hw_reset(ah, hchan, caldata, fastcc);
	if (r) {
		ath_err(common,
			"Unable to reset channel, reset status %d\n", r);
278 279 280 281

		ath9k_hw_enable_interrupts(ah);
		ath9k_queue_reset(sc, RESET_TYPE_BB_HANG);

282 283 284
		goto out;
	}

285 286 287 288
	if (ath9k_hw_mci_is_enabled(sc->sc_ah) &&
	    (sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL))
		ath9k_mci_set_txpower(sc, true, false);

289 290 291 292
	if (!ath_complete_reset(sc, true))
		r = -EIO;

out:
293
	spin_unlock_bh(&sc->sc_pcu_lock);
294 295
	tasklet_enable(&sc->intr_tq);

296 297 298 299 300 301 302 303 304
	return r;
}


/*
 * 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.
*/
305
static int ath_set_channel(struct ath_softc *sc, struct cfg80211_chan_def *chandef)
306
{
307 308 309 310 311 312 313 314 315
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
	struct ieee80211_hw *hw = sc->hw;
	struct ath9k_channel *hchan;
	struct ieee80211_channel *chan = chandef->chan;
	unsigned long flags;
	bool offchannel;
	int pos = chan->hw_value;
	int old_pos = -1;
316 317
	int r;

S
Sujith Manoharan 已提交
318
	if (test_bit(SC_OP_INVALID, &sc->sc_flags))
319 320
		return -EIO;

321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354
	offchannel = !!(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL);

	if (ah->curchan)
		old_pos = ah->curchan - &ah->channels[0];

	ath_dbg(common, CONFIG, "Set channel: %d MHz width: %d\n",
		chan->center_freq, chandef->width);

	/* 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);

	ath9k_cmn_get_channel(hw, ah, chandef);

	/*
	 * 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 (!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));
	}

	hchan = &sc->sc_ah->channels[pos];
355
	r = ath_reset_internal(sc, hchan);
356 357
	if (r)
		return r;
358

359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389
	/*
	 * 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);

	/*
	 * Enable radar pulse detection if on a DFS channel. Spectral
	 * scanning and radar detection can not be used concurrently.
	 */
	if (hw->conf.radar_enabled) {
		u32 rxfilter;

		/* set HW specific DFS configuration */
		ath9k_hw_set_radar_params(ah);
		rxfilter = ath9k_hw_getrxfilter(ah);
		rxfilter |= ATH9K_RX_FILTER_PHYRADAR |
				ATH9K_RX_FILTER_PHYERR;
		ath9k_hw_setrxfilter(ah, rxfilter);
		ath_dbg(common, DFS, "DFS enabled at freq %d\n",
			chan->center_freq);
	} else {
		/* perform spectral scan if requested. */
		if (test_bit(SC_OP_SCANNING, &sc->sc_flags) &&
			sc->spectral_mode == SPECTRAL_CHANSCAN)
			ath9k_spectral_scan_trigger(hw);
	}

	return 0;
S
Sujith 已提交
390 391
}

392 393
static void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta,
			    struct ieee80211_vif *vif)
S
Sujith 已提交
394 395 396 397
{
	struct ath_node *an;
	an = (struct ath_node *)sta->drv_priv;

398
	an->sc = sc;
399
	an->sta = sta;
400
	an->vif = vif;
401

402 403 404
	ath_tx_node_init(sc, an);

	if (sta->ht_cap.ht_supported) {
S
Sujith 已提交
405
		an->maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
406
				     sta->ht_cap.ampdu_factor);
407
		an->mpdudensity = ath9k_parse_mpdudensity(sta->ht_cap.ampdu_density);
408
	}
S
Sujith 已提交
409 410 411 412 413
}

static void ath_node_detach(struct ath_softc *sc, struct ieee80211_sta *sta)
{
	struct ath_node *an = (struct ath_node *)sta->drv_priv;
414
	ath_tx_node_cleanup(sc, an);
S
Sujith 已提交
415 416
}

S
Sujith 已提交
417
void ath9k_tasklet(unsigned long data)
S
Sujith 已提交
418 419
{
	struct ath_softc *sc = (struct ath_softc *)data;
420
	struct ath_hw *ah = sc->sc_ah;
421
	struct ath_common *common = ath9k_hw_common(ah);
422
	enum ath_reset_type type;
S
Sujith Manoharan 已提交
423
	unsigned long flags;
S
Sujith 已提交
424
	u32 status = sc->intrstatus;
F
Felix Fietkau 已提交
425
	u32 rxmask;
S
Sujith 已提交
426

427 428 429
	ath9k_ps_wakeup(sc);
	spin_lock(&sc->sc_pcu_lock);

430 431
	if ((status & ATH9K_INT_FATAL) ||
	    (status & ATH9K_INT_BB_WATCHDOG)) {
432 433 434 435 436 437

		if (status & ATH9K_INT_FATAL)
			type = RESET_TYPE_FATAL_INT;
		else
			type = RESET_TYPE_BB_WATCHDOG;

438
		ath9k_queue_reset(sc, type);
439 440 441 442 443 444 445

		/*
		 * Increment the ref. counter here so that
		 * interrupts are enabled in the reset routine.
		 */
		atomic_inc(&ah->intr_ref_cnt);
		ath_dbg(common, ANY, "FATAL: Skipping interrupts\n");
446
		goto out;
S
Sujith 已提交
447
	}
S
Sujith 已提交
448

S
Sujith Manoharan 已提交
449
	spin_lock_irqsave(&sc->sc_pm_lock, flags);
450 451 452 453 454
	if ((status & ATH9K_INT_TSFOOR) && sc->ps_enabled) {
		/*
		 * TSF sync does not look correct; remain awake to sync with
		 * the next Beacon.
		 */
455
		ath_dbg(common, PS, "TSFOOR - Sync with next Beacon\n");
456
		sc->ps_flags |= PS_WAIT_FOR_BEACON | PS_BEACON_SYNC;
457
	}
S
Sujith Manoharan 已提交
458
	spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
459

F
Felix Fietkau 已提交
460 461 462 463 464 465 466 467 468 469 470 471 472
	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) {
		/* 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 已提交
473 474
	}

475 476 477 478 479 480
	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 已提交
481

482
	ath9k_btcoex_handle_interrupt(sc, status);
483

S
Sujith 已提交
484
	/* re-enable hardware interrupt */
485
	ath9k_hw_enable_interrupts(ah);
486
out:
487
	spin_unlock(&sc->sc_pcu_lock);
488
	ath9k_ps_restore(sc);
S
Sujith 已提交
489 490
}

491
irqreturn_t ath_isr(int irq, void *dev)
S
Sujith 已提交
492
{
S
Sujith 已提交
493 494
#define SCHED_INTR (				\
		ATH9K_INT_FATAL |		\
495
		ATH9K_INT_BB_WATCHDOG |		\
S
Sujith 已提交
496 497 498
		ATH9K_INT_RXORN |		\
		ATH9K_INT_RXEOL |		\
		ATH9K_INT_RX |			\
F
Felix Fietkau 已提交
499 500
		ATH9K_INT_RXLP |		\
		ATH9K_INT_RXHP |		\
S
Sujith 已提交
501 502 503
		ATH9K_INT_TX |			\
		ATH9K_INT_BMISS |		\
		ATH9K_INT_CST |			\
504
		ATH9K_INT_TSFOOR |		\
505 506
		ATH9K_INT_GENTIMER |		\
		ATH9K_INT_MCI)
S
Sujith 已提交
507

S
Sujith 已提交
508
	struct ath_softc *sc = dev;
509
	struct ath_hw *ah = sc->sc_ah;
510
	struct ath_common *common = ath9k_hw_common(ah);
S
Sujith 已提交
511 512 513
	enum ath9k_int status;
	bool sched = false;

S
Sujith 已提交
514 515 516 517 518
	/*
	 * The hardware is not ready/present, don't
	 * touch anything. Note this can happen early
	 * on if the IRQ is shared.
	 */
S
Sujith Manoharan 已提交
519
	if (test_bit(SC_OP_INVALID, &sc->sc_flags))
S
Sujith 已提交
520
		return IRQ_NONE;
S
Sujith 已提交
521

S
Sujith 已提交
522 523
	/* shared irq, not for us */

524
	if (!ath9k_hw_intrpend(ah))
S
Sujith 已提交
525 526
		return IRQ_NONE;

527 528
	if (test_bit(SC_OP_HW_RESET, &sc->sc_flags)) {
		ath9k_hw_kill_interrupts(ah);
529
		return IRQ_HANDLED;
530
	}
531

S
Sujith 已提交
532 533 534 535 536 537 538
	/*
	 * 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 已提交
539
	status &= ah->imask;	/* discard unasked-for bits */
S
Sujith 已提交
540

S
Sujith 已提交
541 542 543 544
	/*
	 * If there are no status bits set, then this interrupt was not
	 * for me (should have been caught above).
	 */
545
	if (!status)
S
Sujith 已提交
546
		return IRQ_NONE;
S
Sujith 已提交
547

S
Sujith 已提交
548 549 550 551 552 553 554 555 556 557
	/* 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 已提交
558 559
	if ((status & ATH9K_INT_FATAL) || ((status & ATH9K_INT_RXORN) &&
	    !(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)))
S
Sujith 已提交
560 561
		goto chip_reset;

562 563
	if ((ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) &&
	    (status & ATH9K_INT_BB_WATCHDOG)) {
564 565 566

		spin_lock(&common->cc_lock);
		ath_hw_cycle_counters_update(common);
567
		ar9003_hw_bb_watchdog_dbg_info(ah);
568 569
		spin_unlock(&common->cc_lock);

570 571
		goto chip_reset;
	}
572 573 574 575 576 577 578 579 580
#ifdef CONFIG_PM_SLEEP
	if (status & ATH9K_INT_BMISS) {
		if (atomic_read(&sc->wow_sleep_proc_intr) == 0) {
			ath_dbg(common, ANY, "during WoW we got a BMISS\n");
			atomic_inc(&sc->wow_got_bmiss_intr);
			atomic_dec(&sc->wow_sleep_proc_intr);
		}
	}
#endif
S
Sujith 已提交
581 582 583 584 585 586
	if (status & ATH9K_INT_SWBA)
		tasklet_schedule(&sc->bcon_tasklet);

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

587 588
	if (status & ATH9K_INT_RXEOL) {
		ah->imask &= ~(ATH9K_INT_RXEOL | ATH9K_INT_RXORN);
589
		ath9k_hw_set_interrupts(ah);
F
Felix Fietkau 已提交
590 591
	}

592 593
	if (!(ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
		if (status & ATH9K_INT_TIM_TIMER) {
594 595
			if (ATH_DBG_WARN_ON_ONCE(sc->ps_idle))
				goto chip_reset;
S
Sujith 已提交
596 597
			/* Clear RxAbort bit so that we can
			 * receive frames */
598
			ath9k_setpower(sc, ATH9K_PM_AWAKE);
S
Sujith Manoharan 已提交
599
			spin_lock(&sc->sc_pm_lock);
600
			ath9k_hw_setrxabort(sc->sc_ah, 0);
S
Sujith 已提交
601
			sc->ps_flags |= PS_WAIT_FOR_BEACON;
S
Sujith Manoharan 已提交
602
			spin_unlock(&sc->sc_pm_lock);
S
Sujith 已提交
603
		}
S
Sujith 已提交
604 605

chip_reset:
S
Sujith 已提交
606

607 608
	ath_debug_stat_interrupt(sc, status);

S
Sujith 已提交
609
	if (sched) {
610 611
		/* turn off every interrupt */
		ath9k_hw_disable_interrupts(ah);
S
Sujith 已提交
612 613 614 615
		tasklet_schedule(&sc->intr_tq);
	}

	return IRQ_HANDLED;
S
Sujith 已提交
616 617

#undef SCHED_INTR
S
Sujith 已提交
618 619
}

620
static int ath_reset(struct ath_softc *sc)
S
Sujith 已提交
621
{
622
	int i, r;
S
Sujith 已提交
623

624
	ath9k_ps_wakeup(sc);
625

626
	r = ath_reset_internal(sc, NULL);
S
Sujith 已提交
627

628 629 630 631 632 633 634
	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
		if (!ATH_TXQ_SETUP(sc, i))
			continue;

		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 已提交
635 636
	}

637
	ath9k_ps_restore(sc);
S
Sujith 已提交
638

639
	return r;
S
Sujith 已提交
640 641
}

642 643 644 645 646 647 648 649 650
void ath9k_queue_reset(struct ath_softc *sc, enum ath_reset_type type)
{
#ifdef CONFIG_ATH9K_DEBUGFS
	RESET_STAT_INC(sc, type);
#endif
	set_bit(SC_OP_HW_RESET, &sc->sc_flags);
	ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
}

651 652 653 654
void ath_reset_work(struct work_struct *work)
{
	struct ath_softc *sc = container_of(work, struct ath_softc, hw_reset_work);

655
	ath_reset(sc);
656 657
}

S
Sujith 已提交
658 659 660 661
/**********************/
/* mac80211 callbacks */
/**********************/

662
static int ath9k_start(struct ieee80211_hw *hw)
663
{
664
	struct ath_softc *sc = hw->priv;
665
	struct ath_hw *ah = sc->sc_ah;
666
	struct ath_common *common = ath9k_hw_common(ah);
667
	struct ieee80211_channel *curchan = hw->conf.chandef.chan;
S
Sujith 已提交
668
	struct ath9k_channel *init_channel;
669
	int r;
670

671
	ath_dbg(common, CONFIG,
J
Joe Perches 已提交
672 673
		"Starting driver with initial channel: %d MHz\n",
		curchan->center_freq);
674

675
	ath9k_ps_wakeup(sc);
676 677
	mutex_lock(&sc->mutex);

678
	init_channel = ath9k_cmn_get_channel(hw, ah, &hw->conf.chandef);
S
Sujith 已提交
679 680

	/* Reset SERDES registers */
681
	ath9k_hw_configpcipowersave(ah, false);
S
Sujith 已提交
682 683 684 685 686 687 688 689

	/*
	 * 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.
	 */
690
	spin_lock_bh(&sc->sc_pcu_lock);
F
Felix Fietkau 已提交
691 692 693

	atomic_set(&ah->intr_ref_cnt, -1);

694
	r = ath9k_hw_reset(ah, init_channel, ah->caldata, false);
695
	if (r) {
696 697 698
		ath_err(common,
			"Unable to reset hardware; reset status %d (freq %u MHz)\n",
			r, curchan->center_freq);
699
		ah->reset_power_on = false;
S
Sujith 已提交
700 701 702
	}

	/* Setup our intr mask. */
F
Felix Fietkau 已提交
703 704 705 706 707
	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)
708 709 710
		ah->imask |= ATH9K_INT_RXHP |
			     ATH9K_INT_RXLP |
			     ATH9K_INT_BB_WATCHDOG;
F
Felix Fietkau 已提交
711 712
	else
		ah->imask |= ATH9K_INT_RX;
S
Sujith 已提交
713

714
	ah->imask |= ATH9K_INT_GTT;
S
Sujith 已提交
715

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

719
	ath_mci_enable(sc);
720

S
Sujith Manoharan 已提交
721
	clear_bit(SC_OP_INVALID, &sc->sc_flags);
722
	sc->sc_ah->is_monitoring = false;
S
Sujith 已提交
723

724 725
	if (!ath_complete_reset(sc, false))
		ah->reset_power_on = false;
S
Sujith 已提交
726

F
Felix Fietkau 已提交
727 728 729 730 731 732 733 734 735 736 737 738
	if (ah->led_pin >= 0) {
		ath9k_hw_cfg_output(ah, ah->led_pin,
				    AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
		ath9k_hw_set_gpio(ah, ah->led_pin, 0);
	}

	/*
	 * Reset key cache to sane defaults (all entries cleared) instead of
	 * semi-random values after suspend/resume.
	 */
	ath9k_cmn_init_crypto(sc->sc_ah);

739
	spin_unlock_bh(&sc->sc_pcu_lock);
740

741 742
	mutex_unlock(&sc->mutex);

743 744
	ath9k_ps_restore(sc);

745
	return 0;
746 747
}

748 749 750
static void ath9k_tx(struct ieee80211_hw *hw,
		     struct ieee80211_tx_control *control,
		     struct sk_buff *skb)
751
{
752
	struct ath_softc *sc = hw->priv;
753
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
S
Sujith 已提交
754
	struct ath_tx_control txctl;
755
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
S
Sujith Manoharan 已提交
756
	unsigned long flags;
S
Sujith 已提交
757

758
	if (sc->ps_enabled) {
759 760 761 762 763 764 765
		/*
		 * 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)) {
766
			ath_dbg(common, PS,
J
Joe Perches 已提交
767
				"Add PM=1 for a TX frame while in PS mode\n");
768 769 770 771
			hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM);
		}
	}

S
Sujith Manoharan 已提交
772
	if (unlikely(sc->sc_ah->power_mode == ATH9K_PM_NETWORK_SLEEP)) {
773 774 775 776 777 778
		/*
		 * 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);
S
Sujith Manoharan 已提交
779
		spin_lock_irqsave(&sc->sc_pm_lock, flags);
780 781
		if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
			ath9k_hw_setrxabort(sc->sc_ah, 0);
782
		if (ieee80211_is_pspoll(hdr->frame_control)) {
783
			ath_dbg(common, PS,
J
Joe Perches 已提交
784
				"Sending PS-Poll to pick a buffered frame\n");
S
Sujith 已提交
785
			sc->ps_flags |= PS_WAIT_FOR_PSPOLL_DATA;
786
		} else {
787
			ath_dbg(common, PS, "Wake up to complete TX\n");
S
Sujith 已提交
788
			sc->ps_flags |= PS_WAIT_FOR_TX_ACK;
789 790 791
		}
		/*
		 * The actual restore operation will happen only after
S
Sujith Manoharan 已提交
792
		 * the ps_flags bit is cleared. We are just dropping
793 794
		 * the ps_usecount here.
		 */
S
Sujith Manoharan 已提交
795
		spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
796 797 798
		ath9k_ps_restore(sc);
	}

S
Sujith Manoharan 已提交
799 800 801 802 803 804 805 806 807
	/*
	 * Cannot tx while the hardware is in full sleep, it first needs a full
	 * chip reset to recover from that
	 */
	if (unlikely(sc->sc_ah->power_mode == ATH9K_PM_FULL_SLEEP)) {
		ath_err(common, "TX while HW is in FULL_SLEEP mode\n");
		goto exit;
	}

S
Sujith 已提交
808
	memset(&txctl, 0, sizeof(struct ath_tx_control));
809
	txctl.txq = sc->tx.txq_map[skb_get_queue_mapping(skb)];
810
	txctl.sta = control->sta;
S
Sujith 已提交
811

812
	ath_dbg(common, XMIT, "transmitting packet, skb: %p\n", skb);
813

814
	if (ath_tx_start(hw, skb, &txctl) != 0) {
815
		ath_dbg(common, XMIT, "TX failed\n");
B
Ben Greear 已提交
816
		TX_STAT_INC(txctl.txq->axq_qnum, txfailed);
S
Sujith 已提交
817
		goto exit;
818 819
	}

820
	return;
S
Sujith 已提交
821
exit:
F
Felix Fietkau 已提交
822
	ieee80211_free_txskb(hw, skb);
823 824
}

825
static void ath9k_stop(struct ieee80211_hw *hw)
826
{
827
	struct ath_softc *sc = hw->priv;
828
	struct ath_hw *ah = sc->sc_ah;
829
	struct ath_common *common = ath9k_hw_common(ah);
F
Felix Fietkau 已提交
830
	bool prev_idle;
831

S
Sujith 已提交
832 833
	mutex_lock(&sc->mutex);

834
	ath_cancel_work(sc);
835
	del_timer_sync(&sc->rx_poll_timer);
836

S
Sujith Manoharan 已提交
837
	if (test_bit(SC_OP_INVALID, &sc->sc_flags)) {
838
		ath_dbg(common, ANY, "Device not present\n");
S
Sujith 已提交
839
		mutex_unlock(&sc->mutex);
S
Sujith 已提交
840 841
		return;
	}
842

843 844 845
	/* Ensure HW is awake when we try to shut it down. */
	ath9k_ps_wakeup(sc);

846 847
	spin_lock_bh(&sc->sc_pcu_lock);

848 849 850
	/* prevent tasklets to enable interrupts once we disable them */
	ah->imask &= ~ATH9K_INT_GLOBAL;

S
Sujith 已提交
851 852
	/* make sure h/w will not generate any interrupt
	 * before setting the invalid flag. */
853
	ath9k_hw_disable_interrupts(ah);
S
Sujith 已提交
854

F
Felix Fietkau 已提交
855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872
	spin_unlock_bh(&sc->sc_pcu_lock);

	/* we can now sync irq and kill any running tasklets, since we already
	 * disabled interrupts and not holding a spin lock */
	synchronize_irq(sc->irq);
	tasklet_kill(&sc->intr_tq);
	tasklet_kill(&sc->bcon_tasklet);

	prev_idle = sc->ps_idle;
	sc->ps_idle = true;

	spin_lock_bh(&sc->sc_pcu_lock);

	if (ah->led_pin >= 0) {
		ath9k_hw_set_gpio(ah, ah->led_pin, 1);
		ath9k_hw_cfg_gpio_input(ah, ah->led_pin);
	}

873
	ath_prepare_reset(sc);
S
Sujith 已提交
874

875 876 877 878 879
	if (sc->rx.frag) {
		dev_kfree_skb_any(sc->rx.frag);
		sc->rx.frag = NULL;
	}

F
Felix Fietkau 已提交
880
	if (!ah->curchan)
881
		ah->curchan = ath9k_cmn_get_channel(hw, ah, &hw->conf.chandef);
882

F
Felix Fietkau 已提交
883 884
	ath9k_hw_reset(ah, ah->curchan, ah->caldata, false);
	ath9k_hw_phy_disable(ah);
885

F
Felix Fietkau 已提交
886
	ath9k_hw_configpcipowersave(ah, true);
887

F
Felix Fietkau 已提交
888
	spin_unlock_bh(&sc->sc_pcu_lock);
889

F
Felix Fietkau 已提交
890
	ath9k_ps_restore(sc);
S
Sujith 已提交
891

S
Sujith Manoharan 已提交
892
	set_bit(SC_OP_INVALID, &sc->sc_flags);
F
Felix Fietkau 已提交
893
	sc->ps_idle = prev_idle;
894

895 896
	mutex_unlock(&sc->mutex);

897
	ath_dbg(common, CONFIG, "Driver halt\n");
898 899
}

900
static bool ath9k_uses_beacons(int type)
901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916
{
	switch (type) {
	case NL80211_IFTYPE_AP:
	case NL80211_IFTYPE_ADHOC:
	case NL80211_IFTYPE_MESH_POINT:
		return true;
	default:
		return false;
	}
}

static void ath9k_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
{
	struct ath9k_vif_iter_data *iter_data = data;
	int i;

917
	if (iter_data->has_hw_macaddr) {
918 919 920
		for (i = 0; i < ETH_ALEN; i++)
			iter_data->mask[i] &=
				~(iter_data->hw_macaddr[i] ^ mac[i]);
921 922 923 924
	} else {
		memcpy(iter_data->hw_macaddr, mac, ETH_ALEN);
		iter_data->has_hw_macaddr = true;
	}
925

926
	switch (vif->type) {
927 928
	case NL80211_IFTYPE_AP:
		iter_data->naps++;
929
		break;
930 931
	case NL80211_IFTYPE_STATION:
		iter_data->nstations++;
B
Bill Jordan 已提交
932
		break;
933
	case NL80211_IFTYPE_ADHOC:
934 935
		iter_data->nadhocs++;
		break;
936
	case NL80211_IFTYPE_MESH_POINT:
937 938 939 940
		iter_data->nmeshes++;
		break;
	case NL80211_IFTYPE_WDS:
		iter_data->nwds++;
941 942
		break;
	default:
943
		break;
944
	}
945
}
946

947 948 949 950 951 952 953 954 955 956 957 958
static void ath9k_sta_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
{
	struct ath_softc *sc = data;
	struct ath_vif *avp = (void *)vif->drv_priv;

	if (vif->type != NL80211_IFTYPE_STATION)
		return;

	if (avp->primary_sta_vif)
		ath9k_set_assoc_state(sc, vif);
}

959 960 961 962 963
/* Called with sc->mutex held. */
void ath9k_calculate_iter_data(struct ieee80211_hw *hw,
			       struct ieee80211_vif *vif,
			       struct ath9k_vif_iter_data *iter_data)
{
964
	struct ath_softc *sc = hw->priv;
965 966
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
967

968 969 970 971 972 973
	/*
	 * Use the hardware MAC address as reference, the hardware uses it
	 * together with the BSSID mask when matching addresses.
	 */
	memset(iter_data, 0, sizeof(*iter_data));
	memset(&iter_data->mask, 0xff, ETH_ALEN);
S
Sujith 已提交
974

975 976 977 978
	if (vif)
		ath9k_vif_iter(iter_data, vif->addr, vif);

	/* Get list of all active MAC addresses */
979 980 981
	ieee80211_iterate_active_interfaces_atomic(
		sc->hw, IEEE80211_IFACE_ITER_RESUME_ALL,
		ath9k_vif_iter, iter_data);
982 983

	memcpy(common->macaddr, iter_data->hw_macaddr, ETH_ALEN);
984
}
985

986 987 988 989
/* Called with sc->mutex held. */
static void ath9k_calculate_summary_state(struct ieee80211_hw *hw,
					  struct ieee80211_vif *vif)
{
990
	struct ath_softc *sc = hw->priv;
991 992 993
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
	struct ath9k_vif_iter_data iter_data;
994
	enum nl80211_iftype old_opmode = ah->opmode;
995

996
	ath9k_calculate_iter_data(hw, vif, &iter_data);
997

998 999 1000 1001
	memcpy(common->bssidmask, iter_data.mask, ETH_ALEN);
	ath_hw_setbssidmask(common);

	if (iter_data.naps > 0) {
1002
		ath9k_hw_set_tsfadjust(ah, true);
1003 1004
		ah->opmode = NL80211_IFTYPE_AP;
	} else {
1005
		ath9k_hw_set_tsfadjust(ah, false);
S
Sujith 已提交
1006

1007 1008 1009
		if (iter_data.nmeshes)
			ah->opmode = NL80211_IFTYPE_MESH_POINT;
		else if (iter_data.nwds)
1010 1011 1012 1013 1014 1015
			ah->opmode = NL80211_IFTYPE_AP;
		else if (iter_data.nadhocs)
			ah->opmode = NL80211_IFTYPE_ADHOC;
		else
			ah->opmode = NL80211_IFTYPE_STATION;
	}
S
Sujith 已提交
1016

1017 1018
	ath9k_hw_setopmode(ah);

1019
	if ((iter_data.nstations + iter_data.nadhocs + iter_data.nmeshes) > 0)
P
Pavel Roskin 已提交
1020
		ah->imask |= ATH9K_INT_TSFOOR;
1021
	else
1022
		ah->imask &= ~ATH9K_INT_TSFOOR;
1023

1024
	ath9k_hw_set_interrupts(ah);
1025 1026 1027 1028 1029 1030 1031 1032

	/*
	 * If we are changing the opmode to STATION,
	 * a beacon sync needs to be done.
	 */
	if (ah->opmode == NL80211_IFTYPE_STATION &&
	    old_opmode == NL80211_IFTYPE_AP &&
	    test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) {
1033 1034 1035
		ieee80211_iterate_active_interfaces_atomic(
			sc->hw, IEEE80211_IFACE_ITER_RESUME_ALL,
			ath9k_sta_vif_iter, sc);
1036
	}
1037
}
1038

1039 1040
static int ath9k_add_interface(struct ieee80211_hw *hw,
			       struct ieee80211_vif *vif)
1041
{
1042
	struct ath_softc *sc = hw->priv;
1043 1044
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
1045 1046
	struct ath_vif *avp = (void *)vif->drv_priv;
	struct ath_node *an = &avp->mcast_node;
1047

1048
	mutex_lock(&sc->mutex);
1049

1050
	ath_dbg(common, CONFIG, "Attach a VIF of type: %d\n", vif->type);
1051 1052
	sc->nvifs++;

1053
	ath9k_ps_wakeup(sc);
S
Sujith Manoharan 已提交
1054
	ath9k_calculate_summary_state(hw, vif);
1055 1056
	ath9k_ps_restore(sc);

S
Sujith Manoharan 已提交
1057 1058 1059
	if (ath9k_uses_beacons(vif->type))
		ath9k_beacon_assign_slot(sc, vif);

1060 1061 1062 1063 1064 1065
	an->sc = sc;
	an->sta = NULL;
	an->vif = vif;
	an->no_ps_filter = true;
	ath_tx_node_init(sc, an);

1066
	mutex_unlock(&sc->mutex);
1067
	return 0;
1068 1069 1070 1071 1072 1073 1074
}

static int ath9k_change_interface(struct ieee80211_hw *hw,
				  struct ieee80211_vif *vif,
				  enum nl80211_iftype new_type,
				  bool p2p)
{
1075
	struct ath_softc *sc = hw->priv;
1076 1077
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);

1078
	ath_dbg(common, CONFIG, "Change Interface\n");
1079
	mutex_lock(&sc->mutex);
1080 1081

	if (ath9k_uses_beacons(vif->type))
S
Sujith Manoharan 已提交
1082
		ath9k_beacon_remove_slot(sc, vif);
1083

1084 1085 1086
	vif->type = new_type;
	vif->p2p = p2p;

1087
	ath9k_ps_wakeup(sc);
S
Sujith Manoharan 已提交
1088
	ath9k_calculate_summary_state(hw, vif);
1089 1090
	ath9k_ps_restore(sc);

S
Sujith Manoharan 已提交
1091 1092 1093
	if (ath9k_uses_beacons(vif->type))
		ath9k_beacon_assign_slot(sc, vif);

1094
	mutex_unlock(&sc->mutex);
1095
	return 0;
1096 1097
}

1098
static void ath9k_remove_interface(struct ieee80211_hw *hw,
1099
				   struct ieee80211_vif *vif)
1100
{
1101
	struct ath_softc *sc = hw->priv;
1102
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1103
	struct ath_vif *avp = (void *)vif->drv_priv;
1104

1105
	ath_dbg(common, CONFIG, "Detach Interface\n");
1106

1107 1108
	mutex_lock(&sc->mutex);

1109
	sc->nvifs--;
J
Jouni Malinen 已提交
1110

1111
	if (ath9k_uses_beacons(vif->type))
S
Sujith Manoharan 已提交
1112
		ath9k_beacon_remove_slot(sc, vif);
1113

1114 1115 1116
	if (sc->csa_vif == vif)
		sc->csa_vif = NULL;

1117
	ath9k_ps_wakeup(sc);
1118
	ath9k_calculate_summary_state(hw, NULL);
1119
	ath9k_ps_restore(sc);
1120

1121 1122
	ath_tx_node_cleanup(sc, &avp->mcast_node);

1123
	mutex_unlock(&sc->mutex);
1124 1125
}

1126
static void ath9k_enable_ps(struct ath_softc *sc)
1127
{
P
Pavel Roskin 已提交
1128
	struct ath_hw *ah = sc->sc_ah;
S
Sujith Manoharan 已提交
1129
	struct ath_common *common = ath9k_hw_common(ah);
P
Pavel Roskin 已提交
1130

1131
	sc->ps_enabled = true;
P
Pavel Roskin 已提交
1132 1133 1134
	if (!(ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) {
		if ((ah->imask & ATH9K_INT_TIM_TIMER) == 0) {
			ah->imask |= ATH9K_INT_TIM_TIMER;
1135
			ath9k_hw_set_interrupts(ah);
1136
		}
1137
		ath9k_hw_setrxabort(ah, 1);
1138
	}
S
Sujith Manoharan 已提交
1139
	ath_dbg(common, PS, "PowerSave enabled\n");
1140 1141
}

1142 1143 1144
static void ath9k_disable_ps(struct ath_softc *sc)
{
	struct ath_hw *ah = sc->sc_ah;
S
Sujith Manoharan 已提交
1145
	struct ath_common *common = ath9k_hw_common(ah);
1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156

	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;
1157
			ath9k_hw_set_interrupts(ah);
1158 1159
		}
	}
S
Sujith Manoharan 已提交
1160
	ath_dbg(common, PS, "PowerSave disabled\n");
1161 1162
}

1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204
void ath9k_spectral_scan_trigger(struct ieee80211_hw *hw)
{
	struct ath_softc *sc = hw->priv;
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
	u32 rxfilter;

	if (!ath9k_hw_ops(ah)->spectral_scan_trigger) {
		ath_err(common, "spectrum analyzer not implemented on this hardware\n");
		return;
	}

	ath9k_ps_wakeup(sc);
	rxfilter = ath9k_hw_getrxfilter(ah);
	ath9k_hw_setrxfilter(ah, rxfilter |
				 ATH9K_RX_FILTER_PHYRADAR |
				 ATH9K_RX_FILTER_PHYERR);

	/* TODO: usually this should not be neccesary, but for some reason
	 * (or in some mode?) the trigger must be called after the
	 * configuration, otherwise the register will have its values reset
	 * (on my ar9220 to value 0x01002310)
	 */
	ath9k_spectral_scan_config(hw, sc->spectral_mode);
	ath9k_hw_ops(ah)->spectral_scan_trigger(ah);
	ath9k_ps_restore(sc);
}

int ath9k_spectral_scan_config(struct ieee80211_hw *hw,
			       enum spectral_mode spectral_mode)
{
	struct ath_softc *sc = hw->priv;
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);

	if (!ath9k_hw_ops(ah)->spectral_scan_trigger) {
		ath_err(common, "spectrum analyzer not implemented on this hardware\n");
		return -1;
	}

	switch (spectral_mode) {
	case SPECTRAL_DISABLED:
1205
		sc->spec_config.enabled = 0;
1206 1207 1208 1209 1210
		break;
	case SPECTRAL_BACKGROUND:
		/* send endless samples.
		 * TODO: is this really useful for "background"?
		 */
1211 1212
		sc->spec_config.endless = 1;
		sc->spec_config.enabled = 1;
1213 1214 1215
		break;
	case SPECTRAL_CHANSCAN:
	case SPECTRAL_MANUAL:
1216 1217
		sc->spec_config.endless = 0;
		sc->spec_config.enabled = 1;
1218 1219 1220 1221 1222 1223
		break;
	default:
		return -1;
	}

	ath9k_ps_wakeup(sc);
1224
	ath9k_hw_ops(ah)->spectral_scan_config(ah, &sc->spec_config);
1225 1226 1227 1228 1229 1230 1231
	ath9k_ps_restore(sc);

	sc->spectral_mode = spectral_mode;

	return 0;
}

1232
static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
1233
{
1234
	struct ath_softc *sc = hw->priv;
1235 1236
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
1237
	struct ieee80211_conf *conf = &hw->conf;
1238
	bool reset_channel = false;
1239

F
Felix Fietkau 已提交
1240
	ath9k_ps_wakeup(sc);
1241
	mutex_lock(&sc->mutex);
1242

1243
	if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1244
		sc->ps_idle = !!(conf->flags & IEEE80211_CONF_IDLE);
1245
		if (sc->ps_idle) {
1246
			ath_cancel_work(sc);
1247 1248 1249
			ath9k_stop_btcoex(sc);
		} else {
			ath9k_start_btcoex(sc);
1250 1251 1252 1253 1254
			/*
			 * The chip needs a reset to properly wake up from
			 * full sleep
			 */
			reset_channel = ah->chip_fullsleep;
1255
		}
1256
	}
1257

1258 1259 1260 1261 1262 1263
	/*
	 * 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.
	 */
1264
	if (changed & IEEE80211_CONF_CHANGE_PS) {
1265 1266
		unsigned long flags;
		spin_lock_irqsave(&sc->sc_pm_lock, flags);
1267 1268
		if (conf->flags & IEEE80211_CONF_PS)
			ath9k_enable_ps(sc);
1269 1270
		else
			ath9k_disable_ps(sc);
1271
		spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
1272 1273
	}

S
Sujith 已提交
1274 1275
	if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
		if (conf->flags & IEEE80211_CONF_MONITOR) {
1276
			ath_dbg(common, CONFIG, "Monitor mode is enabled\n");
1277 1278
			sc->sc_ah->is_monitoring = true;
		} else {
1279
			ath_dbg(common, CONFIG, "Monitor mode is disabled\n");
1280
			sc->sc_ah->is_monitoring = false;
S
Sujith 已提交
1281 1282 1283
		}
	}

1284
	if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || reset_channel) {
1285
		if (ath_set_channel(sc, &hw->conf.chandef) < 0) {
1286
			ath_err(common, "Unable to set channel\n");
1287
			mutex_unlock(&sc->mutex);
1288
			ath9k_ps_restore(sc);
1289 1290
			return -EINVAL;
		}
S
Sujith 已提交
1291
	}
1292

1293
	if (changed & IEEE80211_CONF_CHANGE_POWER) {
1294
		ath_dbg(common, CONFIG, "Set power: %d\n", conf->power_level);
S
Sujith 已提交
1295
		sc->config.txpowlimit = 2 * conf->power_level;
1296 1297
		ath9k_cmn_update_txpow(ah, sc->curtxpow,
				       sc->config.txpowlimit, &sc->curtxpow);
1298 1299
	}

1300
	mutex_unlock(&sc->mutex);
F
Felix Fietkau 已提交
1301
	ath9k_ps_restore(sc);
1302

1303 1304 1305
	return 0;
}

1306 1307 1308 1309
#define SUPPORTED_FILTERS			\
	(FIF_PROMISC_IN_BSS |			\
	FIF_ALLMULTI |				\
	FIF_CONTROL |				\
1310
	FIF_PSPOLL |				\
1311 1312
	FIF_OTHER_BSS |				\
	FIF_BCN_PRBRESP_PROMISC |		\
1313
	FIF_PROBE_REQ |				\
1314
	FIF_FCSFAIL)
1315

1316 1317 1318 1319
/* FIXME: sc->sc_full_reset ? */
static void ath9k_configure_filter(struct ieee80211_hw *hw,
				   unsigned int changed_flags,
				   unsigned int *total_flags,
1320
				   u64 multicast)
1321
{
1322
	struct ath_softc *sc = hw->priv;
1323
	u32 rfilt;
1324

1325 1326
	changed_flags &= SUPPORTED_FILTERS;
	*total_flags &= SUPPORTED_FILTERS;
1327

S
Sujith 已提交
1328
	sc->rx.rxfilter = *total_flags;
1329
	ath9k_ps_wakeup(sc);
1330 1331
	rfilt = ath_calcrxfilter(sc);
	ath9k_hw_setrxfilter(sc->sc_ah, rfilt);
1332
	ath9k_ps_restore(sc);
1333

1334 1335
	ath_dbg(ath9k_hw_common(sc->sc_ah), CONFIG, "Set HW RX filter: 0x%x\n",
		rfilt);
1336
}
1337

1338 1339 1340
static int ath9k_sta_add(struct ieee80211_hw *hw,
			 struct ieee80211_vif *vif,
			 struct ieee80211_sta *sta)
1341
{
1342
	struct ath_softc *sc = hw->priv;
1343 1344 1345
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
	struct ath_node *an = (struct ath_node *) sta->drv_priv;
	struct ieee80211_key_conf ps_key = { };
1346
	int key;
1347

1348
	ath_node_attach(sc, sta, vif);
1349 1350 1351 1352 1353

	if (vif->type != NL80211_IFTYPE_AP &&
	    vif->type != NL80211_IFTYPE_AP_VLAN)
		return 0;

1354 1355 1356
	key = ath_key_config(common, vif, sta, &ps_key);
	if (key > 0)
		an->ps_key = key;
1357 1358 1359 1360

	return 0;
}

1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372
static void ath9k_del_ps_key(struct ath_softc *sc,
			     struct ieee80211_vif *vif,
			     struct ieee80211_sta *sta)
{
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
	struct ath_node *an = (struct ath_node *) sta->drv_priv;
	struct ieee80211_key_conf ps_key = { .hw_key_idx = an->ps_key };

	if (!an->ps_key)
	    return;

	ath_key_delete(common, &ps_key);
1373
	an->ps_key = 0;
1374 1375
}

1376 1377 1378 1379
static int ath9k_sta_remove(struct ieee80211_hw *hw,
			    struct ieee80211_vif *vif,
			    struct ieee80211_sta *sta)
{
1380
	struct ath_softc *sc = hw->priv;
1381

1382
	ath9k_del_ps_key(sc, vif, sta);
1383 1384 1385
	ath_node_detach(sc, sta);

	return 0;
1386 1387
}

1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398
static void ath9k_sta_notify(struct ieee80211_hw *hw,
			 struct ieee80211_vif *vif,
			 enum sta_notify_cmd cmd,
			 struct ieee80211_sta *sta)
{
	struct ath_softc *sc = hw->priv;
	struct ath_node *an = (struct ath_node *) sta->drv_priv;

	switch (cmd) {
	case STA_NOTIFY_SLEEP:
		an->sleeping = true;
1399
		ath_tx_aggr_sleep(sta, sc, an);
1400 1401 1402 1403 1404 1405 1406 1407
		break;
	case STA_NOTIFY_AWAKE:
		an->sleeping = false;
		ath_tx_aggr_wakeup(sc, an);
		break;
	}
}

1408 1409
static int ath9k_conf_tx(struct ieee80211_hw *hw,
			 struct ieee80211_vif *vif, u16 queue,
1410
			 const struct ieee80211_tx_queue_params *params)
1411
{
1412
	struct ath_softc *sc = hw->priv;
1413
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1414
	struct ath_txq *txq;
1415
	struct ath9k_tx_queue_info qi;
1416
	int ret = 0;
1417

1418
	if (queue >= IEEE80211_NUM_ACS)
1419
		return 0;
1420

1421 1422
	txq = sc->tx.txq_map[queue];

1423
	ath9k_ps_wakeup(sc);
1424 1425
	mutex_lock(&sc->mutex);

1426 1427
	memset(&qi, 0, sizeof(struct ath9k_tx_queue_info));

1428 1429 1430
	qi.tqi_aifs = params->aifs;
	qi.tqi_cwmin = params->cw_min;
	qi.tqi_cwmax = params->cw_max;
1431
	qi.tqi_burstTime = params->txop * 32;
1432

1433
	ath_dbg(common, CONFIG,
J
Joe Perches 已提交
1434 1435 1436
		"Configure tx [queue/halq] [%d/%d], aifs: %d, cw_min: %d, cw_max: %d, txop: %d\n",
		queue, txq->axq_qnum, params->aifs, params->cw_min,
		params->cw_max, params->txop);
1437

1438
	ath_update_max_aggr_framelen(sc, queue, qi.tqi_burstTime);
1439
	ret = ath_txq_update(sc, txq->axq_qnum, &qi);
1440
	if (ret)
1441
		ath_err(common, "TXQ Update failed\n");
1442

1443
	mutex_unlock(&sc->mutex);
1444
	ath9k_ps_restore(sc);
1445

1446 1447
	return ret;
}
1448

1449 1450
static int ath9k_set_key(struct ieee80211_hw *hw,
			 enum set_key_cmd cmd,
1451 1452
			 struct ieee80211_vif *vif,
			 struct ieee80211_sta *sta,
1453 1454
			 struct ieee80211_key_conf *key)
{
1455
	struct ath_softc *sc = hw->priv;
1456
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1457
	int ret = 0;
1458

1459
	if (ath9k_modparam_nohwcrypt)
1460 1461
		return -ENOSPC;

C
Chun-Yeow Yeoh 已提交
1462 1463
	if ((vif->type == NL80211_IFTYPE_ADHOC ||
	     vif->type == NL80211_IFTYPE_MESH_POINT) &&
J
Jouni Malinen 已提交
1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476
	    (key->cipher == WLAN_CIPHER_SUITE_TKIP ||
	     key->cipher == WLAN_CIPHER_SUITE_CCMP) &&
	    !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) {
		/*
		 * For now, disable hw crypto for the RSN IBSS group keys. This
		 * could be optimized in the future to use a modified key cache
		 * design to support per-STA RX GTK, but until that gets
		 * implemented, use of software crypto for group addressed
		 * frames is a acceptable to allow RSN IBSS to be used.
		 */
		return -EOPNOTSUPP;
	}

1477
	mutex_lock(&sc->mutex);
1478
	ath9k_ps_wakeup(sc);
1479
	ath_dbg(common, CONFIG, "Set HW Key\n");
1480

1481 1482
	switch (cmd) {
	case SET_KEY:
1483 1484 1485
		if (sta)
			ath9k_del_ps_key(sc, vif, sta);

1486
		ret = ath_key_config(common, vif, sta, key);
1487 1488
		if (ret >= 0) {
			key->hw_key_idx = ret;
1489 1490
			/* push IV and Michael MIC generation to stack */
			key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1491
			if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
1492
				key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
1493 1494
			if (sc->sc_ah->sw_mgmt_crypto &&
			    key->cipher == WLAN_CIPHER_SUITE_CCMP)
1495
				key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
1496
			ret = 0;
1497 1498 1499
		}
		break;
	case DISABLE_KEY:
1500
		ath_key_delete(common, key);
1501 1502 1503 1504
		break;
	default:
		ret = -EINVAL;
	}
1505

1506
	ath9k_ps_restore(sc);
1507 1508
	mutex_unlock(&sc->mutex);

1509 1510
	return ret;
}
1511 1512 1513

static void ath9k_set_assoc_state(struct ath_softc *sc,
				  struct ieee80211_vif *vif)
1514 1515 1516
{
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
	struct ath_vif *avp = (void *)vif->drv_priv;
1517
	struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
S
Sujith Manoharan 已提交
1518
	unsigned long flags;
1519 1520 1521 1522

	set_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags);
	avp->primary_sta_vif = true;

1523
	/*
1524 1525 1526 1527
	 * Set the AID, BSSID and do beacon-sync only when
	 * the HW opmode is STATION.
	 *
	 * But the primary bit is set above in any case.
1528
	 */
1529
	if (sc->sc_ah->opmode != NL80211_IFTYPE_STATION)
1530 1531
		return;

1532 1533 1534
	memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
	common->curaid = bss_conf->aid;
	ath9k_hw_write_associd(sc->sc_ah);
S
Sujith Manoharan 已提交
1535

1536 1537
	sc->last_rssi = ATH_RSSI_DUMMY_MARKER;
	sc->sc_ah->stats.avgbrssi = ATH_RSSI_DUMMY_MARKER;
1538

1539 1540 1541
	spin_lock_irqsave(&sc->sc_pm_lock, flags);
	sc->ps_flags |= PS_BEACON_SYNC | PS_WAIT_FOR_BEACON;
	spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
1542

1543 1544 1545
	if (ath9k_hw_mci_is_enabled(sc->sc_ah))
		ath9k_mci_update_wlan_channels(sc, false);

1546 1547 1548
	ath_dbg(common, CONFIG,
		"Primary Station interface: %pM, BSSID: %pM\n",
		vif->addr, common->curbssid);
1549 1550
}

1551
static void ath9k_bss_assoc_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
1552
{
1553
	struct ath_softc *sc = data;
1554 1555
	struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;

1556
	if (test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags))
1557 1558
		return;

1559 1560
	if (bss_conf->assoc)
		ath9k_set_assoc_state(sc, vif);
1561
}
1562

1563 1564 1565 1566 1567
static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
				   struct ieee80211_vif *vif,
				   struct ieee80211_bss_conf *bss_conf,
				   u32 changed)
{
S
Sujith Manoharan 已提交
1568 1569 1570 1571 1572
#define CHECK_ANI				\
	(BSS_CHANGED_ASSOC |			\
	 BSS_CHANGED_IBSS |			\
	 BSS_CHANGED_BEACON_ENABLED)

1573
	struct ath_softc *sc = hw->priv;
1574
	struct ath_hw *ah = sc->sc_ah;
1575
	struct ath_common *common = ath9k_hw_common(ah);
1576
	struct ath_vif *avp = (void *)vif->drv_priv;
1577
	int slottime;
1578

1579
	ath9k_ps_wakeup(sc);
1580 1581
	mutex_lock(&sc->mutex);

1582
	if (changed & BSS_CHANGED_ASSOC) {
1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593
		ath_dbg(common, CONFIG, "BSSID %pM Changed ASSOC %d\n",
			bss_conf->bssid, bss_conf->assoc);

		if (avp->primary_sta_vif && !bss_conf->assoc) {
			clear_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags);
			avp->primary_sta_vif = false;

			if (ah->opmode == NL80211_IFTYPE_STATION)
				clear_bit(SC_OP_BEACONS, &sc->sc_flags);
		}

1594 1595 1596
		ieee80211_iterate_active_interfaces_atomic(
			sc->hw, IEEE80211_IFACE_ITER_RESUME_ALL,
			ath9k_bss_assoc_iter, sc);
1597

1598 1599 1600 1601 1602
		if (!test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags) &&
		    ah->opmode == NL80211_IFTYPE_STATION) {
			memset(common->curbssid, 0, ETH_ALEN);
			common->curaid = 0;
			ath9k_hw_write_associd(sc->sc_ah);
1603 1604
			if (ath9k_hw_mci_is_enabled(sc->sc_ah))
				ath9k_mci_update_wlan_channels(sc, true);
1605
		}
S
Sujith 已提交
1606
	}
1607

1608 1609 1610 1611 1612 1613
	if (changed & BSS_CHANGED_IBSS) {
		memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
		common->curaid = bss_conf->aid;
		ath9k_hw_write_associd(sc->sc_ah);
	}

S
Sujith Manoharan 已提交
1614 1615
	if ((changed & BSS_CHANGED_BEACON_ENABLED) ||
	    (changed & BSS_CHANGED_BEACON_INT)) {
1616 1617 1618
		if (ah->opmode == NL80211_IFTYPE_AP &&
		    bss_conf->enable_beacon)
			ath9k_set_tsfadjust(sc, vif);
S
Sujith Manoharan 已提交
1619 1620
		if (ath9k_allow_beacon_config(sc, vif))
			ath9k_beacon_config(sc, vif, changed);
1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639
	}

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

S
Sujith Manoharan 已提交
1642 1643 1644
	if (changed & CHECK_ANI)
		ath_check_ani(sc);

1645
	mutex_unlock(&sc->mutex);
1646
	ath9k_ps_restore(sc);
S
Sujith Manoharan 已提交
1647 1648

#undef CHECK_ANI
1649
}
1650

1651
static u64 ath9k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
1652
{
1653
	struct ath_softc *sc = hw->priv;
1654
	u64 tsf;
1655

1656
	mutex_lock(&sc->mutex);
1657
	ath9k_ps_wakeup(sc);
1658
	tsf = ath9k_hw_gettsf64(sc->sc_ah);
1659
	ath9k_ps_restore(sc);
1660
	mutex_unlock(&sc->mutex);
1661

1662 1663
	return tsf;
}
1664

1665 1666 1667
static void ath9k_set_tsf(struct ieee80211_hw *hw,
			  struct ieee80211_vif *vif,
			  u64 tsf)
1668
{
1669
	struct ath_softc *sc = hw->priv;
1670

1671
	mutex_lock(&sc->mutex);
1672
	ath9k_ps_wakeup(sc);
1673
	ath9k_hw_settsf64(sc->sc_ah, tsf);
1674
	ath9k_ps_restore(sc);
1675
	mutex_unlock(&sc->mutex);
1676 1677
}

1678
static void ath9k_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
1679
{
1680
	struct ath_softc *sc = hw->priv;
1681

1682
	mutex_lock(&sc->mutex);
1683 1684

	ath9k_ps_wakeup(sc);
1685
	ath9k_hw_reset_tsf(sc->sc_ah);
1686 1687
	ath9k_ps_restore(sc);

1688
	mutex_unlock(&sc->mutex);
1689
}
1690

1691
static int ath9k_ampdu_action(struct ieee80211_hw *hw,
1692
			      struct ieee80211_vif *vif,
1693 1694
			      enum ieee80211_ampdu_mlme_action action,
			      struct ieee80211_sta *sta,
1695
			      u16 tid, u16 *ssn, u8 buf_size)
1696
{
1697
	struct ath_softc *sc = hw->priv;
1698
	bool flush = false;
1699
	int ret = 0;
1700

1701
	mutex_lock(&sc->mutex);
1702

1703 1704 1705 1706 1707 1708
	switch (action) {
	case IEEE80211_AMPDU_RX_START:
		break;
	case IEEE80211_AMPDU_RX_STOP:
		break;
	case IEEE80211_AMPDU_TX_START:
1709
		ath9k_ps_wakeup(sc);
1710 1711 1712
		ret = ath_tx_aggr_start(sc, sta, tid, ssn);
		if (!ret)
			ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1713
		ath9k_ps_restore(sc);
1714
		break;
1715 1716
	case IEEE80211_AMPDU_TX_STOP_FLUSH:
	case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
1717 1718
		flush = true;
	case IEEE80211_AMPDU_TX_STOP_CONT:
1719
		ath9k_ps_wakeup(sc);
S
Sujith 已提交
1720
		ath_tx_aggr_stop(sc, sta, tid);
1721
		if (!flush)
1722
			ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1723
		ath9k_ps_restore(sc);
1724
		break;
1725
	case IEEE80211_AMPDU_TX_OPERATIONAL:
1726
		ath9k_ps_wakeup(sc);
1727
		ath_tx_aggr_resume(sc, sta, tid);
1728
		ath9k_ps_restore(sc);
1729
		break;
1730
	default:
1731
		ath_err(ath9k_hw_common(sc->sc_ah), "Unknown AMPDU action\n");
1732 1733
	}

1734
	mutex_unlock(&sc->mutex);
1735

1736
	return ret;
1737 1738
}

1739 1740 1741
static int ath9k_get_survey(struct ieee80211_hw *hw, int idx,
			     struct survey_info *survey)
{
1742
	struct ath_softc *sc = hw->priv;
1743
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1744
	struct ieee80211_supported_band *sband;
1745 1746 1747 1748 1749 1750 1751
	struct ieee80211_channel *chan;
	unsigned long flags;
	int pos;

	spin_lock_irqsave(&common->cc_lock, flags);
	if (idx == 0)
		ath_update_survey_stats(sc);
1752 1753 1754 1755 1756 1757

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

1759 1760
	if (!sband)
		sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
1761

1762 1763 1764
	if (!sband || idx >= sband->n_channels) {
		spin_unlock_irqrestore(&common->cc_lock, flags);
		return -ENOENT;
1765
	}
1766

1767 1768 1769 1770 1771 1772
	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);

1773 1774 1775
	return 0;
}

1776 1777
static void ath9k_set_coverage_class(struct ieee80211_hw *hw, u8 coverage_class)
{
1778
	struct ath_softc *sc = hw->priv;
1779 1780 1781 1782
	struct ath_hw *ah = sc->sc_ah;

	mutex_lock(&sc->mutex);
	ah->coverage_class = coverage_class;
1783 1784

	ath9k_ps_wakeup(sc);
1785
	ath9k_hw_init_global_settings(ah);
1786 1787
	ath9k_ps_restore(sc);

1788 1789 1790
	mutex_unlock(&sc->mutex);
}

1791
static void ath9k_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
1792 1793
{
	struct ath_softc *sc = hw->priv;
1794 1795
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
1796 1797
	int timeout = 200; /* ms */
	int i, j;
1798
	bool drain_txq;
1799 1800 1801 1802

	mutex_lock(&sc->mutex);
	cancel_delayed_work_sync(&sc->tx_complete_work);

1803
	if (ah->ah_flags & AH_UNPLUGGED) {
1804
		ath_dbg(common, ANY, "Device has been unplugged!\n");
1805 1806 1807 1808
		mutex_unlock(&sc->mutex);
		return;
	}

S
Sujith Manoharan 已提交
1809
	if (test_bit(SC_OP_INVALID, &sc->sc_flags)) {
1810
		ath_dbg(common, ANY, "Device not present\n");
1811 1812 1813 1814
		mutex_unlock(&sc->mutex);
		return;
	}

1815
	for (j = 0; j < timeout; j++) {
1816
		bool npend = false;
1817 1818 1819

		if (j)
			usleep_range(1000, 2000);
1820

1821 1822 1823 1824
		for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
			if (!ATH_TXQ_SETUP(sc, i))
				continue;

1825 1826 1827 1828
			npend = ath9k_has_pending_frames(sc, &sc->tx.txq[i]);

			if (npend)
				break;
1829
		}
1830 1831

		if (!npend)
1832
		    break;
1833 1834
	}

1835 1836 1837
	if (drop) {
		ath9k_ps_wakeup(sc);
		spin_lock_bh(&sc->sc_pcu_lock);
1838
		drain_txq = ath_drain_all_txq(sc);
1839
		spin_unlock_bh(&sc->sc_pcu_lock);
1840

1841
		if (!drain_txq)
1842
			ath_reset(sc);
1843

1844 1845 1846
		ath9k_ps_restore(sc);
		ieee80211_wake_queues(hw);
	}
1847

1848 1849 1850 1851
	ieee80211_queue_delayed_work(hw, &sc->tx_complete_work, 0);
	mutex_unlock(&sc->mutex);
}

1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866
static bool ath9k_tx_frames_pending(struct ieee80211_hw *hw)
{
	struct ath_softc *sc = hw->priv;
	int i;

	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
		if (!ATH_TXQ_SETUP(sc, i))
			continue;

		if (ath9k_has_pending_frames(sc, &sc->tx.txq[i]))
			return true;
	}
	return false;
}

1867
static int ath9k_tx_last_beacon(struct ieee80211_hw *hw)
1868 1869 1870 1871 1872 1873 1874
{
	struct ath_softc *sc = hw->priv;
	struct ath_hw *ah = sc->sc_ah;
	struct ieee80211_vif *vif;
	struct ath_vif *avp;
	struct ath_buf *bf;
	struct ath_tx_status ts;
1875
	bool edma = !!(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA);
1876 1877 1878 1879 1880 1881
	int status;

	vif = sc->beacon.bslot[0];
	if (!vif)
		return 0;

S
Sujith Manoharan 已提交
1882
	if (!vif->bss_conf.enable_beacon)
1883 1884
		return 0;

S
Sujith Manoharan 已提交
1885 1886
	avp = (void *)vif->drv_priv;

1887
	if (!sc->beacon.tx_processed && !edma) {
1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907
		tasklet_disable(&sc->bcon_tasklet);

		bf = avp->av_bcbuf;
		if (!bf || !bf->bf_mpdu)
			goto skip;

		status = ath9k_hw_txprocdesc(ah, bf->bf_desc, &ts);
		if (status == -EINPROGRESS)
			goto skip;

		sc->beacon.tx_processed = true;
		sc->beacon.tx_last = !(ts.ts_status & ATH9K_TXERR_MASK);

skip:
		tasklet_enable(&sc->bcon_tasklet);
	}

	return sc->beacon.tx_last;
}

1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921
static int ath9k_get_stats(struct ieee80211_hw *hw,
			   struct ieee80211_low_level_stats *stats)
{
	struct ath_softc *sc = hw->priv;
	struct ath_hw *ah = sc->sc_ah;
	struct ath9k_mib_stats *mib_stats = &ah->ah_mibStats;

	stats->dot11ACKFailureCount = mib_stats->ackrcv_bad;
	stats->dot11RTSFailureCount = mib_stats->rts_bad;
	stats->dot11FCSErrorCount = mib_stats->fcs_bad;
	stats->dot11RTSSuccessCount = mib_stats->rts_good;
	return 0;
}

1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939
static u32 fill_chainmask(u32 cap, u32 new)
{
	u32 filled = 0;
	int i;

	for (i = 0; cap && new; i++, cap >>= 1) {
		if (!(cap & BIT(0)))
			continue;

		if (new & BIT(0))
			filled |= BIT(i);

		new >>= 1;
	}

	return filled;
}

1940 1941
static bool validate_antenna_mask(struct ath_hw *ah, u32 val)
{
1942 1943 1944
	if (AR_SREV_9300_20_OR_LATER(ah))
		return true;

1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956
	switch (val & 0x7) {
	case 0x1:
	case 0x3:
	case 0x7:
		return true;
	case 0x2:
		return (ah->caps.rx_chainmask == 1);
	default:
		return false;
	}
}

1957 1958 1959 1960 1961
static int ath9k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
{
	struct ath_softc *sc = hw->priv;
	struct ath_hw *ah = sc->sc_ah;

1962 1963 1964 1965
	if (ah->caps.rx_chainmask != 1)
		rx_ant |= tx_ant;

	if (!validate_antenna_mask(ah, rx_ant) || !tx_ant)
1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994
		return -EINVAL;

	sc->ant_rx = rx_ant;
	sc->ant_tx = tx_ant;

	if (ah->caps.rx_chainmask == 1)
		return 0;

	/* AR9100 runs into calibration issues if not all rx chains are enabled */
	if (AR_SREV_9100(ah))
		ah->rxchainmask = 0x7;
	else
		ah->rxchainmask = fill_chainmask(ah->caps.rx_chainmask, rx_ant);

	ah->txchainmask = fill_chainmask(ah->caps.tx_chainmask, tx_ant);
	ath9k_reload_chainmask_settings(sc);

	return 0;
}

static int ath9k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
{
	struct ath_softc *sc = hw->priv;

	*tx_ant = sc->ant_tx;
	*rx_ant = sc->ant_rx;
	return 0;
}

1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086
#ifdef CONFIG_PM_SLEEP

static void ath9k_wow_map_triggers(struct ath_softc *sc,
				   struct cfg80211_wowlan *wowlan,
				   u32 *wow_triggers)
{
	if (wowlan->disconnect)
		*wow_triggers |= AH_WOW_LINK_CHANGE |
				 AH_WOW_BEACON_MISS;
	if (wowlan->magic_pkt)
		*wow_triggers |= AH_WOW_MAGIC_PATTERN_EN;

	if (wowlan->n_patterns)
		*wow_triggers |= AH_WOW_USER_PATTERN_EN;

	sc->wow_enabled = *wow_triggers;

}

static void ath9k_wow_add_disassoc_deauth_pattern(struct ath_softc *sc)
{
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
	int pattern_count = 0;
	int i, byte_cnt;
	u8 dis_deauth_pattern[MAX_PATTERN_SIZE];
	u8 dis_deauth_mask[MAX_PATTERN_SIZE];

	memset(dis_deauth_pattern, 0, MAX_PATTERN_SIZE);
	memset(dis_deauth_mask, 0, MAX_PATTERN_SIZE);

	/*
	 * Create Dissassociate / Deauthenticate packet filter
	 *
	 *     2 bytes        2 byte    6 bytes   6 bytes  6 bytes
	 *  +--------------+----------+---------+--------+--------+----
	 *  + Frame Control+ Duration +   DA    +  SA    +  BSSID +
	 *  +--------------+----------+---------+--------+--------+----
	 *
	 * The above is the management frame format for disassociate/
	 * deauthenticate pattern, from this we need to match the first byte
	 * of 'Frame Control' and DA, SA, and BSSID fields
	 * (skipping 2nd byte of FC and Duration feild.
	 *
	 * Disassociate pattern
	 * --------------------
	 * Frame control = 00 00 1010
	 * DA, SA, BSSID = x:x:x:x:x:x
	 * Pattern will be A0000000 | x:x:x:x:x:x | x:x:x:x:x:x
	 *			    | x:x:x:x:x:x  -- 22 bytes
	 *
	 * Deauthenticate pattern
	 * ----------------------
	 * Frame control = 00 00 1100
	 * DA, SA, BSSID = x:x:x:x:x:x
	 * Pattern will be C0000000 | x:x:x:x:x:x | x:x:x:x:x:x
	 *			    | x:x:x:x:x:x  -- 22 bytes
	 */

	/* Create Disassociate Pattern first */

	byte_cnt = 0;

	/* Fill out the mask with all FF's */

	for (i = 0; i < MAX_PATTERN_MASK_SIZE; i++)
		dis_deauth_mask[i] = 0xff;

	/* copy the first byte of frame control field */
	dis_deauth_pattern[byte_cnt] = 0xa0;
	byte_cnt++;

	/* skip 2nd byte of frame control and Duration field */
	byte_cnt += 3;

	/*
	 * need not match the destination mac address, it can be a broadcast
	 * mac address or an unicast to this station
	 */
	byte_cnt += 6;

	/* copy the source mac address */
	memcpy((dis_deauth_pattern + byte_cnt), common->curbssid, ETH_ALEN);

	byte_cnt += 6;

	/* copy the bssid, its same as the source mac address */

	memcpy((dis_deauth_pattern + byte_cnt), common->curbssid, ETH_ALEN);

	/* Create Disassociate pattern mask */

2087 2088 2089
	dis_deauth_mask[0] = 0xfe;
	dis_deauth_mask[1] = 0x03;
	dis_deauth_mask[2] = 0xc0;
2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112

	ath_dbg(common, WOW, "Adding disassoc/deauth patterns for WoW\n");

	ath9k_hw_wow_apply_pattern(ah, dis_deauth_pattern, dis_deauth_mask,
				   pattern_count, byte_cnt);

	pattern_count++;
	/*
	 * for de-authenticate pattern, only the first byte of the frame
	 * control field gets changed from 0xA0 to 0xC0
	 */
	dis_deauth_pattern[0] = 0xC0;

	ath9k_hw_wow_apply_pattern(ah, dis_deauth_pattern, dis_deauth_mask,
				   pattern_count, byte_cnt);

}

static void ath9k_wow_add_pattern(struct ath_softc *sc,
				  struct cfg80211_wowlan *wowlan)
{
	struct ath_hw *ah = sc->sc_ah;
	struct ath9k_wow_pattern *wow_pattern = NULL;
2113
	struct cfg80211_pkt_pattern *patterns = wowlan->patterns;
2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169
	int mask_len;
	s8 i = 0;

	if (!wowlan->n_patterns)
		return;

	/*
	 * Add the new user configured patterns
	 */
	for (i = 0; i < wowlan->n_patterns; i++) {

		wow_pattern = kzalloc(sizeof(*wow_pattern), GFP_KERNEL);

		if (!wow_pattern)
			return;

		/*
		 * TODO: convert the generic user space pattern to
		 * appropriate chip specific/802.11 pattern.
		 */

		mask_len = DIV_ROUND_UP(wowlan->patterns[i].pattern_len, 8);
		memset(wow_pattern->pattern_bytes, 0, MAX_PATTERN_SIZE);
		memset(wow_pattern->mask_bytes, 0, MAX_PATTERN_SIZE);
		memcpy(wow_pattern->pattern_bytes, patterns[i].pattern,
		       patterns[i].pattern_len);
		memcpy(wow_pattern->mask_bytes, patterns[i].mask, mask_len);
		wow_pattern->pattern_len = patterns[i].pattern_len;

		/*
		 * just need to take care of deauth and disssoc pattern,
		 * make sure we don't overwrite them.
		 */

		ath9k_hw_wow_apply_pattern(ah, wow_pattern->pattern_bytes,
					   wow_pattern->mask_bytes,
					   i + 2,
					   wow_pattern->pattern_len);
		kfree(wow_pattern);

	}

}

static int ath9k_suspend(struct ieee80211_hw *hw,
			 struct cfg80211_wowlan *wowlan)
{
	struct ath_softc *sc = hw->priv;
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
	u32 wow_triggers_enabled = 0;
	int ret = 0;

	mutex_lock(&sc->mutex);

	ath_cancel_work(sc);
2170
	ath_stop_ani(sc);
2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321
	del_timer_sync(&sc->rx_poll_timer);

	if (test_bit(SC_OP_INVALID, &sc->sc_flags)) {
		ath_dbg(common, ANY, "Device not present\n");
		ret = -EINVAL;
		goto fail_wow;
	}

	if (WARN_ON(!wowlan)) {
		ath_dbg(common, WOW, "None of the WoW triggers enabled\n");
		ret = -EINVAL;
		goto fail_wow;
	}

	if (!device_can_wakeup(sc->dev)) {
		ath_dbg(common, WOW, "device_can_wakeup failed, WoW is not enabled\n");
		ret = 1;
		goto fail_wow;
	}

	/*
	 * none of the sta vifs are associated
	 * and we are not currently handling multivif
	 * cases, for instance we have to seperately
	 * configure 'keep alive frame' for each
	 * STA.
	 */

	if (!test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) {
		ath_dbg(common, WOW, "None of the STA vifs are associated\n");
		ret = 1;
		goto fail_wow;
	}

	if (sc->nvifs > 1) {
		ath_dbg(common, WOW, "WoW for multivif is not yet supported\n");
		ret = 1;
		goto fail_wow;
	}

	ath9k_wow_map_triggers(sc, wowlan, &wow_triggers_enabled);

	ath_dbg(common, WOW, "WoW triggers enabled 0x%x\n",
		wow_triggers_enabled);

	ath9k_ps_wakeup(sc);

	ath9k_stop_btcoex(sc);

	/*
	 * Enable wake up on recieving disassoc/deauth
	 * frame by default.
	 */
	ath9k_wow_add_disassoc_deauth_pattern(sc);

	if (wow_triggers_enabled & AH_WOW_USER_PATTERN_EN)
		ath9k_wow_add_pattern(sc, wowlan);

	spin_lock_bh(&sc->sc_pcu_lock);
	/*
	 * To avoid false wake, we enable beacon miss interrupt only
	 * when we go to sleep. We save the current interrupt mask
	 * so we can restore it after the system wakes up
	 */
	sc->wow_intr_before_sleep = ah->imask;
	ah->imask &= ~ATH9K_INT_GLOBAL;
	ath9k_hw_disable_interrupts(ah);
	ah->imask = ATH9K_INT_BMISS | ATH9K_INT_GLOBAL;
	ath9k_hw_set_interrupts(ah);
	ath9k_hw_enable_interrupts(ah);

	spin_unlock_bh(&sc->sc_pcu_lock);

	/*
	 * we can now sync irq and kill any running tasklets, since we already
	 * disabled interrupts and not holding a spin lock
	 */
	synchronize_irq(sc->irq);
	tasklet_kill(&sc->intr_tq);

	ath9k_hw_wow_enable(ah, wow_triggers_enabled);

	ath9k_ps_restore(sc);
	ath_dbg(common, ANY, "WoW enabled in ath9k\n");
	atomic_inc(&sc->wow_sleep_proc_intr);

fail_wow:
	mutex_unlock(&sc->mutex);
	return ret;
}

static int ath9k_resume(struct ieee80211_hw *hw)
{
	struct ath_softc *sc = hw->priv;
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
	u32 wow_status;

	mutex_lock(&sc->mutex);

	ath9k_ps_wakeup(sc);

	spin_lock_bh(&sc->sc_pcu_lock);

	ath9k_hw_disable_interrupts(ah);
	ah->imask = sc->wow_intr_before_sleep;
	ath9k_hw_set_interrupts(ah);
	ath9k_hw_enable_interrupts(ah);

	spin_unlock_bh(&sc->sc_pcu_lock);

	wow_status = ath9k_hw_wow_wakeup(ah);

	if (atomic_read(&sc->wow_got_bmiss_intr) == 0) {
		/*
		 * some devices may not pick beacon miss
		 * as the reason they woke up so we add
		 * that here for that shortcoming.
		 */
		wow_status |= AH_WOW_BEACON_MISS;
		atomic_dec(&sc->wow_got_bmiss_intr);
		ath_dbg(common, ANY, "Beacon miss interrupt picked up during WoW sleep\n");
	}

	atomic_dec(&sc->wow_sleep_proc_intr);

	if (wow_status) {
		ath_dbg(common, ANY, "Waking up due to WoW triggers %s with WoW status = %x\n",
			ath9k_hw_wow_event_to_string(wow_status), wow_status);
	}

	ath_restart_work(sc);
	ath9k_start_btcoex(sc);

	ath9k_ps_restore(sc);
	mutex_unlock(&sc->mutex);

	return 0;
}

static void ath9k_set_wakeup(struct ieee80211_hw *hw, bool enabled)
{
	struct ath_softc *sc = hw->priv;

	mutex_lock(&sc->mutex);
	device_init_wakeup(sc->dev, 1);
	device_set_wakeup_enable(sc->dev, enabled);
	mutex_unlock(&sc->mutex);
}

#endif
2322 2323 2324
static void ath9k_sw_scan_start(struct ieee80211_hw *hw)
{
	struct ath_softc *sc = hw->priv;
2325
	set_bit(SC_OP_SCANNING, &sc->sc_flags);
2326 2327 2328 2329 2330
}

static void ath9k_sw_scan_complete(struct ieee80211_hw *hw)
{
	struct ath_softc *sc = hw->priv;
2331
	clear_bit(SC_OP_SCANNING, &sc->sc_flags);
2332
}
2333

2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346
static void ath9k_channel_switch_beacon(struct ieee80211_hw *hw,
					struct ieee80211_vif *vif,
					struct cfg80211_chan_def *chandef)
{
	struct ath_softc *sc = hw->priv;

	/* mac80211 does not support CSA in multi-if cases (yet) */
	if (WARN_ON(sc->csa_vif))
		return;

	sc->csa_vif = vif;
}

2347
struct ieee80211_ops ath9k_ops = {
2348 2349 2350 2351
	.tx 		    = ath9k_tx,
	.start 		    = ath9k_start,
	.stop 		    = ath9k_stop,
	.add_interface 	    = ath9k_add_interface,
2352
	.change_interface   = ath9k_change_interface,
2353 2354 2355
	.remove_interface   = ath9k_remove_interface,
	.config 	    = ath9k_config,
	.configure_filter   = ath9k_configure_filter,
2356 2357
	.sta_add	    = ath9k_sta_add,
	.sta_remove	    = ath9k_sta_remove,
2358
	.sta_notify         = ath9k_sta_notify,
2359 2360 2361 2362
	.conf_tx 	    = ath9k_conf_tx,
	.bss_info_changed   = ath9k_bss_info_changed,
	.set_key            = ath9k_set_key,
	.get_tsf 	    = ath9k_get_tsf,
2363
	.set_tsf 	    = ath9k_set_tsf,
2364
	.reset_tsf 	    = ath9k_reset_tsf,
2365
	.ampdu_action       = ath9k_ampdu_action,
2366
	.get_survey	    = ath9k_get_survey,
J
Johannes Berg 已提交
2367
	.rfkill_poll        = ath9k_rfkill_poll_state,
2368
	.set_coverage_class = ath9k_set_coverage_class,
2369
	.flush		    = ath9k_flush,
2370
	.tx_frames_pending  = ath9k_tx_frames_pending,
2371
	.tx_last_beacon     = ath9k_tx_last_beacon,
2372
	.release_buffered_frames = ath9k_release_buffered_frames,
2373
	.get_stats	    = ath9k_get_stats,
2374 2375
	.set_antenna	    = ath9k_set_antenna,
	.get_antenna	    = ath9k_get_antenna,
2376

2377 2378 2379 2380 2381 2382
#ifdef CONFIG_PM_SLEEP
	.suspend	    = ath9k_suspend,
	.resume		    = ath9k_resume,
	.set_wakeup	    = ath9k_set_wakeup,
#endif

2383 2384
#ifdef CONFIG_ATH9K_DEBUGFS
	.get_et_sset_count  = ath9k_get_et_sset_count,
2385 2386 2387 2388 2389 2390
	.get_et_stats       = ath9k_get_et_stats,
	.get_et_strings     = ath9k_get_et_strings,
#endif

#if defined(CONFIG_MAC80211_DEBUGFS) && defined(CONFIG_ATH9K_DEBUGFS)
	.sta_add_debugfs    = ath9k_sta_add_debugfs,
2391
#endif
2392 2393
	.sw_scan_start	    = ath9k_sw_scan_start,
	.sw_scan_complete   = ath9k_sw_scan_complete,
2394
	.channel_switch_beacon     = ath9k_channel_switch_beacon,
2395
};