tx.c 25.4 KB
Newer Older
L
Luciano Coelho 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/*
 * This file is part of wl1271
 *
 * Copyright (C) 2009 Nokia Corporation
 *
 * Contact: Luciano Coelho <luciano.coelho@nokia.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 *
 */

#include <linux/kernel.h>
#include <linux/module.h>
26
#include <linux/etherdevice.h>
L
Luciano Coelho 已提交
27

S
Shahar Levi 已提交
28 29 30 31 32
#include "wl12xx.h"
#include "io.h"
#include "reg.h"
#include "ps.h"
#include "tx.h"
L
Luciano Coelho 已提交
33

34 35 36 37 38 39
static int wl1271_set_default_wep_key(struct wl1271 *wl, u8 id)
{
	int ret;
	bool is_ap = (wl->bss_type == BSS_TYPE_AP_BSS);

	if (is_ap)
E
Eliad Peller 已提交
40
		ret = wl12xx_cmd_set_default_wep_key(wl, id,
41
						     wl->ap_bcast_hlid);
42
	else
E
Eliad Peller 已提交
43
		ret = wl12xx_cmd_set_default_wep_key(wl, id, wl->sta_hlid);
44 45 46 47 48 49 50 51

	if (ret < 0)
		return ret;

	wl1271_debug(DEBUG_CRYPT, "default wep key idx: %d", (int)id);
	return 0;
}

52
static int wl1271_alloc_tx_id(struct wl1271 *wl, struct sk_buff *skb)
L
Luciano Coelho 已提交
53
{
54 55 56 57 58 59 60 61 62 63 64
	int id;

	id = find_first_zero_bit(wl->tx_frames_map, ACX_TX_DESCRIPTORS);
	if (id >= ACX_TX_DESCRIPTORS)
		return -EBUSY;

	__set_bit(id, wl->tx_frames_map);
	wl->tx_frames[id] = skb;
	wl->tx_frames_cnt++;
	return id;
}
L
Luciano Coelho 已提交
65

66 67 68
static void wl1271_free_tx_id(struct wl1271 *wl, int id)
{
	if (__test_and_clear_bit(id, wl->tx_frames_map)) {
69 70 71
		if (unlikely(wl->tx_frames_cnt == ACX_TX_DESCRIPTORS))
			clear_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);

72 73 74
		wl->tx_frames[id] = NULL;
		wl->tx_frames_cnt--;
	}
L
Luciano Coelho 已提交
75 76
}

O
Ohad Ben-Cohen 已提交
77 78 79 80
static int wl1271_tx_update_filters(struct wl1271 *wl,
						 struct sk_buff *skb)
{
	struct ieee80211_hdr *hdr;
81
	int ret;
O
Ohad Ben-Cohen 已提交
82 83 84 85 86 87 88 89 90 91 92 93 94

	hdr = (struct ieee80211_hdr *)(skb->data +
				       sizeof(struct wl1271_tx_hw_descr));

	/*
	 * stop bssid-based filtering before transmitting authentication
	 * requests. this way the hw will never drop authentication
	 * responses coming from BSSIDs it isn't familiar with (e.g. on
	 * roaming)
	 */
	if (!ieee80211_is_auth(hdr->frame_control))
		return 0;

95 96 97 98 99 100 101 102 103 104 105 106
	if (wl->dev_hlid != WL12XX_INVALID_LINK_ID)
		goto out;

	wl1271_debug(DEBUG_CMD, "starting device role for roaming");
	ret = wl12xx_cmd_role_start_dev(wl);
	if (ret < 0)
		goto out;

	ret = wl12xx_roc(wl, wl->dev_role_id);
	if (ret < 0)
		goto out;
out:
E
Eliad Peller 已提交
107
	return 0;
O
Ohad Ben-Cohen 已提交
108 109
}

110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
static void wl1271_tx_ap_update_inconnection_sta(struct wl1271 *wl,
						 struct sk_buff *skb)
{
	struct ieee80211_hdr *hdr;

	/*
	 * add the station to the known list before transmitting the
	 * authentication response. this way it won't get de-authed by FW
	 * when transmitting too soon.
	 */
	hdr = (struct ieee80211_hdr *)(skb->data +
				       sizeof(struct wl1271_tx_hw_descr));
	if (ieee80211_is_auth(hdr->frame_control))
		wl1271_acx_set_inconnection_sta(wl, hdr->addr1);
}

126 127 128
static void wl1271_tx_regulate_link(struct wl1271 *wl, u8 hlid)
{
	bool fw_ps;
129
	u8 tx_pkts;
130 131 132 133 134 135

	/* only regulate station links */
	if (hlid < WL1271_AP_STA_HLID_START)
		return;

	fw_ps = test_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map);
136
	tx_pkts = wl->links[hlid].allocated_pkts;
137 138 139 140 141

	/*
	 * if in FW PS and there is enough data in FW we can put the link
	 * into high-level PS and clean out its TX queues.
	 */
142
	if (fw_ps && tx_pkts >= WL1271_PS_STA_MAX_PACKETS)
143 144 145
		wl1271_ps_link_start(wl, hlid, true);
}

E
Eliad Peller 已提交
146 147 148 149 150 151
static bool wl12xx_is_dummy_packet(struct wl1271 *wl, struct sk_buff *skb)
{
	return wl->dummy_packet == skb;
}

u8 wl12xx_tx_get_hlid_ap(struct wl1271 *wl, struct sk_buff *skb)
152 153 154 155 156 157 158 159 160 161 162 163
{
	struct ieee80211_tx_info *control = IEEE80211_SKB_CB(skb);

	if (control->control.sta) {
		struct wl1271_station *wl_sta;

		wl_sta = (struct wl1271_station *)
				control->control.sta->drv_priv;
		return wl_sta->hlid;
	} else {
		struct ieee80211_hdr *hdr;

E
Eliad Peller 已提交
164 165 166
		if (!test_bit(WL1271_FLAG_AP_STARTED, &wl->flags))
			return wl->system_hlid;

167 168
		hdr = (struct ieee80211_hdr *)skb->data;
		if (ieee80211_is_mgmt(hdr->frame_control))
169
			return wl->ap_global_hlid;
170
		else
171
			return wl->ap_bcast_hlid;
172 173 174
	}
}

E
Eliad Peller 已提交
175 176 177 178 179 180 181 182
static u8 wl1271_tx_get_hlid(struct wl1271 *wl, struct sk_buff *skb)
{
	if (wl12xx_is_dummy_packet(wl, skb))
		return wl->system_hlid;

	if (wl->bss_type == BSS_TYPE_AP_BSS)
		return wl12xx_tx_get_hlid_ap(wl, skb);

E
Eliad Peller 已提交
183 184
	if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags) ||
	    test_bit(WL1271_FLAG_IBSS_JOINED, &wl->flags))
E
Eliad Peller 已提交
185 186 187 188 189
		return wl->sta_hlid;
	else
		return wl->dev_hlid;
}

190 191 192 193 194 195 196 197 198
static unsigned int wl12xx_calc_packet_alignment(struct wl1271 *wl,
						unsigned int packet_length)
{
	if (wl->quirks & WL12XX_QUIRK_BLOCKSIZE_ALIGNMENT)
		return ALIGN(packet_length, WL12XX_BUS_BLOCK_SIZE);
	else
		return ALIGN(packet_length, WL1271_TX_ALIGN_TO);
}

199
static int wl1271_tx_allocate(struct wl1271 *wl, struct sk_buff *skb, u32 extra,
200
				u32 buf_offset, u8 hlid)
L
Luciano Coelho 已提交
201 202 203
{
	struct wl1271_tx_hw_descr *desc;
	u32 total_len = skb->len + sizeof(struct wl1271_tx_hw_descr) + extra;
204
	u32 len;
205
	u32 total_blocks;
206
	int id, ret = -EBUSY, ac;
207
	u32 spare_blocks = wl->tx_spare_blocks;
L
Luciano Coelho 已提交
208

209
	if (buf_offset + total_len > WL1271_AGGR_BUFFER_SIZE)
I
Ido Yariv 已提交
210
		return -EAGAIN;
211

L
Luciano Coelho 已提交
212
	/* allocate free identifier for the packet */
213
	id = wl1271_alloc_tx_id(wl, skb);
L
Luciano Coelho 已提交
214 215 216 217 218
	if (id < 0)
		return id;

	/* approximate the number of blocks required for this packet
	   in the firmware */
219
	len = wl12xx_calc_packet_alignment(wl, total_len);
220

221 222 223 224
	/* in case of a dummy packet, use default amount of spare mem blocks */
	if (unlikely(wl12xx_is_dummy_packet(wl, skb)))
		spare_blocks = TX_HW_BLOCK_SPARE_DEFAULT;

225
	total_blocks = (len + TX_HW_BLOCK_SIZE - 1) / TX_HW_BLOCK_SIZE +
226
		spare_blocks;
227

L
Luciano Coelho 已提交
228 229 230 231
	if (total_blocks <= wl->tx_blocks_available) {
		desc = (struct wl1271_tx_hw_descr *)skb_push(
			skb, total_len - skb->len);

232 233 234 235
		/* HW descriptor fields change between wl127x and wl128x */
		if (wl->chip.id == CHIP_ID_1283_PG20) {
			desc->wl128x_mem.total_mem_blocks = total_blocks;
		} else {
236
			desc->wl127x_mem.extra_blocks = spare_blocks;
237 238 239
			desc->wl127x_mem.total_mem_blocks = total_blocks;
		}

L
Luciano Coelho 已提交
240 241 242
		desc->id = id;

		wl->tx_blocks_available -= total_blocks;
243
		wl->tx_allocated_blocks += total_blocks;
L
Luciano Coelho 已提交
244

245 246
		ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
		wl->tx_allocated_pkts[ac]++;
247

248 249 250
		if (wl->bss_type == BSS_TYPE_AP_BSS &&
		    hlid >= WL1271_AP_STA_HLID_START)
			wl->links[hlid].allocated_pkts++;
251

L
Luciano Coelho 已提交
252 253 254 255 256
		ret = 0;

		wl1271_debug(DEBUG_TX,
			     "tx_allocate: size: %d, blocks: %d, id: %d",
			     total_len, total_blocks, id);
257
	} else {
258
		wl1271_free_tx_id(wl, id);
259
	}
L
Luciano Coelho 已提交
260 261 262 263

	return ret;
}

264
static void wl1271_tx_fill_hdr(struct wl1271 *wl, struct sk_buff *skb,
265 266
			      u32 extra, struct ieee80211_tx_info *control,
			      u8 hlid)
L
Luciano Coelho 已提交
267
{
268
	struct timespec ts;
L
Luciano Coelho 已提交
269
	struct wl1271_tx_hw_descr *desc;
270
	int aligned_len, ac, rate_idx;
271
	s64 hosttime;
L
Luciano Coelho 已提交
272
	u16 tx_attr;
L
Luciano Coelho 已提交
273 274 275

	desc = (struct wl1271_tx_hw_descr *) skb->data;

276 277 278 279
	/* relocate space for security header */
	if (extra) {
		void *framestart = skb->data + sizeof(*desc);
		u16 fc = *(u16 *)(framestart + extra);
L
Luciano Coelho 已提交
280
		int hdrlen = ieee80211_hdrlen(cpu_to_le16(fc));
281 282 283
		memmove(framestart, framestart + extra, hdrlen);
	}

L
Luciano Coelho 已提交
284
	/* configure packet life time */
285 286 287
	getnstimeofday(&ts);
	hosttime = (timespec_to_ns(&ts) >> 10);
	desc->start_time = cpu_to_le32(hosttime - wl->time_offset);
288 289 290 291 292

	if (wl->bss_type != BSS_TYPE_AP_BSS)
		desc->life_time = cpu_to_le16(TX_HW_MGMT_PKT_LIFETIME_TU);
	else
		desc->life_time = cpu_to_le16(TX_HW_AP_MODE_PKT_LIFETIME_TU);
L
Luciano Coelho 已提交
293

294
	/* queue */
K
Kalle Valo 已提交
295
	ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
296
	desc->tid = skb->priority;
297

298
	if (wl12xx_is_dummy_packet(wl, skb)) {
299 300 301 302 303 304 305 306 307 308 309 310 311 312 313
		/*
		 * FW expects the dummy packet to have an invalid session id -
		 * any session id that is different than the one set in the join
		 */
		tx_attr = ((~wl->session_counter) <<
			   TX_HW_ATTR_OFST_SESSION_COUNTER) &
			   TX_HW_ATTR_SESSION_COUNTER;

		tx_attr |= TX_HW_ATTR_TX_DUMMY_REQ;
	} else {
		/* configure the tx attributes */
		tx_attr =
			wl->session_counter << TX_HW_ATTR_OFST_SESSION_COUNTER;
	}

E
Eliad Peller 已提交
314
	desc->hlid = hlid;
315

E
Eliad Peller 已提交
316
	if (wl->bss_type != BSS_TYPE_AP_BSS) {
317 318 319 320 321 322 323 324
		/* if the packets are destined for AP (have a STA entry)
		   send them with AP rate policies, otherwise use default
		   basic rates */
		if (control->control.sta)
			rate_idx = ACX_TX_AP_FULL_RATE;
		else
			rate_idx = ACX_TX_BASIC_RATE;
	} else {
325
		if (hlid == wl->ap_global_hlid)
326
			rate_idx = ACX_TX_AP_MODE_MGMT_RATE;
327
		else if (hlid == wl->ap_bcast_hlid)
328
			rate_idx = ACX_TX_AP_MODE_BCST_RATE;
329
		else
330 331 332 333
			rate_idx = ac;
	}

	tx_attr |= rate_idx << TX_HW_ATTR_OFST_RATE_POLICY;
L
Luciano Coelho 已提交
334 335
	desc->reserved = 0;

336
	aligned_len = wl12xx_calc_packet_alignment(wl, skb->len);
337

338
	if (wl->chip.id == CHIP_ID_1283_PG20) {
339 340
		desc->wl128x_mem.extra_bytes = aligned_len - skb->len;
		desc->length = cpu_to_le16(aligned_len >> 2);
341 342 343 344 345 346 347

		wl1271_debug(DEBUG_TX, "tx_fill_hdr: hlid: %d "
			     "tx_attr: 0x%x len: %d life: %d mem: %d",
			     desc->hlid, tx_attr,
			     le16_to_cpu(desc->length),
			     le16_to_cpu(desc->life_time),
			     desc->wl128x_mem.total_mem_blocks);
348 349 350
	} else {
		int pad;

351
		/* Store the aligned length in terms of words */
352 353 354 355 356
		desc->length = cpu_to_le16(aligned_len >> 2);

		/* calculate number of padding bytes */
		pad = aligned_len - skb->len;
		tx_attr |= pad << TX_HW_ATTR_OFST_LAST_WORD_PAD;
L
Luciano Coelho 已提交
357

358 359 360 361 362 363
		wl1271_debug(DEBUG_TX, "tx_fill_hdr: pad: %d hlid: %d "
			     "tx_attr: 0x%x len: %d life: %d mem: %d", pad,
			     desc->hlid, tx_attr,
			     le16_to_cpu(desc->length),
			     le16_to_cpu(desc->life_time),
			     desc->wl127x_mem.total_mem_blocks);
364
	}
L
Luciano Coelho 已提交
365 366

	desc->tx_attr = cpu_to_le16(tx_attr);
L
Luciano Coelho 已提交
367 368 369
}

/* caller must hold wl->mutex */
370 371
static int wl1271_prepare_tx_frame(struct wl1271 *wl, struct sk_buff *skb,
							u32 buf_offset)
L
Luciano Coelho 已提交
372 373 374 375
{
	struct ieee80211_tx_info *info;
	u32 extra = 0;
	int ret = 0;
376
	u32 total_len;
377
	u8 hlid;
L
Luciano Coelho 已提交
378 379 380 381 382 383 384

	if (!skb)
		return -EINVAL;

	info = IEEE80211_SKB_CB(skb);

	if (info->control.hw_key &&
385
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP)
L
Luciano Coelho 已提交
386 387 388
		extra = WL1271_TKIP_IV_SPACE;

	if (info->control.hw_key) {
389 390 391 392 393 394
		bool is_wep;
		u8 idx = info->control.hw_key->hw_key_idx;
		u32 cipher = info->control.hw_key->cipher;

		is_wep = (cipher == WLAN_CIPHER_SUITE_WEP40) ||
			 (cipher == WLAN_CIPHER_SUITE_WEP104);
L
Luciano Coelho 已提交
395

396 397
		if (unlikely(is_wep && wl->default_key != idx)) {
			ret = wl1271_set_default_wep_key(wl, idx);
L
Luciano Coelho 已提交
398 399
			if (ret < 0)
				return ret;
J
Juuso Oikarinen 已提交
400
			wl->default_key = idx;
L
Luciano Coelho 已提交
401 402 403
		}
	}

E
Eliad Peller 已提交
404
	hlid = wl1271_tx_get_hlid(wl, skb);
E
Eliad Peller 已提交
405 406 407 408
	if (hlid == WL12XX_INVALID_LINK_ID) {
		wl1271_error("invalid hlid. dropping skb 0x%p", skb);
		return -EINVAL;
	}
409 410

	ret = wl1271_tx_allocate(wl, skb, extra, buf_offset, hlid);
L
Luciano Coelho 已提交
411 412 413
	if (ret < 0)
		return ret;

414 415
	wl1271_tx_fill_hdr(wl, skb, extra, info, hlid);

416
	if (wl->bss_type == BSS_TYPE_AP_BSS) {
417
		wl1271_tx_ap_update_inconnection_sta(wl, skb);
418
		wl1271_tx_regulate_link(wl, hlid);
O
Ohad Ben-Cohen 已提交
419 420
	} else {
		wl1271_tx_update_filters(wl, skb);
421
	}
422

423
	/*
424 425 426 427 428 429
	 * The length of each packet is stored in terms of
	 * words. Thus, we must pad the skb data to make sure its
	 * length is aligned.  The number of padding bytes is computed
	 * and set in wl1271_tx_fill_hdr.
	 * In special cases, we want to align to a specific block size
	 * (eg. for wl128x with SDIO we align to 256).
430
	 */
431
	total_len = wl12xx_calc_packet_alignment(wl, skb->len);
432

433 434
	memcpy(wl->aggr_buf + buf_offset, skb->data, skb->len);
	memset(wl->aggr_buf + buf_offset + skb->len, 0, total_len - skb->len);
L
Luciano Coelho 已提交
435

436 437 438 439
	/* Revert side effects in the dummy packet skb, so it can be reused */
	if (wl12xx_is_dummy_packet(wl, skb))
		skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

440
	return total_len;
L
Luciano Coelho 已提交
441 442
}

443
u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set)
444 445 446 447 448 449 450 451 452 453 454 455
{
	struct ieee80211_supported_band *band;
	u32 enabled_rates = 0;
	int bit;

	band = wl->hw->wiphy->bands[wl->band];
	for (bit = 0; bit < band->n_bitrates; bit++) {
		if (rate_set & 0x1)
			enabled_rates |= band->bitrates[bit].hw_value;
		rate_set >>= 1;
	}

S
Shahar Levi 已提交
456
#ifdef CONFIG_WL12XX_HT
457 458 459 460 461 462 463 464 465 466
	/* MCS rates indication are on bits 16 - 23 */
	rate_set >>= HW_HT_RATES_OFFSET - band->n_bitrates;

	for (bit = 0; bit < 8; bit++) {
		if (rate_set & 0x1)
			enabled_rates |= (CONF_HW_BIT_RATE_MCS_0 << bit);
		rate_set >>= 1;
	}
#endif

467 468 469
	return enabled_rates;
}

470
void wl1271_handle_tx_low_watermark(struct wl1271 *wl)
471 472
{
	unsigned long flags;
473
	int i;
474

475 476
	for (i = 0; i < NUM_TX_QUEUES; i++) {
		if (test_bit(i, &wl->stopped_queues_map) &&
477
		    wl->tx_queue_count[i] <= WL1271_TX_QUEUE_LOW_WATERMARK) {
478 479 480 481 482 483 484
			/* firmware buffer has space, restart queues */
			spin_lock_irqsave(&wl->wl_lock, flags);
			ieee80211_wake_queue(wl->hw,
					     wl1271_tx_get_mac80211_queue(i));
			clear_bit(i, &wl->stopped_queues_map);
			spin_unlock_irqrestore(&wl->wl_lock, flags);
		}
485 486 487
	}
}

488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515
static struct sk_buff_head *wl1271_select_queue(struct wl1271 *wl,
						struct sk_buff_head *queues)
{
	int i, q = -1, ac;
	u32 min_pkts = 0xffffffff;

	/*
	 * Find a non-empty ac where:
	 * 1. There are packets to transmit
	 * 2. The FW has the least allocated blocks
	 *
	 * We prioritize the ACs according to VO>VI>BE>BK
	 */
	for (i = 0; i < NUM_TX_QUEUES; i++) {
		ac = wl1271_tx_get_queue(i);
		if (!skb_queue_empty(&queues[ac]) &&
		    (wl->tx_allocated_pkts[ac] < min_pkts)) {
			q = ac;
			min_pkts = wl->tx_allocated_pkts[q];
		}
	}

	if (q == -1)
		return NULL;

	return &queues[q];
}

516
static struct sk_buff *wl1271_sta_skb_dequeue(struct wl1271 *wl)
517 518 519
{
	struct sk_buff *skb = NULL;
	unsigned long flags;
520
	struct sk_buff_head *queue;
521

522 523
	queue = wl1271_select_queue(wl, wl->tx_queue);
	if (!queue)
524
		goto out;
525 526

	skb = skb_dequeue(queue);
527 528 529

out:
	if (skb) {
530
		int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
531
		spin_lock_irqsave(&wl->wl_lock, flags);
532
		wl->tx_queue_count[q]--;
533 534 535 536 537 538
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}

	return skb;
}

539 540 541 542 543
static struct sk_buff *wl1271_ap_skb_dequeue(struct wl1271 *wl)
{
	struct sk_buff *skb = NULL;
	unsigned long flags;
	int i, h, start_hlid;
544
	struct sk_buff_head *queue;
545 546 547 548 549 550 551 552

	/* start from the link after the last one */
	start_hlid = (wl->last_tx_hlid + 1) % AP_MAX_LINKS;

	/* dequeue according to AC, round robin on each link */
	for (i = 0; i < AP_MAX_LINKS; i++) {
		h = (start_hlid + i) % AP_MAX_LINKS;

553 554 555 556 557 558 559 560 561 562
		/* only consider connected stations */
		if (h >= WL1271_AP_STA_HLID_START &&
		    !test_bit(h - WL1271_AP_STA_HLID_START, wl->ap_hlid_map))
			continue;

		queue = wl1271_select_queue(wl, wl->links[h].tx_queue);
		if (!queue)
			continue;

		skb = skb_dequeue(queue);
563
		if (skb)
564
			break;
565 566 567
	}

	if (skb) {
568
		int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
569 570
		wl->last_tx_hlid = h;
		spin_lock_irqsave(&wl->wl_lock, flags);
571
		wl->tx_queue_count[q]--;
572 573 574 575 576 577 578 579 580 581
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	} else {
		wl->last_tx_hlid = 0;
	}

	return skb;
}

static struct sk_buff *wl1271_skb_dequeue(struct wl1271 *wl)
{
582 583 584
	unsigned long flags;
	struct sk_buff *skb = NULL;

585
	if (wl->bss_type == BSS_TYPE_AP_BSS)
586 587 588
		skb = wl1271_ap_skb_dequeue(wl);
	else
		skb = wl1271_sta_skb_dequeue(wl);
589

590 591
	if (!skb &&
	    test_and_clear_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags)) {
592 593
		int q;

594
		skb = wl->dummy_packet;
595
		q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
596
		spin_lock_irqsave(&wl->wl_lock, flags);
597
		wl->tx_queue_count[q]--;
598 599 600 601
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}

	return skb;
602 603
}

604 605 606 607 608
static void wl1271_skb_queue_head(struct wl1271 *wl, struct sk_buff *skb)
{
	unsigned long flags;
	int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));

609 610 611
	if (wl12xx_is_dummy_packet(wl, skb)) {
		set_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags);
	} else if (wl->bss_type == BSS_TYPE_AP_BSS) {
E
Eliad Peller 已提交
612
		u8 hlid = wl1271_tx_get_hlid(wl, skb);
613 614 615 616 617 618 619 620
		skb_queue_head(&wl->links[hlid].tx_queue[q], skb);

		/* make sure we dequeue the same packet next time */
		wl->last_tx_hlid = (hlid + AP_MAX_LINKS - 1) % AP_MAX_LINKS;
	} else {
		skb_queue_head(&wl->tx_queue[q], skb);
	}

621
	spin_lock_irqsave(&wl->wl_lock, flags);
622
	wl->tx_queue_count[q]++;
623 624 625
	spin_unlock_irqrestore(&wl->wl_lock, flags);
}

626 627 628 629 630 631 632
static bool wl1271_tx_is_data_present(struct sk_buff *skb)
{
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data);

	return ieee80211_is_data_present(hdr->frame_control);
}

I
Ido Yariv 已提交
633
void wl1271_tx_work_locked(struct wl1271 *wl)
L
Luciano Coelho 已提交
634 635
{
	struct sk_buff *skb;
I
Ido Yariv 已提交
636 637
	u32 buf_offset = 0;
	bool sent_packets = false;
638 639
	bool had_data = false;
	bool is_ap = (wl->bss_type == BSS_TYPE_AP_BSS);
L
Luciano Coelho 已提交
640 641 642
	int ret;

	if (unlikely(wl->state == WL1271_STATE_OFF))
643
		return;
L
Luciano Coelho 已提交
644

645
	while ((skb = wl1271_skb_dequeue(wl))) {
646 647 648
		if (wl1271_tx_is_data_present(skb))
			had_data = true;

649
		ret = wl1271_prepare_tx_frame(wl, skb, buf_offset);
I
Ido Yariv 已提交
650
		if (ret == -EAGAIN) {
651
			/*
I
Ido Yariv 已提交
652 653 654
			 * Aggregation buffer is full.
			 * Flush buffer and try again.
			 */
655
			wl1271_skb_queue_head(wl, skb);
I
Ido Yariv 已提交
656
			wl1271_write(wl, WL1271_SLV_MEM_DATA, wl->aggr_buf,
657
				     buf_offset, true);
I
Ido Yariv 已提交
658 659 660 661 662 663
			sent_packets = true;
			buf_offset = 0;
			continue;
		} else if (ret == -EBUSY) {
			/*
			 * Firmware buffer is full.
664 665
			 * Queue back last skb, and stop aggregating.
			 */
666
			wl1271_skb_queue_head(wl, skb);
I
Ido Yariv 已提交
667 668
			/* No work left, avoid scheduling redundant tx work */
			set_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
669
			goto out_ack;
L
Luciano Coelho 已提交
670 671
		} else if (ret < 0) {
			dev_kfree_skb(skb);
672
			goto out_ack;
L
Luciano Coelho 已提交
673
		}
674 675
		buf_offset += ret;
		wl->tx_packets_count++;
L
Luciano Coelho 已提交
676 677
	}

678
out_ack:
679 680 681
	if (buf_offset) {
		wl1271_write(wl, WL1271_SLV_MEM_DATA, wl->aggr_buf,
				buf_offset, true);
I
Ido Yariv 已提交
682 683 684
		sent_packets = true;
	}
	if (sent_packets) {
685 686 687 688 689 690 691 692
		/*
		 * Interrupt the firmware with the new packets. This is only
		 * required for older hardware revisions
		 */
		if (wl->quirks & WL12XX_QUIRK_END_OF_TRANSACTION)
			wl1271_write32(wl, WL1271_HOST_WR_ACCESS,
				       wl->tx_packets_count);

693
		wl1271_handle_tx_low_watermark(wl);
694
	}
695 696 697 698 699 700 701 702 703 704 705 706 707
	if (!is_ap && wl->conf.rx_streaming.interval && had_data &&
	    (wl->conf.rx_streaming.always ||
	     test_bit(WL1271_FLAG_SOFT_GEMINI, &wl->flags))) {
		u32 timeout = wl->conf.rx_streaming.duration;

		/* enable rx streaming */
		if (!test_bit(WL1271_FLAG_RX_STREAMING_STARTED, &wl->flags))
			ieee80211_queue_work(wl->hw,
					     &wl->rx_streaming_enable_work);

		mod_timer(&wl->rx_streaming_timer,
			  jiffies + msecs_to_jiffies(timeout));
	}
I
Ido Yariv 已提交
708
}
L
Luciano Coelho 已提交
709

I
Ido Yariv 已提交
710 711 712
void wl1271_tx_work(struct work_struct *work)
{
	struct wl1271 *wl = container_of(work, struct wl1271, tx_work);
713
	int ret;
I
Ido Yariv 已提交
714 715

	mutex_lock(&wl->mutex);
716 717 718 719
	ret = wl1271_ps_elp_wakeup(wl);
	if (ret < 0)
		goto out;

I
Ido Yariv 已提交
720
	wl1271_tx_work_locked(wl);
721

722
	wl1271_ps_elp_sleep(wl);
723
out:
L
Luciano Coelho 已提交
724 725 726 727 728 729 730 731 732
	mutex_unlock(&wl->mutex);
}

static void wl1271_tx_complete_packet(struct wl1271 *wl,
				      struct wl1271_tx_hw_res_descr *result)
{
	struct ieee80211_tx_info *info;
	struct sk_buff *skb;
	int id = result->id;
J
Juuso Oikarinen 已提交
733 734
	int rate = -1;
	u8 retries = 0;
L
Luciano Coelho 已提交
735 736

	/* check for id legality */
737
	if (unlikely(id >= ACX_TX_DESCRIPTORS || wl->tx_frames[id] == NULL)) {
L
Luciano Coelho 已提交
738 739 740 741 742 743 744
		wl1271_warning("TX result illegal id: %d", id);
		return;
	}

	skb = wl->tx_frames[id];
	info = IEEE80211_SKB_CB(skb);

745
	if (wl12xx_is_dummy_packet(wl, skb)) {
746 747 748 749
		wl1271_free_tx_id(wl, id);
		return;
	}

J
Juuso Oikarinen 已提交
750 751 752
	/* update the TX status info */
	if (result->status == TX_SUCCESS) {
		if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
L
Luciano Coelho 已提交
753
			info->flags |= IEEE80211_TX_STAT_ACK;
754
		rate = wl1271_rate_to_idx(result->rate_class_index, wl->band);
J
Juuso Oikarinen 已提交
755 756 757 758
		retries = result->ack_failures;
	} else if (result->status == TX_RETRY_EXCEEDED) {
		wl->stats.excessive_retries++;
		retries = result->ack_failures;
L
Luciano Coelho 已提交
759 760
	}

J
Juuso Oikarinen 已提交
761 762 763 764 765
	info->status.rates[0].idx = rate;
	info->status.rates[0].count = retries;
	info->status.rates[0].flags = 0;
	info->status.ack_signal = -1;

L
Luciano Coelho 已提交
766 767
	wl->stats.retry_count += result->ack_failures;

768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785
	/*
	 * update sequence number only when relevant, i.e. only in
	 * sessions of TKIP, AES and GEM (not in open or WEP sessions)
	 */
	if (info->control.hw_key &&
	    (info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP ||
	     info->control.hw_key->cipher == WLAN_CIPHER_SUITE_CCMP ||
	     info->control.hw_key->cipher == WL1271_CIPHER_SUITE_GEM)) {
		u8 fw_lsb = result->tx_security_sequence_number_lsb;
		u8 cur_lsb = wl->tx_security_last_seq_lsb;

		/*
		 * update security sequence number, taking care of potential
		 * wrap-around
		 */
		wl->tx_security_seq += (fw_lsb - cur_lsb + 256) % 256;
		wl->tx_security_last_seq_lsb = fw_lsb;
	}
786

787 788 789 790
	/* remove private header from packet */
	skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

	/* remove TKIP header space if present */
L
Luciano Coelho 已提交
791
	if (info->control.hw_key &&
792
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) {
793 794 795 796
		int hdrlen = ieee80211_get_hdrlen_from_skb(skb);
		memmove(skb->data + WL1271_TKIP_IV_SPACE, skb->data, hdrlen);
		skb_pull(skb, WL1271_TKIP_IV_SPACE);
	}
L
Luciano Coelho 已提交
797 798 799 800 801 802 803

	wl1271_debug(DEBUG_TX, "tx status id %u skb 0x%p failures %u rate 0x%x"
		     " status 0x%x",
		     result->id, skb, result->ack_failures,
		     result->rate_class_index, result->status);

	/* return the packet to the stack */
804
	skb_queue_tail(&wl->deferred_tx_queue, skb);
805
	queue_work(wl->freezable_wq, &wl->netstack_work);
806
	wl1271_free_tx_id(wl, result->id);
L
Luciano Coelho 已提交
807 808 809
}

/* Called upon reception of a TX complete interrupt */
810
void wl1271_tx_complete(struct wl1271 *wl)
L
Luciano Coelho 已提交
811 812 813
{
	struct wl1271_acx_mem_map *memmap =
		(struct wl1271_acx_mem_map *)wl->target_mem_map;
814
	u32 count, fw_counter;
L
Luciano Coelho 已提交
815 816 817
	u32 i;

	/* read the tx results from the chipset */
T
Teemu Paasikivi 已提交
818 819
	wl1271_read(wl, le32_to_cpu(memmap->tx_result),
		    wl->tx_res_if, sizeof(*wl->tx_res_if), false);
820 821 822 823 824 825 826 827
	fw_counter = le32_to_cpu(wl->tx_res_if->tx_result_fw_counter);

	/* write host counter to chipset (to ack) */
	wl1271_write32(wl, le32_to_cpu(memmap->tx_result) +
		       offsetof(struct wl1271_tx_hw_res_if,
				tx_result_host_counter), fw_counter);

	count = fw_counter - wl->tx_results_count;
828
	wl1271_debug(DEBUG_TX, "tx_complete received, packets: %d", count);
L
Luciano Coelho 已提交
829 830

	/* verify that the result buffer is not getting overrun */
831
	if (unlikely(count > TX_HW_RESULT_QUEUE_LEN))
L
Luciano Coelho 已提交
832 833 834 835 836 837 838 839 840 841 842 843 844 845 846
		wl1271_warning("TX result overflow from chipset: %d", count);

	/* process the results */
	for (i = 0; i < count; i++) {
		struct wl1271_tx_hw_res_descr *result;
		u8 offset = wl->tx_results_count & TX_HW_RESULT_QUEUE_LEN_MASK;

		/* process the packet */
		result =  &(wl->tx_res_if->tx_results_queue[offset]);
		wl1271_tx_complete_packet(wl, result);

		wl->tx_results_count++;
	}
}

847 848 849
void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid)
{
	struct sk_buff *skb;
850
	int i;
851
	unsigned long flags;
852
	struct ieee80211_tx_info *info;
853
	int total[NUM_TX_QUEUES];
854 855

	for (i = 0; i < NUM_TX_QUEUES; i++) {
856
		total[i] = 0;
857 858
		while ((skb = skb_dequeue(&wl->links[hlid].tx_queue[i]))) {
			wl1271_debug(DEBUG_TX, "link freeing skb 0x%p", skb);
859 860 861 862 863 864 865 866

			if (!wl12xx_is_dummy_packet(wl, skb)) {
				info = IEEE80211_SKB_CB(skb);
				info->status.rates[0].idx = -1;
				info->status.rates[0].count = 0;
				ieee80211_tx_status_ni(wl->hw, skb);
			}

867
			total[i]++;
868 869 870 871
		}
	}

	spin_lock_irqsave(&wl->wl_lock, flags);
872 873
	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] -= total[i];
874 875 876 877 878
	spin_unlock_irqrestore(&wl->wl_lock, flags);

	wl1271_handle_tx_low_watermark(wl);
}

879 880
/* caller must hold wl->mutex and TX must be stopped */
void wl1271_tx_reset(struct wl1271 *wl, bool reset_tx_queues)
L
Luciano Coelho 已提交
881 882 883
{
	int i;
	struct sk_buff *skb;
884
	struct ieee80211_tx_info *info;
L
Luciano Coelho 已提交
885 886

	/* TX failure */
887
	if (wl->bss_type == BSS_TYPE_AP_BSS) {
888
		for (i = 0; i < AP_MAX_LINKS; i++) {
889
			wl1271_tx_reset_link_queues(wl, i);
890 891
			wl->links[i].allocated_pkts = 0;
			wl->links[i].prev_freed_pkts = 0;
892
		}
893 894 895 896 897 898 899

		wl->last_tx_hlid = 0;
	} else {
		for (i = 0; i < NUM_TX_QUEUES; i++) {
			while ((skb = skb_dequeue(&wl->tx_queue[i]))) {
				wl1271_debug(DEBUG_TX, "freeing skb 0x%p",
					     skb);
900

901
				if (!wl12xx_is_dummy_packet(wl, skb)) {
902 903 904
					info = IEEE80211_SKB_CB(skb);
					info->status.rates[0].idx = -1;
					info->status.rates[0].count = 0;
905
					ieee80211_tx_status_ni(wl->hw, skb);
906
				}
907
			}
908
			wl->tx_queue_count[i] = 0;
909
		}
L
Luciano Coelho 已提交
910
	}
911

912
	wl->stopped_queues_map = 0;
L
Luciano Coelho 已提交
913

914 915 916
	/*
	 * Make sure the driver is at a consistent state, in case this
	 * function is called from a context other than interface removal.
917
	 * This call will always wake the TX queues.
918
	 */
919 920
	if (reset_tx_queues)
		wl1271_handle_tx_low_watermark(wl);
921

922 923 924 925 926 927 928 929
	for (i = 0; i < ACX_TX_DESCRIPTORS; i++) {
		if (wl->tx_frames[i] == NULL)
			continue;

		skb = wl->tx_frames[i];
		wl1271_free_tx_id(wl, i);
		wl1271_debug(DEBUG_TX, "freeing skb 0x%p", skb);

930
		if (!wl12xx_is_dummy_packet(wl, skb)) {
931 932 933 934 935 936 937 938 939 940 941 942 943 944
			/*
			 * Remove private headers before passing the skb to
			 * mac80211
			 */
			info = IEEE80211_SKB_CB(skb);
			skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));
			if (info->control.hw_key &&
			    info->control.hw_key->cipher ==
			    WLAN_CIPHER_SUITE_TKIP) {
				int hdrlen = ieee80211_get_hdrlen_from_skb(skb);
				memmove(skb->data + WL1271_TKIP_IV_SPACE,
					skb->data, hdrlen);
				skb_pull(skb, WL1271_TKIP_IV_SPACE);
			}
945

946 947
			info->status.rates[0].idx = -1;
			info->status.rates[0].count = 0;
948

949
			ieee80211_tx_status_ni(wl->hw, skb);
950
		}
951
	}
952 953 954 955 956 957 958 959 960 961 962 963
}

#define WL1271_TX_FLUSH_TIMEOUT 500000

/* caller must *NOT* hold wl->mutex */
void wl1271_tx_flush(struct wl1271 *wl)
{
	unsigned long timeout;
	timeout = jiffies + usecs_to_jiffies(WL1271_TX_FLUSH_TIMEOUT);

	while (!time_after(jiffies, timeout)) {
		mutex_lock(&wl->mutex);
964
		wl1271_debug(DEBUG_TX, "flushing tx buffer: %d %d",
965 966 967 968
			     wl->tx_frames_cnt,
			     wl1271_tx_total_queue_count(wl));
		if ((wl->tx_frames_cnt == 0) &&
		    (wl1271_tx_total_queue_count(wl) == 0)) {
969 970 971 972 973 974 975 976
			mutex_unlock(&wl->mutex);
			return;
		}
		mutex_unlock(&wl->mutex);
		msleep(1);
	}

	wl1271_warning("Unable to flush all TX buffers, timed out.");
L
Luciano Coelho 已提交
977
}
A
Arik Nemtsov 已提交
978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995

u32 wl1271_tx_min_rate_get(struct wl1271 *wl)
{
	int i;
	u32 rate = 0;

	if (!wl->basic_rate_set) {
		WARN_ON(1);
		wl->basic_rate_set = wl->conf.tx.basic_rate;
	}

	for (i = 0; !rate; i++) {
		if ((wl->basic_rate_set >> i) & 0x1)
			rate = 1 << i;
	}

	return rate;
}