tx.c 28.3 KB
Newer Older
L
Luciano Coelho 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/*
 * This file is part of wl1271
 *
 * Copyright (C) 2009 Nokia Corporation
 *
 * Contact: Luciano Coelho <luciano.coelho@nokia.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 *
 */

#include <linux/kernel.h>
#include <linux/module.h>
26
#include <linux/etherdevice.h>
L
Luciano Coelho 已提交
27

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

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

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

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

	if (ret < 0)
		return ret;

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

60
static int wl1271_alloc_tx_id(struct wl1271 *wl, struct sk_buff *skb)
L
Luciano Coelho 已提交
61
{
62 63 64 65 66 67 68 69 70 71 72
	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 已提交
73

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

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

85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
static void wl1271_tx_ap_update_inconnection_sta(struct wl1271 *wl,
						 struct sk_buff *skb)
{
	struct ieee80211_hdr *hdr;

	/*
	 * add the station to the known list before transmitting the
	 * authentication response. this way it won't get de-authed by FW
	 * when transmitting too soon.
	 */
	hdr = (struct ieee80211_hdr *)(skb->data +
				       sizeof(struct wl1271_tx_hw_descr));
	if (ieee80211_is_auth(hdr->frame_control))
		wl1271_acx_set_inconnection_sta(wl, hdr->addr1);
}

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

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

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

	/*
	 * if in FW PS and there is enough data in FW we can put the link
	 * into high-level PS and clean out its TX queues.
118 119
	 * Make an exception if this is the only connected station. In this
	 * case FW-memory congestion is not a problem.
120
	 */
121
	if (!single_sta && fw_ps && tx_pkts >= WL1271_PS_STA_MAX_PACKETS)
122
		wl12xx_ps_link_start(wl, wlvif, hlid, true);
123 124
}

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

130 131
u8 wl12xx_tx_get_hlid_ap(struct wl1271 *wl, struct wl12xx_vif *wlvif,
			 struct sk_buff *skb)
132 133 134 135 136 137 138 139 140 141 142 143
{
	struct ieee80211_tx_info *control = IEEE80211_SKB_CB(skb);

	if (control->control.sta) {
		struct wl1271_station *wl_sta;

		wl_sta = (struct wl1271_station *)
				control->control.sta->drv_priv;
		return wl_sta->hlid;
	} else {
		struct ieee80211_hdr *hdr;

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

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

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

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

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

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

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

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

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

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

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

208
	/* in case of a dummy packet, use default amount of spare mem blocks */
209 210
	if (unlikely(wl12xx_is_dummy_packet(wl, skb))) {
		is_dummy = true;
211
		spare_blocks = TX_HW_BLOCK_SPARE_DEFAULT;
212
	}
213

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

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

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

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

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

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

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

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

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

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

	return ret;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

369 370 371 372 373
	/* 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 已提交
374
	desc->tx_attr = cpu_to_le16(tx_attr);
L
Luciano Coelho 已提交
375 376 377
}

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

	if (!skb)
		return -EINVAL;

	info = IEEE80211_SKB_CB(skb);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

475 476 477
	return enabled_rates;
}

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

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

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

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

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

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

	return skb;
}

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

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

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

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

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

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

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

	return skb;
}

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

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

595 596 597 598 599
	/* 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 */
600 601 602 603 604 605 606
	if (!skb) {
		wl12xx_for_each_wlvif(wl, wlvif) {
			skb = wl12xx_vif_skb_dequeue(wl, wlvif);
			if (skb) {
				wl->last_wlvif = wlvif;
				break;
			}
607 608 609 610 611 612 613

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

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

621
		skb = wl->dummy_packet;
622
		q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
623
		spin_lock_irqsave(&wl->wl_lock, flags);
624
		WARN_ON_ONCE(wl->tx_queue_count[q] <= 0);
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
		struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
E
Eliad Peller 已提交
712 713
		bool has_data = false;

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

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

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

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

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

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

789
	wl1271_tx_work_locked(wl);
790

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	wl1271_handle_tx_low_watermark(wl);
}

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

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

982 983
		wl->links[i].allocated_pkts = 0;
		wl->links[i].prev_freed_pkts = 0;
L
Luciano Coelho 已提交
984
	}
985 986 987 988 989 990 991 992 993
	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;
994

995 996 997 998 999 1000 1001 1002
	/* 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;
	}
1003

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

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

1014 1015 1016 1017 1018 1019 1020 1021
	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);

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

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

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

#define WL1271_TX_FLUSH_TIMEOUT 500000

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

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

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

	/* 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 已提交
1076
}
A
Arik Nemtsov 已提交
1077

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

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