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

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

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

	if (ret < 0)
		return ret;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

158 159
u8 wl12xx_tx_get_hlid_ap(struct wl1271 *wl, struct wl12xx_vif *wlvif,
			 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;

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

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

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

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

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

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

196
	if ((test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) ||
197
	     test_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags)) &&
198 199
	    !ieee80211_is_auth(hdr->frame_control) &&
	    !ieee80211_is_assoc_req(hdr->frame_control))
E
Eliad Peller 已提交
200
		return wlvif->sta.hlid;
E
Eliad Peller 已提交
201
	else
E
Eliad Peller 已提交
202
		return wlvif->dev_hlid;
E
Eliad Peller 已提交
203 204
}

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

214
static int wl1271_tx_allocate(struct wl1271 *wl, struct wl12xx_vif *wlvif,
E
Eliad Peller 已提交
215 216
			      struct sk_buff *skb, u32 extra, u32 buf_offset,
			      u8 hlid)
L
Luciano Coelho 已提交
217 218 219
{
	struct wl1271_tx_hw_descr *desc;
	u32 total_len = skb->len + sizeof(struct wl1271_tx_hw_descr) + extra;
220
	u32 len;
221
	u32 total_blocks;
222
	int id, ret = -EBUSY, ac;
223
	u32 spare_blocks = wl->tx_spare_blocks;
224
	bool is_dummy = false;
L
Luciano Coelho 已提交
225

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

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

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

238
	/* in case of a dummy packet, use default amount of spare mem blocks */
239 240
	if (unlikely(wl12xx_is_dummy_packet(wl, skb))) {
		is_dummy = true;
241
		spare_blocks = TX_HW_BLOCK_SPARE_DEFAULT;
242
	}
243

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 268
		if (!is_dummy && wlvif &&
		    wlvif->bss_type == BSS_TYPE_AP_BSS &&
269
		    test_bit(hlid, wlvif->ap.sta_hlid_map))
270
			wl->links[hlid].allocated_pkts++;
271

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

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

	return ret;
}

284
static void wl1271_tx_fill_hdr(struct wl1271 *wl, struct wl12xx_vif *wlvif,
E
Eliad Peller 已提交
285 286
			       struct sk_buff *skb, u32 extra,
			       struct ieee80211_tx_info *control, u8 hlid)
L
Luciano Coelho 已提交
287
{
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;
293
	bool is_dummy;
L
Luciano Coelho 已提交
294 295 296

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

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

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

310
	is_dummy = wl12xx_is_dummy_packet(wl, skb);
E
Eliad Peller 已提交
311
	if (is_dummy || !wlvif || wlvif->bss_type != BSS_TYPE_AP_BSS)
312 313 314
		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 已提交
315

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

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

		tx_attr |= TX_HW_ATTR_TX_DUMMY_REQ;
E
Eliad Peller 已提交
330
	} else if (wlvif) {
331
		/* configure the tx attributes */
332 333
		tx_attr = wlvif->session_counter <<
			  TX_HW_ATTR_OFST_SESSION_COUNTER;
334 335
	}

E
Eliad Peller 已提交
336
	desc->hlid = hlid;
E
Eliad Peller 已提交
337
	if (is_dummy || !wlvif)
338 339
		rate_idx = 0;
	else if (wlvif->bss_type != BSS_TYPE_AP_BSS) {
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)
E
Eliad Peller 已提交
344
			rate_idx = wlvif->sta.ap_rate_idx;
345
		else
E
Eliad Peller 已提交
346
			rate_idx = wlvif->sta.basic_rate_idx;
347
	} else {
348
		if (hlid == wlvif->ap.global_hlid)
E
Eliad Peller 已提交
349
			rate_idx = wlvif->ap.mgmt_rate_idx;
350
		else if (hlid == wlvif->ap.bcast_hlid)
E
Eliad Peller 已提交
351
			rate_idx = wlvif->ap.bcast_rate_idx;
352
		else
E
Eliad Peller 已提交
353
			rate_idx = wlvif->ap.ucast_rate_idx[ac];
354 355 356
	}

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

359
	aligned_len = wl12xx_calc_packet_alignment(wl, skb->len);
360

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

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

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

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

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

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

	if (!skb)
		return -EINVAL;

	info = IEEE80211_SKB_CB(skb);

E
Eliad Peller 已提交
408 409 410
	/* TODO: handle dummy packets on multi-vifs */
	is_dummy = wl12xx_is_dummy_packet(wl, skb);

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

	if (info->control.hw_key) {
416 417 418 419 420 421
		bool is_wep;
		u8 idx = info->control.hw_key->hw_key_idx;
		u32 cipher = info->control.hw_key->cipher;

		is_wep = (cipher == WLAN_CIPHER_SUITE_WEP40) ||
			 (cipher == WLAN_CIPHER_SUITE_WEP104);
L
Luciano Coelho 已提交
422

E
Eliad Peller 已提交
423
		if (unlikely(is_wep && wlvif->default_key != idx)) {
E
Eliad Peller 已提交
424
			ret = wl1271_set_default_wep_key(wl, wlvif, idx);
L
Luciano Coelho 已提交
425 426
			if (ret < 0)
				return ret;
E
Eliad Peller 已提交
427
			wlvif->default_key = idx;
L
Luciano Coelho 已提交
428 429
		}
	}
430
	hlid = wl12xx_tx_get_hlid(wl, wlvif, skb);
E
Eliad Peller 已提交
431
	if (hlid == WL12XX_INVALID_LINK_ID) {
432 433 434 435 436 437 438 439 440
		if (wlvif->bss_type == BSS_TYPE_IBSS &&
		    !test_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags)) {
			/* It's ok to drop packets when not joined to IBSS */
			wl1271_debug(DEBUG_TX, "dropping skb while IBSS not "
				     " joined");
		} else {
			wl1271_error("invalid hlid. dropping skb 0x%p", skb);
		}

E
Eliad Peller 已提交
441 442
		return -EINVAL;
	}
443

444
	ret = wl1271_tx_allocate(wl, wlvif, skb, extra, buf_offset, hlid);
L
Luciano Coelho 已提交
445 446 447
	if (ret < 0)
		return ret;

448
	wl1271_tx_fill_hdr(wl, wlvif, skb, extra, info, hlid);
449

E
Eliad Peller 已提交
450
	if (!is_dummy && wlvif && wlvif->bss_type == BSS_TYPE_AP_BSS) {
451
		wl1271_tx_ap_update_inconnection_sta(wl, skb);
452
		wl1271_tx_regulate_link(wl, wlvif, hlid);
453
	}
454

455
	/*
456 457 458 459 460 461
	 * 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).
462
	 */
463
	total_len = wl12xx_calc_packet_alignment(wl, skb->len);
464

465 466
	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 已提交
467

468
	/* Revert side effects in the dummy packet skb, so it can be reused */
E
Eliad Peller 已提交
469
	if (is_dummy)
470 471
		skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

472
	return total_len;
L
Luciano Coelho 已提交
473 474
}

475 476
u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set,
				enum ieee80211_band rate_band)
477 478 479 480 481
{
	struct ieee80211_supported_band *band;
	u32 enabled_rates = 0;
	int bit;

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

489 490 491 492 493 494 495 496 497
	/* 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;
	}

498 499 500
	return enabled_rates;
}

501
void wl1271_handle_tx_low_watermark(struct wl1271 *wl)
502 503
{
	unsigned long flags;
504
	int i;
505

506 507
	for (i = 0; i < NUM_TX_QUEUES; i++) {
		if (test_bit(i, &wl->stopped_queues_map) &&
508
		    wl->tx_queue_count[i] <= WL1271_TX_QUEUE_LOW_WATERMARK) {
509 510 511 512 513 514 515
			/* 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);
		}
516 517 518
	}
}

519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546
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];
}

547 548
static struct sk_buff *wl12xx_lnk_skb_dequeue(struct wl1271 *wl,
					      struct wl1271_link *lnk)
549
{
550
	struct sk_buff *skb;
551
	unsigned long flags;
552
	struct sk_buff_head *queue;
553

554
	queue = wl1271_select_queue(wl, lnk->tx_queue);
555
	if (!queue)
556
		return NULL;
557 558

	skb = skb_dequeue(queue);
559
	if (skb) {
560
		int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
561
		spin_lock_irqsave(&wl->wl_lock, flags);
562
		wl->tx_queue_count[q]--;
563 564 565 566 567 568
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}

	return skb;
}

569 570
static struct sk_buff *wl12xx_vif_skb_dequeue(struct wl1271 *wl,
					      struct wl12xx_vif *wlvif)
571 572 573 574 575
{
	struct sk_buff *skb = NULL;
	int i, h, start_hlid;

	/* start from the link after the last one */
576
	start_hlid = (wlvif->last_tx_hlid + 1) % WL12XX_MAX_LINKS;
577 578

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

582
		/* only consider connected stations */
583
		if (!test_bit(h, wlvif->links_map))
584 585
			continue;

586 587
		skb = wl12xx_lnk_skb_dequeue(wl, &wl->links[h]);
		if (!skb)
588 589
			continue;

590 591
		wlvif->last_tx_hlid = h;
		break;
592 593
	}

594
	if (!skb)
595
		wlvif->last_tx_hlid = 0;
596 597 598 599

	return skb;
}

600
static struct sk_buff *wl1271_skb_dequeue(struct wl1271 *wl)
601
{
602
	unsigned long flags;
603
	struct wl12xx_vif *wlvif = wl->last_wlvif;
604 605
	struct sk_buff *skb = NULL;

606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624
	if (wlvif) {
		wl12xx_for_each_wlvif_continue(wl, wlvif) {
			skb = wl12xx_vif_skb_dequeue(wl, wlvif);
			if (skb) {
				wl->last_wlvif = wlvif;
				break;
			}
		}
	}

	/* do another pass */
	if (!skb) {
		wl12xx_for_each_wlvif(wl, wlvif) {
			skb = wl12xx_vif_skb_dequeue(wl, wlvif);
			if (skb) {
				wl->last_wlvif = wlvif;
				break;
			}
		}
625 626
	}

E
Eliad Peller 已提交
627 628 629
	if (!skb)
		skb = wl12xx_lnk_skb_dequeue(wl, &wl->links[wl->system_hlid]);

630 631
	if (!skb &&
	    test_and_clear_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags)) {
632 633
		int q;

634
		skb = wl->dummy_packet;
635
		q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
636
		spin_lock_irqsave(&wl->wl_lock, flags);
637
		wl->tx_queue_count[q]--;
638 639 640 641
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}

	return skb;
642 643
}

644
static void wl1271_skb_queue_head(struct wl1271 *wl, struct wl12xx_vif *wlvif,
E
Eliad Peller 已提交
645
				  struct sk_buff *skb)
646 647 648 649
{
	unsigned long flags;
	int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));

650 651
	if (wl12xx_is_dummy_packet(wl, skb)) {
		set_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags);
652 653
	} else {
		u8 hlid = wl12xx_tx_get_hlid(wl, wlvif, skb);
654 655 656
		skb_queue_head(&wl->links[hlid].tx_queue[q], skb);

		/* make sure we dequeue the same packet next time */
657
		wlvif->last_tx_hlid = (hlid + WL12XX_MAX_LINKS - 1) %
658
				      WL12XX_MAX_LINKS;
659 660
	}

661
	spin_lock_irqsave(&wl->wl_lock, flags);
662
	wl->tx_queue_count[q]++;
663 664 665
	spin_unlock_irqrestore(&wl->wl_lock, flags);
}

666 667 668 669 670 671 672
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 已提交
673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699
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 */
700
		if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags))
E
Eliad Peller 已提交
701 702 703 704 705 706 707 708
			ieee80211_queue_work(wl->hw,
					     &wlvif->rx_streaming_enable_work);

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

709
void wl1271_tx_work_locked(struct wl1271 *wl)
L
Luciano Coelho 已提交
710
{
711
	struct wl12xx_vif *wlvif;
L
Luciano Coelho 已提交
712
	struct sk_buff *skb;
E
Eliad Peller 已提交
713
	struct wl1271_tx_hw_descr *desc;
I
Ido Yariv 已提交
714 715
	u32 buf_offset = 0;
	bool sent_packets = false;
E
Eliad Peller 已提交
716
	unsigned long active_hlids[BITS_TO_LONGS(WL12XX_MAX_LINKS)] = {0};
L
Luciano Coelho 已提交
717 718 719
	int ret;

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

722
	while ((skb = wl1271_skb_dequeue(wl))) {
E
Eliad Peller 已提交
723
		struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
E
Eliad Peller 已提交
724 725
		bool has_data = false;

726
		wlvif = NULL;
E
Eliad Peller 已提交
727 728
		if (!wl12xx_is_dummy_packet(wl, skb) && info->control.vif)
			wlvif = wl12xx_vif_to_data(info->control.vif);
729

E
Eliad Peller 已提交
730
		has_data = wlvif && wl1271_tx_is_data_present(skb);
731
		ret = wl1271_prepare_tx_frame(wl, wlvif, skb, buf_offset);
I
Ido Yariv 已提交
732
		if (ret == -EAGAIN) {
733
			/*
I
Ido Yariv 已提交
734 735 736
			 * Aggregation buffer is full.
			 * Flush buffer and try again.
			 */
737
			wl1271_skb_queue_head(wl, wlvif, skb);
I
Ido Yariv 已提交
738
			wl1271_write(wl, WL1271_SLV_MEM_DATA, wl->aggr_buf,
739
				     buf_offset, true);
I
Ido Yariv 已提交
740 741 742 743 744 745
			sent_packets = true;
			buf_offset = 0;
			continue;
		} else if (ret == -EBUSY) {
			/*
			 * Firmware buffer is full.
746 747
			 * Queue back last skb, and stop aggregating.
			 */
748
			wl1271_skb_queue_head(wl, wlvif, skb);
I
Ido Yariv 已提交
749 750
			/* No work left, avoid scheduling redundant tx work */
			set_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
751
			goto out_ack;
L
Luciano Coelho 已提交
752 753
		} else if (ret < 0) {
			dev_kfree_skb(skb);
754
			goto out_ack;
L
Luciano Coelho 已提交
755
		}
756 757
		buf_offset += ret;
		wl->tx_packets_count++;
E
Eliad Peller 已提交
758 759 760 761
		if (has_data) {
			desc = (struct wl1271_tx_hw_descr *) skb->data;
			__set_bit(desc->hlid, active_hlids);
		}
L
Luciano Coelho 已提交
762 763
	}

764
out_ack:
765 766 767
	if (buf_offset) {
		wl1271_write(wl, WL1271_SLV_MEM_DATA, wl->aggr_buf,
				buf_offset, true);
I
Ido Yariv 已提交
768 769 770
		sent_packets = true;
	}
	if (sent_packets) {
771 772 773 774 775 776 777 778
		/*
		 * 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);

779
		wl1271_handle_tx_low_watermark(wl);
780
	}
E
Eliad Peller 已提交
781
	wl12xx_rearm_rx_streaming(wl, active_hlids);
I
Ido Yariv 已提交
782
}
L
Luciano Coelho 已提交
783

I
Ido Yariv 已提交
784 785 786
void wl1271_tx_work(struct work_struct *work)
{
	struct wl1271 *wl = container_of(work, struct wl1271, tx_work);
787
	int ret;
I
Ido Yariv 已提交
788 789

	mutex_lock(&wl->mutex);
790 791 792 793
	ret = wl1271_ps_elp_wakeup(wl);
	if (ret < 0)
		goto out;

794
	wl1271_tx_work_locked(wl);
795

796
	wl1271_ps_elp_sleep(wl);
797
out:
L
Luciano Coelho 已提交
798 799 800 801 802 803 804
	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;
805 806
	struct ieee80211_vif *vif;
	struct wl12xx_vif *wlvif;
L
Luciano Coelho 已提交
807 808
	struct sk_buff *skb;
	int id = result->id;
J
Juuso Oikarinen 已提交
809 810
	int rate = -1;
	u8 retries = 0;
L
Luciano Coelho 已提交
811 812

	/* check for id legality */
813
	if (unlikely(id >= ACX_TX_DESCRIPTORS || wl->tx_frames[id] == NULL)) {
L
Luciano Coelho 已提交
814 815 816 817 818 819 820
		wl1271_warning("TX result illegal id: %d", id);
		return;
	}

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

821
	if (wl12xx_is_dummy_packet(wl, skb)) {
822 823 824 825
		wl1271_free_tx_id(wl, id);
		return;
	}

826 827 828 829
	/* 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 已提交
830 831 832
	/* update the TX status info */
	if (result->status == TX_SUCCESS) {
		if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
L
Luciano Coelho 已提交
833
			info->flags |= IEEE80211_TX_STAT_ACK;
E
Eliad Peller 已提交
834 835
		rate = wl1271_rate_to_idx(result->rate_class_index,
					  wlvif->band);
J
Juuso Oikarinen 已提交
836 837 838 839
		retries = result->ack_failures;
	} else if (result->status == TX_RETRY_EXCEEDED) {
		wl->stats.excessive_retries++;
		retries = result->ack_failures;
L
Luciano Coelho 已提交
840 841
	}

J
Juuso Oikarinen 已提交
842 843 844 845 846
	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 已提交
847 848
	wl->stats.retry_count += result->ack_failures;

849 850 851 852 853 854 855 856 857
	/*
	 * 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;
858
		u8 cur_lsb = wlvif->tx_security_last_seq_lsb;
859 860 861 862 863

		/*
		 * update security sequence number, taking care of potential
		 * wrap-around
		 */
864 865
		wlvif->tx_security_seq += (fw_lsb - cur_lsb) & 0xff;
		wlvif->tx_security_last_seq_lsb = fw_lsb;
866
	}
867

868 869 870 871
	/* remove private header from packet */
	skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

	/* remove TKIP header space if present */
L
Luciano Coelho 已提交
872
	if (info->control.hw_key &&
873
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) {
874 875 876 877
		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 已提交
878 879 880 881 882 883 884

	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 */
885
	skb_queue_tail(&wl->deferred_tx_queue, skb);
886
	queue_work(wl->freezable_wq, &wl->netstack_work);
887
	wl1271_free_tx_id(wl, result->id);
L
Luciano Coelho 已提交
888 889 890
}

/* Called upon reception of a TX complete interrupt */
891
void wl1271_tx_complete(struct wl1271 *wl)
L
Luciano Coelho 已提交
892 893 894
{
	struct wl1271_acx_mem_map *memmap =
		(struct wl1271_acx_mem_map *)wl->target_mem_map;
895
	u32 count, fw_counter;
L
Luciano Coelho 已提交
896 897 898
	u32 i;

	/* read the tx results from the chipset */
T
Teemu Paasikivi 已提交
899 900
	wl1271_read(wl, le32_to_cpu(memmap->tx_result),
		    wl->tx_res_if, sizeof(*wl->tx_res_if), false);
901 902 903 904 905 906 907 908
	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;
909
	wl1271_debug(DEBUG_TX, "tx_complete received, packets: %d", count);
L
Luciano Coelho 已提交
910 911

	/* verify that the result buffer is not getting overrun */
912
	if (unlikely(count > TX_HW_RESULT_QUEUE_LEN))
L
Luciano Coelho 已提交
913 914 915 916 917 918 919 920 921 922 923 924 925 926 927
		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++;
	}
}

928 929 930
void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid)
{
	struct sk_buff *skb;
931
	int i;
932
	unsigned long flags;
933
	struct ieee80211_tx_info *info;
934
	int total[NUM_TX_QUEUES];
935 936

	for (i = 0; i < NUM_TX_QUEUES; i++) {
937
		total[i] = 0;
938 939
		while ((skb = skb_dequeue(&wl->links[hlid].tx_queue[i]))) {
			wl1271_debug(DEBUG_TX, "link freeing skb 0x%p", skb);
940 941 942 943 944 945 946 947

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

948
			total[i]++;
949 950 951 952
		}
	}

	spin_lock_irqsave(&wl->wl_lock, flags);
953 954
	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] -= total[i];
955 956 957 958 959
	spin_unlock_irqrestore(&wl->wl_lock, flags);

	wl1271_handle_tx_low_watermark(wl);
}

960
/* caller must hold wl->mutex and TX must be stopped */
961
void wl12xx_tx_reset_wlvif(struct wl1271 *wl, struct wl12xx_vif *wlvif)
L
Luciano Coelho 已提交
962 963 964 965
{
	int i;

	/* TX failure */
966 967
	for_each_set_bit(i, wlvif->links_map, WL12XX_MAX_LINKS) {
		if (wlvif->bss_type == BSS_TYPE_AP_BSS)
968
			wl1271_free_sta(wl, wlvif, i);
969 970
		else
			wlvif->sta.ba_rx_bitmap = 0;
971

972 973 974
		wl1271_tx_reset_link_queues(wl, i);
		wl->links[i].allocated_pkts = 0;
		wl->links[i].prev_freed_pkts = 0;
L
Luciano Coelho 已提交
975
	}
976 977 978 979 980 981 982 983 984
	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;
985

986 987 988
	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] = 0;

989
	wl->stopped_queues_map = 0;
L
Luciano Coelho 已提交
990

991 992 993
	/*
	 * Make sure the driver is at a consistent state, in case this
	 * function is called from a context other than interface removal.
994
	 * This call will always wake the TX queues.
995
	 */
996 997
	if (reset_tx_queues)
		wl1271_handle_tx_low_watermark(wl);
998

999 1000 1001 1002 1003 1004 1005 1006
	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);

1007
		if (!wl12xx_is_dummy_packet(wl, skb)) {
1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021
			/*
			 * 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);
			}
1022

1023 1024
			info->status.rates[0].idx = -1;
			info->status.rates[0].count = 0;
1025

1026
			ieee80211_tx_status_ni(wl->hw, skb);
1027
		}
1028
	}
1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040
}

#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);
1041
		wl1271_debug(DEBUG_TX, "flushing tx buffer: %d %d",
1042 1043 1044 1045
			     wl->tx_frames_cnt,
			     wl1271_tx_total_queue_count(wl));
		if ((wl->tx_frames_cnt == 0) &&
		    (wl1271_tx_total_queue_count(wl) == 0)) {
1046 1047 1048 1049 1050 1051 1052 1053
			mutex_unlock(&wl->mutex);
			return;
		}
		mutex_unlock(&wl->mutex);
		msleep(1);
	}

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

1056
u32 wl1271_tx_min_rate_get(struct wl1271 *wl, u32 rate_set)
A
Arik Nemtsov 已提交
1057
{
1058 1059
	if (WARN_ON(!rate_set))
		return 0;
A
Arik Nemtsov 已提交
1060

1061
	return BIT(__ffs(rate_set));
A
Arik Nemtsov 已提交
1062
}