xref: /OK3568_Linux_fs/external/rkwifibt/drivers/infineon/include/wlfc_proto.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Portions of this code are copyright (c) 2021 Cypress Semiconductor Corporation
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (C) 1999-2017, Broadcom Corporation
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  *      Unless you and Broadcom execute a separate written software license
7*4882a593Smuzhiyun  * agreement governing use of this software, this software is licensed to you
8*4882a593Smuzhiyun  * under the terms of the GNU General Public License version 2 (the "GPL"),
9*4882a593Smuzhiyun  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
10*4882a593Smuzhiyun  * following added to such license:
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  *      As a special exception, the copyright holders of this software give you
13*4882a593Smuzhiyun  * permission to link this software with independent modules, and to copy and
14*4882a593Smuzhiyun  * distribute the resulting executable under terms of your choice, provided that
15*4882a593Smuzhiyun  * you also meet, for each linked independent module, the terms and conditions of
16*4882a593Smuzhiyun  * the license of that module.  An independent module is a module which is not
17*4882a593Smuzhiyun  * derived from this software.  The special exception does not apply to any
18*4882a593Smuzhiyun  * modifications of the software.
19*4882a593Smuzhiyun  *
20*4882a593Smuzhiyun  *      Notwithstanding the above, under no circumstances may you combine this
21*4882a593Smuzhiyun  * software in any way with any other Broadcom software provided under a license
22*4882a593Smuzhiyun  * other than the GPL, without Broadcom's express prior written consent.
23*4882a593Smuzhiyun  *
24*4882a593Smuzhiyun  *
25*4882a593Smuzhiyun  * <<Broadcom-WL-IPTag/Open:>>
26*4882a593Smuzhiyun  *
27*4882a593Smuzhiyun  * $Id: wlfc_proto.h 692466 2017-03-28 07:48:19Z $
28*4882a593Smuzhiyun  *
29*4882a593Smuzhiyun  */
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun /** WL flow control for PROP_TXSTATUS. Related to host AMPDU reordering. */
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #ifndef __wlfc_proto_definitions_h__
34*4882a593Smuzhiyun #define __wlfc_proto_definitions_h__
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 	/* Use TLV to convey WLFC information.
37*4882a593Smuzhiyun 	 ---------------------------------------------------------------------------
38*4882a593Smuzhiyun 	| Type |  Len | value                    | Description
39*4882a593Smuzhiyun 	 ---------------------------------------------------------------------------
40*4882a593Smuzhiyun 	|  1   |   1  | (handle)                 | MAC OPEN
41*4882a593Smuzhiyun 	 ---------------------------------------------------------------------------
42*4882a593Smuzhiyun 	|  2   |   1  | (handle)                 | MAC CLOSE
43*4882a593Smuzhiyun 	 ---------------------------------------------------------------------------
44*4882a593Smuzhiyun 	|  3   |   2  | (count, handle, prec_bmp)| Set the credit depth for a MAC dstn
45*4882a593Smuzhiyun 	 ---------------------------------------------------------------------------
46*4882a593Smuzhiyun 	|  4   |   4+ | see pkttag comments      | TXSTATUS
47*4882a593Smuzhiyun 	|      |   12 | TX status & timestamps   | Present only when pkt timestamp is enabled
48*4882a593Smuzhiyun 	 ---------------------------------------------------------------------------
49*4882a593Smuzhiyun 	|  5   |   4  | see pkttag comments      | PKKTTAG [host->firmware]
50*4882a593Smuzhiyun 	 ---------------------------------------------------------------------------
51*4882a593Smuzhiyun 	|  6   |   8  | (handle, ifid, MAC)      | MAC ADD
52*4882a593Smuzhiyun 	 ---------------------------------------------------------------------------
53*4882a593Smuzhiyun 	|  7   |   8  | (handle, ifid, MAC)      | MAC DEL
54*4882a593Smuzhiyun 	 ---------------------------------------------------------------------------
55*4882a593Smuzhiyun 	|  8   |   1  | (rssi)                   | RSSI - RSSI value for the packet.
56*4882a593Smuzhiyun 	 ---------------------------------------------------------------------------
57*4882a593Smuzhiyun 	|  9   |   1  | (interface ID)           | Interface OPEN
58*4882a593Smuzhiyun 	 ---------------------------------------------------------------------------
59*4882a593Smuzhiyun 	|  10  |   1  | (interface ID)           | Interface CLOSE
60*4882a593Smuzhiyun 	 ---------------------------------------------------------------------------
61*4882a593Smuzhiyun 	|  11  |   8  | fifo credit returns map  | FIFO credits back to the host
62*4882a593Smuzhiyun 	|      |      |                          |
63*4882a593Smuzhiyun 	|      |      |                          | --------------------------------------
64*4882a593Smuzhiyun 	|      |      |                          | | ac0 | ac1 | ac2 | ac3 | bcmc | atim |
65*4882a593Smuzhiyun 	|      |      |                          | --------------------------------------
66*4882a593Smuzhiyun 	|      |      |                          |
67*4882a593Smuzhiyun 	 ---------------------------------------------------------------------------
68*4882a593Smuzhiyun 	|  12  |   2  | MAC handle,              | Host provides a bitmap of pending
69*4882a593Smuzhiyun 	|      |      | AC[0-3] traffic bitmap   | unicast traffic for MAC-handle dstn.
70*4882a593Smuzhiyun 	|      |      |                          | [host->firmware]
71*4882a593Smuzhiyun 	 ---------------------------------------------------------------------------
72*4882a593Smuzhiyun 	|  13  |   3  | (count, handle, prec_bmp)| One time request for packet to a specific
73*4882a593Smuzhiyun 	|      |      |                          | MAC destination.
74*4882a593Smuzhiyun 	 ---------------------------------------------------------------------------
75*4882a593Smuzhiyun 	|  15  |  12  | (pkttag, timestamps)     | Send TX timestamp at reception from host
76*4882a593Smuzhiyun 	 ---------------------------------------------------------------------------
77*4882a593Smuzhiyun 	|  16  |  12  | (pkttag, timestamps)     | Send WLAN RX timestamp along with RX frame
78*4882a593Smuzhiyun 	 ---------------------------------------------------------------------------
79*4882a593Smuzhiyun 	| 255  |  N/A |  N/A                     | FILLER - This is a special type
80*4882a593Smuzhiyun 	|      |      |                          | that has no length or value.
81*4882a593Smuzhiyun 	|      |      |                          | Typically used for padding.
82*4882a593Smuzhiyun 	 ---------------------------------------------------------------------------
83*4882a593Smuzhiyun 	*/
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun typedef enum {
86*4882a593Smuzhiyun 	WLFC_CTL_TYPE_MAC_OPEN = 1,
87*4882a593Smuzhiyun 	WLFC_CTL_TYPE_MAC_CLOSE	= 2,
88*4882a593Smuzhiyun 	WLFC_CTL_TYPE_MAC_REQUEST_CREDIT = 3,
89*4882a593Smuzhiyun 	WLFC_CTL_TYPE_TXSTATUS = 4,
90*4882a593Smuzhiyun 	WLFC_CTL_TYPE_PKTTAG = 5,	/** host<->dongle */
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun 	WLFC_CTL_TYPE_MACDESC_ADD = 6,
93*4882a593Smuzhiyun 	WLFC_CTL_TYPE_MACDESC_DEL = 7,
94*4882a593Smuzhiyun 	WLFC_CTL_TYPE_RSSI = 8,
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun 	WLFC_CTL_TYPE_INTERFACE_OPEN = 9,
97*4882a593Smuzhiyun 	WLFC_CTL_TYPE_INTERFACE_CLOSE = 10,
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun 	WLFC_CTL_TYPE_FIFO_CREDITBACK = 11,
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun 	WLFC_CTL_TYPE_PENDING_TRAFFIC_BMP = 12,	/** host->dongle */
102*4882a593Smuzhiyun 	WLFC_CTL_TYPE_MAC_REQUEST_PACKET = 13,
103*4882a593Smuzhiyun 	WLFC_CTL_TYPE_HOST_REORDER_RXPKTS = 14,
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun 	WLFC_CTL_TYPE_TX_ENTRY_STAMP = 15,
106*4882a593Smuzhiyun 	WLFC_CTL_TYPE_RX_STAMP = 16,
107*4882a593Smuzhiyun 	WLFC_CTL_TYPE_TX_STATUS_STAMP = 17,	/** obsolete */
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	WLFC_CTL_TYPE_TRANS_ID = 18,
110*4882a593Smuzhiyun 	WLFC_CTL_TYPE_COMP_TXSTATUS = 19,
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun 	WLFC_CTL_TYPE_TID_OPEN = 20,
113*4882a593Smuzhiyun 	WLFC_CTL_TYPE_TID_CLOSE = 21,
114*4882a593Smuzhiyun 	WLFC_CTL_TYPE_UPD_FLR_WEIGHT = 22,
115*4882a593Smuzhiyun 	WLFC_CTL_TYPE_ENAB_FFSCH = 23,
116*4882a593Smuzhiyun 	WLFC_CTL_TYPE_UPDATE_FLAGS = 24,	/* clear the flags set in flowring */
117*4882a593Smuzhiyun 	WLFC_CTL_TYPE_CLEAR_SUPPR = 25,		/* free the supression info in the flowring */
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun 	WLFC_CTL_TYPE_FLOWID_OPEN = 26,
120*4882a593Smuzhiyun 	WLFC_CTL_TYPE_FLOWID_CLOSE = 27,
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 	WLFC_CTL_TYPE_FILLER = 255
123*4882a593Smuzhiyun } wlfc_ctl_type_t;
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun #define WLFC_CTL_VALUE_LEN_FLOWID		2
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun #define WLFC_CTL_VALUE_LEN_MACDESC		8	/** handle, interface, MAC */
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun #define WLFC_CTL_VALUE_LEN_MAC			1	/** MAC-handle */
130*4882a593Smuzhiyun #define WLFC_CTL_VALUE_LEN_RSSI			1
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun #define WLFC_CTL_VALUE_LEN_INTERFACE		1
133*4882a593Smuzhiyun #define WLFC_CTL_VALUE_LEN_PENDING_TRAFFIC_BMP	2
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun #define WLFC_CTL_VALUE_LEN_TXSTATUS		4
136*4882a593Smuzhiyun #define WLFC_CTL_VALUE_LEN_PKTTAG		4
137*4882a593Smuzhiyun #define WLFC_CTL_VALUE_LEN_TIMESTAMP		12	/** 4-byte rate info + 2 TSF */
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun #define WLFC_CTL_VALUE_LEN_SEQ			2
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun /* Reset the flags set for the corresponding flowring of the SCB which is de-inited */
142*4882a593Smuzhiyun /* FLOW_RING_FLAG_LAST_TIM | FLOW_RING_FLAG_INFORM_PKTPEND | FLOW_RING_FLAG_PKT_REQ */
143*4882a593Smuzhiyun #define WLFC_RESET_ALL_FLAGS			0
144*4882a593Smuzhiyun #define WLFC_CTL_VALUE_LEN_FLAGS		7	/** flags, MAC */
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun /* free the data stored to be used for suppressed packets in future */
147*4882a593Smuzhiyun #define WLFC_CTL_VALUE_LEN_SUPR			7	/** tid, MAC */
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun /* The high bits of ratespec report in timestamp are used for various status */
150*4882a593Smuzhiyun #define WLFC_TSFLAGS_RX_RETRY		(1 << 31)
151*4882a593Smuzhiyun #define WLFC_TSFLAGS_PM_ENABLED		(1 << 30)
152*4882a593Smuzhiyun #define WLFC_TSFLAGS_MASK		(WLFC_TSFLAGS_RX_RETRY | WLFC_TSFLAGS_PM_ENABLED)
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun /* enough space to host all 4 ACs, bc/mc and atim fifo credit */
155*4882a593Smuzhiyun #define WLFC_CTL_VALUE_LEN_FIFO_CREDITBACK	6
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun #define WLFC_CTL_VALUE_LEN_REQUEST_CREDIT	3	/* credit, MAC-handle, prec_bitmap */
158*4882a593Smuzhiyun #define WLFC_CTL_VALUE_LEN_REQUEST_PACKET	3	/* credit, MAC-handle, prec_bitmap */
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun #define WLFC_PKTFLAG_PKTFROMHOST	0x01
161*4882a593Smuzhiyun #define WLFC_PKTFLAG_PKT_REQUESTED	0x02
162*4882a593Smuzhiyun #define WLFC_PKTFLAG_PKT_SENDTOHOST	0x04
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun #define WL_TXSTATUS_STATUS_MASK			0xff /* allow 8 bits */
165*4882a593Smuzhiyun #define WL_TXSTATUS_STATUS_SHIFT		24
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun #define WL_TXSTATUS_SET_STATUS(x, status)	((x)  = \
168*4882a593Smuzhiyun 	((x) & ~(WL_TXSTATUS_STATUS_MASK << WL_TXSTATUS_STATUS_SHIFT)) | \
169*4882a593Smuzhiyun 	(((status) & WL_TXSTATUS_STATUS_MASK) << WL_TXSTATUS_STATUS_SHIFT))
170*4882a593Smuzhiyun #define WL_TXSTATUS_GET_STATUS(x)	(((x) >> WL_TXSTATUS_STATUS_SHIFT) & \
171*4882a593Smuzhiyun 	WL_TXSTATUS_STATUS_MASK)
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun /**
174*4882a593Smuzhiyun  * Bit 31 of the 32-bit packet tag is defined as 'generation ID'. It is set by the host to the
175*4882a593Smuzhiyun  * "current" generation, and by the firmware to the "expected" generation, toggling on suppress. The
176*4882a593Smuzhiyun  * firmware accepts a packet when the generation matches; on reset (startup) both "current" and
177*4882a593Smuzhiyun  * "expected" are set to 0.
178*4882a593Smuzhiyun  */
179*4882a593Smuzhiyun #define WL_TXSTATUS_GENERATION_MASK		1 /* allow 1 bit */
180*4882a593Smuzhiyun #define WL_TXSTATUS_GENERATION_SHIFT		31
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun #define WL_TXSTATUS_SET_GENERATION(x, gen)	((x) = \
183*4882a593Smuzhiyun 	((x) & ~(WL_TXSTATUS_GENERATION_MASK << WL_TXSTATUS_GENERATION_SHIFT)) | \
184*4882a593Smuzhiyun 	(((gen) & WL_TXSTATUS_GENERATION_MASK) << WL_TXSTATUS_GENERATION_SHIFT))
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun #define WL_TXSTATUS_GET_GENERATION(x)	(((x) >> WL_TXSTATUS_GENERATION_SHIFT) & \
187*4882a593Smuzhiyun 	WL_TXSTATUS_GENERATION_MASK)
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun #define WL_TXSTATUS_FLAGS_MASK			0xf /* allow 4 bits only */
190*4882a593Smuzhiyun #define WL_TXSTATUS_FLAGS_SHIFT			27
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun #define WL_TXSTATUS_SET_FLAGS(x, flags)	((x)  = \
193*4882a593Smuzhiyun 	((x) & ~(WL_TXSTATUS_FLAGS_MASK << WL_TXSTATUS_FLAGS_SHIFT)) | \
194*4882a593Smuzhiyun 	(((flags) & WL_TXSTATUS_FLAGS_MASK) << WL_TXSTATUS_FLAGS_SHIFT))
195*4882a593Smuzhiyun #define WL_TXSTATUS_GET_FLAGS(x)		(((x) >> WL_TXSTATUS_FLAGS_SHIFT) & \
196*4882a593Smuzhiyun 	WL_TXSTATUS_FLAGS_MASK)
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun #define WL_TXSTATUS_FIFO_MASK			0x7 /* allow 3 bits for FIFO ID */
199*4882a593Smuzhiyun #define WL_TXSTATUS_FIFO_SHIFT			24
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun #define WL_TXSTATUS_SET_FIFO(x, flags)	((x)  = \
202*4882a593Smuzhiyun 	((x) & ~(WL_TXSTATUS_FIFO_MASK << WL_TXSTATUS_FIFO_SHIFT)) | \
203*4882a593Smuzhiyun 	(((flags) & WL_TXSTATUS_FIFO_MASK) << WL_TXSTATUS_FIFO_SHIFT))
204*4882a593Smuzhiyun #define WL_TXSTATUS_GET_FIFO(x)		(((x) >> WL_TXSTATUS_FIFO_SHIFT) & WL_TXSTATUS_FIFO_MASK)
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun #define WL_TXSTATUS_PKTID_MASK			0xffffff /* allow 24 bits */
207*4882a593Smuzhiyun #define WL_TXSTATUS_SET_PKTID(x, num)	((x) = \
208*4882a593Smuzhiyun 	((x) & ~WL_TXSTATUS_PKTID_MASK) | (num))
209*4882a593Smuzhiyun #define WL_TXSTATUS_GET_PKTID(x)		((x) & WL_TXSTATUS_PKTID_MASK)
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun #define WL_TXSTATUS_HSLOT_MASK			0xffff /* allow 16 bits */
212*4882a593Smuzhiyun #define WL_TXSTATUS_HSLOT_SHIFT			8
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun #define WL_TXSTATUS_SET_HSLOT(x, hslot)	((x)  = \
215*4882a593Smuzhiyun 	((x) & ~(WL_TXSTATUS_HSLOT_MASK << WL_TXSTATUS_HSLOT_SHIFT)) | \
216*4882a593Smuzhiyun 	(((hslot) & WL_TXSTATUS_HSLOT_MASK) << WL_TXSTATUS_HSLOT_SHIFT))
217*4882a593Smuzhiyun #define WL_TXSTATUS_GET_HSLOT(x)	(((x) >> WL_TXSTATUS_HSLOT_SHIFT)& \
218*4882a593Smuzhiyun 	WL_TXSTATUS_HSLOT_MASK)
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun #define WL_TXSTATUS_FREERUNCTR_MASK		0xff /* allow 8 bits */
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun #define WL_TXSTATUS_SET_FREERUNCTR(x, ctr)	((x)  = \
223*4882a593Smuzhiyun 	((x) & ~(WL_TXSTATUS_FREERUNCTR_MASK)) | \
224*4882a593Smuzhiyun 	((ctr) & WL_TXSTATUS_FREERUNCTR_MASK))
225*4882a593Smuzhiyun #define WL_TXSTATUS_GET_FREERUNCTR(x)		((x)& WL_TXSTATUS_FREERUNCTR_MASK)
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun /* AMSDU part of d11 seq number */
228*4882a593Smuzhiyun #define WL_SEQ_AMSDU_MASK             0x1 /* allow 1 bit */
229*4882a593Smuzhiyun #define WL_SEQ_AMSDU_SHIFT            14
230*4882a593Smuzhiyun #define WL_SEQ_SET_AMSDU(x, val)      ((x) = \
231*4882a593Smuzhiyun 	((x) & ~(WL_SEQ_AMSDU_MASK << WL_SEQ_AMSDU_SHIFT)) | \
232*4882a593Smuzhiyun 	(((val) & WL_SEQ_AMSDU_MASK) << WL_SEQ_AMSDU_SHIFT)) /**< sets a single AMSDU bit */
233*4882a593Smuzhiyun /** returns TRUE if ring item is AMSDU (seq = d11 seq nr) */
234*4882a593Smuzhiyun #define WL_SEQ_IS_AMSDU(x)   (((x) >> WL_SEQ_AMSDU_SHIFT) & \
235*4882a593Smuzhiyun 	WL_SEQ_AMSDU_MASK)
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun /* indicates last_suppr_seq is valid */
238*4882a593Smuzhiyun #define WL_SEQ_VALIDSUPPR_MASK		0x1 /* allow 1 bit */
239*4882a593Smuzhiyun #define WL_SEQ_VALIDSUPPR_SHIFT		12
240*4882a593Smuzhiyun #define WL_SEQ_SET_VALIDSUPPR(x, val)	((x) = \
241*4882a593Smuzhiyun 	((x) & ~(WL_SEQ_VALIDSUPPR_MASK << WL_SEQ_VALIDSUPPR_SHIFT)) | \
242*4882a593Smuzhiyun 	(((val) & WL_SEQ_VALIDSUPPR_MASK) << WL_SEQ_VALIDSUPPR_SHIFT))
243*4882a593Smuzhiyun #define WL_SEQ_GET_VALIDSUPPR(x)	(((x) >> WL_SEQ_VALIDSUPPR_SHIFT) & \
244*4882a593Smuzhiyun 	WL_SEQ_VALIDSUPPR_MASK)
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun #define WL_SEQ_FROMFW_MASK		0x1 /* allow 1 bit */
247*4882a593Smuzhiyun #define WL_SEQ_FROMFW_SHIFT		13
248*4882a593Smuzhiyun #define WL_SEQ_SET_FROMFW(x, val)	((x) = \
249*4882a593Smuzhiyun 	((x) & ~(WL_SEQ_FROMFW_MASK << WL_SEQ_FROMFW_SHIFT)) | \
250*4882a593Smuzhiyun 	(((val) & WL_SEQ_FROMFW_MASK) << WL_SEQ_FROMFW_SHIFT))
251*4882a593Smuzhiyun /** Set when firmware assigns D11 sequence number to packet */
252*4882a593Smuzhiyun #define SET_WL_HAS_ASSIGNED_SEQ(x)	WL_SEQ_SET_FROMFW((x), 1)
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun /** returns TRUE if packet has been assigned a d11 seq number by the WL firmware layer */
255*4882a593Smuzhiyun #define GET_WL_HAS_ASSIGNED_SEQ(x)	(((x) >> WL_SEQ_FROMFW_SHIFT) & WL_SEQ_FROMFW_MASK)
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun /**
258*4882a593Smuzhiyun  * Proptxstatus related.
259*4882a593Smuzhiyun  *
260*4882a593Smuzhiyun  * When a packet is suppressed by WL or the D11 core, the packet has to be retried. Assigning
261*4882a593Smuzhiyun  * a new d11 sequence number for the packet when retrying would cause the peer to be unable to
262*4882a593Smuzhiyun  * reorder the packets within an AMPDU. So, suppressed packet from bus layer (DHD for SDIO and
263*4882a593Smuzhiyun  * pciedev for PCIE) is re-using d11 seq number, so FW should not assign a new one.
264*4882a593Smuzhiyun  */
265*4882a593Smuzhiyun #define WL_SEQ_FROMDRV_MASK		0x1 /* allow 1 bit */
266*4882a593Smuzhiyun #define WL_SEQ_FROMDRV_SHIFT		12
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun /**
269*4882a593Smuzhiyun  * Proptxstatus, host or fw PCIe layer requests WL layer to reuse d11 seq no. Bit is reset by WL
270*4882a593Smuzhiyun  * subsystem when it reuses the seq number.
271*4882a593Smuzhiyun  */
272*4882a593Smuzhiyun #define WL_SEQ_SET_REUSE(x, val)	((x) = \
273*4882a593Smuzhiyun 	((x) & ~(WL_SEQ_FROMDRV_MASK << WL_SEQ_FROMDRV_SHIFT)) | \
274*4882a593Smuzhiyun 	(((val) & WL_SEQ_FROMDRV_MASK) << WL_SEQ_FROMDRV_SHIFT))
275*4882a593Smuzhiyun #define SET_WL_TO_REUSE_SEQ(x)   WL_SEQ_SET_REUSE((x), 1)
276*4882a593Smuzhiyun #define RESET_WL_TO_REUSE_SEQ(x) WL_SEQ_SET_REUSE((x), 0)
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun /** Proptxstatus, related to reuse of d11 seq numbers when retransmitting */
279*4882a593Smuzhiyun #define IS_WL_TO_REUSE_SEQ(x)	(((x) >> WL_SEQ_FROMDRV_SHIFT) & \
280*4882a593Smuzhiyun 	WL_SEQ_FROMDRV_MASK)
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun #define WL_SEQ_NUM_MASK			0xfff /* allow 12 bit */
283*4882a593Smuzhiyun #define WL_SEQ_NUM_SHIFT		0
284*4882a593Smuzhiyun /** Proptxstatus, sets d11seq no in pkt tag, related to reuse of d11seq no when retransmitting */
285*4882a593Smuzhiyun #define WL_SEQ_SET_NUM(x, val)	((x) = \
286*4882a593Smuzhiyun 	((x) & ~(WL_SEQ_NUM_MASK << WL_SEQ_NUM_SHIFT)) | \
287*4882a593Smuzhiyun 	(((val) & WL_SEQ_NUM_MASK) << WL_SEQ_NUM_SHIFT))
288*4882a593Smuzhiyun /** Proptxstatus, gets d11seq no from pkt tag, related to reuse of d11seq no when retransmitting */
289*4882a593Smuzhiyun #define WL_SEQ_GET_NUM(x)	(((x) >> WL_SEQ_NUM_SHIFT) & \
290*4882a593Smuzhiyun 	WL_SEQ_NUM_MASK)
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun #define WL_SEQ_AMSDU_SUPPR_MASK	((WL_SEQ_FROMDRV_MASK << WL_SEQ_FROMDRV_SHIFT) | \
293*4882a593Smuzhiyun 				(WL_SEQ_AMSDU_MASK << WL_SEQ_AMSDU_SHIFT) | \
294*4882a593Smuzhiyun 				(WL_SEQ_NUM_MASK << WL_SEQ_NUM_SHIFT))
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun /* 32 STA should be enough??, 6 bits; Must be power of 2 */
297*4882a593Smuzhiyun #define WLFC_MAC_DESC_TABLE_SIZE	32
298*4882a593Smuzhiyun #define WLFC_MAX_IFNUM				16
299*4882a593Smuzhiyun #define WLFC_MAC_DESC_ID_INVALID	0xff
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun /* b[7:5] -reuse guard, b[4:0] -value */
302*4882a593Smuzhiyun #define WLFC_MAC_DESC_GET_LOOKUP_INDEX(x) ((x) & 0x1f)
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun #define WLFC_PKTFLAG_SET_PKTREQUESTED(x)	(x) |= \
305*4882a593Smuzhiyun 	(WLFC_PKTFLAG_PKT_REQUESTED << WL_TXSTATUS_FLAGS_SHIFT)
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun #define WLFC_PKTFLAG_CLR_PKTREQUESTED(x)	(x) &= \
308*4882a593Smuzhiyun 	~(WLFC_PKTFLAG_PKT_REQUESTED << WL_TXSTATUS_FLAGS_SHIFT)
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun #define WLFC_MAX_PENDING_DATALEN	120
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun /* host is free to discard the packet */
313*4882a593Smuzhiyun #define WLFC_CTL_PKTFLAG_DISCARD	0
314*4882a593Smuzhiyun /* D11 suppressed a packet */
315*4882a593Smuzhiyun #define WLFC_CTL_PKTFLAG_D11SUPPRESS	1
316*4882a593Smuzhiyun /* WL firmware suppressed a packet because MAC is
317*4882a593Smuzhiyun 	already in PSMode (short time window)
318*4882a593Smuzhiyun */
319*4882a593Smuzhiyun #define WLFC_CTL_PKTFLAG_WLSUPPRESS	2
320*4882a593Smuzhiyun /* Firmware tossed this packet */
321*4882a593Smuzhiyun #define WLFC_CTL_PKTFLAG_TOSSED_BYWLC	3
322*4882a593Smuzhiyun /* Firmware tossed after retries */
323*4882a593Smuzhiyun #define WLFC_CTL_PKTFLAG_DISCARD_NOACK	4
324*4882a593Smuzhiyun /* Firmware wrongly reported suppressed previously,now fixing to acked */
325*4882a593Smuzhiyun #define WLFC_CTL_PKTFLAG_SUPPRESS_ACKED	5
326*4882a593Smuzhiyun /* Firmware send this packet expired, lifetime expiration */
327*4882a593Smuzhiyun #define WLFC_CTL_PKTFLAG_EXPIRED	6
328*4882a593Smuzhiyun /* Firmware drop this packet for any other reason  */
329*4882a593Smuzhiyun #define WLFC_CTL_PKTFLAG_DROPPED	7
330*4882a593Smuzhiyun /* Firmware free this packet  */
331*4882a593Smuzhiyun #define WLFC_CTL_PKTFLAG_MKTFREE	8
332*4882a593Smuzhiyun #define WLFC_CTL_PKTFLAG_MASK		(0x0f)	/* For 4-bit mask with one extra bit */
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun #ifdef PROP_TXSTATUS_DEBUG
335*4882a593Smuzhiyun #define WLFC_DBGMESG(x) printf x
336*4882a593Smuzhiyun /* wlfc-breadcrumb */
337*4882a593Smuzhiyun #define WLFC_BREADCRUMB(x) do {if ((x) == NULL) \
338*4882a593Smuzhiyun 	{printf("WLFC: %s():%d:caller:%p\n", \
339*4882a593Smuzhiyun 	__FUNCTION__, __LINE__, CALL_SITE);}} while (0)
340*4882a593Smuzhiyun #define WLFC_WHEREIS(s) printf("WLFC: at %s():%d, %s\n", __FUNCTION__, __LINE__, (s))
341*4882a593Smuzhiyun #else
342*4882a593Smuzhiyun #define WLFC_DBGMESG(x)
343*4882a593Smuzhiyun #define WLFC_BREADCRUMB(x)
344*4882a593Smuzhiyun #define WLFC_WHEREIS(s)
345*4882a593Smuzhiyun #endif /* PROP_TXSTATUS_DEBUG */
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun /* AMPDU host reorder packet flags */
348*4882a593Smuzhiyun #define WLHOST_REORDERDATA_MAXFLOWS		256
349*4882a593Smuzhiyun #define WLHOST_REORDERDATA_LEN		 10
350*4882a593Smuzhiyun #define WLHOST_REORDERDATA_TOTLEN	(WLHOST_REORDERDATA_LEN + 1 + 1) /* +tag +len */
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun #define WLHOST_REORDERDATA_FLOWID_OFFSET		0
353*4882a593Smuzhiyun #define WLHOST_REORDERDATA_MAXIDX_OFFSET		2
354*4882a593Smuzhiyun #define WLHOST_REORDERDATA_FLAGS_OFFSET			4
355*4882a593Smuzhiyun #define WLHOST_REORDERDATA_CURIDX_OFFSET		6
356*4882a593Smuzhiyun #define WLHOST_REORDERDATA_EXPIDX_OFFSET		8
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun #define WLHOST_REORDERDATA_DEL_FLOW		0x01
359*4882a593Smuzhiyun #define WLHOST_REORDERDATA_FLUSH_ALL		0x02
360*4882a593Smuzhiyun #define WLHOST_REORDERDATA_CURIDX_VALID		0x04
361*4882a593Smuzhiyun #define WLHOST_REORDERDATA_EXPIDX_VALID		0x08
362*4882a593Smuzhiyun #define WLHOST_REORDERDATA_NEW_HOLE		0x10
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun /* transaction id data len byte 0: rsvd, byte 1: seqnumber, byte 2-5 will be used for timestampe */
365*4882a593Smuzhiyun #define WLFC_CTL_TRANS_ID_LEN			6
366*4882a593Smuzhiyun #define WLFC_TYPE_TRANS_ID_LEN			6
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun #define WLFC_MODE_HANGER	1 /* use hanger */
369*4882a593Smuzhiyun #define WLFC_MODE_AFQ		2 /* use afq (At Firmware Queue) */
370*4882a593Smuzhiyun #define WLFC_IS_OLD_DEF(x) ((x & 1) || (x & 2))
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun #define WLFC_MODE_AFQ_SHIFT		2	/* afq bit */
373*4882a593Smuzhiyun #define WLFC_SET_AFQ(x, val)	((x) = \
374*4882a593Smuzhiyun 	((x) & ~(1 << WLFC_MODE_AFQ_SHIFT)) | \
375*4882a593Smuzhiyun 	(((val) & 1) << WLFC_MODE_AFQ_SHIFT))
376*4882a593Smuzhiyun /** returns TRUE if firmware supports 'at firmware queue' feature */
377*4882a593Smuzhiyun #define WLFC_GET_AFQ(x)	(((x) >> WLFC_MODE_AFQ_SHIFT) & 1)
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun #define WLFC_MODE_REUSESEQ_SHIFT	3	/* seq reuse bit */
380*4882a593Smuzhiyun #define WLFC_SET_REUSESEQ(x, val)	((x) = \
381*4882a593Smuzhiyun 	((x) & ~(1 << WLFC_MODE_REUSESEQ_SHIFT)) | \
382*4882a593Smuzhiyun 	(((val) & 1) << WLFC_MODE_REUSESEQ_SHIFT))
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun /** returns TRUE if 'd11 sequence reuse' has been agreed upon between host and dongle */
385*4882a593Smuzhiyun #if defined(BCMPCIEDEV_ENABLED) && !defined(ROM_ENAB_RUNTIME_CHECK)
386*4882a593Smuzhiyun /* GET_REUSESEQ is always TRUE in pciedev */
387*4882a593Smuzhiyun #define WLFC_GET_REUSESEQ(x)	(TRUE)
388*4882a593Smuzhiyun #else
389*4882a593Smuzhiyun #define WLFC_GET_REUSESEQ(x)	(((x) >> WLFC_MODE_REUSESEQ_SHIFT) & 1)
390*4882a593Smuzhiyun #endif /* defined(BCMPCIEDEV_ENABLED) && !defined(ROM_ENAB_RUNTIME_CHECK) */
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun #define WLFC_MODE_REORDERSUPP_SHIFT	4	/* host reorder suppress pkt bit */
393*4882a593Smuzhiyun #define WLFC_SET_REORDERSUPP(x, val)	((x) = \
394*4882a593Smuzhiyun 	((x) & ~(1 << WLFC_MODE_REORDERSUPP_SHIFT)) | \
395*4882a593Smuzhiyun 	(((val) & 1) << WLFC_MODE_REORDERSUPP_SHIFT))
396*4882a593Smuzhiyun /** returns TRUE if 'reorder suppress' has been agreed upon between host and dongle */
397*4882a593Smuzhiyun #define WLFC_GET_REORDERSUPP(x)	(((x) >> WLFC_MODE_REORDERSUPP_SHIFT) & 1)
398*4882a593Smuzhiyun 
399*4882a593Smuzhiyun #define FLOW_RING_CREATE	1
400*4882a593Smuzhiyun #define FLOW_RING_DELETE	2
401*4882a593Smuzhiyun #define FLOW_RING_FLUSH		3
402*4882a593Smuzhiyun #define FLOW_RING_OPEN		4
403*4882a593Smuzhiyun #define FLOW_RING_CLOSED	5
404*4882a593Smuzhiyun #define FLOW_RING_FLUSHED	6
405*4882a593Smuzhiyun #define FLOW_RING_TIM_SET	7
406*4882a593Smuzhiyun #define FLOW_RING_TIM_RESET	8
407*4882a593Smuzhiyun #define FLOW_RING_FLUSH_TXFIFO	9
408*4882a593Smuzhiyun #define FLOW_RING_GET_PKT_MAX	10
409*4882a593Smuzhiyun #define FLOW_RING_RESET_WEIGHT	11
410*4882a593Smuzhiyun #define FLOW_RING_UPD_PRIOMAP	12
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun /* bit 7, indicating if is TID(1) or AC(0) mapped info in tid field) */
413*4882a593Smuzhiyun #define PCIEDEV_IS_AC_TID_MAP_MASK	0x80
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun #endif /* __wlfc_proto_definitions_h__ */
416