1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #include <sys/types.h> 28 #include <sys/stream.h> 29 #include <sys/strsun.h> 30 #include <sys/stat.h> 31 #include <sys/pci.h> 32 #include <sys/modctl.h> 33 #include <sys/kstat.h> 34 #include <sys/ethernet.h> 35 #include <sys/devops.h> 36 #include <sys/debug.h> 37 #include <sys/conf.h> 38 #include <sys/mac.h> 39 #include <sys/mac_provider.h> 40 #include <sys/mac_ether.h> 41 #include <sys/sysmacros.h> 42 #include <sys/dditypes.h> 43 #include <sys/ddi.h> 44 #include <sys/sunddi.h> 45 #include <sys/miiregs.h> 46 #include <sys/byteorder.h> 47 #include <sys/note.h> 48 #include <sys/vlan.h> 49 50 #include "vr.h" 51 #include "vr_impl.h" 52 53 /* 54 * VR in a nutshell 55 * The card uses two rings of data structures to communicate with the host. 56 * These are referred to as "descriptor rings" and there is one for transmit 57 * (TX) and one for receive (RX). 58 * 59 * The driver uses a "DMA buffer" data type for mapping to those descriptor 60 * rings. This is a structure with handles and a DMA'able buffer attached to it. 61 * 62 * Receive 63 * The receive ring is filled with DMA buffers. Received packets are copied into 64 * a newly allocated mblk's and passed upstream. 65 * 66 * Transmit 67 * Each transmit descriptor has a DMA buffer attached to it. The data of TX 68 * packets is copied into the DMA buffer which is then enqueued for 69 * transmission. 70 * 71 * Reclaim of transmitted packets is done as a result of a transmit completion 72 * interrupt which is generated 3 times per ring at minimum. 73 */ 74 75 #if defined(DEBUG) 76 uint32_t vrdebug = 1; 77 #define VR_DEBUG(args) do { \ 78 if (vrdebug > 0) \ 79 (*vr_debug()) args; \ 80 _NOTE(CONSTANTCONDITION) \ 81 } while (0) 82 static void vr_prt(const char *fmt, ...); 83 void (*vr_debug())(const char *fmt, ...); 84 #else 85 #define VR_DEBUG(args) do ; _NOTE(CONSTANTCONDITION) while (0) 86 #endif 87 88 static char vr_ident[] = "VIA Rhine Ethernet"; 89 90 /* 91 * Attributes for accessing registers and memory descriptors for this device. 92 */ 93 static ddi_device_acc_attr_t vr_dev_dma_accattr = { 94 DDI_DEVICE_ATTR_V0, 95 DDI_STRUCTURE_LE_ACC, 96 DDI_STRICTORDER_ACC 97 }; 98 99 /* 100 * Attributes for accessing data. 101 */ 102 static ddi_device_acc_attr_t vr_data_dma_accattr = { 103 DDI_DEVICE_ATTR_V0, 104 DDI_NEVERSWAP_ACC, 105 DDI_STRICTORDER_ACC 106 }; 107 108 /* 109 * DMA attributes for descriptors for communication with the device 110 * This driver assumes that all descriptors of one ring fit in one consequitive 111 * memory area of max 4K (256 descriptors) that does not cross a page boundary. 112 * Therefore, we request 4K alignement. 113 */ 114 static ddi_dma_attr_t vr_dev_dma_attr = { 115 DMA_ATTR_V0, /* version number */ 116 0, /* low DMA address range */ 117 0xFFFFFFFF, /* high DMA address range */ 118 0x7FFFFFFF, /* DMA counter register */ 119 0x1000, /* DMA address alignment */ 120 0x7F, /* DMA burstsizes */ 121 1, /* min effective DMA size */ 122 0xFFFFFFFF, /* max DMA xfer size */ 123 0xFFFFFFFF, /* segment boundary */ 124 1, /* s/g list length */ 125 1, /* granularity of device */ 126 0 /* DMA transfer flags */ 127 }; 128 129 /* 130 * DMA attributes for the data moved to/from the device 131 * Note that the alignement is set to 2K so hat a 1500 byte packet never 132 * crosses a page boundary and thus that a DMA transfer is not split up in 133 * multiple cookies with a 4K/8K pagesize 134 */ 135 static ddi_dma_attr_t vr_data_dma_attr = { 136 DMA_ATTR_V0, /* version number */ 137 0, /* low DMA address range */ 138 0xFFFFFFFF, /* high DMA address range */ 139 0x7FFFFFFF, /* DMA counter register */ 140 0x800, /* DMA address alignment */ 141 0xfff, /* DMA burstsizes */ 142 1, /* min effective DMA size */ 143 0xFFFFFFFF, /* max DMA xfer size */ 144 0xFFFFFFFF, /* segment boundary */ 145 1, /* s/g list length */ 146 1, /* granularity of device */ 147 0 /* DMA transfer flags */ 148 }; 149 150 static mac_callbacks_t vr_mac_callbacks = { 151 MC_SETPROP|MC_GETPROP|MC_PROPINFO, /* Which callbacks are set */ 152 vr_mac_getstat, /* Get the value of a statistic */ 153 vr_mac_start, /* Start the device */ 154 vr_mac_stop, /* Stop the device */ 155 vr_mac_set_promisc, /* Enable or disable promiscuous mode */ 156 vr_mac_set_multicast, /* Enable or disable a multicast addr */ 157 vr_mac_set_ether_addr, /* Set the unicast MAC address */ 158 vr_mac_tx_enqueue_list, /* Transmit a packet */ 159 NULL, 160 NULL, /* Process an unknown ioctl */ 161 NULL, /* Get capability information */ 162 NULL, /* Open the device */ 163 NULL, /* Close the device */ 164 vr_mac_setprop, /* Set properties of the device */ 165 vr_mac_getprop, /* Get properties of the device */ 166 vr_mac_propinfo /* Get properties attributes */ 167 }; 168 169 /* 170 * Table with bugs and features for each incarnation of the card. 171 */ 172 static const chip_info_t vr_chip_info [] = { 173 { 174 0x0, 0x0, 175 "VIA Rhine Fast Ethernet", 176 (VR_BUG_NO_MEMIO), 177 (VR_FEATURE_NONE) 178 }, 179 { 180 0x04, 0x21, 181 "VIA VT86C100A Fast Ethernet", 182 (VR_BUG_NEEDMODE2PCEROPT | VR_BUG_NO_TXQUEUEING | 183 VR_BUG_NEEDMODE10T | VR_BUG_TXALIGN | VR_BUG_NO_MEMIO | 184 VR_BUG_MIIPOLLSTOP), 185 (VR_FEATURE_NONE) 186 }, 187 { 188 0x40, 0x41, 189 "VIA VT6102-A Rhine II Fast Ethernet", 190 (VR_BUG_NEEDMODE2PCEROPT), 191 (VR_FEATURE_RX_PAUSE_CAP) 192 }, 193 { 194 0x42, 0x7f, 195 "VIA VT6102-C Rhine II Fast Ethernet", 196 (VR_BUG_NEEDMODE2PCEROPT), 197 (VR_FEATURE_RX_PAUSE_CAP) 198 }, 199 { 200 0x80, 0x82, 201 "VIA VT6105-A Rhine III Fast Ethernet", 202 (VR_BUG_NONE), 203 (VR_FEATURE_RX_PAUSE_CAP | VR_FEATURE_TX_PAUSE_CAP) 204 }, 205 { 206 0x83, 0x89, 207 "VIA VT6105-B Rhine III Fast Ethernet", 208 (VR_BUG_NONE), 209 (VR_FEATURE_RX_PAUSE_CAP | VR_FEATURE_TX_PAUSE_CAP) 210 }, 211 { 212 0x8a, 0x8b, 213 "VIA VT6105-LOM Rhine III Fast Ethernet", 214 (VR_BUG_NONE), 215 (VR_FEATURE_RX_PAUSE_CAP | VR_FEATURE_TX_PAUSE_CAP) 216 }, 217 { 218 0x8c, 0x8c, 219 "VIA VT6107-A0 Rhine III Fast Ethernet", 220 (VR_BUG_NONE), 221 (VR_FEATURE_RX_PAUSE_CAP | VR_FEATURE_TX_PAUSE_CAP) 222 }, 223 { 224 0x8d, 0x8f, 225 "VIA VT6107-A1 Rhine III Fast Ethernet", 226 (VR_BUG_NONE), 227 (VR_FEATURE_RX_PAUSE_CAP | VR_FEATURE_TX_PAUSE_CAP | 228 VR_FEATURE_MRDLNMULTIPLE) 229 }, 230 { 231 0x90, 0x93, 232 "VIA VT6105M-A0 Rhine III Fast Ethernet Management Adapter", 233 (VR_BUG_NONE), 234 (VR_FEATURE_RX_PAUSE_CAP | VR_FEATURE_TX_PAUSE_CAP | 235 VR_FEATURE_TXCHKSUM | VR_FEATURE_RXCHKSUM | 236 VR_FEATURE_CAMSUPPORT | VR_FEATURE_VLANTAGGING | 237 VR_FEATURE_MIBCOUNTER) 238 }, 239 { 240 0x94, 0xff, 241 "VIA VT6105M-B1 Rhine III Fast Ethernet Management Adapter", 242 (VR_BUG_NONE), 243 (VR_FEATURE_RX_PAUSE_CAP | VR_FEATURE_TX_PAUSE_CAP | 244 VR_FEATURE_TXCHKSUM | VR_FEATURE_RXCHKSUM | 245 VR_FEATURE_CAMSUPPORT | VR_FEATURE_VLANTAGGING | 246 VR_FEATURE_MIBCOUNTER) 247 } 248 }; 249 250 /* 251 * Function prototypes 252 */ 253 static vr_result_t vr_add_intr(vr_t *vrp); 254 static void vr_remove_intr(vr_t *vrp); 255 static int32_t vr_cam_index(vr_t *vrp, const uint8_t *maddr); 256 static uint32_t ether_crc_be(const uint8_t *address); 257 static void vr_tx_enqueue_msg(vr_t *vrp, mblk_t *mp); 258 static void vr_log(vr_t *vrp, int level, const char *fmt, ...); 259 static int vr_resume(dev_info_t *devinfo); 260 static int vr_suspend(dev_info_t *devinfo); 261 static vr_result_t vr_bus_config(vr_t *vrp); 262 static void vr_bus_unconfig(vr_t *vrp); 263 static void vr_reset(vr_t *vrp); 264 static int vr_start(vr_t *vrp); 265 static int vr_stop(vr_t *vrp); 266 static vr_result_t vr_rings_init(vr_t *vrp); 267 static void vr_rings_fini(vr_t *vrp); 268 static vr_result_t vr_alloc_ring(vr_t *vrp, vr_ring_t *r, size_t n); 269 static void vr_free_ring(vr_ring_t *r, size_t n); 270 static vr_result_t vr_rxring_init(vr_t *vrp); 271 static void vr_rxring_fini(vr_t *vrp); 272 static vr_result_t vr_txring_init(vr_t *vrp); 273 static void vr_txring_fini(vr_t *vrp); 274 static vr_result_t vr_alloc_dmabuf(vr_t *vrp, vr_data_dma_t *dmap, 275 uint_t flags); 276 static void vr_free_dmabuf(vr_data_dma_t *dmap); 277 static void vr_param_init(vr_t *vrp); 278 static mblk_t *vr_receive(vr_t *vrp); 279 static void vr_tx_reclaim(vr_t *vrp); 280 static void vr_periodic(void *p); 281 static void vr_error(vr_t *vrp); 282 static void vr_phy_read(vr_t *vrp, int offset, uint16_t *value); 283 static void vr_phy_write(vr_t *vrp, int offset, uint16_t value); 284 static void vr_phy_autopoll_disable(vr_t *vrp); 285 static void vr_phy_autopoll_enable(vr_t *vrp); 286 static void vr_link_init(vr_t *vrp); 287 static void vr_link_state(vr_t *vrp); 288 static void vr_kstats_init(vr_t *vrp); 289 static int vr_update_kstats(kstat_t *ksp, int access); 290 static void vr_remove_kstats(vr_t *vrp); 291 292 static int 293 vr_attach(dev_info_t *devinfo, ddi_attach_cmd_t cmd) 294 { 295 vr_t *vrp; 296 mac_register_t *macreg; 297 298 if (cmd == DDI_RESUME) 299 return (vr_resume(devinfo)); 300 else if (cmd != DDI_ATTACH) 301 return (DDI_FAILURE); 302 303 /* 304 * Attach. 305 */ 306 vrp = kmem_zalloc(sizeof (vr_t), KM_SLEEP); 307 ddi_set_driver_private(devinfo, vrp); 308 vrp->devinfo = devinfo; 309 310 /* 311 * Store the name+instance of the module. 312 */ 313 (void) snprintf(vrp->ifname, sizeof (vrp->ifname), "%s%d", 314 MODULENAME, ddi_get_instance(devinfo)); 315 316 /* 317 * Bus initialization. 318 */ 319 if (vr_bus_config(vrp) != VR_SUCCESS) { 320 vr_log(vrp, CE_WARN, "vr_bus_config failed"); 321 goto fail0; 322 } 323 324 /* 325 * Initialize default parameters. 326 */ 327 vr_param_init(vrp); 328 329 /* 330 * Setup the descriptor rings. 331 */ 332 if (vr_rings_init(vrp) != VR_SUCCESS) { 333 vr_log(vrp, CE_WARN, "vr_rings_init failed"); 334 goto fail1; 335 } 336 337 /* 338 * Initialize kstats. 339 */ 340 vr_kstats_init(vrp); 341 342 /* 343 * Add interrupt to the OS. 344 */ 345 if (vr_add_intr(vrp) != VR_SUCCESS) { 346 vr_log(vrp, CE_WARN, "vr_add_intr failed in attach"); 347 goto fail3; 348 } 349 350 /* 351 * Add mutexes. 352 */ 353 mutex_init(&vrp->intrlock, NULL, MUTEX_DRIVER, 354 DDI_INTR_PRI(vrp->intr_pri)); 355 mutex_init(&vrp->oplock, NULL, MUTEX_DRIVER, NULL); 356 mutex_init(&vrp->tx.lock, NULL, MUTEX_DRIVER, NULL); 357 358 /* 359 * Enable interrupt. 360 */ 361 if (ddi_intr_enable(vrp->intr_hdl) != DDI_SUCCESS) { 362 vr_log(vrp, CE_NOTE, "ddi_intr_enable failed"); 363 goto fail5; 364 } 365 366 /* 367 * Register with parent, mac. 368 */ 369 if ((macreg = mac_alloc(MAC_VERSION)) == NULL) { 370 vr_log(vrp, CE_WARN, "mac_alloc failed in attach"); 371 goto fail6; 372 } 373 374 macreg->m_type_ident = MAC_PLUGIN_IDENT_ETHER; 375 macreg->m_driver = vrp; 376 macreg->m_dip = devinfo; 377 macreg->m_src_addr = vrp->vendor_ether_addr; 378 macreg->m_callbacks = &vr_mac_callbacks; 379 macreg->m_min_sdu = 0; 380 macreg->m_max_sdu = ETHERMTU; 381 macreg->m_margin = VLAN_TAGSZ; 382 383 if (mac_register(macreg, &vrp->machdl) != 0) { 384 vr_log(vrp, CE_WARN, "mac_register failed in attach"); 385 goto fail7; 386 } 387 mac_free(macreg); 388 return (DDI_SUCCESS); 389 390 fail7: 391 mac_free(macreg); 392 fail6: 393 (void) ddi_intr_disable(vrp->intr_hdl); 394 fail5: 395 mutex_destroy(&vrp->tx.lock); 396 mutex_destroy(&vrp->oplock); 397 mutex_destroy(&vrp->intrlock); 398 vr_remove_intr(vrp); 399 fail3: 400 vr_remove_kstats(vrp); 401 fail2: 402 vr_rings_fini(vrp); 403 fail1: 404 vr_bus_unconfig(vrp); 405 fail0: 406 kmem_free(vrp, sizeof (vr_t)); 407 return (DDI_FAILURE); 408 } 409 410 static int 411 vr_detach(dev_info_t *devinfo, ddi_detach_cmd_t cmd) 412 { 413 vr_t *vrp; 414 415 vrp = ddi_get_driver_private(devinfo); 416 417 if (cmd == DDI_SUSPEND) 418 return (vr_suspend(devinfo)); 419 else if (cmd != DDI_DETACH) 420 return (DDI_FAILURE); 421 422 if (vrp->chip.state == CHIPSTATE_RUNNING) 423 return (DDI_FAILURE); 424 425 /* 426 * Try to un-register from the MAC layer. 427 */ 428 if (mac_unregister(vrp->machdl) != 0) 429 return (DDI_FAILURE); 430 431 (void) ddi_intr_disable(vrp->intr_hdl); 432 vr_remove_intr(vrp); 433 mutex_destroy(&vrp->tx.lock); 434 mutex_destroy(&vrp->oplock); 435 mutex_destroy(&vrp->intrlock); 436 vr_remove_kstats(vrp); 437 vr_rings_fini(vrp); 438 vr_bus_unconfig(vrp); 439 kmem_free(vrp, sizeof (vr_t)); 440 return (DDI_SUCCESS); 441 } 442 443 /* 444 * quiesce the card for fast reboot. 445 */ 446 int 447 vr_quiesce(dev_info_t *dev_info) 448 { 449 vr_t *vrp; 450 451 vrp = (vr_t *)ddi_get_driver_private(dev_info); 452 453 /* 454 * Stop interrupts. 455 */ 456 VR_PUT16(vrp->acc_reg, VR_ICR0, 0); 457 VR_PUT8(vrp->acc_reg, VR_ICR1, 0); 458 459 /* 460 * Stop DMA. 461 */ 462 VR_PUT8(vrp->acc_reg, VR_CTRL0, VR_CTRL0_DMA_STOP); 463 return (DDI_SUCCESS); 464 } 465 466 /* 467 * Add an interrupt for our device to the OS. 468 */ 469 static vr_result_t 470 vr_add_intr(vr_t *vrp) 471 { 472 int nintrs; 473 int rc; 474 475 rc = ddi_intr_alloc(vrp->devinfo, &vrp->intr_hdl, 476 DDI_INTR_TYPE_FIXED, /* type */ 477 0, /* number */ 478 1, /* count */ 479 &nintrs, /* actualp */ 480 DDI_INTR_ALLOC_STRICT); 481 482 if (rc != DDI_SUCCESS) { 483 vr_log(vrp, CE_NOTE, "ddi_intr_alloc failed: %d", rc); 484 return (VR_FAILURE); 485 } 486 487 rc = ddi_intr_add_handler(vrp->intr_hdl, vr_intr, vrp, NULL); 488 if (rc != DDI_SUCCESS) { 489 vr_log(vrp, CE_NOTE, "ddi_intr_add_handler failed"); 490 if (ddi_intr_free(vrp->intr_hdl) != DDI_SUCCESS) 491 vr_log(vrp, CE_NOTE, "ddi_intr_free failed"); 492 return (VR_FAILURE); 493 } 494 495 rc = ddi_intr_get_pri(vrp->intr_hdl, &vrp->intr_pri); 496 if (rc != DDI_SUCCESS) { 497 vr_log(vrp, CE_NOTE, "ddi_intr_get_pri failed"); 498 if (ddi_intr_remove_handler(vrp->intr_hdl) != DDI_SUCCESS) 499 vr_log(vrp, CE_NOTE, "ddi_intr_remove_handler failed"); 500 501 if (ddi_intr_free(vrp->intr_hdl) != DDI_SUCCESS) 502 vr_log(vrp, CE_NOTE, "ddi_intr_free failed"); 503 504 return (VR_FAILURE); 505 } 506 return (VR_SUCCESS); 507 } 508 509 /* 510 * Remove our interrupt from the OS. 511 */ 512 static void 513 vr_remove_intr(vr_t *vrp) 514 { 515 if (ddi_intr_remove_handler(vrp->intr_hdl) != DDI_SUCCESS) 516 vr_log(vrp, CE_NOTE, "ddi_intr_remove_handler failed"); 517 518 if (ddi_intr_free(vrp->intr_hdl) != DDI_SUCCESS) 519 vr_log(vrp, CE_NOTE, "ddi_intr_free failed"); 520 } 521 522 /* 523 * Resume operation after suspend. 524 */ 525 static int 526 vr_resume(dev_info_t *devinfo) 527 { 528 vr_t *vrp; 529 530 vrp = (vr_t *)ddi_get_driver_private(devinfo); 531 mutex_enter(&vrp->oplock); 532 if (vrp->chip.state == CHIPSTATE_SUSPENDED_RUNNING) 533 (void) vr_start(vrp); 534 mutex_exit(&vrp->oplock); 535 return (DDI_SUCCESS); 536 } 537 538 /* 539 * Suspend operation. 540 */ 541 static int 542 vr_suspend(dev_info_t *devinfo) 543 { 544 vr_t *vrp; 545 546 vrp = (vr_t *)ddi_get_driver_private(devinfo); 547 mutex_enter(&vrp->oplock); 548 if (vrp->chip.state == CHIPSTATE_RUNNING) { 549 (void) vr_stop(vrp); 550 vrp->chip.state = CHIPSTATE_SUSPENDED_RUNNING; 551 } 552 mutex_exit(&vrp->oplock); 553 return (DDI_SUCCESS); 554 } 555 556 /* 557 * Initial bus- and device configuration during attach(9E). 558 */ 559 static vr_result_t 560 vr_bus_config(vr_t *vrp) 561 { 562 uint32_t addr; 563 int n, nsets, rc; 564 uint_t elem; 565 pci_regspec_t *regs; 566 567 /* 568 * Get the reg property which describes the various access methods. 569 */ 570 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, vrp->devinfo, 571 0, "reg", (int **)®s, &elem) != DDI_PROP_SUCCESS) { 572 vr_log(vrp, CE_WARN, "Can't get reg property"); 573 return (VR_FAILURE); 574 } 575 nsets = (elem * sizeof (uint_t)) / sizeof (pci_regspec_t); 576 577 /* 578 * Setup access to all available sets. 579 */ 580 vrp->nsets = nsets; 581 vrp->regset = kmem_zalloc(nsets * sizeof (vr_acc_t), KM_SLEEP); 582 for (n = 0; n < nsets; n++) { 583 rc = ddi_regs_map_setup(vrp->devinfo, n, 584 &vrp->regset[n].addr, 0, 0, 585 &vr_dev_dma_accattr, 586 &vrp->regset[n].hdl); 587 if (rc != DDI_SUCCESS) { 588 vr_log(vrp, CE_NOTE, 589 "Setup of register set %d failed", n); 590 while (--n >= 0) 591 ddi_regs_map_free(&vrp->regset[n].hdl); 592 kmem_free(vrp->regset, nsets * sizeof (vr_acc_t)); 593 ddi_prop_free(regs); 594 return (VR_FAILURE); 595 } 596 bcopy(®s[n], &vrp->regset[n].reg, sizeof (pci_regspec_t)); 597 } 598 ddi_prop_free(regs); 599 600 /* 601 * Assign type-named pointers to the register sets. 602 */ 603 for (n = 0; n < nsets; n++) { 604 addr = vrp->regset[n].reg.pci_phys_hi & PCI_REG_ADDR_M; 605 if (addr == PCI_ADDR_CONFIG && vrp->acc_cfg == NULL) 606 vrp->acc_cfg = &vrp->regset[n]; 607 else if (addr == PCI_ADDR_IO && vrp->acc_io == NULL) 608 vrp->acc_io = &vrp->regset[n]; 609 else if (addr == PCI_ADDR_MEM32 && vrp->acc_mem == NULL) 610 vrp->acc_mem = &vrp->regset[n]; 611 } 612 613 /* 614 * Assure there is one of each type. 615 */ 616 if (vrp->acc_cfg == NULL || 617 vrp->acc_io == NULL || 618 vrp->acc_mem == NULL) { 619 for (n = 0; n < nsets; n++) 620 ddi_regs_map_free(&vrp->regset[n].hdl); 621 kmem_free(vrp->regset, nsets * sizeof (vr_acc_t)); 622 vr_log(vrp, CE_WARN, 623 "Config-, I/O- and memory sets not available"); 624 return (VR_FAILURE); 625 } 626 627 /* 628 * Store vendor/device/revision. 629 */ 630 vrp->chip.vendor = VR_GET16(vrp->acc_cfg, PCI_CONF_VENID); 631 vrp->chip.device = VR_GET16(vrp->acc_cfg, PCI_CONF_DEVID); 632 vrp->chip.revision = VR_GET16(vrp->acc_cfg, PCI_CONF_REVID); 633 634 /* 635 * Copy the matching chip_info_t structure. 636 */ 637 elem = sizeof (vr_chip_info) / sizeof (chip_info_t); 638 for (n = 0; n < elem; n++) { 639 if (vrp->chip.revision >= vr_chip_info[n].revmin && 640 vrp->chip.revision <= vr_chip_info[n].revmax) { 641 bcopy((void*)&vr_chip_info[n], 642 (void*)&vrp->chip.info, 643 sizeof (chip_info_t)); 644 break; 645 } 646 } 647 648 /* 649 * If we didn't find a chip_info_t for this card, copy the first 650 * entry of the info structures. This is a generic Rhine whith no 651 * bugs and no features. 652 */ 653 if (vrp->chip.info.name == NULL) { 654 bcopy((void*)&vr_chip_info[0], 655 (void*) &vrp->chip.info, 656 sizeof (chip_info_t)); 657 } 658 659 /* 660 * Tell what is found. 661 */ 662 vr_log(vrp, CE_NOTE, "pci%d,%d,%d: %s, revision 0x%0x", 663 PCI_REG_BUS_G(vrp->acc_cfg->reg.pci_phys_hi), 664 PCI_REG_DEV_G(vrp->acc_cfg->reg.pci_phys_hi), 665 PCI_REG_FUNC_G(vrp->acc_cfg->reg.pci_phys_hi), 666 vrp->chip.info.name, 667 vrp->chip.revision); 668 669 /* 670 * Assure that the device is prepared for memory space accesses 671 * This should be the default as the device advertises memory 672 * access in it's BAR's. However, my VT6102 on a EPIA CL board doesn't 673 * and thus we explicetely enable it. 674 */ 675 VR_SETBIT8(vrp->acc_io, VR_CFGD, VR_CFGD_MMIOEN); 676 677 /* 678 * Setup a handle for regular usage, prefer memory space accesses. 679 */ 680 if (vrp->acc_mem != NULL && 681 (vrp->chip.info.bugs & VR_BUG_NO_MEMIO) == 0) 682 vrp->acc_reg = vrp->acc_mem; 683 else 684 vrp->acc_reg = vrp->acc_io; 685 686 /* 687 * Store the vendor's MAC address. 688 */ 689 for (n = 0; n < ETHERADDRL; n++) { 690 vrp->vendor_ether_addr[n] = VR_GET8(vrp->acc_reg, 691 VR_ETHERADDR + n); 692 } 693 return (VR_SUCCESS); 694 } 695 696 static void 697 vr_bus_unconfig(vr_t *vrp) 698 { 699 uint_t n; 700 701 /* 702 * Free the register access handles. 703 */ 704 for (n = 0; n < vrp->nsets; n++) 705 ddi_regs_map_free(&vrp->regset[n].hdl); 706 kmem_free(vrp->regset, vrp->nsets * sizeof (vr_acc_t)); 707 } 708 709 /* 710 * Initialize parameter structures. 711 */ 712 static void 713 vr_param_init(vr_t *vrp) 714 { 715 /* 716 * Initialize default link configuration parameters. 717 */ 718 vrp->param.an_en = VR_LINK_AUTONEG_ON; 719 vrp->param.anadv_en = 1; /* Select 802.3 autonegotiation */ 720 vrp->param.anadv_en |= MII_ABILITY_100BASE_T4; 721 vrp->param.anadv_en |= MII_ABILITY_100BASE_TX_FD; 722 vrp->param.anadv_en |= MII_ABILITY_100BASE_TX; 723 vrp->param.anadv_en |= MII_ABILITY_10BASE_T_FD; 724 vrp->param.anadv_en |= MII_ABILITY_10BASE_T; 725 /* Not a PHY ability, but advertised on behalf of MAC */ 726 vrp->param.anadv_en |= MII_ABILITY_PAUSE; 727 vrp->param.mtu = ETHERMTU; 728 729 /* 730 * Store the PHY identity. 731 */ 732 vr_phy_read(vrp, MII_PHYIDH, &vrp->chip.mii.identh); 733 vr_phy_read(vrp, MII_PHYIDL, &vrp->chip.mii.identl); 734 735 /* 736 * Clear incapabilities imposed by PHY in phymask. 737 */ 738 vrp->param.an_phymask = vrp->param.anadv_en; 739 vr_phy_read(vrp, MII_STATUS, &vrp->chip.mii.status); 740 if ((vrp->chip.mii.status & MII_STATUS_10) == 0) 741 vrp->param.an_phymask &= ~MII_ABILITY_10BASE_T; 742 743 if ((vrp->chip.mii.status & MII_STATUS_10_FD) == 0) 744 vrp->param.an_phymask &= ~MII_ABILITY_10BASE_T_FD; 745 746 if ((vrp->chip.mii.status & MII_STATUS_100_BASEX) == 0) 747 vrp->param.an_phymask &= ~MII_ABILITY_100BASE_TX; 748 749 if ((vrp->chip.mii.status & MII_STATUS_100_BASEX_FD) == 0) 750 vrp->param.an_phymask &= ~MII_ABILITY_100BASE_TX_FD; 751 752 if ((vrp->chip.mii.status & MII_STATUS_100_BASE_T4) == 0) 753 vrp->param.an_phymask &= ~MII_ABILITY_100BASE_T4; 754 755 /* 756 * Clear incapabilities imposed by MAC in macmask 757 * Note that flowcontrol (FCS?) is never masked. All of our adapters 758 * have the ability to honor incoming pause frames. Only the newer can 759 * transmit pause frames. Since there's no asym flowcontrol in 100Mbit 760 * Ethernet, we always advertise (symmetric) pause. 761 */ 762 vrp->param.an_macmask = vrp->param.anadv_en; 763 764 /* 765 * Advertised capabilities is enabled minus incapable. 766 */ 767 vrp->chip.mii.anadv = vrp->param.anadv_en & 768 (vrp->param.an_phymask & vrp->param.an_macmask); 769 770 /* 771 * Ensure that autoneg of the PHY matches our default. 772 */ 773 if (vrp->param.an_en == VR_LINK_AUTONEG_ON) 774 vrp->chip.mii.control = MII_CONTROL_ANE; 775 else 776 vrp->chip.mii.control = 777 (MII_CONTROL_100MB | MII_CONTROL_FDUPLEX); 778 } 779 780 /* 781 * Setup the descriptor rings. 782 */ 783 static vr_result_t 784 vr_rings_init(vr_t *vrp) 785 { 786 787 vrp->rx.ndesc = VR_RX_N_DESC; 788 vrp->tx.ndesc = VR_TX_N_DESC; 789 790 /* 791 * Create a ring for receive. 792 */ 793 if (vr_alloc_ring(vrp, &vrp->rxring, vrp->rx.ndesc) != VR_SUCCESS) 794 return (VR_FAILURE); 795 796 /* 797 * Create a ring for transmit. 798 */ 799 if (vr_alloc_ring(vrp, &vrp->txring, vrp->tx.ndesc) != VR_SUCCESS) { 800 vr_free_ring(&vrp->rxring, vrp->rx.ndesc); 801 return (VR_FAILURE); 802 } 803 804 vrp->rx.ring = vrp->rxring.desc; 805 vrp->tx.ring = vrp->txring.desc; 806 return (VR_SUCCESS); 807 } 808 809 static void 810 vr_rings_fini(vr_t *vrp) 811 { 812 vr_free_ring(&vrp->rxring, vrp->rx.ndesc); 813 vr_free_ring(&vrp->txring, vrp->tx.ndesc); 814 } 815 816 /* 817 * Allocate a descriptor ring 818 * The number of descriptor entries must fit in a single page so that the 819 * whole ring fits in one consequtive space. 820 * i386: 4K page / 16 byte descriptor = 256 entries 821 * sparc: 8K page / 16 byte descriptor = 512 entries 822 */ 823 static vr_result_t 824 vr_alloc_ring(vr_t *vrp, vr_ring_t *ring, size_t n) 825 { 826 ddi_dma_cookie_t desc_dma_cookie; 827 uint_t desc_cookiecnt; 828 int i, rc; 829 size_t rbytes; 830 831 /* 832 * Allocate a DMA handle for the chip descriptors. 833 */ 834 rc = ddi_dma_alloc_handle(vrp->devinfo, 835 &vr_dev_dma_attr, 836 DDI_DMA_SLEEP, 837 NULL, 838 &ring->handle); 839 840 if (rc != DDI_SUCCESS) { 841 vr_log(vrp, CE_WARN, 842 "ddi_dma_alloc_handle in vr_alloc_ring failed."); 843 return (VR_FAILURE); 844 } 845 846 /* 847 * Allocate memory for the chip descriptors. 848 */ 849 rc = ddi_dma_mem_alloc(ring->handle, 850 n * sizeof (vr_chip_desc_t), 851 &vr_dev_dma_accattr, 852 DDI_DMA_CONSISTENT, 853 DDI_DMA_SLEEP, 854 NULL, 855 (caddr_t *)&ring->cdesc, 856 &rbytes, 857 &ring->acchdl); 858 859 if (rc != DDI_SUCCESS) { 860 vr_log(vrp, CE_WARN, 861 "ddi_dma_mem_alloc in vr_alloc_ring failed."); 862 ddi_dma_free_handle(&ring->handle); 863 return (VR_FAILURE); 864 } 865 866 /* 867 * Map the descriptor memory. 868 */ 869 rc = ddi_dma_addr_bind_handle(ring->handle, 870 NULL, 871 (caddr_t)ring->cdesc, 872 rbytes, 873 DDI_DMA_RDWR | DDI_DMA_CONSISTENT, 874 DDI_DMA_SLEEP, 875 NULL, 876 &desc_dma_cookie, 877 &desc_cookiecnt); 878 879 if (rc != DDI_DMA_MAPPED || desc_cookiecnt > 1) { 880 vr_log(vrp, CE_WARN, 881 "ddi_dma_addr_bind_handle in vr_alloc_ring failed: " 882 "rc = %d, cookiecnt = %d", rc, desc_cookiecnt); 883 ddi_dma_mem_free(&ring->acchdl); 884 ddi_dma_free_handle(&ring->handle); 885 return (VR_FAILURE); 886 } 887 ring->cdesc_paddr = desc_dma_cookie.dmac_address; 888 889 /* 890 * Allocate memory for the host descriptor ring. 891 */ 892 ring->desc = 893 (vr_desc_t *)kmem_zalloc(n * sizeof (vr_desc_t), KM_SLEEP); 894 895 /* 896 * Interlink the descriptors and connect host- to chip descriptors. 897 */ 898 for (i = 0; i < n; i++) { 899 /* 900 * Connect the host descriptor to a chip descriptor. 901 */ 902 ring->desc[i].cdesc = &ring->cdesc[i]; 903 904 /* 905 * Store the DMA address and offset in the descriptor 906 * Offset is for ddi_dma_sync() and paddr is for ddi_get/-put(). 907 */ 908 ring->desc[i].offset = i * sizeof (vr_chip_desc_t); 909 ring->desc[i].paddr = ring->cdesc_paddr + ring->desc[i].offset; 910 911 /* 912 * Link the previous descriptor to this one. 913 */ 914 if (i > 0) { 915 /* Host */ 916 ring->desc[i-1].next = &ring->desc[i]; 917 918 /* Chip */ 919 ddi_put32(ring->acchdl, 920 &ring->cdesc[i-1].next, 921 ring->desc[i].paddr); 922 } 923 } 924 925 /* 926 * Make rings out of this list by pointing last to first. 927 */ 928 i = n - 1; 929 ring->desc[i].next = &ring->desc[0]; 930 ddi_put32(ring->acchdl, &ring->cdesc[i].next, ring->desc[0].paddr); 931 return (VR_SUCCESS); 932 } 933 934 /* 935 * Free the memory allocated for a ring. 936 */ 937 static void 938 vr_free_ring(vr_ring_t *r, size_t n) 939 { 940 /* 941 * Unmap and free the chip descriptors. 942 */ 943 (void) ddi_dma_unbind_handle(r->handle); 944 ddi_dma_mem_free(&r->acchdl); 945 ddi_dma_free_handle(&r->handle); 946 947 /* 948 * Free the memory for storing host descriptors 949 */ 950 kmem_free(r->desc, n * sizeof (vr_desc_t)); 951 } 952 953 /* 954 * Initialize the receive ring. 955 */ 956 static vr_result_t 957 vr_rxring_init(vr_t *vrp) 958 { 959 int i, rc; 960 vr_desc_t *rp; 961 962 /* 963 * Set the read pointer at the start of the ring. 964 */ 965 vrp->rx.rp = &vrp->rx.ring[0]; 966 967 /* 968 * Assign a DMA buffer to each receive descriptor. 969 */ 970 for (i = 0; i < vrp->rx.ndesc; i++) { 971 rp = &vrp->rx.ring[i]; 972 rc = vr_alloc_dmabuf(vrp, 973 &vrp->rx.ring[i].dmabuf, 974 DDI_DMA_STREAMING | DDI_DMA_READ); 975 976 if (rc != VR_SUCCESS) { 977 while (--i >= 0) 978 vr_free_dmabuf(&vrp->rx.ring[i].dmabuf); 979 return (VR_FAILURE); 980 } 981 982 /* 983 * Store the address of the dma buffer in the chip descriptor 984 */ 985 ddi_put32(vrp->rxring.acchdl, 986 &rp->cdesc->data, 987 rp->dmabuf.paddr); 988 989 /* 990 * Put the buffer length in the chip descriptor. Ensure that 991 * length fits in the 11 bits of stat1 (2047/0x7FF) 992 */ 993 ddi_put32(vrp->rxring.acchdl, &rp->cdesc->stat1, 994 MIN(VR_MAX_PKTSZ, rp->dmabuf.bufsz)); 995 996 /* 997 * Set descriptor ownership to the card 998 */ 999 ddi_put32(vrp->rxring.acchdl, &rp->cdesc->stat0, VR_RDES0_OWN); 1000 1001 /* 1002 * Sync the descriptor with main memory 1003 */ 1004 (void) ddi_dma_sync(vrp->rxring.handle, rp->offset, 1005 sizeof (vr_chip_desc_t), DDI_DMA_SYNC_FORDEV); 1006 } 1007 return (VR_SUCCESS); 1008 } 1009 1010 /* 1011 * Free the DMA buffers assigned to the receive ring. 1012 */ 1013 static void 1014 vr_rxring_fini(vr_t *vrp) 1015 { 1016 int i; 1017 1018 for (i = 0; i < vrp->rx.ndesc; i++) 1019 vr_free_dmabuf(&vrp->rx.ring[i].dmabuf); 1020 } 1021 1022 static vr_result_t 1023 vr_txring_init(vr_t *vrp) 1024 { 1025 vr_desc_t *wp; 1026 int i, rc; 1027 1028 /* 1029 * Set the write- and claim pointer. 1030 */ 1031 vrp->tx.wp = &vrp->tx.ring[0]; 1032 vrp->tx.cp = &vrp->tx.ring[0]; 1033 1034 /* 1035 * (Re)set the TX bookkeeping. 1036 */ 1037 vrp->tx.stallticks = 0; 1038 vrp->tx.resched = 0; 1039 1040 /* 1041 * Every transmit decreases nfree. Every reclaim increases nfree. 1042 */ 1043 vrp->tx.nfree = vrp->tx.ndesc; 1044 1045 /* 1046 * Attach a DMA buffer to each transmit descriptor. 1047 */ 1048 for (i = 0; i < vrp->tx.ndesc; i++) { 1049 rc = vr_alloc_dmabuf(vrp, 1050 &vrp->tx.ring[i].dmabuf, 1051 DDI_DMA_STREAMING | DDI_DMA_WRITE); 1052 1053 if (rc != VR_SUCCESS) { 1054 while (--i >= 0) 1055 vr_free_dmabuf(&vrp->tx.ring[i].dmabuf); 1056 return (VR_FAILURE); 1057 } 1058 } 1059 1060 /* 1061 * Init & sync the TX descriptors so the device sees a valid ring. 1062 */ 1063 for (i = 0; i < vrp->tx.ndesc; i++) { 1064 wp = &vrp->tx.ring[i]; 1065 ddi_put32(vrp->txring.acchdl, &wp->cdesc->stat0, 0); 1066 ddi_put32(vrp->txring.acchdl, &wp->cdesc->stat1, 0); 1067 ddi_put32(vrp->txring.acchdl, &wp->cdesc->data, 1068 wp->dmabuf.paddr); 1069 (void) ddi_dma_sync(vrp->txring.handle, wp->offset, 1070 sizeof (vr_chip_desc_t), 1071 DDI_DMA_SYNC_FORDEV); 1072 } 1073 return (VR_SUCCESS); 1074 } 1075 1076 /* 1077 * Free the DMA buffers attached to the TX ring. 1078 */ 1079 static void 1080 vr_txring_fini(vr_t *vrp) 1081 { 1082 int i; 1083 1084 /* 1085 * Free the DMA buffers attached to the TX ring 1086 */ 1087 for (i = 0; i < vrp->tx.ndesc; i++) 1088 vr_free_dmabuf(&vrp->tx.ring[i].dmabuf); 1089 } 1090 1091 /* 1092 * Allocate a DMA buffer. 1093 */ 1094 static vr_result_t 1095 vr_alloc_dmabuf(vr_t *vrp, vr_data_dma_t *dmap, uint_t dmaflags) 1096 { 1097 ddi_dma_cookie_t dma_cookie; 1098 uint_t cookiecnt; 1099 int rc; 1100 1101 /* 1102 * Allocate a DMA handle for the buffer 1103 */ 1104 rc = ddi_dma_alloc_handle(vrp->devinfo, 1105 &vr_data_dma_attr, 1106 DDI_DMA_DONTWAIT, NULL, 1107 &dmap->handle); 1108 1109 if (rc != DDI_SUCCESS) { 1110 vr_log(vrp, CE_WARN, 1111 "ddi_dma_alloc_handle failed in vr_alloc_dmabuf"); 1112 return (VR_FAILURE); 1113 } 1114 1115 /* 1116 * Allocate the buffer 1117 * The allocated buffer is aligned on 2K boundary. This ensures that 1118 * a 1500 byte frame never cross a page boundary and thus that the DMA 1119 * mapping can be established in 1 fragment. 1120 */ 1121 rc = ddi_dma_mem_alloc(dmap->handle, 1122 VR_DMABUFSZ, 1123 &vr_data_dma_accattr, 1124 DDI_DMA_RDWR | DDI_DMA_STREAMING, 1125 DDI_DMA_DONTWAIT, NULL, 1126 &dmap->buf, 1127 &dmap->bufsz, 1128 &dmap->acchdl); 1129 1130 if (rc != DDI_SUCCESS) { 1131 vr_log(vrp, CE_WARN, 1132 "ddi_dma_mem_alloc failed in vr_alloc_dmabuf"); 1133 ddi_dma_free_handle(&dmap->handle); 1134 return (VR_FAILURE); 1135 } 1136 1137 /* 1138 * Map the memory 1139 */ 1140 rc = ddi_dma_addr_bind_handle(dmap->handle, 1141 NULL, 1142 (caddr_t)dmap->buf, 1143 dmap->bufsz, 1144 dmaflags, 1145 DDI_DMA_DONTWAIT, 1146 NULL, 1147 &dma_cookie, 1148 &cookiecnt); 1149 1150 /* 1151 * The cookiecount should never > 1 because we requested 2K alignment 1152 */ 1153 if (rc != DDI_DMA_MAPPED || cookiecnt > 1) { 1154 vr_log(vrp, CE_WARN, 1155 "dma_addr_bind_handle failed in vr_alloc_dmabuf: " 1156 "rc = %d, cookiecnt = %d", rc, cookiecnt); 1157 ddi_dma_mem_free(&dmap->acchdl); 1158 ddi_dma_free_handle(&dmap->handle); 1159 return (VR_FAILURE); 1160 } 1161 dmap->paddr = dma_cookie.dmac_address; 1162 return (VR_SUCCESS); 1163 } 1164 1165 /* 1166 * Destroy a DMA buffer. 1167 */ 1168 static void 1169 vr_free_dmabuf(vr_data_dma_t *dmap) 1170 { 1171 (void) ddi_dma_unbind_handle(dmap->handle); 1172 ddi_dma_mem_free(&dmap->acchdl); 1173 ddi_dma_free_handle(&dmap->handle); 1174 } 1175 1176 /* 1177 * Interrupt service routine 1178 * When our vector is shared with another device, av_dispatch_autovect calls 1179 * all service routines for the vector until *none* of them return claimed 1180 * That means that, when sharing vectors, this routine is called at least 1181 * twice for each interrupt. 1182 */ 1183 uint_t 1184 vr_intr(caddr_t arg1, caddr_t arg2) 1185 { 1186 vr_t *vrp; 1187 uint16_t status; 1188 mblk_t *lp = NULL; 1189 uint32_t tx_resched; 1190 uint32_t link_change; 1191 1192 tx_resched = 0; 1193 link_change = 0; 1194 vrp = (void *)arg1; 1195 _NOTE(ARGUNUSED(arg2)) 1196 1197 mutex_enter(&vrp->intrlock); 1198 /* 1199 * If the driver is not in running state it is not our interrupt. 1200 * Shared interrupts can end up here without us being started. 1201 */ 1202 if (vrp->chip.state != CHIPSTATE_RUNNING) { 1203 mutex_exit(&vrp->intrlock); 1204 return (DDI_INTR_UNCLAIMED); 1205 } 1206 1207 /* 1208 * Read the status register to see if the interrupt is from our device 1209 * This read also ensures that posted writes are brought to main memory. 1210 */ 1211 status = VR_GET16(vrp->acc_reg, VR_ISR0) & VR_ICR0_CFG; 1212 if (status == 0) { 1213 /* 1214 * Status contains no configured interrupts 1215 * The interrupt was not generated by our device. 1216 */ 1217 vrp->stats.intr_unclaimed++; 1218 mutex_exit(&vrp->intrlock); 1219 return (DDI_INTR_UNCLAIMED); 1220 } 1221 vrp->stats.intr_claimed++; 1222 1223 /* 1224 * Acknowledge the event(s) that caused interruption. 1225 */ 1226 VR_PUT16(vrp->acc_reg, VR_ISR0, status); 1227 1228 /* 1229 * Receive completion. 1230 */ 1231 if ((status & (VR_ISR0_RX_DONE | VR_ISR_RX_ERR_BITS)) != 0) { 1232 /* 1233 * Received some packets. 1234 */ 1235 lp = vr_receive(vrp); 1236 1237 /* 1238 * DMA stops after a conflict in the FIFO. 1239 */ 1240 if ((status & VR_ISR_RX_ERR_BITS) != 0) 1241 VR_PUT8(vrp->acc_reg, VR_CTRL0, VR_CTRL0_DMA_GO); 1242 status &= ~(VR_ISR0_RX_DONE | VR_ISR_RX_ERR_BITS); 1243 } 1244 1245 /* 1246 * Transmit completion. 1247 */ 1248 if ((status & (VR_ISR0_TX_DONE | VR_ISR_TX_ERR_BITS)) != 0) { 1249 /* 1250 * Card done with transmitting some packets 1251 * TX_DONE is generated 3 times per ring but it appears 1252 * more often because it is also set when an RX_DONE 1253 * interrupt is generated. 1254 */ 1255 mutex_enter(&vrp->tx.lock); 1256 vr_tx_reclaim(vrp); 1257 tx_resched = vrp->tx.resched; 1258 vrp->tx.resched = 0; 1259 mutex_exit(&vrp->tx.lock); 1260 status &= ~(VR_ISR0_TX_DONE | VR_ISR_TX_ERR_BITS); 1261 } 1262 1263 /* 1264 * Link status change. 1265 */ 1266 if ((status & VR_ICR0_LINKSTATUS) != 0) { 1267 /* 1268 * Get new link state and inform the mac layer. 1269 */ 1270 mutex_enter(&vrp->oplock); 1271 mutex_enter(&vrp->tx.lock); 1272 vr_link_state(vrp); 1273 mutex_exit(&vrp->tx.lock); 1274 mutex_exit(&vrp->oplock); 1275 status &= ~VR_ICR0_LINKSTATUS; 1276 vrp->stats.linkchanges++; 1277 link_change = 1; 1278 } 1279 1280 /* 1281 * Bus error. 1282 */ 1283 if ((status & VR_ISR0_BUSERR) != 0) { 1284 vr_log(vrp, CE_WARN, "bus error occured"); 1285 vrp->reset = 1; 1286 status &= ~VR_ISR0_BUSERR; 1287 } 1288 1289 /* 1290 * We must have handled all things here. 1291 */ 1292 ASSERT(status == 0); 1293 mutex_exit(&vrp->intrlock); 1294 1295 /* 1296 * Reset the device if requested 1297 * The request can come from the periodic tx check or from the interrupt 1298 * status. 1299 */ 1300 if (vrp->reset != 0) { 1301 vr_error(vrp); 1302 vrp->reset = 0; 1303 } 1304 1305 /* 1306 * Pass up the list with received packets. 1307 */ 1308 if (lp != NULL) 1309 mac_rx(vrp->machdl, 0, lp); 1310 1311 /* 1312 * Inform the upper layer on the linkstatus if there was a change. 1313 */ 1314 if (link_change != 0) 1315 mac_link_update(vrp->machdl, 1316 (link_state_t)vrp->chip.link.state); 1317 /* 1318 * Restart transmissions if we were waiting for tx descriptors. 1319 */ 1320 if (tx_resched == 1) 1321 mac_tx_update(vrp->machdl); 1322 1323 /* 1324 * Read something from the card to ensure that all of our configuration 1325 * writes are delivered to the device before the interrupt is ended. 1326 */ 1327 (void) VR_GET8(vrp->acc_reg, VR_ETHERADDR); 1328 return (DDI_INTR_CLAIMED); 1329 } 1330 1331 /* 1332 * Respond to an unforseen situation by resetting the card and our bookkeeping. 1333 */ 1334 static void 1335 vr_error(vr_t *vrp) 1336 { 1337 vr_log(vrp, CE_WARN, "resetting MAC."); 1338 mutex_enter(&vrp->intrlock); 1339 mutex_enter(&vrp->oplock); 1340 mutex_enter(&vrp->tx.lock); 1341 (void) vr_stop(vrp); 1342 vr_reset(vrp); 1343 (void) vr_start(vrp); 1344 mutex_exit(&vrp->tx.lock); 1345 mutex_exit(&vrp->oplock); 1346 mutex_exit(&vrp->intrlock); 1347 vrp->stats.resets++; 1348 } 1349 1350 /* 1351 * Collect received packets in a list. 1352 */ 1353 static mblk_t * 1354 vr_receive(vr_t *vrp) 1355 { 1356 mblk_t *lp, *mp, *np; 1357 vr_desc_t *rxp; 1358 vr_data_dma_t *dmap; 1359 uint32_t pklen; 1360 uint32_t rxstat0; 1361 uint32_t n; 1362 1363 lp = NULL; 1364 n = 0; 1365 for (rxp = vrp->rx.rp; ; rxp = rxp->next, n++) { 1366 /* 1367 * Sync the descriptor before looking at it. 1368 */ 1369 (void) ddi_dma_sync(vrp->rxring.handle, rxp->offset, 1370 sizeof (vr_chip_desc_t), DDI_DMA_SYNC_FORKERNEL); 1371 1372 /* 1373 * Get the status from the descriptor. 1374 */ 1375 rxstat0 = ddi_get32(vrp->rxring.acchdl, &rxp->cdesc->stat0); 1376 1377 /* 1378 * We're done if the descriptor is owned by the card. 1379 */ 1380 if ((rxstat0 & VR_RDES0_OWN) != 0) 1381 break; 1382 else if ((rxstat0 & VR_RDES0_RXOK) != 0) { 1383 /* 1384 * Received a good packet 1385 */ 1386 dmap = &rxp->dmabuf; 1387 pklen = (rxstat0 >> 16) - ETHERFCSL; 1388 1389 /* 1390 * Sync the data. 1391 */ 1392 (void) ddi_dma_sync(dmap->handle, 0, 1393 pklen, DDI_DMA_SYNC_FORKERNEL); 1394 1395 /* 1396 * Send a new copied message upstream. 1397 */ 1398 np = allocb(pklen, 0); 1399 if (np != NULL) { 1400 bcopy(dmap->buf, np->b_rptr, pklen); 1401 np->b_wptr = np->b_rptr + pklen; 1402 1403 vrp->stats.mac_stat_ipackets++; 1404 vrp->stats.mac_stat_rbytes += pklen; 1405 1406 if ((rxstat0 & VR_RDES0_BAR) != 0) 1407 vrp->stats.mac_stat_brdcstrcv++; 1408 else if ((rxstat0 & VR_RDES0_MAR) != 0) 1409 vrp->stats.mac_stat_multircv++; 1410 1411 /* 1412 * Link this packet in the list. 1413 */ 1414 np->b_next = NULL; 1415 if (lp == NULL) 1416 lp = mp = np; 1417 else { 1418 mp->b_next = np; 1419 mp = np; 1420 } 1421 } else { 1422 vrp->stats.allocbfail++; 1423 vrp->stats.mac_stat_norcvbuf++; 1424 } 1425 1426 } else { 1427 /* 1428 * Received with errors. 1429 */ 1430 vrp->stats.mac_stat_ierrors++; 1431 if ((rxstat0 & VR_RDES0_FAE) != 0) 1432 vrp->stats.ether_stat_align_errors++; 1433 if ((rxstat0 & VR_RDES0_CRCERR) != 0) 1434 vrp->stats.ether_stat_fcs_errors++; 1435 if ((rxstat0 & VR_RDES0_LONG) != 0) 1436 vrp->stats.ether_stat_toolong_errors++; 1437 if ((rxstat0 & VR_RDES0_RUNT) != 0) 1438 vrp->stats.ether_stat_tooshort_errors++; 1439 if ((rxstat0 & VR_RDES0_FOV) != 0) 1440 vrp->stats.mac_stat_overflows++; 1441 } 1442 1443 /* 1444 * Reset descriptor ownership to the MAC. 1445 */ 1446 ddi_put32(vrp->rxring.acchdl, 1447 &rxp->cdesc->stat0, 1448 VR_RDES0_OWN); 1449 (void) ddi_dma_sync(vrp->rxring.handle, 1450 rxp->offset, 1451 sizeof (vr_chip_desc_t), 1452 DDI_DMA_SYNC_FORDEV); 1453 } 1454 vrp->rx.rp = rxp; 1455 1456 /* 1457 * If we do flowcontrol and if the card can transmit pause frames, 1458 * increment the "available receive descriptors" register. 1459 */ 1460 if (n > 0 && vrp->chip.link.flowctrl == VR_PAUSE_BIDIRECTIONAL) { 1461 /* 1462 * Whenever the card moves a fragment to host memory it 1463 * decrements the RXBUFCOUNT register. If the value in the 1464 * register reaches a low watermark, the card transmits a pause 1465 * frame. If the value in this register reaches a high 1466 * watermark, the card sends a "cancel pause" frame 1467 * 1468 * Non-zero values written to this byte register are added 1469 * by the chip to the register's contents, so we must write 1470 * the number of descriptors free'd. 1471 */ 1472 VR_PUT8(vrp->acc_reg, VR_FCR0_RXBUFCOUNT, MIN(n, 0xFF)); 1473 } 1474 return (lp); 1475 } 1476 1477 /* 1478 * Enqueue a list of packets for transmission 1479 * Return the packets not transmitted. 1480 */ 1481 mblk_t * 1482 vr_mac_tx_enqueue_list(void *p, mblk_t *mp) 1483 { 1484 vr_t *vrp; 1485 mblk_t *nextp; 1486 1487 vrp = (vr_t *)p; 1488 mutex_enter(&vrp->tx.lock); 1489 do { 1490 if (vrp->tx.nfree == 0) { 1491 vrp->stats.ether_stat_defer_xmts++; 1492 vrp->tx.resched = 1; 1493 break; 1494 } 1495 nextp = mp->b_next; 1496 mp->b_next = mp->b_prev = NULL; 1497 vr_tx_enqueue_msg(vrp, mp); 1498 mp = nextp; 1499 vrp->tx.nfree--; 1500 } while (mp != NULL); 1501 mutex_exit(&vrp->tx.lock); 1502 1503 /* 1504 * Tell the chip to poll the TX ring. 1505 */ 1506 VR_PUT8(vrp->acc_reg, VR_CTRL0, VR_CTRL0_DMA_GO); 1507 return (mp); 1508 } 1509 1510 /* 1511 * Enqueue a message for transmission. 1512 */ 1513 static void 1514 vr_tx_enqueue_msg(vr_t *vrp, mblk_t *mp) 1515 { 1516 vr_desc_t *wp; 1517 vr_data_dma_t *dmap; 1518 uint32_t pklen; 1519 uint32_t nextp; 1520 int padlen; 1521 1522 if ((uchar_t)mp->b_rptr[0] == 0xff && 1523 (uchar_t)mp->b_rptr[1] == 0xff && 1524 (uchar_t)mp->b_rptr[2] == 0xff && 1525 (uchar_t)mp->b_rptr[3] == 0xff && 1526 (uchar_t)mp->b_rptr[4] == 0xff && 1527 (uchar_t)mp->b_rptr[5] == 0xff) 1528 vrp->stats.mac_stat_brdcstxmt++; 1529 else if ((uchar_t)mp->b_rptr[0] == 1) 1530 vrp->stats.mac_stat_multixmt++; 1531 1532 pklen = msgsize(mp); 1533 wp = vrp->tx.wp; 1534 dmap = &wp->dmabuf; 1535 1536 /* 1537 * Copy the message into the pre-mapped buffer and free mp 1538 */ 1539 mcopymsg(mp, dmap->buf); 1540 1541 /* 1542 * Clean padlen bytes of short packet. 1543 */ 1544 padlen = ETHERMIN - pklen; 1545 if (padlen > 0) { 1546 bzero(dmap->buf + pklen, padlen); 1547 pklen += padlen; 1548 } 1549 1550 /* 1551 * Most of the statistics are updated on reclaim, after the actual 1552 * transmit. obytes is maintained here because the length is cleared 1553 * after transmission 1554 */ 1555 vrp->stats.mac_stat_obytes += pklen; 1556 1557 /* 1558 * Sync the data so the device sees the new content too. 1559 */ 1560 (void) ddi_dma_sync(dmap->handle, 0, pklen, DDI_DMA_SYNC_FORDEV); 1561 1562 /* 1563 * If we have reached the TX interrupt distance, enable a TX interrupt 1564 * for this packet. The Interrupt Control (IC) bit in the transmit 1565 * descriptor doesn't have any effect on the interrupt generation 1566 * despite the vague statements in the datasheet. Thus, we use the 1567 * more obscure interrupt suppress bit which is probably part of the 1568 * MAC's bookkeeping for TX interrupts and fragmented packets. 1569 */ 1570 vrp->tx.intr_distance++; 1571 nextp = ddi_get32(vrp->txring.acchdl, &wp->cdesc->next); 1572 if (vrp->tx.intr_distance >= VR_TX_MAX_INTR_DISTANCE) { 1573 /* 1574 * Don't suppress the interrupt for this packet. 1575 */ 1576 vrp->tx.intr_distance = 0; 1577 nextp &= (~VR_TDES3_SUPPRESS_INTR); 1578 } else { 1579 /* 1580 * Suppress the interrupt for this packet. 1581 */ 1582 nextp |= VR_TDES3_SUPPRESS_INTR; 1583 } 1584 1585 /* 1586 * Write and sync the chip's descriptor 1587 */ 1588 ddi_put32(vrp->txring.acchdl, &wp->cdesc->stat1, 1589 pklen | (VR_TDES1_STP | VR_TDES1_EDP | VR_TDES1_CHN)); 1590 ddi_put32(vrp->txring.acchdl, &wp->cdesc->next, nextp); 1591 ddi_put32(vrp->txring.acchdl, &wp->cdesc->stat0, VR_TDES0_OWN); 1592 (void) ddi_dma_sync(vrp->txring.handle, wp->offset, 1593 sizeof (vr_chip_desc_t), DDI_DMA_SYNC_FORDEV); 1594 1595 /* 1596 * The ticks counter is cleared by reclaim when it reclaimed some 1597 * descriptors and incremented by the periodic TX stall check. 1598 */ 1599 vrp->tx.stallticks = 1; 1600 vrp->tx.wp = wp->next; 1601 } 1602 1603 /* 1604 * Free transmitted descriptors. 1605 */ 1606 static void 1607 vr_tx_reclaim(vr_t *vrp) 1608 { 1609 vr_desc_t *cp; 1610 uint32_t stat0, stat1, freed, dirty; 1611 1612 ASSERT(mutex_owned(&vrp->tx.lock)); 1613 1614 freed = 0; 1615 dirty = vrp->tx.ndesc - vrp->tx.nfree; 1616 for (cp = vrp->tx.cp; dirty > 0; cp = cp->next) { 1617 /* 1618 * Sync & get descriptor status. 1619 */ 1620 (void) ddi_dma_sync(vrp->txring.handle, cp->offset, 1621 sizeof (vr_chip_desc_t), 1622 DDI_DMA_SYNC_FORKERNEL); 1623 stat0 = ddi_get32(vrp->txring.acchdl, &cp->cdesc->stat0); 1624 1625 if ((stat0 & VR_TDES0_OWN) != 0) 1626 break; 1627 1628 /* 1629 * Do stats for the first descriptor in a chain. 1630 */ 1631 stat1 = ddi_get32(vrp->txring.acchdl, &cp->cdesc->stat1); 1632 if ((stat1 & VR_TDES1_STP) != 0) { 1633 if ((stat0 & VR_TDES0_TERR) != 0) { 1634 vrp->stats.ether_stat_macxmt_errors++; 1635 if ((stat0 & VR_TDES0_UDF) != 0) 1636 vrp->stats.mac_stat_underflows++; 1637 if ((stat0 & VR_TDES0_ABT) != 0) 1638 vrp-> stats.ether_stat_ex_collisions++; 1639 /* 1640 * Abort and FIFO underflow stop the MAC. 1641 * Packet queueing must be disabled with HD 1642 * links because otherwise the MAC is also lost 1643 * after a few of these events. 1644 */ 1645 VR_PUT8(vrp->acc_reg, VR_CTRL0, 1646 VR_CTRL0_DMA_GO); 1647 } else 1648 vrp->stats.mac_stat_opackets++; 1649 1650 if ((stat0 & VR_TDES0_COL) != 0) { 1651 if ((stat0 & VR_TDES0_NCR) == 1) { 1652 vrp->stats. 1653 ether_stat_first_collisions++; 1654 } else { 1655 vrp->stats. 1656 ether_stat_multi_collisions++; 1657 } 1658 vrp->stats.mac_stat_collisions += 1659 (stat0 & VR_TDES0_NCR); 1660 } 1661 1662 if ((stat0 & VR_TDES0_CRS) != 0) 1663 vrp->stats.ether_stat_carrier_errors++; 1664 1665 if ((stat0 & VR_TDES0_OWC) != 0) 1666 vrp->stats.ether_stat_tx_late_collisions++; 1667 } 1668 freed += 1; 1669 dirty -= 1; 1670 } 1671 vrp->tx.cp = cp; 1672 1673 if (freed > 0) { 1674 vrp->tx.nfree += freed; 1675 vrp->tx.stallticks = 0; 1676 vrp->stats.txreclaims += 1; 1677 } else 1678 vrp->stats.txreclaim0 += 1; 1679 } 1680 1681 /* 1682 * Check TX health every 2 seconds. 1683 */ 1684 static void 1685 vr_periodic(void *p) 1686 { 1687 vr_t *vrp; 1688 1689 vrp = (vr_t *)p; 1690 if (vrp->chip.state == CHIPSTATE_RUNNING && 1691 vrp->chip.link.state == VR_LINK_STATE_UP && vrp->reset == 0) { 1692 if (mutex_tryenter(&vrp->intrlock) != 0) { 1693 mutex_enter(&vrp->tx.lock); 1694 if (vrp->tx.resched == 1) { 1695 if (vrp->tx.stallticks >= VR_MAXTXCHECKS) { 1696 /* 1697 * No succesful reclaim in the last n 1698 * intervals. Reset the MAC. 1699 */ 1700 vrp->reset = 1; 1701 vr_log(vrp, CE_WARN, 1702 "TX stalled, resetting MAC"); 1703 vrp->stats.txstalls++; 1704 } else { 1705 /* 1706 * Increase until we find that we've 1707 * waited long enough. 1708 */ 1709 vrp->tx.stallticks += 1; 1710 } 1711 } 1712 mutex_exit(&vrp->tx.lock); 1713 mutex_exit(&vrp->intrlock); 1714 vrp->stats.txchecks++; 1715 } 1716 } 1717 vrp->stats.cyclics++; 1718 } 1719 1720 /* 1721 * Bring the device to our desired initial state. 1722 */ 1723 static void 1724 vr_reset(vr_t *vrp) 1725 { 1726 uint32_t time; 1727 1728 /* 1729 * Reset the MAC 1730 * If we don't wait long enough for the forced reset to complete, 1731 * MAC looses sync with PHY. Result link up, no link change interrupt 1732 * and no data transfer. 1733 */ 1734 time = 0; 1735 VR_PUT8(vrp->acc_io, VR_CTRL1, VR_CTRL1_RESET); 1736 do { 1737 drv_usecwait(100); 1738 time += 100; 1739 if (time >= 100000) { 1740 VR_PUT8(vrp->acc_io, VR_MISC1, VR_MISC1_RESET); 1741 delay(drv_usectohz(200000)); 1742 } 1743 } while ((VR_GET8(vrp->acc_io, VR_CTRL1) & VR_CTRL1_RESET) != 0); 1744 delay(drv_usectohz(10000)); 1745 1746 /* 1747 * Load the PROM contents into the MAC again. 1748 */ 1749 VR_SETBIT8(vrp->acc_io, VR_PROMCTL, VR_PROMCTL_RELOAD); 1750 delay(drv_usectohz(100000)); 1751 1752 /* 1753 * Tell the MAC via IO space that we like to use memory space for 1754 * accessing registers. 1755 */ 1756 VR_SETBIT8(vrp->acc_io, VR_CFGD, VR_CFGD_MMIOEN); 1757 } 1758 1759 /* 1760 * Prepare and enable the card (MAC + PHY + PCI). 1761 */ 1762 static int 1763 vr_start(vr_t *vrp) 1764 { 1765 uint8_t pci_latency, pci_mode; 1766 1767 ASSERT(mutex_owned(&vrp->oplock)); 1768 1769 /* 1770 * Allocate DMA buffers for RX. 1771 */ 1772 if (vr_rxring_init(vrp) != VR_SUCCESS) { 1773 vr_log(vrp, CE_NOTE, "vr_rxring_init() failed"); 1774 return (ENOMEM); 1775 } 1776 1777 /* 1778 * Allocate DMA buffers for TX. 1779 */ 1780 if (vr_txring_init(vrp) != VR_SUCCESS) { 1781 vr_log(vrp, CE_NOTE, "vr_txring_init() failed"); 1782 vr_rxring_fini(vrp); 1783 return (ENOMEM); 1784 } 1785 1786 /* 1787 * Changes of the chip specific registers as done in VIA's fet driver 1788 * These bits are not in the datasheet and controlled by vr_chip_info. 1789 */ 1790 pci_mode = VR_GET8(vrp->acc_reg, VR_MODE2); 1791 if ((vrp->chip.info.bugs & VR_BUG_NEEDMODE10T) != 0) 1792 pci_mode |= VR_MODE2_MODE10T; 1793 1794 if ((vrp->chip.info.bugs & VR_BUG_NEEDMODE2PCEROPT) != 0) 1795 pci_mode |= VR_MODE2_PCEROPT; 1796 1797 if ((vrp->chip.info.features & VR_FEATURE_MRDLNMULTIPLE) != 0) 1798 pci_mode |= VR_MODE2_MRDPL; 1799 VR_PUT8(vrp->acc_reg, VR_MODE2, pci_mode); 1800 1801 pci_mode = VR_GET8(vrp->acc_reg, VR_MODE3); 1802 if ((vrp->chip.info.bugs & VR_BUG_NEEDMIION) != 0) 1803 pci_mode |= VR_MODE3_MIION; 1804 VR_PUT8(vrp->acc_reg, VR_MODE3, pci_mode); 1805 1806 /* 1807 * RX: Accept broadcast packets. 1808 */ 1809 VR_SETBIT8(vrp->acc_reg, VR_RXCFG, VR_RXCFG_ACCEPTBROAD); 1810 1811 /* 1812 * RX: Start DMA when there are 256 bytes in the FIFO. 1813 */ 1814 VR_SETBITS8(vrp->acc_reg, VR_RXCFG, VR_RXCFG_FIFO_THRESHOLD_BITS, 1815 VR_RXCFG_FIFO_THRESHOLD_256); 1816 VR_SETBITS8(vrp->acc_reg, VR_BCR0, VR_BCR0_RX_FIFO_THRESHOLD_BITS, 1817 VR_BCR0_RX_FIFO_THRESHOLD_256); 1818 1819 /* 1820 * TX: Start transmit when there are 256 bytes in the FIFO. 1821 */ 1822 VR_SETBITS8(vrp->acc_reg, VR_TXCFG, VR_TXCFG_FIFO_THRESHOLD_BITS, 1823 VR_TXCFG_FIFO_THRESHOLD_256); 1824 VR_SETBITS8(vrp->acc_reg, VR_BCR1, VR_BCR1_TX_FIFO_THRESHOLD_BITS, 1825 VR_BCR1_TX_FIFO_THRESHOLD_256); 1826 1827 /* 1828 * Burst transfers up to 256 bytes. 1829 */ 1830 VR_SETBITS8(vrp->acc_reg, VR_BCR0, VR_BCR0_DMABITS, VR_BCR0_DMA256); 1831 1832 /* 1833 * Disable TX autopolling as it is bad for RX performance 1834 * I assume this is because the RX process finds the bus often occupied 1835 * by the polling process. 1836 */ 1837 VR_SETBIT8(vrp->acc_reg, VR_CTRL1, VR_CTRL1_NOAUTOPOLL); 1838 1839 /* 1840 * Honor the PCI latency timer if it is reasonable. 1841 */ 1842 pci_latency = VR_GET8(vrp->acc_cfg, PCI_CONF_LATENCY_TIMER); 1843 if (pci_latency != 0 && pci_latency != 0xFF) 1844 VR_SETBIT8(vrp->acc_reg, VR_CFGB, VR_CFGB_LATENCYTIMER); 1845 else 1846 VR_CLRBIT8(vrp->acc_reg, VR_CFGB, VR_CFGB_LATENCYTIMER); 1847 1848 /* 1849 * Ensure that VLAN filtering is off, because this strips the tag. 1850 */ 1851 if ((vrp->chip.info.features & VR_FEATURE_VLANTAGGING) != 0) { 1852 VR_CLRBIT8(vrp->acc_reg, VR_BCR1, VR_BCR1_VLANFILTER); 1853 VR_CLRBIT8(vrp->acc_reg, VR_TXCFG, VR_TXCFG_8021PQ_EN); 1854 } 1855 1856 /* 1857 * Clear the CAM filter. 1858 */ 1859 if ((vrp->chip.info.features & VR_FEATURE_CAMSUPPORT) != 0) { 1860 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, VR_CAM_CTRL_ENABLE); 1861 VR_PUT32(vrp->acc_reg, VR_CAM_MASK, 0); 1862 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, VR_CAM_CTRL_DONE); 1863 1864 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, 1865 VR_CAM_CTRL_ENABLE|VR_CAM_CTRL_SELECT_VLAN); 1866 VR_PUT8(vrp->acc_reg, VR_VCAM0, 0); 1867 VR_PUT8(vrp->acc_reg, VR_VCAM1, 0); 1868 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, VR_CAM_CTRL_WRITE); 1869 VR_PUT32(vrp->acc_reg, VR_CAM_MASK, 1); 1870 drv_usecwait(2); 1871 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, VR_CAM_CTRL_DONE); 1872 } 1873 1874 /* 1875 * Give the start addresses of the descriptor rings to the DMA 1876 * controller on the MAC. 1877 */ 1878 VR_PUT32(vrp->acc_reg, VR_RXADDR, vrp->rx.rp->paddr); 1879 VR_PUT32(vrp->acc_reg, VR_TXADDR, vrp->tx.wp->paddr); 1880 1881 /* 1882 * We don't use the additionally invented interrupt ICR1 register, 1883 * so make sure these are disabled. 1884 */ 1885 VR_PUT8(vrp->acc_reg, VR_ISR1, 0xFF); 1886 VR_PUT8(vrp->acc_reg, VR_ICR1, 0); 1887 1888 /* 1889 * Enable interrupts. 1890 */ 1891 VR_PUT16(vrp->acc_reg, VR_ISR0, 0xFFFF); 1892 VR_PUT16(vrp->acc_reg, VR_ICR0, VR_ICR0_CFG); 1893 1894 /* 1895 * Enable the DMA controller. 1896 */ 1897 VR_PUT8(vrp->acc_reg, VR_CTRL0, VR_CTRL0_DMA_GO); 1898 1899 /* 1900 * Configure the link. Rely on the link change interrupt for getting 1901 * the link state into the driver. 1902 */ 1903 vr_link_init(vrp); 1904 1905 /* 1906 * Set the software view on the state to 'running'. 1907 */ 1908 vrp->chip.state = CHIPSTATE_RUNNING; 1909 return (0); 1910 } 1911 1912 /* 1913 * Stop DMA and interrupts. 1914 */ 1915 static int 1916 vr_stop(vr_t *vrp) 1917 { 1918 ASSERT(mutex_owned(&vrp->oplock)); 1919 1920 /* 1921 * Stop interrupts. 1922 */ 1923 VR_PUT16(vrp->acc_reg, VR_ICR0, 0); 1924 VR_PUT8(vrp->acc_reg, VR_ICR1, 0); 1925 1926 /* 1927 * Stop DMA. 1928 */ 1929 VR_PUT8(vrp->acc_reg, VR_CTRL0, VR_CTRL0_DMA_STOP); 1930 1931 /* 1932 * Set the software view on the state to stopped. 1933 */ 1934 vrp->chip.state = CHIPSTATE_STOPPED; 1935 1936 /* 1937 * Remove DMA buffers from the rings. 1938 */ 1939 vr_rxring_fini(vrp); 1940 vr_txring_fini(vrp); 1941 return (0); 1942 } 1943 1944 int 1945 vr_mac_start(void *p) 1946 { 1947 vr_t *vrp; 1948 int rc; 1949 1950 vrp = (vr_t *)p; 1951 mutex_enter(&vrp->oplock); 1952 1953 /* 1954 * Reset the card. 1955 */ 1956 vr_reset(vrp); 1957 1958 /* 1959 * Prepare and enable the card. 1960 */ 1961 rc = vr_start(vrp); 1962 1963 /* 1964 * Configure a cyclic function to keep the card & driver from diverting. 1965 */ 1966 vrp->periodic_id = 1967 ddi_periodic_add(vr_periodic, vrp, VR_CHECK_INTERVAL, DDI_IPL_0); 1968 1969 mutex_exit(&vrp->oplock); 1970 return (rc); 1971 } 1972 1973 void 1974 vr_mac_stop(void *p) 1975 { 1976 vr_t *vrp = p; 1977 1978 mutex_enter(&vrp->oplock); 1979 mutex_enter(&vrp->tx.lock); 1980 1981 /* 1982 * Stop the device. 1983 */ 1984 (void) vr_stop(vrp); 1985 mutex_exit(&vrp->tx.lock); 1986 1987 /* 1988 * Remove the cyclic from the system. 1989 */ 1990 ddi_periodic_delete(vrp->periodic_id); 1991 mutex_exit(&vrp->oplock); 1992 } 1993 1994 /* 1995 * Add or remove a multicast address to/from the filter 1996 * 1997 * From the 21143 manual: 1998 * The 21143 can store 512 bits serving as hash bucket heads, and one physical 1999 * 48-bit Ethernet address. Incoming frames with multicast destination 2000 * addresses are subjected to imperfect filtering. Frames with physical 2001 * destination addresses are checked against the single physical address. 2002 * For any incoming frame with a multicast destination address, the 21143 2003 * applies the standard Ethernet cyclic redundancy check (CRC) function to the 2004 * first 6 bytes containing the destination address, then it uses the most 2005 * significant 9 bits of the result as a bit index into the table. If the 2006 * indexed bit is set, the frame is accepted. If the bit is cleared, the frame 2007 * is rejected. This filtering mode is called imperfect because multicast 2008 * frames not addressed to this station may slip through, but it still 2009 * decreases the number of frames that the host can receive. 2010 * I assume the above is also the way the VIA chips work. There's not a single 2011 * word about the multicast filter in the datasheet. 2012 * 2013 * Another word on the CAM filter on VT6105M controllers: 2014 * The VT6105M has content addressable memory which can be used for perfect 2015 * filtering of 32 multicast addresses and a few VLAN id's 2016 * 2017 * I think it works like this: When the controller receives a multicast 2018 * address, it looks up the address using CAM. When it is found, it takes the 2019 * matching cell address (index) and compares this to the bit position in the 2020 * cam mask. If the bit is set, the packet is passed up. If CAM lookup does not 2021 * result in a match, the packet is filtered using the hash based filter, 2022 * if that matches, the packet is passed up and dropped otherwise 2023 * Also, there's not a single word in the datasheet on how this cam is supposed 2024 * to work ... 2025 */ 2026 int 2027 vr_mac_set_multicast(void *p, boolean_t add, const uint8_t *mca) 2028 { 2029 vr_t *vrp; 2030 uint32_t crc_index; 2031 int32_t cam_index; 2032 uint32_t cam_mask; 2033 boolean_t use_hash_filter; 2034 ether_addr_t taddr; 2035 uint32_t a; 2036 2037 vrp = (vr_t *)p; 2038 mutex_enter(&vrp->oplock); 2039 mutex_enter(&vrp->intrlock); 2040 use_hash_filter = B_FALSE; 2041 2042 if ((vrp->chip.info.features & VR_FEATURE_CAMSUPPORT) != 0) { 2043 /* 2044 * Program the perfect filter. 2045 */ 2046 cam_mask = VR_GET32(vrp->acc_reg, VR_CAM_MASK); 2047 if (add == B_TRUE) { 2048 /* 2049 * Get index of first empty slot. 2050 */ 2051 bzero(&taddr, sizeof (taddr)); 2052 cam_index = vr_cam_index(vrp, taddr); 2053 if (cam_index != -1) { 2054 /* 2055 * Add address at cam_index. 2056 */ 2057 cam_mask |= (1 << cam_index); 2058 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, 2059 VR_CAM_CTRL_ENABLE); 2060 VR_PUT8(vrp->acc_reg, VR_CAM_ADDR, cam_index); 2061 VR_PUT32(vrp->acc_reg, VR_CAM_MASK, cam_mask); 2062 for (a = 0; a < ETHERADDRL; a++) { 2063 VR_PUT8(vrp->acc_reg, 2064 VR_MCAM0 + a, mca[a]); 2065 } 2066 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, 2067 VR_CAM_CTRL_WRITE); 2068 drv_usecwait(2); 2069 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, 2070 VR_CAM_CTRL_DONE); 2071 } else { 2072 /* 2073 * No free CAM slots available 2074 * Add mca to the imperfect filter. 2075 */ 2076 use_hash_filter = B_TRUE; 2077 } 2078 } else { 2079 /* 2080 * Find the index of the entry to remove 2081 * If the entry was not found (-1), the addition was 2082 * probably done when the table was full. 2083 */ 2084 cam_index = vr_cam_index(vrp, mca); 2085 if (cam_index != -1) { 2086 /* 2087 * Disable the corresponding mask bit. 2088 */ 2089 cam_mask &= ~(1 << cam_index); 2090 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, 2091 VR_CAM_CTRL_ENABLE); 2092 VR_PUT32(vrp->acc_reg, VR_CAM_MASK, cam_mask); 2093 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, 2094 VR_CAM_CTRL_DONE); 2095 } else { 2096 /* 2097 * The entry to be removed was not found 2098 * The likely cause is that the CAM was full 2099 * during addition. The entry is added to the 2100 * hash filter in that case and needs to be 2101 * removed there too. 2102 */ 2103 use_hash_filter = B_TRUE; 2104 } 2105 } 2106 } else { 2107 /* 2108 * No CAM in the MAC, thus we need the hash filter. 2109 */ 2110 use_hash_filter = B_TRUE; 2111 } 2112 2113 if (use_hash_filter == B_TRUE) { 2114 /* 2115 * Get the CRC-32 of the multicast address 2116 * The card uses the "MSB first" direction when calculating the 2117 * the CRC. This is odd because ethernet is "LSB first" 2118 * We have to use that "big endian" approach as well. 2119 */ 2120 crc_index = ether_crc_be(mca) >> (32 - 6); 2121 if (add == B_TRUE) { 2122 /* 2123 * Turn bit[crc_index] on. 2124 */ 2125 if (crc_index < 32) 2126 vrp->mhash0 |= (1 << crc_index); 2127 else 2128 vrp->mhash1 |= (1 << (crc_index - 32)); 2129 } else { 2130 /* 2131 * Turn bit[crc_index] off. 2132 */ 2133 if (crc_index < 32) 2134 vrp->mhash0 &= ~(0 << crc_index); 2135 else 2136 vrp->mhash1 &= ~(0 << (crc_index - 32)); 2137 } 2138 2139 /* 2140 * When not promiscuous write the filter now. When promiscuous, 2141 * the filter is open and will be written when promiscuous ends. 2142 */ 2143 if (vrp->promisc == B_FALSE) { 2144 VR_PUT32(vrp->acc_reg, VR_MAR0, vrp->mhash0); 2145 VR_PUT32(vrp->acc_reg, VR_MAR1, vrp->mhash1); 2146 } 2147 } 2148 2149 /* 2150 * Enable/disable multicast receivements based on mcount. 2151 */ 2152 if (add == B_TRUE) 2153 vrp->mcount++; 2154 else if (vrp->mcount != 0) 2155 vrp->mcount --; 2156 if (vrp->mcount != 0) 2157 VR_SETBIT8(vrp->acc_reg, VR_RXCFG, VR_RXCFG_ACCEPTMULTI); 2158 else 2159 VR_CLRBIT8(vrp->acc_reg, VR_RXCFG, VR_RXCFG_ACCEPTMULTI); 2160 2161 mutex_exit(&vrp->intrlock); 2162 mutex_exit(&vrp->oplock); 2163 return (0); 2164 } 2165 2166 /* 2167 * Calculate the CRC32 for 6 bytes of multicast address in MSB(it) first order. 2168 * The MSB first order is a bit odd because Ethernet standard is LSB first 2169 */ 2170 static uint32_t 2171 ether_crc_be(const uint8_t *data) 2172 { 2173 uint32_t crc = (uint32_t)0xFFFFFFFFU; 2174 uint32_t carry; 2175 uint32_t bit; 2176 uint32_t length; 2177 uint8_t c; 2178 2179 for (length = 0; length < ETHERADDRL; length++) { 2180 c = data[length]; 2181 for (bit = 0; bit < 8; bit++) { 2182 carry = ((crc & 0x80000000U) ? 1 : 0) ^ (c & 0x01); 2183 crc <<= 1; 2184 c >>= 1; 2185 if (carry) 2186 crc = (crc ^ 0x04C11DB6) | carry; 2187 } 2188 } 2189 return (crc); 2190 } 2191 2192 2193 /* 2194 * Return the CAM index (base 0) of maddr or -1 if maddr is not found 2195 * If maddr is 0, return the index of an empty slot in CAM or -1 when no free 2196 * slots available. 2197 */ 2198 static int32_t 2199 vr_cam_index(vr_t *vrp, const uint8_t *maddr) 2200 { 2201 ether_addr_t taddr; 2202 int32_t index; 2203 uint32_t mask; 2204 uint32_t a; 2205 2206 bzero(&taddr, sizeof (taddr)); 2207 2208 /* 2209 * Read the CAM mask from the controller. 2210 */ 2211 mask = VR_GET32(vrp->acc_reg, VR_CAM_MASK); 2212 2213 /* 2214 * If maddr is 0, return the first unused slot or -1 for no unused. 2215 */ 2216 if (bcmp(maddr, taddr, ETHERADDRL) == 0) { 2217 /* 2218 * Look for the first unused position in mask. 2219 */ 2220 for (index = 0; index < VR_CAM_SZ; index++) { 2221 if (((mask >> index) & 1) == 0) 2222 return (index); 2223 } 2224 return (-1); 2225 } else { 2226 /* 2227 * Look for maddr in CAM. 2228 */ 2229 for (index = 0; index < VR_CAM_SZ; index++) { 2230 /* Look at enabled entries only */ 2231 if (((mask >> index) & 1) == 0) 2232 continue; 2233 2234 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, VR_CAM_CTRL_ENABLE); 2235 VR_PUT8(vrp->acc_reg, VR_CAM_ADDR, index); 2236 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, VR_CAM_CTRL_READ); 2237 drv_usecwait(2); 2238 for (a = 0; a < ETHERADDRL; a++) 2239 taddr[a] = VR_GET8(vrp->acc_reg, VR_MCAM0 + a); 2240 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, VR_CAM_CTRL_DONE); 2241 if (bcmp(maddr, taddr, ETHERADDRL) == 0) 2242 return (index); 2243 } 2244 } 2245 return (-1); 2246 } 2247 2248 /* 2249 * Set promiscuous mode on or off. 2250 */ 2251 int 2252 vr_mac_set_promisc(void *p, boolean_t promiscflag) 2253 { 2254 vr_t *vrp; 2255 uint8_t rxcfg; 2256 2257 vrp = (vr_t *)p; 2258 2259 mutex_enter(&vrp->intrlock); 2260 mutex_enter(&vrp->oplock); 2261 mutex_enter(&vrp->tx.lock); 2262 2263 /* 2264 * Get current receive configuration. 2265 */ 2266 rxcfg = VR_GET8(vrp->acc_reg, VR_RXCFG); 2267 vrp->promisc = promiscflag; 2268 2269 if (promiscflag == B_TRUE) { 2270 /* 2271 * Enable promiscuous mode and open the multicast filter. 2272 */ 2273 rxcfg |= (VR_RXCFG_PROMISC | VR_RXCFG_ACCEPTMULTI); 2274 VR_PUT32(vrp->acc_reg, VR_MAR0, 0xffffffff); 2275 VR_PUT32(vrp->acc_reg, VR_MAR1, 0xffffffff); 2276 } else { 2277 /* 2278 * Restore the multicast filter and disable promiscuous mode. 2279 */ 2280 VR_PUT32(vrp->acc_reg, VR_MAR0, vrp->mhash0); 2281 VR_PUT32(vrp->acc_reg, VR_MAR1, vrp->mhash1); 2282 rxcfg &= ~VR_RXCFG_PROMISC; 2283 if (vrp->mcount != 0) 2284 rxcfg |= VR_RXCFG_ACCEPTMULTI; 2285 } 2286 VR_PUT8(vrp->acc_reg, VR_RXCFG, rxcfg); 2287 mutex_exit(&vrp->tx.lock); 2288 mutex_exit(&vrp->oplock); 2289 mutex_exit(&vrp->intrlock); 2290 return (0); 2291 } 2292 2293 int 2294 vr_mac_getstat(void *arg, uint_t stat, uint64_t *val) 2295 { 2296 vr_t *vrp; 2297 uint64_t v; 2298 2299 vrp = (void *) arg; 2300 2301 switch (stat) { 2302 default: 2303 return (ENOTSUP); 2304 2305 case ETHER_STAT_ADV_CAP_100T4: 2306 v = (vrp->chip.mii.anadv & MII_ABILITY_100BASE_T4) != 0; 2307 break; 2308 2309 case ETHER_STAT_ADV_CAP_100FDX: 2310 v = (vrp->chip.mii.anadv & MII_ABILITY_100BASE_TX_FD) != 0; 2311 break; 2312 2313 case ETHER_STAT_ADV_CAP_100HDX: 2314 v = (vrp->chip.mii.anadv & MII_ABILITY_100BASE_TX) != 0; 2315 break; 2316 2317 case ETHER_STAT_ADV_CAP_10FDX: 2318 v = (vrp->chip.mii.anadv & MII_ABILITY_10BASE_T_FD) != 0; 2319 break; 2320 2321 case ETHER_STAT_ADV_CAP_10HDX: 2322 v = (vrp->chip.mii.anadv & MII_ABILITY_10BASE_T) != 0; 2323 break; 2324 2325 case ETHER_STAT_ADV_CAP_ASMPAUSE: 2326 v = 0; 2327 break; 2328 2329 case ETHER_STAT_ADV_CAP_AUTONEG: 2330 v = (vrp->chip.mii.control & MII_CONTROL_ANE) != 0; 2331 break; 2332 2333 case ETHER_STAT_ADV_CAP_PAUSE: 2334 v = (vrp->chip.mii.anadv & MII_ABILITY_PAUSE) != 0; 2335 break; 2336 2337 case ETHER_STAT_ADV_REMFAULT: 2338 v = (vrp->chip.mii.anadv & MII_AN_ADVERT_REMFAULT) != 0; 2339 break; 2340 2341 case ETHER_STAT_ALIGN_ERRORS: 2342 v = vrp->stats.ether_stat_align_errors; 2343 break; 2344 2345 case ETHER_STAT_CAP_100T4: 2346 v = (vrp->chip.mii.status & MII_STATUS_100_BASE_T4) != 0; 2347 break; 2348 2349 case ETHER_STAT_CAP_100FDX: 2350 v = (vrp->chip.mii.status & MII_STATUS_100_BASEX_FD) != 0; 2351 break; 2352 2353 case ETHER_STAT_CAP_100HDX: 2354 v = (vrp->chip.mii.status & MII_STATUS_100_BASEX) != 0; 2355 break; 2356 2357 case ETHER_STAT_CAP_10FDX: 2358 v = (vrp->chip.mii.status & MII_STATUS_10_FD) != 0; 2359 break; 2360 2361 case ETHER_STAT_CAP_10HDX: 2362 v = (vrp->chip.mii.status & MII_STATUS_10) != 0; 2363 break; 2364 2365 case ETHER_STAT_CAP_ASMPAUSE: 2366 v = 0; 2367 break; 2368 2369 case ETHER_STAT_CAP_AUTONEG: 2370 v = (vrp->chip.mii.status & MII_STATUS_CANAUTONEG) != 0; 2371 break; 2372 2373 case ETHER_STAT_CAP_PAUSE: 2374 v = 1; 2375 break; 2376 2377 case ETHER_STAT_CAP_REMFAULT: 2378 v = (vrp->chip.mii.status & MII_STATUS_REMFAULT) != 0; 2379 break; 2380 2381 case ETHER_STAT_CARRIER_ERRORS: 2382 /* 2383 * Number of times carrier was lost or never detected on a 2384 * transmission attempt. 2385 */ 2386 v = vrp->stats.ether_stat_carrier_errors; 2387 break; 2388 2389 case ETHER_STAT_JABBER_ERRORS: 2390 return (ENOTSUP); 2391 2392 case ETHER_STAT_DEFER_XMTS: 2393 /* 2394 * Packets without collisions where first transmit attempt was 2395 * delayed because the medium was busy. 2396 */ 2397 v = vrp->stats.ether_stat_defer_xmts; 2398 break; 2399 2400 case ETHER_STAT_EX_COLLISIONS: 2401 /* 2402 * Frames where excess collisions occurred on transmit, causing 2403 * transmit failure. 2404 */ 2405 v = vrp->stats.ether_stat_ex_collisions; 2406 break; 2407 2408 case ETHER_STAT_FCS_ERRORS: 2409 /* 2410 * Packets received with CRC errors. 2411 */ 2412 v = vrp->stats.ether_stat_fcs_errors; 2413 break; 2414 2415 case ETHER_STAT_FIRST_COLLISIONS: 2416 /* 2417 * Packets successfully transmitted with exactly one collision. 2418 */ 2419 v = vrp->stats.ether_stat_first_collisions; 2420 break; 2421 2422 case ETHER_STAT_LINK_ASMPAUSE: 2423 v = 0; 2424 break; 2425 2426 case ETHER_STAT_LINK_AUTONEG: 2427 v = (vrp->chip.mii.control & MII_CONTROL_ANE) != 0 && 2428 (vrp->chip.mii.status & MII_STATUS_ANDONE) != 0; 2429 break; 2430 2431 case ETHER_STAT_LINK_DUPLEX: 2432 v = vrp->chip.link.duplex; 2433 break; 2434 2435 case ETHER_STAT_LINK_PAUSE: 2436 v = vrp->chip.link.flowctrl; 2437 break; 2438 2439 case ETHER_STAT_LP_CAP_100T4: 2440 v = (vrp->chip.mii.lpable & MII_ABILITY_100BASE_T4) != 0; 2441 break; 2442 2443 case ETHER_STAT_LP_CAP_1000FDX: 2444 v = 0; 2445 break; 2446 2447 case ETHER_STAT_LP_CAP_1000HDX: 2448 v = 0; 2449 break; 2450 2451 case ETHER_STAT_LP_CAP_100FDX: 2452 v = (vrp->chip.mii.lpable & MII_ABILITY_100BASE_TX_FD) != 0; 2453 break; 2454 2455 case ETHER_STAT_LP_CAP_100HDX: 2456 v = (vrp->chip.mii.lpable & MII_ABILITY_100BASE_TX) != 0; 2457 break; 2458 2459 case ETHER_STAT_LP_CAP_10FDX: 2460 v = (vrp->chip.mii.lpable & MII_ABILITY_10BASE_T_FD) != 0; 2461 break; 2462 2463 case ETHER_STAT_LP_CAP_10HDX: 2464 v = (vrp->chip.mii.lpable & MII_ABILITY_10BASE_T) != 0; 2465 break; 2466 2467 case ETHER_STAT_LP_CAP_ASMPAUSE: 2468 v = 0; 2469 break; 2470 2471 case ETHER_STAT_LP_CAP_AUTONEG: 2472 v = (vrp->chip.mii.anexp & MII_AN_EXP_LPCANAN) != 0; 2473 break; 2474 2475 case ETHER_STAT_LP_CAP_PAUSE: 2476 v = (vrp->chip.mii.lpable & MII_ABILITY_PAUSE) != 0; 2477 break; 2478 2479 case ETHER_STAT_LP_REMFAULT: 2480 v = (vrp->chip.mii.status & MII_STATUS_REMFAULT) != 0; 2481 break; 2482 2483 case ETHER_STAT_MACRCV_ERRORS: 2484 /* 2485 * Packets received with MAC errors, except align_errors, 2486 * fcs_errors, and toolong_errors. 2487 */ 2488 v = vrp->stats.ether_stat_macrcv_errors; 2489 break; 2490 2491 case ETHER_STAT_MACXMT_ERRORS: 2492 /* 2493 * Packets encountering transmit MAC failures, except carrier 2494 * and collision failures. 2495 */ 2496 v = vrp->stats.ether_stat_macxmt_errors; 2497 break; 2498 2499 case ETHER_STAT_MULTI_COLLISIONS: 2500 /* 2501 * Packets successfully transmitted with multiple collisions. 2502 */ 2503 v = vrp->stats.ether_stat_multi_collisions; 2504 break; 2505 2506 case ETHER_STAT_SQE_ERRORS: 2507 /* 2508 * Number of times signal quality error was reported 2509 * This one is reported by the PHY. 2510 */ 2511 return (ENOTSUP); 2512 2513 case ETHER_STAT_TOOLONG_ERRORS: 2514 /* 2515 * Packets received larger than the maximum permitted length. 2516 */ 2517 v = vrp->stats.ether_stat_toolong_errors; 2518 break; 2519 2520 case ETHER_STAT_TOOSHORT_ERRORS: 2521 v = vrp->stats.ether_stat_tooshort_errors; 2522 break; 2523 2524 case ETHER_STAT_TX_LATE_COLLISIONS: 2525 /* 2526 * Number of times a transmit collision occurred late 2527 * (after 512 bit times). 2528 */ 2529 v = vrp->stats.ether_stat_tx_late_collisions; 2530 break; 2531 2532 case ETHER_STAT_XCVR_ADDR: 2533 /* 2534 * MII address in the 0 to 31 range of the physical layer 2535 * device in use for a given Ethernet device. 2536 */ 2537 v = vrp->chip.phyaddr; 2538 break; 2539 2540 case ETHER_STAT_XCVR_ID: 2541 /* 2542 * MII transceiver manufacturer and device ID. 2543 */ 2544 v = (vrp->chip.mii.identh << 16) | vrp->chip.mii.identl; 2545 break; 2546 2547 case ETHER_STAT_XCVR_INUSE: 2548 v = vrp->chip.link.mau; 2549 break; 2550 2551 case MAC_STAT_BRDCSTRCV: 2552 v = vrp->stats.mac_stat_brdcstrcv; 2553 break; 2554 2555 case MAC_STAT_BRDCSTXMT: 2556 v = vrp->stats.mac_stat_brdcstxmt; 2557 break; 2558 2559 case MAC_STAT_MULTIXMT: 2560 v = vrp->stats.mac_stat_multixmt; 2561 break; 2562 2563 case MAC_STAT_COLLISIONS: 2564 v = vrp->stats.mac_stat_collisions; 2565 break; 2566 2567 case MAC_STAT_IERRORS: 2568 v = vrp->stats.mac_stat_ierrors; 2569 break; 2570 2571 case MAC_STAT_IFSPEED: 2572 if (vrp->chip.link.speed == VR_LINK_SPEED_100MBS) 2573 v = 100 * 1000 * 1000; 2574 else if (vrp->chip.link.speed == VR_LINK_SPEED_10MBS) 2575 v = 10 * 1000 * 1000; 2576 else 2577 v = 0; 2578 break; 2579 2580 case MAC_STAT_IPACKETS: 2581 v = vrp->stats.mac_stat_ipackets; 2582 break; 2583 2584 case MAC_STAT_MULTIRCV: 2585 v = vrp->stats.mac_stat_multircv; 2586 break; 2587 2588 case MAC_STAT_NORCVBUF: 2589 vrp->stats.mac_stat_norcvbuf += 2590 VR_GET16(vrp->acc_reg, VR_TALLY_MPA); 2591 VR_PUT16(vrp->acc_reg, VR_TALLY_MPA, 0); 2592 v = vrp->stats.mac_stat_norcvbuf; 2593 break; 2594 2595 case MAC_STAT_NOXMTBUF: 2596 v = vrp->stats.mac_stat_noxmtbuf; 2597 break; 2598 2599 case MAC_STAT_OBYTES: 2600 v = vrp->stats.mac_stat_obytes; 2601 break; 2602 2603 case MAC_STAT_OERRORS: 2604 v = vrp->stats.ether_stat_macxmt_errors + 2605 vrp->stats.mac_stat_underflows + 2606 vrp->stats.ether_stat_align_errors + 2607 vrp->stats.ether_stat_carrier_errors + 2608 vrp->stats.ether_stat_fcs_errors; 2609 break; 2610 2611 case MAC_STAT_OPACKETS: 2612 v = vrp->stats.mac_stat_opackets; 2613 break; 2614 2615 case MAC_STAT_RBYTES: 2616 v = vrp->stats.mac_stat_rbytes; 2617 break; 2618 2619 case MAC_STAT_UNKNOWNS: 2620 /* 2621 * Isn't this something for the MAC layer to maintain? 2622 */ 2623 return (ENOTSUP); 2624 2625 case MAC_STAT_UNDERFLOWS: 2626 v = vrp->stats.mac_stat_underflows; 2627 break; 2628 2629 case MAC_STAT_OVERFLOWS: 2630 v = vrp->stats.mac_stat_overflows; 2631 break; 2632 } 2633 *val = v; 2634 return (0); 2635 } 2636 2637 int 2638 vr_mac_set_ether_addr(void *p, const uint8_t *ea) 2639 { 2640 vr_t *vrp; 2641 int i; 2642 2643 vrp = (vr_t *)p; 2644 mutex_enter(&vrp->oplock); 2645 mutex_enter(&vrp->intrlock); 2646 2647 /* 2648 * Set a new station address. 2649 */ 2650 for (i = 0; i < ETHERADDRL; i++) 2651 VR_PUT8(vrp->acc_reg, VR_ETHERADDR + i, ea[i]); 2652 2653 mutex_exit(&vrp->intrlock); 2654 mutex_exit(&vrp->oplock); 2655 return (0); 2656 } 2657 2658 /* 2659 * Configure the ethernet link according to param and chip.mii. 2660 */ 2661 static void 2662 vr_link_init(vr_t *vrp) 2663 { 2664 ASSERT(mutex_owned(&vrp->oplock)); 2665 if ((vrp->chip.mii.control & MII_CONTROL_ANE) != 0) { 2666 /* 2667 * If we do autoneg, ensure restart autoneg is ON. 2668 */ 2669 vrp->chip.mii.control |= MII_CONTROL_RSAN; 2670 2671 /* 2672 * The advertisements are prepared by param_init. 2673 */ 2674 vr_phy_write(vrp, MII_AN_ADVERT, vrp->chip.mii.anadv); 2675 } else { 2676 /* 2677 * If we don't autoneg, we need speed, duplex and flowcontrol 2678 * to configure the link. However, dladm doesn't allow changes 2679 * to speed and duplex (readonly). The way this is solved 2680 * (ahem) is to select the highest enabled combination 2681 * Speed and duplex should be r/w when autoneg is off. 2682 */ 2683 if ((vrp->param.anadv_en & 2684 MII_ABILITY_100BASE_TX_FD) != 0) { 2685 vrp->chip.mii.control |= MII_CONTROL_100MB; 2686 vrp->chip.mii.control |= MII_CONTROL_FDUPLEX; 2687 } else if ((vrp->param.anadv_en & 2688 MII_ABILITY_100BASE_TX) != 0) { 2689 vrp->chip.mii.control |= MII_CONTROL_100MB; 2690 vrp->chip.mii.control &= ~MII_CONTROL_FDUPLEX; 2691 } else if ((vrp->param.anadv_en & 2692 MII_ABILITY_10BASE_T_FD) != 0) { 2693 vrp->chip.mii.control |= MII_CONTROL_FDUPLEX; 2694 vrp->chip.mii.control &= ~MII_CONTROL_100MB; 2695 } else { 2696 vrp->chip.mii.control &= ~MII_CONTROL_100MB; 2697 vrp->chip.mii.control &= ~MII_CONTROL_FDUPLEX; 2698 } 2699 } 2700 /* 2701 * Write the control register. 2702 */ 2703 vr_phy_write(vrp, MII_CONTROL, vrp->chip.mii.control); 2704 2705 /* 2706 * With autoneg off we cannot rely on the link_change interrupt for 2707 * for getting the status into the driver. 2708 */ 2709 if ((vrp->chip.mii.control & MII_CONTROL_ANE) == 0) { 2710 vr_link_state(vrp); 2711 mac_link_update(vrp->machdl, 2712 (link_state_t)vrp->chip.link.state); 2713 } 2714 } 2715 2716 /* 2717 * Get link state in the driver and configure the MAC accordingly. 2718 */ 2719 static void 2720 vr_link_state(vr_t *vrp) 2721 { 2722 uint16_t mask; 2723 2724 ASSERT(mutex_owned(&vrp->oplock)); 2725 2726 vr_phy_read(vrp, MII_STATUS, &vrp->chip.mii.status); 2727 vr_phy_read(vrp, MII_CONTROL, &vrp->chip.mii.control); 2728 vr_phy_read(vrp, MII_AN_ADVERT, &vrp->chip.mii.anadv); 2729 vr_phy_read(vrp, MII_AN_LPABLE, &vrp->chip.mii.lpable); 2730 vr_phy_read(vrp, MII_AN_EXPANSION, &vrp->chip.mii.anexp); 2731 2732 /* 2733 * If we did autongeg, deduce the link type/speed by selecting the 2734 * highest common denominator. 2735 */ 2736 if ((vrp->chip.mii.control & MII_CONTROL_ANE) != 0) { 2737 mask = vrp->chip.mii.anadv & vrp->chip.mii.lpable; 2738 if ((mask & MII_ABILITY_100BASE_TX_FD) != 0) { 2739 vrp->chip.link.speed = VR_LINK_SPEED_100MBS; 2740 vrp->chip.link.duplex = VR_LINK_DUPLEX_FULL; 2741 vrp->chip.link.mau = VR_MAU_100X; 2742 } else if ((mask & MII_ABILITY_100BASE_T4) != 0) { 2743 vrp->chip.link.speed = VR_LINK_SPEED_100MBS; 2744 vrp->chip.link.duplex = VR_LINK_DUPLEX_HALF; 2745 vrp->chip.link.mau = VR_MAU_100T4; 2746 } else if ((mask & MII_ABILITY_100BASE_TX) != 0) { 2747 vrp->chip.link.speed = VR_LINK_SPEED_100MBS; 2748 vrp->chip.link.duplex = VR_LINK_DUPLEX_HALF; 2749 vrp->chip.link.mau = VR_MAU_100X; 2750 } else if ((mask & MII_ABILITY_10BASE_T_FD) != 0) { 2751 vrp->chip.link.speed = VR_LINK_SPEED_10MBS; 2752 vrp->chip.link.duplex = VR_LINK_DUPLEX_FULL; 2753 vrp->chip.link.mau = VR_MAU_10; 2754 } else if ((mask & MII_ABILITY_10BASE_T) != 0) { 2755 vrp->chip.link.speed = VR_LINK_SPEED_10MBS; 2756 vrp->chip.link.duplex = VR_LINK_DUPLEX_HALF; 2757 vrp->chip.link.mau = VR_MAU_10; 2758 } else { 2759 vrp->chip.link.speed = VR_LINK_SPEED_UNKNOWN; 2760 vrp->chip.link.duplex = VR_LINK_DUPLEX_UNKNOWN; 2761 vrp->chip.link.mau = VR_MAU_UNKNOWN; 2762 } 2763 2764 /* 2765 * Did we negotiate pause? 2766 */ 2767 if ((mask & MII_ABILITY_PAUSE) != 0 && 2768 vrp->chip.link.duplex == VR_LINK_DUPLEX_FULL) 2769 vrp->chip.link.flowctrl = VR_PAUSE_BIDIRECTIONAL; 2770 else 2771 vrp->chip.link.flowctrl = VR_PAUSE_NONE; 2772 2773 /* 2774 * Did either one detect a AN fault? 2775 */ 2776 if ((vrp->chip.mii.status & MII_STATUS_REMFAULT) != 0) 2777 vr_log(vrp, CE_WARN, 2778 "AN remote fault reported by LP."); 2779 2780 if ((vrp->chip.mii.lpable & MII_AN_ADVERT_REMFAULT) != 0) 2781 vr_log(vrp, CE_WARN, "AN remote fault caused for LP."); 2782 } else { 2783 /* 2784 * We didn't autoneg 2785 * The link type is defined by the control register. 2786 */ 2787 if ((vrp->chip.mii.control & MII_CONTROL_100MB) != 0) { 2788 vrp->chip.link.speed = VR_LINK_SPEED_100MBS; 2789 vrp->chip.link.mau = VR_MAU_100X; 2790 } else { 2791 vrp->chip.link.speed = VR_LINK_SPEED_10MBS; 2792 vrp->chip.link.mau = VR_MAU_10; 2793 } 2794 2795 if ((vrp->chip.mii.control & MII_CONTROL_FDUPLEX) != 0) 2796 vrp->chip.link.duplex = VR_LINK_DUPLEX_FULL; 2797 else { 2798 vrp->chip.link.duplex = VR_LINK_DUPLEX_HALF; 2799 /* 2800 * No pause on HDX links. 2801 */ 2802 vrp->chip.link.flowctrl = VR_PAUSE_NONE; 2803 } 2804 } 2805 2806 /* 2807 * Set the duplex mode on the MAC according to that of the PHY. 2808 */ 2809 if (vrp->chip.link.duplex == VR_LINK_DUPLEX_FULL) { 2810 VR_SETBIT8(vrp->acc_reg, VR_CTRL1, VR_CTRL1_MACFULLDUPLEX); 2811 /* 2812 * Enable packet queueing on FDX links. 2813 */ 2814 if ((vrp->chip.info.bugs & VR_BUG_NO_TXQUEUEING) == 0) 2815 VR_CLRBIT8(vrp->acc_reg, VR_CFGB, VR_CFGB_QPKTDIS); 2816 } else { 2817 VR_CLRBIT8(vrp->acc_reg, VR_CTRL1, VR_CTRL1_MACFULLDUPLEX); 2818 /* 2819 * Disable packet queueing on HDX links. With queueing enabled, 2820 * this MAC get's lost after a TX abort (too many colisions). 2821 */ 2822 VR_SETBIT8(vrp->acc_reg, VR_CFGB, VR_CFGB_QPKTDIS); 2823 } 2824 2825 /* 2826 * Set pause options on the MAC. 2827 */ 2828 if (vrp->chip.link.flowctrl == VR_PAUSE_BIDIRECTIONAL) { 2829 /* 2830 * All of our MAC's can receive pause frames. 2831 */ 2832 VR_SETBIT8(vrp->acc_reg, VR_MISC0, VR_MISC0_FDXRFEN); 2833 2834 /* 2835 * VT6105 and above can transmit pause frames. 2836 */ 2837 if ((vrp->chip.info.features & VR_FEATURE_TX_PAUSE_CAP) != 0) { 2838 /* 2839 * Set the number of available receive descriptors 2840 * Non-zero values written to this register are added 2841 * to the register's contents. Careful: Writing zero 2842 * clears the register and thus causes a (long) pause 2843 * request. 2844 */ 2845 VR_PUT8(vrp->acc_reg, VR_FCR0_RXBUFCOUNT, 2846 MIN(vrp->rx.ndesc, 0xFF) - 2847 VR_GET8(vrp->acc_reg, 2848 VR_FCR0_RXBUFCOUNT)); 2849 2850 /* 2851 * Request pause when we have 4 descs left. 2852 */ 2853 VR_SETBITS8(vrp->acc_reg, VR_FCR1, 2854 VR_FCR1_PAUSEONBITS, VR_FCR1_PAUSEON_04); 2855 2856 /* 2857 * Cancel the pause when there are 24 descriptors again. 2858 */ 2859 VR_SETBITS8(vrp->acc_reg, VR_FCR1, 2860 VR_FCR1_PAUSEOFFBITS, VR_FCR1_PAUSEOFF_24); 2861 2862 /* 2863 * Request a pause of FFFF bit-times. This long pause 2864 * is cancelled when the high watermark is reached. 2865 */ 2866 VR_PUT16(vrp->acc_reg, VR_FCR2_PAUSE, 0xFFFF); 2867 2868 /* 2869 * Enable flow control on the MAC. 2870 */ 2871 VR_SETBIT8(vrp->acc_reg, VR_MISC0, VR_MISC0_FDXTFEN); 2872 VR_SETBIT8(vrp->acc_reg, VR_FCR1, VR_FCR1_FD_RX_EN | 2873 VR_FCR1_FD_TX_EN | VR_FCR1_XONXOFF_EN); 2874 } 2875 } else { 2876 /* 2877 * Turn flow control OFF. 2878 */ 2879 VR_CLRBIT8(vrp->acc_reg, 2880 VR_MISC0, VR_MISC0_FDXRFEN | VR_MISC0_FDXTFEN); 2881 if ((vrp->chip.info.features & VR_FEATURE_TX_PAUSE_CAP) != 0) { 2882 VR_CLRBIT8(vrp->acc_reg, VR_FCR1, 2883 VR_FCR1_FD_RX_EN | VR_FCR1_FD_TX_EN | 2884 VR_FCR1_XONXOFF_EN); 2885 } 2886 } 2887 2888 /* 2889 * Set link state. 2890 */ 2891 if ((vrp->chip.mii.status & MII_STATUS_LINKUP) != 0) 2892 vrp->chip.link.state = VR_LINK_STATE_UP; 2893 else 2894 vrp->chip.link.state = VR_LINK_STATE_DOWN; 2895 } 2896 2897 /* 2898 * The PHY is automatically polled by the MAC once per 1024 MD clock cycles 2899 * MD is clocked once per 960ns so polling happens about every 1M ns, some 2900 * 1000 times per second 2901 * This polling process is required for the functionality of the link change 2902 * interrupt. Polling process must be disabled in order to access PHY registers 2903 * using MDIO 2904 * 2905 * Turn off PHY polling so that the PHY registers can be accessed. 2906 */ 2907 static void 2908 vr_phy_autopoll_disable(vr_t *vrp) 2909 { 2910 uint32_t time; 2911 uint8_t miicmd, miiaddr; 2912 2913 /* 2914 * Special procedure to stop the autopolling. 2915 */ 2916 if ((vrp->chip.info.bugs & VR_BUG_MIIPOLLSTOP) != 0) { 2917 /* 2918 * If polling is enabled. 2919 */ 2920 miicmd = VR_GET8(vrp->acc_reg, VR_MIICMD); 2921 if ((miicmd & VR_MIICMD_MD_AUTO) != 0) { 2922 /* 2923 * Wait for the end of a cycle (mdone set). 2924 */ 2925 time = 0; 2926 do { 2927 drv_usecwait(10); 2928 if (time >= VR_MMI_WAITMAX) { 2929 vr_log(vrp, CE_WARN, 2930 "Timeout in " 2931 "disable MII polling"); 2932 break; 2933 } 2934 time += VR_MMI_WAITINCR; 2935 miiaddr = VR_GET8(vrp->acc_reg, VR_MIIADDR); 2936 } while ((miiaddr & VR_MIIADDR_MDONE) == 0); 2937 } 2938 /* 2939 * Once paused, we can disable autopolling. 2940 */ 2941 VR_PUT8(vrp->acc_reg, VR_MIICMD, 0); 2942 } else { 2943 /* 2944 * Turn off MII polling. 2945 */ 2946 VR_PUT8(vrp->acc_reg, VR_MIICMD, 0); 2947 2948 /* 2949 * Wait for MIDLE in MII address register. 2950 */ 2951 time = 0; 2952 do { 2953 drv_usecwait(VR_MMI_WAITINCR); 2954 if (time >= VR_MMI_WAITMAX) { 2955 vr_log(vrp, CE_WARN, 2956 "Timeout in disable MII polling"); 2957 break; 2958 } 2959 time += VR_MMI_WAITINCR; 2960 miiaddr = VR_GET8(vrp->acc_reg, VR_MIIADDR); 2961 } while ((miiaddr & VR_MIIADDR_MIDLE) == 0); 2962 } 2963 } 2964 2965 /* 2966 * Turn on PHY polling. PHY's registers cannot be accessed. 2967 */ 2968 static void 2969 vr_phy_autopoll_enable(vr_t *vrp) 2970 { 2971 uint32_t time; 2972 2973 VR_PUT8(vrp->acc_reg, VR_MIICMD, 0); 2974 VR_PUT8(vrp->acc_reg, VR_MIIADDR, MII_STATUS|VR_MIIADDR_MAUTO); 2975 VR_PUT8(vrp->acc_reg, VR_MIICMD, VR_MIICMD_MD_AUTO); 2976 2977 /* 2978 * Wait for the polling process to finish. 2979 */ 2980 time = 0; 2981 do { 2982 drv_usecwait(VR_MMI_WAITINCR); 2983 if (time >= VR_MMI_WAITMAX) { 2984 vr_log(vrp, CE_NOTE, "Timeout in enable MII polling"); 2985 break; 2986 } 2987 time += VR_MMI_WAITINCR; 2988 } while ((VR_GET8(vrp->acc_reg, VR_MIIADDR) & VR_MIIADDR_MDONE) == 0); 2989 2990 /* 2991 * Initiate a polling. 2992 */ 2993 VR_SETBIT8(vrp->acc_reg, VR_MIIADDR, VR_MIIADDR_MAUTO); 2994 } 2995 2996 /* 2997 * Read a register from the PHY using MDIO. 2998 */ 2999 static void 3000 vr_phy_read(vr_t *vrp, int offset, uint16_t *value) 3001 { 3002 uint32_t time; 3003 3004 vr_phy_autopoll_disable(vrp); 3005 3006 /* 3007 * Write the register number to the lower 5 bits of the MII address 3008 * register. 3009 */ 3010 VR_SETBITS8(vrp->acc_reg, VR_MIIADDR, VR_MIIADDR_BITS, offset); 3011 3012 /* 3013 * Write a READ command to the MII control register 3014 * This bit will be cleared when the read is finished. 3015 */ 3016 VR_SETBIT8(vrp->acc_reg, VR_MIICMD, VR_MIICMD_MD_READ); 3017 3018 /* 3019 * Wait until the read is done. 3020 */ 3021 time = 0; 3022 do { 3023 drv_usecwait(VR_MMI_WAITINCR); 3024 if (time >= VR_MMI_WAITMAX) { 3025 vr_log(vrp, CE_NOTE, "Timeout in MII read command"); 3026 break; 3027 } 3028 time += VR_MMI_WAITINCR; 3029 } while ((VR_GET8(vrp->acc_reg, VR_MIICMD) & VR_MIICMD_MD_READ) != 0); 3030 3031 *value = VR_GET16(vrp->acc_reg, VR_MIIDATA); 3032 vr_phy_autopoll_enable(vrp); 3033 } 3034 3035 /* 3036 * Write to a PHY's register. 3037 */ 3038 static void 3039 vr_phy_write(vr_t *vrp, int offset, uint16_t value) 3040 { 3041 uint32_t time; 3042 3043 vr_phy_autopoll_disable(vrp); 3044 3045 /* 3046 * Write the register number to the MII address register. 3047 */ 3048 VR_SETBITS8(vrp->acc_reg, VR_MIIADDR, VR_MIIADDR_BITS, offset); 3049 3050 /* 3051 * Write the value to the data register. 3052 */ 3053 VR_PUT16(vrp->acc_reg, VR_MIIDATA, value); 3054 3055 /* 3056 * Issue the WRITE command to the command register. 3057 * This bit will be cleared when the write is finished. 3058 */ 3059 VR_SETBIT8(vrp->acc_reg, VR_MIICMD, VR_MIICMD_MD_WRITE); 3060 3061 time = 0; 3062 do { 3063 drv_usecwait(VR_MMI_WAITINCR); 3064 if (time >= VR_MMI_WAITMAX) { 3065 vr_log(vrp, CE_NOTE, "Timeout in MII write command"); 3066 break; 3067 } 3068 time += VR_MMI_WAITINCR; 3069 } while ((VR_GET8(vrp->acc_reg, VR_MIICMD) & VR_MIICMD_MD_WRITE) != 0); 3070 vr_phy_autopoll_enable(vrp); 3071 } 3072 3073 /* 3074 * Initialize and install some private kstats. 3075 */ 3076 typedef struct { 3077 char *name; 3078 uchar_t type; 3079 } vr_kstat_t; 3080 3081 static const vr_kstat_t vr_driver_stats [] = { 3082 {"allocbfail", KSTAT_DATA_INT32}, 3083 {"intr_claimed", KSTAT_DATA_INT64}, 3084 {"intr_unclaimed", KSTAT_DATA_INT64}, 3085 {"linkchanges", KSTAT_DATA_INT64}, 3086 {"txnfree", KSTAT_DATA_INT32}, 3087 {"txstalls", KSTAT_DATA_INT32}, 3088 {"resets", KSTAT_DATA_INT32}, 3089 {"txreclaims", KSTAT_DATA_INT64}, 3090 {"txreclaim0", KSTAT_DATA_INT64}, 3091 {"cyclics", KSTAT_DATA_INT64}, 3092 {"txchecks", KSTAT_DATA_INT64}, 3093 }; 3094 3095 static void 3096 vr_kstats_init(vr_t *vrp) 3097 { 3098 kstat_t *ksp; 3099 struct kstat_named *knp; 3100 int i; 3101 int nstats; 3102 3103 nstats = sizeof (vr_driver_stats) / sizeof (vr_kstat_t); 3104 3105 ksp = kstat_create(MODULENAME, ddi_get_instance(vrp->devinfo), 3106 "driver", "net", KSTAT_TYPE_NAMED, nstats, 0); 3107 3108 if (ksp == NULL) 3109 vr_log(vrp, CE_WARN, "kstat_create failed"); 3110 3111 ksp->ks_update = vr_update_kstats; 3112 ksp->ks_private = (void*) vrp; 3113 knp = ksp->ks_data; 3114 3115 for (i = 0; i < nstats; i++, knp++) { 3116 kstat_named_init(knp, vr_driver_stats[i].name, 3117 vr_driver_stats[i].type); 3118 } 3119 kstat_install(ksp); 3120 vrp->ksp = ksp; 3121 } 3122 3123 static int 3124 vr_update_kstats(kstat_t *ksp, int access) 3125 { 3126 vr_t *vrp; 3127 struct kstat_named *knp; 3128 3129 vrp = (vr_t *)ksp->ks_private; 3130 knp = ksp->ks_data; 3131 3132 if (access != KSTAT_READ) 3133 return (EACCES); 3134 3135 (knp++)->value.ui32 = vrp->stats.allocbfail; 3136 (knp++)->value.ui64 = vrp->stats.intr_claimed; 3137 (knp++)->value.ui64 = vrp->stats.intr_unclaimed; 3138 (knp++)->value.ui64 = vrp->stats.linkchanges; 3139 (knp++)->value.ui32 = vrp->tx.nfree; 3140 (knp++)->value.ui32 = vrp->stats.txstalls; 3141 (knp++)->value.ui32 = vrp->stats.resets; 3142 (knp++)->value.ui64 = vrp->stats.txreclaims; 3143 (knp++)->value.ui64 = vrp->stats.txreclaim0; 3144 (knp++)->value.ui64 = vrp->stats.cyclics; 3145 (knp++)->value.ui64 = vrp->stats.txchecks; 3146 return (0); 3147 } 3148 3149 /* 3150 * Remove 'private' kstats. 3151 */ 3152 static void 3153 vr_remove_kstats(vr_t *vrp) 3154 { 3155 if (vrp->ksp != NULL) 3156 kstat_delete(vrp->ksp); 3157 } 3158 3159 /* 3160 * Get a property of the device/driver 3161 * Remarks: 3162 * - pr_val is always an integer of size pr_valsize 3163 * - ENABLED (EN) is what is configured via dladm 3164 * - ADVERTISED (ADV) is ENABLED minus constraints, like PHY/MAC capabilities 3165 * - DEFAULT are driver- and hardware defaults (DEFAULT is implemented as a 3166 * flag in pr_flags instead of MAC_PROP_DEFAULT_) 3167 * - perm is the permission printed on ndd -get /.. \? 3168 */ 3169 int 3170 vr_mac_getprop(void *arg, const char *pr_name, mac_prop_id_t pr_num, 3171 uint_t pr_valsize, void *pr_val) 3172 { 3173 vr_t *vrp; 3174 uint32_t err; 3175 uint64_t val; 3176 3177 /* Since we have no private properties */ 3178 _NOTE(ARGUNUSED(pr_name)) 3179 3180 err = 0; 3181 vrp = (vr_t *)arg; 3182 switch (pr_num) { 3183 case MAC_PROP_ADV_1000FDX_CAP: 3184 case MAC_PROP_ADV_1000HDX_CAP: 3185 case MAC_PROP_EN_1000FDX_CAP: 3186 case MAC_PROP_EN_1000HDX_CAP: 3187 val = 0; 3188 break; 3189 3190 case MAC_PROP_ADV_100FDX_CAP: 3191 val = (vrp->chip.mii.anadv & 3192 MII_ABILITY_100BASE_TX_FD) != 0; 3193 break; 3194 3195 case MAC_PROP_ADV_100HDX_CAP: 3196 val = (vrp->chip.mii.anadv & 3197 MII_ABILITY_100BASE_TX) != 0; 3198 break; 3199 3200 case MAC_PROP_ADV_100T4_CAP: 3201 val = (vrp->chip.mii.anadv & 3202 MII_ABILITY_100BASE_T4) != 0; 3203 break; 3204 3205 case MAC_PROP_ADV_10FDX_CAP: 3206 val = (vrp->chip.mii.anadv & 3207 MII_ABILITY_10BASE_T_FD) != 0; 3208 break; 3209 3210 case MAC_PROP_ADV_10HDX_CAP: 3211 val = (vrp->chip.mii.anadv & 3212 MII_ABILITY_10BASE_T) != 0; 3213 break; 3214 3215 case MAC_PROP_AUTONEG: 3216 val = (vrp->chip.mii.control & 3217 MII_CONTROL_ANE) != 0; 3218 break; 3219 3220 case MAC_PROP_DUPLEX: 3221 val = vrp->chip.link.duplex; 3222 break; 3223 3224 case MAC_PROP_EN_100FDX_CAP: 3225 val = (vrp->param.anadv_en & 3226 MII_ABILITY_100BASE_TX_FD) != 0; 3227 break; 3228 3229 case MAC_PROP_EN_100HDX_CAP: 3230 val = (vrp->param.anadv_en & 3231 MII_ABILITY_100BASE_TX) != 0; 3232 break; 3233 3234 case MAC_PROP_EN_100T4_CAP: 3235 val = (vrp->param.anadv_en & 3236 MII_ABILITY_100BASE_T4) != 0; 3237 break; 3238 3239 case MAC_PROP_EN_10FDX_CAP: 3240 val = (vrp->param.anadv_en & 3241 MII_ABILITY_10BASE_T_FD) != 0; 3242 break; 3243 3244 case MAC_PROP_EN_10HDX_CAP: 3245 val = (vrp->param.anadv_en & 3246 MII_ABILITY_10BASE_T) != 0; 3247 break; 3248 3249 case MAC_PROP_EN_AUTONEG: 3250 val = vrp->param.an_en == VR_LINK_AUTONEG_ON; 3251 break; 3252 3253 case MAC_PROP_FLOWCTRL: 3254 val = vrp->chip.link.flowctrl; 3255 break; 3256 3257 case MAC_PROP_MTU: 3258 val = vrp->param.mtu; 3259 break; 3260 3261 case MAC_PROP_SPEED: 3262 if (vrp->chip.link.speed == 3263 VR_LINK_SPEED_100MBS) 3264 val = 100 * 1000 * 1000; 3265 else if (vrp->chip.link.speed == 3266 VR_LINK_SPEED_10MBS) 3267 val = 10 * 1000 * 1000; 3268 else 3269 val = 0; 3270 break; 3271 3272 case MAC_PROP_STATUS: 3273 val = vrp->chip.link.state; 3274 break; 3275 3276 default: 3277 err = ENOTSUP; 3278 break; 3279 } 3280 3281 if (err == 0 && pr_num != MAC_PROP_PRIVATE) { 3282 if (pr_valsize == sizeof (uint64_t)) 3283 *(uint64_t *)pr_val = val; 3284 else if (pr_valsize == sizeof (uint32_t)) 3285 *(uint32_t *)pr_val = val; 3286 else if (pr_valsize == sizeof (uint16_t)) 3287 *(uint16_t *)pr_val = val; 3288 else if (pr_valsize == sizeof (uint8_t)) 3289 *(uint8_t *)pr_val = val; 3290 else 3291 err = EINVAL; 3292 } 3293 return (err); 3294 } 3295 3296 void 3297 vr_mac_propinfo(void *arg, const char *pr_name, mac_prop_id_t pr_num, 3298 mac_prop_info_handle_t prh) 3299 { 3300 vr_t *vrp = (vr_t *)arg; 3301 uint8_t val, perm; 3302 3303 /* Since we have no private properties */ 3304 _NOTE(ARGUNUSED(pr_name)) 3305 3306 switch (pr_num) { 3307 case MAC_PROP_ADV_1000FDX_CAP: 3308 case MAC_PROP_ADV_1000HDX_CAP: 3309 case MAC_PROP_EN_1000FDX_CAP: 3310 case MAC_PROP_EN_1000HDX_CAP: 3311 case MAC_PROP_ADV_100FDX_CAP: 3312 case MAC_PROP_ADV_100HDX_CAP: 3313 case MAC_PROP_ADV_100T4_CAP: 3314 case MAC_PROP_ADV_10FDX_CAP: 3315 case MAC_PROP_ADV_10HDX_CAP: 3316 mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ); 3317 return; 3318 3319 case MAC_PROP_EN_100FDX_CAP: 3320 val = (vrp->chip.mii.status & 3321 MII_STATUS_100_BASEX_FD) != 0; 3322 break; 3323 3324 case MAC_PROP_EN_100HDX_CAP: 3325 val = (vrp->chip.mii.status & 3326 MII_STATUS_100_BASEX) != 0; 3327 break; 3328 3329 case MAC_PROP_EN_100T4_CAP: 3330 val = (vrp->chip.mii.status & 3331 MII_STATUS_100_BASE_T4) != 0; 3332 break; 3333 3334 case MAC_PROP_EN_10FDX_CAP: 3335 val = (vrp->chip.mii.status & 3336 MII_STATUS_10_FD) != 0; 3337 break; 3338 3339 case MAC_PROP_EN_10HDX_CAP: 3340 val = (vrp->chip.mii.status & 3341 MII_STATUS_10) != 0; 3342 break; 3343 3344 case MAC_PROP_AUTONEG: 3345 case MAC_PROP_EN_AUTONEG: 3346 val = (vrp->chip.mii.status & 3347 MII_STATUS_CANAUTONEG) != 0; 3348 break; 3349 3350 case MAC_PROP_FLOWCTRL: 3351 mac_prop_info_set_default_link_flowctrl(prh, 3352 LINK_FLOWCTRL_BI); 3353 return; 3354 3355 case MAC_PROP_MTU: 3356 mac_prop_info_set_range_uint32(prh, 3357 ETHERMTU, ETHERMTU); 3358 return; 3359 3360 case MAC_PROP_DUPLEX: 3361 /* 3362 * Writability depends on autoneg. 3363 */ 3364 perm = ((vrp->chip.mii.control & 3365 MII_CONTROL_ANE) == 0) ? MAC_PROP_PERM_RW : 3366 MAC_PROP_PERM_READ; 3367 mac_prop_info_set_perm(prh, perm); 3368 3369 if (perm == MAC_PROP_PERM_RW) { 3370 mac_prop_info_set_default_uint8(prh, 3371 VR_LINK_DUPLEX_FULL); 3372 } 3373 return; 3374 3375 case MAC_PROP_SPEED: 3376 perm = ((vrp->chip.mii.control & 3377 MII_CONTROL_ANE) == 0) ? 3378 MAC_PROP_PERM_RW : MAC_PROP_PERM_READ; 3379 mac_prop_info_set_perm(prh, perm); 3380 3381 if (perm == MAC_PROP_PERM_RW) { 3382 mac_prop_info_set_default_uint64(prh, 3383 100 * 1000 * 1000); 3384 } 3385 return; 3386 3387 case MAC_PROP_STATUS: 3388 mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ); 3389 return; 3390 3391 default: 3392 return; 3393 } 3394 3395 mac_prop_info_set_default_uint8(prh, val); 3396 } 3397 3398 /* 3399 * Set a property of the device. 3400 */ 3401 int 3402 vr_mac_setprop(void *arg, const char *pr_name, mac_prop_id_t pr_num, 3403 uint_t pr_valsize, const void *pr_val) 3404 { 3405 vr_t *vrp; 3406 uint32_t err; 3407 uint64_t val; 3408 3409 /* Since we have no private properties */ 3410 _NOTE(ARGUNUSED(pr_name)) 3411 3412 err = 0; 3413 vrp = (vr_t *)arg; 3414 mutex_enter(&vrp->oplock); 3415 3416 /* 3417 * The current set of public property values are passed as integers 3418 * Private properties are passed as strings in pr_val length pr_valsize. 3419 */ 3420 if (pr_num != MAC_PROP_PRIVATE) { 3421 if (pr_valsize == sizeof (uint64_t)) 3422 val = *(uint64_t *)pr_val; 3423 else if (pr_valsize == sizeof (uint32_t)) 3424 val = *(uint32_t *)pr_val; 3425 else if (pr_valsize == sizeof (uint16_t)) 3426 val = *(uint32_t *)pr_val; 3427 else if (pr_valsize == sizeof (uint8_t)) 3428 val = *(uint8_t *)pr_val; 3429 else { 3430 mutex_exit(&vrp->oplock); 3431 return (EINVAL); 3432 } 3433 } 3434 3435 switch (pr_num) { 3436 case MAC_PROP_DUPLEX: 3437 if ((vrp->chip.mii.control & MII_CONTROL_ANE) == 0) { 3438 if (val == LINK_DUPLEX_FULL) 3439 vrp->chip.mii.control |= 3440 MII_CONTROL_FDUPLEX; 3441 else if (val == LINK_DUPLEX_HALF) 3442 vrp->chip.mii.control &= 3443 ~MII_CONTROL_FDUPLEX; 3444 else 3445 err = EINVAL; 3446 } else 3447 err = EINVAL; 3448 break; 3449 3450 case MAC_PROP_EN_100FDX_CAP: 3451 if (val == 0) 3452 vrp->param.anadv_en &= 3453 ~MII_ABILITY_100BASE_TX_FD; 3454 else 3455 vrp->param.anadv_en |= 3456 MII_ABILITY_100BASE_TX_FD; 3457 break; 3458 3459 case MAC_PROP_EN_100HDX_CAP: 3460 if (val == 0) 3461 vrp->param.anadv_en &= 3462 ~MII_ABILITY_100BASE_TX; 3463 else 3464 vrp->param.anadv_en |= 3465 MII_ABILITY_100BASE_TX; 3466 break; 3467 3468 case MAC_PROP_EN_100T4_CAP: 3469 if (val == 0) 3470 vrp->param.anadv_en &= 3471 ~MII_ABILITY_100BASE_T4; 3472 else 3473 vrp->param.anadv_en |= 3474 MII_ABILITY_100BASE_T4; 3475 break; 3476 3477 case MAC_PROP_EN_10FDX_CAP: 3478 if (val == 0) 3479 vrp->param.anadv_en &= 3480 ~MII_ABILITY_10BASE_T_FD; 3481 else 3482 vrp->param.anadv_en |= 3483 MII_ABILITY_10BASE_T_FD; 3484 break; 3485 3486 case MAC_PROP_EN_10HDX_CAP: 3487 if (val == 0) 3488 vrp->param.anadv_en &= 3489 ~MII_ABILITY_10BASE_T; 3490 else 3491 vrp->param.anadv_en |= 3492 MII_ABILITY_10BASE_T; 3493 break; 3494 3495 case MAC_PROP_AUTONEG: 3496 case MAC_PROP_EN_AUTONEG: 3497 if (val == 0) { 3498 vrp->param.an_en = VR_LINK_AUTONEG_OFF; 3499 vrp->chip.mii.control &= ~MII_CONTROL_ANE; 3500 } else { 3501 vrp->param.an_en = VR_LINK_AUTONEG_ON; 3502 if ((vrp->chip.mii.status & 3503 MII_STATUS_CANAUTONEG) != 0) 3504 vrp->chip.mii.control |= 3505 MII_CONTROL_ANE; 3506 else 3507 err = EINVAL; 3508 } 3509 break; 3510 3511 case MAC_PROP_FLOWCTRL: 3512 if (val == LINK_FLOWCTRL_NONE) 3513 vrp->param.anadv_en &= ~MII_ABILITY_PAUSE; 3514 else if (val == LINK_FLOWCTRL_BI) 3515 vrp->param.anadv_en |= MII_ABILITY_PAUSE; 3516 else 3517 err = EINVAL; 3518 break; 3519 3520 case MAC_PROP_MTU: 3521 if (val >= ETHERMIN && val <= ETHERMTU) 3522 vrp->param.mtu = (uint32_t)val; 3523 else 3524 err = EINVAL; 3525 break; 3526 3527 case MAC_PROP_SPEED: 3528 if (val == 10 * 1000 * 1000) 3529 vrp->chip.link.speed = 3530 VR_LINK_SPEED_10MBS; 3531 else if (val == 100 * 1000 * 1000) 3532 vrp->chip.link.speed = 3533 VR_LINK_SPEED_100MBS; 3534 else 3535 err = EINVAL; 3536 break; 3537 3538 default: 3539 err = ENOTSUP; 3540 break; 3541 } 3542 if (err == 0 && pr_num != MAC_PROP_PRIVATE) { 3543 vrp->chip.mii.anadv = vrp->param.anadv_en & 3544 (vrp->param.an_phymask & vrp->param.an_macmask); 3545 vr_link_init(vrp); 3546 } 3547 mutex_exit(&vrp->oplock); 3548 return (err); 3549 } 3550 3551 3552 /* 3553 * Logging and debug functions. 3554 */ 3555 static struct { 3556 kmutex_t mutex[1]; 3557 const char *ifname; 3558 const char *fmt; 3559 int level; 3560 } prtdata; 3561 3562 static void 3563 vr_vprt(const char *fmt, va_list args) 3564 { 3565 char buf[512]; 3566 3567 ASSERT(mutex_owned(prtdata.mutex)); 3568 (void) vsnprintf(buf, sizeof (buf), fmt, args); 3569 cmn_err(prtdata.level, prtdata.fmt, prtdata.ifname, buf); 3570 } 3571 3572 static void 3573 vr_log(vr_t *vrp, int level, const char *fmt, ...) 3574 { 3575 va_list args; 3576 3577 mutex_enter(prtdata.mutex); 3578 prtdata.ifname = vrp->ifname; 3579 prtdata.fmt = "!%s: %s"; 3580 prtdata.level = level; 3581 3582 va_start(args, fmt); 3583 vr_vprt(fmt, args); 3584 va_end(args); 3585 3586 mutex_exit(prtdata.mutex); 3587 } 3588 3589 #if defined(DEBUG) 3590 static void 3591 vr_prt(const char *fmt, ...) 3592 { 3593 va_list args; 3594 3595 ASSERT(mutex_owned(prtdata.mutex)); 3596 3597 va_start(args, fmt); 3598 vr_vprt(fmt, args); 3599 va_end(args); 3600 3601 mutex_exit(prtdata.mutex); 3602 } 3603 3604 void 3605 (*vr_debug())(const char *fmt, ...) 3606 { 3607 mutex_enter(prtdata.mutex); 3608 prtdata.ifname = MODULENAME; 3609 prtdata.fmt = "^%s: %s\n"; 3610 prtdata.level = CE_CONT; 3611 3612 return (vr_prt); 3613 } 3614 #endif /* DEBUG */ 3615 3616 DDI_DEFINE_STREAM_OPS(vr_dev_ops, nulldev, nulldev, vr_attach, vr_detach, 3617 nodev, NULL, D_MP, NULL, vr_quiesce); 3618 3619 static struct modldrv vr_modldrv = { 3620 &mod_driverops, /* Type of module. This one is a driver */ 3621 vr_ident, /* short description */ 3622 &vr_dev_ops /* driver specific ops */ 3623 }; 3624 3625 static struct modlinkage modlinkage = { 3626 MODREV_1, { (void *)&vr_modldrv, NULL } 3627 }; 3628 3629 int 3630 _info(struct modinfo *modinfop) 3631 { 3632 return (mod_info(&modlinkage, modinfop)); 3633 } 3634 3635 int 3636 _init(void) 3637 { 3638 int status; 3639 3640 mac_init_ops(&vr_dev_ops, MODULENAME); 3641 status = mod_install(&modlinkage); 3642 if (status == DDI_SUCCESS) 3643 mutex_init(prtdata.mutex, NULL, MUTEX_DRIVER, NULL); 3644 else 3645 mac_fini_ops(&vr_dev_ops); 3646 return (status); 3647 } 3648 3649 int 3650 _fini(void) 3651 { 3652 int status; 3653 3654 status = mod_remove(&modlinkage); 3655 if (status == 0) { 3656 mac_fini_ops(&vr_dev_ops); 3657 mutex_destroy(prtdata.mutex); 3658 } 3659 return (status); 3660 }