1f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho/*
2f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * This file is part of wl1271
3f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho *
4f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * Copyright (C) 1998-2009 Texas Instruments. All rights reserved.
5f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * Copyright (C) 2009 Nokia Corporation
6f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho *
7f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * Contact: Luciano Coelho <luciano.coelho@nokia.com>
8f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho *
9f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * This program is free software; you can redistribute it and/or
10f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * modify it under the terms of the GNU General Public License
11f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * version 2 as published by the Free Software Foundation.
12f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho *
13f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * This program is distributed in the hope that it will be useful, but
14f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * WITHOUT ANY WARRANTY; without even the implied warranty of
15f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * General Public License for more details.
17f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho *
18f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * You should have received a copy of the GNU General Public License
19f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * along with this program; if not, write to the Free Software
20f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
21f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * 02110-1301 USA
22f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho *
23f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho */
24f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho
2500d201001bd4e8a46e3d03c970abcb72256c368bShahar Levi#ifndef __TX_H__
2600d201001bd4e8a46e3d03c970abcb72256c368bShahar Levi#define __TX_H__
27f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho
28e9eb8cbe77139470651c858b8b7a3d20d332cf47Guy Eilam#define TX_HW_BLOCK_SPARE_DEFAULT        1
295c9417f1656b0f415f4be5a7cd7195ecadd7dd1aJuuso Oikarinen#define TX_HW_BLOCK_SIZE                 252
30f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho
31f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#define TX_HW_MGMT_PKT_LIFETIME_TU       2000
32beb6c880720073c233633c45792a4bb5d5fedbd5Arik Nemtsov#define TX_HW_AP_MODE_PKT_LIFETIME_TU    8000
33f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho
34f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#define TX_HW_ATTR_SAVE_RETRIES          BIT(0)
35f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#define TX_HW_ATTR_HEADER_PAD            BIT(1)
36f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#define TX_HW_ATTR_SESSION_COUNTER       (BIT(2) | BIT(3) | BIT(4))
37f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#define TX_HW_ATTR_RATE_POLICY           (BIT(5) | BIT(6) | BIT(7) | \
38f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho					  BIT(8) | BIT(9))
39f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#define TX_HW_ATTR_LAST_WORD_PAD         (BIT(10) | BIT(11))
40f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#define TX_HW_ATTR_TX_CMPLT_REQ          BIT(12)
41ae47c45fd02fdf88d57adc370e78e7a01e2bfcbcShahar Levi#define TX_HW_ATTR_TX_DUMMY_REQ          BIT(13)
42f4f57943f265d80fe5f0fedf6964f8056e753cf3Eliad Peller#define TX_HW_ATTR_HOST_ENCRYPT          BIT(14)
43ae47c45fd02fdf88d57adc370e78e7a01e2bfcbcShahar Levi
44f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#define TX_HW_ATTR_OFST_SAVE_RETRIES     0
45f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#define TX_HW_ATTR_OFST_HEADER_PAD       1
46f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#define TX_HW_ATTR_OFST_SESSION_COUNTER  2
47f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#define TX_HW_ATTR_OFST_RATE_POLICY      5
48f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#define TX_HW_ATTR_OFST_LAST_WORD_PAD    10
49f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#define TX_HW_ATTR_OFST_TX_CMPLT_REQ     12
50f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho
51f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#define TX_HW_RESULT_QUEUE_LEN           16
52f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#define TX_HW_RESULT_QUEUE_LEN_MASK      0xf
53f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho
54f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#define WL1271_TX_ALIGN_TO 4
555ec8a448e0e978103bc5ca7136084b5e2b36989eEliad Peller#define WL1271_EXTRA_SPACE_TKIP 4
565ec8a448e0e978103bc5ca7136084b5e2b36989eEliad Peller#define WL1271_EXTRA_SPACE_AES  8
575ec8a448e0e978103bc5ca7136084b5e2b36989eEliad Peller#define WL1271_EXTRA_SPACE_MAX  8
58f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho
59ae47c45fd02fdf88d57adc370e78e7a01e2bfcbcShahar Levi/* Used for management frames and dummy packets */
60ae47c45fd02fdf88d57adc370e78e7a01e2bfcbcShahar Levi#define WL1271_TID_MGMT 7
61ae47c45fd02fdf88d57adc370e78e7a01e2bfcbcShahar Levi
6248a61477bdc04896bd96d259388a0c42a7019943Shahar Levistruct wl127x_tx_mem {
6348a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	/*
6448a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	 * Number of extra memory blocks to allocate for this packet
6548a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	 * in addition to the number of blocks derived from the packet
6648a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	 * length.
6748a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	 */
6848a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	u8 extra_blocks;
6948a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	/*
7048a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	 * Total number of memory blocks allocated by the host for
7148a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	 * this packet. Must be equal or greater than the actual
7248a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	 * blocks number allocated by HW.
7348a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	 */
7448a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	u8 total_mem_blocks;
7548a61477bdc04896bd96d259388a0c42a7019943Shahar Levi} __packed;
7648a61477bdc04896bd96d259388a0c42a7019943Shahar Levi
7748a61477bdc04896bd96d259388a0c42a7019943Shahar Levistruct wl128x_tx_mem {
7848a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	/*
7948a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	 * Total number of memory blocks allocated by the host for
8048a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	 * this packet.
8148a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	 */
8248a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	u8 total_mem_blocks;
8348a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	/*
8448a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	 * Number of extra bytes, at the end of the frame. the host
8548a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	 * uses this padding to complete each frame to integer number
8648a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	 * of SDIO blocks.
8748a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	 */
8848a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	u8 extra_bytes;
8948a61477bdc04896bd96d259388a0c42a7019943Shahar Levi} __packed;
9048a61477bdc04896bd96d259388a0c42a7019943Shahar Levi
910da13da767cd568c1fe2a7b5b936e86e521b5ae7Ido Yariv/*
920da13da767cd568c1fe2a7b5b936e86e521b5ae7Ido Yariv * On wl128x based devices, when TX packets are aggregated, each packet
930da13da767cd568c1fe2a7b5b936e86e521b5ae7Ido Yariv * size must be aligned to the SDIO block size. The maximum block size
940da13da767cd568c1fe2a7b5b936e86e521b5ae7Ido Yariv * is bounded by the type of the padded bytes field that is sent to the
950da13da767cd568c1fe2a7b5b936e86e521b5ae7Ido Yariv * FW. Currently the type is u8, so the maximum block size is 256 bytes.
960da13da767cd568c1fe2a7b5b936e86e521b5ae7Ido Yariv */
970da13da767cd568c1fe2a7b5b936e86e521b5ae7Ido Yariv#define WL12XX_BUS_BLOCK_SIZE min(512u,	\
980da13da767cd568c1fe2a7b5b936e86e521b5ae7Ido Yariv	    (1u << (8 * sizeof(((struct wl128x_tx_mem *) 0)->extra_bytes))))
990da13da767cd568c1fe2a7b5b936e86e521b5ae7Ido Yariv
100f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelhostruct wl1271_tx_hw_descr {
101f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	/* Length of packet in words, including descriptor+header+data */
102d0f63b202146f3281800ee44823740c8bbf38f11Luciano Coelho	__le16 length;
10348a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	union {
10448a61477bdc04896bd96d259388a0c42a7019943Shahar Levi		struct wl127x_tx_mem wl127x_mem;
10548a61477bdc04896bd96d259388a0c42a7019943Shahar Levi		struct wl128x_tx_mem wl128x_mem;
10648a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	} __packed;
107f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	/* Device time (in us) when the packet arrived to the driver */
108d0f63b202146f3281800ee44823740c8bbf38f11Luciano Coelho	__le32 start_time;
10948a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	/*
11048a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	 * Max delay in TUs until transmission. The last device time the
11148a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	 * packet can be transmitted is: start_time + (1024 * life_time)
11248a61477bdc04896bd96d259388a0c42a7019943Shahar Levi	 */
113d0f63b202146f3281800ee44823740c8bbf38f11Luciano Coelho	__le16 life_time;
114f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	/* Bitwise fields - see TX_ATTR... definitions above. */
115d0f63b202146f3281800ee44823740c8bbf38f11Luciano Coelho	__le16 tx_attr;
116f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	/* Packet identifier used also in the Tx-Result. */
117f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	u8 id;
118f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	/* The packet TID value (as User-Priority) */
119f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	u8 tid;
12079b122dc51797b650201f21360481a0450e9b7e4Eliad Peller	/* host link ID (HLID) */
12179b122dc51797b650201f21360481a0450e9b7e4Eliad Peller	u8 hlid;
122f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	u8 reserved;
123ba2d3587912f82d1ab4367975b1df460db60fb1eEric Dumazet} __packed;
124f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho
125f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelhoenum wl1271_tx_hw_res_status {
126f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	TX_SUCCESS          = 0,
127f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	TX_HW_ERROR         = 1,
128f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	TX_DISABLED         = 2,
129f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	TX_RETRY_EXCEEDED   = 3,
130f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	TX_TIMEOUT          = 4,
131f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	TX_KEY_NOT_FOUND    = 5,
132f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	TX_PEER_NOT_FOUND   = 6,
13379b122dc51797b650201f21360481a0450e9b7e4Eliad Peller	TX_SESSION_MISMATCH = 7,
13479b122dc51797b650201f21360481a0450e9b7e4Eliad Peller	TX_LINK_NOT_VALID   = 8,
135f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho};
136f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho
137f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelhostruct wl1271_tx_hw_res_descr {
138f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	/* Packet Identifier - same value used in the Tx descriptor.*/
139f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	u8 id;
140f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	/* The status of the transmission, indicating success or one of
141f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	   several possible reasons for failure. */
142f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	u8 status;
143f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	/* Total air access duration including all retrys and overheads.*/
144d0f63b202146f3281800ee44823740c8bbf38f11Luciano Coelho	__le16 medium_usage;
145f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	/* The time passed from host xfer to Tx-complete.*/
146d0f63b202146f3281800ee44823740c8bbf38f11Luciano Coelho	__le32 fw_handling_time;
147f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	/* Total media delay
148f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	   (from 1st EDCA AIFS counter until TX Complete). */
149d0f63b202146f3281800ee44823740c8bbf38f11Luciano Coelho	__le32 medium_delay;
150f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	/* LS-byte of last TKIP seq-num (saved per AC for recovery). */
151b992c68228a3ccdf73ea4f57519e1663839a9cbeOz Krakowski	u8 tx_security_sequence_number_lsb;
152f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	/* Retry count - number of transmissions without successful ACK.*/
153f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	u8 ack_failures;
154f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	/* The rate that succeeded getting ACK
155f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	   (Valid only if status=SUCCESS). */
156f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	u8 rate_class_index;
157f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	/* for 4-byte alignment. */
158f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	u8 spare;
159ba2d3587912f82d1ab4367975b1df460db60fb1eEric Dumazet} __packed;
160f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho
161f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelhostruct wl1271_tx_hw_res_if {
162d0f63b202146f3281800ee44823740c8bbf38f11Luciano Coelho	__le32 tx_result_fw_counter;
163d0f63b202146f3281800ee44823740c8bbf38f11Luciano Coelho	__le32 tx_result_host_counter;
164f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho	struct wl1271_tx_hw_res_descr tx_results_queue[TX_HW_RESULT_QUEUE_LEN];
165ba2d3587912f82d1ab4367975b1df460db60fb1eEric Dumazet} __packed;
166f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho
167c6999d831ab9ae5e368b20f3bc11b0ca9c17a7ecKalle Valostatic inline int wl1271_tx_get_queue(int queue)
168c6999d831ab9ae5e368b20f3bc11b0ca9c17a7ecKalle Valo{
169c6999d831ab9ae5e368b20f3bc11b0ca9c17a7ecKalle Valo	switch (queue) {
170c6999d831ab9ae5e368b20f3bc11b0ca9c17a7ecKalle Valo	case 0:
171c6999d831ab9ae5e368b20f3bc11b0ca9c17a7ecKalle Valo		return CONF_TX_AC_VO;
172c6999d831ab9ae5e368b20f3bc11b0ca9c17a7ecKalle Valo	case 1:
173c6999d831ab9ae5e368b20f3bc11b0ca9c17a7ecKalle Valo		return CONF_TX_AC_VI;
174c6999d831ab9ae5e368b20f3bc11b0ca9c17a7ecKalle Valo	case 2:
175c6999d831ab9ae5e368b20f3bc11b0ca9c17a7ecKalle Valo		return CONF_TX_AC_BE;
176c6999d831ab9ae5e368b20f3bc11b0ca9c17a7ecKalle Valo	case 3:
177c6999d831ab9ae5e368b20f3bc11b0ca9c17a7ecKalle Valo		return CONF_TX_AC_BK;
178c6999d831ab9ae5e368b20f3bc11b0ca9c17a7ecKalle Valo	default:
179c6999d831ab9ae5e368b20f3bc11b0ca9c17a7ecKalle Valo		return CONF_TX_AC_BE;
180c6999d831ab9ae5e368b20f3bc11b0ca9c17a7ecKalle Valo	}
181c6999d831ab9ae5e368b20f3bc11b0ca9c17a7ecKalle Valo}
182c6999d831ab9ae5e368b20f3bc11b0ca9c17a7ecKalle Valo
183708bb3cf58a9bc90f3171ba64f30601f690e5aaaArik Nemtsovstatic inline int wl1271_tx_get_mac80211_queue(int queue)
184708bb3cf58a9bc90f3171ba64f30601f690e5aaaArik Nemtsov{
185708bb3cf58a9bc90f3171ba64f30601f690e5aaaArik Nemtsov	switch (queue) {
186708bb3cf58a9bc90f3171ba64f30601f690e5aaaArik Nemtsov	case CONF_TX_AC_VO:
187708bb3cf58a9bc90f3171ba64f30601f690e5aaaArik Nemtsov		return 0;
188708bb3cf58a9bc90f3171ba64f30601f690e5aaaArik Nemtsov	case CONF_TX_AC_VI:
189708bb3cf58a9bc90f3171ba64f30601f690e5aaaArik Nemtsov		return 1;
190708bb3cf58a9bc90f3171ba64f30601f690e5aaaArik Nemtsov	case CONF_TX_AC_BE:
191708bb3cf58a9bc90f3171ba64f30601f690e5aaaArik Nemtsov		return 2;
192708bb3cf58a9bc90f3171ba64f30601f690e5aaaArik Nemtsov	case CONF_TX_AC_BK:
193708bb3cf58a9bc90f3171ba64f30601f690e5aaaArik Nemtsov		return 3;
194708bb3cf58a9bc90f3171ba64f30601f690e5aaaArik Nemtsov	default:
195708bb3cf58a9bc90f3171ba64f30601f690e5aaaArik Nemtsov		return 2;
196708bb3cf58a9bc90f3171ba64f30601f690e5aaaArik Nemtsov	}
197708bb3cf58a9bc90f3171ba64f30601f690e5aaaArik Nemtsov}
198708bb3cf58a9bc90f3171ba64f30601f690e5aaaArik Nemtsov
199f1a46384ad568f72c11edbe2a3ec284bf32f2dbdArik Nemtsovstatic inline int wl1271_tx_total_queue_count(struct wl1271 *wl)
200f1a46384ad568f72c11edbe2a3ec284bf32f2dbdArik Nemtsov{
201f1a46384ad568f72c11edbe2a3ec284bf32f2dbdArik Nemtsov	int i, count = 0;
202f1a46384ad568f72c11edbe2a3ec284bf32f2dbdArik Nemtsov
203f1a46384ad568f72c11edbe2a3ec284bf32f2dbdArik Nemtsov	for (i = 0; i < NUM_TX_QUEUES; i++)
204f1a46384ad568f72c11edbe2a3ec284bf32f2dbdArik Nemtsov		count += wl->tx_queue_count[i];
205f1a46384ad568f72c11edbe2a3ec284bf32f2dbdArik Nemtsov
206f1a46384ad568f72c11edbe2a3ec284bf32f2dbdArik Nemtsov	return count;
207f1a46384ad568f72c11edbe2a3ec284bf32f2dbdArik Nemtsov}
208f1a46384ad568f72c11edbe2a3ec284bf32f2dbdArik Nemtsov
209f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelhovoid wl1271_tx_work(struct work_struct *work);
210a32d0cdfcb7e5d41f210e13cbc78dc86a5a85a08Eliad Pellervoid wl1271_tx_work_locked(struct wl1271 *wl);
211ffb591cd0e32d817bdbd359dead3baa770b999f8Juuso Oikarinenvoid wl1271_tx_complete(struct wl1271 *wl);
212d6a3cc2ef962ad4392a2401cae513a18a6d35099Eliad Pellervoid wl12xx_tx_reset_wlvif(struct wl1271 *wl, struct wl12xx_vif *wlvif);
213d6a3cc2ef962ad4392a2401cae513a18a6d35099Eliad Pellervoid wl12xx_tx_reset(struct wl1271 *wl, bool reset_tx_queues);
214f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelhovoid wl1271_tx_flush(struct wl1271 *wl);
2156a2de93b2553c2e9a72997370534993c85c1eee6Teemu Paasikiviu8 wl1271_rate_to_idx(int rate, enum ieee80211_band band);
216af7fbb28efff0c0d8fc0852ad6622e5437a7611eEliad Pelleru32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set,
217af7fbb28efff0c0d8fc0852ad6622e5437a7611eEliad Peller				enum ieee80211_band rate_band);
218af7fbb28efff0c0d8fc0852ad6622e5437a7611eEliad Pelleru32 wl1271_tx_min_rate_get(struct wl1271 *wl, u32 rate_set);
219a8ab39a4b588e8523be2fa75671bdc9612d3467aEliad Pelleru8 wl12xx_tx_get_hlid_ap(struct wl1271 *wl, struct wl12xx_vif *wlvif,
220a8ab39a4b588e8523be2fa75671bdc9612d3467aEliad Peller			 struct sk_buff *skb);
221d6a3cc2ef962ad4392a2401cae513a18a6d35099Eliad Pelleru8 wl12xx_tx_get_hlid(struct wl1271 *wl, struct wl12xx_vif *wlvif,
222d6a3cc2ef962ad4392a2401cae513a18a6d35099Eliad Peller		      struct sk_buff *skb);
223a8c0ddb5ba2889e1e11a033ccbadfc600f236a91Arik Nemtsovvoid wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid);
224a8c0ddb5ba2889e1e11a033ccbadfc600f236a91Arik Nemtsovvoid wl1271_handle_tx_low_watermark(struct wl1271 *wl);
225f8e0af6b8732b47c2531a280753d29a4ca2d114bArik Nemtsovbool wl12xx_is_dummy_packet(struct wl1271 *wl, struct sk_buff *skb);
2269eb599e9c62dcfd4efece1936c385381b366b684Eliad Pellervoid wl12xx_rearm_rx_streaming(struct wl1271 *wl, unsigned long *active_hlids);
227f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho
228f1acea9a9d48174f982e14a7a488b208d39d825fArik Nemtsov/* from main.c */
229c7ffb902cca655e4d6bdda4156407008573bb214Eliad Pellervoid wl1271_free_sta(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 hlid);
23055df5afb13718cda49128fa5985556df91d07765Arik Nemtsovvoid wl12xx_rearm_tx_watchdog_locked(struct wl1271 *wl);
231f1acea9a9d48174f982e14a7a488b208d39d825fArik Nemtsov
232f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#endif
233