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 **)&regs, &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(&regs[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 }