Home | History | Annotate | Line # | Download | only in usb
if_urtw.c revision 1.7
      1 /*	$NetBSD: if_urtw.c,v 1.7 2016/04/23 10:15:31 skrll Exp $	*/
      2 /*	$OpenBSD: if_urtw.c,v 1.39 2011/07/03 15:47:17 matthew Exp $	*/
      3 
      4 /*-
      5  * Copyright (c) 2009 Martynas Venckus <martynas (at) openbsd.org>
      6  * Copyright (c) 2008 Weongyo Jeong <weongyo (at) FreeBSD.org>
      7  *
      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.
     11  *
     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.
     19  */
     20 
     21 #include <sys/cdefs.h>
     22 __KERNEL_RCSID(0, "$NetBSD: if_urtw.c,v 1.7 2016/04/23 10:15:31 skrll Exp $");
     23 
     24 #include <sys/param.h>
     25 #include <sys/sockio.h>
     26 #include <sys/proc.h>
     27 #include <sys/mbuf.h>
     28 #include <sys/kernel.h>
     29 #include <sys/socket.h>
     30 #include <sys/systm.h>
     31 #include <sys/callout.h>
     32 #include <sys/conf.h>
     33 #include <sys/device.h>
     34 #include <sys/module.h>
     35 #include <sys/bus.h>
     36 
     37 #include <machine/endian.h>
     38 #include <net/bpf.h>
     39 #include <net/if.h>
     40 #include <net/if_arp.h>
     41 #include <net/if_dl.h>
     42 #include <net/if_ether.h>
     43 #include <net/if_media.h>
     44 #include <net/if_types.h>
     45 
     46 #include <netinet/in.h>
     47 #include <netinet/in_systm.h>
     48 #include <netinet/in_var.h>
     49 #include <netinet/if_inarp.h>
     50 #include <netinet/ip.h>
     51 
     52 #include <net80211/ieee80211_var.h>
     53 #include <net80211/ieee80211_radiotap.h>
     54 
     55 #include <dev/usb/usb.h>
     56 #include <dev/usb/usbdi.h>
     57 #include <dev/usb/usbdi_util.h>
     58 #include <dev/usb/usbdivar.h>
     59 #include <dev/usb/usbdevs.h>
     60 
     61 #include "if_urtwreg.h"
     62 
     63 #ifdef URTW_DEBUG
     64 #define	DPRINTF(x)	do { if (urtw_debug) printf x; } while (0)
     65 #define	DPRINTFN(n, x)	do { if (urtw_debug >= (n)) printf x; } while (0)
     66 int urtw_debug = 0;
     67 #else
     68 #define	DPRINTF(x)
     69 #define	DPRINTFN(n, x)
     70 #endif
     71 
     72 /*
     73  * Recognized device vendors/products.
     74  */
     75 static const struct urtw_type {
     76 	struct usb_devno	dev;
     77 	uint8_t			rev;
     78 } urtw_devs[] = {
     79 #define	URTW_DEV_RTL8187(v, p)	\
     80 	    { { USB_VENDOR_##v, USB_PRODUCT_##v##_##p }, URTW_HWREV_8187 }
     81 #define	URTW_DEV_RTL8187B(v, p)	\
     82 	    { { USB_VENDOR_##v, USB_PRODUCT_##v##_##p }, URTW_HWREV_8187B }
     83 	/* Realtek RTL8187 devices. */
     84 	URTW_DEV_RTL8187(ASUSTEK,	P5B_WIFI),
     85 	URTW_DEV_RTL8187(DICKSMITH,	RTL8187),
     86 	URTW_DEV_RTL8187(LINKSYS4,	WUSB54GC_2),
     87 	URTW_DEV_RTL8187(LOGITEC,	RTL8187),
     88 	URTW_DEV_RTL8187(NETGEAR,	WG111V2),
     89 	URTW_DEV_RTL8187(REALTEK,	RTL8187),
     90 	URTW_DEV_RTL8187(SITECOMEU,	WL168V1),
     91 	URTW_DEV_RTL8187(SPHAIRON,	RTL8187),
     92 	URTW_DEV_RTL8187(SURECOM,	EP9001G2A),
     93 	/* Realtek RTL8187B devices. */
     94 	URTW_DEV_RTL8187B(BELKIN,	F5D7050E),
     95 	URTW_DEV_RTL8187B(NETGEAR,	WG111V3),
     96 	URTW_DEV_RTL8187B(REALTEK,	RTL8187B_0),
     97 	URTW_DEV_RTL8187B(REALTEK,	RTL8187B_1),
     98 	URTW_DEV_RTL8187B(REALTEK,	RTL8187B_2),
     99 	URTW_DEV_RTL8187B(SITECOMEU,	WL168V4)
    100 #undef	URTW_DEV_RTL8187
    101 #undef	URTW_DEV_RTL8187B
    102 };
    103 #define	urtw_lookup(v, p)	\
    104 	    ((const struct urtw_type *)usb_lookup(urtw_devs, v, p))
    105 
    106 /*
    107  * Helper read/write macros.
    108  */
    109 #define urtw_read8_m(sc, val, data)	do {			\
    110 	error = urtw_read8_c(sc, val, data, 0);			\
    111 	if (error != 0)						\
    112 		goto fail;					\
    113 } while (0)
    114 #define urtw_read8_idx_m(sc, val, data, idx)	do {		\
    115 	error = urtw_read8_c(sc, val, data, idx);		\
    116 	if (error != 0)						\
    117 		goto fail;					\
    118 } while (0)
    119 #define urtw_write8_m(sc, val, data)	do {			\
    120 	error = urtw_write8_c(sc, val, data, 0);		\
    121 	if (error != 0)						\
    122 		goto fail;					\
    123 } while (0)
    124 #define urtw_write8_idx_m(sc, val, data, idx)	do {		\
    125 	error = urtw_write8_c(sc, val, data, idx);		\
    126 	if (error != 0)						\
    127 		goto fail;					\
    128 } while (0)
    129 #define urtw_read16_m(sc, val, data)	do {			\
    130 	error = urtw_read16_c(sc, val, data, 0);		\
    131 	if (error != 0)						\
    132 		goto fail;					\
    133 } while (0)
    134 #define urtw_read16_idx_m(sc, val, data, idx)	do {		\
    135 	error = urtw_read16_c(sc, val, data, idx);		\
    136 	if (error != 0)						\
    137 		goto fail;					\
    138 } while (0)
    139 #define urtw_write16_m(sc, val, data)	do {			\
    140 	error = urtw_write16_c(sc, val, data, 0);		\
    141 	if (error != 0)						\
    142 		goto fail;					\
    143 } while (0)
    144 #define urtw_write16_idx_m(sc, val, data, idx)	do {		\
    145 	error = urtw_write16_c(sc, val, data, idx);		\
    146 	if (error != 0)						\
    147 		goto fail;					\
    148 } while (0)
    149 #define urtw_read32_m(sc, val, data)	do {			\
    150 	error = urtw_read32_c(sc, val, data, 0);		\
    151 	if (error != 0)						\
    152 		goto fail;					\
    153 } while (0)
    154 #define urtw_read32_idx_m(sc, val, data, idx)	do {		\
    155 	error = urtw_read32_c(sc, val, data, idx);		\
    156 	if (error != 0)						\
    157 		goto fail;					\
    158 } while (0)
    159 #define urtw_write32_m(sc, val, data)	do {			\
    160 	error = urtw_write32_c(sc, val, data, 0);		\
    161 	if (error != 0)						\
    162 		goto fail;					\
    163 } while (0)
    164 #define urtw_write32_idx_m(sc, val, data, idx)	do {		\
    165 	error = urtw_write32_c(sc, val, data, idx);		\
    166 	if (error != 0)						\
    167 		goto fail;					\
    168 } while (0)
    169 #define urtw_8187_write_phy_ofdm(sc, val, data)	do {		\
    170 	error = urtw_8187_write_phy_ofdm_c(sc, val, data);	\
    171 	if (error != 0)						\
    172 		goto fail;					\
    173 } while (0)
    174 #define urtw_8187_write_phy_cck(sc, val, data)	do {		\
    175 	error = urtw_8187_write_phy_cck_c(sc, val, data);	\
    176 	if (error != 0)						\
    177 		goto fail;					\
    178 } while (0)
    179 #define urtw_8225_write(sc, val, data)	do {			\
    180 	error = urtw_8225_write_c(sc, val, data);		\
    181 	if (error != 0)						\
    182 		goto fail;					\
    183 } while (0)
    184 
    185 struct urtw_pair {
    186 	uint32_t	reg;
    187 	uint32_t	val;
    188 };
    189 
    190 struct urtw_pair_idx {
    191 	uint8_t		reg;
    192 	uint8_t		val;
    193 	uint8_t		idx;
    194 };
    195 
    196 static struct urtw_pair_idx urtw_8187b_regtbl[] = {
    197 	{ 0xf0, 0x32, 0 }, { 0xf1, 0x32, 0 }, { 0xf2, 0x00, 0 },
    198 	{ 0xf3, 0x00, 0 }, { 0xf4, 0x32, 0 }, { 0xf5, 0x43, 0 },
    199 	{ 0xf6, 0x00, 0 }, { 0xf7, 0x00, 0 }, { 0xf8, 0x46, 0 },
    200 	{ 0xf9, 0xa4, 0 }, { 0xfa, 0x00, 0 }, { 0xfb, 0x00, 0 },
    201 	{ 0xfc, 0x96, 0 }, { 0xfd, 0xa4, 0 }, { 0xfe, 0x00, 0 },
    202 	{ 0xff, 0x00, 0 },
    203 
    204 	{ 0x58, 0x4b, 1 }, { 0x59, 0x00, 1 }, { 0x5a, 0x4b, 1 },
    205 	{ 0x5b, 0x00, 1 }, { 0x60, 0x4b, 1 }, { 0x61, 0x09, 1 },
    206 	{ 0x62, 0x4b, 1 }, { 0x63, 0x09, 1 }, { 0xce, 0x0f, 1 },
    207 	{ 0xcf, 0x00, 1 }, { 0xe0, 0xff, 1 }, { 0xe1, 0x0f, 1 },
    208 	{ 0xe2, 0x00, 1 }, { 0xf0, 0x4e, 1 }, { 0xf1, 0x01, 1 },
    209 	{ 0xf2, 0x02, 1 }, { 0xf3, 0x03, 1 }, { 0xf4, 0x04, 1 },
    210 	{ 0xf5, 0x05, 1 }, { 0xf6, 0x06, 1 }, { 0xf7, 0x07, 1 },
    211 	{ 0xf8, 0x08, 1 },
    212 
    213 	{ 0x4e, 0x00, 2 }, { 0x0c, 0x04, 2 }, { 0x21, 0x61, 2 },
    214 	{ 0x22, 0x68, 2 }, { 0x23, 0x6f, 2 }, { 0x24, 0x76, 2 },
    215 	{ 0x25, 0x7d, 2 }, { 0x26, 0x84, 2 }, { 0x27, 0x8d, 2 },
    216 	{ 0x4d, 0x08, 2 }, { 0x50, 0x05, 2 }, { 0x51, 0xf5, 2 },
    217 	{ 0x52, 0x04, 2 }, { 0x53, 0xa0, 2 }, { 0x54, 0x1f, 2 },
    218 	{ 0x55, 0x23, 2 }, { 0x56, 0x45, 2 }, { 0x57, 0x67, 2 },
    219 	{ 0x58, 0x08, 2 }, { 0x59, 0x08, 2 }, { 0x5a, 0x08, 2 },
    220 	{ 0x5b, 0x08, 2 }, { 0x60, 0x08, 2 }, { 0x61, 0x08, 2 },
    221 	{ 0x62, 0x08, 2 }, { 0x63, 0x08, 2 }, { 0x64, 0xcf, 2 },
    222 	{ 0x72, 0x56, 2 }, { 0x73, 0x9a, 2 },
    223 
    224 	{ 0x34, 0xf0, 0 }, { 0x35, 0x0f, 0 }, { 0x5b, 0x40, 0 },
    225 	{ 0x84, 0x88, 0 }, { 0x85, 0x24, 0 }, { 0x88, 0x54, 0 },
    226 	{ 0x8b, 0xb8, 0 }, { 0x8c, 0x07, 0 }, { 0x8d, 0x00, 0 },
    227 	{ 0x94, 0x1b, 0 }, { 0x95, 0x12, 0 }, { 0x96, 0x00, 0 },
    228 	{ 0x97, 0x06, 0 }, { 0x9d, 0x1a, 0 }, { 0x9f, 0x10, 0 },
    229 	{ 0xb4, 0x22, 0 }, { 0xbe, 0x80, 0 }, { 0xdb, 0x00, 0 },
    230 	{ 0xee, 0x00, 0 }, { 0x91, 0x03, 0 },
    231 
    232 	{ 0x4c, 0x00, 2 }, { 0x9f, 0x00, 3 }, { 0x8c, 0x01, 0 },
    233 	{ 0x8d, 0x10, 0 }, { 0x8e, 0x08, 0 }, { 0x8f, 0x00, 0 }
    234 };
    235 
    236 static uint8_t urtw_8225_agc[] = {
    237 	0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9d, 0x9c, 0x9b,
    238 	0x9a, 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90,
    239 	0x8f, 0x8e, 0x8d, 0x8c, 0x8b, 0x8a, 0x89, 0x88, 0x87, 0x86, 0x85,
    240 	0x84, 0x83, 0x82, 0x81, 0x80, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a,
    241 	0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30, 0x2f,
    242 	0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24,
    243 	0x23, 0x22, 0x21, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19,
    244 	0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e,
    245 	0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03,
    246 	0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
    247 	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
    248 	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
    249 };
    250 
    251 static uint32_t urtw_8225_channel[] = {
    252 	0x0000,		/* dummy channel 0 */
    253 	0x085c,		/* 1 */
    254 	0x08dc,		/* 2 */
    255 	0x095c,		/* 3 */
    256 	0x09dc,		/* 4 */
    257 	0x0a5c,		/* 5 */
    258 	0x0adc,		/* 6 */
    259 	0x0b5c,		/* 7 */
    260 	0x0bdc,		/* 8 */
    261 	0x0c5c,		/* 9 */
    262 	0x0cdc,		/* 10 */
    263 	0x0d5c,		/* 11 */
    264 	0x0ddc,		/* 12 */
    265 	0x0e5c,		/* 13 */
    266 	0x0f72,		/* 14 */
    267 };
    268 
    269 static uint8_t urtw_8225_gain[] = {
    270 	0x23, 0x88, 0x7c, 0xa5,		/* -82dbm */
    271 	0x23, 0x88, 0x7c, 0xb5,		/* -82dbm */
    272 	0x23, 0x88, 0x7c, 0xc5,		/* -82dbm */
    273 	0x33, 0x80, 0x79, 0xc5,		/* -78dbm */
    274 	0x43, 0x78, 0x76, 0xc5,		/* -74dbm */
    275 	0x53, 0x60, 0x73, 0xc5,		/* -70dbm */
    276 	0x63, 0x58, 0x70, 0xc5,		/* -66dbm */
    277 };
    278 
    279 static struct urtw_pair urtw_8225_rf_part1[] = {
    280 	{ 0x00, 0x0067 }, { 0x01, 0x0fe0 }, { 0x02, 0x044d }, { 0x03, 0x0441 },
    281 	{ 0x04, 0x0486 }, { 0x05, 0x0bc0 }, { 0x06, 0x0ae6 }, { 0x07, 0x082a },
    282 	{ 0x08, 0x001f }, { 0x09, 0x0334 }, { 0x0a, 0x0fd4 }, { 0x0b, 0x0391 },
    283 	{ 0x0c, 0x0050 }, { 0x0d, 0x06db }, { 0x0e, 0x0029 }, { 0x0f, 0x0914 }
    284 };
    285 
    286 static struct urtw_pair urtw_8225_rf_part2[] = {
    287 	{ 0x00, 0x01 }, { 0x01, 0x02 }, { 0x02, 0x42 }, { 0x03, 0x00 },
    288 	{ 0x04, 0x00 }, { 0x05, 0x00 }, { 0x06, 0x40 }, { 0x07, 0x00 },
    289 	{ 0x08, 0x40 }, { 0x09, 0xfe }, { 0x0a, 0x09 }, { 0x0b, 0x80 },
    290 	{ 0x0c, 0x01 }, { 0x0e, 0xd3 }, { 0x0f, 0x38 }, { 0x10, 0x84 },
    291 	{ 0x11, 0x06 }, { 0x12, 0x20 }, { 0x13, 0x20 }, { 0x14, 0x00 },
    292 	{ 0x15, 0x40 }, { 0x16, 0x00 }, { 0x17, 0x40 }, { 0x18, 0xef },
    293 	{ 0x19, 0x19 }, { 0x1a, 0x20 }, { 0x1b, 0x76 }, { 0x1c, 0x04 },
    294 	{ 0x1e, 0x95 }, { 0x1f, 0x75 }, { 0x20, 0x1f }, { 0x21, 0x27 },
    295 	{ 0x22, 0x16 }, { 0x24, 0x46 }, { 0x25, 0x20 }, { 0x26, 0x90 },
    296 	{ 0x27, 0x88 }
    297 };
    298 
    299 static struct urtw_pair urtw_8225_rf_part3[] = {
    300 	{ 0x00, 0x98 }, { 0x03, 0x20 }, { 0x04, 0x7e }, { 0x05, 0x12 },
    301 	{ 0x06, 0xfc }, { 0x07, 0x78 }, { 0x08, 0x2e }, { 0x10, 0x9b },
    302 	{ 0x11, 0x88 }, { 0x12, 0x47 }, { 0x13, 0xd0 }, { 0x19, 0x00 },
    303 	{ 0x1a, 0xa0 }, { 0x1b, 0x08 }, { 0x40, 0x86 }, { 0x41, 0x8d },
    304 	{ 0x42, 0x15 }, { 0x43, 0x18 }, { 0x44, 0x1f }, { 0x45, 0x1e },
    305 	{ 0x46, 0x1a }, { 0x47, 0x15 }, { 0x48, 0x10 }, { 0x49, 0x0a },
    306 	{ 0x4a, 0x05 }, { 0x4b, 0x02 }, { 0x4c, 0x05 }
    307 };
    308 
    309 static uint16_t urtw_8225_rxgain[] = {
    310 	0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409,
    311 	0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541,
    312 	0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583,
    313 	0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644,
    314 	0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688,
    315 	0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745,
    316 	0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789,
    317 	0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793,
    318 	0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d,
    319 	0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9,
    320 	0x07aa, 0x07ab, 0x07ac, 0x07ad, 0x07b0, 0x07b1, 0x07b2, 0x07b3,
    321 	0x07b4, 0x07b5, 0x07b8, 0x07b9, 0x07ba, 0x07bb, 0x07bb
    322 };
    323 
    324 static uint8_t urtw_8225_threshold[] = {
    325 	0x8d, 0x8d, 0x8d, 0x8d, 0x9d, 0xad, 0xbd
    326 };
    327 
    328 static uint8_t urtw_8225_tx_gain_cck_ofdm[] = {
    329 	0x02, 0x06, 0x0e, 0x1e, 0x3e, 0x7e
    330 };
    331 
    332 static uint8_t urtw_8225_txpwr_cck[] = {
    333 	0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02,
    334 	0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02,
    335 	0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02,
    336 	0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02,
    337 	0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03,
    338 	0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03
    339 };
    340 
    341 static uint8_t urtw_8225_txpwr_cck_ch14[] = {
    342 	0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00,
    343 	0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00,
    344 	0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00,
    345 	0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00,
    346 	0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00,
    347 	0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00
    348 };
    349 
    350 static uint8_t urtw_8225_txpwr_ofdm[] = {
    351 	0x80, 0x90, 0xa2, 0xb5, 0xcb, 0xe4
    352 };
    353 
    354 static uint8_t urtw_8225v2_agc[] = {
    355 	0x5e, 0x5e, 0x5e, 0x5e, 0x5d, 0x5b, 0x59, 0x57,
    356 	0x55, 0x53, 0x51, 0x4f, 0x4d, 0x4b, 0x49, 0x47,
    357 	0x45, 0x43, 0x41, 0x3f, 0x3d, 0x3b, 0x39, 0x37,
    358 	0x35, 0x33, 0x31, 0x2f, 0x2d, 0x2b, 0x29, 0x27,
    359 	0x25, 0x23, 0x21, 0x1f, 0x1d, 0x1b, 0x19, 0x17,
    360 	0x15, 0x13, 0x11, 0x0f, 0x0d, 0x0b, 0x09, 0x07,
    361 	0x05, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
    362 	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
    363 	0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19,
    364 	0x19, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26,
    365 	0x26, 0x27, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2a,
    366 	0x2a, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2d,
    367 	0x2d, 0x2d, 0x2d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f,
    368 	0x2f, 0x2f, 0x30, 0x30, 0x31, 0x31, 0x31, 0x31,
    369 	0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31,
    370 	0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31
    371 };
    372 
    373 static uint8_t urtw_8225v2_ofdm[] = {
    374 	0x10, 0x0d, 0x01, 0x00, 0x14, 0xfb, 0xfb, 0x60,
    375 	0x00, 0x60, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00,
    376 	0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0xa8, 0x26,
    377 	0x32, 0x33, 0x07, 0xa5, 0x6f, 0x55, 0xc8, 0xb3,
    378 	0x0a, 0xe1, 0x2c, 0x8a, 0x86, 0x83, 0x34, 0x0f,
    379 	0x4f, 0x24, 0x6f, 0xc2, 0x6b, 0x40, 0x80, 0x00,
    380 	0xc0, 0xc1, 0x58, 0xf1, 0x00, 0xe4, 0x90, 0x3e,
    381 	0x6d, 0x3c, 0xfb, 0x07
    382 };
    383 
    384 static uint8_t urtw_8225v2_gain_bg[] = {
    385 	0x23, 0x15, 0xa5,		/* -82-1dbm */
    386 	0x23, 0x15, 0xb5,		/* -82-2dbm */
    387 	0x23, 0x15, 0xc5,		/* -82-3dbm */
    388 	0x33, 0x15, 0xc5,		/* -78dbm */
    389 	0x43, 0x15, 0xc5,		/* -74dbm */
    390 	0x53, 0x15, 0xc5,		/* -70dbm */
    391 	0x63, 0x15, 0xc5,		/* -66dbm */
    392 };
    393 
    394 static struct urtw_pair urtw_8225v2_rf_part1[] = {
    395 	{ 0x00, 0x02bf }, { 0x01, 0x0ee0 }, { 0x02, 0x044d }, { 0x03, 0x0441 },
    396 	{ 0x04, 0x08c3 }, { 0x05, 0x0c72 }, { 0x06, 0x00e6 }, { 0x07, 0x082a },
    397 	{ 0x08, 0x003f }, { 0x09, 0x0335 }, { 0x0a, 0x09d4 }, { 0x0b, 0x07bb },
    398 	{ 0x0c, 0x0850 }, { 0x0d, 0x0cdf }, { 0x0e, 0x002b }, { 0x0f, 0x0114 }
    399 };
    400 
    401 static struct urtw_pair urtw_8225v2_rf_part2[] = {
    402 	{ 0x00, 0x01 }, { 0x01, 0x02 }, { 0x02, 0x42 }, { 0x03, 0x00 },
    403 	{ 0x04, 0x00 }, { 0x05, 0x00 }, { 0x06, 0x40 }, { 0x07, 0x00 },
    404 	{ 0x08, 0x40 }, { 0x09, 0xfe }, { 0x0a, 0x08 }, { 0x0b, 0x80 },
    405 	{ 0x0c, 0x01 }, { 0x0d, 0x43 }, { 0x0e, 0xd3 }, { 0x0f, 0x38 },
    406 	{ 0x10, 0x84 }, { 0x11, 0x07 }, { 0x12, 0x20 }, { 0x13, 0x20 },
    407 	{ 0x14, 0x00 }, { 0x15, 0x40 }, { 0x16, 0x00 }, { 0x17, 0x40 },
    408 	{ 0x18, 0xef }, { 0x19, 0x19 }, { 0x1a, 0x20 }, { 0x1b, 0x15 },
    409 	{ 0x1c, 0x04 }, { 0x1d, 0xc5 }, { 0x1e, 0x95 }, { 0x1f, 0x75 },
    410 	{ 0x20, 0x1f }, { 0x21, 0x17 }, { 0x22, 0x16 }, { 0x23, 0x80 },
    411 	{ 0x24, 0x46 }, { 0x25, 0x00 }, { 0x26, 0x90 }, { 0x27, 0x88 }
    412 };
    413 
    414 static struct urtw_pair urtw_8225v2_rf_part3[] = {
    415 	{ 0x00, 0x98 }, { 0x03, 0x20 }, { 0x04, 0x7e }, { 0x05, 0x12 },
    416 	{ 0x06, 0xfc }, { 0x07, 0x78 }, { 0x08, 0x2e }, { 0x09, 0x11 },
    417 	{ 0x0a, 0x17 }, { 0x0b, 0x11 }, { 0x10, 0x9b }, { 0x11, 0x88 },
    418 	{ 0x12, 0x47 }, { 0x13, 0xd0 }, { 0x19, 0x00 }, { 0x1a, 0xa0 },
    419 	{ 0x1b, 0x08 }, { 0x1d, 0x00 }, { 0x40, 0x86 }, { 0x41, 0x9d },
    420 	{ 0x42, 0x15 }, { 0x43, 0x18 }, { 0x44, 0x36 }, { 0x45, 0x35 },
    421 	{ 0x46, 0x2e }, { 0x47, 0x25 }, { 0x48, 0x1c }, { 0x49, 0x12 },
    422 	{ 0x4a, 0x09 }, { 0x4b, 0x04 }, { 0x4c, 0x05 }
    423 };
    424 
    425 static uint16_t urtw_8225v2_rxgain[] = {
    426 	0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409,
    427 	0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541,
    428 	0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583,
    429 	0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644,
    430 	0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688,
    431 	0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745,
    432 	0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789,
    433 	0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793,
    434 	0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d,
    435 	0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9,
    436 	0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3,
    437 	0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb
    438 };
    439 
    440 static uint8_t urtw_8225v2_tx_gain_cck_ofdm[] = {
    441 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
    442 	0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
    443 	0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
    444 	0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
    445 	0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
    446 	0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23
    447 };
    448 
    449 static uint8_t urtw_8225v2_txpwr_cck[] = {
    450 	0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04,
    451 	0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03,
    452 	0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03,
    453 	0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03
    454 };
    455 
    456 static uint8_t urtw_8225v2_txpwr_cck_ch14[] = {
    457 	0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00,
    458 	0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00,
    459 	0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00,
    460 	0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00
    461 };
    462 
    463 static struct urtw_pair urtw_8225v2_b_rf[] = {
    464 	{ 0x00, 0x00b7 }, { 0x01, 0x0ee0 }, { 0x02, 0x044d }, { 0x03, 0x0441 },
    465 	{ 0x04, 0x08c3 }, { 0x05, 0x0c72 }, { 0x06, 0x00e6 }, { 0x07, 0x082a },
    466 	{ 0x08, 0x003f }, { 0x09, 0x0335 }, { 0x0a, 0x09d4 }, { 0x0b, 0x07bb },
    467 	{ 0x0c, 0x0850 }, { 0x0d, 0x0cdf }, { 0x0e, 0x002b }, { 0x0f, 0x0114 },
    468 	{ 0x00, 0x01b7 }
    469 };
    470 
    471 static struct urtw_pair urtw_ratetable[] = {
    472 	{  2,  0 }, {   4,  1 }, { 11, 2 }, { 12, 4 }, { 18, 5 },
    473 	{ 22,  3 }, {  24,  6 }, { 36, 7 }, { 48, 8 }, { 72, 9 },
    474 	{ 96, 10 }, { 108, 11 }
    475 };
    476 
    477 int		urtw_init(struct ifnet *);
    478 void		urtw_stop(struct ifnet *, int);
    479 int		urtw_ioctl(struct ifnet *, u_long, void *);
    480 void		urtw_start(struct ifnet *);
    481 int		urtw_alloc_rx_data_list(struct urtw_softc *);
    482 void		urtw_free_rx_data_list(struct urtw_softc *);
    483 int		urtw_alloc_tx_data_list(struct urtw_softc *);
    484 void		urtw_free_tx_data_list(struct urtw_softc *);
    485 void		urtw_rxeof(struct usbd_xfer *, void *,
    486 		    usbd_status);
    487 int		urtw_tx_start(struct urtw_softc *,
    488 		    struct ieee80211_node *, struct mbuf *, int);
    489 void		urtw_txeof_low(struct usbd_xfer *, void *,
    490 		    usbd_status);
    491 void		urtw_txeof_normal(struct usbd_xfer *, void *,
    492 		    usbd_status);
    493 void		urtw_next_scan(void *);
    494 void		urtw_task(void *);
    495 void		urtw_ledusbtask(void *);
    496 void		urtw_ledtask(void *);
    497 int		urtw_media_change(struct ifnet *);
    498 int		urtw_newstate(struct ieee80211com *, enum ieee80211_state, int);
    499 void		urtw_watchdog(struct ifnet *);
    500 void		urtw_set_chan(struct urtw_softc *, struct ieee80211_channel *);
    501 int		urtw_isbmode(uint16_t);
    502 uint16_t	urtw_rate2rtl(int);
    503 uint16_t	urtw_rtl2rate(int);
    504 usbd_status	urtw_set_rate(struct urtw_softc *);
    505 usbd_status	urtw_update_msr(struct urtw_softc *);
    506 usbd_status	urtw_read8_c(struct urtw_softc *, int, uint8_t *, uint8_t);
    507 usbd_status	urtw_read16_c(struct urtw_softc *, int, uint16_t *, uint8_t);
    508 usbd_status	urtw_read32_c(struct urtw_softc *, int, uint32_t *, uint8_t);
    509 usbd_status	urtw_write8_c(struct urtw_softc *, int, uint8_t, uint8_t);
    510 usbd_status	urtw_write16_c(struct urtw_softc *, int, uint16_t, uint8_t);
    511 usbd_status	urtw_write32_c(struct urtw_softc *, int, uint32_t, uint8_t);
    512 usbd_status	urtw_eprom_cs(struct urtw_softc *, int);
    513 usbd_status	urtw_eprom_ck(struct urtw_softc *);
    514 usbd_status	urtw_eprom_sendbits(struct urtw_softc *, int16_t *,
    515 		    int);
    516 usbd_status	urtw_eprom_read32(struct urtw_softc *, uint32_t,
    517 		    uint32_t *);
    518 usbd_status	urtw_eprom_readbit(struct urtw_softc *, int16_t *);
    519 usbd_status	urtw_eprom_writebit(struct urtw_softc *, int16_t);
    520 usbd_status	urtw_get_macaddr(struct urtw_softc *);
    521 usbd_status	urtw_get_txpwr(struct urtw_softc *);
    522 usbd_status	urtw_get_rfchip(struct urtw_softc *);
    523 usbd_status	urtw_led_init(struct urtw_softc *);
    524 usbd_status	urtw_8185_rf_pins_enable(struct urtw_softc *);
    525 usbd_status	urtw_8185_tx_antenna(struct urtw_softc *, uint8_t);
    526 usbd_status	urtw_8187_write_phy(struct urtw_softc *, uint8_t, uint32_t);
    527 usbd_status	urtw_8187_write_phy_ofdm_c(struct urtw_softc *, uint8_t,
    528 		    uint32_t);
    529 usbd_status	urtw_8187_write_phy_cck_c(struct urtw_softc *, uint8_t,
    530 		    uint32_t);
    531 usbd_status	urtw_8225_setgain(struct urtw_softc *, int16_t);
    532 usbd_status	urtw_8225_usb_init(struct urtw_softc *);
    533 usbd_status	urtw_8225_write_c(struct urtw_softc *, uint8_t, uint16_t);
    534 usbd_status	urtw_8225_write_s16(struct urtw_softc *, uint8_t, int,
    535 		    uint16_t);
    536 usbd_status	urtw_8225_read(struct urtw_softc *, uint8_t, uint32_t *);
    537 usbd_status	urtw_8225_rf_init(struct urtw_rf *);
    538 usbd_status	urtw_8225_rf_set_chan(struct urtw_rf *, int);
    539 usbd_status	urtw_8225_rf_set_sens(struct urtw_rf *);
    540 usbd_status	urtw_8225_set_txpwrlvl(struct urtw_softc *, int);
    541 usbd_status	urtw_8225v2_rf_init(struct urtw_rf *);
    542 usbd_status	urtw_8225v2_rf_set_chan(struct urtw_rf *, int);
    543 usbd_status	urtw_8225v2_set_txpwrlvl(struct urtw_softc *, int);
    544 usbd_status	urtw_8225v2_setgain(struct urtw_softc *, int16_t);
    545 usbd_status	urtw_8225_isv2(struct urtw_softc *, int *);
    546 usbd_status	urtw_read8e(struct urtw_softc *, int, uint8_t *);
    547 usbd_status	urtw_write8e(struct urtw_softc *, int, uint8_t);
    548 usbd_status	urtw_8180_set_anaparam(struct urtw_softc *, uint32_t);
    549 usbd_status	urtw_8185_set_anaparam2(struct urtw_softc *, uint32_t);
    550 usbd_status	urtw_open_pipes(struct urtw_softc *);
    551 usbd_status	urtw_close_pipes(struct urtw_softc *);
    552 usbd_status	urtw_intr_enable(struct urtw_softc *);
    553 usbd_status	urtw_intr_disable(struct urtw_softc *);
    554 usbd_status	urtw_reset(struct urtw_softc *);
    555 usbd_status	urtw_led_on(struct urtw_softc *, int);
    556 usbd_status	urtw_led_ctl(struct urtw_softc *, int);
    557 usbd_status	urtw_led_blink(struct urtw_softc *);
    558 usbd_status	urtw_led_mode0(struct urtw_softc *, int);
    559 usbd_status	urtw_led_mode1(struct urtw_softc *, int);
    560 usbd_status	urtw_led_mode2(struct urtw_softc *, int);
    561 usbd_status	urtw_led_mode3(struct urtw_softc *, int);
    562 usbd_status	urtw_rx_setconf(struct urtw_softc *);
    563 usbd_status	urtw_rx_enable(struct urtw_softc *);
    564 usbd_status	urtw_tx_enable(struct urtw_softc *);
    565 usbd_status	urtw_8187b_update_wmm(struct urtw_softc *);
    566 usbd_status	urtw_8187b_reset(struct urtw_softc *);
    567 int		urtw_8187b_init(struct ifnet *);
    568 usbd_status	urtw_8225v2_b_config_mac(struct urtw_softc *);
    569 usbd_status	urtw_8225v2_b_init_rfe(struct urtw_softc *);
    570 usbd_status	urtw_8225v2_b_update_chan(struct urtw_softc *);
    571 usbd_status	urtw_8225v2_b_rf_init(struct urtw_rf *);
    572 usbd_status	urtw_8225v2_b_rf_set_chan(struct urtw_rf *, int);
    573 usbd_status	urtw_8225v2_b_set_txpwrlvl(struct urtw_softc *, int);
    574 int		urtw_set_bssid(struct urtw_softc *, const uint8_t *);
    575 int		urtw_set_macaddr(struct urtw_softc *, const uint8_t *);
    576 
    577 int urtw_match(device_t, cfdata_t, void *);
    578 void urtw_attach(device_t, device_t, void *);
    579 int urtw_detach(device_t, int);
    580 int urtw_activate(device_t, enum devact);
    581 
    582 CFATTACH_DECL_NEW(urtw, sizeof(struct urtw_softc),
    583 	urtw_match,
    584 	urtw_attach,
    585 	urtw_detach,
    586 	urtw_activate
    587 );
    588 
    589 int
    590 urtw_match(device_t parent, cfdata_t match, void *aux)
    591 {
    592 	struct usb_attach_arg *uaa = aux;
    593 
    594 	return urtw_lookup(uaa->uaa_vendor, uaa->uaa_product) != NULL ?
    595 	    UMATCH_VENDOR_PRODUCT : UMATCH_NONE;
    596 }
    597 
    598 void
    599 urtw_attach(device_t parent, device_t self, void *aux)
    600 {
    601 	struct urtw_softc *sc = device_private(self);
    602 	struct usb_attach_arg *uaa = aux;
    603 	struct ieee80211com *ic = &sc->sc_ic;
    604 	struct ifnet *ifp = &sc->sc_if;
    605 	usbd_status error;
    606 	uint8_t data8;
    607 	uint32_t data;
    608 	int i;
    609 
    610 	sc->sc_dev = self;
    611 	sc->sc_udev = uaa->uaa_device;
    612 	sc->sc_hwrev = urtw_lookup(uaa->uaa_vendor, uaa->uaa_product)->rev;
    613 
    614 	printf(": ");
    615 
    616 	if (sc->sc_hwrev & URTW_HWREV_8187) {
    617 		urtw_read32_m(sc, URTW_TX_CONF, &data);
    618 		data &= URTW_TX_HWREV_MASK;
    619 		switch (data) {
    620 		case URTW_TX_HWREV_8187_D:
    621 			sc->sc_hwrev |= URTW_HWREV_8187_D;
    622 			printf("RTL8187 rev D");
    623 			break;
    624 		case URTW_TX_HWREV_8187B_D:
    625 			/*
    626 			 * Detect Realtek RTL8187B devices that use
    627 			 * USB IDs of RTL8187.
    628 			 */
    629 			sc->sc_hwrev = URTW_HWREV_8187B | URTW_HWREV_8187B_B;
    630 			printf("RTL8187B rev B (early)");
    631 			break;
    632 		default:
    633 			sc->sc_hwrev |= URTW_HWREV_8187_B;
    634 			printf("RTL8187 rev 0x%02x", data >> 25);
    635 			break;
    636 		}
    637 	} else {
    638 		/* RTL8187B hwrev register. */
    639 		urtw_read8_m(sc, URTW_8187B_HWREV, &data8);
    640 		switch (data8) {
    641 		case URTW_8187B_HWREV_8187B_B:
    642 			sc->sc_hwrev |= URTW_HWREV_8187B_B;
    643 			printf("RTL8187B rev B");
    644 			break;
    645 		case URTW_8187B_HWREV_8187B_D:
    646 			sc->sc_hwrev |= URTW_HWREV_8187B_D;
    647 			printf("RTL8187B rev D");
    648 			break;
    649 		case URTW_8187B_HWREV_8187B_E:
    650 			sc->sc_hwrev |= URTW_HWREV_8187B_E;
    651 			printf("RTL8187B rev E");
    652 			break;
    653 		default:
    654 			sc->sc_hwrev |= URTW_HWREV_8187B_B;
    655 			printf("RTL8187B rev 0x%02x", data8);
    656 			break;
    657 		}
    658 	}
    659 
    660 	urtw_read32_m(sc, URTW_RX, &data);
    661 	sc->sc_epromtype = (data & URTW_RX_9356SEL) ? URTW_EEPROM_93C56 :
    662 	    URTW_EEPROM_93C46;
    663 
    664 	error = urtw_get_rfchip(sc);
    665 	if (error != 0)
    666 		goto fail;
    667 	error = urtw_get_macaddr(sc);
    668 	if (error != 0)
    669 		goto fail;
    670 	error = urtw_get_txpwr(sc);
    671 	if (error != 0)
    672 		goto fail;
    673 	error = urtw_led_init(sc);		/* XXX incompleted */
    674 	if (error != 0)
    675 		goto fail;
    676 
    677 	sc->sc_rts_retry = URTW_DEFAULT_RTS_RETRY;
    678 	sc->sc_tx_retry = URTW_DEFAULT_TX_RETRY;
    679 	sc->sc_currate = 3;
    680 	/* XXX for what? */
    681 	sc->sc_preamble_mode = 2;
    682 
    683 	usb_init_task(&sc->sc_task, urtw_task, sc, 0);
    684 	usb_init_task(&sc->sc_ledtask, urtw_ledusbtask, sc, 0);
    685 	callout_init(&sc->scan_to, 0);
    686 	callout_setfunc(&sc->scan_to, urtw_next_scan, sc);
    687 	callout_init(&sc->sc_led_ch, 0);
    688 	callout_setfunc(&sc->sc_led_ch, urtw_ledtask, sc);
    689 
    690 	ic->ic_ifp = ifp;
    691 	ic->ic_phytype = IEEE80211_T_OFDM;	/* not only, but not used */
    692 	ic->ic_opmode = IEEE80211_M_STA;	/* default to BSS mode */
    693 	ic->ic_state = IEEE80211_S_INIT;
    694 
    695 	/* set device capabilities */
    696 	ic->ic_caps =
    697 	    IEEE80211_C_MONITOR |	/* monitor mode supported */
    698 	    IEEE80211_C_TXPMGT |	/* tx power management */
    699 	    IEEE80211_C_SHPREAMBLE |	/* short preamble supported */
    700 	    IEEE80211_C_SHSLOT |	/* short slot time supported */
    701 	    IEEE80211_C_WEP |		/* s/w WEP */
    702 	    IEEE80211_C_WPA;		/* WPA/RSN */
    703 
    704 	/* set supported .11b and .11g rates */
    705 	ic->ic_sup_rates[IEEE80211_MODE_11B] = ieee80211_std_rateset_11b;
    706 	ic->ic_sup_rates[IEEE80211_MODE_11G] = ieee80211_std_rateset_11g;
    707 
    708 	/* set supported .11b and .11g channels (1 through 14) */
    709 	for (i = 1; i <= 14; i++) {
    710 		ic->ic_channels[i].ic_freq =
    711 		    ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ);
    712 		ic->ic_channels[i].ic_flags =
    713 		    IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM |
    714 		    IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ;
    715 	}
    716 
    717 	ifp->if_softc = sc;
    718 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
    719 	if (sc->sc_hwrev & URTW_HWREV_8187) {
    720 		ifp->if_init = urtw_init;
    721 	} else {
    722 		ifp->if_init = urtw_8187b_init;
    723 	}
    724 	ifp->if_ioctl = urtw_ioctl;
    725 	ifp->if_start = urtw_start;
    726 	ifp->if_watchdog = urtw_watchdog;
    727 	IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN);
    728 	IFQ_SET_READY(&ifp->if_snd);
    729 	memcpy(ifp->if_xname, device_xname(self), IFNAMSIZ);
    730 
    731 	if_attach(ifp);
    732 	ieee80211_ifattach(ic);
    733 
    734 	/* override state transition machine */
    735 	sc->sc_newstate = ic->ic_newstate;
    736 	ic->ic_newstate = urtw_newstate;
    737 	ieee80211_media_init(ic, urtw_media_change, ieee80211_media_status);
    738 
    739 	bpf_attach2(ifp, DLT_IEEE802_11_RADIO,
    740 	    sizeof(struct ieee80211_frame) + IEEE80211_RADIOTAP_HDRLEN,
    741 	    &sc->sc_drvbpf);
    742 
    743 	sc->sc_rxtap_len = sizeof(sc->sc_rxtapu);
    744 	sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len);
    745 	sc->sc_rxtap.wr_ihdr.it_present = htole32(URTW_RX_RADIOTAP_PRESENT);
    746 
    747 	sc->sc_txtap_len = sizeof(sc->sc_txtapu);
    748 	sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len);
    749 	sc->sc_txtap.wt_ihdr.it_present = htole32(URTW_TX_RADIOTAP_PRESENT);
    750 
    751 	printf(", address %s\n", ether_sprintf(ic->ic_myaddr));
    752 
    753 	ieee80211_announce(ic);
    754 
    755 	return;
    756 fail:
    757 	printf(": %s failed!\n", __func__);
    758 	sc->sc_dying = true;
    759 }
    760 
    761 int
    762 urtw_detach(device_t self, int flags)
    763 {
    764 	struct urtw_softc *sc = device_private(self);
    765 	struct ifnet *ifp = &sc->sc_if;
    766 	int s;
    767 
    768 	s = splusb();
    769 
    770 	sc->sc_dying = true;
    771 
    772 	callout_destroy(&sc->scan_to);
    773 	callout_destroy(&sc->sc_led_ch);
    774 
    775 	usb_rem_task(sc->sc_udev, &sc->sc_task);
    776 	usb_rem_task(sc->sc_udev, &sc->sc_ledtask);
    777 
    778 	if (ifp->if_softc != NULL) {
    779 		bpf_detach(ifp);
    780 		ieee80211_ifdetach(&sc->sc_ic);	/* free all nodes */
    781 		if_detach(ifp);
    782 	}
    783 
    784 	/* abort and free xfers */
    785 	urtw_free_tx_data_list(sc);
    786 	urtw_free_rx_data_list(sc);
    787 	urtw_close_pipes(sc);
    788 
    789 	splx(s);
    790 
    791 	return 0;
    792 }
    793 
    794 int
    795 urtw_activate(device_t self, enum devact act)
    796 {
    797 	struct urtw_softc *sc = device_private(self);
    798 
    799 	switch (act) {
    800 	case DVACT_DEACTIVATE:
    801 		sc->sc_dying = true;
    802 		break;
    803 	}
    804 
    805 	return 0;
    806 }
    807 
    808 usbd_status
    809 urtw_close_pipes(struct urtw_softc *sc)
    810 {
    811 	usbd_status error = 0;
    812 
    813 	if (sc->sc_rxpipe != NULL) {
    814 		error = usbd_close_pipe(sc->sc_rxpipe);
    815 		if (error != 0)
    816 			goto fail;
    817 		sc->sc_rxpipe = NULL;
    818 	}
    819 	if (sc->sc_txpipe_low != NULL) {
    820 		error = usbd_close_pipe(sc->sc_txpipe_low);
    821 		if (error != 0)
    822 			goto fail;
    823 		sc->sc_txpipe_low = NULL;
    824 	}
    825 	if (sc->sc_txpipe_normal != NULL) {
    826 		error = usbd_close_pipe(sc->sc_txpipe_normal);
    827 		if (error != 0)
    828 			goto fail;
    829 		sc->sc_txpipe_normal = NULL;
    830 	}
    831 fail:
    832 	return error;
    833 }
    834 
    835 usbd_status
    836 urtw_open_pipes(struct urtw_softc *sc)
    837 {
    838 	usbd_status error;
    839 
    840 	/*
    841 	 * NB: there is no way to distinguish each pipes so we need to hardcode
    842 	 * pipe numbers
    843 	 */
    844 
    845 	/* tx pipe - low priority packets */
    846 	if (sc->sc_hwrev & URTW_HWREV_8187)
    847 		error = usbd_open_pipe(sc->sc_iface, 0x2,
    848 		    USBD_EXCLUSIVE_USE, &sc->sc_txpipe_low);
    849 	else
    850 		error = usbd_open_pipe(sc->sc_iface, 0x6,
    851 		    USBD_EXCLUSIVE_USE, &sc->sc_txpipe_low);
    852 	if (error != 0) {
    853 		printf("%s: could not open Tx low pipe: %s\n",
    854 		    device_xname(sc->sc_dev), usbd_errstr(error));
    855 		goto fail;
    856 	}
    857 	/* tx pipe - normal priority packets */
    858 	if (sc->sc_hwrev & URTW_HWREV_8187)
    859 		error = usbd_open_pipe(sc->sc_iface, 0x3,
    860 		    USBD_EXCLUSIVE_USE, &sc->sc_txpipe_normal);
    861 	else
    862 		error = usbd_open_pipe(sc->sc_iface, 0x7,
    863 		    USBD_EXCLUSIVE_USE, &sc->sc_txpipe_normal);
    864 	if (error != 0) {
    865 		printf("%s: could not open Tx normal pipe: %s\n",
    866 		    device_xname(sc->sc_dev), usbd_errstr(error));
    867 		goto fail;
    868 	}
    869 	/* rx pipe */
    870 	if (sc->sc_hwrev & URTW_HWREV_8187)
    871 		error = usbd_open_pipe(sc->sc_iface, 0x81,
    872 		    USBD_EXCLUSIVE_USE, &sc->sc_rxpipe);
    873 	else
    874 		error = usbd_open_pipe(sc->sc_iface, 0x83,
    875 		    USBD_EXCLUSIVE_USE, &sc->sc_rxpipe);
    876 	if (error != 0) {
    877 		printf("%s: could not open Rx pipe: %s\n",
    878 		    device_xname(sc->sc_dev), usbd_errstr(error));
    879 		goto fail;
    880 	}
    881 
    882 	return 0;
    883 fail:
    884 	(void)urtw_close_pipes(sc);
    885 	return error;
    886 }
    887 
    888 int
    889 urtw_alloc_rx_data_list(struct urtw_softc *sc)
    890 {
    891 	int i, error;
    892 
    893 	for (i = 0; i < URTW_RX_DATA_LIST_COUNT; i++) {
    894 		struct urtw_rx_data *data = &sc->sc_rx_data[i];
    895 
    896 		data->sc = sc;
    897 
    898 		error = usbd_create_xfer(sc->sc_rxpipe, MCLBYTES,
    899 		    USBD_SHORT_XFER_OK, 0, &data->xfer);
    900 		if (error) {
    901 
    902 			printf("%s: could not allocate rx xfer\n",
    903 			    device_xname(sc->sc_dev));
    904 			error = ENOMEM;
    905 			goto fail;
    906 		}
    907 
    908 		MGETHDR(data->m, M_DONTWAIT, MT_DATA);
    909 		if (data->m == NULL) {
    910 			printf("%s: could not allocate rx mbuf\n",
    911 			    device_xname(sc->sc_dev));
    912 			error = ENOMEM;
    913 			goto fail;
    914 		}
    915 		MCLGET(data->m, M_DONTWAIT);
    916 		if (!(data->m->m_flags & M_EXT)) {
    917 			printf("%s: could not allocate rx mbuf cluster\n",
    918 			    device_xname(sc->sc_dev));
    919 			error = ENOMEM;
    920 			goto fail;
    921 		}
    922 		data->buf = mtod(data->m, uint8_t *);
    923 	}
    924 
    925 	return 0;
    926 
    927 fail:
    928 	urtw_free_rx_data_list(sc);
    929 	return error;
    930 }
    931 
    932 void
    933 urtw_free_rx_data_list(struct urtw_softc *sc)
    934 {
    935 	int i;
    936 
    937 	/* Make sure no transfers are pending. */
    938 	if (sc->sc_rxpipe != NULL)
    939 		usbd_abort_pipe(sc->sc_rxpipe);
    940 
    941 	for (i = 0; i < URTW_RX_DATA_LIST_COUNT; i++) {
    942 		struct urtw_rx_data *data = &sc->sc_rx_data[i];
    943 
    944 		if (data->xfer != NULL) {
    945 			usbd_destroy_xfer(data->xfer);
    946 			data->xfer = NULL;
    947 		}
    948 		if (data->m != NULL) {
    949 			m_freem(data->m);
    950 			data->m = NULL;
    951 		}
    952 	}
    953 }
    954 
    955 int
    956 urtw_alloc_tx_data_list(struct urtw_softc *sc)
    957 {
    958 	int i, error;
    959 
    960 	for (size_t j = 0; j < URTW_PRIORITY_MAX; j++) {
    961 		for (i = 0; i < URTW_TX_DATA_LIST_COUNT; i++) {
    962 			struct urtw_tx_data *data = &sc->sc_tx_data[j][i];
    963 
    964 			data->sc = sc;
    965 			data->ni = NULL;
    966 
    967 			error = usbd_create_xfer((j == URTW_PRIORITY_LOW) ?
    968 			    sc->sc_txpipe_low : sc->sc_txpipe_normal,
    969 			    URTW_TX_MAXSIZE, USBD_FORCE_SHORT_XFER, 0,
    970 			    &data->xfer);
    971 			if (error) {
    972 				printf("%s: could not allocate tx xfer\n",
    973 				    device_xname(sc->sc_dev));
    974 				goto fail;
    975 			}
    976 
    977 			data->buf = usbd_get_buffer(data->xfer);
    978 
    979 			if (((unsigned long)data->buf) % 4)
    980 				printf("%s: warn: unaligned buffer %p\n",
    981 				    device_xname(sc->sc_dev), data->buf);
    982 		}
    983 	}
    984 
    985 	return 0;
    986 
    987 fail:
    988 	urtw_free_tx_data_list(sc);
    989 	return error;
    990 }
    991 
    992 void
    993 urtw_free_tx_data_list(struct urtw_softc *sc)
    994 {
    995 	int i;
    996 
    997 	/* Make sure no transfers are pending. */
    998 	if (sc->sc_txpipe_low != NULL)
    999 		usbd_abort_pipe(sc->sc_txpipe_low);
   1000 	if (sc->sc_txpipe_normal != NULL)
   1001 		usbd_abort_pipe(sc->sc_txpipe_normal);
   1002 
   1003 	for (size_t j = 0; j < URTW_PRIORITY_MAX; j++) {
   1004 		for (i = 0; i < URTW_TX_DATA_LIST_COUNT; i++) {
   1005 			struct urtw_tx_data *data = &sc->sc_tx_data[j][i];
   1006 
   1007 			if (data->xfer != NULL) {
   1008 				usbd_destroy_xfer(data->xfer);
   1009 				data->xfer = NULL;
   1010 			}
   1011 			if (data->ni != NULL) {
   1012 				ieee80211_free_node(data->ni);
   1013 				data->ni = NULL;
   1014 			}
   1015 		}
   1016 	}
   1017 }
   1018 
   1019 int
   1020 urtw_media_change(struct ifnet *ifp)
   1021 {
   1022 	int error;
   1023 
   1024 	error = ieee80211_media_change(ifp);
   1025 	if (error != ENETRESET)
   1026 		return error;
   1027 
   1028 	if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) ==
   1029 	    (IFF_UP | IFF_RUNNING))
   1030 		ifp->if_init(ifp);
   1031 
   1032 	return 0;
   1033 }
   1034 
   1035 int
   1036 urtw_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
   1037 {
   1038 	struct urtw_softc *sc = ic->ic_ifp->if_softc;
   1039 
   1040 	usb_rem_task(sc->sc_udev, &sc->sc_task);
   1041 	callout_stop(&sc->scan_to);
   1042 
   1043 	/* do it in a process context */
   1044 	sc->sc_state = nstate;
   1045 	sc->sc_arg = arg;
   1046 	usb_add_task(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER);
   1047 
   1048 	return 0;
   1049 }
   1050 
   1051 usbd_status
   1052 urtw_led_init(struct urtw_softc *sc)
   1053 {
   1054 	uint32_t rev;
   1055 	usbd_status error;
   1056 
   1057 	urtw_read8_m(sc, URTW_PSR, &sc->sc_psr);
   1058 	error = urtw_eprom_read32(sc, URTW_EPROM_SWREV, &rev);
   1059 	if (error != 0)
   1060 		goto fail;
   1061 
   1062 	switch (rev & URTW_EPROM_CID_MASK) {
   1063 	case URTW_EPROM_CID_ALPHA0:
   1064 		sc->sc_strategy = URTW_SW_LED_MODE1;
   1065 		break;
   1066 	case URTW_EPROM_CID_SERCOMM_PS:
   1067 		sc->sc_strategy = URTW_SW_LED_MODE3;
   1068 		break;
   1069 	case URTW_EPROM_CID_HW_LED:
   1070 		sc->sc_strategy = URTW_HW_LED;
   1071 		break;
   1072 	case URTW_EPROM_CID_RSVD0:
   1073 	case URTW_EPROM_CID_RSVD1:
   1074 	default:
   1075 		sc->sc_strategy = URTW_SW_LED_MODE0;
   1076 		break;
   1077 	}
   1078 
   1079 	sc->sc_gpio_ledpin = URTW_LED_PIN_GPIO0;
   1080 
   1081 fail:
   1082 	return error;
   1083 }
   1084 
   1085 usbd_status
   1086 urtw_8225_write_s16(struct urtw_softc *sc, uint8_t addr, int index,
   1087     uint16_t data)
   1088 {
   1089 	usb_device_request_t req;
   1090 
   1091 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
   1092 	req.bRequest = URTW_8187_SETREGS_REQ;
   1093 	USETW(req.wValue, addr);
   1094 	USETW(req.wIndex, index);
   1095 	USETW(req.wLength, sizeof(uint16_t));
   1096 
   1097 	return usbd_do_request(sc->sc_udev, &req, &data);
   1098 }
   1099 
   1100 usbd_status
   1101 urtw_8225_read(struct urtw_softc *sc, uint8_t addr, uint32_t *data)
   1102 {
   1103 	int i;
   1104 	int16_t bit;
   1105 	uint8_t rlen = 12, wlen = 6;
   1106 	uint16_t o1, o2, o3, tmp;
   1107 	uint32_t d2w = ((uint32_t)(addr & 0x1f)) << 27;
   1108 	uint32_t mask = 0x80000000, value = 0;
   1109 	usbd_status error;
   1110 
   1111 	urtw_read16_m(sc, URTW_RF_PINS_OUTPUT, &o1);
   1112 	urtw_read16_m(sc, URTW_RF_PINS_ENABLE, &o2);
   1113 	urtw_read16_m(sc, URTW_RF_PINS_SELECT, &o3);
   1114 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, o2 | 0xf);
   1115 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, o3 | 0xf);
   1116 	o1 &= ~0xf;
   1117 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_EN);
   1118 	DELAY(5);
   1119 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1);
   1120 	DELAY(5);
   1121 
   1122 	for (i = 0; i < (wlen / 2); i++, mask = mask >> 1) {
   1123 		bit = ((d2w & mask) != 0) ? 1 : 0;
   1124 
   1125 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1);
   1126 		DELAY(2);
   1127 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 |
   1128 		    URTW_BB_HOST_BANG_CLK);
   1129 		DELAY(2);
   1130 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 |
   1131 		    URTW_BB_HOST_BANG_CLK);
   1132 		DELAY(2);
   1133 		mask = mask >> 1;
   1134 		if (i == 2)
   1135 			break;
   1136 		bit = ((d2w & mask) != 0) ? 1 : 0;
   1137 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 |
   1138 		    URTW_BB_HOST_BANG_CLK);
   1139 		DELAY(2);
   1140 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 |
   1141 		    URTW_BB_HOST_BANG_CLK);
   1142 		DELAY(2);
   1143 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1);
   1144 		DELAY(1);
   1145 	}
   1146 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | URTW_BB_HOST_BANG_RW |
   1147 	    URTW_BB_HOST_BANG_CLK);
   1148 	DELAY(2);
   1149 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | URTW_BB_HOST_BANG_RW);
   1150 	DELAY(2);
   1151 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_RW);
   1152 	DELAY(2);
   1153 
   1154 	mask = 0x800;
   1155 	for (i = 0; i < rlen; i++, mask = mask >> 1) {
   1156 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
   1157 		    o1 | URTW_BB_HOST_BANG_RW);
   1158 		DELAY(2);
   1159 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
   1160 		    o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK);
   1161 		DELAY(2);
   1162 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
   1163 		    o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK);
   1164 		DELAY(2);
   1165 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
   1166 		    o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK);
   1167 		DELAY(2);
   1168 
   1169 		urtw_read16_m(sc, URTW_RF_PINS_INPUT, &tmp);
   1170 		value |= ((tmp & URTW_BB_HOST_BANG_CLK) ? mask : 0);
   1171 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
   1172 		    o1 | URTW_BB_HOST_BANG_RW);
   1173 		DELAY(2);
   1174 	}
   1175 
   1176 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_EN |
   1177 	    URTW_BB_HOST_BANG_RW);
   1178 	DELAY(2);
   1179 
   1180 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, o2);
   1181 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, o3);
   1182 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x3a0);
   1183 
   1184 	if (data != NULL)
   1185 		*data = value;
   1186 fail:
   1187 	return error;
   1188 }
   1189 
   1190 usbd_status
   1191 urtw_8225_write_c(struct urtw_softc *sc, uint8_t addr, uint16_t data)
   1192 {
   1193 	uint16_t d80, d82, d84;
   1194 	usbd_status error;
   1195 
   1196 	urtw_read16_m(sc, URTW_RF_PINS_OUTPUT, &d80);
   1197 	d80 &= 0xfff3;
   1198 	urtw_read16_m(sc, URTW_RF_PINS_ENABLE, &d82);
   1199 	urtw_read16_m(sc, URTW_RF_PINS_SELECT, &d84);
   1200 	d84 &= 0xfff0;
   1201 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, d82 | 0x0007);
   1202 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, d84 | 0x0007);
   1203 	DELAY(10);
   1204 
   1205 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN);
   1206 	DELAY(2);
   1207 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80);
   1208 	DELAY(10);
   1209 
   1210 	error = urtw_8225_write_s16(sc, addr, 0x8225, data);
   1211 	if (error != 0)
   1212 		goto fail;
   1213 
   1214 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN);
   1215 	DELAY(10);
   1216 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN);
   1217 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, d84);
   1218 	usbd_delay_ms(sc->sc_udev, 2);
   1219 fail:
   1220 	return error;
   1221 }
   1222 
   1223 usbd_status
   1224 urtw_8225_isv2(struct urtw_softc *sc, int *ret)
   1225 {
   1226 	uint32_t data;
   1227 	usbd_status error;
   1228 
   1229 	*ret = 1;
   1230 
   1231 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x0080);
   1232 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x0080);
   1233 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x0080);
   1234 	usbd_delay_ms(sc->sc_udev, 500);
   1235 
   1236 	urtw_8225_write(sc, 0x0, 0x1b7);
   1237 
   1238 	error = urtw_8225_read(sc, 0x8, &data);
   1239 	if (error != 0)
   1240 		goto fail;
   1241 	if (data != 0x588)
   1242 		*ret = 0;
   1243 	else {
   1244 		error = urtw_8225_read(sc, 0x9, &data);
   1245 		if (error != 0)
   1246 			goto fail;
   1247 		if (data != 0x700)
   1248 			*ret = 0;
   1249 	}
   1250 
   1251 	urtw_8225_write(sc, 0x0, 0xb7);
   1252 fail:
   1253 	return error;
   1254 }
   1255 
   1256 usbd_status
   1257 urtw_get_rfchip(struct urtw_softc *sc)
   1258 {
   1259 	struct urtw_rf *rf = &sc->sc_rf;
   1260 	int ret;
   1261 	uint32_t data;
   1262 	usbd_status error;
   1263 
   1264 	rf->rf_sc = sc;
   1265 
   1266 	if (sc->sc_hwrev & URTW_HWREV_8187) {
   1267 		error = urtw_eprom_read32(sc, URTW_EPROM_RFCHIPID, &data);
   1268 		if (error != 0)
   1269 			panic("unsupported RF chip");
   1270 			/* NOTREACHED */
   1271 		switch (data & 0xff) {
   1272 		case URTW_EPROM_RFCHIPID_RTL8225U:
   1273 			error = urtw_8225_isv2(sc, &ret);
   1274 			if (error != 0)
   1275 				goto fail;
   1276 			if (ret == 0) {
   1277 				rf->init = urtw_8225_rf_init;
   1278 				rf->set_chan = urtw_8225_rf_set_chan;
   1279 				rf->set_sens = urtw_8225_rf_set_sens;
   1280 				printf(", RFv1");
   1281 			} else {
   1282 				rf->init = urtw_8225v2_rf_init;
   1283 				rf->set_chan = urtw_8225v2_rf_set_chan;
   1284 				rf->set_sens = NULL;
   1285 				printf(", RFv2");
   1286 			}
   1287 			break;
   1288 		default:
   1289 			goto fail;
   1290 		}
   1291 	} else {
   1292 		rf->init = urtw_8225v2_b_rf_init;
   1293 		rf->set_chan = urtw_8225v2_b_rf_set_chan;
   1294 		rf->set_sens = NULL;
   1295 	}
   1296 
   1297 	rf->max_sens = URTW_8225_RF_MAX_SENS;
   1298 	rf->sens = URTW_8225_RF_DEF_SENS;
   1299 
   1300 	return 0;
   1301 
   1302 fail:
   1303 	panic("unsupported RF chip %d", data & 0xff);
   1304 	/* NOTREACHED */
   1305 }
   1306 
   1307 usbd_status
   1308 urtw_get_txpwr(struct urtw_softc *sc)
   1309 {
   1310 	int i, j;
   1311 	uint32_t data;
   1312 	usbd_status error;
   1313 
   1314 	error = urtw_eprom_read32(sc, URTW_EPROM_TXPW_BASE, &data);
   1315 	if (error != 0)
   1316 		goto fail;
   1317 	sc->sc_txpwr_cck_base = data & 0xf;
   1318 	sc->sc_txpwr_ofdm_base = (data >> 4) & 0xf;
   1319 
   1320 	for (i = 1, j = 0; i < 6; i += 2, j++) {
   1321 		error = urtw_eprom_read32(sc, URTW_EPROM_TXPW0 + j, &data);
   1322 		if (error != 0)
   1323 			goto fail;
   1324 		sc->sc_txpwr_cck[i] = data & 0xf;
   1325 		sc->sc_txpwr_cck[i + 1] = (data & 0xf00) >> 8;
   1326 		sc->sc_txpwr_ofdm[i] = (data & 0xf0) >> 4;
   1327 		sc->sc_txpwr_ofdm[i + 1] = (data & 0xf000) >> 12;
   1328 	}
   1329 	for (i = 1, j = 0; i < 4; i += 2, j++) {
   1330 		error = urtw_eprom_read32(sc, URTW_EPROM_TXPW1 + j, &data);
   1331 		if (error != 0)
   1332 			goto fail;
   1333 		sc->sc_txpwr_cck[i + 6] = data & 0xf;
   1334 		sc->sc_txpwr_cck[i + 6 + 1] = (data & 0xf00) >> 8;
   1335 		sc->sc_txpwr_ofdm[i + 6] = (data & 0xf0) >> 4;
   1336 		sc->sc_txpwr_ofdm[i + 6 + 1] = (data & 0xf000) >> 12;
   1337 	}
   1338 	if (sc->sc_hwrev & URTW_HWREV_8187) {
   1339 		for (i = 1, j = 0; i < 4; i += 2, j++) {
   1340 			error = urtw_eprom_read32(sc, URTW_EPROM_TXPW2 + j,
   1341 			    &data);
   1342 			if (error != 0)
   1343 				goto fail;
   1344 			sc->sc_txpwr_cck[i + 6 + 4] = data & 0xf;
   1345 			sc->sc_txpwr_cck[i + 6 + 4 + 1] = (data & 0xf00) >> 8;
   1346 			sc->sc_txpwr_ofdm[i + 6 + 4] = (data & 0xf0) >> 4;
   1347 			sc->sc_txpwr_ofdm[i + 6 + 4 + 1] =
   1348 			    (data & 0xf000) >> 12;
   1349 		}
   1350 	} else {
   1351 		/* Channel 11. */
   1352 		error = urtw_eprom_read32(sc, 0x1b, &data);
   1353 		if (error != 0)
   1354 			goto fail;
   1355 		sc->sc_txpwr_cck[11] = data & 0xf;
   1356 		sc->sc_txpwr_ofdm[11] = (data & 0xf0) >> 4;
   1357 
   1358 		/* Channel 12. */
   1359 		error = urtw_eprom_read32(sc, 0xa, &data);
   1360 		if (error != 0)
   1361 			goto fail;
   1362 		sc->sc_txpwr_cck[12] = data & 0xf;
   1363 		sc->sc_txpwr_ofdm[12] = (data & 0xf0) >> 4;
   1364 
   1365 		/* Channel 13, 14. */
   1366 		error = urtw_eprom_read32(sc, 0x1c, &data);
   1367 		if (error != 0)
   1368 			goto fail;
   1369 		sc->sc_txpwr_cck[13] = data & 0xf;
   1370 		sc->sc_txpwr_ofdm[13] = (data & 0xf0) >> 4;
   1371 		sc->sc_txpwr_cck[14] = (data & 0xf00) >> 8;
   1372 		sc->sc_txpwr_ofdm[14] = (data & 0xf000) >> 12;
   1373 	}
   1374 fail:
   1375 	return error;
   1376 }
   1377 
   1378 usbd_status
   1379 urtw_get_macaddr(struct urtw_softc *sc)
   1380 {
   1381 	struct ieee80211com *ic = &sc->sc_ic;
   1382 	usbd_status error;
   1383 	uint32_t data;
   1384 
   1385 	error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR, &data);
   1386 	if (error != 0)
   1387 		goto fail;
   1388 	ic->ic_myaddr[0] = data & 0xff;
   1389 	ic->ic_myaddr[1] = (data & 0xff00) >> 8;
   1390 	error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR + 1, &data);
   1391 	if (error != 0)
   1392 		goto fail;
   1393 	ic->ic_myaddr[2] = data & 0xff;
   1394 	ic->ic_myaddr[3] = (data & 0xff00) >> 8;
   1395 	error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR + 2, &data);
   1396 	if (error != 0)
   1397 		goto fail;
   1398 	ic->ic_myaddr[4] = data & 0xff;
   1399 	ic->ic_myaddr[5] = (data & 0xff00) >> 8;
   1400 fail:
   1401 	return error;
   1402 }
   1403 
   1404 usbd_status
   1405 urtw_eprom_read32(struct urtw_softc *sc, uint32_t addr, uint32_t *data)
   1406 {
   1407 #define URTW_READCMD_LEN		3
   1408 	int addrlen, i;
   1409 	int16_t addrstr[8], data16, readcmd[] = { 1, 1, 0 };
   1410 	usbd_status error;
   1411 
   1412 	/* NB: make sure the buffer is initialized */
   1413 	*data = 0;
   1414 
   1415 	/* enable EPROM programming */
   1416 	urtw_write8_m(sc, URTW_EPROM_CMD, URTW_EPROM_CMD_PROGRAM_MODE);
   1417 	DELAY(URTW_EPROM_DELAY);
   1418 
   1419 	error = urtw_eprom_cs(sc, URTW_EPROM_ENABLE);
   1420 	if (error != 0)
   1421 		goto fail;
   1422 	error = urtw_eprom_ck(sc);
   1423 	if (error != 0)
   1424 		goto fail;
   1425 	error = urtw_eprom_sendbits(sc, readcmd, URTW_READCMD_LEN);
   1426 	if (error != 0)
   1427 		goto fail;
   1428 	if (sc->sc_epromtype == URTW_EEPROM_93C56) {
   1429 		addrlen = 8;
   1430 		addrstr[0] = addr & (1 << 7);
   1431 		addrstr[1] = addr & (1 << 6);
   1432 		addrstr[2] = addr & (1 << 5);
   1433 		addrstr[3] = addr & (1 << 4);
   1434 		addrstr[4] = addr & (1 << 3);
   1435 		addrstr[5] = addr & (1 << 2);
   1436 		addrstr[6] = addr & (1 << 1);
   1437 		addrstr[7] = addr & (1 << 0);
   1438 	} else {
   1439 		addrlen=6;
   1440 		addrstr[0] = addr & (1 << 5);
   1441 		addrstr[1] = addr & (1 << 4);
   1442 		addrstr[2] = addr & (1 << 3);
   1443 		addrstr[3] = addr & (1 << 2);
   1444 		addrstr[4] = addr & (1 << 1);
   1445 		addrstr[5] = addr & (1 << 0);
   1446 	}
   1447 	error = urtw_eprom_sendbits(sc, addrstr, addrlen);
   1448 	if (error != 0)
   1449 		goto fail;
   1450 
   1451 	error = urtw_eprom_writebit(sc, 0);
   1452 	if (error != 0)
   1453 		goto fail;
   1454 
   1455 	for (i = 0; i < 16; i++) {
   1456 		error = urtw_eprom_ck(sc);
   1457 		if (error != 0)
   1458 			goto fail;
   1459 		error = urtw_eprom_readbit(sc, &data16);
   1460 		if (error != 0)
   1461 			goto fail;
   1462 
   1463 		(*data) |= (data16 << (15 - i));
   1464 	}
   1465 
   1466 	error = urtw_eprom_cs(sc, URTW_EPROM_DISABLE);
   1467 	if (error != 0)
   1468 		goto fail;
   1469 	error = urtw_eprom_ck(sc);
   1470 	if (error != 0)
   1471 		goto fail;
   1472 
   1473 	/* now disable EPROM programming */
   1474 	urtw_write8_m(sc, URTW_EPROM_CMD, URTW_EPROM_CMD_NORMAL_MODE);
   1475 fail:
   1476 	return error;
   1477 #undef URTW_READCMD_LEN
   1478 }
   1479 
   1480 usbd_status
   1481 urtw_eprom_readbit(struct urtw_softc *sc, int16_t *data)
   1482 {
   1483 	uint8_t data8;
   1484 	usbd_status error;
   1485 
   1486 	urtw_read8_m(sc, URTW_EPROM_CMD, &data8);
   1487 	*data = (data8 & URTW_EPROM_READBIT) ? 1 : 0;
   1488 	DELAY(URTW_EPROM_DELAY);
   1489 
   1490 fail:
   1491 	return error;
   1492 }
   1493 
   1494 usbd_status
   1495 urtw_eprom_sendbits(struct urtw_softc *sc, int16_t *buf, int buflen)
   1496 {
   1497 	int i = 0;
   1498 	usbd_status error = 0;
   1499 
   1500 	for (i = 0; i < buflen; i++) {
   1501 		error = urtw_eprom_writebit(sc, buf[i]);
   1502 		if (error != 0)
   1503 			goto fail;
   1504 		error = urtw_eprom_ck(sc);
   1505 		if (error != 0)
   1506 			goto fail;
   1507 	}
   1508 fail:
   1509 	return error;
   1510 }
   1511 
   1512 usbd_status
   1513 urtw_eprom_writebit(struct urtw_softc *sc, int16_t bit)
   1514 {
   1515 	uint8_t data;
   1516 	usbd_status error;
   1517 
   1518 	urtw_read8_m(sc, URTW_EPROM_CMD, &data);
   1519 	if (bit != 0)
   1520 		urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_WRITEBIT);
   1521 	else
   1522 		urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_WRITEBIT);
   1523 	DELAY(URTW_EPROM_DELAY);
   1524 fail:
   1525 	return error;
   1526 }
   1527 
   1528 usbd_status
   1529 urtw_eprom_ck(struct urtw_softc *sc)
   1530 {
   1531 	uint8_t data;
   1532 	usbd_status error;
   1533 
   1534 	/* masking */
   1535 	urtw_read8_m(sc, URTW_EPROM_CMD, &data);
   1536 	urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_CK);
   1537 	DELAY(URTW_EPROM_DELAY);
   1538 	/* unmasking */
   1539 	urtw_read8_m(sc, URTW_EPROM_CMD, &data);
   1540 	urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_CK);
   1541 	DELAY(URTW_EPROM_DELAY);
   1542 fail:
   1543 	return error;
   1544 }
   1545 
   1546 usbd_status
   1547 urtw_eprom_cs(struct urtw_softc *sc, int able)
   1548 {
   1549 	uint8_t data;
   1550 	usbd_status error;
   1551 
   1552 	urtw_read8_m(sc, URTW_EPROM_CMD, &data);
   1553 	if (able == URTW_EPROM_ENABLE)
   1554 		urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_CS);
   1555 	else
   1556 		urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_CS);
   1557 	DELAY(URTW_EPROM_DELAY);
   1558 fail:
   1559 	return error;
   1560 }
   1561 
   1562 usbd_status
   1563 urtw_read8_c(struct urtw_softc *sc, int val, uint8_t *data, uint8_t idx)
   1564 {
   1565 	usb_device_request_t req;
   1566 	usbd_status error;
   1567 
   1568 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
   1569 	req.bRequest = URTW_8187_GETREGS_REQ;
   1570 	USETW(req.wValue, val | 0xff00);
   1571 	USETW(req.wIndex, idx & 0x03);
   1572 	USETW(req.wLength, sizeof(uint8_t));
   1573 
   1574 	error = usbd_do_request(sc->sc_udev, &req, data);
   1575 	return error;
   1576 }
   1577 
   1578 usbd_status
   1579 urtw_read8e(struct urtw_softc *sc, int val, uint8_t *data)
   1580 {
   1581 	usb_device_request_t req;
   1582 	usbd_status error;
   1583 
   1584 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
   1585 	req.bRequest = URTW_8187_GETREGS_REQ;
   1586 	USETW(req.wValue, val | 0xfe00);
   1587 	USETW(req.wIndex, 0);
   1588 	USETW(req.wLength, sizeof(uint8_t));
   1589 
   1590 	error = usbd_do_request(sc->sc_udev, &req, data);
   1591 	return error;
   1592 }
   1593 
   1594 usbd_status
   1595 urtw_read16_c(struct urtw_softc *sc, int val, uint16_t *data, uint8_t idx)
   1596 {
   1597 	usb_device_request_t req;
   1598 	usbd_status error;
   1599 
   1600 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
   1601 	req.bRequest = URTW_8187_GETREGS_REQ;
   1602 	USETW(req.wValue, val | 0xff00);
   1603 	USETW(req.wIndex, idx & 0x03);
   1604 	USETW(req.wLength, sizeof(uint16_t));
   1605 
   1606 	error = usbd_do_request(sc->sc_udev, &req, data);
   1607 	return error;
   1608 }
   1609 
   1610 usbd_status
   1611 urtw_read32_c(struct urtw_softc *sc, int val, uint32_t *data, uint8_t idx)
   1612 {
   1613 	usb_device_request_t req;
   1614 	usbd_status error;
   1615 
   1616 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
   1617 	req.bRequest = URTW_8187_GETREGS_REQ;
   1618 	USETW(req.wValue, val | 0xff00);
   1619 	USETW(req.wIndex, idx & 0x03);
   1620 	USETW(req.wLength, sizeof(uint32_t));
   1621 
   1622 	error = usbd_do_request(sc->sc_udev, &req, data);
   1623 	return error;
   1624 }
   1625 
   1626 usbd_status
   1627 urtw_write8_c(struct urtw_softc *sc, int val, uint8_t data, uint8_t idx)
   1628 {
   1629 	usb_device_request_t req;
   1630 
   1631 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
   1632 	req.bRequest = URTW_8187_SETREGS_REQ;
   1633 	USETW(req.wValue, val | 0xff00);
   1634 	USETW(req.wIndex, idx & 0x03);
   1635 	USETW(req.wLength, sizeof(uint8_t));
   1636 
   1637 	return usbd_do_request(sc->sc_udev, &req, &data);
   1638 }
   1639 
   1640 usbd_status
   1641 urtw_write8e(struct urtw_softc *sc, int val, uint8_t data)
   1642 {
   1643 	usb_device_request_t req;
   1644 
   1645 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
   1646 	req.bRequest = URTW_8187_SETREGS_REQ;
   1647 	USETW(req.wValue, val | 0xfe00);
   1648 	USETW(req.wIndex, 0);
   1649 	USETW(req.wLength, sizeof(uint8_t));
   1650 
   1651 	return usbd_do_request(sc->sc_udev, &req, &data);
   1652 }
   1653 
   1654 usbd_status
   1655 urtw_write16_c(struct urtw_softc *sc, int val, uint16_t data, uint8_t idx)
   1656 {
   1657 	usb_device_request_t req;
   1658 
   1659 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
   1660 	req.bRequest = URTW_8187_SETREGS_REQ;
   1661 	USETW(req.wValue, val | 0xff00);
   1662 	USETW(req.wIndex, idx & 0x03);
   1663 	USETW(req.wLength, sizeof(uint16_t));
   1664 
   1665 	return usbd_do_request(sc->sc_udev, &req, &data);
   1666 }
   1667 
   1668 usbd_status
   1669 urtw_write32_c(struct urtw_softc *sc, int val, uint32_t data, uint8_t idx)
   1670 {
   1671 	usb_device_request_t req;
   1672 
   1673 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
   1674 	req.bRequest = URTW_8187_SETREGS_REQ;
   1675 	USETW(req.wValue, val | 0xff00);
   1676 	USETW(req.wIndex, idx & 0x03);
   1677 	USETW(req.wLength, sizeof(uint32_t));
   1678 
   1679 	return usbd_do_request(sc->sc_udev, &req, &data);
   1680 }
   1681 
   1682 static usbd_status
   1683 urtw_set_mode(struct urtw_softc *sc, uint32_t mode)
   1684 {
   1685 	uint8_t data;
   1686 	usbd_status error;
   1687 
   1688 	urtw_read8_m(sc, URTW_EPROM_CMD, &data);
   1689 	data = (data & ~URTW_EPROM_CMD_MASK) | (mode << URTW_EPROM_CMD_SHIFT);
   1690 	data = data & ~(URTW_EPROM_CS | URTW_EPROM_CK);
   1691 	urtw_write8_m(sc, URTW_EPROM_CMD, data);
   1692 fail:
   1693 	return error;
   1694 }
   1695 
   1696 usbd_status
   1697 urtw_8180_set_anaparam(struct urtw_softc *sc, uint32_t val)
   1698 {
   1699 	uint8_t data;
   1700 	usbd_status error;
   1701 
   1702 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
   1703 	if (error)
   1704 		goto fail;
   1705 
   1706 	urtw_read8_m(sc, URTW_CONFIG3, &data);
   1707 	urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE);
   1708 	urtw_write32_m(sc, URTW_ANAPARAM, val);
   1709 	urtw_read8_m(sc, URTW_CONFIG3, &data);
   1710 	urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE);
   1711 
   1712 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
   1713 	if (error)
   1714 		goto fail;
   1715 fail:
   1716 	return error;
   1717 }
   1718 
   1719 usbd_status
   1720 urtw_8185_set_anaparam2(struct urtw_softc *sc, uint32_t val)
   1721 {
   1722 	uint8_t data;
   1723 	usbd_status error;
   1724 
   1725 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
   1726 	if (error)
   1727 		goto fail;
   1728 
   1729 	urtw_read8_m(sc, URTW_CONFIG3, &data);
   1730 	urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE);
   1731 	urtw_write32_m(sc, URTW_ANAPARAM2, val);
   1732 	urtw_read8_m(sc, URTW_CONFIG3, &data);
   1733 	urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE);
   1734 
   1735 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
   1736 	if (error)
   1737 		goto fail;
   1738 fail:
   1739 	return error;
   1740 }
   1741 
   1742 usbd_status
   1743 urtw_intr_disable(struct urtw_softc *sc)
   1744 {
   1745 	usbd_status error;
   1746 
   1747 	urtw_write16_m(sc, URTW_INTR_MASK, 0);
   1748 
   1749 fail:
   1750 	return error;
   1751 }
   1752 
   1753 usbd_status
   1754 urtw_reset(struct urtw_softc *sc)
   1755 {
   1756 	uint8_t data;
   1757 	usbd_status error;
   1758 
   1759 	error = urtw_8180_set_anaparam(sc, URTW_8187_8225_ANAPARAM_ON);
   1760 	if (error)
   1761 		goto fail;
   1762 	error = urtw_8185_set_anaparam2(sc, URTW_8187_8225_ANAPARAM2_ON);
   1763 	if (error)
   1764 		goto fail;
   1765 
   1766 	error = urtw_intr_disable(sc);
   1767 	if (error)
   1768 		goto fail;
   1769 	usbd_delay_ms(sc->sc_udev, 100);
   1770 
   1771 	error = urtw_write8e(sc, 0x18, 0x10);
   1772 	if (error != 0)
   1773 		goto fail;
   1774 	error = urtw_write8e(sc, 0x18, 0x11);
   1775 	if (error != 0)
   1776 		goto fail;
   1777 	error = urtw_write8e(sc, 0x18, 0x00);
   1778 	if (error != 0)
   1779 		goto fail;
   1780 	usbd_delay_ms(sc->sc_udev, 100);
   1781 
   1782 	urtw_read8_m(sc, URTW_CMD, &data);
   1783 	data = (data & 2) | URTW_CMD_RST;
   1784 	urtw_write8_m(sc, URTW_CMD, data);
   1785 	usbd_delay_ms(sc->sc_udev, 100);
   1786 
   1787 	urtw_read8_m(sc, URTW_CMD, &data);
   1788 	if (data & URTW_CMD_RST) {
   1789 		printf("%s: reset timeout\n", device_xname(sc->sc_dev));
   1790 		goto fail;
   1791 	}
   1792 
   1793 	error = urtw_set_mode(sc, URTW_EPROM_CMD_LOAD);
   1794 	if (error)
   1795 		goto fail;
   1796 	usbd_delay_ms(sc->sc_udev, 100);
   1797 
   1798 	error = urtw_8180_set_anaparam(sc, URTW_8187_8225_ANAPARAM_ON);
   1799 	if (error)
   1800 		goto fail;
   1801 	error = urtw_8185_set_anaparam2(sc, URTW_8187_8225_ANAPARAM2_ON);
   1802 	if (error)
   1803 		goto fail;
   1804 fail:
   1805 	return error;
   1806 }
   1807 
   1808 usbd_status
   1809 urtw_led_on(struct urtw_softc *sc, int type)
   1810 {
   1811 	usbd_status error;
   1812 
   1813 	if (type == URTW_LED_GPIO) {
   1814 		switch (sc->sc_gpio_ledpin) {
   1815 		case URTW_LED_PIN_GPIO0:
   1816 			urtw_write8_m(sc, URTW_GPIO, 0x01);
   1817 			urtw_write8_m(sc, URTW_GP_ENABLE, 0x00);
   1818 			break;
   1819 		default:
   1820 			panic("unsupported LED PIN type 0x%x",
   1821 			    sc->sc_gpio_ledpin);
   1822 			/* NOTREACHED */
   1823 		}
   1824 	} else {
   1825 		panic("unsupported LED type 0x%x", type);
   1826 		/* NOTREACHED */
   1827 	}
   1828 
   1829 	sc->sc_gpio_ledon = 1;
   1830 fail:
   1831 	return error;
   1832 }
   1833 
   1834 static usbd_status
   1835 urtw_led_off(struct urtw_softc *sc, int type)
   1836 {
   1837 	usbd_status error;
   1838 
   1839 	if (type == URTW_LED_GPIO) {
   1840 		switch (sc->sc_gpio_ledpin) {
   1841 		case URTW_LED_PIN_GPIO0:
   1842 			urtw_write8_m(sc, URTW_GPIO, 0x01);
   1843 			urtw_write8_m(sc, URTW_GP_ENABLE, 0x01);
   1844 			break;
   1845 		default:
   1846 			panic("unsupported LED PIN type 0x%x",
   1847 			    sc->sc_gpio_ledpin);
   1848 			/* NOTREACHED */
   1849 		}
   1850 	} else {
   1851 		panic("unsupported LED type 0x%x", type);
   1852 		/* NOTREACHED */
   1853 	}
   1854 
   1855 	sc->sc_gpio_ledon = 0;
   1856 
   1857 fail:
   1858 	return error;
   1859 }
   1860 
   1861 usbd_status
   1862 urtw_led_mode0(struct urtw_softc *sc, int mode)
   1863 {
   1864 	switch (mode) {
   1865 	case URTW_LED_CTL_POWER_ON:
   1866 		sc->sc_gpio_ledstate = URTW_LED_POWER_ON_BLINK;
   1867 		break;
   1868 	case URTW_LED_CTL_TX:
   1869 		if (sc->sc_gpio_ledinprogress == 1)
   1870 			return 0;
   1871 
   1872 		sc->sc_gpio_ledstate = URTW_LED_BLINK_NORMAL;
   1873 		sc->sc_gpio_blinktime = 2;
   1874 		break;
   1875 	case URTW_LED_CTL_LINK:
   1876 		sc->sc_gpio_ledstate = URTW_LED_ON;
   1877 		break;
   1878 	default:
   1879 		panic("unsupported LED mode 0x%x", mode);
   1880 		/* NOTREACHED */
   1881 	}
   1882 
   1883 	switch (sc->sc_gpio_ledstate) {
   1884 	case URTW_LED_ON:
   1885 		if (sc->sc_gpio_ledinprogress != 0)
   1886 			break;
   1887 		urtw_led_on(sc, URTW_LED_GPIO);
   1888 		break;
   1889 	case URTW_LED_BLINK_NORMAL:
   1890 		if (sc->sc_gpio_ledinprogress != 0)
   1891 			break;
   1892 		sc->sc_gpio_ledinprogress = 1;
   1893 		sc->sc_gpio_blinkstate = (sc->sc_gpio_ledon != 0) ?
   1894 			URTW_LED_OFF : URTW_LED_ON;
   1895 		if (!sc->sc_dying)
   1896 			callout_schedule(&sc->sc_led_ch, mstohz(100));
   1897 		break;
   1898 	case URTW_LED_POWER_ON_BLINK:
   1899 		urtw_led_on(sc, URTW_LED_GPIO);
   1900 		usbd_delay_ms(sc->sc_udev, 100);
   1901 		urtw_led_off(sc, URTW_LED_GPIO);
   1902 		break;
   1903 	default:
   1904 		panic("unknown LED status 0x%x", sc->sc_gpio_ledstate);
   1905 		/* NOTREACHED */
   1906 	}
   1907 	return 0;
   1908 }
   1909 
   1910 usbd_status
   1911 urtw_led_mode1(struct urtw_softc *sc, int mode)
   1912 {
   1913 	return USBD_INVAL;
   1914 }
   1915 
   1916 usbd_status
   1917 urtw_led_mode2(struct urtw_softc *sc, int mode)
   1918 {
   1919 	return USBD_INVAL;
   1920 }
   1921 
   1922 usbd_status
   1923 urtw_led_mode3(struct urtw_softc *sc, int mode)
   1924 {
   1925 	return USBD_INVAL;
   1926 }
   1927 
   1928 void
   1929 urtw_ledusbtask(void *arg)
   1930 {
   1931 	struct urtw_softc *sc = arg;
   1932 
   1933 	if (sc->sc_strategy != URTW_SW_LED_MODE0)
   1934 		panic("could not process a LED strategy 0x%x", sc->sc_strategy);
   1935 
   1936 	urtw_led_blink(sc);
   1937 }
   1938 
   1939 void
   1940 urtw_ledtask(void *arg)
   1941 {
   1942 	struct urtw_softc *sc = arg;
   1943 
   1944 	/*
   1945 	 * NB: to change a status of the led we need at least a sleep so we
   1946 	 * can't do it here
   1947 	 */
   1948 	usb_add_task(sc->sc_udev, &sc->sc_ledtask, USB_TASKQ_DRIVER);
   1949 }
   1950 
   1951 usbd_status
   1952 urtw_led_ctl(struct urtw_softc *sc, int mode)
   1953 {
   1954 	usbd_status error = 0;
   1955 
   1956 	switch (sc->sc_strategy) {
   1957 	case URTW_SW_LED_MODE0:
   1958 		error = urtw_led_mode0(sc, mode);
   1959 		break;
   1960 	case URTW_SW_LED_MODE1:
   1961 		error = urtw_led_mode1(sc, mode);
   1962 		break;
   1963 	case URTW_SW_LED_MODE2:
   1964 		error = urtw_led_mode2(sc, mode);
   1965 		break;
   1966 	case URTW_SW_LED_MODE3:
   1967 		error = urtw_led_mode3(sc, mode);
   1968 		break;
   1969 	default:
   1970 		panic("unsupported LED mode %d", sc->sc_strategy);
   1971 		/* NOTREACHED */
   1972 	}
   1973 
   1974 	return error;
   1975 }
   1976 
   1977 usbd_status
   1978 urtw_led_blink(struct urtw_softc *sc)
   1979 {
   1980 	uint8_t ing = 0;
   1981 
   1982 	if (sc->sc_gpio_blinkstate == URTW_LED_ON)
   1983 		(void)urtw_led_on(sc, URTW_LED_GPIO);
   1984 	else
   1985 		(void)urtw_led_off(sc, URTW_LED_GPIO);
   1986 	sc->sc_gpio_blinktime--;
   1987 	if (sc->sc_gpio_blinktime == 0)
   1988 		ing = 1;
   1989 	else {
   1990 		if (sc->sc_gpio_ledstate != URTW_LED_BLINK_NORMAL &&
   1991 		    sc->sc_gpio_ledstate != URTW_LED_BLINK_SLOWLY &&
   1992 		    sc->sc_gpio_ledstate != URTW_LED_BLINK_CM3)
   1993 			ing = 1;
   1994 	}
   1995 	if (ing == 1) {
   1996 		if (sc->sc_gpio_ledstate == URTW_LED_ON &&
   1997 		    sc->sc_gpio_ledon == 0)
   1998 			(void)urtw_led_on(sc, URTW_LED_GPIO);
   1999 		else if (sc->sc_gpio_ledstate == URTW_LED_OFF &&
   2000 		    sc->sc_gpio_ledon == 1)
   2001 			(void)urtw_led_off(sc, URTW_LED_GPIO);
   2002 
   2003 		sc->sc_gpio_blinktime = 0;
   2004 		sc->sc_gpio_ledinprogress = 0;
   2005 		return 0;
   2006 	}
   2007 
   2008 	sc->sc_gpio_blinkstate = (sc->sc_gpio_blinkstate != URTW_LED_ON) ?
   2009 	    URTW_LED_ON : URTW_LED_OFF;
   2010 
   2011 	switch (sc->sc_gpio_ledstate) {
   2012 	case URTW_LED_BLINK_NORMAL:
   2013 		if (!sc->sc_dying)
   2014 			callout_schedule(&sc->sc_led_ch, mstohz(100));
   2015 		break;
   2016 	default:
   2017 		panic("unknown LED status 0x%x", sc->sc_gpio_ledstate);
   2018 		/* NOTREACHED */
   2019 	}
   2020 	return 0;
   2021 }
   2022 
   2023 usbd_status
   2024 urtw_update_msr(struct urtw_softc *sc)
   2025 {
   2026 	struct ieee80211com *ic = &sc->sc_ic;
   2027 	uint8_t data;
   2028 	usbd_status error;
   2029 
   2030 	urtw_read8_m(sc, URTW_MSR, &data);
   2031 	data &= ~URTW_MSR_LINK_MASK;
   2032 
   2033 	/* Should always be set. */
   2034 	if (sc->sc_hwrev & URTW_HWREV_8187B)
   2035 		data |= URTW_MSR_LINK_ENEDCA;
   2036 
   2037 	if (sc->sc_state == IEEE80211_S_RUN) {
   2038 		switch (ic->ic_opmode) {
   2039 		case IEEE80211_M_STA:
   2040 		case IEEE80211_M_MONITOR:
   2041 			data |= URTW_MSR_LINK_STA;
   2042 			break;
   2043 		default:
   2044 			panic("unsupported operation mode 0x%x",
   2045 			    ic->ic_opmode);
   2046 			/* NOTREACHED */
   2047 		}
   2048 	} else
   2049 		data |= URTW_MSR_LINK_NONE;
   2050 
   2051 	urtw_write8_m(sc, URTW_MSR, data);
   2052 fail:
   2053 	return error;
   2054 }
   2055 
   2056 uint16_t
   2057 urtw_rate2rtl(int rate)
   2058 {
   2059 	unsigned int i;
   2060 
   2061 	for (i = 0; i < __arraycount(urtw_ratetable); i++) {
   2062 		if (rate == urtw_ratetable[i].reg)
   2063 			return urtw_ratetable[i].val;
   2064 	}
   2065 
   2066 	return 3;
   2067 }
   2068 
   2069 uint16_t
   2070 urtw_rtl2rate(int rate)
   2071 {
   2072 	unsigned int i;
   2073 
   2074 	for (i = 0; i < __arraycount(urtw_ratetable); i++) {
   2075 		if (rate == urtw_ratetable[i].val)
   2076 			return urtw_ratetable[i].reg;
   2077 	}
   2078 
   2079 	return 0;
   2080 }
   2081 
   2082 usbd_status
   2083 urtw_set_rate(struct urtw_softc *sc)
   2084 {
   2085 	int i, basic_rate, min_rr_rate, max_rr_rate;
   2086 	uint16_t data;
   2087 	usbd_status error;
   2088 
   2089 	basic_rate = urtw_rate2rtl(48);
   2090 	min_rr_rate = urtw_rate2rtl(12);
   2091 	max_rr_rate = urtw_rate2rtl(48);
   2092 
   2093 	urtw_write8_m(sc, URTW_RESP_RATE,
   2094 	    max_rr_rate << URTW_RESP_MAX_RATE_SHIFT |
   2095 	    min_rr_rate << URTW_RESP_MIN_RATE_SHIFT);
   2096 
   2097 	urtw_read16_m(sc, URTW_8187_BRSR, &data);
   2098 	data &= ~URTW_BRSR_MBR_8185;
   2099 
   2100 	for (i = 0; i <= basic_rate; i++)
   2101 		data |= (1 << i);
   2102 
   2103 	urtw_write16_m(sc, URTW_8187_BRSR, data);
   2104 fail:
   2105 	return error;
   2106 }
   2107 
   2108 usbd_status
   2109 urtw_intr_enable(struct urtw_softc *sc)
   2110 {
   2111 	usbd_status error;
   2112 
   2113 	urtw_write16_m(sc, URTW_INTR_MASK, 0xffff);
   2114 fail:
   2115 	return error;
   2116 }
   2117 
   2118 usbd_status
   2119 urtw_rx_setconf(struct urtw_softc *sc)
   2120 {
   2121 	struct ifnet *ifp = sc->sc_ic.ic_ifp;
   2122 	struct ieee80211com *ic = &sc->sc_ic;
   2123 	uint32_t data;
   2124 	usbd_status error;
   2125 
   2126 	urtw_read32_m(sc, URTW_RX, &data);
   2127 	data = data &~ URTW_RX_FILTER_MASK;
   2128 #if 0
   2129 	data = data | URTW_RX_FILTER_CTL;
   2130 #endif
   2131 	data = data | URTW_RX_FILTER_MNG | URTW_RX_FILTER_DATA;
   2132 	data = data | URTW_RX_FILTER_BCAST | URTW_RX_FILTER_MCAST;
   2133 
   2134 	if (ic->ic_opmode == IEEE80211_M_MONITOR) {
   2135 		data = data | URTW_RX_FILTER_ICVERR;
   2136 		data = data | URTW_RX_FILTER_PWR;
   2137 	}
   2138 	if (sc->sc_crcmon == 1 && ic->ic_opmode == IEEE80211_M_MONITOR)
   2139 		data = data | URTW_RX_FILTER_CRCERR;
   2140 
   2141 	if (ic->ic_opmode == IEEE80211_M_MONITOR ||
   2142 	    (ifp->if_flags & (IFF_ALLMULTI | IFF_PROMISC))) {
   2143 		data = data | URTW_RX_FILTER_ALLMAC;
   2144 	} else {
   2145 		data = data | URTW_RX_FILTER_NICMAC;
   2146 		data = data | URTW_RX_CHECK_BSSID;
   2147 	}
   2148 
   2149 	data = data &~ URTW_RX_FIFO_THRESHOLD_MASK;
   2150 	data = data | URTW_RX_FIFO_THRESHOLD_NONE | URTW_RX_AUTORESETPHY;
   2151 	data = data &~ URTW_MAX_RX_DMA_MASK;
   2152 	data = data | URTW_MAX_RX_DMA_2048 | URTW_RCR_ONLYERLPKT;
   2153 
   2154 	urtw_write32_m(sc, URTW_RX, data);
   2155 fail:
   2156 	return error;
   2157 }
   2158 
   2159 usbd_status
   2160 urtw_rx_enable(struct urtw_softc *sc)
   2161 {
   2162 	int i;
   2163 	struct urtw_rx_data *rx_data;
   2164 	uint8_t data;
   2165 	usbd_status error;
   2166 
   2167 	/*
   2168 	 * Start up the receive pipe.
   2169 	 */
   2170 	for (i = 0; i < URTW_RX_DATA_LIST_COUNT; i++) {
   2171 		rx_data = &sc->sc_rx_data[i];
   2172 
   2173 		usbd_setup_xfer(rx_data->xfer, rx_data, rx_data->buf, MCLBYTES,
   2174 		    USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, urtw_rxeof);
   2175 		error = usbd_transfer(rx_data->xfer);
   2176 		if (error != USBD_IN_PROGRESS && error != 0) {
   2177 			printf("%s: could not queue Rx transfer\n",
   2178 			    device_xname(sc->sc_dev));
   2179 			goto fail;
   2180 		}
   2181 	}
   2182 
   2183 	error = urtw_rx_setconf(sc);
   2184 	if (error != 0)
   2185 		goto fail;
   2186 
   2187 	urtw_read8_m(sc, URTW_CMD, &data);
   2188 	urtw_write8_m(sc, URTW_CMD, data | URTW_CMD_RX_ENABLE);
   2189 fail:
   2190 	return error;
   2191 }
   2192 
   2193 usbd_status
   2194 urtw_tx_enable(struct urtw_softc *sc)
   2195 {
   2196 	uint8_t data8;
   2197 	uint32_t data;
   2198 	usbd_status error;
   2199 
   2200 	if (sc->sc_hwrev & URTW_HWREV_8187) {
   2201 		urtw_read8_m(sc, URTW_CW_CONF, &data8);
   2202 		data8 &= ~(URTW_CW_CONF_PERPACKET_CW |
   2203 		    URTW_CW_CONF_PERPACKET_RETRY);
   2204 		urtw_write8_m(sc, URTW_CW_CONF, data8);
   2205 
   2206  		urtw_read8_m(sc, URTW_TX_AGC_CTL, &data8);
   2207 		data8 &= ~URTW_TX_AGC_CTL_PERPACKET_GAIN;
   2208 		data8 &= ~URTW_TX_AGC_CTL_PERPACKET_ANTSEL;
   2209 		data8 &= ~URTW_TX_AGC_CTL_FEEDBACK_ANT;
   2210 		urtw_write8_m(sc, URTW_TX_AGC_CTL, data8);
   2211 
   2212 		urtw_read32_m(sc, URTW_TX_CONF, &data);
   2213 		data &= ~URTW_TX_LOOPBACK_MASK;
   2214 		data |= URTW_TX_LOOPBACK_NONE;
   2215 		data &= ~(URTW_TX_DPRETRY_MASK | URTW_TX_RTSRETRY_MASK);
   2216 		data |= sc->sc_tx_retry << URTW_TX_DPRETRY_SHIFT;
   2217 		data |= sc->sc_rts_retry << URTW_TX_RTSRETRY_SHIFT;
   2218 		data &= ~(URTW_TX_NOCRC | URTW_TX_MXDMA_MASK);
   2219 		data |= URTW_TX_MXDMA_2048 | URTW_TX_CWMIN | URTW_TX_DISCW;
   2220 		data &= ~URTW_TX_SWPLCPLEN;
   2221 		data |= URTW_TX_NOICV;
   2222 		urtw_write32_m(sc, URTW_TX_CONF, data);
   2223 	} else {
   2224 		data = URTW_TX_DURPROCMODE | URTW_TX_DISREQQSIZE |
   2225 		    URTW_TX_MXDMA_2048 | URTW_TX_SHORTRETRY |
   2226 		    URTW_TX_LONGRETRY;
   2227 		urtw_write32_m(sc, URTW_TX_CONF, data);
   2228 	}
   2229 
   2230 	urtw_read8_m(sc, URTW_CMD, &data8);
   2231 	urtw_write8_m(sc, URTW_CMD, data8 | URTW_CMD_TX_ENABLE);
   2232 fail:
   2233 	return error;
   2234 }
   2235 
   2236 int
   2237 urtw_init(struct ifnet *ifp)
   2238 {
   2239 	struct urtw_softc *sc = ifp->if_softc;
   2240 	struct urtw_rf *rf = &sc->sc_rf;
   2241 	struct ieee80211com *ic = &sc->sc_ic;
   2242 	usbd_status error;
   2243 
   2244 	urtw_stop(ifp, 0);
   2245 
   2246 	error = urtw_reset(sc);
   2247 	if (error)
   2248 		goto fail;
   2249 
   2250 	urtw_write8_m(sc, 0x85, 0);
   2251 	urtw_write8_m(sc, URTW_GPIO, 0);
   2252 
   2253 	/* for led */
   2254 	urtw_write8_m(sc, 0x85, 4);
   2255 	error = urtw_led_ctl(sc, URTW_LED_CTL_POWER_ON);
   2256 	if (error != 0)
   2257 		goto fail;
   2258 
   2259 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
   2260 	if (error)
   2261 		goto fail;
   2262 
   2263 	/* applying MAC address again. */
   2264 	IEEE80211_ADDR_COPY(ic->ic_myaddr, CLLADDR(ifp->if_sadl));
   2265 	error = urtw_set_macaddr(sc, ic->ic_myaddr);
   2266 	if (error)
   2267 		goto fail;
   2268 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
   2269 	if (error)
   2270 		goto fail;
   2271 
   2272 	error = urtw_update_msr(sc);
   2273 	if (error)
   2274 		goto fail;
   2275 
   2276 	urtw_write32_m(sc, URTW_INT_TIMEOUT, 0);
   2277 	urtw_write8_m(sc, URTW_WPA_CONFIG, 0);
   2278 	urtw_write8_m(sc, URTW_RATE_FALLBACK, 0x81);
   2279 	error = urtw_set_rate(sc);
   2280 	if (error != 0)
   2281 		goto fail;
   2282 
   2283 	error = rf->init(rf);
   2284 	if (error != 0)
   2285 		goto fail;
   2286 	if (rf->set_sens != NULL)
   2287 		rf->set_sens(rf);
   2288 
   2289 	urtw_write16_m(sc, 0x5e, 1);
   2290 	urtw_write16_m(sc, 0xfe, 0x10);
   2291 	urtw_write8_m(sc, URTW_TALLY_SEL, 0x80);
   2292 	urtw_write8_m(sc, 0xff, 0x60);
   2293 	urtw_write16_m(sc, 0x5e, 0);
   2294 	urtw_write8_m(sc, 0x85, 4);
   2295 
   2296 	error = urtw_intr_enable(sc);
   2297 	if (error != 0)
   2298 		goto fail;
   2299 
   2300 	/* reset softc variables */
   2301 	for (size_t j = 0; j < URTW_PRIORITY_MAX; j++) {
   2302 		sc->sc_txidx[j] = sc->sc_tx_queued[j] = 0;
   2303 	}
   2304 	sc->sc_txtimer = 0;
   2305 
   2306 	if (!(sc->sc_flags & URTW_INIT_ONCE)) {
   2307 		error = usbd_set_config_no(sc->sc_udev, URTW_CONFIG_NO, 0);
   2308 		if (error != 0) {
   2309 			aprint_error_dev(sc->sc_dev, "failed to set configuration"
   2310 			    ", err=%s\n", usbd_errstr(error));
   2311 			goto fail;
   2312 		}
   2313 		/* get the first interface handle */
   2314 		error = usbd_device2interface_handle(sc->sc_udev,
   2315 		    URTW_IFACE_INDEX, &sc->sc_iface);
   2316 		if (error != 0) {
   2317 			printf("%s: could not get interface handle\n",
   2318 			    device_xname(sc->sc_dev));
   2319 			goto fail;
   2320 		}
   2321 		error = urtw_open_pipes(sc);
   2322 		if (error != 0)
   2323 			goto fail;
   2324 		error = urtw_alloc_rx_data_list(sc);
   2325 		if (error != 0)
   2326 			goto fail;
   2327 		error = urtw_alloc_tx_data_list(sc);
   2328 		if (error != 0)
   2329 			goto fail;
   2330 		sc->sc_flags |= URTW_INIT_ONCE;
   2331 	}
   2332 
   2333 	error = urtw_rx_enable(sc);
   2334 	if (error != 0)
   2335 		goto fail;
   2336 	error = urtw_tx_enable(sc);
   2337 	if (error != 0)
   2338 		goto fail;
   2339 
   2340 	ifp->if_flags &= ~IFF_OACTIVE;
   2341 	ifp->if_flags |= IFF_RUNNING;
   2342 
   2343 	if (ic->ic_opmode == IEEE80211_M_MONITOR)
   2344 		ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
   2345 	else
   2346 		ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
   2347 
   2348 	return 0;
   2349 fail:
   2350 	return error;
   2351 }
   2352 
   2353 int
   2354 urtw_ioctl(struct ifnet *ifp, u_long cmd, void *data)
   2355 {
   2356 #define IS_RUNNING(ifp) \
   2357 	(((ifp)->if_flags & IFF_UP) && ((ifp)->if_flags & IFF_RUNNING))
   2358 
   2359 	struct urtw_softc *sc = ifp->if_softc;
   2360 	struct ieee80211com *ic = &sc->sc_ic;
   2361 	int s, error = 0;
   2362 
   2363 	if (sc->sc_dying)
   2364 		return ENXIO;
   2365 
   2366 	s = splnet();
   2367 
   2368 	switch (cmd) {
   2369 	case SIOCSIFFLAGS:
   2370 		if ((error = ifioctl_common(ifp, cmd, data)) != 0)
   2371 			break;
   2372 		switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
   2373 		case IFF_UP|IFF_RUNNING:
   2374 			break;
   2375 		case IFF_UP:
   2376 			ifp->if_init(ifp);
   2377 			break;
   2378 		case IFF_RUNNING:
   2379 			urtw_stop(ifp, 1);
   2380 			break;
   2381 		case 0:
   2382 			break;
   2383 		}
   2384 		break;
   2385 
   2386 	case SIOCADDMULTI:
   2387 	case SIOCDELMULTI:
   2388 		if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET)
   2389 			error = 0;
   2390 		break;
   2391 
   2392 	default:
   2393 		error = ieee80211_ioctl(ic, cmd, data);
   2394 		break;
   2395 	}
   2396 
   2397 	if (error == ENETRESET) {
   2398 		if (IS_RUNNING(ifp) &&
   2399 		    (ic->ic_roaming != IEEE80211_ROAMING_MANUAL))
   2400 			ifp->if_init(ifp);
   2401 		error = 0;
   2402 	}
   2403 
   2404 	splx(s);
   2405 
   2406 	return error;
   2407 #undef IS_RUNNING
   2408 }
   2409 
   2410 void
   2411 urtw_start(struct ifnet *ifp)
   2412 {
   2413 	struct urtw_softc *sc = ifp->if_softc;
   2414 	struct ieee80211com *ic = &sc->sc_ic;
   2415 	struct ieee80211_node *ni;
   2416 	struct ether_header *eh;
   2417 	struct mbuf *m0;
   2418 
   2419 	/*
   2420 	 * net80211 may still try to send management frames even if the
   2421 	 * IFF_RUNNING flag is not set...
   2422 	 */
   2423 	if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
   2424 		return;
   2425 
   2426 	for (;;) {
   2427 		IF_POLL(&ic->ic_mgtq, m0);
   2428 		if (m0 != NULL) {
   2429 
   2430 			if (sc->sc_tx_queued[URTW_PRIORITY_NORMAL] >=
   2431 			    URTW_TX_DATA_LIST_COUNT) {
   2432 				ifp->if_flags |= IFF_OACTIVE;
   2433 				break;
   2434 			}
   2435 			IF_DEQUEUE(&ic->ic_mgtq, m0);
   2436 			ni = (struct ieee80211_node *)m0->m_pkthdr.rcvif;
   2437 			m0->m_pkthdr.rcvif = NULL;
   2438 			bpf_mtap3(ic->ic_rawbpf, m0);
   2439 			if (urtw_tx_start(sc, ni, m0, URTW_PRIORITY_NORMAL)
   2440 			    != 0)
   2441 				break;
   2442 		} else {
   2443 			if (ic->ic_state != IEEE80211_S_RUN)
   2444 				break;
   2445 			IFQ_POLL(&ifp->if_snd, m0);
   2446 			if (m0 == NULL)
   2447 				break;
   2448 			if (sc->sc_tx_queued[URTW_PRIORITY_NORMAL] >=
   2449 			    URTW_TX_DATA_LIST_COUNT) {
   2450 				ifp->if_flags |= IFF_OACTIVE;
   2451 				break;
   2452 			}
   2453 			IFQ_DEQUEUE(&ifp->if_snd, m0);
   2454 			if (m0->m_len < sizeof(struct ether_header) &&
   2455 			    !(m0 = m_pullup(m0, sizeof(struct ether_header))))
   2456 				continue;
   2457 
   2458 			eh = mtod(m0, struct ether_header *);
   2459 			ni = ieee80211_find_txnode(ic, eh->ether_dhost);
   2460 			if (ni == NULL) {
   2461 				m_freem(m0);
   2462 				continue;
   2463 			}
   2464 			bpf_mtap(ifp, m0);
   2465 			m0 = ieee80211_encap(ic, m0, ni);
   2466 			if (m0 == NULL) {
   2467 				ieee80211_free_node(ni);
   2468 				continue;
   2469 			}
   2470 			bpf_mtap3(ic->ic_rawbpf, m0);
   2471 			if (urtw_tx_start(sc, ni, m0, URTW_PRIORITY_NORMAL)
   2472 			    != 0) {
   2473 				ieee80211_free_node(ni);
   2474 				ifp->if_oerrors++;
   2475 				break;
   2476 			}
   2477 		}
   2478 		sc->sc_txtimer = 5;
   2479 		ifp->if_timer = 1;
   2480 	}
   2481 }
   2482 
   2483 void
   2484 urtw_watchdog(struct ifnet *ifp)
   2485 {
   2486 	struct urtw_softc *sc = ifp->if_softc;
   2487 
   2488 	ifp->if_timer = 0;
   2489 
   2490 	if (sc->sc_txtimer > 0) {
   2491 		if (--sc->sc_txtimer == 0) {
   2492 			printf("%s: device timeout\n", device_xname(sc->sc_dev));
   2493 			ifp->if_oerrors++;
   2494 			return;
   2495 		}
   2496 		ifp->if_timer = 1;
   2497 	}
   2498 
   2499 	ieee80211_watchdog(&sc->sc_ic);
   2500 }
   2501 
   2502 void
   2503 urtw_txeof_low(struct usbd_xfer *xfer, void *priv,
   2504     usbd_status status)
   2505 {
   2506 	struct urtw_tx_data *data = priv;
   2507 	struct urtw_softc *sc = data->sc;
   2508 	struct ieee80211com *ic = &sc->sc_ic;
   2509 	struct ifnet *ifp = ic->ic_ifp;
   2510 	int s;
   2511 
   2512 	if (status != USBD_NORMAL_COMPLETION) {
   2513 		if (status == USBD_NOT_STARTED || status == USBD_CANCELLED)
   2514 			return;
   2515 
   2516 		printf("%s: could not transmit buffer: %s\n",
   2517 		    device_xname(sc->sc_dev), usbd_errstr(status));
   2518 
   2519 		if (status == USBD_STALLED)
   2520 			usbd_clear_endpoint_stall_async(sc->sc_txpipe_low);
   2521 
   2522 		ifp->if_oerrors++;
   2523 		return;
   2524 	}
   2525 
   2526 	s = splnet();
   2527 
   2528 	ieee80211_free_node(data->ni);
   2529 	data->ni = NULL;
   2530 
   2531 	sc->sc_txtimer = 0;
   2532 	ifp->if_opackets++;
   2533 
   2534 	sc->sc_tx_queued[URTW_PRIORITY_LOW]--;
   2535 	ifp->if_flags &= ~IFF_OACTIVE;
   2536 	urtw_start(ifp);
   2537 
   2538 	splx(s);
   2539 }
   2540 
   2541 void
   2542 urtw_txeof_normal(struct usbd_xfer *xfer, void *priv,
   2543     usbd_status status)
   2544 {
   2545 	struct urtw_tx_data *data = priv;
   2546 	struct urtw_softc *sc = data->sc;
   2547 	struct ieee80211com *ic = &sc->sc_ic;
   2548 	struct ifnet *ifp = ic->ic_ifp;
   2549 	int s;
   2550 
   2551 	if (status != USBD_NORMAL_COMPLETION) {
   2552 		if (status == USBD_NOT_STARTED || status == USBD_CANCELLED)
   2553 			return;
   2554 
   2555 		printf("%s: could not transmit buffer: %s\n",
   2556 		    device_xname(sc->sc_dev), usbd_errstr(status));
   2557 
   2558 		if (status == USBD_STALLED)
   2559 			usbd_clear_endpoint_stall_async(sc->sc_txpipe_normal);
   2560 
   2561 		ifp->if_oerrors++;
   2562 		return;
   2563 	}
   2564 
   2565 	s = splnet();
   2566 
   2567 	ieee80211_free_node(data->ni);
   2568 	data->ni = NULL;
   2569 
   2570 	sc->sc_txtimer = 0;
   2571 	ifp->if_opackets++;
   2572 
   2573 	sc->sc_tx_queued[URTW_PRIORITY_NORMAL]--;
   2574 	ifp->if_flags &= ~IFF_OACTIVE;
   2575 	urtw_start(ifp);
   2576 
   2577 	splx(s);
   2578 }
   2579 
   2580 int
   2581 urtw_tx_start(struct urtw_softc *sc, struct ieee80211_node *ni, struct mbuf *m0,
   2582     int prior)
   2583 {
   2584 	struct ieee80211com *ic = &sc->sc_ic;
   2585 	struct urtw_tx_data *data;
   2586 	struct ieee80211_frame *wh;
   2587 	struct ieee80211_key *k;
   2588 	usbd_status error;
   2589 	int xferlen;
   2590 
   2591 	wh = mtod(m0, struct ieee80211_frame *);
   2592 
   2593 	if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
   2594 		k = ieee80211_crypto_encap(ic, ni, m0);
   2595 		if (k == NULL) {
   2596 			m_freem(m0);
   2597 			return ENOBUFS;
   2598 		}
   2599 		/* packet header may have moved, reset our local pointer */
   2600 		wh = mtod(m0, struct ieee80211_frame *);
   2601 	}
   2602 
   2603 	if (sc->sc_drvbpf != NULL) {
   2604 		struct urtw_tx_radiotap_header *tap = &sc->sc_txtap;
   2605 
   2606 		tap->wt_flags = 0;
   2607 		tap->wt_rate = 0;
   2608 		tap->wt_chan_freq = htole16(ic->ic_bss->ni_chan->ic_freq);
   2609 		tap->wt_chan_flags = htole16(ic->ic_bss->ni_chan->ic_flags);
   2610 
   2611 		bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0);
   2612 	}
   2613 
   2614 	if (sc->sc_hwrev & URTW_HWREV_8187)
   2615 		xferlen = m0->m_pkthdr.len + 4 * 3;
   2616 	else
   2617 		xferlen = m0->m_pkthdr.len + 4 * 8;
   2618 
   2619 	if ((0 == xferlen % 64) || (0 == xferlen % 512))
   2620 		xferlen += 1;
   2621 
   2622 	data = &sc->sc_tx_data[prior][sc->sc_txidx[prior]];
   2623 	sc->sc_txidx[prior] =
   2624 	    (sc->sc_txidx[prior] + 1) % URTW_TX_DATA_LIST_COUNT;
   2625 
   2626 	memset(data->buf, 0, URTW_TX_MAXSIZE);
   2627 	data->buf[0] = m0->m_pkthdr.len & 0xff;
   2628 	data->buf[1] = (m0->m_pkthdr.len & 0x0f00) >> 8;
   2629 	data->buf[1] |= (1 << 7);
   2630 
   2631 	/* XXX sc_preamble_mode is always 2. */
   2632 	if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) &&
   2633 	    (ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_PREAMBLE) &&
   2634 	    (sc->sc_preamble_mode == 1) && (sc->sc_currate != 0))
   2635 		data->buf[2] |= 1;
   2636 	if ((m0->m_pkthdr.len > ic->ic_rtsthreshold) &&
   2637 	    prior == URTW_PRIORITY_LOW)
   2638 		panic("TODO tx.");
   2639 	if (wh->i_fc[1] & IEEE80211_FC1_MORE_FRAG)
   2640 		data->buf[2] |= (1 << 1);
   2641 	/* RTS rate - 10 means we use a basic rate. */
   2642 	data->buf[2] |= (urtw_rate2rtl(2) << 3);
   2643 	/*
   2644 	 * XXX currently TX rate control depends on the rate value of
   2645 	 * RX descriptor because I don't know how to we can control TX rate
   2646 	 * in more smart way.  Please fix me you find a thing.
   2647 	 */
   2648 	data->buf[3] = sc->sc_currate;
   2649 	if (prior == URTW_PRIORITY_NORMAL) {
   2650 		if (IEEE80211_IS_MULTICAST(wh->i_addr1))
   2651 			data->buf[3] = urtw_rate2rtl(ni->ni_rates.rs_rates[0]);
   2652 		else if (ic->ic_fixed_rate != -1)
   2653 			data->buf[3] = urtw_rate2rtl(ic->ic_fixed_rate);
   2654 	}
   2655 
   2656 	if (sc->sc_hwrev & URTW_HWREV_8187) {
   2657 		data->buf[8] = 3;		/* CW minimum */
   2658 		data->buf[8] |= (7 << 4);	/* CW maximum */
   2659 		data->buf[9] |= 11;		/* retry limitation */
   2660 		m_copydata(m0, 0, m0->m_pkthdr.len, (uint8_t *)&data->buf[12]);
   2661 	} else {
   2662 		data->buf[21] |= 11;		/* retry limitation */
   2663 		m_copydata(m0, 0, m0->m_pkthdr.len, (uint8_t *)&data->buf[32]);
   2664 	}
   2665 
   2666 	data->ni = ni;
   2667 
   2668 	/* mbuf is no longer needed. */
   2669 	m_freem(m0);
   2670 
   2671 	usbd_setup_xfer(data->xfer, data, data->buf, xferlen,
   2672 	    USBD_FORCE_SHORT_XFER, URTW_DATA_TIMEOUT,
   2673 	    (prior == URTW_PRIORITY_LOW) ? urtw_txeof_low : urtw_txeof_normal);
   2674 	error = usbd_transfer(data->xfer);
   2675 	if (error != USBD_IN_PROGRESS && error != USBD_NORMAL_COMPLETION) {
   2676 		printf("%s: could not send frame: %s\n",
   2677 		    device_xname(sc->sc_dev), usbd_errstr(error));
   2678 		return EIO;
   2679 	}
   2680 
   2681 	error = urtw_led_ctl(sc, URTW_LED_CTL_TX);
   2682 	if (error != 0)
   2683 		printf("%s: could not control LED (%d)\n",
   2684 		    device_xname(sc->sc_dev), error);
   2685 
   2686 	sc->sc_tx_queued[prior]++;
   2687 
   2688 	return 0;
   2689 }
   2690 
   2691 usbd_status
   2692 urtw_8225_usb_init(struct urtw_softc *sc)
   2693 {
   2694 	uint8_t data;
   2695 	usbd_status error;
   2696 
   2697 	urtw_write8_m(sc, URTW_RF_PINS_SELECT + 1, 0);
   2698 	urtw_write8_m(sc, URTW_GPIO, 0);
   2699 	error = urtw_read8e(sc, 0x53, &data);
   2700 	if (error)
   2701 		goto fail;
   2702 	error = urtw_write8e(sc, 0x53, data | (1 << 7));
   2703 	if (error)
   2704 		goto fail;
   2705 	urtw_write8_m(sc, URTW_RF_PINS_SELECT + 1, 4);
   2706 	urtw_write8_m(sc, URTW_GPIO, 0x20);
   2707 	urtw_write8_m(sc, URTW_GP_ENABLE, 0);
   2708 
   2709 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x80);
   2710 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x80);
   2711 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x80);
   2712 
   2713 	usbd_delay_ms(sc->sc_udev, 500);
   2714 fail:
   2715 	return error;
   2716 }
   2717 
   2718 usbd_status
   2719 urtw_8185_rf_pins_enable(struct urtw_softc *sc)
   2720 {
   2721 	usbd_status error = 0;
   2722 
   2723 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x1ff7);
   2724 fail:
   2725 	return error;
   2726 }
   2727 
   2728 usbd_status
   2729 urtw_8187_write_phy(struct urtw_softc *sc, uint8_t addr, uint32_t data)
   2730 {
   2731 	uint32_t phyw;
   2732 	usbd_status error;
   2733 
   2734 	phyw = ((data << 8) | (addr | 0x80));
   2735 	urtw_write8_m(sc, 0x7f, ((phyw & 0xff000000) >> 24));
   2736 	urtw_write8_m(sc, 0x7e, ((phyw & 0x00ff0000) >> 16));
   2737 	urtw_write8_m(sc, 0x7d, ((phyw & 0x0000ff00) >> 8));
   2738 	urtw_write8_m(sc, 0x7c, ((phyw & 0x000000ff)));
   2739 	/*
   2740 	 * Delay removed from 8185 to 8187.
   2741 	 * usbd_delay_ms(sc->sc_udev, 1);
   2742 	 */
   2743 fail:
   2744 	return error;
   2745 }
   2746 
   2747 usbd_status
   2748 urtw_8187_write_phy_ofdm_c(struct urtw_softc *sc, uint8_t addr, uint32_t data)
   2749 {
   2750 	data = data & 0xff;
   2751 	return urtw_8187_write_phy(sc, addr, data);
   2752 }
   2753 
   2754 usbd_status
   2755 urtw_8187_write_phy_cck_c(struct urtw_softc *sc, uint8_t addr, uint32_t data)
   2756 {
   2757 	data = data & 0xff;
   2758 	return urtw_8187_write_phy(sc, addr, data | 0x10000);
   2759 }
   2760 
   2761 usbd_status
   2762 urtw_8225_setgain(struct urtw_softc *sc, int16_t gain)
   2763 {
   2764 	usbd_status error;
   2765 
   2766 	urtw_8187_write_phy_ofdm(sc, 0x0d, urtw_8225_gain[gain * 4]);
   2767 	urtw_8187_write_phy_ofdm(sc, 0x1b, urtw_8225_gain[gain * 4 + 2]);
   2768 	urtw_8187_write_phy_ofdm(sc, 0x1d, urtw_8225_gain[gain * 4 + 3]);
   2769 	urtw_8187_write_phy_ofdm(sc, 0x23, urtw_8225_gain[gain * 4 + 1]);
   2770 fail:
   2771 	return error;
   2772 }
   2773 
   2774 usbd_status
   2775 urtw_8225_set_txpwrlvl(struct urtw_softc *sc, int chan)
   2776 {
   2777 	int i, idx, set;
   2778 	uint8_t *cck_pwltable;
   2779 	uint8_t cck_pwrlvl_max, ofdm_pwrlvl_min, ofdm_pwrlvl_max;
   2780 	uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff;
   2781 	uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff;
   2782 	usbd_status error;
   2783 
   2784 	cck_pwrlvl_max = 11;
   2785 	ofdm_pwrlvl_max = 25;	/* 12 -> 25 */
   2786 	ofdm_pwrlvl_min = 10;
   2787 
   2788 	/* CCK power setting */
   2789 	cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ? cck_pwrlvl_max : cck_pwrlvl;
   2790 	idx = cck_pwrlvl % 6;
   2791 	set = cck_pwrlvl / 6;
   2792 	cck_pwltable = (chan == 14) ? urtw_8225_txpwr_cck_ch14 :
   2793 	    urtw_8225_txpwr_cck;
   2794 
   2795 	urtw_write8_m(sc, URTW_TX_GAIN_CCK,
   2796 	    urtw_8225_tx_gain_cck_ofdm[set] >> 1);
   2797 	for (i = 0; i < 8; i++) {
   2798 		urtw_8187_write_phy_cck(sc, 0x44 + i,
   2799 		    cck_pwltable[idx * 8 + i]);
   2800 	}
   2801 	usbd_delay_ms(sc->sc_udev, 1);
   2802 
   2803 	/* OFDM power setting */
   2804 	ofdm_pwrlvl = (ofdm_pwrlvl > (ofdm_pwrlvl_max - ofdm_pwrlvl_min)) ?
   2805 	    ofdm_pwrlvl_max : ofdm_pwrlvl + ofdm_pwrlvl_min;
   2806 	ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl;
   2807 
   2808 	idx = ofdm_pwrlvl % 6;
   2809 	set = ofdm_pwrlvl / 6;
   2810 
   2811 	error = urtw_8185_set_anaparam2(sc, URTW_8187_8225_ANAPARAM2_ON);
   2812 	if (error)
   2813 		goto fail;
   2814 	urtw_8187_write_phy_ofdm(sc, 2, 0x42);
   2815 	urtw_8187_write_phy_ofdm(sc, 6, 0);
   2816 	urtw_8187_write_phy_ofdm(sc, 8, 0);
   2817 
   2818 	urtw_write8_m(sc, URTW_TX_GAIN_OFDM,
   2819 	    urtw_8225_tx_gain_cck_ofdm[set] >> 1);
   2820 	urtw_8187_write_phy_ofdm(sc, 0x5, urtw_8225_txpwr_ofdm[idx]);
   2821 	urtw_8187_write_phy_ofdm(sc, 0x7, urtw_8225_txpwr_ofdm[idx]);
   2822 	usbd_delay_ms(sc->sc_udev, 1);
   2823 fail:
   2824 	return error;
   2825 }
   2826 
   2827 usbd_status
   2828 urtw_8185_tx_antenna(struct urtw_softc *sc, uint8_t ant)
   2829 {
   2830 	usbd_status error;
   2831 
   2832 	urtw_write8_m(sc, URTW_TX_ANTENNA, ant);
   2833 	usbd_delay_ms(sc->sc_udev, 1);
   2834 fail:
   2835 	return error;
   2836 }
   2837 
   2838 usbd_status
   2839 urtw_8225_rf_init(struct urtw_rf *rf)
   2840 {
   2841 	struct urtw_softc *sc = rf->rf_sc;
   2842 	unsigned int i;
   2843 	uint16_t data;
   2844 	usbd_status error;
   2845 
   2846 	error = urtw_8180_set_anaparam(sc, URTW_8187_8225_ANAPARAM_ON);
   2847 	if (error)
   2848 		goto fail;
   2849 
   2850 	error = urtw_8225_usb_init(sc);
   2851 	if (error)
   2852 		goto fail;
   2853 
   2854 	urtw_write32_m(sc, URTW_RF_TIMING, 0x000a8008);
   2855 	urtw_read16_m(sc, URTW_8187_BRSR, &data);	/* XXX ??? */
   2856 	urtw_write16_m(sc, URTW_8187_BRSR, 0xffff);
   2857 	urtw_write32_m(sc, URTW_RF_PARA, 0x100044);
   2858 
   2859 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
   2860 	if (error)
   2861 		goto fail;
   2862 	urtw_write8_m(sc, URTW_CONFIG3, 0x44);
   2863 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
   2864 	if (error)
   2865 		goto fail;
   2866 
   2867 	error = urtw_8185_rf_pins_enable(sc);
   2868 	if (error)
   2869 		goto fail;
   2870 
   2871 	usbd_delay_ms(sc->sc_udev, 500);
   2872 
   2873 	for (i = 0; i < __arraycount(urtw_8225_rf_part1); i++) {
   2874 		urtw_8225_write(sc, urtw_8225_rf_part1[i].reg,
   2875 		    urtw_8225_rf_part1[i].val);
   2876 	}
   2877 	usbd_delay_ms(sc->sc_udev, 50);
   2878 	urtw_8225_write(sc, 0x2, 0xc4d);
   2879 	usbd_delay_ms(sc->sc_udev, 200);
   2880 	urtw_8225_write(sc, 0x2, 0x44d);
   2881 	usbd_delay_ms(sc->sc_udev, 200);
   2882 	urtw_8225_write(sc, 0x0, 0x127);
   2883 
   2884 	for (i = 0; i < __arraycount(urtw_8225_rxgain); i++) {
   2885 		urtw_8225_write(sc, 0x1, (uint8_t)(i + 1));
   2886 		urtw_8225_write(sc, 0x2, urtw_8225_rxgain[i]);
   2887 	}
   2888 
   2889 	urtw_8225_write(sc, 0x0, 0x27);
   2890 	urtw_8225_write(sc, 0x0, 0x22f);
   2891 
   2892 	for (i = 0; i < __arraycount(urtw_8225_agc); i++) {
   2893 		urtw_8187_write_phy_ofdm(sc, 0xb, urtw_8225_agc[i]);
   2894 		urtw_8187_write_phy_ofdm(sc, 0xa, (uint8_t)i + 0x80);
   2895 	}
   2896 
   2897 	for (i = 0; i < __arraycount(urtw_8225_rf_part2); i++) {
   2898 		urtw_8187_write_phy_ofdm(sc, urtw_8225_rf_part2[i].reg,
   2899 		    urtw_8225_rf_part2[i].val);
   2900 		usbd_delay_ms(sc->sc_udev, 1);
   2901 	}
   2902 
   2903 	error = urtw_8225_setgain(sc, 4);
   2904 	if (error)
   2905 		goto fail;
   2906 
   2907 	for (i = 0; i < __arraycount(urtw_8225_rf_part3); i++) {
   2908 		urtw_8187_write_phy_cck(sc, urtw_8225_rf_part3[i].reg,
   2909 		    urtw_8225_rf_part3[i].val);
   2910 		usbd_delay_ms(sc->sc_udev, 1);
   2911 	}
   2912 
   2913 	urtw_write8_m(sc, 0x5b, 0x0d);
   2914 
   2915 	error = urtw_8225_set_txpwrlvl(sc, 1);
   2916 	if (error)
   2917 		goto fail;
   2918 
   2919 	urtw_8187_write_phy_cck(sc, 0x10, 0x9b);
   2920 	usbd_delay_ms(sc->sc_udev, 1);
   2921 	urtw_8187_write_phy_ofdm(sc, 0x26, 0x90);
   2922 	usbd_delay_ms(sc->sc_udev, 1);
   2923 
   2924 	/* TX ant A, 0x0 for B */
   2925 	error = urtw_8185_tx_antenna(sc, 0x3);
   2926 	if (error)
   2927 		goto fail;
   2928 	urtw_write32_m(sc, 0x94, 0x3dc00002);
   2929 
   2930 	error = urtw_8225_rf_set_chan(rf, 1);
   2931 fail:
   2932 	return error;
   2933 }
   2934 
   2935 usbd_status
   2936 urtw_8225_rf_set_chan(struct urtw_rf *rf, int chan)
   2937 {
   2938 	struct urtw_softc *sc = rf->rf_sc;
   2939 	struct ieee80211com *ic = &sc->sc_ic;
   2940 	struct ieee80211_channel *c = ic->ic_ibss_chan;
   2941 	usbd_status error;
   2942 
   2943 	error = urtw_8225_set_txpwrlvl(sc, chan);
   2944 	if (error)
   2945 		goto fail;
   2946 	urtw_8225_write(sc, 0x7, urtw_8225_channel[chan]);
   2947 	usbd_delay_ms(sc->sc_udev, 10);
   2948 
   2949 	urtw_write8_m(sc, URTW_SIFS, 0x22);
   2950 
   2951 	if (sc->sc_state == IEEE80211_S_ASSOC &&
   2952 	    ic->ic_flags & IEEE80211_F_SHSLOT)
   2953 		urtw_write8_m(sc, URTW_SLOT, 0x9);
   2954 	else
   2955 		urtw_write8_m(sc, URTW_SLOT, 0x14);
   2956 
   2957 	if (IEEE80211_IS_CHAN_G(c)) {
   2958 		urtw_write8_m(sc, URTW_DIFS, 0x14);
   2959 		urtw_write8_m(sc, URTW_8187_EIFS, 0x5b - 0x14);
   2960 		urtw_write8_m(sc, URTW_CW_VAL, 0x73);
   2961 	} else {
   2962 		urtw_write8_m(sc, URTW_DIFS, 0x24);
   2963 		urtw_write8_m(sc, URTW_8187_EIFS, 0x5b - 0x24);
   2964 		urtw_write8_m(sc, URTW_CW_VAL, 0xa5);
   2965 	}
   2966 
   2967 fail:
   2968 	return error;
   2969 }
   2970 
   2971 usbd_status
   2972 urtw_8225_rf_set_sens(struct urtw_rf *rf)
   2973 {
   2974 	struct urtw_softc *sc = rf->rf_sc;
   2975 	usbd_status error;
   2976 
   2977 	if (rf->sens > 6)
   2978 		return -1;
   2979 
   2980 	if (rf->sens > 4)
   2981 		urtw_8225_write(sc, 0x0c, 0x850);
   2982 	else
   2983 		urtw_8225_write(sc, 0x0c, 0x50);
   2984 
   2985 	rf->sens = 6 - rf->sens;
   2986 	error = urtw_8225_setgain(sc, rf->sens);
   2987 	if (error)
   2988 		goto fail;
   2989 
   2990 	urtw_8187_write_phy_cck(sc, 0x41, urtw_8225_threshold[rf->sens]);
   2991 
   2992 fail:
   2993 	return error;
   2994 }
   2995 
   2996 void
   2997 urtw_stop(struct ifnet *ifp, int disable)
   2998 {
   2999 	struct urtw_softc *sc = ifp->if_softc;
   3000 	struct ieee80211com *ic = &sc->sc_ic;
   3001 	uint8_t data;
   3002 	usbd_status error;
   3003 
   3004 	ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
   3005 
   3006 	sc->sc_txtimer = 0;
   3007 	ifp->if_timer = 0;
   3008 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
   3009 
   3010 	callout_stop(&sc->scan_to);
   3011 	callout_stop(&sc->sc_led_ch);
   3012 
   3013 	urtw_intr_disable(sc);
   3014 	urtw_read8_m(sc, URTW_CMD, &data);
   3015 	data &= ~URTW_CMD_TX_ENABLE;
   3016 	data &= ~URTW_CMD_RX_ENABLE;
   3017 	urtw_write8_m(sc, URTW_CMD, data);
   3018 
   3019 	if (sc->sc_rxpipe != NULL)
   3020 		usbd_abort_pipe(sc->sc_rxpipe);
   3021 	if (sc->sc_txpipe_low != NULL)
   3022 		usbd_abort_pipe(sc->sc_txpipe_low);
   3023 	if (sc->sc_txpipe_normal != NULL)
   3024 		usbd_abort_pipe(sc->sc_txpipe_normal);
   3025 
   3026 fail:
   3027 	return;
   3028 }
   3029 
   3030 int
   3031 urtw_isbmode(uint16_t rate)
   3032 {
   3033 	rate = urtw_rtl2rate(rate);
   3034 
   3035 	return ((rate <= 22 && rate != 12 && rate != 18) ||
   3036 	    rate == 44) ? 1 : 0;
   3037 }
   3038 
   3039 void
   3040 urtw_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status)
   3041 {
   3042 	struct urtw_rx_data *data = priv;
   3043 	struct urtw_softc *sc = data->sc;
   3044 	struct ieee80211com *ic = &sc->sc_ic;
   3045 	struct ifnet *ifp = ic->ic_ifp;
   3046 	struct ieee80211_frame *wh;
   3047 	struct ieee80211_node *ni;
   3048 	struct mbuf *m, *mnew;
   3049 	uint8_t *desc, quality, rate;
   3050 	int actlen, flen, len, rssi, s;
   3051 
   3052 	if (status != USBD_NORMAL_COMPLETION) {
   3053 		if (status == USBD_NOT_STARTED || status == USBD_CANCELLED)
   3054 			return;
   3055 
   3056 		if (status == USBD_STALLED)
   3057 			usbd_clear_endpoint_stall_async(sc->sc_rxpipe);
   3058 		ifp->if_ierrors++;
   3059 		goto skip;
   3060 	}
   3061 
   3062 	usbd_get_xfer_status(xfer, NULL, NULL, &actlen, NULL);
   3063 	if (actlen < URTW_MIN_RXBUFSZ) {
   3064 		ifp->if_ierrors++;
   3065 		goto skip;
   3066 	}
   3067 
   3068 	if (sc->sc_hwrev & URTW_HWREV_8187)
   3069 		/* 4 dword and 4 byte CRC */
   3070 		len = actlen - (4 * 4);
   3071 	else
   3072 		/* 5 dword and 4 byte CRC */
   3073 		len = actlen - (4 * 5);
   3074 
   3075 	desc = data->buf + len;
   3076 	flen = ((desc[1] & 0x0f) << 8) + (desc[0] & 0xff);
   3077 	if (flen > actlen) {
   3078 		ifp->if_ierrors++;
   3079 		goto skip;
   3080 	}
   3081 
   3082 	rate = (desc[2] & 0xf0) >> 4;
   3083 	if (sc->sc_hwrev & URTW_HWREV_8187) {
   3084 		quality = desc[4] & 0xff;
   3085 		rssi = (desc[6] & 0xfe) >> 1;
   3086 
   3087 		/* XXX correct? */
   3088 		if (!urtw_isbmode(rate)) {
   3089 			rssi = (rssi > 90) ? 90 : ((rssi < 25) ? 25 : rssi);
   3090 			rssi = ((90 - rssi) * 100) / 65;
   3091 		} else {
   3092 			rssi = (rssi > 90) ? 95 : ((rssi < 30) ? 30 : rssi);
   3093 			rssi = ((95 - rssi) * 100) / 65;
   3094 		}
   3095 	} else {
   3096 		quality = desc[12];
   3097 		rssi = 14 - desc[14] / 2;
   3098 	}
   3099 
   3100 	MGETHDR(mnew, M_DONTWAIT, MT_DATA);
   3101 	if (mnew == NULL) {
   3102 		printf("%s: could not allocate rx mbuf\n",
   3103 		    device_xname(sc->sc_dev));
   3104 		ifp->if_ierrors++;
   3105 		goto skip;
   3106 	}
   3107 	MCLGET(mnew, M_DONTWAIT);
   3108 	if (!(mnew->m_flags & M_EXT)) {
   3109 		printf("%s: could not allocate rx mbuf cluster\n",
   3110 		    device_xname(sc->sc_dev));
   3111 		m_freem(mnew);
   3112 		ifp->if_ierrors++;
   3113 		goto skip;
   3114 	}
   3115 
   3116 	m = data->m;
   3117 	data->m = mnew;
   3118 	data->buf = mtod(mnew, uint8_t *);
   3119 
   3120 	/* finalize mbuf */
   3121 	m->m_pkthdr.rcvif = ifp;
   3122 	m->m_pkthdr.len = m->m_len = flen - 4;
   3123 
   3124 	s = splnet();
   3125 
   3126 	if (sc->sc_drvbpf != NULL) {
   3127 		struct urtw_rx_radiotap_header *tap = &sc->sc_rxtap;
   3128 
   3129 		/* XXX Are variables correct? */
   3130 		tap->wr_chan_freq = htole16(ic->ic_ibss_chan->ic_freq);
   3131 		tap->wr_chan_flags = htole16(ic->ic_ibss_chan->ic_flags);
   3132 		tap->wr_dbm_antsignal = (int8_t)rssi;
   3133 
   3134 		bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m);
   3135 	}
   3136 	wh = mtod(m, struct ieee80211_frame *);
   3137 	if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_DATA)
   3138 		sc->sc_currate = (rate > 0) ? rate : sc->sc_currate;
   3139 	ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh);
   3140 
   3141 	/* XXX correct? */
   3142 	if (!urtw_isbmode(rate)) {
   3143 		if (quality > 127)
   3144 			quality = 0;
   3145 		else if (quality < 27)
   3146 			quality = 100;
   3147 		else
   3148 			quality = 127 - quality;
   3149 	} else
   3150 		quality = (quality > 64) ? 0 : ((64 - quality) * 100) / 64;
   3151 
   3152 	/* send the frame to the 802.11 layer */
   3153 	ieee80211_input(ic, m, ni, rssi, 0);
   3154 
   3155 	/* node is no longer needed */
   3156 	ieee80211_free_node(ni);
   3157 
   3158 	splx(s);
   3159 
   3160 skip:	/* setup a new transfer */
   3161 	usbd_setup_xfer(xfer, data, data->buf, MCLBYTES,
   3162 	    USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, urtw_rxeof);
   3163 	(void)usbd_transfer(xfer);
   3164 }
   3165 
   3166 usbd_status
   3167 urtw_8225v2_setgain(struct urtw_softc *sc, int16_t gain)
   3168 {
   3169 	uint8_t *gainp;
   3170 	usbd_status error;
   3171 
   3172 	/* XXX for A? */
   3173 	gainp = urtw_8225v2_gain_bg;
   3174 	urtw_8187_write_phy_ofdm(sc, 0x0d, gainp[gain * 3]);
   3175 	usbd_delay_ms(sc->sc_udev, 1);
   3176 	urtw_8187_write_phy_ofdm(sc, 0x1b, gainp[gain * 3 + 1]);
   3177 	usbd_delay_ms(sc->sc_udev, 1);
   3178 	urtw_8187_write_phy_ofdm(sc, 0x1d, gainp[gain * 3 + 2]);
   3179 	usbd_delay_ms(sc->sc_udev, 1);
   3180 	urtw_8187_write_phy_ofdm(sc, 0x21, 0x17);
   3181 	usbd_delay_ms(sc->sc_udev, 1);
   3182 fail:
   3183 	return error;
   3184 }
   3185 
   3186 usbd_status
   3187 urtw_8225v2_set_txpwrlvl(struct urtw_softc *sc, int chan)
   3188 {
   3189 	int i;
   3190 	uint8_t *cck_pwrtable;
   3191 	uint8_t cck_pwrlvl_max = 15, ofdm_pwrlvl_max = 25, ofdm_pwrlvl_min = 10;
   3192 	uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff;
   3193 	uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff;
   3194 	usbd_status error;
   3195 
   3196 	/* CCK power setting */
   3197 	cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ? cck_pwrlvl_max : cck_pwrlvl;
   3198 	cck_pwrlvl += sc->sc_txpwr_cck_base;
   3199 	cck_pwrlvl = (cck_pwrlvl > 35) ? 35 : cck_pwrlvl;
   3200 	cck_pwrtable = (chan == 14) ? urtw_8225v2_txpwr_cck_ch14 :
   3201 	    urtw_8225v2_txpwr_cck;
   3202 
   3203 	for (i = 0; i < 8; i++) {
   3204 		urtw_8187_write_phy_cck(sc, 0x44 + i, cck_pwrtable[i]);
   3205 	}
   3206 	urtw_write8_m(sc, URTW_TX_GAIN_CCK,
   3207 	    urtw_8225v2_tx_gain_cck_ofdm[cck_pwrlvl]);
   3208 	usbd_delay_ms(sc->sc_udev, 1);
   3209 
   3210 	/* OFDM power setting */
   3211 	ofdm_pwrlvl = (ofdm_pwrlvl > (ofdm_pwrlvl_max - ofdm_pwrlvl_min)) ?
   3212 		ofdm_pwrlvl_max : ofdm_pwrlvl + ofdm_pwrlvl_min;
   3213 	ofdm_pwrlvl += sc->sc_txpwr_ofdm_base;
   3214 	ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl;
   3215 
   3216 	error = urtw_8185_set_anaparam2(sc, URTW_8187_8225_ANAPARAM2_ON);
   3217 	if (error)
   3218 		goto fail;
   3219 
   3220 	urtw_8187_write_phy_ofdm(sc, 2, 0x42);
   3221 	urtw_8187_write_phy_ofdm(sc, 5, 0x0);
   3222 	urtw_8187_write_phy_ofdm(sc, 6, 0x40);
   3223 	urtw_8187_write_phy_ofdm(sc, 7, 0x0);
   3224 	urtw_8187_write_phy_ofdm(sc, 8, 0x40);
   3225 
   3226 	urtw_write8_m(sc, URTW_TX_GAIN_OFDM,
   3227 	    urtw_8225v2_tx_gain_cck_ofdm[ofdm_pwrlvl]);
   3228 	usbd_delay_ms(sc->sc_udev, 1);
   3229 fail:
   3230 	return error;
   3231 }
   3232 
   3233 usbd_status
   3234 urtw_8225v2_rf_init(struct urtw_rf *rf)
   3235 {
   3236 	struct urtw_softc *sc = rf->rf_sc;
   3237 	int i;
   3238 	uint16_t data;
   3239 	uint32_t data32;
   3240 	usbd_status error;
   3241 
   3242 	error = urtw_8180_set_anaparam(sc, URTW_8187_8225_ANAPARAM_ON);
   3243 	if (error)
   3244 		goto fail;
   3245 
   3246 	error = urtw_8225_usb_init(sc);
   3247 	if (error)
   3248 		goto fail;
   3249 
   3250 	urtw_write32_m(sc, URTW_RF_TIMING, 0x000a8008);
   3251 	urtw_read16_m(sc, URTW_8187_BRSR, &data);	/* XXX ??? */
   3252 	urtw_write16_m(sc, URTW_8187_BRSR, 0xffff);
   3253 	urtw_write32_m(sc, URTW_RF_PARA, 0x100044);
   3254 
   3255 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
   3256 	if (error)
   3257 		goto fail;
   3258 	urtw_write8_m(sc, URTW_CONFIG3, 0x44);
   3259 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
   3260 	if (error)
   3261 		goto fail;
   3262 
   3263 	error = urtw_8185_rf_pins_enable(sc);
   3264 	if (error)
   3265 		goto fail;
   3266 
   3267 	usbd_delay_ms(sc->sc_udev, 1000);
   3268 
   3269 	for (i = 0; i < __arraycount(urtw_8225v2_rf_part1); i++) {
   3270 		urtw_8225_write(sc, urtw_8225v2_rf_part1[i].reg,
   3271 		    urtw_8225v2_rf_part1[i].val);
   3272 		usbd_delay_ms(sc->sc_udev, 1);
   3273 	}
   3274 	usbd_delay_ms(sc->sc_udev, 50);
   3275 
   3276 	urtw_8225_write(sc, 0x0, 0x1b7);
   3277 
   3278 	for (i = 0; i < __arraycount(urtw_8225v2_rxgain); i++) {
   3279 		urtw_8225_write(sc, 0x1, (uint8_t)(i + 1));
   3280 		urtw_8225_write(sc, 0x2, urtw_8225v2_rxgain[i]);
   3281 	}
   3282 
   3283 	urtw_8225_write(sc, 0x3, 0x2);
   3284 	urtw_8225_write(sc, 0x5, 0x4);
   3285 	urtw_8225_write(sc, 0x0, 0xb7);
   3286 	urtw_8225_write(sc, 0x2, 0xc4d);
   3287 	usbd_delay_ms(sc->sc_udev, 100);
   3288 	urtw_8225_write(sc, 0x2, 0x44d);
   3289 	usbd_delay_ms(sc->sc_udev, 100);
   3290 
   3291 	error = urtw_8225_read(sc, 0x6, &data32);
   3292 	if (error != 0)
   3293 		goto fail;
   3294 	if (data32 != 0xe6)
   3295 		printf("%s: expect 0xe6!! (0x%x)\n", device_xname(sc->sc_dev),
   3296 		    data32);
   3297 	if (!(data32 & 0x80)) {
   3298 		urtw_8225_write(sc, 0x02, 0x0c4d);
   3299 		usbd_delay_ms(sc->sc_udev, 200);
   3300 		urtw_8225_write(sc, 0x02, 0x044d);
   3301 		usbd_delay_ms(sc->sc_udev, 100);
   3302 		error = urtw_8225_read(sc, 0x6, &data32);
   3303 		if (error != 0)
   3304 			goto fail;
   3305 		if (!(data32 & 0x80))
   3306 			printf("%s: RF calibration failed\n",
   3307 			    device_xname(sc->sc_dev));
   3308 	}
   3309 	usbd_delay_ms(sc->sc_udev, 100);
   3310 
   3311 	urtw_8225_write(sc, 0x0, 0x2bf);
   3312 	for (i = 0; i < __arraycount(urtw_8225_agc); i++) {
   3313 		urtw_8187_write_phy_ofdm(sc, 0xb, urtw_8225_agc[i]);
   3314 		urtw_8187_write_phy_ofdm(sc, 0xa, (uint8_t)i + 0x80);
   3315 	}
   3316 
   3317 	for (i = 0; i < __arraycount(urtw_8225v2_rf_part2); i++) {
   3318 		urtw_8187_write_phy_ofdm(sc, urtw_8225v2_rf_part2[i].reg,
   3319 		    urtw_8225v2_rf_part2[i].val);
   3320 	}
   3321 
   3322 	error = urtw_8225v2_setgain(sc, 4);
   3323 	if (error)
   3324 		goto fail;
   3325 
   3326 	for (i = 0; i < __arraycount(urtw_8225v2_rf_part3); i++) {
   3327 		urtw_8187_write_phy_cck(sc, urtw_8225v2_rf_part3[i].reg,
   3328 		    urtw_8225v2_rf_part3[i].val);
   3329 	}
   3330 
   3331 	urtw_write8_m(sc, 0x5b, 0x0d);
   3332 
   3333 	error = urtw_8225v2_set_txpwrlvl(sc, 1);
   3334 	if (error)
   3335 		goto fail;
   3336 
   3337 	urtw_8187_write_phy_cck(sc, 0x10, 0x9b);
   3338 	urtw_8187_write_phy_ofdm(sc, 0x26, 0x90);
   3339 
   3340 	/* TX ant A, 0x0 for B */
   3341 	error = urtw_8185_tx_antenna(sc, 0x3);
   3342 	if (error)
   3343 		goto fail;
   3344 	urtw_write32_m(sc, 0x94, 0x3dc00002);
   3345 
   3346 	error = urtw_8225_rf_set_chan(rf, 1);
   3347 fail:
   3348 	return error;
   3349 }
   3350 
   3351 usbd_status
   3352 urtw_8225v2_rf_set_chan(struct urtw_rf *rf, int chan)
   3353 {
   3354 	struct urtw_softc *sc = rf->rf_sc;
   3355 	struct ieee80211com *ic = &sc->sc_ic;
   3356 	struct ieee80211_channel *c = ic->ic_ibss_chan;
   3357 	usbd_status error;
   3358 
   3359 	error = urtw_8225v2_set_txpwrlvl(sc, chan);
   3360 	if (error)
   3361 		goto fail;
   3362 
   3363 	urtw_8225_write(sc, 0x7, urtw_8225_channel[chan]);
   3364 	usbd_delay_ms(sc->sc_udev, 10);
   3365 
   3366 	urtw_write8_m(sc, URTW_SIFS, 0x22);
   3367 
   3368 	if(sc->sc_state == IEEE80211_S_ASSOC &&
   3369 	    ic->ic_flags & IEEE80211_F_SHSLOT)
   3370 		urtw_write8_m(sc, URTW_SLOT, 0x9);
   3371 	else
   3372 		urtw_write8_m(sc, URTW_SLOT, 0x14);
   3373 
   3374 	if (IEEE80211_IS_CHAN_G(c)) {
   3375 		urtw_write8_m(sc, URTW_DIFS, 0x14);
   3376 		urtw_write8_m(sc, URTW_8187_EIFS, 0x5b - 0x14);
   3377 		urtw_write8_m(sc, URTW_CW_VAL, 0x73);
   3378 	} else {
   3379 		urtw_write8_m(sc, URTW_DIFS, 0x24);
   3380 		urtw_write8_m(sc, URTW_8187_EIFS, 0x5b - 0x24);
   3381 		urtw_write8_m(sc, URTW_CW_VAL, 0xa5);
   3382 	}
   3383 
   3384 fail:
   3385 	return error;
   3386 }
   3387 
   3388 void
   3389 urtw_set_chan(struct urtw_softc *sc, struct ieee80211_channel *c)
   3390 {
   3391 	struct urtw_rf *rf = &sc->sc_rf;
   3392 	struct ieee80211com *ic = &sc->sc_ic;
   3393 	usbd_status error = 0;
   3394 	uint32_t data;
   3395 	u_int chan;
   3396 
   3397 	chan = ieee80211_chan2ieee(ic, c);
   3398 	if (chan == 0 || chan == IEEE80211_CHAN_ANY)
   3399 		return;
   3400 	/*
   3401 	 * During changing the channel we need to temporary disable
   3402 	 * TX.
   3403 	 */
   3404 	urtw_read32_m(sc, URTW_TX_CONF, &data);
   3405 	data &= ~URTW_TX_LOOPBACK_MASK;
   3406 	urtw_write32_m(sc, URTW_TX_CONF, data | URTW_TX_LOOPBACK_MAC);
   3407 	error = rf->set_chan(rf, chan);
   3408 	if (error != 0) {
   3409 		printf("%s could not change the channel\n",
   3410 		    device_xname(sc->sc_dev));
   3411 		return;
   3412 	}
   3413 	usbd_delay_ms(sc->sc_udev, 10);
   3414 	urtw_write32_m(sc, URTW_TX_CONF, data | URTW_TX_LOOPBACK_NONE);
   3415 
   3416 fail:	return;
   3417 
   3418 }
   3419 
   3420 void
   3421 urtw_next_scan(void *arg)
   3422 {
   3423 	struct urtw_softc *sc = arg;
   3424 	struct ieee80211com *ic = &sc->sc_ic;
   3425 	int s;
   3426 
   3427 	if (sc->sc_dying)
   3428 		return;
   3429 
   3430 	s = splnet();
   3431 	if (ic->ic_state == IEEE80211_S_SCAN)
   3432 		ieee80211_next_scan(ic);
   3433 	splx(s);
   3434 }
   3435 
   3436 void
   3437 urtw_task(void *arg)
   3438 {
   3439 	struct urtw_softc *sc = arg;
   3440 	struct ieee80211com *ic = &sc->sc_ic;
   3441 	struct ieee80211_node *ni;
   3442 	enum ieee80211_state ostate;
   3443 	usbd_status error = 0;
   3444 
   3445 	if (sc->sc_dying)
   3446 		return;
   3447 
   3448 	ostate = ic->ic_state;
   3449 
   3450 	switch (sc->sc_state) {
   3451 	case IEEE80211_S_INIT:
   3452 		if (ostate == IEEE80211_S_RUN) {
   3453 			/* turn link LED off */
   3454 			(void)urtw_led_off(sc, URTW_LED_GPIO);
   3455 		}
   3456 		break;
   3457 
   3458 	case IEEE80211_S_SCAN:
   3459 		urtw_set_chan(sc, ic->ic_curchan);
   3460 		if (!sc->sc_dying)
   3461 			callout_schedule(&sc->scan_to, mstohz(200));
   3462 		break;
   3463 
   3464 	case IEEE80211_S_AUTH:
   3465 	case IEEE80211_S_ASSOC:
   3466 		urtw_set_chan(sc, ic->ic_curchan);
   3467 		break;
   3468 
   3469 	case IEEE80211_S_RUN:
   3470 		ni = ic->ic_bss;
   3471 
   3472 		urtw_set_chan(sc, ic->ic_curchan);
   3473 
   3474 		/* setting bssid. */
   3475 		error = urtw_set_bssid(sc, ni->ni_bssid);
   3476 		if (error != 0)
   3477 			goto fail;
   3478 		urtw_update_msr(sc);
   3479 		/* XXX maybe the below would be incorrect. */
   3480 		urtw_write16_m(sc, URTW_ATIM_WND, 2);
   3481 		urtw_write16_m(sc, URTW_ATIM_TR_ITV, 100);
   3482 		urtw_write16_m(sc, URTW_BEACON_INTERVAL, 0x64);
   3483 		urtw_write16_m(sc, URTW_BEACON_INTERVAL_TIME, 0x3ff);
   3484 		error = urtw_led_ctl(sc, URTW_LED_CTL_LINK);
   3485 		if (error != 0)
   3486 			printf("%s: could not control LED (%d)\n",
   3487 			    device_xname(sc->sc_dev), error);
   3488 		break;
   3489 	}
   3490 
   3491 	sc->sc_newstate(ic, sc->sc_state, sc->sc_arg);
   3492 
   3493 fail:
   3494 	if (error != 0) {
   3495 		DPRINTF(("%s: error duing processing RUN state.",
   3496 		    device_xname(sc->sc_dev)));
   3497 	}
   3498 }
   3499 
   3500 usbd_status
   3501 urtw_8187b_update_wmm(struct urtw_softc *sc)
   3502 {
   3503 	struct ieee80211com *ic = &sc->sc_ic;
   3504 	struct ieee80211_channel *c = ic->ic_ibss_chan;
   3505 	uint32_t data;
   3506 	uint8_t aifs, sifs, slot, ecwmin, ecwmax;
   3507 	usbd_status error;
   3508 
   3509 	sifs = 0xa;
   3510 	if (IEEE80211_IS_CHAN_G(c))
   3511 		slot = 0x9;
   3512 	else
   3513 		slot = 0x14;
   3514 
   3515 	aifs = (2 * slot) + sifs;
   3516 	ecwmin = 3;
   3517 	ecwmax = 7;
   3518 
   3519 	data = ((uint32_t)aifs << 0) |		/* AIFS, offset 0 */
   3520 	    ((uint32_t)ecwmin << 8) |		/* ECW minimum, offset 8 */
   3521 	    ((uint32_t)ecwmax << 12);		/* ECW maximum, offset 16 */
   3522 
   3523 	urtw_write32_m(sc, URTW_AC_VO, data);
   3524 	urtw_write32_m(sc, URTW_AC_VI, data);
   3525 	urtw_write32_m(sc, URTW_AC_BE, data);
   3526 	urtw_write32_m(sc, URTW_AC_BK, data);
   3527 
   3528 fail:
   3529 	return error;
   3530 }
   3531 
   3532 usbd_status
   3533 urtw_8187b_reset(struct urtw_softc *sc)
   3534 {
   3535 	uint8_t data;
   3536 	usbd_status error;
   3537 
   3538 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
   3539 	if (error)
   3540 		goto fail;
   3541 
   3542 	urtw_read8_m(sc, URTW_CONFIG3, &data);
   3543 	urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE |
   3544 		URTW_CONFIG3_GNT_SELECT);
   3545 
   3546 	urtw_write32_m(sc, URTW_ANAPARAM2, URTW_8187B_8225_ANAPARAM2_ON);
   3547 	urtw_write32_m(sc, URTW_ANAPARAM, URTW_8187B_8225_ANAPARAM_ON);
   3548 	urtw_write8_m(sc, URTW_ANAPARAM3, URTW_8187B_8225_ANAPARAM3_ON);
   3549 
   3550 	urtw_write8_m(sc, 0x61, 0x10);
   3551 	urtw_read8_m(sc, 0x62, &data);
   3552 	urtw_write8_m(sc, 0x62, data & ~(1 << 5));
   3553 	urtw_write8_m(sc, 0x62, data | (1 << 5));
   3554 
   3555 	urtw_read8_m(sc, URTW_CONFIG3, &data);
   3556 	urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE);
   3557 
   3558 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
   3559 	if (error)
   3560 		goto fail;
   3561 
   3562 	urtw_read8_m(sc, URTW_CMD, &data);
   3563 	data = (data & 2) | URTW_CMD_RST;
   3564 	urtw_write8_m(sc, URTW_CMD, data);
   3565 	usbd_delay_ms(sc->sc_udev, 100);
   3566 
   3567 	urtw_read8_m(sc, URTW_CMD, &data);
   3568 	if (data & URTW_CMD_RST) {
   3569 		printf("%s: reset timeout\n", device_xname(sc->sc_dev));
   3570 		goto fail;
   3571 	}
   3572 
   3573 fail:
   3574 	return error;
   3575 }
   3576 
   3577 int
   3578 urtw_8187b_init(struct ifnet *ifp)
   3579 {
   3580 	struct urtw_softc *sc = ifp->if_softc;
   3581 	struct urtw_rf *rf = &sc->sc_rf;
   3582 	struct ieee80211com *ic = &sc->sc_ic;
   3583 	uint8_t data;
   3584 	usbd_status error;
   3585 
   3586 	urtw_stop(ifp, 0);
   3587 
   3588 	error = urtw_8187b_update_wmm(sc);
   3589 	if (error != 0)
   3590 		goto fail;
   3591 	error = urtw_8187b_reset(sc);
   3592 	if (error)
   3593 		goto fail;
   3594 
   3595 	/* Applying MAC address again. */
   3596 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
   3597 	if (error)
   3598 		goto fail;
   3599 	IEEE80211_ADDR_COPY(ic->ic_myaddr, CLLADDR(ifp->if_sadl));
   3600 	error = urtw_set_macaddr(sc, ic->ic_myaddr);
   3601 	if (error)
   3602 		goto fail;
   3603 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
   3604 	if (error)
   3605 		goto fail;
   3606 
   3607 	error = urtw_update_msr(sc);
   3608 	if (error)
   3609 		goto fail;
   3610 
   3611 	error = rf->init(rf);
   3612 	if (error != 0)
   3613 		goto fail;
   3614 
   3615 	urtw_write8_m(sc, URTW_CMD, URTW_CMD_TX_ENABLE |
   3616 		URTW_CMD_RX_ENABLE);
   3617 	error = urtw_intr_enable(sc);
   3618 	if (error != 0)
   3619 		goto fail;
   3620 
   3621 	error = urtw_write8e(sc, 0x41, 0xf4);
   3622 	if (error != 0)
   3623 		goto fail;
   3624 	error = urtw_write8e(sc, 0x40, 0x00);
   3625 	if (error != 0)
   3626 		goto fail;
   3627 	error = urtw_write8e(sc, 0x42, 0x00);
   3628 	if (error != 0)
   3629 		goto fail;
   3630 	error = urtw_write8e(sc, 0x42, 0x01);
   3631 	if (error != 0)
   3632 		goto fail;
   3633 	error = urtw_write8e(sc, 0x40, 0x0f);
   3634 	if (error != 0)
   3635 		goto fail;
   3636 	error = urtw_write8e(sc, 0x42, 0x00);
   3637 	if (error != 0)
   3638 		goto fail;
   3639 	error = urtw_write8e(sc, 0x42, 0x01);
   3640 	if (error != 0)
   3641 		goto fail;
   3642 
   3643 	urtw_read8_m(sc, 0xdb, &data);
   3644 	urtw_write8_m(sc, 0xdb, data | (1 << 2));
   3645 	urtw_write16_idx_m(sc, 0x72, 0x59fa, 3);
   3646 	urtw_write16_idx_m(sc, 0x74, 0x59d2, 3);
   3647 	urtw_write16_idx_m(sc, 0x76, 0x59d2, 3);
   3648 	urtw_write16_idx_m(sc, 0x78, 0x19fa, 3);
   3649 	urtw_write16_idx_m(sc, 0x7a, 0x19fa, 3);
   3650 	urtw_write16_idx_m(sc, 0x7c, 0x00d0, 3);
   3651 	urtw_write8_m(sc, 0x61, 0);
   3652 	urtw_write8_idx_m(sc, 0x80, 0x0f, 1);
   3653 	urtw_write8_idx_m(sc, 0x83, 0x03, 1);
   3654 	urtw_write8_m(sc, 0xda, 0x10);
   3655 	urtw_write8_idx_m(sc, 0x4d, 0x08, 2);
   3656 
   3657 	urtw_write32_m(sc, URTW_HSSI_PARA, 0x0600321b);
   3658 
   3659 	urtw_write16_idx_m(sc, 0xec, 0x0800, 1);
   3660 
   3661 	urtw_write8_m(sc, URTW_ACM_CONTROL, 0);
   3662 
   3663 	/* Reset softc variables. */
   3664 	for (size_t j = 0; j < URTW_PRIORITY_MAX; j++) {
   3665 		sc->sc_txidx[j] = sc->sc_tx_queued[j] = 0;
   3666 	}
   3667 	sc->sc_txtimer = 0;
   3668 
   3669 	if (!(sc->sc_flags & URTW_INIT_ONCE)) {
   3670 		error = usbd_set_config_no(sc->sc_udev, URTW_CONFIG_NO, 0);
   3671 		if (error != 0) {
   3672 			aprint_error_dev(sc->sc_dev, "failed to set configuration"
   3673 			    ", err=%s\n", usbd_errstr(error));
   3674 
   3675 			goto fail;
   3676 		}
   3677 		/* Get the first interface handle. */
   3678 		error = usbd_device2interface_handle(sc->sc_udev,
   3679 		    URTW_IFACE_INDEX, &sc->sc_iface);
   3680 		if (error != 0) {
   3681 			printf("%s: could not get interface handle\n",
   3682 			    device_xname(sc->sc_dev));
   3683 			goto fail;
   3684 		}
   3685 		error = urtw_open_pipes(sc);
   3686 		if (error != 0)
   3687 			goto fail;
   3688 		error = urtw_alloc_rx_data_list(sc);
   3689 		if (error != 0)
   3690 			goto fail;
   3691 		error = urtw_alloc_tx_data_list(sc);
   3692 		if (error != 0)
   3693 			goto fail;
   3694 		sc->sc_flags |= URTW_INIT_ONCE;
   3695 	}
   3696 
   3697 	error = urtw_rx_enable(sc);
   3698 	if (error != 0)
   3699 		goto fail;
   3700 	error = urtw_tx_enable(sc);
   3701 	if (error != 0)
   3702 		goto fail;
   3703 
   3704 	ifp->if_flags &= ~IFF_OACTIVE;
   3705 	ifp->if_flags |= IFF_RUNNING;
   3706 
   3707 	if (ic->ic_opmode == IEEE80211_M_MONITOR)
   3708 		ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
   3709 	else
   3710 		ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
   3711 
   3712 fail:
   3713 	return error;
   3714 }
   3715 
   3716 usbd_status
   3717 urtw_8225v2_b_config_mac(struct urtw_softc *sc)
   3718 {
   3719 	int i;
   3720 	usbd_status error;
   3721 
   3722 	for (i = 0; i < __arraycount(urtw_8187b_regtbl); i++) {
   3723 		urtw_write8_idx_m(sc, urtw_8187b_regtbl[i].reg,
   3724 		    urtw_8187b_regtbl[i].val, urtw_8187b_regtbl[i].idx);
   3725 	}
   3726 
   3727 	urtw_write16_m(sc, URTW_TID_AC_MAP, 0xfa50);
   3728 	urtw_write16_m(sc, URTW_INT_MIG, 0);
   3729 
   3730 	urtw_write32_idx_m(sc, 0xf0, 0, 1);
   3731 	urtw_write32_idx_m(sc, 0xf4, 0, 1);
   3732 	urtw_write8_idx_m(sc, 0xf8, 0, 1);
   3733 
   3734 	urtw_write32_m(sc, URTW_RF_TIMING, 0x00004001);
   3735 
   3736 fail:
   3737 	return error;
   3738 }
   3739 
   3740 usbd_status
   3741 urtw_8225v2_b_init_rfe(struct urtw_softc *sc)
   3742 {
   3743 	usbd_status error;
   3744 
   3745 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x0480);
   3746 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x2488);
   3747 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x1fff);
   3748 	usbd_delay_ms(sc->sc_udev, 100);
   3749 
   3750 fail:
   3751 	return error;
   3752 }
   3753 
   3754 usbd_status
   3755 urtw_8225v2_b_update_chan(struct urtw_softc *sc)
   3756 {
   3757 	struct ieee80211com *ic = &sc->sc_ic;
   3758 	struct ieee80211_channel *c = ic->ic_ibss_chan;
   3759 	uint8_t aifs, difs, eifs, sifs, slot;
   3760 	usbd_status error;
   3761 
   3762 	urtw_write8_m(sc, URTW_SIFS, 0x22);
   3763 
   3764 	sifs = 0xa;
   3765 	if (IEEE80211_IS_CHAN_G(c)) {
   3766 		slot = 0x9;
   3767 		difs = 0x1c;
   3768 		eifs = 0x5b;
   3769 	} else {
   3770 		slot = 0x14;
   3771 		difs = 0x32;
   3772 		eifs = 0x5b;
   3773 	}
   3774 	aifs = (2 * slot) + sifs;
   3775 
   3776 	urtw_write8_m(sc, URTW_SLOT, slot);
   3777 
   3778 	urtw_write8_m(sc, URTW_AC_VO, aifs);
   3779 	urtw_write8_m(sc, URTW_AC_VI, aifs);
   3780 	urtw_write8_m(sc, URTW_AC_BE, aifs);
   3781 	urtw_write8_m(sc, URTW_AC_BK, aifs);
   3782 
   3783 	urtw_write8_m(sc, URTW_DIFS, difs);
   3784 	urtw_write8_m(sc, URTW_8187B_EIFS, eifs);
   3785 
   3786 fail:
   3787 	return error;
   3788 }
   3789 
   3790 usbd_status
   3791 urtw_8225v2_b_rf_init(struct urtw_rf *rf)
   3792 {
   3793 	struct urtw_softc *sc = rf->rf_sc;
   3794 	unsigned int i;
   3795 	uint8_t data;
   3796 	usbd_status error;
   3797 
   3798 	/* Set up ACK rate, retry limit, TX AGC, TX antenna. */
   3799 	urtw_write16_m(sc, URTW_8187B_BRSR, 0x0fff);
   3800 	urtw_read8_m(sc, URTW_CW_CONF, &data);
   3801 	urtw_write8_m(sc, URTW_CW_CONF, data |
   3802 		URTW_CW_CONF_PERPACKET_RETRY);
   3803 	urtw_read8_m(sc, URTW_TX_AGC_CTL, &data);
   3804 	urtw_write8_m(sc, URTW_TX_AGC_CTL, data |
   3805 		URTW_TX_AGC_CTL_PERPACKET_GAIN |
   3806 		URTW_TX_AGC_CTL_PERPACKET_ANTSEL);
   3807 
   3808 	/* Auto rate fallback control. */
   3809 	urtw_write16_idx_m(sc, URTW_ARFR, 0x0fff, 1);	/* 1M ~ 54M */
   3810 	urtw_read8_m(sc, URTW_RATE_FALLBACK, &data);
   3811 	urtw_write8_m(sc, URTW_RATE_FALLBACK, data |
   3812 		URTW_RATE_FALLBACK_ENABLE);
   3813 
   3814 	urtw_write16_m(sc, URTW_BEACON_INTERVAL, 100);
   3815 	urtw_write16_m(sc, URTW_ATIM_WND, 2);
   3816 	urtw_write16_idx_m(sc, URTW_FEMR, 0xffff, 1);
   3817 
   3818 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
   3819 	if (error)
   3820 		goto fail;
   3821 	urtw_read8_m(sc, URTW_CONFIG1, &data);
   3822 	urtw_write8_m(sc, URTW_CONFIG1, (data & 0x3f) | 0x80);
   3823 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
   3824 	if (error)
   3825 		goto fail;
   3826 
   3827 	urtw_write8_m(sc, URTW_WPA_CONFIG, 0);
   3828 	urtw_8225v2_b_config_mac(sc);
   3829 	urtw_write16_idx_m(sc, URTW_RFSW_CTRL, 0x569a, 2);
   3830 
   3831 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
   3832 	if (error)
   3833 		goto fail;
   3834 	urtw_read8_m(sc, URTW_CONFIG3, &data);
   3835 	urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE);
   3836 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
   3837 	if (error)
   3838 		goto fail;
   3839 
   3840 	urtw_8225v2_b_init_rfe(sc);
   3841 
   3842 	for (i = 0; i < __arraycount(urtw_8225v2_b_rf); i++) {
   3843 		urtw_8225_write(sc, urtw_8225v2_b_rf[i].reg,
   3844 		    urtw_8225v2_b_rf[i].val);
   3845 	}
   3846 
   3847 	for (i = 0; i < __arraycount(urtw_8225v2_rxgain); i++) {
   3848 		urtw_8225_write(sc, 0x1, (uint8_t)(i + 1));
   3849 		urtw_8225_write(sc, 0x2, urtw_8225v2_rxgain[i]);
   3850 	}
   3851 
   3852 	urtw_8225_write(sc, 0x03, 0x080);
   3853 	urtw_8225_write(sc, 0x05, 0x004);
   3854 	urtw_8225_write(sc, 0x00, 0x0b7);
   3855 	urtw_8225_write(sc, 0x02, 0xc4d);
   3856 	urtw_8225_write(sc, 0x02, 0x44d);
   3857 	urtw_8225_write(sc, 0x00, 0x2bf);
   3858 
   3859 	urtw_write8_m(sc, URTW_TX_GAIN_CCK, 0x03);
   3860 	urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 0x07);
   3861 	urtw_write8_m(sc, URTW_TX_ANTENNA, 0x03);
   3862 
   3863 	urtw_8187_write_phy_ofdm(sc, 0x80, 0x12);
   3864 	for (i = 0; i < __arraycount(urtw_8225v2_agc); i++) {
   3865 		urtw_8187_write_phy_ofdm(sc, 0x0f, urtw_8225v2_agc[i]);
   3866 		urtw_8187_write_phy_ofdm(sc, 0x0e, (uint8_t)i + 0x80);
   3867 		urtw_8187_write_phy_ofdm(sc, 0x0e, 0);
   3868 	}
   3869 	urtw_8187_write_phy_ofdm(sc, 0x80, 0x10);
   3870 
   3871 	for (i = 0; i < __arraycount(urtw_8225v2_ofdm); i++)
   3872 		urtw_8187_write_phy_ofdm(sc, i, urtw_8225v2_ofdm[i]);
   3873 
   3874 	urtw_8225v2_b_update_chan(sc);
   3875 
   3876 	urtw_8187_write_phy_ofdm(sc, 0x97, 0x46);
   3877 	urtw_8187_write_phy_ofdm(sc, 0xa4, 0xb6);
   3878 	urtw_8187_write_phy_ofdm(sc, 0x85, 0xfc);
   3879 	urtw_8187_write_phy_cck(sc, 0xc1, 0x88);
   3880 
   3881 	error = urtw_8225v2_b_rf_set_chan(rf, 1);
   3882 fail:
   3883 	return error;
   3884 }
   3885 
   3886 usbd_status
   3887 urtw_8225v2_b_rf_set_chan(struct urtw_rf *rf, int chan)
   3888 {
   3889 	struct urtw_softc *sc = rf->rf_sc;
   3890 	usbd_status error;
   3891 
   3892 	error = urtw_8225v2_b_set_txpwrlvl(sc, chan);
   3893 	if (error)
   3894 		goto fail;
   3895 
   3896 	urtw_8225_write(sc, 0x7, urtw_8225_channel[chan]);
   3897 	/*
   3898 	 * Delay removed from 8185 to 8187.
   3899 	 * usbd_delay_ms(sc->sc_udev, 10);
   3900 	 */
   3901 
   3902 	urtw_write16_m(sc, URTW_AC_VO, 0x5114);
   3903 	urtw_write16_m(sc, URTW_AC_VI, 0x5114);
   3904 	urtw_write16_m(sc, URTW_AC_BE, 0x5114);
   3905 	urtw_write16_m(sc, URTW_AC_BK, 0x5114);
   3906 
   3907 fail:
   3908 	return error;
   3909 }
   3910 
   3911 usbd_status
   3912 urtw_8225v2_b_set_txpwrlvl(struct urtw_softc *sc, int chan)
   3913 {
   3914 	int i;
   3915 	uint8_t *cck_pwrtable;
   3916 	uint8_t cck_pwrlvl_min, cck_pwrlvl_max, ofdm_pwrlvl_min,
   3917 	    ofdm_pwrlvl_max;
   3918 	int8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff;
   3919 	int8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff;
   3920 	usbd_status error;
   3921 
   3922 	if (sc->sc_hwrev & URTW_HWREV_8187B_B) {
   3923 		cck_pwrlvl_min = 0;
   3924 		cck_pwrlvl_max = 15;
   3925 		ofdm_pwrlvl_min = 2;
   3926 		ofdm_pwrlvl_max = 17;
   3927 	} else {
   3928 		cck_pwrlvl_min = 7;
   3929 		cck_pwrlvl_max = 22;
   3930 		ofdm_pwrlvl_min = 10;
   3931 		ofdm_pwrlvl_max = 25;
   3932 	}
   3933 
   3934 	/* CCK power setting */
   3935 	cck_pwrlvl = (cck_pwrlvl > (cck_pwrlvl_max - cck_pwrlvl_min)) ?
   3936 	    cck_pwrlvl_max : (cck_pwrlvl + cck_pwrlvl_min);
   3937 
   3938 	cck_pwrlvl += sc->sc_txpwr_cck_base;
   3939 	cck_pwrlvl = (cck_pwrlvl > 35) ? 35 : cck_pwrlvl;
   3940 	cck_pwrlvl = (cck_pwrlvl < 0) ? 0 : cck_pwrlvl;
   3941 
   3942 	cck_pwrtable = (chan == 14) ? urtw_8225v2_txpwr_cck_ch14 :
   3943 	    urtw_8225v2_txpwr_cck;
   3944 
   3945 	if (sc->sc_hwrev & URTW_HWREV_8187B_B) {
   3946 		if (cck_pwrlvl <= 6)
   3947 			; /* do nothing */
   3948 		else if (cck_pwrlvl <= 11)
   3949 			cck_pwrtable += 8;
   3950 		else
   3951 			cck_pwrtable += 16;
   3952 	} else {
   3953 		if (cck_pwrlvl <= 5)
   3954 			; /* do nothing */
   3955 		else if (cck_pwrlvl <= 11)
   3956 			cck_pwrtable += 8;
   3957 		else if (cck_pwrlvl <= 17)
   3958 			cck_pwrtable += 16;
   3959 		else
   3960 			cck_pwrtable += 24;
   3961 	}
   3962 
   3963 	for (i = 0; i < 8; i++) {
   3964 		urtw_8187_write_phy_cck(sc, 0x44 + i, cck_pwrtable[i]);
   3965 	}
   3966 
   3967 	urtw_write8_m(sc, URTW_TX_GAIN_CCK,
   3968 	    urtw_8225v2_tx_gain_cck_ofdm[cck_pwrlvl] << 1);
   3969 	/*
   3970 	 * Delay removed from 8185 to 8187.
   3971 	 * usbd_delay_ms(sc->sc_udev, 1);
   3972 	 */
   3973 
   3974 	/* OFDM power setting */
   3975 	ofdm_pwrlvl = (ofdm_pwrlvl > (ofdm_pwrlvl_max - ofdm_pwrlvl_min)) ?
   3976 	    ofdm_pwrlvl_max : ofdm_pwrlvl + ofdm_pwrlvl_min;
   3977 
   3978 	ofdm_pwrlvl += sc->sc_txpwr_ofdm_base;
   3979 	ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl;
   3980 	ofdm_pwrlvl = (ofdm_pwrlvl < 0) ? 0 : ofdm_pwrlvl;
   3981 
   3982 	urtw_write8_m(sc, URTW_TX_GAIN_OFDM,
   3983 	    urtw_8225v2_tx_gain_cck_ofdm[ofdm_pwrlvl] << 1);
   3984 
   3985 	if (sc->sc_hwrev & URTW_HWREV_8187B_B) {
   3986 		if (ofdm_pwrlvl <= 11) {
   3987 			urtw_8187_write_phy_ofdm(sc, 0x87, 0x60);
   3988 			urtw_8187_write_phy_ofdm(sc, 0x89, 0x60);
   3989 		} else {
   3990 			urtw_8187_write_phy_ofdm(sc, 0x87, 0x5c);
   3991 			urtw_8187_write_phy_ofdm(sc, 0x89, 0x5c);
   3992 		}
   3993 	} else {
   3994 		if (ofdm_pwrlvl <= 11) {
   3995 			urtw_8187_write_phy_ofdm(sc, 0x87, 0x5c);
   3996 			urtw_8187_write_phy_ofdm(sc, 0x89, 0x5c);
   3997 		} else if (ofdm_pwrlvl <= 17) {
   3998 			urtw_8187_write_phy_ofdm(sc, 0x87, 0x54);
   3999 			urtw_8187_write_phy_ofdm(sc, 0x89, 0x54);
   4000 		} else {
   4001 			urtw_8187_write_phy_ofdm(sc, 0x87, 0x50);
   4002 			urtw_8187_write_phy_ofdm(sc, 0x89, 0x50);
   4003 		}
   4004 	}
   4005 
   4006 	/*
   4007 	 * Delay removed from 8185 to 8187.
   4008 	 * usbd_delay_ms(sc->sc_udev, 1);
   4009 	 */
   4010 fail:
   4011 	return error;
   4012 }
   4013 
   4014 int
   4015 urtw_set_bssid(struct urtw_softc *sc, const uint8_t *bssid)
   4016 {
   4017 	int error;
   4018 
   4019 	urtw_write32_m(sc, URTW_BSSID,
   4020 	    bssid[0] | bssid[1] << 8 | bssid[2] << 16 | bssid[3] << 24);
   4021 	urtw_write16_m(sc, URTW_BSSID + 4,
   4022 	    bssid[4] | bssid[5] << 8);
   4023 
   4024 	return 0;
   4025 
   4026 fail:
   4027 	return error;
   4028 }
   4029 
   4030 int
   4031 urtw_set_macaddr(struct urtw_softc *sc, const uint8_t *addr)
   4032 {
   4033 	int error;
   4034 
   4035 	urtw_write32_m(sc, URTW_MAC0,
   4036 	    addr[0] | addr[1] << 8 | addr[2] << 16 | addr[3] << 24);
   4037 	urtw_write16_m(sc, URTW_MAC4,
   4038 	    addr[4] | addr[5] << 8);
   4039 
   4040 	return 0;
   4041 
   4042 fail:
   4043 	return error;
   4044 }
   4045 
   4046 MODULE(MODULE_CLASS_DRIVER, if_urtw, "bpf");
   4047 
   4048 #ifdef _MODULE
   4049 #include "ioconf.c"
   4050 #endif
   4051 
   4052 static int
   4053 if_urtw_modcmd(modcmd_t cmd, void *aux)
   4054 {
   4055 	int error = 0;
   4056 
   4057 	switch (cmd) {
   4058 	case MODULE_CMD_INIT:
   4059 #ifdef _MODULE
   4060 		error = config_init_component(cfdriver_ioconf_urtw,
   4061 		    cfattach_ioconf_urtw, cfdata_ioconf_urtw);
   4062 #endif
   4063 		return error;
   4064 	case MODULE_CMD_FINI:
   4065 #ifdef _MODULE
   4066 		error = config_fini_component(cfdriver_ioconf_urtw,
   4067 		    cfattach_ioconf_urtw, cfdata_ioconf_urtw);
   4068 #endif
   4069 		return error;
   4070 	default:
   4071 		return ENOTTY;
   4072 	}
   4073 }
   4074