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
						     wl->ap_bcast_hlid);
44
	else
E
Eliad Peller 已提交
45
		ret = wl12xx_cmd_set_default_wep_key(wl, id, wl->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;

97 98 99 100
	if (wl->dev_hlid != WL12XX_INVALID_LINK_ID)
		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 159
{
	return wl->dummy_packet == skb;
}

u8 wl12xx_tx_get_hlid_ap(struct wl1271 *wl, struct sk_buff *skb)
160 161 162 163 164 165 166 167 168 169 170 171
{
	struct ieee80211_tx_info *control = IEEE80211_SKB_CB(skb);

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

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

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

175 176
		hdr = (struct ieee80211_hdr *)skb->data;
		if (ieee80211_is_mgmt(hdr->frame_control))
177
			return wl->ap_global_hlid;
178
		else
179
			return wl->ap_bcast_hlid;
180 181 182
	}
}

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

189

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

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

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

	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 已提交
202 203 204 205 206
		return wl->sta_hlid;
	else
		return wl->dev_hlid;
}

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

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

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

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

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

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

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

251 252 253 254
		/* HW descriptor fields change between wl127x and wl128x */
		if (wl->chip.id == CHIP_ID_1283_PG20) {
			desc->wl128x_mem.total_mem_blocks = total_blocks;
		} else {
255
			desc->wl127x_mem.extra_blocks = spare_blocks;
256 257 258
			desc->wl127x_mem.total_mem_blocks = total_blocks;
		}

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

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

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

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

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

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

	return ret;
}

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

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

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

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

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

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

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

		tx_attr |= TX_HW_ATTR_TX_DUMMY_REQ;
	} else {
		/* configure the tx attributes */
		tx_attr =
			wl->session_counter << TX_HW_ATTR_OFST_SESSION_COUNTER;
	}

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

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

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

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

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

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

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

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

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

	if (!skb)
		return -EINVAL;

	info = IEEE80211_SKB_CB(skb);

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

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

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

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

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

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

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

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

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

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

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

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

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

493 494 495
	return enabled_rates;
}

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

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

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

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

	skb = skb_dequeue(queue);
553 554 555

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

	return skb;
}

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

	/* 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;

579 580 581 582 583 584 585 586 587 588
		/* 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);
589
		if (skb)
590
			break;
591 592 593
	}

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

	return skb;
}

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

E
Eliad Peller 已提交
612
	if (wlvif->bss_type == BSS_TYPE_AP_BSS)
613 614 615
		skb = wl1271_ap_skb_dequeue(wl);
	else
		skb = wl1271_sta_skb_dequeue(wl);
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
		wl->tx_queue_count[q]--;
625 626 627 628
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}

	return skb;
629 630
}

E
Eliad Peller 已提交
631 632
static void wl1271_skb_queue_head(struct wl1271 *wl, struct ieee80211_vif *vif,
				  struct sk_buff *skb)
633
{
E
Eliad Peller 已提交
634
	struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
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);
E
Eliad Peller 已提交
640 641
	} else if (wlvif->bss_type == BSS_TYPE_AP_BSS) {
		u8 hlid = wl1271_tx_get_hlid(wl, vif, skb);
642 643 644 645 646 647 648 649
		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);
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	wl1271_handle_tx_low_watermark(wl);
}

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

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

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

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

		wl->ba_rx_bitmap = 0;
L
Luciano Coelho 已提交
944
	}
945

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

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

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

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

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

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

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

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

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

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

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