if_urtwvar.h revision 192873
1192873Sweongyo/*	$FreeBSD: head/sys/dev/usb/wlan/if_urtwvar.h 192873 2009-05-27 03:57:38Z weongyo $	*/
2192873Sweongyo
3192873Sweongyo/*-
4192873Sweongyo * Copyright (c) 2008 Weongyo Jeong <weongyo@FreeBSD.org>
5192873Sweongyo *
6192873Sweongyo * Permission to use, copy, modify, and distribute this software for any
7192873Sweongyo * purpose with or without fee is hereby granted, provided that the above
8192873Sweongyo * copyright notice and this permission notice appear in all copies.
9192873Sweongyo *
10192873Sweongyo * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11192873Sweongyo * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12192873Sweongyo * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13192873Sweongyo * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14192873Sweongyo * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15192873Sweongyo * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16192873Sweongyo * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17192873Sweongyo */
18192873Sweongyo
19192873Sweongyoenum {
20192873Sweongyo	URTW_8187B_BULK_RX,
21192873Sweongyo	URTW_8187B_BULK_TX_BE,
22192873Sweongyo	URTW_8187B_BULK_TX_BK,
23192873Sweongyo	URTW_8187B_BULK_TX_VI,
24192873Sweongyo	URTW_8187B_BULK_TX_VO,
25192873Sweongyo	URTW_8187B_BULK_TX_EP12,
26192873Sweongyo	URTW_8187B_N_XFERS = 6
27192873Sweongyo};
28192873Sweongyo
29192873Sweongyoenum {
30192873Sweongyo	URTW_8187L_BULK_RX,
31192873Sweongyo	URTW_8187L_BULK_TX_LOW,
32192873Sweongyo	URTW_8187L_BULK_TX_NORMAL,
33192873Sweongyo	URTW_8187L_N_XFERS = 3
34192873Sweongyo};
35192873Sweongyo
36192873Sweongyo/* XXX no definition at net80211?  */
37192873Sweongyo#define URTW_MAX_CHANNELS		15
38192873Sweongyo
39192873Sweongyostruct urtw_data {
40192873Sweongyo	struct urtw_softc	*sc;
41192873Sweongyo	uint8_t			*buf;
42192873Sweongyo	uint16_t		buflen;
43192873Sweongyo	struct mbuf		*m;
44192873Sweongyo	struct ieee80211_node	*ni;		/* NB: tx only */
45192873Sweongyo	STAILQ_ENTRY(urtw_data)	next;
46192873Sweongyo};
47192873Sweongyotypedef STAILQ_HEAD(, urtw_data) urtw_datahead;
48192873Sweongyo
49192873Sweongyo/* XXX not correct..  */
50192873Sweongyo#define	URTW_MIN_RXBUFSZ						\
51192873Sweongyo	(sizeof(struct ieee80211_frame_min))
52192873Sweongyo
53192873Sweongyo#define URTW_RX_DATA_LIST_COUNT		4
54192873Sweongyo#define URTW_TX_DATA_LIST_COUNT		16
55192873Sweongyo#define URTW_RX_MAXSIZE			0x9c4
56192873Sweongyo#define URTW_TX_MAXSIZE			0x9c4
57192873Sweongyo
58192873Sweongyostruct urtw_rx_radiotap_header {
59192873Sweongyo	struct ieee80211_radiotap_header wr_ihdr;
60192873Sweongyo	uint8_t		wr_flags;
61192873Sweongyo	uint16_t	wr_chan_freq;
62192873Sweongyo	uint16_t	wr_chan_flags;
63192873Sweongyo	int8_t		wr_dbm_antsignal;
64192873Sweongyo} __packed;
65192873Sweongyo
66192873Sweongyo#define URTW_RX_RADIOTAP_PRESENT					\
67192873Sweongyo	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
68192873Sweongyo	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
69192873Sweongyo	 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL))
70192873Sweongyo
71192873Sweongyostruct urtw_tx_radiotap_header {
72192873Sweongyo	struct ieee80211_radiotap_header wt_ihdr;
73192873Sweongyo	uint8_t		wt_flags;
74192873Sweongyo	uint16_t	wt_chan_freq;
75192873Sweongyo	uint16_t	wt_chan_flags;
76192873Sweongyo} __packed;
77192873Sweongyo
78192873Sweongyo#define URTW_TX_RADIOTAP_PRESENT					\
79192873Sweongyo	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
80192873Sweongyo	 (1 << IEEE80211_RADIOTAP_CHANNEL))
81192873Sweongyo
82192873Sweongyostruct urtw_vap {
83192873Sweongyo	struct ieee80211vap		vap;
84192873Sweongyo	int				(*newstate)(struct ieee80211vap *,
85192873Sweongyo					    enum ieee80211_state, int);
86192873Sweongyo};
87192873Sweongyo#define	URTW_VAP(vap)	((struct urtw_vap *)(vap))
88192873Sweongyo
89192873Sweongyostruct urtw_softc {
90192873Sweongyo	struct ifnet			*sc_ifp;
91192873Sweongyo	device_t			sc_dev;
92192873Sweongyo	struct usb2_device		*sc_udev;
93192873Sweongyo	struct mtx			sc_mtx;
94192873Sweongyo
95192873Sweongyo	int				sc_debug;
96192873Sweongyo	int				sc_if_flags;
97192873Sweongyo	int				sc_flags;
98192873Sweongyo#define	URTW_INIT_ONCE			(1 << 1)
99192873Sweongyo#define	URTW_RTL8187B			(1 << 2)
100192873Sweongyo#define	URTW_RTL8187B_REV_B		(1 << 3)
101192873Sweongyo#define	URTW_RTL8187B_REV_D		(1 << 4)
102192873Sweongyo#define	URTW_RTL8187B_REV_E		(1 << 5)
103192873Sweongyo	enum ieee80211_state		sc_state;
104192873Sweongyo
105192873Sweongyo	int				sc_epromtype;
106192873Sweongyo#define URTW_EEPROM_93C46		0
107192873Sweongyo#define URTW_EEPROM_93C56		1
108192873Sweongyo	uint8_t				sc_crcmon;
109192873Sweongyo	uint8_t				sc_bssid[IEEE80211_ADDR_LEN];
110192873Sweongyo
111192873Sweongyo	struct ieee80211_channel	*sc_curchan;
112192873Sweongyo
113192873Sweongyo	/* for RF  */
114192873Sweongyo	usb2_error_t			(*sc_rf_init)(struct urtw_softc *);
115192873Sweongyo	usb2_error_t			(*sc_rf_set_chan)(struct urtw_softc *,
116192873Sweongyo					    int);
117192873Sweongyo	usb2_error_t			(*sc_rf_set_sens)(struct urtw_softc *,
118192873Sweongyo					    int);
119192873Sweongyo	usb2_error_t			(*sc_rf_stop)(struct urtw_softc *);
120192873Sweongyo	uint8_t				sc_rfchip;
121192873Sweongyo	uint32_t			sc_max_sens;
122192873Sweongyo	uint32_t			sc_sens;
123192873Sweongyo	/* for LED  */
124192873Sweongyo	struct usb2_callout		sc_led_ch;
125192873Sweongyo	struct task			sc_led_task;
126192873Sweongyo	uint8_t				sc_psr;
127192873Sweongyo	uint8_t				sc_strategy;
128192873Sweongyo#define	URTW_LED_GPIO			1
129192873Sweongyo	uint8_t				sc_gpio_ledon;
130192873Sweongyo	uint8_t				sc_gpio_ledinprogress;
131192873Sweongyo	uint8_t				sc_gpio_ledstate;
132192873Sweongyo	uint8_t				sc_gpio_ledpin;
133192873Sweongyo	uint8_t				sc_gpio_blinktime;
134192873Sweongyo	uint8_t				sc_gpio_blinkstate;
135192873Sweongyo	/* RX/TX */
136192873Sweongyo	struct usb2_xfer		*sc_xfer[URTW_8187B_N_XFERS];
137192873Sweongyo#define	URTW_PRIORITY_LOW		0
138192873Sweongyo#define	URTW_PRIORITY_NORMAL		1
139192873Sweongyo#define URTW_DATA_TIMEOUT		10000		/* 10 sec  */
140192873Sweongyo#define	URTW_8187B_TXPIPE_BE		0x6	/* best effort */
141192873Sweongyo#define	URTW_8187B_TXPIPE_BK		0x7	/* background */
142192873Sweongyo#define	URTW_8187B_TXPIPE_VI		0x5	/* video */
143192873Sweongyo#define	URTW_8187B_TXPIPE_VO		0x4	/* voice */
144192873Sweongyo#define	URTW_8187B_TXPIPE_MAX		4
145192873Sweongyo	struct urtw_data		sc_rx[URTW_RX_DATA_LIST_COUNT];
146192873Sweongyo	urtw_datahead			sc_rx_active;
147192873Sweongyo	urtw_datahead			sc_rx_inactive;
148192873Sweongyo	struct urtw_data		sc_tx[URTW_TX_DATA_LIST_COUNT];
149192873Sweongyo	urtw_datahead			sc_tx_active;
150192873Sweongyo	urtw_datahead			sc_tx_inactive;
151192873Sweongyo	urtw_datahead			sc_tx_pending;
152192873Sweongyo	uint8_t				sc_rts_retry;
153192873Sweongyo	uint8_t				sc_tx_retry;
154192873Sweongyo	uint8_t				sc_preamble_mode;
155192873Sweongyo#define	URTW_PREAMBLE_MODE_SHORT	1
156192873Sweongyo#define	URTW_PREAMBLE_MODE_LONG		2
157192873Sweongyo	struct callout			sc_watchdog_ch;
158192873Sweongyo	int				sc_txtimer;
159192873Sweongyo	int				sc_currate;
160192873Sweongyo	/* TX power  */
161192873Sweongyo	uint8_t				sc_txpwr_cck[URTW_MAX_CHANNELS];
162192873Sweongyo	uint8_t				sc_txpwr_cck_base;
163192873Sweongyo	uint8_t				sc_txpwr_ofdm[URTW_MAX_CHANNELS];
164192873Sweongyo	uint8_t				sc_txpwr_ofdm_base;
165192873Sweongyo
166192873Sweongyo	struct	urtw_rx_radiotap_header	sc_rxtap;
167192873Sweongyo	int				sc_rxtap_len;
168192873Sweongyo	struct	urtw_tx_radiotap_header	sc_txtap;
169192873Sweongyo	int				sc_txtap_len;
170192873Sweongyo};
171192873Sweongyo
172192873Sweongyo#define URTW_LOCK(sc)			mtx_lock(&(sc)->sc_mtx)
173192873Sweongyo#define URTW_UNLOCK(sc)			mtx_unlock(&(sc)->sc_mtx)
174192873Sweongyo#define URTW_ASSERT_LOCKED(sc)		mtx_assert(&(sc)->sc_mtx, MA_OWNED)
175