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

944
		txq->axq_class = subtype;
S
Sujith 已提交
945 946 947 948 949 950
		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;
951
		txq->axq_tx_inprogress = false;
S
Sujith 已提交
952
		sc->tx.txqsetup |= 1<<qnum;
953 954 955 956 957

		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 已提交
958 959
	}
	return &sc->tx.txq[qnum];
960 961
}

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

S
Sujith 已提交
966 967 968
	switch (qtype) {
	case ATH9K_TX_QUEUE_DATA:
		if (haltype >= ARRAY_SIZE(sc->tx.hwq_map)) {
969 970 971
			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 已提交
972 973 974 975 976 977 978 979 980 981 982 983 984 985 986
			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;
}
987

S
Sujith 已提交
988 989 990
int ath_txq_update(struct ath_softc *sc, int qnum,
		   struct ath9k_tx_queue_info *qinfo)
{
991
	struct ath_hw *ah = sc->sc_ah;
S
Sujith 已提交
992 993 994 995 996 997 998 999 1000 1001
	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;
1002
		return 0;
S
Sujith 已提交
1003
	}
1004

1005
	BUG_ON(sc->tx.txq[qnum].axq_qnum != qnum);
S
Sujith 已提交
1006 1007 1008 1009 1010 1011 1012 1013 1014

	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)) {
1015 1016
		ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_FATAL,
			  "Unable to update hardware queue %u!\n", qnum);
S
Sujith 已提交
1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028
		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;
1029

S
Sujith 已提交
1030
	ath9k_hw_get_txq_props(sc->sc_ah, qnum, &qi);
1031
	/*
S
Sujith 已提交
1032
	 * Ensure the readytime % is within the bounds.
1033
	 */
S
Sujith 已提交
1034 1035 1036 1037
	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;
1038

1039
	qi.tqi_readyTime = (sc->beacon_interval *
S
Sujith 已提交
1040
			    sc->config.cabqReadytime) / 100;
S
Sujith 已提交
1041 1042 1043
	ath_txq_update(sc, qnum, &qi);

	return 0;
1044 1045
}

S
Sujith 已提交
1046 1047 1048 1049 1050 1051 1052
/*
 * 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)
1053
{
S
Sujith 已提交
1054 1055
	struct ath_buf *bf, *lastbf;
	struct list_head bf_head;
1056 1057 1058
	struct ath_tx_status ts;

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

S
Sujith 已提交
1061 1062
	for (;;) {
		spin_lock_bh(&txq->axq_lock);
1063

1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080
		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);
1081

1082 1083 1084
			if (bf->bf_stale) {
				list_del(&bf->list);
				spin_unlock_bh(&txq->axq_lock);
1085

1086
				ath_tx_return_buffer(sc, bf);
1087 1088
				continue;
			}
S
Sujith 已提交
1089
		}
1090

S
Sujith 已提交
1091
		lastbf = bf->bf_lastbf;
1092 1093
		if (!retry_tx)
			lastbf->bf_tx_aborted = true;
1094

1095 1096 1097 1098 1099 1100 1101 1102 1103 1104
		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 已提交
1105
		txq->axq_depth--;
1106

S
Sujith 已提交
1107 1108 1109
		spin_unlock_bh(&txq->axq_lock);

		if (bf_isampdu(bf))
1110
			ath_tx_complete_aggr(sc, txq, bf, &bf_head, &ts, 0);
S
Sujith 已提交
1111
		else
1112
			ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 0);
1113 1114
	}

1115 1116 1117 1118
	spin_lock_bh(&txq->axq_lock);
	txq->axq_tx_inprogress = false;
	spin_unlock_bh(&txq->axq_lock);

S
Sujith 已提交
1119 1120 1121 1122 1123 1124 1125 1126
	/* 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);
		}
	}
1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147

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

S
Sujith 已提交
1150
void ath_drain_all_txq(struct ath_softc *sc, bool retry_tx)
1151
{
1152
	struct ath_hw *ah = sc->sc_ah;
1153
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
S
Sujith 已提交
1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174
	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 已提交
1175
		ath_print(common, ATH_DBG_FATAL,
1176
			  "Failed to stop TX DMA. Resetting hardware!\n");
S
Sujith 已提交
1177 1178

		spin_lock_bh(&sc->sc_resetlock);
S
Sujith 已提交
1179
		r = ath9k_hw_reset(ah, sc->sc_ah->curchan, false);
S
Sujith 已提交
1180
		if (r)
1181 1182 1183
			ath_print(common, ATH_DBG_FATAL,
				  "Unable to reset hardware; reset status %d\n",
				  r);
S
Sujith 已提交
1184 1185 1186 1187 1188 1189 1190
		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 已提交
1191
}
1192

S
Sujith 已提交
1193
void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq)
S
Sujith 已提交
1194
{
S
Sujith 已提交
1195 1196
	ath9k_hw_releasetxqueue(sc->sc_ah, txq->axq_qnum);
	sc->tx.txqsetup &= ~(1<<txq->axq_qnum);
S
Sujith 已提交
1197
}
1198

S
Sujith 已提交
1199 1200 1201 1202
void ath_txq_schedule(struct ath_softc *sc, struct ath_txq *txq)
{
	struct ath_atx_ac *ac;
	struct ath_atx_tid *tid;
1203

S
Sujith 已提交
1204 1205
	if (list_empty(&txq->axq_acq))
		return;
1206

S
Sujith 已提交
1207 1208 1209
	ac = list_first_entry(&txq->axq_acq, struct ath_atx_ac, list);
	list_del(&ac->list);
	ac->sched = false;
1210

S
Sujith 已提交
1211 1212 1213
	do {
		if (list_empty(&ac->tid_q))
			return;
1214

S
Sujith 已提交
1215 1216 1217
		tid = list_first_entry(&ac->tid_q, struct ath_atx_tid, list);
		list_del(&tid->list);
		tid->sched = false;
1218

S
Sujith 已提交
1219 1220
		if (tid->paused)
			continue;
1221

1222
		ath_tx_sched_aggr(sc, txq, tid);
1223 1224

		/*
S
Sujith 已提交
1225 1226
		 * add tid to round-robin queue if more frames
		 * are pending for the tid
1227
		 */
S
Sujith 已提交
1228 1229
		if (!list_empty(&tid->buf_q))
			ath_tx_queue_tid(txq, tid);
1230

S
Sujith 已提交
1231 1232
		break;
	} while (!list_empty(&ac->tid_q));
1233

S
Sujith 已提交
1234 1235 1236 1237
	if (!list_empty(&ac->tid_q)) {
		if (!ac->sched) {
			ac->sched = true;
			list_add_tail(&ac->list, &txq->axq_acq);
1238
		}
S
Sujith 已提交
1239 1240
	}
}
1241

S
Sujith 已提交
1242 1243 1244
int ath_tx_setup(struct ath_softc *sc, int haltype)
{
	struct ath_txq *txq;
1245

S
Sujith 已提交
1246
	if (haltype >= ARRAY_SIZE(sc->tx.hwq_map)) {
1247 1248
		ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_FATAL,
			  "HAL AC %u out of range, max %zu!\n",
S
Sujith 已提交
1249 1250 1251 1252 1253 1254 1255 1256 1257
			 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;
1258 1259
}

S
Sujith 已提交
1260 1261 1262 1263
/***********/
/* TX, DMA */
/***********/

1264
/*
S
Sujith 已提交
1265 1266
 * Insert a chain of ath_buf (descriptors) on a txq and
 * assume the descriptors are already chained together by caller.
1267
 */
S
Sujith 已提交
1268 1269
static void ath_tx_txqaddbuf(struct ath_softc *sc, struct ath_txq *txq,
			     struct list_head *head)
1270
{
1271
	struct ath_hw *ah = sc->sc_ah;
1272
	struct ath_common *common = ath9k_hw_common(ah);
S
Sujith 已提交
1273
	struct ath_buf *bf;
1274

S
Sujith 已提交
1275 1276 1277 1278
	/*
	 * Insert the frame on the outbound list and
	 * pass it on to the hardware.
	 */
1279

S
Sujith 已提交
1280 1281
	if (list_empty(head))
		return;
1282

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

1285 1286
	ath_print(common, ATH_DBG_QUEUE,
		  "qnum: %d, txq depth: %d\n", txq->axq_qnum, txq->axq_depth);
1287

1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300
	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 已提交
1301
		ath9k_hw_puttxbuf(ah, txq->axq_qnum, bf->bf_daddr);
1302 1303 1304
		ath_print(common, ATH_DBG_XMIT,
			  "TXDP[%u] = %llx (%p)\n",
			  txq->axq_qnum, ito64(bf->bf_daddr), bf->bf_desc);
S
Sujith 已提交
1305
	} else {
1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323
		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 已提交
1324
	}
1325
	txq->axq_depth++;
S
Sujith 已提交
1326
}
1327

S
Sujith 已提交
1328 1329 1330
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)
1331 1332 1333
{
	struct ath_buf *bf;

S
Sujith 已提交
1334 1335
	bf = list_first_entry(bf_head, struct ath_buf, list);
	bf->bf_state.bf_type |= BUF_AMPDU;
S
Sujith 已提交
1336
	TX_STAT_INC(txctl->txq->axq_qnum, a_queued);
1337

S
Sujith 已提交
1338 1339 1340 1341 1342 1343 1344 1345 1346 1347
	/*
	 * 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) {
1348
		/*
S
Sujith 已提交
1349 1350
		 * Add this frame to software queue for scheduling later
		 * for aggregation.
1351
		 */
S
Sujith 已提交
1352
		list_move_tail(&bf->list, &tid->buf_q);
S
Sujith 已提交
1353 1354 1355 1356 1357 1358 1359 1360 1361
		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 已提交
1362
	bf->bf_lastbf = bf;
S
Sujith 已提交
1363 1364 1365 1366
	ath_buf_set_rate(sc, bf);
	ath_tx_txqaddbuf(sc, txctl->txq, bf_head);
}

S
Sujith 已提交
1367 1368 1369
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 已提交
1370 1371 1372 1373 1374 1375 1376 1377 1378 1379
{
	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 已提交
1380
	bf->bf_lastbf = bf;
S
Sujith 已提交
1381 1382
	ath_buf_set_rate(sc, bf);
	ath_tx_txqaddbuf(sc, txq, bf_head);
S
Sujith 已提交
1383
	TX_STAT_INC(txq->axq_qnum, queued);
S
Sujith 已提交
1384 1385
}

S
Sujith 已提交
1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396
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 已提交
1397
	TX_STAT_INC(txq->axq_qnum, queued);
S
Sujith 已提交
1398 1399
}

S
Sujith 已提交
1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 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
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);
1467
	hdr->seq_ctrl = cpu_to_le16(tid->seq_next << IEEE80211_SEQ_SEQ_SHIFT);
S
Sujith 已提交
1468 1469 1470 1471
	bf->bf_seqno = tid->seq_next;
	INCR(tid->seq_next, IEEE80211_SEQ_MAX);
}

L
Luis R. Rodriguez 已提交
1472
static int setup_tx_flags(struct sk_buff *skb, bool use_ldpc)
S
Sujith 已提交
1473 1474 1475 1476 1477 1478 1479 1480 1481 1482
{
	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 已提交
1483 1484 1485
	if (use_ldpc)
		flags |= ATH9K_TXDESC_LDPC;

S
Sujith 已提交
1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503
	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 */
1504
	streams = HT_RC_2_STREAMS(rix);
S
Sujith 已提交
1505
	nbits = (pktlen << 3) + OFDM_PLCP_BITS;
1506
	nsymbits = bits_per_symbol[rix % 8][width] * streams;
S
Sujith 已提交
1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521
	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)
{
1522
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
S
Sujith 已提交
1523 1524 1525 1526
	struct ath9k_11n_rate_series series[4];
	struct sk_buff *skb;
	struct ieee80211_tx_info *tx_info;
	struct ieee80211_tx_rate *rates;
1527
	const struct ieee80211_rate *rate;
1528
	struct ieee80211_hdr *hdr;
1529 1530
	int i, flags = 0;
	u8 rix = 0, ctsrate = 0;
1531
	bool is_pspoll;
S
Sujith 已提交
1532 1533 1534

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

S
Sujith 已提交
1535
	skb = bf->bf_mpdu;
S
Sujith 已提交
1536 1537
	tx_info = IEEE80211_SKB_CB(skb);
	rates = tx_info->control.rates;
1538 1539
	hdr = (struct ieee80211_hdr *)skb->data;
	is_pspoll = ieee80211_is_pspoll(hdr->frame_control);
S
Sujith 已提交
1540 1541

	/*
1542 1543 1544
	 * 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 已提交
1545
	 */
1546 1547
	rate = ieee80211_get_rts_cts_rate(sc->hw, tx_info);
	ctsrate = rate->hw_value;
1548
	if (sc->sc_flags & SC_OP_PREAMBLE_SHORT)
1549
		ctsrate |= rate->hw_value_short;
S
Sujith 已提交
1550 1551

	for (i = 0; i < 4; i++) {
1552 1553 1554
		bool is_40, is_sgi, is_sp;
		int phy;

S
Sujith 已提交
1555 1556 1557 1558 1559
		if (!rates[i].count || (rates[i].idx < 0))
			continue;

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

F
Felix Fietkau 已提交
1562 1563
		if ((sc->config.ath_aggr_prot && bf_isaggr(bf)) ||
		    (rates[i].flags & IEEE80211_TX_RC_USE_RTS_CTS)) {
1564
			series[i].RateFlags |= ATH9K_RATESERIES_RTS_CTS;
F
Felix Fietkau 已提交
1565 1566 1567 1568 1569 1570
			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;
		}

1571 1572 1573 1574
		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 已提交
1575

1576 1577 1578 1579 1580 1581 1582 1583 1584
		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);
1585 1586
			if (rix < 8 && (tx_info->flags & IEEE80211_TX_CTL_STBC))
				series[i].RateFlags |= ATH9K_RATESERIES_STBC;
1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607
			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);
1608 1609
	}

F
Felix Fietkau 已提交
1610 1611 1612 1613 1614 1615 1616 1617
	/* 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 已提交
1618
	/* set dur_update_en for l-sig computation except for PS-Poll frames */
1619 1620
	ath9k_hw_set11n_ratescenario(sc->sc_ah, bf->bf_desc,
				     bf->bf_lastbf->bf_desc,
1621
				     !is_pspoll, ctsrate,
1622
				     0, series, 4, flags);
1623

S
Sujith 已提交
1624
	if (sc->config.ath_aggr_prot && flags)
1625
		ath9k_hw_set11n_burstduration(sc->sc_ah, bf->bf_desc, 8192);
1626 1627
}

1628
static int ath_tx_setup_buffer(struct ieee80211_hw *hw, struct ath_buf *bf,
1629
				struct sk_buff *skb,
S
Sujith 已提交
1630
				struct ath_tx_control *txctl)
1631
{
1632 1633
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
S
Sujith 已提交
1634 1635 1636 1637
	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
	int hdrlen;
	__le16 fc;
1638
	int padpos, padsize;
L
Luis R. Rodriguez 已提交
1639
	bool use_ldpc = false;
1640

F
Felix Fietkau 已提交
1641 1642
	tx_info->pad[0] = 0;
	switch (txctl->frame_type) {
1643
	case ATH9K_IFT_NOT_INTERNAL:
F
Felix Fietkau 已提交
1644
		break;
1645
	case ATH9K_IFT_PAUSE:
F
Felix Fietkau 已提交
1646 1647
		tx_info->pad[0] |= ATH_TX_INFO_FRAME_TYPE_PAUSE;
		/* fall through */
1648
	case ATH9K_IFT_UNPAUSE:
F
Felix Fietkau 已提交
1649 1650 1651
		tx_info->pad[0] |= ATH_TX_INFO_FRAME_TYPE_INTERNAL;
		break;
	}
S
Sujith 已提交
1652 1653
	hdrlen = ieee80211_get_hdrlen_from_skb(skb);
	fc = hdr->frame_control;
1654

S
Sujith 已提交
1655
	ATH_TXBUF_RESET(bf);
1656

F
Felix Fietkau 已提交
1657
	bf->aphy = aphy;
1658 1659 1660 1661 1662 1663 1664
	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 已提交
1665

L
Luis R. Rodriguez 已提交
1666
	if (conf_is_ht(&hw->conf)) {
S
Sujith 已提交
1667
		bf->bf_state.bf_type |= BUF_HT;
L
Luis R. Rodriguez 已提交
1668 1669 1670
		if (tx_info->flags & IEEE80211_TX_CTL_LDPC)
			use_ldpc = true;
	}
S
Sujith 已提交
1671

L
Luis R. Rodriguez 已提交
1672
	bf->bf_flags = setup_tx_flags(skb, use_ldpc);
S
Sujith 已提交
1673 1674 1675 1676 1677 1678 1679 1680 1681

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

1682 1683
	if (ieee80211_is_data_qos(fc) && bf_isht(bf) &&
	    (sc->sc_flags & SC_OP_TXAGGR))
S
Sujith 已提交
1684 1685
		assign_aggr_tid_seqno(skb, bf);

1686
	bf->bf_mpdu = skb;
1687

1688 1689 1690
	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))) {
1691
		bf->bf_mpdu = NULL;
1692 1693
		ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_FATAL,
			  "dma_mapping_error() on TX\n");
1694 1695 1696
		return -ENOMEM;
	}

S
Sujith 已提交
1697
	bf->bf_buf_addr = bf->bf_dmacontext;
1698 1699 1700 1701

	/* 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 已提交
1702
		sc->ps_flags &= ~PS_NULLFUNC_COMPLETED;
1703 1704 1705
	} else
		bf->bf_isnullfunc = false;

1706 1707
	bf->bf_tx_aborted = false;

1708
	return 0;
S
Sujith 已提交
1709 1710 1711 1712 1713 1714
}

/* FIXME: tx power */
static void ath_tx_start_dma(struct ath_softc *sc, struct ath_buf *bf,
			     struct ath_tx_control *txctl)
{
S
Sujith 已提交
1715
	struct sk_buff *skb = bf->bf_mpdu;
S
Sujith 已提交
1716
	struct ieee80211_tx_info *tx_info =  IEEE80211_SKB_CB(skb);
S
Sujith 已提交
1717
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
S
Sujith 已提交
1718 1719 1720 1721
	struct ath_node *an = NULL;
	struct list_head bf_head;
	struct ath_desc *ds;
	struct ath_atx_tid *tid;
1722
	struct ath_hw *ah = sc->sc_ah;
S
Sujith 已提交
1723
	int frm_type;
S
Sujith 已提交
1724
	__le16 fc;
S
Sujith 已提交
1725 1726

	frm_type = get_hw_packet_type(skb);
S
Sujith 已提交
1727
	fc = hdr->frame_control;
S
Sujith 已提交
1728 1729 1730

	INIT_LIST_HEAD(&bf_head);
	list_add_tail(&bf->list, &bf_head);
1731 1732

	ds = bf->bf_desc;
1733
	ath9k_hw_set_desc_link(ah, ds, 0);
1734

S
Sujith 已提交
1735 1736 1737 1738
	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,
1739 1740 1741
			    skb->len,	/* segment length */
			    true,	/* first segment */
			    true,	/* last segment */
1742
			    ds,		/* first descriptor */
1743 1744
			    bf->bf_buf_addr,
			    txctl->txq->axq_qnum);
1745

S
Sujith 已提交
1746
	spin_lock_bh(&txctl->txq->axq_lock);
1747

1748 1749 1750 1751 1752
	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 已提交
1753 1754 1755 1756 1757
		if (!ieee80211_is_data_qos(fc)) {
			ath_tx_send_normal(sc, txctl->txq, &bf_head);
			goto tx_done;
		}

1758
		if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) {
1759 1760 1761 1762
			/*
			 * Try aggregation if it's a unicast data frame
			 * and the destination is HT capable.
			 */
S
Sujith 已提交
1763
			ath_tx_send_ampdu(sc, tid, &bf_head, txctl);
1764 1765
		} else {
			/*
S
Sujith 已提交
1766 1767
			 * Send this frame as regular when ADDBA
			 * exchange is neither complete nor pending.
1768
			 */
S
Sujith 已提交
1769 1770
			ath_tx_send_ht_normal(sc, txctl->txq,
					      tid, &bf_head);
1771 1772
		}
	} else {
S
Sujith 已提交
1773
		ath_tx_send_normal(sc, txctl->txq, &bf_head);
1774
	}
S
Sujith 已提交
1775

S
Sujith 已提交
1776
tx_done:
S
Sujith 已提交
1777
	spin_unlock_bh(&txctl->txq->axq_lock);
1778 1779
}

1780
/* Upon failure caller should free skb */
1781
int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb,
S
Sujith 已提交
1782
		 struct ath_tx_control *txctl)
1783
{
1784 1785
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1786
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1787
	struct ath_txq *txq = txctl->txq;
S
Sujith 已提交
1788
	struct ath_buf *bf;
1789
	int r;
1790

S
Sujith 已提交
1791 1792
	bf = ath_tx_get_buffer(sc);
	if (!bf) {
1793
		ath_print(common, ATH_DBG_XMIT, "TX buffers are full\n");
S
Sujith 已提交
1794 1795 1796
		return -1;
	}

1797 1798 1799 1800 1801 1802 1803 1804
	bf->txq = txctl->txq;
	spin_lock_bh(&bf->txq->axq_lock);
	if (++bf->txq->pending_frames > ATH_MAX_QDEPTH && !txq->stopped) {
		ath_mac80211_stop_queue(sc, skb_get_queue_mapping(skb));
		txq->stopped = 1;
	}
	spin_unlock_bh(&bf->txq->axq_lock);

1805
	r = ath_tx_setup_buffer(hw, bf, skb, txctl);
1806
	if (unlikely(r)) {
1807
		ath_print(common, ATH_DBG_FATAL, "TX mem alloc failure\n");
1808 1809 1810 1811 1812 1813

		/* 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);
1814
		if (!txq->stopped && txq->axq_depth > 1) {
1815
			ath_mac80211_stop_queue(sc, skb_get_queue_mapping(skb));
1816 1817 1818 1819
			txq->stopped = 1;
		}
		spin_unlock_bh(&txq->axq_lock);

1820
		ath_tx_return_buffer(sc, bf);
1821

1822 1823 1824
		return r;
	}

1825
	ath_tx_start_dma(sc, bf, txctl);
1826

S
Sujith 已提交
1827
	return 0;
1828 1829
}

1830
void ath_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb)
1831
{
1832 1833
	struct ath_wiphy *aphy = hw->priv;
	struct ath_softc *sc = aphy->sc;
1834
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1835 1836
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
	int padpos, padsize;
S
Sujith 已提交
1837 1838
	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
	struct ath_tx_control txctl;
1839

S
Sujith 已提交
1840
	memset(&txctl, 0, sizeof(struct ath_tx_control));
1841 1842

	/*
S
Sujith 已提交
1843 1844 1845
	 * As a temporary workaround, assign seq# here; this will likely need
	 * to be cleaned up to work better with Beacon transmission and virtual
	 * BSSes.
1846
	 */
S
Sujith 已提交
1847 1848 1849 1850 1851
	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);
1852 1853
	}

S
Sujith 已提交
1854
	/* Add the padding after the header if this is not already done */
1855 1856 1857
	padpos = ath9k_cmn_padpos(hdr->frame_control);
	padsize = padpos & 3;
	if (padsize && skb->len>padpos) {
S
Sujith 已提交
1858
		if (skb_headroom(skb) < padsize) {
1859 1860
			ath_print(common, ATH_DBG_XMIT,
				  "TX CABQ padding failed\n");
S
Sujith 已提交
1861 1862 1863 1864
			dev_kfree_skb_any(skb);
			return;
		}
		skb_push(skb, padsize);
1865
		memmove(skb->data, skb->data + padsize, padpos);
1866 1867
	}

S
Sujith 已提交
1868
	txctl.txq = sc->beacon.cabq;
1869

1870 1871
	ath_print(common, ATH_DBG_XMIT,
		  "transmitting CABQ packet, skb: %p\n", skb);
1872

1873
	if (ath_tx_start(hw, skb, &txctl) != 0) {
1874
		ath_print(common, ATH_DBG_XMIT, "CABQ TX failed\n");
S
Sujith 已提交
1875
		goto exit;
1876 1877
	}

S
Sujith 已提交
1878 1879 1880
	return;
exit:
	dev_kfree_skb_any(skb);
1881 1882
}

S
Sujith 已提交
1883 1884 1885
/*****************/
/* TX Completion */
/*****************/
S
Sujith 已提交
1886

S
Sujith 已提交
1887
static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
F
Felix Fietkau 已提交
1888
			    struct ath_wiphy *aphy, int tx_flags)
S
Sujith 已提交
1889
{
S
Sujith 已提交
1890 1891
	struct ieee80211_hw *hw = sc->hw;
	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
1892
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1893 1894
	struct ieee80211_hdr * hdr = (struct ieee80211_hdr *)skb->data;
	int padpos, padsize;
S
Sujith 已提交
1895

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

F
Felix Fietkau 已提交
1898 1899
	if (aphy)
		hw = aphy->hw;
S
Sujith 已提交
1900

1901
	if (tx_flags & ATH_TX_BAR)
S
Sujith 已提交
1902 1903
		tx_info->flags |= IEEE80211_TX_STAT_AMPDU_NO_BACK;

1904
	if (!(tx_flags & (ATH_TX_ERROR | ATH_TX_XRETRY))) {
S
Sujith 已提交
1905 1906
		/* Frame was ACKed */
		tx_info->flags |= IEEE80211_TX_STAT_ACK;
S
Sujith 已提交
1907 1908
	}

1909 1910 1911
	padpos = ath9k_cmn_padpos(hdr->frame_control);
	padsize = padpos & 3;
	if (padsize && skb->len>padpos+padsize) {
S
Sujith 已提交
1912 1913 1914 1915
		/*
		 * Remove MAC header padding before giving the frame back to
		 * mac80211.
		 */
1916
		memmove(skb->data + padsize, skb->data, padpos);
S
Sujith 已提交
1917 1918
		skb_pull(skb, padsize);
	}
S
Sujith 已提交
1919

S
Sujith 已提交
1920 1921
	if (sc->ps_flags & PS_WAIT_FOR_TX_ACK) {
		sc->ps_flags &= ~PS_WAIT_FOR_TX_ACK;
1922 1923
		ath_print(common, ATH_DBG_PS,
			  "Going back to sleep after having "
1924
			  "received TX status (0x%lx)\n",
S
Sujith 已提交
1925 1926 1927 1928
			sc->ps_flags & (PS_WAIT_FOR_BEACON |
					PS_WAIT_FOR_CAB |
					PS_WAIT_FOR_PSPOLL_DATA |
					PS_WAIT_FOR_TX_ACK));
1929 1930
	}

F
Felix Fietkau 已提交
1931
	if (unlikely(tx_info->pad[0] & ATH_TX_INFO_FRAME_TYPE_INTERNAL))
1932
		ath9k_tx_status(hw, skb);
F
Felix Fietkau 已提交
1933 1934
	else
		ieee80211_tx_status(hw, skb);
S
Sujith 已提交
1935
}
1936

S
Sujith 已提交
1937
static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf,
1938 1939
				struct ath_txq *txq, struct list_head *bf_q,
				struct ath_tx_status *ts, int txok, int sendbar)
1940
{
S
Sujith 已提交
1941 1942
	struct sk_buff *skb = bf->bf_mpdu;
	unsigned long flags;
1943
	int tx_flags = 0;
1944

S
Sujith 已提交
1945
	if (sendbar)
1946
		tx_flags = ATH_TX_BAR;
1947

S
Sujith 已提交
1948
	if (!txok) {
1949
		tx_flags |= ATH_TX_ERROR;
1950

S
Sujith 已提交
1951
		if (bf_isxretried(bf))
1952
			tx_flags |= ATH_TX_XRETRY;
1953 1954
	}

1955 1956 1957 1958 1959 1960 1961
	if (bf->txq) {
		spin_lock_bh(&bf->txq->axq_lock);
		bf->txq->pending_frames--;
		spin_unlock_bh(&bf->txq->axq_lock);
		bf->txq = NULL;
	}

S
Sujith 已提交
1962
	dma_unmap_single(sc->dev, bf->bf_dmacontext, skb->len, DMA_TO_DEVICE);
F
Felix Fietkau 已提交
1963
	ath_tx_complete(sc, skb, bf->aphy, tx_flags);
1964
	ath_debug_stat_tx(sc, txq, bf, ts);
S
Sujith 已提交
1965 1966 1967 1968 1969 1970 1971

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

S
Sujith 已提交
1974
static int ath_tx_num_badfrms(struct ath_softc *sc, struct ath_buf *bf,
1975
			      struct ath_tx_status *ts, int txok)
1976
{
S
Sujith 已提交
1977 1978 1979 1980 1981
	u16 seq_st = 0;
	u32 ba[WME_BA_BMP_SIZE >> 5];
	int ba_index;
	int nbad = 0;
	int isaggr = 0;
1982

1983
	if (bf->bf_lastbf->bf_tx_aborted)
S
Sujith 已提交
1984
		return 0;
1985

S
Sujith 已提交
1986 1987
	isaggr = bf_isaggr(bf);
	if (isaggr) {
1988 1989
		seq_st = ts->ts_seqnum;
		memcpy(ba, &ts->ba_low, WME_BA_BMP_SIZE >> 3);
S
Sujith 已提交
1990
	}
1991

S
Sujith 已提交
1992 1993 1994 1995 1996 1997 1998
	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;
	}
1999

S
Sujith 已提交
2000 2001
	return nbad;
}
2002

2003
static void ath_tx_rc_status(struct ath_buf *bf, struct ath_tx_status *ts,
2004
			     int nbad, int txok, bool update_rc)
2005
{
S
Sujith 已提交
2006
	struct sk_buff *skb = bf->bf_mpdu;
2007
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
S
Sujith 已提交
2008
	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
F
Felix Fietkau 已提交
2009
	struct ieee80211_hw *hw = bf->aphy->hw;
2010
	u8 i, tx_rateindex;
2011

S
Sujith 已提交
2012
	if (txok)
2013
		tx_info->status.ack_signal = ts->ts_rssi;
S
Sujith 已提交
2014

2015
	tx_rateindex = ts->ts_rateindex;
2016 2017
	WARN_ON(tx_rateindex >= hw->max_rates);

2018
	if (ts->ts_status & ATH9K_TXERR_FILT)
S
Sujith 已提交
2019
		tx_info->flags |= IEEE80211_TX_STAT_TX_FILTERED;
2020 2021
	if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && update_rc)
		tx_info->flags |= IEEE80211_TX_STAT_AMPDU;
2022

2023
	if ((ts->ts_status & ATH9K_TXERR_FILT) == 0 &&
2024
	    (bf->bf_flags & ATH9K_TXDESC_NOACK) == 0 && update_rc) {
2025
		if (ieee80211_is_data(hdr->frame_control)) {
2026
			if (ts->ts_flags &
F
Felix Fietkau 已提交
2027 2028
			    (ATH9K_TX_DATA_UNDERRUN | ATH9K_TX_DELIM_UNDERRUN))
				tx_info->pad[0] |= ATH_TX_INFO_UNDERRUN;
2029 2030
			if ((ts->ts_status & ATH9K_TXERR_XRETRY) ||
			    (ts->ts_status & ATH9K_TXERR_FIFO))
F
Felix Fietkau 已提交
2031 2032 2033
				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 已提交
2034
		}
2035
	}
2036

2037
	for (i = tx_rateindex + 1; i < hw->max_rates; i++) {
2038
		tx_info->status.rates[i].count = 0;
2039 2040
		tx_info->status.rates[i].idx = -1;
	}
2041 2042

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

2045 2046 2047 2048 2049
static void ath_wake_mac80211_queue(struct ath_softc *sc, struct ath_txq *txq)
{
	int qnum;

	spin_lock_bh(&txq->axq_lock);
2050
	if (txq->stopped && txq->pending_frames < ATH_MAX_QDEPTH) {
2051
		qnum = ath_get_mac80211_qnum(txq->axq_class, sc);
2052
		if (qnum != -1) {
2053
			ath_mac80211_start_queue(sc, qnum);
2054 2055 2056 2057 2058 2059
			txq->stopped = 0;
		}
	}
	spin_unlock_bh(&txq->axq_lock);
}

S
Sujith 已提交
2060
static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq)
2061
{
2062
	struct ath_hw *ah = sc->sc_ah;
2063
	struct ath_common *common = ath9k_hw_common(ah);
S
Sujith 已提交
2064
	struct ath_buf *bf, *lastbf, *bf_held = NULL;
2065
	struct list_head bf_head;
S
Sujith 已提交
2066
	struct ath_desc *ds;
2067
	struct ath_tx_status ts;
2068
	int txok;
S
Sujith 已提交
2069
	int status;
2070

2071 2072 2073
	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);
2074 2075 2076 2077 2078 2079 2080 2081 2082 2083

	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 已提交
2084 2085 2086 2087 2088 2089 2090 2091 2092
		/*
		 * 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 已提交
2093
		if (bf->bf_stale) {
S
Sujith 已提交
2094 2095
			bf_held = bf;
			if (list_is_last(&bf_held->list, &txq->axq_q)) {
2096
				spin_unlock_bh(&txq->axq_lock);
S
Sujith 已提交
2097 2098 2099
				break;
			} else {
				bf = list_entry(bf_held->list.next,
2100
						struct ath_buf, list);
S
Sujith 已提交
2101
			}
2102 2103 2104
		}

		lastbf = bf->bf_lastbf;
S
Sujith 已提交
2105
		ds = lastbf->bf_desc;
2106

2107 2108
		memset(&ts, 0, sizeof(ts));
		status = ath9k_hw_txprocdesc(ah, ds, &ts);
S
Sujith 已提交
2109
		if (status == -EINPROGRESS) {
2110
			spin_unlock_bh(&txq->axq_lock);
S
Sujith 已提交
2111
			break;
2112 2113
		}

2114 2115 2116 2117 2118
		/*
		 * We now know the nullfunc frame has been ACKed so we
		 * can disable RX.
		 */
		if (bf->bf_isnullfunc &&
2119
		    (ts.ts_status & ATH9K_TX_ACKED)) {
2120 2121 2122
			if ((sc->ps_flags & PS_ENABLED))
				ath9k_enable_ps(sc);
			else
S
Sujith 已提交
2123
				sc->ps_flags |= PS_NULLFUNC_COMPLETED;
2124 2125
		}

S
Sujith 已提交
2126 2127 2128 2129 2130
		/*
		 * 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 已提交
2131
		lastbf->bf_stale = true;
S
Sujith 已提交
2132 2133 2134 2135
		INIT_LIST_HEAD(&bf_head);
		if (!list_is_singular(&lastbf->list))
			list_cut_position(&bf_head,
				&txq->axq_q, lastbf->list.prev);
2136

S
Sujith 已提交
2137
		txq->axq_depth--;
2138
		txok = !(ts.ts_status & ATH9K_TXERR_MASK);
2139
		txq->axq_tx_inprogress = false;
2140 2141
		if (bf_held)
			list_del(&bf_held->list);
S
Sujith 已提交
2142
		spin_unlock_bh(&txq->axq_lock);
2143

2144 2145
		if (bf_held)
			ath_tx_return_buffer(sc, bf_held);
2146

S
Sujith 已提交
2147 2148 2149 2150 2151
		if (!bf_isampdu(bf)) {
			/*
			 * This frame is sent out as a single frame.
			 * Use hardware retry status for this frame.
			 */
2152 2153
			bf->bf_retries = ts.ts_longretry;
			if (ts.ts_status & ATH9K_TXERR_XRETRY)
S
Sujith 已提交
2154
				bf->bf_state.bf_type |= BUF_XRETRY;
2155
			ath_tx_rc_status(bf, &ts, 0, txok, true);
S
Sujith 已提交
2156
		}
2157

S
Sujith 已提交
2158
		if (bf_isampdu(bf))
2159
			ath_tx_complete_aggr(sc, txq, bf, &bf_head, &ts, txok);
S
Sujith 已提交
2160
		else
2161
			ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, txok, 0);
2162

2163
		ath_wake_mac80211_queue(sc, txq);
2164

2165
		spin_lock_bh(&txq->axq_lock);
S
Sujith 已提交
2166 2167 2168
		if (sc->sc_flags & SC_OP_TXAGGR)
			ath_txq_schedule(sc, txq);
		spin_unlock_bh(&txq->axq_lock);
2169 2170 2171
	}
}

S
Sujith 已提交
2172
static void ath_tx_complete_poll_work(struct work_struct *work)
2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196
{
	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) {
2197 2198
		ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_RESET,
			  "tx hung, resetting the chip\n");
S
Sujith 已提交
2199
		ath9k_ps_wakeup(sc);
2200
		ath_reset(sc, false);
S
Sujith 已提交
2201
		ath9k_ps_restore(sc);
2202 2203
	}

2204
	ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work,
2205 2206 2207 2208
			msecs_to_jiffies(ATH_TX_COMPLETE_POLL_INT));
}


2209

S
Sujith 已提交
2210
void ath_tx_tasklet(struct ath_softc *sc)
2211
{
S
Sujith 已提交
2212 2213
	int i;
	u32 qcumask = ((1 << ATH9K_NUM_TX_QUEUES) - 1);
2214

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

S
Sujith 已提交
2217 2218 2219
	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]);
2220 2221 2222
	}
}

2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269
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);

2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280
		/*
		 * 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;
		}

2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293
		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);

2294 2295
		ath_wake_mac80211_queue(sc, txq);

2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309
		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 已提交
2310 2311 2312
/*****************/
/* Init, Cleanup */
/*****************/
2313

2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348
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 已提交
2349
int ath_tx_init(struct ath_softc *sc, int nbufs)
2350
{
2351
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
S
Sujith 已提交
2352
	int error = 0;
2353

2354
	spin_lock_init(&sc->tx.txbuflock);
2355

2356
	error = ath_descdma_setup(sc, &sc->tx.txdma, &sc->tx.txbuf,
2357
				  "tx", nbufs, 1, 1);
2358
	if (error != 0) {
2359 2360
		ath_print(common, ATH_DBG_FATAL,
			  "Failed to allocate tx descriptors: %d\n", error);
2361 2362
		goto err;
	}
2363

2364
	error = ath_descdma_setup(sc, &sc->beacon.bdma, &sc->beacon.bbuf,
2365
				  "beacon", ATH_BCBUF, 1, 1);
2366
	if (error != 0) {
2367 2368
		ath_print(common, ATH_DBG_FATAL,
			  "Failed to allocate beacon descriptors: %d\n", error);
2369 2370
		goto err;
	}
2371

2372 2373
	INIT_DELAYED_WORK(&sc->tx_complete_work, ath_tx_complete_poll_work);

2374 2375 2376 2377 2378 2379
	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) {
		error = ath_tx_edma_init(sc);
		if (error)
			goto err;
	}

2380
err:
S
Sujith 已提交
2381 2382
	if (error != 0)
		ath_tx_cleanup(sc);
2383

S
Sujith 已提交
2384
	return error;
2385 2386
}

2387
void ath_tx_cleanup(struct ath_softc *sc)
S
Sujith 已提交
2388 2389 2390 2391 2392 2393
{
	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);
2394 2395 2396

	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
		ath_tx_edma_cleanup(sc);
S
Sujith 已提交
2397
}
2398 2399 2400

void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an)
{
2401 2402 2403
	struct ath_atx_tid *tid;
	struct ath_atx_ac *ac;
	int tidno, acno;
2404

2405
	for (tidno = 0, tid = &an->tid[tidno];
2406 2407 2408 2409 2410 2411 2412 2413
	     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 已提交
2414
		tid->paused    = false;
2415
		tid->state &= ~AGGR_CLEANUP;
2416 2417
		INIT_LIST_HEAD(&tid->buf_q);
		acno = TID_TO_WME_AC(tidno);
2418
		tid->ac = &an->ac[acno];
2419 2420
		tid->state &= ~AGGR_ADDBA_COMPLETE;
		tid->state &= ~AGGR_ADDBA_PROGRESS;
2421
	}
2422

2423
	for (acno = 0, ac = &an->ac[acno];
2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444
	     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;
2445 2446 2447 2448
		}
	}
}

S
Sujith 已提交
2449
void ath_tx_node_cleanup(struct ath_softc *sc, struct ath_node *an)
2450 2451 2452 2453 2454
{
	int i;
	struct ath_atx_ac *ac, *ac_tmp;
	struct ath_atx_tid *tid, *tid_tmp;
	struct ath_txq *txq;
S
Sujith 已提交
2455

2456 2457
	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
		if (ATH_TXQ_SETUP(sc, i)) {
S
Sujith 已提交
2458
			txq = &sc->tx.txq[i];
2459

2460
			spin_lock_bh(&txq->axq_lock);
2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474

			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 已提交
2475
					ath_tid_drain(sc, txq, tid);
2476 2477
					tid->state &= ~AGGR_ADDBA_COMPLETE;
					tid->state &= ~AGGR_CLEANUP;
2478 2479 2480
				}
			}

2481
			spin_unlock_bh(&txq->axq_lock);
2482 2483 2484
		}
	}
}