if_rt.c revision 223929
1/*- 2 * Copyright (c) 2011, Aleksandr Rybalko 3 * based on hard work 4 * by Alexander Egorenkov <egorenar@gmail.com> 5 * and by Damien Bergamini <damien.bergamini@free.fr> 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice unmodified, this list of conditions, and the following 13 * disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 */ 30 31#include <sys/cdefs.h> 32__FBSDID("$FreeBSD: head/sys/dev/rt/if_rt.c 223929 2011-07-11 08:42:09Z ray $"); 33 34#include "if_rtvar.h" 35#include "if_rtreg.h" 36 37#include <net/if.h> 38#include <net/if_arp.h> 39#include <net/ethernet.h> 40#include <net/if_dl.h> 41#include <net/if_media.h> 42#include <net/if_types.h> 43#include <net/if_vlan_var.h> 44 45#include <net/bpf.h> 46 47#include <machine/bus.h> 48#include <machine/cache.h> 49#include <machine/cpufunc.h> 50#include <machine/resource.h> 51#include <vm/vm_param.h> 52#include <vm/vm.h> 53#include <vm/pmap.h> 54#include <machine/pmap.h> 55#include <sys/bus.h> 56#include <sys/rman.h> 57 58#include <dev/mii/mii.h> 59#include <dev/mii/miivar.h> 60 61#include <mips/rt305x/rt305x_sysctlvar.h> 62#include <mips/rt305x/rt305xreg.h> 63 64#ifdef IF_RT_PHY_SUPPORT 65#include "miibus_if.h" 66#endif 67 68/* 69 * Defines and macros 70 */ 71#define RT_MAX_AGG_SIZE 3840 72 73#define RT_TX_DATA_SEG0_SIZE MJUMPAGESIZE 74 75#define RT_MS(_v, _f) (((_v) & _f) >> _f##_S) 76#define RT_SM(_v, _f) (((_v) << _f##_S) & _f) 77 78#define RT_TX_WATCHDOG_TIMEOUT 5 79 80/* 81 * Static function prototypes 82 */ 83static int rt_probe(device_t dev); 84static int rt_attach(device_t dev); 85static int rt_detach(device_t dev); 86static int rt_shutdown(device_t dev); 87static int rt_suspend(device_t dev); 88static int rt_resume(device_t dev); 89static void rt_init_locked(void *priv); 90static void rt_init(void *priv); 91static void rt_stop_locked(void *priv); 92static void rt_stop(void *priv); 93static void rt_start(struct ifnet *ifp); 94static int rt_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data); 95static void rt_periodic(void *arg); 96static void rt_tx_watchdog(void *arg); 97static void rt_intr(void *arg); 98static void rt_tx_coherent_intr(struct rt_softc *sc); 99static void rt_rx_coherent_intr(struct rt_softc *sc); 100static void rt_rx_delay_intr(struct rt_softc *sc); 101static void rt_tx_delay_intr(struct rt_softc *sc); 102static void rt_rx_intr(struct rt_softc *sc); 103static void rt_tx_intr(struct rt_softc *sc, int qid); 104static void rt_rx_done_task(void *context, int pending); 105static void rt_tx_done_task(void *context, int pending); 106static void rt_periodic_task(void *context, int pending); 107static int rt_rx_eof(struct rt_softc *sc, int limit); 108static void rt_tx_eof(struct rt_softc *sc, 109 struct rt_softc_tx_ring *ring); 110static void rt_update_stats(struct rt_softc *sc); 111static void rt_watchdog(struct rt_softc *sc); 112static void rt_update_raw_counters(struct rt_softc *sc); 113static void rt_intr_enable(struct rt_softc *sc, uint32_t intr_mask); 114static void rt_intr_disable(struct rt_softc *sc, uint32_t intr_mask); 115static int rt_txrx_enable(struct rt_softc *sc); 116static int rt_alloc_rx_ring(struct rt_softc *sc, 117 struct rt_softc_rx_ring *ring); 118static void rt_reset_rx_ring(struct rt_softc *sc, 119 struct rt_softc_rx_ring *ring); 120static void rt_free_rx_ring(struct rt_softc *sc, 121 struct rt_softc_rx_ring *ring); 122static int rt_alloc_tx_ring(struct rt_softc *sc, 123 struct rt_softc_tx_ring *ring, int qid); 124static void rt_reset_tx_ring(struct rt_softc *sc, 125 struct rt_softc_tx_ring *ring); 126static void rt_free_tx_ring(struct rt_softc *sc, 127 struct rt_softc_tx_ring *ring); 128static void rt_dma_map_addr(void *arg, bus_dma_segment_t *segs, 129 int nseg, int error); 130static void rt_sysctl_attach(struct rt_softc *sc); 131#ifdef IF_RT_PHY_SUPPORT 132void rt_miibus_statchg(device_t); 133static int rt_miibus_readreg(device_t, int, int); 134static int rt_miibus_writereg(device_t, int, int, int); 135#endif 136static int rt_ifmedia_upd(struct ifnet *); 137static void rt_ifmedia_sts(struct ifnet *, struct ifmediareq *); 138 139SYSCTL_NODE(_hw, OID_AUTO, rt, CTLFLAG_RD, 0, "RT driver parameters"); 140#ifdef IF_RT_DEBUG 141static int rt_debug = 0; 142SYSCTL_INT(_hw_rt, OID_AUTO, debug, CTLFLAG_RW, &rt_debug, 0, 143 "RT debug level"); 144TUNABLE_INT("hw.rt.debug", &rt_debug); 145#endif 146 147static int 148rt_probe(device_t dev) 149{ 150 device_set_desc(dev, "Ralink RT305XF onChip Ethernet MAC"); 151 return (0); 152} 153 154/* 155 * macaddr_atoi - translate string MAC address to uint8_t array 156 */ 157static int 158macaddr_atoi(const char *str, uint8_t *mac) 159{ 160 int count, i; 161 unsigned int amac[ETHER_ADDR_LEN]; /* Aligned version */ 162 163 count = sscanf(str, "%x%*c%x%*c%x%*c%x%*c%x%*c%x", 164 &amac[0], &amac[1], &amac[2], 165 &amac[3], &amac[4], &amac[5]); 166 if (count < ETHER_ADDR_LEN) { 167 memset(mac, 0, ETHER_ADDR_LEN); 168 return (1); 169 } 170 171 /* Copy aligned to result */ 172 for (i = 0; i < ETHER_ADDR_LEN; i ++) 173 mac[i] = (amac[i] & 0xff); 174 175 return (0); 176} 177 178#ifdef USE_GENERATED_MAC_ADDRESS 179static char * 180kernenv_next(char *cp) 181{ 182 183 if (cp != NULL) { 184 while (*cp != 0) 185 cp++; 186 cp++; 187 if (*cp == 0) 188 cp = NULL; 189 } 190 return (cp); 191} 192 193/* 194 * generate_mac(uin8_t *mac) 195 * This is MAC address generator for cases when real device MAC address 196 * unknown or not yet accessible. 197 * Use 'b','s','d' signature and 3 octets from CRC32 on kenv. 198 * MAC = 'b', 's', 'd', CRC[3]^CRC[2], CRC[1], CRC[0] 199 * 200 * Output - MAC address, that do not change between reboots, if hints or 201 * bootloader info unchange. 202 */ 203static void 204generate_mac(uint8_t *mac) 205{ 206 unsigned char *cp; 207 int i = 0; 208 uint32_t crc = 0xffffffff; 209 210 /* Generate CRC32 on kenv */ 211 if (dynamic_kenv) { 212 for (cp = kenvp[0]; cp != NULL; cp = kenvp[++i]) { 213 crc = calculate_crc32c(crc, cp, strlen(cp) + 1); 214 } 215 } else { 216 for (cp = kern_envp; cp != NULL; cp = kernenv_next(cp)) { 217 crc = calculate_crc32c(crc, cp, strlen(cp) + 1); 218 } 219 } 220 crc = ~crc; 221 222 mac[0] = 'b'; 223 mac[1] = 's'; 224 mac[2] = 'd'; 225 mac[3] = (crc >> 24) ^ ((crc >> 16) & 0xff); 226 mac[4] = (crc >> 8) & 0xff; 227 mac[5] = crc & 0xff; 228} 229#endif 230 231/* 232 * ether_request_mac - try to find usable MAC address. 233 */ 234static int 235ether_request_mac(device_t dev, uint8_t *mac) 236{ 237 char *var; 238 239 /* 240 * "ethaddr" is passed via envp on RedBoot platforms 241 * "kmac" is passed via argv on RouterBOOT platforms 242 */ 243#if defined(__U_BOOT__) || defined(__REDBOOT__) || defined(__ROUTERBOOT__) 244 if ((var = getenv("ethaddr")) != NULL || 245 (var = getenv("kmac")) != NULL ) { 246 247 if(!macaddr_atoi(var, mac)) { 248 printf("%s: use %s macaddr from KENV\n", 249 device_get_nameunit(dev), var); 250 freeenv(var); 251 return (0); 252 } 253 freeenv(var); 254 } 255#endif 256 257 /* 258 * Try from hints 259 * hint.[dev].[unit].macaddr 260 */ 261 if (!resource_string_value(device_get_name(dev), 262 device_get_unit(dev), "macaddr", (const char **)&var)) { 263 264 if(!macaddr_atoi(var, mac)) { 265 printf("%s: use %s macaddr from hints\n", 266 device_get_nameunit(dev), var); 267 return (0); 268 } 269 } 270 271#ifdef USE_GENERATED_MAC_ADDRESS 272 generate_mac(mac); 273 274 device_printf(dev, "use generated %02x:%02x:%02x:%02x:%02x:%02x " 275 "macaddr\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); 276#else 277 /* Hardcoded */ 278 mac[0] = 0x00; 279 mac[1] = 0x18; 280 mac[2] = 0xe7; 281 mac[3] = 0xd5; 282 mac[4] = 0x83; 283 mac[5] = 0x90; 284 285 device_printf(dev, "use hardcoded 00:18:e7:d5:83:90 macaddr\n"); 286#endif 287 288 return (0); 289} 290 291static int 292rt_attach(device_t dev) 293{ 294 struct rt_softc *sc; 295 struct ifnet *ifp; 296 int error, i; 297 298 sc = device_get_softc(dev); 299 sc->dev = dev; 300 301 mtx_init(&sc->lock, device_get_nameunit(dev), MTX_NETWORK_LOCK, 302 MTX_DEF | MTX_RECURSE); 303 304 sc->mem_rid = 0; 305 sc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->mem_rid, 306 RF_ACTIVE); 307 if (sc->mem == NULL) { 308 device_printf(dev, "could not allocate memory resource\n"); 309 error = ENXIO; 310 goto fail; 311 } 312 313 sc->bst = rman_get_bustag(sc->mem); 314 sc->bsh = rman_get_bushandle(sc->mem); 315 316 sc->irq_rid = 0; 317 sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irq_rid, 318 RF_ACTIVE); 319 if (sc->irq == NULL) { 320 device_printf(dev, 321 "could not allocate interrupt resource\n"); 322 error = ENXIO; 323 goto fail; 324 } 325 326#ifdef IF_RT_DEBUG 327 sc->debug = rt_debug; 328 329 SYSCTL_ADD_INT(device_get_sysctl_ctx(dev), 330 SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, 331 "debug", CTLFLAG_RW, &sc->debug, 0, "rt debug level"); 332#endif 333 334 device_printf(dev, "RT305XF Ethernet MAC (rev 0x%08x)\n", 335 sc->mac_rev); 336 337 /* Reset hardware */ 338 RT_WRITE(sc, GE_PORT_BASE + FE_RST_GLO, PSE_RESET); 339 340 RT_WRITE(sc, GDMA1_BASE + GDMA_FWD_CFG, 341 ( 342 GDM_ICS_EN | /* Enable IP Csum */ 343 GDM_TCS_EN | /* Enable TCP Csum */ 344 GDM_UCS_EN | /* Enable UDP Csum */ 345 GDM_STRPCRC | /* Strip CRC from packet */ 346 GDM_DST_PORT_CPU << GDM_UFRC_P_SHIFT | /* Forward UCast to CPU */ 347 GDM_DST_PORT_CPU << GDM_BFRC_P_SHIFT | /* Forward BCast to CPU */ 348 GDM_DST_PORT_CPU << GDM_MFRC_P_SHIFT | /* Forward MCast to CPU */ 349 GDM_DST_PORT_CPU << GDM_OFRC_P_SHIFT /* Forward Other to CPU */ 350 )); 351 352 /* allocate Tx and Rx rings */ 353 for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++) { 354 error = rt_alloc_tx_ring(sc, &sc->tx_ring[i], i); 355 if (error != 0) { 356 device_printf(dev, "could not allocate Tx ring #%d\n", 357 i); 358 goto fail; 359 } 360 } 361 362 sc->tx_ring_mgtqid = 5; 363 364 error = rt_alloc_rx_ring(sc, &sc->rx_ring); 365 if (error != 0) { 366 device_printf(dev, "could not allocate Rx ring\n"); 367 goto fail; 368 } 369 370 callout_init(&sc->periodic_ch, 0); 371 callout_init_mtx(&sc->tx_watchdog_ch, &sc->lock, 0); 372 373 ifp = sc->ifp = if_alloc(IFT_ETHER); 374 if (ifp == NULL) { 375 device_printf(dev, "could not if_alloc()\n"); 376 error = ENOMEM; 377 goto fail; 378 } 379 380 ifp->if_softc = sc; 381 if_initname(ifp, device_get_name(sc->dev), device_get_unit(sc->dev)); 382 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 383 ifp->if_init = rt_init; 384 ifp->if_ioctl = rt_ioctl; 385 ifp->if_start = rt_start; 386 ifp->if_mtu = ETHERMTU; 387#define RT_TX_QLEN 256 388 389 IFQ_SET_MAXLEN(&ifp->if_snd, RT_TX_QLEN); 390 ifp->if_snd.ifq_drv_maxlen = RT_TX_QLEN; 391 IFQ_SET_READY(&ifp->if_snd); 392 393#ifdef IF_RT_PHY_SUPPORT 394 error = mii_attach(dev, &sc->rt_miibus, ifp, rt_ifmedia_upd, 395 rt_ifmedia_sts, BMSR_DEFCAPMASK, MII_PHY_ANY, MII_OFFSET_ANY, 0); 396 if (error != 0) { 397 device_printf(dev, "attaching PHYs failed\n"); 398 error = ENXIO; 399 goto fail; 400 } 401#else 402 ifmedia_init(&sc->rt_ifmedia, 0, rt_ifmedia_upd, rt_ifmedia_sts); 403 ifmedia_add(&sc->rt_ifmedia, IFM_ETHER | IFM_100_TX | IFM_FDX, 0, 404 NULL); 405 ifmedia_set(&sc->rt_ifmedia, IFM_ETHER | IFM_100_TX | IFM_FDX); 406 407#endif /* IF_RT_PHY_SUPPORT */ 408 409 ether_request_mac(dev, sc->mac_addr); 410 ether_ifattach(ifp, sc->mac_addr); 411 412 /* 413 * Tell the upper layer(s) we support long frames. 414 */ 415 ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header); 416 ifp->if_capabilities |= IFCAP_VLAN_MTU; 417 ifp->if_capenable |= IFCAP_VLAN_MTU; 418 ifp->if_capabilities |= IFCAP_RXCSUM|IFCAP_TXCSUM; 419 ifp->if_capenable |= IFCAP_RXCSUM|IFCAP_TXCSUM; 420 421 /* init task queue */ 422 TASK_INIT(&sc->rx_done_task, 0, rt_rx_done_task, sc); 423 TASK_INIT(&sc->tx_done_task, 0, rt_tx_done_task, sc); 424 TASK_INIT(&sc->periodic_task, 0, rt_periodic_task, sc); 425 426 sc->rx_process_limit = 100; 427 428 sc->taskqueue = taskqueue_create("rt_taskq", M_NOWAIT, 429 taskqueue_thread_enqueue, &sc->taskqueue); 430 431 taskqueue_start_threads(&sc->taskqueue, 1, PI_NET, "%s taskq", 432 device_get_nameunit(sc->dev)); 433 434 rt_sysctl_attach(sc); 435 436 /* set up interrupt */ 437 error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET | INTR_MPSAFE, 438 NULL, rt_intr, sc, &sc->irqh); 439 if (error != 0) { 440 printf("%s: could not set up interrupt\n", 441 device_get_nameunit(dev)); 442 goto fail; 443 } 444#ifdef IF_RT_DEBUG 445 device_printf(dev, "debug var at %#08x\n", (u_int)&(sc->debug)); 446#endif 447 448 return (0); 449 450fail: 451 /* free Tx and Rx rings */ 452 for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++) 453 rt_free_tx_ring(sc, &sc->tx_ring[i]); 454 455 rt_free_rx_ring(sc, &sc->rx_ring); 456 457 mtx_destroy(&sc->lock); 458 459 if (sc->mem != NULL) 460 bus_release_resource(dev, SYS_RES_MEMORY, sc->mem_rid, 461 sc->mem); 462 463 if (sc->irq != NULL) 464 bus_release_resource(dev, SYS_RES_IRQ, sc->irq_rid, 465 sc->irq); 466 467 return (error); 468} 469 470/* 471 * Set media options. 472 */ 473static int 474rt_ifmedia_upd(struct ifnet *ifp) 475{ 476 struct rt_softc *sc; 477#ifdef IF_RT_PHY_SUPPORT 478 struct mii_data *mii; 479 int error = 0; 480 481 sc = ifp->if_softc; 482 RT_SOFTC_LOCK(sc); 483 484 mii = device_get_softc(sc->rt_miibus); 485 if (mii->mii_instance) { 486 struct mii_softc *miisc; 487 for (miisc = LIST_FIRST(&mii->mii_phys); miisc != NULL; 488 miisc = LIST_NEXT(miisc, mii_list)) 489 mii_phy_reset(miisc); 490 } 491 if (mii) 492 error = mii_mediachg(mii); 493 RT_SOFTC_UNLOCK(sc); 494 495 return (error); 496 497#else /* !IF_RT_PHY_SUPPORT */ 498 499 struct ifmedia *ifm; 500 struct ifmedia_entry *ife; 501 502 sc = ifp->if_softc; 503 ifm = &sc->rt_ifmedia; 504 ife = ifm->ifm_cur; 505 506 if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER) 507 return (EINVAL); 508 509 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) { 510 device_printf(sc->dev, 511 "AUTO is not supported for multiphy MAC"); 512 return (EINVAL); 513 } 514 515 /* 516 * Ignore everything 517 */ 518 return (0); 519#endif /* IF_RT_PHY_SUPPORT */ 520} 521 522/* 523 * Report current media status. 524 */ 525static void 526rt_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) 527{ 528#ifdef IF_RT_PHY_SUPPORT 529 struct rt_softc *sc; 530 struct mii_data *mii; 531 532 sc = ifp->if_softc; 533 534 RT_SOFTC_LOCK(sc); 535 mii = device_get_softc(sc->rt_miibus); 536 mii_pollstat(mii); 537 ifmr->ifm_active = mii->mii_media_active; 538 ifmr->ifm_status = mii->mii_media_status; 539 ifmr->ifm_active = IFM_ETHER | IFM_100_TX | IFM_FDX; 540 ifmr->ifm_status = IFM_AVALID | IFM_ACTIVE; 541 RT_SOFTC_UNLOCK(sc); 542#else /* !IF_RT_PHY_SUPPORT */ 543 544 ifmr->ifm_status = IFM_AVALID | IFM_ACTIVE; 545 ifmr->ifm_active = IFM_ETHER | IFM_100_TX | IFM_FDX; 546#endif /* IF_RT_PHY_SUPPORT */ 547} 548 549static int 550rt_detach(device_t dev) 551{ 552 struct rt_softc *sc; 553 struct ifnet *ifp; 554 int i; 555 556 sc = device_get_softc(dev); 557 ifp = sc->ifp; 558 559 RT_DPRINTF(sc, RT_DEBUG_ANY, "detaching\n"); 560 561 RT_SOFTC_LOCK(sc); 562 563 ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); 564 565 callout_stop(&sc->periodic_ch); 566 callout_stop(&sc->tx_watchdog_ch); 567 568 taskqueue_drain(sc->taskqueue, &sc->rx_done_task); 569 taskqueue_drain(sc->taskqueue, &sc->tx_done_task); 570 taskqueue_drain(sc->taskqueue, &sc->periodic_task); 571 572 /* free Tx and Rx rings */ 573 for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++) 574 rt_free_tx_ring(sc, &sc->tx_ring[i]); 575 576 rt_free_rx_ring(sc, &sc->rx_ring); 577 578 RT_SOFTC_UNLOCK(sc); 579 580#ifdef IF_RT_PHY_SUPPORT 581 if (sc->rt_miibus != NULL) 582 device_delete_child(dev, sc->rt_miibus); 583#endif 584 585 ether_ifdetach(ifp); 586 if_free(ifp); 587 588 taskqueue_free(sc->taskqueue); 589 590 mtx_destroy(&sc->lock); 591 592 bus_generic_detach(dev); 593 bus_teardown_intr(dev, sc->irq, sc->irqh); 594 bus_release_resource(dev, SYS_RES_IRQ, sc->irq_rid, sc->irq); 595 bus_release_resource(dev, SYS_RES_MEMORY, sc->mem_rid, sc->mem); 596 597 return (0); 598} 599 600static int 601rt_shutdown(device_t dev) 602{ 603 struct rt_softc *sc; 604 605 sc = device_get_softc(dev); 606 RT_DPRINTF(sc, RT_DEBUG_ANY, "shutting down\n"); 607 rt_stop(sc); 608 609 return (0); 610} 611 612static int 613rt_suspend(device_t dev) 614{ 615 struct rt_softc *sc; 616 617 sc = device_get_softc(dev); 618 RT_DPRINTF(sc, RT_DEBUG_ANY, "suspending\n"); 619 rt_stop(sc); 620 621 return (0); 622} 623 624static int 625rt_resume(device_t dev) 626{ 627 struct rt_softc *sc; 628 struct ifnet *ifp; 629 630 sc = device_get_softc(dev); 631 ifp = sc->ifp; 632 633 RT_DPRINTF(sc, RT_DEBUG_ANY, "resuming\n"); 634 635 if (ifp->if_flags & IFF_UP) 636 rt_init(sc); 637 638 return (0); 639} 640 641/* 642 * rt_init_locked - Run initialization process having locked mtx. 643 */ 644static void 645rt_init_locked(void *priv) 646{ 647 struct rt_softc *sc; 648 struct ifnet *ifp; 649#ifdef IF_RT_PHY_SUPPORT 650 struct mii_data *mii; 651#endif 652 int i, ntries; 653 uint32_t tmp; 654 655 sc = priv; 656 ifp = sc->ifp; 657#ifdef IF_RT_PHY_SUPPORT 658 mii = device_get_softc(sc->rt_miibus); 659#endif 660 661 RT_DPRINTF(sc, RT_DEBUG_ANY, "initializing\n"); 662 663 RT_SOFTC_ASSERT_LOCKED(sc); 664 665 /* hardware reset */ 666 RT_WRITE(sc, GE_PORT_BASE + FE_RST_GLO, PSE_RESET); 667 rt305x_sysctl_set(SYSCTL_RSTCTRL, SYSCTL_RSTCTRL_FRENG); 668 669 /* Fwd to CPU (uni|broad|multi)cast and Unknown */ 670 RT_WRITE(sc, GDMA1_BASE + GDMA_FWD_CFG, 671 ( 672 GDM_ICS_EN | /* Enable IP Csum */ 673 GDM_TCS_EN | /* Enable TCP Csum */ 674 GDM_UCS_EN | /* Enable UDP Csum */ 675 GDM_STRPCRC | /* Strip CRC from packet */ 676 GDM_DST_PORT_CPU << GDM_UFRC_P_SHIFT | /* Forward UCast to CPU */ 677 GDM_DST_PORT_CPU << GDM_BFRC_P_SHIFT | /* Forward BCast to CPU */ 678 GDM_DST_PORT_CPU << GDM_MFRC_P_SHIFT | /* Forward MCast to CPU */ 679 GDM_DST_PORT_CPU << GDM_OFRC_P_SHIFT /* Forward Other to CPU */ 680 )); 681 682 /* disable DMA engine */ 683 RT_WRITE(sc, PDMA_BASE + PDMA_GLO_CFG, 0); 684 RT_WRITE(sc, PDMA_BASE + PDMA_RST_IDX, 0xffffffff); 685 686 /* wait while DMA engine is busy */ 687 for (ntries = 0; ntries < 100; ntries++) { 688 tmp = RT_READ(sc, PDMA_BASE + PDMA_GLO_CFG); 689 if (!(tmp & (FE_TX_DMA_BUSY | FE_RX_DMA_BUSY))) 690 break; 691 DELAY(1000); 692 } 693 694 if (ntries == 100) { 695 device_printf(sc->dev, "timeout waiting for DMA engine\n"); 696 goto fail; 697 } 698 699 /* reset Rx and Tx rings */ 700 tmp = FE_RST_DRX_IDX0 | 701 FE_RST_DTX_IDX3 | 702 FE_RST_DTX_IDX2 | 703 FE_RST_DTX_IDX1 | 704 FE_RST_DTX_IDX0; 705 706 RT_WRITE(sc, PDMA_BASE + PDMA_RST_IDX, tmp); 707 708 /* XXX switch set mac address */ 709 for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++) 710 rt_reset_tx_ring(sc, &sc->tx_ring[i]); 711 712 for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++) { 713 /* update TX_BASE_PTRx */ 714 RT_WRITE(sc, PDMA_BASE + TX_BASE_PTR(i), 715 sc->tx_ring[i].desc_phys_addr); 716 RT_WRITE(sc, PDMA_BASE + TX_MAX_CNT(i), 717 RT_SOFTC_TX_RING_DESC_COUNT); 718 RT_WRITE(sc, PDMA_BASE + TX_CTX_IDX(i), 0); 719 } 720 721 /* init Rx ring */ 722 rt_reset_rx_ring(sc, &sc->rx_ring); 723 724 /* update RX_BASE_PTR0 */ 725 RT_WRITE(sc, PDMA_BASE + RX_BASE_PTR0, 726 sc->rx_ring.desc_phys_addr); 727 RT_WRITE(sc, PDMA_BASE + RX_MAX_CNT0, 728 RT_SOFTC_RX_RING_DATA_COUNT); 729 RT_WRITE(sc, PDMA_BASE + RX_CALC_IDX0, 730 RT_SOFTC_RX_RING_DATA_COUNT - 1); 731 732 /* write back DDONE, 16byte burst enable RX/TX DMA */ 733 RT_WRITE(sc, PDMA_BASE + PDMA_GLO_CFG, 734 FE_TX_WB_DDONE | FE_DMA_BT_SIZE16 | FE_RX_DMA_EN | FE_TX_DMA_EN); 735 736 /* disable interrupts mitigation */ 737 RT_WRITE(sc, PDMA_BASE + DELAY_INT_CFG, 0); 738 739 /* clear pending interrupts */ 740 RT_WRITE(sc, GE_PORT_BASE + FE_INT_STATUS, 0xffffffff); 741 742 /* enable interrupts */ 743 tmp = CNT_PPE_AF | 744 CNT_GDM_AF | 745 PSE_P2_FC | 746 GDM_CRC_DROP | 747 PSE_BUF_DROP | 748 GDM_OTHER_DROP | 749 PSE_P1_FC | 750 PSE_P0_FC | 751 PSE_FQ_EMPTY | 752 INT_TX_COHERENT | 753 INT_RX_COHERENT | 754 INT_TXQ3_DONE | 755 INT_TXQ2_DONE | 756 INT_TXQ1_DONE | 757 INT_TXQ0_DONE | 758 INT_RX_DONE; 759 760 sc->intr_enable_mask = tmp; 761 762 RT_WRITE(sc, GE_PORT_BASE + FE_INT_ENABLE, tmp); 763 764 if (rt_txrx_enable(sc) != 0) 765 goto fail; 766 767#ifdef IF_RT_PHY_SUPPORT 768 if (mii) mii_mediachg(mii); 769#endif /* IF_RT_PHY_SUPPORT */ 770 771 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 772 ifp->if_drv_flags |= IFF_DRV_RUNNING; 773 774 sc->periodic_round = 0; 775 776 callout_reset(&sc->periodic_ch, hz / 10, rt_periodic, sc); 777 778 return; 779 780fail: 781 rt_stop_locked(sc); 782} 783 784/* 785 * rt_init - lock and initialize device. 786 */ 787static void 788rt_init(void *priv) 789{ 790 struct rt_softc *sc; 791 792 sc = priv; 793 RT_SOFTC_LOCK(sc); 794 rt_init_locked(sc); 795 RT_SOFTC_UNLOCK(sc); 796} 797 798/* 799 * rt_stop_locked - stop TX/RX w/ lock 800 */ 801static void 802rt_stop_locked(void *priv) 803{ 804 struct rt_softc *sc; 805 struct ifnet *ifp; 806 807 sc = priv; 808 ifp = sc->ifp; 809 810 RT_DPRINTF(sc, RT_DEBUG_ANY, "stopping\n"); 811 812 RT_SOFTC_ASSERT_LOCKED(sc); 813 sc->tx_timer = 0; 814 ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); 815 callout_stop(&sc->periodic_ch); 816 callout_stop(&sc->tx_watchdog_ch); 817 RT_SOFTC_UNLOCK(sc); 818 taskqueue_block(sc->taskqueue); 819 820 /* 821 * Sometime rt_stop_locked called from isr and we get panic 822 * When found, I fix it 823 */ 824#ifdef notyet 825 taskqueue_drain(sc->taskqueue, &sc->rx_done_task); 826 taskqueue_drain(sc->taskqueue, &sc->tx_done_task); 827 taskqueue_drain(sc->taskqueue, &sc->periodic_task); 828#endif 829 RT_SOFTC_LOCK(sc); 830 831 /* disable interrupts */ 832 RT_WRITE(sc, GE_PORT_BASE + FE_INT_ENABLE, 0); 833 834 /* reset adapter */ 835 RT_WRITE(sc, GE_PORT_BASE + FE_RST_GLO, PSE_RESET); 836 837 RT_WRITE(sc, GDMA1_BASE + GDMA_FWD_CFG, 838 ( 839 GDM_ICS_EN | /* Enable IP Csum */ 840 GDM_TCS_EN | /* Enable TCP Csum */ 841 GDM_UCS_EN | /* Enable UDP Csum */ 842 GDM_STRPCRC | /* Strip CRC from packet */ 843 GDM_DST_PORT_CPU << GDM_UFRC_P_SHIFT | /* Forward UCast to CPU */ 844 GDM_DST_PORT_CPU << GDM_BFRC_P_SHIFT | /* Forward BCast to CPU */ 845 GDM_DST_PORT_CPU << GDM_MFRC_P_SHIFT | /* Forward MCast to CPU */ 846 GDM_DST_PORT_CPU << GDM_OFRC_P_SHIFT /* Forward Other to CPU */ 847 )); 848} 849 850static void 851rt_stop(void *priv) 852{ 853 struct rt_softc *sc; 854 855 sc = priv; 856 RT_SOFTC_LOCK(sc); 857 rt_stop_locked(sc); 858 RT_SOFTC_UNLOCK(sc); 859} 860 861/* 862 * rt_tx_data - transmit packet. 863 */ 864static int 865rt_tx_data(struct rt_softc *sc, struct mbuf *m, int qid) 866{ 867 struct ifnet *ifp; 868 struct rt_softc_tx_ring *ring; 869 struct rt_softc_tx_data *data; 870 struct rt_txdesc *desc; 871 struct mbuf *m_d; 872 bus_dma_segment_t dma_seg[RT_SOFTC_MAX_SCATTER]; 873 int error, ndmasegs, ndescs, i; 874 875 KASSERT(qid >= 0 && qid < RT_SOFTC_TX_RING_COUNT, 876 ("%s: Tx data: invalid qid=%d\n", 877 device_get_nameunit(sc->dev), qid)); 878 879 RT_SOFTC_TX_RING_ASSERT_LOCKED(&sc->tx_ring[qid]); 880 881 ifp = sc->ifp; 882 ring = &sc->tx_ring[qid]; 883 desc = &ring->desc[ring->desc_cur]; 884 data = &ring->data[ring->data_cur]; 885 886 error = bus_dmamap_load_mbuf_sg(ring->data_dma_tag, data->dma_map, m, 887 dma_seg, &ndmasegs, 0); 888 if (error != 0) { 889 /* too many fragments, linearize */ 890 891 RT_DPRINTF(sc, RT_DEBUG_TX, 892 "could not load mbuf DMA map, trying to linearize " 893 "mbuf: ndmasegs=%d, len=%d, error=%d\n", 894 ndmasegs, m->m_pkthdr.len, error); 895 896 m_d = m_collapse(m, M_DONTWAIT, 16); 897 if (m_d == NULL) { 898 m_freem(m); 899 m = NULL; 900 return (ENOMEM); 901 } 902 m = m_d; 903 904 sc->tx_defrag_packets++; 905 906 error = bus_dmamap_load_mbuf_sg(ring->data_dma_tag, 907 data->dma_map, m, dma_seg, &ndmasegs, 0); 908 if (error != 0) { 909 device_printf(sc->dev, "could not load mbuf DMA map: " 910 "ndmasegs=%d, len=%d, error=%d\n", 911 ndmasegs, m->m_pkthdr.len, error); 912 m_freem(m); 913 return (error); 914 } 915 } 916 917 if (m->m_pkthdr.len == 0) 918 ndmasegs = 0; 919 920 /* determine how many Tx descs are required */ 921 ndescs = 1 + ndmasegs / 2; 922 if ((ring->desc_queued + ndescs) > 923 (RT_SOFTC_TX_RING_DESC_COUNT - 2)) { 924 RT_DPRINTF(sc, RT_DEBUG_TX, 925 "there are not enough Tx descs\n"); 926 927 sc->no_tx_desc_avail++; 928 929 bus_dmamap_unload(ring->data_dma_tag, data->dma_map); 930 m_freem(m); 931 return (EFBIG); 932 } 933 934 data->m = m; 935 936 /* set up Tx descs */ 937 for (i = 0; i < ndmasegs; i += 2) { 938 /* Set destenation */ 939 desc->dst = (TXDSCR_DST_PORT_GDMA1); 940 if ((ifp->if_capenable & IFCAP_TXCSUM) != 0) 941 desc->dst |= (TXDSCR_IP_CSUM_GEN|TXDSCR_UDP_CSUM_GEN| 942 TXDSCR_TCP_CSUM_GEN); 943 /* Set queue id */ 944 desc->qn = qid; 945 /* No PPPoE */ 946 desc->pppoe = 0; 947 /* No VLAN */ 948 desc->vid = 0; 949 950 desc->sdp0 = htole32(dma_seg[i].ds_addr); 951 desc->sdl0 = htole16(dma_seg[i].ds_len | 952 ( ((i+1) == ndmasegs )?RT_TXDESC_SDL0_LASTSEG:0 )); 953 954 if ((i+1) < ndmasegs) { 955 desc->sdp1 = htole32(dma_seg[i+1].ds_addr); 956 desc->sdl1 = htole16(dma_seg[i+1].ds_len | 957 ( ((i+2) == ndmasegs )?RT_TXDESC_SDL1_LASTSEG:0 )); 958 } else { 959 desc->sdp1 = 0; 960 desc->sdl1 = 0; 961 } 962 963 if ((i+2) < ndmasegs) { 964 ring->desc_queued++; 965 ring->desc_cur = (ring->desc_cur + 1) % 966 RT_SOFTC_TX_RING_DESC_COUNT; 967 } 968 desc = &ring->desc[ring->desc_cur]; 969 } 970 971 RT_DPRINTF(sc, RT_DEBUG_TX, "sending data: len=%d, ndmasegs=%d, " 972 "DMA ds_len=%d/%d/%d/%d/%d\n", 973 m->m_pkthdr.len, ndmasegs, 974 (int) dma_seg[0].ds_len, 975 (int) dma_seg[1].ds_len, 976 (int) dma_seg[2].ds_len, 977 (int) dma_seg[3].ds_len, 978 (int) dma_seg[4].ds_len); 979 980 bus_dmamap_sync(ring->seg0_dma_tag, ring->seg0_dma_map, 981 BUS_DMASYNC_PREWRITE); 982 bus_dmamap_sync(ring->data_dma_tag, data->dma_map, 983 BUS_DMASYNC_PREWRITE); 984 bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map, 985 BUS_DMASYNC_PREWRITE); 986 987 ring->desc_queued++; 988 ring->desc_cur = (ring->desc_cur + 1) % RT_SOFTC_TX_RING_DESC_COUNT; 989 990 ring->data_queued++; 991 ring->data_cur = (ring->data_cur + 1) % RT_SOFTC_TX_RING_DATA_COUNT; 992 993 /* kick Tx */ 994 RT_WRITE(sc, PDMA_BASE + TX_CTX_IDX(qid), ring->desc_cur); 995 996 return (0); 997} 998 999/* 1000 * rt_start - start Transmit/Receive 1001 */ 1002static void 1003rt_start(struct ifnet *ifp) 1004{ 1005 struct rt_softc *sc; 1006 struct mbuf *m; 1007 int qid = 0 /* XXX must check QoS priority */; 1008 1009 sc = ifp->if_softc; 1010 1011 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) 1012 return; 1013 1014 for (;;) { 1015 IFQ_DRV_DEQUEUE(&ifp->if_snd, m); 1016 if (m == NULL) 1017 break; 1018 1019 m->m_pkthdr.rcvif = NULL; 1020 1021 RT_SOFTC_TX_RING_LOCK(&sc->tx_ring[qid]); 1022 1023 if (sc->tx_ring[qid].data_queued >= 1024 RT_SOFTC_TX_RING_DATA_COUNT) { 1025 RT_SOFTC_TX_RING_UNLOCK(&sc->tx_ring[qid]); 1026 1027 RT_DPRINTF(sc, RT_DEBUG_TX, 1028 "if_start: Tx ring with qid=%d is full\n", qid); 1029 1030 m_freem(m); 1031 1032 ifp->if_drv_flags |= IFF_DRV_OACTIVE; 1033 ifp->if_oerrors++; 1034 1035 sc->tx_data_queue_full[qid]++; 1036 1037 break; 1038 } 1039 1040 if (rt_tx_data(sc, m, qid) != 0) { 1041 RT_SOFTC_TX_RING_UNLOCK(&sc->tx_ring[qid]); 1042 1043 ifp->if_oerrors++; 1044 1045 break; 1046 } 1047 1048 RT_SOFTC_TX_RING_UNLOCK(&sc->tx_ring[qid]); 1049 sc->tx_timer = RT_TX_WATCHDOG_TIMEOUT; 1050 callout_reset(&sc->tx_watchdog_ch, hz, rt_tx_watchdog, sc); 1051 } 1052} 1053 1054/* 1055 * rt_update_promisc - set/clear promiscuous mode. Unused yet, because 1056 * filtering done by attached Ethernet switch. 1057 */ 1058static void 1059rt_update_promisc(struct ifnet *ifp) 1060{ 1061 struct rt_softc *sc; 1062 1063 sc = ifp->if_softc; 1064 printf("%s: %s promiscuous mode\n", 1065 device_get_nameunit(sc->dev), 1066 (ifp->if_flags & IFF_PROMISC) ? "entering" : "leaving"); 1067} 1068 1069/* 1070 * rt_ioctl - ioctl handler. 1071 */ 1072static int 1073rt_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) 1074{ 1075 struct rt_softc *sc; 1076 struct ifreq *ifr; 1077#ifdef IF_RT_PHY_SUPPORT 1078 struct mii_data *mii; 1079#endif /* IF_RT_PHY_SUPPORT */ 1080 int error, startall; 1081 1082 sc = ifp->if_softc; 1083 ifr = (struct ifreq *) data; 1084 1085 error = 0; 1086 1087 switch (cmd) { 1088 case SIOCSIFFLAGS: 1089 startall = 0; 1090 RT_SOFTC_LOCK(sc); 1091 if (ifp->if_flags & IFF_UP) { 1092 if (ifp->if_drv_flags & IFF_DRV_RUNNING) { 1093 if ((ifp->if_flags ^ sc->if_flags) & 1094 IFF_PROMISC) 1095 rt_update_promisc(ifp); 1096 } else { 1097 rt_init_locked(sc); 1098 startall = 1; 1099 } 1100 } else { 1101 if (ifp->if_drv_flags & IFF_DRV_RUNNING) 1102 rt_stop_locked(sc); 1103 } 1104 sc->if_flags = ifp->if_flags; 1105 RT_SOFTC_UNLOCK(sc); 1106 break; 1107 case SIOCGIFMEDIA: 1108 case SIOCSIFMEDIA: 1109#ifdef IF_RT_PHY_SUPPORT 1110 mii = device_get_softc(sc->rt_miibus); 1111 error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, cmd); 1112#else 1113 error = ifmedia_ioctl(ifp, ifr, &sc->rt_ifmedia, cmd); 1114#endif /* IF_RT_PHY_SUPPORT */ 1115 break; 1116 default: 1117 error = ether_ioctl(ifp, cmd, data); 1118 break; 1119 } 1120 return (error); 1121} 1122 1123/* 1124 * rt_periodic - Handler of PERIODIC interrupt 1125 */ 1126static void 1127rt_periodic(void *arg) 1128{ 1129 struct rt_softc *sc; 1130 1131 sc = arg; 1132 RT_DPRINTF(sc, RT_DEBUG_PERIODIC, "periodic\n"); 1133 taskqueue_enqueue(sc->taskqueue, &sc->periodic_task); 1134} 1135 1136/* 1137 * rt_tx_watchdog - Handler of TX Watchdog 1138 */ 1139static void 1140rt_tx_watchdog(void *arg) 1141{ 1142 struct rt_softc *sc; 1143 struct ifnet *ifp; 1144 1145 sc = arg; 1146 ifp = sc->ifp; 1147 1148 if (sc->tx_timer == 0) 1149 return; 1150 1151 if (--sc->tx_timer == 0) { 1152 device_printf(sc->dev, "Tx watchdog timeout: resetting\n"); 1153#ifdef notyet 1154 /* 1155 * XXX: Commented out, because reset break input. 1156 */ 1157 rt_stop_locked(sc); 1158 rt_init_locked(sc); 1159#endif 1160 ifp->if_oerrors++; 1161 sc->tx_watchdog_timeouts++; 1162 } 1163 callout_reset(&sc->tx_watchdog_ch, hz, rt_tx_watchdog, sc); 1164} 1165 1166/* 1167 * rt_cnt_ppe_af - Handler of PPE Counter Table Almost Full interrupt 1168 */ 1169static void 1170rt_cnt_ppe_af(struct rt_softc *sc) 1171{ 1172 1173 RT_DPRINTF(sc, RT_DEBUG_INTR, "PPE Counter Table Almost Full\n"); 1174} 1175 1176/* 1177 * rt_cnt_gdm_af - Handler of GDMA 1 & 2 Counter Table Almost Full interrupt 1178 */ 1179static void 1180rt_cnt_gdm_af(struct rt_softc *sc) 1181{ 1182 1183 RT_DPRINTF(sc, RT_DEBUG_INTR, 1184 "GDMA 1 & 2 Counter Table Almost Full\n"); 1185} 1186 1187/* 1188 * rt_pse_p2_fc - Handler of PSE port2 (GDMA 2) flow control interrupt 1189 */ 1190static void 1191rt_pse_p2_fc(struct rt_softc *sc) 1192{ 1193 1194 RT_DPRINTF(sc, RT_DEBUG_INTR, 1195 "PSE port2 (GDMA 2) flow control asserted.\n"); 1196} 1197 1198/* 1199 * rt_gdm_crc_drop - Handler of GDMA 1/2 discard a packet due to CRC error 1200 * interrupt 1201 */ 1202static void 1203rt_gdm_crc_drop(struct rt_softc *sc) 1204{ 1205 1206 RT_DPRINTF(sc, RT_DEBUG_INTR, 1207 "GDMA 1 & 2 discard a packet due to CRC error\n"); 1208} 1209 1210/* 1211 * rt_pse_buf_drop - Handler of buffer sharing limitation interrupt 1212 */ 1213static void 1214rt_pse_buf_drop(struct rt_softc *sc) 1215{ 1216 1217 RT_DPRINTF(sc, RT_DEBUG_INTR, 1218 "PSE discards a packet due to buffer sharing limitation\n"); 1219} 1220 1221/* 1222 * rt_gdm_other_drop - Handler of discard on other reason interrupt 1223 */ 1224static void 1225rt_gdm_other_drop(struct rt_softc *sc) 1226{ 1227 1228 RT_DPRINTF(sc, RT_DEBUG_INTR, 1229 "GDMA 1 & 2 discard a packet due to other reason\n"); 1230} 1231 1232/* 1233 * rt_pse_p1_fc - Handler of PSE port1 (GDMA 1) flow control interrupt 1234 */ 1235static void 1236rt_pse_p1_fc(struct rt_softc *sc) 1237{ 1238 1239 RT_DPRINTF(sc, RT_DEBUG_INTR, 1240 "PSE port1 (GDMA 1) flow control asserted.\n"); 1241} 1242 1243/* 1244 * rt_pse_p0_fc - Handler of PSE port0 (CDMA) flow control interrupt 1245 */ 1246static void 1247rt_pse_p0_fc(struct rt_softc *sc) 1248{ 1249 1250 RT_DPRINTF(sc, RT_DEBUG_INTR, 1251 "PSE port0 (CDMA) flow control asserted.\n"); 1252} 1253 1254/* 1255 * rt_pse_fq_empty - Handler of PSE free Q empty threshold reached interrupt 1256 */ 1257static void 1258rt_pse_fq_empty(struct rt_softc *sc) 1259{ 1260 1261 RT_DPRINTF(sc, RT_DEBUG_INTR, 1262 "PSE free Q empty threshold reached & forced drop " 1263 "condition occurred.\n"); 1264} 1265 1266/* 1267 * rt_intr - main ISR 1268 */ 1269static void 1270rt_intr(void *arg) 1271{ 1272 struct rt_softc *sc; 1273 struct ifnet *ifp; 1274 uint32_t status; 1275 1276 sc = arg; 1277 ifp = sc->ifp; 1278 1279 /* acknowledge interrupts */ 1280 status = RT_READ(sc, GE_PORT_BASE + FE_INT_STATUS); 1281 RT_WRITE(sc, GE_PORT_BASE + FE_INT_STATUS, status); 1282 1283 RT_DPRINTF(sc, RT_DEBUG_INTR, "interrupt: status=0x%08x\n", status); 1284 1285 if (status == 0xffffffff || /* device likely went away */ 1286 status == 0) /* not for us */ 1287 return; 1288 1289 sc->interrupts++; 1290 1291 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) 1292 return; 1293 1294 if (status & CNT_PPE_AF) 1295 rt_cnt_ppe_af(sc); 1296 1297 if (status & CNT_GDM_AF) 1298 rt_cnt_gdm_af(sc); 1299 1300 if (status & PSE_P2_FC) 1301 rt_pse_p2_fc(sc); 1302 1303 if (status & GDM_CRC_DROP) 1304 rt_gdm_crc_drop(sc); 1305 1306 if (status & PSE_BUF_DROP) 1307 rt_pse_buf_drop(sc); 1308 1309 if (status & GDM_OTHER_DROP) 1310 rt_gdm_other_drop(sc); 1311 1312 if (status & PSE_P1_FC) 1313 rt_pse_p1_fc(sc); 1314 1315 if (status & PSE_P0_FC) 1316 rt_pse_p0_fc(sc); 1317 1318 if (status & PSE_FQ_EMPTY) 1319 rt_pse_fq_empty(sc); 1320 1321 if (status & INT_TX_COHERENT) 1322 rt_tx_coherent_intr(sc); 1323 1324 if (status & INT_RX_COHERENT) 1325 rt_rx_coherent_intr(sc); 1326 1327 if (status & RX_DLY_INT) 1328 rt_rx_delay_intr(sc); 1329 1330 if (status & TX_DLY_INT) 1331 rt_tx_delay_intr(sc); 1332 1333 if (status & INT_RX_DONE) 1334 rt_rx_intr(sc); 1335 1336 if (status & INT_TXQ3_DONE) 1337 rt_tx_intr(sc, 3); 1338 1339 if (status & INT_TXQ2_DONE) 1340 rt_tx_intr(sc, 2); 1341 1342 if (status & INT_TXQ1_DONE) 1343 rt_tx_intr(sc, 1); 1344 1345 if (status & INT_TXQ0_DONE) 1346 rt_tx_intr(sc, 0); 1347} 1348 1349static void 1350rt_tx_coherent_intr(struct rt_softc *sc) 1351{ 1352 uint32_t tmp; 1353 int i; 1354 1355 RT_DPRINTF(sc, RT_DEBUG_INTR, "Tx coherent interrupt\n"); 1356 1357 sc->tx_coherent_interrupts++; 1358 1359 /* restart DMA engine */ 1360 tmp = RT_READ(sc, PDMA_BASE + PDMA_GLO_CFG); 1361 tmp &= ~(FE_TX_WB_DDONE | FE_TX_DMA_EN); 1362 RT_WRITE(sc, PDMA_BASE + PDMA_GLO_CFG, tmp); 1363 1364 for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++) 1365 rt_reset_tx_ring(sc, &sc->tx_ring[i]); 1366 1367 for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++) { 1368 RT_WRITE(sc, PDMA_BASE + TX_BASE_PTR(i), 1369 sc->tx_ring[i].desc_phys_addr); 1370 RT_WRITE(sc, PDMA_BASE + TX_MAX_CNT(i), 1371 RT_SOFTC_TX_RING_DESC_COUNT); 1372 RT_WRITE(sc, PDMA_BASE + TX_CTX_IDX(i), 0); 1373 } 1374 1375 rt_txrx_enable(sc); 1376} 1377 1378/* 1379 * rt_rx_coherent_intr 1380 */ 1381static void 1382rt_rx_coherent_intr(struct rt_softc *sc) 1383{ 1384 uint32_t tmp; 1385 1386 RT_DPRINTF(sc, RT_DEBUG_INTR, "Rx coherent interrupt\n"); 1387 1388 sc->rx_coherent_interrupts++; 1389 1390 /* restart DMA engine */ 1391 tmp = RT_READ(sc, PDMA_BASE + PDMA_GLO_CFG); 1392 tmp &= ~(FE_RX_DMA_EN); 1393 RT_WRITE(sc, PDMA_BASE + PDMA_GLO_CFG, tmp); 1394 1395 /* init Rx ring */ 1396 rt_reset_rx_ring(sc, &sc->rx_ring); 1397 RT_WRITE(sc, PDMA_BASE + RX_BASE_PTR0, 1398 sc->rx_ring.desc_phys_addr); 1399 RT_WRITE(sc, PDMA_BASE + RX_MAX_CNT0, 1400 RT_SOFTC_RX_RING_DATA_COUNT); 1401 RT_WRITE(sc, PDMA_BASE + RX_CALC_IDX0, 1402 RT_SOFTC_RX_RING_DATA_COUNT - 1); 1403 1404 rt_txrx_enable(sc); 1405} 1406 1407/* 1408 * rt_rx_intr - a packet received 1409 */ 1410static void 1411rt_rx_intr(struct rt_softc *sc) 1412{ 1413 1414 RT_DPRINTF(sc, RT_DEBUG_INTR, "Rx interrupt\n"); 1415 sc->rx_interrupts++; 1416 RT_SOFTC_LOCK(sc); 1417 1418 if (!(sc->intr_disable_mask & INT_RX_DONE)) { 1419 rt_intr_disable(sc, INT_RX_DONE); 1420 taskqueue_enqueue(sc->taskqueue, &sc->rx_done_task); 1421 } 1422 1423 sc->intr_pending_mask |= INT_RX_DONE; 1424 RT_SOFTC_UNLOCK(sc); 1425} 1426 1427static void 1428rt_rx_delay_intr(struct rt_softc *sc) 1429{ 1430 1431 RT_DPRINTF(sc, RT_DEBUG_INTR, "Rx delay interrupt\n"); 1432 sc->rx_delay_interrupts++; 1433} 1434 1435static void 1436rt_tx_delay_intr(struct rt_softc *sc) 1437{ 1438 1439 RT_DPRINTF(sc, RT_DEBUG_INTR, "Tx delay interrupt\n"); 1440 sc->tx_delay_interrupts++; 1441} 1442 1443/* 1444 * rt_tx_intr - Transsmition of packet done 1445 */ 1446static void 1447rt_tx_intr(struct rt_softc *sc, int qid) 1448{ 1449 1450 KASSERT(qid >= 0 && qid < RT_SOFTC_TX_RING_COUNT, 1451 ("%s: Tx interrupt: invalid qid=%d\n", 1452 device_get_nameunit(sc->dev), qid)); 1453 1454 RT_DPRINTF(sc, RT_DEBUG_INTR, "Tx interrupt: qid=%d\n", qid); 1455 1456 sc->tx_interrupts[qid]++; 1457 RT_SOFTC_LOCK(sc); 1458 1459 if (!(sc->intr_disable_mask & (INT_TXQ0_DONE << qid))) { 1460 rt_intr_disable(sc, (INT_TXQ0_DONE << qid)); 1461 taskqueue_enqueue(sc->taskqueue, &sc->tx_done_task); 1462 } 1463 1464 sc->intr_pending_mask |= (INT_TXQ0_DONE << qid); 1465 RT_SOFTC_UNLOCK(sc); 1466} 1467 1468/* 1469 * rt_rx_done_task - run RX task 1470 */ 1471static void 1472rt_rx_done_task(void *context, int pending) 1473{ 1474 struct rt_softc *sc; 1475 struct ifnet *ifp; 1476 int again; 1477 1478 sc = context; 1479 ifp = sc->ifp; 1480 1481 RT_DPRINTF(sc, RT_DEBUG_RX, "Rx done task\n"); 1482 1483 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) 1484 return; 1485 1486 sc->intr_pending_mask &= ~INT_RX_DONE; 1487 1488 again = rt_rx_eof(sc, sc->rx_process_limit); 1489 1490 RT_SOFTC_LOCK(sc); 1491 1492 if ((sc->intr_pending_mask & INT_RX_DONE) || again) { 1493 RT_DPRINTF(sc, RT_DEBUG_RX, 1494 "Rx done task: scheduling again\n"); 1495 taskqueue_enqueue(sc->taskqueue, &sc->rx_done_task); 1496 } else { 1497 rt_intr_enable(sc, INT_RX_DONE); 1498 } 1499 1500 RT_SOFTC_UNLOCK(sc); 1501} 1502 1503/* 1504 * rt_tx_done_task - check for pending TX task in all queues 1505 */ 1506static void 1507rt_tx_done_task(void *context, int pending) 1508{ 1509 struct rt_softc *sc; 1510 struct ifnet *ifp; 1511 uint32_t intr_mask; 1512 int i; 1513 1514 sc = context; 1515 ifp = sc->ifp; 1516 1517 RT_DPRINTF(sc, RT_DEBUG_TX, "Tx done task\n"); 1518 1519 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) 1520 return; 1521 1522 for (i = RT_SOFTC_TX_RING_COUNT - 1; i >= 0; i--) { 1523 if (sc->intr_pending_mask & (INT_TXQ0_DONE << i)) { 1524 sc->intr_pending_mask &= ~(INT_TXQ0_DONE << i); 1525 rt_tx_eof(sc, &sc->tx_ring[i]); 1526 } 1527 } 1528 1529 sc->tx_timer = 0; 1530 1531 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 1532 1533 intr_mask = ( 1534 INT_TXQ3_DONE | 1535 INT_TXQ2_DONE | 1536 INT_TXQ1_DONE | 1537 INT_TXQ0_DONE); 1538 1539 RT_SOFTC_LOCK(sc); 1540 1541 rt_intr_enable(sc, ~sc->intr_pending_mask & 1542 (sc->intr_disable_mask & intr_mask)); 1543 1544 if (sc->intr_pending_mask & intr_mask) { 1545 RT_DPRINTF(sc, RT_DEBUG_TX, 1546 "Tx done task: scheduling again\n"); 1547 taskqueue_enqueue(sc->taskqueue, &sc->tx_done_task); 1548 } 1549 1550 RT_SOFTC_UNLOCK(sc); 1551 1552 if (!IFQ_IS_EMPTY(&ifp->if_snd)) 1553 rt_start(ifp); 1554} 1555 1556/* 1557 * rt_periodic_task - run periodic task 1558 */ 1559static void 1560rt_periodic_task(void *context, int pending) 1561{ 1562 struct rt_softc *sc; 1563 struct ifnet *ifp; 1564 1565 sc = context; 1566 ifp = sc->ifp; 1567 1568 RT_DPRINTF(sc, RT_DEBUG_PERIODIC, "periodic task: round=%lu\n", 1569 sc->periodic_round); 1570 1571 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) 1572 return; 1573 1574 RT_SOFTC_LOCK(sc); 1575 sc->periodic_round++; 1576 rt_update_stats(sc); 1577 1578 if ((sc->periodic_round % 10) == 0) { 1579 rt_update_raw_counters(sc); 1580 rt_watchdog(sc); 1581 } 1582 1583 RT_SOFTC_UNLOCK(sc); 1584 callout_reset(&sc->periodic_ch, hz / 10, rt_periodic, sc); 1585} 1586 1587/* 1588 * rt_rx_eof - check for frames that done by DMA engine and pass it into 1589 * network subsystem. 1590 */ 1591static int 1592rt_rx_eof(struct rt_softc *sc, int limit) 1593{ 1594 struct ifnet *ifp; 1595 struct rt_softc_rx_ring *ring; 1596 struct rt_rxdesc *desc; 1597 struct rt_softc_rx_data *data; 1598 struct mbuf *m, *mnew; 1599 bus_dma_segment_t segs[1]; 1600 bus_dmamap_t dma_map; 1601 uint32_t index, desc_flags; 1602 int error, nsegs, len, nframes; 1603 1604 ifp = sc->ifp; 1605 ring = &sc->rx_ring; 1606 1607 nframes = 0; 1608 1609 while (limit != 0) { 1610 index = RT_READ(sc, PDMA_BASE + RX_DRX_IDX0); 1611 if (ring->cur == index) 1612 break; 1613 1614 desc = &ring->desc[ring->cur]; 1615 data = &ring->data[ring->cur]; 1616 1617 bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map, 1618 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); 1619 1620#ifdef IF_RT_DEBUG 1621 if ( sc->debug & RT_DEBUG_RX ) { 1622 printf("\nRX Descriptor[%#08x] dump:\n", (u_int)desc); 1623 hexdump(desc, 16, 0, 0); 1624 printf("-----------------------------------\n"); 1625 } 1626#endif 1627 1628 /* XXX Sometime device don`t set DDONE bit */ 1629#ifdef DDONE_FIXED 1630 if (!(desc->sdl0 & htole16(RT_RXDESC_SDL0_DDONE))) { 1631 RT_DPRINTF(sc, RT_DEBUG_RX, "DDONE=0, try next\n"); 1632 break; 1633 } 1634#endif 1635 1636 len = le16toh(desc->sdl0) & 0x3fff; 1637 RT_DPRINTF(sc, RT_DEBUG_RX, "new frame len=%d\n", len); 1638 1639 nframes++; 1640 1641 mnew = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, 1642 MJUMPAGESIZE); 1643 if (mnew == NULL) { 1644 sc->rx_mbuf_alloc_errors++; 1645 ifp->if_ierrors++; 1646 goto skip; 1647 } 1648 1649 mnew->m_len = mnew->m_pkthdr.len = MJUMPAGESIZE; 1650 1651 error = bus_dmamap_load_mbuf_sg(ring->data_dma_tag, 1652 ring->spare_dma_map, mnew, segs, &nsegs, BUS_DMA_NOWAIT); 1653 if (error != 0) { 1654 RT_DPRINTF(sc, RT_DEBUG_RX, 1655 "could not load Rx mbuf DMA map: " 1656 "error=%d, nsegs=%d\n", 1657 error, nsegs); 1658 1659 m_freem(mnew); 1660 1661 sc->rx_mbuf_dmamap_errors++; 1662 ifp->if_ierrors++; 1663 1664 goto skip; 1665 } 1666 1667 KASSERT(nsegs == 1, ("%s: too many DMA segments", 1668 device_get_nameunit(sc->dev))); 1669 1670 bus_dmamap_sync(ring->data_dma_tag, data->dma_map, 1671 BUS_DMASYNC_POSTREAD); 1672 bus_dmamap_unload(ring->data_dma_tag, data->dma_map); 1673 1674 dma_map = data->dma_map; 1675 data->dma_map = ring->spare_dma_map; 1676 ring->spare_dma_map = dma_map; 1677 1678 bus_dmamap_sync(ring->data_dma_tag, data->dma_map, 1679 BUS_DMASYNC_PREREAD); 1680 1681 m = data->m; 1682 desc_flags = desc->src; 1683 1684 data->m = mnew; 1685 /* Add 2 for proper align of RX IP header */ 1686 desc->sdp0 = htole32(segs[0].ds_addr+2); 1687 desc->sdl0 = htole32(segs[0].ds_len-2); 1688 desc->src = 0; 1689 desc->ai = 0; 1690 desc->foe = 0; 1691 1692 RT_DPRINTF(sc, RT_DEBUG_RX, 1693 "Rx frame: rxdesc flags=0x%08x\n", desc_flags); 1694 1695 m->m_pkthdr.rcvif = ifp; 1696 /* Add 2 to fix data align, after sdp0 = addr + 2 */ 1697 m->m_data += 2; 1698 m->m_pkthdr.len = m->m_len = len; 1699 1700 /* check for crc errors */ 1701 if ((ifp->if_capenable & IFCAP_RXCSUM) != 0) { 1702 /*check for valid checksum*/ 1703 if (desc_flags & (RXDSXR_SRC_IP_CSUM_FAIL| 1704 RXDSXR_SRC_L4_CSUM_FAIL)) { 1705 RT_DPRINTF(sc, RT_DEBUG_RX, 1706 "rxdesc: crc error\n"); 1707 1708 ifp->if_ierrors++; 1709 1710 if (!(ifp->if_flags & IFF_PROMISC)) { 1711 m_freem(m); 1712 goto skip; 1713 } 1714 } 1715 if ((desc_flags & RXDSXR_SRC_IP_CSUM_FAIL) != 0) { 1716 m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED; 1717 m->m_pkthdr.csum_flags |= CSUM_IP_VALID; 1718 m->m_pkthdr.csum_data = 0xffff; 1719 } 1720 m->m_flags &= ~M_HASFCS; 1721 } 1722 1723 (*ifp->if_input)(ifp, m); 1724skip: 1725 desc->sdl0 &= ~htole16(RT_RXDESC_SDL0_DDONE); 1726 1727 bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map, 1728 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 1729 1730 ring->cur = (ring->cur + 1) % RT_SOFTC_RX_RING_DATA_COUNT; 1731 1732 limit--; 1733 } 1734 1735 if (ring->cur == 0) 1736 RT_WRITE(sc, PDMA_BASE + RX_CALC_IDX0, 1737 RT_SOFTC_RX_RING_DATA_COUNT - 1); 1738 else 1739 RT_WRITE(sc, PDMA_BASE + RX_CALC_IDX0, 1740 ring->cur - 1); 1741 1742 RT_DPRINTF(sc, RT_DEBUG_RX, "Rx eof: nframes=%d\n", nframes); 1743 1744 sc->rx_packets += nframes; 1745 1746 return (limit == 0); 1747} 1748 1749/* 1750 * rt_tx_eof - check for successful transmitted frames and mark their 1751 * descriptor as free. 1752 */ 1753static void 1754rt_tx_eof(struct rt_softc *sc, struct rt_softc_tx_ring *ring) 1755{ 1756 struct ifnet *ifp; 1757 struct rt_txdesc *desc; 1758 struct rt_softc_tx_data *data; 1759 uint32_t index; 1760 int ndescs, nframes; 1761 1762 ifp = sc->ifp; 1763 1764 ndescs = 0; 1765 nframes = 0; 1766 1767 for (;;) { 1768 index = RT_READ(sc, PDMA_BASE + TX_DTX_IDX(ring->qid)); 1769 if (ring->desc_next == index) 1770 break; 1771 1772 ndescs++; 1773 1774 desc = &ring->desc[ring->desc_next]; 1775 1776 bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map, 1777 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); 1778 1779 if (desc->sdl0 & htole16(RT_TXDESC_SDL0_LASTSEG) || 1780 desc->sdl1 & htole16(RT_TXDESC_SDL1_LASTSEG)) { 1781 nframes++; 1782 1783 data = &ring->data[ring->data_next]; 1784 1785 bus_dmamap_sync(ring->data_dma_tag, data->dma_map, 1786 BUS_DMASYNC_POSTWRITE); 1787 bus_dmamap_unload(ring->data_dma_tag, data->dma_map); 1788 1789 m_freem(data->m); 1790 1791 data->m = NULL; 1792 1793 ifp->if_opackets++; 1794 1795 RT_SOFTC_TX_RING_LOCK(ring); 1796 ring->data_queued--; 1797 ring->data_next = (ring->data_next + 1) % 1798 RT_SOFTC_TX_RING_DATA_COUNT; 1799 RT_SOFTC_TX_RING_UNLOCK(ring); 1800 } 1801 1802 desc->sdl0 &= ~htole16(RT_TXDESC_SDL0_DDONE); 1803 1804 bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map, 1805 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 1806 1807 RT_SOFTC_TX_RING_LOCK(ring); 1808 ring->desc_queued--; 1809 ring->desc_next = (ring->desc_next + 1) % 1810 RT_SOFTC_TX_RING_DESC_COUNT; 1811 RT_SOFTC_TX_RING_UNLOCK(ring); 1812 } 1813 1814 RT_DPRINTF(sc, RT_DEBUG_TX, 1815 "Tx eof: qid=%d, ndescs=%d, nframes=%d\n", ring->qid, ndescs, 1816 nframes); 1817} 1818 1819/* 1820 * rt_update_stats - query statistics counters and update related variables. 1821 */ 1822static void 1823rt_update_stats(struct rt_softc *sc) 1824{ 1825 struct ifnet *ifp; 1826 1827 ifp = sc->ifp; 1828 RT_DPRINTF(sc, RT_DEBUG_STATS, "update statistic: \n"); 1829 /* XXX do update stats here */ 1830} 1831 1832/* 1833 * rt_watchdog - reinit device on watchdog event. 1834 */ 1835static void 1836rt_watchdog(struct rt_softc *sc) 1837{ 1838 uint32_t tmp; 1839#ifdef notyet 1840 int ntries; 1841#endif 1842 1843 tmp = RT_READ(sc, PSE_BASE + CDMA_OQ_STA); 1844 1845 RT_DPRINTF(sc, RT_DEBUG_WATCHDOG, "watchdog: PSE_IQ_STA=0x%08x\n", 1846 tmp); 1847 1848 /* XXX: do not reset */ 1849#ifdef notyet 1850 if (((tmp >> P0_IQ_PCNT_SHIFT) & 0xff) != 0) { 1851 sc->tx_queue_not_empty[0]++; 1852 1853 for (ntries = 0; ntries < 10; ntries++) { 1854 tmp = RT_READ(sc, PSE_BASE + PSE_IQ_STA); 1855 if (((tmp >> P0_IQ_PCNT_SHIFT) & 0xff) == 0) 1856 break; 1857 1858 DELAY(1); 1859 } 1860 } 1861 1862 if (((tmp >> P1_IQ_PCNT_SHIFT) & 0xff) != 0) { 1863 sc->tx_queue_not_empty[1]++; 1864 1865 for (ntries = 0; ntries < 10; ntries++) { 1866 tmp = RT_READ(sc, PSE_BASE + PSE_IQ_STA); 1867 if (((tmp >> P1_IQ_PCNT_SHIFT) & 0xff) == 0) 1868 break; 1869 1870 DELAY(1); 1871 } 1872 } 1873#endif 1874} 1875 1876/* 1877 * rt_update_raw_counters - update counters. 1878 */ 1879static void 1880rt_update_raw_counters(struct rt_softc *sc) 1881{ 1882 1883 sc->tx_bytes += RT_READ(sc, CNTR_BASE + GDMA_TX_GBCNT0); 1884 sc->tx_packets += RT_READ(sc, CNTR_BASE + GDMA_TX_GPCNT0); 1885 sc->tx_skip += RT_READ(sc, CNTR_BASE + GDMA_TX_SKIPCNT0); 1886 sc->tx_collision+= RT_READ(sc, CNTR_BASE + GDMA_TX_COLCNT0); 1887 1888 sc->rx_bytes += RT_READ(sc, CNTR_BASE + GDMA_RX_GBCNT0); 1889 sc->rx_packets += RT_READ(sc, CNTR_BASE + GDMA_RX_GPCNT0); 1890 sc->rx_crc_err += RT_READ(sc, CNTR_BASE + GDMA_RX_CSUM_ERCNT0); 1891 sc->rx_short_err+= RT_READ(sc, CNTR_BASE + GDMA_RX_SHORT_ERCNT0); 1892 sc->rx_long_err += RT_READ(sc, CNTR_BASE + GDMA_RX_LONG_ERCNT0); 1893 sc->rx_phy_err += RT_READ(sc, CNTR_BASE + GDMA_RX_FERCNT0); 1894 sc->rx_fifo_overflows+= RT_READ(sc, CNTR_BASE + GDMA_RX_OERCNT0); 1895} 1896 1897static void 1898rt_intr_enable(struct rt_softc *sc, uint32_t intr_mask) 1899{ 1900 uint32_t tmp; 1901 1902 sc->intr_disable_mask &= ~intr_mask; 1903 tmp = sc->intr_enable_mask & ~sc->intr_disable_mask; 1904 RT_WRITE(sc, GE_PORT_BASE + FE_INT_ENABLE, tmp); 1905} 1906 1907static void 1908rt_intr_disable(struct rt_softc *sc, uint32_t intr_mask) 1909{ 1910 uint32_t tmp; 1911 1912 sc->intr_disable_mask |= intr_mask; 1913 tmp = sc->intr_enable_mask & ~sc->intr_disable_mask; 1914 RT_WRITE(sc, GE_PORT_BASE + FE_INT_ENABLE, tmp); 1915} 1916 1917/* 1918 * rt_txrx_enable - enable TX/RX DMA 1919 */ 1920static int 1921rt_txrx_enable(struct rt_softc *sc) 1922{ 1923 struct ifnet *ifp; 1924 uint32_t tmp; 1925 int ntries; 1926 1927 ifp = sc->ifp; 1928 1929 /* enable Tx/Rx DMA engine */ 1930 for (ntries = 0; ntries < 200; ntries++) { 1931 tmp = RT_READ(sc, PDMA_BASE + PDMA_GLO_CFG); 1932 if (!(tmp & (FE_TX_DMA_BUSY | FE_RX_DMA_BUSY))) 1933 break; 1934 1935 DELAY(1000); 1936 } 1937 1938 if (ntries == 200) { 1939 device_printf(sc->dev, "timeout waiting for DMA engine\n"); 1940 return (-1); 1941 } 1942 1943 DELAY(50); 1944 1945 tmp |= FE_TX_WB_DDONE | FE_RX_DMA_EN | FE_TX_DMA_EN; 1946 RT_WRITE(sc, PDMA_BASE + PDMA_GLO_CFG, tmp); 1947 1948 /* XXX set Rx filter */ 1949 return (0); 1950} 1951 1952/* 1953 * rt_alloc_rx_ring - allocate RX DMA ring buffer 1954 */ 1955static int 1956rt_alloc_rx_ring(struct rt_softc *sc, struct rt_softc_rx_ring *ring) 1957{ 1958 struct rt_rxdesc *desc; 1959 struct rt_softc_rx_data *data; 1960 bus_dma_segment_t segs[1]; 1961 int i, nsegs, error; 1962 1963 error = bus_dma_tag_create(bus_get_dma_tag(sc->dev), PAGE_SIZE, 0, 1964 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, 1965 RT_SOFTC_RX_RING_DATA_COUNT * sizeof(struct rt_rxdesc), 1, 1966 RT_SOFTC_RX_RING_DATA_COUNT * sizeof(struct rt_rxdesc), 1967 0, NULL, NULL, &ring->desc_dma_tag); 1968 if (error != 0) { 1969 device_printf(sc->dev, 1970 "could not create Rx desc DMA tag\n"); 1971 goto fail; 1972 } 1973 1974 error = bus_dmamem_alloc(ring->desc_dma_tag, (void **) &ring->desc, 1975 BUS_DMA_NOWAIT | BUS_DMA_ZERO, &ring->desc_dma_map); 1976 if (error != 0) { 1977 device_printf(sc->dev, 1978 "could not allocate Rx desc DMA memory\n"); 1979 goto fail; 1980 } 1981 1982 error = bus_dmamap_load(ring->desc_dma_tag, ring->desc_dma_map, 1983 ring->desc, 1984 RT_SOFTC_RX_RING_DATA_COUNT * sizeof(struct rt_rxdesc), 1985 rt_dma_map_addr, &ring->desc_phys_addr, 0); 1986 if (error != 0) { 1987 device_printf(sc->dev, "could not load Rx desc DMA map\n"); 1988 goto fail; 1989 } 1990 1991 error = bus_dma_tag_create(bus_get_dma_tag(sc->dev), PAGE_SIZE, 0, 1992 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, 1993 MJUMPAGESIZE, 1, MJUMPAGESIZE, 0, NULL, NULL, 1994 &ring->data_dma_tag); 1995 if (error != 0) { 1996 device_printf(sc->dev, 1997 "could not create Rx data DMA tag\n"); 1998 goto fail; 1999 } 2000 2001 for (i = 0; i < RT_SOFTC_RX_RING_DATA_COUNT; i++) { 2002 desc = &ring->desc[i]; 2003 data = &ring->data[i]; 2004 2005 error = bus_dmamap_create(ring->data_dma_tag, 0, 2006 &data->dma_map); 2007 if (error != 0) { 2008 device_printf(sc->dev, "could not create Rx data DMA " 2009 "map\n"); 2010 goto fail; 2011 } 2012 2013 data->m = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, 2014 MJUMPAGESIZE); 2015 if (data->m == NULL) { 2016 device_printf(sc->dev, "could not allocate Rx mbuf\n"); 2017 error = ENOMEM; 2018 goto fail; 2019 } 2020 2021 data->m->m_len = data->m->m_pkthdr.len = MJUMPAGESIZE; 2022 2023 error = bus_dmamap_load_mbuf_sg(ring->data_dma_tag, 2024 data->dma_map, data->m, segs, &nsegs, BUS_DMA_NOWAIT); 2025 if (error != 0) { 2026 device_printf(sc->dev, 2027 "could not load Rx mbuf DMA map\n"); 2028 goto fail; 2029 } 2030 2031 KASSERT(nsegs == 1, ("%s: too many DMA segments", 2032 device_get_nameunit(sc->dev))); 2033 2034 /* Add 2 for proper align of RX IP header */ 2035 desc->sdp0 = htole32(segs[0].ds_addr+2); 2036 desc->sdl0 = htole32(segs[0].ds_len-2); 2037 } 2038 2039 error = bus_dmamap_create(ring->data_dma_tag, 0, 2040 &ring->spare_dma_map); 2041 if (error != 0) { 2042 device_printf(sc->dev, 2043 "could not create Rx spare DMA map\n"); 2044 goto fail; 2045 } 2046 2047 bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map, 2048 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 2049 return (0); 2050 2051fail: 2052 rt_free_rx_ring(sc, ring); 2053 return (error); 2054} 2055 2056/* 2057 * rt_reset_rx_ring - reset RX ring buffer 2058 */ 2059static void 2060rt_reset_rx_ring(struct rt_softc *sc, struct rt_softc_rx_ring *ring) 2061{ 2062 struct rt_rxdesc *desc; 2063 int i; 2064 2065 for (i = 0; i < RT_SOFTC_RX_RING_DATA_COUNT; i++) { 2066 desc = &ring->desc[i]; 2067 desc->sdl0 &= ~htole16(RT_RXDESC_SDL0_DDONE); 2068 } 2069 2070 bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map, 2071 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 2072 ring->cur = 0; 2073} 2074 2075/* 2076 * rt_free_rx_ring - free memory used by RX ring buffer 2077 */ 2078static void 2079rt_free_rx_ring(struct rt_softc *sc, struct rt_softc_rx_ring *ring) 2080{ 2081 struct rt_softc_rx_data *data; 2082 int i; 2083 2084 if (ring->desc != NULL) { 2085 bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map, 2086 BUS_DMASYNC_POSTWRITE); 2087 bus_dmamap_unload(ring->desc_dma_tag, ring->desc_dma_map); 2088 bus_dmamem_free(ring->desc_dma_tag, ring->desc, 2089 ring->desc_dma_map); 2090 } 2091 2092 if (ring->desc_dma_tag != NULL) 2093 bus_dma_tag_destroy(ring->desc_dma_tag); 2094 2095 for (i = 0; i < RT_SOFTC_RX_RING_DATA_COUNT; i++) { 2096 data = &ring->data[i]; 2097 2098 if (data->m != NULL) { 2099 bus_dmamap_sync(ring->data_dma_tag, data->dma_map, 2100 BUS_DMASYNC_POSTREAD); 2101 bus_dmamap_unload(ring->data_dma_tag, data->dma_map); 2102 m_freem(data->m); 2103 } 2104 2105 if (data->dma_map != NULL) 2106 bus_dmamap_destroy(ring->data_dma_tag, data->dma_map); 2107 } 2108 2109 if (ring->spare_dma_map != NULL) 2110 bus_dmamap_destroy(ring->data_dma_tag, ring->spare_dma_map); 2111 2112 if (ring->data_dma_tag != NULL) 2113 bus_dma_tag_destroy(ring->data_dma_tag); 2114} 2115 2116/* 2117 * rt_alloc_tx_ring - allocate TX ring buffer 2118 */ 2119static int 2120rt_alloc_tx_ring(struct rt_softc *sc, struct rt_softc_tx_ring *ring, int qid) 2121{ 2122 struct rt_softc_tx_data *data; 2123 int error, i; 2124 2125 mtx_init(&ring->lock, device_get_nameunit(sc->dev), NULL, MTX_DEF); 2126 2127 error = bus_dma_tag_create(bus_get_dma_tag(sc->dev), PAGE_SIZE, 0, 2128 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, 2129 RT_SOFTC_TX_RING_DESC_COUNT * sizeof(struct rt_txdesc), 1, 2130 RT_SOFTC_TX_RING_DESC_COUNT * sizeof(struct rt_txdesc), 2131 0, NULL, NULL, &ring->desc_dma_tag); 2132 if (error != 0) { 2133 device_printf(sc->dev, 2134 "could not create Tx desc DMA tag\n"); 2135 goto fail; 2136 } 2137 2138 error = bus_dmamem_alloc(ring->desc_dma_tag, (void **) &ring->desc, 2139 BUS_DMA_NOWAIT | BUS_DMA_ZERO, &ring->desc_dma_map); 2140 if (error != 0) { 2141 device_printf(sc->dev, 2142 "could not allocate Tx desc DMA memory\n"); 2143 goto fail; 2144 } 2145 2146 error = bus_dmamap_load(ring->desc_dma_tag, ring->desc_dma_map, 2147 ring->desc, (RT_SOFTC_TX_RING_DESC_COUNT * 2148 sizeof(struct rt_txdesc)), rt_dma_map_addr, 2149 &ring->desc_phys_addr, 0); 2150 if (error != 0) { 2151 device_printf(sc->dev, "could not load Tx desc DMA map\n"); 2152 goto fail; 2153 } 2154 2155 ring->desc_queued = 0; 2156 ring->desc_cur = 0; 2157 ring->desc_next = 0; 2158 2159 error = bus_dma_tag_create(bus_get_dma_tag(sc->dev), PAGE_SIZE, 0, 2160 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, 2161 RT_SOFTC_TX_RING_DATA_COUNT * RT_TX_DATA_SEG0_SIZE, 1, 2162 RT_SOFTC_TX_RING_DATA_COUNT * RT_TX_DATA_SEG0_SIZE, 2163 0, NULL, NULL, &ring->seg0_dma_tag); 2164 if (error != 0) { 2165 device_printf(sc->dev, 2166 "could not create Tx seg0 DMA tag\n"); 2167 goto fail; 2168 } 2169 2170 error = bus_dmamem_alloc(ring->seg0_dma_tag, (void **) &ring->seg0, 2171 BUS_DMA_NOWAIT | BUS_DMA_ZERO, &ring->seg0_dma_map); 2172 if (error != 0) { 2173 device_printf(sc->dev, 2174 "could not allocate Tx seg0 DMA memory\n"); 2175 goto fail; 2176 } 2177 2178 error = bus_dmamap_load(ring->seg0_dma_tag, ring->seg0_dma_map, 2179 ring->seg0, 2180 RT_SOFTC_TX_RING_DATA_COUNT * RT_TX_DATA_SEG0_SIZE, 2181 rt_dma_map_addr, &ring->seg0_phys_addr, 0); 2182 if (error != 0) { 2183 device_printf(sc->dev, "could not load Tx seg0 DMA map\n"); 2184 goto fail; 2185 } 2186 2187 error = bus_dma_tag_create(bus_get_dma_tag(sc->dev), PAGE_SIZE, 0, 2188 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, 2189 MJUMPAGESIZE, RT_SOFTC_MAX_SCATTER, MJUMPAGESIZE, 0, NULL, NULL, 2190 &ring->data_dma_tag); 2191 if (error != 0) { 2192 device_printf(sc->dev, 2193 "could not create Tx data DMA tag\n"); 2194 goto fail; 2195 } 2196 2197 for (i = 0; i < RT_SOFTC_TX_RING_DATA_COUNT; i++) { 2198 data = &ring->data[i]; 2199 2200 error = bus_dmamap_create(ring->data_dma_tag, 0, 2201 &data->dma_map); 2202 if (error != 0) { 2203 device_printf(sc->dev, "could not create Tx data DMA " 2204 "map\n"); 2205 goto fail; 2206 } 2207 } 2208 2209 ring->data_queued = 0; 2210 ring->data_cur = 0; 2211 ring->data_next = 0; 2212 2213 ring->qid = qid; 2214 return (0); 2215 2216fail: 2217 rt_free_tx_ring(sc, ring); 2218 return (error); 2219} 2220 2221/* 2222 * rt_reset_tx_ring - reset TX ring buffer to empty state 2223 */ 2224static void 2225rt_reset_tx_ring(struct rt_softc *sc, struct rt_softc_tx_ring *ring) 2226{ 2227 struct rt_softc_tx_data *data; 2228 struct rt_txdesc *desc; 2229 int i; 2230 2231 for (i = 0; i < RT_SOFTC_TX_RING_DESC_COUNT; i++) { 2232 desc = &ring->desc[i]; 2233 2234 desc->sdl0 = 0; 2235 desc->sdl1 = 0; 2236 } 2237 2238 ring->desc_queued = 0; 2239 ring->desc_cur = 0; 2240 ring->desc_next = 0; 2241 2242 bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map, 2243 BUS_DMASYNC_PREWRITE); 2244 2245 bus_dmamap_sync(ring->seg0_dma_tag, ring->seg0_dma_map, 2246 BUS_DMASYNC_PREWRITE); 2247 2248 for (i = 0; i < RT_SOFTC_TX_RING_DATA_COUNT; i++) { 2249 data = &ring->data[i]; 2250 2251 if (data->m != NULL) { 2252 bus_dmamap_sync(ring->data_dma_tag, data->dma_map, 2253 BUS_DMASYNC_POSTWRITE); 2254 bus_dmamap_unload(ring->data_dma_tag, data->dma_map); 2255 m_freem(data->m); 2256 data->m = NULL; 2257 } 2258 } 2259 2260 ring->data_queued = 0; 2261 ring->data_cur = 0; 2262 ring->data_next = 0; 2263} 2264 2265/* 2266 * rt_free_tx_ring - free RX ring buffer 2267 */ 2268static void 2269rt_free_tx_ring(struct rt_softc *sc, struct rt_softc_tx_ring *ring) 2270{ 2271 struct rt_softc_tx_data *data; 2272 int i; 2273 2274 if (ring->desc != NULL) { 2275 bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map, 2276 BUS_DMASYNC_POSTWRITE); 2277 bus_dmamap_unload(ring->desc_dma_tag, ring->desc_dma_map); 2278 bus_dmamem_free(ring->desc_dma_tag, ring->desc, 2279 ring->desc_dma_map); 2280 } 2281 2282 if (ring->desc_dma_tag != NULL) 2283 bus_dma_tag_destroy(ring->desc_dma_tag); 2284 2285 if (ring->seg0 != NULL) { 2286 bus_dmamap_sync(ring->seg0_dma_tag, ring->seg0_dma_map, 2287 BUS_DMASYNC_POSTWRITE); 2288 bus_dmamap_unload(ring->seg0_dma_tag, ring->seg0_dma_map); 2289 bus_dmamem_free(ring->seg0_dma_tag, ring->seg0, 2290 ring->seg0_dma_map); 2291 } 2292 2293 if (ring->seg0_dma_tag != NULL) 2294 bus_dma_tag_destroy(ring->seg0_dma_tag); 2295 2296 for (i = 0; i < RT_SOFTC_TX_RING_DATA_COUNT; i++) { 2297 data = &ring->data[i]; 2298 2299 if (data->m != NULL) { 2300 bus_dmamap_sync(ring->data_dma_tag, data->dma_map, 2301 BUS_DMASYNC_POSTWRITE); 2302 bus_dmamap_unload(ring->data_dma_tag, data->dma_map); 2303 m_freem(data->m); 2304 } 2305 2306 if (data->dma_map != NULL) 2307 bus_dmamap_destroy(ring->data_dma_tag, data->dma_map); 2308 } 2309 2310 if (ring->data_dma_tag != NULL) 2311 bus_dma_tag_destroy(ring->data_dma_tag); 2312 2313 mtx_destroy(&ring->lock); 2314} 2315 2316/* 2317 * rt_dma_map_addr - get address of busdma segment 2318 */ 2319static void 2320rt_dma_map_addr(void *arg, bus_dma_segment_t *segs, int nseg, int error) 2321{ 2322 if (error != 0) 2323 return; 2324 2325 KASSERT(nseg == 1, ("too many DMA segments, %d should be 1", nseg)); 2326 2327 *(bus_addr_t *) arg = segs[0].ds_addr; 2328} 2329 2330/* 2331 * rt_sysctl_attach - attach sysctl nodes for NIC counters. 2332 */ 2333static void 2334rt_sysctl_attach(struct rt_softc *sc) 2335{ 2336 struct sysctl_ctx_list *ctx; 2337 struct sysctl_oid *tree; 2338 struct sysctl_oid *stats; 2339 2340 ctx = device_get_sysctl_ctx(sc->dev); 2341 tree = device_get_sysctl_tree(sc->dev); 2342 2343 /* statistic counters */ 2344 stats = SYSCTL_ADD_NODE(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, 2345 "stats", CTLFLAG_RD, 0, "statistic"); 2346 2347 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2348 "interrupts", CTLFLAG_RD, &sc->interrupts, 0, 2349 "all interrupts"); 2350 2351 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2352 "tx_coherent_interrupts", CTLFLAG_RD, &sc->tx_coherent_interrupts, 2353 0, "Tx coherent interrupts"); 2354 2355 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2356 "rx_coherent_interrupts", CTLFLAG_RD, &sc->rx_coherent_interrupts, 2357 0, "Rx coherent interrupts"); 2358 2359 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2360 "rx_interrupts", CTLFLAG_RD, &sc->rx_interrupts, 0, 2361 "Rx interrupts"); 2362 2363 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2364 "rx_delay_interrupts", CTLFLAG_RD, &sc->rx_delay_interrupts, 0, 2365 "Rx delay interrupts"); 2366 2367 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2368 "TXQ3_interrupts", CTLFLAG_RD, &sc->tx_interrupts[3], 0, 2369 "Tx AC3 interrupts"); 2370 2371 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2372 "TXQ2_interrupts", CTLFLAG_RD, &sc->tx_interrupts[2], 0, 2373 "Tx AC2 interrupts"); 2374 2375 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2376 "TXQ1_interrupts", CTLFLAG_RD, &sc->tx_interrupts[1], 0, 2377 "Tx AC1 interrupts"); 2378 2379 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2380 "TXQ0_interrupts", CTLFLAG_RD, &sc->tx_interrupts[0], 0, 2381 "Tx AC0 interrupts"); 2382 2383 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2384 "tx_delay_interrupts", CTLFLAG_RD, &sc->tx_delay_interrupts, 2385 0, "Tx delay interrupts"); 2386 2387 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2388 "TXQ3_desc_queued", CTLFLAG_RD, &sc->tx_ring[3].desc_queued, 2389 0, "Tx AC3 descriptors queued"); 2390 2391 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2392 "TXQ3_data_queued", CTLFLAG_RD, &sc->tx_ring[3].data_queued, 2393 0, "Tx AC3 data queued"); 2394 2395 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2396 "TXQ2_desc_queued", CTLFLAG_RD, &sc->tx_ring[2].desc_queued, 2397 0, "Tx AC2 descriptors queued"); 2398 2399 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2400 "TXQ2_data_queued", CTLFLAG_RD, &sc->tx_ring[2].data_queued, 2401 0, "Tx AC2 data queued"); 2402 2403 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2404 "TXQ1_desc_queued", CTLFLAG_RD, &sc->tx_ring[1].desc_queued, 2405 0, "Tx AC1 descriptors queued"); 2406 2407 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2408 "TXQ1_data_queued", CTLFLAG_RD, &sc->tx_ring[1].data_queued, 2409 0, "Tx AC1 data queued"); 2410 2411 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2412 "TXQ0_desc_queued", CTLFLAG_RD, &sc->tx_ring[0].desc_queued, 2413 0, "Tx AC0 descriptors queued"); 2414 2415 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2416 "TXQ0_data_queued", CTLFLAG_RD, &sc->tx_ring[0].data_queued, 2417 0, "Tx AC0 data queued"); 2418 2419 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2420 "TXQ3_data_queue_full", CTLFLAG_RD, &sc->tx_data_queue_full[3], 2421 0, "Tx AC3 data queue full"); 2422 2423 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2424 "TXQ2_data_queue_full", CTLFLAG_RD, &sc->tx_data_queue_full[2], 2425 0, "Tx AC2 data queue full"); 2426 2427 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2428 "TXQ1_data_queue_full", CTLFLAG_RD, &sc->tx_data_queue_full[1], 2429 0, "Tx AC1 data queue full"); 2430 2431 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2432 "TXQ0_data_queue_full", CTLFLAG_RD, &sc->tx_data_queue_full[0], 2433 0, "Tx AC0 data queue full"); 2434 2435 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2436 "tx_watchdog_timeouts", CTLFLAG_RD, &sc->tx_watchdog_timeouts, 2437 0, "Tx watchdog timeouts"); 2438 2439 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2440 "tx_defrag_packets", CTLFLAG_RD, &sc->tx_defrag_packets, 0, 2441 "Tx defragmented packets"); 2442 2443 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2444 "no_tx_desc_avail", CTLFLAG_RD, &sc->no_tx_desc_avail, 0, 2445 "no Tx descriptors available"); 2446 2447 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2448 "rx_mbuf_alloc_errors", CTLFLAG_RD, &sc->rx_mbuf_alloc_errors, 2449 0, "Rx mbuf allocation errors"); 2450 2451 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2452 "rx_mbuf_dmamap_errors", CTLFLAG_RD, &sc->rx_mbuf_dmamap_errors, 2453 0, "Rx mbuf DMA mapping errors"); 2454 2455 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2456 "tx_queue_0_not_empty", CTLFLAG_RD, &sc->tx_queue_not_empty[0], 2457 0, "Tx queue 0 not empty"); 2458 2459 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2460 "tx_queue_1_not_empty", CTLFLAG_RD, &sc->tx_queue_not_empty[1], 2461 0, "Tx queue 1 not empty"); 2462 2463 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2464 "rx_packets", CTLFLAG_RD, &sc->rx_packets, 0, 2465 "Rx packets"); 2466 2467 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2468 "rx_crc_errors", CTLFLAG_RD, &sc->rx_crc_err, 0, 2469 "Rx CRC errors"); 2470 2471 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2472 "rx_phy_errors", CTLFLAG_RD, &sc->rx_phy_err, 0, 2473 "Rx PHY errors"); 2474 2475 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2476 "rx_dup_packets", CTLFLAG_RD, &sc->rx_dup_packets, 0, 2477 "Rx duplicate packets"); 2478 2479 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2480 "rx_fifo_overflows", CTLFLAG_RD, &sc->rx_fifo_overflows, 0, 2481 "Rx FIFO overflows"); 2482 2483 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2484 "rx_bytes", CTLFLAG_RD, &sc->rx_bytes, 0, 2485 "Rx bytes"); 2486 2487 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2488 "rx_long_err", CTLFLAG_RD, &sc->rx_long_err, 0, 2489 "Rx too long frame errors"); 2490 2491 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2492 "rx_short_err", CTLFLAG_RD, &sc->rx_short_err, 0, 2493 "Rx too short frame errors"); 2494 2495 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2496 "tx_bytes", CTLFLAG_RD, &sc->tx_bytes, 0, 2497 "Tx bytes"); 2498 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2499 "tx_packets", CTLFLAG_RD, &sc->tx_packets, 0, 2500 "Tx packets"); 2501 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2502 "tx_skip", CTLFLAG_RD, &sc->tx_skip, 0, 2503 "Tx skip count for GDMA ports"); 2504 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, 2505 "tx_collision", CTLFLAG_RD, &sc->tx_collision, 0, 2506 "Tx collision count for GDMA ports"); 2507} 2508 2509#ifdef IF_RT_PHY_SUPPORT 2510static int 2511rt_miibus_readreg(device_t dev, int phy, int reg) 2512{ 2513 struct rt_softc *sc = device_get_softc(dev); 2514 2515 /* 2516 * PSEUDO_PHYAD is a special value for indicate switch attached. 2517 * No one PHY use PSEUDO_PHYAD (0x1e) address. 2518 */ 2519 if (phy == 31) { 2520 /* Fake PHY ID for bfeswitch attach */ 2521 switch (reg) { 2522 case MII_BMSR: 2523 return (BMSR_EXTSTAT|BMSR_MEDIAMASK); 2524 case MII_PHYIDR1: 2525 return (0x40); /* As result of faking */ 2526 case MII_PHYIDR2: /* PHY will detect as */ 2527 return (0x6250); /* bfeswitch */ 2528 } 2529 } 2530 2531 /* Wait prev command done if any */ 2532 while (RT_READ(sc, MDIO_ACCESS) & MDIO_CMD_ONGO); 2533 RT_WRITE(sc, MDIO_ACCESS, 2534 MDIO_CMD_ONGO || 2535 ((phy << MDIO_PHY_ADDR_SHIFT) & MDIO_PHY_ADDR_MASK) || 2536 ((reg << MDIO_PHYREG_ADDR_SHIFT) & MDIO_PHYREG_ADDR_MASK)); 2537 while (RT_READ(sc, MDIO_ACCESS) & MDIO_CMD_ONGO); 2538 2539 return (RT_READ(sc, MDIO_ACCESS) & MDIO_PHY_DATA_MASK); 2540} 2541 2542static int 2543rt_miibus_writereg(device_t dev, int phy, int reg, int val) 2544{ 2545 struct rt_softc *sc = device_get_softc(dev); 2546 2547 /* Wait prev command done if any */ 2548 while (RT_READ(sc, MDIO_ACCESS) & MDIO_CMD_ONGO); 2549 RT_WRITE(sc, MDIO_ACCESS, 2550 MDIO_CMD_ONGO || MDIO_CMD_WR || 2551 ((phy << MDIO_PHY_ADDR_SHIFT) & MDIO_PHY_ADDR_MASK) || 2552 ((reg << MDIO_PHYREG_ADDR_SHIFT) & MDIO_PHYREG_ADDR_MASK) || 2553 (val & MDIO_PHY_DATA_MASK)); 2554 while (RT_READ(sc, MDIO_ACCESS) & MDIO_CMD_ONGO); 2555 2556 return (0); 2557} 2558 2559void 2560rt_miibus_statchg(device_t dev) 2561{ 2562 struct rt_softc *sc = device_get_softc(dev); 2563 struct mii_data *mii; 2564 2565 mii = device_get_softc(sc->rt_miibus); 2566 2567 if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) == 2568 (IFM_ACTIVE | IFM_AVALID)) { 2569 switch (IFM_SUBTYPE(mii->mii_media_active)) { 2570 case IFM_10_T: 2571 case IFM_100_TX: 2572 /* XXX check link here */ 2573 sc->flags |= 1; 2574 break; 2575 default: 2576 break; 2577 } 2578 } 2579} 2580#endif /* IF_RT_PHY_SUPPORT */ 2581 2582static device_method_t rt_dev_methods[] = 2583{ 2584 DEVMETHOD(device_probe, rt_probe), 2585 DEVMETHOD(device_attach, rt_attach), 2586 DEVMETHOD(device_detach, rt_detach), 2587 DEVMETHOD(device_shutdown, rt_shutdown), 2588 DEVMETHOD(device_suspend, rt_suspend), 2589 DEVMETHOD(device_resume, rt_resume), 2590 2591 /* bus interface */ 2592 DEVMETHOD(bus_print_child, bus_generic_print_child), 2593 DEVMETHOD(bus_driver_added, bus_generic_driver_added), 2594 2595#ifdef IF_RT_PHY_SUPPORT 2596 /* MII interface */ 2597 DEVMETHOD(miibus_readreg, rt_miibus_readreg), 2598 DEVMETHOD(miibus_writereg, rt_miibus_writereg), 2599 DEVMETHOD(miibus_statchg, rt_miibus_statchg), 2600#endif 2601 { 0, 0 } 2602}; 2603 2604static driver_t rt_driver = 2605{ 2606 "rt", 2607 rt_dev_methods, 2608 sizeof(struct rt_softc) 2609}; 2610 2611static devclass_t rt_dev_class; 2612 2613DRIVER_MODULE(rt, nexus, rt_driver, rt_dev_class, 0, 0); 2614MODULE_DEPEND(rt, ether, 1, 1, 1); 2615MODULE_DEPEND(rt, miibus, 1, 1, 1); 2616 2617