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 (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
  24  */
  25 
  26 #include <sys/types.h>
  27 #include <sys/stream.h>
  28 #include <sys/strsun.h>
  29 #include <sys/stat.h>
  30 #include <sys/modctl.h>
  31 #include <sys/kstat.h>
  32 #include <sys/ethernet.h>
  33 #include <sys/devops.h>
  34 #include <sys/debug.h>
  35 #include <sys/conf.h>
  36 #include <sys/mii.h>
  37 #include <sys/miiregs.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/byteorder.h>
  46 #include <sys/note.h>
  47 #include <sys/vlan.h>
  48 #include <sys/strsubr.h>
  49 #include <sys/crc32.h>
  50 #include <sys/sdt.h>
  51 #include <sys/pci.h>
  52 #include <sys/pci_cap.h>
  53 
  54 #include "atge.h"
  55 #include "atge_cmn_reg.h"
  56 #include "atge_l1e_reg.h"
  57 #include "atge_l1_reg.h"
  58 
  59 
  60 /*
  61  * Atheros/Attansic Ethernet chips are of three types - L1, L2 and L1E.
  62  * This driver is for L1E/L1 but can be extended to support other chips.
  63  * L1E comes in 1Gigabit and Fast Ethernet flavors. L1 comes in 1Gigabit
  64  * flavors only.
  65  *
  66  * Atheros/Attansic Ethernet controllers have descriptor based TX and RX
  67  * with an exception of L1E. L1E's RX side is not descriptor based ring.
  68  * The L1E's RX uses pages (not to be confused with MMU pages) for
  69  * receiving pkts. The header has four fields :
  70  *
  71  *        uint32_t seqno;    Sequence number of the frame.
  72  *        uint32_t length;   Length of the frame.
  73  *        uint32_t flags;    Flags
  74  *        uint32_t vtag;     We don't use hardware VTAG.
  75  *
  76  * We use only one queue for RX (each queue can have two pages) and each
  77  * page is L1E_RX_PAGE_SZ large in bytes. That's the reason we don't
  78  * use zero-copy RX because we are limited to two pages and each page
  79  * accomodates large number of pkts.
  80  *
  81  * The TX side on all three chips is descriptor based ring; and all the
  82  * more reason to have one driver for these chips.
  83  *
  84  * We use two locks - atge_intr_lock and atge_tx_lock. Both the locks
  85  * should be held if the operation has impact on the driver instance.
  86  *
  87  * All the three chips have hash-based multicast filter.
  88  *
  89  * We use CMB (Coalescing Message Block) for RX but not for TX as there
  90  * are some issues with TX. RX CMB is used to get the last descriptor
  91  * posted by the chip. Each CMB is for a RX page (one queue can have two
  92  * pages) and are uint32_t (4 bytes) long.
  93  *
  94  * The descriptor table should have 32-bit physical address limit due to
  95  * the limitation of having same high address for TX/RX/SMB/CMB. The
  96  * TX/RX buffers can be 64-bit.
  97  *
  98  * Every DMA memory in atge is represented by atge_dma_t be it TX/RX Buffers
  99  * or TX/RX descriptor table or SMB/CMB. To keep the code simple, we have
 100  * kept sgl as 1 so that we get contingous pages from root complex.
 101  *
 102  * L1 chip (0x1048) uses descriptor based TX and RX ring. Most of registers are
 103  * common with L1E chip (0x1026).
 104  */
 105 
 106 /*
 107  * Function Prototypes for debugging.
 108  */
 109 void    atge_error(dev_info_t *, char *, ...);
 110 void    atge_debug_func(char *, ...);
 111 
 112 /*
 113  * Function Prototypes for driver operations.
 114  */
 115 static int      atge_resume(dev_info_t *);
 116 static int      atge_add_intr(atge_t *);
 117 static int      atge_alloc_dma(atge_t *);
 118 static void     atge_remove_intr(atge_t *);
 119 static void     atge_free_dma(atge_t *);
 120 static void     atge_device_reset(atge_t *);
 121 static void     atge_device_init(atge_t *);
 122 static void     atge_device_start(atge_t *);
 123 static void     atge_disable_intrs(atge_t *);
 124 atge_dma_t *atge_alloc_a_dma_blk(atge_t *, ddi_dma_attr_t *, int, int);
 125 void    atge_free_a_dma_blk(atge_dma_t *);
 126 static void     atge_rxfilter(atge_t *);
 127 static void     atge_device_reset_l1_l1e(atge_t *);
 128 void    atge_program_ether(atge_t *atgep);
 129 void    atge_device_restart(atge_t *);
 130 void    atge_device_stop(atge_t *);
 131 static int      atge_send_a_packet(atge_t *, mblk_t *);
 132 static uint32_t atge_ether_crc(const uint8_t *, int);
 133 
 134 
 135 /*
 136  * L1E/L2E specific functions.
 137  */
 138 void    atge_l1e_device_reset(atge_t *);
 139 void    atge_l1e_stop_mac(atge_t *);
 140 int     atge_l1e_alloc_dma(atge_t *);
 141 void    atge_l1e_free_dma(atge_t *);
 142 void    atge_l1e_init_tx_ring(atge_t *);
 143 void    atge_l1e_init_rx_pages(atge_t *);
 144 void    atge_l1e_program_dma(atge_t *);
 145 void    atge_l1e_send_packet(atge_ring_t *);
 146 mblk_t  *atge_l1e_receive(atge_t *);
 147 uint_t  atge_l1e_interrupt(caddr_t, caddr_t);
 148 void    atge_l1e_gather_stats(atge_t *);
 149 void    atge_l1e_clear_stats(atge_t *);
 150 
 151 /*
 152  * L1 specific functions.
 153  */
 154 int     atge_l1_alloc_dma(atge_t *);
 155 void    atge_l1_init_tx_ring(atge_t *);
 156 void    atge_l1_init_rx_ring(atge_t *);
 157 void    atge_l1_init_rr_ring(atge_t *);
 158 void    atge_l1_init_cmb(atge_t *);
 159 void    atge_l1_init_smb(atge_t *);
 160 void    atge_l1_program_dma(atge_t *);
 161 void    atge_l1_stop_tx_mac(atge_t *);
 162 void    atge_l1_stop_rx_mac(atge_t *);
 163 uint_t  atge_l1_interrupt(caddr_t, caddr_t);
 164 void    atge_l1_send_packet(atge_ring_t *);
 165 
 166 
 167 /*
 168  * Function prototyps for MII operations.
 169  */
 170 uint16_t        atge_mii_read(void *, uint8_t, uint8_t);
 171 void    atge_mii_write(void *, uint8_t, uint8_t, uint16_t);
 172 void    atge_l1e_mii_reset(void *);
 173 void    atge_l1_mii_reset(void *);
 174 static void     atge_mii_notify(void *, link_state_t);
 175 void    atge_tx_reclaim(atge_t *atgep, int cons);
 176 
 177 /*
 178  * L1E/L2E chip.
 179  */
 180 static  mii_ops_t atge_l1e_mii_ops = {
 181         MII_OPS_VERSION,
 182         atge_mii_read,
 183         atge_mii_write,
 184         atge_mii_notify,
 185         atge_l1e_mii_reset
 186 };
 187 
 188 /*
 189  * L1 chip.
 190  */
 191 static  mii_ops_t atge_l1_mii_ops = {
 192         MII_OPS_VERSION,
 193         atge_mii_read,
 194         atge_mii_write,
 195         atge_mii_notify,
 196         atge_l1_mii_reset
 197 };
 198 
 199 /*
 200  * Function Prototypes for MAC callbacks.
 201  */
 202 static int      atge_m_stat(void *, uint_t, uint64_t *);
 203 static int      atge_m_start(void *);
 204 static void     atge_m_stop(void *);
 205 static int      atge_m_getprop(void *, const char *, mac_prop_id_t, uint_t,
 206     void *);
 207 static int      atge_m_setprop(void *, const char *, mac_prop_id_t, uint_t,
 208     const void *);
 209 static void     atge_m_propinfo(void *, const char *, mac_prop_id_t,
 210     mac_prop_info_handle_t);
 211 static int      atge_m_unicst(void *, const uint8_t *);
 212 static int      atge_m_multicst(void *, boolean_t, const uint8_t *);
 213 static int      atge_m_promisc(void *, boolean_t);
 214 static mblk_t   *atge_m_tx(void *, mblk_t *);
 215 
 216 static  mac_callbacks_t atge_m_callbacks = {
 217         MC_SETPROP | MC_GETPROP | MC_PROPINFO,
 218         atge_m_stat,
 219         atge_m_start,
 220         atge_m_stop,
 221         atge_m_promisc,
 222         atge_m_multicst,
 223         atge_m_unicst,
 224         atge_m_tx,
 225         NULL,           /* mc_reserved */
 226         NULL,           /* mc_ioctl */
 227         NULL,           /* mc_getcapab */
 228         NULL,           /* mc_open */
 229         NULL,           /* mc_close */
 230         atge_m_setprop,
 231         atge_m_getprop,
 232         atge_m_propinfo
 233 };
 234 
 235 /*
 236  * DMA Data access requirements.
 237  */
 238 static struct ddi_device_acc_attr atge_dev_attr = {
 239         DDI_DEVICE_ATTR_V0,
 240         DDI_STRUCTURE_LE_ACC,
 241         DDI_STRICTORDER_ACC
 242 };
 243 
 244 /*
 245  * Buffers should be native endianness.
 246  */
 247 static struct ddi_device_acc_attr atge_buf_attr = {
 248         DDI_DEVICE_ATTR_V0,
 249         DDI_NEVERSWAP_ACC,      /* native endianness */
 250         DDI_STRICTORDER_ACC
 251 };
 252 
 253 /*
 254  * DMA device attributes. Buffer can be 64-bit.
 255  */
 256 static ddi_dma_attr_t atge_dma_attr_buf = {
 257         DMA_ATTR_V0,            /* dma_attr_version */
 258         0,                      /* dma_attr_addr_lo */
 259         0x00ffffffffffull,      /* dma_attr_addr_hi */
 260         0x000000003fffull,      /* dma_attr_count_max */
 261         8,                      /* dma_attr_align */
 262         0x00003ffc,             /* dma_attr_burstsizes */
 263         1,                      /* dma_attr_minxfer */
 264         0x0000000027ffull,      /* dma_attr_maxxfer */
 265         0x0000ffffffffull,      /* dma_attr_seg */
 266         1,                      /* dma_attr_sgllen */
 267         1,                      /* dma_attr_granular */
 268         0                       /* dma_attr_flags */
 269 };
 270 
 271 /*
 272  * Table of supported devices.
 273  */
 274 #define ATGE_VENDOR_ID  0x1969
 275 #define ATGE_L1E_STR    "Atheros AR8121/8113/8114"
 276 
 277 static atge_cards_t atge_cards[] = {
 278         {ATGE_VENDOR_ID, ATGE_CHIP_L1E_DEV_ID, ATGE_L1E_STR, ATGE_CHIP_L1E},
 279         {ATGE_VENDOR_ID, ATGE_CHIP_L1_DEV_ID, "Attansic L1", ATGE_CHIP_L1},
 280 };
 281 
 282 /*
 283  * Global Debugging flag. Developer level debugging is done only in DEBUG mode.
 284  */
 285 int     atge_debug = 1;
 286 
 287 /*
 288  * Debugging and error reporting.
 289  */
 290 void
 291 atge_debug_func(char *fmt, ...)
 292 {
 293         va_list ap;
 294         char    buf[256];
 295 
 296         va_start(ap, fmt);
 297         (void) vsnprintf(buf, sizeof (buf), fmt, ap);
 298         va_end(ap);
 299 
 300         DTRACE_PROBE1(atge__debug, char *, buf);
 301 }
 302 
 303 void
 304 atge_error(dev_info_t *dip, char *fmt, ...)
 305 {
 306         va_list ap;
 307         char    buf[256];
 308 
 309         va_start(ap, fmt);
 310         (void) vsnprintf(buf, sizeof (buf), fmt, ap);
 311         va_end(ap);
 312 
 313         if (dip) {
 314                 cmn_err(CE_WARN, "%s%d: %s",
 315                     ddi_driver_name(dip), ddi_get_instance(dip), buf);
 316         } else {
 317                 cmn_err(CE_WARN, "atge: %s", buf);
 318         }
 319 }
 320 
 321 void
 322 atge_mac_config(atge_t *atgep)
 323 {
 324         uint32_t reg;
 325         int speed;
 326         link_duplex_t ld;
 327 
 328         reg = INL(atgep, ATGE_MAC_CFG);
 329         reg &= ~(ATGE_CFG_FULL_DUPLEX | ATGE_CFG_TX_FC | ATGE_CFG_RX_FC |
 330             ATGE_CFG_SPEED_MASK);
 331 
 332         speed = mii_get_speed(atgep->atge_mii);
 333         switch (speed) {
 334         case 10:
 335         case 100:
 336                 reg |= ATGE_CFG_SPEED_10_100;
 337                 break;
 338         case 1000:
 339                 reg |= ATGE_CFG_SPEED_1000;
 340                 break;
 341         }
 342 
 343         ld = mii_get_duplex(atgep->atge_mii);
 344         if (ld == LINK_DUPLEX_FULL)
 345                 reg |= ATGE_CFG_FULL_DUPLEX;
 346 
 347         /* Re-enable TX/RX MACs */
 348         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
 349                 reg |= ATGE_CFG_TX_ENB | ATGE_CFG_RX_ENB | ATGE_CFG_RX_FC;
 350         } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
 351                 reg |= ATGE_CFG_TX_ENB | ATGE_CFG_RX_ENB;
 352         }
 353 
 354         OUTL(atgep, ATGE_MAC_CFG, reg);
 355 
 356         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
 357                 reg = ATGE_USECS(ATGE_IM_RX_TIMER_DEFAULT) << IM_TIMER_RX_SHIFT;
 358                 reg |= ATGE_USECS(ATGE_IM_TX_TIMER_DEFAULT) <<
 359                     IM_TIMER_TX_SHIFT;
 360                 OUTL(atgep, ATGE_IM_TIMER, reg);
 361         }
 362 
 363         ATGE_DB(("%s: %s() mac_cfg is : %x",
 364             atgep->atge_name, __func__, INL(atgep, ATGE_MAC_CFG)));
 365 }
 366 
 367 static void
 368 atge_mii_notify(void *arg, link_state_t link)
 369 {
 370         atge_t *atgep = arg;
 371 
 372         ATGE_DB(("%s: %s() LINK STATUS CHANGED from %x -> %x",
 373             atgep->atge_name, __func__, atgep->atge_link_state, link));
 374 
 375         mac_link_update(atgep->atge_mh, link);
 376 
 377         /*
 378          * Reconfigure MAC if link status is UP now.
 379          */
 380         mutex_enter(&atgep->atge_tx_lock);
 381         if (link == LINK_STATE_UP) {
 382                 atgep->atge_link_state = LINK_STATE_UP;
 383                 atge_mac_config(atgep);
 384                 atgep->atge_tx_resched = 0;
 385         } else {
 386                 atgep->atge_link_state = LINK_STATE_DOWN;
 387                 atgep->atge_flags |= ATGE_MII_CHECK;
 388         }
 389 
 390         mutex_exit(&atgep->atge_tx_lock);
 391 
 392         if (link == LINK_STATE_UP)
 393                 mac_tx_update(atgep->atge_mh);
 394 }
 395 
 396 void
 397 atge_tx_reclaim(atge_t *atgep, int end)
 398 {
 399         atge_tx_desc_t  *txd;
 400         atge_ring_t *r = atgep->atge_tx_ring;
 401         uchar_t *c;
 402         int start;
 403 
 404         ASSERT(MUTEX_HELD(&atgep->atge_tx_lock));
 405         ASSERT(r != NULL);
 406 
 407         start = r->r_consumer;
 408 
 409         if (start == end)
 410                 return;
 411 
 412         while (start != end) {
 413                 r->r_avail_desc++;
 414                 if (r->r_avail_desc > ATGE_TX_RING_CNT) {
 415 
 416                         atge_error(atgep->atge_dip,
 417                             "Reclaim : TX descriptor error");
 418 
 419                         if (r->r_avail_desc > (ATGE_TX_RING_CNT + 5)) {
 420                                 atge_device_stop(atgep);
 421                                 break;
 422                         }
 423                 }
 424 
 425                 c = (uchar_t *)r->r_desc_ring->addr;
 426                 c += (sizeof (atge_tx_desc_t) * start);
 427                 txd = (atge_tx_desc_t *)c;
 428 
 429                 /*
 430                  * Clearing TX descriptor helps in debugging some strange
 431                  * problems.
 432                  */
 433                 txd->addr = 0;
 434                 txd->len = 0;
 435                 txd->flags = 0;
 436 
 437                 ATGE_INC_SLOT(start, ATGE_TX_RING_CNT);
 438         }
 439 
 440         atgep->atge_tx_ring->r_consumer = start;
 441 
 442         DMA_SYNC(r->r_desc_ring, 0, ATGE_TX_RING_SZ, DDI_DMA_SYNC_FORDEV);
 443 }
 444 
 445 /*
 446  * Adds interrupt handler depending upon the type of interrupt supported by
 447  * the chip.
 448  */
 449 static int
 450 atge_add_intr_handler(atge_t *atgep, int intr_type)
 451 {
 452         int err;
 453         int count = 0;
 454         int avail = 0;
 455         int i;
 456         int flag;
 457 
 458         if (intr_type != DDI_INTR_TYPE_FIXED) {
 459                 err = ddi_intr_get_nintrs(atgep->atge_dip, intr_type, &count);
 460                 if (err != DDI_SUCCESS) {
 461                         atge_error(atgep->atge_dip,
 462                             "ddi_intr_get_nintrs failed : %d", err);
 463                         return (DDI_FAILURE);
 464                 }
 465 
 466                 ATGE_DB(("%s: %s() count : %d",
 467                     atgep->atge_name, __func__, count));
 468 
 469                 err = ddi_intr_get_navail(atgep->atge_dip, intr_type, &avail);
 470                 if (err != DDI_SUCCESS) {
 471                         atge_error(atgep->atge_dip,
 472                             "ddi_intr_get_navail failed : %d", err);
 473                         return (DDI_FAILURE);
 474                 }
 475 
 476                 if (avail < count) {
 477                         atge_error(atgep->atge_dip, "count :%d,"
 478                             " avail : %d", count, avail);
 479                 }
 480 
 481                 flag = DDI_INTR_ALLOC_STRICT;
 482         } else {
 483                 /*
 484                  * DDI_INTR_TYPE_FIXED case.
 485                  */
 486                 count = 1;
 487                 avail = 1;
 488                 flag = DDI_INTR_ALLOC_NORMAL;
 489         }
 490 
 491         atgep->atge_intr_size = avail * sizeof (ddi_intr_handle_t);
 492         atgep->atge_intr_handle = kmem_zalloc(atgep->atge_intr_size, KM_SLEEP);
 493 
 494         ATGE_DB(("%s: %s() avail:%d, count : %d, type : %d",
 495             atgep->atge_name, __func__, avail, count,
 496             intr_type));
 497 
 498         err = ddi_intr_alloc(atgep->atge_dip, atgep->atge_intr_handle,
 499             intr_type, 0, avail, &atgep->atge_intr_cnt, flag);
 500 
 501         if (err != DDI_SUCCESS) {
 502                 atge_error(atgep->atge_dip, "ddi_intr_alloc failed : %d", err);
 503                 kmem_free(atgep->atge_intr_handle, atgep->atge_intr_size);
 504                 return (DDI_FAILURE);
 505         }
 506 
 507         ATGE_DB(("%s: atge_add_intr_handler() after alloc count"
 508             " :%d, avail : %d", atgep->atge_name, count, avail));
 509 
 510         err = ddi_intr_get_pri(atgep->atge_intr_handle[0],
 511             &atgep->atge_intr_pri);
 512         if (err != DDI_SUCCESS) {
 513                 atge_error(atgep->atge_dip, "ddi_intr_get_pri failed:%d", err);
 514                 for (i = 0; i < atgep->atge_intr_cnt; i++) {
 515                         (void) ddi_intr_free(atgep->atge_intr_handle[i]);
 516                 }
 517                 kmem_free(atgep->atge_intr_handle, atgep->atge_intr_size);
 518 
 519                 return (DDI_FAILURE);
 520         }
 521 
 522         /*
 523          * Add interrupt handler now.
 524          */
 525         for (i = 0; i < atgep->atge_intr_cnt; i++) {
 526                 if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
 527                         err = ddi_intr_add_handler(atgep->atge_intr_handle[i],
 528                             atge_l1e_interrupt, atgep, (caddr_t)(uintptr_t)i);
 529                 } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
 530                         err = ddi_intr_add_handler(atgep->atge_intr_handle[i],
 531                             atge_l1_interrupt, atgep, (caddr_t)(uintptr_t)i);
 532                 }
 533 
 534                 if (err != DDI_SUCCESS) {
 535                         atge_error(atgep->atge_dip,
 536                             "ddi_intr_add_handler failed : %d", err);
 537 
 538                         (void) ddi_intr_free(atgep->atge_intr_handle[i]);
 539                         while (--i >= 0) {
 540                                 (void) ddi_intr_remove_handler(
 541                                     atgep->atge_intr_handle[i]);
 542                                 (void) ddi_intr_free(
 543                                     atgep->atge_intr_handle[i]);
 544                         }
 545 
 546                         kmem_free(atgep->atge_intr_handle,
 547                             atgep->atge_intr_size);
 548 
 549                         return (DDI_FAILURE);
 550                 }
 551         }
 552 
 553         err = ddi_intr_get_cap(atgep->atge_intr_handle[0],
 554             &atgep->atge_intr_cap);
 555 
 556         if (err != DDI_SUCCESS) {
 557                 atge_error(atgep->atge_dip,
 558                     "ddi_intr_get_cap failed : %d", err);
 559                 atge_remove_intr(atgep);
 560                 return (DDI_FAILURE);
 561         }
 562 
 563         if (intr_type == DDI_INTR_TYPE_FIXED)
 564                 atgep->atge_flags |= ATGE_FIXED_TYPE;
 565         else if (intr_type == DDI_INTR_TYPE_MSI)
 566                 atgep->atge_flags |= ATGE_MSI_TYPE;
 567         else if (intr_type == DDI_INTR_TYPE_MSIX)
 568                 atgep->atge_flags |= ATGE_MSIX_TYPE;
 569 
 570         return (DDI_SUCCESS);
 571 }
 572 
 573 void
 574 atge_remove_intr(atge_t *atgep)
 575 {
 576         int i;
 577         int cap = 0;
 578 
 579         if (atgep->atge_intr_handle == NULL)
 580                 return;
 581 
 582         if (atgep->atge_intr_cap & DDI_INTR_FLAG_BLOCK) {
 583                 (void) ddi_intr_block_disable(atgep->atge_intr_handle,
 584                     atgep->atge_intr_cnt);
 585 
 586                 cap = 1;
 587         }
 588 
 589         for (i = 0; i < atgep->atge_intr_cnt; i++) {
 590                 if (cap == 0)
 591                         (void) ddi_intr_disable(atgep->atge_intr_handle[i]);
 592 
 593                 (void) ddi_intr_remove_handler(atgep->atge_intr_handle[i]);
 594                 (void) ddi_intr_free(atgep->atge_intr_handle[i]);
 595         }
 596 
 597         kmem_free(atgep->atge_intr_handle, atgep->atge_intr_size);
 598 }
 599 
 600 int
 601 atge_enable_intrs(atge_t *atgep)
 602 {
 603         int err;
 604         int i;
 605 
 606         if (atgep->atge_intr_cap & DDI_INTR_FLAG_BLOCK) {
 607                 /*
 608                  * Do block enable.
 609                  */
 610                 err = ddi_intr_block_enable(atgep->atge_intr_handle,
 611                     atgep->atge_intr_cnt);
 612 
 613                 if (err != DDI_SUCCESS) {
 614                         atge_error(atgep->atge_dip,
 615                             "Failed to block enable intrs %d", err);
 616                         err = DDI_FAILURE;
 617                 } else {
 618                         err = DDI_SUCCESS;
 619                 }
 620         } else {
 621                 /*
 622                  * Call ddi_intr_enable() for MSI non-block enable.
 623                  */
 624                 for (i = 0; i < atgep->atge_intr_cnt; i++) {
 625                         err = ddi_intr_enable(atgep->atge_intr_handle[i]);
 626                         if (err != DDI_SUCCESS) {
 627                                 atge_error(atgep->atge_dip,
 628                                     "Failed to enable intrs on %d with : %d",
 629                                     i, err);
 630                                 break;
 631                         }
 632                 }
 633 
 634                 if (err == DDI_SUCCESS)
 635                         err = DDI_SUCCESS;
 636                 else
 637                         err = DDI_FAILURE;
 638         }
 639 
 640         return (err);
 641 }
 642 
 643 /*
 644  * Adds interrupt handler depending on the supported interrupt type by the
 645  * chip.
 646  */
 647 static int
 648 atge_add_intr(atge_t *atgep)
 649 {
 650         int     err;
 651 
 652         /*
 653          * Get the supported interrupt types.
 654          */
 655         err = ddi_intr_get_supported_types(atgep->atge_dip,
 656             &atgep->atge_intr_types);
 657         if (err != DDI_SUCCESS) {
 658                 atge_error(atgep->atge_dip,
 659                     "ddi_intr_get_supported_types failed : %d", err);
 660                 return (DDI_FAILURE);
 661         }
 662 
 663         ATGE_DB(("%s: ddi_intr_get_supported_types() returned : %d",
 664             atgep->atge_name, atgep->atge_intr_types));
 665 
 666 
 667         if (atgep->atge_intr_types & DDI_INTR_TYPE_MSIX) {
 668                 err = atge_add_intr_handler(atgep, DDI_INTR_TYPE_MSIX);
 669                 if (err == DDI_SUCCESS) {
 670                         ATGE_DB(("%s: Using MSIx for interrupt",
 671                             atgep->atge_name));
 672                         return (err);
 673                 }
 674         }
 675 
 676         if (atgep->atge_intr_types & DDI_INTR_TYPE_MSI) {
 677                 err = atge_add_intr_handler(atgep, DDI_INTR_TYPE_MSI);
 678                 if (err == DDI_SUCCESS) {
 679                         ATGE_DB(("%s: Using MSI for interrupt",
 680                             atgep->atge_name));
 681                         return (err);
 682                 }
 683         }
 684 
 685         err = DDI_FAILURE;
 686         if (atgep->atge_intr_types & DDI_INTR_TYPE_FIXED) {
 687                 err = atge_add_intr_handler(atgep, DDI_INTR_TYPE_FIXED);
 688                 if (err == DDI_SUCCESS) {
 689                         ATGE_DB(("%s: Using FIXED type for interrupt",
 690                             atgep->atge_name));
 691                         return (err);
 692                 }
 693         }
 694 
 695         return (err);
 696 }
 697 
 698 int
 699 atge_identify_hardware(atge_t *atgep)
 700 {
 701         uint16_t vid, did;
 702         int i;
 703 
 704         vid = pci_config_get16(atgep->atge_conf_handle, PCI_CONF_VENID);
 705         did = pci_config_get16(atgep->atge_conf_handle, PCI_CONF_DEVID);
 706 
 707         atgep->atge_model = 0;
 708         for (i = 0; i < (sizeof (atge_cards) / sizeof (atge_cards_t)); i++) {
 709                 if (atge_cards[i].vendor_id == vid &&
 710                     atge_cards[i].device_id == did) {
 711                         atgep->atge_model = atge_cards[i].model;
 712                         atgep->atge_revid =
 713                             pci_config_get8(atgep->atge_conf_handle,
 714                             PCI_CONF_REVID);
 715                         ATGE_DB(("%s: %s : PCI-ID pci%x,%x and model : %d",
 716                             atgep->atge_name, __func__, vid, did,
 717                             atgep->atge_model));
 718 
 719                         return (DDI_SUCCESS);
 720                 }
 721         }
 722 
 723         atge_error(atgep->atge_dip, "atge driver is attaching to unknown"
 724             " pci%d,%d vendor/device-id card", vid, did);
 725 
 726         /*
 727          * Assume it's L1 chip.
 728          */
 729         atgep->atge_model = ATGE_CHIP_L1;
 730         atgep->atge_revid = pci_config_get8(atgep->atge_conf_handle,
 731             PCI_CONF_REVID);
 732 
 733         /*
 734          * We will leave the decision to caller.
 735          */
 736         return (DDI_FAILURE);
 737 }
 738 
 739 int
 740 atge_get_macaddr(atge_t *atgep)
 741 {
 742         uint32_t reg;
 743 
 744         reg = INL(atgep, ATGE_SPI_CTRL);
 745         if ((reg & SPI_VPD_ENB) != 0) {
 746                 /*
 747                  * Get VPD stored in TWSI EEPROM.
 748                  */
 749                 reg &= ~SPI_VPD_ENB;
 750                 OUTL(atgep, ATGE_SPI_CTRL, reg);
 751 
 752                 ATGE_DB(("%s: %s called Get VPD", atgep->atge_name, __func__));
 753         }
 754 
 755         atgep->atge_ether_addr[5] = INB(atgep, ATGE_PAR0 + 0);
 756         atgep->atge_ether_addr[4] = INB(atgep, ATGE_PAR0 + 1);
 757         atgep->atge_ether_addr[3] = INB(atgep, ATGE_PAR0 + 2);
 758         atgep->atge_ether_addr[2] = INB(atgep, ATGE_PAR0 + 3);
 759         atgep->atge_ether_addr[1] = INB(atgep, ATGE_PAR1 + 0);
 760         atgep->atge_ether_addr[0] = INB(atgep, ATGE_PAR1 + 1);
 761 
 762         ATGE_DB(("%s: %s() Station Address - %x:%x:%x:%x:%x:%x",
 763             atgep->atge_name, __func__,
 764             atgep->atge_ether_addr[0],
 765             atgep->atge_ether_addr[1],
 766             atgep->atge_ether_addr[2],
 767             atgep->atge_ether_addr[3],
 768             atgep->atge_ether_addr[4],
 769             atgep->atge_ether_addr[5]));
 770 
 771         bcopy(atgep->atge_ether_addr, atgep->atge_dev_addr, ETHERADDRL);
 772 
 773         return (DDI_SUCCESS);
 774 }
 775 
 776 /*
 777  * Reset functionality for L1 and L1E. It's same.
 778  */
 779 static void
 780 atge_device_reset(atge_t *atgep)
 781 {
 782         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E ||
 783             ATGE_MODEL(atgep) == ATGE_CHIP_L1)
 784                 atge_device_reset_l1_l1e(atgep);
 785 }
 786 
 787 void
 788 atge_device_reset_l1_l1e(atge_t *atgep)
 789 {
 790         uint32_t reg;
 791         int t;
 792 
 793         OUTL(atgep, ATGE_MASTER_CFG, MASTER_RESET);
 794         reg = INL(atgep, ATGE_MASTER_CFG);
 795         for (t = ATGE_RESET_TIMEOUT; t > 0; t--) {
 796                 drv_usecwait(10);
 797                 reg = INL(atgep, ATGE_MASTER_CFG);
 798                 if ((reg & MASTER_RESET) == 0)
 799                         break;
 800         }
 801 
 802         if (t == 0) {
 803                 atge_error(atgep->atge_dip, " master reset timeout reg : %x",
 804                     reg);
 805         }
 806 
 807         for (t = ATGE_RESET_TIMEOUT; t > 0; t--) {
 808                 if ((reg = INL(atgep, ATGE_IDLE_STATUS)) == 0)
 809                         break;
 810 
 811                 drv_usecwait(10);
 812         }
 813 
 814         if (t == 0) {
 815                 atge_error(atgep->atge_dip, "device reset timeout reg : %x",
 816                     reg);
 817         }
 818 
 819         /*
 820          * Initialize PCIe module. These values came from FreeBSD and
 821          * we don't know the meaning of it.
 822          */
 823         OUTL(atgep, 0x12FC, 0x6500);
 824         reg = INL(atgep, 0x1008) | 0x8000;
 825         OUTL(atgep, 0x1008, reg);
 826 
 827         /*
 828          * Get chip revision.
 829          */
 830         atgep->atge_chip_rev = INL(atgep, ATGE_MASTER_CFG) >>
 831             MASTER_CHIP_REV_SHIFT;
 832 
 833         ATGE_DB(("%s: %s reset successfully rev : %x", atgep->atge_name,
 834             __func__, atgep->atge_chip_rev));
 835 }
 836 
 837 /*
 838  * DMA allocation for L1 and L1E is bit different since L1E uses RX pages
 839  * instead of descriptor based RX model.
 840  */
 841 static int
 842 atge_alloc_dma(atge_t *atgep)
 843 {
 844         int err = DDI_FAILURE;
 845 
 846         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
 847                 err = atge_l1e_alloc_dma(atgep);
 848         } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
 849                 err = atge_l1_alloc_dma(atgep);
 850         }
 851 
 852         return (err);
 853 }
 854 
 855 static void
 856 atge_free_dma(atge_t *atgep)
 857 {
 858         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
 859                 atge_l1e_free_dma(atgep);
 860         }
 861 }
 862 
 863 /*
 864  * Attach entry point in the driver.
 865  */
 866 static int
 867 atge_attach(dev_info_t *devinfo, ddi_attach_cmd_t cmd)
 868 {
 869         atge_t  *atgep;
 870         mac_register_t  *macreg;
 871         int     instance;
 872         uint16_t cap_ptr;
 873         uint16_t burst;
 874         int err;
 875         mii_ops_t *mii_ops;
 876 
 877         instance =  ddi_get_instance(devinfo);
 878 
 879         switch (cmd) {
 880         default:
 881                 return (DDI_FAILURE);
 882 
 883         case DDI_RESUME:
 884                 return (atge_resume(devinfo));
 885 
 886         case DDI_ATTACH:
 887                 ddi_set_driver_private(devinfo, NULL);
 888                 break;
 889         }
 890 
 891         atgep = kmem_zalloc(sizeof (atge_t), KM_SLEEP);
 892         ddi_set_driver_private(devinfo, atgep);
 893         atgep->atge_dip = devinfo;
 894 
 895         /*
 896          * Setup name and instance number to be used for debugging and
 897          * error reporting.
 898          */
 899         (void) snprintf(atgep->atge_name, sizeof (atgep->atge_name), "%s%d",
 900             "atge", instance);
 901 
 902 
 903         /*
 904          * Map PCI config space.
 905          */
 906         err = pci_config_setup(devinfo, &atgep->atge_conf_handle);
 907         if (err != DDI_SUCCESS) {
 908                 atge_error(devinfo, "pci_config_setup() failed");
 909                 goto fail1;
 910         }
 911 
 912         (void) atge_identify_hardware(atgep);
 913 
 914         /*
 915          * Map Device registers.
 916          */
 917         err = ddi_regs_map_setup(devinfo, ATGE_PCI_REG_NUMBER,
 918             &atgep->atge_io_regs, 0, 0, &atge_dev_attr, &atgep->atge_io_handle);
 919         if (err != DDI_SUCCESS) {
 920                 atge_error(devinfo, "ddi_regs_map_setup() failed");
 921                 goto fail2;
 922         }
 923 
 924         /*
 925          * Add interrupt and its associated handler.
 926          */
 927         err = atge_add_intr(atgep);
 928         if (err != DDI_SUCCESS) {
 929                 atge_error(devinfo, "Failed to add interrupt handler");
 930                 goto fail3;
 931         }
 932 
 933         mutex_init(&atgep->atge_intr_lock, NULL, MUTEX_DRIVER,
 934             DDI_INTR_PRI(atgep->atge_intr_pri));
 935 
 936         mutex_init(&atgep->atge_tx_lock, NULL, MUTEX_DRIVER,
 937             DDI_INTR_PRI(atgep->atge_intr_pri));
 938 
 939         mutex_init(&atgep->atge_rx_lock, NULL, MUTEX_DRIVER,
 940             DDI_INTR_PRI(atgep->atge_intr_pri));
 941 
 942         mutex_init(&atgep->atge_mii_lock, NULL, MUTEX_DRIVER, NULL);
 943 
 944         /*
 945          * Used to lock down MBOX register on L1 chip since RX consumer,
 946          * TX producer and RX return ring consumer are shared.
 947          */
 948         mutex_init(&atgep->atge_mbox_lock, NULL, MUTEX_DRIVER,
 949             DDI_INTR_PRI(atgep->atge_intr_pri));
 950 
 951         atgep->atge_link_state = LINK_STATE_DOWN;
 952         atgep->atge_mtu = ETHERMTU;
 953 
 954         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
 955                 if (atgep->atge_revid > 0xF0) {
 956                         /* L2E Rev. B. AR8114 */
 957                         atgep->atge_flags |= ATGE_FLAG_FASTETHER;
 958                 } else {
 959                         if ((INL(atgep, L1E_PHY_STATUS) &
 960                             PHY_STATUS_100M) != 0) {
 961                                 /* L1E AR8121 */
 962                                 atgep->atge_flags |= ATGE_FLAG_JUMBO;
 963                         } else {
 964                                 /* L2E Rev. A. AR8113 */
 965                                 atgep->atge_flags |= ATGE_FLAG_FASTETHER;
 966                         }
 967                 }
 968         }
 969 
 970         /*
 971          * Get DMA parameters from PCIe device control register.
 972          */
 973         err = PCI_CAP_LOCATE(atgep->atge_conf_handle, PCI_CAP_ID_PCI_E,
 974             &cap_ptr);
 975 
 976         if (err == DDI_FAILURE) {
 977                 atgep->atge_dma_rd_burst = DMA_CFG_RD_BURST_128;
 978                 atgep->atge_dma_wr_burst = DMA_CFG_WR_BURST_128;
 979         } else {
 980                 atgep->atge_flags |= ATGE_FLAG_PCIE;
 981                 burst = pci_config_get16(atgep->atge_conf_handle,
 982                     cap_ptr + 0x08);
 983 
 984                 /*
 985                  * Max read request size.
 986                  */
 987                 atgep->atge_dma_rd_burst = ((burst >> 12) & 0x07) <<
 988                     DMA_CFG_RD_BURST_SHIFT;
 989 
 990                 /*
 991                  * Max Payload Size.
 992                  */
 993                 atgep->atge_dma_wr_burst = ((burst >> 5) & 0x07) <<
 994                     DMA_CFG_WR_BURST_SHIFT;
 995 
 996                 ATGE_DB(("%s: %s() MRR : %d, MPS : %d",
 997                     atgep->atge_name, __func__,
 998                     (128 << ((burst >> 12) & 0x07)),
 999                     (128 << ((burst >> 5) & 0x07))));
1000         }
1001 
1002         /*
1003          * Allocate DMA resources.
1004          */
1005         err = atge_alloc_dma(atgep);
1006         if (err != DDI_SUCCESS) {
1007                 atge_error(devinfo, "Failed to allocate DMA resources");
1008                 goto fail4;
1009         }
1010 
1011         /*
1012          * Get station address.
1013          */
1014         (void) atge_get_macaddr(atgep);
1015 
1016         /*
1017          * Setup MII.
1018          */
1019         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
1020                 mii_ops = &atge_l1e_mii_ops;
1021         } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
1022                 mii_ops = &atge_l1_mii_ops;
1023         }
1024 
1025         if ((atgep->atge_mii = mii_alloc(atgep, devinfo,
1026             mii_ops)) == NULL) {
1027                 atge_error(devinfo, "mii_alloc() failed");
1028                 goto fail4;
1029         }
1030 
1031         /*
1032          * Register with MAC layer.
1033          */
1034         if ((macreg = mac_alloc(MAC_VERSION)) == NULL) {
1035                 atge_error(devinfo, "mac_alloc() failed due to version");
1036                 goto fail4;
1037         }
1038 
1039         macreg->m_type_ident = MAC_PLUGIN_IDENT_ETHER;
1040         macreg->m_driver = atgep;
1041         macreg->m_dip = devinfo;
1042         macreg->m_instance = instance;
1043         macreg->m_src_addr = atgep->atge_ether_addr;
1044         macreg->m_callbacks = &atge_m_callbacks;
1045         macreg->m_min_sdu = 0;
1046         macreg->m_max_sdu = atgep->atge_mtu;
1047         macreg->m_margin = VLAN_TAGSZ;
1048 
1049         if ((err = mac_register(macreg, &atgep->atge_mh)) != 0) {
1050                 atge_error(devinfo, "mac_register() failed with :%d", err);
1051                 mac_free(macreg);
1052                 goto fail4;
1053         }
1054 
1055         mac_free(macreg);
1056 
1057         ATGE_DB(("%s: %s() driver attached successfully",
1058             atgep->atge_name, __func__));
1059 
1060         atge_device_reset(atgep);
1061 
1062         atgep->atge_chip_state = ATGE_CHIP_INITIALIZED;
1063 
1064         /*
1065          * At last - enable interrupts.
1066          */
1067         err = atge_enable_intrs(atgep);
1068         if (err == DDI_FAILURE) {
1069                 goto fail5;
1070         }
1071 
1072         /*
1073          * Reset the PHY before starting.
1074          */
1075         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
1076                 atge_l1e_mii_reset(atgep);
1077         } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
1078                 atge_l1_mii_reset(atgep);
1079         }
1080 
1081         /*
1082          * Let the PHY run.
1083          */
1084         mii_start(atgep->atge_mii);
1085 
1086         return (DDI_SUCCESS);
1087 
1088 fail5:
1089         (void) mac_unregister(atgep->atge_mh);
1090         atge_device_stop(atgep);
1091         mii_stop(atgep->atge_mii);
1092         mii_free(atgep->atge_mii);
1093 fail4:
1094         atge_free_dma(atgep);
1095         mutex_destroy(&atgep->atge_intr_lock);
1096         mutex_destroy(&atgep->atge_tx_lock);
1097         mutex_destroy(&atgep->atge_rx_lock);
1098         atge_remove_intr(atgep);
1099 fail3:
1100         ddi_regs_map_free(&atgep->atge_io_handle);
1101 fail2:
1102         pci_config_teardown(&atgep->atge_conf_handle);
1103 fail1:
1104         if (atgep)
1105                 kmem_free(atgep, sizeof (atge_t));
1106 
1107         return (DDI_FAILURE);
1108 }
1109 
1110 static int
1111 atge_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
1112 {
1113         atge_t  *atgep;
1114 
1115         atgep = ddi_get_driver_private(dip);
1116         if (atgep == NULL) {
1117                 atge_error(dip, "No soft state in detach");
1118                 return (DDI_FAILURE);
1119         }
1120 
1121         switch (cmd) {
1122         case DDI_DETACH:
1123 
1124                 /*
1125                  * First unregister with MAC layer before stopping DMA
1126                  */
1127                 if (mac_disable(atgep->atge_mh) != DDI_SUCCESS)
1128                         return (DDI_FAILURE);
1129 
1130                 mii_stop(atgep->atge_mii);
1131 
1132                 mutex_enter(&atgep->atge_intr_lock);
1133                 mutex_enter(&atgep->atge_tx_lock);
1134                 atge_device_stop(atgep);
1135                 mutex_exit(&atgep->atge_tx_lock);
1136                 mutex_exit(&atgep->atge_intr_lock);
1137 
1138                 mii_free(atgep->atge_mii);
1139                 atge_free_dma(atgep);
1140 
1141                 ddi_regs_map_free(&atgep->atge_io_handle);
1142                 atge_remove_intr(atgep);
1143                 pci_config_teardown(&atgep->atge_conf_handle);
1144 
1145                 (void) mac_unregister(atgep->atge_mh);
1146                 mutex_destroy(&atgep->atge_intr_lock);
1147                 mutex_destroy(&atgep->atge_tx_lock);
1148                 mutex_destroy(&atgep->atge_rx_lock);
1149                 kmem_free(atgep, sizeof (atge_t));
1150                 ddi_set_driver_private(dip, NULL);
1151 
1152                 return (DDI_SUCCESS);
1153 
1154         case DDI_SUSPEND:
1155                 ATGE_DB(("%s: %s() is being suspended",
1156                     atgep->atge_name, __func__));
1157 
1158                 /*
1159                  * Suspend monitoring MII.
1160                  */
1161                 mii_suspend(atgep->atge_mii);
1162 
1163                 mutex_enter(&atgep->atge_intr_lock);
1164                 mutex_enter(&atgep->atge_tx_lock);
1165                 atgep->atge_chip_state |= ATGE_CHIP_SUSPENDED;
1166                 atge_device_stop(atgep);
1167                 mutex_exit(&atgep->atge_tx_lock);
1168                 mutex_exit(&atgep->atge_intr_lock);
1169 
1170                 return (DDI_SUCCESS);
1171 
1172         default:
1173                 return (DDI_FAILURE);
1174         }
1175 }
1176 
1177 int
1178 atge_alloc_buffers(atge_ring_t *r, size_t rcnt, size_t buflen, int f)
1179 {
1180         atge_dma_t *dma;
1181         atge_dma_t **tbl;
1182         int err = DDI_SUCCESS;
1183         int i;
1184 
1185         tbl = kmem_zalloc(rcnt * sizeof (atge_dma_t *), KM_SLEEP);
1186         r->r_buf_tbl = tbl;
1187 
1188         for (i = 0; i < rcnt; i++) {
1189                 dma = atge_buf_alloc(r->r_atge, buflen, f);
1190                 if (dma == NULL) {
1191                         err = DDI_FAILURE;
1192                         break;
1193                 }
1194 
1195                 tbl[i] = dma;
1196         }
1197 
1198         return (err);
1199 }
1200 
1201 void
1202 atge_free_buffers(atge_ring_t *r, size_t rcnt)
1203 {
1204         atge_dma_t **tbl;
1205         int i;
1206 
1207         if (r == NULL || r->r_buf_tbl == NULL)
1208                 return;
1209 
1210         tbl = r->r_buf_tbl;
1211         for (i = 0; i < rcnt; i++)  {
1212                 if (tbl[i] != NULL) {
1213                         atge_buf_free(tbl[i]);
1214                 }
1215         }
1216 
1217         kmem_free(tbl, rcnt * sizeof (atge_dma_t *));
1218 }
1219 
1220 atge_dma_t *
1221 atge_alloc_a_dma_blk(atge_t *atgep, ddi_dma_attr_t *attr, int size, int d)
1222 {
1223         int err;
1224         atge_dma_t *dma;
1225 
1226         dma = kmem_zalloc(sizeof (atge_dma_t), KM_SLEEP);
1227 
1228         err = ddi_dma_alloc_handle(atgep->atge_dip, attr,
1229             DDI_DMA_SLEEP, NULL, &dma->hdl);
1230 
1231         if (err != DDI_SUCCESS) {
1232                 atge_error(atgep->atge_dip, "%s() : failed"
1233                     " in ddi_dma_alloc_handle() : %d", __func__, err);
1234                 goto fail;
1235         }
1236 
1237         err = ddi_dma_mem_alloc(dma->hdl,
1238             size, &atge_buf_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
1239             &dma->addr, &dma->len, &dma->acchdl);
1240 
1241         if (err != DDI_SUCCESS) {
1242                 atge_error(atgep->atge_dip, "%s() : failed"
1243                     " in ddi_dma_mem_alloc() : %d", __func__, err);
1244                 ddi_dma_free_handle(&dma->hdl);
1245                 goto fail;
1246         }
1247 
1248         err = ddi_dma_addr_bind_handle(dma->hdl, NULL, dma->addr,
1249             dma->len, d | DDI_DMA_CONSISTENT, DDI_DMA_SLEEP,
1250             NULL, &dma->cookie, &dma->count);
1251 
1252         if (err != DDI_SUCCESS) {
1253                 atge_error(atgep->atge_dip, "%s() : failed"
1254                     " in ddi_dma_addr_bind_handle() : %d", __func__, err);
1255                 ddi_dma_mem_free(&dma->acchdl);
1256                 ddi_dma_free_handle(&dma->hdl);
1257                 goto fail;
1258         }
1259 
1260         return (dma);
1261 fail:
1262         kmem_free(dma, sizeof (atge_dma_t));
1263         return (NULL);
1264 }
1265 
1266 void
1267 atge_free_a_dma_blk(atge_dma_t *dma)
1268 {
1269         if (dma != NULL) {
1270                 (void) ddi_dma_unbind_handle(dma->hdl);
1271                 ddi_dma_mem_free(&dma->acchdl);
1272                 ddi_dma_free_handle(&dma->hdl);
1273                 kmem_free(dma, sizeof (atge_dma_t));
1274         }
1275 }
1276 
1277 atge_dma_t *
1278 atge_buf_alloc(atge_t *atgep, size_t len, int f)
1279 {
1280         atge_dma_t *dma = NULL;
1281         int err;
1282 
1283         dma = kmem_zalloc(sizeof (atge_dma_t), KM_SLEEP);
1284 
1285         err = ddi_dma_alloc_handle(atgep->atge_dip, &atge_dma_attr_buf,
1286             DDI_DMA_SLEEP, NULL, &dma->hdl);
1287 
1288         if (err != DDI_SUCCESS) {
1289                 atge_error(atgep->atge_dip, "%s() : failed"
1290                     " in %s() : %d", __func__, err);
1291                 goto fail;
1292         }
1293 
1294         err = ddi_dma_mem_alloc(dma->hdl, len, &atge_buf_attr,
1295             DDI_DMA_STREAMING, DDI_DMA_SLEEP, NULL, &dma->addr,
1296             &dma->len, &dma->acchdl);
1297 
1298         if (err != DDI_SUCCESS) {
1299                 atge_error(atgep->atge_dip, "%s() : failed"
1300                     " in %s() : %d", __func__, err);
1301                 ddi_dma_free_handle(&dma->hdl);
1302                 goto fail;
1303         }
1304 
1305         err = ddi_dma_addr_bind_handle(dma->hdl, NULL, dma->addr, dma->len,
1306             (f | DDI_DMA_CONSISTENT), DDI_DMA_SLEEP, NULL, &dma->cookie,
1307             &dma->count);
1308 
1309         if (err != DDI_SUCCESS) {
1310                 atge_error(atgep->atge_dip, "%s() : failed"
1311                     " in %s() : %d", __func__, err);
1312                 ddi_dma_mem_free(&dma->acchdl);
1313                 ddi_dma_free_handle(&dma->hdl);
1314                 goto fail;
1315         }
1316 
1317         /*
1318          * Number of return'ed cookie should be one.
1319          */
1320         ASSERT(dma->count == 1);
1321 
1322         return (dma);
1323 fail:
1324         kmem_free(dma, sizeof (atge_dma_t));
1325         return (NULL);
1326 }
1327 
1328 void
1329 atge_buf_free(atge_dma_t *dma)
1330 {
1331         ASSERT(dma != NULL);
1332 
1333         (void) ddi_dma_unbind_handle(dma->hdl);
1334         ddi_dma_mem_free(&dma->acchdl);
1335         ddi_dma_free_handle(&dma->hdl);
1336         kmem_free(dma, sizeof (atge_dma_t));
1337 }
1338 
1339 static int
1340 atge_resume(dev_info_t *dip)
1341 {
1342         atge_t  *atgep;
1343 
1344         if ((atgep = ddi_get_driver_private(dip)) == NULL) {
1345                 return (DDI_FAILURE);
1346         }
1347 
1348         mutex_enter(&atgep->atge_intr_lock);
1349         mutex_enter(&atgep->atge_tx_lock);
1350 
1351         atgep->atge_chip_state &= ~ATGE_CHIP_SUSPENDED;
1352 
1353         if (atgep->atge_chip_state & ATGE_CHIP_RUNNING) {
1354                 atge_device_restart(atgep);
1355         } else {
1356                 atge_device_reset(atgep);
1357         }
1358 
1359         mutex_exit(&atgep->atge_tx_lock);
1360         mutex_exit(&atgep->atge_intr_lock);
1361 
1362         /*
1363          * Reset the PHY before resuming MII.
1364          */
1365         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
1366                 atge_l1e_mii_reset(atgep);
1367         }
1368 
1369         mii_resume(atgep->atge_mii);
1370 
1371         /* kick-off downstream */
1372         mac_tx_update(atgep->atge_mh);
1373 
1374         return (DDI_SUCCESS);
1375 }
1376 
1377 static int
1378 atge_quiesce(dev_info_t *dip)
1379 {
1380         atge_t  *atgep;
1381 
1382         if ((atgep = ddi_get_driver_private(dip)) == NULL) {
1383                 return (DDI_FAILURE);
1384         }
1385 
1386         atge_device_stop(atgep);
1387 
1388         return (DDI_SUCCESS);
1389 }
1390 
1391 void
1392 atge_add_multicst(atge_t *atgep, uint8_t *macaddr)
1393 {
1394         uint32_t crc;
1395         int bit;
1396 
1397         ASSERT(MUTEX_HELD(&atgep->atge_intr_lock));
1398         ASSERT(MUTEX_HELD(&atgep->atge_tx_lock));
1399 
1400         ATGE_DB(("%s: %s() %x:%x:%x:%x:%x:%x",
1401             atgep->atge_name, __func__, macaddr[0], macaddr[1], macaddr[2],
1402             macaddr[3], macaddr[4], macaddr[5]));
1403 
1404         crc = atge_ether_crc(macaddr, ETHERADDRL);
1405         bit = (crc >> 26);
1406         atgep->atge_mchash_ref_cnt[bit]++;
1407         atgep->atge_mchash |= (1ULL << (crc >> 26));
1408 
1409         ATGE_DB(("%s: %s() mchash :%llx, bit : %d,"
1410             " atge_mchash_ref_cnt[bit] :%d",
1411             atgep->atge_name, __func__, atgep->atge_mchash, bit,
1412             atgep->atge_mchash_ref_cnt[bit]));
1413 }
1414 
1415 void
1416 atge_remove_multicst(atge_t *atgep, uint8_t *macaddr)
1417 {
1418         uint32_t crc;
1419         int bit;
1420 
1421         ASSERT(MUTEX_HELD(&atgep->atge_intr_lock));
1422         ASSERT(MUTEX_HELD(&atgep->atge_tx_lock));
1423 
1424         ATGE_DB(("%s: %s() %x:%x:%x:%x:%x:%x",
1425             atgep->atge_name, __func__, macaddr[0], macaddr[1], macaddr[2],
1426             macaddr[3], macaddr[4], macaddr[5]));
1427 
1428         crc = atge_ether_crc(macaddr, ETHERADDRL);
1429         bit = (crc >> 26);
1430         atgep->atge_mchash_ref_cnt[bit]--;
1431         if (atgep->atge_mchash_ref_cnt[bit] == 0)
1432                 atgep->atge_mchash &= ~(1ULL << (crc >> 26));
1433 
1434         ATGE_DB(("%s: %s() mchash :%llx, bit : %d,"
1435             " atge_mchash_ref_cnt[bit] :%d",
1436             atgep->atge_name, __func__, atgep->atge_mchash, bit,
1437             atgep->atge_mchash_ref_cnt[bit]));
1438 }
1439 
1440 int
1441 atge_m_multicst(void *arg, boolean_t add, const uint8_t *macaddr)
1442 {
1443         atge_t *atgep = arg;
1444 
1445         mutex_enter(&atgep->atge_intr_lock);
1446         mutex_enter(&atgep->atge_tx_lock);
1447 
1448         if (add) {
1449                 atge_add_multicst(atgep, (uint8_t *)macaddr);
1450         } else {
1451                 atge_remove_multicst(atgep, (uint8_t *)macaddr);
1452         }
1453 
1454         atge_rxfilter(atgep);
1455 
1456         mutex_exit(&atgep->atge_tx_lock);
1457         mutex_exit(&atgep->atge_intr_lock);
1458 
1459         return (0);
1460 }
1461 
1462 int
1463 atge_m_promisc(void *arg, boolean_t on)
1464 {
1465         atge_t *atgep = arg;
1466 
1467         mutex_enter(&atgep->atge_intr_lock);
1468         mutex_enter(&atgep->atge_tx_lock);
1469 
1470         if (on) {
1471                 atgep->atge_filter_flags |= ATGE_PROMISC;
1472         } else {
1473                 atgep->atge_filter_flags &= ~ATGE_PROMISC;
1474         }
1475 
1476         if (atgep->atge_chip_state & ATGE_CHIP_RUNNING) {
1477                 atge_rxfilter(atgep);
1478         }
1479 
1480         mutex_exit(&atgep->atge_tx_lock);
1481         mutex_exit(&atgep->atge_intr_lock);
1482 
1483         return (0);
1484 }
1485 
1486 int
1487 atge_m_unicst(void *arg, const uint8_t *macaddr)
1488 {
1489         atge_t *atgep = arg;
1490 
1491         mutex_enter(&atgep->atge_intr_lock);
1492         mutex_enter(&atgep->atge_tx_lock);
1493         bcopy(macaddr, atgep->atge_ether_addr, ETHERADDRL);
1494         atge_program_ether(atgep);
1495         atge_rxfilter(atgep);
1496         mutex_exit(&atgep->atge_tx_lock);
1497         mutex_exit(&atgep->atge_intr_lock);
1498 
1499         return (0);
1500 }
1501 
1502 mblk_t *
1503 atge_m_tx(void *arg, mblk_t *mp)
1504 {
1505         atge_t *atgep = arg;
1506         mblk_t  *nmp;
1507 
1508         mutex_enter(&atgep->atge_tx_lock);
1509 
1510         /*
1511          * This NIC does not like us to send pkt when link is down.
1512          */
1513         if (!(atgep->atge_link_state & LINK_STATE_UP)) {
1514                 atgep->atge_tx_resched = 1;
1515 
1516                 mutex_exit(&atgep->atge_tx_lock);
1517                 return (mp);
1518         }
1519 
1520         /*
1521          * Don't send a pkt if chip isn't running or in suspended state.
1522          */
1523         if ((atgep->atge_chip_state & ATGE_CHIP_RUNNING) == 0 ||
1524             atgep->atge_chip_state & ATGE_CHIP_SUSPENDED) {
1525                 atgep->atge_carrier_errors++;
1526                 atgep->atge_tx_resched = 1;
1527 
1528                 mutex_exit(&atgep->atge_tx_lock);
1529                 return (mp);
1530         }
1531 
1532         while (mp != NULL) {
1533                 nmp = mp->b_next;
1534                 mp->b_next = NULL;
1535 
1536                 if (atge_send_a_packet(atgep, mp) == DDI_FAILURE) {
1537                         mp->b_next = nmp;
1538                         break;
1539                 }
1540 
1541                 mp = nmp;
1542         }
1543 
1544         mutex_exit(&atgep->atge_tx_lock);
1545         return (mp);
1546 }
1547 
1548 int
1549 atge_m_start(void *arg)
1550 {
1551         atge_t *atgep = arg;
1552         int started = 0;
1553 
1554         ASSERT(atgep != NULL);
1555 
1556 
1557         mii_stop(atgep->atge_mii);
1558 
1559         mutex_enter(&atgep->atge_intr_lock);
1560         mutex_enter(&atgep->atge_tx_lock);
1561 
1562         if (!(atgep->atge_chip_state & ATGE_CHIP_SUSPENDED)) {
1563                 atge_device_restart(atgep);
1564                 started = 1;
1565         }
1566 
1567         mutex_exit(&atgep->atge_tx_lock);
1568         mutex_exit(&atgep->atge_intr_lock);
1569 
1570         mii_start(atgep->atge_mii);
1571 
1572         /* kick-off downstream */
1573         if (started)
1574                 mac_tx_update(atgep->atge_mh);
1575 
1576         return (0);
1577 }
1578 
1579 void
1580 atge_m_stop(void *arg)
1581 {
1582         atge_t *atgep = arg;
1583 
1584         mii_stop(atgep->atge_mii);
1585 
1586         /*
1587          * Cancel any pending I/O.
1588          */
1589         mutex_enter(&atgep->atge_intr_lock);
1590         atgep->atge_chip_state &= ~ATGE_CHIP_RUNNING;
1591         if (!(atgep->atge_chip_state & ATGE_CHIP_SUSPENDED))
1592                 atge_device_stop(atgep);
1593         mutex_exit(&atgep->atge_intr_lock);
1594 }
1595 
1596 int
1597 atge_m_stat(void *arg, uint_t stat, uint64_t *val)
1598 {
1599         atge_t *atgep = arg;
1600 
1601         if (mii_m_getstat(atgep->atge_mii, stat, val) == 0) {
1602                 return (0);
1603         }
1604 
1605         switch (stat) {
1606         case MAC_STAT_MULTIRCV:
1607                 *val = atgep->atge_multircv;
1608                 break;
1609 
1610         case MAC_STAT_BRDCSTRCV:
1611                 *val = atgep->atge_brdcstrcv;
1612                 break;
1613 
1614         case MAC_STAT_MULTIXMT:
1615                 *val = atgep->atge_multixmt;
1616                 break;
1617 
1618         case MAC_STAT_BRDCSTXMT:
1619                 *val = atgep->atge_brdcstxmt;
1620                 break;
1621 
1622         case MAC_STAT_IPACKETS:
1623                 *val = atgep->atge_ipackets;
1624                 break;
1625 
1626         case MAC_STAT_RBYTES:
1627                 *val = atgep->atge_rbytes;
1628                 break;
1629 
1630         case MAC_STAT_OPACKETS:
1631                 *val = atgep->atge_opackets;
1632                 break;
1633 
1634         case MAC_STAT_OBYTES:
1635                 *val = atgep->atge_obytes;
1636                 break;
1637 
1638         case MAC_STAT_NORCVBUF:
1639                 *val = atgep->atge_norcvbuf;
1640                 break;
1641 
1642         case MAC_STAT_NOXMTBUF:
1643                 *val = 0;
1644                 break;
1645 
1646         case MAC_STAT_COLLISIONS:
1647                 *val = atgep->atge_collisions;
1648                 break;
1649 
1650         case MAC_STAT_IERRORS:
1651                 *val = atgep->atge_errrcv;
1652                 break;
1653 
1654         case MAC_STAT_OERRORS:
1655                 *val = atgep->atge_errxmt;
1656                 break;
1657 
1658         case ETHER_STAT_ALIGN_ERRORS:
1659                 *val = atgep->atge_align_errors;
1660                 break;
1661 
1662         case ETHER_STAT_FCS_ERRORS:
1663                 *val = atgep->atge_fcs_errors;
1664                 break;
1665 
1666         case ETHER_STAT_SQE_ERRORS:
1667                 *val = atgep->atge_sqe_errors;
1668                 break;
1669 
1670         case ETHER_STAT_DEFER_XMTS:
1671                 *val = atgep->atge_defer_xmts;
1672                 break;
1673 
1674         case ETHER_STAT_FIRST_COLLISIONS:
1675                 *val = atgep->atge_first_collisions;
1676                 break;
1677 
1678         case ETHER_STAT_MULTI_COLLISIONS:
1679                 *val = atgep->atge_multi_collisions;
1680                 break;
1681 
1682         case ETHER_STAT_TX_LATE_COLLISIONS:
1683                 *val = atgep->atge_tx_late_collisions;
1684                 break;
1685 
1686         case ETHER_STAT_EX_COLLISIONS:
1687                 *val = atgep->atge_ex_collisions;
1688                 break;
1689 
1690         case ETHER_STAT_MACXMT_ERRORS:
1691                 *val = atgep->atge_macxmt_errors;
1692                 break;
1693 
1694         case ETHER_STAT_CARRIER_ERRORS:
1695                 *val = atgep->atge_carrier_errors;
1696                 break;
1697 
1698         case ETHER_STAT_TOOLONG_ERRORS:
1699                 *val = atgep->atge_toolong_errors;
1700                 break;
1701 
1702         case ETHER_STAT_MACRCV_ERRORS:
1703                 *val = atgep->atge_macrcv_errors;
1704                 break;
1705 
1706         case MAC_STAT_OVERFLOWS:
1707                 *val = atgep->atge_overflow;
1708                 break;
1709 
1710         case MAC_STAT_UNDERFLOWS:
1711                 *val = atgep->atge_underflow;
1712                 break;
1713 
1714         case ETHER_STAT_TOOSHORT_ERRORS:
1715                 *val = atgep->atge_runt;
1716                 break;
1717 
1718         case ETHER_STAT_JABBER_ERRORS:
1719                 *val = atgep->atge_jabber;
1720                 break;
1721 
1722         default:
1723                 return (ENOTSUP);
1724         }
1725 
1726         return (0);
1727 }
1728 
1729 int
1730 atge_m_getprop(void *arg, const char *name, mac_prop_id_t num, uint_t sz,
1731     void *val)
1732 {
1733         atge_t *atgep = arg;
1734 
1735         return (mii_m_getprop(atgep->atge_mii, name, num, sz, val));
1736 }
1737 
1738 int
1739 atge_m_setprop(void *arg, const char *name, mac_prop_id_t num, uint_t sz,
1740     const void *val)
1741 {
1742         atge_t *atgep = arg;
1743         int r;
1744 
1745         r = mii_m_setprop(atgep->atge_mii, name, num, sz, val);
1746 
1747         if (r == 0) {
1748                 mutex_enter(&atgep->atge_intr_lock);
1749                 mutex_enter(&atgep->atge_tx_lock);
1750 
1751                 if (atgep->atge_chip_state & ATGE_CHIP_RUNNING) {
1752                         atge_device_restart(atgep);
1753                 }
1754 
1755                 mutex_exit(&atgep->atge_tx_lock);
1756                 mutex_exit(&atgep->atge_intr_lock);
1757         }
1758 
1759         return (r);
1760 }
1761 
1762 static void
1763 atge_m_propinfo(void *arg, const char *name, mac_prop_id_t num,
1764     mac_prop_info_handle_t prh)
1765 {
1766         atge_t *atgep = arg;
1767 
1768         mii_m_propinfo(atgep->atge_mii, name, num, prh);
1769 }
1770 
1771 void
1772 atge_program_ether(atge_t *atgep)
1773 {
1774         ether_addr_t e;
1775 
1776         /*
1777          * Reprogram the Station address.
1778          */
1779         bcopy(atgep->atge_ether_addr, e, ETHERADDRL);
1780         OUTL(atgep, ATGE_PAR0,
1781             ((e[2] << 24) | (e[3] << 16) | (e[4] << 8) | e[5]));
1782         OUTL(atgep, ATGE_PAR1, (e[0] << 8) | e[1]);
1783 }
1784 
1785 /*
1786  * Device specific operations.
1787  */
1788 void
1789 atge_device_start(atge_t *atgep)
1790 {
1791         uint32_t rxf_hi, rxf_lo, rrd_hi, rrd_lo;
1792         uint32_t reg;
1793         uint32_t fsize;
1794 
1795         /*
1796          * Reprogram the Station address.
1797          */
1798         atge_program_ether(atgep);
1799 
1800         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
1801                 atge_l1e_program_dma(atgep);
1802         } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
1803                 atge_l1_program_dma(atgep);
1804         }
1805 
1806         ATGE_DB(("%s: %s() dma, counters programmed ", atgep->atge_name,
1807             __func__));
1808 
1809         OUTW(atgep, ATGE_INTR_CLR_TIMER, 1*1000/2);
1810 
1811         /*
1812          * Set Maximum frame size but don't let MTU be less than ETHER_MTU.
1813          */
1814         if (atgep->atge_mtu < ETHERMTU)
1815                 atgep->atge_max_frame_size = ETHERMTU;
1816         else
1817                 atgep->atge_max_frame_size = atgep->atge_mtu;
1818 
1819         atgep->atge_max_frame_size += sizeof (struct ether_header) +
1820             VLAN_TAGSZ + ETHERFCSL;
1821         OUTL(atgep, ATGE_FRAME_SIZE, atgep->atge_max_frame_size);
1822 
1823 
1824         /*
1825          * Configure IPG/IFG parameters.
1826          */
1827         OUTL(atgep, ATGE_IPG_IFG_CFG,
1828             ((IPG_IFG_IPG2_DEFAULT << IPG_IFG_IPG2_SHIFT) & IPG_IFG_IPG2_MASK) |
1829             ((IPG_IFG_IPG1_DEFAULT << IPG_IFG_IPG1_SHIFT) & IPG_IFG_IPG1_MASK) |
1830             ((IPG_IFG_MIFG_DEFAULT << IPG_IFG_MIFG_SHIFT) & IPG_IFG_MIFG_MASK) |
1831             ((IPG_IFG_IPGT_DEFAULT << IPG_IFG_IPGT_SHIFT) & IPG_IFG_IPGT_MASK));
1832 
1833         /*
1834          * Set parameters for half-duplex media.
1835          */
1836         OUTL(atgep, ATGE_HDPX_CFG,
1837             ((HDPX_CFG_LCOL_DEFAULT << HDPX_CFG_LCOL_SHIFT) &
1838             HDPX_CFG_LCOL_MASK) |
1839             ((HDPX_CFG_RETRY_DEFAULT << HDPX_CFG_RETRY_SHIFT) &
1840             HDPX_CFG_RETRY_MASK) | HDPX_CFG_EXC_DEF_EN |
1841             ((HDPX_CFG_ABEBT_DEFAULT << HDPX_CFG_ABEBT_SHIFT) &
1842             HDPX_CFG_ABEBT_MASK) |
1843             ((HDPX_CFG_JAMIPG_DEFAULT << HDPX_CFG_JAMIPG_SHIFT) &
1844             HDPX_CFG_JAMIPG_MASK));
1845 
1846         /*
1847          * Configure jumbo frame.
1848          */
1849         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
1850                 fsize = ROUNDUP(atgep->atge_max_frame_size, sizeof (uint64_t));
1851                 OUTL(atgep, ATGE_RXQ_JUMBO_CFG,
1852                     (((fsize / sizeof (uint64_t)) <<
1853                     RXQ_JUMBO_CFG_SZ_THRESH_SHIFT) &
1854                     RXQ_JUMBO_CFG_SZ_THRESH_MASK) |
1855                     ((RXQ_JUMBO_CFG_LKAH_DEFAULT <<
1856                     RXQ_JUMBO_CFG_LKAH_SHIFT) & RXQ_JUMBO_CFG_LKAH_MASK) |
1857                     ((ATGE_USECS(8) << RXQ_JUMBO_CFG_RRD_TIMER_SHIFT) &
1858                     RXQ_JUMBO_CFG_RRD_TIMER_MASK));
1859         } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E &&
1860             atgep->atge_flags & ATGE_FLAG_JUMBO) {
1861 
1862                 if (atgep->atge_mtu < ETHERMTU)
1863                         reg = atgep->atge_max_frame_size;
1864                 else if (atgep->atge_mtu < 6 * 1024)
1865                         reg = (atgep->atge_max_frame_size * 2) / 3;
1866                 else
1867                         reg = atgep->atge_max_frame_size / 2;
1868 
1869                 OUTL(atgep, L1E_TX_JUMBO_THRESH,
1870                     ROUNDUP(reg, TX_JUMBO_THRESH_UNIT) >>
1871                     TX_JUMBO_THRESH_UNIT_SHIFT);
1872         }
1873 
1874         /*
1875          * Configure flow-control parameters.
1876          */
1877         if ((atgep->atge_flags & ATGE_FLAG_PCIE) != 0) {
1878                 /*
1879                  * Some hardware version require this magic.
1880                  */
1881                 OUTL(atgep, 0x12FC, 0x6500);
1882                 reg = INL(atgep, 0x1008);
1883                 OUTL(atgep, 0x1008, reg | 0x8000);
1884         }
1885 
1886         /*
1887          * These are all magic parameters which came from FreeBSD.
1888          */
1889         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
1890                 switch (atgep->atge_chip_rev) {
1891                 case 0x8001:
1892                 case 0x9001:
1893                 case 0x9002:
1894                 case 0x9003:
1895                         rxf_hi = L1_RX_RING_CNT / 16;
1896                         rxf_lo = (L1_RX_RING_CNT * 7) / 8;
1897                         rrd_hi = (L1_RR_RING_CNT * 7) / 8;
1898                         rrd_lo = L1_RR_RING_CNT / 16;
1899                         break;
1900                 default:
1901                         reg = INL(atgep, L1_SRAM_RX_FIFO_LEN);
1902                         rxf_lo = reg / 16;
1903                         if (rxf_lo > 192)
1904                                 rxf_lo = 192;
1905                         rxf_hi = (reg * 7) / 8;
1906                         if (rxf_hi < rxf_lo)
1907                                 rxf_hi = rxf_lo + 16;
1908                         reg = INL(atgep, L1_SRAM_RRD_LEN);
1909                         rrd_lo = reg / 8;
1910                         rrd_hi = (reg * 7) / 8;
1911                         if (rrd_lo > 2)
1912                                 rrd_lo = 2;
1913                         if (rrd_hi < rrd_lo)
1914                                 rrd_hi = rrd_lo + 3;
1915                         break;
1916                 }
1917 
1918                 OUTL(atgep, ATGE_RXQ_FIFO_PAUSE_THRESH,
1919                     ((rxf_lo << RXQ_FIFO_PAUSE_THRESH_LO_SHIFT) &
1920                     RXQ_FIFO_PAUSE_THRESH_LO_MASK) |
1921                     ((rxf_hi << RXQ_FIFO_PAUSE_THRESH_HI_SHIFT) &
1922                     RXQ_FIFO_PAUSE_THRESH_HI_MASK));
1923 
1924                 OUTL(atgep, L1_RXQ_RRD_PAUSE_THRESH,
1925                     ((rrd_lo << RXQ_RRD_PAUSE_THRESH_LO_SHIFT) &
1926                     RXQ_RRD_PAUSE_THRESH_LO_MASK) |
1927                     ((rrd_hi << RXQ_RRD_PAUSE_THRESH_HI_SHIFT) &
1928                     RXQ_RRD_PAUSE_THRESH_HI_MASK));
1929         } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
1930                 reg = INL(atgep, L1E_SRAM_RX_FIFO_LEN);
1931                 rxf_hi = (reg * 4) / 5;
1932                 rxf_lo = reg/ 5;
1933 
1934                 OUTL(atgep, ATGE_RXQ_FIFO_PAUSE_THRESH,
1935                     ((rxf_lo << RXQ_FIFO_PAUSE_THRESH_LO_SHIFT) &
1936                     RXQ_FIFO_PAUSE_THRESH_LO_MASK) |
1937                     ((rxf_hi << RXQ_FIFO_PAUSE_THRESH_HI_SHIFT) &
1938                     RXQ_FIFO_PAUSE_THRESH_HI_MASK));
1939         }
1940 
1941         /* Configure RxQ. */
1942         reg = 0;
1943         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
1944                 reg =
1945                     ((RXQ_CFG_RD_BURST_DEFAULT << RXQ_CFG_RD_BURST_SHIFT) &
1946                     RXQ_CFG_RD_BURST_MASK) |
1947                     ((RXQ_CFG_RRD_BURST_THRESH_DEFAULT <<
1948                     RXQ_CFG_RRD_BURST_THRESH_SHIFT) &
1949                     RXQ_CFG_RRD_BURST_THRESH_MASK) |
1950                     ((RXQ_CFG_RD_PREF_MIN_IPG_DEFAULT <<
1951                     RXQ_CFG_RD_PREF_MIN_IPG_SHIFT) &
1952                     RXQ_CFG_RD_PREF_MIN_IPG_MASK) |
1953                     RXQ_CFG_CUT_THROUGH_ENB | RXQ_CFG_ENB;
1954                 OUTL(atgep, ATGE_RXQ_CFG, reg);
1955         } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
1956                 reg = RXQ_CFG_ALIGN_32 | RXQ_CFG_CUT_THROUGH_ENB |
1957                     RXQ_CFG_IPV6_CSUM_VERIFY | RXQ_CFG_ENB;
1958                 OUTL(atgep, ATGE_RXQ_CFG, reg);
1959         }
1960 
1961         /*
1962          * Configure TxQ.
1963          */
1964         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
1965                 reg =
1966                     (((TXQ_CFG_TPD_BURST_DEFAULT << TXQ_CFG_TPD_BURST_SHIFT) &
1967                     TXQ_CFG_TPD_BURST_MASK) |
1968                     ((TXQ_CFG_TX_FIFO_BURST_DEFAULT <<
1969                     TXQ_CFG_TX_FIFO_BURST_SHIFT) &
1970                     TXQ_CFG_TX_FIFO_BURST_MASK) |
1971                     ((TXQ_CFG_TPD_FETCH_DEFAULT <<
1972                     TXQ_CFG_TPD_FETCH_THRESH_SHIFT) &
1973                     TXQ_CFG_TPD_FETCH_THRESH_MASK) |
1974                     TXQ_CFG_ENB);
1975                 OUTL(atgep, ATGE_TXQ_CFG, reg);
1976         } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
1977                 reg = (128 <<
1978                     (atgep->atge_dma_rd_burst >> DMA_CFG_RD_BURST_SHIFT)) <<
1979                     TXQ_CFG_TX_FIFO_BURST_SHIFT;
1980 
1981                 reg |= (TXQ_CFG_TPD_BURST_DEFAULT << TXQ_CFG_TPD_BURST_SHIFT) &
1982                     TXQ_CFG_TPD_BURST_MASK;
1983 
1984                 reg |= TXQ_CFG_ENHANCED_MODE | TXQ_CFG_ENB;
1985 
1986                 OUTL(atgep, ATGE_TXQ_CFG, reg);
1987         }
1988 
1989         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
1990                 OUTL(atgep, L1_TX_JUMBO_TPD_TH_IPG,
1991                     (((fsize / sizeof (uint64_t) << TX_JUMBO_TPD_TH_SHIFT)) &
1992                     TX_JUMBO_TPD_TH_MASK) |
1993                     ((TX_JUMBO_TPD_IPG_DEFAULT << TX_JUMBO_TPD_IPG_SHIFT) &
1994                     TX_JUMBO_TPD_IPG_MASK));
1995         }
1996 
1997         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
1998                 /* Disable RSS. */
1999                 OUTL(atgep, L1E_RSS_IDT_TABLE0, 0);
2000                 OUTL(atgep, L1E_RSS_CPU, 0);
2001         }
2002 
2003         /*
2004          * Configure DMA parameters.
2005          */
2006         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
2007                 OUTL(atgep, ATGE_DMA_CFG,
2008                     DMA_CFG_ENH_ORDER | DMA_CFG_RCB_64 |
2009                     atgep->atge_dma_rd_burst | DMA_CFG_RD_ENB |
2010                     atgep->atge_dma_wr_burst | DMA_CFG_WR_ENB);
2011 
2012                 /* Configure CMB DMA write threshold. */
2013                 OUTL(atgep, L1_CMB_WR_THRESH,
2014                     ((CMB_WR_THRESH_RRD_DEFAULT << CMB_WR_THRESH_RRD_SHIFT) &
2015                     CMB_WR_THRESH_RRD_MASK) |
2016                     ((CMB_WR_THRESH_TPD_DEFAULT << CMB_WR_THRESH_TPD_SHIFT) &
2017                     CMB_WR_THRESH_TPD_MASK));
2018         } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
2019                 /*
2020                  * Don't use Tx CMB. It is known to cause RRS update failure
2021                  * under certain circumstances. Typical phenomenon of the
2022                  * issue would be unexpected sequence number encountered in
2023                  * Rx handler. Hence we don't set DMA_CFG_TXCMB_ENB.
2024                  */
2025                 OUTL(atgep, ATGE_DMA_CFG,
2026                     DMA_CFG_OUT_ORDER | DMA_CFG_RD_REQ_PRI | DMA_CFG_RCB_64 |
2027                     atgep->atge_dma_rd_burst | atgep->atge_dma_wr_burst |
2028                     DMA_CFG_RXCMB_ENB |
2029                     ((DMA_CFG_RD_DELAY_CNT_DEFAULT <<
2030                     DMA_CFG_RD_DELAY_CNT_SHIFT) & DMA_CFG_RD_DELAY_CNT_MASK) |
2031                     ((DMA_CFG_WR_DELAY_CNT_DEFAULT <<
2032                     DMA_CFG_WR_DELAY_CNT_SHIFT) & DMA_CFG_WR_DELAY_CNT_MASK));
2033         }
2034 
2035         /*
2036          * Enable CMB/SMB timer.
2037          */
2038         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
2039                 /* Set CMB/SMB timer and enable them. */
2040                 OUTL(atgep, L1_CMB_WR_TIMER,
2041                     ((ATGE_USECS(2) << CMB_WR_TIMER_TX_SHIFT) &
2042                     CMB_WR_TIMER_TX_MASK) |
2043                     ((ATGE_USECS(2) << CMB_WR_TIMER_RX_SHIFT) &
2044                     CMB_WR_TIMER_RX_MASK));
2045 
2046                 /* Request SMB updates for every seconds. */
2047                 OUTL(atgep, L1_SMB_TIMER, ATGE_USECS(1000 * 1000));
2048                 OUTL(atgep, L1_CSMB_CTRL,
2049                     CSMB_CTRL_SMB_ENB | CSMB_CTRL_CMB_ENB);
2050         } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
2051                 OUTL(atgep, L1E_SMB_STAT_TIMER, 100000);
2052                 atge_l1e_clear_stats(atgep);
2053         }
2054 
2055 
2056         /*
2057          * Disable all WOL bits as WOL can interfere normal Rx
2058          * operation.
2059          */
2060         OUTL(atgep, ATGE_WOL_CFG, 0);
2061 
2062         /*
2063          * Configure Tx/Rx MACs.
2064          *  - Auto-padding for short frames.
2065          *  - Enable CRC generation.
2066          *
2067          *  Start with full-duplex/1000Mbps media. Actual reconfiguration
2068          *  of MAC is followed after link establishment.
2069          */
2070         reg = (ATGE_CFG_TX_CRC_ENB | ATGE_CFG_TX_AUTO_PAD |
2071             ATGE_CFG_FULL_DUPLEX |
2072             ((ATGE_CFG_PREAMBLE_DEFAULT << ATGE_CFG_PREAMBLE_SHIFT) &
2073             ATGE_CFG_PREAMBLE_MASK));
2074 
2075         if ((atgep->atge_flags & ATGE_FLAG_FASTETHER) != 0) {
2076                 reg |= ATGE_CFG_SPEED_10_100;
2077                 ATGE_DB(("%s: %s() Fast Ethernet", atgep->atge_name, __func__));
2078         } else {
2079                 reg |= ATGE_CFG_SPEED_1000;
2080                 ATGE_DB(("%s: %s() 1G speed", atgep->atge_name, __func__));
2081         }
2082 
2083         OUTL(atgep, ATGE_MAC_CFG, reg);
2084 
2085         atgep->atge_chip_state |= ATGE_CHIP_RUNNING;
2086 
2087         /*
2088          * Set up the receive filter.
2089          */
2090         atge_rxfilter(atgep);
2091 
2092         /*
2093          * Acknowledge all pending interrupts and clear it.
2094          */
2095         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
2096                 OUTL(atgep, ATGE_INTR_STATUS, 0);
2097                 OUTL(atgep, ATGE_INTR_MASK, atgep->atge_intrs);
2098         } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
2099                 OUTL(atgep, ATGE_INTR_MASK, L1E_INTRS);
2100                 OUTL(atgep, ATGE_INTR_STATUS, 0xFFFFFFFF);
2101                 OUTL(atgep, ATGE_INTR_STATUS, 0);
2102         }
2103 
2104         atge_mac_config(atgep);
2105 
2106         ATGE_DB(("%s: %s() device started", atgep->atge_name, __func__));
2107 }
2108 
2109 /*
2110  * Generic functions.
2111  */
2112 
2113 #define CRC32_POLY_BE   0x04c11db7
2114 uint32_t
2115 atge_ether_crc(const uint8_t *addr, int len)
2116 {
2117         int idx;
2118         int bit;
2119         uint_t data;
2120         uint32_t crc;
2121 
2122         crc = 0xffffffff;
2123         for (idx = 0; idx < len; idx++) {
2124                 for (data = *addr++, bit = 0; bit < 8; bit++, data >>= 1) {
2125                         crc = (crc << 1)
2126                             ^ ((((crc >> 31) ^ data) & 1) ? CRC32_POLY_BE : 0);
2127                 }
2128         }
2129 
2130         return (crc);
2131 }
2132 
2133 
2134 /*
2135  * Programs RX filter. We use a link-list to keep track of all multicast
2136  * addressess.
2137  */
2138 void
2139 atge_rxfilter(atge_t *atgep)
2140 {
2141         uint32_t rxcfg;
2142         uint64_t mchash;
2143 
2144         rxcfg = INL(atgep, ATGE_MAC_CFG);
2145         rxcfg &= ~(ATGE_CFG_ALLMULTI | ATGE_CFG_PROMISC);
2146 
2147         /*
2148          * Accept broadcast frames.
2149          */
2150         rxcfg |= ATGE_CFG_BCAST;
2151 
2152         /*
2153          * We don't use Hardware VLAN tagging.
2154          */
2155         rxcfg &= ~ATGE_CFG_VLAN_TAG_STRIP;
2156 
2157         if (atgep->atge_filter_flags & (ATGE_PROMISC | ATGE_ALL_MULTICST)) {
2158                 mchash = ~0ULL;
2159 
2160                 if (atgep->atge_filter_flags & ATGE_PROMISC)
2161                         rxcfg |= ATGE_CFG_PROMISC;
2162 
2163                 if (atgep->atge_filter_flags & ATGE_ALL_MULTICST)
2164                         rxcfg |= ATGE_CFG_ALLMULTI;
2165         } else {
2166                 mchash = atgep->atge_mchash;
2167         }
2168 
2169         atge_program_ether(atgep);
2170 
2171         OUTL(atgep, ATGE_MAR0, (uint32_t)mchash);
2172         OUTL(atgep, ATGE_MAR1, (uint32_t)(mchash >> 32));
2173         OUTL(atgep, ATGE_MAC_CFG, rxcfg);
2174 
2175         ATGE_DB(("%s: %s() mac_cfg is : %x, mchash : %llx",
2176             atgep->atge_name, __func__, rxcfg, mchash));
2177 }
2178 
2179 void
2180 atge_device_stop(atge_t *atgep)
2181 {
2182         uint32_t reg;
2183         int t;
2184 
2185         /*
2186          * If the chip is being suspended, then don't touch the state. Caller
2187          * will take care of setting the correct state.
2188          */
2189         if (!(atgep->atge_chip_state & ATGE_CHIP_SUSPENDED)) {
2190                 atgep->atge_chip_state |= ATGE_CHIP_STOPPED;
2191                 atgep->atge_chip_state &= ~ATGE_CHIP_RUNNING;
2192         }
2193 
2194         /*
2195          * Collect stats for L1E. L1 chip's stats are collected by interrupt.
2196          */
2197         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
2198                 atge_l1e_gather_stats(atgep);
2199         }
2200 
2201         /*
2202          * Disable interrupts.
2203          */
2204         atge_disable_intrs(atgep);
2205 
2206         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1)
2207                 OUTL(atgep, L1_CSMB_CTRL, 0);
2208 
2209         /* Stop DMA Engine */
2210         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
2211                 atge_l1_stop_tx_mac(atgep);
2212                 atge_l1_stop_rx_mac(atgep);
2213 
2214                 reg = INL(atgep, ATGE_DMA_CFG);
2215                 reg &= ~(DMA_CFG_RD_ENB | DMA_CFG_WR_ENB);
2216                 OUTL(atgep, ATGE_DMA_CFG, reg);
2217 
2218         }
2219 
2220         /*
2221          * Disable queue processing.
2222          */
2223         /* Stop TxQ */
2224         reg = INL(atgep, ATGE_TXQ_CFG);
2225         reg = reg & ~TXQ_CFG_ENB;
2226         OUTL(atgep, ATGE_TXQ_CFG, reg);
2227 
2228         /* Stop RxQ */
2229         reg = INL(atgep, ATGE_RXQ_CFG);
2230         reg = reg & ~RXQ_CFG_ENB;
2231         OUTL(atgep, ATGE_RXQ_CFG, reg);
2232 
2233         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
2234                 reg = INL(atgep, ATGE_DMA_CFG);
2235                 reg = reg & ~(DMA_CFG_TXCMB_ENB | DMA_CFG_RXCMB_ENB);
2236                 OUTL(atgep, ATGE_DMA_CFG, reg);
2237                 drv_usecwait(1000);
2238                 atge_l1e_stop_mac(atgep);
2239                 OUTL(atgep, ATGE_INTR_STATUS, 0xFFFFFFFF);
2240         }
2241 
2242         for (t = ATGE_RESET_TIMEOUT; t > 0; t--) {
2243                 if ((reg = INL(atgep, ATGE_IDLE_STATUS)) == 0)
2244                         break;
2245                 drv_usecwait(10);
2246         }
2247 
2248         if (t == 0) {
2249                 atge_error(atgep->atge_dip, "%s() stopping TX/RX MAC timeout",
2250                     __func__);
2251         }
2252 }
2253 
2254 void
2255 atge_disable_intrs(atge_t *atgep)
2256 {
2257         OUTL(atgep, ATGE_INTR_MASK, 0);
2258         OUTL(atgep, ATGE_INTR_STATUS, 0xFFFFFFFF);
2259 }
2260 
2261 void
2262 atge_device_init(atge_t *atgep)
2263 {
2264         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
2265                 atgep->atge_intrs = L1E_INTRS;
2266                 atgep->atge_int_mod = ATGE_IM_TIMER_DEFAULT;
2267 
2268                 atge_l1e_init_tx_ring(atgep);
2269                 atge_l1e_init_rx_pages(atgep);
2270         } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
2271                 atgep->atge_intrs = L1_INTRS | INTR_GPHY | INTR_PHY_LINK_DOWN |
2272                     INTR_LINK_CHG;
2273                 atgep->atge_int_mod = ATGE_IM_TIMER_DEFAULT;
2274 
2275                 atge_l1_init_tx_ring(atgep);
2276                 atge_l1_init_rx_ring(atgep);
2277                 atge_l1_init_rr_ring(atgep);
2278                 atge_l1_init_cmb(atgep);
2279                 atge_l1_init_smb(atgep);
2280         }
2281 }
2282 
2283 void
2284 atge_device_restart(atge_t *atgep)
2285 {
2286         ASSERT(MUTEX_HELD(&atgep->atge_intr_lock));
2287         ASSERT(MUTEX_HELD(&atgep->atge_tx_lock));
2288 
2289         /*
2290          * Cancel any pending I/O.
2291          */
2292         atge_device_stop(atgep);
2293 
2294         /*
2295          * Reset the chip to a known state.
2296          */
2297         atge_device_reset(atgep);
2298 
2299         /*
2300          * Initialize the ring and other descriptor like CMB/SMB/Rx return.
2301          */
2302         atge_device_init(atgep);
2303 
2304         /*
2305          * Start the chip.
2306          */
2307         atge_device_start(atgep);
2308 
2309 }
2310 
2311 static int
2312 atge_send_a_packet(atge_t *atgep, mblk_t *mp)
2313 {
2314         atge_tx_desc_t  *txd;
2315         uchar_t *c;
2316         uint32_t cflags = 0;
2317         atge_ring_t *r;
2318         size_t pktlen;
2319         uchar_t *buf;
2320         int     start;
2321 
2322         ASSERT(MUTEX_HELD(&atgep->atge_tx_lock));
2323         ASSERT(mp != NULL);
2324 
2325         pktlen = msgsize(mp);
2326         if (pktlen > atgep->atge_tx_buf_len) {
2327                 atgep->atge_macxmt_errors++;
2328 
2329                 ATGE_DB(("%s: %s() pktlen (%d) > rx_buf_len (%d)",
2330                     atgep->atge_name, __func__,
2331                     pktlen, atgep->atge_rx_buf_len));
2332 
2333                 freemsg(mp);
2334                 return (DDI_SUCCESS);
2335         }
2336 
2337         r = atgep->atge_tx_ring;
2338 
2339         if (r->r_avail_desc <= 1) {
2340                 atgep->atge_noxmtbuf++;
2341                 atgep->atge_tx_resched = 1;
2342 
2343                 ATGE_DB(("%s: %s() No transmit buf",
2344                     atgep->atge_name, __func__));
2345 
2346                 return (DDI_FAILURE);
2347         }
2348 
2349         start = r->r_producer;
2350 
2351         /*
2352          * Get the DMA buffer to hold a packet.
2353          */
2354         buf = (uchar_t *)r->r_buf_tbl[start]->addr;
2355 
2356         /*
2357          * Copy the msg and free mp
2358          */
2359         mcopymsg(mp, buf);
2360 
2361         r->r_avail_desc--;
2362 
2363         c = (uchar_t *)r->r_desc_ring->addr;
2364         c += (sizeof (atge_tx_desc_t) * start);
2365         txd = (atge_tx_desc_t *)c;
2366 
2367         ATGE_PUT64(r->r_desc_ring, &txd->addr,
2368             r->r_buf_tbl[start]->cookie.dmac_laddress);
2369 
2370         ATGE_PUT32(r->r_desc_ring, &txd->len, ATGE_TX_BYTES(pktlen));
2371 
2372         cflags |= ATGE_TD_EOP;
2373         ATGE_PUT32(r->r_desc_ring, &txd->flags, cflags);
2374 
2375         /*
2376          * Sync buffer first.
2377          */
2378         DMA_SYNC(r->r_buf_tbl[start], 0, pktlen, DDI_DMA_SYNC_FORDEV);
2379 
2380         /*
2381          * Increment TX producer count by one.
2382          */
2383         ATGE_INC_SLOT(r->r_producer, ATGE_TX_RING_CNT);
2384 
2385         /*
2386          * Sync descriptor table.
2387          */
2388         DMA_SYNC(r->r_desc_ring, 0, ATGE_TX_RING_SZ, DDI_DMA_SYNC_FORDEV);
2389 
2390         /*
2391          * Program TX descriptor to send a packet.
2392          */
2393         if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
2394                 atge_l1e_send_packet(r);
2395         } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
2396                 atge_l1_send_packet(r);
2397         }
2398 
2399         r->r_atge->atge_opackets++;
2400         r->r_atge->atge_obytes += pktlen;
2401 
2402         ATGE_DB(("%s: %s() pktlen : %d, avail_desc : %d, producer  :%d, "
2403             "consumer : %d", atgep->atge_name, __func__, pktlen,
2404             r->r_avail_desc, r->r_producer, r->r_consumer));
2405 
2406         return (DDI_SUCCESS);
2407 }
2408 
2409 /*
2410  * Stream Information.
2411  */
2412 DDI_DEFINE_STREAM_OPS(atge_devops, nulldev, nulldev, atge_attach, atge_detach,
2413     nodev, NULL, D_MP, NULL, atge_quiesce);
2414 
2415 /*
2416  * Module linkage information.
2417  */
2418 static  struct  modldrv atge_modldrv = {
2419         &mod_driverops,                             /* Type of Module */
2420         "Atheros/Attansic Gb Ethernet",         /* Description */
2421         &atge_devops                                /* drv_dev_ops */
2422 };
2423 
2424 static  struct  modlinkage atge_modlinkage = {
2425         MODREV_1,                       /* ml_rev */
2426         (void *)&atge_modldrv,
2427         NULL
2428 };
2429 
2430 /*
2431  * DDI Entry points.
2432  */
2433 int
2434 _init(void)
2435 {
2436         int     r;
2437         mac_init_ops(&atge_devops, "atge");
2438         if ((r = mod_install(&atge_modlinkage)) != DDI_SUCCESS) {
2439                 mac_fini_ops(&atge_devops);
2440         }
2441 
2442         return (r);
2443 }
2444 
2445 int
2446 _fini(void)
2447 {
2448         int     r;
2449 
2450         if ((r = mod_remove(&atge_modlinkage)) == DDI_SUCCESS) {
2451                 mac_fini_ops(&atge_devops);
2452         }
2453 
2454         return (r);
2455 }
2456 
2457 int
2458 _info(struct modinfo *modinfop)
2459 {
2460         return (mod_info(&atge_modlinkage, modinfop));
2461 }