tx.c 26.8 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, 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
		wl12xx_ps_link_start(wl, wlvif, hlid, true);
150 151
}

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;

171
		if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags))
E
Eliad Peller 已提交
172 173
			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
	if ((test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) ||
196
	     test_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags)) &&
197 198
	    !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);
}

213
static int wl1271_tx_allocate(struct wl1271 *wl, struct wl12xx_vif *wlvif,
E
Eliad Peller 已提交
214 215
			      struct sk_buff *skb, u32 extra, u32 buf_offset,
			      u8 hlid)
L
Luciano Coelho 已提交
216 217 218
{
	struct wl1271_tx_hw_descr *desc;
	u32 total_len = skb->len + sizeof(struct wl1271_tx_hw_descr) + extra;
219
	u32 len;
220
	u32 total_blocks;
221
	int id, ret = -EBUSY, ac;
222
	u32 spare_blocks = wl->tx_spare_blocks;
223
	bool is_dummy = false;
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
	/* in case of a dummy packet, use default amount of spare mem blocks */
238 239
	if (unlikely(wl12xx_is_dummy_packet(wl, skb))) {
		is_dummy = true;
240
		spare_blocks = TX_HW_BLOCK_SPARE_DEFAULT;
241
	}
242

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

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

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

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

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

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

266
		if (!is_dummy && wlvif->bss_type == BSS_TYPE_AP_BSS &&
267
		    test_bit(hlid, wlvif->ap.sta_hlid_map))
268
			wl->links[hlid].allocated_pkts++;
269

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

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

	return ret;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/* caller must hold wl->mutex */
391 392
static int wl1271_prepare_tx_frame(struct wl1271 *wl, struct wl12xx_vif *wlvif,
				   struct sk_buff *skb, u32 buf_offset)
L
Luciano Coelho 已提交
393 394 395 396
{
	struct ieee80211_tx_info *info;
	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
	/* TODO: handle dummy packets on multi-vifs */
	is_dummy = wl12xx_is_dummy_packet(wl, skb);

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

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

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

434
	ret = wl1271_tx_allocate(wl, wlvif, skb, extra, buf_offset, hlid);
L
Luciano Coelho 已提交
435 436 437
	if (ret < 0)
		return ret;

438
	wl1271_tx_fill_hdr(wl, wlvif, skb, extra, info, hlid);
439

440
	if (!is_dummy && wlvif->bss_type == BSS_TYPE_AP_BSS) {
441
		wl1271_tx_ap_update_inconnection_sta(wl, skb);
442
		wl1271_tx_regulate_link(wl, wlvif, hlid);
443
	}
444

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

455 456
	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 已提交
457

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

462
	return total_len;
L
Luciano Coelho 已提交
463 464
}

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

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

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

488 489 490
	return enabled_rates;
}

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

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

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

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

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

	return skb;
}

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

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

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

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

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

580 581
		wlvif->last_tx_hlid = h;
		break;
582 583
	}

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

	return skb;
}

590
static struct sk_buff *wl1271_skb_dequeue(struct wl1271 *wl)
591
{
592
	unsigned long flags;
593
	struct wl12xx_vif *wlvif;
594 595
	struct sk_buff *skb = NULL;

596 597 598 599 600 601 602
	/* TODO: rememeber last vif and consider it */
	wl12xx_for_each_wlvif(wl, wlvif) {
		skb = wl12xx_vif_skb_dequeue(wl, wlvif);
		if (skb)
			break;
	}

603 604
	if (!skb &&
	    test_and_clear_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags)) {
605 606
		int q;

607
		skb = wl->dummy_packet;
608
		q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
609
		spin_lock_irqsave(&wl->wl_lock, flags);
610
		wl->tx_queue_count[q]--;
611 612 613 614
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}

	return skb;
615 616
}

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

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

		/* make sure we dequeue the same packet next time */
630
		wlvif->last_tx_hlid = (hlid + WL12XX_MAX_LINKS - 1) %
631
				      WL12XX_MAX_LINKS;
632 633
	}

634
	spin_lock_irqsave(&wl->wl_lock, flags);
635
	wl->tx_queue_count[q]++;
636 637 638
	spin_unlock_irqrestore(&wl->wl_lock, flags);
}

639 640 641 642 643 644 645
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 已提交
646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672
void wl12xx_rearm_rx_streaming(struct wl1271 *wl, unsigned long *active_hlids)
{
	struct wl12xx_vif *wlvif;
	u32 timeout;
	u8 hlid;

	if (!wl->conf.rx_streaming.interval)
		return;

	if (!wl->conf.rx_streaming.always &&
	    !test_bit(WL1271_FLAG_SOFT_GEMINI, &wl->flags))
		return;

	timeout = wl->conf.rx_streaming.duration;
	wl12xx_for_each_wlvif_sta(wl, wlvif) {
		bool found = false;
		for_each_set_bit(hlid, active_hlids, WL12XX_MAX_LINKS) {
			if (test_bit(hlid, wlvif->links_map)) {
				found  = true;
				break;
			}
		}

		if (!found)
			continue;

		/* enable rx streaming */
673
		if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags))
E
Eliad Peller 已提交
674 675 676 677 678 679 680 681
			ieee80211_queue_work(wl->hw,
					     &wlvif->rx_streaming_enable_work);

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

682
void wl1271_tx_work_locked(struct wl1271 *wl)
L
Luciano Coelho 已提交
683
{
684
	struct wl12xx_vif *wlvif;
L
Luciano Coelho 已提交
685
	struct sk_buff *skb;
E
Eliad Peller 已提交
686
	struct wl1271_tx_hw_descr *desc;
I
Ido Yariv 已提交
687 688
	u32 buf_offset = 0;
	bool sent_packets = false;
E
Eliad Peller 已提交
689
	unsigned long active_hlids[BITS_TO_LONGS(WL12XX_MAX_LINKS)] = {0};
L
Luciano Coelho 已提交
690 691 692
	int ret;

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

695
	while ((skb = wl1271_skb_dequeue(wl))) {
E
Eliad Peller 已提交
696 697
		bool has_data = false;

698 699 700 701 702 703 704 705 706
		wlvif = NULL;
		if (!wl12xx_is_dummy_packet(wl, skb)) {
			struct ieee80211_tx_info *info;
			struct ieee80211_vif *vif;

			info = IEEE80211_SKB_CB(skb);
			vif = info->control.vif;
			wlvif = wl12xx_vif_to_data(vif);
		}
E
Eliad Peller 已提交
707
		has_data = wlvif && wl1271_tx_is_data_present(skb);
708

709
		ret = wl1271_prepare_tx_frame(wl, wlvif, skb, buf_offset);
I
Ido Yariv 已提交
710
		if (ret == -EAGAIN) {
711
			/*
I
Ido Yariv 已提交
712 713 714
			 * Aggregation buffer is full.
			 * Flush buffer and try again.
			 */
715
			wl1271_skb_queue_head(wl, wlvif, skb);
I
Ido Yariv 已提交
716
			wl1271_write(wl, WL1271_SLV_MEM_DATA, wl->aggr_buf,
717
				     buf_offset, true);
I
Ido Yariv 已提交
718 719 720 721 722 723
			sent_packets = true;
			buf_offset = 0;
			continue;
		} else if (ret == -EBUSY) {
			/*
			 * Firmware buffer is full.
724 725
			 * Queue back last skb, and stop aggregating.
			 */
726
			wl1271_skb_queue_head(wl, wlvif, skb);
I
Ido Yariv 已提交
727 728
			/* No work left, avoid scheduling redundant tx work */
			set_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
729
			goto out_ack;
L
Luciano Coelho 已提交
730 731
		} else if (ret < 0) {
			dev_kfree_skb(skb);
732
			goto out_ack;
L
Luciano Coelho 已提交
733
		}
734 735
		buf_offset += ret;
		wl->tx_packets_count++;
E
Eliad Peller 已提交
736 737 738 739
		if (has_data) {
			desc = (struct wl1271_tx_hw_descr *) skb->data;
			__set_bit(desc->hlid, active_hlids);
		}
L
Luciano Coelho 已提交
740 741
	}

742
out_ack:
743 744 745
	if (buf_offset) {
		wl1271_write(wl, WL1271_SLV_MEM_DATA, wl->aggr_buf,
				buf_offset, true);
I
Ido Yariv 已提交
746 747 748
		sent_packets = true;
	}
	if (sent_packets) {
749 750 751 752 753 754 755 756
		/*
		 * 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);

757
		wl1271_handle_tx_low_watermark(wl);
758
	}
E
Eliad Peller 已提交
759
	wl12xx_rearm_rx_streaming(wl, active_hlids);
I
Ido Yariv 已提交
760
}
L
Luciano Coelho 已提交
761

I
Ido Yariv 已提交
762 763 764
void wl1271_tx_work(struct work_struct *work)
{
	struct wl1271 *wl = container_of(work, struct wl1271, tx_work);
765
	int ret;
I
Ido Yariv 已提交
766 767

	mutex_lock(&wl->mutex);
768 769 770 771
	ret = wl1271_ps_elp_wakeup(wl);
	if (ret < 0)
		goto out;

772
	wl1271_tx_work_locked(wl);
773

774
	wl1271_ps_elp_sleep(wl);
775
out:
L
Luciano Coelho 已提交
776 777 778 779 780 781 782
	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;
783 784
	struct ieee80211_vif *vif;
	struct wl12xx_vif *wlvif;
L
Luciano Coelho 已提交
785 786
	struct sk_buff *skb;
	int id = result->id;
J
Juuso Oikarinen 已提交
787 788
	int rate = -1;
	u8 retries = 0;
L
Luciano Coelho 已提交
789 790

	/* check for id legality */
791
	if (unlikely(id >= ACX_TX_DESCRIPTORS || wl->tx_frames[id] == NULL)) {
L
Luciano Coelho 已提交
792 793 794 795 796 797 798
		wl1271_warning("TX result illegal id: %d", id);
		return;
	}

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

799
	if (wl12xx_is_dummy_packet(wl, skb)) {
800 801 802 803
		wl1271_free_tx_id(wl, id);
		return;
	}

804 805 806 807
	/* info->control is valid as long as we don't update info->status */
	vif = info->control.vif;
	wlvif = wl12xx_vif_to_data(vif);

J
Juuso Oikarinen 已提交
808 809 810
	/* update the TX status info */
	if (result->status == TX_SUCCESS) {
		if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
L
Luciano Coelho 已提交
811
			info->flags |= IEEE80211_TX_STAT_ACK;
E
Eliad Peller 已提交
812 813
		rate = wl1271_rate_to_idx(result->rate_class_index,
					  wlvif->band);
J
Juuso Oikarinen 已提交
814 815 816 817
		retries = result->ack_failures;
	} else if (result->status == TX_RETRY_EXCEEDED) {
		wl->stats.excessive_retries++;
		retries = result->ack_failures;
L
Luciano Coelho 已提交
818 819
	}

J
Juuso Oikarinen 已提交
820 821 822 823 824
	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 已提交
825 826
	wl->stats.retry_count += result->ack_failures;

827 828 829 830 831 832 833 834 835
	/*
	 * 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;
836
		u8 cur_lsb = wlvif->tx_security_last_seq_lsb;
837 838 839 840 841

		/*
		 * update security sequence number, taking care of potential
		 * wrap-around
		 */
842 843
		wlvif->tx_security_seq += (fw_lsb - cur_lsb) & 0xff;
		wlvif->tx_security_last_seq_lsb = fw_lsb;
844
	}
845

846 847 848 849
	/* remove private header from packet */
	skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

	/* remove TKIP header space if present */
L
Luciano Coelho 已提交
850
	if (info->control.hw_key &&
851
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) {
852 853 854 855
		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 已提交
856 857 858 859 860 861 862

	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 */
863
	skb_queue_tail(&wl->deferred_tx_queue, skb);
864
	queue_work(wl->freezable_wq, &wl->netstack_work);
865
	wl1271_free_tx_id(wl, result->id);
L
Luciano Coelho 已提交
866 867 868
}

/* Called upon reception of a TX complete interrupt */
869
void wl1271_tx_complete(struct wl1271 *wl)
L
Luciano Coelho 已提交
870 871 872
{
	struct wl1271_acx_mem_map *memmap =
		(struct wl1271_acx_mem_map *)wl->target_mem_map;
873
	u32 count, fw_counter;
L
Luciano Coelho 已提交
874 875 876
	u32 i;

	/* read the tx results from the chipset */
T
Teemu Paasikivi 已提交
877 878
	wl1271_read(wl, le32_to_cpu(memmap->tx_result),
		    wl->tx_res_if, sizeof(*wl->tx_res_if), false);
879 880 881 882 883 884 885 886
	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;
887
	wl1271_debug(DEBUG_TX, "tx_complete received, packets: %d", count);
L
Luciano Coelho 已提交
888 889

	/* verify that the result buffer is not getting overrun */
890
	if (unlikely(count > TX_HW_RESULT_QUEUE_LEN))
L
Luciano Coelho 已提交
891 892 893 894 895 896 897 898 899 900 901 902 903 904 905
		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++;
	}
}

906 907 908
void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid)
{
	struct sk_buff *skb;
909
	int i;
910
	unsigned long flags;
911
	struct ieee80211_tx_info *info;
912
	int total[NUM_TX_QUEUES];
913 914

	for (i = 0; i < NUM_TX_QUEUES; i++) {
915
		total[i] = 0;
916 917
		while ((skb = skb_dequeue(&wl->links[hlid].tx_queue[i]))) {
			wl1271_debug(DEBUG_TX, "link freeing skb 0x%p", skb);
918 919 920 921 922 923 924 925

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

926
			total[i]++;
927 928 929 930
		}
	}

	spin_lock_irqsave(&wl->wl_lock, flags);
931 932
	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] -= total[i];
933 934 935 936 937
	spin_unlock_irqrestore(&wl->wl_lock, flags);

	wl1271_handle_tx_low_watermark(wl);
}

938
/* caller must hold wl->mutex and TX must be stopped */
939
void wl12xx_tx_reset_wlvif(struct wl1271 *wl, struct wl12xx_vif *wlvif)
L
Luciano Coelho 已提交
940 941 942 943
{
	int i;

	/* TX failure */
944 945
	for_each_set_bit(i, wlvif->links_map, WL12XX_MAX_LINKS) {
		if (wlvif->bss_type == BSS_TYPE_AP_BSS)
946
			wl1271_free_sta(wl, wlvif, i);
947 948
		else
			wlvif->sta.ba_rx_bitmap = 0;
949

950 951 952
		wl1271_tx_reset_link_queues(wl, i);
		wl->links[i].allocated_pkts = 0;
		wl->links[i].prev_freed_pkts = 0;
L
Luciano Coelho 已提交
953
	}
954 955 956 957 958 959 960 961 962
	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;
963

964 965 966
	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] = 0;

967
	wl->stopped_queues_map = 0;
L
Luciano Coelho 已提交
968

969 970 971
	/*
	 * Make sure the driver is at a consistent state, in case this
	 * function is called from a context other than interface removal.
972
	 * This call will always wake the TX queues.
973
	 */
974 975
	if (reset_tx_queues)
		wl1271_handle_tx_low_watermark(wl);
976

977 978 979 980 981 982 983 984
	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);

985
		if (!wl12xx_is_dummy_packet(wl, skb)) {
986 987 988 989 990 991 992 993 994 995 996 997 998 999
			/*
			 * 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);
			}
1000

1001 1002
			info->status.rates[0].idx = -1;
			info->status.rates[0].count = 0;
1003

1004
			ieee80211_tx_status_ni(wl->hw, skb);
1005
		}
1006
	}
1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018
}

#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);
1019
		wl1271_debug(DEBUG_TX, "flushing tx buffer: %d %d",
1020 1021 1022 1023
			     wl->tx_frames_cnt,
			     wl1271_tx_total_queue_count(wl));
		if ((wl->tx_frames_cnt == 0) &&
		    (wl1271_tx_total_queue_count(wl) == 0)) {
1024 1025 1026 1027 1028 1029 1030 1031
			mutex_unlock(&wl->mutex);
			return;
		}
		mutex_unlock(&wl->mutex);
		msleep(1);
	}

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

1034
u32 wl1271_tx_min_rate_get(struct wl1271 *wl, u32 rate_set)
A
Arik Nemtsov 已提交
1035
{
1036 1037
	if (WARN_ON(!rate_set))
		return 0;
A
Arik Nemtsov 已提交
1038

1039
	return BIT(__ffs(rate_set));
A
Arik Nemtsov 已提交
1040
}