tx.c 28.3 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

28
#include "wlcore.h"
29
#include "debug.h"
S
Shahar Levi 已提交
30 31 32
#include "io.h"
#include "ps.h"
#include "tx.h"
33
#include "event.h"
L
Luciano Coelho 已提交
34

35 36 37 38 39 40
/*
 * TODO: this is here just for now, it must be removed when the data
 * operations are in place.
 */
#include "../wl12xx/reg.h"

E
Eliad Peller 已提交
41 42
static int wl1271_set_default_wep_key(struct wl1271 *wl,
				      struct wl12xx_vif *wlvif, u8 id)
43 44
{
	int ret;
E
Eliad Peller 已提交
45
	bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
46 47

	if (is_ap)
E
Eliad Peller 已提交
48
		ret = wl12xx_cmd_set_default_wep_key(wl, id,
49
						     wlvif->ap.bcast_hlid);
50
	else
E
Eliad Peller 已提交
51
		ret = wl12xx_cmd_set_default_wep_key(wl, id, wlvif->sta.hlid);
52 53 54 55 56 57 58 59

	if (ret < 0)
		return ret;

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

60
static int wl1271_alloc_tx_id(struct wl1271 *wl, struct sk_buff *skb)
L
Luciano Coelho 已提交
61
{
62 63
	int id;

64 65
	id = find_first_zero_bit(wl->tx_frames_map, wl->num_tx_desc);
	if (id >= wl->num_tx_desc)
66 67 68 69 70 71 72
		return -EBUSY;

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

74 75 76
static void wl1271_free_tx_id(struct wl1271 *wl, int id)
{
	if (__test_and_clear_bit(id, wl->tx_frames_map)) {
77
		if (unlikely(wl->tx_frames_cnt == wl->num_tx_desc))
78 79
			clear_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);

80 81 82
		wl->tx_frames[id] = NULL;
		wl->tx_frames_cnt--;
	}
L
Luciano Coelho 已提交
83 84
}

85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
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);
}

101 102 103
static void wl1271_tx_regulate_link(struct wl1271 *wl,
				    struct wl12xx_vif *wlvif,
				    u8 hlid)
104
{
105
	bool fw_ps, single_sta;
106
	u8 tx_pkts;
107

108
	if (WARN_ON(!test_bit(hlid, wlvif->links_map)))
109 110 111
		return;

	fw_ps = test_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map);
112
	tx_pkts = wl->links[hlid].allocated_pkts;
113
	single_sta = (wl->active_sta_count == 1);
114 115 116 117

	/*
	 * 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.
118 119
	 * Make an exception if this is the only connected station. In this
	 * case FW-memory congestion is not a problem.
120
	 */
121
	if (!single_sta && fw_ps && tx_pkts >= WL1271_PS_STA_MAX_PACKETS)
122
		wl12xx_ps_link_start(wl, wlvif, hlid, true);
123 124
}

125
bool wl12xx_is_dummy_packet(struct wl1271 *wl, struct sk_buff *skb)
E
Eliad Peller 已提交
126 127 128 129
{
	return wl->dummy_packet == skb;
}

130 131
u8 wl12xx_tx_get_hlid_ap(struct wl1271 *wl, struct wl12xx_vif *wlvif,
			 struct sk_buff *skb)
132 133 134 135 136 137 138 139 140 141 142 143
{
	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;

144
		if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags))
E
Eliad Peller 已提交
145 146
			return wl->system_hlid;

147 148
		hdr = (struct ieee80211_hdr *)skb->data;
		if (ieee80211_is_mgmt(hdr->frame_control))
149
			return wlvif->ap.global_hlid;
150
		else
151
			return wlvif->ap.bcast_hlid;
152 153 154
	}
}

155 156
u8 wl12xx_tx_get_hlid(struct wl1271 *wl, struct wl12xx_vif *wlvif,
		      struct sk_buff *skb)
E
Eliad Peller 已提交
157
{
158 159
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;

E
Eliad Peller 已提交
160
	if (!wlvif || wl12xx_is_dummy_packet(wl, skb))
E
Eliad Peller 已提交
161 162
		return wl->system_hlid;

E
Eliad Peller 已提交
163
	if (wlvif->bss_type == BSS_TYPE_AP_BSS)
164
		return wl12xx_tx_get_hlid_ap(wl, wlvif, skb);
E
Eliad Peller 已提交
165

166
	if ((test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) ||
167
	     test_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags)) &&
168 169
	    !ieee80211_is_auth(hdr->frame_control) &&
	    !ieee80211_is_assoc_req(hdr->frame_control))
E
Eliad Peller 已提交
170
		return wlvif->sta.hlid;
E
Eliad Peller 已提交
171
	else
E
Eliad Peller 已提交
172
		return wlvif->dev_hlid;
E
Eliad Peller 已提交
173 174
}

175 176 177
static unsigned int wl12xx_calc_packet_alignment(struct wl1271 *wl,
						unsigned int packet_length)
{
178
	if (wl->quirks & WLCORE_QUIRK_NO_BLOCKSIZE_ALIGNMENT)
179
		return ALIGN(packet_length, WL1271_TX_ALIGN_TO);
180 181
	else
		return ALIGN(packet_length, WL12XX_BUS_BLOCK_SIZE);
182 183
}

184
static int wl1271_tx_allocate(struct wl1271 *wl, struct wl12xx_vif *wlvif,
E
Eliad Peller 已提交
185 186
			      struct sk_buff *skb, u32 extra, u32 buf_offset,
			      u8 hlid)
L
Luciano Coelho 已提交
187 188 189
{
	struct wl1271_tx_hw_descr *desc;
	u32 total_len = skb->len + sizeof(struct wl1271_tx_hw_descr) + extra;
190
	u32 len;
191
	u32 total_blocks;
192
	int id, ret = -EBUSY, ac;
193
	u32 spare_blocks = wl->normal_tx_spare;
194
	bool is_dummy = false;
L
Luciano Coelho 已提交
195

196
	if (buf_offset + total_len > WL1271_AGGR_BUFFER_SIZE)
I
Ido Yariv 已提交
197
		return -EAGAIN;
198

L
Luciano Coelho 已提交
199
	/* allocate free identifier for the packet */
200
	id = wl1271_alloc_tx_id(wl, skb);
L
Luciano Coelho 已提交
201 202 203 204 205
	if (id < 0)
		return id;

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

208
	if (unlikely(wl12xx_is_dummy_packet(wl, skb)))
209
		is_dummy = true;
210 211
	else if (wlvif->is_gem)
		spare_blocks = wl->gem_tx_spare;
212

213
	total_blocks = (len + TX_HW_BLOCK_SIZE - 1) / TX_HW_BLOCK_SIZE +
214
		spare_blocks;
215

L
Luciano Coelho 已提交
216 217 218 219
	if (total_blocks <= wl->tx_blocks_available) {
		desc = (struct wl1271_tx_hw_descr *)skb_push(
			skb, total_len - skb->len);

220 221 222 223
		/* 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 {
224
			desc->wl127x_mem.extra_blocks = spare_blocks;
225 226 227
			desc->wl127x_mem.total_mem_blocks = total_blocks;
		}

L
Luciano Coelho 已提交
228 229 230
		desc->id = id;

		wl->tx_blocks_available -= total_blocks;
231
		wl->tx_allocated_blocks += total_blocks;
L
Luciano Coelho 已提交
232

A
Arik Nemtsov 已提交
233 234 235 236
		/* If the FW was empty before, arm the Tx watchdog */
		if (wl->tx_allocated_blocks == total_blocks)
			wl12xx_rearm_tx_watchdog_locked(wl);

237 238
		ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
		wl->tx_allocated_pkts[ac]++;
239

E
Eliad Peller 已提交
240 241
		if (!is_dummy && wlvif &&
		    wlvif->bss_type == BSS_TYPE_AP_BSS &&
242
		    test_bit(hlid, wlvif->ap.sta_hlid_map))
243
			wl->links[hlid].allocated_pkts++;
244

L
Luciano Coelho 已提交
245 246 247 248 249
		ret = 0;

		wl1271_debug(DEBUG_TX,
			     "tx_allocate: size: %d, blocks: %d, id: %d",
			     total_len, total_blocks, id);
250
	} else {
251
		wl1271_free_tx_id(wl, id);
252
	}
L
Luciano Coelho 已提交
253 254 255 256

	return ret;
}

257
static void wl1271_tx_fill_hdr(struct wl1271 *wl, struct wl12xx_vif *wlvif,
E
Eliad Peller 已提交
258 259
			       struct sk_buff *skb, u32 extra,
			       struct ieee80211_tx_info *control, u8 hlid)
L
Luciano Coelho 已提交
260
{
261
	struct timespec ts;
L
Luciano Coelho 已提交
262
	struct wl1271_tx_hw_descr *desc;
263
	int aligned_len, ac, rate_idx;
264
	s64 hosttime;
265
	u16 tx_attr = 0;
266 267 268
	__le16 frame_control;
	struct ieee80211_hdr *hdr;
	u8 *frame_start;
269
	bool is_dummy;
L
Luciano Coelho 已提交
270 271

	desc = (struct wl1271_tx_hw_descr *) skb->data;
272 273 274
	frame_start = (u8 *)(desc + 1);
	hdr = (struct ieee80211_hdr *)(frame_start + extra);
	frame_control = hdr->frame_control;
L
Luciano Coelho 已提交
275

276 277
	/* relocate space for security header */
	if (extra) {
278 279
		int hdrlen = ieee80211_hdrlen(frame_control);
		memmove(frame_start, hdr, hdrlen);
280 281
	}

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

287
	is_dummy = wl12xx_is_dummy_packet(wl, skb);
E
Eliad Peller 已提交
288
	if (is_dummy || !wlvif || wlvif->bss_type != BSS_TYPE_AP_BSS)
289 290 291
		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 已提交
292

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

297
	if (is_dummy) {
298 299 300 301
		/*
		 * FW expects the dummy packet to have an invalid session id -
		 * any session id that is different than the one set in the join
		 */
302
		tx_attr = (SESSION_COUNTER_INVALID <<
303 304 305 306
			   TX_HW_ATTR_OFST_SESSION_COUNTER) &
			   TX_HW_ATTR_SESSION_COUNTER;

		tx_attr |= TX_HW_ATTR_TX_DUMMY_REQ;
E
Eliad Peller 已提交
307
	} else if (wlvif) {
308
		/* configure the tx attributes */
309 310
		tx_attr = wlvif->session_counter <<
			  TX_HW_ATTR_OFST_SESSION_COUNTER;
311 312
	}

E
Eliad Peller 已提交
313
	desc->hlid = hlid;
E
Eliad Peller 已提交
314
	if (is_dummy || !wlvif)
315 316
		rate_idx = 0;
	else if (wlvif->bss_type != BSS_TYPE_AP_BSS) {
317 318 319
		/* if the packets are destined for AP (have a STA entry)
		   send them with AP rate policies, otherwise use default
		   basic rates */
320 321 322
		if (control->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
			rate_idx = wlvif->sta.p2p_rate_idx;
		else if (control->control.sta)
E
Eliad Peller 已提交
323
			rate_idx = wlvif->sta.ap_rate_idx;
324
		else
E
Eliad Peller 已提交
325
			rate_idx = wlvif->sta.basic_rate_idx;
326
	} else {
327
		if (hlid == wlvif->ap.global_hlid)
E
Eliad Peller 已提交
328
			rate_idx = wlvif->ap.mgmt_rate_idx;
329
		else if (hlid == wlvif->ap.bcast_hlid)
E
Eliad Peller 已提交
330
			rate_idx = wlvif->ap.bcast_rate_idx;
331
		else
E
Eliad Peller 已提交
332
			rate_idx = wlvif->ap.ucast_rate_idx[ac];
333 334 335
	}

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

338
	aligned_len = wl12xx_calc_packet_alignment(wl, skb->len);
339

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

		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);
350 351 352
	} else {
		int pad;

353
		/* Store the aligned length in terms of words */
354 355 356 357 358
		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 已提交
359

360 361 362 363 364 365
		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);
366
	}
L
Luciano Coelho 已提交
367

368 369 370 371 372
	/* for WEP shared auth - no fw encryption is needed */
	if (ieee80211_is_auth(frame_control) &&
	    ieee80211_has_protected(frame_control))
		tx_attr |= TX_HW_ATTR_HOST_ENCRYPT;

L
Luciano Coelho 已提交
373
	desc->tx_attr = cpu_to_le16(tx_attr);
L
Luciano Coelho 已提交
374 375 376
}

/* caller must hold wl->mutex */
377 378
static int wl1271_prepare_tx_frame(struct wl1271 *wl, struct wl12xx_vif *wlvif,
				   struct sk_buff *skb, u32 buf_offset)
L
Luciano Coelho 已提交
379 380 381 382
{
	struct ieee80211_tx_info *info;
	u32 extra = 0;
	int ret = 0;
383
	u32 total_len;
384
	u8 hlid;
E
Eliad Peller 已提交
385
	bool is_dummy;
L
Luciano Coelho 已提交
386 387 388 389 390 391

	if (!skb)
		return -EINVAL;

	info = IEEE80211_SKB_CB(skb);

E
Eliad Peller 已提交
392 393 394
	/* TODO: handle dummy packets on multi-vifs */
	is_dummy = wl12xx_is_dummy_packet(wl, skb);

L
Luciano Coelho 已提交
395
	if (info->control.hw_key &&
396
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP)
397
		extra = WL1271_EXTRA_SPACE_TKIP;
L
Luciano Coelho 已提交
398 399

	if (info->control.hw_key) {
400 401 402 403 404 405
		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 已提交
406

E
Eliad Peller 已提交
407
		if (unlikely(is_wep && wlvif->default_key != idx)) {
E
Eliad Peller 已提交
408
			ret = wl1271_set_default_wep_key(wl, wlvif, idx);
L
Luciano Coelho 已提交
409 410
			if (ret < 0)
				return ret;
E
Eliad Peller 已提交
411
			wlvif->default_key = idx;
L
Luciano Coelho 已提交
412 413
		}
	}
414
	hlid = wl12xx_tx_get_hlid(wl, wlvif, skb);
E
Eliad Peller 已提交
415
	if (hlid == WL12XX_INVALID_LINK_ID) {
416
		wl1271_error("invalid hlid. dropping skb 0x%p", skb);
E
Eliad Peller 已提交
417 418
		return -EINVAL;
	}
419

420
	ret = wl1271_tx_allocate(wl, wlvif, skb, extra, buf_offset, hlid);
L
Luciano Coelho 已提交
421 422 423
	if (ret < 0)
		return ret;

424
	wl1271_tx_fill_hdr(wl, wlvif, skb, extra, info, hlid);
425

E
Eliad Peller 已提交
426
	if (!is_dummy && wlvif && wlvif->bss_type == BSS_TYPE_AP_BSS) {
427
		wl1271_tx_ap_update_inconnection_sta(wl, skb);
428
		wl1271_tx_regulate_link(wl, wlvif, hlid);
429
	}
430

431
	/*
432 433 434 435 436 437
	 * 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).
438
	 */
439
	total_len = wl12xx_calc_packet_alignment(wl, skb->len);
440

441 442
	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 已提交
443

444
	/* Revert side effects in the dummy packet skb, so it can be reused */
E
Eliad Peller 已提交
445
	if (is_dummy)
446 447
		skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

448
	return total_len;
L
Luciano Coelho 已提交
449 450
}

451 452
u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set,
				enum ieee80211_band rate_band)
453 454 455 456 457
{
	struct ieee80211_supported_band *band;
	u32 enabled_rates = 0;
	int bit;

458
	band = wl->hw->wiphy->bands[rate_band];
459 460 461 462 463 464
	for (bit = 0; bit < band->n_bitrates; bit++) {
		if (rate_set & 0x1)
			enabled_rates |= band->bitrates[bit].hw_value;
		rate_set >>= 1;
	}

465 466 467 468 469 470 471 472 473
	/* 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;
	}

474 475 476
	return enabled_rates;
}

477
void wl1271_handle_tx_low_watermark(struct wl1271 *wl)
478 479
{
	unsigned long flags;
480
	int i;
481

482 483
	for (i = 0; i < NUM_TX_QUEUES; i++) {
		if (test_bit(i, &wl->stopped_queues_map) &&
484
		    wl->tx_queue_count[i] <= WL1271_TX_QUEUE_LOW_WATERMARK) {
485 486 487 488 489 490 491
			/* 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);
		}
492 493 494
	}
}

495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522
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];
}

523 524
static struct sk_buff *wl12xx_lnk_skb_dequeue(struct wl1271 *wl,
					      struct wl1271_link *lnk)
525
{
526
	struct sk_buff *skb;
527
	unsigned long flags;
528
	struct sk_buff_head *queue;
529

530
	queue = wl1271_select_queue(wl, lnk->tx_queue);
531
	if (!queue)
532
		return NULL;
533 534

	skb = skb_dequeue(queue);
535
	if (skb) {
536
		int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
537
		spin_lock_irqsave(&wl->wl_lock, flags);
538
		WARN_ON_ONCE(wl->tx_queue_count[q] <= 0);
539
		wl->tx_queue_count[q]--;
540 541 542 543 544 545
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}

	return skb;
}

546 547
static struct sk_buff *wl12xx_vif_skb_dequeue(struct wl1271 *wl,
					      struct wl12xx_vif *wlvif)
548 549 550 551 552
{
	struct sk_buff *skb = NULL;
	int i, h, start_hlid;

	/* start from the link after the last one */
553
	start_hlid = (wlvif->last_tx_hlid + 1) % WL12XX_MAX_LINKS;
554 555

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

559
		/* only consider connected stations */
560
		if (!test_bit(h, wlvif->links_map))
561 562
			continue;

563 564
		skb = wl12xx_lnk_skb_dequeue(wl, &wl->links[h]);
		if (!skb)
565 566
			continue;

567 568
		wlvif->last_tx_hlid = h;
		break;
569 570
	}

571
	if (!skb)
572
		wlvif->last_tx_hlid = 0;
573 574 575 576

	return skb;
}

577
static struct sk_buff *wl1271_skb_dequeue(struct wl1271 *wl)
578
{
579
	unsigned long flags;
580
	struct wl12xx_vif *wlvif = wl->last_wlvif;
581 582
	struct sk_buff *skb = NULL;

583
	/* continue from last wlvif (round robin) */
584 585 586 587 588 589 590 591 592 593
	if (wlvif) {
		wl12xx_for_each_wlvif_continue(wl, wlvif) {
			skb = wl12xx_vif_skb_dequeue(wl, wlvif);
			if (skb) {
				wl->last_wlvif = wlvif;
				break;
			}
		}
	}

594 595 596 597 598
	/* dequeue from the system HLID before the restarting wlvif list */
	if (!skb)
		skb = wl12xx_lnk_skb_dequeue(wl, &wl->links[wl->system_hlid]);

	/* do a new pass over the wlvif list */
599 600 601 602 603 604 605
	if (!skb) {
		wl12xx_for_each_wlvif(wl, wlvif) {
			skb = wl12xx_vif_skb_dequeue(wl, wlvif);
			if (skb) {
				wl->last_wlvif = wlvif;
				break;
			}
606 607 608 609 610 611 612

			/*
			 * No need to continue after last_wlvif. The previous
			 * pass should have found it.
			 */
			if (wlvif == wl->last_wlvif)
				break;
613
		}
614 615
	}

616 617
	if (!skb &&
	    test_and_clear_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags)) {
618 619
		int q;

620
		skb = wl->dummy_packet;
621
		q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
622
		spin_lock_irqsave(&wl->wl_lock, flags);
623
		WARN_ON_ONCE(wl->tx_queue_count[q] <= 0);
624
		wl->tx_queue_count[q]--;
625 626 627 628
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}

	return skb;
629 630
}

631
static void wl1271_skb_queue_head(struct wl1271 *wl, struct wl12xx_vif *wlvif,
E
Eliad Peller 已提交
632
				  struct sk_buff *skb)
633 634 635 636
{
	unsigned long flags;
	int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));

637 638
	if (wl12xx_is_dummy_packet(wl, skb)) {
		set_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags);
639 640
	} else {
		u8 hlid = wl12xx_tx_get_hlid(wl, wlvif, skb);
641 642 643
		skb_queue_head(&wl->links[hlid].tx_queue[q], skb);

		/* make sure we dequeue the same packet next time */
644
		wlvif->last_tx_hlid = (hlid + WL12XX_MAX_LINKS - 1) %
645
				      WL12XX_MAX_LINKS;
646 647
	}

648
	spin_lock_irqsave(&wl->wl_lock, flags);
649
	wl->tx_queue_count[q]++;
650 651 652
	spin_unlock_irqrestore(&wl->wl_lock, flags);
}

653 654 655 656 657 658 659
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);
}

E
Eliad Peller 已提交
660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686
void wl12xx_rearm_rx_streaming(struct wl1271 *wl, unsigned long *active_hlids)
{
	struct wl12xx_vif *wlvif;
	u32 timeout;
	u8 hlid;

	if (!wl->conf.rx_streaming.interval)
		return;

	if (!wl->conf.rx_streaming.always &&
	    !test_bit(WL1271_FLAG_SOFT_GEMINI, &wl->flags))
		return;

	timeout = wl->conf.rx_streaming.duration;
	wl12xx_for_each_wlvif_sta(wl, wlvif) {
		bool found = false;
		for_each_set_bit(hlid, active_hlids, WL12XX_MAX_LINKS) {
			if (test_bit(hlid, wlvif->links_map)) {
				found  = true;
				break;
			}
		}

		if (!found)
			continue;

		/* enable rx streaming */
687
		if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags))
E
Eliad Peller 已提交
688 689 690 691 692 693 694 695
			ieee80211_queue_work(wl->hw,
					     &wlvif->rx_streaming_enable_work);

		mod_timer(&wlvif->rx_streaming_timer,
			  jiffies + msecs_to_jiffies(timeout));
	}
}

696
void wl1271_tx_work_locked(struct wl1271 *wl)
L
Luciano Coelho 已提交
697
{
698
	struct wl12xx_vif *wlvif;
L
Luciano Coelho 已提交
699
	struct sk_buff *skb;
E
Eliad Peller 已提交
700
	struct wl1271_tx_hw_descr *desc;
I
Ido Yariv 已提交
701 702
	u32 buf_offset = 0;
	bool sent_packets = false;
E
Eliad Peller 已提交
703
	unsigned long active_hlids[BITS_TO_LONGS(WL12XX_MAX_LINKS)] = {0};
L
Luciano Coelho 已提交
704 705 706
	int ret;

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

709
	while ((skb = wl1271_skb_dequeue(wl))) {
E
Eliad Peller 已提交
710
		struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
E
Eliad Peller 已提交
711 712
		bool has_data = false;

713
		wlvif = NULL;
E
Eliad Peller 已提交
714 715
		if (!wl12xx_is_dummy_packet(wl, skb) && info->control.vif)
			wlvif = wl12xx_vif_to_data(info->control.vif);
716

E
Eliad Peller 已提交
717
		has_data = wlvif && wl1271_tx_is_data_present(skb);
718
		ret = wl1271_prepare_tx_frame(wl, wlvif, skb, buf_offset);
I
Ido Yariv 已提交
719
		if (ret == -EAGAIN) {
720
			/*
I
Ido Yariv 已提交
721 722 723
			 * Aggregation buffer is full.
			 * Flush buffer and try again.
			 */
724
			wl1271_skb_queue_head(wl, wlvif, skb);
725 726
			wlcore_write_data(wl, REG_SLV_MEM_DATA, wl->aggr_buf,
					  buf_offset, true);
I
Ido Yariv 已提交
727 728 729 730 731 732
			sent_packets = true;
			buf_offset = 0;
			continue;
		} else if (ret == -EBUSY) {
			/*
			 * Firmware buffer is full.
733 734
			 * Queue back last skb, and stop aggregating.
			 */
735
			wl1271_skb_queue_head(wl, wlvif, skb);
I
Ido Yariv 已提交
736 737
			/* No work left, avoid scheduling redundant tx work */
			set_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
738
			goto out_ack;
L
Luciano Coelho 已提交
739
		} else if (ret < 0) {
E
Eliad Peller 已提交
740 741 742 743 744 745 746 747
			if (wl12xx_is_dummy_packet(wl, skb))
				/*
				 * fw still expects dummy packet,
				 * so re-enqueue it
				 */
				wl1271_skb_queue_head(wl, wlvif, skb);
			else
				ieee80211_free_txskb(wl->hw, skb);
748
			goto out_ack;
L
Luciano Coelho 已提交
749
		}
750 751
		buf_offset += ret;
		wl->tx_packets_count++;
E
Eliad Peller 已提交
752 753 754 755
		if (has_data) {
			desc = (struct wl1271_tx_hw_descr *) skb->data;
			__set_bit(desc->hlid, active_hlids);
		}
L
Luciano Coelho 已提交
756 757
	}

758
out_ack:
759
	if (buf_offset) {
760 761
		wlcore_write_data(wl, REG_SLV_MEM_DATA, wl->aggr_buf,
				  buf_offset, true);
I
Ido Yariv 已提交
762 763 764
		sent_packets = true;
	}
	if (sent_packets) {
765 766 767 768
		/*
		 * Interrupt the firmware with the new packets. This is only
		 * required for older hardware revisions
		 */
769
		if (wl->quirks & WLCORE_QUIRK_END_OF_TRANSACTION)
770
			wl1271_write32(wl, WL12XX_HOST_WR_ACCESS,
771 772
				       wl->tx_packets_count);

773
		wl1271_handle_tx_low_watermark(wl);
774
	}
E
Eliad Peller 已提交
775
	wl12xx_rearm_rx_streaming(wl, active_hlids);
I
Ido Yariv 已提交
776
}
L
Luciano Coelho 已提交
777

I
Ido Yariv 已提交
778 779 780
void wl1271_tx_work(struct work_struct *work)
{
	struct wl1271 *wl = container_of(work, struct wl1271, tx_work);
781
	int ret;
I
Ido Yariv 已提交
782 783

	mutex_lock(&wl->mutex);
784 785 786 787
	ret = wl1271_ps_elp_wakeup(wl);
	if (ret < 0)
		goto out;

788
	wl1271_tx_work_locked(wl);
789

790
	wl1271_ps_elp_sleep(wl);
791
out:
L
Luciano Coelho 已提交
792 793 794
	mutex_unlock(&wl->mutex);
}

795 796
static u8 wl1271_tx_get_rate_flags(u8 rate_class_index)
{
797 798
	u8 flags = 0;

799 800
	if (rate_class_index >= CONF_HW_RXTX_RATE_MCS_MIN &&
	    rate_class_index <= CONF_HW_RXTX_RATE_MCS_MAX)
801 802 803 804
		flags |= IEEE80211_TX_RC_MCS;
	if (rate_class_index == CONF_HW_RXTX_RATE_MCS7_SGI)
		flags |= IEEE80211_TX_RC_SHORT_GI;
	return flags;
805 806
}

L
Luciano Coelho 已提交
807 808 809 810
static void wl1271_tx_complete_packet(struct wl1271 *wl,
				      struct wl1271_tx_hw_res_descr *result)
{
	struct ieee80211_tx_info *info;
811 812
	struct ieee80211_vif *vif;
	struct wl12xx_vif *wlvif;
L
Luciano Coelho 已提交
813 814
	struct sk_buff *skb;
	int id = result->id;
J
Juuso Oikarinen 已提交
815
	int rate = -1;
816
	u8 rate_flags = 0;
J
Juuso Oikarinen 已提交
817
	u8 retries = 0;
L
Luciano Coelho 已提交
818 819

	/* check for id legality */
820
	if (unlikely(id >= wl->num_tx_desc || wl->tx_frames[id] == NULL)) {
L
Luciano Coelho 已提交
821 822 823 824 825 826 827
		wl1271_warning("TX result illegal id: %d", id);
		return;
	}

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

828
	if (wl12xx_is_dummy_packet(wl, skb)) {
829 830 831 832
		wl1271_free_tx_id(wl, id);
		return;
	}

833 834 835 836
	/* info->control is valid as long as we don't update info->status */
	vif = info->control.vif;
	wlvif = wl12xx_vif_to_data(vif);

J
Juuso Oikarinen 已提交
837 838 839
	/* update the TX status info */
	if (result->status == TX_SUCCESS) {
		if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
L
Luciano Coelho 已提交
840
			info->flags |= IEEE80211_TX_STAT_ACK;
E
Eliad Peller 已提交
841 842
		rate = wl1271_rate_to_idx(result->rate_class_index,
					  wlvif->band);
843
		rate_flags = wl1271_tx_get_rate_flags(result->rate_class_index);
J
Juuso Oikarinen 已提交
844 845 846 847
		retries = result->ack_failures;
	} else if (result->status == TX_RETRY_EXCEEDED) {
		wl->stats.excessive_retries++;
		retries = result->ack_failures;
L
Luciano Coelho 已提交
848 849
	}

J
Juuso Oikarinen 已提交
850 851
	info->status.rates[0].idx = rate;
	info->status.rates[0].count = retries;
852
	info->status.rates[0].flags = rate_flags;
J
Juuso Oikarinen 已提交
853 854
	info->status.ack_signal = -1;

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

857 858 859 860 861 862 863 864 865
	/*
	 * 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;
866
		u8 cur_lsb = wlvif->tx_security_last_seq_lsb;
867 868 869 870 871

		/*
		 * update security sequence number, taking care of potential
		 * wrap-around
		 */
872 873
		wlvif->tx_security_seq += (fw_lsb - cur_lsb) & 0xff;
		wlvif->tx_security_last_seq_lsb = fw_lsb;
874
	}
875

876 877 878 879
	/* remove private header from packet */
	skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

	/* remove TKIP header space if present */
L
Luciano Coelho 已提交
880
	if (info->control.hw_key &&
881
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) {
882
		int hdrlen = ieee80211_get_hdrlen_from_skb(skb);
883 884 885
		memmove(skb->data + WL1271_EXTRA_SPACE_TKIP, skb->data,
			hdrlen);
		skb_pull(skb, WL1271_EXTRA_SPACE_TKIP);
886
	}
L
Luciano Coelho 已提交
887 888 889 890 891 892 893

	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 */
894
	skb_queue_tail(&wl->deferred_tx_queue, skb);
895
	queue_work(wl->freezable_wq, &wl->netstack_work);
896
	wl1271_free_tx_id(wl, result->id);
L
Luciano Coelho 已提交
897 898 899
}

/* Called upon reception of a TX complete interrupt */
900
void wl1271_tx_complete(struct wl1271 *wl)
L
Luciano Coelho 已提交
901 902 903
{
	struct wl1271_acx_mem_map *memmap =
		(struct wl1271_acx_mem_map *)wl->target_mem_map;
904
	u32 count, fw_counter;
L
Luciano Coelho 已提交
905 906 907
	u32 i;

	/* read the tx results from the chipset */
T
Teemu Paasikivi 已提交
908 909
	wl1271_read(wl, le32_to_cpu(memmap->tx_result),
		    wl->tx_res_if, sizeof(*wl->tx_res_if), false);
910 911 912 913 914 915 916 917
	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;
918
	wl1271_debug(DEBUG_TX, "tx_complete received, packets: %d", count);
L
Luciano Coelho 已提交
919 920

	/* verify that the result buffer is not getting overrun */
921
	if (unlikely(count > TX_HW_RESULT_QUEUE_LEN))
L
Luciano Coelho 已提交
922 923 924 925 926 927 928 929 930 931 932 933 934 935 936
		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++;
	}
}

937 938 939
void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid)
{
	struct sk_buff *skb;
940
	int i;
941
	unsigned long flags;
942
	struct ieee80211_tx_info *info;
943
	int total[NUM_TX_QUEUES];
944 945

	for (i = 0; i < NUM_TX_QUEUES; i++) {
946
		total[i] = 0;
947 948
		while ((skb = skb_dequeue(&wl->links[hlid].tx_queue[i]))) {
			wl1271_debug(DEBUG_TX, "link freeing skb 0x%p", skb);
949 950 951 952 953 954 955 956

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

957
			total[i]++;
958 959 960 961
		}
	}

	spin_lock_irqsave(&wl->wl_lock, flags);
962 963
	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] -= total[i];
964 965 966 967 968
	spin_unlock_irqrestore(&wl->wl_lock, flags);

	wl1271_handle_tx_low_watermark(wl);
}

969
/* caller must hold wl->mutex and TX must be stopped */
970
void wl12xx_tx_reset_wlvif(struct wl1271 *wl, struct wl12xx_vif *wlvif)
L
Luciano Coelho 已提交
971 972 973 974
{
	int i;

	/* TX failure */
975 976
	for_each_set_bit(i, wlvif->links_map, WL12XX_MAX_LINKS) {
		if (wlvif->bss_type == BSS_TYPE_AP_BSS)
977
			wl1271_free_sta(wl, wlvif, i);
978 979
		else
			wlvif->sta.ba_rx_bitmap = 0;
980

981 982
		wl->links[i].allocated_pkts = 0;
		wl->links[i].prev_freed_pkts = 0;
L
Luciano Coelho 已提交
983
	}
984 985 986 987 988 989 990 991 992
	wlvif->last_tx_hlid = 0;

}
/* caller must hold wl->mutex and TX must be stopped */
void wl12xx_tx_reset(struct wl1271 *wl, bool reset_tx_queues)
{
	int i;
	struct sk_buff *skb;
	struct ieee80211_tx_info *info;
993

994 995 996 997 998 999 1000 1001
	/* only reset the queues if something bad happened */
	if (WARN_ON_ONCE(wl1271_tx_total_queue_count(wl) != 0)) {
		for (i = 0; i < WL12XX_MAX_LINKS; i++)
			wl1271_tx_reset_link_queues(wl, i);

		for (i = 0; i < NUM_TX_QUEUES; i++)
			wl->tx_queue_count[i] = 0;
	}
1002

1003
	wl->stopped_queues_map = 0;
L
Luciano Coelho 已提交
1004

1005 1006 1007
	/*
	 * Make sure the driver is at a consistent state, in case this
	 * function is called from a context other than interface removal.
1008
	 * This call will always wake the TX queues.
1009
	 */
1010 1011
	if (reset_tx_queues)
		wl1271_handle_tx_low_watermark(wl);
1012

1013
	for (i = 0; i < wl->num_tx_desc; i++) {
1014 1015 1016 1017 1018 1019 1020
		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);

1021
		if (!wl12xx_is_dummy_packet(wl, skb)) {
1022 1023 1024 1025 1026 1027 1028 1029 1030 1031
			/*
			 * 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);
1032
				memmove(skb->data + WL1271_EXTRA_SPACE_TKIP,
1033
					skb->data, hdrlen);
1034
				skb_pull(skb, WL1271_EXTRA_SPACE_TKIP);
1035
			}
1036

1037 1038
			info->status.rates[0].idx = -1;
			info->status.rates[0].count = 0;
1039

1040
			ieee80211_tx_status_ni(wl->hw, skb);
1041
		}
1042
	}
1043 1044 1045 1046 1047 1048 1049 1050
}

#define WL1271_TX_FLUSH_TIMEOUT 500000

/* caller must *NOT* hold wl->mutex */
void wl1271_tx_flush(struct wl1271 *wl)
{
	unsigned long timeout;
1051
	int i;
1052 1053 1054 1055
	timeout = jiffies + usecs_to_jiffies(WL1271_TX_FLUSH_TIMEOUT);

	while (!time_after(jiffies, timeout)) {
		mutex_lock(&wl->mutex);
1056
		wl1271_debug(DEBUG_TX, "flushing tx buffer: %d %d",
1057 1058 1059 1060
			     wl->tx_frames_cnt,
			     wl1271_tx_total_queue_count(wl));
		if ((wl->tx_frames_cnt == 0) &&
		    (wl1271_tx_total_queue_count(wl) == 0)) {
1061 1062 1063 1064 1065 1066 1067 1068
			mutex_unlock(&wl->mutex);
			return;
		}
		mutex_unlock(&wl->mutex);
		msleep(1);
	}

	wl1271_warning("Unable to flush all TX buffers, timed out.");
1069 1070 1071 1072 1073 1074

	/* forcibly flush all Tx buffers on our queues */
	mutex_lock(&wl->mutex);
	for (i = 0; i < WL12XX_MAX_LINKS; i++)
		wl1271_tx_reset_link_queues(wl, i);
	mutex_unlock(&wl->mutex);
L
Luciano Coelho 已提交
1075
}
A
Arik Nemtsov 已提交
1076

1077
u32 wl1271_tx_min_rate_get(struct wl1271 *wl, u32 rate_set)
A
Arik Nemtsov 已提交
1078
{
1079 1080
	if (WARN_ON(!rate_set))
		return 0;
A
Arik Nemtsov 已提交
1081

1082
	return BIT(__ffs(rate_set));
A
Arik Nemtsov 已提交
1083
}