xref: /dragonfly/sys/bus/u4b/wlan/if_urtwnvar.h (revision 326e57e856af4df1ee426d8c7604a26e68c0d7a2)
1 /*-
2  * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr>
3  *
4  * Permission to use, copy, modify, and distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  *
16  * $OpenBSD: if_urtwnreg.h,v 1.3 2010/11/16 18:02:59 damien Exp $
17  * $FreeBSD$
18  */
19 
20 #define URTWN_RX_LIST_COUNT             64
21 #define URTWN_TX_LIST_COUNT             8
22 #define URTWN_HOST_CMD_RING_COUNT       32
23 
24 #define URTWN_RXBUFSZ         (8 * 1024)
25 //#define URTWN_TXBUFSZ       (sizeof(struct r92c_tx_desc) + IEEE80211_MAX_LEN)
26 /* Leave enough space for an A-MSDU frame */
27 #define URTWN_TXBUFSZ         (16 * 1024)
28 #define   URTWN_RX_DESC_SIZE  (sizeof(struct r92c_rx_stat))
29 #define   URTWN_TX_DESC_SIZE  (sizeof(struct r92c_tx_desc))
30 
31 #define URTWN_TX_TIMEOUT      5000      /* ms */
32 
33 #define URTWN_LED_LINK        0
34 #define URTWN_LED_DATA        1
35 
36 struct urtwn_rx_radiotap_header {
37           struct ieee80211_radiotap_header wr_ihdr;
38           uint64_t  wr_tsft;
39           uint8_t             wr_flags;
40           uint8_t             wr_rate;
41           uint16_t  wr_chan_freq;
42           uint16_t  wr_chan_flags;
43           int8_t              wr_dbm_antsignal;
44           int8_t              wr_dbm_antnoise;
45 } __packed __aligned(8);
46 
47 #define URTWN_RX_RADIOTAP_PRESENT                           \
48           (1 << IEEE80211_RADIOTAP_TSFT |                             \
49            1 << IEEE80211_RADIOTAP_FLAGS |                  \
50            1 << IEEE80211_RADIOTAP_RATE |                             \
51            1 << IEEE80211_RADIOTAP_CHANNEL |                \
52            1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL |          \
53            1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)
54 
55 struct urtwn_tx_radiotap_header {
56           struct ieee80211_radiotap_header wt_ihdr;
57           uint8_t             wt_flags;
58           uint16_t  wt_chan_freq;
59           uint16_t  wt_chan_flags;
60 } __packed __aligned(8);
61 
62 #define URTWN_TX_RADIOTAP_PRESENT                           \
63           (1 << IEEE80211_RADIOTAP_FLAGS |                  \
64            1 << IEEE80211_RADIOTAP_CHANNEL)
65 
66 struct urtwn_softc;
67 
68 struct urtwn_data {
69           struct urtwn_softc            *sc;
70           uint8_t                                 *buf;
71           uint16_t                      buflen;
72           struct mbuf                             *m;
73           struct ieee80211_node                   *ni;
74           STAILQ_ENTRY(urtwn_data)      next;
75 };
76 typedef STAILQ_HEAD(, urtwn_data) urtwn_datahead;
77 
78 union sec_param {
79           struct ieee80211_key                    key;
80 };
81 
82 #define CMD_FUNC_PROTO                            void (*func)(struct urtwn_softc *, \
83                                                       union sec_param *)
84 
85 struct urtwn_cmdq {
86           union sec_param                         data;
87           CMD_FUNC_PROTO;
88 };
89 #define URTWN_CMDQ_SIZE                           16
90 
91 struct urtwn_fw_info {
92           const uint8_t                 *data;
93           size_t                        size;
94 };
95 
96 struct urtwn_node {
97           struct ieee80211_node         ni;       /* must be the first */
98           uint8_t                       id;
99           int                           last_rssi;
100 };
101 #define URTWN_NODE(ni)        ((struct urtwn_node *)(ni))
102 
103 struct urtwn_vap {
104           struct ieee80211vap vap;
105 
106           struct r92c_tx_desc bcn_desc;
107           struct mbuf                   *bcn_mbuf;
108           struct task                   tsf_task_adhoc;
109 
110           int                           (*newstate)(struct ieee80211vap *,
111                                             enum ieee80211_state, int);
112           void                          (*recv_mgmt)(struct ieee80211_node *,
113                                             struct mbuf *, int,
114                                             const struct ieee80211_rx_stats *,
115                                             int, int);
116 };
117 #define   URTWN_VAP(vap)      ((struct urtwn_vap *)(vap))
118 
119 struct urtwn_host_cmd {
120           void      (*cb)(struct urtwn_softc *, void *);
121           uint8_t   data[256];
122 };
123 
124 struct urtwn_cmd_newstate {
125           enum ieee80211_state          state;
126           int                           arg;
127 };
128 
129 struct urtwn_cmd_key {
130           struct ieee80211_key          key;
131           uint16_t            associd;
132 };
133 
134 enum {
135           URTWN_BULK_RX,
136           URTWN_BULK_TX_BE,   /* = WME_AC_BE */
137           URTWN_BULK_TX_BK,   /* = WME_AC_BK */
138           URTWN_BULK_TX_VI,   /* = WME_AC_VI */
139           URTWN_BULK_TX_VO,   /* = WME_AC_VI */
140           URTWN_N_TRANSFER = 5,
141 };
142 
143 #define   URTWN_EP_QUEUES     URTWN_BULK_RX
144 
145 union urtwn_rom {
146           struct r92c_rom                         r92c_rom;
147           struct r88e_rom                         r88e_rom;
148 };
149 
150 struct urtwn_softc {
151           struct ieee80211com           sc_ic;
152           struct mbufq                            sc_snd;
153           device_t                      sc_dev;
154           struct usb_device             *sc_udev;
155 
156           uint32_t                      sc_debug;
157           uint8_t                                 sc_iface_index;
158           uint8_t                                 sc_flags;
159 #define URTWN_FLAG_CCK_HIPWR  0x01
160 #define URTWN_DETACHED                  0x02
161 #define URTWN_RUNNING                   0x04
162 #define URTWN_FW_LOADED                 0x08
163 #define URTWN_TEMP_MEASURED   0x10
164 
165           u_int                                   chip;
166 #define   URTWN_CHIP_92C                0x01
167 #define   URTWN_CHIP_92C_1T2R 0x02
168 #define   URTWN_CHIP_UMC                0x04
169 #define   URTWN_CHIP_UMC_A_CUT          0x08
170 #define   URTWN_CHIP_88E                0x10
171 
172 #define URTWN_CHIP_HAS_RATECTL(_sc)     (!!((_sc)->chip & URTWN_CHIP_88E))
173 
174           void                                    (*sc_node_free)(struct ieee80211_node *);
175           void                                    (*sc_rf_write)(struct urtwn_softc *,
176                                                       int, uint8_t, uint32_t);
177           int                                     (*sc_power_on)(struct urtwn_softc *);
178           void                                    (*sc_power_off)(struct urtwn_softc *);
179 
180           struct ieee80211_node                   *node_list[R88E_MACID_MAX + 1];
181 #if defined(__DragonFly__)
182           struct lock                             nt_mtx;
183 #else
184           struct mtx                              nt_mtx;
185 #endif
186 
187           uint8_t                                 board_type;
188           uint8_t                                 regulatory;
189           uint8_t                                 pa_setting;
190           int8_t                                  ofdm_tx_pwr_diff;
191           int8_t                                  bw20_tx_pwr_diff;
192           int                                     avg_pwdb;
193           uint8_t                                 thcal_lctemp;
194           int                                     ntxchains;
195           int                                     nrxchains;
196           int                                     ledlink;
197           int                                     sc_txtimer;
198 
199           int                                     last_rssi;
200 
201           int                                     fwcur;
202           struct urtwn_data             sc_rx[URTWN_RX_LIST_COUNT];
203           urtwn_datahead                          sc_rx_active;
204           urtwn_datahead                          sc_rx_inactive;
205           struct urtwn_data             sc_tx[URTWN_TX_LIST_COUNT];
206           urtwn_datahead                          sc_tx_active;
207           int                                     sc_tx_n_active;
208           urtwn_datahead                          sc_tx_inactive;
209           urtwn_datahead                          sc_tx_pending;
210 
211           union urtwn_rom                         rom;
212           uint16_t                      last_rom_addr;
213 
214           struct callout                          sc_calib_to;
215           struct callout                          sc_watchdog_ch;
216 #if defined(__DragonFly__)
217           struct lock                             sc_mtx;
218 #else
219           struct mtx                              sc_mtx;
220 #endif
221           uint32_t                      keys_bmap;
222 
223           struct urtwn_cmdq             cmdq[URTWN_CMDQ_SIZE];
224 #if defined(__DragonFly__)
225           struct lock                             cmdq_mtx;
226 #else
227           struct mtx                              cmdq_mtx;
228 #endif
229           struct task                             cmdq_task;
230           uint8_t                                 cmdq_first;
231           uint8_t                                 cmdq_last;
232 
233           uint32_t                      rf_chnlbw[R92C_MAX_CHAINS];
234           struct usb_xfer                         *sc_xfer[URTWN_N_TRANSFER];
235 
236           struct urtwn_rx_radiotap_header         sc_rxtap;
237           struct urtwn_tx_radiotap_header         sc_txtap;
238 };
239 
240 #if defined(__DragonFly__)
241 
242 #define   URTWN_LOCK(sc)                          lockmgr(&(sc)->sc_mtx, LK_EXCLUSIVE)
243 #define   URTWN_UNLOCK(sc)              lockmgr(&(sc)->sc_mtx, LK_RELEASE)
244 #define   URTWN_ASSERT_LOCKED(sc)                 KKASSERT(lockstatus(&(sc)->sc_mtx, curthread) == LK_EXCLUSIVE)
245 
246 #define URTWN_CMDQ_LOCK_INIT(sc)        lockinit(&(sc)->cmdq_mtx, "cmdq lock", 0, 0);
247 #define URTWN_CMDQ_LOCK(sc)             lockmgr(&(sc)->cmdq_mtx, LK_EXCLUSIVE)
248 #define URTWN_CMDQ_UNLOCK(sc)           lockmgr(&(sc)->cmdq_mtx, LK_RELEASE)
249 #define URTWN_CMDQ_LOCK_DESTROY(sc)     lockuninit(&(sc)->cmdq_mtx)
250 
251 #define URTWN_NT_LOCK_INIT(sc)                    lockinit(&(sc)->nt_mtx, "node table lock", 0, 0)
252 #define URTWN_NT_LOCK(sc)               lockmgr(&(sc)->nt_mtx, LK_EXCLUSIVE)
253 #define URTWN_NT_UNLOCK(sc)             lockmgr(&(sc)->nt_mtx, LK_RELEASE)
254 #define URTWN_NT_LOCK_DESTROY(sc)       lockuninit(&(sc)->nt_mtx)
255 
256 #else
257 
258 #define   URTWN_LOCK(sc)                          mtx_lock(&(sc)->sc_mtx)
259 #define   URTWN_UNLOCK(sc)              mtx_unlock(&(sc)->sc_mtx)
260 #define   URTWN_ASSERT_LOCKED(sc)                 mtx_assert(&(sc)->sc_mtx, MA_OWNED)
261 
262 #define URTWN_CMDQ_LOCK_INIT(sc) \
263           mtx_init(&(sc)->cmdq_mtx, "cmdq lock", NULL, MTX_DEF)
264 #define URTWN_CMDQ_LOCK(sc)             mtx_lock(&(sc)->cmdq_mtx)
265 #define URTWN_CMDQ_UNLOCK(sc)           mtx_unlock(&(sc)->cmdq_mtx)
266 #define URTWN_CMDQ_LOCK_DESTROY(sc)     mtx_destroy(&(sc)->cmdq_mtx)
267 
268 #define URTWN_NT_LOCK_INIT(sc) \
269           mtx_init(&(sc)->nt_mtx, "node table lock", NULL, MTX_DEF)
270 #define URTWN_NT_LOCK(sc)               mtx_lock(&(sc)->nt_mtx)
271 #define URTWN_NT_UNLOCK(sc)             mtx_unlock(&(sc)->nt_mtx)
272 #define URTWN_NT_LOCK_DESTROY(sc)       mtx_destroy(&(sc)->nt_mtx)
273 
274 #endif
275