jcs's openbsd hax
openbsd
at jcs 2643 lines 72 kB view raw
1/* $OpenBSD: if_ure.c,v 1.37 2025/06/04 00:06:17 jsg Exp $ */ 2/*- 3 * Copyright (c) 2015, 2016, 2019 Kevin Lo <kevlo@openbsd.org> 4 * Copyright (c) 2020 Jonathon Fletcher <jonathon.fletcher@gmail.com> 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29#include "bpfilter.h" 30#include "vlan.h" 31 32#include <sys/param.h> 33#include <sys/systm.h> 34#include <sys/sockio.h> 35#include <sys/rwlock.h> 36#include <sys/mbuf.h> 37#include <sys/device.h> 38 39#include <machine/bus.h> 40 41#include <net/if.h> 42#include <net/if_media.h> 43 44#if NBPFILTER > 0 45#include <net/bpf.h> 46#endif 47 48#include <netinet/in.h> 49#include <netinet/if_ether.h> 50 51#include <dev/mii/mii.h> 52#include <dev/mii/miivar.h> 53 54#include <dev/usb/usb.h> 55#include <dev/usb/usbdi.h> 56#include <dev/usb/usbdi_util.h> 57#include <dev/usb/usbdivar.h> 58#include <dev/usb/usbdevs.h> 59 60#include <dev/ic/rtl81x9reg.h> 61#include <dev/usb/if_urereg.h> 62 63#ifdef URE_DEBUG 64#define DPRINTF(x) do { if (uredebug) printf x; } while (0) 65#define DPRINTFN(n,x) do { if (uredebug >= (n)) printf x; } while (0) 66int uredebug = 0; 67#else 68#define DPRINTF(x) 69#define DPRINTFN(n,x) 70#endif 71 72const struct usb_devno ure_devs[] = { 73 { USB_VENDOR_ASUS, USB_PRODUCT_ASUS_RTL8156 }, 74 { USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_RTL8152B }, 75 { USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_RTL8153 }, 76 { USB_VENDOR_CISCOLINKSYS, USB_PRODUCT_CISCOLINKSYS_USB3GIGV1 }, 77 { USB_VENDOR_CLEVO, USB_PRODUCT_CLEVO_RTL8153B }, 78 { USB_VENDOR_CLUB3D, USB_PRODUCT_CLUB3D_RTL8153 }, 79 { USB_VENDOR_DLINK, USB_PRODUCT_DLINK_RTL8153_1 }, 80 { USB_VENDOR_DLINK, USB_PRODUCT_DLINK_RTL8153_2 }, 81 { USB_VENDOR_DYNABOOK, USB_PRODUCT_DYNABOOK_RTL8153B_1 }, 82 { USB_VENDOR_DYNABOOK, USB_PRODUCT_DYNABOOK_RTL8153B_2 }, 83 { USB_VENDOR_ELECOM, USB_PRODUCT_ELECOM_RTL8153B }, 84 { USB_VENDOR_ELECOM, USB_PRODUCT_ELECOM_RTL8156B }, 85 { USB_VENDOR_IOI, USB_PRODUCT_IOI_RTL8153 }, 86 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_DOCK_ETHERNET }, 87 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_ONELINK }, 88 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_ONELINKPLUS }, 89 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_ONELINKPRO }, 90 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_RTL8153B_1 }, 91 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_RTL8153B_2 }, 92 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_RTL8153B_3 }, 93 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_RTL8153B_4 }, 94 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_RTL8153B_5 }, 95 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_RTL8153B_6 }, 96 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_RTL8153B_7 }, 97 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_RTL8153B_8 }, 98 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_RTL8153B_9 }, 99 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_RTL8153_1 }, 100 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_RTL8153_2 }, 101 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_RTL8153_3 }, 102 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_TABLETDOCK }, 103 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_TB3DOCK }, 104 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_TB3DOCKGEN2 }, 105 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_TB3GFXDOCK }, 106 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_USBCDOCKGEN2 }, 107 { USB_VENDOR_LENOVO, USB_PRODUCT_LENOVO_WIGIGDOCK }, 108 { USB_VENDOR_LG, USB_PRODUCT_LG_RTL8153 }, 109 { USB_VENDOR_LG, USB_PRODUCT_LG_RTL8153B }, 110 { USB_VENDOR_LUXSHARE, USB_PRODUCT_LUXSHARE_RTL8153 }, 111 { USB_VENDOR_MICROSOFT, USB_PRODUCT_MICROSOFT_DOCKETH }, 112 { USB_VENDOR_MICROSOFT, USB_PRODUCT_MICROSOFT_DOCKETH2 }, 113 { USB_VENDOR_MICROSOFT, USB_PRODUCT_MICROSOFT_SURFETH }, 114 { USB_VENDOR_MICROSOFT, USB_PRODUCT_MICROSOFT_WINDEVETH }, 115 { USB_VENDOR_NVIDIA, USB_PRODUCT_NVIDIA_TEGRAETH }, 116 { USB_VENDOR_PIONEERDJ, USB_PRODUCT_PIONEERDJ_RTL8152B }, 117 { USB_VENDOR_PIONEERDJ, USB_PRODUCT_PIONEERDJ_RTL8153B }, 118 { USB_VENDOR_REALTEK, USB_PRODUCT_REALTEK_RTL8152 }, 119 { USB_VENDOR_REALTEK, USB_PRODUCT_REALTEK_RTL8152B }, 120 { USB_VENDOR_REALTEK, USB_PRODUCT_REALTEK_RTL8153 }, 121 { USB_VENDOR_REALTEK, USB_PRODUCT_REALTEK_RTL8156 }, 122 { USB_VENDOR_REALTEK, USB_PRODUCT_REALTEK_RTL8157 }, 123 { USB_VENDOR_SAMSUNG2, USB_PRODUCT_SAMSUNG2_RTL8153 }, 124 { USB_VENDOR_TOSHIBA, USB_PRODUCT_TOSHIBA_RTL8153B }, 125 { USB_VENDOR_TPLINK, USB_PRODUCT_TPLINK_EU300 }, 126 { USB_VENDOR_TPLINK, USB_PRODUCT_TPLINK_RTL8152B_1 }, 127 { USB_VENDOR_TPLINK, USB_PRODUCT_TPLINK_RTL8152B_2 }, 128 { USB_VENDOR_TRENDNET, USB_PRODUCT_TRENDNET_RTL8156 }, 129 { USB_VENDOR_TTL, USB_PRODUCT_TTL_RTL8153 }, 130 { USB_VENDOR_TWINHEAD, USB_PRODUCT_TWINHEAD_RTL8153B }, 131 { USB_VENDOR_XIAOMI, USB_PRODUCT_XIAOMI_RTL8152B }, 132}; 133 134int ure_match(struct device *, void *, void *); 135void ure_attach(struct device *, struct device *, void *); 136int ure_detach(struct device *, int); 137 138struct cfdriver ure_cd = { 139 NULL, "ure", DV_IFNET 140}; 141 142const struct cfattach ure_ca = { 143 sizeof(struct ure_softc), ure_match, ure_attach, ure_detach 144}; 145 146int ure_ctl(struct ure_softc *, uint8_t, uint16_t, uint16_t, 147 void *, int); 148int ure_read_mem(struct ure_softc *, uint16_t, uint16_t, void *, 149 int); 150int ure_write_mem(struct ure_softc *, uint16_t, uint16_t, void *, 151 int); 152uint8_t ure_read_1(struct ure_softc *, uint16_t, uint16_t); 153uint16_t ure_read_2(struct ure_softc *, uint16_t, uint16_t); 154uint32_t ure_read_4(struct ure_softc *, uint16_t, uint16_t); 155int ure_write_1(struct ure_softc *, uint16_t, uint16_t, uint32_t); 156int ure_write_2(struct ure_softc *, uint16_t, uint16_t, uint32_t); 157int ure_write_4(struct ure_softc *, uint16_t, uint16_t, uint32_t); 158uint16_t ure_ocp_reg_read(struct ure_softc *, uint16_t); 159void ure_ocp_reg_write(struct ure_softc *, uint16_t, uint16_t); 160uint16_t ure_rtl8157_ocp_reg_read(struct ure_softc *, uint16_t); 161void ure_rtl8157_ocp_reg_write(struct ure_softc *, uint16_t, 162 uint16_t); 163uint32_t ure_ocp_cmd_read(struct ure_softc *, uint16_t, int); 164void ure_ocp_cmd_write(struct ure_softc *, uint16_t, int, uint32_t); 165 166void ure_init(void *); 167void ure_stop(struct ure_softc *); 168void ure_start(struct ifnet *); 169void ure_reset(struct ure_softc *); 170void ure_watchdog(struct ifnet *); 171 172void ure_miibus_statchg(struct device *); 173int ure_miibus_readreg(struct device *, int, int); 174void ure_miibus_writereg(struct device *, int, int, int); 175void ure_lock_mii(struct ure_softc *); 176void ure_unlock_mii(struct ure_softc *); 177 178void ure_decap(struct ure_softc *, struct ure_chain *, uint32_t); 179int ure_encap_txpkt(struct ure_softc *, struct mbuf *, char *, 180 uint32_t); 181int ure_encap_xfer(struct ifnet *, struct ure_softc *, 182 struct ure_chain *); 183void ure_rxcsum(struct ure_rxpkt *, struct mbuf *); 184void ure_rxcsum_v2(struct ure_rxpkt_v2 *, struct mbuf *); 185void ure_rxeof(struct usbd_xfer *, void *, usbd_status); 186void ure_txeof(struct usbd_xfer *, void *, usbd_status); 187int ure_xfer_list_init(struct ure_softc *, struct ure_chain *, 188 uint32_t, int); 189void ure_xfer_list_free(struct ure_softc *, struct ure_chain *, int); 190 191void ure_tick_task(void *); 192void ure_tick(void *); 193 194void ure_ifmedia_init(struct ifnet *); 195int ure_ifmedia_upd(struct ifnet *); 196void ure_ifmedia_sts(struct ifnet *, struct ifmediareq *); 197void ure_add_media_types(struct ure_softc *); 198void ure_link_state(struct ure_softc *); 199int ure_get_link_status(struct ure_softc *); 200void ure_iff(struct ure_softc *); 201void ure_rxvlan(struct ure_softc *); 202int ure_ioctl(struct ifnet *, u_long, caddr_t); 203void ure_rtl8152_init(struct ure_softc *); 204int ure_rtl8153_init(struct ure_softc *); 205int ure_rtl8153b_init(struct ure_softc *); 206int ure_rtl8157_init(struct ure_softc *); 207int ure_rtl8152_nic_reset(struct ure_softc *); 208int ure_rtl8153_nic_reset(struct ure_softc *); 209uint16_t ure_rtl8153_phy_status(struct ure_softc *, int); 210int ure_wait_for_flash(struct ure_softc *); 211void ure_reset_bmu(struct ure_softc *); 212void ure_disable_teredo(struct ure_softc *); 213 214#define URE_SETBIT_1(sc, reg, index, x) \ 215 ure_write_1(sc, reg, index, ure_read_1(sc, reg, index) | (x)) 216#define URE_SETBIT_2(sc, reg, index, x) \ 217 ure_write_2(sc, reg, index, ure_read_2(sc, reg, index) | (x)) 218#define URE_SETBIT_4(sc, reg, index, x) \ 219 ure_write_4(sc, reg, index, ure_read_4(sc, reg, index) | (x)) 220 221#define URE_CLRBIT_1(sc, reg, index, x) \ 222 ure_write_1(sc, reg, index, ure_read_1(sc, reg, index) & ~(x)) 223#define URE_CLRBIT_2(sc, reg, index, x) \ 224 ure_write_2(sc, reg, index, ure_read_2(sc, reg, index) & ~(x)) 225#define URE_CLRBIT_4(sc, reg, index, x) \ 226 ure_write_4(sc, reg, index, ure_read_4(sc, reg, index) & ~(x)) 227 228#define URE_OCP_CMD_SETBIT(sc, addr, type, x) \ 229 ure_ocp_cmd_write(sc, addr, type, \ 230 ure_ocp_cmd_read(sc, addr, type) | (x)) 231 232#define URE_OCP_CMD_CLRBIT(sc, addr, type, x) \ 233 ure_ocp_cmd_write(sc, addr, type, \ 234 ure_ocp_cmd_read(sc, addr, type) & ~(x)) 235 236int 237ure_ctl(struct ure_softc *sc, uint8_t rw, uint16_t val, uint16_t index, 238 void *buf, int len) 239{ 240 usb_device_request_t req; 241 usbd_status err; 242 243 if (usbd_is_dying(sc->ure_udev)) 244 return 0; 245 246 if (rw == URE_CTL_WRITE) 247 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 248 else 249 req.bmRequestType = UT_READ_VENDOR_DEVICE; 250 req.bRequest = UR_SET_ADDRESS; 251 USETW(req.wValue, val); 252 USETW(req.wIndex, index); 253 USETW(req.wLength, len); 254 255 DPRINTFN(5, ("ure_ctl: rw %d, val 0x%04hu, index 0x%04hu, len %d\n", 256 rw, val, index, len)); 257 err = usbd_do_request(sc->ure_udev, &req, buf); 258 if (err) { 259 DPRINTF(("ure_ctl: error %d\n", err)); 260 return -1; 261 } 262 263 return 0; 264} 265 266int 267ure_read_mem(struct ure_softc *sc, uint16_t addr, uint16_t index, 268 void *buf, int len) 269{ 270 return (ure_ctl(sc, URE_CTL_READ, addr, index, buf, len)); 271} 272 273int 274ure_write_mem(struct ure_softc *sc, uint16_t addr, uint16_t index, 275 void *buf, int len) 276{ 277 return (ure_ctl(sc, URE_CTL_WRITE, addr, index, buf, len)); 278} 279 280uint8_t 281ure_read_1(struct ure_softc *sc, uint16_t reg, uint16_t index) 282{ 283 uint32_t val; 284 uint8_t temp[4]; 285 uint8_t shift; 286 287 shift = (reg & 3) << 3; 288 reg &= ~3; 289 290 ure_read_mem(sc, reg, index, &temp, 4); 291 val = UGETDW(temp); 292 val >>= shift; 293 294 return (val & 0xff); 295} 296 297uint16_t 298ure_read_2(struct ure_softc *sc, uint16_t reg, uint16_t index) 299{ 300 uint32_t val; 301 uint8_t temp[4]; 302 uint8_t shift; 303 304 shift = (reg & 2) << 3; 305 reg &= ~3; 306 307 ure_read_mem(sc, reg, index, &temp, 4); 308 val = UGETDW(temp); 309 val >>= shift; 310 311 return (val & 0xffff); 312} 313 314uint32_t 315ure_read_4(struct ure_softc *sc, uint16_t reg, uint16_t index) 316{ 317 uint8_t temp[4]; 318 319 ure_read_mem(sc, reg, index, &temp, 4); 320 return (UGETDW(temp)); 321} 322 323int 324ure_write_1(struct ure_softc *sc, uint16_t reg, uint16_t index, uint32_t val) 325{ 326 uint16_t byen; 327 uint8_t temp[4]; 328 uint8_t shift; 329 330 byen = URE_BYTE_EN_BYTE; 331 shift = reg & 3; 332 val &= 0xff; 333 334 if (reg & 3) { 335 byen <<= shift; 336 val <<= (shift << 3); 337 reg &= ~3; 338 } 339 340 USETDW(temp, val); 341 return (ure_write_mem(sc, reg, index | byen, &temp, 4)); 342} 343 344int 345ure_write_2(struct ure_softc *sc, uint16_t reg, uint16_t index, uint32_t val) 346{ 347 uint16_t byen; 348 uint8_t temp[4]; 349 uint8_t shift; 350 351 byen = URE_BYTE_EN_WORD; 352 shift = reg & 2; 353 val &= 0xffff; 354 355 if (reg & 2) { 356 byen <<= shift; 357 val <<= (shift << 3); 358 reg &= ~3; 359 } 360 361 USETDW(temp, val); 362 return (ure_write_mem(sc, reg, index | byen, &temp, 4)); 363} 364 365int 366ure_write_4(struct ure_softc *sc, uint16_t reg, uint16_t index, uint32_t val) 367{ 368 uint8_t temp[4]; 369 370 USETDW(temp, val); 371 return (ure_write_mem(sc, reg, index | URE_BYTE_EN_DWORD, &temp, 4)); 372} 373 374static inline uint16_t 375ure_phy_read(struct ure_softc *sc, uint16_t addr) 376{ 377 return sc->ure_phy_read(sc, addr); 378} 379 380static inline void 381ure_phy_write(struct ure_softc *sc, uint16_t addr, uint16_t data) 382{ 383 return sc->ure_phy_write(sc, addr, data); 384} 385 386uint16_t 387ure_ocp_reg_read(struct ure_softc *sc, uint16_t addr) 388{ 389 uint16_t reg; 390 391 ure_write_2(sc, URE_PLA_OCP_GPHY_BASE, URE_MCU_TYPE_PLA, addr & 0xf000); 392 reg = (addr & 0x0fff) | 0xb000; 393 394 return (ure_read_2(sc, reg, URE_MCU_TYPE_PLA)); 395} 396 397void 398ure_ocp_reg_write(struct ure_softc *sc, uint16_t addr, uint16_t data) 399{ 400 uint16_t reg; 401 402 ure_write_2(sc, URE_PLA_OCP_GPHY_BASE, URE_MCU_TYPE_PLA, addr & 0xf000); 403 reg = (addr & 0x0fff) | 0xb000; 404 405 ure_write_2(sc, reg, URE_MCU_TYPE_PLA, data); 406} 407 408uint16_t 409ure_rtl8157_ocp_reg_read(struct ure_softc *sc, uint16_t addr) 410{ 411 int i; 412 413 for (i = 0; i < 10; i++) { 414 if (!(ure_read_2(sc, URE_USB_TGPHY_CMD, URE_MCU_TYPE_USB) & 415 URE_TGPHY_CMD_BUSY)) 416 break; 417 usbd_delay_ms(sc->ure_udev, 1); 418 } 419 if (i == 10) { 420 printf("%s: PHY read timeout\n", sc->ure_dev.dv_xname); 421 return (0xffff); 422 } 423 424 ure_write_2(sc, URE_USB_TGPHY_ADDR, URE_MCU_TYPE_USB, addr); 425 ure_write_2(sc, URE_USB_TGPHY_CMD, URE_MCU_TYPE_USB, 426 URE_TGPHY_CMD_BUSY); 427 428 for (i = 0; i < 10; i++) { 429 if (!(ure_read_2(sc, URE_USB_TGPHY_CMD, URE_MCU_TYPE_USB) & 430 URE_TGPHY_CMD_BUSY)) 431 break; 432 usbd_delay_ms(sc->ure_udev, 1); 433 } 434 if (i == 10) { 435 printf("%s: PHY read timeout\n", sc->ure_dev.dv_xname); 436 return (0xffff); 437 } 438 439 return (ure_read_2(sc, URE_USB_TGPHY_DATA, URE_MCU_TYPE_USB)); 440} 441 442void 443ure_rtl8157_ocp_reg_write(struct ure_softc *sc, uint16_t addr, uint16_t data) 444{ 445 int i; 446 447 ure_write_2(sc, URE_USB_TGPHY_DATA, URE_MCU_TYPE_USB, data); 448 449 ure_write_2(sc, URE_USB_TGPHY_ADDR, URE_MCU_TYPE_USB, addr); 450 ure_write_2(sc, URE_USB_TGPHY_CMD, URE_MCU_TYPE_USB, 451 URE_TGPHY_CMD_BUSY | URE_TGPHY_CMD_WRITE); 452 453 for (i = 0; i < 10; i++) { 454 if (!(ure_read_2(sc, URE_USB_TGPHY_CMD, URE_MCU_TYPE_USB) & 455 URE_TGPHY_CMD_BUSY)) 456 break; 457 usbd_delay_ms(sc->ure_udev, 1); 458 } 459 if (i == 10) 460 printf("%s: PHY write timeout\n", sc->ure_dev.dv_xname); 461} 462 463uint32_t 464ure_ocp_cmd_read(struct ure_softc *sc, uint16_t addr, int type) 465{ 466 uint16_t cmd; 467 int i; 468 469 cmd = (type == URE_CMD_TYPE_BMU) ? URE_CMD_BMU : URE_CMD_IP; 470 471 for (i = 0; i < 10; i++) { 472 if (!(ure_read_2(sc, URE_USB_CMD, URE_MCU_TYPE_USB) & 473 URE_CMD_BUSY)) 474 break; 475 usbd_delay_ms(sc->ure_udev, 1); 476 } 477 if (i == 10) 478 printf("%s: timeout waiting for read command\n", 479 sc->ure_dev.dv_xname); 480 481 ure_write_2(sc, URE_USB_CMD_ADDR, URE_MCU_TYPE_USB, addr); 482 ure_write_2(sc, URE_USB_CMD, URE_MCU_TYPE_USB, cmd | URE_CMD_BUSY); 483 484 for (i = 0; i < 10; i++) { 485 if (!(ure_read_2(sc, URE_USB_CMD, URE_MCU_TYPE_USB) & 486 URE_CMD_BUSY)) 487 break; 488 usbd_delay_ms(sc->ure_udev, 1); 489 } 490 if (i == 10) 491 printf("%s: timeout waiting for read command\n", 492 sc->ure_dev.dv_xname); 493 494 return (ure_read_4(sc, URE_USB_CMD_DATA, URE_MCU_TYPE_USB)); 495} 496 497void 498ure_ocp_cmd_write(struct ure_softc *sc, uint16_t addr, int type, uint32_t data) 499{ 500 uint16_t cmd; 501 int i; 502 503 cmd = (type == URE_CMD_TYPE_BMU) ? URE_CMD_BMU : URE_CMD_IP; 504 505 for (i = 0; i < 10; i++) { 506 if (!(ure_read_2(sc, URE_USB_CMD, URE_MCU_TYPE_USB) & 507 URE_CMD_BUSY)) 508 break; 509 usbd_delay_ms(sc->ure_udev, 1); 510 } 511 if (i == 10) 512 printf("%s: timeout waiting for write command\n", 513 sc->ure_dev.dv_xname); 514 515 ure_write_4(sc, URE_USB_CMD_DATA, URE_MCU_TYPE_USB, data); 516 517 ure_write_2(sc, URE_USB_CMD_ADDR, URE_MCU_TYPE_USB, addr); 518 ure_write_2(sc, URE_USB_CMD, URE_MCU_TYPE_USB, 519 cmd | URE_CMD_BUSY | URE_CMD_WRITE); 520} 521 522int 523ure_miibus_readreg(struct device *dev, int phy, int reg) 524{ 525 struct ure_softc *sc = (void *)dev; 526 uint16_t val; 527 528 if (usbd_is_dying(sc->ure_udev)) 529 return 0; 530 531 /* Let the rgephy driver read the URE_PLA_PHYSTATUS register. */ 532 if (reg == RL_GMEDIASTAT) 533 return ure_read_1(sc, URE_PLA_PHYSTATUS, URE_MCU_TYPE_PLA); 534 535 ure_lock_mii(sc); 536 val = ure_phy_read(sc, URE_OCP_BASE_MII + reg * 2); 537 ure_unlock_mii(sc); 538 539 return val; /* letoh16? */ 540} 541 542void 543ure_miibus_writereg(struct device *dev, int phy, int reg, int val) 544{ 545 struct ure_softc *sc = (void *)dev; 546 547 ure_lock_mii(sc); 548 ure_phy_write(sc, URE_OCP_BASE_MII + reg * 2, val); /* htole16? */ 549 ure_unlock_mii(sc); 550} 551 552void 553ure_miibus_statchg(struct device *dev) 554{ 555 struct ure_softc *sc = (void *)dev; 556 struct mii_data *mii = &sc->ure_mii; 557 struct ifnet *ifp = &sc->ure_ac.ac_if; 558 559 if ((ifp->if_flags & IFF_RUNNING) == 0) 560 return; 561 562 sc->ure_flags &= ~URE_FLAG_LINK; 563 if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) == 564 (IFM_ACTIVE | IFM_AVALID)) { 565 switch (IFM_SUBTYPE(mii->mii_media_active)) { 566 case IFM_10_T: 567 case IFM_100_TX: 568 sc->ure_flags |= URE_FLAG_LINK; 569 break; 570 case IFM_1000_T: 571 if ((sc->ure_flags & URE_FLAG_8152) != 0) 572 break; 573 sc->ure_flags |= URE_FLAG_LINK; 574 break; 575 default: 576 break; 577 } 578 } 579 580 /* Lost link, do nothing. */ 581 if ((sc->ure_flags & URE_FLAG_LINK) == 0) 582 return; 583 584 /* 585 * After a link change the media settings are getting reset on the 586 * hardware, and need to be re-initialized again for communication 587 * to continue work. 588 */ 589 ure_ifmedia_init(ifp); 590} 591 592void 593ure_ifmedia_init(struct ifnet *ifp) 594{ 595 struct ure_softc *sc = ifp->if_softc; 596 uint32_t reg = 0; 597 598 /* Set MAC address. */ 599 ure_write_1(sc, URE_PLA_CRWECR, URE_MCU_TYPE_PLA, URE_CRWECR_CONFIG); 600 ure_write_mem(sc, URE_PLA_IDR, URE_MCU_TYPE_PLA | URE_BYTE_EN_SIX_BYTES, 601 sc->ure_ac.ac_enaddr, 8); 602 ure_write_1(sc, URE_PLA_CRWECR, URE_MCU_TYPE_PLA, URE_CRWECR_NORAML); 603 604 if (!(sc->ure_flags & URE_FLAG_8152)) { 605 if (sc->ure_flags & (URE_FLAG_8156B | URE_FLAG_8157)) 606 URE_CLRBIT_2(sc, URE_USB_RX_AGGR_NUM, URE_MCU_TYPE_USB, 607 URE_RX_AGGR_NUM_MASK); 608 609 reg = sc->ure_rxbufsz - URE_FRAMELEN(ifp->if_mtu); 610 if (sc->ure_flags & URE_FLAG_8157) 611 reg -= sizeof(struct ure_rxpkt_v2) + URE_8157_BUF_ALIGN; 612 else 613 reg -= sizeof(struct ure_rxpkt) + URE_RX_BUF_ALIGN; 614 615 if (sc->ure_flags & 616 (URE_FLAG_8153B | URE_FLAG_8156 | URE_FLAG_8156B | 617 URE_FLAG_8157)) { 618 ure_write_2(sc, URE_USB_RX_EARLY_SIZE, URE_MCU_TYPE_USB, 619 (sc->ure_flags & URE_FLAG_8157) ? 620 reg / URE_8157_BUF_ALIGN : reg / URE_RX_BUF_ALIGN); 621 622 ure_write_2(sc, URE_USB_RX_EARLY_AGG, URE_MCU_TYPE_USB, 623 (sc->ure_flags & URE_FLAG_8153B) ? 158 : 80); 624 ure_write_2(sc, URE_USB_PM_CTRL_STATUS, 625 URE_MCU_TYPE_USB, 1875); 626 627 if (sc->ure_udev->speed == USB_SPEED_HIGH) { 628 reg = ure_read_2(sc, URE_USB_L1_CTRL, 629 URE_MCU_TYPE_USB); 630 reg &= ~0x0f; 631 ure_write_2(sc, URE_USB_L1_CTRL, 632 URE_MCU_TYPE_USB, reg | 0x01); 633 } 634 } else { 635 ure_write_2(sc, URE_USB_RX_EARLY_SIZE, URE_MCU_TYPE_USB, 636 reg / 4); 637 switch (sc->ure_udev->speed) { 638 case USB_SPEED_SUPER: 639 reg = URE_COALESCE_SUPER / 8; 640 break; 641 case USB_SPEED_HIGH: 642 reg = URE_COALESCE_HIGH / 8; 643 break; 644 default: 645 reg = URE_COALESCE_SLOW / 8; 646 break; 647 } 648 ure_write_2(sc, URE_USB_RX_EARLY_AGG, URE_MCU_TYPE_USB, 649 reg); 650 } 651 652 if (sc->ure_chip & URE_CHIP_VER_7420) { 653 URE_SETBIT_2(sc, URE_PLA_MAC_PWR_CTRL4, 654 URE_MCU_TYPE_PLA, URE_IDLE_SPDWN_EN); 655 } 656 657 if ((sc->ure_chip & URE_CHIP_VER_6010) || 658 (sc->ure_flags & URE_FLAG_8156B)) { 659 URE_CLRBIT_2(sc, URE_USB_FW_TASK, URE_MCU_TYPE_USB, 660 URE_FC_PATCH_TASK); 661 usbd_delay_ms(sc->ure_udev, 1); 662 URE_SETBIT_2(sc, URE_USB_FW_TASK, URE_MCU_TYPE_USB, 663 URE_FC_PATCH_TASK); 664 } 665 } 666 667 /* Reset the packet filter. */ 668 URE_CLRBIT_2(sc, URE_PLA_FMC, URE_MCU_TYPE_PLA, URE_FMC_FCR_MCU_EN); 669 URE_SETBIT_2(sc, URE_PLA_FMC, URE_MCU_TYPE_PLA, URE_FMC_FCR_MCU_EN); 670 671 /* Enable transmit and receive. */ 672 URE_SETBIT_1(sc, URE_PLA_CR, URE_MCU_TYPE_PLA, URE_CR_RE | URE_CR_TE); 673 674 if (sc->ure_flags & 675 (URE_FLAG_8153B | URE_FLAG_8156 | URE_FLAG_8156B | URE_FLAG_8157)) { 676 ure_write_1(sc, URE_USB_UPT_RXDMA_OWN, URE_MCU_TYPE_USB, 677 URE_OWN_UPDATE | URE_OWN_CLEAR); 678 } 679 680 URE_CLRBIT_2(sc, URE_PLA_MISC_1, URE_MCU_TYPE_PLA, URE_RXDY_GATED_EN); 681} 682 683int 684ure_ifmedia_upd(struct ifnet *ifp) 685{ 686 struct ure_softc *sc = ifp->if_softc; 687 struct mii_data *mii = &sc->ure_mii; 688 struct ifmedia *ifm = &sc->ure_ifmedia; 689 int anar, gig, err, reg; 690 691 if (sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B | URE_FLAG_8157)) { 692 if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER) 693 return (EINVAL); 694 695 if (!(sc->ure_chip & URE_CHIP_VER_7420)) { 696 reg = ure_phy_read(sc, URE_OCP_10GBT_CTRL); 697 if (reg == 0xffff) 698 return (EINVAL); 699 reg &= ~URE_ADV_2500TFDX; 700 } 701 if (sc->ure_flags & URE_FLAG_8157) 702 reg &= ~URE_ADV_5000TFDX; 703 704 anar = ANAR_TX_FD | ANAR_TX | ANAR_10_FD | ANAR_10; 705 gig = GTCR_ADV_1000TFDX | GTCR_ADV_1000THDX; 706 707 switch (IFM_SUBTYPE(ifm->ifm_media)) { 708 case IFM_AUTO: 709 if (!(sc->ure_chip & URE_CHIP_VER_7420)) 710 reg |= URE_ADV_2500TFDX; 711 if (sc->ure_flags & URE_FLAG_8157) 712 reg |= URE_ADV_5000TFDX; 713 break; 714 case IFM_5000_T: 715 reg |= URE_ADV_2500TFDX | URE_ADV_5000TFDX; 716 ifp->if_baudrate = IF_Gbps(5); 717 break; 718 case IFM_2500_T: 719 reg |= URE_ADV_2500TFDX; 720 ifp->if_baudrate = IF_Mbps(2500); 721 break; 722 case IFM_1000_T: 723 ifp->if_baudrate = IF_Gbps(1); 724 break; 725 case IFM_100_TX: 726 anar &= ~(ANAR_10_FD | ANAR_10); 727 gig = 0; 728 ifp->if_baudrate = IF_Mbps(100); 729 break; 730 case IFM_10_T: 731 anar &= ~(ANAR_TX_FD | ANAR_TX); 732 gig = 0; 733 ifp->if_baudrate = IF_Mbps(10); 734 break; 735 default: 736 printf("%s: unsupported media type\n", 737 sc->ure_dev.dv_xname); 738 return (EINVAL); 739 } 740 741 ure_phy_write(sc, URE_OCP_BASE_MII + MII_ANAR * 2, 742 anar | ANAR_PAUSE_ASYM | ANAR_FC); 743 ure_phy_write(sc, URE_OCP_BASE_MII + MII_100T2CR * 2, gig); 744 if (!(sc->ure_chip & URE_CHIP_VER_7420)) 745 ure_phy_write(sc, URE_OCP_10GBT_CTRL, reg); 746 ure_phy_write(sc, URE_OCP_BASE_MII + MII_BMCR, 747 BMCR_AUTOEN | BMCR_STARTNEG); 748 749 return (0); 750 } 751 752 if (mii->mii_instance) { 753 struct mii_softc *miisc; 754 LIST_FOREACH(miisc, &mii->mii_phys, mii_list) 755 PHY_RESET(miisc); 756 } 757 758 err = mii_mediachg(mii); 759 if (err == ENXIO) 760 return (0); 761 else 762 return (err); 763} 764 765void 766ure_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) 767{ 768 struct ure_softc *sc = ifp->if_softc; 769 struct mii_data *mii = &sc->ure_mii; 770 uint16_t status = 0; 771 772 if (sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B | URE_FLAG_8157)) { 773 ifmr->ifm_status = IFM_AVALID; 774 if (ure_get_link_status(sc)) { 775 ifmr->ifm_status |= IFM_ACTIVE; 776 ifmr->ifm_active = IFM_ETHER; 777 status = ure_read_2(sc, URE_PLA_PHYSTATUS, 778 URE_MCU_TYPE_PLA); 779 if ((status & URE_PHYSTATUS_FDX) || 780 (status & URE_PHYSTATUS_2500MBPS) || 781 (status & URE_PHYSTATUS_5000MBPS)) 782 ifmr->ifm_active |= IFM_FDX; 783 else 784 ifmr->ifm_active |= IFM_HDX; 785 if (status & URE_PHYSTATUS_10MBPS) 786 ifmr->ifm_active |= IFM_10_T; 787 else if (status & URE_PHYSTATUS_100MBPS) 788 ifmr->ifm_active |= IFM_100_TX; 789 else if (status & URE_PHYSTATUS_1000MBPS) 790 ifmr->ifm_active |= IFM_1000_T; 791 else if (status & URE_PHYSTATUS_2500MBPS) 792 ifmr->ifm_active |= IFM_2500_T; 793 else if (status & URE_PHYSTATUS_5000MBPS) 794 ifmr->ifm_active |= IFM_5000_T; 795 } 796 return; 797 } 798 799 mii_pollstat(mii); 800 ifmr->ifm_active = mii->mii_media_active; 801 ifmr->ifm_status = mii->mii_media_status; 802} 803 804void 805ure_add_media_types(struct ure_softc *sc) 806{ 807 ifmedia_add(&sc->ure_ifmedia, IFM_ETHER | IFM_10_T, 0, NULL); 808 ifmedia_add(&sc->ure_ifmedia, IFM_ETHER | IFM_10_T | IFM_FDX, 0, NULL); 809 ifmedia_add(&sc->ure_ifmedia, IFM_ETHER | IFM_100_TX, 0, NULL); 810 ifmedia_add(&sc->ure_ifmedia, IFM_ETHER | IFM_100_TX | IFM_FDX, 0, 811 NULL); 812 ifmedia_add(&sc->ure_ifmedia, IFM_ETHER | IFM_1000_T, 0, NULL); 813 ifmedia_add(&sc->ure_ifmedia, IFM_ETHER | IFM_1000_T | IFM_FDX, 0, 814 NULL); 815 if (!(sc->ure_chip & URE_CHIP_VER_7420)) { 816 ifmedia_add(&sc->ure_ifmedia, IFM_ETHER | IFM_2500_T, 0, NULL); 817 ifmedia_add(&sc->ure_ifmedia, IFM_ETHER | IFM_2500_T | IFM_FDX, 818 0, NULL); 819 } 820 if (sc->ure_flags & URE_FLAG_8157) { 821 ifmedia_add(&sc->ure_ifmedia, IFM_ETHER | IFM_5000_T, 0, NULL); 822 ifmedia_add(&sc->ure_ifmedia, IFM_ETHER | IFM_5000_T | IFM_FDX, 823 0, NULL); 824 } 825} 826 827void 828ure_link_state(struct ure_softc *sc) 829{ 830 struct ifnet *ifp = &sc->ure_ac.ac_if; 831 int link = LINK_STATE_DOWN; 832 833 if (ure_get_link_status(sc)) { 834 link = LINK_STATE_UP; 835 /* Enable transmit and receive. */ 836 URE_SETBIT_1(sc, URE_PLA_CR, URE_MCU_TYPE_PLA, 837 URE_CR_RE | URE_CR_TE); 838 } 839 840 if (ifp->if_link_state != link) { 841 ifp->if_link_state = link; 842 if_link_state_change(ifp); 843 } 844} 845 846int 847ure_get_link_status(struct ure_softc *sc) 848{ 849 if (ure_read_2(sc, URE_PLA_PHYSTATUS, URE_MCU_TYPE_PLA) & 850 URE_PHYSTATUS_LINK) { 851 sc->ure_flags |= URE_FLAG_LINK; 852 return (1); 853 } else { 854 sc->ure_flags &= ~URE_FLAG_LINK; 855 return (0); 856 } 857} 858 859void 860ure_iff(struct ure_softc *sc) 861{ 862 struct ifnet *ifp = &sc->ure_ac.ac_if; 863 struct ether_multi *enm; 864 struct ether_multistep step; 865 uint32_t hashes[2] = { 0, 0 }; 866 uint32_t hash; 867 uint32_t rxmode; 868 869 if (usbd_is_dying(sc->ure_udev)) 870 return; 871 872 rxmode = ure_read_4(sc, URE_PLA_RCR, URE_MCU_TYPE_PLA); 873 rxmode &= ~URE_RCR_ACPT_ALL; 874 ifp->if_flags &= ~IFF_ALLMULTI; 875 876 /* 877 * Always accept frames destined to our station address. 878 * Always accept broadcast frames. 879 */ 880 rxmode |= URE_RCR_APM | URE_RCR_AB; 881 882 if (ifp->if_flags & IFF_PROMISC || sc->ure_ac.ac_multirangecnt > 0) { 883 ifp->if_flags |= IFF_ALLMULTI; 884 rxmode |= URE_RCR_AM; 885 if (ifp->if_flags & IFF_PROMISC) 886 rxmode |= URE_RCR_AAP; 887 hashes[0] = hashes[1] = 0xffffffff; 888 } else { 889 rxmode |= URE_RCR_AM; 890 891 ETHER_FIRST_MULTI(step, &sc->ure_ac, enm); 892 while (enm != NULL) { 893 hash = ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN) 894 >> 26; 895 if (hash < 32) 896 hashes[0] |= (1 << hash); 897 else 898 hashes[1] |= (1 << (hash - 32)); 899 900 ETHER_NEXT_MULTI(step, enm); 901 } 902 903 hash = swap32(hashes[0]); 904 hashes[0] = swap32(hashes[1]); 905 hashes[1] = hash; 906 } 907 908 ure_write_mem(sc, URE_PLA_MAR, URE_MCU_TYPE_PLA | URE_BYTE_EN_DWORD, 909 hashes, sizeof(hashes)); 910 ure_write_4(sc, URE_PLA_RCR, URE_MCU_TYPE_PLA, rxmode); 911} 912 913void 914ure_rxvlan(struct ure_softc *sc) 915{ 916 struct ifnet *ifp = &sc->ure_ac.ac_if; 917 uint16_t reg; 918 919 if (sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B | URE_FLAG_8157)) { 920 reg = ure_read_2(sc, URE_PLA_RCR1, URE_MCU_TYPE_PLA); 921 reg &= ~(URE_INNER_VLAN | URE_OUTER_VLAN); 922 if (ifp->if_capabilities & IFCAP_VLAN_HWTAGGING) 923 reg |= (URE_INNER_VLAN | URE_OUTER_VLAN); 924 ure_write_2(sc, URE_PLA_RCR1, URE_MCU_TYPE_PLA, reg); 925 } else { 926 reg = ure_read_2(sc, URE_PLA_CPCR, URE_MCU_TYPE_PLA); 927 reg &= ~URE_CPCR_RX_VLAN; 928 if (ifp->if_capabilities & IFCAP_VLAN_HWTAGGING) 929 reg |= URE_CPCR_RX_VLAN; 930 ure_write_2(sc, URE_PLA_CPCR, URE_MCU_TYPE_PLA, reg); 931 } 932} 933 934void 935ure_reset(struct ure_softc *sc) 936{ 937 int i; 938 939 if (sc->ure_flags & URE_FLAG_8157) 940 URE_CLRBIT_1(sc, URE_PLA_CR, URE_MCU_TYPE_PLA, 941 URE_CR_TE | URE_CR_RE); 942 else if (sc->ure_flags & URE_FLAG_8156) { 943 URE_CLRBIT_1(sc, URE_PLA_CR, URE_MCU_TYPE_PLA, URE_CR_TE); 944 URE_CLRBIT_2(sc, URE_USB_BMU_RESET, URE_MCU_TYPE_USB, 945 BMU_RESET_EP_IN); 946 URE_SETBIT_2(sc, URE_USB_USB_CTRL, URE_MCU_TYPE_USB, 947 URE_CDC_ECM_EN); 948 URE_CLRBIT_1(sc, URE_PLA_CR, URE_MCU_TYPE_PLA, URE_CR_RE); 949 URE_SETBIT_2(sc, URE_USB_BMU_RESET, URE_MCU_TYPE_USB, 950 BMU_RESET_EP_IN); 951 URE_CLRBIT_2(sc, URE_USB_USB_CTRL, URE_MCU_TYPE_USB, 952 URE_CDC_ECM_EN); 953 } else { 954 ure_write_1(sc, URE_PLA_CR, URE_MCU_TYPE_PLA, URE_CR_RST); 955 956 for (i = 0; i < URE_TIMEOUT; i++) { 957 if (!(ure_read_1(sc, URE_PLA_CR, URE_MCU_TYPE_PLA) & 958 URE_CR_RST)) 959 break; 960 DELAY(100); 961 } 962 if (i == URE_TIMEOUT) 963 printf("%s: reset never completed\n", 964 sc->ure_dev.dv_xname); 965 } 966} 967 968void 969ure_watchdog(struct ifnet *ifp) 970{ 971 struct ure_softc *sc = ifp->if_softc; 972 struct ure_chain *c; 973 usbd_status err; 974 int i, s; 975 976 ifp->if_timer = 0; 977 978 if (usbd_is_dying(sc->ure_udev)) 979 return; 980 981 if ((ifp->if_flags & (IFF_RUNNING|IFF_UP)) != (IFF_RUNNING|IFF_UP)) 982 return; 983 984 sc = ifp->if_softc; 985 s = splnet(); 986 987 ifp->if_oerrors++; 988 DPRINTF(("%s: watchdog timeout\n", sc->ure_dev.dv_xname)); 989 990 for (i = 0; i < URE_TX_LIST_CNT; i++) { 991 c = &sc->ure_cdata.ure_tx_chain[i]; 992 if (c->uc_cnt > 0) { 993 usbd_get_xfer_status(c->uc_xfer, NULL, NULL, NULL, 994 &err); 995 ure_txeof(c->uc_xfer, c, err); 996 } 997 } 998 999 if (ifq_is_oactive(&ifp->if_snd)) 1000 ifq_restart(&ifp->if_snd); 1001 splx(s); 1002} 1003 1004void 1005ure_init(void *xsc) 1006{ 1007 struct ure_softc *sc = xsc; 1008 struct ure_chain *c; 1009 struct ifnet *ifp = &sc->ure_ac.ac_if; 1010 usbd_status err; 1011 int s, i, error; 1012 1013 s = splnet(); 1014 1015 /* Cancel pending I/O. */ 1016 ure_stop(sc); 1017 1018 if (sc->ure_flags & URE_FLAG_8152) 1019 error = ure_rtl8152_nic_reset(sc); 1020 else 1021 error = ure_rtl8153_nic_reset(sc); 1022 1023 if (error != 0) { 1024 splx(s); 1025 return; 1026 } 1027 1028 if (ure_xfer_list_init(sc, sc->ure_cdata.ure_rx_chain, 1029 sc->ure_rxbufsz, URE_RX_LIST_CNT) == ENOBUFS) { 1030 printf("%s: rx list init failed\n", sc->ure_dev.dv_xname); 1031 splx(s); 1032 return; 1033 } 1034 1035 if (ure_xfer_list_init(sc, sc->ure_cdata.ure_tx_chain, 1036 sc->ure_txbufsz, URE_TX_LIST_CNT) == ENOBUFS) { 1037 printf("%s: tx list init failed\n", sc->ure_dev.dv_xname); 1038 splx(s); 1039 return; 1040 } 1041 1042 /* Initialize the SLIST we are using for the multiple tx buffers */ 1043 SLIST_INIT(&sc->ure_cdata.ure_tx_free); 1044 for (i = 0; i < URE_TX_LIST_CNT; i++) 1045 SLIST_INSERT_HEAD(&sc->ure_cdata.ure_tx_free, 1046 &sc->ure_cdata.ure_tx_chain[i], uc_list); 1047 1048 /* Setup MAC address, and enable TX/RX. */ 1049 ure_ifmedia_init(ifp); 1050 1051 /* Load the multicast filter. */ 1052 ure_iff(sc); 1053 1054 /* Open RX and TX pipes. */ 1055 err = usbd_open_pipe(sc->ure_iface, sc->ure_ed[URE_ENDPT_RX], 1056 USBD_EXCLUSIVE_USE, &sc->ure_ep[URE_ENDPT_RX]); 1057 if (err) { 1058 printf("%s: open rx pipe failed: %s\n", 1059 sc->ure_dev.dv_xname, usbd_errstr(err)); 1060 splx(s); 1061 return; 1062 } 1063 1064 err = usbd_open_pipe(sc->ure_iface, sc->ure_ed[URE_ENDPT_TX], 1065 USBD_EXCLUSIVE_USE, &sc->ure_ep[URE_ENDPT_TX]); 1066 if (err) { 1067 printf("%s: open tx pipe failed: %s\n", 1068 sc->ure_dev.dv_xname, usbd_errstr(err)); 1069 splx(s); 1070 return; 1071 } 1072 1073 /* Start up the receive pipe. */ 1074 for (i = 0; i < URE_RX_LIST_CNT; i++) { 1075 c = &sc->ure_cdata.ure_rx_chain[i]; 1076 usbd_setup_xfer(c->uc_xfer, sc->ure_ep[URE_ENDPT_RX], 1077 c, c->uc_buf, c->uc_bufmax, 1078 USBD_SHORT_XFER_OK | USBD_NO_COPY, 1079 USBD_NO_TIMEOUT, ure_rxeof); 1080 usbd_transfer(c->uc_xfer); 1081 } 1082 1083 ure_ifmedia_upd(ifp); 1084 1085 /* Indicate we are up and running. */ 1086 sc->ure_flags &= ~URE_FLAG_LINK; 1087 ifp->if_flags |= IFF_RUNNING; 1088 ifq_clr_oactive(&ifp->if_snd); 1089 1090 timeout_add_sec(&sc->ure_stat_ch, 1); 1091 1092 splx(s); 1093} 1094 1095void 1096ure_start(struct ifnet *ifp) 1097{ 1098 struct ure_softc *sc = ifp->if_softc; 1099 struct ure_cdata *cd = &sc->ure_cdata; 1100 struct ure_chain *c; 1101 struct mbuf *m = NULL; 1102 uint32_t descsize, new_buflen; 1103 int s, mlen; 1104 1105 if (!(sc->ure_flags & URE_FLAG_LINK) || 1106 (ifp->if_flags & (IFF_RUNNING|IFF_UP)) != 1107 (IFF_RUNNING|IFF_UP)) { 1108 return; 1109 } 1110 1111 s = splnet(); 1112 1113 c = SLIST_FIRST(&cd->ure_tx_free); 1114 while (c != NULL) { 1115 m = ifq_deq_begin(&ifp->if_snd); 1116 if (m == NULL) 1117 break; 1118 1119 mlen = m->m_pkthdr.len; 1120 1121 descsize = (sc->ure_flags & URE_FLAG_8157) ? 1122 sizeof(struct ure_txpkt_v2) : sizeof(struct ure_txpkt); 1123 /* Discard packet larger than buffer. */ 1124 if (mlen + descsize >= c->uc_bufmax) { 1125 ifq_deq_commit(&ifp->if_snd, m); 1126 m_freem(m); 1127 ifp->if_oerrors++; 1128 continue; 1129 } 1130 1131 /* 1132 * If packet larger than remaining space, send buffer and 1133 * continue. 1134 */ 1135 new_buflen = roundup(c->uc_buflen, 1136 (sc->ure_flags & URE_FLAG_8157) ? 1137 URE_8157_BUF_ALIGN : URE_TX_BUF_ALIGN); 1138 if (new_buflen + descsize + mlen >= c->uc_bufmax) { 1139 ifq_deq_rollback(&ifp->if_snd, m); 1140 SLIST_REMOVE_HEAD(&cd->ure_tx_free, uc_list); 1141 if (ure_encap_xfer(ifp, sc, c)) { 1142 SLIST_INSERT_HEAD(&cd->ure_tx_free, c, 1143 uc_list); 1144 break; 1145 } 1146 c = SLIST_FIRST(&cd->ure_tx_free); 1147 continue; 1148 } 1149 1150 /* Append packet to current buffer. */ 1151 mlen = ure_encap_txpkt(sc, m, c->uc_buf + new_buflen, 1152 c->uc_bufmax - new_buflen); 1153 if (mlen <= 0) { 1154 ifq_deq_rollback(&ifp->if_snd, m); 1155 break; 1156 } 1157 1158 ifq_deq_commit(&ifp->if_snd, m); 1159 c->uc_cnt += 1; 1160 c->uc_buflen = new_buflen + mlen; 1161 1162#if NBPFILTER > 0 1163 if (ifp->if_bpf) 1164 bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_OUT); 1165#endif 1166 1167 m_freem(m); 1168 } 1169 1170 if (c != NULL) { 1171 /* Send current buffer unless empty */ 1172 if (c->uc_buflen > 0 && c->uc_cnt > 0) { 1173 SLIST_REMOVE_HEAD(&cd->ure_tx_free, uc_list); 1174 if (ure_encap_xfer(ifp, sc, c)) { 1175 SLIST_INSERT_HEAD(&cd->ure_tx_free, c, 1176 uc_list); 1177 } 1178 c = SLIST_FIRST(&cd->ure_tx_free); 1179 } 1180 } 1181 1182 ifp->if_timer = 5; 1183 if (c == NULL) 1184 ifq_set_oactive(&ifp->if_snd); 1185 splx(s); 1186} 1187 1188void 1189ure_tick(void *xsc) 1190{ 1191 struct ure_softc *sc = xsc; 1192 1193 if (sc == NULL) 1194 return; 1195 1196 if (usbd_is_dying(sc->ure_udev)) 1197 return; 1198 1199 usb_add_task(sc->ure_udev, &sc->ure_tick_task); 1200} 1201 1202void 1203ure_stop(struct ure_softc *sc) 1204{ 1205 struct ure_cdata *cd; 1206 struct ifnet *ifp; 1207 usbd_status err; 1208 1209 ure_reset(sc); 1210 1211 ifp = &sc->ure_ac.ac_if; 1212 ifp->if_timer = 0; 1213 ifp->if_flags &= ~IFF_RUNNING; 1214 ifq_clr_oactive(&ifp->if_snd); 1215 1216 timeout_del(&sc->ure_stat_ch); 1217 sc->ure_flags &= ~URE_FLAG_LINK; 1218 1219 if (sc->ure_ep[URE_ENDPT_RX] != NULL) { 1220 err = usbd_close_pipe(sc->ure_ep[URE_ENDPT_RX]); 1221 if (err) { 1222 printf("%s: close rx pipe failed: %s\n", 1223 sc->ure_dev.dv_xname, usbd_errstr(err)); 1224 } 1225 sc->ure_ep[URE_ENDPT_RX] = NULL; 1226 } 1227 1228 if (sc->ure_ep[URE_ENDPT_TX] != NULL) { 1229 err = usbd_close_pipe(sc->ure_ep[URE_ENDPT_TX]); 1230 if (err) { 1231 printf("%s: close tx pipe failed: %s\n", 1232 sc->ure_dev.dv_xname, usbd_errstr(err)); 1233 } 1234 sc->ure_ep[URE_ENDPT_TX] = NULL; 1235 } 1236 1237 cd = &sc->ure_cdata; 1238 ure_xfer_list_free(sc, cd->ure_rx_chain, URE_RX_LIST_CNT); 1239 ure_xfer_list_free(sc, cd->ure_tx_chain, URE_TX_LIST_CNT); 1240} 1241 1242int 1243ure_xfer_list_init(struct ure_softc *sc, struct ure_chain *ch, 1244 uint32_t bufsize, int listlen) 1245{ 1246 struct ure_chain *c; 1247 int i; 1248 1249 for (i = 0; i < listlen; i++) { 1250 c = &ch[i]; 1251 c->uc_sc = sc; 1252 c->uc_idx = i; 1253 c->uc_buflen = 0; 1254 c->uc_bufmax = bufsize; 1255 c->uc_cnt = 0; 1256 if (c->uc_xfer == NULL) { 1257 c->uc_xfer = usbd_alloc_xfer(sc->ure_udev); 1258 if (c->uc_xfer == NULL) 1259 return (ENOBUFS); 1260 c->uc_buf = usbd_alloc_buffer(c->uc_xfer, c->uc_bufmax); 1261 if (c->uc_buf == NULL) { 1262 usbd_free_xfer(c->uc_xfer); 1263 c->uc_xfer = NULL; 1264 return (ENOBUFS); 1265 } 1266 } 1267 } 1268 1269 return (0); 1270} 1271 1272void 1273ure_xfer_list_free(struct ure_softc *sc, struct ure_chain *ch, int listlen) 1274{ 1275 int i; 1276 1277 for (i = 0; i < listlen; i++) { 1278 if (ch[i].uc_buf != NULL) { 1279 ch[i].uc_buf = NULL; 1280 } 1281 ch[i].uc_cnt = 0; 1282 if (ch[i].uc_xfer != NULL) { 1283 usbd_free_xfer(ch[i].uc_xfer); 1284 ch[i].uc_xfer = NULL; 1285 } 1286 } 1287} 1288 1289void 1290ure_rtl8152_init(struct ure_softc *sc) 1291{ 1292 uint32_t pwrctrl; 1293 1294 /* Disable ALDPS. */ 1295 ure_phy_write(sc, URE_OCP_ALDPS_CONFIG, URE_ENPDNPS | URE_LINKENA | 1296 URE_DIS_SDSAVE); 1297 usbd_delay_ms(sc->ure_udev, 20); 1298 1299 if (sc->ure_chip & URE_CHIP_VER_4C00) 1300 URE_CLRBIT_2(sc, URE_PLA_LED_FEATURE, URE_MCU_TYPE_PLA, 1301 URE_LED_MODE_MASK); 1302 1303 URE_CLRBIT_2(sc, URE_USB_UPS_CTRL, URE_MCU_TYPE_USB, URE_POWER_CUT); 1304 URE_CLRBIT_2(sc, URE_USB_PM_CTRL_STATUS, URE_MCU_TYPE_USB, 1305 URE_RESUME_INDICATE); 1306 1307 URE_SETBIT_2(sc, URE_PLA_PHY_PWR, URE_MCU_TYPE_PLA, 1308 URE_TX_10M_IDLE_EN | URE_PFM_PWM_SWITCH); 1309 pwrctrl = ure_read_4(sc, URE_PLA_MAC_PWR_CTRL, URE_MCU_TYPE_PLA); 1310 pwrctrl &= ~URE_MCU_CLK_RATIO_MASK; 1311 pwrctrl |= URE_MCU_CLK_RATIO | URE_D3_CLK_GATED_EN; 1312 ure_write_4(sc, URE_PLA_MAC_PWR_CTRL, URE_MCU_TYPE_PLA, pwrctrl); 1313 ure_write_2(sc, URE_PLA_GPHY_INTR_IMR, URE_MCU_TYPE_PLA, 1314 URE_GPHY_STS_MSK | URE_SPEED_DOWN_MSK | URE_SPDWN_RXDV_MSK | 1315 URE_SPDWN_LINKCHG_MSK); 1316 1317 URE_SETBIT_2(sc, URE_PLA_RSTTALLY, URE_MCU_TYPE_PLA, URE_TALLY_RESET); 1318 1319 /* Enable Rx aggregation. */ 1320 URE_CLRBIT_2(sc, URE_USB_USB_CTRL, URE_MCU_TYPE_USB, 1321 URE_RX_AGG_DISABLE | URE_RX_ZERO_EN); 1322} 1323 1324int 1325ure_rtl8153_init(struct ure_softc *sc) 1326{ 1327 uint16_t reg; 1328 uint8_t u1u2[8]; 1329 int i; 1330 1331 memset(u1u2, 0x00, sizeof(u1u2)); 1332 ure_write_mem(sc, URE_USB_TOLERANCE, URE_BYTE_EN_SIX_BYTES, u1u2, 1333 sizeof(u1u2)); 1334 1335 for (i = 0; i < 500; i++) { 1336 if (ure_read_2(sc, URE_PLA_BOOT_CTRL, URE_MCU_TYPE_PLA) & 1337 URE_AUTOLOAD_DONE) 1338 break; 1339 usbd_delay_ms(sc->ure_udev, 20); 1340 } 1341 if (i == 500) { 1342 printf("%s: timeout waiting for chip autoload\n", 1343 sc->ure_dev.dv_xname); 1344 return (ETIMEDOUT); 1345 } 1346 1347 ure_rtl8153_phy_status(sc, 0); 1348 1349 if (sc->ure_chip & (URE_CHIP_VER_5C00 | URE_CHIP_VER_5C10 | 1350 URE_CHIP_VER_5C20)) { 1351 ure_phy_write(sc, URE_OCP_ADC_CFG, 1352 URE_CKADSEL_L | URE_ADC_EN | URE_EN_EMI_L); 1353 } 1354 1355 ure_rtl8153_phy_status(sc, URE_PHY_STAT_LAN_ON); 1356 1357 URE_CLRBIT_2(sc, URE_USB_U2P3_CTRL, URE_MCU_TYPE_USB, URE_U2P3_ENABLE); 1358 1359 if (sc->ure_chip & URE_CHIP_VER_5C10) { 1360 reg = ure_read_2(sc, URE_USB_SSPHYLINK2, URE_MCU_TYPE_USB); 1361 reg &= ~URE_PWD_DN_SCALE_MASK; 1362 reg |= URE_PWD_DN_SCALE(96); 1363 ure_write_2(sc, URE_USB_SSPHYLINK2, URE_MCU_TYPE_USB, reg); 1364 1365 URE_SETBIT_1(sc, URE_USB_USB2PHY, URE_MCU_TYPE_USB, 1366 URE_USB2PHY_L1 | URE_USB2PHY_SUSPEND); 1367 } else if (sc->ure_chip & URE_CHIP_VER_5C20) { 1368 URE_CLRBIT_1(sc, URE_PLA_DMY_REG0, URE_MCU_TYPE_PLA, 1369 URE_ECM_ALDPS); 1370 } 1371 if (sc->ure_chip & (URE_CHIP_VER_5C20 | URE_CHIP_VER_5C30)) { 1372 if (ure_read_2(sc, URE_USB_BURST_SIZE, URE_MCU_TYPE_USB)) 1373 URE_SETBIT_1(sc, URE_USB_CSR_DUMMY1, URE_MCU_TYPE_USB, 1374 URE_DYNAMIC_BURST); 1375 else 1376 URE_CLRBIT_1(sc, URE_USB_CSR_DUMMY1, URE_MCU_TYPE_USB, 1377 URE_DYNAMIC_BURST); 1378 } 1379 1380 URE_SETBIT_1(sc, URE_USB_CSR_DUMMY2, URE_MCU_TYPE_USB, URE_EP4_FULL_FC); 1381 1382 URE_CLRBIT_2(sc, URE_USB_WDT11_CTRL, URE_MCU_TYPE_USB, URE_TIMER11_EN); 1383 1384 URE_CLRBIT_2(sc, URE_PLA_LED_FEATURE, URE_MCU_TYPE_PLA, 1385 URE_LED_MODE_MASK); 1386 1387 if ((sc->ure_chip & URE_CHIP_VER_5C10) && 1388 sc->ure_udev->speed != USB_SPEED_SUPER) 1389 reg = URE_LPM_TIMER_500MS; 1390 else 1391 reg = URE_LPM_TIMER_500US; 1392 ure_write_1(sc, URE_USB_LPM_CTRL, URE_MCU_TYPE_USB, 1393 URE_FIFO_EMPTY_1FB | URE_ROK_EXIT_LPM | reg); 1394 1395 reg = ure_read_2(sc, URE_USB_AFE_CTRL2, URE_MCU_TYPE_USB); 1396 reg &= ~URE_SEN_VAL_MASK; 1397 reg |= URE_SEN_VAL_NORMAL | URE_SEL_RXIDLE; 1398 ure_write_2(sc, URE_USB_AFE_CTRL2, URE_MCU_TYPE_USB, reg); 1399 1400 ure_write_2(sc, URE_USB_CONNECT_TIMER, URE_MCU_TYPE_USB, 0x0001); 1401 1402 URE_CLRBIT_2(sc, URE_USB_POWER_CUT, URE_MCU_TYPE_USB, 1403 URE_PWR_EN | URE_PHASE2_EN); 1404 URE_CLRBIT_2(sc, URE_USB_MISC_0, URE_MCU_TYPE_USB, URE_PCUT_STATUS); 1405 1406 memset(u1u2, 0xff, sizeof(u1u2)); 1407 ure_write_mem(sc, URE_USB_TOLERANCE, URE_BYTE_EN_SIX_BYTES, u1u2, 1408 sizeof(u1u2)); 1409 1410 ure_write_2(sc, URE_PLA_MAC_PWR_CTRL, URE_MCU_TYPE_PLA, 0); 1411 ure_write_2(sc, URE_PLA_MAC_PWR_CTRL2, URE_MCU_TYPE_PLA, 0); 1412 ure_write_2(sc, URE_PLA_MAC_PWR_CTRL3, URE_MCU_TYPE_PLA, 0); 1413 ure_write_2(sc, URE_PLA_MAC_PWR_CTRL4, URE_MCU_TYPE_PLA, 0); 1414 1415 /* Enable Rx aggregation. */ 1416 URE_CLRBIT_2(sc, URE_USB_USB_CTRL, URE_MCU_TYPE_USB, 1417 URE_RX_AGG_DISABLE | URE_RX_ZERO_EN); 1418 1419 URE_SETBIT_2(sc, URE_PLA_RSTTALLY, URE_MCU_TYPE_PLA, URE_TALLY_RESET); 1420 1421 return (0); 1422} 1423 1424int 1425ure_rtl8153b_init(struct ure_softc *sc) 1426{ 1427 uint16_t reg; 1428 int i; 1429 1430 if (sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B)) { 1431 URE_CLRBIT_1(sc, URE_USB_ECM_OP, URE_MCU_TYPE_USB, 1432 URE_EN_ALL_SPEED); 1433 ure_write_2(sc, URE_USB_SPEED_OPTION, URE_MCU_TYPE_USB, 0); 1434 URE_SETBIT_2(sc, URE_USB_ECM_OPTION, URE_MCU_TYPE_USB, 1435 URE_BYPASS_MAC_RESET); 1436 1437 if (sc->ure_flags & URE_FLAG_8156B) 1438 URE_SETBIT_2(sc, URE_USB_U2P3_CTRL, URE_MCU_TYPE_USB, 1439 URE_RX_DETECT8); 1440 } 1441 1442 URE_CLRBIT_2(sc, URE_USB_LPM_CONFIG, URE_MCU_TYPE_USB, LPM_U1U2_EN); 1443 1444 if (sc->ure_flags & URE_FLAG_8156B) { 1445 if (ure_wait_for_flash(sc) != 0) 1446 return (ETIMEDOUT); 1447 } 1448 1449 for (i = 0; i < 500; i++) { 1450 if (ure_read_2(sc, URE_PLA_BOOT_CTRL, URE_MCU_TYPE_PLA) & 1451 URE_AUTOLOAD_DONE) 1452 break; 1453 usbd_delay_ms(sc->ure_udev, 20); 1454 } 1455 if (i == 500) { 1456 printf("%s: timeout waiting for chip autoload\n", 1457 sc->ure_dev.dv_xname); 1458 return (ETIMEDOUT); 1459 } 1460 1461 ure_rtl8153_phy_status(sc, 0); 1462 ure_rtl8153_phy_status(sc, URE_PHY_STAT_LAN_ON); 1463 1464 URE_CLRBIT_2(sc, URE_USB_U2P3_CTRL, URE_MCU_TYPE_USB, URE_U2P3_ENABLE); 1465 1466 /* MSC timer, 32760 ms. */ 1467 ure_write_2(sc, URE_USB_MSC_TIMER, URE_MCU_TYPE_USB, 4095); 1468 1469 if (!(sc->ure_flags & URE_FLAG_8153B)) { 1470 /* U1/U2/L1 idle timer, 500 us. */ 1471 ure_write_2(sc, URE_USB_U1U2_TIMER, URE_MCU_TYPE_USB, 500); 1472 } 1473 1474 URE_CLRBIT_2(sc, URE_USB_POWER_CUT, URE_MCU_TYPE_USB, URE_PWR_EN); 1475 URE_CLRBIT_2(sc, URE_USB_MISC_0, URE_MCU_TYPE_USB, URE_PCUT_STATUS); 1476 1477 URE_CLRBIT_1(sc, URE_USB_POWER_CUT, URE_MCU_TYPE_USB, 1478 URE_UPS_EN | URE_USP_PREWAKE); 1479 URE_CLRBIT_1(sc, URE_USB_MISC_2, URE_MCU_TYPE_USB, 1480 URE_UPS_FORCE_PWR_DOWN | URE_UPS_NO_UPS); 1481 1482 URE_CLRBIT_1(sc, URE_PLA_INDICATE_FALG, URE_MCU_TYPE_PLA, 1483 URE_UPCOMING_RUNTIME_D3); 1484 URE_CLRBIT_1(sc, URE_PLA_SUSPEND_FLAG, URE_MCU_TYPE_PLA, 1485 URE_LINK_CHG_EVENT); 1486 URE_CLRBIT_2(sc, URE_PLA_EXTRA_STATUS, URE_MCU_TYPE_PLA, 1487 URE_LINK_CHANGE_FLAG); 1488 1489 ure_write_1(sc, URE_PLA_CRWECR, URE_MCU_TYPE_PLA, URE_CRWECR_CONFIG); 1490 URE_CLRBIT_2(sc, URE_PLA_CONFIG34, URE_MCU_TYPE_PLA, 1491 URE_LINK_OFF_WAKE_EN); 1492 ure_write_1(sc, URE_PLA_CRWECR, URE_MCU_TYPE_PLA, URE_CRWECR_NORAML); 1493 1494 if (sc->ure_flags & URE_FLAG_8153B) { 1495 reg = ure_read_2(sc, URE_PLA_EXTRA_STATUS, URE_MCU_TYPE_PLA); 1496 if (ure_read_2(sc, URE_PLA_PHYSTATUS, URE_MCU_TYPE_PLA) & 1497 URE_PHYSTATUS_LINK) 1498 reg |= URE_CUR_LINK_OK; 1499 else 1500 reg &= ~URE_CUR_LINK_OK; 1501 ure_write_2(sc, URE_PLA_EXTRA_STATUS, URE_MCU_TYPE_PLA, 1502 reg | URE_POLL_LINK_CHG); 1503 } 1504 1505 if (sc->ure_udev->speed == USB_SPEED_SUPER) { 1506 URE_SETBIT_2(sc, URE_USB_LPM_CONFIG, URE_MCU_TYPE_USB, 1507 LPM_U1U2_EN); 1508 } 1509 1510 if (sc->ure_flags & URE_FLAG_8156B) { 1511 URE_CLRBIT_2(sc, URE_PLA_RCR, URE_MCU_TYPE_PLA, URE_SLOT_EN); 1512 URE_SETBIT_2(sc, URE_PLA_CPCR, URE_MCU_TYPE_PLA, 1513 URE_FLOW_CTRL_EN); 1514 1515 /* Enable fc timer and set timer to 600 ms. */ 1516 ure_write_2(sc, URE_USB_FC_TIMER, URE_MCU_TYPE_USB, 1517 URE_CTRL_TIMER_EN | 75); 1518 1519 reg = ure_read_2(sc, URE_USB_FW_CTRL, URE_MCU_TYPE_USB); 1520 if (!(ure_read_2(sc, URE_PLA_POL_GPIO_CTRL, URE_MCU_TYPE_PLA) & 1521 URE_DACK_DET_EN)) 1522 reg |= URE_FLOW_CTRL_PATCH_2; 1523 reg &= ~URE_AUTO_SPEEDUP; 1524 ure_write_2(sc, URE_USB_FW_CTRL, URE_MCU_TYPE_USB, reg); 1525 1526 URE_SETBIT_2(sc, URE_USB_FW_TASK, URE_MCU_TYPE_USB, 1527 URE_FC_PATCH_TASK); 1528 } 1529 1530 if (sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B)) { 1531 /* MAC clock speed down. */ 1532 URE_CLRBIT_2(sc, URE_PLA_MAC_PWR_CTRL3, URE_MCU_TYPE_PLA, 1533 URE_PLA_MCU_SPDWN_EN); 1534 1535 reg = ure_read_2(sc, URE_PLA_EXTRA_STATUS, URE_MCU_TYPE_PLA); 1536 reg &= ~URE_CUR_LINK_OK; 1537 if (ure_read_2(sc, URE_PLA_PHYSTATUS, URE_MCU_TYPE_PLA) & 1538 URE_PHYSTATUS_LINK) 1539 reg |= URE_CUR_LINK_OK; 1540 ure_write_2(sc, URE_PLA_EXTRA_STATUS, URE_MCU_TYPE_PLA, 1541 reg | URE_POLL_LINK_CHG); 1542 } else 1543 URE_SETBIT_2(sc, URE_PLA_MAC_PWR_CTRL2, URE_MCU_TYPE_PLA, 1544 URE_MAC_CLK_SPDWN_EN); 1545 1546 /* Enable Rx aggregation. */ 1547 URE_CLRBIT_2(sc, URE_USB_USB_CTRL, URE_MCU_TYPE_USB, 1548 URE_RX_AGG_DISABLE | URE_RX_ZERO_EN); 1549 1550 if (sc->ure_flags & URE_FLAG_8156) 1551 URE_SETBIT_1(sc, URE_USB_BMU_CONFIG, URE_MCU_TYPE_USB, 1552 URE_ACT_ODMA); 1553 1554 if (!(sc->ure_flags & URE_FLAG_8153B)) { 1555 /* 1556 * Select force mode through 0xa5b4 bit 15 1557 * 0: MDIO force mode 1558 * 1: MMD force mode 1559 */ 1560 ure_phy_write(sc, 0xa5b4, 1561 ure_phy_read(sc, 0xa5b4) & ~0x8000); 1562 } 1563 1564 URE_SETBIT_2(sc, URE_PLA_RSTTALLY, URE_MCU_TYPE_PLA, URE_TALLY_RESET); 1565 1566 return (0); 1567} 1568 1569int 1570ure_rtl8157_init(struct ure_softc *sc) 1571{ 1572 uint16_t reg; 1573 int i; 1574 1575 URE_SETBIT_1(sc, 0xcffe, URE_MCU_TYPE_USB, 0x0008); 1576 URE_CLRBIT_1(sc, 0xd3ca, URE_MCU_TYPE_USB, 0x0001); 1577 URE_CLRBIT_1(sc, URE_USB_ECM_OP, URE_MCU_TYPE_USB, URE_EN_ALL_SPEED); 1578 URE_SETBIT_2(sc, URE_USB_ECM_OPTION, URE_MCU_TYPE_USB, 1579 URE_BYPASS_MAC_RESET); 1580 URE_SETBIT_2(sc, URE_USB_U2P3_CTRL, URE_MCU_TYPE_USB, URE_RX_DETECT8); 1581 1582 URE_CLRBIT_2(sc, URE_USB_LPM_CONFIG, URE_MCU_TYPE_USB, LPM_U1U2_EN); 1583 1584 for (i = 0; i < 500; i++) { 1585 if (ure_read_2(sc, URE_PLA_BOOT_CTRL, URE_MCU_TYPE_PLA) & 1586 URE_AUTOLOAD_DONE) 1587 break; 1588 usbd_delay_ms(sc->ure_udev, 20); 1589 } 1590 if (i == 500) { 1591 printf("%s: timeout waiting for chip autoload\n", 1592 sc->ure_dev.dv_xname); 1593 return (ETIMEDOUT); 1594 } 1595 1596 if (ure_wait_for_flash(sc) != 0) 1597 return (ETIMEDOUT); 1598 1599 ure_rtl8153_phy_status(sc, 0); 1600 ure_rtl8153_phy_status(sc, URE_PHY_STAT_LAN_ON); 1601 1602 URE_OCP_CMD_CLRBIT(sc, URE_USB_U2P3_CTRL2, URE_CMD_TYPE_IP, 1603 URE_U2P3_CTRL2_ENABLE); 1604 1605 /* Disable interrupt mitigation. */ 1606 URE_CLRBIT_1(sc, 0xcf04, URE_MCU_TYPE_USB, 0x87); 1607 1608 URE_CLRBIT_2(sc, URE_USB_SPEED_OPTION, URE_MCU_TYPE_USB, 1609 URE_RG_PWRDN_EN | URE_ALL_SPEED_OFF); 1610 1611 /* Enable auto speed up. */ 1612 URE_SETBIT_2(sc, URE_USB_FW_CTRL, URE_MCU_TYPE_USB, URE_AUTO_SPEEDUP); 1613 1614 /* MSC timer = 4095 * 8ms = 32760 ms. */ 1615 ure_write_2(sc, URE_USB_MSC_TIMER, URE_MCU_TYPE_USB, 4095); 1616 1617 /* U1/U2/L1 idle timer, 500 us. */ 1618 ure_write_2(sc, URE_USB_U1U2_TIMER, URE_MCU_TYPE_USB, 500); 1619 1620 URE_CLRBIT_2(sc, URE_USB_POWER_CUT, URE_MCU_TYPE_USB, URE_PWR_EN); 1621 URE_CLRBIT_2(sc, URE_USB_MISC_0, URE_MCU_TYPE_USB, URE_PCUT_STATUS); 1622 URE_CLRBIT_1(sc, URE_USB_MISC_2, URE_MCU_TYPE_USB, 0x02); 1623 1624 URE_CLRBIT_1(sc, URE_PLA_INDICATE_FALG, URE_MCU_TYPE_PLA, 1625 URE_UPCOMING_RUNTIME_D3); 1626 URE_CLRBIT_1(sc, URE_PLA_SUSPEND_FLAG, URE_MCU_TYPE_PLA, 1627 URE_LINK_CHG_EVENT); 1628 URE_CLRBIT_2(sc, URE_PLA_EXTRA_STATUS, URE_MCU_TYPE_PLA, 1629 URE_LINK_CHANGE_FLAG); 1630 1631 ure_write_1(sc, URE_PLA_CRWECR, URE_MCU_TYPE_PLA, URE_CRWECR_CONFIG); 1632 URE_CLRBIT_2(sc, URE_PLA_CONFIG34, URE_MCU_TYPE_PLA, 1633 URE_LINK_OFF_WAKE_EN); 1634 ure_write_1(sc, URE_PLA_CRWECR, URE_MCU_TYPE_PLA, URE_CRWECR_NORAML); 1635 1636 URE_CLRBIT_2(sc, URE_PLA_RCR, URE_MCU_TYPE_PLA, URE_SLOT_EN); 1637 URE_SETBIT_2(sc, URE_PLA_CPCR, URE_MCU_TYPE_PLA, URE_FLOW_CTRL_EN); 1638 1639 /* Enable fc timer and set timer to 600 ms. */ 1640 ure_write_2(sc, URE_USB_FC_TIMER, URE_MCU_TYPE_USB, 1641 URE_CTRL_TIMER_EN | 75); 1642 1643 reg = ure_read_2(sc, URE_USB_FW_CTRL, URE_MCU_TYPE_USB); 1644 reg &= ~URE_AUTO_SPEEDUP; 1645 if (!(ure_read_2(sc, URE_PLA_POL_GPIO_CTRL, URE_MCU_TYPE_PLA) & 1646 URE_DACK_DET_EN)) 1647 reg |= URE_FLOW_CTRL_PATCH_2; 1648 ure_write_2(sc, URE_USB_FW_CTRL, URE_MCU_TYPE_USB, reg); 1649 1650 URE_SETBIT_2(sc, URE_USB_FW_TASK, URE_MCU_TYPE_USB, URE_FC_PATCH_TASK); 1651 1652 /* Disable bypass_turn_off_clk_in_aldps. */ 1653 URE_CLRBIT_1(sc, 0xd3c8, URE_MCU_TYPE_PLA, 0x01); 1654 1655 /* MAC clock speed down. */ 1656 URE_CLRBIT_2(sc, URE_PLA_MAC_PWR_CTRL3, URE_MCU_TYPE_PLA, 1657 URE_PLA_MCU_SPDWN_EN); 1658 1659 reg = ure_read_2(sc, URE_PLA_EXTRA_STATUS, URE_MCU_TYPE_PLA); 1660 reg &= ~URE_CUR_LINK_OK; 1661 if (ure_read_2(sc, URE_PLA_PHYSTATUS, URE_MCU_TYPE_PLA) & 1662 URE_PHYSTATUS_LINK) 1663 reg |= URE_CUR_LINK_OK; 1664 ure_write_2(sc, URE_PLA_EXTRA_STATUS, URE_MCU_TYPE_PLA, 1665 reg | URE_POLL_LINK_CHG); 1666 1667 /* Enable Rx aggregation. */ 1668 URE_CLRBIT_2(sc, URE_USB_USB_CTRL, URE_MCU_TYPE_USB, 1669 URE_RX_AGG_DISABLE | 0x0400); 1670 1671 /* Disable Rx zero len. */ 1672 URE_OCP_CMD_CLRBIT(sc, 0x2300, URE_CMD_TYPE_BMU, 0x00000008); 1673 1674 URE_CLRBIT_1(sc, 0xd4ae, URE_MCU_TYPE_USB, 0x02); 1675 1676 reg = ure_phy_read(sc, 0xa5b4); 1677 if (reg == 0xffff) 1678 return (EINVAL); 1679 ure_phy_write(sc, 0xa5b4, reg & ~0x8000); 1680 1681 URE_SETBIT_2(sc, URE_PLA_RSTTALLY, URE_MCU_TYPE_PLA, URE_TALLY_RESET); 1682 1683 return (0); 1684} 1685 1686int 1687ure_rtl8152_nic_reset(struct ure_softc *sc) 1688{ 1689 uint32_t rx_fifo1, rx_fifo2; 1690 int i; 1691 1692 /* Disable ALDPS. */ 1693 ure_phy_write(sc, URE_OCP_ALDPS_CONFIG, URE_ENPDNPS | URE_LINKENA | 1694 URE_DIS_SDSAVE); 1695 usbd_delay_ms(sc->ure_udev, 20); 1696 1697 URE_CLRBIT_4(sc, URE_PLA_RCR, URE_MCU_TYPE_PLA, URE_RCR_ACPT_ALL); 1698 1699 URE_SETBIT_2(sc, URE_PLA_MISC_1, URE_MCU_TYPE_PLA, URE_RXDY_GATED_EN); 1700 ure_disable_teredo(sc); 1701 ure_write_1(sc, URE_PLA_CRWECR, URE_MCU_TYPE_PLA, URE_CRWECR_NORAML); 1702 ure_write_1(sc, URE_PLA_CR, URE_MCU_TYPE_PLA, 0); 1703 1704 URE_CLRBIT_1(sc, URE_PLA_OOB_CTRL, URE_MCU_TYPE_PLA, URE_NOW_IS_OOB); 1705 URE_CLRBIT_2(sc, URE_PLA_SFF_STS_7, URE_MCU_TYPE_PLA, URE_MCU_BORW_EN); 1706 for (i = 0; i < URE_TIMEOUT; i++) { 1707 if (ure_read_1(sc, URE_PLA_OOB_CTRL, URE_MCU_TYPE_PLA) & 1708 URE_LINK_LIST_READY) 1709 break; 1710 usbd_delay_ms(sc->ure_udev, 1); 1711 } 1712 if (i == URE_TIMEOUT) { 1713 printf("%s: timeout waiting for OOB control\n", 1714 sc->ure_dev.dv_xname); 1715 return (ETIMEDOUT); 1716 } 1717 URE_SETBIT_2(sc, URE_PLA_SFF_STS_7, URE_MCU_TYPE_PLA, URE_RE_INIT_LL); 1718 for (i = 0; i < URE_TIMEOUT; i++) { 1719 if (ure_read_1(sc, URE_PLA_OOB_CTRL, URE_MCU_TYPE_PLA) & 1720 URE_LINK_LIST_READY) 1721 break; 1722 usbd_delay_ms(sc->ure_udev, 1); 1723 } 1724 if (i == URE_TIMEOUT) { 1725 printf("%s: timeout waiting for OOB control\n", 1726 sc->ure_dev.dv_xname); 1727 return (ETIMEDOUT); 1728 } 1729 1730 ure_reset(sc); 1731 1732 /* Configure Rx FIFO threshold. */ 1733 ure_write_4(sc, URE_PLA_RXFIFO_CTRL0, URE_MCU_TYPE_PLA, 1734 URE_RXFIFO_THR1_NORMAL); 1735 if (sc->ure_udev->speed == USB_SPEED_FULL) { 1736 rx_fifo1 = URE_RXFIFO_THR2_FULL; 1737 rx_fifo2 = URE_RXFIFO_THR3_FULL; 1738 } else { 1739 rx_fifo1 = URE_RXFIFO_THR2_HIGH; 1740 rx_fifo2 = URE_RXFIFO_THR3_HIGH; 1741 } 1742 ure_write_4(sc, URE_PLA_RXFIFO_CTRL1, URE_MCU_TYPE_PLA, rx_fifo1); 1743 ure_write_4(sc, URE_PLA_RXFIFO_CTRL2, URE_MCU_TYPE_PLA, rx_fifo2); 1744 1745 /* Configure Tx FIFO threshold. */ 1746 ure_write_4(sc, URE_PLA_TXFIFO_CTRL, URE_MCU_TYPE_PLA, 1747 URE_TXFIFO_THR_NORMAL); 1748 1749 ure_write_1(sc, URE_USB_TX_AGG, URE_MCU_TYPE_USB, 1750 URE_TX_AGG_MAX_THRESHOLD); 1751 ure_write_4(sc, URE_USB_RX_BUF_TH, URE_MCU_TYPE_USB, URE_RX_THR_HIGH); 1752 ure_write_4(sc, URE_USB_TX_DMA, URE_MCU_TYPE_USB, 1753 URE_TEST_MODE_DISABLE | URE_TX_SIZE_ADJUST1); 1754 1755 ure_rxvlan(sc); 1756 ure_write_2(sc, URE_PLA_RMS, URE_MCU_TYPE_PLA, 1757 ETHER_MAX_LEN + ETHER_VLAN_ENCAP_LEN); 1758 URE_SETBIT_2(sc, URE_PLA_TCR0, URE_MCU_TYPE_PLA, URE_TCR0_AUTO_FIFO); 1759 1760 /* Enable ALDPS. */ 1761 ure_phy_write(sc, URE_OCP_ALDPS_CONFIG, 1762 URE_ENPWRSAVE | URE_ENPDNPS | URE_LINKENA | URE_DIS_SDSAVE); 1763 1764 return (0); 1765} 1766 1767int 1768ure_rtl8153_nic_reset(struct ure_softc *sc) 1769{ 1770 struct ifnet *ifp = &sc->ure_ac.ac_if; 1771 uint32_t reg = 0; 1772 uint8_t u1u2[8] = { 0 }; 1773 int i; 1774 1775 switch (sc->ure_flags & URE_FLAG_CHIP_MASK) { 1776 case URE_FLAG_8153B: 1777 case URE_FLAG_8156: 1778 case URE_FLAG_8156B: 1779 case URE_FLAG_8157: 1780 URE_CLRBIT_2(sc, URE_USB_LPM_CONFIG, URE_MCU_TYPE_USB, 1781 LPM_U1U2_EN); 1782 break; 1783 default: 1784 memset(u1u2, 0x00, sizeof(u1u2)); 1785 ure_write_mem(sc, URE_USB_TOLERANCE, URE_BYTE_EN_SIX_BYTES, 1786 u1u2, sizeof(u1u2)); 1787 break; 1788 } 1789 URE_CLRBIT_2(sc, URE_USB_U2P3_CTRL, URE_MCU_TYPE_USB, URE_U2P3_ENABLE); 1790 1791 /* Disable ALDPS. */ 1792 ure_phy_write(sc, URE_OCP_POWER_CFG, 1793 ure_phy_read(sc, URE_OCP_POWER_CFG) & ~URE_EN_ALDPS); 1794 for (i = 0; i < 20; i++) { 1795 usbd_delay_ms(sc->ure_udev, 1); 1796 if (ure_read_2(sc, 0xe000, URE_MCU_TYPE_PLA) & 0x0100) 1797 break; 1798 } 1799 1800 URE_SETBIT_2(sc, URE_PLA_MISC_1, URE_MCU_TYPE_PLA, URE_RXDY_GATED_EN); 1801 ure_disable_teredo(sc); 1802 1803 URE_CLRBIT_4(sc, URE_PLA_RCR, URE_MCU_TYPE_PLA, URE_RCR_ACPT_ALL); 1804 1805 ure_reset(sc); 1806 ure_reset_bmu(sc); 1807 1808 URE_CLRBIT_1(sc, URE_PLA_OOB_CTRL, URE_MCU_TYPE_PLA, URE_NOW_IS_OOB); 1809 URE_CLRBIT_2(sc, URE_PLA_SFF_STS_7, URE_MCU_TYPE_PLA, URE_MCU_BORW_EN); 1810 1811 if (!(sc->ure_flags & 1812 (URE_FLAG_8156 | URE_FLAG_8156B | URE_FLAG_8157))) { 1813 for (i = 0; i < URE_TIMEOUT; i++) { 1814 if (ure_read_1(sc, URE_PLA_OOB_CTRL, URE_MCU_TYPE_PLA) & 1815 URE_LINK_LIST_READY) 1816 break; 1817 usbd_delay_ms(sc->ure_udev, 1); 1818 } 1819 if (i == URE_TIMEOUT) { 1820 printf("%s: timeout waiting for OOB control\n", 1821 sc->ure_dev.dv_xname); 1822 return (ETIMEDOUT); 1823 } 1824 URE_SETBIT_2(sc, URE_PLA_SFF_STS_7, URE_MCU_TYPE_PLA, 1825 URE_RE_INIT_LL); 1826 for (i = 0; i < URE_TIMEOUT; i++) { 1827 if (ure_read_1(sc, URE_PLA_OOB_CTRL, URE_MCU_TYPE_PLA) & 1828 URE_LINK_LIST_READY) 1829 break; 1830 usbd_delay_ms(sc->ure_udev, 1); 1831 } 1832 if (i == URE_TIMEOUT) { 1833 printf("%s: timeout waiting for OOB control\n", 1834 sc->ure_dev.dv_xname); 1835 return (ETIMEDOUT); 1836 } 1837 } 1838 1839 ure_rxvlan(sc); 1840 1841 ure_write_2(sc, URE_PLA_RMS, URE_MCU_TYPE_PLA, 1842 URE_FRAMELEN(ifp->if_mtu)); 1843 ure_write_1(sc, URE_PLA_MTPS, URE_MCU_TYPE_PLA, 1844 (sc->ure_flags & URE_FLAG_8157) ? MTPS_MAX : MTPS_JUMBO); 1845 1846 if (sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B | URE_FLAG_8157)) { 1847 ure_write_2(sc, URE_PLA_RX_FIFO_FULL, URE_MCU_TYPE_PLA, 1848 (sc->ure_flags & URE_FLAG_8156) ? 1024 : 512); 1849 ure_write_2(sc, URE_PLA_RX_FIFO_EMPTY, URE_MCU_TYPE_PLA, 1850 (sc->ure_flags & URE_FLAG_8156) ? 2048 : 1024); 1851 1852 /* Tx share fifo free credit full threshold. */ 1853 ure_write_2(sc, URE_PLA_TXFIFO_CTRL, URE_MCU_TYPE_PLA, 8); 1854 ure_write_2(sc, URE_PLA_TXFIFO_FULL, URE_MCU_TYPE_PLA, 128); 1855 1856 if (sc->ure_flags & URE_FLAG_8156) 1857 URE_SETBIT_2(sc, URE_USB_BMU_CONFIG, URE_MCU_TYPE_USB, 1858 URE_ACT_ODMA); 1859 1860 /* FIFO settings */ 1861 reg = ure_read_2(sc, URE_PLA_RXFIFO_FULL, URE_MCU_TYPE_PLA); 1862 reg &= ~URE_RXFIFO_FULL_MASK; 1863 ure_write_2(sc, URE_PLA_RXFIFO_FULL, URE_MCU_TYPE_PLA, 1864 reg | 0x0008); 1865 1866 URE_CLRBIT_2(sc, URE_PLA_MAC_PWR_CTRL3, URE_MCU_TYPE_PLA, 1867 URE_PLA_MCU_SPDWN_EN); 1868 1869 if (!(sc->ure_flags & URE_FLAG_8157)) 1870 URE_CLRBIT_2(sc, URE_USB_SPEED_OPTION, URE_MCU_TYPE_USB, 1871 URE_RG_PWRDN_EN | URE_ALL_SPEED_OFF); 1872 1873 ure_write_4(sc, URE_USB_RX_BUF_TH, URE_MCU_TYPE_USB, 1874 0x00600400); 1875 } else { 1876 URE_SETBIT_2(sc, URE_PLA_TCR0, URE_MCU_TYPE_PLA, 1877 URE_TCR0_AUTO_FIFO); 1878 ure_reset(sc); 1879 1880 /* Configure Rx FIFO threshold. */ 1881 ure_write_4(sc, URE_PLA_RXFIFO_CTRL0, URE_MCU_TYPE_PLA, 1882 URE_RXFIFO_THR1_NORMAL); 1883 ure_write_2(sc, URE_PLA_RXFIFO_CTRL1, URE_MCU_TYPE_PLA, 1884 URE_RXFIFO_THR2_NORMAL); 1885 ure_write_2(sc, URE_PLA_RXFIFO_CTRL2, URE_MCU_TYPE_PLA, 1886 URE_RXFIFO_THR3_NORMAL); 1887 1888 /* Configure Tx FIFO threshold. */ 1889 ure_write_4(sc, URE_PLA_TXFIFO_CTRL, URE_MCU_TYPE_PLA, 1890 URE_TXFIFO_THR_NORMAL2); 1891 1892 if (sc->ure_flags & URE_FLAG_8153B) { 1893 ure_write_4(sc, URE_USB_RX_BUF_TH, URE_MCU_TYPE_USB, 1894 URE_RX_THR_B); 1895 1896 URE_CLRBIT_2(sc, URE_PLA_MAC_PWR_CTRL3, 1897 URE_MCU_TYPE_PLA, URE_PLA_MCU_SPDWN_EN); 1898 } else { 1899 URE_SETBIT_1(sc, URE_PLA_CONFIG6, URE_MCU_TYPE_PLA, 1900 URE_LANWAKE_CLR_EN); 1901 URE_CLRBIT_1(sc, URE_PLA_LWAKE_CTRL_REG, 1902 URE_MCU_TYPE_PLA, URE_LANWAKE_PIN); 1903 URE_CLRBIT_2(sc, URE_USB_SSPHYLINK1, URE_MCU_TYPE_USB, 1904 URE_DELAY_PHY_PWR_CHG); 1905 } 1906 } 1907 1908 /* Enable ALDPS. */ 1909 ure_phy_write(sc, URE_OCP_POWER_CFG, 1910 ure_phy_read(sc, URE_OCP_POWER_CFG) | URE_EN_ALDPS); 1911 1912 if (sc->ure_flags & URE_FLAG_8157) { 1913 /* Clear SDR. */ 1914 URE_SETBIT_1(sc, 0xd378, URE_MCU_TYPE_USB, 0x0080); 1915 URE_CLRBIT_2(sc, 0xcd06, URE_MCU_TYPE_USB, 0x8000); 1916 } 1917 if ((sc->ure_chip & (URE_CHIP_VER_5C20 | URE_CHIP_VER_5C30)) || 1918 (sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B))) 1919 URE_SETBIT_2(sc, URE_USB_U2P3_CTRL, URE_MCU_TYPE_USB, 1920 URE_U2P3_ENABLE); 1921 1922 if (sc->ure_flags & (URE_FLAG_8153B | URE_FLAG_8156 | URE_FLAG_8156B)) { 1923 if (sc->ure_udev->speed == USB_SPEED_SUPER) 1924 URE_SETBIT_2(sc, URE_USB_LPM_CONFIG, URE_MCU_TYPE_USB, 1925 LPM_U1U2_EN); 1926 } else if (!(sc->ure_flags & URE_FLAG_8157)) { 1927 memset(u1u2, 0xff, sizeof(u1u2)); 1928 ure_write_mem(sc, URE_USB_TOLERANCE, URE_BYTE_EN_SIX_BYTES, 1929 u1u2, sizeof(u1u2)); 1930 } 1931 1932 return (0); 1933} 1934 1935uint16_t 1936ure_rtl8153_phy_status(struct ure_softc *sc, int desired) 1937{ 1938 uint16_t reg; 1939 int i; 1940 1941 for (i = 0; i < 500; i++) { 1942 reg = ure_phy_read(sc, URE_OCP_PHY_STATUS) & 1943 URE_PHY_STAT_MASK; 1944 if (desired) { 1945 if (reg == desired) 1946 break; 1947 } else { 1948 if (reg == URE_PHY_STAT_LAN_ON || 1949 reg == URE_PHY_STAT_PWRDN || 1950 reg == URE_PHY_STAT_EXT_INIT) 1951 break; 1952 } 1953 usbd_delay_ms(sc->ure_udev, 20); 1954 } 1955 if (i == 500) 1956 printf("%s: timeout waiting for phy to stabilize\n", 1957 sc->ure_dev.dv_xname); 1958 1959 return reg; 1960} 1961 1962int 1963ure_wait_for_flash(struct ure_softc *sc) 1964{ 1965 int i; 1966 1967 if ((ure_read_2(sc, URE_PLA_GPHY_CTRL, URE_MCU_TYPE_PLA) & 1968 URE_GPHY_FLASH) && 1969 !(ure_read_2(sc, URE_USB_GPHY_CTRL, URE_MCU_TYPE_USB) & 1970 URE_BYPASS_FLASH)) { 1971 for (i = 0; i < 100; i++) { 1972 if (ure_read_2(sc, URE_USB_GPHY_CTRL, 1973 URE_MCU_TYPE_USB) & URE_GPHY_PATCH_DONE) 1974 break; 1975 usbd_delay_ms(sc->ure_udev, 1); 1976 } 1977 if (i == 100) { 1978 printf("%s: timeout waiting for loading flash\n", 1979 sc->ure_dev.dv_xname); 1980 return (ETIMEDOUT); 1981 } 1982 } 1983 1984 return (0); 1985} 1986 1987void 1988ure_reset_bmu(struct ure_softc *sc) 1989{ 1990 uint8_t reg; 1991 1992 if (sc->ure_flags & URE_FLAG_8157) { 1993 URE_OCP_CMD_SETBIT(sc, 0x2350, URE_CMD_TYPE_BMU, 0x00000002); 1994 URE_OCP_CMD_SETBIT(sc, 0x2360, URE_CMD_TYPE_BMU, 0x00000001); 1995 URE_OCP_CMD_SETBIT(sc, 0x2350, URE_CMD_TYPE_BMU, 0x00000001); 1996 URE_OCP_CMD_SETBIT(sc, 0x2450, URE_CMD_TYPE_BMU, 0x00000002); 1997 URE_OCP_CMD_SETBIT(sc, 0x2460, URE_CMD_TYPE_BMU, 0x00000001); 1998 URE_OCP_CMD_SETBIT(sc, 0x2450, URE_CMD_TYPE_BMU, 0x00000001); 1999 } else { 2000 reg = ure_read_1(sc, URE_USB_BMU_RESET, URE_MCU_TYPE_USB); 2001 reg &= ~(BMU_RESET_EP_IN | BMU_RESET_EP_OUT); 2002 ure_write_1(sc, URE_USB_BMU_RESET, URE_MCU_TYPE_USB, reg); 2003 reg |= BMU_RESET_EP_IN | BMU_RESET_EP_OUT; 2004 ure_write_1(sc, URE_USB_BMU_RESET, URE_MCU_TYPE_USB, reg); 2005 } 2006} 2007 2008void 2009ure_disable_teredo(struct ure_softc *sc) 2010{ 2011 if (sc->ure_flags & 2012 (URE_FLAG_8153B | URE_FLAG_8156 | URE_FLAG_8156B | URE_FLAG_8157)) 2013 ure_write_1(sc, URE_PLA_TEREDO_CFG, URE_MCU_TYPE_PLA, 0xff); 2014 else { 2015 URE_CLRBIT_2(sc, URE_PLA_TEREDO_CFG, URE_MCU_TYPE_PLA, 2016 URE_TEREDO_SEL | URE_TEREDO_RS_EVENT_MASK | 2017 URE_OOB_TEREDO_EN); 2018 } 2019 ure_write_2(sc, URE_PLA_WDT6_CTRL, URE_MCU_TYPE_PLA, URE_WDT6_SET_MODE); 2020 ure_write_2(sc, URE_PLA_REALWOW_TIMER, URE_MCU_TYPE_PLA, 0); 2021 ure_write_4(sc, URE_PLA_TEREDO_TIMER, URE_MCU_TYPE_PLA, 0); 2022} 2023 2024int 2025ure_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) 2026{ 2027 struct ure_softc *sc = ifp->if_softc; 2028 struct ifreq *ifr = (struct ifreq *)data; 2029 int s, error = 0; 2030 2031 s = splnet(); 2032 2033 switch (cmd) { 2034 case SIOCSIFADDR: 2035 ifp->if_flags |= IFF_UP; 2036 if (!(ifp->if_flags & IFF_RUNNING)) 2037 ure_init(sc); 2038 break; 2039 2040 case SIOCSIFFLAGS: 2041 if (ifp->if_flags & IFF_UP) { 2042 if (ifp->if_flags & IFF_RUNNING) 2043 error = ENETRESET; 2044 else 2045 ure_init(sc); 2046 } else { 2047 if (ifp->if_flags & IFF_RUNNING) 2048 ure_stop(sc); 2049 } 2050 break; 2051 2052 case SIOCGIFMEDIA: 2053 case SIOCSIFMEDIA: 2054 if (sc->ure_flags & 2055 (URE_FLAG_8156 | URE_FLAG_8156B | URE_FLAG_8157)) 2056 error = ifmedia_ioctl(ifp, ifr, &sc->ure_ifmedia, cmd); 2057 else 2058 error = ifmedia_ioctl(ifp, ifr, &sc->ure_mii.mii_media, 2059 cmd); 2060 break; 2061 2062 default: 2063 error = ether_ioctl(ifp, &sc->ure_ac, cmd, data); 2064 } 2065 2066 if (error == ENETRESET) { 2067 if (ifp->if_flags & IFF_RUNNING) 2068 ure_iff(sc); 2069 error = 0; 2070 } 2071 2072 splx(s); 2073 2074 return (error); 2075} 2076 2077int 2078ure_match(struct device *parent, void *match, void *aux) 2079{ 2080 struct usb_attach_arg *uaa = aux; 2081 2082 if (uaa->iface == NULL || uaa->configno != 1) 2083 return (UMATCH_NONE); 2084 2085 return (usb_lookup(ure_devs, uaa->vendor, uaa->product) != NULL ? 2086 UMATCH_VENDOR_PRODUCT_CONF_IFACE : UMATCH_NONE); 2087} 2088 2089void 2090ure_attach(struct device *parent, struct device *self, void *aux) 2091{ 2092 struct ure_softc *sc = (struct ure_softc *)self; 2093 struct usb_attach_arg *uaa = aux; 2094 usb_interface_descriptor_t *id; 2095 usb_endpoint_descriptor_t *ed; 2096 u_char eaddr[8]; /* 4byte padded */ 2097 struct ifnet *ifp; 2098 int i, mii_flags = 0, s; 2099 uint16_t ver; 2100 2101 sc->ure_udev = uaa->device; 2102 sc->ure_iface = uaa->iface; 2103 2104 usb_init_task(&sc->ure_tick_task, ure_tick_task, sc, 2105 USB_TASK_TYPE_GENERIC); 2106 2107 id = usbd_get_interface_descriptor(sc->ure_iface); 2108 2109 for (i = 0; i < id->bNumEndpoints; i++) { 2110 ed = usbd_interface2endpoint_descriptor(sc->ure_iface, i); 2111 if (!ed) { 2112 printf("%s: couldn't get ep %d\n", 2113 sc->ure_dev.dv_xname, i); 2114 return; 2115 } 2116 if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN && 2117 UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) { 2118 sc->ure_ed[URE_ENDPT_RX] = ed->bEndpointAddress; 2119 } else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT && 2120 UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) { 2121 sc->ure_ed[URE_ENDPT_TX] = ed->bEndpointAddress; 2122 } 2123 } 2124 2125 sc->ure_txbufsz = URE_TX_BUFSZ; 2126 sc->ure_rxbufsz = URE_8153_RX_BUFSZ; 2127 2128 s = splnet(); 2129 2130 sc->ure_phyno = 0; 2131 sc->ure_phy_read = ure_ocp_reg_read; 2132 sc->ure_phy_write = ure_ocp_reg_write; 2133 printf("%s: ", sc->ure_dev.dv_xname); 2134 2135 ver = ure_read_2(sc, URE_PLA_TCR1, URE_MCU_TYPE_PLA) & URE_VERSION_MASK; 2136 switch (ver) { 2137 case 0x1030: 2138 sc->ure_flags = URE_FLAG_8157; 2139 sc->ure_txbufsz = URE_8156_TX_BUFSZ; 2140 sc->ure_phy_read = ure_rtl8157_ocp_reg_read; 2141 sc->ure_phy_write = ure_rtl8157_ocp_reg_write; 2142 printf("RTL8157 (0x1030)"); 2143 break; 2144 case 0x4c00: 2145 sc->ure_flags = URE_FLAG_8152; 2146 sc->ure_rxbufsz = URE_8152_RX_BUFSZ; 2147 sc->ure_chip |= URE_CHIP_VER_4C00; 2148 printf("RTL8152 (0x4c00)"); 2149 break; 2150 case 0x4c10: 2151 sc->ure_flags = URE_FLAG_8152; 2152 sc->ure_rxbufsz = URE_8152_RX_BUFSZ; 2153 sc->ure_chip |= URE_CHIP_VER_4C10; 2154 printf("RTL8152 (0x4c10)"); 2155 break; 2156 case 0x5c00: 2157 sc->ure_chip |= URE_CHIP_VER_5C00; 2158 printf("RTL8153 (0x5c00)"); 2159 break; 2160 case 0x5c10: 2161 sc->ure_chip |= URE_CHIP_VER_5C10; 2162 printf("RTL8153 (0x5c10)"); 2163 break; 2164 case 0x5c20: 2165 sc->ure_chip |= URE_CHIP_VER_5C20; 2166 printf("RTL8153 (0x5c20)"); 2167 break; 2168 case 0x5c30: 2169 sc->ure_chip |= URE_CHIP_VER_5C30; 2170 printf("RTL8153 (0x5c30)"); 2171 break; 2172 case 0x6000: 2173 sc->ure_flags = URE_FLAG_8153B; 2174 printf("RTL8153B (0x6000)"); 2175 break; 2176 case 0x6010: 2177 sc->ure_flags = URE_FLAG_8153B; 2178 printf("RTL8153B (0x6010)"); 2179 break; 2180 case 0x7020: 2181 sc->ure_flags = URE_FLAG_8156; 2182 sc->ure_txbufsz = URE_8156_TX_BUFSZ; 2183 printf("RTL8156 (0x7020)"); 2184 break; 2185 case 0x7030: 2186 sc->ure_flags = URE_FLAG_8156; 2187 sc->ure_txbufsz = URE_8156_TX_BUFSZ; 2188 printf("RTL8156 (0x7030)"); 2189 break; 2190 case 0x7410: 2191 sc->ure_flags = URE_FLAG_8156B; 2192 sc->ure_txbufsz = URE_8156_TX_BUFSZ; 2193 printf("RTL8156B (0x7410)"); 2194 break; 2195 case 0x7420: 2196 sc->ure_flags = URE_FLAG_8156B; 2197 sc->ure_chip = URE_CHIP_VER_7420; 2198 printf("RTL8153D (0x7420)"); 2199 break; 2200 default: 2201 printf(", unknown ver %02x", ver); 2202 break; 2203 } 2204 2205 switch (sc->ure_flags & URE_FLAG_CHIP_MASK) { 2206 case URE_FLAG_8152: 2207 ure_rtl8152_init(sc); 2208 break; 2209 case URE_FLAG_8153B: 2210 case URE_FLAG_8156: 2211 case URE_FLAG_8156B: 2212 if (ure_rtl8153b_init(sc) != 0) 2213 return; 2214 break; 2215 case URE_FLAG_8157: 2216 if (ure_rtl8157_init(sc) != 0) 2217 return; 2218 break; 2219 default: 2220 if (ure_rtl8153_init(sc) != 0) 2221 return; 2222 break; 2223 } 2224 2225 if (sc->ure_chip & URE_CHIP_VER_4C00) 2226 ure_read_mem(sc, URE_PLA_IDR, URE_MCU_TYPE_PLA, eaddr, 2227 sizeof(eaddr)); 2228 else 2229 ure_read_mem(sc, URE_PLA_BACKUP, URE_MCU_TYPE_PLA, eaddr, 2230 sizeof(eaddr)); 2231 2232 printf(", address %s\n", ether_sprintf(eaddr)); 2233 2234 bcopy(eaddr, (char *)&sc->ure_ac.ac_enaddr, ETHER_ADDR_LEN); 2235 2236 ifp = &sc->ure_ac.ac_if; 2237 ifp->if_softc = sc; 2238 strlcpy(ifp->if_xname, sc->ure_dev.dv_xname, IFNAMSIZ); 2239 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 2240 ifp->if_ioctl = ure_ioctl; 2241 ifp->if_start = ure_start; 2242 ifp->if_watchdog = ure_watchdog; 2243 2244 ifp->if_capabilities = IFCAP_VLAN_MTU | IFCAP_CSUM_IPv4 | 2245 IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4; 2246 2247#if NVLAN > 0 2248 ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING; 2249#endif 2250 2251 if (sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B | URE_FLAG_8157)) { 2252 ifmedia_init(&sc->ure_ifmedia, IFM_IMASK, ure_ifmedia_upd, 2253 ure_ifmedia_sts); 2254 ure_add_media_types(sc); 2255 ifmedia_add(&sc->ure_ifmedia, IFM_ETHER | IFM_AUTO, 0, NULL); 2256 ifmedia_set(&sc->ure_ifmedia, IFM_ETHER | IFM_AUTO); 2257 sc->ure_ifmedia.ifm_media = sc->ure_ifmedia.ifm_cur->ifm_media; 2258 } else { 2259 rw_init(&sc->ure_mii_lock, "uremii"); 2260 2261 sc->ure_mii.mii_ifp = ifp; 2262 sc->ure_mii.mii_readreg = ure_miibus_readreg; 2263 sc->ure_mii.mii_writereg = ure_miibus_writereg; 2264 sc->ure_mii.mii_statchg = ure_miibus_statchg; 2265 sc->ure_mii.mii_flags = MIIF_AUTOTSLEEP; 2266 2267 ifmedia_init(&sc->ure_mii.mii_media, 0, ure_ifmedia_upd, 2268 ure_ifmedia_sts); 2269 if (!(sc->ure_flags & URE_FLAG_8152)) 2270 mii_flags |= MIIF_DOPAUSE; 2271 mii_attach(self, &sc->ure_mii, 0xffffffff, sc->ure_phyno, 2272 MII_OFFSET_ANY, mii_flags); 2273 if (LIST_FIRST(&sc->ure_mii.mii_phys) == NULL) { 2274 ifmedia_add(&sc->ure_mii.mii_media, 2275 IFM_ETHER | IFM_NONE, 0, NULL); 2276 ifmedia_set(&sc->ure_mii.mii_media, 2277 IFM_ETHER | IFM_NONE); 2278 } else 2279 ifmedia_set(&sc->ure_mii.mii_media, 2280 IFM_ETHER | IFM_AUTO); 2281 } 2282 2283 if_attach(ifp); 2284 ether_ifattach(ifp); 2285 2286 timeout_set(&sc->ure_stat_ch, ure_tick, sc); 2287 2288 splx(s); 2289} 2290 2291int 2292ure_detach(struct device *self, int flags) 2293{ 2294 struct ure_softc *sc = (struct ure_softc *)self; 2295 struct ifnet *ifp = &sc->ure_ac.ac_if; 2296 int s; 2297 2298 if (timeout_initialized(&sc->ure_stat_ch)) 2299 timeout_del(&sc->ure_stat_ch); 2300 2301 if (sc->ure_ep[URE_ENDPT_TX] != NULL) 2302 usbd_abort_pipe(sc->ure_ep[URE_ENDPT_TX]); 2303 if (sc->ure_ep[URE_ENDPT_RX] != NULL) 2304 usbd_abort_pipe(sc->ure_ep[URE_ENDPT_RX]); 2305 2306 usb_rem_task(sc->ure_udev, &sc->ure_tick_task); 2307 2308 s = splusb(); 2309 2310 if (--sc->ure_refcnt >= 0) { 2311 usb_detach_wait(&sc->ure_dev); 2312 } 2313 2314 if (ifp->if_flags & IFF_RUNNING) 2315 ure_stop(sc); 2316 2317 mii_detach(&sc->ure_mii, MII_PHY_ANY, MII_OFFSET_ANY); 2318 ifmedia_delete_instance(&sc->ure_mii.mii_media, IFM_INST_ANY); 2319 if (ifp->if_softc != NULL) { 2320 ether_ifdetach(ifp); 2321 if_detach(ifp); 2322 } 2323 2324 splx(s); 2325 2326 return 0; 2327} 2328 2329void 2330ure_tick_task(void *xsc) 2331{ 2332 struct ure_softc *sc = xsc; 2333 struct mii_data *mii; 2334 int s; 2335 2336 if (sc == NULL) 2337 return; 2338 2339 if (usbd_is_dying(sc->ure_udev)) 2340 return; 2341 mii = &sc->ure_mii; 2342 2343 s = splnet(); 2344 if (sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B | URE_FLAG_8157)) 2345 ure_link_state(sc); 2346 else { 2347 mii_tick(mii); 2348 if ((sc->ure_flags & URE_FLAG_LINK) == 0) 2349 ure_miibus_statchg(&sc->ure_dev); 2350 } 2351 timeout_add_sec(&sc->ure_stat_ch, 1); 2352 splx(s); 2353} 2354 2355void 2356ure_lock_mii(struct ure_softc *sc) 2357{ 2358 sc->ure_refcnt++; 2359 rw_enter_write(&sc->ure_mii_lock); 2360} 2361 2362void 2363ure_unlock_mii(struct ure_softc *sc) 2364{ 2365 rw_exit_write(&sc->ure_mii_lock); 2366 if (--sc->ure_refcnt < 0) 2367 usb_detach_wakeup(&sc->ure_dev); 2368} 2369 2370void 2371ure_rxcsum(struct ure_rxpkt *rxhdr, struct mbuf *m) 2372{ 2373 uint32_t cflags, rxvlan; 2374 2375 cflags = letoh32(rxhdr->ure_csum); 2376 rxvlan = letoh32(rxhdr->ure_vlan); 2377 2378 /* Check IP header checksum. */ 2379 if ((rxvlan & URE_RXPKT_IPV4) && !(cflags & URE_RXPKT_IPSUMBAD)) 2380 m->m_pkthdr.csum_flags |= M_IPV4_CSUM_IN_OK; 2381 2382 /* Check TCP/UDP checksum. */ 2383 if ((rxvlan & (URE_RXPKT_IPV4 | URE_RXPKT_IPV6)) && 2384 (((rxvlan & URE_RXPKT_TCP) && !(cflags & URE_RXPKT_TCPSUMBAD)) || 2385 ((rxvlan & URE_RXPKT_UDP) && !(cflags & URE_RXPKT_UDPSUMBAD)))) 2386 m->m_pkthdr.csum_flags |= M_TCP_CSUM_IN_OK | M_UDP_CSUM_IN_OK; 2387#if NVLAN > 0 2388 if (rxvlan & URE_RXPKT_VLAN_TAG) { 2389 m->m_pkthdr.ether_vtag = swap16(rxvlan & URE_RXPKT_VLAN_DATA); 2390 m->m_flags |= M_VLANTAG; 2391 } 2392#endif 2393} 2394 2395void 2396ure_rxcsum_v2(struct ure_rxpkt_v2 *rxhdr2, struct mbuf *m) 2397{ 2398 uint32_t cflags, rxvlan, vtag; 2399 2400 cflags = letoh32(rxhdr2->ure_csum); 2401 rxvlan = letoh32(rxhdr2->ure_vlan); 2402 vtag = letoh32(rxhdr2->ure_pktlen); 2403 2404 /* Check IP header checksum. */ 2405 if ((cflags & (URE_RXPKT_V2_IPV4 | URE_RXPKT_V2_IPSUMBAD)) != 2406 (URE_RXPKT_V2_IPV4 | URE_RXPKT_V2_IPSUMBAD)) 2407 m->m_pkthdr.csum_flags |= M_IPV4_CSUM_IN_OK; 2408 2409 /* Check TCP/UDP checksum. */ 2410 if ((cflags & (URE_RXPKT_V2_IPV4 | URE_RXPKT_V2_IPV6)) && 2411 (((cflags & (URE_RXPKT_V2_TCP | URE_RXPKT_V2_TCPSUMBAD)) == 2412 URE_RXPKT_V2_TCP) || 2413 ((cflags & (URE_RXPKT_V2_UDP | URE_RXPKT_V2_UDPSUMBAD)) == 2414 URE_RXPKT_V2_UDP))) 2415 m->m_pkthdr.csum_flags |= M_TCP_CSUM_IN_OK | M_UDP_CSUM_IN_OK; 2416#if NVLAN > 0 2417 if (vtag & URE_RXPKT_V2_VLAN_TAG) { 2418 m->m_pkthdr.ether_vtag = 2419 swap16((rxvlan >> 16) & URE_RXPKT_VLAN_DATA); 2420 m->m_flags |= M_VLANTAG; 2421 } 2422#endif 2423} 2424 2425void 2426ure_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status) 2427{ 2428 struct ure_chain *c = (struct ure_chain *)priv; 2429 struct ure_softc *sc = c->uc_sc; 2430 struct ifnet *ifp = &sc->ure_ac.ac_if; 2431 uint32_t total_len; 2432 2433 if (usbd_is_dying(sc->ure_udev)) 2434 return; 2435 2436 if (!(ifp->if_flags & IFF_RUNNING)) 2437 return; 2438 2439 if (status != USBD_NORMAL_COMPLETION) { 2440 if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) 2441 return; 2442 if (usbd_ratecheck(&sc->ure_rx_notice)) { 2443 printf("%s: usb errors on rx: %s\n", 2444 sc->ure_dev.dv_xname, usbd_errstr(status)); 2445 } 2446 if (status == USBD_STALLED) 2447 usbd_clear_endpoint_stall_async( 2448 sc->ure_ep[URE_ENDPT_RX]); 2449 goto done; 2450 } 2451 2452 usbd_get_xfer_status(xfer, NULL, NULL, &total_len, NULL); 2453 DPRINTFN(3, ("received %d bytes\n", total_len)); 2454 ure_decap(sc, c, total_len); 2455 2456done: 2457 usbd_setup_xfer(xfer, sc->ure_ep[URE_ENDPT_RX], c, c->uc_buf, 2458 sc->ure_rxbufsz, USBD_SHORT_XFER_OK | USBD_NO_COPY, 2459 USBD_NO_TIMEOUT, ure_rxeof); 2460 usbd_transfer(xfer); 2461} 2462 2463void 2464ure_txeof(struct usbd_xfer *xfer, void *priv, usbd_status status) 2465{ 2466 struct ure_softc *sc; 2467 struct ure_chain *c; 2468 struct ifnet *ifp; 2469 int s; 2470 2471 c = priv; 2472 sc = c->uc_sc; 2473 ifp = &sc->ure_ac.ac_if; 2474 2475 if (usbd_is_dying(sc->ure_udev)) 2476 return; 2477 2478 if (status != USBD_NORMAL_COMPLETION) 2479 DPRINTF(("%s: %s uc_idx=%u : %s\n", sc->ure_dev.dv_xname, 2480 __func__, c->uc_idx, usbd_errstr(status))); 2481 2482 s = splnet(); 2483 2484 c->uc_cnt = 0; 2485 c->uc_buflen = 0; 2486 2487 SLIST_INSERT_HEAD(&sc->ure_cdata.ure_tx_free, c, uc_list); 2488 2489 if (status != USBD_NORMAL_COMPLETION) { 2490 if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) { 2491 splx(s); 2492 return; 2493 } 2494 2495 ifp->if_oerrors++; 2496 printf("%s: usb error on tx: %s\n", sc->ure_dev.dv_xname, 2497 usbd_errstr(status)); 2498 2499 if (status == USBD_STALLED) 2500 usbd_clear_endpoint_stall_async( 2501 sc->ure_ep[URE_ENDPT_TX]); 2502 splx(s); 2503 return; 2504 } 2505 2506 ifp->if_timer = 0; 2507 if (ifq_is_oactive(&ifp->if_snd)) 2508 ifq_restart(&ifp->if_snd); 2509 splx(s); 2510} 2511 2512void 2513ure_decap(struct ure_softc *sc, struct ure_chain *c, uint32_t len) 2514{ 2515 struct ifnet *ifp = &sc->ure_ac.ac_if; 2516 u_char *buf = c->uc_buf; 2517 uint32_t hdrsize; 2518 struct mbuf_list ml = MBUF_LIST_INITIALIZER(); 2519 struct mbuf *m; 2520 int pktlen = 0, align, s; 2521 struct ure_rxpkt rxhdr; 2522 struct ure_rxpkt_v2 rxhdr2; 2523 2524 align = (sc->ure_flags & URE_FLAG_8157) ? 2525 URE_8157_BUF_ALIGN : URE_RX_BUF_ALIGN; 2526 hdrsize = (sc->ure_flags & URE_FLAG_8157) ? 2527 sizeof(rxhdr2) : sizeof(rxhdr); 2528 2529 do { 2530 if (len < hdrsize) { 2531 DPRINTF(("too few bytes left for a packet header\n")); 2532 ifp->if_ierrors++; 2533 break; 2534 } 2535 2536 buf += roundup(pktlen, align); 2537 2538 if (sc->ure_flags & URE_FLAG_8157) { 2539 memcpy(&rxhdr2, buf, hdrsize); 2540 pktlen = 2541 letoh32(rxhdr2.ure_pktlen) & URE_RXPKT_V2_LEN_MASK; 2542 pktlen >>= 17; 2543 } else { 2544 memcpy(&rxhdr, buf, hdrsize); 2545 pktlen = letoh32(rxhdr.ure_pktlen) & URE_RXPKT_LEN_MASK; 2546 } 2547 2548 len -= hdrsize; 2549 DPRINTFN(4, ("next packet is %d bytes\n", pktlen)); 2550 if (pktlen > len) { 2551 DPRINTF(("not enough bytes left for next packet\n")); 2552 ifp->if_ierrors++; 2553 break; 2554 } 2555 2556 len -= roundup(pktlen, align); 2557 buf += hdrsize; 2558 2559 m = m_devget(buf, pktlen - ETHER_CRC_LEN, ETHER_ALIGN); 2560 if (m == NULL) { 2561 DPRINTF(("unable to allocate mbuf for next packet\n")); 2562 ifp->if_ierrors++; 2563 break; 2564 } 2565 2566 if (sc->ure_flags & URE_FLAG_8157) 2567 ure_rxcsum_v2(&rxhdr2, m); 2568 else 2569 ure_rxcsum(&rxhdr, m); 2570 2571 ml_enqueue(&ml, m); 2572 } while (len > 0); 2573 2574 s = splnet(); 2575 if_input(ifp, &ml); 2576 splx(s); 2577 memset(c->uc_buf, 0, sc->ure_rxbufsz); 2578} 2579 2580int 2581ure_encap_txpkt(struct ure_softc *sc, struct mbuf *m, char *buf, 2582 uint32_t maxlen) 2583{ 2584 struct ure_txpkt txhdr; 2585 struct ure_txpkt_v2 txhdr2; 2586 uint32_t len, cflags = 0; 2587 2588 len = (sc->ure_flags & URE_FLAG_8157) ? sizeof(txhdr2) : sizeof(txhdr); 2589 if (len + m->m_pkthdr.len > maxlen) 2590 return (-1); 2591 2592 if ((m->m_pkthdr.csum_flags & 2593 (M_IPV4_CSUM_OUT | M_TCP_CSUM_OUT | M_UDP_CSUM_OUT)) != 0) { 2594 cflags |= URE_TXPKT_IPV4; 2595 if (m->m_pkthdr.csum_flags & M_TCP_CSUM_OUT) 2596 cflags |= URE_TXPKT_TCP; 2597 if (m->m_pkthdr.csum_flags & M_UDP_CSUM_OUT) 2598 cflags |= URE_TXPKT_UDP; 2599 } 2600 2601#if NVLAN > 0 2602 if (m->m_flags & M_VLANTAG) 2603 cflags |= URE_TXPKT_VLAN_TAG | swap16(m->m_pkthdr.ether_vtag); 2604#endif 2605 2606 if (sc->ure_flags & URE_FLAG_8157) { 2607 txhdr2.ure_cmdstat = htole32(URE_TXPKT_TX_FS | URE_TXPKT_TX_LS); 2608 txhdr2.ure_vlan = htole32(cflags); 2609 txhdr2.ure_pktlen = htole32(m->m_pkthdr.len << 4); 2610 txhdr2.ure_signature = htole32(URE_TXPKT_SIGNATURE); 2611 memcpy(buf, &txhdr2, len); 2612 } else { 2613 txhdr.ure_pktlen = htole32(m->m_pkthdr.len | URE_TXPKT_TX_FS | 2614 URE_TXPKT_TX_LS); 2615 txhdr.ure_vlan = htole32(cflags); 2616 memcpy(buf, &txhdr, len); 2617 } 2618 2619 m_copydata(m, 0, m->m_pkthdr.len, buf + len); 2620 len += m->m_pkthdr.len; 2621 2622 return (len); 2623} 2624 2625int 2626ure_encap_xfer(struct ifnet *ifp, struct ure_softc *sc, struct ure_chain *c) 2627{ 2628 usbd_status err; 2629 2630 usbd_setup_xfer(c->uc_xfer, sc->ure_ep[URE_ENDPT_TX], c, c->uc_buf, 2631 c->uc_buflen, USBD_FORCE_SHORT_XFER | USBD_NO_COPY, 10000, 2632 ure_txeof); 2633 2634 err = usbd_transfer(c->uc_xfer); 2635 if (err != USBD_IN_PROGRESS) { 2636 c->uc_cnt = 0; 2637 c->uc_buflen = 0; 2638 ure_stop(sc); 2639 return (EIO); 2640 } 2641 2642 return (0); 2643}