1 /* $NetBSD: if_urtw.c,v 1.10 2016/06/10 13:27:15 ozaki-r Exp $ */ 2 /* $OpenBSD: if_urtw.c,v 1.39 2011/07/03 15:47:17 matthew Exp $ */ 3 4 /*- 5 * Copyright (c) 2009 Martynas Venckus <martynas@openbsd.org> 6 * Copyright (c) 2008 Weongyo Jeong <weongyo@FreeBSD.org> 7 * 8 * Permission to use, copy, modify, and distribute this software for any 9 * purpose with or without fee is hereby granted, provided that the above 10 * copyright notice and this permission notice appear in all copies. 11 * 12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19 */ 20 21 #include <sys/cdefs.h> 22 __KERNEL_RCSID(0, "$NetBSD: if_urtw.c,v 1.10 2016/06/10 13:27:15 ozaki-r Exp $"); 23 24 #include <sys/param.h> 25 #include <sys/sockio.h> 26 #include <sys/proc.h> 27 #include <sys/mbuf.h> 28 #include <sys/kernel.h> 29 #include <sys/socket.h> 30 #include <sys/systm.h> 31 #include <sys/callout.h> 32 #include <sys/conf.h> 33 #include <sys/device.h> 34 #include <sys/module.h> 35 #include <sys/bus.h> 36 37 #include <machine/endian.h> 38 #include <net/bpf.h> 39 #include <net/if.h> 40 #include <net/if_arp.h> 41 #include <net/if_dl.h> 42 #include <net/if_ether.h> 43 #include <net/if_media.h> 44 #include <net/if_types.h> 45 46 #include <netinet/in.h> 47 #include <netinet/in_systm.h> 48 #include <netinet/in_var.h> 49 #include <netinet/if_inarp.h> 50 #include <netinet/ip.h> 51 52 #include <net80211/ieee80211_var.h> 53 #include <net80211/ieee80211_radiotap.h> 54 55 #include <dev/usb/usb.h> 56 #include <dev/usb/usbdi.h> 57 #include <dev/usb/usbdi_util.h> 58 #include <dev/usb/usbdivar.h> 59 #include <dev/usb/usbdevs.h> 60 61 #include "if_urtwreg.h" 62 63 #ifdef URTW_DEBUG 64 #define DPRINTF(x) do { if (urtw_debug) printf x; } while (0) 65 #define DPRINTFN(n, x) do { if (urtw_debug >= (n)) printf x; } while (0) 66 int urtw_debug = 0; 67 #else 68 #define DPRINTF(x) 69 #define DPRINTFN(n, x) 70 #endif 71 72 /* 73 * Recognized device vendors/products. 74 */ 75 static const struct urtw_type { 76 struct usb_devno dev; 77 uint8_t rev; 78 } urtw_devs[] = { 79 #define URTW_DEV_RTL8187(v, p) \ 80 { { USB_VENDOR_##v, USB_PRODUCT_##v##_##p }, URTW_HWREV_8187 } 81 #define URTW_DEV_RTL8187B(v, p) \ 82 { { USB_VENDOR_##v, USB_PRODUCT_##v##_##p }, URTW_HWREV_8187B } 83 /* Realtek RTL8187 devices. */ 84 URTW_DEV_RTL8187(ASUSTEK, P5B_WIFI), 85 URTW_DEV_RTL8187(DICKSMITH, RTL8187), 86 URTW_DEV_RTL8187(LINKSYS4, WUSB54GC_2), 87 URTW_DEV_RTL8187(LOGITEC, RTL8187), 88 URTW_DEV_RTL8187(NETGEAR, WG111V2), 89 URTW_DEV_RTL8187(REALTEK, RTL8187), 90 URTW_DEV_RTL8187(SITECOMEU, WL168V1), 91 URTW_DEV_RTL8187(SPHAIRON, RTL8187), 92 URTW_DEV_RTL8187(SURECOM, EP9001G2A), 93 /* Realtek RTL8187B devices. */ 94 URTW_DEV_RTL8187B(BELKIN, F5D7050E), 95 URTW_DEV_RTL8187B(NETGEAR, WG111V3), 96 URTW_DEV_RTL8187B(REALTEK, RTL8187B_0), 97 URTW_DEV_RTL8187B(REALTEK, RTL8187B_1), 98 URTW_DEV_RTL8187B(REALTEK, RTL8187B_2), 99 URTW_DEV_RTL8187B(SITECOMEU, WL168V4) 100 #undef URTW_DEV_RTL8187 101 #undef URTW_DEV_RTL8187B 102 }; 103 #define urtw_lookup(v, p) \ 104 ((const struct urtw_type *)usb_lookup(urtw_devs, v, p)) 105 106 /* 107 * Helper read/write macros. 108 */ 109 #define urtw_read8_m(sc, val, data) do { \ 110 error = urtw_read8_c(sc, val, data, 0); \ 111 if (error != 0) \ 112 goto fail; \ 113 } while (0) 114 #define urtw_read8_idx_m(sc, val, data, idx) do { \ 115 error = urtw_read8_c(sc, val, data, idx); \ 116 if (error != 0) \ 117 goto fail; \ 118 } while (0) 119 #define urtw_write8_m(sc, val, data) do { \ 120 error = urtw_write8_c(sc, val, data, 0); \ 121 if (error != 0) \ 122 goto fail; \ 123 } while (0) 124 #define urtw_write8_idx_m(sc, val, data, idx) do { \ 125 error = urtw_write8_c(sc, val, data, idx); \ 126 if (error != 0) \ 127 goto fail; \ 128 } while (0) 129 #define urtw_read16_m(sc, val, data) do { \ 130 error = urtw_read16_c(sc, val, data, 0); \ 131 if (error != 0) \ 132 goto fail; \ 133 } while (0) 134 #define urtw_read16_idx_m(sc, val, data, idx) do { \ 135 error = urtw_read16_c(sc, val, data, idx); \ 136 if (error != 0) \ 137 goto fail; \ 138 } while (0) 139 #define urtw_write16_m(sc, val, data) do { \ 140 error = urtw_write16_c(sc, val, data, 0); \ 141 if (error != 0) \ 142 goto fail; \ 143 } while (0) 144 #define urtw_write16_idx_m(sc, val, data, idx) do { \ 145 error = urtw_write16_c(sc, val, data, idx); \ 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, 0); \ 151 if (error != 0) \ 152 goto fail; \ 153 } while (0) 154 #define urtw_read32_idx_m(sc, val, data, idx) do { \ 155 error = urtw_read32_c(sc, val, data, idx); \ 156 if (error != 0) \ 157 goto fail; \ 158 } while (0) 159 #define urtw_write32_m(sc, val, data) do { \ 160 error = urtw_write32_c(sc, val, data, 0); \ 161 if (error != 0) \ 162 goto fail; \ 163 } while (0) 164 #define urtw_write32_idx_m(sc, val, data, idx) do { \ 165 error = urtw_write32_c(sc, val, data, idx); \ 166 if (error != 0) \ 167 goto fail; \ 168 } while (0) 169 #define urtw_8187_write_phy_ofdm(sc, val, data) do { \ 170 error = urtw_8187_write_phy_ofdm_c(sc, val, data); \ 171 if (error != 0) \ 172 goto fail; \ 173 } while (0) 174 #define urtw_8187_write_phy_cck(sc, val, data) do { \ 175 error = urtw_8187_write_phy_cck_c(sc, val, data); \ 176 if (error != 0) \ 177 goto fail; \ 178 } while (0) 179 #define urtw_8225_write(sc, val, data) do { \ 180 error = urtw_8225_write_c(sc, val, data); \ 181 if (error != 0) \ 182 goto fail; \ 183 } while (0) 184 185 struct urtw_pair { 186 uint32_t reg; 187 uint32_t val; 188 }; 189 190 struct urtw_pair_idx { 191 uint8_t reg; 192 uint8_t val; 193 uint8_t idx; 194 }; 195 196 static struct urtw_pair_idx urtw_8187b_regtbl[] = { 197 { 0xf0, 0x32, 0 }, { 0xf1, 0x32, 0 }, { 0xf2, 0x00, 0 }, 198 { 0xf3, 0x00, 0 }, { 0xf4, 0x32, 0 }, { 0xf5, 0x43, 0 }, 199 { 0xf6, 0x00, 0 }, { 0xf7, 0x00, 0 }, { 0xf8, 0x46, 0 }, 200 { 0xf9, 0xa4, 0 }, { 0xfa, 0x00, 0 }, { 0xfb, 0x00, 0 }, 201 { 0xfc, 0x96, 0 }, { 0xfd, 0xa4, 0 }, { 0xfe, 0x00, 0 }, 202 { 0xff, 0x00, 0 }, 203 204 { 0x58, 0x4b, 1 }, { 0x59, 0x00, 1 }, { 0x5a, 0x4b, 1 }, 205 { 0x5b, 0x00, 1 }, { 0x60, 0x4b, 1 }, { 0x61, 0x09, 1 }, 206 { 0x62, 0x4b, 1 }, { 0x63, 0x09, 1 }, { 0xce, 0x0f, 1 }, 207 { 0xcf, 0x00, 1 }, { 0xe0, 0xff, 1 }, { 0xe1, 0x0f, 1 }, 208 { 0xe2, 0x00, 1 }, { 0xf0, 0x4e, 1 }, { 0xf1, 0x01, 1 }, 209 { 0xf2, 0x02, 1 }, { 0xf3, 0x03, 1 }, { 0xf4, 0x04, 1 }, 210 { 0xf5, 0x05, 1 }, { 0xf6, 0x06, 1 }, { 0xf7, 0x07, 1 }, 211 { 0xf8, 0x08, 1 }, 212 213 { 0x4e, 0x00, 2 }, { 0x0c, 0x04, 2 }, { 0x21, 0x61, 2 }, 214 { 0x22, 0x68, 2 }, { 0x23, 0x6f, 2 }, { 0x24, 0x76, 2 }, 215 { 0x25, 0x7d, 2 }, { 0x26, 0x84, 2 }, { 0x27, 0x8d, 2 }, 216 { 0x4d, 0x08, 2 }, { 0x50, 0x05, 2 }, { 0x51, 0xf5, 2 }, 217 { 0x52, 0x04, 2 }, { 0x53, 0xa0, 2 }, { 0x54, 0x1f, 2 }, 218 { 0x55, 0x23, 2 }, { 0x56, 0x45, 2 }, { 0x57, 0x67, 2 }, 219 { 0x58, 0x08, 2 }, { 0x59, 0x08, 2 }, { 0x5a, 0x08, 2 }, 220 { 0x5b, 0x08, 2 }, { 0x60, 0x08, 2 }, { 0x61, 0x08, 2 }, 221 { 0x62, 0x08, 2 }, { 0x63, 0x08, 2 }, { 0x64, 0xcf, 2 }, 222 { 0x72, 0x56, 2 }, { 0x73, 0x9a, 2 }, 223 224 { 0x34, 0xf0, 0 }, { 0x35, 0x0f, 0 }, { 0x5b, 0x40, 0 }, 225 { 0x84, 0x88, 0 }, { 0x85, 0x24, 0 }, { 0x88, 0x54, 0 }, 226 { 0x8b, 0xb8, 0 }, { 0x8c, 0x07, 0 }, { 0x8d, 0x00, 0 }, 227 { 0x94, 0x1b, 0 }, { 0x95, 0x12, 0 }, { 0x96, 0x00, 0 }, 228 { 0x97, 0x06, 0 }, { 0x9d, 0x1a, 0 }, { 0x9f, 0x10, 0 }, 229 { 0xb4, 0x22, 0 }, { 0xbe, 0x80, 0 }, { 0xdb, 0x00, 0 }, 230 { 0xee, 0x00, 0 }, { 0x91, 0x03, 0 }, 231 232 { 0x4c, 0x00, 2 }, { 0x9f, 0x00, 3 }, { 0x8c, 0x01, 0 }, 233 { 0x8d, 0x10, 0 }, { 0x8e, 0x08, 0 }, { 0x8f, 0x00, 0 } 234 }; 235 236 static uint8_t urtw_8225_agc[] = { 237 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9d, 0x9c, 0x9b, 238 0x9a, 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90, 239 0x8f, 0x8e, 0x8d, 0x8c, 0x8b, 0x8a, 0x89, 0x88, 0x87, 0x86, 0x85, 240 0x84, 0x83, 0x82, 0x81, 0x80, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 241 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30, 0x2f, 242 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 243 0x23, 0x22, 0x21, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 244 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 245 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 246 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 247 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 248 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 249 }; 250 251 static uint32_t urtw_8225_channel[] = { 252 0x0000, /* dummy channel 0 */ 253 0x085c, /* 1 */ 254 0x08dc, /* 2 */ 255 0x095c, /* 3 */ 256 0x09dc, /* 4 */ 257 0x0a5c, /* 5 */ 258 0x0adc, /* 6 */ 259 0x0b5c, /* 7 */ 260 0x0bdc, /* 8 */ 261 0x0c5c, /* 9 */ 262 0x0cdc, /* 10 */ 263 0x0d5c, /* 11 */ 264 0x0ddc, /* 12 */ 265 0x0e5c, /* 13 */ 266 0x0f72, /* 14 */ 267 }; 268 269 static uint8_t urtw_8225_gain[] = { 270 0x23, 0x88, 0x7c, 0xa5, /* -82dbm */ 271 0x23, 0x88, 0x7c, 0xb5, /* -82dbm */ 272 0x23, 0x88, 0x7c, 0xc5, /* -82dbm */ 273 0x33, 0x80, 0x79, 0xc5, /* -78dbm */ 274 0x43, 0x78, 0x76, 0xc5, /* -74dbm */ 275 0x53, 0x60, 0x73, 0xc5, /* -70dbm */ 276 0x63, 0x58, 0x70, 0xc5, /* -66dbm */ 277 }; 278 279 static struct urtw_pair urtw_8225_rf_part1[] = { 280 { 0x00, 0x0067 }, { 0x01, 0x0fe0 }, { 0x02, 0x044d }, { 0x03, 0x0441 }, 281 { 0x04, 0x0486 }, { 0x05, 0x0bc0 }, { 0x06, 0x0ae6 }, { 0x07, 0x082a }, 282 { 0x08, 0x001f }, { 0x09, 0x0334 }, { 0x0a, 0x0fd4 }, { 0x0b, 0x0391 }, 283 { 0x0c, 0x0050 }, { 0x0d, 0x06db }, { 0x0e, 0x0029 }, { 0x0f, 0x0914 } 284 }; 285 286 static struct urtw_pair urtw_8225_rf_part2[] = { 287 { 0x00, 0x01 }, { 0x01, 0x02 }, { 0x02, 0x42 }, { 0x03, 0x00 }, 288 { 0x04, 0x00 }, { 0x05, 0x00 }, { 0x06, 0x40 }, { 0x07, 0x00 }, 289 { 0x08, 0x40 }, { 0x09, 0xfe }, { 0x0a, 0x09 }, { 0x0b, 0x80 }, 290 { 0x0c, 0x01 }, { 0x0e, 0xd3 }, { 0x0f, 0x38 }, { 0x10, 0x84 }, 291 { 0x11, 0x06 }, { 0x12, 0x20 }, { 0x13, 0x20 }, { 0x14, 0x00 }, 292 { 0x15, 0x40 }, { 0x16, 0x00 }, { 0x17, 0x40 }, { 0x18, 0xef }, 293 { 0x19, 0x19 }, { 0x1a, 0x20 }, { 0x1b, 0x76 }, { 0x1c, 0x04 }, 294 { 0x1e, 0x95 }, { 0x1f, 0x75 }, { 0x20, 0x1f }, { 0x21, 0x27 }, 295 { 0x22, 0x16 }, { 0x24, 0x46 }, { 0x25, 0x20 }, { 0x26, 0x90 }, 296 { 0x27, 0x88 } 297 }; 298 299 static struct urtw_pair urtw_8225_rf_part3[] = { 300 { 0x00, 0x98 }, { 0x03, 0x20 }, { 0x04, 0x7e }, { 0x05, 0x12 }, 301 { 0x06, 0xfc }, { 0x07, 0x78 }, { 0x08, 0x2e }, { 0x10, 0x9b }, 302 { 0x11, 0x88 }, { 0x12, 0x47 }, { 0x13, 0xd0 }, { 0x19, 0x00 }, 303 { 0x1a, 0xa0 }, { 0x1b, 0x08 }, { 0x40, 0x86 }, { 0x41, 0x8d }, 304 { 0x42, 0x15 }, { 0x43, 0x18 }, { 0x44, 0x1f }, { 0x45, 0x1e }, 305 { 0x46, 0x1a }, { 0x47, 0x15 }, { 0x48, 0x10 }, { 0x49, 0x0a }, 306 { 0x4a, 0x05 }, { 0x4b, 0x02 }, { 0x4c, 0x05 } 307 }; 308 309 static uint16_t urtw_8225_rxgain[] = { 310 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409, 311 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, 312 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583, 313 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, 314 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688, 315 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745, 316 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789, 317 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793, 318 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, 319 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, 320 0x07aa, 0x07ab, 0x07ac, 0x07ad, 0x07b0, 0x07b1, 0x07b2, 0x07b3, 321 0x07b4, 0x07b5, 0x07b8, 0x07b9, 0x07ba, 0x07bb, 0x07bb 322 }; 323 324 static uint8_t urtw_8225_threshold[] = { 325 0x8d, 0x8d, 0x8d, 0x8d, 0x9d, 0xad, 0xbd 326 }; 327 328 static uint8_t urtw_8225_tx_gain_cck_ofdm[] = { 329 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0x7e 330 }; 331 332 static uint8_t urtw_8225_txpwr_cck[] = { 333 0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02, 334 0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02, 335 0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02, 336 0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02, 337 0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03, 338 0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03 339 }; 340 341 static uint8_t urtw_8225_txpwr_cck_ch14[] = { 342 0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00, 343 0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00, 344 0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00, 345 0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00, 346 0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00, 347 0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00 348 }; 349 350 static uint8_t urtw_8225_txpwr_ofdm[] = { 351 0x80, 0x90, 0xa2, 0xb5, 0xcb, 0xe4 352 }; 353 354 static uint8_t urtw_8225v2_agc[] = { 355 0x5e, 0x5e, 0x5e, 0x5e, 0x5d, 0x5b, 0x59, 0x57, 356 0x55, 0x53, 0x51, 0x4f, 0x4d, 0x4b, 0x49, 0x47, 357 0x45, 0x43, 0x41, 0x3f, 0x3d, 0x3b, 0x39, 0x37, 358 0x35, 0x33, 0x31, 0x2f, 0x2d, 0x2b, 0x29, 0x27, 359 0x25, 0x23, 0x21, 0x1f, 0x1d, 0x1b, 0x19, 0x17, 360 0x15, 0x13, 0x11, 0x0f, 0x0d, 0x0b, 0x09, 0x07, 361 0x05, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 362 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 363 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 364 0x19, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 365 0x26, 0x27, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2a, 366 0x2a, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2d, 367 0x2d, 0x2d, 0x2d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 368 0x2f, 0x2f, 0x30, 0x30, 0x31, 0x31, 0x31, 0x31, 369 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 370 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31 371 }; 372 373 static uint8_t urtw_8225v2_ofdm[] = { 374 0x10, 0x0d, 0x01, 0x00, 0x14, 0xfb, 0xfb, 0x60, 375 0x00, 0x60, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 376 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0xa8, 0x26, 377 0x32, 0x33, 0x07, 0xa5, 0x6f, 0x55, 0xc8, 0xb3, 378 0x0a, 0xe1, 0x2c, 0x8a, 0x86, 0x83, 0x34, 0x0f, 379 0x4f, 0x24, 0x6f, 0xc2, 0x6b, 0x40, 0x80, 0x00, 380 0xc0, 0xc1, 0x58, 0xf1, 0x00, 0xe4, 0x90, 0x3e, 381 0x6d, 0x3c, 0xfb, 0x07 382 }; 383 384 static uint8_t urtw_8225v2_gain_bg[] = { 385 0x23, 0x15, 0xa5, /* -82-1dbm */ 386 0x23, 0x15, 0xb5, /* -82-2dbm */ 387 0x23, 0x15, 0xc5, /* -82-3dbm */ 388 0x33, 0x15, 0xc5, /* -78dbm */ 389 0x43, 0x15, 0xc5, /* -74dbm */ 390 0x53, 0x15, 0xc5, /* -70dbm */ 391 0x63, 0x15, 0xc5, /* -66dbm */ 392 }; 393 394 static struct urtw_pair urtw_8225v2_rf_part1[] = { 395 { 0x00, 0x02bf }, { 0x01, 0x0ee0 }, { 0x02, 0x044d }, { 0x03, 0x0441 }, 396 { 0x04, 0x08c3 }, { 0x05, 0x0c72 }, { 0x06, 0x00e6 }, { 0x07, 0x082a }, 397 { 0x08, 0x003f }, { 0x09, 0x0335 }, { 0x0a, 0x09d4 }, { 0x0b, 0x07bb }, 398 { 0x0c, 0x0850 }, { 0x0d, 0x0cdf }, { 0x0e, 0x002b }, { 0x0f, 0x0114 } 399 }; 400 401 static struct urtw_pair urtw_8225v2_rf_part2[] = { 402 { 0x00, 0x01 }, { 0x01, 0x02 }, { 0x02, 0x42 }, { 0x03, 0x00 }, 403 { 0x04, 0x00 }, { 0x05, 0x00 }, { 0x06, 0x40 }, { 0x07, 0x00 }, 404 { 0x08, 0x40 }, { 0x09, 0xfe }, { 0x0a, 0x08 }, { 0x0b, 0x80 }, 405 { 0x0c, 0x01 }, { 0x0d, 0x43 }, { 0x0e, 0xd3 }, { 0x0f, 0x38 }, 406 { 0x10, 0x84 }, { 0x11, 0x07 }, { 0x12, 0x20 }, { 0x13, 0x20 }, 407 { 0x14, 0x00 }, { 0x15, 0x40 }, { 0x16, 0x00 }, { 0x17, 0x40 }, 408 { 0x18, 0xef }, { 0x19, 0x19 }, { 0x1a, 0x20 }, { 0x1b, 0x15 }, 409 { 0x1c, 0x04 }, { 0x1d, 0xc5 }, { 0x1e, 0x95 }, { 0x1f, 0x75 }, 410 { 0x20, 0x1f }, { 0x21, 0x17 }, { 0x22, 0x16 }, { 0x23, 0x80 }, 411 { 0x24, 0x46 }, { 0x25, 0x00 }, { 0x26, 0x90 }, { 0x27, 0x88 } 412 }; 413 414 static struct urtw_pair urtw_8225v2_rf_part3[] = { 415 { 0x00, 0x98 }, { 0x03, 0x20 }, { 0x04, 0x7e }, { 0x05, 0x12 }, 416 { 0x06, 0xfc }, { 0x07, 0x78 }, { 0x08, 0x2e }, { 0x09, 0x11 }, 417 { 0x0a, 0x17 }, { 0x0b, 0x11 }, { 0x10, 0x9b }, { 0x11, 0x88 }, 418 { 0x12, 0x47 }, { 0x13, 0xd0 }, { 0x19, 0x00 }, { 0x1a, 0xa0 }, 419 { 0x1b, 0x08 }, { 0x1d, 0x00 }, { 0x40, 0x86 }, { 0x41, 0x9d }, 420 { 0x42, 0x15 }, { 0x43, 0x18 }, { 0x44, 0x36 }, { 0x45, 0x35 }, 421 { 0x46, 0x2e }, { 0x47, 0x25 }, { 0x48, 0x1c }, { 0x49, 0x12 }, 422 { 0x4a, 0x09 }, { 0x4b, 0x04 }, { 0x4c, 0x05 } 423 }; 424 425 static uint16_t urtw_8225v2_rxgain[] = { 426 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409, 427 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, 428 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583, 429 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, 430 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688, 431 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745, 432 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789, 433 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793, 434 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, 435 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, 436 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 437 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb 438 }; 439 440 static uint8_t urtw_8225v2_tx_gain_cck_ofdm[] = { 441 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 442 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 443 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 444 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 445 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 446 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23 447 }; 448 449 static uint8_t urtw_8225v2_txpwr_cck[] = { 450 0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04, 451 0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03, 452 0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03, 453 0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03 454 }; 455 456 static uint8_t urtw_8225v2_txpwr_cck_ch14[] = { 457 0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00, 458 0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00, 459 0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00, 460 0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00 461 }; 462 463 static struct urtw_pair urtw_8225v2_b_rf[] = { 464 { 0x00, 0x00b7 }, { 0x01, 0x0ee0 }, { 0x02, 0x044d }, { 0x03, 0x0441 }, 465 { 0x04, 0x08c3 }, { 0x05, 0x0c72 }, { 0x06, 0x00e6 }, { 0x07, 0x082a }, 466 { 0x08, 0x003f }, { 0x09, 0x0335 }, { 0x0a, 0x09d4 }, { 0x0b, 0x07bb }, 467 { 0x0c, 0x0850 }, { 0x0d, 0x0cdf }, { 0x0e, 0x002b }, { 0x0f, 0x0114 }, 468 { 0x00, 0x01b7 } 469 }; 470 471 static struct urtw_pair urtw_ratetable[] = { 472 { 2, 0 }, { 4, 1 }, { 11, 2 }, { 12, 4 }, { 18, 5 }, 473 { 22, 3 }, { 24, 6 }, { 36, 7 }, { 48, 8 }, { 72, 9 }, 474 { 96, 10 }, { 108, 11 } 475 }; 476 477 int urtw_init(struct ifnet *); 478 void urtw_stop(struct ifnet *, int); 479 int urtw_ioctl(struct ifnet *, u_long, void *); 480 void urtw_start(struct ifnet *); 481 int urtw_alloc_rx_data_list(struct urtw_softc *); 482 void urtw_free_rx_data_list(struct urtw_softc *); 483 int urtw_alloc_tx_data_list(struct urtw_softc *); 484 void urtw_free_tx_data_list(struct urtw_softc *); 485 void urtw_rxeof(struct usbd_xfer *, void *, 486 usbd_status); 487 int urtw_tx_start(struct urtw_softc *, 488 struct ieee80211_node *, struct mbuf *, int); 489 void urtw_txeof_low(struct usbd_xfer *, void *, 490 usbd_status); 491 void urtw_txeof_normal(struct usbd_xfer *, void *, 492 usbd_status); 493 void urtw_next_scan(void *); 494 void urtw_task(void *); 495 void urtw_ledusbtask(void *); 496 void urtw_ledtask(void *); 497 int urtw_media_change(struct ifnet *); 498 int urtw_newstate(struct ieee80211com *, enum ieee80211_state, int); 499 void urtw_watchdog(struct ifnet *); 500 void urtw_set_chan(struct urtw_softc *, struct ieee80211_channel *); 501 int urtw_isbmode(uint16_t); 502 uint16_t urtw_rate2rtl(int); 503 uint16_t urtw_rtl2rate(int); 504 usbd_status urtw_set_rate(struct urtw_softc *); 505 usbd_status urtw_update_msr(struct urtw_softc *); 506 usbd_status urtw_read8_c(struct urtw_softc *, int, uint8_t *, uint8_t); 507 usbd_status urtw_read16_c(struct urtw_softc *, int, uint16_t *, uint8_t); 508 usbd_status urtw_read32_c(struct urtw_softc *, int, uint32_t *, uint8_t); 509 usbd_status urtw_write8_c(struct urtw_softc *, int, uint8_t, uint8_t); 510 usbd_status urtw_write16_c(struct urtw_softc *, int, uint16_t, uint8_t); 511 usbd_status urtw_write32_c(struct urtw_softc *, int, uint32_t, uint8_t); 512 usbd_status urtw_eprom_cs(struct urtw_softc *, int); 513 usbd_status urtw_eprom_ck(struct urtw_softc *); 514 usbd_status urtw_eprom_sendbits(struct urtw_softc *, int16_t *, 515 int); 516 usbd_status urtw_eprom_read32(struct urtw_softc *, uint32_t, 517 uint32_t *); 518 usbd_status urtw_eprom_readbit(struct urtw_softc *, int16_t *); 519 usbd_status urtw_eprom_writebit(struct urtw_softc *, int16_t); 520 usbd_status urtw_get_macaddr(struct urtw_softc *); 521 usbd_status urtw_get_txpwr(struct urtw_softc *); 522 usbd_status urtw_get_rfchip(struct urtw_softc *); 523 usbd_status urtw_led_init(struct urtw_softc *); 524 usbd_status urtw_8185_rf_pins_enable(struct urtw_softc *); 525 usbd_status urtw_8185_tx_antenna(struct urtw_softc *, uint8_t); 526 usbd_status urtw_8187_write_phy(struct urtw_softc *, uint8_t, uint32_t); 527 usbd_status urtw_8187_write_phy_ofdm_c(struct urtw_softc *, uint8_t, 528 uint32_t); 529 usbd_status urtw_8187_write_phy_cck_c(struct urtw_softc *, uint8_t, 530 uint32_t); 531 usbd_status urtw_8225_setgain(struct urtw_softc *, int16_t); 532 usbd_status urtw_8225_usb_init(struct urtw_softc *); 533 usbd_status urtw_8225_write_c(struct urtw_softc *, uint8_t, uint16_t); 534 usbd_status urtw_8225_write_s16(struct urtw_softc *, uint8_t, int, 535 uint16_t); 536 usbd_status urtw_8225_read(struct urtw_softc *, uint8_t, uint32_t *); 537 usbd_status urtw_8225_rf_init(struct urtw_rf *); 538 usbd_status urtw_8225_rf_set_chan(struct urtw_rf *, int); 539 usbd_status urtw_8225_rf_set_sens(struct urtw_rf *); 540 usbd_status urtw_8225_set_txpwrlvl(struct urtw_softc *, int); 541 usbd_status urtw_8225v2_rf_init(struct urtw_rf *); 542 usbd_status urtw_8225v2_rf_set_chan(struct urtw_rf *, int); 543 usbd_status urtw_8225v2_set_txpwrlvl(struct urtw_softc *, int); 544 usbd_status urtw_8225v2_setgain(struct urtw_softc *, int16_t); 545 usbd_status urtw_8225_isv2(struct urtw_softc *, int *); 546 usbd_status urtw_read8e(struct urtw_softc *, int, uint8_t *); 547 usbd_status urtw_write8e(struct urtw_softc *, int, uint8_t); 548 usbd_status urtw_8180_set_anaparam(struct urtw_softc *, uint32_t); 549 usbd_status urtw_8185_set_anaparam2(struct urtw_softc *, uint32_t); 550 usbd_status urtw_open_pipes(struct urtw_softc *); 551 usbd_status urtw_close_pipes(struct urtw_softc *); 552 usbd_status urtw_intr_enable(struct urtw_softc *); 553 usbd_status urtw_intr_disable(struct urtw_softc *); 554 usbd_status urtw_reset(struct urtw_softc *); 555 usbd_status urtw_led_on(struct urtw_softc *, int); 556 usbd_status urtw_led_ctl(struct urtw_softc *, int); 557 usbd_status urtw_led_blink(struct urtw_softc *); 558 usbd_status urtw_led_mode0(struct urtw_softc *, int); 559 usbd_status urtw_led_mode1(struct urtw_softc *, int); 560 usbd_status urtw_led_mode2(struct urtw_softc *, int); 561 usbd_status urtw_led_mode3(struct urtw_softc *, int); 562 usbd_status urtw_rx_setconf(struct urtw_softc *); 563 usbd_status urtw_rx_enable(struct urtw_softc *); 564 usbd_status urtw_tx_enable(struct urtw_softc *); 565 usbd_status urtw_8187b_update_wmm(struct urtw_softc *); 566 usbd_status urtw_8187b_reset(struct urtw_softc *); 567 int urtw_8187b_init(struct ifnet *); 568 usbd_status urtw_8225v2_b_config_mac(struct urtw_softc *); 569 usbd_status urtw_8225v2_b_init_rfe(struct urtw_softc *); 570 usbd_status urtw_8225v2_b_update_chan(struct urtw_softc *); 571 usbd_status urtw_8225v2_b_rf_init(struct urtw_rf *); 572 usbd_status urtw_8225v2_b_rf_set_chan(struct urtw_rf *, int); 573 usbd_status urtw_8225v2_b_set_txpwrlvl(struct urtw_softc *, int); 574 int urtw_set_bssid(struct urtw_softc *, const uint8_t *); 575 int urtw_set_macaddr(struct urtw_softc *, const uint8_t *); 576 577 int urtw_match(device_t, cfdata_t, void *); 578 void urtw_attach(device_t, device_t, void *); 579 int urtw_detach(device_t, int); 580 int urtw_activate(device_t, enum devact); 581 582 CFATTACH_DECL_NEW(urtw, sizeof(struct urtw_softc), 583 urtw_match, 584 urtw_attach, 585 urtw_detach, 586 urtw_activate 587 ); 588 589 int 590 urtw_match(device_t parent, cfdata_t match, void *aux) 591 { 592 struct usb_attach_arg *uaa = aux; 593 594 return urtw_lookup(uaa->uaa_vendor, uaa->uaa_product) != NULL ? 595 UMATCH_VENDOR_PRODUCT : UMATCH_NONE; 596 } 597 598 void 599 urtw_attach(device_t parent, device_t self, void *aux) 600 { 601 struct urtw_softc *sc = device_private(self); 602 struct usb_attach_arg *uaa = aux; 603 struct ieee80211com *ic = &sc->sc_ic; 604 struct ifnet *ifp = &sc->sc_if; 605 usbd_status error; 606 uint8_t data8; 607 uint32_t data; 608 int i; 609 610 sc->sc_dev = self; 611 sc->sc_udev = uaa->uaa_device; 612 sc->sc_hwrev = urtw_lookup(uaa->uaa_vendor, uaa->uaa_product)->rev; 613 614 printf(": "); 615 616 if (sc->sc_hwrev & URTW_HWREV_8187) { 617 urtw_read32_m(sc, URTW_TX_CONF, &data); 618 data &= URTW_TX_HWREV_MASK; 619 switch (data) { 620 case URTW_TX_HWREV_8187_D: 621 sc->sc_hwrev |= URTW_HWREV_8187_D; 622 printf("RTL8187 rev D"); 623 break; 624 case URTW_TX_HWREV_8187B_D: 625 /* 626 * Detect Realtek RTL8187B devices that use 627 * USB IDs of RTL8187. 628 */ 629 sc->sc_hwrev = URTW_HWREV_8187B | URTW_HWREV_8187B_B; 630 printf("RTL8187B rev B (early)"); 631 break; 632 default: 633 sc->sc_hwrev |= URTW_HWREV_8187_B; 634 printf("RTL8187 rev 0x%02x", data >> 25); 635 break; 636 } 637 } else { 638 /* RTL8187B hwrev register. */ 639 urtw_read8_m(sc, URTW_8187B_HWREV, &data8); 640 switch (data8) { 641 case URTW_8187B_HWREV_8187B_B: 642 sc->sc_hwrev |= URTW_HWREV_8187B_B; 643 printf("RTL8187B rev B"); 644 break; 645 case URTW_8187B_HWREV_8187B_D: 646 sc->sc_hwrev |= URTW_HWREV_8187B_D; 647 printf("RTL8187B rev D"); 648 break; 649 case URTW_8187B_HWREV_8187B_E: 650 sc->sc_hwrev |= URTW_HWREV_8187B_E; 651 printf("RTL8187B rev E"); 652 break; 653 default: 654 sc->sc_hwrev |= URTW_HWREV_8187B_B; 655 printf("RTL8187B rev 0x%02x", data8); 656 break; 657 } 658 } 659 660 urtw_read32_m(sc, URTW_RX, &data); 661 sc->sc_epromtype = (data & URTW_RX_9356SEL) ? URTW_EEPROM_93C56 : 662 URTW_EEPROM_93C46; 663 664 error = urtw_get_rfchip(sc); 665 if (error != 0) 666 goto fail; 667 error = urtw_get_macaddr(sc); 668 if (error != 0) 669 goto fail; 670 error = urtw_get_txpwr(sc); 671 if (error != 0) 672 goto fail; 673 error = urtw_led_init(sc); /* XXX incompleted */ 674 if (error != 0) 675 goto fail; 676 677 sc->sc_rts_retry = URTW_DEFAULT_RTS_RETRY; 678 sc->sc_tx_retry = URTW_DEFAULT_TX_RETRY; 679 sc->sc_currate = 3; 680 /* XXX for what? */ 681 sc->sc_preamble_mode = 2; 682 683 usb_init_task(&sc->sc_task, urtw_task, sc, 0); 684 usb_init_task(&sc->sc_ledtask, urtw_ledusbtask, sc, 0); 685 callout_init(&sc->scan_to, 0); 686 callout_setfunc(&sc->scan_to, urtw_next_scan, sc); 687 callout_init(&sc->sc_led_ch, 0); 688 callout_setfunc(&sc->sc_led_ch, urtw_ledtask, sc); 689 690 ic->ic_ifp = ifp; 691 ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */ 692 ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */ 693 ic->ic_state = IEEE80211_S_INIT; 694 695 /* set device capabilities */ 696 ic->ic_caps = 697 IEEE80211_C_MONITOR | /* monitor mode supported */ 698 IEEE80211_C_TXPMGT | /* tx power management */ 699 IEEE80211_C_SHPREAMBLE | /* short preamble supported */ 700 IEEE80211_C_SHSLOT | /* short slot time supported */ 701 IEEE80211_C_WEP | /* s/w WEP */ 702 IEEE80211_C_WPA; /* WPA/RSN */ 703 704 /* set supported .11b and .11g rates */ 705 ic->ic_sup_rates[IEEE80211_MODE_11B] = ieee80211_std_rateset_11b; 706 ic->ic_sup_rates[IEEE80211_MODE_11G] = ieee80211_std_rateset_11g; 707 708 /* set supported .11b and .11g channels (1 through 14) */ 709 for (i = 1; i <= 14; i++) { 710 ic->ic_channels[i].ic_freq = 711 ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ); 712 ic->ic_channels[i].ic_flags = 713 IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM | 714 IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ; 715 } 716 717 ifp->if_softc = sc; 718 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 719 if (sc->sc_hwrev & URTW_HWREV_8187) { 720 ifp->if_init = urtw_init; 721 } else { 722 ifp->if_init = urtw_8187b_init; 723 } 724 ifp->if_ioctl = urtw_ioctl; 725 ifp->if_start = urtw_start; 726 ifp->if_watchdog = urtw_watchdog; 727 IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); 728 IFQ_SET_READY(&ifp->if_snd); 729 memcpy(ifp->if_xname, device_xname(self), IFNAMSIZ); 730 731 if_attach(ifp); 732 ieee80211_ifattach(ic); 733 734 /* override state transition machine */ 735 sc->sc_newstate = ic->ic_newstate; 736 ic->ic_newstate = urtw_newstate; 737 ieee80211_media_init(ic, urtw_media_change, ieee80211_media_status); 738 739 bpf_attach2(ifp, DLT_IEEE802_11_RADIO, 740 sizeof(struct ieee80211_frame) + IEEE80211_RADIOTAP_HDRLEN, 741 &sc->sc_drvbpf); 742 743 sc->sc_rxtap_len = sizeof(sc->sc_rxtapu); 744 sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len); 745 sc->sc_rxtap.wr_ihdr.it_present = htole32(URTW_RX_RADIOTAP_PRESENT); 746 747 sc->sc_txtap_len = sizeof(sc->sc_txtapu); 748 sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len); 749 sc->sc_txtap.wt_ihdr.it_present = htole32(URTW_TX_RADIOTAP_PRESENT); 750 751 printf(", address %s\n", ether_sprintf(ic->ic_myaddr)); 752 753 ieee80211_announce(ic); 754 755 return; 756 fail: 757 printf(": %s failed!\n", __func__); 758 sc->sc_dying = true; 759 } 760 761 int 762 urtw_detach(device_t self, int flags) 763 { 764 struct urtw_softc *sc = device_private(self); 765 struct ifnet *ifp = &sc->sc_if; 766 int s; 767 768 s = splusb(); 769 770 sc->sc_dying = true; 771 772 callout_destroy(&sc->scan_to); 773 callout_destroy(&sc->sc_led_ch); 774 775 usb_rem_task(sc->sc_udev, &sc->sc_task); 776 usb_rem_task(sc->sc_udev, &sc->sc_ledtask); 777 778 if (ifp->if_softc != NULL) { 779 bpf_detach(ifp); 780 ieee80211_ifdetach(&sc->sc_ic); /* free all nodes */ 781 if_detach(ifp); 782 } 783 784 /* abort and free xfers */ 785 urtw_free_tx_data_list(sc); 786 urtw_free_rx_data_list(sc); 787 urtw_close_pipes(sc); 788 789 splx(s); 790 791 return 0; 792 } 793 794 int 795 urtw_activate(device_t self, enum devact act) 796 { 797 struct urtw_softc *sc = device_private(self); 798 799 switch (act) { 800 case DVACT_DEACTIVATE: 801 sc->sc_dying = true; 802 break; 803 } 804 805 return 0; 806 } 807 808 usbd_status 809 urtw_close_pipes(struct urtw_softc *sc) 810 { 811 usbd_status error = 0; 812 813 if (sc->sc_rxpipe != NULL) { 814 error = usbd_close_pipe(sc->sc_rxpipe); 815 if (error != 0) 816 goto fail; 817 sc->sc_rxpipe = NULL; 818 } 819 if (sc->sc_txpipe_low != NULL) { 820 error = usbd_close_pipe(sc->sc_txpipe_low); 821 if (error != 0) 822 goto fail; 823 sc->sc_txpipe_low = NULL; 824 } 825 if (sc->sc_txpipe_normal != NULL) { 826 error = usbd_close_pipe(sc->sc_txpipe_normal); 827 if (error != 0) 828 goto fail; 829 sc->sc_txpipe_normal = NULL; 830 } 831 fail: 832 return error; 833 } 834 835 usbd_status 836 urtw_open_pipes(struct urtw_softc *sc) 837 { 838 usbd_status error; 839 840 /* 841 * NB: there is no way to distinguish each pipes so we need to hardcode 842 * pipe numbers 843 */ 844 845 /* tx pipe - low priority packets */ 846 if (sc->sc_hwrev & URTW_HWREV_8187) 847 error = usbd_open_pipe(sc->sc_iface, 0x2, 848 USBD_EXCLUSIVE_USE, &sc->sc_txpipe_low); 849 else 850 error = usbd_open_pipe(sc->sc_iface, 0x6, 851 USBD_EXCLUSIVE_USE, &sc->sc_txpipe_low); 852 if (error != 0) { 853 printf("%s: could not open Tx low pipe: %s\n", 854 device_xname(sc->sc_dev), usbd_errstr(error)); 855 goto fail; 856 } 857 /* tx pipe - normal priority packets */ 858 if (sc->sc_hwrev & URTW_HWREV_8187) 859 error = usbd_open_pipe(sc->sc_iface, 0x3, 860 USBD_EXCLUSIVE_USE, &sc->sc_txpipe_normal); 861 else 862 error = usbd_open_pipe(sc->sc_iface, 0x7, 863 USBD_EXCLUSIVE_USE, &sc->sc_txpipe_normal); 864 if (error != 0) { 865 printf("%s: could not open Tx normal pipe: %s\n", 866 device_xname(sc->sc_dev), usbd_errstr(error)); 867 goto fail; 868 } 869 /* rx pipe */ 870 if (sc->sc_hwrev & URTW_HWREV_8187) 871 error = usbd_open_pipe(sc->sc_iface, 0x81, 872 USBD_EXCLUSIVE_USE, &sc->sc_rxpipe); 873 else 874 error = usbd_open_pipe(sc->sc_iface, 0x83, 875 USBD_EXCLUSIVE_USE, &sc->sc_rxpipe); 876 if (error != 0) { 877 printf("%s: could not open Rx pipe: %s\n", 878 device_xname(sc->sc_dev), usbd_errstr(error)); 879 goto fail; 880 } 881 882 return 0; 883 fail: 884 (void)urtw_close_pipes(sc); 885 return error; 886 } 887 888 int 889 urtw_alloc_rx_data_list(struct urtw_softc *sc) 890 { 891 int i, error; 892 893 for (i = 0; i < URTW_RX_DATA_LIST_COUNT; i++) { 894 struct urtw_rx_data *data = &sc->sc_rx_data[i]; 895 896 data->sc = sc; 897 898 error = usbd_create_xfer(sc->sc_rxpipe, MCLBYTES, 899 USBD_SHORT_XFER_OK, 0, &data->xfer); 900 if (error) { 901 902 printf("%s: could not allocate rx xfer\n", 903 device_xname(sc->sc_dev)); 904 error = ENOMEM; 905 goto fail; 906 } 907 908 MGETHDR(data->m, M_DONTWAIT, MT_DATA); 909 if (data->m == NULL) { 910 printf("%s: could not allocate rx mbuf\n", 911 device_xname(sc->sc_dev)); 912 error = ENOMEM; 913 goto fail; 914 } 915 MCLGET(data->m, M_DONTWAIT); 916 if (!(data->m->m_flags & M_EXT)) { 917 printf("%s: could not allocate rx mbuf cluster\n", 918 device_xname(sc->sc_dev)); 919 error = ENOMEM; 920 goto fail; 921 } 922 data->buf = mtod(data->m, uint8_t *); 923 } 924 925 return 0; 926 927 fail: 928 urtw_free_rx_data_list(sc); 929 return error; 930 } 931 932 void 933 urtw_free_rx_data_list(struct urtw_softc *sc) 934 { 935 int i; 936 937 /* Make sure no transfers are pending. */ 938 if (sc->sc_rxpipe != NULL) 939 usbd_abort_pipe(sc->sc_rxpipe); 940 941 for (i = 0; i < URTW_RX_DATA_LIST_COUNT; i++) { 942 struct urtw_rx_data *data = &sc->sc_rx_data[i]; 943 944 if (data->xfer != NULL) { 945 usbd_destroy_xfer(data->xfer); 946 data->xfer = NULL; 947 } 948 if (data->m != NULL) { 949 m_freem(data->m); 950 data->m = NULL; 951 } 952 } 953 } 954 955 int 956 urtw_alloc_tx_data_list(struct urtw_softc *sc) 957 { 958 int i, error; 959 960 for (size_t j = 0; j < URTW_PRIORITY_MAX; j++) { 961 for (i = 0; i < URTW_TX_DATA_LIST_COUNT; i++) { 962 struct urtw_tx_data *data = &sc->sc_tx_data[j][i]; 963 964 data->sc = sc; 965 data->ni = NULL; 966 967 error = usbd_create_xfer((j == URTW_PRIORITY_LOW) ? 968 sc->sc_txpipe_low : sc->sc_txpipe_normal, 969 URTW_TX_MAXSIZE, USBD_FORCE_SHORT_XFER, 0, 970 &data->xfer); 971 if (error) { 972 printf("%s: could not allocate tx xfer\n", 973 device_xname(sc->sc_dev)); 974 goto fail; 975 } 976 977 data->buf = usbd_get_buffer(data->xfer); 978 979 if (((unsigned long)data->buf) % 4) 980 printf("%s: warn: unaligned buffer %p\n", 981 device_xname(sc->sc_dev), data->buf); 982 } 983 } 984 985 return 0; 986 987 fail: 988 urtw_free_tx_data_list(sc); 989 return error; 990 } 991 992 void 993 urtw_free_tx_data_list(struct urtw_softc *sc) 994 { 995 int i; 996 997 /* Make sure no transfers are pending. */ 998 if (sc->sc_txpipe_low != NULL) 999 usbd_abort_pipe(sc->sc_txpipe_low); 1000 if (sc->sc_txpipe_normal != NULL) 1001 usbd_abort_pipe(sc->sc_txpipe_normal); 1002 1003 for (size_t j = 0; j < URTW_PRIORITY_MAX; j++) { 1004 for (i = 0; i < URTW_TX_DATA_LIST_COUNT; i++) { 1005 struct urtw_tx_data *data = &sc->sc_tx_data[j][i]; 1006 1007 if (data->xfer != NULL) { 1008 usbd_destroy_xfer(data->xfer); 1009 data->xfer = NULL; 1010 } 1011 if (data->ni != NULL) { 1012 ieee80211_free_node(data->ni); 1013 data->ni = NULL; 1014 } 1015 } 1016 } 1017 } 1018 1019 int 1020 urtw_media_change(struct ifnet *ifp) 1021 { 1022 int error; 1023 1024 error = ieee80211_media_change(ifp); 1025 if (error != ENETRESET) 1026 return error; 1027 1028 if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == 1029 (IFF_UP | IFF_RUNNING)) 1030 ifp->if_init(ifp); 1031 1032 return 0; 1033 } 1034 1035 int 1036 urtw_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg) 1037 { 1038 struct urtw_softc *sc = ic->ic_ifp->if_softc; 1039 1040 usb_rem_task(sc->sc_udev, &sc->sc_task); 1041 callout_stop(&sc->scan_to); 1042 1043 /* do it in a process context */ 1044 sc->sc_state = nstate; 1045 sc->sc_arg = arg; 1046 usb_add_task(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER); 1047 1048 return 0; 1049 } 1050 1051 usbd_status 1052 urtw_led_init(struct urtw_softc *sc) 1053 { 1054 uint32_t rev; 1055 usbd_status error; 1056 1057 urtw_read8_m(sc, URTW_PSR, &sc->sc_psr); 1058 error = urtw_eprom_read32(sc, URTW_EPROM_SWREV, &rev); 1059 if (error != 0) 1060 goto fail; 1061 1062 switch (rev & URTW_EPROM_CID_MASK) { 1063 case URTW_EPROM_CID_ALPHA0: 1064 sc->sc_strategy = URTW_SW_LED_MODE1; 1065 break; 1066 case URTW_EPROM_CID_SERCOMM_PS: 1067 sc->sc_strategy = URTW_SW_LED_MODE3; 1068 break; 1069 case URTW_EPROM_CID_HW_LED: 1070 sc->sc_strategy = URTW_HW_LED; 1071 break; 1072 case URTW_EPROM_CID_RSVD0: 1073 case URTW_EPROM_CID_RSVD1: 1074 default: 1075 sc->sc_strategy = URTW_SW_LED_MODE0; 1076 break; 1077 } 1078 1079 sc->sc_gpio_ledpin = URTW_LED_PIN_GPIO0; 1080 1081 fail: 1082 return error; 1083 } 1084 1085 usbd_status 1086 urtw_8225_write_s16(struct urtw_softc *sc, uint8_t addr, int index, 1087 uint16_t data) 1088 { 1089 usb_device_request_t req; 1090 1091 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 1092 req.bRequest = URTW_8187_SETREGS_REQ; 1093 USETW(req.wValue, addr); 1094 USETW(req.wIndex, index); 1095 USETW(req.wLength, sizeof(uint16_t)); 1096 1097 return usbd_do_request(sc->sc_udev, &req, &data); 1098 } 1099 1100 usbd_status 1101 urtw_8225_read(struct urtw_softc *sc, uint8_t addr, uint32_t *data) 1102 { 1103 int i; 1104 int16_t bit; 1105 uint8_t rlen = 12, wlen = 6; 1106 uint16_t o1, o2, o3, tmp; 1107 uint32_t d2w = ((uint32_t)(addr & 0x1f)) << 27; 1108 uint32_t mask = 0x80000000, value = 0; 1109 usbd_status error; 1110 1111 urtw_read16_m(sc, URTW_RF_PINS_OUTPUT, &o1); 1112 urtw_read16_m(sc, URTW_RF_PINS_ENABLE, &o2); 1113 urtw_read16_m(sc, URTW_RF_PINS_SELECT, &o3); 1114 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, o2 | 0xf); 1115 urtw_write16_m(sc, URTW_RF_PINS_SELECT, o3 | 0xf); 1116 o1 &= ~0xf; 1117 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_EN); 1118 DELAY(5); 1119 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1); 1120 DELAY(5); 1121 1122 for (i = 0; i < (wlen / 2); i++, mask = mask >> 1) { 1123 bit = ((d2w & mask) != 0) ? 1 : 0; 1124 1125 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1); 1126 DELAY(2); 1127 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | 1128 URTW_BB_HOST_BANG_CLK); 1129 DELAY(2); 1130 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | 1131 URTW_BB_HOST_BANG_CLK); 1132 DELAY(2); 1133 mask = mask >> 1; 1134 if (i == 2) 1135 break; 1136 bit = ((d2w & mask) != 0) ? 1 : 0; 1137 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | 1138 URTW_BB_HOST_BANG_CLK); 1139 DELAY(2); 1140 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | 1141 URTW_BB_HOST_BANG_CLK); 1142 DELAY(2); 1143 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1); 1144 DELAY(1); 1145 } 1146 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | URTW_BB_HOST_BANG_RW | 1147 URTW_BB_HOST_BANG_CLK); 1148 DELAY(2); 1149 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | URTW_BB_HOST_BANG_RW); 1150 DELAY(2); 1151 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_RW); 1152 DELAY(2); 1153 1154 mask = 0x800; 1155 for (i = 0; i < rlen; i++, mask = mask >> 1) { 1156 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 1157 o1 | URTW_BB_HOST_BANG_RW); 1158 DELAY(2); 1159 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 1160 o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK); 1161 DELAY(2); 1162 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 1163 o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK); 1164 DELAY(2); 1165 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 1166 o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK); 1167 DELAY(2); 1168 1169 urtw_read16_m(sc, URTW_RF_PINS_INPUT, &tmp); 1170 value |= ((tmp & URTW_BB_HOST_BANG_CLK) ? mask : 0); 1171 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 1172 o1 | URTW_BB_HOST_BANG_RW); 1173 DELAY(2); 1174 } 1175 1176 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_EN | 1177 URTW_BB_HOST_BANG_RW); 1178 DELAY(2); 1179 1180 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, o2); 1181 urtw_write16_m(sc, URTW_RF_PINS_SELECT, o3); 1182 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x3a0); 1183 1184 if (data != NULL) 1185 *data = value; 1186 fail: 1187 return error; 1188 } 1189 1190 usbd_status 1191 urtw_8225_write_c(struct urtw_softc *sc, uint8_t addr, uint16_t data) 1192 { 1193 uint16_t d80, d82, d84; 1194 usbd_status error; 1195 1196 urtw_read16_m(sc, URTW_RF_PINS_OUTPUT, &d80); 1197 d80 &= 0xfff3; 1198 urtw_read16_m(sc, URTW_RF_PINS_ENABLE, &d82); 1199 urtw_read16_m(sc, URTW_RF_PINS_SELECT, &d84); 1200 d84 &= 0xfff0; 1201 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, d82 | 0x0007); 1202 urtw_write16_m(sc, URTW_RF_PINS_SELECT, d84 | 0x0007); 1203 DELAY(10); 1204 1205 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN); 1206 DELAY(2); 1207 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80); 1208 DELAY(10); 1209 1210 error = urtw_8225_write_s16(sc, addr, 0x8225, data); 1211 if (error != 0) 1212 goto fail; 1213 1214 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN); 1215 DELAY(10); 1216 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN); 1217 urtw_write16_m(sc, URTW_RF_PINS_SELECT, d84); 1218 usbd_delay_ms(sc->sc_udev, 2); 1219 fail: 1220 return error; 1221 } 1222 1223 usbd_status 1224 urtw_8225_isv2(struct urtw_softc *sc, int *ret) 1225 { 1226 uint32_t data; 1227 usbd_status error; 1228 1229 *ret = 1; 1230 1231 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x0080); 1232 urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x0080); 1233 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x0080); 1234 usbd_delay_ms(sc->sc_udev, 500); 1235 1236 urtw_8225_write(sc, 0x0, 0x1b7); 1237 1238 error = urtw_8225_read(sc, 0x8, &data); 1239 if (error != 0) 1240 goto fail; 1241 if (data != 0x588) 1242 *ret = 0; 1243 else { 1244 error = urtw_8225_read(sc, 0x9, &data); 1245 if (error != 0) 1246 goto fail; 1247 if (data != 0x700) 1248 *ret = 0; 1249 } 1250 1251 urtw_8225_write(sc, 0x0, 0xb7); 1252 fail: 1253 return error; 1254 } 1255 1256 usbd_status 1257 urtw_get_rfchip(struct urtw_softc *sc) 1258 { 1259 struct urtw_rf *rf = &sc->sc_rf; 1260 int ret; 1261 uint32_t data; 1262 usbd_status error; 1263 1264 rf->rf_sc = sc; 1265 1266 if (sc->sc_hwrev & URTW_HWREV_8187) { 1267 error = urtw_eprom_read32(sc, URTW_EPROM_RFCHIPID, &data); 1268 if (error != 0) 1269 panic("unsupported RF chip"); 1270 /* NOTREACHED */ 1271 switch (data & 0xff) { 1272 case URTW_EPROM_RFCHIPID_RTL8225U: 1273 error = urtw_8225_isv2(sc, &ret); 1274 if (error != 0) 1275 goto fail; 1276 if (ret == 0) { 1277 rf->init = urtw_8225_rf_init; 1278 rf->set_chan = urtw_8225_rf_set_chan; 1279 rf->set_sens = urtw_8225_rf_set_sens; 1280 printf(", RFv1"); 1281 } else { 1282 rf->init = urtw_8225v2_rf_init; 1283 rf->set_chan = urtw_8225v2_rf_set_chan; 1284 rf->set_sens = NULL; 1285 printf(", RFv2"); 1286 } 1287 break; 1288 default: 1289 goto fail; 1290 } 1291 } else { 1292 rf->init = urtw_8225v2_b_rf_init; 1293 rf->set_chan = urtw_8225v2_b_rf_set_chan; 1294 rf->set_sens = NULL; 1295 } 1296 1297 rf->max_sens = URTW_8225_RF_MAX_SENS; 1298 rf->sens = URTW_8225_RF_DEF_SENS; 1299 1300 return 0; 1301 1302 fail: 1303 panic("unsupported RF chip %d", data & 0xff); 1304 /* NOTREACHED */ 1305 } 1306 1307 usbd_status 1308 urtw_get_txpwr(struct urtw_softc *sc) 1309 { 1310 int i, j; 1311 uint32_t data; 1312 usbd_status error; 1313 1314 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW_BASE, &data); 1315 if (error != 0) 1316 goto fail; 1317 sc->sc_txpwr_cck_base = data & 0xf; 1318 sc->sc_txpwr_ofdm_base = (data >> 4) & 0xf; 1319 1320 for (i = 1, j = 0; i < 6; i += 2, j++) { 1321 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW0 + j, &data); 1322 if (error != 0) 1323 goto fail; 1324 sc->sc_txpwr_cck[i] = data & 0xf; 1325 sc->sc_txpwr_cck[i + 1] = (data & 0xf00) >> 8; 1326 sc->sc_txpwr_ofdm[i] = (data & 0xf0) >> 4; 1327 sc->sc_txpwr_ofdm[i + 1] = (data & 0xf000) >> 12; 1328 } 1329 for (i = 1, j = 0; i < 4; i += 2, j++) { 1330 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW1 + j, &data); 1331 if (error != 0) 1332 goto fail; 1333 sc->sc_txpwr_cck[i + 6] = data & 0xf; 1334 sc->sc_txpwr_cck[i + 6 + 1] = (data & 0xf00) >> 8; 1335 sc->sc_txpwr_ofdm[i + 6] = (data & 0xf0) >> 4; 1336 sc->sc_txpwr_ofdm[i + 6 + 1] = (data & 0xf000) >> 12; 1337 } 1338 if (sc->sc_hwrev & URTW_HWREV_8187) { 1339 for (i = 1, j = 0; i < 4; i += 2, j++) { 1340 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW2 + j, 1341 &data); 1342 if (error != 0) 1343 goto fail; 1344 sc->sc_txpwr_cck[i + 6 + 4] = data & 0xf; 1345 sc->sc_txpwr_cck[i + 6 + 4 + 1] = (data & 0xf00) >> 8; 1346 sc->sc_txpwr_ofdm[i + 6 + 4] = (data & 0xf0) >> 4; 1347 sc->sc_txpwr_ofdm[i + 6 + 4 + 1] = 1348 (data & 0xf000) >> 12; 1349 } 1350 } else { 1351 /* Channel 11. */ 1352 error = urtw_eprom_read32(sc, 0x1b, &data); 1353 if (error != 0) 1354 goto fail; 1355 sc->sc_txpwr_cck[11] = data & 0xf; 1356 sc->sc_txpwr_ofdm[11] = (data & 0xf0) >> 4; 1357 1358 /* Channel 12. */ 1359 error = urtw_eprom_read32(sc, 0xa, &data); 1360 if (error != 0) 1361 goto fail; 1362 sc->sc_txpwr_cck[12] = data & 0xf; 1363 sc->sc_txpwr_ofdm[12] = (data & 0xf0) >> 4; 1364 1365 /* Channel 13, 14. */ 1366 error = urtw_eprom_read32(sc, 0x1c, &data); 1367 if (error != 0) 1368 goto fail; 1369 sc->sc_txpwr_cck[13] = data & 0xf; 1370 sc->sc_txpwr_ofdm[13] = (data & 0xf0) >> 4; 1371 sc->sc_txpwr_cck[14] = (data & 0xf00) >> 8; 1372 sc->sc_txpwr_ofdm[14] = (data & 0xf000) >> 12; 1373 } 1374 fail: 1375 return error; 1376 } 1377 1378 usbd_status 1379 urtw_get_macaddr(struct urtw_softc *sc) 1380 { 1381 struct ieee80211com *ic = &sc->sc_ic; 1382 usbd_status error; 1383 uint32_t data; 1384 1385 error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR, &data); 1386 if (error != 0) 1387 goto fail; 1388 ic->ic_myaddr[0] = data & 0xff; 1389 ic->ic_myaddr[1] = (data & 0xff00) >> 8; 1390 error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR + 1, &data); 1391 if (error != 0) 1392 goto fail; 1393 ic->ic_myaddr[2] = data & 0xff; 1394 ic->ic_myaddr[3] = (data & 0xff00) >> 8; 1395 error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR + 2, &data); 1396 if (error != 0) 1397 goto fail; 1398 ic->ic_myaddr[4] = data & 0xff; 1399 ic->ic_myaddr[5] = (data & 0xff00) >> 8; 1400 fail: 1401 return error; 1402 } 1403 1404 usbd_status 1405 urtw_eprom_read32(struct urtw_softc *sc, uint32_t addr, uint32_t *data) 1406 { 1407 #define URTW_READCMD_LEN 3 1408 int addrlen, i; 1409 int16_t addrstr[8], data16, readcmd[] = { 1, 1, 0 }; 1410 usbd_status error; 1411 1412 /* NB: make sure the buffer is initialized */ 1413 *data = 0; 1414 1415 /* enable EPROM programming */ 1416 urtw_write8_m(sc, URTW_EPROM_CMD, URTW_EPROM_CMD_PROGRAM_MODE); 1417 DELAY(URTW_EPROM_DELAY); 1418 1419 error = urtw_eprom_cs(sc, URTW_EPROM_ENABLE); 1420 if (error != 0) 1421 goto fail; 1422 error = urtw_eprom_ck(sc); 1423 if (error != 0) 1424 goto fail; 1425 error = urtw_eprom_sendbits(sc, readcmd, URTW_READCMD_LEN); 1426 if (error != 0) 1427 goto fail; 1428 if (sc->sc_epromtype == URTW_EEPROM_93C56) { 1429 addrlen = 8; 1430 addrstr[0] = addr & (1 << 7); 1431 addrstr[1] = addr & (1 << 6); 1432 addrstr[2] = addr & (1 << 5); 1433 addrstr[3] = addr & (1 << 4); 1434 addrstr[4] = addr & (1 << 3); 1435 addrstr[5] = addr & (1 << 2); 1436 addrstr[6] = addr & (1 << 1); 1437 addrstr[7] = addr & (1 << 0); 1438 } else { 1439 addrlen=6; 1440 addrstr[0] = addr & (1 << 5); 1441 addrstr[1] = addr & (1 << 4); 1442 addrstr[2] = addr & (1 << 3); 1443 addrstr[3] = addr & (1 << 2); 1444 addrstr[4] = addr & (1 << 1); 1445 addrstr[5] = addr & (1 << 0); 1446 } 1447 error = urtw_eprom_sendbits(sc, addrstr, addrlen); 1448 if (error != 0) 1449 goto fail; 1450 1451 error = urtw_eprom_writebit(sc, 0); 1452 if (error != 0) 1453 goto fail; 1454 1455 for (i = 0; i < 16; i++) { 1456 error = urtw_eprom_ck(sc); 1457 if (error != 0) 1458 goto fail; 1459 error = urtw_eprom_readbit(sc, &data16); 1460 if (error != 0) 1461 goto fail; 1462 1463 (*data) |= (data16 << (15 - i)); 1464 } 1465 1466 error = urtw_eprom_cs(sc, URTW_EPROM_DISABLE); 1467 if (error != 0) 1468 goto fail; 1469 error = urtw_eprom_ck(sc); 1470 if (error != 0) 1471 goto fail; 1472 1473 /* now disable EPROM programming */ 1474 urtw_write8_m(sc, URTW_EPROM_CMD, URTW_EPROM_CMD_NORMAL_MODE); 1475 fail: 1476 return error; 1477 #undef URTW_READCMD_LEN 1478 } 1479 1480 usbd_status 1481 urtw_eprom_readbit(struct urtw_softc *sc, int16_t *data) 1482 { 1483 uint8_t data8; 1484 usbd_status error; 1485 1486 urtw_read8_m(sc, URTW_EPROM_CMD, &data8); 1487 *data = (data8 & URTW_EPROM_READBIT) ? 1 : 0; 1488 DELAY(URTW_EPROM_DELAY); 1489 1490 fail: 1491 return error; 1492 } 1493 1494 usbd_status 1495 urtw_eprom_sendbits(struct urtw_softc *sc, int16_t *buf, int buflen) 1496 { 1497 int i = 0; 1498 usbd_status error = 0; 1499 1500 for (i = 0; i < buflen; i++) { 1501 error = urtw_eprom_writebit(sc, buf[i]); 1502 if (error != 0) 1503 goto fail; 1504 error = urtw_eprom_ck(sc); 1505 if (error != 0) 1506 goto fail; 1507 } 1508 fail: 1509 return error; 1510 } 1511 1512 usbd_status 1513 urtw_eprom_writebit(struct urtw_softc *sc, int16_t bit) 1514 { 1515 uint8_t data; 1516 usbd_status error; 1517 1518 urtw_read8_m(sc, URTW_EPROM_CMD, &data); 1519 if (bit != 0) 1520 urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_WRITEBIT); 1521 else 1522 urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_WRITEBIT); 1523 DELAY(URTW_EPROM_DELAY); 1524 fail: 1525 return error; 1526 } 1527 1528 usbd_status 1529 urtw_eprom_ck(struct urtw_softc *sc) 1530 { 1531 uint8_t data; 1532 usbd_status error; 1533 1534 /* masking */ 1535 urtw_read8_m(sc, URTW_EPROM_CMD, &data); 1536 urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_CK); 1537 DELAY(URTW_EPROM_DELAY); 1538 /* unmasking */ 1539 urtw_read8_m(sc, URTW_EPROM_CMD, &data); 1540 urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_CK); 1541 DELAY(URTW_EPROM_DELAY); 1542 fail: 1543 return error; 1544 } 1545 1546 usbd_status 1547 urtw_eprom_cs(struct urtw_softc *sc, int able) 1548 { 1549 uint8_t data; 1550 usbd_status error; 1551 1552 urtw_read8_m(sc, URTW_EPROM_CMD, &data); 1553 if (able == URTW_EPROM_ENABLE) 1554 urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_CS); 1555 else 1556 urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_CS); 1557 DELAY(URTW_EPROM_DELAY); 1558 fail: 1559 return error; 1560 } 1561 1562 usbd_status 1563 urtw_read8_c(struct urtw_softc *sc, int val, uint8_t *data, uint8_t idx) 1564 { 1565 usb_device_request_t req; 1566 usbd_status error; 1567 1568 req.bmRequestType = UT_READ_VENDOR_DEVICE; 1569 req.bRequest = URTW_8187_GETREGS_REQ; 1570 USETW(req.wValue, val | 0xff00); 1571 USETW(req.wIndex, idx & 0x03); 1572 USETW(req.wLength, sizeof(uint8_t)); 1573 1574 error = usbd_do_request(sc->sc_udev, &req, data); 1575 return error; 1576 } 1577 1578 usbd_status 1579 urtw_read8e(struct urtw_softc *sc, int val, uint8_t *data) 1580 { 1581 usb_device_request_t req; 1582 usbd_status error; 1583 1584 req.bmRequestType = UT_READ_VENDOR_DEVICE; 1585 req.bRequest = URTW_8187_GETREGS_REQ; 1586 USETW(req.wValue, val | 0xfe00); 1587 USETW(req.wIndex, 0); 1588 USETW(req.wLength, sizeof(uint8_t)); 1589 1590 error = usbd_do_request(sc->sc_udev, &req, data); 1591 return error; 1592 } 1593 1594 usbd_status 1595 urtw_read16_c(struct urtw_softc *sc, int val, uint16_t *data, uint8_t idx) 1596 { 1597 usb_device_request_t req; 1598 usbd_status error; 1599 1600 req.bmRequestType = UT_READ_VENDOR_DEVICE; 1601 req.bRequest = URTW_8187_GETREGS_REQ; 1602 USETW(req.wValue, val | 0xff00); 1603 USETW(req.wIndex, idx & 0x03); 1604 USETW(req.wLength, sizeof(uint16_t)); 1605 1606 error = usbd_do_request(sc->sc_udev, &req, data); 1607 return error; 1608 } 1609 1610 usbd_status 1611 urtw_read32_c(struct urtw_softc *sc, int val, uint32_t *data, uint8_t idx) 1612 { 1613 usb_device_request_t req; 1614 usbd_status error; 1615 1616 req.bmRequestType = UT_READ_VENDOR_DEVICE; 1617 req.bRequest = URTW_8187_GETREGS_REQ; 1618 USETW(req.wValue, val | 0xff00); 1619 USETW(req.wIndex, idx & 0x03); 1620 USETW(req.wLength, sizeof(uint32_t)); 1621 1622 error = usbd_do_request(sc->sc_udev, &req, data); 1623 return error; 1624 } 1625 1626 usbd_status 1627 urtw_write8_c(struct urtw_softc *sc, int val, uint8_t data, uint8_t idx) 1628 { 1629 usb_device_request_t req; 1630 1631 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 1632 req.bRequest = URTW_8187_SETREGS_REQ; 1633 USETW(req.wValue, val | 0xff00); 1634 USETW(req.wIndex, idx & 0x03); 1635 USETW(req.wLength, sizeof(uint8_t)); 1636 1637 return usbd_do_request(sc->sc_udev, &req, &data); 1638 } 1639 1640 usbd_status 1641 urtw_write8e(struct urtw_softc *sc, int val, uint8_t data) 1642 { 1643 usb_device_request_t req; 1644 1645 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 1646 req.bRequest = URTW_8187_SETREGS_REQ; 1647 USETW(req.wValue, val | 0xfe00); 1648 USETW(req.wIndex, 0); 1649 USETW(req.wLength, sizeof(uint8_t)); 1650 1651 return usbd_do_request(sc->sc_udev, &req, &data); 1652 } 1653 1654 usbd_status 1655 urtw_write16_c(struct urtw_softc *sc, int val, uint16_t data, uint8_t idx) 1656 { 1657 usb_device_request_t req; 1658 1659 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 1660 req.bRequest = URTW_8187_SETREGS_REQ; 1661 USETW(req.wValue, val | 0xff00); 1662 USETW(req.wIndex, idx & 0x03); 1663 USETW(req.wLength, sizeof(uint16_t)); 1664 1665 return usbd_do_request(sc->sc_udev, &req, &data); 1666 } 1667 1668 usbd_status 1669 urtw_write32_c(struct urtw_softc *sc, int val, uint32_t data, uint8_t idx) 1670 { 1671 usb_device_request_t req; 1672 1673 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 1674 req.bRequest = URTW_8187_SETREGS_REQ; 1675 USETW(req.wValue, val | 0xff00); 1676 USETW(req.wIndex, idx & 0x03); 1677 USETW(req.wLength, sizeof(uint32_t)); 1678 1679 return usbd_do_request(sc->sc_udev, &req, &data); 1680 } 1681 1682 static usbd_status 1683 urtw_set_mode(struct urtw_softc *sc, uint32_t mode) 1684 { 1685 uint8_t data; 1686 usbd_status error; 1687 1688 urtw_read8_m(sc, URTW_EPROM_CMD, &data); 1689 data = (data & ~URTW_EPROM_CMD_MASK) | (mode << URTW_EPROM_CMD_SHIFT); 1690 data = data & ~(URTW_EPROM_CS | URTW_EPROM_CK); 1691 urtw_write8_m(sc, URTW_EPROM_CMD, data); 1692 fail: 1693 return error; 1694 } 1695 1696 usbd_status 1697 urtw_8180_set_anaparam(struct urtw_softc *sc, uint32_t val) 1698 { 1699 uint8_t data; 1700 usbd_status error; 1701 1702 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 1703 if (error) 1704 goto fail; 1705 1706 urtw_read8_m(sc, URTW_CONFIG3, &data); 1707 urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE); 1708 urtw_write32_m(sc, URTW_ANAPARAM, val); 1709 urtw_read8_m(sc, URTW_CONFIG3, &data); 1710 urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE); 1711 1712 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 1713 if (error) 1714 goto fail; 1715 fail: 1716 return error; 1717 } 1718 1719 usbd_status 1720 urtw_8185_set_anaparam2(struct urtw_softc *sc, uint32_t val) 1721 { 1722 uint8_t data; 1723 usbd_status error; 1724 1725 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 1726 if (error) 1727 goto fail; 1728 1729 urtw_read8_m(sc, URTW_CONFIG3, &data); 1730 urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE); 1731 urtw_write32_m(sc, URTW_ANAPARAM2, val); 1732 urtw_read8_m(sc, URTW_CONFIG3, &data); 1733 urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE); 1734 1735 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 1736 if (error) 1737 goto fail; 1738 fail: 1739 return error; 1740 } 1741 1742 usbd_status 1743 urtw_intr_disable(struct urtw_softc *sc) 1744 { 1745 usbd_status error; 1746 1747 urtw_write16_m(sc, URTW_INTR_MASK, 0); 1748 1749 fail: 1750 return error; 1751 } 1752 1753 usbd_status 1754 urtw_reset(struct urtw_softc *sc) 1755 { 1756 uint8_t data; 1757 usbd_status error; 1758 1759 error = urtw_8180_set_anaparam(sc, URTW_8187_8225_ANAPARAM_ON); 1760 if (error) 1761 goto fail; 1762 error = urtw_8185_set_anaparam2(sc, URTW_8187_8225_ANAPARAM2_ON); 1763 if (error) 1764 goto fail; 1765 1766 error = urtw_intr_disable(sc); 1767 if (error) 1768 goto fail; 1769 usbd_delay_ms(sc->sc_udev, 100); 1770 1771 error = urtw_write8e(sc, 0x18, 0x10); 1772 if (error != 0) 1773 goto fail; 1774 error = urtw_write8e(sc, 0x18, 0x11); 1775 if (error != 0) 1776 goto fail; 1777 error = urtw_write8e(sc, 0x18, 0x00); 1778 if (error != 0) 1779 goto fail; 1780 usbd_delay_ms(sc->sc_udev, 100); 1781 1782 urtw_read8_m(sc, URTW_CMD, &data); 1783 data = (data & 2) | URTW_CMD_RST; 1784 urtw_write8_m(sc, URTW_CMD, data); 1785 usbd_delay_ms(sc->sc_udev, 100); 1786 1787 urtw_read8_m(sc, URTW_CMD, &data); 1788 if (data & URTW_CMD_RST) { 1789 printf("%s: reset timeout\n", device_xname(sc->sc_dev)); 1790 goto fail; 1791 } 1792 1793 error = urtw_set_mode(sc, URTW_EPROM_CMD_LOAD); 1794 if (error) 1795 goto fail; 1796 usbd_delay_ms(sc->sc_udev, 100); 1797 1798 error = urtw_8180_set_anaparam(sc, URTW_8187_8225_ANAPARAM_ON); 1799 if (error) 1800 goto fail; 1801 error = urtw_8185_set_anaparam2(sc, URTW_8187_8225_ANAPARAM2_ON); 1802 if (error) 1803 goto fail; 1804 fail: 1805 return error; 1806 } 1807 1808 usbd_status 1809 urtw_led_on(struct urtw_softc *sc, int type) 1810 { 1811 usbd_status error; 1812 1813 if (type == URTW_LED_GPIO) { 1814 switch (sc->sc_gpio_ledpin) { 1815 case URTW_LED_PIN_GPIO0: 1816 urtw_write8_m(sc, URTW_GPIO, 0x01); 1817 urtw_write8_m(sc, URTW_GP_ENABLE, 0x00); 1818 break; 1819 default: 1820 panic("unsupported LED PIN type 0x%x", 1821 sc->sc_gpio_ledpin); 1822 /* NOTREACHED */ 1823 } 1824 } else { 1825 panic("unsupported LED type 0x%x", type); 1826 /* NOTREACHED */ 1827 } 1828 1829 sc->sc_gpio_ledon = 1; 1830 fail: 1831 return error; 1832 } 1833 1834 static usbd_status 1835 urtw_led_off(struct urtw_softc *sc, int type) 1836 { 1837 usbd_status error; 1838 1839 if (type == URTW_LED_GPIO) { 1840 switch (sc->sc_gpio_ledpin) { 1841 case URTW_LED_PIN_GPIO0: 1842 urtw_write8_m(sc, URTW_GPIO, 0x01); 1843 urtw_write8_m(sc, URTW_GP_ENABLE, 0x01); 1844 break; 1845 default: 1846 panic("unsupported LED PIN type 0x%x", 1847 sc->sc_gpio_ledpin); 1848 /* NOTREACHED */ 1849 } 1850 } else { 1851 panic("unsupported LED type 0x%x", type); 1852 /* NOTREACHED */ 1853 } 1854 1855 sc->sc_gpio_ledon = 0; 1856 1857 fail: 1858 return error; 1859 } 1860 1861 usbd_status 1862 urtw_led_mode0(struct urtw_softc *sc, int mode) 1863 { 1864 switch (mode) { 1865 case URTW_LED_CTL_POWER_ON: 1866 sc->sc_gpio_ledstate = URTW_LED_POWER_ON_BLINK; 1867 break; 1868 case URTW_LED_CTL_TX: 1869 if (sc->sc_gpio_ledinprogress == 1) 1870 return 0; 1871 1872 sc->sc_gpio_ledstate = URTW_LED_BLINK_NORMAL; 1873 sc->sc_gpio_blinktime = 2; 1874 break; 1875 case URTW_LED_CTL_LINK: 1876 sc->sc_gpio_ledstate = URTW_LED_ON; 1877 break; 1878 default: 1879 panic("unsupported LED mode 0x%x", mode); 1880 /* NOTREACHED */ 1881 } 1882 1883 switch (sc->sc_gpio_ledstate) { 1884 case URTW_LED_ON: 1885 if (sc->sc_gpio_ledinprogress != 0) 1886 break; 1887 urtw_led_on(sc, URTW_LED_GPIO); 1888 break; 1889 case URTW_LED_BLINK_NORMAL: 1890 if (sc->sc_gpio_ledinprogress != 0) 1891 break; 1892 sc->sc_gpio_ledinprogress = 1; 1893 sc->sc_gpio_blinkstate = (sc->sc_gpio_ledon != 0) ? 1894 URTW_LED_OFF : URTW_LED_ON; 1895 if (!sc->sc_dying) 1896 callout_schedule(&sc->sc_led_ch, mstohz(100)); 1897 break; 1898 case URTW_LED_POWER_ON_BLINK: 1899 urtw_led_on(sc, URTW_LED_GPIO); 1900 usbd_delay_ms(sc->sc_udev, 100); 1901 urtw_led_off(sc, URTW_LED_GPIO); 1902 break; 1903 default: 1904 panic("unknown LED status 0x%x", sc->sc_gpio_ledstate); 1905 /* NOTREACHED */ 1906 } 1907 return 0; 1908 } 1909 1910 usbd_status 1911 urtw_led_mode1(struct urtw_softc *sc, int mode) 1912 { 1913 return USBD_INVAL; 1914 } 1915 1916 usbd_status 1917 urtw_led_mode2(struct urtw_softc *sc, int mode) 1918 { 1919 return USBD_INVAL; 1920 } 1921 1922 usbd_status 1923 urtw_led_mode3(struct urtw_softc *sc, int mode) 1924 { 1925 return USBD_INVAL; 1926 } 1927 1928 void 1929 urtw_ledusbtask(void *arg) 1930 { 1931 struct urtw_softc *sc = arg; 1932 1933 if (sc->sc_strategy != URTW_SW_LED_MODE0) 1934 panic("could not process a LED strategy 0x%x", sc->sc_strategy); 1935 1936 urtw_led_blink(sc); 1937 } 1938 1939 void 1940 urtw_ledtask(void *arg) 1941 { 1942 struct urtw_softc *sc = arg; 1943 1944 /* 1945 * NB: to change a status of the led we need at least a sleep so we 1946 * can't do it here 1947 */ 1948 usb_add_task(sc->sc_udev, &sc->sc_ledtask, USB_TASKQ_DRIVER); 1949 } 1950 1951 usbd_status 1952 urtw_led_ctl(struct urtw_softc *sc, int mode) 1953 { 1954 usbd_status error = 0; 1955 1956 switch (sc->sc_strategy) { 1957 case URTW_SW_LED_MODE0: 1958 error = urtw_led_mode0(sc, mode); 1959 break; 1960 case URTW_SW_LED_MODE1: 1961 error = urtw_led_mode1(sc, mode); 1962 break; 1963 case URTW_SW_LED_MODE2: 1964 error = urtw_led_mode2(sc, mode); 1965 break; 1966 case URTW_SW_LED_MODE3: 1967 error = urtw_led_mode3(sc, mode); 1968 break; 1969 default: 1970 panic("unsupported LED mode %d", sc->sc_strategy); 1971 /* NOTREACHED */ 1972 } 1973 1974 return error; 1975 } 1976 1977 usbd_status 1978 urtw_led_blink(struct urtw_softc *sc) 1979 { 1980 uint8_t ing = 0; 1981 1982 if (sc->sc_gpio_blinkstate == URTW_LED_ON) 1983 (void)urtw_led_on(sc, URTW_LED_GPIO); 1984 else 1985 (void)urtw_led_off(sc, URTW_LED_GPIO); 1986 sc->sc_gpio_blinktime--; 1987 if (sc->sc_gpio_blinktime == 0) 1988 ing = 1; 1989 else { 1990 if (sc->sc_gpio_ledstate != URTW_LED_BLINK_NORMAL && 1991 sc->sc_gpio_ledstate != URTW_LED_BLINK_SLOWLY && 1992 sc->sc_gpio_ledstate != URTW_LED_BLINK_CM3) 1993 ing = 1; 1994 } 1995 if (ing == 1) { 1996 if (sc->sc_gpio_ledstate == URTW_LED_ON && 1997 sc->sc_gpio_ledon == 0) 1998 (void)urtw_led_on(sc, URTW_LED_GPIO); 1999 else if (sc->sc_gpio_ledstate == URTW_LED_OFF && 2000 sc->sc_gpio_ledon == 1) 2001 (void)urtw_led_off(sc, URTW_LED_GPIO); 2002 2003 sc->sc_gpio_blinktime = 0; 2004 sc->sc_gpio_ledinprogress = 0; 2005 return 0; 2006 } 2007 2008 sc->sc_gpio_blinkstate = (sc->sc_gpio_blinkstate != URTW_LED_ON) ? 2009 URTW_LED_ON : URTW_LED_OFF; 2010 2011 switch (sc->sc_gpio_ledstate) { 2012 case URTW_LED_BLINK_NORMAL: 2013 if (!sc->sc_dying) 2014 callout_schedule(&sc->sc_led_ch, mstohz(100)); 2015 break; 2016 default: 2017 panic("unknown LED status 0x%x", sc->sc_gpio_ledstate); 2018 /* NOTREACHED */ 2019 } 2020 return 0; 2021 } 2022 2023 usbd_status 2024 urtw_update_msr(struct urtw_softc *sc) 2025 { 2026 struct ieee80211com *ic = &sc->sc_ic; 2027 uint8_t data; 2028 usbd_status error; 2029 2030 urtw_read8_m(sc, URTW_MSR, &data); 2031 data &= ~URTW_MSR_LINK_MASK; 2032 2033 /* Should always be set. */ 2034 if (sc->sc_hwrev & URTW_HWREV_8187B) 2035 data |= URTW_MSR_LINK_ENEDCA; 2036 2037 if (sc->sc_state == IEEE80211_S_RUN) { 2038 switch (ic->ic_opmode) { 2039 case IEEE80211_M_STA: 2040 case IEEE80211_M_MONITOR: 2041 data |= URTW_MSR_LINK_STA; 2042 break; 2043 default: 2044 panic("unsupported operation mode 0x%x", 2045 ic->ic_opmode); 2046 /* NOTREACHED */ 2047 } 2048 } else 2049 data |= URTW_MSR_LINK_NONE; 2050 2051 urtw_write8_m(sc, URTW_MSR, data); 2052 fail: 2053 return error; 2054 } 2055 2056 uint16_t 2057 urtw_rate2rtl(int rate) 2058 { 2059 unsigned int i; 2060 2061 for (i = 0; i < __arraycount(urtw_ratetable); i++) { 2062 if (rate == urtw_ratetable[i].reg) 2063 return urtw_ratetable[i].val; 2064 } 2065 2066 return 3; 2067 } 2068 2069 uint16_t 2070 urtw_rtl2rate(int rate) 2071 { 2072 unsigned int i; 2073 2074 for (i = 0; i < __arraycount(urtw_ratetable); i++) { 2075 if (rate == urtw_ratetable[i].val) 2076 return urtw_ratetable[i].reg; 2077 } 2078 2079 return 0; 2080 } 2081 2082 usbd_status 2083 urtw_set_rate(struct urtw_softc *sc) 2084 { 2085 int i, basic_rate, min_rr_rate, max_rr_rate; 2086 uint16_t data; 2087 usbd_status error; 2088 2089 basic_rate = urtw_rate2rtl(48); 2090 min_rr_rate = urtw_rate2rtl(12); 2091 max_rr_rate = urtw_rate2rtl(48); 2092 2093 urtw_write8_m(sc, URTW_RESP_RATE, 2094 max_rr_rate << URTW_RESP_MAX_RATE_SHIFT | 2095 min_rr_rate << URTW_RESP_MIN_RATE_SHIFT); 2096 2097 urtw_read16_m(sc, URTW_8187_BRSR, &data); 2098 data &= ~URTW_BRSR_MBR_8185; 2099 2100 for (i = 0; i <= basic_rate; i++) 2101 data |= (1 << i); 2102 2103 urtw_write16_m(sc, URTW_8187_BRSR, data); 2104 fail: 2105 return error; 2106 } 2107 2108 usbd_status 2109 urtw_intr_enable(struct urtw_softc *sc) 2110 { 2111 usbd_status error; 2112 2113 urtw_write16_m(sc, URTW_INTR_MASK, 0xffff); 2114 fail: 2115 return error; 2116 } 2117 2118 usbd_status 2119 urtw_rx_setconf(struct urtw_softc *sc) 2120 { 2121 struct ifnet *ifp = sc->sc_ic.ic_ifp; 2122 struct ieee80211com *ic = &sc->sc_ic; 2123 uint32_t data; 2124 usbd_status error; 2125 2126 urtw_read32_m(sc, URTW_RX, &data); 2127 data = data &~ URTW_RX_FILTER_MASK; 2128 #if 0 2129 data = data | URTW_RX_FILTER_CTL; 2130 #endif 2131 data = data | URTW_RX_FILTER_MNG | URTW_RX_FILTER_DATA; 2132 data = data | URTW_RX_FILTER_BCAST | URTW_RX_FILTER_MCAST; 2133 2134 if (ic->ic_opmode == IEEE80211_M_MONITOR) { 2135 data = data | URTW_RX_FILTER_ICVERR; 2136 data = data | URTW_RX_FILTER_PWR; 2137 } 2138 if (sc->sc_crcmon == 1 && ic->ic_opmode == IEEE80211_M_MONITOR) 2139 data = data | URTW_RX_FILTER_CRCERR; 2140 2141 if (ic->ic_opmode == IEEE80211_M_MONITOR || 2142 (ifp->if_flags & (IFF_ALLMULTI | IFF_PROMISC))) { 2143 data = data | URTW_RX_FILTER_ALLMAC; 2144 } else { 2145 data = data | URTW_RX_FILTER_NICMAC; 2146 data = data | URTW_RX_CHECK_BSSID; 2147 } 2148 2149 data = data &~ URTW_RX_FIFO_THRESHOLD_MASK; 2150 data = data | URTW_RX_FIFO_THRESHOLD_NONE | URTW_RX_AUTORESETPHY; 2151 data = data &~ URTW_MAX_RX_DMA_MASK; 2152 data = data | URTW_MAX_RX_DMA_2048 | URTW_RCR_ONLYERLPKT; 2153 2154 urtw_write32_m(sc, URTW_RX, data); 2155 fail: 2156 return error; 2157 } 2158 2159 usbd_status 2160 urtw_rx_enable(struct urtw_softc *sc) 2161 { 2162 int i; 2163 struct urtw_rx_data *rx_data; 2164 uint8_t data; 2165 usbd_status error; 2166 2167 /* 2168 * Start up the receive pipe. 2169 */ 2170 for (i = 0; i < URTW_RX_DATA_LIST_COUNT; i++) { 2171 rx_data = &sc->sc_rx_data[i]; 2172 2173 usbd_setup_xfer(rx_data->xfer, rx_data, rx_data->buf, MCLBYTES, 2174 USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, urtw_rxeof); 2175 error = usbd_transfer(rx_data->xfer); 2176 if (error != USBD_IN_PROGRESS && error != 0) { 2177 printf("%s: could not queue Rx transfer\n", 2178 device_xname(sc->sc_dev)); 2179 goto fail; 2180 } 2181 } 2182 2183 error = urtw_rx_setconf(sc); 2184 if (error != 0) 2185 goto fail; 2186 2187 urtw_read8_m(sc, URTW_CMD, &data); 2188 urtw_write8_m(sc, URTW_CMD, data | URTW_CMD_RX_ENABLE); 2189 fail: 2190 return error; 2191 } 2192 2193 usbd_status 2194 urtw_tx_enable(struct urtw_softc *sc) 2195 { 2196 uint8_t data8; 2197 uint32_t data; 2198 usbd_status error; 2199 2200 if (sc->sc_hwrev & URTW_HWREV_8187) { 2201 urtw_read8_m(sc, URTW_CW_CONF, &data8); 2202 data8 &= ~(URTW_CW_CONF_PERPACKET_CW | 2203 URTW_CW_CONF_PERPACKET_RETRY); 2204 urtw_write8_m(sc, URTW_CW_CONF, data8); 2205 2206 urtw_read8_m(sc, URTW_TX_AGC_CTL, &data8); 2207 data8 &= ~URTW_TX_AGC_CTL_PERPACKET_GAIN; 2208 data8 &= ~URTW_TX_AGC_CTL_PERPACKET_ANTSEL; 2209 data8 &= ~URTW_TX_AGC_CTL_FEEDBACK_ANT; 2210 urtw_write8_m(sc, URTW_TX_AGC_CTL, data8); 2211 2212 urtw_read32_m(sc, URTW_TX_CONF, &data); 2213 data &= ~URTW_TX_LOOPBACK_MASK; 2214 data |= URTW_TX_LOOPBACK_NONE; 2215 data &= ~(URTW_TX_DPRETRY_MASK | URTW_TX_RTSRETRY_MASK); 2216 data |= sc->sc_tx_retry << URTW_TX_DPRETRY_SHIFT; 2217 data |= sc->sc_rts_retry << URTW_TX_RTSRETRY_SHIFT; 2218 data &= ~(URTW_TX_NOCRC | URTW_TX_MXDMA_MASK); 2219 data |= URTW_TX_MXDMA_2048 | URTW_TX_CWMIN | URTW_TX_DISCW; 2220 data &= ~URTW_TX_SWPLCPLEN; 2221 data |= URTW_TX_NOICV; 2222 urtw_write32_m(sc, URTW_TX_CONF, data); 2223 } else { 2224 data = URTW_TX_DURPROCMODE | URTW_TX_DISREQQSIZE | 2225 URTW_TX_MXDMA_2048 | URTW_TX_SHORTRETRY | 2226 URTW_TX_LONGRETRY; 2227 urtw_write32_m(sc, URTW_TX_CONF, data); 2228 } 2229 2230 urtw_read8_m(sc, URTW_CMD, &data8); 2231 urtw_write8_m(sc, URTW_CMD, data8 | URTW_CMD_TX_ENABLE); 2232 fail: 2233 return error; 2234 } 2235 2236 int 2237 urtw_init(struct ifnet *ifp) 2238 { 2239 struct urtw_softc *sc = ifp->if_softc; 2240 struct urtw_rf *rf = &sc->sc_rf; 2241 struct ieee80211com *ic = &sc->sc_ic; 2242 usbd_status error; 2243 2244 urtw_stop(ifp, 0); 2245 2246 error = urtw_reset(sc); 2247 if (error) 2248 goto fail; 2249 2250 urtw_write8_m(sc, 0x85, 0); 2251 urtw_write8_m(sc, URTW_GPIO, 0); 2252 2253 /* for led */ 2254 urtw_write8_m(sc, 0x85, 4); 2255 error = urtw_led_ctl(sc, URTW_LED_CTL_POWER_ON); 2256 if (error != 0) 2257 goto fail; 2258 2259 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 2260 if (error) 2261 goto fail; 2262 2263 /* applying MAC address again. */ 2264 IEEE80211_ADDR_COPY(ic->ic_myaddr, CLLADDR(ifp->if_sadl)); 2265 error = urtw_set_macaddr(sc, ic->ic_myaddr); 2266 if (error) 2267 goto fail; 2268 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 2269 if (error) 2270 goto fail; 2271 2272 error = urtw_update_msr(sc); 2273 if (error) 2274 goto fail; 2275 2276 urtw_write32_m(sc, URTW_INT_TIMEOUT, 0); 2277 urtw_write8_m(sc, URTW_WPA_CONFIG, 0); 2278 urtw_write8_m(sc, URTW_RATE_FALLBACK, 0x81); 2279 error = urtw_set_rate(sc); 2280 if (error != 0) 2281 goto fail; 2282 2283 error = rf->init(rf); 2284 if (error != 0) 2285 goto fail; 2286 if (rf->set_sens != NULL) 2287 rf->set_sens(rf); 2288 2289 urtw_write16_m(sc, 0x5e, 1); 2290 urtw_write16_m(sc, 0xfe, 0x10); 2291 urtw_write8_m(sc, URTW_TALLY_SEL, 0x80); 2292 urtw_write8_m(sc, 0xff, 0x60); 2293 urtw_write16_m(sc, 0x5e, 0); 2294 urtw_write8_m(sc, 0x85, 4); 2295 2296 error = urtw_intr_enable(sc); 2297 if (error != 0) 2298 goto fail; 2299 2300 /* reset softc variables */ 2301 for (size_t j = 0; j < URTW_PRIORITY_MAX; j++) { 2302 sc->sc_txidx[j] = sc->sc_tx_queued[j] = 0; 2303 } 2304 sc->sc_txtimer = 0; 2305 2306 if (!(sc->sc_flags & URTW_INIT_ONCE)) { 2307 error = usbd_set_config_no(sc->sc_udev, URTW_CONFIG_NO, 0); 2308 if (error != 0) { 2309 aprint_error_dev(sc->sc_dev, "failed to set configuration" 2310 ", err=%s\n", usbd_errstr(error)); 2311 goto fail; 2312 } 2313 /* get the first interface handle */ 2314 error = usbd_device2interface_handle(sc->sc_udev, 2315 URTW_IFACE_INDEX, &sc->sc_iface); 2316 if (error != 0) { 2317 printf("%s: could not get interface handle\n", 2318 device_xname(sc->sc_dev)); 2319 goto fail; 2320 } 2321 error = urtw_open_pipes(sc); 2322 if (error != 0) 2323 goto fail; 2324 error = urtw_alloc_rx_data_list(sc); 2325 if (error != 0) 2326 goto fail; 2327 error = urtw_alloc_tx_data_list(sc); 2328 if (error != 0) 2329 goto fail; 2330 sc->sc_flags |= URTW_INIT_ONCE; 2331 } 2332 2333 error = urtw_rx_enable(sc); 2334 if (error != 0) 2335 goto fail; 2336 error = urtw_tx_enable(sc); 2337 if (error != 0) 2338 goto fail; 2339 2340 ifp->if_flags &= ~IFF_OACTIVE; 2341 ifp->if_flags |= IFF_RUNNING; 2342 2343 if (ic->ic_opmode == IEEE80211_M_MONITOR) 2344 ieee80211_new_state(ic, IEEE80211_S_RUN, -1); 2345 else 2346 ieee80211_new_state(ic, IEEE80211_S_SCAN, -1); 2347 2348 return 0; 2349 fail: 2350 return error; 2351 } 2352 2353 int 2354 urtw_ioctl(struct ifnet *ifp, u_long cmd, void *data) 2355 { 2356 #define IS_RUNNING(ifp) \ 2357 (((ifp)->if_flags & IFF_UP) && ((ifp)->if_flags & IFF_RUNNING)) 2358 2359 struct urtw_softc *sc = ifp->if_softc; 2360 struct ieee80211com *ic = &sc->sc_ic; 2361 int s, error = 0; 2362 2363 if (sc->sc_dying) 2364 return ENXIO; 2365 2366 s = splnet(); 2367 2368 switch (cmd) { 2369 case SIOCSIFFLAGS: 2370 if ((error = ifioctl_common(ifp, cmd, data)) != 0) 2371 break; 2372 switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) { 2373 case IFF_UP|IFF_RUNNING: 2374 break; 2375 case IFF_UP: 2376 ifp->if_init(ifp); 2377 break; 2378 case IFF_RUNNING: 2379 urtw_stop(ifp, 1); 2380 break; 2381 case 0: 2382 break; 2383 } 2384 break; 2385 2386 case SIOCADDMULTI: 2387 case SIOCDELMULTI: 2388 if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET) 2389 error = 0; 2390 break; 2391 2392 default: 2393 error = ieee80211_ioctl(ic, cmd, data); 2394 break; 2395 } 2396 2397 if (error == ENETRESET) { 2398 if (IS_RUNNING(ifp) && 2399 (ic->ic_roaming != IEEE80211_ROAMING_MANUAL)) 2400 ifp->if_init(ifp); 2401 error = 0; 2402 } 2403 2404 splx(s); 2405 2406 return error; 2407 #undef IS_RUNNING 2408 } 2409 2410 void 2411 urtw_start(struct ifnet *ifp) 2412 { 2413 struct urtw_softc *sc = ifp->if_softc; 2414 struct ieee80211com *ic = &sc->sc_ic; 2415 struct ieee80211_node *ni; 2416 struct ether_header *eh; 2417 struct mbuf *m0; 2418 2419 /* 2420 * net80211 may still try to send management frames even if the 2421 * IFF_RUNNING flag is not set... 2422 */ 2423 if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING) 2424 return; 2425 2426 for (;;) { 2427 IF_POLL(&ic->ic_mgtq, m0); 2428 if (m0 != NULL) { 2429 2430 if (sc->sc_tx_queued[URTW_PRIORITY_NORMAL] >= 2431 URTW_TX_DATA_LIST_COUNT) { 2432 ifp->if_flags |= IFF_OACTIVE; 2433 break; 2434 } 2435 IF_DEQUEUE(&ic->ic_mgtq, m0); 2436 ni = M_GETCTX(m0, struct ieee80211_node *); 2437 M_CLEARCTX(m0); 2438 bpf_mtap3(ic->ic_rawbpf, m0); 2439 if (urtw_tx_start(sc, ni, m0, URTW_PRIORITY_NORMAL) 2440 != 0) 2441 break; 2442 } else { 2443 if (ic->ic_state != IEEE80211_S_RUN) 2444 break; 2445 IFQ_POLL(&ifp->if_snd, m0); 2446 if (m0 == NULL) 2447 break; 2448 if (sc->sc_tx_queued[URTW_PRIORITY_NORMAL] >= 2449 URTW_TX_DATA_LIST_COUNT) { 2450 ifp->if_flags |= IFF_OACTIVE; 2451 break; 2452 } 2453 IFQ_DEQUEUE(&ifp->if_snd, m0); 2454 if (m0->m_len < sizeof(struct ether_header) && 2455 !(m0 = m_pullup(m0, sizeof(struct ether_header)))) 2456 continue; 2457 2458 eh = mtod(m0, struct ether_header *); 2459 ni = ieee80211_find_txnode(ic, eh->ether_dhost); 2460 if (ni == NULL) { 2461 m_freem(m0); 2462 continue; 2463 } 2464 bpf_mtap(ifp, m0); 2465 m0 = ieee80211_encap(ic, m0, ni); 2466 if (m0 == NULL) { 2467 ieee80211_free_node(ni); 2468 continue; 2469 } 2470 bpf_mtap3(ic->ic_rawbpf, m0); 2471 if (urtw_tx_start(sc, ni, m0, URTW_PRIORITY_NORMAL) 2472 != 0) { 2473 ieee80211_free_node(ni); 2474 ifp->if_oerrors++; 2475 break; 2476 } 2477 } 2478 sc->sc_txtimer = 5; 2479 ifp->if_timer = 1; 2480 } 2481 } 2482 2483 void 2484 urtw_watchdog(struct ifnet *ifp) 2485 { 2486 struct urtw_softc *sc = ifp->if_softc; 2487 2488 ifp->if_timer = 0; 2489 2490 if (sc->sc_txtimer > 0) { 2491 if (--sc->sc_txtimer == 0) { 2492 printf("%s: device timeout\n", device_xname(sc->sc_dev)); 2493 ifp->if_oerrors++; 2494 return; 2495 } 2496 ifp->if_timer = 1; 2497 } 2498 2499 ieee80211_watchdog(&sc->sc_ic); 2500 } 2501 2502 void 2503 urtw_txeof_low(struct usbd_xfer *xfer, void *priv, 2504 usbd_status status) 2505 { 2506 struct urtw_tx_data *data = priv; 2507 struct urtw_softc *sc = data->sc; 2508 struct ieee80211com *ic = &sc->sc_ic; 2509 struct ifnet *ifp = ic->ic_ifp; 2510 int s; 2511 2512 if (status != USBD_NORMAL_COMPLETION) { 2513 if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) 2514 return; 2515 2516 printf("%s: could not transmit buffer: %s\n", 2517 device_xname(sc->sc_dev), usbd_errstr(status)); 2518 2519 if (status == USBD_STALLED) 2520 usbd_clear_endpoint_stall_async(sc->sc_txpipe_low); 2521 2522 ifp->if_oerrors++; 2523 return; 2524 } 2525 2526 s = splnet(); 2527 2528 ieee80211_free_node(data->ni); 2529 data->ni = NULL; 2530 2531 sc->sc_txtimer = 0; 2532 ifp->if_opackets++; 2533 2534 sc->sc_tx_queued[URTW_PRIORITY_LOW]--; 2535 ifp->if_flags &= ~IFF_OACTIVE; 2536 urtw_start(ifp); 2537 2538 splx(s); 2539 } 2540 2541 void 2542 urtw_txeof_normal(struct usbd_xfer *xfer, void *priv, 2543 usbd_status status) 2544 { 2545 struct urtw_tx_data *data = priv; 2546 struct urtw_softc *sc = data->sc; 2547 struct ieee80211com *ic = &sc->sc_ic; 2548 struct ifnet *ifp = ic->ic_ifp; 2549 int s; 2550 2551 if (status != USBD_NORMAL_COMPLETION) { 2552 if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) 2553 return; 2554 2555 printf("%s: could not transmit buffer: %s\n", 2556 device_xname(sc->sc_dev), usbd_errstr(status)); 2557 2558 if (status == USBD_STALLED) 2559 usbd_clear_endpoint_stall_async(sc->sc_txpipe_normal); 2560 2561 ifp->if_oerrors++; 2562 return; 2563 } 2564 2565 s = splnet(); 2566 2567 ieee80211_free_node(data->ni); 2568 data->ni = NULL; 2569 2570 sc->sc_txtimer = 0; 2571 ifp->if_opackets++; 2572 2573 sc->sc_tx_queued[URTW_PRIORITY_NORMAL]--; 2574 ifp->if_flags &= ~IFF_OACTIVE; 2575 urtw_start(ifp); 2576 2577 splx(s); 2578 } 2579 2580 int 2581 urtw_tx_start(struct urtw_softc *sc, struct ieee80211_node *ni, struct mbuf *m0, 2582 int prior) 2583 { 2584 struct ieee80211com *ic = &sc->sc_ic; 2585 struct urtw_tx_data *data; 2586 struct ieee80211_frame *wh; 2587 struct ieee80211_key *k; 2588 usbd_status error; 2589 int xferlen; 2590 2591 wh = mtod(m0, struct ieee80211_frame *); 2592 2593 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) { 2594 k = ieee80211_crypto_encap(ic, ni, m0); 2595 if (k == NULL) { 2596 m_freem(m0); 2597 return ENOBUFS; 2598 } 2599 /* packet header may have moved, reset our local pointer */ 2600 wh = mtod(m0, struct ieee80211_frame *); 2601 } 2602 2603 if (sc->sc_drvbpf != NULL) { 2604 struct urtw_tx_radiotap_header *tap = &sc->sc_txtap; 2605 2606 tap->wt_flags = 0; 2607 tap->wt_rate = 0; 2608 tap->wt_chan_freq = htole16(ic->ic_bss->ni_chan->ic_freq); 2609 tap->wt_chan_flags = htole16(ic->ic_bss->ni_chan->ic_flags); 2610 2611 bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0); 2612 } 2613 2614 if (sc->sc_hwrev & URTW_HWREV_8187) 2615 xferlen = m0->m_pkthdr.len + 4 * 3; 2616 else 2617 xferlen = m0->m_pkthdr.len + 4 * 8; 2618 2619 if ((0 == xferlen % 64) || (0 == xferlen % 512)) 2620 xferlen += 1; 2621 2622 data = &sc->sc_tx_data[prior][sc->sc_txidx[prior]]; 2623 sc->sc_txidx[prior] = 2624 (sc->sc_txidx[prior] + 1) % URTW_TX_DATA_LIST_COUNT; 2625 2626 memset(data->buf, 0, URTW_TX_MAXSIZE); 2627 data->buf[0] = m0->m_pkthdr.len & 0xff; 2628 data->buf[1] = (m0->m_pkthdr.len & 0x0f00) >> 8; 2629 data->buf[1] |= (1 << 7); 2630 2631 /* XXX sc_preamble_mode is always 2. */ 2632 if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) && 2633 (ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_PREAMBLE) && 2634 (sc->sc_preamble_mode == 1) && (sc->sc_currate != 0)) 2635 data->buf[2] |= 1; 2636 if ((m0->m_pkthdr.len > ic->ic_rtsthreshold) && 2637 prior == URTW_PRIORITY_LOW) 2638 panic("TODO tx."); 2639 if (wh->i_fc[1] & IEEE80211_FC1_MORE_FRAG) 2640 data->buf[2] |= (1 << 1); 2641 /* RTS rate - 10 means we use a basic rate. */ 2642 data->buf[2] |= (urtw_rate2rtl(2) << 3); 2643 /* 2644 * XXX currently TX rate control depends on the rate value of 2645 * RX descriptor because I don't know how to we can control TX rate 2646 * in more smart way. Please fix me you find a thing. 2647 */ 2648 data->buf[3] = sc->sc_currate; 2649 if (prior == URTW_PRIORITY_NORMAL) { 2650 if (IEEE80211_IS_MULTICAST(wh->i_addr1)) 2651 data->buf[3] = urtw_rate2rtl(ni->ni_rates.rs_rates[0]); 2652 else if (ic->ic_fixed_rate != -1) 2653 data->buf[3] = urtw_rate2rtl(ic->ic_fixed_rate); 2654 } 2655 2656 if (sc->sc_hwrev & URTW_HWREV_8187) { 2657 data->buf[8] = 3; /* CW minimum */ 2658 data->buf[8] |= (7 << 4); /* CW maximum */ 2659 data->buf[9] |= 11; /* retry limitation */ 2660 m_copydata(m0, 0, m0->m_pkthdr.len, (uint8_t *)&data->buf[12]); 2661 } else { 2662 data->buf[21] |= 11; /* retry limitation */ 2663 m_copydata(m0, 0, m0->m_pkthdr.len, (uint8_t *)&data->buf[32]); 2664 } 2665 2666 data->ni = ni; 2667 2668 /* mbuf is no longer needed. */ 2669 m_freem(m0); 2670 2671 usbd_setup_xfer(data->xfer, data, data->buf, xferlen, 2672 USBD_FORCE_SHORT_XFER, URTW_DATA_TIMEOUT, 2673 (prior == URTW_PRIORITY_LOW) ? urtw_txeof_low : urtw_txeof_normal); 2674 error = usbd_transfer(data->xfer); 2675 if (error != USBD_IN_PROGRESS && error != USBD_NORMAL_COMPLETION) { 2676 printf("%s: could not send frame: %s\n", 2677 device_xname(sc->sc_dev), usbd_errstr(error)); 2678 return EIO; 2679 } 2680 2681 error = urtw_led_ctl(sc, URTW_LED_CTL_TX); 2682 if (error != 0) 2683 printf("%s: could not control LED (%d)\n", 2684 device_xname(sc->sc_dev), error); 2685 2686 sc->sc_tx_queued[prior]++; 2687 2688 return 0; 2689 } 2690 2691 usbd_status 2692 urtw_8225_usb_init(struct urtw_softc *sc) 2693 { 2694 uint8_t data; 2695 usbd_status error; 2696 2697 urtw_write8_m(sc, URTW_RF_PINS_SELECT + 1, 0); 2698 urtw_write8_m(sc, URTW_GPIO, 0); 2699 error = urtw_read8e(sc, 0x53, &data); 2700 if (error) 2701 goto fail; 2702 error = urtw_write8e(sc, 0x53, data | (1 << 7)); 2703 if (error) 2704 goto fail; 2705 urtw_write8_m(sc, URTW_RF_PINS_SELECT + 1, 4); 2706 urtw_write8_m(sc, URTW_GPIO, 0x20); 2707 urtw_write8_m(sc, URTW_GP_ENABLE, 0); 2708 2709 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x80); 2710 urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x80); 2711 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x80); 2712 2713 usbd_delay_ms(sc->sc_udev, 500); 2714 fail: 2715 return error; 2716 } 2717 2718 usbd_status 2719 urtw_8185_rf_pins_enable(struct urtw_softc *sc) 2720 { 2721 usbd_status error = 0; 2722 2723 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x1ff7); 2724 fail: 2725 return error; 2726 } 2727 2728 usbd_status 2729 urtw_8187_write_phy(struct urtw_softc *sc, uint8_t addr, uint32_t data) 2730 { 2731 uint32_t phyw; 2732 usbd_status error; 2733 2734 phyw = ((data << 8) | (addr | 0x80)); 2735 urtw_write8_m(sc, 0x7f, ((phyw & 0xff000000) >> 24)); 2736 urtw_write8_m(sc, 0x7e, ((phyw & 0x00ff0000) >> 16)); 2737 urtw_write8_m(sc, 0x7d, ((phyw & 0x0000ff00) >> 8)); 2738 urtw_write8_m(sc, 0x7c, ((phyw & 0x000000ff))); 2739 /* 2740 * Delay removed from 8185 to 8187. 2741 * usbd_delay_ms(sc->sc_udev, 1); 2742 */ 2743 fail: 2744 return error; 2745 } 2746 2747 usbd_status 2748 urtw_8187_write_phy_ofdm_c(struct urtw_softc *sc, uint8_t addr, uint32_t data) 2749 { 2750 data = data & 0xff; 2751 return urtw_8187_write_phy(sc, addr, data); 2752 } 2753 2754 usbd_status 2755 urtw_8187_write_phy_cck_c(struct urtw_softc *sc, uint8_t addr, uint32_t data) 2756 { 2757 data = data & 0xff; 2758 return urtw_8187_write_phy(sc, addr, data | 0x10000); 2759 } 2760 2761 usbd_status 2762 urtw_8225_setgain(struct urtw_softc *sc, int16_t gain) 2763 { 2764 usbd_status error; 2765 2766 urtw_8187_write_phy_ofdm(sc, 0x0d, urtw_8225_gain[gain * 4]); 2767 urtw_8187_write_phy_ofdm(sc, 0x1b, urtw_8225_gain[gain * 4 + 2]); 2768 urtw_8187_write_phy_ofdm(sc, 0x1d, urtw_8225_gain[gain * 4 + 3]); 2769 urtw_8187_write_phy_ofdm(sc, 0x23, urtw_8225_gain[gain * 4 + 1]); 2770 fail: 2771 return error; 2772 } 2773 2774 usbd_status 2775 urtw_8225_set_txpwrlvl(struct urtw_softc *sc, int chan) 2776 { 2777 int i, idx, set; 2778 uint8_t *cck_pwltable; 2779 uint8_t cck_pwrlvl_max, ofdm_pwrlvl_min, ofdm_pwrlvl_max; 2780 uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff; 2781 uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff; 2782 usbd_status error; 2783 2784 cck_pwrlvl_max = 11; 2785 ofdm_pwrlvl_max = 25; /* 12 -> 25 */ 2786 ofdm_pwrlvl_min = 10; 2787 2788 /* CCK power setting */ 2789 cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ? cck_pwrlvl_max : cck_pwrlvl; 2790 idx = cck_pwrlvl % 6; 2791 set = cck_pwrlvl / 6; 2792 cck_pwltable = (chan == 14) ? urtw_8225_txpwr_cck_ch14 : 2793 urtw_8225_txpwr_cck; 2794 2795 urtw_write8_m(sc, URTW_TX_GAIN_CCK, 2796 urtw_8225_tx_gain_cck_ofdm[set] >> 1); 2797 for (i = 0; i < 8; i++) { 2798 urtw_8187_write_phy_cck(sc, 0x44 + i, 2799 cck_pwltable[idx * 8 + i]); 2800 } 2801 usbd_delay_ms(sc->sc_udev, 1); 2802 2803 /* OFDM power setting */ 2804 ofdm_pwrlvl = (ofdm_pwrlvl > (ofdm_pwrlvl_max - ofdm_pwrlvl_min)) ? 2805 ofdm_pwrlvl_max : ofdm_pwrlvl + ofdm_pwrlvl_min; 2806 ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl; 2807 2808 idx = ofdm_pwrlvl % 6; 2809 set = ofdm_pwrlvl / 6; 2810 2811 error = urtw_8185_set_anaparam2(sc, URTW_8187_8225_ANAPARAM2_ON); 2812 if (error) 2813 goto fail; 2814 urtw_8187_write_phy_ofdm(sc, 2, 0x42); 2815 urtw_8187_write_phy_ofdm(sc, 6, 0); 2816 urtw_8187_write_phy_ofdm(sc, 8, 0); 2817 2818 urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 2819 urtw_8225_tx_gain_cck_ofdm[set] >> 1); 2820 urtw_8187_write_phy_ofdm(sc, 0x5, urtw_8225_txpwr_ofdm[idx]); 2821 urtw_8187_write_phy_ofdm(sc, 0x7, urtw_8225_txpwr_ofdm[idx]); 2822 usbd_delay_ms(sc->sc_udev, 1); 2823 fail: 2824 return error; 2825 } 2826 2827 usbd_status 2828 urtw_8185_tx_antenna(struct urtw_softc *sc, uint8_t ant) 2829 { 2830 usbd_status error; 2831 2832 urtw_write8_m(sc, URTW_TX_ANTENNA, ant); 2833 usbd_delay_ms(sc->sc_udev, 1); 2834 fail: 2835 return error; 2836 } 2837 2838 usbd_status 2839 urtw_8225_rf_init(struct urtw_rf *rf) 2840 { 2841 struct urtw_softc *sc = rf->rf_sc; 2842 unsigned int i; 2843 uint16_t data; 2844 usbd_status error; 2845 2846 error = urtw_8180_set_anaparam(sc, URTW_8187_8225_ANAPARAM_ON); 2847 if (error) 2848 goto fail; 2849 2850 error = urtw_8225_usb_init(sc); 2851 if (error) 2852 goto fail; 2853 2854 urtw_write32_m(sc, URTW_RF_TIMING, 0x000a8008); 2855 urtw_read16_m(sc, URTW_8187_BRSR, &data); /* XXX ??? */ 2856 urtw_write16_m(sc, URTW_8187_BRSR, 0xffff); 2857 urtw_write32_m(sc, URTW_RF_PARA, 0x100044); 2858 2859 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 2860 if (error) 2861 goto fail; 2862 urtw_write8_m(sc, URTW_CONFIG3, 0x44); 2863 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 2864 if (error) 2865 goto fail; 2866 2867 error = urtw_8185_rf_pins_enable(sc); 2868 if (error) 2869 goto fail; 2870 2871 usbd_delay_ms(sc->sc_udev, 500); 2872 2873 for (i = 0; i < __arraycount(urtw_8225_rf_part1); i++) { 2874 urtw_8225_write(sc, urtw_8225_rf_part1[i].reg, 2875 urtw_8225_rf_part1[i].val); 2876 } 2877 usbd_delay_ms(sc->sc_udev, 50); 2878 urtw_8225_write(sc, 0x2, 0xc4d); 2879 usbd_delay_ms(sc->sc_udev, 200); 2880 urtw_8225_write(sc, 0x2, 0x44d); 2881 usbd_delay_ms(sc->sc_udev, 200); 2882 urtw_8225_write(sc, 0x0, 0x127); 2883 2884 for (i = 0; i < __arraycount(urtw_8225_rxgain); i++) { 2885 urtw_8225_write(sc, 0x1, (uint8_t)(i + 1)); 2886 urtw_8225_write(sc, 0x2, urtw_8225_rxgain[i]); 2887 } 2888 2889 urtw_8225_write(sc, 0x0, 0x27); 2890 urtw_8225_write(sc, 0x0, 0x22f); 2891 2892 for (i = 0; i < __arraycount(urtw_8225_agc); i++) { 2893 urtw_8187_write_phy_ofdm(sc, 0xb, urtw_8225_agc[i]); 2894 urtw_8187_write_phy_ofdm(sc, 0xa, (uint8_t)i + 0x80); 2895 } 2896 2897 for (i = 0; i < __arraycount(urtw_8225_rf_part2); i++) { 2898 urtw_8187_write_phy_ofdm(sc, urtw_8225_rf_part2[i].reg, 2899 urtw_8225_rf_part2[i].val); 2900 usbd_delay_ms(sc->sc_udev, 1); 2901 } 2902 2903 error = urtw_8225_setgain(sc, 4); 2904 if (error) 2905 goto fail; 2906 2907 for (i = 0; i < __arraycount(urtw_8225_rf_part3); i++) { 2908 urtw_8187_write_phy_cck(sc, urtw_8225_rf_part3[i].reg, 2909 urtw_8225_rf_part3[i].val); 2910 usbd_delay_ms(sc->sc_udev, 1); 2911 } 2912 2913 urtw_write8_m(sc, 0x5b, 0x0d); 2914 2915 error = urtw_8225_set_txpwrlvl(sc, 1); 2916 if (error) 2917 goto fail; 2918 2919 urtw_8187_write_phy_cck(sc, 0x10, 0x9b); 2920 usbd_delay_ms(sc->sc_udev, 1); 2921 urtw_8187_write_phy_ofdm(sc, 0x26, 0x90); 2922 usbd_delay_ms(sc->sc_udev, 1); 2923 2924 /* TX ant A, 0x0 for B */ 2925 error = urtw_8185_tx_antenna(sc, 0x3); 2926 if (error) 2927 goto fail; 2928 urtw_write32_m(sc, 0x94, 0x3dc00002); 2929 2930 error = urtw_8225_rf_set_chan(rf, 1); 2931 fail: 2932 return error; 2933 } 2934 2935 usbd_status 2936 urtw_8225_rf_set_chan(struct urtw_rf *rf, int chan) 2937 { 2938 struct urtw_softc *sc = rf->rf_sc; 2939 struct ieee80211com *ic = &sc->sc_ic; 2940 struct ieee80211_channel *c = ic->ic_ibss_chan; 2941 usbd_status error; 2942 2943 error = urtw_8225_set_txpwrlvl(sc, chan); 2944 if (error) 2945 goto fail; 2946 urtw_8225_write(sc, 0x7, urtw_8225_channel[chan]); 2947 usbd_delay_ms(sc->sc_udev, 10); 2948 2949 urtw_write8_m(sc, URTW_SIFS, 0x22); 2950 2951 if (sc->sc_state == IEEE80211_S_ASSOC && 2952 ic->ic_flags & IEEE80211_F_SHSLOT) 2953 urtw_write8_m(sc, URTW_SLOT, 0x9); 2954 else 2955 urtw_write8_m(sc, URTW_SLOT, 0x14); 2956 2957 if (IEEE80211_IS_CHAN_G(c)) { 2958 urtw_write8_m(sc, URTW_DIFS, 0x14); 2959 urtw_write8_m(sc, URTW_8187_EIFS, 0x5b - 0x14); 2960 urtw_write8_m(sc, URTW_CW_VAL, 0x73); 2961 } else { 2962 urtw_write8_m(sc, URTW_DIFS, 0x24); 2963 urtw_write8_m(sc, URTW_8187_EIFS, 0x5b - 0x24); 2964 urtw_write8_m(sc, URTW_CW_VAL, 0xa5); 2965 } 2966 2967 fail: 2968 return error; 2969 } 2970 2971 usbd_status 2972 urtw_8225_rf_set_sens(struct urtw_rf *rf) 2973 { 2974 struct urtw_softc *sc = rf->rf_sc; 2975 usbd_status error; 2976 2977 if (rf->sens > 6) 2978 return -1; 2979 2980 if (rf->sens > 4) 2981 urtw_8225_write(sc, 0x0c, 0x850); 2982 else 2983 urtw_8225_write(sc, 0x0c, 0x50); 2984 2985 rf->sens = 6 - rf->sens; 2986 error = urtw_8225_setgain(sc, rf->sens); 2987 if (error) 2988 goto fail; 2989 2990 urtw_8187_write_phy_cck(sc, 0x41, urtw_8225_threshold[rf->sens]); 2991 2992 fail: 2993 return error; 2994 } 2995 2996 void 2997 urtw_stop(struct ifnet *ifp, int disable) 2998 { 2999 struct urtw_softc *sc = ifp->if_softc; 3000 struct ieee80211com *ic = &sc->sc_ic; 3001 uint8_t data; 3002 usbd_status error; 3003 3004 ieee80211_new_state(ic, IEEE80211_S_INIT, -1); 3005 3006 sc->sc_txtimer = 0; 3007 ifp->if_timer = 0; 3008 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); 3009 3010 callout_stop(&sc->scan_to); 3011 callout_stop(&sc->sc_led_ch); 3012 3013 urtw_intr_disable(sc); 3014 urtw_read8_m(sc, URTW_CMD, &data); 3015 data &= ~URTW_CMD_TX_ENABLE; 3016 data &= ~URTW_CMD_RX_ENABLE; 3017 urtw_write8_m(sc, URTW_CMD, data); 3018 3019 if (sc->sc_rxpipe != NULL) 3020 usbd_abort_pipe(sc->sc_rxpipe); 3021 if (sc->sc_txpipe_low != NULL) 3022 usbd_abort_pipe(sc->sc_txpipe_low); 3023 if (sc->sc_txpipe_normal != NULL) 3024 usbd_abort_pipe(sc->sc_txpipe_normal); 3025 3026 fail: 3027 return; 3028 } 3029 3030 int 3031 urtw_isbmode(uint16_t rate) 3032 { 3033 rate = urtw_rtl2rate(rate); 3034 3035 return ((rate <= 22 && rate != 12 && rate != 18) || 3036 rate == 44) ? 1 : 0; 3037 } 3038 3039 void 3040 urtw_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status) 3041 { 3042 struct urtw_rx_data *data = priv; 3043 struct urtw_softc *sc = data->sc; 3044 struct ieee80211com *ic = &sc->sc_ic; 3045 struct ifnet *ifp = ic->ic_ifp; 3046 struct ieee80211_frame *wh; 3047 struct ieee80211_node *ni; 3048 struct mbuf *m, *mnew; 3049 uint8_t *desc, quality, rate; 3050 int actlen, flen, len, rssi, s; 3051 3052 if (status != USBD_NORMAL_COMPLETION) { 3053 if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) 3054 return; 3055 3056 if (status == USBD_STALLED) 3057 usbd_clear_endpoint_stall_async(sc->sc_rxpipe); 3058 ifp->if_ierrors++; 3059 goto skip; 3060 } 3061 3062 usbd_get_xfer_status(xfer, NULL, NULL, &actlen, NULL); 3063 if (actlen < URTW_MIN_RXBUFSZ) { 3064 ifp->if_ierrors++; 3065 goto skip; 3066 } 3067 3068 if (sc->sc_hwrev & URTW_HWREV_8187) 3069 /* 4 dword and 4 byte CRC */ 3070 len = actlen - (4 * 4); 3071 else 3072 /* 5 dword and 4 byte CRC */ 3073 len = actlen - (4 * 5); 3074 3075 desc = data->buf + len; 3076 flen = ((desc[1] & 0x0f) << 8) + (desc[0] & 0xff); 3077 if (flen > actlen) { 3078 ifp->if_ierrors++; 3079 goto skip; 3080 } 3081 3082 rate = (desc[2] & 0xf0) >> 4; 3083 if (sc->sc_hwrev & URTW_HWREV_8187) { 3084 quality = desc[4] & 0xff; 3085 rssi = (desc[6] & 0xfe) >> 1; 3086 3087 /* XXX correct? */ 3088 if (!urtw_isbmode(rate)) { 3089 rssi = (rssi > 90) ? 90 : ((rssi < 25) ? 25 : rssi); 3090 rssi = ((90 - rssi) * 100) / 65; 3091 } else { 3092 rssi = (rssi > 90) ? 95 : ((rssi < 30) ? 30 : rssi); 3093 rssi = ((95 - rssi) * 100) / 65; 3094 } 3095 } else { 3096 quality = desc[12]; 3097 rssi = 14 - desc[14] / 2; 3098 } 3099 3100 MGETHDR(mnew, M_DONTWAIT, MT_DATA); 3101 if (mnew == NULL) { 3102 printf("%s: could not allocate rx mbuf\n", 3103 device_xname(sc->sc_dev)); 3104 ifp->if_ierrors++; 3105 goto skip; 3106 } 3107 MCLGET(mnew, M_DONTWAIT); 3108 if (!(mnew->m_flags & M_EXT)) { 3109 printf("%s: could not allocate rx mbuf cluster\n", 3110 device_xname(sc->sc_dev)); 3111 m_freem(mnew); 3112 ifp->if_ierrors++; 3113 goto skip; 3114 } 3115 3116 m = data->m; 3117 data->m = mnew; 3118 data->buf = mtod(mnew, uint8_t *); 3119 3120 /* finalize mbuf */ 3121 m_set_rcvif(m, ifp); 3122 m->m_pkthdr.len = m->m_len = flen - 4; 3123 3124 s = splnet(); 3125 3126 if (sc->sc_drvbpf != NULL) { 3127 struct urtw_rx_radiotap_header *tap = &sc->sc_rxtap; 3128 3129 /* XXX Are variables correct? */ 3130 tap->wr_chan_freq = htole16(ic->ic_ibss_chan->ic_freq); 3131 tap->wr_chan_flags = htole16(ic->ic_ibss_chan->ic_flags); 3132 tap->wr_dbm_antsignal = (int8_t)rssi; 3133 3134 bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m); 3135 } 3136 wh = mtod(m, struct ieee80211_frame *); 3137 if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_DATA) 3138 sc->sc_currate = (rate > 0) ? rate : sc->sc_currate; 3139 ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh); 3140 3141 /* XXX correct? */ 3142 if (!urtw_isbmode(rate)) { 3143 if (quality > 127) 3144 quality = 0; 3145 else if (quality < 27) 3146 quality = 100; 3147 else 3148 quality = 127 - quality; 3149 } else 3150 quality = (quality > 64) ? 0 : ((64 - quality) * 100) / 64; 3151 3152 /* send the frame to the 802.11 layer */ 3153 ieee80211_input(ic, m, ni, rssi, 0); 3154 3155 /* node is no longer needed */ 3156 ieee80211_free_node(ni); 3157 3158 splx(s); 3159 3160 skip: /* setup a new transfer */ 3161 usbd_setup_xfer(xfer, data, data->buf, MCLBYTES, 3162 USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, urtw_rxeof); 3163 (void)usbd_transfer(xfer); 3164 } 3165 3166 usbd_status 3167 urtw_8225v2_setgain(struct urtw_softc *sc, int16_t gain) 3168 { 3169 uint8_t *gainp; 3170 usbd_status error; 3171 3172 /* XXX for A? */ 3173 gainp = urtw_8225v2_gain_bg; 3174 urtw_8187_write_phy_ofdm(sc, 0x0d, gainp[gain * 3]); 3175 usbd_delay_ms(sc->sc_udev, 1); 3176 urtw_8187_write_phy_ofdm(sc, 0x1b, gainp[gain * 3 + 1]); 3177 usbd_delay_ms(sc->sc_udev, 1); 3178 urtw_8187_write_phy_ofdm(sc, 0x1d, gainp[gain * 3 + 2]); 3179 usbd_delay_ms(sc->sc_udev, 1); 3180 urtw_8187_write_phy_ofdm(sc, 0x21, 0x17); 3181 usbd_delay_ms(sc->sc_udev, 1); 3182 fail: 3183 return error; 3184 } 3185 3186 usbd_status 3187 urtw_8225v2_set_txpwrlvl(struct urtw_softc *sc, int chan) 3188 { 3189 int i; 3190 uint8_t *cck_pwrtable; 3191 uint8_t cck_pwrlvl_max = 15, ofdm_pwrlvl_max = 25, ofdm_pwrlvl_min = 10; 3192 uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff; 3193 uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff; 3194 usbd_status error; 3195 3196 /* CCK power setting */ 3197 cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ? cck_pwrlvl_max : cck_pwrlvl; 3198 cck_pwrlvl += sc->sc_txpwr_cck_base; 3199 cck_pwrlvl = (cck_pwrlvl > 35) ? 35 : cck_pwrlvl; 3200 cck_pwrtable = (chan == 14) ? urtw_8225v2_txpwr_cck_ch14 : 3201 urtw_8225v2_txpwr_cck; 3202 3203 for (i = 0; i < 8; i++) { 3204 urtw_8187_write_phy_cck(sc, 0x44 + i, cck_pwrtable[i]); 3205 } 3206 urtw_write8_m(sc, URTW_TX_GAIN_CCK, 3207 urtw_8225v2_tx_gain_cck_ofdm[cck_pwrlvl]); 3208 usbd_delay_ms(sc->sc_udev, 1); 3209 3210 /* OFDM power setting */ 3211 ofdm_pwrlvl = (ofdm_pwrlvl > (ofdm_pwrlvl_max - ofdm_pwrlvl_min)) ? 3212 ofdm_pwrlvl_max : ofdm_pwrlvl + ofdm_pwrlvl_min; 3213 ofdm_pwrlvl += sc->sc_txpwr_ofdm_base; 3214 ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl; 3215 3216 error = urtw_8185_set_anaparam2(sc, URTW_8187_8225_ANAPARAM2_ON); 3217 if (error) 3218 goto fail; 3219 3220 urtw_8187_write_phy_ofdm(sc, 2, 0x42); 3221 urtw_8187_write_phy_ofdm(sc, 5, 0x0); 3222 urtw_8187_write_phy_ofdm(sc, 6, 0x40); 3223 urtw_8187_write_phy_ofdm(sc, 7, 0x0); 3224 urtw_8187_write_phy_ofdm(sc, 8, 0x40); 3225 3226 urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 3227 urtw_8225v2_tx_gain_cck_ofdm[ofdm_pwrlvl]); 3228 usbd_delay_ms(sc->sc_udev, 1); 3229 fail: 3230 return error; 3231 } 3232 3233 usbd_status 3234 urtw_8225v2_rf_init(struct urtw_rf *rf) 3235 { 3236 struct urtw_softc *sc = rf->rf_sc; 3237 int i; 3238 uint16_t data; 3239 uint32_t data32; 3240 usbd_status error; 3241 3242 error = urtw_8180_set_anaparam(sc, URTW_8187_8225_ANAPARAM_ON); 3243 if (error) 3244 goto fail; 3245 3246 error = urtw_8225_usb_init(sc); 3247 if (error) 3248 goto fail; 3249 3250 urtw_write32_m(sc, URTW_RF_TIMING, 0x000a8008); 3251 urtw_read16_m(sc, URTW_8187_BRSR, &data); /* XXX ??? */ 3252 urtw_write16_m(sc, URTW_8187_BRSR, 0xffff); 3253 urtw_write32_m(sc, URTW_RF_PARA, 0x100044); 3254 3255 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 3256 if (error) 3257 goto fail; 3258 urtw_write8_m(sc, URTW_CONFIG3, 0x44); 3259 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 3260 if (error) 3261 goto fail; 3262 3263 error = urtw_8185_rf_pins_enable(sc); 3264 if (error) 3265 goto fail; 3266 3267 usbd_delay_ms(sc->sc_udev, 1000); 3268 3269 for (i = 0; i < __arraycount(urtw_8225v2_rf_part1); i++) { 3270 urtw_8225_write(sc, urtw_8225v2_rf_part1[i].reg, 3271 urtw_8225v2_rf_part1[i].val); 3272 usbd_delay_ms(sc->sc_udev, 1); 3273 } 3274 usbd_delay_ms(sc->sc_udev, 50); 3275 3276 urtw_8225_write(sc, 0x0, 0x1b7); 3277 3278 for (i = 0; i < __arraycount(urtw_8225v2_rxgain); i++) { 3279 urtw_8225_write(sc, 0x1, (uint8_t)(i + 1)); 3280 urtw_8225_write(sc, 0x2, urtw_8225v2_rxgain[i]); 3281 } 3282 3283 urtw_8225_write(sc, 0x3, 0x2); 3284 urtw_8225_write(sc, 0x5, 0x4); 3285 urtw_8225_write(sc, 0x0, 0xb7); 3286 urtw_8225_write(sc, 0x2, 0xc4d); 3287 usbd_delay_ms(sc->sc_udev, 100); 3288 urtw_8225_write(sc, 0x2, 0x44d); 3289 usbd_delay_ms(sc->sc_udev, 100); 3290 3291 error = urtw_8225_read(sc, 0x6, &data32); 3292 if (error != 0) 3293 goto fail; 3294 if (data32 != 0xe6) 3295 printf("%s: expect 0xe6!! (0x%x)\n", device_xname(sc->sc_dev), 3296 data32); 3297 if (!(data32 & 0x80)) { 3298 urtw_8225_write(sc, 0x02, 0x0c4d); 3299 usbd_delay_ms(sc->sc_udev, 200); 3300 urtw_8225_write(sc, 0x02, 0x044d); 3301 usbd_delay_ms(sc->sc_udev, 100); 3302 error = urtw_8225_read(sc, 0x6, &data32); 3303 if (error != 0) 3304 goto fail; 3305 if (!(data32 & 0x80)) 3306 printf("%s: RF calibration failed\n", 3307 device_xname(sc->sc_dev)); 3308 } 3309 usbd_delay_ms(sc->sc_udev, 100); 3310 3311 urtw_8225_write(sc, 0x0, 0x2bf); 3312 for (i = 0; i < __arraycount(urtw_8225_agc); i++) { 3313 urtw_8187_write_phy_ofdm(sc, 0xb, urtw_8225_agc[i]); 3314 urtw_8187_write_phy_ofdm(sc, 0xa, (uint8_t)i + 0x80); 3315 } 3316 3317 for (i = 0; i < __arraycount(urtw_8225v2_rf_part2); i++) { 3318 urtw_8187_write_phy_ofdm(sc, urtw_8225v2_rf_part2[i].reg, 3319 urtw_8225v2_rf_part2[i].val); 3320 } 3321 3322 error = urtw_8225v2_setgain(sc, 4); 3323 if (error) 3324 goto fail; 3325 3326 for (i = 0; i < __arraycount(urtw_8225v2_rf_part3); i++) { 3327 urtw_8187_write_phy_cck(sc, urtw_8225v2_rf_part3[i].reg, 3328 urtw_8225v2_rf_part3[i].val); 3329 } 3330 3331 urtw_write8_m(sc, 0x5b, 0x0d); 3332 3333 error = urtw_8225v2_set_txpwrlvl(sc, 1); 3334 if (error) 3335 goto fail; 3336 3337 urtw_8187_write_phy_cck(sc, 0x10, 0x9b); 3338 urtw_8187_write_phy_ofdm(sc, 0x26, 0x90); 3339 3340 /* TX ant A, 0x0 for B */ 3341 error = urtw_8185_tx_antenna(sc, 0x3); 3342 if (error) 3343 goto fail; 3344 urtw_write32_m(sc, 0x94, 0x3dc00002); 3345 3346 error = urtw_8225_rf_set_chan(rf, 1); 3347 fail: 3348 return error; 3349 } 3350 3351 usbd_status 3352 urtw_8225v2_rf_set_chan(struct urtw_rf *rf, int chan) 3353 { 3354 struct urtw_softc *sc = rf->rf_sc; 3355 struct ieee80211com *ic = &sc->sc_ic; 3356 struct ieee80211_channel *c = ic->ic_ibss_chan; 3357 usbd_status error; 3358 3359 error = urtw_8225v2_set_txpwrlvl(sc, chan); 3360 if (error) 3361 goto fail; 3362 3363 urtw_8225_write(sc, 0x7, urtw_8225_channel[chan]); 3364 usbd_delay_ms(sc->sc_udev, 10); 3365 3366 urtw_write8_m(sc, URTW_SIFS, 0x22); 3367 3368 if(sc->sc_state == IEEE80211_S_ASSOC && 3369 ic->ic_flags & IEEE80211_F_SHSLOT) 3370 urtw_write8_m(sc, URTW_SLOT, 0x9); 3371 else 3372 urtw_write8_m(sc, URTW_SLOT, 0x14); 3373 3374 if (IEEE80211_IS_CHAN_G(c)) { 3375 urtw_write8_m(sc, URTW_DIFS, 0x14); 3376 urtw_write8_m(sc, URTW_8187_EIFS, 0x5b - 0x14); 3377 urtw_write8_m(sc, URTW_CW_VAL, 0x73); 3378 } else { 3379 urtw_write8_m(sc, URTW_DIFS, 0x24); 3380 urtw_write8_m(sc, URTW_8187_EIFS, 0x5b - 0x24); 3381 urtw_write8_m(sc, URTW_CW_VAL, 0xa5); 3382 } 3383 3384 fail: 3385 return error; 3386 } 3387 3388 void 3389 urtw_set_chan(struct urtw_softc *sc, struct ieee80211_channel *c) 3390 { 3391 struct urtw_rf *rf = &sc->sc_rf; 3392 struct ieee80211com *ic = &sc->sc_ic; 3393 usbd_status error = 0; 3394 uint32_t data; 3395 u_int chan; 3396 3397 chan = ieee80211_chan2ieee(ic, c); 3398 if (chan == 0 || chan == IEEE80211_CHAN_ANY) 3399 return; 3400 /* 3401 * During changing the channel we need to temporary disable 3402 * TX. 3403 */ 3404 urtw_read32_m(sc, URTW_TX_CONF, &data); 3405 data &= ~URTW_TX_LOOPBACK_MASK; 3406 urtw_write32_m(sc, URTW_TX_CONF, data | URTW_TX_LOOPBACK_MAC); 3407 error = rf->set_chan(rf, chan); 3408 if (error != 0) { 3409 printf("%s could not change the channel\n", 3410 device_xname(sc->sc_dev)); 3411 return; 3412 } 3413 usbd_delay_ms(sc->sc_udev, 10); 3414 urtw_write32_m(sc, URTW_TX_CONF, data | URTW_TX_LOOPBACK_NONE); 3415 3416 fail: return; 3417 3418 } 3419 3420 void 3421 urtw_next_scan(void *arg) 3422 { 3423 struct urtw_softc *sc = arg; 3424 struct ieee80211com *ic = &sc->sc_ic; 3425 int s; 3426 3427 if (sc->sc_dying) 3428 return; 3429 3430 s = splnet(); 3431 if (ic->ic_state == IEEE80211_S_SCAN) 3432 ieee80211_next_scan(ic); 3433 splx(s); 3434 } 3435 3436 void 3437 urtw_task(void *arg) 3438 { 3439 struct urtw_softc *sc = arg; 3440 struct ieee80211com *ic = &sc->sc_ic; 3441 struct ieee80211_node *ni; 3442 enum ieee80211_state ostate; 3443 usbd_status error = 0; 3444 3445 if (sc->sc_dying) 3446 return; 3447 3448 ostate = ic->ic_state; 3449 3450 switch (sc->sc_state) { 3451 case IEEE80211_S_INIT: 3452 if (ostate == IEEE80211_S_RUN) { 3453 /* turn link LED off */ 3454 (void)urtw_led_off(sc, URTW_LED_GPIO); 3455 } 3456 break; 3457 3458 case IEEE80211_S_SCAN: 3459 urtw_set_chan(sc, ic->ic_curchan); 3460 if (!sc->sc_dying) 3461 callout_schedule(&sc->scan_to, mstohz(200)); 3462 break; 3463 3464 case IEEE80211_S_AUTH: 3465 case IEEE80211_S_ASSOC: 3466 urtw_set_chan(sc, ic->ic_curchan); 3467 break; 3468 3469 case IEEE80211_S_RUN: 3470 ni = ic->ic_bss; 3471 3472 urtw_set_chan(sc, ic->ic_curchan); 3473 3474 /* setting bssid. */ 3475 error = urtw_set_bssid(sc, ni->ni_bssid); 3476 if (error != 0) 3477 goto fail; 3478 urtw_update_msr(sc); 3479 /* XXX maybe the below would be incorrect. */ 3480 urtw_write16_m(sc, URTW_ATIM_WND, 2); 3481 urtw_write16_m(sc, URTW_ATIM_TR_ITV, 100); 3482 urtw_write16_m(sc, URTW_BEACON_INTERVAL, 0x64); 3483 urtw_write16_m(sc, URTW_BEACON_INTERVAL_TIME, 0x3ff); 3484 error = urtw_led_ctl(sc, URTW_LED_CTL_LINK); 3485 if (error != 0) 3486 printf("%s: could not control LED (%d)\n", 3487 device_xname(sc->sc_dev), error); 3488 break; 3489 } 3490 3491 sc->sc_newstate(ic, sc->sc_state, sc->sc_arg); 3492 3493 fail: 3494 if (error != 0) { 3495 DPRINTF(("%s: error duing processing RUN state.", 3496 device_xname(sc->sc_dev))); 3497 } 3498 } 3499 3500 usbd_status 3501 urtw_8187b_update_wmm(struct urtw_softc *sc) 3502 { 3503 struct ieee80211com *ic = &sc->sc_ic; 3504 struct ieee80211_channel *c = ic->ic_ibss_chan; 3505 uint32_t data; 3506 uint8_t aifs, sifs, slot, ecwmin, ecwmax; 3507 usbd_status error; 3508 3509 sifs = 0xa; 3510 if (IEEE80211_IS_CHAN_G(c)) 3511 slot = 0x9; 3512 else 3513 slot = 0x14; 3514 3515 aifs = (2 * slot) + sifs; 3516 ecwmin = 3; 3517 ecwmax = 7; 3518 3519 data = ((uint32_t)aifs << 0) | /* AIFS, offset 0 */ 3520 ((uint32_t)ecwmin << 8) | /* ECW minimum, offset 8 */ 3521 ((uint32_t)ecwmax << 12); /* ECW maximum, offset 16 */ 3522 3523 urtw_write32_m(sc, URTW_AC_VO, data); 3524 urtw_write32_m(sc, URTW_AC_VI, data); 3525 urtw_write32_m(sc, URTW_AC_BE, data); 3526 urtw_write32_m(sc, URTW_AC_BK, data); 3527 3528 fail: 3529 return error; 3530 } 3531 3532 usbd_status 3533 urtw_8187b_reset(struct urtw_softc *sc) 3534 { 3535 uint8_t data; 3536 usbd_status error; 3537 3538 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 3539 if (error) 3540 goto fail; 3541 3542 urtw_read8_m(sc, URTW_CONFIG3, &data); 3543 urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE | 3544 URTW_CONFIG3_GNT_SELECT); 3545 3546 urtw_write32_m(sc, URTW_ANAPARAM2, URTW_8187B_8225_ANAPARAM2_ON); 3547 urtw_write32_m(sc, URTW_ANAPARAM, URTW_8187B_8225_ANAPARAM_ON); 3548 urtw_write8_m(sc, URTW_ANAPARAM3, URTW_8187B_8225_ANAPARAM3_ON); 3549 3550 urtw_write8_m(sc, 0x61, 0x10); 3551 urtw_read8_m(sc, 0x62, &data); 3552 urtw_write8_m(sc, 0x62, data & ~(1 << 5)); 3553 urtw_write8_m(sc, 0x62, data | (1 << 5)); 3554 3555 urtw_read8_m(sc, URTW_CONFIG3, &data); 3556 urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE); 3557 3558 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 3559 if (error) 3560 goto fail; 3561 3562 urtw_read8_m(sc, URTW_CMD, &data); 3563 data = (data & 2) | URTW_CMD_RST; 3564 urtw_write8_m(sc, URTW_CMD, data); 3565 usbd_delay_ms(sc->sc_udev, 100); 3566 3567 urtw_read8_m(sc, URTW_CMD, &data); 3568 if (data & URTW_CMD_RST) { 3569 printf("%s: reset timeout\n", device_xname(sc->sc_dev)); 3570 goto fail; 3571 } 3572 3573 fail: 3574 return error; 3575 } 3576 3577 int 3578 urtw_8187b_init(struct ifnet *ifp) 3579 { 3580 struct urtw_softc *sc = ifp->if_softc; 3581 struct urtw_rf *rf = &sc->sc_rf; 3582 struct ieee80211com *ic = &sc->sc_ic; 3583 uint8_t data; 3584 usbd_status error; 3585 3586 urtw_stop(ifp, 0); 3587 3588 error = urtw_8187b_update_wmm(sc); 3589 if (error != 0) 3590 goto fail; 3591 error = urtw_8187b_reset(sc); 3592 if (error) 3593 goto fail; 3594 3595 /* Applying MAC address again. */ 3596 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 3597 if (error) 3598 goto fail; 3599 IEEE80211_ADDR_COPY(ic->ic_myaddr, CLLADDR(ifp->if_sadl)); 3600 error = urtw_set_macaddr(sc, ic->ic_myaddr); 3601 if (error) 3602 goto fail; 3603 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 3604 if (error) 3605 goto fail; 3606 3607 error = urtw_update_msr(sc); 3608 if (error) 3609 goto fail; 3610 3611 error = rf->init(rf); 3612 if (error != 0) 3613 goto fail; 3614 3615 urtw_write8_m(sc, URTW_CMD, URTW_CMD_TX_ENABLE | 3616 URTW_CMD_RX_ENABLE); 3617 error = urtw_intr_enable(sc); 3618 if (error != 0) 3619 goto fail; 3620 3621 error = urtw_write8e(sc, 0x41, 0xf4); 3622 if (error != 0) 3623 goto fail; 3624 error = urtw_write8e(sc, 0x40, 0x00); 3625 if (error != 0) 3626 goto fail; 3627 error = urtw_write8e(sc, 0x42, 0x00); 3628 if (error != 0) 3629 goto fail; 3630 error = urtw_write8e(sc, 0x42, 0x01); 3631 if (error != 0) 3632 goto fail; 3633 error = urtw_write8e(sc, 0x40, 0x0f); 3634 if (error != 0) 3635 goto fail; 3636 error = urtw_write8e(sc, 0x42, 0x00); 3637 if (error != 0) 3638 goto fail; 3639 error = urtw_write8e(sc, 0x42, 0x01); 3640 if (error != 0) 3641 goto fail; 3642 3643 urtw_read8_m(sc, 0xdb, &data); 3644 urtw_write8_m(sc, 0xdb, data | (1 << 2)); 3645 urtw_write16_idx_m(sc, 0x72, 0x59fa, 3); 3646 urtw_write16_idx_m(sc, 0x74, 0x59d2, 3); 3647 urtw_write16_idx_m(sc, 0x76, 0x59d2, 3); 3648 urtw_write16_idx_m(sc, 0x78, 0x19fa, 3); 3649 urtw_write16_idx_m(sc, 0x7a, 0x19fa, 3); 3650 urtw_write16_idx_m(sc, 0x7c, 0x00d0, 3); 3651 urtw_write8_m(sc, 0x61, 0); 3652 urtw_write8_idx_m(sc, 0x80, 0x0f, 1); 3653 urtw_write8_idx_m(sc, 0x83, 0x03, 1); 3654 urtw_write8_m(sc, 0xda, 0x10); 3655 urtw_write8_idx_m(sc, 0x4d, 0x08, 2); 3656 3657 urtw_write32_m(sc, URTW_HSSI_PARA, 0x0600321b); 3658 3659 urtw_write16_idx_m(sc, 0xec, 0x0800, 1); 3660 3661 urtw_write8_m(sc, URTW_ACM_CONTROL, 0); 3662 3663 /* Reset softc variables. */ 3664 for (size_t j = 0; j < URTW_PRIORITY_MAX; j++) { 3665 sc->sc_txidx[j] = sc->sc_tx_queued[j] = 0; 3666 } 3667 sc->sc_txtimer = 0; 3668 3669 if (!(sc->sc_flags & URTW_INIT_ONCE)) { 3670 error = usbd_set_config_no(sc->sc_udev, URTW_CONFIG_NO, 0); 3671 if (error != 0) { 3672 aprint_error_dev(sc->sc_dev, "failed to set configuration" 3673 ", err=%s\n", usbd_errstr(error)); 3674 3675 goto fail; 3676 } 3677 /* Get the first interface handle. */ 3678 error = usbd_device2interface_handle(sc->sc_udev, 3679 URTW_IFACE_INDEX, &sc->sc_iface); 3680 if (error != 0) { 3681 printf("%s: could not get interface handle\n", 3682 device_xname(sc->sc_dev)); 3683 goto fail; 3684 } 3685 error = urtw_open_pipes(sc); 3686 if (error != 0) 3687 goto fail; 3688 error = urtw_alloc_rx_data_list(sc); 3689 if (error != 0) 3690 goto fail; 3691 error = urtw_alloc_tx_data_list(sc); 3692 if (error != 0) 3693 goto fail; 3694 sc->sc_flags |= URTW_INIT_ONCE; 3695 } 3696 3697 error = urtw_rx_enable(sc); 3698 if (error != 0) 3699 goto fail; 3700 error = urtw_tx_enable(sc); 3701 if (error != 0) 3702 goto fail; 3703 3704 ifp->if_flags &= ~IFF_OACTIVE; 3705 ifp->if_flags |= IFF_RUNNING; 3706 3707 if (ic->ic_opmode == IEEE80211_M_MONITOR) 3708 ieee80211_new_state(ic, IEEE80211_S_RUN, -1); 3709 else 3710 ieee80211_new_state(ic, IEEE80211_S_SCAN, -1); 3711 3712 fail: 3713 return error; 3714 } 3715 3716 usbd_status 3717 urtw_8225v2_b_config_mac(struct urtw_softc *sc) 3718 { 3719 int i; 3720 usbd_status error; 3721 3722 for (i = 0; i < __arraycount(urtw_8187b_regtbl); i++) { 3723 urtw_write8_idx_m(sc, urtw_8187b_regtbl[i].reg, 3724 urtw_8187b_regtbl[i].val, urtw_8187b_regtbl[i].idx); 3725 } 3726 3727 urtw_write16_m(sc, URTW_TID_AC_MAP, 0xfa50); 3728 urtw_write16_m(sc, URTW_INT_MIG, 0); 3729 3730 urtw_write32_idx_m(sc, 0xf0, 0, 1); 3731 urtw_write32_idx_m(sc, 0xf4, 0, 1); 3732 urtw_write8_idx_m(sc, 0xf8, 0, 1); 3733 3734 urtw_write32_m(sc, URTW_RF_TIMING, 0x00004001); 3735 3736 fail: 3737 return error; 3738 } 3739 3740 usbd_status 3741 urtw_8225v2_b_init_rfe(struct urtw_softc *sc) 3742 { 3743 usbd_status error; 3744 3745 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x0480); 3746 urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x2488); 3747 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x1fff); 3748 usbd_delay_ms(sc->sc_udev, 100); 3749 3750 fail: 3751 return error; 3752 } 3753 3754 usbd_status 3755 urtw_8225v2_b_update_chan(struct urtw_softc *sc) 3756 { 3757 struct ieee80211com *ic = &sc->sc_ic; 3758 struct ieee80211_channel *c = ic->ic_ibss_chan; 3759 uint8_t aifs, difs, eifs, sifs, slot; 3760 usbd_status error; 3761 3762 urtw_write8_m(sc, URTW_SIFS, 0x22); 3763 3764 sifs = 0xa; 3765 if (IEEE80211_IS_CHAN_G(c)) { 3766 slot = 0x9; 3767 difs = 0x1c; 3768 eifs = 0x5b; 3769 } else { 3770 slot = 0x14; 3771 difs = 0x32; 3772 eifs = 0x5b; 3773 } 3774 aifs = (2 * slot) + sifs; 3775 3776 urtw_write8_m(sc, URTW_SLOT, slot); 3777 3778 urtw_write8_m(sc, URTW_AC_VO, aifs); 3779 urtw_write8_m(sc, URTW_AC_VI, aifs); 3780 urtw_write8_m(sc, URTW_AC_BE, aifs); 3781 urtw_write8_m(sc, URTW_AC_BK, aifs); 3782 3783 urtw_write8_m(sc, URTW_DIFS, difs); 3784 urtw_write8_m(sc, URTW_8187B_EIFS, eifs); 3785 3786 fail: 3787 return error; 3788 } 3789 3790 usbd_status 3791 urtw_8225v2_b_rf_init(struct urtw_rf *rf) 3792 { 3793 struct urtw_softc *sc = rf->rf_sc; 3794 unsigned int i; 3795 uint8_t data; 3796 usbd_status error; 3797 3798 /* Set up ACK rate, retry limit, TX AGC, TX antenna. */ 3799 urtw_write16_m(sc, URTW_8187B_BRSR, 0x0fff); 3800 urtw_read8_m(sc, URTW_CW_CONF, &data); 3801 urtw_write8_m(sc, URTW_CW_CONF, data | 3802 URTW_CW_CONF_PERPACKET_RETRY); 3803 urtw_read8_m(sc, URTW_TX_AGC_CTL, &data); 3804 urtw_write8_m(sc, URTW_TX_AGC_CTL, data | 3805 URTW_TX_AGC_CTL_PERPACKET_GAIN | 3806 URTW_TX_AGC_CTL_PERPACKET_ANTSEL); 3807 3808 /* Auto rate fallback control. */ 3809 urtw_write16_idx_m(sc, URTW_ARFR, 0x0fff, 1); /* 1M ~ 54M */ 3810 urtw_read8_m(sc, URTW_RATE_FALLBACK, &data); 3811 urtw_write8_m(sc, URTW_RATE_FALLBACK, data | 3812 URTW_RATE_FALLBACK_ENABLE); 3813 3814 urtw_write16_m(sc, URTW_BEACON_INTERVAL, 100); 3815 urtw_write16_m(sc, URTW_ATIM_WND, 2); 3816 urtw_write16_idx_m(sc, URTW_FEMR, 0xffff, 1); 3817 3818 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 3819 if (error) 3820 goto fail; 3821 urtw_read8_m(sc, URTW_CONFIG1, &data); 3822 urtw_write8_m(sc, URTW_CONFIG1, (data & 0x3f) | 0x80); 3823 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 3824 if (error) 3825 goto fail; 3826 3827 urtw_write8_m(sc, URTW_WPA_CONFIG, 0); 3828 urtw_8225v2_b_config_mac(sc); 3829 urtw_write16_idx_m(sc, URTW_RFSW_CTRL, 0x569a, 2); 3830 3831 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 3832 if (error) 3833 goto fail; 3834 urtw_read8_m(sc, URTW_CONFIG3, &data); 3835 urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE); 3836 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 3837 if (error) 3838 goto fail; 3839 3840 urtw_8225v2_b_init_rfe(sc); 3841 3842 for (i = 0; i < __arraycount(urtw_8225v2_b_rf); i++) { 3843 urtw_8225_write(sc, urtw_8225v2_b_rf[i].reg, 3844 urtw_8225v2_b_rf[i].val); 3845 } 3846 3847 for (i = 0; i < __arraycount(urtw_8225v2_rxgain); i++) { 3848 urtw_8225_write(sc, 0x1, (uint8_t)(i + 1)); 3849 urtw_8225_write(sc, 0x2, urtw_8225v2_rxgain[i]); 3850 } 3851 3852 urtw_8225_write(sc, 0x03, 0x080); 3853 urtw_8225_write(sc, 0x05, 0x004); 3854 urtw_8225_write(sc, 0x00, 0x0b7); 3855 urtw_8225_write(sc, 0x02, 0xc4d); 3856 urtw_8225_write(sc, 0x02, 0x44d); 3857 urtw_8225_write(sc, 0x00, 0x2bf); 3858 3859 urtw_write8_m(sc, URTW_TX_GAIN_CCK, 0x03); 3860 urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 0x07); 3861 urtw_write8_m(sc, URTW_TX_ANTENNA, 0x03); 3862 3863 urtw_8187_write_phy_ofdm(sc, 0x80, 0x12); 3864 for (i = 0; i < __arraycount(urtw_8225v2_agc); i++) { 3865 urtw_8187_write_phy_ofdm(sc, 0x0f, urtw_8225v2_agc[i]); 3866 urtw_8187_write_phy_ofdm(sc, 0x0e, (uint8_t)i + 0x80); 3867 urtw_8187_write_phy_ofdm(sc, 0x0e, 0); 3868 } 3869 urtw_8187_write_phy_ofdm(sc, 0x80, 0x10); 3870 3871 for (i = 0; i < __arraycount(urtw_8225v2_ofdm); i++) 3872 urtw_8187_write_phy_ofdm(sc, i, urtw_8225v2_ofdm[i]); 3873 3874 urtw_8225v2_b_update_chan(sc); 3875 3876 urtw_8187_write_phy_ofdm(sc, 0x97, 0x46); 3877 urtw_8187_write_phy_ofdm(sc, 0xa4, 0xb6); 3878 urtw_8187_write_phy_ofdm(sc, 0x85, 0xfc); 3879 urtw_8187_write_phy_cck(sc, 0xc1, 0x88); 3880 3881 error = urtw_8225v2_b_rf_set_chan(rf, 1); 3882 fail: 3883 return error; 3884 } 3885 3886 usbd_status 3887 urtw_8225v2_b_rf_set_chan(struct urtw_rf *rf, int chan) 3888 { 3889 struct urtw_softc *sc = rf->rf_sc; 3890 usbd_status error; 3891 3892 error = urtw_8225v2_b_set_txpwrlvl(sc, chan); 3893 if (error) 3894 goto fail; 3895 3896 urtw_8225_write(sc, 0x7, urtw_8225_channel[chan]); 3897 /* 3898 * Delay removed from 8185 to 8187. 3899 * usbd_delay_ms(sc->sc_udev, 10); 3900 */ 3901 3902 urtw_write16_m(sc, URTW_AC_VO, 0x5114); 3903 urtw_write16_m(sc, URTW_AC_VI, 0x5114); 3904 urtw_write16_m(sc, URTW_AC_BE, 0x5114); 3905 urtw_write16_m(sc, URTW_AC_BK, 0x5114); 3906 3907 fail: 3908 return error; 3909 } 3910 3911 usbd_status 3912 urtw_8225v2_b_set_txpwrlvl(struct urtw_softc *sc, int chan) 3913 { 3914 int i; 3915 uint8_t *cck_pwrtable; 3916 uint8_t cck_pwrlvl_min, cck_pwrlvl_max, ofdm_pwrlvl_min, 3917 ofdm_pwrlvl_max; 3918 int8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff; 3919 int8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff; 3920 usbd_status error; 3921 3922 if (sc->sc_hwrev & URTW_HWREV_8187B_B) { 3923 cck_pwrlvl_min = 0; 3924 cck_pwrlvl_max = 15; 3925 ofdm_pwrlvl_min = 2; 3926 ofdm_pwrlvl_max = 17; 3927 } else { 3928 cck_pwrlvl_min = 7; 3929 cck_pwrlvl_max = 22; 3930 ofdm_pwrlvl_min = 10; 3931 ofdm_pwrlvl_max = 25; 3932 } 3933 3934 /* CCK power setting */ 3935 cck_pwrlvl = (cck_pwrlvl > (cck_pwrlvl_max - cck_pwrlvl_min)) ? 3936 cck_pwrlvl_max : (cck_pwrlvl + cck_pwrlvl_min); 3937 3938 cck_pwrlvl += sc->sc_txpwr_cck_base; 3939 cck_pwrlvl = (cck_pwrlvl > 35) ? 35 : cck_pwrlvl; 3940 cck_pwrlvl = (cck_pwrlvl < 0) ? 0 : cck_pwrlvl; 3941 3942 cck_pwrtable = (chan == 14) ? urtw_8225v2_txpwr_cck_ch14 : 3943 urtw_8225v2_txpwr_cck; 3944 3945 if (sc->sc_hwrev & URTW_HWREV_8187B_B) { 3946 if (cck_pwrlvl <= 6) 3947 ; /* do nothing */ 3948 else if (cck_pwrlvl <= 11) 3949 cck_pwrtable += 8; 3950 else 3951 cck_pwrtable += 16; 3952 } else { 3953 if (cck_pwrlvl <= 5) 3954 ; /* do nothing */ 3955 else if (cck_pwrlvl <= 11) 3956 cck_pwrtable += 8; 3957 else if (cck_pwrlvl <= 17) 3958 cck_pwrtable += 16; 3959 else 3960 cck_pwrtable += 24; 3961 } 3962 3963 for (i = 0; i < 8; i++) { 3964 urtw_8187_write_phy_cck(sc, 0x44 + i, cck_pwrtable[i]); 3965 } 3966 3967 urtw_write8_m(sc, URTW_TX_GAIN_CCK, 3968 urtw_8225v2_tx_gain_cck_ofdm[cck_pwrlvl] << 1); 3969 /* 3970 * Delay removed from 8185 to 8187. 3971 * usbd_delay_ms(sc->sc_udev, 1); 3972 */ 3973 3974 /* OFDM power setting */ 3975 ofdm_pwrlvl = (ofdm_pwrlvl > (ofdm_pwrlvl_max - ofdm_pwrlvl_min)) ? 3976 ofdm_pwrlvl_max : ofdm_pwrlvl + ofdm_pwrlvl_min; 3977 3978 ofdm_pwrlvl += sc->sc_txpwr_ofdm_base; 3979 ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl; 3980 ofdm_pwrlvl = (ofdm_pwrlvl < 0) ? 0 : ofdm_pwrlvl; 3981 3982 urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 3983 urtw_8225v2_tx_gain_cck_ofdm[ofdm_pwrlvl] << 1); 3984 3985 if (sc->sc_hwrev & URTW_HWREV_8187B_B) { 3986 if (ofdm_pwrlvl <= 11) { 3987 urtw_8187_write_phy_ofdm(sc, 0x87, 0x60); 3988 urtw_8187_write_phy_ofdm(sc, 0x89, 0x60); 3989 } else { 3990 urtw_8187_write_phy_ofdm(sc, 0x87, 0x5c); 3991 urtw_8187_write_phy_ofdm(sc, 0x89, 0x5c); 3992 } 3993 } else { 3994 if (ofdm_pwrlvl <= 11) { 3995 urtw_8187_write_phy_ofdm(sc, 0x87, 0x5c); 3996 urtw_8187_write_phy_ofdm(sc, 0x89, 0x5c); 3997 } else if (ofdm_pwrlvl <= 17) { 3998 urtw_8187_write_phy_ofdm(sc, 0x87, 0x54); 3999 urtw_8187_write_phy_ofdm(sc, 0x89, 0x54); 4000 } else { 4001 urtw_8187_write_phy_ofdm(sc, 0x87, 0x50); 4002 urtw_8187_write_phy_ofdm(sc, 0x89, 0x50); 4003 } 4004 } 4005 4006 /* 4007 * Delay removed from 8185 to 8187. 4008 * usbd_delay_ms(sc->sc_udev, 1); 4009 */ 4010 fail: 4011 return error; 4012 } 4013 4014 int 4015 urtw_set_bssid(struct urtw_softc *sc, const uint8_t *bssid) 4016 { 4017 int error; 4018 4019 urtw_write32_m(sc, URTW_BSSID, 4020 bssid[0] | bssid[1] << 8 | bssid[2] << 16 | bssid[3] << 24); 4021 urtw_write16_m(sc, URTW_BSSID + 4, 4022 bssid[4] | bssid[5] << 8); 4023 4024 return 0; 4025 4026 fail: 4027 return error; 4028 } 4029 4030 int 4031 urtw_set_macaddr(struct urtw_softc *sc, const uint8_t *addr) 4032 { 4033 int error; 4034 4035 urtw_write32_m(sc, URTW_MAC0, 4036 addr[0] | addr[1] << 8 | addr[2] << 16 | addr[3] << 24); 4037 urtw_write16_m(sc, URTW_MAC4, 4038 addr[4] | addr[5] << 8); 4039 4040 return 0; 4041 4042 fail: 4043 return error; 4044 } 4045 4046 MODULE(MODULE_CLASS_DRIVER, if_urtw, "bpf"); 4047 4048 #ifdef _MODULE 4049 #include "ioconf.c" 4050 #endif 4051 4052 static int 4053 if_urtw_modcmd(modcmd_t cmd, void *aux) 4054 { 4055 int error = 0; 4056 4057 switch (cmd) { 4058 case MODULE_CMD_INIT: 4059 #ifdef _MODULE 4060 error = config_init_component(cfdriver_ioconf_urtw, 4061 cfattach_ioconf_urtw, cfdata_ioconf_urtw); 4062 #endif 4063 return error; 4064 case MODULE_CMD_FINI: 4065 #ifdef _MODULE 4066 error = config_fini_component(cfdriver_ioconf_urtw, 4067 cfattach_ioconf_urtw, cfdata_ioconf_urtw); 4068 #endif 4069 return error; 4070 default: 4071 return ENOTTY; 4072 } 4073 } 4074