tx.c 26.7 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
static void wl1271_tx_regulate_link(struct wl1271 *wl, u8 hlid)
{
130
	bool fw_ps, single_sta;
131
	u8 tx_pkts;
132 133 134 135 136

	/* only regulate station links */
	if (hlid < WL1271_AP_STA_HLID_START)
		return;

137 138 139
	if (WARN_ON(!wl1271_is_active_sta(wl, hlid)))
	    return;

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

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

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

159 160
u8 wl12xx_tx_get_hlid_ap(struct wl1271 *wl, struct wl12xx_vif *wlvif,
			 struct sk_buff *skb)
161 162 163 164 165 166 167 168 169 170 171 172
{
	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 已提交
173 174 175
		if (!test_bit(WL1271_FLAG_AP_STARTED, &wl->flags))
			return wl->system_hlid;

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

E
Eliad Peller 已提交
184 185
static u8 wl1271_tx_get_hlid(struct wl1271 *wl, struct ieee80211_vif *vif,
			     struct sk_buff *skb)
E
Eliad Peller 已提交
186
{
187
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
E
Eliad Peller 已提交
188 189
	struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);

190

E
Eliad Peller 已提交
191 192 193
	if (wl12xx_is_dummy_packet(wl, skb))
		return wl->system_hlid;

E
Eliad Peller 已提交
194
	if (wlvif->bss_type == BSS_TYPE_AP_BSS)
195
		return wl12xx_tx_get_hlid_ap(wl, wlvif, skb);
E
Eliad Peller 已提交
196

E
Eliad Peller 已提交
197
	wl1271_tx_update_filters(wl, wlvif, skb);
198 199 200 201 202

	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 已提交
203
		return wlvif->sta.hlid;
E
Eliad Peller 已提交
204
	else
E
Eliad Peller 已提交
205
		return wlvif->dev_hlid;
E
Eliad Peller 已提交
206 207
}

208 209 210 211 212 213 214 215 216
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 已提交
217 218 219
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 已提交
220
{
E
Eliad Peller 已提交
221
	struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
L
Luciano Coelho 已提交
222 223
	struct wl1271_tx_hw_descr *desc;
	u32 total_len = skb->len + sizeof(struct wl1271_tx_hw_descr) + extra;
224
	u32 len;
225
	u32 total_blocks;
226
	int id, ret = -EBUSY, ac;
227
	u32 spare_blocks = wl->tx_spare_blocks;
L
Luciano Coelho 已提交
228

229
	if (buf_offset + total_len > WL1271_AGGR_BUFFER_SIZE)
I
Ido Yariv 已提交
230
		return -EAGAIN;
231

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

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

241 242 243 244
	/* 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;

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

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

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

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

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

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

E
Eliad Peller 已提交
268
		if (wlvif->bss_type == BSS_TYPE_AP_BSS &&
269 270
		    hlid >= WL1271_AP_STA_HLID_START)
			wl->links[hlid].allocated_pkts++;
271

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

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

	return ret;
}

E
Eliad Peller 已提交
284 285 286
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 已提交
287
{
E
Eliad Peller 已提交
288
	struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
289
	struct timespec ts;
L
Luciano Coelho 已提交
290
	struct wl1271_tx_hw_descr *desc;
291
	int aligned_len, ac, rate_idx;
292
	s64 hosttime;
L
Luciano Coelho 已提交
293
	u16 tx_attr;
L
Luciano Coelho 已提交
294 295 296

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

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

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

E
Eliad Peller 已提交
310
	if (wlvif->bss_type != BSS_TYPE_AP_BSS)
311 312 313
		desc->life_time = cpu_to_le16(TX_HW_MGMT_PKT_LIFETIME_TU);
	else
		desc->life_time = cpu_to_le16(TX_HW_AP_MODE_PKT_LIFETIME_TU);
L
Luciano Coelho 已提交
314

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

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

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

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

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

356
	aligned_len = wl12xx_calc_packet_alignment(wl, skb->len);
357

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

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

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

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

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

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

	if (!skb)
		return -EINVAL;

	info = IEEE80211_SKB_CB(skb);

E
Eliad Peller 已提交
407 408 409 410 411 412 413 414
	/* 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 已提交
415
	if (info->control.hw_key &&
416
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP)
L
Luciano Coelho 已提交
417 418 419
		extra = WL1271_TKIP_IV_SPACE;

	if (info->control.hw_key) {
420 421 422 423 424 425
		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 已提交
426

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

E
Eliad Peller 已提交
440
	ret = wl1271_tx_allocate(wl, vif, skb, extra, buf_offset, hlid);
L
Luciano Coelho 已提交
441 442 443
	if (ret < 0)
		return ret;

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

E
Eliad Peller 已提交
446
	if (wlvif->bss_type == BSS_TYPE_AP_BSS && !is_dummy) {
447
		wl1271_tx_ap_update_inconnection_sta(wl, skb);
448 449
		wl1271_tx_regulate_link(wl, hlid);
	}
450

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

461 462
	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 已提交
463

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

468
	return total_len;
L
Luciano Coelho 已提交
469 470
}

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

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

485 486 487 488 489 490 491 492 493
	/* 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;
	}

494 495 496
	return enabled_rates;
}

497
void wl1271_handle_tx_low_watermark(struct wl1271 *wl)
498 499
{
	unsigned long flags;
500
	int i;
501

502 503
	for (i = 0; i < NUM_TX_QUEUES; i++) {
		if (test_bit(i, &wl->stopped_queues_map) &&
504
		    wl->tx_queue_count[i] <= WL1271_TX_QUEUE_LOW_WATERMARK) {
505 506 507 508 509 510 511
			/* 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);
		}
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 539 540 541 542
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];
}

543
static struct sk_buff *wl1271_sta_skb_dequeue(struct wl1271 *wl)
544 545 546
{
	struct sk_buff *skb = NULL;
	unsigned long flags;
547
	struct sk_buff_head *queue;
548

549 550
	queue = wl1271_select_queue(wl, wl->tx_queue);
	if (!queue)
551
		goto out;
552 553

	skb = skb_dequeue(queue);
554 555 556

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

	return skb;
}

566 567 568 569 570
static struct sk_buff *wl1271_ap_skb_dequeue(struct wl1271 *wl)
{
	struct sk_buff *skb = NULL;
	unsigned long flags;
	int i, h, start_hlid;
571
	struct sk_buff_head *queue;
572 573 574 575 576 577 578 579

	/* start from the link after the last one */
	start_hlid = (wl->last_tx_hlid + 1) % AP_MAX_LINKS;

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

580 581 582 583 584 585 586 587 588 589
		/* only consider connected stations */
		if (h >= WL1271_AP_STA_HLID_START &&
		    !test_bit(h - WL1271_AP_STA_HLID_START, wl->ap_hlid_map))
			continue;

		queue = wl1271_select_queue(wl, wl->links[h].tx_queue);
		if (!queue)
			continue;

		skb = skb_dequeue(queue);
590
		if (skb)
591
			break;
592 593 594
	}

	if (skb) {
595
		int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
596 597
		wl->last_tx_hlid = h;
		spin_lock_irqsave(&wl->wl_lock, flags);
598
		wl->tx_queue_count[q]--;
599 600 601 602 603 604 605 606
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	} else {
		wl->last_tx_hlid = 0;
	}

	return skb;
}

E
Eliad Peller 已提交
607 608
static struct sk_buff *wl1271_skb_dequeue(struct wl1271 *wl,
					  struct wl12xx_vif *wlvif)
609
{
610 611 612
	unsigned long flags;
	struct sk_buff *skb = NULL;

E
Eliad Peller 已提交
613
	if (wlvif->bss_type == BSS_TYPE_AP_BSS)
614 615 616
		skb = wl1271_ap_skb_dequeue(wl);
	else
		skb = wl1271_sta_skb_dequeue(wl);
617

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

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

	return skb;
630 631
}

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

639 640
	if (wl12xx_is_dummy_packet(wl, skb)) {
		set_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags);
E
Eliad Peller 已提交
641 642
	} else if (wlvif->bss_type == BSS_TYPE_AP_BSS) {
		u8 hlid = wl1271_tx_get_hlid(wl, vif, skb);
643 644 645 646 647 648 649 650
		skb_queue_head(&wl->links[hlid].tx_queue[q], skb);

		/* make sure we dequeue the same packet next time */
		wl->last_tx_hlid = (hlid + AP_MAX_LINKS - 1) % AP_MAX_LINKS;
	} else {
		skb_queue_head(&wl->tx_queue[q], skb);
	}

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

656 657 658 659 660 661 662
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 已提交
663
void wl1271_tx_work_locked(struct wl1271 *wl, struct ieee80211_vif *vif)
L
Luciano Coelho 已提交
664
{
E
Eliad Peller 已提交
665
	struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
L
Luciano Coelho 已提交
666
	struct sk_buff *skb;
I
Ido Yariv 已提交
667 668
	u32 buf_offset = 0;
	bool sent_packets = false;
669
	bool had_data = false;
E
Eliad Peller 已提交
670
	bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
L
Luciano Coelho 已提交
671 672 673
	int ret;

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

E
Eliad Peller 已提交
676
	while ((skb = wl1271_skb_dequeue(wl, wlvif))) {
677 678 679
		if (wl1271_tx_is_data_present(skb))
			had_data = true;

680
		ret = wl1271_prepare_tx_frame(wl, skb, buf_offset);
I
Ido Yariv 已提交
681
		if (ret == -EAGAIN) {
682
			/*
I
Ido Yariv 已提交
683 684 685
			 * Aggregation buffer is full.
			 * Flush buffer and try again.
			 */
E
Eliad Peller 已提交
686
			wl1271_skb_queue_head(wl, vif, skb);
I
Ido Yariv 已提交
687
			wl1271_write(wl, WL1271_SLV_MEM_DATA, wl->aggr_buf,
688
				     buf_offset, true);
I
Ido Yariv 已提交
689 690 691 692 693 694
			sent_packets = true;
			buf_offset = 0;
			continue;
		} else if (ret == -EBUSY) {
			/*
			 * Firmware buffer is full.
695 696
			 * Queue back last skb, and stop aggregating.
			 */
E
Eliad Peller 已提交
697
			wl1271_skb_queue_head(wl, vif, skb);
I
Ido Yariv 已提交
698 699
			/* No work left, avoid scheduling redundant tx work */
			set_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
700
			goto out_ack;
L
Luciano Coelho 已提交
701 702
		} else if (ret < 0) {
			dev_kfree_skb(skb);
703
			goto out_ack;
L
Luciano Coelho 已提交
704
		}
705 706
		buf_offset += ret;
		wl->tx_packets_count++;
L
Luciano Coelho 已提交
707 708
	}

709
out_ack:
710 711 712
	if (buf_offset) {
		wl1271_write(wl, WL1271_SLV_MEM_DATA, wl->aggr_buf,
				buf_offset, true);
I
Ido Yariv 已提交
713 714 715
		sent_packets = true;
	}
	if (sent_packets) {
716 717 718 719 720 721 722 723
		/*
		 * 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);

724
		wl1271_handle_tx_low_watermark(wl);
725
	}
726 727 728 729 730 731 732 733 734 735 736 737 738
	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 已提交
739
}
L
Luciano Coelho 已提交
740

I
Ido Yariv 已提交
741 742 743
void wl1271_tx_work(struct work_struct *work)
{
	struct wl1271 *wl = container_of(work, struct wl1271, tx_work);
744
	int ret;
I
Ido Yariv 已提交
745 746

	mutex_lock(&wl->mutex);
747 748 749 750
	ret = wl1271_ps_elp_wakeup(wl);
	if (ret < 0)
		goto out;

E
Eliad Peller 已提交
751
	wl1271_tx_work_locked(wl, wl->vif);
752

753
	wl1271_ps_elp_sleep(wl);
754
out:
L
Luciano Coelho 已提交
755 756 757 758 759 760 761 762 763
	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 已提交
764 765
	int rate = -1;
	u8 retries = 0;
L
Luciano Coelho 已提交
766 767

	/* check for id legality */
768
	if (unlikely(id >= ACX_TX_DESCRIPTORS || wl->tx_frames[id] == NULL)) {
L
Luciano Coelho 已提交
769 770 771 772 773 774 775
		wl1271_warning("TX result illegal id: %d", id);
		return;
	}

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

776
	if (wl12xx_is_dummy_packet(wl, skb)) {
777 778 779 780
		wl1271_free_tx_id(wl, id);
		return;
	}

J
Juuso Oikarinen 已提交
781 782 783
	/* update the TX status info */
	if (result->status == TX_SUCCESS) {
		if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
L
Luciano Coelho 已提交
784
			info->flags |= IEEE80211_TX_STAT_ACK;
785
		rate = wl1271_rate_to_idx(result->rate_class_index, wl->band);
J
Juuso Oikarinen 已提交
786 787 788 789
		retries = result->ack_failures;
	} else if (result->status == TX_RETRY_EXCEEDED) {
		wl->stats.excessive_retries++;
		retries = result->ack_failures;
L
Luciano Coelho 已提交
790 791
	}

J
Juuso Oikarinen 已提交
792 793 794 795 796
	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 已提交
797 798
	wl->stats.retry_count += result->ack_failures;

799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816
	/*
	 * 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;
	}
817

818 819 820 821
	/* remove private header from packet */
	skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

	/* remove TKIP header space if present */
L
Luciano Coelho 已提交
822
	if (info->control.hw_key &&
823
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) {
824 825 826 827
		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 已提交
828 829 830 831 832 833 834

	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 */
835
	skb_queue_tail(&wl->deferred_tx_queue, skb);
836
	queue_work(wl->freezable_wq, &wl->netstack_work);
837
	wl1271_free_tx_id(wl, result->id);
L
Luciano Coelho 已提交
838 839 840
}

/* Called upon reception of a TX complete interrupt */
841
void wl1271_tx_complete(struct wl1271 *wl)
L
Luciano Coelho 已提交
842 843 844
{
	struct wl1271_acx_mem_map *memmap =
		(struct wl1271_acx_mem_map *)wl->target_mem_map;
845
	u32 count, fw_counter;
L
Luciano Coelho 已提交
846 847 848
	u32 i;

	/* read the tx results from the chipset */
T
Teemu Paasikivi 已提交
849 850
	wl1271_read(wl, le32_to_cpu(memmap->tx_result),
		    wl->tx_res_if, sizeof(*wl->tx_res_if), false);
851 852 853 854 855 856 857 858
	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;
859
	wl1271_debug(DEBUG_TX, "tx_complete received, packets: %d", count);
L
Luciano Coelho 已提交
860 861

	/* verify that the result buffer is not getting overrun */
862
	if (unlikely(count > TX_HW_RESULT_QUEUE_LEN))
L
Luciano Coelho 已提交
863 864 865 866 867 868 869 870 871 872 873 874 875 876 877
		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++;
	}
}

878 879 880
void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid)
{
	struct sk_buff *skb;
881
	int i;
882
	unsigned long flags;
883
	struct ieee80211_tx_info *info;
884
	int total[NUM_TX_QUEUES];
885 886

	for (i = 0; i < NUM_TX_QUEUES; i++) {
887
		total[i] = 0;
888 889
		while ((skb = skb_dequeue(&wl->links[hlid].tx_queue[i]))) {
			wl1271_debug(DEBUG_TX, "link freeing skb 0x%p", skb);
890 891 892 893 894 895 896 897

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

898
			total[i]++;
899 900 901 902
		}
	}

	spin_lock_irqsave(&wl->wl_lock, flags);
903 904
	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] -= total[i];
905 906 907 908 909
	spin_unlock_irqrestore(&wl->wl_lock, flags);

	wl1271_handle_tx_low_watermark(wl);
}

910 911
/* caller must hold wl->mutex and TX must be stopped */
void wl1271_tx_reset(struct wl1271 *wl, bool reset_tx_queues)
L
Luciano Coelho 已提交
912
{
E
Eliad Peller 已提交
913 914
	struct ieee80211_vif *vif = wl->vif; /* TODO: get as param */
	struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
L
Luciano Coelho 已提交
915 916
	int i;
	struct sk_buff *skb;
917
	struct ieee80211_tx_info *info;
L
Luciano Coelho 已提交
918 919

	/* TX failure */
E
Eliad Peller 已提交
920
	if (wlvif->bss_type == BSS_TYPE_AP_BSS) {
921
		for (i = 0; i < AP_MAX_LINKS; i++) {
922
			wl1271_free_sta(wl, i);
923
			wl1271_tx_reset_link_queues(wl, i);
924 925
			wl->links[i].allocated_pkts = 0;
			wl->links[i].prev_freed_pkts = 0;
926
		}
927 928 929 930 931 932 933

		wl->last_tx_hlid = 0;
	} else {
		for (i = 0; i < NUM_TX_QUEUES; i++) {
			while ((skb = skb_dequeue(&wl->tx_queue[i]))) {
				wl1271_debug(DEBUG_TX, "freeing skb 0x%p",
					     skb);
934

935
				if (!wl12xx_is_dummy_packet(wl, skb)) {
936 937 938
					info = IEEE80211_SKB_CB(skb);
					info->status.rates[0].idx = -1;
					info->status.rates[0].count = 0;
939
					ieee80211_tx_status_ni(wl->hw, skb);
940
				}
941
			}
942
		}
943

E
Eliad Peller 已提交
944
		wlvif->sta.ba_rx_bitmap = 0;
L
Luciano Coelho 已提交
945
	}
946

947 948 949
	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] = 0;

950
	wl->stopped_queues_map = 0;
L
Luciano Coelho 已提交
951

952 953 954
	/*
	 * Make sure the driver is at a consistent state, in case this
	 * function is called from a context other than interface removal.
955
	 * This call will always wake the TX queues.
956
	 */
957 958
	if (reset_tx_queues)
		wl1271_handle_tx_low_watermark(wl);
959

960 961 962 963 964 965 966 967
	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);

968
		if (!wl12xx_is_dummy_packet(wl, skb)) {
969 970 971 972 973 974 975 976 977 978 979 980 981 982
			/*
			 * 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);
			}
983

984 985
			info->status.rates[0].idx = -1;
			info->status.rates[0].count = 0;
986

987
			ieee80211_tx_status_ni(wl->hw, skb);
988
		}
989
	}
990 991 992 993 994 995 996 997 998 999 1000 1001
}

#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);
1002
		wl1271_debug(DEBUG_TX, "flushing tx buffer: %d %d",
1003 1004 1005 1006
			     wl->tx_frames_cnt,
			     wl1271_tx_total_queue_count(wl));
		if ((wl->tx_frames_cnt == 0) &&
		    (wl1271_tx_total_queue_count(wl) == 0)) {
1007 1008 1009 1010 1011 1012 1013 1014
			mutex_unlock(&wl->mutex);
			return;
		}
		mutex_unlock(&wl->mutex);
		msleep(1);
	}

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

1017
u32 wl1271_tx_min_rate_get(struct wl1271 *wl, u32 rate_set)
A
Arik Nemtsov 已提交
1018
{
1019 1020
	if (WARN_ON(!rate_set))
		return 0;
A
Arik Nemtsov 已提交
1021

1022
	return BIT(__ffs(rate_set));
A
Arik Nemtsov 已提交
1023
}