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

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

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

	if (ret < 0)
		return ret;

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

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

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

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

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

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

	/*
	 * 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 已提交
97
	if (wlvif->dev_hlid != WL12XX_INVALID_LINK_ID)
98 99 100
		goto out;

	wl1271_debug(DEBUG_CMD, "starting device role for roaming");
E
Eliad Peller 已提交
101
	ret = wl12xx_cmd_role_start_dev(wl, wlvif);
102 103 104
	if (ret < 0)
		goto out;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	if ((test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags) ||
	     test_bit(WL1271_FLAG_IBSS_JOINED, &wl->flags)) &&
	    !ieee80211_is_auth(hdr->frame_control) &&
	    !ieee80211_is_assoc_req(hdr->frame_control))
E
Eliad Peller 已提交
199
		return wlvif->sta.hlid;
E
Eliad Peller 已提交
200
	else
E
Eliad Peller 已提交
201
		return wlvif->dev_hlid;
E
Eliad Peller 已提交
202 203
}

204 205 206 207 208 209 210 211 212
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);
}

E
Eliad Peller 已提交
213 214 215
static int wl1271_tx_allocate(struct wl1271 *wl, struct ieee80211_vif *vif,
			      struct sk_buff *skb, u32 extra, u32 buf_offset,
			      u8 hlid)
L
Luciano Coelho 已提交
216
{
E
Eliad Peller 已提交
217
	struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
L
Luciano Coelho 已提交
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;
L
Luciano Coelho 已提交
224

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

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

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

237 238 239 240
	/* in case of a dummy packet, use default amount of spare mem blocks */
	if (unlikely(wl12xx_is_dummy_packet(wl, skb)))
		spare_blocks = TX_HW_BLOCK_SPARE_DEFAULT;

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

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

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

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

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

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

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

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

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

	return ret;
}

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

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

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

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

E
Eliad Peller 已提交
306
	if (wlvif->bss_type != BSS_TYPE_AP_BSS)
307 308 309
		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 已提交
310

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

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

		tx_attr |= TX_HW_ATTR_TX_DUMMY_REQ;
	} else {
		/* configure the tx attributes */
327 328
		tx_attr = wlvif->session_counter <<
			  TX_HW_ATTR_OFST_SESSION_COUNTER;
329 330
	}

E
Eliad Peller 已提交
331
	desc->hlid = hlid;
E
Eliad Peller 已提交
332
	if (wlvif->bss_type != BSS_TYPE_AP_BSS) {
333 334 335 336 337 338 339 340
		/* 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)
			rate_idx = ACX_TX_AP_FULL_RATE;
		else
			rate_idx = ACX_TX_BASIC_RATE;
	} else {
341
		if (hlid == wlvif->ap.global_hlid)
342
			rate_idx = ACX_TX_AP_MODE_MGMT_RATE;
343
		else if (hlid == wlvif->ap.bcast_hlid)
344
			rate_idx = ACX_TX_AP_MODE_BCST_RATE;
345
		else
346 347 348 349
			rate_idx = ac;
	}

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

352
	aligned_len = wl12xx_calc_packet_alignment(wl, skb->len);
353

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

		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);
364 365 366
	} else {
		int pad;

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

374 375 376 377 378 379
		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);
380
	}
L
Luciano Coelho 已提交
381 382

	desc->tx_attr = cpu_to_le16(tx_attr);
L
Luciano Coelho 已提交
383 384 385
}

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

	if (!skb)
		return -EINVAL;

	info = IEEE80211_SKB_CB(skb);

E
Eliad Peller 已提交
403 404 405 406 407 408 409 410
	/* TODO: handle dummy packets on multi-vifs */
	is_dummy = wl12xx_is_dummy_packet(wl, skb);
	if (is_dummy)
		info->control.vif = wl->vif;

	vif = info->control.vif;
	wlvif = wl12xx_vif_to_data(vif);

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

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

E
Eliad Peller 已提交
423
		if (unlikely(is_wep && wlvif->default_key != idx)) {
E
Eliad Peller 已提交
424
			ret = wl1271_set_default_wep_key(wl, wlvif, idx);
L
Luciano Coelho 已提交
425 426
			if (ret < 0)
				return ret;
E
Eliad Peller 已提交
427
			wlvif->default_key = idx;
L
Luciano Coelho 已提交
428 429
		}
	}
430
	hlid = wl12xx_tx_get_hlid(wl, wlvif, skb);
E
Eliad Peller 已提交
431 432 433 434
	if (hlid == WL12XX_INVALID_LINK_ID) {
		wl1271_error("invalid hlid. dropping skb 0x%p", skb);
		return -EINVAL;
	}
435

E
Eliad Peller 已提交
436
	ret = wl1271_tx_allocate(wl, vif, skb, extra, buf_offset, hlid);
L
Luciano Coelho 已提交
437 438 439
	if (ret < 0)
		return ret;

E
Eliad Peller 已提交
440
	wl1271_tx_fill_hdr(wl, vif, skb, extra, info, hlid);
441

E
Eliad Peller 已提交
442
	if (wlvif->bss_type == BSS_TYPE_AP_BSS && !is_dummy) {
443
		wl1271_tx_ap_update_inconnection_sta(wl, skb);
444
		wl1271_tx_regulate_link(wl, wlvif, hlid);
445
	}
446

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

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

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

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

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

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

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

490 491 492
	return enabled_rates;
}

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

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

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

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

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

	return skb;
}

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

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

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

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

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

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

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

	return skb;
}

E
Eliad Peller 已提交
592 593
static struct sk_buff *wl1271_skb_dequeue(struct wl1271 *wl,
					  struct wl12xx_vif *wlvif)
594
{
595 596 597
	unsigned long flags;
	struct sk_buff *skb = NULL;

598
	skb = wl12xx_vif_skb_dequeue(wl, wlvif);
599 600
	if (!skb &&
	    test_and_clear_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags)) {
601 602
		int q;

603
		skb = wl->dummy_packet;
604
		q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
605
		spin_lock_irqsave(&wl->wl_lock, flags);
606
		wl->tx_queue_count[q]--;
607 608 609 610
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}

	return skb;
611 612
}

613
static void wl1271_skb_queue_head(struct wl1271 *wl, struct wl12xx_vif *wlvif,
E
Eliad Peller 已提交
614
				  struct sk_buff *skb)
615 616 617 618
{
	unsigned long flags;
	int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));

619 620
	if (wl12xx_is_dummy_packet(wl, skb)) {
		set_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags);
621 622
	} else {
		u8 hlid = wl12xx_tx_get_hlid(wl, wlvif, skb);
623 624 625
		skb_queue_head(&wl->links[hlid].tx_queue[q], skb);

		/* make sure we dequeue the same packet next time */
626
		wlvif->last_tx_hlid = (hlid + WL12XX_MAX_LINKS - 1) %
627
				      WL12XX_MAX_LINKS;
628 629
	}

630
	spin_lock_irqsave(&wl->wl_lock, flags);
631
	wl->tx_queue_count[q]++;
632 633 634
	spin_unlock_irqrestore(&wl->wl_lock, flags);
}

635 636 637 638 639 640 641
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 已提交
642
void wl1271_tx_work_locked(struct wl1271 *wl, struct ieee80211_vif *vif)
L
Luciano Coelho 已提交
643
{
E
Eliad Peller 已提交
644
	struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
L
Luciano Coelho 已提交
645
	struct sk_buff *skb;
I
Ido Yariv 已提交
646 647
	u32 buf_offset = 0;
	bool sent_packets = false;
648
	bool had_data = false;
E
Eliad Peller 已提交
649
	bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
L
Luciano Coelho 已提交
650 651 652
	int ret;

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

E
Eliad Peller 已提交
655
	while ((skb = wl1271_skb_dequeue(wl, wlvif))) {
656 657 658
		if (wl1271_tx_is_data_present(skb))
			had_data = true;

659
		ret = wl1271_prepare_tx_frame(wl, skb, buf_offset);
I
Ido Yariv 已提交
660
		if (ret == -EAGAIN) {
661
			/*
I
Ido Yariv 已提交
662 663 664
			 * Aggregation buffer is full.
			 * Flush buffer and try again.
			 */
665
			wl1271_skb_queue_head(wl, wlvif, skb);
I
Ido Yariv 已提交
666
			wl1271_write(wl, WL1271_SLV_MEM_DATA, wl->aggr_buf,
667
				     buf_offset, true);
I
Ido Yariv 已提交
668 669 670 671 672 673
			sent_packets = true;
			buf_offset = 0;
			continue;
		} else if (ret == -EBUSY) {
			/*
			 * Firmware buffer is full.
674 675
			 * Queue back last skb, and stop aggregating.
			 */
676
			wl1271_skb_queue_head(wl, wlvif, skb);
I
Ido Yariv 已提交
677 678
			/* No work left, avoid scheduling redundant tx work */
			set_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
679
			goto out_ack;
L
Luciano Coelho 已提交
680 681
		} else if (ret < 0) {
			dev_kfree_skb(skb);
682
			goto out_ack;
L
Luciano Coelho 已提交
683
		}
684 685
		buf_offset += ret;
		wl->tx_packets_count++;
L
Luciano Coelho 已提交
686 687
	}

688
out_ack:
689 690 691
	if (buf_offset) {
		wl1271_write(wl, WL1271_SLV_MEM_DATA, wl->aggr_buf,
				buf_offset, true);
I
Ido Yariv 已提交
692 693 694
		sent_packets = true;
	}
	if (sent_packets) {
695 696 697 698 699 700 701 702
		/*
		 * 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);

703
		wl1271_handle_tx_low_watermark(wl);
704
	}
705 706 707 708 709 710 711 712 713 714 715 716 717
	if (!is_ap && wl->conf.rx_streaming.interval && had_data &&
	    (wl->conf.rx_streaming.always ||
	     test_bit(WL1271_FLAG_SOFT_GEMINI, &wl->flags))) {
		u32 timeout = wl->conf.rx_streaming.duration;

		/* enable rx streaming */
		if (!test_bit(WL1271_FLAG_RX_STREAMING_STARTED, &wl->flags))
			ieee80211_queue_work(wl->hw,
					     &wl->rx_streaming_enable_work);

		mod_timer(&wl->rx_streaming_timer,
			  jiffies + msecs_to_jiffies(timeout));
	}
I
Ido Yariv 已提交
718
}
L
Luciano Coelho 已提交
719

I
Ido Yariv 已提交
720 721 722
void wl1271_tx_work(struct work_struct *work)
{
	struct wl1271 *wl = container_of(work, struct wl1271, tx_work);
723
	int ret;
I
Ido Yariv 已提交
724 725

	mutex_lock(&wl->mutex);
726 727 728 729
	ret = wl1271_ps_elp_wakeup(wl);
	if (ret < 0)
		goto out;

E
Eliad Peller 已提交
730
	wl1271_tx_work_locked(wl, wl->vif);
731

732
	wl1271_ps_elp_sleep(wl);
733
out:
L
Luciano Coelho 已提交
734 735 736 737 738 739 740 741 742
	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;
	struct sk_buff *skb;
	int id = result->id;
J
Juuso Oikarinen 已提交
743 744
	int rate = -1;
	u8 retries = 0;
L
Luciano Coelho 已提交
745 746

	/* check for id legality */
747
	if (unlikely(id >= ACX_TX_DESCRIPTORS || wl->tx_frames[id] == NULL)) {
L
Luciano Coelho 已提交
748 749 750 751 752 753 754
		wl1271_warning("TX result illegal id: %d", id);
		return;
	}

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

755
	if (wl12xx_is_dummy_packet(wl, skb)) {
756 757 758 759
		wl1271_free_tx_id(wl, id);
		return;
	}

J
Juuso Oikarinen 已提交
760 761 762
	/* update the TX status info */
	if (result->status == TX_SUCCESS) {
		if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
L
Luciano Coelho 已提交
763
			info->flags |= IEEE80211_TX_STAT_ACK;
764
		rate = wl1271_rate_to_idx(result->rate_class_index, wl->band);
J
Juuso Oikarinen 已提交
765 766 767 768
		retries = result->ack_failures;
	} else if (result->status == TX_RETRY_EXCEEDED) {
		wl->stats.excessive_retries++;
		retries = result->ack_failures;
L
Luciano Coelho 已提交
769 770
	}

J
Juuso Oikarinen 已提交
771 772 773 774 775
	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 已提交
776 777
	wl->stats.retry_count += result->ack_failures;

778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795
	/*
	 * 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;
		u8 cur_lsb = wl->tx_security_last_seq_lsb;

		/*
		 * update security sequence number, taking care of potential
		 * wrap-around
		 */
		wl->tx_security_seq += (fw_lsb - cur_lsb + 256) % 256;
		wl->tx_security_last_seq_lsb = fw_lsb;
	}
796

797 798 799 800
	/* remove private header from packet */
	skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

	/* remove TKIP header space if present */
L
Luciano Coelho 已提交
801
	if (info->control.hw_key &&
802
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) {
803 804 805 806
		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 已提交
807 808 809 810 811 812 813

	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 */
814
	skb_queue_tail(&wl->deferred_tx_queue, skb);
815
	queue_work(wl->freezable_wq, &wl->netstack_work);
816
	wl1271_free_tx_id(wl, result->id);
L
Luciano Coelho 已提交
817 818 819
}

/* Called upon reception of a TX complete interrupt */
820
void wl1271_tx_complete(struct wl1271 *wl)
L
Luciano Coelho 已提交
821 822 823
{
	struct wl1271_acx_mem_map *memmap =
		(struct wl1271_acx_mem_map *)wl->target_mem_map;
824
	u32 count, fw_counter;
L
Luciano Coelho 已提交
825 826 827
	u32 i;

	/* read the tx results from the chipset */
T
Teemu Paasikivi 已提交
828 829
	wl1271_read(wl, le32_to_cpu(memmap->tx_result),
		    wl->tx_res_if, sizeof(*wl->tx_res_if), false);
830 831 832 833 834 835 836 837
	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;
838
	wl1271_debug(DEBUG_TX, "tx_complete received, packets: %d", count);
L
Luciano Coelho 已提交
839 840

	/* verify that the result buffer is not getting overrun */
841
	if (unlikely(count > TX_HW_RESULT_QUEUE_LEN))
L
Luciano Coelho 已提交
842 843 844 845 846 847 848 849 850 851 852 853 854 855 856
		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++;
	}
}

857 858 859
void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid)
{
	struct sk_buff *skb;
860
	int i;
861
	unsigned long flags;
862
	struct ieee80211_tx_info *info;
863
	int total[NUM_TX_QUEUES];
864 865

	for (i = 0; i < NUM_TX_QUEUES; i++) {
866
		total[i] = 0;
867 868
		while ((skb = skb_dequeue(&wl->links[hlid].tx_queue[i]))) {
			wl1271_debug(DEBUG_TX, "link freeing skb 0x%p", skb);
869 870 871 872 873 874 875 876

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

877
			total[i]++;
878 879 880 881
		}
	}

	spin_lock_irqsave(&wl->wl_lock, flags);
882 883
	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] -= total[i];
884 885 886 887 888
	spin_unlock_irqrestore(&wl->wl_lock, flags);

	wl1271_handle_tx_low_watermark(wl);
}

889
/* caller must hold wl->mutex and TX must be stopped */
890
void wl12xx_tx_reset_wlvif(struct wl1271 *wl, struct wl12xx_vif *wlvif)
L
Luciano Coelho 已提交
891 892 893 894
{
	int i;

	/* TX failure */
895 896
	for_each_set_bit(i, wlvif->links_map, WL12XX_MAX_LINKS) {
		if (wlvif->bss_type == BSS_TYPE_AP_BSS)
897
			wl1271_free_sta(wl, wlvif, i);
898 899
		else
			wlvif->sta.ba_rx_bitmap = 0;
900

901 902 903
		wl1271_tx_reset_link_queues(wl, i);
		wl->links[i].allocated_pkts = 0;
		wl->links[i].prev_freed_pkts = 0;
L
Luciano Coelho 已提交
904
	}
905 906 907 908 909 910 911 912 913
	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;
914

915 916 917
	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] = 0;

918
	wl->stopped_queues_map = 0;
L
Luciano Coelho 已提交
919

920 921 922
	/*
	 * Make sure the driver is at a consistent state, in case this
	 * function is called from a context other than interface removal.
923
	 * This call will always wake the TX queues.
924
	 */
925 926
	if (reset_tx_queues)
		wl1271_handle_tx_low_watermark(wl);
927

928 929 930 931 932 933 934 935
	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);

936
		if (!wl12xx_is_dummy_packet(wl, skb)) {
937 938 939 940 941 942 943 944 945 946 947 948 949 950
			/*
			 * 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);
			}
951

952 953
			info->status.rates[0].idx = -1;
			info->status.rates[0].count = 0;
954

955
			ieee80211_tx_status_ni(wl->hw, skb);
956
		}
957
	}
958 959 960 961 962 963 964 965 966 967 968 969
}

#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);
970
		wl1271_debug(DEBUG_TX, "flushing tx buffer: %d %d",
971 972 973 974
			     wl->tx_frames_cnt,
			     wl1271_tx_total_queue_count(wl));
		if ((wl->tx_frames_cnt == 0) &&
		    (wl1271_tx_total_queue_count(wl) == 0)) {
975 976 977 978 979 980 981 982
			mutex_unlock(&wl->mutex);
			return;
		}
		mutex_unlock(&wl->mutex);
		msleep(1);
	}

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

985
u32 wl1271_tx_min_rate_get(struct wl1271 *wl, u32 rate_set)
A
Arik Nemtsov 已提交
986
{
987 988
	if (WARN_ON(!rate_set))
		return 0;
A
Arik Nemtsov 已提交
989

990
	return BIT(__ffs(rate_set));
A
Arik Nemtsov 已提交
991
}