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

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");
E
Eliad Peller 已提交
102
	ret = wl12xx_cmd_role_start_dev(wl, wlvif);
103 104 105
	if (ret < 0)
		goto out;

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

113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
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);
}

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

136
	if (WARN_ON(!test_bit(hlid, wlvif->links_map)))
137 138 139
		return;

	fw_ps = test_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map);
140
	tx_pkts = wl->links[hlid].allocated_pkts;
141
	single_sta = (wl->active_sta_count == 1);
142 143 144 145

	/*
	 * 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.
146 147
	 * Make an exception if this is the only connected station. In this
	 * case FW-memory congestion is not a problem.
148
	 */
149
	if (!single_sta && fw_ps && tx_pkts >= WL1271_PS_STA_MAX_PACKETS)
150
		wl12xx_ps_link_start(wl, wlvif, hlid, true);
151 152
}

153
bool wl12xx_is_dummy_packet(struct wl1271 *wl, struct sk_buff *skb)
E
Eliad Peller 已提交
154 155 156 157
{
	return wl->dummy_packet == skb;
}

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

172
		if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags))
E
Eliad Peller 已提交
173 174
			return wl->system_hlid;

175 176
		hdr = (struct ieee80211_hdr *)skb->data;
		if (ieee80211_is_mgmt(hdr->frame_control))
177
			return wlvif->ap.global_hlid;
178
		else
179
			return wlvif->ap.bcast_hlid;
180 181 182
	}
}

183 184
u8 wl12xx_tx_get_hlid(struct wl1271 *wl, struct wl12xx_vif *wlvif,
		      struct sk_buff *skb)
E
Eliad Peller 已提交
185
{
186 187
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;

E
Eliad Peller 已提交
188 189 190
	if (wl12xx_is_dummy_packet(wl, skb))
		return wl->system_hlid;

E
Eliad Peller 已提交
191
	if (wlvif->bss_type == BSS_TYPE_AP_BSS)
192
		return wl12xx_tx_get_hlid_ap(wl, wlvif, skb);
E
Eliad Peller 已提交
193

E
Eliad Peller 已提交
194
	wl1271_tx_update_filters(wl, wlvif, skb);
195

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

205 206 207 208 209 210 211 212 213
static unsigned int wl12xx_calc_packet_alignment(struct wl1271 *wl,
						unsigned int packet_length)
{
	if (wl->quirks & WL12XX_QUIRK_BLOCKSIZE_ALIGNMENT)
		return ALIGN(packet_length, WL12XX_BUS_BLOCK_SIZE);
	else
		return ALIGN(packet_length, WL1271_TX_ALIGN_TO);
}

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

226
	if (buf_offset + total_len > WL1271_AGGR_BUFFER_SIZE)
I
Ido Yariv 已提交
227
		return -EAGAIN;
228

L
Luciano Coelho 已提交
229
	/* allocate free identifier for the packet */
230
	id = wl1271_alloc_tx_id(wl, skb);
L
Luciano Coelho 已提交
231 232 233 234 235
	if (id < 0)
		return id;

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

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

244
	total_blocks = (len + TX_HW_BLOCK_SIZE - 1) / TX_HW_BLOCK_SIZE +
245
		spare_blocks;
246

L
Luciano Coelho 已提交
247 248 249 250
	if (total_blocks <= wl->tx_blocks_available) {
		desc = (struct wl1271_tx_hw_descr *)skb_push(
			skb, total_len - skb->len);

251 252 253 254
		/* 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 {
255
			desc->wl127x_mem.extra_blocks = spare_blocks;
256 257 258
			desc->wl127x_mem.total_mem_blocks = total_blocks;
		}

L
Luciano Coelho 已提交
259 260 261
		desc->id = id;

		wl->tx_blocks_available -= total_blocks;
262
		wl->tx_allocated_blocks += total_blocks;
L
Luciano Coelho 已提交
263

264 265
		ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
		wl->tx_allocated_pkts[ac]++;
266

267
		if (!is_dummy && wlvif->bss_type == BSS_TYPE_AP_BSS &&
268
		    test_bit(hlid, wlvif->ap.sta_hlid_map))
269
			wl->links[hlid].allocated_pkts++;
270

L
Luciano Coelho 已提交
271 272 273 274 275
		ret = 0;

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

	return ret;
}

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

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

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

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

309 310
	is_dummy = wl12xx_is_dummy_packet(wl, skb);
	if (is_dummy || wlvif->bss_type != BSS_TYPE_AP_BSS)
311 312 313
		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 已提交
314

315
	/* queue */
K
Kalle Valo 已提交
316
	ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
317
	desc->tid = skb->priority;
318

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

		tx_attr |= TX_HW_ATTR_TX_DUMMY_REQ;
	} else {
		/* configure the tx attributes */
331 332
		tx_attr = wlvif->session_counter <<
			  TX_HW_ATTR_OFST_SESSION_COUNTER;
333 334
	}

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

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

358
	aligned_len = wl12xx_calc_packet_alignment(wl, skb->len);
359

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

		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);
370 371 372
	} else {
		int pad;

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

380 381 382 383 384 385
		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);
386
	}
L
Luciano Coelho 已提交
387 388

	desc->tx_attr = cpu_to_le16(tx_attr);
L
Luciano Coelho 已提交
389 390 391
}

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

	if (!skb)
		return -EINVAL;

	info = IEEE80211_SKB_CB(skb);

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

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

	if (info->control.hw_key) {
415 416 417 418 419 420
		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 已提交
421

E
Eliad Peller 已提交
422
		if (unlikely(is_wep && wlvif->default_key != idx)) {
E
Eliad Peller 已提交
423
			ret = wl1271_set_default_wep_key(wl, wlvif, idx);
L
Luciano Coelho 已提交
424 425
			if (ret < 0)
				return ret;
E
Eliad Peller 已提交
426
			wlvif->default_key = idx;
L
Luciano Coelho 已提交
427 428
		}
	}
429
	hlid = wl12xx_tx_get_hlid(wl, wlvif, skb);
E
Eliad Peller 已提交
430
	if (hlid == WL12XX_INVALID_LINK_ID) {
431 432 433 434 435 436 437 438 439
		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 已提交
440 441
		return -EINVAL;
	}
442

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

447
	wl1271_tx_fill_hdr(wl, wlvif, skb, extra, info, hlid);
448

449
	if (!is_dummy && wlvif->bss_type == BSS_TYPE_AP_BSS) {
450
		wl1271_tx_ap_update_inconnection_sta(wl, skb);
451
		wl1271_tx_regulate_link(wl, wlvif, hlid);
452
	}
453

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

464 465
	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 已提交
466

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

471
	return total_len;
L
Luciano Coelho 已提交
472 473
}

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

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

488 489 490 491 492 493 494 495 496
	/* 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;
	}

497 498 499
	return enabled_rates;
}

500
void wl1271_handle_tx_low_watermark(struct wl1271 *wl)
501 502
{
	unsigned long flags;
503
	int i;
504

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

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

553
	queue = wl1271_select_queue(wl, lnk->tx_queue);
554
	if (!queue)
555
		return NULL;
556 557

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

	return skb;
}

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

	/* start from the link after the last one */
575
	start_hlid = (wlvif->last_tx_hlid + 1) % WL12XX_MAX_LINKS;
576 577

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

581
		/* only consider connected stations */
582
		if (!test_bit(h, wlvif->links_map))
583 584
			continue;

585 586
		skb = wl12xx_lnk_skb_dequeue(wl, &wl->links[h]);
		if (!skb)
587 588
			continue;

589 590
		wlvif->last_tx_hlid = h;
		break;
591 592
	}

593
	if (!skb)
594
		wlvif->last_tx_hlid = 0;
595 596 597 598

	return skb;
}

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

605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623
	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;
			}
		}
624 625
	}

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 720
		bool has_data = false;

721 722 723 724 725 726 727 728 729
		wlvif = NULL;
		if (!wl12xx_is_dummy_packet(wl, skb)) {
			struct ieee80211_tx_info *info;
			struct ieee80211_vif *vif;

			info = IEEE80211_SKB_CB(skb);
			vif = info->control.vif;
			wlvif = wl12xx_vif_to_data(vif);
		}
E
Eliad Peller 已提交
730
		has_data = wlvif && wl1271_tx_is_data_present(skb);
731

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

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

780
		wl1271_handle_tx_low_watermark(wl);
781
	}
E
Eliad Peller 已提交
782
	wl12xx_rearm_rx_streaming(wl, active_hlids);
I
Ido Yariv 已提交
783
}
L
Luciano Coelho 已提交
784

I
Ido Yariv 已提交
785 786 787
void wl1271_tx_work(struct work_struct *work)
{
	struct wl1271 *wl = container_of(work, struct wl1271, tx_work);
788
	int ret;
I
Ido Yariv 已提交
789 790

	mutex_lock(&wl->mutex);
791 792 793 794
	ret = wl1271_ps_elp_wakeup(wl);
	if (ret < 0)
		goto out;

795
	wl1271_tx_work_locked(wl);
796

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

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

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

822
	if (wl12xx_is_dummy_packet(wl, skb)) {
823 824 825 826
		wl1271_free_tx_id(wl, id);
		return;
	}

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

J
Juuso Oikarinen 已提交
843 844 845 846 847
	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 已提交
848 849
	wl->stats.retry_count += result->ack_failures;

850 851 852 853 854 855 856 857 858
	/*
	 * 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;
859
		u8 cur_lsb = wlvif->tx_security_last_seq_lsb;
860 861 862 863 864

		/*
		 * update security sequence number, taking care of potential
		 * wrap-around
		 */
865 866
		wlvif->tx_security_seq += (fw_lsb - cur_lsb) & 0xff;
		wlvif->tx_security_last_seq_lsb = fw_lsb;
867
	}
868

869 870 871 872
	/* remove private header from packet */
	skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

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

	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 */
886
	skb_queue_tail(&wl->deferred_tx_queue, skb);
887
	queue_work(wl->freezable_wq, &wl->netstack_work);
888
	wl1271_free_tx_id(wl, result->id);
L
Luciano Coelho 已提交
889 890 891
}

/* Called upon reception of a TX complete interrupt */
892
void wl1271_tx_complete(struct wl1271 *wl)
L
Luciano Coelho 已提交
893 894 895
{
	struct wl1271_acx_mem_map *memmap =
		(struct wl1271_acx_mem_map *)wl->target_mem_map;
896
	u32 count, fw_counter;
L
Luciano Coelho 已提交
897 898 899
	u32 i;

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

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

929 930 931
void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid)
{
	struct sk_buff *skb;
932
	int i;
933
	unsigned long flags;
934
	struct ieee80211_tx_info *info;
935
	int total[NUM_TX_QUEUES];
936 937

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

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

949
			total[i]++;
950 951 952 953
		}
	}

	spin_lock_irqsave(&wl->wl_lock, flags);
954 955
	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] -= total[i];
956 957 958 959 960
	spin_unlock_irqrestore(&wl->wl_lock, flags);

	wl1271_handle_tx_low_watermark(wl);
}

961
/* caller must hold wl->mutex and TX must be stopped */
962
void wl12xx_tx_reset_wlvif(struct wl1271 *wl, struct wl12xx_vif *wlvif)
L
Luciano Coelho 已提交
963 964 965 966
{
	int i;

	/* TX failure */
967 968
	for_each_set_bit(i, wlvif->links_map, WL12XX_MAX_LINKS) {
		if (wlvif->bss_type == BSS_TYPE_AP_BSS)
969
			wl1271_free_sta(wl, wlvif, i);
970 971
		else
			wlvif->sta.ba_rx_bitmap = 0;
972

973 974 975
		wl1271_tx_reset_link_queues(wl, i);
		wl->links[i].allocated_pkts = 0;
		wl->links[i].prev_freed_pkts = 0;
L
Luciano Coelho 已提交
976
	}
977 978 979 980 981 982 983 984 985
	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;
986

987 988 989
	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] = 0;

990
	wl->stopped_queues_map = 0;
L
Luciano Coelho 已提交
991

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

1000 1001 1002 1003 1004 1005 1006 1007
	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);

1008
		if (!wl12xx_is_dummy_packet(wl, skb)) {
1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022
			/*
			 * 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);
			}
1023

1024 1025
			info->status.rates[0].idx = -1;
			info->status.rates[0].count = 0;
1026

1027
			ieee80211_tx_status_ni(wl->hw, skb);
1028
		}
1029
	}
1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041
}

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

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

1057
u32 wl1271_tx_min_rate_get(struct wl1271 *wl, u32 rate_set)
A
Arik Nemtsov 已提交
1058
{
1059 1060
	if (WARN_ON(!rate_set))
		return 0;
A
Arik Nemtsov 已提交
1061

1062
	return BIT(__ffs(rate_set));
A
Arik Nemtsov 已提交
1063
}