1 /* $NetBSD: if_ural.c,v 1.32 2009/09/23 19:07:19 plunky Exp $ */
2 /* $FreeBSD: /repoman/r/ncvs/src/sys/dev/usb/if_ural.c,v 1.40 2006/06/02 23:14:40 sam Exp $ */
5 * Copyright (c) 2005, 2006
6 * Damien Bergamini <damien.bergamini@free.fr>
8 * Permission to use, copy, modify, and distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22 * Ralink Technology RT2500USB chipset driver
23 * http://www.ralinktech.com/
26 #include <sys/cdefs.h>
27 __KERNEL_RCSID(0, "$NetBSD: if_ural.c,v 1.32 2009/09/23 19:07:19 plunky Exp $");
31 #include <sys/param.h>
32 #include <sys/sockio.h>
33 #include <sys/sysctl.h>
35 #include <sys/kernel.h>
36 #include <sys/socket.h>
37 #include <sys/systm.h>
38 #include <sys/malloc.h>
40 #include <sys/device.h>
43 #include <machine/endian.h>
50 #include <net/if_arp.h>
51 #include <net/if_dl.h>
52 #include <net/if_ether.h>
53 #include <net/if_media.h>
54 #include <net/if_types.h>
56 #include <netinet/in.h>
57 #include <netinet/in_systm.h>
58 #include <netinet/in_var.h>
59 #include <netinet/ip.h>
61 #include <net80211/ieee80211_netbsd.h>
62 #include <net80211/ieee80211_var.h>
63 #include <net80211/ieee80211_amrr.h>
64 #include <net80211/ieee80211_radiotap.h>
66 #include <dev/usb/usb.h>
67 #include <dev/usb/usbdi.h>
68 #include <dev/usb/usbdi_util.h>
69 #include <dev/usb/usbdevs.h>
71 #include <dev/usb/if_uralreg.h>
72 #include <dev/usb/if_uralvar.h>
79 #define DPRINTF(x) do { if (ural_debug) logprintf x; } while (0)
80 #define DPRINTFN(n, x) do { if (ural_debug >= (n)) logprintf x; } while (0)
84 #define DPRINTFN(n, x)
87 /* various supported device vendors/products */
88 static const struct usb_devno ural_devs
[] = {
89 { USB_VENDOR_ASUSTEK
, USB_PRODUCT_ASUSTEK_WL167G
},
90 { USB_VENDOR_ASUSTEK
, USB_PRODUCT_RALINK_RT2570
},
91 { USB_VENDOR_BELKIN
, USB_PRODUCT_BELKIN_F5D7050
},
92 { USB_VENDOR_CISCOLINKSYS
, USB_PRODUCT_CISCOLINKSYS_WUSB54G
},
93 { USB_VENDOR_CISCOLINKSYS
, USB_PRODUCT_CISCOLINKSYS_WUSB54GP
},
94 { USB_VENDOR_CISCOLINKSYS
, USB_PRODUCT_CISCOLINKSYS_HU200TS
},
95 { USB_VENDOR_CONCEPTRONIC
, USB_PRODUCT_CONCEPTRONIC_C54RU
},
96 { USB_VENDOR_DLINK
, USB_PRODUCT_DLINK_DWLG122
},
97 { USB_VENDOR_GIGABYTE
, USB_PRODUCT_GIGABYTE_GNWBKG
},
98 { USB_VENDOR_GUILLEMOT
, USB_PRODUCT_GUILLEMOT_HWGUSB254
},
99 { USB_VENDOR_MELCO
, USB_PRODUCT_MELCO_KG54
},
100 { USB_VENDOR_MELCO
, USB_PRODUCT_MELCO_KG54AI
},
101 { USB_VENDOR_MELCO
, USB_PRODUCT_MELCO_KG54YB
},
102 { USB_VENDOR_MELCO
, USB_PRODUCT_MELCO_NINWIFI
},
103 { USB_VENDOR_MSI
, USB_PRODUCT_MSI_MS6861
},
104 { USB_VENDOR_MSI
, USB_PRODUCT_MSI_MS6865
},
105 { USB_VENDOR_MSI
, USB_PRODUCT_MSI_MS6869
},
106 { USB_VENDOR_NOVATECH
, USB_PRODUCT_NOVATECH_NV902W
},
107 { USB_VENDOR_RALINK
, USB_PRODUCT_RALINK_RT2570
},
108 { USB_VENDOR_RALINK
, USB_PRODUCT_RALINK_RT2570_2
},
109 { USB_VENDOR_RALINK
, USB_PRODUCT_RALINK_RT2570_3
},
110 { USB_VENDOR_RALINK_2
, USB_PRODUCT_RALINK_2_RT2570
},
111 { USB_VENDOR_SMC
, USB_PRODUCT_SMC_2862WG
},
112 { USB_VENDOR_SPHAIRON
, USB_PRODUCT_SPHAIRON_UB801R
},
113 { USB_VENDOR_SURECOM
, USB_PRODUCT_SURECOM_EP9001G
},
114 { USB_VENDOR_VTECH
, USB_PRODUCT_VTECH_RT2570
},
115 { USB_VENDOR_ZINWELL
, USB_PRODUCT_ZINWELL_ZWXG261
},
118 Static
int ural_alloc_tx_list(struct ural_softc
*);
119 Static
void ural_free_tx_list(struct ural_softc
*);
120 Static
int ural_alloc_rx_list(struct ural_softc
*);
121 Static
void ural_free_rx_list(struct ural_softc
*);
122 Static
int ural_media_change(struct ifnet
*);
123 Static
void ural_next_scan(void *);
124 Static
void ural_task(void *);
125 Static
int ural_newstate(struct ieee80211com
*,
126 enum ieee80211_state
, int);
127 Static
int ural_rxrate(struct ural_rx_desc
*);
128 Static
void ural_txeof(usbd_xfer_handle
, usbd_private_handle
,
130 Static
void ural_rxeof(usbd_xfer_handle
, usbd_private_handle
,
132 Static
int ural_ack_rate(struct ieee80211com
*, int);
133 Static
uint16_t ural_txtime(int, int, uint32_t);
134 Static
uint8_t ural_plcp_signal(int);
135 Static
void ural_setup_tx_desc(struct ural_softc
*,
136 struct ural_tx_desc
*, uint32_t, int, int);
137 Static
int ural_tx_bcn(struct ural_softc
*, struct mbuf
*,
138 struct ieee80211_node
*);
139 Static
int ural_tx_mgt(struct ural_softc
*, struct mbuf
*,
140 struct ieee80211_node
*);
141 Static
int ural_tx_data(struct ural_softc
*, struct mbuf
*,
142 struct ieee80211_node
*);
143 Static
void ural_start(struct ifnet
*);
144 Static
void ural_watchdog(struct ifnet
*);
145 Static
int ural_reset(struct ifnet
*);
146 Static
int ural_ioctl(struct ifnet
*, u_long
, void *);
147 Static
void ural_set_testmode(struct ural_softc
*);
148 Static
void ural_eeprom_read(struct ural_softc
*, uint16_t, void *,
150 Static
uint16_t ural_read(struct ural_softc
*, uint16_t);
151 Static
void ural_read_multi(struct ural_softc
*, uint16_t, void *,
153 Static
void ural_write(struct ural_softc
*, uint16_t, uint16_t);
154 Static
void ural_write_multi(struct ural_softc
*, uint16_t, void *,
156 Static
void ural_bbp_write(struct ural_softc
*, uint8_t, uint8_t);
157 Static
uint8_t ural_bbp_read(struct ural_softc
*, uint8_t);
158 Static
void ural_rf_write(struct ural_softc
*, uint8_t, uint32_t);
159 Static
void ural_set_chan(struct ural_softc
*,
160 struct ieee80211_channel
*);
161 Static
void ural_disable_rf_tune(struct ural_softc
*);
162 Static
void ural_enable_tsf_sync(struct ural_softc
*);
163 Static
void ural_update_slot(struct ifnet
*);
164 Static
void ural_set_txpreamble(struct ural_softc
*);
165 Static
void ural_set_basicrates(struct ural_softc
*);
166 Static
void ural_set_bssid(struct ural_softc
*, uint8_t *);
167 Static
void ural_set_macaddr(struct ural_softc
*, uint8_t *);
168 Static
void ural_update_promisc(struct ural_softc
*);
169 Static
const char *ural_get_rf(int);
170 Static
void ural_read_eeprom(struct ural_softc
*);
171 Static
int ural_bbp_init(struct ural_softc
*);
172 Static
void ural_set_txantenna(struct ural_softc
*, int);
173 Static
void ural_set_rxantenna(struct ural_softc
*, int);
174 Static
int ural_init(struct ifnet
*);
175 Static
void ural_stop(struct ifnet
*, int);
176 Static
void ural_amrr_start(struct ural_softc
*,
177 struct ieee80211_node
*);
178 Static
void ural_amrr_timeout(void *);
179 Static
void ural_amrr_update(usbd_xfer_handle
, usbd_private_handle
,
183 * Supported rates for 802.11a/b/g modes (in 500Kbps unit).
185 static const struct ieee80211_rateset ural_rateset_11a
=
186 { 8, { 12, 18, 24, 36, 48, 72, 96, 108 } };
188 static const struct ieee80211_rateset ural_rateset_11b
=
189 { 4, { 2, 4, 11, 22 } };
191 static const struct ieee80211_rateset ural_rateset_11g
=
192 { 12, { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 } };
195 * Default values for MAC registers; values taken from the reference driver.
197 static const struct {
201 { RAL_TXRX_CSR5
, 0x8c8d },
202 { RAL_TXRX_CSR6
, 0x8b8a },
203 { RAL_TXRX_CSR7
, 0x8687 },
204 { RAL_TXRX_CSR8
, 0x0085 },
205 { RAL_MAC_CSR13
, 0x1111 },
206 { RAL_MAC_CSR14
, 0x1e11 },
207 { RAL_TXRX_CSR21
, 0xe78f },
208 { RAL_MAC_CSR9
, 0xff1d },
209 { RAL_MAC_CSR11
, 0x0002 },
210 { RAL_MAC_CSR22
, 0x0053 },
211 { RAL_MAC_CSR15
, 0x0000 },
212 { RAL_MAC_CSR8
, 0x0780 },
213 { RAL_TXRX_CSR19
, 0x0000 },
214 { RAL_TXRX_CSR18
, 0x005a },
215 { RAL_PHY_CSR2
, 0x0000 },
216 { RAL_TXRX_CSR0
, 0x1ec0 },
217 { RAL_PHY_CSR4
, 0x000f }
221 * Default values for BBP registers; values taken from the reference driver.
223 static const struct {
262 * Default values for RF register R2 indexed by channel numbers.
264 static const uint32_t ural_rf2522_r2
[] = {
265 0x307f6, 0x307fb, 0x30800, 0x30805, 0x3080a, 0x3080f, 0x30814,
266 0x30819, 0x3081e, 0x30823, 0x30828, 0x3082d, 0x30832, 0x3083e
269 static const uint32_t ural_rf2523_r2
[] = {
270 0x00327, 0x00328, 0x00329, 0x0032a, 0x0032b, 0x0032c, 0x0032d,
271 0x0032e, 0x0032f, 0x00340, 0x00341, 0x00342, 0x00343, 0x00346
274 static const uint32_t ural_rf2524_r2
[] = {
275 0x00327, 0x00328, 0x00329, 0x0032a, 0x0032b, 0x0032c, 0x0032d,
276 0x0032e, 0x0032f, 0x00340, 0x00341, 0x00342, 0x00343, 0x00346
279 static const uint32_t ural_rf2525_r2
[] = {
280 0x20327, 0x20328, 0x20329, 0x2032a, 0x2032b, 0x2032c, 0x2032d,
281 0x2032e, 0x2032f, 0x20340, 0x20341, 0x20342, 0x20343, 0x20346
284 static const uint32_t ural_rf2525_hi_r2
[] = {
285 0x2032f, 0x20340, 0x20341, 0x20342, 0x20343, 0x20344, 0x20345,
286 0x20346, 0x20347, 0x20348, 0x20349, 0x2034a, 0x2034b, 0x2034e
289 static const uint32_t ural_rf2525e_r2
[] = {
290 0x2044d, 0x2044e, 0x2044f, 0x20460, 0x20461, 0x20462, 0x20463,
291 0x20464, 0x20465, 0x20466, 0x20467, 0x20468, 0x20469, 0x2046b
294 static const uint32_t ural_rf2526_hi_r2
[] = {
295 0x0022a, 0x0022b, 0x0022b, 0x0022c, 0x0022c, 0x0022d, 0x0022d,
296 0x0022e, 0x0022e, 0x0022f, 0x0022d, 0x00240, 0x00240, 0x00241
299 static const uint32_t ural_rf2526_r2
[] = {
300 0x00226, 0x00227, 0x00227, 0x00228, 0x00228, 0x00229, 0x00229,
301 0x0022a, 0x0022a, 0x0022b, 0x0022b, 0x0022c, 0x0022c, 0x0022d
305 * For dual-band RF, RF registers R1 and R4 also depend on channel number;
306 * values taken from the reference driver.
308 static const struct {
314 { 1, 0x08808, 0x0044d, 0x00282 },
315 { 2, 0x08808, 0x0044e, 0x00282 },
316 { 3, 0x08808, 0x0044f, 0x00282 },
317 { 4, 0x08808, 0x00460, 0x00282 },
318 { 5, 0x08808, 0x00461, 0x00282 },
319 { 6, 0x08808, 0x00462, 0x00282 },
320 { 7, 0x08808, 0x00463, 0x00282 },
321 { 8, 0x08808, 0x00464, 0x00282 },
322 { 9, 0x08808, 0x00465, 0x00282 },
323 { 10, 0x08808, 0x00466, 0x00282 },
324 { 11, 0x08808, 0x00467, 0x00282 },
325 { 12, 0x08808, 0x00468, 0x00282 },
326 { 13, 0x08808, 0x00469, 0x00282 },
327 { 14, 0x08808, 0x0046b, 0x00286 },
329 { 36, 0x08804, 0x06225, 0x00287 },
330 { 40, 0x08804, 0x06226, 0x00287 },
331 { 44, 0x08804, 0x06227, 0x00287 },
332 { 48, 0x08804, 0x06228, 0x00287 },
333 { 52, 0x08804, 0x06229, 0x00287 },
334 { 56, 0x08804, 0x0622a, 0x00287 },
335 { 60, 0x08804, 0x0622b, 0x00287 },
336 { 64, 0x08804, 0x0622c, 0x00287 },
338 { 100, 0x08804, 0x02200, 0x00283 },
339 { 104, 0x08804, 0x02201, 0x00283 },
340 { 108, 0x08804, 0x02202, 0x00283 },
341 { 112, 0x08804, 0x02203, 0x00283 },
342 { 116, 0x08804, 0x02204, 0x00283 },
343 { 120, 0x08804, 0x02205, 0x00283 },
344 { 124, 0x08804, 0x02206, 0x00283 },
345 { 128, 0x08804, 0x02207, 0x00283 },
346 { 132, 0x08804, 0x02208, 0x00283 },
347 { 136, 0x08804, 0x02209, 0x00283 },
348 { 140, 0x08804, 0x0220a, 0x00283 },
350 { 149, 0x08808, 0x02429, 0x00281 },
351 { 153, 0x08808, 0x0242b, 0x00281 },
352 { 157, 0x08808, 0x0242d, 0x00281 },
353 { 161, 0x08808, 0x0242f, 0x00281 }
356 USB_DECLARE_DRIVER(ural
);
360 USB_MATCH_START(ural
, uaa
);
362 return (usb_lookup(ural_devs
, uaa
->vendor
, uaa
->product
) != NULL
) ?
363 UMATCH_VENDOR_PRODUCT
: UMATCH_NONE
;
368 USB_ATTACH_START(ural
, sc
, uaa
);
369 struct ieee80211com
*ic
= &sc
->sc_ic
;
370 struct ifnet
*ifp
= &sc
->sc_if
;
371 usb_interface_descriptor_t
*id
;
372 usb_endpoint_descriptor_t
*ed
;
378 sc
->sc_udev
= uaa
->device
;
383 devinfop
= usbd_devinfo_alloc(sc
->sc_udev
, 0);
384 aprint_normal_dev(self
, "%s\n", devinfop
);
385 usbd_devinfo_free(devinfop
);
387 if (usbd_set_config_no(sc
->sc_udev
, RAL_CONFIG_NO
, 0) != 0) {
388 aprint_error_dev(self
, "could not set configuration no\n");
389 USB_ATTACH_ERROR_RETURN
;
392 /* get the first interface handle */
393 error
= usbd_device2interface_handle(sc
->sc_udev
, RAL_IFACE_INDEX
,
396 aprint_error_dev(self
, "could not get interface handle\n");
397 USB_ATTACH_ERROR_RETURN
;
403 id
= usbd_get_interface_descriptor(sc
->sc_iface
);
405 sc
->sc_rx_no
= sc
->sc_tx_no
= -1;
406 for (i
= 0; i
< id
->bNumEndpoints
; i
++) {
407 ed
= usbd_interface2endpoint_descriptor(sc
->sc_iface
, i
);
409 aprint_error_dev(self
,
410 "no endpoint descriptor for %d\n", i
);
411 USB_ATTACH_ERROR_RETURN
;
414 if (UE_GET_DIR(ed
->bEndpointAddress
) == UE_DIR_IN
&&
415 UE_GET_XFERTYPE(ed
->bmAttributes
) == UE_BULK
)
416 sc
->sc_rx_no
= ed
->bEndpointAddress
;
417 else if (UE_GET_DIR(ed
->bEndpointAddress
) == UE_DIR_OUT
&&
418 UE_GET_XFERTYPE(ed
->bmAttributes
) == UE_BULK
)
419 sc
->sc_tx_no
= ed
->bEndpointAddress
;
421 if (sc
->sc_rx_no
== -1 || sc
->sc_tx_no
== -1) {
422 aprint_error_dev(self
, "missing endpoint\n");
423 USB_ATTACH_ERROR_RETURN
;
426 usb_init_task(&sc
->sc_task
, ural_task
, sc
);
427 usb_callout_init(sc
->sc_scan_ch
);
428 sc
->amrr
.amrr_min_success_threshold
= 1;
429 sc
->amrr
.amrr_max_success_threshold
= 15;
430 usb_callout_init(sc
->sc_amrr_ch
);
432 /* retrieve RT2570 rev. no */
433 sc
->asic_rev
= ural_read(sc
, RAL_MAC_CSR0
);
435 /* retrieve MAC address and various other things from EEPROM */
436 ural_read_eeprom(sc
);
438 aprint_normal_dev(self
, "MAC/BBP RT2570 (rev 0x%02x), RF %s\n",
439 sc
->asic_rev
, ural_get_rf(sc
->rf_rev
));
442 memcpy(ifp
->if_xname
, USBDEVNAME(sc
->sc_dev
), IFNAMSIZ
);
443 ifp
->if_flags
= IFF_BROADCAST
| IFF_SIMPLEX
| IFF_MULTICAST
;
444 ifp
->if_init
= ural_init
;
445 ifp
->if_ioctl
= ural_ioctl
;
446 ifp
->if_start
= ural_start
;
447 ifp
->if_watchdog
= ural_watchdog
;
448 IFQ_SET_MAXLEN(&ifp
->if_snd
, IFQ_MAXLEN
);
449 IFQ_SET_READY(&ifp
->if_snd
);
452 ic
->ic_phytype
= IEEE80211_T_OFDM
; /* not only, but not used */
453 ic
->ic_opmode
= IEEE80211_M_STA
; /* default to BSS mode */
454 ic
->ic_state
= IEEE80211_S_INIT
;
456 /* set device capabilities */
458 IEEE80211_C_IBSS
| /* IBSS mode supported */
459 IEEE80211_C_MONITOR
| /* monitor mode supported */
460 IEEE80211_C_HOSTAP
| /* HostAp mode supported */
461 IEEE80211_C_TXPMGT
| /* tx power management */
462 IEEE80211_C_SHPREAMBLE
| /* short preamble supported */
463 IEEE80211_C_SHSLOT
| /* short slot time supported */
464 IEEE80211_C_WPA
; /* 802.11i */
466 if (sc
->rf_rev
== RAL_RF_5222
) {
467 /* set supported .11a rates */
468 ic
->ic_sup_rates
[IEEE80211_MODE_11A
] = ural_rateset_11a
;
470 /* set supported .11a channels */
471 for (i
= 36; i
<= 64; i
+= 4) {
472 ic
->ic_channels
[i
].ic_freq
=
473 ieee80211_ieee2mhz(i
, IEEE80211_CHAN_5GHZ
);
474 ic
->ic_channels
[i
].ic_flags
= IEEE80211_CHAN_A
;
476 for (i
= 100; i
<= 140; i
+= 4) {
477 ic
->ic_channels
[i
].ic_freq
=
478 ieee80211_ieee2mhz(i
, IEEE80211_CHAN_5GHZ
);
479 ic
->ic_channels
[i
].ic_flags
= IEEE80211_CHAN_A
;
481 for (i
= 149; i
<= 161; i
+= 4) {
482 ic
->ic_channels
[i
].ic_freq
=
483 ieee80211_ieee2mhz(i
, IEEE80211_CHAN_5GHZ
);
484 ic
->ic_channels
[i
].ic_flags
= IEEE80211_CHAN_A
;
488 /* set supported .11b and .11g rates */
489 ic
->ic_sup_rates
[IEEE80211_MODE_11B
] = ural_rateset_11b
;
490 ic
->ic_sup_rates
[IEEE80211_MODE_11G
] = ural_rateset_11g
;
492 /* set supported .11b and .11g channels (1 through 14) */
493 for (i
= 1; i
<= 14; i
++) {
494 ic
->ic_channels
[i
].ic_freq
=
495 ieee80211_ieee2mhz(i
, IEEE80211_CHAN_2GHZ
);
496 ic
->ic_channels
[i
].ic_flags
=
497 IEEE80211_CHAN_CCK
| IEEE80211_CHAN_OFDM
|
498 IEEE80211_CHAN_DYN
| IEEE80211_CHAN_2GHZ
;
502 ieee80211_ifattach(ic
);
503 ic
->ic_reset
= ural_reset
;
505 /* override state transition machine */
506 sc
->sc_newstate
= ic
->ic_newstate
;
507 ic
->ic_newstate
= ural_newstate
;
508 ieee80211_media_init(ic
, ural_media_change
, ieee80211_media_status
);
511 bpfattach2(ifp
, DLT_IEEE802_11_RADIO
,
512 sizeof (struct ieee80211_frame
) + 64, &sc
->sc_drvbpf
);
514 sc
->sc_rxtap_len
= sizeof sc
->sc_rxtapu
;
515 sc
->sc_rxtap
.wr_ihdr
.it_len
= htole16(sc
->sc_rxtap_len
);
516 sc
->sc_rxtap
.wr_ihdr
.it_present
= htole32(RAL_RX_RADIOTAP_PRESENT
);
518 sc
->sc_txtap_len
= sizeof sc
->sc_txtapu
;
519 sc
->sc_txtap
.wt_ihdr
.it_len
= htole16(sc
->sc_txtap_len
);
520 sc
->sc_txtap
.wt_ihdr
.it_present
= htole32(RAL_TX_RADIOTAP_PRESENT
);
523 ieee80211_announce(ic
);
525 usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH
, sc
->sc_udev
,
528 USB_ATTACH_SUCCESS_RETURN
;
533 USB_DETACH_START(ural
, sc
);
534 struct ieee80211com
*ic
= &sc
->sc_ic
;
535 struct ifnet
*ifp
= &sc
->sc_if
;
541 usb_rem_task(sc
->sc_udev
, &sc
->sc_task
);
542 usb_uncallout(sc
->sc_scan_ch
, ural_next_scan
, sc
);
543 usb_uncallout(sc
->sc_amrr_ch
, ural_amrr_timeout
, sc
);
545 if (sc
->amrr_xfer
!= NULL
) {
546 usbd_free_xfer(sc
->amrr_xfer
);
547 sc
->amrr_xfer
= NULL
;
550 if (sc
->sc_rx_pipeh
!= NULL
) {
551 usbd_abort_pipe(sc
->sc_rx_pipeh
);
552 usbd_close_pipe(sc
->sc_rx_pipeh
);
555 if (sc
->sc_tx_pipeh
!= NULL
) {
556 usbd_abort_pipe(sc
->sc_tx_pipeh
);
557 usbd_close_pipe(sc
->sc_tx_pipeh
);
563 ieee80211_ifdetach(ic
);
568 usbd_add_drv_event(USB_EVENT_DRIVER_DETACH
, sc
->sc_udev
,
575 ural_alloc_tx_list(struct ural_softc
*sc
)
577 struct ural_tx_data
*data
;
582 for (i
= 0; i
< RAL_TX_LIST_COUNT
; i
++) {
583 data
= &sc
->tx_data
[i
];
587 data
->xfer
= usbd_alloc_xfer(sc
->sc_udev
);
588 if (data
->xfer
== NULL
) {
589 printf("%s: could not allocate tx xfer\n",
590 USBDEVNAME(sc
->sc_dev
));
595 data
->buf
= usbd_alloc_buffer(data
->xfer
,
596 RAL_TX_DESC_SIZE
+ MCLBYTES
);
597 if (data
->buf
== NULL
) {
598 printf("%s: could not allocate tx buffer\n",
599 USBDEVNAME(sc
->sc_dev
));
607 fail
: ural_free_tx_list(sc
);
612 ural_free_tx_list(struct ural_softc
*sc
)
614 struct ural_tx_data
*data
;
617 for (i
= 0; i
< RAL_TX_LIST_COUNT
; i
++) {
618 data
= &sc
->tx_data
[i
];
620 if (data
->xfer
!= NULL
) {
621 usbd_free_xfer(data
->xfer
);
625 if (data
->ni
!= NULL
) {
626 ieee80211_free_node(data
->ni
);
633 ural_alloc_rx_list(struct ural_softc
*sc
)
635 struct ural_rx_data
*data
;
638 for (i
= 0; i
< RAL_RX_LIST_COUNT
; i
++) {
639 data
= &sc
->rx_data
[i
];
643 data
->xfer
= usbd_alloc_xfer(sc
->sc_udev
);
644 if (data
->xfer
== NULL
) {
645 printf("%s: could not allocate rx xfer\n",
646 USBDEVNAME(sc
->sc_dev
));
651 if (usbd_alloc_buffer(data
->xfer
, MCLBYTES
) == NULL
) {
652 printf("%s: could not allocate rx buffer\n",
653 USBDEVNAME(sc
->sc_dev
));
658 MGETHDR(data
->m
, M_DONTWAIT
, MT_DATA
);
659 if (data
->m
== NULL
) {
660 printf("%s: could not allocate rx mbuf\n",
661 USBDEVNAME(sc
->sc_dev
));
666 MCLGET(data
->m
, M_DONTWAIT
);
667 if (!(data
->m
->m_flags
& M_EXT
)) {
668 printf("%s: could not allocate rx mbuf cluster\n",
669 USBDEVNAME(sc
->sc_dev
));
674 data
->buf
= mtod(data
->m
, uint8_t *);
679 fail
: ural_free_tx_list(sc
);
684 ural_free_rx_list(struct ural_softc
*sc
)
686 struct ural_rx_data
*data
;
689 for (i
= 0; i
< RAL_RX_LIST_COUNT
; i
++) {
690 data
= &sc
->rx_data
[i
];
692 if (data
->xfer
!= NULL
) {
693 usbd_free_xfer(data
->xfer
);
697 if (data
->m
!= NULL
) {
705 ural_media_change(struct ifnet
*ifp
)
709 error
= ieee80211_media_change(ifp
);
710 if (error
!= ENETRESET
)
713 if ((ifp
->if_flags
& (IFF_UP
| IFF_RUNNING
)) == (IFF_UP
| IFF_RUNNING
))
720 * This function is called periodically (every 200ms) during scanning to
721 * switch from one channel to another.
724 ural_next_scan(void *arg
)
726 struct ural_softc
*sc
= arg
;
727 struct ieee80211com
*ic
= &sc
->sc_ic
;
729 if (ic
->ic_state
== IEEE80211_S_SCAN
)
730 ieee80211_next_scan(ic
);
736 struct ural_softc
*sc
= arg
;
737 struct ieee80211com
*ic
= &sc
->sc_ic
;
738 enum ieee80211_state ostate
;
739 struct ieee80211_node
*ni
;
742 ostate
= ic
->ic_state
;
744 switch (sc
->sc_state
) {
745 case IEEE80211_S_INIT
:
746 if (ostate
== IEEE80211_S_RUN
) {
747 /* abort TSF synchronization */
748 ural_write(sc
, RAL_TXRX_CSR19
, 0);
750 /* force tx led to stop blinking */
751 ural_write(sc
, RAL_MAC_CSR20
, 0);
755 case IEEE80211_S_SCAN
:
756 ural_set_chan(sc
, ic
->ic_curchan
);
757 usb_callout(sc
->sc_scan_ch
, hz
/ 5, ural_next_scan
, sc
);
760 case IEEE80211_S_AUTH
:
761 ural_set_chan(sc
, ic
->ic_curchan
);
764 case IEEE80211_S_ASSOC
:
765 ural_set_chan(sc
, ic
->ic_curchan
);
768 case IEEE80211_S_RUN
:
769 ural_set_chan(sc
, ic
->ic_curchan
);
773 if (ic
->ic_opmode
!= IEEE80211_M_MONITOR
) {
774 ural_update_slot(ic
->ic_ifp
);
775 ural_set_txpreamble(sc
);
776 ural_set_basicrates(sc
);
777 ural_set_bssid(sc
, ni
->ni_bssid
);
780 if (ic
->ic_opmode
== IEEE80211_M_HOSTAP
||
781 ic
->ic_opmode
== IEEE80211_M_IBSS
) {
782 m
= ieee80211_beacon_alloc(ic
, ni
, &sc
->sc_bo
);
784 printf("%s: could not allocate beacon\n",
785 USBDEVNAME(sc
->sc_dev
));
789 if (ural_tx_bcn(sc
, m
, ni
) != 0) {
791 printf("%s: could not send beacon\n",
792 USBDEVNAME(sc
->sc_dev
));
796 /* beacon is no longer needed */
800 /* make tx led blink on tx (controlled by ASIC) */
801 ural_write(sc
, RAL_MAC_CSR20
, 1);
803 if (ic
->ic_opmode
!= IEEE80211_M_MONITOR
)
804 ural_enable_tsf_sync(sc
);
806 /* enable automatic rate adaptation in STA mode */
807 if (ic
->ic_opmode
== IEEE80211_M_STA
&&
808 ic
->ic_fixed_rate
== IEEE80211_FIXED_RATE_NONE
)
809 ural_amrr_start(sc
, ni
);
814 sc
->sc_newstate(ic
, sc
->sc_state
, -1);
818 ural_newstate(struct ieee80211com
*ic
, enum ieee80211_state nstate
,
821 struct ural_softc
*sc
= ic
->ic_ifp
->if_softc
;
823 usb_rem_task(sc
->sc_udev
, &sc
->sc_task
);
824 usb_uncallout(sc
->sc_scan_ch
, ural_next_scan
, sc
);
825 usb_uncallout(sc
->sc_amrr_ch
, ural_amrr_timeout
, sc
);
827 /* do it in a process context */
828 sc
->sc_state
= nstate
;
829 usb_add_task(sc
->sc_udev
, &sc
->sc_task
, USB_TASKQ_DRIVER
);
834 /* quickly determine if a given rate is CCK or OFDM */
835 #define RAL_RATE_IS_OFDM(rate) ((rate) >= 12 && (rate) != 22)
837 #define RAL_ACK_SIZE 14 /* 10 + 4(FCS) */
838 #define RAL_CTS_SIZE 14 /* 10 + 4(FCS) */
840 #define RAL_SIFS 10 /* us */
842 #define RAL_RXTX_TURNAROUND 5 /* us */
845 * This function is only used by the Rx radiotap code.
848 ural_rxrate(struct ural_rx_desc
*desc
)
850 if (le32toh(desc
->flags
) & RAL_RX_OFDM
) {
851 /* reverse function of ural_plcp_signal */
852 switch (desc
->rate
) {
860 case 0xc: return 108;
863 if (desc
->rate
== 10)
865 if (desc
->rate
== 20)
867 if (desc
->rate
== 55)
869 if (desc
->rate
== 110)
872 return 2; /* should not get there */
876 ural_txeof(usbd_xfer_handle xfer
, usbd_private_handle priv
,
879 struct ural_tx_data
*data
= priv
;
880 struct ural_softc
*sc
= data
->sc
;
881 struct ifnet
*ifp
= &sc
->sc_if
;
884 if (status
!= USBD_NORMAL_COMPLETION
) {
885 if (status
== USBD_NOT_STARTED
|| status
== USBD_CANCELLED
)
888 printf("%s: could not transmit buffer: %s\n",
889 USBDEVNAME(sc
->sc_dev
), usbd_errstr(status
));
891 if (status
== USBD_STALLED
)
892 usbd_clear_endpoint_stall_async(sc
->sc_tx_pipeh
);
902 ieee80211_free_node(data
->ni
);
908 DPRINTFN(10, ("tx done\n"));
911 ifp
->if_flags
&= ~IFF_OACTIVE
;
918 ural_rxeof(usbd_xfer_handle xfer
, usbd_private_handle priv
, usbd_status status
)
920 struct ural_rx_data
*data
= priv
;
921 struct ural_softc
*sc
= data
->sc
;
922 struct ieee80211com
*ic
= &sc
->sc_ic
;
923 struct ifnet
*ifp
= &sc
->sc_if
;
924 struct ural_rx_desc
*desc
;
925 struct ieee80211_frame
*wh
;
926 struct ieee80211_node
*ni
;
927 struct mbuf
*mnew
, *m
;
930 if (status
!= USBD_NORMAL_COMPLETION
) {
931 if (status
== USBD_NOT_STARTED
|| status
== USBD_CANCELLED
)
934 if (status
== USBD_STALLED
)
935 usbd_clear_endpoint_stall_async(sc
->sc_rx_pipeh
);
939 usbd_get_xfer_status(xfer
, NULL
, NULL
, &len
, NULL
);
941 if (len
< RAL_RX_DESC_SIZE
+ IEEE80211_MIN_LEN
) {
942 DPRINTF(("%s: xfer too short %d\n", USBDEVNAME(sc
->sc_dev
),
948 /* rx descriptor is located at the end */
949 desc
= (struct ural_rx_desc
*)(data
->buf
+ len
- RAL_RX_DESC_SIZE
);
951 if ((le32toh(desc
->flags
) & RAL_RX_PHY_ERROR
) ||
952 (le32toh(desc
->flags
) & RAL_RX_CRC_ERROR
)) {
954 * This should not happen since we did not request to receive
955 * those frames when we filled RAL_TXRX_CSR2.
957 DPRINTFN(5, ("PHY or CRC error\n"));
962 MGETHDR(mnew
, M_DONTWAIT
, MT_DATA
);
968 MCLGET(mnew
, M_DONTWAIT
);
969 if (!(mnew
->m_flags
& M_EXT
)) {
977 data
->buf
= mtod(data
->m
, uint8_t *);
980 m
->m_pkthdr
.rcvif
= ifp
;
981 m
->m_pkthdr
.len
= m
->m_len
= (le32toh(desc
->flags
) >> 16) & 0xfff;
982 m
->m_flags
|= M_HASFCS
; /* h/w leaves FCS */
987 if (sc
->sc_drvbpf
!= NULL
) {
988 struct ural_rx_radiotap_header
*tap
= &sc
->sc_rxtap
;
990 tap
->wr_flags
= IEEE80211_RADIOTAP_F_FCS
;
991 tap
->wr_rate
= ural_rxrate(desc
);
992 tap
->wr_chan_freq
= htole16(ic
->ic_curchan
->ic_freq
);
993 tap
->wr_chan_flags
= htole16(ic
->ic_curchan
->ic_flags
);
994 tap
->wr_antenna
= sc
->rx_ant
;
995 tap
->wr_antsignal
= desc
->rssi
;
997 bpf_mtap2(sc
->sc_drvbpf
, tap
, sc
->sc_rxtap_len
, m
);
1001 wh
= mtod(m
, struct ieee80211_frame
*);
1002 ni
= ieee80211_find_rxnode(ic
, (struct ieee80211_frame_min
*)wh
);
1004 /* send the frame to the 802.11 layer */
1005 ieee80211_input(ic
, m
, ni
, desc
->rssi
, 0);
1007 /* node is no longer needed */
1008 ieee80211_free_node(ni
);
1012 DPRINTFN(15, ("rx done\n"));
1014 skip
: /* setup a new transfer */
1015 usbd_setup_xfer(xfer
, sc
->sc_rx_pipeh
, data
, data
->buf
, MCLBYTES
,
1016 USBD_SHORT_XFER_OK
, USBD_NO_TIMEOUT
, ural_rxeof
);
1017 usbd_transfer(xfer
);
1021 * Return the expected ack rate for a frame transmitted at rate `rate'.
1022 * XXX: this should depend on the destination node basic rate set.
1025 ural_ack_rate(struct ieee80211com
*ic
, int rate
)
1034 return (ic
->ic_curmode
== IEEE80211_MODE_11B
) ? 4 : rate
;
1050 /* default to 1Mbps */
1055 * Compute the duration (in us) needed to transmit `len' bytes at rate `rate'.
1056 * The function automatically determines the operating mode depending on the
1057 * given rate. `flags' indicates whether short preamble is in use or not.
1060 ural_txtime(int len
, int rate
, uint32_t flags
)
1064 if (RAL_RATE_IS_OFDM(rate
)) {
1065 /* IEEE Std 802.11g-2003, pp. 37 */
1066 txtime
= (8 + 4 * len
+ 3 + rate
- 1) / rate
;
1067 txtime
= 16 + 4 + 4 * txtime
+ 6;
1069 /* IEEE Std 802.11b-1999, pp. 28 */
1070 txtime
= (16 * len
+ rate
- 1) / rate
;
1071 if (rate
!= 2 && (flags
& IEEE80211_F_SHPREAMBLE
))
1080 ural_plcp_signal(int rate
)
1083 /* CCK rates (returned values are device-dependent) */
1086 case 11: return 0x2;
1087 case 22: return 0x3;
1089 /* OFDM rates (cf IEEE Std 802.11a-1999, pp. 14 Table 80) */
1090 case 12: return 0xb;
1091 case 18: return 0xf;
1092 case 24: return 0xa;
1093 case 36: return 0xe;
1094 case 48: return 0x9;
1095 case 72: return 0xd;
1096 case 96: return 0x8;
1097 case 108: return 0xc;
1099 /* unsupported rates (should not get there) */
1100 default: return 0xff;
1105 ural_setup_tx_desc(struct ural_softc
*sc
, struct ural_tx_desc
*desc
,
1106 uint32_t flags
, int len
, int rate
)
1108 struct ieee80211com
*ic
= &sc
->sc_ic
;
1109 uint16_t plcp_length
;
1112 desc
->flags
= htole32(flags
);
1113 desc
->flags
|= htole32(RAL_TX_NEWSEQ
);
1114 desc
->flags
|= htole32(len
<< 16);
1116 desc
->wme
= htole16(RAL_AIFSN(2) | RAL_LOGCWMIN(3) | RAL_LOGCWMAX(5));
1117 desc
->wme
|= htole16(RAL_IVOFFSET(sizeof (struct ieee80211_frame
)));
1119 /* setup PLCP fields */
1120 desc
->plcp_signal
= ural_plcp_signal(rate
);
1121 desc
->plcp_service
= 4;
1123 len
+= IEEE80211_CRC_LEN
;
1124 if (RAL_RATE_IS_OFDM(rate
)) {
1125 desc
->flags
|= htole32(RAL_TX_OFDM
);
1127 plcp_length
= len
& 0xfff;
1128 desc
->plcp_length_hi
= plcp_length
>> 6;
1129 desc
->plcp_length_lo
= plcp_length
& 0x3f;
1131 plcp_length
= (16 * len
+ rate
- 1) / rate
;
1133 remainder
= (16 * len
) % 22;
1134 if (remainder
!= 0 && remainder
< 7)
1135 desc
->plcp_service
|= RAL_PLCP_LENGEXT
;
1137 desc
->plcp_length_hi
= plcp_length
>> 8;
1138 desc
->plcp_length_lo
= plcp_length
& 0xff;
1140 if (rate
!= 2 && (ic
->ic_flags
& IEEE80211_F_SHPREAMBLE
))
1141 desc
->plcp_signal
|= 0x08;
1148 #define RAL_TX_TIMEOUT 5000
1151 ural_tx_bcn(struct ural_softc
*sc
, struct mbuf
*m0
, struct ieee80211_node
*ni
)
1153 struct ural_tx_desc
*desc
;
1154 usbd_xfer_handle xfer
;
1160 rate
= IEEE80211_IS_CHAN_5GHZ(ni
->ni_chan
) ? 12 : 2;
1162 xfer
= usbd_alloc_xfer(sc
->sc_udev
);
1166 /* xfer length needs to be a multiple of two! */
1167 xferlen
= (RAL_TX_DESC_SIZE
+ m0
->m_pkthdr
.len
+ 1) & ~1;
1169 buf
= usbd_alloc_buffer(xfer
, xferlen
);
1171 usbd_free_xfer(xfer
);
1175 usbd_setup_xfer(xfer
, sc
->sc_tx_pipeh
, NULL
, &cmd
, sizeof cmd
,
1176 USBD_FORCE_SHORT_XFER
, RAL_TX_TIMEOUT
, NULL
);
1178 error
= usbd_sync_transfer(xfer
);
1180 usbd_free_xfer(xfer
);
1184 desc
= (struct ural_tx_desc
*)buf
;
1186 m_copydata(m0
, 0, m0
->m_pkthdr
.len
, buf
+ RAL_TX_DESC_SIZE
);
1187 ural_setup_tx_desc(sc
, desc
, RAL_TX_IFS_NEWBACKOFF
| RAL_TX_TIMESTAMP
,
1188 m0
->m_pkthdr
.len
, rate
);
1190 DPRINTFN(10, ("sending beacon frame len=%u rate=%u xfer len=%u\n",
1191 m0
->m_pkthdr
.len
, rate
, xferlen
));
1193 usbd_setup_xfer(xfer
, sc
->sc_tx_pipeh
, NULL
, buf
, xferlen
,
1194 USBD_FORCE_SHORT_XFER
| USBD_NO_COPY
, RAL_TX_TIMEOUT
, NULL
);
1196 error
= usbd_sync_transfer(xfer
);
1197 usbd_free_xfer(xfer
);
1203 ural_tx_mgt(struct ural_softc
*sc
, struct mbuf
*m0
, struct ieee80211_node
*ni
)
1205 struct ieee80211com
*ic
= &sc
->sc_ic
;
1206 struct ural_tx_desc
*desc
;
1207 struct ural_tx_data
*data
;
1208 struct ieee80211_frame
*wh
;
1209 struct ieee80211_key
*k
;
1215 data
= &sc
->tx_data
[0];
1216 desc
= (struct ural_tx_desc
*)data
->buf
;
1218 rate
= IEEE80211_IS_CHAN_5GHZ(ic
->ic_curchan
) ? 12 : 2;
1220 wh
= mtod(m0
, struct ieee80211_frame
*);
1222 if (wh
->i_fc
[1] & IEEE80211_FC1_WEP
) {
1223 k
= ieee80211_crypto_encap(ic
, ni
, m0
);
1233 wh
= mtod(m0
, struct ieee80211_frame
*);
1235 if (!IEEE80211_IS_MULTICAST(wh
->i_addr1
)) {
1236 flags
|= RAL_TX_ACK
;
1238 dur
= ural_txtime(RAL_ACK_SIZE
, rate
, ic
->ic_flags
) + RAL_SIFS
;
1239 *(uint16_t *)wh
->i_dur
= htole16(dur
);
1241 /* tell hardware to add timestamp for probe responses */
1242 if ((wh
->i_fc
[0] & IEEE80211_FC0_TYPE_MASK
) ==
1243 IEEE80211_FC0_TYPE_MGT
&&
1244 (wh
->i_fc
[0] & IEEE80211_FC0_SUBTYPE_MASK
) ==
1245 IEEE80211_FC0_SUBTYPE_PROBE_RESP
)
1246 flags
|= RAL_TX_TIMESTAMP
;
1250 if (sc
->sc_drvbpf
!= NULL
) {
1251 struct ural_tx_radiotap_header
*tap
= &sc
->sc_txtap
;
1254 tap
->wt_rate
= rate
;
1255 tap
->wt_chan_freq
= htole16(ic
->ic_curchan
->ic_freq
);
1256 tap
->wt_chan_flags
= htole16(ic
->ic_curchan
->ic_flags
);
1257 tap
->wt_antenna
= sc
->tx_ant
;
1259 bpf_mtap2(sc
->sc_drvbpf
, tap
, sc
->sc_txtap_len
, m0
);
1263 m_copydata(m0
, 0, m0
->m_pkthdr
.len
, data
->buf
+ RAL_TX_DESC_SIZE
);
1264 ural_setup_tx_desc(sc
, desc
, flags
, m0
->m_pkthdr
.len
, rate
);
1266 /* align end on a 2-bytes boundary */
1267 xferlen
= (RAL_TX_DESC_SIZE
+ m0
->m_pkthdr
.len
+ 1) & ~1;
1270 * No space left in the last URB to store the extra 2 bytes, force
1271 * sending of another URB.
1273 if ((xferlen
% 64) == 0)
1276 DPRINTFN(10, ("sending mgt frame len=%u rate=%u xfer len=%u\n",
1277 m0
->m_pkthdr
.len
, rate
, xferlen
));
1279 usbd_setup_xfer(data
->xfer
, sc
->sc_tx_pipeh
, data
, data
->buf
,
1280 xferlen
, USBD_FORCE_SHORT_XFER
| USBD_NO_COPY
, RAL_TX_TIMEOUT
,
1283 error
= usbd_transfer(data
->xfer
);
1284 if (error
!= USBD_NORMAL_COMPLETION
&& error
!= USBD_IN_PROGRESS
) {
1295 ural_tx_data(struct ural_softc
*sc
, struct mbuf
*m0
, struct ieee80211_node
*ni
)
1297 struct ieee80211com
*ic
= &sc
->sc_ic
;
1298 struct ural_tx_desc
*desc
;
1299 struct ural_tx_data
*data
;
1300 struct ieee80211_frame
*wh
;
1301 struct ieee80211_key
*k
;
1307 wh
= mtod(m0
, struct ieee80211_frame
*);
1309 if (ic
->ic_fixed_rate
!= IEEE80211_FIXED_RATE_NONE
)
1310 rate
= ic
->ic_bss
->ni_rates
.rs_rates
[ic
->ic_fixed_rate
];
1312 rate
= ni
->ni_rates
.rs_rates
[ni
->ni_txrate
];
1314 rate
&= IEEE80211_RATE_VAL
;
1316 if (wh
->i_fc
[1] & IEEE80211_FC1_WEP
) {
1317 k
= ieee80211_crypto_encap(ic
, ni
, m0
);
1323 /* packet header may have moved, reset our local pointer */
1324 wh
= mtod(m0
, struct ieee80211_frame
*);
1327 data
= &sc
->tx_data
[0];
1328 desc
= (struct ural_tx_desc
*)data
->buf
;
1333 if (!IEEE80211_IS_MULTICAST(wh
->i_addr1
)) {
1334 flags
|= RAL_TX_ACK
;
1335 flags
|= RAL_TX_RETRY(7);
1337 dur
= ural_txtime(RAL_ACK_SIZE
, ural_ack_rate(ic
, rate
),
1338 ic
->ic_flags
) + RAL_SIFS
;
1339 *(uint16_t *)wh
->i_dur
= htole16(dur
);
1343 if (sc
->sc_drvbpf
!= NULL
) {
1344 struct ural_tx_radiotap_header
*tap
= &sc
->sc_txtap
;
1347 tap
->wt_rate
= rate
;
1348 tap
->wt_chan_freq
= htole16(ic
->ic_curchan
->ic_freq
);
1349 tap
->wt_chan_flags
= htole16(ic
->ic_curchan
->ic_flags
);
1350 tap
->wt_antenna
= sc
->tx_ant
;
1352 bpf_mtap2(sc
->sc_drvbpf
, tap
, sc
->sc_txtap_len
, m0
);
1356 m_copydata(m0
, 0, m0
->m_pkthdr
.len
, data
->buf
+ RAL_TX_DESC_SIZE
);
1357 ural_setup_tx_desc(sc
, desc
, flags
, m0
->m_pkthdr
.len
, rate
);
1359 /* align end on a 2-bytes boundary */
1360 xferlen
= (RAL_TX_DESC_SIZE
+ m0
->m_pkthdr
.len
+ 1) & ~1;
1363 * No space left in the last URB to store the extra 2 bytes, force
1364 * sending of another URB.
1366 if ((xferlen
% 64) == 0)
1369 DPRINTFN(10, ("sending data frame len=%u rate=%u xfer len=%u\n",
1370 m0
->m_pkthdr
.len
, rate
, xferlen
));
1372 usbd_setup_xfer(data
->xfer
, sc
->sc_tx_pipeh
, data
, data
->buf
,
1373 xferlen
, USBD_FORCE_SHORT_XFER
| USBD_NO_COPY
, RAL_TX_TIMEOUT
,
1376 error
= usbd_transfer(data
->xfer
);
1377 if (error
!= USBD_NORMAL_COMPLETION
&& error
!= USBD_IN_PROGRESS
)
1386 ural_start(struct ifnet
*ifp
)
1388 struct ural_softc
*sc
= ifp
->if_softc
;
1389 struct ieee80211com
*ic
= &sc
->sc_ic
;
1391 struct ether_header
*eh
;
1392 struct ieee80211_node
*ni
;
1395 IF_POLL(&ic
->ic_mgtq
, m0
);
1397 if (sc
->tx_queued
>= RAL_TX_LIST_COUNT
) {
1398 ifp
->if_flags
|= IFF_OACTIVE
;
1401 IF_DEQUEUE(&ic
->ic_mgtq
, m0
);
1403 ni
= (struct ieee80211_node
*)m0
->m_pkthdr
.rcvif
;
1404 m0
->m_pkthdr
.rcvif
= NULL
;
1406 if (ic
->ic_rawbpf
!= NULL
)
1407 bpf_mtap(ic
->ic_rawbpf
, m0
);
1409 if (ural_tx_mgt(sc
, m0
, ni
) != 0)
1413 if (ic
->ic_state
!= IEEE80211_S_RUN
)
1415 IFQ_DEQUEUE(&ifp
->if_snd
, m0
);
1418 if (sc
->tx_queued
>= RAL_TX_LIST_COUNT
) {
1419 IF_PREPEND(&ifp
->if_snd
, m0
);
1420 ifp
->if_flags
|= IFF_OACTIVE
;
1424 if (m0
->m_len
< sizeof (struct ether_header
) &&
1425 !(m0
= m_pullup(m0
, sizeof (struct ether_header
))))
1428 eh
= mtod(m0
, struct ether_header
*);
1429 ni
= ieee80211_find_txnode(ic
, eh
->ether_dhost
);
1435 if (ifp
->if_bpf
!= NULL
)
1436 bpf_mtap(ifp
->if_bpf
, m0
);
1438 m0
= ieee80211_encap(ic
, m0
, ni
);
1440 ieee80211_free_node(ni
);
1444 if (ic
->ic_rawbpf
!= NULL
)
1445 bpf_mtap(ic
->ic_rawbpf
, m0
);
1447 if (ural_tx_data(sc
, m0
, ni
) != 0) {
1448 ieee80211_free_node(ni
);
1454 sc
->sc_tx_timer
= 5;
1460 ural_watchdog(struct ifnet
*ifp
)
1462 struct ural_softc
*sc
= ifp
->if_softc
;
1463 struct ieee80211com
*ic
= &sc
->sc_ic
;
1467 if (sc
->sc_tx_timer
> 0) {
1468 if (--sc
->sc_tx_timer
== 0) {
1469 printf("%s: device timeout\n", USBDEVNAME(sc
->sc_dev
));
1470 /*ural_init(sc); XXX needs a process context! */
1477 ieee80211_watchdog(ic
);
1481 * This function allows for fast channel switching in monitor mode (used by
1482 * net-mgmt/kismet). In IBSS mode, we must explicitly reset the interface to
1483 * generate a new beacon frame.
1486 ural_reset(struct ifnet
*ifp
)
1488 struct ural_softc
*sc
= ifp
->if_softc
;
1489 struct ieee80211com
*ic
= &sc
->sc_ic
;
1491 if (ic
->ic_opmode
!= IEEE80211_M_MONITOR
)
1494 ural_set_chan(sc
, ic
->ic_curchan
);
1500 ural_ioctl(struct ifnet
*ifp
, u_long cmd
, void *data
)
1502 struct ural_softc
*sc
= ifp
->if_softc
;
1503 struct ieee80211com
*ic
= &sc
->sc_ic
;
1510 if ((error
= ifioctl_common(ifp
, cmd
, data
)) != 0)
1512 /* XXX re-use ether_ioctl() */
1513 switch (ifp
->if_flags
& (IFF_UP
|IFF_RUNNING
)) {
1514 case IFF_UP
|IFF_RUNNING
:
1515 ural_update_promisc(sc
);
1529 error
= ieee80211_ioctl(ic
, cmd
, data
);
1532 if (error
== ENETRESET
) {
1533 if ((ifp
->if_flags
& (IFF_UP
| IFF_RUNNING
)) ==
1534 (IFF_UP
| IFF_RUNNING
))
1545 ural_set_testmode(struct ural_softc
*sc
)
1547 usb_device_request_t req
;
1550 req
.bmRequestType
= UT_WRITE_VENDOR_DEVICE
;
1551 req
.bRequest
= RAL_VENDOR_REQUEST
;
1552 USETW(req
.wValue
, 4);
1553 USETW(req
.wIndex
, 1);
1554 USETW(req
.wLength
, 0);
1556 error
= usbd_do_request(sc
->sc_udev
, &req
, NULL
);
1558 printf("%s: could not set test mode: %s\n",
1559 USBDEVNAME(sc
->sc_dev
), usbd_errstr(error
));
1564 ural_eeprom_read(struct ural_softc
*sc
, uint16_t addr
, void *buf
, int len
)
1566 usb_device_request_t req
;
1569 req
.bmRequestType
= UT_READ_VENDOR_DEVICE
;
1570 req
.bRequest
= RAL_READ_EEPROM
;
1571 USETW(req
.wValue
, 0);
1572 USETW(req
.wIndex
, addr
);
1573 USETW(req
.wLength
, len
);
1575 error
= usbd_do_request(sc
->sc_udev
, &req
, buf
);
1577 printf("%s: could not read EEPROM: %s\n",
1578 USBDEVNAME(sc
->sc_dev
), usbd_errstr(error
));
1583 ural_read(struct ural_softc
*sc
, uint16_t reg
)
1585 usb_device_request_t req
;
1589 req
.bmRequestType
= UT_READ_VENDOR_DEVICE
;
1590 req
.bRequest
= RAL_READ_MAC
;
1591 USETW(req
.wValue
, 0);
1592 USETW(req
.wIndex
, reg
);
1593 USETW(req
.wLength
, sizeof (uint16_t));
1595 error
= usbd_do_request(sc
->sc_udev
, &req
, &val
);
1597 printf("%s: could not read MAC register: %s\n",
1598 USBDEVNAME(sc
->sc_dev
), usbd_errstr(error
));
1602 return le16toh(val
);
1606 ural_read_multi(struct ural_softc
*sc
, uint16_t reg
, void *buf
, int len
)
1608 usb_device_request_t req
;
1611 req
.bmRequestType
= UT_READ_VENDOR_DEVICE
;
1612 req
.bRequest
= RAL_READ_MULTI_MAC
;
1613 USETW(req
.wValue
, 0);
1614 USETW(req
.wIndex
, reg
);
1615 USETW(req
.wLength
, len
);
1617 error
= usbd_do_request(sc
->sc_udev
, &req
, buf
);
1619 printf("%s: could not read MAC register: %s\n",
1620 USBDEVNAME(sc
->sc_dev
), usbd_errstr(error
));
1625 ural_write(struct ural_softc
*sc
, uint16_t reg
, uint16_t val
)
1627 usb_device_request_t req
;
1630 req
.bmRequestType
= UT_WRITE_VENDOR_DEVICE
;
1631 req
.bRequest
= RAL_WRITE_MAC
;
1632 USETW(req
.wValue
, val
);
1633 USETW(req
.wIndex
, reg
);
1634 USETW(req
.wLength
, 0);
1636 error
= usbd_do_request(sc
->sc_udev
, &req
, NULL
);
1638 printf("%s: could not write MAC register: %s\n",
1639 USBDEVNAME(sc
->sc_dev
), usbd_errstr(error
));
1644 ural_write_multi(struct ural_softc
*sc
, uint16_t reg
, void *buf
, int len
)
1646 usb_device_request_t req
;
1649 req
.bmRequestType
= UT_WRITE_VENDOR_DEVICE
;
1650 req
.bRequest
= RAL_WRITE_MULTI_MAC
;
1651 USETW(req
.wValue
, 0);
1652 USETW(req
.wIndex
, reg
);
1653 USETW(req
.wLength
, len
);
1655 error
= usbd_do_request(sc
->sc_udev
, &req
, buf
);
1657 printf("%s: could not write MAC register: %s\n",
1658 USBDEVNAME(sc
->sc_dev
), usbd_errstr(error
));
1663 ural_bbp_write(struct ural_softc
*sc
, uint8_t reg
, uint8_t val
)
1668 for (ntries
= 0; ntries
< 5; ntries
++) {
1669 if (!(ural_read(sc
, RAL_PHY_CSR8
) & RAL_BBP_BUSY
))
1673 printf("%s: could not write to BBP\n", USBDEVNAME(sc
->sc_dev
));
1677 tmp
= reg
<< 8 | val
;
1678 ural_write(sc
, RAL_PHY_CSR7
, tmp
);
1682 ural_bbp_read(struct ural_softc
*sc
, uint8_t reg
)
1687 val
= RAL_BBP_WRITE
| reg
<< 8;
1688 ural_write(sc
, RAL_PHY_CSR7
, val
);
1690 for (ntries
= 0; ntries
< 5; ntries
++) {
1691 if (!(ural_read(sc
, RAL_PHY_CSR8
) & RAL_BBP_BUSY
))
1695 printf("%s: could not read BBP\n", USBDEVNAME(sc
->sc_dev
));
1699 return ural_read(sc
, RAL_PHY_CSR7
) & 0xff;
1703 ural_rf_write(struct ural_softc
*sc
, uint8_t reg
, uint32_t val
)
1708 for (ntries
= 0; ntries
< 5; ntries
++) {
1709 if (!(ural_read(sc
, RAL_PHY_CSR10
) & RAL_RF_LOBUSY
))
1713 printf("%s: could not write to RF\n", USBDEVNAME(sc
->sc_dev
));
1717 tmp
= RAL_RF_BUSY
| RAL_RF_20BIT
| (val
& 0xfffff) << 2 | (reg
& 0x3);
1718 ural_write(sc
, RAL_PHY_CSR9
, tmp
& 0xffff);
1719 ural_write(sc
, RAL_PHY_CSR10
, tmp
>> 16);
1721 /* remember last written value in sc */
1722 sc
->rf_regs
[reg
] = val
;
1724 DPRINTFN(15, ("RF R[%u] <- 0x%05x\n", reg
& 0x3, val
& 0xfffff));
1728 ural_set_chan(struct ural_softc
*sc
, struct ieee80211_channel
*c
)
1730 struct ieee80211com
*ic
= &sc
->sc_ic
;
1734 chan
= ieee80211_chan2ieee(ic
, c
);
1735 if (chan
== 0 || chan
== IEEE80211_CHAN_ANY
)
1738 if (IEEE80211_IS_CHAN_2GHZ(c
))
1739 power
= min(sc
->txpow
[chan
- 1], 31);
1743 /* adjust txpower using ifconfig settings */
1744 power
-= (100 - ic
->ic_txpowlimit
) / 8;
1746 DPRINTFN(2, ("setting channel to %u, txpower to %u\n", chan
, power
));
1748 switch (sc
->rf_rev
) {
1750 ural_rf_write(sc
, RAL_RF1
, 0x00814);
1751 ural_rf_write(sc
, RAL_RF2
, ural_rf2522_r2
[chan
- 1]);
1752 ural_rf_write(sc
, RAL_RF3
, power
<< 7 | 0x00040);
1756 ural_rf_write(sc
, RAL_RF1
, 0x08804);
1757 ural_rf_write(sc
, RAL_RF2
, ural_rf2523_r2
[chan
- 1]);
1758 ural_rf_write(sc
, RAL_RF3
, power
<< 7 | 0x38044);
1759 ural_rf_write(sc
, RAL_RF4
, (chan
== 14) ? 0x00280 : 0x00286);
1763 ural_rf_write(sc
, RAL_RF1
, 0x0c808);
1764 ural_rf_write(sc
, RAL_RF2
, ural_rf2524_r2
[chan
- 1]);
1765 ural_rf_write(sc
, RAL_RF3
, power
<< 7 | 0x00040);
1766 ural_rf_write(sc
, RAL_RF4
, (chan
== 14) ? 0x00280 : 0x00286);
1770 ural_rf_write(sc
, RAL_RF1
, 0x08808);
1771 ural_rf_write(sc
, RAL_RF2
, ural_rf2525_hi_r2
[chan
- 1]);
1772 ural_rf_write(sc
, RAL_RF3
, power
<< 7 | 0x18044);
1773 ural_rf_write(sc
, RAL_RF4
, (chan
== 14) ? 0x00280 : 0x00286);
1775 ural_rf_write(sc
, RAL_RF1
, 0x08808);
1776 ural_rf_write(sc
, RAL_RF2
, ural_rf2525_r2
[chan
- 1]);
1777 ural_rf_write(sc
, RAL_RF3
, power
<< 7 | 0x18044);
1778 ural_rf_write(sc
, RAL_RF4
, (chan
== 14) ? 0x00280 : 0x00286);
1782 ural_rf_write(sc
, RAL_RF1
, 0x08808);
1783 ural_rf_write(sc
, RAL_RF2
, ural_rf2525e_r2
[chan
- 1]);
1784 ural_rf_write(sc
, RAL_RF3
, power
<< 7 | 0x18044);
1785 ural_rf_write(sc
, RAL_RF4
, (chan
== 14) ? 0x00286 : 0x00282);
1789 ural_rf_write(sc
, RAL_RF2
, ural_rf2526_hi_r2
[chan
- 1]);
1790 ural_rf_write(sc
, RAL_RF4
, (chan
& 1) ? 0x00386 : 0x00381);
1791 ural_rf_write(sc
, RAL_RF1
, 0x08804);
1793 ural_rf_write(sc
, RAL_RF2
, ural_rf2526_r2
[chan
- 1]);
1794 ural_rf_write(sc
, RAL_RF3
, power
<< 7 | 0x18044);
1795 ural_rf_write(sc
, RAL_RF4
, (chan
& 1) ? 0x00386 : 0x00381);
1800 for (i
= 0; ural_rf5222
[i
].chan
!= chan
; i
++);
1802 ural_rf_write(sc
, RAL_RF1
, ural_rf5222
[i
].r1
);
1803 ural_rf_write(sc
, RAL_RF2
, ural_rf5222
[i
].r2
);
1804 ural_rf_write(sc
, RAL_RF3
, power
<< 7 | 0x00040);
1805 ural_rf_write(sc
, RAL_RF4
, ural_rf5222
[i
].r4
);
1809 if (ic
->ic_opmode
!= IEEE80211_M_MONITOR
&&
1810 ic
->ic_state
!= IEEE80211_S_SCAN
) {
1811 /* set Japan filter bit for channel 14 */
1812 tmp
= ural_bbp_read(sc
, 70);
1814 tmp
&= ~RAL_JAPAN_FILTER
;
1816 tmp
|= RAL_JAPAN_FILTER
;
1818 ural_bbp_write(sc
, 70, tmp
);
1820 /* clear CRC errors */
1821 ural_read(sc
, RAL_STA_CSR0
);
1824 ural_disable_rf_tune(sc
);
1829 * Disable RF auto-tuning.
1832 ural_disable_rf_tune(struct ural_softc
*sc
)
1836 if (sc
->rf_rev
!= RAL_RF_2523
) {
1837 tmp
= sc
->rf_regs
[RAL_RF1
] & ~RAL_RF1_AUTOTUNE
;
1838 ural_rf_write(sc
, RAL_RF1
, tmp
);
1841 tmp
= sc
->rf_regs
[RAL_RF3
] & ~RAL_RF3_AUTOTUNE
;
1842 ural_rf_write(sc
, RAL_RF3
, tmp
);
1844 DPRINTFN(2, ("disabling RF autotune\n"));
1848 * Refer to IEEE Std 802.11-1999 pp. 123 for more information on TSF
1852 ural_enable_tsf_sync(struct ural_softc
*sc
)
1854 struct ieee80211com
*ic
= &sc
->sc_ic
;
1855 uint16_t logcwmin
, preload
, tmp
;
1857 /* first, disable TSF synchronization */
1858 ural_write(sc
, RAL_TXRX_CSR19
, 0);
1860 tmp
= (16 * ic
->ic_bss
->ni_intval
) << 4;
1861 ural_write(sc
, RAL_TXRX_CSR18
, tmp
);
1863 logcwmin
= (ic
->ic_opmode
== IEEE80211_M_IBSS
) ? 2 : 0;
1864 preload
= (ic
->ic_opmode
== IEEE80211_M_IBSS
) ? 320 : 6;
1865 tmp
= logcwmin
<< 12 | preload
;
1866 ural_write(sc
, RAL_TXRX_CSR20
, tmp
);
1868 /* finally, enable TSF synchronization */
1869 tmp
= RAL_ENABLE_TSF
| RAL_ENABLE_TBCN
;
1870 if (ic
->ic_opmode
== IEEE80211_M_STA
)
1871 tmp
|= RAL_ENABLE_TSF_SYNC(1);
1873 tmp
|= RAL_ENABLE_TSF_SYNC(2) | RAL_ENABLE_BEACON_GENERATOR
;
1874 ural_write(sc
, RAL_TXRX_CSR19
, tmp
);
1876 DPRINTF(("enabling TSF synchronization\n"));
1880 ural_update_slot(struct ifnet
*ifp
)
1882 struct ural_softc
*sc
= ifp
->if_softc
;
1883 struct ieee80211com
*ic
= &sc
->sc_ic
;
1884 uint16_t slottime
, sifs
, eifs
;
1886 slottime
= (ic
->ic_flags
& IEEE80211_F_SHSLOT
) ? 9 : 20;
1889 * These settings may sound a bit inconsistent but this is what the
1890 * reference driver does.
1892 if (ic
->ic_curmode
== IEEE80211_MODE_11B
) {
1893 sifs
= 16 - RAL_RXTX_TURNAROUND
;
1896 sifs
= 10 - RAL_RXTX_TURNAROUND
;
1900 ural_write(sc
, RAL_MAC_CSR10
, slottime
);
1901 ural_write(sc
, RAL_MAC_CSR11
, sifs
);
1902 ural_write(sc
, RAL_MAC_CSR12
, eifs
);
1906 ural_set_txpreamble(struct ural_softc
*sc
)
1910 tmp
= ural_read(sc
, RAL_TXRX_CSR10
);
1912 tmp
&= ~RAL_SHORT_PREAMBLE
;
1913 if (sc
->sc_ic
.ic_flags
& IEEE80211_F_SHPREAMBLE
)
1914 tmp
|= RAL_SHORT_PREAMBLE
;
1916 ural_write(sc
, RAL_TXRX_CSR10
, tmp
);
1920 ural_set_basicrates(struct ural_softc
*sc
)
1922 struct ieee80211com
*ic
= &sc
->sc_ic
;
1924 /* update basic rate set */
1925 if (ic
->ic_curmode
== IEEE80211_MODE_11B
) {
1926 /* 11b basic rates: 1, 2Mbps */
1927 ural_write(sc
, RAL_TXRX_CSR11
, 0x3);
1928 } else if (IEEE80211_IS_CHAN_5GHZ(ic
->ic_bss
->ni_chan
)) {
1929 /* 11a basic rates: 6, 12, 24Mbps */
1930 ural_write(sc
, RAL_TXRX_CSR11
, 0x150);
1932 /* 11g basic rates: 1, 2, 5.5, 11, 6, 12, 24Mbps */
1933 ural_write(sc
, RAL_TXRX_CSR11
, 0x15f);
1938 ural_set_bssid(struct ural_softc
*sc
, uint8_t *bssid
)
1942 tmp
= bssid
[0] | bssid
[1] << 8;
1943 ural_write(sc
, RAL_MAC_CSR5
, tmp
);
1945 tmp
= bssid
[2] | bssid
[3] << 8;
1946 ural_write(sc
, RAL_MAC_CSR6
, tmp
);
1948 tmp
= bssid
[4] | bssid
[5] << 8;
1949 ural_write(sc
, RAL_MAC_CSR7
, tmp
);
1951 DPRINTF(("setting BSSID to %s\n", ether_sprintf(bssid
)));
1955 ural_set_macaddr(struct ural_softc
*sc
, uint8_t *addr
)
1959 tmp
= addr
[0] | addr
[1] << 8;
1960 ural_write(sc
, RAL_MAC_CSR2
, tmp
);
1962 tmp
= addr
[2] | addr
[3] << 8;
1963 ural_write(sc
, RAL_MAC_CSR3
, tmp
);
1965 tmp
= addr
[4] | addr
[5] << 8;
1966 ural_write(sc
, RAL_MAC_CSR4
, tmp
);
1968 DPRINTF(("setting MAC address to %s\n", ether_sprintf(addr
)));
1972 ural_update_promisc(struct ural_softc
*sc
)
1974 struct ifnet
*ifp
= sc
->sc_ic
.ic_ifp
;
1977 tmp
= ural_read(sc
, RAL_TXRX_CSR2
);
1979 tmp
&= ~RAL_DROP_NOT_TO_ME
;
1980 if (!(ifp
->if_flags
& IFF_PROMISC
))
1981 tmp
|= RAL_DROP_NOT_TO_ME
;
1983 ural_write(sc
, RAL_TXRX_CSR2
, tmp
);
1985 DPRINTF(("%s promiscuous mode\n", (ifp
->if_flags
& IFF_PROMISC
) ?
1986 "entering" : "leaving"));
1990 ural_get_rf(int rev
)
1993 case RAL_RF_2522
: return "RT2522";
1994 case RAL_RF_2523
: return "RT2523";
1995 case RAL_RF_2524
: return "RT2524";
1996 case RAL_RF_2525
: return "RT2525";
1997 case RAL_RF_2525E
: return "RT2525e";
1998 case RAL_RF_2526
: return "RT2526";
1999 case RAL_RF_5222
: return "RT5222";
2000 default: return "unknown";
2005 ural_read_eeprom(struct ural_softc
*sc
)
2007 struct ieee80211com
*ic
= &sc
->sc_ic
;
2010 ural_eeprom_read(sc
, RAL_EEPROM_CONFIG0
, &val
, 2);
2012 sc
->rf_rev
= (val
>> 11) & 0x7;
2013 sc
->hw_radio
= (val
>> 10) & 0x1;
2014 sc
->led_mode
= (val
>> 6) & 0x7;
2015 sc
->rx_ant
= (val
>> 4) & 0x3;
2016 sc
->tx_ant
= (val
>> 2) & 0x3;
2017 sc
->nb_ant
= val
& 0x3;
2019 /* read MAC address */
2020 ural_eeprom_read(sc
, RAL_EEPROM_ADDRESS
, ic
->ic_myaddr
, 6);
2022 /* read default values for BBP registers */
2023 ural_eeprom_read(sc
, RAL_EEPROM_BBP_BASE
, sc
->bbp_prom
, 2 * 16);
2025 /* read Tx power for all b/g channels */
2026 ural_eeprom_read(sc
, RAL_EEPROM_TXPOWER
, sc
->txpow
, 14);
2030 ural_bbp_init(struct ural_softc
*sc
)
2032 #define N(a) (sizeof (a) / sizeof ((a)[0]))
2035 /* wait for BBP to be ready */
2036 for (ntries
= 0; ntries
< 100; ntries
++) {
2037 if (ural_bbp_read(sc
, RAL_BBP_VERSION
) != 0)
2041 if (ntries
== 100) {
2042 printf("%s: timeout waiting for BBP\n", USBDEVNAME(sc
->sc_dev
));
2046 /* initialize BBP registers to default values */
2047 for (i
= 0; i
< N(ural_def_bbp
); i
++)
2048 ural_bbp_write(sc
, ural_def_bbp
[i
].reg
, ural_def_bbp
[i
].val
);
2051 /* initialize BBP registers to values stored in EEPROM */
2052 for (i
= 0; i
< 16; i
++) {
2053 if (sc
->bbp_prom
[i
].reg
== 0xff)
2055 ural_bbp_write(sc
, sc
->bbp_prom
[i
].reg
, sc
->bbp_prom
[i
].val
);
2064 ural_set_txantenna(struct ural_softc
*sc
, int antenna
)
2069 tx
= ural_bbp_read(sc
, RAL_BBP_TX
) & ~RAL_BBP_ANTMASK
;
2072 else if (antenna
== 2)
2075 tx
|= RAL_BBP_DIVERSITY
;
2077 /* need to force I/Q flip for RF 2525e, 2526 and 5222 */
2078 if (sc
->rf_rev
== RAL_RF_2525E
|| sc
->rf_rev
== RAL_RF_2526
||
2079 sc
->rf_rev
== RAL_RF_5222
)
2080 tx
|= RAL_BBP_FLIPIQ
;
2082 ural_bbp_write(sc
, RAL_BBP_TX
, tx
);
2084 /* update values in PHY_CSR5 and PHY_CSR6 */
2085 tmp
= ural_read(sc
, RAL_PHY_CSR5
) & ~0x7;
2086 ural_write(sc
, RAL_PHY_CSR5
, tmp
| (tx
& 0x7));
2088 tmp
= ural_read(sc
, RAL_PHY_CSR6
) & ~0x7;
2089 ural_write(sc
, RAL_PHY_CSR6
, tmp
| (tx
& 0x7));
2093 ural_set_rxantenna(struct ural_softc
*sc
, int antenna
)
2097 rx
= ural_bbp_read(sc
, RAL_BBP_RX
) & ~RAL_BBP_ANTMASK
;
2100 else if (antenna
== 2)
2103 rx
|= RAL_BBP_DIVERSITY
;
2105 /* need to force no I/Q flip for RF 2525e and 2526 */
2106 if (sc
->rf_rev
== RAL_RF_2525E
|| sc
->rf_rev
== RAL_RF_2526
)
2107 rx
&= ~RAL_BBP_FLIPIQ
;
2109 ural_bbp_write(sc
, RAL_BBP_RX
, rx
);
2113 ural_init(struct ifnet
*ifp
)
2115 #define N(a) (sizeof (a) / sizeof ((a)[0]))
2116 struct ural_softc
*sc
= ifp
->if_softc
;
2117 struct ieee80211com
*ic
= &sc
->sc_ic
;
2118 struct ieee80211_key
*wk
;
2119 struct ural_rx_data
*data
;
2124 ural_set_testmode(sc
);
2125 ural_write(sc
, 0x308, 0x00f0); /* XXX magic */
2129 /* initialize MAC registers to default values */
2130 for (i
= 0; i
< N(ural_def_mac
); i
++)
2131 ural_write(sc
, ural_def_mac
[i
].reg
, ural_def_mac
[i
].val
);
2133 /* wait for BBP and RF to wake up (this can take a long time!) */
2134 for (ntries
= 0; ntries
< 100; ntries
++) {
2135 tmp
= ural_read(sc
, RAL_MAC_CSR17
);
2136 if ((tmp
& (RAL_BBP_AWAKE
| RAL_RF_AWAKE
)) ==
2137 (RAL_BBP_AWAKE
| RAL_RF_AWAKE
))
2141 if (ntries
== 100) {
2142 printf("%s: timeout waiting for BBP/RF to wakeup\n",
2143 USBDEVNAME(sc
->sc_dev
));
2149 ural_write(sc
, RAL_MAC_CSR1
, RAL_HOST_READY
);
2151 /* set basic rate set (will be updated later) */
2152 ural_write(sc
, RAL_TXRX_CSR11
, 0x15f);
2154 error
= ural_bbp_init(sc
);
2158 /* set default BSS channel */
2159 ural_set_chan(sc
, ic
->ic_curchan
);
2161 /* clear statistic registers (STA_CSR0 to STA_CSR10) */
2162 ural_read_multi(sc
, RAL_STA_CSR0
, sc
->sta
, sizeof sc
->sta
);
2164 ural_set_txantenna(sc
, sc
->tx_ant
);
2165 ural_set_rxantenna(sc
, sc
->rx_ant
);
2167 IEEE80211_ADDR_COPY(ic
->ic_myaddr
, CLLADDR(ifp
->if_sadl
));
2168 ural_set_macaddr(sc
, ic
->ic_myaddr
);
2171 * Copy WEP keys into adapter's memory (SEC_CSR0 to SEC_CSR31).
2173 for (i
= 0; i
< IEEE80211_WEP_NKID
; i
++) {
2174 wk
= &ic
->ic_crypto
.cs_nw_keys
[i
];
2175 ural_write_multi(sc
, wk
->wk_keyix
* IEEE80211_KEYBUF_SIZE
+
2176 RAL_SEC_CSR0
, wk
->wk_key
, IEEE80211_KEYBUF_SIZE
);
2180 * Allocate xfer for AMRR statistics requests.
2182 sc
->amrr_xfer
= usbd_alloc_xfer(sc
->sc_udev
);
2183 if (sc
->amrr_xfer
== NULL
) {
2184 printf("%s: could not allocate AMRR xfer\n",
2185 USBDEVNAME(sc
->sc_dev
));
2190 * Open Tx and Rx USB bulk pipes.
2192 error
= usbd_open_pipe(sc
->sc_iface
, sc
->sc_tx_no
, USBD_EXCLUSIVE_USE
,
2195 printf("%s: could not open Tx pipe: %s\n",
2196 USBDEVNAME(sc
->sc_dev
), usbd_errstr(error
));
2200 error
= usbd_open_pipe(sc
->sc_iface
, sc
->sc_rx_no
, USBD_EXCLUSIVE_USE
,
2203 printf("%s: could not open Rx pipe: %s\n",
2204 USBDEVNAME(sc
->sc_dev
), usbd_errstr(error
));
2209 * Allocate Tx and Rx xfer queues.
2211 error
= ural_alloc_tx_list(sc
);
2213 printf("%s: could not allocate Tx list\n",
2214 USBDEVNAME(sc
->sc_dev
));
2218 error
= ural_alloc_rx_list(sc
);
2220 printf("%s: could not allocate Rx list\n",
2221 USBDEVNAME(sc
->sc_dev
));
2226 * Start up the receive pipe.
2228 for (i
= 0; i
< RAL_RX_LIST_COUNT
; i
++) {
2229 data
= &sc
->rx_data
[i
];
2231 usbd_setup_xfer(data
->xfer
, sc
->sc_rx_pipeh
, data
, data
->buf
,
2232 MCLBYTES
, USBD_SHORT_XFER_OK
, USBD_NO_TIMEOUT
, ural_rxeof
);
2233 usbd_transfer(data
->xfer
);
2237 tmp
= RAL_DROP_PHY_ERROR
| RAL_DROP_CRC_ERROR
;
2238 if (ic
->ic_opmode
!= IEEE80211_M_MONITOR
) {
2239 tmp
|= RAL_DROP_CTL
| RAL_DROP_VERSION_ERROR
;
2240 if (ic
->ic_opmode
!= IEEE80211_M_HOSTAP
)
2241 tmp
|= RAL_DROP_TODS
;
2242 if (!(ifp
->if_flags
& IFF_PROMISC
))
2243 tmp
|= RAL_DROP_NOT_TO_ME
;
2245 ural_write(sc
, RAL_TXRX_CSR2
, tmp
);
2247 ifp
->if_flags
&= ~IFF_OACTIVE
;
2248 ifp
->if_flags
|= IFF_RUNNING
;
2250 if (ic
->ic_opmode
!= IEEE80211_M_MONITOR
) {
2251 if (ic
->ic_roaming
!= IEEE80211_ROAMING_MANUAL
)
2252 ieee80211_new_state(ic
, IEEE80211_S_SCAN
, -1);
2254 ieee80211_new_state(ic
, IEEE80211_S_RUN
, -1);
2258 fail
: ural_stop(ifp
, 1);
2264 ural_stop(struct ifnet
*ifp
, int disable
)
2266 struct ural_softc
*sc
= ifp
->if_softc
;
2267 struct ieee80211com
*ic
= &sc
->sc_ic
;
2269 ieee80211_new_state(ic
, IEEE80211_S_INIT
, -1);
2271 sc
->sc_tx_timer
= 0;
2273 ifp
->if_flags
&= ~(IFF_RUNNING
| IFF_OACTIVE
);
2276 ural_write(sc
, RAL_TXRX_CSR2
, RAL_DISABLE_RX
);
2278 /* reset ASIC and BBP (but won't reset MAC registers!) */
2279 ural_write(sc
, RAL_MAC_CSR1
, RAL_RESET_ASIC
| RAL_RESET_BBP
);
2280 ural_write(sc
, RAL_MAC_CSR1
, 0);
2282 if (sc
->amrr_xfer
!= NULL
) {
2283 usbd_free_xfer(sc
->amrr_xfer
);
2284 sc
->amrr_xfer
= NULL
;
2287 if (sc
->sc_rx_pipeh
!= NULL
) {
2288 usbd_abort_pipe(sc
->sc_rx_pipeh
);
2289 usbd_close_pipe(sc
->sc_rx_pipeh
);
2290 sc
->sc_rx_pipeh
= NULL
;
2293 if (sc
->sc_tx_pipeh
!= NULL
) {
2294 usbd_abort_pipe(sc
->sc_tx_pipeh
);
2295 usbd_close_pipe(sc
->sc_tx_pipeh
);
2296 sc
->sc_tx_pipeh
= NULL
;
2299 ural_free_rx_list(sc
);
2300 ural_free_tx_list(sc
);
2304 ural_activate(device_ptr_t self
, enum devact act
)
2306 struct ural_softc
*sc
= device_private(self
);
2309 case DVACT_DEACTIVATE
:
2310 if_deactivate(&sc
->sc_if
);
2318 ural_amrr_start(struct ural_softc
*sc
, struct ieee80211_node
*ni
)
2322 /* clear statistic registers (STA_CSR0 to STA_CSR10) */
2323 ural_read_multi(sc
, RAL_STA_CSR0
, sc
->sta
, sizeof sc
->sta
);
2325 ieee80211_amrr_node_init(&sc
->amrr
, &sc
->amn
);
2327 /* set rate to some reasonable initial value */
2328 for (i
= ni
->ni_rates
.rs_nrates
- 1;
2329 i
> 0 && (ni
->ni_rates
.rs_rates
[i
] & IEEE80211_RATE_VAL
) > 72;
2333 usb_callout(sc
->sc_amrr_ch
, hz
, ural_amrr_timeout
, sc
);
2337 ural_amrr_timeout(void *arg
)
2339 struct ural_softc
*sc
= (struct ural_softc
*)arg
;
2340 usb_device_request_t req
;
2346 * Asynchronously read statistic registers (cleared by read).
2348 req
.bmRequestType
= UT_READ_VENDOR_DEVICE
;
2349 req
.bRequest
= RAL_READ_MULTI_MAC
;
2350 USETW(req
.wValue
, 0);
2351 USETW(req
.wIndex
, RAL_STA_CSR0
);
2352 USETW(req
.wLength
, sizeof sc
->sta
);
2354 usbd_setup_default_xfer(sc
->amrr_xfer
, sc
->sc_udev
, sc
,
2355 USBD_DEFAULT_TIMEOUT
, &req
, sc
->sta
, sizeof sc
->sta
, 0,
2357 (void)usbd_transfer(sc
->amrr_xfer
);
2363 ural_amrr_update(usbd_xfer_handle xfer
, usbd_private_handle priv
,
2366 struct ural_softc
*sc
= (struct ural_softc
*)priv
;
2367 struct ifnet
*ifp
= sc
->sc_ic
.ic_ifp
;
2369 if (status
!= USBD_NORMAL_COMPLETION
) {
2370 printf("%s: could not retrieve Tx statistics - "
2371 "cancelling automatic rate control\n",
2372 USBDEVNAME(sc
->sc_dev
));
2376 /* count TX retry-fail as Tx errors */
2377 ifp
->if_oerrors
+= sc
->sta
[9];
2379 sc
->amn
.amn_retrycnt
=
2380 sc
->sta
[7] + /* TX one-retry ok count */
2381 sc
->sta
[8] + /* TX more-retry ok count */
2382 sc
->sta
[9]; /* TX retry-fail count */
2385 sc
->amn
.amn_retrycnt
+
2386 sc
->sta
[6]; /* TX no-retry ok count */
2388 ieee80211_amrr_choose(&sc
->amrr
, sc
->sc_ic
.ic_bss
, &sc
->amn
);
2390 usb_callout(sc
->sc_amrr_ch
, hz
, ural_amrr_timeout
, sc
);