tx.c 20.9 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 40 41 42 43 44 45 46 47 48 49 50
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)
		ret = wl1271_cmd_set_ap_default_wep_key(wl, id);
	else
		ret = wl1271_cmd_set_sta_default_wep_key(wl, id);

	if (ret < 0)
		return ret;

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

51
static int wl1271_alloc_tx_id(struct wl1271 *wl, struct sk_buff *skb)
L
Luciano Coelho 已提交
52
{
53 54 55 56 57 58 59 60 61 62 63
	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 已提交
64

65 66 67 68 69 70
static void wl1271_free_tx_id(struct wl1271 *wl, int id)
{
	if (__test_and_clear_bit(id, wl->tx_frames_map)) {
		wl->tx_frames[id] = NULL;
		wl->tx_frames_cnt--;
	}
L
Luciano Coelho 已提交
71 72
}

73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
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);
}

89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
static void wl1271_tx_regulate_link(struct wl1271 *wl, u8 hlid)
{
	bool fw_ps;
	u8 tx_blks;

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

	fw_ps = test_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map);
	tx_blks = wl->links[hlid].allocated_blks;

	/*
	 * 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.
	 */
	if (fw_ps && tx_blks >= WL1271_PS_STA_MAX_BLOCKS)
		wl1271_ps_link_start(wl, hlid, true);
}

109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
u8 wl1271_tx_get_hlid(struct sk_buff *skb)
{
	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;

		hdr = (struct ieee80211_hdr *)skb->data;
		if (ieee80211_is_mgmt(hdr->frame_control))
			return WL1271_AP_GLOBAL_HLID;
		else
			return WL1271_AP_BROADCAST_HLID;
	}
}

130
static int wl1271_tx_allocate(struct wl1271 *wl, struct sk_buff *skb, u32 extra,
131
				u32 buf_offset, u8 hlid)
L
Luciano Coelho 已提交
132 133 134
{
	struct wl1271_tx_hw_descr *desc;
	u32 total_len = skb->len + sizeof(struct wl1271_tx_hw_descr) + extra;
135
	u32 len;
136
	u32 total_blocks;
L
Luciano Coelho 已提交
137
	int id, ret = -EBUSY;
138 139 140 141 142 143
	u32 spare_blocks;

	if (unlikely(wl->quirks & WL12XX_QUIRK_USE_2_SPARE_BLOCKS))
		spare_blocks = 2;
	else
		spare_blocks = 1;
L
Luciano Coelho 已提交
144

145
	if (buf_offset + total_len > WL1271_AGGR_BUFFER_SIZE)
I
Ido Yariv 已提交
146
		return -EAGAIN;
147

L
Luciano Coelho 已提交
148
	/* allocate free identifier for the packet */
149
	id = wl1271_alloc_tx_id(wl, skb);
L
Luciano Coelho 已提交
150 151 152 153 154
	if (id < 0)
		return id;

	/* approximate the number of blocks required for this packet
	   in the firmware */
155 156 157 158 159 160
	if (wl->block_size)
		len = ALIGN(total_len, wl->block_size);
	else
		len = total_len;

	total_blocks = (len + TX_HW_BLOCK_SIZE - 1) / TX_HW_BLOCK_SIZE +
161
		spare_blocks;
162

L
Luciano Coelho 已提交
163 164 165 166
	if (total_blocks <= wl->tx_blocks_available) {
		desc = (struct wl1271_tx_hw_descr *)skb_push(
			skb, total_len - skb->len);

167 168 169 170
		/* 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 {
171
			desc->wl127x_mem.extra_blocks = spare_blocks;
172 173 174
			desc->wl127x_mem.total_mem_blocks = total_blocks;
		}

L
Luciano Coelho 已提交
175 176 177 178
		desc->id = id;

		wl->tx_blocks_available -= total_blocks;

179 180 181
		if (wl->bss_type == BSS_TYPE_AP_BSS)
			wl->links[hlid].allocated_blks += total_blocks;

L
Luciano Coelho 已提交
182 183 184 185 186
		ret = 0;

		wl1271_debug(DEBUG_TX,
			     "tx_allocate: size: %d, blocks: %d, id: %d",
			     total_len, total_blocks, id);
187
	} else {
188
		wl1271_free_tx_id(wl, id);
189
	}
L
Luciano Coelho 已提交
190 191 192 193

	return ret;
}

194
static void wl1271_tx_fill_hdr(struct wl1271 *wl, struct sk_buff *skb,
195 196
			      u32 extra, struct ieee80211_tx_info *control,
			      u8 hlid)
L
Luciano Coelho 已提交
197
{
198
	struct timespec ts;
L
Luciano Coelho 已提交
199
	struct wl1271_tx_hw_descr *desc;
200
	int aligned_len, ac, rate_idx;
201
	s64 hosttime;
L
Luciano Coelho 已提交
202
	u16 tx_attr;
L
Luciano Coelho 已提交
203 204 205

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

206 207 208 209
	/* relocate space for security header */
	if (extra) {
		void *framestart = skb->data + sizeof(*desc);
		u16 fc = *(u16 *)(framestart + extra);
L
Luciano Coelho 已提交
210
		int hdrlen = ieee80211_hdrlen(cpu_to_le16(fc));
211 212 213
		memmove(framestart, framestart + extra, hdrlen);
	}

L
Luciano Coelho 已提交
214
	/* configure packet life time */
215 216 217
	getnstimeofday(&ts);
	hosttime = (timespec_to_ns(&ts) >> 10);
	desc->start_time = cpu_to_le32(hosttime - wl->time_offset);
218 219 220 221 222

	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 已提交
223

224
	/* queue */
K
Kalle Valo 已提交
225
	ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
226
	desc->tid = skb->priority;
227

228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243
	if (skb->pkt_type == TX_PKT_TYPE_DUMMY_REQ) {
		/*
		 * 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;
	}

244
	if (wl->bss_type != BSS_TYPE_AP_BSS) {
245
		desc->aid = hlid;
246 247 248 249 250 251 252 253 254

		/* 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 {
255 256 257 258 259 260 261 262 263
		desc->hlid = hlid;
		switch (hlid) {
		case WL1271_AP_GLOBAL_HLID:
			rate_idx = ACX_TX_AP_MODE_MGMT_RATE;
			break;
		case WL1271_AP_BROADCAST_HLID:
			rate_idx = ACX_TX_AP_MODE_BCST_RATE;
			break;
		default:
264
			rate_idx = ac;
265
			break;
266 267 268 269
		}
	}

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

272 273 274 275 276
	if (wl->block_size) {
		aligned_len = ALIGN(skb->len, wl->block_size);

		desc->wl128x_mem.extra_bytes = aligned_len - skb->len;
		desc->length = cpu_to_le16(aligned_len >> 2);
277 278 279 280 281 282 283

		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);
284 285 286 287 288 289 290 291 292 293
	} else {
		int pad;

		/* align the length (and store in terms of words) */
		aligned_len = ALIGN(skb->len, WL1271_TX_ALIGN_TO);
		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 已提交
294

295 296 297 298 299 300
		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);
301
	}
L
Luciano Coelho 已提交
302 303

	desc->tx_attr = cpu_to_le16(tx_attr);
L
Luciano Coelho 已提交
304 305 306
}

/* caller must hold wl->mutex */
307 308
static int wl1271_prepare_tx_frame(struct wl1271 *wl, struct sk_buff *skb,
							u32 buf_offset)
L
Luciano Coelho 已提交
309 310 311 312
{
	struct ieee80211_tx_info *info;
	u32 extra = 0;
	int ret = 0;
313
	u32 total_len;
314
	u8 hlid;
L
Luciano Coelho 已提交
315 316 317 318 319 320 321

	if (!skb)
		return -EINVAL;

	info = IEEE80211_SKB_CB(skb);

	if (info->control.hw_key &&
322
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP)
L
Luciano Coelho 已提交
323 324 325
		extra = WL1271_TKIP_IV_SPACE;

	if (info->control.hw_key) {
326 327 328 329 330 331
		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 已提交
332

333 334
		if (unlikely(is_wep && wl->default_key != idx)) {
			ret = wl1271_set_default_wep_key(wl, idx);
L
Luciano Coelho 已提交
335 336
			if (ret < 0)
				return ret;
J
Juuso Oikarinen 已提交
337
			wl->default_key = idx;
L
Luciano Coelho 已提交
338 339 340
		}
	}

341 342 343 344 345 346
	if (wl->bss_type == BSS_TYPE_AP_BSS)
		hlid = wl1271_tx_get_hlid(skb);
	else
		hlid = TX_HW_DEFAULT_AID;

	ret = wl1271_tx_allocate(wl, skb, extra, buf_offset, hlid);
L
Luciano Coelho 已提交
347 348 349
	if (ret < 0)
		return ret;

350
	if (wl->bss_type == BSS_TYPE_AP_BSS) {
351
		wl1271_tx_ap_update_inconnection_sta(wl, skb);
352 353
		wl1271_tx_regulate_link(wl, hlid);
	}
354

355
	wl1271_tx_fill_hdr(wl, skb, extra, info, hlid);
L
Luciano Coelho 已提交
356

357
	/*
358 359 360 361 362 363
	 * 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).
364
	 */
365 366 367 368 369
	if (wl->block_size)
		total_len = ALIGN(skb->len, wl->block_size);
	else
		total_len = ALIGN(skb->len, WL1271_TX_ALIGN_TO);

370 371
	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 已提交
372

373
	return total_len;
L
Luciano Coelho 已提交
374 375
}

376
u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set)
377 378 379 380 381 382 383 384 385 386 387 388
{
	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 已提交
389
#ifdef CONFIG_WL12XX_HT
390 391 392 393 394 395 396 397 398 399
	/* 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

400 401 402
	return enabled_rates;
}

403
void wl1271_handle_tx_low_watermark(struct wl1271 *wl)
404 405 406 407
{
	unsigned long flags;

	if (test_bit(WL1271_FLAG_TX_QUEUE_STOPPED, &wl->flags) &&
408
	    wl->tx_queue_count <= WL1271_TX_QUEUE_LOW_WATERMARK) {
409 410 411 412 413 414 415 416
		/* firmware buffer has space, restart queues */
		spin_lock_irqsave(&wl->wl_lock, flags);
		ieee80211_wake_queues(wl->hw);
		clear_bit(WL1271_FLAG_TX_QUEUE_STOPPED, &wl->flags);
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}
}

417
static struct sk_buff *wl1271_sta_skb_dequeue(struct wl1271 *wl)
418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442
{
	struct sk_buff *skb = NULL;
	unsigned long flags;

	skb = skb_dequeue(&wl->tx_queue[CONF_TX_AC_VO]);
	if (skb)
		goto out;
	skb = skb_dequeue(&wl->tx_queue[CONF_TX_AC_VI]);
	if (skb)
		goto out;
	skb = skb_dequeue(&wl->tx_queue[CONF_TX_AC_BE]);
	if (skb)
		goto out;
	skb = skb_dequeue(&wl->tx_queue[CONF_TX_AC_BK]);

out:
	if (skb) {
		spin_lock_irqsave(&wl->wl_lock, flags);
		wl->tx_queue_count--;
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}

	return skb;
}

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 477 478 479 480 481 482 483 484 485 486 487 488 489 490
static struct sk_buff *wl1271_ap_skb_dequeue(struct wl1271 *wl)
{
	struct sk_buff *skb = NULL;
	unsigned long flags;
	int i, h, start_hlid;

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

		skb = skb_dequeue(&wl->links[h].tx_queue[CONF_TX_AC_VO]);
		if (skb)
			goto out;
		skb = skb_dequeue(&wl->links[h].tx_queue[CONF_TX_AC_VI]);
		if (skb)
			goto out;
		skb = skb_dequeue(&wl->links[h].tx_queue[CONF_TX_AC_BE]);
		if (skb)
			goto out;
		skb = skb_dequeue(&wl->links[h].tx_queue[CONF_TX_AC_BK]);
		if (skb)
			goto out;
	}

out:
	if (skb) {
		wl->last_tx_hlid = h;
		spin_lock_irqsave(&wl->wl_lock, flags);
		wl->tx_queue_count--;
		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)
{
	if (wl->bss_type == BSS_TYPE_AP_BSS)
		return wl1271_ap_skb_dequeue(wl);

	return wl1271_sta_skb_dequeue(wl);
}

491 492 493 494 495
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));

496 497 498 499 500 501 502 503 504 505
	if (wl->bss_type == BSS_TYPE_AP_BSS) {
		u8 hlid = wl1271_tx_get_hlid(skb);
		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);
	}

506 507 508 509 510
	spin_lock_irqsave(&wl->wl_lock, flags);
	wl->tx_queue_count++;
	spin_unlock_irqrestore(&wl->wl_lock, flags);
}

I
Ido Yariv 已提交
511
void wl1271_tx_work_locked(struct wl1271 *wl)
L
Luciano Coelho 已提交
512 513
{
	struct sk_buff *skb;
I
Ido Yariv 已提交
514 515
	u32 buf_offset = 0;
	bool sent_packets = false;
L
Luciano Coelho 已提交
516 517 518
	int ret;

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

521
	while ((skb = wl1271_skb_dequeue(wl))) {
522
		ret = wl1271_prepare_tx_frame(wl, skb, buf_offset);
I
Ido Yariv 已提交
523
		if (ret == -EAGAIN) {
524
			/*
I
Ido Yariv 已提交
525 526 527
			 * Aggregation buffer is full.
			 * Flush buffer and try again.
			 */
528
			wl1271_skb_queue_head(wl, skb);
I
Ido Yariv 已提交
529
			wl1271_write(wl, WL1271_SLV_MEM_DATA, wl->aggr_buf,
530
				     buf_offset, true);
I
Ido Yariv 已提交
531 532 533 534 535 536
			sent_packets = true;
			buf_offset = 0;
			continue;
		} else if (ret == -EBUSY) {
			/*
			 * Firmware buffer is full.
537 538
			 * Queue back last skb, and stop aggregating.
			 */
539
			wl1271_skb_queue_head(wl, skb);
I
Ido Yariv 已提交
540 541
			/* No work left, avoid scheduling redundant tx work */
			set_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
542
			goto out_ack;
L
Luciano Coelho 已提交
543 544
		} else if (ret < 0) {
			dev_kfree_skb(skb);
545
			goto out_ack;
L
Luciano Coelho 已提交
546
		}
547 548
		buf_offset += ret;
		wl->tx_packets_count++;
L
Luciano Coelho 已提交
549 550
	}

551
out_ack:
552 553 554
	if (buf_offset) {
		wl1271_write(wl, WL1271_SLV_MEM_DATA, wl->aggr_buf,
				buf_offset, true);
I
Ido Yariv 已提交
555 556 557
		sent_packets = true;
	}
	if (sent_packets) {
558 559 560 561 562 563 564 565
		/*
		 * 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);

566
		wl1271_handle_tx_low_watermark(wl);
567
	}
I
Ido Yariv 已提交
568
}
L
Luciano Coelho 已提交
569

I
Ido Yariv 已提交
570 571 572
void wl1271_tx_work(struct work_struct *work)
{
	struct wl1271 *wl = container_of(work, struct wl1271, tx_work);
573
	int ret;
I
Ido Yariv 已提交
574 575

	mutex_lock(&wl->mutex);
576 577 578 579
	ret = wl1271_ps_elp_wakeup(wl);
	if (ret < 0)
		goto out;

I
Ido Yariv 已提交
580
	wl1271_tx_work_locked(wl);
581 582 583

	wl1271_ps_elp_wakeup(wl);
out:
L
Luciano Coelho 已提交
584 585 586 587 588 589 590 591 592
	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 已提交
593 594
	int rate = -1;
	u8 retries = 0;
L
Luciano Coelho 已提交
595 596

	/* check for id legality */
597
	if (unlikely(id >= ACX_TX_DESCRIPTORS || wl->tx_frames[id] == NULL)) {
L
Luciano Coelho 已提交
598 599 600 601 602 603 604
		wl1271_warning("TX result illegal id: %d", id);
		return;
	}

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

605 606 607 608 609 610
	if (skb->pkt_type == TX_PKT_TYPE_DUMMY_REQ) {
		dev_kfree_skb(skb);
		wl1271_free_tx_id(wl, id);
		return;
	}

J
Juuso Oikarinen 已提交
611 612 613
	/* update the TX status info */
	if (result->status == TX_SUCCESS) {
		if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
L
Luciano Coelho 已提交
614
			info->flags |= IEEE80211_TX_STAT_ACK;
615
		rate = wl1271_rate_to_idx(result->rate_class_index, wl->band);
J
Juuso Oikarinen 已提交
616 617 618 619
		retries = result->ack_failures;
	} else if (result->status == TX_RETRY_EXCEEDED) {
		wl->stats.excessive_retries++;
		retries = result->ack_failures;
L
Luciano Coelho 已提交
620 621
	}

J
Juuso Oikarinen 已提交
622 623 624 625 626
	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 已提交
627 628
	wl->stats.retry_count += result->ack_failures;

629
	/* update security sequence number */
630 631
	wl->tx_security_seq += (result->lsb_security_sequence_number -
				wl->tx_security_last_seq);
632 633
	wl->tx_security_last_seq = result->lsb_security_sequence_number;

634 635 636 637
	/* remove private header from packet */
	skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

	/* remove TKIP header space if present */
L
Luciano Coelho 已提交
638
	if (info->control.hw_key &&
639
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) {
640 641 642 643
		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 已提交
644 645 646 647 648 649 650

	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 */
651 652
	skb_queue_tail(&wl->deferred_tx_queue, skb);
	ieee80211_queue_work(wl->hw, &wl->netstack_work);
653
	wl1271_free_tx_id(wl, result->id);
L
Luciano Coelho 已提交
654 655 656
}

/* Called upon reception of a TX complete interrupt */
657
void wl1271_tx_complete(struct wl1271 *wl)
L
Luciano Coelho 已提交
658 659 660
{
	struct wl1271_acx_mem_map *memmap =
		(struct wl1271_acx_mem_map *)wl->target_mem_map;
661
	u32 count, fw_counter;
L
Luciano Coelho 已提交
662 663 664
	u32 i;

	/* read the tx results from the chipset */
T
Teemu Paasikivi 已提交
665 666
	wl1271_read(wl, le32_to_cpu(memmap->tx_result),
		    wl->tx_res_if, sizeof(*wl->tx_res_if), false);
667 668 669 670 671 672 673 674
	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;
675
	wl1271_debug(DEBUG_TX, "tx_complete received, packets: %d", count);
L
Luciano Coelho 已提交
676 677

	/* verify that the result buffer is not getting overrun */
678
	if (unlikely(count > TX_HW_RESULT_QUEUE_LEN))
L
Luciano Coelho 已提交
679 680 681 682 683 684 685 686 687 688 689 690 691 692 693
		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++;
	}
}

694 695 696 697 698
void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid)
{
	struct sk_buff *skb;
	int i, total = 0;
	unsigned long flags;
699
	struct ieee80211_tx_info *info;
700 701 702 703

	for (i = 0; i < NUM_TX_QUEUES; i++) {
		while ((skb = skb_dequeue(&wl->links[hlid].tx_queue[i]))) {
			wl1271_debug(DEBUG_TX, "link freeing skb 0x%p", skb);
704 705 706
			info = IEEE80211_SKB_CB(skb);
			info->status.rates[0].idx = -1;
			info->status.rates[0].count = 0;
707 708 709 710 711 712 713 714 715 716 717 718
			ieee80211_tx_status(wl->hw, skb);
			total++;
		}
	}

	spin_lock_irqsave(&wl->wl_lock, flags);
	wl->tx_queue_count -= total;
	spin_unlock_irqrestore(&wl->wl_lock, flags);

	wl1271_handle_tx_low_watermark(wl);
}

L
Luciano Coelho 已提交
719
/* caller must hold wl->mutex */
720
void wl1271_tx_reset(struct wl1271 *wl)
L
Luciano Coelho 已提交
721 722 723
{
	int i;
	struct sk_buff *skb;
724
	struct ieee80211_tx_info *info;
L
Luciano Coelho 已提交
725 726

	/* TX failure */
727
	if (wl->bss_type == BSS_TYPE_AP_BSS) {
728
		for (i = 0; i < AP_MAX_LINKS; i++) {
729
			wl1271_tx_reset_link_queues(wl, i);
730 731 732
			wl->links[i].allocated_blks = 0;
			wl->links[i].prev_freed_blks = 0;
		}
733 734 735 736 737 738 739

		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);
740 741 742 743 744 745 746 747 748

				if (skb->pkt_type == TX_PKT_TYPE_DUMMY_REQ) {
					dev_kfree_skb(skb);
				} else {
					info = IEEE80211_SKB_CB(skb);
					info->status.rates[0].idx = -1;
					info->status.rates[0].count = 0;
					ieee80211_tx_status(wl->hw, skb);
				}
749
			}
750
		}
L
Luciano Coelho 已提交
751
	}
752

753
	wl->tx_queue_count = 0;
L
Luciano Coelho 已提交
754

755 756 757 758
	/*
	 * Make sure the driver is at a consistent state, in case this
	 * function is called from a context other than interface removal.
	 */
759
	wl1271_handle_tx_low_watermark(wl);
760

761 762 763 764 765 766 767 768
	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);

769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785
		if (skb->pkt_type == TX_PKT_TYPE_DUMMY_REQ) {
			dev_kfree_skb(skb);
		} else {
			/*
			 * 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);
			}
786

787 788
			info->status.rates[0].idx = -1;
			info->status.rates[0].count = 0;
789

790 791
			ieee80211_tx_status(wl->hw, skb);
		}
792
	}
793 794 795 796 797 798 799 800 801 802 803 804
}

#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);
805 806
		wl1271_debug(DEBUG_TX, "flushing tx buffer: %d %d",
			     wl->tx_frames_cnt, wl->tx_queue_count);
807
		if ((wl->tx_frames_cnt == 0) && (wl->tx_queue_count == 0)) {
808 809 810 811 812 813 814 815
			mutex_unlock(&wl->mutex);
			return;
		}
		mutex_unlock(&wl->mutex);
		msleep(1);
	}

	wl1271_warning("Unable to flush all TX buffers, timed out.");
L
Luciano Coelho 已提交
816
}
A
Arik Nemtsov 已提交
817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834

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