svn commit: r251538 - in head: share/man/man4 sys/conf sys/dev/usb sys/dev/usb/wlan sys/modules/usb sys/modules/usb/urtwn

hiren panchasara hiren at FreeBSD.org
Sat Jun 8 17:02:16 UTC 2013


On Sat, Jun 8, 2013 at 9:02 AM, Rui Paulo <rpaulo at freebsd.org> wrote:
> Author: rpaulo
> Date: Sat Jun  8 16:02:31 2013
> New Revision: 251538
> URL: http://svnweb.freebsd.org/changeset/base/251538
>
> Log:
>   Import Kevin Lo's port of urtwn(4) from OpenBSD. urtwn(4) is a driver for the
>   Realtek RTL8188CU/RTL8192CU USB IEEE 802.11b/g/n wireless cards.
>   This driver requires microcode which is available in FreeBSD ports:
>   net/urtwn-firmware-kmod.
>
>   Hiren ported the urtwn(4) man page from OpenBSD and Glen just commited a port
>   for the firmware.
>
>   TODO:
>   - 802.11n support
>   - Stability fixes - the driver can sustain lots of traffic but has trouble
>   coping with simultaneous iperf sessions.
>   - fix debugging
>
>   MFC after:    2 months
>   Tested by:    kevlo, hiren, gjb

Yay!

Great work Kevin for initial port and Rui for tuning it up to stable
state and fixing performance issues.

cheers,
Hiren

PS: Time for creating new image with the changes for beaglebone!
>
> Added:
>   head/share/man/man4/urtwn.4   (contents, props changed)
>   head/sys/dev/usb/wlan/if_urtwn.c   (contents, props changed)
>   head/sys/dev/usb/wlan/if_urtwnreg.h   (contents, props changed)
>   head/sys/modules/usb/urtwn/
>   head/sys/modules/usb/urtwn/Makefile   (contents, props changed)
> Modified:
>   head/share/man/man4/Makefile
>   head/sys/conf/NOTES
>   head/sys/conf/files
>   head/sys/dev/usb/usbdevs
>   head/sys/modules/usb/Makefile
>
> Modified: head/share/man/man4/Makefile
> ==============================================================================
> --- head/share/man/man4/Makefile        Sat Jun  8 15:48:29 2013        (r251537)
> +++ head/share/man/man4/Makefile        Sat Jun  8 16:02:31 2013        (r251538)
> @@ -516,6 +516,7 @@ MAN=        aac.4 \
>         ural.4 \
>         urio.4 \
>         ${_urtw.4} \
> +       urtwn.4 \
>         usb.4 \
>         usb_quirk.4 \
>         uslcom.4 \
>
> Added: head/share/man/man4/urtwn.4
> ==============================================================================
> --- /dev/null   00:00:00 1970   (empty, because file is newly added)
> +++ head/share/man/man4/urtwn.4 Sat Jun  8 16:02:31 2013        (r251538)
> @@ -0,0 +1,140 @@
> +.\" $OpenBSD: urtwn.4,v 1.20 2013/05/16 10:02:59 sthen Exp $
> +.\" $FreeBSD$
> +.\"
> +.\" Copyright (c) 2010 Damien Bergamini <damien.bergamini at free.fr>
> +.\"
> +.\" Permission to use, copy, modify, and distribute this software for any
> +.\" purpose with or without fee is hereby granted, provided that the above
> +.\" copyright notice and this permission notice appear in all copies.
> +.\"
> +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
> +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
> +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
> +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> +.\"
> +.Dd July 7, 2013
> +.Dt URTWN 4
> +.Os
> +.Sh NAME
> +.Nm urtwn
> +.Nd Realtek RTL8188CU/RTL8192CU USB IEEE 802.11b/g/n wireless network device
> +.Sh SYNOPSIS
> +To compile this driver into the kernel,
> +place the following lines in your
> +kernel configuration file:
> +.Bd -ragged -offset indent
> +.Cd "device ehci"
> +.Cd "device uhci"
> +.Cd "device ohci"
> +.Cd "device usb"
> +.Cd "device urtwn"
> +.Cd "device wlan"
> +.Ed
> +.Pp
> +Alternatively, to load the driver as a
> +module at boot time, place the following line in
> +.Xr loader.conf 5 :
> +.Bd -literal -offset indent
> +if_urtwn_load="YES"
> +.Ed
> +.Sh DESCRIPTION
> +The
> +.Nm
> +driver supports USB 2.0 wireless network devices based on Realtek
> +RTL8188CUS, RTL8188CE-VAU, RTL8188RU and RTL8192CU chipsets.
> +.Pp
> +The RTL8188CUS is a highly integrated 802.11n adapter that combines
> +a MAC, a 1T1R capable baseband and an RF in a single chip.
> +It operates in the 2GHz spectrum only.
> +The RTL8188RU is a high-power variant of the RTL8188CUS.
> +The RTL8188CE-VAU is a PCI Express Mini Card adapter that attaches
> +to the USB interface.
> +.Pp
> +The RTL8192CU is a highly integrated multiple-in, multiple-out (MIMO)
> +802.11n adapter that combines a MAC, a 2T2R capable baseband and an
> +RF in a single chip.
> +It operates in the 2GHz spectrum only.
> +.Pp
> +The driver needs at least version 1.1p0 of the following firmware files,
> +which are loaded when an interface is attached:
> +.Pp
> +.Bl -tag -width Ds -offset indent -compact
> +.It urtwn-rtl8192cfwT
> +.It urtwn-rtl8192cfwU
> +.It urtwn-rtl8723fw
> +.El
> +.Pp
> +The firmware is available as part of the FreeBSD Ports collection in
> +net/urtwn-firmware-kmod.
> +.Sh HARDWARE
> +The following adapters should work:
> +.Pp
> +.Bl -tag -width Ds -offset indent -compact
> +.It Belkin F7D1102 Surf Wireless Micro
> +.It Edimax EW-7811Un
> +.It Netgear WNA1000M
> +.It Realtek RTL8192CU
> +.It Realtek RTL8188CUS
> +.El
> +.Sh EXAMPLES
> +Join an existing BSS network (i.e., connect to an access point):
> +.Bd -literal -offset indent
> +ifconfig wlan create wlandev urtwn0 inet 192.168.0.20 \e
> +    netmask 0xffffff00
> +.Ed
> +.Pp
> +Join a specific BSS network with network name
> +.Dq Li my_net :
> +.Pp
> +.Dl "ifconfig wlan create wlandev urtwn0 ssid my_net up"
> +.Pp
> +Join a specific BSS network with 64-bit WEP encryption:
> +.Bd -literal -offset indent
> +ifconfig wlan create wlandev urtwn0 ssid my_net \e
> +        wepmode on wepkey 0x1234567890 weptxkey 1 up
> +.Ed
> +.Sh DIAGNOSTICS
> +.Bl -diag
> +.It "urtwn%d: error %d, could not read firmware %s"
> +For some reason, the driver was unable to read the microcode file from the
> +filesystem.
> +The file might be missing or corrupted.
> +.It "urtwn%d: device timeout"
> +A frame dispatched to the hardware for transmission did not complete in time.
> +The driver will reset the hardware.
> +This should not happen.
> +.El
> +.Sh SEE ALSO
> +.Xr intro 4 ,
> +.Xr netintro 4 ,
> +.Xr usb 4 ,
> +.Xr wlan 4 ,
> +.Xr wlan_ccmp 4 ,
> +.Xr wlan_tkip 4 ,
> +.Xr wlan_wep 4 ,
> +.Xr ifconfig 8,
> +.Xr wpa_supplicant 8
> +.Rs
> +.%T Realtek
> +.%U http://www.realtek.com.tw
> +.Re
> +.Sh HISTORY
> +The
> +.Nm
> +driver first appeared in
> +.Ox 4.9
> +and
> +.Fx 10.0 .
> +.Sh AUTHORS
> +The
> +.Nm
> +driver was written by
> +.An Damien Bergamini Aq damien at openbsd.org .
> +.Sh CAVEATS
> +The
> +.Nm
> +driver does not support any of the 802.11n capabilities offered by the
> +adapters.
>
> Modified: head/sys/conf/NOTES
> ==============================================================================
> --- head/sys/conf/NOTES Sat Jun  8 15:48:29 2013        (r251537)
> +++ head/sys/conf/NOTES Sat Jun  8 16:02:31 2013        (r251538)
> @@ -2747,6 +2747,9 @@ device            ural
>  # Realtek RTL8187B/L wireless driver
>  device         urtw
>  #
> +# Realtek RTL8188CU/RTL8192CU wireless driver
> +device         urtwn
> +#
>  # ZyDas ZD1211/ZD1211B wireless driver
>  device         zyd
>  #
>
> Modified: head/sys/conf/files
> ==============================================================================
> --- head/sys/conf/files Sat Jun  8 15:48:29 2013        (r251537)
> +++ head/sys/conf/files Sat Jun  8 16:02:31 2013        (r251538)
> @@ -2292,6 +2292,7 @@ dev/usb/wlan/if_uath.c            optional uath
>  dev/usb/wlan/if_upgt.c         optional upgt
>  dev/usb/wlan/if_ural.c         optional ural
>  dev/usb/wlan/if_urtw.c         optional urtw
> +dev/usb/wlan/if_urtwn.c                optional urtwn
>  dev/usb/wlan/if_zyd.c          optional zyd
>  #
>  # USB serial and parallel port drivers
>
> Modified: head/sys/dev/usb/usbdevs
> ==============================================================================
> --- head/sys/dev/usb/usbdevs    Sat Jun  8 15:48:29 2013        (r251537)
> +++ head/sys/dev/usb/usbdevs    Sat Jun  8 16:02:31 2013        (r251538)
> @@ -571,6 +571,7 @@ vendor KONTRON              0x0fe6  Kontron AG
>  vendor QUALCOMM                0x1004  Qualcomm
>  vendor APACER          0x1005  Apacer
>  vendor MOTOROLA4       0x100d  Motorola
> +vendor HP3             0x103c  Hewlett Packard
>  vendor AIRPLUS         0x1011  Airplus
>  vendor DESKNOTE                0x1019  Desknote
>  vendor NEC3            0x1033  NEC
> @@ -720,6 +721,7 @@ vendor ENCORE               0x203d  Encore
>  vendor QIHARDWARE      0x20b7  QI-hardware
>  vendor PARA            0x20b8  PARA Industrial
>  vendor SIMTEC          0x20df  Simtec Electronics
> +vendor TRENDNET                0x20f4  TRENDnet
>  vendor RTSYSTEMS       0x2100  RTSYSTEMS
>  vendor VIALABS         0x2109  VIA Labs
>  vendor ERICSSON                0x2282  Ericsson
> @@ -742,6 +744,7 @@ vendor IRIVER               0x4102  iRiver
>  vendor DELL            0x413c  Dell
>  vendor WCH             0x4348  QinHeng Electronics
>  vendor ACEECA          0x4766  Aceeca
> +vendor FEIXUN          0x4855  FeiXun Communication
>  vendor PAPOUCH         0x5050  Papouch products
>  vendor AVERATEC                0x50c2  Averatec
>  vendor SWEEX           0x5173  Sweex
> @@ -757,6 +760,7 @@ vendor INTEL2               0x8087  Intel
>  vendor ALLWIN          0x8516  ALLWIN Tech
>  vendor SITECOM2                0x9016  Sitecom
>  vendor MOSCHIP         0x9710  MosChip Semiconductor
> +vendor NETGEAR4                0x9846  Netgear
>  vendor MARVELL         0x9e88  Marvell Technology Group Ltd.
>  vendor 3COM3           0xa727  3Com
>  vendor EVOLUTION       0xdeee  Evolution Robotics products
> @@ -814,6 +818,9 @@ product ABOCOM HWU54DM              0xb21b  HWU54DM
>  product ABOCOM RT2573_2                0xb21c  RT2573
>  product ABOCOM RT2573_3                0xb21d  RT2573
>  product ABOCOM RT2573_4                0xb21e  RT2573
> +product ABOCOM RTL8188CU_1     0x8188  RTL8188CU
> +product ABOCOM RTL8188CU_2     0x8189  RTL8188CU
> +product ABOCOM RTL8192CU       0x8178  RTL8192CU
>  product ABOCOM WUG2700         0xb21f  WUG2700
>
>  /* Acton Research Corp. */
> @@ -1126,6 +1133,7 @@ product ASUS RT2870_4             0x1760  RT2870
>  product ASUS RT2870_5          0x1761  RT2870
>  product        ASUS USBN13             0x1784  USB-N13
>  product        ASUS RT3070_1           0x1790  RT3070
> +product ASUS RTL8192CU         0x17ab  RTL8192CU
>  product ASUS A730W             0x4202  ASUS MyPal A730W
>  product ASUS P535              0x420f  ASUS P535 PDA
>  product        ASUS GMSC               0x422f  ASUS Generic Mass Storage
> @@ -1173,6 +1181,10 @@ product AZUREWAVE RT2870_2       0x3262  RT2870
>  product AZUREWAVE RT3070_1     0x3273  RT3070
>  product        AZUREWAVE RT3070_2      0x3284  RT3070
>  product        AZUREWAVE RT3070_3      0x3305  RT3070
> +product AZUREWAVE RTL8188CU    0x3357  RTL8188CU
> +product AZUREWAVE RTL8188CE_1  0x3358  RTL8188CE
> +product AZUREWAVE RTL8188CE_2  0x3359  RTL8188CE
> +
>
>  /* Baltech products */
>  product BALTECH CARDREADER     0x9999  Card reader
> @@ -1215,6 +1227,9 @@ product BELKIN F5U257             0x0257  F5U257 Ser
>  product BELKIN F5U409          0x0409  F5U409 Serial
>  product BELKIN F6C550AVR       0x0551  F6C550-AVR UPS
>  product BELKIN F5U120          0x1203  F5U120-PC Hub
> +product BELKIN RTL8188CU       0x1102  RTL8188CU Wireless Adapter
> +product BELKIN RTL8192CU       0x2102  RTL8192CU Wireless Adapter
> +product BELKIN F7D2102         0x2103  F7D2102 Wireless Adapter
>  product BELKIN ZD1211B         0x4050  ZD1211B
>  product BELKIN F5D5055         0x5055  F5D5055
>  product BELKIN F5D7050         0x7050  F5D7050 Wireless Adapter
> @@ -1294,6 +1309,11 @@ product CHIC CYPRESS             0x0003  Cypress USB
>  product CHICONY KB8933         0x0001  KB-8933 keyboard
>  product CHICONY KU0325         0x0116  KU-0325 keyboard
>  product CHICONY CNF7129                0xb071  Notebook Web Camera
> +product        CHICONY RTL8188CUS_1    0xaff7  RTL8188CUS
> +product        CHICONY RTL8188CUS_2    0xaff8  RTL8188CUS
> +product        CHICONY RTL8188CUS_3    0xaff9  RTL8188CUS
> +product        CHICONY RTL8188CUS_4    0xaffa  RTL8188CUS
> +product        CHICONY RTL8188CUS_5    0xaffa  RTL8188CUS
>  product CHICONY2 TWINKLECAM    0x600d  TwinkleCam USB camera
>
>  /* CH Products */
> @@ -1383,6 +1403,7 @@ product COREGA RT2870_2           0x003c  RT2870
>  product COREGA RT2870_3                0x003f  RT2870
>  product COREGA RT3070          0x0041  RT3070
>  product COREGA CGWLUSB300GNM   0x0042  CG-WLUSB300GNM
> +product COREGA RTL8192CU       0x0056  RTL8192CU
>
>  product COREGA WLUSB_11_STICK  0x7613  WLAN USB Stick 11
>  product COREGA FETHER_USB_TXC  0x9601  FEther USB-TXC
> @@ -1519,6 +1540,10 @@ product DLINK DSB650             0xabc1  10/100 Ethe
>  product DLINK DUBH7            0xf103  DUB-H7 USB 2.0 7-Port Hub
>  product DLINK DWR510_CD                0xa805  DWR-510 CD-ROM Mode
>  product DLINK DWR510           0x7e12  DWR-510
> +product DLINK RTL8188CU                0x3308  RTL8188CU
> +product        DLINK RTL8192CU_1       0x3307  RTL8192CU
> +product        DLINK RTL8192CU_2       0x3309  RTL8192CU
> +product        DLINK RTL8192CU_3       0x330a  RTL8192CU
>  product DLINK2 DWA120          0x3a0c  DWA-120
>  product DLINK2 DWA120_NF       0x3a0d  DWA-120 (no firmware)
>  product DLINK2 DWLG122C1       0x3c03  DWL-G122 c1
> @@ -1559,6 +1584,7 @@ product EDIMAX RT2870_1           0x7711  RT2870
>  product EDIMAX EW7717          0x7717  EW-7717
>  product EDIMAX EW7718          0x7718  EW-7718
>  product EDIMAX EW7811UN                0x7811  EW-7811Un
> +product        EDIMAX RTL8192CU        0x7822  RTL8192CU
>
>  /* eGalax Products */
>  product EGALAX TPANEL          0x0001  Touch Panel
> @@ -1691,6 +1717,10 @@ product FEIYA 5IN1               0x1132  5-in-1 Card R
>  product FEIYA ELANGO           0x6200  MicroSDHC Card Reader
>  product FEIYA AC110            0x6300  AC-110 Card Reader
>
> +/* FeiXun Communication products */
> +product FEIXUN RTL8188CU       0x0090  RTL8188CU
> +product FEIXUN RTL8192CU       0x0091  RTL8192CU
> +
>  /* Festo */
>  product FESTO CPX_USB          0x0102  CPX-USB
>  product FESTO CMSP             0x0501  CMSP
> @@ -2043,6 +2073,7 @@ product GUILLEMOT HWGUSB254       0xe000  HWGUS
>  product GUILLEMOT HWGUSB254LB  0xe010  HWGUSB2-54-LB
>  product GUILLEMOT HWGUSB254V2AP        0xe020  HWGUSB2-54V2-AP
>  product GUILLEMOT HWNU300      0xe030  HWNU-300
> +product GUILLEMOT HWNUP150     0xe033  HWNUP-150
>
>  /* Hagiwara products */
>  product HAGIWARA FGSM          0x0002  FlashGate SmartMedia Card Reader
> @@ -2066,6 +2097,7 @@ product HAWKING RT2870_1  0x0001  RT2870
>  product HAWKING RT2870_2       0x0003  RT2870
>  product HAWKING HWUN2          0x0009  HWUN2
>  product HAWKING RT3070         0x000b  RT3070
> +product HAWKING RTL8192CU      0x0019  RTL8192CU
>  product HAWKING UF100          0x400c  10/100 USB Ethernet
>
>  /* HID Global GmbH products */
> @@ -2115,6 +2147,7 @@ product HP 5400C          0x1005  Scanjet 5400C
>  product HP 2215                        0x1016  iPAQ 22xx/Jornada 548
>  product HP 568J                        0x1116  Jornada 568
>  product HP 930C                        0x1204  DeskJet 930c
> +product HP3 RTL8188CU          0x1629  RTL8188CU
>  product HP P2000U              0x1801  Inkjet P-2000U
>  product HP HS2300              0x1e1d  HS2300 HSDPA (aka MC8775)
>  product HP 640C                        0x2004  DeskJet 640c
> @@ -3024,6 +3057,8 @@ product NETGEAR WG111V3           0x4260  WG111v3
>  product NETGEAR WG111U         0x4300  WG111U
>  product NETGEAR WG111U_NF      0x4301  WG111U (no firmware)
>  product NETGEAR WG111V2                0x6a00  WG111V2
> +product NETGEAR RTL8192CU      0x9021  RTL8192CU
> +product NETGEAR WNA1000M       0x9041  WNA1000M
>  product NETGEAR2 MA101         0x4100  MA101
>  product NETGEAR2 MA101B                0x4102  MA101 Rev B
>  product NETGEAR3 WG111T                0x4250  WG111T
> @@ -3031,6 +3066,7 @@ product NETGEAR3 WG111T_NF        0x4251  WG111T
>  product NETGEAR3 WPN111                0x5f00  WPN111
>  product NETGEAR3 WPN111_NF     0x5f01  WPN111 (no firmware)
>  product NETGEAR3 WPN111_2      0x5f02  WPN111
> +product NETGEAR4 RTL8188CU     0x9041  RTL8188CU
>
>  /* NetIndex products */
>  product NETINDEX WS002IN       0x2001  Willcom WS002IN
> @@ -3046,6 +3082,7 @@ product NIKON D300                0x041a  Digital Came
>  /* NovaTech Products */
>  product NOVATECH NV902         0x9020  NovaTech NV-902W
>  product NOVATECH RT2573                0x9021  RT2573
> +product NOVATECH RTL8188CU     0x9071  RTL8188CU
>
>  /* Nokia products */
>  product NOKIA N958GB           0x0070  Nokia N95 8GBc
> @@ -3274,8 +3311,14 @@ product PIENGINEERING PS2USB     0x020b  PS2
>
>  /* Planex Communications products */
>  product PLANEX GW_US11H                0x14ea  GW-US11H WLAN
> +product PLANEX2 RTL8188CUS     0x1201  RTL8188CUS
>  product PLANEX2 GW_US11S       0x3220  GW-US11S WLAN
>  product PLANEX2 GW_US54GXS     0x5303  GW-US54GXS WLAN
> +product PLANEX2 RTL8188CU_1    0xab2a  RTL8188CU
> +product PLANEX2 RTL8188CU_2    0xed17  RTL8188CU
> +product PLANEX2 RTL8188CU_3    0x4902  RTL8188CU
> +product PLANEX2 RTL8188CU_4    0xab2e  RTL8188CU
> +product PLANEX2 RTL8192CU      0xab2b  RTL8192CU
>  product PLANEX2 GWUS54HP       0xab01  GW-US54HP
>  product PLANEX2 GWUS300MINIS   0xab24  GW-US300MiniS
>  product PLANEX2        RT3070          0xab25  RT3070
> @@ -3502,11 +3545,24 @@ product RATOC REXUSB60F         0xb020  USB seri
>  /* Green House and CompUSA OEM this part */
>  product REALTEK DUMMY          0x0000  Dummy product
>  product REALTEK USB20CRW       0x0158  USB20CRW Card Reader
> +product REALTEK RTL8188CTV      0x018a  RTL8188CTV
>  product REALTEK USBKR100       0x8150  USBKR100 USB Ethernet
> +product REALTEK RTL8188CE_0     0x8170  RTL8188CE
> +product REALTEK RTL8188CE_1     0x817e  RTL8188CE
> +product REALTEK RTL8188CU_0     0x8176  RTL8188CU
> +product REALTEK RTL8188CU_1     0x817a  RTL8188CU
> +product REALTEK RTL8188CU_2     0x817b  RTL8188CU
>  product REALTEK RTL8187                0x8187  RTL8187 Wireless Adapter
>  product REALTEK RTL8187B_0     0x8189  RTL8187B Wireless Adapter
>  product REALTEK RTL8187B_1     0x8197  RTL8187B Wireless Adapter
>  product REALTEK RTL8187B_2     0x8198  RTL8187B Wireless Adapter
> +product REALTEK RTL8188CUS     0x818a  RTL8188CUS
> +product REALTEK RTL8188CU_COMBO        0x8754  RTL8188CU
> +product REALTEK RTL8191CU      0x8177  RTL8191CU
> +product REALTEK RTL8192CU      0x8178  RTL8192CU
> +product REALTEK RTL8192CE      0x817c  RTL8192CE
> +product REALTEK RTL8188RU_1    0x817d  RTL8188RU
> +product REALTEK RTL8188RU_2    0x317f  RTL8188RU
>
>  /* RedOctane products */
>  product REDOCTANE DUMMY                0x0000  Dummy product
> @@ -3881,6 +3937,9 @@ product SITECOMEU RT3072_3        0x0047  RT3072
>  product SITECOMEU RT3072_4     0x0048  RT3072
>  product SITECOMEU RT3072_5     0x004a  RT3072
>  product SITECOMEU RT3072_6     0x004d  RT3072
> +product SITECOMEU RTL8188CU_1  0x0052  RTL8188CU
> +product SITECOMEU RTL8188CU_2  0x005c  RTL8188CU
> +product SITECOMEU RTL8192CU    0x0061  RTL8192CU
>  product SITECOMEU LN028                0x061c  LN-028
>  product SITECOMEU WL113                0x9071  WL-113
>  product SITECOMEU ZD1211B      0x9075  ZD1211B
> @@ -4110,6 +4169,10 @@ product TREK THUMBDRIVE          0x1111  ThumbDri
>  product TREK MEMKEY            0x8888  IBM USB Memory Key
>  product TREK THUMBDRIVE_8MB    0x9988  ThumbDrive_8MB
>
> +/* TRENDnet products */
> +product TRENDNET RTL8192CU     0x624d  RTL8192CU
> +product TRENDNET RTL8188CU     0x648b  RTL8188CU
> +
>  /* Tripp-Lite products */
>  product TRIPPLITE U209         0x2008  Serial
>
> @@ -4319,3 +4382,4 @@ product ZYXEL G220V2              0x340f  G-220 v2
>  product ZYXEL G202             0x3410  G-202
>  product ZYXEL RT2870_1         0x3416  RT2870
>  product ZYXEL RT2870_2         0x341a  RT2870
> +product ZYXEL RTL8192CU                0x341f  RTL8192CU
>
> Added: head/sys/dev/usb/wlan/if_urtwn.c
> ==============================================================================
> --- /dev/null   00:00:00 1970   (empty, because file is newly added)
> +++ head/sys/dev/usb/wlan/if_urtwn.c    Sat Jun  8 16:02:31 2013        (r251538)
> @@ -0,0 +1,3016 @@
> +/*     $OpenBSD: if_urtwn.c,v 1.16 2011/02/10 17:26:40 jakemsr Exp $   */
> +
> +/*-
> + * Copyright (c) 2010 Damien Bergamini <damien.bergamini at free.fr>
> + *
> + * Permission to use, copy, modify, and distribute this software for any
> + * purpose with or without fee is hereby granted, provided that the above
> + * copyright notice and this permission notice appear in all copies.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
> + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
> + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
> + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * Driver for Realtek RTL8188CE-VAU/RTL8188CUS/RTL8188RU/RTL8192CU.
> + */
> +
> +#include <sys/param.h>
> +#include <sys/sockio.h>
> +#include <sys/sysctl.h>
> +#include <sys/lock.h>
> +#include <sys/mutex.h>
> +#include <sys/mbuf.h>
> +#include <sys/kernel.h>
> +#include <sys/socket.h>
> +#include <sys/systm.h>
> +#include <sys/malloc.h>
> +#include <sys/module.h>
> +#include <sys/bus.h>
> +#include <sys/endian.h>
> +#include <sys/linker.h>
> +#include <sys/firmware.h>
> +#include <sys/kdb.h>
> +
> +#include <machine/bus.h>
> +#include <machine/resource.h>
> +#include <sys/rman.h>
> +
> +#include <net/bpf.h>
> +#include <net/if.h>
> +#include <net/if_arp.h>
> +#include <net/ethernet.h>
> +#include <net/if_dl.h>
> +#include <net/if_media.h>
> +#include <net/if_types.h>
> +
> +#include <netinet/in.h>
> +#include <netinet/in_systm.h>
> +#include <netinet/in_var.h>
> +#include <netinet/if_ether.h>
> +#include <netinet/ip.h>
> +
> +#include <net80211/ieee80211_var.h>
> +#include <net80211/ieee80211_regdomain.h>
> +#include <net80211/ieee80211_radiotap.h>
> +#include <net80211/ieee80211_ratectl.h>
> +
> +#include <dev/usb/usb.h>
> +#include <dev/usb/usbdi.h>
> +#include "usbdevs.h"
> +
> +#define USB_DEBUG_VAR urtwn_debug
> +#include <dev/usb/usb_debug.h>
> +
> +#include <dev/usb/wlan/if_urtwnreg.h>
> +
> +#ifdef USB_DEBUG
> +static int urtwn_debug = 0;
> +
> +SYSCTL_NODE(_hw_usb, OID_AUTO, urtwn, CTLFLAG_RW, 0, "USB urtwn");
> +SYSCTL_INT(_hw_usb_urtwn, OID_AUTO, debug, CTLFLAG_RW, &urtwn_debug, 0,
> +    "Debug level");
> +#endif
> +
> +#define        IEEE80211_HAS_ADDR4(wh) \
> +       (((wh)->i_fc[1] & IEEE80211_FC1_DIR_MASK) == IEEE80211_FC1_DIR_DSTODS)
> +
> +/* various supported device vendors/products */
> +static const struct usb_device_id urtwn_devs[] = {
> +#define URTWN_DEV(v,p)  { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) }
> +       URTWN_DEV(ABOCOM,       RTL8188CU_1),
> +       URTWN_DEV(ABOCOM,       RTL8188CU_2),
> +       URTWN_DEV(ABOCOM,       RTL8192CU),
> +       URTWN_DEV(ASUS,         RTL8192CU),
> +       URTWN_DEV(AZUREWAVE,    RTL8188CE_1),
> +       URTWN_DEV(AZUREWAVE,    RTL8188CE_2),
> +       URTWN_DEV(AZUREWAVE,    RTL8188CU),
> +       URTWN_DEV(BELKIN,       F7D2102),
> +       URTWN_DEV(BELKIN,       RTL8188CU),
> +       URTWN_DEV(BELKIN,       RTL8192CU),
> +       URTWN_DEV(CHICONY,      RTL8188CUS_1),
> +       URTWN_DEV(CHICONY,      RTL8188CUS_2),
> +       URTWN_DEV(CHICONY,      RTL8188CUS_3),
> +       URTWN_DEV(CHICONY,      RTL8188CUS_4),
> +       URTWN_DEV(CHICONY,      RTL8188CUS_5),
> +       URTWN_DEV(COREGA,       RTL8192CU),
> +       URTWN_DEV(DLINK,        RTL8188CU),
> +       URTWN_DEV(DLINK,        RTL8192CU_1),
> +       URTWN_DEV(DLINK,        RTL8192CU_2),
> +       URTWN_DEV(DLINK,        RTL8192CU_3),
> +       URTWN_DEV(EDIMAX,       EW7811UN),
> +       URTWN_DEV(EDIMAX,       RTL8192CU),
> +       URTWN_DEV(FEIXUN,       RTL8188CU),
> +       URTWN_DEV(FEIXUN,       RTL8192CU),
> +       URTWN_DEV(GUILLEMOT,    HWNUP150),
> +       URTWN_DEV(HAWKING,      RTL8192CU),
> +       URTWN_DEV(HP3,          RTL8188CU),
> +       URTWN_DEV(NETGEAR,      WNA1000M),
> +       URTWN_DEV(NETGEAR,      RTL8192CU),
> +       URTWN_DEV(NETGEAR4,     RTL8188CU),
> +       URTWN_DEV(NOVATECH,     RTL8188CU),
> +       URTWN_DEV(PLANEX2,      RTL8188CU_1),
> +       URTWN_DEV(PLANEX2,      RTL8188CU_2),
> +       URTWN_DEV(PLANEX2,      RTL8188CU_3),
> +       URTWN_DEV(PLANEX2,      RTL8188CU_4),
> +       URTWN_DEV(PLANEX2,      RTL8188CUS),
> +       URTWN_DEV(PLANEX2,      RTL8192CU),
> +       URTWN_DEV(REALTEK,      RTL8188CE_0),
> +       URTWN_DEV(REALTEK,      RTL8188CE_1),
> +       URTWN_DEV(REALTEK,      RTL8188CTV),
> +       URTWN_DEV(REALTEK,      RTL8188CU_0),
> +       URTWN_DEV(REALTEK,      RTL8188CU_1),
> +       URTWN_DEV(REALTEK,      RTL8188CU_2),
> +       URTWN_DEV(REALTEK,      RTL8188CU_COMBO),
> +       URTWN_DEV(REALTEK,      RTL8188CUS),
> +       URTWN_DEV(REALTEK,      RTL8188RU_1),
> +       URTWN_DEV(REALTEK,      RTL8188RU_2),
> +       URTWN_DEV(REALTEK,      RTL8191CU),
> +       URTWN_DEV(REALTEK,      RTL8192CE),
> +       URTWN_DEV(REALTEK,      RTL8192CU),
> +       URTWN_DEV(SITECOMEU,    RTL8188CU_1),
> +       URTWN_DEV(SITECOMEU,    RTL8188CU_2),
> +       URTWN_DEV(SITECOMEU,    RTL8192CU),
> +       URTWN_DEV(TRENDNET,     RTL8188CU),
> +       URTWN_DEV(TRENDNET,     RTL8192CU),
> +       URTWN_DEV(ZYXEL,        RTL8192CU),
> +#undef URTWN_DEV
> +};
> +
> +static device_probe_t  urtwn_match;
> +static device_attach_t urtwn_attach;
> +static device_detach_t urtwn_detach;
> +
> +static usb_callback_t   urtwn_bulk_tx_callback;
> +static usb_callback_t  urtwn_bulk_rx_callback;
> +
> +static usb_error_t     urtwn_do_request(struct urtwn_softc *sc,
> +                           struct usb_device_request *req, void *data);
> +static struct ieee80211vap *urtwn_vap_create(struct ieee80211com *,
> +                   const char [IFNAMSIZ], int, enum ieee80211_opmode, int,
> +                    const uint8_t [IEEE80211_ADDR_LEN],
> +                    const uint8_t [IEEE80211_ADDR_LEN]);
> +static void            urtwn_vap_delete(struct ieee80211vap *);
> +static struct mbuf *   urtwn_rx_frame(struct urtwn_softc *, uint8_t *, int,
> +                           int *);
> +static struct mbuf *   urtwn_rxeof(struct usb_xfer *, struct urtwn_data *,
> +                           int *, int8_t *);
> +static void            urtwn_txeof(struct usb_xfer *, struct urtwn_data *);
> +static int             urtwn_alloc_list(struct urtwn_softc *,
> +                           struct urtwn_data[], int, int);
> +static int             urtwn_alloc_rx_list(struct urtwn_softc *);
> +static int             urtwn_alloc_tx_list(struct urtwn_softc *);
> +static void            urtwn_free_tx_list(struct urtwn_softc *);
> +static void            urtwn_free_rx_list(struct urtwn_softc *);
> +static void            urtwn_free_list(struct urtwn_softc *,
> +                           struct urtwn_data data[], int);
> +static struct urtwn_data *     _urtwn_getbuf(struct urtwn_softc *);
> +static struct urtwn_data *     urtwn_getbuf(struct urtwn_softc *);
> +static int             urtwn_write_region_1(struct urtwn_softc *, uint16_t,
> +                           uint8_t *, int);
> +static void            urtwn_write_1(struct urtwn_softc *, uint16_t, uint8_t);
> +static void            urtwn_write_2(struct urtwn_softc *, uint16_t, uint16_t);
> +static void            urtwn_write_4(struct urtwn_softc *, uint16_t, uint32_t);
> +static int             urtwn_read_region_1(struct urtwn_softc *, uint16_t,
> +                           uint8_t *, int);
> +static uint8_t         urtwn_read_1(struct urtwn_softc *, uint16_t);
> +static uint16_t                urtwn_read_2(struct urtwn_softc *, uint16_t);
> +static uint32_t                urtwn_read_4(struct urtwn_softc *, uint16_t);
> +static int             urtwn_fw_cmd(struct urtwn_softc *, uint8_t,
> +                           const void *, int);
> +static void            urtwn_rf_write(struct urtwn_softc *, int, uint8_t,
> +                           uint32_t);
> +static uint32_t                urtwn_rf_read(struct urtwn_softc *, int, uint8_t);
> +static int             urtwn_llt_write(struct urtwn_softc *, uint32_t,
> +                           uint32_t);
> +static uint8_t         urtwn_efuse_read_1(struct urtwn_softc *, uint16_t);
> +static void            urtwn_efuse_read(struct urtwn_softc *);
> +static int             urtwn_read_chipid(struct urtwn_softc *);
> +static void            urtwn_read_rom(struct urtwn_softc *);
> +static int             urtwn_ra_init(struct urtwn_softc *);
> +static void            urtwn_tsf_sync_enable(struct urtwn_softc *);
> +static void            urtwn_set_led(struct urtwn_softc *, int, int);
> +static int             urtwn_newstate(struct ieee80211vap *,
> +                           enum ieee80211_state, int);
> +static void            urtwn_watchdog(void *);
> +static void            urtwn_update_avgrssi(struct urtwn_softc *, int, int8_t);
> +static int8_t          urtwn_get_rssi(struct urtwn_softc *, int, void *);
> +static int             urtwn_tx_start(struct urtwn_softc *,
> +                           struct ieee80211_node *, struct mbuf *,
> +                           struct urtwn_data *);
> +static void            urtwn_start(struct ifnet *);
> +static int             urtwn_ioctl(struct ifnet *, u_long, caddr_t);
> +static int             urtwn_power_on(struct urtwn_softc *);
> +static int             urtwn_llt_init(struct urtwn_softc *);
> +static void            urtwn_fw_reset(struct urtwn_softc *);
> +static int             urtwn_fw_loadpage(struct urtwn_softc *, int,
> +                           const uint8_t *, int);
> +static int             urtwn_load_firmware(struct urtwn_softc *);
> +static int             urtwn_dma_init(struct urtwn_softc *);
> +static void            urtwn_mac_init(struct urtwn_softc *);
> +static void            urtwn_bb_init(struct urtwn_softc *);
> +static void            urtwn_rf_init(struct urtwn_softc *);
> +static void            urtwn_cam_init(struct urtwn_softc *);
> +static void            urtwn_pa_bias_init(struct urtwn_softc *);
> +static void            urtwn_rxfilter_init(struct urtwn_softc *);
> +static void            urtwn_edca_init(struct urtwn_softc *);
> +static void            urtwn_write_txpower(struct urtwn_softc *, int,
> +                           uint16_t[]);
> +static void            urtwn_get_txpower(struct urtwn_softc *, int,
> +                           struct ieee80211_channel *,
> +                           struct ieee80211_channel *, uint16_t[]);
> +static void            urtwn_set_txpower(struct urtwn_softc *,
> +                           struct ieee80211_channel *,
> +                           struct ieee80211_channel *);
> +static void            urtwn_scan_start(struct ieee80211com *);
> +static void            urtwn_scan_end(struct ieee80211com *);
> +static void            urtwn_set_channel(struct ieee80211com *);
> +static void            urtwn_set_chan(struct urtwn_softc *,
> +                           struct ieee80211_channel *,
> +                           struct ieee80211_channel *);
> +static void            urtwn_update_mcast(struct ifnet *);
> +static void            urtwn_iq_calib(struct urtwn_softc *);
> +static void            urtwn_lc_calib(struct urtwn_softc *);
> +static void            urtwn_init(void *);
> +static void            urtwn_init_locked(void *);
> +static void            urtwn_stop(struct ifnet *, int);
> +static void            urtwn_stop_locked(struct ifnet *, int);
> +static void            urtwn_abort_xfers(struct urtwn_softc *);
> +static int             urtwn_raw_xmit(struct ieee80211_node *, struct mbuf *,
> +                           const struct ieee80211_bpf_params *);
> +
> +/* Aliases. */
> +#define        urtwn_bb_write  urtwn_write_4
> +#define urtwn_bb_read  urtwn_read_4
> +
> +static const struct usb_config urtwn_config[URTWN_N_TRANSFER] = {
> +       [URTWN_BULK_RX] = {
> +               .type = UE_BULK,
> +               .endpoint = UE_ADDR_ANY,
> +               .direction = UE_DIR_IN,
> +               .bufsize = URTWN_RXBUFSZ,
> +               .flags = {
> +                       .pipe_bof = 1,
> +                       .short_xfer_ok = 1
> +               },
> +               .callback = urtwn_bulk_rx_callback,
> +       },
> +       [URTWN_BULK_TX_BE] = {
> +               .type = UE_BULK,
> +               .endpoint = 0x03,
> +               .direction = UE_DIR_OUT,
> +               .bufsize = URTWN_TXBUFSZ,
> +               .flags = {
> +                       .ext_buffer = 1,
> +                       .pipe_bof = 1,
> +                       .force_short_xfer = 1
> +               },
> +               .callback = urtwn_bulk_tx_callback,
> +               .timeout = URTWN_TX_TIMEOUT,    /* ms */
> +       },
> +       [URTWN_BULK_TX_BK] = {
> +               .type = UE_BULK,
> +               .endpoint = 0x03,
> +               .direction = UE_DIR_OUT,
> +               .bufsize = URTWN_TXBUFSZ,
> +               .flags = {
> +                       .ext_buffer = 1,
> +                       .pipe_bof = 1,
> +                       .force_short_xfer = 1,
> +               },
> +               .callback = urtwn_bulk_tx_callback,
> +               .timeout = URTWN_TX_TIMEOUT,    /* ms */
> +       },
> +       [URTWN_BULK_TX_VI] = {
> +               .type = UE_BULK,
> +               .endpoint = 0x02,
> +               .direction = UE_DIR_OUT,
> +               .bufsize = URTWN_TXBUFSZ,
> +               .flags = {
> +                       .ext_buffer = 1,
> +                       .pipe_bof = 1,
> +                       .force_short_xfer = 1
> +               },
> +               .callback = urtwn_bulk_tx_callback,
> +               .timeout = URTWN_TX_TIMEOUT,    /* ms */
> +       },
> +       [URTWN_BULK_TX_VO] = {
> +               .type = UE_BULK,
> +               .endpoint = 0x02,
> +               .direction = UE_DIR_OUT,
> +               .bufsize = URTWN_TXBUFSZ,
> +               .flags = {
> +                       .ext_buffer = 1,
> +                       .pipe_bof = 1,
> +                       .force_short_xfer = 1
> +               },
> +               .callback = urtwn_bulk_tx_callback,
> +               .timeout = URTWN_TX_TIMEOUT,    /* ms */
> +       },
> +};
> +
> +static int
> +urtwn_match(device_t self)
> +{
> +       struct usb_attach_arg *uaa = device_get_ivars(self);
> +
> +       if (uaa->usb_mode != USB_MODE_HOST)
> +               return (ENXIO);
> +       if (uaa->info.bConfigIndex != URTWN_CONFIG_INDEX)
> +               return (ENXIO);
> +       if (uaa->info.bIfaceIndex != URTWN_IFACE_INDEX)
> +               return (ENXIO);
> +
> +       return (usbd_lookup_id_by_uaa(urtwn_devs, sizeof(urtwn_devs), uaa));
> +}
> +
> +static int
> +urtwn_attach(device_t self)
> +{
> +       struct usb_attach_arg *uaa = device_get_ivars(self);
> +       struct urtwn_softc *sc = device_get_softc(self);
> +       struct ifnet *ifp;
> +       struct ieee80211com *ic;
> +       uint8_t iface_index, bands;
> +       int error;
> +
> +       device_set_usb_desc(self);
> +       sc->sc_udev = uaa->device;
> +       sc->sc_dev = self;
> +
> +       mtx_init(&sc->sc_mtx, device_get_nameunit(self),
> +           MTX_NETWORK_LOCK, MTX_DEF);
> +       callout_init(&sc->sc_watchdog_ch, 0);
> +
> +       iface_index = URTWN_IFACE_INDEX;
> +       error = usbd_transfer_setup(uaa->device, &iface_index, sc->sc_xfer,
> +           urtwn_config, URTWN_N_TRANSFER, sc, &sc->sc_mtx);
> +       if (error) {
> +               device_printf(self, "could not allocate USB transfers, "
> +                   "err=%s\n", usbd_errstr(error));
> +               goto detach;
> +       }
> +
> +       URTWN_LOCK(sc);
> +
> +       error = urtwn_read_chipid(sc);
> +       if (error) {
> +               device_printf(sc->sc_dev, "unsupported test chip\n");
> +               URTWN_UNLOCK(sc);
> +               goto detach;
> +       }
> +
> +       /* Determine number of Tx/Rx chains. */
> +       if (sc->chip & URTWN_CHIP_92C) {
> +               sc->ntxchains = (sc->chip & URTWN_CHIP_92C_1T2R) ? 1 : 2;
> +               sc->nrxchains = 2;
> +       } else {
> +               sc->ntxchains = 1;
> +               sc->nrxchains = 1;
> +       }
> +       urtwn_read_rom(sc);
> +
> +       device_printf(sc->sc_dev, "MAC/BB RTL%s, RF 6052 %dT%dR\n",
> +           (sc->chip & URTWN_CHIP_92C) ? "8192CU" :
> +           (sc->board_type == R92C_BOARD_TYPE_HIGHPA) ? "8188RU" :
> +           (sc->board_type == R92C_BOARD_TYPE_MINICARD) ? "8188CE-VAU" :
> +           "8188CUS", sc->ntxchains, sc->nrxchains);
> +
> +       URTWN_UNLOCK(sc);
> +
> +       ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211);
> +       if (ifp == NULL) {
> +               device_printf(sc->sc_dev, "can not if_alloc()\n");
> +               goto detach;
> +       }
> +       ic = ifp->if_l2com;
> +
> +       ifp->if_softc = sc;
> +       if_initname(ifp, "urtwn", device_get_unit(sc->sc_dev));
> +       ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
> +       ifp->if_init = urtwn_init;
> +       ifp->if_ioctl = urtwn_ioctl;
> +       ifp->if_start = urtwn_start;
> +       IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen);
> +       ifp->if_snd.ifq_drv_maxlen = ifqmaxlen;
> +       IFQ_SET_READY(&ifp->if_snd);
> +
> +       ic->ic_ifp = ifp;
> +       ic->ic_phytype = IEEE80211_T_OFDM;      /* not only, but not used */
> +       ic->ic_opmode = IEEE80211_M_STA;        /* default to BSS mode */
> +
> +       /* set device capabilities */
> +       ic->ic_caps =
> +                 IEEE80211_C_STA               /* station mode */
> +               | IEEE80211_C_MONITOR           /* monitor mode */
> +               | IEEE80211_C_SHPREAMBLE        /* short preamble supported */
> +               | IEEE80211_C_SHSLOT            /* short slot time supported */
> +               | IEEE80211_C_BGSCAN            /* capable of bg scanning */
> +               | IEEE80211_C_WPA               /* 802.11i */
> +               ;
> +
> +       bands = 0;
> +       setbit(&bands, IEEE80211_MODE_11B);
> +       setbit(&bands, IEEE80211_MODE_11G);
> +       ieee80211_init_channels(ic, NULL, &bands);
> +
> +       ieee80211_ifattach(ic, sc->sc_bssid);
> +       ic->ic_raw_xmit = urtwn_raw_xmit;
> +       ic->ic_scan_start = urtwn_scan_start;
> +       ic->ic_scan_end = urtwn_scan_end;
> +       ic->ic_set_channel = urtwn_set_channel;
> +
> +       ic->ic_vap_create = urtwn_vap_create;
> +       ic->ic_vap_delete = urtwn_vap_delete;
> +       ic->ic_update_mcast = urtwn_update_mcast;
> +
> +       ieee80211_radiotap_attach(ic, &sc->sc_txtap.wt_ihdr,
> +           sizeof(sc->sc_txtap), URTWN_TX_RADIOTAP_PRESENT,
> +           &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap),
> +           URTWN_RX_RADIOTAP_PRESENT);
> +
> +       if (bootverbose)
> +               ieee80211_announce(ic);
> +
> +       return (0);
> +
> +detach:
> +       urtwn_detach(self);
> +       return (ENXIO);                 /* failure */
> +}
> +
> +static int
> +urtwn_detach(device_t self)
> +{
> +       struct urtwn_softc *sc = device_get_softc(self);
> +       struct ifnet *ifp = sc->sc_ifp;
> +       struct ieee80211com *ic = ifp->if_l2com;
> +
> +       if (!device_is_attached(self))
> +               return (0);
> +
> +       urtwn_stop(ifp, 1);
> +
> +       callout_drain(&sc->sc_watchdog_ch);
> +
> +       /* stop all USB transfers */
> +       usbd_transfer_unsetup(sc->sc_xfer, URTWN_N_TRANSFER);
> +       ieee80211_ifdetach(ic);
> +
> +       urtwn_free_tx_list(sc);
> +       urtwn_free_rx_list(sc);
> +
> +       if_free(ifp);
> +       mtx_destroy(&sc->sc_mtx);
> +
> +       return (0);
> +}
> +
> +static void
> +urtwn_free_tx_list(struct urtwn_softc *sc)
> +{
> +       urtwn_free_list(sc, sc->sc_tx, URTWN_TX_LIST_COUNT);
> +}
> +
> +static void
> +urtwn_free_rx_list(struct urtwn_softc *sc)
> +{
> +       urtwn_free_list(sc, sc->sc_rx, URTWN_RX_LIST_COUNT);
> +}
> +
> +static void
> +urtwn_free_list(struct urtwn_softc *sc, struct urtwn_data data[], int ndata)
> +{
> +       int i;
> +
> +       for (i = 0; i < ndata; i++) {
> +               struct urtwn_data *dp = &data[i];
> +
> +               if (dp->buf != NULL) {
> +                       free(dp->buf, M_USBDEV);
> +                       dp->buf = NULL;
> +               }
> +               if (dp->ni != NULL) {
> +                       ieee80211_free_node(dp->ni);
> +                       dp->ni = NULL;
> +               }
> +       }
> +}
> +
> +static usb_error_t
> +urtwn_do_request(struct urtwn_softc *sc, struct usb_device_request *req,
> +    void *data)
> +{
> +       usb_error_t err;
> +       int ntries = 10;
> +
> +       URTWN_ASSERT_LOCKED(sc);
> +
> +       while (ntries--) {
> +               err = usbd_do_request_flags(sc->sc_udev, &sc->sc_mtx,
> +                   req, data, 0, NULL, 250 /* ms */);
> +               if (err == 0)
> +                       break;
> +
> +               DPRINTFN(1, "Control request failed, %s (retrying)\n",
> +                   usbd_errstr(err));
> +               usb_pause_mtx(&sc->sc_mtx, hz / 100);
> +       }
> +       return (err);
> +}
> +
> +static struct ieee80211vap *
> +urtwn_vap_create(struct ieee80211com *ic, const char name[IFNAMSIZ], int unit,
> +    enum ieee80211_opmode opmode, int flags,
> +    const uint8_t bssid[IEEE80211_ADDR_LEN],
> +    const uint8_t mac[IEEE80211_ADDR_LEN])
> +{
> +       struct urtwn_vap *uvp;
> +       struct ieee80211vap *vap;
> +
> +       if (!TAILQ_EMPTY(&ic->ic_vaps))         /* only one at a time */
> +               return (NULL);
> +
> +       uvp = (struct urtwn_vap *) malloc(sizeof(struct urtwn_vap),
> +           M_80211_VAP, M_NOWAIT | M_ZERO);
> +       if (uvp == NULL)
> +               return (NULL);
> +       vap = &uvp->vap;
> +       /* enable s/w bmiss handling for sta mode */
> +       ieee80211_vap_setup(ic, vap, name, unit, opmode,
> +           flags | IEEE80211_CLONE_NOBEACONS, bssid, mac);
> +
> +       /* override state transition machine */
> +       uvp->newstate = vap->iv_newstate;
> +       vap->iv_newstate = urtwn_newstate;
> +
> +       /* complete setup */
> +       ieee80211_vap_attach(vap, ieee80211_media_change,
> +           ieee80211_media_status);
> +       ic->ic_opmode = opmode;
> +       return (vap);
> +}
> +
> +static void
> +urtwn_vap_delete(struct ieee80211vap *vap)
> +{
> +       struct urtwn_vap *uvp = URTWN_VAP(vap);
> +
> +       ieee80211_vap_detach(vap);
> +       free(uvp, M_80211_VAP);
> +}
> +
> +static struct mbuf *
> +urtwn_rx_frame(struct urtwn_softc *sc, uint8_t *buf, int pktlen, int *rssi_p)
> +{
> +       struct ifnet *ifp = sc->sc_ifp;
> +       struct ieee80211com *ic = ifp->if_l2com;
> +       struct ieee80211_frame *wh;
> +       struct mbuf *m;
> +       struct r92c_rx_stat *stat;
> +       uint32_t rxdw0, rxdw3;
> +       uint8_t rate;
> +       int8_t rssi = 0;
> +       int infosz;
> +
> +       /*
>
> *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-head mailing list