2 ******************************************************************************
\r
4 * @file ecrnx_compat.h
\r
6 * Ensure driver compilation for linux 4.4 to 5.9
\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
18 * Copyright (C) ESWIN 2020
\r
20 ******************************************************************************
\r
22 #ifndef _ECRNX_COMPAT_H_
\r
23 #define _ECRNX_COMPAT_H_
\r
24 #include <linux/version.h>
\r
26 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)
\r
27 #error "Minimum kernel version supported is 3.8"
\r
30 /******************************************************************************
\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
38 #include <linux/bitfield.h>
\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
45 /******************************************************************************
\r
47 *****************************************************************************/
\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
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
58 #if LINUX_VERSION_CODE < KERNEL_VERSION(5, 1, 0)
\r
59 #define WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT 0
\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
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
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
79 #define WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT BIT(5)
\r
80 #define WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT BIT(6)
\r
84 #define WLAN_EXT_CAPA5_QOS_MAP_SUPPORT BIT(0)
\r
87 struct ecrnx_element {
\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
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
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
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
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
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
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
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
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
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
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
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
198 struct ieee80211_radiotap_he_mu {
\r
199 __le16 flags1, flags2;
\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
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
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
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
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
248 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0)
\r
249 #define ieee80211_chandef_to_operating_class(chan_def, op_class) 0
\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
256 #define ecrnx_cfg80211_change_iface(wiphy, dev, type, params) \
\r
257 ecrnx_cfg80211_change_iface(wiphy, dev, type, u32 *flags, params)
\r
259 #define CCFS0(vht) vht->center_freq_seg1_idx
\r
260 #define CCFS1(vht) vht->center_freq_seg2_idx
\r
263 #define nla_parse(tb, maxtype, head, len, policy, extack) \
\r
264 nla_parse(tb, maxtype, head, len, policy)
\r
267 struct cfg80211_roam_info {
\r
268 struct ieee80211_channel *channel;
\r
269 struct cfg80211_bss *bss;
\r
274 size_t resp_ie_len;
\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
283 #define CCFS0(vht) vht->center_freq_seg0_idx
\r
284 #define CCFS1(vht) vht->center_freq_seg1_idx
\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
291 #define ecrnx_cfg80211_cqm_rssi_notify(dev, event, level, gfp) \
\r
292 cfg80211_cqm_rssi_notify(dev, event, level, gfp)
\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
300 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0)
\r
301 #define NUM_NL80211_BANDS IEEE80211_NUM_BANDS
\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
311 #define SURVEY_TIME(s) s->channel_time
\r
312 #define SURVEY_TIME_BUSY(s) s->channel_time_busy
\r
314 #define SURVEY_TIME(s) s->time
\r
315 #define SURVEY_TIME_BUSY(s) s->time_busy
\r
318 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
\r
319 #define cfg80211_ch_switch_started_notify(dev, chandef, count)
\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
329 #define STA_TDLS_INITIATOR(sta) 0
\r
331 #define REGULATORY_IGNORE_STALE_KICKOFF 0
\r
333 #define STA_TDLS_INITIATOR(sta) sta->tdls_initiator
\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
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
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
353 #include <linux/types.h>
\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
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
376 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
\r
378 * struct cfg80211_update_ft_ies_params - FT IE Information
\r
380 * This structure provides information needed to update the fast transition IE
\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
386 struct cfg80211_update_ft_ies_params {
\r
393 /******************************************************************************
\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
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
406 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0)
\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
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
428 #define RX_ENC_HE(s) s->encoding = RX_ENC_HE
\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
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
444 #define ecrnx_ieee80211_cqm_rssi_notify(vif, event, level, gfp) \
\r
445 ieee80211_cqm_rssi_notify(vif, event, level, gfp)
\r
448 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0)
\r
449 #define RX_FLAG_MIC_STRIPPED 0
\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
459 #endif /* CONFIG_VENDOR_ECRNX_AMSDUS_TX */
\r
461 /******************************************************************************
\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
475 #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0)) && !(defined CONFIG_VENDOR_ECRNX)
\r
476 #define sk_pacing_shift_update(sk, shift)
\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
484 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
\r
485 #define NET_NAME_UNKNOWN 0
\r
488 /******************************************************************************
\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
495 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
\r
496 #define trace_seq_buffer_ptr(p) p->buffer + p->len
\r
499 /******************************************************************************
\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
506 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
\r
507 #define ktime_get_real_seconds get_seconds
\r
510 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
\r
511 typedef __s64 time64_t;
\r
514 /******************************************************************************
\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
521 #define timer_setup(timer, callback, flags) \
\r
522 __setup_timer(timer, (void (*)(unsigned long))callback, (unsigned long)timer, flags)
\r
525 #endif /* _ECRNX_COMPAT_H_ */
\r