1 1.60 christos /* $NetBSD: if_ure.c,v 1.60 2024/05/12 17:17:56 christos Exp $ */ 2 1.15 mrg /* $OpenBSD: if_ure.c,v 1.10 2018/11/02 21:32:30 jcs Exp $ */ 3 1.11 mrg 4 1.1 rin /*- 5 1.1 rin * Copyright (c) 2015-2016 Kevin Lo <kevlo (at) FreeBSD.org> 6 1.1 rin * All rights reserved. 7 1.1 rin * 8 1.1 rin * Redistribution and use in source and binary forms, with or without 9 1.1 rin * modification, are permitted provided that the following conditions 10 1.1 rin * are met: 11 1.1 rin * 1. Redistributions of source code must retain the above copyright 12 1.1 rin * notice, this list of conditions and the following disclaimer. 13 1.1 rin * 2. Redistributions in binary form must reproduce the above copyright 14 1.1 rin * notice, this list of conditions and the following disclaimer in the 15 1.1 rin * documentation and/or other materials provided with the distribution. 16 1.1 rin * 17 1.1 rin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 1.1 rin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 1.1 rin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 1.1 rin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 1.1 rin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 1.1 rin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 1.1 rin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 1.1 rin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 1.1 rin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 1.1 rin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 1.1 rin * SUCH DAMAGE. 28 1.1 rin */ 29 1.1 rin 30 1.1 rin /* RealTek RTL8152/RTL8153 10/100/Gigabit USB Ethernet device */ 31 1.1 rin 32 1.1 rin #include <sys/cdefs.h> 33 1.60 christos __KERNEL_RCSID(0, "$NetBSD: if_ure.c,v 1.60 2024/05/12 17:17:56 christos Exp $"); 34 1.1 rin 35 1.1 rin #ifdef _KERNEL_OPT 36 1.1 rin #include "opt_usb.h" 37 1.1 rin #include "opt_inet.h" 38 1.1 rin #endif 39 1.1 rin 40 1.1 rin #include <sys/param.h> 41 1.33 bad #include <sys/cprng.h> 42 1.1 rin 43 1.15 mrg #include <net/route.h> 44 1.1 rin 45 1.16 mrg #include <dev/usb/usbnet.h> 46 1.16 mrg 47 1.1 rin #include <netinet/in_offload.h> /* XXX for in_undefer_cksum() */ 48 1.1 rin #ifdef INET6 49 1.16 mrg #include <netinet/in.h> 50 1.1 rin #include <netinet6/in6_offload.h> /* XXX for in6_undefer_cksum() */ 51 1.1 rin #endif 52 1.1 rin 53 1.1 rin #include <dev/ic/rtl81x9reg.h> /* XXX for RTK_GMEDIASTAT */ 54 1.1 rin #include <dev/usb/if_urereg.h> 55 1.1 rin #include <dev/usb/if_urevar.h> 56 1.1 rin 57 1.15 mrg #define URE_PRINTF(un, fmt, args...) \ 58 1.15 mrg device_printf((un)->un_dev, "%s: " fmt, __func__, ##args); 59 1.1 rin 60 1.1 rin #define URE_DEBUG 61 1.1 rin #ifdef URE_DEBUG 62 1.1 rin #define DPRINTF(x) do { if (uredebug) printf x; } while (0) 63 1.1 rin #define DPRINTFN(n, x) do { if (uredebug >= (n)) printf x; } while (0) 64 1.28 mrg int uredebug = 0; 65 1.1 rin #else 66 1.1 rin #define DPRINTF(x) 67 1.1 rin #define DPRINTFN(n, x) 68 1.1 rin #endif 69 1.1 rin 70 1.33 bad #define ETHER_IS_ZERO(addr) \ 71 1.33 bad (!(addr[0] | addr[1] | addr[2] | addr[3] | addr[4] | addr[5])) 72 1.33 bad 73 1.1 rin static const struct usb_devno ure_devs[] = { 74 1.1 rin { USB_VENDOR_REALTEK, USB_PRODUCT_REALTEK_RTL8152 }, 75 1.60 christos { USB_VENDOR_REALTEK, USB_PRODUCT_REALTEK_RTL8153 }, 76 1.60 christos { USB_VENDOR_TPLINK, USB_PRODUCT_TPLINK_UE300 }, 77 1.1 rin }; 78 1.1 rin 79 1.19 mrg #define URE_BUFSZ (16 * 1024) 80 1.19 mrg 81 1.15 mrg static void ure_reset(struct usbnet *); 82 1.1 rin static uint32_t ure_txcsum(struct mbuf *); 83 1.1 rin static int ure_rxcsum(struct ifnet *, struct ure_rxpkt *); 84 1.20 mrg static void ure_rtl8152_init(struct usbnet *); 85 1.20 mrg static void ure_rtl8153_init(struct usbnet *); 86 1.20 mrg static void ure_disable_teredo(struct usbnet *); 87 1.20 mrg static void ure_init_fifo(struct usbnet *); 88 1.19 mrg 89 1.38 thorpej static void ure_uno_stop(struct ifnet *, int); 90 1.43 riastrad static void ure_uno_mcast(struct ifnet *); 91 1.38 thorpej static int ure_uno_mii_read_reg(struct usbnet *, int, int, uint16_t *); 92 1.38 thorpej static int ure_uno_mii_write_reg(struct usbnet *, int, int, uint16_t); 93 1.38 thorpej static void ure_uno_miibus_statchg(struct ifnet *); 94 1.38 thorpej static unsigned ure_uno_tx_prepare(struct usbnet *, struct mbuf *, 95 1.38 thorpej struct usbnet_chain *); 96 1.38 thorpej static void ure_uno_rx_loop(struct usbnet *, struct usbnet_chain *, 97 1.38 thorpej uint32_t); 98 1.38 thorpej static int ure_uno_init(struct ifnet *); 99 1.19 mrg 100 1.19 mrg static int ure_match(device_t, cfdata_t, void *); 101 1.19 mrg static void ure_attach(device_t, device_t, void *); 102 1.1 rin 103 1.20 mrg CFATTACH_DECL_NEW(ure, sizeof(struct usbnet), ure_match, ure_attach, 104 1.15 mrg usbnet_detach, usbnet_activate); 105 1.1 rin 106 1.34 maxv static const struct usbnet_ops ure_ops = { 107 1.38 thorpej .uno_stop = ure_uno_stop, 108 1.43 riastrad .uno_mcast = ure_uno_mcast, 109 1.38 thorpej .uno_read_reg = ure_uno_mii_read_reg, 110 1.38 thorpej .uno_write_reg = ure_uno_mii_write_reg, 111 1.38 thorpej .uno_statchg = ure_uno_miibus_statchg, 112 1.38 thorpej .uno_tx_prepare = ure_uno_tx_prepare, 113 1.38 thorpej .uno_rx_loop = ure_uno_rx_loop, 114 1.38 thorpej .uno_init = ure_uno_init, 115 1.19 mrg }; 116 1.19 mrg 117 1.1 rin static int 118 1.15 mrg ure_ctl(struct usbnet *un, uint8_t rw, uint16_t val, uint16_t index, 119 1.1 rin void *buf, int len) 120 1.1 rin { 121 1.1 rin usb_device_request_t req; 122 1.1 rin usbd_status err; 123 1.1 rin 124 1.19 mrg if (usbnet_isdying(un)) 125 1.1 rin return 0; 126 1.1 rin 127 1.1 rin if (rw == URE_CTL_WRITE) 128 1.1 rin req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 129 1.1 rin else 130 1.1 rin req.bmRequestType = UT_READ_VENDOR_DEVICE; 131 1.1 rin req.bRequest = UR_SET_ADDRESS; 132 1.1 rin USETW(req.wValue, val); 133 1.1 rin USETW(req.wIndex, index); 134 1.1 rin USETW(req.wLength, len); 135 1.1 rin 136 1.37 martin DPRINTFN(5, ("ure_ctl: rw %d, val %04hu, index %04hu, len %d\n", 137 1.1 rin rw, val, index, len)); 138 1.15 mrg err = usbd_do_request(un->un_udev, &req, buf); 139 1.1 rin if (err) { 140 1.1 rin DPRINTF(("ure_ctl: error %d\n", err)); 141 1.51 riastrad if (rw == URE_CTL_READ) 142 1.51 riastrad memset(buf, 0, len); 143 1.1 rin return -1; 144 1.1 rin } 145 1.1 rin 146 1.1 rin return 0; 147 1.1 rin } 148 1.1 rin 149 1.1 rin static int 150 1.15 mrg ure_read_mem(struct usbnet *un, uint16_t addr, uint16_t index, 151 1.1 rin void *buf, int len) 152 1.1 rin { 153 1.15 mrg return ure_ctl(un, URE_CTL_READ, addr, index, buf, len); 154 1.1 rin } 155 1.1 rin 156 1.1 rin static int 157 1.15 mrg ure_write_mem(struct usbnet *un, uint16_t addr, uint16_t index, 158 1.1 rin void *buf, int len) 159 1.1 rin { 160 1.15 mrg return ure_ctl(un, URE_CTL_WRITE, addr, index, buf, len); 161 1.1 rin } 162 1.1 rin 163 1.1 rin static uint8_t 164 1.15 mrg ure_read_1(struct usbnet *un, uint16_t reg, uint16_t index) 165 1.1 rin { 166 1.1 rin uint32_t val; 167 1.1 rin uint8_t temp[4]; 168 1.1 rin uint8_t shift; 169 1.1 rin 170 1.1 rin shift = (reg & 3) << 3; 171 1.1 rin reg &= ~3; 172 1.5 msaitoh 173 1.15 mrg ure_read_mem(un, reg, index, &temp, 4); 174 1.1 rin val = UGETDW(temp); 175 1.1 rin val >>= shift; 176 1.1 rin 177 1.1 rin return val & 0xff; 178 1.1 rin } 179 1.1 rin 180 1.1 rin static uint16_t 181 1.15 mrg ure_read_2(struct usbnet *un, uint16_t reg, uint16_t index) 182 1.1 rin { 183 1.1 rin uint32_t val; 184 1.1 rin uint8_t temp[4]; 185 1.1 rin uint8_t shift; 186 1.1 rin 187 1.1 rin shift = (reg & 2) << 3; 188 1.1 rin reg &= ~3; 189 1.1 rin 190 1.15 mrg ure_read_mem(un, reg, index, &temp, 4); 191 1.1 rin val = UGETDW(temp); 192 1.1 rin val >>= shift; 193 1.1 rin 194 1.1 rin return val & 0xffff; 195 1.1 rin } 196 1.1 rin 197 1.1 rin static uint32_t 198 1.15 mrg ure_read_4(struct usbnet *un, uint16_t reg, uint16_t index) 199 1.1 rin { 200 1.1 rin uint8_t temp[4]; 201 1.1 rin 202 1.15 mrg ure_read_mem(un, reg, index, &temp, 4); 203 1.1 rin return UGETDW(temp); 204 1.1 rin } 205 1.1 rin 206 1.1 rin static int 207 1.15 mrg ure_write_1(struct usbnet *un, uint16_t reg, uint16_t index, uint32_t val) 208 1.1 rin { 209 1.1 rin uint16_t byen; 210 1.1 rin uint8_t temp[4]; 211 1.1 rin uint8_t shift; 212 1.1 rin 213 1.1 rin byen = URE_BYTE_EN_BYTE; 214 1.1 rin shift = reg & 3; 215 1.1 rin val &= 0xff; 216 1.1 rin 217 1.1 rin if (reg & 3) { 218 1.1 rin byen <<= shift; 219 1.1 rin val <<= (shift << 3); 220 1.1 rin reg &= ~3; 221 1.1 rin } 222 1.1 rin 223 1.1 rin USETDW(temp, val); 224 1.15 mrg return ure_write_mem(un, reg, index | byen, &temp, 4); 225 1.1 rin } 226 1.1 rin 227 1.1 rin static int 228 1.15 mrg ure_write_2(struct usbnet *un, uint16_t reg, uint16_t index, uint32_t val) 229 1.1 rin { 230 1.1 rin uint16_t byen; 231 1.1 rin uint8_t temp[4]; 232 1.1 rin uint8_t shift; 233 1.1 rin 234 1.1 rin byen = URE_BYTE_EN_WORD; 235 1.1 rin shift = reg & 2; 236 1.1 rin val &= 0xffff; 237 1.1 rin 238 1.1 rin if (reg & 2) { 239 1.1 rin byen <<= shift; 240 1.1 rin val <<= (shift << 3); 241 1.1 rin reg &= ~3; 242 1.1 rin } 243 1.1 rin 244 1.1 rin USETDW(temp, val); 245 1.15 mrg return ure_write_mem(un, reg, index | byen, &temp, 4); 246 1.1 rin } 247 1.1 rin 248 1.1 rin static int 249 1.15 mrg ure_write_4(struct usbnet *un, uint16_t reg, uint16_t index, uint32_t val) 250 1.1 rin { 251 1.1 rin uint8_t temp[4]; 252 1.1 rin 253 1.1 rin USETDW(temp, val); 254 1.15 mrg return ure_write_mem(un, reg, index | URE_BYTE_EN_DWORD, &temp, 4); 255 1.1 rin } 256 1.1 rin 257 1.1 rin static uint16_t 258 1.15 mrg ure_ocp_reg_read(struct usbnet *un, uint16_t addr) 259 1.1 rin { 260 1.1 rin uint16_t reg; 261 1.1 rin 262 1.15 mrg ure_write_2(un, URE_PLA_OCP_GPHY_BASE, URE_MCU_TYPE_PLA, addr & 0xf000); 263 1.1 rin reg = (addr & 0x0fff) | 0xb000; 264 1.1 rin 265 1.15 mrg return ure_read_2(un, reg, URE_MCU_TYPE_PLA); 266 1.1 rin } 267 1.1 rin 268 1.1 rin static void 269 1.15 mrg ure_ocp_reg_write(struct usbnet *un, uint16_t addr, uint16_t data) 270 1.1 rin { 271 1.1 rin uint16_t reg; 272 1.1 rin 273 1.15 mrg ure_write_2(un, URE_PLA_OCP_GPHY_BASE, URE_MCU_TYPE_PLA, addr & 0xf000); 274 1.1 rin reg = (addr & 0x0fff) | 0xb000; 275 1.1 rin 276 1.15 mrg ure_write_2(un, reg, URE_MCU_TYPE_PLA, data); 277 1.1 rin } 278 1.1 rin 279 1.30 mrg static int 280 1.38 thorpej ure_uno_mii_read_reg(struct usbnet *un, int phy, int reg, uint16_t *val) 281 1.1 rin { 282 1.29 mrg 283 1.51 riastrad if (un->un_phyno != phy) { 284 1.51 riastrad *val = 0; 285 1.30 mrg return EINVAL; 286 1.51 riastrad } 287 1.29 mrg 288 1.1 rin /* Let the rgephy driver read the URE_PLA_PHYSTATUS register. */ 289 1.1 rin if (reg == RTK_GMEDIASTAT) { 290 1.15 mrg *val = ure_read_1(un, URE_PLA_PHYSTATUS, URE_MCU_TYPE_PLA); 291 1.15 mrg return USBD_NORMAL_COMPLETION; 292 1.1 rin } 293 1.1 rin 294 1.15 mrg *val = ure_ocp_reg_read(un, URE_OCP_BASE_MII + reg * 2); 295 1.1 rin 296 1.30 mrg return 0; 297 1.1 rin } 298 1.1 rin 299 1.30 mrg static int 300 1.38 thorpej ure_uno_mii_write_reg(struct usbnet *un, int phy, int reg, uint16_t val) 301 1.1 rin { 302 1.29 mrg 303 1.29 mrg if (un->un_phyno != phy) 304 1.30 mrg return EINVAL; 305 1.29 mrg 306 1.15 mrg ure_ocp_reg_write(un, URE_OCP_BASE_MII + reg * 2, val); 307 1.1 rin 308 1.30 mrg return 0; 309 1.1 rin } 310 1.1 rin 311 1.1 rin static void 312 1.38 thorpej ure_uno_miibus_statchg(struct ifnet *ifp) 313 1.1 rin { 314 1.15 mrg struct usbnet * const un = ifp->if_softc; 315 1.15 mrg struct mii_data * const mii = usbnet_mii(un); 316 1.1 rin 317 1.19 mrg if (usbnet_isdying(un)) 318 1.1 rin return; 319 1.1 rin 320 1.1 rin if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) == 321 1.1 rin (IFM_ACTIVE | IFM_AVALID)) { 322 1.1 rin switch (IFM_SUBTYPE(mii->mii_media_active)) { 323 1.1 rin case IFM_10_T: 324 1.1 rin case IFM_100_TX: 325 1.21 mrg usbnet_set_link(un, true); 326 1.1 rin break; 327 1.1 rin case IFM_1000_T: 328 1.20 mrg if ((un->un_flags & URE_FLAG_8152) != 0) 329 1.1 rin break; 330 1.21 mrg usbnet_set_link(un, true); 331 1.1 rin break; 332 1.1 rin default: 333 1.1 rin break; 334 1.1 rin } 335 1.1 rin } 336 1.1 rin } 337 1.1 rin 338 1.1 rin static void 339 1.48 riastrad ure_uno_mcast(struct ifnet *ifp) 340 1.1 rin { 341 1.48 riastrad struct usbnet *un = ifp->if_softc; 342 1.15 mrg struct ethercom *ec = usbnet_ec(un); 343 1.1 rin struct ether_multi *enm; 344 1.1 rin struct ether_multistep step; 345 1.40 nisimura uint32_t mchash[2] = { 0, 0 }; 346 1.40 nisimura uint32_t h = 0, rxmode; 347 1.1 rin 348 1.19 mrg if (usbnet_isdying(un)) 349 1.1 rin return; 350 1.1 rin 351 1.15 mrg rxmode = ure_read_4(un, URE_PLA_RCR, URE_MCU_TYPE_PLA); 352 1.40 nisimura rxmode &= ~(URE_RCR_AAP | URE_RCR_AM); 353 1.40 nisimura /* continue to accept my own DA and bcast frames */ 354 1.1 rin 355 1.40 nisimura ETHER_LOCK(ec); 356 1.57 riastrad if (usbnet_ispromisc(un)) { 357 1.13 mrg ec->ec_flags |= ETHER_F_ALLMULTI; 358 1.13 mrg ETHER_UNLOCK(ec); 359 1.40 nisimura /* run promisc. mode */ 360 1.40 nisimura rxmode |= URE_RCR_AM; /* ??? */ 361 1.40 nisimura rxmode |= URE_RCR_AAP; 362 1.59 riastrad mchash[0] = mchash[1] = 0xffffffff; 363 1.40 nisimura goto update; 364 1.40 nisimura } 365 1.40 nisimura ec->ec_flags &= ~ETHER_F_ALLMULTI; 366 1.40 nisimura ETHER_FIRST_MULTI(step, ec, enm); 367 1.40 nisimura while (enm != NULL) { 368 1.40 nisimura if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { 369 1.40 nisimura ec->ec_flags |= ETHER_F_ALLMULTI; 370 1.40 nisimura ETHER_UNLOCK(ec); 371 1.40 nisimura /* accept all mcast frames */ 372 1.40 nisimura rxmode |= URE_RCR_AM; 373 1.40 nisimura mchash[0] = mchash[1] = ~0U; /* necessary ?? */ 374 1.40 nisimura goto update; 375 1.1 rin } 376 1.40 nisimura h = ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN); 377 1.58 msaitoh mchash[h >> 31] |= 1U << ((h >> 26) & 0x1f); 378 1.40 nisimura ETHER_NEXT_MULTI(step, enm); 379 1.40 nisimura } 380 1.40 nisimura ETHER_UNLOCK(ec); 381 1.40 nisimura if (h != 0) { 382 1.40 nisimura rxmode |= URE_RCR_AM; /* activate mcast hash filter */ 383 1.40 nisimura h = bswap32(mchash[0]); 384 1.40 nisimura mchash[0] = bswap32(mchash[1]); 385 1.40 nisimura mchash[1] = h; 386 1.40 nisimura } 387 1.40 nisimura update: 388 1.40 nisimura ure_write_4(un, URE_PLA_MAR0, URE_MCU_TYPE_PLA, mchash[0]); 389 1.40 nisimura ure_write_4(un, URE_PLA_MAR4, URE_MCU_TYPE_PLA, mchash[1]); 390 1.15 mrg ure_write_4(un, URE_PLA_RCR, URE_MCU_TYPE_PLA, rxmode); 391 1.1 rin } 392 1.1 rin 393 1.1 rin static void 394 1.15 mrg ure_reset(struct usbnet *un) 395 1.1 rin { 396 1.1 rin int i; 397 1.1 rin 398 1.15 mrg ure_write_1(un, URE_PLA_CR, URE_MCU_TYPE_PLA, URE_CR_RST); 399 1.1 rin 400 1.1 rin for (i = 0; i < URE_TIMEOUT; i++) { 401 1.42 riastrad if (usbnet_isdying(un)) 402 1.42 riastrad return; 403 1.15 mrg if (!(ure_read_1(un, URE_PLA_CR, URE_MCU_TYPE_PLA) & 404 1.1 rin URE_CR_RST)) 405 1.1 rin break; 406 1.15 mrg usbd_delay_ms(un->un_udev, 10); 407 1.1 rin } 408 1.1 rin if (i == URE_TIMEOUT) 409 1.15 mrg URE_PRINTF(un, "reset never completed\n"); 410 1.1 rin } 411 1.1 rin 412 1.1 rin static int 413 1.46 riastrad ure_uno_init(struct ifnet *ifp) 414 1.1 rin { 415 1.15 mrg struct usbnet * const un = ifp->if_softc; 416 1.1 rin uint8_t eaddr[8]; 417 1.1 rin 418 1.1 rin /* Set MAC address. */ 419 1.1 rin memset(eaddr, 0, sizeof(eaddr)); 420 1.1 rin memcpy(eaddr, CLLADDR(ifp->if_sadl), ETHER_ADDR_LEN); 421 1.15 mrg ure_write_1(un, URE_PLA_CRWECR, URE_MCU_TYPE_PLA, URE_CRWECR_CONFIG); 422 1.15 mrg ure_write_mem(un, URE_PLA_IDR, URE_MCU_TYPE_PLA | URE_BYTE_EN_SIX_BYTES, 423 1.1 rin eaddr, 8); 424 1.15 mrg ure_write_1(un, URE_PLA_CRWECR, URE_MCU_TYPE_PLA, URE_CRWECR_NORAML); 425 1.1 rin 426 1.1 rin /* Reset the packet filter. */ 427 1.15 mrg ure_write_2(un, URE_PLA_FMC, URE_MCU_TYPE_PLA, 428 1.15 mrg ure_read_2(un, URE_PLA_FMC, URE_MCU_TYPE_PLA) & 429 1.1 rin ~URE_FMC_FCR_MCU_EN); 430 1.15 mrg ure_write_2(un, URE_PLA_FMC, URE_MCU_TYPE_PLA, 431 1.15 mrg ure_read_2(un, URE_PLA_FMC, URE_MCU_TYPE_PLA) | 432 1.1 rin URE_FMC_FCR_MCU_EN); 433 1.5 msaitoh 434 1.1 rin /* Enable transmit and receive. */ 435 1.15 mrg ure_write_1(un, URE_PLA_CR, URE_MCU_TYPE_PLA, 436 1.15 mrg ure_read_1(un, URE_PLA_CR, URE_MCU_TYPE_PLA) | URE_CR_RE | 437 1.1 rin URE_CR_TE); 438 1.1 rin 439 1.15 mrg ure_write_2(un, URE_PLA_MISC_1, URE_MCU_TYPE_PLA, 440 1.15 mrg ure_read_2(un, URE_PLA_MISC_1, URE_MCU_TYPE_PLA) & 441 1.1 rin ~URE_RXDY_GATED_EN); 442 1.1 rin 443 1.55 riastrad return 0; 444 1.1 rin } 445 1.1 rin 446 1.1 rin static void 447 1.38 thorpej ure_uno_stop(struct ifnet *ifp, int disable __unused) 448 1.1 rin { 449 1.15 mrg struct usbnet * const un = ifp->if_softc; 450 1.1 rin 451 1.15 mrg ure_reset(un); 452 1.11 mrg } 453 1.11 mrg 454 1.11 mrg static void 455 1.20 mrg ure_rtl8152_init(struct usbnet *un) 456 1.1 rin { 457 1.1 rin uint32_t pwrctrl; 458 1.1 rin 459 1.1 rin /* Disable ALDPS. */ 460 1.15 mrg ure_ocp_reg_write(un, URE_OCP_ALDPS_CONFIG, URE_ENPDNPS | URE_LINKENA | 461 1.1 rin URE_DIS_SDSAVE); 462 1.15 mrg usbd_delay_ms(un->un_udev, 20); 463 1.1 rin 464 1.20 mrg if (un->un_flags & URE_FLAG_VER_4C00) { 465 1.15 mrg ure_write_2(un, URE_PLA_LED_FEATURE, URE_MCU_TYPE_PLA, 466 1.15 mrg ure_read_2(un, URE_PLA_LED_FEATURE, URE_MCU_TYPE_PLA) & 467 1.1 rin ~URE_LED_MODE_MASK); 468 1.1 rin } 469 1.1 rin 470 1.15 mrg ure_write_2(un, URE_USB_UPS_CTRL, URE_MCU_TYPE_USB, 471 1.15 mrg ure_read_2(un, URE_USB_UPS_CTRL, URE_MCU_TYPE_USB) & 472 1.1 rin ~URE_POWER_CUT); 473 1.15 mrg ure_write_2(un, URE_USB_PM_CTRL_STATUS, URE_MCU_TYPE_USB, 474 1.15 mrg ure_read_2(un, URE_USB_PM_CTRL_STATUS, URE_MCU_TYPE_USB) & 475 1.1 rin ~URE_RESUME_INDICATE); 476 1.1 rin 477 1.15 mrg ure_write_2(un, URE_PLA_PHY_PWR, URE_MCU_TYPE_PLA, 478 1.15 mrg ure_read_2(un, URE_PLA_PHY_PWR, URE_MCU_TYPE_PLA) | 479 1.1 rin URE_TX_10M_IDLE_EN | URE_PFM_PWM_SWITCH); 480 1.15 mrg pwrctrl = ure_read_4(un, URE_PLA_MAC_PWR_CTRL, URE_MCU_TYPE_PLA); 481 1.1 rin pwrctrl &= ~URE_MCU_CLK_RATIO_MASK; 482 1.1 rin pwrctrl |= URE_MCU_CLK_RATIO | URE_D3_CLK_GATED_EN; 483 1.15 mrg ure_write_4(un, URE_PLA_MAC_PWR_CTRL, URE_MCU_TYPE_PLA, pwrctrl); 484 1.15 mrg ure_write_2(un, URE_PLA_GPHY_INTR_IMR, URE_MCU_TYPE_PLA, 485 1.1 rin URE_GPHY_STS_MSK | URE_SPEED_DOWN_MSK | URE_SPDWN_RXDV_MSK | 486 1.1 rin URE_SPDWN_LINKCHG_MSK); 487 1.1 rin 488 1.1 rin /* Enable Rx aggregation. */ 489 1.15 mrg ure_write_2(un, URE_USB_USB_CTRL, URE_MCU_TYPE_USB, 490 1.15 mrg ure_read_2(un, URE_USB_USB_CTRL, URE_MCU_TYPE_USB) & 491 1.1 rin ~URE_RX_AGG_DISABLE); 492 1.1 rin 493 1.1 rin /* Disable ALDPS. */ 494 1.15 mrg ure_ocp_reg_write(un, URE_OCP_ALDPS_CONFIG, URE_ENPDNPS | URE_LINKENA | 495 1.1 rin URE_DIS_SDSAVE); 496 1.15 mrg usbd_delay_ms(un->un_udev, 20); 497 1.1 rin 498 1.20 mrg ure_init_fifo(un); 499 1.1 rin 500 1.15 mrg ure_write_1(un, URE_USB_TX_AGG, URE_MCU_TYPE_USB, 501 1.1 rin URE_TX_AGG_MAX_THRESHOLD); 502 1.15 mrg ure_write_4(un, URE_USB_RX_BUF_TH, URE_MCU_TYPE_USB, URE_RX_THR_HIGH); 503 1.15 mrg ure_write_4(un, URE_USB_TX_DMA, URE_MCU_TYPE_USB, 504 1.1 rin URE_TEST_MODE_DISABLE | URE_TX_SIZE_ADJUST1); 505 1.1 rin } 506 1.1 rin 507 1.1 rin static void 508 1.20 mrg ure_rtl8153_init(struct usbnet *un) 509 1.1 rin { 510 1.1 rin uint16_t val; 511 1.1 rin uint8_t u1u2[8]; 512 1.1 rin int i; 513 1.1 rin 514 1.1 rin /* Disable ALDPS. */ 515 1.15 mrg ure_ocp_reg_write(un, URE_OCP_POWER_CFG, 516 1.15 mrg ure_ocp_reg_read(un, URE_OCP_POWER_CFG) & ~URE_EN_ALDPS); 517 1.15 mrg usbd_delay_ms(un->un_udev, 20); 518 1.1 rin 519 1.1 rin memset(u1u2, 0x00, sizeof(u1u2)); 520 1.15 mrg ure_write_mem(un, URE_USB_TOLERANCE, 521 1.1 rin URE_MCU_TYPE_USB | URE_BYTE_EN_SIX_BYTES, u1u2, sizeof(u1u2)); 522 1.1 rin 523 1.6 msaitoh for (i = 0; i < URE_TIMEOUT; i++) { 524 1.42 riastrad if (usbnet_isdying(un)) 525 1.42 riastrad return; 526 1.15 mrg if (ure_read_2(un, URE_PLA_BOOT_CTRL, URE_MCU_TYPE_PLA) & 527 1.1 rin URE_AUTOLOAD_DONE) 528 1.1 rin break; 529 1.15 mrg usbd_delay_ms(un->un_udev, 10); 530 1.1 rin } 531 1.1 rin if (i == URE_TIMEOUT) 532 1.15 mrg URE_PRINTF(un, "timeout waiting for chip autoload\n"); 533 1.1 rin 534 1.1 rin for (i = 0; i < URE_TIMEOUT; i++) { 535 1.42 riastrad if (usbnet_isdying(un)) 536 1.42 riastrad return; 537 1.15 mrg val = ure_ocp_reg_read(un, URE_OCP_PHY_STATUS) & 538 1.1 rin URE_PHY_STAT_MASK; 539 1.1 rin if (val == URE_PHY_STAT_LAN_ON || val == URE_PHY_STAT_PWRDN) 540 1.1 rin break; 541 1.15 mrg usbd_delay_ms(un->un_udev, 10); 542 1.1 rin } 543 1.1 rin if (i == URE_TIMEOUT) 544 1.15 mrg URE_PRINTF(un, "timeout waiting for phy to stabilize\n"); 545 1.5 msaitoh 546 1.15 mrg ure_write_2(un, URE_USB_U2P3_CTRL, URE_MCU_TYPE_USB, 547 1.15 mrg ure_read_2(un, URE_USB_U2P3_CTRL, URE_MCU_TYPE_USB) & 548 1.1 rin ~URE_U2P3_ENABLE); 549 1.1 rin 550 1.20 mrg if (un->un_flags & URE_FLAG_VER_5C10) { 551 1.15 mrg val = ure_read_2(un, URE_USB_SSPHYLINK2, URE_MCU_TYPE_USB); 552 1.1 rin val &= ~URE_PWD_DN_SCALE_MASK; 553 1.1 rin val |= URE_PWD_DN_SCALE(96); 554 1.15 mrg ure_write_2(un, URE_USB_SSPHYLINK2, URE_MCU_TYPE_USB, val); 555 1.1 rin 556 1.15 mrg ure_write_1(un, URE_USB_USB2PHY, URE_MCU_TYPE_USB, 557 1.15 mrg ure_read_1(un, URE_USB_USB2PHY, URE_MCU_TYPE_USB) | 558 1.1 rin URE_USB2PHY_L1 | URE_USB2PHY_SUSPEND); 559 1.20 mrg } else if (un->un_flags & URE_FLAG_VER_5C20) { 560 1.15 mrg ure_write_1(un, URE_PLA_DMY_REG0, URE_MCU_TYPE_PLA, 561 1.15 mrg ure_read_1(un, URE_PLA_DMY_REG0, URE_MCU_TYPE_PLA) & 562 1.1 rin ~URE_ECM_ALDPS); 563 1.1 rin } 564 1.20 mrg if (un->un_flags & (URE_FLAG_VER_5C20 | URE_FLAG_VER_5C30)) { 565 1.15 mrg val = ure_read_1(un, URE_USB_CSR_DUMMY1, URE_MCU_TYPE_USB); 566 1.15 mrg if (ure_read_2(un, URE_USB_BURST_SIZE, URE_MCU_TYPE_USB) == 567 1.1 rin 0) 568 1.1 rin val &= ~URE_DYNAMIC_BURST; 569 1.1 rin else 570 1.1 rin val |= URE_DYNAMIC_BURST; 571 1.15 mrg ure_write_1(un, URE_USB_CSR_DUMMY1, URE_MCU_TYPE_USB, val); 572 1.1 rin } 573 1.1 rin 574 1.15 mrg ure_write_1(un, URE_USB_CSR_DUMMY2, URE_MCU_TYPE_USB, 575 1.15 mrg ure_read_1(un, URE_USB_CSR_DUMMY2, URE_MCU_TYPE_USB) | 576 1.1 rin URE_EP4_FULL_FC); 577 1.5 msaitoh 578 1.15 mrg ure_write_2(un, URE_USB_WDT11_CTRL, URE_MCU_TYPE_USB, 579 1.15 mrg ure_read_2(un, URE_USB_WDT11_CTRL, URE_MCU_TYPE_USB) & 580 1.1 rin ~URE_TIMER11_EN); 581 1.1 rin 582 1.15 mrg ure_write_2(un, URE_PLA_LED_FEATURE, URE_MCU_TYPE_PLA, 583 1.15 mrg ure_read_2(un, URE_PLA_LED_FEATURE, URE_MCU_TYPE_PLA) & 584 1.1 rin ~URE_LED_MODE_MASK); 585 1.5 msaitoh 586 1.20 mrg if ((un->un_flags & URE_FLAG_VER_5C10) && 587 1.15 mrg un->un_udev->ud_speed != USB_SPEED_SUPER) 588 1.1 rin val = URE_LPM_TIMER_500MS; 589 1.1 rin else 590 1.1 rin val = URE_LPM_TIMER_500US; 591 1.15 mrg ure_write_1(un, URE_USB_LPM_CTRL, URE_MCU_TYPE_USB, 592 1.1 rin val | URE_FIFO_EMPTY_1FB | URE_ROK_EXIT_LPM); 593 1.1 rin 594 1.15 mrg val = ure_read_2(un, URE_USB_AFE_CTRL2, URE_MCU_TYPE_USB); 595 1.1 rin val &= ~URE_SEN_VAL_MASK; 596 1.1 rin val |= URE_SEN_VAL_NORMAL | URE_SEL_RXIDLE; 597 1.15 mrg ure_write_2(un, URE_USB_AFE_CTRL2, URE_MCU_TYPE_USB, val); 598 1.1 rin 599 1.15 mrg ure_write_2(un, URE_USB_CONNECT_TIMER, URE_MCU_TYPE_USB, 0x0001); 600 1.1 rin 601 1.15 mrg ure_write_2(un, URE_USB_POWER_CUT, URE_MCU_TYPE_USB, 602 1.15 mrg ure_read_2(un, URE_USB_POWER_CUT, URE_MCU_TYPE_USB) & 603 1.1 rin ~(URE_PWR_EN | URE_PHASE2_EN)); 604 1.15 mrg ure_write_2(un, URE_USB_MISC_0, URE_MCU_TYPE_USB, 605 1.15 mrg ure_read_2(un, URE_USB_MISC_0, URE_MCU_TYPE_USB) & 606 1.1 rin ~URE_PCUT_STATUS); 607 1.1 rin 608 1.1 rin memset(u1u2, 0xff, sizeof(u1u2)); 609 1.15 mrg ure_write_mem(un, URE_USB_TOLERANCE, 610 1.1 rin URE_MCU_TYPE_USB | URE_BYTE_EN_SIX_BYTES, u1u2, sizeof(u1u2)); 611 1.1 rin 612 1.15 mrg ure_write_2(un, URE_PLA_MAC_PWR_CTRL, URE_MCU_TYPE_PLA, 613 1.1 rin URE_ALDPS_SPDWN_RATIO); 614 1.15 mrg ure_write_2(un, URE_PLA_MAC_PWR_CTRL2, URE_MCU_TYPE_PLA, 615 1.1 rin URE_EEE_SPDWN_RATIO); 616 1.15 mrg ure_write_2(un, URE_PLA_MAC_PWR_CTRL3, URE_MCU_TYPE_PLA, 617 1.1 rin URE_PKT_AVAIL_SPDWN_EN | URE_SUSPEND_SPDWN_EN | 618 1.1 rin URE_U1U2_SPDWN_EN | URE_L1_SPDWN_EN); 619 1.15 mrg ure_write_2(un, URE_PLA_MAC_PWR_CTRL4, URE_MCU_TYPE_PLA, 620 1.1 rin URE_PWRSAVE_SPDWN_EN | URE_RXDV_SPDWN_EN | URE_TX10MIDLE_EN | 621 1.1 rin URE_TP100_SPDWN_EN | URE_TP500_SPDWN_EN | URE_TP1000_SPDWN_EN | 622 1.1 rin URE_EEE_SPDWN_EN); 623 1.1 rin 624 1.15 mrg val = ure_read_2(un, URE_USB_U2P3_CTRL, URE_MCU_TYPE_USB); 625 1.20 mrg if (!(un->un_flags & (URE_FLAG_VER_5C00 | URE_FLAG_VER_5C10))) 626 1.1 rin val |= URE_U2P3_ENABLE; 627 1.1 rin else 628 1.1 rin val &= ~URE_U2P3_ENABLE; 629 1.15 mrg ure_write_2(un, URE_USB_U2P3_CTRL, URE_MCU_TYPE_USB, val); 630 1.1 rin 631 1.1 rin memset(u1u2, 0x00, sizeof(u1u2)); 632 1.15 mrg ure_write_mem(un, URE_USB_TOLERANCE, 633 1.1 rin URE_MCU_TYPE_USB | URE_BYTE_EN_SIX_BYTES, u1u2, sizeof(u1u2)); 634 1.1 rin 635 1.1 rin /* Disable ALDPS. */ 636 1.15 mrg ure_ocp_reg_write(un, URE_OCP_POWER_CFG, 637 1.15 mrg ure_ocp_reg_read(un, URE_OCP_POWER_CFG) & ~URE_EN_ALDPS); 638 1.15 mrg usbd_delay_ms(un->un_udev, 20); 639 1.1 rin 640 1.20 mrg ure_init_fifo(un); 641 1.1 rin 642 1.1 rin /* Enable Rx aggregation. */ 643 1.15 mrg ure_write_2(un, URE_USB_USB_CTRL, URE_MCU_TYPE_USB, 644 1.15 mrg ure_read_2(un, URE_USB_USB_CTRL, URE_MCU_TYPE_USB) & 645 1.1 rin ~URE_RX_AGG_DISABLE); 646 1.1 rin 647 1.15 mrg val = ure_read_2(un, URE_USB_U2P3_CTRL, URE_MCU_TYPE_USB); 648 1.20 mrg if (!(un->un_flags & (URE_FLAG_VER_5C00 | URE_FLAG_VER_5C10))) 649 1.1 rin val |= URE_U2P3_ENABLE; 650 1.1 rin else 651 1.1 rin val &= ~URE_U2P3_ENABLE; 652 1.15 mrg ure_write_2(un, URE_USB_U2P3_CTRL, URE_MCU_TYPE_USB, val); 653 1.1 rin 654 1.1 rin memset(u1u2, 0xff, sizeof(u1u2)); 655 1.15 mrg ure_write_mem(un, URE_USB_TOLERANCE, 656 1.1 rin URE_MCU_TYPE_USB | URE_BYTE_EN_SIX_BYTES, u1u2, sizeof(u1u2)); 657 1.1 rin } 658 1.1 rin 659 1.1 rin static void 660 1.20 mrg ure_disable_teredo(struct usbnet *un) 661 1.1 rin { 662 1.15 mrg ure_write_4(un, URE_PLA_TEREDO_CFG, URE_MCU_TYPE_PLA, 663 1.15 mrg ure_read_4(un, URE_PLA_TEREDO_CFG, URE_MCU_TYPE_PLA) & 664 1.1 rin ~(URE_TEREDO_SEL | URE_TEREDO_RS_EVENT_MASK | URE_OOB_TEREDO_EN)); 665 1.15 mrg ure_write_2(un, URE_PLA_WDT6_CTRL, URE_MCU_TYPE_PLA, 666 1.1 rin URE_WDT6_SET_MODE); 667 1.15 mrg ure_write_2(un, URE_PLA_REALWOW_TIMER, URE_MCU_TYPE_PLA, 0); 668 1.15 mrg ure_write_4(un, URE_PLA_TEREDO_TIMER, URE_MCU_TYPE_PLA, 0); 669 1.1 rin } 670 1.1 rin 671 1.1 rin static void 672 1.20 mrg ure_init_fifo(struct usbnet *un) 673 1.1 rin { 674 1.40 nisimura uint32_t rxmode, rx_fifo1, rx_fifo2; 675 1.1 rin int i; 676 1.1 rin 677 1.15 mrg ure_write_2(un, URE_PLA_MISC_1, URE_MCU_TYPE_PLA, 678 1.15 mrg ure_read_2(un, URE_PLA_MISC_1, URE_MCU_TYPE_PLA) | 679 1.1 rin URE_RXDY_GATED_EN); 680 1.1 rin 681 1.20 mrg ure_disable_teredo(un); 682 1.1 rin 683 1.40 nisimura rxmode = ure_read_4(un, URE_PLA_RCR, URE_MCU_TYPE_PLA); 684 1.40 nisimura rxmode &= ~URE_RCR_ACPT_ALL; 685 1.40 nisimura rxmode |= URE_RCR_APM | URE_RCR_AB; /* accept my own DA and bcast */ 686 1.40 nisimura ure_write_4(un, URE_PLA_RCR, URE_MCU_TYPE_PLA, rxmode); 687 1.1 rin 688 1.20 mrg if (!(un->un_flags & URE_FLAG_8152)) { 689 1.20 mrg if (un->un_flags & (URE_FLAG_VER_5C00 | URE_FLAG_VER_5C10 | 690 1.20 mrg URE_FLAG_VER_5C20)) 691 1.15 mrg ure_ocp_reg_write(un, URE_OCP_ADC_CFG, 692 1.1 rin URE_CKADSEL_L | URE_ADC_EN | URE_EN_EMI_L); 693 1.20 mrg if (un->un_flags & URE_FLAG_VER_5C00) 694 1.15 mrg ure_ocp_reg_write(un, URE_OCP_EEE_CFG, 695 1.15 mrg ure_ocp_reg_read(un, URE_OCP_EEE_CFG) & 696 1.1 rin ~URE_CTAP_SHORT_EN); 697 1.15 mrg ure_ocp_reg_write(un, URE_OCP_POWER_CFG, 698 1.15 mrg ure_ocp_reg_read(un, URE_OCP_POWER_CFG) | 699 1.1 rin URE_EEE_CLKDIV_EN); 700 1.15 mrg ure_ocp_reg_write(un, URE_OCP_DOWN_SPEED, 701 1.15 mrg ure_ocp_reg_read(un, URE_OCP_DOWN_SPEED) | 702 1.1 rin URE_EN_10M_BGOFF); 703 1.15 mrg ure_ocp_reg_write(un, URE_OCP_POWER_CFG, 704 1.15 mrg ure_ocp_reg_read(un, URE_OCP_POWER_CFG) | 705 1.1 rin URE_EN_10M_PLLOFF); 706 1.15 mrg ure_ocp_reg_write(un, URE_OCP_SRAM_ADDR, URE_SRAM_IMPEDANCE); 707 1.15 mrg ure_ocp_reg_write(un, URE_OCP_SRAM_DATA, 0x0b13); 708 1.15 mrg ure_write_2(un, URE_PLA_PHY_PWR, URE_MCU_TYPE_PLA, 709 1.15 mrg ure_read_2(un, URE_PLA_PHY_PWR, URE_MCU_TYPE_PLA) | 710 1.1 rin URE_PFM_PWM_SWITCH); 711 1.1 rin 712 1.1 rin /* Enable LPF corner auto tune. */ 713 1.15 mrg ure_ocp_reg_write(un, URE_OCP_SRAM_ADDR, URE_SRAM_LPF_CFG); 714 1.15 mrg ure_ocp_reg_write(un, URE_OCP_SRAM_DATA, 0xf70f); 715 1.1 rin 716 1.1 rin /* Adjust 10M amplitude. */ 717 1.15 mrg ure_ocp_reg_write(un, URE_OCP_SRAM_ADDR, URE_SRAM_10M_AMP1); 718 1.15 mrg ure_ocp_reg_write(un, URE_OCP_SRAM_DATA, 0x00af); 719 1.15 mrg ure_ocp_reg_write(un, URE_OCP_SRAM_ADDR, URE_SRAM_10M_AMP2); 720 1.15 mrg ure_ocp_reg_write(un, URE_OCP_SRAM_DATA, 0x0208); 721 1.1 rin } 722 1.1 rin 723 1.15 mrg ure_reset(un); 724 1.1 rin 725 1.15 mrg ure_write_1(un, URE_PLA_CR, URE_MCU_TYPE_PLA, 0); 726 1.1 rin 727 1.15 mrg ure_write_1(un, URE_PLA_OOB_CTRL, URE_MCU_TYPE_PLA, 728 1.15 mrg ure_read_1(un, URE_PLA_OOB_CTRL, URE_MCU_TYPE_PLA) & 729 1.1 rin ~URE_NOW_IS_OOB); 730 1.1 rin 731 1.15 mrg ure_write_2(un, URE_PLA_SFF_STS_7, URE_MCU_TYPE_PLA, 732 1.15 mrg ure_read_2(un, URE_PLA_SFF_STS_7, URE_MCU_TYPE_PLA) & 733 1.1 rin ~URE_MCU_BORW_EN); 734 1.1 rin for (i = 0; i < URE_TIMEOUT; i++) { 735 1.42 riastrad if (usbnet_isdying(un)) 736 1.42 riastrad return; 737 1.15 mrg if (ure_read_1(un, URE_PLA_OOB_CTRL, URE_MCU_TYPE_PLA) & 738 1.1 rin URE_LINK_LIST_READY) 739 1.1 rin break; 740 1.15 mrg usbd_delay_ms(un->un_udev, 10); 741 1.1 rin } 742 1.1 rin if (i == URE_TIMEOUT) 743 1.15 mrg URE_PRINTF(un, "timeout waiting for OOB control\n"); 744 1.15 mrg ure_write_2(un, URE_PLA_SFF_STS_7, URE_MCU_TYPE_PLA, 745 1.15 mrg ure_read_2(un, URE_PLA_SFF_STS_7, URE_MCU_TYPE_PLA) | 746 1.1 rin URE_RE_INIT_LL); 747 1.1 rin for (i = 0; i < URE_TIMEOUT; i++) { 748 1.42 riastrad if (usbnet_isdying(un)) 749 1.42 riastrad return; 750 1.15 mrg if (ure_read_1(un, URE_PLA_OOB_CTRL, URE_MCU_TYPE_PLA) & 751 1.1 rin URE_LINK_LIST_READY) 752 1.1 rin break; 753 1.15 mrg usbd_delay_ms(un->un_udev, 10); 754 1.1 rin } 755 1.1 rin if (i == URE_TIMEOUT) 756 1.15 mrg URE_PRINTF(un, "timeout waiting for OOB control\n"); 757 1.1 rin 758 1.15 mrg ure_write_2(un, URE_PLA_CPCR, URE_MCU_TYPE_PLA, 759 1.15 mrg ure_read_2(un, URE_PLA_CPCR, URE_MCU_TYPE_PLA) & 760 1.1 rin ~URE_CPCR_RX_VLAN); 761 1.15 mrg ure_write_2(un, URE_PLA_TCR0, URE_MCU_TYPE_PLA, 762 1.15 mrg ure_read_2(un, URE_PLA_TCR0, URE_MCU_TYPE_PLA) | 763 1.1 rin URE_TCR0_AUTO_FIFO); 764 1.1 rin 765 1.1 rin /* Configure Rx FIFO threshold and coalescing. */ 766 1.15 mrg ure_write_4(un, URE_PLA_RXFIFO_CTRL0, URE_MCU_TYPE_PLA, 767 1.1 rin URE_RXFIFO_THR1_NORMAL); 768 1.15 mrg if (un->un_udev->ud_speed == USB_SPEED_FULL) { 769 1.1 rin rx_fifo1 = URE_RXFIFO_THR2_FULL; 770 1.1 rin rx_fifo2 = URE_RXFIFO_THR3_FULL; 771 1.1 rin } else { 772 1.1 rin rx_fifo1 = URE_RXFIFO_THR2_HIGH; 773 1.1 rin rx_fifo2 = URE_RXFIFO_THR3_HIGH; 774 1.1 rin } 775 1.15 mrg ure_write_4(un, URE_PLA_RXFIFO_CTRL1, URE_MCU_TYPE_PLA, rx_fifo1); 776 1.15 mrg ure_write_4(un, URE_PLA_RXFIFO_CTRL2, URE_MCU_TYPE_PLA, rx_fifo2); 777 1.1 rin 778 1.1 rin /* Configure Tx FIFO threshold. */ 779 1.15 mrg ure_write_4(un, URE_PLA_TXFIFO_CTRL, URE_MCU_TYPE_PLA, 780 1.1 rin URE_TXFIFO_THR_NORMAL); 781 1.1 rin } 782 1.1 rin 783 1.1 rin static int 784 1.1 rin ure_match(device_t parent, cfdata_t match, void *aux) 785 1.1 rin { 786 1.1 rin struct usb_attach_arg *uaa = aux; 787 1.1 rin 788 1.1 rin return usb_lookup(ure_devs, uaa->uaa_vendor, uaa->uaa_product) != NULL ? 789 1.1 rin UMATCH_VENDOR_PRODUCT : UMATCH_NONE; 790 1.1 rin } 791 1.1 rin 792 1.1 rin static void 793 1.1 rin ure_attach(device_t parent, device_t self, void *aux) 794 1.1 rin { 795 1.31 mrg USBNET_MII_DECL_DEFAULT(unm); 796 1.20 mrg struct usbnet * const un = device_private(self); 797 1.1 rin struct usb_attach_arg *uaa = aux; 798 1.1 rin struct usbd_device *dev = uaa->uaa_device; 799 1.1 rin usb_interface_descriptor_t *id; 800 1.1 rin usb_endpoint_descriptor_t *ed; 801 1.11 mrg int error, i; 802 1.1 rin uint16_t ver; 803 1.1 rin uint8_t eaddr[8]; /* 2byte padded */ 804 1.1 rin char *devinfop; 805 1.33 bad uint32_t maclo, machi; 806 1.1 rin 807 1.1 rin aprint_naive("\n"); 808 1.1 rin aprint_normal("\n"); 809 1.15 mrg devinfop = usbd_devinfo_alloc(dev, 0); 810 1.1 rin aprint_normal_dev(self, "%s\n", devinfop); 811 1.1 rin usbd_devinfo_free(devinfop); 812 1.1 rin 813 1.15 mrg un->un_dev = self; 814 1.15 mrg un->un_udev = dev; 815 1.20 mrg un->un_sc = un; 816 1.19 mrg un->un_ops = &ure_ops; 817 1.21 mrg un->un_rx_xfer_flags = USBD_SHORT_XFER_OK; 818 1.21 mrg un->un_tx_xfer_flags = USBD_FORCE_SHORT_XFER; 819 1.21 mrg un->un_rx_list_cnt = URE_RX_LIST_CNT; 820 1.21 mrg un->un_tx_list_cnt = URE_TX_LIST_CNT; 821 1.21 mrg un->un_rx_bufsz = URE_BUFSZ; 822 1.21 mrg un->un_tx_bufsz = URE_BUFSZ; 823 1.8 mrg 824 1.1 rin #define URE_CONFIG_NO 1 /* XXX */ 825 1.1 rin error = usbd_set_config_no(dev, URE_CONFIG_NO, 1); 826 1.1 rin if (error) { 827 1.1 rin aprint_error_dev(self, "failed to set configuration: %s\n", 828 1.1 rin usbd_errstr(error)); 829 1.1 rin return; /* XXX */ 830 1.1 rin } 831 1.1 rin 832 1.1 rin if (uaa->uaa_product == USB_PRODUCT_REALTEK_RTL8152) 833 1.20 mrg un->un_flags |= URE_FLAG_8152; 834 1.1 rin 835 1.1 rin #define URE_IFACE_IDX 0 /* XXX */ 836 1.15 mrg error = usbd_device2interface_handle(dev, URE_IFACE_IDX, &un->un_iface); 837 1.1 rin if (error) { 838 1.1 rin aprint_error_dev(self, "failed to get interface handle: %s\n", 839 1.1 rin usbd_errstr(error)); 840 1.1 rin return; /* XXX */ 841 1.1 rin } 842 1.1 rin 843 1.15 mrg id = usbd_get_interface_descriptor(un->un_iface); 844 1.1 rin for (i = 0; i < id->bNumEndpoints; i++) { 845 1.15 mrg ed = usbd_interface2endpoint_descriptor(un->un_iface, i); 846 1.1 rin if (ed == NULL) { 847 1.1 rin aprint_error_dev(self, "couldn't get ep %d\n", i); 848 1.1 rin return; /* XXX */ 849 1.1 rin } 850 1.1 rin if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN && 851 1.1 rin UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) { 852 1.15 mrg un->un_ed[USBNET_ENDPT_RX] = ed->bEndpointAddress; 853 1.1 rin } else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT && 854 1.1 rin UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) { 855 1.15 mrg un->un_ed[USBNET_ENDPT_TX] = ed->bEndpointAddress; 856 1.1 rin } 857 1.1 rin } 858 1.1 rin 859 1.15 mrg /* Set these up now for ure_ctl(). */ 860 1.56 riastrad usbnet_attach(un); 861 1.1 rin 862 1.15 mrg un->un_phyno = 0; 863 1.15 mrg 864 1.15 mrg ver = ure_read_2(un, URE_PLA_TCR1, URE_MCU_TYPE_PLA) & URE_VERSION_MASK; 865 1.1 rin switch (ver) { 866 1.1 rin case 0x4c00: 867 1.20 mrg un->un_flags |= URE_FLAG_VER_4C00; 868 1.1 rin break; 869 1.1 rin case 0x4c10: 870 1.20 mrg un->un_flags |= URE_FLAG_VER_4C10; 871 1.1 rin break; 872 1.1 rin case 0x5c00: 873 1.20 mrg un->un_flags |= URE_FLAG_VER_5C00; 874 1.1 rin break; 875 1.1 rin case 0x5c10: 876 1.20 mrg un->un_flags |= URE_FLAG_VER_5C10; 877 1.1 rin break; 878 1.1 rin case 0x5c20: 879 1.20 mrg un->un_flags |= URE_FLAG_VER_5C20; 880 1.1 rin break; 881 1.1 rin case 0x5c30: 882 1.20 mrg un->un_flags |= URE_FLAG_VER_5C30; 883 1.1 rin break; 884 1.1 rin default: 885 1.1 rin /* fake addr? or just fail? */ 886 1.1 rin break; 887 1.1 rin } 888 1.3 rin aprint_normal_dev(self, "RTL%d %sver %04x\n", 889 1.20 mrg (un->un_flags & URE_FLAG_8152) ? 8152 : 8153, 890 1.20 mrg (un->un_flags != 0) ? "" : "unknown ", 891 1.3 rin ver); 892 1.1 rin 893 1.20 mrg if (un->un_flags & URE_FLAG_8152) 894 1.20 mrg ure_rtl8152_init(un); 895 1.1 rin else 896 1.20 mrg ure_rtl8153_init(un); 897 1.1 rin 898 1.32 bad if ((un->un_flags & URE_FLAG_VER_4C00) || 899 1.32 bad (un->un_flags & URE_FLAG_VER_4C10)) 900 1.15 mrg ure_read_mem(un, URE_PLA_IDR, URE_MCU_TYPE_PLA, eaddr, 901 1.1 rin sizeof(eaddr)); 902 1.1 rin else 903 1.15 mrg ure_read_mem(un, URE_PLA_BACKUP, URE_MCU_TYPE_PLA, eaddr, 904 1.1 rin sizeof(eaddr)); 905 1.33 bad if (ETHER_IS_ZERO(eaddr)) { 906 1.33 bad maclo = 0x00f2 | (cprng_strong32() & 0xffff0000); 907 1.33 bad machi = cprng_strong32() & 0xffff; 908 1.33 bad eaddr[0] = maclo & 0xff; 909 1.33 bad eaddr[1] = (maclo >> 8) & 0xff; 910 1.33 bad eaddr[2] = (maclo >> 16) & 0xff; 911 1.33 bad eaddr[3] = (maclo >> 24) & 0xff; 912 1.33 bad eaddr[4] = machi & 0xff; 913 1.33 bad eaddr[5] = (machi >> 8) & 0xff; 914 1.33 bad } 915 1.39 skrll memcpy(un->un_eaddr, eaddr, sizeof(un->un_eaddr)); 916 1.1 rin 917 1.15 mrg struct ifnet *ifp = usbnet_ifp(un); 918 1.1 rin 919 1.1 rin /* 920 1.1 rin * We don't support TSOv4 and v6 for now, that are required to 921 1.1 rin * be handled in software for some cases. 922 1.1 rin */ 923 1.1 rin ifp->if_capabilities = IFCAP_CSUM_IPv4_Tx | 924 1.1 rin IFCAP_CSUM_TCPv4_Tx | IFCAP_CSUM_UDPv4_Tx; 925 1.1 rin #ifdef INET6 926 1.1 rin ifp->if_capabilities |= IFCAP_CSUM_TCPv6_Tx | IFCAP_CSUM_UDPv6_Tx; 927 1.1 rin #endif 928 1.20 mrg if (un->un_flags & ~URE_FLAG_VER_4C00) { 929 1.1 rin ifp->if_capabilities |= IFCAP_CSUM_IPv4_Rx | 930 1.1 rin IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx | 931 1.1 rin IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx; 932 1.1 rin } 933 1.15 mrg struct ethercom *ec = usbnet_ec(un); 934 1.15 mrg ec->ec_capabilities = ETHERCAP_VLAN_MTU; 935 1.1 rin #ifdef notyet 936 1.15 mrg ec->ec_capabilities |= ETHERCAP_JUMBO_MTU; 937 1.1 rin #endif 938 1.1 rin 939 1.30 mrg unm.un_mii_phyloc = un->un_phyno; 940 1.30 mrg usbnet_attach_ifp(un, IFF_SIMPLEX | IFF_BROADCAST | IFF_MULTICAST, 941 1.30 mrg 0, &unm); 942 1.1 rin } 943 1.1 rin 944 1.1 rin static void 945 1.38 thorpej ure_uno_rx_loop(struct usbnet *un, struct usbnet_chain *c, uint32_t total_len) 946 1.1 rin { 947 1.15 mrg struct ifnet *ifp = usbnet_ifp(un); 948 1.15 mrg uint8_t *buf = c->unc_buf; 949 1.15 mrg uint16_t pkt_len = 0; 950 1.15 mrg uint16_t pkt_count = 0; 951 1.1 rin struct ure_rxpkt rxhdr; 952 1.5 msaitoh 953 1.1 rin do { 954 1.1 rin if (total_len < sizeof(rxhdr)) { 955 1.1 rin DPRINTF(("too few bytes left for a packet header\n")); 956 1.35 thorpej if_statinc(ifp, if_ierrors); 957 1.15 mrg return; 958 1.1 rin } 959 1.1 rin 960 1.15 mrg buf += roundup(pkt_len, 8); 961 1.1 rin 962 1.1 rin memcpy(&rxhdr, buf, sizeof(rxhdr)); 963 1.1 rin total_len -= sizeof(rxhdr); 964 1.1 rin 965 1.15 mrg pkt_len = le32toh(rxhdr.ure_pktlen) & URE_RXPKT_LEN_MASK; 966 1.15 mrg DPRINTFN(4, ("next packet is %d bytes\n", pkt_len)); 967 1.15 mrg if (pkt_len > total_len) { 968 1.1 rin DPRINTF(("not enough bytes left for next packet\n")); 969 1.35 thorpej if_statinc(ifp, if_ierrors); 970 1.15 mrg return; 971 1.1 rin } 972 1.1 rin 973 1.15 mrg total_len -= roundup(pkt_len, 8); 974 1.1 rin buf += sizeof(rxhdr); 975 1.1 rin 976 1.15 mrg usbnet_enqueue(un, buf, pkt_len - ETHER_CRC_LEN, 977 1.17 mrg ure_rxcsum(ifp, &rxhdr), 0, 0); 978 1.11 mrg 979 1.15 mrg pkt_count++; 980 1.11 mrg 981 1.1 rin } while (total_len > 0); 982 1.1 rin 983 1.15 mrg if (pkt_count) 984 1.19 mrg rnd_add_uint32(usbnet_rndsrc(un), pkt_count); 985 1.1 rin } 986 1.1 rin 987 1.1 rin static int 988 1.1 rin ure_rxcsum(struct ifnet *ifp, struct ure_rxpkt *rp) 989 1.1 rin { 990 1.1 rin int enabled = ifp->if_csum_flags_rx, flags = 0; 991 1.1 rin uint32_t csum, misc; 992 1.1 rin 993 1.1 rin if (enabled == 0) 994 1.1 rin return 0; 995 1.1 rin 996 1.1 rin csum = le32toh(rp->ure_csum); 997 1.1 rin misc = le32toh(rp->ure_misc); 998 1.1 rin 999 1.1 rin if (csum & URE_RXPKT_IPV4_CS) { 1000 1.1 rin flags |= M_CSUM_IPv4; 1001 1.1 rin if (csum & URE_RXPKT_TCP_CS) 1002 1.1 rin flags |= M_CSUM_TCPv4; 1003 1.1 rin if (csum & URE_RXPKT_UDP_CS) 1004 1.1 rin flags |= M_CSUM_UDPv4; 1005 1.6 msaitoh } else if (csum & URE_RXPKT_IPV6_CS) { 1006 1.1 rin flags = 0; 1007 1.1 rin if (csum & URE_RXPKT_TCP_CS) 1008 1.1 rin flags |= M_CSUM_TCPv6; 1009 1.1 rin if (csum & URE_RXPKT_UDP_CS) 1010 1.1 rin flags |= M_CSUM_UDPv6; 1011 1.6 msaitoh } 1012 1.1 rin 1013 1.1 rin flags &= enabled; 1014 1.1 rin if (__predict_false((flags & M_CSUM_IPv4) && 1015 1.1 rin (misc & URE_RXPKT_IP_F))) 1016 1.1 rin flags |= M_CSUM_IPv4_BAD; 1017 1.1 rin if (__predict_false( 1018 1.1 rin ((flags & (M_CSUM_TCPv4 | M_CSUM_TCPv6)) && (misc & URE_RXPKT_TCP_F)) 1019 1.1 rin || ((flags & (M_CSUM_UDPv4 | M_CSUM_UDPv6)) && (misc & URE_RXPKT_UDP_F)) 1020 1.1 rin )) 1021 1.1 rin flags |= M_CSUM_TCP_UDP_BAD; 1022 1.1 rin 1023 1.1 rin return flags; 1024 1.1 rin } 1025 1.1 rin 1026 1.15 mrg static unsigned 1027 1.38 thorpej ure_uno_tx_prepare(struct usbnet *un, struct mbuf *m, struct usbnet_chain *c) 1028 1.1 rin { 1029 1.1 rin struct ure_txpkt txhdr; 1030 1.1 rin uint32_t frm_len = 0; 1031 1.15 mrg uint8_t *buf = c->unc_buf; 1032 1.1 rin 1033 1.24 skrll if ((unsigned)m->m_pkthdr.len > un->un_tx_bufsz - sizeof(txhdr)) 1034 1.22 mrg return 0; 1035 1.22 mrg 1036 1.1 rin /* header */ 1037 1.1 rin txhdr.ure_pktlen = htole32(m->m_pkthdr.len | URE_TXPKT_TX_FS | 1038 1.1 rin URE_TXPKT_TX_LS); 1039 1.1 rin txhdr.ure_csum = htole32(ure_txcsum(m)); 1040 1.1 rin memcpy(buf, &txhdr, sizeof(txhdr)); 1041 1.1 rin buf += sizeof(txhdr); 1042 1.1 rin frm_len = sizeof(txhdr); 1043 1.1 rin 1044 1.1 rin /* packet */ 1045 1.1 rin m_copydata(m, 0, m->m_pkthdr.len, buf); 1046 1.1 rin frm_len += m->m_pkthdr.len; 1047 1.1 rin 1048 1.1 rin DPRINTFN(2, ("tx %d bytes\n", frm_len)); 1049 1.1 rin 1050 1.15 mrg return frm_len; 1051 1.1 rin } 1052 1.1 rin 1053 1.1 rin /* 1054 1.1 rin * We need to calculate L4 checksum in software, if the offset of 1055 1.1 rin * L4 header is larger than 0x7ff = 2047. 1056 1.1 rin */ 1057 1.1 rin static uint32_t 1058 1.1 rin ure_txcsum(struct mbuf *m) 1059 1.1 rin { 1060 1.1 rin struct ether_header *eh; 1061 1.1 rin int flags = m->m_pkthdr.csum_flags; 1062 1.1 rin uint32_t data = m->m_pkthdr.csum_data; 1063 1.1 rin uint32_t reg = 0; 1064 1.1 rin int l3off, l4off; 1065 1.1 rin uint16_t type; 1066 1.1 rin 1067 1.1 rin if (flags == 0) 1068 1.1 rin return 0; 1069 1.1 rin 1070 1.2 rin if (__predict_true(m->m_len >= (int)sizeof(*eh))) { 1071 1.1 rin eh = mtod(m, struct ether_header *); 1072 1.1 rin type = eh->ether_type; 1073 1.1 rin } else 1074 1.1 rin m_copydata(m, offsetof(struct ether_header, ether_type), 1075 1.1 rin sizeof(type), &type); 1076 1.1 rin switch (type = htons(type)) { 1077 1.1 rin case ETHERTYPE_IP: 1078 1.1 rin case ETHERTYPE_IPV6: 1079 1.1 rin l3off = ETHER_HDR_LEN; 1080 1.1 rin break; 1081 1.1 rin case ETHERTYPE_VLAN: 1082 1.1 rin l3off = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN; 1083 1.1 rin break; 1084 1.1 rin default: 1085 1.1 rin return 0; 1086 1.1 rin } 1087 1.1 rin 1088 1.1 rin if (flags & (M_CSUM_TCPv4 | M_CSUM_UDPv4)) { 1089 1.1 rin l4off = l3off + M_CSUM_DATA_IPv4_IPHL(data); 1090 1.1 rin if (__predict_false(l4off > URE_L4_OFFSET_MAX)) { 1091 1.1 rin in_undefer_cksum(m, l3off, flags); 1092 1.1 rin return 0; 1093 1.1 rin } 1094 1.1 rin reg |= URE_TXPKT_IPV4_CS; 1095 1.1 rin if (flags & M_CSUM_TCPv4) 1096 1.1 rin reg |= URE_TXPKT_TCP_CS; 1097 1.1 rin else 1098 1.1 rin reg |= URE_TXPKT_UDP_CS; 1099 1.1 rin reg |= l4off << URE_L4_OFFSET_SHIFT; 1100 1.1 rin } 1101 1.1 rin #ifdef INET6 1102 1.1 rin else if (flags & (M_CSUM_TCPv6 | M_CSUM_UDPv6)) { 1103 1.1 rin l4off = l3off + M_CSUM_DATA_IPv6_IPHL(data); 1104 1.1 rin if (__predict_false(l4off > URE_L4_OFFSET_MAX)) { 1105 1.1 rin in6_undefer_cksum(m, l3off, flags); 1106 1.1 rin return 0; 1107 1.1 rin } 1108 1.1 rin reg |= URE_TXPKT_IPV6_CS; 1109 1.1 rin if (flags & M_CSUM_TCPv6) 1110 1.1 rin reg |= URE_TXPKT_TCP_CS; 1111 1.1 rin else 1112 1.1 rin reg |= URE_TXPKT_UDP_CS; 1113 1.1 rin reg |= l4off << URE_L4_OFFSET_SHIFT; 1114 1.1 rin } 1115 1.1 rin #endif 1116 1.1 rin else if (flags & M_CSUM_IPv4) 1117 1.1 rin reg |= URE_TXPKT_IPV4_CS; 1118 1.1 rin 1119 1.1 rin return reg; 1120 1.1 rin } 1121 1.20 mrg 1122 1.26 mrg #ifdef _MODULE 1123 1.26 mrg #include "ioconf.c" 1124 1.26 mrg #endif 1125 1.26 mrg 1126 1.26 mrg USBNET_MODULE(ure) 1127