Merge tag 'drivers-5.15' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
[linux-2.6-microblaze.git] / drivers / staging / rtl8712 / wifi.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5  *
6  * Modifications for inclusion into the Linux staging tree are
7  * Copyright(c) 2010 Larry Finger. All rights reserved.
8  *
9  * Contact information:
10  * WLAN FAE <wlanfae@realtek.com>
11  * Larry Finger <Larry.Finger@lwfinger.net>
12  *
13  ******************************************************************************/
14 #ifndef _WIFI_H_
15 #define _WIFI_H_
16
17 #include <linux/compiler.h>
18 #include <linux/ieee80211.h>
19
20 #define WLAN_HDR_A3_LEN         24
21 #define WLAN_HDR_A3_QOS_LEN     26
22
23 enum WIFI_FRAME_TYPE {
24         WIFI_QOS_DATA_TYPE      = (BIT(7) | BIT(3)),    /*!< QoS Data */
25 };
26
27 #define SetToDs(pbuf) ({ \
28         *(__le16 *)(pbuf) |= cpu_to_le16(IEEE80211_FCTL_TODS); \
29 })
30
31 #define GetToDs(pbuf)   (((*(__le16 *)(pbuf)) & cpu_to_le16(IEEE80211_FCTL_TODS)) != 0)
32
33 #define ClearToDs(pbuf) ({ \
34         *(__le16 *)(pbuf) &= (~cpu_to_le16(IEEE80211_FCTL_TODS)); \
35 })
36
37 #define SetFrDs(pbuf) ({ \
38         *(__le16 *)(pbuf) |= cpu_to_le16(IEEE80211_FCTL_FROMDS); \
39 })
40
41 #define GetFrDs(pbuf)   (((*(__le16 *)(pbuf)) & cpu_to_le16(IEEE80211_FCTL_FROMDS)) != 0)
42
43 #define ClearFrDs(pbuf) ({ \
44         *(__le16 *)(pbuf) &= (~cpu_to_le16(IEEE80211_FCTL_FROMDS)); \
45 })
46
47 static inline unsigned char get_tofr_ds(unsigned char *pframe)
48 {
49         return ((GetToDs(pframe) << 1) | GetFrDs(pframe));
50 }
51
52 #define SetMFrag(pbuf) ({ \
53         *(__le16 *)(pbuf) |= cpu_to_le16(IEEE80211_FCTL_MOREFRAGS); \
54 })
55
56 #define GetMFrag(pbuf)  (((*(__le16 *)(pbuf)) & cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) != 0)
57
58 #define ClearMFrag(pbuf) ({ \
59         *(__le16 *)(pbuf) &= (~cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)); \
60 })
61
62 #define SetRetry(pbuf) ({ \
63         *(__le16 *)(pbuf) |= cpu_to_le16(IEEE80211_FCTL_RETRY); \
64 })
65
66 #define GetRetry(pbuf)  (((*(__le16 *)(pbuf)) & cpu_to_le16(IEEE80211_FCTL_RETRY)) != 0)
67
68 #define ClearRetry(pbuf) ({ \
69         *(__le16 *)(pbuf) &= (~cpu_to_le16(IEEE80211_FCTL_RETRY)); \
70 })
71
72 #define SetPwrMgt(pbuf) ({ \
73         *(__le16 *)(pbuf) |= cpu_to_le16(IEEE80211_FCTL_PM); \
74 })
75
76 #define GetPwrMgt(pbuf) (((*(__le16 *)(pbuf)) & \
77                         cpu_to_le16(IEEE80211_FCTL_PM)) != 0)
78
79 #define ClearPwrMgt(pbuf) ({ \
80         *(__le16 *)(pbuf) &= (~cpu_to_le16(IEEE80211_FCTL_PM)); \
81 })
82
83 #define SetMData(pbuf) ({ \
84         *(__le16 *)(pbuf) |= cpu_to_le16(IEEE80211_FCTL_MOREDATA); \
85 })
86
87 #define GetMData(pbuf)  (((*(__le16 *)(pbuf)) & \
88                         cpu_to_le16(IEEE80211_FCTL_MOREDATA)) != 0)
89
90 #define ClearMData(pbuf) ({ \
91         *(__le16 *)(pbuf) &= (~cpu_to_le16(IEEE80211_FCTL_MOREDATA)); \
92 })
93
94 #define SetPrivacy(pbuf) ({ \
95         *(__le16 *)(pbuf) |= cpu_to_le16(IEEE80211_FCTL_PROTECTED); \
96 })
97
98 #define GetPrivacy(pbuf)        (((*(__le16 *)(pbuf)) & \
99                                 cpu_to_le16(IEEE80211_FCTL_PROTECTED)) != 0)
100
101 #define GetOrder(pbuf)  (((*(__le16 *)(pbuf)) & \
102                         cpu_to_le16(IEEE80211_FCTL_ORDER)) != 0)
103
104 #define GetFrameType(pbuf)      (le16_to_cpu(*(__le16 *)(pbuf)) & \
105                                 (BIT(3) | BIT(2)))
106
107 #define SetFrameType(pbuf, type)        \
108         do {    \
109                 *(__le16 *)(pbuf) &= cpu_to_le16(~(BIT(3) | \
110                 BIT(2))); \
111                 *(__le16 *)(pbuf) |= cpu_to_le16(type); \
112         } while (0)
113
114 #define GetFrameSubType(pbuf)   (le16_to_cpu(*(__le16 *)(pbuf)) & \
115                                 (BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(3) | \
116                                 BIT(2)))
117
118 #define SetFrameSubType(pbuf, type) \
119         do {    \
120                 *(__le16 *)(pbuf) &= cpu_to_le16(~(BIT(7) | BIT(6) | \
121                 BIT(5) | BIT(4) | BIT(3) | BIT(2))); \
122                 *(__le16 *)(pbuf) |= cpu_to_le16(type); \
123         } while (0)
124
125 #define GetSequence(pbuf)       (le16_to_cpu(*(__le16 *)\
126                                 ((addr_t)(pbuf) + 22)) >> 4)
127
128 #define GetFragNum(pbuf)        (le16_to_cpu(*(__le16 *)((addr_t)\
129                                 (pbuf) + 22)) & 0x0f)
130
131 #define SetSeqNum(pbuf, num) ({ \
132         *(__le16 *)((addr_t)(pbuf) + 22) = \
133         cpu_to_le16((le16_to_cpu(*(__le16 *)((addr_t)(pbuf) + 22)) & \
134         0x000f) | (0xfff0 & (num << 4))); \
135 })
136
137 #define SetPriority(pbuf, tid) ({ \
138         *(__le16 *)(pbuf) |= cpu_to_le16(tid & 0xf); \
139 })
140
141 #define GetPriority(pbuf)       ((le16_to_cpu(*(__le16 *)(pbuf))) & 0xf)
142
143 #define SetAckpolicy(pbuf, ack) ({ \
144         *(__le16 *)(pbuf) |= cpu_to_le16((ack & 3) << 5); \
145 })
146
147 #define GetAckpolicy(pbuf) (((le16_to_cpu(*(__le16 *)pbuf)) >> 5) & 0x3)
148
149 #define GetAMsdu(pbuf) (((le16_to_cpu(*(__le16 *)pbuf)) >> 7) & 0x1)
150
151 #define GetAddr1Ptr(pbuf)       ((unsigned char *)((addr_t)(pbuf) + 4))
152
153 #define GetAddr2Ptr(pbuf)       ((unsigned char *)((addr_t)(pbuf) + 10))
154
155 #define GetAddr3Ptr(pbuf)       ((unsigned char *)((addr_t)(pbuf) + 16))
156
157 #define GetAddr4Ptr(pbuf)       ((unsigned char *)((addr_t)(pbuf) + 24))
158
159 static inline unsigned char *get_hdr_bssid(unsigned char *pframe)
160 {
161         unsigned char   *sa;
162         unsigned int    to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe);
163
164         switch (to_fr_ds) {
165         case 0x00:      /* ToDs=0, FromDs=0 */
166                 sa = GetAddr3Ptr(pframe);
167                 break;
168         case 0x01:      /* ToDs=0, FromDs=1 */
169                 sa = GetAddr2Ptr(pframe);
170                 break;
171         case 0x02:      /* ToDs=1, FromDs=0 */
172                 sa = GetAddr1Ptr(pframe);
173                 break;
174         default:        /* ToDs=1, FromDs=1 */
175                 sa = NULL;
176                 break;
177         }
178         return sa;
179 }
180
181 /* ---------------------------------------------------------------------------
182  *                      Below is the fixed elements...
183  * ---------------------------------------------------------------------------
184  */
185 #define _BEACON_ITERVAL_                2
186 #define _CAPABILITY_                    2
187 #define _TIMESTAMP_                             8
188
189
190 /*-----------------------------------------------------------------------------
191  *                      Below is the definition for WMM
192  *------------------------------------------------------------------------------
193  */
194 #define _WMM_IE_Length_                         7  /* for WMM STA */
195
196 #endif /* _WIFI_H_ */
197