tx.c 27.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
#include "wl12xx.h"
29
#include "debug.h"
S
Shahar Levi 已提交
30 31 32 33
#include "io.h"
#include "reg.h"
#include "ps.h"
#include "tx.h"
34
#include "event.h"
L
Luciano Coelho 已提交
35

E
Eliad Peller 已提交
36 37
static int wl1271_set_default_wep_key(struct wl1271 *wl,
				      struct wl12xx_vif *wlvif, u8 id)
38 39
{
	int ret;
E
Eliad Peller 已提交
40
	bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
41 42

	if (is_ap)
E
Eliad Peller 已提交
43
		ret = wl12xx_cmd_set_default_wep_key(wl, id,
44
						     wlvif->ap.bcast_hlid);
45
	else
E
Eliad Peller 已提交
46
		ret = wl12xx_cmd_set_default_wep_key(wl, id, wlvif->sta.hlid);
47 48 49 50 51 52 53 54

	if (ret < 0)
		return ret;

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

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

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

75 76 77
		wl->tx_frames[id] = NULL;
		wl->tx_frames_cnt--;
	}
L
Luciano Coelho 已提交
78 79
}

O
Ohad Ben-Cohen 已提交
80
static int wl1271_tx_update_filters(struct wl1271 *wl,
E
Eliad Peller 已提交
81 82
				    struct wl12xx_vif *wlvif,
				    struct sk_buff *skb)
O
Ohad Ben-Cohen 已提交
83 84
{
	struct ieee80211_hdr *hdr;
85
	int ret;
O
Ohad Ben-Cohen 已提交
86

87
	hdr = (struct ieee80211_hdr *)skb->data;
O
Ohad Ben-Cohen 已提交
88 89 90 91 92 93 94 95 96 97

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

E
Eliad Peller 已提交
98
	if (wlvif->dev_hlid != WL12XX_INVALID_LINK_ID)
99 100 101
		goto out;

	wl1271_debug(DEBUG_CMD, "starting device role for roaming");
102
	ret = wl12xx_start_dev(wl, wlvif);
103 104 105
	if (ret < 0)
		goto out;
out:
E
Eliad Peller 已提交
106
	return 0;
O
Ohad Ben-Cohen 已提交
107 108
}

109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
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);
}

125 126 127
static void wl1271_tx_regulate_link(struct wl1271 *wl,
				    struct wl12xx_vif *wlvif,
				    u8 hlid)
128
{
129
	bool fw_ps, single_sta;
130
	u8 tx_pkts;
131

132
	if (WARN_ON(!test_bit(hlid, wlvif->links_map)))
133 134 135
		return;

	fw_ps = test_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map);
136
	tx_pkts = wl->links[hlid].allocated_pkts;
137
	single_sta = (wl->active_sta_count == 1);
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 143
	 * Make an exception if this is the only connected station. In this
	 * case FW-memory congestion is not a problem.
144
	 */
145
	if (!single_sta && fw_ps && tx_pkts >= WL1271_PS_STA_MAX_PACKETS)
146
		wl12xx_ps_link_start(wl, wlvif, hlid, true);
147 148
}

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

154 155
u8 wl12xx_tx_get_hlid_ap(struct wl1271 *wl, struct wl12xx_vif *wlvif,
			 struct sk_buff *skb)
156 157 158 159 160 161 162 163 164 165 166 167
{
	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;

168
		if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags))
E
Eliad Peller 已提交
169 170
			return wl->system_hlid;

171 172
		hdr = (struct ieee80211_hdr *)skb->data;
		if (ieee80211_is_mgmt(hdr->frame_control))
173
			return wlvif->ap.global_hlid;
174
		else
175
			return wlvif->ap.bcast_hlid;
176 177 178
	}
}

179 180
u8 wl12xx_tx_get_hlid(struct wl1271 *wl, struct wl12xx_vif *wlvif,
		      struct sk_buff *skb)
E
Eliad Peller 已提交
181
{
182 183
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;

E
Eliad Peller 已提交
184
	if (!wlvif || wl12xx_is_dummy_packet(wl, skb))
E
Eliad Peller 已提交
185 186
		return wl->system_hlid;

E
Eliad Peller 已提交
187
	if (wlvif->bss_type == BSS_TYPE_AP_BSS)
188
		return wl12xx_tx_get_hlid_ap(wl, wlvif, skb);
E
Eliad Peller 已提交
189

E
Eliad Peller 已提交
190
	wl1271_tx_update_filters(wl, wlvif, skb);
191

192
	if ((test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) ||
193
	     test_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags)) &&
194 195
	    !ieee80211_is_auth(hdr->frame_control) &&
	    !ieee80211_is_assoc_req(hdr->frame_control))
E
Eliad Peller 已提交
196
		return wlvif->sta.hlid;
E
Eliad Peller 已提交
197
	else
E
Eliad Peller 已提交
198
		return wlvif->dev_hlid;
E
Eliad Peller 已提交
199 200
}

201 202 203
static unsigned int wl12xx_calc_packet_alignment(struct wl1271 *wl,
						unsigned int packet_length)
{
204
	if (wl->quirks & WL12XX_QUIRK_NO_BLOCKSIZE_ALIGNMENT)
205
		return ALIGN(packet_length, WL1271_TX_ALIGN_TO);
206 207
	else
		return ALIGN(packet_length, WL12XX_BUS_BLOCK_SIZE);
208 209
}

210
static int wl1271_tx_allocate(struct wl1271 *wl, struct wl12xx_vif *wlvif,
E
Eliad Peller 已提交
211 212
			      struct sk_buff *skb, u32 extra, u32 buf_offset,
			      u8 hlid)
L
Luciano Coelho 已提交
213 214 215
{
	struct wl1271_tx_hw_descr *desc;
	u32 total_len = skb->len + sizeof(struct wl1271_tx_hw_descr) + extra;
216
	u32 len;
217
	u32 total_blocks;
218
	int id, ret = -EBUSY, ac;
219
	u32 spare_blocks = wl->tx_spare_blocks;
220
	bool is_dummy = false;
L
Luciano Coelho 已提交
221

222
	if (buf_offset + total_len > WL1271_AGGR_BUFFER_SIZE)
I
Ido Yariv 已提交
223
		return -EAGAIN;
224

L
Luciano Coelho 已提交
225
	/* allocate free identifier for the packet */
226
	id = wl1271_alloc_tx_id(wl, skb);
L
Luciano Coelho 已提交
227 228 229 230 231
	if (id < 0)
		return id;

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

234
	/* in case of a dummy packet, use default amount of spare mem blocks */
235 236
	if (unlikely(wl12xx_is_dummy_packet(wl, skb))) {
		is_dummy = true;
237
		spare_blocks = TX_HW_BLOCK_SPARE_DEFAULT;
238
	}
239

240
	total_blocks = (len + TX_HW_BLOCK_SIZE - 1) / TX_HW_BLOCK_SIZE +
241
		spare_blocks;
242

L
Luciano Coelho 已提交
243 244 245 246
	if (total_blocks <= wl->tx_blocks_available) {
		desc = (struct wl1271_tx_hw_descr *)skb_push(
			skb, total_len - skb->len);

247 248 249 250
		/* 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 {
251
			desc->wl127x_mem.extra_blocks = spare_blocks;
252 253 254
			desc->wl127x_mem.total_mem_blocks = total_blocks;
		}

L
Luciano Coelho 已提交
255 256 257
		desc->id = id;

		wl->tx_blocks_available -= total_blocks;
258
		wl->tx_allocated_blocks += total_blocks;
L
Luciano Coelho 已提交
259

260 261
		ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
		wl->tx_allocated_pkts[ac]++;
262

E
Eliad Peller 已提交
263 264
		if (!is_dummy && wlvif &&
		    wlvif->bss_type == BSS_TYPE_AP_BSS &&
265
		    test_bit(hlid, wlvif->ap.sta_hlid_map))
266
			wl->links[hlid].allocated_pkts++;
267

L
Luciano Coelho 已提交
268 269 270 271 272
		ret = 0;

		wl1271_debug(DEBUG_TX,
			     "tx_allocate: size: %d, blocks: %d, id: %d",
			     total_len, total_blocks, id);
273
	} else {
274
		wl1271_free_tx_id(wl, id);
275
	}
L
Luciano Coelho 已提交
276 277 278 279

	return ret;
}

280
static void wl1271_tx_fill_hdr(struct wl1271 *wl, struct wl12xx_vif *wlvif,
E
Eliad Peller 已提交
281 282
			       struct sk_buff *skb, u32 extra,
			       struct ieee80211_tx_info *control, u8 hlid)
L
Luciano Coelho 已提交
283
{
284
	struct timespec ts;
L
Luciano Coelho 已提交
285
	struct wl1271_tx_hw_descr *desc;
286
	int aligned_len, ac, rate_idx;
287
	s64 hosttime;
L
Luciano Coelho 已提交
288
	u16 tx_attr;
289
	bool is_dummy;
L
Luciano Coelho 已提交
290 291 292

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

293 294 295 296
	/* relocate space for security header */
	if (extra) {
		void *framestart = skb->data + sizeof(*desc);
		u16 fc = *(u16 *)(framestart + extra);
L
Luciano Coelho 已提交
297
		int hdrlen = ieee80211_hdrlen(cpu_to_le16(fc));
298 299 300
		memmove(framestart, framestart + extra, hdrlen);
	}

L
Luciano Coelho 已提交
301
	/* configure packet life time */
302 303 304
	getnstimeofday(&ts);
	hosttime = (timespec_to_ns(&ts) >> 10);
	desc->start_time = cpu_to_le32(hosttime - wl->time_offset);
305

306
	is_dummy = wl12xx_is_dummy_packet(wl, skb);
E
Eliad Peller 已提交
307
	if (is_dummy || !wlvif || wlvif->bss_type != BSS_TYPE_AP_BSS)
308 309 310
		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 已提交
311

312
	/* queue */
K
Kalle Valo 已提交
313
	ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
314
	desc->tid = skb->priority;
315

316
	if (is_dummy) {
317 318 319 320
		/*
		 * FW expects the dummy packet to have an invalid session id -
		 * any session id that is different than the one set in the join
		 */
321
		tx_attr = (SESSION_COUNTER_INVALID <<
322 323 324 325
			   TX_HW_ATTR_OFST_SESSION_COUNTER) &
			   TX_HW_ATTR_SESSION_COUNTER;

		tx_attr |= TX_HW_ATTR_TX_DUMMY_REQ;
E
Eliad Peller 已提交
326
	} else if (wlvif) {
327
		/* configure the tx attributes */
328 329
		tx_attr = wlvif->session_counter <<
			  TX_HW_ATTR_OFST_SESSION_COUNTER;
330 331
	}

E
Eliad Peller 已提交
332
	desc->hlid = hlid;
E
Eliad Peller 已提交
333
	if (is_dummy || !wlvif)
334 335
		rate_idx = 0;
	else if (wlvif->bss_type != BSS_TYPE_AP_BSS) {
336 337 338 339
		/* 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)
E
Eliad Peller 已提交
340
			rate_idx = wlvif->sta.ap_rate_idx;
341
		else
E
Eliad Peller 已提交
342
			rate_idx = wlvif->sta.basic_rate_idx;
343
	} else {
344
		if (hlid == wlvif->ap.global_hlid)
E
Eliad Peller 已提交
345
			rate_idx = wlvif->ap.mgmt_rate_idx;
346
		else if (hlid == wlvif->ap.bcast_hlid)
E
Eliad Peller 已提交
347
			rate_idx = wlvif->ap.bcast_rate_idx;
348
		else
E
Eliad Peller 已提交
349
			rate_idx = wlvif->ap.ucast_rate_idx[ac];
350 351 352
	}

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

355
	aligned_len = wl12xx_calc_packet_alignment(wl, skb->len);
356

357
	if (wl->chip.id == CHIP_ID_1283_PG20) {
358 359
		desc->wl128x_mem.extra_bytes = aligned_len - skb->len;
		desc->length = cpu_to_le16(aligned_len >> 2);
360 361 362 363 364 365 366

		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);
367 368 369
	} else {
		int pad;

370
		/* Store the aligned length in terms of words */
371 372 373 374 375
		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 已提交
376

377 378 379 380 381 382
		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);
383
	}
L
Luciano Coelho 已提交
384 385

	desc->tx_attr = cpu_to_le16(tx_attr);
L
Luciano Coelho 已提交
386 387 388
}

/* caller must hold wl->mutex */
389 390
static int wl1271_prepare_tx_frame(struct wl1271 *wl, struct wl12xx_vif *wlvif,
				   struct sk_buff *skb, u32 buf_offset)
L
Luciano Coelho 已提交
391 392 393 394
{
	struct ieee80211_tx_info *info;
	u32 extra = 0;
	int ret = 0;
395
	u32 total_len;
396
	u8 hlid;
E
Eliad Peller 已提交
397
	bool is_dummy;
L
Luciano Coelho 已提交
398 399 400 401 402 403

	if (!skb)
		return -EINVAL;

	info = IEEE80211_SKB_CB(skb);

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

L
Luciano Coelho 已提交
407
	if (info->control.hw_key &&
408
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP)
L
Luciano Coelho 已提交
409 410 411
		extra = WL1271_TKIP_IV_SPACE;

	if (info->control.hw_key) {
412 413 414 415 416 417
		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 已提交
418

E
Eliad Peller 已提交
419
		if (unlikely(is_wep && wlvif->default_key != idx)) {
E
Eliad Peller 已提交
420
			ret = wl1271_set_default_wep_key(wl, wlvif, idx);
L
Luciano Coelho 已提交
421 422
			if (ret < 0)
				return ret;
E
Eliad Peller 已提交
423
			wlvif->default_key = idx;
L
Luciano Coelho 已提交
424 425
		}
	}
426
	hlid = wl12xx_tx_get_hlid(wl, wlvif, skb);
E
Eliad Peller 已提交
427
	if (hlid == WL12XX_INVALID_LINK_ID) {
428 429 430 431 432 433 434 435 436
		if (wlvif->bss_type == BSS_TYPE_IBSS &&
		    !test_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags)) {
			/* It's ok to drop packets when not joined to IBSS */
			wl1271_debug(DEBUG_TX, "dropping skb while IBSS not "
				     " joined");
		} else {
			wl1271_error("invalid hlid. dropping skb 0x%p", skb);
		}

E
Eliad Peller 已提交
437 438
		return -EINVAL;
	}
439

440
	ret = wl1271_tx_allocate(wl, wlvif, skb, extra, buf_offset, hlid);
L
Luciano Coelho 已提交
441 442 443
	if (ret < 0)
		return ret;

444
	wl1271_tx_fill_hdr(wl, wlvif, skb, extra, info, hlid);
445

E
Eliad Peller 已提交
446
	if (!is_dummy && wlvif && wlvif->bss_type == BSS_TYPE_AP_BSS) {
447
		wl1271_tx_ap_update_inconnection_sta(wl, skb);
448
		wl1271_tx_regulate_link(wl, wlvif, hlid);
449
	}
450

451
	/*
452 453 454 455 456 457
	 * 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).
458
	 */
459
	total_len = wl12xx_calc_packet_alignment(wl, skb->len);
460

461 462
	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 已提交
463

464
	/* Revert side effects in the dummy packet skb, so it can be reused */
E
Eliad Peller 已提交
465
	if (is_dummy)
466 467
		skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

468
	return total_len;
L
Luciano Coelho 已提交
469 470
}

471 472
u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set,
				enum ieee80211_band rate_band)
473 474 475 476 477
{
	struct ieee80211_supported_band *band;
	u32 enabled_rates = 0;
	int bit;

478
	band = wl->hw->wiphy->bands[rate_band];
479 480 481 482 483 484
	for (bit = 0; bit < band->n_bitrates; bit++) {
		if (rate_set & 0x1)
			enabled_rates |= band->bitrates[bit].hw_value;
		rate_set >>= 1;
	}

485 486 487 488 489 490 491 492 493
	/* 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;
	}

494 495 496
	return enabled_rates;
}

497
void wl1271_handle_tx_low_watermark(struct wl1271 *wl)
498 499
{
	unsigned long flags;
500
	int i;
501

502 503
	for (i = 0; i < NUM_TX_QUEUES; i++) {
		if (test_bit(i, &wl->stopped_queues_map) &&
504
		    wl->tx_queue_count[i] <= WL1271_TX_QUEUE_LOW_WATERMARK) {
505 506 507 508 509 510 511
			/* 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);
		}
512 513 514
	}
}

515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542
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];
}

543 544
static struct sk_buff *wl12xx_lnk_skb_dequeue(struct wl1271 *wl,
					      struct wl1271_link *lnk)
545
{
546
	struct sk_buff *skb;
547
	unsigned long flags;
548
	struct sk_buff_head *queue;
549

550
	queue = wl1271_select_queue(wl, lnk->tx_queue);
551
	if (!queue)
552
		return NULL;
553 554

	skb = skb_dequeue(queue);
555
	if (skb) {
556
		int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
557
		spin_lock_irqsave(&wl->wl_lock, flags);
558
		wl->tx_queue_count[q]--;
559 560 561 562 563 564
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}

	return skb;
}

565 566
static struct sk_buff *wl12xx_vif_skb_dequeue(struct wl1271 *wl,
					      struct wl12xx_vif *wlvif)
567 568 569 570 571
{
	struct sk_buff *skb = NULL;
	int i, h, start_hlid;

	/* start from the link after the last one */
572
	start_hlid = (wlvif->last_tx_hlid + 1) % WL12XX_MAX_LINKS;
573 574

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

578
		/* only consider connected stations */
579
		if (!test_bit(h, wlvif->links_map))
580 581
			continue;

582 583
		skb = wl12xx_lnk_skb_dequeue(wl, &wl->links[h]);
		if (!skb)
584 585
			continue;

586 587
		wlvif->last_tx_hlid = h;
		break;
588 589
	}

590
	if (!skb)
591
		wlvif->last_tx_hlid = 0;
592 593 594 595

	return skb;
}

596
static struct sk_buff *wl1271_skb_dequeue(struct wl1271 *wl)
597
{
598
	unsigned long flags;
599
	struct wl12xx_vif *wlvif = wl->last_wlvif;
600 601
	struct sk_buff *skb = NULL;

602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620
	if (wlvif) {
		wl12xx_for_each_wlvif_continue(wl, wlvif) {
			skb = wl12xx_vif_skb_dequeue(wl, wlvif);
			if (skb) {
				wl->last_wlvif = wlvif;
				break;
			}
		}
	}

	/* do another pass */
	if (!skb) {
		wl12xx_for_each_wlvif(wl, wlvif) {
			skb = wl12xx_vif_skb_dequeue(wl, wlvif);
			if (skb) {
				wl->last_wlvif = wlvif;
				break;
			}
		}
621 622
	}

E
Eliad Peller 已提交
623 624 625
	if (!skb)
		skb = wl12xx_lnk_skb_dequeue(wl, &wl->links[wl->system_hlid]);

626 627
	if (!skb &&
	    test_and_clear_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags)) {
628 629
		int q;

630
		skb = wl->dummy_packet;
631
		q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
632
		spin_lock_irqsave(&wl->wl_lock, flags);
633
		wl->tx_queue_count[q]--;
634 635 636 637
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}

	return skb;
638 639
}

640
static void wl1271_skb_queue_head(struct wl1271 *wl, struct wl12xx_vif *wlvif,
E
Eliad Peller 已提交
641
				  struct sk_buff *skb)
642 643 644 645
{
	unsigned long flags;
	int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));

646 647
	if (wl12xx_is_dummy_packet(wl, skb)) {
		set_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags);
648 649
	} else {
		u8 hlid = wl12xx_tx_get_hlid(wl, wlvif, skb);
650 651 652
		skb_queue_head(&wl->links[hlid].tx_queue[q], skb);

		/* make sure we dequeue the same packet next time */
653
		wlvif->last_tx_hlid = (hlid + WL12XX_MAX_LINKS - 1) %
654
				      WL12XX_MAX_LINKS;
655 656
	}

657
	spin_lock_irqsave(&wl->wl_lock, flags);
658
	wl->tx_queue_count[q]++;
659 660 661
	spin_unlock_irqrestore(&wl->wl_lock, flags);
}

662 663 664 665 666 667 668
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 已提交
669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695
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 */
696
		if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags))
E
Eliad Peller 已提交
697 698 699 700 701 702 703 704
			ieee80211_queue_work(wl->hw,
					     &wlvif->rx_streaming_enable_work);

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

705
void wl1271_tx_work_locked(struct wl1271 *wl)
L
Luciano Coelho 已提交
706
{
707
	struct wl12xx_vif *wlvif;
L
Luciano Coelho 已提交
708
	struct sk_buff *skb;
E
Eliad Peller 已提交
709
	struct wl1271_tx_hw_descr *desc;
I
Ido Yariv 已提交
710 711
	u32 buf_offset = 0;
	bool sent_packets = false;
E
Eliad Peller 已提交
712
	unsigned long active_hlids[BITS_TO_LONGS(WL12XX_MAX_LINKS)] = {0};
L
Luciano Coelho 已提交
713 714 715
	int ret;

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

718
	while ((skb = wl1271_skb_dequeue(wl))) {
E
Eliad Peller 已提交
719
		struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
E
Eliad Peller 已提交
720 721
		bool has_data = false;

722
		wlvif = NULL;
E
Eliad Peller 已提交
723 724
		if (!wl12xx_is_dummy_packet(wl, skb) && info->control.vif)
			wlvif = wl12xx_vif_to_data(info->control.vif);
725

E
Eliad Peller 已提交
726
		has_data = wlvif && wl1271_tx_is_data_present(skb);
727
		ret = wl1271_prepare_tx_frame(wl, wlvif, skb, buf_offset);
I
Ido Yariv 已提交
728
		if (ret == -EAGAIN) {
729
			/*
I
Ido Yariv 已提交
730 731 732
			 * Aggregation buffer is full.
			 * Flush buffer and try again.
			 */
733
			wl1271_skb_queue_head(wl, wlvif, skb);
I
Ido Yariv 已提交
734
			wl1271_write(wl, WL1271_SLV_MEM_DATA, wl->aggr_buf,
735
				     buf_offset, true);
I
Ido Yariv 已提交
736 737 738 739 740 741
			sent_packets = true;
			buf_offset = 0;
			continue;
		} else if (ret == -EBUSY) {
			/*
			 * Firmware buffer is full.
742 743
			 * Queue back last skb, and stop aggregating.
			 */
744
			wl1271_skb_queue_head(wl, wlvif, skb);
I
Ido Yariv 已提交
745 746
			/* No work left, avoid scheduling redundant tx work */
			set_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
747
			goto out_ack;
L
Luciano Coelho 已提交
748 749
		} else if (ret < 0) {
			dev_kfree_skb(skb);
750
			goto out_ack;
L
Luciano Coelho 已提交
751
		}
752 753
		buf_offset += ret;
		wl->tx_packets_count++;
E
Eliad Peller 已提交
754 755 756 757
		if (has_data) {
			desc = (struct wl1271_tx_hw_descr *) skb->data;
			__set_bit(desc->hlid, active_hlids);
		}
L
Luciano Coelho 已提交
758 759
	}

760
out_ack:
761 762 763
	if (buf_offset) {
		wl1271_write(wl, WL1271_SLV_MEM_DATA, wl->aggr_buf,
				buf_offset, true);
I
Ido Yariv 已提交
764 765 766
		sent_packets = true;
	}
	if (sent_packets) {
767 768 769 770 771 772 773 774
		/*
		 * 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);

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

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

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

790
	wl1271_tx_work_locked(wl);
791

792
	wl1271_ps_elp_sleep(wl);
793
out:
L
Luciano Coelho 已提交
794 795 796 797 798 799 800
	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;
801 802
	struct ieee80211_vif *vif;
	struct wl12xx_vif *wlvif;
L
Luciano Coelho 已提交
803 804
	struct sk_buff *skb;
	int id = result->id;
J
Juuso Oikarinen 已提交
805 806
	int rate = -1;
	u8 retries = 0;
L
Luciano Coelho 已提交
807 808

	/* check for id legality */
809
	if (unlikely(id >= ACX_TX_DESCRIPTORS || wl->tx_frames[id] == NULL)) {
L
Luciano Coelho 已提交
810 811 812 813 814 815 816
		wl1271_warning("TX result illegal id: %d", id);
		return;
	}

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

817
	if (wl12xx_is_dummy_packet(wl, skb)) {
818 819 820 821
		wl1271_free_tx_id(wl, id);
		return;
	}

822 823 824 825
	/* 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 已提交
826 827 828
	/* update the TX status info */
	if (result->status == TX_SUCCESS) {
		if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
L
Luciano Coelho 已提交
829
			info->flags |= IEEE80211_TX_STAT_ACK;
E
Eliad Peller 已提交
830 831
		rate = wl1271_rate_to_idx(result->rate_class_index,
					  wlvif->band);
J
Juuso Oikarinen 已提交
832 833 834 835
		retries = result->ack_failures;
	} else if (result->status == TX_RETRY_EXCEEDED) {
		wl->stats.excessive_retries++;
		retries = result->ack_failures;
L
Luciano Coelho 已提交
836 837
	}

J
Juuso Oikarinen 已提交
838 839 840 841 842
	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 已提交
843 844
	wl->stats.retry_count += result->ack_failures;

845 846 847 848 849 850 851 852 853
	/*
	 * 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;
854
		u8 cur_lsb = wlvif->tx_security_last_seq_lsb;
855 856 857 858 859

		/*
		 * update security sequence number, taking care of potential
		 * wrap-around
		 */
860 861
		wlvif->tx_security_seq += (fw_lsb - cur_lsb) & 0xff;
		wlvif->tx_security_last_seq_lsb = fw_lsb;
862
	}
863

864 865 866 867
	/* remove private header from packet */
	skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

	/* remove TKIP header space if present */
L
Luciano Coelho 已提交
868
	if (info->control.hw_key &&
869
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) {
870 871 872 873
		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 已提交
874 875 876 877 878 879 880

	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 */
881
	skb_queue_tail(&wl->deferred_tx_queue, skb);
882
	queue_work(wl->freezable_wq, &wl->netstack_work);
883
	wl1271_free_tx_id(wl, result->id);
L
Luciano Coelho 已提交
884 885 886
}

/* Called upon reception of a TX complete interrupt */
887
void wl1271_tx_complete(struct wl1271 *wl)
L
Luciano Coelho 已提交
888 889 890
{
	struct wl1271_acx_mem_map *memmap =
		(struct wl1271_acx_mem_map *)wl->target_mem_map;
891
	u32 count, fw_counter;
L
Luciano Coelho 已提交
892 893 894
	u32 i;

	/* read the tx results from the chipset */
T
Teemu Paasikivi 已提交
895 896
	wl1271_read(wl, le32_to_cpu(memmap->tx_result),
		    wl->tx_res_if, sizeof(*wl->tx_res_if), false);
897 898 899 900 901 902 903 904
	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;
905
	wl1271_debug(DEBUG_TX, "tx_complete received, packets: %d", count);
L
Luciano Coelho 已提交
906 907

	/* verify that the result buffer is not getting overrun */
908
	if (unlikely(count > TX_HW_RESULT_QUEUE_LEN))
L
Luciano Coelho 已提交
909 910 911 912 913 914 915 916 917 918 919 920 921 922 923
		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++;
	}
}

924 925 926
void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid)
{
	struct sk_buff *skb;
927
	int i;
928
	unsigned long flags;
929
	struct ieee80211_tx_info *info;
930
	int total[NUM_TX_QUEUES];
931 932

	for (i = 0; i < NUM_TX_QUEUES; i++) {
933
		total[i] = 0;
934 935
		while ((skb = skb_dequeue(&wl->links[hlid].tx_queue[i]))) {
			wl1271_debug(DEBUG_TX, "link freeing skb 0x%p", skb);
936 937 938 939 940 941 942 943

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

944
			total[i]++;
945 946 947 948
		}
	}

	spin_lock_irqsave(&wl->wl_lock, flags);
949 950
	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] -= total[i];
951 952 953 954 955
	spin_unlock_irqrestore(&wl->wl_lock, flags);

	wl1271_handle_tx_low_watermark(wl);
}

956
/* caller must hold wl->mutex and TX must be stopped */
957
void wl12xx_tx_reset_wlvif(struct wl1271 *wl, struct wl12xx_vif *wlvif)
L
Luciano Coelho 已提交
958 959 960 961
{
	int i;

	/* TX failure */
962 963
	for_each_set_bit(i, wlvif->links_map, WL12XX_MAX_LINKS) {
		if (wlvif->bss_type == BSS_TYPE_AP_BSS)
964
			wl1271_free_sta(wl, wlvif, i);
965 966
		else
			wlvif->sta.ba_rx_bitmap = 0;
967

968 969 970
		wl1271_tx_reset_link_queues(wl, i);
		wl->links[i].allocated_pkts = 0;
		wl->links[i].prev_freed_pkts = 0;
L
Luciano Coelho 已提交
971
	}
972 973 974 975 976 977 978 979 980
	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;
981

982 983 984
	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] = 0;

985
	wl->stopped_queues_map = 0;
L
Luciano Coelho 已提交
986

987 988 989
	/*
	 * Make sure the driver is at a consistent state, in case this
	 * function is called from a context other than interface removal.
990
	 * This call will always wake the TX queues.
991
	 */
992 993
	if (reset_tx_queues)
		wl1271_handle_tx_low_watermark(wl);
994

995 996 997 998 999 1000 1001 1002
	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);

1003
		if (!wl12xx_is_dummy_packet(wl, skb)) {
1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
			/*
			 * 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);
			}
1018

1019 1020
			info->status.rates[0].idx = -1;
			info->status.rates[0].count = 0;
1021

1022
			ieee80211_tx_status_ni(wl->hw, skb);
1023
		}
1024
	}
1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036
}

#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);
1037
		wl1271_debug(DEBUG_TX, "flushing tx buffer: %d %d",
1038 1039 1040 1041
			     wl->tx_frames_cnt,
			     wl1271_tx_total_queue_count(wl));
		if ((wl->tx_frames_cnt == 0) &&
		    (wl1271_tx_total_queue_count(wl) == 0)) {
1042 1043 1044 1045 1046 1047 1048 1049
			mutex_unlock(&wl->mutex);
			return;
		}
		mutex_unlock(&wl->mutex);
		msleep(1);
	}

	wl1271_warning("Unable to flush all TX buffers, timed out.");
L
Luciano Coelho 已提交
1050
}
A
Arik Nemtsov 已提交
1051

1052
u32 wl1271_tx_min_rate_get(struct wl1271 *wl, u32 rate_set)
A
Arik Nemtsov 已提交
1053
{
1054 1055
	if (WARN_ON(!rate_set))
		return 0;
A
Arik Nemtsov 已提交
1056

1057
	return BIT(__ffs(rate_set));
A
Arik Nemtsov 已提交
1058
}