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