net:wireless:Support eswin usb wifi ECR6600U
[platform/kernel/linux-starfive.git] / drivers / net / wireless / eswin / ecrnx_compat.h
1 /**\r
2  ******************************************************************************\r
3  *\r
4  * @file ecrnx_compat.h\r
5  *\r
6  * Ensure driver compilation for linux 4.4 to 5.9\r
7  *\r
8  * To avoid too many #if LINUX_VERSION_CODE if the code, when prototype change\r
9  * between different kernel version:\r
10  * - For external function, define a macro whose name is the function name with\r
11  *   _compat suffix and prototype (actually the number of parameter) of the\r
12  *   latest version. Then latest version this macro simply call the function\r
13  *   and for older kernel version it call the function adapting the api.\r
14  * - For internal function (e.g. cfg80211_ops) do the same but the macro name\r
15  *   doesn't need to have the _compat suffix when the function is not used\r
16  *   directly by the driver\r
17  *\r
18  * Copyright (C) ESWIN 2020\r
19  *\r
20  ******************************************************************************\r
21  */\r
22 #ifndef _ECRNX_COMPAT_H_\r
23 #define _ECRNX_COMPAT_H_\r
24 #include <linux/version.h>\r
25 \r
26 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)\r
27 #error "Minimum kernel version supported is 3.8"\r
28 #endif\r
29 \r
30 /******************************************************************************\r
31  * Generic\r
32  *****************************************************************************/\r
33 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)\r
34 #define __bf_shf(x) (__builtin_ffsll(x) - 1)\r
35 #define FIELD_PREP(_mask, _val) \\r
36     (((typeof(_mask))(_val) << __bf_shf(_mask)) & (_mask))\r
37 #else\r
38 #include <linux/bitfield.h>\r
39 #endif // 4.9\r
40 \r
41 #if LINUX_VERSION_CODE > KERNEL_VERSION(5,13,0)\r
42 #define IEEE80211_HE_PHY_CAP3_RX_HE_MU_PPDU_FROM_NON_AP_STA IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU\r
43 #endif\r
44 \r
45 /******************************************************************************\r
46  * CFG80211\r
47  *****************************************************************************/\r
48  \r
49  #if LINUX_VERSION_CODE > KERNEL_VERSION(5, 12, 0)\r
50 #define regulatory_set_wiphy_regd_sync_rtnl regulatory_set_wiphy_regd_sync\r
51 #endif\r
52 \r
53 #if LINUX_VERSION_CODE > KERNEL_VERSION(5, 11, 0)\r
54 #define cfg80211_ch_switch_started_notify(dev, chandef, count) \\r
55     cfg80211_ch_switch_started_notify(dev, chandef, count, 1)\r
56 #endif\r
57 \r
58 #if LINUX_VERSION_CODE < KERNEL_VERSION(5, 1, 0)\r
59 #define WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT      0\r
60 \r
61 #define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_242                    0x00\r
62 #define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_484                    0x40\r
63 #define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_996                    0x80\r
64 #define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_2x996                  0xc0\r
65 #define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_MASK                   0xc0\r
66 \r
67 #define IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_0US           0x00\r
68 #define IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_8US           0x40\r
69 #define IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_16US          0x80\r
70 #define IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_RESERVED      0xc0\r
71 #define IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_MASK          0xc0\r
72 \r
73 #endif // 5.1\r
74 \r
75 #if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0)\r
76 #define cfg80211_notify_new_peer_candidate(dev, addr, ie, ie_len, sig_dbm, gfp) \\r
77     cfg80211_notify_new_peer_candidate(dev, addr, ie, ie_len, gfp)\r
78 \r
79 #define WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT    BIT(5)\r
80 #define WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT    BIT(6)\r
81 \r
82 #endif // 5.0\r
83 \r
84 #define WLAN_EXT_CAPA5_QOS_MAP_SUPPORT           BIT(0)\r
85 \r
86 \r
87 struct ecrnx_element {\r
88     u8 id;\r
89     u8 datalen;\r
90     u8 data[];\r
91 } __packed;\r
92 \r
93 \r
94 #define for_each_ecrnx_element(_elem, _data, _datalen)                  \\r
95         for (_elem = (const struct ecrnx_element *)(_data);                     \\r
96              (const u8 *)(_data) + (_datalen) - (const u8 *)_elem >=    \\r
97                 (int)sizeof(*_elem) &&                                  \\r
98              (const u8 *)(_data) + (_datalen) - (const u8 *)_elem >=    \\r
99                 (int)sizeof(*_elem) + _elem->datalen;                   \\r
100              _elem = (const struct ecrnx_element *)(_elem->data + _elem->datalen))\r
101 \r
102 \r
103 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 19, 0)\r
104 #define IEEE80211_RADIOTAP_HE 23\r
105 #define IEEE80211_RADIOTAP_HE_MU 24\r
106 #endif\r
107 \r
108 \r
109 #if LINUX_VERSION_CODE < KERNEL_VERSION(4,19,0)\r
110 struct ieee80211_radiotap_he {\r
111         __le16 data1, data2, data3, data4, data5, data6;\r
112 };\r
113 \r
114 enum ieee80211_radiotap_he_bits {\r
115     IEEE80211_RADIOTAP_HE_DATA1_FORMAT_MASK             = 3,\r
116     IEEE80211_RADIOTAP_HE_DATA1_FORMAT_SU               = 0,\r
117     IEEE80211_RADIOTAP_HE_DATA1_FORMAT_EXT_SU   = 1,\r
118     IEEE80211_RADIOTAP_HE_DATA1_FORMAT_MU               = 2,\r
119     IEEE80211_RADIOTAP_HE_DATA1_FORMAT_TRIG             = 3,\r
120 \r
121     IEEE80211_RADIOTAP_HE_DATA1_BSS_COLOR_KNOWN = 0x0004,\r
122     IEEE80211_RADIOTAP_HE_DATA1_BEAM_CHANGE_KNOWN       = 0x0008,\r
123     IEEE80211_RADIOTAP_HE_DATA1_UL_DL_KNOWN             = 0x0010,\r
124     IEEE80211_RADIOTAP_HE_DATA1_DATA_MCS_KNOWN  = 0x0020,\r
125     IEEE80211_RADIOTAP_HE_DATA1_DATA_DCM_KNOWN  = 0x0040,\r
126     IEEE80211_RADIOTAP_HE_DATA1_CODING_KNOWN    = 0x0080,\r
127     IEEE80211_RADIOTAP_HE_DATA1_LDPC_XSYMSEG_KNOWN      = 0x0100,\r
128     IEEE80211_RADIOTAP_HE_DATA1_STBC_KNOWN              = 0x0200,\r
129     IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE_KNOWN        = 0x0400,\r
130     IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE2_KNOWN       = 0x0800,\r
131     IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE3_KNOWN       = 0x1000,\r
132     IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE4_KNOWN       = 0x2000,\r
133     IEEE80211_RADIOTAP_HE_DATA1_BW_RU_ALLOC_KNOWN       = 0x4000,\r
134     IEEE80211_RADIOTAP_HE_DATA1_DOPPLER_KNOWN   = 0x8000,\r
135 \r
136     IEEE80211_RADIOTAP_HE_DATA2_PRISEC_80_KNOWN = 0x0001,\r
137     IEEE80211_RADIOTAP_HE_DATA2_GI_KNOWN                = 0x0002,\r
138     IEEE80211_RADIOTAP_HE_DATA2_NUM_LTF_SYMS_KNOWN      = 0x0004,\r
139     IEEE80211_RADIOTAP_HE_DATA2_PRE_FEC_PAD_KNOWN       = 0x0008,\r
140     IEEE80211_RADIOTAP_HE_DATA2_TXBF_KNOWN              = 0x0010,\r
141     IEEE80211_RADIOTAP_HE_DATA2_PE_DISAMBIG_KNOWN       = 0x0020,\r
142     IEEE80211_RADIOTAP_HE_DATA2_TXOP_KNOWN              = 0x0040,\r
143     IEEE80211_RADIOTAP_HE_DATA2_MIDAMBLE_KNOWN  = 0x0080,\r
144     IEEE80211_RADIOTAP_HE_DATA2_RU_OFFSET               = 0x3f00,\r
145     IEEE80211_RADIOTAP_HE_DATA2_RU_OFFSET_KNOWN = 0x4000,\r
146     IEEE80211_RADIOTAP_HE_DATA2_PRISEC_80_SEC   = 0x8000,\r
147 \r
148     IEEE80211_RADIOTAP_HE_DATA3_BSS_COLOR               = 0x003f,\r
149     IEEE80211_RADIOTAP_HE_DATA3_BEAM_CHANGE             = 0x0040,\r
150     IEEE80211_RADIOTAP_HE_DATA3_UL_DL           = 0x0080,\r
151     IEEE80211_RADIOTAP_HE_DATA3_DATA_MCS                = 0x0f00,\r
152     IEEE80211_RADIOTAP_HE_DATA3_DATA_DCM                = 0x1000,\r
153     IEEE80211_RADIOTAP_HE_DATA3_CODING          = 0x2000,\r
154     IEEE80211_RADIOTAP_HE_DATA3_LDPC_XSYMSEG    = 0x4000,\r
155     IEEE80211_RADIOTAP_HE_DATA3_STBC            = 0x8000,\r
156 \r
157     IEEE80211_RADIOTAP_HE_DATA4_SU_MU_SPTL_REUSE        = 0x000f,\r
158     IEEE80211_RADIOTAP_HE_DATA4_MU_STA_ID               = 0x7ff0,\r
159     IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE1  = 0x000f,\r
160     IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE2  = 0x00f0,\r
161     IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE3  = 0x0f00,\r
162     IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE4  = 0xf000,\r
163 \r
164     IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC        = 0x000f,\r
165     IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_20MHZ  = 0,\r
166     IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_40MHZ  = 1,\r
167     IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_80MHZ  = 2,\r
168     IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_160MHZ = 3,\r
169     IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_26T    = 4,\r
170     IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_52T    = 5,\r
171     IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_106T   = 6,\r
172     IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_242T   = 7,\r
173     IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_484T   = 8,\r
174     IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_996T   = 9,\r
175     IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_2x996T = 10,\r
176 \r
177     IEEE80211_RADIOTAP_HE_DATA5_GI                      = 0x0030,\r
178     IEEE80211_RADIOTAP_HE_DATA5_GI_0_8                  = 0,\r
179     IEEE80211_RADIOTAP_HE_DATA5_GI_1_6                  = 1,\r
180     IEEE80211_RADIOTAP_HE_DATA5_GI_3_2                  = 2,\r
181 \r
182     IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE                = 0x00c0,\r
183     IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE_UNKNOWN                = 0,\r
184     IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE_1X                     = 1,\r
185     IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE_2X                     = 2,\r
186     IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE_4X                     = 3,\r
187     IEEE80211_RADIOTAP_HE_DATA5_NUM_LTF_SYMS    = 0x0700,\r
188     IEEE80211_RADIOTAP_HE_DATA5_PRE_FEC_PAD             = 0x3000,\r
189     IEEE80211_RADIOTAP_HE_DATA5_TXBF            = 0x4000,\r
190     IEEE80211_RADIOTAP_HE_DATA5_PE_DISAMBIG             = 0x8000,\r
191 \r
192     IEEE80211_RADIOTAP_HE_DATA6_NSTS            = 0x000f,\r
193     IEEE80211_RADIOTAP_HE_DATA6_DOPPLER         = 0x0010,\r
194     IEEE80211_RADIOTAP_HE_DATA6_TXOP            = 0x7f00,\r
195     IEEE80211_RADIOTAP_HE_DATA6_MIDAMBLE_PDCTY  = 0x8000,\r
196     };\r
197 \r
198 struct ieee80211_radiotap_he_mu {\r
199         __le16 flags1, flags2;\r
200         u8 ru_ch1[4];\r
201         u8 ru_ch2[4];\r
202 };\r
203 \r
204 enum ieee80211_radiotap_he_mu_bits {\r
205     IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_MCS           = 0x000f,\r
206     IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_MCS_KNOWN             = 0x0010,\r
207     IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_DCM           = 0x0020,\r
208     IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_DCM_KNOWN             = 0x0040,\r
209     IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH2_CTR_26T_RU_KNOWN        = 0x0080,\r
210     IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_RU_KNOWN                = 0x0100,\r
211     IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH2_RU_KNOWN                = 0x0200,\r
212     IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_CTR_26T_RU_KNOWN        = 0x1000,\r
213     IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_CTR_26T_RU              = 0x2000,\r
214     IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_COMP_KNOWN    = 0x4000,\r
215     IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_SYMS_USERS_KNOWN      = 0x8000,\r
216 \r
217     IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW    = 0x0003,\r
218     IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_20MHZ      = 0x0000,\r
219     IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_40MHZ      = 0x0001,\r
220     IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_80MHZ      = 0x0002,\r
221     IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_160MHZ     = 0x0003,\r
222     IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_KNOWN      = 0x0004,\r
223     IEEE80211_RADIOTAP_HE_MU_FLAGS2_SIG_B_COMP          = 0x0008,\r
224     IEEE80211_RADIOTAP_HE_MU_FLAGS2_SIG_B_SYMS_USERS    = 0x00f0,\r
225     IEEE80211_RADIOTAP_HE_MU_FLAGS2_PUNC_FROM_SIG_A_BW  = 0x0300,\r
226     IEEE80211_RADIOTAP_HE_MU_FLAGS2_PUNC_FROM_SIG_A_BW_KNOWN= 0x0400,\r
227     IEEE80211_RADIOTAP_HE_MU_FLAGS2_CH2_CTR_26T_RU              = 0x0800,\r
228 };\r
229 \r
230 enum {\r
231     IEEE80211_HE_MCS_SUPPORT_0_7    = 0,\r
232     IEEE80211_HE_MCS_SUPPORT_0_9    = 1,\r
233     IEEE80211_HE_MCS_SUPPORT_0_11   = 2,\r
234     IEEE80211_HE_MCS_NOT_SUPPORTED  = 3,\r
235 };\r
236 #endif // 4.19\r
237 \r
238 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 17, 0)\r
239 #define cfg80211_probe_status(ndev, addr, cookie, ack, ack_pwr, pwr_valid, gfp) \\r
240     cfg80211_probe_status(ndev, addr, cookie, ack, gfp)\r
241 #endif // 4.17\r
242 \r
243 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0)\r
244 #define cfg80211_disconnected(dev, reason, ie, len, local, gfp) \\r
245         cfg80211_disconnected(dev, reason, ie, len, gfp)\r
246 #endif\r
247 \r
248 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0)\r
249 #define ieee80211_chandef_to_operating_class(chan_def, op_class) 0\r
250 #endif\r
251 \r
252 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0)\r
253 #define ecrnx_cfg80211_add_iface(wiphy, name, name_assign_type, type, params) \\r
254     ecrnx_cfg80211_add_iface(wiphy, name, name_assign_type, type, u32 *flags, params)\r
255 \r
256 #define ecrnx_cfg80211_change_iface(wiphy, dev, type, params) \\r
257     ecrnx_cfg80211_change_iface(wiphy, dev, type, u32 *flags, params)\r
258 \r
259 #define CCFS0(vht) vht->center_freq_seg1_idx\r
260 #define CCFS1(vht) vht->center_freq_seg2_idx\r
261 \r
262 #if 0\r
263 #define nla_parse(tb, maxtype, head, len, policy, extack)       \\r
264     nla_parse(tb, maxtype, head, len, policy)\r
265 #endif\r
266 \r
267 struct cfg80211_roam_info {\r
268         struct ieee80211_channel *channel;\r
269         struct cfg80211_bss *bss;\r
270         const u8 *bssid;\r
271         const u8 *req_ie;\r
272         size_t req_ie_len;\r
273         const u8 *resp_ie;\r
274         size_t resp_ie_len;\r
275 };\r
276 \r
277 #define cfg80211_roamed(_dev, _info, _gfp) \\r
278     cfg80211_roamed(_dev, (_info)->channel, (_info)->bssid, (_info)->req_ie, \\r
279                     (_info)->req_ie_len, (_info)->resp_ie, (_info)->resp_ie_len, _gfp)\r
280 \r
281 #else // 4.12\r
282 \r
283 #define CCFS0(vht) vht->center_freq_seg0_idx\r
284 #define CCFS1(vht) vht->center_freq_seg1_idx\r
285 #endif // 4.12\r
286 \r
287 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)\r
288 #define ecrnx_cfg80211_cqm_rssi_notify(dev, event, level, gfp) \\r
289     cfg80211_cqm_rssi_notify(dev, event, gfp)\r
290 #else\r
291 #define ecrnx_cfg80211_cqm_rssi_notify(dev, event, level, gfp) \\r
292     cfg80211_cqm_rssi_notify(dev, event, level, gfp)\r
293 #endif // 4.11\r
294 \r
295 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)\r
296 #define ieee80211_amsdu_to_8023s(skb, list, addr, iftype, extra_headroom, check_da, check_sa) \\r
297     ieee80211_amsdu_to_8023s(skb, list, addr, iftype, extra_headroom, false)\r
298 #endif // 4.9\r
299 \r
300 #if LINUX_VERSION_CODE  < KERNEL_VERSION(4, 7, 0)\r
301 #define NUM_NL80211_BANDS IEEE80211_NUM_BANDS\r
302 #endif // 4.7\r
303 \r
304 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)\r
305 #define SURVEY_INFO_TIME          SURVEY_INFO_CHANNEL_TIME\r
306 #define SURVEY_INFO_TIME_BUSY     SURVEY_INFO_CHANNEL_TIME_BUSY\r
307 #define SURVEY_INFO_TIME_EXT_BUSY SURVEY_INFO_CHANNEL_TIME_EXT_BUSY\r
308 #define SURVEY_INFO_TIME_RX       SURVEY_INFO_CHANNEL_TIME_RX\r
309 #define SURVEY_INFO_TIME_TX       SURVEY_INFO_CHANNEL_TIME_TX\r
310 \r
311 #define SURVEY_TIME(s) s->channel_time\r
312 #define SURVEY_TIME_BUSY(s) s->channel_time_busy\r
313 #else\r
314 #define SURVEY_TIME(s) s->time\r
315 #define SURVEY_TIME_BUSY(s) s->time_busy\r
316 #endif\r
317 \r
318 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)\r
319 #define cfg80211_ch_switch_started_notify(dev, chandef, count)\r
320 \r
321 #define WLAN_BSS_COEX_INFORMATION_REQUEST       BIT(0)\r
322 #define WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING    BIT(2)\r
323 #define WLAN_EXT_CAPA4_TDLS_BUFFER_STA          BIT(4)\r
324 #define WLAN_EXT_CAPA4_TDLS_PEER_PSM            BIT(5)\r
325 #define WLAN_EXT_CAPA4_TDLS_CHAN_SWITCH         BIT(6)\r
326 #define WLAN_EXT_CAPA5_TDLS_CH_SW_PROHIBITED    BIT(7)\r
327 #define NL80211_FEATURE_TDLS_CHANNEL_SWITCH     0\r
328 \r
329 #define STA_TDLS_INITIATOR(sta) 0\r
330 \r
331 #define REGULATORY_IGNORE_STALE_KICKOFF 0\r
332 #else\r
333 #define STA_TDLS_INITIATOR(sta) sta->tdls_initiator\r
334 #endif\r
335 \r
336 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 18, 0)) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 0))\r
337 #define cfg80211_rx_mgmt(wdev, freq, rssi, buf, len, flags)             \\r
338         cfg80211_rx_mgmt(wdev, freq, rssi, buf, len, flags, GFP_ATOMIC)\r
339 #elif LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0)\r
340 #define cfg80211_rx_mgmt(wdev, freq, rssi, buf, len, flags)             \\r
341         cfg80211_rx_mgmt(wdev, freq, rssi, buf, len, GFP_ATOMIC)\r
342 #endif\r
343 \r
344 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)\r
345 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 15, 0)\r
346 #define rwnx_cfg80211_tdls_mgmt(wiphy, dev, peer, act, tok, status, peer_capability, initiator, buf, len) \\r
347     rwnx_cfg80211_tdls_mgmt(wiphy, dev, peer, act, tok, status, peer_capability, buf, len)\r
348 #else\r
349 #define rwnx_cfg80211_tdls_mgmt(wiphy, dev, peer, act, tok, status, peer_capability, initiator, buf, len) \\r
350     rwnx_cfg80211_tdls_mgmt(wiphy, dev, peer, act, tok, status, buf, len)\r
351 #endif\r
352 \r
353 #include <linux/types.h>\r
354 \r
355 struct ieee80211_wmm_ac_param {\r
356         u8 aci_aifsn; /* AIFSN, ACM, ACI */\r
357         u8 cw; /* ECWmin, ECWmax (CW = 2^ECW - 1) */\r
358         __le16 txop_limit;\r
359 } __packed;\r
360 \r
361 struct ieee80211_wmm_param_ie {\r
362         u8 element_id; /* Element ID: 221 (0xdd); */\r
363         u8 len; /* Length: 24 */\r
364         /* required fields for WMM version 1 */\r
365         u8 oui[3]; /* 00:50:f2 */\r
366         u8 oui_type; /* 2 */\r
367         u8 oui_subtype; /* 1 */\r
368         u8 version; /* 1 for WMM version 1.0 */\r
369         u8 qos_info; /* AP/STA specific QoS info */\r
370         u8 reserved; /* 0 */\r
371         /* AC_BE, AC_BK, AC_VI, AC_VO */\r
372         struct ieee80211_wmm_ac_param ac[4];\r
373 } __packed;\r
374 #endif\r
375 \r
376 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)\r
377 /**\r
378  * struct cfg80211_update_ft_ies_params - FT IE Information\r
379  *\r
380  * This structure provides information needed to update the fast transition IE\r
381  *\r
382  * @md: The Mobility Domain ID, 2 Octet value\r
383  * @ie: Fast Transition IEs\r
384  * @ie_len: Length of ft_ie in octets\r
385  */\r
386 struct cfg80211_update_ft_ies_params {\r
387         u16 md;\r
388         const u8 *ie;\r
389         size_t ie_len;\r
390 };\r
391 #endif\r
392 \r
393 /******************************************************************************\r
394  * MAC80211\r
395  *****************************************************************************/\r
396 #if LINUX_VERSION_CODE < KERNEL_VERSION(5, 3, 0)\r
397 #define ecrnx_ops_cancel_remain_on_channel(hw, vif) \\r
398     ecrnx_ops_cancel_remain_on_channel(hw)\r
399 #endif // 5.3\r
400 \r
401 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 18, 0)\r
402 #define ecrnx_ops_mgd_prepare_tx(hw, vif, duration) \\r
403     ecrnx_ops_mgd_prepare_tx(hw, vif)\r
404 #endif // 4.18\r
405 \r
406 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0)\r
407 \r
408 #define RX_ENC_HT(s) s->flag |= RX_FLAG_HT\r
409 #define RX_ENC_HT_GF(s) s->flag |= (RX_FLAG_HT | RX_FLAG_HT_GF)\r
410 #define RX_ENC_VHT(s) s->flag |= RX_FLAG_HT\r
411 #define RX_ENC_HE(s) s->flag |= RX_FLAG_HT\r
412 #define RX_ENC_FLAG_SHORT_GI(s) s->flag |= RX_FLAG_SHORT_GI\r
413 #define RX_ENC_FLAG_SHORT_PRE(s) s->flag |= RX_FLAG_SHORTPRE\r
414 #define RX_ENC_FLAG_LDPC(s) s->flag |= RX_FLAG_LDPC\r
415 #define RX_BW_40MHZ(s) s->flag |= RX_FLAG_40MHZ\r
416 #define RX_BW_80MHZ(s) s->vht_flag |= RX_VHT_FLAG_80MHZ\r
417 #define RX_BW_160MHZ(s) s->vht_flag |= RX_VHT_FLAG_160MHZ\r
418 #define RX_NSS(s) s->vht_nss\r
419 \r
420 #else\r
421 #define RX_ENC_HT(s) s->encoding = RX_ENC_HT\r
422 #define RX_ENC_HT_GF(s) { s->encoding = RX_ENC_HT;      \\r
423         s->enc_flags |= RX_ENC_FLAG_HT_GF; }\r
424 #define RX_ENC_VHT(s) s->encoding = RX_ENC_VHT\r
425 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 19, 0)\r
426 #define RX_ENC_HE(s) s->encoding = RX_ENC_VHT\r
427 #else\r
428 #define RX_ENC_HE(s) s->encoding = RX_ENC_HE\r
429 #endif\r
430 #define RX_ENC_FLAG_SHORT_GI(s) s->enc_flags |= RX_ENC_FLAG_SHORT_GI\r
431 #define RX_ENC_FLAG_SHORT_PRE(s) s->enc_flags |= RX_ENC_FLAG_SHORTPRE\r
432 #define RX_ENC_FLAG_LDPC(s) s->enc_flags |= RX_ENC_FLAG_LDPC\r
433 #define RX_BW_40MHZ(s) s->bw = RATE_INFO_BW_40\r
434 #define RX_BW_80MHZ(s) s->bw = RATE_INFO_BW_80\r
435 #define RX_BW_160MHZ(s) s->bw = RATE_INFO_BW_160\r
436 #define RX_NSS(s) s->nss\r
437 \r
438 #endif // 4.12\r
439 \r
440 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)\r
441 #define ecrnx_ieee80211_cqm_rssi_notify(vif, event, level, gfp) \\r
442     ieee80211_cqm_rssi_notify(vif, event, gfp)\r
443 #else\r
444 #define ecrnx_ieee80211_cqm_rssi_notify(vif, event, level, gfp) \\r
445     ieee80211_cqm_rssi_notify(vif, event, level, gfp)    \r
446 #endif // 4.11\r
447 \r
448 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0)\r
449 #define RX_FLAG_MIC_STRIPPED 0\r
450 #endif // 4.7\r
451 \r
452 #ifndef CONFIG_VENDOR_ECRNX_AMSDUS_TX\r
453 #if  (LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0))\r
454 #define ecrnx_ops_ampdu_action(hw, vif, params) \\r
455     ecrnx_ops_ampdu_action(hw, vif, enum ieee80211_ampdu_mlme_action action, \\r
456                           struct ieee80211_sta *sta, u16 tid, u16 *ssn, u8 buf_size, \\r
457                           bool amsdu)\r
458 #endif // 4.6\r
459 #endif /* CONFIG_VENDOR_ECRNX_AMSDUS_TX */\r
460 \r
461 /******************************************************************************\r
462  * NET\r
463  *****************************************************************************/\r
464 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)\r
465 #define rwnx_select_queue(dev, skb, sb_dev) \\r
466         rwnx_select_queue(dev, skb)\r
467 #elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 19, 0)\r
468 #define ecrnx_select_queue(dev, skb, sb_dev) \\r
469     ecrnx_select_queue(dev, skb, void *accel_priv, select_queue_fallback_t fallback)\r
470 #elif LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0)\r
471 #define ecrnx_select_queue(dev, skb, sb_dev) \\r
472     ecrnx_select_queue(dev, skb, sb_dev, select_queue_fallback_t fallback)\r
473 #endif //3.13\r
474 \r
475 #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0)) && !(defined CONFIG_VENDOR_ECRNX)\r
476 #define sk_pacing_shift_update(sk, shift)\r
477 #endif // 4.16\r
478 \r
479 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)\r
480 #define alloc_netdev_mqs(size, name, assign, setup, txqs, rxqs) \\r
481     alloc_netdev_mqs(size, name, setup, txqs, rxqs)\r
482 #endif\r
483 \r
484 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)\r
485 #define NET_NAME_UNKNOWN 0\r
486 #endif\r
487 \r
488 /******************************************************************************\r
489  * TRACE\r
490  *****************************************************************************/\r
491 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0)\r
492 #define trace_print_symbols_seq ftrace_print_symbols_seq\r
493 #endif // 4.2\r
494 \r
495 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)\r
496 #define trace_seq_buffer_ptr(p) p->buffer + p->len\r
497 #endif\r
498 \r
499 /******************************************************************************\r
500  * TIME\r
501  *****************************************************************************/\r
502 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 8, 0)\r
503 #define time64_to_tm(t, o, tm) time_to_tm((time_t)t, o, tm)\r
504 #endif // 4.8\r
505 \r
506 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)\r
507 #define ktime_get_real_seconds get_seconds\r
508 #endif\r
509 \r
510 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)\r
511 typedef __s64 time64_t;\r
512 #endif\r
513 \r
514 /******************************************************************************\r
515  * timer\r
516  *****************************************************************************/\r
517 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0)\r
518 #define from_timer(var, callback_timer, timer_fieldname) \\r
519         container_of(callback_timer, typeof(*var), timer_fieldname)\r
520 \r
521 #define timer_setup(timer, callback, flags) \\r
522     __setup_timer(timer, (void (*)(unsigned long))callback, (unsigned long)timer, flags)\r
523 #endif // 4.14\r
524 \r
525 #endif /* _ECRNX_COMPAT_H_ */\r