tx.c 27.1 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 431 432 433
	if (hlid == WL12XX_INVALID_LINK_ID) {
		wl1271_error("invalid hlid. dropping skb 0x%p", skb);
		return -EINVAL;
	}
434

435
	ret = wl1271_tx_allocate(wl, wlvif, skb, extra, buf_offset, hlid);
L
Luciano Coelho 已提交
436 437 438
	if (ret < 0)
		return ret;

439
	wl1271_tx_fill_hdr(wl, wlvif, skb, extra, info, hlid);
440

441
	if (!is_dummy && wlvif->bss_type == BSS_TYPE_AP_BSS) {
442
		wl1271_tx_ap_update_inconnection_sta(wl, skb);
443
		wl1271_tx_regulate_link(wl, wlvif, hlid);
444
	}
445

446
	/*
447 448 449 450 451 452
	 * 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).
453
	 */
454
	total_len = wl12xx_calc_packet_alignment(wl, skb->len);
455

456 457
	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 已提交
458

459
	/* Revert side effects in the dummy packet skb, so it can be reused */
E
Eliad Peller 已提交
460
	if (is_dummy)
461 462
		skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

463
	return total_len;
L
Luciano Coelho 已提交
464 465
}

466 467
u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set,
				enum ieee80211_band rate_band)
468 469 470 471 472
{
	struct ieee80211_supported_band *band;
	u32 enabled_rates = 0;
	int bit;

473
	band = wl->hw->wiphy->bands[rate_band];
474 475 476 477 478 479
	for (bit = 0; bit < band->n_bitrates; bit++) {
		if (rate_set & 0x1)
			enabled_rates |= band->bitrates[bit].hw_value;
		rate_set >>= 1;
	}

480 481 482 483 484 485 486 487 488
	/* 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;
	}

489 490 491
	return enabled_rates;
}

492
void wl1271_handle_tx_low_watermark(struct wl1271 *wl)
493 494
{
	unsigned long flags;
495
	int i;
496

497 498
	for (i = 0; i < NUM_TX_QUEUES; i++) {
		if (test_bit(i, &wl->stopped_queues_map) &&
499
		    wl->tx_queue_count[i] <= WL1271_TX_QUEUE_LOW_WATERMARK) {
500 501 502 503 504 505 506
			/* 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);
		}
507 508 509
	}
}

510 511 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
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];
}

538 539
static struct sk_buff *wl12xx_lnk_skb_dequeue(struct wl1271 *wl,
					      struct wl1271_link *lnk)
540
{
541
	struct sk_buff *skb;
542
	unsigned long flags;
543
	struct sk_buff_head *queue;
544

545
	queue = wl1271_select_queue(wl, lnk->tx_queue);
546
	if (!queue)
547
		return NULL;
548 549

	skb = skb_dequeue(queue);
550
	if (skb) {
551
		int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
552
		spin_lock_irqsave(&wl->wl_lock, flags);
553
		wl->tx_queue_count[q]--;
554 555 556 557 558 559
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}

	return skb;
}

560 561
static struct sk_buff *wl12xx_vif_skb_dequeue(struct wl1271 *wl,
					      struct wl12xx_vif *wlvif)
562 563 564 565 566
{
	struct sk_buff *skb = NULL;
	int i, h, start_hlid;

	/* start from the link after the last one */
567
	start_hlid = (wlvif->last_tx_hlid + 1) % WL12XX_MAX_LINKS;
568 569

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

573
		/* only consider connected stations */
574
		if (!test_bit(h, wlvif->links_map))
575 576
			continue;

577 578
		skb = wl12xx_lnk_skb_dequeue(wl, &wl->links[h]);
		if (!skb)
579 580
			continue;

581 582
		wlvif->last_tx_hlid = h;
		break;
583 584
	}

585
	if (!skb)
586
		wlvif->last_tx_hlid = 0;
587 588 589 590

	return skb;
}

591
static struct sk_buff *wl1271_skb_dequeue(struct wl1271 *wl)
592
{
593
	unsigned long flags;
594
	struct wl12xx_vif *wlvif = wl->last_wlvif;
595 596
	struct sk_buff *skb = NULL;

597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615
	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;
			}
		}
616 617
	}

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

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

	return skb;
630 631
}

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

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

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

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

654 655 656 657 658 659 660
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 已提交
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 687
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 */
688
		if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags))
E
Eliad Peller 已提交
689 690 691 692 693 694 695 696
			ieee80211_queue_work(wl->hw,
					     &wlvif->rx_streaming_enable_work);

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

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

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

710
	while ((skb = wl1271_skb_dequeue(wl))) {
E
Eliad Peller 已提交
711 712
		bool has_data = false;

713 714 715 716 717 718 719 720 721
		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 已提交
722
		has_data = wlvif && wl1271_tx_is_data_present(skb);
723

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

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

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

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

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

787
	wl1271_tx_work_locked(wl);
788

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

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

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

814
	if (wl12xx_is_dummy_packet(wl, skb)) {
815 816 817 818
		wl1271_free_tx_id(wl, id);
		return;
	}

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

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

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

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

861 862 863 864
	/* remove private header from packet */
	skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

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

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

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

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

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

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

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

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

941
			total[i]++;
942 943 944 945
		}
	}

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

	wl1271_handle_tx_low_watermark(wl);
}

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

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

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

979 980 981
	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] = 0;

982
	wl->stopped_queues_map = 0;
L
Luciano Coelho 已提交
983

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

992 993 994 995 996 997 998 999
	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);

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

1016 1017
			info->status.rates[0].idx = -1;
			info->status.rates[0].count = 0;
1018

1019
			ieee80211_tx_status_ni(wl->hw, skb);
1020
		}
1021
	}
1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033
}

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

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

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

1054
	return BIT(__ffs(rate_set));
A
Arik Nemtsov 已提交
1055
}