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