tx.c 28.2 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
}

80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
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);
}

96 97 98
static void wl1271_tx_regulate_link(struct wl1271 *wl,
				    struct wl12xx_vif *wlvif,
				    u8 hlid)
99
{
100
	bool fw_ps, single_sta;
101
	u8 tx_pkts;
102

103
	if (WARN_ON(!test_bit(hlid, wlvif->links_map)))
104 105 106
		return;

	fw_ps = test_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map);
107
	tx_pkts = wl->links[hlid].allocated_pkts;
108
	single_sta = (wl->active_sta_count == 1);
109 110 111 112

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

120
bool wl12xx_is_dummy_packet(struct wl1271 *wl, struct sk_buff *skb)
E
Eliad Peller 已提交
121 122 123 124
{
	return wl->dummy_packet == skb;
}

125 126
u8 wl12xx_tx_get_hlid_ap(struct wl1271 *wl, struct wl12xx_vif *wlvif,
			 struct sk_buff *skb)
127 128 129 130 131 132 133 134 135 136 137 138
{
	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;

139
		if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags))
E
Eliad Peller 已提交
140 141
			return wl->system_hlid;

142 143
		hdr = (struct ieee80211_hdr *)skb->data;
		if (ieee80211_is_mgmt(hdr->frame_control))
144
			return wlvif->ap.global_hlid;
145
		else
146
			return wlvif->ap.bcast_hlid;
147 148 149
	}
}

150 151
u8 wl12xx_tx_get_hlid(struct wl1271 *wl, struct wl12xx_vif *wlvif,
		      struct sk_buff *skb)
E
Eliad Peller 已提交
152
{
153 154
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;

E
Eliad Peller 已提交
155
	if (!wlvif || wl12xx_is_dummy_packet(wl, skb))
E
Eliad Peller 已提交
156 157
		return wl->system_hlid;

E
Eliad Peller 已提交
158
	if (wlvif->bss_type == BSS_TYPE_AP_BSS)
159
		return wl12xx_tx_get_hlid_ap(wl, wlvif, skb);
E
Eliad Peller 已提交
160

161
	if ((test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) ||
162
	     test_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags)) &&
163 164
	    !ieee80211_is_auth(hdr->frame_control) &&
	    !ieee80211_is_assoc_req(hdr->frame_control))
E
Eliad Peller 已提交
165
		return wlvif->sta.hlid;
E
Eliad Peller 已提交
166
	else
E
Eliad Peller 已提交
167
		return wlvif->dev_hlid;
E
Eliad Peller 已提交
168 169
}

170 171 172
static unsigned int wl12xx_calc_packet_alignment(struct wl1271 *wl,
						unsigned int packet_length)
{
173
	if (wl->quirks & WL12XX_QUIRK_NO_BLOCKSIZE_ALIGNMENT)
174
		return ALIGN(packet_length, WL1271_TX_ALIGN_TO);
175 176
	else
		return ALIGN(packet_length, WL12XX_BUS_BLOCK_SIZE);
177 178
}

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

191
	if (buf_offset + total_len > WL1271_AGGR_BUFFER_SIZE)
I
Ido Yariv 已提交
192
		return -EAGAIN;
193

L
Luciano Coelho 已提交
194
	/* allocate free identifier for the packet */
195
	id = wl1271_alloc_tx_id(wl, skb);
L
Luciano Coelho 已提交
196 197 198 199 200
	if (id < 0)
		return id;

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

203
	/* in case of a dummy packet, use default amount of spare mem blocks */
204 205
	if (unlikely(wl12xx_is_dummy_packet(wl, skb))) {
		is_dummy = true;
206
		spare_blocks = TX_HW_BLOCK_SPARE_DEFAULT;
207
	}
208

209
	total_blocks = (len + TX_HW_BLOCK_SIZE - 1) / TX_HW_BLOCK_SIZE +
210
		spare_blocks;
211

L
Luciano Coelho 已提交
212 213 214 215
	if (total_blocks <= wl->tx_blocks_available) {
		desc = (struct wl1271_tx_hw_descr *)skb_push(
			skb, total_len - skb->len);

216 217 218 219
		/* 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 {
220
			desc->wl127x_mem.extra_blocks = spare_blocks;
221 222 223
			desc->wl127x_mem.total_mem_blocks = total_blocks;
		}

L
Luciano Coelho 已提交
224 225 226
		desc->id = id;

		wl->tx_blocks_available -= total_blocks;
227
		wl->tx_allocated_blocks += total_blocks;
L
Luciano Coelho 已提交
228

A
Arik Nemtsov 已提交
229 230 231 232
		/* If the FW was empty before, arm the Tx watchdog */
		if (wl->tx_allocated_blocks == total_blocks)
			wl12xx_rearm_tx_watchdog_locked(wl);

233 234
		ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
		wl->tx_allocated_pkts[ac]++;
235

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

L
Luciano Coelho 已提交
241 242 243 244 245
		ret = 0;

		wl1271_debug(DEBUG_TX,
			     "tx_allocate: size: %d, blocks: %d, id: %d",
			     total_len, total_blocks, id);
246
	} else {
247
		wl1271_free_tx_id(wl, id);
248
	}
L
Luciano Coelho 已提交
249 250 251 252

	return ret;
}

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

	desc = (struct wl1271_tx_hw_descr *) skb->data;
268 269 270
	frame_start = (u8 *)(desc + 1);
	hdr = (struct ieee80211_hdr *)(frame_start + extra);
	frame_control = hdr->frame_control;
L
Luciano Coelho 已提交
271

272 273
	/* relocate space for security header */
	if (extra) {
274 275
		int hdrlen = ieee80211_hdrlen(frame_control);
		memmove(frame_start, hdr, hdrlen);
276 277
	}

L
Luciano Coelho 已提交
278
	/* configure packet life time */
279 280 281
	getnstimeofday(&ts);
	hosttime = (timespec_to_ns(&ts) >> 10);
	desc->start_time = cpu_to_le32(hosttime - wl->time_offset);
282

283
	is_dummy = wl12xx_is_dummy_packet(wl, skb);
E
Eliad Peller 已提交
284
	if (is_dummy || !wlvif || wlvif->bss_type != BSS_TYPE_AP_BSS)
285 286 287
		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 已提交
288

289
	/* queue */
K
Kalle Valo 已提交
290
	ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
291
	desc->tid = skb->priority;
292

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

		tx_attr |= TX_HW_ATTR_TX_DUMMY_REQ;
E
Eliad Peller 已提交
303
	} else if (wlvif) {
304
		/* configure the tx attributes */
305 306
		tx_attr = wlvif->session_counter <<
			  TX_HW_ATTR_OFST_SESSION_COUNTER;
307 308
	}

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

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

334
	aligned_len = wl12xx_calc_packet_alignment(wl, skb->len);
335

336
	if (wl->chip.id == CHIP_ID_1283_PG20) {
337 338
		desc->wl128x_mem.extra_bytes = aligned_len - skb->len;
		desc->length = cpu_to_le16(aligned_len >> 2);
339 340 341 342 343 344 345

		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);
346 347 348
	} else {
		int pad;

349
		/* Store the aligned length in terms of words */
350 351 352 353 354
		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 已提交
355

356 357 358 359 360 361
		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);
362
	}
L
Luciano Coelho 已提交
363

364 365 366 367 368
	/* for WEP shared auth - no fw encryption is needed */
	if (ieee80211_is_auth(frame_control) &&
	    ieee80211_has_protected(frame_control))
		tx_attr |= TX_HW_ATTR_HOST_ENCRYPT;

L
Luciano Coelho 已提交
369
	desc->tx_attr = cpu_to_le16(tx_attr);
L
Luciano Coelho 已提交
370 371 372
}

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

	if (!skb)
		return -EINVAL;

	info = IEEE80211_SKB_CB(skb);

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

L
Luciano Coelho 已提交
391
	if (info->control.hw_key &&
392
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP)
393
		extra = WL1271_EXTRA_SPACE_TKIP;
L
Luciano Coelho 已提交
394 395

	if (info->control.hw_key) {
396 397 398 399 400 401
		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 已提交
402

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

416
	ret = wl1271_tx_allocate(wl, wlvif, skb, extra, buf_offset, hlid);
L
Luciano Coelho 已提交
417 418 419
	if (ret < 0)
		return ret;

420
	wl1271_tx_fill_hdr(wl, wlvif, skb, extra, info, hlid);
421

E
Eliad Peller 已提交
422
	if (!is_dummy && wlvif && wlvif->bss_type == BSS_TYPE_AP_BSS) {
423
		wl1271_tx_ap_update_inconnection_sta(wl, skb);
424
		wl1271_tx_regulate_link(wl, wlvif, hlid);
425
	}
426

427
	/*
428 429 430 431 432 433
	 * 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).
434
	 */
435
	total_len = wl12xx_calc_packet_alignment(wl, skb->len);
436

437 438
	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 已提交
439

440
	/* Revert side effects in the dummy packet skb, so it can be reused */
E
Eliad Peller 已提交
441
	if (is_dummy)
442 443
		skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

444
	return total_len;
L
Luciano Coelho 已提交
445 446
}

447 448
u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set,
				enum ieee80211_band rate_band)
449 450 451 452 453
{
	struct ieee80211_supported_band *band;
	u32 enabled_rates = 0;
	int bit;

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

461 462 463 464 465 466 467 468 469
	/* 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;
	}

470 471 472
	return enabled_rates;
}

473
void wl1271_handle_tx_low_watermark(struct wl1271 *wl)
474 475
{
	unsigned long flags;
476
	int i;
477

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

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

519 520
static struct sk_buff *wl12xx_lnk_skb_dequeue(struct wl1271 *wl,
					      struct wl1271_link *lnk)
521
{
522
	struct sk_buff *skb;
523
	unsigned long flags;
524
	struct sk_buff_head *queue;
525

526
	queue = wl1271_select_queue(wl, lnk->tx_queue);
527
	if (!queue)
528
		return NULL;
529 530

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

	return skb;
}

542 543
static struct sk_buff *wl12xx_vif_skb_dequeue(struct wl1271 *wl,
					      struct wl12xx_vif *wlvif)
544 545 546 547 548
{
	struct sk_buff *skb = NULL;
	int i, h, start_hlid;

	/* start from the link after the last one */
549
	start_hlid = (wlvif->last_tx_hlid + 1) % WL12XX_MAX_LINKS;
550 551

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

555
		/* only consider connected stations */
556
		if (!test_bit(h, wlvif->links_map))
557 558
			continue;

559 560
		skb = wl12xx_lnk_skb_dequeue(wl, &wl->links[h]);
		if (!skb)
561 562
			continue;

563 564
		wlvif->last_tx_hlid = h;
		break;
565 566
	}

567
	if (!skb)
568
		wlvif->last_tx_hlid = 0;
569 570 571 572

	return skb;
}

573
static struct sk_buff *wl1271_skb_dequeue(struct wl1271 *wl)
574
{
575
	unsigned long flags;
576
	struct wl12xx_vif *wlvif = wl->last_wlvif;
577 578
	struct sk_buff *skb = NULL;

579
	/* continue from last wlvif (round robin) */
580 581 582 583 584 585 586 587 588 589
	if (wlvif) {
		wl12xx_for_each_wlvif_continue(wl, wlvif) {
			skb = wl12xx_vif_skb_dequeue(wl, wlvif);
			if (skb) {
				wl->last_wlvif = wlvif;
				break;
			}
		}
	}

590 591 592 593 594
	/* dequeue from the system HLID before the restarting wlvif list */
	if (!skb)
		skb = wl12xx_lnk_skb_dequeue(wl, &wl->links[wl->system_hlid]);

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

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

612 613
	if (!skb &&
	    test_and_clear_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags)) {
614 615
		int q;

616
		skb = wl->dummy_packet;
617
		q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
618
		spin_lock_irqsave(&wl->wl_lock, flags);
619
		WARN_ON_ONCE(wl->tx_queue_count[q] <= 0);
620
		wl->tx_queue_count[q]--;
621 622 623 624
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}

	return skb;
625 626
}

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

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

		/* make sure we dequeue the same packet next time */
640
		wlvif->last_tx_hlid = (hlid + WL12XX_MAX_LINKS - 1) %
641
				      WL12XX_MAX_LINKS;
642 643
	}

644
	spin_lock_irqsave(&wl->wl_lock, flags);
645
	wl->tx_queue_count[q]++;
646 647 648
	spin_unlock_irqrestore(&wl->wl_lock, flags);
}

649 650 651 652 653 654 655
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 已提交
656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682
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 */
683
		if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags))
E
Eliad Peller 已提交
684 685 686 687 688 689 690 691
			ieee80211_queue_work(wl->hw,
					     &wlvif->rx_streaming_enable_work);

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

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

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

705
	while ((skb = wl1271_skb_dequeue(wl))) {
E
Eliad Peller 已提交
706
		struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
E
Eliad Peller 已提交
707 708
		bool has_data = false;

709
		wlvif = NULL;
E
Eliad Peller 已提交
710 711
		if (!wl12xx_is_dummy_packet(wl, skb) && info->control.vif)
			wlvif = wl12xx_vif_to_data(info->control.vif);
712

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

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

769
		wl1271_handle_tx_low_watermark(wl);
770
	}
E
Eliad Peller 已提交
771
	wl12xx_rearm_rx_streaming(wl, active_hlids);
I
Ido Yariv 已提交
772
}
L
Luciano Coelho 已提交
773

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

	mutex_lock(&wl->mutex);
780 781 782 783
	ret = wl1271_ps_elp_wakeup(wl);
	if (ret < 0)
		goto out;

784
	wl1271_tx_work_locked(wl);
785

786
	wl1271_ps_elp_sleep(wl);
787
out:
L
Luciano Coelho 已提交
788 789 790
	mutex_unlock(&wl->mutex);
}

791 792
static u8 wl1271_tx_get_rate_flags(u8 rate_class_index)
{
793 794
	u8 flags = 0;

795 796
	if (rate_class_index >= CONF_HW_RXTX_RATE_MCS_MIN &&
	    rate_class_index <= CONF_HW_RXTX_RATE_MCS_MAX)
797 798 799 800
		flags |= IEEE80211_TX_RC_MCS;
	if (rate_class_index == CONF_HW_RXTX_RATE_MCS7_SGI)
		flags |= IEEE80211_TX_RC_SHORT_GI;
	return flags;
801 802
}

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

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

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

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

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

J
Juuso Oikarinen 已提交
846 847
	info->status.rates[0].idx = rate;
	info->status.rates[0].count = retries;
848
	info->status.rates[0].flags = rate_flags;
J
Juuso Oikarinen 已提交
849 850
	info->status.ack_signal = -1;

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

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

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

872 873 874 875
	/* remove private header from packet */
	skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

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

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

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

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

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

933 934 935
void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid)
{
	struct sk_buff *skb;
936
	int i;
937
	unsigned long flags;
938
	struct ieee80211_tx_info *info;
939
	int total[NUM_TX_QUEUES];
940 941

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

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

953
			total[i]++;
954 955 956 957
		}
	}

	spin_lock_irqsave(&wl->wl_lock, flags);
958 959
	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] -= total[i];
960 961 962 963 964
	spin_unlock_irqrestore(&wl->wl_lock, flags);

	wl1271_handle_tx_low_watermark(wl);
}

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

	/* TX failure */
971 972
	for_each_set_bit(i, wlvif->links_map, WL12XX_MAX_LINKS) {
		if (wlvif->bss_type == BSS_TYPE_AP_BSS)
973
			wl1271_free_sta(wl, wlvif, i);
974 975
		else
			wlvif->sta.ba_rx_bitmap = 0;
976

977 978
		wl->links[i].allocated_pkts = 0;
		wl->links[i].prev_freed_pkts = 0;
L
Luciano Coelho 已提交
979
	}
980 981 982 983 984 985 986 987 988
	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;
989

990 991 992 993 994 995 996 997
	/* only reset the queues if something bad happened */
	if (WARN_ON_ONCE(wl1271_tx_total_queue_count(wl) != 0)) {
		for (i = 0; i < WL12XX_MAX_LINKS; i++)
			wl1271_tx_reset_link_queues(wl, i);

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

999
	wl->stopped_queues_map = 0;
L
Luciano Coelho 已提交
1000

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

1009 1010 1011 1012 1013 1014 1015 1016
	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);

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

1033 1034
			info->status.rates[0].idx = -1;
			info->status.rates[0].count = 0;
1035

1036
			ieee80211_tx_status_ni(wl->hw, skb);
1037
		}
1038
	}
1039 1040 1041 1042 1043 1044 1045 1046
}

#define WL1271_TX_FLUSH_TIMEOUT 500000

/* caller must *NOT* hold wl->mutex */
void wl1271_tx_flush(struct wl1271 *wl)
{
	unsigned long timeout;
1047
	int i;
1048 1049 1050 1051
	timeout = jiffies + usecs_to_jiffies(WL1271_TX_FLUSH_TIMEOUT);

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

	wl1271_warning("Unable to flush all TX buffers, timed out.");
1065 1066 1067 1068 1069 1070

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

1073
u32 wl1271_tx_min_rate_get(struct wl1271 *wl, u32 rate_set)
A
Arik Nemtsov 已提交
1074
{
1075 1076
	if (WARN_ON(!rate_set))
		return 0;
A
Arik Nemtsov 已提交
1077

1078
	return BIT(__ffs(rate_set));
A
Arik Nemtsov 已提交
1079
}