xref: /freebsd/sys/compat/linuxkpi/common/src/linux_80211.h (revision dd21556857e8d40f66bf5ad54754d9d52669ebf7)
1 /*-
2  * Copyright (c) 2020-2023 The FreeBSD Foundation
3  * Copyright (c) 2020-2021 Bjoern A. Zeeb
4  *
5  * This software was developed by Björn Zeeb under sponsorship from
6  * the FreeBSD Foundation.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  */
29 
30 /*
31  * Public functions are called linuxkpi_*().
32  * Internal (static) functions are called lkpi_*().
33  *
34  * The internal structures holding metadata over public structures are also
35  * called lkpi_xxx (usually with a member at the end called xxx).
36  * Note: we do not replicate the structure names but the general variable names
37  * for these (e.g., struct hw -> struct lkpi_hw, struct sta -> struct lkpi_sta).
38  * There are macros to access one from the other.
39  * We call the internal versions lxxx (e.g., hw -> lhw, sta -> lsta).
40  */
41 
42 #ifndef _LKPI_SRC_LINUX_80211_H
43 #define _LKPI_SRC_LINUX_80211_H
44 
45 #include "opt_wlan.h"
46 
47 #if defined(IEEE80211_DEBUG) && !defined(LINUXKPI_DEBUG_80211)
48 #define	LINUXKPI_DEBUG_80211
49 #endif
50 
51 /* #define	LINUXKPI_DEBUG_80211 */
52 
53 #ifndef	D80211_TODO
54 #define	D80211_TODO		0x00000001
55 #endif
56 #ifndef D80211_IMPROVE
57 #define	D80211_IMPROVE		0x00000002
58 #endif
59 #define	D80211_IMPROVE_TXQ	0x00000004
60 #define	D80211_TRACE		0x00000010
61 #define	D80211_TRACEOK		0x00000020
62 #define	D80211_TRACE_TX		0x00000100
63 #define	D80211_TRACE_TX_DUMP	0x00000200
64 #define	D80211_TRACE_RX		0x00001000
65 #define	D80211_TRACE_RX_DUMP	0x00002000
66 #define	D80211_TRACE_RX_BEACONS	0x00004000
67 #define	D80211_TRACEX		(D80211_TRACE_TX|D80211_TRACE_RX)
68 #define	D80211_TRACEX_DUMP	(D80211_TRACE_TX_DUMP|D80211_TRACE_RX_DUMP)
69 #define	D80211_TRACE_STA	0x00010000
70 #define	D80211_TRACE_MO		0x00100000
71 #define	D80211_TRACE_MODE	0x0f000000
72 #define	D80211_TRACE_MODE_HT	0x01000000
73 #define	D80211_TRACE_MODE_VHT	0x02000000
74 #define	D80211_TRACE_MODE_HE	0x04000000
75 #define	D80211_TRACE_MODE_EHT	0x08000000
76 
77 #define	IMPROVE_TXQ(...)						\
78     if (linuxkpi_debug_80211 & D80211_IMPROVE_TXQ)			\
79 	printf("%s:%d: XXX LKPI80211 IMPROVE_TXQ\n", __func__, __LINE__)
80 
81 #define	IMPROVE_HT(fmt, ...)						\
82     if (linuxkpi_debug_80211 & D80211_TRACE_MODE_HT)			\
83 	printf("%s:%d: XXX LKPI80211 IMPROVE_HT " fmt "\n",		\
84 	    __func__, __LINE__, ##__VA_ARGS__);
85 
86 #define	MTAG_ABI_LKPI80211	1707696513	/* LinuxKPI 802.11 KBI */
87 
88 /*
89  * Deferred RX path.
90  * We need to pass *ni along (and possibly more in the future so
91  * we use a struct right from the start.
92  */
93 #define	LKPI80211_TAG_RXNI	0		/* deferred RX path */
94 struct lkpi_80211_tag_rxni {
95 	struct ieee80211_node	*ni;		/* MUST hold a reference to it. */
96 };
97 
98 struct lkpi_radiotap_tx_hdr {
99 	struct ieee80211_radiotap_header wt_ihdr;
100 	uint8_t		wt_flags;
101 	uint8_t		wt_rate;
102 	uint16_t	wt_chan_freq;
103 	uint16_t	wt_chan_flags;
104 } __packed;
105 #define	LKPI_RTAP_TX_FLAGS_PRESENT					\
106 	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
107 	 (1 << IEEE80211_RADIOTAP_RATE) |				\
108 	 (1 << IEEE80211_RADIOTAP_CHANNEL))
109 
110 struct lkpi_radiotap_rx_hdr {
111 	struct ieee80211_radiotap_header wr_ihdr;
112 	uint64_t	wr_tsft;
113 	uint8_t		wr_flags;
114 	uint8_t		wr_rate;
115 	uint16_t	wr_chan_freq;
116 	uint16_t	wr_chan_flags;
117 	int8_t		wr_dbm_antsignal;
118 	int8_t		wr_dbm_antnoise;
119 } __packed __aligned(8);
120 #define	LKPI_RTAP_RX_FLAGS_PRESENT					\
121 	((1 << IEEE80211_RADIOTAP_TSFT) |				\
122 	 (1 << IEEE80211_RADIOTAP_FLAGS) |				\
123 	 (1 << IEEE80211_RADIOTAP_RATE) |				\
124 	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
125 	 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) |			\
126 	 (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE))
127 
128 struct lkpi_txq {
129 	TAILQ_ENTRY(lkpi_txq)	txq_entry;
130 
131 	struct mtx		ltxq_mtx;
132 	bool			seen_dequeue;
133 	bool			stopped;
134 	uint32_t		txq_generation;
135 	struct sk_buff_head	skbq;
136 
137 	/* Must be last! */
138 	struct ieee80211_txq	txq __aligned(CACHE_LINE_SIZE);
139 };
140 #define	TXQ_TO_LTXQ(_txq)	container_of(_txq, struct lkpi_txq, txq)
141 
142 
143 struct lkpi_sta {
144         TAILQ_ENTRY(lkpi_sta)	lsta_entry;
145 	struct ieee80211_node	*ni;
146 
147 	/* Deferred TX path. */
148 	/* Eventually we might want to migrate this into net80211 entirely. */
149 	/* XXX-BZ can we use sta->txq[] instead directly? */
150 	struct task		txq_task;
151 	struct mbufq		txq;
152 	struct mtx		txq_mtx;
153 
154 	struct ieee80211_key_conf *kc;
155 	enum ieee80211_sta_state state;
156 	bool			txq_ready;			/* Can we run the taskq? */
157 	bool			added_to_drv;			/* Driver knows; i.e. we called ...(). */
158 	bool			in_mgd;				/* XXX-BZ should this be per-vif? */
159 
160 	/* Must be last! */
161 	struct ieee80211_sta	sta __aligned(CACHE_LINE_SIZE);
162 };
163 #define	STA_TO_LSTA(_sta)	container_of(_sta, struct lkpi_sta, sta)
164 #define	LSTA_TO_STA(_lsta)	(&(_lsta)->sta)
165 
166 struct lkpi_vif {
167         TAILQ_ENTRY(lkpi_vif)	lvif_entry;
168 	struct ieee80211vap	iv_vap;
169 	eventhandler_tag	lvif_ifllevent;
170 
171 	struct mtx		mtx;
172 	struct wireless_dev	wdev;
173 
174 	/* Other local stuff. */
175 	int			(*iv_newstate)(struct ieee80211vap *,
176 				    enum ieee80211_state, int);
177 	struct ieee80211_node *	(*iv_update_bss)(struct ieee80211vap *,
178 				    struct ieee80211_node *);
179 	TAILQ_HEAD(, lkpi_sta)	lsta_head;
180 	struct lkpi_sta		*lvif_bss;
181 	bool			lvif_bss_synched;
182 	bool			added_to_drv;			/* Driver knows; i.e. we called add_interface(). */
183 
184 	bool			hw_queue_stopped[IEEE80211_NUM_ACS];
185 
186 	/* Must be last! */
187 	struct ieee80211_vif	vif __aligned(CACHE_LINE_SIZE);
188 };
189 #define	VAP_TO_LVIF(_vap)	container_of(_vap, struct lkpi_vif, iv_vap)
190 #define	LVIF_TO_VAP(_lvif)	(&(_lvif)->iv_vap)
191 #define	VIF_TO_LVIF(_vif)	container_of(_vif, struct lkpi_vif, vif)
192 #define	LVIF_TO_VIF(_lvif)	(&(_lvif)->vif)
193 
194 
195 struct lkpi_hw {	/* name it mac80211_sc? */
196 	const struct ieee80211_ops	*ops;
197 	struct ieee80211_scan_request	*hw_req;
198 	struct workqueue_struct		*workq;
199 
200 	/* FreeBSD specific compat. */
201 	/* Linux device is in hw.wiphy->dev after SET_IEEE80211_DEV(). */
202 	struct ieee80211com		*ic;
203 	struct lkpi_radiotap_tx_hdr	rtap_tx;
204 	struct lkpi_radiotap_rx_hdr	rtap_rx;
205 
206 	TAILQ_HEAD(, lkpi_vif)		lvif_head;
207 	struct sx			lvif_sx;
208 
209 	struct sx			sx;			/* XXX-BZ Can this be wiphy->mtx in the future? */
210 
211 	struct mtx			txq_mtx;
212 	uint32_t			txq_generation[IEEE80211_NUM_ACS];
213 	TAILQ_HEAD(, lkpi_txq)		scheduled_txqs[IEEE80211_NUM_ACS];
214 
215 	/* Deferred RX path. */
216 	struct task		rxq_task;
217 	struct mbufq		rxq;
218 	struct mtx		rxq_mtx;
219 
220 	/* Scan functions we overload to handle depending on scan mode. */
221 	void                    (*ic_scan_curchan)(struct ieee80211_scan_state *,
222 				    unsigned long);
223 	void                    (*ic_scan_mindwell)(struct ieee80211_scan_state *);
224 
225 	/* Node functions we overload to sync state. */
226 	struct ieee80211_node *	(*ic_node_alloc)(struct ieee80211vap *,
227 				    const uint8_t [IEEE80211_ADDR_LEN]);
228 	int			(*ic_node_init)(struct ieee80211_node *);
229 	void			(*ic_node_cleanup)(struct ieee80211_node *);
230 	void			(*ic_node_free)(struct ieee80211_node *);
231 
232 	/* HT and later functions. */
233 	int			(*ic_recv_action)(struct ieee80211_node *,
234 				    const struct ieee80211_frame *,
235 				    const uint8_t *, const uint8_t *);
236 	int			(*ic_send_action)(struct ieee80211_node *,
237 				    int, int, void *);
238 	int			(*ic_ampdu_enable)(struct ieee80211_node *,
239 				    struct ieee80211_tx_ampdu *);
240 	int			(*ic_addba_request)(struct ieee80211_node *,
241 				    struct ieee80211_tx_ampdu *, int, int, int);
242 	int			(*ic_addba_response)(struct ieee80211_node *,
243 				    struct ieee80211_tx_ampdu *, int, int, int);
244 	void			(*ic_addba_stop)(struct ieee80211_node *,
245 				    struct ieee80211_tx_ampdu *);
246 	void			(*ic_addba_response_timeout)(struct ieee80211_node *,
247 				    struct ieee80211_tx_ampdu *);
248 	void			(*ic_bar_response)(struct ieee80211_node *,
249 				    struct ieee80211_tx_ampdu *, int);
250 	int			(*ic_ampdu_rx_start)(struct ieee80211_node *,
251 				    struct ieee80211_rx_ampdu *, int, int, int);
252 	void			(*ic_ampdu_rx_stop)(struct ieee80211_node *,
253 				    struct ieee80211_rx_ampdu *);
254 
255 #define	LKPI_MAC80211_DRV_STARTED	0x00000001
256 	uint32_t			sc_flags;
257 #define	LKPI_LHW_SCAN_RUNNING		0x00000001
258 #define	LKPI_LHW_SCAN_HW		0x00000002
259 	uint32_t			scan_flags;
260 	struct mtx			scan_mtx;
261 
262 	int				supbands;	/* Number of supported bands. */
263 	int				max_rates;	/* Maximum number of bitrates supported in any channel. */
264 	int				scan_ie_len;	/* Length of common per-band scan IEs. */
265 
266 	bool				update_mc;
267 	bool				update_wme;
268 	bool				rxq_stopped;
269 
270 	/* Must be last! */
271 	struct ieee80211_hw		hw __aligned(CACHE_LINE_SIZE);
272 };
273 #define	LHW_TO_HW(_lhw)		(&(_lhw)->hw)
274 #define	HW_TO_LHW(_hw)		container_of(_hw, struct lkpi_hw, hw)
275 
276 struct lkpi_chanctx {
277 	bool				added_to_drv;	/* Managed by MO */
278 	struct ieee80211_chanctx_conf	chanctx_conf __aligned(CACHE_LINE_SIZE);
279 };
280 #define	LCHANCTX_TO_CHANCTX_CONF(_lchanctx)		\
281     (&(_lchanctx)->chanctx_conf)
282 #define	CHANCTX_CONF_TO_LCHANCTX(_conf)			\
283     container_of(_conf, struct lkpi_chanctx, chanctx_conf)
284 
285 struct lkpi_wiphy {
286 	const struct cfg80211_ops	*ops;
287 
288 	struct work_struct		wwk;
289 	struct list_head		wwk_list;
290 	struct mtx			wwk_mtx;
291 
292 	/* Must be last! */
293 	struct wiphy			wiphy __aligned(CACHE_LINE_SIZE);
294 };
295 #define	WIPHY_TO_LWIPHY(_wiphy)	container_of(_wiphy, struct lkpi_wiphy, wiphy)
296 #define	LWIPHY_TO_WIPHY(_lwiphy)	(&(_lwiphy)->wiphy)
297 
298 #define	LKPI_80211_LWIPHY_WORK_LOCK_INIT(_lwiphy)	\
299     mtx_init(&(_lwiphy)->wwk_mtx, "lwiphy-work", NULL, MTX_DEF);
300 #define	LKPI_80211_LWIPHY_WORK_LOCK_DESTROY(_lwiphy)	\
301     mtx_destroy(&(_lwiphy)->wwk_mtx)
302 #define	LKPI_80211_LWIPHY_WORK_LOCK(_lwiphy)		\
303     mtx_lock(&(_lwiphy)->wwk_mtx)
304 #define	LKPI_80211_LWIPHY_WORK_UNLOCK(_lwiphy)		\
305     mtx_unlock(&(_lwiphy)->wwk_mtx)
306 #define	LKPI_80211_LWIPHY_WORK_LOCK_ASSERT(_lwiphy)	\
307     mtx_assert(&(_lwiphy)->wwk_mtx, MA_OWNED)
308 #define	LKPI_80211_LWIPHY_WORK_UNLOCK_ASSERT(_lwiphy)	\
309     mtx_assert(&(_lwiphy)->wwk_mtx, MA_NOTOWNED)
310 
311 #define	LKPI_80211_LHW_LOCK_INIT(_lhw)			\
312     sx_init_flags(&(_lhw)->sx, "lhw", SX_RECURSE);
313 #define	LKPI_80211_LHW_LOCK_DESTROY(_lhw)		\
314     sx_destroy(&(_lhw)->sx);
315 #define	LKPI_80211_LHW_LOCK(_lhw)			\
316     sx_xlock(&(_lhw)->sx)
317 #define	LKPI_80211_LHW_UNLOCK(_lhw)			\
318     sx_xunlock(&(_lhw)->sx)
319 #define	LKPI_80211_LHW_LOCK_ASSERT(_lhw)		\
320     sx_assert(&(_lhw)->sx, SA_LOCKED)
321 #define	LKPI_80211_LHW_UNLOCK_ASSERT(_lhw)		\
322     sx_assert(&(_lhw)->sx, SA_UNLOCKED)
323 
324 #define	LKPI_80211_LHW_SCAN_LOCK_INIT(_lhw)		\
325     mtx_init(&(_lhw)->scan_mtx, "lhw-scan", NULL, MTX_DEF | MTX_RECURSE);
326 #define	LKPI_80211_LHW_SCAN_LOCK_DESTROY(_lhw)		\
327     mtx_destroy(&(_lhw)->scan_mtx);
328 #define	LKPI_80211_LHW_SCAN_LOCK(_lhw)			\
329     mtx_lock(&(_lhw)->scan_mtx)
330 #define	LKPI_80211_LHW_SCAN_UNLOCK(_lhw)		\
331     mtx_unlock(&(_lhw)->scan_mtx)
332 #define	LKPI_80211_LHW_SCAN_LOCK_ASSERT(_lhw)		\
333     mtx_assert(&(_lhw)->scan_mtx, MA_OWNED)
334 #define	LKPI_80211_LHW_SCAN_UNLOCK_ASSERT(_lhw)		\
335     mtx_assert(&(_lhw)->scan_mtx, MA_NOTOWNED)
336 
337 #define	LKPI_80211_LHW_TXQ_LOCK_INIT(_lhw)		\
338     mtx_init(&(_lhw)->txq_mtx, "lhw-txq", NULL, MTX_DEF | MTX_RECURSE);
339 #define	LKPI_80211_LHW_TXQ_LOCK_DESTROY(_lhw)		\
340     mtx_destroy(&(_lhw)->txq_mtx);
341 #define	LKPI_80211_LHW_TXQ_LOCK(_lhw)			\
342     mtx_lock(&(_lhw)->txq_mtx)
343 #define	LKPI_80211_LHW_TXQ_UNLOCK(_lhw)			\
344     mtx_unlock(&(_lhw)->txq_mtx)
345 #define	LKPI_80211_LHW_TXQ_LOCK_ASSERT(_lhw)		\
346     mtx_assert(&(_lhw)->txq_mtx, MA_OWNED)
347 #define	LKPI_80211_LHW_TXQ_UNLOCK_ASSERT(_lhw)		\
348     mtx_assert(&(_lhw)->txq_mtx, MA_NOTOWNED)
349 
350 #define	LKPI_80211_LHW_RXQ_LOCK_INIT(_lhw)		\
351     mtx_init(&(_lhw)->rxq_mtx, "lhw-rxq", NULL, MTX_DEF | MTX_RECURSE);
352 #define	LKPI_80211_LHW_RXQ_LOCK_DESTROY(_lhw)		\
353     mtx_destroy(&(_lhw)->rxq_mtx);
354 #define	LKPI_80211_LHW_RXQ_LOCK(_lhw)			\
355     mtx_lock(&(_lhw)->rxq_mtx)
356 #define	LKPI_80211_LHW_RXQ_UNLOCK(_lhw)			\
357     mtx_unlock(&(_lhw)->rxq_mtx)
358 #define	LKPI_80211_LHW_RXQ_LOCK_ASSERT(_lhw)		\
359     mtx_assert(&(_lhw)->rxq_mtx, MA_OWNED)
360 #define	LKPI_80211_LHW_RXQ_UNLOCK_ASSERT(_lhw)		\
361     mtx_assert(&(_lhw)->rxq_mtx, MA_NOTOWNED)
362 
363 #define	LKPI_80211_LHW_LVIF_LOCK(_lhw)	sx_xlock(&(_lhw)->lvif_sx)
364 #define	LKPI_80211_LHW_LVIF_UNLOCK(_lhw) sx_xunlock(&(_lhw)->lvif_sx)
365 
366 #define	LKPI_80211_LVIF_LOCK(_lvif)	mtx_lock(&(_lvif)->mtx)
367 #define	LKPI_80211_LVIF_UNLOCK(_lvif)	mtx_unlock(&(_lvif)->mtx)
368 
369 #define	LKPI_80211_LSTA_TXQ_LOCK_INIT(_lsta)		\
370     mtx_init(&(_lsta)->txq_mtx, "lsta-txq", NULL, MTX_DEF);
371 #define	LKPI_80211_LSTA_TXQ_LOCK_DESTROY(_lsta)		\
372     mtx_destroy(&(_lsta)->txq_mtx);
373 #define	LKPI_80211_LSTA_TXQ_LOCK(_lsta)			\
374     mtx_lock(&(_lsta)->txq_mtx)
375 #define	LKPI_80211_LSTA_TXQ_UNLOCK(_lsta)		\
376     mtx_unlock(&(_lsta)->txq_mtx)
377 #define	LKPI_80211_LSTA_TXQ_LOCK_ASSERT(_lsta)		\
378     mtx_assert(&(_lsta)->txq_mtx, MA_OWNED)
379 #define	LKPI_80211_LSTA_TXQ_UNLOCK_ASSERT(_lsta)	\
380     mtx_assert(&(_lsta)->txq_mtx, MA_NOTOWNED)
381 
382 #define	LKPI_80211_LTXQ_LOCK_INIT(_ltxq)		\
383     mtx_init(&(_ltxq)->ltxq_mtx, "ltxq", NULL, MTX_DEF);
384 #define	LKPI_80211_LTXQ_LOCK_DESTROY(_ltxq)		\
385     mtx_destroy(&(_ltxq)->ltxq_mtx);
386 #define	LKPI_80211_LTXQ_LOCK(_ltxq)			\
387     mtx_lock(&(_ltxq)->ltxq_mtx)
388 #define	LKPI_80211_LTXQ_UNLOCK(_ltxq)			\
389     mtx_unlock(&(_ltxq)->ltxq_mtx)
390 #define	LKPI_80211_LTXQ_LOCK_ASSERT(_ltxq)		\
391     mtx_assert(&(_ltxq)->ltxq_mtx, MA_OWNED)
392 #define	LKPI_80211_LTXQ_UNLOCK_ASSERT(_ltxq)		\
393     mtx_assert(&(_ltxq)->ltxq_mtx, MA_NOTOWNED)
394 
395 int lkpi_80211_mo_start(struct ieee80211_hw *);
396 void lkpi_80211_mo_stop(struct ieee80211_hw *, bool);
397 int lkpi_80211_mo_get_antenna(struct ieee80211_hw *, u32 *, u32 *);
398 int lkpi_80211_mo_set_frag_threshold(struct ieee80211_hw *, uint32_t);
399 int lkpi_80211_mo_set_rts_threshold(struct ieee80211_hw *, uint32_t);
400 int lkpi_80211_mo_add_interface(struct ieee80211_hw *, struct ieee80211_vif *);
401 void lkpi_80211_mo_remove_interface(struct ieee80211_hw *, struct ieee80211_vif *);
402 int lkpi_80211_mo_hw_scan(struct ieee80211_hw *, struct ieee80211_vif *,
403     struct ieee80211_scan_request *);
404 void lkpi_80211_mo_cancel_hw_scan(struct ieee80211_hw *, struct ieee80211_vif *);
405 void lkpi_80211_mo_sw_scan_complete(struct ieee80211_hw *, struct ieee80211_vif *);
406 void lkpi_80211_mo_sw_scan_start(struct ieee80211_hw *, struct ieee80211_vif *,
407     const u8 *);
408 u64 lkpi_80211_mo_prepare_multicast(struct ieee80211_hw *,
409     struct netdev_hw_addr_list *);
410 void lkpi_80211_mo_configure_filter(struct ieee80211_hw *, unsigned int,
411     unsigned int *, u64);
412 int lkpi_80211_mo_sta_state(struct ieee80211_hw *, struct ieee80211_vif *,
413     struct lkpi_sta *, enum ieee80211_sta_state);
414 int lkpi_80211_mo_config(struct ieee80211_hw *, uint32_t);
415 int lkpi_80211_mo_assign_vif_chanctx(struct ieee80211_hw *, struct ieee80211_vif *,
416     struct ieee80211_bss_conf *, struct ieee80211_chanctx_conf *);
417 void lkpi_80211_mo_unassign_vif_chanctx(struct ieee80211_hw *, struct ieee80211_vif *,
418     struct ieee80211_bss_conf *, struct ieee80211_chanctx_conf **);
419 int lkpi_80211_mo_add_chanctx(struct ieee80211_hw *, struct ieee80211_chanctx_conf *);
420 void lkpi_80211_mo_change_chanctx(struct ieee80211_hw *,
421     struct ieee80211_chanctx_conf *, uint32_t);
422 void lkpi_80211_mo_remove_chanctx(struct ieee80211_hw *,
423     struct ieee80211_chanctx_conf *);
424 void lkpi_80211_mo_bss_info_changed(struct ieee80211_hw *, struct ieee80211_vif *,
425     struct ieee80211_bss_conf *, uint64_t);
426 int lkpi_80211_mo_conf_tx(struct ieee80211_hw *, struct ieee80211_vif *,
427     uint32_t, uint16_t, const struct ieee80211_tx_queue_params *);
428 void lkpi_80211_mo_flush(struct ieee80211_hw *, struct ieee80211_vif *,
429     uint32_t, bool);
430 void lkpi_80211_mo_mgd_prepare_tx(struct ieee80211_hw *, struct ieee80211_vif *,
431     struct ieee80211_prep_tx_info *);
432 void lkpi_80211_mo_mgd_complete_tx(struct ieee80211_hw *, struct ieee80211_vif *,
433     struct ieee80211_prep_tx_info *);
434 void lkpi_80211_mo_tx(struct ieee80211_hw *, struct ieee80211_tx_control *,
435     struct sk_buff *);
436 void lkpi_80211_mo_wake_tx_queue(struct ieee80211_hw *, struct ieee80211_txq *);
437 void lkpi_80211_mo_sync_rx_queues(struct ieee80211_hw *);
438 void lkpi_80211_mo_sta_pre_rcu_remove(struct ieee80211_hw *,
439     struct ieee80211_vif *, struct ieee80211_sta *);
440 int lkpi_80211_mo_set_key(struct ieee80211_hw *, enum set_key_cmd,
441     struct ieee80211_vif *, struct ieee80211_sta *,
442     struct ieee80211_key_conf *);
443 int lkpi_80211_mo_ampdu_action(struct ieee80211_hw *, struct ieee80211_vif *,
444     struct ieee80211_ampdu_params *);
445 
446 
447 #endif	/* _LKPI_SRC_LINUX_80211_H */
448