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