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

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

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

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

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

	if (ret < 0)
		return ret;

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

54
static int wl1271_alloc_tx_id(struct wl1271 *wl, struct sk_buff *skb)
L
Luciano Coelho 已提交
55
{
56 57 58 59 60 61 62 63 64 65 66
	int id;

	id = find_first_zero_bit(wl->tx_frames_map, ACX_TX_DESCRIPTORS);
	if (id >= ACX_TX_DESCRIPTORS)
		return -EBUSY;

	__set_bit(id, wl->tx_frames_map);
	wl->tx_frames[id] = skb;
	wl->tx_frames_cnt++;
	return id;
}
L
Luciano Coelho 已提交
67

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

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

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

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

	/*
	 * stop bssid-based filtering before transmitting authentication
	 * requests. this way the hw will never drop authentication
	 * responses coming from BSSIDs it isn't familiar with (e.g. on
	 * roaming)
	 */
	if (!ieee80211_is_auth(hdr->frame_control))
		return 0;

E
Eliad Peller 已提交
97
	if (wlvif->dev_hlid != WL12XX_INVALID_LINK_ID)
98 99 100
		goto out;

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

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

112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
static void wl1271_tx_ap_update_inconnection_sta(struct wl1271 *wl,
						 struct sk_buff *skb)
{
	struct ieee80211_hdr *hdr;

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

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

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

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

	/*
	 * if in FW PS and there is enough data in FW we can put the link
	 * into high-level PS and clean out its TX queues.
145 146
	 * Make an exception if this is the only connected station. In this
	 * case FW-memory congestion is not a problem.
147
	 */
148
	if (!single_sta && fw_ps && tx_pkts >= WL1271_PS_STA_MAX_PACKETS)
149 150 151
		wl1271_ps_link_start(wl, hlid, true);
}

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

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

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

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

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

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

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

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

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

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

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

204 205 206 207 208 209 210 211 212
static unsigned int wl12xx_calc_packet_alignment(struct wl1271 *wl,
						unsigned int packet_length)
{
	if (wl->quirks & WL12XX_QUIRK_BLOCKSIZE_ALIGNMENT)
		return ALIGN(packet_length, WL12XX_BUS_BLOCK_SIZE);
	else
		return ALIGN(packet_length, WL1271_TX_ALIGN_TO);
}

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

646
void wl1271_tx_work_locked(struct wl1271 *wl)
L
Luciano Coelho 已提交
647
{
648
	struct wl12xx_vif *wlvif;
L
Luciano Coelho 已提交
649
	struct sk_buff *skb;
I
Ido Yariv 已提交
650 651
	u32 buf_offset = 0;
	bool sent_packets = false;
652
	bool had_data = false;
653 654
	/* TODO: save bitmap of relevant stations */
	bool is_sta = false;
L
Luciano Coelho 已提交
655 656 657
	int ret;

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

660 661 662 663 664 665 666 667 668 669 670
	while ((skb = wl1271_skb_dequeue(wl))) {
		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);
		}

671 672 673
		if (wl1271_tx_is_data_present(skb))
			had_data = true;

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

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

720
		wl1271_handle_tx_low_watermark(wl);
721
	}
722
	if (is_sta && wl->conf.rx_streaming.interval && had_data &&
723 724 725 726 727 728 729 730 731 732 733 734
	    (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 已提交
735
}
L
Luciano Coelho 已提交
736

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

	mutex_lock(&wl->mutex);
743 744 745 746
	ret = wl1271_ps_elp_wakeup(wl);
	if (ret < 0)
		goto out;

747
	wl1271_tx_work_locked(wl);
748

749
	wl1271_ps_elp_sleep(wl);
750
out:
L
Luciano Coelho 已提交
751 752 753 754 755 756 757
	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;
758 759
	struct ieee80211_vif *vif;
	struct wl12xx_vif *wlvif;
L
Luciano Coelho 已提交
760 761
	struct sk_buff *skb;
	int id = result->id;
J
Juuso Oikarinen 已提交
762 763
	int rate = -1;
	u8 retries = 0;
L
Luciano Coelho 已提交
764 765

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

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

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

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

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

801 802 803 804 805 806 807 808 809
	/*
	 * 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;
810
		u8 cur_lsb = wlvif->tx_security_last_seq_lsb;
811 812 813 814 815

		/*
		 * update security sequence number, taking care of potential
		 * wrap-around
		 */
816 817
		wlvif->tx_security_seq += (fw_lsb - cur_lsb) & 0xff;
		wlvif->tx_security_last_seq_lsb = fw_lsb;
818
	}
819

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

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

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

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

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

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

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

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

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

900
			total[i]++;
901 902 903 904
		}
	}

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

	wl1271_handle_tx_low_watermark(wl);
}

912
/* caller must hold wl->mutex and TX must be stopped */
913
void wl12xx_tx_reset_wlvif(struct wl1271 *wl, struct wl12xx_vif *wlvif)
L
Luciano Coelho 已提交
914 915 916 917
{
	int i;

	/* TX failure */
918 919
	for_each_set_bit(i, wlvif->links_map, WL12XX_MAX_LINKS) {
		if (wlvif->bss_type == BSS_TYPE_AP_BSS)
920
			wl1271_free_sta(wl, wlvif, i);
921 922
		else
			wlvif->sta.ba_rx_bitmap = 0;
923

924 925 926
		wl1271_tx_reset_link_queues(wl, i);
		wl->links[i].allocated_pkts = 0;
		wl->links[i].prev_freed_pkts = 0;
L
Luciano Coelho 已提交
927
	}
928 929 930 931 932 933 934 935 936
	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;
937

938 939 940
	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] = 0;

941
	wl->stopped_queues_map = 0;
L
Luciano Coelho 已提交
942

943 944 945
	/*
	 * Make sure the driver is at a consistent state, in case this
	 * function is called from a context other than interface removal.
946
	 * This call will always wake the TX queues.
947
	 */
948 949
	if (reset_tx_queues)
		wl1271_handle_tx_low_watermark(wl);
950

951 952 953 954 955 956 957 958
	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);

959
		if (!wl12xx_is_dummy_packet(wl, skb)) {
960 961 962 963 964 965 966 967 968 969 970 971 972 973
			/*
			 * 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);
			}
974

975 976
			info->status.rates[0].idx = -1;
			info->status.rates[0].count = 0;
977

978
			ieee80211_tx_status_ni(wl->hw, skb);
979
		}
980
	}
981 982 983 984 985 986 987 988 989 990 991 992
}

#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);
993
		wl1271_debug(DEBUG_TX, "flushing tx buffer: %d %d",
994 995 996 997
			     wl->tx_frames_cnt,
			     wl1271_tx_total_queue_count(wl));
		if ((wl->tx_frames_cnt == 0) &&
		    (wl1271_tx_total_queue_count(wl) == 0)) {
998 999 1000 1001 1002 1003 1004 1005
			mutex_unlock(&wl->mutex);
			return;
		}
		mutex_unlock(&wl->mutex);
		msleep(1);
	}

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

1008
u32 wl1271_tx_min_rate_get(struct wl1271 *wl, u32 rate_set)
A
Arik Nemtsov 已提交
1009
{
1010 1011
	if (WARN_ON(!rate_set))
		return 0;
A
Arik Nemtsov 已提交
1012

1013
	return BIT(__ffs(rate_set));
A
Arik Nemtsov 已提交
1014
}