Home | History | Annotate | Download | only in e1000g
      1 /*
      2  * This file is provided under a CDDLv1 license.  When using or
      3  * redistributing this file, you may do so under this license.
      4  * In redistributing this file this license must be included
      5  * and no other modification of this header file is permitted.
      6  *
      7  * CDDL LICENSE SUMMARY
      8  *
      9  * Copyright(c) 1999 - 2009 Intel Corporation. All rights reserved.
     10  *
     11  * The contents of this file are subject to the terms of Version
     12  * 1.0 of the Common Development and Distribution License (the "License").
     13  *
     14  * You should have received a copy of the License with this software.
     15  * You can obtain a copy of the License at
     16  *	http://www.opensolaris.org/os/licensing.
     17  * See the License for the specific language governing permissions
     18  * and limitations under the License.
     19  */
     20 
     21 /*
     22  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 /*
     27  * **********************************************************************
     28  *									*
     29  * Module Name:								*
     30  *   e1000g_main.c							*
     31  *									*
     32  * Abstract:								*
     33  *   This file contains the interface routines for the solaris OS.	*
     34  *   It has all DDI entry point routines and GLD entry point routines.	*
     35  *									*
     36  *   This file also contains routines that take care of initialization	*
     37  *   uninit routine and interrupt routine.				*
     38  *									*
     39  * **********************************************************************
     40  */
     41 
     42 #include <sys/dlpi.h>
     43 #include <sys/mac.h>
     44 #include "e1000g_sw.h"
     45 #include "e1000g_debug.h"
     46 
     47 static char ident[] = "Intel PRO/1000 Ethernet";
     48 static char e1000g_string[] = "Intel(R) PRO/1000 Network Connection";
     49 static char e1000g_version[] = "Driver Ver. 5.3.22";
     50 
     51 /*
     52  * Proto types for DDI entry points
     53  */
     54 static int e1000g_attach(dev_info_t *, ddi_attach_cmd_t);
     55 static int e1000g_detach(dev_info_t *, ddi_detach_cmd_t);
     56 static int e1000g_quiesce(dev_info_t *);
     57 
     58 /*
     59  * init and intr routines prototype
     60  */
     61 static int e1000g_resume(dev_info_t *);
     62 static int e1000g_suspend(dev_info_t *);
     63 static uint_t e1000g_intr_pciexpress(caddr_t);
     64 static uint_t e1000g_intr(caddr_t);
     65 static void e1000g_intr_work(struct e1000g *, uint32_t);
     66 #pragma inline(e1000g_intr_work)
     67 static int e1000g_init(struct e1000g *);
     68 static int e1000g_start(struct e1000g *, boolean_t);
     69 static void e1000g_stop(struct e1000g *, boolean_t);
     70 static int e1000g_m_start(void *);
     71 static void e1000g_m_stop(void *);
     72 static int e1000g_m_promisc(void *, boolean_t);
     73 static boolean_t e1000g_m_getcapab(void *, mac_capab_t, void *);
     74 static int e1000g_m_multicst(void *, boolean_t, const uint8_t *);
     75 static void e1000g_m_ioctl(void *, queue_t *, mblk_t *);
     76 static int e1000g_m_setprop(void *, const char *, mac_prop_id_t,
     77     uint_t, const void *);
     78 static int e1000g_m_getprop(void *, const char *, mac_prop_id_t,
     79     uint_t, uint_t, void *, uint_t *);
     80 static int e1000g_set_priv_prop(struct e1000g *, const char *, uint_t,
     81     const void *);
     82 static int e1000g_get_priv_prop(struct e1000g *, const char *, uint_t,
     83     uint_t, void *, uint_t *);
     84 static void e1000g_init_locks(struct e1000g *);
     85 static void e1000g_destroy_locks(struct e1000g *);
     86 static int e1000g_identify_hardware(struct e1000g *);
     87 static int e1000g_regs_map(struct e1000g *);
     88 static int e1000g_set_driver_params(struct e1000g *);
     89 static void e1000g_set_bufsize(struct e1000g *);
     90 static int e1000g_register_mac(struct e1000g *);
     91 static boolean_t e1000g_rx_drain(struct e1000g *);
     92 static boolean_t e1000g_tx_drain(struct e1000g *);
     93 static void e1000g_init_unicst(struct e1000g *);
     94 static int e1000g_unicst_set(struct e1000g *, const uint8_t *, int);
     95 static int e1000g_alloc_rx_data(struct e1000g *);
     96 static void e1000g_release_multicast(struct e1000g *);
     97 static void e1000g_pch_limits(struct e1000g *);
     98 static uint32_t e1000g_mtu2maxframe(uint32_t);
     99 
    100 /*
    101  * Local routines
    102  */
    103 static boolean_t e1000g_reset_adapter(struct e1000g *);
    104 static void e1000g_tx_clean(struct e1000g *);
    105 static void e1000g_rx_clean(struct e1000g *);
    106 static void e1000g_link_timer(void *);
    107 static void e1000g_local_timer(void *);
    108 static boolean_t e1000g_link_check(struct e1000g *);
    109 static boolean_t e1000g_stall_check(struct e1000g *);
    110 static void e1000g_smartspeed(struct e1000g *);
    111 static void e1000g_get_conf(struct e1000g *);
    112 static boolean_t e1000g_get_prop(struct e1000g *, char *, int, int, int,
    113     int *);
    114 static void enable_watchdog_timer(struct e1000g *);
    115 static void disable_watchdog_timer(struct e1000g *);
    116 static void start_watchdog_timer(struct e1000g *);
    117 static void restart_watchdog_timer(struct e1000g *);
    118 static void stop_watchdog_timer(struct e1000g *);
    119 static void stop_link_timer(struct e1000g *);
    120 static void stop_82547_timer(e1000g_tx_ring_t *);
    121 static void e1000g_force_speed_duplex(struct e1000g *);
    122 static void e1000g_setup_max_mtu(struct e1000g *);
    123 static void e1000g_get_max_frame_size(struct e1000g *);
    124 static boolean_t is_valid_mac_addr(uint8_t *);
    125 static void e1000g_unattach(dev_info_t *, struct e1000g *);
    126 static int e1000g_get_bar_info(dev_info_t *, int, bar_info_t *);
    127 #ifdef E1000G_DEBUG
    128 static void e1000g_ioc_peek_reg(struct e1000g *, e1000g_peekpoke_t *);
    129 static void e1000g_ioc_poke_reg(struct e1000g *, e1000g_peekpoke_t *);
    130 static void e1000g_ioc_peek_mem(struct e1000g *, e1000g_peekpoke_t *);
    131 static void e1000g_ioc_poke_mem(struct e1000g *, e1000g_peekpoke_t *);
    132 static enum ioc_reply e1000g_pp_ioctl(struct e1000g *,
    133     struct iocblk *, mblk_t *);
    134 #endif
    135 static enum ioc_reply e1000g_loopback_ioctl(struct e1000g *,
    136     struct iocblk *, mblk_t *);
    137 static boolean_t e1000g_check_loopback_support(struct e1000_hw *);
    138 static boolean_t e1000g_set_loopback_mode(struct e1000g *, uint32_t);
    139 static void e1000g_set_internal_loopback(struct e1000g *);
    140 static void e1000g_set_external_loopback_1000(struct e1000g *);
    141 static void e1000g_set_external_loopback_100(struct e1000g *);
    142 static void e1000g_set_external_loopback_10(struct e1000g *);
    143 static int e1000g_add_intrs(struct e1000g *);
    144 static int e1000g_intr_add(struct e1000g *, int);
    145 static int e1000g_rem_intrs(struct e1000g *);
    146 static int e1000g_enable_intrs(struct e1000g *);
    147 static int e1000g_disable_intrs(struct e1000g *);
    148 static boolean_t e1000g_link_up(struct e1000g *);
    149 #ifdef __sparc
    150 static boolean_t e1000g_find_mac_address(struct e1000g *);
    151 #endif
    152 static void e1000g_get_phy_state(struct e1000g *);
    153 static int e1000g_fm_error_cb(dev_info_t *dip, ddi_fm_error_t *err,
    154     const void *impl_data);
    155 static void e1000g_fm_init(struct e1000g *Adapter);
    156 static void e1000g_fm_fini(struct e1000g *Adapter);
    157 static int e1000g_get_def_val(struct e1000g *, mac_prop_id_t, uint_t, void *);
    158 static void e1000g_param_sync(struct e1000g *);
    159 static void e1000g_get_driver_control(struct e1000_hw *);
    160 static void e1000g_release_driver_control(struct e1000_hw *);
    161 static void e1000g_restore_promisc(struct e1000g *Adapter);
    162 
    163 mac_priv_prop_t e1000g_priv_props[] = {
    164 	{"_tx_bcopy_threshold", MAC_PROP_PERM_RW},
    165 	{"_tx_interrupt_enable", MAC_PROP_PERM_RW},
    166 	{"_tx_intr_delay", MAC_PROP_PERM_RW},
    167 	{"_tx_intr_abs_delay", MAC_PROP_PERM_RW},
    168 	{"_rx_bcopy_threshold", MAC_PROP_PERM_RW},
    169 	{"_max_num_rcv_packets", MAC_PROP_PERM_RW},
    170 	{"_rx_intr_delay", MAC_PROP_PERM_RW},
    171 	{"_rx_intr_abs_delay", MAC_PROP_PERM_RW},
    172 	{"_intr_throttling_rate", MAC_PROP_PERM_RW},
    173 	{"_intr_adaptive", MAC_PROP_PERM_RW},
    174 	{"_adv_pause_cap", MAC_PROP_PERM_READ},
    175 	{"_adv_asym_pause_cap", MAC_PROP_PERM_READ},
    176 };
    177 #define	E1000G_MAX_PRIV_PROPS	\
    178 	(sizeof (e1000g_priv_props)/sizeof (mac_priv_prop_t))
    179 
    180 
    181 static struct cb_ops cb_ws_ops = {
    182 	nulldev,		/* cb_open */
    183 	nulldev,		/* cb_close */
    184 	nodev,			/* cb_strategy */
    185 	nodev,			/* cb_print */
    186 	nodev,			/* cb_dump */
    187 	nodev,			/* cb_read */
    188 	nodev,			/* cb_write */
    189 	nodev,			/* cb_ioctl */
    190 	nodev,			/* cb_devmap */
    191 	nodev,			/* cb_mmap */
    192 	nodev,			/* cb_segmap */
    193 	nochpoll,		/* cb_chpoll */
    194 	ddi_prop_op,		/* cb_prop_op */
    195 	NULL,			/* cb_stream */
    196 	D_MP | D_HOTPLUG,	/* cb_flag */
    197 	CB_REV,			/* cb_rev */
    198 	nodev,			/* cb_aread */
    199 	nodev			/* cb_awrite */
    200 };
    201 
    202 static struct dev_ops ws_ops = {
    203 	DEVO_REV,		/* devo_rev */
    204 	0,			/* devo_refcnt */
    205 	NULL,			/* devo_getinfo */
    206 	nulldev,		/* devo_identify */
    207 	nulldev,		/* devo_probe */
    208 	e1000g_attach,		/* devo_attach */
    209 	e1000g_detach,		/* devo_detach */
    210 	nodev,			/* devo_reset */
    211 	&cb_ws_ops,		/* devo_cb_ops */
    212 	NULL,			/* devo_bus_ops */
    213 	ddi_power,		/* devo_power */
    214 	e1000g_quiesce		/* devo_quiesce */
    215 };
    216 
    217 static struct modldrv modldrv = {
    218 	&mod_driverops,		/* Type of module.  This one is a driver */
    219 	ident,			/* Discription string */
    220 	&ws_ops,		/* driver ops */
    221 };
    222 
    223 static struct modlinkage modlinkage = {
    224 	MODREV_1, &modldrv, NULL
    225 };
    226 
    227 /* Access attributes for register mapping */
    228 static ddi_device_acc_attr_t e1000g_regs_acc_attr = {
    229 	DDI_DEVICE_ATTR_V1,
    230 	DDI_STRUCTURE_LE_ACC,
    231 	DDI_STRICTORDER_ACC,
    232 	DDI_FLAGERR_ACC
    233 };
    234 
    235 #define	E1000G_M_CALLBACK_FLAGS \
    236 	(MC_IOCTL | MC_GETCAPAB | MC_SETPROP | MC_GETPROP)
    237 
    238 static mac_callbacks_t e1000g_m_callbacks = {
    239 	E1000G_M_CALLBACK_FLAGS,
    240 	e1000g_m_stat,
    241 	e1000g_m_start,
    242 	e1000g_m_stop,
    243 	e1000g_m_promisc,
    244 	e1000g_m_multicst,
    245 	NULL,
    246 	e1000g_m_tx,
    247 	e1000g_m_ioctl,
    248 	e1000g_m_getcapab,
    249 	NULL,
    250 	NULL,
    251 	e1000g_m_setprop,
    252 	e1000g_m_getprop
    253 };
    254 
    255 /*
    256  * Global variables
    257  */
    258 uint32_t e1000g_mblks_pending = 0;
    259 /*
    260  * Workaround for Dynamic Reconfiguration support, for x86 platform only.
    261  * Here we maintain a private dev_info list if e1000g_force_detach is
    262  * enabled. If we force the driver to detach while there are still some
    263  * rx buffers retained in the upper layer, we have to keep a copy of the
    264  * dev_info. In some cases (Dynamic Reconfiguration), the dev_info data
    265  * structure will be freed after the driver is detached. However when we
    266  * finally free those rx buffers released by the upper layer, we need to
    267  * refer to the dev_info to free the dma buffers. So we save a copy of
    268  * the dev_info for this purpose. On x86 platform, we assume this copy
    269  * of dev_info is always valid, but on SPARC platform, it could be invalid
    270  * after the system board level DR operation. For this reason, the global
    271  * variable e1000g_force_detach must be B_FALSE on SPARC platform.
    272  */
    273 #ifdef __sparc
    274 boolean_t e1000g_force_detach = B_FALSE;
    275 #else
    276 boolean_t e1000g_force_detach = B_TRUE;
    277 #endif
    278 private_devi_list_t *e1000g_private_devi_list = NULL;
    279 
    280 /*
    281  * The mutex e1000g_rx_detach_lock is defined to protect the processing of
    282  * the private dev_info list, and to serialize the processing of rx buffer
    283  * freeing and rx buffer recycling.
    284  */
    285 kmutex_t e1000g_rx_detach_lock;
    286 /*
    287  * The rwlock e1000g_dma_type_lock is defined to protect the global flag
    288  * e1000g_dma_type. For SPARC, the initial value of the flag is "USE_DVMA".
    289  * If there are many e1000g instances, the system may run out of DVMA
    290  * resources during the initialization of the instances, then the flag will
    291  * be changed to "USE_DMA". Because different e1000g instances are initialized
    292  * in parallel, we need to use this lock to protect the flag.
    293  */
    294 krwlock_t e1000g_dma_type_lock;
    295 
    296 /*
    297  * The 82546 chipset is a dual-port device, both the ports share one eeprom.
    298  * Based on the information from Intel, the 82546 chipset has some hardware
    299  * problem. When one port is being reset and the other port is trying to
    300  * access the eeprom, it could cause system hang or panic. To workaround this
    301  * hardware problem, we use a global mutex to prevent such operations from
    302  * happening simultaneously on different instances. This workaround is applied
    303  * to all the devices supported by this driver.
    304  */
    305 kmutex_t e1000g_nvm_lock;
    306 
    307 /*
    308  * Loadable module configuration entry points for the driver
    309  */
    310 
    311 /*
    312  * _init - module initialization
    313  */
    314 int
    315 _init(void)
    316 {
    317 	int status;
    318 
    319 	mac_init_ops(&ws_ops, WSNAME);
    320 	status = mod_install(&modlinkage);
    321 	if (status != DDI_SUCCESS)
    322 		mac_fini_ops(&ws_ops);
    323 	else {
    324 		mutex_init(&e1000g_rx_detach_lock, NULL, MUTEX_DRIVER, NULL);
    325 		rw_init(&e1000g_dma_type_lock, NULL, RW_DRIVER, NULL);
    326 		mutex_init(&e1000g_nvm_lock, NULL, MUTEX_DRIVER, NULL);
    327 	}
    328 
    329 	return (status);
    330 }
    331 
    332 /*
    333  * _fini - module finalization
    334  */
    335 int
    336 _fini(void)
    337 {
    338 	int status;
    339 
    340 	if (e1000g_mblks_pending != 0)
    341 		return (EBUSY);
    342 
    343 	status = mod_remove(&modlinkage);
    344 	if (status == DDI_SUCCESS) {
    345 		mac_fini_ops(&ws_ops);
    346 
    347 		if (e1000g_force_detach) {
    348 			private_devi_list_t *devi_node;
    349 
    350 			mutex_enter(&e1000g_rx_detach_lock);
    351 			while (e1000g_private_devi_list != NULL) {
    352 				devi_node = e1000g_private_devi_list;
    353 				e1000g_private_devi_list =
    354 				    e1000g_private_devi_list->next;
    355 
    356 				kmem_free(devi_node->priv_dip,
    357 				    sizeof (struct dev_info));
    358 				kmem_free(devi_node,
    359 				    sizeof (private_devi_list_t));
    360 			}
    361 			mutex_exit(&e1000g_rx_detach_lock);
    362 		}
    363 
    364 		mutex_destroy(&e1000g_rx_detach_lock);
    365 		rw_destroy(&e1000g_dma_type_lock);
    366 		mutex_destroy(&e1000g_nvm_lock);
    367 	}
    368 
    369 	return (status);
    370 }
    371 
    372 /*
    373  * _info - module information
    374  */
    375 int
    376 _info(struct modinfo *modinfop)
    377 {
    378 	return (mod_info(&modlinkage, modinfop));
    379 }
    380 
    381 /*
    382  * e1000g_attach - driver attach
    383  *
    384  * This function is the device-specific initialization entry
    385  * point. This entry point is required and must be written.
    386  * The DDI_ATTACH command must be provided in the attach entry
    387  * point. When attach() is called with cmd set to DDI_ATTACH,
    388  * all normal kernel services (such as kmem_alloc(9F)) are
    389  * available for use by the driver.
    390  *
    391  * The attach() function will be called once for each instance
    392  * of  the  device  on  the  system with cmd set to DDI_ATTACH.
    393  * Until attach() succeeds, the only driver entry points which
    394  * may be called are open(9E) and getinfo(9E).
    395  */
    396 static int
    397 e1000g_attach(dev_info_t *devinfo, ddi_attach_cmd_t cmd)
    398 {
    399 	struct e1000g *Adapter;
    400 	struct e1000_hw *hw;
    401 	struct e1000g_osdep *osdep;
    402 	int instance;
    403 
    404 	switch (cmd) {
    405 	default:
    406 		e1000g_log(NULL, CE_WARN,
    407 		    "Unsupported command send to e1000g_attach... ");
    408 		return (DDI_FAILURE);
    409 
    410 	case DDI_RESUME:
    411 		return (e1000g_resume(devinfo));
    412 
    413 	case DDI_ATTACH:
    414 		break;
    415 	}
    416 
    417 	/*
    418 	 * get device instance number
    419 	 */
    420 	instance = ddi_get_instance(devinfo);
    421 
    422 	/*
    423 	 * Allocate soft data structure
    424 	 */
    425 	Adapter =
    426 	    (struct e1000g *)kmem_zalloc(sizeof (*Adapter), KM_SLEEP);
    427 
    428 	Adapter->dip = devinfo;
    429 	Adapter->instance = instance;
    430 	Adapter->tx_ring->adapter = Adapter;
    431 	Adapter->rx_ring->adapter = Adapter;
    432 
    433 	hw = &Adapter->shared;
    434 	osdep = &Adapter->osdep;
    435 	hw->back = osdep;
    436 	osdep->adapter = Adapter;
    437 
    438 	ddi_set_driver_private(devinfo, (caddr_t)Adapter);
    439 
    440 	/*
    441 	 * Initialize for fma support
    442 	 */
    443 	(void) e1000g_get_prop(Adapter, "fm-capable",
    444 	    0, 0x0f,
    445 	    DDI_FM_EREPORT_CAPABLE | DDI_FM_ACCCHK_CAPABLE |
    446 	    DDI_FM_DMACHK_CAPABLE | DDI_FM_ERRCB_CAPABLE,
    447 	    &Adapter->fm_capabilities);
    448 	e1000g_fm_init(Adapter);
    449 	Adapter->attach_progress |= ATTACH_PROGRESS_FMINIT;
    450 
    451 	/*
    452 	 * PCI Configure
    453 	 */
    454 	if (pci_config_setup(devinfo, &osdep->cfg_handle) != DDI_SUCCESS) {
    455 		e1000g_log(Adapter, CE_WARN, "PCI configuration failed");
    456 		goto attach_fail;
    457 	}
    458 	Adapter->attach_progress |= ATTACH_PROGRESS_PCI_CONFIG;
    459 
    460 	/*
    461 	 * Setup hardware
    462 	 */
    463 	if (e1000g_identify_hardware(Adapter) != DDI_SUCCESS) {
    464 		e1000g_log(Adapter, CE_WARN, "Identify hardware failed");
    465 		goto attach_fail;
    466 	}
    467 
    468 	/*
    469 	 * Map in the device registers.
    470 	 */
    471 	if (e1000g_regs_map(Adapter) != DDI_SUCCESS) {
    472 		e1000g_log(Adapter, CE_WARN, "Mapping registers failed");
    473 		goto attach_fail;
    474 	}
    475 	Adapter->attach_progress |= ATTACH_PROGRESS_REGS_MAP;
    476 
    477 	/*
    478 	 * Initialize driver parameters
    479 	 */
    480 	if (e1000g_set_driver_params(Adapter) != DDI_SUCCESS) {
    481 		goto attach_fail;
    482 	}
    483 	Adapter->attach_progress |= ATTACH_PROGRESS_SETUP;
    484 
    485 	if (e1000g_check_acc_handle(Adapter->osdep.cfg_handle) != DDI_FM_OK) {
    486 		ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_LOST);
    487 		goto attach_fail;
    488 	}
    489 
    490 	/*
    491 	 * Initialize interrupts
    492 	 */
    493 	if (e1000g_add_intrs(Adapter) != DDI_SUCCESS) {
    494 		e1000g_log(Adapter, CE_WARN, "Add interrupts failed");
    495 		goto attach_fail;
    496 	}
    497 	Adapter->attach_progress |= ATTACH_PROGRESS_ADD_INTR;
    498 
    499 	/*
    500 	 * Initialize mutex's for this device.
    501 	 * Do this before enabling the interrupt handler and
    502 	 * register the softint to avoid the condition where
    503 	 * interrupt handler can try using uninitialized mutex
    504 	 */
    505 	e1000g_init_locks(Adapter);
    506 	Adapter->attach_progress |= ATTACH_PROGRESS_LOCKS;
    507 
    508 	/*
    509 	 * Initialize Driver Counters
    510 	 */
    511 	if (e1000g_init_stats(Adapter) != DDI_SUCCESS) {
    512 		e1000g_log(Adapter, CE_WARN, "Init stats failed");
    513 		goto attach_fail;
    514 	}
    515 	Adapter->attach_progress |= ATTACH_PROGRESS_KSTATS;
    516 
    517 	/*
    518 	 * Initialize chip hardware and software structures
    519 	 */
    520 	rw_enter(&Adapter->chip_lock, RW_WRITER);
    521 	if (e1000g_init(Adapter) != DDI_SUCCESS) {
    522 		rw_exit(&Adapter->chip_lock);
    523 		e1000g_log(Adapter, CE_WARN, "Adapter initialization failed");
    524 		goto attach_fail;
    525 	}
    526 	rw_exit(&Adapter->chip_lock);
    527 	Adapter->attach_progress |= ATTACH_PROGRESS_INIT;
    528 
    529 	/*
    530 	 * Register the driver to the MAC
    531 	 */
    532 	if (e1000g_register_mac(Adapter) != DDI_SUCCESS) {
    533 		e1000g_log(Adapter, CE_WARN, "Register MAC failed");
    534 		goto attach_fail;
    535 	}
    536 	Adapter->attach_progress |= ATTACH_PROGRESS_MAC;
    537 
    538 	/*
    539 	 * Now that mutex locks are initialized, and the chip is also
    540 	 * initialized, enable interrupts.
    541 	 */
    542 	if (e1000g_enable_intrs(Adapter) != DDI_SUCCESS) {
    543 		e1000g_log(Adapter, CE_WARN, "Enable DDI interrupts failed");
    544 		goto attach_fail;
    545 	}
    546 	Adapter->attach_progress |= ATTACH_PROGRESS_ENABLE_INTR;
    547 
    548 	/*
    549 	 * If e1000g_force_detach is enabled, in global private dip list,
    550 	 * we will create a new entry, which maintains the priv_dip for DR
    551 	 * supports after driver detached.
    552 	 */
    553 	if (e1000g_force_detach) {
    554 		private_devi_list_t *devi_node;
    555 
    556 		Adapter->priv_dip =
    557 		    kmem_zalloc(sizeof (struct dev_info), KM_SLEEP);
    558 		bcopy(DEVI(devinfo), DEVI(Adapter->priv_dip),
    559 		    sizeof (struct dev_info));
    560 
    561 		devi_node =
    562 		    kmem_zalloc(sizeof (private_devi_list_t), KM_SLEEP);
    563 
    564 		mutex_enter(&e1000g_rx_detach_lock);
    565 		devi_node->priv_dip = Adapter->priv_dip;
    566 		devi_node->flag = E1000G_PRIV_DEVI_ATTACH;
    567 		devi_node->pending_rx_count = 0;
    568 
    569 		Adapter->priv_devi_node = devi_node;
    570 
    571 		if (e1000g_private_devi_list == NULL) {
    572 			devi_node->prev = NULL;
    573 			devi_node->next = NULL;
    574 			e1000g_private_devi_list = devi_node;
    575 		} else {
    576 			devi_node->prev = NULL;
    577 			devi_node->next = e1000g_private_devi_list;
    578 			e1000g_private_devi_list->prev = devi_node;
    579 			e1000g_private_devi_list = devi_node;
    580 		}
    581 		mutex_exit(&e1000g_rx_detach_lock);
    582 	}
    583 
    584 	cmn_err(CE_CONT, "!%s, %s\n", e1000g_string, e1000g_version);
    585 	Adapter->e1000g_state = E1000G_INITIALIZED;
    586 
    587 	return (DDI_SUCCESS);
    588 
    589 attach_fail:
    590 	e1000g_unattach(devinfo, Adapter);
    591 	return (DDI_FAILURE);
    592 }
    593 
    594 static int
    595 e1000g_register_mac(struct e1000g *Adapter)
    596 {
    597 	struct e1000_hw *hw = &Adapter->shared;
    598 	mac_register_t *mac;
    599 	int err;
    600 
    601 	if ((mac = mac_alloc(MAC_VERSION)) == NULL)
    602 		return (DDI_FAILURE);
    603 
    604 	mac->m_type_ident = MAC_PLUGIN_IDENT_ETHER;
    605 	mac->m_driver = Adapter;
    606 	mac->m_dip = Adapter->dip;
    607 	mac->m_src_addr = hw->mac.addr;
    608 	mac->m_callbacks = &e1000g_m_callbacks;
    609 	mac->m_min_sdu = 0;
    610 	mac->m_max_sdu = Adapter->default_mtu;
    611 	mac->m_margin = VLAN_TAGSZ;
    612 	mac->m_priv_props = e1000g_priv_props;
    613 	mac->m_priv_prop_count = E1000G_MAX_PRIV_PROPS;
    614 	mac->m_v12n = MAC_VIRT_LEVEL1;
    615 
    616 	err = mac_register(mac, &Adapter->mh);
    617 	mac_free(mac);
    618 
    619 	return (err == 0 ? DDI_SUCCESS : DDI_FAILURE);
    620 }
    621 
    622 static int
    623 e1000g_identify_hardware(struct e1000g *Adapter)
    624 {
    625 	struct e1000_hw *hw = &Adapter->shared;
    626 	struct e1000g_osdep *osdep = &Adapter->osdep;
    627 
    628 	/* Get the device id */
    629 	hw->vendor_id =
    630 	    pci_config_get16(osdep->cfg_handle, PCI_CONF_VENID);
    631 	hw->device_id =
    632 	    pci_config_get16(osdep->cfg_handle, PCI_CONF_DEVID);
    633 	hw->revision_id =
    634 	    pci_config_get8(osdep->cfg_handle, PCI_CONF_REVID);
    635 	hw->subsystem_device_id =
    636 	    pci_config_get16(osdep->cfg_handle, PCI_CONF_SUBSYSID);
    637 	hw->subsystem_vendor_id =
    638 	    pci_config_get16(osdep->cfg_handle, PCI_CONF_SUBVENID);
    639 
    640 	if (e1000_set_mac_type(hw) != E1000_SUCCESS) {
    641 		E1000G_DEBUGLOG_0(Adapter, E1000G_INFO_LEVEL,
    642 		    "MAC type could not be set properly.");
    643 		return (DDI_FAILURE);
    644 	}
    645 
    646 	return (DDI_SUCCESS);
    647 }
    648 
    649 static int
    650 e1000g_regs_map(struct e1000g *Adapter)
    651 {
    652 	dev_info_t *devinfo = Adapter->dip;
    653 	struct e1000_hw *hw = &Adapter->shared;
    654 	struct e1000g_osdep *osdep = &Adapter->osdep;
    655 	off_t mem_size;
    656 	bar_info_t bar_info;
    657 	int offset, rnumber;
    658 
    659 	rnumber = ADAPTER_REG_SET;
    660 	/* Get size of adapter register memory */
    661 	if (ddi_dev_regsize(devinfo, rnumber, &mem_size) !=
    662 	    DDI_SUCCESS) {
    663 		E1000G_DEBUGLOG_0(Adapter, CE_WARN,
    664 		    "ddi_dev_regsize for registers failed");
    665 		return (DDI_FAILURE);
    666 	}
    667 
    668 	/* Map adapter register memory */
    669 	if ((ddi_regs_map_setup(devinfo, rnumber,
    670 	    (caddr_t *)&hw->hw_addr, 0, mem_size, &e1000g_regs_acc_attr,
    671 	    &osdep->reg_handle)) != DDI_SUCCESS) {
    672 		E1000G_DEBUGLOG_0(Adapter, CE_WARN,
    673 		    "ddi_regs_map_setup for registers failed");
    674 		goto regs_map_fail;
    675 	}
    676 
    677 	/* ICH needs to map flash memory */
    678 	switch (hw->mac.type) {
    679 	case e1000_ich8lan:
    680 	case e1000_ich9lan:
    681 	case e1000_ich10lan:
    682 	case e1000_pchlan:
    683 		rnumber = ICH_FLASH_REG_SET;
    684 
    685 		/* get flash size */
    686 		if (ddi_dev_regsize(devinfo, rnumber,
    687 		    &mem_size) != DDI_SUCCESS) {
    688 			E1000G_DEBUGLOG_0(Adapter, CE_WARN,
    689 			    "ddi_dev_regsize for ICH flash failed");
    690 			goto regs_map_fail;
    691 		}
    692 
    693 		/* map flash in */
    694 		if (ddi_regs_map_setup(devinfo, rnumber,
    695 		    (caddr_t *)&hw->flash_address, 0,
    696 		    mem_size, &e1000g_regs_acc_attr,
    697 		    &osdep->ich_flash_handle) != DDI_SUCCESS) {
    698 			E1000G_DEBUGLOG_0(Adapter, CE_WARN,
    699 			    "ddi_regs_map_setup for ICH flash failed");
    700 			goto regs_map_fail;
    701 		}
    702 		break;
    703 	default:
    704 		break;
    705 	}
    706 
    707 	/* map io space */
    708 	switch (hw->mac.type) {
    709 	case e1000_82544:
    710 	case e1000_82540:
    711 	case e1000_82545:
    712 	case e1000_82546:
    713 	case e1000_82541:
    714 	case e1000_82541_rev_2:
    715 		/* find the IO bar */
    716 		rnumber = -1;
    717 		for (offset = PCI_CONF_BASE1;
    718 		    offset <= PCI_CONF_BASE5; offset += 4) {
    719 			if (e1000g_get_bar_info(devinfo, offset, &bar_info)
    720 			    != DDI_SUCCESS)
    721 				continue;
    722 			if (bar_info.type == E1000G_BAR_IO) {
    723 				rnumber = bar_info.rnumber;
    724 				break;
    725 			}
    726 		}
    727 
    728 		if (rnumber < 0) {
    729 			E1000G_DEBUGLOG_0(Adapter, CE_WARN,
    730 			    "No io space is found");
    731 			goto regs_map_fail;
    732 		}
    733 
    734 		/* get io space size */
    735 		if (ddi_dev_regsize(devinfo, rnumber,
    736 		    &mem_size) != DDI_SUCCESS) {
    737 			E1000G_DEBUGLOG_0(Adapter, CE_WARN,
    738 			    "ddi_dev_regsize for io space failed");
    739 			goto regs_map_fail;
    740 		}
    741 
    742 		/* map io space */
    743 		if ((ddi_regs_map_setup(devinfo, rnumber,
    744 		    (caddr_t *)&hw->io_base, 0, mem_size,
    745 		    &e1000g_regs_acc_attr,
    746 		    &osdep->io_reg_handle)) != DDI_SUCCESS) {
    747 			E1000G_DEBUGLOG_0(Adapter, CE_WARN,
    748 			    "ddi_regs_map_setup for io space failed");
    749 			goto regs_map_fail;
    750 		}
    751 		break;
    752 	default:
    753 		hw->io_base = 0;
    754 		break;
    755 	}
    756 
    757 	return (DDI_SUCCESS);
    758 
    759 regs_map_fail:
    760 	if (osdep->reg_handle != NULL)
    761 		ddi_regs_map_free(&osdep->reg_handle);
    762 	if (osdep->ich_flash_handle != NULL)
    763 		ddi_regs_map_free(&osdep->ich_flash_handle);
    764 	return (DDI_FAILURE);
    765 }
    766 
    767 static int
    768 e1000g_set_driver_params(struct e1000g *Adapter)
    769 {
    770 	struct e1000_hw *hw;
    771 
    772 	hw = &Adapter->shared;
    773 
    774 	/* Set MAC type and initialize hardware functions */
    775 	if (e1000_setup_init_funcs(hw, B_TRUE) != E1000_SUCCESS) {
    776 		E1000G_DEBUGLOG_0(Adapter, CE_WARN,
    777 		    "Could not setup hardware functions");
    778 		return (DDI_FAILURE);
    779 	}
    780 
    781 	/* Get bus information */
    782 	if (e1000_get_bus_info(hw) != E1000_SUCCESS) {
    783 		E1000G_DEBUGLOG_0(Adapter, CE_WARN,
    784 		    "Could not get bus information");
    785 		return (DDI_FAILURE);
    786 	}
    787 
    788 	e1000_read_pci_cfg(hw, PCI_COMMAND_REGISTER, &hw->bus.pci_cmd_word);
    789 
    790 	hw->mac.autoneg_failed = B_TRUE;
    791 
    792 	/* Set the autoneg_wait_to_complete flag to B_FALSE */
    793 	hw->phy.autoneg_wait_to_complete = B_FALSE;
    794 
    795 	/* Adaptive IFS related changes */
    796 	hw->mac.adaptive_ifs = B_TRUE;
    797 
    798 	/* Enable phy init script for IGP phy of 82541/82547 */
    799 	if ((hw->mac.type == e1000_82547) ||
    800 	    (hw->mac.type == e1000_82541) ||
    801 	    (hw->mac.type == e1000_82547_rev_2) ||
    802 	    (hw->mac.type == e1000_82541_rev_2))
    803 		e1000_init_script_state_82541(hw, B_TRUE);
    804 
    805 	/* Enable the TTL workaround for 82541/82547 */
    806 	e1000_set_ttl_workaround_state_82541(hw, B_TRUE);
    807 
    808 #ifdef __sparc
    809 	Adapter->strip_crc = B_TRUE;
    810 #else
    811 	Adapter->strip_crc = B_FALSE;
    812 #endif
    813 
    814 	/* setup the maximum MTU size of the chip */
    815 	e1000g_setup_max_mtu(Adapter);
    816 
    817 	/* Get speed/duplex settings in conf file */
    818 	hw->mac.forced_speed_duplex = ADVERTISE_100_FULL;
    819 	hw->phy.autoneg_advertised = AUTONEG_ADVERTISE_SPEED_DEFAULT;
    820 	e1000g_force_speed_duplex(Adapter);
    821 
    822 	/* Get Jumbo Frames settings in conf file */
    823 	e1000g_get_max_frame_size(Adapter);
    824 
    825 	/* Get conf file properties */
    826 	e1000g_get_conf(Adapter);
    827 
    828 	/* enforce PCH limits */
    829 	e1000g_pch_limits(Adapter);
    830 
    831 	/* Set Rx/Tx buffer size */
    832 	e1000g_set_bufsize(Adapter);
    833 
    834 	/* Master Latency Timer */
    835 	Adapter->master_latency_timer = DEFAULT_MASTER_LATENCY_TIMER;
    836 
    837 	/* copper options */
    838 	if (hw->phy.media_type == e1000_media_type_copper) {
    839 		hw->phy.mdix = 0;	/* AUTO_ALL_MODES */
    840 		hw->phy.disable_polarity_correction = B_FALSE;
    841 		hw->phy.ms_type = e1000_ms_hw_default;	/* E1000_MASTER_SLAVE */
    842 	}
    843 
    844 	/* The initial link state should be "unknown" */
    845 	Adapter->link_state = LINK_STATE_UNKNOWN;
    846 
    847 	/* Initialize rx parameters */
    848 	Adapter->rx_intr_delay = DEFAULT_RX_INTR_DELAY;
    849 	Adapter->rx_intr_abs_delay = DEFAULT_RX_INTR_ABS_DELAY;
    850 
    851 	/* Initialize tx parameters */
    852 	Adapter->tx_intr_enable = DEFAULT_TX_INTR_ENABLE;
    853 	Adapter->tx_bcopy_thresh = DEFAULT_TX_BCOPY_THRESHOLD;
    854 	Adapter->tx_intr_delay = DEFAULT_TX_INTR_DELAY;
    855 	Adapter->tx_intr_abs_delay = DEFAULT_TX_INTR_ABS_DELAY;
    856 
    857 	/* Initialize rx parameters */
    858 	Adapter->rx_bcopy_thresh = DEFAULT_RX_BCOPY_THRESHOLD;
    859 
    860 	return (DDI_SUCCESS);
    861 }
    862 
    863 static void
    864 e1000g_setup_max_mtu(struct e1000g *Adapter)
    865 {
    866 	struct e1000_mac_info *mac = &Adapter->shared.mac;
    867 	struct e1000_phy_info *phy = &Adapter->shared.phy;
    868 
    869 	switch (mac->type) {
    870 	/* types that do not support jumbo frames */
    871 	case e1000_ich8lan:
    872 	case e1000_82573:
    873 	case e1000_82583:
    874 		Adapter->max_mtu = ETHERMTU;
    875 		break;
    876 	/* ich9 supports jumbo frames except on one phy type */
    877 	case e1000_ich9lan:
    878 		if (phy->type == e1000_phy_ife)
    879 			Adapter->max_mtu = ETHERMTU;
    880 		else
    881 			Adapter->max_mtu = MAXIMUM_MTU_9K;
    882 		break;
    883 	/* pch can do jumbo frames up to 4K */
    884 	case e1000_pchlan:
    885 		Adapter->max_mtu = MAXIMUM_MTU_4K;
    886 		break;
    887 	/* types with a special limit */
    888 	case e1000_82571:
    889 	case e1000_82572:
    890 	case e1000_82574:
    891 	case e1000_80003es2lan:
    892 	case e1000_ich10lan:
    893 		Adapter->max_mtu = MAXIMUM_MTU_9K;
    894 		break;
    895 	/* default limit is 16K */
    896 	default:
    897 		Adapter->max_mtu = FRAME_SIZE_UPTO_16K -
    898 		    sizeof (struct ether_vlan_header) - ETHERFCSL -
    899 		    E1000G_IPALIGNPRESERVEROOM;
    900 		break;
    901 	}
    902 }
    903 
    904 static void
    905 e1000g_set_bufsize(struct e1000g *Adapter)
    906 {
    907 	struct e1000_mac_info *mac = &Adapter->shared.mac;
    908 	uint64_t rx_size;
    909 	uint64_t tx_size;
    910 
    911 	dev_info_t *devinfo = Adapter->dip;
    912 #ifdef __sparc
    913 	ulong_t iommu_pagesize;
    914 #endif
    915 	/* Get the system page size */
    916 	Adapter->sys_page_sz = ddi_ptob(devinfo, (ulong_t)1);
    917 
    918 #ifdef __sparc
    919 	iommu_pagesize = dvma_pagesize(devinfo);
    920 	if (iommu_pagesize != 0) {
    921 		if (Adapter->sys_page_sz == iommu_pagesize) {
    922 			if (iommu_pagesize > 0x4000)
    923 				Adapter->sys_page_sz = 0x4000;
    924 		} else {
    925 			if (Adapter->sys_page_sz > iommu_pagesize)
    926 				Adapter->sys_page_sz = iommu_pagesize;
    927 		}
    928 	}
    929 	if (Adapter->lso_enable) {
    930 		Adapter->dvma_page_num = E1000_LSO_MAXLEN /
    931 		    Adapter->sys_page_sz + E1000G_DEFAULT_DVMA_PAGE_NUM;
    932 	} else {
    933 		Adapter->dvma_page_num = Adapter->max_frame_size /
    934 		    Adapter->sys_page_sz + E1000G_DEFAULT_DVMA_PAGE_NUM;
    935 	}
    936 	ASSERT(Adapter->dvma_page_num >= E1000G_DEFAULT_DVMA_PAGE_NUM);
    937 #endif
    938 
    939 	Adapter->min_frame_size = ETHERMIN + ETHERFCSL;
    940 
    941 	if (Adapter->mem_workaround_82546 &&
    942 	    ((mac->type == e1000_82545) ||
    943 	    (mac->type == e1000_82546) ||
    944 	    (mac->type == e1000_82546_rev_3))) {
    945 		Adapter->rx_buffer_size = E1000_RX_BUFFER_SIZE_2K +
    946 		    E1000G_IPALIGNROOM;
    947 	} else {
    948 		rx_size = Adapter->max_frame_size + E1000G_IPALIGNPRESERVEROOM;
    949 		if ((rx_size > FRAME_SIZE_UPTO_2K) &&
    950 		    (rx_size <= FRAME_SIZE_UPTO_4K))
    951 			Adapter->rx_buffer_size = E1000_RX_BUFFER_SIZE_4K;
    952 		else if ((rx_size > FRAME_SIZE_UPTO_4K) &&
    953 		    (rx_size <= FRAME_SIZE_UPTO_8K))
    954 			Adapter->rx_buffer_size = E1000_RX_BUFFER_SIZE_8K;
    955 		else if ((rx_size > FRAME_SIZE_UPTO_8K) &&
    956 		    (rx_size <= FRAME_SIZE_UPTO_16K))
    957 			Adapter->rx_buffer_size = E1000_RX_BUFFER_SIZE_16K;
    958 		else
    959 			Adapter->rx_buffer_size = E1000_RX_BUFFER_SIZE_2K;
    960 	}
    961 
    962 	tx_size = Adapter->max_frame_size;
    963 	if ((tx_size > FRAME_SIZE_UPTO_2K) && (tx_size <= FRAME_SIZE_UPTO_4K))
    964 		Adapter->tx_buffer_size = E1000_TX_BUFFER_SIZE_4K;
    965 	else if ((tx_size > FRAME_SIZE_UPTO_4K) &&
    966 	    (tx_size <= FRAME_SIZE_UPTO_8K))
    967 		Adapter->tx_buffer_size = E1000_TX_BUFFER_SIZE_8K;
    968 	else if ((tx_size > FRAME_SIZE_UPTO_8K) &&
    969 	    (tx_size <= FRAME_SIZE_UPTO_16K))
    970 		Adapter->tx_buffer_size = E1000_TX_BUFFER_SIZE_16K;
    971 	else
    972 		Adapter->tx_buffer_size = E1000_TX_BUFFER_SIZE_2K;
    973 
    974 	/*
    975 	 * For Wiseman adapters we have an requirement of having receive
    976 	 * buffers aligned at 256 byte boundary. Since Livengood does not
    977 	 * require this and forcing it for all hardwares will have
    978 	 * performance implications, I am making it applicable only for
    979 	 * Wiseman and for Jumbo frames enabled mode as rest of the time,
    980 	 * it is okay to have normal frames...but it does involve a
    981 	 * potential risk where we may loose data if buffer is not
    982 	 * aligned...so all wiseman boards to have 256 byte aligned
    983 	 * buffers
    984 	 */
    985 	if (mac->type < e1000_82543)
    986 		Adapter->rx_buf_align = RECEIVE_BUFFER_ALIGN_SIZE;
    987 	else
    988 		Adapter->rx_buf_align = 1;
    989 }
    990 
    991 /*
    992  * e1000g_detach - driver detach
    993  *
    994  * The detach() function is the complement of the attach routine.
    995  * If cmd is set to DDI_DETACH, detach() is used to remove  the
    996  * state  associated  with  a  given  instance of a device node
    997  * prior to the removal of that instance from the system.
    998  *
    999  * The detach() function will be called once for each  instance
   1000  * of the device for which there has been a successful attach()
   1001  * once there are no longer  any  opens  on  the  device.
   1002  *
   1003  * Interrupts routine are disabled, All memory allocated by this
   1004  * driver are freed.
   1005  */
   1006 static int
   1007 e1000g_detach(dev_info_t *devinfo, ddi_detach_cmd_t cmd)
   1008 {
   1009 	struct e1000g *Adapter;
   1010 	boolean_t rx_drain;
   1011 
   1012 	switch (cmd) {
   1013 	default:
   1014 		return (DDI_FAILURE);
   1015 
   1016 	case DDI_SUSPEND:
   1017 		return (e1000g_suspend(devinfo));
   1018 
   1019 	case DDI_DETACH:
   1020 		break;
   1021 	}
   1022 
   1023 	Adapter = (struct e1000g *)ddi_get_driver_private(devinfo);
   1024 	if (Adapter == NULL)
   1025 		return (DDI_FAILURE);
   1026 
   1027 	rx_drain = e1000g_rx_drain(Adapter);
   1028 	if (!rx_drain && !e1000g_force_detach)
   1029 		return (DDI_FAILURE);
   1030 
   1031 	if (mac_unregister(Adapter->mh) != 0) {
   1032 		e1000g_log(Adapter, CE_WARN, "Unregister MAC failed");
   1033 		return (DDI_FAILURE);
   1034 	}
   1035 	Adapter->attach_progress &= ~ATTACH_PROGRESS_MAC;
   1036 
   1037 	ASSERT(!(Adapter->e1000g_state & E1000G_STARTED));
   1038 
   1039 	if (!e1000g_force_detach && !rx_drain)
   1040 		return (DDI_FAILURE);
   1041 
   1042 	e1000g_unattach(devinfo, Adapter);
   1043 
   1044 	return (DDI_SUCCESS);
   1045 }
   1046 
   1047 /*
   1048  * e1000g_free_priv_devi_node - free a priv_dip entry for driver instance
   1049  */
   1050 void
   1051 e1000g_free_priv_devi_node(private_devi_list_t *devi_node)
   1052 {
   1053 	ASSERT(e1000g_private_devi_list != NULL);
   1054 	ASSERT(devi_node != NULL);
   1055 
   1056 	if (devi_node->prev != NULL)
   1057 		devi_node->prev->next = devi_node->next;
   1058 	if (devi_node->next != NULL)
   1059 		devi_node->next->prev = devi_node->prev;
   1060 	if (devi_node == e1000g_private_devi_list)
   1061 		e1000g_private_devi_list = devi_node->next;
   1062 
   1063 	kmem_free(devi_node->priv_dip,
   1064 	    sizeof (struct dev_info));
   1065 	kmem_free(devi_node,
   1066 	    sizeof (private_devi_list_t));
   1067 }
   1068 
   1069 static void
   1070 e1000g_unattach(dev_info_t *devinfo, struct e1000g *Adapter)
   1071 {
   1072 	private_devi_list_t *devi_node;
   1073 	int result;
   1074 
   1075 	if (Adapter->attach_progress & ATTACH_PROGRESS_ENABLE_INTR) {
   1076 		(void) e1000g_disable_intrs(Adapter);
   1077 	}
   1078 
   1079 	if (Adapter->attach_progress & ATTACH_PROGRESS_MAC) {
   1080 		(void) mac_unregister(Adapter->mh);
   1081 	}
   1082 
   1083 	if (Adapter->attach_progress & ATTACH_PROGRESS_ADD_INTR) {
   1084 		(void) e1000g_rem_intrs(Adapter);
   1085 	}
   1086 
   1087 	if (Adapter->attach_progress & ATTACH_PROGRESS_SETUP) {
   1088 		(void) ddi_prop_remove_all(devinfo);
   1089 	}
   1090 
   1091 	if (Adapter->attach_progress & ATTACH_PROGRESS_KSTATS) {
   1092 		kstat_delete((kstat_t *)Adapter->e1000g_ksp);
   1093 	}
   1094 
   1095 	if (Adapter->attach_progress & ATTACH_PROGRESS_INIT) {
   1096 		stop_link_timer(Adapter);
   1097 
   1098 		mutex_enter(&e1000g_nvm_lock);
   1099 		result = e1000_reset_hw(&Adapter->shared);
   1100 		mutex_exit(&e1000g_nvm_lock);
   1101 
   1102 		if (result != E1000_SUCCESS) {
   1103 			e1000g_fm_ereport(Adapter, DDI_FM_DEVICE_INVAL_STATE);
   1104 			ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_LOST);
   1105 		}
   1106 	}
   1107 
   1108 	e1000g_release_multicast(Adapter);
   1109 
   1110 	if (Adapter->attach_progress & ATTACH_PROGRESS_REGS_MAP) {
   1111 		if (Adapter->osdep.reg_handle != NULL)
   1112 			ddi_regs_map_free(&Adapter->osdep.reg_handle);
   1113 		if (Adapter->osdep.ich_flash_handle != NULL)
   1114 			ddi_regs_map_free(&Adapter->osdep.ich_flash_handle);
   1115 		if (Adapter->osdep.io_reg_handle != NULL)
   1116 			ddi_regs_map_free(&Adapter->osdep.io_reg_handle);
   1117 	}
   1118 
   1119 	if (Adapter->attach_progress & ATTACH_PROGRESS_PCI_CONFIG) {
   1120 		if (Adapter->osdep.cfg_handle != NULL)
   1121 			pci_config_teardown(&Adapter->osdep.cfg_handle);
   1122 	}
   1123 
   1124 	if (Adapter->attach_progress & ATTACH_PROGRESS_LOCKS) {
   1125 		e1000g_destroy_locks(Adapter);
   1126 	}
   1127 
   1128 	if (Adapter->attach_progress & ATTACH_PROGRESS_FMINIT) {
   1129 		e1000g_fm_fini(Adapter);
   1130 	}
   1131 
   1132 	mutex_enter(&e1000g_rx_detach_lock);
   1133 	if (e1000g_force_detach && (Adapter->priv_devi_node != NULL)) {
   1134 		devi_node = Adapter->priv_devi_node;
   1135 		devi_node->flag |= E1000G_PRIV_DEVI_DETACH;
   1136 
   1137 		if (devi_node->pending_rx_count == 0) {
   1138 			e1000g_free_priv_devi_node(devi_node);
   1139 		}
   1140 	}
   1141 	mutex_exit(&e1000g_rx_detach_lock);
   1142 
   1143 	kmem_free((caddr_t)Adapter, sizeof (struct e1000g));
   1144 
   1145 	/*
   1146 	 * Another hotplug spec requirement,
   1147 	 * run ddi_set_driver_private(devinfo, null);
   1148 	 */
   1149 	ddi_set_driver_private(devinfo, NULL);
   1150 }
   1151 
   1152 /*
   1153  * Get the BAR type and rnumber for a given PCI BAR offset
   1154  */
   1155 static int
   1156 e1000g_get_bar_info(dev_info_t *dip, int bar_offset, bar_info_t *bar_info)
   1157 {
   1158 	pci_regspec_t *regs;
   1159 	uint_t regs_length;
   1160 	int type, rnumber, rcount;
   1161 
   1162 	ASSERT((bar_offset >= PCI_CONF_BASE0) &&
   1163 	    (bar_offset <= PCI_CONF_BASE5));
   1164 
   1165 	/*
   1166 	 * Get the DDI "reg" property
   1167 	 */
   1168 	if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip,
   1169 	    DDI_PROP_DONTPASS, "reg", (int **)&regs,
   1170 	    &regs_length) != DDI_PROP_SUCCESS) {
   1171 		return (DDI_FAILURE);
   1172 	}
   1173 
   1174 	rcount = regs_length * sizeof (int) / sizeof (pci_regspec_t);
   1175 	/*
   1176 	 * Check the BAR offset
   1177 	 */
   1178 	for (rnumber = 0; rnumber < rcount; ++rnumber) {
   1179 		if (PCI_REG_REG_G(regs[rnumber].pci_phys_hi) == bar_offset) {
   1180 			type = regs[rnumber].pci_phys_hi & PCI_ADDR_MASK;
   1181 			break;
   1182 		}
   1183 	}
   1184 
   1185 	ddi_prop_free(regs);
   1186 
   1187 	if (rnumber >= rcount)
   1188 		return (DDI_FAILURE);
   1189 
   1190 	switch (type) {
   1191 	case PCI_ADDR_CONFIG:
   1192 		bar_info->type = E1000G_BAR_CONFIG;
   1193 		break;
   1194 	case PCI_ADDR_IO:
   1195 		bar_info->type = E1000G_BAR_IO;
   1196 		break;
   1197 	case PCI_ADDR_MEM32:
   1198 		bar_info->type = E1000G_BAR_MEM32;
   1199 		break;
   1200 	case PCI_ADDR_MEM64:
   1201 		bar_info->type = E1000G_BAR_MEM64;
   1202 		break;
   1203 	default:
   1204 		return (DDI_FAILURE);
   1205 	}
   1206 	bar_info->rnumber = rnumber;
   1207 	return (DDI_SUCCESS);
   1208 }
   1209 
   1210 static void
   1211 e1000g_init_locks(struct e1000g *Adapter)
   1212 {
   1213 	e1000g_tx_ring_t *tx_ring;
   1214 	e1000g_rx_ring_t *rx_ring;
   1215 
   1216 	rw_init(&Adapter->chip_lock, NULL,
   1217 	    RW_DRIVER, DDI_INTR_PRI(Adapter->intr_pri));
   1218 	mutex_init(&Adapter->link_lock, NULL,
   1219 	    MUTEX_DRIVER, DDI_INTR_PRI(Adapter->intr_pri));
   1220 	mutex_init(&Adapter->watchdog_lock, NULL,
   1221 	    MUTEX_DRIVER, DDI_INTR_PRI(Adapter->intr_pri));
   1222 
   1223 	tx_ring = Adapter->tx_ring;
   1224 
   1225 	mutex_init(&tx_ring->tx_lock, NULL,
   1226 	    MUTEX_DRIVER, DDI_INTR_PRI(Adapter->intr_pri));
   1227 	mutex_init(&tx_ring->usedlist_lock, NULL,
   1228 	    MUTEX_DRIVER, DDI_INTR_PRI(Adapter->intr_pri));
   1229 	mutex_init(&tx_ring->freelist_lock, NULL,
   1230 	    MUTEX_DRIVER, DDI_INTR_PRI(Adapter->intr_pri));
   1231 
   1232 	rx_ring = Adapter->rx_ring;
   1233 
   1234 	mutex_init(&rx_ring->rx_lock, NULL,
   1235 	    MUTEX_DRIVER, DDI_INTR_PRI(Adapter->intr_pri));
   1236 }
   1237 
   1238 static void
   1239 e1000g_destroy_locks(struct e1000g *Adapter)
   1240 {
   1241 	e1000g_tx_ring_t *tx_ring;
   1242 	e1000g_rx_ring_t *rx_ring;
   1243 
   1244 	tx_ring = Adapter->tx_ring;
   1245 	mutex_destroy(&tx_ring->tx_lock);
   1246 	mutex_destroy(&tx_ring->usedlist_lock);
   1247 	mutex_destroy(&tx_ring->freelist_lock);
   1248 
   1249 	rx_ring = Adapter->rx_ring;
   1250 	mutex_destroy(&rx_ring->rx_lock);
   1251 
   1252 	mutex_destroy(&Adapter->link_lock);
   1253 	mutex_destroy(&Adapter->watchdog_lock);
   1254 	rw_destroy(&Adapter->chip_lock);
   1255 
   1256 	/* destory mutex initialized in shared code */
   1257 	e1000_destroy_hw_mutex(&Adapter->shared);
   1258 }
   1259 
   1260 static int
   1261 e1000g_resume(dev_info_t *devinfo)
   1262 {
   1263 	struct e1000g *Adapter;
   1264 
   1265 	Adapter = (struct e1000g *)ddi_get_driver_private(devinfo);
   1266 	if (Adapter == NULL)
   1267 		e1000g_log(Adapter, CE_PANIC,
   1268 		    "Instance pointer is null\n");
   1269 
   1270 	if (Adapter->dip != devinfo)
   1271 		e1000g_log(Adapter, CE_PANIC,
   1272 		    "Devinfo is not the same as saved devinfo\n");
   1273 
   1274 	rw_enter(&Adapter->chip_lock, RW_WRITER);
   1275 
   1276 	if (Adapter->e1000g_state & E1000G_STARTED) {
   1277 		if (e1000g_start(Adapter, B_FALSE) != DDI_SUCCESS) {
   1278 			rw_exit(&Adapter->chip_lock);
   1279 			/*
   1280 			 * We note the failure, but return success, as the
   1281 			 * system is still usable without this controller.
   1282 			 */
   1283 			e1000g_log(Adapter, CE_WARN,
   1284 			    "e1000g_resume: failed to restart controller\n");
   1285 			return (DDI_SUCCESS);
   1286 		}
   1287 		/* Enable and start the watchdog timer */
   1288 		enable_watchdog_timer(Adapter);
   1289 	}
   1290 
   1291 	Adapter->e1000g_state &= ~E1000G_SUSPENDED;
   1292 
   1293 	rw_exit(&Adapter->chip_lock);
   1294 
   1295 	return (DDI_SUCCESS);
   1296 }
   1297 
   1298 static int
   1299 e1000g_suspend(dev_info_t *devinfo)
   1300 {
   1301 	struct e1000g *Adapter;
   1302 
   1303 	Adapter = (struct e1000g *)ddi_get_driver_private(devinfo);
   1304 	if (Adapter == NULL)
   1305 		return (DDI_FAILURE);
   1306 
   1307 	rw_enter(&Adapter->chip_lock, RW_WRITER);
   1308 
   1309 	Adapter->e1000g_state |= E1000G_SUSPENDED;
   1310 
   1311 	/* if the port isn't plumbed, we can simply return */
   1312 	if (!(Adapter->e1000g_state & E1000G_STARTED)) {
   1313 		rw_exit(&Adapter->chip_lock);
   1314 		return (DDI_SUCCESS);
   1315 	}
   1316 
   1317 	e1000g_stop(Adapter, B_FALSE);
   1318 
   1319 	rw_exit(&Adapter->chip_lock);
   1320 
   1321 	/* Disable and stop all the timers */
   1322 	disable_watchdog_timer(Adapter);
   1323 	stop_link_timer(Adapter);
   1324 	stop_82547_timer(Adapter->tx_ring);
   1325 
   1326 	return (DDI_SUCCESS);
   1327 }
   1328 
   1329 static int
   1330 e1000g_init(struct e1000g *Adapter)
   1331 {
   1332 	uint32_t pba;
   1333 	uint32_t high_water;
   1334 	struct e1000_hw *hw;
   1335 	clock_t link_timeout;
   1336 	int result;
   1337 
   1338 	hw = &Adapter->shared;
   1339 
   1340 	/*
   1341 	 * reset to put the hardware in a known state
   1342 	 * before we try to do anything with the eeprom
   1343 	 */
   1344 	mutex_enter(&e1000g_nvm_lock);
   1345 	result = e1000_reset_hw(hw);
   1346 	mutex_exit(&e1000g_nvm_lock);
   1347 
   1348 	if (result != E1000_SUCCESS) {
   1349 		e1000g_fm_ereport(Adapter, DDI_FM_DEVICE_INVAL_STATE);
   1350 		goto init_fail;
   1351 	}
   1352 
   1353 	mutex_enter(&e1000g_nvm_lock);
   1354 	result = e1000_validate_nvm_checksum(hw);
   1355 	if (result < E1000_SUCCESS) {
   1356 		/*
   1357 		 * Some PCI-E parts fail the first check due to
   1358 		 * the link being in sleep state.  Call it again,
   1359 		 * if it fails a second time its a real issue.
   1360 		 */
   1361 		result = e1000_validate_nvm_checksum(hw);
   1362 	}
   1363 	mutex_exit(&e1000g_nvm_lock);
   1364 
   1365 	if (result < E1000_SUCCESS) {
   1366 		e1000g_log(Adapter, CE_WARN,
   1367 		    "Invalid NVM checksum. Please contact "
   1368 		    "the vendor to update the NVM.");
   1369 		e1000g_fm_ereport(Adapter, DDI_FM_DEVICE_INVAL_STATE);
   1370 		goto init_fail;
   1371 	}
   1372 
   1373 	result = 0;
   1374 #ifdef __sparc
   1375 	/*
   1376 	 * First, we try to get the local ethernet address from OBP. If
   1377 	 * failed, then we get it from the EEPROM of NIC card.
   1378 	 */
   1379 	result = e1000g_find_mac_address(Adapter);
   1380 #endif
   1381 	/* Get the local ethernet address. */
   1382 	if (!result) {
   1383 		mutex_enter(&e1000g_nvm_lock);
   1384 		result = e1000_read_mac_addr(hw);
   1385 		mutex_exit(&e1000g_nvm_lock);
   1386 	}
   1387 
   1388 	if (result < E1000_SUCCESS) {
   1389 		e1000g_log(Adapter, CE_WARN, "Read mac addr failed");
   1390 		e1000g_fm_ereport(Adapter, DDI_FM_DEVICE_INVAL_STATE);
   1391 		goto init_fail;
   1392 	}
   1393 
   1394 	/* check for valid mac address */
   1395 	if (!is_valid_mac_addr(hw->mac.addr)) {
   1396 		e1000g_log(Adapter, CE_WARN, "Invalid mac addr");
   1397 		e1000g_fm_ereport(Adapter, DDI_FM_DEVICE_INVAL_STATE);
   1398 		goto init_fail;
   1399 	}
   1400 
   1401 	/* Set LAA state for 82571 chipset */
   1402 	e1000_set_laa_state_82571(hw, B_TRUE);
   1403 
   1404 	/* Master Latency Timer implementation */
   1405 	if (Adapter->master_latency_timer) {
   1406 		pci_config_put8(Adapter->osdep.cfg_handle,
   1407 		    PCI_CONF_LATENCY_TIMER, Adapter->master_latency_timer);
   1408 	}
   1409 
   1410 	if (hw->mac.type < e1000_82547) {
   1411 		/*
   1412 		 * Total FIFO is 64K
   1413 		 */
   1414 		if (Adapter->max_frame_size > FRAME_SIZE_UPTO_8K)
   1415 			pba = E1000_PBA_40K;	/* 40K for Rx, 24K for Tx */
   1416 		else
   1417 			pba = E1000_PBA_48K;	/* 48K for Rx, 16K for Tx */
   1418 	} else if ((hw->mac.type == e1000_82571) ||
   1419 	    (hw->mac.type == e1000_82572) ||
   1420 	    (hw->mac.type == e1000_80003es2lan)) {
   1421 		/*
   1422 		 * Total FIFO is 48K
   1423 		 */
   1424 		if (Adapter->max_frame_size > FRAME_SIZE_UPTO_8K)
   1425 			pba = E1000_PBA_30K;	/* 30K for Rx, 18K for Tx */
   1426 		else
   1427 			pba = E1000_PBA_38K;	/* 38K for Rx, 10K for Tx */
   1428 	} else if (hw->mac.type == e1000_82573) {
   1429 		pba = E1000_PBA_20K;		/* 20K for Rx, 12K for Tx */
   1430 	} else if (hw->mac.type == e1000_82574) {
   1431 		/* Keep adapter default: 20K for Rx, 20K for Tx */
   1432 		pba = E1000_READ_REG(hw, E1000_PBA);
   1433 	} else if (hw->mac.type == e1000_ich8lan) {
   1434 		pba = E1000_PBA_8K;		/* 8K for Rx, 12K for Tx */
   1435 	} else if (hw->mac.type == e1000_ich9lan) {
   1436 		pba = E1000_PBA_10K;
   1437 	} else if (hw->mac.type == e1000_ich10lan) {
   1438 		pba = E1000_PBA_10K;
   1439 	} else if (hw->mac.type == e1000_pchlan) {
   1440 		pba = E1000_PBA_26K;
   1441 	} else {
   1442 		/*
   1443 		 * Total FIFO is 40K
   1444 		 */
   1445 		if (Adapter->max_frame_size > FRAME_SIZE_UPTO_8K)
   1446 			pba = E1000_PBA_22K;	/* 22K for Rx, 18K for Tx */
   1447 		else
   1448 			pba = E1000_PBA_30K;	/* 30K for Rx, 10K for Tx */
   1449 	}
   1450 	E1000_WRITE_REG(hw, E1000_PBA, pba);
   1451 
   1452 	/*
   1453 	 * These parameters set thresholds for the adapter's generation(Tx)
   1454 	 * and response(Rx) to Ethernet PAUSE frames.  These are just threshold
   1455 	 * settings.  Flow control is enabled or disabled in the configuration
   1456 	 * file.
   1457 	 * High-water mark is set down from the top of the rx fifo (not
   1458 	 * sensitive to max_frame_size) and low-water is set just below
   1459 	 * high-water mark.
   1460 	 * The high water mark must be low enough to fit one full frame above
   1461 	 * it in the rx FIFO.  Should be the lower of:
   1462 	 * 90% of the Rx FIFO size and the full Rx FIFO size minus the early
   1463 	 * receive size (assuming ERT set to E1000_ERT_2048), or the full
   1464 	 * Rx FIFO size minus one full frame.
   1465 	 */
   1466 	high_water = min(((pba << 10) * 9 / 10),
   1467 	    ((hw->mac.type == e1000_82573 || hw->mac.type == e1000_82574 ||
   1468 	    hw->mac.type == e1000_ich9lan || hw->mac.type == e1000_ich10lan) ?
   1469 	    ((pba << 10) - (E1000_ERT_2048 << 3)) :
   1470 	    ((pba << 10) - Adapter->max_frame_size)));
   1471 
   1472 	hw->fc.high_water = high_water & 0xFFF8;
   1473 	hw->fc.low_water = hw->fc.high_water - 8;
   1474 
   1475 	if (hw->mac.type == e1000_80003es2lan)
   1476 		hw->fc.pause_time = 0xFFFF;
   1477 	else
   1478 		hw->fc.pause_time = E1000_FC_PAUSE_TIME;
   1479 	hw->fc.send_xon = B_TRUE;
   1480 
   1481 	/*
   1482 	 * Reset the adapter hardware the second time.
   1483 	 */
   1484 	mutex_enter(&e1000g_nvm_lock);
   1485 	result = e1000_reset_hw(hw);
   1486 	mutex_exit(&e1000g_nvm_lock);
   1487 
   1488 	if (result != E1000_SUCCESS) {
   1489 		e1000g_fm_ereport(Adapter, DDI_FM_DEVICE_INVAL_STATE);
   1490 		goto init_fail;
   1491 	}
   1492 
   1493 	/* disable wakeup control by default */
   1494 	if (hw->mac.type >= e1000_82544)
   1495 		E1000_WRITE_REG(hw, E1000_WUC, 0);
   1496 
   1497 	/*
   1498 	 * MWI should be disabled on 82546.
   1499 	 */
   1500 	if (hw->mac.type == e1000_82546)
   1501 		e1000_pci_clear_mwi(hw);
   1502 	else
   1503 		e1000_pci_set_mwi(hw);
   1504 
   1505 	/*
   1506 	 * Configure/Initialize hardware
   1507 	 */
   1508 	mutex_enter(&e1000g_nvm_lock);
   1509 	result = e1000_init_hw(hw);
   1510 	mutex_exit(&e1000g_nvm_lock);
   1511 
   1512 	if (result < E1000_SUCCESS) {
   1513 		e1000g_log(Adapter, CE_WARN, "Initialize hw failed");
   1514 		e1000g_fm_ereport(Adapter, DDI_FM_DEVICE_INVAL_STATE);
   1515 		goto init_fail;
   1516 	}
   1517 
   1518 	/*
   1519 	 * Restore LED settings to the default from EEPROM
   1520 	 * to meet the standard for Sun platforms.
   1521 	 */
   1522 	(void) e1000_cleanup_led(hw);
   1523 
   1524 	/* Disable Smart Power Down */
   1525 	phy_spd_state(hw, B_FALSE);
   1526 
   1527 	/* Make sure driver has control */
   1528 	e1000g_get_driver_control(hw);
   1529 
   1530 	/*
   1531 	 * Initialize unicast addresses.
   1532 	 */
   1533 	e1000g_init_unicst(Adapter);
   1534 
   1535 	/*
   1536 	 * Setup and initialize the mctable structures.  After this routine
   1537 	 * completes  Multicast table will be set
   1538 	 */
   1539 	e1000_update_mc_addr_list(hw,
   1540 	    (uint8_t *)Adapter->mcast_table, Adapter->mcast_count);
   1541 	msec_delay(5);
   1542 
   1543 	/*
   1544 	 * Implement Adaptive IFS
   1545 	 */
   1546 	e1000_reset_adaptive(hw);
   1547 
   1548 	/* Setup Interrupt Throttling Register */
   1549 	if (hw->mac.type >= e1000_82540) {
   1550 		E1000_WRITE_REG(hw, E1000_ITR, Adapter->intr_throttling_rate);
   1551 	} else
   1552 		Adapter->intr_adaptive = B_FALSE;
   1553 
   1554 	/* Start the timer for link setup */
   1555 	if (hw->mac.autoneg)
   1556 		link_timeout = PHY_AUTO_NEG_LIMIT * drv_usectohz(100000);
   1557 	else
   1558 		link_timeout = PHY_FORCE_LIMIT * drv_usectohz(100000);
   1559 
   1560 	mutex_enter(&Adapter->link_lock);
   1561 	if (hw->phy.autoneg_wait_to_complete) {
   1562 		Adapter->link_complete = B_TRUE;
   1563 	} else {
   1564 		Adapter->link_complete = B_FALSE;
   1565 		Adapter->link_tid = timeout(e1000g_link_timer,
   1566 		    (void *)Adapter, link_timeout);
   1567 	}
   1568 	mutex_exit(&Adapter->link_lock);
   1569 
   1570 	/* Save the state of the phy */
   1571 	e1000g_get_phy_state(Adapter);
   1572 
   1573 	e1000g_param_sync(Adapter);
   1574 
   1575 	Adapter->init_count++;
   1576 
   1577 	if (e1000g_check_acc_handle(Adapter->osdep.cfg_handle) != DDI_FM_OK) {
   1578 		goto init_fail;
   1579 	}
   1580 	if (e1000g_check_acc_handle(Adapter->osdep.reg_handle) != DDI_FM_OK) {
   1581 		goto init_fail;
   1582 	}
   1583 
   1584 	Adapter->poll_mode = e1000g_poll_mode;
   1585 
   1586 	return (DDI_SUCCESS);
   1587 
   1588 init_fail:
   1589 	ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_LOST);
   1590 	return (DDI_FAILURE);
   1591 }
   1592 
   1593 static int
   1594 e1000g_alloc_rx_data(struct e1000g *Adapter)
   1595 {
   1596 	e1000g_rx_ring_t *rx_ring;
   1597 	e1000g_rx_data_t *rx_data;
   1598 
   1599 	rx_ring = Adapter->rx_ring;
   1600 
   1601 	rx_data = kmem_zalloc(sizeof (e1000g_rx_data_t), KM_NOSLEEP);
   1602 
   1603 	if (rx_data == NULL)
   1604 		return (DDI_FAILURE);
   1605 
   1606 	rx_data->priv_devi_node = Adapter->priv_devi_node;
   1607 	rx_data->rx_ring = rx_ring;
   1608 
   1609 	mutex_init(&rx_data->freelist_lock, NULL,
   1610 	    MUTEX_DRIVER, DDI_INTR_PRI(Adapter->intr_pri));
   1611 	mutex_init(&rx_data->recycle_lock, NULL,
   1612 	    MUTEX_DRIVER, DDI_INTR_PRI(Adapter->intr_pri));
   1613 
   1614 	rx_ring->rx_data = rx_data;
   1615 
   1616 	return (DDI_SUCCESS);
   1617 }
   1618 
   1619 void
   1620 e1000g_free_rx_pending_buffers(e1000g_rx_data_t *rx_data)
   1621 {
   1622 	rx_sw_packet_t *packet, *next_packet;
   1623 
   1624 	if (rx_data == NULL)
   1625 		return;
   1626 
   1627 	packet = rx_data->packet_area;
   1628 	while (packet != NULL) {
   1629 		next_packet = packet->next;
   1630 		e1000g_free_rx_sw_packet(packet, B_TRUE);
   1631 		packet = next_packet;
   1632 	}
   1633 	rx_data->packet_area = NULL;
   1634 }
   1635 
   1636 void
   1637 e1000g_free_rx_data(e1000g_rx_data_t *rx_data)
   1638 {
   1639 	if (rx_data == NULL)
   1640 		return;
   1641 
   1642 	mutex_destroy(&rx_data->freelist_lock);
   1643 	mutex_destroy(&rx_data->recycle_lock);
   1644 
   1645 	kmem_free(rx_data, sizeof (e1000g_rx_data_t));
   1646 }
   1647 
   1648 /*
   1649  * Check if the link is up
   1650  */
   1651 static boolean_t
   1652 e1000g_link_up(struct e1000g *Adapter)
   1653 {
   1654 	struct e1000_hw *hw = &Adapter->shared;
   1655 	boolean_t link_up = B_FALSE;
   1656 
   1657 	/*
   1658 	 * get_link_status is set in the interrupt handler on link-status-change
   1659 	 * or rx sequence error interrupt.  get_link_status will stay
   1660 	 * false until the e1000_check_for_link establishes link only
   1661 	 * for copper adapters.
   1662 	 */
   1663 	switch (hw->phy.media_type) {
   1664 	case e1000_media_type_copper:
   1665 		if (hw->mac.get_link_status) {
   1666 			(void) e1000_check_for_link(hw);
   1667 			link_up = !hw->mac.get_link_status;
   1668 		} else {
   1669 			link_up = B_TRUE;
   1670 		}
   1671 		break;
   1672 	case e1000_media_type_fiber:
   1673 		(void) e1000_check_for_link(hw);
   1674 		link_up = (E1000_READ_REG(hw, E1000_STATUS) &
   1675 		    E1000_STATUS_LU);
   1676 		break;
   1677 	case e1000_media_type_internal_serdes:
   1678 		(void) e1000_check_for_link(hw);
   1679 		link_up = hw->mac.serdes_has_link;
   1680 		break;
   1681 	}
   1682 
   1683 	return (link_up);
   1684 }
   1685 
   1686 static void
   1687 e1000g_m_ioctl(void *arg, queue_t *q, mblk_t *mp)
   1688 {
   1689 	struct iocblk *iocp;
   1690 	struct e1000g *e1000gp;
   1691 	enum ioc_reply status;
   1692 
   1693 	iocp = (struct iocblk *)(uintptr_t)mp->b_rptr;
   1694 	iocp->ioc_error = 0;
   1695 	e1000gp = (struct e1000g *)arg;
   1696 
   1697 	ASSERT(e1000gp);
   1698 	if (e1000gp == NULL) {
   1699 		miocnak(q, mp, 0, EINVAL);
   1700 		return;
   1701 	}
   1702 
   1703 	rw_enter(&e1000gp->chip_lock, RW_READER);
   1704 	if (e1000gp->e1000g_state & E1000G_SUSPENDED) {
   1705 		rw_exit(&e1000gp->chip_lock);
   1706 		miocnak(q, mp, 0, EINVAL);
   1707 		return;
   1708 	}
   1709 	rw_exit(&e1000gp->chip_lock);
   1710 
   1711 	switch (iocp->ioc_cmd) {
   1712 
   1713 	case LB_GET_INFO_SIZE:
   1714 	case LB_GET_INFO:
   1715 	case LB_GET_MODE:
   1716 	case LB_SET_MODE:
   1717 		status = e1000g_loopback_ioctl(e1000gp, iocp, mp);
   1718 		break;
   1719 
   1720 
   1721 #ifdef E1000G_DEBUG
   1722 	case E1000G_IOC_REG_PEEK:
   1723 	case E1000G_IOC_REG_POKE:
   1724 		status = e1000g_pp_ioctl(e1000gp, iocp, mp);
   1725 		break;
   1726 	case E1000G_IOC_CHIP_RESET:
   1727 		e1000gp->reset_count++;
   1728 		if (e1000g_reset_adapter(e1000gp))
   1729 			status = IOC_ACK;
   1730 		else
   1731 			status = IOC_INVAL;
   1732 		break;
   1733 #endif
   1734 	default:
   1735 		status = IOC_INVAL;
   1736 		break;
   1737 	}
   1738 
   1739 	/*
   1740 	 * Decide how to reply
   1741 	 */
   1742 	switch (status) {
   1743 	default:
   1744 	case IOC_INVAL:
   1745 		/*
   1746 		 * Error, reply with a NAK and EINVAL or the specified error
   1747 		 */
   1748 		miocnak(q, mp, 0, iocp->ioc_error == 0 ?
   1749 		    EINVAL : iocp->ioc_error);
   1750 		break;
   1751 
   1752 	case IOC_DONE:
   1753 		/*
   1754 		 * OK, reply already sent
   1755 		 */
   1756 		break;
   1757 
   1758 	case IOC_ACK:
   1759 		/*
   1760 		 * OK, reply with an ACK
   1761 		 */
   1762 		miocack(q, mp, 0, 0);
   1763 		break;
   1764 
   1765 	case IOC_REPLY:
   1766 		/*
   1767 		 * OK, send prepared reply as ACK or NAK
   1768 		 */
   1769 		mp->b_datap->db_type = iocp->ioc_error == 0 ?
   1770 		    M_IOCACK : M_IOCNAK;
   1771 		qreply(q, mp);
   1772 		break;
   1773 	}
   1774 }
   1775 
   1776 /*
   1777  * The default value of e1000g_poll_mode == 0 assumes that the NIC is
   1778  * capable of supporting only one interrupt and we shouldn't disable
   1779  * the physical interrupt. In this case we let the interrupt come and
   1780  * we queue the packets in the rx ring itself in case we are in polling
   1781  * mode (better latency but slightly lower performance and a very
   1782  * high intrrupt count in mpstat which is harmless).
   1783  *
   1784  * e1000g_poll_mode == 1 assumes that we have per Rx ring interrupt
   1785  * which can be disabled in poll mode. This gives better overall
   1786  * throughput (compared to the mode above), shows very low interrupt
   1787  * count but has slightly higher latency since we pick the packets when
   1788  * the poll thread does polling.
   1789  *
   1790  * Currently, this flag should be enabled only while doing performance
   1791  * measurement or when it can be guaranteed that entire NIC going
   1792  * in poll mode will not harm any traffic like cluster heartbeat etc.
   1793  */
   1794 int e1000g_poll_mode = 0;
   1795 
   1796 /*
   1797  * Called from the upper layers when driver is in polling mode to
   1798  * pick up any queued packets. Care should be taken to not block
   1799  * this thread.
   1800  */
   1801 static mblk_t *e1000g_poll_ring(void *arg, int bytes_to_pickup)
   1802 {
   1803 	e1000g_rx_ring_t	*rx_ring = (e1000g_rx_ring_t *)arg;
   1804 	mblk_t			*mp = NULL;
   1805 	mblk_t			*tail;
   1806 	struct e1000g 		*adapter;
   1807 
   1808 	adapter = rx_ring->adapter;
   1809 
   1810 	rw_enter(&adapter->chip_lock, RW_READER);
   1811 
   1812 	if (adapter->e1000g_state & E1000G_SUSPENDED) {
   1813 		rw_exit(&adapter->chip_lock);
   1814 		return (NULL);
   1815 	}
   1816 
   1817 	mutex_enter(&rx_ring->rx_lock);
   1818 	mp = e1000g_receive(rx_ring, &tail, bytes_to_pickup);
   1819 	mutex_exit(&rx_ring->rx_lock);
   1820 	rw_exit(&adapter->chip_lock);
   1821 	return (mp);
   1822 }
   1823 
   1824 static int
   1825 e1000g_m_start(void *arg)
   1826 {
   1827 	struct e1000g *Adapter = (struct e1000g *)arg;
   1828 
   1829 	rw_enter(&Adapter->chip_lock, RW_WRITER);
   1830 
   1831 	if (Adapter->e1000g_state & E1000G_SUSPENDED) {
   1832 		rw_exit(&Adapter->chip_lock);
   1833 		return (ECANCELED);
   1834 	}
   1835 
   1836 	if (e1000g_start(Adapter, B_TRUE) != DDI_SUCCESS) {
   1837 		rw_exit(&Adapter->chip_lock);
   1838 		return (ENOTACTIVE);
   1839 	}
   1840 
   1841 	Adapter->e1000g_state |= E1000G_STARTED;
   1842 
   1843 	rw_exit(&Adapter->chip_lock);
   1844 
   1845 	/* Enable and start the watchdog timer */
   1846 	enable_watchdog_timer(Adapter);
   1847 
   1848 	return (0);
   1849 }
   1850 
   1851 static int
   1852 e1000g_start(struct e1000g *Adapter, boolean_t global)
   1853 {
   1854 	e1000g_rx_data_t *rx_data;
   1855 
   1856 	if (global) {
   1857 		if (e1000g_alloc_rx_data(Adapter) != DDI_SUCCESS) {
   1858 			e1000g_log(Adapter, CE_WARN, "Allocate rx data failed");
   1859 			goto start_fail;
   1860 		}
   1861 
   1862 		/* Allocate dma resources for descriptors and buffers */
   1863 		if (e1000g_alloc_dma_resources(Adapter) != DDI_SUCCESS) {
   1864 			e1000g_log(Adapter, CE_WARN,
   1865 			    "Alloc DMA resources failed");
   1866 			goto start_fail;
   1867 		}
   1868 		Adapter->rx_buffer_setup = B_FALSE;
   1869 	}
   1870 
   1871 	if (!(Adapter->attach_progress & ATTACH_PROGRESS_INIT)) {
   1872 		if (e1000g_init(Adapter) != DDI_SUCCESS) {
   1873 			e1000g_log(Adapter, CE_WARN,
   1874 			    "Adapter initialization failed");
   1875 			goto start_fail;
   1876 		}
   1877 	}
   1878 
   1879 	/* Setup and initialize the transmit structures */
   1880 	e1000g_tx_setup(Adapter);
   1881 	msec_delay(5);
   1882 
   1883 	/* Setup and initialize the receive structures */
   1884 	e1000g_rx_setup(Adapter);
   1885 	msec_delay(5);
   1886 
   1887 	/* Restore the e1000g promiscuous mode */
   1888 	e1000g_restore_promisc(Adapter);
   1889 
   1890 	e1000g_mask_interrupt(Adapter);
   1891 
   1892 	Adapter->attach_progress |= ATTACH_PROGRESS_INIT;
   1893 
   1894 	if (e1000g_check_acc_handle(Adapter->osdep.reg_handle) != DDI_FM_OK) {
   1895 		ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_LOST);
   1896 		goto start_fail;
   1897 	}
   1898 
   1899 	return (DDI_SUCCESS);
   1900 
   1901 start_fail:
   1902 	rx_data = Adapter->rx_ring->rx_data;
   1903 
   1904 	if (global) {
   1905 		e1000g_release_dma_resources(Adapter);
   1906 		e1000g_free_rx_pending_buffers(rx_data);
   1907 		e1000g_free_rx_data(rx_data);
   1908 	}
   1909 
   1910 	mutex_enter(&e1000g_nvm_lock);
   1911 	(void) e1000_reset_hw(&Adapter->shared);
   1912 	mutex_exit(&e1000g_nvm_lock);
   1913 
   1914 	return (DDI_FAILURE);
   1915 }
   1916 
   1917 static void
   1918 e1000g_m_stop(void *arg)
   1919 {
   1920 	struct e1000g *Adapter = (struct e1000g *)arg;
   1921 
   1922 	/* Drain tx sessions */
   1923 	(void) e1000g_tx_drain(Adapter);
   1924 
   1925 	rw_enter(&Adapter->chip_lock, RW_WRITER);
   1926 
   1927 	if (Adapter->e1000g_state & E1000G_SUSPENDED) {
   1928 		rw_exit(&Adapter->chip_lock);
   1929 		return;
   1930 	}
   1931 	Adapter->e1000g_state &= ~E1000G_STARTED;
   1932 	e1000g_stop(Adapter, B_TRUE);
   1933 
   1934 	rw_exit(&Adapter->chip_lock);
   1935 
   1936 	/* Disable and stop all the timers */
   1937 	disable_watchdog_timer(Adapter);
   1938 	stop_link_timer(Adapter);
   1939 	stop_82547_timer(Adapter->tx_ring);
   1940 }
   1941 
   1942 static void
   1943 e1000g_stop(struct e1000g *Adapter, boolean_t global)
   1944 {
   1945 	private_devi_list_t *devi_node;
   1946 	e1000g_rx_data_t *rx_data;
   1947 	int result;
   1948 
   1949 	Adapter->attach_progress &= ~ATTACH_PROGRESS_INIT;
   1950 
   1951 	/* Stop the chip and release pending resources */
   1952 
   1953 	/* Tell firmware driver is no longer in control */
   1954 	e1000g_release_driver_control(&Adapter->shared);
   1955 
   1956 	e1000g_clear_all_interrupts(Adapter);
   1957 
   1958 	mutex_enter(&e1000g_nvm_lock);
   1959 	result = e1000_reset_hw(&Adapter->shared);
   1960 	mutex_exit(&e1000g_nvm_lock);
   1961 
   1962 	if (result != E1000_SUCCESS) {
   1963 		e1000g_fm_ereport(Adapter, DDI_FM_DEVICE_INVAL_STATE);
   1964 		ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_LOST);
   1965 	}
   1966 
   1967 	/* Release resources still held by the TX descriptors */
   1968 	e1000g_tx_clean(Adapter);
   1969 
   1970 	if (e1000g_check_acc_handle(Adapter->osdep.reg_handle) != DDI_FM_OK)
   1971 		ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_LOST);
   1972 
   1973 	/* Clean the pending rx jumbo packet fragment */
   1974 	e1000g_rx_clean(Adapter);
   1975 
   1976 	if (global) {
   1977 		e1000g_release_dma_resources(Adapter);
   1978 
   1979 		mutex_enter(&e1000g_rx_detach_lock);
   1980 		rx_data = Adapter->rx_ring->rx_data;
   1981 		rx_data->flag |= E1000G_RX_STOPPED;
   1982 
   1983 		if (rx_data->pending_count == 0) {
   1984 			e1000g_free_rx_pending_buffers(rx_data);
   1985 			e1000g_free_rx_data(rx_data);
   1986 		} else {
   1987 			devi_node = rx_data->priv_devi_node;
   1988 			if (devi_node != NULL)
   1989 				atomic_inc_32(&devi_node->pending_rx_count);
   1990 			else
   1991 				atomic_inc_32(&Adapter->pending_rx_count);
   1992 		}
   1993 		mutex_exit(&e1000g_rx_detach_lock);
   1994 	}
   1995 
   1996 	if (Adapter->link_state == LINK_STATE_UP) {
   1997 		Adapter->link_state = LINK_STATE_UNKNOWN;
   1998 		if (!Adapter->reset_flag)
   1999 			mac_link_update(Adapter->mh, Adapter->link_state);
   2000 	}
   2001 }
   2002 
   2003 static void
   2004 e1000g_rx_clean(struct e1000g *Adapter)
   2005 {
   2006 	e1000g_rx_data_t *rx_data = Adapter->rx_ring->rx_data;
   2007 
   2008 	if (rx_data == NULL)
   2009 		return;
   2010 
   2011 	if (rx_data->rx_mblk != NULL) {
   2012 		freemsg(rx_data->rx_mblk);
   2013 		rx_data->rx_mblk = NULL;
   2014 		rx_data->rx_mblk_tail = NULL;
   2015 		rx_data->rx_mblk_len = 0;
   2016 	}
   2017 }
   2018 
   2019 static void
   2020 e1000g_tx_clean(struct e1000g *Adapter)
   2021 {
   2022 	e1000g_tx_ring_t *tx_ring;
   2023 	p_tx_sw_packet_t packet;
   2024 	mblk_t *mp;
   2025 	mblk_t *nmp;
   2026 	uint32_t packet_count;
   2027 
   2028 	tx_ring = Adapter->tx_ring;
   2029 
   2030 	/*
   2031 	 * Here we don't need to protect the lists using
   2032 	 * the usedlist_lock and freelist_lock, for they
   2033 	 * have been protected by the chip_lock.
   2034 	 */
   2035 	mp = NULL;
   2036 	nmp = NULL;
   2037 	packet_count = 0;
   2038 	packet = (p_tx_sw_packet_t)QUEUE_GET_HEAD(&tx_ring->used_list);
   2039 	while (packet != NULL) {
   2040 		if (packet->mp != NULL) {
   2041 			/* Assemble the message chain */
   2042 			if (mp == NULL) {
   2043 				mp = packet->mp;
   2044 				nmp = packet->mp;
   2045 			} else {
   2046 				nmp->b_next = packet->mp;
   2047 				nmp = packet->mp;
   2048 			}
   2049 			/* Disconnect the message from the sw packet */
   2050 			packet->mp = NULL;
   2051 		}
   2052 
   2053 		e1000g_free_tx_swpkt(packet);
   2054 		packet_count++;
   2055 
   2056 		packet = (p_tx_sw_packet_t)
   2057 		    QUEUE_GET_NEXT(&tx_ring->used_list, &packet->Link);
   2058 	}
   2059 
   2060 	if (mp != NULL)
   2061 		freemsgchain(mp);
   2062 
   2063 	if (packet_count > 0) {
   2064 		QUEUE_APPEND(&tx_ring->free_list, &tx_ring->used_list);
   2065 		QUEUE_INIT_LIST(&tx_ring->used_list);
   2066 
   2067 		/* Setup TX descriptor pointers */
   2068 		tx_ring->tbd_next = tx_ring->tbd_first;
   2069 		tx_ring->tbd_oldest = tx_ring->tbd_first;
   2070 
   2071 		/* Setup our HW Tx Head & Tail descriptor pointers */
   2072 		E1000_WRITE_REG(&Adapter->shared, E1000_TDH(0), 0);
   2073 		E1000_WRITE_REG(&Adapter->shared, E1000_TDT(0), 0);
   2074 	}
   2075 }
   2076 
   2077 static boolean_t
   2078 e1000g_tx_drain(struct e1000g *Adapter)
   2079 {
   2080 	int i;
   2081 	boolean_t done;
   2082 	e1000g_tx_ring_t *tx_ring;
   2083 
   2084 	tx_ring = Adapter->tx_ring;
   2085 
   2086 	/* Allow up to 'wsdraintime' for pending xmit's to complete. */
   2087 	for (i = 0; i < TX_DRAIN_TIME; i++) {
   2088 		mutex_enter(&tx_ring->usedlist_lock);
   2089 		done = IS_QUEUE_EMPTY(&tx_ring->used_list);
   2090 		mutex_exit(&tx_ring->usedlist_lock);
   2091 
   2092 		if (done)
   2093 			break;
   2094 
   2095 		msec_delay(1);
   2096 	}
   2097 
   2098 	return (done);
   2099 }
   2100 
   2101 static boolean_t
   2102 e1000g_rx_drain(struct e1000g *Adapter)
   2103 {
   2104 	int i;
   2105 	boolean_t done;
   2106 
   2107 	/*
   2108 	 * Allow up to RX_DRAIN_TIME for pending received packets to complete.
   2109 	 */
   2110 	for (i = 0; i < RX_DRAIN_TIME; i++) {
   2111 		done = (Adapter->pending_rx_count == 0);
   2112 
   2113 		if (done)
   2114 			break;
   2115 
   2116 		msec_delay(1);
   2117 	}
   2118 
   2119 	return (done);
   2120 }
   2121 
   2122 static boolean_t
   2123 e1000g_reset_adapter(struct e1000g *Adapter)
   2124 {
   2125 	/* Disable and stop all the timers */
   2126 	disable_watchdog_timer(Adapter);
   2127 	stop_link_timer(Adapter);
   2128 	stop_82547_timer(Adapter->tx_ring);
   2129 
   2130 	rw_enter(&Adapter->chip_lock, RW_WRITER);
   2131 
   2132 	if (Adapter->stall_flag) {
   2133 		Adapter->stall_flag = B_FALSE;
   2134 		Adapter->reset_flag = B_TRUE;
   2135 	}
   2136 
   2137 	if (!(Adapter->e1000g_state & E1000G_STARTED)) {
   2138 		rw_exit(&Adapter->chip_lock);
   2139 		return (B_TRUE);
   2140 	}
   2141 
   2142 	e1000g_stop(Adapter, B_FALSE);
   2143 
   2144 	if (e1000g_start(Adapter, B_FALSE) != DDI_SUCCESS) {
   2145 		rw_exit(&Adapter->chip_lock);
   2146 		e1000g_log(Adapter, CE_WARN, "Reset failed");
   2147 			return (B_FALSE);
   2148 	}
   2149 
   2150 	rw_exit(&Adapter->chip_lock);
   2151 
   2152 	/* Enable and start the watchdog timer */
   2153 	enable_watchdog_timer(Adapter);
   2154 
   2155 	return (B_TRUE);
   2156 }
   2157 
   2158 boolean_t
   2159 e1000g_global_reset(struct e1000g *Adapter)
   2160 {
   2161 	/* Disable and stop all the timers */
   2162 	disable_watchdog_timer(Adapter);
   2163 	stop_link_timer(Adapter);
   2164 	stop_82547_timer(Adapter->tx_ring);
   2165 
   2166 	rw_enter(&Adapter->chip_lock, RW_WRITER);
   2167 
   2168 	e1000g_stop(Adapter, B_TRUE);
   2169 
   2170 	Adapter->init_count = 0;
   2171 
   2172 	if (e1000g_start(Adapter, B_TRUE) != DDI_SUCCESS) {
   2173 		rw_exit(&Adapter->chip_lock);
   2174 		e1000g_log(Adapter, CE_WARN, "Reset failed");
   2175 		return (B_FALSE);
   2176 	}
   2177 
   2178 	rw_exit(&Adapter->chip_lock);
   2179 
   2180 	/* Enable and start the watchdog timer */
   2181 	enable_watchdog_timer(Adapter);
   2182 
   2183 	return (B_TRUE);
   2184 }
   2185 
   2186 /*
   2187  * e1000g_intr_pciexpress - ISR for PCI Express chipsets
   2188  *
   2189  * This interrupt service routine is for PCI-Express adapters.
   2190  * The ICR contents is valid only when the E1000_ICR_INT_ASSERTED
   2191  * bit is set.
   2192  */
   2193 static uint_t
   2194 e1000g_intr_pciexpress(caddr_t arg)
   2195 {
   2196 	struct e1000g *Adapter;
   2197 	uint32_t icr;
   2198 
   2199 	Adapter = (struct e1000g *)(uintptr_t)arg;
   2200 	icr = E1000_READ_REG(&Adapter->shared, E1000_ICR);
   2201 
   2202 	if (e1000g_check_acc_handle(Adapter->osdep.reg_handle) != DDI_FM_OK) {
   2203 		ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_DEGRADED);
   2204 		return (DDI_INTR_CLAIMED);
   2205 	}
   2206 
   2207 	if (icr & E1000_ICR_INT_ASSERTED) {
   2208 		/*
   2209 		 * E1000_ICR_INT_ASSERTED bit was set:
   2210 		 * Read(Clear) the ICR, claim this interrupt,
   2211 		 * look for work to do.
   2212 		 */
   2213 		e1000g_intr_work(Adapter, icr);
   2214 		return (DDI_INTR_CLAIMED);
   2215 	} else {
   2216 		/*
   2217 		 * E1000_ICR_INT_ASSERTED bit was not set:
   2218 		 * Don't claim this interrupt, return immediately.
   2219 		 */
   2220 		return (DDI_INTR_UNCLAIMED);
   2221 	}
   2222 }
   2223 
   2224 /*
   2225  * e1000g_intr - ISR for PCI/PCI-X chipsets
   2226  *
   2227  * This interrupt service routine is for PCI/PCI-X adapters.
   2228  * We check the ICR contents no matter the E1000_ICR_INT_ASSERTED
   2229  * bit is set or not.
   2230  */
   2231 static uint_t
   2232 e1000g_intr(caddr_t arg)
   2233 {
   2234 	struct e1000g *Adapter;
   2235 	uint32_t icr;
   2236 
   2237 	Adapter = (struct e1000g *)(uintptr_t)arg;
   2238 	icr = E1000_READ_REG(&Adapter->shared, E1000_ICR);
   2239 
   2240 	if (e1000g_check_acc_handle(Adapter->osdep.reg_handle) != DDI_FM_OK) {
   2241 		ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_DEGRADED);
   2242 		return (DDI_INTR_CLAIMED);
   2243 	}
   2244 
   2245 	if (icr) {
   2246 		/*
   2247 		 * Any bit was set in ICR:
   2248 		 * Read(Clear) the ICR, claim this interrupt,
   2249 		 * look for work to do.
   2250 		 */
   2251 		e1000g_intr_work(Adapter, icr);
   2252 		return (DDI_INTR_CLAIMED);
   2253 	} else {
   2254 		/*
   2255 		 * No bit was set in ICR:
   2256 		 * Don't claim this interrupt, return immediately.
   2257 		 */
   2258 		return (DDI_INTR_UNCLAIMED);
   2259 	}
   2260 }
   2261 
   2262 /*
   2263  * e1000g_intr_work - actual processing of ISR
   2264  *
   2265  * Read(clear) the ICR contents and call appropriate interrupt
   2266  * processing routines.
   2267  */
   2268 static void
   2269 e1000g_intr_work(struct e1000g *Adapter, uint32_t icr)
   2270 {
   2271 	struct e1000_hw *hw;
   2272 	hw = &Adapter->shared;
   2273 	e1000g_tx_ring_t *tx_ring = Adapter->tx_ring;
   2274 
   2275 	Adapter->rx_pkt_cnt = 0;
   2276 	Adapter->tx_pkt_cnt = 0;
   2277 
   2278 	rw_enter(&Adapter->chip_lock, RW_READER);
   2279 
   2280 	if (Adapter->e1000g_state & E1000G_SUSPENDED) {
   2281 		rw_exit(&Adapter->chip_lock);
   2282 		return;
   2283 	}
   2284 	/*
   2285 	 * Here we need to check the "e1000g_state" flag within the chip_lock to
   2286 	 * ensure the receive routine will not execute when the adapter is
   2287 	 * being reset.
   2288 	 */
   2289 	if (!(Adapter->e1000g_state & E1000G_STARTED)) {
   2290 		rw_exit(&Adapter->chip_lock);
   2291 		return;
   2292 	}
   2293 
   2294 	if (icr & E1000_ICR_RXT0) {
   2295 		mblk_t			*mp = NULL;
   2296 		mblk_t			*tail = NULL;
   2297 		e1000g_rx_ring_t	*rx_ring;
   2298 
   2299 		rx_ring = Adapter->rx_ring;
   2300 		mutex_enter(&rx_ring->rx_lock);
   2301 		/*
   2302 		 * Sometimes with legacy interrupts, it possible that
   2303 		 * there is a single interrupt for Rx/Tx. In which
   2304 		 * case, if poll flag is set, we shouldn't really
   2305 		 * be doing Rx processing.
   2306 		 */
   2307 		if (!rx_ring->poll_flag)
   2308 			mp = e1000g_receive(rx_ring, &tail,
   2309 			    E1000G_CHAIN_NO_LIMIT);
   2310 		mutex_exit(&rx_ring->rx_lock);
   2311 		rw_exit(&Adapter->chip_lock);
   2312 		if (mp != NULL)
   2313 			mac_rx_ring(Adapter->mh, rx_ring->mrh,
   2314 			    mp, rx_ring->ring_gen_num);
   2315 	} else
   2316 		rw_exit(&Adapter->chip_lock);
   2317 
   2318 	if (icr & E1000_ICR_TXDW) {
   2319 		if (!Adapter->tx_intr_enable)
   2320 			e1000g_clear_tx_interrupt(Adapter);
   2321 
   2322 		/* Recycle the tx descriptors */
   2323 		rw_enter(&Adapter->chip_lock, RW_READER);
   2324 		(void) e1000g_recycle(tx_ring);
   2325 		E1000G_DEBUG_STAT(tx_ring->stat_recycle_intr);
   2326 		rw_exit(&Adapter->chip_lock);
   2327 
   2328 		if (tx_ring->resched_needed &&
   2329 		    (tx_ring->tbd_avail > DEFAULT_TX_UPDATE_THRESHOLD)) {
   2330 			tx_ring->resched_needed = B_FALSE;
   2331 			mac_tx_update(Adapter->mh);
   2332 			E1000G_STAT(tx_ring->stat_reschedule);
   2333 		}
   2334 	}
   2335 
   2336 	/*
   2337 	 * The Receive Sequence errors RXSEQ and the link status change LSC
   2338 	 * are checked to detect that the cable has been pulled out. For
   2339 	 * the Wiseman 2.0 silicon, the receive sequence errors interrupt
   2340 	 * are an indication that cable is not connected.
   2341 	 */
   2342 	if ((icr & E1000_ICR_RXSEQ) ||
   2343 	    (icr & E1000_ICR_LSC) ||
   2344 	    (icr & E1000_ICR_GPI_EN1)) {
   2345 		boolean_t link_changed;
   2346 		timeout_id_t tid = 0;
   2347 
   2348 		stop_watchdog_timer(Adapter);
   2349 
   2350 		rw_enter(&Adapter->chip_lock, RW_WRITER);
   2351 
   2352 		/*
   2353 		 * Because we got a link-status-change interrupt, force
   2354 		 * e1000_check_for_link() to look at phy
   2355 		 */
   2356 		Adapter->shared.mac.get_link_status = B_TRUE;
   2357 
   2358 		/* e1000g_link_check takes care of link status change */
   2359 		link_changed = e1000g_link_check(Adapter);
   2360 
   2361 		/* Get new phy state */
   2362 		e1000g_get_phy_state(Adapter);
   2363 
   2364 		/*
   2365 		 * If the link timer has not timed out, we'll not notify
   2366 		 * the upper layer with any link state until the link is up.
   2367 		 */
   2368 		if (link_changed && !Adapter->link_complete) {
   2369 			if (Adapter->link_state == LINK_STATE_UP) {
   2370 				mutex_enter(&Adapter->link_lock);
   2371 				Adapter->link_complete = B_TRUE;
   2372 				tid = Adapter->link_tid;
   2373 				Adapter->link_tid = 0;
   2374 				mutex_exit(&Adapter->link_lock);
   2375 			} else {
   2376 				link_changed = B_FALSE;
   2377 			}
   2378 		}
   2379 		rw_exit(&Adapter->chip_lock);
   2380 
   2381 		if (link_changed) {
   2382 			if (tid != 0)
   2383 				(void) untimeout(tid);
   2384 
   2385 			/*
   2386 			 * Workaround for esb2. Data stuck in fifo on a link
   2387 			 * down event. Stop receiver here and reset in watchdog.
   2388 			 */
   2389 			if ((Adapter->link_state == LINK_STATE_DOWN) &&
   2390 			    (Adapter->shared.mac.type == e1000_80003es2lan)) {
   2391 				uint32_t rctl = E1000_READ_REG(hw, E1000_RCTL);
   2392 				E1000_WRITE_REG(hw, E1000_RCTL,
   2393 				    rctl & ~E1000_RCTL_EN);
   2394 				e1000g_log(Adapter, CE_WARN,
   2395 				    "ESB2 receiver disabled");
   2396 				Adapter->esb2_workaround = B_TRUE;
   2397 			}
   2398 			if (!Adapter->reset_flag)
   2399 				mac_link_update(Adapter->mh,
   2400 				    Adapter->link_state);
   2401 			if (Adapter->link_state == LINK_STATE_UP)
   2402 				Adapter->reset_flag = B_FALSE;
   2403 		}
   2404 
   2405 		start_watchdog_timer(Adapter);
   2406 	}
   2407 }
   2408 
   2409 static void
   2410 e1000g_init_unicst(struct e1000g *Adapter)
   2411 {
   2412 	struct e1000_hw *hw;
   2413 	int slot;
   2414 
   2415 	hw = &Adapter->shared;
   2416 
   2417 	if (Adapter->init_count == 0) {
   2418 		/* Initialize the multiple unicast addresses */
   2419 		Adapter->unicst_total = MAX_NUM_UNICAST_ADDRESSES;
   2420 
   2421 		/* Workaround for an erratum of 82571 chipst */
   2422 		if ((hw->mac.type == e1000_82571) &&
   2423 		    (e1000_get_laa_state_82571(hw) == B_TRUE))
   2424 			Adapter->unicst_total--;
   2425 
   2426 		Adapter->unicst_avail = Adapter->unicst_total;
   2427 
   2428 		for (slot = 0; slot < Adapter->unicst_total; slot++) {
   2429 			/* Clear both the flag and MAC address */
   2430 			Adapter->unicst_addr[slot].reg.high = 0;
   2431 			Adapter->unicst_addr[slot].reg.low = 0;
   2432 		}
   2433 	} else {
   2434 		/* Workaround for an erratum of 82571 chipst */
   2435 		if ((hw->mac.type == e1000_82571) &&
   2436 		    (e1000_get_laa_state_82571(hw) == B_TRUE))
   2437 			e1000_rar_set(hw, hw->mac.addr, LAST_RAR_ENTRY);
   2438 
   2439 		/* Re-configure the RAR registers */
   2440 		for (slot = 0; slot < Adapter->unicst_total; slot++)
   2441 			if (Adapter->unicst_addr[slot].mac.set == 1)
   2442 				e1000_rar_set(hw,
   2443 				    Adapter->unicst_addr[slot].mac.addr, slot);
   2444 	}
   2445 
   2446 	if (e1000g_check_acc_handle(Adapter->osdep.reg_handle) != DDI_FM_OK)
   2447 		ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_DEGRADED);
   2448 }
   2449 
   2450 static int
   2451 e1000g_unicst_set(struct e1000g *Adapter, const uint8_t *mac_addr,
   2452     int slot)
   2453 {
   2454 	struct e1000_hw *hw;
   2455 
   2456 	hw = &Adapter->shared;
   2457 
   2458 	/*
   2459 	 * The first revision of Wiseman silicon (rev 2.0) has an errata
   2460 	 * that requires the receiver to be in reset when any of the
   2461 	 * receive address registers (RAR regs) are accessed.  The first
   2462 	 * rev of Wiseman silicon also requires MWI to be disabled when
   2463 	 * a global reset or a receive reset is issued.  So before we
   2464 	 * initialize the RARs, we check the rev of the Wiseman controller
   2465 	 * and work around any necessary HW errata.
   2466 	 */
   2467 	if ((hw->mac.type == e1000_82542) &&
   2468 	    (hw->revision_id == E1000_REVISION_2)) {
   2469 		e1000_pci_clear_mwi(hw);
   2470 		E1000_WRITE_REG(hw, E1000_RCTL, E1000_RCTL_RST);
   2471 		msec_delay(5);
   2472 	}
   2473 	if (mac_addr == NULL) {
   2474 		E1000_WRITE_REG_ARRAY(hw, E1000_RA, slot << 1, 0);
   2475 		E1000_WRITE_FLUSH(hw);
   2476 		E1000_WRITE_REG_ARRAY(hw, E1000_RA, (slot << 1) + 1, 0);
   2477 		E1000_WRITE_FLUSH(hw);
   2478 		/* Clear both the flag and MAC address */
   2479 		Adapter->unicst_addr[slot].reg.high = 0;
   2480 		Adapter->unicst_addr[slot].reg.low = 0;
   2481 	} else {
   2482 		bcopy(mac_addr, Adapter->unicst_addr[slot].mac.addr,
   2483 		    ETHERADDRL);
   2484 		e1000_rar_set(hw, (uint8_t *)mac_addr, slot);
   2485 		Adapter->unicst_addr[slot].mac.set = 1;
   2486 	}
   2487 
   2488 	/* Workaround for an erratum of 82571 chipst */
   2489 	if (slot == 0) {
   2490 		if ((hw->mac.type == e1000_82571) &&
   2491 		    (e1000_get_laa_state_82571(hw) == B_TRUE))
   2492 			if (mac_addr == NULL) {
   2493 				E1000_WRITE_REG_ARRAY(hw, E1000_RA,
   2494 				    slot << 1, 0);
   2495 				E1000_WRITE_FLUSH(hw);
   2496 				E1000_WRITE_REG_ARRAY(hw, E1000_RA,
   2497 				    (slot << 1) + 1, 0);
   2498 				E1000_WRITE_FLUSH(hw);
   2499 			} else {
   2500 				e1000_rar_set(hw, (uint8_t *)mac_addr,
   2501 				    LAST_RAR_ENTRY);
   2502 			}
   2503 	}
   2504 
   2505 	/*
   2506 	 * If we are using Wiseman rev 2.0 silicon, we will have previously
   2507 	 * put the receive in reset, and disabled MWI, to work around some
   2508 	 * HW errata.  Now we should take the receiver out of reset, and
   2509 	 * re-enabled if MWI if it was previously enabled by the PCI BIOS.
   2510 	 */
   2511 	if ((hw->mac.type == e1000_82542) &&
   2512 	    (hw->revision_id == E1000_REVISION_2)) {
   2513 		E1000_WRITE_REG(hw, E1000_RCTL, 0);
   2514 		msec_delay(1);
   2515 		if (hw->bus.pci_cmd_word & CMD_MEM_WRT_INVALIDATE)
   2516 			e1000_pci_set_mwi(hw);
   2517 		e1000g_rx_setup(Adapter);
   2518 	}
   2519 
   2520 	if (e1000g_check_acc_handle(Adapter->osdep.reg_handle) != DDI_FM_OK) {
   2521 		ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_DEGRADED);
   2522 		return (EIO);
   2523 	}
   2524 
   2525 	return (0);
   2526 }
   2527 
   2528 static int
   2529 multicst_add(struct e1000g *Adapter, const uint8_t *multiaddr)
   2530 {
   2531 	struct e1000_hw *hw = &Adapter->shared;
   2532 	struct ether_addr *newtable;
   2533 	size_t new_len;
   2534 	size_t old_len;
   2535 	int res = 0;
   2536 
   2537 	if ((multiaddr[0] & 01) == 0) {
   2538 		res = EINVAL;
   2539 		e1000g_log(Adapter, CE_WARN, "Illegal multicast address");
   2540 		goto done;
   2541 	}
   2542 
   2543 	if (Adapter->mcast_count >= Adapter->mcast_max_num) {
   2544 		res = ENOENT;
   2545 		e1000g_log(Adapter, CE_WARN,
   2546 		    "Adapter requested more than %d mcast addresses",
   2547 		    Adapter->mcast_max_num);
   2548 		goto done;
   2549 	}
   2550 
   2551 
   2552 	if (Adapter->mcast_count == Adapter->mcast_alloc_count) {
   2553 		old_len = Adapter->mcast_alloc_count *
   2554 		    sizeof (struct ether_addr);
   2555 		new_len = (Adapter->mcast_alloc_count + MCAST_ALLOC_SIZE) *
   2556 		    sizeof (struct ether_addr);
   2557 
   2558 		newtable = kmem_alloc(new_len, KM_NOSLEEP);
   2559 		if (newtable == NULL) {
   2560 			res = ENOMEM;
   2561 			e1000g_log(Adapter, CE_WARN,
   2562 			    "Not enough memory to alloc mcast table");
   2563 			goto done;
   2564 		}
   2565 
   2566 		if (Adapter->mcast_table != NULL) {
   2567 			bcopy(Adapter->mcast_table, newtable, old_len);
   2568 			kmem_free(Adapter->mcast_table, old_len);
   2569 		}
   2570 		Adapter->mcast_alloc_count += MCAST_ALLOC_SIZE;
   2571 		Adapter->mcast_table = newtable;
   2572 	}
   2573 
   2574 	bcopy(multiaddr,
   2575 	    &Adapter->mcast_table[Adapter->mcast_count], ETHERADDRL);
   2576 	Adapter->mcast_count++;
   2577 
   2578 	/*
   2579 	 * Update the MC table in the hardware
   2580 	 */
   2581 	e1000g_clear_interrupt(Adapter);
   2582 
   2583 	e1000_update_mc_addr_list(hw,
   2584 	    (uint8_t *)Adapter->mcast_table, Adapter->mcast_count);
   2585 
   2586 	e1000g_mask_interrupt(Adapter);
   2587 
   2588 	if (e1000g_check_acc_handle(Adapter->osdep.reg_handle) != DDI_FM_OK) {
   2589 		ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_DEGRADED);
   2590 		res = EIO;
   2591 	}
   2592 
   2593 done:
   2594 	return (res);
   2595 }
   2596 
   2597 static int
   2598 multicst_remove(struct e1000g *Adapter, const uint8_t *multiaddr)
   2599 {
   2600 	struct e1000_hw *hw = &Adapter->shared;
   2601 	struct ether_addr *newtable;
   2602 	size_t new_len;
   2603 	size_t old_len;
   2604 	unsigned i;
   2605 
   2606 	for (i = 0; i < Adapter->mcast_count; i++) {
   2607 		if (bcmp(multiaddr, &Adapter->mcast_table[i],
   2608 		    ETHERADDRL) == 0) {
   2609 			for (i++; i < Adapter->mcast_count; i++) {
   2610 				Adapter->mcast_table[i - 1] =
   2611 				    Adapter->mcast_table[i];
   2612 			}
   2613 			Adapter->mcast_count--;
   2614 			break;
   2615 		}
   2616 	}
   2617 
   2618 	if ((Adapter->mcast_alloc_count - Adapter->mcast_count) >
   2619 	    MCAST_ALLOC_SIZE) {
   2620 		old_len = Adapter->mcast_alloc_count *
   2621 		    sizeof (struct ether_addr);
   2622 		new_len = (Adapter->mcast_alloc_count - MCAST_ALLOC_SIZE) *
   2623 		    sizeof (struct ether_addr);
   2624 
   2625 		newtable = kmem_alloc(new_len, KM_NOSLEEP);
   2626 		if (newtable != NULL) {
   2627 			bcopy(Adapter->mcast_table, newtable, new_len);
   2628 			kmem_free(Adapter->mcast_table, old_len);
   2629 
   2630 			Adapter->mcast_alloc_count -= MCAST_ALLOC_SIZE;
   2631 			Adapter->mcast_table = newtable;
   2632 		}
   2633 	}
   2634 
   2635 	/*
   2636 	 * Update the MC table in the hardware
   2637 	 */
   2638 	e1000g_clear_interrupt(Adapter);
   2639 
   2640 	e1000_update_mc_addr_list(hw,
   2641 	    (uint8_t *)Adapter->mcast_table, Adapter->mcast_count);
   2642 
   2643 	e1000g_mask_interrupt(Adapter);
   2644 
   2645 	if (e1000g_check_acc_handle(Adapter->osdep.reg_handle) != DDI_FM_OK) {
   2646 		ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_DEGRADED);
   2647 		return (EIO);
   2648 	}
   2649 
   2650 	return (0);
   2651 }
   2652 
   2653 static void
   2654 e1000g_release_multicast(struct e1000g *Adapter)
   2655 {
   2656 	if (Adapter->mcast_table != NULL) {
   2657 		kmem_free(Adapter->mcast_table,
   2658 		    Adapter->mcast_alloc_count * sizeof (struct ether_addr));
   2659 		Adapter->mcast_table = NULL;
   2660 	}
   2661 }
   2662 
   2663 int
   2664 e1000g_m_multicst(void *arg, boolean_t add, const uint8_t *addr)
   2665 {
   2666 	struct e1000g *Adapter = (struct e1000g *)arg;
   2667 	int result;
   2668 
   2669 	rw_enter(&Adapter->chip_lock, RW_WRITER);
   2670 
   2671 	if (Adapter->e1000g_state & E1000G_SUSPENDED) {
   2672 		result = ECANCELED;
   2673 		goto done;
   2674 	}
   2675 
   2676 	result = (add) ? multicst_add(Adapter, addr)
   2677 	    : multicst_remove(Adapter, addr);
   2678 
   2679 done:
   2680 	rw_exit(&Adapter->chip_lock);
   2681 	return (result);
   2682 
   2683 }
   2684 
   2685 int
   2686 e1000g_m_promisc(void *arg, boolean_t on)
   2687 {
   2688 	struct e1000g *Adapter = (struct e1000g *)arg;
   2689 	uint32_t rctl;
   2690 
   2691 	rw_enter(&Adapter->chip_lock, RW_WRITER);
   2692 
   2693 	if (Adapter->e1000g_state & E1000G_SUSPENDED) {
   2694 		rw_exit(&Adapter->chip_lock);
   2695 		return (ECANCELED);
   2696 	}
   2697 
   2698 	rctl = E1000_READ_REG(&Adapter->shared, E1000_RCTL);
   2699 
   2700 	if (on)
   2701 		rctl |=
   2702 		    (E1000_RCTL_UPE | E1000_RCTL_MPE | E1000_RCTL_BAM);
   2703 	else
   2704 		rctl &= (~(E1000_RCTL_UPE | E1000_RCTL_MPE));
   2705 
   2706 	E1000_WRITE_REG(&Adapter->shared, E1000_RCTL, rctl);
   2707 
   2708 	Adapter->e1000g_promisc = on;
   2709 
   2710 	rw_exit(&Adapter->chip_lock);
   2711 
   2712 	if (e1000g_check_acc_handle(Adapter->osdep.reg_handle) != DDI_FM_OK) {
   2713 		ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_DEGRADED);
   2714 		return (EIO);
   2715 	}
   2716 
   2717 	return (0);
   2718 }
   2719 
   2720 /*
   2721  * Entry points to enable and disable interrupts at the granularity of
   2722  * a group.
   2723  * Turns the poll_mode for the whole adapter on and off to enable or
   2724  * override the ring level polling control over the hardware interrupts.
   2725  */
   2726 static int
   2727 e1000g_rx_group_intr_enable(mac_intr_handle_t arg)
   2728 {
   2729 	struct e1000g		*adapter = (struct e1000g *)arg;
   2730 	e1000g_rx_ring_t *rx_ring = adapter->rx_ring;
   2731 
   2732 	/*
   2733 	 * Later interrupts at the granularity of the this ring will
   2734 	 * invoke mac_rx() with NULL, indicating the need for another
   2735 	 * software classification.
   2736 	 * We have a single ring usable per adapter now, so we only need to
   2737 	 * reset the rx handle for that one.
   2738 	 * When more RX rings can be used, we should update each one of them.
   2739 	 */
   2740 	mutex_enter(&rx_ring->rx_lock);
   2741 	rx_ring->mrh = NULL;
   2742 	adapter->poll_mode = B_FALSE;
   2743 	mutex_exit(&rx_ring->rx_lock);
   2744 	return (0);
   2745 }
   2746 
   2747 static int
   2748 e1000g_rx_group_intr_disable(mac_intr_handle_t arg)
   2749 {
   2750 	struct e1000g *adapter = (struct e1000g *)arg;
   2751 	e1000g_rx_ring_t *rx_ring = adapter->rx_ring;
   2752 
   2753 	mutex_enter(&rx_ring->rx_lock);
   2754 
   2755 	/*
   2756 	 * Later interrupts at the granularity of the this ring will
   2757 	 * invoke mac_rx() with the handle for this ring;
   2758 	 */
   2759 	adapter->poll_mode = B_TRUE;
   2760 	rx_ring->mrh = rx_ring->mrh_init;
   2761 	mutex_exit(&rx_ring->rx_lock);
   2762 	return (0);
   2763 }
   2764 
   2765 /*
   2766  * Entry points to enable and disable interrupts at the granularity of
   2767  * a ring.
   2768  * adapter poll_mode controls whether we actually proceed with hardware
   2769  * interrupt toggling.
   2770  */
   2771 static int
   2772 e1000g_rx_ring_intr_enable(mac_intr_handle_t intrh)
   2773 {
   2774 	e1000g_rx_ring_t	*rx_ring = (e1000g_rx_ring_t *)intrh;
   2775 	struct e1000g 		*adapter = rx_ring->adapter;
   2776 	struct e1000_hw 	*hw = &adapter->shared;
   2777 	uint32_t		intr_mask;
   2778 
   2779 	rw_enter(&adapter->chip_lock, RW_READER);
   2780 
   2781 	if (adapter->e1000g_state & E1000G_SUSPENDED) {
   2782 		rw_exit(&adapter->chip_lock);
   2783 		return (0);
   2784 	}
   2785 
   2786 	mutex_enter(&rx_ring->rx_lock);
   2787 	rx_ring->poll_flag = 0;
   2788 	mutex_exit(&rx_ring->rx_lock);
   2789 
   2790 	/* Rx interrupt enabling for MSI and legacy */
   2791 	intr_mask = E1000_READ_REG(hw, E1000_IMS);
   2792 	intr_mask |= E1000_IMS_RXT0;
   2793 	E1000_WRITE_REG(hw, E1000_IMS, intr_mask);
   2794 	E1000_WRITE_FLUSH(hw);
   2795 
   2796 	/* Trigger a Rx interrupt to check Rx ring */
   2797 	E1000_WRITE_REG(hw, E1000_ICS, E1000_IMS_RXT0);
   2798 	E1000_WRITE_FLUSH(hw);
   2799 
   2800 	rw_exit(&adapter->chip_lock);
   2801 	return (0);
   2802 }
   2803 
   2804 static int
   2805 e1000g_rx_ring_intr_disable(mac_intr_handle_t intrh)
   2806 {
   2807 	e1000g_rx_ring_t	*rx_ring = (e1000g_rx_ring_t *)intrh;
   2808 	struct e1000g 		*adapter = rx_ring->adapter;
   2809 	struct e1000_hw 	*hw = &adapter->shared;
   2810 
   2811 	rw_enter(&adapter->chip_lock, RW_READER);
   2812 
   2813 	if (adapter->e1000g_state & E1000G_SUSPENDED) {
   2814 		rw_exit(&adapter->chip_lock);
   2815 		return (0);
   2816 	}
   2817 	mutex_enter(&rx_ring->rx_lock);
   2818 	rx_ring->poll_flag = 1;
   2819 	mutex_exit(&rx_ring->rx_lock);
   2820 
   2821 	/* Rx interrupt disabling for MSI and legacy */
   2822 	E1000_WRITE_REG(hw, E1000_IMC, E1000_IMS_RXT0);
   2823 	E1000_WRITE_FLUSH(hw);
   2824 
   2825 	rw_exit(&adapter->chip_lock);
   2826 	return (0);
   2827 }
   2828 
   2829 /*
   2830  * e1000g_unicst_find - Find the slot for the specified unicast address
   2831  */
   2832 static int
   2833 e1000g_unicst_find(struct e1000g *Adapter, const uint8_t *mac_addr)
   2834 {
   2835 	int slot;
   2836 
   2837 	for (slot = 0; slot < Adapter->unicst_total; slot++) {
   2838 		if ((Adapter->unicst_addr[slot].mac.set == 1) &&
   2839 		    (bcmp(Adapter->unicst_addr[slot].mac.addr,
   2840 		    mac_addr, ETHERADDRL) == 0))
   2841 				return (slot);
   2842 	}
   2843 
   2844 	return (-1);
   2845 }
   2846 
   2847 /*
   2848  * Entry points to add and remove a MAC address to a ring group.
   2849  * The caller takes care of adding and removing the MAC addresses
   2850  * to the filter via these two routines.
   2851  */
   2852 
   2853 static int
   2854 e1000g_addmac(void *arg, const uint8_t *mac_addr)
   2855 {
   2856 	struct e1000g *Adapter = (struct e1000g *)arg;
   2857 	int slot, err;
   2858 
   2859 	rw_enter(&Adapter->chip_lock, RW_WRITER);
   2860 
   2861 	if (Adapter->e1000g_state & E1000G_SUSPENDED) {
   2862 		rw_exit(&Adapter->chip_lock);
   2863 		return (ECANCELED);
   2864 	}
   2865 
   2866 	if (e1000g_unicst_find(Adapter, mac_addr) != -1) {
   2867 		/* The same address is already in slot */
   2868 		rw_exit(&Adapter->chip_lock);
   2869 		return (0);
   2870 	}
   2871 
   2872 	if (Adapter->unicst_avail == 0) {
   2873 		/* no slots available */
   2874 		rw_exit(&Adapter->chip_lock);
   2875 		return (ENOSPC);
   2876 	}
   2877 
   2878 	/* Search for a free slot */
   2879 	for (slot = 0; slot < Adapter->unicst_total; slot++) {
   2880 		if (Adapter->unicst_addr[slot].mac.set == 0)
   2881 			break;
   2882 	}
   2883 	ASSERT(slot < Adapter->unicst_total);
   2884 
   2885 	err = e1000g_unicst_set(Adapter, mac_addr, slot);
   2886 	if (err == 0)
   2887 		Adapter->unicst_avail--;
   2888 
   2889 	rw_exit(&Adapter->chip_lock);
   2890 
   2891 	return (err);
   2892 }
   2893 
   2894 static int
   2895 e1000g_remmac(void *arg, const uint8_t *mac_addr)
   2896 {
   2897 	struct e1000g *Adapter = (struct e1000g *)arg;
   2898 	int slot, err;
   2899 
   2900 	rw_enter(&Adapter->chip_lock, RW_WRITER);
   2901 
   2902 	if (Adapter->e1000g_state & E1000G_SUSPENDED) {
   2903 		rw_exit(&Adapter->chip_lock);
   2904 		return (ECANCELED);
   2905 	}
   2906 
   2907 	slot = e1000g_unicst_find(Adapter, mac_addr);
   2908 	if (slot == -1) {
   2909 		rw_exit(&Adapter->chip_lock);
   2910 		return (EINVAL);
   2911 	}
   2912 
   2913 	ASSERT(Adapter->unicst_addr[slot].mac.set);
   2914 
   2915 	/* Clear this slot */
   2916 	err = e1000g_unicst_set(Adapter, NULL, slot);
   2917 	if (err == 0)
   2918 		Adapter->unicst_avail++;
   2919 
   2920 	rw_exit(&Adapter->chip_lock);
   2921 
   2922 	return (err);
   2923 }
   2924 
   2925 static int
   2926 e1000g_ring_start(mac_ring_driver_t rh, uint64_t mr_gen_num)
   2927 {
   2928 	e1000g_rx_ring_t *rx_ring = (e1000g_rx_ring_t *)rh;
   2929 
   2930 	mutex_enter(&rx_ring->rx_lock);
   2931 	rx_ring->ring_gen_num = mr_gen_num;
   2932 	mutex_exit(&rx_ring->rx_lock);
   2933 	return (0);
   2934 }
   2935 
   2936 /*
   2937  * Callback funtion for MAC layer to register all rings.
   2938  *
   2939  * The hardware supports a single group with currently only one ring
   2940  * available.
   2941  * Though not offering virtualization ability per se, exposing the
   2942  * group/ring still enables the polling and interrupt toggling.
   2943  */
   2944 /* ARGSUSED */
   2945 void
   2946 e1000g_fill_ring(void *arg, mac_ring_type_t rtype, const int grp_index,
   2947     const int ring_index, mac_ring_info_t *infop, mac_ring_handle_t rh)
   2948 {
   2949 	struct e1000g *Adapter = (struct e1000g *)arg;
   2950 	e1000g_rx_ring_t *rx_ring = Adapter->rx_ring;
   2951 	mac_intr_t *mintr;
   2952 
   2953 	/*
   2954 	 * We advertised only RX group/rings, so the MAC framework shouldn't
   2955 	 * ask for any thing else.
   2956 	 */
   2957 	ASSERT(rtype == MAC_RING_TYPE_RX && grp_index == 0 && ring_index == 0);
   2958 
   2959 	rx_ring->mrh = rx_ring->mrh_init = rh;
   2960 	infop->mri_driver = (mac_ring_driver_t)rx_ring;
   2961 	infop->mri_start = e1000g_ring_start;
   2962 	infop->mri_stop = NULL;
   2963 	infop->mri_poll = e1000g_poll_ring;
   2964 
   2965 	/* Ring level interrupts */
   2966 	mintr = &infop->mri_intr;
   2967 	mintr->mi_handle = (mac_intr_handle_t)rx_ring;
   2968 	mintr->mi_enable = e1000g_rx_ring_intr_enable;
   2969 	mintr->mi_disable = e1000g_rx_ring_intr_disable;
   2970 }
   2971 
   2972 /* ARGSUSED */
   2973 static void
   2974 e1000g_fill_group(void *arg, mac_ring_type_t rtype, const int grp_index,
   2975     mac_group_info_t *infop, mac_group_handle_t gh)
   2976 {
   2977 	struct e1000g *Adapter = (struct e1000g *)arg;
   2978 	mac_intr_t *mintr;
   2979 
   2980 	/*
   2981 	 * We advertised a single RX ring. Getting a request for anything else
   2982 	 * signifies a bug in the MAC framework.
   2983 	 */
   2984 	ASSERT(rtype == MAC_RING_TYPE_RX && grp_index == 0);
   2985 
   2986 	Adapter->rx_group = gh;
   2987 
   2988 	infop->mgi_driver = (mac_group_driver_t)Adapter;
   2989 	infop->mgi_start = NULL;
   2990 	infop->mgi_stop = NULL;
   2991 	infop->mgi_addmac = e1000g_addmac;
   2992 	infop->mgi_remmac = e1000g_remmac;
   2993 	infop->mgi_count = 1;
   2994 
   2995 	/* Group level interrupts */
   2996 	mintr = &infop->mgi_intr;
   2997 	mintr->mi_handle = (mac_intr_handle_t)Adapter;
   2998 	mintr->mi_enable = e1000g_rx_group_intr_enable;
   2999 	mintr->mi_disable = e1000g_rx_group_intr_disable;
   3000 }
   3001 
   3002 static boolean_t
   3003 e1000g_m_getcapab(void *arg, mac_capab_t cap, void *cap_data)
   3004 {
   3005 	struct e1000g *Adapter = (struct e1000g *)arg;
   3006 
   3007 	switch (cap) {
   3008 	case MAC_CAPAB_HCKSUM: {
   3009 		uint32_t *txflags = cap_data;
   3010 
   3011 		if (Adapter->tx_hcksum_enable)
   3012 			*txflags = HCKSUM_IPHDRCKSUM |
   3013 			    HCKSUM_INET_PARTIAL;
   3014 		else
   3015 			return (B_FALSE);
   3016 		break;
   3017 	}
   3018 
   3019 	case MAC_CAPAB_LSO: {
   3020 		mac_capab_lso_t *cap_lso = cap_data;
   3021 
   3022 		if (Adapter->lso_enable) {
   3023 			cap_lso->lso_flags = LSO_TX_BASIC_TCP_IPV4;
   3024 			cap_lso->lso_basic_tcp_ipv4.lso_max =
   3025 			    E1000_LSO_MAXLEN;
   3026 		} else
   3027 			return (B_FALSE);
   3028 		break;
   3029 	}
   3030 	case MAC_CAPAB_RINGS: {
   3031 		mac_capab_rings_t *cap_rings = cap_data;
   3032 
   3033 		/* No TX rings exposed yet */
   3034 		if (cap_rings->mr_type != MAC_RING_TYPE_RX)
   3035 			return (B_FALSE);
   3036 
   3037 		cap_rings->mr_group_type = MAC_GROUP_TYPE_STATIC;
   3038 		cap_rings->mr_rnum = 1;
   3039 		cap_rings->mr_gnum = 1;
   3040 		cap_rings->mr_rget = e1000g_fill_ring;
   3041 		cap_rings->mr_gget = e1000g_fill_group;
   3042 		break;
   3043 	}
   3044 	default:
   3045 		return (B_FALSE);
   3046 	}
   3047 	return (B_TRUE);
   3048 }
   3049 
   3050 static boolean_t
   3051 e1000g_param_locked(mac_prop_id_t pr_num)
   3052 {
   3053 	/*
   3054 	 * All en_* parameters are locked (read-only) while
   3055 	 * the device is in any sort of loopback mode ...
   3056 	 */
   3057 	switch (pr_num) {
   3058 		case MAC_PROP_EN_1000FDX_CAP:
   3059 		case MAC_PROP_EN_1000HDX_CAP:
   3060 		case MAC_PROP_EN_100FDX_CAP:
   3061 		case MAC_PROP_EN_100HDX_CAP:
   3062 		case MAC_PROP_EN_10FDX_CAP:
   3063 		case MAC_PROP_EN_10HDX_CAP:
   3064 		case MAC_PROP_AUTONEG:
   3065 		case MAC_PROP_FLOWCTRL:
   3066 			return (B_TRUE);
   3067 	}
   3068 	return (B_FALSE);
   3069 }
   3070 
   3071 /*
   3072  * callback function for set/get of properties
   3073  */
   3074 static int
   3075 e1000g_m_setprop(void *arg, const char *pr_name, mac_prop_id_t pr_num,
   3076     uint_t pr_valsize, const void *pr_val)
   3077 {
   3078 	struct e1000g *Adapter = arg;
   3079 	struct e1000_hw *hw = &Adapter->shared;
   3080 	struct e1000_fc_info *fc = &Adapter->shared.fc;
   3081 	int err = 0;
   3082 	link_flowctrl_t flowctrl;
   3083 	uint32_t cur_mtu, new_mtu;
   3084 
   3085 	rw_enter(&Adapter->chip_lock, RW_WRITER);
   3086 
   3087 	if (Adapter->e1000g_state & E1000G_SUSPENDED) {
   3088 		rw_exit(&Adapter->chip_lock);
   3089 		return (ECANCELED);
   3090 	}
   3091 
   3092 	if (Adapter->loopback_mode != E1000G_LB_NONE &&
   3093 	    e1000g_param_locked(pr_num)) {
   3094 		/*
   3095 		 * All en_* parameters are locked (read-only)
   3096 		 * while the device is in any sort of loopback mode.
   3097 		 */
   3098 		rw_exit(&Adapter->chip_lock);
   3099 		return (EBUSY);
   3100 	}
   3101 
   3102 	switch (pr_num) {
   3103 		case MAC_PROP_EN_1000FDX_CAP:
   3104 			if (hw->phy.media_type != e1000_media_type_copper) {
   3105 				err = ENOTSUP;
   3106 				break;
   3107 			}
   3108 			Adapter->param_en_1000fdx = *(uint8_t *)pr_val;
   3109 			Adapter->param_adv_1000fdx = *(uint8_t *)pr_val;
   3110 			goto reset;
   3111 		case MAC_PROP_EN_100FDX_CAP:
   3112 			if (hw->phy.media_type != e1000_media_type_copper) {
   3113 				err = ENOTSUP;
   3114 				break;
   3115 			}
   3116 			Adapter->param_en_100fdx = *(uint8_t *)pr_val;
   3117 			Adapter->param_adv_100fdx = *(uint8_t *)pr_val;
   3118 			goto reset;
   3119 		case MAC_PROP_EN_100HDX_CAP:
   3120 			if (hw->phy.media_type != e1000_media_type_copper) {
   3121 				err = ENOTSUP;
   3122 				break;
   3123 			}
   3124 			Adapter->param_en_100hdx = *(uint8_t *)pr_val;
   3125 			Adapter->param_adv_100hdx = *(uint8_t *)pr_val;
   3126 			goto reset;
   3127 		case MAC_PROP_EN_10FDX_CAP:
   3128 			if (hw->phy.media_type != e1000_media_type_copper) {
   3129 				err = ENOTSUP;
   3130 				break;
   3131 			}
   3132 			Adapter->param_en_10fdx = *(uint8_t *)pr_val;
   3133 			Adapter->param_adv_10fdx = *(uint8_t *)pr_val;
   3134 			goto reset;
   3135 		case MAC_PROP_EN_10HDX_CAP:
   3136 			if (hw->phy.media_type != e1000_media_type_copper) {
   3137 				err = ENOTSUP;
   3138 				break;
   3139 			}
   3140 			Adapter->param_en_10hdx = *(uint8_t *)pr_val;
   3141 			Adapter->param_adv_10hdx = *(uint8_t *)pr_val;
   3142 			goto reset;
   3143 		case MAC_PROP_AUTONEG:
   3144 			if (hw->phy.media_type != e1000_media_type_copper) {
   3145 				err = ENOTSUP;
   3146 				break;
   3147 			}
   3148 			Adapter->param_adv_autoneg = *(uint8_t *)pr_val;
   3149 			goto reset;
   3150 		case MAC_PROP_FLOWCTRL:
   3151 			fc->send_xon = B_TRUE;
   3152 			bcopy(pr_val, &flowctrl, sizeof (flowctrl));
   3153 
   3154 			switch (flowctrl) {
   3155 			default:
   3156 				err = EINVAL;
   3157 				break;
   3158 			case LINK_FLOWCTRL_NONE:
   3159 				fc->requested_mode = e1000_fc_none;
   3160 				break;
   3161 			case LINK_FLOWCTRL_RX:
   3162 				fc->requested_mode = e1000_fc_rx_pause;
   3163 				break;
   3164 			case LINK_FLOWCTRL_TX:
   3165 				fc->requested_mode = e1000_fc_tx_pause;
   3166 				break;
   3167 			case LINK_FLOWCTRL_BI:
   3168 				fc->requested_mode = e1000_fc_full;
   3169 				break;
   3170 			}
   3171 reset:
   3172 			if (err == 0) {
   3173 				/* check PCH limits & reset the link */
   3174 				e1000g_pch_limits(Adapter);
   3175 				if (e1000g_reset_link(Adapter) != DDI_SUCCESS)
   3176 					err = EINVAL;
   3177 			}
   3178 			break;
   3179 		case MAC_PROP_ADV_1000FDX_CAP:
   3180 		case MAC_PROP_ADV_1000HDX_CAP:
   3181 		case MAC_PROP_ADV_100FDX_CAP:
   3182 		case MAC_PROP_ADV_100HDX_CAP:
   3183 		case MAC_PROP_ADV_10FDX_CAP:
   3184 		case MAC_PROP_ADV_10HDX_CAP:
   3185 		case MAC_PROP_EN_1000HDX_CAP:
   3186 		case MAC_PROP_STATUS:
   3187 		case MAC_PROP_SPEED:
   3188 		case MAC_PROP_DUPLEX:
   3189 			err = ENOTSUP; /* read-only prop. Can't set this. */
   3190 			break;
   3191 		case MAC_PROP_MTU:
   3192 			/* adapter must be stopped for an MTU change */
   3193 			if (Adapter->e1000g_state & E1000G_STARTED) {
   3194 				err = EBUSY;
   3195 				break;
   3196 			}
   3197 
   3198 			cur_mtu = Adapter->default_mtu;
   3199 
   3200 			/* get new requested MTU */
   3201 			bcopy(pr_val, &new_mtu, sizeof (new_mtu));
   3202 			if (new_mtu == cur_mtu) {
   3203 				err = 0;
   3204 				break;
   3205 			}
   3206 
   3207 			if ((new_mtu < DEFAULT_MTU) ||
   3208 			    (new_mtu > Adapter->max_mtu)) {
   3209 				err = EINVAL;
   3210 				break;
   3211 			}
   3212 
   3213 			/* inform MAC framework of new MTU */
   3214 			err = mac_maxsdu_update(Adapter->mh, new_mtu);
   3215 
   3216 			if (err == 0) {
   3217 				Adapter->default_mtu = new_mtu;
   3218 				Adapter->max_frame_size =
   3219 				    e1000g_mtu2maxframe(new_mtu);
   3220 
   3221 				/*
   3222 				 * check PCH limits & set buffer sizes to
   3223 				 * match new MTU
   3224 				 */
   3225 				e1000g_pch_limits(Adapter);
   3226 				e1000g_set_bufsize(Adapter);
   3227 
   3228 				/*
   3229 				 * decrease the number of descriptors and free
   3230 				 * packets for jumbo frames to reduce tx/rx
   3231 				 * resource consumption
   3232 				 */
   3233 				if (Adapter->max_frame_size >=
   3234 				    (FRAME_SIZE_UPTO_4K -
   3235 				    E1000G_IPALIGNPRESERVEROOM)) {
   3236 
   3237 					if (Adapter->tx_desc_num_flag == 0)
   3238 						Adapter->tx_desc_num =
   3239 						    DEFAULT_JUMBO_NUM_TX_DESC;
   3240 
   3241 					if (Adapter->rx_desc_num_flag == 0)
   3242 						Adapter->rx_desc_num =
   3243 						    DEFAULT_JUMBO_NUM_RX_DESC;
   3244 
   3245 					if (Adapter->tx_buf_num_flag == 0)
   3246 						Adapter->tx_freelist_num =
   3247 						    DEFAULT_JUMBO_NUM_TX_BUF;
   3248 
   3249 					if (Adapter->rx_buf_num_flag == 0)
   3250 						Adapter->rx_freelist_num =
   3251 						    DEFAULT_JUMBO_NUM_RX_BUF;
   3252 				} else {
   3253 					if (Adapter->tx_desc_num_flag == 0)
   3254 						Adapter->tx_desc_num =
   3255 						    DEFAULT_NUM_TX_DESCRIPTOR;
   3256 
   3257 					if (Adapter->rx_desc_num_flag == 0)
   3258 						Adapter->rx_desc_num =
   3259 						    DEFAULT_NUM_RX_DESCRIPTOR;
   3260 
   3261 					if (Adapter->tx_buf_num_flag == 0)
   3262 						Adapter->tx_freelist_num =
   3263 						    DEFAULT_NUM_TX_FREELIST;
   3264 
   3265 					if (Adapter->rx_buf_num_flag == 0)
   3266 						Adapter->rx_freelist_num =
   3267 						    DEFAULT_NUM_RX_FREELIST;
   3268 				}
   3269 			}
   3270 			break;
   3271 		case MAC_PROP_PRIVATE:
   3272 			err = e1000g_set_priv_prop(Adapter, pr_name,
   3273 			    pr_valsize, pr_val);
   3274 			break;
   3275 		default:
   3276 			err = ENOTSUP;
   3277 			break;
   3278 	}
   3279 	rw_exit(&Adapter->chip_lock);
   3280 	return (err);
   3281 }
   3282 
   3283 static int
   3284 e1000g_m_getprop(void *arg, const char *pr_name, mac_prop_id_t pr_num,
   3285     uint_t pr_flags, uint_t pr_valsize, void *pr_val, uint_t *perm)
   3286 {
   3287 	struct e1000g *Adapter = arg;
   3288 	struct e1000_fc_info *fc = &Adapter->shared.fc;
   3289 	struct e1000_hw *hw = &Adapter->shared;
   3290 	int err = 0;
   3291 	link_flowctrl_t flowctrl;
   3292 	uint64_t tmp = 0;
   3293 
   3294 	if (pr_valsize == 0)
   3295 		return (EINVAL);
   3296 
   3297 	*perm = MAC_PROP_PERM_RW;
   3298 
   3299 	bzero(pr_val, pr_valsize);
   3300 	if ((pr_flags & MAC_PROP_DEFAULT) && (pr_num != MAC_PROP_PRIVATE)) {
   3301 		return (e1000g_get_def_val(Adapter, pr_num,
   3302 		    pr_valsize, pr_val));
   3303 	}
   3304 
   3305 	switch (pr_num) {
   3306 		case MAC_PROP_DUPLEX:
   3307 			*perm = MAC_PROP_PERM_READ;
   3308 			if (pr_valsize >= sizeof (link_duplex_t)) {
   3309 				bcopy(&Adapter->link_duplex, pr_val,
   3310 				    sizeof (link_duplex_t));
   3311 			} else
   3312 				err = EINVAL;
   3313 			break;
   3314 		case MAC_PROP_SPEED:
   3315 			*perm = MAC_PROP_PERM_READ;
   3316 			if (pr_valsize >= sizeof (uint64_t)) {
   3317 				tmp = Adapter->link_speed * 1000000ull;
   3318 				bcopy(&tmp, pr_val, sizeof (tmp));
   3319 			} else
   3320 				err = EINVAL;
   3321 			break;
   3322 		case MAC_PROP_AUTONEG:
   3323 			if (hw->phy.media_type != e1000_media_type_copper)
   3324 				*perm = MAC_PROP_PERM_READ;
   3325 			*(uint8_t *)pr_val = Adapter->param_adv_autoneg;
   3326 			break;
   3327 		case MAC_PROP_FLOWCTRL:
   3328 			if (pr_valsize >= sizeof (link_flowctrl_t)) {
   3329 				switch (fc->current_mode) {
   3330 					case e1000_fc_none:
   3331 						flowctrl = LINK_FLOWCTRL_NONE;
   3332 						break;
   3333 					case e1000_fc_rx_pause:
   3334 						flowctrl = LINK_FLOWCTRL_RX;
   3335 						break;
   3336 					case e1000_fc_tx_pause:
   3337 						flowctrl = LINK_FLOWCTRL_TX;
   3338 						break;
   3339 					case e1000_fc_full:
   3340 						flowctrl = LINK_FLOWCTRL_BI;
   3341 						break;
   3342 				}
   3343 				bcopy(&flowctrl, pr_val, sizeof (flowctrl));
   3344 			} else
   3345 				err = EINVAL;
   3346 			break;
   3347 		case MAC_PROP_ADV_1000FDX_CAP:
   3348 			*perm = MAC_PROP_PERM_READ;
   3349 			*(uint8_t *)pr_val = Adapter->param_adv_1000fdx;
   3350 			break;
   3351 		case MAC_PROP_EN_1000FDX_CAP:
   3352 			if (hw->phy.media_type != e1000_media_type_copper)
   3353 				*perm = MAC_PROP_PERM_READ;
   3354 			*(uint8_t *)pr_val = Adapter->param_en_1000fdx;
   3355 			break;
   3356 		case MAC_PROP_ADV_1000HDX_CAP:
   3357 			*perm = MAC_PROP_PERM_READ;
   3358 			*(uint8_t *)pr_val = Adapter->param_adv_1000hdx;
   3359 			break;
   3360 		case MAC_PROP_EN_1000HDX_CAP:
   3361 			*perm = MAC_PROP_PERM_READ;
   3362 			*(uint8_t *)pr_val = Adapter->param_en_1000hdx;
   3363 			break;
   3364 		case MAC_PROP_ADV_100FDX_CAP:
   3365 			*perm = MAC_PROP_PERM_READ;
   3366 			*(uint8_t *)pr_val = Adapter->param_adv_100fdx;
   3367 			break;
   3368 		case MAC_PROP_EN_100FDX_CAP:
   3369 			if (hw->phy.media_type != e1000_media_type_copper)
   3370 				*perm = MAC_PROP_PERM_READ;
   3371 			*(uint8_t *)pr_val = Adapter->param_en_100fdx;
   3372 			break;
   3373 		case MAC_PROP_ADV_100HDX_CAP:
   3374 			*perm = MAC_PROP_PERM_READ;
   3375 			*(uint8_t *)pr_val = Adapter->param_adv_100hdx;
   3376 			break;
   3377 		case MAC_PROP_EN_100HDX_CAP:
   3378 			if (hw->phy.media_type != e1000_media_type_copper)
   3379 				*perm = MAC_PROP_PERM_READ;
   3380 			*(uint8_t *)pr_val = Adapter->param_en_100hdx;
   3381 			break;
   3382 		case MAC_PROP_ADV_10FDX_CAP:
   3383 			*perm = MAC_PROP_PERM_READ;
   3384 			*(uint8_t *)pr_val = Adapter->param_adv_10fdx;
   3385 			break;
   3386 		case MAC_PROP_EN_10FDX_CAP:
   3387 			if (hw->phy.media_type != e1000_media_type_copper)
   3388 				*perm = MAC_PROP_PERM_READ;
   3389 			*(uint8_t *)pr_val = Adapter->param_en_10fdx;
   3390 			break;
   3391 		case MAC_PROP_ADV_10HDX_CAP:
   3392 			*perm = MAC_PROP_PERM_READ;
   3393 			*(uint8_t *)pr_val = Adapter->param_adv_10hdx;
   3394 			break;
   3395 		case MAC_PROP_EN_10HDX_CAP:
   3396 			if (hw->phy.media_type != e1000_media_type_copper)
   3397 				*perm = MAC_PROP_PERM_READ;
   3398 			*(uint8_t *)pr_val = Adapter->param_en_10hdx;
   3399 			break;
   3400 		case MAC_PROP_ADV_100T4_CAP:
   3401 		case MAC_PROP_EN_100T4_CAP:
   3402 			*perm = MAC_PROP_PERM_READ;
   3403 			*(uint8_t *)pr_val = Adapter->param_adv_100t4;
   3404 			break;
   3405 		case MAC_PROP_PRIVATE:
   3406 			err = e1000g_get_priv_prop(Adapter, pr_name,
   3407 			    pr_flags, pr_valsize, pr_val, perm);
   3408 			break;
   3409 		case MAC_PROP_MTU: {
   3410 			struct e1000_mac_info *mac = &Adapter->shared.mac;
   3411 			struct e1000_phy_info *phy = &Adapter->shared.phy;
   3412 			mac_propval_range_t range;
   3413 
   3414 			if (!(pr_flags & MAC_PROP_POSSIBLE))
   3415 				return (ENOTSUP);
   3416 			if (pr_valsize < sizeof (mac_propval_range_t))
   3417 				return (EINVAL);
   3418 			range.mpr_count = 1;
   3419 			range.mpr_type = MAC_PROPVAL_UINT32;
   3420 			range.range_uint32[0].mpur_min = DEFAULT_MTU;
   3421 			range.range_uint32[0].mpur_max = Adapter->max_mtu;
   3422 			/* following MAC type do not support jumbo frames */
   3423 			if ((mac->type == e1000_ich8lan) ||
   3424 			    ((mac->type == e1000_ich9lan) && (phy->type ==
   3425 			    e1000_phy_ife))) {
   3426 				range.range_uint32[0].mpur_max = DEFAULT_MTU;
   3427 			}
   3428 			bcopy(&range, pr_val, sizeof (range));
   3429 			break;
   3430 		}
   3431 		default:
   3432 			err = ENOTSUP;
   3433 			break;
   3434 	}
   3435 	return (err);
   3436 }
   3437 
   3438 /* ARGSUSED2 */
   3439 static int
   3440 e1000g_set_priv_prop(struct e1000g *Adapter, const char *pr_name,
   3441     uint_t pr_valsize, const void *pr_val)
   3442 {
   3443 	int err = 0;
   3444 	long result;
   3445 	struct e1000_hw *hw = &Adapter->shared;
   3446 
   3447 	if (strcmp(pr_name, "_tx_bcopy_threshold") == 0) {
   3448 		if (pr_val == NULL) {
   3449 			err = EINVAL;
   3450 			return (err);
   3451 		}
   3452 		(void) ddi_strtol(pr_val, (char **)NULL, 0, &result);
   3453 		if (result < MIN_TX_BCOPY_THRESHOLD ||
   3454 		    result > MAX_TX_BCOPY_THRESHOLD)
   3455 			err = EINVAL;
   3456 		else {
   3457 			Adapter->tx_bcopy_thresh = (uint32_t)result;
   3458 		}
   3459 		return (err);
   3460 	}
   3461 	if (strcmp(pr_name, "_tx_interrupt_enable") == 0) {
   3462 		if (pr_val == NULL) {
   3463 			err = EINVAL;
   3464 			return (err);
   3465 		}
   3466 		(void) ddi_strtol(pr_val, (char **)NULL, 0, &result);
   3467 		if (result < 0 || result > 1)
   3468 			err = EINVAL;
   3469 		else {
   3470 			Adapter->tx_intr_enable = (result == 1) ?
   3471 			    B_TRUE: B_FALSE;
   3472 			if (Adapter->tx_intr_enable)
   3473 				e1000g_mask_tx_interrupt(Adapter);
   3474 			else
   3475 				e1000g_clear_tx_interrupt(Adapter);
   3476 			if (e1000g_check_acc_handle(
   3477 			    Adapter->osdep.reg_handle) != DDI_FM_OK) {
   3478 				ddi_fm_service_impact(Adapter->dip,
   3479 				    DDI_SERVICE_DEGRADED);
   3480 				err = EIO;
   3481 			}
   3482 		}
   3483 		return (err);
   3484 	}
   3485 	if (strcmp(pr_name, "_tx_intr_delay") == 0) {
   3486 		if (pr_val == NULL) {
   3487 			err = EINVAL;
   3488 			return (err);
   3489 		}
   3490 		(void) ddi_strtol(pr_val, (char **)NULL, 0, &result);
   3491 		if (result < MIN_TX_INTR_DELAY ||
   3492 		    result > MAX_TX_INTR_DELAY)
   3493 			err = EINVAL;
   3494 		else {
   3495 			Adapter->tx_intr_delay = (uint32_t)result;
   3496 			E1000_WRITE_REG(hw, E1000_TIDV, Adapter->tx_intr_delay);
   3497 			if (e1000g_check_acc_handle(
   3498 			    Adapter->osdep.reg_handle) != DDI_FM_OK) {
   3499 				ddi_fm_service_impact(Adapter->dip,
   3500 				    DDI_SERVICE_DEGRADED);
   3501 				err = EIO;
   3502 			}
   3503 		}
   3504 		return (err);
   3505 	}
   3506 	if (strcmp(pr_name, "_tx_intr_abs_delay") == 0) {
   3507 		if (pr_val == NULL) {
   3508 			err = EINVAL;
   3509 			return (err);
   3510 		}
   3511 		(void) ddi_strtol(pr_val, (char **)NULL, 0, &result);
   3512 		if (result < MIN_TX_INTR_ABS_DELAY ||
   3513 		    result > MAX_TX_INTR_ABS_DELAY)
   3514 			err = EINVAL;
   3515 		else {
   3516 			Adapter->tx_intr_abs_delay = (uint32_t)result;
   3517 			E1000_WRITE_REG(hw, E1000_TADV,
   3518 			    Adapter->tx_intr_abs_delay);
   3519 			if (e1000g_check_acc_handle(
   3520 			    Adapter->osdep.reg_handle) != DDI_FM_OK) {
   3521 				ddi_fm_service_impact(Adapter->dip,
   3522 				    DDI_SERVICE_DEGRADED);
   3523 				err = EIO;
   3524 			}
   3525 		}
   3526 		return (err);
   3527 	}
   3528 	if (strcmp(pr_name, "_rx_bcopy_threshold") == 0) {
   3529 		if (pr_val == NULL) {
   3530 			err = EINVAL;
   3531 			return (err);
   3532 		}
   3533 		(void) ddi_strtol(pr_val, (char **)NULL, 0, &result);
   3534 		if (result < MIN_RX_BCOPY_THRESHOLD ||
   3535 		    result > MAX_RX_BCOPY_THRESHOLD)
   3536 			err = EINVAL;
   3537 		else
   3538 			Adapter->rx_bcopy_thresh = (uint32_t)result;
   3539 		return (err);
   3540 	}
   3541 	if (strcmp(pr_name, "_max_num_rcv_packets") == 0) {
   3542 		if (pr_val == NULL) {
   3543 			err = EINVAL;
   3544 			return (err);
   3545 		}
   3546 		(void) ddi_strtol(pr_val, (char **)NULL, 0, &result);
   3547 		if (result < MIN_RX_LIMIT_ON_INTR ||
   3548 		    result > MAX_RX_LIMIT_ON_INTR)
   3549 			err = EINVAL;
   3550 		else
   3551 			Adapter->rx_limit_onintr = (uint32_t)result;
   3552 		return (err);
   3553 	}
   3554 	if (strcmp(pr_name, "_rx_intr_delay") == 0) {
   3555 		if (pr_val == NULL) {
   3556 			err = EINVAL;
   3557 			return (err);
   3558 		}
   3559 		(void) ddi_strtol(pr_val, (char **)NULL, 0, &result);
   3560 		if (result < MIN_RX_INTR_DELAY ||
   3561 		    result > MAX_RX_INTR_DELAY)
   3562 			err = EINVAL;
   3563 		else {
   3564 			Adapter->rx_intr_delay = (uint32_t)result;
   3565 			E1000_WRITE_REG(hw, E1000_RDTR, Adapter->rx_intr_delay);
   3566 			if (e1000g_check_acc_handle(
   3567 			    Adapter->osdep.reg_handle) != DDI_FM_OK) {
   3568 				ddi_fm_service_impact(Adapter->dip,
   3569 				    DDI_SERVICE_DEGRADED);
   3570 				err = EIO;
   3571 			}
   3572 		}
   3573 		return (err);
   3574 	}
   3575 	if (strcmp(pr_name, "_rx_intr_abs_delay") == 0) {
   3576 		if (pr_val == NULL) {
   3577 			err = EINVAL;
   3578 			return (err);
   3579 		}
   3580 		(void) ddi_strtol(pr_val, (char **)NULL, 0, &result);
   3581 		if (result < MIN_RX_INTR_ABS_DELAY ||
   3582 		    result > MAX_RX_INTR_ABS_DELAY)
   3583 			err = EINVAL;
   3584 		else {
   3585 			Adapter->rx_intr_abs_delay = (uint32_t)result;
   3586 			E1000_WRITE_REG(hw, E1000_RADV,
   3587 			    Adapter->rx_intr_abs_delay);
   3588 			if (e1000g_check_acc_handle(
   3589 			    Adapter->osdep.reg_handle) != DDI_FM_OK) {
   3590 				ddi_fm_service_impact(Adapter->dip,
   3591 				    DDI_SERVICE_DEGRADED);
   3592 				err = EIO;
   3593 			}
   3594 		}
   3595 		return (err);
   3596 	}
   3597 	if (strcmp(pr_name, "_intr_throttling_rate") == 0) {
   3598 		if (pr_val == NULL) {
   3599 			err = EINVAL;
   3600 			return (err);
   3601 		}
   3602 		(void) ddi_strtol(pr_val, (char **)NULL, 0, &result);
   3603 		if (result < MIN_INTR_THROTTLING ||
   3604 		    result > MAX_INTR_THROTTLING)
   3605 			err = EINVAL;
   3606 		else {
   3607 			if (hw->mac.type >= e1000_82540) {
   3608 				Adapter->intr_throttling_rate =
   3609 				    (uint32_t)result;
   3610 				E1000_WRITE_REG(hw, E1000_ITR,
   3611 				    Adapter->intr_throttling_rate);
   3612 				if (e1000g_check_acc_handle(
   3613 				    Adapter->osdep.reg_handle) != DDI_FM_OK) {
   3614 					ddi_fm_service_impact(Adapter->dip,
   3615 					    DDI_SERVICE_DEGRADED);
   3616 					err = EIO;
   3617 				}
   3618 			} else
   3619 				err = EINVAL;
   3620 		}
   3621 		return (err);
   3622 	}
   3623 	if (strcmp(pr_name, "_intr_adaptive") == 0) {
   3624 		if (pr_val == NULL) {
   3625 			err = EINVAL;
   3626 			return (err);
   3627 		}
   3628 		(void) ddi_strtol(pr_val, (char **)NULL, 0, &result);
   3629 		if (result < 0 || result > 1)
   3630 			err = EINVAL;
   3631 		else {
   3632 			if (hw->mac.type >= e1000_82540) {
   3633 				Adapter->intr_adaptive = (result == 1) ?
   3634 				    B_TRUE : B_FALSE;
   3635 			} else {
   3636 				err = EINVAL;
   3637 			}
   3638 		}
   3639 		return (err);
   3640 	}
   3641 	return (ENOTSUP);
   3642 }
   3643 
   3644 static int
   3645 e1000g_get_priv_prop(struct e1000g *Adapter, const char *pr_name,
   3646     uint_t pr_flags, uint_t pr_valsize, void *pr_val, uint_t *perm)
   3647 {
   3648 	int err = ENOTSUP;
   3649 	boolean_t is_default = (pr_flags & MAC_PROP_DEFAULT);
   3650 	int value;
   3651 
   3652 	if (strcmp(pr_name, "_adv_pause_cap") == 0) {
   3653 		*perm = MAC_PROP_PERM_READ;
   3654 		if (is_default)
   3655 			goto done;
   3656 		value = Adapter->param_adv_pause;
   3657 		err = 0;
   3658 		goto done;
   3659 	}
   3660 	if (strcmp(pr_name, "_adv_asym_pause_cap") == 0) {
   3661 		*perm = MAC_PROP_PERM_READ;
   3662 		if (is_default)
   3663 			goto done;
   3664 		value = Adapter->param_adv_asym_pause;
   3665 		err = 0;
   3666 		goto done;
   3667 	}
   3668 	if (strcmp(pr_name, "_tx_bcopy_threshold") == 0) {
   3669 		value = (is_default ? DEFAULT_TX_BCOPY_THRESHOLD :
   3670 		    Adapter->tx_bcopy_thresh);
   3671 		err = 0;
   3672 		goto done;
   3673 	}
   3674 	if (strcmp(pr_name, "_tx_interrupt_enable") == 0) {
   3675 		value = (is_default ? DEFAULT_TX_INTR_ENABLE :
   3676 		    Adapter->tx_intr_enable);
   3677 		err = 0;
   3678 		goto done;
   3679 	}
   3680 	if (strcmp(pr_name, "_tx_intr_delay") == 0) {
   3681 		value = (is_default ? DEFAULT_TX_INTR_DELAY :
   3682 		    Adapter->tx_intr_delay);
   3683 		err = 0;
   3684 		goto done;
   3685 	}
   3686 	if (strcmp(pr_name, "_tx_intr_abs_delay") == 0) {
   3687 		value = (is_default ? DEFAULT_TX_INTR_ABS_DELAY :
   3688 		    Adapter->tx_intr_abs_delay);
   3689 		err = 0;
   3690 		goto done;
   3691 	}
   3692 	if (strcmp(pr_name, "_rx_bcopy_threshold") == 0) {
   3693 		value = (is_default ? DEFAULT_RX_BCOPY_THRESHOLD :
   3694 		    Adapter->rx_bcopy_thresh);
   3695 		err = 0;
   3696 		goto done;
   3697 	}
   3698 	if (strcmp(pr_name, "_max_num_rcv_packets") == 0) {
   3699 		value = (is_default ? DEFAULT_RX_LIMIT_ON_INTR :
   3700 		    Adapter->rx_limit_onintr);
   3701 		err = 0;
   3702 		goto done;
   3703 	}
   3704 	if (strcmp(pr_name, "_rx_intr_delay") == 0) {
   3705 		value = (is_default ? DEFAULT_RX_INTR_DELAY :
   3706 		    Adapter->rx_intr_delay);
   3707 		err = 0;
   3708 		goto done;
   3709 	}
   3710 	if (strcmp(pr_name, "_rx_intr_abs_delay") == 0) {
   3711 		value = (is_default ? DEFAULT_RX_INTR_ABS_DELAY :
   3712 		    Adapter->rx_intr_abs_delay);
   3713 		err = 0;
   3714 		goto done;
   3715 	}
   3716 	if (strcmp(pr_name, "_intr_throttling_rate") == 0) {
   3717 		value = (is_default ? DEFAULT_INTR_THROTTLING :
   3718 		    Adapter->intr_throttling_rate);
   3719 		err = 0;
   3720 		goto done;
   3721 	}
   3722 	if (strcmp(pr_name, "_intr_adaptive") == 0) {
   3723 		value = (is_default ? 1 : Adapter->intr_adaptive);
   3724 		err = 0;
   3725 		goto done;
   3726 	}
   3727 done:
   3728 	if (err == 0) {
   3729 		(void) snprintf(pr_val, pr_valsize, "%d", value);
   3730 	}
   3731 	return (err);
   3732 }
   3733 
   3734 /*
   3735  * e1000g_get_conf - get configurations set in e1000g.conf
   3736  * This routine gets user-configured values out of the configuration
   3737  * file e1000g.conf.
   3738  *
   3739  * For each configurable value, there is a minimum, a maximum, and a
   3740  * default.
   3741  * If user does not configure a value, use the default.
   3742  * If user configures below the minimum, use the minumum.
   3743  * If user configures above the maximum, use the maxumum.
   3744  */
   3745 static void
   3746 e1000g_get_conf(struct e1000g *Adapter)
   3747 {
   3748 	struct e1000_hw *hw = &Adapter->shared;
   3749 	boolean_t tbi_compatibility = B_FALSE;
   3750 	boolean_t is_jumbo = B_FALSE;
   3751 	int propval;
   3752 	/*
   3753 	 * decrease the number of descriptors and free packets
   3754 	 * for jumbo frames to reduce tx/rx resource consumption
   3755 	 */
   3756 	if (Adapter->max_frame_size >=
   3757 	    (FRAME_SIZE_UPTO_4K -
   3758 	    E1000G_IPALIGNPRESERVEROOM)) {
   3759 		is_jumbo = B_TRUE;
   3760 	}
   3761 
   3762 	/*
   3763 	 * get each configurable property from e1000g.conf
   3764 	 */
   3765 
   3766 	/*
   3767 	 * NumTxDescriptors
   3768 	 */
   3769 	Adapter->tx_desc_num_flag =
   3770 	    e1000g_get_prop(Adapter, "NumTxDescriptors",
   3771 	    MIN_NUM_TX_DESCRIPTOR, MAX_NUM_TX_DESCRIPTOR,
   3772 	    is_jumbo ? DEFAULT_JUMBO_NUM_TX_DESC
   3773 	    : DEFAULT_NUM_TX_DESCRIPTOR, &propval);
   3774 	Adapter->tx_desc_num = propval;
   3775 
   3776 	/*
   3777 	 * NumRxDescriptors
   3778 	 */
   3779 	Adapter->rx_desc_num_flag =
   3780 	    e1000g_get_prop(Adapter, "NumRxDescriptors",
   3781 	    MIN_NUM_RX_DESCRIPTOR, MAX_NUM_RX_DESCRIPTOR,
   3782 	    is_jumbo ? DEFAULT_JUMBO_NUM_RX_DESC
   3783 	    : DEFAULT_NUM_RX_DESCRIPTOR, &propval);
   3784 	Adapter->rx_desc_num = propval;
   3785 
   3786 	/*
   3787 	 * NumRxFreeList
   3788 	 */
   3789 	Adapter->rx_buf_num_flag =
   3790 	    e1000g_get_prop(Adapter, "NumRxFreeList",
   3791 	    MIN_NUM_RX_FREELIST, MAX_NUM_RX_FREELIST,
   3792 	    is_jumbo ? DEFAULT_JUMBO_NUM_RX_BUF
   3793 	    : DEFAULT_NUM_RX_FREELIST, &propval);
   3794 	Adapter->rx_freelist_num = propval;
   3795 
   3796 	/*
   3797 	 * NumTxPacketList
   3798 	 */
   3799 	Adapter->tx_buf_num_flag =
   3800 	    e1000g_get_prop(Adapter, "NumTxPacketList",
   3801 	    MIN_NUM_TX_FREELIST, MAX_NUM_TX_FREELIST,
   3802 	    is_jumbo ? DEFAULT_JUMBO_NUM_TX_BUF
   3803 	    : DEFAULT_NUM_TX_FREELIST, &propval);
   3804 	Adapter->tx_freelist_num = propval;
   3805 
   3806 	/*
   3807 	 * FlowControl
   3808 	 */
   3809 	hw->fc.send_xon = B_TRUE;
   3810 	(void) e1000g_get_prop(Adapter, "FlowControl",
   3811 	    e1000_fc_none, 4, DEFAULT_FLOW_CONTROL, &propval);
   3812 	hw->fc.requested_mode = propval;
   3813 	/* 4 is the setting that says "let the eeprom decide" */
   3814 	if (hw->fc.requested_mode == 4)
   3815 		hw->fc.requested_mode = e1000_fc_default;
   3816 
   3817 	/*
   3818 	 * Max Num Receive Packets on Interrupt
   3819 	 */
   3820 	(void) e1000g_get_prop(Adapter, "MaxNumReceivePackets",
   3821 	    MIN_RX_LIMIT_ON_INTR, MAX_RX_LIMIT_ON_INTR,
   3822 	    DEFAULT_RX_LIMIT_ON_INTR, &propval);
   3823 	Adapter->rx_limit_onintr = propval;
   3824 
   3825 	/*
   3826 	 * PHY master slave setting
   3827 	 */
   3828 	(void) e1000g_get_prop(Adapter, "SetMasterSlave",
   3829 	    e1000_ms_hw_default, e1000_ms_auto,
   3830 	    e1000_ms_hw_default, &propval);
   3831 	hw->phy.ms_type = propval;
   3832 
   3833 	/*
   3834 	 * Parameter which controls TBI mode workaround, which is only
   3835 	 * needed on certain switches such as Cisco 6500/Foundry
   3836 	 */
   3837 	(void) e1000g_get_prop(Adapter, "TbiCompatibilityEnable",
   3838 	    0, 1, DEFAULT_TBI_COMPAT_ENABLE, &propval);
   3839 	tbi_compatibility = (propval == 1);
   3840 	e1000_set_tbi_compatibility_82543(hw, tbi_compatibility);
   3841 
   3842 	/*
   3843 	 * MSI Enable
   3844 	 */
   3845 	(void) e1000g_get_prop(Adapter, "MSIEnable",
   3846 	    0, 1, DEFAULT_MSI_ENABLE, &propval);
   3847 	Adapter->msi_enable = (propval == 1);
   3848 
   3849 	/*
   3850 	 * Interrupt Throttling Rate
   3851 	 */
   3852 	(void) e1000g_get_prop(Adapter, "intr_throttling_rate",
   3853 	    MIN_INTR_THROTTLING, MAX_INTR_THROTTLING,
   3854 	    DEFAULT_INTR_THROTTLING, &propval);
   3855 	Adapter->intr_throttling_rate = propval;
   3856 
   3857 	/*
   3858 	 * Adaptive Interrupt Blanking Enable/Disable
   3859 	 * It is enabled by default
   3860 	 */
   3861 	(void) e1000g_get_prop(Adapter, "intr_adaptive", 0, 1, 1,
   3862 	    &propval);
   3863 	Adapter->intr_adaptive = (propval == 1);
   3864 
   3865 	/*
   3866 	 * Hardware checksum enable/disable parameter
   3867 	 */
   3868 	(void) e1000g_get_prop(Adapter, "tx_hcksum_enable",
   3869 	    0, 1, DEFAULT_TX_HCKSUM_ENABLE, &propval);
   3870 	Adapter->tx_hcksum_enable = (propval == 1);
   3871 	/*
   3872 	 * Checksum on/off selection via global parameters.
   3873 	 *
   3874 	 * If the chip is flagged as not capable of (correctly)
   3875 	 * handling checksumming, we don't enable it on either
   3876 	 * Rx or Tx side.  Otherwise, we take this chip's settings
   3877 	 * from the patchable global defaults.
   3878 	 *
   3879 	 * We advertise our capabilities only if TX offload is
   3880 	 * enabled.  On receive, the stack will accept checksummed
   3881 	 * packets anyway, even if we haven't said we can deliver
   3882 	 * them.
   3883 	 */
   3884 	switch (hw->mac.type) {
   3885 		case e1000_82540:
   3886 		case e1000_82544:
   3887 		case e1000_82545:
   3888 		case e1000_82545_rev_3:
   3889 		case e1000_82546:
   3890 		case e1000_82546_rev_3:
   3891 		case e1000_82571:
   3892 		case e1000_82572:
   3893 		case e1000_82573:
   3894 		case e1000_80003es2lan:
   3895 			break;
   3896 		/*
   3897 		 * For the following Intel PRO/1000 chipsets, we have not
   3898 		 * tested the hardware checksum offload capability, so we
   3899 		 * disable the capability for them.
   3900 		 *	e1000_82542,
   3901 		 *	e1000_82543,
   3902 		 *	e1000_82541,
   3903 		 *	e1000_82541_rev_2,
   3904 		 *	e1000_82547,
   3905 		 *	e1000_82547_rev_2,
   3906 		 */
   3907 		default:
   3908 			Adapter->tx_hcksum_enable = B_FALSE;
   3909 	}
   3910 
   3911 	/*
   3912 	 * Large Send Offloading(LSO) Enable/Disable
   3913 	 * If the tx hardware checksum is not enabled, LSO should be
   3914 	 * disabled.
   3915 	 */
   3916 	(void) e1000g_get_prop(Adapter, "lso_enable",
   3917 	    0, 1, DEFAULT_LSO_ENABLE, &propval);
   3918 	Adapter->lso_enable = (propval == 1);
   3919 
   3920 	switch (hw->mac.type) {
   3921 		case e1000_82546:
   3922 		case e1000_82546_rev_3:
   3923 			if (Adapter->lso_enable)
   3924 				Adapter->lso_premature_issue = B_TRUE;
   3925 			/* FALLTHRU */
   3926 		case e1000_82571:
   3927 		case e1000_82572:
   3928 		case e1000_82573:
   3929 		case e1000_80003es2lan:
   3930 			break;
   3931 		default:
   3932 			Adapter->lso_enable = B_FALSE;
   3933 	}
   3934 
   3935 	if (!Adapter->tx_hcksum_enable) {
   3936 		Adapter->lso_premature_issue = B_FALSE;
   3937 		Adapter->lso_enable = B_FALSE;
   3938 	}
   3939 
   3940 	/*
   3941 	 * If mem_workaround_82546 is enabled, the rx buffer allocated by
   3942 	 * e1000_82545, e1000_82546 and e1000_82546_rev_3
   3943 	 * will not cross 64k boundary.
   3944 	 */
   3945 	(void) e1000g_get_prop(Adapter, "mem_workaround_82546",
   3946 	    0, 1, DEFAULT_MEM_WORKAROUND_82546, &propval);
   3947 	Adapter->mem_workaround_82546 = (propval == 1);
   3948 
   3949 	/*
   3950 	 * Max number of multicast addresses
   3951 	 */
   3952 	(void) e1000g_get_prop(Adapter, "mcast_max_num",
   3953 	    MIN_MCAST_NUM, MAX_MCAST_NUM, hw->mac.mta_reg_count * 32,
   3954 	    &propval);
   3955 	Adapter->mcast_max_num = propval;
   3956 }
   3957 
   3958 /*
   3959  * e1000g_get_prop - routine to read properties
   3960  *
   3961  * Get a user-configure property value out of the configuration
   3962  * file e1000g.conf.
   3963  *
   3964  * Caller provides name of the property, a default value, a minimum
   3965  * value, a maximum value and a pointer to the returned property
   3966  * value.
   3967  *
   3968  * Return B_TRUE if the configured value of the property is not a default
   3969  * value, otherwise return B_FALSE.
   3970  */
   3971 static boolean_t
   3972 e1000g_get_prop(struct e1000g *Adapter,	/* point to per-adapter structure */
   3973     char *propname,		/* name of the property */
   3974     int minval,			/* minimum acceptable value */
   3975     int maxval,			/* maximim acceptable value */
   3976     int defval,			/* default value */
   3977     int *propvalue)		/* property value return to caller */
   3978 {
   3979 	int propval;		/* value returned for requested property */
   3980 	int *props;		/* point to array of properties returned */
   3981 	uint_t nprops;		/* number of property value returned */
   3982 	boolean_t ret = B_TRUE;
   3983 
   3984 	/*
   3985 	 * get the array of properties from the config file
   3986 	 */
   3987 	if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, Adapter->dip,
   3988 	    DDI_PROP_DONTPASS, propname, &props, &nprops) == DDI_PROP_SUCCESS) {
   3989 		/* got some properties, test if we got enough */
   3990 		if (Adapter->instance < nprops) {
   3991 			propval = props[Adapter->instance];
   3992 		} else {
   3993 			/* not enough properties configured */
   3994 			propval = defval;
   3995 			E1000G_DEBUGLOG_2(Adapter, E1000G_INFO_LEVEL,
   3996 			    "Not Enough %s values found in e1000g.conf"
   3997 			    " - set to %d\n",
   3998 			    propname, propval);
   3999 			ret = B_FALSE;
   4000 		}
   4001 
   4002 		/* free memory allocated for properties */
   4003 		ddi_prop_free(props);
   4004 
   4005 	} else {
   4006 		propval = defval;
   4007 		ret = B_FALSE;
   4008 	}
   4009 
   4010 	/*
   4011 	 * enforce limits
   4012 	 */
   4013 	if (propval > maxval) {
   4014 		propval = maxval;
   4015 		E1000G_DEBUGLOG_2(Adapter, E1000G_INFO_LEVEL,
   4016 		    "Too High %s value in e1000g.conf - set to %d\n",
   4017 		    propname, propval);
   4018 	}
   4019 
   4020 	if (propval < minval) {
   4021 		propval = minval;
   4022 		E1000G_DEBUGLOG_2(Adapter, E1000G_INFO_LEVEL,
   4023 		    "Too Low %s value in e1000g.conf - set to %d\n",
   4024 		    propname, propval);
   4025 	}
   4026 
   4027 	*propvalue = propval;
   4028 	return (ret);
   4029 }
   4030 
   4031 static boolean_t
   4032 e1000g_link_check(struct e1000g *Adapter)
   4033 {
   4034 	uint16_t speed, duplex, phydata;
   4035 	boolean_t link_changed = B_FALSE;
   4036 	struct e1000_hw *hw;
   4037 	uint32_t reg_tarc;
   4038 
   4039 	hw = &Adapter->shared;
   4040 
   4041 	if (e1000g_link_up(Adapter)) {
   4042 		/*
   4043 		 * The Link is up, check whether it was marked as down earlier
   4044 		 */
   4045 		if (Adapter->link_state != LINK_STATE_UP) {
   4046 			(void) e1000_get_speed_and_duplex(hw, &speed, &duplex);
   4047 			Adapter->link_speed = speed;
   4048 			Adapter->link_duplex = duplex;
   4049 			Adapter->link_state = LINK_STATE_UP;
   4050 			link_changed = B_TRUE;
   4051 
   4052 			if (Adapter->link_speed == SPEED_1000)
   4053 				Adapter->stall_threshold = TX_STALL_TIME_2S;
   4054 			else
   4055 				Adapter->stall_threshold = TX_STALL_TIME_8S;
   4056 
   4057 			Adapter->tx_link_down_timeout = 0;
   4058 
   4059 			if ((hw->mac.type == e1000_82571) ||
   4060 			    (hw->mac.type == e1000_82572)) {
   4061 				reg_tarc = E1000_READ_REG(hw, E1000_TARC(0));
   4062 				if (speed == SPEED_1000)
   4063 					reg_tarc |= (1 << 21);
   4064 				else
   4065 					reg_tarc &= ~(1 << 21);
   4066 				E1000_WRITE_REG(hw, E1000_TARC(0), reg_tarc);
   4067 			}
   4068 		}
   4069 		Adapter->smartspeed = 0;
   4070 	} else {
   4071 		if (Adapter->link_state != LINK_STATE_DOWN) {
   4072 			Adapter->link_speed = 0;
   4073 			Adapter->link_duplex = 0;
   4074 			Adapter->link_state = LINK_STATE_DOWN;
   4075 			link_changed = B_TRUE;
   4076 
   4077 			/*
   4078 			 * SmartSpeed workaround for Tabor/TanaX, When the
   4079 			 * driver loses link disable auto master/slave
   4080 			 * resolution.
   4081 			 */
   4082 			if (hw->phy.type == e1000_phy_igp) {
   4083 				(void) e1000_read_phy_reg(hw,
   4084 				    PHY_1000T_CTRL, &phydata);
   4085 				phydata |= CR_1000T_MS_ENABLE;
   4086 				(void) e1000_write_phy_reg(hw,
   4087 				    PHY_1000T_CTRL, phydata);
   4088 			}
   4089 		} else {
   4090 			e1000g_smartspeed(Adapter);
   4091 		}
   4092 
   4093 		if (Adapter->e1000g_state & E1000G_STARTED) {
   4094 			if (Adapter->tx_link_down_timeout <
   4095 			    MAX_TX_LINK_DOWN_TIMEOUT) {
   4096 				Adapter->tx_link_down_timeout++;
   4097 			} else if (Adapter->tx_link_down_timeout ==
   4098 			    MAX_TX_LINK_DOWN_TIMEOUT) {
   4099 				e1000g_tx_clean(Adapter);
   4100 				Adapter->tx_link_down_timeout++;
   4101 			}
   4102 		}
   4103 	}
   4104 
   4105 	if (e1000g_check_acc_handle(Adapter->osdep.reg_handle) != DDI_FM_OK)
   4106 		ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_DEGRADED);
   4107 
   4108 	return (link_changed);
   4109 }
   4110 
   4111 /*
   4112  * e1000g_reset_link - Using the link properties to setup the link
   4113  */
   4114 int
   4115 e1000g_reset_link(struct e1000g *Adapter)
   4116 {
   4117 	struct e1000_mac_info *mac;
   4118 	struct e1000_phy_info *phy;
   4119 	struct e1000_hw *hw;
   4120 	boolean_t invalid;
   4121 
   4122 	mac = &Adapter->shared.mac;
   4123 	phy = &Adapter->shared.phy;
   4124 	hw = &Adapter->shared;
   4125 	invalid = B_FALSE;
   4126 
   4127 	if (hw->phy.media_type != e1000_media_type_copper)
   4128 		goto out;
   4129 
   4130 	if (Adapter->param_adv_autoneg == 1) {
   4131 		mac->autoneg = B_TRUE;
   4132 		phy->autoneg_advertised = 0;
   4133 
   4134 		/*
   4135 		 * 1000hdx is not supported for autonegotiation
   4136 		 */
   4137 		if (Adapter->param_adv_1000fdx == 1)
   4138 			phy->autoneg_advertised |= ADVERTISE_1000_FULL;
   4139 
   4140 		if (Adapter->param_adv_100fdx == 1)
   4141 			phy->autoneg_advertised |= ADVERTISE_100_FULL;
   4142 
   4143 		if (Adapter->param_adv_100hdx == 1)
   4144 			phy->autoneg_advertised |= ADVERTISE_100_HALF;
   4145 
   4146 		if (Adapter->param_adv_10fdx == 1)
   4147 			phy->autoneg_advertised |= ADVERTISE_10_FULL;
   4148 
   4149 		if (Adapter->param_adv_10hdx == 1)
   4150 			phy->autoneg_advertised |= ADVERTISE_10_HALF;
   4151 
   4152 		if (phy->autoneg_advertised == 0)
   4153 			invalid = B_TRUE;
   4154 	} else {
   4155 		mac->autoneg = B_FALSE;
   4156 
   4157 		/*
   4158 		 * For Intel copper cards, 1000fdx and 1000hdx are not
   4159 		 * supported for forced link
   4160 		 */
   4161 		if (Adapter->param_adv_100fdx == 1)
   4162 			mac->forced_speed_duplex = ADVERTISE_100_FULL;
   4163 		else if (Adapter->param_adv_100hdx == 1)
   4164 			mac->forced_speed_duplex = ADVERTISE_100_HALF;
   4165 		else if (Adapter->param_adv_10fdx == 1)
   4166 			mac->forced_speed_duplex = ADVERTISE_10_FULL;
   4167 		else if (Adapter->param_adv_10hdx == 1)
   4168 			mac->forced_speed_duplex = ADVERTISE_10_HALF;
   4169 		else
   4170 			invalid = B_TRUE;
   4171 
   4172 	}
   4173 
   4174 	if (invalid) {
   4175 		e1000g_log(Adapter, CE_WARN,
   4176 		    "Invalid link settings. Setup link to "
   4177 		    "support autonegotiation with all link capabilities.");
   4178 		mac->autoneg = B_TRUE;
   4179 		phy->autoneg_advertised = AUTONEG_ADVERTISE_SPEED_DEFAULT;
   4180 	}
   4181 
   4182 out:
   4183 	return (e1000_setup_link(&Adapter->shared));
   4184 }
   4185 
   4186 static void
   4187 e1000g_timer_tx_resched(struct e1000g *Adapter)
   4188 {
   4189 	e1000g_tx_ring_t *tx_ring = Adapter->tx_ring;
   4190 
   4191 	rw_enter(&Adapter->chip_lock, RW_READER);
   4192 
   4193 	if (tx_ring->resched_needed &&
   4194 	    ((ddi_get_lbolt() - tx_ring->resched_timestamp) >
   4195 	    drv_usectohz(1000000)) &&
   4196 	    (Adapter->e1000g_state & E1000G_STARTED) &&
   4197 	    (tx_ring->tbd_avail >= DEFAULT_TX_NO_RESOURCE)) {
   4198 		tx_ring->resched_needed = B_FALSE;
   4199 		mac_tx_update(Adapter->mh);
   4200 		E1000G_STAT(tx_ring->stat_reschedule);
   4201 		E1000G_STAT(tx_ring->stat_timer_reschedule);
   4202 	}
   4203 
   4204 	rw_exit(&Adapter->chip_lock);
   4205 }
   4206 
   4207 static void
   4208 e1000g_local_timer(void *ws)
   4209 {
   4210 	struct e1000g *Adapter = (struct e1000g *)ws;
   4211 	struct e1000_hw *hw;
   4212 	e1000g_ether_addr_t ether_addr;
   4213 	boolean_t link_changed;
   4214 
   4215 	hw = &Adapter->shared;
   4216 
   4217 	if (Adapter->e1000g_state & E1000G_ERROR) {
   4218 		rw_enter(&Adapter->chip_lock, RW_WRITER);
   4219 		Adapter->e1000g_state &= ~E1000G_ERROR;
   4220 		rw_exit(&Adapter->chip_lock);
   4221 
   4222 		Adapter->reset_count++;
   4223 		if (e1000g_global_reset(Adapter)) {
   4224 			ddi_fm_service_impact(Adapter->dip,
   4225 			    DDI_SERVICE_RESTORED);
   4226 			e1000g_timer_tx_resched(Adapter);
   4227 		} else
   4228 			ddi_fm_service_impact(Adapter->dip,
   4229 			    DDI_SERVICE_LOST);
   4230 		return;
   4231 	}
   4232 
   4233 	if (e1000g_stall_check(Adapter)) {
   4234 		E1000G_DEBUGLOG_0(Adapter, E1000G_INFO_LEVEL,
   4235 		    "Tx stall detected. Activate automatic recovery.\n");
   4236 		e1000g_fm_ereport(Adapter, DDI_FM_DEVICE_STALL);
   4237 		ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_LOST);
   4238 		Adapter->reset_count++;
   4239 		if (e1000g_reset_adapter(Adapter)) {
   4240 			ddi_fm_service_impact(Adapter->dip,
   4241 			    DDI_SERVICE_RESTORED);
   4242 			e1000g_timer_tx_resched(Adapter);
   4243 		}
   4244 		return;
   4245 	}
   4246 
   4247 	link_changed = B_FALSE;
   4248 	rw_enter(&Adapter->chip_lock, RW_READER);
   4249 	if (Adapter->link_complete)
   4250 		link_changed = e1000g_link_check(Adapter);
   4251 	rw_exit(&Adapter->chip_lock);
   4252 
   4253 	if (link_changed) {
   4254 		if (!Adapter->reset_flag &&
   4255 		    (Adapter->e1000g_state & E1000G_STARTED) &&
   4256 		    !(Adapter->e1000g_state & E1000G_SUSPENDED))
   4257 			mac_link_update(Adapter->mh, Adapter->link_state);
   4258 		if (Adapter->link_state == LINK_STATE_UP)
   4259 			Adapter->reset_flag = B_FALSE;
   4260 	}
   4261 	/*
   4262 	 * Workaround for esb2. Data stuck in fifo on a link
   4263 	 * down event. Reset the adapter to recover it.
   4264 	 */
   4265 	if (Adapter->esb2_workaround) {
   4266 		Adapter->esb2_workaround = B_FALSE;
   4267 		(void) e1000g_reset_adapter(Adapter);
   4268 		return;
   4269 	}
   4270 
   4271 	/*
   4272 	 * With 82571 controllers, any locally administered address will
   4273 	 * be overwritten when there is a reset on the other port.
   4274 	 * Detect this circumstance and correct it.
   4275 	 */
   4276 	if ((hw->mac.type == e1000_82571) &&
   4277 	    (e1000_get_laa_state_82571(hw) == B_TRUE)) {
   4278 		ether_addr.reg.low = E1000_READ_REG_ARRAY(hw, E1000_RA, 0);
   4279 		ether_addr.reg.high = E1000_READ_REG_ARRAY(hw, E1000_RA, 1);
   4280 
   4281 		ether_addr.reg.low = ntohl(ether_addr.reg.low);
   4282 		ether_addr.reg.high = ntohl(ether_addr.reg.high);
   4283 
   4284 		if ((ether_addr.mac.addr[5] != hw->mac.addr[0]) ||
   4285 		    (ether_addr.mac.addr[4] != hw->mac.addr[1]) ||
   4286 		    (ether_addr.mac.addr[3] != hw->mac.addr[2]) ||
   4287 		    (ether_addr.mac.addr[2] != hw->mac.addr[3]) ||
   4288 		    (ether_addr.mac.addr[1] != hw->mac.addr[4]) ||
   4289 		    (ether_addr.mac.addr[0] != hw->mac.addr[5])) {
   4290 			e1000_rar_set(hw, hw->mac.addr, 0);
   4291 		}
   4292 	}
   4293 
   4294 	/*
   4295 	 * Long TTL workaround for 82541/82547
   4296 	 */
   4297 	(void) e1000_igp_ttl_workaround_82547(hw);
   4298 
   4299 	/*
   4300 	 * Check for Adaptive IFS settings If there are lots of collisions
   4301 	 * change the value in steps...
   4302 	 * These properties should only be set for 10/100
   4303 	 */
   4304 	if ((hw->phy.media_type == e1000_media_type_copper) &&
   4305 	    ((Adapter->link_speed == SPEED_100) ||
   4306 	    (Adapter->link_speed == SPEED_10))) {
   4307 		e1000_update_adaptive(hw);
   4308 	}
   4309 	/*
   4310 	 * Set Timer Interrupts
   4311 	 */
   4312 	E1000_WRITE_REG(hw, E1000_ICS, E1000_IMS_RXT0);
   4313 
   4314 	if (e1000g_check_acc_handle(Adapter->osdep.reg_handle) != DDI_FM_OK)
   4315 		ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_DEGRADED);
   4316 	else
   4317 		e1000g_timer_tx_resched(Adapter);
   4318 
   4319 	restart_watchdog_timer(Adapter);
   4320 }
   4321 
   4322 /*
   4323  * The function e1000g_link_timer() is called when the timer for link setup
   4324  * is expired, which indicates the completion of the link setup. The link
   4325  * state will not be updated until the link setup is completed. And the
   4326  * link state will not be sent to the upper layer through mac_link_update()
   4327  * in this function. It will be updated in the local timer routine or the
   4328  * interrupt service routine after the interface is started (plumbed).
   4329  */
   4330 static void
   4331 e1000g_link_timer(void *arg)
   4332 {
   4333 	struct e1000g *Adapter = (struct e1000g *)arg;
   4334 
   4335 	mutex_enter(&Adapter->link_lock);
   4336 	Adapter->link_complete = B_TRUE;
   4337 	Adapter->link_tid = 0;
   4338 	mutex_exit(&Adapter->link_lock);
   4339 }
   4340 
   4341 /*
   4342  * e1000g_force_speed_duplex - read forced speed/duplex out of e1000g.conf
   4343  *
   4344  * This function read the forced speed and duplex for 10/100 Mbps speeds
   4345  * and also for 1000 Mbps speeds from the e1000g.conf file
   4346  */
   4347 static void
   4348 e1000g_force_speed_duplex(struct e1000g *Adapter)
   4349 {
   4350 	int forced;
   4351 	int propval;
   4352 	struct e1000_mac_info *mac = &Adapter->shared.mac;
   4353 	struct e1000_phy_info *phy = &Adapter->shared.phy;
   4354 
   4355 	/*
   4356 	 * get value out of config file
   4357 	 */
   4358 	(void) e1000g_get_prop(Adapter, "ForceSpeedDuplex",
   4359 	    GDIAG_10_HALF, GDIAG_ANY, GDIAG_ANY, &forced);
   4360 
   4361 	switch (forced) {
   4362 	case GDIAG_10_HALF:
   4363 		/*
   4364 		 * Disable Auto Negotiation
   4365 		 */
   4366 		mac->autoneg = B_FALSE;
   4367 		mac->forced_speed_duplex = ADVERTISE_10_HALF;
   4368 		break;
   4369 	case GDIAG_10_FULL:
   4370 		/*
   4371 		 * Disable Auto Negotiation
   4372 		 */
   4373 		mac->autoneg = B_FALSE;
   4374 		mac->forced_speed_duplex = ADVERTISE_10_FULL;
   4375 		break;
   4376 	case GDIAG_100_HALF:
   4377 		/*
   4378 		 * Disable Auto Negotiation
   4379 		 */
   4380 		mac->autoneg = B_FALSE;
   4381 		mac->forced_speed_duplex = ADVERTISE_100_HALF;
   4382 		break;
   4383 	case GDIAG_100_FULL:
   4384 		/*
   4385 		 * Disable Auto Negotiation
   4386 		 */
   4387 		mac->autoneg = B_FALSE;
   4388 		mac->forced_speed_duplex = ADVERTISE_100_FULL;
   4389 		break;
   4390 	case GDIAG_1000_FULL:
   4391 		/*
   4392 		 * The gigabit spec requires autonegotiation.  Therefore,
   4393 		 * when the user wants to force the speed to 1000Mbps, we
   4394 		 * enable AutoNeg, but only allow the harware to advertise
   4395 		 * 1000Mbps.  This is different from 10/100 operation, where
   4396 		 * we are allowed to link without any negotiation.
   4397 		 */
   4398 		mac->autoneg = B_TRUE;
   4399 		phy->autoneg_advertised = ADVERTISE_1000_FULL;
   4400 		break;
   4401 	default:	/* obey the setting of AutoNegAdvertised */
   4402 		mac->autoneg = B_TRUE;
   4403 		(void) e1000g_get_prop(Adapter, "AutoNegAdvertised",
   4404 		    0, AUTONEG_ADVERTISE_SPEED_DEFAULT,
   4405 		    AUTONEG_ADVERTISE_SPEED_DEFAULT, &propval);
   4406 		phy->autoneg_advertised = (uint16_t)propval;
   4407 		break;
   4408 	}	/* switch */
   4409 }
   4410 
   4411 /*
   4412  * e1000g_get_max_frame_size - get jumbo frame setting from e1000g.conf
   4413  *
   4414  * This function reads MaxFrameSize from e1000g.conf
   4415  */
   4416 static void
   4417 e1000g_get_max_frame_size(struct e1000g *Adapter)
   4418 {
   4419 	int max_frame;
   4420 
   4421 	/*
   4422 	 * get value out of config file
   4423 	 */
   4424 	(void) e1000g_get_prop(Adapter, "MaxFrameSize", 0, 3, 0,
   4425 	    &max_frame);
   4426 
   4427 	switch (max_frame) {
   4428 	case 0:
   4429 		Adapter->default_mtu = ETHERMTU;
   4430 		break;
   4431 	/*
   4432 	 * To avoid excessive memory allocation for rx buffers,
   4433 	 * the bytes of E1000G_IPALIGNPRESERVEROOM are reserved.
   4434 	 */
   4435 	case 1:
   4436 		Adapter->default_mtu = FRAME_SIZE_UPTO_4K -
   4437 		    sizeof (struct ether_vlan_header) - ETHERFCSL -
   4438 		    E1000G_IPALIGNPRESERVEROOM;
   4439 		break;
   4440 	case 2:
   4441 		Adapter->default_mtu = FRAME_SIZE_UPTO_8K -
   4442 		    sizeof (struct ether_vlan_header) - ETHERFCSL -
   4443 		    E1000G_IPALIGNPRESERVEROOM;
   4444 		break;
   4445 	case 3:
   4446 		Adapter->default_mtu = FRAME_SIZE_UPTO_16K -
   4447 		    sizeof (struct ether_vlan_header) - ETHERFCSL -
   4448 		    E1000G_IPALIGNPRESERVEROOM;
   4449 		break;
   4450 	default:
   4451 		Adapter->default_mtu = ETHERMTU;
   4452 		break;
   4453 	}	/* switch */
   4454 
   4455 	/*
   4456 	 * If the user configed MTU is larger than the deivce's maximum MTU,
   4457 	 * the MTU is set to the deivce's maximum value.
   4458 	 */
   4459 	if (Adapter->default_mtu > Adapter->max_mtu)
   4460 		Adapter->default_mtu = Adapter->max_mtu;
   4461 
   4462 	Adapter->max_frame_size = e1000g_mtu2maxframe(Adapter->default_mtu);
   4463 }
   4464 
   4465 /*
   4466  * e1000g_pch_limits - Apply limits of the PCH silicon type
   4467  *
   4468  * At any frame size larger than the ethernet default,
   4469  * prevent linking at 10/100 speeds.
   4470  */
   4471 static void
   4472 e1000g_pch_limits(struct e1000g *Adapter)
   4473 {
   4474 	struct e1000_hw *hw = &Adapter->shared;
   4475 
   4476 	/* only applies to PCH silicon type */
   4477 	if (hw->mac.type != e1000_pchlan)
   4478 		return;
   4479 
   4480 	/* only applies to frames larger than ethernet default */
   4481 	if (Adapter->max_frame_size > DEFAULT_FRAME_SIZE) {
   4482 		hw->mac.autoneg = B_TRUE;
   4483 		hw->phy.autoneg_advertised = ADVERTISE_1000_FULL;
   4484 
   4485 		Adapter->param_adv_autoneg = 1;
   4486 		Adapter->param_adv_1000fdx = 1;
   4487 
   4488 		Adapter->param_adv_100fdx = 0;
   4489 		Adapter->param_adv_100hdx = 0;
   4490 		Adapter->param_adv_10fdx = 0;
   4491 		Adapter->param_adv_10hdx = 0;
   4492 
   4493 		e1000g_param_sync(Adapter);
   4494 	}
   4495 }
   4496 
   4497 /*
   4498  * e1000g_mtu2maxframe - convert given MTU to maximum frame size
   4499  */
   4500 static uint32_t
   4501 e1000g_mtu2maxframe(uint32_t mtu)
   4502 {
   4503 	uint32_t maxframe;
   4504 
   4505 	maxframe = mtu + sizeof (struct ether_vlan_header) + ETHERFCSL;
   4506 
   4507 	return (maxframe);
   4508 }
   4509 
   4510 static void
   4511 arm_watchdog_timer(struct e1000g *Adapter)
   4512 {
   4513 	Adapter->watchdog_tid =
   4514 	    timeout(e1000g_local_timer,
   4515 	    (void *)Adapter, 1 * drv_usectohz(1000000));
   4516 }
   4517 #pragma inline(arm_watchdog_timer)
   4518 
   4519 static void
   4520 enable_watchdog_timer(struct e1000g *Adapter)
   4521 {
   4522 	mutex_enter(&Adapter->watchdog_lock);
   4523 
   4524 	if (!Adapter->watchdog_timer_enabled) {
   4525 		Adapter->watchdog_timer_enabled = B_TRUE;
   4526 		Adapter->watchdog_timer_started = B_TRUE;
   4527 		arm_watchdog_timer(Adapter);
   4528 	}
   4529 
   4530 	mutex_exit(&Adapter->watchdog_lock);
   4531 }
   4532 
   4533 static void
   4534 disable_watchdog_timer(struct e1000g *Adapter)
   4535 {
   4536 	timeout_id_t tid;
   4537 
   4538 	mutex_enter(&Adapter->watchdog_lock);
   4539 
   4540 	Adapter->watchdog_timer_enabled = B_FALSE;
   4541 	Adapter->watchdog_timer_started = B_FALSE;
   4542 	tid = Adapter->watchdog_tid;
   4543 	Adapter->watchdog_tid = 0;
   4544 
   4545 	mutex_exit(&Adapter->watchdog_lock);
   4546 
   4547 	if (tid != 0)
   4548 		(void) untimeout(tid);
   4549 }
   4550 
   4551 static void
   4552 start_watchdog_timer(struct e1000g *Adapter)
   4553 {
   4554 	mutex_enter(&Adapter->watchdog_lock);
   4555 
   4556 	if (Adapter->watchdog_timer_enabled) {
   4557 		if (!Adapter->watchdog_timer_started) {
   4558 			Adapter->watchdog_timer_started = B_TRUE;
   4559 			arm_watchdog_timer(Adapter);
   4560 		}
   4561 	}
   4562 
   4563 	mutex_exit(&Adapter->watchdog_lock);
   4564 }
   4565 
   4566 static void
   4567 restart_watchdog_timer(struct e1000g *Adapter)
   4568 {
   4569 	mutex_enter(&Adapter->watchdog_lock);
   4570 
   4571 	if (Adapter->watchdog_timer_started)
   4572 		arm_watchdog_timer(Adapter);
   4573 
   4574 	mutex_exit(&Adapter->watchdog_lock);
   4575 }
   4576 
   4577 static void
   4578 stop_watchdog_timer(struct e1000g *Adapter)
   4579 {
   4580 	timeout_id_t tid;
   4581 
   4582 	mutex_enter(&Adapter->watchdog_lock);
   4583 
   4584 	Adapter->watchdog_timer_started = B_FALSE;
   4585 	tid = Adapter->watchdog_tid;
   4586 	Adapter->watchdog_tid = 0;
   4587 
   4588 	mutex_exit(&Adapter->watchdog_lock);
   4589 
   4590 	if (tid != 0)
   4591 		(void) untimeout(tid);
   4592 }
   4593 
   4594 static void
   4595 stop_link_timer(struct e1000g *Adapter)
   4596 {
   4597 	timeout_id_t tid;
   4598 
   4599 	/* Disable the link timer */
   4600 	mutex_enter(&Adapter->link_lock);
   4601 
   4602 	tid = Adapter->link_tid;
   4603 	Adapter->link_tid = 0;
   4604 
   4605 	mutex_exit(&Adapter->link_lock);
   4606 
   4607 	if (tid != 0)
   4608 		(void) untimeout(tid);
   4609 }
   4610 
   4611 static void
   4612 stop_82547_timer(e1000g_tx_ring_t *tx_ring)
   4613 {
   4614 	timeout_id_t tid;
   4615 
   4616 	/* Disable the tx timer for 82547 chipset */
   4617 	mutex_enter(&tx_ring->tx_lock);
   4618 
   4619 	tx_ring->timer_enable_82547 = B_FALSE;
   4620 	tid = tx_ring->timer_id_82547;
   4621 	tx_ring->timer_id_82547 = 0;
   4622 
   4623 	mutex_exit(&tx_ring->tx_lock);
   4624 
   4625 	if (tid != 0)
   4626 		(void) untimeout(tid);
   4627 }
   4628 
   4629 void
   4630 e1000g_clear_interrupt(struct e1000g *Adapter)
   4631 {
   4632 	E1000_WRITE_REG(&Adapter->shared, E1000_IMC,
   4633 	    0xffffffff & ~E1000_IMS_RXSEQ);
   4634 }
   4635 
   4636 void
   4637 e1000g_mask_interrupt(struct e1000g *Adapter)
   4638 {
   4639 	E1000_WRITE_REG(&Adapter->shared, E1000_IMS,
   4640 	    IMS_ENABLE_MASK & ~E1000_IMS_TXDW);
   4641 
   4642 	if (Adapter->tx_intr_enable)
   4643 		e1000g_mask_tx_interrupt(Adapter);
   4644 }
   4645 
   4646 /*
   4647  * This routine is called by e1000g_quiesce(), therefore must not block.
   4648  */
   4649 void
   4650 e1000g_clear_all_interrupts(struct e1000g *Adapter)
   4651 {
   4652 	E1000_WRITE_REG(&Adapter->shared, E1000_IMC, 0xffffffff);
   4653 }
   4654 
   4655 void
   4656 e1000g_mask_tx_interrupt(struct e1000g *Adapter)
   4657 {
   4658 	E1000_WRITE_REG(&Adapter->shared, E1000_IMS, E1000_IMS_TXDW);
   4659 }
   4660 
   4661 void
   4662 e1000g_clear_tx_interrupt(struct e1000g *Adapter)
   4663 {
   4664 	E1000_WRITE_REG(&Adapter->shared, E1000_IMC, E1000_IMS_TXDW);
   4665 }
   4666 
   4667 static void
   4668 e1000g_smartspeed(struct e1000g *Adapter)
   4669 {
   4670 	struct e1000_hw *hw = &Adapter->shared;
   4671 	uint16_t phy_status;
   4672 	uint16_t phy_ctrl;
   4673 
   4674 	/*
   4675 	 * If we're not T-or-T, or we're not autoneg'ing, or we're not
   4676 	 * advertising 1000Full, we don't even use the workaround
   4677 	 */
   4678 	if ((hw->phy.type != e1000_phy_igp) ||
   4679 	    !hw->mac.autoneg ||
   4680 	    !(hw->phy.autoneg_advertised & ADVERTISE_1000_FULL))
   4681 		return;
   4682 
   4683 	/*
   4684 	 * True if this is the first call of this function or after every
   4685 	 * 30 seconds of not having link
   4686 	 */
   4687 	if (Adapter->smartspeed == 0) {
   4688 		/*
   4689 		 * If Master/Slave config fault is asserted twice, we
   4690 		 * assume back-to-back
   4691 		 */
   4692 		(void) e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_status);
   4693 		if (!(phy_status & SR_1000T_MS_CONFIG_FAULT))
   4694 			return;
   4695 
   4696 		(void) e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_status);
   4697 		if (!(phy_status & SR_1000T_MS_CONFIG_FAULT))
   4698 			return;
   4699 		/*
   4700 		 * We're assuming back-2-back because our status register
   4701 		 * insists! there's a fault in the master/slave
   4702 		 * relationship that was "negotiated"
   4703 		 */
   4704 		(void) e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_ctrl);
   4705 		/*
   4706 		 * Is the phy configured for manual configuration of
   4707 		 * master/slave?
   4708 		 */
   4709 		if (phy_ctrl & CR_1000T_MS_ENABLE) {
   4710 			/*
   4711 			 * Yes.  Then disable manual configuration (enable
   4712 			 * auto configuration) of master/slave
   4713 			 */
   4714 			phy_ctrl &= ~CR_1000T_MS_ENABLE;
   4715 			(void) e1000_write_phy_reg(hw,
   4716 			    PHY_1000T_CTRL, phy_ctrl);
   4717 			/*
   4718 			 * Effectively starting the clock
   4719 			 */
   4720 			Adapter->smartspeed++;
   4721 			/*
   4722 			 * Restart autonegotiation
   4723 			 */
   4724 			if (!e1000_phy_setup_autoneg(hw) &&
   4725 			    !e1000_read_phy_reg(hw, PHY_CONTROL, &phy_ctrl)) {
   4726 				phy_ctrl |= (MII_CR_AUTO_NEG_EN |
   4727 				    MII_CR_RESTART_AUTO_NEG);
   4728 				(void) e1000_write_phy_reg(hw,
   4729 				    PHY_CONTROL, phy_ctrl);
   4730 			}
   4731 		}
   4732 		return;
   4733 		/*
   4734 		 * Has 6 seconds transpired still without link? Remember,
   4735 		 * you should reset the smartspeed counter once you obtain
   4736 		 * link
   4737 		 */
   4738 	} else if (Adapter->smartspeed == E1000_SMARTSPEED_DOWNSHIFT) {
   4739 		/*
   4740 		 * Yes.  Remember, we did at the start determine that
   4741 		 * there's a master/slave configuration fault, so we're
   4742 		 * still assuming there's someone on the other end, but we
   4743 		 * just haven't yet been able to talk to it. We then
   4744 		 * re-enable auto configuration of master/slave to see if
   4745 		 * we're running 2/3 pair cables.
   4746 		 */
   4747 		/*
   4748 		 * If still no link, perhaps using 2/3 pair cable
   4749 		 */
   4750 		(void) e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_ctrl);
   4751 		phy_ctrl |= CR_1000T_MS_ENABLE;
   4752 		(void) e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_ctrl);
   4753 		/*
   4754 		 * Restart autoneg with phy enabled for manual
   4755 		 * configuration of master/slave
   4756 		 */
   4757 		if (!e1000_phy_setup_autoneg(hw) &&
   4758 		    !e1000_read_phy_reg(hw, PHY_CONTROL, &phy_ctrl)) {
   4759 			phy_ctrl |=
   4760 			    (MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG);
   4761 			(void) e1000_write_phy_reg(hw, PHY_CONTROL, phy_ctrl);
   4762 		}
   4763 		/*
   4764 		 * Hopefully, there are no more faults and we've obtained
   4765 		 * link as a result.
   4766 		 */
   4767 	}
   4768 	/*
   4769 	 * Restart process after E1000_SMARTSPEED_MAX iterations (30
   4770 	 * seconds)
   4771 	 */
   4772 	if (Adapter->smartspeed++ == E1000_SMARTSPEED_MAX)
   4773 		Adapter->smartspeed = 0;
   4774 }
   4775 
   4776 static boolean_t
   4777 is_valid_mac_addr(uint8_t *mac_addr)
   4778 {
   4779 	const uint8_t addr_test1[6] = { 0, 0, 0, 0, 0, 0 };
   4780 	const uint8_t addr_test2[6] =
   4781 	    { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
   4782 
   4783 	if (!(bcmp(addr_test1, mac_addr, ETHERADDRL)) ||
   4784 	    !(bcmp(addr_test2, mac_addr, ETHERADDRL)))
   4785 		return (B_FALSE);
   4786 
   4787 	return (B_TRUE);
   4788 }
   4789 
   4790 /*
   4791  * e1000g_stall_check - check for tx stall
   4792  *
   4793  * This function checks if the adapter is stalled (in transmit).
   4794  *
   4795  * It is called each time the watchdog timeout is invoked.
   4796  * If the transmit descriptor reclaim continuously fails,
   4797  * the watchdog value will increment by 1. If the watchdog
   4798  * value exceeds the threshold, the adapter is assumed to
   4799  * have stalled and need to be reset.
   4800  */
   4801 static boolean_t
   4802 e1000g_stall_check(struct e1000g *Adapter)
   4803 {
   4804 	e1000g_tx_ring_t *tx_ring;
   4805 
   4806 	tx_ring = Adapter->tx_ring;
   4807 
   4808 	if (Adapter->link_state != LINK_STATE_UP)
   4809 		return (B_FALSE);
   4810 
   4811 	(void) e1000g_recycle(tx_ring);
   4812 
   4813 	if (Adapter->stall_flag)
   4814 		return (B_TRUE);
   4815 
   4816 	return (B_FALSE);
   4817 }
   4818 
   4819 #ifdef E1000G_DEBUG
   4820 static enum ioc_reply
   4821 e1000g_pp_ioctl(struct e1000g *e1000gp, struct iocblk *iocp, mblk_t *mp)
   4822 {
   4823 	void (*ppfn)(struct e1000g *e1000gp, e1000g_peekpoke_t *ppd);
   4824 	e1000g_peekpoke_t *ppd;
   4825 	uint64_t mem_va;
   4826 	uint64_t maxoff;
   4827 	boolean_t peek;
   4828 
   4829 	switch (iocp->ioc_cmd) {
   4830 
   4831 	case E1000G_IOC_REG_PEEK:
   4832 		peek = B_TRUE;
   4833 		break;
   4834 
   4835 	case E1000G_IOC_REG_POKE:
   4836 		peek = B_FALSE;
   4837 		break;
   4838 
   4839 	deault:
   4840 		E1000G_DEBUGLOG_1(e1000gp, E1000G_INFO_LEVEL,
   4841 		    "e1000g_diag_ioctl: invalid ioctl command 0x%X\n",
   4842 		    iocp->ioc_cmd);
   4843 		return (IOC_INVAL);
   4844 	}
   4845 
   4846 	/*
   4847 	 * Validate format of ioctl
   4848 	 */
   4849 	if (iocp->ioc_count != sizeof (e1000g_peekpoke_t))
   4850 		return (IOC_INVAL);
   4851 	if (mp->b_cont == NULL)
   4852 		return (IOC_INVAL);
   4853 
   4854 	ppd = (e1000g_peekpoke_t *)(uintptr_t)mp->b_cont->b_rptr;
   4855 
   4856 	/*
   4857 	 * Validate request parameters
   4858 	 */
   4859 	switch (ppd->pp_acc_space) {
   4860 
   4861 	default:
   4862 		E1000G_DEBUGLOG_1(e1000gp, E1000G_INFO_LEVEL,
   4863 		    "e1000g_diag_ioctl: invalid access space 0x%X\n",
   4864 		    ppd->pp_acc_space);
   4865 		return (IOC_INVAL);
   4866 
   4867 	case E1000G_PP_SPACE_REG:
   4868 		/*
   4869 		 * Memory-mapped I/O space
   4870 		 */
   4871 		ASSERT(ppd->pp_acc_size == 4);
   4872 		if (ppd->pp_acc_size != 4)
   4873 			return (IOC_INVAL);
   4874 
   4875 		if ((ppd->pp_acc_offset % ppd->pp_acc_size) != 0)
   4876 			return (IOC_INVAL);
   4877 
   4878 		mem_va = 0;
   4879 		maxoff = 0x10000;
   4880 		ppfn = peek ? e1000g_ioc_peek_reg : e1000g_ioc_poke_reg;
   4881 		break;
   4882 
   4883 	case E1000G_PP_SPACE_E1000G:
   4884 		/*
   4885 		 * E1000g data structure!
   4886 		 */
   4887 		mem_va = (uintptr_t)e1000gp;
   4888 		maxoff = sizeof (struct e1000g);
   4889 		ppfn = peek ? e1000g_ioc_peek_mem : e1000g_ioc_poke_mem;
   4890 		break;
   4891 
   4892 	}
   4893 
   4894 	if (ppd->pp_acc_offset >= maxoff)
   4895 		return (IOC_INVAL);
   4896 
   4897 	if (ppd->pp_acc_offset + ppd->pp_acc_size > maxoff)
   4898 		return (IOC_INVAL);
   4899 
   4900 	/*
   4901 	 * All OK - go!
   4902 	 */
   4903 	ppd->pp_acc_offset += mem_va;
   4904 	(*ppfn)(e1000gp, ppd);
   4905 	return (peek ? IOC_REPLY : IOC_ACK);
   4906 }
   4907 
   4908 static void
   4909 e1000g_ioc_peek_reg(struct e1000g *e1000gp, e1000g_peekpoke_t *ppd)
   4910 {
   4911 	ddi_acc_handle_t handle;
   4912 	uint32_t *regaddr;
   4913 
   4914 	handle = e1000gp->osdep.reg_handle;
   4915 	regaddr = (uint32_t *)((uintptr_t)e1000gp->shared.hw_addr +
   4916 	    (uintptr_t)ppd->pp_acc_offset);
   4917 
   4918 	ppd->pp_acc_data = ddi_get32(handle, regaddr);
   4919 }
   4920 
   4921 static void
   4922 e1000g_ioc_poke_reg(struct e1000g *e1000gp, e1000g_peekpoke_t *ppd)
   4923 {
   4924 	ddi_acc_handle_t handle;
   4925 	uint32_t *regaddr;
   4926 	uint32_t value;
   4927 
   4928 	handle = e1000gp->osdep.reg_handle;
   4929 	regaddr = (uint32_t *)((uintptr_t)e1000gp->shared.hw_addr +
   4930 	    (uintptr_t)ppd->pp_acc_offset);
   4931 	value = (uint32_t)ppd->pp_acc_data;
   4932 
   4933 	ddi_put32(handle, regaddr, value);
   4934 }
   4935 
   4936 static void
   4937 e1000g_ioc_peek_mem(struct e1000g *e1000gp, e1000g_peekpoke_t *ppd)
   4938 {
   4939 	uint64_t value;
   4940 	void *vaddr;
   4941 
   4942 	vaddr = (void *)(uintptr_t)ppd->pp_acc_offset;
   4943 
   4944 	switch (ppd->pp_acc_size) {
   4945 	case 1:
   4946 		value = *(uint8_t *)vaddr;
   4947 		break;
   4948 
   4949 	case 2:
   4950 		value = *(uint16_t *)vaddr;
   4951 		break;
   4952 
   4953 	case 4:
   4954 		value = *(uint32_t *)vaddr;
   4955 		break;
   4956 
   4957 	case 8:
   4958 		value = *(uint64_t *)vaddr;
   4959 		break;
   4960 	}
   4961 
   4962 	E1000G_DEBUGLOG_4(e1000gp, E1000G_INFO_LEVEL,
   4963 	    "e1000g_ioc_peek_mem($%p, $%p) peeked 0x%llx from $%p\n",
   4964 	    (void *)e1000gp, (void *)ppd, value, vaddr);
   4965 
   4966 	ppd->pp_acc_data = value;
   4967 }
   4968 
   4969 static void
   4970 e1000g_ioc_poke_mem(struct e1000g *e1000gp, e1000g_peekpoke_t *ppd)
   4971 {
   4972 	uint64_t value;
   4973 	void *vaddr;
   4974 
   4975 	vaddr = (void *)(uintptr_t)ppd->pp_acc_offset;
   4976 	value = ppd->pp_acc_data;
   4977 
   4978 	E1000G_DEBUGLOG_4(e1000gp, E1000G_INFO_LEVEL,
   4979 	    "e1000g_ioc_poke_mem($%p, $%p) poking 0x%llx at $%p\n",
   4980 	    (void *)e1000gp, (void *)ppd, value, vaddr);
   4981 
   4982 	switch (ppd->pp_acc_size) {
   4983 	case 1:
   4984 		*(uint8_t *)vaddr = (uint8_t)value;
   4985 		break;
   4986 
   4987 	case 2:
   4988 		*(uint16_t *)vaddr = (uint16_t)value;
   4989 		break;
   4990 
   4991 	case 4:
   4992 		*(uint32_t *)vaddr = (uint32_t)value;
   4993 		break;
   4994 
   4995 	case 8:
   4996 		*(uint64_t *)vaddr = (uint64_t)value;
   4997 		break;
   4998 	}
   4999 }
   5000 #endif
   5001 
   5002 /*
   5003  * Loopback Support
   5004  */
   5005 static lb_property_t lb_normal =
   5006 	{ normal,	"normal",	E1000G_LB_NONE		};
   5007 static lb_property_t lb_external1000 =
   5008 	{ external,	"1000Mbps",	E1000G_LB_EXTERNAL_1000	};
   5009 static lb_property_t lb_external100 =
   5010 	{ external,	"100Mbps",	E1000G_LB_EXTERNAL_100	};
   5011 static lb_property_t lb_external10 =
   5012 	{ external,	"10Mbps",	E1000G_LB_EXTERNAL_10	};
   5013 static lb_property_t lb_phy =
   5014 	{ internal,	"PHY",		E1000G_LB_INTERNAL_PHY	};
   5015 
   5016 static enum ioc_reply
   5017 e1000g_loopback_ioctl(struct e1000g *Adapter, struct iocblk *iocp, mblk_t *mp)
   5018 {
   5019 	lb_info_sz_t *lbsp;
   5020 	lb_property_t *lbpp;
   5021 	struct e1000_hw *hw;
   5022 	uint32_t *lbmp;
   5023 	uint32_t size;
   5024 	uint32_t value;
   5025 
   5026 	hw = &Adapter->shared;
   5027 
   5028 	if (mp->b_cont == NULL)
   5029 		return (IOC_INVAL);
   5030 
   5031 	if (!e1000g_check_loopback_support(hw)) {
   5032 		e1000g_log(NULL, CE_WARN,
   5033 		    "Loopback is not supported on e1000g%d", Adapter->instance);
   5034 		return (IOC_INVAL);
   5035 	}
   5036 
   5037 	switch (iocp->ioc_cmd) {
   5038 	default:
   5039 		return (IOC_INVAL);
   5040 
   5041 	case LB_GET_INFO_SIZE:
   5042 		size = sizeof (lb_info_sz_t);
   5043 		if (iocp->ioc_count != size)
   5044 			return (IOC_INVAL);
   5045 
   5046 		rw_enter(&Adapter->chip_lock, RW_WRITER);
   5047 		e1000g_get_phy_state(Adapter);
   5048 
   5049 		/*
   5050 		 * Workaround for hardware faults. In order to get a stable
   5051 		 * state of phy, we will wait for a specific interval and
   5052 		 * try again. The time delay is an experiential value based
   5053 		 * on our testing.
   5054 		 */
   5055 		msec_delay(100);
   5056 		e1000g_get_phy_state(Adapter);
   5057 		rw_exit(&Adapter->chip_lock);
   5058 
   5059 		value = sizeof (lb_normal);
   5060 		if ((Adapter->phy_ext_status & IEEE_ESR_1000T_FD_CAPS) ||
   5061 		    (Adapter->phy_ext_status & IEEE_ESR_1000X_FD_CAPS) ||
   5062 		    (hw->phy.media_type == e1000_media_type_fiber) ||
   5063 		    (hw->phy.media_type == e1000_media_type_internal_serdes)) {
   5064 			value += sizeof (lb_phy);
   5065 			switch (hw->mac.type) {
   5066 			case e1000_82571:
   5067 			case e1000_82572:
   5068 			case e1000_80003es2lan:
   5069 				value += sizeof (lb_external1000);
   5070 				break;
   5071 			}
   5072 		}
   5073 		if ((Adapter->phy_status & MII_SR_100X_FD_CAPS) ||
   5074 		    (Adapter->phy_status & MII_SR_100T2_FD_CAPS))
   5075 			value += sizeof (lb_external100);
   5076 		if (Adapter->phy_status & MII_SR_10T_FD_CAPS)
   5077 			value += sizeof (lb_external10);
   5078 
   5079 		lbsp = (lb_info_sz_t *)(uintptr_t)mp->b_cont->b_rptr;
   5080 		*lbsp = value;
   5081 		break;
   5082 
   5083 	case LB_GET_INFO:
   5084 		value = sizeof (lb_normal);
   5085 		if ((Adapter->phy_ext_status & IEEE_ESR_1000T_FD_CAPS) ||
   5086 		    (Adapter->phy_ext_status & IEEE_ESR_1000X_FD_CAPS) ||
   5087 		    (hw->phy.media_type == e1000_media_type_fiber) ||
   5088 		    (hw->phy.media_type == e1000_media_type_internal_serdes)) {
   5089 			value += sizeof (lb_phy);
   5090 			switch (hw->mac.type) {
   5091 			case e1000_82571:
   5092 			case e1000_82572:
   5093 			case e1000_80003es2lan:
   5094 				value += sizeof (lb_external1000);
   5095 				break;
   5096 			}
   5097 		}
   5098 		if ((Adapter->phy_status & MII_SR_100X_FD_CAPS) ||
   5099 		    (Adapter->phy_status & MII_SR_100T2_FD_CAPS))
   5100 			value += sizeof (lb_external100);
   5101 		if (Adapter->phy_status & MII_SR_10T_FD_CAPS)
   5102 			value += sizeof (lb_external10);
   5103 
   5104 		size = value;
   5105 		if (iocp->ioc_count != size)
   5106 			return (IOC_INVAL);
   5107 
   5108 		value = 0;
   5109 		lbpp = (lb_property_t *)(uintptr_t)mp->b_cont->b_rptr;
   5110 		lbpp[value++] = lb_normal;
   5111 		if ((Adapter->phy_ext_status & IEEE_ESR_1000T_FD_CAPS) ||
   5112 		    (Adapter->phy_ext_status & IEEE_ESR_1000X_FD_CAPS) ||
   5113 		    (hw->phy.media_type == e1000_media_type_fiber) ||
   5114 		    (hw->phy.media_type == e1000_media_type_internal_serdes)) {
   5115 			lbpp[value++] = lb_phy;
   5116 			switch (hw->mac.type) {
   5117 			case e1000_82571:
   5118 			case e1000_82572:
   5119 			case e1000_80003es2lan:
   5120 				lbpp[value++] = lb_external1000;
   5121 				break;
   5122 			}
   5123 		}
   5124 		if ((Adapter->phy_status & MII_SR_100X_FD_CAPS) ||
   5125 		    (Adapter->phy_status & MII_SR_100T2_FD_CAPS))
   5126 			lbpp[value++] = lb_external100;
   5127 		if (Adapter->phy_status & MII_SR_10T_FD_CAPS)
   5128 			lbpp[value++] = lb_external10;
   5129 		break;
   5130 
   5131 	case LB_GET_MODE:
   5132 		size = sizeof (uint32_t);
   5133 		if (iocp->ioc_count != size)
   5134 			return (IOC_INVAL);
   5135 
   5136 		lbmp = (uint32_t *)(uintptr_t)mp->b_cont->b_rptr;
   5137 		*lbmp = Adapter->loopback_mode;
   5138 		break;
   5139 
   5140 	case LB_SET_MODE:
   5141 		size = 0;
   5142 		if (iocp->ioc_count != sizeof (uint32_t))
   5143 			return (IOC_INVAL);
   5144 
   5145 		lbmp = (uint32_t *)(uintptr_t)mp->b_cont->b_rptr;
   5146 		if (!e1000g_set_loopback_mode(Adapter, *lbmp))
   5147 			return (IOC_INVAL);
   5148 		break;
   5149 	}
   5150 
   5151 	iocp->ioc_count = size;
   5152 	iocp->ioc_error = 0;
   5153 
   5154 	if (e1000g_check_acc_handle(Adapter->osdep.reg_handle) != DDI_FM_OK) {
   5155 		ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_DEGRADED);
   5156 		return (IOC_INVAL);
   5157 	}
   5158 
   5159 	return (IOC_REPLY);
   5160 }
   5161 
   5162 static boolean_t
   5163 e1000g_check_loopback_support(struct e1000_hw *hw)
   5164 {
   5165 	switch (hw->mac.type) {
   5166 	case e1000_82540:
   5167 	case e1000_82545:
   5168 	case e1000_82545_rev_3:
   5169 	case e1000_82546:
   5170 	case e1000_82546_rev_3:
   5171 	case e1000_82541:
   5172 	case e1000_82541_rev_2:
   5173 	case e1000_82547:
   5174 	case e1000_82547_rev_2:
   5175 	case e1000_82571:
   5176 	case e1000_82572:
   5177 	case e1000_82573:
   5178 	case e1000_82574:
   5179 	case e1000_80003es2lan:
   5180 	case e1000_ich9lan:
   5181 	case e1000_ich10lan:
   5182 		return (B_TRUE);
   5183 	}
   5184 	return (B_FALSE);
   5185 }
   5186 
   5187 static boolean_t
   5188 e1000g_set_loopback_mode(struct e1000g *Adapter, uint32_t mode)
   5189 {
   5190 	struct e1000_hw *hw;
   5191 	int i, times;
   5192 	boolean_t link_up;
   5193 
   5194 	if (mode == Adapter->loopback_mode)
   5195 		return (B_TRUE);
   5196 
   5197 	hw = &Adapter->shared;
   5198 	times = 0;
   5199 
   5200 	Adapter->loopback_mode = mode;
   5201 
   5202 	if (mode == E1000G_LB_NONE) {
   5203 		/* Reset the chip */
   5204 		hw->phy.autoneg_wait_to_complete = B_TRUE;
   5205 		(void) e1000g_reset_adapter(Adapter);
   5206 		hw->phy.autoneg_wait_to_complete = B_FALSE;
   5207 		return (B_TRUE);
   5208 	}
   5209 
   5210 again:
   5211 
   5212 	rw_enter(&Adapter->chip_lock, RW_WRITER);
   5213 
   5214 	switch (mode) {
   5215 	default:
   5216 		rw_exit(&Adapter->chip_lock);
   5217 		return (B_FALSE);
   5218 
   5219 	case E1000G_LB_EXTERNAL_1000:
   5220 		e1000g_set_external_loopback_1000(Adapter);
   5221 		break;
   5222 
   5223 	case E1000G_LB_EXTERNAL_100:
   5224 		e1000g_set_external_loopback_100(Adapter);
   5225 		break;
   5226 
   5227 	case E1000G_LB_EXTERNAL_10:
   5228 		e1000g_set_external_loopback_10(Adapter);
   5229 		break;
   5230 
   5231 	case E1000G_LB_INTERNAL_PHY:
   5232 		e1000g_set_internal_loopback(Adapter);
   5233 		break;
   5234 	}
   5235 
   5236 	times++;
   5237 
   5238 	rw_exit(&Adapter->chip_lock);
   5239 
   5240 	/* Wait for link up */
   5241 	for (i = (PHY_FORCE_LIMIT * 2); i > 0; i--)
   5242 		msec_delay(100);
   5243 
   5244 	rw_enter(&Adapter->chip_lock, RW_WRITER);
   5245 
   5246 	link_up = e1000g_link_up(Adapter);
   5247 
   5248 	rw_exit(&Adapter->chip_lock);
   5249 
   5250 	if (!link_up) {
   5251 		E1000G_DEBUGLOG_0(Adapter, E1000G_INFO_LEVEL,
   5252 		    "Failed to get the link up");
   5253 		if (times < 2) {
   5254 			/* Reset the link */
   5255 			E1000G_DEBUGLOG_0(Adapter, E1000G_INFO_LEVEL,
   5256 			    "Reset the link ...");
   5257 			(void) e1000g_reset_adapter(Adapter);
   5258 			goto again;
   5259 		}
   5260 
   5261 		/*
   5262 		 * Reset driver to loopback none when set loopback failed
   5263 		 * for the second time.
   5264 		 */
   5265 		Adapter->loopback_mode = E1000G_LB_NONE;
   5266 
   5267 		/* Reset the chip */
   5268 		hw->phy.autoneg_wait_to_complete = B_TRUE;
   5269 		(void) e1000g_reset_adapter(Adapter);
   5270 		hw->phy.autoneg_wait_to_complete = B_FALSE;
   5271 
   5272 		E1000G_DEBUGLOG_0(Adapter, E1000G_INFO_LEVEL,
   5273 		    "Set loopback mode failed, reset to loopback none");
   5274 
   5275 		return (B_FALSE);
   5276 	}
   5277 
   5278 	return (B_TRUE);
   5279 }
   5280 
   5281 /*
   5282  * The following loopback settings are from Intel's technical
   5283  * document - "How To Loopback". All the register settings and
   5284  * time delay values are directly inherited from the document
   5285  * without more explanations available.
   5286  */
   5287 static void
   5288 e1000g_set_internal_loopback(struct e1000g *Adapter)
   5289 {
   5290 	struct e1000_hw *hw;
   5291 	uint32_t ctrl;
   5292 	uint32_t status;
   5293 	uint16_t phy_ctrl;
   5294 	uint16_t phy_reg;
   5295 	uint32_t txcw;
   5296 
   5297 	hw = &Adapter->shared;
   5298 
   5299 	/* Disable Smart Power Down */
   5300 	phy_spd_state(hw, B_FALSE);
   5301 
   5302 	(void) e1000_read_phy_reg(hw, PHY_CONTROL, &phy_ctrl);
   5303 	phy_ctrl &= ~(MII_CR_AUTO_NEG_EN | MII_CR_SPEED_100 | MII_CR_SPEED_10);
   5304 	phy_ctrl |= MII_CR_FULL_DUPLEX | MII_CR_SPEED_1000;
   5305 
   5306 	switch (hw->mac.type) {
   5307 	case e1000_82540:
   5308 	case e1000_82545:
   5309 	case e1000_82545_rev_3:
   5310 	case e1000_82546:
   5311 	case e1000_82546_rev_3:
   5312 	case e1000_82573:
   5313 		/* Auto-MDI/MDIX off */
   5314 		(void) e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, 0x0808);
   5315 		/* Reset PHY to update Auto-MDI/MDIX */
   5316 		(void) e1000_write_phy_reg(hw, PHY_CONTROL,
   5317 		    phy_ctrl | MII_CR_RESET | MII_CR_AUTO_NEG_EN);
   5318 		/* Reset PHY to auto-neg off and force 1000 */
   5319 		(void) e1000_write_phy_reg(hw, PHY_CONTROL,
   5320 		    phy_ctrl | MII_CR_RESET);
   5321 		/*
   5322 		 * Disable PHY receiver for 82540/545/546 and 82573 Family.
   5323 		 * See comments above e1000g_set_internal_loopback() for the
   5324 		 * background.
   5325 		 */
   5326 		(void) e1000_write_phy_reg(hw, 29, 0x001F);
   5327 		(void) e1000_write_phy_reg(hw, 30, 0x8FFC);
   5328 		(void) e1000_write_phy_reg(hw, 29, 0x001A);
   5329 		(void) e1000_write_phy_reg(hw, 30, 0x8FF0);
   5330 		break;
   5331 	case e1000_80003es2lan:
   5332 		/* Force Link Up */
   5333 		(void) e1000_write_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL,
   5334 		    0x1CC);
   5335 		/* Sets PCS loopback at 1Gbs */
   5336 		(void) e1000_write_phy_reg(hw, GG82563_PHY_MAC_SPEC_CTRL,
   5337 		    0x1046);
   5338 		break;
   5339 	}
   5340 
   5341 	/*
   5342 	 * The following registers should be set for e1000_phy_bm phy type.
   5343 	 * e1000_82574, e1000_ich10lan and some e1000_ich9lan use this phy.
   5344 	 * For others, we do not need to set these registers.
   5345 	 */
   5346 	if (hw->phy.type == e1000_phy_bm) {
   5347 		/* Set Default MAC Interface speed to 1GB */
   5348 		(void) e1000_read_phy_reg(hw, PHY_REG(2, 21), &phy_reg);
   5349 		phy_reg &= ~0x0007;
   5350 		phy_reg |= 0x006;
   5351 		(void) e1000_write_phy_reg(hw, PHY_REG(2, 21), phy_reg);
   5352 		/* Assert SW reset for above settings to take effect */
   5353 		(void) e1000_phy_commit(hw);
   5354 		msec_delay(1);
   5355 		/* Force Full Duplex */
   5356 		(void) e1000_read_phy_reg(hw, PHY_REG(769, 16), &phy_reg);
   5357 		(void) e1000_write_phy_reg(hw, PHY_REG(769, 16),
   5358 		    phy_reg | 0x000C);
   5359 		/* Set Link Up (in force link) */
   5360 		(void) e1000_read_phy_reg(hw, PHY_REG(776, 16), &phy_reg);
   5361 		(void) e1000_write_phy_reg(hw, PHY_REG(776, 16),
   5362 		    phy_reg | 0x0040);
   5363 		/* Force Link */
   5364 		(void) e1000_read_phy_reg(hw, PHY_REG(769, 16), &phy_reg);
   5365 		(void) e1000_write_phy_reg(hw, PHY_REG(769, 16),
   5366 		    phy_reg | 0x0040);
   5367 		/* Set Early Link Enable */
   5368 		(void) e1000_read_phy_reg(hw, PHY_REG(769, 20), &phy_reg);
   5369 		(void) e1000_write_phy_reg(hw, PHY_REG(769, 20),
   5370 		    phy_reg | 0x0400);
   5371 	}
   5372 
   5373 	/* Set loopback */
   5374 	(void) e1000_write_phy_reg(hw, PHY_CONTROL, phy_ctrl | MII_CR_LOOPBACK);
   5375 
   5376 	msec_delay(250);
   5377 
   5378 	/* Now set up the MAC to the same speed/duplex as the PHY. */
   5379 	ctrl = E1000_READ_REG(hw, E1000_CTRL);
   5380 	ctrl &= ~E1000_CTRL_SPD_SEL;	/* Clear the speed sel bits */
   5381 	ctrl |= (E1000_CTRL_FRCSPD |	/* Set the Force Speed Bit */
   5382 	    E1000_CTRL_FRCDPX |		/* Set the Force Duplex Bit */
   5383 	    E1000_CTRL_SPD_1000 |	/* Force Speed to 1000 */
   5384 	    E1000_CTRL_FD);		/* Force Duplex to FULL */
   5385 
   5386 	switch (hw->mac.type) {
   5387 	case e1000_82540:
   5388 	case e1000_82545:
   5389 	case e1000_82545_rev_3:
   5390 	case e1000_82546:
   5391 	case e1000_82546_rev_3:
   5392 		/*
   5393 		 * For some serdes we'll need to commit the writes now
   5394 		 * so that the status is updated on link
   5395 		 */
   5396 		if (hw->phy.media_type == e1000_media_type_internal_serdes) {
   5397 			E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
   5398 			msec_delay(100);
   5399 			ctrl = E1000_READ_REG(hw, E1000_CTRL);
   5400 		}
   5401 
   5402 		if (hw->phy.media_type == e1000_media_type_copper) {
   5403 			/* Invert Loss of Signal */
   5404 			ctrl |= E1000_CTRL_ILOS;
   5405 		} else {
   5406 			/* Set ILOS on fiber nic if half duplex is detected */
   5407 			status = E1000_READ_REG(hw, E1000_STATUS);
   5408 			if ((status & E1000_STATUS_FD) == 0)
   5409 				ctrl |= E1000_CTRL_ILOS | E1000_CTRL_SLU;
   5410 		}
   5411 		break;
   5412 
   5413 	case e1000_82571:
   5414 	case e1000_82572:
   5415 		/*
   5416 		 * The fiber/SerDes versions of this adapter do not contain an
   5417 		 * accessible PHY. Therefore, loopback beyond MAC must be done
   5418 		 * using SerDes analog loopback.
   5419 		 */
   5420 		if (hw->phy.media_type != e1000_media_type_copper) {
   5421 			/* Disable autoneg by setting bit 31 of TXCW to zero */
   5422 			txcw = E1000_READ_REG(hw, E1000_TXCW);
   5423 			txcw &= ~((uint32_t)1 << 31);
   5424 			E1000_WRITE_REG(hw, E1000_TXCW, txcw);
   5425 
   5426 			/*
   5427 			 * Write 0x410 to Serdes Control register
   5428 			 * to enable Serdes analog loopback
   5429 			 */
   5430 			E1000_WRITE_REG(hw, E1000_SCTL, 0x0410);
   5431 			msec_delay(10);
   5432 		}
   5433 
   5434 		status = E1000_READ_REG(hw, E1000_STATUS);
   5435 		/* Set ILOS on fiber nic if half duplex is detected */
   5436 		if ((hw->phy.media_type == e1000_media_type_fiber) &&
   5437 		    ((status & E1000_STATUS_FD) == 0 ||
   5438 		    (status & E1000_STATUS_LU) == 0))
   5439 			ctrl |= E1000_CTRL_ILOS | E1000_CTRL_SLU;
   5440 		else if (hw->phy.media_type == e1000_media_type_internal_serdes)
   5441 			ctrl |= E1000_CTRL_SLU;
   5442 		break;
   5443 
   5444 	case e1000_82573:
   5445 		ctrl |= E1000_CTRL_ILOS;
   5446 		break;
   5447 	case e1000_ich9lan:
   5448 	case e1000_ich10lan:
   5449 		ctrl |= E1000_CTRL_SLU;
   5450 		break;
   5451 	}
   5452 	if (hw->phy.type == e1000_phy_bm)
   5453 		ctrl |= E1000_CTRL_SLU | E1000_CTRL_ILOS;
   5454 
   5455 	E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
   5456 }
   5457 
   5458 static void
   5459 e1000g_set_external_loopback_1000(struct e1000g *Adapter)
   5460 {
   5461 	struct e1000_hw *hw;
   5462 	uint32_t rctl;
   5463 	uint32_t ctrl_ext;
   5464 	uint32_t ctrl;
   5465 	uint32_t status;
   5466 	uint32_t txcw;
   5467 	uint16_t phydata;
   5468 
   5469 	hw = &Adapter->shared;
   5470 
   5471 	/* Disable Smart Power Down */
   5472 	phy_spd_state(hw, B_FALSE);
   5473 
   5474 	switch (hw->mac.type) {
   5475 	case e1000_82571:
   5476 	case e1000_82572:
   5477 		switch (hw->phy.media_type) {
   5478 		case e1000_media_type_copper:
   5479 			/* Force link up (Must be done before the PHY writes) */
   5480 			ctrl = E1000_READ_REG(hw, E1000_CTRL);
   5481 			ctrl |= E1000_CTRL_SLU;	/* Force Link Up */
   5482 			E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
   5483 
   5484 			rctl = E1000_READ_REG(hw, E1000_RCTL);
   5485 			rctl |= (E1000_RCTL_EN |
   5486 			    E1000_RCTL_SBP |
   5487 			    E1000_RCTL_UPE |
   5488 			    E1000_RCTL_MPE |
   5489 			    E1000_RCTL_LPE |
   5490 			    E1000_RCTL_BAM);		/* 0x803E */
   5491 			E1000_WRITE_REG(hw, E1000_RCTL, rctl);
   5492 
   5493 			ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT);
   5494 			ctrl_ext |= (E1000_CTRL_EXT_SDP4_DATA |
   5495 			    E1000_CTRL_EXT_SDP6_DATA |
   5496 			    E1000_CTRL_EXT_SDP3_DATA |
   5497 			    E1000_CTRL_EXT_SDP4_DIR |
   5498 			    E1000_CTRL_EXT_SDP6_DIR |
   5499 			    E1000_CTRL_EXT_SDP3_DIR);	/* 0x0DD0 */
   5500 			E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext);
   5501 
   5502 			/*
   5503 			 * This sequence tunes the PHY's SDP and no customer
   5504 			 * settable values. For background, see comments above
   5505 			 * e1000g_set_internal_loopback().
   5506 			 */
   5507 			(void) e1000_write_phy_reg(hw, 0x0, 0x140);
   5508 			msec_delay(10);
   5509 			(void) e1000_write_phy_reg(hw, 0x9, 0x1A00);
   5510 			(void) e1000_write_phy_reg(hw, 0x12, 0xC10);
   5511 			(void) e1000_write_phy_reg(hw, 0x12, 0x1C10);
   5512 			(void) e1000_write_phy_reg(hw, 0x1F37, 0x76);
   5513 			(void) e1000_write_phy_reg(hw, 0x1F33, 0x1);
   5514 			(void) e1000_write_phy_reg(hw, 0x1F33, 0x0);
   5515 
   5516 			(void) e1000_write_phy_reg(hw, 0x1F35, 0x65);
   5517 			(void) e1000_write_phy_reg(hw, 0x1837, 0x3F7C);
   5518 			(void) e1000_write_phy_reg(hw, 0x1437, 0x3FDC);
   5519 			(void) e1000_write_phy_reg(hw, 0x1237, 0x3F7C);
   5520 			(void) e1000_write_phy_reg(hw, 0x1137, 0x3FDC);
   5521 
   5522 			msec_delay(50);
   5523 			break;
   5524 		case e1000_media_type_fiber:
   5525 		case e1000_media_type_internal_serdes:
   5526 			status = E1000_READ_REG(hw, E1000_STATUS);
   5527 			if (((status & E1000_STATUS_LU) == 0) ||
   5528 			    (hw->phy.media_type ==
   5529 			    e1000_media_type_internal_serdes)) {
   5530 				ctrl = E1000_READ_REG(hw, E1000_CTRL);
   5531 				ctrl |= E1000_CTRL_ILOS | E1000_CTRL_SLU;
   5532 				E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
   5533 			}
   5534 
   5535 			/* Disable autoneg by setting bit 31 of TXCW to zero */
   5536 			txcw = E1000_READ_REG(hw, E1000_TXCW);
   5537 			txcw &= ~((uint32_t)1 << 31);
   5538 			E1000_WRITE_REG(hw, E1000_TXCW, txcw);
   5539 
   5540 			/*
   5541 			 * Write 0x410 to Serdes Control register
   5542 			 * to enable Serdes analog loopback
   5543 			 */
   5544 			E1000_WRITE_REG(hw, E1000_SCTL, 0x0410);
   5545 			msec_delay(10);
   5546 			break;
   5547 		default:
   5548 			break;
   5549 		}
   5550 		break;
   5551 	case e1000_82574:
   5552 	case e1000_80003es2lan:
   5553 	case e1000_ich9lan:
   5554 	case e1000_ich10lan:
   5555 		(void) e1000_read_phy_reg(hw, GG82563_REG(6, 16), &phydata);
   5556 		(void) e1000_write_phy_reg(hw, GG82563_REG(6, 16),
   5557 		    phydata | (1 << 5));
   5558 		Adapter->param_adv_autoneg = 1;
   5559 		Adapter->param_adv_1000fdx = 1;
   5560 		(void) e1000g_reset_link(Adapter);
   5561 		break;
   5562 	}
   5563 }
   5564 
   5565 static void
   5566 e1000g_set_external_loopback_100(struct e1000g *Adapter)
   5567 {
   5568 	struct e1000_hw *hw;
   5569 	uint32_t ctrl;
   5570 	uint16_t phy_ctrl;
   5571 
   5572 	hw = &Adapter->shared;
   5573 
   5574 	/* Disable Smart Power Down */
   5575 	phy_spd_state(hw, B_FALSE);
   5576 
   5577 	phy_ctrl = (MII_CR_FULL_DUPLEX |
   5578 	    MII_CR_SPEED_100);
   5579 
   5580 	/* Force 100/FD, reset PHY */
   5581 	(void) e1000_write_phy_reg(hw, PHY_CONTROL,
   5582 	    phy_ctrl | MII_CR_RESET);	/* 0xA100 */
   5583 	msec_delay(10);
   5584 
   5585 	/* Force 100/FD */
   5586 	(void) e1000_write_phy_reg(hw, PHY_CONTROL,
   5587 	    phy_ctrl);			/* 0x2100 */
   5588 	msec_delay(10);
   5589 
   5590 	/* Now setup the MAC to the same speed/duplex as the PHY. */
   5591 	ctrl = E1000_READ_REG(hw, E1000_CTRL);
   5592 	ctrl &= ~E1000_CTRL_SPD_SEL;	/* Clear the speed sel bits */
   5593 	ctrl |= (E1000_CTRL_SLU |	/* Force Link Up */
   5594 	    E1000_CTRL_FRCSPD |		/* Set the Force Speed Bit */
   5595 	    E1000_CTRL_FRCDPX |		/* Set the Force Duplex Bit */
   5596 	    E1000_CTRL_SPD_100 |	/* Force Speed to 100 */
   5597 	    E1000_CTRL_FD);		/* Force Duplex to FULL */
   5598 
   5599 	E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
   5600 }
   5601 
   5602 static void
   5603 e1000g_set_external_loopback_10(struct e1000g *Adapter)
   5604 {
   5605 	struct e1000_hw *hw;
   5606 	uint32_t ctrl;
   5607 	uint16_t phy_ctrl;
   5608 
   5609 	hw = &Adapter->shared;
   5610 
   5611 	/* Disable Smart Power Down */
   5612 	phy_spd_state(hw, B_FALSE);
   5613 
   5614 	phy_ctrl = (MII_CR_FULL_DUPLEX |
   5615 	    MII_CR_SPEED_10);
   5616 
   5617 	/* Force 10/FD, reset PHY */
   5618 	(void) e1000_write_phy_reg(hw, PHY_CONTROL,
   5619 	    phy_ctrl | MII_CR_RESET);	/* 0x8100 */
   5620 	msec_delay(10);
   5621 
   5622 	/* Force 10/FD */
   5623 	(void) e1000_write_phy_reg(hw, PHY_CONTROL,
   5624 	    phy_ctrl);			/* 0x0100 */
   5625 	msec_delay(10);
   5626 
   5627 	/* Now setup the MAC to the same speed/duplex as the PHY. */
   5628 	ctrl = E1000_READ_REG(hw, E1000_CTRL);
   5629 	ctrl &= ~E1000_CTRL_SPD_SEL;	/* Clear the speed sel bits */
   5630 	ctrl |= (E1000_CTRL_SLU |	/* Force Link Up */
   5631 	    E1000_CTRL_FRCSPD |		/* Set the Force Speed Bit */
   5632 	    E1000_CTRL_FRCDPX |		/* Set the Force Duplex Bit */
   5633 	    E1000_CTRL_SPD_10 |		/* Force Speed to 10 */
   5634 	    E1000_CTRL_FD);		/* Force Duplex to FULL */
   5635 
   5636 	E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
   5637 }
   5638 
   5639 #ifdef __sparc
   5640 static boolean_t
   5641 e1000g_find_mac_address(struct e1000g *Adapter)
   5642 {
   5643 	struct e1000_hw *hw = &Adapter->shared;
   5644 	uchar_t *bytes;
   5645 	struct ether_addr sysaddr;
   5646 	uint_t nelts;
   5647 	int err;
   5648 	boolean_t found = B_FALSE;
   5649 
   5650 	/*
   5651 	 * The "vendor's factory-set address" may already have
   5652 	 * been extracted from the chip, but if the property
   5653 	 * "local-mac-address" is set we use that instead.
   5654 	 *
   5655 	 * We check whether it looks like an array of 6
   5656 	 * bytes (which it should, if OBP set it).  If we can't
   5657 	 * make sense of it this way, we'll ignore it.
   5658 	 */
   5659 	err = ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, Adapter->dip,
   5660 	    DDI_PROP_DONTPASS, "local-mac-address", &bytes, &nelts);
   5661 	if (err == DDI_PROP_SUCCESS) {
   5662 		if (nelts == ETHERADDRL) {
   5663 			while (nelts--)
   5664 				hw->mac.addr[nelts] = bytes[nelts];
   5665 			found = B_TRUE;
   5666 		}
   5667 		ddi_prop_free(bytes);
   5668 	}
   5669 
   5670 	/*
   5671 	 * Look up the OBP property "local-mac-address?". If the user has set
   5672 	 * 'local-mac-address? = false', use "the system address" instead.
   5673 	 */
   5674 	if (ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, Adapter->dip, 0,
   5675 	    "local-mac-address?", &bytes, &nelts) == DDI_PROP_SUCCESS) {
   5676 		if (strncmp("false", (caddr_t)bytes, (size_t)nelts) == 0) {
   5677 			if (localetheraddr(NULL, &sysaddr) != 0) {
   5678 				bcopy(&sysaddr, hw->mac.addr, ETHERADDRL);
   5679 				found = B_TRUE;
   5680 			}
   5681 		}
   5682 		ddi_prop_free(bytes);
   5683 	}
   5684 
   5685 	/*
   5686 	 * Finally(!), if there's a valid "mac-address" property (created
   5687 	 * if we netbooted from this interface), we must use this instead
   5688 	 * of any of the above to ensure that the NFS/install server doesn't
   5689 	 * get confused by the address changing as Solaris takes over!
   5690 	 */
   5691 	err = ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, Adapter->dip,
   5692 	    DDI_PROP_DONTPASS, "mac-address", &bytes, &nelts);
   5693 	if (err == DDI_PROP_SUCCESS) {
   5694 		if (nelts == ETHERADDRL) {
   5695 			while (nelts--)
   5696 				hw->mac.addr[nelts] = bytes[nelts];
   5697 			found = B_TRUE;
   5698 		}
   5699 		ddi_prop_free(bytes);
   5700 	}
   5701 
   5702 	if (found) {
   5703 		bcopy(hw->mac.addr, hw->mac.perm_addr,
   5704 		    ETHERADDRL);
   5705 	}
   5706 
   5707 	return (found);
   5708 }
   5709 #endif
   5710 
   5711 static int
   5712 e1000g_add_intrs(struct e1000g *Adapter)
   5713 {
   5714 	dev_info_t *devinfo;
   5715 	int intr_types;
   5716 	int rc;
   5717 
   5718 	devinfo = Adapter->dip;
   5719 
   5720 	/* Get supported interrupt types */
   5721 	rc = ddi_intr_get_supported_types(devinfo, &intr_types);
   5722 
   5723 	if (rc != DDI_SUCCESS) {
   5724 		E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
   5725 		    "Get supported interrupt types failed: %d\n", rc);
   5726 		return (DDI_FAILURE);
   5727 	}
   5728 
   5729 	/*
   5730 	 * Based on Intel Technical Advisory document (TA-160), there are some
   5731 	 * cases where some older Intel PCI-X NICs may "advertise" to the OS
   5732 	 * that it supports MSI, but in fact has problems.
   5733 	 * So we should only enable MSI for PCI-E NICs and disable MSI for old
   5734 	 * PCI/PCI-X NICs.
   5735 	 */
   5736 	if (Adapter->shared.mac.type < e1000_82571)
   5737 		Adapter->msi_enable = B_FALSE;
   5738 
   5739 	if ((intr_types & DDI_INTR_TYPE_MSI) && Adapter->msi_enable) {
   5740 		rc = e1000g_intr_add(Adapter, DDI_INTR_TYPE_MSI);
   5741 
   5742 		if (rc != DDI_SUCCESS) {
   5743 			/* EMPTY */
   5744 			E1000G_DEBUGLOG_0(Adapter, E1000G_WARN_LEVEL,
   5745 			    "Add MSI failed, trying Legacy interrupts\n");
   5746 		} else {
   5747 			Adapter->intr_type = DDI_INTR_TYPE_MSI;
   5748 		}
   5749 	}
   5750 
   5751 	if ((Adapter->intr_type == 0) &&
   5752 	    (intr_types & DDI_INTR_TYPE_FIXED)) {
   5753 		rc = e1000g_intr_add(Adapter, DDI_INTR_TYPE_FIXED);
   5754 
   5755 		if (rc != DDI_SUCCESS) {
   5756 			E1000G_DEBUGLOG_0(Adapter, E1000G_WARN_LEVEL,
   5757 			    "Add Legacy interrupts failed\n");
   5758 			return (DDI_FAILURE);
   5759 		}
   5760 
   5761 		Adapter->intr_type = DDI_INTR_TYPE_FIXED;
   5762 	}
   5763 
   5764 	if (Adapter->intr_type == 0) {
   5765 		E1000G_DEBUGLOG_0(Adapter, E1000G_WARN_LEVEL,
   5766 		    "No interrupts registered\n");
   5767 		return (DDI_FAILURE);
   5768 	}
   5769 
   5770 	return (DDI_SUCCESS);
   5771 }
   5772 
   5773 /*
   5774  * e1000g_intr_add() handles MSI/Legacy interrupts
   5775  */
   5776 static int
   5777 e1000g_intr_add(struct e1000g *Adapter, int intr_type)
   5778 {
   5779 	dev_info_t *devinfo;
   5780 	int count, avail, actual;
   5781 	int x, y, rc, inum = 0;
   5782 	int flag;
   5783 	ddi_intr_handler_t *intr_handler;
   5784 
   5785 	devinfo = Adapter->dip;
   5786 
   5787 	/* get number of interrupts */
   5788 	rc = ddi_intr_get_nintrs(devinfo, intr_type, &count);
   5789 	if ((rc != DDI_SUCCESS) || (count == 0)) {
   5790 		E1000G_DEBUGLOG_2(Adapter, E1000G_WARN_LEVEL,
   5791 		    "Get interrupt number failed. Return: %d, count: %d\n",
   5792 		    rc, count);
   5793 		return (DDI_FAILURE);
   5794 	}
   5795 
   5796 	/* get number of available interrupts */
   5797 	rc = ddi_intr_get_navail(devinfo, intr_type, &avail);
   5798 	if ((rc != DDI_SUCCESS) || (avail == 0)) {
   5799 		E1000G_DEBUGLOG_2(Adapter, E1000G_WARN_LEVEL,
   5800 		    "Get interrupt available number failed. "
   5801 		    "Return: %d, available: %d\n", rc, avail);
   5802 		return (DDI_FAILURE);
   5803 	}
   5804 
   5805 	if (avail < count) {
   5806 		/* EMPTY */
   5807 		E1000G_DEBUGLOG_2(Adapter, E1000G_WARN_LEVEL,
   5808 		    "Interrupts count: %d, available: %d\n",
   5809 		    count, avail);
   5810 	}
   5811 
   5812 	/* Allocate an array of interrupt handles */
   5813 	Adapter->intr_size = count * sizeof (ddi_intr_handle_t);
   5814 	Adapter->htable = kmem_alloc(Adapter->intr_size, KM_SLEEP);
   5815 
   5816 	/* Set NORMAL behavior for both MSI and FIXED interrupt */
   5817 	flag = DDI_INTR_ALLOC_NORMAL;
   5818 
   5819 	/* call ddi_intr_alloc() */
   5820 	rc = ddi_intr_alloc(devinfo, Adapter->htable, intr_type, inum,
   5821 	    count, &actual, flag);
   5822 
   5823 	if ((rc != DDI_SUCCESS) || (actual == 0)) {
   5824 		E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
   5825 		    "Allocate interrupts failed: %d\n", rc);
   5826 
   5827 		kmem_free(Adapter->htable, Adapter->intr_size);
   5828 		return (DDI_FAILURE);
   5829 	}
   5830 
   5831 	if (actual < count) {
   5832 		/* EMPTY */
   5833 		E1000G_DEBUGLOG_2(Adapter, E1000G_WARN_LEVEL,
   5834 		    "Interrupts requested: %d, received: %d\n",
   5835 		    count, actual);
   5836 	}
   5837 
   5838 	Adapter->intr_cnt = actual;
   5839 
   5840 	/* Get priority for first msi, assume remaining are all the same */
   5841 	rc = ddi_intr_get_pri(Adapter->htable[0], &Adapter->intr_pri);
   5842 
   5843 	if (rc != DDI_SUCCESS) {
   5844 		E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
   5845 		    "Get interrupt priority failed: %d\n", rc);
   5846 
   5847 		/* Free already allocated intr */
   5848 		for (y = 0; y < actual; y++)
   5849 			(void) ddi_intr_free(Adapter->htable[y]);
   5850 
   5851 		kmem_free(Adapter->htable, Adapter->intr_size);
   5852 		return (DDI_FAILURE);
   5853 	}
   5854 
   5855 	/*
   5856 	 * In Legacy Interrupt mode, for PCI-Express adapters, we should
   5857 	 * use the interrupt service routine e1000g_intr_pciexpress()
   5858 	 * to avoid interrupt stealing when sharing interrupt with other
   5859 	 * devices.
   5860 	 */
   5861 	if (Adapter->shared.mac.type < e1000_82571)
   5862 		intr_handler = (ddi_intr_handler_t *)e1000g_intr;
   5863 	else
   5864 		intr_handler = (ddi_intr_handler_t *)e1000g_intr_pciexpress;
   5865 
   5866 	/* Call ddi_intr_add_handler() */
   5867 	for (x = 0; x < actual; x++) {
   5868 		rc = ddi_intr_add_handler(Adapter->htable[x],
   5869 		    intr_handler, (caddr_t)Adapter, NULL);
   5870 
   5871 		if (rc != DDI_SUCCESS) {
   5872 			E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
   5873 			    "Add interrupt handler failed: %d\n", rc);
   5874 
   5875 			/* Remove already added handler */
   5876 			for (y = 0; y < x; y++)
   5877 				(void) ddi_intr_remove_handler(
   5878 				    Adapter->htable[y]);
   5879 
   5880 			/* Free already allocated intr */
   5881 			for (y = 0; y < actual; y++)
   5882 				(void) ddi_intr_free(Adapter->htable[y]);
   5883 
   5884 			kmem_free(Adapter->htable, Adapter->intr_size);
   5885 			return (DDI_FAILURE);
   5886 		}
   5887 	}
   5888 
   5889 	rc = ddi_intr_get_cap(Adapter->htable[0], &Adapter->intr_cap);
   5890 
   5891 	if (rc != DDI_SUCCESS) {
   5892 		E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
   5893 		    "Get interrupt cap failed: %d\n", rc);
   5894 
   5895 		/* Free already allocated intr */
   5896 		for (y = 0; y < actual; y++) {
   5897 			(void) ddi_intr_remove_handler(Adapter->htable[y]);
   5898 			(void) ddi_intr_free(Adapter->htable[y]);
   5899 		}
   5900 
   5901 		kmem_free(Adapter->htable, Adapter->intr_size);
   5902 		return (DDI_FAILURE);
   5903 	}
   5904 
   5905 	return (DDI_SUCCESS);
   5906 }
   5907 
   5908 static int
   5909 e1000g_rem_intrs(struct e1000g *Adapter)
   5910 {
   5911 	int x;
   5912 	int rc;
   5913 
   5914 	for (x = 0; x < Adapter->intr_cnt; x++) {
   5915 		rc = ddi_intr_remove_handler(Adapter->htable[x]);
   5916 		if (rc != DDI_SUCCESS) {
   5917 			E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
   5918 			    "Remove intr handler failed: %d\n", rc);
   5919 			return (DDI_FAILURE);
   5920 		}
   5921 
   5922 		rc = ddi_intr_free(Adapter->htable[x]);
   5923 		if (rc != DDI_SUCCESS) {
   5924 			E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
   5925 			    "Free intr failed: %d\n", rc);
   5926 			return (DDI_FAILURE);
   5927 		}
   5928 	}
   5929 
   5930 	kmem_free(Adapter->htable, Adapter->intr_size);
   5931 
   5932 	return (DDI_SUCCESS);
   5933 }
   5934 
   5935 static int
   5936 e1000g_enable_intrs(struct e1000g *Adapter)
   5937 {
   5938 	int x;
   5939 	int rc;
   5940 
   5941 	/* Enable interrupts */
   5942 	if (Adapter->intr_cap & DDI_INTR_FLAG_BLOCK) {
   5943 		/* Call ddi_intr_block_enable() for MSI */
   5944 		rc = ddi_intr_block_enable(Adapter->htable,
   5945 		    Adapter->intr_cnt);
   5946 		if (rc != DDI_SUCCESS) {
   5947 			E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
   5948 			    "Enable block intr failed: %d\n", rc);
   5949 			return (DDI_FAILURE);
   5950 		}
   5951 	} else {
   5952 		/* Call ddi_intr_enable() for Legacy/MSI non block enable */
   5953 		for (x = 0; x < Adapter->intr_cnt; x++) {
   5954 			rc = ddi_intr_enable(Adapter->htable[x]);
   5955 			if (rc != DDI_SUCCESS) {
   5956 				E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
   5957 				    "Enable intr failed: %d\n", rc);
   5958 				return (DDI_FAILURE);
   5959 			}
   5960 		}
   5961 	}
   5962 
   5963 	return (DDI_SUCCESS);
   5964 }
   5965 
   5966 static int
   5967 e1000g_disable_intrs(struct e1000g *Adapter)
   5968 {
   5969 	int x;
   5970 	int rc;
   5971 
   5972 	/* Disable all interrupts */
   5973 	if (Adapter->intr_cap & DDI_INTR_FLAG_BLOCK) {
   5974 		rc = ddi_intr_block_disable(Adapter->htable,
   5975 		    Adapter->intr_cnt);
   5976 		if (rc != DDI_SUCCESS) {
   5977 			E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
   5978 			    "Disable block intr failed: %d\n", rc);
   5979 			return (DDI_FAILURE);
   5980 		}
   5981 	} else {
   5982 		for (x = 0; x < Adapter->intr_cnt; x++) {
   5983 			rc = ddi_intr_disable(Adapter->htable[x]);
   5984 			if (rc != DDI_SUCCESS) {
   5985 				E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
   5986 				    "Disable intr failed: %d\n", rc);
   5987 				return (DDI_FAILURE);
   5988 			}
   5989 		}
   5990 	}
   5991 
   5992 	return (DDI_SUCCESS);
   5993 }
   5994 
   5995 /*
   5996  * e1000g_get_phy_state - get the state of PHY registers, save in the adapter
   5997  */
   5998 static void
   5999 e1000g_get_phy_state(struct e1000g *Adapter)
   6000 {
   6001 	struct e1000_hw *hw = &Adapter->shared;
   6002 
   6003 	if (hw->phy.media_type == e1000_media_type_copper) {
   6004 		(void) e1000_read_phy_reg(hw, PHY_CONTROL, &Adapter->phy_ctrl);
   6005 		(void) e1000_read_phy_reg(hw, PHY_STATUS, &Adapter->phy_status);
   6006 		(void) e1000_read_phy_reg(hw, PHY_AUTONEG_ADV,
   6007 		    &Adapter->phy_an_adv);
   6008 		(void) e1000_read_phy_reg(hw, PHY_AUTONEG_EXP,
   6009 		    &Adapter->phy_an_exp);
   6010 		(void) e1000_read_phy_reg(hw, PHY_EXT_STATUS,
   6011 		    &Adapter->phy_ext_status);
   6012 		(void) e1000_read_phy_reg(hw, PHY_1000T_CTRL,
   6013 		    &Adapter->phy_1000t_ctrl);
   6014 		(void) e1000_read_phy_reg(hw, PHY_1000T_STATUS,
   6015 		    &Adapter->phy_1000t_status);
   6016 		(void) e1000_read_phy_reg(hw, PHY_LP_ABILITY,
   6017 		    &Adapter->phy_lp_able);
   6018 
   6019 		Adapter->param_autoneg_cap =
   6020 		    (Adapter->phy_status & MII_SR_AUTONEG_CAPS) ? 1 : 0;
   6021 		Adapter->param_pause_cap =
   6022 		    (Adapter->phy_an_adv & NWAY_AR_PAUSE) ? 1 : 0;
   6023 		Adapter->param_asym_pause_cap =
   6024 		    (Adapter->phy_an_adv & NWAY_AR_ASM_DIR) ? 1 : 0;
   6025 		Adapter->param_1000fdx_cap =
   6026 		    ((Adapter->phy_ext_status & IEEE_ESR_1000T_FD_CAPS) ||
   6027 		    (Adapter->phy_ext_status & IEEE_ESR_1000X_FD_CAPS)) ? 1 : 0;
   6028 		Adapter->param_1000hdx_cap =
   6029 		    ((Adapter->phy_ext_status & IEEE_ESR_1000T_HD_CAPS) ||
   6030 		    (Adapter->phy_ext_status & IEEE_ESR_1000X_HD_CAPS)) ? 1 : 0;
   6031 		Adapter->param_100t4_cap =
   6032 		    (Adapter->phy_status & MII_SR_100T4_CAPS) ? 1 : 0;
   6033 		Adapter->param_100fdx_cap =
   6034 		    ((Adapter->phy_status & MII_SR_100X_FD_CAPS) ||
   6035 		    (Adapter->phy_status & MII_SR_100T2_FD_CAPS)) ? 1 : 0;
   6036 		Adapter->param_100hdx_cap =
   6037 		    ((Adapter->phy_status & MII_SR_100X_HD_CAPS) ||
   6038 		    (Adapter->phy_status & MII_SR_100T2_HD_CAPS)) ? 1 : 0;
   6039 		Adapter->param_10fdx_cap =
   6040 		    (Adapter->phy_status & MII_SR_10T_FD_CAPS) ? 1 : 0;
   6041 		Adapter->param_10hdx_cap =
   6042 		    (Adapter->phy_status & MII_SR_10T_HD_CAPS) ? 1 : 0;
   6043 
   6044 		Adapter->param_adv_autoneg = hw->mac.autoneg;
   6045 		Adapter->param_adv_pause =
   6046 		    (Adapter->phy_an_adv & NWAY_AR_PAUSE) ? 1 : 0;
   6047 		Adapter->param_adv_asym_pause =
   6048 		    (Adapter->phy_an_adv & NWAY_AR_ASM_DIR) ? 1 : 0;
   6049 		Adapter->param_adv_1000hdx =
   6050 		    (Adapter->phy_1000t_ctrl & CR_1000T_HD_CAPS) ? 1 : 0;
   6051 		Adapter->param_adv_100t4 =
   6052 		    (Adapter->phy_an_adv & NWAY_AR_100T4_CAPS) ? 1 : 0;
   6053 		if (Adapter->param_adv_autoneg == 1) {
   6054 			Adapter->param_adv_1000fdx =
   6055 			    (Adapter->phy_1000t_ctrl & CR_1000T_FD_CAPS)
   6056 			    ? 1 : 0;
   6057 			Adapter->param_adv_100fdx =
   6058 			    (Adapter->phy_an_adv & NWAY_AR_100TX_FD_CAPS)
   6059 			    ? 1 : 0;
   6060 			Adapter->param_adv_100hdx =
   6061 			    (Adapter->phy_an_adv & NWAY_AR_100TX_HD_CAPS)
   6062 			    ? 1 : 0;
   6063 			Adapter->param_adv_10fdx =
   6064 			    (Adapter->phy_an_adv & NWAY_AR_10T_FD_CAPS) ? 1 : 0;
   6065 			Adapter->param_adv_10hdx =
   6066 			    (Adapter->phy_an_adv & NWAY_AR_10T_HD_CAPS) ? 1 : 0;
   6067 		}
   6068 
   6069 		Adapter->param_lp_autoneg =
   6070 		    (Adapter->phy_an_exp & NWAY_ER_LP_NWAY_CAPS) ? 1 : 0;
   6071 		Adapter->param_lp_pause =
   6072 		    (Adapter->phy_lp_able & NWAY_LPAR_PAUSE) ? 1 : 0;
   6073 		Adapter->param_lp_asym_pause =
   6074 		    (Adapter->phy_lp_able & NWAY_LPAR_ASM_DIR) ? 1 : 0;
   6075 		Adapter->param_lp_1000fdx =
   6076 		    (Adapter->phy_1000t_status & SR_1000T_LP_FD_CAPS) ? 1 : 0;
   6077 		Adapter->param_lp_1000hdx =
   6078 		    (Adapter->phy_1000t_status & SR_1000T_LP_HD_CAPS) ? 1 : 0;
   6079 		Adapter->param_lp_100t4 =
   6080 		    (Adapter->phy_lp_able & NWAY_LPAR_100T4_CAPS) ? 1 : 0;
   6081 		Adapter->param_lp_100fdx =
   6082 		    (Adapter->phy_lp_able & NWAY_LPAR_100TX_FD_CAPS) ? 1 : 0;
   6083 		Adapter->param_lp_100hdx =
   6084 		    (Adapter->phy_lp_able & NWAY_LPAR_100TX_HD_CAPS) ? 1 : 0;
   6085 		Adapter->param_lp_10fdx =
   6086 		    (Adapter->phy_lp_able & NWAY_LPAR_10T_FD_CAPS) ? 1 : 0;
   6087 		Adapter->param_lp_10hdx =
   6088 		    (Adapter->phy_lp_able & NWAY_LPAR_10T_HD_CAPS) ? 1 : 0;
   6089 	} else {
   6090 		/*
   6091 		 * 1Gig Fiber adapter only offers 1Gig Full Duplex. Meaning,
   6092 		 * it can only work with 1Gig Full Duplex Link Partner.
   6093 		 */
   6094 		Adapter->param_autoneg_cap = 0;
   6095 		Adapter->param_pause_cap = 1;
   6096 		Adapter->param_asym_pause_cap = 1;
   6097 		Adapter->param_1000fdx_cap = 1;
   6098 		Adapter->param_1000hdx_cap = 0;
   6099 		Adapter->param_100t4_cap = 0;
   6100 		Adapter->param_100fdx_cap = 0;
   6101 		Adapter->param_100hdx_cap = 0;
   6102 		Adapter->param_10fdx_cap = 0;
   6103 		Adapter->param_10hdx_cap = 0;
   6104 
   6105 		Adapter->param_adv_autoneg = 0;
   6106 		Adapter->param_adv_pause = 1;
   6107 		Adapter->param_adv_asym_pause = 1;
   6108 		Adapter->param_adv_1000fdx = 1;
   6109 		Adapter->param_adv_1000hdx = 0;
   6110 		Adapter->param_adv_100t4 = 0;
   6111 		Adapter->param_adv_100fdx = 0;
   6112 		Adapter->param_adv_100hdx = 0;
   6113 		Adapter->param_adv_10fdx = 0;
   6114 		Adapter->param_adv_10hdx = 0;
   6115 
   6116 		Adapter->param_lp_autoneg = 0;
   6117 		Adapter->param_lp_pause = 0;
   6118 		Adapter->param_lp_asym_pause = 0;
   6119 		Adapter->param_lp_1000fdx = 0;
   6120 		Adapter->param_lp_1000hdx = 0;
   6121 		Adapter->param_lp_100t4 = 0;
   6122 		Adapter->param_lp_100fdx = 0;
   6123 		Adapter->param_lp_100hdx = 0;
   6124 		Adapter->param_lp_10fdx = 0;
   6125 		Adapter->param_lp_10hdx = 0;
   6126 	}
   6127 }
   6128 
   6129 /*
   6130  * FMA support
   6131  */
   6132 
   6133 int
   6134 e1000g_check_acc_handle(ddi_acc_handle_t handle)
   6135 {
   6136 	ddi_fm_error_t de;
   6137 
   6138 	ddi_fm_acc_err_get(handle, &de, DDI_FME_VERSION);
   6139 	ddi_fm_acc_err_clear(handle, DDI_FME_VERSION);
   6140 	return (de.fme_status);
   6141 }
   6142 
   6143 int
   6144 e1000g_check_dma_handle(ddi_dma_handle_t handle)
   6145 {
   6146 	ddi_fm_error_t de;
   6147 
   6148 	ddi_fm_dma_err_get(handle, &de, DDI_FME_VERSION);
   6149 	return (de.fme_status);
   6150 }
   6151 
   6152 /*
   6153  * The IO fault service error handling callback function
   6154  */
   6155 /* ARGSUSED2 */
   6156 static int
   6157 e1000g_fm_error_cb(dev_info_t *dip, ddi_fm_error_t *err, const void *impl_data)
   6158 {
   6159 	/*
   6160 	 * as the driver can always deal with an error in any dma or
   6161 	 * access handle, we can just return the fme_status value.
   6162 	 */
   6163 	pci_ereport_post(dip, err, NULL);
   6164 	return (err->fme_status);
   6165 }
   6166 
   6167 static void
   6168 e1000g_fm_init(struct e1000g *Adapter)
   6169 {
   6170 	ddi_iblock_cookie_t iblk;
   6171 	int fma_dma_flag;
   6172 
   6173 	/* Only register with IO Fault Services if we have some capability */
   6174 	if (Adapter->fm_capabilities & DDI_FM_ACCCHK_CAPABLE) {
   6175 		e1000g_regs_acc_attr.devacc_attr_access = DDI_FLAGERR_ACC;
   6176 	} else {
   6177 		e1000g_regs_acc_attr.devacc_attr_access = DDI_DEFAULT_ACC;
   6178 	}
   6179 
   6180 	if (Adapter->fm_capabilities & DDI_FM_DMACHK_CAPABLE) {
   6181 		fma_dma_flag = 1;
   6182 	} else {
   6183 		fma_dma_flag = 0;
   6184 	}
   6185 
   6186 	(void) e1000g_set_fma_flags(fma_dma_flag);
   6187 
   6188 	if (Adapter->fm_capabilities) {
   6189 
   6190 		/* Register capabilities with IO Fault Services */
   6191 		ddi_fm_init(Adapter->dip, &Adapter->fm_capabilities, &iblk);
   6192 
   6193 		/*
   6194 		 * Initialize pci ereport capabilities if ereport capable
   6195 		 */
   6196 		if (DDI_FM_EREPORT_CAP(Adapter->fm_capabilities) ||
   6197 		    DDI_FM_ERRCB_CAP(Adapter->fm_capabilities))
   6198 			pci_ereport_setup(Adapter->dip);
   6199 
   6200 		/*
   6201 		 * Register error callback if error callback capable
   6202 		 */
   6203 		if (DDI_FM_ERRCB_CAP(Adapter->fm_capabilities))
   6204 			ddi_fm_handler_register(Adapter->dip,
   6205 			    e1000g_fm_error_cb, (void*) Adapter);
   6206 	}
   6207 }
   6208 
   6209 static void
   6210 e1000g_fm_fini(struct e1000g *Adapter)
   6211 {
   6212 	/* Only unregister FMA capabilities if we registered some */
   6213 	if (Adapter->fm_capabilities) {
   6214 
   6215 		/*
   6216 		 * Release any resources allocated by pci_ereport_setup()
   6217 		 */
   6218 		if (DDI_FM_EREPORT_CAP(Adapter->fm_capabilities) ||
   6219 		    DDI_FM_ERRCB_CAP(Adapter->fm_capabilities))
   6220 			pci_ereport_teardown(Adapter->dip);
   6221 
   6222 		/*
   6223 		 * Un-register error callback if error callback capable
   6224 		 */
   6225 		if (DDI_FM_ERRCB_CAP(Adapter->fm_capabilities))
   6226 			ddi_fm_handler_unregister(Adapter->dip);
   6227 
   6228 		/* Unregister from IO Fault Services */
   6229 		mutex_enter(&e1000g_rx_detach_lock);
   6230 		ddi_fm_fini(Adapter->dip);
   6231 		if (Adapter->priv_dip != NULL) {
   6232 			DEVI(Adapter->priv_dip)->devi_fmhdl = NULL;
   6233 		}
   6234 		mutex_exit(&e1000g_rx_detach_lock);
   6235 	}
   6236 }
   6237 
   6238 void
   6239 e1000g_fm_ereport(struct e1000g *Adapter, char *detail)
   6240 {
   6241 	uint64_t ena;
   6242 	char buf[FM_MAX_CLASS];
   6243 
   6244 	(void) snprintf(buf, FM_MAX_CLASS, "%s.%s", DDI_FM_DEVICE, detail);
   6245 	ena = fm_ena_generate(0, FM_ENA_FMT1);
   6246 	if (DDI_FM_EREPORT_CAP(Adapter->fm_capabilities)) {
   6247 		ddi_fm_ereport_post(Adapter->dip, buf, ena, DDI_NOSLEEP,
   6248 		    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, NULL);
   6249 	}
   6250 }
   6251 
   6252 /*
   6253  * quiesce(9E) entry point.
   6254  *
   6255  * This function is called when the system is single-threaded at high
   6256  * PIL with preemption disabled. Therefore, this function must not be
   6257  * blocked.
   6258  *
   6259  * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure.
   6260  * DDI_FAILURE indicates an error condition and should almost never happen.
   6261  */
   6262 static int
   6263 e1000g_quiesce(dev_info_t *devinfo)
   6264 {
   6265 	struct e1000g *Adapter;
   6266 
   6267 	Adapter = (struct e1000g *)ddi_get_driver_private(devinfo);
   6268 
   6269 	if (Adapter == NULL)
   6270 		return (DDI_FAILURE);
   6271 
   6272 	e1000g_clear_all_interrupts(Adapter);
   6273 
   6274 	(void) e1000_reset_hw(&Adapter->shared);
   6275 
   6276 	/* Setup our HW Tx Head & Tail descriptor pointers */
   6277 	E1000_WRITE_REG(&Adapter->shared, E1000_TDH(0), 0);
   6278 	E1000_WRITE_REG(&Adapter->shared, E1000_TDT(0), 0);
   6279 
   6280 	/* Setup our HW Rx Head & Tail descriptor pointers */
   6281 	E1000_WRITE_REG(&Adapter->shared, E1000_RDH(0), 0);
   6282 	E1000_WRITE_REG(&Adapter->shared, E1000_RDT(0), 0);
   6283 
   6284 	return (DDI_SUCCESS);
   6285 }
   6286 
   6287 static int
   6288 e1000g_get_def_val(struct e1000g *Adapter, mac_prop_id_t pr_num,
   6289     uint_t pr_valsize, void *pr_val)
   6290 {
   6291 	link_flowctrl_t fl;
   6292 	struct e1000_hw *hw = &Adapter->shared;
   6293 	int err = 0;
   6294 
   6295 	ASSERT(pr_valsize > 0);
   6296 	switch (pr_num) {
   6297 	case MAC_PROP_AUTONEG:
   6298 		if (hw->phy.media_type != e1000_media_type_copper)
   6299 			*(uint8_t *)pr_val = 0;
   6300 		else
   6301 			*(uint8_t *)pr_val =
   6302 			    ((Adapter->phy_status & MII_SR_AUTONEG_CAPS)
   6303 			    ? 1 : 0);
   6304 		break;
   6305 	case MAC_PROP_FLOWCTRL:
   6306 		if (pr_valsize < sizeof (link_flowctrl_t))
   6307 			return (EINVAL);
   6308 		fl = LINK_FLOWCTRL_BI;
   6309 		bcopy(&fl, pr_val, sizeof (fl));
   6310 		break;
   6311 	case MAC_PROP_ADV_1000FDX_CAP:
   6312 	case MAC_PROP_EN_1000FDX_CAP:
   6313 		if (hw->phy.media_type != e1000_media_type_copper)
   6314 			*(uint8_t *)pr_val = 1;
   6315 		else
   6316 			*(uint8_t *)pr_val =
   6317 			    ((Adapter->phy_ext_status &
   6318 			    IEEE_ESR_1000T_FD_CAPS) ||
   6319 			    (Adapter->phy_ext_status & IEEE_ESR_1000X_FD_CAPS))
   6320 			    ? 1 : 0;
   6321 		break;
   6322 	case MAC_PROP_ADV_1000HDX_CAP:
   6323 	case MAC_PROP_EN_1000HDX_CAP:
   6324 		*(uint8_t *)pr_val = 0;
   6325 		break;
   6326 	case MAC_PROP_ADV_100FDX_CAP:
   6327 	case MAC_PROP_EN_100FDX_CAP:
   6328 		if (hw->phy.media_type != e1000_media_type_copper)
   6329 			*(uint8_t *)pr_val = 0;
   6330 		else
   6331 			*(uint8_t *)pr_val =
   6332 			    ((Adapter->phy_status & MII_SR_100X_FD_CAPS) ||
   6333 			    (Adapter->phy_status & MII_SR_100T2_FD_CAPS))
   6334 			    ? 1 : 0;
   6335 		break;
   6336 	case MAC_PROP_ADV_100HDX_CAP:
   6337 	case MAC_PROP_EN_100HDX_CAP:
   6338 		if (hw->phy.media_type != e1000_media_type_copper)
   6339 			*(uint8_t *)pr_val = 0;
   6340 		else
   6341 			*(uint8_t *)pr_val =
   6342 			    ((Adapter->phy_status & MII_SR_100X_HD_CAPS) ||
   6343 			    (Adapter->phy_status & MII_SR_100T2_HD_CAPS))
   6344 			    ? 1 : 0;
   6345 		break;
   6346 	case MAC_PROP_ADV_10FDX_CAP:
   6347 	case MAC_PROP_EN_10FDX_CAP:
   6348 		if (hw->phy.media_type != e1000_media_type_copper)
   6349 			*(uint8_t *)pr_val = 0;
   6350 		else
   6351 			*(uint8_t *)pr_val =
   6352 			    (Adapter->phy_status & MII_SR_10T_FD_CAPS) ? 1 : 0;
   6353 		break;
   6354 	case MAC_PROP_ADV_10HDX_CAP:
   6355 	case MAC_PROP_EN_10HDX_CAP:
   6356 		if (hw->phy.media_type != e1000_media_type_copper)
   6357 			*(uint8_t *)pr_val = 0;
   6358 		else
   6359 			*(uint8_t *)pr_val =
   6360 			    (Adapter->phy_status & MII_SR_10T_HD_CAPS) ? 1 : 0;
   6361 		break;
   6362 	default:
   6363 		err = ENOTSUP;
   6364 		break;
   6365 	}
   6366 	return (err);
   6367 }
   6368 
   6369 /*
   6370  * synchronize the adv* and en* parameters.
   6371  *
   6372  * See comments in <sys/dld.h> for details of the *_en_*
   6373  * parameters. The usage of ndd for setting adv parameters will
   6374  * synchronize all the en parameters with the e1000g parameters,
   6375  * implicitly disabling any settings made via dladm.
   6376  */
   6377 static void
   6378 e1000g_param_sync(struct e1000g *Adapter)
   6379 {
   6380 	Adapter->param_en_1000fdx = Adapter->param_adv_1000fdx;
   6381 	Adapter->param_en_1000hdx = Adapter->param_adv_1000hdx;
   6382 	Adapter->param_en_100fdx = Adapter->param_adv_100fdx;
   6383 	Adapter->param_en_100hdx = Adapter->param_adv_100hdx;
   6384 	Adapter->param_en_10fdx = Adapter->param_adv_10fdx;
   6385 	Adapter->param_en_10hdx = Adapter->param_adv_10hdx;
   6386 }
   6387 
   6388 /*
   6389  * e1000g_get_driver_control - tell manageability firmware that the driver
   6390  * has control.
   6391  */
   6392 static void
   6393 e1000g_get_driver_control(struct e1000_hw *hw)
   6394 {
   6395 	uint32_t ctrl_ext;
   6396 	uint32_t swsm;
   6397 
   6398 	/* tell manageability firmware the driver has taken over */
   6399 	switch (hw->mac.type) {
   6400 	case e1000_82573:
   6401 		swsm = E1000_READ_REG(hw, E1000_SWSM);
   6402 		E1000_WRITE_REG(hw, E1000_SWSM, swsm | E1000_SWSM_DRV_LOAD);
   6403 		break;
   6404 	case e1000_82571:
   6405 	case e1000_82572:
   6406 	case e1000_82574:
   6407 	case e1000_80003es2lan:
   6408 	case e1000_ich8lan:
   6409 	case e1000_ich9lan:
   6410 	case e1000_ich10lan:
   6411 	case e1000_pchlan:
   6412 		ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT);
   6413 		E1000_WRITE_REG(hw, E1000_CTRL_EXT,
   6414 		    ctrl_ext | E1000_CTRL_EXT_DRV_LOAD);
   6415 		break;
   6416 	default:
   6417 		/* no manageability firmware: do nothing */
   6418 		break;
   6419 	}
   6420 }
   6421 
   6422 /*
   6423  * e1000g_release_driver_control - tell manageability firmware that the driver
   6424  * has released control.
   6425  */
   6426 static void
   6427 e1000g_release_driver_control(struct e1000_hw *hw)
   6428 {
   6429 	uint32_t ctrl_ext;
   6430 	uint32_t swsm;
   6431 
   6432 	/* tell manageability firmware the driver has released control */
   6433 	switch (hw->mac.type) {
   6434 	case e1000_82573:
   6435 		swsm = E1000_READ_REG(hw, E1000_SWSM);
   6436 		E1000_WRITE_REG(hw, E1000_SWSM, swsm & ~E1000_SWSM_DRV_LOAD);
   6437 		break;
   6438 	case e1000_82571:
   6439 	case e1000_82572:
   6440 	case e1000_82574:
   6441 	case e1000_80003es2lan:
   6442 	case e1000_ich8lan:
   6443 	case e1000_ich9lan:
   6444 	case e1000_ich10lan:
   6445 	case e1000_pchlan:
   6446 		ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT);
   6447 		E1000_WRITE_REG(hw, E1000_CTRL_EXT,
   6448 		    ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD);
   6449 		break;
   6450 	default:
   6451 		/* no manageability firmware: do nothing */
   6452 		break;
   6453 	}
   6454 }
   6455 
   6456 /*
   6457  * Restore e1000g promiscuous mode.
   6458  */
   6459 static void
   6460 e1000g_restore_promisc(struct e1000g *Adapter)
   6461 {
   6462 	if (Adapter->e1000g_promisc) {
   6463 		uint32_t rctl;
   6464 
   6465 		rctl = E1000_READ_REG(&Adapter->shared, E1000_RCTL);
   6466 		rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE | E1000_RCTL_BAM);
   6467 		E1000_WRITE_REG(&Adapter->shared, E1000_RCTL, rctl);
   6468 	}
   6469 }
   6470