xref: /openbsd-src/sys/dev/usb/if_uathvar.h (revision ab0b1be78a33b04be9f7ec4a3d24ce14843759cb)
1*ab0b1be7Smglocker /*	$OpenBSD: if_uathvar.h,v 1.7 2013/04/15 09:23:01 mglocker Exp $	*/
217849d02Sdamien 
317849d02Sdamien /*-
417849d02Sdamien  * Copyright (c) 2006
517849d02Sdamien  *	Damien Bergamini <damien.bergamini@free.fr>
617849d02Sdamien  *
717849d02Sdamien  * Permission to use, copy, modify, and distribute this software for any
817849d02Sdamien  * purpose with or without fee is hereby granted, provided that the above
917849d02Sdamien  * copyright notice and this permission notice appear in all copies.
1017849d02Sdamien  *
1117849d02Sdamien  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1217849d02Sdamien  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1317849d02Sdamien  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1417849d02Sdamien  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1517849d02Sdamien  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1617849d02Sdamien  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1717849d02Sdamien  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1817849d02Sdamien  */
1917849d02Sdamien 
2017849d02Sdamien #define UATH_TX_DATA_LIST_COUNT	8	/* 16 */
2117849d02Sdamien #define UATH_TX_CMD_LIST_COUNT	8	/* 30 */
2217849d02Sdamien 
2317849d02Sdamien /* XXX ehci will panic on abort_pipe if set to anything > 1 */
2417849d02Sdamien #define UATH_RX_DATA_LIST_COUNT	1	/* 128 */
2517849d02Sdamien #define UATH_RX_CMD_LIST_COUNT	1	/* 30 */
2617849d02Sdamien 
2717849d02Sdamien #define UATH_DATA_TIMEOUT	10000
2817849d02Sdamien #define UATH_CMD_TIMEOUT	1000
2917849d02Sdamien 
3017849d02Sdamien struct uath_rx_radiotap_header {
3117849d02Sdamien 	struct ieee80211_radiotap_header wr_ihdr;
3217849d02Sdamien 	uint8_t		wr_flags;
3317849d02Sdamien 	uint16_t	wr_chan_freq;
3417849d02Sdamien 	uint16_t	wr_chan_flags;
3517849d02Sdamien 	int8_t		wr_dbm_antsignal;
3617849d02Sdamien } __packed;
3717849d02Sdamien 
3817849d02Sdamien #define UATH_RX_RADIOTAP_PRESENT					\
3917849d02Sdamien 	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
4017849d02Sdamien 	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
4117849d02Sdamien 	 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL))
4217849d02Sdamien 
4317849d02Sdamien struct uath_tx_radiotap_header {
4417849d02Sdamien 	struct ieee80211_radiotap_header wt_ihdr;
4517849d02Sdamien 	uint8_t		wt_flags;
4617849d02Sdamien 	uint16_t	wt_chan_freq;
4717849d02Sdamien 	uint16_t	wt_chan_flags;
4817849d02Sdamien } __packed;
4917849d02Sdamien 
5017849d02Sdamien #define UATH_TX_RADIOTAP_PRESENT					\
5117849d02Sdamien 	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
5217849d02Sdamien 	 (1 << IEEE80211_RADIOTAP_CHANNEL))
5317849d02Sdamien 
5417849d02Sdamien struct uath_tx_data {
5517849d02Sdamien 	struct uath_softc	*sc;
56*ab0b1be7Smglocker 	struct usbd_xfer	*xfer;
5717849d02Sdamien 	uint8_t			*buf;
5817849d02Sdamien 	struct ieee80211_node	*ni;
5917849d02Sdamien };
6017849d02Sdamien 
6117849d02Sdamien struct uath_rx_data {
6217849d02Sdamien 	struct uath_softc	*sc;
63*ab0b1be7Smglocker 	struct usbd_xfer	*xfer;
6417849d02Sdamien 	uint8_t			*buf;
6574433b06Sdamien 	struct mbuf		*m;
6617849d02Sdamien };
6717849d02Sdamien 
6817849d02Sdamien struct uath_tx_cmd {
6917849d02Sdamien 	struct uath_softc	*sc;
70*ab0b1be7Smglocker 	struct usbd_xfer	*xfer;
7117849d02Sdamien 	uint8_t			*buf;
7217849d02Sdamien 	void			*odata;
7317849d02Sdamien };
7417849d02Sdamien 
7517849d02Sdamien struct uath_rx_cmd {
7617849d02Sdamien 	struct uath_softc	*sc;
77*ab0b1be7Smglocker 	struct usbd_xfer	*xfer;
7817849d02Sdamien 	uint8_t			*buf;
7917849d02Sdamien };
8017849d02Sdamien 
8117849d02Sdamien struct uath_wme_settings {
8217849d02Sdamien 	uint8_t		aifsn;
8317849d02Sdamien 	uint8_t		logcwmin;
8417849d02Sdamien 	uint8_t		logcwmax;
8517849d02Sdamien 	uint16_t	txop;
8617849d02Sdamien #define UATH_TXOP_TO_US(txop)	((txop) << 5)
8717849d02Sdamien 
8817849d02Sdamien 	uint8_t		acm;
8917849d02Sdamien };
9017849d02Sdamien 
9117849d02Sdamien /* condvars */
9217849d02Sdamien #define UATH_COND_INIT(sc)	((caddr_t)sc + 1)
9317849d02Sdamien 
9417849d02Sdamien /* flags for sending firmware commands */
9517849d02Sdamien #define UATH_CMD_FLAG_ASYNC	(1 << 0)
9617849d02Sdamien #define UATH_CMD_FLAG_READ	(1 << 1)
9717849d02Sdamien #define UATH_CMD_FLAG_MAGIC	(1 << 2)
9817849d02Sdamien 
9917849d02Sdamien struct uath_softc {
1008c5d01eeSmk 	struct device			sc_dev;
10117849d02Sdamien 	struct ieee80211com		sc_ic;
10217849d02Sdamien 	int				(*sc_newstate)(struct ieee80211com *,
10317849d02Sdamien 					    enum ieee80211_state, int);
10417849d02Sdamien 
10517849d02Sdamien 	struct uath_tx_data		tx_data[UATH_TX_DATA_LIST_COUNT];
10674433b06Sdamien 	struct uath_rx_data		rx_data[UATH_RX_DATA_LIST_COUNT];
10717849d02Sdamien 
10817849d02Sdamien 	struct uath_tx_cmd		tx_cmd[UATH_TX_CMD_LIST_COUNT];
10917849d02Sdamien 	struct uath_rx_cmd		rx_cmd[UATH_RX_CMD_LIST_COUNT];
11017849d02Sdamien 
11117849d02Sdamien 	int				sc_flags;
11217849d02Sdamien 
11317849d02Sdamien 	int				data_idx;
11417849d02Sdamien 	int				cmd_idx;
11517849d02Sdamien 	int				tx_queued;
11617849d02Sdamien 
117*ab0b1be7Smglocker 	struct usbd_device		*sc_udev;
118*ab0b1be7Smglocker 	struct usbd_device		*sc_uhub;
1196a54674fSdamien 	int				sc_port;
1206a54674fSdamien 
121*ab0b1be7Smglocker 	struct usbd_interface		*sc_iface;
12217849d02Sdamien 
123*ab0b1be7Smglocker 	struct usbd_pipe		*data_tx_pipe;
124*ab0b1be7Smglocker 	struct usbd_pipe		*data_rx_pipe;
125*ab0b1be7Smglocker 	struct usbd_pipe		*cmd_tx_pipe;
126*ab0b1be7Smglocker 	struct usbd_pipe		*cmd_rx_pipe;
12717849d02Sdamien 
12817849d02Sdamien 	enum ieee80211_state		sc_state;
12917849d02Sdamien 	int				sc_arg;
13017849d02Sdamien 	struct usb_task			sc_task;
13117849d02Sdamien 
13217849d02Sdamien 	struct timeout			scan_to;
13317849d02Sdamien 	struct timeout			stat_to;
13417849d02Sdamien 
13517849d02Sdamien 	int				sc_tx_timer;
13617849d02Sdamien 
13717849d02Sdamien 	int				rxbufsz;
13817849d02Sdamien 
13917849d02Sdamien #if NBPFILTER > 0
14017849d02Sdamien 	caddr_t				sc_drvbpf;
14117849d02Sdamien 
14217849d02Sdamien 	union {
14317849d02Sdamien 		struct	uath_rx_radiotap_header th;
14417849d02Sdamien 		uint8_t	pad[64];
14517849d02Sdamien 	}				sc_rxtapu;
14617849d02Sdamien #define sc_rxtap			sc_rxtapu.th
14717849d02Sdamien 	int				sc_rxtap_len;
14817849d02Sdamien 
14917849d02Sdamien 	union {
15017849d02Sdamien 		struct	uath_tx_radiotap_header th;
15117849d02Sdamien 		uint8_t	pad[64];
15217849d02Sdamien 	}				sc_txtapu;
15317849d02Sdamien #define sc_txtap			sc_txtapu.th
15417849d02Sdamien 	int				sc_txtap_len;
15517849d02Sdamien #endif
15617849d02Sdamien };
157