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

S
Sujith 已提交
22 23 24 25 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
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;
	}
}

57 58 59 60 61 62 63 64 65 66 67 68 69
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;
}

70
static bool ath9k_setpower(struct ath_softc *sc, enum ath9k_power_mode mode)
71 72 73 74
{
	unsigned long flags;
	bool ret;

75 76 77
	spin_lock_irqsave(&sc->sc_pm_lock, flags);
	ret = ath9k_hw_setpower(sc->sc_ah, mode);
	spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
78 79 80 81

	return ret;
}

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

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

92
	power_mode = sc->sc_ah->power_mode;
93
	ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE);
94

95 96 97 98 99
	/*
	 * 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.
	 */
100 101 102 103
	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));
104
		memset(&common->cc_ani, 0, sizeof(common->cc_ani));
105 106
		spin_unlock(&common->cc_lock);
	}
107

108 109 110 111 112 113
 unlock:
	spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
}

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

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

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

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

141
	ath9k_hw_setpower(sc->sc_ah, mode);
142 143 144 145 146

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

147
static void __ath_cancel_work(struct ath_softc *sc)
S
Sujith 已提交
148
{
149 150 151
	cancel_work_sync(&sc->paprd_work);
	cancel_work_sync(&sc->hw_check_work);
	cancel_delayed_work_sync(&sc->tx_complete_work);
152
	cancel_delayed_work_sync(&sc->hw_pll_work);
153
}
154

155 156 157 158 159
static void ath_cancel_work(struct ath_softc *sc)
{
	__ath_cancel_work(sc);
	cancel_work_sync(&sc->hw_reset_work);
}
160

S
Sujith Manoharan 已提交
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
static void ath_restart_work(struct ath_softc *sc)
{
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);

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

	if (AR_SREV_9485(sc->sc_ah) || AR_SREV_9340(sc->sc_ah))
		ieee80211_queue_delayed_work(sc->hw, &sc->hw_pll_work,
				     msecs_to_jiffies(ATH_PLL_WORK_INTERVAL));

	ath_start_rx_poll(sc, 3);

	if (!common->disable_ani)
		ath_start_ani(common);
}

177 178 179 180
static bool ath_prepare_reset(struct ath_softc *sc, bool retry_tx, bool flush)
{
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
181
	bool ret = true;
182

183
	ieee80211_stop_queues(sc->hw);
184

185 186
	sc->hw_busy_count = 0;
	del_timer_sync(&common->ani.timer);
187
	del_timer_sync(&sc->rx_poll_timer);
S
Sujith 已提交
188

189 190
	ath9k_debug_samp_bb_mac(sc);
	ath9k_hw_disable_interrupts(ah);
191

192 193
	if (!ath_stoprecv(sc))
		ret = false;
194

195 196 197
	if (!ath_drain_all_txq(sc, retry_tx))
		ret = false;

198 199
	if (!flush) {
		if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
200 201
			ath_rx_tasklet(sc, 1, true);
		ath_rx_tasklet(sc, 1, false);
202 203 204
	} else {
		ath_flushrecv(sc);
	}
205

206 207
	return ret;
}
S
Sujith 已提交
208

209 210 211 212
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);
213
	unsigned long flags;
214 215

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

220 221
	ath9k_cmn_update_txpow(ah, sc->curtxpow,
			       sc->config.txpowlimit, &sc->curtxpow);
222 223

	clear_bit(SC_OP_HW_RESET, &sc->sc_flags);
224
	ath9k_hw_set_interrupts(ah);
225
	ath9k_hw_enable_interrupts(ah);
226

227
	if (!(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL) && start) {
228 229 230 231 232 233 234 235 236 237 238 239
		if (!test_bit(SC_OP_BEACONS, &sc->sc_flags))
			goto work;

		ath_set_beacon(sc);

		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);
		}
	work:
S
Sujith Manoharan 已提交
240
		ath_restart_work(sc);
241 242
	}

243 244
	if ((ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB) && sc->ant_rx != 3)
		ath_ant_comb_update(sc);
245

246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263
	ieee80211_wake_queues(sc->hw);

	return true;
}

static int ath_reset_internal(struct ath_softc *sc, struct ath9k_channel *hchan,
			      bool retry_tx)
{
	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;
	bool flush = false;
	int r;

	__ath_cancel_work(sc);

	spin_lock_bh(&sc->sc_pcu_lock);
264

265
	if (!(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)) {
266 267 268 269 270 271 272 273 274 275 276 277 278
		fastcc = false;
		caldata = &sc->caldata;
	}

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

	if (!ath_prepare_reset(sc, retry_tx, flush))
		fastcc = false;

279
	ath_dbg(common, CONFIG, "Reset to %u MHz, HT40: %d fastcc: %d\n",
280
		hchan->channel, IS_CHAN_HT40(hchan), fastcc);
281 282 283 284 285 286 287 288 289 290 291 292

	r = ath9k_hw_reset(ah, hchan, caldata, fastcc);
	if (r) {
		ath_err(common,
			"Unable to reset channel, reset status %d\n", r);
		goto out;
	}

	if (!ath_complete_reset(sc, true))
		r = -EIO;

out:
293
	spin_unlock_bh(&sc->sc_pcu_lock);
294 295 296 297 298 299 300 301 302 303 304 305 306 307
	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.
*/
static int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
		    struct ath9k_channel *hchan)
{
	int r;

S
Sujith Manoharan 已提交
308
	if (test_bit(SC_OP_INVALID, &sc->sc_flags))
309 310 311
		return -EIO;

	r = ath_reset_internal(sc, hchan, false);
312

313
	return r;
S
Sujith 已提交
314 315
}

316 317
static void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta,
			    struct ieee80211_vif *vif)
S
Sujith 已提交
318 319 320 321
{
	struct ath_node *an;
	an = (struct ath_node *)sta->drv_priv;

322 323 324 325
#ifdef CONFIG_ATH9K_DEBUGFS
	spin_lock(&sc->nodes_lock);
	list_add(&an->list, &sc->nodes);
	spin_unlock(&sc->nodes_lock);
326
#endif
327
	an->sta = sta;
328
	an->vif = vif;
329

330
	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) {
S
Sujith 已提交
331
		ath_tx_node_init(sc, an);
S
Sujith 已提交
332
		an->maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
333 334 335
				     sta->ht_cap.ampdu_factor);
		an->mpdudensity = parse_mpdudensity(sta->ht_cap.ampdu_density);
	}
S
Sujith 已提交
336 337 338 339 340 341
}

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

342 343 344 345 346 347 348
#ifdef CONFIG_ATH9K_DEBUGFS
	spin_lock(&sc->nodes_lock);
	list_del(&an->list);
	spin_unlock(&sc->nodes_lock);
	an->sta = NULL;
#endif

349
	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT)
S
Sujith 已提交
350 351 352
		ath_tx_node_cleanup(sc, an);
}

S
Sujith 已提交
353
void ath9k_tasklet(unsigned long data)
S
Sujith 已提交
354 355
{
	struct ath_softc *sc = (struct ath_softc *)data;
356
	struct ath_hw *ah = sc->sc_ah;
357
	struct ath_common *common = ath9k_hw_common(ah);
S
Sujith Manoharan 已提交
358
	unsigned long flags;
S
Sujith 已提交
359
	u32 status = sc->intrstatus;
F
Felix Fietkau 已提交
360
	u32 rxmask;
S
Sujith 已提交
361

362 363 364
	ath9k_ps_wakeup(sc);
	spin_lock(&sc->sc_pcu_lock);

365 366
	if ((status & ATH9K_INT_FATAL) ||
	    (status & ATH9K_INT_BB_WATCHDOG)) {
367 368 369 370 371 372 373 374 375 376
#ifdef CONFIG_ATH9K_DEBUGFS
		enum ath_reset_type type;

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

		RESET_STAT_INC(sc, type);
#endif
377
		set_bit(SC_OP_HW_RESET, &sc->sc_flags);
378
		ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
379
		goto out;
S
Sujith 已提交
380
	}
S
Sujith 已提交
381

S
Sujith Manoharan 已提交
382
	spin_lock_irqsave(&sc->sc_pm_lock, flags);
383 384 385 386 387
	if ((status & ATH9K_INT_TSFOOR) && sc->ps_enabled) {
		/*
		 * TSF sync does not look correct; remain awake to sync with
		 * the next Beacon.
		 */
388
		ath_dbg(common, PS, "TSFOOR - Sync with next Beacon\n");
389
		sc->ps_flags |= PS_WAIT_FOR_BEACON | PS_BEACON_SYNC;
390
	}
S
Sujith Manoharan 已提交
391
	spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
392

F
Felix Fietkau 已提交
393 394 395 396 397 398 399 400 401 402 403 404 405
	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 已提交
406 407
	}

408 409 410 411 412 413
	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 已提交
414

415
	ath9k_btcoex_handle_interrupt(sc, status);
416

417
out:
S
Sujith 已提交
418
	/* re-enable hardware interrupt */
419
	ath9k_hw_enable_interrupts(ah);
420

421
	spin_unlock(&sc->sc_pcu_lock);
422
	ath9k_ps_restore(sc);
S
Sujith 已提交
423 424
}

425
irqreturn_t ath_isr(int irq, void *dev)
S
Sujith 已提交
426
{
S
Sujith 已提交
427 428
#define SCHED_INTR (				\
		ATH9K_INT_FATAL |		\
429
		ATH9K_INT_BB_WATCHDOG |		\
S
Sujith 已提交
430 431 432
		ATH9K_INT_RXORN |		\
		ATH9K_INT_RXEOL |		\
		ATH9K_INT_RX |			\
F
Felix Fietkau 已提交
433 434
		ATH9K_INT_RXLP |		\
		ATH9K_INT_RXHP |		\
S
Sujith 已提交
435 436 437
		ATH9K_INT_TX |			\
		ATH9K_INT_BMISS |		\
		ATH9K_INT_CST |			\
438
		ATH9K_INT_TSFOOR |		\
439 440
		ATH9K_INT_GENTIMER |		\
		ATH9K_INT_MCI)
S
Sujith 已提交
441

S
Sujith 已提交
442
	struct ath_softc *sc = dev;
443
	struct ath_hw *ah = sc->sc_ah;
444
	struct ath_common *common = ath9k_hw_common(ah);
S
Sujith 已提交
445 446 447
	enum ath9k_int status;
	bool sched = false;

S
Sujith 已提交
448 449 450 451 452
	/*
	 * The hardware is not ready/present, don't
	 * touch anything. Note this can happen early
	 * on if the IRQ is shared.
	 */
S
Sujith Manoharan 已提交
453
	if (test_bit(SC_OP_INVALID, &sc->sc_flags))
S
Sujith 已提交
454
		return IRQ_NONE;
S
Sujith 已提交
455

S
Sujith 已提交
456 457
	/* shared irq, not for us */

458
	if (!ath9k_hw_intrpend(ah))
S
Sujith 已提交
459 460
		return IRQ_NONE;

461 462 463
	if(test_bit(SC_OP_HW_RESET, &sc->sc_flags))
		return IRQ_HANDLED;

S
Sujith 已提交
464 465 466 467 468 469 470
	/*
	 * 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 已提交
471
	status &= ah->imask;	/* discard unasked-for bits */
S
Sujith 已提交
472

S
Sujith 已提交
473 474 475 476
	/*
	 * If there are no status bits set, then this interrupt was not
	 * for me (should have been caught above).
	 */
477
	if (!status)
S
Sujith 已提交
478
		return IRQ_NONE;
S
Sujith 已提交
479

S
Sujith 已提交
480 481 482 483 484 485 486 487 488 489
	/* 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 已提交
490 491
	if ((status & ATH9K_INT_FATAL) || ((status & ATH9K_INT_RXORN) &&
	    !(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)))
S
Sujith 已提交
492 493
		goto chip_reset;

494 495
	if ((ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) &&
	    (status & ATH9K_INT_BB_WATCHDOG)) {
496 497 498

		spin_lock(&common->cc_lock);
		ath_hw_cycle_counters_update(common);
499
		ar9003_hw_bb_watchdog_dbg_info(ah);
500 501
		spin_unlock(&common->cc_lock);

502 503 504
		goto chip_reset;
	}

S
Sujith 已提交
505 506 507 508 509 510
	if (status & ATH9K_INT_SWBA)
		tasklet_schedule(&sc->bcon_tasklet);

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

511 512
	if (status & ATH9K_INT_RXEOL) {
		ah->imask &= ~(ATH9K_INT_RXEOL | ATH9K_INT_RXORN);
513
		ath9k_hw_set_interrupts(ah);
F
Felix Fietkau 已提交
514 515
	}

S
Sujith 已提交
516
	if (status & ATH9K_INT_MIB) {
S
Sujith 已提交
517
		/*
S
Sujith 已提交
518 519 520
		 * Disable interrupts until we service the MIB
		 * interrupt; otherwise it will continue to
		 * fire.
S
Sujith 已提交
521
		 */
522
		ath9k_hw_disable_interrupts(ah);
S
Sujith 已提交
523 524 525 526 527
		/*
		 * Let the hal handle the event. We assume
		 * it will clear whatever condition caused
		 * the interrupt.
		 */
528
		spin_lock(&common->cc_lock);
529
		ath9k_hw_proc_mib_event(ah);
530
		spin_unlock(&common->cc_lock);
531
		ath9k_hw_enable_interrupts(ah);
S
Sujith 已提交
532
	}
S
Sujith 已提交
533

534 535
	if (!(ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
		if (status & ATH9K_INT_TIM_TIMER) {
536 537
			if (ATH_DBG_WARN_ON_ONCE(sc->ps_idle))
				goto chip_reset;
S
Sujith 已提交
538 539
			/* Clear RxAbort bit so that we can
			 * receive frames */
540
			ath9k_setpower(sc, ATH9K_PM_AWAKE);
S
Sujith Manoharan 已提交
541
			spin_lock(&sc->sc_pm_lock);
542
			ath9k_hw_setrxabort(sc->sc_ah, 0);
S
Sujith 已提交
543
			sc->ps_flags |= PS_WAIT_FOR_BEACON;
S
Sujith Manoharan 已提交
544
			spin_unlock(&sc->sc_pm_lock);
S
Sujith 已提交
545
		}
S
Sujith 已提交
546 547

chip_reset:
S
Sujith 已提交
548

549 550
	ath_debug_stat_interrupt(sc, status);

S
Sujith 已提交
551
	if (sched) {
552 553
		/* turn off every interrupt */
		ath9k_hw_disable_interrupts(ah);
S
Sujith 已提交
554 555 556 557
		tasklet_schedule(&sc->intr_tq);
	}

	return IRQ_HANDLED;
S
Sujith 已提交
558 559

#undef SCHED_INTR
S
Sujith 已提交
560 561
}

562
static int ath_reset(struct ath_softc *sc, bool retry_tx)
S
Sujith 已提交
563
{
564
	int r;
S
Sujith 已提交
565

566
	ath9k_ps_wakeup(sc);
567

568
	r = ath_reset_internal(sc, NULL, retry_tx);
S
Sujith 已提交
569 570 571 572 573

	if (retry_tx) {
		int i;
		for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
			if (ATH_TXQ_SETUP(sc, i)) {
S
Sujith 已提交
574 575 576
				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 已提交
577 578 579 580
			}
		}
	}

581
	ath9k_ps_restore(sc);
S
Sujith 已提交
582

583
	return r;
S
Sujith 已提交
584 585
}

586 587 588 589 590 591 592
void ath_reset_work(struct work_struct *work)
{
	struct ath_softc *sc = container_of(work, struct ath_softc, hw_reset_work);

	ath_reset(sc, true);
}

S
Sujith 已提交
593 594 595 596
/**********************/
/* mac80211 callbacks */
/**********************/

597
static int ath9k_start(struct ieee80211_hw *hw)
598
{
599
	struct ath_softc *sc = hw->priv;
600
	struct ath_hw *ah = sc->sc_ah;
601
	struct ath_common *common = ath9k_hw_common(ah);
602
	struct ieee80211_channel *curchan = hw->conf.channel;
S
Sujith 已提交
603
	struct ath9k_channel *init_channel;
604
	int r;
605

606
	ath_dbg(common, CONFIG,
J
Joe Perches 已提交
607 608
		"Starting driver with initial channel: %d MHz\n",
		curchan->center_freq);
609

610
	ath9k_ps_wakeup(sc);
611 612
	mutex_lock(&sc->mutex);

613
	init_channel = ath9k_cmn_get_curchannel(hw, ah);
S
Sujith 已提交
614 615

	/* Reset SERDES registers */
616
	ath9k_hw_configpcipowersave(ah, false);
S
Sujith 已提交
617 618 619 620 621 622 623 624

	/*
	 * 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.
	 */
625
	spin_lock_bh(&sc->sc_pcu_lock);
F
Felix Fietkau 已提交
626 627 628

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

629
	r = ath9k_hw_reset(ah, init_channel, ah->caldata, false);
630
	if (r) {
631 632 633
		ath_err(common,
			"Unable to reset hardware; reset status %d (freq %u MHz)\n",
			r, curchan->center_freq);
634
		spin_unlock_bh(&sc->sc_pcu_lock);
635
		goto mutex_unlock;
S
Sujith 已提交
636 637 638
	}

	/* Setup our intr mask. */
F
Felix Fietkau 已提交
639 640 641 642 643
	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)
644 645 646
		ah->imask |= ATH9K_INT_RXHP |
			     ATH9K_INT_RXLP |
			     ATH9K_INT_BB_WATCHDOG;
F
Felix Fietkau 已提交
647 648
	else
		ah->imask |= ATH9K_INT_RX;
S
Sujith 已提交
649

650
	ah->imask |= ATH9K_INT_GTT;
S
Sujith 已提交
651

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

655
	ath_mci_enable(sc);
656

S
Sujith Manoharan 已提交
657
	clear_bit(SC_OP_INVALID, &sc->sc_flags);
658
	sc->sc_ah->is_monitoring = false;
S
Sujith 已提交
659

660 661 662 663 664
	if (!ath_complete_reset(sc, false)) {
		r = -EIO;
		spin_unlock_bh(&sc->sc_pcu_lock);
		goto mutex_unlock;
	}
S
Sujith 已提交
665

F
Felix Fietkau 已提交
666 667 668 669 670 671 672 673 674 675 676 677
	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);

678
	spin_unlock_bh(&sc->sc_pcu_lock);
679

680
	ath9k_start_btcoex(sc);
681

682 683 684
	if (ah->caps.pcie_lcr_extsync_en && common->bus_ops->extn_synch_en)
		common->bus_ops->extn_synch_en(common);

685 686 687
mutex_unlock:
	mutex_unlock(&sc->mutex);

688 689
	ath9k_ps_restore(sc);

690
	return r;
691 692
}

693
static void ath9k_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
694
{
695
	struct ath_softc *sc = hw->priv;
696
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
S
Sujith 已提交
697
	struct ath_tx_control txctl;
698
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
S
Sujith Manoharan 已提交
699
	unsigned long flags;
S
Sujith 已提交
700

701
	if (sc->ps_enabled) {
702 703 704 705 706 707 708
		/*
		 * 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)) {
709
			ath_dbg(common, PS,
J
Joe Perches 已提交
710
				"Add PM=1 for a TX frame while in PS mode\n");
711 712 713 714
			hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM);
		}
	}

S
Sujith Manoharan 已提交
715
	if (unlikely(sc->sc_ah->power_mode == ATH9K_PM_NETWORK_SLEEP)) {
716 717 718 719 720 721
		/*
		 * 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 已提交
722
		spin_lock_irqsave(&sc->sc_pm_lock, flags);
723 724
		if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
			ath9k_hw_setrxabort(sc->sc_ah, 0);
725
		if (ieee80211_is_pspoll(hdr->frame_control)) {
726
			ath_dbg(common, PS,
J
Joe Perches 已提交
727
				"Sending PS-Poll to pick a buffered frame\n");
S
Sujith 已提交
728
			sc->ps_flags |= PS_WAIT_FOR_PSPOLL_DATA;
729
		} else {
730
			ath_dbg(common, PS, "Wake up to complete TX\n");
S
Sujith 已提交
731
			sc->ps_flags |= PS_WAIT_FOR_TX_ACK;
732 733 734
		}
		/*
		 * The actual restore operation will happen only after
S
Sujith Manoharan 已提交
735
		 * the ps_flags bit is cleared. We are just dropping
736 737
		 * the ps_usecount here.
		 */
S
Sujith Manoharan 已提交
738
		spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
739 740 741
		ath9k_ps_restore(sc);
	}

S
Sujith Manoharan 已提交
742 743 744 745 746 747 748 749 750
	/*
	 * 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 已提交
751
	memset(&txctl, 0, sizeof(struct ath_tx_control));
752
	txctl.txq = sc->tx.txq_map[skb_get_queue_mapping(skb)];
S
Sujith 已提交
753

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

756
	if (ath_tx_start(hw, skb, &txctl) != 0) {
757
		ath_dbg(common, XMIT, "TX failed\n");
B
Ben Greear 已提交
758
		TX_STAT_INC(txctl.txq->axq_qnum, txfailed);
S
Sujith 已提交
759
		goto exit;
760 761
	}

762
	return;
S
Sujith 已提交
763 764
exit:
	dev_kfree_skb_any(skb);
765 766
}

767
static void ath9k_stop(struct ieee80211_hw *hw)
768
{
769
	struct ath_softc *sc = hw->priv;
770
	struct ath_hw *ah = sc->sc_ah;
771
	struct ath_common *common = ath9k_hw_common(ah);
F
Felix Fietkau 已提交
772
	bool prev_idle;
773

S
Sujith 已提交
774 775
	mutex_lock(&sc->mutex);

776
	ath_cancel_work(sc);
777
	del_timer_sync(&sc->rx_poll_timer);
778

S
Sujith Manoharan 已提交
779
	if (test_bit(SC_OP_INVALID, &sc->sc_flags)) {
780
		ath_dbg(common, ANY, "Device not present\n");
S
Sujith 已提交
781
		mutex_unlock(&sc->mutex);
S
Sujith 已提交
782 783
		return;
	}
784

785 786 787
	/* Ensure HW is awake when we try to shut it down. */
	ath9k_ps_wakeup(sc);

788
	ath9k_stop_btcoex(sc);
789

790 791
	spin_lock_bh(&sc->sc_pcu_lock);

792 793 794
	/* prevent tasklets to enable interrupts once we disable them */
	ah->imask &= ~ATH9K_INT_GLOBAL;

S
Sujith 已提交
795 796
	/* make sure h/w will not generate any interrupt
	 * before setting the invalid flag. */
797
	ath9k_hw_disable_interrupts(ah);
S
Sujith 已提交
798

F
Felix Fietkau 已提交
799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817
	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);
	}

	ath_prepare_reset(sc, false, true);
S
Sujith 已提交
818

819 820 821 822 823
	if (sc->rx.frag) {
		dev_kfree_skb_any(sc->rx.frag);
		sc->rx.frag = NULL;
	}

F
Felix Fietkau 已提交
824 825
	if (!ah->curchan)
		ah->curchan = ath9k_cmn_get_curchannel(hw, ah);
826

F
Felix Fietkau 已提交
827 828
	ath9k_hw_reset(ah, ah->curchan, ah->caldata, false);
	ath9k_hw_phy_disable(ah);
829

F
Felix Fietkau 已提交
830
	ath9k_hw_configpcipowersave(ah, true);
831

F
Felix Fietkau 已提交
832
	spin_unlock_bh(&sc->sc_pcu_lock);
833

F
Felix Fietkau 已提交
834
	ath9k_ps_restore(sc);
S
Sujith 已提交
835

S
Sujith Manoharan 已提交
836
	set_bit(SC_OP_INVALID, &sc->sc_flags);
F
Felix Fietkau 已提交
837
	sc->ps_idle = prev_idle;
838

839 840
	mutex_unlock(&sc->mutex);

841
	ath_dbg(common, CONFIG, "Driver halt\n");
842 843
}

844 845 846 847 848 849 850 851 852 853 854 855 856 857
bool ath9k_uses_beacons(int type)
{
	switch (type) {
	case NL80211_IFTYPE_AP:
	case NL80211_IFTYPE_ADHOC:
	case NL80211_IFTYPE_MESH_POINT:
		return true;
	default:
		return false;
	}
}

static void ath9k_reclaim_beacon(struct ath_softc *sc,
				 struct ieee80211_vif *vif)
858
{
859
	struct ath_vif *avp = (void *)vif->drv_priv;
860

861
	ath9k_set_beaconing_status(sc, false);
862
	ath_beacon_return(sc, avp);
863
	ath9k_set_beaconing_status(sc, true);
864 865 866 867 868 869 870 871 872 873 874
}

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

	if (iter_data->hw_macaddr)
		for (i = 0; i < ETH_ALEN; i++)
			iter_data->mask[i] &=
				~(iter_data->hw_macaddr[i] ^ mac[i]);
875

876
	switch (vif->type) {
877 878
	case NL80211_IFTYPE_AP:
		iter_data->naps++;
879
		break;
880 881
	case NL80211_IFTYPE_STATION:
		iter_data->nstations++;
B
Bill Jordan 已提交
882
		break;
883
	case NL80211_IFTYPE_ADHOC:
884 885
		iter_data->nadhocs++;
		break;
886
	case NL80211_IFTYPE_MESH_POINT:
887 888 889 890
		iter_data->nmeshes++;
		break;
	case NL80211_IFTYPE_WDS:
		iter_data->nwds++;
891 892
		break;
	default:
893
		break;
894
	}
895
}
896

897 898 899 900 901
/* 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)
{
902
	struct ath_softc *sc = hw->priv;
903 904
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
905

906 907 908 909 910 911 912
	/*
	 * 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));
	iter_data->hw_macaddr = common->macaddr;
	memset(&iter_data->mask, 0xff, ETH_ALEN);
S
Sujith 已提交
913

914 915 916 917 918 919 920
	if (vif)
		ath9k_vif_iter(iter_data, vif->addr, vif);

	/* Get list of all active MAC addresses */
	ieee80211_iterate_active_interfaces_atomic(sc->hw, ath9k_vif_iter,
						   iter_data);
}
921

922 923 924 925
/* Called with sc->mutex held. */
static void ath9k_calculate_summary_state(struct ieee80211_hw *hw,
					  struct ieee80211_vif *vif)
{
926
	struct ath_softc *sc = hw->priv;
927 928 929
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
	struct ath9k_vif_iter_data iter_data;
930

931
	ath9k_calculate_iter_data(hw, vif, &iter_data);
932

933 934 935 936 937 938
	/* Set BSSID mask. */
	memcpy(common->bssidmask, iter_data.mask, ETH_ALEN);
	ath_hw_setbssidmask(common);

	/* Set op-mode & TSF */
	if (iter_data.naps > 0) {
P
Pavel Roskin 已提交
939
		ath9k_hw_set_tsfadjust(ah, 1);
S
Sujith Manoharan 已提交
940
		set_bit(SC_OP_TSF_RESET, &sc->sc_flags);
941 942 943
		ah->opmode = NL80211_IFTYPE_AP;
	} else {
		ath9k_hw_set_tsfadjust(ah, 0);
S
Sujith Manoharan 已提交
944
		clear_bit(SC_OP_TSF_RESET, &sc->sc_flags);
S
Sujith 已提交
945

946 947 948
		if (iter_data.nmeshes)
			ah->opmode = NL80211_IFTYPE_MESH_POINT;
		else if (iter_data.nwds)
949 950 951 952 953 954
			ah->opmode = NL80211_IFTYPE_AP;
		else if (iter_data.nadhocs)
			ah->opmode = NL80211_IFTYPE_ADHOC;
		else
			ah->opmode = NL80211_IFTYPE_STATION;
	}
S
Sujith 已提交
955

956 957 958
	/*
	 * Enable MIB interrupts when there are hardware phy counters.
	 */
959
	if ((iter_data.nstations + iter_data.nadhocs + iter_data.nmeshes) > 0) {
960 961
		if (ah->config.enable_ani)
			ah->imask |= ATH9K_INT_MIB;
P
Pavel Roskin 已提交
962
		ah->imask |= ATH9K_INT_TSFOOR;
963 964 965
	} else {
		ah->imask &= ~ATH9K_INT_MIB;
		ah->imask &= ~ATH9K_INT_TSFOOR;
966 967
	}

968
	ath9k_hw_set_interrupts(ah);
969

970
	/* Set up ANI */
971
	if (iter_data.naps > 0) {
972
		sc->sc_ah->stats.avgbrssi = ATH_RSSI_DUMMY_MARKER;
973 974

		if (!common->disable_ani) {
S
Sujith Manoharan 已提交
975
			set_bit(SC_OP_ANI_RUN, &sc->sc_flags);
976 977 978
			ath_start_ani(common);
		}

979
	} else {
S
Sujith Manoharan 已提交
980
		clear_bit(SC_OP_ANI_RUN, &sc->sc_flags);
981
		del_timer_sync(&common->ani.timer);
982
	}
983
}
984

985 986 987 988
/* Called with sc->mutex held, vif counts set up properly. */
static void ath9k_do_vif_add_setup(struct ieee80211_hw *hw,
				   struct ieee80211_vif *vif)
{
989
	struct ath_softc *sc = hw->priv;
990 991 992 993

	ath9k_calculate_summary_state(hw, vif);

	if (ath9k_uses_beacons(vif->type)) {
994
		/* Reserve a beacon slot for the vif */
995
		ath9k_set_beaconing_status(sc, false);
996
		ath_beacon_alloc(sc, vif);
997
		ath9k_set_beaconing_status(sc, true);
998
	}
999 1000
}

1001 1002
static int ath9k_add_interface(struct ieee80211_hw *hw,
			       struct ieee80211_vif *vif)
1003
{
1004
	struct ath_softc *sc = hw->priv;
1005 1006 1007
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
	int ret = 0;
1008

1009
	ath9k_ps_wakeup(sc);
1010
	mutex_lock(&sc->mutex);
1011

1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024
	switch (vif->type) {
	case NL80211_IFTYPE_STATION:
	case NL80211_IFTYPE_WDS:
	case NL80211_IFTYPE_ADHOC:
	case NL80211_IFTYPE_AP:
	case NL80211_IFTYPE_MESH_POINT:
		break;
	default:
		ath_err(common, "Interface type %d not yet supported\n",
			vif->type);
		ret = -EOPNOTSUPP;
		goto out;
	}
1025

1026 1027 1028 1029 1030 1031 1032 1033 1034 1035
	if (ath9k_uses_beacons(vif->type)) {
		if (sc->nbcnvifs >= ATH_BCBUF) {
			ath_err(common, "Not enough beacon buffers when adding"
				" new interface of type: %i\n",
				vif->type);
			ret = -ENOBUFS;
			goto out;
		}
	}

1036 1037 1038
	if ((ah->opmode == NL80211_IFTYPE_ADHOC) ||
	    ((vif->type == NL80211_IFTYPE_ADHOC) &&
	     sc->nvifs > 0)) {
1039 1040 1041 1042
		ath_err(common, "Cannot create ADHOC interface when other"
			" interfaces already exist.\n");
		ret = -EINVAL;
		goto out;
1043
	}
1044

1045
	ath_dbg(common, CONFIG, "Attach a VIF of type: %d\n", vif->type);
1046 1047 1048 1049 1050 1051

	sc->nvifs++;

	ath9k_do_vif_add_setup(hw, vif);
out:
	mutex_unlock(&sc->mutex);
1052
	ath9k_ps_restore(sc);
1053
	return ret;
1054 1055 1056 1057 1058 1059 1060
}

static int ath9k_change_interface(struct ieee80211_hw *hw,
				  struct ieee80211_vif *vif,
				  enum nl80211_iftype new_type,
				  bool p2p)
{
1061
	struct ath_softc *sc = hw->priv;
1062
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1063
	int ret = 0;
1064

1065
	ath_dbg(common, CONFIG, "Change Interface\n");
1066
	mutex_lock(&sc->mutex);
1067
	ath9k_ps_wakeup(sc);
1068

1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079
	/* See if new interface type is valid. */
	if ((new_type == NL80211_IFTYPE_ADHOC) &&
	    (sc->nvifs > 1)) {
		ath_err(common, "When using ADHOC, it must be the only"
			" interface.\n");
		ret = -EINVAL;
		goto out;
	}

	if (ath9k_uses_beacons(new_type) &&
	    !ath9k_uses_beacons(vif->type)) {
1080 1081
		if (sc->nbcnvifs >= ATH_BCBUF) {
			ath_err(common, "No beacon slot available\n");
1082 1083
			ret = -ENOBUFS;
			goto out;
1084 1085
		}
	}
1086 1087 1088 1089 1090 1091

	/* Clean up old vif stuff */
	if (ath9k_uses_beacons(vif->type))
		ath9k_reclaim_beacon(sc, vif);

	/* Add new settings */
1092 1093 1094
	vif->type = new_type;
	vif->p2p = p2p;

1095
	ath9k_do_vif_add_setup(hw, vif);
1096
out:
1097
	ath9k_ps_restore(sc);
1098
	mutex_unlock(&sc->mutex);
1099
	return ret;
1100 1101
}

1102
static void ath9k_remove_interface(struct ieee80211_hw *hw,
1103
				   struct ieee80211_vif *vif)
1104
{
1105
	struct ath_softc *sc = hw->priv;
1106
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1107

1108
	ath_dbg(common, CONFIG, "Detach Interface\n");
1109

1110
	ath9k_ps_wakeup(sc);
1111 1112
	mutex_lock(&sc->mutex);

1113
	sc->nvifs--;
J
Jouni Malinen 已提交
1114

1115
	/* Reclaim beacon resources */
1116
	if (ath9k_uses_beacons(vif->type))
1117
		ath9k_reclaim_beacon(sc, vif);
1118

1119
	ath9k_calculate_summary_state(hw, NULL);
1120 1121

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

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

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

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

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

1162
static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
1163
{
1164
	struct ath_softc *sc = hw->priv;
1165 1166
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
1167
	struct ieee80211_conf *conf = &hw->conf;
1168
	bool reset_channel = false;
1169

F
Felix Fietkau 已提交
1170
	ath9k_ps_wakeup(sc);
1171
	mutex_lock(&sc->mutex);
1172

1173
	if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1174
		sc->ps_idle = !!(conf->flags & IEEE80211_CONF_IDLE);
1175 1176
		if (sc->ps_idle)
			ath_cancel_work(sc);
1177 1178 1179 1180 1181 1182
		else
			/*
			 * The chip needs a reset to properly wake up from
			 * full sleep
			 */
			reset_channel = ah->chip_fullsleep;
1183
	}
1184

1185 1186 1187 1188 1189 1190
	/*
	 * 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.
	 */
1191
	if (changed & IEEE80211_CONF_CHANGE_PS) {
1192 1193
		unsigned long flags;
		spin_lock_irqsave(&sc->sc_pm_lock, flags);
1194 1195
		if (conf->flags & IEEE80211_CONF_PS)
			ath9k_enable_ps(sc);
1196 1197
		else
			ath9k_disable_ps(sc);
1198
		spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
1199 1200
	}

S
Sujith 已提交
1201 1202
	if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
		if (conf->flags & IEEE80211_CONF_MONITOR) {
1203
			ath_dbg(common, CONFIG, "Monitor mode is enabled\n");
1204 1205
			sc->sc_ah->is_monitoring = true;
		} else {
1206
			ath_dbg(common, CONFIG, "Monitor mode is disabled\n");
1207
			sc->sc_ah->is_monitoring = false;
S
Sujith 已提交
1208 1209 1210
		}
	}

1211
	if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || reset_channel) {
1212
		struct ieee80211_channel *curchan = hw->conf.channel;
1213
		int pos = curchan->hw_value;
1214 1215 1216 1217 1218
		int old_pos = -1;
		unsigned long flags;

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

1220
		ath_dbg(common, CONFIG, "Set channel: %d MHz type: %d\n",
1221
			curchan->center_freq, conf->channel_type);
1222

1223 1224 1225 1226 1227
		/* 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);

1228 1229 1230 1231
		/*
		 * Preserve the current channel values, before updating
		 * the same channel
		 */
1232 1233
		if (ah->curchan && (old_pos == pos))
			ath9k_hw_getnf(ah, ah->curchan);
1234 1235 1236 1237

		ath9k_cmn_update_ichannel(&sc->sc_ah->channels[pos],
					  curchan, conf->channel_type);

1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257
		/*
		 * If the operating channel changes, change the survey in-use flags
		 * along with it.
		 * Reset the survey data for the new channel, unless we're switching
		 * back to the operating channel from an off-channel operation.
		 */
		if (!(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL) &&
		    sc->cur_survey != &sc->survey[pos]) {

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

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

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

1258
		if (ath_set_channel(sc, hw, &sc->sc_ah->channels[pos]) < 0) {
1259
			ath_err(common, "Unable to set channel\n");
1260
			mutex_unlock(&sc->mutex);
1261
			ath9k_ps_restore(sc);
1262 1263
			return -EINVAL;
		}
1264 1265 1266 1267 1268 1269 1270 1271

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

1274
	if (changed & IEEE80211_CONF_CHANGE_POWER) {
1275
		ath_dbg(common, CONFIG, "Set power: %d\n", conf->power_level);
S
Sujith 已提交
1276
		sc->config.txpowlimit = 2 * conf->power_level;
1277 1278
		ath9k_cmn_update_txpow(ah, sc->curtxpow,
				       sc->config.txpowlimit, &sc->curtxpow);
1279 1280
	}

1281
	mutex_unlock(&sc->mutex);
F
Felix Fietkau 已提交
1282
	ath9k_ps_restore(sc);
1283

1284 1285 1286
	return 0;
}

1287 1288 1289 1290
#define SUPPORTED_FILTERS			\
	(FIF_PROMISC_IN_BSS |			\
	FIF_ALLMULTI |				\
	FIF_CONTROL |				\
1291
	FIF_PSPOLL |				\
1292 1293
	FIF_OTHER_BSS |				\
	FIF_BCN_PRBRESP_PROMISC |		\
1294
	FIF_PROBE_REQ |				\
1295
	FIF_FCSFAIL)
1296

1297 1298 1299 1300
/* FIXME: sc->sc_full_reset ? */
static void ath9k_configure_filter(struct ieee80211_hw *hw,
				   unsigned int changed_flags,
				   unsigned int *total_flags,
1301
				   u64 multicast)
1302
{
1303
	struct ath_softc *sc = hw->priv;
1304
	u32 rfilt;
1305

1306 1307
	changed_flags &= SUPPORTED_FILTERS;
	*total_flags &= SUPPORTED_FILTERS;
1308

S
Sujith 已提交
1309
	sc->rx.rxfilter = *total_flags;
1310
	ath9k_ps_wakeup(sc);
1311 1312
	rfilt = ath_calcrxfilter(sc);
	ath9k_hw_setrxfilter(sc->sc_ah, rfilt);
1313
	ath9k_ps_restore(sc);
1314

1315 1316
	ath_dbg(ath9k_hw_common(sc->sc_ah), CONFIG, "Set HW RX filter: 0x%x\n",
		rfilt);
1317
}
1318

1319 1320 1321
static int ath9k_sta_add(struct ieee80211_hw *hw,
			 struct ieee80211_vif *vif,
			 struct ieee80211_sta *sta)
1322
{
1323
	struct ath_softc *sc = hw->priv;
1324 1325 1326
	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 = { };
1327

1328
	ath_node_attach(sc, sta, vif);
1329 1330 1331 1332 1333

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

1334
	an->ps_key = ath_key_config(common, vif, sta, &ps_key);
1335 1336 1337 1338

	return 0;
}

1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352
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);
}

1353 1354 1355 1356
static int ath9k_sta_remove(struct ieee80211_hw *hw,
			    struct ieee80211_vif *vif,
			    struct ieee80211_sta *sta)
{
1357
	struct ath_softc *sc = hw->priv;
1358

1359
	ath9k_del_ps_key(sc, vif, sta);
1360 1361 1362
	ath_node_detach(sc, sta);

	return 0;
1363 1364
}

1365 1366 1367 1368 1369 1370 1371 1372
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;

1373
	if (!sta->ht_cap.ht_supported)
1374 1375
		return;

1376 1377 1378
	switch (cmd) {
	case STA_NOTIFY_SLEEP:
		an->sleeping = true;
1379
		ath_tx_aggr_sleep(sta, sc, an);
1380 1381 1382 1383 1384 1385 1386 1387
		break;
	case STA_NOTIFY_AWAKE:
		an->sleeping = false;
		ath_tx_aggr_wakeup(sc, an);
		break;
	}
}

1388 1389
static int ath9k_conf_tx(struct ieee80211_hw *hw,
			 struct ieee80211_vif *vif, u16 queue,
1390
			 const struct ieee80211_tx_queue_params *params)
1391
{
1392
	struct ath_softc *sc = hw->priv;
1393
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1394
	struct ath_txq *txq;
1395
	struct ath9k_tx_queue_info qi;
1396
	int ret = 0;
1397

1398 1399
	if (queue >= WME_NUM_AC)
		return 0;
1400

1401 1402
	txq = sc->tx.txq_map[queue];

1403
	ath9k_ps_wakeup(sc);
1404 1405
	mutex_lock(&sc->mutex);

1406 1407
	memset(&qi, 0, sizeof(struct ath9k_tx_queue_info));

1408 1409 1410 1411
	qi.tqi_aifs = params->aifs;
	qi.tqi_cwmin = params->cw_min;
	qi.tqi_cwmax = params->cw_max;
	qi.tqi_burstTime = params->txop;
1412

1413
	ath_dbg(common, CONFIG,
J
Joe Perches 已提交
1414 1415 1416
		"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);
1417

1418
	ret = ath_txq_update(sc, txq->axq_qnum, &qi);
1419
	if (ret)
1420
		ath_err(common, "TXQ Update failed\n");
1421

1422
	if (sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC)
1423
		if (queue == WME_AC_BE && !ret)
1424 1425
			ath_beaconq_config(sc);

1426
	mutex_unlock(&sc->mutex);
1427
	ath9k_ps_restore(sc);
1428

1429 1430
	return ret;
}
1431

1432 1433
static int ath9k_set_key(struct ieee80211_hw *hw,
			 enum set_key_cmd cmd,
1434 1435
			 struct ieee80211_vif *vif,
			 struct ieee80211_sta *sta,
1436 1437
			 struct ieee80211_key_conf *key)
{
1438
	struct ath_softc *sc = hw->priv;
1439
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1440
	int ret = 0;
1441

1442
	if (ath9k_modparam_nohwcrypt)
1443 1444
		return -ENOSPC;

C
Chun-Yeow Yeoh 已提交
1445 1446
	if ((vif->type == NL80211_IFTYPE_ADHOC ||
	     vif->type == NL80211_IFTYPE_MESH_POINT) &&
J
Jouni Malinen 已提交
1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459
	    (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;
	}

1460
	mutex_lock(&sc->mutex);
1461
	ath9k_ps_wakeup(sc);
1462
	ath_dbg(common, CONFIG, "Set HW Key\n");
1463

1464 1465
	switch (cmd) {
	case SET_KEY:
1466 1467 1468
		if (sta)
			ath9k_del_ps_key(sc, vif, sta);

1469
		ret = ath_key_config(common, vif, sta, key);
1470 1471
		if (ret >= 0) {
			key->hw_key_idx = ret;
1472 1473
			/* push IV and Michael MIC generation to stack */
			key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1474
			if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
1475
				key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
1476 1477
			if (sc->sc_ah->sw_mgmt_crypto &&
			    key->cipher == WLAN_CIPHER_SUITE_CCMP)
1478
				key->flags |= IEEE80211_KEY_FLAG_SW_MGMT;
1479
			ret = 0;
1480 1481 1482
		}
		break;
	case DISABLE_KEY:
1483
		ath_key_delete(common, key);
1484 1485 1486 1487
		break;
	default:
		ret = -EINVAL;
	}
1488

1489
	ath9k_ps_restore(sc);
1490 1491
	mutex_unlock(&sc->mutex);

1492 1493
	return ret;
}
1494 1495 1496 1497 1498 1499
static void ath9k_bss_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
{
	struct ath_softc *sc = data;
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
	struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
	struct ath_vif *avp = (void *)vif->drv_priv;
S
Sujith Manoharan 已提交
1500
	unsigned long flags;
1501 1502 1503 1504
	/*
	 * Skip iteration if primary station vif's bss info
	 * was not changed
	 */
S
Sujith Manoharan 已提交
1505
	if (test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags))
1506 1507 1508
		return;

	if (bss_conf->assoc) {
S
Sujith Manoharan 已提交
1509
		set_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags);
1510
		avp->primary_sta_vif = true;
1511 1512 1513
		memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
		common->curaid = bss_conf->aid;
		ath9k_hw_write_associd(sc->sc_ah);
1514 1515
		ath_dbg(common, CONFIG, "Bss Info ASSOC %d, bssid: %pM\n",
			bss_conf->aid, common->curbssid);
1516 1517 1518 1519 1520 1521
		ath_beacon_config(sc, vif);
		/*
		 * 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 Manoharan 已提交
1522
		spin_lock_irqsave(&sc->sc_pm_lock, flags);
1523
		sc->ps_flags |= PS_BEACON_SYNC | PS_WAIT_FOR_BEACON;
S
Sujith Manoharan 已提交
1524 1525
		spin_unlock_irqrestore(&sc->sc_pm_lock, flags);

1526 1527 1528
		/* Reset rssi stats */
		sc->last_rssi = ATH_RSSI_DUMMY_MARKER;
		sc->sc_ah->stats.avgbrssi = ATH_RSSI_DUMMY_MARKER;
1529

1530 1531
		ath_start_rx_poll(sc, 3);

1532
		if (!common->disable_ani) {
S
Sujith Manoharan 已提交
1533
			set_bit(SC_OP_ANI_RUN, &sc->sc_flags);
1534 1535 1536
			ath_start_ani(common);
		}

1537 1538 1539 1540 1541 1542 1543 1544 1545
	}
}

static void ath9k_config_bss(struct ath_softc *sc, struct ieee80211_vif *vif)
{
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
	struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
	struct ath_vif *avp = (void *)vif->drv_priv;

1546 1547 1548
	if (sc->sc_ah->opmode != NL80211_IFTYPE_STATION)
		return;

1549 1550
	/* Reconfigure bss info */
	if (avp->primary_sta_vif && !bss_conf->assoc) {
1551
		ath_dbg(common, CONFIG, "Bss Info DISASSOC %d, bssid %pM\n",
1552
			common->curaid, common->curbssid);
S
Sujith Manoharan 已提交
1553 1554
		clear_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags);
		clear_bit(SC_OP_BEACONS, &sc->sc_flags);
1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566
		avp->primary_sta_vif = false;
		memset(common->curbssid, 0, ETH_ALEN);
		common->curaid = 0;
	}

	ieee80211_iterate_active_interfaces_atomic(
			sc->hw, ath9k_bss_iter, sc);

	/*
	 * None of station vifs are associated.
	 * Clear bssid & aid
	 */
S
Sujith Manoharan 已提交
1567
	if (!test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) {
1568
		ath9k_hw_write_associd(sc->sc_ah);
S
Sujith Manoharan 已提交
1569
		clear_bit(SC_OP_ANI_RUN, &sc->sc_flags);
1570
		del_timer_sync(&common->ani.timer);
1571
		del_timer_sync(&sc->rx_poll_timer);
1572
		memset(&sc->caldata, 0, sizeof(sc->caldata));
1573
	}
1574
}
1575

1576 1577 1578 1579 1580
static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
				   struct ieee80211_vif *vif,
				   struct ieee80211_bss_conf *bss_conf,
				   u32 changed)
{
1581
	struct ath_softc *sc = hw->priv;
1582
	struct ath_hw *ah = sc->sc_ah;
1583
	struct ath_common *common = ath9k_hw_common(ah);
1584
	struct ath_vif *avp = (void *)vif->drv_priv;
1585
	int slottime;
1586

1587
	ath9k_ps_wakeup(sc);
1588 1589
	mutex_lock(&sc->mutex);

1590
	if (changed & BSS_CHANGED_ASSOC) {
1591
		ath9k_config_bss(sc, vif);
1592

1593
		ath_dbg(common, CONFIG, "BSSID: %pM aid: 0x%x\n",
J
Joe Perches 已提交
1594
			common->curbssid, common->curaid);
S
Sujith 已提交
1595
	}
1596

1597 1598 1599 1600 1601 1602 1603 1604
	if (changed & BSS_CHANGED_IBSS) {
		/* There can be only one vif available */
		memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
		common->curaid = bss_conf->aid;
		ath9k_hw_write_associd(sc->sc_ah);

		if (bss_conf->ibss_joined) {
			sc->sc_ah->stats.avgbrssi = ATH_RSSI_DUMMY_MARKER;
1605 1606

			if (!common->disable_ani) {
S
Sujith Manoharan 已提交
1607
				set_bit(SC_OP_ANI_RUN, &sc->sc_flags);
1608 1609 1610
				ath_start_ani(common);
			}

1611
		} else {
S
Sujith Manoharan 已提交
1612
			clear_bit(SC_OP_ANI_RUN, &sc->sc_flags);
1613
			del_timer_sync(&common->ani.timer);
1614
			del_timer_sync(&sc->rx_poll_timer);
1615 1616 1617
		}
	}

1618 1619 1620 1621 1622 1623
	/*
	 * In case of AP mode, the HW TSF has to be reset
	 * when the beacon interval changes.
	 */
	if ((changed & BSS_CHANGED_BEACON_INT) &&
	    (vif->type == NL80211_IFTYPE_AP))
S
Sujith Manoharan 已提交
1624
		set_bit(SC_OP_TSF_RESET, &sc->sc_flags);
1625 1626 1627 1628 1629 1630

	/* Configure beaconing (AP, IBSS, MESH) */
	if (ath9k_uses_beacons(vif->type) &&
	    ((changed & BSS_CHANGED_BEACON) ||
	     (changed & BSS_CHANGED_BEACON_ENABLED) ||
	     (changed & BSS_CHANGED_BEACON_INT))) {
1631
		ath9k_set_beaconing_status(sc, false);
1632 1633 1634 1635 1636
		if (bss_conf->enable_beacon)
			ath_beacon_alloc(sc, vif);
		else
			avp->is_bslot_active = false;
		ath_beacon_config(sc, vif);
1637
		ath9k_set_beaconing_status(sc, true);
1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656
	}

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

1659
	mutex_unlock(&sc->mutex);
1660
	ath9k_ps_restore(sc);
1661
}
1662

1663
static u64 ath9k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
1664
{
1665
	struct ath_softc *sc = hw->priv;
1666
	u64 tsf;
1667

1668
	mutex_lock(&sc->mutex);
1669
	ath9k_ps_wakeup(sc);
1670
	tsf = ath9k_hw_gettsf64(sc->sc_ah);
1671
	ath9k_ps_restore(sc);
1672
	mutex_unlock(&sc->mutex);
1673

1674 1675
	return tsf;
}
1676

1677 1678 1679
static void ath9k_set_tsf(struct ieee80211_hw *hw,
			  struct ieee80211_vif *vif,
			  u64 tsf)
1680
{
1681
	struct ath_softc *sc = hw->priv;
1682

1683
	mutex_lock(&sc->mutex);
1684
	ath9k_ps_wakeup(sc);
1685
	ath9k_hw_settsf64(sc->sc_ah, tsf);
1686
	ath9k_ps_restore(sc);
1687
	mutex_unlock(&sc->mutex);
1688 1689
}

1690
static void ath9k_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
1691
{
1692
	struct ath_softc *sc = hw->priv;
1693

1694
	mutex_lock(&sc->mutex);
1695 1696

	ath9k_ps_wakeup(sc);
1697
	ath9k_hw_reset_tsf(sc->sc_ah);
1698 1699
	ath9k_ps_restore(sc);

1700
	mutex_unlock(&sc->mutex);
1701
}
1702

1703
static int ath9k_ampdu_action(struct ieee80211_hw *hw,
1704
			      struct ieee80211_vif *vif,
1705 1706
			      enum ieee80211_ampdu_mlme_action action,
			      struct ieee80211_sta *sta,
1707
			      u16 tid, u16 *ssn, u8 buf_size)
1708
{
1709
	struct ath_softc *sc = hw->priv;
1710
	int ret = 0;
1711

1712 1713
	local_bh_disable();

1714 1715 1716 1717 1718 1719
	switch (action) {
	case IEEE80211_AMPDU_RX_START:
		break;
	case IEEE80211_AMPDU_RX_STOP:
		break;
	case IEEE80211_AMPDU_TX_START:
1720
		ath9k_ps_wakeup(sc);
1721 1722 1723
		ret = ath_tx_aggr_start(sc, sta, tid, ssn);
		if (!ret)
			ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1724
		ath9k_ps_restore(sc);
1725 1726
		break;
	case IEEE80211_AMPDU_TX_STOP:
1727
		ath9k_ps_wakeup(sc);
S
Sujith 已提交
1728
		ath_tx_aggr_stop(sc, sta, tid);
1729
		ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1730
		ath9k_ps_restore(sc);
1731
		break;
1732
	case IEEE80211_AMPDU_TX_OPERATIONAL:
1733
		ath9k_ps_wakeup(sc);
1734
		ath_tx_aggr_resume(sc, sta, tid);
1735
		ath9k_ps_restore(sc);
1736
		break;
1737
	default:
1738
		ath_err(ath9k_hw_common(sc->sc_ah), "Unknown AMPDU action\n");
1739 1740
	}

1741 1742
	local_bh_enable();

1743
	return ret;
1744 1745
}

1746 1747 1748
static int ath9k_get_survey(struct ieee80211_hw *hw, int idx,
			     struct survey_info *survey)
{
1749
	struct ath_softc *sc = hw->priv;
1750
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1751
	struct ieee80211_supported_band *sband;
1752 1753 1754 1755 1756 1757 1758
	struct ieee80211_channel *chan;
	unsigned long flags;
	int pos;

	spin_lock_irqsave(&common->cc_lock, flags);
	if (idx == 0)
		ath_update_survey_stats(sc);
1759 1760 1761 1762 1763 1764

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

1766 1767
	if (!sband)
		sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
1768

1769 1770 1771
	if (!sband || idx >= sband->n_channels) {
		spin_unlock_irqrestore(&common->cc_lock, flags);
		return -ENOENT;
1772
	}
1773

1774 1775 1776 1777 1778 1779
	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);

1780 1781 1782
	return 0;
}

1783 1784
static void ath9k_set_coverage_class(struct ieee80211_hw *hw, u8 coverage_class)
{
1785
	struct ath_softc *sc = hw->priv;
1786 1787 1788 1789
	struct ath_hw *ah = sc->sc_ah;

	mutex_lock(&sc->mutex);
	ah->coverage_class = coverage_class;
1790 1791

	ath9k_ps_wakeup(sc);
1792
	ath9k_hw_init_global_settings(ah);
1793 1794
	ath9k_ps_restore(sc);

1795 1796 1797
	mutex_unlock(&sc->mutex);
}

1798 1799 1800
static void ath9k_flush(struct ieee80211_hw *hw, bool drop)
{
	struct ath_softc *sc = hw->priv;
1801 1802
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
1803 1804
	int timeout = 200; /* ms */
	int i, j;
1805
	bool drain_txq;
1806 1807 1808 1809

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

1810
	if (ah->ah_flags & AH_UNPLUGGED) {
1811
		ath_dbg(common, ANY, "Device has been unplugged!\n");
1812 1813 1814 1815
		mutex_unlock(&sc->mutex);
		return;
	}

S
Sujith Manoharan 已提交
1816
	if (test_bit(SC_OP_INVALID, &sc->sc_flags)) {
1817
		ath_dbg(common, ANY, "Device not present\n");
1818 1819 1820 1821
		mutex_unlock(&sc->mutex);
		return;
	}

1822
	for (j = 0; j < timeout; j++) {
1823
		bool npend = false;
1824 1825 1826

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

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

1832 1833 1834 1835
			npend = ath9k_has_pending_frames(sc, &sc->tx.txq[i]);

			if (npend)
				break;
1836
		}
1837 1838

		if (!npend)
1839
		    break;
1840 1841
	}

1842 1843 1844 1845 1846
	if (drop) {
		ath9k_ps_wakeup(sc);
		spin_lock_bh(&sc->sc_pcu_lock);
		drain_txq = ath_drain_all_txq(sc, false);
		spin_unlock_bh(&sc->sc_pcu_lock);
1847

1848 1849
		if (!drain_txq)
			ath_reset(sc, false);
1850

1851 1852 1853
		ath9k_ps_restore(sc);
		ieee80211_wake_queues(hw);
	}
1854

1855 1856 1857 1858
	ieee80211_queue_delayed_work(hw, &sc->tx_complete_work, 0);
	mutex_unlock(&sc->mutex);
}

1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873
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;
}

1874
static int ath9k_tx_last_beacon(struct ieee80211_hw *hw)
1875 1876 1877 1878 1879 1880 1881
{
	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;
1882
	bool edma = !!(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA);
1883 1884 1885 1886 1887 1888 1889 1890 1891 1892
	int status;

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

	avp = (void *)vif->drv_priv;
	if (!avp->is_bslot_active)
		return 0;

1893
	if (!sc->beacon.tx_processed && !edma) {
1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913
		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;
}

1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927
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;
}

1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980
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;
}

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;

	if (!rx_ant || !tx_ant)
		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;
}

1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 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 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108
#ifdef CONFIG_ATH9K_DEBUGFS

/* Ethtool support for get-stats */

#define AMKSTR(nm) #nm "_BE", #nm "_BK", #nm "_VI", #nm "_VO"
static const char ath9k_gstrings_stats[][ETH_GSTRING_LEN] = {
	"tx_pkts_nic",
	"tx_bytes_nic",
	"rx_pkts_nic",
	"rx_bytes_nic",
	AMKSTR(d_tx_pkts),
	AMKSTR(d_tx_bytes),
	AMKSTR(d_tx_mpdus_queued),
	AMKSTR(d_tx_mpdus_completed),
	AMKSTR(d_tx_mpdu_xretries),
	AMKSTR(d_tx_aggregates),
	AMKSTR(d_tx_ampdus_queued_hw),
	AMKSTR(d_tx_ampdus_queued_sw),
	AMKSTR(d_tx_ampdus_completed),
	AMKSTR(d_tx_ampdu_retries),
	AMKSTR(d_tx_ampdu_xretries),
	AMKSTR(d_tx_fifo_underrun),
	AMKSTR(d_tx_op_exceeded),
	AMKSTR(d_tx_timer_expiry),
	AMKSTR(d_tx_desc_cfg_err),
	AMKSTR(d_tx_data_underrun),
	AMKSTR(d_tx_delim_underrun),

	"d_rx_decrypt_crc_err",
	"d_rx_phy_err",
	"d_rx_mic_err",
	"d_rx_pre_delim_crc_err",
	"d_rx_post_delim_crc_err",
	"d_rx_decrypt_busy_err",

	"d_rx_phyerr_radar",
	"d_rx_phyerr_ofdm_timing",
	"d_rx_phyerr_cck_timing",

};
#define ATH9K_SSTATS_LEN ARRAY_SIZE(ath9k_gstrings_stats)

static void ath9k_get_et_strings(struct ieee80211_hw *hw,
				 struct ieee80211_vif *vif,
				 u32 sset, u8 *data)
{
	if (sset == ETH_SS_STATS)
		memcpy(data, *ath9k_gstrings_stats,
		       sizeof(ath9k_gstrings_stats));
}

static int ath9k_get_et_sset_count(struct ieee80211_hw *hw,
				   struct ieee80211_vif *vif, int sset)
{
	if (sset == ETH_SS_STATS)
		return ATH9K_SSTATS_LEN;
	return 0;
}

#define PR_QNUM(_n) (sc->tx.txq_map[_n]->axq_qnum)
#define AWDATA(elem)							\
	do {								\
		data[i++] = sc->debug.stats.txstats[PR_QNUM(WME_AC_BE)].elem; \
		data[i++] = sc->debug.stats.txstats[PR_QNUM(WME_AC_BK)].elem; \
		data[i++] = sc->debug.stats.txstats[PR_QNUM(WME_AC_VI)].elem; \
		data[i++] = sc->debug.stats.txstats[PR_QNUM(WME_AC_VO)].elem; \
	} while (0)

#define AWDATA_RX(elem)						\
	do {							\
		data[i++] = sc->debug.stats.rxstats.elem;	\
	} while (0)

static void ath9k_get_et_stats(struct ieee80211_hw *hw,
			       struct ieee80211_vif *vif,
			       struct ethtool_stats *stats, u64 *data)
{
	struct ath_softc *sc = hw->priv;
	int i = 0;

	data[i++] = (sc->debug.stats.txstats[PR_QNUM(WME_AC_BE)].tx_pkts_all +
		     sc->debug.stats.txstats[PR_QNUM(WME_AC_BK)].tx_pkts_all +
		     sc->debug.stats.txstats[PR_QNUM(WME_AC_VI)].tx_pkts_all +
		     sc->debug.stats.txstats[PR_QNUM(WME_AC_VO)].tx_pkts_all);
	data[i++] = (sc->debug.stats.txstats[PR_QNUM(WME_AC_BE)].tx_bytes_all +
		     sc->debug.stats.txstats[PR_QNUM(WME_AC_BK)].tx_bytes_all +
		     sc->debug.stats.txstats[PR_QNUM(WME_AC_VI)].tx_bytes_all +
		     sc->debug.stats.txstats[PR_QNUM(WME_AC_VO)].tx_bytes_all);
	AWDATA_RX(rx_pkts_all);
	AWDATA_RX(rx_bytes_all);

	AWDATA(tx_pkts_all);
	AWDATA(tx_bytes_all);
	AWDATA(queued);
	AWDATA(completed);
	AWDATA(xretries);
	AWDATA(a_aggr);
	AWDATA(a_queued_hw);
	AWDATA(a_queued_sw);
	AWDATA(a_completed);
	AWDATA(a_retries);
	AWDATA(a_xretries);
	AWDATA(fifo_underrun);
	AWDATA(xtxop);
	AWDATA(timer_exp);
	AWDATA(desc_cfg_err);
	AWDATA(data_underrun);
	AWDATA(delim_underrun);

	AWDATA_RX(decrypt_crc_err);
	AWDATA_RX(phy_err);
	AWDATA_RX(mic_err);
	AWDATA_RX(pre_delim_crc_err);
	AWDATA_RX(post_delim_crc_err);
	AWDATA_RX(decrypt_busy_err);

	AWDATA_RX(phy_err_stats[ATH9K_PHYERR_RADAR]);
	AWDATA_RX(phy_err_stats[ATH9K_PHYERR_OFDM_TIMING]);
	AWDATA_RX(phy_err_stats[ATH9K_PHYERR_CCK_TIMING]);

	WARN_ON(i != ATH9K_SSTATS_LEN);
}

/* End of ethtool get-stats functions */

#endif


2109
struct ieee80211_ops ath9k_ops = {
2110 2111 2112 2113
	.tx 		    = ath9k_tx,
	.start 		    = ath9k_start,
	.stop 		    = ath9k_stop,
	.add_interface 	    = ath9k_add_interface,
2114
	.change_interface   = ath9k_change_interface,
2115 2116 2117
	.remove_interface   = ath9k_remove_interface,
	.config 	    = ath9k_config,
	.configure_filter   = ath9k_configure_filter,
2118 2119
	.sta_add	    = ath9k_sta_add,
	.sta_remove	    = ath9k_sta_remove,
2120
	.sta_notify         = ath9k_sta_notify,
2121 2122 2123 2124
	.conf_tx 	    = ath9k_conf_tx,
	.bss_info_changed   = ath9k_bss_info_changed,
	.set_key            = ath9k_set_key,
	.get_tsf 	    = ath9k_get_tsf,
2125
	.set_tsf 	    = ath9k_set_tsf,
2126
	.reset_tsf 	    = ath9k_reset_tsf,
2127
	.ampdu_action       = ath9k_ampdu_action,
2128
	.get_survey	    = ath9k_get_survey,
J
Johannes Berg 已提交
2129
	.rfkill_poll        = ath9k_rfkill_poll_state,
2130
	.set_coverage_class = ath9k_set_coverage_class,
2131
	.flush		    = ath9k_flush,
2132
	.tx_frames_pending  = ath9k_tx_frames_pending,
2133 2134
	.tx_last_beacon     = ath9k_tx_last_beacon,
	.get_stats	    = ath9k_get_stats,
2135 2136
	.set_antenna	    = ath9k_set_antenna,
	.get_antenna	    = ath9k_get_antenna,
2137 2138 2139 2140 2141 2142

#ifdef CONFIG_ATH9K_DEBUGFS
	.get_et_sset_count  = ath9k_get_et_sset_count,
	.get_et_stats  = ath9k_get_et_stats,
	.get_et_strings  = ath9k_get_et_strings,
#endif
2143
};