Home | History | Annotate | Line # | Download | only in usb
if_run.c revision 1.10.6.11
      1  1.10.6.11     skrll /*	$NetBSD: if_run.c,v 1.10.6.11 2016/10/05 20:55:57 skrll Exp $	*/
      2        1.1    nonaka /*	$OpenBSD: if_run.c,v 1.90 2012/03/24 15:11:04 jsg Exp $	*/
      3        1.1    nonaka 
      4        1.1    nonaka /*-
      5        1.1    nonaka  * Copyright (c) 2008-2010 Damien Bergamini <damien.bergamini (at) free.fr>
      6        1.1    nonaka  *
      7        1.1    nonaka  * Permission to use, copy, modify, and distribute this software for any
      8        1.1    nonaka  * purpose with or without fee is hereby granted, provided that the above
      9        1.1    nonaka  * copyright notice and this permission notice appear in all copies.
     10        1.1    nonaka  *
     11        1.1    nonaka  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     12        1.1    nonaka  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     13        1.1    nonaka  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     14        1.1    nonaka  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     15        1.1    nonaka  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     16        1.1    nonaka  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     17        1.1    nonaka  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     18        1.1    nonaka  */
     19        1.1    nonaka 
     20        1.1    nonaka /*-
     21        1.1    nonaka  * Ralink Technology RT2700U/RT2800U/RT3000U chipset driver.
     22        1.1    nonaka  * http://www.ralinktech.com/
     23        1.1    nonaka  */
     24        1.1    nonaka 
     25        1.1    nonaka #include <sys/cdefs.h>
     26  1.10.6.11     skrll __KERNEL_RCSID(0, "$NetBSD: if_run.c,v 1.10.6.11 2016/10/05 20:55:57 skrll Exp $");
     27        1.1    nonaka 
     28        1.1    nonaka #include <sys/param.h>
     29        1.1    nonaka #include <sys/sockio.h>
     30        1.1    nonaka #include <sys/sysctl.h>
     31        1.1    nonaka #include <sys/mbuf.h>
     32        1.1    nonaka #include <sys/kernel.h>
     33        1.1    nonaka #include <sys/socket.h>
     34        1.1    nonaka #include <sys/systm.h>
     35        1.1    nonaka #include <sys/malloc.h>
     36        1.1    nonaka #include <sys/callout.h>
     37        1.1    nonaka #include <sys/module.h>
     38        1.1    nonaka #include <sys/conf.h>
     39        1.1    nonaka #include <sys/device.h>
     40        1.1    nonaka 
     41        1.1    nonaka #include <sys/bus.h>
     42        1.1    nonaka #include <machine/endian.h>
     43        1.1    nonaka #include <sys/intr.h>
     44        1.1    nonaka 
     45        1.1    nonaka #include <net/bpf.h>
     46        1.1    nonaka #include <net/if.h>
     47        1.1    nonaka #include <net/if_arp.h>
     48        1.1    nonaka #include <net/if_dl.h>
     49        1.1    nonaka #include <net/if_ether.h>
     50        1.1    nonaka #include <net/if_media.h>
     51        1.1    nonaka #include <net/if_types.h>
     52        1.1    nonaka 
     53        1.1    nonaka #include <net80211/ieee80211_var.h>
     54        1.1    nonaka #include <net80211/ieee80211_amrr.h>
     55        1.1    nonaka #include <net80211/ieee80211_radiotap.h>
     56        1.1    nonaka 
     57        1.1    nonaka #include <dev/firmload.h>
     58        1.1    nonaka 
     59        1.1    nonaka #include <dev/usb/usb.h>
     60        1.1    nonaka #include <dev/usb/usbdi.h>
     61        1.1    nonaka #include <dev/usb/usbdivar.h>
     62        1.1    nonaka #include <dev/usb/usbdi_util.h>
     63        1.1    nonaka #include <dev/usb/usbdevs.h>
     64        1.1    nonaka 
     65        1.1    nonaka #include <dev/ic/rt2860reg.h>		/* shared with ral(4) */
     66        1.1    nonaka #include <dev/usb/if_runvar.h>
     67        1.1    nonaka 
     68        1.1    nonaka #ifdef RUN_DEBUG
     69        1.1    nonaka #define DPRINTF(x)	do { if (run_debug) printf x; } while (0)
     70        1.1    nonaka #define DPRINTFN(n, x)	do { if (run_debug >= (n)) printf x; } while (0)
     71        1.1    nonaka int run_debug = 0;
     72        1.1    nonaka #else
     73        1.1    nonaka #define DPRINTF(x)
     74        1.1    nonaka #define DPRINTFN(n, x)
     75        1.1    nonaka #endif
     76        1.1    nonaka 
     77  1.10.6.11     skrll #define IEEE80211_HAS_ADDR4(wh) IEEE80211_IS_DSTODS(wh)
     78  1.10.6.11     skrll 
     79        1.1    nonaka #define USB_ID(v, p)	{ USB_VENDOR_##v, USB_PRODUCT_##v##_##p }
     80        1.1    nonaka static const struct usb_devno run_devs[] = {
     81        1.1    nonaka 	USB_ID(ABOCOM,		RT2770),
     82        1.1    nonaka 	USB_ID(ABOCOM,		RT2870),
     83        1.1    nonaka 	USB_ID(ABOCOM,		RT3070),
     84        1.1    nonaka 	USB_ID(ABOCOM,		RT3071),
     85        1.1    nonaka 	USB_ID(ABOCOM,		RT3072),
     86        1.1    nonaka 	USB_ID(ABOCOM2,		RT2870_1),
     87        1.1    nonaka 	USB_ID(ACCTON,		RT2770),
     88        1.1    nonaka 	USB_ID(ACCTON,		RT2870_1),
     89        1.1    nonaka 	USB_ID(ACCTON,		RT2870_2),
     90        1.1    nonaka 	USB_ID(ACCTON,		RT2870_3),
     91        1.1    nonaka 	USB_ID(ACCTON,		RT2870_4),
     92        1.1    nonaka 	USB_ID(ACCTON,		RT2870_5),
     93        1.1    nonaka 	USB_ID(ACCTON,		RT3070),
     94        1.1    nonaka 	USB_ID(ACCTON,		RT3070_1),
     95        1.1    nonaka 	USB_ID(ACCTON,		RT3070_2),
     96        1.1    nonaka 	USB_ID(ACCTON,		RT3070_3),
     97        1.1    nonaka 	USB_ID(ACCTON,		RT3070_4),
     98        1.1    nonaka 	USB_ID(ACCTON,		RT3070_5),
     99        1.1    nonaka 	USB_ID(ACCTON,		RT3070_6),
    100        1.1    nonaka 	USB_ID(AIRTIES,		RT3070),
    101        1.1    nonaka 	USB_ID(AIRTIES,		RT3070_2),
    102        1.1    nonaka 	USB_ID(ALLWIN,		RT2070),
    103        1.1    nonaka 	USB_ID(ALLWIN,		RT2770),
    104        1.1    nonaka 	USB_ID(ALLWIN,		RT2870),
    105        1.1    nonaka 	USB_ID(ALLWIN,		RT3070),
    106        1.1    nonaka 	USB_ID(ALLWIN,		RT3071),
    107        1.1    nonaka 	USB_ID(ALLWIN,		RT3072),
    108        1.1    nonaka 	USB_ID(ALLWIN,		RT3572),
    109        1.1    nonaka 	USB_ID(AMIGO,		RT2870_1),
    110        1.1    nonaka 	USB_ID(AMIGO,		RT2870_2),
    111        1.1    nonaka 	USB_ID(AMIT,		CGWLUSB2GNR),
    112        1.1    nonaka 	USB_ID(AMIT,		RT2870_1),
    113        1.1    nonaka 	USB_ID(AMIT2,		RT2870),
    114        1.1    nonaka 	USB_ID(ASUSTEK,		RT2870_1),
    115        1.1    nonaka 	USB_ID(ASUSTEK,		RT2870_2),
    116        1.1    nonaka 	USB_ID(ASUSTEK,		RT2870_3),
    117        1.1    nonaka 	USB_ID(ASUSTEK,		RT2870_4),
    118        1.1    nonaka 	USB_ID(ASUSTEK,		RT2870_5),
    119        1.1    nonaka 	USB_ID(ASUSTEK,		RT3070),
    120        1.1    nonaka 	USB_ID(ASUSTEK,		RT3070_1),
    121        1.1    nonaka 	USB_ID(ASUSTEK2,	USBN11),
    122        1.1    nonaka 	USB_ID(AZUREWAVE,	RT2870_1),
    123        1.1    nonaka 	USB_ID(AZUREWAVE,	RT2870_2),
    124        1.1    nonaka 	USB_ID(AZUREWAVE,	RT3070),
    125        1.1    nonaka 	USB_ID(AZUREWAVE,	RT3070_2),
    126        1.1    nonaka 	USB_ID(AZUREWAVE,	RT3070_3),
    127        1.1    nonaka 	USB_ID(AZUREWAVE,	RT3070_4),
    128        1.1    nonaka 	USB_ID(AZUREWAVE,	RT3070_5),
    129        1.1    nonaka 	USB_ID(BELKIN,		F5D8053V3),
    130        1.1    nonaka 	USB_ID(BELKIN,		F5D8055),
    131        1.1    nonaka 	USB_ID(BELKIN,		F5D8055V2),
    132        1.1    nonaka 	USB_ID(BELKIN,		F6D4050V1),
    133        1.1    nonaka 	USB_ID(BELKIN,		F6D4050V2),
    134        1.1    nonaka 	USB_ID(BELKIN,		F7D1101V2),
    135        1.1    nonaka 	USB_ID(BELKIN,		RT2870_1),
    136        1.1    nonaka 	USB_ID(BELKIN,		RT2870_2),
    137        1.1    nonaka 	USB_ID(BEWAN,		RT3070),
    138        1.1    nonaka 	USB_ID(CISCOLINKSYS,	AE1000),
    139        1.1    nonaka 	USB_ID(CISCOLINKSYS,	AM10),
    140        1.1    nonaka 	USB_ID(CISCOLINKSYS2,	RT3070),
    141        1.1    nonaka 	USB_ID(CISCOLINKSYS3,	RT3070),
    142        1.1    nonaka 	USB_ID(CONCEPTRONIC,	RT2870_1),
    143        1.1    nonaka 	USB_ID(CONCEPTRONIC,	RT2870_2),
    144        1.1    nonaka 	USB_ID(CONCEPTRONIC,	RT2870_3),
    145        1.1    nonaka 	USB_ID(CONCEPTRONIC,	RT2870_4),
    146        1.1    nonaka 	USB_ID(CONCEPTRONIC,	RT2870_5),
    147        1.1    nonaka 	USB_ID(CONCEPTRONIC,	RT2870_6),
    148        1.1    nonaka 	USB_ID(CONCEPTRONIC,	RT2870_7),
    149        1.1    nonaka 	USB_ID(CONCEPTRONIC,	RT2870_8),
    150        1.1    nonaka 	USB_ID(CONCEPTRONIC,	RT3070_1),
    151        1.1    nonaka 	USB_ID(CONCEPTRONIC,	RT3070_2),
    152        1.1    nonaka 	USB_ID(CONCEPTRONIC,	RT3070_3),
    153        1.1    nonaka 	USB_ID(COREGA,		CGWLUSB300GNM),
    154        1.1    nonaka 	USB_ID(COREGA,		RT2870_1),
    155        1.1    nonaka 	USB_ID(COREGA,		RT2870_2),
    156        1.1    nonaka 	USB_ID(COREGA,		RT2870_3),
    157        1.1    nonaka 	USB_ID(COREGA,		RT3070),
    158        1.1    nonaka 	USB_ID(CYBERTAN,	RT2870),
    159        1.1    nonaka 	USB_ID(DLINK,		RT2870),
    160        1.1    nonaka 	USB_ID(DLINK,		RT3072),
    161        1.1    nonaka 	USB_ID(DLINK2,		DWA130),
    162        1.1    nonaka 	USB_ID(DLINK2,		RT2870_1),
    163        1.1    nonaka 	USB_ID(DLINK2,		RT2870_2),
    164        1.1    nonaka 	USB_ID(DLINK2,		RT3070_1),
    165        1.1    nonaka 	USB_ID(DLINK2,		RT3070_2),
    166        1.1    nonaka 	USB_ID(DLINK2,		RT3070_3),
    167        1.1    nonaka 	USB_ID(DLINK2,		RT3070_4),
    168        1.1    nonaka 	USB_ID(DLINK2,		RT3070_5),
    169        1.1    nonaka 	USB_ID(DLINK2,		RT3072),
    170        1.1    nonaka 	USB_ID(DLINK2,		RT3072_1),
    171        1.1    nonaka 	USB_ID(DVICO,		RT3070),
    172        1.1    nonaka 	USB_ID(EDIMAX,		EW7717),
    173        1.1    nonaka 	USB_ID(EDIMAX,		EW7718),
    174        1.1    nonaka 	USB_ID(EDIMAX,		EW7722UTN),
    175        1.1    nonaka 	USB_ID(EDIMAX,		RT2870_1),
    176        1.1    nonaka 	USB_ID(ENCORE,		RT3070),
    177        1.1    nonaka 	USB_ID(ENCORE,		RT3070_2),
    178        1.1    nonaka 	USB_ID(ENCORE,		RT3070_3),
    179        1.1    nonaka 	USB_ID(GIGABYTE,	GNWB31N),
    180        1.1    nonaka 	USB_ID(GIGABYTE,	GNWB32L),
    181        1.1    nonaka 	USB_ID(GIGABYTE,	RT2870_1),
    182        1.1    nonaka 	USB_ID(GIGASET,		RT3070_1),
    183        1.1    nonaka 	USB_ID(GIGASET,		RT3070_2),
    184        1.1    nonaka 	USB_ID(GUILLEMOT,	HWNU300),
    185        1.1    nonaka 	USB_ID(HAWKING,		HWUN2),
    186        1.1    nonaka 	USB_ID(HAWKING,		RT2870_1),
    187        1.1    nonaka 	USB_ID(HAWKING,		RT2870_2),
    188        1.1    nonaka 	USB_ID(HAWKING,		RT2870_3),
    189        1.1    nonaka 	USB_ID(HAWKING,		RT2870_4),
    190        1.1    nonaka 	USB_ID(HAWKING,		RT2870_5),
    191        1.1    nonaka 	USB_ID(HAWKING,		RT3070),
    192        1.1    nonaka 	USB_ID(IODATA,		RT3072_1),
    193        1.1    nonaka 	USB_ID(IODATA,		RT3072_2),
    194        1.1    nonaka 	USB_ID(IODATA,		RT3072_3),
    195        1.1    nonaka 	USB_ID(IODATA,		RT3072_4),
    196        1.1    nonaka 	USB_ID(LINKSYS4,	RT3070),
    197        1.1    nonaka 	USB_ID(LINKSYS4,	WUSB100),
    198        1.1    nonaka 	USB_ID(LINKSYS4,	WUSB54GC_3),
    199        1.1    nonaka 	USB_ID(LINKSYS4,	WUSB600N),
    200        1.1    nonaka 	USB_ID(LINKSYS4,	WUSB600NV2),
    201        1.1    nonaka 	USB_ID(LOGITEC,		LANW300NU2),
    202        1.1    nonaka 	USB_ID(LOGITEC,		RT2870_1),
    203        1.1    nonaka 	USB_ID(LOGITEC,		RT2870_2),
    204        1.1    nonaka 	USB_ID(LOGITEC,		RT2870_3),
    205        1.1    nonaka 	USB_ID(LOGITEC,		RT3020),
    206        1.1    nonaka 	USB_ID(MELCO,		RT2870_1),
    207        1.1    nonaka 	USB_ID(MELCO,		RT2870_2),
    208        1.1    nonaka 	USB_ID(MELCO,		WLIUCAG300N),
    209        1.1    nonaka 	USB_ID(MELCO,		WLIUCG300N),
    210        1.1    nonaka 	USB_ID(MELCO,		WLIUCG301N),
    211        1.1    nonaka 	USB_ID(MELCO,		WLIUCGN),
    212        1.1    nonaka 	USB_ID(MELCO,		WLIUCGNHP),
    213        1.1    nonaka 	USB_ID(MELCO,		WLIUCGNM),
    214        1.1    nonaka 	USB_ID(MELCO,		WLIUCGNM2T),
    215        1.1    nonaka 	USB_ID(MOTOROLA4,	RT2770),
    216        1.1    nonaka 	USB_ID(MOTOROLA4,	RT3070),
    217        1.1    nonaka 	USB_ID(MSI,		RT3070),
    218        1.1    nonaka 	USB_ID(MSI,		RT3070_2),
    219        1.1    nonaka 	USB_ID(MSI,		RT3070_3),
    220        1.1    nonaka 	USB_ID(MSI,		RT3070_4),
    221        1.1    nonaka 	USB_ID(MSI,		RT3070_5),
    222        1.1    nonaka 	USB_ID(MSI,		RT3070_6),
    223        1.1    nonaka 	USB_ID(MSI,		RT3070_7),
    224        1.1    nonaka 	USB_ID(MSI,		RT3070_8),
    225        1.1    nonaka 	USB_ID(MSI,		RT3070_9),
    226        1.1    nonaka 	USB_ID(MSI,		RT3070_10),
    227        1.1    nonaka 	USB_ID(MSI,		RT3070_11),
    228        1.1    nonaka 	USB_ID(MSI,		RT3070_12),
    229        1.1    nonaka 	USB_ID(MSI,		RT3070_13),
    230        1.1    nonaka 	USB_ID(MSI,		RT3070_14),
    231        1.1    nonaka 	USB_ID(MSI,		RT3070_15),
    232        1.1    nonaka 	USB_ID(OVISLINK,	RT3071),
    233        1.1    nonaka 	USB_ID(OVISLINK,	RT3072),
    234        1.1    nonaka 	USB_ID(PARA,		RT3070),
    235        1.1    nonaka 	USB_ID(PEGATRON,	RT2870),
    236        1.1    nonaka 	USB_ID(PEGATRON,	RT3070),
    237        1.1    nonaka 	USB_ID(PEGATRON,	RT3070_2),
    238        1.1    nonaka 	USB_ID(PEGATRON,	RT3070_3),
    239        1.1    nonaka 	USB_ID(PEGATRON,	RT3072),
    240        1.1    nonaka 	USB_ID(PHILIPS,		RT2870),
    241        1.1    nonaka 	USB_ID(PLANEX2,		GWUS300MINIS),
    242        1.1    nonaka 	USB_ID(PLANEX2,		GWUSMICRO300),
    243        1.1    nonaka 	USB_ID(PLANEX2,		GWUSMICRON),
    244        1.1    nonaka 	USB_ID(PLANEX2,		GWUS300MINIX),
    245        1.1    nonaka 	USB_ID(PLANEX2,		RT3070),
    246        1.1    nonaka 	USB_ID(QCOM,		RT2870),
    247        1.1    nonaka 	USB_ID(QUANTA,		RT3070),
    248        1.1    nonaka 	USB_ID(RALINK,		RT2070),
    249        1.1    nonaka 	USB_ID(RALINK,		RT2770),
    250        1.1    nonaka 	USB_ID(RALINK,		RT2870),
    251        1.1    nonaka 	USB_ID(RALINK,		RT3070),
    252        1.1    nonaka 	USB_ID(RALINK,		RT3071),
    253        1.1    nonaka 	USB_ID(RALINK,		RT3072),
    254        1.1    nonaka 	USB_ID(RALINK,		RT3370),
    255        1.1    nonaka 	USB_ID(RALINK,		RT3572),
    256  1.10.6.11     skrll 	USB_ID(RALINK,		RT5572),
    257        1.1    nonaka 	USB_ID(RALINK,		RT8070),
    258        1.1    nonaka 	USB_ID(SAMSUNG,		RT2870_1),
    259        1.1    nonaka 	USB_ID(SENAO,		RT2870_1),
    260        1.1    nonaka 	USB_ID(SENAO,		RT2870_2),
    261        1.1    nonaka 	USB_ID(SENAO,		RT2870_3),
    262        1.1    nonaka 	USB_ID(SENAO,		RT2870_4),
    263        1.1    nonaka 	USB_ID(SENAO,		RT3070),
    264        1.1    nonaka 	USB_ID(SENAO,		RT3071),
    265        1.1    nonaka 	USB_ID(SENAO,		RT3072),
    266        1.1    nonaka 	USB_ID(SENAO,		RT3072_2),
    267        1.1    nonaka 	USB_ID(SENAO,		RT3072_3),
    268        1.1    nonaka 	USB_ID(SENAO,		RT3072_4),
    269        1.1    nonaka 	USB_ID(SENAO,		RT3072_5),
    270        1.1    nonaka 	USB_ID(SITECOMEU,	RT2870_1),
    271        1.1    nonaka 	USB_ID(SITECOMEU,	RT2870_2),
    272        1.1    nonaka 	USB_ID(SITECOMEU,	RT2870_3),
    273        1.1    nonaka 	USB_ID(SITECOMEU,	RT3070_1),
    274        1.1    nonaka 	USB_ID(SITECOMEU,	RT3072_3),
    275        1.1    nonaka 	USB_ID(SITECOMEU,	RT3072_4),
    276        1.1    nonaka 	USB_ID(SITECOMEU,	RT3072_5),
    277        1.1    nonaka 	USB_ID(SITECOMEU,	WL302),
    278        1.1    nonaka 	USB_ID(SITECOMEU,	WL315),
    279        1.1    nonaka 	USB_ID(SITECOMEU,	WL321),
    280        1.1    nonaka 	USB_ID(SITECOMEU,	WL324),
    281        1.1    nonaka 	USB_ID(SITECOMEU,	WL329),
    282        1.1    nonaka 	USB_ID(SITECOMEU,	WL343),
    283        1.1    nonaka 	USB_ID(SITECOMEU,	WL344),
    284        1.1    nonaka 	USB_ID(SITECOMEU,	WL345),
    285        1.1    nonaka 	USB_ID(SITECOMEU,	WL349V4),
    286        1.1    nonaka 	USB_ID(SITECOMEU,	WL608),
    287        1.1    nonaka 	USB_ID(SITECOMEU,	WLA4000),
    288        1.1    nonaka 	USB_ID(SITECOMEU,	WLA5000),
    289        1.1    nonaka 	USB_ID(SPARKLAN,	RT2870_1),
    290        1.1    nonaka 	USB_ID(SPARKLAN,	RT2870_2),
    291        1.1    nonaka 	USB_ID(SPARKLAN,	RT3070),
    292        1.1    nonaka 	USB_ID(SWEEX2,		LW153),
    293        1.1    nonaka 	USB_ID(SWEEX2,		LW303),
    294        1.1    nonaka 	USB_ID(SWEEX2,		LW313),
    295        1.1    nonaka 	USB_ID(TOSHIBA,		RT3070),
    296        1.1    nonaka 	USB_ID(UMEDIA,		RT2870_1),
    297        1.1    nonaka 	USB_ID(UMEDIA,		TEW645UB),
    298        1.1    nonaka 	USB_ID(ZCOM,		RT2870_1),
    299        1.1    nonaka 	USB_ID(ZCOM,		RT2870_2),
    300        1.1    nonaka 	USB_ID(ZINWELL,		RT2870_1),
    301        1.1    nonaka 	USB_ID(ZINWELL,		RT2870_2),
    302        1.1    nonaka 	USB_ID(ZINWELL,		RT3070),
    303        1.1    nonaka 	USB_ID(ZINWELL,		RT3072),
    304        1.1    nonaka 	USB_ID(ZINWELL,		RT3072_2),
    305        1.1    nonaka 	USB_ID(ZYXEL,		NWD2105),
    306        1.1    nonaka 	USB_ID(ZYXEL,		NWD211AN),
    307        1.1    nonaka 	USB_ID(ZYXEL,		RT2870_1),
    308        1.1    nonaka 	USB_ID(ZYXEL,		RT2870_2),
    309        1.1    nonaka 	USB_ID(ZYXEL,		RT3070),
    310        1.1    nonaka };
    311        1.1    nonaka 
    312        1.1    nonaka static int		run_match(device_t, cfdata_t, void *);
    313        1.1    nonaka static void		run_attach(device_t, device_t, void *);
    314        1.1    nonaka static int		run_detach(device_t, int);
    315        1.1    nonaka static int		run_activate(device_t, enum devact);
    316        1.1    nonaka 
    317        1.1    nonaka CFATTACH_DECL_NEW(run, sizeof(struct run_softc),
    318        1.1    nonaka 	run_match, run_attach, run_detach, run_activate);
    319        1.1    nonaka 
    320        1.1    nonaka static int		run_alloc_rx_ring(struct run_softc *);
    321        1.1    nonaka static void		run_free_rx_ring(struct run_softc *);
    322        1.1    nonaka static int		run_alloc_tx_ring(struct run_softc *, int);
    323        1.1    nonaka static void		run_free_tx_ring(struct run_softc *, int);
    324        1.1    nonaka static int		run_load_microcode(struct run_softc *);
    325        1.1    nonaka static int		run_reset(struct run_softc *);
    326        1.1    nonaka static int		run_read(struct run_softc *, uint16_t, uint32_t *);
    327        1.1    nonaka static int		run_read_region_1(struct run_softc *, uint16_t,
    328        1.1    nonaka 			    uint8_t *, int);
    329        1.1    nonaka static int		run_write_2(struct run_softc *, uint16_t, uint16_t);
    330        1.1    nonaka static int		run_write(struct run_softc *, uint16_t, uint32_t);
    331        1.1    nonaka static int		run_write_region_1(struct run_softc *, uint16_t,
    332        1.1    nonaka 			    const uint8_t *, int);
    333        1.1    nonaka static int		run_set_region_4(struct run_softc *, uint16_t,
    334        1.1    nonaka 			    uint32_t, int);
    335  1.10.6.11     skrll static int		run_efuse_read(struct run_softc *, uint16_t,
    336  1.10.6.11     skrll 			    uint16_t *, int);
    337        1.1    nonaka static int		run_efuse_read_2(struct run_softc *, uint16_t,
    338        1.1    nonaka 			    uint16_t *);
    339        1.1    nonaka static int		run_eeprom_read_2(struct run_softc *, uint16_t,
    340        1.1    nonaka 			    uint16_t *);
    341        1.1    nonaka static int		run_rt2870_rf_write(struct run_softc *, uint8_t,
    342        1.1    nonaka 			    uint32_t);
    343        1.1    nonaka static int		run_rt3070_rf_read(struct run_softc *, uint8_t,
    344        1.1    nonaka 			    uint8_t *);
    345        1.1    nonaka static int		run_rt3070_rf_write(struct run_softc *, uint8_t,
    346        1.1    nonaka 			    uint8_t);
    347        1.1    nonaka static int		run_bbp_read(struct run_softc *, uint8_t, uint8_t *);
    348        1.1    nonaka static int		run_bbp_write(struct run_softc *, uint8_t, uint8_t);
    349        1.1    nonaka static int		run_mcu_cmd(struct run_softc *, uint8_t, uint16_t);
    350        1.1    nonaka static const char *	run_get_rf(int);
    351  1.10.6.11     skrll static void		run_rt3593_get_txpower(struct run_softc *);
    352  1.10.6.11     skrll static void		run_get_txpower(struct run_softc *);
    353        1.1    nonaka static int		run_read_eeprom(struct run_softc *);
    354        1.1    nonaka static struct ieee80211_node *
    355        1.1    nonaka 			run_node_alloc(struct ieee80211_node_table *);
    356        1.1    nonaka static int		run_media_change(struct ifnet *);
    357        1.1    nonaka static void		run_next_scan(void *);
    358        1.1    nonaka static void		run_task(void *);
    359        1.1    nonaka static void		run_do_async(struct run_softc *,
    360        1.1    nonaka 			    void (*)(struct run_softc *, void *), void *, int);
    361        1.1    nonaka static int		run_newstate(struct ieee80211com *,
    362        1.1    nonaka 			    enum ieee80211_state, int);
    363        1.1    nonaka static void		run_newstate_cb(struct run_softc *, void *);
    364        1.1    nonaka static int		run_updateedca(struct ieee80211com *);
    365        1.1    nonaka static void		run_updateedca_cb(struct run_softc *, void *);
    366        1.1    nonaka #ifdef RUN_HWCRYPTO
    367        1.1    nonaka static int		run_set_key(struct ieee80211com *,
    368        1.1    nonaka 			    const struct ieee80211_key *, const uint8_t *);
    369        1.1    nonaka static void		run_set_key_cb(struct run_softc *, void *);
    370        1.1    nonaka static int		run_delete_key(struct ieee80211com *,
    371        1.1    nonaka 			    const struct ieee80211_key *);
    372        1.1    nonaka static void		run_delete_key_cb(struct run_softc *, void *);
    373        1.1    nonaka #endif
    374        1.1    nonaka static void		run_calibrate_to(void *);
    375        1.1    nonaka static void		run_calibrate_cb(struct run_softc *, void *);
    376        1.1    nonaka static void		run_newassoc(struct ieee80211_node *, int);
    377        1.1    nonaka static void		run_rx_frame(struct run_softc *, uint8_t *, int);
    378   1.10.6.3     skrll static void		run_rxeof(struct usbd_xfer *, void *,
    379        1.1    nonaka 			    usbd_status);
    380   1.10.6.3     skrll static void		run_txeof(struct usbd_xfer *, void *,
    381        1.1    nonaka 			    usbd_status);
    382        1.1    nonaka static int		run_tx(struct run_softc *, struct mbuf *,
    383        1.1    nonaka 			    struct ieee80211_node *);
    384        1.1    nonaka static void		run_start(struct ifnet *);
    385        1.1    nonaka static void		run_watchdog(struct ifnet *);
    386        1.1    nonaka static int		run_ioctl(struct ifnet *, u_long, void *);
    387        1.1    nonaka static void		run_select_chan_group(struct run_softc *, int);
    388  1.10.6.11     skrll static void		run_iq_calib(struct run_softc *, u_int);
    389        1.1    nonaka static void		run_set_agc(struct run_softc *, uint8_t);
    390        1.1    nonaka static void		run_set_rx_antenna(struct run_softc *, int);
    391        1.1    nonaka static void		run_rt2870_set_chan(struct run_softc *, u_int);
    392        1.1    nonaka static void		run_rt3070_set_chan(struct run_softc *, u_int);
    393        1.1    nonaka static void		run_rt3572_set_chan(struct run_softc *, u_int);
    394  1.10.6.11     skrll static void		run_rt3593_set_chan(struct run_softc *, u_int);
    395  1.10.6.11     skrll static void		run_rt5390_set_chan(struct run_softc *, u_int);
    396  1.10.6.11     skrll static void		run_rt5592_set_chan(struct run_softc *, u_int);
    397        1.1    nonaka static int		run_set_chan(struct run_softc *,
    398        1.1    nonaka 			    struct ieee80211_channel *);
    399  1.10.6.11     skrll static void		run_updateprot(struct run_softc *);
    400        1.1    nonaka static void		run_enable_tsf_sync(struct run_softc *);
    401        1.1    nonaka static void		run_enable_mrr(struct run_softc *);
    402        1.1    nonaka static void		run_set_txpreamble(struct run_softc *);
    403        1.1    nonaka static void		run_set_basicrates(struct run_softc *);
    404        1.1    nonaka static void		run_set_leds(struct run_softc *, uint16_t);
    405        1.1    nonaka static void		run_set_bssid(struct run_softc *, const uint8_t *);
    406        1.1    nonaka static void		run_set_macaddr(struct run_softc *, const uint8_t *);
    407        1.1    nonaka static void		run_updateslot(struct ifnet *);
    408        1.1    nonaka static void		run_updateslot_cb(struct run_softc *, void *);
    409        1.1    nonaka static int8_t		run_rssi2dbm(struct run_softc *, uint8_t, uint8_t);
    410  1.10.6.11     skrll static void		run_rt5390_bbp_init(struct run_softc *);
    411        1.1    nonaka static int		run_bbp_init(struct run_softc *);
    412        1.1    nonaka static int		run_rt3070_rf_init(struct run_softc *);
    413  1.10.6.11     skrll static int		run_rt3593_rf_init(struct run_softc *);
    414  1.10.6.11     skrll static int		run_rt5390_rf_init(struct run_softc *);
    415        1.1    nonaka static int		run_rt3070_filter_calib(struct run_softc *, uint8_t,
    416        1.1    nonaka 			    uint8_t, uint8_t *);
    417        1.1    nonaka static void		run_rt3070_rf_setup(struct run_softc *);
    418  1.10.6.11     skrll static void		run_rt3593_rf_setup(struct run_softc *);
    419  1.10.6.11     skrll static void		run_rt5390_rf_setup(struct run_softc *);
    420        1.1    nonaka static int		run_txrx_enable(struct run_softc *);
    421  1.10.6.11     skrll static int     		run_adjust_freq_offset(struct run_softc *);
    422        1.1    nonaka static int		run_init(struct ifnet *);
    423        1.1    nonaka static void		run_stop(struct ifnet *, int);
    424        1.1    nonaka #ifndef IEEE80211_STA_ONLY
    425        1.1    nonaka static int		run_setup_beacon(struct run_softc *);
    426        1.1    nonaka #endif
    427        1.1    nonaka 
    428        1.1    nonaka static const struct {
    429        1.1    nonaka 	uint32_t reg;
    430        1.1    nonaka 	uint32_t val;
    431        1.1    nonaka } rt2870_def_mac[] = {
    432        1.1    nonaka 	RT2870_DEF_MAC
    433        1.1    nonaka };
    434        1.1    nonaka 
    435        1.1    nonaka static const struct {
    436        1.1    nonaka 	uint8_t reg;
    437        1.1    nonaka 	uint8_t val;
    438        1.1    nonaka } rt2860_def_bbp[] = {
    439        1.1    nonaka 	RT2860_DEF_BBP
    440  1.10.6.11     skrll }, rt5390_def_bbp[] = {
    441  1.10.6.11     skrll 	RT5390_DEF_BBP
    442  1.10.6.11     skrll }, rt5592_def_bbp[] = {
    443  1.10.6.11     skrll 	RT5592_DEF_BBP
    444  1.10.6.11     skrll };
    445  1.10.6.11     skrll 
    446  1.10.6.11     skrll /*
    447  1.10.6.11     skrll  * Default values for BBP register R196 for RT5592.
    448  1.10.6.11     skrll  */
    449  1.10.6.11     skrll static const uint8_t rt5592_bbp_r196[] = {
    450  1.10.6.11     skrll 	0xe0, 0x1f, 0x38, 0x32, 0x08, 0x28, 0x19, 0x0a, 0xff, 0x00,
    451  1.10.6.11     skrll 	0x16, 0x10, 0x10, 0x0b, 0x36, 0x2c, 0x26, 0x24, 0x42, 0x36,
    452  1.10.6.11     skrll 	0x30, 0x2d, 0x4c, 0x46, 0x3d, 0x40, 0x3e, 0x42, 0x3d, 0x40,
    453  1.10.6.11     skrll 	0x3c, 0x34, 0x2c, 0x2f, 0x3c, 0x35, 0x2e, 0x2a, 0x49, 0x41,
    454  1.10.6.11     skrll 	0x36, 0x31, 0x30, 0x30, 0x0e, 0x0d, 0x28, 0x21, 0x1c, 0x16,
    455  1.10.6.11     skrll 	0x50, 0x4a, 0x43, 0x40, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00,
    456  1.10.6.11     skrll 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    457  1.10.6.11     skrll 	0x00, 0x00, 0x7d, 0x14, 0x32, 0x2c, 0x36, 0x4c, 0x43, 0x2c,
    458  1.10.6.11     skrll 	0x2e, 0x36, 0x30, 0x6e
    459        1.1    nonaka };
    460        1.1    nonaka 
    461        1.1    nonaka static const struct rfprog {
    462        1.1    nonaka 	uint8_t chan;
    463        1.1    nonaka 	uint32_t r1, r2, r3, r4;
    464        1.1    nonaka } rt2860_rf2850[] = {
    465        1.1    nonaka 	RT2860_RF2850
    466        1.1    nonaka };
    467        1.1    nonaka 
    468        1.1    nonaka static const struct {
    469        1.1    nonaka 	uint8_t n, r, k;
    470        1.1    nonaka } rt3070_freqs[] = {
    471        1.1    nonaka 	RT3070_RF3052
    472        1.1    nonaka };
    473        1.1    nonaka 
    474  1.10.6.11     skrll static const struct rt5592_freqs {
    475  1.10.6.11     skrll 	uint16_t n;
    476  1.10.6.11     skrll 	uint8_t k, m, r;
    477  1.10.6.11     skrll } rt5592_freqs_20mhz[] = {
    478  1.10.6.11     skrll 	RT5592_RF5592_20MHZ
    479  1.10.6.11     skrll },rt5592_freqs_40mhz[] = {
    480  1.10.6.11     skrll 	RT5592_RF5592_40MHZ
    481  1.10.6.11     skrll };
    482  1.10.6.11     skrll 
    483        1.1    nonaka static const struct {
    484        1.1    nonaka 	uint8_t reg;
    485        1.1    nonaka 	uint8_t val;
    486        1.1    nonaka } rt3070_def_rf[] = {
    487        1.1    nonaka 	RT3070_DEF_RF
    488        1.1    nonaka }, rt3572_def_rf[] = {
    489        1.1    nonaka 	RT3572_DEF_RF
    490  1.10.6.11     skrll },rt3593_def_rf[] = {
    491  1.10.6.11     skrll 	RT3593_DEF_RF
    492  1.10.6.11     skrll },rt5390_def_rf[] = {
    493  1.10.6.11     skrll 	RT5390_DEF_RF
    494  1.10.6.11     skrll },rt5392_def_rf[] = {
    495  1.10.6.11     skrll 	RT5392_DEF_RF
    496  1.10.6.11     skrll },rt5592_def_rf[] = {
    497  1.10.6.11     skrll 	RT5592_DEF_RF
    498  1.10.6.11     skrll },rt5592_2ghz_def_rf[] = {
    499  1.10.6.11     skrll 	RT5592_2GHZ_DEF_RF
    500  1.10.6.11     skrll },rt5592_5ghz_def_rf[] = {
    501  1.10.6.11     skrll 	RT5592_5GHZ_DEF_RF
    502  1.10.6.11     skrll };
    503  1.10.6.11     skrll 
    504  1.10.6.11     skrll static const struct {
    505  1.10.6.11     skrll 	u_int firstchan;
    506  1.10.6.11     skrll 	u_int lastchan;
    507  1.10.6.11     skrll 	uint8_t reg;
    508  1.10.6.11     skrll 	uint8_t val;
    509  1.10.6.11     skrll } rt5592_chan_5ghz[] = {
    510  1.10.6.11     skrll 	RT5592_CHAN_5GHZ
    511        1.1    nonaka };
    512        1.1    nonaka 
    513        1.1    nonaka static int
    514        1.1    nonaka firmware_load(const char *dname, const char *iname, uint8_t **ucodep,
    515        1.1    nonaka     size_t *sizep)
    516        1.1    nonaka {
    517        1.1    nonaka 	firmware_handle_t fh;
    518        1.1    nonaka 	int error;
    519        1.1    nonaka 
    520        1.1    nonaka 	if ((error = firmware_open(dname, iname, &fh)) != 0)
    521   1.10.6.2     skrll 		return error;
    522        1.1    nonaka 	*sizep = firmware_get_size(fh);
    523        1.1    nonaka 	if ((*ucodep = firmware_malloc(*sizep)) == NULL) {
    524        1.1    nonaka 		firmware_close(fh);
    525   1.10.6.2     skrll 		return ENOMEM;
    526        1.1    nonaka 	}
    527        1.1    nonaka 	if ((error = firmware_read(fh, 0, *ucodep, *sizep)) != 0)
    528        1.1    nonaka 		firmware_free(*ucodep, *sizep);
    529        1.1    nonaka 	firmware_close(fh);
    530        1.1    nonaka 
    531   1.10.6.2     skrll 	return error;
    532        1.1    nonaka }
    533        1.1    nonaka 
    534        1.1    nonaka static int
    535        1.1    nonaka run_match(device_t parent, cfdata_t match, void *aux)
    536        1.1    nonaka {
    537        1.1    nonaka 	struct usb_attach_arg *uaa = aux;
    538        1.1    nonaka 
    539   1.10.6.4     skrll 	return (usb_lookup(run_devs, uaa->uaa_vendor, uaa->uaa_product) != NULL) ?
    540        1.1    nonaka 	    UMATCH_VENDOR_PRODUCT : UMATCH_NONE;
    541        1.1    nonaka }
    542        1.1    nonaka 
    543        1.1    nonaka static void
    544        1.1    nonaka run_attach(device_t parent, device_t self, void *aux)
    545        1.1    nonaka {
    546        1.1    nonaka 	struct run_softc *sc = device_private(self);
    547        1.1    nonaka 	struct usb_attach_arg *uaa = aux;
    548        1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
    549        1.1    nonaka 	struct ifnet *ifp = &sc->sc_if;
    550        1.1    nonaka 	usb_interface_descriptor_t *id;
    551        1.1    nonaka 	usb_endpoint_descriptor_t *ed;
    552        1.1    nonaka 	char *devinfop;
    553        1.1    nonaka 	int i, nrx, ntx, ntries, error;
    554        1.1    nonaka 	uint32_t ver;
    555        1.1    nonaka 
    556        1.1    nonaka 	aprint_naive("\n");
    557        1.1    nonaka 	aprint_normal("\n");
    558        1.1    nonaka 
    559        1.1    nonaka 	sc->sc_dev = self;
    560   1.10.6.4     skrll 	sc->sc_udev = uaa->uaa_device;
    561        1.1    nonaka 
    562        1.1    nonaka 	devinfop = usbd_devinfo_alloc(sc->sc_udev, 0);
    563        1.1    nonaka 	aprint_normal_dev(sc->sc_dev, "%s\n", devinfop);
    564        1.1    nonaka 	usbd_devinfo_free(devinfop);
    565        1.1    nonaka 
    566        1.5     skrll 	error = usbd_set_config_no(sc->sc_udev, 1, 0);
    567        1.5     skrll 	if (error != 0) {
    568        1.5     skrll 		aprint_error_dev(sc->sc_dev, "failed to set configuration"
    569        1.5     skrll 		    ", err=%s\n", usbd_errstr(error));
    570        1.1    nonaka 		return;
    571        1.1    nonaka 	}
    572        1.1    nonaka 
    573        1.1    nonaka 	/* get the first interface handle */
    574        1.1    nonaka 	error = usbd_device2interface_handle(sc->sc_udev, 0, &sc->sc_iface);
    575        1.1    nonaka 	if (error != 0) {
    576        1.1    nonaka 		aprint_error_dev(sc->sc_dev,
    577        1.1    nonaka 		    "could not get interface handle\n");
    578        1.1    nonaka 		return;
    579        1.1    nonaka 	}
    580        1.1    nonaka 
    581        1.1    nonaka 	/*
    582        1.1    nonaka 	 * Find all bulk endpoints.  There are 7 bulk endpoints: 1 for RX
    583        1.1    nonaka 	 * and 6 for TX (4 EDCAs + HCCA + Prio).
    584        1.1    nonaka 	 * Update 03-14-2009:  some devices like the Planex GW-US300MiniS
    585        1.1    nonaka 	 * seem to have only 4 TX bulk endpoints (Fukaumi Naoki).
    586        1.1    nonaka 	 */
    587        1.1    nonaka 	nrx = ntx = 0;
    588        1.1    nonaka 	id = usbd_get_interface_descriptor(sc->sc_iface);
    589        1.1    nonaka 	for (i = 0; i < id->bNumEndpoints; i++) {
    590        1.1    nonaka 		ed = usbd_interface2endpoint_descriptor(sc->sc_iface, i);
    591        1.1    nonaka 		if (ed == NULL || UE_GET_XFERTYPE(ed->bmAttributes) != UE_BULK)
    592        1.1    nonaka 			continue;
    593        1.1    nonaka 
    594        1.1    nonaka 		if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN) {
    595        1.1    nonaka 			sc->rxq.pipe_no = ed->bEndpointAddress;
    596        1.1    nonaka 			nrx++;
    597        1.1    nonaka 		} else if (ntx < 4) {
    598        1.1    nonaka 			sc->txq[ntx].pipe_no = ed->bEndpointAddress;
    599        1.1    nonaka 			ntx++;
    600        1.1    nonaka 		}
    601        1.1    nonaka 	}
    602        1.1    nonaka 	/* make sure we've got them all */
    603        1.1    nonaka 	if (nrx < 1 || ntx < 4) {
    604        1.1    nonaka 		aprint_error_dev(sc->sc_dev, "missing endpoint\n");
    605        1.1    nonaka 		return;
    606        1.1    nonaka 	}
    607        1.1    nonaka 
    608        1.8  jmcneill 	usb_init_task(&sc->sc_task, run_task, sc, 0);
    609        1.1    nonaka 	callout_init(&sc->scan_to, 0);
    610        1.1    nonaka 	callout_setfunc(&sc->scan_to, run_next_scan, sc);
    611        1.1    nonaka 	callout_init(&sc->calib_to, 0);
    612        1.1    nonaka 	callout_setfunc(&sc->calib_to, run_calibrate_to, sc);
    613        1.1    nonaka 
    614        1.1    nonaka 	sc->amrr.amrr_min_success_threshold =  1;
    615        1.1    nonaka 	sc->amrr.amrr_max_success_threshold = 10;
    616        1.1    nonaka 
    617        1.1    nonaka 	/* wait for the chip to settle */
    618        1.1    nonaka 	for (ntries = 0; ntries < 100; ntries++) {
    619        1.1    nonaka 		if (run_read(sc, RT2860_ASIC_VER_ID, &ver) != 0)
    620        1.1    nonaka 			return;
    621        1.1    nonaka 		if (ver != 0 && ver != 0xffffffff)
    622        1.1    nonaka 			break;
    623        1.1    nonaka 		DELAY(10);
    624        1.1    nonaka 	}
    625        1.1    nonaka 	if (ntries == 100) {
    626        1.1    nonaka 		aprint_error_dev(sc->sc_dev,
    627        1.1    nonaka 		    "timeout waiting for NIC to initialize\n");
    628        1.1    nonaka 		return;
    629        1.1    nonaka 	}
    630        1.1    nonaka 	sc->mac_ver = ver >> 16;
    631        1.1    nonaka 	sc->mac_rev = ver & 0xffff;
    632        1.1    nonaka 
    633        1.1    nonaka 	/* retrieve RF rev. no and various other things from EEPROM */
    634        1.1    nonaka 	run_read_eeprom(sc);
    635        1.1    nonaka 
    636        1.1    nonaka 	aprint_error_dev(sc->sc_dev,
    637        1.1    nonaka 	    "MAC/BBP RT%04X (rev 0x%04X), RF %s (MIMO %dT%dR), address %s\n",
    638        1.1    nonaka 	    sc->mac_ver, sc->mac_rev, run_get_rf(sc->rf_rev), sc->ntxchains,
    639        1.1    nonaka 	    sc->nrxchains, ether_sprintf(ic->ic_myaddr));
    640        1.1    nonaka 
    641        1.1    nonaka 	ic->ic_ifp = ifp;
    642        1.1    nonaka 	ic->ic_phytype = IEEE80211_T_OFDM;	/* not only, but not used */
    643        1.1    nonaka 	ic->ic_opmode = IEEE80211_M_STA;	/* default to BSS mode */
    644        1.1    nonaka 	ic->ic_state = IEEE80211_S_INIT;
    645        1.1    nonaka 
    646        1.1    nonaka 	/* set device capabilities */
    647        1.1    nonaka 	ic->ic_caps =
    648        1.1    nonaka 	    IEEE80211_C_MONITOR |	/* monitor mode supported */
    649        1.1    nonaka #ifndef IEEE80211_STA_ONLY
    650        1.1    nonaka 	    IEEE80211_C_IBSS |		/* IBSS mode supported */
    651        1.1    nonaka 	    IEEE80211_C_HOSTAP |	/* HostAP mode supported */
    652        1.1    nonaka #endif
    653        1.1    nonaka 	    IEEE80211_C_SHPREAMBLE |	/* short preamble supported */
    654        1.1    nonaka 	    IEEE80211_C_SHSLOT |	/* short slot time supported */
    655        1.1    nonaka #ifdef RUN_HWCRYPTO
    656        1.1    nonaka 	    IEEE80211_C_WEP |		/* WEP */
    657        1.1    nonaka 	    IEEE80211_C_TKIP |		/* TKIP */
    658        1.1    nonaka 	    IEEE80211_C_AES_CCM |	/* AES CCMP */
    659        1.1    nonaka 	    IEEE80211_C_TKIPMIC |	/* TKIPMIC */
    660        1.1    nonaka #endif
    661        1.1    nonaka 	    IEEE80211_C_WME |		/* WME */
    662        1.1    nonaka 	    IEEE80211_C_WPA;		/* WPA/RSN */
    663        1.1    nonaka 
    664        1.1    nonaka 	if (sc->rf_rev == RT2860_RF_2750 ||
    665        1.1    nonaka 	    sc->rf_rev == RT2860_RF_2850 ||
    666  1.10.6.11     skrll 	    sc->rf_rev == RT3070_RF_3052 ||
    667  1.10.6.11     skrll 	    sc->rf_rev == RT3070_RF_3053 ||
    668  1.10.6.11     skrll 	    sc->rf_rev == RT5592_RF_5592) {
    669        1.1    nonaka 		/* set supported .11a rates */
    670        1.1    nonaka 		ic->ic_sup_rates[IEEE80211_MODE_11A] =
    671        1.1    nonaka 		    ieee80211_std_rateset_11a;
    672        1.1    nonaka 
    673        1.1    nonaka 		/* set supported .11a channels */
    674        1.1    nonaka 		for (i = 14; i < (int)__arraycount(rt2860_rf2850); i++) {
    675        1.1    nonaka 			uint8_t chan = rt2860_rf2850[i].chan;
    676        1.1    nonaka 			ic->ic_channels[chan].ic_freq =
    677        1.1    nonaka 			    ieee80211_ieee2mhz(chan, IEEE80211_CHAN_5GHZ);
    678        1.1    nonaka 			ic->ic_channels[chan].ic_flags = IEEE80211_CHAN_A;
    679        1.1    nonaka 		}
    680        1.1    nonaka 	}
    681        1.1    nonaka 
    682        1.1    nonaka 	/* set supported .11b and .11g rates */
    683        1.1    nonaka 	ic->ic_sup_rates[IEEE80211_MODE_11B] = ieee80211_std_rateset_11b;
    684        1.1    nonaka 	ic->ic_sup_rates[IEEE80211_MODE_11G] = ieee80211_std_rateset_11g;
    685        1.1    nonaka 
    686        1.1    nonaka 	/* set supported .11b and .11g channels (1 through 14) */
    687        1.1    nonaka 	for (i = 1; i <= 14; i++) {
    688        1.1    nonaka 		ic->ic_channels[i].ic_freq =
    689        1.1    nonaka 		    ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ);
    690        1.1    nonaka 		ic->ic_channels[i].ic_flags =
    691        1.1    nonaka 		    IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM |
    692        1.1    nonaka 		    IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ;
    693        1.1    nonaka 	}
    694        1.1    nonaka 
    695        1.1    nonaka 	ifp->if_softc = sc;
    696        1.1    nonaka 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
    697        1.1    nonaka 	ifp->if_init = run_init;
    698        1.1    nonaka 	ifp->if_ioctl = run_ioctl;
    699        1.1    nonaka 	ifp->if_start = run_start;
    700        1.1    nonaka 	ifp->if_watchdog = run_watchdog;
    701        1.1    nonaka 	IFQ_SET_READY(&ifp->if_snd);
    702        1.1    nonaka 	memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
    703        1.1    nonaka 
    704        1.1    nonaka 	if_attach(ifp);
    705        1.1    nonaka 	ieee80211_ifattach(ic);
    706        1.1    nonaka 	ic->ic_node_alloc = run_node_alloc;
    707        1.1    nonaka 	ic->ic_newassoc = run_newassoc;
    708        1.1    nonaka 	ic->ic_updateslot = run_updateslot;
    709        1.1    nonaka 	ic->ic_wme.wme_update = run_updateedca;
    710        1.1    nonaka #ifdef RUN_HWCRYPTO
    711        1.1    nonaka 	ic->ic_crypto.cs_key_set = run_set_key;
    712        1.1    nonaka 	ic->ic_crypto.cs_key_delete = run_delete_key;
    713        1.1    nonaka #endif
    714        1.1    nonaka 	/* override state transition machine */
    715        1.1    nonaka 	sc->sc_newstate = ic->ic_newstate;
    716        1.1    nonaka 	ic->ic_newstate = run_newstate;
    717        1.1    nonaka 	ieee80211_media_init(ic, run_media_change, ieee80211_media_status);
    718        1.1    nonaka 
    719        1.1    nonaka 	bpf_attach2(ifp, DLT_IEEE802_11_RADIO,
    720        1.1    nonaka 	    sizeof(struct ieee80211_frame) + IEEE80211_RADIOTAP_HDRLEN,
    721        1.1    nonaka 	    &sc->sc_drvbpf);
    722        1.1    nonaka 
    723        1.1    nonaka 	sc->sc_rxtap_len = sizeof(sc->sc_rxtapu);
    724        1.1    nonaka 	sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len);
    725        1.1    nonaka 	sc->sc_rxtap.wr_ihdr.it_present = htole32(RUN_RX_RADIOTAP_PRESENT);
    726        1.1    nonaka 
    727        1.1    nonaka 	sc->sc_txtap_len = sizeof(sc->sc_txtapu);
    728        1.1    nonaka 	sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len);
    729        1.1    nonaka 	sc->sc_txtap.wt_ihdr.it_present = htole32(RUN_TX_RADIOTAP_PRESENT);
    730        1.1    nonaka 
    731        1.1    nonaka 	ieee80211_announce(ic);
    732        1.1    nonaka 
    733        1.1    nonaka 	usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH, sc->sc_udev, sc->sc_dev);
    734   1.10.6.5     skrll 
    735   1.10.6.5     skrll 	if (!pmf_device_register(self, NULL, NULL))
    736   1.10.6.5     skrll 		aprint_error_dev(self, "couldn't establish power handler\n");
    737        1.1    nonaka }
    738        1.1    nonaka 
    739        1.1    nonaka static int
    740        1.1    nonaka run_detach(device_t self, int flags)
    741        1.1    nonaka {
    742        1.1    nonaka 	struct run_softc *sc = device_private(self);
    743        1.1    nonaka 	struct ifnet *ifp = &sc->sc_if;
    744        1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
    745        1.1    nonaka 	int s;
    746        1.1    nonaka 
    747        1.1    nonaka 	if (ifp->if_softc == NULL)
    748   1.10.6.2     skrll 		return 0;
    749        1.1    nonaka 
    750   1.10.6.5     skrll 	pmf_device_deregister(self);
    751   1.10.6.5     skrll 
    752  1.10.6.11     skrll 	s = splusb();
    753        1.1    nonaka 
    754        1.1    nonaka 	sc->sc_flags |= RUN_DETACHING;
    755        1.1    nonaka 
    756        1.1    nonaka 	if (ifp->if_flags & IFF_RUNNING) {
    757        1.1    nonaka 		usb_rem_task(sc->sc_udev, &sc->sc_task);
    758        1.1    nonaka 		run_stop(ifp, 0);
    759        1.1    nonaka 	}
    760        1.1    nonaka 
    761        1.1    nonaka 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
    762        1.1    nonaka 	bpf_detach(ifp);
    763        1.1    nonaka 	ieee80211_ifdetach(ic);
    764        1.1    nonaka 	if_detach(ifp);
    765        1.1    nonaka 
    766        1.1    nonaka 	splx(s);
    767        1.1    nonaka 
    768        1.1    nonaka 	usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev, sc->sc_dev);
    769        1.1    nonaka 
    770  1.10.6.11     skrll 	callout_stop(&sc->scan_to);
    771  1.10.6.11     skrll 	callout_stop(&sc->calib_to);
    772  1.10.6.11     skrll 
    773        1.1    nonaka 	callout_destroy(&sc->scan_to);
    774        1.1    nonaka 	callout_destroy(&sc->calib_to);
    775        1.1    nonaka 
    776   1.10.6.2     skrll 	return 0;
    777        1.1    nonaka }
    778        1.1    nonaka 
    779        1.1    nonaka static int
    780        1.1    nonaka run_activate(device_t self, enum devact act)
    781        1.1    nonaka {
    782        1.1    nonaka 	struct run_softc *sc = device_private(self);
    783        1.1    nonaka 
    784        1.1    nonaka 	switch (act) {
    785        1.1    nonaka 	case DVACT_DEACTIVATE:
    786        1.1    nonaka 		if_deactivate(sc->sc_ic.ic_ifp);
    787   1.10.6.2     skrll 		return 0;
    788        1.1    nonaka 	default:
    789   1.10.6.2     skrll 		return EOPNOTSUPP;
    790        1.1    nonaka 	}
    791        1.1    nonaka }
    792        1.1    nonaka 
    793        1.1    nonaka static int
    794        1.1    nonaka run_alloc_rx_ring(struct run_softc *sc)
    795        1.1    nonaka {
    796        1.1    nonaka 	struct run_rx_ring *rxq = &sc->rxq;
    797        1.1    nonaka 	int i, error;
    798        1.1    nonaka 
    799        1.1    nonaka 	error = usbd_open_pipe(sc->sc_iface, rxq->pipe_no, 0, &rxq->pipeh);
    800        1.1    nonaka 	if (error != 0)
    801        1.1    nonaka 		goto fail;
    802        1.1    nonaka 
    803        1.1    nonaka 	for (i = 0; i < RUN_RX_RING_COUNT; i++) {
    804        1.1    nonaka 		struct run_rx_data *data = &rxq->data[i];
    805        1.1    nonaka 
    806        1.1    nonaka 		data->sc = sc;	/* backpointer for callbacks */
    807        1.1    nonaka 
    808   1.10.6.7     skrll 		error = usbd_create_xfer(sc->rxq.pipeh, RUN_MAX_RXSZ,
    809   1.10.6.7     skrll 		    USBD_SHORT_XFER_OK, 0, &data->xfer);
    810   1.10.6.7     skrll 		if (error)
    811        1.1    nonaka 			goto fail;
    812   1.10.6.7     skrll 
    813   1.10.6.7     skrll 		data->buf = usbd_get_buffer(data->xfer);
    814        1.1    nonaka 	}
    815        1.1    nonaka 	if (error != 0)
    816        1.1    nonaka fail:		run_free_rx_ring(sc);
    817   1.10.6.2     skrll 	return error;
    818        1.1    nonaka }
    819        1.1    nonaka 
    820        1.1    nonaka static void
    821        1.1    nonaka run_free_rx_ring(struct run_softc *sc)
    822        1.1    nonaka {
    823        1.1    nonaka 	struct run_rx_ring *rxq = &sc->rxq;
    824        1.1    nonaka 	int i;
    825        1.1    nonaka 
    826        1.1    nonaka 	if (rxq->pipeh != NULL) {
    827        1.1    nonaka 		usbd_abort_pipe(rxq->pipeh);
    828        1.1    nonaka 	}
    829        1.1    nonaka 	for (i = 0; i < RUN_RX_RING_COUNT; i++) {
    830        1.1    nonaka 		if (rxq->data[i].xfer != NULL)
    831   1.10.6.7     skrll 			usbd_destroy_xfer(rxq->data[i].xfer);
    832        1.1    nonaka 		rxq->data[i].xfer = NULL;
    833        1.1    nonaka 	}
    834   1.10.6.8     skrll 	if (rxq->pipeh != NULL) {
    835   1.10.6.8     skrll 		usbd_close_pipe(rxq->pipeh);
    836   1.10.6.8     skrll 		rxq->pipeh = NULL;
    837   1.10.6.8     skrll 	}
    838        1.1    nonaka }
    839        1.1    nonaka 
    840        1.1    nonaka static int
    841        1.1    nonaka run_alloc_tx_ring(struct run_softc *sc, int qid)
    842        1.1    nonaka {
    843        1.1    nonaka 	struct run_tx_ring *txq = &sc->txq[qid];
    844        1.1    nonaka 	int i, error;
    845        1.1    nonaka 
    846        1.1    nonaka 	txq->cur = txq->queued = 0;
    847        1.1    nonaka 
    848        1.1    nonaka 	error = usbd_open_pipe(sc->sc_iface, txq->pipe_no, 0, &txq->pipeh);
    849        1.1    nonaka 	if (error != 0)
    850        1.1    nonaka 		goto fail;
    851        1.1    nonaka 
    852        1.1    nonaka 	for (i = 0; i < RUN_TX_RING_COUNT; i++) {
    853        1.1    nonaka 		struct run_tx_data *data = &txq->data[i];
    854        1.1    nonaka 
    855        1.1    nonaka 		data->sc = sc;	/* backpointer for callbacks */
    856        1.1    nonaka 		data->qid = qid;
    857        1.1    nonaka 
    858   1.10.6.7     skrll 		error = usbd_create_xfer(txq->pipeh, RUN_MAX_TXSZ,
    859   1.10.6.7     skrll 		    USBD_FORCE_SHORT_XFER, 0, &data->xfer);
    860   1.10.6.7     skrll 		if (error)
    861        1.1    nonaka 			goto fail;
    862   1.10.6.7     skrll 
    863   1.10.6.7     skrll 		data->buf = usbd_get_buffer(data->xfer);
    864        1.1    nonaka 		/* zeroize the TXD + TXWI part */
    865   1.10.6.6     skrll 		memset(data->buf, 0, sizeof(struct rt2870_txd) +
    866   1.10.6.6     skrll 		    sizeof(struct rt2860_txwi));
    867        1.1    nonaka 	}
    868        1.1    nonaka 	if (error != 0)
    869        1.1    nonaka fail:		run_free_tx_ring(sc, qid);
    870   1.10.6.2     skrll 	return error;
    871        1.1    nonaka }
    872        1.1    nonaka 
    873        1.1    nonaka static void
    874        1.1    nonaka run_free_tx_ring(struct run_softc *sc, int qid)
    875        1.1    nonaka {
    876        1.1    nonaka 	struct run_tx_ring *txq = &sc->txq[qid];
    877        1.1    nonaka 	int i;
    878        1.1    nonaka 
    879        1.1    nonaka 	if (txq->pipeh != NULL) {
    880        1.1    nonaka 		usbd_abort_pipe(txq->pipeh);
    881        1.1    nonaka 		usbd_close_pipe(txq->pipeh);
    882        1.1    nonaka 		txq->pipeh = NULL;
    883        1.1    nonaka 	}
    884        1.1    nonaka 	for (i = 0; i < RUN_TX_RING_COUNT; i++) {
    885        1.1    nonaka 		if (txq->data[i].xfer != NULL)
    886   1.10.6.7     skrll 			usbd_destroy_xfer(txq->data[i].xfer);
    887        1.1    nonaka 		txq->data[i].xfer = NULL;
    888        1.1    nonaka 	}
    889        1.1    nonaka }
    890        1.1    nonaka 
    891        1.1    nonaka static int
    892        1.1    nonaka run_load_microcode(struct run_softc *sc)
    893        1.1    nonaka {
    894        1.1    nonaka 	usb_device_request_t req;
    895        1.1    nonaka 	const char *fwname;
    896       1.10    martin 	u_char *ucode = NULL;	/* XXX gcc 4.8.3: maybe-uninitialized */
    897       1.10    martin 	size_t size = 0;	/* XXX gcc 4.8.3: maybe-uninitialized */
    898        1.1    nonaka 	uint32_t tmp;
    899        1.1    nonaka 	int ntries, error;
    900        1.1    nonaka 
    901        1.1    nonaka 	/* RT3071/RT3072 use a different firmware */
    902        1.1    nonaka 	if (sc->mac_ver != 0x2860 &&
    903        1.1    nonaka 	    sc->mac_ver != 0x2872 &&
    904        1.1    nonaka 	    sc->mac_ver != 0x3070)
    905        1.1    nonaka 		fwname = "run-rt3071";
    906        1.1    nonaka 	else
    907        1.1    nonaka 		fwname = "run-rt2870";
    908        1.1    nonaka 
    909        1.3    nonaka 	if ((error = firmware_load("run", fwname, &ucode, &size)) != 0) {
    910        1.1    nonaka 		aprint_error_dev(sc->sc_dev,
    911        1.1    nonaka 		    "error %d, could not read firmware %s\n", error, fwname);
    912   1.10.6.2     skrll 		return error;
    913        1.1    nonaka 	}
    914        1.1    nonaka 	if (size != 4096) {
    915        1.1    nonaka 		aprint_error_dev(sc->sc_dev,
    916        1.1    nonaka 		    "invalid firmware size (should be 4KB)\n");
    917        1.1    nonaka 		firmware_free(ucode, size);
    918   1.10.6.2     skrll 		return EINVAL;
    919        1.1    nonaka 	}
    920        1.1    nonaka 
    921        1.1    nonaka 	run_read(sc, RT2860_ASIC_VER_ID, &tmp);
    922        1.1    nonaka 	/* write microcode image */
    923        1.1    nonaka 	run_write_region_1(sc, RT2870_FW_BASE, ucode, size);
    924        1.1    nonaka 	firmware_free(ucode, size);
    925        1.1    nonaka 	run_write(sc, RT2860_H2M_MAILBOX_CID, 0xffffffff);
    926        1.1    nonaka 	run_write(sc, RT2860_H2M_MAILBOX_STATUS, 0xffffffff);
    927        1.1    nonaka 
    928        1.1    nonaka 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
    929        1.1    nonaka 	req.bRequest = RT2870_RESET;
    930        1.1    nonaka 	USETW(req.wValue, 8);
    931        1.1    nonaka 	USETW(req.wIndex, 0);
    932        1.1    nonaka 	USETW(req.wLength, 0);
    933        1.1    nonaka 	if ((error = usbd_do_request(sc->sc_udev, &req, NULL)) != 0)
    934   1.10.6.2     skrll 		return error;
    935        1.1    nonaka 
    936        1.1    nonaka 	usbd_delay_ms(sc->sc_udev, 10);
    937        1.1    nonaka 	run_write(sc, RT2860_H2M_MAILBOX, 0);
    938        1.1    nonaka 	if ((error = run_mcu_cmd(sc, RT2860_MCU_CMD_RFRESET, 0)) != 0)
    939   1.10.6.2     skrll 		return error;
    940        1.1    nonaka 
    941        1.1    nonaka 	/* wait until microcontroller is ready */
    942        1.1    nonaka 	for (ntries = 0; ntries < 1000; ntries++) {
    943        1.1    nonaka 		if ((error = run_read(sc, RT2860_SYS_CTRL, &tmp)) != 0)
    944   1.10.6.2     skrll 			return error;
    945        1.1    nonaka 		if (tmp & RT2860_MCU_READY)
    946        1.1    nonaka 			break;
    947  1.10.6.11     skrll 		usbd_delay_ms(sc->sc_udev, 10);
    948        1.1    nonaka 	}
    949        1.1    nonaka 	if (ntries == 1000) {
    950        1.1    nonaka 		aprint_error_dev(sc->sc_dev,
    951        1.1    nonaka 		    "timeout waiting for MCU to initialize\n");
    952   1.10.6.2     skrll 		return ETIMEDOUT;
    953        1.1    nonaka 	}
    954        1.1    nonaka 
    955        1.1    nonaka 	sc->sc_flags |= RUN_FWLOADED;
    956        1.1    nonaka 
    957        1.1    nonaka 	DPRINTF(("microcode successfully loaded after %d tries\n", ntries));
    958   1.10.6.2     skrll 	return 0;
    959        1.1    nonaka }
    960        1.1    nonaka 
    961        1.1    nonaka static int
    962        1.1    nonaka run_reset(struct run_softc *sc)
    963        1.1    nonaka {
    964        1.1    nonaka 	usb_device_request_t req;
    965        1.1    nonaka 
    966        1.1    nonaka 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
    967        1.1    nonaka 	req.bRequest = RT2870_RESET;
    968        1.1    nonaka 	USETW(req.wValue, 1);
    969        1.1    nonaka 	USETW(req.wIndex, 0);
    970        1.1    nonaka 	USETW(req.wLength, 0);
    971        1.1    nonaka 	return usbd_do_request(sc->sc_udev, &req, NULL);
    972        1.1    nonaka }
    973        1.1    nonaka 
    974        1.1    nonaka static int
    975        1.1    nonaka run_read(struct run_softc *sc, uint16_t reg, uint32_t *val)
    976        1.1    nonaka {
    977        1.1    nonaka 	uint32_t tmp;
    978        1.1    nonaka 	int error;
    979        1.1    nonaka 
    980   1.10.6.6     skrll 	error = run_read_region_1(sc, reg, (uint8_t *)&tmp, sizeof(tmp));
    981        1.1    nonaka 	if (error == 0)
    982        1.1    nonaka 		*val = le32toh(tmp);
    983        1.1    nonaka 	else
    984        1.1    nonaka 		*val = 0xffffffff;
    985   1.10.6.2     skrll 	return error;
    986        1.1    nonaka }
    987        1.1    nonaka 
    988        1.1    nonaka static int
    989        1.1    nonaka run_read_region_1(struct run_softc *sc, uint16_t reg, uint8_t *buf, int len)
    990        1.1    nonaka {
    991        1.1    nonaka 	usb_device_request_t req;
    992        1.1    nonaka 
    993        1.1    nonaka 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
    994        1.1    nonaka 	req.bRequest = RT2870_READ_REGION_1;
    995        1.1    nonaka 	USETW(req.wValue, 0);
    996        1.1    nonaka 	USETW(req.wIndex, reg);
    997        1.1    nonaka 	USETW(req.wLength, len);
    998        1.1    nonaka 	return usbd_do_request(sc->sc_udev, &req, buf);
    999        1.1    nonaka }
   1000        1.1    nonaka 
   1001        1.1    nonaka static int
   1002        1.1    nonaka run_write_2(struct run_softc *sc, uint16_t reg, uint16_t val)
   1003        1.1    nonaka {
   1004        1.1    nonaka 	usb_device_request_t req;
   1005        1.1    nonaka 
   1006        1.1    nonaka 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
   1007        1.1    nonaka 	req.bRequest = RT2870_WRITE_2;
   1008        1.1    nonaka 	USETW(req.wValue, val);
   1009        1.1    nonaka 	USETW(req.wIndex, reg);
   1010        1.1    nonaka 	USETW(req.wLength, 0);
   1011        1.1    nonaka 	return usbd_do_request(sc->sc_udev, &req, NULL);
   1012        1.1    nonaka }
   1013        1.1    nonaka 
   1014        1.1    nonaka static int
   1015        1.1    nonaka run_write(struct run_softc *sc, uint16_t reg, uint32_t val)
   1016        1.1    nonaka {
   1017        1.1    nonaka 	int error;
   1018        1.1    nonaka 
   1019        1.1    nonaka 	if ((error = run_write_2(sc, reg, val & 0xffff)) == 0)
   1020        1.1    nonaka 		error = run_write_2(sc, reg + 2, val >> 16);
   1021   1.10.6.2     skrll 	return error;
   1022        1.1    nonaka }
   1023        1.1    nonaka 
   1024        1.1    nonaka static int
   1025        1.1    nonaka run_write_region_1(struct run_softc *sc, uint16_t reg, const uint8_t *buf,
   1026        1.1    nonaka     int len)
   1027        1.1    nonaka {
   1028        1.1    nonaka #if 1
   1029        1.1    nonaka 	int i, error = 0;
   1030        1.1    nonaka 	/*
   1031        1.1    nonaka 	 * NB: the WRITE_REGION_1 command is not stable on RT2860.
   1032        1.1    nonaka 	 * We thus issue multiple WRITE_2 commands instead.
   1033        1.1    nonaka 	 */
   1034        1.1    nonaka 	KASSERT((len & 1) == 0);
   1035        1.1    nonaka 	for (i = 0; i < len && error == 0; i += 2)
   1036        1.1    nonaka 		error = run_write_2(sc, reg + i, buf[i] | buf[i + 1] << 8);
   1037   1.10.6.2     skrll 	return error;
   1038        1.1    nonaka #else
   1039        1.1    nonaka 	usb_device_request_t req;
   1040        1.1    nonaka 
   1041        1.1    nonaka 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
   1042        1.1    nonaka 	req.bRequest = RT2870_WRITE_REGION_1;
   1043        1.1    nonaka 	USETW(req.wValue, 0);
   1044        1.1    nonaka 	USETW(req.wIndex, reg);
   1045        1.1    nonaka 	USETW(req.wLength, len);
   1046        1.1    nonaka 	return usbd_do_request(sc->sc_udev, &req, buf);
   1047        1.1    nonaka #endif
   1048        1.1    nonaka }
   1049        1.1    nonaka 
   1050        1.1    nonaka static int
   1051        1.1    nonaka run_set_region_4(struct run_softc *sc, uint16_t reg, uint32_t val, int count)
   1052        1.1    nonaka {
   1053        1.1    nonaka 	int error = 0;
   1054        1.1    nonaka 
   1055        1.1    nonaka 	for (; count > 0 && error == 0; count--, reg += 4)
   1056        1.1    nonaka 		error = run_write(sc, reg, val);
   1057   1.10.6.2     skrll 	return error;
   1058        1.1    nonaka }
   1059        1.1    nonaka 
   1060        1.1    nonaka static int
   1061  1.10.6.11     skrll run_efuse_read(struct run_softc *sc, uint16_t addr, uint16_t *val, int count)
   1062        1.1    nonaka {
   1063        1.1    nonaka 	uint32_t tmp;
   1064        1.1    nonaka 	uint16_t reg;
   1065        1.1    nonaka 	int error, ntries;
   1066        1.1    nonaka 
   1067        1.1    nonaka 	if ((error = run_read(sc, RT3070_EFUSE_CTRL, &tmp)) != 0)
   1068   1.10.6.2     skrll 		return error;
   1069        1.1    nonaka 
   1070  1.10.6.11     skrll 	if (count == 2)
   1071  1.10.6.11     skrll 		addr *= 2;
   1072        1.1    nonaka 	/*-
   1073        1.1    nonaka 	 * Read one 16-byte block into registers EFUSE_DATA[0-3]:
   1074        1.1    nonaka 	 * DATA0: F E D C
   1075        1.1    nonaka 	 * DATA1: B A 9 8
   1076        1.1    nonaka 	 * DATA2: 7 6 5 4
   1077        1.1    nonaka 	 * DATA3: 3 2 1 0
   1078        1.1    nonaka 	 */
   1079        1.1    nonaka 	tmp &= ~(RT3070_EFSROM_MODE_MASK | RT3070_EFSROM_AIN_MASK);
   1080        1.1    nonaka 	tmp |= (addr & ~0xf) << RT3070_EFSROM_AIN_SHIFT | RT3070_EFSROM_KICK;
   1081        1.1    nonaka 	run_write(sc, RT3070_EFUSE_CTRL, tmp);
   1082        1.1    nonaka 	for (ntries = 0; ntries < 100; ntries++) {
   1083        1.1    nonaka 		if ((error = run_read(sc, RT3070_EFUSE_CTRL, &tmp)) != 0)
   1084   1.10.6.2     skrll 			return error;
   1085        1.1    nonaka 		if (!(tmp & RT3070_EFSROM_KICK))
   1086        1.1    nonaka 			break;
   1087  1.10.6.11     skrll 		usbd_delay_ms(sc->sc_udev, 2);
   1088        1.1    nonaka 	}
   1089        1.1    nonaka 	if (ntries == 100)
   1090   1.10.6.2     skrll 		return ETIMEDOUT;
   1091        1.1    nonaka 
   1092        1.1    nonaka 	if ((tmp & RT3070_EFUSE_AOUT_MASK) == RT3070_EFUSE_AOUT_MASK) {
   1093        1.1    nonaka 		*val = 0xffff;	/* address not found */
   1094   1.10.6.2     skrll 		return 0;
   1095        1.1    nonaka 	}
   1096        1.1    nonaka 	/* determine to which 32-bit register our 16-bit word belongs */
   1097        1.1    nonaka 	reg = RT3070_EFUSE_DATA3 - (addr & 0xc);
   1098        1.1    nonaka 	if ((error = run_read(sc, reg, &tmp)) != 0)
   1099   1.10.6.2     skrll 		return error;
   1100        1.1    nonaka 
   1101  1.10.6.11     skrll 	*val = (addr & 1) ? tmp >> 16 : tmp & 0xffff;
   1102   1.10.6.2     skrll 	return 0;
   1103        1.1    nonaka }
   1104        1.1    nonaka 
   1105  1.10.6.11     skrll /* Read 16-bit from eFUSE ROM for RT3xxxx. */
   1106  1.10.6.11     skrll static int
   1107  1.10.6.11     skrll run_efuse_read_2(struct run_softc *sc, uint16_t addr, uint16_t *val)
   1108  1.10.6.11     skrll {
   1109  1.10.6.11     skrll 	return (run_efuse_read(sc, addr, val, 2));
   1110  1.10.6.11     skrll }
   1111  1.10.6.11     skrll 
   1112        1.1    nonaka static int
   1113        1.1    nonaka run_eeprom_read_2(struct run_softc *sc, uint16_t addr, uint16_t *val)
   1114        1.1    nonaka {
   1115        1.1    nonaka 	usb_device_request_t req;
   1116        1.1    nonaka 	uint16_t tmp;
   1117        1.1    nonaka 	int error;
   1118        1.1    nonaka 
   1119        1.1    nonaka 	addr *= 2;
   1120        1.1    nonaka 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
   1121        1.1    nonaka 	req.bRequest = RT2870_EEPROM_READ;
   1122        1.1    nonaka 	USETW(req.wValue, 0);
   1123        1.1    nonaka 	USETW(req.wIndex, addr);
   1124   1.10.6.6     skrll 	USETW(req.wLength, sizeof(tmp));
   1125        1.1    nonaka 	error = usbd_do_request(sc->sc_udev, &req, &tmp);
   1126        1.1    nonaka 	if (error == 0)
   1127        1.1    nonaka 		*val = le16toh(tmp);
   1128        1.1    nonaka 	else
   1129        1.1    nonaka 		*val = 0xffff;
   1130   1.10.6.2     skrll 	return error;
   1131        1.1    nonaka }
   1132        1.1    nonaka 
   1133        1.1    nonaka static __inline int
   1134        1.1    nonaka run_srom_read(struct run_softc *sc, uint16_t addr, uint16_t *val)
   1135        1.1    nonaka {
   1136        1.1    nonaka 
   1137        1.1    nonaka 	/* either eFUSE ROM or EEPROM */
   1138        1.1    nonaka 	return sc->sc_srom_read(sc, addr, val);
   1139        1.1    nonaka }
   1140        1.1    nonaka 
   1141        1.1    nonaka static int
   1142        1.1    nonaka run_rt2870_rf_write(struct run_softc *sc, uint8_t reg, uint32_t val)
   1143        1.1    nonaka {
   1144        1.1    nonaka 	uint32_t tmp;
   1145        1.1    nonaka 	int error, ntries;
   1146        1.1    nonaka 
   1147        1.1    nonaka 	for (ntries = 0; ntries < 10; ntries++) {
   1148        1.1    nonaka 		if ((error = run_read(sc, RT2860_RF_CSR_CFG0, &tmp)) != 0)
   1149   1.10.6.2     skrll 			return error;
   1150        1.1    nonaka 		if (!(tmp & RT2860_RF_REG_CTRL))
   1151        1.1    nonaka 			break;
   1152        1.1    nonaka 	}
   1153        1.1    nonaka 	if (ntries == 10)
   1154   1.10.6.2     skrll 		return ETIMEDOUT;
   1155        1.1    nonaka 
   1156        1.1    nonaka 	/* RF registers are 24-bit on the RT2860 */
   1157        1.1    nonaka 	tmp = RT2860_RF_REG_CTRL | 24 << RT2860_RF_REG_WIDTH_SHIFT |
   1158        1.1    nonaka 	    (val & 0x3fffff) << 2 | (reg & 3);
   1159        1.1    nonaka 	return run_write(sc, RT2860_RF_CSR_CFG0, tmp);
   1160        1.1    nonaka }
   1161        1.1    nonaka 
   1162        1.1    nonaka static int
   1163        1.1    nonaka run_rt3070_rf_read(struct run_softc *sc, uint8_t reg, uint8_t *val)
   1164        1.1    nonaka {
   1165        1.1    nonaka 	uint32_t tmp;
   1166        1.1    nonaka 	int error, ntries;
   1167        1.1    nonaka 
   1168        1.1    nonaka 	for (ntries = 0; ntries < 100; ntries++) {
   1169        1.1    nonaka 		if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0)
   1170   1.10.6.2     skrll 			return error;
   1171        1.1    nonaka 		if (!(tmp & RT3070_RF_KICK))
   1172        1.1    nonaka 			break;
   1173        1.1    nonaka 	}
   1174        1.1    nonaka 	if (ntries == 100)
   1175   1.10.6.2     skrll 		return ETIMEDOUT;
   1176        1.1    nonaka 
   1177        1.1    nonaka 	tmp = RT3070_RF_KICK | reg << 8;
   1178        1.1    nonaka 	if ((error = run_write(sc, RT3070_RF_CSR_CFG, tmp)) != 0)
   1179   1.10.6.2     skrll 		return error;
   1180        1.1    nonaka 
   1181        1.1    nonaka 	for (ntries = 0; ntries < 100; ntries++) {
   1182        1.1    nonaka 		if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0)
   1183   1.10.6.2     skrll 			return error;
   1184        1.1    nonaka 		if (!(tmp & RT3070_RF_KICK))
   1185        1.1    nonaka 			break;
   1186        1.1    nonaka 	}
   1187        1.1    nonaka 	if (ntries == 100)
   1188   1.10.6.2     skrll 		return ETIMEDOUT;
   1189        1.1    nonaka 
   1190        1.1    nonaka 	*val = tmp & 0xff;
   1191   1.10.6.2     skrll 	return 0;
   1192        1.1    nonaka }
   1193        1.1    nonaka 
   1194        1.1    nonaka static int
   1195        1.1    nonaka run_rt3070_rf_write(struct run_softc *sc, uint8_t reg, uint8_t val)
   1196        1.1    nonaka {
   1197        1.1    nonaka 	uint32_t tmp;
   1198        1.1    nonaka 	int error, ntries;
   1199        1.1    nonaka 
   1200        1.1    nonaka 	for (ntries = 0; ntries < 10; ntries++) {
   1201        1.1    nonaka 		if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0)
   1202   1.10.6.2     skrll 			return error;
   1203        1.1    nonaka 		if (!(tmp & RT3070_RF_KICK))
   1204        1.1    nonaka 			break;
   1205        1.1    nonaka 	}
   1206        1.1    nonaka 	if (ntries == 10)
   1207   1.10.6.2     skrll 		return ETIMEDOUT;
   1208        1.1    nonaka 
   1209        1.1    nonaka 	tmp = RT3070_RF_WRITE | RT3070_RF_KICK | reg << 8 | val;
   1210        1.1    nonaka 	return run_write(sc, RT3070_RF_CSR_CFG, tmp);
   1211        1.1    nonaka }
   1212        1.1    nonaka 
   1213        1.1    nonaka static int
   1214        1.1    nonaka run_bbp_read(struct run_softc *sc, uint8_t reg, uint8_t *val)
   1215        1.1    nonaka {
   1216        1.1    nonaka 	uint32_t tmp;
   1217        1.1    nonaka 	int ntries, error;
   1218        1.1    nonaka 
   1219        1.1    nonaka 	for (ntries = 0; ntries < 10; ntries++) {
   1220        1.1    nonaka 		if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0)
   1221   1.10.6.2     skrll 			return error;
   1222        1.1    nonaka 		if (!(tmp & RT2860_BBP_CSR_KICK))
   1223        1.1    nonaka 			break;
   1224        1.1    nonaka 	}
   1225        1.1    nonaka 	if (ntries == 10)
   1226   1.10.6.2     skrll 		return ETIMEDOUT;
   1227        1.1    nonaka 
   1228        1.1    nonaka 	tmp = RT2860_BBP_CSR_READ | RT2860_BBP_CSR_KICK | reg << 8;
   1229        1.1    nonaka 	if ((error = run_write(sc, RT2860_BBP_CSR_CFG, tmp)) != 0)
   1230   1.10.6.2     skrll 		return error;
   1231        1.1    nonaka 
   1232        1.1    nonaka 	for (ntries = 0; ntries < 10; ntries++) {
   1233        1.1    nonaka 		if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0)
   1234   1.10.6.2     skrll 			return error;
   1235        1.1    nonaka 		if (!(tmp & RT2860_BBP_CSR_KICK))
   1236        1.1    nonaka 			break;
   1237        1.1    nonaka 	}
   1238        1.1    nonaka 	if (ntries == 10)
   1239   1.10.6.2     skrll 		return ETIMEDOUT;
   1240        1.1    nonaka 
   1241        1.1    nonaka 	*val = tmp & 0xff;
   1242   1.10.6.2     skrll 	return 0;
   1243        1.1    nonaka }
   1244        1.1    nonaka 
   1245        1.1    nonaka static int
   1246        1.1    nonaka run_bbp_write(struct run_softc *sc, uint8_t reg, uint8_t val)
   1247        1.1    nonaka {
   1248        1.1    nonaka 	uint32_t tmp;
   1249        1.1    nonaka 	int ntries, error;
   1250        1.1    nonaka 
   1251        1.1    nonaka 	for (ntries = 0; ntries < 10; ntries++) {
   1252        1.1    nonaka 		if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0)
   1253   1.10.6.2     skrll 			return error;
   1254        1.1    nonaka 		if (!(tmp & RT2860_BBP_CSR_KICK))
   1255        1.1    nonaka 			break;
   1256        1.1    nonaka 	}
   1257        1.1    nonaka 	if (ntries == 10)
   1258   1.10.6.2     skrll 		return ETIMEDOUT;
   1259        1.1    nonaka 
   1260        1.1    nonaka 	tmp = RT2860_BBP_CSR_KICK | reg << 8 | val;
   1261        1.1    nonaka 	return run_write(sc, RT2860_BBP_CSR_CFG, tmp);
   1262        1.1    nonaka }
   1263        1.1    nonaka 
   1264        1.1    nonaka /*
   1265        1.1    nonaka  * Send a command to the 8051 microcontroller unit.
   1266        1.1    nonaka  */
   1267        1.1    nonaka static int
   1268        1.1    nonaka run_mcu_cmd(struct run_softc *sc, uint8_t cmd, uint16_t arg)
   1269        1.1    nonaka {
   1270        1.1    nonaka 	uint32_t tmp;
   1271        1.1    nonaka 	int error, ntries;
   1272        1.1    nonaka 
   1273        1.1    nonaka 	for (ntries = 0; ntries < 100; ntries++) {
   1274        1.1    nonaka 		if ((error = run_read(sc, RT2860_H2M_MAILBOX, &tmp)) != 0)
   1275   1.10.6.2     skrll 			return error;
   1276        1.1    nonaka 		if (!(tmp & RT2860_H2M_BUSY))
   1277        1.1    nonaka 			break;
   1278        1.1    nonaka 	}
   1279        1.1    nonaka 	if (ntries == 100)
   1280   1.10.6.2     skrll 		return ETIMEDOUT;
   1281        1.1    nonaka 
   1282        1.1    nonaka 	tmp = RT2860_H2M_BUSY | RT2860_TOKEN_NO_INTR << 16 | arg;
   1283        1.1    nonaka 	if ((error = run_write(sc, RT2860_H2M_MAILBOX, tmp)) == 0)
   1284        1.1    nonaka 		error = run_write(sc, RT2860_HOST_CMD, cmd);
   1285   1.10.6.2     skrll 	return error;
   1286        1.1    nonaka }
   1287        1.1    nonaka 
   1288        1.1    nonaka /*
   1289        1.1    nonaka  * Add `delta' (signed) to each 4-bit sub-word of a 32-bit word.
   1290        1.1    nonaka  * Used to adjust per-rate Tx power registers.
   1291        1.1    nonaka  */
   1292        1.1    nonaka static __inline uint32_t
   1293        1.1    nonaka b4inc(uint32_t b32, int8_t delta)
   1294        1.1    nonaka {
   1295        1.1    nonaka 	int8_t i, b4;
   1296        1.1    nonaka 
   1297        1.1    nonaka 	for (i = 0; i < 8; i++) {
   1298        1.1    nonaka 		b4 = b32 & 0xf;
   1299        1.1    nonaka 		b4 += delta;
   1300        1.1    nonaka 		if (b4 < 0)
   1301        1.1    nonaka 			b4 = 0;
   1302        1.1    nonaka 		else if (b4 > 0xf)
   1303        1.1    nonaka 			b4 = 0xf;
   1304        1.1    nonaka 		b32 = b32 >> 4 | b4 << 28;
   1305        1.1    nonaka 	}
   1306   1.10.6.2     skrll 	return b32;
   1307        1.1    nonaka }
   1308        1.1    nonaka 
   1309        1.1    nonaka static const char *
   1310        1.1    nonaka run_get_rf(int rev)
   1311        1.1    nonaka {
   1312        1.1    nonaka 	switch (rev) {
   1313        1.1    nonaka 	case RT2860_RF_2820:	return "RT2820";
   1314        1.1    nonaka 	case RT2860_RF_2850:	return "RT2850";
   1315        1.1    nonaka 	case RT2860_RF_2720:	return "RT2720";
   1316        1.1    nonaka 	case RT2860_RF_2750:	return "RT2750";
   1317        1.1    nonaka 	case RT3070_RF_3020:	return "RT3020";
   1318        1.1    nonaka 	case RT3070_RF_2020:	return "RT2020";
   1319        1.1    nonaka 	case RT3070_RF_3021:	return "RT3021";
   1320        1.1    nonaka 	case RT3070_RF_3022:	return "RT3022";
   1321        1.1    nonaka 	case RT3070_RF_3052:	return "RT3052";
   1322  1.10.6.11     skrll 	case RT3070_RF_3053:    return "RT3053";
   1323  1.10.6.11     skrll 	case RT5592_RF_5592:    return "RT5592";
   1324  1.10.6.11     skrll 	case RT5390_RF_5370:    return "RT5370";
   1325  1.10.6.11     skrll 	case RT5390_RF_5372:    return "RT5372";
   1326        1.1    nonaka 	}
   1327        1.1    nonaka 	return "unknown";
   1328        1.1    nonaka }
   1329        1.1    nonaka 
   1330  1.10.6.11     skrll static void
   1331  1.10.6.11     skrll run_rt3593_get_txpower(struct run_softc *sc)
   1332  1.10.6.11     skrll {
   1333  1.10.6.11     skrll 	uint16_t addr, val;
   1334  1.10.6.11     skrll 	int i;
   1335  1.10.6.11     skrll 
   1336  1.10.6.11     skrll 	/* Read power settings for 2GHz channels. */
   1337  1.10.6.11     skrll 	for (i = 0; i < 14; i += 2) {
   1338  1.10.6.11     skrll 		addr = (sc->ntxchains == 3) ? RT3593_EEPROM_PWR2GHZ_BASE1 :
   1339  1.10.6.11     skrll 		    RT2860_EEPROM_PWR2GHZ_BASE1;
   1340  1.10.6.11     skrll 		run_srom_read(sc, addr + i / 2, &val);
   1341  1.10.6.11     skrll 		sc->txpow1[i + 0] = (int8_t)(val & 0xff);
   1342  1.10.6.11     skrll 		sc->txpow1[i + 1] = (int8_t)(val >> 8);
   1343  1.10.6.11     skrll 
   1344  1.10.6.11     skrll 		addr = (sc->ntxchains == 3) ? RT3593_EEPROM_PWR2GHZ_BASE2 :
   1345  1.10.6.11     skrll 		    RT2860_EEPROM_PWR2GHZ_BASE2;
   1346  1.10.6.11     skrll 		run_srom_read(sc, addr + i / 2, &val);
   1347  1.10.6.11     skrll 		sc->txpow2[i + 0] = (int8_t)(val & 0xff);
   1348  1.10.6.11     skrll 		sc->txpow2[i + 1] = (int8_t)(val >> 8);
   1349  1.10.6.11     skrll 
   1350  1.10.6.11     skrll 		if (sc->ntxchains == 3) {
   1351  1.10.6.11     skrll 			run_srom_read(sc, RT3593_EEPROM_PWR2GHZ_BASE3 + i / 2,
   1352  1.10.6.11     skrll 			    &val);
   1353  1.10.6.11     skrll 			sc->txpow3[i + 0] = (int8_t)(val & 0xff);
   1354  1.10.6.11     skrll 			sc->txpow3[i + 1] = (int8_t)(val >> 8);
   1355  1.10.6.11     skrll 		}
   1356  1.10.6.11     skrll 	}
   1357  1.10.6.11     skrll 	/* Fix broken Tx power entries. */
   1358  1.10.6.11     skrll 	for (i = 0; i < 14; i++) {
   1359  1.10.6.11     skrll 		if (sc->txpow1[i] > 31)
   1360  1.10.6.11     skrll 			sc->txpow1[i] = 5;
   1361  1.10.6.11     skrll 		if (sc->txpow2[i] > 31)
   1362  1.10.6.11     skrll 			sc->txpow2[i] = 5;
   1363  1.10.6.11     skrll 		if (sc->ntxchains == 3) {
   1364  1.10.6.11     skrll 			if (sc->txpow3[i] > 31)
   1365  1.10.6.11     skrll 				sc->txpow3[i] = 5;
   1366  1.10.6.11     skrll 		}
   1367  1.10.6.11     skrll 	}
   1368  1.10.6.11     skrll 	/* Read power settings for 5GHz channels. */
   1369  1.10.6.11     skrll 	for (i = 0; i < 40; i += 2) {
   1370  1.10.6.11     skrll 		run_srom_read(sc, RT3593_EEPROM_PWR5GHZ_BASE1 + i / 2, &val);
   1371  1.10.6.11     skrll 		sc->txpow1[i + 14] = (int8_t)(val & 0xff);
   1372  1.10.6.11     skrll 		sc->txpow1[i + 15] = (int8_t)(val >> 8);
   1373  1.10.6.11     skrll 
   1374  1.10.6.11     skrll 		run_srom_read(sc, RT3593_EEPROM_PWR5GHZ_BASE2 + i / 2, &val);
   1375  1.10.6.11     skrll 		sc->txpow2[i + 14] = (int8_t)(val & 0xff);
   1376  1.10.6.11     skrll 		sc->txpow2[i + 15] = (int8_t)(val >> 8);
   1377  1.10.6.11     skrll 
   1378  1.10.6.11     skrll 		if (sc->ntxchains == 3) {
   1379  1.10.6.11     skrll 			run_srom_read(sc, RT3593_EEPROM_PWR5GHZ_BASE3 + i / 2,
   1380  1.10.6.11     skrll 			    &val);
   1381  1.10.6.11     skrll 			sc->txpow3[i + 14] = (int8_t)(val & 0xff);
   1382  1.10.6.11     skrll 			sc->txpow3[i + 15] = (int8_t)(val >> 8);
   1383  1.10.6.11     skrll 		}
   1384  1.10.6.11     skrll 	}
   1385  1.10.6.11     skrll }
   1386  1.10.6.11     skrll 
   1387  1.10.6.11     skrll static void
   1388  1.10.6.11     skrll run_get_txpower(struct run_softc *sc)
   1389  1.10.6.11     skrll {
   1390  1.10.6.11     skrll 	uint16_t val;
   1391  1.10.6.11     skrll 	int i;
   1392  1.10.6.11     skrll 
   1393  1.10.6.11     skrll 	/* Read power settings for 2GHz channels. */
   1394  1.10.6.11     skrll 	for (i = 0; i < 14; i += 2) {
   1395  1.10.6.11     skrll 		run_srom_read(sc, RT2860_EEPROM_PWR2GHZ_BASE1 + i / 2, &val);
   1396  1.10.6.11     skrll 		sc->txpow1[i + 0] = (int8_t)(val & 0xff);
   1397  1.10.6.11     skrll 		sc->txpow1[i + 1] = (int8_t)(val >> 8);
   1398  1.10.6.11     skrll 
   1399  1.10.6.11     skrll 		if (sc->mac_ver != 0x5390) {
   1400  1.10.6.11     skrll 			run_srom_read(sc,
   1401  1.10.6.11     skrll 			    RT2860_EEPROM_PWR2GHZ_BASE2 + i / 2, &val);
   1402  1.10.6.11     skrll 			sc->txpow2[i + 0] = (int8_t)(val & 0xff);
   1403  1.10.6.11     skrll 			sc->txpow2[i + 1] = (int8_t)(val >> 8);
   1404  1.10.6.11     skrll 		}
   1405  1.10.6.11     skrll 	}
   1406  1.10.6.11     skrll 	/* Fix broken Tx power entries. */
   1407  1.10.6.11     skrll 	for (i = 0; i < 14; i++) {
   1408  1.10.6.11     skrll 		if (sc->mac_ver >= 0x5390) {
   1409  1.10.6.11     skrll 			if (sc->txpow1[i] < 0 || sc->txpow1[i] > 39)
   1410  1.10.6.11     skrll 				sc->txpow1[i] = 5;
   1411  1.10.6.11     skrll 		} else {
   1412  1.10.6.11     skrll 			if (sc->txpow1[i] < 0 || sc->txpow1[i] > 31)
   1413  1.10.6.11     skrll 				sc->txpow1[i] = 5;
   1414  1.10.6.11     skrll 		}
   1415  1.10.6.11     skrll 		if (sc->mac_ver > 0x5390) {
   1416  1.10.6.11     skrll 			if (sc->txpow2[i] < 0 || sc->txpow2[i] > 39)
   1417  1.10.6.11     skrll 				sc->txpow2[i] = 5;
   1418  1.10.6.11     skrll 		} else if (sc->mac_ver < 0x5390) {
   1419  1.10.6.11     skrll 			if (sc->txpow2[i] < 0 || sc->txpow2[i] > 31)
   1420  1.10.6.11     skrll 				sc->txpow2[i] = 5;
   1421  1.10.6.11     skrll 		}
   1422  1.10.6.11     skrll 		DPRINTF(("chan %d: power1=%d, power2=%d\n",
   1423  1.10.6.11     skrll 		    rt2860_rf2850[i].chan, sc->txpow1[i], sc->txpow2[i]));
   1424  1.10.6.11     skrll 	}
   1425  1.10.6.11     skrll 	/* Read power settings for 5GHz channels. */
   1426  1.10.6.11     skrll 	for (i = 0; i < 40; i += 2) {
   1427  1.10.6.11     skrll 		run_srom_read(sc, RT2860_EEPROM_PWR5GHZ_BASE1 + i / 2, &val);
   1428  1.10.6.11     skrll 		sc->txpow1[i + 14] = (int8_t)(val & 0xff);
   1429  1.10.6.11     skrll 		sc->txpow1[i + 15] = (int8_t)(val >> 8);
   1430  1.10.6.11     skrll 
   1431  1.10.6.11     skrll 		run_srom_read(sc, RT2860_EEPROM_PWR5GHZ_BASE2 + i / 2, &val);
   1432  1.10.6.11     skrll 		sc->txpow2[i + 14] = (int8_t)(val & 0xff);
   1433  1.10.6.11     skrll 		sc->txpow2[i + 15] = (int8_t)(val >> 8);
   1434  1.10.6.11     skrll 	}
   1435  1.10.6.11     skrll 	/* Fix broken Tx power entries. */
   1436  1.10.6.11     skrll 	for (i = 0; i < 40; i++ ) {
   1437  1.10.6.11     skrll 		if (sc->mac_ver != 0x5592) {
   1438  1.10.6.11     skrll 			if (sc->txpow1[14 + i] < -7 || sc->txpow1[14 + i] > 15)
   1439  1.10.6.11     skrll 				sc->txpow1[14 + i] = 5;
   1440  1.10.6.11     skrll 			if (sc->txpow2[14 + i] < -7 || sc->txpow2[14 + i] > 15)
   1441  1.10.6.11     skrll 				sc->txpow2[14 + i] = 5;
   1442  1.10.6.11     skrll 		}
   1443  1.10.6.11     skrll 		DPRINTF(("chan %d: power1=%d, power2=%d\n",
   1444  1.10.6.11     skrll 		    rt2860_rf2850[14 + i].chan, sc->txpow1[14 + i],
   1445  1.10.6.11     skrll 		    sc->txpow2[14 + i]));
   1446  1.10.6.11     skrll 	}
   1447  1.10.6.11     skrll }
   1448  1.10.6.11     skrll 
   1449        1.1    nonaka static int
   1450        1.1    nonaka run_read_eeprom(struct run_softc *sc)
   1451        1.1    nonaka {
   1452        1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   1453        1.1    nonaka 	int8_t delta_2ghz, delta_5ghz;
   1454        1.1    nonaka 	uint32_t tmp;
   1455        1.1    nonaka 	uint16_t val;
   1456        1.1    nonaka 	int ridx, ant, i;
   1457        1.1    nonaka 
   1458        1.1    nonaka 	/* check whether the ROM is eFUSE ROM or EEPROM */
   1459        1.1    nonaka 	sc->sc_srom_read = run_eeprom_read_2;
   1460        1.1    nonaka 	if (sc->mac_ver >= 0x3070) {
   1461        1.1    nonaka 		run_read(sc, RT3070_EFUSE_CTRL, &tmp);
   1462        1.1    nonaka 		DPRINTF(("EFUSE_CTRL=0x%08x\n", tmp));
   1463        1.1    nonaka 		if (tmp & RT3070_SEL_EFUSE)
   1464        1.1    nonaka 			sc->sc_srom_read = run_efuse_read_2;
   1465        1.1    nonaka 	}
   1466        1.1    nonaka 
   1467        1.1    nonaka 	/* read ROM version */
   1468        1.1    nonaka 	run_srom_read(sc, RT2860_EEPROM_VERSION, &val);
   1469        1.1    nonaka 	DPRINTF(("EEPROM rev=%d, FAE=%d\n", val & 0xff, val >> 8));
   1470        1.1    nonaka 
   1471        1.1    nonaka 	/* read MAC address */
   1472        1.1    nonaka 	run_srom_read(sc, RT2860_EEPROM_MAC01, &val);
   1473        1.1    nonaka 	ic->ic_myaddr[0] = val & 0xff;
   1474        1.1    nonaka 	ic->ic_myaddr[1] = val >> 8;
   1475        1.1    nonaka 	run_srom_read(sc, RT2860_EEPROM_MAC23, &val);
   1476        1.1    nonaka 	ic->ic_myaddr[2] = val & 0xff;
   1477        1.1    nonaka 	ic->ic_myaddr[3] = val >> 8;
   1478        1.1    nonaka 	run_srom_read(sc, RT2860_EEPROM_MAC45, &val);
   1479        1.1    nonaka 	ic->ic_myaddr[4] = val & 0xff;
   1480        1.1    nonaka 	ic->ic_myaddr[5] = val >> 8;
   1481        1.1    nonaka 
   1482        1.1    nonaka 	/* read vendor BBP settings */
   1483        1.1    nonaka 	for (i = 0; i < 10; i++) {
   1484        1.1    nonaka 		run_srom_read(sc, RT2860_EEPROM_BBP_BASE + i, &val);
   1485        1.1    nonaka 		sc->bbp[i].val = val & 0xff;
   1486        1.1    nonaka 		sc->bbp[i].reg = val >> 8;
   1487        1.1    nonaka 		DPRINTF(("BBP%d=0x%02x\n", sc->bbp[i].reg, sc->bbp[i].val));
   1488        1.1    nonaka 	}
   1489  1.10.6.11     skrll 
   1490  1.10.6.11     skrll 	/* read vendor RF settings */
   1491  1.10.6.11     skrll 	for (i = 0; i < 8; i++) {
   1492  1.10.6.11     skrll 		run_srom_read(sc, RT3071_EEPROM_RF_BASE + i, &val);
   1493  1.10.6.11     skrll 		sc->rf[i].val = val & 0xff;
   1494  1.10.6.11     skrll 		sc->rf[i].reg = val >> 8;
   1495  1.10.6.11     skrll 		DPRINTF(("RF%d=0x%02x\n", sc->rf[i].reg,
   1496  1.10.6.11     skrll 		    sc->rf[i].val));
   1497        1.1    nonaka 	}
   1498        1.1    nonaka 
   1499        1.1    nonaka 	/* read RF frequency offset from EEPROM */
   1500        1.1    nonaka 	run_srom_read(sc, RT2860_EEPROM_FREQ_LEDS, &val);
   1501        1.1    nonaka 	sc->freq = ((val & 0xff) != 0xff) ? val & 0xff : 0;
   1502        1.1    nonaka 	DPRINTF(("EEPROM freq offset %d\n", sc->freq & 0xff));
   1503        1.1    nonaka 
   1504        1.1    nonaka 	if ((val >> 8) != 0xff) {
   1505        1.1    nonaka 		/* read LEDs operating mode */
   1506        1.1    nonaka 		sc->leds = val >> 8;
   1507        1.1    nonaka 		run_srom_read(sc, RT2860_EEPROM_LED1, &sc->led[0]);
   1508        1.1    nonaka 		run_srom_read(sc, RT2860_EEPROM_LED2, &sc->led[1]);
   1509        1.1    nonaka 		run_srom_read(sc, RT2860_EEPROM_LED3, &sc->led[2]);
   1510        1.1    nonaka 	} else {
   1511        1.1    nonaka 		/* broken EEPROM, use default settings */
   1512        1.1    nonaka 		sc->leds = 0x01;
   1513        1.1    nonaka 		sc->led[0] = 0x5555;
   1514        1.1    nonaka 		sc->led[1] = 0x2221;
   1515        1.1    nonaka 		sc->led[2] = 0x5627;	/* differs from RT2860 */
   1516        1.1    nonaka 	}
   1517        1.1    nonaka 	DPRINTF(("EEPROM LED mode=0x%02x, LEDs=0x%04x/0x%04x/0x%04x\n",
   1518        1.1    nonaka 	    sc->leds, sc->led[0], sc->led[1], sc->led[2]));
   1519        1.1    nonaka 
   1520        1.1    nonaka 	/* read RF information */
   1521        1.1    nonaka 	run_srom_read(sc, RT2860_EEPROM_ANTENNA, &val);
   1522        1.1    nonaka 	if (val == 0xffff) {
   1523        1.1    nonaka 		DPRINTF(("invalid EEPROM antenna info, using default\n"));
   1524        1.1    nonaka 		if (sc->mac_ver == 0x3572) {
   1525        1.1    nonaka 			/* default to RF3052 2T2R */
   1526        1.1    nonaka 			sc->rf_rev = RT3070_RF_3052;
   1527        1.1    nonaka 			sc->ntxchains = 2;
   1528        1.1    nonaka 			sc->nrxchains = 2;
   1529        1.1    nonaka 		} else if (sc->mac_ver >= 0x3070) {
   1530        1.1    nonaka 			/* default to RF3020 1T1R */
   1531        1.1    nonaka 			sc->rf_rev = RT3070_RF_3020;
   1532        1.1    nonaka 			sc->ntxchains = 1;
   1533        1.1    nonaka 			sc->nrxchains = 1;
   1534        1.1    nonaka 		} else {
   1535        1.1    nonaka 			/* default to RF2820 1T2R */
   1536        1.1    nonaka 			sc->rf_rev = RT2860_RF_2820;
   1537        1.1    nonaka 			sc->ntxchains = 1;
   1538        1.1    nonaka 			sc->nrxchains = 2;
   1539        1.1    nonaka 		}
   1540        1.1    nonaka 	} else {
   1541        1.1    nonaka 		sc->rf_rev = (val >> 8) & 0xf;
   1542        1.1    nonaka 		sc->ntxchains = (val >> 4) & 0xf;
   1543        1.1    nonaka 		sc->nrxchains = val & 0xf;
   1544        1.1    nonaka 	}
   1545        1.1    nonaka 	DPRINTF(("EEPROM RF rev=0x%02x chains=%dT%dR\n",
   1546        1.1    nonaka 	    sc->rf_rev, sc->ntxchains, sc->nrxchains));
   1547        1.1    nonaka 
   1548        1.1    nonaka 	run_srom_read(sc, RT2860_EEPROM_CONFIG, &val);
   1549        1.1    nonaka 	DPRINTF(("EEPROM CFG 0x%04x\n", val));
   1550        1.1    nonaka 	/* check if driver should patch the DAC issue */
   1551        1.1    nonaka 	if ((val >> 8) != 0xff)
   1552        1.1    nonaka 		sc->patch_dac = (val >> 15) & 1;
   1553        1.1    nonaka 	if ((val & 0xff) != 0xff) {
   1554        1.1    nonaka 		sc->ext_5ghz_lna = (val >> 3) & 1;
   1555        1.1    nonaka 		sc->ext_2ghz_lna = (val >> 2) & 1;
   1556        1.1    nonaka 		/* check if RF supports automatic Tx access gain control */
   1557        1.1    nonaka 		sc->calib_2ghz = sc->calib_5ghz = (val >> 1) & 1;
   1558        1.1    nonaka 		/* check if we have a hardware radio switch */
   1559        1.1    nonaka 		sc->rfswitch = val & 1;
   1560        1.1    nonaka 	}
   1561        1.1    nonaka 
   1562  1.10.6.11     skrll 	/* Read Tx power settings. */
   1563  1.10.6.11     skrll 	if (sc->mac_ver == 0x3593)
   1564  1.10.6.11     skrll 		run_rt3593_get_txpower(sc);
   1565  1.10.6.11     skrll 	else
   1566  1.10.6.11     skrll 		run_get_txpower(sc);
   1567        1.1    nonaka 
   1568        1.1    nonaka 	/* read Tx power compensation for each Tx rate */
   1569        1.1    nonaka 	run_srom_read(sc, RT2860_EEPROM_DELTAPWR, &val);
   1570        1.1    nonaka 	delta_2ghz = delta_5ghz = 0;
   1571        1.1    nonaka 	if ((val & 0xff) != 0xff && (val & 0x80)) {
   1572        1.1    nonaka 		delta_2ghz = val & 0xf;
   1573        1.1    nonaka 		if (!(val & 0x40))	/* negative number */
   1574        1.1    nonaka 			delta_2ghz = -delta_2ghz;
   1575        1.1    nonaka 	}
   1576        1.1    nonaka 	val >>= 8;
   1577        1.1    nonaka 	if ((val & 0xff) != 0xff && (val & 0x80)) {
   1578        1.1    nonaka 		delta_5ghz = val & 0xf;
   1579        1.1    nonaka 		if (!(val & 0x40))	/* negative number */
   1580        1.1    nonaka 			delta_5ghz = -delta_5ghz;
   1581        1.1    nonaka 	}
   1582        1.1    nonaka 	DPRINTF(("power compensation=%d (2GHz), %d (5GHz)\n",
   1583        1.1    nonaka 	    delta_2ghz, delta_5ghz));
   1584        1.1    nonaka 
   1585        1.1    nonaka 	for (ridx = 0; ridx < 5; ridx++) {
   1586        1.1    nonaka 		uint32_t reg;
   1587        1.1    nonaka 
   1588        1.1    nonaka 		run_srom_read(sc, RT2860_EEPROM_RPWR + ridx * 2, &val);
   1589        1.1    nonaka 		reg = val;
   1590        1.1    nonaka 		run_srom_read(sc, RT2860_EEPROM_RPWR + ridx * 2 + 1, &val);
   1591        1.1    nonaka 		reg |= (uint32_t)val << 16;
   1592        1.1    nonaka 
   1593        1.1    nonaka 		sc->txpow20mhz[ridx] = reg;
   1594        1.1    nonaka 		sc->txpow40mhz_2ghz[ridx] = b4inc(reg, delta_2ghz);
   1595        1.1    nonaka 		sc->txpow40mhz_5ghz[ridx] = b4inc(reg, delta_5ghz);
   1596        1.1    nonaka 
   1597        1.1    nonaka 		DPRINTF(("ridx %d: power 20MHz=0x%08x, 40MHz/2GHz=0x%08x, "
   1598        1.1    nonaka 		    "40MHz/5GHz=0x%08x\n", ridx, sc->txpow20mhz[ridx],
   1599        1.1    nonaka 		    sc->txpow40mhz_2ghz[ridx], sc->txpow40mhz_5ghz[ridx]));
   1600        1.1    nonaka 	}
   1601        1.1    nonaka 
   1602        1.1    nonaka 	/* read RSSI offsets and LNA gains from EEPROM */
   1603        1.1    nonaka 	run_srom_read(sc, RT2860_EEPROM_RSSI1_2GHZ, &val);
   1604        1.1    nonaka 	sc->rssi_2ghz[0] = val & 0xff;	/* Ant A */
   1605        1.1    nonaka 	sc->rssi_2ghz[1] = val >> 8;	/* Ant B */
   1606        1.1    nonaka 	run_srom_read(sc, RT2860_EEPROM_RSSI2_2GHZ, &val);
   1607        1.1    nonaka 	if (sc->mac_ver >= 0x3070) {
   1608  1.10.6.11     skrll 		if (sc->mac_ver == 0x3593) {
   1609  1.10.6.11     skrll 			sc->txmixgain_2ghz = 0;
   1610  1.10.6.11     skrll 			sc->rssi_2ghz[2] = val & 0xff; 	/* Ant C */
   1611  1.10.6.11     skrll 		} else {
   1612  1.10.6.11     skrll 			/*
   1613  1.10.6.11     skrll 			 * On RT3070 chips (limited to 2 Rx chains), this ROM
   1614  1.10.6.11     skrll 			 * field contains the Tx mixer gain for the 2GHz band.
   1615  1.10.6.11     skrll 			 */
   1616  1.10.6.11     skrll 			if ((val & 0xff) != 0xff)
   1617  1.10.6.11     skrll 				sc->txmixgain_2ghz = val & 0x7;
   1618  1.10.6.11     skrll 		}
   1619        1.1    nonaka 		DPRINTF(("tx mixer gain=%u (2GHz)\n", sc->txmixgain_2ghz));
   1620        1.1    nonaka 	} else {
   1621        1.1    nonaka 		sc->rssi_2ghz[2] = val & 0xff;	/* Ant C */
   1622        1.1    nonaka 	}
   1623  1.10.6.11     skrll 	if (sc->mac_ver == 0x3593)
   1624  1.10.6.11     skrll 		run_srom_read(sc, RT3593_EEPROM_LNA_5GHZ, &val);
   1625        1.1    nonaka 	sc->lna[2] = val >> 8;		/* channel group 2 */
   1626        1.1    nonaka 
   1627  1.10.6.11     skrll 	run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI1_5GHZ :
   1628  1.10.6.11     skrll 	    RT3593_EEPROM_RSSI2_5GHZ, &val);
   1629        1.1    nonaka 	sc->rssi_5ghz[0] = val & 0xff;	/* Ant A */
   1630        1.1    nonaka 	sc->rssi_5ghz[1] = val >> 8;	/* Ant B */
   1631  1.10.6.11     skrll 	run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI2_5GHZ :
   1632  1.10.6.11     skrll 	    RT3593_EEPROM_RSSI2_5GHZ, &val);
   1633        1.1    nonaka 	if (sc->mac_ver == 0x3572) {
   1634        1.1    nonaka 		/*
   1635        1.1    nonaka 		 * On RT3572 chips (limited to 2 Rx chains), this ROM
   1636        1.1    nonaka 		 * field contains the Tx mixer gain for the 5GHz band.
   1637        1.1    nonaka 		 */
   1638        1.1    nonaka 		if ((val & 0xff) != 0xff)
   1639        1.1    nonaka 			sc->txmixgain_5ghz = val & 0x7;
   1640        1.1    nonaka 		DPRINTF(("tx mixer gain=%u (5GHz)\n", sc->txmixgain_5ghz));
   1641        1.1    nonaka 	} else {
   1642        1.1    nonaka 		sc->rssi_5ghz[2] = val & 0xff;	/* Ant C */
   1643        1.1    nonaka 	}
   1644  1.10.6.11     skrll 	if (sc->mac_ver == 0x3593) {
   1645  1.10.6.11     skrll 		sc->txmixgain_5ghz = 0;
   1646  1.10.6.11     skrll 		run_srom_read(sc, RT3593_EEPROM_LNA_5GHZ, &val);
   1647  1.10.6.11     skrll 	}
   1648        1.1    nonaka 	sc->lna[3] = val >> 8;		/* channel group 3 */
   1649        1.1    nonaka 
   1650  1.10.6.11     skrll 	run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_LNA :
   1651  1.10.6.11     skrll 	    RT3593_EEPROM_LNA, &val);
   1652        1.1    nonaka 	sc->lna[0] = val & 0xff;	/* channel group 0 */
   1653        1.1    nonaka 	sc->lna[1] = val >> 8;		/* channel group 1 */
   1654        1.1    nonaka 
   1655        1.1    nonaka 	/* fix broken 5GHz LNA entries */
   1656        1.1    nonaka 	if (sc->lna[2] == 0 || sc->lna[2] == 0xff) {
   1657        1.1    nonaka 		DPRINTF(("invalid LNA for channel group %d\n", 2));
   1658        1.1    nonaka 		sc->lna[2] = sc->lna[1];
   1659        1.1    nonaka 	}
   1660        1.1    nonaka 	if (sc->lna[3] == 0 || sc->lna[3] == 0xff) {
   1661        1.1    nonaka 		DPRINTF(("invalid LNA for channel group %d\n", 3));
   1662        1.1    nonaka 		sc->lna[3] = sc->lna[1];
   1663        1.1    nonaka 	}
   1664        1.1    nonaka 
   1665        1.1    nonaka 	/* fix broken RSSI offset entries */
   1666        1.1    nonaka 	for (ant = 0; ant < 3; ant++) {
   1667        1.1    nonaka 		if (sc->rssi_2ghz[ant] < -10 || sc->rssi_2ghz[ant] > 10) {
   1668        1.1    nonaka 			DPRINTF(("invalid RSSI%d offset: %d (2GHz)\n",
   1669        1.1    nonaka 			    ant + 1, sc->rssi_2ghz[ant]));
   1670        1.1    nonaka 			sc->rssi_2ghz[ant] = 0;
   1671        1.1    nonaka 		}
   1672        1.1    nonaka 		if (sc->rssi_5ghz[ant] < -10 || sc->rssi_5ghz[ant] > 10) {
   1673        1.1    nonaka 			DPRINTF(("invalid RSSI%d offset: %d (5GHz)\n",
   1674        1.1    nonaka 			    ant + 1, sc->rssi_5ghz[ant]));
   1675        1.1    nonaka 			sc->rssi_5ghz[ant] = 0;
   1676        1.1    nonaka 		}
   1677        1.1    nonaka 	}
   1678   1.10.6.2     skrll 	return 0;
   1679        1.1    nonaka }
   1680        1.1    nonaka 
   1681        1.1    nonaka static struct ieee80211_node *
   1682        1.1    nonaka run_node_alloc(struct ieee80211_node_table *nt)
   1683        1.1    nonaka {
   1684        1.1    nonaka 	struct run_node *rn =
   1685   1.10.6.6     skrll 	    malloc(sizeof(struct run_node), M_DEVBUF, M_NOWAIT | M_ZERO);
   1686   1.10.6.2     skrll 	return rn ? &rn->ni : NULL;
   1687        1.1    nonaka }
   1688        1.1    nonaka 
   1689        1.1    nonaka static int
   1690        1.1    nonaka run_media_change(struct ifnet *ifp)
   1691        1.1    nonaka {
   1692        1.1    nonaka 	struct run_softc *sc = ifp->if_softc;
   1693        1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   1694        1.1    nonaka 	uint8_t rate, ridx;
   1695        1.1    nonaka 	int error;
   1696        1.1    nonaka 
   1697        1.1    nonaka 	error = ieee80211_media_change(ifp);
   1698        1.1    nonaka 	if (error != ENETRESET)
   1699   1.10.6.2     skrll 		return error;
   1700        1.1    nonaka 
   1701        1.1    nonaka 	if (ic->ic_fixed_rate != IEEE80211_FIXED_RATE_NONE) {
   1702        1.1    nonaka 		rate = ic->ic_sup_rates[ic->ic_curmode].
   1703        1.1    nonaka 		    rs_rates[ic->ic_fixed_rate] & IEEE80211_RATE_VAL;
   1704        1.1    nonaka 		for (ridx = 0; ridx <= RT2860_RIDX_MAX; ridx++)
   1705        1.1    nonaka 			if (rt2860_rates[ridx].rate == rate)
   1706        1.1    nonaka 				break;
   1707        1.1    nonaka 		sc->fixed_ridx = ridx;
   1708        1.1    nonaka 	}
   1709        1.1    nonaka 
   1710        1.1    nonaka 	if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == (IFF_UP | IFF_RUNNING))
   1711        1.1    nonaka 		run_init(ifp);
   1712        1.1    nonaka 
   1713   1.10.6.2     skrll 	return 0;
   1714        1.1    nonaka }
   1715        1.1    nonaka 
   1716        1.1    nonaka static void
   1717        1.1    nonaka run_next_scan(void *arg)
   1718        1.1    nonaka {
   1719        1.1    nonaka 	struct run_softc *sc = arg;
   1720        1.1    nonaka 
   1721        1.1    nonaka 	if (sc->sc_ic.ic_state == IEEE80211_S_SCAN)
   1722        1.1    nonaka 		ieee80211_next_scan(&sc->sc_ic);
   1723        1.1    nonaka }
   1724        1.1    nonaka 
   1725        1.1    nonaka static void
   1726        1.1    nonaka run_task(void *arg)
   1727        1.1    nonaka {
   1728        1.1    nonaka 	struct run_softc *sc = arg;
   1729        1.1    nonaka 	struct run_host_cmd_ring *ring = &sc->cmdq;
   1730        1.1    nonaka 	struct run_host_cmd *cmd;
   1731        1.1    nonaka 	int s;
   1732        1.1    nonaka 
   1733        1.1    nonaka 	/* process host commands */
   1734        1.1    nonaka 	s = splusb();
   1735        1.1    nonaka 	while (ring->next != ring->cur) {
   1736        1.1    nonaka 		cmd = &ring->cmd[ring->next];
   1737        1.1    nonaka 		splx(s);
   1738        1.1    nonaka 		/* callback */
   1739        1.1    nonaka 		cmd->cb(sc, cmd->data);
   1740        1.1    nonaka 		s = splusb();
   1741        1.1    nonaka 		ring->queued--;
   1742        1.1    nonaka 		ring->next = (ring->next + 1) % RUN_HOST_CMD_RING_COUNT;
   1743        1.1    nonaka 	}
   1744        1.1    nonaka 	wakeup(ring);
   1745        1.1    nonaka 	splx(s);
   1746        1.1    nonaka }
   1747        1.1    nonaka 
   1748        1.1    nonaka static void
   1749        1.1    nonaka run_do_async(struct run_softc *sc, void (*cb)(struct run_softc *, void *),
   1750        1.1    nonaka     void *arg, int len)
   1751        1.1    nonaka {
   1752        1.1    nonaka 	struct run_host_cmd_ring *ring = &sc->cmdq;
   1753        1.1    nonaka 	struct run_host_cmd *cmd;
   1754        1.1    nonaka 	int s;
   1755        1.1    nonaka 
   1756        1.1    nonaka 	if (sc->sc_flags & RUN_DETACHING)
   1757        1.1    nonaka 		return;
   1758        1.1    nonaka 
   1759        1.1    nonaka 	s = splusb();
   1760        1.1    nonaka 	cmd = &ring->cmd[ring->cur];
   1761        1.1    nonaka 	cmd->cb = cb;
   1762   1.10.6.6     skrll 	KASSERT(len <= sizeof(cmd->data));
   1763        1.1    nonaka 	memcpy(cmd->data, arg, len);
   1764        1.1    nonaka 	ring->cur = (ring->cur + 1) % RUN_HOST_CMD_RING_COUNT;
   1765        1.1    nonaka 
   1766        1.1    nonaka 	/* if there is no pending command already, schedule a task */
   1767        1.1    nonaka 	if (++ring->queued == 1)
   1768        1.1    nonaka 		usb_add_task(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER);
   1769        1.1    nonaka 	splx(s);
   1770        1.1    nonaka }
   1771        1.1    nonaka 
   1772        1.1    nonaka static int
   1773        1.1    nonaka run_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
   1774        1.1    nonaka {
   1775        1.1    nonaka 	struct run_softc *sc = ic->ic_ifp->if_softc;
   1776        1.1    nonaka 	struct run_cmd_newstate cmd;
   1777        1.1    nonaka 
   1778        1.1    nonaka 	callout_stop(&sc->scan_to);
   1779        1.1    nonaka 	callout_stop(&sc->calib_to);
   1780        1.1    nonaka 
   1781        1.1    nonaka 	/* do it in a process context */
   1782        1.1    nonaka 	cmd.state = nstate;
   1783        1.1    nonaka 	cmd.arg = arg;
   1784   1.10.6.6     skrll 	run_do_async(sc, run_newstate_cb, &cmd, sizeof(cmd));
   1785   1.10.6.2     skrll 	return 0;
   1786        1.1    nonaka }
   1787        1.1    nonaka 
   1788        1.1    nonaka static void
   1789        1.1    nonaka run_newstate_cb(struct run_softc *sc, void *arg)
   1790        1.1    nonaka {
   1791        1.1    nonaka 	struct run_cmd_newstate *cmd = arg;
   1792        1.1    nonaka 	struct ifnet *ifp = &sc->sc_if;
   1793        1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   1794        1.1    nonaka 	enum ieee80211_state ostate;
   1795        1.1    nonaka 	struct ieee80211_node *ni;
   1796        1.1    nonaka 	uint32_t tmp, sta[3];
   1797        1.1    nonaka 	uint8_t wcid;
   1798        1.1    nonaka 	int s;
   1799        1.1    nonaka 
   1800        1.1    nonaka 	s = splnet();
   1801        1.1    nonaka 	ostate = ic->ic_state;
   1802        1.1    nonaka 
   1803        1.1    nonaka 	if (ostate == IEEE80211_S_RUN) {
   1804        1.1    nonaka 		/* turn link LED off */
   1805        1.1    nonaka 		run_set_leds(sc, RT2860_LED_RADIO);
   1806        1.1    nonaka 	}
   1807        1.1    nonaka 
   1808        1.1    nonaka 	switch (cmd->state) {
   1809        1.1    nonaka 	case IEEE80211_S_INIT:
   1810        1.1    nonaka 		if (ostate == IEEE80211_S_RUN) {
   1811        1.1    nonaka 			/* abort TSF synchronization */
   1812        1.1    nonaka 			run_read(sc, RT2860_BCN_TIME_CFG, &tmp);
   1813        1.1    nonaka 			run_write(sc, RT2860_BCN_TIME_CFG,
   1814        1.1    nonaka 			    tmp & ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN |
   1815        1.1    nonaka 			    RT2860_TBTT_TIMER_EN));
   1816        1.1    nonaka 		}
   1817        1.1    nonaka 		break;
   1818        1.1    nonaka 
   1819        1.1    nonaka 	case IEEE80211_S_SCAN:
   1820        1.1    nonaka 		run_set_chan(sc, ic->ic_curchan);
   1821        1.1    nonaka 		callout_schedule(&sc->scan_to, hz / 5);
   1822        1.1    nonaka 		break;
   1823        1.1    nonaka 
   1824        1.1    nonaka 	case IEEE80211_S_AUTH:
   1825        1.1    nonaka 	case IEEE80211_S_ASSOC:
   1826        1.1    nonaka 		run_set_chan(sc, ic->ic_curchan);
   1827        1.1    nonaka 		break;
   1828        1.1    nonaka 
   1829        1.1    nonaka 	case IEEE80211_S_RUN:
   1830        1.1    nonaka 		run_set_chan(sc, ic->ic_curchan);
   1831        1.1    nonaka 
   1832        1.1    nonaka 		ni = ic->ic_bss;
   1833        1.1    nonaka 
   1834        1.1    nonaka 		if (ic->ic_opmode != IEEE80211_M_MONITOR) {
   1835        1.1    nonaka 			run_updateslot(ifp);
   1836        1.1    nonaka 			run_enable_mrr(sc);
   1837        1.1    nonaka 			run_set_txpreamble(sc);
   1838        1.1    nonaka 			run_set_basicrates(sc);
   1839        1.1    nonaka 			run_set_bssid(sc, ni->ni_bssid);
   1840        1.1    nonaka 		}
   1841        1.1    nonaka #ifndef IEEE80211_STA_ONLY
   1842        1.1    nonaka 		if (ic->ic_opmode == IEEE80211_M_HOSTAP ||
   1843        1.1    nonaka 		    ic->ic_opmode == IEEE80211_M_IBSS)
   1844        1.1    nonaka 			(void)run_setup_beacon(sc);
   1845        1.1    nonaka #endif
   1846        1.1    nonaka 		if (ic->ic_opmode == IEEE80211_M_STA) {
   1847        1.1    nonaka 			/* add BSS entry to the WCID table */
   1848        1.1    nonaka 			wcid = RUN_AID2WCID(ni->ni_associd);
   1849        1.1    nonaka 			run_write_region_1(sc, RT2860_WCID_ENTRY(wcid),
   1850        1.1    nonaka 			    ni->ni_macaddr, IEEE80211_ADDR_LEN);
   1851        1.1    nonaka 
   1852        1.1    nonaka 			/* fake a join to init the tx rate */
   1853        1.1    nonaka 			run_newassoc(ni, 1);
   1854        1.1    nonaka 		}
   1855        1.1    nonaka 		if (ic->ic_opmode != IEEE80211_M_MONITOR) {
   1856        1.1    nonaka 			run_enable_tsf_sync(sc);
   1857        1.1    nonaka 
   1858        1.1    nonaka 			/* clear statistic registers used by AMRR */
   1859        1.1    nonaka 			run_read_region_1(sc, RT2860_TX_STA_CNT0,
   1860   1.10.6.6     skrll 			    (uint8_t *)sta, sizeof(sta));
   1861        1.1    nonaka 			/* start calibration timer */
   1862        1.1    nonaka 			callout_schedule(&sc->calib_to, hz);
   1863        1.1    nonaka 		}
   1864        1.1    nonaka 
   1865        1.1    nonaka 		/* turn link LED on */
   1866        1.1    nonaka 		run_set_leds(sc, RT2860_LED_RADIO |
   1867        1.1    nonaka 		    (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan) ?
   1868        1.1    nonaka 		     RT2860_LED_LINK_2GHZ : RT2860_LED_LINK_5GHZ));
   1869        1.1    nonaka 		break;
   1870        1.1    nonaka 	}
   1871        1.1    nonaka 	(void)sc->sc_newstate(ic, cmd->state, cmd->arg);
   1872        1.1    nonaka 	splx(s);
   1873        1.1    nonaka }
   1874        1.1    nonaka 
   1875        1.1    nonaka static int
   1876        1.1    nonaka run_updateedca(struct ieee80211com *ic)
   1877        1.1    nonaka {
   1878        1.1    nonaka 
   1879        1.1    nonaka 	/* do it in a process context */
   1880        1.1    nonaka 	run_do_async(ic->ic_ifp->if_softc, run_updateedca_cb, NULL, 0);
   1881   1.10.6.2     skrll 	return 0;
   1882        1.1    nonaka }
   1883        1.1    nonaka 
   1884        1.1    nonaka /* ARGSUSED */
   1885        1.1    nonaka static void
   1886        1.1    nonaka run_updateedca_cb(struct run_softc *sc, void *arg)
   1887        1.1    nonaka {
   1888        1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   1889        1.1    nonaka 	int s, aci;
   1890        1.1    nonaka 
   1891        1.1    nonaka 	s = splnet();
   1892        1.1    nonaka 	/* update MAC TX configuration registers */
   1893        1.1    nonaka 	for (aci = 0; aci < WME_NUM_AC; aci++) {
   1894        1.1    nonaka 		run_write(sc, RT2860_EDCA_AC_CFG(aci),
   1895        1.1    nonaka 		    ic->ic_wme.wme_params[aci].wmep_logcwmax << 16 |
   1896        1.1    nonaka 		    ic->ic_wme.wme_params[aci].wmep_logcwmin << 12 |
   1897        1.1    nonaka 		    ic->ic_wme.wme_params[aci].wmep_aifsn  <<  8 |
   1898        1.1    nonaka 		    ic->ic_wme.wme_params[aci].wmep_txopLimit);
   1899        1.1    nonaka 	}
   1900        1.1    nonaka 
   1901        1.1    nonaka 	/* update SCH/DMA registers too */
   1902        1.1    nonaka 	run_write(sc, RT2860_WMM_AIFSN_CFG,
   1903        1.1    nonaka 	    ic->ic_wme.wme_params[WME_AC_VO].wmep_aifsn  << 12 |
   1904        1.1    nonaka 	    ic->ic_wme.wme_params[WME_AC_VI].wmep_aifsn  <<  8 |
   1905        1.1    nonaka 	    ic->ic_wme.wme_params[WME_AC_BK].wmep_aifsn  <<  4 |
   1906        1.1    nonaka 	    ic->ic_wme.wme_params[WME_AC_BE].wmep_aifsn);
   1907        1.1    nonaka 	run_write(sc, RT2860_WMM_CWMIN_CFG,
   1908        1.1    nonaka 	    ic->ic_wme.wme_params[WME_AC_VO].wmep_logcwmin << 12 |
   1909        1.1    nonaka 	    ic->ic_wme.wme_params[WME_AC_VI].wmep_logcwmin <<  8 |
   1910        1.1    nonaka 	    ic->ic_wme.wme_params[WME_AC_BK].wmep_logcwmin <<  4 |
   1911        1.1    nonaka 	    ic->ic_wme.wme_params[WME_AC_BE].wmep_logcwmin);
   1912        1.1    nonaka 	run_write(sc, RT2860_WMM_CWMAX_CFG,
   1913        1.1    nonaka 	    ic->ic_wme.wme_params[WME_AC_VO].wmep_logcwmax << 12 |
   1914        1.1    nonaka 	    ic->ic_wme.wme_params[WME_AC_VI].wmep_logcwmax <<  8 |
   1915        1.1    nonaka 	    ic->ic_wme.wme_params[WME_AC_BK].wmep_logcwmax <<  4 |
   1916        1.1    nonaka 	    ic->ic_wme.wme_params[WME_AC_BE].wmep_logcwmax);
   1917        1.1    nonaka 	run_write(sc, RT2860_WMM_TXOP0_CFG,
   1918        1.1    nonaka 	    ic->ic_wme.wme_params[WME_AC_BK].wmep_txopLimit << 16 |
   1919        1.1    nonaka 	    ic->ic_wme.wme_params[WME_AC_BE].wmep_txopLimit);
   1920        1.1    nonaka 	run_write(sc, RT2860_WMM_TXOP1_CFG,
   1921        1.1    nonaka 	    ic->ic_wme.wme_params[WME_AC_VO].wmep_txopLimit << 16 |
   1922        1.1    nonaka 	    ic->ic_wme.wme_params[WME_AC_VI].wmep_txopLimit);
   1923        1.1    nonaka 	splx(s);
   1924        1.1    nonaka }
   1925        1.1    nonaka 
   1926        1.1    nonaka #ifdef RUN_HWCRYPTO
   1927        1.1    nonaka static int
   1928        1.1    nonaka run_set_key(struct ieee80211com *ic, const struct ieee80211_key *k,
   1929        1.1    nonaka     const uint8_t *mac)
   1930        1.1    nonaka {
   1931        1.1    nonaka 	struct run_softc *sc = ic->ic_ifp->if_softc;
   1932        1.1    nonaka 	struct ieee80211_node *ni = ic->ic_bss;
   1933        1.1    nonaka 	struct run_cmd_key cmd;
   1934        1.1    nonaka 
   1935        1.1    nonaka 	/* do it in a process context */
   1936        1.1    nonaka 	cmd.key = *k;
   1937        1.1    nonaka 	cmd.associd = (ni != NULL) ? ni->ni_associd : 0;
   1938   1.10.6.6     skrll 	run_do_async(sc, run_set_key_cb, &cmd, sizeof(cmd));
   1939        1.1    nonaka 	return 1;
   1940        1.1    nonaka }
   1941        1.1    nonaka 
   1942        1.1    nonaka static void
   1943        1.1    nonaka run_set_key_cb(struct run_softc *sc, void *arg)
   1944        1.1    nonaka {
   1945        1.1    nonaka #ifndef IEEE80211_STA_ONLY
   1946        1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   1947        1.1    nonaka #endif
   1948        1.1    nonaka 	struct run_cmd_key *cmd = arg;
   1949        1.1    nonaka 	struct ieee80211_key *k = &cmd->key;
   1950        1.1    nonaka 	uint32_t attr;
   1951        1.1    nonaka 	uint16_t base;
   1952        1.1    nonaka 	uint8_t mode, wcid, iv[8];
   1953        1.1    nonaka 
   1954        1.1    nonaka 	/* map net80211 cipher to RT2860 security mode */
   1955        1.1    nonaka 	switch (k->wk_cipher->ic_cipher) {
   1956        1.1    nonaka 	case IEEE80211_CIPHER_WEP:
   1957        1.1    nonaka 		k->wk_flags |= IEEE80211_KEY_GROUP; /* XXX */
   1958        1.1    nonaka 		if (k->wk_keylen == 5)
   1959        1.1    nonaka 			mode = RT2860_MODE_WEP40;
   1960        1.1    nonaka 		else
   1961        1.1    nonaka 			mode = RT2860_MODE_WEP104;
   1962        1.1    nonaka 		break;
   1963        1.1    nonaka 	case IEEE80211_CIPHER_TKIP:
   1964        1.1    nonaka 		mode = RT2860_MODE_TKIP;
   1965        1.1    nonaka 		break;
   1966        1.1    nonaka 	case IEEE80211_CIPHER_AES_CCM:
   1967        1.1    nonaka 		mode = RT2860_MODE_AES_CCMP;
   1968        1.1    nonaka 		break;
   1969        1.1    nonaka 	default:
   1970        1.1    nonaka 		return;
   1971        1.1    nonaka 	}
   1972        1.1    nonaka 
   1973        1.1    nonaka 	if (k->wk_flags & IEEE80211_KEY_GROUP) {
   1974        1.1    nonaka 		wcid = 0;	/* NB: update WCID0 for group keys */
   1975        1.1    nonaka 		base = RT2860_SKEY(0, k->wk_keyix);
   1976        1.1    nonaka 	} else {
   1977        1.1    nonaka 		wcid = RUN_AID2WCID(cmd->associd);
   1978        1.1    nonaka 		base = RT2860_PKEY(wcid);
   1979        1.1    nonaka 	}
   1980        1.1    nonaka 
   1981        1.1    nonaka 	if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_TKIP) {
   1982        1.1    nonaka 		run_write_region_1(sc, base, k->wk_key, 16);
   1983        1.1    nonaka #ifndef IEEE80211_STA_ONLY
   1984        1.1    nonaka 		if (ic->ic_opmode == IEEE80211_M_HOSTAP) {
   1985        1.1    nonaka 			run_write_region_1(sc, base + 16, &k->wk_key[16], 8);
   1986        1.1    nonaka 			run_write_region_1(sc, base + 24, &k->wk_key[24], 8);
   1987        1.1    nonaka 		} else
   1988        1.1    nonaka #endif
   1989        1.1    nonaka 		{
   1990        1.1    nonaka 			run_write_region_1(sc, base + 16, &k->wk_key[24], 8);
   1991        1.1    nonaka 			run_write_region_1(sc, base + 24, &k->wk_key[16], 8);
   1992        1.1    nonaka 		}
   1993        1.1    nonaka 	} else {
   1994        1.1    nonaka 		/* roundup len to 16-bit: XXX fix write_region_1() instead */
   1995        1.1    nonaka 		run_write_region_1(sc, base, k->wk_key,
   1996        1.1    nonaka 		    (k->wk_keylen + 1) & ~1);
   1997        1.1    nonaka 	}
   1998        1.1    nonaka 
   1999        1.1    nonaka 	if (!(k->wk_flags & IEEE80211_KEY_GROUP) ||
   2000        1.1    nonaka 	    (k->wk_flags & IEEE80211_KEY_XMIT)) {
   2001        1.1    nonaka 		/* set initial packet number in IV+EIV */
   2002        1.1    nonaka 		if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_WEP) {
   2003   1.10.6.6     skrll 			memset(iv, 0, sizeof(iv));
   2004        1.1    nonaka 			iv[3] = sc->sc_ic.ic_crypto.cs_def_txkey << 6;
   2005        1.1    nonaka 		} else {
   2006        1.1    nonaka 			if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_TKIP) {
   2007        1.1    nonaka 				iv[0] = k->wk_keytsc >> 8;
   2008        1.1    nonaka 				iv[1] = (iv[0] | 0x20) & 0x7f;
   2009        1.1    nonaka 				iv[2] = k->wk_keytsc;
   2010        1.1    nonaka 			} else /* CCMP */ {
   2011        1.1    nonaka 				iv[0] = k->wk_keytsc;
   2012        1.1    nonaka 				iv[1] = k->wk_keytsc >> 8;
   2013        1.1    nonaka 				iv[2] = 0;
   2014        1.1    nonaka 			}
   2015        1.1    nonaka 			iv[3] = k->wk_keyix << 6 | IEEE80211_WEP_EXTIV;
   2016        1.1    nonaka 			iv[4] = k->wk_keytsc >> 16;
   2017        1.1    nonaka 			iv[5] = k->wk_keytsc >> 24;
   2018        1.1    nonaka 			iv[6] = k->wk_keytsc >> 32;
   2019        1.1    nonaka 			iv[7] = k->wk_keytsc >> 40;
   2020        1.1    nonaka 		}
   2021        1.1    nonaka 		run_write_region_1(sc, RT2860_IVEIV(wcid), iv, 8);
   2022        1.1    nonaka 	}
   2023        1.1    nonaka 
   2024        1.1    nonaka 	if (k->wk_flags & IEEE80211_KEY_GROUP) {
   2025        1.1    nonaka 		/* install group key */
   2026        1.1    nonaka 		run_read(sc, RT2860_SKEY_MODE_0_7, &attr);
   2027        1.1    nonaka 		attr &= ~(0xf << (k->wk_keyix * 4));
   2028        1.1    nonaka 		attr |= mode << (k->wk_keyix * 4);
   2029        1.1    nonaka 		run_write(sc, RT2860_SKEY_MODE_0_7, attr);
   2030        1.1    nonaka 	} else {
   2031        1.1    nonaka 		/* install pairwise key */
   2032        1.1    nonaka 		run_read(sc, RT2860_WCID_ATTR(wcid), &attr);
   2033        1.1    nonaka 		attr = (attr & ~0xf) | (mode << 1) | RT2860_RX_PKEY_EN;
   2034        1.1    nonaka 		run_write(sc, RT2860_WCID_ATTR(wcid), attr);
   2035        1.1    nonaka 	}
   2036        1.1    nonaka }
   2037        1.1    nonaka 
   2038        1.1    nonaka static int
   2039        1.1    nonaka run_delete_key(struct ieee80211com *ic, const struct ieee80211_key *k)
   2040        1.1    nonaka {
   2041        1.1    nonaka 	struct run_softc *sc = ic->ic_ifp->if_softc;
   2042        1.1    nonaka 	struct ieee80211_node *ni = ic->ic_bss;
   2043        1.1    nonaka 	struct run_cmd_key cmd;
   2044        1.1    nonaka 
   2045        1.1    nonaka 	/* do it in a process context */
   2046        1.1    nonaka 	cmd.key = *k;
   2047        1.1    nonaka 	cmd.associd = (ni != NULL) ? ni->ni_associd : 0;
   2048   1.10.6.6     skrll 	run_do_async(sc, run_delete_key_cb, &cmd, sizeof(cmd));
   2049        1.1    nonaka 	return 1;
   2050        1.1    nonaka }
   2051        1.1    nonaka 
   2052        1.1    nonaka static void
   2053        1.1    nonaka run_delete_key_cb(struct run_softc *sc, void *arg)
   2054        1.1    nonaka {
   2055        1.1    nonaka 	struct run_cmd_key *cmd = arg;
   2056        1.1    nonaka 	struct ieee80211_key *k = &cmd->key;
   2057        1.1    nonaka 	uint32_t attr;
   2058        1.1    nonaka 	uint8_t wcid;
   2059        1.1    nonaka 
   2060        1.1    nonaka 	if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_WEP)
   2061        1.1    nonaka 		k->wk_flags |= IEEE80211_KEY_GROUP; /* XXX */
   2062        1.1    nonaka 
   2063        1.1    nonaka 	if (k->wk_flags & IEEE80211_KEY_GROUP) {
   2064        1.1    nonaka 		/* remove group key */
   2065        1.1    nonaka 		run_read(sc, RT2860_SKEY_MODE_0_7, &attr);
   2066        1.1    nonaka 		attr &= ~(0xf << (k->wk_keyix * 4));
   2067        1.1    nonaka 		run_write(sc, RT2860_SKEY_MODE_0_7, attr);
   2068        1.1    nonaka 
   2069        1.1    nonaka 	} else {
   2070        1.1    nonaka 		/* remove pairwise key */
   2071        1.1    nonaka 		wcid = RUN_AID2WCID(cmd->associd);
   2072        1.1    nonaka 		run_read(sc, RT2860_WCID_ATTR(wcid), &attr);
   2073        1.1    nonaka 		attr &= ~0xf;
   2074        1.1    nonaka 		run_write(sc, RT2860_WCID_ATTR(wcid), attr);
   2075        1.1    nonaka 	}
   2076        1.1    nonaka }
   2077        1.1    nonaka #endif
   2078        1.1    nonaka 
   2079        1.1    nonaka static void
   2080        1.1    nonaka run_calibrate_to(void *arg)
   2081        1.1    nonaka {
   2082        1.1    nonaka 
   2083        1.1    nonaka 	/* do it in a process context */
   2084        1.1    nonaka 	run_do_async(arg, run_calibrate_cb, NULL, 0);
   2085        1.1    nonaka 	/* next timeout will be rescheduled in the calibration task */
   2086        1.1    nonaka }
   2087        1.1    nonaka 
   2088        1.1    nonaka /* ARGSUSED */
   2089        1.1    nonaka static void
   2090        1.1    nonaka run_calibrate_cb(struct run_softc *sc, void *arg)
   2091        1.1    nonaka {
   2092        1.1    nonaka 	struct ifnet *ifp = &sc->sc_if;
   2093        1.1    nonaka 	uint32_t sta[3];
   2094        1.1    nonaka 	int s, error;
   2095        1.1    nonaka 
   2096        1.1    nonaka 	/* read statistic counters (clear on read) and update AMRR state */
   2097        1.1    nonaka 	error = run_read_region_1(sc, RT2860_TX_STA_CNT0, (uint8_t *)sta,
   2098   1.10.6.6     skrll 	    sizeof(sta));
   2099        1.1    nonaka 	if (error != 0)
   2100        1.1    nonaka 		goto skip;
   2101        1.1    nonaka 
   2102        1.1    nonaka 	DPRINTF(("retrycnt=%d txcnt=%d failcnt=%d\n",
   2103        1.1    nonaka 	    le32toh(sta[1]) >> 16, le32toh(sta[1]) & 0xffff,
   2104        1.1    nonaka 	    le32toh(sta[0]) & 0xffff));
   2105        1.1    nonaka 
   2106        1.1    nonaka 	s = splnet();
   2107        1.1    nonaka 	/* count failed TX as errors */
   2108        1.1    nonaka 	ifp->if_oerrors += le32toh(sta[0]) & 0xffff;
   2109        1.1    nonaka 
   2110        1.1    nonaka 	sc->amn.amn_retrycnt =
   2111        1.1    nonaka 	    (le32toh(sta[0]) & 0xffff) +	/* failed TX count */
   2112        1.1    nonaka 	    (le32toh(sta[1]) >> 16);		/* TX retransmission count */
   2113        1.1    nonaka 
   2114        1.1    nonaka 	sc->amn.amn_txcnt =
   2115        1.1    nonaka 	    sc->amn.amn_retrycnt +
   2116        1.1    nonaka 	    (le32toh(sta[1]) & 0xffff);		/* successful TX count */
   2117        1.1    nonaka 
   2118        1.1    nonaka 	ieee80211_amrr_choose(&sc->amrr, sc->sc_ic.ic_bss, &sc->amn);
   2119        1.1    nonaka 	splx(s);
   2120        1.1    nonaka 
   2121        1.1    nonaka skip:	callout_schedule(&sc->calib_to, hz);
   2122        1.1    nonaka }
   2123        1.1    nonaka 
   2124        1.1    nonaka static void
   2125        1.1    nonaka run_newassoc(struct ieee80211_node *ni, int isnew)
   2126        1.1    nonaka {
   2127        1.1    nonaka 	struct run_softc *sc = ni->ni_ic->ic_ifp->if_softc;
   2128        1.1    nonaka 	struct run_node *rn = (void *)ni;
   2129        1.1    nonaka 	struct ieee80211_rateset *rs = &ni->ni_rates;
   2130        1.1    nonaka 	uint8_t rate;
   2131        1.1    nonaka 	int ridx, i, j;
   2132        1.1    nonaka 
   2133        1.1    nonaka 	DPRINTF(("new assoc isnew=%d addr=%s\n",
   2134        1.1    nonaka 	    isnew, ether_sprintf(ni->ni_macaddr)));
   2135        1.1    nonaka 
   2136        1.1    nonaka 	ieee80211_amrr_node_init(&sc->amrr, &sc->amn);
   2137        1.1    nonaka 	/* start at lowest available bit-rate, AMRR will raise */
   2138        1.1    nonaka 	ni->ni_txrate = 0;
   2139        1.1    nonaka 
   2140        1.1    nonaka 	for (i = 0; i < rs->rs_nrates; i++) {
   2141        1.1    nonaka 		rate = rs->rs_rates[i] & IEEE80211_RATE_VAL;
   2142        1.1    nonaka 		/* convert 802.11 rate to hardware rate index */
   2143        1.1    nonaka 		for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++)
   2144        1.1    nonaka 			if (rt2860_rates[ridx].rate == rate)
   2145        1.1    nonaka 				break;
   2146        1.1    nonaka 		rn->ridx[i] = ridx;
   2147        1.1    nonaka 		/* determine rate of control response frames */
   2148        1.1    nonaka 		for (j = i; j >= 0; j--) {
   2149        1.1    nonaka 			if ((rs->rs_rates[j] & IEEE80211_RATE_BASIC) &&
   2150        1.1    nonaka 			    rt2860_rates[rn->ridx[i]].phy ==
   2151        1.1    nonaka 			    rt2860_rates[rn->ridx[j]].phy)
   2152        1.1    nonaka 				break;
   2153        1.1    nonaka 		}
   2154        1.1    nonaka 		if (j >= 0) {
   2155        1.1    nonaka 			rn->ctl_ridx[i] = rn->ridx[j];
   2156        1.1    nonaka 		} else {
   2157        1.1    nonaka 			/* no basic rate found, use mandatory one */
   2158        1.1    nonaka 			rn->ctl_ridx[i] = rt2860_rates[ridx].ctl_ridx;
   2159        1.1    nonaka 		}
   2160        1.1    nonaka 		DPRINTF(("rate=0x%02x ridx=%d ctl_ridx=%d\n",
   2161        1.1    nonaka 		    rs->rs_rates[i], rn->ridx[i], rn->ctl_ridx[i]));
   2162        1.1    nonaka 	}
   2163        1.1    nonaka }
   2164        1.1    nonaka 
   2165        1.1    nonaka /*
   2166        1.1    nonaka  * Return the Rx chain with the highest RSSI for a given frame.
   2167        1.1    nonaka  */
   2168        1.1    nonaka static __inline uint8_t
   2169        1.1    nonaka run_maxrssi_chain(struct run_softc *sc, const struct rt2860_rxwi *rxwi)
   2170        1.1    nonaka {
   2171        1.1    nonaka 	uint8_t rxchain = 0;
   2172        1.1    nonaka 
   2173        1.1    nonaka 	if (sc->nrxchains > 1) {
   2174        1.1    nonaka 		if (rxwi->rssi[1] > rxwi->rssi[rxchain])
   2175        1.1    nonaka 			rxchain = 1;
   2176        1.1    nonaka 		if (sc->nrxchains > 2)
   2177        1.1    nonaka 			if (rxwi->rssi[2] > rxwi->rssi[rxchain])
   2178        1.1    nonaka 				rxchain = 2;
   2179        1.1    nonaka 	}
   2180   1.10.6.2     skrll 	return rxchain;
   2181        1.1    nonaka }
   2182        1.1    nonaka 
   2183        1.1    nonaka static void
   2184        1.1    nonaka run_rx_frame(struct run_softc *sc, uint8_t *buf, int dmalen)
   2185        1.1    nonaka {
   2186        1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   2187        1.1    nonaka 	struct ifnet *ifp = &sc->sc_if;
   2188        1.1    nonaka 	struct ieee80211_frame *wh;
   2189        1.1    nonaka 	struct ieee80211_node *ni;
   2190        1.1    nonaka 	struct rt2870_rxd *rxd;
   2191        1.1    nonaka 	struct rt2860_rxwi *rxwi;
   2192        1.1    nonaka 	struct mbuf *m;
   2193        1.1    nonaka 	uint32_t flags;
   2194  1.10.6.11     skrll 	uint16_t len, rxwisize, phy;
   2195        1.1    nonaka 	uint8_t ant, rssi;
   2196        1.1    nonaka 	int s;
   2197        1.1    nonaka #ifdef RUN_HWCRYPTO
   2198        1.1    nonaka 	int decrypted = 0;
   2199        1.1    nonaka #endif
   2200        1.1    nonaka 
   2201        1.1    nonaka 	rxwi = (struct rt2860_rxwi *)buf;
   2202        1.1    nonaka 	len = le16toh(rxwi->len) & 0xfff;
   2203        1.1    nonaka 	if (__predict_false(len > dmalen)) {
   2204        1.1    nonaka 		DPRINTF(("bad RXWI length %u > %u\n", len, dmalen));
   2205        1.1    nonaka 		return;
   2206        1.1    nonaka 	}
   2207        1.1    nonaka 	/* Rx descriptor is located at the end */
   2208        1.1    nonaka 	rxd = (struct rt2870_rxd *)(buf + dmalen);
   2209        1.1    nonaka 	flags = le32toh(rxd->flags);
   2210        1.1    nonaka 
   2211        1.1    nonaka 	if (__predict_false(flags & (RT2860_RX_CRCERR | RT2860_RX_ICVERR))) {
   2212        1.1    nonaka 		ifp->if_ierrors++;
   2213        1.1    nonaka 		return;
   2214        1.1    nonaka 	}
   2215        1.1    nonaka 
   2216  1.10.6.11     skrll 	rxwisize = sizeof(struct rt2860_rxwi);
   2217  1.10.6.11     skrll 	if (sc->mac_ver == 0x5592)
   2218  1.10.6.11     skrll 		rxwisize += sizeof(uint64_t);
   2219  1.10.6.11     skrll 	else if (sc->mac_ver == 0x3593)
   2220  1.10.6.11     skrll 		rxwisize += sizeof(uint32_t);
   2221  1.10.6.11     skrll 
   2222  1.10.6.11     skrll 	wh = (struct ieee80211_frame *)(((uint8_t *)rxwi) + rxwisize);
   2223        1.1    nonaka #ifdef RUN_HWCRYPTO
   2224        1.1    nonaka 	if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
   2225        1.1    nonaka 		wh->i_fc[1] &= ~IEEE80211_FC1_WEP;
   2226        1.1    nonaka 		decrypted = 1;
   2227        1.1    nonaka 	}
   2228        1.1    nonaka #endif
   2229        1.1    nonaka 
   2230        1.1    nonaka 	if (__predict_false((flags & RT2860_RX_MICERR))) {
   2231        1.1    nonaka 		/* report MIC failures to net80211 for TKIP */
   2232        1.1    nonaka 		ieee80211_notify_michael_failure(ic, wh, 0/* XXX */);
   2233        1.1    nonaka 		ifp->if_ierrors++;
   2234        1.1    nonaka 		return;
   2235        1.1    nonaka 	}
   2236        1.1    nonaka 
   2237        1.1    nonaka 	if (flags & RT2860_RX_L2PAD) {
   2238        1.1    nonaka 		u_int hdrlen = ieee80211_hdrspace(ic, wh);
   2239        1.1    nonaka 		ovbcopy(wh, (uint8_t *)wh + 2, hdrlen);
   2240        1.1    nonaka 		wh = (struct ieee80211_frame *)((uint8_t *)wh + 2);
   2241        1.1    nonaka 	}
   2242        1.1    nonaka 
   2243        1.1    nonaka 	/* could use m_devget but net80211 wants contig mgmt frames */
   2244        1.1    nonaka 	MGETHDR(m, M_DONTWAIT, MT_DATA);
   2245        1.1    nonaka 	if (__predict_false(m == NULL)) {
   2246        1.1    nonaka 		ifp->if_ierrors++;
   2247        1.1    nonaka 		return;
   2248        1.1    nonaka 	}
   2249        1.1    nonaka 	if (len > MHLEN) {
   2250        1.1    nonaka 		MCLGET(m, M_DONTWAIT);
   2251        1.1    nonaka 		if (__predict_false(!(m->m_flags & M_EXT))) {
   2252        1.1    nonaka 			ifp->if_ierrors++;
   2253        1.1    nonaka 			m_freem(m);
   2254        1.1    nonaka 			return;
   2255        1.1    nonaka 		}
   2256        1.1    nonaka 	}
   2257        1.1    nonaka 	/* finalize mbuf */
   2258  1.10.6.10     skrll 	m_set_rcvif(m, ifp);
   2259        1.1    nonaka 	memcpy(mtod(m, void *), wh, len);
   2260        1.1    nonaka 	m->m_pkthdr.len = m->m_len = len;
   2261        1.1    nonaka 
   2262        1.1    nonaka 	ant = run_maxrssi_chain(sc, rxwi);
   2263        1.1    nonaka 	rssi = rxwi->rssi[ant];
   2264        1.1    nonaka 
   2265        1.1    nonaka 	if (__predict_false(sc->sc_drvbpf != NULL)) {
   2266        1.1    nonaka 		struct run_rx_radiotap_header *tap = &sc->sc_rxtap;
   2267        1.1    nonaka 
   2268        1.1    nonaka 		tap->wr_flags = 0;
   2269        1.1    nonaka 		tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq);
   2270        1.1    nonaka 		tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
   2271        1.1    nonaka 		tap->wr_antsignal = rssi;
   2272        1.1    nonaka 		tap->wr_antenna = ant;
   2273        1.1    nonaka 		tap->wr_dbm_antsignal = run_rssi2dbm(sc, rssi, ant);
   2274        1.1    nonaka 		tap->wr_rate = 2;	/* in case it can't be found below */
   2275        1.1    nonaka 		phy = le16toh(rxwi->phy);
   2276        1.1    nonaka 		switch (phy & RT2860_PHY_MODE) {
   2277        1.1    nonaka 		case RT2860_PHY_CCK:
   2278        1.1    nonaka 			switch ((phy & RT2860_PHY_MCS) & ~RT2860_PHY_SHPRE) {
   2279        1.1    nonaka 			case 0:	tap->wr_rate =   2; break;
   2280        1.1    nonaka 			case 1:	tap->wr_rate =   4; break;
   2281        1.1    nonaka 			case 2:	tap->wr_rate =  11; break;
   2282        1.1    nonaka 			case 3:	tap->wr_rate =  22; break;
   2283        1.1    nonaka 			}
   2284        1.1    nonaka 			if (phy & RT2860_PHY_SHPRE)
   2285        1.1    nonaka 				tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
   2286        1.1    nonaka 			break;
   2287        1.1    nonaka 		case RT2860_PHY_OFDM:
   2288        1.1    nonaka 			switch (phy & RT2860_PHY_MCS) {
   2289        1.1    nonaka 			case 0:	tap->wr_rate =  12; break;
   2290        1.1    nonaka 			case 1:	tap->wr_rate =  18; break;
   2291        1.1    nonaka 			case 2:	tap->wr_rate =  24; break;
   2292        1.1    nonaka 			case 3:	tap->wr_rate =  36; break;
   2293        1.1    nonaka 			case 4:	tap->wr_rate =  48; break;
   2294        1.1    nonaka 			case 5:	tap->wr_rate =  72; break;
   2295        1.1    nonaka 			case 6:	tap->wr_rate =  96; break;
   2296        1.1    nonaka 			case 7:	tap->wr_rate = 108; break;
   2297        1.1    nonaka 			}
   2298        1.1    nonaka 			break;
   2299        1.1    nonaka 		}
   2300        1.1    nonaka 		bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m);
   2301        1.1    nonaka 	}
   2302        1.1    nonaka 
   2303        1.1    nonaka 	s = splnet();
   2304        1.1    nonaka 	ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh);
   2305        1.1    nonaka #ifdef RUN_HWCRYPTO
   2306        1.1    nonaka 	if (decrypted) {
   2307        1.1    nonaka 		uint32_t icflags = ic->ic_flags;
   2308        1.1    nonaka 
   2309        1.1    nonaka 		ic->ic_flags &= ~IEEE80211_F_DROPUNENC; /* XXX */
   2310        1.1    nonaka 		ieee80211_input(ic, m, ni, rssi, 0);
   2311        1.1    nonaka 		ic->ic_flags = icflags;
   2312        1.1    nonaka 	} else
   2313        1.1    nonaka #endif
   2314        1.1    nonaka 	ieee80211_input(ic, m, ni, rssi, 0);
   2315        1.1    nonaka 
   2316        1.1    nonaka 	/* node is no longer needed */
   2317        1.1    nonaka 	ieee80211_free_node(ni);
   2318        1.1    nonaka 
   2319        1.1    nonaka 	/*
   2320        1.1    nonaka 	 * In HostAP mode, ieee80211_input() will enqueue packets in if_snd
   2321        1.1    nonaka 	 * without calling if_start().
   2322        1.1    nonaka 	 */
   2323        1.1    nonaka 	if (!IFQ_IS_EMPTY(&ifp->if_snd) && !(ifp->if_flags & IFF_OACTIVE))
   2324        1.1    nonaka 		run_start(ifp);
   2325        1.1    nonaka 
   2326        1.1    nonaka 	splx(s);
   2327        1.1    nonaka }
   2328        1.1    nonaka 
   2329        1.1    nonaka static void
   2330   1.10.6.3     skrll run_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status)
   2331        1.1    nonaka {
   2332        1.1    nonaka 	struct run_rx_data *data = priv;
   2333        1.1    nonaka 	struct run_softc *sc = data->sc;
   2334        1.1    nonaka 	uint8_t *buf;
   2335        1.1    nonaka 	uint32_t dmalen;
   2336        1.1    nonaka 	int xferlen;
   2337        1.1    nonaka 
   2338  1.10.6.11     skrll 	if (__predict_false(sc->sc_flags & RUN_DETACHING))
   2339  1.10.6.11     skrll 		return;
   2340  1.10.6.11     skrll 
   2341        1.1    nonaka 	if (__predict_false(status != USBD_NORMAL_COMPLETION)) {
   2342        1.1    nonaka 		DPRINTF(("RX status=%d\n", status));
   2343        1.1    nonaka 		if (status == USBD_STALLED)
   2344        1.1    nonaka 			usbd_clear_endpoint_stall_async(sc->rxq.pipeh);
   2345        1.1    nonaka 		if (status != USBD_CANCELLED)
   2346        1.1    nonaka 			goto skip;
   2347        1.1    nonaka 		return;
   2348        1.1    nonaka 	}
   2349        1.1    nonaka 	usbd_get_xfer_status(xfer, NULL, NULL, &xferlen, NULL);
   2350        1.1    nonaka 
   2351        1.1    nonaka 	if (__predict_false(xferlen < (int)(sizeof(uint32_t) +
   2352        1.1    nonaka 	    sizeof(struct rt2860_rxwi) + sizeof(struct rt2870_rxd)))) {
   2353        1.1    nonaka 		DPRINTF(("xfer too short %d\n", xferlen));
   2354        1.1    nonaka 		goto skip;
   2355        1.1    nonaka 	}
   2356        1.1    nonaka 
   2357        1.1    nonaka 	/* HW can aggregate multiple 802.11 frames in a single USB xfer */
   2358        1.1    nonaka 	buf = data->buf;
   2359        1.1    nonaka 	while (xferlen > 8) {
   2360        1.1    nonaka 		dmalen = le32toh(*(uint32_t *)buf) & 0xffff;
   2361        1.1    nonaka 
   2362  1.10.6.11     skrll 		if (__predict_false((dmalen >= (uint32_t)-8) || dmalen == 0 ||
   2363  1.10.6.11     skrll 		    (dmalen & 3) != 0)) {
   2364        1.1    nonaka 			DPRINTF(("bad DMA length %u (%x)\n", dmalen, dmalen));
   2365        1.1    nonaka 			break;
   2366        1.1    nonaka 		}
   2367        1.1    nonaka 		if (__predict_false(dmalen + 8 > (uint32_t)xferlen)) {
   2368        1.1    nonaka 			DPRINTF(("bad DMA length %u > %d\n",
   2369        1.1    nonaka 			    dmalen + 8, xferlen));
   2370        1.1    nonaka 			break;
   2371        1.1    nonaka 		}
   2372   1.10.6.6     skrll 		run_rx_frame(sc, buf + sizeof(uint32_t), dmalen);
   2373        1.1    nonaka 		buf += dmalen + 8;
   2374        1.1    nonaka 		xferlen -= dmalen + 8;
   2375        1.1    nonaka 	}
   2376        1.1    nonaka 
   2377        1.1    nonaka skip:	/* setup a new transfer */
   2378   1.10.6.7     skrll 	usbd_setup_xfer(xfer, data, data->buf, RUN_MAX_RXSZ,
   2379   1.10.6.1     skrll 	    USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, run_rxeof);
   2380  1.10.6.11     skrll 	(void)usbd_transfer(xfer);
   2381        1.1    nonaka }
   2382        1.1    nonaka 
   2383        1.1    nonaka static void
   2384   1.10.6.3     skrll run_txeof(struct usbd_xfer *xfer, void *priv, usbd_status status)
   2385        1.1    nonaka {
   2386        1.1    nonaka 	struct run_tx_data *data = priv;
   2387        1.1    nonaka 	struct run_softc *sc = data->sc;
   2388        1.1    nonaka 	struct run_tx_ring *txq = &sc->txq[data->qid];
   2389        1.1    nonaka 	struct ifnet *ifp = &sc->sc_if;
   2390        1.1    nonaka 	int s;
   2391        1.1    nonaka 
   2392        1.1    nonaka 	if (__predict_false(status != USBD_NORMAL_COMPLETION)) {
   2393        1.1    nonaka 		DPRINTF(("TX status=%d\n", status));
   2394        1.1    nonaka 		if (status == USBD_STALLED)
   2395        1.1    nonaka 			usbd_clear_endpoint_stall_async(txq->pipeh);
   2396        1.1    nonaka 		ifp->if_oerrors++;
   2397        1.1    nonaka 		return;
   2398        1.1    nonaka 	}
   2399        1.1    nonaka 
   2400        1.1    nonaka 	s = splnet();
   2401        1.1    nonaka 	sc->sc_tx_timer = 0;
   2402        1.1    nonaka 	ifp->if_opackets++;
   2403        1.1    nonaka 	if (--txq->queued < RUN_TX_RING_COUNT) {
   2404        1.1    nonaka 		sc->qfullmsk &= ~(1 << data->qid);
   2405        1.1    nonaka 		ifp->if_flags &= ~IFF_OACTIVE;
   2406        1.1    nonaka 		run_start(ifp);
   2407        1.1    nonaka 	}
   2408        1.1    nonaka 	splx(s);
   2409        1.1    nonaka }
   2410        1.1    nonaka 
   2411        1.1    nonaka static int
   2412        1.1    nonaka run_tx(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
   2413        1.1    nonaka {
   2414        1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   2415        1.1    nonaka 	struct run_node *rn = (void *)ni;
   2416        1.1    nonaka 	struct ieee80211_frame *wh;
   2417        1.1    nonaka #ifndef RUN_HWCRYPTO
   2418        1.1    nonaka 	struct ieee80211_key *k;
   2419        1.1    nonaka #endif
   2420        1.1    nonaka 	struct run_tx_ring *ring;
   2421        1.1    nonaka 	struct run_tx_data *data;
   2422        1.1    nonaka 	struct rt2870_txd *txd;
   2423        1.1    nonaka 	struct rt2860_txwi *txwi;
   2424  1.10.6.11     skrll 	uint16_t dur, mcs;
   2425  1.10.6.11     skrll 	uint8_t type, tid, qid, qos = 0;
   2426  1.10.6.11     skrll 	int error, hasqos, ridx, ctl_ridx, xferlen, txwisize;
   2427  1.10.6.11     skrll 	uint8_t pad;
   2428        1.1    nonaka 
   2429        1.1    nonaka 	wh = mtod(m, struct ieee80211_frame *);
   2430        1.1    nonaka 
   2431        1.1    nonaka #ifndef RUN_HWCRYPTO
   2432        1.1    nonaka 	if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
   2433        1.1    nonaka 		k = ieee80211_crypto_encap(ic, ni, m);
   2434        1.1    nonaka 		if (k == NULL) {
   2435        1.1    nonaka 			m_freem(m);
   2436   1.10.6.2     skrll 			return ENOBUFS;
   2437        1.1    nonaka 		}
   2438        1.1    nonaka 
   2439        1.1    nonaka 		/* packet header may have moved, reset our local pointer */
   2440        1.1    nonaka 		wh = mtod(m, struct ieee80211_frame *);
   2441        1.1    nonaka 	}
   2442        1.1    nonaka #endif
   2443        1.1    nonaka 	type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
   2444        1.1    nonaka 
   2445        1.9  christos 	if ((hasqos = ieee80211_has_qos(wh))) {
   2446        1.1    nonaka 		qos = ((struct ieee80211_qosframe *)wh)->i_qos[0];
   2447        1.1    nonaka 		tid = qos & IEEE80211_QOS_TID;
   2448        1.1    nonaka 		qid = TID_TO_WME_AC(tid);
   2449        1.1    nonaka 	} else {
   2450        1.1    nonaka 		tid = 0;
   2451        1.1    nonaka 		qid = WME_AC_BE;
   2452        1.1    nonaka 	}
   2453        1.1    nonaka 	ring = &sc->txq[qid];
   2454        1.1    nonaka 	data = &ring->data[ring->cur];
   2455        1.1    nonaka 
   2456        1.1    nonaka 	/* pickup a rate index */
   2457        1.1    nonaka 	if (IEEE80211_IS_MULTICAST(wh->i_addr1) ||
   2458        1.1    nonaka 	    type != IEEE80211_FC0_TYPE_DATA) {
   2459        1.1    nonaka 		ridx = (ic->ic_curmode == IEEE80211_MODE_11A) ?
   2460        1.1    nonaka 		    RT2860_RIDX_OFDM6 : RT2860_RIDX_CCK1;
   2461        1.1    nonaka 		ctl_ridx = rt2860_rates[ridx].ctl_ridx;
   2462        1.1    nonaka 	} else if (ic->ic_fixed_rate != IEEE80211_FIXED_RATE_NONE) {
   2463        1.1    nonaka 		ridx = sc->fixed_ridx;
   2464        1.1    nonaka 		ctl_ridx = rt2860_rates[ridx].ctl_ridx;
   2465        1.1    nonaka 	} else {
   2466        1.1    nonaka 		ridx = rn->ridx[ni->ni_txrate];
   2467        1.1    nonaka 		ctl_ridx = rn->ctl_ridx[ni->ni_txrate];
   2468        1.1    nonaka 	}
   2469        1.1    nonaka 
   2470        1.1    nonaka 	/* get MCS code from rate index */
   2471        1.1    nonaka 	mcs = rt2860_rates[ridx].mcs;
   2472        1.1    nonaka 
   2473  1.10.6.11     skrll 	txwisize = (sc->mac_ver == 0x5592) ?
   2474  1.10.6.11     skrll 	    sizeof(*txwi) + sizeof(uint32_t) : sizeof(*txwi);
   2475  1.10.6.11     skrll 	xferlen = txwisize + m->m_pkthdr.len;
   2476        1.1    nonaka 	/* roundup to 32-bit alignment */
   2477        1.1    nonaka 	xferlen = (xferlen + 3) & ~3;
   2478        1.1    nonaka 
   2479        1.1    nonaka 	txd = (struct rt2870_txd *)data->buf;
   2480        1.1    nonaka 	txd->flags = RT2860_TX_QSEL_EDCA;
   2481        1.1    nonaka 	txd->len = htole16(xferlen);
   2482        1.1    nonaka 
   2483  1.10.6.11     skrll 	/*
   2484  1.10.6.11     skrll 	 * Ether both are true or both are false, the header
   2485  1.10.6.11     skrll 	 * are nicely aligned to 32-bit. So, no L2 padding.
   2486  1.10.6.11     skrll 	 */
   2487  1.10.6.11     skrll 	if (IEEE80211_HAS_ADDR4(wh) == IEEE80211_QOS_HAS_SEQ(wh))
   2488  1.10.6.11     skrll 		pad = 0;
   2489  1.10.6.11     skrll 	else
   2490  1.10.6.11     skrll 		pad = 2;
   2491  1.10.6.11     skrll 
   2492        1.1    nonaka 	/* setup TX Wireless Information */
   2493        1.1    nonaka 	txwi = (struct rt2860_txwi *)(txd + 1);
   2494        1.1    nonaka 	txwi->flags = 0;
   2495        1.1    nonaka 	txwi->xflags = hasqos ? 0 : RT2860_TX_NSEQ;
   2496        1.1    nonaka 	txwi->wcid = (type == IEEE80211_FC0_TYPE_DATA) ?
   2497        1.1    nonaka 	    RUN_AID2WCID(ni->ni_associd) : 0xff;
   2498  1.10.6.11     skrll 	txwi->len = htole16(m->m_pkthdr.len - pad);
   2499        1.1    nonaka 	if (rt2860_rates[ridx].phy == IEEE80211_T_DS) {
   2500        1.1    nonaka 		txwi->phy = htole16(RT2860_PHY_CCK);
   2501        1.1    nonaka 		if (ridx != RT2860_RIDX_CCK1 &&
   2502        1.1    nonaka 		    (ic->ic_flags & IEEE80211_F_SHPREAMBLE))
   2503        1.1    nonaka 			mcs |= RT2860_PHY_SHPRE;
   2504        1.1    nonaka 	} else
   2505  1.10.6.11     skrll 		mcs |= RT2860_PHY_OFDM;
   2506        1.1    nonaka 	txwi->phy |= htole16(mcs);
   2507        1.1    nonaka 
   2508        1.1    nonaka 	txwi->txop = RT2860_TX_TXOP_BACKOFF;
   2509        1.1    nonaka 
   2510        1.1    nonaka 	if (!IEEE80211_IS_MULTICAST(wh->i_addr1) &&
   2511        1.1    nonaka 	    (!hasqos || (qos & IEEE80211_QOS_ACKPOLICY) !=
   2512        1.1    nonaka 	    IEEE80211_QOS_ACKPOLICY_NOACK)) {
   2513        1.1    nonaka 		txwi->xflags |= RT2860_TX_ACK;
   2514        1.1    nonaka 		if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
   2515        1.1    nonaka 			dur = rt2860_rates[ctl_ridx].sp_ack_dur;
   2516        1.1    nonaka 		else
   2517        1.1    nonaka 			dur = rt2860_rates[ctl_ridx].lp_ack_dur;
   2518        1.1    nonaka 		*(uint16_t *)wh->i_dur = htole16(dur);
   2519        1.1    nonaka 	}
   2520        1.1    nonaka 
   2521        1.1    nonaka #ifndef IEEE80211_STA_ONLY
   2522        1.1    nonaka 	/* ask MAC to insert timestamp into probe responses */
   2523        1.1    nonaka 	if ((wh->i_fc[0] &
   2524        1.1    nonaka 	    (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) ==
   2525        1.1    nonaka 	    (IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_RESP))
   2526        1.1    nonaka 	    /* NOTE: beacons do not pass through tx_data() */
   2527        1.1    nonaka 		txwi->flags |= RT2860_TX_TS;
   2528        1.1    nonaka #endif
   2529        1.1    nonaka 
   2530        1.1    nonaka 	if (__predict_false(sc->sc_drvbpf != NULL)) {
   2531        1.1    nonaka 		struct run_tx_radiotap_header *tap = &sc->sc_txtap;
   2532        1.1    nonaka 
   2533        1.1    nonaka 		tap->wt_flags = 0;
   2534        1.1    nonaka 		tap->wt_rate = rt2860_rates[ridx].rate;
   2535        1.1    nonaka 		tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq);
   2536        1.1    nonaka 		tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags);
   2537        1.1    nonaka 		tap->wt_hwqueue = qid;
   2538        1.1    nonaka 		if (mcs & RT2860_PHY_SHPRE)
   2539        1.1    nonaka 			tap->wt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
   2540        1.1    nonaka 
   2541        1.1    nonaka 		bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m);
   2542        1.1    nonaka 	}
   2543        1.1    nonaka 
   2544  1.10.6.11     skrll 	m_copydata(m, 0, m->m_pkthdr.len, ((uint8_t *)txwi) + txwisize);
   2545        1.1    nonaka 	m_freem(m);
   2546        1.1    nonaka 
   2547   1.10.6.6     skrll 	xferlen += sizeof(*txd) + 4;
   2548        1.1    nonaka 
   2549   1.10.6.7     skrll 	usbd_setup_xfer(data->xfer, data, data->buf, xferlen,
   2550   1.10.6.1     skrll 	    USBD_FORCE_SHORT_XFER, RUN_TX_TIMEOUT, run_txeof);
   2551        1.1    nonaka 	error = usbd_transfer(data->xfer);
   2552        1.1    nonaka 	if (__predict_false(error != USBD_IN_PROGRESS &&
   2553        1.1    nonaka 	    error != USBD_NORMAL_COMPLETION))
   2554   1.10.6.2     skrll 		return error;
   2555        1.1    nonaka 
   2556        1.1    nonaka 	ieee80211_free_node(ni);
   2557        1.1    nonaka 
   2558        1.1    nonaka 	ring->cur = (ring->cur + 1) % RUN_TX_RING_COUNT;
   2559        1.1    nonaka 	if (++ring->queued >= RUN_TX_RING_COUNT)
   2560        1.1    nonaka 		sc->qfullmsk |= 1 << qid;
   2561        1.1    nonaka 
   2562   1.10.6.2     skrll 	return 0;
   2563        1.1    nonaka }
   2564        1.1    nonaka 
   2565        1.1    nonaka static void
   2566        1.1    nonaka run_start(struct ifnet *ifp)
   2567        1.1    nonaka {
   2568        1.1    nonaka 	struct run_softc *sc = ifp->if_softc;
   2569        1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   2570        1.1    nonaka 	struct ether_header *eh;
   2571        1.1    nonaka 	struct ieee80211_node *ni;
   2572        1.1    nonaka 	struct mbuf *m;
   2573        1.1    nonaka 
   2574        1.1    nonaka 	if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
   2575        1.1    nonaka 		return;
   2576        1.1    nonaka 
   2577        1.1    nonaka 	for (;;) {
   2578        1.1    nonaka 		if (sc->qfullmsk != 0) {
   2579        1.1    nonaka 			ifp->if_flags |= IFF_OACTIVE;
   2580        1.1    nonaka 			break;
   2581        1.1    nonaka 		}
   2582        1.1    nonaka 		/* send pending management frames first */
   2583        1.1    nonaka 		IF_DEQUEUE(&ic->ic_mgtq, m);
   2584        1.1    nonaka 		if (m != NULL) {
   2585   1.10.6.9     skrll 			ni = M_GETCTX(m, struct ieee80211_node *);
   2586   1.10.6.9     skrll 			M_CLEARCTX(m);
   2587        1.1    nonaka 			goto sendit;
   2588        1.1    nonaka 		}
   2589        1.1    nonaka 		if (ic->ic_state != IEEE80211_S_RUN)
   2590        1.1    nonaka 			break;
   2591        1.1    nonaka 
   2592        1.1    nonaka 		/* encapsulate and send data frames */
   2593        1.1    nonaka 		IFQ_DEQUEUE(&ifp->if_snd, m);
   2594        1.1    nonaka 		if (m == NULL)
   2595        1.1    nonaka 			break;
   2596        1.1    nonaka 		if (m->m_len < (int)sizeof(*eh) &&
   2597        1.1    nonaka 		    (m = m_pullup(m, sizeof(*eh))) == NULL) {
   2598        1.1    nonaka 			ifp->if_oerrors++;
   2599        1.1    nonaka 			continue;
   2600        1.1    nonaka 		}
   2601        1.1    nonaka 
   2602        1.1    nonaka 		eh = mtod(m, struct ether_header *);
   2603        1.1    nonaka 		ni = ieee80211_find_txnode(ic, eh->ether_dhost);
   2604        1.1    nonaka 		if (ni == NULL) {
   2605        1.1    nonaka 			m_freem(m);
   2606        1.1    nonaka 			ifp->if_oerrors++;
   2607        1.1    nonaka 			continue;
   2608        1.1    nonaka 		}
   2609        1.1    nonaka 
   2610        1.1    nonaka 		bpf_mtap(ifp, m);
   2611        1.1    nonaka 
   2612        1.1    nonaka 		if ((m = ieee80211_encap(ic, m, ni)) == NULL) {
   2613        1.1    nonaka 			ieee80211_free_node(ni);
   2614        1.1    nonaka 			ifp->if_oerrors++;
   2615        1.1    nonaka 			continue;
   2616        1.1    nonaka 		}
   2617        1.1    nonaka sendit:
   2618        1.1    nonaka 		bpf_mtap3(ic->ic_rawbpf, m);
   2619        1.1    nonaka 
   2620        1.1    nonaka 		if (run_tx(sc, m, ni) != 0) {
   2621        1.1    nonaka 			ieee80211_free_node(ni);
   2622        1.1    nonaka 			ifp->if_oerrors++;
   2623        1.1    nonaka 			continue;
   2624        1.1    nonaka 		}
   2625        1.1    nonaka 
   2626        1.1    nonaka 		sc->sc_tx_timer = 5;
   2627        1.1    nonaka 		ifp->if_timer = 1;
   2628        1.1    nonaka 	}
   2629        1.1    nonaka }
   2630        1.1    nonaka 
   2631        1.1    nonaka static void
   2632        1.1    nonaka run_watchdog(struct ifnet *ifp)
   2633        1.1    nonaka {
   2634        1.1    nonaka 	struct run_softc *sc = ifp->if_softc;
   2635        1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   2636        1.1    nonaka 
   2637        1.1    nonaka 	ifp->if_timer = 0;
   2638        1.1    nonaka 
   2639        1.1    nonaka 	if (sc->sc_tx_timer > 0) {
   2640        1.1    nonaka 		if (--sc->sc_tx_timer == 0) {
   2641        1.1    nonaka 			aprint_error_dev(sc->sc_dev, "device timeout\n");
   2642        1.1    nonaka 			/* run_init(ifp); XXX needs a process context! */
   2643        1.1    nonaka 			ifp->if_oerrors++;
   2644        1.1    nonaka 			return;
   2645        1.1    nonaka 		}
   2646        1.1    nonaka 		ifp->if_timer = 1;
   2647        1.1    nonaka 	}
   2648        1.1    nonaka 
   2649        1.1    nonaka 	ieee80211_watchdog(ic);
   2650        1.1    nonaka }
   2651        1.1    nonaka 
   2652        1.1    nonaka static int
   2653        1.1    nonaka run_ioctl(struct ifnet *ifp, u_long cmd, void *data)
   2654        1.1    nonaka {
   2655        1.1    nonaka 	struct run_softc *sc = ifp->if_softc;
   2656        1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   2657        1.1    nonaka 	int s, error = 0;
   2658        1.1    nonaka 
   2659        1.1    nonaka 	s = splnet();
   2660        1.1    nonaka 
   2661        1.1    nonaka 	switch (cmd) {
   2662        1.1    nonaka 	case SIOCSIFFLAGS:
   2663        1.1    nonaka 		if ((error = ifioctl_common(ifp, cmd, data)) != 0)
   2664        1.1    nonaka 			break;
   2665        1.1    nonaka 		switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
   2666        1.1    nonaka 		case IFF_UP|IFF_RUNNING:
   2667        1.1    nonaka 			break;
   2668        1.1    nonaka 		case IFF_UP:
   2669        1.1    nonaka 			run_init(ifp);
   2670        1.1    nonaka 			break;
   2671        1.1    nonaka 		case IFF_RUNNING:
   2672        1.1    nonaka 			run_stop(ifp, 1);
   2673        1.1    nonaka 			break;
   2674        1.1    nonaka 		case 0:
   2675        1.1    nonaka 			break;
   2676        1.1    nonaka 		}
   2677        1.1    nonaka 		break;
   2678        1.1    nonaka 
   2679        1.1    nonaka 	case SIOCADDMULTI:
   2680        1.1    nonaka 	case SIOCDELMULTI:
   2681        1.1    nonaka 		if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET) {
   2682        1.1    nonaka 			/* setup multicast filter, etc */
   2683        1.1    nonaka 			error = 0;
   2684        1.1    nonaka 		}
   2685        1.1    nonaka 		break;
   2686        1.1    nonaka 
   2687        1.1    nonaka 	default:
   2688        1.1    nonaka 		error = ieee80211_ioctl(ic, cmd, data);
   2689        1.1    nonaka 		break;
   2690        1.1    nonaka 	}
   2691        1.1    nonaka 
   2692        1.1    nonaka 	if (error == ENETRESET) {
   2693        1.1    nonaka 		if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) ==
   2694        1.1    nonaka 		    (IFF_UP | IFF_RUNNING)) {
   2695        1.1    nonaka 			run_init(ifp);
   2696        1.1    nonaka 		}
   2697        1.1    nonaka 		error = 0;
   2698        1.1    nonaka 	}
   2699        1.1    nonaka 
   2700        1.1    nonaka 	splx(s);
   2701        1.1    nonaka 
   2702   1.10.6.2     skrll 	return error;
   2703        1.1    nonaka }
   2704        1.1    nonaka 
   2705        1.1    nonaka static void
   2706        1.1    nonaka run_select_chan_group(struct run_softc *sc, int group)
   2707        1.1    nonaka {
   2708        1.1    nonaka 	uint32_t tmp;
   2709        1.1    nonaka 	uint8_t agc;
   2710        1.1    nonaka 
   2711        1.1    nonaka 	run_bbp_write(sc, 62, 0x37 - sc->lna[group]);
   2712        1.1    nonaka 	run_bbp_write(sc, 63, 0x37 - sc->lna[group]);
   2713        1.1    nonaka 	run_bbp_write(sc, 64, 0x37 - sc->lna[group]);
   2714        1.1    nonaka 	run_bbp_write(sc, 86, 0x00);
   2715        1.1    nonaka 
   2716        1.1    nonaka 	if (group == 0) {
   2717        1.1    nonaka 		if (sc->ext_2ghz_lna) {
   2718        1.1    nonaka 			run_bbp_write(sc, 82, 0x62);
   2719        1.1    nonaka 			run_bbp_write(sc, 75, 0x46);
   2720        1.1    nonaka 		} else {
   2721        1.1    nonaka 			run_bbp_write(sc, 82, 0x84);
   2722        1.1    nonaka 			run_bbp_write(sc, 75, 0x50);
   2723        1.1    nonaka 		}
   2724        1.1    nonaka 	} else {
   2725        1.1    nonaka 		if (sc->mac_ver == 0x3572)
   2726        1.1    nonaka 			run_bbp_write(sc, 82, 0x94);
   2727        1.1    nonaka 		else
   2728        1.1    nonaka 			run_bbp_write(sc, 82, 0xf2);
   2729        1.1    nonaka 		if (sc->ext_5ghz_lna)
   2730        1.1    nonaka 			run_bbp_write(sc, 75, 0x46);
   2731        1.1    nonaka 		else
   2732        1.1    nonaka 			run_bbp_write(sc, 75, 0x50);
   2733        1.1    nonaka 	}
   2734        1.1    nonaka 
   2735        1.1    nonaka 	run_read(sc, RT2860_TX_BAND_CFG, &tmp);
   2736        1.1    nonaka 	tmp &= ~(RT2860_5G_BAND_SEL_N | RT2860_5G_BAND_SEL_P);
   2737        1.1    nonaka 	tmp |= (group == 0) ? RT2860_5G_BAND_SEL_N : RT2860_5G_BAND_SEL_P;
   2738        1.1    nonaka 	run_write(sc, RT2860_TX_BAND_CFG, tmp);
   2739        1.1    nonaka 
   2740        1.1    nonaka 	/* enable appropriate Power Amplifiers and Low Noise Amplifiers */
   2741        1.1    nonaka 	tmp = RT2860_RFTR_EN | RT2860_TRSW_EN | RT2860_LNA_PE0_EN;
   2742        1.1    nonaka 	if (sc->nrxchains > 1)
   2743        1.1    nonaka 		tmp |= RT2860_LNA_PE1_EN;
   2744        1.1    nonaka 	if (group == 0) {	/* 2GHz */
   2745        1.1    nonaka 		tmp |= RT2860_PA_PE_G0_EN;
   2746        1.1    nonaka 		if (sc->ntxchains > 1)
   2747        1.1    nonaka 			tmp |= RT2860_PA_PE_G1_EN;
   2748        1.1    nonaka 	} else {		/* 5GHz */
   2749        1.1    nonaka 		tmp |= RT2860_PA_PE_A0_EN;
   2750        1.1    nonaka 		if (sc->ntxchains > 1)
   2751        1.1    nonaka 			tmp |= RT2860_PA_PE_A1_EN;
   2752        1.1    nonaka 	}
   2753        1.1    nonaka 	if (sc->mac_ver == 0x3572) {
   2754        1.1    nonaka 		run_rt3070_rf_write(sc, 8, 0x00);
   2755        1.1    nonaka 		run_write(sc, RT2860_TX_PIN_CFG, tmp);
   2756        1.1    nonaka 		run_rt3070_rf_write(sc, 8, 0x80);
   2757        1.1    nonaka 	} else
   2758        1.1    nonaka 		run_write(sc, RT2860_TX_PIN_CFG, tmp);
   2759        1.1    nonaka 
   2760        1.1    nonaka 	/* set initial AGC value */
   2761        1.1    nonaka 	if (group == 0) {       /* 2GHz band */
   2762        1.1    nonaka 		if (sc->mac_ver >= 0x3070)
   2763        1.1    nonaka 			agc = 0x1c + sc->lna[0] * 2;
   2764        1.1    nonaka 		else
   2765        1.1    nonaka 			agc = 0x2e + sc->lna[0];
   2766        1.1    nonaka 	} else {		/* 5GHz band */
   2767        1.1    nonaka 		if (sc->mac_ver == 0x3572)
   2768        1.1    nonaka 			agc = 0x22 + (sc->lna[group] * 5) / 3;
   2769        1.1    nonaka 		else
   2770        1.1    nonaka 			agc = 0x32 + (sc->lna[group] * 5) / 3;
   2771        1.1    nonaka 	}
   2772        1.1    nonaka 	run_set_agc(sc, agc);
   2773        1.1    nonaka }
   2774        1.1    nonaka 
   2775        1.1    nonaka static void
   2776        1.1    nonaka run_rt2870_set_chan(struct run_softc *sc, u_int chan)
   2777        1.1    nonaka {
   2778        1.1    nonaka 	const struct rfprog *rfprog = rt2860_rf2850;
   2779        1.1    nonaka 	uint32_t r2, r3, r4;
   2780        1.1    nonaka 	int8_t txpow1, txpow2;
   2781        1.1    nonaka 	int i;
   2782        1.1    nonaka 
   2783        1.1    nonaka 	/* find the settings for this channel (we know it exists) */
   2784        1.1    nonaka 	for (i = 0; rfprog[i].chan != chan; i++);
   2785        1.1    nonaka 
   2786        1.1    nonaka 	r2 = rfprog[i].r2;
   2787        1.1    nonaka 	if (sc->ntxchains == 1)
   2788        1.1    nonaka 		r2 |= 1 << 12;		/* 1T: disable Tx chain 2 */
   2789        1.1    nonaka 	if (sc->nrxchains == 1)
   2790        1.1    nonaka 		r2 |= 1 << 15 | 1 << 4;	/* 1R: disable Rx chains 2 & 3 */
   2791        1.1    nonaka 	else if (sc->nrxchains == 2)
   2792        1.1    nonaka 		r2 |= 1 << 4;		/* 2R: disable Rx chain 3 */
   2793        1.1    nonaka 
   2794        1.1    nonaka 	/* use Tx power values from EEPROM */
   2795        1.1    nonaka 	txpow1 = sc->txpow1[i];
   2796        1.1    nonaka 	txpow2 = sc->txpow2[i];
   2797        1.1    nonaka 	if (chan > 14) {
   2798        1.1    nonaka 		if (txpow1 >= 0)
   2799        1.1    nonaka 			txpow1 = txpow1 << 1 | 1;
   2800        1.1    nonaka 		else
   2801        1.1    nonaka 			txpow1 = (7 + txpow1) << 1;
   2802        1.1    nonaka 		if (txpow2 >= 0)
   2803        1.1    nonaka 			txpow2 = txpow2 << 1 | 1;
   2804        1.1    nonaka 		else
   2805        1.1    nonaka 			txpow2 = (7 + txpow2) << 1;
   2806        1.1    nonaka 	}
   2807        1.1    nonaka 	r3 = rfprog[i].r3 | txpow1 << 7;
   2808        1.1    nonaka 	r4 = rfprog[i].r4 | sc->freq << 13 | txpow2 << 4;
   2809        1.1    nonaka 
   2810        1.1    nonaka 	run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1);
   2811        1.1    nonaka 	run_rt2870_rf_write(sc, RT2860_RF2, r2);
   2812        1.1    nonaka 	run_rt2870_rf_write(sc, RT2860_RF3, r3);
   2813        1.1    nonaka 	run_rt2870_rf_write(sc, RT2860_RF4, r4);
   2814        1.1    nonaka 
   2815  1.10.6.11     skrll 	usbd_delay_ms(sc->sc_udev, 10);
   2816        1.1    nonaka 
   2817        1.1    nonaka 	run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1);
   2818        1.1    nonaka 	run_rt2870_rf_write(sc, RT2860_RF2, r2);
   2819        1.1    nonaka 	run_rt2870_rf_write(sc, RT2860_RF3, r3 | 1);
   2820        1.1    nonaka 	run_rt2870_rf_write(sc, RT2860_RF4, r4);
   2821        1.1    nonaka 
   2822  1.10.6.11     skrll 	usbd_delay_ms(sc->sc_udev, 10);
   2823        1.1    nonaka 
   2824        1.1    nonaka 	run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1);
   2825        1.1    nonaka 	run_rt2870_rf_write(sc, RT2860_RF2, r2);
   2826        1.1    nonaka 	run_rt2870_rf_write(sc, RT2860_RF3, r3);
   2827        1.1    nonaka 	run_rt2870_rf_write(sc, RT2860_RF4, r4);
   2828        1.1    nonaka }
   2829        1.1    nonaka 
   2830        1.1    nonaka static void
   2831        1.1    nonaka run_rt3070_set_chan(struct run_softc *sc, u_int chan)
   2832        1.1    nonaka {
   2833        1.1    nonaka 	int8_t txpow1, txpow2;
   2834        1.1    nonaka 	uint8_t rf;
   2835        1.1    nonaka 	int i;
   2836        1.1    nonaka 
   2837        1.1    nonaka 	KASSERT(chan >= 1 && chan <= 14);	/* RT3070 is 2GHz only */
   2838        1.1    nonaka 
   2839        1.1    nonaka 	/* find the settings for this channel (we know it exists) */
   2840        1.1    nonaka 	for (i = 0; rt2860_rf2850[i].chan != chan; i++)
   2841        1.1    nonaka 		continue;
   2842        1.1    nonaka 
   2843        1.1    nonaka 	/* use Tx power values from EEPROM */
   2844        1.1    nonaka 	txpow1 = sc->txpow1[i];
   2845        1.1    nonaka 	txpow2 = sc->txpow2[i];
   2846        1.1    nonaka 
   2847        1.1    nonaka 	run_rt3070_rf_write(sc, 2, rt3070_freqs[i].n);
   2848        1.1    nonaka 	run_rt3070_rf_write(sc, 3, rt3070_freqs[i].k);
   2849        1.1    nonaka 	run_rt3070_rf_read(sc, 6, &rf);
   2850        1.1    nonaka 	rf = (rf & ~0x03) | rt3070_freqs[i].r;
   2851        1.1    nonaka 	run_rt3070_rf_write(sc, 6, rf);
   2852        1.1    nonaka 
   2853        1.1    nonaka 	/* set Tx0 power */
   2854        1.1    nonaka 	run_rt3070_rf_read(sc, 12, &rf);
   2855        1.1    nonaka 	rf = (rf & ~0x1f) | txpow1;
   2856        1.1    nonaka 	run_rt3070_rf_write(sc, 12, rf);
   2857        1.1    nonaka 
   2858        1.1    nonaka 	/* set Tx1 power */
   2859        1.1    nonaka 	run_rt3070_rf_read(sc, 13, &rf);
   2860        1.1    nonaka 	rf = (rf & ~0x1f) | txpow2;
   2861        1.1    nonaka 	run_rt3070_rf_write(sc, 13, rf);
   2862        1.1    nonaka 
   2863        1.1    nonaka 	run_rt3070_rf_read(sc, 1, &rf);
   2864        1.1    nonaka 	rf &= ~0xfc;
   2865        1.1    nonaka 	if (sc->ntxchains == 1)
   2866        1.1    nonaka 		rf |= 1 << 7 | 1 << 5;	/* 1T: disable Tx chains 2 & 3 */
   2867        1.1    nonaka 	else if (sc->ntxchains == 2)
   2868        1.1    nonaka 		rf |= 1 << 7;		/* 2T: disable Tx chain 3 */
   2869        1.1    nonaka 	if (sc->nrxchains == 1)
   2870        1.1    nonaka 		rf |= 1 << 6 | 1 << 4;	/* 1R: disable Rx chains 2 & 3 */
   2871        1.1    nonaka 	else if (sc->nrxchains == 2)
   2872        1.1    nonaka 		rf |= 1 << 6;		/* 2R: disable Rx chain 3 */
   2873        1.1    nonaka 	run_rt3070_rf_write(sc, 1, rf);
   2874        1.1    nonaka 
   2875        1.1    nonaka 	/* set RF offset */
   2876        1.1    nonaka 	run_rt3070_rf_read(sc, 23, &rf);
   2877        1.1    nonaka 	rf = (rf & ~0x7f) | sc->freq;
   2878        1.1    nonaka 	run_rt3070_rf_write(sc, 23, rf);
   2879        1.1    nonaka 
   2880        1.1    nonaka 	/* program RF filter */
   2881        1.1    nonaka 	run_rt3070_rf_read(sc, 24, &rf);        /* Tx */
   2882        1.1    nonaka 	rf = (rf & ~0x3f) | sc->rf24_20mhz;
   2883        1.1    nonaka 	run_rt3070_rf_write(sc, 24, rf);
   2884        1.1    nonaka 	run_rt3070_rf_read(sc, 31, &rf);        /* Rx */
   2885        1.1    nonaka 	rf = (rf & ~0x3f) | sc->rf24_20mhz;
   2886        1.1    nonaka 	run_rt3070_rf_write(sc, 31, rf);
   2887        1.1    nonaka 
   2888        1.1    nonaka 	/* enable RF tuning */
   2889        1.1    nonaka 	run_rt3070_rf_read(sc, 7, &rf);
   2890        1.1    nonaka 	run_rt3070_rf_write(sc, 7, rf | 0x01);
   2891        1.1    nonaka }
   2892        1.1    nonaka 
   2893        1.1    nonaka static void
   2894        1.1    nonaka run_rt3572_set_chan(struct run_softc *sc, u_int chan)
   2895        1.1    nonaka {
   2896        1.1    nonaka 	int8_t txpow1, txpow2;
   2897        1.1    nonaka 	uint32_t tmp;
   2898        1.1    nonaka 	uint8_t rf;
   2899        1.1    nonaka 	int i;
   2900        1.1    nonaka 
   2901        1.1    nonaka 	/* find the settings for this channel (we know it exists) */
   2902        1.1    nonaka 	for (i = 0; rt2860_rf2850[i].chan != chan; i++);
   2903        1.1    nonaka 
   2904        1.1    nonaka 	/* use Tx power values from EEPROM */
   2905        1.1    nonaka 	txpow1 = sc->txpow1[i];
   2906        1.1    nonaka 	txpow2 = sc->txpow2[i];
   2907        1.1    nonaka 
   2908        1.1    nonaka 	if (chan <= 14) {
   2909        1.1    nonaka 		run_bbp_write(sc, 25, sc->bbp25);
   2910        1.1    nonaka 		run_bbp_write(sc, 26, sc->bbp26);
   2911        1.1    nonaka 	} else {
   2912        1.1    nonaka 		/* enable IQ phase correction */
   2913        1.1    nonaka 		run_bbp_write(sc, 25, 0x09);
   2914        1.1    nonaka 		run_bbp_write(sc, 26, 0xff);
   2915        1.1    nonaka 	}
   2916        1.1    nonaka 
   2917        1.1    nonaka 	run_rt3070_rf_write(sc, 2, rt3070_freqs[i].n);
   2918        1.1    nonaka 	run_rt3070_rf_write(sc, 3, rt3070_freqs[i].k);
   2919        1.1    nonaka 	run_rt3070_rf_read(sc, 6, &rf);
   2920        1.1    nonaka 	rf  = (rf & ~0x0f) | rt3070_freqs[i].r;
   2921        1.1    nonaka 	rf |= (chan <= 14) ? 0x08 : 0x04;
   2922        1.1    nonaka 	run_rt3070_rf_write(sc, 6, rf);
   2923        1.1    nonaka 
   2924        1.1    nonaka 	/* set PLL mode */
   2925        1.1    nonaka 	run_rt3070_rf_read(sc, 5, &rf);
   2926        1.1    nonaka 	rf &= ~(0x08 | 0x04);
   2927        1.1    nonaka 	rf |= (chan <= 14) ? 0x04 : 0x08;
   2928        1.1    nonaka 	run_rt3070_rf_write(sc, 5, rf);
   2929        1.1    nonaka 
   2930        1.1    nonaka 	/* set Tx power for chain 0 */
   2931        1.1    nonaka 	if (chan <= 14)
   2932        1.1    nonaka 		rf = 0x60 | txpow1;
   2933        1.1    nonaka 	else
   2934        1.1    nonaka 		rf = 0xe0 | (txpow1 & 0xc) << 1 | (txpow1 & 0x3);
   2935        1.1    nonaka 	run_rt3070_rf_write(sc, 12, rf);
   2936        1.1    nonaka 
   2937        1.1    nonaka 	/* set Tx power for chain 1 */
   2938        1.1    nonaka 	if (chan <= 14)
   2939        1.1    nonaka 		rf = 0x60 | txpow2;
   2940        1.1    nonaka 	else
   2941        1.1    nonaka 		rf = 0xe0 | (txpow2 & 0xc) << 1 | (txpow2 & 0x3);
   2942        1.1    nonaka 	run_rt3070_rf_write(sc, 13, rf);
   2943        1.1    nonaka 
   2944        1.1    nonaka 	/* set Tx/Rx streams */
   2945        1.1    nonaka 	run_rt3070_rf_read(sc, 1, &rf);
   2946        1.1    nonaka 	rf &= ~0xfc;
   2947        1.1    nonaka 	if (sc->ntxchains == 1)
   2948        1.1    nonaka 		rf |= 1 << 7 | 1 << 5;	/* 1T: disable Tx chains 2 & 3 */
   2949        1.1    nonaka 	else if (sc->ntxchains == 2)
   2950        1.1    nonaka 		rf |= 1 << 7;		/* 2T: disable Tx chain 3 */
   2951        1.1    nonaka 	if (sc->nrxchains == 1)
   2952        1.1    nonaka 		rf |= 1 << 6 | 1 << 4;	/* 1R: disable Rx chains 2 & 3 */
   2953        1.1    nonaka 	else if (sc->nrxchains == 2)
   2954        1.1    nonaka 		rf |= 1 << 6;		/* 2R: disable Rx chain 3 */
   2955        1.1    nonaka 	run_rt3070_rf_write(sc, 1, rf);
   2956        1.1    nonaka 
   2957        1.1    nonaka 	/* set RF offset */
   2958        1.1    nonaka 	run_rt3070_rf_read(sc, 23, &rf);
   2959        1.1    nonaka 	rf = (rf & ~0x7f) | sc->freq;
   2960        1.1    nonaka 	run_rt3070_rf_write(sc, 23, rf);
   2961        1.1    nonaka 
   2962        1.1    nonaka 	/* program RF filter */
   2963        1.1    nonaka 	rf = sc->rf24_20mhz;
   2964        1.1    nonaka 	run_rt3070_rf_write(sc, 24, rf);	/* Tx */
   2965        1.1    nonaka 	run_rt3070_rf_write(sc, 31, rf);	/* Rx */
   2966        1.1    nonaka 
   2967        1.1    nonaka 	/* enable RF tuning */
   2968        1.1    nonaka 	run_rt3070_rf_read(sc, 7, &rf);
   2969        1.1    nonaka 	rf = (chan <= 14) ? 0xd8 : ((rf & ~0xc8) | 0x14);
   2970        1.1    nonaka 	run_rt3070_rf_write(sc, 7, rf);
   2971        1.1    nonaka 
   2972        1.1    nonaka 	/* TSSI */
   2973        1.1    nonaka 	rf = (chan <= 14) ? 0xc3 : 0xc0;
   2974        1.1    nonaka 	run_rt3070_rf_write(sc, 9, rf);
   2975        1.1    nonaka 
   2976        1.1    nonaka 	/* set loop filter 1 */
   2977        1.1    nonaka 	run_rt3070_rf_write(sc, 10, 0xf1);
   2978        1.1    nonaka 	/* set loop filter 2 */
   2979        1.1    nonaka 	run_rt3070_rf_write(sc, 11, (chan <= 14) ? 0xb9 : 0x00);
   2980        1.1    nonaka 
   2981        1.1    nonaka 	/* set tx_mx2_ic */
   2982        1.1    nonaka 	run_rt3070_rf_write(sc, 15, (chan <= 14) ? 0x53 : 0x43);
   2983        1.1    nonaka 	/* set tx_mx1_ic */
   2984        1.1    nonaka 	if (chan <= 14)
   2985        1.1    nonaka 		rf = 0x48 | sc->txmixgain_2ghz;
   2986        1.1    nonaka 	else
   2987        1.1    nonaka 		rf = 0x78 | sc->txmixgain_5ghz;
   2988        1.1    nonaka 	run_rt3070_rf_write(sc, 16, rf);
   2989        1.1    nonaka 
   2990        1.1    nonaka 	/* set tx_lo1 */
   2991        1.1    nonaka 	run_rt3070_rf_write(sc, 17, 0x23);
   2992        1.1    nonaka 	/* set tx_lo2 */
   2993        1.1    nonaka 	if (chan <= 14)
   2994        1.1    nonaka 		rf = 0x93;
   2995        1.1    nonaka 	else if (chan <= 64)
   2996        1.1    nonaka 		rf = 0xb7;
   2997        1.1    nonaka 	else if (chan <= 128)
   2998        1.1    nonaka 		rf = 0x74;
   2999        1.1    nonaka 	else
   3000        1.1    nonaka 		rf = 0x72;
   3001        1.1    nonaka 	run_rt3070_rf_write(sc, 19, rf);
   3002        1.1    nonaka 
   3003        1.1    nonaka 	/* set rx_lo1 */
   3004        1.1    nonaka 	if (chan <= 14)
   3005        1.1    nonaka 		rf = 0xb3;
   3006        1.1    nonaka 	else if (chan <= 64)
   3007        1.1    nonaka 		rf = 0xf6;
   3008        1.1    nonaka 	else if (chan <= 128)
   3009        1.1    nonaka 		rf = 0xf4;
   3010        1.1    nonaka 	else
   3011        1.1    nonaka 		rf = 0xf3;
   3012        1.1    nonaka 	run_rt3070_rf_write(sc, 20, rf);
   3013        1.1    nonaka 
   3014        1.1    nonaka 	/* set pfd_delay */
   3015        1.1    nonaka 	if (chan <= 14)
   3016        1.1    nonaka 		rf = 0x15;
   3017        1.1    nonaka 	else if (chan <= 64)
   3018        1.1    nonaka 		rf = 0x3d;
   3019        1.1    nonaka 	else
   3020        1.1    nonaka 		rf = 0x01;
   3021        1.1    nonaka 	run_rt3070_rf_write(sc, 25, rf);
   3022        1.1    nonaka 
   3023        1.1    nonaka 	/* set rx_lo2 */
   3024        1.1    nonaka 	run_rt3070_rf_write(sc, 26, (chan <= 14) ? 0x85 : 0x87);
   3025        1.1    nonaka 	/* set ldo_rf_vc */
   3026        1.1    nonaka 	run_rt3070_rf_write(sc, 27, (chan <= 14) ? 0x00 : 0x01);
   3027        1.1    nonaka 	/* set drv_cc */
   3028        1.1    nonaka 	run_rt3070_rf_write(sc, 29, (chan <= 14) ? 0x9b : 0x9f);
   3029        1.1    nonaka 
   3030        1.1    nonaka 	run_read(sc, RT2860_GPIO_CTRL, &tmp);
   3031        1.1    nonaka 	tmp &= ~0x8080;
   3032        1.1    nonaka 	if (chan <= 14)
   3033        1.1    nonaka 		tmp |= 0x80;
   3034        1.1    nonaka 	run_write(sc, RT2860_GPIO_CTRL, tmp);
   3035        1.1    nonaka 
   3036        1.1    nonaka 	/* enable RF tuning */
   3037        1.1    nonaka 	run_rt3070_rf_read(sc, 7, &rf);
   3038        1.1    nonaka 	run_rt3070_rf_write(sc, 7, rf | 0x01);
   3039        1.1    nonaka 
   3040  1.10.6.11     skrll 	usbd_delay_ms(sc->sc_udev, 2);
   3041  1.10.6.11     skrll }
   3042  1.10.6.11     skrll 
   3043  1.10.6.11     skrll static void
   3044  1.10.6.11     skrll run_rt3593_set_chan(struct run_softc *sc, u_int chan)
   3045  1.10.6.11     skrll {
   3046  1.10.6.11     skrll 	int8_t txpow1, txpow2, txpow3;
   3047  1.10.6.11     skrll 	uint8_t h20mhz, rf;
   3048  1.10.6.11     skrll 	int i;
   3049  1.10.6.11     skrll 
   3050  1.10.6.11     skrll 	/* find the settings for this channel (we know it exists) */
   3051  1.10.6.11     skrll 	for (i = 0; rt2860_rf2850[i].chan != chan; i++);
   3052  1.10.6.11     skrll 
   3053  1.10.6.11     skrll 	/* use Tx power values from EEPROM */
   3054  1.10.6.11     skrll 	txpow1 = sc->txpow1[i];
   3055  1.10.6.11     skrll 	txpow2 = sc->txpow2[i];
   3056  1.10.6.11     skrll 	txpow3 = (sc->ntxchains == 3) ? sc->txpow3[i] : 0;
   3057  1.10.6.11     skrll 
   3058  1.10.6.11     skrll 	if (chan <= 14) {
   3059  1.10.6.11     skrll 		run_bbp_write(sc, 25, sc->bbp25);
   3060  1.10.6.11     skrll 		run_bbp_write(sc, 26, sc->bbp26);
   3061  1.10.6.11     skrll 	} else {
   3062  1.10.6.11     skrll 		/* Enable IQ phase correction. */
   3063  1.10.6.11     skrll 		run_bbp_write(sc, 25, 0x09);
   3064  1.10.6.11     skrll 		run_bbp_write(sc, 26, 0xff);
   3065  1.10.6.11     skrll 	}
   3066  1.10.6.11     skrll 
   3067  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 8, rt3070_freqs[i].n);
   3068  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 9, rt3070_freqs[i].k & 0x0f);
   3069  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 11, &rf);
   3070  1.10.6.11     skrll 	rf = (rf & ~0x03) | (rt3070_freqs[i].r & 0x03);
   3071  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 11, rf);
   3072  1.10.6.11     skrll 
   3073  1.10.6.11     skrll 	/* Set pll_idoh. */
   3074  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 11, &rf);
   3075  1.10.6.11     skrll 	rf &= ~0x4c;
   3076  1.10.6.11     skrll 	rf |= (chan <= 14) ? 0x44 : 0x48;
   3077  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 11, rf);
   3078  1.10.6.11     skrll 
   3079  1.10.6.11     skrll 	if (chan <= 14)
   3080  1.10.6.11     skrll 		rf = txpow1 & 0x1f;
   3081  1.10.6.11     skrll 	else
   3082  1.10.6.11     skrll 		rf = 0x40 | ((txpow1 & 0x18) << 1) | (txpow1 & 0x07);
   3083  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 53, rf);
   3084  1.10.6.11     skrll 
   3085  1.10.6.11     skrll 	if (chan <= 14)
   3086  1.10.6.11     skrll 		rf = txpow2 & 0x1f;
   3087  1.10.6.11     skrll 	else
   3088  1.10.6.11     skrll 		rf = 0x40 | ((txpow2 & 0x18) << 1) | (txpow2 & 0x07);
   3089  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 55, rf);
   3090  1.10.6.11     skrll 
   3091  1.10.6.11     skrll 	if (chan <= 14)
   3092  1.10.6.11     skrll 		rf = txpow3 & 0x1f;
   3093  1.10.6.11     skrll 	else
   3094  1.10.6.11     skrll 		rf = 0x40 | ((txpow3 & 0x18) << 1) | (txpow3 & 0x07);
   3095  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 54, rf);
   3096  1.10.6.11     skrll 
   3097  1.10.6.11     skrll 	rf = RT3070_RF_BLOCK | RT3070_PLL_PD;
   3098  1.10.6.11     skrll 	if (sc->ntxchains == 3)
   3099  1.10.6.11     skrll 		rf |= RT3070_TX0_PD | RT3070_TX1_PD | RT3070_TX2_PD;
   3100  1.10.6.11     skrll 	else
   3101  1.10.6.11     skrll 		rf |= RT3070_TX0_PD | RT3070_TX1_PD;
   3102  1.10.6.11     skrll 	rf |= RT3070_RX0_PD | RT3070_RX1_PD | RT3070_RX2_PD;
   3103  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 1, rf);
   3104  1.10.6.11     skrll 
   3105  1.10.6.11     skrll 	run_adjust_freq_offset(sc);
   3106  1.10.6.11     skrll 
   3107  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 31, (chan <= 14) ? 0xa0 : 0x80);
   3108  1.10.6.11     skrll 
   3109  1.10.6.11     skrll 	h20mhz = (sc->rf24_20mhz & 0x20) >> 5;
   3110  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 30, &rf);
   3111  1.10.6.11     skrll 	rf = (rf & ~0x06) | (h20mhz << 1) | (h20mhz << 2);
   3112  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 30, rf);
   3113  1.10.6.11     skrll 
   3114  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 36, &rf);
   3115  1.10.6.11     skrll 	if (chan <= 14)
   3116  1.10.6.11     skrll 		rf |= 0x80;
   3117  1.10.6.11     skrll 	else
   3118  1.10.6.11     skrll 		rf &= ~0x80;
   3119  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 36, rf);
   3120  1.10.6.11     skrll 
   3121  1.10.6.11     skrll 	/* Set vcolo_bs. */
   3122  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 34, (chan <= 14) ? 0x3c : 0x20);
   3123  1.10.6.11     skrll 	/* Set pfd_delay. */
   3124  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 12, (chan <= 14) ? 0x1a : 0x12);
   3125  1.10.6.11     skrll 
   3126  1.10.6.11     skrll 	/* Set vco bias current control. */
   3127  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 6, &rf);
   3128  1.10.6.11     skrll 	rf &= ~0xc0;
   3129  1.10.6.11     skrll 	if (chan <= 14)
   3130  1.10.6.11     skrll 		rf |= 0x40;
   3131  1.10.6.11     skrll 	else if (chan <= 128)
   3132  1.10.6.11     skrll 		rf |= 0x80;
   3133  1.10.6.11     skrll 	else
   3134  1.10.6.11     skrll 		rf |= 0x40;
   3135  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 6, rf);
   3136  1.10.6.11     skrll 
   3137  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 30, &rf);
   3138  1.10.6.11     skrll 	rf = (rf & ~0x18) | 0x10;
   3139  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 30, rf);
   3140  1.10.6.11     skrll 
   3141  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 10, (chan <= 14) ? 0xd3 : 0xd8);
   3142  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 13, (chan <= 14) ? 0x12 : 0x23);
   3143  1.10.6.11     skrll 
   3144  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 51, &rf);
   3145  1.10.6.11     skrll 	rf = (rf & ~0x03) | 0x01;
   3146  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 51, rf);
   3147  1.10.6.11     skrll 	/* Set tx_mx1_cc. */
   3148  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 51, &rf);
   3149  1.10.6.11     skrll 	rf &= ~0x1c;
   3150  1.10.6.11     skrll 	rf |= (chan <= 14) ? 0x14 : 0x10;
   3151  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 51, rf);
   3152  1.10.6.11     skrll 	/* Set tx_mx1_ic. */
   3153  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 51, &rf);
   3154  1.10.6.11     skrll 	rf &= ~0xe0;
   3155  1.10.6.11     skrll 	rf |= (chan <= 14) ? 0x60 : 0x40;
   3156  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 51, rf);
   3157  1.10.6.11     skrll 	/* Set tx_lo1_ic. */
   3158  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 49, &rf);
   3159  1.10.6.11     skrll 	rf &= ~0x1c;
   3160  1.10.6.11     skrll 	rf |= (chan <= 14) ? 0x0c : 0x08;
   3161  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 49, rf);
   3162  1.10.6.11     skrll 	/* Set tx_lo1_en. */
   3163  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 50, &rf);
   3164  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 50, rf & ~0x20);
   3165  1.10.6.11     skrll 	/* Set drv_cc. */
   3166  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 57, &rf);
   3167  1.10.6.11     skrll 	rf &= ~0xfc;
   3168  1.10.6.11     skrll 	rf |= (chan <= 14) ?  0x6c : 0x3c;
   3169  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 57, rf);
   3170  1.10.6.11     skrll 	/* Set rx_mix1_ic, rxa_lnactr, lna_vc, lna_inbias_en and lna_en. */
   3171  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 44, (chan <= 14) ? 0x93 : 0x9b);
   3172  1.10.6.11     skrll 	/* Set drv_gnd_a, tx_vga_cc_a and tx_mx2_gain. */
   3173  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 52, (chan <= 14) ? 0x45 : 0x05);
   3174  1.10.6.11     skrll 	/* Enable VCO calibration. */
   3175  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 3, &rf);
   3176  1.10.6.11     skrll 	rf &= ~RT5390_VCOCAL;
   3177  1.10.6.11     skrll 	rf |= (chan <= 14) ? RT5390_VCOCAL : 0xbe;
   3178  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 3, rf);
   3179  1.10.6.11     skrll 
   3180  1.10.6.11     skrll 	if (chan <= 14)
   3181  1.10.6.11     skrll 		rf = 0x23;
   3182  1.10.6.11     skrll 	else if (chan <= 64)
   3183  1.10.6.11     skrll 		rf = 0x36;
   3184  1.10.6.11     skrll 	else if (chan <= 128)
   3185  1.10.6.11     skrll 		rf = 0x32;
   3186  1.10.6.11     skrll 	else
   3187  1.10.6.11     skrll 		rf = 0x30;
   3188  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 39, rf);
   3189  1.10.6.11     skrll 	if (chan <= 14)
   3190  1.10.6.11     skrll 		rf = 0xbb;
   3191  1.10.6.11     skrll 	else if (chan <= 64)
   3192  1.10.6.11     skrll 		rf = 0xeb;
   3193  1.10.6.11     skrll 	else if (chan <= 128)
   3194  1.10.6.11     skrll 		rf = 0xb3;
   3195  1.10.6.11     skrll 	else
   3196  1.10.6.11     skrll 		rf = 0x9b;
   3197  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 45, rf);
   3198  1.10.6.11     skrll 
   3199  1.10.6.11     skrll 	/* Set FEQ/AEQ control. */
   3200  1.10.6.11     skrll 	run_bbp_write(sc, 105, 0x34);
   3201  1.10.6.11     skrll }
   3202  1.10.6.11     skrll 
   3203  1.10.6.11     skrll static void
   3204  1.10.6.11     skrll run_rt5390_set_chan(struct run_softc *sc, u_int chan)
   3205  1.10.6.11     skrll {
   3206  1.10.6.11     skrll 	int8_t txpow1, txpow2;
   3207  1.10.6.11     skrll 	uint8_t rf;
   3208  1.10.6.11     skrll 	int i;
   3209  1.10.6.11     skrll 
   3210  1.10.6.11     skrll 	/* find the settings for this channel (we know it exists) */
   3211  1.10.6.11     skrll 	for (i = 0; rt2860_rf2850[i].chan != chan; i++);
   3212  1.10.6.11     skrll 
   3213  1.10.6.11     skrll 	/* use Tx power values from EEPROM */
   3214  1.10.6.11     skrll 	txpow1 = sc->txpow1[i];
   3215  1.10.6.11     skrll 	txpow2 = sc->txpow2[i];
   3216  1.10.6.11     skrll 
   3217  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 8, rt3070_freqs[i].n);
   3218  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 9, rt3070_freqs[i].k & 0x0f);
   3219  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 11, &rf);
   3220  1.10.6.11     skrll 	rf = (rf & ~0x03) | (rt3070_freqs[i].r & 0x03);
   3221  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 11, rf);
   3222  1.10.6.11     skrll 
   3223  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 49, &rf);
   3224  1.10.6.11     skrll 	rf = (rf & ~0x3f) | (txpow1 & 0x3f);
   3225  1.10.6.11     skrll 	/* The valid range of the RF R49 is 0x00 to 0x27. */
   3226  1.10.6.11     skrll 	if ((rf & 0x3f) > 0x27)
   3227  1.10.6.11     skrll 		rf = (rf & ~0x3f) | 0x27;
   3228  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 49, rf);
   3229  1.10.6.11     skrll 
   3230  1.10.6.11     skrll 	if (sc->mac_ver == 0x5392) {
   3231  1.10.6.11     skrll 		run_rt3070_rf_read(sc, 50, &rf);
   3232  1.10.6.11     skrll 		rf = (rf & ~0x3f) | (txpow2 & 0x3f);
   3233  1.10.6.11     skrll 		/* The valid range of the RF R50 is 0x00 to 0x27. */
   3234  1.10.6.11     skrll 		if ((rf & 0x3f) > 0x27)
   3235  1.10.6.11     skrll 			rf = (rf & ~0x3f) | 0x27;
   3236  1.10.6.11     skrll 		run_rt3070_rf_write(sc, 50, rf);
   3237  1.10.6.11     skrll 	}
   3238  1.10.6.11     skrll 
   3239  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 1, &rf);
   3240  1.10.6.11     skrll 	rf |= RT3070_RF_BLOCK | RT3070_PLL_PD | RT3070_RX0_PD | RT3070_TX0_PD;
   3241  1.10.6.11     skrll 	if (sc->mac_ver == 0x5392)
   3242  1.10.6.11     skrll 		rf |= RT3070_RX1_PD | RT3070_TX1_PD;
   3243  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 1, rf);
   3244  1.10.6.11     skrll 
   3245  1.10.6.11     skrll 	if (sc->mac_ver != 0x5392) {
   3246  1.10.6.11     skrll 		run_rt3070_rf_read(sc, 2, &rf);
   3247  1.10.6.11     skrll 		rf |= 0x80;
   3248  1.10.6.11     skrll 		run_rt3070_rf_write(sc, 2, rf);
   3249  1.10.6.11     skrll 		usbd_delay_ms(sc->sc_udev, 10);
   3250  1.10.6.11     skrll 		rf &= 0x7f;
   3251  1.10.6.11     skrll 		run_rt3070_rf_write(sc, 2, rf);
   3252  1.10.6.11     skrll 	}
   3253  1.10.6.11     skrll 
   3254  1.10.6.11     skrll 	run_adjust_freq_offset(sc);
   3255  1.10.6.11     skrll 
   3256  1.10.6.11     skrll 	if (sc->mac_ver == 0x5392) {
   3257  1.10.6.11     skrll 		/* Fix for RT5392C. */
   3258  1.10.6.11     skrll 		if (sc->mac_rev >= 0x0223) {
   3259  1.10.6.11     skrll 			if (chan <= 4)
   3260  1.10.6.11     skrll 				rf = 0x0f;
   3261  1.10.6.11     skrll 			else if (chan >= 5 && chan <= 7)
   3262  1.10.6.11     skrll 				rf = 0x0e;
   3263  1.10.6.11     skrll 			else
   3264  1.10.6.11     skrll 				rf = 0x0d;
   3265  1.10.6.11     skrll 			run_rt3070_rf_write(sc, 23, rf);
   3266  1.10.6.11     skrll 
   3267  1.10.6.11     skrll 			if (chan <= 4)
   3268  1.10.6.11     skrll 				rf = 0x0c;
   3269  1.10.6.11     skrll 			else if (chan == 5)
   3270  1.10.6.11     skrll 				rf = 0x0b;
   3271  1.10.6.11     skrll 			else if (chan >= 6 && chan <= 7)
   3272  1.10.6.11     skrll 				rf = 0x0a;
   3273  1.10.6.11     skrll 			else if (chan >= 8 && chan <= 10)
   3274  1.10.6.11     skrll 				rf = 0x09;
   3275  1.10.6.11     skrll 			else
   3276  1.10.6.11     skrll 				rf = 0x08;
   3277  1.10.6.11     skrll 			run_rt3070_rf_write(sc, 59, rf);
   3278  1.10.6.11     skrll 		} else {
   3279  1.10.6.11     skrll 			if (chan <= 11)
   3280  1.10.6.11     skrll 				rf = 0x0f;
   3281  1.10.6.11     skrll 			else
   3282  1.10.6.11     skrll 				rf = 0x0b;
   3283  1.10.6.11     skrll 			run_rt3070_rf_write(sc, 59, rf);
   3284  1.10.6.11     skrll 		}
   3285  1.10.6.11     skrll 	} else {
   3286  1.10.6.11     skrll 		/* Fix for RT5390F. */
   3287  1.10.6.11     skrll 		if (sc->mac_rev >= 0x0502) {
   3288  1.10.6.11     skrll 			if (chan <= 11)
   3289  1.10.6.11     skrll 				rf = 0x43;
   3290  1.10.6.11     skrll 			else
   3291  1.10.6.11     skrll 				rf = 0x23;
   3292  1.10.6.11     skrll 			run_rt3070_rf_write(sc, 55, rf);
   3293  1.10.6.11     skrll 
   3294  1.10.6.11     skrll 			if (chan <= 11)
   3295  1.10.6.11     skrll 				rf = 0x0f;
   3296  1.10.6.11     skrll 			else if (chan == 12)
   3297  1.10.6.11     skrll 				rf = 0x0d;
   3298  1.10.6.11     skrll 			else
   3299  1.10.6.11     skrll 				rf = 0x0b;
   3300  1.10.6.11     skrll 			run_rt3070_rf_write(sc, 59, rf);
   3301  1.10.6.11     skrll 		} else {
   3302  1.10.6.11     skrll 			run_rt3070_rf_write(sc, 55, 0x44);
   3303  1.10.6.11     skrll 			run_rt3070_rf_write(sc, 59, 0x8f);
   3304  1.10.6.11     skrll 		}
   3305  1.10.6.11     skrll 	}
   3306  1.10.6.11     skrll 
   3307  1.10.6.11     skrll 	/* Enable VCO calibration. */
   3308  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 3, &rf);
   3309  1.10.6.11     skrll 	rf |= RT5390_VCOCAL;
   3310  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 3, rf);
   3311  1.10.6.11     skrll }
   3312  1.10.6.11     skrll 
   3313  1.10.6.11     skrll static void
   3314  1.10.6.11     skrll run_rt5592_set_chan(struct run_softc *sc, u_int chan)
   3315  1.10.6.11     skrll {
   3316  1.10.6.11     skrll 	const struct rt5592_freqs *freqs;
   3317  1.10.6.11     skrll 	uint32_t tmp;
   3318  1.10.6.11     skrll 	uint8_t reg, rf, txpow_bound;
   3319  1.10.6.11     skrll 	int8_t txpow1, txpow2;
   3320  1.10.6.11     skrll 	int i;
   3321  1.10.6.11     skrll 
   3322  1.10.6.11     skrll 	run_read(sc, RT5592_DEBUG_INDEX, &tmp);
   3323  1.10.6.11     skrll 	freqs = (tmp & RT5592_SEL_XTAL) ?
   3324  1.10.6.11     skrll 	    rt5592_freqs_40mhz : rt5592_freqs_20mhz;
   3325  1.10.6.11     skrll 
   3326  1.10.6.11     skrll 	/* find the settings for this channel (we know it exists) */
   3327  1.10.6.11     skrll 	for (i = 0; rt2860_rf2850[i].chan != chan; i++, freqs++);
   3328  1.10.6.11     skrll 
   3329  1.10.6.11     skrll 	/* use Tx power values from EEPROM */
   3330  1.10.6.11     skrll 	txpow1 = sc->txpow1[i];
   3331  1.10.6.11     skrll 	txpow2 = sc->txpow2[i];
   3332  1.10.6.11     skrll 
   3333  1.10.6.11     skrll 	run_read(sc, RT3070_LDO_CFG0, &tmp);
   3334  1.10.6.11     skrll 	tmp &= ~0x1c000000;
   3335  1.10.6.11     skrll 	if (chan > 14)
   3336  1.10.6.11     skrll 		tmp |= 0x14000000;
   3337  1.10.6.11     skrll 	run_write(sc, RT3070_LDO_CFG0, tmp);
   3338  1.10.6.11     skrll 
   3339  1.10.6.11     skrll 	/* N setting. */
   3340  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 8, freqs->n & 0xff);
   3341  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 9, &rf);
   3342  1.10.6.11     skrll 	rf &= ~(1 << 4);
   3343  1.10.6.11     skrll 	rf |= ((freqs->n & 0x0100) >> 8) << 4;
   3344  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 9, rf);
   3345  1.10.6.11     skrll 
   3346  1.10.6.11     skrll 	/* K setting. */
   3347  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 9, &rf);
   3348  1.10.6.11     skrll 	rf &= ~0x0f;
   3349  1.10.6.11     skrll 	rf |= (freqs->k & 0x0f);
   3350  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 9, rf);
   3351  1.10.6.11     skrll 
   3352  1.10.6.11     skrll 	/* Mode setting. */
   3353  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 11, &rf);
   3354  1.10.6.11     skrll 	rf &= ~0x0c;
   3355  1.10.6.11     skrll 	rf |= ((freqs->m - 0x8) & 0x3) << 2;
   3356  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 11, rf);
   3357  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 9, &rf);
   3358  1.10.6.11     skrll 	rf &= ~(1 << 7);
   3359  1.10.6.11     skrll 	rf |= (((freqs->m - 0x8) & 0x4) >> 2) << 7;
   3360  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 9, rf);
   3361  1.10.6.11     skrll 
   3362  1.10.6.11     skrll 	/* R setting. */
   3363  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 11, &rf);
   3364  1.10.6.11     skrll 	rf &= ~0x03;
   3365  1.10.6.11     skrll 	rf |= (freqs->r - 0x1);
   3366  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 11, rf);
   3367  1.10.6.11     skrll 
   3368  1.10.6.11     skrll 	if (chan <= 14) {
   3369  1.10.6.11     skrll 		/* Initialize RF registers for 2GHZ. */
   3370  1.10.6.11     skrll 		for (i = 0; i < (int)__arraycount(rt5592_2ghz_def_rf); i++) {
   3371  1.10.6.11     skrll 			run_rt3070_rf_write(sc, rt5592_2ghz_def_rf[i].reg,
   3372  1.10.6.11     skrll 			    rt5592_2ghz_def_rf[i].val);
   3373  1.10.6.11     skrll 		}
   3374  1.10.6.11     skrll 
   3375  1.10.6.11     skrll 		rf = (chan <= 10) ? 0x07 : 0x06;
   3376  1.10.6.11     skrll 		run_rt3070_rf_write(sc, 23, rf);
   3377  1.10.6.11     skrll 		run_rt3070_rf_write(sc, 59, rf);
   3378  1.10.6.11     skrll 
   3379  1.10.6.11     skrll 		run_rt3070_rf_write(sc, 55, 0x43);
   3380  1.10.6.11     skrll 
   3381  1.10.6.11     skrll 		/*
   3382  1.10.6.11     skrll 		 * RF R49/R50 Tx power ALC code.
   3383  1.10.6.11     skrll 		 * G-band bit<7:6>=1:0, bit<5:0> range from 0x0 ~ 0x27.
   3384  1.10.6.11     skrll 		 */
   3385  1.10.6.11     skrll 		reg = 2;
   3386  1.10.6.11     skrll 		txpow_bound = 0x27;
   3387  1.10.6.11     skrll 	} else {
   3388  1.10.6.11     skrll 		/* Initialize RF registers for 5GHZ. */
   3389  1.10.6.11     skrll 		for (i = 0; i < (int)__arraycount(rt5592_5ghz_def_rf); i++) {
   3390  1.10.6.11     skrll 			run_rt3070_rf_write(sc, rt5592_5ghz_def_rf[i].reg,
   3391  1.10.6.11     skrll 			    rt5592_5ghz_def_rf[i].val);
   3392  1.10.6.11     skrll 		}
   3393  1.10.6.11     skrll 		for (i = 0; i < (int)__arraycount(rt5592_chan_5ghz); i++) {
   3394  1.10.6.11     skrll 			if (chan >= rt5592_chan_5ghz[i].firstchan &&
   3395  1.10.6.11     skrll 			    chan <= rt5592_chan_5ghz[i].lastchan) {
   3396  1.10.6.11     skrll 				run_rt3070_rf_write(sc, rt5592_chan_5ghz[i].reg,
   3397  1.10.6.11     skrll 				    rt5592_chan_5ghz[i].val);
   3398  1.10.6.11     skrll 			}
   3399  1.10.6.11     skrll 		}
   3400  1.10.6.11     skrll 
   3401  1.10.6.11     skrll 		/*
   3402  1.10.6.11     skrll 		 * RF R49/R50 Tx power ALC code.
   3403  1.10.6.11     skrll 		 * A-band bit<7:6>=1:1, bit<5:0> range from 0x0 ~ 0x2b.
   3404  1.10.6.11     skrll 		 */
   3405  1.10.6.11     skrll 		reg = 3;
   3406  1.10.6.11     skrll 		txpow_bound = 0x2b;
   3407  1.10.6.11     skrll 	}
   3408  1.10.6.11     skrll 
   3409  1.10.6.11     skrll 	/* RF R49 ch0 Tx power ALC code. */
   3410  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 49, &rf);
   3411  1.10.6.11     skrll 	rf &= ~0xc0;
   3412  1.10.6.11     skrll 	rf |= (reg << 6);
   3413  1.10.6.11     skrll 	rf = (rf & ~0x3f) | (txpow1 & 0x3f);
   3414  1.10.6.11     skrll 	if ((rf & 0x3f) > txpow_bound)
   3415  1.10.6.11     skrll 		rf = (rf & ~0x3f) | txpow_bound;
   3416  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 49, rf);
   3417  1.10.6.11     skrll 
   3418  1.10.6.11     skrll 	/* RF R50 ch1 Tx power ALC code. */
   3419  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 50, &rf);
   3420  1.10.6.11     skrll 	rf &= ~(1 << 7 | 1 << 6);
   3421  1.10.6.11     skrll 	rf |= (reg << 6);
   3422  1.10.6.11     skrll 	rf = (rf & ~0x3f) | (txpow2 & 0x3f);
   3423  1.10.6.11     skrll 	if ((rf & 0x3f) > txpow_bound)
   3424  1.10.6.11     skrll 		rf = (rf & ~0x3f) | txpow_bound;
   3425  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 50, rf);
   3426  1.10.6.11     skrll 
   3427  1.10.6.11     skrll 	/* Enable RF_BLOCK, PLL_PD, RX0_PD, and TX0_PD. */
   3428  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 1, &rf);
   3429  1.10.6.11     skrll 	rf |= (RT3070_RF_BLOCK | RT3070_PLL_PD | RT3070_RX0_PD | RT3070_TX0_PD);
   3430  1.10.6.11     skrll 	if (sc->ntxchains > 1)
   3431  1.10.6.11     skrll 		rf |= RT3070_TX1_PD;
   3432  1.10.6.11     skrll 	if (sc->nrxchains > 1)
   3433  1.10.6.11     skrll 		rf |= RT3070_RX1_PD;
   3434  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 1, rf);
   3435  1.10.6.11     skrll 
   3436  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 6, 0xe4);
   3437  1.10.6.11     skrll 
   3438  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 30, 0x10);
   3439  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 31, 0x80);
   3440  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 32, 0x80);
   3441  1.10.6.11     skrll 
   3442  1.10.6.11     skrll 	run_adjust_freq_offset(sc);
   3443  1.10.6.11     skrll 
   3444  1.10.6.11     skrll 	/* Enable VCO calibration. */
   3445  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 3, &rf);
   3446  1.10.6.11     skrll 	rf |= RT5390_VCOCAL;
   3447  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 3, rf);
   3448  1.10.6.11     skrll }
   3449  1.10.6.11     skrll 
   3450  1.10.6.11     skrll static void
   3451  1.10.6.11     skrll run_iq_calib(struct run_softc *sc, u_int chan)
   3452  1.10.6.11     skrll {
   3453  1.10.6.11     skrll 	uint16_t val;
   3454  1.10.6.11     skrll 
   3455  1.10.6.11     skrll 	/* Tx0 IQ gain. */
   3456  1.10.6.11     skrll 	run_bbp_write(sc, 158, 0x2c);
   3457  1.10.6.11     skrll 	if (chan <= 14)
   3458  1.10.6.11     skrll 		run_efuse_read(sc, RT5390_EEPROM_IQ_GAIN_CAL_TX0_2GHZ, &val, 1);
   3459  1.10.6.11     skrll 	else if (chan <= 64) {
   3460  1.10.6.11     skrll 		run_efuse_read(sc,
   3461  1.10.6.11     skrll 		    RT5390_EEPROM_IQ_GAIN_CAL_TX0_CH36_TO_CH64_5GHZ,
   3462  1.10.6.11     skrll 		    &val, 1);
   3463  1.10.6.11     skrll 	} else if (chan <= 138) {
   3464  1.10.6.11     skrll 		run_efuse_read(sc,
   3465  1.10.6.11     skrll 		    RT5390_EEPROM_IQ_GAIN_CAL_TX0_CH100_TO_CH138_5GHZ,
   3466  1.10.6.11     skrll 		    &val, 1);
   3467  1.10.6.11     skrll 	} else if (chan <= 165) {
   3468  1.10.6.11     skrll 		run_efuse_read(sc,
   3469  1.10.6.11     skrll 	    RT5390_EEPROM_IQ_GAIN_CAL_TX0_CH140_TO_CH165_5GHZ,
   3470  1.10.6.11     skrll 		    &val, 1);
   3471  1.10.6.11     skrll 	} else
   3472  1.10.6.11     skrll 		val = 0;
   3473  1.10.6.11     skrll 	run_bbp_write(sc, 159, val);
   3474  1.10.6.11     skrll 
   3475  1.10.6.11     skrll 	/* Tx0 IQ phase. */
   3476  1.10.6.11     skrll 	run_bbp_write(sc, 158, 0x2d);
   3477  1.10.6.11     skrll 	if (chan <= 14) {
   3478  1.10.6.11     skrll 		run_efuse_read(sc, RT5390_EEPROM_IQ_PHASE_CAL_TX0_2GHZ,
   3479  1.10.6.11     skrll 		    &val, 1);
   3480  1.10.6.11     skrll 	} else if (chan <= 64) {
   3481  1.10.6.11     skrll 		run_efuse_read(sc,
   3482  1.10.6.11     skrll 		    RT5390_EEPROM_IQ_PHASE_CAL_TX0_CH36_TO_CH64_5GHZ,
   3483  1.10.6.11     skrll 		    &val, 1);
   3484  1.10.6.11     skrll 	} else if (chan <= 138) {
   3485  1.10.6.11     skrll 		run_efuse_read(sc,
   3486  1.10.6.11     skrll 		    RT5390_EEPROM_IQ_PHASE_CAL_TX0_CH100_TO_CH138_5GHZ,
   3487  1.10.6.11     skrll 		    &val, 1);
   3488  1.10.6.11     skrll 	} else if (chan <= 165) {
   3489  1.10.6.11     skrll 		run_efuse_read(sc,
   3490  1.10.6.11     skrll 		    RT5390_EEPROM_IQ_PHASE_CAL_TX0_CH140_TO_CH165_5GHZ,
   3491  1.10.6.11     skrll 		    &val, 1);
   3492  1.10.6.11     skrll 	} else
   3493  1.10.6.11     skrll 		val = 0;
   3494  1.10.6.11     skrll 	run_bbp_write(sc, 159, val);
   3495  1.10.6.11     skrll 
   3496  1.10.6.11     skrll 	/* Tx1 IQ gain. */
   3497  1.10.6.11     skrll 	run_bbp_write(sc, 158, 0x4a);
   3498  1.10.6.11     skrll 	if (chan <= 14) {
   3499  1.10.6.11     skrll 		run_efuse_read(sc, RT5390_EEPROM_IQ_GAIN_CAL_TX1_2GHZ,
   3500  1.10.6.11     skrll 		    &val, 1);
   3501  1.10.6.11     skrll 	} else if (chan <= 64) {
   3502  1.10.6.11     skrll 		run_efuse_read(sc,
   3503  1.10.6.11     skrll 		    RT5390_EEPROM_IQ_GAIN_CAL_TX1_CH36_TO_CH64_5GHZ,
   3504  1.10.6.11     skrll 		    &val, 1);
   3505  1.10.6.11     skrll 	} else if (chan <= 138) {
   3506  1.10.6.11     skrll 		run_efuse_read(sc,
   3507  1.10.6.11     skrll 		    RT5390_EEPROM_IQ_GAIN_CAL_TX1_CH100_TO_CH138_5GHZ,
   3508  1.10.6.11     skrll 		    &val, 1);
   3509  1.10.6.11     skrll 	} else if (chan <= 165) {
   3510  1.10.6.11     skrll 		run_efuse_read(sc,
   3511  1.10.6.11     skrll 		    RT5390_EEPROM_IQ_GAIN_CAL_TX1_CH140_TO_CH165_5GHZ,
   3512  1.10.6.11     skrll 		    &val, 1);
   3513  1.10.6.11     skrll 	} else
   3514  1.10.6.11     skrll 		val = 0;
   3515  1.10.6.11     skrll 	run_bbp_write(sc, 159, val);
   3516  1.10.6.11     skrll 
   3517  1.10.6.11     skrll 	/* Tx1 IQ phase. */
   3518  1.10.6.11     skrll 	run_bbp_write(sc, 158, 0x4b);
   3519  1.10.6.11     skrll 	if (chan <= 14) {
   3520  1.10.6.11     skrll 		run_efuse_read(sc, RT5390_EEPROM_IQ_PHASE_CAL_TX1_2GHZ,
   3521  1.10.6.11     skrll 		    &val, 1);
   3522  1.10.6.11     skrll 	} else if (chan <= 64) {
   3523  1.10.6.11     skrll 		run_efuse_read(sc,
   3524  1.10.6.11     skrll 		    RT5390_EEPROM_IQ_PHASE_CAL_TX1_CH36_TO_CH64_5GHZ,
   3525  1.10.6.11     skrll 		    &val, 1);
   3526  1.10.6.11     skrll 	} else if (chan <= 138) {
   3527  1.10.6.11     skrll 		run_efuse_read(sc,
   3528  1.10.6.11     skrll 		    RT5390_EEPROM_IQ_PHASE_CAL_TX1_CH100_TO_CH138_5GHZ,
   3529  1.10.6.11     skrll 		    &val, 1);
   3530  1.10.6.11     skrll 	} else if (chan <= 165) {
   3531  1.10.6.11     skrll 		run_efuse_read(sc,
   3532  1.10.6.11     skrll 		    RT5390_EEPROM_IQ_PHASE_CAL_TX1_CH140_TO_CH165_5GHZ,
   3533  1.10.6.11     skrll 		    &val, 1);
   3534  1.10.6.11     skrll 	} else
   3535  1.10.6.11     skrll 		val = 0;
   3536  1.10.6.11     skrll 	run_bbp_write(sc, 159, val);
   3537  1.10.6.11     skrll 
   3538  1.10.6.11     skrll 	/* RF IQ compensation control. */
   3539  1.10.6.11     skrll 	run_bbp_write(sc, 158, 0x04);
   3540  1.10.6.11     skrll 	run_efuse_read(sc, RT5390_EEPROM_RF_IQ_COMPENSATION_CTL,
   3541  1.10.6.11     skrll 	    &val, 1);
   3542  1.10.6.11     skrll 	run_bbp_write(sc, 159, val);
   3543  1.10.6.11     skrll 
   3544  1.10.6.11     skrll 	/* RF IQ imbalance compensation control. */
   3545  1.10.6.11     skrll 	run_bbp_write(sc, 158, 0x03);
   3546  1.10.6.11     skrll 	run_efuse_read(sc,
   3547  1.10.6.11     skrll 	    RT5390_EEPROM_RF_IQ_IMBALANCE_COMPENSATION_CTL, &val, 1);
   3548  1.10.6.11     skrll 	run_bbp_write(sc, 159, val);
   3549        1.1    nonaka }
   3550        1.1    nonaka 
   3551        1.1    nonaka static void
   3552        1.1    nonaka run_set_agc(struct run_softc *sc, uint8_t agc)
   3553        1.1    nonaka {
   3554        1.1    nonaka 	uint8_t bbp;
   3555        1.1    nonaka 
   3556        1.1    nonaka 	if (sc->mac_ver == 0x3572) {
   3557        1.1    nonaka 		run_bbp_read(sc, 27, &bbp);
   3558        1.1    nonaka 		bbp &= ~(0x3 << 5);
   3559        1.1    nonaka 		run_bbp_write(sc, 27, bbp | 0 << 5);	/* select Rx0 */
   3560        1.1    nonaka 		run_bbp_write(sc, 66, agc);
   3561        1.1    nonaka 		run_bbp_write(sc, 27, bbp | 1 << 5);	/* select Rx1 */
   3562        1.1    nonaka 		run_bbp_write(sc, 66, agc);
   3563        1.1    nonaka 	} else
   3564        1.1    nonaka 		run_bbp_write(sc, 66, agc);
   3565        1.1    nonaka }
   3566        1.1    nonaka 
   3567        1.1    nonaka static void
   3568        1.1    nonaka run_set_rx_antenna(struct run_softc *sc, int aux)
   3569        1.1    nonaka {
   3570        1.1    nonaka 	uint32_t tmp;
   3571  1.10.6.11     skrll 	uint8_t bbp152;
   3572        1.1    nonaka 
   3573  1.10.6.11     skrll 	if (sc->rf_rev == RT5390_RF_5370) {
   3574  1.10.6.11     skrll 		run_bbp_read(sc, 152, &bbp152);
   3575  1.10.6.11     skrll 		bbp152 &= ~0x80;
   3576  1.10.6.11     skrll 		if (aux)
   3577  1.10.6.11     skrll 			bbp152 |= 0x80;
   3578  1.10.6.11     skrll 		run_bbp_write(sc, 152, bbp152);
   3579  1.10.6.11     skrll 	} else {
   3580  1.10.6.11     skrll 		run_mcu_cmd(sc, RT2860_MCU_CMD_ANTSEL, !aux);
   3581  1.10.6.11     skrll 		run_read(sc, RT2860_GPIO_CTRL, &tmp);
   3582  1.10.6.11     skrll 		tmp &= ~0x0808;
   3583  1.10.6.11     skrll 		if (aux)
   3584  1.10.6.11     skrll 			tmp |= 0x08;
   3585  1.10.6.11     skrll 		run_write(sc, RT2860_GPIO_CTRL, tmp);
   3586  1.10.6.11     skrll 	}
   3587        1.1    nonaka }
   3588        1.1    nonaka 
   3589        1.1    nonaka static int
   3590        1.1    nonaka run_set_chan(struct run_softc *sc, struct ieee80211_channel *c)
   3591        1.1    nonaka {
   3592        1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   3593        1.1    nonaka 	u_int chan, group;
   3594        1.1    nonaka 
   3595        1.1    nonaka 	chan = ieee80211_chan2ieee(ic, c);
   3596        1.1    nonaka 	if (chan == 0 || chan == IEEE80211_CHAN_ANY)
   3597   1.10.6.2     skrll 		return EINVAL;
   3598        1.1    nonaka 
   3599  1.10.6.11     skrll 	if (sc->mac_ver == 0x5592)
   3600  1.10.6.11     skrll 		run_rt5592_set_chan(sc, chan);
   3601  1.10.6.11     skrll 	else if (sc->mac_ver >= 0x5390)
   3602  1.10.6.11     skrll 		run_rt5390_set_chan(sc, chan);
   3603  1.10.6.11     skrll 	else if (sc->mac_ver == 0x3593)
   3604  1.10.6.11     skrll 		run_rt3593_set_chan(sc, chan);
   3605  1.10.6.11     skrll 	else if (sc->mac_ver == 0x3572)
   3606        1.1    nonaka 		run_rt3572_set_chan(sc, chan);
   3607        1.1    nonaka 	else if (sc->mac_ver >= 0x3070)
   3608        1.1    nonaka 		run_rt3070_set_chan(sc, chan);
   3609        1.1    nonaka 	else
   3610        1.1    nonaka 		run_rt2870_set_chan(sc, chan);
   3611        1.1    nonaka 
   3612        1.1    nonaka 	/* determine channel group */
   3613        1.1    nonaka 	if (chan <= 14)
   3614        1.1    nonaka 		group = 0;
   3615        1.1    nonaka 	else if (chan <= 64)
   3616        1.1    nonaka 		group = 1;
   3617        1.1    nonaka 	else if (chan <= 128)
   3618        1.1    nonaka 		group = 2;
   3619        1.1    nonaka 	else
   3620        1.1    nonaka 		group = 3;
   3621        1.1    nonaka 
   3622        1.1    nonaka 	/* XXX necessary only when group has changed! */
   3623        1.1    nonaka 	run_select_chan_group(sc, group);
   3624        1.1    nonaka 
   3625  1.10.6.11     skrll 	usbd_delay_ms(sc->sc_udev, 10);
   3626  1.10.6.11     skrll 
   3627  1.10.6.11     skrll 	/* Perform IQ calibration. */
   3628  1.10.6.11     skrll 	if (sc->mac_ver >= 0x5392)
   3629  1.10.6.11     skrll 		run_iq_calib(sc, chan);
   3630  1.10.6.11     skrll 
   3631   1.10.6.2     skrll 	return 0;
   3632        1.1    nonaka }
   3633        1.1    nonaka 
   3634        1.1    nonaka static void
   3635  1.10.6.11     skrll run_updateprot(struct run_softc *sc)
   3636  1.10.6.11     skrll {
   3637  1.10.6.11     skrll 	struct ieee80211com *ic = &sc->sc_ic;
   3638  1.10.6.11     skrll 	uint32_t tmp;
   3639  1.10.6.11     skrll 
   3640  1.10.6.11     skrll 	tmp = RT2860_RTSTH_EN | RT2860_PROT_NAV_SHORT | RT2860_TXOP_ALLOW_ALL;
   3641  1.10.6.11     skrll 	/* setup protection frame rate (MCS code) */
   3642  1.10.6.11     skrll 	tmp |= (ic->ic_curmode == IEEE80211_MODE_11A) ?
   3643  1.10.6.11     skrll 	    rt2860_rates[RT2860_RIDX_OFDM6].mcs | RT2860_PHY_OFDM :
   3644  1.10.6.11     skrll 	    rt2860_rates[RT2860_RIDX_CCK11].mcs;
   3645  1.10.6.11     skrll 
   3646  1.10.6.11     skrll 	/* CCK frames don't require protection */
   3647  1.10.6.11     skrll 	run_write(sc, RT2860_CCK_PROT_CFG, tmp);
   3648  1.10.6.11     skrll 	if (ic->ic_flags & IEEE80211_F_USEPROT) {
   3649  1.10.6.11     skrll 		if (ic->ic_protmode == IEEE80211_PROT_RTSCTS)
   3650  1.10.6.11     skrll 			tmp |= RT2860_PROT_CTRL_RTS_CTS;
   3651  1.10.6.11     skrll 		else if (ic->ic_protmode == IEEE80211_PROT_CTSONLY)
   3652  1.10.6.11     skrll 			tmp |= RT2860_PROT_CTRL_CTS;
   3653  1.10.6.11     skrll 	}
   3654  1.10.6.11     skrll 	run_write(sc, RT2860_OFDM_PROT_CFG, tmp);
   3655  1.10.6.11     skrll }
   3656  1.10.6.11     skrll 
   3657  1.10.6.11     skrll static void
   3658        1.1    nonaka run_enable_tsf_sync(struct run_softc *sc)
   3659        1.1    nonaka {
   3660        1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   3661        1.1    nonaka 	uint32_t tmp;
   3662        1.1    nonaka 
   3663        1.1    nonaka 	run_read(sc, RT2860_BCN_TIME_CFG, &tmp);
   3664        1.1    nonaka 	tmp &= ~0x1fffff;
   3665        1.1    nonaka 	tmp |= ic->ic_bss->ni_intval * 16;
   3666        1.1    nonaka 	tmp |= RT2860_TSF_TIMER_EN | RT2860_TBTT_TIMER_EN;
   3667        1.1    nonaka 	if (ic->ic_opmode == IEEE80211_M_STA) {
   3668        1.1    nonaka 		/*
   3669        1.1    nonaka 		 * Local TSF is always updated with remote TSF on beacon
   3670        1.1    nonaka 		 * reception.
   3671        1.1    nonaka 		 */
   3672        1.1    nonaka 		tmp |= 1 << RT2860_TSF_SYNC_MODE_SHIFT;
   3673        1.1    nonaka 	}
   3674        1.1    nonaka #ifndef IEEE80211_STA_ONLY
   3675        1.1    nonaka 	else if (ic->ic_opmode == IEEE80211_M_IBSS) {
   3676        1.1    nonaka 		tmp |= RT2860_BCN_TX_EN;
   3677        1.1    nonaka 		/*
   3678        1.1    nonaka 		 * Local TSF is updated with remote TSF on beacon reception
   3679        1.1    nonaka 		 * only if the remote TSF is greater than local TSF.
   3680        1.1    nonaka 		 */
   3681        1.1    nonaka 		tmp |= 2 << RT2860_TSF_SYNC_MODE_SHIFT;
   3682        1.1    nonaka 	} else if (ic->ic_opmode == IEEE80211_M_HOSTAP) {
   3683        1.1    nonaka 		tmp |= RT2860_BCN_TX_EN;
   3684        1.1    nonaka 		/* SYNC with nobody */
   3685        1.1    nonaka 		tmp |= 3 << RT2860_TSF_SYNC_MODE_SHIFT;
   3686        1.1    nonaka 	}
   3687        1.1    nonaka #endif
   3688        1.1    nonaka 	run_write(sc, RT2860_BCN_TIME_CFG, tmp);
   3689        1.1    nonaka }
   3690        1.1    nonaka 
   3691        1.1    nonaka static void
   3692        1.1    nonaka run_enable_mrr(struct run_softc *sc)
   3693        1.1    nonaka {
   3694        1.1    nonaka #define CCK(mcs)	(mcs)
   3695        1.1    nonaka #define OFDM(mcs)	(1 << 3 | (mcs))
   3696        1.1    nonaka 	run_write(sc, RT2860_LG_FBK_CFG0,
   3697        1.1    nonaka 	    OFDM(6) << 28 |	/* 54->48 */
   3698        1.1    nonaka 	    OFDM(5) << 24 |	/* 48->36 */
   3699        1.1    nonaka 	    OFDM(4) << 20 |	/* 36->24 */
   3700        1.1    nonaka 	    OFDM(3) << 16 |	/* 24->18 */
   3701        1.1    nonaka 	    OFDM(2) << 12 |	/* 18->12 */
   3702        1.1    nonaka 	    OFDM(1) <<  8 |	/* 12-> 9 */
   3703        1.1    nonaka 	    OFDM(0) <<  4 |	/*  9-> 6 */
   3704        1.1    nonaka 	    OFDM(0));		/*  6-> 6 */
   3705        1.1    nonaka 
   3706        1.1    nonaka 	run_write(sc, RT2860_LG_FBK_CFG1,
   3707        1.1    nonaka 	    CCK(2) << 12 |	/* 11->5.5 */
   3708        1.1    nonaka 	    CCK(1) <<  8 |	/* 5.5-> 2 */
   3709        1.1    nonaka 	    CCK(0) <<  4 |	/*   2-> 1 */
   3710        1.1    nonaka 	    CCK(0));		/*   1-> 1 */
   3711        1.1    nonaka #undef OFDM
   3712        1.1    nonaka #undef CCK
   3713        1.1    nonaka }
   3714        1.1    nonaka 
   3715        1.1    nonaka static void
   3716        1.1    nonaka run_set_txpreamble(struct run_softc *sc)
   3717        1.1    nonaka {
   3718        1.1    nonaka 	uint32_t tmp;
   3719        1.1    nonaka 
   3720        1.1    nonaka 	run_read(sc, RT2860_AUTO_RSP_CFG, &tmp);
   3721        1.1    nonaka 	if (sc->sc_ic.ic_flags & IEEE80211_F_SHPREAMBLE)
   3722        1.1    nonaka 		tmp |= RT2860_CCK_SHORT_EN;
   3723        1.1    nonaka 	else
   3724        1.1    nonaka 		tmp &= ~RT2860_CCK_SHORT_EN;
   3725        1.1    nonaka 	run_write(sc, RT2860_AUTO_RSP_CFG, tmp);
   3726        1.1    nonaka }
   3727        1.1    nonaka 
   3728        1.1    nonaka static void
   3729        1.1    nonaka run_set_basicrates(struct run_softc *sc)
   3730        1.1    nonaka {
   3731        1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   3732        1.1    nonaka 
   3733        1.1    nonaka 	/* set basic rates mask */
   3734        1.1    nonaka 	if (ic->ic_curmode == IEEE80211_MODE_11B)
   3735        1.1    nonaka 		run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x003);
   3736        1.1    nonaka 	else if (ic->ic_curmode == IEEE80211_MODE_11A)
   3737        1.1    nonaka 		run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x150);
   3738        1.1    nonaka 	else	/* 11g */
   3739        1.1    nonaka 		run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x15f);
   3740        1.1    nonaka }
   3741        1.1    nonaka 
   3742        1.1    nonaka static void
   3743        1.1    nonaka run_set_leds(struct run_softc *sc, uint16_t which)
   3744        1.1    nonaka {
   3745        1.1    nonaka 
   3746        1.1    nonaka 	(void)run_mcu_cmd(sc, RT2860_MCU_CMD_LEDS,
   3747        1.1    nonaka 	    which | (sc->leds & 0x7f));
   3748        1.1    nonaka }
   3749        1.1    nonaka 
   3750        1.1    nonaka static void
   3751        1.1    nonaka run_set_bssid(struct run_softc *sc, const uint8_t *bssid)
   3752        1.1    nonaka {
   3753        1.1    nonaka 
   3754        1.1    nonaka 	run_write(sc, RT2860_MAC_BSSID_DW0,
   3755        1.1    nonaka 	    bssid[0] | bssid[1] << 8 | bssid[2] << 16 | bssid[3] << 24);
   3756        1.1    nonaka 	run_write(sc, RT2860_MAC_BSSID_DW1,
   3757        1.1    nonaka 	    bssid[4] | bssid[5] << 8);
   3758        1.1    nonaka }
   3759        1.1    nonaka 
   3760        1.1    nonaka static void
   3761        1.1    nonaka run_set_macaddr(struct run_softc *sc, const uint8_t *addr)
   3762        1.1    nonaka {
   3763        1.1    nonaka 
   3764        1.1    nonaka 	run_write(sc, RT2860_MAC_ADDR_DW0,
   3765        1.1    nonaka 	    addr[0] | addr[1] << 8 | addr[2] << 16 | addr[3] << 24);
   3766        1.1    nonaka 	run_write(sc, RT2860_MAC_ADDR_DW1,
   3767        1.1    nonaka 	    addr[4] | addr[5] << 8 | 0xff << 16);
   3768        1.1    nonaka }
   3769        1.1    nonaka 
   3770        1.1    nonaka static void
   3771        1.1    nonaka run_updateslot(struct ifnet *ifp)
   3772        1.1    nonaka {
   3773        1.1    nonaka 
   3774        1.1    nonaka 	/* do it in a process context */
   3775        1.1    nonaka 	run_do_async(ifp->if_softc, run_updateslot_cb, NULL, 0);
   3776        1.1    nonaka }
   3777        1.1    nonaka 
   3778        1.1    nonaka /* ARGSUSED */
   3779        1.1    nonaka static void
   3780        1.1    nonaka run_updateslot_cb(struct run_softc *sc, void *arg)
   3781        1.1    nonaka {
   3782        1.1    nonaka 	uint32_t tmp;
   3783        1.1    nonaka 
   3784        1.1    nonaka 	run_read(sc, RT2860_BKOFF_SLOT_CFG, &tmp);
   3785        1.1    nonaka 	tmp &= ~0xff;
   3786        1.1    nonaka 	tmp |= (sc->sc_ic.ic_flags & IEEE80211_F_SHSLOT) ? 9 : 20;
   3787        1.1    nonaka 	run_write(sc, RT2860_BKOFF_SLOT_CFG, tmp);
   3788        1.1    nonaka }
   3789        1.1    nonaka 
   3790        1.1    nonaka static int8_t
   3791        1.1    nonaka run_rssi2dbm(struct run_softc *sc, uint8_t rssi, uint8_t rxchain)
   3792        1.1    nonaka {
   3793        1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   3794        1.1    nonaka 	struct ieee80211_channel *c = ic->ic_curchan;
   3795        1.1    nonaka 	int delta;
   3796        1.1    nonaka 
   3797        1.1    nonaka 	if (IEEE80211_IS_CHAN_5GHZ(c)) {
   3798        1.1    nonaka 		u_int chan = ieee80211_chan2ieee(ic, c);
   3799        1.1    nonaka 		delta = sc->rssi_5ghz[rxchain];
   3800        1.1    nonaka 
   3801        1.1    nonaka 		/* determine channel group */
   3802        1.1    nonaka 		if (chan <= 64)
   3803        1.1    nonaka 			delta -= sc->lna[1];
   3804        1.1    nonaka 		else if (chan <= 128)
   3805        1.1    nonaka 			delta -= sc->lna[2];
   3806        1.1    nonaka 		else
   3807        1.1    nonaka 			delta -= sc->lna[3];
   3808        1.1    nonaka 	} else
   3809        1.1    nonaka 		delta = sc->rssi_2ghz[rxchain] - sc->lna[0];
   3810        1.1    nonaka 
   3811   1.10.6.2     skrll 	return -12 - delta - rssi;
   3812        1.1    nonaka }
   3813        1.1    nonaka 
   3814  1.10.6.11     skrll static void
   3815  1.10.6.11     skrll run_rt5390_bbp_init(struct run_softc *sc)
   3816  1.10.6.11     skrll {
   3817  1.10.6.11     skrll 	u_int i;
   3818  1.10.6.11     skrll 	uint8_t bbp;
   3819  1.10.6.11     skrll 
   3820  1.10.6.11     skrll 	/* Apply maximum likelihood detection for 2 stream case. */
   3821  1.10.6.11     skrll 	run_bbp_read(sc, 105, &bbp);
   3822  1.10.6.11     skrll 	if (sc->nrxchains > 1)
   3823  1.10.6.11     skrll 		run_bbp_write(sc, 105, bbp | RT5390_MLD);
   3824  1.10.6.11     skrll 
   3825  1.10.6.11     skrll 	/* Avoid data lost and CRC error. */
   3826  1.10.6.11     skrll 	run_bbp_read(sc, 4, &bbp);
   3827  1.10.6.11     skrll 	run_bbp_write(sc, 4, bbp | RT5390_MAC_IF_CTRL);
   3828  1.10.6.11     skrll 
   3829  1.10.6.11     skrll 	if (sc->mac_ver == 0x5592) {
   3830  1.10.6.11     skrll 		for (i = 0; i < (int)__arraycount(rt5592_def_bbp); i++) {
   3831  1.10.6.11     skrll 			run_bbp_write(sc, rt5592_def_bbp[i].reg,
   3832  1.10.6.11     skrll 			    rt5592_def_bbp[i].val);
   3833  1.10.6.11     skrll 		}
   3834  1.10.6.11     skrll 		for (i = 0; i < (int)__arraycount(rt5592_bbp_r196); i++) {
   3835  1.10.6.11     skrll 			run_bbp_write(sc, 195, i + 0x80);
   3836  1.10.6.11     skrll 			run_bbp_write(sc, 196, rt5592_bbp_r196[i]);
   3837  1.10.6.11     skrll 		}
   3838  1.10.6.11     skrll 	} else {
   3839  1.10.6.11     skrll 		for (i = 0; i < (int)__arraycount(rt5390_def_bbp); i++) {
   3840  1.10.6.11     skrll 			run_bbp_write(sc, rt5390_def_bbp[i].reg,
   3841  1.10.6.11     skrll 			    rt5390_def_bbp[i].val);
   3842  1.10.6.11     skrll 		}
   3843  1.10.6.11     skrll 	}
   3844  1.10.6.11     skrll 	if (sc->mac_ver == 0x5392) {
   3845  1.10.6.11     skrll 		run_bbp_write(sc, 88, 0x90);
   3846  1.10.6.11     skrll 		run_bbp_write(sc, 95, 0x9a);
   3847  1.10.6.11     skrll 		run_bbp_write(sc, 98, 0x12);
   3848  1.10.6.11     skrll 		run_bbp_write(sc, 106, 0x12);
   3849  1.10.6.11     skrll 		run_bbp_write(sc, 134, 0xd0);
   3850  1.10.6.11     skrll 		run_bbp_write(sc, 135, 0xf6);
   3851  1.10.6.11     skrll 		run_bbp_write(sc, 148, 0x84);
   3852  1.10.6.11     skrll 	}
   3853  1.10.6.11     skrll 
   3854  1.10.6.11     skrll 	run_bbp_read(sc, 152, &bbp);
   3855  1.10.6.11     skrll 	run_bbp_write(sc, 152, bbp | 0x80);
   3856  1.10.6.11     skrll 
   3857  1.10.6.11     skrll 	/* Fix BBP254 for RT5592C. */
   3858  1.10.6.11     skrll 	if (sc->mac_ver == 0x5592 && sc->mac_rev >= 0x0221) {
   3859  1.10.6.11     skrll 		run_bbp_read(sc, 254, &bbp);
   3860  1.10.6.11     skrll 		run_bbp_write(sc, 254, bbp | 0x80);
   3861  1.10.6.11     skrll 	}
   3862  1.10.6.11     skrll 
   3863  1.10.6.11     skrll 	/* Disable hardware antenna diversity. */
   3864  1.10.6.11     skrll 	if (sc->mac_ver == 0x5390)
   3865  1.10.6.11     skrll 		run_bbp_write(sc, 154, 0);
   3866  1.10.6.11     skrll 
   3867  1.10.6.11     skrll 	/* Initialize Rx CCK/OFDM frequency offset report. */
   3868  1.10.6.11     skrll 	run_bbp_write(sc, 142, 1);
   3869  1.10.6.11     skrll 	run_bbp_write(sc, 143, 57);
   3870  1.10.6.11     skrll }
   3871  1.10.6.11     skrll 
   3872        1.1    nonaka static int
   3873        1.1    nonaka run_bbp_init(struct run_softc *sc)
   3874        1.1    nonaka {
   3875        1.1    nonaka 	int i, error, ntries;
   3876        1.1    nonaka 	uint8_t bbp0;
   3877        1.1    nonaka 
   3878        1.1    nonaka 	/* wait for BBP to wake up */
   3879        1.1    nonaka 	for (ntries = 0; ntries < 20; ntries++) {
   3880        1.1    nonaka 		if ((error = run_bbp_read(sc, 0, &bbp0)) != 0)
   3881   1.10.6.2     skrll 			return error;
   3882        1.1    nonaka 		if (bbp0 != 0 && bbp0 != 0xff)
   3883        1.1    nonaka 			break;
   3884        1.1    nonaka 	}
   3885        1.1    nonaka 	if (ntries == 20)
   3886   1.10.6.2     skrll 		return ETIMEDOUT;
   3887        1.1    nonaka 
   3888        1.1    nonaka 	/* initialize BBP registers to default values */
   3889  1.10.6.11     skrll 	if (sc->mac_ver >= 0x5390)
   3890  1.10.6.11     skrll 		run_rt5390_bbp_init(sc);
   3891  1.10.6.11     skrll 	else {
   3892  1.10.6.11     skrll 		for (i = 0; i < (int)__arraycount(rt2860_def_bbp); i++) {
   3893  1.10.6.11     skrll 			run_bbp_write(sc, rt2860_def_bbp[i].reg,
   3894  1.10.6.11     skrll 			    rt2860_def_bbp[i].val);
   3895  1.10.6.11     skrll 		}
   3896  1.10.6.11     skrll 	}
   3897  1.10.6.11     skrll 
   3898  1.10.6.11     skrll 	if (sc->mac_ver == 0x3593) {
   3899  1.10.6.11     skrll 		run_bbp_write(sc, 79, 0x13);
   3900  1.10.6.11     skrll 		run_bbp_write(sc, 80, 0x05);
   3901  1.10.6.11     skrll 		run_bbp_write(sc, 81, 0x33);
   3902  1.10.6.11     skrll 		run_bbp_write(sc, 86, 0x46);
   3903  1.10.6.11     skrll 		run_bbp_write(sc, 137, 0x0f);
   3904        1.1    nonaka 	}
   3905        1.1    nonaka 
   3906        1.1    nonaka 	/* fix BBP84 for RT2860E */
   3907        1.1    nonaka 	if (sc->mac_ver == 0x2860 && sc->mac_rev != 0x0101)
   3908        1.1    nonaka 		run_bbp_write(sc, 84, 0x19);
   3909        1.1    nonaka 
   3910        1.1    nonaka 	if (sc->mac_ver >= 0x3070) {
   3911        1.1    nonaka 		run_bbp_write(sc, 79, 0x13);
   3912        1.1    nonaka 		run_bbp_write(sc, 80, 0x05);
   3913        1.1    nonaka 		run_bbp_write(sc, 81, 0x33);
   3914        1.1    nonaka 	} else if (sc->mac_ver == 0x2860 && sc->mac_rev == 0x0100) {
   3915        1.1    nonaka 		run_bbp_write(sc, 69, 0x16);
   3916        1.1    nonaka 		run_bbp_write(sc, 73, 0x12);
   3917        1.1    nonaka 	}
   3918   1.10.6.2     skrll 	return 0;
   3919        1.1    nonaka }
   3920        1.1    nonaka 
   3921        1.1    nonaka static int
   3922        1.1    nonaka run_rt3070_rf_init(struct run_softc *sc)
   3923        1.1    nonaka {
   3924        1.1    nonaka 	uint32_t tmp;
   3925        1.1    nonaka 	uint8_t rf, target, bbp4;
   3926        1.1    nonaka 	int i;
   3927        1.1    nonaka 
   3928        1.1    nonaka 	run_rt3070_rf_read(sc, 30, &rf);
   3929        1.1    nonaka 	/* toggle RF R30 bit 7 */
   3930        1.1    nonaka 	run_rt3070_rf_write(sc, 30, rf | 0x80);
   3931  1.10.6.11     skrll 	usbd_delay_ms(sc->sc_udev, 10);
   3932        1.1    nonaka 	run_rt3070_rf_write(sc, 30, rf & ~0x80);
   3933        1.1    nonaka 
   3934        1.1    nonaka 	/* initialize RF registers to default value */
   3935        1.1    nonaka 	if (sc->mac_ver == 0x3572) {
   3936        1.1    nonaka 		for (i = 0; i < (int)__arraycount(rt3572_def_rf); i++) {
   3937        1.1    nonaka 			run_rt3070_rf_write(sc, rt3572_def_rf[i].reg,
   3938        1.1    nonaka 			    rt3572_def_rf[i].val);
   3939        1.1    nonaka 		}
   3940        1.1    nonaka 	} else {
   3941        1.1    nonaka 		for (i = 0; i < (int)__arraycount(rt3070_def_rf); i++) {
   3942        1.1    nonaka 			run_rt3070_rf_write(sc, rt3070_def_rf[i].reg,
   3943        1.1    nonaka 			    rt3070_def_rf[i].val);
   3944        1.1    nonaka 		}
   3945        1.1    nonaka 	}
   3946        1.1    nonaka 	if (sc->mac_ver == 0x3572) {
   3947        1.1    nonaka 		run_rt3070_rf_read(sc, 6, &rf);
   3948        1.1    nonaka 		run_rt3070_rf_write(sc, 6, rf | 0x40);
   3949  1.10.6.11     skrll 		run_rt3070_rf_write(sc, 31, 0x14);
   3950        1.1    nonaka 
   3951        1.1    nonaka 		run_read(sc, RT3070_LDO_CFG0, &tmp);
   3952  1.10.6.11     skrll 		tmp &= ~0x1f000000;
   3953  1.10.6.11     skrll 		if (sc->mac_rev < 0x0211 && sc->patch_dac)
   3954  1.10.6.11     skrll 			tmp |= 0x0d000000;	/* 1.3V */
   3955  1.10.6.11     skrll 		else
   3956  1.10.6.11     skrll 			tmp |= 0x01000000;	/* 1.2V */
   3957        1.1    nonaka 		run_write(sc, RT3070_LDO_CFG0, tmp);
   3958        1.1    nonaka 	} else if (sc->mac_ver == 0x3071) {
   3959        1.1    nonaka 		run_rt3070_rf_read(sc, 6, &rf);
   3960        1.1    nonaka 		run_rt3070_rf_write(sc, 6, rf | 0x40);
   3961        1.1    nonaka 		run_rt3070_rf_write(sc, 31, 0x14);
   3962        1.1    nonaka 
   3963        1.1    nonaka 		run_read(sc, RT3070_LDO_CFG0, &tmp);
   3964        1.1    nonaka 		tmp &= ~0x1f000000;
   3965        1.1    nonaka 		if (sc->mac_rev < 0x0211)
   3966        1.1    nonaka 			tmp |= 0x0d000000;	/* 1.35V */
   3967        1.1    nonaka 		else
   3968        1.1    nonaka 			tmp |= 0x01000000;	/* 1.2V */
   3969        1.1    nonaka 		run_write(sc, RT3070_LDO_CFG0, tmp);
   3970        1.1    nonaka 
   3971        1.1    nonaka 		/* patch LNA_PE_G1 */
   3972        1.1    nonaka 		run_read(sc, RT3070_GPIO_SWITCH, &tmp);
   3973        1.1    nonaka 		run_write(sc, RT3070_GPIO_SWITCH, tmp & ~0x20);
   3974        1.1    nonaka 	} else if (sc->mac_ver == 0x3070) {
   3975        1.1    nonaka 		/* increase voltage from 1.2V to 1.35V */
   3976        1.1    nonaka 		run_read(sc, RT3070_LDO_CFG0, &tmp);
   3977        1.1    nonaka 		tmp = (tmp & ~0x0f000000) | 0x0d000000;
   3978        1.1    nonaka 		run_write(sc, RT3070_LDO_CFG0, tmp);
   3979        1.1    nonaka 	}
   3980        1.1    nonaka 
   3981        1.1    nonaka 	/* select 20MHz bandwidth */
   3982        1.1    nonaka 	run_rt3070_rf_read(sc, 31, &rf);
   3983        1.1    nonaka 	run_rt3070_rf_write(sc, 31, rf & ~0x20);
   3984        1.1    nonaka 
   3985        1.1    nonaka 	/* calibrate filter for 20MHz bandwidth */
   3986        1.1    nonaka 	sc->rf24_20mhz = 0x1f;	/* default value */
   3987        1.1    nonaka 	target = (sc->mac_ver < 0x3071) ? 0x16 : 0x13;
   3988        1.1    nonaka 	run_rt3070_filter_calib(sc, 0x07, target, &sc->rf24_20mhz);
   3989        1.1    nonaka 
   3990        1.1    nonaka 	/* select 40MHz bandwidth */
   3991        1.1    nonaka 	run_bbp_read(sc, 4, &bbp4);
   3992        1.1    nonaka 	run_bbp_write(sc, 4, (bbp4 & ~0x08) | 0x10);
   3993        1.1    nonaka 	run_rt3070_rf_read(sc, 31, &rf);
   3994        1.1    nonaka 	run_rt3070_rf_write(sc, 31, rf | 0x20);
   3995        1.1    nonaka 
   3996        1.1    nonaka 	/* calibrate filter for 40MHz bandwidth */
   3997        1.1    nonaka 	sc->rf24_40mhz = 0x2f;	/* default value */
   3998        1.1    nonaka 	target = (sc->mac_ver < 0x3071) ? 0x19 : 0x15;
   3999        1.1    nonaka 	run_rt3070_filter_calib(sc, 0x27, target, &sc->rf24_40mhz);
   4000        1.1    nonaka 
   4001        1.1    nonaka 	/* go back to 20MHz bandwidth */
   4002        1.1    nonaka 	run_bbp_read(sc, 4, &bbp4);
   4003        1.1    nonaka 	run_bbp_write(sc, 4, bbp4 & ~0x18);
   4004        1.1    nonaka 
   4005        1.1    nonaka 	if (sc->mac_ver == 0x3572) {
   4006        1.1    nonaka 		/* save default BBP registers 25 and 26 values */
   4007        1.1    nonaka 		run_bbp_read(sc, 25, &sc->bbp25);
   4008        1.1    nonaka 		run_bbp_read(sc, 26, &sc->bbp26);
   4009        1.1    nonaka 	} else if (sc->mac_rev < 0x0211)
   4010        1.1    nonaka 		run_rt3070_rf_write(sc, 27, 0x03);
   4011        1.1    nonaka 
   4012        1.1    nonaka 	run_read(sc, RT3070_OPT_14, &tmp);
   4013        1.1    nonaka 	run_write(sc, RT3070_OPT_14, tmp | 1);
   4014        1.1    nonaka 
   4015        1.1    nonaka 	if (sc->mac_ver == 0x3070 || sc->mac_ver == 0x3071) {
   4016        1.1    nonaka 		run_rt3070_rf_read(sc, 17, &rf);
   4017        1.1    nonaka 		rf &= ~RT3070_TX_LO1;
   4018        1.1    nonaka 		if ((sc->mac_ver == 0x3070 ||
   4019        1.1    nonaka 		     (sc->mac_ver == 0x3071 && sc->mac_rev >= 0x0211)) &&
   4020        1.1    nonaka 		    !sc->ext_2ghz_lna)
   4021        1.1    nonaka 			rf |= 0x20;	/* fix for long range Rx issue */
   4022        1.1    nonaka 		if (sc->txmixgain_2ghz >= 1)
   4023        1.1    nonaka 			rf = (rf & ~0x7) | sc->txmixgain_2ghz;
   4024        1.1    nonaka 		run_rt3070_rf_write(sc, 17, rf);
   4025        1.1    nonaka 	}
   4026        1.1    nonaka 	if (sc->mac_ver == 0x3071) {
   4027        1.1    nonaka 		run_rt3070_rf_read(sc, 1, &rf);
   4028        1.1    nonaka 		rf &= ~(RT3070_RX0_PD | RT3070_TX0_PD);
   4029        1.1    nonaka 		rf |= RT3070_RF_BLOCK | RT3070_RX1_PD | RT3070_TX1_PD;
   4030        1.1    nonaka 		run_rt3070_rf_write(sc, 1, rf);
   4031        1.1    nonaka 
   4032        1.1    nonaka 		run_rt3070_rf_read(sc, 15, &rf);
   4033        1.1    nonaka 		run_rt3070_rf_write(sc, 15, rf & ~RT3070_TX_LO2);
   4034        1.1    nonaka 
   4035        1.1    nonaka 		run_rt3070_rf_read(sc, 20, &rf);
   4036        1.1    nonaka 		run_rt3070_rf_write(sc, 20, rf & ~RT3070_RX_LO1);
   4037        1.1    nonaka 
   4038        1.1    nonaka 		run_rt3070_rf_read(sc, 21, &rf);
   4039        1.1    nonaka 		run_rt3070_rf_write(sc, 21, rf & ~RT3070_RX_LO2);
   4040        1.1    nonaka 	}
   4041        1.1    nonaka 	if (sc->mac_ver == 0x3070 || sc->mac_ver == 0x3071) {
   4042        1.1    nonaka 		/* fix Tx to Rx IQ glitch by raising RF voltage */
   4043        1.1    nonaka 		run_rt3070_rf_read(sc, 27, &rf);
   4044        1.1    nonaka 		rf &= ~0x77;
   4045        1.1    nonaka 		if (sc->mac_rev < 0x0211)
   4046        1.1    nonaka 			rf |= 0x03;
   4047        1.1    nonaka 		run_rt3070_rf_write(sc, 27, rf);
   4048        1.1    nonaka 	}
   4049   1.10.6.2     skrll 	return 0;
   4050        1.1    nonaka }
   4051        1.1    nonaka 
   4052        1.1    nonaka static int
   4053  1.10.6.11     skrll run_rt3593_rf_init(struct run_softc *sc)
   4054  1.10.6.11     skrll {
   4055  1.10.6.11     skrll 	uint32_t tmp;
   4056  1.10.6.11     skrll 	uint8_t rf;
   4057  1.10.6.11     skrll 	int i;
   4058  1.10.6.11     skrll 
   4059  1.10.6.11     skrll 	/* Disable the GPIO bits 4 and 7 for LNA PE control. */
   4060  1.10.6.11     skrll 	run_read(sc, RT3070_GPIO_SWITCH, &tmp);
   4061  1.10.6.11     skrll 	tmp &= ~(1 << 4 | 1 << 7);
   4062  1.10.6.11     skrll 	run_write(sc, RT3070_GPIO_SWITCH, tmp);
   4063  1.10.6.11     skrll 
   4064  1.10.6.11     skrll 	/* Initialize RF registers to default value. */
   4065  1.10.6.11     skrll 	for (i = 0; i < __arraycount(rt3593_def_rf); i++) {
   4066  1.10.6.11     skrll 		run_rt3070_rf_write(sc, rt3593_def_rf[i].reg,
   4067  1.10.6.11     skrll 			rt3593_def_rf[i].val);
   4068  1.10.6.11     skrll 	}
   4069  1.10.6.11     skrll 
   4070  1.10.6.11     skrll 	/* Toggle RF R2 to initiate calibration. */
   4071  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 2, RT5390_RESCAL);
   4072  1.10.6.11     skrll 
   4073  1.10.6.11     skrll 	/* Initialize RF frequency offset. */
   4074  1.10.6.11     skrll 	run_adjust_freq_offset(sc);
   4075  1.10.6.11     skrll 
   4076  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 18, &rf);
   4077  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 18, rf | RT3593_AUTOTUNE_BYPASS);
   4078  1.10.6.11     skrll 
   4079  1.10.6.11     skrll 	/*
   4080  1.10.6.11     skrll 	 * Increase voltage from 1.2V to 1.35V, wait for 1 msec to
   4081  1.10.6.11     skrll 	 * decrease voltage back to 1.2V.
   4082  1.10.6.11     skrll 	 */
   4083  1.10.6.11     skrll 	run_read(sc, RT3070_LDO_CFG0, &tmp);
   4084  1.10.6.11     skrll 	tmp = (tmp & ~0x1f000000) | 0x0d000000;
   4085  1.10.6.11     skrll 	run_write(sc, RT3070_LDO_CFG0, tmp);
   4086  1.10.6.11     skrll 	usbd_delay_ms(sc->sc_udev, 1);
   4087  1.10.6.11     skrll 	tmp = (tmp & ~0x1f000000) | 0x01000000;
   4088  1.10.6.11     skrll 	run_write(sc, RT3070_LDO_CFG0, tmp);
   4089  1.10.6.11     skrll 
   4090  1.10.6.11     skrll 	sc->rf24_20mhz = 0x1f;
   4091  1.10.6.11     skrll 	sc->rf24_40mhz = 0x2f;
   4092  1.10.6.11     skrll 
   4093  1.10.6.11     skrll 	/* Save default BBP registers 25 and 26 values. */
   4094  1.10.6.11     skrll 	run_bbp_read(sc, 25, &sc->bbp25);
   4095  1.10.6.11     skrll 	run_bbp_read(sc, 26, &sc->bbp26);
   4096  1.10.6.11     skrll 
   4097  1.10.6.11     skrll 	run_read(sc, RT3070_OPT_14, &tmp);
   4098  1.10.6.11     skrll 	run_write(sc, RT3070_OPT_14, tmp | 1);
   4099  1.10.6.11     skrll 	return (0);
   4100  1.10.6.11     skrll }
   4101  1.10.6.11     skrll 
   4102  1.10.6.11     skrll static int
   4103  1.10.6.11     skrll run_rt5390_rf_init(struct run_softc *sc)
   4104  1.10.6.11     skrll {
   4105  1.10.6.11     skrll 	uint32_t tmp;
   4106  1.10.6.11     skrll 	uint8_t rf;
   4107  1.10.6.11     skrll 	int i;
   4108  1.10.6.11     skrll 
   4109  1.10.6.11     skrll 	/* Toggle RF R2 to initiate calibration. */
   4110  1.10.6.11     skrll 	if (sc->mac_ver == 0x5390) {
   4111  1.10.6.11     skrll 		run_rt3070_rf_read(sc, 2, &rf);
   4112  1.10.6.11     skrll 		run_rt3070_rf_write(sc, 2, rf | RT5390_RESCAL);
   4113  1.10.6.11     skrll 		usbd_delay_ms(sc->sc_udev, 10);
   4114  1.10.6.11     skrll 		run_rt3070_rf_write(sc, 2, rf & ~RT5390_RESCAL);
   4115  1.10.6.11     skrll 	} else {
   4116  1.10.6.11     skrll 		run_rt3070_rf_write(sc, 2, RT5390_RESCAL);
   4117  1.10.6.11     skrll 		usbd_delay_ms(sc->sc_udev, 10);
   4118  1.10.6.11     skrll 	}
   4119  1.10.6.11     skrll 
   4120  1.10.6.11     skrll 	/* Initialize RF registers to default value. */
   4121  1.10.6.11     skrll 	if (sc->mac_ver == 0x5592) {
   4122  1.10.6.11     skrll 		for (i = 0; i < __arraycount(rt5592_def_rf); i++) {
   4123  1.10.6.11     skrll 			run_rt3070_rf_write(sc, rt5592_def_rf[i].reg,
   4124  1.10.6.11     skrll 			    rt5592_def_rf[i].val);
   4125  1.10.6.11     skrll 		}
   4126  1.10.6.11     skrll 		/* Initialize RF frequency offset. */
   4127  1.10.6.11     skrll 		run_adjust_freq_offset(sc);
   4128  1.10.6.11     skrll 	} else if (sc->mac_ver == 0x5392) {
   4129  1.10.6.11     skrll 		for (i = 0; i < __arraycount(rt5392_def_rf); i++) {
   4130  1.10.6.11     skrll 			run_rt3070_rf_write(sc, rt5392_def_rf[i].reg,
   4131  1.10.6.11     skrll 			    rt5392_def_rf[i].val);
   4132  1.10.6.11     skrll 		}
   4133  1.10.6.11     skrll 		if (sc->mac_rev >= 0x0223) {
   4134  1.10.6.11     skrll 			run_rt3070_rf_write(sc, 23, 0x0f);
   4135  1.10.6.11     skrll 			run_rt3070_rf_write(sc, 24, 0x3e);
   4136  1.10.6.11     skrll 			run_rt3070_rf_write(sc, 51, 0x32);
   4137  1.10.6.11     skrll 			run_rt3070_rf_write(sc, 53, 0x22);
   4138  1.10.6.11     skrll 			run_rt3070_rf_write(sc, 56, 0xc1);
   4139  1.10.6.11     skrll 			run_rt3070_rf_write(sc, 59, 0x0f);
   4140  1.10.6.11     skrll 		}
   4141  1.10.6.11     skrll 	} else {
   4142  1.10.6.11     skrll 		for (i = 0; i < __arraycount(rt5390_def_rf); i++) {
   4143  1.10.6.11     skrll 			run_rt3070_rf_write(sc, rt5390_def_rf[i].reg,
   4144  1.10.6.11     skrll 			    rt5390_def_rf[i].val);
   4145  1.10.6.11     skrll 		}
   4146  1.10.6.11     skrll 		if (sc->mac_rev >= 0x0502) {
   4147  1.10.6.11     skrll 			run_rt3070_rf_write(sc, 6, 0xe0);
   4148  1.10.6.11     skrll 			run_rt3070_rf_write(sc, 25, 0x80);
   4149  1.10.6.11     skrll 			run_rt3070_rf_write(sc, 46, 0x73);
   4150  1.10.6.11     skrll 			run_rt3070_rf_write(sc, 53, 0x00);
   4151  1.10.6.11     skrll 			run_rt3070_rf_write(sc, 56, 0x42);
   4152  1.10.6.11     skrll 			run_rt3070_rf_write(sc, 61, 0xd1);
   4153  1.10.6.11     skrll 		}
   4154  1.10.6.11     skrll 	}
   4155  1.10.6.11     skrll 
   4156  1.10.6.11     skrll 	sc->rf24_20mhz = 0x1f;  /* default value */
   4157  1.10.6.11     skrll 	sc->rf24_40mhz = (sc->mac_ver == 0x5592) ? 0 : 0x2f;
   4158  1.10.6.11     skrll 
   4159  1.10.6.11     skrll 	if (sc->mac_rev < 0x0211)
   4160  1.10.6.11     skrll 		run_rt3070_rf_write(sc, 27, 0x3);
   4161  1.10.6.11     skrll 
   4162  1.10.6.11     skrll 	run_read(sc, RT3070_OPT_14, &tmp);
   4163  1.10.6.11     skrll 	run_write(sc, RT3070_OPT_14, tmp | 1);
   4164  1.10.6.11     skrll 	return (0);
   4165  1.10.6.11     skrll }
   4166  1.10.6.11     skrll 
   4167  1.10.6.11     skrll static int
   4168        1.1    nonaka run_rt3070_filter_calib(struct run_softc *sc, uint8_t init, uint8_t target,
   4169        1.1    nonaka     uint8_t *val)
   4170        1.1    nonaka {
   4171        1.1    nonaka 	uint8_t rf22, rf24;
   4172        1.1    nonaka 	uint8_t bbp55_pb, bbp55_sb, delta;
   4173        1.1    nonaka 	int ntries;
   4174        1.1    nonaka 
   4175        1.1    nonaka 	/* program filter */
   4176        1.1    nonaka 	run_rt3070_rf_read(sc, 24, &rf24);
   4177        1.1    nonaka 	rf24 = (rf24 & 0xc0) | init;    /* initial filter value */
   4178        1.1    nonaka 	run_rt3070_rf_write(sc, 24, rf24);
   4179        1.1    nonaka 
   4180        1.1    nonaka 	/* enable baseband loopback mode */
   4181        1.1    nonaka 	run_rt3070_rf_read(sc, 22, &rf22);
   4182        1.1    nonaka 	run_rt3070_rf_write(sc, 22, rf22 | 0x01);
   4183        1.1    nonaka 
   4184        1.1    nonaka 	/* set power and frequency of passband test tone */
   4185        1.1    nonaka 	run_bbp_write(sc, 24, 0x00);
   4186        1.1    nonaka 	for (ntries = 0; ntries < 100; ntries++) {
   4187        1.1    nonaka 		/* transmit test tone */
   4188        1.1    nonaka 		run_bbp_write(sc, 25, 0x90);
   4189  1.10.6.11     skrll 		usbd_delay_ms(sc->sc_udev, 10);
   4190        1.1    nonaka 		/* read received power */
   4191        1.1    nonaka 		run_bbp_read(sc, 55, &bbp55_pb);
   4192        1.1    nonaka 		if (bbp55_pb != 0)
   4193        1.1    nonaka 			break;
   4194        1.1    nonaka 	}
   4195        1.1    nonaka 	if (ntries == 100)
   4196   1.10.6.2     skrll 		return ETIMEDOUT;
   4197        1.1    nonaka 
   4198        1.1    nonaka 	/* set power and frequency of stopband test tone */
   4199        1.1    nonaka 	run_bbp_write(sc, 24, 0x06);
   4200        1.1    nonaka 	for (ntries = 0; ntries < 100; ntries++) {
   4201        1.1    nonaka 		/* transmit test tone */
   4202        1.1    nonaka 		run_bbp_write(sc, 25, 0x90);
   4203  1.10.6.11     skrll 		usbd_delay_ms(sc->sc_udev, 10);
   4204        1.1    nonaka 		/* read received power */
   4205        1.1    nonaka 		run_bbp_read(sc, 55, &bbp55_sb);
   4206        1.1    nonaka 
   4207        1.1    nonaka 		delta = bbp55_pb - bbp55_sb;
   4208        1.1    nonaka 		if (delta > target)
   4209        1.1    nonaka 			break;
   4210        1.1    nonaka 
   4211        1.1    nonaka 		/* reprogram filter */
   4212        1.1    nonaka 		rf24++;
   4213        1.1    nonaka 		run_rt3070_rf_write(sc, 24, rf24);
   4214        1.1    nonaka 	}
   4215        1.1    nonaka 	if (ntries < 100) {
   4216        1.1    nonaka 		if (rf24 != init)
   4217        1.1    nonaka 			rf24--;	/* backtrack */
   4218        1.1    nonaka 		*val = rf24;
   4219        1.1    nonaka 		run_rt3070_rf_write(sc, 24, rf24);
   4220        1.1    nonaka 	}
   4221        1.1    nonaka 
   4222        1.1    nonaka 	/* restore initial state */
   4223        1.1    nonaka 	run_bbp_write(sc, 24, 0x00);
   4224        1.1    nonaka 
   4225        1.1    nonaka 	/* disable baseband loopback mode */
   4226        1.1    nonaka 	run_rt3070_rf_read(sc, 22, &rf22);
   4227        1.1    nonaka 	run_rt3070_rf_write(sc, 22, rf22 & ~0x01);
   4228        1.1    nonaka 
   4229   1.10.6.2     skrll 	return 0;
   4230        1.1    nonaka }
   4231        1.1    nonaka 
   4232        1.1    nonaka static void
   4233        1.1    nonaka run_rt3070_rf_setup(struct run_softc *sc)
   4234        1.1    nonaka {
   4235        1.1    nonaka 	uint8_t bbp, rf;
   4236        1.1    nonaka 	int i;
   4237        1.1    nonaka 
   4238        1.1    nonaka 	if (sc->mac_ver == 0x3572) {
   4239        1.1    nonaka 		/* enable DC filter */
   4240        1.1    nonaka 		if (sc->mac_rev >= 0x0201)
   4241        1.1    nonaka 			run_bbp_write(sc, 103, 0xc0);
   4242        1.1    nonaka 
   4243        1.1    nonaka 		run_bbp_read(sc, 138, &bbp);
   4244        1.1    nonaka 		if (sc->ntxchains == 1)
   4245        1.1    nonaka 			bbp |= 0x20;	/* turn off DAC1 */
   4246        1.1    nonaka 		if (sc->nrxchains == 1)
   4247        1.1    nonaka 			bbp &= ~0x02;	/* turn off ADC1 */
   4248        1.1    nonaka 		run_bbp_write(sc, 138, bbp);
   4249        1.1    nonaka 
   4250        1.1    nonaka 		if (sc->mac_rev >= 0x0211) {
   4251        1.1    nonaka 			/* improve power consumption */
   4252        1.1    nonaka 			run_bbp_read(sc, 31, &bbp);
   4253        1.1    nonaka 			run_bbp_write(sc, 31, bbp & ~0x03);
   4254        1.1    nonaka 		}
   4255        1.1    nonaka 
   4256        1.1    nonaka 		run_rt3070_rf_read(sc, 16, &rf);
   4257        1.1    nonaka 		rf = (rf & ~0x07) | sc->txmixgain_2ghz;
   4258        1.1    nonaka 		run_rt3070_rf_write(sc, 16, rf);
   4259        1.1    nonaka 	} else if (sc->mac_ver == 0x3071) {
   4260        1.1    nonaka 		/* enable DC filter */
   4261        1.1    nonaka 		if (sc->mac_rev >= 0x0201)
   4262        1.1    nonaka 			run_bbp_write(sc, 103, 0xc0);
   4263        1.1    nonaka 
   4264        1.1    nonaka 		run_bbp_read(sc, 138, &bbp);
   4265        1.1    nonaka 		if (sc->ntxchains == 1)
   4266        1.1    nonaka 			bbp |= 0x20;	/* turn off DAC1 */
   4267        1.1    nonaka 		if (sc->nrxchains == 1)
   4268        1.1    nonaka 			bbp &= ~0x02;	/* turn off ADC1 */
   4269        1.1    nonaka 		run_bbp_write(sc, 138, bbp);
   4270        1.1    nonaka 
   4271        1.1    nonaka 		if (sc->mac_rev >= 0x0211) {
   4272        1.1    nonaka 			/* improve power consumption */
   4273        1.1    nonaka 			run_bbp_read(sc, 31, &bbp);
   4274        1.1    nonaka 			run_bbp_write(sc, 31, bbp & ~0x03);
   4275        1.1    nonaka 		}
   4276        1.1    nonaka 
   4277        1.1    nonaka 		run_write(sc, RT2860_TX_SW_CFG1, 0);
   4278        1.1    nonaka 		if (sc->mac_rev < 0x0211) {
   4279        1.1    nonaka 			run_write(sc, RT2860_TX_SW_CFG2,
   4280        1.1    nonaka 			    sc->patch_dac ? 0x2c : 0x0f);
   4281        1.1    nonaka 		} else
   4282        1.1    nonaka 			run_write(sc, RT2860_TX_SW_CFG2, 0);
   4283        1.1    nonaka 	} else if (sc->mac_ver == 0x3070) {
   4284        1.1    nonaka 		if (sc->mac_rev >= 0x0201) {
   4285        1.1    nonaka 			/* enable DC filter */
   4286        1.1    nonaka 			run_bbp_write(sc, 103, 0xc0);
   4287        1.1    nonaka 
   4288        1.1    nonaka 			/* improve power consumption */
   4289        1.1    nonaka 			run_bbp_read(sc, 31, &bbp);
   4290        1.1    nonaka 			run_bbp_write(sc, 31, bbp & ~0x03);
   4291        1.1    nonaka 		}
   4292        1.1    nonaka 
   4293        1.1    nonaka 		if (sc->mac_rev < 0x0211) {
   4294        1.1    nonaka 			run_write(sc, RT2860_TX_SW_CFG1, 0);
   4295        1.1    nonaka 			run_write(sc, RT2860_TX_SW_CFG2, 0x2c);
   4296        1.1    nonaka 		} else
   4297        1.1    nonaka 			run_write(sc, RT2860_TX_SW_CFG2, 0);
   4298        1.1    nonaka 	}
   4299        1.1    nonaka 
   4300        1.1    nonaka 	/* initialize RF registers from ROM for >=RT3071*/
   4301        1.1    nonaka 	if (sc->mac_ver >= 0x3071) {
   4302        1.1    nonaka 		for (i = 0; i < 10; i++) {
   4303        1.1    nonaka 			if (sc->rf[i].reg == 0 || sc->rf[i].reg == 0xff)
   4304        1.1    nonaka 				continue;
   4305        1.1    nonaka 			run_rt3070_rf_write(sc, sc->rf[i].reg, sc->rf[i].val);
   4306        1.1    nonaka 		}
   4307        1.1    nonaka 	}
   4308        1.1    nonaka }
   4309        1.1    nonaka 
   4310  1.10.6.11     skrll static void
   4311  1.10.6.11     skrll run_rt3593_rf_setup(struct run_softc *sc)
   4312  1.10.6.11     skrll {
   4313  1.10.6.11     skrll 	uint8_t bbp, rf;
   4314  1.10.6.11     skrll 
   4315  1.10.6.11     skrll 	if (sc->mac_rev >= 0x0211) {
   4316  1.10.6.11     skrll 		/* Enable DC filter. */
   4317  1.10.6.11     skrll 		run_bbp_write(sc, 103, 0xc0);
   4318  1.10.6.11     skrll 	}
   4319  1.10.6.11     skrll 	run_write(sc, RT2860_TX_SW_CFG1, 0);
   4320  1.10.6.11     skrll 	if (sc->mac_rev < 0x0211) {
   4321  1.10.6.11     skrll 		run_write(sc, RT2860_TX_SW_CFG2,
   4322  1.10.6.11     skrll 		    sc->patch_dac ? 0x2c : 0x0f);
   4323  1.10.6.11     skrll 	} else
   4324  1.10.6.11     skrll 		run_write(sc, RT2860_TX_SW_CFG2, 0);
   4325  1.10.6.11     skrll 
   4326  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 50, &rf);
   4327  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 50, rf & ~RT3593_TX_LO2);
   4328  1.10.6.11     skrll 
   4329  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 51, &rf);
   4330  1.10.6.11     skrll 	rf = (rf & ~(RT3593_TX_LO1 | 0x0c)) |
   4331  1.10.6.11     skrll 	    ((sc->txmixgain_2ghz & 0x07) << 2);
   4332  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 51, rf);
   4333  1.10.6.11     skrll 
   4334  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 38, &rf);
   4335  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 38, rf & ~RT5390_RX_LO1);
   4336  1.10.6.11     skrll 
   4337  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 39, &rf);
   4338  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 39, rf & ~RT5390_RX_LO2);
   4339  1.10.6.11     skrll 
   4340  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 1, &rf);
   4341  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 1, rf & ~(RT3070_RF_BLOCK | RT3070_PLL_PD));
   4342  1.10.6.11     skrll 
   4343  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 30, &rf);
   4344  1.10.6.11     skrll 	rf = (rf & ~0x18) | 0x10;
   4345  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 30, rf);
   4346  1.10.6.11     skrll 
   4347  1.10.6.11     skrll 	/* Apply maximum likelihood detection for 2 stream case. */
   4348  1.10.6.11     skrll 	run_bbp_read(sc, 105, &bbp);
   4349  1.10.6.11     skrll 	if (sc->nrxchains > 1)
   4350  1.10.6.11     skrll 		run_bbp_write(sc, 105, bbp | RT5390_MLD);
   4351  1.10.6.11     skrll 
   4352  1.10.6.11     skrll 	/* Avoid data lost and CRC error. */
   4353  1.10.6.11     skrll 	run_bbp_read(sc, 4, &bbp);
   4354  1.10.6.11     skrll 	run_bbp_write(sc, 4, bbp | RT5390_MAC_IF_CTRL);
   4355  1.10.6.11     skrll 
   4356  1.10.6.11     skrll 	run_bbp_write(sc, 92, 0x02);
   4357  1.10.6.11     skrll 	run_bbp_write(sc, 82, 0x82);
   4358  1.10.6.11     skrll 	run_bbp_write(sc, 106, 0x05);
   4359  1.10.6.11     skrll 	run_bbp_write(sc, 104, 0x92);
   4360  1.10.6.11     skrll 	run_bbp_write(sc, 88, 0x90);
   4361  1.10.6.11     skrll 	run_bbp_write(sc, 148, 0xc8);
   4362  1.10.6.11     skrll 	run_bbp_write(sc, 47, 0x48);
   4363  1.10.6.11     skrll 	run_bbp_write(sc, 120, 0x50);
   4364  1.10.6.11     skrll 
   4365  1.10.6.11     skrll 	run_bbp_write(sc, 163, 0x9d);
   4366  1.10.6.11     skrll 
   4367  1.10.6.11     skrll 	/* SNR mapping. */
   4368  1.10.6.11     skrll 	run_bbp_write(sc, 142, 0x06);
   4369  1.10.6.11     skrll 	run_bbp_write(sc, 143, 0xa0);
   4370  1.10.6.11     skrll 	run_bbp_write(sc, 142, 0x07);
   4371  1.10.6.11     skrll 	run_bbp_write(sc, 143, 0xa1);
   4372  1.10.6.11     skrll 	run_bbp_write(sc, 142, 0x08);
   4373  1.10.6.11     skrll 	run_bbp_write(sc, 143, 0xa2);
   4374  1.10.6.11     skrll 
   4375  1.10.6.11     skrll 	run_bbp_write(sc, 31, 0x08);
   4376  1.10.6.11     skrll 	run_bbp_write(sc, 68, 0x0b);
   4377  1.10.6.11     skrll 	run_bbp_write(sc, 105, 0x04);
   4378  1.10.6.11     skrll }
   4379  1.10.6.11     skrll 
   4380  1.10.6.11     skrll static void
   4381  1.10.6.11     skrll run_rt5390_rf_setup(struct run_softc *sc)
   4382  1.10.6.11     skrll {
   4383  1.10.6.11     skrll 	uint8_t bbp, rf;
   4384  1.10.6.11     skrll 
   4385  1.10.6.11     skrll 	if (sc->mac_rev >= 0x0211) {
   4386  1.10.6.11     skrll 		/* Enable DC filter. */
   4387  1.10.6.11     skrll 		run_bbp_write(sc, 103, 0xc0);
   4388  1.10.6.11     skrll 
   4389  1.10.6.11     skrll 		if (sc->mac_ver != 0x5592) {
   4390  1.10.6.11     skrll 			/* Improve power consumption. */
   4391  1.10.6.11     skrll 			run_bbp_read(sc, 31, &bbp);
   4392  1.10.6.11     skrll 			run_bbp_write(sc, 31, bbp & ~0x03);
   4393  1.10.6.11     skrll 		}
   4394  1.10.6.11     skrll 	}
   4395  1.10.6.11     skrll 
   4396  1.10.6.11     skrll 	run_bbp_read(sc, 138, &bbp);
   4397  1.10.6.11     skrll 	if (sc->ntxchains == 1)
   4398  1.10.6.11     skrll 		bbp |= 0x20;    /* turn off DAC1 */
   4399  1.10.6.11     skrll 	if (sc->nrxchains == 1)
   4400  1.10.6.11     skrll 		bbp &= ~0x02;   /* turn off ADC1 */
   4401  1.10.6.11     skrll 	run_bbp_write(sc, 138, bbp);
   4402  1.10.6.11     skrll 
   4403  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 38, &rf);
   4404  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 38, rf & ~RT5390_RX_LO1);
   4405  1.10.6.11     skrll 
   4406  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 39, &rf);
   4407  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 39, rf & ~RT5390_RX_LO2);
   4408  1.10.6.11     skrll 
   4409  1.10.6.11     skrll 	/* Avoid data lost and CRC error. */
   4410  1.10.6.11     skrll 	run_bbp_read(sc, 4, &bbp);
   4411  1.10.6.11     skrll 	run_bbp_write(sc, 4, bbp | RT5390_MAC_IF_CTRL);
   4412  1.10.6.11     skrll 
   4413  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 30, &rf);
   4414  1.10.6.11     skrll 	rf = (rf & ~0x18) | 0x10;
   4415  1.10.6.11     skrll 	run_rt3070_rf_write(sc, 30, rf);
   4416  1.10.6.11     skrll 
   4417  1.10.6.11     skrll 	if (sc->mac_ver != 0x5592) {
   4418  1.10.6.11     skrll 		run_write(sc, RT2860_TX_SW_CFG1, 0);
   4419  1.10.6.11     skrll 		if (sc->mac_rev < 0x0211) {
   4420  1.10.6.11     skrll 			run_write(sc, RT2860_TX_SW_CFG2,
   4421  1.10.6.11     skrll 			    sc->patch_dac ? 0x2c : 0x0f);
   4422  1.10.6.11     skrll 		} else
   4423  1.10.6.11     skrll 			run_write(sc, RT2860_TX_SW_CFG2, 0);
   4424  1.10.6.11     skrll 	}
   4425  1.10.6.11     skrll }
   4426  1.10.6.11     skrll 
   4427        1.1    nonaka static int
   4428        1.1    nonaka run_txrx_enable(struct run_softc *sc)
   4429        1.1    nonaka {
   4430        1.1    nonaka 	uint32_t tmp;
   4431        1.1    nonaka 	int error, ntries;
   4432        1.1    nonaka 
   4433        1.1    nonaka 	run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_MAC_TX_EN);
   4434        1.1    nonaka 	for (ntries = 0; ntries < 200; ntries++) {
   4435        1.1    nonaka 		if ((error = run_read(sc, RT2860_WPDMA_GLO_CFG, &tmp)) != 0)
   4436   1.10.6.2     skrll 			return error;
   4437        1.1    nonaka 		if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0)
   4438        1.1    nonaka 			break;
   4439  1.10.6.11     skrll 		usbd_delay_ms(sc->sc_udev, 50);
   4440        1.1    nonaka 	}
   4441        1.1    nonaka 	if (ntries == 200)
   4442   1.10.6.2     skrll 		return ETIMEDOUT;
   4443        1.1    nonaka 
   4444  1.10.6.11     skrll 	usbd_delay_ms(sc->sc_udev, 50);
   4445        1.1    nonaka 
   4446        1.1    nonaka 	tmp |= RT2860_RX_DMA_EN | RT2860_TX_DMA_EN | RT2860_TX_WB_DDONE;
   4447        1.1    nonaka 	run_write(sc, RT2860_WPDMA_GLO_CFG, tmp);
   4448        1.1    nonaka 
   4449        1.1    nonaka 	/* enable Rx bulk aggregation (set timeout and limit) */
   4450        1.1    nonaka 	tmp = RT2860_USB_TX_EN | RT2860_USB_RX_EN | RT2860_USB_RX_AGG_EN |
   4451        1.1    nonaka 	    RT2860_USB_RX_AGG_TO(128) | RT2860_USB_RX_AGG_LMT(2);
   4452        1.1    nonaka 	run_write(sc, RT2860_USB_DMA_CFG, tmp);
   4453        1.1    nonaka 
   4454        1.1    nonaka 	/* set Rx filter */
   4455        1.1    nonaka 	tmp = RT2860_DROP_CRC_ERR | RT2860_DROP_PHY_ERR;
   4456        1.1    nonaka 	if (sc->sc_ic.ic_opmode != IEEE80211_M_MONITOR) {
   4457        1.1    nonaka 		tmp |= RT2860_DROP_UC_NOME | RT2860_DROP_DUPL |
   4458        1.1    nonaka 		    RT2860_DROP_CTS | RT2860_DROP_BA | RT2860_DROP_ACK |
   4459        1.1    nonaka 		    RT2860_DROP_VER_ERR | RT2860_DROP_CTRL_RSV |
   4460        1.1    nonaka 		    RT2860_DROP_CFACK | RT2860_DROP_CFEND;
   4461        1.1    nonaka 		if (sc->sc_ic.ic_opmode == IEEE80211_M_STA)
   4462        1.1    nonaka 			tmp |= RT2860_DROP_RTS | RT2860_DROP_PSPOLL;
   4463        1.1    nonaka 	}
   4464        1.1    nonaka 	run_write(sc, RT2860_RX_FILTR_CFG, tmp);
   4465        1.1    nonaka 
   4466        1.1    nonaka 	run_write(sc, RT2860_MAC_SYS_CTRL,
   4467        1.1    nonaka 	    RT2860_MAC_RX_EN | RT2860_MAC_TX_EN);
   4468        1.1    nonaka 
   4469   1.10.6.2     skrll 	return 0;
   4470        1.1    nonaka }
   4471        1.1    nonaka 
   4472        1.1    nonaka static int
   4473  1.10.6.11     skrll run_adjust_freq_offset(struct run_softc *sc)
   4474  1.10.6.11     skrll {
   4475  1.10.6.11     skrll 	uint8_t rf, tmp;
   4476  1.10.6.11     skrll 
   4477  1.10.6.11     skrll 	run_rt3070_rf_read(sc, 17, &rf);
   4478  1.10.6.11     skrll 	tmp = rf;
   4479  1.10.6.11     skrll 	rf = (rf & ~0x7f) | (sc->freq & 0x7f);
   4480  1.10.6.11     skrll 	rf = MIN(rf, 0x5f);
   4481  1.10.6.11     skrll 
   4482  1.10.6.11     skrll 	if (tmp != rf)
   4483  1.10.6.11     skrll 		run_mcu_cmd(sc, 0x74, (tmp << 8 ) | rf);
   4484  1.10.6.11     skrll 
   4485  1.10.6.11     skrll 	return (0);
   4486  1.10.6.11     skrll }
   4487  1.10.6.11     skrll 
   4488  1.10.6.11     skrll static int
   4489        1.1    nonaka run_init(struct ifnet *ifp)
   4490        1.1    nonaka {
   4491        1.1    nonaka 	struct run_softc *sc = ifp->if_softc;
   4492        1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   4493        1.1    nonaka 	uint32_t tmp;
   4494        1.1    nonaka 	uint8_t bbp1, bbp3;
   4495        1.1    nonaka 	int i, error, qid, ridx, ntries;
   4496        1.1    nonaka 
   4497        1.1    nonaka 	for (ntries = 0; ntries < 100; ntries++) {
   4498        1.1    nonaka 		if ((error = run_read(sc, RT2860_ASIC_VER_ID, &tmp)) != 0)
   4499        1.1    nonaka 			goto fail;
   4500        1.1    nonaka 		if (tmp != 0 && tmp != 0xffffffff)
   4501        1.1    nonaka 			break;
   4502  1.10.6.11     skrll 		usbd_delay_ms(sc->sc_udev, 10);
   4503        1.1    nonaka 	}
   4504        1.1    nonaka 	if (ntries == 100) {
   4505        1.1    nonaka 		error = ETIMEDOUT;
   4506        1.1    nonaka 		goto fail;
   4507        1.1    nonaka 	}
   4508        1.1    nonaka 
   4509        1.1    nonaka 	if ((sc->sc_flags & RUN_FWLOADED) == 0 &&
   4510        1.1    nonaka 	    (error = run_load_microcode(sc)) != 0) {
   4511        1.1    nonaka 		aprint_error_dev(sc->sc_dev,
   4512        1.1    nonaka 		    "could not load 8051 microcode\n");
   4513        1.1    nonaka 		goto fail;
   4514        1.1    nonaka 	}
   4515        1.1    nonaka 
   4516        1.1    nonaka 	if (ifp->if_flags & IFF_RUNNING)
   4517        1.1    nonaka 		run_stop(ifp, 0);
   4518        1.1    nonaka 
   4519        1.1    nonaka 	/* init host command ring */
   4520        1.1    nonaka 	sc->cmdq.cur = sc->cmdq.next = sc->cmdq.queued = 0;
   4521        1.1    nonaka 
   4522        1.1    nonaka 	/* init Tx rings (4 EDCAs) */
   4523        1.1    nonaka 	for (qid = 0; qid < 4; qid++) {
   4524        1.1    nonaka 		if ((error = run_alloc_tx_ring(sc, qid)) != 0)
   4525        1.1    nonaka 			goto fail;
   4526        1.1    nonaka 	}
   4527        1.1    nonaka 	/* init Rx ring */
   4528        1.1    nonaka 	if ((error = run_alloc_rx_ring(sc)) != 0)
   4529        1.1    nonaka 		goto fail;
   4530        1.1    nonaka 
   4531        1.1    nonaka 	IEEE80211_ADDR_COPY(ic->ic_myaddr, CLLADDR(ifp->if_sadl));
   4532        1.1    nonaka 	run_set_macaddr(sc, ic->ic_myaddr);
   4533        1.1    nonaka 
   4534        1.1    nonaka 	for (ntries = 0; ntries < 100; ntries++) {
   4535        1.1    nonaka 		if ((error = run_read(sc, RT2860_WPDMA_GLO_CFG, &tmp)) != 0)
   4536        1.1    nonaka 			goto fail;
   4537        1.1    nonaka 		if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0)
   4538        1.1    nonaka 			break;
   4539  1.10.6.11     skrll 		usbd_delay_ms(sc->sc_udev, 10);
   4540        1.1    nonaka 	}
   4541        1.1    nonaka 	if (ntries == 100) {
   4542        1.1    nonaka 		aprint_error_dev(sc->sc_dev,
   4543        1.1    nonaka 		    "timeout waiting for DMA engine\n");
   4544        1.1    nonaka 		error = ETIMEDOUT;
   4545        1.1    nonaka 		goto fail;
   4546        1.1    nonaka 	}
   4547        1.1    nonaka 	tmp &= 0xff0;
   4548        1.1    nonaka 	tmp |= RT2860_TX_WB_DDONE;
   4549        1.1    nonaka 	run_write(sc, RT2860_WPDMA_GLO_CFG, tmp);
   4550        1.1    nonaka 
   4551        1.1    nonaka 	/* turn off PME_OEN to solve high-current issue */
   4552        1.1    nonaka 	run_read(sc, RT2860_SYS_CTRL, &tmp);
   4553        1.1    nonaka 	run_write(sc, RT2860_SYS_CTRL, tmp & ~RT2860_PME_OEN);
   4554        1.1    nonaka 
   4555        1.1    nonaka 	run_write(sc, RT2860_MAC_SYS_CTRL,
   4556        1.1    nonaka 	    RT2860_BBP_HRST | RT2860_MAC_SRST);
   4557        1.1    nonaka 	run_write(sc, RT2860_USB_DMA_CFG, 0);
   4558        1.1    nonaka 
   4559        1.1    nonaka 	if ((error = run_reset(sc)) != 0) {
   4560        1.1    nonaka 		aprint_error_dev(sc->sc_dev, "could not reset chipset\n");
   4561        1.1    nonaka 		goto fail;
   4562        1.1    nonaka 	}
   4563        1.1    nonaka 
   4564        1.1    nonaka 	run_write(sc, RT2860_MAC_SYS_CTRL, 0);
   4565        1.1    nonaka 
   4566        1.1    nonaka 	/* init Tx power for all Tx rates (from EEPROM) */
   4567        1.1    nonaka 	for (ridx = 0; ridx < 5; ridx++) {
   4568        1.1    nonaka 		if (sc->txpow20mhz[ridx] == 0xffffffff)
   4569        1.1    nonaka 			continue;
   4570        1.1    nonaka 		run_write(sc, RT2860_TX_PWR_CFG(ridx), sc->txpow20mhz[ridx]);
   4571        1.1    nonaka 	}
   4572        1.1    nonaka 
   4573        1.1    nonaka 	for (i = 0; i < (int)__arraycount(rt2870_def_mac); i++)
   4574        1.1    nonaka 		run_write(sc, rt2870_def_mac[i].reg, rt2870_def_mac[i].val);
   4575        1.1    nonaka 	run_write(sc, RT2860_WMM_AIFSN_CFG, 0x00002273);
   4576        1.1    nonaka 	run_write(sc, RT2860_WMM_CWMIN_CFG, 0x00002344);
   4577        1.1    nonaka 	run_write(sc, RT2860_WMM_CWMAX_CFG, 0x000034aa);
   4578        1.1    nonaka 
   4579  1.10.6.11     skrll 	if (sc->mac_ver >= 0x5390) {
   4580  1.10.6.11     skrll 		run_write(sc, RT2860_TX_SW_CFG0,
   4581  1.10.6.11     skrll 		    4 << RT2860_DLY_PAPE_EN_SHIFT | 4);
   4582  1.10.6.11     skrll 		if (sc->mac_ver >= 0x5392) {
   4583  1.10.6.11     skrll 			run_write(sc, RT2860_MAX_LEN_CFG, 0x00002fff);
   4584  1.10.6.11     skrll 			if (sc->mac_ver == 0x5592) {
   4585  1.10.6.11     skrll 				run_write(sc, RT2860_HT_FBK_CFG1, 0xedcba980);
   4586  1.10.6.11     skrll 				run_write(sc, RT2860_TXOP_HLDR_ET, 0x00000082);
   4587  1.10.6.11     skrll 			} else {
   4588  1.10.6.11     skrll 				run_write(sc, RT2860_HT_FBK_CFG1, 0xedcb4980);
   4589  1.10.6.11     skrll 				run_write(sc, RT2860_LG_FBK_CFG0, 0xedcba322);
   4590  1.10.6.11     skrll 			}
   4591  1.10.6.11     skrll 		}
   4592  1.10.6.11     skrll 	} else if (sc->mac_ver >= 0x3593) {
   4593  1.10.6.11     skrll 		run_write(sc, RT2860_TX_SW_CFG0,
   4594  1.10.6.11     skrll 		    4 << RT2860_DLY_PAPE_EN_SHIFT | 2);
   4595  1.10.6.11     skrll 	} else if (sc->mac_ver >= 0x3070) {
   4596        1.1    nonaka 		/* set delay of PA_PE assertion to 1us (unit of 0.25us) */
   4597        1.1    nonaka 		run_write(sc, RT2860_TX_SW_CFG0,
   4598        1.1    nonaka 		    4 << RT2860_DLY_PAPE_EN_SHIFT);
   4599        1.1    nonaka 	}
   4600        1.1    nonaka 
   4601        1.1    nonaka 	/* wait while MAC is busy */
   4602        1.1    nonaka 	for (ntries = 0; ntries < 100; ntries++) {
   4603        1.1    nonaka 		if ((error = run_read(sc, RT2860_MAC_STATUS_REG, &tmp)) != 0)
   4604        1.1    nonaka 			goto fail;
   4605        1.1    nonaka 		if (!(tmp & (RT2860_RX_STATUS_BUSY | RT2860_TX_STATUS_BUSY)))
   4606        1.1    nonaka 			break;
   4607        1.1    nonaka 		DELAY(1000);
   4608        1.1    nonaka 	}
   4609        1.1    nonaka 	if (ntries == 100) {
   4610        1.1    nonaka 		error = ETIMEDOUT;
   4611        1.1    nonaka 		goto fail;
   4612        1.1    nonaka 	}
   4613        1.1    nonaka 
   4614        1.1    nonaka 	/* clear Host to MCU mailbox */
   4615        1.1    nonaka 	run_write(sc, RT2860_H2M_BBPAGENT, 0);
   4616        1.1    nonaka 	run_write(sc, RT2860_H2M_MAILBOX, 0);
   4617  1.10.6.11     skrll 	usbd_delay_ms(sc->sc_udev, 10);
   4618        1.1    nonaka 
   4619        1.1    nonaka 	if ((error = run_bbp_init(sc)) != 0) {
   4620        1.1    nonaka 		aprint_error_dev(sc->sc_dev, "could not initialize BBP\n");
   4621        1.1    nonaka 		goto fail;
   4622        1.1    nonaka 	}
   4623        1.1    nonaka 
   4624  1.10.6.11     skrll 	/* abort TSF synchronization */
   4625        1.1    nonaka 	run_read(sc, RT2860_BCN_TIME_CFG, &tmp);
   4626        1.1    nonaka 	tmp &= ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN |
   4627        1.1    nonaka 	    RT2860_TBTT_TIMER_EN);
   4628        1.1    nonaka 	run_write(sc, RT2860_BCN_TIME_CFG, tmp);
   4629        1.1    nonaka 
   4630        1.1    nonaka 	/* clear RX WCID search table */
   4631        1.1    nonaka 	run_set_region_4(sc, RT2860_WCID_ENTRY(0), 0, 512);
   4632        1.1    nonaka 	/* clear Pair-wise key table */
   4633        1.1    nonaka 	run_set_region_4(sc, RT2860_PKEY(0), 0, 2048);
   4634        1.1    nonaka 	/* clear IV/EIV table */
   4635        1.1    nonaka 	run_set_region_4(sc, RT2860_IVEIV(0), 0, 512);
   4636        1.1    nonaka 	/* clear WCID attribute table */
   4637        1.1    nonaka 	run_set_region_4(sc, RT2860_WCID_ATTR(0), 0, 8 * 32);
   4638        1.1    nonaka 	/* clear shared key table */
   4639        1.1    nonaka 	run_set_region_4(sc, RT2860_SKEY(0, 0), 0, 8 * 32);
   4640        1.1    nonaka 	/* clear shared key mode */
   4641        1.1    nonaka 	run_set_region_4(sc, RT2860_SKEY_MODE_0_7, 0, 4);
   4642        1.1    nonaka 
   4643  1.10.6.11     skrll 	/* clear RX WCID search table */
   4644  1.10.6.11     skrll 	run_set_region_4(sc, RT2860_WCID_ENTRY(0), 0, 512);
   4645  1.10.6.11     skrll 	/* clear WCID attribute table */
   4646  1.10.6.11     skrll 	run_set_region_4(sc, RT2860_WCID_ATTR(0), 0, 8 * 32);
   4647  1.10.6.11     skrll 
   4648        1.1    nonaka 	run_read(sc, RT2860_US_CYC_CNT, &tmp);
   4649        1.1    nonaka 	tmp = (tmp & ~0xff) | 0x1e;
   4650        1.1    nonaka 	run_write(sc, RT2860_US_CYC_CNT, tmp);
   4651        1.1    nonaka 
   4652        1.1    nonaka 	if (sc->mac_rev != 0x0101)
   4653        1.1    nonaka 		run_write(sc, RT2860_TXOP_CTRL_CFG, 0x0000583f);
   4654        1.1    nonaka 
   4655        1.1    nonaka 	run_write(sc, RT2860_WMM_TXOP0_CFG, 0);
   4656        1.1    nonaka 	run_write(sc, RT2860_WMM_TXOP1_CFG, 48 << 16 | 96);
   4657        1.1    nonaka 
   4658        1.1    nonaka 	/* write vendor-specific BBP values (from EEPROM) */
   4659  1.10.6.11     skrll 	if (sc->mac_ver < 0x3593) {
   4660  1.10.6.11     skrll 		for (i = 0; i < 10; i++) {
   4661  1.10.6.11     skrll 			if (sc->bbp[i].reg == 0 || sc->bbp[i].reg == 0xff)
   4662  1.10.6.11     skrll 				continue;
   4663  1.10.6.11     skrll 			run_bbp_write(sc, sc->bbp[i].reg, sc->bbp[i].val);
   4664  1.10.6.11     skrll 		}
   4665        1.1    nonaka 	}
   4666        1.1    nonaka 
   4667        1.1    nonaka 	/* select Main antenna for 1T1R devices */
   4668  1.10.6.11     skrll 	if (sc->rf_rev == RT3070_RF_3020 || sc->rf_rev == RT5390_RF_5370)
   4669        1.1    nonaka 		run_set_rx_antenna(sc, 0);
   4670        1.1    nonaka 
   4671        1.1    nonaka 	/* send LEDs operating mode to microcontroller */
   4672        1.1    nonaka 	(void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED1, sc->led[0]);
   4673        1.1    nonaka 	(void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED2, sc->led[1]);
   4674        1.1    nonaka 	(void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED3, sc->led[2]);
   4675        1.1    nonaka 
   4676  1.10.6.11     skrll 	if (sc->mac_ver >= 0x5390)
   4677  1.10.6.11     skrll 		run_rt5390_rf_init(sc);
   4678  1.10.6.11     skrll 	else if (sc->mac_ver == 0x3593)
   4679  1.10.6.11     skrll 		run_rt3593_rf_init(sc);
   4680  1.10.6.11     skrll 	else if (sc->mac_ver >= 0x3070)
   4681        1.1    nonaka 		run_rt3070_rf_init(sc);
   4682        1.1    nonaka 
   4683        1.1    nonaka 	/* disable non-existing Rx chains */
   4684        1.1    nonaka 	run_bbp_read(sc, 3, &bbp3);
   4685        1.1    nonaka 	bbp3 &= ~(1 << 3 | 1 << 4);
   4686        1.1    nonaka 	if (sc->nrxchains == 2)
   4687        1.1    nonaka 		bbp3 |= 1 << 3;
   4688        1.1    nonaka 	else if (sc->nrxchains == 3)
   4689        1.1    nonaka 		bbp3 |= 1 << 4;
   4690        1.1    nonaka 	run_bbp_write(sc, 3, bbp3);
   4691        1.1    nonaka 
   4692        1.1    nonaka 	/* disable non-existing Tx chains */
   4693        1.1    nonaka 	run_bbp_read(sc, 1, &bbp1);
   4694        1.1    nonaka 	if (sc->ntxchains == 1)
   4695        1.1    nonaka 		bbp1 &= ~(1 << 3 | 1 << 4);
   4696        1.1    nonaka 	run_bbp_write(sc, 1, bbp1);
   4697        1.1    nonaka 
   4698  1.10.6.11     skrll 	if (sc->mac_ver >= 0x5390)
   4699  1.10.6.11     skrll 		run_rt5390_rf_setup(sc);
   4700  1.10.6.11     skrll 	else if (sc->mac_ver == 0x3593)
   4701  1.10.6.11     skrll 		run_rt3593_rf_setup(sc);
   4702  1.10.6.11     skrll 	else if (sc->mac_ver >= 0x3070)
   4703        1.1    nonaka 		run_rt3070_rf_setup(sc);
   4704        1.1    nonaka 
   4705        1.1    nonaka 	/* select default channel */
   4706        1.1    nonaka 	run_set_chan(sc, ic->ic_curchan);
   4707        1.1    nonaka 
   4708  1.10.6.11     skrll 	/* setup initial protection mode */
   4709  1.10.6.11     skrll 	run_updateprot(sc);
   4710  1.10.6.11     skrll 
   4711        1.1    nonaka 	/* turn radio LED on */
   4712        1.1    nonaka 	run_set_leds(sc, RT2860_LED_RADIO);
   4713        1.1    nonaka 
   4714        1.1    nonaka #ifdef RUN_HWCRYPTO
   4715        1.1    nonaka 	if (ic->ic_flags & IEEE80211_F_PRIVACY) {
   4716        1.1    nonaka 		/* install WEP keys */
   4717        1.1    nonaka 		for (i = 0; i < IEEE80211_WEP_NKID; i++)
   4718        1.1    nonaka 			(void)run_set_key(ic, &ic->ic_crypto.cs_nw_keys[i],
   4719        1.1    nonaka 			    NULL);
   4720        1.1    nonaka 	}
   4721        1.1    nonaka #endif
   4722        1.1    nonaka 
   4723        1.1    nonaka 	for (i = 0; i < RUN_RX_RING_COUNT; i++) {
   4724        1.1    nonaka 		struct run_rx_data *data = &sc->rxq.data[i];
   4725        1.1    nonaka 
   4726   1.10.6.7     skrll 		usbd_setup_xfer(data->xfer, data, data->buf, RUN_MAX_RXSZ,
   4727   1.10.6.7     skrll 		    USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, run_rxeof);
   4728        1.1    nonaka 		error = usbd_transfer(data->xfer);
   4729        1.1    nonaka 		if (error != USBD_NORMAL_COMPLETION &&
   4730        1.1    nonaka 		    error != USBD_IN_PROGRESS)
   4731        1.1    nonaka 			goto fail;
   4732        1.1    nonaka 	}
   4733        1.1    nonaka 
   4734        1.1    nonaka 	if ((error = run_txrx_enable(sc)) != 0)
   4735        1.1    nonaka 		goto fail;
   4736        1.1    nonaka 
   4737        1.1    nonaka 	ifp->if_flags &= ~IFF_OACTIVE;
   4738        1.1    nonaka 	ifp->if_flags |= IFF_RUNNING;
   4739        1.1    nonaka 
   4740        1.1    nonaka 	if (ic->ic_opmode == IEEE80211_M_MONITOR)
   4741        1.1    nonaka 		ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
   4742        1.1    nonaka 	else
   4743        1.1    nonaka 		ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
   4744        1.1    nonaka 
   4745        1.1    nonaka 	if (error != 0)
   4746        1.1    nonaka fail:		run_stop(ifp, 1);
   4747   1.10.6.2     skrll 	return error;
   4748        1.1    nonaka }
   4749        1.1    nonaka 
   4750        1.1    nonaka static void
   4751        1.1    nonaka run_stop(struct ifnet *ifp, int disable)
   4752        1.1    nonaka {
   4753        1.1    nonaka 	struct run_softc *sc = ifp->if_softc;
   4754        1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   4755        1.1    nonaka 	uint32_t tmp;
   4756        1.1    nonaka 	int ntries, qid;
   4757        1.1    nonaka 
   4758        1.1    nonaka 	if (ifp->if_flags & IFF_RUNNING)
   4759        1.1    nonaka 		run_set_leds(sc, 0);	/* turn all LEDs off */
   4760        1.1    nonaka 
   4761        1.1    nonaka 	sc->sc_tx_timer = 0;
   4762        1.1    nonaka 	ifp->if_timer = 0;
   4763        1.1    nonaka 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
   4764        1.1    nonaka 
   4765        1.1    nonaka 	callout_stop(&sc->scan_to);
   4766        1.1    nonaka 	callout_stop(&sc->calib_to);
   4767        1.1    nonaka 
   4768        1.1    nonaka 	ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
   4769        1.1    nonaka 	/* wait for all queued asynchronous commands to complete */
   4770        1.1    nonaka 	while (sc->cmdq.queued > 0)
   4771        1.1    nonaka 		tsleep(&sc->cmdq, 0, "cmdq", 0);
   4772        1.1    nonaka 
   4773        1.1    nonaka 	/* disable Tx/Rx */
   4774        1.1    nonaka 	run_read(sc, RT2860_MAC_SYS_CTRL, &tmp);
   4775        1.1    nonaka 	tmp &= ~(RT2860_MAC_RX_EN | RT2860_MAC_TX_EN);
   4776        1.1    nonaka 	run_write(sc, RT2860_MAC_SYS_CTRL, tmp);
   4777        1.1    nonaka 
   4778        1.1    nonaka 	/* wait for pending Tx to complete */
   4779        1.1    nonaka 	for (ntries = 0; ntries < 100; ntries++) {
   4780        1.1    nonaka 		if (run_read(sc, RT2860_TXRXQ_PCNT, &tmp) != 0)
   4781        1.1    nonaka 			break;
   4782        1.1    nonaka 		if ((tmp & RT2860_TX2Q_PCNT_MASK) == 0)
   4783        1.1    nonaka 			break;
   4784        1.1    nonaka 	}
   4785        1.1    nonaka 	DELAY(1000);
   4786        1.1    nonaka 	run_write(sc, RT2860_USB_DMA_CFG, 0);
   4787        1.1    nonaka 
   4788        1.1    nonaka 	/* reset adapter */
   4789        1.1    nonaka 	run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_BBP_HRST | RT2860_MAC_SRST);
   4790        1.1    nonaka 	run_write(sc, RT2860_MAC_SYS_CTRL, 0);
   4791        1.1    nonaka 
   4792        1.1    nonaka 	/* reset Tx and Rx rings */
   4793        1.1    nonaka 	sc->qfullmsk = 0;
   4794        1.1    nonaka 	for (qid = 0; qid < 4; qid++)
   4795        1.1    nonaka 		run_free_tx_ring(sc, qid);
   4796        1.1    nonaka 	run_free_rx_ring(sc);
   4797        1.1    nonaka }
   4798        1.1    nonaka 
   4799        1.1    nonaka #ifndef IEEE80211_STA_ONLY
   4800        1.1    nonaka static int
   4801        1.1    nonaka run_setup_beacon(struct run_softc *sc)
   4802        1.1    nonaka {
   4803        1.1    nonaka 	struct ieee80211com *ic = &sc->sc_ic;
   4804        1.1    nonaka 	struct rt2860_txwi txwi;
   4805        1.1    nonaka 	struct mbuf *m;
   4806  1.10.6.11     skrll 	uint16_t txwisize;
   4807        1.1    nonaka 	int ridx;
   4808        1.1    nonaka 
   4809        1.1    nonaka 	if ((m = ieee80211_beacon_alloc(ic, ic->ic_bss, &sc->sc_bo)) == NULL)
   4810   1.10.6.2     skrll 		return ENOBUFS;
   4811        1.1    nonaka 
   4812   1.10.6.6     skrll 	memset(&txwi, 0, sizeof(txwi));
   4813        1.1    nonaka 	txwi.wcid = 0xff;
   4814        1.1    nonaka 	txwi.len = htole16(m->m_pkthdr.len);
   4815        1.1    nonaka 	/* send beacons at the lowest available rate */
   4816        1.1    nonaka 	ridx = (ic->ic_curmode == IEEE80211_MODE_11A) ?
   4817        1.1    nonaka 	    RT2860_RIDX_OFDM6 : RT2860_RIDX_CCK1;
   4818        1.1    nonaka 	txwi.phy = htole16(rt2860_rates[ridx].mcs);
   4819        1.1    nonaka 	if (rt2860_rates[ridx].phy == IEEE80211_T_OFDM)
   4820        1.1    nonaka 		txwi.phy |= htole16(RT2860_PHY_OFDM);
   4821        1.1    nonaka 	txwi.txop = RT2860_TX_TXOP_HT;
   4822        1.1    nonaka 	txwi.flags = RT2860_TX_TS;
   4823        1.1    nonaka 
   4824  1.10.6.11     skrll 	txwisize = (sc->mac_ver == 0x5592) ?
   4825  1.10.6.11     skrll 	    sizeof(txwi) + sizeof(uint32_t) : sizeof(txwi);
   4826        1.1    nonaka 	run_write_region_1(sc, RT2860_BCN_BASE(0),
   4827  1.10.6.11     skrll 	    (uint8_t *)&txwi, txwisize);
   4828  1.10.6.11     skrll 	run_write_region_1(sc, RT2860_BCN_BASE(0) + txwisize,
   4829  1.10.6.11     skrll 	    mtod(m, uint8_t *), (m->m_pkthdr.len + 1) & ~1);
   4830        1.1    nonaka 
   4831        1.1    nonaka 	m_freem(m);
   4832        1.1    nonaka 
   4833   1.10.6.2     skrll 	return 0;
   4834        1.1    nonaka }
   4835        1.1    nonaka #endif
   4836        1.1    nonaka 
   4837        1.2    nonaka MODULE(MODULE_CLASS_DRIVER, if_run, "bpf");
   4838        1.1    nonaka 
   4839        1.1    nonaka #ifdef _MODULE
   4840        1.1    nonaka #include "ioconf.c"
   4841        1.1    nonaka #endif
   4842        1.1    nonaka 
   4843        1.1    nonaka static int
   4844        1.1    nonaka if_run_modcmd(modcmd_t cmd, void *arg)
   4845        1.1    nonaka {
   4846        1.1    nonaka 	int error = 0;
   4847        1.1    nonaka 
   4848        1.1    nonaka 	switch (cmd) {
   4849        1.1    nonaka 	case MODULE_CMD_INIT:
   4850        1.1    nonaka #ifdef _MODULE
   4851        1.1    nonaka 		error = config_init_component(cfdriver_ioconf_run,
   4852        1.1    nonaka 		    cfattach_ioconf_run, cfdata_ioconf_run);
   4853        1.1    nonaka #endif
   4854   1.10.6.2     skrll 		return error;
   4855        1.1    nonaka 	case MODULE_CMD_FINI:
   4856        1.1    nonaka #ifdef _MODULE
   4857        1.1    nonaka 		error = config_fini_component(cfdriver_ioconf_run,
   4858        1.1    nonaka 		    cfattach_ioconf_run, cfdata_ioconf_run);
   4859        1.1    nonaka #endif
   4860   1.10.6.2     skrll 		return error;
   4861        1.1    nonaka 	default:
   4862   1.10.6.2     skrll 		return ENOTTY;
   4863        1.1    nonaka 	}
   4864        1.1    nonaka }
   4865