1 /* $OpenBSD: if_urtwn.c,v 1.16 2011/02/10 17:26:40 jakemsr Exp $ */
4 * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr>
5 * Copyright (c) 2014 Kevin Lo <kevlo@FreeBSD.org>
6 * Copyright (c) 2015 Andriy Voskoboinyk <avos@FreeBSD.org>
8 * Permission to use, copy, modify, and distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21 #include <sys/cdefs.h>
22 __FBSDID("$FreeBSD$");
25 * Driver for Realtek RTL8188CE-VAU/RTL8188CUS/RTL8188EU/RTL8188RU/RTL8192CU.
28 #if defined(__DragonFly__)
31 #include "opt_urtwn.h"
34 #include <sys/param.h>
35 #include <sys/sockio.h>
36 #include <sys/sysctl.h>
38 #include <sys/mutex.h>
39 #include <sys/condvar.h>
41 #include <sys/kernel.h>
42 #include <sys/socket.h>
43 #include <sys/systm.h>
44 #include <sys/malloc.h>
45 #include <sys/module.h>
47 #include <sys/endian.h>
48 #include <sys/linker.h>
49 #include <sys/firmware.h>
50 #if defined(__DragonFly__)
54 #include <machine/bus.h>
55 #include <machine/resource.h>
62 #include <net/if_var.h>
63 #include <net/if_arp.h>
64 #include <net/ethernet.h>
65 #include <net/if_dl.h>
66 #include <net/if_media.h>
67 #include <net/if_types.h>
69 #include <netinet/in.h>
70 #include <netinet/in_systm.h>
71 #include <netinet/in_var.h>
72 #include <netinet/if_ether.h>
73 #include <netinet/ip.h>
75 #include <netproto/802_11/ieee80211_var.h>
76 #include <netproto/802_11/ieee80211_regdomain.h>
77 #include <netproto/802_11/ieee80211_radiotap.h>
78 #include <netproto/802_11/ieee80211_ratectl.h>
79 #ifdef IEEE80211_SUPPORT_SUPERG
80 #include <netproto/802_11/ieee80211_superg.h>
83 #include <bus/u4b/usb.h>
84 #include <bus/u4b/usbdi.h>
85 #include <bus/u4b/usb_device.h>
88 #include <bus/u4b/usb_debug.h>
90 #include <bus/u4b/wlan/if_urtwnreg.h>
91 #include <bus/u4b/wlan/if_urtwnvar.h>
95 URTWN_DEBUG_XMIT = 0x00000001, /* basic xmit operation */
96 URTWN_DEBUG_RECV = 0x00000002, /* basic recv operation */
97 URTWN_DEBUG_STATE = 0x00000004, /* 802.11 state transitions */
98 URTWN_DEBUG_RA = 0x00000008, /* f/w rate adaptation setup */
99 URTWN_DEBUG_USB = 0x00000010, /* usb requests */
100 URTWN_DEBUG_FIRMWARE = 0x00000020, /* firmware(9) loading debug */
101 URTWN_DEBUG_BEACON = 0x00000040, /* beacon handling */
102 URTWN_DEBUG_INTR = 0x00000080, /* ISR */
103 URTWN_DEBUG_TEMP = 0x00000100, /* temperature calibration */
104 URTWN_DEBUG_ROM = 0x00000200, /* various ROM info */
105 URTWN_DEBUG_KEY = 0x00000400, /* crypto keys management */
106 URTWN_DEBUG_TXPWR = 0x00000800, /* dump Tx power values */
107 URTWN_DEBUG_RSSI = 0x00001000, /* dump RSSI lookups */
108 URTWN_DEBUG_ANY = 0xffffffff
111 #define URTWN_DPRINTF(_sc, _m, ...) do { \
112 if ((_sc)->sc_debug & (_m)) \
113 device_printf((_sc)->sc_dev, __VA_ARGS__); \
117 #define URTWN_DPRINTF(_sc, _m, ...) do { (void) sc; } while (0)
120 #define IEEE80211_HAS_ADDR4(wh) IEEE80211_IS_DSTODS(wh)
122 static int urtwn_enable_11n = 1;
123 TUNABLE_INT("hw.usb.urtwn.enable_11n", &urtwn_enable_11n);
125 /* various supported device vendors/products */
126 static const STRUCT_USB_HOST_ID urtwn_devs[] = {
127 #define URTWN_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) }
128 #define URTWN_RTL8188E_DEV(v,p) \
129 { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, URTWN_RTL8188E) }
130 #define URTWN_RTL8188E 1
131 URTWN_DEV(ABOCOM, RTL8188CU_1),
132 URTWN_DEV(ABOCOM, RTL8188CU_2),
133 URTWN_DEV(ABOCOM, RTL8192CU),
134 URTWN_DEV(ASUS, RTL8192CU),
135 URTWN_DEV(ASUS, USBN10NANO),
136 URTWN_DEV(AZUREWAVE, RTL8188CE_1),
137 URTWN_DEV(AZUREWAVE, RTL8188CE_2),
138 URTWN_DEV(AZUREWAVE, RTL8188CU),
139 URTWN_DEV(BELKIN, F7D2102),
140 URTWN_DEV(BELKIN, RTL8188CU),
141 URTWN_DEV(BELKIN, RTL8192CU),
142 URTWN_DEV(CHICONY, RTL8188CUS_1),
143 URTWN_DEV(CHICONY, RTL8188CUS_2),
144 URTWN_DEV(CHICONY, RTL8188CUS_3),
145 URTWN_DEV(CHICONY, RTL8188CUS_4),
146 URTWN_DEV(CHICONY, RTL8188CUS_5),
147 URTWN_DEV(COREGA, RTL8192CU),
148 URTWN_DEV(DLINK, RTL8188CU),
149 URTWN_DEV(DLINK, RTL8192CU_1),
150 URTWN_DEV(DLINK, RTL8192CU_2),
151 URTWN_DEV(DLINK, RTL8192CU_3),
152 URTWN_DEV(DLINK, DWA131B),
153 URTWN_DEV(EDIMAX, EW7811UN),
154 URTWN_DEV(EDIMAX, RTL8192CU),
155 URTWN_DEV(FEIXUN, RTL8188CU),
156 URTWN_DEV(FEIXUN, RTL8192CU),
157 URTWN_DEV(GUILLEMOT, HWNUP150),
158 URTWN_DEV(HAWKING, RTL8192CU),
159 URTWN_DEV(HP3, RTL8188CU),
160 URTWN_DEV(NETGEAR, WNA1000M),
161 URTWN_DEV(NETGEAR, RTL8192CU),
162 URTWN_DEV(NETGEAR4, RTL8188CU),
163 URTWN_DEV(NOVATECH, RTL8188CU),
164 URTWN_DEV(PLANEX2, RTL8188CU_1),
165 URTWN_DEV(PLANEX2, RTL8188CU_2),
166 URTWN_DEV(PLANEX2, RTL8188CU_3),
167 URTWN_DEV(PLANEX2, RTL8188CU_4),
168 URTWN_DEV(PLANEX2, RTL8188CUS),
169 URTWN_DEV(PLANEX2, RTL8192CU),
170 URTWN_DEV(REALTEK, RTL8188CE_0),
171 URTWN_DEV(REALTEK, RTL8188CE_1),
172 URTWN_DEV(REALTEK, RTL8188CTV),
173 URTWN_DEV(REALTEK, RTL8188CU_0),
174 URTWN_DEV(REALTEK, RTL8188CU_1),
175 URTWN_DEV(REALTEK, RTL8188CU_2),
176 URTWN_DEV(REALTEK, RTL8188CU_3),
177 URTWN_DEV(REALTEK, RTL8188CU_COMBO),
178 URTWN_DEV(REALTEK, RTL8188CUS),
179 URTWN_DEV(REALTEK, RTL8188RU_1),
180 URTWN_DEV(REALTEK, RTL8188RU_2),
181 URTWN_DEV(REALTEK, RTL8188RU_3),
182 URTWN_DEV(REALTEK, RTL8191CU),
183 URTWN_DEV(REALTEK, RTL8192CE),
184 URTWN_DEV(REALTEK, RTL8192CU),
185 URTWN_DEV(SITECOMEU, RTL8188CU_1),
186 URTWN_DEV(SITECOMEU, RTL8188CU_2),
187 URTWN_DEV(SITECOMEU, RTL8192CU),
188 URTWN_DEV(TRENDNET, RTL8188CU),
189 URTWN_DEV(TRENDNET, RTL8192CU),
190 URTWN_DEV(ZYXEL, RTL8192CU),
192 URTWN_RTL8188E_DEV(ABOCOM, RTL8188EU),
193 URTWN_RTL8188E_DEV(DLINK, DWA123D1),
194 URTWN_RTL8188E_DEV(DLINK, DWA125D1),
195 URTWN_RTL8188E_DEV(ELECOM, WDC150SU2M),
196 URTWN_RTL8188E_DEV(REALTEK, RTL8188ETV),
197 URTWN_RTL8188E_DEV(REALTEK, RTL8188EU),
198 #undef URTWN_RTL8188E_DEV
202 static device_probe_t urtwn_match;
203 static device_attach_t urtwn_attach;
204 static device_detach_t urtwn_detach;
206 static usb_callback_t urtwn_bulk_tx_callback;
207 static usb_callback_t urtwn_bulk_rx_callback;
209 static void urtwn_sysctlattach(struct urtwn_softc *);
210 static void urtwn_drain_mbufq(struct urtwn_softc *);
211 static usb_error_t urtwn_do_request(struct urtwn_softc *,
212 struct usb_device_request *, void *);
213 static struct ieee80211vap *urtwn_vap_create(struct ieee80211com *,
214 const char [IFNAMSIZ], int, enum ieee80211_opmode, int,
215 const uint8_t [IEEE80211_ADDR_LEN],
216 const uint8_t [IEEE80211_ADDR_LEN]);
217 static void urtwn_vap_delete(struct ieee80211vap *);
218 static struct mbuf * urtwn_rx_copy_to_mbuf(struct urtwn_softc *,
219 struct r92c_rx_stat *, int);
220 static struct mbuf * urtwn_report_intr(struct usb_xfer *,
221 struct urtwn_data *);
222 static struct mbuf * urtwn_rxeof(struct urtwn_softc *, uint8_t *, int);
223 static void urtwn_r88e_ratectl_tx_complete(struct urtwn_softc *,
225 static struct ieee80211_node *urtwn_rx_frame(struct urtwn_softc *,
226 struct mbuf *, int8_t *);
227 static void urtwn_txeof(struct urtwn_softc *, struct urtwn_data *,
229 static int urtwn_alloc_list(struct urtwn_softc *,
230 struct urtwn_data[], int, int);
231 static int urtwn_alloc_rx_list(struct urtwn_softc *);
232 static int urtwn_alloc_tx_list(struct urtwn_softc *);
233 static void urtwn_free_list(struct urtwn_softc *,
234 struct urtwn_data data[], int);
235 static void urtwn_free_rx_list(struct urtwn_softc *);
236 static void urtwn_free_tx_list(struct urtwn_softc *);
237 static struct urtwn_data * _urtwn_getbuf(struct urtwn_softc *);
238 static struct urtwn_data * urtwn_getbuf(struct urtwn_softc *);
239 static usb_error_t urtwn_write_region_1(struct urtwn_softc *, uint16_t,
241 static usb_error_t urtwn_write_1(struct urtwn_softc *, uint16_t, uint8_t);
242 static usb_error_t urtwn_write_2(struct urtwn_softc *, uint16_t, uint16_t);
243 static usb_error_t urtwn_write_4(struct urtwn_softc *, uint16_t, uint32_t);
244 static usb_error_t urtwn_read_region_1(struct urtwn_softc *, uint16_t,
246 static uint8_t urtwn_read_1(struct urtwn_softc *, uint16_t);
247 static uint16_t urtwn_read_2(struct urtwn_softc *, uint16_t);
248 static uint32_t urtwn_read_4(struct urtwn_softc *, uint16_t);
249 static int urtwn_fw_cmd(struct urtwn_softc *, uint8_t,
251 static void urtwn_cmdq_cb(void *, int);
252 static int urtwn_cmd_sleepable(struct urtwn_softc *, const void *,
253 size_t, CMD_FUNC_PROTO);
254 static void urtwn_r92c_rf_write(struct urtwn_softc *, int,
256 static void urtwn_r88e_rf_write(struct urtwn_softc *, int,
258 static uint32_t urtwn_rf_read(struct urtwn_softc *, int, uint8_t);
259 static int urtwn_llt_write(struct urtwn_softc *, uint32_t,
261 static int urtwn_efuse_read_next(struct urtwn_softc *, uint8_t *);
262 static int urtwn_efuse_read_data(struct urtwn_softc *, uint8_t *,
265 static void urtwn_dump_rom_contents(struct urtwn_softc *,
266 uint8_t *, uint16_t);
268 static int urtwn_efuse_read(struct urtwn_softc *, uint8_t *,
270 static int urtwn_efuse_switch_power(struct urtwn_softc *);
271 static int urtwn_read_chipid(struct urtwn_softc *);
272 static int urtwn_read_rom(struct urtwn_softc *);
273 static int urtwn_r88e_read_rom(struct urtwn_softc *);
274 static int urtwn_ra_init(struct urtwn_softc *);
275 static void urtwn_init_beacon(struct urtwn_softc *,
277 static int urtwn_setup_beacon(struct urtwn_softc *,
278 struct ieee80211_node *);
279 static void urtwn_update_beacon(struct ieee80211vap *, int);
280 static int urtwn_tx_beacon(struct urtwn_softc *sc,
282 static int urtwn_key_alloc(struct ieee80211vap *,
283 struct ieee80211_key *, ieee80211_keyix *,
285 static void urtwn_key_set_cb(struct urtwn_softc *,
287 static void urtwn_key_del_cb(struct urtwn_softc *,
289 static int urtwn_key_set(struct ieee80211vap *,
290 const struct ieee80211_key *);
291 static int urtwn_key_delete(struct ieee80211vap *,
292 const struct ieee80211_key *);
293 static void urtwn_tsf_task_adhoc(void *, int);
294 static void urtwn_tsf_sync_enable(struct urtwn_softc *,
295 struct ieee80211vap *);
296 static void urtwn_get_tsf(struct urtwn_softc *, uint64_t *);
297 static void urtwn_set_led(struct urtwn_softc *, int, int);
298 static void urtwn_set_mode(struct urtwn_softc *, uint8_t);
299 static void urtwn_ibss_recv_mgmt(struct ieee80211_node *,
301 const struct ieee80211_rx_stats *, int, int);
302 static int urtwn_newstate(struct ieee80211vap *,
303 enum ieee80211_state, int);
304 static void urtwn_calib_to(void *);
305 static void urtwn_calib_cb(struct urtwn_softc *,
307 static void urtwn_watchdog(void *);
308 static void urtwn_update_avgrssi(struct urtwn_softc *, int, int8_t);
309 static int8_t urtwn_get_rssi(struct urtwn_softc *, int, void *);
310 static int8_t urtwn_r88e_get_rssi(struct urtwn_softc *, int, void *);
311 static int urtwn_tx_data(struct urtwn_softc *,
312 struct ieee80211_node *, struct mbuf *,
313 struct urtwn_data *);
314 static int urtwn_tx_raw(struct urtwn_softc *,
315 struct ieee80211_node *, struct mbuf *,
317 const struct ieee80211_bpf_params *);
318 static void urtwn_tx_start(struct urtwn_softc *, struct mbuf *,
319 uint8_t, struct urtwn_data *);
320 static int urtwn_transmit(struct ieee80211com *, struct mbuf *);
321 static void urtwn_start(struct urtwn_softc *);
322 static void urtwn_parent(struct ieee80211com *);
323 static int urtwn_r92c_power_on(struct urtwn_softc *);
324 static int urtwn_r88e_power_on(struct urtwn_softc *);
325 static void urtwn_r92c_power_off(struct urtwn_softc *);
326 static void urtwn_r88e_power_off(struct urtwn_softc *);
327 static int urtwn_llt_init(struct urtwn_softc *);
328 #ifndef URTWN_WITHOUT_UCODE
329 static void urtwn_fw_reset(struct urtwn_softc *);
330 static void urtwn_r88e_fw_reset(struct urtwn_softc *);
331 static int urtwn_fw_loadpage(struct urtwn_softc *, int,
332 const uint8_t *, int);
333 static int urtwn_load_firmware(struct urtwn_softc *);
335 static int urtwn_dma_init(struct urtwn_softc *);
336 static int urtwn_mac_init(struct urtwn_softc *);
337 static void urtwn_bb_init(struct urtwn_softc *);
338 static void urtwn_rf_init(struct urtwn_softc *);
339 static void urtwn_cam_init(struct urtwn_softc *);
340 static int urtwn_cam_write(struct urtwn_softc *, uint32_t,
342 static void urtwn_pa_bias_init(struct urtwn_softc *);
343 static void urtwn_rxfilter_init(struct urtwn_softc *);
344 static void urtwn_edca_init(struct urtwn_softc *);
345 static void urtwn_write_txpower(struct urtwn_softc *, int,
347 static void urtwn_get_txpower(struct urtwn_softc *, int,
348 struct ieee80211_channel *,
349 struct ieee80211_channel *, uint16_t[]);
350 static void urtwn_r88e_get_txpower(struct urtwn_softc *, int,
351 struct ieee80211_channel *,
352 struct ieee80211_channel *, uint16_t[]);
353 static void urtwn_set_txpower(struct urtwn_softc *,
354 struct ieee80211_channel *,
355 struct ieee80211_channel *);
356 static void urtwn_set_rx_bssid_all(struct urtwn_softc *, int);
357 static void urtwn_set_gain(struct urtwn_softc *, uint8_t);
358 static void urtwn_scan_start(struct ieee80211com *);
359 static void urtwn_scan_end(struct ieee80211com *);
360 static void urtwn_set_channel(struct ieee80211com *);
361 static int urtwn_wme_update(struct ieee80211com *);
362 static void urtwn_update_slot(struct ieee80211com *);
363 static void urtwn_update_slot_cb(struct urtwn_softc *,
365 static void urtwn_update_aifs(struct urtwn_softc *, uint8_t);
366 static uint8_t urtwn_get_multi_pos(const uint8_t[]);
367 static void urtwn_set_multi(struct urtwn_softc *);
368 static void urtwn_set_promisc(struct urtwn_softc *);
369 static void urtwn_update_promisc(struct ieee80211com *);
370 static void urtwn_update_mcast(struct ieee80211com *);
371 static struct ieee80211_node *urtwn_node_alloc(struct ieee80211vap *,
372 const uint8_t mac[IEEE80211_ADDR_LEN]);
373 static void urtwn_newassoc(struct ieee80211_node *, int);
374 static void urtwn_node_free(struct ieee80211_node *);
375 static void urtwn_set_chan(struct urtwn_softc *,
376 struct ieee80211_channel *,
377 struct ieee80211_channel *);
378 static void urtwn_iq_calib(struct urtwn_softc *);
379 static void urtwn_lc_calib(struct urtwn_softc *);
380 static void urtwn_temp_calib(struct urtwn_softc *);
381 static int urtwn_init(struct urtwn_softc *);
382 static void urtwn_stop(struct urtwn_softc *);
383 static void urtwn_abort_xfers(struct urtwn_softc *);
384 static int urtwn_raw_xmit(struct ieee80211_node *, struct mbuf *,
385 const struct ieee80211_bpf_params *);
386 static void urtwn_ms_delay(struct urtwn_softc *);
389 #define urtwn_bb_write urtwn_write_4
390 #define urtwn_bb_read urtwn_read_4
392 static const struct usb_config urtwn_config[URTWN_N_TRANSFER] = {
395 .endpoint = UE_ADDR_ANY,
396 .direction = UE_DIR_IN,
397 .bufsize = URTWN_RXBUFSZ,
402 .callback = urtwn_bulk_rx_callback,
404 [URTWN_BULK_TX_BE] = {
407 .direction = UE_DIR_OUT,
408 .bufsize = URTWN_TXBUFSZ,
412 .force_short_xfer = 1
414 .callback = urtwn_bulk_tx_callback,
415 .timeout = URTWN_TX_TIMEOUT, /* ms */
417 [URTWN_BULK_TX_BK] = {
420 .direction = UE_DIR_OUT,
421 .bufsize = URTWN_TXBUFSZ,
425 .force_short_xfer = 1,
427 .callback = urtwn_bulk_tx_callback,
428 .timeout = URTWN_TX_TIMEOUT, /* ms */
430 [URTWN_BULK_TX_VI] = {
433 .direction = UE_DIR_OUT,
434 .bufsize = URTWN_TXBUFSZ,
438 .force_short_xfer = 1
440 .callback = urtwn_bulk_tx_callback,
441 .timeout = URTWN_TX_TIMEOUT, /* ms */
443 [URTWN_BULK_TX_VO] = {
446 .direction = UE_DIR_OUT,
447 .bufsize = URTWN_TXBUFSZ,
451 .force_short_xfer = 1
453 .callback = urtwn_bulk_tx_callback,
454 .timeout = URTWN_TX_TIMEOUT, /* ms */
458 static const struct wme_to_queue {
461 } wme2queue[WME_NUM_AC] = {
462 { R92C_EDCA_BE_PARAM, URTWN_BULK_TX_BE},
463 { R92C_EDCA_BK_PARAM, URTWN_BULK_TX_BK},
464 { R92C_EDCA_VI_PARAM, URTWN_BULK_TX_VI},
465 { R92C_EDCA_VO_PARAM, URTWN_BULK_TX_VO}
469 urtwn_match(device_t self)
471 struct usb_attach_arg *uaa = device_get_ivars(self);
473 if (uaa->usb_mode != USB_MODE_HOST)
475 if (uaa->info.bConfigIndex != URTWN_CONFIG_INDEX)
477 if (uaa->info.bIfaceIndex != URTWN_IFACE_INDEX)
480 return (usbd_lookup_id_by_uaa(urtwn_devs, sizeof(urtwn_devs), uaa));
484 urtwn_update_chw(struct ieee80211com *ic)
489 urtwn_ampdu_enable(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap)
492 /* We're driving this ourselves (eventually); don't involve net80211 */
497 urtwn_attach(device_t self)
499 struct usb_attach_arg *uaa = device_get_ivars(self);
500 struct urtwn_softc *sc = device_get_softc(self);
501 struct ieee80211com *ic = &sc->sc_ic;
502 uint8_t bands[IEEE80211_MODE_BYTES];
505 device_set_usb_desc(self);
506 sc->sc_udev = uaa->device;
508 if (USB_GET_DRIVER_INFO(uaa) == URTWN_RTL8188E)
509 sc->chip |= URTWN_CHIP_88E;
513 if (resource_int_value(device_get_name(sc->sc_dev),
514 device_get_unit(sc->sc_dev), "debug", &debug) == 0)
515 sc->sc_debug = debug;
518 #if defined(__DragonFly__)
519 lockinit(&sc->sc_mtx, device_get_nameunit(self), 0, 0);
521 mtx_init(&sc->sc_mtx, device_get_nameunit(self),
522 MTX_NETWORK_LOCK, MTX_DEF);
524 URTWN_CMDQ_LOCK_INIT(sc);
525 URTWN_NT_LOCK_INIT(sc);
526 #if defined(__DragonFly__)
527 callout_init(&sc->sc_calib_to);
528 callout_init(&sc->sc_watchdog_ch);
530 callout_init(&sc->sc_calib_to, 0);
531 callout_init(&sc->sc_watchdog_ch, 0);
533 mbufq_init(&sc->sc_snd, ifqmaxlen);
535 sc->sc_iface_index = URTWN_IFACE_INDEX;
536 error = usbd_transfer_setup(uaa->device, &sc->sc_iface_index,
537 sc->sc_xfer, urtwn_config, URTWN_N_TRANSFER, sc, &sc->sc_mtx);
539 device_printf(self, "could not allocate USB transfers, "
540 "err=%s\n", usbd_errstr(error));
546 error = urtwn_read_chipid(sc);
548 device_printf(sc->sc_dev, "unsupported test chip\n");
553 /* Determine number of Tx/Rx chains. */
554 if (sc->chip & URTWN_CHIP_92C) {
555 sc->ntxchains = (sc->chip & URTWN_CHIP_92C_1T2R) ? 1 : 2;
562 if (sc->chip & URTWN_CHIP_88E)
563 error = urtwn_r88e_read_rom(sc);
565 error = urtwn_read_rom(sc);
567 device_printf(sc->sc_dev, "%s: cannot read rom, error %d\n",
573 device_printf(sc->sc_dev, "MAC/BB RTL%s, RF 6052 %dT%dR\n",
574 (sc->chip & URTWN_CHIP_92C) ? "8192CU" :
575 (sc->chip & URTWN_CHIP_88E) ? "8188EU" :
576 (sc->board_type == R92C_BOARD_TYPE_HIGHPA) ? "8188RU" :
577 (sc->board_type == R92C_BOARD_TYPE_MINICARD) ? "8188CE-VAU" :
578 "8188CUS", sc->ntxchains, sc->nrxchains);
583 ic->ic_name = device_get_nameunit(self);
584 ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */
585 ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */
587 /* set device capabilities */
589 IEEE80211_C_STA /* station mode */
590 | IEEE80211_C_MONITOR /* monitor mode */
591 | IEEE80211_C_IBSS /* adhoc mode */
592 | IEEE80211_C_HOSTAP /* hostap mode */
593 | IEEE80211_C_SHPREAMBLE /* short preamble supported */
594 | IEEE80211_C_SHSLOT /* short slot time supported */
596 | IEEE80211_C_BGSCAN /* capable of bg scanning */
598 | IEEE80211_C_WPA /* 802.11i */
599 | IEEE80211_C_WME /* 802.11e */
600 | IEEE80211_C_SWAMSDUTX /* Do software A-MSDU TX */
601 | IEEE80211_C_FF /* Atheros fast-frames */
605 IEEE80211_CRYPTO_WEP |
606 IEEE80211_CRYPTO_TKIP |
607 IEEE80211_CRYPTO_AES_CCM;
609 /* Assume they're all 11n capable for now */
610 if (urtwn_enable_11n) {
611 device_printf(self, "enabling 11n\n");
612 ic->ic_htcaps = IEEE80211_HTC_HT |
614 IEEE80211_HTC_AMPDU |
616 IEEE80211_HTC_AMSDU |
617 IEEE80211_HTCAP_MAXAMSDU_3839 |
618 IEEE80211_HTCAP_SMPS_OFF;
619 /* no HT40 just yet */
620 // ic->ic_htcaps |= IEEE80211_HTCAP_CHWIDTH40;
622 /* XXX TODO: verify chains versus streams for urtwn */
623 ic->ic_txstream = sc->ntxchains;
624 ic->ic_rxstream = sc->nrxchains;
627 memset(bands, 0, sizeof(bands));
628 setbit(bands, IEEE80211_MODE_11B);
629 setbit(bands, IEEE80211_MODE_11G);
630 if (urtwn_enable_11n)
631 setbit(bands, IEEE80211_MODE_11NG);
632 ieee80211_init_channels(ic, NULL, bands);
634 ieee80211_ifattach(ic);
635 ic->ic_raw_xmit = urtwn_raw_xmit;
636 ic->ic_scan_start = urtwn_scan_start;
637 ic->ic_scan_end = urtwn_scan_end;
638 ic->ic_set_channel = urtwn_set_channel;
639 ic->ic_transmit = urtwn_transmit;
640 ic->ic_parent = urtwn_parent;
641 ic->ic_vap_create = urtwn_vap_create;
642 ic->ic_vap_delete = urtwn_vap_delete;
643 ic->ic_wme.wme_update = urtwn_wme_update;
644 ic->ic_updateslot = urtwn_update_slot;
645 ic->ic_update_promisc = urtwn_update_promisc;
646 ic->ic_update_mcast = urtwn_update_mcast;
647 if (sc->chip & URTWN_CHIP_88E) {
648 ic->ic_node_alloc = urtwn_node_alloc;
649 ic->ic_newassoc = urtwn_newassoc;
650 sc->sc_node_free = ic->ic_node_free;
651 ic->ic_node_free = urtwn_node_free;
653 ic->ic_update_chw = urtwn_update_chw;
654 ic->ic_ampdu_enable = urtwn_ampdu_enable;
656 ieee80211_radiotap_attach(ic, &sc->sc_txtap.wt_ihdr,
657 sizeof(sc->sc_txtap), URTWN_TX_RADIOTAP_PRESENT,
658 &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap),
659 URTWN_RX_RADIOTAP_PRESENT);
661 TASK_INIT(&sc->cmdq_task, 0, urtwn_cmdq_cb, sc);
663 urtwn_sysctlattach(sc);
666 ieee80211_announce(ic);
672 return (ENXIO); /* failure */
676 urtwn_sysctlattach(struct urtwn_softc *sc)
679 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->sc_dev);
680 struct sysctl_oid *tree = device_get_sysctl_tree(sc->sc_dev);
682 SYSCTL_ADD_U32(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
683 "debug", CTLFLAG_RW, &sc->sc_debug, sc->sc_debug,
684 "control debugging printfs");
689 urtwn_detach(device_t self)
691 struct urtwn_softc *sc = device_get_softc(self);
692 struct ieee80211com *ic = &sc->sc_ic;
695 /* Prevent further ioctls. */
697 sc->sc_flags |= URTWN_DETACHED;
702 callout_drain(&sc->sc_watchdog_ch);
703 callout_drain(&sc->sc_calib_to);
705 /* stop all USB transfers */
706 usbd_transfer_unsetup(sc->sc_xfer, URTWN_N_TRANSFER);
708 /* Prevent further allocations from RX/TX data lists. */
710 STAILQ_INIT(&sc->sc_tx_active);
711 STAILQ_INIT(&sc->sc_tx_inactive);
712 STAILQ_INIT(&sc->sc_tx_pending);
714 STAILQ_INIT(&sc->sc_rx_active);
715 STAILQ_INIT(&sc->sc_rx_inactive);
718 /* drain USB transfers */
719 for (x = 0; x != URTWN_N_TRANSFER; x++)
720 usbd_transfer_drain(sc->sc_xfer[x]);
722 /* Free data buffers. */
724 urtwn_free_tx_list(sc);
725 urtwn_free_rx_list(sc);
728 if (ic->ic_softc == sc) {
729 ieee80211_draintask(ic, &sc->cmdq_task);
730 ieee80211_ifdetach(ic);
733 URTWN_NT_LOCK_DESTROY(sc);
734 URTWN_CMDQ_LOCK_DESTROY(sc);
735 lockuninit(&sc->sc_mtx);
741 urtwn_drain_mbufq(struct urtwn_softc *sc)
744 struct ieee80211_node *ni;
745 URTWN_ASSERT_LOCKED(sc);
746 while ((m = mbufq_dequeue(&sc->sc_snd)) != NULL) {
747 ni = (struct ieee80211_node *)m->m_pkthdr.rcvif;
748 m->m_pkthdr.rcvif = NULL;
749 ieee80211_free_node(ni);
755 urtwn_do_request(struct urtwn_softc *sc, struct usb_device_request *req,
761 URTWN_ASSERT_LOCKED(sc);
764 err = usbd_do_request_flags(sc->sc_udev, &sc->sc_mtx,
765 req, data, 0, NULL, 250 /* ms */);
769 URTWN_DPRINTF(sc, URTWN_DEBUG_USB,
770 "%s: control request failed, %s (retries left: %d)\n",
771 __func__, usbd_errstr(err), ntries);
772 usb_pause_mtx(&sc->sc_mtx, hz / 100);
777 static struct ieee80211vap *
778 urtwn_vap_create(struct ieee80211com *ic, const char name[IFNAMSIZ], int unit,
779 enum ieee80211_opmode opmode, int flags,
780 const uint8_t bssid[IEEE80211_ADDR_LEN],
781 const uint8_t mac[IEEE80211_ADDR_LEN])
783 struct urtwn_softc *sc = ic->ic_softc;
784 struct urtwn_vap *uvp;
785 struct ieee80211vap *vap;
787 if (!TAILQ_EMPTY(&ic->ic_vaps)) /* only one at a time */
790 uvp = kmalloc(sizeof(struct urtwn_vap), M_80211_VAP, M_WAITOK | M_ZERO);
792 /* enable s/w bmiss handling for sta mode */
794 if (ieee80211_vap_setup(ic, vap, name, unit, opmode,
795 flags | IEEE80211_CLONE_NOBEACONS, bssid) != 0) {
797 kfree(uvp, M_80211_VAP);
801 if (opmode == IEEE80211_M_HOSTAP || opmode == IEEE80211_M_IBSS)
802 urtwn_init_beacon(sc, uvp);
804 /* override state transition machine */
805 uvp->newstate = vap->iv_newstate;
806 vap->iv_newstate = urtwn_newstate;
807 vap->iv_update_beacon = urtwn_update_beacon;
808 vap->iv_key_alloc = urtwn_key_alloc;
809 vap->iv_key_set = urtwn_key_set;
810 vap->iv_key_delete = urtwn_key_delete;
812 /* 802.11n parameters */
813 vap->iv_ampdu_density = IEEE80211_HTCAP_MPDUDENSITY_16;
814 vap->iv_ampdu_rxmax = IEEE80211_HTCAP_MAXRXAMPDU_64K;
816 if (opmode == IEEE80211_M_IBSS) {
817 uvp->recv_mgmt = vap->iv_recv_mgmt;
818 vap->iv_recv_mgmt = urtwn_ibss_recv_mgmt;
819 TASK_INIT(&uvp->tsf_task_adhoc, 0, urtwn_tsf_task_adhoc, vap);
822 if (URTWN_CHIP_HAS_RATECTL(sc))
823 ieee80211_ratectl_init(vap);
825 ieee80211_vap_attach(vap, ieee80211_media_change,
826 ieee80211_media_status, mac);
827 ic->ic_opmode = opmode;
832 urtwn_vap_delete(struct ieee80211vap *vap)
834 struct ieee80211com *ic = vap->iv_ic;
835 struct urtwn_softc *sc = ic->ic_softc;
836 struct urtwn_vap *uvp = URTWN_VAP(vap);
838 if (uvp->bcn_mbuf != NULL)
839 m_freem(uvp->bcn_mbuf);
840 if (vap->iv_opmode == IEEE80211_M_IBSS)
841 ieee80211_draintask(ic, &uvp->tsf_task_adhoc);
842 if (URTWN_CHIP_HAS_RATECTL(sc))
843 ieee80211_ratectl_deinit(vap);
844 ieee80211_vap_detach(vap);
845 kfree(uvp, M_80211_VAP);
849 urtwn_rx_copy_to_mbuf(struct urtwn_softc *sc, struct r92c_rx_stat *stat,
852 /* ic is not used, remove to fix gcc warning */
853 /* struct ieee80211com *ic = &sc->sc_ic; */
859 * don't pass packets to the ieee80211 framework if the driver isn't
862 if (!(sc->sc_flags & URTWN_RUNNING))
865 rxdw0 = le32toh(stat->rxdw0);
866 if (rxdw0 & (R92C_RXDW0_CRCERR | R92C_RXDW0_ICVERR)) {
868 * This should not happen since we setup our Rx filter
869 * to not receive these frames.
871 URTWN_DPRINTF(sc, URTWN_DEBUG_RECV,
872 "%s: RX flags error (%s)\n", __func__,
873 rxdw0 & R92C_RXDW0_CRCERR ? "CRC" : "ICV");
877 pktlen = MS(rxdw0, R92C_RXDW0_PKTLEN);
878 if (pktlen < sizeof(struct ieee80211_frame_ack)) {
879 URTWN_DPRINTF(sc, URTWN_DEBUG_RECV,
880 "%s: frame is too short: %d\n", __func__, pktlen);
884 if (__predict_false(totlen > MCLBYTES)) {
885 /* convert to m_getjcl if this happens */
886 device_printf(sc->sc_dev, "%s: frame too long: %d (%d)\n",
887 __func__, pktlen, totlen);
891 m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
892 if (__predict_false(m == NULL)) {
893 device_printf(sc->sc_dev, "%s: could not allocate RX mbuf\n",
899 memcpy(mtod(m, uint8_t *), (uint8_t *)stat, totlen);
900 m->m_pkthdr.len = m->m_len = totlen;
904 #if defined(__DragonFly__)
907 counter_u64_add(ic->ic_ierrors, 1);
913 urtwn_report_intr(struct usb_xfer *xfer, struct urtwn_data *data)
915 struct urtwn_softc *sc = data->sc;
916 /* ic not used, remove to fix gcc error */
917 /* struct ieee80211com *ic = &sc->sc_ic;*/
918 struct r92c_rx_stat *stat;
922 usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
924 if (len < sizeof(*stat)) {
925 #if defined(__DragonFly__)
928 counter_u64_add(ic->ic_ierrors, 1);
934 stat = (struct r92c_rx_stat *)buf;
937 * For 88E chips we can tie the FF flushing here;
938 * this is where we do know exactly how deep the
941 * But it won't work for R92 chips, so we can't
942 * take the easy way out.
945 if (sc->chip & URTWN_CHIP_88E) {
946 int report_sel = MS(le32toh(stat->rxdw3), R88E_RXDW3_RPT);
948 switch (report_sel) {
949 case R88E_RXDW3_RPT_RX:
950 return (urtwn_rxeof(sc, buf, len));
951 case R88E_RXDW3_RPT_TX1:
952 urtwn_r88e_ratectl_tx_complete(sc, &stat[1]);
955 URTWN_DPRINTF(sc, URTWN_DEBUG_INTR,
956 "%s: case %d was not handled\n", __func__,
961 return (urtwn_rxeof(sc, buf, len));
967 urtwn_rxeof(struct urtwn_softc *sc, uint8_t *buf, int len)
969 struct r92c_rx_stat *stat;
970 struct mbuf *m, *m0 = NULL, *prevm = NULL;
972 int totlen, pktlen, infosz, npkts;
974 /* Get the number of encapsulated frames. */
975 stat = (struct r92c_rx_stat *)buf;
976 npkts = MS(le32toh(stat->rxdw2), R92C_RXDW2_PKTCNT);
977 URTWN_DPRINTF(sc, URTWN_DEBUG_RECV,
978 "%s: Rx %d frames in one chunk\n", __func__, npkts);
980 /* Process all of them. */
981 while (npkts-- > 0) {
982 if (len < sizeof(*stat))
984 stat = (struct r92c_rx_stat *)buf;
985 rxdw0 = le32toh(stat->rxdw0);
987 pktlen = MS(rxdw0, R92C_RXDW0_PKTLEN);
991 infosz = MS(rxdw0, R92C_RXDW0_INFOSZ) * 8;
993 /* Make sure everything fits in xfer. */
994 totlen = sizeof(*stat) + infosz + pktlen;
998 m = urtwn_rx_copy_to_mbuf(sc, stat, totlen);
1008 /* Next chunk is 128-byte aligned. */
1009 totlen = (totlen + 127) & ~127;
1018 urtwn_r88e_ratectl_tx_complete(struct urtwn_softc *sc, void *arg)
1020 struct r88e_tx_rpt_ccx *rpt = arg;
1021 struct ieee80211vap *vap;
1022 struct ieee80211_node *ni;
1026 macid = MS(rpt->rptb1, R88E_RPTB1_MACID);
1027 ntries = MS(rpt->rptb2, R88E_RPTB2_RETRY_CNT);
1030 ni = sc->node_list[macid];
1033 URTWN_DPRINTF(sc, URTWN_DEBUG_INTR, "%s: frame for macid %d was"
1034 "%s sent (%d retries)\n", __func__, macid,
1035 (rpt->rptb1 & R88E_RPTB1_PKT_OK) ? "" : " not",
1038 if (rpt->rptb1 & R88E_RPTB1_PKT_OK) {
1039 ieee80211_ratectl_tx_complete(vap, ni,
1040 IEEE80211_RATECTL_TX_SUCCESS, &ntries, NULL);
1042 ieee80211_ratectl_tx_complete(vap, ni,
1043 IEEE80211_RATECTL_TX_FAILURE, &ntries, NULL);
1046 URTWN_DPRINTF(sc, URTWN_DEBUG_INTR, "%s: macid %d, ni is NULL\n",
1049 URTWN_NT_UNLOCK(sc);
1052 static struct ieee80211_node *
1053 urtwn_rx_frame(struct urtwn_softc *sc, struct mbuf *m, int8_t *rssi_p)
1055 struct ieee80211com *ic = &sc->sc_ic;
1056 struct ieee80211_frame_min *wh;
1057 struct r92c_rx_stat *stat;
1058 uint32_t rxdw0, rxdw3;
1059 uint8_t rate, cipher;
1063 stat = mtod(m, struct r92c_rx_stat *);
1064 rxdw0 = le32toh(stat->rxdw0);
1065 rxdw3 = le32toh(stat->rxdw3);
1067 rate = MS(rxdw3, R92C_RXDW3_RATE);
1068 cipher = MS(rxdw0, R92C_RXDW0_CIPHER);
1069 infosz = MS(rxdw0, R92C_RXDW0_INFOSZ) * 8;
1071 /* Get RSSI from PHY status descriptor if present. */
1072 if (infosz != 0 && (rxdw0 & R92C_RXDW0_PHYST)) {
1073 if (sc->chip & URTWN_CHIP_88E)
1074 rssi = urtwn_r88e_get_rssi(sc, rate, &stat[1]);
1076 rssi = urtwn_get_rssi(sc, rate, &stat[1]);
1077 URTWN_DPRINTF(sc, URTWN_DEBUG_RSSI, "%s: rssi=%d\n", __func__, rssi);
1078 /* Update our average RSSI. */
1079 urtwn_update_avgrssi(sc, rate, rssi);
1082 if (ieee80211_radiotap_active(ic)) {
1083 struct urtwn_rx_radiotap_header *tap = &sc->sc_rxtap;
1087 urtwn_get_tsf(sc, &tap->wr_tsft);
1088 if (__predict_false(le32toh((uint32_t)tap->wr_tsft) <
1089 le32toh(stat->rxdw5))) {
1090 tap->wr_tsft = le32toh(tap->wr_tsft >> 32) - 1;
1091 tap->wr_tsft = (uint64_t)htole32(tap->wr_tsft) << 32;
1093 tap->wr_tsft &= 0xffffffff00000000;
1094 tap->wr_tsft += stat->rxdw5;
1099 /* Map HW rate index to 802.11 rate. */
1100 if (!(rxdw3 & R92C_RXDW3_HT)) {
1101 tap->wr_rate = ridx2rate[rate];
1102 } else if (rate >= 12) { /* MCS0~15. */
1103 /* Bit 7 set means HT MCS instead of rate. */
1104 tap->wr_rate = 0x80 | (rate - 12);
1107 /* XXX TODO: this isn't right; should use the last good RSSI */
1108 tap->wr_dbm_antsignal = rssi;
1109 tap->wr_dbm_antnoise = URTWN_NOISE_FLOOR;
1114 /* Drop descriptor. */
1115 m_adj(m, sizeof(*stat) + infosz);
1116 wh = mtod(m, struct ieee80211_frame_min *);
1118 if ((wh->i_fc[1] & IEEE80211_FC1_PROTECTED) &&
1119 cipher != R92C_CAM_ALGO_NONE) {
1120 m->m_flags |= M_WEP;
1123 if (m->m_len >= sizeof(*wh))
1124 return (ieee80211_find_rxnode(ic, wh));
1130 urtwn_bulk_rx_callback(struct usb_xfer *xfer, usb_error_t error)
1132 struct urtwn_softc *sc = usbd_xfer_softc(xfer);
1133 struct ieee80211com *ic = &sc->sc_ic;
1134 struct ieee80211_node *ni;
1135 struct mbuf *m = NULL, *next;
1136 struct urtwn_data *data;
1139 URTWN_ASSERT_LOCKED(sc);
1141 switch (USB_GET_STATE(xfer)) {
1142 case USB_ST_TRANSFERRED:
1143 data = STAILQ_FIRST(&sc->sc_rx_active);
1146 STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next);
1147 m = urtwn_report_intr(xfer, data);
1148 STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next);
1152 data = STAILQ_FIRST(&sc->sc_rx_inactive);
1154 KASSERT(m == NULL, ("mbuf isn't NULL"));
1157 STAILQ_REMOVE_HEAD(&sc->sc_rx_inactive, next);
1158 STAILQ_INSERT_TAIL(&sc->sc_rx_active, data, next);
1159 usbd_xfer_set_frame_data(xfer, 0, data->buf,
1160 usbd_xfer_max_len(xfer));
1161 usbd_transfer_submit(xfer);
1164 * To avoid LOR we should unlock our private mutex here to call
1165 * ieee80211_input() because here is at the end of a USB
1166 * callback and safe to unlock.
1172 ni = urtwn_rx_frame(sc, m, &rssi);
1174 /* Store a global last-good RSSI */
1176 sc->last_rssi = rssi;
1180 nf = URTWN_NOISE_FLOOR;
1183 URTWN_NODE(ni)->last_rssi = rssi;
1184 if (ni->ni_flags & IEEE80211_NODE_HT)
1185 m->m_flags |= M_AMPDU;
1186 (void)ieee80211_input(ni, m,
1187 URTWN_NODE(ni)->last_rssi - nf, nf);
1188 ieee80211_free_node(ni);
1190 /* Use last good global RSSI */
1191 (void)ieee80211_input_all(ic, m,
1192 sc->last_rssi - nf, nf);
1199 /* needs it to the inactive queue due to a error. */
1200 data = STAILQ_FIRST(&sc->sc_rx_active);
1202 STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next);
1203 STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next);
1205 if (error != USB_ERR_CANCELLED) {
1206 usbd_xfer_set_stall(xfer);
1207 #if defined(__DragonFly__)
1210 counter_u64_add(ic->ic_ierrors, 1);
1217 /* Finished receive; age anything left on the FF queue by a little bump */
1219 * XXX TODO: just make this a callout timer schedule so we can
1220 * flush the FF staging queue if we're approaching idle.
1222 #ifdef IEEE80211_SUPPORT_SUPERG
1224 ieee80211_ff_age_all(ic, 1);
1228 /* Kick-start more transmit in case we stalled */
1233 urtwn_txeof(struct urtwn_softc *sc, struct urtwn_data *data, int status)
1236 URTWN_ASSERT_LOCKED(sc);
1238 if (data->ni != NULL) /* not a beacon frame */
1239 ieee80211_tx_complete(data->ni, data->m, status);
1241 if (sc->sc_tx_n_active > 0)
1242 sc->sc_tx_n_active--;
1249 STAILQ_INSERT_TAIL(&sc->sc_tx_inactive, data, next);
1253 urtwn_alloc_list(struct urtwn_softc *sc, struct urtwn_data data[],
1254 int ndata, int maxsz)
1258 for (i = 0; i < ndata; i++) {
1259 struct urtwn_data *dp = &data[i];
1262 dp->buf = kmalloc(maxsz, M_USBDEV, M_INTWAIT);
1263 if (dp->buf == NULL) {
1264 device_printf(sc->sc_dev,
1265 "could not allocate buffer\n");
1274 urtwn_free_list(sc, data, ndata);
1279 urtwn_alloc_rx_list(struct urtwn_softc *sc)
1283 error = urtwn_alloc_list(sc, sc->sc_rx, URTWN_RX_LIST_COUNT,
1288 STAILQ_INIT(&sc->sc_rx_active);
1289 STAILQ_INIT(&sc->sc_rx_inactive);
1291 for (i = 0; i < URTWN_RX_LIST_COUNT; i++)
1292 STAILQ_INSERT_HEAD(&sc->sc_rx_inactive, &sc->sc_rx[i], next);
1298 urtwn_alloc_tx_list(struct urtwn_softc *sc)
1302 error = urtwn_alloc_list(sc, sc->sc_tx, URTWN_TX_LIST_COUNT,
1307 STAILQ_INIT(&sc->sc_tx_active);
1308 STAILQ_INIT(&sc->sc_tx_inactive);
1309 STAILQ_INIT(&sc->sc_tx_pending);
1311 for (i = 0; i < URTWN_TX_LIST_COUNT; i++)
1312 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, &sc->sc_tx[i], next);
1318 urtwn_free_list(struct urtwn_softc *sc, struct urtwn_data data[], int ndata)
1322 for (i = 0; i < ndata; i++) {
1323 struct urtwn_data *dp = &data[i];
1325 if (dp->buf != NULL) {
1326 kfree(dp->buf, M_USBDEV);
1329 if (dp->ni != NULL) {
1330 ieee80211_free_node(dp->ni);
1337 urtwn_free_rx_list(struct urtwn_softc *sc)
1339 urtwn_free_list(sc, sc->sc_rx, URTWN_RX_LIST_COUNT);
1343 urtwn_free_tx_list(struct urtwn_softc *sc)
1345 urtwn_free_list(sc, sc->sc_tx, URTWN_TX_LIST_COUNT);
1349 urtwn_bulk_tx_callback(struct usb_xfer *xfer, usb_error_t error)
1351 struct urtwn_softc *sc = usbd_xfer_softc(xfer);
1352 #ifdef IEEE80211_SUPPORT_SUPERG
1353 struct ieee80211com *ic = &sc->sc_ic;
1355 struct urtwn_data *data;
1357 URTWN_ASSERT_LOCKED(sc);
1359 switch (USB_GET_STATE(xfer)){
1360 case USB_ST_TRANSFERRED:
1361 data = STAILQ_FIRST(&sc->sc_tx_active);
1364 STAILQ_REMOVE_HEAD(&sc->sc_tx_active, next);
1365 urtwn_txeof(sc, data, 0);
1369 data = STAILQ_FIRST(&sc->sc_tx_pending);
1371 URTWN_DPRINTF(sc, URTWN_DEBUG_XMIT,
1372 "%s: empty pending queue\n", __func__);
1373 sc->sc_tx_n_active = 0;
1376 STAILQ_REMOVE_HEAD(&sc->sc_tx_pending, next);
1377 STAILQ_INSERT_TAIL(&sc->sc_tx_active, data, next);
1378 usbd_xfer_set_frame_data(xfer, 0, data->buf, data->buflen);
1379 usbd_transfer_submit(xfer);
1380 sc->sc_tx_n_active++;
1383 data = STAILQ_FIRST(&sc->sc_tx_active);
1386 STAILQ_REMOVE_HEAD(&sc->sc_tx_active, next);
1387 urtwn_txeof(sc, data, 1);
1388 if (error != USB_ERR_CANCELLED) {
1389 usbd_xfer_set_stall(xfer);
1395 #ifdef IEEE80211_SUPPORT_SUPERG
1397 * If the TX active queue drops below a certain
1398 * threshold, ensure we age fast-frames out so they're
1401 if (sc->sc_tx_n_active <= 1) {
1402 /* XXX ew - net80211 should defer this for us! */
1405 * Note: this sc_tx_n_active currently tracks
1406 * the number of pending transmit submissions
1407 * and not the actual depth of the TX frames
1408 * pending to the hardware. That means that
1409 * we're going to end up with some sub-optimal
1410 * aggregation behaviour.
1413 * XXX TODO: just make this a callout timer schedule so we can
1414 * flush the FF staging queue if we're approaching idle.
1417 ieee80211_ff_flush(ic, WME_AC_VO);
1418 ieee80211_ff_flush(ic, WME_AC_VI);
1419 ieee80211_ff_flush(ic, WME_AC_BE);
1420 ieee80211_ff_flush(ic, WME_AC_BK);
1424 /* Kick-start more transmit */
1428 static struct urtwn_data *
1429 _urtwn_getbuf(struct urtwn_softc *sc)
1431 struct urtwn_data *bf;
1433 bf = STAILQ_FIRST(&sc->sc_tx_inactive);
1435 STAILQ_REMOVE_HEAD(&sc->sc_tx_inactive, next);
1437 URTWN_DPRINTF(sc, URTWN_DEBUG_XMIT,
1438 "%s: out of xmit buffers\n", __func__);
1443 static struct urtwn_data *
1444 urtwn_getbuf(struct urtwn_softc *sc)
1446 struct urtwn_data *bf;
1448 URTWN_ASSERT_LOCKED(sc);
1450 bf = _urtwn_getbuf(sc);
1452 URTWN_DPRINTF(sc, URTWN_DEBUG_XMIT, "%s: stop queue\n",
1459 urtwn_write_region_1(struct urtwn_softc *sc, uint16_t addr, uint8_t *buf,
1462 usb_device_request_t req;
1464 req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1465 req.bRequest = R92C_REQ_REGS;
1466 USETW(req.wValue, addr);
1467 USETW(req.wIndex, 0);
1468 USETW(req.wLength, len);
1469 return (urtwn_do_request(sc, &req, buf));
1473 urtwn_write_1(struct urtwn_softc *sc, uint16_t addr, uint8_t val)
1475 return (urtwn_write_region_1(sc, addr, &val, sizeof(val)));
1479 urtwn_write_2(struct urtwn_softc *sc, uint16_t addr, uint16_t val)
1482 return (urtwn_write_region_1(sc, addr, (uint8_t *)&val, sizeof(val)));
1486 urtwn_write_4(struct urtwn_softc *sc, uint16_t addr, uint32_t val)
1489 return (urtwn_write_region_1(sc, addr, (uint8_t *)&val, sizeof(val)));
1493 urtwn_read_region_1(struct urtwn_softc *sc, uint16_t addr, uint8_t *buf,
1496 usb_device_request_t req;
1498 req.bmRequestType = UT_READ_VENDOR_DEVICE;
1499 req.bRequest = R92C_REQ_REGS;
1500 USETW(req.wValue, addr);
1501 USETW(req.wIndex, 0);
1502 USETW(req.wLength, len);
1503 return (urtwn_do_request(sc, &req, buf));
1507 urtwn_read_1(struct urtwn_softc *sc, uint16_t addr)
1511 if (urtwn_read_region_1(sc, addr, &val, 1) != 0)
1517 urtwn_read_2(struct urtwn_softc *sc, uint16_t addr)
1521 if (urtwn_read_region_1(sc, addr, (uint8_t *)&val, 2) != 0)
1523 return (le16toh(val));
1527 urtwn_read_4(struct urtwn_softc *sc, uint16_t addr)
1531 if (urtwn_read_region_1(sc, addr, (uint8_t *)&val, 4) != 0)
1532 return (0xffffffff);
1533 return (le32toh(val));
1537 urtwn_fw_cmd(struct urtwn_softc *sc, uint8_t id, const void *buf, int len)
1539 struct r92c_fw_cmd cmd;
1543 if (!(sc->sc_flags & URTWN_FW_LOADED)) {
1544 URTWN_DPRINTF(sc, URTWN_DEBUG_FIRMWARE, "%s: firmware "
1545 "was not loaded; command (id %d) will be discarded\n",
1550 /* Wait for current FW box to be empty. */
1551 for (ntries = 0; ntries < 100; ntries++) {
1552 if (!(urtwn_read_1(sc, R92C_HMETFR) & (1 << sc->fwcur)))
1556 if (ntries == 100) {
1557 device_printf(sc->sc_dev,
1558 "could not send firmware command\n");
1561 memset(&cmd, 0, sizeof(cmd));
1564 cmd.id |= R92C_CMD_FLAG_EXT;
1565 KASSERT(len <= sizeof(cmd.msg), ("urtwn_fw_cmd\n"));
1566 memcpy(cmd.msg, buf, len);
1568 /* Write the first word last since that will trigger the FW. */
1569 error = urtwn_write_region_1(sc, R92C_HMEBOX_EXT(sc->fwcur),
1570 (uint8_t *)&cmd + 4, 2);
1571 if (error != USB_ERR_NORMAL_COMPLETION)
1573 error = urtwn_write_region_1(sc, R92C_HMEBOX(sc->fwcur),
1574 (uint8_t *)&cmd + 0, 4);
1575 if (error != USB_ERR_NORMAL_COMPLETION)
1578 sc->fwcur = (sc->fwcur + 1) % R92C_H2C_NBOX;
1583 urtwn_cmdq_cb(void *arg, int pending)
1585 struct urtwn_softc *sc = arg;
1586 struct urtwn_cmdq *item;
1589 * Device must be powered on (via urtwn_power_on())
1590 * before any command may be sent.
1593 if (!(sc->sc_flags & URTWN_RUNNING)) {
1598 URTWN_CMDQ_LOCK(sc);
1599 while (sc->cmdq[sc->cmdq_first].func != NULL) {
1600 item = &sc->cmdq[sc->cmdq_first];
1601 sc->cmdq_first = (sc->cmdq_first + 1) % URTWN_CMDQ_SIZE;
1602 URTWN_CMDQ_UNLOCK(sc);
1604 item->func(sc, &item->data);
1606 URTWN_CMDQ_LOCK(sc);
1607 memset(item, 0, sizeof (*item));
1609 URTWN_CMDQ_UNLOCK(sc);
1614 urtwn_cmd_sleepable(struct urtwn_softc *sc, const void *ptr, size_t len,
1617 struct ieee80211com *ic = &sc->sc_ic;
1619 KASSERT(len <= sizeof(union sec_param), ("buffer overflow"));
1621 URTWN_CMDQ_LOCK(sc);
1622 if (sc->cmdq[sc->cmdq_last].func != NULL) {
1623 device_printf(sc->sc_dev, "%s: cmdq overflow\n", __func__);
1624 URTWN_CMDQ_UNLOCK(sc);
1630 memcpy(&sc->cmdq[sc->cmdq_last].data, ptr, len);
1631 sc->cmdq[sc->cmdq_last].func = func;
1632 sc->cmdq_last = (sc->cmdq_last + 1) % URTWN_CMDQ_SIZE;
1633 URTWN_CMDQ_UNLOCK(sc);
1635 ieee80211_runtask(ic, &sc->cmdq_task);
1640 static __inline void
1641 urtwn_rf_write(struct urtwn_softc *sc, int chain, uint8_t addr, uint32_t val)
1644 sc->sc_rf_write(sc, chain, addr, val);
1648 urtwn_r92c_rf_write(struct urtwn_softc *sc, int chain, uint8_t addr,
1651 urtwn_bb_write(sc, R92C_LSSI_PARAM(chain),
1652 SM(R92C_LSSI_PARAM_ADDR, addr) |
1653 SM(R92C_LSSI_PARAM_DATA, val));
1657 urtwn_r88e_rf_write(struct urtwn_softc *sc, int chain, uint8_t addr,
1660 urtwn_bb_write(sc, R92C_LSSI_PARAM(chain),
1661 SM(R88E_LSSI_PARAM_ADDR, addr) |
1662 SM(R92C_LSSI_PARAM_DATA, val));
1666 urtwn_rf_read(struct urtwn_softc *sc, int chain, uint8_t addr)
1668 uint32_t reg[R92C_MAX_CHAINS], val;
1670 reg[0] = urtwn_bb_read(sc, R92C_HSSI_PARAM2(0));
1672 reg[chain] = urtwn_bb_read(sc, R92C_HSSI_PARAM2(chain));
1674 urtwn_bb_write(sc, R92C_HSSI_PARAM2(0),
1675 reg[0] & ~R92C_HSSI_PARAM2_READ_EDGE);
1678 urtwn_bb_write(sc, R92C_HSSI_PARAM2(chain),
1679 RW(reg[chain], R92C_HSSI_PARAM2_READ_ADDR, addr) |
1680 R92C_HSSI_PARAM2_READ_EDGE);
1683 urtwn_bb_write(sc, R92C_HSSI_PARAM2(0),
1684 reg[0] | R92C_HSSI_PARAM2_READ_EDGE);
1687 if (urtwn_bb_read(sc, R92C_HSSI_PARAM1(chain)) & R92C_HSSI_PARAM1_PI)
1688 val = urtwn_bb_read(sc, R92C_HSPI_READBACK(chain));
1690 val = urtwn_bb_read(sc, R92C_LSSI_READBACK(chain));
1691 return (MS(val, R92C_LSSI_READBACK_DATA));
1695 urtwn_llt_write(struct urtwn_softc *sc, uint32_t addr, uint32_t data)
1700 error = urtwn_write_4(sc, R92C_LLT_INIT,
1701 SM(R92C_LLT_INIT_OP, R92C_LLT_INIT_OP_WRITE) |
1702 SM(R92C_LLT_INIT_ADDR, addr) |
1703 SM(R92C_LLT_INIT_DATA, data));
1704 if (error != USB_ERR_NORMAL_COMPLETION)
1706 /* Wait for write operation to complete. */
1707 for (ntries = 0; ntries < 20; ntries++) {
1708 if (MS(urtwn_read_4(sc, R92C_LLT_INIT), R92C_LLT_INIT_OP) ==
1709 R92C_LLT_INIT_OP_NO_ACTIVE)
1717 urtwn_efuse_read_next(struct urtwn_softc *sc, uint8_t *val)
1723 if (sc->last_rom_addr >= URTWN_EFUSE_MAX_LEN)
1726 reg = urtwn_read_4(sc, R92C_EFUSE_CTRL);
1727 reg = RW(reg, R92C_EFUSE_CTRL_ADDR, sc->last_rom_addr);
1728 reg &= ~R92C_EFUSE_CTRL_VALID;
1730 error = urtwn_write_4(sc, R92C_EFUSE_CTRL, reg);
1731 if (error != USB_ERR_NORMAL_COMPLETION)
1733 /* Wait for read operation to complete. */
1734 for (ntries = 0; ntries < 100; ntries++) {
1735 reg = urtwn_read_4(sc, R92C_EFUSE_CTRL);
1736 if (reg & R92C_EFUSE_CTRL_VALID)
1740 if (ntries == 100) {
1741 device_printf(sc->sc_dev,
1742 "could not read efuse byte at address 0x%x\n",
1747 *val = MS(reg, R92C_EFUSE_CTRL_DATA);
1748 sc->last_rom_addr++;
1754 urtwn_efuse_read_data(struct urtwn_softc *sc, uint8_t *rom, uint8_t off,
1760 for (i = 0; i < 4; i++) {
1763 error = urtwn_efuse_read_next(sc, ®);
1766 URTWN_DPRINTF(sc, URTWN_DEBUG_ROM, "rom[0x%03X] == 0x%02X\n",
1767 off * 8 + i * 2, reg);
1768 rom[off * 8 + i * 2 + 0] = reg;
1770 error = urtwn_efuse_read_next(sc, ®);
1773 URTWN_DPRINTF(sc, URTWN_DEBUG_ROM, "rom[0x%03X] == 0x%02X\n",
1774 off * 8 + i * 2 + 1, reg);
1775 rom[off * 8 + i * 2 + 1] = reg;
1783 urtwn_dump_rom_contents(struct urtwn_softc *sc, uint8_t *rom, uint16_t size)
1787 /* Dump ROM contents. */
1788 device_printf(sc->sc_dev, "%s:", __func__);
1789 for (i = 0; i < size; i++) {
1791 printf("\n%03X: ", i);
1792 else if (i % 4 == 0)
1795 printf("%02X", rom[i]);
1802 urtwn_efuse_read(struct urtwn_softc *sc, uint8_t *rom, uint16_t size)
1804 #define URTWN_CHK(res) do { \
1805 if ((error = res) != 0) \
1808 uint8_t msk, off, reg;
1811 URTWN_CHK(urtwn_efuse_switch_power(sc));
1813 /* Read full ROM image. */
1814 sc->last_rom_addr = 0;
1815 memset(rom, 0xff, size);
1817 URTWN_CHK(urtwn_efuse_read_next(sc, ®));
1818 while (reg != 0xff) {
1819 /* check for extended header */
1820 if ((sc->chip & URTWN_CHIP_88E) && (reg & 0x1f) == 0x0f) {
1822 URTWN_CHK(urtwn_efuse_read_next(sc, ®));
1824 if ((reg & 0x0f) != 0x0f)
1825 off = ((reg & 0xf0) >> 1) | off;
1832 URTWN_CHK(urtwn_efuse_read_data(sc, rom, off, msk));
1833 URTWN_CHK(urtwn_efuse_read_next(sc, ®));
1839 if (sc->sc_debug & URTWN_DEBUG_ROM)
1840 urtwn_dump_rom_contents(sc, rom, size);
1843 urtwn_write_1(sc, R92C_EFUSE_ACCESS, R92C_EFUSE_ACCESS_OFF);
1846 device_printf(sc->sc_dev, "%s: error while reading ROM\n",
1855 urtwn_efuse_switch_power(struct urtwn_softc *sc)
1860 error = urtwn_write_1(sc, R92C_EFUSE_ACCESS, R92C_EFUSE_ACCESS_ON);
1861 if (error != USB_ERR_NORMAL_COMPLETION)
1864 reg = urtwn_read_2(sc, R92C_SYS_ISO_CTRL);
1865 if (!(reg & R92C_SYS_ISO_CTRL_PWC_EV12V)) {
1866 error = urtwn_write_2(sc, R92C_SYS_ISO_CTRL,
1867 reg | R92C_SYS_ISO_CTRL_PWC_EV12V);
1868 if (error != USB_ERR_NORMAL_COMPLETION)
1871 reg = urtwn_read_2(sc, R92C_SYS_FUNC_EN);
1872 if (!(reg & R92C_SYS_FUNC_EN_ELDR)) {
1873 error = urtwn_write_2(sc, R92C_SYS_FUNC_EN,
1874 reg | R92C_SYS_FUNC_EN_ELDR);
1875 if (error != USB_ERR_NORMAL_COMPLETION)
1878 reg = urtwn_read_2(sc, R92C_SYS_CLKR);
1879 if ((reg & (R92C_SYS_CLKR_LOADER_EN | R92C_SYS_CLKR_ANA8M)) !=
1880 (R92C_SYS_CLKR_LOADER_EN | R92C_SYS_CLKR_ANA8M)) {
1881 error = urtwn_write_2(sc, R92C_SYS_CLKR,
1882 reg | R92C_SYS_CLKR_LOADER_EN | R92C_SYS_CLKR_ANA8M);
1883 if (error != USB_ERR_NORMAL_COMPLETION)
1891 urtwn_read_chipid(struct urtwn_softc *sc)
1895 if (sc->chip & URTWN_CHIP_88E)
1898 reg = urtwn_read_4(sc, R92C_SYS_CFG);
1899 if (reg & R92C_SYS_CFG_TRP_VAUX_EN)
1902 if (reg & R92C_SYS_CFG_TYPE_92C) {
1903 sc->chip |= URTWN_CHIP_92C;
1904 /* Check if it is a castrated 8192C. */
1905 if (MS(urtwn_read_4(sc, R92C_HPON_FSM),
1906 R92C_HPON_FSM_CHIP_BONDING_ID) ==
1907 R92C_HPON_FSM_CHIP_BONDING_ID_92C_1T2R)
1908 sc->chip |= URTWN_CHIP_92C_1T2R;
1910 if (reg & R92C_SYS_CFG_VENDOR_UMC) {
1911 sc->chip |= URTWN_CHIP_UMC;
1912 if (MS(reg, R92C_SYS_CFG_CHIP_VER_RTL) == 0)
1913 sc->chip |= URTWN_CHIP_UMC_A_CUT;
1919 urtwn_read_rom(struct urtwn_softc *sc)
1921 struct r92c_rom *rom = &sc->rom.r92c_rom;
1924 /* Read full ROM image. */
1925 error = urtwn_efuse_read(sc, (uint8_t *)rom, sizeof(*rom));
1929 /* XXX Weird but this is what the vendor driver does. */
1930 sc->last_rom_addr = 0x1fa;
1931 error = urtwn_efuse_read_next(sc, &sc->pa_setting);
1934 URTWN_DPRINTF(sc, URTWN_DEBUG_ROM, "%s: PA setting=0x%x\n", __func__,
1937 sc->board_type = MS(rom->rf_opt1, R92C_ROM_RF1_BOARD_TYPE);
1939 sc->regulatory = MS(rom->rf_opt1, R92C_ROM_RF1_REGULATORY);
1940 URTWN_DPRINTF(sc, URTWN_DEBUG_ROM, "%s: regulatory type=%d\n",
1941 __func__, sc->regulatory);
1942 IEEE80211_ADDR_COPY(sc->sc_ic.ic_macaddr, rom->macaddr);
1944 sc->sc_rf_write = urtwn_r92c_rf_write;
1945 sc->sc_power_on = urtwn_r92c_power_on;
1946 sc->sc_power_off = urtwn_r92c_power_off;
1952 urtwn_r88e_read_rom(struct urtwn_softc *sc)
1954 struct r88e_rom *rom = &sc->rom.r88e_rom;
1957 error = urtwn_efuse_read(sc, (uint8_t *)rom, sizeof(sc->rom.r88e_rom));
1961 sc->bw20_tx_pwr_diff = (rom->tx_pwr_diff >> 4);
1962 if (sc->bw20_tx_pwr_diff & 0x08)
1963 sc->bw20_tx_pwr_diff |= 0xf0;
1964 sc->ofdm_tx_pwr_diff = (rom->tx_pwr_diff & 0xf);
1965 if (sc->ofdm_tx_pwr_diff & 0x08)
1966 sc->ofdm_tx_pwr_diff |= 0xf0;
1967 sc->regulatory = MS(rom->rf_board_opt, R92C_ROM_RF1_REGULATORY);
1968 URTWN_DPRINTF(sc, URTWN_DEBUG_ROM, "%s: regulatory type %d\n",
1969 __func__,sc->regulatory);
1970 IEEE80211_ADDR_COPY(sc->sc_ic.ic_macaddr, rom->macaddr);
1972 sc->sc_rf_write = urtwn_r88e_rf_write;
1973 sc->sc_power_on = urtwn_r88e_power_on;
1974 sc->sc_power_off = urtwn_r88e_power_off;
1979 static __inline uint8_t
1980 rate2ridx(uint8_t rate)
1982 if (rate & IEEE80211_RATE_MCS) {
1983 /* 11n rates start at idx 12 */
1984 return ((rate & 0xf) + 12);
1995 case 108: return 11;
2001 default: return URTWN_RIDX_UNKNOWN;
2006 * Initialize rate adaptation in firmware.
2009 urtwn_ra_init(struct urtwn_softc *sc)
2011 struct ieee80211com *ic = &sc->sc_ic;
2012 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
2013 struct ieee80211_node *ni;
2014 struct ieee80211_rateset *rs, *rs_ht;
2015 struct r92c_fw_cmd_macid_cfg cmd;
2016 uint32_t rates, basicrates;
2018 int maxrate, maxbasicrate, error, i;
2020 ni = ieee80211_ref_node(vap->iv_bss);
2022 rs_ht = (struct ieee80211_rateset *) &ni->ni_htrates;
2024 /* Get normal and basic rates mask. */
2025 rates = basicrates = 0;
2026 maxrate = maxbasicrate = 0;
2028 /* This is for 11bg */
2029 for (i = 0; i < rs->rs_nrates; i++) {
2030 /* Convert 802.11 rate to HW rate index. */
2031 ridx = rate2ridx(IEEE80211_RV(rs->rs_rates[i]));
2032 if (ridx == URTWN_RIDX_UNKNOWN) /* Unknown rate, skip. */
2037 if (rs->rs_rates[i] & IEEE80211_RATE_BASIC) {
2038 basicrates |= 1 << ridx;
2039 if (ridx > maxbasicrate)
2040 maxbasicrate = ridx;
2044 /* If we're doing 11n, enable 11n rates */
2045 if (ni->ni_flags & IEEE80211_NODE_HT) {
2046 for (i = 0; i < rs_ht->rs_nrates; i++) {
2047 if ((rs_ht->rs_rates[i] & 0x7f) > 0xf)
2049 /* 11n rates start at index 12 */
2050 ridx = ((rs_ht->rs_rates[i]) & 0xf) + 12;
2051 rates |= (1 << ridx);
2053 /* Guard against the rate table being oddly ordered */
2060 if (ic->ic_curmode == IEEE80211_MODE_11NG)
2061 raid = R92C_RAID_11GN;
2063 /* NB: group addressed frames are done at 11bg rates for now */
2064 if (ic->ic_curmode == IEEE80211_MODE_11B)
2065 mode = R92C_RAID_11B;
2067 mode = R92C_RAID_11BG;
2068 /* XXX misleading 'mode' value here for unicast frames */
2069 URTWN_DPRINTF(sc, URTWN_DEBUG_RA,
2070 "%s: mode 0x%x, rates 0x%08x, basicrates 0x%08x\n", __func__,
2071 mode, rates, basicrates);
2073 /* Set rates mask for group addressed frames. */
2074 cmd.macid = URTWN_MACID_BC | URTWN_MACID_VALID;
2075 cmd.mask = htole32(mode << 28 | basicrates);
2076 error = urtwn_fw_cmd(sc, R92C_CMD_MACID_CONFIG, &cmd, sizeof(cmd));
2078 ieee80211_free_node(ni);
2079 device_printf(sc->sc_dev,
2080 "could not add broadcast station\n");
2084 /* Set initial MRR rate. */
2085 URTWN_DPRINTF(sc, URTWN_DEBUG_RA, "%s: maxbasicrate %d\n", __func__,
2087 urtwn_write_1(sc, R92C_INIDATA_RATE_SEL(URTWN_MACID_BC),
2090 /* Set rates mask for unicast frames. */
2091 if (ni->ni_flags & IEEE80211_NODE_HT)
2092 mode = R92C_RAID_11GN;
2093 else if (ic->ic_curmode == IEEE80211_MODE_11B)
2094 mode = R92C_RAID_11B;
2096 mode = R92C_RAID_11BG;
2097 cmd.macid = URTWN_MACID_BSS | URTWN_MACID_VALID;
2098 cmd.mask = htole32(mode << 28 | rates);
2099 error = urtwn_fw_cmd(sc, R92C_CMD_MACID_CONFIG, &cmd, sizeof(cmd));
2101 ieee80211_free_node(ni);
2102 device_printf(sc->sc_dev, "could not add BSS station\n");
2105 /* Set initial MRR rate. */
2106 URTWN_DPRINTF(sc, URTWN_DEBUG_RA, "%s: maxrate %d\n", __func__,
2108 urtwn_write_1(sc, R92C_INIDATA_RATE_SEL(URTWN_MACID_BSS),
2111 /* Indicate highest supported rate. */
2112 if (ni->ni_flags & IEEE80211_NODE_HT)
2113 ni->ni_txrate = rs_ht->rs_rates[rs_ht->rs_nrates - 1]
2114 | IEEE80211_RATE_MCS;
2116 ni->ni_txrate = rs->rs_rates[rs->rs_nrates - 1];
2117 ieee80211_free_node(ni);
2123 urtwn_init_beacon(struct urtwn_softc *sc, struct urtwn_vap *uvp)
2125 struct r92c_tx_desc *txd = &uvp->bcn_desc;
2127 txd->txdw0 = htole32(
2128 SM(R92C_TXDW0_OFFSET, sizeof(*txd)) | R92C_TXDW0_BMCAST |
2129 R92C_TXDW0_OWN | R92C_TXDW0_FSG | R92C_TXDW0_LSG);
2130 txd->txdw1 = htole32(
2131 SM(R92C_TXDW1_QSEL, R92C_TXDW1_QSEL_BEACON) |
2132 SM(R92C_TXDW1_RAID, R92C_RAID_11B));
2134 if (sc->chip & URTWN_CHIP_88E) {
2135 txd->txdw1 |= htole32(SM(R88E_TXDW1_MACID, URTWN_MACID_BC));
2136 txd->txdseq |= htole16(R88E_TXDSEQ_HWSEQ_EN);
2138 txd->txdw1 |= htole32(SM(R92C_TXDW1_MACID, URTWN_MACID_BC));
2139 txd->txdw4 |= htole32(R92C_TXDW4_HWSEQ_EN);
2142 txd->txdw4 = htole32(R92C_TXDW4_DRVRATE);
2143 txd->txdw5 = htole32(SM(R92C_TXDW5_DATARATE, URTWN_RIDX_CCK1));
2147 urtwn_setup_beacon(struct urtwn_softc *sc, struct ieee80211_node *ni)
2149 struct ieee80211vap *vap = ni->ni_vap;
2150 struct urtwn_vap *uvp = URTWN_VAP(vap);
2154 URTWN_ASSERT_LOCKED(sc);
2156 if (ni->ni_chan == IEEE80211_CHAN_ANYC)
2159 m = ieee80211_beacon_alloc(ni);
2161 device_printf(sc->sc_dev,
2162 "%s: could not allocate beacon frame\n", __func__);
2166 if (uvp->bcn_mbuf != NULL)
2167 m_freem(uvp->bcn_mbuf);
2171 if ((error = urtwn_tx_beacon(sc, uvp)) != 0)
2174 /* XXX bcnq stuck workaround */
2175 if ((error = urtwn_tx_beacon(sc, uvp)) != 0)
2178 URTWN_DPRINTF(sc, URTWN_DEBUG_BEACON, "%s: beacon was %srecognized\n",
2179 __func__, urtwn_read_1(sc, R92C_TDECTRL + 2) &
2180 (R92C_TDECTRL_BCN_VALID >> 16) ? "" : "not ");
2186 urtwn_update_beacon(struct ieee80211vap *vap, int item)
2188 struct urtwn_softc *sc = vap->iv_ic->ic_softc;
2189 struct urtwn_vap *uvp = URTWN_VAP(vap);
2190 struct ieee80211_beacon_offsets *bo = &vap->iv_bcn_off;
2191 struct ieee80211_node *ni = vap->iv_bss;
2195 if (uvp->bcn_mbuf == NULL) {
2196 uvp->bcn_mbuf = ieee80211_beacon_alloc(ni);
2197 if (uvp->bcn_mbuf == NULL) {
2198 device_printf(sc->sc_dev,
2199 "%s: could not allocate beacon frame\n", __func__);
2206 if (item == IEEE80211_BEACON_TIM)
2207 mcast = 1; /* XXX */
2209 setbit(bo->bo_flags, item);
2210 ieee80211_beacon_update(ni, uvp->bcn_mbuf, mcast);
2213 urtwn_tx_beacon(sc, uvp);
2218 * Push a beacon frame into the chip. Beacon will
2219 * be repeated by the chip every R92C_BCN_INTERVAL.
2222 urtwn_tx_beacon(struct urtwn_softc *sc, struct urtwn_vap *uvp)
2224 struct r92c_tx_desc *desc = &uvp->bcn_desc;
2225 struct urtwn_data *bf;
2227 URTWN_ASSERT_LOCKED(sc);
2229 bf = urtwn_getbuf(sc);
2233 memcpy(bf->buf, desc, sizeof(*desc));
2234 urtwn_tx_start(sc, uvp->bcn_mbuf, IEEE80211_FC0_TYPE_MGT, bf);
2237 callout_reset(&sc->sc_watchdog_ch, hz, urtwn_watchdog, sc);
2243 urtwn_key_alloc(struct ieee80211vap *vap, struct ieee80211_key *k,
2244 ieee80211_keyix *keyix, ieee80211_keyix *rxkeyix)
2246 struct urtwn_softc *sc = vap->iv_ic->ic_softc;
2249 if (!(&vap->iv_nw_keys[0] <= k &&
2250 k < &vap->iv_nw_keys[IEEE80211_WEP_NKID])) {
2251 if (!(k->wk_flags & IEEE80211_KEY_SWCRYPT)) {
2254 * First 4 slots for group keys,
2255 * what is left - for pairwise.
2256 * XXX incompatible with IBSS RSN.
2258 for (i = IEEE80211_WEP_NKID;
2259 i < R92C_CAM_ENTRY_COUNT; i++) {
2260 if ((sc->keys_bmap & (1 << i)) == 0) {
2261 sc->keys_bmap |= 1 << i;
2267 if (i == R92C_CAM_ENTRY_COUNT) {
2268 device_printf(sc->sc_dev,
2269 "%s: no free space in the key table\n",
2276 *keyix = k - vap->iv_nw_keys;
2283 urtwn_key_set_cb(struct urtwn_softc *sc, union sec_param *data)
2285 struct ieee80211_key *k = &data->key;
2286 uint8_t algo, keyid;
2289 if (k->wk_keyix < IEEE80211_WEP_NKID)
2290 keyid = k->wk_keyix;
2294 /* Map net80211 cipher to HW crypto algorithm. */
2295 switch (k->wk_cipher->ic_cipher) {
2296 case IEEE80211_CIPHER_WEP:
2297 if (k->wk_keylen < 8)
2298 algo = R92C_CAM_ALGO_WEP40;
2300 algo = R92C_CAM_ALGO_WEP104;
2302 case IEEE80211_CIPHER_TKIP:
2303 algo = R92C_CAM_ALGO_TKIP;
2305 case IEEE80211_CIPHER_AES_CCM:
2306 algo = R92C_CAM_ALGO_AES;
2309 device_printf(sc->sc_dev, "%s: undefined cipher %d\n",
2310 __func__, k->wk_cipher->ic_cipher);
2314 URTWN_DPRINTF(sc, URTWN_DEBUG_KEY,
2315 "%s: keyix %d, keyid %d, algo %d/%d, flags %04X, len %d, "
2316 "macaddr %s\n", __func__, k->wk_keyix, keyid,
2317 k->wk_cipher->ic_cipher, algo, k->wk_flags, k->wk_keylen,
2318 ether_sprintf(k->wk_macaddr));
2321 for (i = 0; i < 4; i++) {
2322 error = urtwn_cam_write(sc, R92C_CAM_KEY(k->wk_keyix, i),
2323 le32dec(&k->wk_key[i * 4]));
2328 /* Write CTL0 last since that will validate the CAM entry. */
2329 error = urtwn_cam_write(sc, R92C_CAM_CTL1(k->wk_keyix),
2330 le32dec(&k->wk_macaddr[2]));
2333 error = urtwn_cam_write(sc, R92C_CAM_CTL0(k->wk_keyix),
2334 SM(R92C_CAM_ALGO, algo) |
2335 SM(R92C_CAM_KEYID, keyid) |
2336 SM(R92C_CAM_MACLO, le16dec(&k->wk_macaddr[0])) |
2344 device_printf(sc->sc_dev, "%s fails, error %d\n", __func__, error);
2348 urtwn_key_del_cb(struct urtwn_softc *sc, union sec_param *data)
2350 struct ieee80211_key *k = &data->key;
2353 URTWN_DPRINTF(sc, URTWN_DEBUG_KEY,
2354 "%s: keyix %d, flags %04X, macaddr %s\n", __func__,
2355 k->wk_keyix, k->wk_flags, ether_sprintf(k->wk_macaddr));
2357 urtwn_cam_write(sc, R92C_CAM_CTL0(k->wk_keyix), 0);
2358 urtwn_cam_write(sc, R92C_CAM_CTL1(k->wk_keyix), 0);
2361 for (i = 0; i < 4; i++)
2362 urtwn_cam_write(sc, R92C_CAM_KEY(k->wk_keyix, i), 0);
2363 sc->keys_bmap &= ~(1 << k->wk_keyix);
2367 urtwn_key_set(struct ieee80211vap *vap, const struct ieee80211_key *k)
2369 struct urtwn_softc *sc = vap->iv_ic->ic_softc;
2371 if (k->wk_flags & IEEE80211_KEY_SWCRYPT) {
2376 return (!urtwn_cmd_sleepable(sc, k, sizeof(*k), urtwn_key_set_cb));
2380 urtwn_key_delete(struct ieee80211vap *vap, const struct ieee80211_key *k)
2382 struct urtwn_softc *sc = vap->iv_ic->ic_softc;
2384 if (k->wk_flags & IEEE80211_KEY_SWCRYPT) {
2389 return (!urtwn_cmd_sleepable(sc, k, sizeof(*k), urtwn_key_del_cb));
2393 urtwn_tsf_task_adhoc(void *arg, int pending)
2395 struct ieee80211vap *vap = arg;
2396 struct urtwn_softc *sc = vap->iv_ic->ic_softc;
2397 struct ieee80211_node *ni;
2401 ni = ieee80211_ref_node(vap->iv_bss);
2402 reg = urtwn_read_1(sc, R92C_BCN_CTRL);
2404 /* Accept beacons with the same BSSID. */
2405 urtwn_set_rx_bssid_all(sc, 0);
2407 /* Enable synchronization. */
2408 reg &= ~R92C_BCN_CTRL_DIS_TSF_UDT0;
2409 urtwn_write_1(sc, R92C_BCN_CTRL, reg);
2412 usb_pause_mtx(&sc->sc_mtx, hz * ni->ni_intval * 5 / 1000);
2414 /* Disable synchronization. */
2415 reg |= R92C_BCN_CTRL_DIS_TSF_UDT0;
2416 urtwn_write_1(sc, R92C_BCN_CTRL, reg);
2418 /* Remove beacon filter. */
2419 urtwn_set_rx_bssid_all(sc, 1);
2421 /* Enable beaconing. */
2422 urtwn_write_1(sc, R92C_MBID_NUM,
2423 urtwn_read_1(sc, R92C_MBID_NUM) | R92C_MBID_TXBCN_RPT0);
2424 reg |= R92C_BCN_CTRL_EN_BCN;
2426 urtwn_write_1(sc, R92C_BCN_CTRL, reg);
2427 ieee80211_free_node(ni);
2432 urtwn_tsf_sync_enable(struct urtwn_softc *sc, struct ieee80211vap *vap)
2434 struct ieee80211com *ic = &sc->sc_ic;
2435 struct urtwn_vap *uvp = URTWN_VAP(vap);
2438 urtwn_write_1(sc, R92C_DUAL_TSF_RST, R92C_DUAL_TSF_RST0);
2440 switch (vap->iv_opmode) {
2441 case IEEE80211_M_STA:
2442 /* Enable TSF synchronization. */
2443 urtwn_write_1(sc, R92C_BCN_CTRL,
2444 urtwn_read_1(sc, R92C_BCN_CTRL) &
2445 ~R92C_BCN_CTRL_DIS_TSF_UDT0);
2447 case IEEE80211_M_IBSS:
2448 ieee80211_runtask(ic, &uvp->tsf_task_adhoc);
2450 case IEEE80211_M_HOSTAP:
2451 /* Enable beaconing. */
2452 urtwn_write_1(sc, R92C_MBID_NUM,
2453 urtwn_read_1(sc, R92C_MBID_NUM) | R92C_MBID_TXBCN_RPT0);
2454 urtwn_write_1(sc, R92C_BCN_CTRL,
2455 urtwn_read_1(sc, R92C_BCN_CTRL) | R92C_BCN_CTRL_EN_BCN);
2458 device_printf(sc->sc_dev, "undefined opmode %d\n",
2465 urtwn_get_tsf(struct urtwn_softc *sc, uint64_t *buf)
2467 urtwn_read_region_1(sc, R92C_TSFTR, (uint8_t *)buf, sizeof(*buf));
2471 urtwn_set_led(struct urtwn_softc *sc, int led, int on)
2475 if (led == URTWN_LED_LINK) {
2476 if (sc->chip & URTWN_CHIP_88E) {
2477 reg = urtwn_read_1(sc, R92C_LEDCFG2) & 0xf0;
2478 urtwn_write_1(sc, R92C_LEDCFG2, reg | 0x60);
2480 reg = urtwn_read_1(sc, R92C_LEDCFG2) & 0x90;
2481 urtwn_write_1(sc, R92C_LEDCFG2,
2482 reg | R92C_LEDCFG0_DIS);
2483 urtwn_write_1(sc, R92C_MAC_PINMUX_CFG,
2484 urtwn_read_1(sc, R92C_MAC_PINMUX_CFG) &
2488 reg = urtwn_read_1(sc, R92C_LEDCFG0) & 0x70;
2490 reg |= R92C_LEDCFG0_DIS;
2491 urtwn_write_1(sc, R92C_LEDCFG0, reg);
2493 sc->ledlink = on; /* Save LED state. */
2498 urtwn_set_mode(struct urtwn_softc *sc, uint8_t mode)
2502 reg = urtwn_read_1(sc, R92C_MSR);
2503 reg = (reg & ~R92C_MSR_MASK) | mode;
2504 urtwn_write_1(sc, R92C_MSR, reg);
2508 urtwn_ibss_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m, int subtype,
2509 const struct ieee80211_rx_stats *rxs,
2512 struct ieee80211vap *vap = ni->ni_vap;
2513 struct urtwn_softc *sc = vap->iv_ic->ic_softc;
2514 struct urtwn_vap *uvp = URTWN_VAP(vap);
2515 uint64_t ni_tstamp, curr_tstamp;
2517 uvp->recv_mgmt(ni, m, subtype, rxs, rssi, nf);
2519 if (vap->iv_state == IEEE80211_S_RUN &&
2520 (subtype == IEEE80211_FC0_SUBTYPE_BEACON ||
2521 subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP)) {
2522 ni_tstamp = le64toh(ni->ni_tstamp.tsf);
2524 urtwn_get_tsf(sc, &curr_tstamp);
2526 curr_tstamp = le64toh(curr_tstamp);
2528 if (ni_tstamp >= curr_tstamp)
2529 (void) ieee80211_ibss_merge(ni);
2534 urtwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
2536 struct urtwn_vap *uvp = URTWN_VAP(vap);
2537 struct ieee80211com *ic = vap->iv_ic;
2538 struct urtwn_softc *sc = ic->ic_softc;
2539 struct ieee80211_node *ni;
2540 enum ieee80211_state ostate;
2545 ostate = vap->iv_state;
2546 URTWN_DPRINTF(sc, URTWN_DEBUG_STATE, "%s -> %s\n",
2547 ieee80211_state_name[ostate], ieee80211_state_name[nstate]);
2549 IEEE80211_UNLOCK(ic);
2551 callout_stop(&sc->sc_watchdog_ch);
2553 if (ostate == IEEE80211_S_RUN) {
2554 /* Stop calibration. */
2555 callout_stop(&sc->sc_calib_to);
2557 /* Turn link LED off. */
2558 urtwn_set_led(sc, URTWN_LED_LINK, 0);
2560 /* Set media status to 'No Link'. */
2561 urtwn_set_mode(sc, R92C_MSR_NOLINK);
2563 /* Stop Rx of data frames. */
2564 urtwn_write_2(sc, R92C_RXFLTMAP2, 0);
2566 /* Disable TSF synchronization. */
2567 urtwn_write_1(sc, R92C_BCN_CTRL,
2568 (urtwn_read_1(sc, R92C_BCN_CTRL) & ~R92C_BCN_CTRL_EN_BCN) |
2569 R92C_BCN_CTRL_DIS_TSF_UDT0);
2571 /* Disable beaconing. */
2572 urtwn_write_1(sc, R92C_MBID_NUM,
2573 urtwn_read_1(sc, R92C_MBID_NUM) & ~R92C_MBID_TXBCN_RPT0);
2576 urtwn_write_1(sc, R92C_DUAL_TSF_RST, R92C_DUAL_TSF_RST0);
2578 /* Reset EDCA parameters. */
2579 urtwn_write_4(sc, R92C_EDCA_VO_PARAM, 0x002f3217);
2580 urtwn_write_4(sc, R92C_EDCA_VI_PARAM, 0x005e4317);
2581 urtwn_write_4(sc, R92C_EDCA_BE_PARAM, 0x00105320);
2582 urtwn_write_4(sc, R92C_EDCA_BK_PARAM, 0x0000a444);
2586 case IEEE80211_S_INIT:
2587 /* Turn link LED off. */
2588 urtwn_set_led(sc, URTWN_LED_LINK, 0);
2590 case IEEE80211_S_SCAN:
2591 /* Pause AC Tx queues. */
2592 urtwn_write_1(sc, R92C_TXPAUSE,
2593 urtwn_read_1(sc, R92C_TXPAUSE) | R92C_TX_QUEUE_AC);
2595 case IEEE80211_S_AUTH:
2596 urtwn_set_chan(sc, ic->ic_curchan, NULL);
2598 case IEEE80211_S_RUN:
2599 if (vap->iv_opmode == IEEE80211_M_MONITOR) {
2600 /* Turn link LED on. */
2601 urtwn_set_led(sc, URTWN_LED_LINK, 1);
2605 ni = ieee80211_ref_node(vap->iv_bss);
2607 if (ic->ic_bsschan == IEEE80211_CHAN_ANYC ||
2608 ni->ni_chan == IEEE80211_CHAN_ANYC) {
2609 device_printf(sc->sc_dev,
2610 "%s: could not move to RUN state\n", __func__);
2615 switch (vap->iv_opmode) {
2616 case IEEE80211_M_STA:
2617 mode = R92C_MSR_INFRA;
2619 case IEEE80211_M_IBSS:
2620 mode = R92C_MSR_ADHOC;
2622 case IEEE80211_M_HOSTAP:
2626 device_printf(sc->sc_dev, "undefined opmode %d\n",
2632 /* Set media status to 'Associated'. */
2633 urtwn_set_mode(sc, mode);
2636 urtwn_write_4(sc, R92C_BSSID + 0, le32dec(&ni->ni_bssid[0]));
2637 urtwn_write_4(sc, R92C_BSSID + 4, le16dec(&ni->ni_bssid[4]));
2639 if (ic->ic_curmode == IEEE80211_MODE_11B)
2640 urtwn_write_1(sc, R92C_INIRTS_RATE_SEL, 0);
2641 else /* 802.11b/g */
2642 urtwn_write_1(sc, R92C_INIRTS_RATE_SEL, 3);
2644 /* Enable Rx of data frames. */
2645 urtwn_write_2(sc, R92C_RXFLTMAP2, 0xffff);
2647 /* Flush all AC queues. */
2648 urtwn_write_1(sc, R92C_TXPAUSE, 0);
2650 /* Set beacon interval. */
2651 urtwn_write_2(sc, R92C_BCN_INTERVAL, ni->ni_intval);
2653 /* Allow Rx from our BSSID only. */
2654 if (ic->ic_promisc == 0) {
2655 reg = urtwn_read_4(sc, R92C_RCR);
2657 if (vap->iv_opmode != IEEE80211_M_HOSTAP)
2658 reg |= R92C_RCR_CBSSID_DATA;
2659 if (vap->iv_opmode != IEEE80211_M_IBSS)
2660 reg |= R92C_RCR_CBSSID_BCN;
2662 urtwn_write_4(sc, R92C_RCR, reg);
2665 if (vap->iv_opmode == IEEE80211_M_HOSTAP ||
2666 vap->iv_opmode == IEEE80211_M_IBSS) {
2667 error = urtwn_setup_beacon(sc, ni);
2669 device_printf(sc->sc_dev,
2670 "unable to push beacon into the chip, "
2671 "error %d\n", error);
2676 /* Enable TSF synchronization. */
2677 urtwn_tsf_sync_enable(sc, vap);
2679 urtwn_write_1(sc, R92C_SIFS_CCK + 1, 10);
2680 urtwn_write_1(sc, R92C_SIFS_OFDM + 1, 10);
2681 urtwn_write_1(sc, R92C_SPEC_SIFS + 1, 10);
2682 urtwn_write_1(sc, R92C_MAC_SPEC_SIFS + 1, 10);
2683 urtwn_write_1(sc, R92C_R2T_SIFS + 1, 10);
2684 urtwn_write_1(sc, R92C_T2T_SIFS + 1, 10);
2686 /* Intialize rate adaptation. */
2687 if (!(sc->chip & URTWN_CHIP_88E))
2689 /* Turn link LED on. */
2690 urtwn_set_led(sc, URTWN_LED_LINK, 1);
2692 sc->avg_pwdb = -1; /* Reset average RSSI. */
2693 /* Reset temperature calibration state machine. */
2694 sc->sc_flags &= ~URTWN_TEMP_MEASURED;
2695 sc->thcal_lctemp = 0;
2696 /* Start periodic calibration. */
2697 callout_reset(&sc->sc_calib_to, 2*hz, urtwn_calib_to, sc);
2700 ieee80211_free_node(ni);
2708 return (error != 0 ? error : uvp->newstate(vap, nstate, arg));
2712 urtwn_calib_to(void *arg)
2714 struct urtwn_softc *sc = arg;
2716 /* Do it in a process context. */
2717 urtwn_cmd_sleepable(sc, NULL, 0, urtwn_calib_cb);
2721 urtwn_calib_cb(struct urtwn_softc *sc, union sec_param *data)
2723 /* Do temperature compensation. */
2724 urtwn_temp_calib(sc);
2726 if ((urtwn_read_1(sc, R92C_MSR) & R92C_MSR_MASK) != R92C_MSR_NOLINK)
2727 callout_reset(&sc->sc_calib_to, 2*hz, urtwn_calib_to, sc);
2731 urtwn_watchdog(void *arg)
2733 struct urtwn_softc *sc = arg;
2735 if (sc->sc_txtimer > 0) {
2736 if (--sc->sc_txtimer == 0) {
2737 device_printf(sc->sc_dev, "device timeout\n");
2738 #if defined(__DragonFly__)
2741 counter_u64_add(sc->sc_ic.ic_oerrors, 1);
2745 callout_reset(&sc->sc_watchdog_ch, hz, urtwn_watchdog, sc);
2750 urtwn_update_avgrssi(struct urtwn_softc *sc, int rate, int8_t rssi)
2754 /* Convert antenna signal to percentage. */
2755 if (rssi <= -100 || rssi >= 20)
2761 if (!(sc->chip & URTWN_CHIP_88E)) {
2762 if (rate <= URTWN_RIDX_CCK11) {
2763 /* CCK gain is smaller than OFDM/MCS gain. */
2769 else if (pwdb <= 26)
2771 else if (pwdb <= 34)
2773 else if (pwdb <= 42)
2777 if (sc->avg_pwdb == -1) /* Init. */
2778 sc->avg_pwdb = pwdb;
2779 else if (sc->avg_pwdb < pwdb)
2780 sc->avg_pwdb = ((sc->avg_pwdb * 19 + pwdb) / 20) + 1;
2782 sc->avg_pwdb = ((sc->avg_pwdb * 19 + pwdb) / 20);
2783 URTWN_DPRINTF(sc, URTWN_DEBUG_RSSI, "%s: PWDB %d, EMA %d\n", __func__,
2784 pwdb, sc->avg_pwdb);
2788 urtwn_get_rssi(struct urtwn_softc *sc, int rate, void *physt)
2790 static const int8_t cckoff[] = { 16, -12, -26, -46 };
2791 struct r92c_rx_phystat *phy;
2792 struct r92c_rx_cck *cck;
2796 if (rate <= URTWN_RIDX_CCK11) {
2797 cck = (struct r92c_rx_cck *)physt;
2798 if (sc->sc_flags & URTWN_FLAG_CCK_HIPWR) {
2799 rpt = (cck->agc_rpt >> 5) & 0x3;
2800 rssi = (cck->agc_rpt & 0x1f) << 1;
2802 rpt = (cck->agc_rpt >> 6) & 0x3;
2803 rssi = cck->agc_rpt & 0x3e;
2805 rssi = cckoff[rpt] - rssi;
2806 } else { /* OFDM/HT. */
2807 phy = (struct r92c_rx_phystat *)physt;
2808 rssi = ((le32toh(phy->phydw1) >> 1) & 0x7f) - 110;
2814 urtwn_r88e_get_rssi(struct urtwn_softc *sc, int rate, void *physt)
2816 struct r92c_rx_phystat *phy;
2817 struct r88e_rx_cck *cck;
2818 uint8_t cck_agc_rpt, lna_idx, vga_idx;
2822 if (rate <= URTWN_RIDX_CCK11) {
2823 cck = (struct r88e_rx_cck *)physt;
2824 cck_agc_rpt = cck->agc_rpt;
2825 lna_idx = (cck_agc_rpt & 0xe0) >> 5;
2826 vga_idx = cck_agc_rpt & 0x1f;
2830 rssi = -100 + 2* (27 - vga_idx);
2835 rssi = -48 + 2 * (2 - vga_idx);
2838 rssi = -42 + 2 * (7 - vga_idx);
2841 rssi = -36 + 2 * (7 - vga_idx);
2844 rssi = -24 + 2 * (7 - vga_idx);
2847 rssi = -12 + 2 * (5 - vga_idx);
2850 rssi = 8 - (2 * vga_idx);
2853 rssi = 14 - (2 * vga_idx);
2857 } else { /* OFDM/HT. */
2858 phy = (struct r92c_rx_phystat *)physt;
2859 rssi = ((le32toh(phy->phydw1) >> 1) & 0x7f) - 110;
2865 urtwn_tx_data(struct urtwn_softc *sc, struct ieee80211_node *ni,
2866 struct mbuf *m, struct urtwn_data *data)
2868 const struct ieee80211_txparam *tp;
2869 struct ieee80211com *ic = &sc->sc_ic;
2870 struct ieee80211vap *vap = ni->ni_vap;
2871 struct ieee80211_key *k = NULL;
2872 struct ieee80211_channel *chan;
2873 struct ieee80211_frame *wh;
2874 struct r92c_tx_desc *txd;
2875 uint8_t macid, raid, rate, ridx, subtype, type, tid, qsel;
2876 int hasqos, ismcast;
2878 URTWN_ASSERT_LOCKED(sc);
2883 wh = mtod(m, struct ieee80211_frame *);
2884 type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
2885 subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
2886 hasqos = IEEE80211_QOS_HAS_SEQ(wh);
2887 ismcast = IEEE80211_IS_MULTICAST(wh->i_addr1);
2889 /* Select TX ring for this frame. */
2891 tid = ((const struct ieee80211_qosframe *)wh)->i_qos[0];
2892 tid &= IEEE80211_QOS_TID;
2896 chan = (ni->ni_chan != IEEE80211_CHAN_ANYC) ?
2897 ni->ni_chan : ic->ic_curchan;
2898 tp = &vap->iv_txparms[ieee80211_chan2mode(chan)];
2900 /* Choose a TX rate index. */
2901 if (type == IEEE80211_FC0_TYPE_MGT)
2902 rate = tp->mgmtrate;
2904 rate = tp->mcastrate;
2905 else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE)
2906 rate = tp->ucastrate;
2907 else if (m->m_flags & M_EAPOL)
2908 rate = tp->mgmtrate;
2910 if (URTWN_CHIP_HAS_RATECTL(sc)) {
2911 /* XXX pass pktlen */
2912 (void) ieee80211_ratectl_rate(ni, NULL, 0);
2913 rate = ni->ni_txrate;
2915 /* XXX TODO: drop the default rate for 11b/11g? */
2916 if (ni->ni_flags & IEEE80211_NODE_HT)
2917 rate = IEEE80211_RATE_MCS | 0x4; /* MCS4 */
2918 else if (ic->ic_curmode != IEEE80211_MODE_11B)
2926 * XXX TODO: this should be per-node, for 11b versus 11bg
2927 * nodes in hostap mode
2929 ridx = rate2ridx(rate);
2930 if (ni->ni_flags & IEEE80211_NODE_HT)
2931 raid = R92C_RAID_11GN;
2932 else if (ic->ic_curmode != IEEE80211_MODE_11B)
2933 raid = R92C_RAID_11BG;
2935 raid = R92C_RAID_11B;
2937 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
2938 k = ieee80211_crypto_encap(ni, m);
2940 device_printf(sc->sc_dev,
2941 "ieee80211_crypto_encap returns NULL.\n");
2945 /* in case packet header moved, reset pointer */
2946 wh = mtod(m, struct ieee80211_frame *);
2949 /* Fill Tx descriptor. */
2950 txd = (struct r92c_tx_desc *)data->buf;
2951 memset(txd, 0, sizeof(*txd));
2953 txd->txdw0 |= htole32(
2954 SM(R92C_TXDW0_OFFSET, sizeof(*txd)) |
2955 R92C_TXDW0_OWN | R92C_TXDW0_FSG | R92C_TXDW0_LSG);
2957 txd->txdw0 |= htole32(R92C_TXDW0_BMCAST);
2960 if (sc->chip & URTWN_CHIP_88E) {
2961 struct urtwn_node *un = URTWN_NODE(ni);
2964 macid = URTWN_MACID_BSS;
2966 if (type == IEEE80211_FC0_TYPE_DATA) {
2967 qsel = tid % URTWN_MAX_TID;
2969 if (sc->chip & URTWN_CHIP_88E) {
2970 txd->txdw2 |= htole32(
2972 R88E_TXDW2_CCX_RPT);
2974 txd->txdw1 |= htole32(R92C_TXDW1_AGGBK);
2976 /* protmode, non-HT */
2977 /* XXX TODO: noack frames? */
2978 if ((rate & 0x80) == 0 &&
2979 (ic->ic_flags & IEEE80211_F_USEPROT)) {
2980 switch (ic->ic_protmode) {
2981 case IEEE80211_PROT_CTSONLY:
2982 txd->txdw4 |= htole32(
2983 R92C_TXDW4_CTS2SELF |
2984 R92C_TXDW4_HWRTSEN);
2986 case IEEE80211_PROT_RTSCTS:
2987 txd->txdw4 |= htole32(
2989 R92C_TXDW4_HWRTSEN);
2997 /* XXX TODO: noack frames? */
2998 if ((rate & 0x80) &&
2999 (ic->ic_htprotmode == IEEE80211_PROT_RTSCTS)) {
3000 txd->txdw4 |= htole32(
3002 R92C_TXDW4_HWRTSEN);
3005 /* XXX TODO: rtsrate is configurable? 24mbit may
3006 * be a bit high for RTS rate? */
3007 txd->txdw4 |= htole32(SM(R92C_TXDW4_RTSRATE,
3008 URTWN_RIDX_OFDM24));
3010 txd->txdw5 |= htole32(0x0001ff00);
3011 } else /* IEEE80211_FC0_TYPE_MGT */
3012 qsel = R92C_TXDW1_QSEL_MGNT;
3014 macid = URTWN_MACID_BC;
3015 qsel = R92C_TXDW1_QSEL_MGNT;
3018 txd->txdw1 |= htole32(
3019 SM(R92C_TXDW1_QSEL, qsel) |
3020 SM(R92C_TXDW1_RAID, raid));
3022 /* XXX TODO: 40MHZ flag? */
3023 /* XXX TODO: AMPDU flag? (AGG_ENABLE or AGG_BREAK?) Density shift? */
3024 /* XXX Short preamble? */
3027 if (sc->chip & URTWN_CHIP_88E)
3028 txd->txdw1 |= htole32(SM(R88E_TXDW1_MACID, macid));
3030 txd->txdw1 |= htole32(SM(R92C_TXDW1_MACID, macid));
3032 txd->txdw5 |= htole32(SM(R92C_TXDW5_DATARATE, ridx));
3034 /* Force this rate if needed. */
3035 if (URTWN_CHIP_HAS_RATECTL(sc) || ismcast ||
3036 (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) ||
3037 (m->m_flags & M_EAPOL) || type != IEEE80211_FC0_TYPE_DATA)
3038 txd->txdw4 |= htole32(R92C_TXDW4_DRVRATE);
3041 /* Use HW sequence numbering for non-QoS frames. */
3042 if (sc->chip & URTWN_CHIP_88E)
3043 txd->txdseq = htole16(R88E_TXDSEQ_HWSEQ_EN);
3045 txd->txdw4 |= htole32(R92C_TXDW4_HWSEQ_EN);
3047 /* Set sequence number. */
3048 txd->txdseq = htole16(M_SEQNO_GET(m) % IEEE80211_SEQ_RANGE);
3051 if (k != NULL && !(k->wk_flags & IEEE80211_KEY_SWCRYPT)) {
3054 switch (k->wk_cipher->ic_cipher) {
3055 case IEEE80211_CIPHER_WEP:
3056 case IEEE80211_CIPHER_TKIP:
3057 cipher = R92C_TXDW1_CIPHER_RC4;
3059 case IEEE80211_CIPHER_AES_CCM:
3060 cipher = R92C_TXDW1_CIPHER_AES;
3063 device_printf(sc->sc_dev, "%s: unknown cipher %d\n",
3064 __func__, k->wk_cipher->ic_cipher);
3068 txd->txdw1 |= htole32(SM(R92C_TXDW1_CIPHER, cipher));
3071 if (ieee80211_radiotap_active_vap(vap)) {
3072 struct urtwn_tx_radiotap_header *tap = &sc->sc_txtap;
3076 tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP;
3077 ieee80211_radiotap_tx(vap, m);
3082 urtwn_tx_start(sc, m, type, data);
3088 urtwn_tx_raw(struct urtwn_softc *sc, struct ieee80211_node *ni,
3089 struct mbuf *m, struct urtwn_data *data,
3090 const struct ieee80211_bpf_params *params)
3092 struct ieee80211vap *vap = ni->ni_vap;
3093 struct ieee80211_key *k = NULL;
3094 struct ieee80211_frame *wh;
3095 struct r92c_tx_desc *txd;
3096 uint8_t cipher, ridx, type;
3098 /* Encrypt the frame if need be. */
3099 cipher = R92C_TXDW1_CIPHER_NONE;
3100 if (params->ibp_flags & IEEE80211_BPF_CRYPTO) {
3101 /* Retrieve key for TX. */
3102 k = ieee80211_crypto_encap(ni, m);
3106 if (!(k->wk_flags & IEEE80211_KEY_SWCRYPT)) {
3107 switch (k->wk_cipher->ic_cipher) {
3108 case IEEE80211_CIPHER_WEP:
3109 case IEEE80211_CIPHER_TKIP:
3110 cipher = R92C_TXDW1_CIPHER_RC4;
3112 case IEEE80211_CIPHER_AES_CCM:
3113 cipher = R92C_TXDW1_CIPHER_AES;
3116 device_printf(sc->sc_dev,
3117 "%s: unknown cipher %d\n",
3118 __func__, k->wk_cipher->ic_cipher);
3124 /* XXX TODO: 11n checks, matching urtwn_tx_data() */
3126 wh = mtod(m, struct ieee80211_frame *);
3127 type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
3129 /* Fill Tx descriptor. */
3130 txd = (struct r92c_tx_desc *)data->buf;
3131 memset(txd, 0, sizeof(*txd));
3133 txd->txdw0 |= htole32(
3134 SM(R92C_TXDW0_OFFSET, sizeof(*txd)) |
3135 R92C_TXDW0_OWN | R92C_TXDW0_FSG | R92C_TXDW0_LSG);
3136 if (IEEE80211_IS_MULTICAST(wh->i_addr1))
3137 txd->txdw0 |= htole32(R92C_TXDW0_BMCAST);
3139 if (params->ibp_flags & IEEE80211_BPF_RTS)
3140 txd->txdw4 |= htole32(R92C_TXDW4_RTSEN);
3141 if (params->ibp_flags & IEEE80211_BPF_CTS)
3142 txd->txdw4 |= htole32(R92C_TXDW4_CTS2SELF);
3143 if (txd->txdw4 & htole32(R92C_TXDW4_RTSEN | R92C_TXDW4_CTS2SELF)) {
3144 txd->txdw4 |= htole32(R92C_TXDW4_HWRTSEN);
3145 txd->txdw4 |= htole32(SM(R92C_TXDW4_RTSRATE,
3146 URTWN_RIDX_OFDM24));
3149 if (sc->chip & URTWN_CHIP_88E)
3150 txd->txdw1 |= htole32(SM(R88E_TXDW1_MACID, URTWN_MACID_BC));
3152 txd->txdw1 |= htole32(SM(R92C_TXDW1_MACID, URTWN_MACID_BC));
3154 /* XXX TODO: rate index/config (RAID) for 11n? */
3155 txd->txdw1 |= htole32(SM(R92C_TXDW1_QSEL, R92C_TXDW1_QSEL_MGNT));
3156 txd->txdw1 |= htole32(SM(R92C_TXDW1_CIPHER, cipher));
3158 /* Choose a TX rate index. */
3159 ridx = rate2ridx(params->ibp_rate0);
3160 txd->txdw5 |= htole32(SM(R92C_TXDW5_DATARATE, ridx));
3161 txd->txdw5 |= htole32(0x0001ff00);
3162 txd->txdw4 |= htole32(R92C_TXDW4_DRVRATE);
3164 if (!IEEE80211_QOS_HAS_SEQ(wh)) {
3165 /* Use HW sequence numbering for non-QoS frames. */
3166 if (sc->chip & URTWN_CHIP_88E)
3167 txd->txdseq = htole16(R88E_TXDSEQ_HWSEQ_EN);
3169 txd->txdw4 |= htole32(R92C_TXDW4_HWSEQ_EN);
3171 /* Set sequence number. */
3172 txd->txdseq = htole16(M_SEQNO_GET(m) % IEEE80211_SEQ_RANGE);
3175 if (ieee80211_radiotap_active_vap(vap)) {
3176 struct urtwn_tx_radiotap_header *tap = &sc->sc_txtap;
3180 tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP;
3181 ieee80211_radiotap_tx(vap, m);
3186 urtwn_tx_start(sc, m, type, data);
3192 urtwn_tx_start(struct urtwn_softc *sc, struct mbuf *m, uint8_t type,
3193 struct urtwn_data *data)
3195 struct usb_xfer *xfer;
3196 struct r92c_tx_desc *txd;
3200 URTWN_ASSERT_LOCKED(sc);
3202 ac = M_WME_GETAC(m);
3205 case IEEE80211_FC0_TYPE_CTL:
3206 case IEEE80211_FC0_TYPE_MGT:
3207 xfer = sc->sc_xfer[URTWN_BULK_TX_VO];
3210 xfer = sc->sc_xfer[wme2queue[ac].qid];
3214 txd = (struct r92c_tx_desc *)data->buf;
3215 txd->txdw0 |= htole32(SM(R92C_TXDW0_PKTLEN, m->m_pkthdr.len));
3217 /* Compute Tx descriptor checksum. */
3219 for (i = 0; i < sizeof(*txd) / 2; i++)
3220 sum ^= ((uint16_t *)txd)[i];
3221 txd->txdsum = sum; /* NB: already little endian. */
3223 xferlen = sizeof(*txd) + m->m_pkthdr.len;
3224 m_copydata(m, 0, m->m_pkthdr.len, (caddr_t)&txd[1]);
3226 data->buflen = xferlen;
3229 STAILQ_INSERT_TAIL(&sc->sc_tx_pending, data, next);
3230 usbd_transfer_start(xfer);
3234 urtwn_transmit(struct ieee80211com *ic, struct mbuf *m)
3236 struct urtwn_softc *sc = ic->ic_softc;
3240 if ((sc->sc_flags & URTWN_RUNNING) == 0) {
3244 error = mbufq_enqueue(&sc->sc_snd, m);
3256 urtwn_start(struct urtwn_softc *sc)
3258 struct ieee80211_node *ni;
3260 struct urtwn_data *bf;
3262 URTWN_ASSERT_LOCKED(sc);
3263 while ((m = mbufq_dequeue(&sc->sc_snd)) != NULL) {
3264 bf = urtwn_getbuf(sc);
3266 mbufq_prepend(&sc->sc_snd, m);
3269 ni = (struct ieee80211_node *)m->m_pkthdr.rcvif;
3270 m->m_pkthdr.rcvif = NULL;
3272 URTWN_DPRINTF(sc, URTWN_DEBUG_XMIT, "%s: called; m=%p\n",
3276 if (urtwn_tx_data(sc, ni, m, bf) != 0) {
3277 if_inc_counter(ni->ni_vap->iv_ifp,
3278 IFCOUNTER_OERRORS, 1);
3279 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next);
3281 ieee80211_free_node(ni);
3285 callout_reset(&sc->sc_watchdog_ch, hz, urtwn_watchdog, sc);
3290 urtwn_parent(struct ieee80211com *ic)
3292 struct urtwn_softc *sc = ic->ic_softc;
3295 if (sc->sc_flags & URTWN_DETACHED) {
3301 if (ic->ic_nrunning > 0) {
3302 if (urtwn_init(sc) != 0) {
3303 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
3305 ieee80211_stop(vap);
3307 ieee80211_start_all(ic);
3313 urtwn_power_on(struct urtwn_softc *sc)
3316 return sc->sc_power_on(sc);
3320 urtwn_r92c_power_on(struct urtwn_softc *sc)
3326 /* Wait for autoload done bit. */
3327 for (ntries = 0; ntries < 1000; ntries++) {
3328 if (urtwn_read_1(sc, R92C_APS_FSMCO) & R92C_APS_FSMCO_PFM_ALDN)
3332 if (ntries == 1000) {
3333 device_printf(sc->sc_dev,
3334 "timeout waiting for chip autoload\n");
3338 /* Unlock ISO/CLK/Power control register. */
3339 error = urtwn_write_1(sc, R92C_RSV_CTRL, 0);
3340 if (error != USB_ERR_NORMAL_COMPLETION)
3342 /* Move SPS into PWM mode. */
3343 error = urtwn_write_1(sc, R92C_SPS0_CTRL, 0x2b);
3344 if (error != USB_ERR_NORMAL_COMPLETION)
3348 reg = urtwn_read_1(sc, R92C_LDOV12D_CTRL);
3349 if (!(reg & R92C_LDOV12D_CTRL_LDV12_EN)) {
3350 error = urtwn_write_1(sc, R92C_LDOV12D_CTRL,
3351 reg | R92C_LDOV12D_CTRL_LDV12_EN);
3352 if (error != USB_ERR_NORMAL_COMPLETION)
3355 error = urtwn_write_1(sc, R92C_SYS_ISO_CTRL,
3356 urtwn_read_1(sc, R92C_SYS_ISO_CTRL) &
3357 ~R92C_SYS_ISO_CTRL_MD2PP);
3358 if (error != USB_ERR_NORMAL_COMPLETION)
3362 /* Auto enable WLAN. */
3363 error = urtwn_write_2(sc, R92C_APS_FSMCO,
3364 urtwn_read_2(sc, R92C_APS_FSMCO) | R92C_APS_FSMCO_APFM_ONMAC);
3365 if (error != USB_ERR_NORMAL_COMPLETION)
3367 for (ntries = 0; ntries < 1000; ntries++) {
3368 if (!(urtwn_read_2(sc, R92C_APS_FSMCO) &
3369 R92C_APS_FSMCO_APFM_ONMAC))
3373 if (ntries == 1000) {
3374 device_printf(sc->sc_dev,
3375 "timeout waiting for MAC auto ON\n");
3379 /* Enable radio, GPIO and LED functions. */
3380 error = urtwn_write_2(sc, R92C_APS_FSMCO,
3381 R92C_APS_FSMCO_AFSM_HSUS |
3382 R92C_APS_FSMCO_PDN_EN |
3383 R92C_APS_FSMCO_PFM_ALDN);
3384 if (error != USB_ERR_NORMAL_COMPLETION)
3386 /* Release RF digital isolation. */
3387 error = urtwn_write_2(sc, R92C_SYS_ISO_CTRL,
3388 urtwn_read_2(sc, R92C_SYS_ISO_CTRL) & ~R92C_SYS_ISO_CTRL_DIOR);
3389 if (error != USB_ERR_NORMAL_COMPLETION)
3392 /* Initialize MAC. */
3393 error = urtwn_write_1(sc, R92C_APSD_CTRL,
3394 urtwn_read_1(sc, R92C_APSD_CTRL) & ~R92C_APSD_CTRL_OFF);
3395 if (error != USB_ERR_NORMAL_COMPLETION)
3397 for (ntries = 0; ntries < 200; ntries++) {
3398 if (!(urtwn_read_1(sc, R92C_APSD_CTRL) &
3399 R92C_APSD_CTRL_OFF_STATUS))
3403 if (ntries == 200) {
3404 device_printf(sc->sc_dev,
3405 "timeout waiting for MAC initialization\n");
3409 /* Enable MAC DMA/WMAC/SCHEDULE/SEC blocks. */
3410 reg = urtwn_read_2(sc, R92C_CR);
3411 reg |= R92C_CR_HCI_TXDMA_EN | R92C_CR_HCI_RXDMA_EN |
3412 R92C_CR_TXDMA_EN | R92C_CR_RXDMA_EN | R92C_CR_PROTOCOL_EN |
3413 R92C_CR_SCHEDULE_EN | R92C_CR_MACTXEN | R92C_CR_MACRXEN |
3415 error = urtwn_write_2(sc, R92C_CR, reg);
3416 if (error != USB_ERR_NORMAL_COMPLETION)
3419 error = urtwn_write_1(sc, 0xfe10, 0x19);
3420 if (error != USB_ERR_NORMAL_COMPLETION)
3426 urtwn_r88e_power_on(struct urtwn_softc *sc)
3432 /* Wait for power ready bit. */
3433 for (ntries = 0; ntries < 5000; ntries++) {
3434 if (urtwn_read_4(sc, R92C_APS_FSMCO) & R92C_APS_FSMCO_SUS_HOST)
3438 if (ntries == 5000) {
3439 device_printf(sc->sc_dev,
3440 "timeout waiting for chip power up\n");
3445 error = urtwn_write_1(sc, R92C_SYS_FUNC_EN,
3446 urtwn_read_1(sc, R92C_SYS_FUNC_EN) & ~(R92C_SYS_FUNC_EN_BBRSTB |
3447 R92C_SYS_FUNC_EN_BB_GLB_RST));
3448 if (error != USB_ERR_NORMAL_COMPLETION)
3451 error = urtwn_write_1(sc, R92C_AFE_XTAL_CTRL + 2,
3452 urtwn_read_1(sc, R92C_AFE_XTAL_CTRL + 2) | 0x80);
3453 if (error != USB_ERR_NORMAL_COMPLETION)
3456 /* Disable HWPDN. */
3457 error = urtwn_write_2(sc, R92C_APS_FSMCO,
3458 urtwn_read_2(sc, R92C_APS_FSMCO) & ~R92C_APS_FSMCO_APDM_HPDN);
3459 if (error != USB_ERR_NORMAL_COMPLETION)
3462 /* Disable WL suspend. */
3463 error = urtwn_write_2(sc, R92C_APS_FSMCO,
3464 urtwn_read_2(sc, R92C_APS_FSMCO) &
3465 ~(R92C_APS_FSMCO_AFSM_HSUS | R92C_APS_FSMCO_AFSM_PCIE));
3466 if (error != USB_ERR_NORMAL_COMPLETION)
3469 error = urtwn_write_2(sc, R92C_APS_FSMCO,
3470 urtwn_read_2(sc, R92C_APS_FSMCO) | R92C_APS_FSMCO_APFM_ONMAC);
3471 if (error != USB_ERR_NORMAL_COMPLETION)
3473 for (ntries = 0; ntries < 5000; ntries++) {
3474 if (!(urtwn_read_2(sc, R92C_APS_FSMCO) &
3475 R92C_APS_FSMCO_APFM_ONMAC))
3482 /* Enable LDO normal mode. */
3483 error = urtwn_write_1(sc, R92C_LPLDO_CTRL,
3484 urtwn_read_1(sc, R92C_LPLDO_CTRL) & ~R92C_LPLDO_CTRL_SLEEP);
3485 if (error != USB_ERR_NORMAL_COMPLETION)
3488 /* Enable MAC DMA/WMAC/SCHEDULE/SEC blocks. */
3489 error = urtwn_write_2(sc, R92C_CR, 0);
3490 if (error != USB_ERR_NORMAL_COMPLETION)
3492 reg = urtwn_read_2(sc, R92C_CR);
3493 reg |= R92C_CR_HCI_TXDMA_EN | R92C_CR_HCI_RXDMA_EN |
3494 R92C_CR_TXDMA_EN | R92C_CR_RXDMA_EN | R92C_CR_PROTOCOL_EN |
3495 R92C_CR_SCHEDULE_EN | R92C_CR_ENSEC | R92C_CR_CALTMR_EN;
3496 error = urtwn_write_2(sc, R92C_CR, reg);
3497 if (error != USB_ERR_NORMAL_COMPLETION)
3503 static __inline void
3504 urtwn_power_off(struct urtwn_softc *sc)
3507 return sc->sc_power_off(sc);
3511 urtwn_r92c_power_off(struct urtwn_softc *sc)
3515 /* Block all Tx queues. */
3516 urtwn_write_1(sc, R92C_TXPAUSE, R92C_TX_QUEUE_ALL);
3519 urtwn_rf_write(sc, 0, 0, 0);
3521 urtwn_write_1(sc, R92C_APSD_CTRL, R92C_APSD_CTRL_OFF);
3523 /* Reset BB state machine */
3524 urtwn_write_1(sc, R92C_SYS_FUNC_EN,
3525 R92C_SYS_FUNC_EN_USBD | R92C_SYS_FUNC_EN_USBA |
3526 R92C_SYS_FUNC_EN_BB_GLB_RST);
3527 urtwn_write_1(sc, R92C_SYS_FUNC_EN,
3528 R92C_SYS_FUNC_EN_USBD | R92C_SYS_FUNC_EN_USBA);
3531 * Reset digital sequence
3533 #ifndef URTWN_WITHOUT_UCODE
3534 if (urtwn_read_1(sc, R92C_MCUFWDL) & R92C_MCUFWDL_RDY) {
3535 /* Reset MCU ready status */
3536 urtwn_write_1(sc, R92C_MCUFWDL, 0);
3538 /* If firmware in ram code, do reset */
3543 /* Reset MAC and Enable 8051 */
3544 urtwn_write_1(sc, R92C_SYS_FUNC_EN + 1,
3545 (R92C_SYS_FUNC_EN_CPUEN |
3546 R92C_SYS_FUNC_EN_ELDR |
3547 R92C_SYS_FUNC_EN_HWPDN) >> 8);
3549 /* Reset MCU ready status */
3550 urtwn_write_1(sc, R92C_MCUFWDL, 0);
3552 /* Disable MAC clock */
3553 urtwn_write_2(sc, R92C_SYS_CLKR,
3554 R92C_SYS_CLKR_ANAD16V_EN |
3555 R92C_SYS_CLKR_ANA8M |
3556 R92C_SYS_CLKR_LOADER_EN |
3557 R92C_SYS_CLKR_80M_SSC_DIS |
3558 R92C_SYS_CLKR_SYS_EN |
3559 R92C_SYS_CLKR_RING_EN |
3562 /* Disable AFE PLL */
3563 urtwn_write_1(sc, R92C_AFE_PLL_CTRL, 0x80);
3565 /* Gated AFE DIG_CLOCK */
3566 urtwn_write_2(sc, R92C_AFE_XTAL_CTRL, 0x880F);
3568 /* Isolated digital to PON */
3569 urtwn_write_1(sc, R92C_SYS_ISO_CTRL,
3570 R92C_SYS_ISO_CTRL_MD2PP |
3571 R92C_SYS_ISO_CTRL_PA2PCIE |
3572 R92C_SYS_ISO_CTRL_PD2CORE |
3573 R92C_SYS_ISO_CTRL_IP2MAC |
3574 R92C_SYS_ISO_CTRL_DIOP |
3575 R92C_SYS_ISO_CTRL_DIOE);
3578 * Pull GPIO PIN to balance level and LED control
3580 /* 1. Disable GPIO[7:0] */
3581 urtwn_write_2(sc, R92C_GPIO_IOSEL, 0x0000);
3583 reg = urtwn_read_4(sc, R92C_GPIO_PIN_CTRL) & ~0x0000ff00;
3584 reg |= ((reg << 8) & 0x0000ff00) | 0x00ff0000;
3585 urtwn_write_4(sc, R92C_GPIO_PIN_CTRL, reg);
3587 /* Disable GPIO[10:8] */
3588 urtwn_write_1(sc, R92C_MAC_PINMUX_CFG, 0x00);
3590 reg = urtwn_read_2(sc, R92C_GPIO_IO_SEL) & ~0x00f0;
3591 reg |= (((reg & 0x000f) << 4) | 0x0780);
3592 urtwn_write_2(sc, R92C_GPIO_IO_SEL, reg);
3594 /* Disable LED0 & 1 */
3595 urtwn_write_2(sc, R92C_LEDCFG0, 0x8080);
3598 * Reset digital sequence
3600 /* Disable ELDR clock */
3601 urtwn_write_2(sc, R92C_SYS_CLKR,
3602 R92C_SYS_CLKR_ANAD16V_EN |
3603 R92C_SYS_CLKR_ANA8M |
3604 R92C_SYS_CLKR_LOADER_EN |
3605 R92C_SYS_CLKR_80M_SSC_DIS |
3606 R92C_SYS_CLKR_SYS_EN |
3607 R92C_SYS_CLKR_RING_EN |
3610 /* Isolated ELDR to PON */
3611 urtwn_write_1(sc, R92C_SYS_ISO_CTRL + 1,
3612 (R92C_SYS_ISO_CTRL_DIOR |
3613 R92C_SYS_ISO_CTRL_PWC_EV12V) >> 8);
3616 * Disable analog sequence
3618 /* Disable A15 power */
3619 urtwn_write_1(sc, R92C_LDOA15_CTRL, R92C_LDOA15_CTRL_OBUF);
3620 /* Disable digital core power */
3621 urtwn_write_1(sc, R92C_LDOV12D_CTRL,
3622 urtwn_read_1(sc, R92C_LDOV12D_CTRL) &
3623 ~R92C_LDOV12D_CTRL_LDV12_EN);
3625 /* Enter PFM mode */
3626 urtwn_write_1(sc, R92C_SPS0_CTRL, 0x23);
3628 /* Set USB suspend */
3629 urtwn_write_2(sc, R92C_APS_FSMCO,
3630 R92C_APS_FSMCO_APDM_HOST |
3631 R92C_APS_FSMCO_AFSM_HSUS |
3632 R92C_APS_FSMCO_PFM_ALDN);
3634 /* Lock ISO/CLK/Power control register. */
3635 urtwn_write_1(sc, R92C_RSV_CTRL, 0x0E);
3639 urtwn_r88e_power_off(struct urtwn_softc *sc)
3644 /* Disable any kind of TX reports. */
3645 urtwn_write_1(sc, R88E_TX_RPT_CTRL,
3646 urtwn_read_1(sc, R88E_TX_RPT_CTRL) &
3647 ~(R88E_TX_RPT1_ENA | R88E_TX_RPT2_ENA));
3650 urtwn_write_1(sc, R92C_CR, 0);
3652 /* Move card to Low Power State. */
3653 /* Block all Tx queues. */
3654 urtwn_write_1(sc, R92C_TXPAUSE, R92C_TX_QUEUE_ALL);
3656 for (ntries = 0; ntries < 20; ntries++) {
3657 /* Should be zero if no packet is transmitting. */
3658 if (urtwn_read_4(sc, R88E_SCH_TXCMD) == 0)
3664 device_printf(sc->sc_dev, "%s: failed to block Tx queues\n",
3669 /* CCK and OFDM are disabled, and clock are gated. */
3670 urtwn_write_1(sc, R92C_SYS_FUNC_EN,
3671 urtwn_read_1(sc, R92C_SYS_FUNC_EN) & ~R92C_SYS_FUNC_EN_BBRSTB);
3676 urtwn_write_1(sc, R92C_CR,
3677 R92C_CR_HCI_TXDMA_EN | R92C_CR_HCI_RXDMA_EN |
3678 R92C_CR_TXDMA_EN | R92C_CR_RXDMA_EN |
3679 R92C_CR_PROTOCOL_EN | R92C_CR_SCHEDULE_EN);
3681 /* check if removed later */
3682 urtwn_write_1(sc, R92C_CR + 1,
3683 urtwn_read_1(sc, R92C_CR + 1) & ~(R92C_CR_ENSEC >> 8));
3685 /* Respond TxOK to scheduler */
3686 urtwn_write_1(sc, R92C_DUAL_TSF_RST,
3687 urtwn_read_1(sc, R92C_DUAL_TSF_RST) | 0x20);
3689 /* If firmware in ram code, do reset. */
3690 #ifndef URTWN_WITHOUT_UCODE
3691 if (urtwn_read_1(sc, R92C_MCUFWDL) & R92C_MCUFWDL_RDY)
3692 urtwn_r88e_fw_reset(sc);
3695 /* Reset MCU ready status. */
3696 urtwn_write_1(sc, R92C_MCUFWDL, 0x00);
3699 urtwn_write_1(sc, R88E_32K_CTRL,
3700 urtwn_read_1(sc, R88E_32K_CTRL) & ~0x01);
3702 /* Move card to Disabled state. */
3704 urtwn_write_1(sc, R92C_RF_CTRL, 0);
3706 /* LDO Sleep mode. */
3707 urtwn_write_1(sc, R92C_LPLDO_CTRL,
3708 urtwn_read_1(sc, R92C_LPLDO_CTRL) | R92C_LPLDO_CTRL_SLEEP);
3710 /* Turn off MAC by HW state machine */
3711 urtwn_write_1(sc, R92C_APS_FSMCO + 1,
3712 urtwn_read_1(sc, R92C_APS_FSMCO + 1) |
3713 (R92C_APS_FSMCO_APFM_OFF >> 8));
3715 for (ntries = 0; ntries < 20; ntries++) {
3716 /* Wait until it will be disabled. */
3717 if ((urtwn_read_1(sc, R92C_APS_FSMCO + 1) &
3718 (R92C_APS_FSMCO_APFM_OFF >> 8)) == 0)
3724 device_printf(sc->sc_dev, "%s: could not turn off MAC\n",
3729 /* schmit trigger */
3730 urtwn_write_1(sc, R92C_AFE_XTAL_CTRL + 2,
3731 urtwn_read_1(sc, R92C_AFE_XTAL_CTRL + 2) | 0x80);
3733 /* Enable WL suspend. */
3734 urtwn_write_1(sc, R92C_APS_FSMCO + 1,
3735 (urtwn_read_1(sc, R92C_APS_FSMCO + 1) & ~0x10) | 0x08);
3737 /* Enable bandgap mbias in suspend. */
3738 urtwn_write_1(sc, R92C_APS_FSMCO + 3, 0);
3740 /* Clear SIC_EN register. */
3741 urtwn_write_1(sc, R92C_GPIO_MUXCFG + 1,
3742 urtwn_read_1(sc, R92C_GPIO_MUXCFG + 1) & ~0x10);
3744 /* Set USB suspend enable local register */
3745 urtwn_write_1(sc, R92C_USB_SUSPEND,
3746 urtwn_read_1(sc, R92C_USB_SUSPEND) | 0x10);
3748 /* Reset MCU IO Wrapper. */
3749 reg = urtwn_read_1(sc, R92C_RSV_CTRL + 1);
3750 urtwn_write_1(sc, R92C_RSV_CTRL + 1, reg & ~0x08);
3751 urtwn_write_1(sc, R92C_RSV_CTRL + 1, reg | 0x08);
3753 /* marked as 'For Power Consumption' code. */
3754 urtwn_write_1(sc, R92C_GPIO_OUT, urtwn_read_1(sc, R92C_GPIO_IN));
3755 urtwn_write_1(sc, R92C_GPIO_IOSEL, 0xff);
3757 urtwn_write_1(sc, R92C_GPIO_IO_SEL,
3758 urtwn_read_1(sc, R92C_GPIO_IO_SEL) << 4);
3759 urtwn_write_1(sc, R92C_GPIO_MOD,
3760 urtwn_read_1(sc, R92C_GPIO_MOD) | 0x0f);
3762 /* Set LNA, TRSW, EX_PA Pin to output mode. */
3763 urtwn_write_4(sc, R88E_BB_PAD_CTRL, 0x00080808);
3767 urtwn_llt_init(struct urtwn_softc *sc)
3769 int i, error, page_count, pktbuf_count;
3771 page_count = (sc->chip & URTWN_CHIP_88E) ?
3772 R88E_TX_PAGE_COUNT : R92C_TX_PAGE_COUNT;
3773 pktbuf_count = (sc->chip & URTWN_CHIP_88E) ?
3774 R88E_TXPKTBUF_COUNT : R92C_TXPKTBUF_COUNT;
3776 /* Reserve pages [0; page_count]. */
3777 for (i = 0; i < page_count; i++) {
3778 if ((error = urtwn_llt_write(sc, i, i + 1)) != 0)
3781 /* NB: 0xff indicates end-of-list. */
3782 if ((error = urtwn_llt_write(sc, i, 0xff)) != 0)
3785 * Use pages [page_count + 1; pktbuf_count - 1]
3788 for (++i; i < pktbuf_count - 1; i++) {
3789 if ((error = urtwn_llt_write(sc, i, i + 1)) != 0)
3792 /* Make the last page point to the beginning of the ring buffer. */
3793 error = urtwn_llt_write(sc, i, page_count + 1);
3797 #ifndef URTWN_WITHOUT_UCODE
3799 urtwn_fw_reset(struct urtwn_softc *sc)
3804 /* Tell 8051 to reset itself. */
3805 urtwn_write_1(sc, R92C_HMETFR + 3, 0x20);
3807 /* Wait until 8051 resets by itself. */
3808 for (ntries = 0; ntries < 100; ntries++) {
3809 reg = urtwn_read_2(sc, R92C_SYS_FUNC_EN);
3810 if (!(reg & R92C_SYS_FUNC_EN_CPUEN))
3814 /* Force 8051 reset. */
3815 urtwn_write_2(sc, R92C_SYS_FUNC_EN, reg & ~R92C_SYS_FUNC_EN_CPUEN);
3819 urtwn_r88e_fw_reset(struct urtwn_softc *sc)
3823 reg = urtwn_read_2(sc, R92C_SYS_FUNC_EN);
3824 urtwn_write_2(sc, R92C_SYS_FUNC_EN, reg & ~R92C_SYS_FUNC_EN_CPUEN);
3825 urtwn_write_2(sc, R92C_SYS_FUNC_EN, reg | R92C_SYS_FUNC_EN_CPUEN);
3829 urtwn_fw_loadpage(struct urtwn_softc *sc, int page, const uint8_t *buf, int len)
3832 usb_error_t error = USB_ERR_NORMAL_COMPLETION;
3835 reg = urtwn_read_4(sc, R92C_MCUFWDL);
3836 reg = RW(reg, R92C_MCUFWDL_PAGE, page);
3837 urtwn_write_4(sc, R92C_MCUFWDL, reg);
3839 off = R92C_FW_START_ADDR;
3847 /* XXX fix this deconst */
3848 error = urtwn_write_region_1(sc, off,
3849 __DECONST(uint8_t *, buf), mlen);
3850 if (error != USB_ERR_NORMAL_COMPLETION)
3860 urtwn_load_firmware(struct urtwn_softc *sc)
3862 const struct firmware *fw;
3863 const struct r92c_fw_hdr *hdr;
3864 const char *imagename;
3868 int mlen, ntries, page, error;
3871 /* Read firmware image from the filesystem. */
3872 if (sc->chip & URTWN_CHIP_88E)
3873 imagename = "urtwn-rtl8188eufw";
3874 else if ((sc->chip & (URTWN_CHIP_UMC_A_CUT | URTWN_CHIP_92C)) ==
3875 URTWN_CHIP_UMC_A_CUT)
3876 imagename = "urtwn-rtl8192cfwU";
3878 imagename = "urtwn-rtl8192cfwT";
3880 fw = firmware_get(imagename);
3883 device_printf(sc->sc_dev,
3884 "failed loadfirmware of file %s\n", imagename);
3890 if (len < sizeof(*hdr)) {
3891 device_printf(sc->sc_dev, "firmware too short\n");
3896 hdr = (const struct r92c_fw_hdr *)ptr;
3897 /* Check if there is a valid FW header and skip it. */
3898 if ((le16toh(hdr->signature) >> 4) == 0x88c ||
3899 (le16toh(hdr->signature) >> 4) == 0x88e ||
3900 (le16toh(hdr->signature) >> 4) == 0x92c) {
3901 URTWN_DPRINTF(sc, URTWN_DEBUG_FIRMWARE,
3902 "FW V%d.%d %02d-%02d %02d:%02d\n",
3903 le16toh(hdr->version), le16toh(hdr->subversion),
3904 hdr->month, hdr->date, hdr->hour, hdr->minute);
3905 ptr += sizeof(*hdr);
3906 len -= sizeof(*hdr);
3909 if (urtwn_read_1(sc, R92C_MCUFWDL) & R92C_MCUFWDL_RAM_DL_SEL) {
3910 if (sc->chip & URTWN_CHIP_88E)
3911 urtwn_r88e_fw_reset(sc);
3914 urtwn_write_1(sc, R92C_MCUFWDL, 0);
3917 if (!(sc->chip & URTWN_CHIP_88E)) {
3918 urtwn_write_2(sc, R92C_SYS_FUNC_EN,
3919 urtwn_read_2(sc, R92C_SYS_FUNC_EN) |
3920 R92C_SYS_FUNC_EN_CPUEN);
3922 urtwn_write_1(sc, R92C_MCUFWDL,
3923 urtwn_read_1(sc, R92C_MCUFWDL) | R92C_MCUFWDL_EN);
3924 urtwn_write_1(sc, R92C_MCUFWDL + 2,
3925 urtwn_read_1(sc, R92C_MCUFWDL + 2) & ~0x08);
3927 /* Reset the FWDL checksum. */
3928 urtwn_write_1(sc, R92C_MCUFWDL,
3929 urtwn_read_1(sc, R92C_MCUFWDL) | R92C_MCUFWDL_CHKSUM_RPT);
3931 for (page = 0; len > 0; page++) {
3932 mlen = min(len, R92C_FW_PAGE_SIZE);
3933 error = urtwn_fw_loadpage(sc, page, ptr, mlen);
3935 device_printf(sc->sc_dev,
3936 "could not load firmware page\n");
3942 urtwn_write_1(sc, R92C_MCUFWDL,
3943 urtwn_read_1(sc, R92C_MCUFWDL) & ~R92C_MCUFWDL_EN);
3944 urtwn_write_1(sc, R92C_MCUFWDL + 1, 0);
3946 /* Wait for checksum report. */
3947 for (ntries = 0; ntries < 1000; ntries++) {
3948 if (urtwn_read_4(sc, R92C_MCUFWDL) & R92C_MCUFWDL_CHKSUM_RPT)
3952 if (ntries == 1000) {
3953 device_printf(sc->sc_dev,
3954 "timeout waiting for checksum report\n");
3959 reg = urtwn_read_4(sc, R92C_MCUFWDL);
3960 reg = (reg & ~R92C_MCUFWDL_WINTINI_RDY) | R92C_MCUFWDL_RDY;
3961 urtwn_write_4(sc, R92C_MCUFWDL, reg);
3962 if (sc->chip & URTWN_CHIP_88E)
3963 urtwn_r88e_fw_reset(sc);
3964 /* Wait for firmware readiness. */
3965 for (ntries = 0; ntries < 1000; ntries++) {
3966 if (urtwn_read_4(sc, R92C_MCUFWDL) & R92C_MCUFWDL_WINTINI_RDY)
3970 if (ntries == 1000) {
3971 device_printf(sc->sc_dev,
3972 "timeout waiting for firmware readiness\n");
3977 firmware_put(fw, FIRMWARE_UNLOAD);
3983 urtwn_dma_init(struct urtwn_softc *sc)
3985 struct usb_endpoint *ep, *ep_end;
3986 usb_error_t usb_err;
3988 int hashq, hasnq, haslq, nqueues, ntx;
3989 int error, pagecount, npubqpages, nqpages, nrempages, tx_boundary;
3991 /* Initialize LLT table. */
3992 error = urtwn_llt_init(sc);
3996 /* Determine the number of bulk-out pipes. */
3998 ep = sc->sc_udev->endpoints;
3999 ep_end = sc->sc_udev->endpoints + sc->sc_udev->endpoints_max;
4000 for (; ep != ep_end; ep++) {
4001 if ((ep->edesc == NULL) ||
4002 (ep->iface_index != sc->sc_iface_index))
4004 if (UE_GET_DIR(ep->edesc->bEndpointAddress) == UE_DIR_OUT)
4008 device_printf(sc->sc_dev,
4009 "%d: invalid number of Tx bulk pipes\n", ntx);
4013 /* Get Tx queues to USB endpoints mapping. */
4014 hashq = hasnq = haslq = nqueues = 0;
4016 case 1: hashq = 1; break;
4017 case 2: hashq = hasnq = 1; break;
4018 case 3: case 4: hashq = hasnq = haslq = 1; break;
4020 nqueues = hashq + hasnq + haslq;
4024 npubqpages = nqpages = nrempages = pagecount = 0;
4025 if (sc->chip & URTWN_CHIP_88E)
4026 tx_boundary = R88E_TX_PAGE_BOUNDARY;
4028 pagecount = R92C_TX_PAGE_COUNT;
4029 npubqpages = R92C_PUBQ_NPAGES;
4030 tx_boundary = R92C_TX_PAGE_BOUNDARY;
4033 /* Set number of pages for normal priority queue. */
4034 if (sc->chip & URTWN_CHIP_88E) {
4035 usb_err = urtwn_write_2(sc, R92C_RQPN_NPQ, 0xd);
4036 if (usb_err != USB_ERR_NORMAL_COMPLETION)
4038 usb_err = urtwn_write_4(sc, R92C_RQPN, 0x808e000d);
4039 if (usb_err != USB_ERR_NORMAL_COMPLETION)
4042 /* Get the number of pages for each queue. */
4043 nqpages = (pagecount - npubqpages) / nqueues;
4045 * The remaining pages are assigned to the high priority
4048 nrempages = (pagecount - npubqpages) % nqueues;
4049 usb_err = urtwn_write_1(sc, R92C_RQPN_NPQ, hasnq ? nqpages : 0);
4050 if (usb_err != USB_ERR_NORMAL_COMPLETION)
4052 usb_err = urtwn_write_4(sc, R92C_RQPN,
4053 /* Set number of pages for public queue. */
4054 SM(R92C_RQPN_PUBQ, npubqpages) |
4055 /* Set number of pages for high priority queue. */
4056 SM(R92C_RQPN_HPQ, hashq ? nqpages + nrempages : 0) |
4057 /* Set number of pages for low priority queue. */
4058 SM(R92C_RQPN_LPQ, haslq ? nqpages : 0) |
4061 if (usb_err != USB_ERR_NORMAL_COMPLETION)
4065 usb_err = urtwn_write_1(sc, R92C_TXPKTBUF_BCNQ_BDNY, tx_boundary);
4066 if (usb_err != USB_ERR_NORMAL_COMPLETION)
4068 usb_err = urtwn_write_1(sc, R92C_TXPKTBUF_MGQ_BDNY, tx_boundary);
4069 if (usb_err != USB_ERR_NORMAL_COMPLETION)
4071 usb_err = urtwn_write_1(sc, R92C_TXPKTBUF_WMAC_LBK_BF_HD, tx_boundary);
4072 if (usb_err != USB_ERR_NORMAL_COMPLETION)
4074 usb_err = urtwn_write_1(sc, R92C_TRXFF_BNDY, tx_boundary);
4075 if (usb_err != USB_ERR_NORMAL_COMPLETION)
4077 usb_err = urtwn_write_1(sc, R92C_TDECTRL + 1, tx_boundary);
4078 if (usb_err != USB_ERR_NORMAL_COMPLETION)
4081 /* Set queue to USB pipe mapping. */
4082 reg = urtwn_read_2(sc, R92C_TRXDMA_CTRL);
4083 reg &= ~R92C_TRXDMA_CTRL_QMAP_M;
4086 reg |= R92C_TRXDMA_CTRL_QMAP_HQ;
4088 reg |= R92C_TRXDMA_CTRL_QMAP_NQ;
4090 reg |= R92C_TRXDMA_CTRL_QMAP_LQ;
4091 } else if (nqueues == 2) {
4093 * All 2-endpoints configs have high and normal
4096 reg |= R92C_TRXDMA_CTRL_QMAP_HQ_NQ;
4098 reg |= R92C_TRXDMA_CTRL_QMAP_3EP;
4099 usb_err = urtwn_write_2(sc, R92C_TRXDMA_CTRL, reg);
4100 if (usb_err != USB_ERR_NORMAL_COMPLETION)
4103 /* Set Tx/Rx transfer page boundary. */
4104 usb_err = urtwn_write_2(sc, R92C_TRXFF_BNDY + 2,
4105 (sc->chip & URTWN_CHIP_88E) ? 0x23ff : 0x27ff);
4106 if (usb_err != USB_ERR_NORMAL_COMPLETION)
4109 /* Set Tx/Rx transfer page size. */
4110 usb_err = urtwn_write_1(sc, R92C_PBP,
4111 SM(R92C_PBP_PSRX, R92C_PBP_128) |
4112 SM(R92C_PBP_PSTX, R92C_PBP_128));
4113 if (usb_err != USB_ERR_NORMAL_COMPLETION)
4120 urtwn_mac_init(struct urtwn_softc *sc)
4125 /* Write MAC initialization values. */
4126 if (sc->chip & URTWN_CHIP_88E) {
4127 for (i = 0; i < nitems(rtl8188eu_mac); i++) {
4128 error = urtwn_write_1(sc, rtl8188eu_mac[i].reg,
4129 rtl8188eu_mac[i].val);
4130 if (error != USB_ERR_NORMAL_COMPLETION)
4133 urtwn_write_1(sc, R92C_MAX_AGGR_NUM, 0x07);
4135 for (i = 0; i < nitems(rtl8192cu_mac); i++)
4136 error = urtwn_write_1(sc, rtl8192cu_mac[i].reg,
4137 rtl8192cu_mac[i].val);
4138 if (error != USB_ERR_NORMAL_COMPLETION)
4146 urtwn_bb_init(struct urtwn_softc *sc)
4148 const struct urtwn_bb_prog *prog;
4153 /* Enable BB and RF. */
4154 urtwn_write_2(sc, R92C_SYS_FUNC_EN,
4155 urtwn_read_2(sc, R92C_SYS_FUNC_EN) |
4156 R92C_SYS_FUNC_EN_BBRSTB | R92C_SYS_FUNC_EN_BB_GLB_RST |
4157 R92C_SYS_FUNC_EN_DIO_RF);
4159 if (!(sc->chip & URTWN_CHIP_88E))
4160 urtwn_write_2(sc, R92C_AFE_PLL_CTRL, 0xdb83);
4162 urtwn_write_1(sc, R92C_RF_CTRL,
4163 R92C_RF_CTRL_EN | R92C_RF_CTRL_RSTB | R92C_RF_CTRL_SDMRSTB);
4164 urtwn_write_1(sc, R92C_SYS_FUNC_EN,
4165 R92C_SYS_FUNC_EN_USBA | R92C_SYS_FUNC_EN_USBD |
4166 R92C_SYS_FUNC_EN_BB_GLB_RST | R92C_SYS_FUNC_EN_BBRSTB);
4168 if (!(sc->chip & URTWN_CHIP_88E)) {
4169 urtwn_write_1(sc, R92C_LDOHCI12_CTRL, 0x0f);
4170 urtwn_write_1(sc, 0x15, 0xe9);
4171 urtwn_write_1(sc, R92C_AFE_XTAL_CTRL + 1, 0x80);
4174 /* Select BB programming based on board type. */
4175 if (sc->chip & URTWN_CHIP_88E)
4176 prog = &rtl8188eu_bb_prog;
4177 else if (!(sc->chip & URTWN_CHIP_92C)) {
4178 if (sc->board_type == R92C_BOARD_TYPE_MINICARD)
4179 prog = &rtl8188ce_bb_prog;
4180 else if (sc->board_type == R92C_BOARD_TYPE_HIGHPA)
4181 prog = &rtl8188ru_bb_prog;
4183 prog = &rtl8188cu_bb_prog;
4185 if (sc->board_type == R92C_BOARD_TYPE_MINICARD)
4186 prog = &rtl8192ce_bb_prog;
4188 prog = &rtl8192cu_bb_prog;
4190 /* Write BB initialization values. */
4191 for (i = 0; i < prog->count; i++) {
4192 urtwn_bb_write(sc, prog->regs[i], prog->vals[i]);
4196 if (sc->chip & URTWN_CHIP_92C_1T2R) {
4197 /* 8192C 1T only configuration. */
4198 reg = urtwn_bb_read(sc, R92C_FPGA0_TXINFO);
4199 reg = (reg & ~0x00000003) | 0x2;
4200 urtwn_bb_write(sc, R92C_FPGA0_TXINFO, reg);
4202 reg = urtwn_bb_read(sc, R92C_FPGA1_TXINFO);
4203 reg = (reg & ~0x00300033) | 0x00200022;
4204 urtwn_bb_write(sc, R92C_FPGA1_TXINFO, reg);
4206 reg = urtwn_bb_read(sc, R92C_CCK0_AFESETTING);
4207 reg = (reg & ~0xff000000) | 0x45 << 24;
4208 urtwn_bb_write(sc, R92C_CCK0_AFESETTING, reg);
4210 reg = urtwn_bb_read(sc, R92C_OFDM0_TRXPATHENA);
4211 reg = (reg & ~0x000000ff) | 0x23;
4212 urtwn_bb_write(sc, R92C_OFDM0_TRXPATHENA, reg);
4214 reg = urtwn_bb_read(sc, R92C_OFDM0_AGCPARAM1);
4215 reg = (reg & ~0x00000030) | 1 << 4;
4216 urtwn_bb_write(sc, R92C_OFDM0_AGCPARAM1, reg);
4218 reg = urtwn_bb_read(sc, 0xe74);
4219 reg = (reg & ~0x0c000000) | 2 << 26;
4220 urtwn_bb_write(sc, 0xe74, reg);
4221 reg = urtwn_bb_read(sc, 0xe78);
4222 reg = (reg & ~0x0c000000) | 2 << 26;
4223 urtwn_bb_write(sc, 0xe78, reg);
4224 reg = urtwn_bb_read(sc, 0xe7c);
4225 reg = (reg & ~0x0c000000) | 2 << 26;
4226 urtwn_bb_write(sc, 0xe7c, reg);
4227 reg = urtwn_bb_read(sc, 0xe80);
4228 reg = (reg & ~0x0c000000) | 2 << 26;
4229 urtwn_bb_write(sc, 0xe80, reg);
4230 reg = urtwn_bb_read(sc, 0xe88);
4231 reg = (reg & ~0x0c000000) | 2 << 26;
4232 urtwn_bb_write(sc, 0xe88, reg);
4235 /* Write AGC values. */
4236 for (i = 0; i < prog->agccount; i++) {
4237 urtwn_bb_write(sc, R92C_OFDM0_AGCRSSITABLE,
4242 if (sc->chip & URTWN_CHIP_88E) {
4243 urtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(0), 0x69553422);
4245 urtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(0), 0x69553420);
4248 crystalcap = sc->rom.r88e_rom.crystalcap;
4249 if (crystalcap == 0xff)
4252 reg = urtwn_bb_read(sc, R92C_AFE_XTAL_CTRL);
4253 urtwn_bb_write(sc, R92C_AFE_XTAL_CTRL,
4254 RW(reg, R92C_AFE_XTAL_CTRL_ADDR,
4255 crystalcap | crystalcap << 6));
4257 if (urtwn_bb_read(sc, R92C_HSSI_PARAM2(0)) &
4258 R92C_HSSI_PARAM2_CCK_HIPWR)
4259 sc->sc_flags |= URTWN_FLAG_CCK_HIPWR;
4264 urtwn_rf_init(struct urtwn_softc *sc)
4266 const struct urtwn_rf_prog *prog;
4270 /* Select RF programming based on board type. */
4271 if (sc->chip & URTWN_CHIP_88E)
4272 prog = rtl8188eu_rf_prog;
4273 else if (!(sc->chip & URTWN_CHIP_92C)) {
4274 if (sc->board_type == R92C_BOARD_TYPE_MINICARD)
4275 prog = rtl8188ce_rf_prog;
4276 else if (sc->board_type == R92C_BOARD_TYPE_HIGHPA)
4277 prog = rtl8188ru_rf_prog;
4279 prog = rtl8188cu_rf_prog;
4281 prog = rtl8192ce_rf_prog;
4283 for (i = 0; i < sc->nrxchains; i++) {
4284 /* Save RF_ENV control type. */
4287 reg = urtwn_bb_read(sc, R92C_FPGA0_RFIFACESW(idx));
4288 type = (reg >> off) & 0x10;
4290 /* Set RF_ENV enable. */
4291 reg = urtwn_bb_read(sc, R92C_FPGA0_RFIFACEOE(i));
4293 urtwn_bb_write(sc, R92C_FPGA0_RFIFACEOE(i), reg);
4295 /* Set RF_ENV output high. */
4296 reg = urtwn_bb_read(sc, R92C_FPGA0_RFIFACEOE(i));
4298 urtwn_bb_write(sc, R92C_FPGA0_RFIFACEOE(i), reg);
4300 /* Set address and data lengths of RF registers. */
4301 reg = urtwn_bb_read(sc, R92C_HSSI_PARAM2(i));
4302 reg &= ~R92C_HSSI_PARAM2_ADDR_LENGTH;
4303 urtwn_bb_write(sc, R92C_HSSI_PARAM2(i), reg);
4305 reg = urtwn_bb_read(sc, R92C_HSSI_PARAM2(i));
4306 reg &= ~R92C_HSSI_PARAM2_DATA_LENGTH;
4307 urtwn_bb_write(sc, R92C_HSSI_PARAM2(i), reg);
4310 /* Write RF initialization values for this chain. */
4311 for (j = 0; j < prog[i].count; j++) {
4312 if (prog[i].regs[j] >= 0xf9 &&
4313 prog[i].regs[j] <= 0xfe) {
4315 * These are fake RF registers offsets that
4316 * indicate a delay is required.
4318 usb_pause_mtx(&sc->sc_mtx, hz / 20); /* 50ms */
4321 urtwn_rf_write(sc, i, prog[i].regs[j],
4326 /* Restore RF_ENV control type. */
4327 reg = urtwn_bb_read(sc, R92C_FPGA0_RFIFACESW(idx));
4328 reg &= ~(0x10 << off) | (type << off);
4329 urtwn_bb_write(sc, R92C_FPGA0_RFIFACESW(idx), reg);
4331 /* Cache RF register CHNLBW. */
4332 sc->rf_chnlbw[i] = urtwn_rf_read(sc, i, R92C_RF_CHNLBW);
4335 if ((sc->chip & (URTWN_CHIP_UMC_A_CUT | URTWN_CHIP_92C)) ==
4336 URTWN_CHIP_UMC_A_CUT) {
4337 urtwn_rf_write(sc, 0, R92C_RF_RX_G1, 0x30255);
4338 urtwn_rf_write(sc, 0, R92C_RF_RX_G2, 0x50a00);
4343 urtwn_cam_init(struct urtwn_softc *sc)
4345 /* Invalidate all CAM entries. */
4346 urtwn_write_4(sc, R92C_CAMCMD,
4347 R92C_CAMCMD_POLLING | R92C_CAMCMD_CLR);
4351 urtwn_cam_write(struct urtwn_softc *sc, uint32_t addr, uint32_t data)
4355 error = urtwn_write_4(sc, R92C_CAMWRITE, data);
4356 if (error != USB_ERR_NORMAL_COMPLETION)
4358 error = urtwn_write_4(sc, R92C_CAMCMD,
4359 R92C_CAMCMD_POLLING | R92C_CAMCMD_WRITE |
4360 SM(R92C_CAMCMD_ADDR, addr));
4361 if (error != USB_ERR_NORMAL_COMPLETION)
4368 urtwn_pa_bias_init(struct urtwn_softc *sc)
4373 for (i = 0; i < sc->nrxchains; i++) {
4374 if (sc->pa_setting & (1 << i))
4376 urtwn_rf_write(sc, i, R92C_RF_IPA, 0x0f406);
4377 urtwn_rf_write(sc, i, R92C_RF_IPA, 0x4f406);
4378 urtwn_rf_write(sc, i, R92C_RF_IPA, 0x8f406);
4379 urtwn_rf_write(sc, i, R92C_RF_IPA, 0xcf406);
4381 if (!(sc->pa_setting & 0x10)) {
4382 reg = urtwn_read_1(sc, 0x16);
4383 reg = (reg & ~0xf0) | 0x90;
4384 urtwn_write_1(sc, 0x16, reg);
4389 urtwn_rxfilter_init(struct urtwn_softc *sc)
4391 struct ieee80211com *ic = &sc->sc_ic;
4392 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
4396 URTWN_ASSERT_LOCKED(sc);
4398 /* Setup multicast filter. */
4399 urtwn_set_multi(sc);
4401 /* Filter for management frames. */
4403 switch (vap->iv_opmode) {
4404 case IEEE80211_M_STA:
4406 R92C_RXFLTMAP_SUBTYPE(IEEE80211_FC0_SUBTYPE_ASSOC_REQ) |
4407 R92C_RXFLTMAP_SUBTYPE(IEEE80211_FC0_SUBTYPE_REASSOC_REQ) |
4408 R92C_RXFLTMAP_SUBTYPE(IEEE80211_FC0_SUBTYPE_PROBE_REQ));
4410 case IEEE80211_M_HOSTAP:
4412 R92C_RXFLTMAP_SUBTYPE(IEEE80211_FC0_SUBTYPE_ASSOC_RESP) |
4413 R92C_RXFLTMAP_SUBTYPE(IEEE80211_FC0_SUBTYPE_REASSOC_RESP));
4415 case IEEE80211_M_MONITOR:
4416 case IEEE80211_M_IBSS:
4419 device_printf(sc->sc_dev, "%s: undefined opmode %d\n",
4420 __func__, vap->iv_opmode);
4423 urtwn_write_2(sc, R92C_RXFLTMAP0, filter);
4425 /* Reject all control frames. */
4426 urtwn_write_2(sc, R92C_RXFLTMAP1, 0x0000);
4428 /* Reject all data frames. */
4429 urtwn_write_2(sc, R92C_RXFLTMAP2, 0x0000);
4431 rcr = R92C_RCR_AM | R92C_RCR_AB | R92C_RCR_APM |
4432 R92C_RCR_HTC_LOC_CTRL | R92C_RCR_APP_PHYSTS |
4433 R92C_RCR_APP_ICV | R92C_RCR_APP_MIC;
4435 if (vap->iv_opmode == IEEE80211_M_MONITOR) {
4436 /* Accept all frames. */
4437 rcr |= R92C_RCR_ACF | R92C_RCR_ADF | R92C_RCR_AMF |
4441 /* Set Rx filter. */
4442 urtwn_write_4(sc, R92C_RCR, rcr);
4444 if (ic->ic_promisc != 0) {
4445 /* Update Rx filter. */
4446 urtwn_set_promisc(sc);
4451 urtwn_edca_init(struct urtwn_softc *sc)
4453 urtwn_write_2(sc, R92C_SPEC_SIFS, 0x100a);
4454 urtwn_write_2(sc, R92C_MAC_SPEC_SIFS, 0x100a);
4455 urtwn_write_2(sc, R92C_SIFS_CCK, 0x100a);
4456 urtwn_write_2(sc, R92C_SIFS_OFDM, 0x100a);
4457 urtwn_write_4(sc, R92C_EDCA_BE_PARAM, 0x005ea42b);
4458 urtwn_write_4(sc, R92C_EDCA_BK_PARAM, 0x0000a44f);
4459 urtwn_write_4(sc, R92C_EDCA_VI_PARAM, 0x005ea324);
4460 urtwn_write_4(sc, R92C_EDCA_VO_PARAM, 0x002fa226);
4464 urtwn_write_txpower(struct urtwn_softc *sc, int chain,
4465 uint16_t power[URTWN_RIDX_COUNT])
4469 /* Write per-CCK rate Tx power. */
4471 reg = urtwn_bb_read(sc, R92C_TXAGC_A_CCK1_MCS32);
4472 reg = RW(reg, R92C_TXAGC_A_CCK1, power[0]);
4473 urtwn_bb_write(sc, R92C_TXAGC_A_CCK1_MCS32, reg);
4474 reg = urtwn_bb_read(sc, R92C_TXAGC_B_CCK11_A_CCK2_11);
4475 reg = RW(reg, R92C_TXAGC_A_CCK2, power[1]);
4476 reg = RW(reg, R92C_TXAGC_A_CCK55, power[2]);
4477 reg = RW(reg, R92C_TXAGC_A_CCK11, power[3]);
4478 urtwn_bb_write(sc, R92C_TXAGC_B_CCK11_A_CCK2_11, reg);
4480 reg = urtwn_bb_read(sc, R92C_TXAGC_B_CCK1_55_MCS32);
4481 reg = RW(reg, R92C_TXAGC_B_CCK1, power[0]);
4482 reg = RW(reg, R92C_TXAGC_B_CCK2, power[1]);
4483 reg = RW(reg, R92C_TXAGC_B_CCK55, power[2]);
4484 urtwn_bb_write(sc, R92C_TXAGC_B_CCK1_55_MCS32, reg);
4485 reg = urtwn_bb_read(sc, R92C_TXAGC_B_CCK11_A_CCK2_11);
4486 reg = RW(reg, R92C_TXAGC_B_CCK11, power[3]);
4487 urtwn_bb_write(sc, R92C_TXAGC_B_CCK11_A_CCK2_11, reg);
4489 /* Write per-OFDM rate Tx power. */
4490 urtwn_bb_write(sc, R92C_TXAGC_RATE18_06(chain),
4491 SM(R92C_TXAGC_RATE06, power[ 4]) |
4492 SM(R92C_TXAGC_RATE09, power[ 5]) |
4493 SM(R92C_TXAGC_RATE12, power[ 6]) |
4494 SM(R92C_TXAGC_RATE18, power[ 7]));
4495 urtwn_bb_write(sc, R92C_TXAGC_RATE54_24(chain),
4496 SM(R92C_TXAGC_RATE24, power[ 8]) |
4497 SM(R92C_TXAGC_RATE36, power[ 9]) |
4498 SM(R92C_TXAGC_RATE48, power[10]) |
4499 SM(R92C_TXAGC_RATE54, power[11]));
4500 /* Write per-MCS Tx power. */
4501 urtwn_bb_write(sc, R92C_TXAGC_MCS03_MCS00(chain),
4502 SM(R92C_TXAGC_MCS00, power[12]) |
4503 SM(R92C_TXAGC_MCS01, power[13]) |
4504 SM(R92C_TXAGC_MCS02, power[14]) |
4505 SM(R92C_TXAGC_MCS03, power[15]));
4506 urtwn_bb_write(sc, R92C_TXAGC_MCS07_MCS04(chain),
4507 SM(R92C_TXAGC_MCS04, power[16]) |
4508 SM(R92C_TXAGC_MCS05, power[17]) |
4509 SM(R92C_TXAGC_MCS06, power[18]) |
4510 SM(R92C_TXAGC_MCS07, power[19]));
4511 urtwn_bb_write(sc, R92C_TXAGC_MCS11_MCS08(chain),
4512 SM(R92C_TXAGC_MCS08, power[20]) |
4513 SM(R92C_TXAGC_MCS09, power[21]) |
4514 SM(R92C_TXAGC_MCS10, power[22]) |
4515 SM(R92C_TXAGC_MCS11, power[23]));
4516 urtwn_bb_write(sc, R92C_TXAGC_MCS15_MCS12(chain),
4517 SM(R92C_TXAGC_MCS12, power[24]) |
4518 SM(R92C_TXAGC_MCS13, power[25]) |
4519 SM(R92C_TXAGC_MCS14, power[26]) |
4520 SM(R92C_TXAGC_MCS15, power[27]));
4524 urtwn_get_txpower(struct urtwn_softc *sc, int chain,
4525 struct ieee80211_channel *c, struct ieee80211_channel *extc,
4526 uint16_t power[URTWN_RIDX_COUNT])
4528 struct ieee80211com *ic = &sc->sc_ic;
4529 struct r92c_rom *rom = &sc->rom.r92c_rom;
4530 uint16_t cckpow, ofdmpow, htpow, diff, max;
4531 const struct urtwn_txpwr *base;
4532 int ridx, chan, group;
4534 /* Determine channel group. */
4535 chan = ieee80211_chan2ieee(ic, c); /* XXX center freq! */
4543 /* Get original Tx power based on board type and RF chain. */
4544 if (!(sc->chip & URTWN_CHIP_92C)) {
4545 if (sc->board_type == R92C_BOARD_TYPE_HIGHPA)
4546 base = &rtl8188ru_txagc[chain];
4548 base = &rtl8192cu_txagc[chain];
4550 base = &rtl8192cu_txagc[chain];
4552 memset(power, 0, URTWN_RIDX_COUNT * sizeof(power[0]));
4553 if (sc->regulatory == 0) {
4554 for (ridx = URTWN_RIDX_CCK1; ridx <= URTWN_RIDX_CCK11; ridx++)
4555 power[ridx] = base->pwr[0][ridx];
4557 for (ridx = URTWN_RIDX_OFDM6; ridx < URTWN_RIDX_COUNT; ridx++) {
4558 if (sc->regulatory == 3) {
4559 power[ridx] = base->pwr[0][ridx];
4560 /* Apply vendor limits. */
4562 max = rom->ht40_max_pwr[group];
4564 max = rom->ht20_max_pwr[group];
4565 max = (max >> (chain * 4)) & 0xf;
4566 if (power[ridx] > max)
4568 } else if (sc->regulatory == 1) {
4570 power[ridx] = base->pwr[group][ridx];
4571 } else if (sc->regulatory != 2)
4572 power[ridx] = base->pwr[0][ridx];
4575 /* Compute per-CCK rate Tx power. */
4576 cckpow = rom->cck_tx_pwr[chain][group];
4577 for (ridx = URTWN_RIDX_CCK1; ridx <= URTWN_RIDX_CCK11; ridx++) {
4578 power[ridx] += cckpow;
4579 if (power[ridx] > R92C_MAX_TX_PWR)
4580 power[ridx] = R92C_MAX_TX_PWR;
4583 htpow = rom->ht40_1s_tx_pwr[chain][group];
4584 if (sc->ntxchains > 1) {
4585 /* Apply reduction for 2 spatial streams. */
4586 diff = rom->ht40_2s_tx_pwr_diff[group];
4587 diff = (diff >> (chain * 4)) & 0xf;
4588 htpow = (htpow > diff) ? htpow - diff : 0;
4591 /* Compute per-OFDM rate Tx power. */
4592 diff = rom->ofdm_tx_pwr_diff[group];
4593 diff = (diff >> (chain * 4)) & 0xf;
4594 ofdmpow = htpow + diff; /* HT->OFDM correction. */
4595 for (ridx = URTWN_RIDX_OFDM6; ridx <= URTWN_RIDX_OFDM54; ridx++) {
4596 power[ridx] += ofdmpow;
4597 if (power[ridx] > R92C_MAX_TX_PWR)
4598 power[ridx] = R92C_MAX_TX_PWR;
4601 /* Compute per-MCS Tx power. */
4603 diff = rom->ht20_tx_pwr_diff[group];
4604 diff = (diff >> (chain * 4)) & 0xf;
4605 htpow += diff; /* HT40->HT20 correction. */
4607 for (ridx = 12; ridx <= 27; ridx++) {
4608 power[ridx] += htpow;
4609 if (power[ridx] > R92C_MAX_TX_PWR)
4610 power[ridx] = R92C_MAX_TX_PWR;
4613 if (sc->sc_debug & URTWN_DEBUG_TXPWR) {
4614 /* Dump per-rate Tx power values. */
4615 printf("Tx power for chain %d:\n", chain);
4616 for (ridx = URTWN_RIDX_CCK1; ridx < URTWN_RIDX_COUNT; ridx++)
4617 printf("Rate %d = %u\n", ridx, power[ridx]);
4623 urtwn_r88e_get_txpower(struct urtwn_softc *sc, int chain,
4624 struct ieee80211_channel *c, struct ieee80211_channel *extc,
4625 uint16_t power[URTWN_RIDX_COUNT])
4627 struct ieee80211com *ic = &sc->sc_ic;
4628 struct r88e_rom *rom = &sc->rom.r88e_rom;
4629 uint16_t cckpow, ofdmpow, bw20pow, htpow;
4630 const struct urtwn_r88e_txpwr *base;
4631 int ridx, chan, group;
4633 /* Determine channel group. */
4634 chan = ieee80211_chan2ieee(ic, c); /* XXX center freq! */
4641 else if (chan <= 11)
4643 else if (chan <= 13)
4648 /* Get original Tx power based on board type and RF chain. */
4649 base = &rtl8188eu_txagc[chain];
4651 memset(power, 0, URTWN_RIDX_COUNT * sizeof(power[0]));
4652 if (sc->regulatory == 0) {
4653 for (ridx = URTWN_RIDX_CCK1; ridx <= URTWN_RIDX_CCK11; ridx++)
4654 power[ridx] = base->pwr[0][ridx];
4656 for (ridx = URTWN_RIDX_OFDM6; ridx < URTWN_RIDX_COUNT; ridx++) {
4657 if (sc->regulatory == 3)
4658 power[ridx] = base->pwr[0][ridx];
4659 else if (sc->regulatory == 1) {
4661 power[ridx] = base->pwr[group][ridx];
4662 } else if (sc->regulatory != 2)
4663 power[ridx] = base->pwr[0][ridx];
4666 /* Compute per-CCK rate Tx power. */
4667 cckpow = rom->cck_tx_pwr[group];
4668 for (ridx = URTWN_RIDX_CCK1; ridx <= URTWN_RIDX_CCK11; ridx++) {
4669 power[ridx] += cckpow;
4670 if (power[ridx] > R92C_MAX_TX_PWR)
4671 power[ridx] = R92C_MAX_TX_PWR;
4674 htpow = rom->ht40_tx_pwr[group];
4676 /* Compute per-OFDM rate Tx power. */
4677 ofdmpow = htpow + sc->ofdm_tx_pwr_diff;
4678 for (ridx = URTWN_RIDX_OFDM6; ridx <= URTWN_RIDX_OFDM54; ridx++) {
4679 power[ridx] += ofdmpow;
4680 if (power[ridx] > R92C_MAX_TX_PWR)
4681 power[ridx] = R92C_MAX_TX_PWR;
4684 bw20pow = htpow + sc->bw20_tx_pwr_diff;
4685 for (ridx = 12; ridx <= 27; ridx++) {
4686 power[ridx] += bw20pow;
4687 if (power[ridx] > R92C_MAX_TX_PWR)
4688 power[ridx] = R92C_MAX_TX_PWR;
4693 urtwn_set_txpower(struct urtwn_softc *sc, struct ieee80211_channel *c,
4694 struct ieee80211_channel *extc)
4696 uint16_t power[URTWN_RIDX_COUNT];
4699 for (i = 0; i < sc->ntxchains; i++) {
4700 /* Compute per-rate Tx power values. */
4701 if (sc->chip & URTWN_CHIP_88E)
4702 urtwn_r88e_get_txpower(sc, i, c, extc, power);
4704 urtwn_get_txpower(sc, i, c, extc, power);
4705 /* Write per-rate Tx power values to hardware. */
4706 urtwn_write_txpower(sc, i, power);
4711 urtwn_set_rx_bssid_all(struct urtwn_softc *sc, int enable)
4715 reg = urtwn_read_4(sc, R92C_RCR);
4717 reg &= ~R92C_RCR_CBSSID_BCN;
4719 reg |= R92C_RCR_CBSSID_BCN;
4720 urtwn_write_4(sc, R92C_RCR, reg);
4724 urtwn_set_gain(struct urtwn_softc *sc, uint8_t gain)
4728 reg = urtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(0));
4729 reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, gain);
4730 urtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(0), reg);
4732 if (!(sc->chip & URTWN_CHIP_88E)) {
4733 reg = urtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(1));
4734 reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, gain);
4735 urtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(1), reg);
4740 urtwn_scan_start(struct ieee80211com *ic)
4742 struct urtwn_softc *sc = ic->ic_softc;
4745 /* Receive beacons / probe responses from any BSSID. */
4746 if (ic->ic_opmode != IEEE80211_M_IBSS)
4747 urtwn_set_rx_bssid_all(sc, 1);
4749 /* Set gain for scanning. */
4750 urtwn_set_gain(sc, 0x20);
4755 urtwn_scan_end(struct ieee80211com *ic)
4757 struct urtwn_softc *sc = ic->ic_softc;
4760 /* Restore limitations. */
4761 if (ic->ic_promisc == 0 && ic->ic_opmode != IEEE80211_M_IBSS)
4762 urtwn_set_rx_bssid_all(sc, 0);
4764 /* Set gain under link. */
4765 urtwn_set_gain(sc, 0x32);
4770 urtwn_set_channel(struct ieee80211com *ic)
4772 struct urtwn_softc *sc = ic->ic_softc;
4773 struct ieee80211_channel *c = ic->ic_curchan;
4774 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
4777 if (vap->iv_state == IEEE80211_S_SCAN) {
4778 /* Make link LED blink during scan. */
4779 urtwn_set_led(sc, URTWN_LED_LINK, !sc->ledlink);
4781 urtwn_set_chan(sc, c, NULL);
4782 sc->sc_rxtap.wr_chan_freq = htole16(c->ic_freq);
4783 sc->sc_rxtap.wr_chan_flags = htole16(c->ic_flags);
4784 sc->sc_txtap.wt_chan_freq = htole16(c->ic_freq);
4785 sc->sc_txtap.wt_chan_flags = htole16(c->ic_flags);
4790 urtwn_wme_update(struct ieee80211com *ic)
4792 const struct wmeParams *wmep =
4793 ic->ic_wme.wme_chanParams.cap_wmeParams;
4794 struct urtwn_softc *sc = ic->ic_softc;
4795 uint8_t aifs, acm, slottime;
4799 slottime = IEEE80211_GET_SLOTTIME(ic);
4802 for (ac = WME_AC_BE; ac < WME_NUM_AC; ac++) {
4803 /* AIFS[AC] = AIFSN[AC] * aSlotTime + aSIFSTime. */
4804 aifs = wmep[ac].wmep_aifsn * slottime + IEEE80211_DUR_SIFS;
4805 urtwn_write_4(sc, wme2queue[ac].reg,
4806 SM(R92C_EDCA_PARAM_TXOP, wmep[ac].wmep_txopLimit) |
4807 SM(R92C_EDCA_PARAM_ECWMIN, wmep[ac].wmep_logcwmin) |
4808 SM(R92C_EDCA_PARAM_ECWMAX, wmep[ac].wmep_logcwmax) |
4809 SM(R92C_EDCA_PARAM_AIFS, aifs));
4810 if (ac != WME_AC_BE)
4811 acm |= wmep[ac].wmep_acm << ac;
4815 acm |= R92C_ACMHWCTRL_EN;
4816 urtwn_write_1(sc, R92C_ACMHWCTRL,
4817 (urtwn_read_1(sc, R92C_ACMHWCTRL) & ~R92C_ACMHWCTRL_ACM_MASK) |
4826 urtwn_update_slot(struct ieee80211com *ic)
4828 urtwn_cmd_sleepable(ic->ic_softc, NULL, 0, urtwn_update_slot_cb);
4832 urtwn_update_slot_cb(struct urtwn_softc *sc, union sec_param *data)
4834 struct ieee80211com *ic = &sc->sc_ic;
4837 slottime = IEEE80211_GET_SLOTTIME(ic);
4839 URTWN_DPRINTF(sc, URTWN_DEBUG_ANY, "%s: setting slot time to %uus\n",
4840 __func__, slottime);
4842 urtwn_write_1(sc, R92C_SLOT, slottime);
4843 urtwn_update_aifs(sc, slottime);
4847 urtwn_update_aifs(struct urtwn_softc *sc, uint8_t slottime)
4849 const struct wmeParams *wmep =
4850 sc->sc_ic.ic_wme.wme_chanParams.cap_wmeParams;
4853 for (ac = WME_AC_BE; ac < WME_NUM_AC; ac++) {
4854 /* AIFS[AC] = AIFSN[AC] * aSlotTime + aSIFSTime. */
4855 aifs = wmep[ac].wmep_aifsn * slottime + IEEE80211_DUR_SIFS;
4856 urtwn_write_1(sc, wme2queue[ac].reg, aifs);
4861 urtwn_get_multi_pos(const uint8_t maddr[])
4863 uint64_t mask = 0x00004d101df481b4;
4864 uint8_t pos = 0x27; /* initial value */
4867 for (i = 0; i < IEEE80211_ADDR_LEN; i++)
4868 for (j = (i == 0) ? 1 : 0; j < 8; j++)
4869 if ((maddr[i] >> j) & 1)
4870 pos ^= (mask >> (i * 8 + j - 1));
4878 urtwn_set_multi(struct urtwn_softc *sc)
4880 struct ieee80211com *ic = &sc->sc_ic;
4883 URTWN_ASSERT_LOCKED(sc);
4885 /* general structure was copied from ath(4). */
4886 if (ic->ic_allmulti == 0) {
4887 struct ieee80211vap *vap;
4889 struct ifmultiaddr *ifma;
4892 * Merge multicast addresses to form the hardware filter.
4894 mfilt[0] = mfilt[1] = 0;
4895 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) {
4897 #if defined(__DragonFly__)
4898 /* XXX not implemented */
4900 if_maddr_rlock(ifp);
4902 TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
4906 dl = LLADDR((struct sockaddr_dl *)
4908 pos = urtwn_get_multi_pos(dl);
4910 mfilt[pos / 32] |= (1 << (pos % 32));
4912 #if defined(__DragonFly__)
4913 /* XXX not implemented */
4915 if_maddr_runlock(ifp);
4919 mfilt[0] = mfilt[1] = ~0;
4922 urtwn_write_4(sc, R92C_MAR + 0, mfilt[0]);
4923 urtwn_write_4(sc, R92C_MAR + 4, mfilt[1]);
4925 URTWN_DPRINTF(sc, URTWN_DEBUG_STATE, "%s: MC filter %08x:%08x\n",
4926 __func__, mfilt[0], mfilt[1]);
4930 urtwn_set_promisc(struct urtwn_softc *sc)
4932 struct ieee80211com *ic = &sc->sc_ic;
4933 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
4934 uint32_t rcr, mask1, mask2;
4936 URTWN_ASSERT_LOCKED(sc);
4938 if (vap->iv_opmode == IEEE80211_M_MONITOR)
4941 mask1 = R92C_RCR_ACF | R92C_RCR_ADF | R92C_RCR_AMF | R92C_RCR_AAP;
4942 mask2 = R92C_RCR_APM;
4944 if (vap->iv_state == IEEE80211_S_RUN) {
4945 switch (vap->iv_opmode) {
4946 case IEEE80211_M_STA:
4947 mask2 |= R92C_RCR_CBSSID_DATA;
4949 case IEEE80211_M_HOSTAP:
4950 mask2 |= R92C_RCR_CBSSID_BCN;
4952 case IEEE80211_M_IBSS:
4953 mask2 |= R92C_RCR_CBSSID_DATA;
4956 device_printf(sc->sc_dev, "%s: undefined opmode %d\n",
4957 __func__, vap->iv_opmode);
4962 rcr = urtwn_read_4(sc, R92C_RCR);
4963 if (ic->ic_promisc == 0)
4964 rcr = (rcr & ~mask1) | mask2;
4966 rcr = (rcr & ~mask2) | mask1;
4967 urtwn_write_4(sc, R92C_RCR, rcr);
4971 urtwn_update_promisc(struct ieee80211com *ic)
4973 struct urtwn_softc *sc = ic->ic_softc;
4976 if (sc->sc_flags & URTWN_RUNNING)
4977 urtwn_set_promisc(sc);
4982 urtwn_update_mcast(struct ieee80211com *ic)
4984 struct urtwn_softc *sc = ic->ic_softc;
4987 if (sc->sc_flags & URTWN_RUNNING)
4988 urtwn_set_multi(sc);
4992 static struct ieee80211_node *
4993 urtwn_node_alloc(struct ieee80211vap *vap,
4994 const uint8_t mac[IEEE80211_ADDR_LEN])
4996 struct urtwn_node *un;
4998 un = kmalloc(sizeof (struct urtwn_node), M_80211_NODE,
4999 M_INTWAIT | M_ZERO);
5004 un->id = URTWN_MACID_UNDEFINED;
5010 urtwn_newassoc(struct ieee80211_node *ni, int isnew)
5012 struct urtwn_softc *sc = ni->ni_ic->ic_softc;
5013 struct urtwn_node *un = URTWN_NODE(ni);
5016 /* Only do this bit for R88E chips */
5017 if (! (sc->chip & URTWN_CHIP_88E))
5024 for (id = 0; id <= URTWN_MACID_MAX(sc); id++) {
5025 if (id != URTWN_MACID_BC && sc->node_list[id] == NULL) {
5027 sc->node_list[id] = ni;
5031 URTWN_NT_UNLOCK(sc);
5033 if (id > URTWN_MACID_MAX(sc)) {
5034 device_printf(sc->sc_dev, "%s: node table is full\n",
5040 urtwn_node_free(struct ieee80211_node *ni)
5042 struct urtwn_softc *sc = ni->ni_ic->ic_softc;
5043 struct urtwn_node *un = URTWN_NODE(ni);
5046 if (un->id != URTWN_MACID_UNDEFINED)
5047 sc->node_list[un->id] = NULL;
5048 URTWN_NT_UNLOCK(sc);
5050 sc->sc_node_free(ni);
5054 urtwn_set_chan(struct urtwn_softc *sc, struct ieee80211_channel *c,
5055 struct ieee80211_channel *extc)
5057 struct ieee80211com *ic = &sc->sc_ic;
5062 chan = ieee80211_chan2ieee(ic, c); /* XXX center freq! */
5063 if (chan == 0 || chan == IEEE80211_CHAN_ANY) {
5064 device_printf(sc->sc_dev,
5065 "%s: invalid channel %x\n", __func__, chan);
5069 /* Set Tx power for this new channel. */
5070 urtwn_set_txpower(sc, c, extc);
5072 for (i = 0; i < sc->nrxchains; i++) {
5073 urtwn_rf_write(sc, i, R92C_RF_CHNLBW,
5074 RW(sc->rf_chnlbw[i], R92C_RF_CHNLBW_CHNL, chan));
5076 #ifndef IEEE80211_NO_HT
5078 /* Is secondary channel below or above primary? */
5079 int prichlo = c->ic_freq < extc->ic_freq;
5081 urtwn_write_1(sc, R92C_BWOPMODE,
5082 urtwn_read_1(sc, R92C_BWOPMODE) & ~R92C_BWOPMODE_20MHZ);
5084 reg = urtwn_read_1(sc, R92C_RRSR + 2);
5085 reg = (reg & ~0x6f) | (prichlo ? 1 : 2) << 5;
5086 urtwn_write_1(sc, R92C_RRSR + 2, reg);
5088 urtwn_bb_write(sc, R92C_FPGA0_RFMOD,
5089 urtwn_bb_read(sc, R92C_FPGA0_RFMOD) | R92C_RFMOD_40MHZ);
5090 urtwn_bb_write(sc, R92C_FPGA1_RFMOD,
5091 urtwn_bb_read(sc, R92C_FPGA1_RFMOD) | R92C_RFMOD_40MHZ);
5093 /* Set CCK side band. */
5094 reg = urtwn_bb_read(sc, R92C_CCK0_SYSTEM);
5095 reg = (reg & ~0x00000010) | (prichlo ? 0 : 1) << 4;
5096 urtwn_bb_write(sc, R92C_CCK0_SYSTEM, reg);
5098 reg = urtwn_bb_read(sc, R92C_OFDM1_LSTF);
5099 reg = (reg & ~0x00000c00) | (prichlo ? 1 : 2) << 10;
5100 urtwn_bb_write(sc, R92C_OFDM1_LSTF, reg);
5102 urtwn_bb_write(sc, R92C_FPGA0_ANAPARAM2,
5103 urtwn_bb_read(sc, R92C_FPGA0_ANAPARAM2) &
5104 ~R92C_FPGA0_ANAPARAM2_CBW20);
5106 reg = urtwn_bb_read(sc, 0x818);
5107 reg = (reg & ~0x0c000000) | (prichlo ? 2 : 1) << 26;
5108 urtwn_bb_write(sc, 0x818, reg);
5110 /* Select 40MHz bandwidth. */
5111 urtwn_rf_write(sc, 0, R92C_RF_CHNLBW,
5112 (sc->rf_chnlbw[0] & ~0xfff) | chan);
5116 urtwn_write_1(sc, R92C_BWOPMODE,
5117 urtwn_read_1(sc, R92C_BWOPMODE) | R92C_BWOPMODE_20MHZ);
5119 urtwn_bb_write(sc, R92C_FPGA0_RFMOD,
5120 urtwn_bb_read(sc, R92C_FPGA0_RFMOD) & ~R92C_RFMOD_40MHZ);
5121 urtwn_bb_write(sc, R92C_FPGA1_RFMOD,
5122 urtwn_bb_read(sc, R92C_FPGA1_RFMOD) & ~R92C_RFMOD_40MHZ);
5124 if (!(sc->chip & URTWN_CHIP_88E)) {
5125 urtwn_bb_write(sc, R92C_FPGA0_ANAPARAM2,
5126 urtwn_bb_read(sc, R92C_FPGA0_ANAPARAM2) |
5127 R92C_FPGA0_ANAPARAM2_CBW20);
5130 /* Select 20MHz bandwidth. */
5131 urtwn_rf_write(sc, 0, R92C_RF_CHNLBW,
5132 (sc->rf_chnlbw[0] & ~0xfff) | chan |
5133 ((sc->chip & URTWN_CHIP_88E) ? R88E_RF_CHNLBW_BW20 :
5134 R92C_RF_CHNLBW_BW20));
5139 urtwn_iq_calib(struct urtwn_softc *sc)
5145 urtwn_lc_calib(struct urtwn_softc *sc)
5151 txmode = urtwn_read_1(sc, R92C_OFDM1_LSTF + 3);
5152 if ((txmode & 0x70) != 0) {
5153 /* Disable all continuous Tx. */
5154 urtwn_write_1(sc, R92C_OFDM1_LSTF + 3, txmode & ~0x70);
5156 /* Set RF mode to standby mode. */
5157 for (i = 0; i < sc->nrxchains; i++) {
5158 rf_ac[i] = urtwn_rf_read(sc, i, R92C_RF_AC);
5159 urtwn_rf_write(sc, i, R92C_RF_AC,
5160 RW(rf_ac[i], R92C_RF_AC_MODE,
5161 R92C_RF_AC_MODE_STANDBY));
5164 /* Block all Tx queues. */
5165 urtwn_write_1(sc, R92C_TXPAUSE, R92C_TX_QUEUE_ALL);
5167 /* Start calibration. */
5168 urtwn_rf_write(sc, 0, R92C_RF_CHNLBW,
5169 urtwn_rf_read(sc, 0, R92C_RF_CHNLBW) | R92C_RF_CHNLBW_LCSTART);
5171 /* Give calibration the time to complete. */
5172 usb_pause_mtx(&sc->sc_mtx, hz / 10); /* 100ms */
5174 /* Restore configuration. */
5175 if ((txmode & 0x70) != 0) {
5176 /* Restore Tx mode. */
5177 urtwn_write_1(sc, R92C_OFDM1_LSTF + 3, txmode);
5178 /* Restore RF mode. */
5179 for (i = 0; i < sc->nrxchains; i++)
5180 urtwn_rf_write(sc, i, R92C_RF_AC, rf_ac[i]);
5182 /* Unblock all Tx queues. */
5183 urtwn_write_1(sc, R92C_TXPAUSE, 0x00);
5188 urtwn_temp_calib(struct urtwn_softc *sc)
5192 URTWN_ASSERT_LOCKED(sc);
5194 if (!(sc->sc_flags & URTWN_TEMP_MEASURED)) {
5195 /* Start measuring temperature. */
5196 URTWN_DPRINTF(sc, URTWN_DEBUG_TEMP,
5197 "%s: start measuring temperature\n", __func__);
5198 if (sc->chip & URTWN_CHIP_88E) {
5199 urtwn_rf_write(sc, 0, R88E_RF_T_METER,
5200 R88E_RF_T_METER_START);
5202 urtwn_rf_write(sc, 0, R92C_RF_T_METER,
5203 R92C_RF_T_METER_START);
5205 sc->sc_flags |= URTWN_TEMP_MEASURED;
5208 sc->sc_flags &= ~URTWN_TEMP_MEASURED;
5210 /* Read measured temperature. */
5211 if (sc->chip & URTWN_CHIP_88E) {
5212 temp = MS(urtwn_rf_read(sc, 0, R88E_RF_T_METER),
5213 R88E_RF_T_METER_VAL);
5215 temp = MS(urtwn_rf_read(sc, 0, R92C_RF_T_METER),
5216 R92C_RF_T_METER_VAL);
5218 if (temp == 0) { /* Read failed, skip. */
5219 URTWN_DPRINTF(sc, URTWN_DEBUG_TEMP,
5220 "%s: temperature read failed, skipping\n", __func__);
5224 URTWN_DPRINTF(sc, URTWN_DEBUG_TEMP,
5225 "%s: temperature: previous %u, current %u\n",
5226 __func__, sc->thcal_lctemp, temp);
5229 * Redo LC calibration if temperature changed significantly since
5232 if (sc->thcal_lctemp == 0) {
5233 /* First LC calibration is performed in urtwn_init(). */
5234 sc->thcal_lctemp = temp;
5235 } else if (abs(temp - sc->thcal_lctemp) > 1) {
5236 URTWN_DPRINTF(sc, URTWN_DEBUG_TEMP,
5237 "%s: LC calib triggered by temp: %u -> %u\n",
5238 __func__, sc->thcal_lctemp, temp);
5240 /* Record temperature of last LC calibration. */
5241 sc->thcal_lctemp = temp;
5246 urtwn_init(struct urtwn_softc *sc)
5248 struct ieee80211com *ic = &sc->sc_ic;
5249 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
5250 uint8_t macaddr[IEEE80211_ADDR_LEN];
5252 usb_error_t usb_err = USB_ERR_NORMAL_COMPLETION;
5256 if (sc->sc_flags & URTWN_RUNNING) {
5261 /* Init firmware commands ring. */
5264 /* Allocate Tx/Rx buffers. */
5265 error = urtwn_alloc_rx_list(sc);
5269 error = urtwn_alloc_tx_list(sc);
5273 /* Power on adapter. */
5274 error = urtwn_power_on(sc);
5278 /* Initialize DMA. */
5279 error = urtwn_dma_init(sc);
5283 /* Set info size in Rx descriptors (in 64-bit words). */
5284 urtwn_write_1(sc, R92C_RX_DRVINFO_SZ, 4);
5286 /* Init interrupts. */
5287 if (sc->chip & URTWN_CHIP_88E) {
5288 usb_err = urtwn_write_4(sc, R88E_HISR, 0xffffffff);
5289 if (usb_err != USB_ERR_NORMAL_COMPLETION)
5291 usb_err = urtwn_write_4(sc, R88E_HIMR, R88E_HIMR_CPWM | R88E_HIMR_CPWM2 |
5292 R88E_HIMR_TBDER | R88E_HIMR_PSTIMEOUT);
5293 if (usb_err != USB_ERR_NORMAL_COMPLETION)
5295 usb_err = urtwn_write_4(sc, R88E_HIMRE, R88E_HIMRE_RXFOVW |
5296 R88E_HIMRE_TXFOVW | R88E_HIMRE_RXERR | R88E_HIMRE_TXERR);
5297 if (usb_err != USB_ERR_NORMAL_COMPLETION)
5299 usb_err = urtwn_write_1(sc, R92C_USB_SPECIAL_OPTION,
5300 urtwn_read_1(sc, R92C_USB_SPECIAL_OPTION) |
5301 R92C_USB_SPECIAL_OPTION_INT_BULK_SEL);
5302 if (usb_err != USB_ERR_NORMAL_COMPLETION)
5305 usb_err = urtwn_write_4(sc, R92C_HISR, 0xffffffff);
5306 if (usb_err != USB_ERR_NORMAL_COMPLETION)
5308 usb_err = urtwn_write_4(sc, R92C_HIMR, 0xffffffff);
5309 if (usb_err != USB_ERR_NORMAL_COMPLETION)
5313 /* Set MAC address. */
5314 IEEE80211_ADDR_COPY(macaddr, vap ? vap->iv_myaddr : ic->ic_macaddr);
5315 usb_err = urtwn_write_region_1(sc, R92C_MACID, macaddr, IEEE80211_ADDR_LEN);
5316 if (usb_err != USB_ERR_NORMAL_COMPLETION)
5319 /* Set initial network type. */
5320 urtwn_set_mode(sc, R92C_MSR_INFRA);
5322 /* Initialize Rx filter. */
5323 urtwn_rxfilter_init(sc);
5325 /* Set response rate. */
5326 reg = urtwn_read_4(sc, R92C_RRSR);
5327 reg = RW(reg, R92C_RRSR_RATE_BITMAP, R92C_RRSR_RATE_CCK_ONLY_1M);
5328 urtwn_write_4(sc, R92C_RRSR, reg);
5330 /* Set short/long retry limits. */
5331 urtwn_write_2(sc, R92C_RL,
5332 SM(R92C_RL_SRL, 0x30) | SM(R92C_RL_LRL, 0x30));
5334 /* Initialize EDCA parameters. */
5335 urtwn_edca_init(sc);
5337 /* Setup rate fallback. */
5338 if (!(sc->chip & URTWN_CHIP_88E)) {
5339 urtwn_write_4(sc, R92C_DARFRC + 0, 0x00000000);
5340 urtwn_write_4(sc, R92C_DARFRC + 4, 0x10080404);
5341 urtwn_write_4(sc, R92C_RARFRC + 0, 0x04030201);
5342 urtwn_write_4(sc, R92C_RARFRC + 4, 0x08070605);
5345 urtwn_write_1(sc, R92C_FWHW_TXQ_CTRL,
5346 urtwn_read_1(sc, R92C_FWHW_TXQ_CTRL) |
5347 R92C_FWHW_TXQ_CTRL_AMPDU_RTY_NEW);
5348 /* Set ACK timeout. */
5349 urtwn_write_1(sc, R92C_ACKTO, 0x40);
5351 /* Setup USB aggregation. */
5352 reg = urtwn_read_4(sc, R92C_TDECTRL);
5353 reg = RW(reg, R92C_TDECTRL_BLK_DESC_NUM, 6);
5354 urtwn_write_4(sc, R92C_TDECTRL, reg);
5355 urtwn_write_1(sc, R92C_TRXDMA_CTRL,
5356 urtwn_read_1(sc, R92C_TRXDMA_CTRL) |
5357 R92C_TRXDMA_CTRL_RXDMA_AGG_EN);
5358 urtwn_write_1(sc, R92C_RXDMA_AGG_PG_TH, 48);
5359 if (sc->chip & URTWN_CHIP_88E)
5360 urtwn_write_1(sc, R92C_RXDMA_AGG_PG_TH + 1, 4);
5362 urtwn_write_1(sc, R92C_USB_DMA_AGG_TO, 4);
5363 urtwn_write_1(sc, R92C_USB_SPECIAL_OPTION,
5364 urtwn_read_1(sc, R92C_USB_SPECIAL_OPTION) |
5365 R92C_USB_SPECIAL_OPTION_AGG_EN);
5366 urtwn_write_1(sc, R92C_USB_AGG_TH, 8);
5367 urtwn_write_1(sc, R92C_USB_AGG_TO, 6);
5370 /* Initialize beacon parameters. */
5371 urtwn_write_2(sc, R92C_BCN_CTRL, 0x1010);
5372 urtwn_write_2(sc, R92C_TBTT_PROHIBIT, 0x6404);
5373 urtwn_write_1(sc, R92C_DRVERLYINT, 0x05);
5374 urtwn_write_1(sc, R92C_BCNDMATIM, 0x02);
5375 urtwn_write_2(sc, R92C_BCNTCFG, 0x660f);
5377 if (!(sc->chip & URTWN_CHIP_88E)) {
5378 /* Setup AMPDU aggregation. */
5379 urtwn_write_4(sc, R92C_AGGLEN_LMT, 0x99997631); /* MCS7~0 */
5380 urtwn_write_1(sc, R92C_AGGR_BREAK_TIME, 0x16);
5381 urtwn_write_2(sc, R92C_MAX_AGGR_NUM, 0x0708);
5383 urtwn_write_1(sc, R92C_BCN_MAX_ERR, 0xff);
5386 #ifndef URTWN_WITHOUT_UCODE
5387 /* Load 8051 microcode. */
5388 error = urtwn_load_firmware(sc);
5390 sc->sc_flags |= URTWN_FW_LOADED;
5393 /* Initialize MAC/BB/RF blocks. */
5394 error = urtwn_mac_init(sc);
5396 device_printf(sc->sc_dev,
5397 "%s: error while initializing MAC block\n", __func__);
5403 /* Reinitialize Rx filter (D3845 is not committed yet). */
5404 urtwn_rxfilter_init(sc);
5406 if (sc->chip & URTWN_CHIP_88E) {
5407 urtwn_write_2(sc, R92C_CR,
5408 urtwn_read_2(sc, R92C_CR) | R92C_CR_MACTXEN |
5412 /* Turn CCK and OFDM blocks on. */
5413 reg = urtwn_bb_read(sc, R92C_FPGA0_RFMOD);
5414 reg |= R92C_RFMOD_CCK_EN;
5415 usb_err = urtwn_bb_write(sc, R92C_FPGA0_RFMOD, reg);
5416 if (usb_err != USB_ERR_NORMAL_COMPLETION)
5418 reg = urtwn_bb_read(sc, R92C_FPGA0_RFMOD);
5419 reg |= R92C_RFMOD_OFDM_EN;
5420 usb_err = urtwn_bb_write(sc, R92C_FPGA0_RFMOD, reg);
5421 if (usb_err != USB_ERR_NORMAL_COMPLETION)
5424 /* Clear per-station keys table. */
5427 /* Enable decryption / encryption. */
5428 urtwn_write_2(sc, R92C_SECCFG,
5429 R92C_SECCFG_TXUCKEY_DEF | R92C_SECCFG_RXUCKEY_DEF |
5430 R92C_SECCFG_TXENC_ENA | R92C_SECCFG_RXDEC_ENA |
5431 R92C_SECCFG_TXBCKEY_DEF | R92C_SECCFG_RXBCKEY_DEF);
5434 * Install static keys (if any).
5435 * Must be called after urtwn_cam_init().
5437 ieee80211_runtask(ic, &sc->cmdq_task);
5439 /* Enable hardware sequence numbering. */
5440 urtwn_write_1(sc, R92C_HWSEQ_CTRL, R92C_TX_QUEUE_ALL);
5442 /* Enable per-packet TX report. */
5443 if (sc->chip & URTWN_CHIP_88E) {
5444 urtwn_write_1(sc, R88E_TX_RPT_CTRL,
5445 urtwn_read_1(sc, R88E_TX_RPT_CTRL) | R88E_TX_RPT1_ENA);
5448 /* Perform LO and IQ calibrations. */
5450 /* Perform LC calibration. */
5453 /* Fix USB interference issue. */
5454 if (!(sc->chip & URTWN_CHIP_88E)) {
5455 urtwn_write_1(sc, 0xfe40, 0xe0);
5456 urtwn_write_1(sc, 0xfe41, 0x8d);
5457 urtwn_write_1(sc, 0xfe42, 0x80);
5459 urtwn_pa_bias_init(sc);
5462 /* Initialize GPIO setting. */
5463 urtwn_write_1(sc, R92C_GPIO_MUXCFG,
5464 urtwn_read_1(sc, R92C_GPIO_MUXCFG) & ~R92C_GPIO_MUXCFG_ENBT);
5466 /* Fix for lower temperature. */
5467 if (!(sc->chip & URTWN_CHIP_88E))
5468 urtwn_write_1(sc, 0x15, 0xe9);
5470 usbd_transfer_start(sc->sc_xfer[URTWN_BULK_RX]);
5472 sc->sc_flags |= URTWN_RUNNING;
5474 callout_reset(&sc->sc_watchdog_ch, hz, urtwn_watchdog, sc);
5476 if (usb_err != USB_ERR_NORMAL_COMPLETION)
5485 urtwn_stop(struct urtwn_softc *sc)
5489 if (!(sc->sc_flags & URTWN_RUNNING)) {
5494 sc->sc_flags &= ~(URTWN_RUNNING | URTWN_FW_LOADED |
5495 URTWN_TEMP_MEASURED);
5496 sc->thcal_lctemp = 0;
5497 callout_stop(&sc->sc_watchdog_ch);
5499 urtwn_abort_xfers(sc);
5500 urtwn_drain_mbufq(sc);
5501 urtwn_power_off(sc);
5506 urtwn_abort_xfers(struct urtwn_softc *sc)
5510 URTWN_ASSERT_LOCKED(sc);
5512 /* abort any pending transfers */
5513 for (i = 0; i < URTWN_N_TRANSFER; i++)
5514 usbd_transfer_stop(sc->sc_xfer[i]);
5518 urtwn_raw_xmit(struct ieee80211_node *ni, struct mbuf *m,
5519 const struct ieee80211_bpf_params *params)
5521 struct ieee80211com *ic = ni->ni_ic;
5522 struct urtwn_softc *sc = ic->ic_softc;
5523 struct urtwn_data *bf;
5526 URTWN_DPRINTF(sc, URTWN_DEBUG_XMIT, "%s: called; m=%p\n",
5530 /* prevent management frames from being sent if we're not ready */
5532 if (!(sc->sc_flags & URTWN_RUNNING)) {
5537 bf = urtwn_getbuf(sc);
5543 if (params == NULL) {
5545 * Legacy path; interpret frame contents to decide
5546 * precisely how to send the frame.
5548 error = urtwn_tx_data(sc, ni, m, bf);
5551 * Caller supplied explicit parameters to use in
5552 * sending the frame.
5554 error = urtwn_tx_raw(sc, ni, m, bf, params);
5557 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next);
5562 callout_reset(&sc->sc_watchdog_ch, hz, urtwn_watchdog, sc);
5574 urtwn_ms_delay(struct urtwn_softc *sc)
5576 usb_pause_mtx(&sc->sc_mtx, hz / 1000);
5579 static device_method_t urtwn_methods[] = {
5580 /* Device interface */
5581 DEVMETHOD(device_probe, urtwn_match),
5582 DEVMETHOD(device_attach, urtwn_attach),
5583 DEVMETHOD(device_detach, urtwn_detach),
5588 static driver_t urtwn_driver = {
5591 sizeof(struct urtwn_softc)
5594 static devclass_t urtwn_devclass;
5596 DRIVER_MODULE(urtwn, uhub, urtwn_driver, urtwn_devclass, NULL, NULL);
5597 MODULE_DEPEND(urtwn, usb, 1, 1, 1);
5598 MODULE_DEPEND(urtwn, wlan, 1, 1, 1);
5599 #ifndef URTWN_WITHOUT_UCODE
5600 MODULE_DEPEND(urtwn, firmware, 1, 1, 1);
5602 MODULE_VERSION(urtwn, 1);
5603 #if defined(__DragonFly__)
5604 /* USB_PNP_HOST_INFO() not implemented */
5606 USB_PNP_HOST_INFO(urtwn_devs);