tx.c 28.0 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_NO_BLOCKSIZE_ALIGNMENT)
180
		return ALIGN(packet_length, WL1271_TX_ALIGN_TO);
181 182
	else
		return ALIGN(packet_length, WL12XX_BUS_BLOCK_SIZE);
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 aligned_len, 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
	desc->reserved = 0;

329
	aligned_len = wlcore_calc_packet_alignment(wl, skb->len);
330

331
	if (wl->chip.id == CHIP_ID_1283_PG20) {
332 333
		desc->wl128x_mem.extra_bytes = aligned_len - skb->len;
		desc->length = cpu_to_le16(aligned_len >> 2);
334 335 336 337 338 339 340

		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);
341 342 343
	} else {
		int pad;

344
		/* Store the aligned length in terms of words */
345 346 347 348 349
		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 已提交
350

351 352 353 354 355 356
		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);
357
	}
L
Luciano Coelho 已提交
358

359 360 361 362 363
	/* 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;

L
Luciano Coelho 已提交
364
	desc->tx_attr = cpu_to_le16(tx_attr);
L
Luciano Coelho 已提交
365 366 367
}

/* caller must hold wl->mutex */
368 369
static int wl1271_prepare_tx_frame(struct wl1271 *wl, struct wl12xx_vif *wlvif,
				   struct sk_buff *skb, u32 buf_offset)
L
Luciano Coelho 已提交
370 371 372 373
{
	struct ieee80211_tx_info *info;
	u32 extra = 0;
	int ret = 0;
374
	u32 total_len;
375
	u8 hlid;
E
Eliad Peller 已提交
376
	bool is_dummy;
L
Luciano Coelho 已提交
377 378 379 380 381 382

	if (!skb)
		return -EINVAL;

	info = IEEE80211_SKB_CB(skb);

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

L
Luciano Coelho 已提交
386
	if (info->control.hw_key &&
387
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP)
388
		extra = WL1271_EXTRA_SPACE_TKIP;
L
Luciano Coelho 已提交
389 390

	if (info->control.hw_key) {
391 392 393 394 395 396
		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 已提交
397

E
Eliad Peller 已提交
398
		if (unlikely(is_wep && wlvif->default_key != idx)) {
E
Eliad Peller 已提交
399
			ret = wl1271_set_default_wep_key(wl, wlvif, idx);
L
Luciano Coelho 已提交
400 401
			if (ret < 0)
				return ret;
E
Eliad Peller 已提交
402
			wlvif->default_key = idx;
L
Luciano Coelho 已提交
403 404
		}
	}
405
	hlid = wl12xx_tx_get_hlid(wl, wlvif, skb);
E
Eliad Peller 已提交
406
	if (hlid == WL12XX_INVALID_LINK_ID) {
407
		wl1271_error("invalid hlid. dropping skb 0x%p", skb);
E
Eliad Peller 已提交
408 409
		return -EINVAL;
	}
410

411
	ret = wl1271_tx_allocate(wl, wlvif, skb, extra, buf_offset, hlid);
L
Luciano Coelho 已提交
412 413 414
	if (ret < 0)
		return ret;

415
	wl1271_tx_fill_hdr(wl, wlvif, skb, extra, info, hlid);
416

E
Eliad Peller 已提交
417
	if (!is_dummy && wlvif && wlvif->bss_type == BSS_TYPE_AP_BSS) {
418
		wl1271_tx_ap_update_inconnection_sta(wl, skb);
419
		wl1271_tx_regulate_link(wl, wlvif, hlid);
420
	}
421

422
	/*
423 424 425 426 427 428
	 * 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).
429
	 */
430
	total_len = wlcore_calc_packet_alignment(wl, skb->len);
431

432 433
	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 已提交
434

435
	/* Revert side effects in the dummy packet skb, so it can be reused */
E
Eliad Peller 已提交
436
	if (is_dummy)
437 438
		skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));

439
	return total_len;
L
Luciano Coelho 已提交
440 441
}

442 443
u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set,
				enum ieee80211_band rate_band)
444 445 446 447 448
{
	struct ieee80211_supported_band *band;
	u32 enabled_rates = 0;
	int bit;

449
	band = wl->hw->wiphy->bands[rate_band];
450 451 452 453 454 455
	for (bit = 0; bit < band->n_bitrates; bit++) {
		if (rate_set & 0x1)
			enabled_rates |= band->bitrates[bit].hw_value;
		rate_set >>= 1;
	}

456 457 458 459 460 461 462 463 464
	/* 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;
	}

465 466 467
	return enabled_rates;
}

468
void wl1271_handle_tx_low_watermark(struct wl1271 *wl)
469 470
{
	unsigned long flags;
471
	int i;
472

473 474
	for (i = 0; i < NUM_TX_QUEUES; i++) {
		if (test_bit(i, &wl->stopped_queues_map) &&
475
		    wl->tx_queue_count[i] <= WL1271_TX_QUEUE_LOW_WATERMARK) {
476 477 478 479 480 481 482
			/* 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);
		}
483 484 485
	}
}

486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513
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];
}

514 515
static struct sk_buff *wl12xx_lnk_skb_dequeue(struct wl1271 *wl,
					      struct wl1271_link *lnk)
516
{
517
	struct sk_buff *skb;
518
	unsigned long flags;
519
	struct sk_buff_head *queue;
520

521
	queue = wl1271_select_queue(wl, lnk->tx_queue);
522
	if (!queue)
523
		return NULL;
524 525

	skb = skb_dequeue(queue);
526
	if (skb) {
527
		int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
528
		spin_lock_irqsave(&wl->wl_lock, flags);
529
		WARN_ON_ONCE(wl->tx_queue_count[q] <= 0);
530
		wl->tx_queue_count[q]--;
531 532 533 534 535 536
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}

	return skb;
}

537 538
static struct sk_buff *wl12xx_vif_skb_dequeue(struct wl1271 *wl,
					      struct wl12xx_vif *wlvif)
539 540 541 542 543
{
	struct sk_buff *skb = NULL;
	int i, h, start_hlid;

	/* start from the link after the last one */
544
	start_hlid = (wlvif->last_tx_hlid + 1) % WL12XX_MAX_LINKS;
545 546

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

550
		/* only consider connected stations */
551
		if (!test_bit(h, wlvif->links_map))
552 553
			continue;

554 555
		skb = wl12xx_lnk_skb_dequeue(wl, &wl->links[h]);
		if (!skb)
556 557
			continue;

558 559
		wlvif->last_tx_hlid = h;
		break;
560 561
	}

562
	if (!skb)
563
		wlvif->last_tx_hlid = 0;
564 565 566 567

	return skb;
}

568
static struct sk_buff *wl1271_skb_dequeue(struct wl1271 *wl)
569
{
570
	unsigned long flags;
571
	struct wl12xx_vif *wlvif = wl->last_wlvif;
572 573
	struct sk_buff *skb = NULL;

574
	/* continue from last wlvif (round robin) */
575 576 577 578 579 580 581 582 583 584
	if (wlvif) {
		wl12xx_for_each_wlvif_continue(wl, wlvif) {
			skb = wl12xx_vif_skb_dequeue(wl, wlvif);
			if (skb) {
				wl->last_wlvif = wlvif;
				break;
			}
		}
	}

585 586 587 588 589
	/* 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 */
590 591 592 593 594 595 596
	if (!skb) {
		wl12xx_for_each_wlvif(wl, wlvif) {
			skb = wl12xx_vif_skb_dequeue(wl, wlvif);
			if (skb) {
				wl->last_wlvif = wlvif;
				break;
			}
597 598 599 600 601 602 603

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

607 608
	if (!skb &&
	    test_and_clear_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags)) {
609 610
		int q;

611
		skb = wl->dummy_packet;
612
		q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
613
		spin_lock_irqsave(&wl->wl_lock, flags);
614
		WARN_ON_ONCE(wl->tx_queue_count[q] <= 0);
615
		wl->tx_queue_count[q]--;
616 617 618 619
		spin_unlock_irqrestore(&wl->wl_lock, flags);
	}

	return skb;
620 621
}

622
static void wl1271_skb_queue_head(struct wl1271 *wl, struct wl12xx_vif *wlvif,
E
Eliad Peller 已提交
623
				  struct sk_buff *skb)
624 625 626 627
{
	unsigned long flags;
	int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));

628 629
	if (wl12xx_is_dummy_packet(wl, skb)) {
		set_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags);
630 631
	} else {
		u8 hlid = wl12xx_tx_get_hlid(wl, wlvif, skb);
632 633 634
		skb_queue_head(&wl->links[hlid].tx_queue[q], skb);

		/* make sure we dequeue the same packet next time */
635
		wlvif->last_tx_hlid = (hlid + WL12XX_MAX_LINKS - 1) %
636
				      WL12XX_MAX_LINKS;
637 638
	}

639
	spin_lock_irqsave(&wl->wl_lock, flags);
640
	wl->tx_queue_count[q]++;
641 642 643
	spin_unlock_irqrestore(&wl->wl_lock, flags);
}

644 645 646 647 648 649 650
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 已提交
651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677
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 */
678
		if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags))
E
Eliad Peller 已提交
679 680 681 682 683 684 685 686
			ieee80211_queue_work(wl->hw,
					     &wlvif->rx_streaming_enable_work);

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

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

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

700
	while ((skb = wl1271_skb_dequeue(wl))) {
E
Eliad Peller 已提交
701
		struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
E
Eliad Peller 已提交
702 703
		bool has_data = false;

704
		wlvif = NULL;
E
Eliad Peller 已提交
705 706
		if (!wl12xx_is_dummy_packet(wl, skb) && info->control.vif)
			wlvif = wl12xx_vif_to_data(info->control.vif);
707

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

749
out_ack:
750
	if (buf_offset) {
751 752
		wlcore_write_data(wl, REG_SLV_MEM_DATA, wl->aggr_buf,
				  buf_offset, true);
I
Ido Yariv 已提交
753 754 755
		sent_packets = true;
	}
	if (sent_packets) {
756 757 758 759
		/*
		 * Interrupt the firmware with the new packets. This is only
		 * required for older hardware revisions
		 */
760
		if (wl->quirks & WLCORE_QUIRK_END_OF_TRANSACTION)
761
			wl1271_write32(wl, WL12XX_HOST_WR_ACCESS,
762 763
				       wl->tx_packets_count);

764
		wl1271_handle_tx_low_watermark(wl);
765
	}
E
Eliad Peller 已提交
766
	wl12xx_rearm_rx_streaming(wl, active_hlids);
I
Ido Yariv 已提交
767
}
L
Luciano Coelho 已提交
768

I
Ido Yariv 已提交
769 770 771
void wl1271_tx_work(struct work_struct *work)
{
	struct wl1271 *wl = container_of(work, struct wl1271, tx_work);
772
	int ret;
I
Ido Yariv 已提交
773 774

	mutex_lock(&wl->mutex);
775 776 777 778
	ret = wl1271_ps_elp_wakeup(wl);
	if (ret < 0)
		goto out;

779
	wl1271_tx_work_locked(wl);
780

781
	wl1271_ps_elp_sleep(wl);
782
out:
L
Luciano Coelho 已提交
783 784 785
	mutex_unlock(&wl->mutex);
}

786 787
static u8 wl1271_tx_get_rate_flags(u8 rate_class_index)
{
788 789
	u8 flags = 0;

790 791
	if (rate_class_index >= CONF_HW_RXTX_RATE_MCS_MIN &&
	    rate_class_index <= CONF_HW_RXTX_RATE_MCS_MAX)
792 793 794 795
		flags |= IEEE80211_TX_RC_MCS;
	if (rate_class_index == CONF_HW_RXTX_RATE_MCS7_SGI)
		flags |= IEEE80211_TX_RC_SHORT_GI;
	return flags;
796 797
}

L
Luciano Coelho 已提交
798 799 800 801
static void wl1271_tx_complete_packet(struct wl1271 *wl,
				      struct wl1271_tx_hw_res_descr *result)
{
	struct ieee80211_tx_info *info;
802 803
	struct ieee80211_vif *vif;
	struct wl12xx_vif *wlvif;
L
Luciano Coelho 已提交
804 805
	struct sk_buff *skb;
	int id = result->id;
J
Juuso Oikarinen 已提交
806
	int rate = -1;
807
	u8 rate_flags = 0;
J
Juuso Oikarinen 已提交
808
	u8 retries = 0;
L
Luciano Coelho 已提交
809 810

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

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

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

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

J
Juuso Oikarinen 已提交
841 842
	info->status.rates[0].idx = rate;
	info->status.rates[0].count = retries;
843
	info->status.rates[0].flags = rate_flags;
J
Juuso Oikarinen 已提交
844 845
	info->status.ack_signal = -1;

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

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

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

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

	/* remove TKIP header space if present */
L
Luciano Coelho 已提交
871
	if (info->control.hw_key &&
872
	    info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) {
873
		int hdrlen = ieee80211_get_hdrlen_from_skb(skb);
874 875 876
		memmove(skb->data + WL1271_EXTRA_SPACE_TKIP, skb->data,
			hdrlen);
		skb_pull(skb, WL1271_EXTRA_SPACE_TKIP);
877
	}
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
		wl->links[i].allocated_pkts = 0;
		wl->links[i].prev_freed_pkts = 0;
L
Luciano Coelho 已提交
974
	}
975 976 977 978 979 980 981 982 983
	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;
984

985 986 987 988 989 990 991 992
	/* 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;
	}
993

994
	wl->stopped_queues_map = 0;
L
Luciano Coelho 已提交
995

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

1004
	for (i = 0; i < wl->num_tx_desc; i++) {
1005 1006 1007 1008 1009 1010 1011
		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);

1012
		if (!wl12xx_is_dummy_packet(wl, skb)) {
1013 1014 1015 1016 1017 1018 1019 1020 1021 1022
			/*
			 * 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);
1023
				memmove(skb->data + WL1271_EXTRA_SPACE_TKIP,
1024
					skb->data, hdrlen);
1025
				skb_pull(skb, WL1271_EXTRA_SPACE_TKIP);
1026
			}
1027

1028 1029
			info->status.rates[0].idx = -1;
			info->status.rates[0].count = 0;
1030

1031
			ieee80211_tx_status_ni(wl->hw, skb);
1032
		}
1033
	}
1034 1035 1036 1037 1038 1039 1040 1041
}

#define WL1271_TX_FLUSH_TIMEOUT 500000

/* caller must *NOT* hold wl->mutex */
void wl1271_tx_flush(struct wl1271 *wl)
{
	unsigned long timeout;
1042
	int i;
1043 1044 1045 1046
	timeout = jiffies + usecs_to_jiffies(WL1271_TX_FLUSH_TIMEOUT);

	while (!time_after(jiffies, timeout)) {
		mutex_lock(&wl->mutex);
1047
		wl1271_debug(DEBUG_TX, "flushing tx buffer: %d %d",
1048 1049 1050 1051
			     wl->tx_frames_cnt,
			     wl1271_tx_total_queue_count(wl));
		if ((wl->tx_frames_cnt == 0) &&
		    (wl1271_tx_total_queue_count(wl) == 0)) {
1052 1053 1054 1055 1056 1057 1058 1059
			mutex_unlock(&wl->mutex);
			return;
		}
		mutex_unlock(&wl->mutex);
		msleep(1);
	}

	wl1271_warning("Unable to flush all TX buffers, timed out.");
1060 1061 1062 1063 1064 1065

	/* 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 已提交
1066
}
A
Arik Nemtsov 已提交
1067

1068
u32 wl1271_tx_min_rate_get(struct wl1271 *wl, u32 rate_set)
A
Arik Nemtsov 已提交
1069
{
1070 1071
	if (WARN_ON(!rate_set))
		return 0;
A
Arik Nemtsov 已提交
1072

1073
	return BIT(__ffs(rate_set));
A
Arik Nemtsov 已提交
1074
}