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