tx.c 27.2 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

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

36 37 38 39 40 41
/*
 * TODO: this is here just for now, it must be removed when the data
 * operations are in place.
 */
#include "../wl12xx/reg.h"

E
Eliad Peller 已提交
42 43
static int wl1271_set_default_wep_key(struct wl1271 *wl,
				      struct wl12xx_vif *wlvif, u8 id)
44 45
{
	int ret;
E
Eliad Peller 已提交
46
	bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
47 48

	if (is_ap)
E
Eliad Peller 已提交
49
		ret = wl12xx_cmd_set_default_wep_key(wl, id,
50
						     wlvif->ap.bcast_hlid);
51
	else
E
Eliad Peller 已提交
52
		ret = wl12xx_cmd_set_default_wep_key(wl, id, wlvif->sta.hlid);
53 54 55 56 57 58 59 60

	if (ret < 0)
		return ret;

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

61
static int wl1271_alloc_tx_id(struct wl1271 *wl, struct sk_buff *skb)
L
Luciano Coelho 已提交
62
{
63 64
	int id;

65 66
	id = find_first_zero_bit(wl->tx_frames_map, wl->num_tx_desc);
	if (id >= wl->num_tx_desc)
67 68 69 70 71 72 73
		return -EBUSY;

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

75 76 77
static void wl1271_free_tx_id(struct wl1271 *wl, int id)
{
	if (__test_and_clear_bit(id, wl->tx_frames_map)) {
78
		if (unlikely(wl->tx_frames_cnt == wl->num_tx_desc))
79 80
			clear_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);

81 82 83
		wl->tx_frames[id] = NULL;
		wl->tx_frames_cnt--;
	}
L
Luciano Coelho 已提交
84 85
}

86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
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);
}

102 103 104
static void wl1271_tx_regulate_link(struct wl1271 *wl,
				    struct wl12xx_vif *wlvif,
				    u8 hlid)
105
{
106
	bool fw_ps, single_sta;
107
	u8 tx_pkts;
108

109
	if (WARN_ON(!test_bit(hlid, wlvif->links_map)))
110 111 112
		return;

	fw_ps = test_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map);
113
	tx_pkts = wl->links[hlid].allocated_pkts;
114
	single_sta = (wl->active_sta_count == 1);
115 116 117 118

	/*
	 * 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.
119 120
	 * Make an exception if this is the only connected station. In this
	 * case FW-memory congestion is not a problem.
121
	 */
122
	if (!single_sta && fw_ps && tx_pkts >= WL1271_PS_STA_MAX_PACKETS)
123
		wl12xx_ps_link_start(wl, wlvif, hlid, true);
124 125
}

126
bool wl12xx_is_dummy_packet(struct wl1271 *wl, struct sk_buff *skb)
E
Eliad Peller 已提交
127 128 129 130
{
	return wl->dummy_packet == skb;
}

131 132
u8 wl12xx_tx_get_hlid_ap(struct wl1271 *wl, struct wl12xx_vif *wlvif,
			 struct sk_buff *skb)
133 134 135 136 137 138 139 140 141 142 143 144
{
	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;

145
		if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags))
E
Eliad Peller 已提交
146 147
			return wl->system_hlid;

148 149
		hdr = (struct ieee80211_hdr *)skb->data;
		if (ieee80211_is_mgmt(hdr->frame_control))
150
			return wlvif->ap.global_hlid;
151
		else
152
			return wlvif->ap.bcast_hlid;
153 154 155
	}
}

156 157
u8 wl12xx_tx_get_hlid(struct wl1271 *wl, struct wl12xx_vif *wlvif,
		      struct sk_buff *skb)
E
Eliad Peller 已提交
158
{
159 160
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;

E
Eliad Peller 已提交
161
	if (!wlvif || wl12xx_is_dummy_packet(wl, skb))
E
Eliad Peller 已提交
162 163
		return wl->system_hlid;

E
Eliad Peller 已提交
164
	if (wlvif->bss_type == BSS_TYPE_AP_BSS)
165
		return wl12xx_tx_get_hlid_ap(wl, wlvif, skb);
E
Eliad Peller 已提交
166

167
	if ((test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) ||
168
	     test_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags)) &&
169 170
	    !ieee80211_is_auth(hdr->frame_control) &&
	    !ieee80211_is_assoc_req(hdr->frame_control))
E
Eliad Peller 已提交
171
		return wlvif->sta.hlid;
E
Eliad Peller 已提交
172
	else
E
Eliad Peller 已提交
173
		return wlvif->dev_hlid;
E
Eliad Peller 已提交
174 175
}

176 177
unsigned int wlcore_calc_packet_alignment(struct wl1271 *wl,
					  unsigned int packet_length)
178
{
179
	if (wl->quirks & WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN)
180
		return ALIGN(packet_length, WL12XX_BUS_BLOCK_SIZE);
181 182
	else
		return ALIGN(packet_length, WL1271_TX_ALIGN_TO);
183
}
184
EXPORT_SYMBOL(wlcore_calc_packet_alignment);
185

186
static int wl1271_tx_allocate(struct wl1271 *wl, struct wl12xx_vif *wlvif,
E
Eliad Peller 已提交
187 188
			      struct sk_buff *skb, u32 extra, u32 buf_offset,
			      u8 hlid)
L
Luciano Coelho 已提交
189 190 191
{
	struct wl1271_tx_hw_descr *desc;
	u32 total_len = skb->len + sizeof(struct wl1271_tx_hw_descr) + extra;
192
	u32 total_blocks;
193
	int id, ret = -EBUSY, ac;
194
	u32 spare_blocks = wl->normal_tx_spare;
195
	bool is_dummy = false;
L
Luciano Coelho 已提交
196

197
	if (buf_offset + total_len > WL1271_AGGR_BUFFER_SIZE)
I
Ido Yariv 已提交
198
		return -EAGAIN;
199

L
Luciano Coelho 已提交
200
	/* allocate free identifier for the packet */
201
	id = wl1271_alloc_tx_id(wl, skb);
L
Luciano Coelho 已提交
202 203 204
	if (id < 0)
		return id;

205
	if (unlikely(wl12xx_is_dummy_packet(wl, skb)))
206
		is_dummy = true;
207 208
	else if (wlvif->is_gem)
		spare_blocks = wl->gem_tx_spare;
209

210
	total_blocks = wlcore_hw_calc_tx_blocks(wl, total_len, spare_blocks);
211

L
Luciano Coelho 已提交
212 213 214 215
	if (total_blocks <= wl->tx_blocks_available) {
		desc = (struct wl1271_tx_hw_descr *)skb_push(
			skb, total_len - skb->len);

216 217
		wlcore_hw_set_tx_desc_blocks(wl, desc, total_blocks,
					     spare_blocks);
218

L
Luciano Coelho 已提交
219 220 221
		desc->id = id;

		wl->tx_blocks_available -= total_blocks;
222
		wl->tx_allocated_blocks += total_blocks;
L
Luciano Coelho 已提交
223

A
Arik Nemtsov 已提交
224 225 226 227
		/* If the FW was empty before, arm the Tx watchdog */
		if (wl->tx_allocated_blocks == total_blocks)
			wl12xx_rearm_tx_watchdog_locked(wl);

228 229
		ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
		wl->tx_allocated_pkts[ac]++;
230

E
Eliad Peller 已提交
231 232
		if (!is_dummy && wlvif &&
		    wlvif->bss_type == BSS_TYPE_AP_BSS &&
233
		    test_bit(hlid, wlvif->ap.sta_hlid_map))
234
			wl->links[hlid].allocated_pkts++;
235

L
Luciano Coelho 已提交
236 237 238 239 240
		ret = 0;

		wl1271_debug(DEBUG_TX,
			     "tx_allocate: size: %d, blocks: %d, id: %d",
			     total_len, total_blocks, id);
241
	} else {
242
		wl1271_free_tx_id(wl, id);
243
	}
L
Luciano Coelho 已提交
244 245 246 247

	return ret;
}

248
static void wl1271_tx_fill_hdr(struct wl1271 *wl, struct wl12xx_vif *wlvif,
E
Eliad Peller 已提交
249 250
			       struct sk_buff *skb, u32 extra,
			       struct ieee80211_tx_info *control, u8 hlid)
L
Luciano Coelho 已提交
251
{
252
	struct timespec ts;
L
Luciano Coelho 已提交
253
	struct wl1271_tx_hw_descr *desc;
254
	int ac, rate_idx;
255
	s64 hosttime;
256
	u16 tx_attr = 0;
257 258 259
	__le16 frame_control;
	struct ieee80211_hdr *hdr;
	u8 *frame_start;
260
	bool is_dummy;
L
Luciano Coelho 已提交
261 262

	desc = (struct wl1271_tx_hw_descr *) skb->data;
263 264 265
	frame_start = (u8 *)(desc + 1);
	hdr = (struct ieee80211_hdr *)(frame_start + extra);
	frame_control = hdr->frame_control;
L
Luciano Coelho 已提交
266

267 268
	/* relocate space for security header */
	if (extra) {
269 270
		int hdrlen = ieee80211_hdrlen(frame_control);
		memmove(frame_start, hdr, hdrlen);
271 272
	}

L
Luciano Coelho 已提交
273
	/* configure packet life time */
274 275 276
	getnstimeofday(&ts);
	hosttime = (timespec_to_ns(&ts) >> 10);
	desc->start_time = cpu_to_le32(hosttime - wl->time_offset);
277

278
	is_dummy = wl12xx_is_dummy_packet(wl, skb);
E
Eliad Peller 已提交
279
	if (is_dummy || !wlvif || wlvif->bss_type != BSS_TYPE_AP_BSS)
280 281 282
		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 已提交
283

284
	/* queue */
K
Kalle Valo 已提交
285
	ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
286
	desc->tid = skb->priority;
287

288
	if (is_dummy) {
289 290 291 292
		/*
		 * FW expects the dummy packet to have an invalid session id -
		 * any session id that is different than the one set in the join
		 */
293
		tx_attr = (SESSION_COUNTER_INVALID <<
294 295 296 297
			   TX_HW_ATTR_OFST_SESSION_COUNTER) &
			   TX_HW_ATTR_SESSION_COUNTER;

		tx_attr |= TX_HW_ATTR_TX_DUMMY_REQ;
E
Eliad Peller 已提交
298
	} else if (wlvif) {
299
		/* configure the tx attributes */
300 301
		tx_attr = wlvif->session_counter <<
			  TX_HW_ATTR_OFST_SESSION_COUNTER;
302 303
	}

E
Eliad Peller 已提交
304
	desc->hlid = hlid;
E
Eliad Peller 已提交
305
	if (is_dummy || !wlvif)
306 307
		rate_idx = 0;
	else if (wlvif->bss_type != BSS_TYPE_AP_BSS) {
308 309 310
		/* if the packets are destined for AP (have a STA entry)
		   send them with AP rate policies, otherwise use default
		   basic rates */
311 312 313
		if (control->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
			rate_idx = wlvif->sta.p2p_rate_idx;
		else if (control->control.sta)
E
Eliad Peller 已提交
314
			rate_idx = wlvif->sta.ap_rate_idx;
315
		else
E
Eliad Peller 已提交
316
			rate_idx = wlvif->sta.basic_rate_idx;
317
	} else {
318
		if (hlid == wlvif->ap.global_hlid)
E
Eliad Peller 已提交
319
			rate_idx = wlvif->ap.mgmt_rate_idx;
320
		else if (hlid == wlvif->ap.bcast_hlid)
E
Eliad Peller 已提交
321
			rate_idx = wlvif->ap.bcast_rate_idx;
322
		else
E
Eliad Peller 已提交
323
			rate_idx = wlvif->ap.ucast_rate_idx[ac];
324 325 326
	}

	tx_attr |= rate_idx << TX_HW_ATTR_OFST_RATE_POLICY;
L
Luciano Coelho 已提交
327

328 329 330 331 332
	/* for WEP shared auth - no fw encryption is needed */
	if (ieee80211_is_auth(frame_control) &&
	    ieee80211_has_protected(frame_control))
		tx_attr |= TX_HW_ATTR_HOST_ENCRYPT;

333
	desc->reserved = 0;
L
Luciano Coelho 已提交
334
	desc->tx_attr = cpu_to_le16(tx_attr);
335 336

	wlcore_hw_set_tx_desc_data_len(wl, desc, skb);
L
Luciano Coelho 已提交
337 338 339
}

/* caller must hold wl->mutex */
340 341
static int wl1271_prepare_tx_frame(struct wl1271 *wl, struct wl12xx_vif *wlvif,
				   struct sk_buff *skb, u32 buf_offset)
L
Luciano Coelho 已提交
342 343 344 345
{
	struct ieee80211_tx_info *info;
	u32 extra = 0;
	int ret = 0;
346
	u32 total_len;
347
	u8 hlid;
E
Eliad Peller 已提交
348
	bool is_dummy;
L
Luciano Coelho 已提交
349 350 351 352 353 354

	if (!skb)
		return -EINVAL;

	info = IEEE80211_SKB_CB(skb);

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

L
Luciano Coelho 已提交
358
	if (info->control.hw_key &&
359
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP)
360
		extra = WL1271_EXTRA_SPACE_TKIP;
L
Luciano Coelho 已提交
361 362

	if (info->control.hw_key) {
363 364 365 366 367 368
		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 已提交
369

E
Eliad Peller 已提交
370
		if (unlikely(is_wep && wlvif->default_key != idx)) {
E
Eliad Peller 已提交
371
			ret = wl1271_set_default_wep_key(wl, wlvif, idx);
L
Luciano Coelho 已提交
372 373
			if (ret < 0)
				return ret;
E
Eliad Peller 已提交
374
			wlvif->default_key = idx;
L
Luciano Coelho 已提交
375 376
		}
	}
377
	hlid = wl12xx_tx_get_hlid(wl, wlvif, skb);
E
Eliad Peller 已提交
378
	if (hlid == WL12XX_INVALID_LINK_ID) {
379
		wl1271_error("invalid hlid. dropping skb 0x%p", skb);
E
Eliad Peller 已提交
380 381
		return -EINVAL;
	}
382

383
	ret = wl1271_tx_allocate(wl, wlvif, skb, extra, buf_offset, hlid);
L
Luciano Coelho 已提交
384 385 386
	if (ret < 0)
		return ret;

387
	wl1271_tx_fill_hdr(wl, wlvif, skb, extra, info, hlid);
388

E
Eliad Peller 已提交
389
	if (!is_dummy && wlvif && wlvif->bss_type == BSS_TYPE_AP_BSS) {
390
		wl1271_tx_ap_update_inconnection_sta(wl, skb);
391
		wl1271_tx_regulate_link(wl, wlvif, hlid);
392
	}
393

394
	/*
395 396 397 398 399 400
	 * 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).
401
	 */
402
	total_len = wlcore_calc_packet_alignment(wl, skb->len);
403

404 405
	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 已提交
406

407
	/* Revert side effects in the dummy packet skb, so it can be reused */
E
Eliad Peller 已提交
408
	if (is_dummy)
409 410
		skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

411
	return total_len;
L
Luciano Coelho 已提交
412 413
}

414 415
u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set,
				enum ieee80211_band rate_band)
416 417 418 419 420
{
	struct ieee80211_supported_band *band;
	u32 enabled_rates = 0;
	int bit;

421
	band = wl->hw->wiphy->bands[rate_band];
422 423 424 425 426 427
	for (bit = 0; bit < band->n_bitrates; bit++) {
		if (rate_set & 0x1)
			enabled_rates |= band->bitrates[bit].hw_value;
		rate_set >>= 1;
	}

428 429 430 431 432 433 434 435 436
	/* 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;
	}

437 438 439
	return enabled_rates;
}

440
void wl1271_handle_tx_low_watermark(struct wl1271 *wl)
441 442
{
	unsigned long flags;
443
	int i;
444

445 446
	for (i = 0; i < NUM_TX_QUEUES; i++) {
		if (test_bit(i, &wl->stopped_queues_map) &&
447
		    wl->tx_queue_count[i] <= WL1271_TX_QUEUE_LOW_WATERMARK) {
448 449 450 451 452 453 454
			/* 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);
		}
455 456 457
	}
}

458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485
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];
}

486 487
static struct sk_buff *wl12xx_lnk_skb_dequeue(struct wl1271 *wl,
					      struct wl1271_link *lnk)
488
{
489
	struct sk_buff *skb;
490
	unsigned long flags;
491
	struct sk_buff_head *queue;
492

493
	queue = wl1271_select_queue(wl, lnk->tx_queue);
494
	if (!queue)
495
		return NULL;
496 497

	skb = skb_dequeue(queue);
498
	if (skb) {
499
		int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
500
		spin_lock_irqsave(&wl->wl_lock, flags);
501
		WARN_ON_ONCE(wl->tx_queue_count[q] <= 0);
502
		wl->tx_queue_count[q]--;
503 504 505 506 507 508
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}

	return skb;
}

509 510
static struct sk_buff *wl12xx_vif_skb_dequeue(struct wl1271 *wl,
					      struct wl12xx_vif *wlvif)
511 512 513 514 515
{
	struct sk_buff *skb = NULL;
	int i, h, start_hlid;

	/* start from the link after the last one */
516
	start_hlid = (wlvif->last_tx_hlid + 1) % WL12XX_MAX_LINKS;
517 518

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

522
		/* only consider connected stations */
523
		if (!test_bit(h, wlvif->links_map))
524 525
			continue;

526 527
		skb = wl12xx_lnk_skb_dequeue(wl, &wl->links[h]);
		if (!skb)
528 529
			continue;

530 531
		wlvif->last_tx_hlid = h;
		break;
532 533
	}

534
	if (!skb)
535
		wlvif->last_tx_hlid = 0;
536 537 538 539

	return skb;
}

540
static struct sk_buff *wl1271_skb_dequeue(struct wl1271 *wl)
541
{
542
	unsigned long flags;
543
	struct wl12xx_vif *wlvif = wl->last_wlvif;
544 545
	struct sk_buff *skb = NULL;

546
	/* continue from last wlvif (round robin) */
547 548 549 550 551 552 553 554 555 556
	if (wlvif) {
		wl12xx_for_each_wlvif_continue(wl, wlvif) {
			skb = wl12xx_vif_skb_dequeue(wl, wlvif);
			if (skb) {
				wl->last_wlvif = wlvif;
				break;
			}
		}
	}

557 558 559 560 561
	/* dequeue from the system HLID before the restarting wlvif list */
	if (!skb)
		skb = wl12xx_lnk_skb_dequeue(wl, &wl->links[wl->system_hlid]);

	/* do a new pass over the wlvif list */
562 563 564 565 566 567 568
	if (!skb) {
		wl12xx_for_each_wlvif(wl, wlvif) {
			skb = wl12xx_vif_skb_dequeue(wl, wlvif);
			if (skb) {
				wl->last_wlvif = wlvif;
				break;
			}
569 570 571 572 573 574 575

			/*
			 * No need to continue after last_wlvif. The previous
			 * pass should have found it.
			 */
			if (wlvif == wl->last_wlvif)
				break;
576
		}
577 578
	}

579 580
	if (!skb &&
	    test_and_clear_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags)) {
581 582
		int q;

583
		skb = wl->dummy_packet;
584
		q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
585
		spin_lock_irqsave(&wl->wl_lock, flags);
586
		WARN_ON_ONCE(wl->tx_queue_count[q] <= 0);
587
		wl->tx_queue_count[q]--;
588 589 590 591
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}

	return skb;
592 593
}

594
static void wl1271_skb_queue_head(struct wl1271 *wl, struct wl12xx_vif *wlvif,
E
Eliad Peller 已提交
595
				  struct sk_buff *skb)
596 597 598 599
{
	unsigned long flags;
	int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));

600 601
	if (wl12xx_is_dummy_packet(wl, skb)) {
		set_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags);
602 603
	} else {
		u8 hlid = wl12xx_tx_get_hlid(wl, wlvif, skb);
604 605 606
		skb_queue_head(&wl->links[hlid].tx_queue[q], skb);

		/* make sure we dequeue the same packet next time */
607
		wlvif->last_tx_hlid = (hlid + WL12XX_MAX_LINKS - 1) %
608
				      WL12XX_MAX_LINKS;
609 610
	}

611
	spin_lock_irqsave(&wl->wl_lock, flags);
612
	wl->tx_queue_count[q]++;
613 614 615
	spin_unlock_irqrestore(&wl->wl_lock, flags);
}

616 617 618 619 620 621 622
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 已提交
623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649
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 */
650
		if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags))
E
Eliad Peller 已提交
651 652 653 654 655 656 657 658
			ieee80211_queue_work(wl->hw,
					     &wlvif->rx_streaming_enable_work);

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

659
void wl1271_tx_work_locked(struct wl1271 *wl)
L
Luciano Coelho 已提交
660
{
661
	struct wl12xx_vif *wlvif;
L
Luciano Coelho 已提交
662
	struct sk_buff *skb;
E
Eliad Peller 已提交
663
	struct wl1271_tx_hw_descr *desc;
I
Ido Yariv 已提交
664 665
	u32 buf_offset = 0;
	bool sent_packets = false;
E
Eliad Peller 已提交
666
	unsigned long active_hlids[BITS_TO_LONGS(WL12XX_MAX_LINKS)] = {0};
L
Luciano Coelho 已提交
667 668 669
	int ret;

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

672
	while ((skb = wl1271_skb_dequeue(wl))) {
E
Eliad Peller 已提交
673
		struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
E
Eliad Peller 已提交
674 675
		bool has_data = false;

676
		wlvif = NULL;
E
Eliad Peller 已提交
677 678
		if (!wl12xx_is_dummy_packet(wl, skb) && info->control.vif)
			wlvif = wl12xx_vif_to_data(info->control.vif);
679

E
Eliad Peller 已提交
680
		has_data = wlvif && wl1271_tx_is_data_present(skb);
681
		ret = wl1271_prepare_tx_frame(wl, wlvif, skb, buf_offset);
I
Ido Yariv 已提交
682
		if (ret == -EAGAIN) {
683
			/*
I
Ido Yariv 已提交
684 685 686
			 * Aggregation buffer is full.
			 * Flush buffer and try again.
			 */
687
			wl1271_skb_queue_head(wl, wlvif, skb);
688 689
			wlcore_write_data(wl, REG_SLV_MEM_DATA, wl->aggr_buf,
					  buf_offset, true);
I
Ido Yariv 已提交
690 691 692 693 694 695
			sent_packets = true;
			buf_offset = 0;
			continue;
		} else if (ret == -EBUSY) {
			/*
			 * Firmware buffer is full.
696 697
			 * Queue back last skb, and stop aggregating.
			 */
698
			wl1271_skb_queue_head(wl, wlvif, skb);
I
Ido Yariv 已提交
699 700
			/* No work left, avoid scheduling redundant tx work */
			set_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
701
			goto out_ack;
L
Luciano Coelho 已提交
702
		} else if (ret < 0) {
E
Eliad Peller 已提交
703 704 705 706 707 708 709 710
			if (wl12xx_is_dummy_packet(wl, skb))
				/*
				 * fw still expects dummy packet,
				 * so re-enqueue it
				 */
				wl1271_skb_queue_head(wl, wlvif, skb);
			else
				ieee80211_free_txskb(wl->hw, skb);
711
			goto out_ack;
L
Luciano Coelho 已提交
712
		}
713 714
		buf_offset += ret;
		wl->tx_packets_count++;
E
Eliad Peller 已提交
715 716 717 718
		if (has_data) {
			desc = (struct wl1271_tx_hw_descr *) skb->data;
			__set_bit(desc->hlid, active_hlids);
		}
L
Luciano Coelho 已提交
719 720
	}

721
out_ack:
722
	if (buf_offset) {
723 724
		wlcore_write_data(wl, REG_SLV_MEM_DATA, wl->aggr_buf,
				  buf_offset, true);
I
Ido Yariv 已提交
725 726 727
		sent_packets = true;
	}
	if (sent_packets) {
728 729 730 731
		/*
		 * Interrupt the firmware with the new packets. This is only
		 * required for older hardware revisions
		 */
732
		if (wl->quirks & WLCORE_QUIRK_END_OF_TRANSACTION)
733
			wl1271_write32(wl, WL12XX_HOST_WR_ACCESS,
734 735
				       wl->tx_packets_count);

736
		wl1271_handle_tx_low_watermark(wl);
737
	}
E
Eliad Peller 已提交
738
	wl12xx_rearm_rx_streaming(wl, active_hlids);
I
Ido Yariv 已提交
739
}
L
Luciano Coelho 已提交
740

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

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

751
	wl1271_tx_work_locked(wl);
752

753
	wl1271_ps_elp_sleep(wl);
754
out:
L
Luciano Coelho 已提交
755 756 757
	mutex_unlock(&wl->mutex);
}

758 759
static u8 wl1271_tx_get_rate_flags(u8 rate_class_index)
{
760 761
	u8 flags = 0;

762 763 764 765 766
	/*
	 * TODO: use wl12xx constants when this code is moved to wl12xx, as
	 * only it uses Tx-completion.
	 */
	if (rate_class_index <= 8)
767
		flags |= IEEE80211_TX_RC_MCS;
768 769 770 771 772 773

	/*
	 * TODO: use wl12xx constants when this code is moved to wl12xx, as
	 * only it uses Tx-completion.
	 */
	if (rate_class_index == 0)
774
		flags |= IEEE80211_TX_RC_SHORT_GI;
775

776
	return flags;
777 778
}

L
Luciano Coelho 已提交
779 780 781 782
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
	int rate = -1;
788
	u8 rate_flags = 0;
J
Juuso Oikarinen 已提交
789
	u8 retries = 0;
L
Luciano Coelho 已提交
790 791

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

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

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

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

J
Juuso Oikarinen 已提交
822 823
	info->status.rates[0].idx = rate;
	info->status.rates[0].count = retries;
824
	info->status.rates[0].flags = rate_flags;
J
Juuso Oikarinen 已提交
825 826
	info->status.ack_signal = -1;

L
Luciano Coelho 已提交
827 828
	wl->stats.retry_count += result->ack_failures;

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

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

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

	/* remove TKIP header space if present */
L
Luciano Coelho 已提交
852
	if (info->control.hw_key &&
853
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) {
854
		int hdrlen = ieee80211_get_hdrlen_from_skb(skb);
855 856 857
		memmove(skb->data + WL1271_EXTRA_SPACE_TKIP, skb->data,
			hdrlen);
		skb_pull(skb, WL1271_EXTRA_SPACE_TKIP);
858
	}
L
Luciano Coelho 已提交
859 860 861 862 863 864 865

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

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

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

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

910 911 912
void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid)
{
	struct sk_buff *skb;
913
	int i;
914
	unsigned long flags;
915
	struct ieee80211_tx_info *info;
916
	int total[NUM_TX_QUEUES];
917 918

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

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

930
			total[i]++;
931 932 933 934
		}
	}

	spin_lock_irqsave(&wl->wl_lock, flags);
935 936
	for (i = 0; i < NUM_TX_QUEUES; i++)
		wl->tx_queue_count[i] -= total[i];
937 938 939 940 941
	spin_unlock_irqrestore(&wl->wl_lock, flags);

	wl1271_handle_tx_low_watermark(wl);
}

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

	/* TX failure */
948 949
	for_each_set_bit(i, wlvif->links_map, WL12XX_MAX_LINKS) {
		if (wlvif->bss_type == BSS_TYPE_AP_BSS)
950
			wl1271_free_sta(wl, wlvif, i);
951 952
		else
			wlvif->sta.ba_rx_bitmap = 0;
953

954 955
		wl->links[i].allocated_pkts = 0;
		wl->links[i].prev_freed_pkts = 0;
L
Luciano Coelho 已提交
956
	}
957 958 959 960 961 962 963 964 965
	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;
966

967 968 969 970 971 972 973 974
	/* only reset the queues if something bad happened */
	if (WARN_ON_ONCE(wl1271_tx_total_queue_count(wl) != 0)) {
		for (i = 0; i < WL12XX_MAX_LINKS; i++)
			wl1271_tx_reset_link_queues(wl, i);

		for (i = 0; i < NUM_TX_QUEUES; i++)
			wl->tx_queue_count[i] = 0;
	}
975

976
	wl->stopped_queues_map = 0;
L
Luciano Coelho 已提交
977

978 979 980
	/*
	 * Make sure the driver is at a consistent state, in case this
	 * function is called from a context other than interface removal.
981
	 * This call will always wake the TX queues.
982
	 */
983 984
	if (reset_tx_queues)
		wl1271_handle_tx_low_watermark(wl);
985

986
	for (i = 0; i < wl->num_tx_desc; i++) {
987 988 989 990 991 992 993
		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);

994
		if (!wl12xx_is_dummy_packet(wl, skb)) {
995 996 997 998 999 1000 1001 1002 1003 1004
			/*
			 * 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);
1005
				memmove(skb->data + WL1271_EXTRA_SPACE_TKIP,
1006
					skb->data, hdrlen);
1007
				skb_pull(skb, WL1271_EXTRA_SPACE_TKIP);
1008
			}
1009

1010 1011
			info->status.rates[0].idx = -1;
			info->status.rates[0].count = 0;
1012

1013
			ieee80211_tx_status_ni(wl->hw, skb);
1014
		}
1015
	}
1016 1017 1018 1019 1020 1021 1022 1023
}

#define WL1271_TX_FLUSH_TIMEOUT 500000

/* caller must *NOT* hold wl->mutex */
void wl1271_tx_flush(struct wl1271 *wl)
{
	unsigned long timeout;
1024
	int i;
1025 1026 1027 1028
	timeout = jiffies + usecs_to_jiffies(WL1271_TX_FLUSH_TIMEOUT);

	while (!time_after(jiffies, timeout)) {
		mutex_lock(&wl->mutex);
1029
		wl1271_debug(DEBUG_TX, "flushing tx buffer: %d %d",
1030 1031 1032 1033
			     wl->tx_frames_cnt,
			     wl1271_tx_total_queue_count(wl));
		if ((wl->tx_frames_cnt == 0) &&
		    (wl1271_tx_total_queue_count(wl) == 0)) {
1034 1035 1036 1037 1038 1039 1040 1041
			mutex_unlock(&wl->mutex);
			return;
		}
		mutex_unlock(&wl->mutex);
		msleep(1);
	}

	wl1271_warning("Unable to flush all TX buffers, timed out.");
1042 1043 1044 1045 1046 1047

	/* forcibly flush all Tx buffers on our queues */
	mutex_lock(&wl->mutex);
	for (i = 0; i < WL12XX_MAX_LINKS; i++)
		wl1271_tx_reset_link_queues(wl, i);
	mutex_unlock(&wl->mutex);
L
Luciano Coelho 已提交
1048
}
A
Arik Nemtsov 已提交
1049

1050
u32 wl1271_tx_min_rate_get(struct wl1271 *wl, u32 rate_set)
A
Arik Nemtsov 已提交
1051
{
1052 1053
	if (WARN_ON(!rate_set))
		return 0;
A
Arik Nemtsov 已提交
1054

1055
	return BIT(__ffs(rate_set));
A
Arik Nemtsov 已提交
1056
}