xmit.c 63.6 KB
Newer Older
1
/*
2
 * Copyright (c) 2008-2009 Atheros Communications Inc.
3 4 5 6 7 8 9 10 11 12 13 14 15 16
 *
 * 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.
 */

S
Sujith 已提交
17
#include "ath9k.h"
18
#include "ar9003_mac.h"
19 20 21

#define BITS_PER_BYTE           8
#define OFDM_PLCP_BITS          22
22
#define HT_RC_2_MCS(_rc)        ((_rc) & 0x1f)
23 24 25 26 27 28 29 30 31 32 33 34 35 36
#define HT_RC_2_STREAMS(_rc)    ((((_rc) & 0x78) >> 3) + 1)
#define L_STF                   8
#define L_LTF                   8
#define L_SIG                   4
#define HT_SIG                  8
#define HT_STF                  4
#define HT_LTF(_ns)             (4 * (_ns))
#define SYMBOL_TIME(_ns)        ((_ns) << 2) /* ns * 4 us */
#define SYMBOL_TIME_HALFGI(_ns) (((_ns) * 18 + 4) / 5)  /* ns * 3.6 us */
#define NUM_SYMBOLS_PER_USEC(_usec) (_usec >> 2)
#define NUM_SYMBOLS_PER_USEC_HALFGI(_usec) (((_usec*5)-4)/18)

#define OFDM_SIFS_TIME    	    16

37
static u16 bits_per_symbol[][2] = {
38 39 40 41 42 43 44 45 46 47 48 49 50
	/* 20MHz 40MHz */
	{    26,   54 },     /*  0: BPSK */
	{    52,  108 },     /*  1: QPSK 1/2 */
	{    78,  162 },     /*  2: QPSK 3/4 */
	{   104,  216 },     /*  3: 16-QAM 1/2 */
	{   156,  324 },     /*  4: 16-QAM 3/4 */
	{   208,  432 },     /*  5: 64-QAM 2/3 */
	{   234,  486 },     /*  6: 64-QAM 3/4 */
	{   260,  540 },     /*  7: 64-QAM 5/6 */
};

#define IS_HT_RATE(_rate)     ((_rate) & 0x80)

S
Sujith 已提交
51 52 53
static void ath_tx_send_ht_normal(struct ath_softc *sc, struct ath_txq *txq,
				  struct ath_atx_tid *tid,
				  struct list_head *bf_head);
S
Sujith 已提交
54
static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf,
55 56
				struct ath_txq *txq, struct list_head *bf_q,
				struct ath_tx_status *ts, int txok, int sendbar);
57
static void ath_tx_txqaddbuf(struct ath_softc *sc, struct ath_txq *txq,
S
Sujith 已提交
58 59
			     struct list_head *head);
static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf);
60
static int ath_tx_num_badfrms(struct ath_softc *sc, struct ath_buf *bf,
61 62
			      struct ath_tx_status *ts, int txok);
static void ath_tx_rc_status(struct ath_buf *bf, struct ath_tx_status *ts,
63
			     int nbad, int txok, bool update_rc);
64

65
enum {
66 67
	MCS_HT20,
	MCS_HT20_SGI,
68 69 70 71
	MCS_HT40,
	MCS_HT40_SGI,
};

72 73 74 75 76 77 78 79 80 81 82 83
static int ath_max_4ms_framelen[4][32] = {
	[MCS_HT20] = {
		3212,  6432,  9648,  12864,  19300,  25736,  28952,  32172,
		6424,  12852, 19280, 25708,  38568,  51424,  57852,  64280,
		9628,  19260, 28896, 38528,  57792,  65532,  65532,  65532,
		12828, 25656, 38488, 51320,  65532,  65532,  65532,  65532,
	},
	[MCS_HT20_SGI] = {
		3572,  7144,  10720,  14296,  21444,  28596,  32172,  35744,
		7140,  14284, 21428,  28568,  42856,  57144,  64288,  65532,
		10700, 21408, 32112,  42816,  64228,  65532,  65532,  65532,
		14256, 28516, 42780,  57040,  65532,  65532,  65532,  65532,
84 85
	},
	[MCS_HT40] = {
86 87 88 89
		6680,  13360,  20044,  26724,  40092,  53456,  60140,  65532,
		13348, 26700,  40052,  53400,  65532,  65532,  65532,  65532,
		20004, 40008,  60016,  65532,  65532,  65532,  65532,  65532,
		26644, 53292,  65532,  65532,  65532,  65532,  65532,  65532,
90 91
	},
	[MCS_HT40_SGI] = {
92 93 94 95
		7420,  14844,  22272,  29696,  44544,  59396,  65532,  65532,
		14832, 29668,  44504,  59340,  65532,  65532,  65532,  65532,
		22232, 44464,  65532,  65532,  65532,  65532,  65532,  65532,
		29616, 59232,  65532,  65532,  65532,  65532,  65532,  65532,
96 97 98
	}
};

S
Sujith 已提交
99 100 101
/*********************/
/* Aggregation logic */
/*********************/
102

S
Sujith 已提交
103
static void ath_tx_queue_tid(struct ath_txq *txq, struct ath_atx_tid *tid)
S
Sujith 已提交
104
{
S
Sujith 已提交
105
	struct ath_atx_ac *ac = tid->ac;
S
Sujith 已提交
106

S
Sujith 已提交
107 108
	if (tid->paused)
		return;
S
Sujith 已提交
109

S
Sujith 已提交
110 111
	if (tid->sched)
		return;
S
Sujith 已提交
112

S
Sujith 已提交
113 114
	tid->sched = true;
	list_add_tail(&tid->list, &ac->tid_q);
S
Sujith 已提交
115

S
Sujith 已提交
116 117
	if (ac->sched)
		return;
118

S
Sujith 已提交
119 120 121
	ac->sched = true;
	list_add_tail(&ac->list, &txq->axq_acq);
}
122

S
Sujith 已提交
123 124 125
static void ath_tx_pause_tid(struct ath_softc *sc, struct ath_atx_tid *tid)
{
	struct ath_txq *txq = &sc->tx.txq[tid->ac->qnum];
126

S
Sujith 已提交
127 128 129
	spin_lock_bh(&txq->axq_lock);
	tid->paused++;
	spin_unlock_bh(&txq->axq_lock);
130 131
}

S
Sujith 已提交
132
static void ath_tx_resume_tid(struct ath_softc *sc, struct ath_atx_tid *tid)
133
{
S
Sujith 已提交
134
	struct ath_txq *txq = &sc->tx.txq[tid->ac->qnum];
135

136
	BUG_ON(tid->paused <= 0);
S
Sujith 已提交
137
	spin_lock_bh(&txq->axq_lock);
138

S
Sujith 已提交
139
	tid->paused--;
140

S
Sujith 已提交
141 142
	if (tid->paused > 0)
		goto unlock;
143

S
Sujith 已提交
144 145
	if (list_empty(&tid->buf_q))
		goto unlock;
146

S
Sujith 已提交
147 148 149 150
	ath_tx_queue_tid(txq, tid);
	ath_txq_schedule(sc, txq);
unlock:
	spin_unlock_bh(&txq->axq_lock);
S
Sujith 已提交
151
}
152

S
Sujith 已提交
153
static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid)
S
Sujith 已提交
154
{
S
Sujith 已提交
155 156 157 158
	struct ath_txq *txq = &sc->tx.txq[tid->ac->qnum];
	struct ath_buf *bf;
	struct list_head bf_head;
	INIT_LIST_HEAD(&bf_head);
159

160
	BUG_ON(tid->paused <= 0);
S
Sujith 已提交
161
	spin_lock_bh(&txq->axq_lock);
162

S
Sujith 已提交
163
	tid->paused--;
164

S
Sujith 已提交
165 166 167 168
	if (tid->paused > 0) {
		spin_unlock_bh(&txq->axq_lock);
		return;
	}
169

S
Sujith 已提交
170 171
	while (!list_empty(&tid->buf_q)) {
		bf = list_first_entry(&tid->buf_q, struct ath_buf, list);
172
		BUG_ON(bf_isretried(bf));
S
Sujith 已提交
173
		list_move_tail(&bf->list, &bf_head);
S
Sujith 已提交
174
		ath_tx_send_ht_normal(sc, txq, tid, &bf_head);
S
Sujith 已提交
175
	}
176

S
Sujith 已提交
177
	spin_unlock_bh(&txq->axq_lock);
S
Sujith 已提交
178
}
179

S
Sujith 已提交
180 181
static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid,
			      int seqno)
S
Sujith 已提交
182
{
S
Sujith 已提交
183
	int index, cindex;
184

S
Sujith 已提交
185 186
	index  = ATH_BA_INDEX(tid->seq_start, seqno);
	cindex = (tid->baw_head + index) & (ATH_TID_MAX_BUFS - 1);
187

S
Sujith 已提交
188
	tid->tx_buf[cindex] = NULL;
S
Sujith 已提交
189

S
Sujith 已提交
190 191 192 193
	while (tid->baw_head != tid->baw_tail && !tid->tx_buf[tid->baw_head]) {
		INCR(tid->seq_start, IEEE80211_SEQ_MAX);
		INCR(tid->baw_head, ATH_TID_MAX_BUFS);
	}
S
Sujith 已提交
194
}
195

S
Sujith 已提交
196 197
static void ath_tx_addto_baw(struct ath_softc *sc, struct ath_atx_tid *tid,
			     struct ath_buf *bf)
S
Sujith 已提交
198
{
S
Sujith 已提交
199
	int index, cindex;
S
Sujith 已提交
200

S
Sujith 已提交
201 202
	if (bf_isretried(bf))
		return;
S
Sujith 已提交
203

S
Sujith 已提交
204 205
	index  = ATH_BA_INDEX(tid->seq_start, bf->bf_seqno);
	cindex = (tid->baw_head + index) & (ATH_TID_MAX_BUFS - 1);
206

207
	BUG_ON(tid->tx_buf[cindex] != NULL);
S
Sujith 已提交
208
	tid->tx_buf[cindex] = bf;
209

S
Sujith 已提交
210 211 212 213
	if (index >= ((tid->baw_tail - tid->baw_head) &
		(ATH_TID_MAX_BUFS - 1))) {
		tid->baw_tail = cindex;
		INCR(tid->baw_tail, ATH_TID_MAX_BUFS);
214 215 216 217
	}
}

/*
S
Sujith 已提交
218 219 220 221
 * TODO: For frame(s) that are in the retry state, we will reuse the
 * sequence number(s) without setting the retry bit. The
 * alternative is to give up on these and BAR the receiver's window
 * forward.
222
 */
S
Sujith 已提交
223 224
static void ath_tid_drain(struct ath_softc *sc, struct ath_txq *txq,
			  struct ath_atx_tid *tid)
225 226

{
S
Sujith 已提交
227 228
	struct ath_buf *bf;
	struct list_head bf_head;
229 230 231
	struct ath_tx_status ts;

	memset(&ts, 0, sizeof(ts));
S
Sujith 已提交
232
	INIT_LIST_HEAD(&bf_head);
233

S
Sujith 已提交
234 235 236
	for (;;) {
		if (list_empty(&tid->buf_q))
			break;
237

S
Sujith 已提交
238 239
		bf = list_first_entry(&tid->buf_q, struct ath_buf, list);
		list_move_tail(&bf->list, &bf_head);
240

S
Sujith 已提交
241 242
		if (bf_isretried(bf))
			ath_tx_update_baw(sc, tid, bf->bf_seqno);
243

S
Sujith 已提交
244
		spin_unlock(&txq->axq_lock);
245
		ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 0);
S
Sujith 已提交
246 247
		spin_lock(&txq->axq_lock);
	}
248

S
Sujith 已提交
249 250
	tid->seq_next = tid->seq_start;
	tid->baw_tail = tid->baw_head;
251 252
}

S
Sujith 已提交
253 254
static void ath_tx_set_retry(struct ath_softc *sc, struct ath_txq *txq,
			     struct ath_buf *bf)
255
{
S
Sujith 已提交
256 257
	struct sk_buff *skb;
	struct ieee80211_hdr *hdr;
258

S
Sujith 已提交
259 260
	bf->bf_state.bf_type |= BUF_RETRY;
	bf->bf_retries++;
S
Sujith 已提交
261
	TX_STAT_INC(txq->axq_qnum, a_retries);
262

S
Sujith 已提交
263 264 265
	skb = bf->bf_mpdu;
	hdr = (struct ieee80211_hdr *)skb->data;
	hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_RETRY);
266 267
}

268
static struct ath_buf *ath_tx_get_buffer(struct ath_softc *sc)
S
Sujith 已提交
269
{
270
	struct ath_buf *bf = NULL;
S
Sujith 已提交
271 272

	spin_lock_bh(&sc->tx.txbuflock);
273 274

	if (unlikely(list_empty(&sc->tx.txbuf))) {
275 276 277
		spin_unlock_bh(&sc->tx.txbuflock);
		return NULL;
	}
278 279 280 281

	bf = list_first_entry(&sc->tx.txbuf, struct ath_buf, list);
	list_del(&bf->list);

S
Sujith 已提交
282 283
	spin_unlock_bh(&sc->tx.txbuflock);

284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301
	return bf;
}

static void ath_tx_return_buffer(struct ath_softc *sc, struct ath_buf *bf)
{
	spin_lock_bh(&sc->tx.txbuflock);
	list_add_tail(&bf->list, &sc->tx.txbuf);
	spin_unlock_bh(&sc->tx.txbuflock);
}

static struct ath_buf* ath_clone_txbuf(struct ath_softc *sc, struct ath_buf *bf)
{
	struct ath_buf *tbf;

	tbf = ath_tx_get_buffer(sc);
	if (WARN_ON(!tbf))
		return NULL;

S
Sujith 已提交
302 303
	ATH_TXBUF_RESET(tbf);

F
Felix Fietkau 已提交
304
	tbf->aphy = bf->aphy;
S
Sujith 已提交
305 306
	tbf->bf_mpdu = bf->bf_mpdu;
	tbf->bf_buf_addr = bf->bf_buf_addr;
307
	memcpy(tbf->bf_desc, bf->bf_desc, sc->sc_ah->caps.tx_desc_len);
S
Sujith 已提交
308 309 310 311 312 313 314 315
	tbf->bf_state = bf->bf_state;
	tbf->bf_dmacontext = bf->bf_dmacontext;

	return tbf;
}

static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
				 struct ath_buf *bf, struct list_head *bf_q,
316
				 struct ath_tx_status *ts, int txok)
317
{
S
Sujith 已提交
318 319
	struct ath_node *an = NULL;
	struct sk_buff *skb;
320
	struct ieee80211_sta *sta;
321
	struct ieee80211_hw *hw;
322
	struct ieee80211_hdr *hdr;
323
	struct ieee80211_tx_info *tx_info;
S
Sujith 已提交
324
	struct ath_atx_tid *tid = NULL;
S
Sujith 已提交
325
	struct ath_buf *bf_next, *bf_last = bf->bf_lastbf;
S
Sujith 已提交
326
	struct list_head bf_head, bf_pending;
327
	u16 seq_st = 0, acked_cnt = 0, txfail_cnt = 0;
328
	u32 ba[WME_BA_BMP_SIZE >> 5];
329 330
	int isaggr, txfail, txpending, sendbar = 0, needreset = 0, nbad = 0;
	bool rc_update = true;
331

S
Sujith 已提交
332
	skb = bf->bf_mpdu;
333 334
	hdr = (struct ieee80211_hdr *)skb->data;

335
	tx_info = IEEE80211_SKB_CB(skb);
F
Felix Fietkau 已提交
336
	hw = bf->aphy->hw;
337

338
	rcu_read_lock();
339

340
	/* XXX: use ieee80211_find_sta! */
341
	sta = ieee80211_find_sta_by_hw(hw, hdr->addr1);
342 343 344
	if (!sta) {
		rcu_read_unlock();
		return;
345 346
	}

347 348 349
	an = (struct ath_node *)sta->drv_priv;
	tid = ATH_AN_2_TID(an, bf->bf_tidno);

S
Sujith 已提交
350
	isaggr = bf_isaggr(bf);
S
Sujith 已提交
351
	memset(ba, 0, WME_BA_BMP_SIZE >> 3);
352

S
Sujith 已提交
353
	if (isaggr && txok) {
354 355 356
		if (ts->ts_flags & ATH9K_TX_BA) {
			seq_st = ts->ts_seqnum;
			memcpy(ba, &ts->ba_low, WME_BA_BMP_SIZE >> 3);
S
Sujith 已提交
357
		} else {
S
Sujith 已提交
358 359 360 361 362 363 364
			/*
			 * AR5416 can become deaf/mute when BA
			 * issue happens. Chip needs to be reset.
			 * But AP code may have sychronization issues
			 * when perform internal reset in this routine.
			 * Only enable reset in STA mode for now.
			 */
365
			if (sc->sc_ah->opmode == NL80211_IFTYPE_STATION)
S
Sujith 已提交
366
				needreset = 1;
S
Sujith 已提交
367
		}
368 369
	}

S
Sujith 已提交
370 371
	INIT_LIST_HEAD(&bf_pending);
	INIT_LIST_HEAD(&bf_head);
372

373
	nbad = ath_tx_num_badfrms(sc, bf, ts, txok);
S
Sujith 已提交
374 375 376
	while (bf) {
		txfail = txpending = 0;
		bf_next = bf->bf_next;
377

S
Sujith 已提交
378 379 380
		if (ATH_BA_ISSET(ba, ATH_BA_INDEX(seq_st, bf->bf_seqno))) {
			/* transmit completion, subframe is
			 * acked by block ack */
381
			acked_cnt++;
S
Sujith 已提交
382 383
		} else if (!isaggr && txok) {
			/* transmit completion */
384
			acked_cnt++;
S
Sujith 已提交
385 386
		} else {
			if (!(tid->state & AGGR_CLEANUP) &&
387
			    !bf_last->bf_tx_aborted) {
S
Sujith 已提交
388
				if (bf->bf_retries < ATH_MAX_SW_RETRIES) {
S
Sujith 已提交
389
					ath_tx_set_retry(sc, txq, bf);
S
Sujith 已提交
390 391 392 393 394
					txpending = 1;
				} else {
					bf->bf_state.bf_type |= BUF_XRETRY;
					txfail = 1;
					sendbar = 1;
395
					txfail_cnt++;
S
Sujith 已提交
396 397 398 399 400 401 402 403 404
				}
			} else {
				/*
				 * cleanup in progress, just fail
				 * the un-acked sub-frames
				 */
				txfail = 1;
			}
		}
405

406 407
		if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) &&
		    bf_next == NULL) {
408 409 410 411 412 413 414 415
			/*
			 * Make sure the last desc is reclaimed if it
			 * not a holding desc.
			 */
			if (!bf_last->bf_stale)
				list_move_tail(&bf->list, &bf_head);
			else
				INIT_LIST_HEAD(&bf_head);
S
Sujith 已提交
416
		} else {
417
			BUG_ON(list_empty(bf_q));
S
Sujith 已提交
418
			list_move_tail(&bf->list, &bf_head);
S
Sujith 已提交
419
		}
420

S
Sujith 已提交
421 422 423 424 425 426 427 428
		if (!txpending) {
			/*
			 * complete the acked-ones/xretried ones; update
			 * block-ack window
			 */
			spin_lock_bh(&txq->axq_lock);
			ath_tx_update_baw(sc, tid, bf->bf_seqno);
			spin_unlock_bh(&txq->axq_lock);
429

430
			if (rc_update && (acked_cnt == 1 || txfail_cnt == 1)) {
431
				ath_tx_rc_status(bf, ts, nbad, txok, true);
432 433
				rc_update = false;
			} else {
434
				ath_tx_rc_status(bf, ts, nbad, txok, false);
435 436
			}

437 438
			ath_tx_complete_buf(sc, bf, txq, &bf_head, ts,
				!txfail, sendbar);
S
Sujith 已提交
439
		} else {
S
Sujith 已提交
440
			/* retry the un-acked ones */
441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476
			if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)) {
				if (bf->bf_next == NULL && bf_last->bf_stale) {
					struct ath_buf *tbf;

					tbf = ath_clone_txbuf(sc, bf_last);
					/*
					 * Update tx baw and complete the
					 * frame with failed status if we
					 * run out of tx buf.
					 */
					if (!tbf) {
						spin_lock_bh(&txq->axq_lock);
						ath_tx_update_baw(sc, tid,
								bf->bf_seqno);
						spin_unlock_bh(&txq->axq_lock);

						bf->bf_state.bf_type |=
							BUF_XRETRY;
						ath_tx_rc_status(bf, ts, nbad,
								0, false);
						ath_tx_complete_buf(sc, bf, txq,
								    &bf_head,
								    ts, 0, 0);
						break;
					}

					ath9k_hw_cleartxdesc(sc->sc_ah,
							     tbf->bf_desc);
					list_add_tail(&tbf->list, &bf_head);
				} else {
					/*
					 * Clear descriptor status words for
					 * software retry
					 */
					ath9k_hw_cleartxdesc(sc->sc_ah,
							     bf->bf_desc);
477
				}
S
Sujith 已提交
478 479 480 481 482 483 484 485 486 487
			}

			/*
			 * Put this buffer to the temporary pending
			 * queue to retain ordering
			 */
			list_splice_tail_init(&bf_head, &bf_pending);
		}

		bf = bf_next;
488 489
	}

S
Sujith 已提交
490 491 492 493
	if (tid->state & AGGR_CLEANUP) {
		if (tid->baw_head == tid->baw_tail) {
			tid->state &= ~AGGR_ADDBA_COMPLETE;
			tid->state &= ~AGGR_CLEANUP;
S
Sujith 已提交
494

S
Sujith 已提交
495 496
			/* send buffered frames as singles */
			ath_tx_flush_tid(sc, tid);
S
Sujith 已提交
497
		}
498
		rcu_read_unlock();
S
Sujith 已提交
499 500
		return;
	}
501

S
Sujith 已提交
502
	/* prepend un-acked frames to the beginning of the pending frame queue */
S
Sujith 已提交
503 504 505 506 507 508
	if (!list_empty(&bf_pending)) {
		spin_lock_bh(&txq->axq_lock);
		list_splice(&bf_pending, &tid->buf_q);
		ath_tx_queue_tid(txq, tid);
		spin_unlock_bh(&txq->axq_lock);
	}
509

510 511
	rcu_read_unlock();

S
Sujith 已提交
512 513 514
	if (needreset)
		ath_reset(sc, false);
}
515

S
Sujith 已提交
516 517
static u32 ath_lookup_rate(struct ath_softc *sc, struct ath_buf *bf,
			   struct ath_atx_tid *tid)
518
{
S
Sujith 已提交
519 520
	struct sk_buff *skb;
	struct ieee80211_tx_info *tx_info;
S
Sujith 已提交
521
	struct ieee80211_tx_rate *rates;
S
Sujith 已提交
522
	u32 max_4ms_framelen, frmlen;
523
	u16 aggr_limit, legacy = 0;
S
Sujith 已提交
524
	int i;
S
Sujith 已提交
525

S
Sujith 已提交
526
	skb = bf->bf_mpdu;
S
Sujith 已提交
527
	tx_info = IEEE80211_SKB_CB(skb);
S
Sujith 已提交
528
	rates = tx_info->control.rates;
S
Sujith 已提交
529

S
Sujith 已提交
530 531 532 533 534 535
	/*
	 * Find the lowest frame length among the rate series that will have a
	 * 4ms transmit duration.
	 * TODO - TXOP limit needs to be considered.
	 */
	max_4ms_framelen = ATH_AMPDU_LIMIT_MAX;
S
Sujith 已提交
536

S
Sujith 已提交
537 538
	for (i = 0; i < 4; i++) {
		if (rates[i].count) {
539 540
			int modeidx;
			if (!(rates[i].flags & IEEE80211_TX_RC_MCS)) {
S
Sujith 已提交
541 542 543 544
				legacy = 1;
				break;
			}

545
			if (rates[i].flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
546 547
				modeidx = MCS_HT40;
			else
548 549 550 551
				modeidx = MCS_HT20;

			if (rates[i].flags & IEEE80211_TX_RC_SHORT_GI)
				modeidx++;
552 553

			frmlen = ath_max_4ms_framelen[modeidx][rates[i].idx];
S
Sujith 已提交
554
			max_4ms_framelen = min(max_4ms_framelen, frmlen);
555 556
		}
	}
S
Sujith 已提交
557

558
	/*
S
Sujith 已提交
559 560 561
	 * limit aggregate size by the minimum rate if rate selected is
	 * not a probe rate, if rate selected is a probe rate then
	 * avoid aggregation of this packet.
562
	 */
S
Sujith 已提交
563 564
	if (tx_info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE || legacy)
		return 0;
565

566 567 568 569 570 571
	if (sc->sc_flags & SC_OP_BT_PRIORITY_DETECTED)
		aggr_limit = min((max_4ms_framelen * 3) / 8,
				 (u32)ATH_AMPDU_LIMIT_MAX);
	else
		aggr_limit = min(max_4ms_framelen,
				 (u32)ATH_AMPDU_LIMIT_MAX);
572

S
Sujith 已提交
573 574 575 576
	/*
	 * h/w can accept aggregates upto 16 bit lengths (65535).
	 * The IE, however can hold upto 65536, which shows up here
	 * as zero. Ignore 65536 since we  are constrained by hw.
577
	 */
578 579
	if (tid->an->maxampdu)
		aggr_limit = min(aggr_limit, tid->an->maxampdu);
580

S
Sujith 已提交
581 582
	return aggr_limit;
}
583

S
Sujith 已提交
584
/*
S
Sujith 已提交
585
 * Returns the number of delimiters to be added to
S
Sujith 已提交
586 587 588 589 590 591 592
 * meet the minimum required mpdudensity.
 */
static int ath_compute_num_delims(struct ath_softc *sc, struct ath_atx_tid *tid,
				  struct ath_buf *bf, u16 frmlen)
{
	struct sk_buff *skb = bf->bf_mpdu;
	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
593
	u32 nsymbits, nsymbols;
S
Sujith 已提交
594
	u16 minlen;
595
	u8 flags, rix;
596
	int width, streams, half_gi, ndelim, mindelim;
S
Sujith 已提交
597 598 599

	/* Select standard number of delimiters based on frame length alone */
	ndelim = ATH_AGGR_GET_NDELIM(frmlen);
600 601

	/*
S
Sujith 已提交
602 603 604 605
	 * If encryption enabled, hardware requires some more padding between
	 * subframes.
	 * TODO - this could be improved to be dependent on the rate.
	 *      The hardware can keep up at lower rates, but not higher rates
606
	 */
S
Sujith 已提交
607 608
	if (bf->bf_keytype != ATH9K_KEY_TYPE_CLEAR)
		ndelim += ATH_AGGR_ENCRYPTDELIM;
609

S
Sujith 已提交
610 611 612 613 614
	/*
	 * Convert desired mpdu density from microeconds to bytes based
	 * on highest rate in rate series (i.e. first rate) to determine
	 * required minimum length for subframe. Take into account
	 * whether high rate is 20 or 40Mhz and half or full GI.
615
	 *
S
Sujith 已提交
616 617 618
	 * If there is no mpdu density restriction, no further calculation
	 * is needed.
	 */
619 620

	if (tid->an->mpdudensity == 0)
S
Sujith 已提交
621
		return ndelim;
622

S
Sujith 已提交
623 624 625 626
	rix = tx_info->control.rates[0].idx;
	flags = tx_info->control.rates[0].flags;
	width = (flags & IEEE80211_TX_RC_40_MHZ_WIDTH) ? 1 : 0;
	half_gi = (flags & IEEE80211_TX_RC_SHORT_GI) ? 1 : 0;
627

S
Sujith 已提交
628
	if (half_gi)
629
		nsymbols = NUM_SYMBOLS_PER_USEC_HALFGI(tid->an->mpdudensity);
S
Sujith 已提交
630
	else
631
		nsymbols = NUM_SYMBOLS_PER_USEC(tid->an->mpdudensity);
632

S
Sujith 已提交
633 634
	if (nsymbols == 0)
		nsymbols = 1;
635

636 637
	streams = HT_RC_2_STREAMS(rix);
	nsymbits = bits_per_symbol[rix % 8][width] * streams;
S
Sujith 已提交
638
	minlen = (nsymbols * nsymbits) / BITS_PER_BYTE;
639

S
Sujith 已提交
640 641 642
	if (frmlen < minlen) {
		mindelim = (minlen - frmlen) / ATH_AGGR_DELIM_SZ;
		ndelim = max(mindelim, ndelim);
643 644
	}

S
Sujith 已提交
645
	return ndelim;
646 647
}

S
Sujith 已提交
648
static enum ATH_AGGR_STATUS ath_tx_form_aggr(struct ath_softc *sc,
S
Sujith 已提交
649
					     struct ath_txq *txq,
S
Sujith 已提交
650 651
					     struct ath_atx_tid *tid,
					     struct list_head *bf_q)
652
{
S
Sujith 已提交
653
#define PADBYTES(_len) ((4 - ((_len) % 4)) % 4)
S
Sujith 已提交
654 655
	struct ath_buf *bf, *bf_first, *bf_prev = NULL;
	int rl = 0, nframes = 0, ndelim, prev_al = 0;
S
Sujith 已提交
656 657 658
	u16 aggr_limit = 0, al = 0, bpad = 0,
		al_delta, h_baw = tid->baw_size / 2;
	enum ATH_AGGR_STATUS status = ATH_AGGR_DONE;
659

S
Sujith 已提交
660
	bf_first = list_first_entry(&tid->buf_q, struct ath_buf, list);
661

S
Sujith 已提交
662 663
	do {
		bf = list_first_entry(&tid->buf_q, struct ath_buf, list);
664

S
Sujith 已提交
665
		/* do not step over block-ack window */
S
Sujith 已提交
666 667 668 669
		if (!BAW_WITHIN(tid->seq_start, tid->baw_size, bf->bf_seqno)) {
			status = ATH_AGGR_BAW_CLOSED;
			break;
		}
670

S
Sujith 已提交
671 672 673 674
		if (!rl) {
			aggr_limit = ath_lookup_rate(sc, bf, tid);
			rl = 1;
		}
675

S
Sujith 已提交
676
		/* do not exceed aggregation limit */
S
Sujith 已提交
677
		al_delta = ATH_AGGR_DELIM_SZ + bf->bf_frmlen;
678

S
Sujith 已提交
679 680
		if (nframes &&
		    (aggr_limit < (al + bpad + al_delta + prev_al))) {
S
Sujith 已提交
681 682 683
			status = ATH_AGGR_LIMITED;
			break;
		}
684

S
Sujith 已提交
685 686
		/* do not exceed subframe limit */
		if (nframes >= min((int)h_baw, ATH_AMPDU_SUBFRAME_DEFAULT)) {
S
Sujith 已提交
687 688 689
			status = ATH_AGGR_LIMITED;
			break;
		}
S
Sujith 已提交
690
		nframes++;
691

S
Sujith 已提交
692
		/* add padding for previous frame to aggregation length */
S
Sujith 已提交
693
		al += bpad + al_delta;
694

S
Sujith 已提交
695 696 697 698 699 700
		/*
		 * Get the delimiters needed to meet the MPDU
		 * density for this node.
		 */
		ndelim = ath_compute_num_delims(sc, tid, bf_first, bf->bf_frmlen);
		bpad = PADBYTES(al_delta) + (ndelim << 2);
701

S
Sujith 已提交
702
		bf->bf_next = NULL;
703
		ath9k_hw_set_desc_link(sc->sc_ah, bf->bf_desc, 0);
704

S
Sujith 已提交
705
		/* link buffers of this frame to the aggregate */
S
Sujith 已提交
706
		ath_tx_addto_baw(sc, tid, bf);
S
Sujith 已提交
707 708
		ath9k_hw_set11n_aggr_middle(sc->sc_ah, bf->bf_desc, ndelim);
		list_move_tail(&bf->list, bf_q);
S
Sujith 已提交
709 710
		if (bf_prev) {
			bf_prev->bf_next = bf;
711 712
			ath9k_hw_set_desc_link(sc->sc_ah, bf_prev->bf_desc,
					       bf->bf_daddr);
S
Sujith 已提交
713 714
		}
		bf_prev = bf;
S
Sujith 已提交
715

S
Sujith 已提交
716
	} while (!list_empty(&tid->buf_q));
717

S
Sujith 已提交
718 719
	bf_first->bf_al = al;
	bf_first->bf_nframes = nframes;
S
Sujith 已提交
720

S
Sujith 已提交
721 722 723
	return status;
#undef PADBYTES
}
724

S
Sujith 已提交
725 726 727
static void ath_tx_sched_aggr(struct ath_softc *sc, struct ath_txq *txq,
			      struct ath_atx_tid *tid)
{
S
Sujith 已提交
728
	struct ath_buf *bf;
S
Sujith 已提交
729 730
	enum ATH_AGGR_STATUS status;
	struct list_head bf_q;
731

S
Sujith 已提交
732 733 734
	do {
		if (list_empty(&tid->buf_q))
			return;
735

S
Sujith 已提交
736 737
		INIT_LIST_HEAD(&bf_q);

S
Sujith 已提交
738
		status = ath_tx_form_aggr(sc, txq, tid, &bf_q);
739 740

		/*
S
Sujith 已提交
741 742
		 * no frames picked up to be aggregated;
		 * block-ack window is not open.
743
		 */
S
Sujith 已提交
744 745
		if (list_empty(&bf_q))
			break;
746

S
Sujith 已提交
747
		bf = list_first_entry(&bf_q, struct ath_buf, list);
S
Sujith 已提交
748
		bf->bf_lastbf = list_entry(bf_q.prev, struct ath_buf, list);
749

S
Sujith 已提交
750
		/* if only one frame, send as non-aggregate */
S
Sujith 已提交
751 752
		if (bf->bf_nframes == 1) {
			bf->bf_state.bf_type &= ~BUF_AGGR;
S
Sujith 已提交
753
			ath9k_hw_clr11n_aggr(sc->sc_ah, bf->bf_desc);
S
Sujith 已提交
754 755 756 757
			ath_buf_set_rate(sc, bf);
			ath_tx_txqaddbuf(sc, txq, &bf_q);
			continue;
		}
758

S
Sujith 已提交
759
		/* setup first desc of aggregate */
S
Sujith 已提交
760 761 762
		bf->bf_state.bf_type |= BUF_AGGR;
		ath_buf_set_rate(sc, bf);
		ath9k_hw_set11n_aggr_first(sc->sc_ah, bf->bf_desc, bf->bf_al);
763

S
Sujith 已提交
764 765
		/* anchor last desc of aggregate */
		ath9k_hw_set11n_aggr_last(sc->sc_ah, bf->bf_lastbf->bf_desc);
766

S
Sujith 已提交
767
		ath_tx_txqaddbuf(sc, txq, &bf_q);
S
Sujith 已提交
768
		TX_STAT_INC(txq->axq_qnum, a_aggr);
769

S
Sujith 已提交
770 771 772 773
	} while (txq->axq_depth < ATH_AGGR_MIN_QDEPTH &&
		 status != ATH_AGGR_BAW_CLOSED);
}

S
Sujith 已提交
774 775
void ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
		       u16 tid, u16 *ssn)
S
Sujith 已提交
776 777 778 779 780
{
	struct ath_atx_tid *txtid;
	struct ath_node *an;

	an = (struct ath_node *)sta->drv_priv;
S
Sujith 已提交
781 782 783 784
	txtid = ATH_AN_2_TID(an, tid);
	txtid->state |= AGGR_ADDBA_PROGRESS;
	ath_tx_pause_tid(sc, txtid);
	*ssn = txtid->seq_start;
S
Sujith 已提交
785
}
786

S
Sujith 已提交
787
void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid)
S
Sujith 已提交
788 789 790 791
{
	struct ath_node *an = (struct ath_node *)sta->drv_priv;
	struct ath_atx_tid *txtid = ATH_AN_2_TID(an, tid);
	struct ath_txq *txq = &sc->tx.txq[txtid->ac->qnum];
792
	struct ath_tx_status ts;
S
Sujith 已提交
793 794
	struct ath_buf *bf;
	struct list_head bf_head;
795 796

	memset(&ts, 0, sizeof(ts));
S
Sujith 已提交
797
	INIT_LIST_HEAD(&bf_head);
798

S
Sujith 已提交
799
	if (txtid->state & AGGR_CLEANUP)
S
Sujith 已提交
800
		return;
801

S
Sujith 已提交
802
	if (!(txtid->state & AGGR_ADDBA_COMPLETE)) {
803
		txtid->state &= ~AGGR_ADDBA_PROGRESS;
S
Sujith 已提交
804
		return;
S
Sujith 已提交
805
	}
806

S
Sujith 已提交
807 808 809 810 811 812 813 814 815 816 817 818 819 820
	ath_tx_pause_tid(sc, txtid);

	/* drop all software retried frames and mark this TID */
	spin_lock_bh(&txq->axq_lock);
	while (!list_empty(&txtid->buf_q)) {
		bf = list_first_entry(&txtid->buf_q, struct ath_buf, list);
		if (!bf_isretried(bf)) {
			/*
			 * NB: it's based on the assumption that
			 * software retried frame will always stay
			 * at the head of software queue.
			 */
			break;
		}
S
Sujith 已提交
821
		list_move_tail(&bf->list, &bf_head);
S
Sujith 已提交
822
		ath_tx_update_baw(sc, txtid, bf->bf_seqno);
823
		ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 0);
824
	}
S
Sujith 已提交
825
	spin_unlock_bh(&txq->axq_lock);
826

S
Sujith 已提交
827 828 829 830 831
	if (txtid->baw_head != txtid->baw_tail) {
		txtid->state |= AGGR_CLEANUP;
	} else {
		txtid->state &= ~AGGR_ADDBA_COMPLETE;
		ath_tx_flush_tid(sc, txtid);
832
	}
S
Sujith 已提交
833
}
834

S
Sujith 已提交
835 836 837 838 839 840 841 842 843 844 845 846 847 848 849
void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid)
{
	struct ath_atx_tid *txtid;
	struct ath_node *an;

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

	if (sc->sc_flags & SC_OP_TXAGGR) {
		txtid = ATH_AN_2_TID(an, tid);
		txtid->baw_size =
			IEEE80211_MIN_AMPDU_BUF << sta->ht_cap.ampdu_factor;
		txtid->state |= AGGR_ADDBA_COMPLETE;
		txtid->state &= ~AGGR_ADDBA_PROGRESS;
		ath_tx_resume_tid(sc, txtid);
	}
850 851
}

S
Sujith 已提交
852
bool ath_tx_aggr_check(struct ath_softc *sc, struct ath_node *an, u8 tidno)
853
{
S
Sujith 已提交
854
	struct ath_atx_tid *txtid;
855

S
Sujith 已提交
856 857
	if (!(sc->sc_flags & SC_OP_TXAGGR))
		return false;
858

S
Sujith 已提交
859 860
	txtid = ATH_AN_2_TID(an, tidno);

861
	if (!(txtid->state & (AGGR_ADDBA_COMPLETE | AGGR_ADDBA_PROGRESS)))
S
Sujith 已提交
862 863
			return true;
	return false;
864 865
}

S
Sujith 已提交
866 867 868
/********************/
/* Queue Management */
/********************/
869

S
Sujith 已提交
870 871
static void ath_txq_drain_pending_buffers(struct ath_softc *sc,
					  struct ath_txq *txq)
872
{
S
Sujith 已提交
873 874
	struct ath_atx_ac *ac, *ac_tmp;
	struct ath_atx_tid *tid, *tid_tmp;
875

S
Sujith 已提交
876 877 878 879 880 881 882 883
	list_for_each_entry_safe(ac, ac_tmp, &txq->axq_acq, list) {
		list_del(&ac->list);
		ac->sched = false;
		list_for_each_entry_safe(tid, tid_tmp, &ac->tid_q, list) {
			list_del(&tid->list);
			tid->sched = false;
			ath_tid_drain(sc, txq, tid);
		}
884 885 886
	}
}

S
Sujith 已提交
887
struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype)
888
{
889
	struct ath_hw *ah = sc->sc_ah;
890
	struct ath_common *common = ath9k_hw_common(ah);
S
Sujith 已提交
891
	struct ath9k_tx_queue_info qi;
892
	int qnum, i;
893

S
Sujith 已提交
894 895 896 897 898 899
	memset(&qi, 0, sizeof(qi));
	qi.tqi_subtype = subtype;
	qi.tqi_aifs = ATH9K_TXQ_USEDEFAULT;
	qi.tqi_cwmin = ATH9K_TXQ_USEDEFAULT;
	qi.tqi_cwmax = ATH9K_TXQ_USEDEFAULT;
	qi.tqi_physCompBuf = 0;
900 901

	/*
S
Sujith 已提交
902 903 904 905 906 907 908 909 910 911 912 913 914
	 * Enable interrupts only for EOL and DESC conditions.
	 * We mark tx descriptors to receive a DESC interrupt
	 * when a tx queue gets deep; otherwise waiting for the
	 * EOL to reap descriptors.  Note that this is done to
	 * reduce interrupt load and this only defers reaping
	 * descriptors, never transmitting frames.  Aside from
	 * reducing interrupts this also permits more concurrency.
	 * The only potential downside is if the tx queue backs
	 * up in which case the top half of the kernel may backup
	 * due to a lack of tx descriptors.
	 *
	 * The UAPSD queue is an exception, since we take a desc-
	 * based intr on the EOSP frames.
915
	 */
916 917 918 919 920 921 922 923 924 925
	if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) {
		qi.tqi_qflags = TXQ_FLAG_TXOKINT_ENABLE |
				TXQ_FLAG_TXERRINT_ENABLE;
	} else {
		if (qtype == ATH9K_TX_QUEUE_UAPSD)
			qi.tqi_qflags = TXQ_FLAG_TXDESCINT_ENABLE;
		else
			qi.tqi_qflags = TXQ_FLAG_TXEOLINT_ENABLE |
					TXQ_FLAG_TXDESCINT_ENABLE;
	}
S
Sujith 已提交
926 927
	qnum = ath9k_hw_setuptxqueue(ah, qtype, &qi);
	if (qnum == -1) {
928
		/*
S
Sujith 已提交
929 930
		 * NB: don't print a message, this happens
		 * normally on parts with too few tx queues
931
		 */
S
Sujith 已提交
932
		return NULL;
933
	}
S
Sujith 已提交
934
	if (qnum >= ARRAY_SIZE(sc->tx.txq)) {
935 936 937
		ath_print(common, ATH_DBG_FATAL,
			  "qnum %u out of range, max %u!\n",
			  qnum, (unsigned int)ARRAY_SIZE(sc->tx.txq));
S
Sujith 已提交
938 939 940 941 942
		ath9k_hw_releasetxqueue(ah, qnum);
		return NULL;
	}
	if (!ATH_TXQ_SETUP(sc, qnum)) {
		struct ath_txq *txq = &sc->tx.txq[qnum];
943

S
Sujith 已提交
944 945 946 947 948 949
		txq->axq_qnum = qnum;
		txq->axq_link = NULL;
		INIT_LIST_HEAD(&txq->axq_q);
		INIT_LIST_HEAD(&txq->axq_acq);
		spin_lock_init(&txq->axq_lock);
		txq->axq_depth = 0;
950
		txq->axq_tx_inprogress = false;
S
Sujith 已提交
951
		sc->tx.txqsetup |= 1<<qnum;
952 953 954 955 956

		txq->txq_headidx = txq->txq_tailidx = 0;
		for (i = 0; i < ATH_TXFIFO_DEPTH; i++)
			INIT_LIST_HEAD(&txq->txq_fifo[i]);
		INIT_LIST_HEAD(&txq->txq_fifo_pending);
S
Sujith 已提交
957 958
	}
	return &sc->tx.txq[qnum];
959 960
}

961
int ath_tx_get_qnum(struct ath_softc *sc, int qtype, int haltype)
962
{
S
Sujith 已提交
963
	int qnum;
964

S
Sujith 已提交
965 966 967
	switch (qtype) {
	case ATH9K_TX_QUEUE_DATA:
		if (haltype >= ARRAY_SIZE(sc->tx.hwq_map)) {
968 969 970
			ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_FATAL,
				  "HAL AC %u out of range, max %zu!\n",
				  haltype, ARRAY_SIZE(sc->tx.hwq_map));
S
Sujith 已提交
971 972 973 974 975 976 977 978 979 980 981 982 983 984 985
			return -1;
		}
		qnum = sc->tx.hwq_map[haltype];
		break;
	case ATH9K_TX_QUEUE_BEACON:
		qnum = sc->beacon.beaconq;
		break;
	case ATH9K_TX_QUEUE_CAB:
		qnum = sc->beacon.cabq->axq_qnum;
		break;
	default:
		qnum = -1;
	}
	return qnum;
}
986

S
Sujith 已提交
987 988 989
struct ath_txq *ath_test_get_txq(struct ath_softc *sc, struct sk_buff *skb)
{
	struct ath_txq *txq = NULL;
990
	u16 skb_queue = skb_get_queue_mapping(skb);
S
Sujith 已提交
991
	int qnum;
992

993
	qnum = ath_get_hal_qnum(skb_queue, sc);
S
Sujith 已提交
994
	txq = &sc->tx.txq[qnum];
995

S
Sujith 已提交
996 997 998
	spin_lock_bh(&txq->axq_lock);

	if (txq->axq_depth >= (ATH_TXBUF - 20)) {
999 1000 1001
		ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_XMIT,
			  "TX queue: %d is full, depth: %d\n",
			  qnum, txq->axq_depth);
1002
		ath_mac80211_stop_queue(sc, skb_queue);
S
Sujith 已提交
1003 1004 1005
		txq->stopped = 1;
		spin_unlock_bh(&txq->axq_lock);
		return NULL;
1006 1007
	}

S
Sujith 已提交
1008 1009 1010 1011 1012 1013 1014 1015
	spin_unlock_bh(&txq->axq_lock);

	return txq;
}

int ath_txq_update(struct ath_softc *sc, int qnum,
		   struct ath9k_tx_queue_info *qinfo)
{
1016
	struct ath_hw *ah = sc->sc_ah;
S
Sujith 已提交
1017 1018 1019 1020 1021 1022 1023 1024 1025 1026
	int error = 0;
	struct ath9k_tx_queue_info qi;

	if (qnum == sc->beacon.beaconq) {
		/*
		 * XXX: for beacon queue, we just save the parameter.
		 * It will be picked up by ath_beaconq_config when
		 * it's necessary.
		 */
		sc->beacon.beacon_qi = *qinfo;
1027
		return 0;
S
Sujith 已提交
1028
	}
1029

1030
	BUG_ON(sc->tx.txq[qnum].axq_qnum != qnum);
S
Sujith 已提交
1031 1032 1033 1034 1035 1036 1037 1038 1039

	ath9k_hw_get_txq_props(ah, qnum, &qi);
	qi.tqi_aifs = qinfo->tqi_aifs;
	qi.tqi_cwmin = qinfo->tqi_cwmin;
	qi.tqi_cwmax = qinfo->tqi_cwmax;
	qi.tqi_burstTime = qinfo->tqi_burstTime;
	qi.tqi_readyTime = qinfo->tqi_readyTime;

	if (!ath9k_hw_set_txq_props(ah, qnum, &qi)) {
1040 1041
		ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_FATAL,
			  "Unable to update hardware queue %u!\n", qnum);
S
Sujith 已提交
1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053
		error = -EIO;
	} else {
		ath9k_hw_resettxqueue(ah, qnum);
	}

	return error;
}

int ath_cabq_update(struct ath_softc *sc)
{
	struct ath9k_tx_queue_info qi;
	int qnum = sc->beacon.cabq->axq_qnum;
1054

S
Sujith 已提交
1055
	ath9k_hw_get_txq_props(sc->sc_ah, qnum, &qi);
1056
	/*
S
Sujith 已提交
1057
	 * Ensure the readytime % is within the bounds.
1058
	 */
S
Sujith 已提交
1059 1060 1061 1062
	if (sc->config.cabqReadytime < ATH9K_READY_TIME_LO_BOUND)
		sc->config.cabqReadytime = ATH9K_READY_TIME_LO_BOUND;
	else if (sc->config.cabqReadytime > ATH9K_READY_TIME_HI_BOUND)
		sc->config.cabqReadytime = ATH9K_READY_TIME_HI_BOUND;
1063

1064
	qi.tqi_readyTime = (sc->beacon_interval *
S
Sujith 已提交
1065
			    sc->config.cabqReadytime) / 100;
S
Sujith 已提交
1066 1067 1068
	ath_txq_update(sc, qnum, &qi);

	return 0;
1069 1070
}

S
Sujith 已提交
1071 1072 1073 1074 1075 1076 1077
/*
 * Drain a given TX queue (could be Beacon or Data)
 *
 * This assumes output has been stopped and
 * we do not need to block ath_tx_tasklet.
 */
void ath_draintxq(struct ath_softc *sc, struct ath_txq *txq, bool retry_tx)
1078
{
S
Sujith 已提交
1079 1080
	struct ath_buf *bf, *lastbf;
	struct list_head bf_head;
1081 1082 1083
	struct ath_tx_status ts;

	memset(&ts, 0, sizeof(ts));
S
Sujith 已提交
1084
	INIT_LIST_HEAD(&bf_head);
1085

S
Sujith 已提交
1086 1087
	for (;;) {
		spin_lock_bh(&txq->axq_lock);
1088

1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105
		if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) {
			if (list_empty(&txq->txq_fifo[txq->txq_tailidx])) {
				txq->txq_headidx = txq->txq_tailidx = 0;
				spin_unlock_bh(&txq->axq_lock);
				break;
			} else {
				bf = list_first_entry(&txq->txq_fifo[txq->txq_tailidx],
						      struct ath_buf, list);
			}
		} else {
			if (list_empty(&txq->axq_q)) {
				txq->axq_link = NULL;
				spin_unlock_bh(&txq->axq_lock);
				break;
			}
			bf = list_first_entry(&txq->axq_q, struct ath_buf,
					      list);
1106

1107 1108 1109
			if (bf->bf_stale) {
				list_del(&bf->list);
				spin_unlock_bh(&txq->axq_lock);
1110

1111
				ath_tx_return_buffer(sc, bf);
1112 1113
				continue;
			}
S
Sujith 已提交
1114
		}
1115

S
Sujith 已提交
1116
		lastbf = bf->bf_lastbf;
1117 1118
		if (!retry_tx)
			lastbf->bf_tx_aborted = true;
1119

1120 1121 1122 1123 1124 1125 1126 1127 1128 1129
		if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) {
			list_cut_position(&bf_head,
					  &txq->txq_fifo[txq->txq_tailidx],
					  &lastbf->list);
			INCR(txq->txq_tailidx, ATH_TXFIFO_DEPTH);
		} else {
			/* remove ath_buf's of the same mpdu from txq */
			list_cut_position(&bf_head, &txq->axq_q, &lastbf->list);
		}

S
Sujith 已提交
1130
		txq->axq_depth--;
1131

S
Sujith 已提交
1132 1133 1134
		spin_unlock_bh(&txq->axq_lock);

		if (bf_isampdu(bf))
1135
			ath_tx_complete_aggr(sc, txq, bf, &bf_head, &ts, 0);
S
Sujith 已提交
1136
		else
1137
			ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 0);
1138 1139
	}

1140 1141 1142 1143
	spin_lock_bh(&txq->axq_lock);
	txq->axq_tx_inprogress = false;
	spin_unlock_bh(&txq->axq_lock);

S
Sujith 已提交
1144 1145 1146 1147 1148 1149 1150 1151
	/* flush any pending frames if aggregation is enabled */
	if (sc->sc_flags & SC_OP_TXAGGR) {
		if (!retry_tx) {
			spin_lock_bh(&txq->axq_lock);
			ath_txq_drain_pending_buffers(sc, txq);
			spin_unlock_bh(&txq->axq_lock);
		}
	}
1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172

	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) {
		spin_lock_bh(&txq->axq_lock);
		while (!list_empty(&txq->txq_fifo_pending)) {
			bf = list_first_entry(&txq->txq_fifo_pending,
					      struct ath_buf, list);
			list_cut_position(&bf_head,
					  &txq->txq_fifo_pending,
					  &bf->bf_lastbf->list);
			spin_unlock_bh(&txq->axq_lock);

			if (bf_isampdu(bf))
				ath_tx_complete_aggr(sc, txq, bf, &bf_head,
						     &ts, 0);
			else
				ath_tx_complete_buf(sc, bf, txq, &bf_head,
						    &ts, 0, 0);
			spin_lock_bh(&txq->axq_lock);
		}
		spin_unlock_bh(&txq->axq_lock);
	}
1173 1174
}

S
Sujith 已提交
1175
void ath_drain_all_txq(struct ath_softc *sc, bool retry_tx)
1176
{
1177
	struct ath_hw *ah = sc->sc_ah;
1178
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
S
Sujith 已提交
1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199
	struct ath_txq *txq;
	int i, npend = 0;

	if (sc->sc_flags & SC_OP_INVALID)
		return;

	/* Stop beacon queue */
	ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq);

	/* Stop data queues */
	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
		if (ATH_TXQ_SETUP(sc, i)) {
			txq = &sc->tx.txq[i];
			ath9k_hw_stoptxdma(ah, txq->axq_qnum);
			npend += ath9k_hw_numtxpending(ah, txq->axq_qnum);
		}
	}

	if (npend) {
		int r;

S
Sujith 已提交
1200
		ath_print(common, ATH_DBG_FATAL,
1201
			  "Failed to stop TX DMA. Resetting hardware!\n");
S
Sujith 已提交
1202 1203

		spin_lock_bh(&sc->sc_resetlock);
S
Sujith 已提交
1204
		r = ath9k_hw_reset(ah, sc->sc_ah->curchan, false);
S
Sujith 已提交
1205
		if (r)
1206 1207 1208
			ath_print(common, ATH_DBG_FATAL,
				  "Unable to reset hardware; reset status %d\n",
				  r);
S
Sujith 已提交
1209 1210 1211 1212 1213 1214 1215
		spin_unlock_bh(&sc->sc_resetlock);
	}

	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
		if (ATH_TXQ_SETUP(sc, i))
			ath_draintxq(sc, &sc->tx.txq[i], retry_tx);
	}
S
Sujith 已提交
1216
}
1217

S
Sujith 已提交
1218
void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq)
S
Sujith 已提交
1219
{
S
Sujith 已提交
1220 1221
	ath9k_hw_releasetxqueue(sc->sc_ah, txq->axq_qnum);
	sc->tx.txqsetup &= ~(1<<txq->axq_qnum);
S
Sujith 已提交
1222
}
1223

S
Sujith 已提交
1224 1225 1226 1227
void ath_txq_schedule(struct ath_softc *sc, struct ath_txq *txq)
{
	struct ath_atx_ac *ac;
	struct ath_atx_tid *tid;
1228

S
Sujith 已提交
1229 1230
	if (list_empty(&txq->axq_acq))
		return;
1231

S
Sujith 已提交
1232 1233 1234
	ac = list_first_entry(&txq->axq_acq, struct ath_atx_ac, list);
	list_del(&ac->list);
	ac->sched = false;
1235

S
Sujith 已提交
1236 1237 1238
	do {
		if (list_empty(&ac->tid_q))
			return;
1239

S
Sujith 已提交
1240 1241 1242
		tid = list_first_entry(&ac->tid_q, struct ath_atx_tid, list);
		list_del(&tid->list);
		tid->sched = false;
1243

S
Sujith 已提交
1244 1245
		if (tid->paused)
			continue;
1246

1247
		ath_tx_sched_aggr(sc, txq, tid);
1248 1249

		/*
S
Sujith 已提交
1250 1251
		 * add tid to round-robin queue if more frames
		 * are pending for the tid
1252
		 */
S
Sujith 已提交
1253 1254
		if (!list_empty(&tid->buf_q))
			ath_tx_queue_tid(txq, tid);
1255

S
Sujith 已提交
1256 1257
		break;
	} while (!list_empty(&ac->tid_q));
1258

S
Sujith 已提交
1259 1260 1261 1262
	if (!list_empty(&ac->tid_q)) {
		if (!ac->sched) {
			ac->sched = true;
			list_add_tail(&ac->list, &txq->axq_acq);
1263
		}
S
Sujith 已提交
1264 1265
	}
}
1266

S
Sujith 已提交
1267 1268 1269
int ath_tx_setup(struct ath_softc *sc, int haltype)
{
	struct ath_txq *txq;
1270

S
Sujith 已提交
1271
	if (haltype >= ARRAY_SIZE(sc->tx.hwq_map)) {
1272 1273
		ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_FATAL,
			  "HAL AC %u out of range, max %zu!\n",
S
Sujith 已提交
1274 1275 1276 1277 1278 1279 1280 1281 1282
			 haltype, ARRAY_SIZE(sc->tx.hwq_map));
		return 0;
	}
	txq = ath_txq_setup(sc, ATH9K_TX_QUEUE_DATA, haltype);
	if (txq != NULL) {
		sc->tx.hwq_map[haltype] = txq->axq_qnum;
		return 1;
	} else
		return 0;
1283 1284
}

S
Sujith 已提交
1285 1286 1287 1288
/***********/
/* TX, DMA */
/***********/

1289
/*
S
Sujith 已提交
1290 1291
 * Insert a chain of ath_buf (descriptors) on a txq and
 * assume the descriptors are already chained together by caller.
1292
 */
S
Sujith 已提交
1293 1294
static void ath_tx_txqaddbuf(struct ath_softc *sc, struct ath_txq *txq,
			     struct list_head *head)
1295
{
1296
	struct ath_hw *ah = sc->sc_ah;
1297
	struct ath_common *common = ath9k_hw_common(ah);
S
Sujith 已提交
1298
	struct ath_buf *bf;
1299

S
Sujith 已提交
1300 1301 1302 1303
	/*
	 * Insert the frame on the outbound list and
	 * pass it on to the hardware.
	 */
1304

S
Sujith 已提交
1305 1306
	if (list_empty(head))
		return;
1307

S
Sujith 已提交
1308
	bf = list_first_entry(head, struct ath_buf, list);
1309

1310 1311
	ath_print(common, ATH_DBG_QUEUE,
		  "qnum: %d, txq depth: %d\n", txq->axq_qnum, txq->axq_depth);
1312

1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325
	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) {
		if (txq->axq_depth >= ATH_TXFIFO_DEPTH) {
			list_splice_tail_init(head, &txq->txq_fifo_pending);
			return;
		}
		if (!list_empty(&txq->txq_fifo[txq->txq_headidx]))
			ath_print(common, ATH_DBG_XMIT,
				  "Initializing tx fifo %d which "
				  "is non-empty\n",
				  txq->txq_headidx);
		INIT_LIST_HEAD(&txq->txq_fifo[txq->txq_headidx]);
		list_splice_init(head, &txq->txq_fifo[txq->txq_headidx]);
		INCR(txq->txq_headidx, ATH_TXFIFO_DEPTH);
S
Sujith 已提交
1326
		ath9k_hw_puttxbuf(ah, txq->axq_qnum, bf->bf_daddr);
1327 1328 1329
		ath_print(common, ATH_DBG_XMIT,
			  "TXDP[%u] = %llx (%p)\n",
			  txq->axq_qnum, ito64(bf->bf_daddr), bf->bf_desc);
S
Sujith 已提交
1330
	} else {
1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348
		list_splice_tail_init(head, &txq->axq_q);

		if (txq->axq_link == NULL) {
			ath9k_hw_puttxbuf(ah, txq->axq_qnum, bf->bf_daddr);
			ath_print(common, ATH_DBG_XMIT,
					"TXDP[%u] = %llx (%p)\n",
					txq->axq_qnum, ito64(bf->bf_daddr),
					bf->bf_desc);
		} else {
			*txq->axq_link = bf->bf_daddr;
			ath_print(common, ATH_DBG_XMIT,
					"link[%u] (%p)=%llx (%p)\n",
					txq->axq_qnum, txq->axq_link,
					ito64(bf->bf_daddr), bf->bf_desc);
		}
		ath9k_hw_get_desc_link(ah, bf->bf_lastbf->bf_desc,
				       &txq->axq_link);
		ath9k_hw_txstart(ah, txq->axq_qnum);
S
Sujith 已提交
1349
	}
1350
	txq->axq_depth++;
S
Sujith 已提交
1351
}
1352

S
Sujith 已提交
1353 1354 1355
static void ath_tx_send_ampdu(struct ath_softc *sc, struct ath_atx_tid *tid,
			      struct list_head *bf_head,
			      struct ath_tx_control *txctl)
1356 1357 1358
{
	struct ath_buf *bf;

S
Sujith 已提交
1359 1360
	bf = list_first_entry(bf_head, struct ath_buf, list);
	bf->bf_state.bf_type |= BUF_AMPDU;
S
Sujith 已提交
1361
	TX_STAT_INC(txctl->txq->axq_qnum, a_queued);
1362

S
Sujith 已提交
1363 1364 1365 1366 1367 1368 1369 1370 1371 1372
	/*
	 * Do not queue to h/w when any of the following conditions is true:
	 * - there are pending frames in software queue
	 * - the TID is currently paused for ADDBA/BAR request
	 * - seqno is not within block-ack window
	 * - h/w queue depth exceeds low water mark
	 */
	if (!list_empty(&tid->buf_q) || tid->paused ||
	    !BAW_WITHIN(tid->seq_start, tid->baw_size, bf->bf_seqno) ||
	    txctl->txq->axq_depth >= ATH_AGGR_MIN_QDEPTH) {
1373
		/*
S
Sujith 已提交
1374 1375
		 * Add this frame to software queue for scheduling later
		 * for aggregation.
1376
		 */
S
Sujith 已提交
1377
		list_move_tail(&bf->list, &tid->buf_q);
S
Sujith 已提交
1378 1379 1380 1381 1382 1383 1384 1385 1386
		ath_tx_queue_tid(txctl->txq, tid);
		return;
	}

	/* Add sub-frame to BAW */
	ath_tx_addto_baw(sc, tid, bf);

	/* Queue to h/w without aggregation */
	bf->bf_nframes = 1;
S
Sujith 已提交
1387
	bf->bf_lastbf = bf;
S
Sujith 已提交
1388 1389 1390 1391
	ath_buf_set_rate(sc, bf);
	ath_tx_txqaddbuf(sc, txctl->txq, bf_head);
}

S
Sujith 已提交
1392 1393 1394
static void ath_tx_send_ht_normal(struct ath_softc *sc, struct ath_txq *txq,
				  struct ath_atx_tid *tid,
				  struct list_head *bf_head)
S
Sujith 已提交
1395 1396 1397 1398 1399 1400 1401 1402 1403 1404
{
	struct ath_buf *bf;

	bf = list_first_entry(bf_head, struct ath_buf, list);
	bf->bf_state.bf_type &= ~BUF_AMPDU;

	/* update starting sequence number for subsequent ADDBA request */
	INCR(tid->seq_start, IEEE80211_SEQ_MAX);

	bf->bf_nframes = 1;
S
Sujith 已提交
1405
	bf->bf_lastbf = bf;
S
Sujith 已提交
1406 1407
	ath_buf_set_rate(sc, bf);
	ath_tx_txqaddbuf(sc, txq, bf_head);
S
Sujith 已提交
1408
	TX_STAT_INC(txq->axq_qnum, queued);
S
Sujith 已提交
1409 1410
}

S
Sujith 已提交
1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421
static void ath_tx_send_normal(struct ath_softc *sc, struct ath_txq *txq,
			       struct list_head *bf_head)
{
	struct ath_buf *bf;

	bf = list_first_entry(bf_head, struct ath_buf, list);

	bf->bf_lastbf = bf;
	bf->bf_nframes = 1;
	ath_buf_set_rate(sc, bf);
	ath_tx_txqaddbuf(sc, txq, bf_head);
S
Sujith 已提交
1422
	TX_STAT_INC(txq->axq_qnum, queued);
S
Sujith 已提交
1423 1424
}

S
Sujith 已提交
1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491
static enum ath9k_pkt_type get_hw_packet_type(struct sk_buff *skb)
{
	struct ieee80211_hdr *hdr;
	enum ath9k_pkt_type htype;
	__le16 fc;

	hdr = (struct ieee80211_hdr *)skb->data;
	fc = hdr->frame_control;

	if (ieee80211_is_beacon(fc))
		htype = ATH9K_PKT_TYPE_BEACON;
	else if (ieee80211_is_probe_resp(fc))
		htype = ATH9K_PKT_TYPE_PROBE_RESP;
	else if (ieee80211_is_atim(fc))
		htype = ATH9K_PKT_TYPE_ATIM;
	else if (ieee80211_is_pspoll(fc))
		htype = ATH9K_PKT_TYPE_PSPOLL;
	else
		htype = ATH9K_PKT_TYPE_NORMAL;

	return htype;
}

static int get_hw_crypto_keytype(struct sk_buff *skb)
{
	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);

	if (tx_info->control.hw_key) {
		if (tx_info->control.hw_key->alg == ALG_WEP)
			return ATH9K_KEY_TYPE_WEP;
		else if (tx_info->control.hw_key->alg == ALG_TKIP)
			return ATH9K_KEY_TYPE_TKIP;
		else if (tx_info->control.hw_key->alg == ALG_CCMP)
			return ATH9K_KEY_TYPE_AES;
	}

	return ATH9K_KEY_TYPE_CLEAR;
}

static void assign_aggr_tid_seqno(struct sk_buff *skb,
				  struct ath_buf *bf)
{
	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
	struct ieee80211_hdr *hdr;
	struct ath_node *an;
	struct ath_atx_tid *tid;
	__le16 fc;
	u8 *qc;

	if (!tx_info->control.sta)
		return;

	an = (struct ath_node *)tx_info->control.sta->drv_priv;
	hdr = (struct ieee80211_hdr *)skb->data;
	fc = hdr->frame_control;

	if (ieee80211_is_data_qos(fc)) {
		qc = ieee80211_get_qos_ctl(hdr);
		bf->bf_tidno = qc[0] & 0xf;
	}

	/*
	 * For HT capable stations, we save tidno for later use.
	 * We also override seqno set by upper layer with the one
	 * in tx aggregation state.
	 */
	tid = ATH_AN_2_TID(an, bf->bf_tidno);
1492
	hdr->seq_ctrl = cpu_to_le16(tid->seq_next << IEEE80211_SEQ_SEQ_SHIFT);
S
Sujith 已提交
1493 1494 1495 1496
	bf->bf_seqno = tid->seq_next;
	INCR(tid->seq_next, IEEE80211_SEQ_MAX);
}

L
Luis R. Rodriguez 已提交
1497
static int setup_tx_flags(struct sk_buff *skb, bool use_ldpc)
S
Sujith 已提交
1498 1499 1500 1501 1502 1503 1504 1505 1506 1507
{
	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
	int flags = 0;

	flags |= ATH9K_TXDESC_CLRDMASK; /* needed for crypto errors */
	flags |= ATH9K_TXDESC_INTREQ;

	if (tx_info->flags & IEEE80211_TX_CTL_NO_ACK)
		flags |= ATH9K_TXDESC_NOACK;

L
Luis R. Rodriguez 已提交
1508 1509 1510
	if (use_ldpc)
		flags |= ATH9K_TXDESC_LDPC;

S
Sujith 已提交
1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528
	return flags;
}

/*
 * rix - rate index
 * pktlen - total bytes (delims + data + fcs + pads + pad delims)
 * width  - 0 for 20 MHz, 1 for 40 MHz
 * half_gi - to use 4us v/s 3.6 us for symbol time
 */
static u32 ath_pkt_duration(struct ath_softc *sc, u8 rix, struct ath_buf *bf,
			    int width, int half_gi, bool shortPreamble)
{
	u32 nbits, nsymbits, duration, nsymbols;
	int streams, pktlen;

	pktlen = bf_isaggr(bf) ? bf->bf_al : bf->bf_frmlen;

	/* find number of symbols: PLCP + data */
1529
	streams = HT_RC_2_STREAMS(rix);
S
Sujith 已提交
1530
	nbits = (pktlen << 3) + OFDM_PLCP_BITS;
1531
	nsymbits = bits_per_symbol[rix % 8][width] * streams;
S
Sujith 已提交
1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546
	nsymbols = (nbits + nsymbits - 1) / nsymbits;

	if (!half_gi)
		duration = SYMBOL_TIME(nsymbols);
	else
		duration = SYMBOL_TIME_HALFGI(nsymbols);

	/* addup duration for legacy/ht training and signal fields */
	duration += L_STF + L_LTF + L_SIG + HT_SIG + HT_STF + HT_LTF(streams);

	return duration;
}

static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf)
{
1547
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
S
Sujith 已提交
1548 1549 1550 1551
	struct ath9k_11n_rate_series series[4];
	struct sk_buff *skb;
	struct ieee80211_tx_info *tx_info;
	struct ieee80211_tx_rate *rates;
1552
	const struct ieee80211_rate *rate;
1553
	struct ieee80211_hdr *hdr;
1554 1555
	int i, flags = 0;
	u8 rix = 0, ctsrate = 0;
1556
	bool is_pspoll;
S
Sujith 已提交
1557 1558 1559

	memset(series, 0, sizeof(struct ath9k_11n_rate_series) * 4);

S
Sujith 已提交
1560
	skb = bf->bf_mpdu;
S
Sujith 已提交
1561 1562
	tx_info = IEEE80211_SKB_CB(skb);
	rates = tx_info->control.rates;
1563 1564
	hdr = (struct ieee80211_hdr *)skb->data;
	is_pspoll = ieee80211_is_pspoll(hdr->frame_control);
S
Sujith 已提交
1565 1566

	/*
1567 1568 1569
	 * We check if Short Preamble is needed for the CTS rate by
	 * checking the BSS's global flag.
	 * But for the rate series, IEEE80211_TX_RC_USE_SHORT_PREAMBLE is used.
S
Sujith 已提交
1570
	 */
1571 1572
	rate = ieee80211_get_rts_cts_rate(sc->hw, tx_info);
	ctsrate = rate->hw_value;
1573
	if (sc->sc_flags & SC_OP_PREAMBLE_SHORT)
1574
		ctsrate |= rate->hw_value_short;
S
Sujith 已提交
1575 1576

	for (i = 0; i < 4; i++) {
1577 1578 1579
		bool is_40, is_sgi, is_sp;
		int phy;

S
Sujith 已提交
1580 1581 1582 1583 1584
		if (!rates[i].count || (rates[i].idx < 0))
			continue;

		rix = rates[i].idx;
		series[i].Tries = rates[i].count;
1585
		series[i].ChSel = common->tx_chainmask;
S
Sujith 已提交
1586

F
Felix Fietkau 已提交
1587 1588
		if ((sc->config.ath_aggr_prot && bf_isaggr(bf)) ||
		    (rates[i].flags & IEEE80211_TX_RC_USE_RTS_CTS)) {
1589
			series[i].RateFlags |= ATH9K_RATESERIES_RTS_CTS;
F
Felix Fietkau 已提交
1590 1591 1592 1593 1594 1595
			flags |= ATH9K_TXDESC_RTSENA;
		} else if (rates[i].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) {
			series[i].RateFlags |= ATH9K_RATESERIES_RTS_CTS;
			flags |= ATH9K_TXDESC_CTSENA;
		}

1596 1597 1598 1599
		if (rates[i].flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
			series[i].RateFlags |= ATH9K_RATESERIES_2040;
		if (rates[i].flags & IEEE80211_TX_RC_SHORT_GI)
			series[i].RateFlags |= ATH9K_RATESERIES_HALFGI;
S
Sujith 已提交
1600

1601 1602 1603 1604 1605 1606 1607 1608 1609
		is_sgi = !!(rates[i].flags & IEEE80211_TX_RC_SHORT_GI);
		is_40 = !!(rates[i].flags & IEEE80211_TX_RC_40_MHZ_WIDTH);
		is_sp = !!(rates[i].flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE);

		if (rates[i].flags & IEEE80211_TX_RC_MCS) {
			/* MCS rates */
			series[i].Rate = rix | 0x80;
			series[i].PktDuration = ath_pkt_duration(sc, rix, bf,
				 is_40, is_sgi, is_sp);
1610 1611
			if (rix < 8 && (tx_info->flags & IEEE80211_TX_CTL_STBC))
				series[i].RateFlags |= ATH9K_RATESERIES_STBC;
1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632
			continue;
		}

		/* legcay rates */
		if ((tx_info->band == IEEE80211_BAND_2GHZ) &&
		    !(rate->flags & IEEE80211_RATE_ERP_G))
			phy = WLAN_RC_PHY_CCK;
		else
			phy = WLAN_RC_PHY_OFDM;

		rate = &sc->sbands[tx_info->band].bitrates[rates[i].idx];
		series[i].Rate = rate->hw_value;
		if (rate->hw_value_short) {
			if (rates[i].flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE)
				series[i].Rate |= rate->hw_value_short;
		} else {
			is_sp = false;
		}

		series[i].PktDuration = ath9k_hw_computetxtime(sc->sc_ah,
			phy, rate->bitrate * 100, bf->bf_frmlen, rix, is_sp);
1633 1634
	}

F
Felix Fietkau 已提交
1635 1636 1637 1638 1639 1640 1641 1642
	/* For AR5416 - RTS cannot be followed by a frame larger than 8K */
	if (bf_isaggr(bf) && (bf->bf_al > sc->sc_ah->caps.rts_aggr_limit))
		flags &= ~ATH9K_TXDESC_RTSENA;

	/* ATH9K_TXDESC_RTSENA and ATH9K_TXDESC_CTSENA are mutually exclusive. */
	if (flags & ATH9K_TXDESC_RTSENA)
		flags &= ~ATH9K_TXDESC_CTSENA;

S
Sujith 已提交
1643
	/* set dur_update_en for l-sig computation except for PS-Poll frames */
1644 1645
	ath9k_hw_set11n_ratescenario(sc->sc_ah, bf->bf_desc,
				     bf->bf_lastbf->bf_desc,
1646
				     !is_pspoll, ctsrate,
1647
				     0, series, 4, flags);
1648

S
Sujith 已提交
1649
	if (sc->config.ath_aggr_prot && flags)
1650
		ath9k_hw_set11n_burstduration(sc->sc_ah, bf->bf_desc, 8192);
1651 1652
}

1653
static int ath_tx_setup_buffer(struct ieee80211_hw *hw, struct ath_buf *bf,
1654
				struct sk_buff *skb,
S
Sujith 已提交
1655
				struct ath_tx_control *txctl)
1656
{
1657 1658
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
S
Sujith 已提交
1659 1660 1661 1662
	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
	int hdrlen;
	__le16 fc;
1663
	int padpos, padsize;
L
Luis R. Rodriguez 已提交
1664
	bool use_ldpc = false;
1665

F
Felix Fietkau 已提交
1666 1667
	tx_info->pad[0] = 0;
	switch (txctl->frame_type) {
1668
	case ATH9K_IFT_NOT_INTERNAL:
F
Felix Fietkau 已提交
1669
		break;
1670
	case ATH9K_IFT_PAUSE:
F
Felix Fietkau 已提交
1671 1672
		tx_info->pad[0] |= ATH_TX_INFO_FRAME_TYPE_PAUSE;
		/* fall through */
1673
	case ATH9K_IFT_UNPAUSE:
F
Felix Fietkau 已提交
1674 1675 1676
		tx_info->pad[0] |= ATH_TX_INFO_FRAME_TYPE_INTERNAL;
		break;
	}
S
Sujith 已提交
1677 1678
	hdrlen = ieee80211_get_hdrlen_from_skb(skb);
	fc = hdr->frame_control;
1679

S
Sujith 已提交
1680
	ATH_TXBUF_RESET(bf);
1681

F
Felix Fietkau 已提交
1682
	bf->aphy = aphy;
1683 1684 1685 1686 1687 1688 1689
	bf->bf_frmlen = skb->len + FCS_LEN;
	/* Remove the padding size from bf_frmlen, if any */
	padpos = ath9k_cmn_padpos(hdr->frame_control);
	padsize = padpos & 3;
	if (padsize && skb->len>padpos+padsize) {
		bf->bf_frmlen -= padsize;
	}
S
Sujith 已提交
1690

L
Luis R. Rodriguez 已提交
1691
	if (conf_is_ht(&hw->conf)) {
S
Sujith 已提交
1692
		bf->bf_state.bf_type |= BUF_HT;
L
Luis R. Rodriguez 已提交
1693 1694 1695
		if (tx_info->flags & IEEE80211_TX_CTL_LDPC)
			use_ldpc = true;
	}
S
Sujith 已提交
1696

L
Luis R. Rodriguez 已提交
1697
	bf->bf_flags = setup_tx_flags(skb, use_ldpc);
S
Sujith 已提交
1698 1699 1700 1701 1702 1703 1704 1705 1706

	bf->bf_keytype = get_hw_crypto_keytype(skb);
	if (bf->bf_keytype != ATH9K_KEY_TYPE_CLEAR) {
		bf->bf_frmlen += tx_info->control.hw_key->icv_len;
		bf->bf_keyix = tx_info->control.hw_key->hw_key_idx;
	} else {
		bf->bf_keyix = ATH9K_TXKEYIX_INVALID;
	}

1707 1708
	if (ieee80211_is_data_qos(fc) && bf_isht(bf) &&
	    (sc->sc_flags & SC_OP_TXAGGR))
S
Sujith 已提交
1709 1710
		assign_aggr_tid_seqno(skb, bf);

1711
	bf->bf_mpdu = skb;
1712

1713 1714 1715
	bf->bf_dmacontext = dma_map_single(sc->dev, skb->data,
					   skb->len, DMA_TO_DEVICE);
	if (unlikely(dma_mapping_error(sc->dev, bf->bf_dmacontext))) {
1716
		bf->bf_mpdu = NULL;
1717 1718
		ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_FATAL,
			  "dma_mapping_error() on TX\n");
1719 1720 1721
		return -ENOMEM;
	}

S
Sujith 已提交
1722
	bf->bf_buf_addr = bf->bf_dmacontext;
1723 1724 1725 1726

	/* tag if this is a nullfunc frame to enable PS when AP acks it */
	if (ieee80211_is_nullfunc(fc) && ieee80211_has_pm(fc)) {
		bf->bf_isnullfunc = true;
S
Sujith 已提交
1727
		sc->ps_flags &= ~PS_NULLFUNC_COMPLETED;
1728 1729 1730
	} else
		bf->bf_isnullfunc = false;

1731 1732
	bf->bf_tx_aborted = false;

1733
	return 0;
S
Sujith 已提交
1734 1735 1736 1737 1738 1739
}

/* FIXME: tx power */
static void ath_tx_start_dma(struct ath_softc *sc, struct ath_buf *bf,
			     struct ath_tx_control *txctl)
{
S
Sujith 已提交
1740
	struct sk_buff *skb = bf->bf_mpdu;
S
Sujith 已提交
1741
	struct ieee80211_tx_info *tx_info =  IEEE80211_SKB_CB(skb);
S
Sujith 已提交
1742
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
S
Sujith 已提交
1743 1744 1745 1746
	struct ath_node *an = NULL;
	struct list_head bf_head;
	struct ath_desc *ds;
	struct ath_atx_tid *tid;
1747
	struct ath_hw *ah = sc->sc_ah;
S
Sujith 已提交
1748
	int frm_type;
S
Sujith 已提交
1749
	__le16 fc;
S
Sujith 已提交
1750 1751

	frm_type = get_hw_packet_type(skb);
S
Sujith 已提交
1752
	fc = hdr->frame_control;
S
Sujith 已提交
1753 1754 1755

	INIT_LIST_HEAD(&bf_head);
	list_add_tail(&bf->list, &bf_head);
1756 1757

	ds = bf->bf_desc;
1758
	ath9k_hw_set_desc_link(ah, ds, 0);
1759

S
Sujith 已提交
1760 1761 1762 1763
	ath9k_hw_set11n_txdesc(ah, ds, bf->bf_frmlen, frm_type, MAX_RATE_POWER,
			       bf->bf_keyix, bf->bf_keytype, bf->bf_flags);

	ath9k_hw_filltxdesc(ah, ds,
1764 1765 1766
			    skb->len,	/* segment length */
			    true,	/* first segment */
			    true,	/* last segment */
1767
			    ds,		/* first descriptor */
1768 1769
			    bf->bf_buf_addr,
			    txctl->txq->axq_qnum);
1770

S
Sujith 已提交
1771
	spin_lock_bh(&txctl->txq->axq_lock);
1772

1773 1774 1775 1776 1777
	if (bf_isht(bf) && (sc->sc_flags & SC_OP_TXAGGR) &&
	    tx_info->control.sta) {
		an = (struct ath_node *)tx_info->control.sta->drv_priv;
		tid = ATH_AN_2_TID(an, bf->bf_tidno);

S
Sujith 已提交
1778 1779 1780 1781 1782
		if (!ieee80211_is_data_qos(fc)) {
			ath_tx_send_normal(sc, txctl->txq, &bf_head);
			goto tx_done;
		}

1783
		if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) {
1784 1785 1786 1787
			/*
			 * Try aggregation if it's a unicast data frame
			 * and the destination is HT capable.
			 */
S
Sujith 已提交
1788
			ath_tx_send_ampdu(sc, tid, &bf_head, txctl);
1789 1790
		} else {
			/*
S
Sujith 已提交
1791 1792
			 * Send this frame as regular when ADDBA
			 * exchange is neither complete nor pending.
1793
			 */
S
Sujith 已提交
1794 1795
			ath_tx_send_ht_normal(sc, txctl->txq,
					      tid, &bf_head);
1796 1797
		}
	} else {
S
Sujith 已提交
1798
		ath_tx_send_normal(sc, txctl->txq, &bf_head);
1799
	}
S
Sujith 已提交
1800

S
Sujith 已提交
1801
tx_done:
S
Sujith 已提交
1802
	spin_unlock_bh(&txctl->txq->axq_lock);
1803 1804
}

1805
/* Upon failure caller should free skb */
1806
int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb,
S
Sujith 已提交
1807
		 struct ath_tx_control *txctl)
1808
{
1809 1810
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1811
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
S
Sujith 已提交
1812
	struct ath_buf *bf;
1813
	int r;
1814

S
Sujith 已提交
1815 1816
	bf = ath_tx_get_buffer(sc);
	if (!bf) {
1817
		ath_print(common, ATH_DBG_XMIT, "TX buffers are full\n");
S
Sujith 已提交
1818 1819 1820
		return -1;
	}

1821
	r = ath_tx_setup_buffer(hw, bf, skb, txctl);
1822
	if (unlikely(r)) {
1823 1824
		struct ath_txq *txq = txctl->txq;

1825
		ath_print(common, ATH_DBG_FATAL, "TX mem alloc failure\n");
1826 1827 1828 1829 1830 1831

		/* upon ath_tx_processq() this TX queue will be resumed, we
		 * guarantee this will happen by knowing beforehand that
		 * we will at least have to run TX completionon one buffer
		 * on the queue */
		spin_lock_bh(&txq->axq_lock);
1832
		if (sc->tx.txq[txq->axq_qnum].axq_depth > 1) {
1833
			ath_mac80211_stop_queue(sc, skb_get_queue_mapping(skb));
1834 1835 1836 1837
			txq->stopped = 1;
		}
		spin_unlock_bh(&txq->axq_lock);

1838
		ath_tx_return_buffer(sc, bf);
1839

1840 1841 1842
		return r;
	}

1843
	ath_tx_start_dma(sc, bf, txctl);
1844

S
Sujith 已提交
1845
	return 0;
1846 1847
}

1848
void ath_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb)
1849
{
1850 1851
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1852
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1853 1854
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
	int padpos, padsize;
S
Sujith 已提交
1855 1856
	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
	struct ath_tx_control txctl;
1857

S
Sujith 已提交
1858
	memset(&txctl, 0, sizeof(struct ath_tx_control));
1859 1860

	/*
S
Sujith 已提交
1861 1862 1863
	 * As a temporary workaround, assign seq# here; this will likely need
	 * to be cleaned up to work better with Beacon transmission and virtual
	 * BSSes.
1864
	 */
S
Sujith 已提交
1865 1866 1867 1868 1869
	if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) {
		if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)
			sc->tx.seq_no += 0x10;
		hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
		hdr->seq_ctrl |= cpu_to_le16(sc->tx.seq_no);
1870 1871
	}

S
Sujith 已提交
1872
	/* Add the padding after the header if this is not already done */
1873 1874 1875
	padpos = ath9k_cmn_padpos(hdr->frame_control);
	padsize = padpos & 3;
	if (padsize && skb->len>padpos) {
S
Sujith 已提交
1876
		if (skb_headroom(skb) < padsize) {
1877 1878
			ath_print(common, ATH_DBG_XMIT,
				  "TX CABQ padding failed\n");
S
Sujith 已提交
1879 1880 1881 1882
			dev_kfree_skb_any(skb);
			return;
		}
		skb_push(skb, padsize);
1883
		memmove(skb->data, skb->data + padsize, padpos);
1884 1885
	}

S
Sujith 已提交
1886
	txctl.txq = sc->beacon.cabq;
1887

1888 1889
	ath_print(common, ATH_DBG_XMIT,
		  "transmitting CABQ packet, skb: %p\n", skb);
1890

1891
	if (ath_tx_start(hw, skb, &txctl) != 0) {
1892
		ath_print(common, ATH_DBG_XMIT, "CABQ TX failed\n");
S
Sujith 已提交
1893
		goto exit;
1894 1895
	}

S
Sujith 已提交
1896 1897 1898
	return;
exit:
	dev_kfree_skb_any(skb);
1899 1900
}

S
Sujith 已提交
1901 1902 1903
/*****************/
/* TX Completion */
/*****************/
S
Sujith 已提交
1904

S
Sujith 已提交
1905
static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
F
Felix Fietkau 已提交
1906
			    struct ath_wiphy *aphy, int tx_flags)
S
Sujith 已提交
1907
{
S
Sujith 已提交
1908 1909
	struct ieee80211_hw *hw = sc->hw;
	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
1910
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1911 1912
	struct ieee80211_hdr * hdr = (struct ieee80211_hdr *)skb->data;
	int padpos, padsize;
S
Sujith 已提交
1913

1914
	ath_print(common, ATH_DBG_XMIT, "TX complete: skb: %p\n", skb);
S
Sujith 已提交
1915

F
Felix Fietkau 已提交
1916 1917
	if (aphy)
		hw = aphy->hw;
S
Sujith 已提交
1918

1919
	if (tx_flags & ATH_TX_BAR)
S
Sujith 已提交
1920 1921
		tx_info->flags |= IEEE80211_TX_STAT_AMPDU_NO_BACK;

1922
	if (!(tx_flags & (ATH_TX_ERROR | ATH_TX_XRETRY))) {
S
Sujith 已提交
1923 1924
		/* Frame was ACKed */
		tx_info->flags |= IEEE80211_TX_STAT_ACK;
S
Sujith 已提交
1925 1926
	}

1927 1928 1929
	padpos = ath9k_cmn_padpos(hdr->frame_control);
	padsize = padpos & 3;
	if (padsize && skb->len>padpos+padsize) {
S
Sujith 已提交
1930 1931 1932 1933
		/*
		 * Remove MAC header padding before giving the frame back to
		 * mac80211.
		 */
1934
		memmove(skb->data + padsize, skb->data, padpos);
S
Sujith 已提交
1935 1936
		skb_pull(skb, padsize);
	}
S
Sujith 已提交
1937

S
Sujith 已提交
1938 1939
	if (sc->ps_flags & PS_WAIT_FOR_TX_ACK) {
		sc->ps_flags &= ~PS_WAIT_FOR_TX_ACK;
1940 1941
		ath_print(common, ATH_DBG_PS,
			  "Going back to sleep after having "
1942
			  "received TX status (0x%lx)\n",
S
Sujith 已提交
1943 1944 1945 1946
			sc->ps_flags & (PS_WAIT_FOR_BEACON |
					PS_WAIT_FOR_CAB |
					PS_WAIT_FOR_PSPOLL_DATA |
					PS_WAIT_FOR_TX_ACK));
1947 1948
	}

F
Felix Fietkau 已提交
1949
	if (unlikely(tx_info->pad[0] & ATH_TX_INFO_FRAME_TYPE_INTERNAL))
1950
		ath9k_tx_status(hw, skb);
F
Felix Fietkau 已提交
1951 1952
	else
		ieee80211_tx_status(hw, skb);
S
Sujith 已提交
1953
}
1954

S
Sujith 已提交
1955
static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf,
1956 1957
				struct ath_txq *txq, struct list_head *bf_q,
				struct ath_tx_status *ts, int txok, int sendbar)
1958
{
S
Sujith 已提交
1959 1960
	struct sk_buff *skb = bf->bf_mpdu;
	unsigned long flags;
1961
	int tx_flags = 0;
1962

S
Sujith 已提交
1963
	if (sendbar)
1964
		tx_flags = ATH_TX_BAR;
1965

S
Sujith 已提交
1966
	if (!txok) {
1967
		tx_flags |= ATH_TX_ERROR;
1968

S
Sujith 已提交
1969
		if (bf_isxretried(bf))
1970
			tx_flags |= ATH_TX_XRETRY;
1971 1972
	}

S
Sujith 已提交
1973
	dma_unmap_single(sc->dev, bf->bf_dmacontext, skb->len, DMA_TO_DEVICE);
F
Felix Fietkau 已提交
1974
	ath_tx_complete(sc, skb, bf->aphy, tx_flags);
1975
	ath_debug_stat_tx(sc, txq, bf, ts);
S
Sujith 已提交
1976 1977 1978 1979 1980 1981 1982

	/*
	 * Return the list of ath_buf of this mpdu to free queue
	 */
	spin_lock_irqsave(&sc->tx.txbuflock, flags);
	list_splice_tail_init(bf_q, &sc->tx.txbuf);
	spin_unlock_irqrestore(&sc->tx.txbuflock, flags);
1983 1984
}

S
Sujith 已提交
1985
static int ath_tx_num_badfrms(struct ath_softc *sc, struct ath_buf *bf,
1986
			      struct ath_tx_status *ts, int txok)
1987
{
S
Sujith 已提交
1988 1989 1990 1991 1992
	u16 seq_st = 0;
	u32 ba[WME_BA_BMP_SIZE >> 5];
	int ba_index;
	int nbad = 0;
	int isaggr = 0;
1993

1994
	if (bf->bf_lastbf->bf_tx_aborted)
S
Sujith 已提交
1995
		return 0;
1996

S
Sujith 已提交
1997 1998
	isaggr = bf_isaggr(bf);
	if (isaggr) {
1999 2000
		seq_st = ts->ts_seqnum;
		memcpy(ba, &ts->ba_low, WME_BA_BMP_SIZE >> 3);
S
Sujith 已提交
2001
	}
2002

S
Sujith 已提交
2003 2004 2005 2006 2007 2008 2009
	while (bf) {
		ba_index = ATH_BA_INDEX(seq_st, bf->bf_seqno);
		if (!txok || (isaggr && !ATH_BA_ISSET(ba, ba_index)))
			nbad++;

		bf = bf->bf_next;
	}
2010

S
Sujith 已提交
2011 2012
	return nbad;
}
2013

2014
static void ath_tx_rc_status(struct ath_buf *bf, struct ath_tx_status *ts,
2015
			     int nbad, int txok, bool update_rc)
2016
{
S
Sujith 已提交
2017
	struct sk_buff *skb = bf->bf_mpdu;
2018
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
S
Sujith 已提交
2019
	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
F
Felix Fietkau 已提交
2020
	struct ieee80211_hw *hw = bf->aphy->hw;
2021
	u8 i, tx_rateindex;
2022

S
Sujith 已提交
2023
	if (txok)
2024
		tx_info->status.ack_signal = ts->ts_rssi;
S
Sujith 已提交
2025

2026
	tx_rateindex = ts->ts_rateindex;
2027 2028
	WARN_ON(tx_rateindex >= hw->max_rates);

2029
	if (ts->ts_status & ATH9K_TXERR_FILT)
S
Sujith 已提交
2030
		tx_info->flags |= IEEE80211_TX_STAT_TX_FILTERED;
2031 2032
	if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && update_rc)
		tx_info->flags |= IEEE80211_TX_STAT_AMPDU;
2033

2034
	if ((ts->ts_status & ATH9K_TXERR_FILT) == 0 &&
2035
	    (bf->bf_flags & ATH9K_TXDESC_NOACK) == 0 && update_rc) {
2036
		if (ieee80211_is_data(hdr->frame_control)) {
2037
			if (ts->ts_flags &
F
Felix Fietkau 已提交
2038 2039
			    (ATH9K_TX_DATA_UNDERRUN | ATH9K_TX_DELIM_UNDERRUN))
				tx_info->pad[0] |= ATH_TX_INFO_UNDERRUN;
2040 2041
			if ((ts->ts_status & ATH9K_TXERR_XRETRY) ||
			    (ts->ts_status & ATH9K_TXERR_FIFO))
F
Felix Fietkau 已提交
2042 2043 2044
				tx_info->pad[0] |= ATH_TX_INFO_XRETRY;
			tx_info->status.ampdu_len = bf->bf_nframes;
			tx_info->status.ampdu_ack_len = bf->bf_nframes - nbad;
S
Sujith 已提交
2045
		}
2046
	}
2047

2048
	for (i = tx_rateindex + 1; i < hw->max_rates; i++) {
2049
		tx_info->status.rates[i].count = 0;
2050 2051
		tx_info->status.rates[i].idx = -1;
	}
2052 2053

	tx_info->status.rates[tx_rateindex].count = bf->bf_retries + 1;
2054 2055
}

2056 2057 2058 2059 2060 2061
static void ath_wake_mac80211_queue(struct ath_softc *sc, struct ath_txq *txq)
{
	int qnum;

	spin_lock_bh(&txq->axq_lock);
	if (txq->stopped &&
2062
	    sc->tx.txq[txq->axq_qnum].axq_depth <= (ATH_TXBUF - 20)) {
2063 2064
		qnum = ath_get_mac80211_qnum(txq->axq_qnum, sc);
		if (qnum != -1) {
2065
			ath_mac80211_start_queue(sc, qnum);
2066 2067 2068 2069 2070 2071
			txq->stopped = 0;
		}
	}
	spin_unlock_bh(&txq->axq_lock);
}

S
Sujith 已提交
2072
static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq)
2073
{
2074
	struct ath_hw *ah = sc->sc_ah;
2075
	struct ath_common *common = ath9k_hw_common(ah);
S
Sujith 已提交
2076
	struct ath_buf *bf, *lastbf, *bf_held = NULL;
2077
	struct list_head bf_head;
S
Sujith 已提交
2078
	struct ath_desc *ds;
2079
	struct ath_tx_status ts;
2080
	int txok;
S
Sujith 已提交
2081
	int status;
2082

2083 2084 2085
	ath_print(common, ATH_DBG_QUEUE, "tx queue %d (%x), link %p\n",
		  txq->axq_qnum, ath9k_hw_gettxbuf(sc->sc_ah, txq->axq_qnum),
		  txq->axq_link);
2086 2087 2088 2089 2090 2091 2092 2093 2094 2095

	for (;;) {
		spin_lock_bh(&txq->axq_lock);
		if (list_empty(&txq->axq_q)) {
			txq->axq_link = NULL;
			spin_unlock_bh(&txq->axq_lock);
			break;
		}
		bf = list_first_entry(&txq->axq_q, struct ath_buf, list);

S
Sujith 已提交
2096 2097 2098 2099 2100 2101 2102 2103 2104
		/*
		 * There is a race condition that a BH gets scheduled
		 * after sw writes TxE and before hw re-load the last
		 * descriptor to get the newly chained one.
		 * Software must keep the last DONE descriptor as a
		 * holding descriptor - software does so by marking
		 * it with the STALE flag.
		 */
		bf_held = NULL;
S
Sujith 已提交
2105
		if (bf->bf_stale) {
S
Sujith 已提交
2106 2107
			bf_held = bf;
			if (list_is_last(&bf_held->list, &txq->axq_q)) {
2108
				spin_unlock_bh(&txq->axq_lock);
S
Sujith 已提交
2109 2110 2111
				break;
			} else {
				bf = list_entry(bf_held->list.next,
2112
						struct ath_buf, list);
S
Sujith 已提交
2113
			}
2114 2115 2116
		}

		lastbf = bf->bf_lastbf;
S
Sujith 已提交
2117
		ds = lastbf->bf_desc;
2118

2119 2120
		memset(&ts, 0, sizeof(ts));
		status = ath9k_hw_txprocdesc(ah, ds, &ts);
S
Sujith 已提交
2121
		if (status == -EINPROGRESS) {
2122
			spin_unlock_bh(&txq->axq_lock);
S
Sujith 已提交
2123
			break;
2124 2125
		}

2126 2127 2128 2129 2130
		/*
		 * We now know the nullfunc frame has been ACKed so we
		 * can disable RX.
		 */
		if (bf->bf_isnullfunc &&
2131
		    (ts.ts_status & ATH9K_TX_ACKED)) {
2132 2133 2134
			if ((sc->ps_flags & PS_ENABLED))
				ath9k_enable_ps(sc);
			else
S
Sujith 已提交
2135
				sc->ps_flags |= PS_NULLFUNC_COMPLETED;
2136 2137
		}

S
Sujith 已提交
2138 2139 2140 2141 2142
		/*
		 * Remove ath_buf's of the same transmit unit from txq,
		 * however leave the last descriptor back as the holding
		 * descriptor for hw.
		 */
S
Sujith 已提交
2143
		lastbf->bf_stale = true;
S
Sujith 已提交
2144 2145 2146 2147
		INIT_LIST_HEAD(&bf_head);
		if (!list_is_singular(&lastbf->list))
			list_cut_position(&bf_head,
				&txq->axq_q, lastbf->list.prev);
2148

S
Sujith 已提交
2149
		txq->axq_depth--;
2150
		txok = !(ts.ts_status & ATH9K_TXERR_MASK);
2151
		txq->axq_tx_inprogress = false;
2152 2153
		if (bf_held)
			list_del(&bf_held->list);
S
Sujith 已提交
2154
		spin_unlock_bh(&txq->axq_lock);
2155

2156 2157
		if (bf_held)
			ath_tx_return_buffer(sc, bf_held);
2158

S
Sujith 已提交
2159 2160 2161 2162 2163
		if (!bf_isampdu(bf)) {
			/*
			 * This frame is sent out as a single frame.
			 * Use hardware retry status for this frame.
			 */
2164 2165
			bf->bf_retries = ts.ts_longretry;
			if (ts.ts_status & ATH9K_TXERR_XRETRY)
S
Sujith 已提交
2166
				bf->bf_state.bf_type |= BUF_XRETRY;
2167
			ath_tx_rc_status(bf, &ts, 0, txok, true);
S
Sujith 已提交
2168
		}
2169

S
Sujith 已提交
2170
		if (bf_isampdu(bf))
2171
			ath_tx_complete_aggr(sc, txq, bf, &bf_head, &ts, txok);
S
Sujith 已提交
2172
		else
2173
			ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, txok, 0);
2174

2175
		ath_wake_mac80211_queue(sc, txq);
2176

2177
		spin_lock_bh(&txq->axq_lock);
S
Sujith 已提交
2178 2179 2180
		if (sc->sc_flags & SC_OP_TXAGGR)
			ath_txq_schedule(sc, txq);
		spin_unlock_bh(&txq->axq_lock);
2181 2182 2183
	}
}

S
Sujith 已提交
2184
static void ath_tx_complete_poll_work(struct work_struct *work)
2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208
{
	struct ath_softc *sc = container_of(work, struct ath_softc,
			tx_complete_work.work);
	struct ath_txq *txq;
	int i;
	bool needreset = false;

	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
		if (ATH_TXQ_SETUP(sc, i)) {
			txq = &sc->tx.txq[i];
			spin_lock_bh(&txq->axq_lock);
			if (txq->axq_depth) {
				if (txq->axq_tx_inprogress) {
					needreset = true;
					spin_unlock_bh(&txq->axq_lock);
					break;
				} else {
					txq->axq_tx_inprogress = true;
				}
			}
			spin_unlock_bh(&txq->axq_lock);
		}

	if (needreset) {
2209 2210
		ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_RESET,
			  "tx hung, resetting the chip\n");
S
Sujith 已提交
2211
		ath9k_ps_wakeup(sc);
2212
		ath_reset(sc, false);
S
Sujith 已提交
2213
		ath9k_ps_restore(sc);
2214 2215
	}

2216
	ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work,
2217 2218 2219 2220
			msecs_to_jiffies(ATH_TX_COMPLETE_POLL_INT));
}


2221

S
Sujith 已提交
2222
void ath_tx_tasklet(struct ath_softc *sc)
2223
{
S
Sujith 已提交
2224 2225
	int i;
	u32 qcumask = ((1 << ATH9K_NUM_TX_QUEUES) - 1);
2226

S
Sujith 已提交
2227
	ath9k_hw_gettxintrtxqs(sc->sc_ah, &qcumask);
2228

S
Sujith 已提交
2229 2230 2231
	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
		if (ATH_TXQ_SETUP(sc, i) && (qcumask & (1 << i)))
			ath_tx_processq(sc, &sc->tx.txq[i]);
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
void ath_tx_edma_tasklet(struct ath_softc *sc)
{
	struct ath_tx_status txs;
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
	struct ath_hw *ah = sc->sc_ah;
	struct ath_txq *txq;
	struct ath_buf *bf, *lastbf;
	struct list_head bf_head;
	int status;
	int txok;

	for (;;) {
		status = ath9k_hw_txprocdesc(ah, NULL, (void *)&txs);
		if (status == -EINPROGRESS)
			break;
		if (status == -EIO) {
			ath_print(common, ATH_DBG_XMIT,
				  "Error processing tx status\n");
			break;
		}

		/* Skip beacon completions */
		if (txs.qid == sc->beacon.beaconq)
			continue;

		txq = &sc->tx.txq[txs.qid];

		spin_lock_bh(&txq->axq_lock);
		if (list_empty(&txq->txq_fifo[txq->txq_tailidx])) {
			spin_unlock_bh(&txq->axq_lock);
			return;
		}

		bf = list_first_entry(&txq->txq_fifo[txq->txq_tailidx],
				      struct ath_buf, list);
		lastbf = bf->bf_lastbf;

		INIT_LIST_HEAD(&bf_head);
		list_cut_position(&bf_head, &txq->txq_fifo[txq->txq_tailidx],
				  &lastbf->list);
		INCR(txq->txq_tailidx, ATH_TXFIFO_DEPTH);
		txq->axq_depth--;
		txq->axq_tx_inprogress = false;
		spin_unlock_bh(&txq->axq_lock);

		txok = !(txs.ts_status & ATH9K_TXERR_MASK);

2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292
		/*
		 * Make sure null func frame is acked before configuring
		 * hw into ps mode.
		 */
		if (bf->bf_isnullfunc && txok) {
			if ((sc->ps_flags & PS_ENABLED))
				ath9k_enable_ps(sc);
			else
				sc->ps_flags |= PS_NULLFUNC_COMPLETED;
		}

2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305
		if (!bf_isampdu(bf)) {
			bf->bf_retries = txs.ts_longretry;
			if (txs.ts_status & ATH9K_TXERR_XRETRY)
				bf->bf_state.bf_type |= BUF_XRETRY;
			ath_tx_rc_status(bf, &txs, 0, txok, true);
		}

		if (bf_isampdu(bf))
			ath_tx_complete_aggr(sc, txq, bf, &bf_head, &txs, txok);
		else
			ath_tx_complete_buf(sc, bf, txq, &bf_head,
					    &txs, txok, 0);

2306 2307
		ath_wake_mac80211_queue(sc, txq);

2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321
		spin_lock_bh(&txq->axq_lock);
		if (!list_empty(&txq->txq_fifo_pending)) {
			INIT_LIST_HEAD(&bf_head);
			bf = list_first_entry(&txq->txq_fifo_pending,
				struct ath_buf, list);
			list_cut_position(&bf_head, &txq->txq_fifo_pending,
				&bf->bf_lastbf->list);
			ath_tx_txqaddbuf(sc, txq, &bf_head);
		} else if (sc->sc_flags & SC_OP_TXAGGR)
			ath_txq_schedule(sc, txq);
		spin_unlock_bh(&txq->axq_lock);
	}
}

S
Sujith 已提交
2322 2323 2324
/*****************/
/* Init, Cleanup */
/*****************/
2325

2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360
static int ath_txstatus_setup(struct ath_softc *sc, int size)
{
	struct ath_descdma *dd = &sc->txsdma;
	u8 txs_len = sc->sc_ah->caps.txs_len;

	dd->dd_desc_len = size * txs_len;
	dd->dd_desc = dma_alloc_coherent(sc->dev, dd->dd_desc_len,
					 &dd->dd_desc_paddr, GFP_KERNEL);
	if (!dd->dd_desc)
		return -ENOMEM;

	return 0;
}

static int ath_tx_edma_init(struct ath_softc *sc)
{
	int err;

	err = ath_txstatus_setup(sc, ATH_TXSTATUS_RING_SIZE);
	if (!err)
		ath9k_hw_setup_statusring(sc->sc_ah, sc->txsdma.dd_desc,
					  sc->txsdma.dd_desc_paddr,
					  ATH_TXSTATUS_RING_SIZE);

	return err;
}

static void ath_tx_edma_cleanup(struct ath_softc *sc)
{
	struct ath_descdma *dd = &sc->txsdma;

	dma_free_coherent(sc->dev, dd->dd_desc_len, dd->dd_desc,
			  dd->dd_desc_paddr);
}

S
Sujith 已提交
2361
int ath_tx_init(struct ath_softc *sc, int nbufs)
2362
{
2363
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
S
Sujith 已提交
2364
	int error = 0;
2365

2366
	spin_lock_init(&sc->tx.txbuflock);
2367

2368
	error = ath_descdma_setup(sc, &sc->tx.txdma, &sc->tx.txbuf,
2369
				  "tx", nbufs, 1, 1);
2370
	if (error != 0) {
2371 2372
		ath_print(common, ATH_DBG_FATAL,
			  "Failed to allocate tx descriptors: %d\n", error);
2373 2374
		goto err;
	}
2375

2376
	error = ath_descdma_setup(sc, &sc->beacon.bdma, &sc->beacon.bbuf,
2377
				  "beacon", ATH_BCBUF, 1, 1);
2378
	if (error != 0) {
2379 2380
		ath_print(common, ATH_DBG_FATAL,
			  "Failed to allocate beacon descriptors: %d\n", error);
2381 2382
		goto err;
	}
2383

2384 2385
	INIT_DELAYED_WORK(&sc->tx_complete_work, ath_tx_complete_poll_work);

2386 2387 2388 2389 2390 2391
	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) {
		error = ath_tx_edma_init(sc);
		if (error)
			goto err;
	}

2392
err:
S
Sujith 已提交
2393 2394
	if (error != 0)
		ath_tx_cleanup(sc);
2395

S
Sujith 已提交
2396
	return error;
2397 2398
}

2399
void ath_tx_cleanup(struct ath_softc *sc)
S
Sujith 已提交
2400 2401 2402 2403 2404 2405
{
	if (sc->beacon.bdma.dd_desc_len != 0)
		ath_descdma_cleanup(sc, &sc->beacon.bdma, &sc->beacon.bbuf);

	if (sc->tx.txdma.dd_desc_len != 0)
		ath_descdma_cleanup(sc, &sc->tx.txdma, &sc->tx.txbuf);
2406 2407 2408

	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
		ath_tx_edma_cleanup(sc);
S
Sujith 已提交
2409
}
2410 2411 2412

void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an)
{
2413 2414 2415
	struct ath_atx_tid *tid;
	struct ath_atx_ac *ac;
	int tidno, acno;
2416

2417
	for (tidno = 0, tid = &an->tid[tidno];
2418 2419 2420 2421 2422 2423 2424 2425
	     tidno < WME_NUM_TID;
	     tidno++, tid++) {
		tid->an        = an;
		tid->tidno     = tidno;
		tid->seq_start = tid->seq_next = 0;
		tid->baw_size  = WME_MAX_BA;
		tid->baw_head  = tid->baw_tail = 0;
		tid->sched     = false;
S
Sujith 已提交
2426
		tid->paused    = false;
2427
		tid->state &= ~AGGR_CLEANUP;
2428 2429
		INIT_LIST_HEAD(&tid->buf_q);
		acno = TID_TO_WME_AC(tidno);
2430
		tid->ac = &an->ac[acno];
2431 2432
		tid->state &= ~AGGR_ADDBA_COMPLETE;
		tid->state &= ~AGGR_ADDBA_PROGRESS;
2433
	}
2434

2435
	for (acno = 0, ac = &an->ac[acno];
2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456
	     acno < WME_NUM_AC; acno++, ac++) {
		ac->sched    = false;
		INIT_LIST_HEAD(&ac->tid_q);

		switch (acno) {
		case WME_AC_BE:
			ac->qnum = ath_tx_get_qnum(sc,
				   ATH9K_TX_QUEUE_DATA, ATH9K_WME_AC_BE);
			break;
		case WME_AC_BK:
			ac->qnum = ath_tx_get_qnum(sc,
				   ATH9K_TX_QUEUE_DATA, ATH9K_WME_AC_BK);
			break;
		case WME_AC_VI:
			ac->qnum = ath_tx_get_qnum(sc,
				   ATH9K_TX_QUEUE_DATA, ATH9K_WME_AC_VI);
			break;
		case WME_AC_VO:
			ac->qnum = ath_tx_get_qnum(sc,
				   ATH9K_TX_QUEUE_DATA, ATH9K_WME_AC_VO);
			break;
2457 2458 2459 2460
		}
	}
}

S
Sujith 已提交
2461
void ath_tx_node_cleanup(struct ath_softc *sc, struct ath_node *an)
2462 2463 2464 2465 2466
{
	int i;
	struct ath_atx_ac *ac, *ac_tmp;
	struct ath_atx_tid *tid, *tid_tmp;
	struct ath_txq *txq;
S
Sujith 已提交
2467

2468 2469
	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
		if (ATH_TXQ_SETUP(sc, i)) {
S
Sujith 已提交
2470
			txq = &sc->tx.txq[i];
2471

2472
			spin_lock_bh(&txq->axq_lock);
2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486

			list_for_each_entry_safe(ac,
					ac_tmp, &txq->axq_acq, list) {
				tid = list_first_entry(&ac->tid_q,
						struct ath_atx_tid, list);
				if (tid && tid->an != an)
					continue;
				list_del(&ac->list);
				ac->sched = false;

				list_for_each_entry_safe(tid,
						tid_tmp, &ac->tid_q, list) {
					list_del(&tid->list);
					tid->sched = false;
S
Sujith 已提交
2487
					ath_tid_drain(sc, txq, tid);
2488 2489
					tid->state &= ~AGGR_ADDBA_COMPLETE;
					tid->state &= ~AGGR_CLEANUP;
2490 2491 2492
				}
			}

2493
			spin_unlock_bh(&txq->axq_lock);
2494 2495 2496
		}
	}
}