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  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 
  26 #include "rge.h"
  27 
  28 /*
  29  * This is the string displayed by modinfo, etc.
  30  * Make sure you keep the version ID up to date!
  31  */
  32 static char rge_ident[] = "Realtek 1Gb Ethernet";
  33 
  34 /*
  35  * Used for buffers allocated by ddi_dma_mem_alloc()
  36  */
  37 static ddi_dma_attr_t dma_attr_buf = {
  38         DMA_ATTR_V0,            /* dma_attr version */
  39         (uint32_t)0,            /* dma_attr_addr_lo */
  40         (uint32_t)0xFFFFFFFF,   /* dma_attr_addr_hi */
  41         (uint32_t)0xFFFFFFFF,   /* dma_attr_count_max */
  42         (uint32_t)16,           /* dma_attr_align */
  43         0xFFFFFFFF,             /* dma_attr_burstsizes */
  44         1,                      /* dma_attr_minxfer */
  45         (uint32_t)0xFFFFFFFF,   /* dma_attr_maxxfer */
  46         (uint32_t)0xFFFFFFFF,   /* dma_attr_seg */
  47         1,                      /* dma_attr_sgllen */
  48         1,                      /* dma_attr_granular */
  49         0,                      /* dma_attr_flags */
  50 };
  51 
  52 /*
  53  * Used for BDs allocated by ddi_dma_mem_alloc()
  54  */
  55 static ddi_dma_attr_t dma_attr_desc = {
  56         DMA_ATTR_V0,            /* dma_attr version */
  57         (uint32_t)0,            /* dma_attr_addr_lo */
  58         (uint32_t)0xFFFFFFFF,   /* dma_attr_addr_hi */
  59         (uint32_t)0xFFFFFFFF,   /* dma_attr_count_max */
  60         (uint32_t)256,          /* dma_attr_align */
  61         0xFFFFFFFF,             /* dma_attr_burstsizes */
  62         1,                      /* dma_attr_minxfer */
  63         (uint32_t)0xFFFFFFFF,   /* dma_attr_maxxfer */
  64         (uint32_t)0xFFFFFFFF,   /* dma_attr_seg */
  65         1,                      /* dma_attr_sgllen */
  66         1,                      /* dma_attr_granular */
  67         0,                      /* dma_attr_flags */
  68 };
  69 
  70 /*
  71  * PIO access attributes for registers
  72  */
  73 static ddi_device_acc_attr_t rge_reg_accattr = {
  74         DDI_DEVICE_ATTR_V0,
  75         DDI_STRUCTURE_LE_ACC,
  76         DDI_STRICTORDER_ACC,
  77         DDI_DEFAULT_ACC
  78 };
  79 
  80 /*
  81  * DMA access attributes for descriptors
  82  */
  83 static ddi_device_acc_attr_t rge_desc_accattr = {
  84         DDI_DEVICE_ATTR_V0,
  85         DDI_NEVERSWAP_ACC,
  86         DDI_STRICTORDER_ACC,
  87         DDI_DEFAULT_ACC
  88 };
  89 
  90 /*
  91  * DMA access attributes for data
  92  */
  93 static ddi_device_acc_attr_t rge_buf_accattr = {
  94         DDI_DEVICE_ATTR_V0,
  95         DDI_NEVERSWAP_ACC,
  96         DDI_STRICTORDER_ACC,
  97         DDI_DEFAULT_ACC
  98 };
  99 
 100 /*
 101  * Property names
 102  */
 103 static char debug_propname[] = "rge_debug_flags";
 104 static char mtu_propname[] = "default_mtu";
 105 static char msi_propname[] = "msi_enable";
 106 
 107 static int              rge_m_start(void *);
 108 static void             rge_m_stop(void *);
 109 static int              rge_m_promisc(void *, boolean_t);
 110 static int              rge_m_multicst(void *, boolean_t, const uint8_t *);
 111 static int              rge_m_unicst(void *, const uint8_t *);
 112 static void             rge_m_ioctl(void *, queue_t *, mblk_t *);
 113 static boolean_t        rge_m_getcapab(void *, mac_capab_t, void *);
 114 
 115 #define RGE_M_CALLBACK_FLAGS    (MC_IOCTL | MC_GETCAPAB)
 116 
 117 static mac_callbacks_t rge_m_callbacks = {
 118         RGE_M_CALLBACK_FLAGS,
 119         rge_m_stat,
 120         rge_m_start,
 121         rge_m_stop,
 122         rge_m_promisc,
 123         rge_m_multicst,
 124         rge_m_unicst,
 125         rge_m_tx,
 126         NULL,
 127         rge_m_ioctl,
 128         rge_m_getcapab
 129 };
 130 
 131 /*
 132  * Allocate an area of memory and a DMA handle for accessing it
 133  */
 134 static int
 135 rge_alloc_dma_mem(rge_t *rgep, size_t memsize, ddi_dma_attr_t *dma_attr_p,
 136         ddi_device_acc_attr_t *acc_attr_p, uint_t dma_flags, dma_area_t *dma_p)
 137 {
 138         caddr_t vaddr;
 139         int err;
 140 
 141         /*
 142          * Allocate handle
 143          */
 144         err = ddi_dma_alloc_handle(rgep->devinfo, dma_attr_p,
 145             DDI_DMA_SLEEP, NULL, &dma_p->dma_hdl);
 146         if (err != DDI_SUCCESS) {
 147                 dma_p->dma_hdl = NULL;
 148                 return (DDI_FAILURE);
 149         }
 150 
 151         /*
 152          * Allocate memory
 153          */
 154         err = ddi_dma_mem_alloc(dma_p->dma_hdl, memsize, acc_attr_p,
 155             dma_flags & (DDI_DMA_CONSISTENT | DDI_DMA_STREAMING),
 156             DDI_DMA_SLEEP, NULL, &vaddr, &dma_p->alength, &dma_p->acc_hdl);
 157         if (err != DDI_SUCCESS) {
 158                 ddi_dma_free_handle(&dma_p->dma_hdl);
 159                 dma_p->dma_hdl = NULL;
 160                 dma_p->acc_hdl = NULL;
 161                 return (DDI_FAILURE);
 162         }
 163 
 164         /*
 165          * Bind the two together
 166          */
 167         dma_p->mem_va = vaddr;
 168         err = ddi_dma_addr_bind_handle(dma_p->dma_hdl, NULL,
 169             vaddr, dma_p->alength, dma_flags, DDI_DMA_SLEEP, NULL,
 170             &dma_p->cookie, &dma_p->ncookies);
 171         if (err != DDI_DMA_MAPPED || dma_p->ncookies != 1) {
 172                 ddi_dma_mem_free(&dma_p->acc_hdl);
 173                 ddi_dma_free_handle(&dma_p->dma_hdl);
 174                 dma_p->acc_hdl = NULL;
 175                 dma_p->dma_hdl = NULL;
 176                 return (DDI_FAILURE);
 177         }
 178 
 179         dma_p->nslots = ~0U;
 180         dma_p->size = ~0U;
 181         dma_p->token = ~0U;
 182         dma_p->offset = 0;
 183         return (DDI_SUCCESS);
 184 }
 185 
 186 /*
 187  * Free one allocated area of DMAable memory
 188  */
 189 static void
 190 rge_free_dma_mem(dma_area_t *dma_p)
 191 {
 192         if (dma_p->dma_hdl != NULL) {
 193                 if (dma_p->ncookies) {
 194                         (void) ddi_dma_unbind_handle(dma_p->dma_hdl);
 195                         dma_p->ncookies = 0;
 196                 }
 197                 ddi_dma_free_handle(&dma_p->dma_hdl);
 198                 dma_p->dma_hdl = NULL;
 199         }
 200 
 201         if (dma_p->acc_hdl != NULL) {
 202                 ddi_dma_mem_free(&dma_p->acc_hdl);
 203                 dma_p->acc_hdl = NULL;
 204         }
 205 }
 206 
 207 /*
 208  * Utility routine to carve a slice off a chunk of allocated memory,
 209  * updating the chunk descriptor accordingly.  The size of the slice
 210  * is given by the product of the <qty> and <size> parameters.
 211  */
 212 static void
 213 rge_slice_chunk(dma_area_t *slice, dma_area_t *chunk,
 214         uint32_t qty, uint32_t size)
 215 {
 216         static uint32_t sequence = 0xbcd5704a;
 217         size_t totsize;
 218 
 219         totsize = qty*size;
 220         ASSERT(totsize <= chunk->alength);
 221 
 222         *slice = *chunk;
 223         slice->nslots = qty;
 224         slice->size = size;
 225         slice->alength = totsize;
 226         slice->token = ++sequence;
 227 
 228         chunk->mem_va = (caddr_t)chunk->mem_va + totsize;
 229         chunk->alength -= totsize;
 230         chunk->offset += totsize;
 231         chunk->cookie.dmac_laddress += totsize;
 232         chunk->cookie.dmac_size -= totsize;
 233 }
 234 
 235 static int
 236 rge_alloc_bufs(rge_t *rgep)
 237 {
 238         size_t txdescsize;
 239         size_t rxdescsize;
 240         int err;
 241 
 242         /*
 243          * Allocate memory & handle for packet statistics
 244          */
 245         err = rge_alloc_dma_mem(rgep,
 246             RGE_STATS_DUMP_SIZE,
 247             &dma_attr_desc,
 248             &rge_desc_accattr,
 249             DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
 250             &rgep->dma_area_stats);
 251         if (err != DDI_SUCCESS)
 252                 return (DDI_FAILURE);
 253         rgep->hw_stats = DMA_VPTR(rgep->dma_area_stats);
 254 
 255         /*
 256          * Allocate memory & handle for Tx descriptor ring
 257          */
 258         txdescsize = RGE_SEND_SLOTS * sizeof (rge_bd_t);
 259         err = rge_alloc_dma_mem(rgep,
 260             txdescsize,
 261             &dma_attr_desc,
 262             &rge_desc_accattr,
 263             DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
 264             &rgep->dma_area_txdesc);
 265         if (err != DDI_SUCCESS)
 266                 return (DDI_FAILURE);
 267 
 268         /*
 269          * Allocate memory & handle for Rx descriptor ring
 270          */
 271         rxdescsize = RGE_RECV_SLOTS * sizeof (rge_bd_t);
 272         err = rge_alloc_dma_mem(rgep,
 273             rxdescsize,
 274             &dma_attr_desc,
 275             &rge_desc_accattr,
 276             DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
 277             &rgep->dma_area_rxdesc);
 278         if (err != DDI_SUCCESS)
 279                 return (DDI_FAILURE);
 280 
 281         return (DDI_SUCCESS);
 282 }
 283 
 284 /*
 285  * rge_free_bufs() -- free descriptors/buffers allocated for this
 286  * device instance.
 287  */
 288 static void
 289 rge_free_bufs(rge_t *rgep)
 290 {
 291         rge_free_dma_mem(&rgep->dma_area_stats);
 292         rge_free_dma_mem(&rgep->dma_area_txdesc);
 293         rge_free_dma_mem(&rgep->dma_area_rxdesc);
 294 }
 295 
 296 /*
 297  * ========== Transmit and receive ring reinitialisation ==========
 298  */
 299 
 300 /*
 301  * These <reinit> routines each reset the rx/tx rings to an initial
 302  * state, assuming that the corresponding <init> routine has already
 303  * been called exactly once.
 304  */
 305 static void
 306 rge_reinit_send_ring(rge_t *rgep)
 307 {
 308         sw_sbd_t *ssbdp;
 309         rge_bd_t *bdp;
 310         uint32_t slot;
 311 
 312         /*
 313          * re-init send ring
 314          */
 315         DMA_ZERO(rgep->tx_desc);
 316         ssbdp = rgep->sw_sbds;
 317         bdp = rgep->tx_ring;
 318         for (slot = 0; slot < RGE_SEND_SLOTS; slot++) {
 319                 bdp->host_buf_addr =
 320                     RGE_BSWAP_32(ssbdp->pbuf.cookie.dmac_laddress);
 321                 bdp->host_buf_addr_hi =
 322                     RGE_BSWAP_32(ssbdp->pbuf.cookie.dmac_laddress >> 32);
 323                 /* last BD in Tx ring */
 324                 if (slot == (RGE_SEND_SLOTS - 1))
 325                         bdp->flags_len = RGE_BSWAP_32(BD_FLAG_EOR);
 326                 ssbdp++;
 327                 bdp++;
 328         }
 329         DMA_SYNC(rgep->tx_desc, DDI_DMA_SYNC_FORDEV);
 330         rgep->tx_next = 0;
 331         rgep->tc_next = 0;
 332         rgep->tc_tail = 0;
 333         rgep->tx_flow = 0;
 334         rgep->tx_free = RGE_SEND_SLOTS;
 335 }
 336 
 337 static void
 338 rge_reinit_recv_ring(rge_t *rgep)
 339 {
 340         rge_bd_t *bdp;
 341         sw_rbd_t *srbdp;
 342         dma_area_t *pbuf;
 343         uint32_t slot;
 344 
 345         /*
 346          * re-init receive ring
 347          */
 348         DMA_ZERO(rgep->rx_desc);
 349         srbdp = rgep->sw_rbds;
 350         bdp = rgep->rx_ring;
 351         for (slot = 0; slot < RGE_RECV_SLOTS; slot++) {
 352                 pbuf = &srbdp->rx_buf->pbuf;
 353                 bdp->host_buf_addr =
 354                     RGE_BSWAP_32(pbuf->cookie.dmac_laddress + rgep->head_room);
 355                 bdp->host_buf_addr_hi =
 356                     RGE_BSWAP_32(pbuf->cookie.dmac_laddress >> 32);
 357                 bdp->flags_len = RGE_BSWAP_32(BD_FLAG_HW_OWN |
 358                     (rgep->rxbuf_size - rgep->head_room));
 359                 /* last BD in Tx ring */
 360                 if (slot == (RGE_RECV_SLOTS - 1))
 361                         bdp->flags_len |= RGE_BSWAP_32(BD_FLAG_EOR);
 362                 srbdp++;
 363                 bdp++;
 364         }
 365         DMA_SYNC(rgep->rx_desc, DDI_DMA_SYNC_FORDEV);
 366         rgep->watchdog = 0;
 367         rgep->rx_next = 0;
 368 }
 369 
 370 static void
 371 rge_reinit_buf_ring(rge_t *rgep)
 372 {
 373 
 374         if (rgep->chip_flags & CHIP_FLAG_FORCE_BCOPY)
 375                 return;
 376 
 377         /*
 378          * If all the up-sending buffers haven't been returned to driver,
 379          * use bcopy() only in rx process.
 380          */
 381         if (rgep->rx_free != RGE_BUF_SLOTS)
 382                 rgep->rx_bcopy = B_TRUE;
 383 }
 384 
 385 static void
 386 rge_reinit_rings(rge_t *rgep)
 387 {
 388         rge_reinit_send_ring(rgep);
 389         rge_reinit_recv_ring(rgep);
 390         rge_reinit_buf_ring(rgep);
 391 }
 392 
 393 static void
 394 rge_fini_send_ring(rge_t *rgep)
 395 {
 396         sw_sbd_t *ssbdp;
 397         uint32_t slot;
 398 
 399         ssbdp = rgep->sw_sbds;
 400         for (slot = 0; slot < RGE_SEND_SLOTS; ++slot) {
 401                 rge_free_dma_mem(&ssbdp->pbuf);
 402                 ssbdp++;
 403         }
 404 
 405         kmem_free(rgep->sw_sbds, RGE_SEND_SLOTS * sizeof (sw_sbd_t));
 406         rgep->sw_sbds = NULL;
 407 }
 408 
 409 static void
 410 rge_fini_recv_ring(rge_t *rgep)
 411 {
 412         sw_rbd_t *srbdp;
 413         uint32_t slot;
 414 
 415         srbdp = rgep->sw_rbds;
 416         for (slot = 0; slot < RGE_RECV_SLOTS; ++srbdp, ++slot) {
 417                 if (srbdp->rx_buf) {
 418                         if (srbdp->rx_buf->mp != NULL) {
 419                                 freemsg(srbdp->rx_buf->mp);
 420                                 srbdp->rx_buf->mp = NULL;
 421                         }
 422                         rge_free_dma_mem(&srbdp->rx_buf->pbuf);
 423                         kmem_free(srbdp->rx_buf, sizeof (dma_buf_t));
 424                         srbdp->rx_buf = NULL;
 425                 }
 426         }
 427 
 428         kmem_free(rgep->sw_rbds, RGE_RECV_SLOTS * sizeof (sw_rbd_t));
 429         rgep->sw_rbds = NULL;
 430 }
 431 
 432 static void
 433 rge_fini_buf_ring(rge_t *rgep)
 434 {
 435         sw_rbd_t *srbdp;
 436         uint32_t slot;
 437 
 438         if (rgep->chip_flags & CHIP_FLAG_FORCE_BCOPY)
 439                 return;
 440 
 441         ASSERT(rgep->rx_free == RGE_BUF_SLOTS);
 442 
 443         srbdp = rgep->free_srbds;
 444         for (slot = 0; slot < RGE_BUF_SLOTS; ++srbdp, ++slot) {
 445                 if (srbdp->rx_buf != NULL) {
 446                         if (srbdp->rx_buf->mp != NULL) {
 447                                 freemsg(srbdp->rx_buf->mp);
 448                                 srbdp->rx_buf->mp = NULL;
 449                         }
 450                         rge_free_dma_mem(&srbdp->rx_buf->pbuf);
 451                         kmem_free(srbdp->rx_buf, sizeof (dma_buf_t));
 452                         srbdp->rx_buf = NULL;
 453                 }
 454         }
 455 
 456         kmem_free(rgep->free_srbds, RGE_BUF_SLOTS * sizeof (sw_rbd_t));
 457         rgep->free_srbds = NULL;
 458 }
 459 
 460 static void
 461 rge_fini_rings(rge_t *rgep)
 462 {
 463         rge_fini_send_ring(rgep);
 464         rge_fini_recv_ring(rgep);
 465         rge_fini_buf_ring(rgep);
 466 }
 467 
 468 static int
 469 rge_init_send_ring(rge_t *rgep)
 470 {
 471         uint32_t slot;
 472         sw_sbd_t *ssbdp;
 473         dma_area_t *pbuf;
 474         dma_area_t desc;
 475         int err;
 476 
 477         /*
 478          * Allocate the array of s/w Tx Buffer Descriptors
 479          */
 480         ssbdp = kmem_zalloc(RGE_SEND_SLOTS*sizeof (*ssbdp), KM_SLEEP);
 481         rgep->sw_sbds = ssbdp;
 482 
 483         /*
 484          * Init send ring
 485          */
 486         rgep->tx_desc = rgep->dma_area_txdesc;
 487         DMA_ZERO(rgep->tx_desc);
 488         rgep->tx_ring = rgep->tx_desc.mem_va;
 489 
 490         desc = rgep->tx_desc;
 491         for (slot = 0; slot < RGE_SEND_SLOTS; slot++) {
 492                 rge_slice_chunk(&ssbdp->desc, &desc, 1, sizeof (rge_bd_t));
 493 
 494                 /*
 495                  * Allocate memory & handle for Tx buffers
 496                  */
 497                 pbuf = &ssbdp->pbuf;
 498                 err = rge_alloc_dma_mem(rgep, rgep->txbuf_size,
 499                     &dma_attr_buf, &rge_buf_accattr,
 500                     DDI_DMA_WRITE | DDI_DMA_STREAMING, pbuf);
 501                 if (err != DDI_SUCCESS) {
 502                         rge_error(rgep,
 503                             "rge_init_send_ring: alloc tx buffer failed");
 504                         rge_fini_send_ring(rgep);
 505                         return (DDI_FAILURE);
 506                 }
 507                 ssbdp++;
 508         }
 509         ASSERT(desc.alength == 0);
 510 
 511         DMA_SYNC(rgep->tx_desc, DDI_DMA_SYNC_FORDEV);
 512         return (DDI_SUCCESS);
 513 }
 514 
 515 static int
 516 rge_init_recv_ring(rge_t *rgep)
 517 {
 518         uint32_t slot;
 519         sw_rbd_t *srbdp;
 520         dma_buf_t *rx_buf;
 521         dma_area_t *pbuf;
 522         int err;
 523 
 524         /*
 525          * Allocate the array of s/w Rx Buffer Descriptors
 526          */
 527         srbdp = kmem_zalloc(RGE_RECV_SLOTS*sizeof (*srbdp), KM_SLEEP);
 528         rgep->sw_rbds = srbdp;
 529 
 530         /*
 531          * Init receive ring
 532          */
 533         rgep->rx_next = 0;
 534         rgep->rx_desc = rgep->dma_area_rxdesc;
 535         DMA_ZERO(rgep->rx_desc);
 536         rgep->rx_ring = rgep->rx_desc.mem_va;
 537 
 538         for (slot = 0; slot < RGE_RECV_SLOTS; slot++) {
 539                 srbdp->rx_buf = rx_buf =
 540                     kmem_zalloc(sizeof (dma_buf_t), KM_SLEEP);
 541 
 542                 /*
 543                  * Allocate memory & handle for Rx buffers
 544                  */
 545                 pbuf = &rx_buf->pbuf;
 546                 err = rge_alloc_dma_mem(rgep, rgep->rxbuf_size,
 547                     &dma_attr_buf, &rge_buf_accattr,
 548                     DDI_DMA_READ | DDI_DMA_STREAMING, pbuf);
 549                 if (err != DDI_SUCCESS) {
 550                         rge_fini_recv_ring(rgep);
 551                         rge_error(rgep,
 552                             "rge_init_recv_ring: alloc rx buffer failed");
 553                         return (DDI_FAILURE);
 554                 }
 555 
 556                 pbuf->alength -= rgep->head_room;
 557                 pbuf->offset += rgep->head_room;
 558                 if (!(rgep->chip_flags & CHIP_FLAG_FORCE_BCOPY)) {
 559                         rx_buf->rx_recycle.free_func = rge_rx_recycle;
 560                         rx_buf->rx_recycle.free_arg = (caddr_t)rx_buf;
 561                         rx_buf->private = (caddr_t)rgep;
 562                         rx_buf->mp = desballoc(DMA_VPTR(rx_buf->pbuf),
 563                             rgep->rxbuf_size, 0, &rx_buf->rx_recycle);
 564                         if (rx_buf->mp == NULL) {
 565                                 rge_fini_recv_ring(rgep);
 566                                 rge_problem(rgep,
 567                                     "rge_init_recv_ring: desballoc() failed");
 568                                 return (DDI_FAILURE);
 569                         }
 570                 }
 571                 srbdp++;
 572         }
 573         DMA_SYNC(rgep->rx_desc, DDI_DMA_SYNC_FORDEV);
 574         return (DDI_SUCCESS);
 575 }
 576 
 577 static int
 578 rge_init_buf_ring(rge_t *rgep)
 579 {
 580         uint32_t slot;
 581         sw_rbd_t *free_srbdp;
 582         dma_buf_t *rx_buf;
 583         dma_area_t *pbuf;
 584         int err;
 585 
 586         if (rgep->chip_flags & CHIP_FLAG_FORCE_BCOPY) {
 587                 rgep->rx_bcopy = B_TRUE;
 588                 return (DDI_SUCCESS);
 589         }
 590 
 591         /*
 592          * Allocate the array of s/w free Buffer Descriptors
 593          */
 594         free_srbdp = kmem_zalloc(RGE_BUF_SLOTS*sizeof (*free_srbdp), KM_SLEEP);
 595         rgep->free_srbds = free_srbdp;
 596 
 597         /*
 598          * Init free buffer ring
 599          */
 600         rgep->rc_next = 0;
 601         rgep->rf_next = 0;
 602         rgep->rx_bcopy = B_FALSE;
 603         rgep->rx_free = RGE_BUF_SLOTS;
 604         for (slot = 0; slot < RGE_BUF_SLOTS; slot++) {
 605                 free_srbdp->rx_buf = rx_buf =
 606                     kmem_zalloc(sizeof (dma_buf_t), KM_SLEEP);
 607 
 608                 /*
 609                  * Allocate memory & handle for free Rx buffers
 610                  */
 611                 pbuf = &rx_buf->pbuf;
 612                 err = rge_alloc_dma_mem(rgep, rgep->rxbuf_size,
 613                     &dma_attr_buf, &rge_buf_accattr,
 614                     DDI_DMA_READ | DDI_DMA_STREAMING, pbuf);
 615                 if (err != DDI_SUCCESS) {
 616                         rge_fini_buf_ring(rgep);
 617                         rge_error(rgep,
 618                             "rge_init_buf_ring: alloc rx free buffer failed");
 619                         return (DDI_FAILURE);
 620                 }
 621                 pbuf->alength -= rgep->head_room;
 622                 pbuf->offset += rgep->head_room;
 623                 rx_buf->rx_recycle.free_func = rge_rx_recycle;
 624                 rx_buf->rx_recycle.free_arg = (caddr_t)rx_buf;
 625                 rx_buf->private = (caddr_t)rgep;
 626                 rx_buf->mp = desballoc(DMA_VPTR(rx_buf->pbuf),
 627                     rgep->rxbuf_size, 0, &rx_buf->rx_recycle);
 628                 if (rx_buf->mp == NULL) {
 629                         rge_fini_buf_ring(rgep);
 630                         rge_problem(rgep,
 631                             "rge_init_buf_ring: desballoc() failed");
 632                         return (DDI_FAILURE);
 633                 }
 634                 free_srbdp++;
 635         }
 636         return (DDI_SUCCESS);
 637 }
 638 
 639 static int
 640 rge_init_rings(rge_t *rgep)
 641 {
 642         int err;
 643 
 644         err = rge_init_send_ring(rgep);
 645         if (err != DDI_SUCCESS)
 646                 return (DDI_FAILURE);
 647 
 648         err = rge_init_recv_ring(rgep);
 649         if (err != DDI_SUCCESS) {
 650                 rge_fini_send_ring(rgep);
 651                 return (DDI_FAILURE);
 652         }
 653 
 654         err = rge_init_buf_ring(rgep);
 655         if (err != DDI_SUCCESS) {
 656                 rge_fini_send_ring(rgep);
 657                 rge_fini_recv_ring(rgep);
 658                 return (DDI_FAILURE);
 659         }
 660 
 661         return (DDI_SUCCESS);
 662 }
 663 
 664 /*
 665  * ========== Internal state management entry points ==========
 666  */
 667 
 668 #undef  RGE_DBG
 669 #define RGE_DBG         RGE_DBG_NEMO    /* debug flag for this code     */
 670 
 671 /*
 672  * These routines provide all the functionality required by the
 673  * corresponding MAC layer entry points, but don't update the
 674  * MAC state so they can be called internally without disturbing
 675  * our record of what NEMO thinks we should be doing ...
 676  */
 677 
 678 /*
 679  *      rge_reset() -- reset h/w & rings to initial state
 680  */
 681 static void
 682 rge_reset(rge_t *rgep)
 683 {
 684         ASSERT(mutex_owned(rgep->genlock));
 685 
 686         /*
 687          * Grab all the other mutexes in the world (this should
 688          * ensure no other threads are manipulating driver state)
 689          */
 690         mutex_enter(rgep->rx_lock);
 691         mutex_enter(rgep->rc_lock);
 692         rw_enter(rgep->errlock, RW_WRITER);
 693 
 694         (void) rge_chip_reset(rgep);
 695         rge_reinit_rings(rgep);
 696         rge_chip_init(rgep);
 697 
 698         /*
 699          * Free the world ...
 700          */
 701         rw_exit(rgep->errlock);
 702         mutex_exit(rgep->rc_lock);
 703         mutex_exit(rgep->rx_lock);
 704 
 705         rgep->stats.rpackets = 0;
 706         rgep->stats.rbytes = 0;
 707         rgep->stats.opackets = 0;
 708         rgep->stats.obytes = 0;
 709         rgep->stats.tx_pre_ismax = B_FALSE;
 710         rgep->stats.tx_cur_ismax = B_FALSE;
 711 
 712         RGE_DEBUG(("rge_reset($%p) done", (void *)rgep));
 713 }
 714 
 715 /*
 716  *      rge_stop() -- stop processing, don't reset h/w or rings
 717  */
 718 static void
 719 rge_stop(rge_t *rgep)
 720 {
 721         ASSERT(mutex_owned(rgep->genlock));
 722 
 723         rge_chip_stop(rgep, B_FALSE);
 724 
 725         RGE_DEBUG(("rge_stop($%p) done", (void *)rgep));
 726 }
 727 
 728 /*
 729  *      rge_start() -- start transmitting/receiving
 730  */
 731 static void
 732 rge_start(rge_t *rgep)
 733 {
 734         ASSERT(mutex_owned(rgep->genlock));
 735 
 736         /*
 737          * Start chip processing, including enabling interrupts
 738          */
 739         rge_chip_start(rgep);
 740         rgep->watchdog = 0;
 741 }
 742 
 743 /*
 744  * rge_restart - restart transmitting/receiving after error or suspend
 745  */
 746 void
 747 rge_restart(rge_t *rgep)
 748 {
 749         uint32_t i;
 750 
 751         ASSERT(mutex_owned(rgep->genlock));
 752         /*
 753          * Wait for posted buffer to be freed...
 754          */
 755         if (!rgep->rx_bcopy) {
 756                 for (i = 0; i < RXBUFF_FREE_LOOP; i++) {
 757                         if (rgep->rx_free == RGE_BUF_SLOTS)
 758                                 break;
 759                         drv_usecwait(1000);
 760                         RGE_DEBUG(("rge_restart: waiting for rx buf free..."));
 761                 }
 762         }
 763         rge_reset(rgep);
 764         rgep->stats.chip_reset++;
 765         if (rgep->rge_mac_state == RGE_MAC_STARTED) {
 766                 rge_start(rgep);
 767                 rgep->resched_needed = B_TRUE;
 768                 (void) ddi_intr_trigger_softint(rgep->resched_hdl, NULL);
 769         }
 770 }
 771 
 772 
 773 /*
 774  * ========== Nemo-required management entry points ==========
 775  */
 776 
 777 #undef  RGE_DBG
 778 #define RGE_DBG         RGE_DBG_NEMO    /* debug flag for this code     */
 779 
 780 /*
 781  *      rge_m_stop() -- stop transmitting/receiving
 782  */
 783 static void
 784 rge_m_stop(void *arg)
 785 {
 786         rge_t *rgep = arg;              /* private device info  */
 787         uint32_t i;
 788 
 789         /*
 790          * Just stop processing, then record new MAC state
 791          */
 792         mutex_enter(rgep->genlock);
 793         if (rgep->suspended) {
 794                 ASSERT(rgep->rge_mac_state == RGE_MAC_STOPPED);
 795                 mutex_exit(rgep->genlock);
 796                 return;
 797         }
 798         rge_stop(rgep);
 799         /*
 800          * Wait for posted buffer to be freed...
 801          */
 802         if (!rgep->rx_bcopy) {
 803                 for (i = 0; i < RXBUFF_FREE_LOOP; i++) {
 804                         if (rgep->rx_free == RGE_BUF_SLOTS)
 805                                 break;
 806                         drv_usecwait(1000);
 807                         RGE_DEBUG(("rge_m_stop: waiting for rx buf free..."));
 808                 }
 809         }
 810         rgep->rge_mac_state = RGE_MAC_STOPPED;
 811         RGE_DEBUG(("rge_m_stop($%p) done", arg));
 812         mutex_exit(rgep->genlock);
 813 }
 814 
 815 /*
 816  *      rge_m_start() -- start transmitting/receiving
 817  */
 818 static int
 819 rge_m_start(void *arg)
 820 {
 821         rge_t *rgep = arg;              /* private device info  */
 822 
 823         mutex_enter(rgep->genlock);
 824         if (rgep->suspended) {
 825                 mutex_exit(rgep->genlock);
 826                 return (DDI_FAILURE);
 827         }
 828         /*
 829          * Clear hw/sw statistics
 830          */
 831         DMA_ZERO(rgep->dma_area_stats);
 832         bzero(&rgep->stats, sizeof (rge_stats_t));
 833 
 834         /*
 835          * Start processing and record new MAC state
 836          */
 837         rge_reset(rgep);
 838         rge_start(rgep);
 839         rgep->rge_mac_state = RGE_MAC_STARTED;
 840         RGE_DEBUG(("rge_m_start($%p) done", arg));
 841 
 842         mutex_exit(rgep->genlock);
 843 
 844         return (0);
 845 }
 846 
 847 /*
 848  *      rge_m_unicst_set() -- set the physical network address
 849  */
 850 static int
 851 rge_m_unicst(void *arg, const uint8_t *macaddr)
 852 {
 853         rge_t *rgep = arg;              /* private device info  */
 854 
 855         /*
 856          * Remember the new current address in the driver state
 857          * Sync the chip's idea of the address too ...
 858          */
 859         mutex_enter(rgep->genlock);
 860         bcopy(macaddr, rgep->netaddr, ETHERADDRL);
 861 
 862         if (rgep->suspended) {
 863                 mutex_exit(rgep->genlock);
 864                 return (DDI_SUCCESS);
 865         }
 866 
 867         rge_chip_sync(rgep, RGE_SET_MAC);
 868         mutex_exit(rgep->genlock);
 869 
 870         return (0);
 871 }
 872 
 873 /*
 874  * Compute the index of the required bit in the multicast hash map.
 875  * This must mirror the way the hardware actually does it!
 876  */
 877 static uint32_t
 878 rge_hash_index(const uint8_t *mca)
 879 {
 880         uint32_t crc = (uint32_t)RGE_HASH_CRC;
 881         uint32_t const POLY = RGE_HASH_POLY;
 882         uint32_t msb;
 883         int bytes;
 884         uchar_t currentbyte;
 885         uint32_t index;
 886         int bit;
 887 
 888         for (bytes = 0; bytes < ETHERADDRL; bytes++) {
 889                 currentbyte = mca[bytes];
 890                 for (bit = 0; bit < 8; bit++) {
 891                         msb = crc >> 31;
 892                         crc <<= 1;
 893                         if (msb ^ (currentbyte & 1))
 894                                 crc ^= POLY;
 895                         currentbyte >>= 1;
 896                 }
 897         }
 898         index = crc >> 26;
 899                 /* the index value is between 0 and 63(0x3f) */
 900 
 901         return (index);
 902 }
 903 
 904 /*
 905  *      rge_m_multicst_add() -- enable/disable a multicast address
 906  */
 907 static int
 908 rge_m_multicst(void *arg, boolean_t add, const uint8_t *mca)
 909 {
 910         rge_t *rgep = arg;              /* private device info  */
 911         struct ether_addr *addr;
 912         uint32_t index;
 913         uint32_t reg;
 914         uint8_t *hashp;
 915 
 916         mutex_enter(rgep->genlock);
 917         hashp = rgep->mcast_hash;
 918         addr = (struct ether_addr *)mca;
 919         /*
 920          * Calculate the Multicast address hash index value
 921          *      Normally, the position of MAR0-MAR7 is
 922          *      MAR0: offset 0x08, ..., MAR7: offset 0x0F.
 923          *
 924          *      For pcie chipset, the position of MAR0-MAR7 is
 925          *      different from others:
 926          *      MAR0: offset 0x0F, ..., MAR7: offset 0x08.
 927          */
 928         index = rge_hash_index(addr->ether_addr_octet);
 929         if (rgep->chipid.is_pcie)
 930                 reg = (~(index / RGE_MCAST_NUM)) & 0x7;
 931         else
 932                 reg = index / RGE_MCAST_NUM;
 933 
 934         if (add) {
 935                 if (rgep->mcast_refs[index]++) {
 936                         mutex_exit(rgep->genlock);
 937                         return (0);
 938                 }
 939                 hashp[reg] |= 1 << (index % RGE_MCAST_NUM);
 940         } else {
 941                 if (--rgep->mcast_refs[index]) {
 942                         mutex_exit(rgep->genlock);
 943                         return (0);
 944                 }
 945                 hashp[reg] &= ~ (1 << (index % RGE_MCAST_NUM));
 946         }
 947 
 948         if (rgep->suspended) {
 949                 mutex_exit(rgep->genlock);
 950                 return (DDI_SUCCESS);
 951         }
 952 
 953         /*
 954          * Set multicast register
 955          */
 956         rge_chip_sync(rgep, RGE_SET_MUL);
 957 
 958         mutex_exit(rgep->genlock);
 959         return (0);
 960 }
 961 
 962 /*
 963  * rge_m_promisc() -- set or reset promiscuous mode on the board
 964  *
 965  *      Program the hardware to enable/disable promiscuous and/or
 966  *      receive-all-multicast modes.
 967  */
 968 static int
 969 rge_m_promisc(void *arg, boolean_t on)
 970 {
 971         rge_t *rgep = arg;
 972 
 973         /*
 974          * Store MAC layer specified mode and pass to chip layer to update h/w
 975          */
 976         mutex_enter(rgep->genlock);
 977 
 978         if (rgep->promisc == on) {
 979                 mutex_exit(rgep->genlock);
 980                 return (0);
 981         }
 982         rgep->promisc = on;
 983 
 984         if (rgep->suspended) {
 985                 mutex_exit(rgep->genlock);
 986                 return (DDI_SUCCESS);
 987         }
 988 
 989         rge_chip_sync(rgep, RGE_SET_PROMISC);
 990         RGE_DEBUG(("rge_m_promisc_set($%p) done", arg));
 991         mutex_exit(rgep->genlock);
 992         return (0);
 993 }
 994 
 995 /*
 996  * Loopback ioctl code
 997  */
 998 
 999 static lb_property_t loopmodes[] = {
1000         { normal,       "normal",       RGE_LOOP_NONE           },
1001         { internal,     "PHY",          RGE_LOOP_INTERNAL_PHY   },
1002         { internal,     "MAC",          RGE_LOOP_INTERNAL_MAC   }
1003 };
1004 
1005 static enum ioc_reply
1006 rge_set_loop_mode(rge_t *rgep, uint32_t mode)
1007 {
1008         /*
1009          * If the mode isn't being changed, there's nothing to do ...
1010          */
1011         if (mode == rgep->param_loop_mode)
1012                 return (IOC_ACK);
1013 
1014         /*
1015          * Validate the requested mode and prepare a suitable message
1016          * to explain the link down/up cycle that the change will
1017          * probably induce ...
1018          */
1019         switch (mode) {
1020         default:
1021                 return (IOC_INVAL);
1022 
1023         case RGE_LOOP_NONE:
1024         case RGE_LOOP_INTERNAL_PHY:
1025         case RGE_LOOP_INTERNAL_MAC:
1026                 break;
1027         }
1028 
1029         /*
1030          * All OK; tell the caller to reprogram
1031          * the PHY and/or MAC for the new mode ...
1032          */
1033         rgep->param_loop_mode = mode;
1034         return (IOC_RESTART_ACK);
1035 }
1036 
1037 static enum ioc_reply
1038 rge_loop_ioctl(rge_t *rgep, queue_t *wq, mblk_t *mp, struct iocblk *iocp)
1039 {
1040         lb_info_sz_t *lbsp;
1041         lb_property_t *lbpp;
1042         uint32_t *lbmp;
1043         int cmd;
1044 
1045         _NOTE(ARGUNUSED(wq))
1046 
1047         /*
1048          * Validate format of ioctl
1049          */
1050         if (mp->b_cont == NULL)
1051                 return (IOC_INVAL);
1052 
1053         cmd = iocp->ioc_cmd;
1054         switch (cmd) {
1055         default:
1056                 /* NOTREACHED */
1057                 rge_error(rgep, "rge_loop_ioctl: invalid cmd 0x%x", cmd);
1058                 return (IOC_INVAL);
1059 
1060         case LB_GET_INFO_SIZE:
1061                 if (iocp->ioc_count != sizeof (lb_info_sz_t))
1062                         return (IOC_INVAL);
1063                 lbsp = (lb_info_sz_t *)mp->b_cont->b_rptr;
1064                 *lbsp = sizeof (loopmodes);
1065                 return (IOC_REPLY);
1066 
1067         case LB_GET_INFO:
1068                 if (iocp->ioc_count != sizeof (loopmodes))
1069                         return (IOC_INVAL);
1070                 lbpp = (lb_property_t *)mp->b_cont->b_rptr;
1071                 bcopy(loopmodes, lbpp, sizeof (loopmodes));
1072                 return (IOC_REPLY);
1073 
1074         case LB_GET_MODE:
1075                 if (iocp->ioc_count != sizeof (uint32_t))
1076                         return (IOC_INVAL);
1077                 lbmp = (uint32_t *)mp->b_cont->b_rptr;
1078                 *lbmp = rgep->param_loop_mode;
1079                 return (IOC_REPLY);
1080 
1081         case LB_SET_MODE:
1082                 if (iocp->ioc_count != sizeof (uint32_t))
1083                         return (IOC_INVAL);
1084                 lbmp = (uint32_t *)mp->b_cont->b_rptr;
1085                 return (rge_set_loop_mode(rgep, *lbmp));
1086         }
1087 }
1088 
1089 /*
1090  * Specific rge IOCTLs, the MAC layer handles the generic ones.
1091  */
1092 static void
1093 rge_m_ioctl(void *arg, queue_t *wq, mblk_t *mp)
1094 {
1095         rge_t *rgep = arg;
1096         struct iocblk *iocp;
1097         enum ioc_reply status;
1098         boolean_t need_privilege;
1099         int err;
1100         int cmd;
1101 
1102         /*
1103          * If suspended, we might actually be able to do some of
1104          * these ioctls, but it is harder to make sure they occur
1105          * without actually putting the hardware in an undesireable
1106          * state.  So just NAK it.
1107          */
1108         mutex_enter(rgep->genlock);
1109         if (rgep->suspended) {
1110                 miocnak(wq, mp, 0, EINVAL);
1111                 mutex_exit(rgep->genlock);
1112                 return;
1113         }
1114         mutex_exit(rgep->genlock);
1115 
1116         /*
1117          * Validate the command before bothering with the mutex ...
1118          */
1119         iocp = (struct iocblk *)mp->b_rptr;
1120         iocp->ioc_error = 0;
1121         need_privilege = B_TRUE;
1122         cmd = iocp->ioc_cmd;
1123         switch (cmd) {
1124         default:
1125                 miocnak(wq, mp, 0, EINVAL);
1126                 return;
1127 
1128         case RGE_MII_READ:
1129         case RGE_MII_WRITE:
1130         case RGE_DIAG:
1131         case RGE_PEEK:
1132         case RGE_POKE:
1133         case RGE_PHY_RESET:
1134         case RGE_SOFT_RESET:
1135         case RGE_HARD_RESET:
1136                 break;
1137 
1138         case LB_GET_INFO_SIZE:
1139         case LB_GET_INFO:
1140         case LB_GET_MODE:
1141                 need_privilege = B_FALSE;
1142                 /* FALLTHRU */
1143         case LB_SET_MODE:
1144                 break;
1145 
1146         case ND_GET:
1147                 need_privilege = B_FALSE;
1148                 /* FALLTHRU */
1149         case ND_SET:
1150                 break;
1151         }
1152 
1153         if (need_privilege) {
1154                 /*
1155                  * Check for specific net_config privilege
1156                  */
1157                 err = secpolicy_net_config(iocp->ioc_cr, B_FALSE);
1158                 if (err != 0) {
1159                         miocnak(wq, mp, 0, err);
1160                         return;
1161                 }
1162         }
1163 
1164         mutex_enter(rgep->genlock);
1165 
1166         switch (cmd) {
1167         default:
1168                 _NOTE(NOTREACHED)
1169                 status = IOC_INVAL;
1170                 break;
1171 
1172         case RGE_MII_READ:
1173         case RGE_MII_WRITE:
1174         case RGE_DIAG:
1175         case RGE_PEEK:
1176         case RGE_POKE:
1177         case RGE_PHY_RESET:
1178         case RGE_SOFT_RESET:
1179         case RGE_HARD_RESET:
1180                 status = rge_chip_ioctl(rgep, wq, mp, iocp);
1181                 break;
1182 
1183         case LB_GET_INFO_SIZE:
1184         case LB_GET_INFO:
1185         case LB_GET_MODE:
1186         case LB_SET_MODE:
1187                 status = rge_loop_ioctl(rgep, wq, mp, iocp);
1188                 break;
1189 
1190         case ND_GET:
1191         case ND_SET:
1192                 status = rge_nd_ioctl(rgep, wq, mp, iocp);
1193                 break;
1194         }
1195 
1196         /*
1197          * Do we need to reprogram the PHY and/or the MAC?
1198          * Do it now, while we still have the mutex.
1199          *
1200          * Note: update the PHY first, 'cos it controls the
1201          * speed/duplex parameters that the MAC code uses.
1202          */
1203         switch (status) {
1204         case IOC_RESTART_REPLY:
1205         case IOC_RESTART_ACK:
1206                 rge_phy_update(rgep);
1207                 break;
1208         }
1209 
1210         mutex_exit(rgep->genlock);
1211 
1212         /*
1213          * Finally, decide how to reply
1214          */
1215         switch (status) {
1216         default:
1217         case IOC_INVAL:
1218                 /*
1219                  * Error, reply with a NAK and EINVAL or the specified error
1220                  */
1221                 miocnak(wq, mp, 0, iocp->ioc_error == 0 ?
1222                     EINVAL : iocp->ioc_error);
1223                 break;
1224 
1225         case IOC_DONE:
1226                 /*
1227                  * OK, reply already sent
1228                  */
1229                 break;
1230 
1231         case IOC_RESTART_ACK:
1232         case IOC_ACK:
1233                 /*
1234                  * OK, reply with an ACK
1235                  */
1236                 miocack(wq, mp, 0, 0);
1237                 break;
1238 
1239         case IOC_RESTART_REPLY:
1240         case IOC_REPLY:
1241                 /*
1242                  * OK, send prepared reply as ACK or NAK
1243                  */
1244                 mp->b_datap->db_type = iocp->ioc_error == 0 ?
1245                     M_IOCACK : M_IOCNAK;
1246                 qreply(wq, mp);
1247                 break;
1248         }
1249 }
1250 
1251 /* ARGSUSED */
1252 static boolean_t
1253 rge_m_getcapab(void *arg, mac_capab_t cap, void *cap_data)
1254 {
1255         rge_t *rgep = arg;
1256 
1257         switch (cap) {
1258         case MAC_CAPAB_HCKSUM: {
1259                 uint32_t *hcksum_txflags = cap_data;
1260                 switch (rgep->chipid.mac_ver) {
1261                 case MAC_VER_8169:
1262                 case MAC_VER_8169S_D:
1263                 case MAC_VER_8169S_E:
1264                 case MAC_VER_8169SB:
1265                 case MAC_VER_8169SC:
1266                 case MAC_VER_8168:
1267                 case MAC_VER_8168B_B:
1268                 case MAC_VER_8168B_C:
1269                 case MAC_VER_8101E:
1270                         *hcksum_txflags = HCKSUM_INET_FULL_V4 |
1271                             HCKSUM_IPHDRCKSUM;
1272                         break;
1273                 case MAC_VER_8168C:
1274                 case MAC_VER_8101E_B:
1275                 case MAC_VER_8101E_C:
1276                 default:
1277                         *hcksum_txflags = 0;
1278                         break;
1279                 }
1280                 break;
1281         }
1282         default:
1283                 return (B_FALSE);
1284         }
1285         return (B_TRUE);
1286 }
1287 
1288 /*
1289  * ============ Init MSI/Fixed Interrupt routines ==============
1290  */
1291 
1292 /*
1293  * rge_add_intrs:
1294  *
1295  * Register FIXED or MSI interrupts.
1296  */
1297 static int
1298 rge_add_intrs(rge_t *rgep, int intr_type)
1299 {
1300         dev_info_t *dip = rgep->devinfo;
1301         int avail;
1302         int actual;
1303         int intr_size;
1304         int count;
1305         int i, j;
1306         int ret;
1307 
1308         /* Get number of interrupts */
1309         ret = ddi_intr_get_nintrs(dip, intr_type, &count);
1310         if ((ret != DDI_SUCCESS) || (count == 0)) {
1311                 rge_error(rgep, "ddi_intr_get_nintrs() failure, ret: %d, "
1312                     "count: %d", ret, count);
1313                 return (DDI_FAILURE);
1314         }
1315 
1316         /* Get number of available interrupts */
1317         ret = ddi_intr_get_navail(dip, intr_type, &avail);
1318         if ((ret != DDI_SUCCESS) || (avail == 0)) {
1319                 rge_error(rgep, "ddi_intr_get_navail() failure, "
1320                     "ret: %d, avail: %d\n", ret, avail);
1321                 return (DDI_FAILURE);
1322         }
1323 
1324         /* Allocate an array of interrupt handles */
1325         intr_size = count * sizeof (ddi_intr_handle_t);
1326         rgep->htable = kmem_alloc(intr_size, KM_SLEEP);
1327         rgep->intr_rqst = count;
1328 
1329         /* Call ddi_intr_alloc() */
1330         ret = ddi_intr_alloc(dip, rgep->htable, intr_type, 0,
1331             count, &actual, DDI_INTR_ALLOC_NORMAL);
1332         if (ret != DDI_SUCCESS || actual == 0) {
1333                 rge_error(rgep, "ddi_intr_alloc() failed %d\n", ret);
1334                 kmem_free(rgep->htable, intr_size);
1335                 return (DDI_FAILURE);
1336         }
1337         if (actual < count) {
1338                 rge_log(rgep, "ddi_intr_alloc() Requested: %d, Received: %d\n",
1339                     count, actual);
1340         }
1341         rgep->intr_cnt = actual;
1342 
1343         /*
1344          * Get priority for first msi, assume remaining are all the same
1345          */
1346         if ((ret = ddi_intr_get_pri(rgep->htable[0], &rgep->intr_pri)) !=
1347             DDI_SUCCESS) {
1348                 rge_error(rgep, "ddi_intr_get_pri() failed %d\n", ret);
1349                 /* Free already allocated intr */
1350                 for (i = 0; i < actual; i++) {
1351                         (void) ddi_intr_free(rgep->htable[i]);
1352                 }
1353                 kmem_free(rgep->htable, intr_size);
1354                 return (DDI_FAILURE);
1355         }
1356 
1357         /* Test for high level mutex */
1358         if (rgep->intr_pri >= ddi_intr_get_hilevel_pri()) {
1359                 rge_error(rgep, "rge_add_intrs:"
1360                     "Hi level interrupt not supported");
1361                 for (i = 0; i < actual; i++)
1362                         (void) ddi_intr_free(rgep->htable[i]);
1363                 kmem_free(rgep->htable, intr_size);
1364                 return (DDI_FAILURE);
1365         }
1366 
1367         /* Call ddi_intr_add_handler() */
1368         for (i = 0; i < actual; i++) {
1369                 if ((ret = ddi_intr_add_handler(rgep->htable[i], rge_intr,
1370                     (caddr_t)rgep, (caddr_t)(uintptr_t)i)) != DDI_SUCCESS) {
1371                         rge_error(rgep, "ddi_intr_add_handler() "
1372                             "failed %d\n", ret);
1373                         /* Remove already added intr */
1374                         for (j = 0; j < i; j++)
1375                                 (void) ddi_intr_remove_handler(rgep->htable[j]);
1376                         /* Free already allocated intr */
1377                         for (i = 0; i < actual; i++) {
1378                                 (void) ddi_intr_free(rgep->htable[i]);
1379                         }
1380                         kmem_free(rgep->htable, intr_size);
1381                         return (DDI_FAILURE);
1382                 }
1383         }
1384 
1385         if ((ret = ddi_intr_get_cap(rgep->htable[0], &rgep->intr_cap))
1386             != DDI_SUCCESS) {
1387                 rge_error(rgep, "ddi_intr_get_cap() failed %d\n", ret);
1388                 for (i = 0; i < actual; i++) {
1389                         (void) ddi_intr_remove_handler(rgep->htable[i]);
1390                         (void) ddi_intr_free(rgep->htable[i]);
1391                 }
1392                 kmem_free(rgep->htable, intr_size);
1393                 return (DDI_FAILURE);
1394         }
1395 
1396         return (DDI_SUCCESS);
1397 }
1398 
1399 /*
1400  * rge_rem_intrs:
1401  *
1402  * Unregister FIXED or MSI interrupts
1403  */
1404 static void
1405 rge_rem_intrs(rge_t *rgep)
1406 {
1407         int i;
1408 
1409         /* Disable all interrupts */
1410         if (rgep->intr_cap & DDI_INTR_FLAG_BLOCK) {
1411                 /* Call ddi_intr_block_disable() */
1412                 (void) ddi_intr_block_disable(rgep->htable, rgep->intr_cnt);
1413         } else {
1414                 for (i = 0; i < rgep->intr_cnt; i++) {
1415                         (void) ddi_intr_disable(rgep->htable[i]);
1416                 }
1417         }
1418 
1419         /* Call ddi_intr_remove_handler() */
1420         for (i = 0; i < rgep->intr_cnt; i++) {
1421                 (void) ddi_intr_remove_handler(rgep->htable[i]);
1422                 (void) ddi_intr_free(rgep->htable[i]);
1423         }
1424 
1425         kmem_free(rgep->htable, rgep->intr_rqst * sizeof (ddi_intr_handle_t));
1426 }
1427 
1428 /*
1429  * ========== Per-instance setup/teardown code ==========
1430  */
1431 
1432 #undef  RGE_DBG
1433 #define RGE_DBG         RGE_DBG_INIT    /* debug flag for this code     */
1434 
1435 static void
1436 rge_unattach(rge_t *rgep)
1437 {
1438         /*
1439          * Flag that no more activity may be initiated
1440          */
1441         rgep->progress &= ~PROGRESS_READY;
1442         rgep->rge_mac_state = RGE_MAC_UNATTACH;
1443 
1444         /*
1445          * Quiesce the PHY and MAC (leave it reset but still powered).
1446          * Clean up and free all RGE data structures
1447          */
1448         if (rgep->periodic_id != NULL) {
1449                 ddi_periodic_delete(rgep->periodic_id);
1450                 rgep->periodic_id = NULL;
1451         }
1452 
1453         if (rgep->progress & PROGRESS_KSTATS)
1454                 rge_fini_kstats(rgep);
1455 
1456         if (rgep->progress & PROGRESS_PHY)
1457                 (void) rge_phy_reset(rgep);
1458 
1459         if (rgep->progress & PROGRESS_INIT) {
1460                 mutex_enter(rgep->genlock);
1461                 (void) rge_chip_reset(rgep);
1462                 mutex_exit(rgep->genlock);
1463                 rge_fini_rings(rgep);
1464         }
1465 
1466         if (rgep->progress & PROGRESS_INTR) {
1467                 rge_rem_intrs(rgep);
1468                 mutex_destroy(rgep->rc_lock);
1469                 mutex_destroy(rgep->rx_lock);
1470                 mutex_destroy(rgep->tc_lock);
1471                 mutex_destroy(rgep->tx_lock);
1472                 rw_destroy(rgep->errlock);
1473                 mutex_destroy(rgep->genlock);
1474         }
1475 
1476         if (rgep->progress & PROGRESS_FACTOTUM)
1477                 (void) ddi_intr_remove_softint(rgep->factotum_hdl);
1478 
1479         if (rgep->progress & PROGRESS_RESCHED)
1480                 (void) ddi_intr_remove_softint(rgep->resched_hdl);
1481 
1482         if (rgep->progress & PROGRESS_NDD)
1483                 rge_nd_cleanup(rgep);
1484 
1485         rge_free_bufs(rgep);
1486 
1487         if (rgep->progress & PROGRESS_REGS)
1488                 ddi_regs_map_free(&rgep->io_handle);
1489 
1490         if (rgep->progress & PROGRESS_CFG)
1491                 pci_config_teardown(&rgep->cfg_handle);
1492 
1493         ddi_remove_minor_node(rgep->devinfo, NULL);
1494         kmem_free(rgep, sizeof (*rgep));
1495 }
1496 
1497 static int
1498 rge_resume(dev_info_t *devinfo)
1499 {
1500         rge_t *rgep;                    /* Our private data     */
1501         chip_id_t *cidp;
1502         chip_id_t chipid;
1503 
1504         rgep = ddi_get_driver_private(devinfo);
1505 
1506         /*
1507          * If there are state inconsistancies, this is bad.  Returning
1508          * DDI_FAILURE here will eventually cause the machine to panic,
1509          * so it is best done here so that there is a possibility of
1510          * debugging the problem.
1511          */
1512         if (rgep == NULL)
1513                 cmn_err(CE_PANIC,
1514                     "rge: ngep returned from ddi_get_driver_private was NULL");
1515 
1516         /*
1517          * Refuse to resume if the data structures aren't consistent
1518          */
1519         if (rgep->devinfo != devinfo)
1520                 cmn_err(CE_PANIC,
1521                     "rge: passed devinfo not the same as saved devinfo");
1522 
1523         /*
1524          * Read chip ID & set up config space command register(s)
1525          * Refuse to resume if the chip has changed its identity!
1526          */
1527         cidp = &rgep->chipid;
1528         rge_chip_cfg_init(rgep, &chipid);
1529         if (chipid.vendor != cidp->vendor)
1530                 return (DDI_FAILURE);
1531         if (chipid.device != cidp->device)
1532                 return (DDI_FAILURE);
1533         if (chipid.revision != cidp->revision)
1534                 return (DDI_FAILURE);
1535 
1536         mutex_enter(rgep->genlock);
1537 
1538         /*
1539          * Only in one case, this conditional branch can be executed: the port
1540          * hasn't been plumbed.
1541          */
1542         if (rgep->suspended == B_FALSE) {
1543                 mutex_exit(rgep->genlock);
1544                 return (DDI_SUCCESS);
1545         }
1546         rgep->rge_mac_state = RGE_MAC_STARTED;
1547         /*
1548          * All OK, reinitialise h/w & kick off NEMO scheduling
1549          */
1550         rge_restart(rgep);
1551         rgep->suspended = B_FALSE;
1552 
1553         mutex_exit(rgep->genlock);
1554 
1555         return (DDI_SUCCESS);
1556 }
1557 
1558 
1559 /*
1560  * attach(9E) -- Attach a device to the system
1561  *
1562  * Called once for each board successfully probed.
1563  */
1564 static int
1565 rge_attach(dev_info_t *devinfo, ddi_attach_cmd_t cmd)
1566 {
1567         rge_t *rgep;                    /* Our private data     */
1568         mac_register_t *macp;
1569         chip_id_t *cidp;
1570         int intr_types;
1571         caddr_t regs;
1572         int instance;
1573         int i;
1574         int err;
1575 
1576         /*
1577          * we don't support high level interrupts in the driver
1578          */
1579         if (ddi_intr_hilevel(devinfo, 0) != 0) {
1580                 cmn_err(CE_WARN,
1581                     "rge_attach -- unsupported high level interrupt");
1582                 return (DDI_FAILURE);
1583         }
1584 
1585         instance = ddi_get_instance(devinfo);
1586         RGE_GTRACE(("rge_attach($%p, %d) instance %d",
1587             (void *)devinfo, cmd, instance));
1588         RGE_BRKPT(NULL, "rge_attach");
1589 
1590         switch (cmd) {
1591         default:
1592                 return (DDI_FAILURE);
1593 
1594         case DDI_RESUME:
1595                 return (rge_resume(devinfo));
1596 
1597         case DDI_ATTACH:
1598                 break;
1599         }
1600 
1601         rgep = kmem_zalloc(sizeof (*rgep), KM_SLEEP);
1602         ddi_set_driver_private(devinfo, rgep);
1603         rgep->devinfo = devinfo;
1604 
1605         /*
1606          * Initialize more fields in RGE private data
1607          */
1608         rgep->rge_mac_state = RGE_MAC_ATTACH;
1609         rgep->debug = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo,
1610             DDI_PROP_DONTPASS, debug_propname, rge_debug);
1611         rgep->default_mtu = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo,
1612             DDI_PROP_DONTPASS, mtu_propname, ETHERMTU);
1613         rgep->msi_enable = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo,
1614             DDI_PROP_DONTPASS, msi_propname, B_TRUE);
1615         (void) snprintf(rgep->ifname, sizeof (rgep->ifname), "%s%d",
1616             RGE_DRIVER_NAME, instance);
1617 
1618         /*
1619          * Map config space registers
1620          * Read chip ID & set up config space command register(s)
1621          *
1622          * Note: this leaves the chip accessible by Memory Space
1623          * accesses, but with interrupts and Bus Mastering off.
1624          * This should ensure that nothing untoward will happen
1625          * if it has been left active by the (net-)bootloader.
1626          * We'll re-enable Bus Mastering once we've reset the chip,
1627          * and allow interrupts only when everything else is set up.
1628          */
1629         err = pci_config_setup(devinfo, &rgep->cfg_handle);
1630         if (err != DDI_SUCCESS) {
1631                 rge_problem(rgep, "pci_config_setup() failed");
1632                 goto attach_fail;
1633         }
1634         rgep->progress |= PROGRESS_CFG;
1635         cidp = &rgep->chipid;
1636         bzero(cidp, sizeof (*cidp));
1637         rge_chip_cfg_init(rgep, cidp);
1638 
1639         /*
1640          * Map operating registers
1641          */
1642         err = ddi_regs_map_setup(devinfo, 2, &regs,
1643             0, 0, &rge_reg_accattr, &rgep->io_handle);
1644 
1645         /*
1646          * MMIO map will fail if the assigned address is bigger than 4G
1647          * then choose I/O map
1648          */
1649         if (err != DDI_SUCCESS) {
1650                 err = ddi_regs_map_setup(devinfo, 1, &regs,
1651                     0, 0, &rge_reg_accattr, &rgep->io_handle);
1652         }
1653         if (err != DDI_SUCCESS) {
1654                 rge_problem(rgep, "ddi_regs_map_setup() failed");
1655                 goto attach_fail;
1656         }
1657         rgep->io_regs = regs;
1658         rgep->progress |= PROGRESS_REGS;
1659 
1660         /*
1661          * Characterise the device, so we know its requirements.
1662          * Then allocate the appropriate TX and RX descriptors & buffers.
1663          */
1664         rge_chip_ident(rgep);
1665         err = rge_alloc_bufs(rgep);
1666         if (err != DDI_SUCCESS) {
1667                 rge_problem(rgep, "DMA buffer allocation failed");
1668                 goto attach_fail;
1669         }
1670 
1671         /*
1672          * Register NDD-tweakable parameters
1673          */
1674         if (rge_nd_init(rgep)) {
1675                 rge_problem(rgep, "rge_nd_init() failed");
1676                 goto attach_fail;
1677         }
1678         rgep->progress |= PROGRESS_NDD;
1679 
1680         /*
1681          * Add the softint handlers:
1682          *
1683          * Both of these handlers are used to avoid restrictions on the
1684          * context and/or mutexes required for some operations.  In
1685          * particular, the hardware interrupt handler and its subfunctions
1686          * can detect a number of conditions that we don't want to handle
1687          * in that context or with that set of mutexes held.  So, these
1688          * softints are triggered instead:
1689          *
1690          * the <resched> softint is triggered if if we have previously
1691          * had to refuse to send a packet because of resource shortage
1692          * (we've run out of transmit buffers), but the send completion
1693          * interrupt handler has now detected that more buffers have
1694          * become available.
1695          *
1696          * the <factotum> is triggered if the h/w interrupt handler
1697          * sees the <link state changed> or <error> bits in the status
1698          * block.  It's also triggered periodically to poll the link
1699          * state, just in case we aren't getting link status change
1700          * interrupts ...
1701          */
1702         err = ddi_intr_add_softint(devinfo, &rgep->resched_hdl,
1703             DDI_INTR_SOFTPRI_MIN, rge_reschedule, (caddr_t)rgep);
1704         if (err != DDI_SUCCESS) {
1705                 rge_problem(rgep, "ddi_intr_add_softint() failed");
1706                 goto attach_fail;
1707         }
1708         rgep->progress |= PROGRESS_RESCHED;
1709         err = ddi_intr_add_softint(devinfo, &rgep->factotum_hdl,
1710             DDI_INTR_SOFTPRI_MIN, rge_chip_factotum, (caddr_t)rgep);
1711         if (err != DDI_SUCCESS) {
1712                 rge_problem(rgep, "ddi_intr_add_softint() failed");
1713                 goto attach_fail;
1714         }
1715         rgep->progress |= PROGRESS_FACTOTUM;
1716 
1717         /*
1718          * Get supported interrupt types
1719          */
1720         if (ddi_intr_get_supported_types(devinfo, &intr_types)
1721             != DDI_SUCCESS) {
1722                 rge_error(rgep, "ddi_intr_get_supported_types failed\n");
1723                 goto attach_fail;
1724         }
1725 
1726         /*
1727          * Add the h/w interrupt handler and initialise mutexes
1728          * RTL8101E is observed to have MSI invalidation issue after S/R.
1729          * So the FIXED interrupt is used instead.
1730          */
1731         if (rgep->chipid.mac_ver == MAC_VER_8101E)
1732                 rgep->msi_enable = B_FALSE;
1733         if ((intr_types & DDI_INTR_TYPE_MSI) && rgep->msi_enable) {
1734                 if (rge_add_intrs(rgep, DDI_INTR_TYPE_MSI) != DDI_SUCCESS) {
1735                         rge_error(rgep, "MSI registration failed, "
1736                             "trying FIXED interrupt type\n");
1737                 } else {
1738                         rge_log(rgep, "Using MSI interrupt type\n");
1739                         rgep->intr_type = DDI_INTR_TYPE_MSI;
1740                         rgep->progress |= PROGRESS_INTR;
1741                 }
1742         }
1743         if (!(rgep->progress & PROGRESS_INTR) &&
1744             (intr_types & DDI_INTR_TYPE_FIXED)) {
1745                 if (rge_add_intrs(rgep, DDI_INTR_TYPE_FIXED) != DDI_SUCCESS) {
1746                         rge_error(rgep, "FIXED interrupt "
1747                             "registration failed\n");
1748                         goto attach_fail;
1749                 }
1750                 rge_log(rgep, "Using FIXED interrupt type\n");
1751                 rgep->intr_type = DDI_INTR_TYPE_FIXED;
1752                 rgep->progress |= PROGRESS_INTR;
1753         }
1754         if (!(rgep->progress & PROGRESS_INTR)) {
1755                 rge_error(rgep, "No interrupts registered\n");
1756                 goto attach_fail;
1757         }
1758         mutex_init(rgep->genlock, NULL, MUTEX_DRIVER,
1759             DDI_INTR_PRI(rgep->intr_pri));
1760         rw_init(rgep->errlock, NULL, RW_DRIVER,
1761             DDI_INTR_PRI(rgep->intr_pri));
1762         mutex_init(rgep->tx_lock, NULL, MUTEX_DRIVER,
1763             DDI_INTR_PRI(rgep->intr_pri));
1764         mutex_init(rgep->tc_lock, NULL, MUTEX_DRIVER,
1765             DDI_INTR_PRI(rgep->intr_pri));
1766         mutex_init(rgep->rx_lock, NULL, MUTEX_DRIVER,
1767             DDI_INTR_PRI(rgep->intr_pri));
1768         mutex_init(rgep->rc_lock, NULL, MUTEX_DRIVER,
1769             DDI_INTR_PRI(rgep->intr_pri));
1770 
1771         /*
1772          * Initialize rings
1773          */
1774         err = rge_init_rings(rgep);
1775         if (err != DDI_SUCCESS) {
1776                 rge_problem(rgep, "rge_init_rings() failed");
1777                 goto attach_fail;
1778         }
1779         rgep->progress |= PROGRESS_INIT;
1780 
1781         /*
1782          * Now that mutex locks are initialized, enable interrupts.
1783          */
1784         if (rgep->intr_cap & DDI_INTR_FLAG_BLOCK) {
1785                 /* Call ddi_intr_block_enable() for MSI interrupts */
1786                 (void) ddi_intr_block_enable(rgep->htable, rgep->intr_cnt);
1787         } else {
1788                 /* Call ddi_intr_enable for MSI or FIXED interrupts */
1789                 for (i = 0; i < rgep->intr_cnt; i++) {
1790                         (void) ddi_intr_enable(rgep->htable[i]);
1791                 }
1792         }
1793 
1794         /*
1795          * Initialise link state variables
1796          * Stop, reset & reinitialise the chip.
1797          * Initialise the (internal) PHY.
1798          */
1799         rgep->param_link_up = LINK_STATE_UNKNOWN;
1800 
1801         /*
1802          * Reset chip & rings to initial state; also reset address
1803          * filtering, promiscuity, loopback mode.
1804          */
1805         mutex_enter(rgep->genlock);
1806         (void) rge_chip_reset(rgep);
1807         rge_chip_sync(rgep, RGE_GET_MAC);
1808         bzero(rgep->mcast_hash, sizeof (rgep->mcast_hash));
1809         bzero(rgep->mcast_refs, sizeof (rgep->mcast_refs));
1810         rgep->promisc = B_FALSE;
1811         rgep->param_loop_mode = RGE_LOOP_NONE;
1812         mutex_exit(rgep->genlock);
1813         rge_phy_init(rgep);
1814         rgep->progress |= PROGRESS_PHY;
1815 
1816         /*
1817          * Create & initialise named kstats
1818          */
1819         rge_init_kstats(rgep, instance);
1820         rgep->progress |= PROGRESS_KSTATS;
1821 
1822         if ((macp = mac_alloc(MAC_VERSION)) == NULL)
1823                 goto attach_fail;
1824         macp->m_type_ident = MAC_PLUGIN_IDENT_ETHER;
1825         macp->m_driver = rgep;
1826         macp->m_dip = devinfo;
1827         macp->m_src_addr = rgep->netaddr;
1828         macp->m_callbacks = &rge_m_callbacks;
1829         macp->m_min_sdu = 0;
1830         macp->m_max_sdu = rgep->default_mtu;
1831         macp->m_margin = VLAN_TAGSZ;
1832 
1833         /*
1834          * Finally, we're ready to register ourselves with the MAC layer
1835          * interface; if this succeeds, we're all ready to start()
1836          */
1837         err = mac_register(macp, &rgep->mh);
1838         mac_free(macp);
1839         if (err != 0)
1840                 goto attach_fail;
1841 
1842         /*
1843          * Register a periodical handler.
1844          * reg_chip_cyclic() is invoked in kernel context.
1845          */
1846         rgep->periodic_id = ddi_periodic_add(rge_chip_cyclic, rgep,
1847             RGE_CYCLIC_PERIOD, DDI_IPL_0);
1848 
1849         rgep->progress |= PROGRESS_READY;
1850         return (DDI_SUCCESS);
1851 
1852 attach_fail:
1853         rge_unattach(rgep);
1854         return (DDI_FAILURE);
1855 }
1856 
1857 /*
1858  *      rge_suspend() -- suspend transmit/receive for powerdown
1859  */
1860 static int
1861 rge_suspend(rge_t *rgep)
1862 {
1863         /*
1864          * Stop processing and idle (powerdown) the PHY ...
1865          */
1866         mutex_enter(rgep->genlock);
1867         rw_enter(rgep->errlock, RW_WRITER);
1868 
1869         if (rgep->rge_mac_state != RGE_MAC_STARTED) {
1870                 rw_exit(rgep->errlock);
1871                 mutex_exit(rgep->genlock);
1872                 return (DDI_SUCCESS);
1873         }
1874 
1875         rgep->suspended = B_TRUE;
1876         rge_stop(rgep);
1877         rgep->rge_mac_state = RGE_MAC_STOPPED;
1878 
1879         rw_exit(rgep->errlock);
1880         mutex_exit(rgep->genlock);
1881 
1882         return (DDI_SUCCESS);
1883 }
1884 
1885 /*
1886  * quiesce(9E) entry point.
1887  *
1888  * This function is called when the system is single-threaded at high
1889  * PIL with preemption disabled. Therefore, this function must not be
1890  * blocked.
1891  *
1892  * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure.
1893  * DDI_FAILURE indicates an error condition and should almost never happen.
1894  */
1895 static int
1896 rge_quiesce(dev_info_t *devinfo)
1897 {
1898         rge_t *rgep = ddi_get_driver_private(devinfo);
1899 
1900         if (rgep == NULL)
1901                 return (DDI_FAILURE);
1902 
1903         /*
1904          * Turn off debugging
1905          */
1906         rge_debug = 0;
1907         rgep->debug = 0;
1908 
1909         /* Stop the chip */
1910         rge_chip_stop(rgep, B_FALSE);
1911 
1912         return (DDI_SUCCESS);
1913 }
1914 
1915 /*
1916  * detach(9E) -- Detach a device from the system
1917  */
1918 static int
1919 rge_detach(dev_info_t *devinfo, ddi_detach_cmd_t cmd)
1920 {
1921         rge_t *rgep;
1922 
1923         RGE_GTRACE(("rge_detach($%p, %d)", (void *)devinfo, cmd));
1924 
1925         rgep = ddi_get_driver_private(devinfo);
1926 
1927         switch (cmd) {
1928         default:
1929                 return (DDI_FAILURE);
1930 
1931         case DDI_SUSPEND:
1932                 return (rge_suspend(rgep));
1933 
1934         case DDI_DETACH:
1935                 break;
1936         }
1937 
1938         /*
1939          * If there is any posted buffer, the driver should reject to be
1940          * detached. Need notice upper layer to release them.
1941          */
1942         if (!(rgep->chip_flags & CHIP_FLAG_FORCE_BCOPY) &&
1943             rgep->rx_free != RGE_BUF_SLOTS)
1944                 return (DDI_FAILURE);
1945 
1946         /*
1947          * Unregister from the MAC layer subsystem.  This can fail, in
1948          * particular if there are DLPI style-2 streams still open -
1949          * in which case we just return failure without shutting
1950          * down chip operations.
1951          */
1952         if (mac_unregister(rgep->mh) != 0)
1953                 return (DDI_FAILURE);
1954 
1955         /*
1956          * All activity stopped, so we can clean up & exit
1957          */
1958         rge_unattach(rgep);
1959         return (DDI_SUCCESS);
1960 }
1961 
1962 
1963 /*
1964  * ========== Module Loading Data & Entry Points ==========
1965  */
1966 
1967 #undef  RGE_DBG
1968 #define RGE_DBG         RGE_DBG_INIT    /* debug flag for this code     */
1969 DDI_DEFINE_STREAM_OPS(rge_dev_ops, nulldev, nulldev, rge_attach, rge_detach,
1970     nodev, NULL, D_MP, NULL, rge_quiesce);
1971 
1972 static struct modldrv rge_modldrv = {
1973         &mod_driverops,             /* Type of module.  This one is a driver */
1974         rge_ident,              /* short description */
1975         &rge_dev_ops                /* driver specific ops */
1976 };
1977 
1978 static struct modlinkage modlinkage = {
1979         MODREV_1, { (void *)&rge_modldrv, NULL }
1980 };
1981 
1982 
1983 int
1984 _info(struct modinfo *modinfop)
1985 {
1986         return (mod_info(&modlinkage, modinfop));
1987 }
1988 
1989 int
1990 _init(void)
1991 {
1992         int status;
1993 
1994         mac_init_ops(&rge_dev_ops, "rge");
1995         status = mod_install(&modlinkage);
1996         if (status == DDI_SUCCESS)
1997                 mutex_init(rge_log_mutex, NULL, MUTEX_DRIVER, NULL);
1998         else
1999                 mac_fini_ops(&rge_dev_ops);
2000 
2001         return (status);
2002 }
2003 
2004 int
2005 _fini(void)
2006 {
2007         int status;
2008 
2009         status = mod_remove(&modlinkage);
2010         if (status == DDI_SUCCESS) {
2011                 mac_fini_ops(&rge_dev_ops);
2012                 mutex_destroy(rge_log_mutex);
2013         }
2014         return (status);
2015 }