]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - sys/dev/usb/wlan/if_rsu.c
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / sys / dev / usb / wlan / if_rsu.c
1 /*      $OpenBSD: if_rsu.c,v 1.17 2013/04/15 09:23:01 mglocker Exp $    */
2
3 /*-
4  * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 #include <sys/cdefs.h>
19 __FBSDID("$FreeBSD$");
20
21 /*
22  * Driver for Realtek RTL8188SU/RTL8191SU/RTL8192SU.
23  *
24  * TODO:
25  *   o 11n support
26  *   o h/w crypto
27  *   o hostap / ibss / mesh
28  */
29 #include <sys/param.h>
30 #include <sys/endian.h>
31 #include <sys/sockio.h>
32 #include <sys/mbuf.h>
33 #include <sys/kernel.h>
34 #include <sys/socket.h>
35 #include <sys/systm.h>
36 #include <sys/conf.h>
37 #include <sys/bus.h>
38 #include <sys/rman.h>
39 #include <sys/firmware.h>
40 #include <sys/module.h>
41
42 #include <machine/bus.h>
43 #include <machine/resource.h>
44
45 #include <net/bpf.h>
46 #include <net/if.h>
47 #include <net/if_arp.h>
48 #include <net/if_dl.h>
49 #include <net/if_media.h>
50 #include <net/if_types.h>
51
52 #include <netinet/in.h>
53 #include <netinet/in_systm.h>
54 #include <netinet/in_var.h>
55 #include <netinet/if_ether.h>
56 #include <netinet/ip.h>
57
58 #include <net80211/ieee80211_var.h>
59 #include <net80211/ieee80211_regdomain.h>
60 #include <net80211/ieee80211_radiotap.h>
61
62 #include <dev/usb/usb.h>
63 #include <dev/usb/usbdi.h>
64 #include "usbdevs.h"
65
66 #define USB_DEBUG_VAR rsu_debug
67 #include <dev/usb/usb_debug.h>
68
69 #include <dev/usb/wlan/if_rsureg.h>
70
71 #ifdef USB_DEBUG
72 static int rsu_debug = 0;
73 SYSCTL_NODE(_hw_usb, OID_AUTO, rsu, CTLFLAG_RW, 0, "USB rsu");
74 SYSCTL_INT(_hw_usb_rsu, OID_AUTO, debug, CTLFLAG_RW, &rsu_debug, 0,
75     "Debug level");
76 #endif
77
78 static const STRUCT_USB_HOST_ID rsu_devs[] = {
79 #define RSU_HT_NOT_SUPPORTED 0
80 #define RSU_HT_SUPPORTED 1
81 #define RSU_DEV_HT(v,p)  { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, \
82                                    RSU_HT_SUPPORTED) }
83 #define RSU_DEV(v,p)     { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, \
84                                    RSU_HT_NOT_SUPPORTED) }
85         RSU_DEV(ASUS,                   RTL8192SU),
86         RSU_DEV(AZUREWAVE,              RTL8192SU_4),
87         RSU_DEV_HT(ACCTON,              RTL8192SU),
88         RSU_DEV_HT(ASUS,                USBN10),
89         RSU_DEV_HT(AZUREWAVE,           RTL8192SU_1),
90         RSU_DEV_HT(AZUREWAVE,           RTL8192SU_2),
91         RSU_DEV_HT(AZUREWAVE,           RTL8192SU_3),
92         RSU_DEV_HT(AZUREWAVE,           RTL8192SU_5),
93         RSU_DEV_HT(BELKIN,              RTL8192SU_1),
94         RSU_DEV_HT(BELKIN,              RTL8192SU_2),
95         RSU_DEV_HT(BELKIN,              RTL8192SU_3),
96         RSU_DEV_HT(CONCEPTRONIC2,       RTL8192SU_1),
97         RSU_DEV_HT(CONCEPTRONIC2,       RTL8192SU_2),
98         RSU_DEV_HT(CONCEPTRONIC2,       RTL8192SU_3),
99         RSU_DEV_HT(COREGA,              RTL8192SU),
100         RSU_DEV_HT(DLINK2,              DWA131A1),
101         RSU_DEV_HT(DLINK2,              RTL8192SU_1),
102         RSU_DEV_HT(DLINK2,              RTL8192SU_2),
103         RSU_DEV_HT(EDIMAX,              RTL8192SU_1),
104         RSU_DEV_HT(EDIMAX,              RTL8192SU_2),
105         RSU_DEV_HT(EDIMAX,              EW7622UMN),
106         RSU_DEV_HT(GUILLEMOT,           HWGUN54),
107         RSU_DEV_HT(GUILLEMOT,           HWNUM300),
108         RSU_DEV_HT(HAWKING,             RTL8192SU_1),
109         RSU_DEV_HT(HAWKING,             RTL8192SU_2),
110         RSU_DEV_HT(PLANEX2,             GWUSNANO),
111         RSU_DEV_HT(REALTEK,             RTL8171),
112         RSU_DEV_HT(REALTEK,             RTL8172),
113         RSU_DEV_HT(REALTEK,             RTL8173),
114         RSU_DEV_HT(REALTEK,             RTL8174),
115         RSU_DEV_HT(REALTEK,             RTL8192SU),
116         RSU_DEV_HT(REALTEK,             RTL8712),
117         RSU_DEV_HT(REALTEK,             RTL8713),
118         RSU_DEV_HT(SENAO,               RTL8192SU_1),
119         RSU_DEV_HT(SENAO,               RTL8192SU_2),
120         RSU_DEV_HT(SITECOMEU,           WL349V1),
121         RSU_DEV_HT(SITECOMEU,           WL353),
122         RSU_DEV_HT(SWEEX2,              LW154),
123 #undef RSU_DEV_HT
124 #undef RSU_DEV
125 };
126
127 static device_probe_t   rsu_match;
128 static device_attach_t  rsu_attach;
129 static device_detach_t  rsu_detach;
130 static usb_callback_t   rsu_bulk_tx_callback_be_bk;
131 static usb_callback_t   rsu_bulk_tx_callback_vi_vo;
132 static usb_callback_t   rsu_bulk_rx_callback;
133 static usb_error_t      rsu_do_request(struct rsu_softc *,
134                             struct usb_device_request *, void *);
135 static struct ieee80211vap *
136                 rsu_vap_create(struct ieee80211com *, const char name[],
137                     int, enum ieee80211_opmode, int, const uint8_t bssid[],
138                     const uint8_t mac[]);
139 static void     rsu_vap_delete(struct ieee80211vap *);
140 static void     rsu_scan_start(struct ieee80211com *);
141 static void     rsu_scan_end(struct ieee80211com *);
142 static void     rsu_set_channel(struct ieee80211com *);
143 static void     rsu_update_mcast(struct ifnet *);
144 static int      rsu_alloc_rx_list(struct rsu_softc *);
145 static void     rsu_free_rx_list(struct rsu_softc *);
146 static int      rsu_alloc_tx_list(struct rsu_softc *);
147 static void     rsu_free_tx_list(struct rsu_softc *);
148 static void     rsu_free_list(struct rsu_softc *, struct rsu_data [], int);
149 static struct rsu_data *_rsu_getbuf(struct rsu_softc *);
150 static struct rsu_data *rsu_getbuf(struct rsu_softc *);
151 static int      rsu_write_region_1(struct rsu_softc *, uint16_t, uint8_t *,
152                     int);
153 static void     rsu_write_1(struct rsu_softc *, uint16_t, uint8_t);
154 static void     rsu_write_2(struct rsu_softc *, uint16_t, uint16_t);
155 static void     rsu_write_4(struct rsu_softc *, uint16_t, uint32_t);
156 static int      rsu_read_region_1(struct rsu_softc *, uint16_t, uint8_t *,
157                     int);
158 static uint8_t  rsu_read_1(struct rsu_softc *, uint16_t);
159 static uint16_t rsu_read_2(struct rsu_softc *, uint16_t);
160 static uint32_t rsu_read_4(struct rsu_softc *, uint16_t);
161 static int      rsu_fw_iocmd(struct rsu_softc *, uint32_t);
162 static uint8_t  rsu_efuse_read_1(struct rsu_softc *, uint16_t);
163 static int      rsu_read_rom(struct rsu_softc *);
164 static int      rsu_fw_cmd(struct rsu_softc *, uint8_t, void *, int);
165 static void     rsu_calib_task(void *, int);
166 static int      rsu_newstate(struct ieee80211vap *, enum ieee80211_state, int);
167 #ifdef notyet
168 static void     rsu_set_key(struct rsu_softc *, const struct ieee80211_key *);
169 static void     rsu_delete_key(struct rsu_softc *, const struct ieee80211_key *);
170 #endif
171 static int      rsu_site_survey(struct rsu_softc *, struct ieee80211vap *);
172 static int      rsu_join_bss(struct rsu_softc *, struct ieee80211_node *);
173 static int      rsu_disconnect(struct rsu_softc *);
174 static void     rsu_event_survey(struct rsu_softc *, uint8_t *, int);
175 static void     rsu_event_join_bss(struct rsu_softc *, uint8_t *, int);
176 static void     rsu_rx_event(struct rsu_softc *, uint8_t, uint8_t *, int);
177 static void     rsu_rx_multi_event(struct rsu_softc *, uint8_t *, int);
178 static int8_t   rsu_get_rssi(struct rsu_softc *, int, void *);
179 static struct mbuf *
180                 rsu_rx_frame(struct rsu_softc *, uint8_t *, int, int *);
181 static struct mbuf *
182                 rsu_rx_multi_frame(struct rsu_softc *, uint8_t *, int, int *);
183 static struct mbuf *
184                 rsu_rxeof(struct usb_xfer *, struct rsu_data *, int *);
185 static void     rsu_txeof(struct usb_xfer *, struct rsu_data *);
186 static int      rsu_raw_xmit(struct ieee80211_node *, struct mbuf *, 
187                     const struct ieee80211_bpf_params *);
188 static void     rsu_init(void *);
189 static void     rsu_init_locked(struct rsu_softc *);
190 static int      rsu_tx_start(struct rsu_softc *, struct ieee80211_node *, 
191                     struct mbuf *, struct rsu_data *);
192 static void     rsu_start(struct ifnet *);
193 static void     rsu_start_locked(struct ifnet *);
194 static int      rsu_ioctl(struct ifnet *, u_long, caddr_t);
195 static void     rsu_stop(struct ifnet *, int);
196 static void     rsu_stop_locked(struct ifnet *, int);
197 static void     rsu_ms_delay(struct rsu_softc *);
198
199 static device_method_t rsu_methods[] = {
200         DEVMETHOD(device_probe,         rsu_match),
201         DEVMETHOD(device_attach,        rsu_attach),
202         DEVMETHOD(device_detach,        rsu_detach),
203
204         DEVMETHOD_END
205 };
206
207 static driver_t rsu_driver = {
208         .name = "rsu",
209         .methods = rsu_methods,
210         .size = sizeof(struct rsu_softc)
211 };
212
213 static devclass_t rsu_devclass;
214
215 DRIVER_MODULE(rsu, uhub, rsu_driver, rsu_devclass, NULL, 0);
216 MODULE_DEPEND(rsu, wlan, 1, 1, 1);
217 MODULE_DEPEND(rsu, usb, 1, 1, 1);
218 MODULE_DEPEND(rsu, firmware, 1, 1, 1);
219 MODULE_VERSION(rsu, 1);
220
221 static uint8_t rsu_wme_ac_xfer_map[4] = {
222         [WME_AC_BE] = RSU_BULK_TX_BE_BK,
223         [WME_AC_BK] = RSU_BULK_TX_BE_BK,
224         [WME_AC_VI] = RSU_BULK_TX_VI_VO,
225         [WME_AC_VO] = RSU_BULK_TX_VI_VO,
226 };
227
228 static const struct usb_config rsu_config[RSU_N_TRANSFER] = {
229         [RSU_BULK_RX] = {
230                 .type = UE_BULK,
231                 .endpoint = UE_ADDR_ANY,
232                 .direction = UE_DIR_IN,
233                 .bufsize = RSU_RXBUFSZ,
234                 .flags = {
235                         .pipe_bof = 1,
236                         .short_xfer_ok = 1
237                 },
238                 .callback = rsu_bulk_rx_callback
239         },
240         [RSU_BULK_TX_BE_BK] = {
241                 .type = UE_BULK,
242                 .endpoint = 0x06,
243                 .direction = UE_DIR_OUT,
244                 .bufsize = RSU_TXBUFSZ,
245                 .flags = {
246                         .ext_buffer = 1,
247                         .pipe_bof = 1,
248                         .force_short_xfer = 1
249                 },
250                 .callback = rsu_bulk_tx_callback_be_bk,
251                 .timeout = RSU_TX_TIMEOUT
252         },
253         [RSU_BULK_TX_VI_VO] = {
254                 .type = UE_BULK,
255                 .endpoint = 0x04,
256                 .direction = UE_DIR_OUT,
257                 .bufsize = RSU_TXBUFSZ,
258                 .flags = {
259                         .ext_buffer = 1,
260                         .pipe_bof = 1,
261                         .force_short_xfer = 1
262                 },
263                 .callback = rsu_bulk_tx_callback_vi_vo,
264                 .timeout = RSU_TX_TIMEOUT
265         },
266 };
267
268 static int
269 rsu_match(device_t self)
270 {
271         struct usb_attach_arg *uaa = device_get_ivars(self);
272
273         if (uaa->usb_mode != USB_MODE_HOST ||
274             uaa->info.bIfaceIndex != 0 ||
275             uaa->info.bConfigIndex != 0)
276                 return (ENXIO);
277
278         return (usbd_lookup_id_by_uaa(rsu_devs, sizeof(rsu_devs), uaa));
279 }
280
281 static int
282 rsu_attach(device_t self)
283 {
284         struct usb_attach_arg *uaa = device_get_ivars(self);
285         struct rsu_softc *sc = device_get_softc(self);
286         struct ifnet *ifp;
287         struct ieee80211com *ic;
288         int error;
289         uint8_t iface_index, bands;
290
291         device_set_usb_desc(self);
292         sc->sc_udev = uaa->device;
293         sc->sc_dev = self;
294
295         mtx_init(&sc->sc_mtx, device_get_nameunit(self), MTX_NETWORK_LOCK,
296             MTX_DEF);
297         TIMEOUT_TASK_INIT(taskqueue_thread, &sc->calib_task, 0, 
298             rsu_calib_task, sc);
299
300         /* Allocate Tx/Rx buffers. */
301         error = rsu_alloc_rx_list(sc);
302         if (error != 0) {
303                 device_printf(sc->sc_dev, "could not allocate Rx buffers\n");
304                 goto fail_usb;
305         }
306
307         error = rsu_alloc_tx_list(sc);
308         if (error != 0) {
309                 device_printf(sc->sc_dev, "could not allocate Tx buffers\n");
310                 rsu_free_rx_list(sc);
311                 goto fail_usb;
312         }
313
314         iface_index = 0;
315         error = usbd_transfer_setup(uaa->device, &iface_index, sc->sc_xfer,
316             rsu_config, RSU_N_TRANSFER, sc, &sc->sc_mtx);
317         if (error) {
318                 device_printf(sc->sc_dev,
319                     "could not allocate USB transfers, err=%s\n", 
320                     usbd_errstr(error));
321                 goto fail_usb;
322         }
323         RSU_LOCK(sc);
324         /* Read chip revision. */
325         sc->cut = MS(rsu_read_4(sc, R92S_PMC_FSM), R92S_PMC_FSM_CUT);
326         if (sc->cut != 3)
327                 sc->cut = (sc->cut >> 1) + 1;
328         error = rsu_read_rom(sc);
329         RSU_UNLOCK(sc);
330         if (error != 0) {
331                 device_printf(self, "could not read ROM\n");
332                 goto fail_rom;
333         }
334         IEEE80211_ADDR_COPY(sc->sc_bssid, &sc->rom[0x12]);
335         device_printf(self, "MAC/BB RTL8712 cut %d\n", sc->cut);
336         ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211);
337         if (ifp == NULL) {
338                 device_printf(self, "cannot allocate interface\n");
339                 goto fail_ifalloc;
340         }
341         ic = ifp->if_l2com;
342         ifp->if_softc = sc;
343         if_initname(ifp, "rsu", device_get_unit(self));
344         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
345         ifp->if_init = rsu_init;
346         ifp->if_ioctl = rsu_ioctl;
347         ifp->if_start = rsu_start;
348         IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen);
349         ifp->if_snd.ifq_drv_maxlen = ifqmaxlen;
350         IFQ_SET_READY(&ifp->if_snd);
351         ifp->if_capabilities |= IFCAP_RXCSUM;
352         ifp->if_capenable |= IFCAP_RXCSUM;
353         ifp->if_hwassist = CSUM_TCP;
354
355         ic->ic_ifp = ifp;
356         ic->ic_phytype = IEEE80211_T_OFDM;      /* Not only, but not used. */
357         ic->ic_opmode = IEEE80211_M_STA;        /* Default to BSS mode. */
358
359         /* Set device capabilities. */
360         ic->ic_caps =
361             IEEE80211_C_STA |           /* station mode */
362             IEEE80211_C_BGSCAN |        /* Background scan. */
363             IEEE80211_C_SHPREAMBLE |    /* Short preamble supported. */
364             IEEE80211_C_SHSLOT |        /* Short slot time supported. */
365             IEEE80211_C_WPA;            /* WPA/RSN. */
366
367 #if 0
368         /* Check if HT support is present. */
369         if (usb_lookup(rsu_devs_noht, uaa->vendor, uaa->product) == NULL) {
370                 /* Set HT capabilities. */
371                 ic->ic_htcaps =
372                     IEEE80211_HTCAP_CBW20_40 |
373                     IEEE80211_HTCAP_DSSSCCK40;
374                 /* Set supported HT rates. */
375                 for (i = 0; i < 2; i++)
376                         ic->ic_sup_mcs[i] = 0xff;
377         }
378 #endif
379
380         /* Set supported .11b and .11g rates. */
381         bands = 0;
382         setbit(&bands, IEEE80211_MODE_11B);
383         setbit(&bands, IEEE80211_MODE_11G);
384         ieee80211_init_channels(ic, NULL, &bands);
385
386         ieee80211_ifattach(ic, sc->sc_bssid);
387         ic->ic_raw_xmit = rsu_raw_xmit;
388         ic->ic_scan_start = rsu_scan_start;
389         ic->ic_scan_end = rsu_scan_end;
390         ic->ic_set_channel = rsu_set_channel;
391         ic->ic_vap_create = rsu_vap_create;
392         ic->ic_vap_delete = rsu_vap_delete;
393         ic->ic_update_mcast = rsu_update_mcast;
394
395         ieee80211_radiotap_attach(ic, &sc->sc_txtap.wt_ihdr,
396             sizeof(sc->sc_txtap), RSU_TX_RADIOTAP_PRESENT, 
397             &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap),
398             RSU_RX_RADIOTAP_PRESENT);
399
400         if (bootverbose)
401                 ieee80211_announce(ic);
402
403         return (0);
404
405 fail_ifalloc:
406 fail_rom:
407         usbd_transfer_unsetup(sc->sc_xfer, RSU_N_TRANSFER);
408 fail_usb:
409         mtx_destroy(&sc->sc_mtx);
410         return (ENXIO);
411 }
412
413 static int
414 rsu_detach(device_t self)
415 {
416         struct rsu_softc *sc = device_get_softc(self);
417         struct ifnet *ifp = sc->sc_ifp;
418         struct ieee80211com *ic = ifp->if_l2com;
419
420         rsu_stop(ifp, 1);
421         usbd_transfer_unsetup(sc->sc_xfer, RSU_N_TRANSFER);
422         ieee80211_ifdetach(ic);
423
424         taskqueue_drain_timeout(taskqueue_thread, &sc->calib_task);
425
426         /* Free Tx/Rx buffers. */
427         rsu_free_tx_list(sc);
428         rsu_free_rx_list(sc);
429
430         if_free(ifp);
431         mtx_destroy(&sc->sc_mtx);
432
433         return (0);
434 }
435
436 static usb_error_t
437 rsu_do_request(struct rsu_softc *sc, struct usb_device_request *req,
438     void *data)
439 {
440         usb_error_t err;
441         int ntries = 10;
442         
443         RSU_ASSERT_LOCKED(sc);
444
445         while (ntries--) {
446                 err = usbd_do_request_flags(sc->sc_udev, &sc->sc_mtx,
447                     req, data, 0, NULL, 250 /* ms */);
448                 if (err == 0 || err == USB_ERR_NOT_CONFIGURED)
449                         break;
450                 DPRINTFN(1, "Control request failed, %s (retrying)\n",
451                     usbd_errstr(err));
452                 usb_pause_mtx(&sc->sc_mtx, hz / 100);
453         }
454
455         return (err);
456 }
457
458 static struct ieee80211vap *
459 rsu_vap_create(struct ieee80211com *ic, const char name[IFNAMSIZ], int unit,
460     enum ieee80211_opmode opmode, int flags,
461     const uint8_t bssid[IEEE80211_ADDR_LEN],
462     const uint8_t mac[IEEE80211_ADDR_LEN])
463 {
464         struct rsu_vap *uvp;
465         struct ieee80211vap *vap;
466
467         if (!TAILQ_EMPTY(&ic->ic_vaps))         /* only one at a time */
468                 return (NULL);
469
470         uvp = (struct rsu_vap *) malloc(sizeof(struct rsu_vap),
471             M_80211_VAP, M_NOWAIT | M_ZERO);
472         if (uvp == NULL)
473                 return (NULL);
474         vap = &uvp->vap;
475
476         if (ieee80211_vap_setup(ic, vap, name, unit, opmode,
477             flags, bssid, mac) != 0) {
478                 /* out of memory */
479                 free(uvp, M_80211_VAP);
480                 return (NULL);
481         }
482
483         /* override state transition machine */
484         uvp->newstate = vap->iv_newstate;
485         vap->iv_newstate = rsu_newstate;
486
487         /* complete setup */
488         ieee80211_vap_attach(vap, ieee80211_media_change,
489             ieee80211_media_status);
490         ic->ic_opmode = opmode;
491
492         return (vap);
493 }
494
495 static void
496 rsu_vap_delete(struct ieee80211vap *vap)
497 {
498         struct rsu_vap *uvp = RSU_VAP(vap);
499
500         ieee80211_vap_detach(vap);
501         free(uvp, M_80211_VAP);
502 }
503
504 static void
505 rsu_scan_start(struct ieee80211com *ic)
506 {
507         int error;
508         struct ifnet *ifp = ic->ic_ifp;
509         struct rsu_softc *sc = ifp->if_softc;
510
511         /* Scanning is done by the firmware. */
512         RSU_LOCK(sc);
513         error = rsu_site_survey(sc, TAILQ_FIRST(&ic->ic_vaps));
514         RSU_UNLOCK(sc);
515         if (error != 0)
516                 device_printf(sc->sc_dev,
517                     "could not send site survey command\n");
518 }
519
520 static void
521 rsu_scan_end(struct ieee80211com *ic)
522 {
523         /* Nothing to do here. */
524 }
525
526 static void
527 rsu_set_channel(struct ieee80211com *ic __unused)
528 {
529         /* We are unable to switch channels, yet. */
530 }
531
532 static void
533 rsu_update_mcast(struct ifnet *ifp)
534 {
535         /* XXX do nothing?  */
536 }
537
538 static int
539 rsu_alloc_list(struct rsu_softc *sc, struct rsu_data data[],
540     int ndata, int maxsz)
541 {
542         int i, error;
543
544         for (i = 0; i < ndata; i++) {
545                 struct rsu_data *dp = &data[i];
546                 dp->sc = sc;
547                 dp->m = NULL;
548                 dp->buf = malloc(maxsz, M_USBDEV, M_NOWAIT);
549                 if (dp->buf == NULL) {
550                         device_printf(sc->sc_dev,
551                             "could not allocate buffer\n");
552                         error = ENOMEM;
553                         goto fail;
554                 }
555                 dp->ni = NULL;
556         }
557
558         return (0);
559 fail:
560         rsu_free_list(sc, data, ndata);
561         return (error);
562 }
563
564 static int
565 rsu_alloc_rx_list(struct rsu_softc *sc)
566 {
567         int error, i;
568
569         error = rsu_alloc_list(sc, sc->sc_rx, RSU_RX_LIST_COUNT,
570             RSU_RXBUFSZ);
571         if (error != 0)
572                 return (error);
573
574         STAILQ_INIT(&sc->sc_rx_active);
575         STAILQ_INIT(&sc->sc_rx_inactive);
576
577         for (i = 0; i < RSU_RX_LIST_COUNT; i++)
578                 STAILQ_INSERT_HEAD(&sc->sc_rx_inactive, &sc->sc_rx[i], next);
579
580         return (0);
581 }
582
583 static int
584 rsu_alloc_tx_list(struct rsu_softc *sc)
585 {
586         int error, i;
587
588         error = rsu_alloc_list(sc, sc->sc_tx, RSU_TX_LIST_COUNT,
589             RSU_TXBUFSZ);
590         if (error != 0)
591                 return (error);
592
593         STAILQ_INIT(&sc->sc_tx_inactive);
594
595         for (i = 0; i != RSU_N_TRANSFER; i++) {
596                 STAILQ_INIT(&sc->sc_tx_active[i]);
597                 STAILQ_INIT(&sc->sc_tx_pending[i]);
598         }
599
600         for (i = 0; i < RSU_TX_LIST_COUNT; i++) {
601                 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, &sc->sc_tx[i], next);
602         }
603
604         return (0);
605 }
606
607 static void
608 rsu_free_tx_list(struct rsu_softc *sc)
609 {
610         int i;
611
612         /* prevent further allocations from TX list(s) */
613         STAILQ_INIT(&sc->sc_tx_inactive);
614
615         for (i = 0; i != RSU_N_TRANSFER; i++) {
616                 STAILQ_INIT(&sc->sc_tx_active[i]);
617                 STAILQ_INIT(&sc->sc_tx_pending[i]);
618         }
619
620         rsu_free_list(sc, sc->sc_tx, RSU_TX_LIST_COUNT);
621 }
622
623 static void
624 rsu_free_rx_list(struct rsu_softc *sc)
625 {
626         /* prevent further allocations from RX list(s) */
627         STAILQ_INIT(&sc->sc_rx_inactive);
628         STAILQ_INIT(&sc->sc_rx_active);
629
630         rsu_free_list(sc, sc->sc_rx, RSU_RX_LIST_COUNT);
631 }
632
633 static void
634 rsu_free_list(struct rsu_softc *sc, struct rsu_data data[], int ndata)
635 {
636         int i;
637
638         for (i = 0; i < ndata; i++) {
639                 struct rsu_data *dp = &data[i];
640
641                 if (dp->buf != NULL) {
642                         free(dp->buf, M_USBDEV);
643                         dp->buf = NULL;
644                 }
645                 if (dp->ni != NULL) {
646                         ieee80211_free_node(dp->ni);
647                         dp->ni = NULL;
648                 }
649         }
650 }
651
652 static struct rsu_data *
653 _rsu_getbuf(struct rsu_softc *sc)
654 {
655         struct rsu_data *bf;
656
657         bf = STAILQ_FIRST(&sc->sc_tx_inactive);
658         if (bf != NULL)
659                 STAILQ_REMOVE_HEAD(&sc->sc_tx_inactive, next);
660         else
661                 bf = NULL;
662         if (bf == NULL)
663                 DPRINTF("out of xmit buffers\n");
664         return (bf);
665 }
666
667 static struct rsu_data *
668 rsu_getbuf(struct rsu_softc *sc)
669 {
670         struct rsu_data *bf;
671
672         RSU_ASSERT_LOCKED(sc);
673
674         bf = _rsu_getbuf(sc);
675         if (bf == NULL) {
676                 struct ifnet *ifp = sc->sc_ifp;
677                 DPRINTF("stop queue\n");
678                 ifp->if_drv_flags |= IFF_DRV_OACTIVE;
679         }
680         return (bf);
681 }
682
683 static int
684 rsu_write_region_1(struct rsu_softc *sc, uint16_t addr, uint8_t *buf,
685     int len)
686 {
687         usb_device_request_t req;
688
689         req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
690         req.bRequest = R92S_REQ_REGS;
691         USETW(req.wValue, addr);
692         USETW(req.wIndex, 0);
693         USETW(req.wLength, len);
694
695         return (rsu_do_request(sc, &req, buf));
696 }
697
698 static void
699 rsu_write_1(struct rsu_softc *sc, uint16_t addr, uint8_t val)
700 {
701         rsu_write_region_1(sc, addr, &val, 1);
702 }
703
704 static void
705 rsu_write_2(struct rsu_softc *sc, uint16_t addr, uint16_t val)
706 {
707         val = htole16(val);
708         rsu_write_region_1(sc, addr, (uint8_t *)&val, 2);
709 }
710
711 static void
712 rsu_write_4(struct rsu_softc *sc, uint16_t addr, uint32_t val)
713 {
714         val = htole32(val);
715         rsu_write_region_1(sc, addr, (uint8_t *)&val, 4);
716 }
717
718 static int
719 rsu_read_region_1(struct rsu_softc *sc, uint16_t addr, uint8_t *buf,
720     int len)
721 {
722         usb_device_request_t req;
723
724         req.bmRequestType = UT_READ_VENDOR_DEVICE;
725         req.bRequest = R92S_REQ_REGS;
726         USETW(req.wValue, addr);
727         USETW(req.wIndex, 0);
728         USETW(req.wLength, len);
729
730         return (rsu_do_request(sc, &req, buf));
731 }
732
733 static uint8_t
734 rsu_read_1(struct rsu_softc *sc, uint16_t addr)
735 {
736         uint8_t val;
737
738         if (rsu_read_region_1(sc, addr, &val, 1) != 0)
739                 return (0xff);
740         return (val);
741 }
742
743 static uint16_t
744 rsu_read_2(struct rsu_softc *sc, uint16_t addr)
745 {
746         uint16_t val;
747
748         if (rsu_read_region_1(sc, addr, (uint8_t *)&val, 2) != 0)
749                 return (0xffff);
750         return (le16toh(val));
751 }
752
753 static uint32_t
754 rsu_read_4(struct rsu_softc *sc, uint16_t addr)
755 {
756         uint32_t val;
757
758         if (rsu_read_region_1(sc, addr, (uint8_t *)&val, 4) != 0)
759                 return (0xffffffff);
760         return (le32toh(val));
761 }
762
763 static int
764 rsu_fw_iocmd(struct rsu_softc *sc, uint32_t iocmd)
765 {
766         int ntries;
767
768         rsu_write_4(sc, R92S_IOCMD_CTRL, iocmd);
769         rsu_ms_delay(sc);
770         for (ntries = 0; ntries < 50; ntries++) {
771                 if (rsu_read_4(sc, R92S_IOCMD_CTRL) == 0)
772                         return (0);
773                 rsu_ms_delay(sc);
774         }
775         return (ETIMEDOUT);
776 }
777
778 static uint8_t
779 rsu_efuse_read_1(struct rsu_softc *sc, uint16_t addr)
780 {
781         uint32_t reg;
782         int ntries;
783
784         reg = rsu_read_4(sc, R92S_EFUSE_CTRL);
785         reg = RW(reg, R92S_EFUSE_CTRL_ADDR, addr);
786         reg &= ~R92S_EFUSE_CTRL_VALID;
787         rsu_write_4(sc, R92S_EFUSE_CTRL, reg);
788         /* Wait for read operation to complete. */
789         for (ntries = 0; ntries < 100; ntries++) {
790                 reg = rsu_read_4(sc, R92S_EFUSE_CTRL);
791                 if (reg & R92S_EFUSE_CTRL_VALID)
792                         return (MS(reg, R92S_EFUSE_CTRL_DATA));
793                 rsu_ms_delay(sc);
794         }
795         device_printf(sc->sc_dev,
796             "could not read efuse byte at address 0x%x\n", addr);
797         return (0xff);
798 }
799
800 static int
801 rsu_read_rom(struct rsu_softc *sc)
802 {
803         uint8_t *rom = sc->rom;
804         uint16_t addr = 0;
805         uint32_t reg;
806         uint8_t off, msk;
807         int i;
808
809         /* Make sure that ROM type is eFuse and that autoload succeeded. */
810         reg = rsu_read_1(sc, R92S_EE_9346CR);
811         if ((reg & (R92S_9356SEL | R92S_EEPROM_EN)) != R92S_EEPROM_EN)
812                 return (EIO);
813
814         /* Turn on 2.5V to prevent eFuse leakage. */
815         reg = rsu_read_1(sc, R92S_EFUSE_TEST + 3);
816         rsu_write_1(sc, R92S_EFUSE_TEST + 3, reg | 0x80);
817         rsu_ms_delay(sc);
818         rsu_write_1(sc, R92S_EFUSE_TEST + 3, reg & ~0x80);
819
820         /* Read full ROM image. */
821         memset(&sc->rom, 0xff, sizeof(sc->rom));
822         while (addr < 512) {
823                 reg = rsu_efuse_read_1(sc, addr);
824                 if (reg == 0xff)
825                         break;
826                 addr++;
827                 off = reg >> 4;
828                 msk = reg & 0xf;
829                 for (i = 0; i < 4; i++) {
830                         if (msk & (1 << i))
831                                 continue;
832                         rom[off * 8 + i * 2 + 0] =
833                             rsu_efuse_read_1(sc, addr);
834                         addr++;
835                         rom[off * 8 + i * 2 + 1] =
836                             rsu_efuse_read_1(sc, addr);
837                         addr++;
838                 }
839         }
840 #ifdef USB_DEBUG
841         if (rsu_debug >= 5) {
842                 /* Dump ROM content. */
843                 printf("\n");
844                 for (i = 0; i < sizeof(sc->rom); i++)
845                         printf("%02x:", rom[i]);
846                 printf("\n");
847         }
848 #endif
849         return (0);
850 }
851
852 static int
853 rsu_fw_cmd(struct rsu_softc *sc, uint8_t code, void *buf, int len)
854 {
855         const uint8_t which = rsu_wme_ac_xfer_map[WME_AC_VO];
856         struct rsu_data *data;
857         struct r92s_tx_desc *txd;
858         struct r92s_fw_cmd_hdr *cmd;
859         int cmdsz;
860         int xferlen;
861
862         data = rsu_getbuf(sc);
863         if (data == NULL)
864                 return (ENOMEM);
865
866         /* Round-up command length to a multiple of 8 bytes. */
867         cmdsz = (len + 7) & ~7;
868
869         xferlen = sizeof(*txd) + sizeof(*cmd) + cmdsz;
870         KASSERT(xferlen <= RSU_TXBUFSZ, ("%s: invalid length", __func__));
871         memset(data->buf, 0, xferlen);
872
873         /* Setup Tx descriptor. */
874         txd = (struct r92s_tx_desc *)data->buf;
875         txd->txdw0 = htole32(
876             SM(R92S_TXDW0_OFFSET, sizeof(*txd)) |
877             SM(R92S_TXDW0_PKTLEN, sizeof(*cmd) + cmdsz) |
878             R92S_TXDW0_OWN | R92S_TXDW0_FSG | R92S_TXDW0_LSG);
879         txd->txdw1 = htole32(SM(R92S_TXDW1_QSEL, R92S_TXDW1_QSEL_H2C));
880
881         /* Setup command header. */
882         cmd = (struct r92s_fw_cmd_hdr *)&txd[1];
883         cmd->len = htole16(cmdsz);
884         cmd->code = code;
885         cmd->seq = sc->cmd_seq;
886         sc->cmd_seq = (sc->cmd_seq + 1) & 0x7f;
887
888         /* Copy command payload. */
889         memcpy(&cmd[1], buf, len);
890
891         DPRINTFN(2, "Tx cmd code=0x%x len=0x%x\n", code, cmdsz);
892         data->buflen = xferlen;
893         STAILQ_INSERT_TAIL(&sc->sc_tx_pending[which], data, next);
894         usbd_transfer_start(sc->sc_xfer[which]);
895
896         return (0);
897 }
898
899 /* ARGSUSED */
900 static void
901 rsu_calib_task(void *arg, int pending __unused)
902 {
903         struct rsu_softc *sc = arg;
904         uint32_t reg;
905
906         DPRINTFN(6, "running calibration task\n");
907
908         RSU_LOCK(sc);
909 #ifdef notyet
910         /* Read WPS PBC status. */
911         rsu_write_1(sc, R92S_MAC_PINMUX_CTRL,
912             R92S_GPIOMUX_EN | SM(R92S_GPIOSEL_GPIO, R92S_GPIOSEL_GPIO_JTAG));
913         rsu_write_1(sc, R92S_GPIO_IO_SEL,
914             rsu_read_1(sc, R92S_GPIO_IO_SEL) & ~R92S_GPIO_WPS);
915         reg = rsu_read_1(sc, R92S_GPIO_CTRL);
916         if (reg != 0xff && (reg & R92S_GPIO_WPS))
917                 DPRINTF(("WPS PBC is pushed\n"));
918 #endif
919         /* Read current signal level. */
920         if (rsu_fw_iocmd(sc, 0xf4000001) == 0) {
921                 reg = rsu_read_4(sc, R92S_IOCMD_DATA);
922                 DPRINTFN(8, "RSSI=%d%%\n", reg >> 4);
923         }
924         if (sc->sc_calibrating)
925                 taskqueue_enqueue_timeout(taskqueue_thread, &sc->calib_task, hz);
926         RSU_UNLOCK(sc);
927 }
928
929 static int
930 rsu_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
931 {
932         struct rsu_vap *uvp = RSU_VAP(vap);
933         struct ieee80211com *ic = vap->iv_ic;
934         struct rsu_softc *sc = ic->ic_ifp->if_softc;
935         struct ieee80211_node *ni;
936         struct ieee80211_rateset *rs;
937         enum ieee80211_state ostate;
938         int error, startcal = 0;
939
940         ostate = vap->iv_state;
941         DPRINTF("%s -> %s\n", ieee80211_state_name[ostate],
942             ieee80211_state_name[nstate]);
943
944         IEEE80211_UNLOCK(ic);
945         if (ostate == IEEE80211_S_RUN) {
946                 RSU_LOCK(sc);
947                 /* Stop calibration. */
948                 sc->sc_calibrating = 0;
949                 RSU_UNLOCK(sc);
950                 taskqueue_drain_timeout(taskqueue_thread, &sc->calib_task);
951                 /* Disassociate from our current BSS. */
952                 RSU_LOCK(sc);
953                 rsu_disconnect(sc);
954         } else
955                 RSU_LOCK(sc);
956         switch (nstate) {
957         case IEEE80211_S_INIT:
958                 break;
959         case IEEE80211_S_AUTH:
960                 ni = ieee80211_ref_node(vap->iv_bss);
961                 error = rsu_join_bss(sc, ni);
962                 ieee80211_free_node(ni);
963                 if (error != 0) {
964                         device_printf(sc->sc_dev,
965                             "could not send join command\n");
966                 }
967                 break;
968         case IEEE80211_S_RUN:
969                 ni = ieee80211_ref_node(vap->iv_bss);
970                 rs = &ni->ni_rates;
971                 /* Indicate highest supported rate. */
972                 ni->ni_txrate = rs->rs_rates[rs->rs_nrates - 1];
973                 ieee80211_free_node(ni);
974                 startcal = 1;
975                 break;
976         default:
977                 break;
978         }
979         sc->sc_calibrating = 1;
980         /* Start periodic calibration. */
981         taskqueue_enqueue_timeout(taskqueue_thread, &sc->calib_task, hz);
982         RSU_UNLOCK(sc);
983         IEEE80211_LOCK(ic);
984         return (uvp->newstate(vap, nstate, arg));
985 }
986
987 #ifdef notyet
988 static void
989 rsu_set_key(struct rsu_softc *sc, const struct ieee80211_key *k)
990 {
991         struct r92s_fw_cmd_set_key key;
992
993         memset(&key, 0, sizeof(key));
994         /* Map net80211 cipher to HW crypto algorithm. */
995         switch (k->wk_cipher->ic_cipher) {
996         case IEEE80211_CIPHER_WEP:
997                 if (k->wk_keylen < 8)
998                         key.algo = R92S_KEY_ALGO_WEP40;
999                 else
1000                         key.algo = R92S_KEY_ALGO_WEP104;
1001                 break;
1002         case IEEE80211_CIPHER_TKIP:
1003                 key.algo = R92S_KEY_ALGO_TKIP;
1004                 break;
1005         case IEEE80211_CIPHER_AES_CCM:
1006                 key.algo = R92S_KEY_ALGO_AES;
1007                 break;
1008         default:
1009                 return;
1010         }
1011         key.id = k->wk_keyix;
1012         key.grpkey = (k->wk_flags & IEEE80211_KEY_GROUP) != 0;
1013         memcpy(key.key, k->wk_key, MIN(k->wk_keylen, sizeof(key.key)));
1014         (void)rsu_fw_cmd(sc, R92S_CMD_SET_KEY, &key, sizeof(key));
1015 }
1016
1017 static void
1018 rsu_delete_key(struct rsu_softc *sc, const struct ieee80211_key *k)
1019 {
1020         struct r92s_fw_cmd_set_key key;
1021
1022         memset(&key, 0, sizeof(key));
1023         key.id = k->wk_keyix;
1024         (void)rsu_fw_cmd(sc, R92S_CMD_SET_KEY, &key, sizeof(key));
1025 }
1026 #endif
1027
1028 static int
1029 rsu_site_survey(struct rsu_softc *sc, struct ieee80211vap *vap)
1030 {
1031         struct r92s_fw_cmd_sitesurvey cmd;
1032         struct ifnet *ifp = sc->sc_ifp;
1033         struct ieee80211com *ic = ifp->if_l2com;
1034
1035         memset(&cmd, 0, sizeof(cmd));
1036         if ((ic->ic_flags & IEEE80211_F_ASCAN) || sc->scan_pass == 1)
1037                 cmd.active = htole32(1);
1038         cmd.limit = htole32(48);
1039         if (sc->scan_pass == 1 && vap->iv_des_nssid > 0) {
1040                 /* Do a directed scan for second pass. */
1041                 cmd.ssidlen = htole32(vap->iv_des_ssid[0].len);
1042                 memcpy(cmd.ssid, vap->iv_des_ssid[0].ssid,
1043                     vap->iv_des_ssid[0].len);
1044
1045         }
1046         DPRINTF("sending site survey command, pass=%d\n", sc->scan_pass);
1047         return (rsu_fw_cmd(sc, R92S_CMD_SITE_SURVEY, &cmd, sizeof(cmd)));
1048 }
1049
1050 static int
1051 rsu_join_bss(struct rsu_softc *sc, struct ieee80211_node *ni)
1052 {
1053         struct ifnet *ifp = sc->sc_ifp;
1054         struct ieee80211com *ic = ifp->if_l2com;
1055         struct ieee80211vap *vap = ni->ni_vap;
1056         struct ndis_wlan_bssid_ex *bss;
1057         struct ndis_802_11_fixed_ies *fixed;
1058         struct r92s_fw_cmd_auth auth;
1059         uint8_t buf[sizeof(*bss) + 128] __aligned(4);
1060         uint8_t *frm;
1061         uint8_t opmode;
1062         int error;
1063
1064         /* Let the FW decide the opmode based on the capinfo field. */
1065         opmode = NDIS802_11AUTOUNKNOWN;
1066         DPRINTF("setting operating mode to %d\n", opmode);
1067         error = rsu_fw_cmd(sc, R92S_CMD_SET_OPMODE, &opmode, sizeof(opmode));
1068         if (error != 0)
1069                 return (error);
1070
1071         memset(&auth, 0, sizeof(auth));
1072         if (vap->iv_flags & IEEE80211_F_WPA) {
1073                 auth.mode = R92S_AUTHMODE_WPA;
1074                 auth.dot1x = (ni->ni_authmode == IEEE80211_AUTH_8021X);
1075         } else
1076                 auth.mode = R92S_AUTHMODE_OPEN;
1077         DPRINTF("setting auth mode to %d\n", auth.mode);
1078         error = rsu_fw_cmd(sc, R92S_CMD_SET_AUTH, &auth, sizeof(auth));
1079         if (error != 0)
1080                 return (error);
1081
1082         memset(buf, 0, sizeof(buf));
1083         bss = (struct ndis_wlan_bssid_ex *)buf;
1084         IEEE80211_ADDR_COPY(bss->macaddr, ni->ni_bssid);
1085         bss->ssid.ssidlen = htole32(ni->ni_esslen);
1086         memcpy(bss->ssid.ssid, ni->ni_essid, ni->ni_esslen);
1087         if (vap->iv_flags & (IEEE80211_F_PRIVACY | IEEE80211_F_WPA))
1088                 bss->privacy = htole32(1);
1089         bss->rssi = htole32(ni->ni_avgrssi);
1090         if (ic->ic_curmode == IEEE80211_MODE_11B)
1091                 bss->networktype = htole32(NDIS802_11DS);
1092         else
1093                 bss->networktype = htole32(NDIS802_11OFDM24);
1094         bss->config.len = htole32(sizeof(bss->config));
1095         bss->config.bintval = htole32(ni->ni_intval);
1096         bss->config.dsconfig = htole32(ieee80211_chan2ieee(ic, ni->ni_chan));
1097         bss->inframode = htole32(NDIS802_11INFRASTRUCTURE);
1098         memcpy(bss->supprates, ni->ni_rates.rs_rates,
1099             ni->ni_rates.rs_nrates);
1100         /* Write the fixed fields of the beacon frame. */
1101         fixed = (struct ndis_802_11_fixed_ies *)&bss[1];
1102         memcpy(&fixed->tstamp, ni->ni_tstamp.data, 8);
1103         fixed->bintval = htole16(ni->ni_intval);
1104         fixed->capabilities = htole16(ni->ni_capinfo);
1105         /* Write IEs to be included in the association request. */
1106         frm = (uint8_t *)&fixed[1];
1107         frm = ieee80211_add_rsn(frm, vap);
1108         frm = ieee80211_add_wpa(frm, vap);
1109         frm = ieee80211_add_qos(frm, ni);
1110         if (ni->ni_flags & IEEE80211_NODE_HT)
1111                 frm = ieee80211_add_htcap(frm, ni);
1112         bss->ieslen = htole32(frm - (uint8_t *)fixed);
1113         bss->len = htole32(((frm - buf) + 3) & ~3);
1114         DPRINTF("sending join bss command to %s chan %d\n",
1115             ether_sprintf(bss->macaddr), le32toh(bss->config.dsconfig));
1116         return (rsu_fw_cmd(sc, R92S_CMD_JOIN_BSS, buf, sizeof(buf)));
1117 }
1118
1119 static int
1120 rsu_disconnect(struct rsu_softc *sc)
1121 {
1122         uint32_t zero = 0;      /* :-) */
1123
1124         /* Disassociate from our current BSS. */
1125         DPRINTF("sending disconnect command\n");
1126         return (rsu_fw_cmd(sc, R92S_CMD_DISCONNECT, &zero, sizeof(zero)));
1127 }
1128
1129 static void
1130 rsu_event_survey(struct rsu_softc *sc, uint8_t *buf, int len)
1131 {
1132         struct ifnet *ifp = sc->sc_ifp;
1133         struct ieee80211com *ic = ifp->if_l2com;
1134         struct ieee80211_frame *wh;
1135         struct ieee80211_channel *c;
1136         struct ndis_wlan_bssid_ex *bss;
1137         struct mbuf *m;
1138         int pktlen;
1139
1140         if (__predict_false(len < sizeof(*bss)))
1141                 return;
1142         bss = (struct ndis_wlan_bssid_ex *)buf;
1143         if (__predict_false(len < sizeof(*bss) + le32toh(bss->ieslen)))
1144                 return;
1145
1146         DPRINTFN(2, "found BSS %s: len=%d chan=%d inframode=%d "
1147             "networktype=%d privacy=%d\n",
1148             ether_sprintf(bss->macaddr), le32toh(bss->len),
1149             le32toh(bss->config.dsconfig), le32toh(bss->inframode),
1150             le32toh(bss->networktype), le32toh(bss->privacy));
1151
1152         /* Build a fake beacon frame to let net80211 do all the parsing. */
1153         pktlen = sizeof(*wh) + le32toh(bss->ieslen);
1154         if (__predict_false(pktlen > MCLBYTES))
1155                 return;
1156         MGETHDR(m, M_NOWAIT, MT_DATA);
1157         if (__predict_false(m == NULL))
1158                 return;
1159         if (pktlen > MHLEN) {
1160                 MCLGET(m, M_NOWAIT);
1161                 if (!(m->m_flags & M_EXT)) {
1162                         m_free(m);
1163                         return;
1164                 }
1165         }
1166         wh = mtod(m, struct ieee80211_frame *);
1167         wh->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_MGT |
1168             IEEE80211_FC0_SUBTYPE_BEACON;
1169         wh->i_fc[1] = IEEE80211_FC1_DIR_NODS;
1170         USETW(wh->i_dur, 0);
1171         IEEE80211_ADDR_COPY(wh->i_addr1, ifp->if_broadcastaddr);
1172         IEEE80211_ADDR_COPY(wh->i_addr2, bss->macaddr);
1173         IEEE80211_ADDR_COPY(wh->i_addr3, bss->macaddr);
1174         *(uint16_t *)wh->i_seq = 0;
1175         memcpy(&wh[1], (uint8_t *)&bss[1], le32toh(bss->ieslen));
1176
1177         /* Finalize mbuf. */
1178         m->m_pkthdr.len = m->m_len = pktlen;
1179         m->m_pkthdr.rcvif = ifp;
1180         /* Fix the channel. */
1181         c = ieee80211_find_channel_byieee(ic, 
1182             le32toh(bss->config.dsconfig), 
1183             IEEE80211_CHAN_G);
1184         if (c) {
1185                 ic->ic_curchan = c;
1186                 ieee80211_radiotap_chan_change(ic);
1187         }
1188         /* XXX avoid a LOR */
1189         RSU_UNLOCK(sc);
1190         ieee80211_input_all(ic, m, le32toh(bss->rssi), 0);
1191         RSU_LOCK(sc);
1192 }
1193
1194 static void
1195 rsu_event_join_bss(struct rsu_softc *sc, uint8_t *buf, int len)
1196 {
1197         struct ifnet *ifp = sc->sc_ifp;
1198         struct ieee80211com *ic = ifp->if_l2com;
1199         struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
1200         struct ieee80211_node *ni = vap->iv_bss;
1201         struct r92s_event_join_bss *rsp;
1202         uint32_t tmp;
1203         int res;
1204
1205         if (__predict_false(len < sizeof(*rsp)))
1206                 return;
1207         rsp = (struct r92s_event_join_bss *)buf;
1208         res = (int)le32toh(rsp->join_res);
1209
1210         DPRINTF("Rx join BSS event len=%d res=%d\n", len, res);
1211         if (res <= 0) {
1212                 RSU_UNLOCK(sc);
1213                 ieee80211_new_state(vap, IEEE80211_S_SCAN, -1);
1214                 RSU_LOCK(sc);
1215                 return;
1216         }
1217         tmp = le32toh(rsp->associd);
1218         if (tmp >= vap->iv_max_aid) {
1219                 DPRINTF("Assoc ID overflow\n");
1220                 tmp = 1;
1221         }
1222         DPRINTF("associated with %s associd=%d\n",
1223             ether_sprintf(rsp->bss.macaddr), tmp);
1224         ni->ni_associd = tmp | 0xc000;
1225         RSU_UNLOCK(sc);
1226         ieee80211_new_state(vap, IEEE80211_S_RUN,
1227             IEEE80211_FC0_SUBTYPE_ASSOC_RESP);
1228         RSU_LOCK(sc);
1229 }
1230
1231 static void
1232 rsu_rx_event(struct rsu_softc *sc, uint8_t code, uint8_t *buf, int len)
1233 {
1234         struct ifnet *ifp = sc->sc_ifp;
1235         struct ieee80211com *ic = ifp->if_l2com;
1236         struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
1237
1238         DPRINTFN(4, "Rx event code=%d len=%d\n", code, len);
1239         switch (code) {
1240         case R92S_EVT_SURVEY:
1241                 if (vap->iv_state == IEEE80211_S_SCAN)
1242                         rsu_event_survey(sc, buf, len);
1243                 break;
1244         case R92S_EVT_SURVEY_DONE:
1245                 DPRINTF("site survey pass %d done, found %d BSS\n",
1246                     sc->scan_pass, le32toh(*(uint32_t *)buf));
1247                 if (vap->iv_state != IEEE80211_S_SCAN)
1248                         break;  /* Ignore if not scanning. */
1249                 if (sc->scan_pass == 0 && vap->iv_des_nssid != 0) {
1250                         /* Schedule a directed scan for hidden APs. */
1251                         sc->scan_pass = 1;
1252                         RSU_UNLOCK(sc);
1253                         ieee80211_new_state(vap, IEEE80211_S_SCAN, -1);
1254                         RSU_LOCK(sc);
1255                         break;
1256                 }
1257                 sc->scan_pass = 0;
1258                 break;
1259         case R92S_EVT_JOIN_BSS:
1260                 if (vap->iv_state == IEEE80211_S_AUTH)
1261                         rsu_event_join_bss(sc, buf, len);
1262                 break;
1263 #if 0
1264 XXX This event is occurring regularly, possibly due to some power saving event
1265 XXX and disrupts the WLAN traffic. Disable for now.
1266         case R92S_EVT_DEL_STA:
1267                 DPRINTF("disassociated from %s\n", ether_sprintf(buf));
1268                 if (vap->iv_state == IEEE80211_S_RUN &&
1269                     IEEE80211_ADDR_EQ(vap->iv_bss->ni_bssid, buf)) {
1270                         RSU_UNLOCK(sc);
1271                         ieee80211_new_state(vap, IEEE80211_S_SCAN, -1);
1272                         RSU_LOCK(sc);
1273                 }
1274                 break;
1275 #endif
1276         case R92S_EVT_WPS_PBC:
1277                 DPRINTF("WPS PBC pushed.\n");
1278                 break;
1279         case R92S_EVT_FWDBG:
1280                 if (ifp->if_flags & IFF_DEBUG) {
1281                         buf[60] = '\0';
1282                         printf("FWDBG: %s\n", (char *)buf);
1283                 }
1284                 break;
1285         default:
1286                 break;
1287         }
1288 }
1289
1290 static void
1291 rsu_rx_multi_event(struct rsu_softc *sc, uint8_t *buf, int len)
1292 {
1293         struct r92s_fw_cmd_hdr *cmd;
1294         int cmdsz;
1295
1296         DPRINTFN(6, "Rx events len=%d\n", len);
1297
1298         /* Skip Rx status. */
1299         buf += sizeof(struct r92s_rx_stat);
1300         len -= sizeof(struct r92s_rx_stat);
1301
1302         /* Process all events. */
1303         for (;;) {
1304                 /* Check that command header fits. */
1305                 if (__predict_false(len < sizeof(*cmd)))
1306                         break;
1307                 cmd = (struct r92s_fw_cmd_hdr *)buf;
1308                 /* Check that command payload fits. */
1309                 cmdsz = le16toh(cmd->len);
1310                 if (__predict_false(len < sizeof(*cmd) + cmdsz))
1311                         break;
1312
1313                 /* Process firmware event. */
1314                 rsu_rx_event(sc, cmd->code, (uint8_t *)&cmd[1], cmdsz);
1315
1316                 if (!(cmd->seq & R92S_FW_CMD_MORE))
1317                         break;
1318                 buf += sizeof(*cmd) + cmdsz;
1319                 len -= sizeof(*cmd) + cmdsz;
1320         }
1321 }
1322
1323 static int8_t
1324 rsu_get_rssi(struct rsu_softc *sc, int rate, void *physt)
1325 {
1326         static const int8_t cckoff[] = { 14, -2, -20, -40 };
1327         struct r92s_rx_phystat *phy;
1328         struct r92s_rx_cck *cck;
1329         uint8_t rpt;
1330         int8_t rssi;
1331
1332         if (rate <= 3) {
1333                 cck = (struct r92s_rx_cck *)physt;
1334                 rpt = (cck->agc_rpt >> 6) & 0x3;
1335                 rssi = cck->agc_rpt & 0x3e;
1336                 rssi = cckoff[rpt] - rssi;
1337         } else {        /* OFDM/HT. */
1338                 phy = (struct r92s_rx_phystat *)physt;
1339                 rssi = ((le32toh(phy->phydw1) >> 1) & 0x7f) - 106;
1340         }
1341         return (rssi);
1342 }
1343
1344 static struct mbuf *
1345 rsu_rx_frame(struct rsu_softc *sc, uint8_t *buf, int pktlen, int *rssi)
1346 {
1347         struct ifnet *ifp = sc->sc_ifp;
1348         struct ieee80211com *ic = ifp->if_l2com;
1349         struct ieee80211_frame *wh;
1350         struct r92s_rx_stat *stat;
1351         uint32_t rxdw0, rxdw3;
1352         struct mbuf *m;
1353         uint8_t rate;
1354         int infosz;
1355
1356         stat = (struct r92s_rx_stat *)buf;
1357         rxdw0 = le32toh(stat->rxdw0);
1358         rxdw3 = le32toh(stat->rxdw3);
1359
1360         if (__predict_false(rxdw0 & R92S_RXDW0_CRCERR)) {
1361                 ifp->if_ierrors++;
1362                 return NULL;
1363         }
1364         if (__predict_false(pktlen < sizeof(*wh) || pktlen > MCLBYTES)) {
1365                 ifp->if_ierrors++;
1366                 return NULL;
1367         }
1368
1369         rate = MS(rxdw3, R92S_RXDW3_RATE);
1370         infosz = MS(rxdw0, R92S_RXDW0_INFOSZ) * 8;
1371
1372         /* Get RSSI from PHY status descriptor if present. */
1373         if (infosz != 0)
1374                 *rssi = rsu_get_rssi(sc, rate, &stat[1]);
1375         else
1376                 *rssi = 0;
1377
1378         DPRINTFN(5, "Rx frame len=%d rate=%d infosz=%d rssi=%d\n",
1379             pktlen, rate, infosz, *rssi);
1380
1381         MGETHDR(m, M_NOWAIT, MT_DATA);
1382         if (__predict_false(m == NULL)) {
1383                 ifp->if_ierrors++;
1384                 return NULL;
1385         }
1386         if (pktlen > MHLEN) {
1387                 MCLGET(m, M_NOWAIT);
1388                 if (__predict_false(!(m->m_flags & M_EXT))) {
1389                         ifp->if_ierrors++;
1390                         m_freem(m);
1391                         return NULL;
1392                 }
1393         }
1394         /* Finalize mbuf. */
1395         m->m_pkthdr.rcvif = ifp;
1396         /* Hardware does Rx TCP checksum offload. */
1397         if (rxdw3 & R92S_RXDW3_TCPCHKVALID) {
1398                 if (__predict_true(rxdw3 & R92S_RXDW3_TCPCHKRPT))
1399                         m->m_pkthdr.csum_flags |= CSUM_DATA_VALID;
1400         }
1401         wh = (struct ieee80211_frame *)((uint8_t *)&stat[1] + infosz);
1402         memcpy(mtod(m, uint8_t *), wh, pktlen);
1403         m->m_pkthdr.len = m->m_len = pktlen;
1404
1405         if (ieee80211_radiotap_active(ic)) {
1406                 struct rsu_rx_radiotap_header *tap = &sc->sc_rxtap;
1407
1408                 /* Map HW rate index to 802.11 rate. */
1409                 tap->wr_flags = 2;
1410                 if (!(rxdw3 & R92S_RXDW3_HTC)) {
1411                         switch (rate) {
1412                         /* CCK. */
1413                         case  0: tap->wr_rate =   2; break;
1414                         case  1: tap->wr_rate =   4; break;
1415                         case  2: tap->wr_rate =  11; break;
1416                         case  3: tap->wr_rate =  22; break;
1417                         /* OFDM. */
1418                         case  4: tap->wr_rate =  12; break;
1419                         case  5: tap->wr_rate =  18; break;
1420                         case  6: tap->wr_rate =  24; break;
1421                         case  7: tap->wr_rate =  36; break;
1422                         case  8: tap->wr_rate =  48; break;
1423                         case  9: tap->wr_rate =  72; break;
1424                         case 10: tap->wr_rate =  96; break;
1425                         case 11: tap->wr_rate = 108; break;
1426                         }
1427                 } else if (rate >= 12) {        /* MCS0~15. */
1428                         /* Bit 7 set means HT MCS instead of rate. */
1429                         tap->wr_rate = 0x80 | (rate - 12);
1430                 }
1431                 tap->wr_dbm_antsignal = *rssi;
1432                 tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq);
1433                 tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
1434         }
1435
1436         return (m);
1437 }
1438
1439 static struct mbuf *
1440 rsu_rx_multi_frame(struct rsu_softc *sc, uint8_t *buf, int len, int *rssi)
1441 {
1442         struct r92s_rx_stat *stat;
1443         uint32_t rxdw0;
1444         int totlen, pktlen, infosz, npkts;
1445         struct mbuf *m, *m0 = NULL, *prevm = NULL;
1446
1447         /* Get the number of encapsulated frames. */
1448         stat = (struct r92s_rx_stat *)buf;
1449         npkts = MS(le32toh(stat->rxdw2), R92S_RXDW2_PKTCNT);
1450         DPRINTFN(6, "Rx %d frames in one chunk\n", npkts);
1451
1452         /* Process all of them. */
1453         while (npkts-- > 0) {
1454                 if (__predict_false(len < sizeof(*stat)))
1455                         break;
1456                 stat = (struct r92s_rx_stat *)buf;
1457                 rxdw0 = le32toh(stat->rxdw0);
1458
1459                 pktlen = MS(rxdw0, R92S_RXDW0_PKTLEN);
1460                 if (__predict_false(pktlen == 0))
1461                         break;
1462
1463                 infosz = MS(rxdw0, R92S_RXDW0_INFOSZ) * 8;
1464
1465                 /* Make sure everything fits in xfer. */
1466                 totlen = sizeof(*stat) + infosz + pktlen;
1467                 if (__predict_false(totlen > len))
1468                         break;
1469
1470                 /* Process 802.11 frame. */
1471                 m = rsu_rx_frame(sc, buf, pktlen, rssi);
1472                 if (m0 == NULL)
1473                         m0 = m;
1474                 if (prevm == NULL)
1475                         prevm = m;
1476                 else {
1477                         prevm->m_next = m;
1478                         prevm = m;
1479                 }
1480                 /* Next chunk is 128-byte aligned. */
1481                 totlen = (totlen + 127) & ~127;
1482                 buf += totlen;
1483                 len -= totlen;
1484         }
1485
1486         return (m0);
1487 }
1488
1489 static struct mbuf *
1490 rsu_rxeof(struct usb_xfer *xfer, struct rsu_data *data, int *rssi)
1491 {
1492         struct rsu_softc *sc = data->sc;
1493         struct r92s_rx_stat *stat;
1494         int len;
1495
1496         usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
1497
1498         if (__predict_false(len < sizeof(*stat))) {
1499                 DPRINTF("xfer too short %d\n", len);
1500                 sc->sc_ifp->if_ierrors++;
1501                 return (NULL);
1502         }
1503         /* Determine if it is a firmware C2H event or an 802.11 frame. */
1504         stat = (struct r92s_rx_stat *)data->buf;
1505         if ((le32toh(stat->rxdw1) & 0x1ff) == 0x1ff) {
1506                 rsu_rx_multi_event(sc, data->buf, len);
1507                 /* No packets to process. */
1508                 return (NULL);
1509         } else
1510                 return (rsu_rx_multi_frame(sc, data->buf, len, rssi));
1511 }
1512
1513 static void
1514 rsu_bulk_rx_callback(struct usb_xfer *xfer, usb_error_t error)
1515 {
1516         struct rsu_softc *sc = usbd_xfer_softc(xfer);
1517         struct ifnet *ifp = sc->sc_ifp;
1518         struct ieee80211com *ic = ifp->if_l2com;
1519         struct ieee80211_frame *wh;
1520         struct ieee80211_node *ni;
1521         struct mbuf *m = NULL, *next;
1522         struct rsu_data *data;
1523         int rssi = 1;
1524
1525         RSU_ASSERT_LOCKED(sc);
1526
1527         switch (USB_GET_STATE(xfer)) {
1528         case USB_ST_TRANSFERRED:
1529                 data = STAILQ_FIRST(&sc->sc_rx_active);
1530                 if (data == NULL)
1531                         goto tr_setup;
1532                 STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next);
1533                 m = rsu_rxeof(xfer, data, &rssi);
1534                 STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next);
1535                 /* FALLTHROUGH */
1536         case USB_ST_SETUP:
1537 tr_setup:
1538                 data = STAILQ_FIRST(&sc->sc_rx_inactive);
1539                 if (data == NULL) {
1540                         KASSERT(m == NULL, ("mbuf isn't NULL"));
1541                         return;
1542                 }
1543                 STAILQ_REMOVE_HEAD(&sc->sc_rx_inactive, next);
1544                 STAILQ_INSERT_TAIL(&sc->sc_rx_active, data, next);
1545                 usbd_xfer_set_frame_data(xfer, 0, data->buf,
1546                     usbd_xfer_max_len(xfer));
1547                 usbd_transfer_submit(xfer);
1548                 /*
1549                  * To avoid LOR we should unlock our private mutex here to call
1550                  * ieee80211_input() because here is at the end of a USB
1551                  * callback and safe to unlock.
1552                  */
1553                 RSU_UNLOCK(sc);
1554                 while (m != NULL) {
1555                         next = m->m_next;
1556                         m->m_next = NULL;
1557                         wh = mtod(m, struct ieee80211_frame *);
1558                         ni = ieee80211_find_rxnode(ic,
1559                             (struct ieee80211_frame_min *)wh);
1560                         if (ni != NULL) {
1561                                 (void)ieee80211_input(ni, m, rssi, 0);
1562                                 ieee80211_free_node(ni);
1563                         } else
1564                                 (void)ieee80211_input_all(ic, m, rssi, 0);
1565                         m = next;
1566                 }
1567                 RSU_LOCK(sc);
1568                 break;
1569         default:
1570                 /* needs it to the inactive queue due to a error. */
1571                 data = STAILQ_FIRST(&sc->sc_rx_active);
1572                 if (data != NULL) {
1573                         STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next);
1574                         STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next);
1575                 }
1576                 if (error != USB_ERR_CANCELLED) {
1577                         usbd_xfer_set_stall(xfer);
1578                         ifp->if_ierrors++;
1579                         goto tr_setup;
1580                 }
1581                 break;
1582         }
1583
1584 }
1585
1586
1587 static void
1588 rsu_txeof(struct usb_xfer *xfer, struct rsu_data *data)
1589 {
1590         struct rsu_softc *sc = usbd_xfer_softc(xfer);
1591         struct ifnet *ifp = sc->sc_ifp;
1592         struct mbuf *m;
1593
1594         RSU_ASSERT_LOCKED(sc);
1595
1596         /*
1597          * Do any tx complete callback.  Note this must be done before releasing
1598          * the node reference.
1599          */
1600         if (data->m) {
1601                 m = data->m;
1602                 if (m->m_flags & M_TXCB) {
1603                         /* XXX status? */
1604                         ieee80211_process_callback(data->ni, m, 0);
1605                 }
1606                 m_freem(m);
1607                 data->m = NULL;
1608         }
1609         if (data->ni) {
1610                 ieee80211_free_node(data->ni);
1611                 data->ni = NULL;
1612         }
1613         ifp->if_opackets++;
1614         ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
1615 }
1616
1617 static void
1618 rsu_bulk_tx_callback_sub(struct usb_xfer *xfer, usb_error_t error,
1619     uint8_t which)
1620 {
1621         struct rsu_softc *sc = usbd_xfer_softc(xfer);
1622         struct ifnet *ifp = sc->sc_ifp;
1623         struct rsu_data *data;
1624
1625         RSU_ASSERT_LOCKED(sc);
1626
1627         switch (USB_GET_STATE(xfer)) {
1628         case USB_ST_TRANSFERRED:
1629                 data = STAILQ_FIRST(&sc->sc_tx_active[which]);
1630                 if (data == NULL)
1631                         goto tr_setup;
1632                 DPRINTF("transfer done %p\n", data);
1633                 STAILQ_REMOVE_HEAD(&sc->sc_tx_active[which], next);
1634                 rsu_txeof(xfer, data);
1635                 STAILQ_INSERT_TAIL(&sc->sc_tx_inactive, data, next);
1636                 /* FALLTHROUGH */
1637         case USB_ST_SETUP:
1638 tr_setup:
1639                 data = STAILQ_FIRST(&sc->sc_tx_pending[which]);
1640                 if (data == NULL) {
1641                         DPRINTF("empty pending queue sc %p\n", sc);
1642                         return;
1643                 }
1644                 STAILQ_REMOVE_HEAD(&sc->sc_tx_pending[which], next);
1645                 STAILQ_INSERT_TAIL(&sc->sc_tx_active[which], data, next);
1646                 usbd_xfer_set_frame_data(xfer, 0, data->buf, data->buflen);
1647                 DPRINTF("submitting transfer %p\n", data);
1648                 usbd_transfer_submit(xfer);
1649                 break;
1650         default:
1651                 data = STAILQ_FIRST(&sc->sc_tx_active[which]);
1652                 if (data != NULL) {
1653                         STAILQ_REMOVE_HEAD(&sc->sc_tx_active[which], next);
1654                         rsu_txeof(xfer, data);
1655                         STAILQ_INSERT_TAIL(&sc->sc_tx_inactive, data, next);
1656                 }
1657                 ifp->if_oerrors++;
1658
1659                 if (error != USB_ERR_CANCELLED) {
1660                         usbd_xfer_set_stall(xfer);
1661                         goto tr_setup;
1662                 }
1663                 break;
1664         }
1665 }
1666
1667 static void
1668 rsu_bulk_tx_callback_be_bk(struct usb_xfer *xfer, usb_error_t error)
1669 {
1670         rsu_bulk_tx_callback_sub(xfer, error, RSU_BULK_TX_BE_BK);
1671 }
1672
1673 static void
1674 rsu_bulk_tx_callback_vi_vo(struct usb_xfer *xfer, usb_error_t error)
1675 {
1676         rsu_bulk_tx_callback_sub(xfer, error, RSU_BULK_TX_VI_VO);
1677 }
1678
1679 static int
1680 rsu_tx_start(struct rsu_softc *sc, struct ieee80211_node *ni, 
1681     struct mbuf *m0, struct rsu_data *data)
1682 {
1683         struct ifnet *ifp = sc->sc_ifp;
1684         struct ieee80211com *ic = ifp->if_l2com;
1685         struct ieee80211vap *vap = ni->ni_vap;
1686         struct ieee80211_frame *wh;
1687         struct ieee80211_key *k = NULL;
1688         struct r92s_tx_desc *txd;
1689         uint8_t type;
1690         uint8_t tid = 0;
1691         uint8_t which;
1692         int hasqos;
1693         int xferlen;
1694
1695         RSU_ASSERT_LOCKED(sc);
1696
1697         wh = mtod(m0, struct ieee80211_frame *);
1698         type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
1699
1700         if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
1701                 k = ieee80211_crypto_encap(ni, m0);
1702                 if (k == NULL) {
1703                         device_printf(sc->sc_dev,
1704                             "ieee80211_crypto_encap returns NULL.\n");
1705                         /* XXX we don't expect the fragmented frames */
1706                         m_freem(m0);
1707                         return (ENOBUFS);
1708                 }
1709                 wh = mtod(m0, struct ieee80211_frame *);
1710         }
1711         switch (type) {
1712         case IEEE80211_FC0_TYPE_CTL:
1713         case IEEE80211_FC0_TYPE_MGT:
1714                 which = rsu_wme_ac_xfer_map[WME_AC_VO];
1715                 break;
1716         default:
1717                 which = rsu_wme_ac_xfer_map[M_WME_GETAC(m0)];
1718                 break;
1719         }
1720         hasqos = 0;
1721
1722         /* Fill Tx descriptor. */
1723         txd = (struct r92s_tx_desc *)data->buf;
1724         memset(txd, 0, sizeof(*txd));
1725
1726         txd->txdw0 |= htole32(
1727             SM(R92S_TXDW0_PKTLEN, m0->m_pkthdr.len) |
1728             SM(R92S_TXDW0_OFFSET, sizeof(*txd)) |
1729             R92S_TXDW0_OWN | R92S_TXDW0_FSG | R92S_TXDW0_LSG);
1730
1731         txd->txdw1 |= htole32(
1732             SM(R92S_TXDW1_MACID, R92S_MACID_BSS) |
1733             SM(R92S_TXDW1_QSEL, R92S_TXDW1_QSEL_BE));
1734         if (!hasqos)
1735                 txd->txdw1 |= htole32(R92S_TXDW1_NONQOS);
1736 #ifdef notyet
1737         if (k != NULL) {
1738                 switch (k->wk_cipher->ic_cipher) {
1739                 case IEEE80211_CIPHER_WEP:
1740                         cipher = R92S_TXDW1_CIPHER_WEP;
1741                         break;
1742                 case IEEE80211_CIPHER_TKIP:
1743                         cipher = R92S_TXDW1_CIPHER_TKIP;
1744                         break;
1745                 case IEEE80211_CIPHER_AES_CCM:
1746                         cipher = R92S_TXDW1_CIPHER_AES;
1747                         break;
1748                 default:
1749                         cipher = R92S_TXDW1_CIPHER_NONE;
1750                 }
1751                 txd->txdw1 |= htole32(
1752                     SM(R92S_TXDW1_CIPHER, cipher) |
1753                     SM(R92S_TXDW1_KEYIDX, k->k_id));
1754         }
1755 #endif
1756         txd->txdw2 |= htole32(R92S_TXDW2_BK);
1757         if (IEEE80211_IS_MULTICAST(wh->i_addr1))
1758                 txd->txdw2 |= htole32(R92S_TXDW2_BMCAST);
1759         /*
1760          * Firmware will use and increment the sequence number for the
1761          * specified TID.
1762          */
1763         txd->txdw3 |= htole32(SM(R92S_TXDW3_SEQ, tid));
1764
1765         if (ieee80211_radiotap_active_vap(vap)) {
1766                 struct rsu_tx_radiotap_header *tap = &sc->sc_txtap;
1767
1768                 tap->wt_flags = 0;
1769                 tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq);
1770                 tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags);
1771                 ieee80211_radiotap_tx(vap, m0);
1772         }
1773         xferlen = sizeof(*txd) + m0->m_pkthdr.len;
1774         m_copydata(m0, 0, m0->m_pkthdr.len, (caddr_t)&txd[1]);
1775
1776         data->buflen = xferlen;
1777         data->ni = ni;
1778         data->m = m0;
1779         STAILQ_INSERT_TAIL(&sc->sc_tx_pending[which], data, next);
1780
1781         /* start transfer, if any */
1782         usbd_transfer_start(sc->sc_xfer[which]);
1783         return (0);
1784 }
1785
1786 static void
1787 rsu_start(struct ifnet *ifp)
1788 {
1789         struct rsu_softc *sc = ifp->if_softc;
1790
1791         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
1792                 return;
1793
1794         RSU_LOCK(sc);
1795         rsu_start_locked(ifp);
1796         RSU_UNLOCK(sc);
1797 }
1798
1799 static void
1800 rsu_start_locked(struct ifnet *ifp)
1801 {
1802         struct rsu_softc *sc = ifp->if_softc;
1803         struct ieee80211_node *ni;
1804         struct rsu_data *bf;
1805         struct mbuf *m;
1806
1807         RSU_ASSERT_LOCKED(sc);
1808
1809         for (;;) {
1810                 IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
1811                 if (m == NULL)
1812                         break;
1813                 ni = (struct ieee80211_node *)m->m_pkthdr.rcvif;
1814                 m->m_pkthdr.rcvif = NULL;
1815
1816                 bf = rsu_getbuf(sc);
1817                 if (bf == NULL) {
1818                         ifp->if_iqdrops++;
1819                         m_freem(m);
1820                         ieee80211_free_node(ni);
1821                 } else if (rsu_tx_start(sc, ni, m, bf) != 0) {
1822                         ifp->if_oerrors++;
1823                         STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next);
1824                         ieee80211_free_node(ni);
1825                 }
1826         }
1827 }
1828
1829 static int
1830 rsu_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
1831 {
1832         struct ieee80211com *ic = ifp->if_l2com;
1833         struct ifreq *ifr = (struct ifreq *) data;
1834         int error = 0, startall = 0;
1835
1836         switch (cmd) {
1837         case SIOCSIFFLAGS:
1838                 if (ifp->if_flags & IFF_UP) {
1839                         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
1840                                 rsu_init(ifp->if_softc);
1841                                 startall = 1;
1842                         }
1843                 } else {
1844                         if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1845                                 rsu_stop(ifp, 1);
1846                 }
1847                 if (startall)
1848                         ieee80211_start_all(ic);
1849                 break;
1850         case SIOCGIFMEDIA:
1851                 error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd);
1852                 break;
1853         case SIOCGIFADDR:
1854                 error = ether_ioctl(ifp, cmd, data);
1855                 break;
1856         default:
1857                 error = EINVAL;
1858                 break;
1859         }
1860
1861         return (error);
1862 }
1863
1864 /*
1865  * Power on sequence for A-cut adapters.
1866  */
1867 static void
1868 rsu_power_on_acut(struct rsu_softc *sc)
1869 {
1870         uint32_t reg;
1871
1872         rsu_write_1(sc, R92S_SPS0_CTRL + 1, 0x53);
1873         rsu_write_1(sc, R92S_SPS0_CTRL + 0, 0x57);
1874
1875         /* Enable AFE macro block's bandgap and Mbias. */
1876         rsu_write_1(sc, R92S_AFE_MISC,
1877             rsu_read_1(sc, R92S_AFE_MISC) |
1878             R92S_AFE_MISC_BGEN | R92S_AFE_MISC_MBEN);
1879         /* Enable LDOA15 block. */
1880         rsu_write_1(sc, R92S_LDOA15_CTRL,
1881             rsu_read_1(sc, R92S_LDOA15_CTRL) | R92S_LDA15_EN);
1882
1883         rsu_write_1(sc, R92S_SPS1_CTRL,
1884             rsu_read_1(sc, R92S_SPS1_CTRL) | R92S_SPS1_LDEN);
1885         usb_pause_mtx(&sc->sc_mtx, 2 * hz);
1886         /* Enable switch regulator block. */
1887         rsu_write_1(sc, R92S_SPS1_CTRL,
1888             rsu_read_1(sc, R92S_SPS1_CTRL) | R92S_SPS1_SWEN);
1889
1890         rsu_write_4(sc, R92S_SPS1_CTRL, 0x00a7b267);
1891
1892         rsu_write_1(sc, R92S_SYS_ISO_CTRL + 1,
1893             rsu_read_1(sc, R92S_SYS_ISO_CTRL + 1) | 0x08);
1894
1895         rsu_write_1(sc, R92S_SYS_FUNC_EN + 1,
1896             rsu_read_1(sc, R92S_SYS_FUNC_EN + 1) | 0x20);
1897
1898         rsu_write_1(sc, R92S_SYS_ISO_CTRL + 1,
1899             rsu_read_1(sc, R92S_SYS_ISO_CTRL + 1) & ~0x90);
1900
1901         /* Enable AFE clock. */
1902         rsu_write_1(sc, R92S_AFE_XTAL_CTRL + 1,
1903             rsu_read_1(sc, R92S_AFE_XTAL_CTRL + 1) & ~0x04);
1904         /* Enable AFE PLL macro block. */
1905         rsu_write_1(sc, R92S_AFE_PLL_CTRL,
1906             rsu_read_1(sc, R92S_AFE_PLL_CTRL) | 0x11);
1907         /* Attach AFE PLL to MACTOP/BB. */
1908         rsu_write_1(sc, R92S_SYS_ISO_CTRL,
1909             rsu_read_1(sc, R92S_SYS_ISO_CTRL) & ~0x11);
1910
1911         /* Switch to 40MHz clock instead of 80MHz. */
1912         rsu_write_2(sc, R92S_SYS_CLKR,
1913             rsu_read_2(sc, R92S_SYS_CLKR) & ~R92S_SYS_CLKSEL);
1914
1915         /* Enable MAC clock. */
1916         rsu_write_2(sc, R92S_SYS_CLKR,
1917             rsu_read_2(sc, R92S_SYS_CLKR) |
1918             R92S_MAC_CLK_EN | R92S_SYS_CLK_EN);
1919
1920         rsu_write_1(sc, R92S_PMC_FSM, 0x02);
1921
1922         /* Enable digital core and IOREG R/W. */
1923         rsu_write_1(sc, R92S_SYS_FUNC_EN + 1,
1924             rsu_read_1(sc, R92S_SYS_FUNC_EN + 1) | 0x08);
1925
1926         rsu_write_1(sc, R92S_SYS_FUNC_EN + 1,
1927             rsu_read_1(sc, R92S_SYS_FUNC_EN + 1) | 0x80);
1928
1929         /* Switch the control path to firmware. */
1930         reg = rsu_read_2(sc, R92S_SYS_CLKR);
1931         reg = (reg & ~R92S_SWHW_SEL) | R92S_FWHW_SEL;
1932         rsu_write_2(sc, R92S_SYS_CLKR, reg);
1933
1934         rsu_write_2(sc, R92S_CR, 0x37fc);
1935
1936         /* Fix USB RX FIFO issue. */
1937         rsu_write_1(sc, 0xfe5c,
1938             rsu_read_1(sc, 0xfe5c) | 0x80);
1939         rsu_write_1(sc, 0x00ab,
1940             rsu_read_1(sc, 0x00ab) | 0xc0);
1941
1942         rsu_write_1(sc, R92S_SYS_CLKR,
1943             rsu_read_1(sc, R92S_SYS_CLKR) & ~R92S_SYS_CPU_CLKSEL);
1944 }
1945
1946 /*
1947  * Power on sequence for B-cut and C-cut adapters.
1948  */
1949 static void
1950 rsu_power_on_bcut(struct rsu_softc *sc)
1951 {
1952         uint32_t reg;
1953         int ntries;
1954
1955         /* Prevent eFuse leakage. */
1956         rsu_write_1(sc, 0x37, 0xb0);
1957         usb_pause_mtx(&sc->sc_mtx, hz / 100);
1958         rsu_write_1(sc, 0x37, 0x30);
1959
1960         /* Switch the control path to hardware. */
1961         reg = rsu_read_2(sc, R92S_SYS_CLKR);
1962         if (reg & R92S_FWHW_SEL) {
1963                 rsu_write_2(sc, R92S_SYS_CLKR,
1964                     reg & ~(R92S_SWHW_SEL | R92S_FWHW_SEL));
1965         }
1966         rsu_write_1(sc, R92S_SYS_FUNC_EN + 1,
1967             rsu_read_1(sc, R92S_SYS_FUNC_EN + 1) & ~0x8c);
1968         rsu_ms_delay(sc);
1969
1970         rsu_write_1(sc, R92S_SPS0_CTRL + 1, 0x53);
1971         rsu_write_1(sc, R92S_SPS0_CTRL + 0, 0x57);
1972
1973         reg = rsu_read_1(sc, R92S_AFE_MISC);
1974         rsu_write_1(sc, R92S_AFE_MISC, reg | R92S_AFE_MISC_BGEN);
1975         rsu_write_1(sc, R92S_AFE_MISC, reg | R92S_AFE_MISC_BGEN |
1976             R92S_AFE_MISC_MBEN | R92S_AFE_MISC_I32_EN);
1977
1978         /* Enable PLL. */
1979         rsu_write_1(sc, R92S_LDOA15_CTRL,
1980             rsu_read_1(sc, R92S_LDOA15_CTRL) | R92S_LDA15_EN);
1981
1982         rsu_write_1(sc, R92S_LDOV12D_CTRL,
1983             rsu_read_1(sc, R92S_LDOV12D_CTRL) | R92S_LDV12_EN);
1984
1985         rsu_write_1(sc, R92S_SYS_ISO_CTRL + 1,
1986             rsu_read_1(sc, R92S_SYS_ISO_CTRL + 1) | 0x08);
1987
1988         rsu_write_1(sc, R92S_SYS_FUNC_EN + 1,
1989             rsu_read_1(sc, R92S_SYS_FUNC_EN + 1) | 0x20);
1990
1991         /* Support 64KB IMEM. */
1992         rsu_write_1(sc, R92S_SYS_ISO_CTRL + 1,
1993             rsu_read_1(sc, R92S_SYS_ISO_CTRL + 1) & ~0x97);
1994
1995         /* Enable AFE clock. */
1996         rsu_write_1(sc, R92S_AFE_XTAL_CTRL + 1,
1997             rsu_read_1(sc, R92S_AFE_XTAL_CTRL + 1) & ~0x04);
1998         /* Enable AFE PLL macro block. */
1999         reg = rsu_read_1(sc, R92S_AFE_PLL_CTRL);
2000         rsu_write_1(sc, R92S_AFE_PLL_CTRL, reg | 0x11);
2001         rsu_ms_delay(sc);
2002         rsu_write_1(sc, R92S_AFE_PLL_CTRL, reg | 0x51);
2003         rsu_ms_delay(sc);
2004         rsu_write_1(sc, R92S_AFE_PLL_CTRL, reg | 0x11);
2005         rsu_ms_delay(sc);
2006
2007         /* Attach AFE PLL to MACTOP/BB. */
2008         rsu_write_1(sc, R92S_SYS_ISO_CTRL,
2009             rsu_read_1(sc, R92S_SYS_ISO_CTRL) & ~0x11);
2010
2011         /* Switch to 40MHz clock. */
2012         rsu_write_1(sc, R92S_SYS_CLKR, 0x00);
2013         /* Disable CPU clock and 80MHz SSC. */
2014         rsu_write_1(sc, R92S_SYS_CLKR,
2015             rsu_read_1(sc, R92S_SYS_CLKR) | 0xa0);
2016         /* Enable MAC clock. */
2017         rsu_write_2(sc, R92S_SYS_CLKR,
2018             rsu_read_2(sc, R92S_SYS_CLKR) |
2019             R92S_MAC_CLK_EN | R92S_SYS_CLK_EN);
2020
2021         rsu_write_1(sc, R92S_PMC_FSM, 0x02);
2022
2023         /* Enable digital core and IOREG R/W. */
2024         rsu_write_1(sc, R92S_SYS_FUNC_EN + 1,
2025             rsu_read_1(sc, R92S_SYS_FUNC_EN + 1) | 0x08);
2026
2027         rsu_write_1(sc, R92S_SYS_FUNC_EN + 1,
2028             rsu_read_1(sc, R92S_SYS_FUNC_EN + 1) | 0x80);
2029
2030         /* Switch the control path to firmware. */
2031         reg = rsu_read_2(sc, R92S_SYS_CLKR);
2032         reg = (reg & ~R92S_SWHW_SEL) | R92S_FWHW_SEL;
2033         rsu_write_2(sc, R92S_SYS_CLKR, reg);
2034
2035         rsu_write_2(sc, R92S_CR, 0x37fc);
2036
2037         /* Fix USB RX FIFO issue. */
2038         rsu_write_1(sc, 0xfe5c,
2039             rsu_read_1(sc, 0xfe5c) | 0x80);
2040
2041         rsu_write_1(sc, R92S_SYS_CLKR,
2042             rsu_read_1(sc, R92S_SYS_CLKR) & ~R92S_SYS_CPU_CLKSEL);
2043
2044         rsu_write_1(sc, 0xfe1c, 0x80);
2045
2046         /* Make sure TxDMA is ready to download firmware. */
2047         for (ntries = 0; ntries < 20; ntries++) {
2048                 reg = rsu_read_1(sc, R92S_TCR);
2049                 if ((reg & (R92S_TCR_IMEM_CHK_RPT | R92S_TCR_EMEM_CHK_RPT)) ==
2050                     (R92S_TCR_IMEM_CHK_RPT | R92S_TCR_EMEM_CHK_RPT))
2051                         break;
2052                 rsu_ms_delay(sc);
2053         }
2054         if (ntries == 20) {
2055                 DPRINTF("TxDMA is not ready\n");
2056                 /* Reset TxDMA. */
2057                 reg = rsu_read_1(sc, R92S_CR);
2058                 rsu_write_1(sc, R92S_CR, reg & ~R92S_CR_TXDMA_EN);
2059                 rsu_ms_delay(sc);
2060                 rsu_write_1(sc, R92S_CR, reg | R92S_CR_TXDMA_EN);
2061         }
2062 }
2063
2064 static void
2065 rsu_power_off(struct rsu_softc *sc)
2066 {
2067         /* Turn RF off. */
2068         rsu_write_1(sc, R92S_RF_CTRL, 0x00);
2069         usb_pause_mtx(&sc->sc_mtx, hz / 200);
2070
2071         /* Turn MAC off. */
2072         /* Switch control path. */
2073         rsu_write_1(sc, R92S_SYS_CLKR + 1, 0x38);
2074         /* Reset MACTOP. */
2075         rsu_write_1(sc, R92S_SYS_FUNC_EN + 1, 0x70);
2076         rsu_write_1(sc, R92S_PMC_FSM, 0x06);
2077         rsu_write_1(sc, R92S_SYS_ISO_CTRL + 0, 0xf9);
2078         rsu_write_1(sc, R92S_SYS_ISO_CTRL + 1, 0xe8);
2079
2080         /* Disable AFE PLL. */
2081         rsu_write_1(sc, R92S_AFE_PLL_CTRL, 0x00);
2082         /* Disable A15V. */
2083         rsu_write_1(sc, R92S_LDOA15_CTRL, 0x54);
2084         /* Disable eFuse 1.2V. */
2085         rsu_write_1(sc, R92S_SYS_FUNC_EN + 1, 0x50);
2086         rsu_write_1(sc, R92S_LDOV12D_CTRL, 0x24);
2087         /* Enable AFE macro block's bandgap and Mbias. */
2088         rsu_write_1(sc, R92S_AFE_MISC, 0x30);
2089         /* Disable 1.6V LDO. */
2090         rsu_write_1(sc, R92S_SPS0_CTRL + 0, 0x56);
2091         rsu_write_1(sc, R92S_SPS0_CTRL + 1, 0x43);
2092 }
2093
2094 static int
2095 rsu_fw_loadsection(struct rsu_softc *sc, const uint8_t *buf, int len)
2096 {
2097         const uint8_t which = rsu_wme_ac_xfer_map[WME_AC_VO];
2098         struct rsu_data *data;
2099         struct r92s_tx_desc *txd;
2100         int mlen;
2101
2102         while (len > 0) {
2103                 data = rsu_getbuf(sc);
2104                 if (data == NULL)
2105                         return (ENOMEM);
2106                 txd = (struct r92s_tx_desc *)data->buf;
2107                 memset(txd, 0, sizeof(*txd));
2108                 if (len <= RSU_TXBUFSZ - sizeof(*txd)) {
2109                         /* Last chunk. */
2110                         txd->txdw0 |= htole32(R92S_TXDW0_LINIP);
2111                         mlen = len;
2112                 } else
2113                         mlen = RSU_TXBUFSZ - sizeof(*txd);
2114                 txd->txdw0 |= htole32(SM(R92S_TXDW0_PKTLEN, mlen));
2115                 memcpy(&txd[1], buf, mlen);
2116                 data->buflen = sizeof(*txd) + mlen;
2117                 DPRINTF("starting transfer %p\n", data);
2118                 STAILQ_INSERT_TAIL(&sc->sc_tx_pending[which], data, next);
2119                 buf += mlen;
2120                 len -= mlen;
2121         }
2122         usbd_transfer_start(sc->sc_xfer[which]);
2123         return (0);
2124 }
2125
2126 static int
2127 rsu_load_firmware(struct rsu_softc *sc)
2128 {
2129         const struct r92s_fw_hdr *hdr;
2130         struct r92s_fw_priv *dmem;
2131         const uint8_t *imem, *emem;
2132         int imemsz, ememsz;
2133         const struct firmware *fw;
2134         size_t size;
2135         uint32_t reg;
2136         int ntries, error;
2137
2138         if (rsu_read_1(sc, R92S_TCR) & R92S_TCR_FWRDY) {
2139                 DPRINTF("Firmware already loaded\n");
2140                 return (0);
2141         }
2142
2143         RSU_UNLOCK(sc);
2144         /* Read firmware image from the filesystem. */
2145         if ((fw = firmware_get("rsu-rtl8712fw")) == NULL) {
2146                 device_printf(sc->sc_dev, 
2147                     "%s: failed load firmware of file rsu-rtl8712fw\n",
2148                     __func__);
2149                 RSU_LOCK(sc);
2150                 return (ENXIO);
2151         }
2152         RSU_LOCK(sc);
2153         size = fw->datasize;
2154         if (size < sizeof(*hdr)) {
2155                 device_printf(sc->sc_dev, "firmware too short\n");
2156                 error = EINVAL;
2157                 goto fail;
2158         }
2159         hdr = (const struct r92s_fw_hdr *)fw->data;
2160         if (hdr->signature != htole16(0x8712) &&
2161             hdr->signature != htole16(0x8192)) {
2162                 device_printf(sc->sc_dev,
2163                     "invalid firmware signature 0x%x\n",
2164                     le16toh(hdr->signature));
2165                 error = EINVAL;
2166                 goto fail;
2167         }
2168         DPRINTF("FW V%d %02x-%02x %02x:%02x\n", le16toh(hdr->version),
2169             hdr->month, hdr->day, hdr->hour, hdr->minute);
2170
2171         /* Make sure that driver and firmware are in sync. */
2172         if (hdr->privsz != htole32(sizeof(*dmem))) {
2173                 device_printf(sc->sc_dev, "unsupported firmware image\n");
2174                 error = EINVAL;
2175                 goto fail;
2176         }
2177         /* Get FW sections sizes. */
2178         imemsz = le32toh(hdr->imemsz);
2179         ememsz = le32toh(hdr->sramsz);
2180         /* Check that all FW sections fit in image. */
2181         if (size < sizeof(*hdr) + imemsz + ememsz) {
2182                 device_printf(sc->sc_dev, "firmware too short\n");
2183                 error = EINVAL;
2184                 goto fail;
2185         }
2186         imem = (const uint8_t *)&hdr[1];
2187         emem = imem + imemsz;
2188
2189         /* Load IMEM section. */
2190         error = rsu_fw_loadsection(sc, imem, imemsz);
2191         if (error != 0) {
2192                 device_printf(sc->sc_dev,
2193                     "could not load firmware section %s\n", "IMEM");
2194                 goto fail;
2195         }
2196         /* Wait for load to complete. */
2197         for (ntries = 0; ntries != 50; ntries++) {
2198                 usb_pause_mtx(&sc->sc_mtx, hz / 100);
2199                 reg = rsu_read_1(sc, R92S_TCR);
2200                 if (reg & R92S_TCR_IMEM_CODE_DONE)
2201                         break;
2202         }
2203         if (ntries == 50) {
2204                 device_printf(sc->sc_dev, "timeout waiting for IMEM transfer\n");
2205                 error = ETIMEDOUT;
2206                 goto fail;
2207         }
2208         /* Load EMEM section. */
2209         error = rsu_fw_loadsection(sc, emem, ememsz);
2210         if (error != 0) {
2211                 device_printf(sc->sc_dev,
2212                     "could not load firmware section %s\n", "EMEM");
2213                 goto fail;
2214         }
2215         /* Wait for load to complete. */
2216         for (ntries = 0; ntries != 50; ntries++) {
2217                 usb_pause_mtx(&sc->sc_mtx, hz / 100);
2218                 reg = rsu_read_2(sc, R92S_TCR);
2219                 if (reg & R92S_TCR_EMEM_CODE_DONE)
2220                         break;
2221         }
2222         if (ntries == 50) {
2223                 device_printf(sc->sc_dev, "timeout waiting for EMEM transfer\n");
2224                 error = ETIMEDOUT;
2225                 goto fail;
2226         }
2227         /* Enable CPU. */
2228         rsu_write_1(sc, R92S_SYS_CLKR,
2229             rsu_read_1(sc, R92S_SYS_CLKR) | R92S_SYS_CPU_CLKSEL);
2230         if (!(rsu_read_1(sc, R92S_SYS_CLKR) & R92S_SYS_CPU_CLKSEL)) {
2231                 device_printf(sc->sc_dev, "could not enable system clock\n");
2232                 error = EIO;
2233                 goto fail;
2234         }
2235         rsu_write_2(sc, R92S_SYS_FUNC_EN,
2236             rsu_read_2(sc, R92S_SYS_FUNC_EN) | R92S_FEN_CPUEN);
2237         if (!(rsu_read_2(sc, R92S_SYS_FUNC_EN) & R92S_FEN_CPUEN)) {
2238                 device_printf(sc->sc_dev, 
2239                     "could not enable microcontroller\n");
2240                 error = EIO;
2241                 goto fail;
2242         }
2243         /* Wait for CPU to initialize. */
2244         for (ntries = 0; ntries < 100; ntries++) {
2245                 if (rsu_read_1(sc, R92S_TCR) & R92S_TCR_IMEM_RDY)
2246                         break;
2247                 rsu_ms_delay(sc);
2248         }
2249         if (ntries == 100) {
2250                 device_printf(sc->sc_dev,
2251                     "timeout waiting for microcontroller\n");
2252                 error = ETIMEDOUT;
2253                 goto fail;
2254         }
2255
2256         /* Update DMEM section before loading. */
2257         dmem = __DECONST(struct r92s_fw_priv *, &hdr->priv);
2258         memset(dmem, 0, sizeof(*dmem));
2259         dmem->hci_sel = R92S_HCI_SEL_USB | R92S_HCI_SEL_8172;
2260         dmem->nendpoints = 0;
2261         dmem->rf_config = 0x12; /* 1T2R */
2262         dmem->vcs_type = R92S_VCS_TYPE_AUTO;
2263         dmem->vcs_mode = R92S_VCS_MODE_RTS_CTS;
2264 #ifdef notyet
2265         dmem->bw40_en = (ic->ic_htcaps & IEEE80211_HTCAP_CBW20_40) != 0;
2266 #endif
2267         dmem->turbo_mode = 1;
2268         /* Load DMEM section. */
2269         error = rsu_fw_loadsection(sc, (uint8_t *)dmem, sizeof(*dmem));
2270         if (error != 0) {
2271                 device_printf(sc->sc_dev,
2272                     "could not load firmware section %s\n", "DMEM");
2273                 goto fail;
2274         }
2275         /* Wait for load to complete. */
2276         for (ntries = 0; ntries < 100; ntries++) {
2277                 if (rsu_read_1(sc, R92S_TCR) & R92S_TCR_DMEM_CODE_DONE)
2278                         break;
2279                 rsu_ms_delay(sc);
2280         }
2281         if (ntries == 100) {
2282                 device_printf(sc->sc_dev, "timeout waiting for %s transfer\n",
2283                     "DMEM");
2284                 error = ETIMEDOUT;
2285                 goto fail;
2286         }
2287         /* Wait for firmware readiness. */
2288         for (ntries = 0; ntries < 60; ntries++) {
2289                 if (!(rsu_read_1(sc, R92S_TCR) & R92S_TCR_FWRDY))
2290                         break;
2291                 rsu_ms_delay(sc);
2292         }
2293         if (ntries == 60) {
2294                 device_printf(sc->sc_dev, 
2295                     "timeout waiting for firmware readiness\n");
2296                 error = ETIMEDOUT;
2297                 goto fail;
2298         }
2299  fail:
2300         firmware_put(fw, FIRMWARE_UNLOAD);
2301         return (error);
2302 }
2303
2304
2305 static int      
2306 rsu_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, 
2307     const struct ieee80211_bpf_params *params)
2308 {
2309         struct ieee80211com *ic = ni->ni_ic;
2310         struct ifnet *ifp = ic->ic_ifp;
2311         struct rsu_softc *sc = ifp->if_softc;
2312         struct rsu_data *bf;
2313
2314         /* prevent management frames from being sent if we're not ready */
2315         if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
2316                 m_freem(m);
2317                 ieee80211_free_node(ni);
2318                 return (ENETDOWN);
2319         }
2320         RSU_LOCK(sc);
2321         bf = rsu_getbuf(sc);
2322         if (bf == NULL) {
2323                 ieee80211_free_node(ni);
2324                 m_freem(m);
2325                 RSU_UNLOCK(sc);
2326                 return (ENOBUFS);
2327         }
2328         ifp->if_opackets++;
2329         if (rsu_tx_start(sc, ni, m, bf) != 0) {
2330                 ieee80211_free_node(ni);
2331                 ifp->if_oerrors++;
2332                 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next);
2333                 RSU_UNLOCK(sc);
2334                 return (EIO);
2335         }
2336         RSU_UNLOCK(sc);
2337
2338         return (0);
2339 }
2340
2341 static void
2342 rsu_init(void *arg)
2343 {
2344         struct rsu_softc *sc = arg;
2345
2346         RSU_LOCK(sc);
2347         rsu_init_locked(arg);
2348         RSU_UNLOCK(sc);
2349 }
2350
2351 static void
2352 rsu_init_locked(struct rsu_softc *sc)
2353 {
2354         struct ifnet *ifp = sc->sc_ifp;
2355         struct r92s_set_pwr_mode cmd;
2356         int error;
2357         int i;
2358
2359         /* Init host async commands ring. */
2360         sc->cmdq.cur = sc->cmdq.next = sc->cmdq.queued = 0;
2361
2362         /* Power on adapter. */
2363         if (sc->cut == 1)
2364                 rsu_power_on_acut(sc);
2365         else
2366                 rsu_power_on_bcut(sc);
2367
2368         /* Load firmware. */
2369         error = rsu_load_firmware(sc);
2370         if (error != 0)
2371                 goto fail;
2372
2373         /* Enable Rx TCP checksum offload. */
2374         rsu_write_4(sc, R92S_RCR,
2375             rsu_read_4(sc, R92S_RCR) | 0x04000000);
2376         /* Append PHY status. */
2377         rsu_write_4(sc, R92S_RCR,
2378             rsu_read_4(sc, R92S_RCR) | 0x02000000);
2379
2380         rsu_write_4(sc, R92S_CR,
2381             rsu_read_4(sc, R92S_CR) & ~0xff000000);
2382
2383         /* Use 128 bytes pages. */
2384         rsu_write_1(sc, 0x00b5,
2385             rsu_read_1(sc, 0x00b5) | 0x01);
2386         /* Enable USB Rx aggregation. */
2387         rsu_write_1(sc, 0x00bd,
2388             rsu_read_1(sc, 0x00bd) | 0x80);
2389         /* Set USB Rx aggregation threshold. */
2390         rsu_write_1(sc, 0x00d9, 0x01);
2391         /* Set USB Rx aggregation timeout (1.7ms/4). */
2392         rsu_write_1(sc, 0xfe5b, 0x04);
2393         /* Fix USB Rx FIFO issue. */
2394         rsu_write_1(sc, 0xfe5c,
2395             rsu_read_1(sc, 0xfe5c) | 0x80);
2396
2397         /* Set MAC address. */
2398         rsu_write_region_1(sc, R92S_MACID, IF_LLADDR(ifp), 
2399             IEEE80211_ADDR_LEN);
2400
2401         /* It really takes 1.5 seconds for the firmware to boot: */
2402         usb_pause_mtx(&sc->sc_mtx, (3 * hz) / 2);
2403
2404         DPRINTF("setting MAC address to %s\n", ether_sprintf(IF_LLADDR(ifp)));
2405         error = rsu_fw_cmd(sc, R92S_CMD_SET_MAC_ADDRESS, IF_LLADDR(ifp),
2406             IEEE80211_ADDR_LEN);
2407         if (error != 0) {
2408                 device_printf(sc->sc_dev, "could not set MAC address\n");
2409                 goto fail;
2410         }
2411
2412         rsu_write_1(sc, R92S_USB_HRPWM,
2413             R92S_USB_HRPWM_PS_ST_ACTIVE | R92S_USB_HRPWM_PS_ALL_ON);
2414
2415         memset(&cmd, 0, sizeof(cmd));
2416         cmd.mode = R92S_PS_MODE_ACTIVE;
2417         DPRINTF("setting ps mode to %d\n", cmd.mode);
2418         error = rsu_fw_cmd(sc, R92S_CMD_SET_PWR_MODE, &cmd, sizeof(cmd));
2419         if (error != 0) {
2420                 device_printf(sc->sc_dev, "could not set PS mode\n");
2421                 goto fail;
2422         }
2423
2424 #if 0
2425         if (ic->ic_htcaps & IEEE80211_HTCAP_CBW20_40) {
2426                 /* Enable 40MHz mode. */
2427                 error = rsu_fw_iocmd(sc,
2428                     SM(R92S_IOCMD_CLASS, 0xf4) |
2429                     SM(R92S_IOCMD_INDEX, 0x00) |
2430                     SM(R92S_IOCMD_VALUE, 0x0007));
2431                 if (error != 0) {
2432                         device_printf(sc->sc_dev,
2433                             "could not enable 40MHz mode\n");
2434                         goto fail;
2435                 }
2436         }
2437
2438         /* Set default channel. */
2439         ic->ic_bss->ni_chan = ic->ic_ibss_chan;
2440 #endif
2441         sc->scan_pass = 0;
2442         usbd_transfer_start(sc->sc_xfer[RSU_BULK_RX]);
2443
2444         /* We're ready to go. */
2445         ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
2446         ifp->if_drv_flags |= IFF_DRV_RUNNING;
2447         return;
2448 fail:
2449         /* Need to stop all failed transfers, if any */
2450         for (i = 0; i != RSU_N_TRANSFER; i++)
2451                 usbd_transfer_stop(sc->sc_xfer[i]);
2452 }
2453
2454 static void
2455 rsu_stop(struct ifnet *ifp, int disable)
2456 {
2457         struct rsu_softc *sc = ifp->if_softc;
2458
2459         RSU_LOCK(sc);
2460         rsu_stop_locked(ifp, disable);
2461         RSU_UNLOCK(sc);
2462 }
2463
2464 static void
2465 rsu_stop_locked(struct ifnet *ifp, int disable __unused)
2466 {
2467         struct rsu_softc *sc = ifp->if_softc;
2468         int i;
2469
2470         ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
2471         sc->sc_calibrating = 0;
2472         taskqueue_cancel_timeout(taskqueue_thread, &sc->calib_task, NULL);
2473
2474         /* Power off adapter. */
2475         rsu_power_off(sc);
2476
2477         for (i = 0; i < RSU_N_TRANSFER; i++)
2478                 usbd_transfer_stop(sc->sc_xfer[i]);
2479 }
2480
2481 static void
2482 rsu_ms_delay(struct rsu_softc *sc)
2483 {
2484         usb_pause_mtx(&sc->sc_mtx, hz / 1000);
2485 }