1 /*- 2 * Copyright (c) 2008 Weongyo Jeong <weongyo@FreeBSD.org> 3 * 4 * Permission to use, copy, modify, and distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #include <sys/cdefs.h> 18 __FBSDID("$FreeBSD$"); 19 #include <sys/param.h> 20 #include <sys/sockio.h> 21 #include <sys/sysctl.h> 22 #include <sys/lock.h> 23 #include <sys/mutex.h> 24 #include <sys/mbuf.h> 25 #include <sys/kernel.h> 26 #include <sys/socket.h> 27 #include <sys/systm.h> 28 #include <sys/malloc.h> 29 #include <sys/module.h> 30 #include <sys/bus.h> 31 #include <sys/endian.h> 32 #include <sys/kdb.h> 33 34 #include <machine/bus.h> 35 #include <machine/resource.h> 36 #include <sys/rman.h> 37 38 #include <net/if.h> 39 #include <net/if_arp.h> 40 #include <net/ethernet.h> 41 #include <net/if_dl.h> 42 #include <net/if_media.h> 43 #include <net/if_types.h> 44 45 #ifdef INET 46 #include <netinet/in.h> 47 #include <netinet/in_systm.h> 48 #include <netinet/in_var.h> 49 #include <netinet/if_ether.h> 50 #include <netinet/ip.h> 51 #endif 52 53 #include <net80211/ieee80211_var.h> 54 #include <net80211/ieee80211_regdomain.h> 55 #include <net80211/ieee80211_radiotap.h> 56 57 #include <dev/usb/usb.h> 58 #include <dev/usb/usbdi.h> 59 #include "usbdevs.h" 60 61 #include <dev/usb/wlan/if_urtwreg.h> 62 #include <dev/usb/wlan/if_urtwvar.h> 63 64 static SYSCTL_NODE(_hw_usb, OID_AUTO, urtw, CTLFLAG_RW, 0, "USB Realtek 8187L"); 65 #ifdef URTW_DEBUG 66 int urtw_debug = 0; 67 SYSCTL_INT(_hw_usb_urtw, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN, &urtw_debug, 0, 68 "control debugging printfs"); 69 TUNABLE_INT("hw.usb.urtw.debug", &urtw_debug); 70 enum { 71 URTW_DEBUG_XMIT = 0x00000001, /* basic xmit operation */ 72 URTW_DEBUG_RECV = 0x00000002, /* basic recv operation */ 73 URTW_DEBUG_RESET = 0x00000004, /* reset processing */ 74 URTW_DEBUG_TX_PROC = 0x00000008, /* tx ISR proc */ 75 URTW_DEBUG_RX_PROC = 0x00000010, /* rx ISR proc */ 76 URTW_DEBUG_STATE = 0x00000020, /* 802.11 state transitions */ 77 URTW_DEBUG_STAT = 0x00000040, /* statistic */ 78 URTW_DEBUG_INIT = 0x00000080, /* initialization of dev */ 79 URTW_DEBUG_TXSTATUS = 0x00000100, /* tx status */ 80 URTW_DEBUG_ANY = 0xffffffff 81 }; 82 #define DPRINTF(sc, m, fmt, ...) do { \ 83 if (sc->sc_debug & (m)) \ 84 printf(fmt, __VA_ARGS__); \ 85 } while (0) 86 #else 87 #define DPRINTF(sc, m, fmt, ...) do { \ 88 (void) sc; \ 89 } while (0) 90 #endif 91 static int urtw_preamble_mode = URTW_PREAMBLE_MODE_LONG; 92 SYSCTL_INT(_hw_usb_urtw, OID_AUTO, preamble_mode, CTLFLAG_RW | CTLFLAG_TUN, 93 &urtw_preamble_mode, 0, "set the preable mode (long or short)"); 94 TUNABLE_INT("hw.usb.urtw.preamble_mode", &urtw_preamble_mode); 95 96 /* recognized device vendors/products */ 97 #define urtw_lookup(v, p) \ 98 ((const struct urtw_type *)usb_lookup(urtw_devs, v, p)) 99 #define URTW_DEV_B(v,p) \ 100 { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, URTW_REV_RTL8187B) } 101 #define URTW_DEV_L(v,p) \ 102 { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, URTW_REV_RTL8187L) } 103 #define URTW_REV_RTL8187B 0 104 #define URTW_REV_RTL8187L 1 105 static const STRUCT_USB_HOST_ID urtw_devs[] = { 106 URTW_DEV_B(NETGEAR, WG111V3), 107 URTW_DEV_B(REALTEK, RTL8187B_0), 108 URTW_DEV_B(REALTEK, RTL8187B_1), 109 URTW_DEV_B(REALTEK, RTL8187B_2), 110 URTW_DEV_B(SITECOMEU, WL168V4), 111 URTW_DEV_L(ASUS, P5B_WIFI), 112 URTW_DEV_L(BELKIN, F5D7050E), 113 URTW_DEV_L(LINKSYS4, WUSB54GCV2), 114 URTW_DEV_L(NETGEAR, WG111V2), 115 URTW_DEV_L(REALTEK, RTL8187), 116 URTW_DEV_L(SITECOMEU, WL168V1), 117 URTW_DEV_L(SURECOM, EP9001G2A), 118 { USB_VPI(USB_VENDOR_OVISLINK, 0x8187, URTW_REV_RTL8187L) }, 119 { USB_VPI(USB_VENDOR_DICKSMITH, 0x9401, URTW_REV_RTL8187L) }, 120 { USB_VPI(USB_VENDOR_HP, 0xca02, URTW_REV_RTL8187L) }, 121 { USB_VPI(USB_VENDOR_LOGITEC, 0x010c, URTW_REV_RTL8187L) }, 122 { USB_VPI(USB_VENDOR_NETGEAR, 0x6100, URTW_REV_RTL8187L) }, 123 { USB_VPI(USB_VENDOR_SPHAIRON, 0x0150, URTW_REV_RTL8187L) }, 124 { USB_VPI(USB_VENDOR_QCOM, 0x6232, URTW_REV_RTL8187L) }, 125 #undef URTW_DEV_L 126 #undef URTW_DEV_B 127 }; 128 129 #define urtw_read8_m(sc, val, data) do { \ 130 error = urtw_read8_c(sc, val, data); \ 131 if (error != 0) \ 132 goto fail; \ 133 } while (0) 134 #define urtw_write8_m(sc, val, data) do { \ 135 error = urtw_write8_c(sc, val, data); \ 136 if (error != 0) \ 137 goto fail; \ 138 } while (0) 139 #define urtw_read16_m(sc, val, data) do { \ 140 error = urtw_read16_c(sc, val, data); \ 141 if (error != 0) \ 142 goto fail; \ 143 } while (0) 144 #define urtw_write16_m(sc, val, data) do { \ 145 error = urtw_write16_c(sc, val, data); \ 146 if (error != 0) \ 147 goto fail; \ 148 } while (0) 149 #define urtw_read32_m(sc, val, data) do { \ 150 error = urtw_read32_c(sc, val, data); \ 151 if (error != 0) \ 152 goto fail; \ 153 } while (0) 154 #define urtw_write32_m(sc, val, data) do { \ 155 error = urtw_write32_c(sc, val, data); \ 156 if (error != 0) \ 157 goto fail; \ 158 } while (0) 159 #define urtw_8187_write_phy_ofdm(sc, val, data) do { \ 160 error = urtw_8187_write_phy_ofdm_c(sc, val, data); \ 161 if (error != 0) \ 162 goto fail; \ 163 } while (0) 164 #define urtw_8187_write_phy_cck(sc, val, data) do { \ 165 error = urtw_8187_write_phy_cck_c(sc, val, data); \ 166 if (error != 0) \ 167 goto fail; \ 168 } while (0) 169 #define urtw_8225_write(sc, val, data) do { \ 170 error = urtw_8225_write_c(sc, val, data); \ 171 if (error != 0) \ 172 goto fail; \ 173 } while (0) 174 175 struct urtw_pair { 176 uint32_t reg; 177 uint32_t val; 178 }; 179 180 static uint8_t urtw_8225_agc[] = { 181 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9d, 0x9c, 0x9b, 182 0x9a, 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90, 183 0x8f, 0x8e, 0x8d, 0x8c, 0x8b, 0x8a, 0x89, 0x88, 0x87, 0x86, 0x85, 184 0x84, 0x83, 0x82, 0x81, 0x80, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 185 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30, 0x2f, 186 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 187 0x23, 0x22, 0x21, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 188 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 189 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 190 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 191 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 192 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 193 }; 194 195 static uint8_t urtw_8225z2_agc[] = { 196 0x5e, 0x5e, 0x5e, 0x5e, 0x5d, 0x5b, 0x59, 0x57, 0x55, 0x53, 0x51, 197 0x4f, 0x4d, 0x4b, 0x49, 0x47, 0x45, 0x43, 0x41, 0x3f, 0x3d, 0x3b, 198 0x39, 0x37, 0x35, 0x33, 0x31, 0x2f, 0x2d, 0x2b, 0x29, 0x27, 0x25, 199 0x23, 0x21, 0x1f, 0x1d, 0x1b, 0x19, 0x17, 0x15, 0x13, 0x11, 0x0f, 200 0x0d, 0x0b, 0x09, 0x07, 0x05, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 201 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x19, 0x19, 202 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x20, 0x21, 0x22, 0x23, 203 0x24, 0x25, 0x26, 0x26, 0x27, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2a, 204 0x2a, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d, 205 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x30, 0x30, 0x31, 0x31, 206 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 207 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31 208 }; 209 210 static uint32_t urtw_8225_channel[] = { 211 0x0000, /* dummy channel 0 */ 212 0x085c, /* 1 */ 213 0x08dc, /* 2 */ 214 0x095c, /* 3 */ 215 0x09dc, /* 4 */ 216 0x0a5c, /* 5 */ 217 0x0adc, /* 6 */ 218 0x0b5c, /* 7 */ 219 0x0bdc, /* 8 */ 220 0x0c5c, /* 9 */ 221 0x0cdc, /* 10 */ 222 0x0d5c, /* 11 */ 223 0x0ddc, /* 12 */ 224 0x0e5c, /* 13 */ 225 0x0f72, /* 14 */ 226 }; 227 228 static uint8_t urtw_8225_gain[] = { 229 0x23, 0x88, 0x7c, 0xa5, /* -82dbm */ 230 0x23, 0x88, 0x7c, 0xb5, /* -82dbm */ 231 0x23, 0x88, 0x7c, 0xc5, /* -82dbm */ 232 0x33, 0x80, 0x79, 0xc5, /* -78dbm */ 233 0x43, 0x78, 0x76, 0xc5, /* -74dbm */ 234 0x53, 0x60, 0x73, 0xc5, /* -70dbm */ 235 0x63, 0x58, 0x70, 0xc5, /* -66dbm */ 236 }; 237 238 static struct urtw_pair urtw_8225_rf_part1[] = { 239 { 0x00, 0x0067 }, { 0x01, 0x0fe0 }, { 0x02, 0x044d }, { 0x03, 0x0441 }, 240 { 0x04, 0x0486 }, { 0x05, 0x0bc0 }, { 0x06, 0x0ae6 }, { 0x07, 0x082a }, 241 { 0x08, 0x001f }, { 0x09, 0x0334 }, { 0x0a, 0x0fd4 }, { 0x0b, 0x0391 }, 242 { 0x0c, 0x0050 }, { 0x0d, 0x06db }, { 0x0e, 0x0029 }, { 0x0f, 0x0914 }, 243 }; 244 245 static struct urtw_pair urtw_8225_rf_part2[] = { 246 { 0x00, 0x01 }, { 0x01, 0x02 }, { 0x02, 0x42 }, { 0x03, 0x00 }, 247 { 0x04, 0x00 }, { 0x05, 0x00 }, { 0x06, 0x40 }, { 0x07, 0x00 }, 248 { 0x08, 0x40 }, { 0x09, 0xfe }, { 0x0a, 0x09 }, { 0x0b, 0x80 }, 249 { 0x0c, 0x01 }, { 0x0e, 0xd3 }, { 0x0f, 0x38 }, { 0x10, 0x84 }, 250 { 0x11, 0x06 }, { 0x12, 0x20 }, { 0x13, 0x20 }, { 0x14, 0x00 }, 251 { 0x15, 0x40 }, { 0x16, 0x00 }, { 0x17, 0x40 }, { 0x18, 0xef }, 252 { 0x19, 0x19 }, { 0x1a, 0x20 }, { 0x1b, 0x76 }, { 0x1c, 0x04 }, 253 { 0x1e, 0x95 }, { 0x1f, 0x75 }, { 0x20, 0x1f }, { 0x21, 0x27 }, 254 { 0x22, 0x16 }, { 0x24, 0x46 }, { 0x25, 0x20 }, { 0x26, 0x90 }, 255 { 0x27, 0x88 } 256 }; 257 258 static struct urtw_pair urtw_8225_rf_part3[] = { 259 { 0x00, 0x98 }, { 0x03, 0x20 }, { 0x04, 0x7e }, { 0x05, 0x12 }, 260 { 0x06, 0xfc }, { 0x07, 0x78 }, { 0x08, 0x2e }, { 0x10, 0x9b }, 261 { 0x11, 0x88 }, { 0x12, 0x47 }, { 0x13, 0xd0 }, { 0x19, 0x00 }, 262 { 0x1a, 0xa0 }, { 0x1b, 0x08 }, { 0x40, 0x86 }, { 0x41, 0x8d }, 263 { 0x42, 0x15 }, { 0x43, 0x18 }, { 0x44, 0x1f }, { 0x45, 0x1e }, 264 { 0x46, 0x1a }, { 0x47, 0x15 }, { 0x48, 0x10 }, { 0x49, 0x0a }, 265 { 0x4a, 0x05 }, { 0x4b, 0x02 }, { 0x4c, 0x05 } 266 }; 267 268 static uint16_t urtw_8225_rxgain[] = { 269 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409, 270 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, 271 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583, 272 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, 273 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688, 274 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745, 275 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789, 276 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793, 277 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, 278 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, 279 0x07aa, 0x07ab, 0x07ac, 0x07ad, 0x07b0, 0x07b1, 0x07b2, 0x07b3, 280 0x07b4, 0x07b5, 0x07b8, 0x07b9, 0x07ba, 0x07bb, 0x07bb 281 }; 282 283 static uint8_t urtw_8225_threshold[] = { 284 0x8d, 0x8d, 0x8d, 0x8d, 0x9d, 0xad, 0xbd, 285 }; 286 287 static uint8_t urtw_8225_tx_gain_cck_ofdm[] = { 288 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0x7e 289 }; 290 291 static uint8_t urtw_8225_txpwr_cck[] = { 292 0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02, 293 0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02, 294 0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02, 295 0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02, 296 0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03, 297 0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03 298 }; 299 300 static uint8_t urtw_8225_txpwr_cck_ch14[] = { 301 0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00, 302 0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00, 303 0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00, 304 0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00, 305 0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00, 306 0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00 307 }; 308 309 static uint8_t urtw_8225_txpwr_ofdm[]={ 310 0x80, 0x90, 0xa2, 0xb5, 0xcb, 0xe4 311 }; 312 313 static uint8_t urtw_8225v2_gain_bg[]={ 314 0x23, 0x15, 0xa5, /* -82-1dbm */ 315 0x23, 0x15, 0xb5, /* -82-2dbm */ 316 0x23, 0x15, 0xc5, /* -82-3dbm */ 317 0x33, 0x15, 0xc5, /* -78dbm */ 318 0x43, 0x15, 0xc5, /* -74dbm */ 319 0x53, 0x15, 0xc5, /* -70dbm */ 320 0x63, 0x15, 0xc5, /* -66dbm */ 321 }; 322 323 static struct urtw_pair urtw_8225v2_rf_part1[] = { 324 { 0x00, 0x02bf }, { 0x01, 0x0ee0 }, { 0x02, 0x044d }, { 0x03, 0x0441 }, 325 { 0x04, 0x08c3 }, { 0x05, 0x0c72 }, { 0x06, 0x00e6 }, { 0x07, 0x082a }, 326 { 0x08, 0x003f }, { 0x09, 0x0335 }, { 0x0a, 0x09d4 }, { 0x0b, 0x07bb }, 327 { 0x0c, 0x0850 }, { 0x0d, 0x0cdf }, { 0x0e, 0x002b }, { 0x0f, 0x0114 } 328 }; 329 330 static struct urtw_pair urtw_8225v2b_rf_part0[] = { 331 { 0x00, 0x00b7 }, { 0x01, 0x0ee0 }, { 0x02, 0x044d }, { 0x03, 0x0441 }, 332 { 0x04, 0x08c3 }, { 0x05, 0x0c72 }, { 0x06, 0x00e6 }, { 0x07, 0x082a }, 333 { 0x08, 0x003f }, { 0x09, 0x0335 }, { 0x0a, 0x09d4 }, { 0x0b, 0x07bb }, 334 { 0x0c, 0x0850 }, { 0x0d, 0x0cdf }, { 0x0e, 0x002b }, { 0x0f, 0x0114 } 335 }; 336 337 static struct urtw_pair urtw_8225v2b_rf_part1[] = { 338 {0x0f0, 0x32}, {0x0f1, 0x32}, {0x0f2, 0x00}, 339 {0x0f3, 0x00}, {0x0f4, 0x32}, {0x0f5, 0x43}, 340 {0x0f6, 0x00}, {0x0f7, 0x00}, {0x0f8, 0x46}, 341 {0x0f9, 0xa4}, {0x0fa, 0x00}, {0x0fb, 0x00}, 342 {0x0fc, 0x96}, {0x0fd, 0xa4}, {0x0fe, 0x00}, 343 {0x0ff, 0x00}, {0x158, 0x4b}, {0x159, 0x00}, 344 {0x15a, 0x4b}, {0x15b, 0x00}, {0x160, 0x4b}, 345 {0x161, 0x09}, {0x162, 0x4b}, {0x163, 0x09}, 346 {0x1ce, 0x0f}, {0x1cf, 0x00}, {0x1e0, 0xff}, 347 {0x1e1, 0x0f}, {0x1e2, 0x00}, {0x1f0, 0x4e}, 348 {0x1f1, 0x01}, {0x1f2, 0x02}, {0x1f3, 0x03}, 349 {0x1f4, 0x04}, {0x1f5, 0x05}, {0x1f6, 0x06}, 350 {0x1f7, 0x07}, {0x1f8, 0x08}, {0x24e, 0x00}, 351 {0x20c, 0x04}, {0x221, 0x61}, {0x222, 0x68}, 352 {0x223, 0x6f}, {0x224, 0x76}, {0x225, 0x7d}, 353 {0x226, 0x84}, {0x227, 0x8d}, {0x24d, 0x08}, 354 {0x250, 0x05}, {0x251, 0xf5}, {0x252, 0x04}, 355 {0x253, 0xa0}, {0x254, 0x1f}, {0x255, 0x23}, 356 {0x256, 0x45}, {0x257, 0x67}, {0x258, 0x08}, 357 {0x259, 0x08}, {0x25a, 0x08}, {0x25b, 0x08}, 358 {0x260, 0x08}, {0x261, 0x08}, {0x262, 0x08}, 359 {0x263, 0x08}, {0x264, 0xcf}, {0x272, 0x56}, 360 {0x273, 0x9a}, {0x034, 0xf0}, {0x035, 0x0f}, 361 {0x05b, 0x40}, {0x084, 0x88}, {0x085, 0x24}, 362 {0x088, 0x54}, {0x08b, 0xb8}, {0x08c, 0x07}, 363 {0x08d, 0x00}, {0x094, 0x1b}, {0x095, 0x12}, 364 {0x096, 0x00}, {0x097, 0x06}, {0x09d, 0x1a}, 365 {0x09f, 0x10}, {0x0b4, 0x22}, {0x0be, 0x80}, 366 {0x0db, 0x00}, {0x0ee, 0x00}, {0x091, 0x03}, 367 {0x24c, 0x00}, {0x39f, 0x00}, {0x08c, 0x01}, 368 {0x08d, 0x10}, {0x08e, 0x08}, {0x08f, 0x00} 369 }; 370 371 static struct urtw_pair urtw_8225v2_rf_part2[] = { 372 { 0x00, 0x01 }, { 0x01, 0x02 }, { 0x02, 0x42 }, { 0x03, 0x00 }, 373 { 0x04, 0x00 }, { 0x05, 0x00 }, { 0x06, 0x40 }, { 0x07, 0x00 }, 374 { 0x08, 0x40 }, { 0x09, 0xfe }, { 0x0a, 0x08 }, { 0x0b, 0x80 }, 375 { 0x0c, 0x01 }, { 0x0d, 0x43 }, { 0x0e, 0xd3 }, { 0x0f, 0x38 }, 376 { 0x10, 0x84 }, { 0x11, 0x07 }, { 0x12, 0x20 }, { 0x13, 0x20 }, 377 { 0x14, 0x00 }, { 0x15, 0x40 }, { 0x16, 0x00 }, { 0x17, 0x40 }, 378 { 0x18, 0xef }, { 0x19, 0x19 }, { 0x1a, 0x20 }, { 0x1b, 0x15 }, 379 { 0x1c, 0x04 }, { 0x1d, 0xc5 }, { 0x1e, 0x95 }, { 0x1f, 0x75 }, 380 { 0x20, 0x1f }, { 0x21, 0x17 }, { 0x22, 0x16 }, { 0x23, 0x80 }, 381 { 0x24, 0x46 }, { 0x25, 0x00 }, { 0x26, 0x90 }, { 0x27, 0x88 } 382 }; 383 384 static struct urtw_pair urtw_8225v2b_rf_part2[] = { 385 { 0x00, 0x10 }, { 0x01, 0x0d }, { 0x02, 0x01 }, { 0x03, 0x00 }, 386 { 0x04, 0x14 }, { 0x05, 0xfb }, { 0x06, 0xfb }, { 0x07, 0x60 }, 387 { 0x08, 0x00 }, { 0x09, 0x60 }, { 0x0a, 0x00 }, { 0x0b, 0x00 }, 388 { 0x0c, 0x00 }, { 0x0d, 0x5c }, { 0x0e, 0x00 }, { 0x0f, 0x00 }, 389 { 0x10, 0x40 }, { 0x11, 0x00 }, { 0x12, 0x40 }, { 0x13, 0x00 }, 390 { 0x14, 0x00 }, { 0x15, 0x00 }, { 0x16, 0xa8 }, { 0x17, 0x26 }, 391 { 0x18, 0x32 }, { 0x19, 0x33 }, { 0x1a, 0x07 }, { 0x1b, 0xa5 }, 392 { 0x1c, 0x6f }, { 0x1d, 0x55 }, { 0x1e, 0xc8 }, { 0x1f, 0xb3 }, 393 { 0x20, 0x0a }, { 0x21, 0xe1 }, { 0x22, 0x2C }, { 0x23, 0x8a }, 394 { 0x24, 0x86 }, { 0x25, 0x83 }, { 0x26, 0x34 }, { 0x27, 0x0f }, 395 { 0x28, 0x4f }, { 0x29, 0x24 }, { 0x2a, 0x6f }, { 0x2b, 0xc2 }, 396 { 0x2c, 0x6b }, { 0x2d, 0x40 }, { 0x2e, 0x80 }, { 0x2f, 0x00 }, 397 { 0x30, 0xc0 }, { 0x31, 0xc1 }, { 0x32, 0x58 }, { 0x33, 0xf1 }, 398 { 0x34, 0x00 }, { 0x35, 0xe4 }, { 0x36, 0x90 }, { 0x37, 0x3e }, 399 { 0x38, 0x6d }, { 0x39, 0x3c }, { 0x3a, 0xfb }, { 0x3b, 0x07 } 400 }; 401 402 static struct urtw_pair urtw_8225v2_rf_part3[] = { 403 { 0x00, 0x98 }, { 0x03, 0x20 }, { 0x04, 0x7e }, { 0x05, 0x12 }, 404 { 0x06, 0xfc }, { 0x07, 0x78 }, { 0x08, 0x2e }, { 0x09, 0x11 }, 405 { 0x0a, 0x17 }, { 0x0b, 0x11 }, { 0x10, 0x9b }, { 0x11, 0x88 }, 406 { 0x12, 0x47 }, { 0x13, 0xd0 }, { 0x19, 0x00 }, { 0x1a, 0xa0 }, 407 { 0x1b, 0x08 }, { 0x1d, 0x00 }, { 0x40, 0x86 }, { 0x41, 0x9d }, 408 { 0x42, 0x15 }, { 0x43, 0x18 }, { 0x44, 0x36 }, { 0x45, 0x35 }, 409 { 0x46, 0x2e }, { 0x47, 0x25 }, { 0x48, 0x1c }, { 0x49, 0x12 }, 410 { 0x4a, 0x09 }, { 0x4b, 0x04 }, { 0x4c, 0x05 } 411 }; 412 413 static uint16_t urtw_8225v2_rxgain[] = { 414 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0008, 0x0009, 415 0x000a, 0x000b, 0x0102, 0x0103, 0x0104, 0x0105, 0x0140, 0x0141, 416 0x0142, 0x0143, 0x0144, 0x0145, 0x0180, 0x0181, 0x0182, 0x0183, 417 0x0184, 0x0185, 0x0188, 0x0189, 0x018a, 0x018b, 0x0243, 0x0244, 418 0x0245, 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0288, 419 0x0289, 0x028a, 0x028b, 0x028c, 0x0342, 0x0343, 0x0344, 0x0345, 420 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0388, 0x0389, 421 0x038a, 0x038b, 0x038c, 0x038d, 0x0390, 0x0391, 0x0392, 0x0393, 422 0x0394, 0x0395, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 423 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a8, 0x03a9, 424 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 425 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb 426 }; 427 428 static uint16_t urtw_8225v2b_rxgain[] = { 429 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409, 430 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, 431 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583, 432 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, 433 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688, 434 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745, 435 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789, 436 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793, 437 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, 438 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, 439 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 440 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb 441 }; 442 443 static uint8_t urtw_8225v2_tx_gain_cck_ofdm[] = { 444 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 445 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 446 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 447 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 448 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 449 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 450 }; 451 452 static uint8_t urtw_8225v2_txpwr_cck[] = { 453 0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04 454 }; 455 456 static uint8_t urtw_8225v2_txpwr_cck_ch14[] = { 457 0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00 458 }; 459 460 static uint8_t urtw_8225v2b_txpwr_cck[] = { 461 0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04, 462 0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03, 463 0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03, 464 0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03 465 }; 466 467 static uint8_t urtw_8225v2b_txpwr_cck_ch14[] = { 468 0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00, 469 0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00, 470 0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00, 471 0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00 472 }; 473 474 static struct urtw_pair urtw_ratetable[] = { 475 { 2, 0 }, { 4, 1 }, { 11, 2 }, { 12, 4 }, { 18, 5 }, 476 { 22, 3 }, { 24, 6 }, { 36, 7 }, { 48, 8 }, { 72, 9 }, 477 { 96, 10 }, { 108, 11 } 478 }; 479 480 static const uint8_t urtw_8187b_reg_table[][3] = { 481 { 0xf0, 0x32, 0 }, { 0xf1, 0x32, 0 }, { 0xf2, 0x00, 0 }, 482 { 0xf3, 0x00, 0 }, { 0xf4, 0x32, 0 }, { 0xf5, 0x43, 0 }, 483 { 0xf6, 0x00, 0 }, { 0xf7, 0x00, 0 }, { 0xf8, 0x46, 0 }, 484 { 0xf9, 0xa4, 0 }, { 0xfa, 0x00, 0 }, { 0xfb, 0x00, 0 }, 485 { 0xfc, 0x96, 0 }, { 0xfd, 0xa4, 0 }, { 0xfe, 0x00, 0 }, 486 { 0xff, 0x00, 0 }, { 0x58, 0x4b, 1 }, { 0x59, 0x00, 1 }, 487 { 0x5a, 0x4b, 1 }, { 0x5b, 0x00, 1 }, { 0x60, 0x4b, 1 }, 488 { 0x61, 0x09, 1 }, { 0x62, 0x4b, 1 }, { 0x63, 0x09, 1 }, 489 { 0xce, 0x0f, 1 }, { 0xcf, 0x00, 1 }, { 0xe0, 0xff, 1 }, 490 { 0xe1, 0x0f, 1 }, { 0xe2, 0x00, 1 }, { 0xf0, 0x4e, 1 }, 491 { 0xf1, 0x01, 1 }, { 0xf2, 0x02, 1 }, { 0xf3, 0x03, 1 }, 492 { 0xf4, 0x04, 1 }, { 0xf5, 0x05, 1 }, { 0xf6, 0x06, 1 }, 493 { 0xf7, 0x07, 1 }, { 0xf8, 0x08, 1 }, { 0x4e, 0x00, 2 }, 494 { 0x0c, 0x04, 2 }, { 0x21, 0x61, 2 }, { 0x22, 0x68, 2 }, 495 { 0x23, 0x6f, 2 }, { 0x24, 0x76, 2 }, { 0x25, 0x7d, 2 }, 496 { 0x26, 0x84, 2 }, { 0x27, 0x8d, 2 }, { 0x4d, 0x08, 2 }, 497 { 0x50, 0x05, 2 }, { 0x51, 0xf5, 2 }, { 0x52, 0x04, 2 }, 498 { 0x53, 0xa0, 2 }, { 0x54, 0x1f, 2 }, { 0x55, 0x23, 2 }, 499 { 0x56, 0x45, 2 }, { 0x57, 0x67, 2 }, { 0x58, 0x08, 2 }, 500 { 0x59, 0x08, 2 }, { 0x5a, 0x08, 2 }, { 0x5b, 0x08, 2 }, 501 { 0x60, 0x08, 2 }, { 0x61, 0x08, 2 }, { 0x62, 0x08, 2 }, 502 { 0x63, 0x08, 2 }, { 0x64, 0xcf, 2 }, { 0x72, 0x56, 2 }, 503 { 0x73, 0x9a, 2 }, { 0x34, 0xf0, 0 }, { 0x35, 0x0f, 0 }, 504 { 0x5b, 0x40, 0 }, { 0x84, 0x88, 0 }, { 0x85, 0x24, 0 }, 505 { 0x88, 0x54, 0 }, { 0x8b, 0xb8, 0 }, { 0x8c, 0x07, 0 }, 506 { 0x8d, 0x00, 0 }, { 0x94, 0x1b, 0 }, { 0x95, 0x12, 0 }, 507 { 0x96, 0x00, 0 }, { 0x97, 0x06, 0 }, { 0x9d, 0x1a, 0 }, 508 { 0x9f, 0x10, 0 }, { 0xb4, 0x22, 0 }, { 0xbe, 0x80, 0 }, 509 { 0xdb, 0x00, 0 }, { 0xee, 0x00, 0 }, { 0x91, 0x03, 0 }, 510 { 0x4c, 0x00, 2 }, { 0x9f, 0x00, 3 }, { 0x8c, 0x01, 0 }, 511 { 0x8d, 0x10, 0 }, { 0x8e, 0x08, 0 }, { 0x8f, 0x00, 0 } 512 }; 513 514 static usb_callback_t urtw_bulk_rx_callback; 515 static usb_callback_t urtw_bulk_tx_callback; 516 static usb_callback_t urtw_bulk_tx_status_callback; 517 518 static const struct usb_config urtw_8187b_usbconfig[URTW_8187B_N_XFERS] = { 519 [URTW_8187B_BULK_RX] = { 520 .type = UE_BULK, 521 .endpoint = 0x83, 522 .direction = UE_DIR_IN, 523 .bufsize = MCLBYTES, 524 .flags = { 525 .ext_buffer = 1, 526 .pipe_bof = 1, 527 .short_xfer_ok = 1 528 }, 529 .callback = urtw_bulk_rx_callback 530 }, 531 [URTW_8187B_BULK_TX_STATUS] = { 532 .type = UE_BULK, 533 .endpoint = 0x89, 534 .direction = UE_DIR_IN, 535 .bufsize = sizeof(uint64_t), 536 .flags = { 537 .pipe_bof = 1, 538 .short_xfer_ok = 1 539 }, 540 .callback = urtw_bulk_tx_status_callback 541 }, 542 [URTW_8187B_BULK_TX_BE] = { 543 .type = UE_BULK, 544 .endpoint = URTW_8187B_TXPIPE_BE, 545 .direction = UE_DIR_OUT, 546 .bufsize = URTW_TX_MAXSIZE * URTW_TX_DATA_LIST_COUNT, 547 .flags = { 548 .force_short_xfer = 1, 549 .pipe_bof = 1, 550 }, 551 .callback = urtw_bulk_tx_callback, 552 .timeout = URTW_DATA_TIMEOUT 553 }, 554 [URTW_8187B_BULK_TX_BK] = { 555 .type = UE_BULK, 556 .endpoint = URTW_8187B_TXPIPE_BK, 557 .direction = UE_DIR_OUT, 558 .bufsize = URTW_TX_MAXSIZE, 559 .flags = { 560 .ext_buffer = 1, 561 .force_short_xfer = 1, 562 .pipe_bof = 1, 563 }, 564 .callback = urtw_bulk_tx_callback, 565 .timeout = URTW_DATA_TIMEOUT 566 }, 567 [URTW_8187B_BULK_TX_VI] = { 568 .type = UE_BULK, 569 .endpoint = URTW_8187B_TXPIPE_VI, 570 .direction = UE_DIR_OUT, 571 .bufsize = URTW_TX_MAXSIZE, 572 .flags = { 573 .ext_buffer = 1, 574 .force_short_xfer = 1, 575 .pipe_bof = 1, 576 }, 577 .callback = urtw_bulk_tx_callback, 578 .timeout = URTW_DATA_TIMEOUT 579 }, 580 [URTW_8187B_BULK_TX_VO] = { 581 .type = UE_BULK, 582 .endpoint = URTW_8187B_TXPIPE_VO, 583 .direction = UE_DIR_OUT, 584 .bufsize = URTW_TX_MAXSIZE, 585 .flags = { 586 .ext_buffer = 1, 587 .force_short_xfer = 1, 588 .pipe_bof = 1, 589 }, 590 .callback = urtw_bulk_tx_callback, 591 .timeout = URTW_DATA_TIMEOUT 592 }, 593 [URTW_8187B_BULK_TX_EP12] = { 594 .type = UE_BULK, 595 .endpoint = 0xc, 596 .direction = UE_DIR_OUT, 597 .bufsize = URTW_TX_MAXSIZE, 598 .flags = { 599 .ext_buffer = 1, 600 .force_short_xfer = 1, 601 .pipe_bof = 1, 602 }, 603 .callback = urtw_bulk_tx_callback, 604 .timeout = URTW_DATA_TIMEOUT 605 } 606 }; 607 608 static const struct usb_config urtw_8187l_usbconfig[URTW_8187L_N_XFERS] = { 609 [URTW_8187L_BULK_RX] = { 610 .type = UE_BULK, 611 .endpoint = 0x81, 612 .direction = UE_DIR_IN, 613 .bufsize = MCLBYTES, 614 .flags = { 615 .ext_buffer = 1, 616 .pipe_bof = 1, 617 .short_xfer_ok = 1 618 }, 619 .callback = urtw_bulk_rx_callback 620 }, 621 [URTW_8187L_BULK_TX_LOW] = { 622 .type = UE_BULK, 623 .endpoint = 0x2, 624 .direction = UE_DIR_OUT, 625 .bufsize = URTW_TX_MAXSIZE * URTW_TX_DATA_LIST_COUNT, 626 .flags = { 627 .force_short_xfer = 1, 628 .pipe_bof = 1, 629 }, 630 .callback = urtw_bulk_tx_callback, 631 .timeout = URTW_DATA_TIMEOUT 632 }, 633 [URTW_8187L_BULK_TX_NORMAL] = { 634 .type = UE_BULK, 635 .endpoint = 0x3, 636 .direction = UE_DIR_OUT, 637 .bufsize = URTW_TX_MAXSIZE, 638 .flags = { 639 .ext_buffer = 1, 640 .force_short_xfer = 1, 641 .pipe_bof = 1, 642 }, 643 .callback = urtw_bulk_tx_callback, 644 .timeout = URTW_DATA_TIMEOUT 645 }, 646 }; 647 648 static struct ieee80211vap *urtw_vap_create(struct ieee80211com *, 649 const char [IFNAMSIZ], int, enum ieee80211_opmode, 650 int, const uint8_t [IEEE80211_ADDR_LEN], 651 const uint8_t [IEEE80211_ADDR_LEN]); 652 static void urtw_vap_delete(struct ieee80211vap *); 653 static void urtw_init(void *); 654 static void urtw_stop(struct ifnet *); 655 static void urtw_stop_locked(struct ifnet *); 656 static int urtw_ioctl(struct ifnet *, u_long, caddr_t); 657 static void urtw_start(struct ifnet *); 658 static int urtw_alloc_rx_data_list(struct urtw_softc *); 659 static int urtw_alloc_tx_data_list(struct urtw_softc *); 660 static int urtw_raw_xmit(struct ieee80211_node *, struct mbuf *, 661 const struct ieee80211_bpf_params *); 662 static void urtw_scan_start(struct ieee80211com *); 663 static void urtw_scan_end(struct ieee80211com *); 664 static void urtw_set_channel(struct ieee80211com *); 665 static void urtw_update_mcast(struct ifnet *); 666 static int urtw_tx_start(struct urtw_softc *, 667 struct ieee80211_node *, struct mbuf *, 668 struct urtw_data *, int); 669 static int urtw_newstate(struct ieee80211vap *, 670 enum ieee80211_state, int); 671 static void urtw_led_ch(void *); 672 static void urtw_ledtask(void *, int); 673 static void urtw_watchdog(void *); 674 static void urtw_set_multi(void *); 675 static int urtw_isbmode(uint16_t); 676 static uint16_t urtw_rate2rtl(uint32_t); 677 static uint16_t urtw_rtl2rate(uint32_t); 678 static usb_error_t urtw_set_rate(struct urtw_softc *); 679 static usb_error_t urtw_update_msr(struct urtw_softc *); 680 static usb_error_t urtw_read8_c(struct urtw_softc *, int, uint8_t *); 681 static usb_error_t urtw_read16_c(struct urtw_softc *, int, uint16_t *); 682 static usb_error_t urtw_read32_c(struct urtw_softc *, int, uint32_t *); 683 static usb_error_t urtw_write8_c(struct urtw_softc *, int, uint8_t); 684 static usb_error_t urtw_write16_c(struct urtw_softc *, int, uint16_t); 685 static usb_error_t urtw_write32_c(struct urtw_softc *, int, uint32_t); 686 static usb_error_t urtw_eprom_cs(struct urtw_softc *, int); 687 static usb_error_t urtw_eprom_ck(struct urtw_softc *); 688 static usb_error_t urtw_eprom_sendbits(struct urtw_softc *, int16_t *, 689 int); 690 static usb_error_t urtw_eprom_read32(struct urtw_softc *, uint32_t, 691 uint32_t *); 692 static usb_error_t urtw_eprom_readbit(struct urtw_softc *, int16_t *); 693 static usb_error_t urtw_eprom_writebit(struct urtw_softc *, int16_t); 694 static usb_error_t urtw_get_macaddr(struct urtw_softc *); 695 static usb_error_t urtw_get_txpwr(struct urtw_softc *); 696 static usb_error_t urtw_get_rfchip(struct urtw_softc *); 697 static usb_error_t urtw_led_init(struct urtw_softc *); 698 static usb_error_t urtw_8185_rf_pins_enable(struct urtw_softc *); 699 static usb_error_t urtw_8185_tx_antenna(struct urtw_softc *, uint8_t); 700 static usb_error_t urtw_8187_write_phy(struct urtw_softc *, uint8_t, 701 uint32_t); 702 static usb_error_t urtw_8187_write_phy_ofdm_c(struct urtw_softc *, 703 uint8_t, uint32_t); 704 static usb_error_t urtw_8187_write_phy_cck_c(struct urtw_softc *, uint8_t, 705 uint32_t); 706 static usb_error_t urtw_8225_setgain(struct urtw_softc *, int16_t); 707 static usb_error_t urtw_8225_usb_init(struct urtw_softc *); 708 static usb_error_t urtw_8225_write_c(struct urtw_softc *, uint8_t, 709 uint16_t); 710 static usb_error_t urtw_8225_write_s16(struct urtw_softc *, uint8_t, int, 711 uint16_t *); 712 static usb_error_t urtw_8225_read(struct urtw_softc *, uint8_t, 713 uint32_t *); 714 static usb_error_t urtw_8225_rf_init(struct urtw_softc *); 715 static usb_error_t urtw_8225_rf_set_chan(struct urtw_softc *, int); 716 static usb_error_t urtw_8225_rf_set_sens(struct urtw_softc *, int); 717 static usb_error_t urtw_8225_set_txpwrlvl(struct urtw_softc *, int); 718 static usb_error_t urtw_8225_rf_stop(struct urtw_softc *); 719 static usb_error_t urtw_8225v2_rf_init(struct urtw_softc *); 720 static usb_error_t urtw_8225v2_rf_set_chan(struct urtw_softc *, int); 721 static usb_error_t urtw_8225v2_set_txpwrlvl(struct urtw_softc *, int); 722 static usb_error_t urtw_8225v2_setgain(struct urtw_softc *, int16_t); 723 static usb_error_t urtw_8225_isv2(struct urtw_softc *, int *); 724 static usb_error_t urtw_8225v2b_rf_init(struct urtw_softc *); 725 static usb_error_t urtw_8225v2b_rf_set_chan(struct urtw_softc *, int); 726 static usb_error_t urtw_read8e(struct urtw_softc *, int, uint8_t *); 727 static usb_error_t urtw_write8e(struct urtw_softc *, int, uint8_t); 728 static usb_error_t urtw_8180_set_anaparam(struct urtw_softc *, uint32_t); 729 static usb_error_t urtw_8185_set_anaparam2(struct urtw_softc *, uint32_t); 730 static usb_error_t urtw_intr_enable(struct urtw_softc *); 731 static usb_error_t urtw_intr_disable(struct urtw_softc *); 732 static usb_error_t urtw_reset(struct urtw_softc *); 733 static usb_error_t urtw_led_on(struct urtw_softc *, int); 734 static usb_error_t urtw_led_ctl(struct urtw_softc *, int); 735 static usb_error_t urtw_led_blink(struct urtw_softc *); 736 static usb_error_t urtw_led_mode0(struct urtw_softc *, int); 737 static usb_error_t urtw_led_mode1(struct urtw_softc *, int); 738 static usb_error_t urtw_led_mode2(struct urtw_softc *, int); 739 static usb_error_t urtw_led_mode3(struct urtw_softc *, int); 740 static usb_error_t urtw_rx_setconf(struct urtw_softc *); 741 static usb_error_t urtw_rx_enable(struct urtw_softc *); 742 static usb_error_t urtw_tx_enable(struct urtw_softc *sc); 743 static void urtw_free_tx_data_list(struct urtw_softc *); 744 static void urtw_free_rx_data_list(struct urtw_softc *); 745 static void urtw_free_data_list(struct urtw_softc *, 746 struct urtw_data data[], int, int); 747 static usb_error_t urtw_adapter_start(struct urtw_softc *); 748 static usb_error_t urtw_adapter_start_b(struct urtw_softc *); 749 static usb_error_t urtw_set_mode(struct urtw_softc *, uint32_t); 750 static usb_error_t urtw_8187b_cmd_reset(struct urtw_softc *); 751 static usb_error_t urtw_do_request(struct urtw_softc *, 752 struct usb_device_request *, void *); 753 static usb_error_t urtw_8225v2b_set_txpwrlvl(struct urtw_softc *, int); 754 static usb_error_t urtw_led_off(struct urtw_softc *, int); 755 static void urtw_abort_xfers(struct urtw_softc *); 756 static struct urtw_data * 757 urtw_getbuf(struct urtw_softc *sc); 758 static int urtw_compute_txtime(uint16_t, uint16_t, uint8_t, 759 uint8_t); 760 static void urtw_updateslot(struct ifnet *); 761 static void urtw_updateslottask(void *, int); 762 static void urtw_sysctl_node(struct urtw_softc *); 763 764 static int 765 urtw_match(device_t dev) 766 { 767 struct usb_attach_arg *uaa = device_get_ivars(dev); 768 769 if (uaa->usb_mode != USB_MODE_HOST) 770 return (ENXIO); 771 if (uaa->info.bConfigIndex != URTW_CONFIG_INDEX) 772 return (ENXIO); 773 if (uaa->info.bIfaceIndex != URTW_IFACE_INDEX) 774 return (ENXIO); 775 776 return (usbd_lookup_id_by_uaa(urtw_devs, sizeof(urtw_devs), uaa)); 777 } 778 779 static int 780 urtw_attach(device_t dev) 781 { 782 const struct usb_config *setup_start; 783 int ret = ENXIO; 784 struct urtw_softc *sc = device_get_softc(dev); 785 struct usb_attach_arg *uaa = device_get_ivars(dev); 786 struct ieee80211com *ic; 787 struct ifnet *ifp; 788 uint8_t bands, iface_index = URTW_IFACE_INDEX; /* XXX */ 789 uint16_t n_setup; 790 uint32_t data; 791 usb_error_t error; 792 793 device_set_usb_desc(dev); 794 795 sc->sc_dev = dev; 796 sc->sc_udev = uaa->device; 797 if (USB_GET_DRIVER_INFO(uaa) == URTW_REV_RTL8187B) 798 sc->sc_flags |= URTW_RTL8187B; 799 #ifdef URTW_DEBUG 800 sc->sc_debug = urtw_debug; 801 #endif 802 803 mtx_init(&sc->sc_mtx, device_get_nameunit(sc->sc_dev), MTX_NETWORK_LOCK, 804 MTX_DEF); 805 usb_callout_init_mtx(&sc->sc_led_ch, &sc->sc_mtx, 0); 806 TASK_INIT(&sc->sc_led_task, 0, urtw_ledtask, sc); 807 TASK_INIT(&sc->sc_updateslot_task, 0, urtw_updateslottask, sc); 808 callout_init(&sc->sc_watchdog_ch, 0); 809 810 if (sc->sc_flags & URTW_RTL8187B) { 811 setup_start = urtw_8187b_usbconfig; 812 n_setup = URTW_8187B_N_XFERS; 813 } else { 814 setup_start = urtw_8187l_usbconfig; 815 n_setup = URTW_8187L_N_XFERS; 816 } 817 818 error = usbd_transfer_setup(uaa->device, &iface_index, sc->sc_xfer, 819 setup_start, n_setup, sc, &sc->sc_mtx); 820 if (error) { 821 device_printf(dev, "could not allocate USB transfers, " 822 "err=%s\n", usbd_errstr(error)); 823 ret = ENXIO; 824 goto fail0; 825 } 826 827 if (sc->sc_flags & URTW_RTL8187B) { 828 sc->sc_tx_dma_buf = 829 usbd_xfer_get_frame_buffer(sc->sc_xfer[ 830 URTW_8187B_BULK_TX_BE], 0); 831 } else { 832 sc->sc_tx_dma_buf = 833 usbd_xfer_get_frame_buffer(sc->sc_xfer[ 834 URTW_8187L_BULK_TX_LOW], 0); 835 } 836 837 URTW_LOCK(sc); 838 839 urtw_read32_m(sc, URTW_RX, &data); 840 sc->sc_epromtype = (data & URTW_RX_9356SEL) ? URTW_EEPROM_93C56 : 841 URTW_EEPROM_93C46; 842 843 error = urtw_get_rfchip(sc); 844 if (error != 0) 845 goto fail; 846 error = urtw_get_macaddr(sc); 847 if (error != 0) 848 goto fail; 849 error = urtw_get_txpwr(sc); 850 if (error != 0) 851 goto fail; 852 error = urtw_led_init(sc); 853 if (error != 0) 854 goto fail; 855 856 URTW_UNLOCK(sc); 857 858 sc->sc_rts_retry = URTW_DEFAULT_RTS_RETRY; 859 sc->sc_tx_retry = URTW_DEFAULT_TX_RETRY; 860 sc->sc_currate = 3; 861 sc->sc_preamble_mode = urtw_preamble_mode; 862 863 ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211); 864 if (ifp == NULL) { 865 device_printf(sc->sc_dev, "can not allocate ifnet\n"); 866 ret = ENOMEM; 867 goto fail1; 868 } 869 870 ifp->if_softc = sc; 871 if_initname(ifp, "urtw", device_get_unit(sc->sc_dev)); 872 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 873 ifp->if_init = urtw_init; 874 ifp->if_ioctl = urtw_ioctl; 875 ifp->if_start = urtw_start; 876 /* XXX URTW_TX_DATA_LIST_COUNT */ 877 IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen); 878 ifp->if_snd.ifq_drv_maxlen = ifqmaxlen; 879 IFQ_SET_READY(&ifp->if_snd); 880 881 ic = ifp->if_l2com; 882 ic->ic_ifp = ifp; 883 ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */ 884 ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */ 885 886 /* set device capabilities */ 887 ic->ic_caps = 888 IEEE80211_C_STA | /* station mode */ 889 IEEE80211_C_MONITOR | /* monitor mode supported */ 890 IEEE80211_C_TXPMGT | /* tx power management */ 891 IEEE80211_C_SHPREAMBLE | /* short preamble supported */ 892 IEEE80211_C_SHSLOT | /* short slot time supported */ 893 IEEE80211_C_BGSCAN | /* capable of bg scanning */ 894 IEEE80211_C_WPA; /* 802.11i */ 895 896 bands = 0; 897 setbit(&bands, IEEE80211_MODE_11B); 898 setbit(&bands, IEEE80211_MODE_11G); 899 ieee80211_init_channels(ic, NULL, &bands); 900 901 ieee80211_ifattach(ic, sc->sc_bssid); 902 ic->ic_raw_xmit = urtw_raw_xmit; 903 ic->ic_scan_start = urtw_scan_start; 904 ic->ic_scan_end = urtw_scan_end; 905 ic->ic_set_channel = urtw_set_channel; 906 ic->ic_updateslot = urtw_updateslot; 907 ic->ic_vap_create = urtw_vap_create; 908 ic->ic_vap_delete = urtw_vap_delete; 909 ic->ic_update_mcast = urtw_update_mcast; 910 911 ieee80211_radiotap_attach(ic, 912 &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap), 913 URTW_TX_RADIOTAP_PRESENT, 914 &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap), 915 URTW_RX_RADIOTAP_PRESENT); 916 917 urtw_sysctl_node(sc); 918 919 if (bootverbose) 920 ieee80211_announce(ic); 921 return (0); 922 923 fail: URTW_UNLOCK(sc); 924 fail1: usbd_transfer_unsetup(sc->sc_xfer, (sc->sc_flags & URTW_RTL8187B) ? 925 URTW_8187B_N_XFERS : URTW_8187L_N_XFERS); 926 fail0: 927 return (ret); 928 } 929 930 static int 931 urtw_detach(device_t dev) 932 { 933 struct urtw_softc *sc = device_get_softc(dev); 934 struct ifnet *ifp = sc->sc_ifp; 935 struct ieee80211com *ic = ifp->if_l2com; 936 unsigned int x; 937 unsigned int n_xfers; 938 939 /* Prevent further ioctls */ 940 URTW_LOCK(sc); 941 sc->sc_flags |= URTW_DETACHED; 942 URTW_UNLOCK(sc); 943 944 urtw_stop(ifp); 945 946 ieee80211_draintask(ic, &sc->sc_updateslot_task); 947 ieee80211_draintask(ic, &sc->sc_led_task); 948 949 usb_callout_drain(&sc->sc_led_ch); 950 callout_drain(&sc->sc_watchdog_ch); 951 952 n_xfers = (sc->sc_flags & URTW_RTL8187B) ? 953 URTW_8187B_N_XFERS : URTW_8187L_N_XFERS; 954 955 /* prevent further allocations from RX/TX data lists */ 956 URTW_LOCK(sc); 957 STAILQ_INIT(&sc->sc_tx_active); 958 STAILQ_INIT(&sc->sc_tx_inactive); 959 STAILQ_INIT(&sc->sc_tx_pending); 960 961 STAILQ_INIT(&sc->sc_rx_active); 962 STAILQ_INIT(&sc->sc_rx_inactive); 963 URTW_UNLOCK(sc); 964 965 /* drain USB transfers */ 966 for (x = 0; x != n_xfers; x++) 967 usbd_transfer_drain(sc->sc_xfer[x]); 968 969 /* free data buffers */ 970 URTW_LOCK(sc); 971 urtw_free_tx_data_list(sc); 972 urtw_free_rx_data_list(sc); 973 URTW_UNLOCK(sc); 974 975 /* free USB transfers and some data buffers */ 976 usbd_transfer_unsetup(sc->sc_xfer, n_xfers); 977 978 ieee80211_ifdetach(ic); 979 if_free(ifp); 980 mtx_destroy(&sc->sc_mtx); 981 return (0); 982 } 983 984 static void 985 urtw_free_tx_data_list(struct urtw_softc *sc) 986 { 987 urtw_free_data_list(sc, sc->sc_tx, URTW_TX_DATA_LIST_COUNT, 0); 988 } 989 990 static void 991 urtw_free_rx_data_list(struct urtw_softc *sc) 992 { 993 urtw_free_data_list(sc, sc->sc_rx, URTW_RX_DATA_LIST_COUNT, 1); 994 } 995 996 static void 997 urtw_free_data_list(struct urtw_softc *sc, struct urtw_data data[], int ndata, 998 int fillmbuf) 999 { 1000 int i; 1001 1002 for (i = 0; i < ndata; i++) { 1003 struct urtw_data *dp = &data[i]; 1004 1005 if (fillmbuf == 1) { 1006 if (dp->m != NULL) { 1007 m_freem(dp->m); 1008 dp->m = NULL; 1009 dp->buf = NULL; 1010 } 1011 } else { 1012 dp->buf = NULL; 1013 } 1014 if (dp->ni != NULL) { 1015 ieee80211_free_node(dp->ni); 1016 dp->ni = NULL; 1017 } 1018 } 1019 } 1020 1021 static struct ieee80211vap * 1022 urtw_vap_create(struct ieee80211com *ic, const char name[IFNAMSIZ], int unit, 1023 enum ieee80211_opmode opmode, int flags, 1024 const uint8_t bssid[IEEE80211_ADDR_LEN], 1025 const uint8_t mac[IEEE80211_ADDR_LEN]) 1026 { 1027 struct urtw_vap *uvp; 1028 struct ieee80211vap *vap; 1029 1030 if (!TAILQ_EMPTY(&ic->ic_vaps)) /* only one at a time */ 1031 return (NULL); 1032 uvp = (struct urtw_vap *) malloc(sizeof(struct urtw_vap), 1033 M_80211_VAP, M_NOWAIT | M_ZERO); 1034 if (uvp == NULL) 1035 return (NULL); 1036 vap = &uvp->vap; 1037 /* enable s/w bmiss handling for sta mode */ 1038 ieee80211_vap_setup(ic, vap, name, unit, opmode, 1039 flags | IEEE80211_CLONE_NOBEACONS, bssid, mac); 1040 1041 /* override state transition machine */ 1042 uvp->newstate = vap->iv_newstate; 1043 vap->iv_newstate = urtw_newstate; 1044 1045 /* complete setup */ 1046 ieee80211_vap_attach(vap, ieee80211_media_change, 1047 ieee80211_media_status); 1048 ic->ic_opmode = opmode; 1049 return (vap); 1050 } 1051 1052 static void 1053 urtw_vap_delete(struct ieee80211vap *vap) 1054 { 1055 struct urtw_vap *uvp = URTW_VAP(vap); 1056 1057 ieee80211_vap_detach(vap); 1058 free(uvp, M_80211_VAP); 1059 } 1060 1061 static void 1062 urtw_init_locked(void *arg) 1063 { 1064 int ret; 1065 struct urtw_softc *sc = arg; 1066 struct ifnet *ifp = sc->sc_ifp; 1067 usb_error_t error; 1068 1069 if (ifp->if_drv_flags & IFF_DRV_RUNNING) 1070 urtw_stop_locked(ifp); 1071 1072 error = (sc->sc_flags & URTW_RTL8187B) ? urtw_adapter_start_b(sc) : 1073 urtw_adapter_start(sc); 1074 if (error != 0) 1075 goto fail; 1076 1077 /* reset softc variables */ 1078 sc->sc_txtimer = 0; 1079 1080 if (!(sc->sc_flags & URTW_INIT_ONCE)) { 1081 ret = urtw_alloc_rx_data_list(sc); 1082 if (ret != 0) 1083 goto fail; 1084 ret = urtw_alloc_tx_data_list(sc); 1085 if (ret != 0) 1086 goto fail; 1087 sc->sc_flags |= URTW_INIT_ONCE; 1088 } 1089 1090 error = urtw_rx_enable(sc); 1091 if (error != 0) 1092 goto fail; 1093 error = urtw_tx_enable(sc); 1094 if (error != 0) 1095 goto fail; 1096 1097 if (sc->sc_flags & URTW_RTL8187B) 1098 usbd_transfer_start(sc->sc_xfer[URTW_8187B_BULK_TX_STATUS]); 1099 1100 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 1101 ifp->if_drv_flags |= IFF_DRV_RUNNING; 1102 1103 callout_reset(&sc->sc_watchdog_ch, hz, urtw_watchdog, sc); 1104 fail: 1105 return; 1106 } 1107 1108 static void 1109 urtw_init(void *arg) 1110 { 1111 struct urtw_softc *sc = arg; 1112 1113 URTW_LOCK(sc); 1114 urtw_init_locked(arg); 1115 URTW_UNLOCK(sc); 1116 } 1117 1118 static usb_error_t 1119 urtw_adapter_start_b(struct urtw_softc *sc) 1120 { 1121 #define N(a) ((int)(sizeof(a) / sizeof((a)[0]))) 1122 uint8_t data8; 1123 usb_error_t error; 1124 1125 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 1126 if (error) 1127 goto fail; 1128 1129 urtw_read8_m(sc, URTW_CONFIG3, &data8); 1130 urtw_write8_m(sc, URTW_CONFIG3, 1131 data8 | URTW_CONFIG3_ANAPARAM_WRITE | URTW_CONFIG3_GNT_SELECT); 1132 urtw_write32_m(sc, URTW_ANAPARAM2, URTW_8187B_8225_ANAPARAM2_ON); 1133 urtw_write32_m(sc, URTW_ANAPARAM, URTW_8187B_8225_ANAPARAM_ON); 1134 urtw_write8_m(sc, URTW_ANAPARAM3, URTW_8187B_8225_ANAPARAM3_ON); 1135 1136 urtw_write8_m(sc, 0x61, 0x10); 1137 urtw_read8_m(sc, 0x62, &data8); 1138 urtw_write8_m(sc, 0x62, data8 & ~(1 << 5)); 1139 urtw_write8_m(sc, 0x62, data8 | (1 << 5)); 1140 1141 urtw_read8_m(sc, URTW_CONFIG3, &data8); 1142 data8 &= ~URTW_CONFIG3_ANAPARAM_WRITE; 1143 urtw_write8_m(sc, URTW_CONFIG3, data8); 1144 1145 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 1146 if (error) 1147 goto fail; 1148 1149 error = urtw_8187b_cmd_reset(sc); 1150 if (error) 1151 goto fail; 1152 1153 error = sc->sc_rf_init(sc); 1154 if (error != 0) 1155 goto fail; 1156 urtw_write8_m(sc, URTW_CMD, URTW_CMD_RX_ENABLE | URTW_CMD_TX_ENABLE); 1157 1158 /* fix RTL8187B RX stall */ 1159 error = urtw_intr_enable(sc); 1160 if (error) 1161 goto fail; 1162 1163 error = urtw_write8e(sc, 0x41, 0xf4); 1164 if (error) 1165 goto fail; 1166 error = urtw_write8e(sc, 0x40, 0x00); 1167 if (error) 1168 goto fail; 1169 error = urtw_write8e(sc, 0x42, 0x00); 1170 if (error) 1171 goto fail; 1172 error = urtw_write8e(sc, 0x42, 0x01); 1173 if (error) 1174 goto fail; 1175 error = urtw_write8e(sc, 0x40, 0x0f); 1176 if (error) 1177 goto fail; 1178 error = urtw_write8e(sc, 0x42, 0x00); 1179 if (error) 1180 goto fail; 1181 error = urtw_write8e(sc, 0x42, 0x01); 1182 if (error) 1183 goto fail; 1184 1185 urtw_read8_m(sc, 0xdb, &data8); 1186 urtw_write8_m(sc, 0xdb, data8 | (1 << 2)); 1187 urtw_write16_m(sc, 0x372, 0x59fa); 1188 urtw_write16_m(sc, 0x374, 0x59d2); 1189 urtw_write16_m(sc, 0x376, 0x59d2); 1190 urtw_write16_m(sc, 0x378, 0x19fa); 1191 urtw_write16_m(sc, 0x37a, 0x19fa); 1192 urtw_write16_m(sc, 0x37c, 0x00d0); 1193 urtw_write8_m(sc, 0x61, 0); 1194 1195 urtw_write8_m(sc, 0x180, 0x0f); 1196 urtw_write8_m(sc, 0x183, 0x03); 1197 urtw_write8_m(sc, 0xda, 0x10); 1198 urtw_write8_m(sc, 0x24d, 0x08); 1199 urtw_write32_m(sc, URTW_HSSI_PARA, 0x0600321b); 1200 1201 urtw_write16_m(sc, 0x1ec, 0x800); /* RX MAX SIZE */ 1202 fail: 1203 return (error); 1204 #undef N 1205 } 1206 1207 static usb_error_t 1208 urtw_adapter_start(struct urtw_softc *sc) 1209 { 1210 usb_error_t error; 1211 1212 error = urtw_reset(sc); 1213 if (error) 1214 goto fail; 1215 1216 urtw_write8_m(sc, URTW_ADDR_MAGIC1, 0); 1217 urtw_write8_m(sc, URTW_GPIO, 0); 1218 1219 /* for led */ 1220 urtw_write8_m(sc, URTW_ADDR_MAGIC1, 4); 1221 error = urtw_led_ctl(sc, URTW_LED_CTL_POWER_ON); 1222 if (error != 0) 1223 goto fail; 1224 1225 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 1226 if (error) 1227 goto fail; 1228 /* applying MAC address again. */ 1229 urtw_write32_m(sc, URTW_MAC0, ((uint32_t *)sc->sc_bssid)[0]); 1230 urtw_write16_m(sc, URTW_MAC4, ((uint32_t *)sc->sc_bssid)[1] & 0xffff); 1231 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 1232 if (error) 1233 goto fail; 1234 1235 error = urtw_update_msr(sc); 1236 if (error) 1237 goto fail; 1238 1239 urtw_write32_m(sc, URTW_INT_TIMEOUT, 0); 1240 urtw_write8_m(sc, URTW_WPA_CONFIG, 0); 1241 urtw_write8_m(sc, URTW_RATE_FALLBACK, URTW_RATE_FALLBACK_ENABLE | 0x1); 1242 error = urtw_set_rate(sc); 1243 if (error != 0) 1244 goto fail; 1245 1246 error = sc->sc_rf_init(sc); 1247 if (error != 0) 1248 goto fail; 1249 if (sc->sc_rf_set_sens != NULL) 1250 sc->sc_rf_set_sens(sc, sc->sc_sens); 1251 1252 /* XXX correct? to call write16 */ 1253 urtw_write16_m(sc, URTW_PSR, 1); 1254 urtw_write16_m(sc, URTW_ADDR_MAGIC2, 0x10); 1255 urtw_write8_m(sc, URTW_TALLY_SEL, 0x80); 1256 urtw_write8_m(sc, URTW_ADDR_MAGIC3, 0x60); 1257 /* XXX correct? to call write16 */ 1258 urtw_write16_m(sc, URTW_PSR, 0); 1259 urtw_write8_m(sc, URTW_ADDR_MAGIC1, 4); 1260 1261 error = urtw_intr_enable(sc); 1262 if (error != 0) 1263 goto fail; 1264 1265 fail: 1266 return (error); 1267 } 1268 1269 static usb_error_t 1270 urtw_set_mode(struct urtw_softc *sc, uint32_t mode) 1271 { 1272 uint8_t data; 1273 usb_error_t error; 1274 1275 urtw_read8_m(sc, URTW_EPROM_CMD, &data); 1276 data = (data & ~URTW_EPROM_CMD_MASK) | (mode << URTW_EPROM_CMD_SHIFT); 1277 data = data & ~(URTW_EPROM_CS | URTW_EPROM_CK); 1278 urtw_write8_m(sc, URTW_EPROM_CMD, data); 1279 fail: 1280 return (error); 1281 } 1282 1283 static usb_error_t 1284 urtw_8187b_cmd_reset(struct urtw_softc *sc) 1285 { 1286 int i; 1287 uint8_t data8; 1288 usb_error_t error; 1289 1290 /* XXX the code can be duplicate with urtw_reset(). */ 1291 urtw_read8_m(sc, URTW_CMD, &data8); 1292 data8 = (data8 & 0x2) | URTW_CMD_RST; 1293 urtw_write8_m(sc, URTW_CMD, data8); 1294 1295 for (i = 0; i < 20; i++) { 1296 usb_pause_mtx(&sc->sc_mtx, 2); 1297 urtw_read8_m(sc, URTW_CMD, &data8); 1298 if (!(data8 & URTW_CMD_RST)) 1299 break; 1300 } 1301 if (i >= 20) { 1302 device_printf(sc->sc_dev, "reset timeout\n"); 1303 goto fail; 1304 } 1305 fail: 1306 return (error); 1307 } 1308 1309 static usb_error_t 1310 urtw_do_request(struct urtw_softc *sc, 1311 struct usb_device_request *req, void *data) 1312 { 1313 usb_error_t err; 1314 int ntries = 10; 1315 1316 URTW_ASSERT_LOCKED(sc); 1317 1318 while (ntries--) { 1319 err = usbd_do_request_flags(sc->sc_udev, &sc->sc_mtx, 1320 req, data, 0, NULL, 250 /* ms */); 1321 if (err == 0) 1322 break; 1323 1324 DPRINTF(sc, URTW_DEBUG_INIT, 1325 "Control request failed, %s (retrying)\n", 1326 usbd_errstr(err)); 1327 usb_pause_mtx(&sc->sc_mtx, hz / 100); 1328 } 1329 return (err); 1330 } 1331 1332 static void 1333 urtw_stop_locked(struct ifnet *ifp) 1334 { 1335 struct urtw_softc *sc = ifp->if_softc; 1336 uint8_t data8; 1337 usb_error_t error; 1338 1339 ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); 1340 1341 error = urtw_intr_disable(sc); 1342 if (error) 1343 goto fail; 1344 urtw_read8_m(sc, URTW_CMD, &data8); 1345 data8 &= ~(URTW_CMD_RX_ENABLE | URTW_CMD_TX_ENABLE); 1346 urtw_write8_m(sc, URTW_CMD, data8); 1347 1348 error = sc->sc_rf_stop(sc); 1349 if (error != 0) 1350 goto fail; 1351 1352 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 1353 if (error) 1354 goto fail; 1355 urtw_read8_m(sc, URTW_CONFIG4, &data8); 1356 urtw_write8_m(sc, URTW_CONFIG4, data8 | URTW_CONFIG4_VCOOFF); 1357 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 1358 if (error) 1359 goto fail; 1360 fail: 1361 if (error) 1362 device_printf(sc->sc_dev, "failed to stop (%s)\n", 1363 usbd_errstr(error)); 1364 1365 usb_callout_stop(&sc->sc_led_ch); 1366 callout_stop(&sc->sc_watchdog_ch); 1367 1368 urtw_abort_xfers(sc); 1369 } 1370 1371 static void 1372 urtw_stop(struct ifnet *ifp) 1373 { 1374 struct urtw_softc *sc = ifp->if_softc; 1375 1376 URTW_LOCK(sc); 1377 urtw_stop_locked(ifp); 1378 URTW_UNLOCK(sc); 1379 } 1380 1381 static void 1382 urtw_abort_xfers(struct urtw_softc *sc) 1383 { 1384 int i, max; 1385 1386 URTW_ASSERT_LOCKED(sc); 1387 1388 max = (sc->sc_flags & URTW_RTL8187B) ? URTW_8187B_N_XFERS : 1389 URTW_8187L_N_XFERS; 1390 1391 /* abort any pending transfers */ 1392 for (i = 0; i < max; i++) 1393 usbd_transfer_stop(sc->sc_xfer[i]); 1394 } 1395 1396 static int 1397 urtw_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) 1398 { 1399 struct urtw_softc *sc = ifp->if_softc; 1400 struct ieee80211com *ic = ifp->if_l2com; 1401 struct ifreq *ifr = (struct ifreq *) data; 1402 int error; 1403 int startall = 0; 1404 1405 URTW_LOCK(sc); 1406 error = (sc->sc_flags & URTW_DETACHED) ? ENXIO : 0; 1407 URTW_UNLOCK(sc); 1408 if (error) 1409 return (error); 1410 1411 switch (cmd) { 1412 case SIOCSIFFLAGS: 1413 if (ifp->if_flags & IFF_UP) { 1414 if (ifp->if_drv_flags & IFF_DRV_RUNNING) { 1415 if ((ifp->if_flags ^ sc->sc_if_flags) & 1416 (IFF_ALLMULTI | IFF_PROMISC)) 1417 urtw_set_multi(sc); 1418 } else { 1419 urtw_init(ifp->if_softc); 1420 startall = 1; 1421 } 1422 } else { 1423 if (ifp->if_drv_flags & IFF_DRV_RUNNING) 1424 urtw_stop(ifp); 1425 } 1426 sc->sc_if_flags = ifp->if_flags; 1427 if (startall) 1428 ieee80211_start_all(ic); 1429 break; 1430 case SIOCGIFMEDIA: 1431 error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd); 1432 break; 1433 case SIOCGIFADDR: 1434 error = ether_ioctl(ifp, cmd, data); 1435 break; 1436 default: 1437 error = EINVAL; 1438 break; 1439 } 1440 return (error); 1441 } 1442 1443 static void 1444 urtw_start(struct ifnet *ifp) 1445 { 1446 struct urtw_data *bf; 1447 struct urtw_softc *sc = ifp->if_softc; 1448 struct ieee80211_node *ni; 1449 struct mbuf *m; 1450 1451 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) 1452 return; 1453 1454 URTW_LOCK(sc); 1455 for (;;) { 1456 IFQ_DRV_DEQUEUE(&ifp->if_snd, m); 1457 if (m == NULL) 1458 break; 1459 bf = urtw_getbuf(sc); 1460 if (bf == NULL) { 1461 IFQ_DRV_PREPEND(&ifp->if_snd, m); 1462 break; 1463 } 1464 1465 ni = (struct ieee80211_node *)m->m_pkthdr.rcvif; 1466 m->m_pkthdr.rcvif = NULL; 1467 1468 if (urtw_tx_start(sc, ni, m, bf, URTW_PRIORITY_NORMAL) != 0) { 1469 ifp->if_oerrors++; 1470 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next); 1471 ieee80211_free_node(ni); 1472 break; 1473 } 1474 1475 sc->sc_txtimer = 5; 1476 callout_reset(&sc->sc_watchdog_ch, hz, urtw_watchdog, sc); 1477 } 1478 URTW_UNLOCK(sc); 1479 } 1480 1481 static int 1482 urtw_alloc_data_list(struct urtw_softc *sc, struct urtw_data data[], 1483 int ndata, int maxsz, void *dma_buf) 1484 { 1485 int i, error; 1486 1487 for (i = 0; i < ndata; i++) { 1488 struct urtw_data *dp = &data[i]; 1489 1490 dp->sc = sc; 1491 if (dma_buf == NULL) { 1492 dp->m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR); 1493 if (dp->m == NULL) { 1494 device_printf(sc->sc_dev, 1495 "could not allocate rx mbuf\n"); 1496 error = ENOMEM; 1497 goto fail; 1498 } 1499 dp->buf = mtod(dp->m, uint8_t *); 1500 } else { 1501 dp->m = NULL; 1502 dp->buf = ((uint8_t *)dma_buf) + 1503 (i * maxsz); 1504 } 1505 dp->ni = NULL; 1506 } 1507 return (0); 1508 1509 fail: urtw_free_data_list(sc, data, ndata, 1); 1510 return (error); 1511 } 1512 1513 static int 1514 urtw_alloc_rx_data_list(struct urtw_softc *sc) 1515 { 1516 int error, i; 1517 1518 error = urtw_alloc_data_list(sc, 1519 sc->sc_rx, URTW_RX_DATA_LIST_COUNT, 1520 MCLBYTES, NULL /* mbufs */); 1521 if (error != 0) 1522 return (error); 1523 1524 STAILQ_INIT(&sc->sc_rx_active); 1525 STAILQ_INIT(&sc->sc_rx_inactive); 1526 1527 for (i = 0; i < URTW_RX_DATA_LIST_COUNT; i++) 1528 STAILQ_INSERT_HEAD(&sc->sc_rx_inactive, &sc->sc_rx[i], next); 1529 1530 return (0); 1531 } 1532 1533 static int 1534 urtw_alloc_tx_data_list(struct urtw_softc *sc) 1535 { 1536 int error, i; 1537 1538 error = urtw_alloc_data_list(sc, 1539 sc->sc_tx, URTW_TX_DATA_LIST_COUNT, URTW_TX_MAXSIZE, 1540 sc->sc_tx_dma_buf /* no mbufs */); 1541 if (error != 0) 1542 return (error); 1543 1544 STAILQ_INIT(&sc->sc_tx_active); 1545 STAILQ_INIT(&sc->sc_tx_inactive); 1546 STAILQ_INIT(&sc->sc_tx_pending); 1547 1548 for (i = 0; i < URTW_TX_DATA_LIST_COUNT; i++) 1549 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, &sc->sc_tx[i], 1550 next); 1551 1552 return (0); 1553 } 1554 1555 static int 1556 urtw_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, 1557 const struct ieee80211_bpf_params *params) 1558 { 1559 struct ieee80211com *ic = ni->ni_ic; 1560 struct ifnet *ifp = ic->ic_ifp; 1561 struct urtw_data *bf; 1562 struct urtw_softc *sc = ifp->if_softc; 1563 1564 /* prevent management frames from being sent if we're not ready */ 1565 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { 1566 m_freem(m); 1567 ieee80211_free_node(ni); 1568 return ENETDOWN; 1569 } 1570 URTW_LOCK(sc); 1571 bf = urtw_getbuf(sc); 1572 if (bf == NULL) { 1573 ieee80211_free_node(ni); 1574 m_freem(m); 1575 URTW_UNLOCK(sc); 1576 return (ENOBUFS); /* XXX */ 1577 } 1578 1579 ifp->if_opackets++; 1580 if (urtw_tx_start(sc, ni, m, bf, URTW_PRIORITY_LOW) != 0) { 1581 ieee80211_free_node(ni); 1582 ifp->if_oerrors++; 1583 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next); 1584 URTW_UNLOCK(sc); 1585 return (EIO); 1586 } 1587 URTW_UNLOCK(sc); 1588 1589 sc->sc_txtimer = 5; 1590 return (0); 1591 } 1592 1593 static void 1594 urtw_scan_start(struct ieee80211com *ic) 1595 { 1596 1597 /* XXX do nothing? */ 1598 } 1599 1600 static void 1601 urtw_scan_end(struct ieee80211com *ic) 1602 { 1603 1604 /* XXX do nothing? */ 1605 } 1606 1607 static void 1608 urtw_set_channel(struct ieee80211com *ic) 1609 { 1610 struct urtw_softc *sc = ic->ic_ifp->if_softc; 1611 struct ifnet *ifp = sc->sc_ifp; 1612 uint32_t data, orig; 1613 usb_error_t error; 1614 1615 /* 1616 * if the user set a channel explicitly using ifconfig(8) this function 1617 * can be called earlier than we're expected that in some cases the 1618 * initialization would be failed if setting a channel is called before 1619 * the init have done. 1620 */ 1621 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) 1622 return; 1623 1624 if (sc->sc_curchan != NULL && sc->sc_curchan == ic->ic_curchan) 1625 return; 1626 1627 URTW_LOCK(sc); 1628 1629 /* 1630 * during changing th channel we need to temporarily be disable 1631 * TX. 1632 */ 1633 urtw_read32_m(sc, URTW_TX_CONF, &orig); 1634 data = orig & ~URTW_TX_LOOPBACK_MASK; 1635 urtw_write32_m(sc, URTW_TX_CONF, data | URTW_TX_LOOPBACK_MAC); 1636 1637 error = sc->sc_rf_set_chan(sc, ieee80211_chan2ieee(ic, ic->ic_curchan)); 1638 if (error != 0) 1639 goto fail; 1640 usb_pause_mtx(&sc->sc_mtx, 10); 1641 urtw_write32_m(sc, URTW_TX_CONF, orig); 1642 1643 urtw_write16_m(sc, URTW_ATIM_WND, 2); 1644 urtw_write16_m(sc, URTW_ATIM_TR_ITV, 100); 1645 urtw_write16_m(sc, URTW_BEACON_INTERVAL, 100); 1646 urtw_write16_m(sc, URTW_BEACON_INTERVAL_TIME, 100); 1647 1648 fail: 1649 URTW_UNLOCK(sc); 1650 1651 sc->sc_curchan = ic->ic_curchan; 1652 1653 if (error != 0) 1654 device_printf(sc->sc_dev, "could not change the channel\n"); 1655 } 1656 1657 static void 1658 urtw_update_mcast(struct ifnet *ifp) 1659 { 1660 1661 /* XXX do nothing? */ 1662 } 1663 1664 static int 1665 urtw_tx_start(struct urtw_softc *sc, struct ieee80211_node *ni, struct mbuf *m0, 1666 struct urtw_data *data, int prior) 1667 { 1668 struct ifnet *ifp = sc->sc_ifp; 1669 struct ieee80211_frame *wh = mtod(m0, struct ieee80211_frame *); 1670 struct ieee80211_key *k; 1671 const struct ieee80211_txparam *tp; 1672 struct ieee80211com *ic = ifp->if_l2com; 1673 struct ieee80211vap *vap = ni->ni_vap; 1674 struct usb_xfer *rtl8187b_pipes[URTW_8187B_TXPIPE_MAX] = { 1675 sc->sc_xfer[URTW_8187B_BULK_TX_BE], 1676 sc->sc_xfer[URTW_8187B_BULK_TX_BK], 1677 sc->sc_xfer[URTW_8187B_BULK_TX_VI], 1678 sc->sc_xfer[URTW_8187B_BULK_TX_VO] 1679 }; 1680 struct usb_xfer *xfer; 1681 int dur = 0, rtsdur = 0, rtsenable = 0, ctsenable = 0, rate, 1682 pkttime = 0, txdur = 0, isshort = 0, xferlen; 1683 uint16_t acktime, rtstime, ctstime; 1684 uint32_t flags; 1685 usb_error_t error; 1686 1687 URTW_ASSERT_LOCKED(sc); 1688 1689 /* 1690 * Software crypto. 1691 */ 1692 if (wh->i_fc[1] & IEEE80211_FC1_WEP) { 1693 k = ieee80211_crypto_encap(ni, m0); 1694 if (k == NULL) { 1695 device_printf(sc->sc_dev, 1696 "ieee80211_crypto_encap returns NULL.\n"); 1697 /* XXX we don't expect the fragmented frames */ 1698 m_freem(m0); 1699 return (ENOBUFS); 1700 } 1701 1702 /* in case packet header moved, reset pointer */ 1703 wh = mtod(m0, struct ieee80211_frame *); 1704 } 1705 1706 if (ieee80211_radiotap_active_vap(vap)) { 1707 struct urtw_tx_radiotap_header *tap = &sc->sc_txtap; 1708 1709 /* XXX Are variables correct? */ 1710 tap->wt_flags = 0; 1711 tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq); 1712 tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags); 1713 1714 ieee80211_radiotap_tx(vap, m0); 1715 } 1716 1717 if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_MGT || 1718 (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL) { 1719 tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)]; 1720 rate = tp->mgmtrate; 1721 } else { 1722 tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)]; 1723 /* for data frames */ 1724 if (IEEE80211_IS_MULTICAST(wh->i_addr1)) 1725 rate = tp->mcastrate; 1726 else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) 1727 rate = tp->ucastrate; 1728 else 1729 rate = urtw_rtl2rate(sc->sc_currate); 1730 } 1731 1732 sc->sc_stats.txrates[sc->sc_currate]++; 1733 1734 if (IEEE80211_IS_MULTICAST(wh->i_addr1)) 1735 txdur = pkttime = urtw_compute_txtime(m0->m_pkthdr.len + 1736 IEEE80211_CRC_LEN, rate, 0, 0); 1737 else { 1738 acktime = urtw_compute_txtime(14, 2,0, 0); 1739 if ((m0->m_pkthdr.len + 4) > vap->iv_rtsthreshold) { 1740 rtsenable = 1; 1741 ctsenable = 0; 1742 rtstime = urtw_compute_txtime(URTW_ACKCTS_LEN, 2, 0, 0); 1743 ctstime = urtw_compute_txtime(14, 2, 0, 0); 1744 pkttime = urtw_compute_txtime(m0->m_pkthdr.len + 1745 IEEE80211_CRC_LEN, rate, 0, isshort); 1746 rtsdur = ctstime + pkttime + acktime + 1747 3 * URTW_ASIFS_TIME; 1748 txdur = rtstime + rtsdur; 1749 } else { 1750 rtsenable = ctsenable = rtsdur = 0; 1751 pkttime = urtw_compute_txtime(m0->m_pkthdr.len + 1752 IEEE80211_CRC_LEN, rate, 0, isshort); 1753 txdur = pkttime + URTW_ASIFS_TIME + acktime; 1754 } 1755 1756 if (wh->i_fc[1] & IEEE80211_FC1_MORE_FRAG) 1757 dur = urtw_compute_txtime(m0->m_pkthdr.len + 1758 IEEE80211_CRC_LEN, rate, 0, isshort) + 1759 3 * URTW_ASIFS_TIME + 1760 2 * acktime; 1761 else 1762 dur = URTW_ASIFS_TIME + acktime; 1763 } 1764 *(uint16_t *)wh->i_dur = htole16(dur); 1765 1766 xferlen = m0->m_pkthdr.len; 1767 xferlen += (sc->sc_flags & URTW_RTL8187B) ? (4 * 8) : (4 * 3); 1768 if ((0 == xferlen % 64) || (0 == xferlen % 512)) 1769 xferlen += 1; 1770 1771 memset(data->buf, 0, URTW_TX_MAXSIZE); 1772 flags = m0->m_pkthdr.len & 0xfff; 1773 flags |= URTW_TX_FLAG_NO_ENC; 1774 if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) && 1775 (ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_PREAMBLE) && 1776 (sc->sc_preamble_mode == URTW_PREAMBLE_MODE_SHORT) && 1777 (sc->sc_currate != 0)) 1778 flags |= URTW_TX_FLAG_SPLCP; 1779 if (wh->i_fc[1] & IEEE80211_FC1_MORE_FRAG) 1780 flags |= URTW_TX_FLAG_MOREFRAG; 1781 1782 flags |= (sc->sc_currate & 0xf) << URTW_TX_FLAG_TXRATE_SHIFT; 1783 1784 if (sc->sc_flags & URTW_RTL8187B) { 1785 struct urtw_8187b_txhdr *tx; 1786 1787 tx = (struct urtw_8187b_txhdr *)data->buf; 1788 if (ctsenable) 1789 flags |= URTW_TX_FLAG_CTS; 1790 if (rtsenable) { 1791 flags |= URTW_TX_FLAG_RTS; 1792 flags |= (urtw_rate2rtl(11) & 0xf) << 1793 URTW_TX_FLAG_RTSRATE_SHIFT; 1794 tx->rtsdur = rtsdur; 1795 } 1796 tx->flag = htole32(flags); 1797 tx->txdur = txdur; 1798 if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == 1799 IEEE80211_FC0_TYPE_MGT && 1800 (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) == 1801 IEEE80211_FC0_SUBTYPE_PROBE_RESP) 1802 tx->retry = 1; 1803 else 1804 tx->retry = URTW_TX_MAXRETRY; 1805 m_copydata(m0, 0, m0->m_pkthdr.len, (uint8_t *)(tx + 1)); 1806 } else { 1807 struct urtw_8187l_txhdr *tx; 1808 1809 tx = (struct urtw_8187l_txhdr *)data->buf; 1810 if (rtsenable) { 1811 flags |= URTW_TX_FLAG_RTS; 1812 tx->rtsdur = rtsdur; 1813 } 1814 flags |= (urtw_rate2rtl(11) & 0xf) << URTW_TX_FLAG_RTSRATE_SHIFT; 1815 tx->flag = htole32(flags); 1816 tx->retry = 3; /* CW minimum */ 1817 tx->retry = 7 << 4; /* CW maximum */ 1818 tx->retry = URTW_TX_MAXRETRY << 8; /* retry limitation */ 1819 m_copydata(m0, 0, m0->m_pkthdr.len, (uint8_t *)(tx + 1)); 1820 } 1821 1822 data->buflen = xferlen; 1823 data->ni = ni; 1824 data->m = m0; 1825 1826 if (sc->sc_flags & URTW_RTL8187B) { 1827 switch (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) { 1828 case IEEE80211_FC0_TYPE_CTL: 1829 case IEEE80211_FC0_TYPE_MGT: 1830 xfer = sc->sc_xfer[URTW_8187B_BULK_TX_EP12]; 1831 break; 1832 default: 1833 KASSERT(M_WME_GETAC(m0) < URTW_8187B_TXPIPE_MAX, 1834 ("unsupported WME pipe %d", M_WME_GETAC(m0))); 1835 xfer = rtl8187b_pipes[M_WME_GETAC(m0)]; 1836 break; 1837 } 1838 } else 1839 xfer = (prior == URTW_PRIORITY_LOW) ? 1840 sc->sc_xfer[URTW_8187L_BULK_TX_LOW] : 1841 sc->sc_xfer[URTW_8187L_BULK_TX_NORMAL]; 1842 1843 STAILQ_INSERT_TAIL(&sc->sc_tx_pending, data, next); 1844 usbd_transfer_start(xfer); 1845 1846 error = urtw_led_ctl(sc, URTW_LED_CTL_TX); 1847 if (error != 0) 1848 device_printf(sc->sc_dev, "could not control LED (%d)\n", 1849 error); 1850 return (0); 1851 } 1852 1853 static int 1854 urtw_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) 1855 { 1856 struct ieee80211com *ic = vap->iv_ic; 1857 struct urtw_softc *sc = ic->ic_ifp->if_softc; 1858 struct urtw_vap *uvp = URTW_VAP(vap); 1859 struct ieee80211_node *ni; 1860 usb_error_t error = 0; 1861 1862 DPRINTF(sc, URTW_DEBUG_STATE, "%s: %s -> %s\n", __func__, 1863 ieee80211_state_name[vap->iv_state], 1864 ieee80211_state_name[nstate]); 1865 1866 sc->sc_state = nstate; 1867 1868 IEEE80211_UNLOCK(ic); 1869 URTW_LOCK(sc); 1870 usb_callout_stop(&sc->sc_led_ch); 1871 callout_stop(&sc->sc_watchdog_ch); 1872 1873 switch (nstate) { 1874 case IEEE80211_S_INIT: 1875 case IEEE80211_S_SCAN: 1876 case IEEE80211_S_AUTH: 1877 case IEEE80211_S_ASSOC: 1878 break; 1879 case IEEE80211_S_RUN: 1880 ni = ieee80211_ref_node(vap->iv_bss); 1881 /* setting bssid. */ 1882 urtw_write32_m(sc, URTW_BSSID, ((uint32_t *)ni->ni_bssid)[0]); 1883 urtw_write16_m(sc, URTW_BSSID + 4, 1884 ((uint16_t *)ni->ni_bssid)[2]); 1885 urtw_update_msr(sc); 1886 /* XXX maybe the below would be incorrect. */ 1887 urtw_write16_m(sc, URTW_ATIM_WND, 2); 1888 urtw_write16_m(sc, URTW_ATIM_TR_ITV, 100); 1889 urtw_write16_m(sc, URTW_BEACON_INTERVAL, 0x64); 1890 urtw_write16_m(sc, URTW_BEACON_INTERVAL_TIME, 100); 1891 error = urtw_led_ctl(sc, URTW_LED_CTL_LINK); 1892 if (error != 0) 1893 device_printf(sc->sc_dev, 1894 "could not control LED (%d)\n", error); 1895 ieee80211_free_node(ni); 1896 break; 1897 default: 1898 break; 1899 } 1900 fail: 1901 URTW_UNLOCK(sc); 1902 IEEE80211_LOCK(ic); 1903 return (uvp->newstate(vap, nstate, arg)); 1904 } 1905 1906 static void 1907 urtw_watchdog(void *arg) 1908 { 1909 struct urtw_softc *sc = arg; 1910 struct ifnet *ifp = sc->sc_ifp; 1911 1912 if (sc->sc_txtimer > 0) { 1913 if (--sc->sc_txtimer == 0) { 1914 device_printf(sc->sc_dev, "device timeout\n"); 1915 ifp->if_oerrors++; 1916 return; 1917 } 1918 callout_reset(&sc->sc_watchdog_ch, hz, urtw_watchdog, sc); 1919 } 1920 } 1921 1922 static void 1923 urtw_set_multi(void *arg) 1924 { 1925 struct urtw_softc *sc = arg; 1926 struct ifnet *ifp = sc->sc_ifp; 1927 1928 if (!(ifp->if_flags & IFF_UP)) 1929 return; 1930 1931 /* 1932 * XXX don't know how to set a device. Lack of docs. Just try to set 1933 * IFF_ALLMULTI flag here. 1934 */ 1935 ifp->if_flags |= IFF_ALLMULTI; 1936 } 1937 1938 static usb_error_t 1939 urtw_set_rate(struct urtw_softc *sc) 1940 { 1941 int i, basic_rate, min_rr_rate, max_rr_rate; 1942 uint16_t data; 1943 usb_error_t error; 1944 1945 basic_rate = urtw_rate2rtl(48); 1946 min_rr_rate = urtw_rate2rtl(12); 1947 max_rr_rate = urtw_rate2rtl(48); 1948 1949 urtw_write8_m(sc, URTW_RESP_RATE, 1950 max_rr_rate << URTW_RESP_MAX_RATE_SHIFT | 1951 min_rr_rate << URTW_RESP_MIN_RATE_SHIFT); 1952 1953 urtw_read16_m(sc, URTW_BRSR, &data); 1954 data &= ~URTW_BRSR_MBR_8185; 1955 1956 for (i = 0; i <= basic_rate; i++) 1957 data |= (1 << i); 1958 1959 urtw_write16_m(sc, URTW_BRSR, data); 1960 fail: 1961 return (error); 1962 } 1963 1964 static uint16_t 1965 urtw_rate2rtl(uint32_t rate) 1966 { 1967 #define N(a) ((int)(sizeof(a) / sizeof((a)[0]))) 1968 int i; 1969 1970 for (i = 0; i < N(urtw_ratetable); i++) { 1971 if (rate == urtw_ratetable[i].reg) 1972 return urtw_ratetable[i].val; 1973 } 1974 1975 return (3); 1976 #undef N 1977 } 1978 1979 static uint16_t 1980 urtw_rtl2rate(uint32_t rate) 1981 { 1982 #define N(a) ((int)(sizeof(a) / sizeof((a)[0]))) 1983 int i; 1984 1985 for (i = 0; i < N(urtw_ratetable); i++) { 1986 if (rate == urtw_ratetable[i].val) 1987 return urtw_ratetable[i].reg; 1988 } 1989 1990 return (0); 1991 #undef N 1992 } 1993 1994 static usb_error_t 1995 urtw_update_msr(struct urtw_softc *sc) 1996 { 1997 struct ifnet *ifp = sc->sc_ifp; 1998 struct ieee80211com *ic = ifp->if_l2com; 1999 uint8_t data; 2000 usb_error_t error; 2001 2002 urtw_read8_m(sc, URTW_MSR, &data); 2003 data &= ~URTW_MSR_LINK_MASK; 2004 2005 if (sc->sc_state == IEEE80211_S_RUN) { 2006 switch (ic->ic_opmode) { 2007 case IEEE80211_M_STA: 2008 case IEEE80211_M_MONITOR: 2009 data |= URTW_MSR_LINK_STA; 2010 if (sc->sc_flags & URTW_RTL8187B) 2011 data |= URTW_MSR_LINK_ENEDCA; 2012 break; 2013 case IEEE80211_M_IBSS: 2014 data |= URTW_MSR_LINK_ADHOC; 2015 break; 2016 case IEEE80211_M_HOSTAP: 2017 data |= URTW_MSR_LINK_HOSTAP; 2018 break; 2019 default: 2020 DPRINTF(sc, URTW_DEBUG_STATE, 2021 "unsupported operation mode 0x%x\n", 2022 ic->ic_opmode); 2023 error = USB_ERR_INVAL; 2024 goto fail; 2025 } 2026 } else 2027 data |= URTW_MSR_LINK_NONE; 2028 2029 urtw_write8_m(sc, URTW_MSR, data); 2030 fail: 2031 return (error); 2032 } 2033 2034 static usb_error_t 2035 urtw_read8_c(struct urtw_softc *sc, int val, uint8_t *data) 2036 { 2037 struct usb_device_request req; 2038 usb_error_t error; 2039 2040 URTW_ASSERT_LOCKED(sc); 2041 2042 req.bmRequestType = UT_READ_VENDOR_DEVICE; 2043 req.bRequest = URTW_8187_GETREGS_REQ; 2044 USETW(req.wValue, (val & 0xff) | 0xff00); 2045 USETW(req.wIndex, (val >> 8) & 0x3); 2046 USETW(req.wLength, sizeof(uint8_t)); 2047 2048 error = urtw_do_request(sc, &req, data); 2049 return (error); 2050 } 2051 2052 static usb_error_t 2053 urtw_read16_c(struct urtw_softc *sc, int val, uint16_t *data) 2054 { 2055 struct usb_device_request req; 2056 usb_error_t error; 2057 2058 URTW_ASSERT_LOCKED(sc); 2059 2060 req.bmRequestType = UT_READ_VENDOR_DEVICE; 2061 req.bRequest = URTW_8187_GETREGS_REQ; 2062 USETW(req.wValue, (val & 0xff) | 0xff00); 2063 USETW(req.wIndex, (val >> 8) & 0x3); 2064 USETW(req.wLength, sizeof(uint16_t)); 2065 2066 error = urtw_do_request(sc, &req, data); 2067 return (error); 2068 } 2069 2070 static usb_error_t 2071 urtw_read32_c(struct urtw_softc *sc, int val, uint32_t *data) 2072 { 2073 struct usb_device_request req; 2074 usb_error_t error; 2075 2076 URTW_ASSERT_LOCKED(sc); 2077 2078 req.bmRequestType = UT_READ_VENDOR_DEVICE; 2079 req.bRequest = URTW_8187_GETREGS_REQ; 2080 USETW(req.wValue, (val & 0xff) | 0xff00); 2081 USETW(req.wIndex, (val >> 8) & 0x3); 2082 USETW(req.wLength, sizeof(uint32_t)); 2083 2084 error = urtw_do_request(sc, &req, data); 2085 return (error); 2086 } 2087 2088 static usb_error_t 2089 urtw_write8_c(struct urtw_softc *sc, int val, uint8_t data) 2090 { 2091 struct usb_device_request req; 2092 2093 URTW_ASSERT_LOCKED(sc); 2094 2095 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 2096 req.bRequest = URTW_8187_SETREGS_REQ; 2097 USETW(req.wValue, (val & 0xff) | 0xff00); 2098 USETW(req.wIndex, (val >> 8) & 0x3); 2099 USETW(req.wLength, sizeof(uint8_t)); 2100 2101 return (urtw_do_request(sc, &req, &data)); 2102 } 2103 2104 static usb_error_t 2105 urtw_write16_c(struct urtw_softc *sc, int val, uint16_t data) 2106 { 2107 struct usb_device_request req; 2108 2109 URTW_ASSERT_LOCKED(sc); 2110 2111 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 2112 req.bRequest = URTW_8187_SETREGS_REQ; 2113 USETW(req.wValue, (val & 0xff) | 0xff00); 2114 USETW(req.wIndex, (val >> 8) & 0x3); 2115 USETW(req.wLength, sizeof(uint16_t)); 2116 2117 return (urtw_do_request(sc, &req, &data)); 2118 } 2119 2120 static usb_error_t 2121 urtw_write32_c(struct urtw_softc *sc, int val, uint32_t data) 2122 { 2123 struct usb_device_request req; 2124 2125 URTW_ASSERT_LOCKED(sc); 2126 2127 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 2128 req.bRequest = URTW_8187_SETREGS_REQ; 2129 USETW(req.wValue, (val & 0xff) | 0xff00); 2130 USETW(req.wIndex, (val >> 8) & 0x3); 2131 USETW(req.wLength, sizeof(uint32_t)); 2132 2133 return (urtw_do_request(sc, &req, &data)); 2134 } 2135 2136 static usb_error_t 2137 urtw_get_macaddr(struct urtw_softc *sc) 2138 { 2139 uint32_t data; 2140 usb_error_t error; 2141 2142 error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR, &data); 2143 if (error != 0) 2144 goto fail; 2145 sc->sc_bssid[0] = data & 0xff; 2146 sc->sc_bssid[1] = (data & 0xff00) >> 8; 2147 error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR + 1, &data); 2148 if (error != 0) 2149 goto fail; 2150 sc->sc_bssid[2] = data & 0xff; 2151 sc->sc_bssid[3] = (data & 0xff00) >> 8; 2152 error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR + 2, &data); 2153 if (error != 0) 2154 goto fail; 2155 sc->sc_bssid[4] = data & 0xff; 2156 sc->sc_bssid[5] = (data & 0xff00) >> 8; 2157 fail: 2158 return (error); 2159 } 2160 2161 static usb_error_t 2162 urtw_eprom_read32(struct urtw_softc *sc, uint32_t addr, uint32_t *data) 2163 { 2164 #define URTW_READCMD_LEN 3 2165 int addrlen, i; 2166 int16_t addrstr[8], data16, readcmd[] = { 1, 1, 0 }; 2167 usb_error_t error; 2168 2169 /* NB: make sure the buffer is initialized */ 2170 *data = 0; 2171 2172 /* enable EPROM programming */ 2173 urtw_write8_m(sc, URTW_EPROM_CMD, URTW_EPROM_CMD_PROGRAM_MODE); 2174 DELAY(URTW_EPROM_DELAY); 2175 2176 error = urtw_eprom_cs(sc, URTW_EPROM_ENABLE); 2177 if (error != 0) 2178 goto fail; 2179 error = urtw_eprom_ck(sc); 2180 if (error != 0) 2181 goto fail; 2182 error = urtw_eprom_sendbits(sc, readcmd, URTW_READCMD_LEN); 2183 if (error != 0) 2184 goto fail; 2185 if (sc->sc_epromtype == URTW_EEPROM_93C56) { 2186 addrlen = 8; 2187 addrstr[0] = addr & (1 << 7); 2188 addrstr[1] = addr & (1 << 6); 2189 addrstr[2] = addr & (1 << 5); 2190 addrstr[3] = addr & (1 << 4); 2191 addrstr[4] = addr & (1 << 3); 2192 addrstr[5] = addr & (1 << 2); 2193 addrstr[6] = addr & (1 << 1); 2194 addrstr[7] = addr & (1 << 0); 2195 } else { 2196 addrlen=6; 2197 addrstr[0] = addr & (1 << 5); 2198 addrstr[1] = addr & (1 << 4); 2199 addrstr[2] = addr & (1 << 3); 2200 addrstr[3] = addr & (1 << 2); 2201 addrstr[4] = addr & (1 << 1); 2202 addrstr[5] = addr & (1 << 0); 2203 } 2204 error = urtw_eprom_sendbits(sc, addrstr, addrlen); 2205 if (error != 0) 2206 goto fail; 2207 2208 error = urtw_eprom_writebit(sc, 0); 2209 if (error != 0) 2210 goto fail; 2211 2212 for (i = 0; i < 16; i++) { 2213 error = urtw_eprom_ck(sc); 2214 if (error != 0) 2215 goto fail; 2216 error = urtw_eprom_readbit(sc, &data16); 2217 if (error != 0) 2218 goto fail; 2219 2220 (*data) |= (data16 << (15 - i)); 2221 } 2222 2223 error = urtw_eprom_cs(sc, URTW_EPROM_DISABLE); 2224 if (error != 0) 2225 goto fail; 2226 error = urtw_eprom_ck(sc); 2227 if (error != 0) 2228 goto fail; 2229 2230 /* now disable EPROM programming */ 2231 urtw_write8_m(sc, URTW_EPROM_CMD, URTW_EPROM_CMD_NORMAL_MODE); 2232 fail: 2233 return (error); 2234 #undef URTW_READCMD_LEN 2235 } 2236 2237 static usb_error_t 2238 urtw_eprom_cs(struct urtw_softc *sc, int able) 2239 { 2240 uint8_t data; 2241 usb_error_t error; 2242 2243 urtw_read8_m(sc, URTW_EPROM_CMD, &data); 2244 if (able == URTW_EPROM_ENABLE) 2245 urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_CS); 2246 else 2247 urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_CS); 2248 DELAY(URTW_EPROM_DELAY); 2249 fail: 2250 return (error); 2251 } 2252 2253 static usb_error_t 2254 urtw_eprom_ck(struct urtw_softc *sc) 2255 { 2256 uint8_t data; 2257 usb_error_t error; 2258 2259 /* masking */ 2260 urtw_read8_m(sc, URTW_EPROM_CMD, &data); 2261 urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_CK); 2262 DELAY(URTW_EPROM_DELAY); 2263 /* unmasking */ 2264 urtw_read8_m(sc, URTW_EPROM_CMD, &data); 2265 urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_CK); 2266 DELAY(URTW_EPROM_DELAY); 2267 fail: 2268 return (error); 2269 } 2270 2271 static usb_error_t 2272 urtw_eprom_readbit(struct urtw_softc *sc, int16_t *data) 2273 { 2274 uint8_t data8; 2275 usb_error_t error; 2276 2277 urtw_read8_m(sc, URTW_EPROM_CMD, &data8); 2278 *data = (data8 & URTW_EPROM_READBIT) ? 1 : 0; 2279 DELAY(URTW_EPROM_DELAY); 2280 2281 fail: 2282 return (error); 2283 } 2284 2285 static usb_error_t 2286 urtw_eprom_writebit(struct urtw_softc *sc, int16_t bit) 2287 { 2288 uint8_t data; 2289 usb_error_t error; 2290 2291 urtw_read8_m(sc, URTW_EPROM_CMD, &data); 2292 if (bit != 0) 2293 urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_WRITEBIT); 2294 else 2295 urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_WRITEBIT); 2296 DELAY(URTW_EPROM_DELAY); 2297 fail: 2298 return (error); 2299 } 2300 2301 static usb_error_t 2302 urtw_eprom_sendbits(struct urtw_softc *sc, int16_t *buf, int buflen) 2303 { 2304 int i = 0; 2305 usb_error_t error = 0; 2306 2307 for (i = 0; i < buflen; i++) { 2308 error = urtw_eprom_writebit(sc, buf[i]); 2309 if (error != 0) 2310 goto fail; 2311 error = urtw_eprom_ck(sc); 2312 if (error != 0) 2313 goto fail; 2314 } 2315 fail: 2316 return (error); 2317 } 2318 2319 2320 static usb_error_t 2321 urtw_get_txpwr(struct urtw_softc *sc) 2322 { 2323 int i, j; 2324 uint32_t data; 2325 usb_error_t error; 2326 2327 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW_BASE, &data); 2328 if (error != 0) 2329 goto fail; 2330 sc->sc_txpwr_cck_base = data & 0xf; 2331 sc->sc_txpwr_ofdm_base = (data >> 4) & 0xf; 2332 2333 for (i = 1, j = 0; i < 6; i += 2, j++) { 2334 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW0 + j, &data); 2335 if (error != 0) 2336 goto fail; 2337 sc->sc_txpwr_cck[i] = data & 0xf; 2338 sc->sc_txpwr_cck[i + 1] = (data & 0xf00) >> 8; 2339 sc->sc_txpwr_ofdm[i] = (data & 0xf0) >> 4; 2340 sc->sc_txpwr_ofdm[i + 1] = (data & 0xf000) >> 12; 2341 } 2342 for (i = 1, j = 0; i < 4; i += 2, j++) { 2343 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW1 + j, &data); 2344 if (error != 0) 2345 goto fail; 2346 sc->sc_txpwr_cck[i + 6] = data & 0xf; 2347 sc->sc_txpwr_cck[i + 6 + 1] = (data & 0xf00) >> 8; 2348 sc->sc_txpwr_ofdm[i + 6] = (data & 0xf0) >> 4; 2349 sc->sc_txpwr_ofdm[i + 6 + 1] = (data & 0xf000) >> 12; 2350 } 2351 if (sc->sc_flags & URTW_RTL8187B) { 2352 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW2, &data); 2353 if (error != 0) 2354 goto fail; 2355 sc->sc_txpwr_cck[1 + 6 + 4] = data & 0xf; 2356 sc->sc_txpwr_ofdm[1 + 6 + 4] = (data & 0xf0) >> 4; 2357 error = urtw_eprom_read32(sc, 0x0a, &data); 2358 if (error != 0) 2359 goto fail; 2360 sc->sc_txpwr_cck[2 + 6 + 4] = data & 0xf; 2361 sc->sc_txpwr_ofdm[2 + 6 + 4] = (data & 0xf0) >> 4; 2362 error = urtw_eprom_read32(sc, 0x1c, &data); 2363 if (error != 0) 2364 goto fail; 2365 sc->sc_txpwr_cck[3 + 6 + 4] = data & 0xf; 2366 sc->sc_txpwr_cck[3 + 6 + 4 + 1] = (data & 0xf00) >> 8; 2367 sc->sc_txpwr_ofdm[3 + 6 + 4] = (data & 0xf0) >> 4; 2368 sc->sc_txpwr_ofdm[3 + 6 + 4 + 1] = (data & 0xf000) >> 12; 2369 } else { 2370 for (i = 1, j = 0; i < 4; i += 2, j++) { 2371 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW2 + j, 2372 &data); 2373 if (error != 0) 2374 goto fail; 2375 sc->sc_txpwr_cck[i + 6 + 4] = data & 0xf; 2376 sc->sc_txpwr_cck[i + 6 + 4 + 1] = (data & 0xf00) >> 8; 2377 sc->sc_txpwr_ofdm[i + 6 + 4] = (data & 0xf0) >> 4; 2378 sc->sc_txpwr_ofdm[i + 6 + 4 + 1] = (data & 0xf000) >> 12; 2379 } 2380 } 2381 fail: 2382 return (error); 2383 } 2384 2385 2386 static usb_error_t 2387 urtw_get_rfchip(struct urtw_softc *sc) 2388 { 2389 int ret; 2390 uint8_t data8; 2391 uint32_t data; 2392 usb_error_t error; 2393 2394 if (sc->sc_flags & URTW_RTL8187B) { 2395 urtw_read8_m(sc, 0xe1, &data8); 2396 switch (data8) { 2397 case 0: 2398 sc->sc_flags |= URTW_RTL8187B_REV_B; 2399 break; 2400 case 1: 2401 sc->sc_flags |= URTW_RTL8187B_REV_D; 2402 break; 2403 case 2: 2404 sc->sc_flags |= URTW_RTL8187B_REV_E; 2405 break; 2406 default: 2407 device_printf(sc->sc_dev, "unknown type: %#x\n", data8); 2408 sc->sc_flags |= URTW_RTL8187B_REV_B; 2409 break; 2410 } 2411 } else { 2412 urtw_read32_m(sc, URTW_TX_CONF, &data); 2413 switch (data & URTW_TX_HWMASK) { 2414 case URTW_TX_R8187vD_B: 2415 sc->sc_flags |= URTW_RTL8187B; 2416 break; 2417 case URTW_TX_R8187vD: 2418 break; 2419 default: 2420 device_printf(sc->sc_dev, "unknown RTL8187L type: %#x\n", 2421 data & URTW_TX_HWMASK); 2422 break; 2423 } 2424 } 2425 2426 error = urtw_eprom_read32(sc, URTW_EPROM_RFCHIPID, &data); 2427 if (error != 0) 2428 goto fail; 2429 switch (data & 0xff) { 2430 case URTW_EPROM_RFCHIPID_RTL8225U: 2431 error = urtw_8225_isv2(sc, &ret); 2432 if (error != 0) 2433 goto fail; 2434 if (ret == 0) { 2435 sc->sc_rf_init = urtw_8225_rf_init; 2436 sc->sc_rf_set_sens = urtw_8225_rf_set_sens; 2437 sc->sc_rf_set_chan = urtw_8225_rf_set_chan; 2438 sc->sc_rf_stop = urtw_8225_rf_stop; 2439 } else { 2440 sc->sc_rf_init = urtw_8225v2_rf_init; 2441 sc->sc_rf_set_chan = urtw_8225v2_rf_set_chan; 2442 sc->sc_rf_stop = urtw_8225_rf_stop; 2443 } 2444 sc->sc_max_sens = URTW_8225_RF_MAX_SENS; 2445 sc->sc_sens = URTW_8225_RF_DEF_SENS; 2446 break; 2447 case URTW_EPROM_RFCHIPID_RTL8225Z2: 2448 sc->sc_rf_init = urtw_8225v2b_rf_init; 2449 sc->sc_rf_set_chan = urtw_8225v2b_rf_set_chan; 2450 sc->sc_max_sens = URTW_8225_RF_MAX_SENS; 2451 sc->sc_sens = URTW_8225_RF_DEF_SENS; 2452 sc->sc_rf_stop = urtw_8225_rf_stop; 2453 break; 2454 default: 2455 DPRINTF(sc, URTW_DEBUG_STATE, 2456 "unsupported RF chip %d\n", data & 0xff); 2457 error = USB_ERR_INVAL; 2458 goto fail; 2459 } 2460 2461 device_printf(sc->sc_dev, "%s rf %s hwrev %s\n", 2462 (sc->sc_flags & URTW_RTL8187B) ? "rtl8187b" : "rtl8187l", 2463 ((data & 0xff) == URTW_EPROM_RFCHIPID_RTL8225U) ? "rtl8225u" : 2464 "rtl8225z2", 2465 (sc->sc_flags & URTW_RTL8187B) ? ((data8 == 0) ? "b" : 2466 (data8 == 1) ? "d" : "e") : "none"); 2467 2468 fail: 2469 return (error); 2470 } 2471 2472 2473 static usb_error_t 2474 urtw_led_init(struct urtw_softc *sc) 2475 { 2476 uint32_t rev; 2477 usb_error_t error; 2478 2479 urtw_read8_m(sc, URTW_PSR, &sc->sc_psr); 2480 error = urtw_eprom_read32(sc, URTW_EPROM_SWREV, &rev); 2481 if (error != 0) 2482 goto fail; 2483 2484 switch (rev & URTW_EPROM_CID_MASK) { 2485 case URTW_EPROM_CID_ALPHA0: 2486 sc->sc_strategy = URTW_SW_LED_MODE1; 2487 break; 2488 case URTW_EPROM_CID_SERCOMM_PS: 2489 sc->sc_strategy = URTW_SW_LED_MODE3; 2490 break; 2491 case URTW_EPROM_CID_HW_LED: 2492 sc->sc_strategy = URTW_HW_LED; 2493 break; 2494 case URTW_EPROM_CID_RSVD0: 2495 case URTW_EPROM_CID_RSVD1: 2496 default: 2497 sc->sc_strategy = URTW_SW_LED_MODE0; 2498 break; 2499 } 2500 2501 sc->sc_gpio_ledpin = URTW_LED_PIN_GPIO0; 2502 2503 fail: 2504 return (error); 2505 } 2506 2507 2508 static usb_error_t 2509 urtw_8225_rf_init(struct urtw_softc *sc) 2510 { 2511 #define N(a) ((int)(sizeof(a) / sizeof((a)[0]))) 2512 int i; 2513 uint16_t data; 2514 usb_error_t error; 2515 2516 error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON); 2517 if (error) 2518 goto fail; 2519 2520 error = urtw_8225_usb_init(sc); 2521 if (error) 2522 goto fail; 2523 2524 urtw_write32_m(sc, URTW_RF_TIMING, 0x000a8008); 2525 urtw_read16_m(sc, URTW_BRSR, &data); /* XXX ??? */ 2526 urtw_write16_m(sc, URTW_BRSR, 0xffff); 2527 urtw_write32_m(sc, URTW_RF_PARA, 0x100044); 2528 2529 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 2530 if (error) 2531 goto fail; 2532 urtw_write8_m(sc, URTW_CONFIG3, 0x44); 2533 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 2534 if (error) 2535 goto fail; 2536 2537 error = urtw_8185_rf_pins_enable(sc); 2538 if (error) 2539 goto fail; 2540 usb_pause_mtx(&sc->sc_mtx, 1000); 2541 2542 for (i = 0; i < N(urtw_8225_rf_part1); i++) { 2543 urtw_8225_write(sc, urtw_8225_rf_part1[i].reg, 2544 urtw_8225_rf_part1[i].val); 2545 usb_pause_mtx(&sc->sc_mtx, 1); 2546 } 2547 usb_pause_mtx(&sc->sc_mtx, 100); 2548 urtw_8225_write(sc, 2549 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC1); 2550 usb_pause_mtx(&sc->sc_mtx, 200); 2551 urtw_8225_write(sc, 2552 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC2); 2553 usb_pause_mtx(&sc->sc_mtx, 200); 2554 urtw_8225_write(sc, 2555 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC3); 2556 2557 for (i = 0; i < 95; i++) { 2558 urtw_8225_write(sc, URTW_8225_ADDR_1_MAGIC, (uint8_t)(i + 1)); 2559 urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, urtw_8225_rxgain[i]); 2560 } 2561 2562 urtw_8225_write(sc, 2563 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC4); 2564 urtw_8225_write(sc, 2565 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC5); 2566 2567 for (i = 0; i < 128; i++) { 2568 urtw_8187_write_phy_ofdm(sc, 0xb, urtw_8225_agc[i]); 2569 usb_pause_mtx(&sc->sc_mtx, 1); 2570 urtw_8187_write_phy_ofdm(sc, 0xa, (uint8_t)i + 0x80); 2571 usb_pause_mtx(&sc->sc_mtx, 1); 2572 } 2573 2574 for (i = 0; i < N(urtw_8225_rf_part2); i++) { 2575 urtw_8187_write_phy_ofdm(sc, urtw_8225_rf_part2[i].reg, 2576 urtw_8225_rf_part2[i].val); 2577 usb_pause_mtx(&sc->sc_mtx, 1); 2578 } 2579 2580 error = urtw_8225_setgain(sc, 4); 2581 if (error) 2582 goto fail; 2583 2584 for (i = 0; i < N(urtw_8225_rf_part3); i++) { 2585 urtw_8187_write_phy_cck(sc, urtw_8225_rf_part3[i].reg, 2586 urtw_8225_rf_part3[i].val); 2587 usb_pause_mtx(&sc->sc_mtx, 1); 2588 } 2589 2590 urtw_write8_m(sc, URTW_TESTR, 0x0d); 2591 2592 error = urtw_8225_set_txpwrlvl(sc, 1); 2593 if (error) 2594 goto fail; 2595 2596 urtw_8187_write_phy_cck(sc, 0x10, 0x9b); 2597 usb_pause_mtx(&sc->sc_mtx, 1); 2598 urtw_8187_write_phy_ofdm(sc, 0x26, 0x90); 2599 usb_pause_mtx(&sc->sc_mtx, 1); 2600 2601 /* TX ant A, 0x0 for B */ 2602 error = urtw_8185_tx_antenna(sc, 0x3); 2603 if (error) 2604 goto fail; 2605 urtw_write32_m(sc, URTW_HSSI_PARA, 0x3dc00002); 2606 2607 error = urtw_8225_rf_set_chan(sc, 1); 2608 fail: 2609 return (error); 2610 #undef N 2611 } 2612 2613 static usb_error_t 2614 urtw_8185_rf_pins_enable(struct urtw_softc *sc) 2615 { 2616 usb_error_t error = 0; 2617 2618 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x1ff7); 2619 fail: 2620 return (error); 2621 } 2622 2623 static usb_error_t 2624 urtw_8185_tx_antenna(struct urtw_softc *sc, uint8_t ant) 2625 { 2626 usb_error_t error; 2627 2628 urtw_write8_m(sc, URTW_TX_ANTENNA, ant); 2629 usb_pause_mtx(&sc->sc_mtx, 1); 2630 fail: 2631 return (error); 2632 } 2633 2634 static usb_error_t 2635 urtw_8187_write_phy_ofdm_c(struct urtw_softc *sc, uint8_t addr, uint32_t data) 2636 { 2637 2638 data = data & 0xff; 2639 return urtw_8187_write_phy(sc, addr, data); 2640 } 2641 2642 static usb_error_t 2643 urtw_8187_write_phy_cck_c(struct urtw_softc *sc, uint8_t addr, uint32_t data) 2644 { 2645 2646 data = data & 0xff; 2647 return urtw_8187_write_phy(sc, addr, data | 0x10000); 2648 } 2649 2650 static usb_error_t 2651 urtw_8187_write_phy(struct urtw_softc *sc, uint8_t addr, uint32_t data) 2652 { 2653 uint32_t phyw; 2654 usb_error_t error; 2655 2656 phyw = ((data << 8) | (addr | 0x80)); 2657 urtw_write8_m(sc, URTW_PHY_MAGIC4, ((phyw & 0xff000000) >> 24)); 2658 urtw_write8_m(sc, URTW_PHY_MAGIC3, ((phyw & 0x00ff0000) >> 16)); 2659 urtw_write8_m(sc, URTW_PHY_MAGIC2, ((phyw & 0x0000ff00) >> 8)); 2660 urtw_write8_m(sc, URTW_PHY_MAGIC1, ((phyw & 0x000000ff))); 2661 usb_pause_mtx(&sc->sc_mtx, 1); 2662 fail: 2663 return (error); 2664 } 2665 2666 static usb_error_t 2667 urtw_8225_setgain(struct urtw_softc *sc, int16_t gain) 2668 { 2669 usb_error_t error; 2670 2671 urtw_8187_write_phy_ofdm(sc, 0x0d, urtw_8225_gain[gain * 4]); 2672 urtw_8187_write_phy_ofdm(sc, 0x1b, urtw_8225_gain[gain * 4 + 2]); 2673 urtw_8187_write_phy_ofdm(sc, 0x1d, urtw_8225_gain[gain * 4 + 3]); 2674 urtw_8187_write_phy_ofdm(sc, 0x23, urtw_8225_gain[gain * 4 + 1]); 2675 fail: 2676 return (error); 2677 } 2678 2679 static usb_error_t 2680 urtw_8225_usb_init(struct urtw_softc *sc) 2681 { 2682 uint8_t data; 2683 usb_error_t error; 2684 2685 urtw_write8_m(sc, URTW_RF_PINS_SELECT + 1, 0); 2686 urtw_write8_m(sc, URTW_GPIO, 0); 2687 error = urtw_read8e(sc, 0x53, &data); 2688 if (error) 2689 goto fail; 2690 error = urtw_write8e(sc, 0x53, data | (1 << 7)); 2691 if (error) 2692 goto fail; 2693 urtw_write8_m(sc, URTW_RF_PINS_SELECT + 1, 4); 2694 urtw_write8_m(sc, URTW_GPIO, 0x20); 2695 urtw_write8_m(sc, URTW_GP_ENABLE, 0); 2696 2697 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x80); 2698 urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x80); 2699 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x80); 2700 2701 usb_pause_mtx(&sc->sc_mtx, 500); 2702 fail: 2703 return (error); 2704 } 2705 2706 static usb_error_t 2707 urtw_8225_write_c(struct urtw_softc *sc, uint8_t addr, uint16_t data) 2708 { 2709 uint16_t d80, d82, d84; 2710 usb_error_t error; 2711 2712 urtw_read16_m(sc, URTW_RF_PINS_OUTPUT, &d80); 2713 d80 &= URTW_RF_PINS_MAGIC1; 2714 urtw_read16_m(sc, URTW_RF_PINS_ENABLE, &d82); 2715 urtw_read16_m(sc, URTW_RF_PINS_SELECT, &d84); 2716 d84 &= URTW_RF_PINS_MAGIC2; 2717 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, d82 | URTW_RF_PINS_MAGIC3); 2718 urtw_write16_m(sc, URTW_RF_PINS_SELECT, d84 | URTW_RF_PINS_MAGIC3); 2719 DELAY(10); 2720 2721 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN); 2722 DELAY(2); 2723 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80); 2724 DELAY(10); 2725 2726 error = urtw_8225_write_s16(sc, addr, 0x8225, &data); 2727 if (error != 0) 2728 goto fail; 2729 2730 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN); 2731 DELAY(10); 2732 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN); 2733 urtw_write16_m(sc, URTW_RF_PINS_SELECT, d84); 2734 usb_pause_mtx(&sc->sc_mtx, 2); 2735 fail: 2736 return (error); 2737 } 2738 2739 static usb_error_t 2740 urtw_8225_write_s16(struct urtw_softc *sc, uint8_t addr, int index, 2741 uint16_t *data) 2742 { 2743 uint8_t buf[2]; 2744 uint16_t data16; 2745 struct usb_device_request req; 2746 usb_error_t error = 0; 2747 2748 data16 = *data; 2749 2750 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 2751 req.bRequest = URTW_8187_SETREGS_REQ; 2752 USETW(req.wValue, addr); 2753 USETW(req.wIndex, index); 2754 USETW(req.wLength, sizeof(uint16_t)); 2755 buf[0] = (data16 & 0x00ff); 2756 buf[1] = (data16 & 0xff00) >> 8; 2757 2758 error = urtw_do_request(sc, &req, buf); 2759 2760 return (error); 2761 } 2762 2763 static usb_error_t 2764 urtw_8225_rf_set_chan(struct urtw_softc *sc, int chan) 2765 { 2766 usb_error_t error; 2767 2768 error = urtw_8225_set_txpwrlvl(sc, chan); 2769 if (error) 2770 goto fail; 2771 urtw_8225_write(sc, URTW_8225_ADDR_7_MAGIC, urtw_8225_channel[chan]); 2772 usb_pause_mtx(&sc->sc_mtx, 10); 2773 fail: 2774 return (error); 2775 } 2776 2777 static usb_error_t 2778 urtw_8225_rf_set_sens(struct urtw_softc *sc, int sens) 2779 { 2780 usb_error_t error; 2781 2782 if (sens < 0 || sens > 6) 2783 return -1; 2784 2785 if (sens > 4) 2786 urtw_8225_write(sc, 2787 URTW_8225_ADDR_C_MAGIC, URTW_8225_ADDR_C_DATA_MAGIC1); 2788 else 2789 urtw_8225_write(sc, 2790 URTW_8225_ADDR_C_MAGIC, URTW_8225_ADDR_C_DATA_MAGIC2); 2791 2792 sens = 6 - sens; 2793 error = urtw_8225_setgain(sc, sens); 2794 if (error) 2795 goto fail; 2796 2797 urtw_8187_write_phy_cck(sc, 0x41, urtw_8225_threshold[sens]); 2798 2799 fail: 2800 return (error); 2801 } 2802 2803 static usb_error_t 2804 urtw_8225_set_txpwrlvl(struct urtw_softc *sc, int chan) 2805 { 2806 int i, idx, set; 2807 uint8_t *cck_pwltable; 2808 uint8_t cck_pwrlvl_max, ofdm_pwrlvl_min, ofdm_pwrlvl_max; 2809 uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff; 2810 uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff; 2811 usb_error_t error; 2812 2813 cck_pwrlvl_max = 11; 2814 ofdm_pwrlvl_max = 25; /* 12 -> 25 */ 2815 ofdm_pwrlvl_min = 10; 2816 2817 /* CCK power setting */ 2818 cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ? cck_pwrlvl_max : cck_pwrlvl; 2819 idx = cck_pwrlvl % 6; 2820 set = cck_pwrlvl / 6; 2821 cck_pwltable = (chan == 14) ? urtw_8225_txpwr_cck_ch14 : 2822 urtw_8225_txpwr_cck; 2823 2824 urtw_write8_m(sc, URTW_TX_GAIN_CCK, 2825 urtw_8225_tx_gain_cck_ofdm[set] >> 1); 2826 for (i = 0; i < 8; i++) { 2827 urtw_8187_write_phy_cck(sc, 0x44 + i, 2828 cck_pwltable[idx * 8 + i]); 2829 } 2830 usb_pause_mtx(&sc->sc_mtx, 1); 2831 2832 /* OFDM power setting */ 2833 ofdm_pwrlvl = (ofdm_pwrlvl > (ofdm_pwrlvl_max - ofdm_pwrlvl_min)) ? 2834 ofdm_pwrlvl_max : ofdm_pwrlvl + ofdm_pwrlvl_min; 2835 ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl; 2836 2837 idx = ofdm_pwrlvl % 6; 2838 set = ofdm_pwrlvl / 6; 2839 2840 error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON); 2841 if (error) 2842 goto fail; 2843 urtw_8187_write_phy_ofdm(sc, 2, 0x42); 2844 urtw_8187_write_phy_ofdm(sc, 6, 0); 2845 urtw_8187_write_phy_ofdm(sc, 8, 0); 2846 2847 urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 2848 urtw_8225_tx_gain_cck_ofdm[set] >> 1); 2849 urtw_8187_write_phy_ofdm(sc, 0x5, urtw_8225_txpwr_ofdm[idx]); 2850 urtw_8187_write_phy_ofdm(sc, 0x7, urtw_8225_txpwr_ofdm[idx]); 2851 usb_pause_mtx(&sc->sc_mtx, 1); 2852 fail: 2853 return (error); 2854 } 2855 2856 2857 static usb_error_t 2858 urtw_8225_rf_stop(struct urtw_softc *sc) 2859 { 2860 uint8_t data; 2861 usb_error_t error; 2862 2863 urtw_8225_write(sc, 0x4, 0x1f); 2864 2865 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 2866 if (error) 2867 goto fail; 2868 2869 urtw_read8_m(sc, URTW_CONFIG3, &data); 2870 urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE); 2871 if (sc->sc_flags & URTW_RTL8187B) { 2872 urtw_write32_m(sc, URTW_ANAPARAM2, 2873 URTW_8187B_8225_ANAPARAM2_OFF); 2874 urtw_write32_m(sc, URTW_ANAPARAM, URTW_8187B_8225_ANAPARAM_OFF); 2875 urtw_write32_m(sc, URTW_ANAPARAM3, 2876 URTW_8187B_8225_ANAPARAM3_OFF); 2877 } else { 2878 urtw_write32_m(sc, URTW_ANAPARAM2, URTW_8225_ANAPARAM2_OFF); 2879 urtw_write32_m(sc, URTW_ANAPARAM, URTW_8225_ANAPARAM_OFF); 2880 } 2881 2882 urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE); 2883 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 2884 if (error) 2885 goto fail; 2886 2887 fail: 2888 return (error); 2889 } 2890 2891 static usb_error_t 2892 urtw_8225v2_rf_init(struct urtw_softc *sc) 2893 { 2894 #define N(a) ((int)(sizeof(a) / sizeof((a)[0]))) 2895 int i; 2896 uint16_t data; 2897 uint32_t data32; 2898 usb_error_t error; 2899 2900 error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON); 2901 if (error) 2902 goto fail; 2903 2904 error = urtw_8225_usb_init(sc); 2905 if (error) 2906 goto fail; 2907 2908 urtw_write32_m(sc, URTW_RF_TIMING, 0x000a8008); 2909 urtw_read16_m(sc, URTW_BRSR, &data); /* XXX ??? */ 2910 urtw_write16_m(sc, URTW_BRSR, 0xffff); 2911 urtw_write32_m(sc, URTW_RF_PARA, 0x100044); 2912 2913 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 2914 if (error) 2915 goto fail; 2916 urtw_write8_m(sc, URTW_CONFIG3, 0x44); 2917 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 2918 if (error) 2919 goto fail; 2920 2921 error = urtw_8185_rf_pins_enable(sc); 2922 if (error) 2923 goto fail; 2924 2925 usb_pause_mtx(&sc->sc_mtx, 500); 2926 2927 for (i = 0; i < N(urtw_8225v2_rf_part1); i++) { 2928 urtw_8225_write(sc, urtw_8225v2_rf_part1[i].reg, 2929 urtw_8225v2_rf_part1[i].val); 2930 } 2931 usb_pause_mtx(&sc->sc_mtx, 50); 2932 2933 urtw_8225_write(sc, 2934 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC1); 2935 2936 for (i = 0; i < 95; i++) { 2937 urtw_8225_write(sc, URTW_8225_ADDR_1_MAGIC, (uint8_t)(i + 1)); 2938 urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 2939 urtw_8225v2_rxgain[i]); 2940 } 2941 2942 urtw_8225_write(sc, 2943 URTW_8225_ADDR_3_MAGIC, URTW_8225_ADDR_3_DATA_MAGIC1); 2944 urtw_8225_write(sc, 2945 URTW_8225_ADDR_5_MAGIC, URTW_8225_ADDR_5_DATA_MAGIC1); 2946 urtw_8225_write(sc, 2947 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC2); 2948 urtw_8225_write(sc, 2949 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC1); 2950 usb_pause_mtx(&sc->sc_mtx, 100); 2951 urtw_8225_write(sc, 2952 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC2); 2953 usb_pause_mtx(&sc->sc_mtx, 100); 2954 2955 error = urtw_8225_read(sc, URTW_8225_ADDR_6_MAGIC, &data32); 2956 if (error != 0) 2957 goto fail; 2958 if (data32 != URTW_8225_ADDR_6_DATA_MAGIC1) 2959 device_printf(sc->sc_dev, "expect 0xe6!! (0x%x)\n", data32); 2960 if (!(data32 & URTW_8225_ADDR_6_DATA_MAGIC2)) { 2961 urtw_8225_write(sc, 2962 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC1); 2963 usb_pause_mtx(&sc->sc_mtx, 100); 2964 urtw_8225_write(sc, 2965 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC2); 2966 usb_pause_mtx(&sc->sc_mtx, 50); 2967 error = urtw_8225_read(sc, URTW_8225_ADDR_6_MAGIC, &data32); 2968 if (error != 0) 2969 goto fail; 2970 if (!(data32 & URTW_8225_ADDR_6_DATA_MAGIC2)) 2971 device_printf(sc->sc_dev, "RF calibration failed\n"); 2972 } 2973 usb_pause_mtx(&sc->sc_mtx, 100); 2974 2975 urtw_8225_write(sc, 2976 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC6); 2977 for (i = 0; i < 128; i++) { 2978 urtw_8187_write_phy_ofdm(sc, 0xb, urtw_8225_agc[i]); 2979 urtw_8187_write_phy_ofdm(sc, 0xa, (uint8_t)i + 0x80); 2980 } 2981 2982 for (i = 0; i < N(urtw_8225v2_rf_part2); i++) { 2983 urtw_8187_write_phy_ofdm(sc, urtw_8225v2_rf_part2[i].reg, 2984 urtw_8225v2_rf_part2[i].val); 2985 } 2986 2987 error = urtw_8225v2_setgain(sc, 4); 2988 if (error) 2989 goto fail; 2990 2991 for (i = 0; i < N(urtw_8225v2_rf_part3); i++) { 2992 urtw_8187_write_phy_cck(sc, urtw_8225v2_rf_part3[i].reg, 2993 urtw_8225v2_rf_part3[i].val); 2994 } 2995 2996 urtw_write8_m(sc, URTW_TESTR, 0x0d); 2997 2998 error = urtw_8225v2_set_txpwrlvl(sc, 1); 2999 if (error) 3000 goto fail; 3001 3002 urtw_8187_write_phy_cck(sc, 0x10, 0x9b); 3003 urtw_8187_write_phy_ofdm(sc, 0x26, 0x90); 3004 3005 /* TX ant A, 0x0 for B */ 3006 error = urtw_8185_tx_antenna(sc, 0x3); 3007 if (error) 3008 goto fail; 3009 urtw_write32_m(sc, URTW_HSSI_PARA, 0x3dc00002); 3010 3011 error = urtw_8225_rf_set_chan(sc, 1); 3012 fail: 3013 return (error); 3014 #undef N 3015 } 3016 3017 static usb_error_t 3018 urtw_8225v2_rf_set_chan(struct urtw_softc *sc, int chan) 3019 { 3020 usb_error_t error; 3021 3022 error = urtw_8225v2_set_txpwrlvl(sc, chan); 3023 if (error) 3024 goto fail; 3025 3026 urtw_8225_write(sc, URTW_8225_ADDR_7_MAGIC, urtw_8225_channel[chan]); 3027 usb_pause_mtx(&sc->sc_mtx, 10); 3028 fail: 3029 return (error); 3030 } 3031 3032 static usb_error_t 3033 urtw_8225_read(struct urtw_softc *sc, uint8_t addr, uint32_t *data) 3034 { 3035 int i; 3036 int16_t bit; 3037 uint8_t rlen = 12, wlen = 6; 3038 uint16_t o1, o2, o3, tmp; 3039 uint32_t d2w = ((uint32_t)(addr & 0x1f)) << 27; 3040 uint32_t mask = 0x80000000, value = 0; 3041 usb_error_t error; 3042 3043 urtw_read16_m(sc, URTW_RF_PINS_OUTPUT, &o1); 3044 urtw_read16_m(sc, URTW_RF_PINS_ENABLE, &o2); 3045 urtw_read16_m(sc, URTW_RF_PINS_SELECT, &o3); 3046 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, o2 | URTW_RF_PINS_MAGIC4); 3047 urtw_write16_m(sc, URTW_RF_PINS_SELECT, o3 | URTW_RF_PINS_MAGIC4); 3048 o1 &= ~URTW_RF_PINS_MAGIC4; 3049 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_EN); 3050 DELAY(5); 3051 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1); 3052 DELAY(5); 3053 3054 for (i = 0; i < (wlen / 2); i++, mask = mask >> 1) { 3055 bit = ((d2w & mask) != 0) ? 1 : 0; 3056 3057 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1); 3058 DELAY(2); 3059 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | 3060 URTW_BB_HOST_BANG_CLK); 3061 DELAY(2); 3062 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | 3063 URTW_BB_HOST_BANG_CLK); 3064 DELAY(2); 3065 mask = mask >> 1; 3066 if (i == 2) 3067 break; 3068 bit = ((d2w & mask) != 0) ? 1 : 0; 3069 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | 3070 URTW_BB_HOST_BANG_CLK); 3071 DELAY(2); 3072 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | 3073 URTW_BB_HOST_BANG_CLK); 3074 DELAY(2); 3075 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1); 3076 DELAY(1); 3077 } 3078 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | URTW_BB_HOST_BANG_RW | 3079 URTW_BB_HOST_BANG_CLK); 3080 DELAY(2); 3081 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | URTW_BB_HOST_BANG_RW); 3082 DELAY(2); 3083 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_RW); 3084 DELAY(2); 3085 3086 mask = 0x800; 3087 for (i = 0; i < rlen; i++, mask = mask >> 1) { 3088 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 3089 o1 | URTW_BB_HOST_BANG_RW); 3090 DELAY(2); 3091 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 3092 o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK); 3093 DELAY(2); 3094 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 3095 o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK); 3096 DELAY(2); 3097 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 3098 o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK); 3099 DELAY(2); 3100 3101 urtw_read16_m(sc, URTW_RF_PINS_INPUT, &tmp); 3102 value |= ((tmp & URTW_BB_HOST_BANG_CLK) ? mask : 0); 3103 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 3104 o1 | URTW_BB_HOST_BANG_RW); 3105 DELAY(2); 3106 } 3107 3108 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_EN | 3109 URTW_BB_HOST_BANG_RW); 3110 DELAY(2); 3111 3112 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, o2); 3113 urtw_write16_m(sc, URTW_RF_PINS_SELECT, o3); 3114 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, URTW_RF_PINS_OUTPUT_MAGIC1); 3115 3116 if (data != NULL) 3117 *data = value; 3118 fail: 3119 return (error); 3120 } 3121 3122 3123 static usb_error_t 3124 urtw_8225v2_set_txpwrlvl(struct urtw_softc *sc, int chan) 3125 { 3126 int i; 3127 uint8_t *cck_pwrtable; 3128 uint8_t cck_pwrlvl_max = 15, ofdm_pwrlvl_max = 25, ofdm_pwrlvl_min = 10; 3129 uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff; 3130 uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff; 3131 usb_error_t error; 3132 3133 /* CCK power setting */ 3134 cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ? cck_pwrlvl_max : cck_pwrlvl; 3135 cck_pwrlvl += sc->sc_txpwr_cck_base; 3136 cck_pwrlvl = (cck_pwrlvl > 35) ? 35 : cck_pwrlvl; 3137 cck_pwrtable = (chan == 14) ? urtw_8225v2_txpwr_cck_ch14 : 3138 urtw_8225v2_txpwr_cck; 3139 3140 for (i = 0; i < 8; i++) 3141 urtw_8187_write_phy_cck(sc, 0x44 + i, cck_pwrtable[i]); 3142 3143 urtw_write8_m(sc, URTW_TX_GAIN_CCK, 3144 urtw_8225v2_tx_gain_cck_ofdm[cck_pwrlvl]); 3145 usb_pause_mtx(&sc->sc_mtx, 1); 3146 3147 /* OFDM power setting */ 3148 ofdm_pwrlvl = (ofdm_pwrlvl > (ofdm_pwrlvl_max - ofdm_pwrlvl_min)) ? 3149 ofdm_pwrlvl_max : ofdm_pwrlvl + ofdm_pwrlvl_min; 3150 ofdm_pwrlvl += sc->sc_txpwr_ofdm_base; 3151 ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl; 3152 3153 error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON); 3154 if (error) 3155 goto fail; 3156 3157 urtw_8187_write_phy_ofdm(sc, 2, 0x42); 3158 urtw_8187_write_phy_ofdm(sc, 5, 0x0); 3159 urtw_8187_write_phy_ofdm(sc, 6, 0x40); 3160 urtw_8187_write_phy_ofdm(sc, 7, 0x0); 3161 urtw_8187_write_phy_ofdm(sc, 8, 0x40); 3162 3163 urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 3164 urtw_8225v2_tx_gain_cck_ofdm[ofdm_pwrlvl]); 3165 usb_pause_mtx(&sc->sc_mtx, 1); 3166 fail: 3167 return (error); 3168 } 3169 3170 static usb_error_t 3171 urtw_8225v2_setgain(struct urtw_softc *sc, int16_t gain) 3172 { 3173 uint8_t *gainp; 3174 usb_error_t error; 3175 3176 /* XXX for A? */ 3177 gainp = urtw_8225v2_gain_bg; 3178 urtw_8187_write_phy_ofdm(sc, 0x0d, gainp[gain * 3]); 3179 usb_pause_mtx(&sc->sc_mtx, 1); 3180 urtw_8187_write_phy_ofdm(sc, 0x1b, gainp[gain * 3 + 1]); 3181 usb_pause_mtx(&sc->sc_mtx, 1); 3182 urtw_8187_write_phy_ofdm(sc, 0x1d, gainp[gain * 3 + 2]); 3183 usb_pause_mtx(&sc->sc_mtx, 1); 3184 urtw_8187_write_phy_ofdm(sc, 0x21, 0x17); 3185 usb_pause_mtx(&sc->sc_mtx, 1); 3186 fail: 3187 return (error); 3188 } 3189 3190 static usb_error_t 3191 urtw_8225_isv2(struct urtw_softc *sc, int *ret) 3192 { 3193 uint32_t data; 3194 usb_error_t error; 3195 3196 *ret = 1; 3197 3198 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, URTW_RF_PINS_MAGIC5); 3199 urtw_write16_m(sc, URTW_RF_PINS_SELECT, URTW_RF_PINS_MAGIC5); 3200 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, URTW_RF_PINS_MAGIC5); 3201 usb_pause_mtx(&sc->sc_mtx, 500); 3202 3203 urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 3204 URTW_8225_ADDR_0_DATA_MAGIC1); 3205 3206 error = urtw_8225_read(sc, URTW_8225_ADDR_8_MAGIC, &data); 3207 if (error != 0) 3208 goto fail; 3209 if (data != URTW_8225_ADDR_8_DATA_MAGIC1) 3210 *ret = 0; 3211 else { 3212 error = urtw_8225_read(sc, URTW_8225_ADDR_9_MAGIC, &data); 3213 if (error != 0) 3214 goto fail; 3215 if (data != URTW_8225_ADDR_9_DATA_MAGIC1) 3216 *ret = 0; 3217 } 3218 3219 urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 3220 URTW_8225_ADDR_0_DATA_MAGIC2); 3221 fail: 3222 return (error); 3223 } 3224 3225 static usb_error_t 3226 urtw_8225v2b_rf_init(struct urtw_softc *sc) 3227 { 3228 #define N(a) ((int)(sizeof(a) / sizeof((a)[0]))) 3229 int i; 3230 uint8_t data8; 3231 usb_error_t error; 3232 3233 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 3234 if (error) 3235 goto fail; 3236 3237 /* 3238 * initialize extra registers on 8187 3239 */ 3240 urtw_write16_m(sc, URTW_BRSR_8187B, 0xfff); 3241 3242 /* retry limit */ 3243 urtw_read8_m(sc, URTW_CW_CONF, &data8); 3244 data8 |= URTW_CW_CONF_PERPACKET_RETRY; 3245 urtw_write8_m(sc, URTW_CW_CONF, data8); 3246 3247 /* TX AGC */ 3248 urtw_read8_m(sc, URTW_TX_AGC_CTL, &data8); 3249 data8 |= URTW_TX_AGC_CTL_PERPACKET_GAIN; 3250 urtw_write8_m(sc, URTW_TX_AGC_CTL, data8); 3251 3252 /* Auto Rate Fallback Control */ 3253 #define URTW_ARFR 0x1e0 3254 urtw_write16_m(sc, URTW_ARFR, 0xfff); 3255 urtw_read8_m(sc, URTW_RATE_FALLBACK, &data8); 3256 urtw_write8_m(sc, URTW_RATE_FALLBACK, 3257 data8 | URTW_RATE_FALLBACK_ENABLE); 3258 3259 urtw_read8_m(sc, URTW_MSR, &data8); 3260 urtw_write8_m(sc, URTW_MSR, data8 & 0xf3); 3261 urtw_read8_m(sc, URTW_MSR, &data8); 3262 urtw_write8_m(sc, URTW_MSR, data8 | URTW_MSR_LINK_ENEDCA); 3263 urtw_write8_m(sc, URTW_ACM_CONTROL, sc->sc_acmctl); 3264 3265 urtw_write16_m(sc, URTW_ATIM_WND, 2); 3266 urtw_write16_m(sc, URTW_BEACON_INTERVAL, 100); 3267 #define URTW_FEMR_FOR_8187B 0x1d4 3268 urtw_write16_m(sc, URTW_FEMR_FOR_8187B, 0xffff); 3269 3270 /* led type */ 3271 urtw_read8_m(sc, URTW_CONFIG1, &data8); 3272 data8 = (data8 & 0x3f) | 0x80; 3273 urtw_write8_m(sc, URTW_CONFIG1, data8); 3274 3275 /* applying MAC address again. */ 3276 urtw_write32_m(sc, URTW_MAC0, ((uint32_t *)sc->sc_bssid)[0]); 3277 urtw_write16_m(sc, URTW_MAC4, ((uint32_t *)sc->sc_bssid)[1] & 0xffff); 3278 3279 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 3280 if (error) 3281 goto fail; 3282 3283 urtw_write8_m(sc, URTW_WPA_CONFIG, 0); 3284 3285 /* 3286 * MAC configuration 3287 */ 3288 for (i = 0; i < N(urtw_8225v2b_rf_part1); i++) 3289 urtw_write8_m(sc, urtw_8225v2b_rf_part1[i].reg, 3290 urtw_8225v2b_rf_part1[i].val); 3291 urtw_write16_m(sc, URTW_TID_AC_MAP, 0xfa50); 3292 urtw_write16_m(sc, URTW_INT_MIG, 0x0000); 3293 urtw_write32_m(sc, 0x1f0, 0); 3294 urtw_write32_m(sc, 0x1f4, 0); 3295 urtw_write8_m(sc, 0x1f8, 0); 3296 urtw_write32_m(sc, URTW_RF_TIMING, 0x4001); 3297 3298 #define URTW_RFSW_CTRL 0x272 3299 urtw_write16_m(sc, URTW_RFSW_CTRL, 0x569a); 3300 3301 /* 3302 * initialize PHY 3303 */ 3304 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 3305 if (error) 3306 goto fail; 3307 urtw_read8_m(sc, URTW_CONFIG3, &data8); 3308 urtw_write8_m(sc, URTW_CONFIG3, 3309 data8 | URTW_CONFIG3_ANAPARAM_WRITE); 3310 3311 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 3312 if (error) 3313 goto fail; 3314 3315 /* setup RFE initial timing */ 3316 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x0480); 3317 urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x2488); 3318 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x1fff); 3319 usb_pause_mtx(&sc->sc_mtx, 1100); 3320 3321 for (i = 0; i < N(urtw_8225v2b_rf_part0); i++) { 3322 urtw_8225_write(sc, urtw_8225v2b_rf_part0[i].reg, 3323 urtw_8225v2b_rf_part0[i].val); 3324 usb_pause_mtx(&sc->sc_mtx, 1); 3325 } 3326 urtw_8225_write(sc, 0x00, 0x01b7); 3327 3328 for (i = 0; i < 95; i++) { 3329 urtw_8225_write(sc, URTW_8225_ADDR_1_MAGIC, (uint8_t)(i + 1)); 3330 usb_pause_mtx(&sc->sc_mtx, 1); 3331 urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 3332 urtw_8225v2b_rxgain[i]); 3333 usb_pause_mtx(&sc->sc_mtx, 1); 3334 } 3335 3336 urtw_8225_write(sc, URTW_8225_ADDR_3_MAGIC, 0x080); 3337 usb_pause_mtx(&sc->sc_mtx, 1); 3338 urtw_8225_write(sc, URTW_8225_ADDR_5_MAGIC, 0x004); 3339 usb_pause_mtx(&sc->sc_mtx, 1); 3340 urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 0x0b7); 3341 usb_pause_mtx(&sc->sc_mtx, 1); 3342 usb_pause_mtx(&sc->sc_mtx, 3000); 3343 urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 0xc4d); 3344 usb_pause_mtx(&sc->sc_mtx, 2000); 3345 urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 0x44d); 3346 usb_pause_mtx(&sc->sc_mtx, 1); 3347 urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 0x2bf); 3348 usb_pause_mtx(&sc->sc_mtx, 1); 3349 3350 urtw_write8_m(sc, URTW_TX_GAIN_CCK, 0x03); 3351 urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 0x07); 3352 urtw_write8_m(sc, URTW_TX_ANTENNA, 0x03); 3353 3354 urtw_8187_write_phy_ofdm(sc, 0x80, 0x12); 3355 for (i = 0; i < 128; i++) { 3356 uint32_t addr, data; 3357 3358 data = (urtw_8225z2_agc[i] << 8) | 0x0000008f; 3359 addr = ((i + 0x80) << 8) | 0x0000008e; 3360 3361 urtw_8187_write_phy_ofdm(sc, data & 0x7f, (data >> 8) & 0xff); 3362 urtw_8187_write_phy_ofdm(sc, addr & 0x7f, (addr >> 8) & 0xff); 3363 urtw_8187_write_phy_ofdm(sc, 0x0e, 0x00); 3364 } 3365 urtw_8187_write_phy_ofdm(sc, 0x80, 0x10); 3366 3367 for (i = 0; i < N(urtw_8225v2b_rf_part2); i++) 3368 urtw_8187_write_phy_ofdm(sc, i, urtw_8225v2b_rf_part2[i].val); 3369 3370 urtw_write32_m(sc, URTW_8187B_AC_VO, (7 << 12) | (3 << 8) | 0x1c); 3371 urtw_write32_m(sc, URTW_8187B_AC_VI, (7 << 12) | (3 << 8) | 0x1c); 3372 urtw_write32_m(sc, URTW_8187B_AC_BE, (7 << 12) | (3 << 8) | 0x1c); 3373 urtw_write32_m(sc, URTW_8187B_AC_BK, (7 << 12) | (3 << 8) | 0x1c); 3374 3375 urtw_8187_write_phy_ofdm(sc, 0x97, 0x46); 3376 urtw_8187_write_phy_ofdm(sc, 0xa4, 0xb6); 3377 urtw_8187_write_phy_ofdm(sc, 0x85, 0xfc); 3378 urtw_8187_write_phy_cck(sc, 0xc1, 0x88); 3379 3380 fail: 3381 return (error); 3382 #undef N 3383 } 3384 3385 static usb_error_t 3386 urtw_8225v2b_rf_set_chan(struct urtw_softc *sc, int chan) 3387 { 3388 usb_error_t error; 3389 3390 error = urtw_8225v2b_set_txpwrlvl(sc, chan); 3391 if (error) 3392 goto fail; 3393 3394 urtw_8225_write(sc, URTW_8225_ADDR_7_MAGIC, urtw_8225_channel[chan]); 3395 usb_pause_mtx(&sc->sc_mtx, 10); 3396 fail: 3397 return (error); 3398 } 3399 3400 static usb_error_t 3401 urtw_8225v2b_set_txpwrlvl(struct urtw_softc *sc, int chan) 3402 { 3403 int i; 3404 uint8_t *cck_pwrtable; 3405 uint8_t cck_pwrlvl_max = 15; 3406 uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff; 3407 uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff; 3408 usb_error_t error; 3409 3410 /* CCK power setting */ 3411 cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ? 3412 ((sc->sc_flags & URTW_RTL8187B_REV_B) ? cck_pwrlvl_max : 22) : 3413 (cck_pwrlvl + ((sc->sc_flags & URTW_RTL8187B_REV_B) ? 0 : 7)); 3414 cck_pwrlvl += sc->sc_txpwr_cck_base; 3415 cck_pwrlvl = (cck_pwrlvl > 35) ? 35 : cck_pwrlvl; 3416 cck_pwrtable = (chan == 14) ? urtw_8225v2b_txpwr_cck_ch14 : 3417 urtw_8225v2b_txpwr_cck; 3418 3419 if (sc->sc_flags & URTW_RTL8187B_REV_B) 3420 cck_pwrtable += (cck_pwrlvl <= 6) ? 0 : 3421 ((cck_pwrlvl <= 11) ? 8 : 16); 3422 else 3423 cck_pwrtable += (cck_pwrlvl <= 5) ? 0 : 3424 ((cck_pwrlvl <= 11) ? 8 : ((cck_pwrlvl <= 17) ? 16 : 24)); 3425 3426 for (i = 0; i < 8; i++) 3427 urtw_8187_write_phy_cck(sc, 0x44 + i, cck_pwrtable[i]); 3428 3429 urtw_write8_m(sc, URTW_TX_GAIN_CCK, 3430 urtw_8225v2_tx_gain_cck_ofdm[cck_pwrlvl] << 1); 3431 usb_pause_mtx(&sc->sc_mtx, 1); 3432 3433 /* OFDM power setting */ 3434 ofdm_pwrlvl = (ofdm_pwrlvl > 15) ? 3435 ((sc->sc_flags & URTW_RTL8187B_REV_B) ? 17 : 25) : 3436 (ofdm_pwrlvl + ((sc->sc_flags & URTW_RTL8187B_REV_B) ? 2 : 10)); 3437 ofdm_pwrlvl += sc->sc_txpwr_ofdm_base; 3438 ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl; 3439 3440 urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 3441 urtw_8225v2_tx_gain_cck_ofdm[ofdm_pwrlvl] << 1); 3442 3443 if (sc->sc_flags & URTW_RTL8187B_REV_B) { 3444 if (ofdm_pwrlvl <= 11) { 3445 urtw_8187_write_phy_ofdm(sc, 0x87, 0x60); 3446 urtw_8187_write_phy_ofdm(sc, 0x89, 0x60); 3447 } else { 3448 urtw_8187_write_phy_ofdm(sc, 0x87, 0x5c); 3449 urtw_8187_write_phy_ofdm(sc, 0x89, 0x5c); 3450 } 3451 } else { 3452 if (ofdm_pwrlvl <= 11) { 3453 urtw_8187_write_phy_ofdm(sc, 0x87, 0x5c); 3454 urtw_8187_write_phy_ofdm(sc, 0x89, 0x5c); 3455 } else if (ofdm_pwrlvl <= 17) { 3456 urtw_8187_write_phy_ofdm(sc, 0x87, 0x54); 3457 urtw_8187_write_phy_ofdm(sc, 0x89, 0x54); 3458 } else { 3459 urtw_8187_write_phy_ofdm(sc, 0x87, 0x50); 3460 urtw_8187_write_phy_ofdm(sc, 0x89, 0x50); 3461 } 3462 } 3463 usb_pause_mtx(&sc->sc_mtx, 1); 3464 fail: 3465 return (error); 3466 } 3467 3468 static usb_error_t 3469 urtw_read8e(struct urtw_softc *sc, int val, uint8_t *data) 3470 { 3471 struct usb_device_request req; 3472 usb_error_t error; 3473 3474 req.bmRequestType = UT_READ_VENDOR_DEVICE; 3475 req.bRequest = URTW_8187_GETREGS_REQ; 3476 USETW(req.wValue, val | 0xfe00); 3477 USETW(req.wIndex, 0); 3478 USETW(req.wLength, sizeof(uint8_t)); 3479 3480 error = urtw_do_request(sc, &req, data); 3481 return (error); 3482 } 3483 3484 static usb_error_t 3485 urtw_write8e(struct urtw_softc *sc, int val, uint8_t data) 3486 { 3487 struct usb_device_request req; 3488 3489 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 3490 req.bRequest = URTW_8187_SETREGS_REQ; 3491 USETW(req.wValue, val | 0xfe00); 3492 USETW(req.wIndex, 0); 3493 USETW(req.wLength, sizeof(uint8_t)); 3494 3495 return (urtw_do_request(sc, &req, &data)); 3496 } 3497 3498 static usb_error_t 3499 urtw_8180_set_anaparam(struct urtw_softc *sc, uint32_t val) 3500 { 3501 uint8_t data; 3502 usb_error_t error; 3503 3504 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 3505 if (error) 3506 goto fail; 3507 3508 urtw_read8_m(sc, URTW_CONFIG3, &data); 3509 urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE); 3510 urtw_write32_m(sc, URTW_ANAPARAM, val); 3511 urtw_read8_m(sc, URTW_CONFIG3, &data); 3512 urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE); 3513 3514 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 3515 if (error) 3516 goto fail; 3517 fail: 3518 return (error); 3519 } 3520 3521 static usb_error_t 3522 urtw_8185_set_anaparam2(struct urtw_softc *sc, uint32_t val) 3523 { 3524 uint8_t data; 3525 usb_error_t error; 3526 3527 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 3528 if (error) 3529 goto fail; 3530 3531 urtw_read8_m(sc, URTW_CONFIG3, &data); 3532 urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE); 3533 urtw_write32_m(sc, URTW_ANAPARAM2, val); 3534 urtw_read8_m(sc, URTW_CONFIG3, &data); 3535 urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE); 3536 3537 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 3538 if (error) 3539 goto fail; 3540 fail: 3541 return (error); 3542 } 3543 3544 static usb_error_t 3545 urtw_intr_enable(struct urtw_softc *sc) 3546 { 3547 usb_error_t error; 3548 3549 urtw_write16_m(sc, URTW_INTR_MASK, 0xffff); 3550 fail: 3551 return (error); 3552 } 3553 3554 static usb_error_t 3555 urtw_intr_disable(struct urtw_softc *sc) 3556 { 3557 usb_error_t error; 3558 3559 urtw_write16_m(sc, URTW_INTR_MASK, 0); 3560 fail: 3561 return (error); 3562 } 3563 3564 static usb_error_t 3565 urtw_reset(struct urtw_softc *sc) 3566 { 3567 uint8_t data; 3568 usb_error_t error; 3569 3570 error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON); 3571 if (error) 3572 goto fail; 3573 error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON); 3574 if (error) 3575 goto fail; 3576 3577 error = urtw_intr_disable(sc); 3578 if (error) 3579 goto fail; 3580 usb_pause_mtx(&sc->sc_mtx, 100); 3581 3582 error = urtw_write8e(sc, 0x18, 0x10); 3583 if (error != 0) 3584 goto fail; 3585 error = urtw_write8e(sc, 0x18, 0x11); 3586 if (error != 0) 3587 goto fail; 3588 error = urtw_write8e(sc, 0x18, 0x00); 3589 if (error != 0) 3590 goto fail; 3591 usb_pause_mtx(&sc->sc_mtx, 100); 3592 3593 urtw_read8_m(sc, URTW_CMD, &data); 3594 data = (data & 0x2) | URTW_CMD_RST; 3595 urtw_write8_m(sc, URTW_CMD, data); 3596 usb_pause_mtx(&sc->sc_mtx, 100); 3597 3598 urtw_read8_m(sc, URTW_CMD, &data); 3599 if (data & URTW_CMD_RST) { 3600 device_printf(sc->sc_dev, "reset timeout\n"); 3601 goto fail; 3602 } 3603 3604 error = urtw_set_mode(sc, URTW_EPROM_CMD_LOAD); 3605 if (error) 3606 goto fail; 3607 usb_pause_mtx(&sc->sc_mtx, 100); 3608 3609 error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON); 3610 if (error) 3611 goto fail; 3612 error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON); 3613 if (error) 3614 goto fail; 3615 fail: 3616 return (error); 3617 } 3618 3619 static usb_error_t 3620 urtw_led_ctl(struct urtw_softc *sc, int mode) 3621 { 3622 usb_error_t error = 0; 3623 3624 switch (sc->sc_strategy) { 3625 case URTW_SW_LED_MODE0: 3626 error = urtw_led_mode0(sc, mode); 3627 break; 3628 case URTW_SW_LED_MODE1: 3629 error = urtw_led_mode1(sc, mode); 3630 break; 3631 case URTW_SW_LED_MODE2: 3632 error = urtw_led_mode2(sc, mode); 3633 break; 3634 case URTW_SW_LED_MODE3: 3635 error = urtw_led_mode3(sc, mode); 3636 break; 3637 default: 3638 DPRINTF(sc, URTW_DEBUG_STATE, 3639 "unsupported LED mode %d\n", sc->sc_strategy); 3640 error = USB_ERR_INVAL; 3641 break; 3642 } 3643 3644 return (error); 3645 } 3646 3647 static usb_error_t 3648 urtw_led_mode0(struct urtw_softc *sc, int mode) 3649 { 3650 3651 switch (mode) { 3652 case URTW_LED_CTL_POWER_ON: 3653 sc->sc_gpio_ledstate = URTW_LED_POWER_ON_BLINK; 3654 break; 3655 case URTW_LED_CTL_TX: 3656 if (sc->sc_gpio_ledinprogress == 1) 3657 return (0); 3658 3659 sc->sc_gpio_ledstate = URTW_LED_BLINK_NORMAL; 3660 sc->sc_gpio_blinktime = 2; 3661 break; 3662 case URTW_LED_CTL_LINK: 3663 sc->sc_gpio_ledstate = URTW_LED_ON; 3664 break; 3665 default: 3666 DPRINTF(sc, URTW_DEBUG_STATE, 3667 "unsupported LED mode 0x%x", mode); 3668 return (USB_ERR_INVAL); 3669 } 3670 3671 switch (sc->sc_gpio_ledstate) { 3672 case URTW_LED_ON: 3673 if (sc->sc_gpio_ledinprogress != 0) 3674 break; 3675 urtw_led_on(sc, URTW_LED_GPIO); 3676 break; 3677 case URTW_LED_BLINK_NORMAL: 3678 if (sc->sc_gpio_ledinprogress != 0) 3679 break; 3680 sc->sc_gpio_ledinprogress = 1; 3681 sc->sc_gpio_blinkstate = (sc->sc_gpio_ledon != 0) ? 3682 URTW_LED_OFF : URTW_LED_ON; 3683 usb_callout_reset(&sc->sc_led_ch, hz, urtw_led_ch, sc); 3684 break; 3685 case URTW_LED_POWER_ON_BLINK: 3686 urtw_led_on(sc, URTW_LED_GPIO); 3687 usb_pause_mtx(&sc->sc_mtx, 100); 3688 urtw_led_off(sc, URTW_LED_GPIO); 3689 break; 3690 default: 3691 DPRINTF(sc, URTW_DEBUG_STATE, 3692 "unknown LED status 0x%x", sc->sc_gpio_ledstate); 3693 return (USB_ERR_INVAL); 3694 } 3695 return (0); 3696 } 3697 3698 static usb_error_t 3699 urtw_led_mode1(struct urtw_softc *sc, int mode) 3700 { 3701 return (USB_ERR_INVAL); 3702 } 3703 3704 static usb_error_t 3705 urtw_led_mode2(struct urtw_softc *sc, int mode) 3706 { 3707 return (USB_ERR_INVAL); 3708 } 3709 3710 static usb_error_t 3711 urtw_led_mode3(struct urtw_softc *sc, int mode) 3712 { 3713 return (USB_ERR_INVAL); 3714 } 3715 3716 static usb_error_t 3717 urtw_led_on(struct urtw_softc *sc, int type) 3718 { 3719 usb_error_t error; 3720 3721 if (type == URTW_LED_GPIO) { 3722 switch (sc->sc_gpio_ledpin) { 3723 case URTW_LED_PIN_GPIO0: 3724 urtw_write8_m(sc, URTW_GPIO, 0x01); 3725 urtw_write8_m(sc, URTW_GP_ENABLE, 0x00); 3726 break; 3727 default: 3728 DPRINTF(sc, URTW_DEBUG_STATE, 3729 "unsupported LED PIN type 0x%x", 3730 sc->sc_gpio_ledpin); 3731 error = USB_ERR_INVAL; 3732 goto fail; 3733 } 3734 } else { 3735 DPRINTF(sc, URTW_DEBUG_STATE, 3736 "unsupported LED type 0x%x", type); 3737 error = USB_ERR_INVAL; 3738 goto fail; 3739 } 3740 3741 sc->sc_gpio_ledon = 1; 3742 fail: 3743 return (error); 3744 } 3745 3746 static usb_error_t 3747 urtw_led_off(struct urtw_softc *sc, int type) 3748 { 3749 usb_error_t error; 3750 3751 if (type == URTW_LED_GPIO) { 3752 switch (sc->sc_gpio_ledpin) { 3753 case URTW_LED_PIN_GPIO0: 3754 urtw_write8_m(sc, URTW_GPIO, URTW_GPIO_DATA_MAGIC1); 3755 urtw_write8_m(sc, 3756 URTW_GP_ENABLE, URTW_GP_ENABLE_DATA_MAGIC1); 3757 break; 3758 default: 3759 DPRINTF(sc, URTW_DEBUG_STATE, 3760 "unsupported LED PIN type 0x%x", 3761 sc->sc_gpio_ledpin); 3762 error = USB_ERR_INVAL; 3763 goto fail; 3764 } 3765 } else { 3766 DPRINTF(sc, URTW_DEBUG_STATE, 3767 "unsupported LED type 0x%x", type); 3768 error = USB_ERR_INVAL; 3769 goto fail; 3770 } 3771 3772 sc->sc_gpio_ledon = 0; 3773 3774 fail: 3775 return (error); 3776 } 3777 3778 static void 3779 urtw_led_ch(void *arg) 3780 { 3781 struct urtw_softc *sc = arg; 3782 struct ifnet *ifp = sc->sc_ifp; 3783 struct ieee80211com *ic = ifp->if_l2com; 3784 3785 ieee80211_runtask(ic, &sc->sc_led_task); 3786 } 3787 3788 static void 3789 urtw_ledtask(void *arg, int pending) 3790 { 3791 struct urtw_softc *sc = arg; 3792 3793 if (sc->sc_strategy != URTW_SW_LED_MODE0) { 3794 DPRINTF(sc, URTW_DEBUG_STATE, 3795 "could not process a LED strategy 0x%x", 3796 sc->sc_strategy); 3797 return; 3798 } 3799 3800 URTW_LOCK(sc); 3801 urtw_led_blink(sc); 3802 URTW_UNLOCK(sc); 3803 } 3804 3805 static usb_error_t 3806 urtw_led_blink(struct urtw_softc *sc) 3807 { 3808 uint8_t ing = 0; 3809 usb_error_t error; 3810 3811 if (sc->sc_gpio_blinkstate == URTW_LED_ON) 3812 error = urtw_led_on(sc, URTW_LED_GPIO); 3813 else 3814 error = urtw_led_off(sc, URTW_LED_GPIO); 3815 sc->sc_gpio_blinktime--; 3816 if (sc->sc_gpio_blinktime == 0) 3817 ing = 1; 3818 else { 3819 if (sc->sc_gpio_ledstate != URTW_LED_BLINK_NORMAL && 3820 sc->sc_gpio_ledstate != URTW_LED_BLINK_SLOWLY && 3821 sc->sc_gpio_ledstate != URTW_LED_BLINK_CM3) 3822 ing = 1; 3823 } 3824 if (ing == 1) { 3825 if (sc->sc_gpio_ledstate == URTW_LED_ON && 3826 sc->sc_gpio_ledon == 0) 3827 error = urtw_led_on(sc, URTW_LED_GPIO); 3828 else if (sc->sc_gpio_ledstate == URTW_LED_OFF && 3829 sc->sc_gpio_ledon == 1) 3830 error = urtw_led_off(sc, URTW_LED_GPIO); 3831 3832 sc->sc_gpio_blinktime = 0; 3833 sc->sc_gpio_ledinprogress = 0; 3834 return (0); 3835 } 3836 3837 sc->sc_gpio_blinkstate = (sc->sc_gpio_blinkstate != URTW_LED_ON) ? 3838 URTW_LED_ON : URTW_LED_OFF; 3839 3840 switch (sc->sc_gpio_ledstate) { 3841 case URTW_LED_BLINK_NORMAL: 3842 usb_callout_reset(&sc->sc_led_ch, hz, urtw_led_ch, sc); 3843 break; 3844 default: 3845 DPRINTF(sc, URTW_DEBUG_STATE, 3846 "unknown LED status 0x%x", 3847 sc->sc_gpio_ledstate); 3848 return (USB_ERR_INVAL); 3849 } 3850 return (0); 3851 } 3852 3853 static usb_error_t 3854 urtw_rx_enable(struct urtw_softc *sc) 3855 { 3856 uint8_t data; 3857 usb_error_t error; 3858 3859 usbd_transfer_start((sc->sc_flags & URTW_RTL8187B) ? 3860 sc->sc_xfer[URTW_8187B_BULK_RX] : sc->sc_xfer[URTW_8187L_BULK_RX]); 3861 3862 error = urtw_rx_setconf(sc); 3863 if (error != 0) 3864 goto fail; 3865 3866 if ((sc->sc_flags & URTW_RTL8187B) == 0) { 3867 urtw_read8_m(sc, URTW_CMD, &data); 3868 urtw_write8_m(sc, URTW_CMD, data | URTW_CMD_RX_ENABLE); 3869 } 3870 fail: 3871 return (error); 3872 } 3873 3874 static usb_error_t 3875 urtw_tx_enable(struct urtw_softc *sc) 3876 { 3877 uint8_t data8; 3878 uint32_t data; 3879 usb_error_t error; 3880 3881 if (sc->sc_flags & URTW_RTL8187B) { 3882 urtw_read32_m(sc, URTW_TX_CONF, &data); 3883 data &= ~URTW_TX_LOOPBACK_MASK; 3884 data &= ~(URTW_TX_DPRETRY_MASK | URTW_TX_RTSRETRY_MASK); 3885 data &= ~(URTW_TX_NOCRC | URTW_TX_MXDMA_MASK); 3886 data &= ~URTW_TX_SWPLCPLEN; 3887 data |= URTW_TX_HW_SEQNUM | URTW_TX_DISREQQSIZE | 3888 (7 << 8) | /* short retry limit */ 3889 (7 << 0) | /* long retry limit */ 3890 (7 << 21); /* MAX TX DMA */ 3891 urtw_write32_m(sc, URTW_TX_CONF, data); 3892 3893 urtw_read8_m(sc, URTW_MSR, &data8); 3894 data8 |= URTW_MSR_LINK_ENEDCA; 3895 urtw_write8_m(sc, URTW_MSR, data8); 3896 return (error); 3897 } 3898 3899 urtw_read8_m(sc, URTW_CW_CONF, &data8); 3900 data8 &= ~(URTW_CW_CONF_PERPACKET_CW | URTW_CW_CONF_PERPACKET_RETRY); 3901 urtw_write8_m(sc, URTW_CW_CONF, data8); 3902 3903 urtw_read8_m(sc, URTW_TX_AGC_CTL, &data8); 3904 data8 &= ~URTW_TX_AGC_CTL_PERPACKET_GAIN; 3905 data8 &= ~URTW_TX_AGC_CTL_PERPACKET_ANTSEL; 3906 data8 &= ~URTW_TX_AGC_CTL_FEEDBACK_ANT; 3907 urtw_write8_m(sc, URTW_TX_AGC_CTL, data8); 3908 3909 urtw_read32_m(sc, URTW_TX_CONF, &data); 3910 data &= ~URTW_TX_LOOPBACK_MASK; 3911 data |= URTW_TX_LOOPBACK_NONE; 3912 data &= ~(URTW_TX_DPRETRY_MASK | URTW_TX_RTSRETRY_MASK); 3913 data |= sc->sc_tx_retry << URTW_TX_DPRETRY_SHIFT; 3914 data |= sc->sc_rts_retry << URTW_TX_RTSRETRY_SHIFT; 3915 data &= ~(URTW_TX_NOCRC | URTW_TX_MXDMA_MASK); 3916 data |= URTW_TX_MXDMA_2048 | URTW_TX_CWMIN | URTW_TX_DISCW; 3917 data &= ~URTW_TX_SWPLCPLEN; 3918 data |= URTW_TX_NOICV; 3919 urtw_write32_m(sc, URTW_TX_CONF, data); 3920 3921 urtw_read8_m(sc, URTW_CMD, &data8); 3922 urtw_write8_m(sc, URTW_CMD, data8 | URTW_CMD_TX_ENABLE); 3923 fail: 3924 return (error); 3925 } 3926 3927 static usb_error_t 3928 urtw_rx_setconf(struct urtw_softc *sc) 3929 { 3930 struct ifnet *ifp = sc->sc_ifp; 3931 struct ieee80211com *ic = ifp->if_l2com; 3932 uint32_t data; 3933 usb_error_t error; 3934 3935 urtw_read32_m(sc, URTW_RX, &data); 3936 data = data &~ URTW_RX_FILTER_MASK; 3937 if (sc->sc_flags & URTW_RTL8187B) { 3938 data = data | URTW_RX_FILTER_MNG | URTW_RX_FILTER_DATA | 3939 URTW_RX_FILTER_MCAST | URTW_RX_FILTER_BCAST | 3940 URTW_RX_FILTER_NICMAC | URTW_RX_CHECK_BSSID | 3941 URTW_RX_FIFO_THRESHOLD_NONE | 3942 URTW_MAX_RX_DMA_2048 | 3943 URTW_RX_AUTORESETPHY | URTW_RCR_ONLYERLPKT; 3944 } else { 3945 data = data | URTW_RX_FILTER_MNG | URTW_RX_FILTER_DATA; 3946 data = data | URTW_RX_FILTER_BCAST | URTW_RX_FILTER_MCAST; 3947 3948 if (ic->ic_opmode == IEEE80211_M_MONITOR) { 3949 data = data | URTW_RX_FILTER_ICVERR; 3950 data = data | URTW_RX_FILTER_PWR; 3951 } 3952 if (sc->sc_crcmon == 1 && ic->ic_opmode == IEEE80211_M_MONITOR) 3953 data = data | URTW_RX_FILTER_CRCERR; 3954 3955 if (ic->ic_opmode == IEEE80211_M_MONITOR || 3956 (ifp->if_flags & (IFF_ALLMULTI | IFF_PROMISC))) { 3957 data = data | URTW_RX_FILTER_ALLMAC; 3958 } else { 3959 data = data | URTW_RX_FILTER_NICMAC; 3960 data = data | URTW_RX_CHECK_BSSID; 3961 } 3962 3963 data = data &~ URTW_RX_FIFO_THRESHOLD_MASK; 3964 data = data | URTW_RX_FIFO_THRESHOLD_NONE | 3965 URTW_RX_AUTORESETPHY; 3966 data = data &~ URTW_MAX_RX_DMA_MASK; 3967 data = data | URTW_MAX_RX_DMA_2048 | URTW_RCR_ONLYERLPKT; 3968 } 3969 3970 urtw_write32_m(sc, URTW_RX, data); 3971 fail: 3972 return (error); 3973 } 3974 3975 static struct mbuf * 3976 urtw_rxeof(struct usb_xfer *xfer, struct urtw_data *data, int *rssi_p, 3977 int8_t *nf_p) 3978 { 3979 int actlen, flen, rssi; 3980 struct ieee80211_frame *wh; 3981 struct mbuf *m, *mnew; 3982 struct urtw_softc *sc = data->sc; 3983 struct ifnet *ifp = sc->sc_ifp; 3984 struct ieee80211com *ic = ifp->if_l2com; 3985 uint8_t noise = 0, rate; 3986 3987 usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); 3988 3989 if (actlen < (int)URTW_MIN_RXBUFSZ) { 3990 ifp->if_ierrors++; 3991 return (NULL); 3992 } 3993 3994 if (sc->sc_flags & URTW_RTL8187B) { 3995 struct urtw_8187b_rxhdr *rx; 3996 3997 rx = (struct urtw_8187b_rxhdr *)(data->buf + 3998 (actlen - (sizeof(struct urtw_8187b_rxhdr)))); 3999 flen = le32toh(rx->flag) & 0xfff; 4000 if (flen > actlen) { 4001 ifp->if_ierrors++; 4002 return (NULL); 4003 } 4004 rate = (le32toh(rx->flag) >> URTW_RX_FLAG_RXRATE_SHIFT) & 0xf; 4005 /* XXX correct? */ 4006 rssi = rx->rssi & URTW_RX_RSSI_MASK; 4007 noise = rx->noise; 4008 } else { 4009 struct urtw_8187l_rxhdr *rx; 4010 4011 rx = (struct urtw_8187l_rxhdr *)(data->buf + 4012 (actlen - (sizeof(struct urtw_8187l_rxhdr)))); 4013 flen = le32toh(rx->flag) & 0xfff; 4014 if (flen > actlen) { 4015 ifp->if_ierrors++; 4016 return (NULL); 4017 } 4018 4019 rate = (le32toh(rx->flag) >> URTW_RX_FLAG_RXRATE_SHIFT) & 0xf; 4020 /* XXX correct? */ 4021 rssi = rx->rssi & URTW_RX_8187L_RSSI_MASK; 4022 noise = rx->noise; 4023 } 4024 4025 mnew = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR); 4026 if (mnew == NULL) { 4027 ifp->if_ierrors++; 4028 return (NULL); 4029 } 4030 4031 m = data->m; 4032 data->m = mnew; 4033 data->buf = mtod(mnew, uint8_t *); 4034 4035 /* finalize mbuf */ 4036 m->m_pkthdr.rcvif = ifp; 4037 m->m_pkthdr.len = m->m_len = flen - IEEE80211_CRC_LEN; 4038 4039 if (ieee80211_radiotap_active(ic)) { 4040 struct urtw_rx_radiotap_header *tap = &sc->sc_rxtap; 4041 4042 /* XXX Are variables correct? */ 4043 tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq); 4044 tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags); 4045 tap->wr_dbm_antsignal = (int8_t)rssi; 4046 } 4047 4048 wh = mtod(m, struct ieee80211_frame *); 4049 if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_DATA) 4050 sc->sc_currate = (rate > 0) ? rate : sc->sc_currate; 4051 4052 *rssi_p = rssi; 4053 *nf_p = noise; /* XXX correct? */ 4054 4055 return (m); 4056 } 4057 4058 static void 4059 urtw_bulk_rx_callback(struct usb_xfer *xfer, usb_error_t error) 4060 { 4061 struct urtw_softc *sc = usbd_xfer_softc(xfer); 4062 struct ifnet *ifp = sc->sc_ifp; 4063 struct ieee80211com *ic = ifp->if_l2com; 4064 struct ieee80211_frame *wh; 4065 struct ieee80211_node *ni; 4066 struct mbuf *m = NULL; 4067 struct urtw_data *data; 4068 int8_t nf = -95; 4069 int rssi = 1; 4070 4071 URTW_ASSERT_LOCKED(sc); 4072 4073 switch (USB_GET_STATE(xfer)) { 4074 case USB_ST_TRANSFERRED: 4075 data = STAILQ_FIRST(&sc->sc_rx_active); 4076 if (data == NULL) 4077 goto setup; 4078 STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next); 4079 m = urtw_rxeof(xfer, data, &rssi, &nf); 4080 STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next); 4081 /* FALLTHROUGH */ 4082 case USB_ST_SETUP: 4083 setup: 4084 data = STAILQ_FIRST(&sc->sc_rx_inactive); 4085 if (data == NULL) { 4086 KASSERT(m == NULL, ("mbuf isn't NULL")); 4087 return; 4088 } 4089 STAILQ_REMOVE_HEAD(&sc->sc_rx_inactive, next); 4090 STAILQ_INSERT_TAIL(&sc->sc_rx_active, data, next); 4091 usbd_xfer_set_frame_data(xfer, 0, data->buf, 4092 usbd_xfer_max_len(xfer)); 4093 usbd_transfer_submit(xfer); 4094 4095 /* 4096 * To avoid LOR we should unlock our private mutex here to call 4097 * ieee80211_input() because here is at the end of a USB 4098 * callback and safe to unlock. 4099 */ 4100 URTW_UNLOCK(sc); 4101 if (m != NULL) { 4102 wh = mtod(m, struct ieee80211_frame *); 4103 ni = ieee80211_find_rxnode(ic, 4104 (struct ieee80211_frame_min *)wh); 4105 if (ni != NULL) { 4106 (void) ieee80211_input(ni, m, rssi, nf); 4107 /* node is no longer needed */ 4108 ieee80211_free_node(ni); 4109 } else 4110 (void) ieee80211_input_all(ic, m, rssi, nf); 4111 m = NULL; 4112 } 4113 URTW_LOCK(sc); 4114 break; 4115 default: 4116 /* needs it to the inactive queue due to a error. */ 4117 data = STAILQ_FIRST(&sc->sc_rx_active); 4118 if (data != NULL) { 4119 STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next); 4120 STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next); 4121 } 4122 if (error != USB_ERR_CANCELLED) { 4123 usbd_xfer_set_stall(xfer); 4124 ifp->if_ierrors++; 4125 goto setup; 4126 } 4127 break; 4128 } 4129 } 4130 4131 #define URTW_STATUS_TYPE_TXCLOSE 1 4132 #define URTW_STATUS_TYPE_BEACON_INTR 0 4133 4134 static void 4135 urtw_txstatus_eof(struct usb_xfer *xfer) 4136 { 4137 struct urtw_softc *sc = usbd_xfer_softc(xfer); 4138 struct ifnet *ifp = sc->sc_ifp; 4139 int actlen, type, pktretry, seq; 4140 uint64_t val; 4141 4142 usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); 4143 4144 if (actlen != sizeof(uint64_t)) 4145 return; 4146 4147 val = le64toh(sc->sc_txstatus); 4148 type = (val >> 30) & 0x3; 4149 if (type == URTW_STATUS_TYPE_TXCLOSE) { 4150 pktretry = val & 0xff; 4151 seq = (val >> 16) & 0xff; 4152 if (pktretry == URTW_TX_MAXRETRY) 4153 ifp->if_oerrors++; 4154 DPRINTF(sc, URTW_DEBUG_TXSTATUS, "pktretry %d seq %#x\n", 4155 pktretry, seq); 4156 } 4157 } 4158 4159 static void 4160 urtw_bulk_tx_status_callback(struct usb_xfer *xfer, usb_error_t error) 4161 { 4162 struct urtw_softc *sc = usbd_xfer_softc(xfer); 4163 struct ifnet *ifp = sc->sc_ifp; 4164 void *dma_buf = usbd_xfer_get_frame_buffer(xfer, 0); 4165 4166 URTW_ASSERT_LOCKED(sc); 4167 4168 switch (USB_GET_STATE(xfer)) { 4169 case USB_ST_TRANSFERRED: 4170 urtw_txstatus_eof(xfer); 4171 /* FALLTHROUGH */ 4172 case USB_ST_SETUP: 4173 setup: 4174 memcpy(dma_buf, &sc->sc_txstatus, sizeof(uint64_t)); 4175 usbd_xfer_set_frame_len(xfer, 0, sizeof(uint64_t)); 4176 usbd_transfer_submit(xfer); 4177 break; 4178 default: 4179 if (error != USB_ERR_CANCELLED) { 4180 usbd_xfer_set_stall(xfer); 4181 ifp->if_ierrors++; 4182 goto setup; 4183 } 4184 break; 4185 } 4186 } 4187 4188 static void 4189 urtw_txeof(struct usb_xfer *xfer, struct urtw_data *data) 4190 { 4191 struct urtw_softc *sc = usbd_xfer_softc(xfer); 4192 struct ifnet *ifp = sc->sc_ifp; 4193 struct mbuf *m; 4194 4195 URTW_ASSERT_LOCKED(sc); 4196 4197 /* 4198 * Do any tx complete callback. Note this must be done before releasing 4199 * the node reference. 4200 */ 4201 if (data->m) { 4202 m = data->m; 4203 if (m->m_flags & M_TXCB) { 4204 /* XXX status? */ 4205 ieee80211_process_callback(data->ni, m, 0); 4206 } 4207 m_freem(m); 4208 data->m = NULL; 4209 } 4210 if (data->ni) { 4211 ieee80211_free_node(data->ni); 4212 data->ni = NULL; 4213 } 4214 sc->sc_txtimer = 0; 4215 ifp->if_opackets++; 4216 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 4217 } 4218 4219 static void 4220 urtw_bulk_tx_callback(struct usb_xfer *xfer, usb_error_t error) 4221 { 4222 struct urtw_softc *sc = usbd_xfer_softc(xfer); 4223 struct ifnet *ifp = sc->sc_ifp; 4224 struct urtw_data *data; 4225 4226 URTW_ASSERT_LOCKED(sc); 4227 4228 switch (USB_GET_STATE(xfer)) { 4229 case USB_ST_TRANSFERRED: 4230 data = STAILQ_FIRST(&sc->sc_tx_active); 4231 if (data == NULL) 4232 goto setup; 4233 STAILQ_REMOVE_HEAD(&sc->sc_tx_active, next); 4234 urtw_txeof(xfer, data); 4235 STAILQ_INSERT_TAIL(&sc->sc_tx_inactive, data, next); 4236 /* FALLTHROUGH */ 4237 case USB_ST_SETUP: 4238 setup: 4239 data = STAILQ_FIRST(&sc->sc_tx_pending); 4240 if (data == NULL) { 4241 DPRINTF(sc, URTW_DEBUG_XMIT, 4242 "%s: empty pending queue\n", __func__); 4243 return; 4244 } 4245 STAILQ_REMOVE_HEAD(&sc->sc_tx_pending, next); 4246 STAILQ_INSERT_TAIL(&sc->sc_tx_active, data, next); 4247 4248 usbd_xfer_set_frame_data(xfer, 0, data->buf, data->buflen); 4249 usbd_transfer_submit(xfer); 4250 4251 URTW_UNLOCK(sc); 4252 urtw_start(ifp); 4253 URTW_LOCK(sc); 4254 break; 4255 default: 4256 data = STAILQ_FIRST(&sc->sc_tx_active); 4257 if (data == NULL) 4258 goto setup; 4259 if (data->ni != NULL) { 4260 ieee80211_free_node(data->ni); 4261 data->ni = NULL; 4262 ifp->if_oerrors++; 4263 } 4264 if (error != USB_ERR_CANCELLED) { 4265 usbd_xfer_set_stall(xfer); 4266 goto setup; 4267 } 4268 break; 4269 } 4270 } 4271 4272 static struct urtw_data * 4273 _urtw_getbuf(struct urtw_softc *sc) 4274 { 4275 struct urtw_data *bf; 4276 4277 bf = STAILQ_FIRST(&sc->sc_tx_inactive); 4278 if (bf != NULL) 4279 STAILQ_REMOVE_HEAD(&sc->sc_tx_inactive, next); 4280 else 4281 bf = NULL; 4282 if (bf == NULL) 4283 DPRINTF(sc, URTW_DEBUG_XMIT, "%s: %s\n", __func__, 4284 "out of xmit buffers"); 4285 return (bf); 4286 } 4287 4288 static struct urtw_data * 4289 urtw_getbuf(struct urtw_softc *sc) 4290 { 4291 struct urtw_data *bf; 4292 4293 URTW_ASSERT_LOCKED(sc); 4294 4295 bf = _urtw_getbuf(sc); 4296 if (bf == NULL) { 4297 struct ifnet *ifp = sc->sc_ifp; 4298 4299 DPRINTF(sc, URTW_DEBUG_XMIT, "%s: stop queue\n", __func__); 4300 ifp->if_drv_flags |= IFF_DRV_OACTIVE; 4301 } 4302 return (bf); 4303 } 4304 4305 static int 4306 urtw_isbmode(uint16_t rate) 4307 { 4308 4309 return ((rate <= 22 && rate != 12 && rate != 18) || 4310 rate == 44) ? (1) : (0); 4311 } 4312 4313 static uint16_t 4314 urtw_rate2dbps(uint16_t rate) 4315 { 4316 4317 switch(rate) { 4318 case 12: 4319 case 18: 4320 case 24: 4321 case 36: 4322 case 48: 4323 case 72: 4324 case 96: 4325 case 108: 4326 return (rate * 2); 4327 default: 4328 break; 4329 } 4330 return (24); 4331 } 4332 4333 static int 4334 urtw_compute_txtime(uint16_t framelen, uint16_t rate, 4335 uint8_t ismgt, uint8_t isshort) 4336 { 4337 uint16_t ceiling, frametime, n_dbps; 4338 4339 if (urtw_isbmode(rate)) { 4340 if (ismgt || !isshort || rate == 2) 4341 frametime = (uint16_t)(144 + 48 + 4342 (framelen * 8 / (rate / 2))); 4343 else 4344 frametime = (uint16_t)(72 + 24 + 4345 (framelen * 8 / (rate / 2))); 4346 if ((framelen * 8 % (rate / 2)) != 0) 4347 frametime++; 4348 } else { 4349 n_dbps = urtw_rate2dbps(rate); 4350 ceiling = (16 + 8 * framelen + 6) / n_dbps 4351 + (((16 + 8 * framelen + 6) % n_dbps) ? 1 : 0); 4352 frametime = (uint16_t)(16 + 4 + 4 * ceiling + 6); 4353 } 4354 return (frametime); 4355 } 4356 4357 /* 4358 * Callback from the 802.11 layer to update the 4359 * slot time based on the current setting. 4360 */ 4361 static void 4362 urtw_updateslot(struct ifnet *ifp) 4363 { 4364 struct urtw_softc *sc = ifp->if_softc; 4365 struct ieee80211com *ic = ifp->if_l2com; 4366 4367 ieee80211_runtask(ic, &sc->sc_updateslot_task); 4368 } 4369 4370 static void 4371 urtw_updateslottask(void *arg, int pending) 4372 { 4373 struct urtw_softc *sc = arg; 4374 struct ifnet *ifp = sc->sc_ifp; 4375 struct ieee80211com *ic = ifp->if_l2com; 4376 int error; 4377 4378 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) 4379 return; 4380 4381 URTW_LOCK(sc); 4382 if (sc->sc_flags & URTW_RTL8187B) { 4383 urtw_write8_m(sc, URTW_SIFS, 0x22); 4384 if (IEEE80211_IS_CHAN_ANYG(ic->ic_curchan)) 4385 urtw_write8_m(sc, URTW_SLOT, 0x9); 4386 else 4387 urtw_write8_m(sc, URTW_SLOT, 0x14); 4388 urtw_write8_m(sc, URTW_8187B_EIFS, 0x5b); 4389 urtw_write8_m(sc, URTW_CARRIER_SCOUNT, 0x5b); 4390 } else { 4391 urtw_write8_m(sc, URTW_SIFS, 0x22); 4392 if (sc->sc_state == IEEE80211_S_ASSOC && 4393 ic->ic_flags & IEEE80211_F_SHSLOT) 4394 urtw_write8_m(sc, URTW_SLOT, 0x9); 4395 else 4396 urtw_write8_m(sc, URTW_SLOT, 0x14); 4397 if (IEEE80211_IS_CHAN_ANYG(ic->ic_curchan)) { 4398 urtw_write8_m(sc, URTW_DIFS, 0x14); 4399 urtw_write8_m(sc, URTW_EIFS, 0x5b - 0x14); 4400 urtw_write8_m(sc, URTW_CW_VAL, 0x73); 4401 } else { 4402 urtw_write8_m(sc, URTW_DIFS, 0x24); 4403 urtw_write8_m(sc, URTW_EIFS, 0x5b - 0x24); 4404 urtw_write8_m(sc, URTW_CW_VAL, 0xa5); 4405 } 4406 } 4407 fail: 4408 URTW_UNLOCK(sc); 4409 } 4410 4411 static void 4412 urtw_sysctl_node(struct urtw_softc *sc) 4413 { 4414 #define URTW_SYSCTL_STAT_ADD32(c, h, n, p, d) \ 4415 SYSCTL_ADD_UINT(c, h, OID_AUTO, n, CTLFLAG_RD, p, 0, d) 4416 struct sysctl_ctx_list *ctx; 4417 struct sysctl_oid_list *child, *parent; 4418 struct sysctl_oid *tree; 4419 struct urtw_stats *stats = &sc->sc_stats; 4420 4421 ctx = device_get_sysctl_ctx(sc->sc_dev); 4422 child = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->sc_dev)); 4423 4424 tree = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats", CTLFLAG_RD, 4425 NULL, "URTW statistics"); 4426 parent = SYSCTL_CHILDREN(tree); 4427 4428 /* Tx statistics. */ 4429 tree = SYSCTL_ADD_NODE(ctx, parent, OID_AUTO, "tx", CTLFLAG_RD, 4430 NULL, "Tx MAC statistics"); 4431 child = SYSCTL_CHILDREN(tree); 4432 URTW_SYSCTL_STAT_ADD32(ctx, child, "1m", &stats->txrates[0], 4433 "1 Mbit/s"); 4434 URTW_SYSCTL_STAT_ADD32(ctx, child, "2m", &stats->txrates[1], 4435 "2 Mbit/s"); 4436 URTW_SYSCTL_STAT_ADD32(ctx, child, "5.5m", &stats->txrates[2], 4437 "5.5 Mbit/s"); 4438 URTW_SYSCTL_STAT_ADD32(ctx, child, "6m", &stats->txrates[4], 4439 "6 Mbit/s"); 4440 URTW_SYSCTL_STAT_ADD32(ctx, child, "9m", &stats->txrates[5], 4441 "9 Mbit/s"); 4442 URTW_SYSCTL_STAT_ADD32(ctx, child, "11m", &stats->txrates[3], 4443 "11 Mbit/s"); 4444 URTW_SYSCTL_STAT_ADD32(ctx, child, "12m", &stats->txrates[6], 4445 "12 Mbit/s"); 4446 URTW_SYSCTL_STAT_ADD32(ctx, child, "18m", &stats->txrates[7], 4447 "18 Mbit/s"); 4448 URTW_SYSCTL_STAT_ADD32(ctx, child, "24m", &stats->txrates[8], 4449 "24 Mbit/s"); 4450 URTW_SYSCTL_STAT_ADD32(ctx, child, "36m", &stats->txrates[9], 4451 "36 Mbit/s"); 4452 URTW_SYSCTL_STAT_ADD32(ctx, child, "48m", &stats->txrates[10], 4453 "48 Mbit/s"); 4454 URTW_SYSCTL_STAT_ADD32(ctx, child, "54m", &stats->txrates[11], 4455 "54 Mbit/s"); 4456 #undef URTW_SYSCTL_STAT_ADD32 4457 } 4458 4459 static device_method_t urtw_methods[] = { 4460 DEVMETHOD(device_probe, urtw_match), 4461 DEVMETHOD(device_attach, urtw_attach), 4462 DEVMETHOD(device_detach, urtw_detach), 4463 DEVMETHOD_END 4464 }; 4465 static driver_t urtw_driver = { 4466 .name = "urtw", 4467 .methods = urtw_methods, 4468 .size = sizeof(struct urtw_softc) 4469 }; 4470 static devclass_t urtw_devclass; 4471 4472 DRIVER_MODULE(urtw, uhub, urtw_driver, urtw_devclass, NULL, 0); 4473 MODULE_DEPEND(urtw, wlan, 1, 1, 1); 4474 MODULE_DEPEND(urtw, usb, 1, 1, 1); 4475 MODULE_VERSION(urtw, 1); 4476