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

Rui Paulo rpaulo at FreeBSD.org
Sat Jun 8 16:02:33 UTC 2013


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

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