Home | History | Annotate | Download | only in nge
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 
     22 /*
     23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 #include "nge.h"
     28 static uint32_t	nge_watchdog_count	= 1 << 5;
     29 static uint32_t	nge_watchdog_check	= 1 << 3;
     30 extern boolean_t nge_enable_msi;
     31 static void nge_sync_mac_modes(nge_t *);
     32 
     33 #undef NGE_DBG
     34 #define	NGE_DBG		NGE_DBG_CHIP
     35 
     36 /*
     37  * Operating register get/set access routines
     38  */
     39 uint8_t nge_reg_get8(nge_t *ngep, nge_regno_t regno);
     40 #pragma	inline(nge_reg_get8)
     41 
     42 uint8_t
     43 nge_reg_get8(nge_t *ngep, nge_regno_t regno)
     44 {
     45 	NGE_TRACE(("nge_reg_get8($%p, 0x%lx)", (void *)ngep, regno));
     46 
     47 	return (ddi_get8(ngep->io_handle, PIO_ADDR(ngep, regno)));
     48 }
     49 
     50 void nge_reg_put8(nge_t *ngep, nge_regno_t regno, uint8_t data);
     51 #pragma	inline(nge_reg_put8)
     52 
     53 void
     54 nge_reg_put8(nge_t *ngep, nge_regno_t regno, uint8_t data)
     55 {
     56 	NGE_TRACE(("nge_reg_put8($%p, 0x%lx, 0x%x)",
     57 	    (void *)ngep, regno, data));
     58 	ddi_put8(ngep->io_handle, PIO_ADDR(ngep, regno), data);
     59 
     60 }
     61 
     62 uint16_t nge_reg_get16(nge_t *ngep, nge_regno_t regno);
     63 #pragma	inline(nge_reg_get16)
     64 
     65 uint16_t
     66 nge_reg_get16(nge_t *ngep, nge_regno_t regno)
     67 {
     68 	NGE_TRACE(("nge_reg_get16($%p, 0x%lx)", (void *)ngep, regno));
     69 	return (ddi_get16(ngep->io_handle, PIO_ADDR(ngep, regno)));
     70 }
     71 
     72 void nge_reg_put16(nge_t *ngep, nge_regno_t regno, uint16_t data);
     73 #pragma	inline(nge_reg_put16)
     74 
     75 void
     76 nge_reg_put16(nge_t *ngep, nge_regno_t regno, uint16_t data)
     77 {
     78 	NGE_TRACE(("nge_reg_put16($%p, 0x%lx, 0x%x)",
     79 	    (void *)ngep, regno, data));
     80 	ddi_put16(ngep->io_handle, PIO_ADDR(ngep, regno), data);
     81 
     82 }
     83 
     84 uint32_t nge_reg_get32(nge_t *ngep, nge_regno_t regno);
     85 #pragma	inline(nge_reg_get32)
     86 
     87 uint32_t
     88 nge_reg_get32(nge_t *ngep, nge_regno_t regno)
     89 {
     90 	NGE_TRACE(("nge_reg_get32($%p, 0x%lx)", (void *)ngep, regno));
     91 	return (ddi_get32(ngep->io_handle, PIO_ADDR(ngep, regno)));
     92 }
     93 
     94 void nge_reg_put32(nge_t *ngep, nge_regno_t regno, uint32_t data);
     95 #pragma	inline(nge_reg_put32)
     96 
     97 void
     98 nge_reg_put32(nge_t *ngep, nge_regno_t regno, uint32_t data)
     99 {
    100 	NGE_TRACE(("nge_reg_put32($%p, 0x%lx, 0x%x)",
    101 	    (void *)ngep, regno, data));
    102 	ddi_put32(ngep->io_handle, PIO_ADDR(ngep, regno), data);
    103 
    104 }
    105 
    106 
    107 static int nge_chip_peek_cfg(nge_t *ngep, nge_peekpoke_t *ppd);
    108 #pragma	no_inline(nge_chip_peek_cfg)
    109 
    110 static int
    111 nge_chip_peek_cfg(nge_t *ngep, nge_peekpoke_t *ppd)
    112 {
    113 	int err;
    114 	uint64_t regval;
    115 	uint64_t regno;
    116 
    117 	NGE_TRACE(("nge_chip_peek_cfg($%p, $%p)",
    118 	    (void *)ngep, (void *)ppd));
    119 
    120 	err = DDI_SUCCESS;
    121 	regno = ppd->pp_acc_offset;
    122 
    123 	switch (ppd->pp_acc_size) {
    124 	case 1:
    125 		regval = pci_config_get8(ngep->cfg_handle, regno);
    126 		break;
    127 
    128 	case 2:
    129 		regval = pci_config_get16(ngep->cfg_handle, regno);
    130 		break;
    131 
    132 	case 4:
    133 		regval = pci_config_get32(ngep->cfg_handle, regno);
    134 		break;
    135 
    136 	case 8:
    137 		regval = pci_config_get64(ngep->cfg_handle, regno);
    138 		break;
    139 	}
    140 	ppd->pp_acc_data = regval;
    141 	return (err);
    142 }
    143 
    144 static int nge_chip_poke_cfg(nge_t *ngep, nge_peekpoke_t *ppd);
    145 
    146 static int
    147 nge_chip_poke_cfg(nge_t *ngep, nge_peekpoke_t *ppd)
    148 {
    149 	int err;
    150 	uint64_t regval;
    151 	uint64_t regno;
    152 
    153 	NGE_TRACE(("nge_chip_poke_cfg($%p, $%p)",
    154 	    (void *)ngep, (void *)ppd));
    155 
    156 	err = DDI_SUCCESS;
    157 	regno = ppd->pp_acc_offset;
    158 	regval = ppd->pp_acc_data;
    159 
    160 	switch (ppd->pp_acc_size) {
    161 	case 1:
    162 		pci_config_put8(ngep->cfg_handle, regno, regval);
    163 		break;
    164 
    165 	case 2:
    166 		pci_config_put16(ngep->cfg_handle, regno, regval);
    167 		break;
    168 
    169 	case 4:
    170 		pci_config_put32(ngep->cfg_handle, regno, regval);
    171 		break;
    172 
    173 	case 8:
    174 		pci_config_put64(ngep->cfg_handle, regno, regval);
    175 		break;
    176 	}
    177 
    178 	return (err);
    179 
    180 }
    181 
    182 static int nge_chip_peek_reg(nge_t *ngep, nge_peekpoke_t *ppd);
    183 
    184 static int
    185 nge_chip_peek_reg(nge_t *ngep, nge_peekpoke_t *ppd)
    186 {
    187 	int err;
    188 	uint64_t regval;
    189 	void *regaddr;
    190 
    191 	NGE_TRACE(("nge_chip_peek_reg($%p, $%p)",
    192 	    (void *)ngep, (void *)ppd));
    193 
    194 	err = DDI_SUCCESS;
    195 	regaddr = PIO_ADDR(ngep, ppd->pp_acc_offset);
    196 
    197 	switch (ppd->pp_acc_size) {
    198 	case 1:
    199 		regval = ddi_get8(ngep->io_handle, regaddr);
    200 	break;
    201 
    202 	case 2:
    203 		regval = ddi_get16(ngep->io_handle, regaddr);
    204 	break;
    205 
    206 	case 4:
    207 		regval = ddi_get32(ngep->io_handle, regaddr);
    208 	break;
    209 
    210 	case 8:
    211 		regval = ddi_get64(ngep->io_handle, regaddr);
    212 	break;
    213 
    214 	default:
    215 		regval = 0x0ull;
    216 	break;
    217 	}
    218 	ppd->pp_acc_data = regval;
    219 	return (err);
    220 }
    221 
    222 static int nge_chip_poke_reg(nge_t *ngep, nge_peekpoke_t *ppd);
    223 
    224 static int
    225 nge_chip_poke_reg(nge_t *ngep, nge_peekpoke_t *ppd)
    226 {
    227 	int err;
    228 	uint64_t regval;
    229 	void *regaddr;
    230 
    231 	NGE_TRACE(("nge_chip_poke_reg($%p, $%p)",
    232 	    (void *)ngep, (void *)ppd));
    233 
    234 	err = DDI_SUCCESS;
    235 	regaddr = PIO_ADDR(ngep, ppd->pp_acc_offset);
    236 	regval = ppd->pp_acc_data;
    237 
    238 	switch (ppd->pp_acc_size) {
    239 	case 1:
    240 		ddi_put8(ngep->io_handle, regaddr, regval);
    241 		break;
    242 
    243 	case 2:
    244 		ddi_put16(ngep->io_handle, regaddr, regval);
    245 		break;
    246 
    247 	case 4:
    248 		ddi_put32(ngep->io_handle, regaddr, regval);
    249 		break;
    250 
    251 	case 8:
    252 		ddi_put64(ngep->io_handle, regaddr, regval);
    253 		break;
    254 	}
    255 	return (err);
    256 }
    257 
    258 static int nge_chip_peek_mii(nge_t *ngep, nge_peekpoke_t *ppd);
    259 #pragma	no_inline(nge_chip_peek_mii)
    260 
    261 static int
    262 nge_chip_peek_mii(nge_t *ngep, nge_peekpoke_t *ppd)
    263 {
    264 	int err;
    265 
    266 	err = DDI_SUCCESS;
    267 	ppd->pp_acc_data = nge_mii_get16(ngep, ppd->pp_acc_offset/2);
    268 	return (err);
    269 }
    270 
    271 static int nge_chip_poke_mii(nge_t *ngep, nge_peekpoke_t *ppd);
    272 #pragma	no_inline(nge_chip_poke_mii)
    273 
    274 static int
    275 nge_chip_poke_mii(nge_t *ngep, nge_peekpoke_t *ppd)
    276 {
    277 	int err;
    278 	err = DDI_SUCCESS;
    279 	nge_mii_put16(ngep, ppd->pp_acc_offset/2, ppd->pp_acc_data);
    280 	return (err);
    281 }
    282 
    283 /*
    284  * Basic SEEPROM get/set access routine
    285  *
    286  * This uses the chip's SEEPROM auto-access method, controlled by the
    287  * Serial EEPROM Address/Data Registers at 0x504h, so the CPU
    288  * doesn't have to fiddle with the individual bits.
    289  *
    290  * The caller should hold <genlock> and *also* have already acquired
    291  * the right to access the SEEPROM.
    292  *
    293  * Return value:
    294  *	0 on success,
    295  *	ENODATA on access timeout (maybe retryable: device may just be busy)
    296  *	EPROTO on other h/w or s/w errors.
    297  *
    298  * <*dp> is an input to a SEEPROM_ACCESS_WRITE operation, or an output
    299  * from a (successful) SEEPROM_ACCESS_READ.
    300  */
    301 
    302 static int
    303 nge_seeprom_access(nge_t *ngep, uint32_t cmd, nge_regno_t addr, uint16_t *dp)
    304 {
    305 	uint32_t tries;
    306 	nge_ep_cmd cmd_reg;
    307 	nge_ep_data data_reg;
    308 
    309 	NGE_TRACE(("nge_seeprom_access($%p, %d, %x, $%p)",
    310 	    (void *)ngep, cmd, addr, (void *)dp));
    311 
    312 	ASSERT(mutex_owned(ngep->genlock));
    313 
    314 	/*
    315 	 * Check there's no command in progress.
    316 	 *
    317 	 * Note: this *shouldn't* ever find that there is a command
    318 	 * in progress, because we already hold the <genlock> mutex.
    319 	 * Also, to ensure we don't have a conflict with the chip's
    320 	 * internal firmware or a process accessing the same (shared)
    321 	 * So this is just a final consistency check: we shouldn't
    322 	 * see EITHER the START bit (command started but not complete)
    323 	 * OR the COMPLETE bit (command completed but not cleared).
    324 	 */
    325 	cmd_reg.cmd_val = nge_reg_get32(ngep, NGE_EP_CMD);
    326 	for (tries = 0; tries < 30; tries++) {
    327 		if (cmd_reg.cmd_bits.sts == SEEPROM_READY)
    328 			break;
    329 		drv_usecwait(10);
    330 		cmd_reg.cmd_val = nge_reg_get32(ngep, NGE_EP_CMD);
    331 	}
    332 
    333 	/*
    334 	 * This should not happen. If so, we have to restart eeprom
    335 	 *  state machine
    336 	 */
    337 	if (tries == 30) {
    338 		cmd_reg.cmd_bits.sts = SEEPROM_READY;
    339 		nge_reg_put32(ngep, NGE_EP_CMD, cmd_reg.cmd_val);
    340 		drv_usecwait(10);
    341 		/*
    342 		 * Polling the status bit to make assure the eeprom is ready
    343 		 */
    344 		cmd_reg.cmd_val = nge_reg_get32(ngep, NGE_EP_CMD);
    345 		for (tries = 0; tries < 30; tries++) {
    346 			if (cmd_reg.cmd_bits.sts == SEEPROM_READY)
    347 				break;
    348 			drv_usecwait(10);
    349 			cmd_reg.cmd_val = nge_reg_get32(ngep, NGE_EP_CMD);
    350 		}
    351 	}
    352 
    353 	/*
    354 	 * Assemble the command ...
    355 	 */
    356 	cmd_reg.cmd_bits.addr = (uint32_t)addr;
    357 	cmd_reg.cmd_bits.cmd = cmd;
    358 	cmd_reg.cmd_bits.sts = 0;
    359 
    360 	nge_reg_put32(ngep, NGE_EP_CMD, cmd_reg.cmd_val);
    361 
    362 	/*
    363 	 * Polling whether the access is successful.
    364 	 *
    365 	 */
    366 	cmd_reg.cmd_val = nge_reg_get32(ngep, NGE_EP_CMD);
    367 	for (tries = 0; tries < 30; tries++) {
    368 		if (cmd_reg.cmd_bits.sts == SEEPROM_READY)
    369 			break;
    370 		drv_usecwait(10);
    371 		cmd_reg.cmd_val = nge_reg_get32(ngep, NGE_EP_CMD);
    372 	}
    373 
    374 	if (tries == 30) {
    375 		nge_report(ngep, NGE_HW_ROM);
    376 		return (DDI_FAILURE);
    377 	}
    378 	switch (cmd) {
    379 	default:
    380 	case SEEPROM_CMD_WRITE_ENABLE:
    381 	case SEEPROM_CMD_ERASE:
    382 	case SEEPROM_CMD_ERALSE_ALL:
    383 	case SEEPROM_CMD_WRITE_DIS:
    384 	break;
    385 
    386 	case SEEPROM_CMD_READ:
    387 		data_reg.data_val = nge_reg_get32(ngep, NGE_EP_DATA);
    388 		*dp = data_reg.data_bits.data;
    389 	break;
    390 
    391 	case SEEPROM_CMD_WRITE:
    392 		data_reg.data_val = nge_reg_get32(ngep, NGE_EP_DATA);
    393 		data_reg.data_bits.data = *dp;
    394 		nge_reg_put32(ngep, NGE_EP_DATA, data_reg.data_val);
    395 	break;
    396 	}
    397 
    398 	return (DDI_SUCCESS);
    399 }
    400 
    401 
    402 static int
    403 nge_chip_peek_seeprom(nge_t *ngep, nge_peekpoke_t *ppd)
    404 {
    405 	uint16_t data;
    406 	int err;
    407 
    408 	err = nge_seeprom_access(ngep, SEEPROM_CMD_READ,
    409 	    ppd->pp_acc_offset, &data);
    410 	ppd->pp_acc_data =  data;
    411 	return (err);
    412 }
    413 
    414 static int
    415 nge_chip_poke_seeprom(nge_t *ngep, nge_peekpoke_t *ppd)
    416 {
    417 	uint16_t data;
    418 	int err;
    419 
    420 	data = ppd->pp_acc_data;
    421 	err = nge_seeprom_access(ngep, SEEPROM_CMD_WRITE,
    422 	    ppd->pp_acc_offset, &data);
    423 	return (err);
    424 }
    425 
    426 void
    427 nge_init_dev_spec_param(nge_t *ngep)
    428 {
    429 	nge_dev_spec_param_t	*dev_param_p;
    430 	chip_info_t	*infop;
    431 
    432 	dev_param_p = &ngep->dev_spec_param;
    433 	infop = (chip_info_t *)&ngep->chipinfo;
    434 
    435 	switch (infop->device) {
    436 	case DEVICE_ID_NF3_E6:
    437 	case DEVICE_ID_NF3_DF:
    438 	case DEVICE_ID_MCP04_37:
    439 	case DEVICE_ID_MCP04_38:
    440 		dev_param_p->msi = B_FALSE;
    441 		dev_param_p->msi_x = B_FALSE;
    442 		dev_param_p->vlan = B_FALSE;
    443 		dev_param_p->advanced_pm = B_FALSE;
    444 		dev_param_p->mac_addr_order = B_FALSE;
    445 		dev_param_p->tx_pause_frame = B_FALSE;
    446 		dev_param_p->rx_pause_frame = B_FALSE;
    447 		dev_param_p->jumbo = B_FALSE;
    448 		dev_param_p->tx_rx_64byte = B_FALSE;
    449 		dev_param_p->rx_hw_checksum = B_FALSE;
    450 		dev_param_p->tx_hw_checksum = 0;
    451 		dev_param_p->desc_type = DESC_OFFLOAD;
    452 		dev_param_p->rx_desc_num = NGE_RECV_SLOTS_DESC_1024;
    453 		dev_param_p->tx_desc_num = NGE_SEND_SLOTS_DESC_1024;
    454 		dev_param_p->nge_split = NGE_SPLIT_32;
    455 		break;
    456 
    457 	case DEVICE_ID_CK804_56:
    458 	case DEVICE_ID_CK804_57:
    459 		dev_param_p->msi = B_TRUE;
    460 		dev_param_p->msi_x = B_TRUE;
    461 		dev_param_p->vlan = B_FALSE;
    462 		dev_param_p->advanced_pm = B_FALSE;
    463 		dev_param_p->mac_addr_order = B_FALSE;
    464 		dev_param_p->tx_pause_frame = B_FALSE;
    465 		dev_param_p->rx_pause_frame = B_TRUE;
    466 		dev_param_p->jumbo = B_TRUE;
    467 		dev_param_p->tx_rx_64byte = B_FALSE;
    468 		dev_param_p->rx_hw_checksum = B_TRUE;
    469 		dev_param_p->tx_hw_checksum = HCKSUM_IPHDRCKSUM;
    470 		dev_param_p->desc_type = DESC_HOT;
    471 		dev_param_p->rx_desc_num = NGE_RECV_SLOTS_DESC_3072;
    472 		dev_param_p->tx_desc_num = NGE_SEND_SLOTS_DESC_3072;
    473 		dev_param_p->nge_split = NGE_SPLIT_96;
    474 		break;
    475 
    476 	case DEVICE_ID_MCP51_268:
    477 	case DEVICE_ID_MCP51_269:
    478 		dev_param_p->msi = B_FALSE;
    479 		dev_param_p->msi_x = B_FALSE;
    480 		dev_param_p->vlan = B_FALSE;
    481 		dev_param_p->advanced_pm = B_TRUE;
    482 		dev_param_p->mac_addr_order = B_FALSE;
    483 		dev_param_p->tx_pause_frame = B_FALSE;
    484 		dev_param_p->rx_pause_frame = B_FALSE;
    485 		dev_param_p->jumbo = B_FALSE;
    486 		dev_param_p->tx_rx_64byte = B_TRUE;
    487 		dev_param_p->rx_hw_checksum = B_FALSE;
    488 		dev_param_p->tx_hw_checksum = 0;
    489 		dev_param_p->desc_type = DESC_OFFLOAD;
    490 		dev_param_p->rx_desc_num = NGE_RECV_SLOTS_DESC_1024;
    491 		dev_param_p->tx_desc_num = NGE_SEND_SLOTS_DESC_1024;
    492 		dev_param_p->nge_split = NGE_SPLIT_32;
    493 		break;
    494 
    495 	case DEVICE_ID_MCP55_372:
    496 	case DEVICE_ID_MCP55_373:
    497 		dev_param_p->msi = B_TRUE;
    498 		dev_param_p->msi_x = B_TRUE;
    499 		dev_param_p->vlan = B_TRUE;
    500 		dev_param_p->advanced_pm = B_TRUE;
    501 		dev_param_p->mac_addr_order = B_FALSE;
    502 		dev_param_p->tx_pause_frame = B_TRUE;
    503 		dev_param_p->rx_pause_frame = B_TRUE;
    504 		dev_param_p->jumbo = B_TRUE;
    505 		dev_param_p->tx_rx_64byte = B_TRUE;
    506 		dev_param_p->rx_hw_checksum = B_TRUE;
    507 		dev_param_p->tx_hw_checksum = HCKSUM_IPHDRCKSUM;
    508 		dev_param_p->desc_type = DESC_HOT;
    509 		dev_param_p->rx_desc_num = NGE_RECV_SLOTS_DESC_3072;
    510 		dev_param_p->tx_desc_num = NGE_SEND_SLOTS_DESC_3072;
    511 		dev_param_p->nge_split = NGE_SPLIT_96;
    512 		break;
    513 
    514 	case DEVICE_ID_MCP61_3EE:
    515 	case DEVICE_ID_MCP61_3EF:
    516 		dev_param_p->msi = B_FALSE;
    517 		dev_param_p->msi_x = B_FALSE;
    518 		dev_param_p->vlan = B_FALSE;
    519 		dev_param_p->advanced_pm = B_TRUE;
    520 		dev_param_p->mac_addr_order = B_TRUE;
    521 		dev_param_p->tx_pause_frame = B_FALSE;
    522 		dev_param_p->rx_pause_frame = B_FALSE;
    523 		dev_param_p->jumbo = B_FALSE;
    524 		dev_param_p->tx_rx_64byte = B_TRUE;
    525 		dev_param_p->rx_hw_checksum = B_FALSE;
    526 		dev_param_p->tx_hw_checksum = 0;
    527 		dev_param_p->desc_type = DESC_OFFLOAD;
    528 		dev_param_p->rx_desc_num = NGE_RECV_SLOTS_DESC_1024;
    529 		dev_param_p->tx_desc_num = NGE_SEND_SLOTS_DESC_1024;
    530 		dev_param_p->nge_split = NGE_SPLIT_32;
    531 		break;
    532 
    533 	case DEVICE_ID_MCP77_760:
    534 	case DEVICE_ID_MCP79_AB0:
    535 		dev_param_p->msi = B_FALSE;
    536 		dev_param_p->msi_x = B_FALSE;
    537 		dev_param_p->vlan = B_FALSE;
    538 		dev_param_p->advanced_pm = B_TRUE;
    539 		dev_param_p->mac_addr_order = B_TRUE;
    540 		dev_param_p->tx_pause_frame = B_FALSE;
    541 		dev_param_p->rx_pause_frame = B_FALSE;
    542 		dev_param_p->jumbo = B_FALSE;
    543 		dev_param_p->tx_rx_64byte = B_TRUE;
    544 		dev_param_p->rx_hw_checksum = B_FALSE;
    545 		dev_param_p->tx_hw_checksum = 0;
    546 		dev_param_p->desc_type = DESC_HOT;
    547 		dev_param_p->rx_desc_num = NGE_RECV_SLOTS_DESC_1024;
    548 		dev_param_p->tx_desc_num = NGE_SEND_SLOTS_DESC_1024;
    549 		dev_param_p->nge_split = NGE_SPLIT_32;
    550 		break;
    551 
    552 	default:
    553 		dev_param_p->msi = B_FALSE;
    554 		dev_param_p->msi_x = B_FALSE;
    555 		dev_param_p->vlan = B_FALSE;
    556 		dev_param_p->advanced_pm = B_FALSE;
    557 		dev_param_p->mac_addr_order = B_FALSE;
    558 		dev_param_p->tx_pause_frame = B_FALSE;
    559 		dev_param_p->rx_pause_frame = B_FALSE;
    560 		dev_param_p->jumbo = B_FALSE;
    561 		dev_param_p->tx_rx_64byte = B_FALSE;
    562 		dev_param_p->rx_hw_checksum = B_FALSE;
    563 		dev_param_p->tx_hw_checksum = 0;
    564 		dev_param_p->desc_type = DESC_OFFLOAD;
    565 		dev_param_p->rx_desc_num = NGE_RECV_SLOTS_DESC_1024;
    566 		dev_param_p->tx_desc_num = NGE_SEND_SLOTS_DESC_1024;
    567 		dev_param_p->nge_split = NGE_SPLIT_32;
    568 		return;
    569 	}
    570 }
    571 /*
    572  * Perform first-stage chip (re-)initialisation, using only config-space
    573  * accesses:
    574  *
    575  * + Read the vendor/device/revision/subsystem/cache-line-size registers,
    576  *   returning the data in the structure pointed to by <infop>.
    577  */
    578 void nge_chip_cfg_init(nge_t *ngep, chip_info_t *infop, boolean_t reset);
    579 #pragma	no_inline(nge_chip_cfg_init)
    580 
    581 void
    582 nge_chip_cfg_init(nge_t *ngep, chip_info_t *infop, boolean_t reset)
    583 {
    584 	uint16_t command;
    585 	ddi_acc_handle_t handle;
    586 	nge_interbus_conf interbus_conf;
    587 	nge_msi_mask_conf msi_mask_conf;
    588 	nge_msi_map_cap_conf cap_conf;
    589 
    590 	NGE_TRACE(("nge_chip_cfg_init($%p, $%p, %d)",
    591 	    (void *)ngep, (void *)infop, reset));
    592 
    593 	/*
    594 	 * save PCI cache line size and subsystem vendor ID
    595 	 *
    596 	 * Read all the config-space registers that characterise the
    597 	 * chip, specifically vendor/device/revision/subsystem vendor
    598 	 * and subsystem device id.  We expect (but don't check) that
    599 	 */
    600 	handle = ngep->cfg_handle;
    601 	/* reading the vendor information once */
    602 	if (reset == B_FALSE) {
    603 		infop->command = pci_config_get16(handle,
    604 		    PCI_CONF_COMM);
    605 		infop->vendor = pci_config_get16(handle,
    606 		    PCI_CONF_VENID);
    607 		infop->device = pci_config_get16(handle,
    608 		    PCI_CONF_DEVID);
    609 		infop->subven = pci_config_get16(handle,
    610 		    PCI_CONF_SUBVENID);
    611 		infop->subdev = pci_config_get16(handle,
    612 		    PCI_CONF_SUBSYSID);
    613 		infop->class_code = pci_config_get8(handle,
    614 		    PCI_CONF_BASCLASS);
    615 		infop->revision = pci_config_get8(handle,
    616 		    PCI_CONF_REVID);
    617 		infop->clsize = pci_config_get8(handle,
    618 		    PCI_CONF_CACHE_LINESZ);
    619 		infop->latency = pci_config_get8(handle,
    620 		    PCI_CONF_LATENCY_TIMER);
    621 	}
    622 	if (nge_enable_msi) {
    623 		/* Disable the hidden for MSI support */
    624 		interbus_conf.conf_val = pci_config_get32(handle,
    625 		    PCI_CONF_HT_INTERNAL);
    626 		if ((infop->device == DEVICE_ID_MCP55_373) ||
    627 		    (infop->device == DEVICE_ID_MCP55_372))
    628 			interbus_conf.conf_bits.msix_off = NGE_SET;
    629 		interbus_conf.conf_bits.msi_off = NGE_CLEAR;
    630 		pci_config_put32(handle, PCI_CONF_HT_INTERNAL,
    631 		    interbus_conf.conf_val);
    632 
    633 		if ((infop->device == DEVICE_ID_MCP55_373) ||
    634 		    (infop->device == DEVICE_ID_MCP55_372)) {
    635 
    636 			/* Disable the vector off for mcp55 */
    637 			msi_mask_conf.msi_mask_conf_val =
    638 			    pci_config_get32(handle, PCI_CONF_HT_MSI_MASK);
    639 			msi_mask_conf.msi_mask_bits.vec0_off = NGE_CLEAR;
    640 			msi_mask_conf.msi_mask_bits.vec1_off = NGE_CLEAR;
    641 			msi_mask_conf.msi_mask_bits.vec2_off = NGE_CLEAR;
    642 			msi_mask_conf.msi_mask_bits.vec3_off = NGE_CLEAR;
    643 			msi_mask_conf.msi_mask_bits.vec4_off = NGE_CLEAR;
    644 			msi_mask_conf.msi_mask_bits.vec5_off = NGE_CLEAR;
    645 			msi_mask_conf.msi_mask_bits.vec6_off = NGE_CLEAR;
    646 			msi_mask_conf.msi_mask_bits.vec7_off = NGE_CLEAR;
    647 			pci_config_put32(handle, PCI_CONF_HT_MSI_MASK,
    648 			    msi_mask_conf.msi_mask_conf_val);
    649 
    650 			/* Enable the MSI mapping */
    651 			cap_conf.msi_map_cap_conf_val =
    652 			    pci_config_get32(handle, PCI_CONF_HT_MSI_MAP_CAP);
    653 			cap_conf.map_cap_conf_bits.map_en = NGE_SET;
    654 			pci_config_put32(handle, PCI_CONF_HT_MSI_MAP_CAP,
    655 			    cap_conf.msi_map_cap_conf_val);
    656 		}
    657 	} else {
    658 		interbus_conf.conf_val = pci_config_get32(handle,
    659 		    PCI_CONF_HT_INTERNAL);
    660 		interbus_conf.conf_bits.msi_off = NGE_SET;
    661 		pci_config_put32(handle, PCI_CONF_HT_INTERNAL,
    662 		    interbus_conf.conf_val);
    663 	}
    664 	command = infop->command | PCI_COMM_MAE;
    665 	command &= ~PCI_COMM_MEMWR_INVAL;
    666 	command |= PCI_COMM_ME;
    667 	pci_config_put16(handle, PCI_CONF_COMM, command);
    668 	pci_config_put16(handle, PCI_CONF_STAT, ~0);
    669 
    670 }
    671 
    672 int
    673 nge_chip_stop(nge_t *ngep, boolean_t fault)
    674 {
    675 	int err;
    676 	uint32_t reg_val;
    677 	uint32_t	tries;
    678 	nge_mintr_src mintr_src;
    679 	nge_mii_cs mii_cs;
    680 	nge_rx_poll rx_poll;
    681 	nge_tx_poll tx_poll;
    682 	nge_rx_en rx_en;
    683 	nge_tx_en tx_en;
    684 	nge_tx_sta tx_sta;
    685 	nge_rx_sta rx_sta;
    686 	nge_mode_cntl mode;
    687 	nge_pmu_cntl2 pmu_cntl2;
    688 
    689 	NGE_TRACE(("nge_chip_stop($%p, %d)", (void *)ngep, fault));
    690 
    691 	err = DDI_SUCCESS;
    692 
    693 	/* Clear any pending PHY interrupt */
    694 	mintr_src.src_val = nge_reg_get8(ngep, NGE_MINTR_SRC);
    695 	nge_reg_put8(ngep, NGE_MINTR_SRC, mintr_src.src_val);
    696 
    697 	/* Mask all interrupts */
    698 	reg_val = nge_reg_get32(ngep, NGE_INTR_MASK);
    699 	reg_val &= ~NGE_INTR_ALL_EN;
    700 	nge_reg_put32(ngep, NGE_INTR_MASK, reg_val);
    701 
    702 	/* Disable auto-polling of phy */
    703 	mii_cs.cs_val = nge_reg_get32(ngep, NGE_MII_CS);
    704 	mii_cs.cs_bits.ap_en = NGE_CLEAR;
    705 	nge_reg_put32(ngep, NGE_MII_CS, mii_cs.cs_val);
    706 
    707 	/* Reset buffer management & DMA */
    708 	mode.mode_val = nge_reg_get32(ngep, NGE_MODE_CNTL);
    709 	mode.mode_bits.dma_dis = NGE_SET;
    710 	mode.mode_bits.desc_type = ngep->desc_mode;
    711 	nge_reg_put32(ngep, NGE_MODE_CNTL, mode.mode_val);
    712 
    713 	for (tries = 0; tries < 10000; tries++) {
    714 		drv_usecwait(10);
    715 		mode.mode_val = nge_reg_get32(ngep, NGE_MODE_CNTL);
    716 		if (mode.mode_bits.dma_status == NGE_SET)
    717 			break;
    718 	}
    719 	if (tries == 10000) {
    720 		ngep->nge_chip_state = NGE_CHIP_ERROR;
    721 		return (DDI_FAILURE);
    722 	}
    723 
    724 	/* Disable rx's machine */
    725 	rx_en.val = nge_reg_get8(ngep, NGE_RX_EN);
    726 	rx_en.bits.rx_en = NGE_CLEAR;
    727 	nge_reg_put8(ngep, NGE_RX_EN, rx_en.val);
    728 
    729 	/* Disable tx's machine */
    730 	tx_en.val = nge_reg_get8(ngep, NGE_TX_EN);
    731 	tx_en.bits.tx_en = NGE_CLEAR;
    732 	nge_reg_put8(ngep, NGE_TX_EN, tx_en.val);
    733 
    734 	/*
    735 	 * Clean the status of tx's state machine
    736 	 * and Make assure the tx's channel is idle
    737 	 */
    738 	tx_sta.sta_val = nge_reg_get32(ngep, NGE_TX_STA);
    739 	for (tries = 0; tries < 1000; tries++) {
    740 		if (tx_sta.sta_bits.tx_chan_sta == NGE_CLEAR)
    741 			break;
    742 		drv_usecwait(10);
    743 		tx_sta.sta_val = nge_reg_get32(ngep, NGE_TX_STA);
    744 	}
    745 	if (tries == 1000) {
    746 		ngep->nge_chip_state = NGE_CHIP_ERROR;
    747 		return (DDI_FAILURE);
    748 	}
    749 	nge_reg_put32(ngep, NGE_TX_STA,  tx_sta.sta_val);
    750 
    751 	/*
    752 	 * Clean the status of rx's state machine
    753 	 * and Make assure the tx's channel is idle
    754 	 */
    755 	rx_sta.sta_val = nge_reg_get32(ngep, NGE_RX_STA);
    756 	for (tries = 0; tries < 1000; tries++) {
    757 		if (rx_sta.sta_bits.rx_chan_sta == NGE_CLEAR)
    758 			break;
    759 		drv_usecwait(10);
    760 		rx_sta.sta_val = nge_reg_get32(ngep, NGE_RX_STA);
    761 	}
    762 	if (tries == 1000) {
    763 		ngep->nge_chip_state = NGE_CHIP_ERROR;
    764 		return (DDI_FAILURE);
    765 	}
    766 	nge_reg_put32(ngep, NGE_RX_STA, rx_sta.sta_val);
    767 
    768 	/* Disable auto-poll of rx's state machine */
    769 	rx_poll.poll_val = nge_reg_get32(ngep, NGE_RX_POLL);
    770 	rx_poll.poll_bits.rpen = NGE_CLEAR;
    771 	rx_poll.poll_bits.rpi = NGE_CLEAR;
    772 	nge_reg_put32(ngep, NGE_RX_POLL, rx_poll.poll_val);
    773 
    774 	/* Disable auto-polling of tx's  state machine */
    775 	tx_poll.poll_val = nge_reg_get32(ngep, NGE_TX_POLL);
    776 	tx_poll.poll_bits.tpen = NGE_CLEAR;
    777 	tx_poll.poll_bits.tpi = NGE_CLEAR;
    778 	nge_reg_put32(ngep, NGE_TX_POLL, tx_poll.poll_val);
    779 
    780 	/* Restore buffer management */
    781 	mode.mode_val = nge_reg_get32(ngep, NGE_MODE_CNTL);
    782 	mode.mode_bits.bm_reset = NGE_SET;
    783 	mode.mode_bits.tx_rcom_en = NGE_SET;
    784 	nge_reg_put32(ngep, NGE_MODE_CNTL, mode.mode_val);
    785 
    786 	if (ngep->dev_spec_param.advanced_pm) {
    787 
    788 		nge_reg_put32(ngep, NGE_PMU_CIDLE_LIMIT, 0);
    789 		nge_reg_put32(ngep, NGE_PMU_DIDLE_LIMIT, 0);
    790 
    791 		pmu_cntl2.cntl2_val = nge_reg_get32(ngep, NGE_PMU_CNTL2);
    792 		pmu_cntl2.cntl2_bits.cidle_timer = NGE_CLEAR;
    793 		pmu_cntl2.cntl2_bits.didle_timer = NGE_CLEAR;
    794 		nge_reg_put32(ngep, NGE_PMU_CNTL2, pmu_cntl2.cntl2_val);
    795 	}
    796 	if (fault)
    797 		ngep->nge_chip_state = NGE_CHIP_FAULT;
    798 	else
    799 		ngep->nge_chip_state = NGE_CHIP_STOPPED;
    800 
    801 	return (err);
    802 }
    803 
    804 static void
    805 nge_rx_setup(nge_t *ngep)
    806 {
    807 	uint64_t desc_addr;
    808 	nge_rxtx_dlen dlen;
    809 	nge_rx_poll rx_poll;
    810 
    811 	/*
    812 	 * Filling the address and length of rx's descriptors
    813 	 */
    814 	desc_addr = ngep->recv->desc.cookie.dmac_laddress;
    815 	nge_reg_put32(ngep, NGE_RX_DADR, desc_addr);
    816 	nge_reg_put32(ngep, NGE_RX_DADR_HI, desc_addr >> 32);
    817 	dlen.dlen_val = nge_reg_get32(ngep, NGE_RXTX_DLEN);
    818 	dlen.dlen_bits.rdlen = ngep->recv->desc.nslots - 1;
    819 	nge_reg_put32(ngep, NGE_RXTX_DLEN, dlen.dlen_val);
    820 
    821 	rx_poll.poll_val = nge_reg_get32(ngep, NGE_RX_POLL);
    822 	rx_poll.poll_bits.rpi = RX_POLL_INTV_1G;
    823 	rx_poll.poll_bits.rpen = NGE_SET;
    824 	nge_reg_put32(ngep, NGE_RX_POLL, rx_poll.poll_val);
    825 }
    826 
    827 static void
    828 nge_tx_setup(nge_t *ngep)
    829 {
    830 	uint64_t desc_addr;
    831 	nge_rxtx_dlen dlen;
    832 
    833 	/*
    834 	 * Filling the address and length of tx's descriptors
    835 	 */
    836 	desc_addr = ngep->send->desc.cookie.dmac_laddress;
    837 	nge_reg_put32(ngep, NGE_TX_DADR, desc_addr);
    838 	nge_reg_put32(ngep, NGE_TX_DADR_HI, desc_addr >> 32);
    839 	dlen.dlen_val = nge_reg_get32(ngep, NGE_RXTX_DLEN);
    840 	dlen.dlen_bits.tdlen = ngep->send->desc.nslots - 1;
    841 	nge_reg_put32(ngep, NGE_RXTX_DLEN, dlen.dlen_val);
    842 }
    843 
    844 static int
    845 nge_buff_setup(nge_t *ngep)
    846 {
    847 	nge_mode_cntl mode_cntl;
    848 	nge_dev_spec_param_t	*dev_param_p;
    849 
    850 	dev_param_p = &ngep->dev_spec_param;
    851 
    852 	/*
    853 	 * Configure Rx&Tx's buffer
    854 	 */
    855 	nge_rx_setup(ngep);
    856 	nge_tx_setup(ngep);
    857 
    858 	/*
    859 	 * Configure buffer attribute
    860 	 */
    861 	mode_cntl.mode_val = nge_reg_get32(ngep, NGE_MODE_CNTL);
    862 
    863 	/*
    864 	 * Enable Dma access request
    865 	 */
    866 	mode_cntl.mode_bits.dma_dis = NGE_CLEAR;
    867 
    868 	/*
    869 	 * Enbale Buffer management
    870 	 */
    871 	mode_cntl.mode_bits.bm_reset = NGE_CLEAR;
    872 
    873 	/*
    874 	 * Support Standoffload Descriptor
    875 	 */
    876 	mode_cntl.mode_bits.desc_type = ngep->desc_mode;
    877 
    878 	/*
    879 	 * Support receive hardware checksum
    880 	 */
    881 	if (dev_param_p->rx_hw_checksum) {
    882 		mode_cntl.mode_bits.rx_sum_en = NGE_SET;
    883 	} else
    884 		mode_cntl.mode_bits.rx_sum_en = NGE_CLEAR;
    885 
    886 	/*
    887 	 * Disable Tx PRD coarse update
    888 	 */
    889 	mode_cntl.mode_bits.tx_prd_cu_en = NGE_CLEAR;
    890 
    891 	/*
    892 	 * Disable 64-byte access
    893 	 */
    894 	mode_cntl.mode_bits.w64_dis = NGE_SET;
    895 
    896 	/*
    897 	 * Skip Rx Error Frame is not supported and if
    898 	 * enable it, jumbo frame does not work any more.
    899 	 */
    900 	mode_cntl.mode_bits.rx_filter_en = NGE_CLEAR;
    901 
    902 	/*
    903 	 * Can not support hot mode now
    904 	 */
    905 	mode_cntl.mode_bits.resv15 = NGE_CLEAR;
    906 
    907 	if (dev_param_p->vlan) {
    908 		/* Disable the vlan strip for devices which support vlan */
    909 		mode_cntl.mode_bits.vlan_strip = NGE_CLEAR;
    910 
    911 		/* Disable the vlan insert for devices which supprot vlan */
    912 		mode_cntl.mode_bits.vlan_ins = NGE_CLEAR;
    913 	}
    914 
    915 	if (dev_param_p->tx_rx_64byte) {
    916 
    917 		/* Set the maximum TX PRD fetch size to 64 bytes */
    918 		mode_cntl.mode_bits.tx_fetch_prd = NGE_SET;
    919 
    920 		/* Set the maximum RX PRD fetch size to 64 bytes */
    921 		mode_cntl.mode_bits.rx_fetch_prd = NGE_SET;
    922 	}
    923 	/*
    924 	 * Upload Rx data as it arrives, rather than waiting for full frame
    925 	 */
    926 	mode_cntl.mode_bits.resv16 = NGE_CLEAR;
    927 
    928 	/*
    929 	 * Normal HOT table accesses
    930 	 */
    931 	mode_cntl.mode_bits.resv17 = NGE_CLEAR;
    932 
    933 	/*
    934 	 * Normal HOT buffer requesting
    935 	 */
    936 	mode_cntl.mode_bits.resv18 = NGE_CLEAR;
    937 	nge_reg_put32(ngep, NGE_MODE_CNTL, mode_cntl.mode_val);
    938 
    939 	/*
    940 	 * Signal controller to check for new Rx descriptors
    941 	 */
    942 	mode_cntl.mode_val = nge_reg_get32(ngep, NGE_MODE_CNTL);
    943 	mode_cntl.mode_bits.rxdm = NGE_SET;
    944 	mode_cntl.mode_bits.tx_rcom_en = NGE_SET;
    945 	nge_reg_put32(ngep, NGE_MODE_CNTL, mode_cntl.mode_val);
    946 
    947 
    948 	return (DDI_SUCCESS);
    949 }
    950 
    951 /*
    952  * When chipset resets, the chipset can not restore  the orignial
    953  * mac address to the mac address registers.
    954  *
    955  * When the driver is dettached, the function will write the orignial
    956  * mac address to the mac address registers.
    957  */
    958 
    959 void
    960 nge_restore_mac_addr(nge_t *ngep)
    961 {
    962 	uint32_t mac_addr;
    963 
    964 	mac_addr = (uint32_t)ngep->chipinfo.hw_mac_addr;
    965 	nge_reg_put32(ngep, NGE_UNI_ADDR0, mac_addr);
    966 	mac_addr = (uint32_t)(ngep->chipinfo.hw_mac_addr >> 32);
    967 	nge_reg_put32(ngep, NGE_UNI_ADDR1, mac_addr);
    968 }
    969 
    970 int
    971 nge_chip_reset(nge_t *ngep)
    972 {
    973 	int err;
    974 	uint8_t i;
    975 	uint32_t regno;
    976 	uint64_t mac = 0;
    977 	nge_uni_addr1 uaddr1;
    978 	nge_cp_cntl ee_cntl;
    979 	nge_soft_misc soft_misc;
    980 	nge_pmu_cntl0 pmu_cntl0;
    981 	nge_pmu_cntl2 pmu_cntl2;
    982 	nge_pm_cntl2 pm_cntl2;
    983 	const nge_ksindex_t *ksip;
    984 
    985 	NGE_TRACE(("nge_chip_reset($%p)", (void *)ngep));
    986 
    987 	/*
    988 	 * Clear the statistics by reading the statistics register
    989 	 */
    990 	for (ksip = nge_statistics; ksip->name != NULL; ++ksip) {
    991 		regno = KS_BASE + ksip->index * sizeof (uint32_t);
    992 		(void) nge_reg_get32(ngep, regno);
    993 	}
    994 
    995 	/*
    996 	 * Setup seeprom control
    997 	 */
    998 	ee_cntl.cntl_val = nge_reg_get32(ngep, NGE_EP_CNTL);
    999 	ee_cntl.cntl_bits.clkdiv = EEPROM_CLKDIV;
   1000 	ee_cntl.cntl_bits.rom_size = EEPROM_32K;
   1001 	ee_cntl.cntl_bits.word_wid = ACCESS_16BIT;
   1002 	ee_cntl.cntl_bits.wait_slots = EEPROM_WAITCLK;
   1003 	nge_reg_put32(ngep, NGE_EP_CNTL, ee_cntl.cntl_val);
   1004 
   1005 	/*
   1006 	 * Reading the unicast mac address table
   1007 	 */
   1008 	if (ngep->nge_chip_state == NGE_CHIP_INITIAL) {
   1009 		uaddr1.addr_val = nge_reg_get32(ngep, NGE_UNI_ADDR1);
   1010 		mac = uaddr1.addr_bits.addr;
   1011 		mac <<= 32;
   1012 		mac |= nge_reg_get32(ngep, NGE_UNI_ADDR0);
   1013 			ngep->chipinfo.hw_mac_addr = mac;
   1014 			if (ngep->dev_spec_param.mac_addr_order) {
   1015 				for (i = 0; i < ETHERADDRL; i++) {
   1016 					ngep->chipinfo.vendor_addr.addr[i] =
   1017 					    (uchar_t)mac;
   1018 					ngep->cur_uni_addr.addr[i] =
   1019 					    (uchar_t)mac;
   1020 					mac >>= 8;
   1021 				}
   1022 			} else {
   1023 				for (i = ETHERADDRL; i-- != 0; ) {
   1024 					ngep->chipinfo.vendor_addr.addr[i] =
   1025 					    (uchar_t)mac;
   1026 					ngep->cur_uni_addr.addr[i] =
   1027 					    (uchar_t)mac;
   1028 					mac >>= 8;
   1029 				}
   1030 			}
   1031 			ngep->chipinfo.vendor_addr.set = 1;
   1032 	}
   1033 	pci_config_put8(ngep->cfg_handle, PCI_CONF_CACHE_LINESZ,
   1034 	    ngep->chipinfo.clsize);
   1035 	pci_config_put8(ngep->cfg_handle, PCI_CONF_LATENCY_TIMER,
   1036 	    ngep->chipinfo.latency);
   1037 
   1038 
   1039 	if (ngep->dev_spec_param.advanced_pm) {
   1040 
   1041 		/* Program software misc register */
   1042 		soft_misc.misc_val = nge_reg_get32(ngep, NGE_SOFT_MISC);
   1043 		soft_misc.misc_bits.rx_clk_vx_rst = NGE_SET;
   1044 		soft_misc.misc_bits.tx_clk_vx_rst = NGE_SET;
   1045 		soft_misc.misc_bits.clk12m_vx_rst = NGE_SET;
   1046 		soft_misc.misc_bits.fpci_clk_vx_rst = NGE_SET;
   1047 		soft_misc.misc_bits.rx_clk_vc_rst = NGE_SET;
   1048 		soft_misc.misc_bits.tx_clk_vc_rst = NGE_SET;
   1049 		soft_misc.misc_bits.fs_clk_vc_rst = NGE_SET;
   1050 		soft_misc.misc_bits.rst_ex_m2pintf = NGE_SET;
   1051 		nge_reg_put32(ngep, NGE_SOFT_MISC, soft_misc.misc_val);
   1052 
   1053 		/* wait for 32 us */
   1054 		drv_usecwait(32);
   1055 
   1056 		soft_misc.misc_val = nge_reg_get32(ngep, NGE_SOFT_MISC);
   1057 		soft_misc.misc_bits.rx_clk_vx_rst = NGE_CLEAR;
   1058 		soft_misc.misc_bits.tx_clk_vx_rst = NGE_CLEAR;
   1059 		soft_misc.misc_bits.clk12m_vx_rst = NGE_CLEAR;
   1060 		soft_misc.misc_bits.fpci_clk_vx_rst = NGE_CLEAR;
   1061 		soft_misc.misc_bits.rx_clk_vc_rst = NGE_CLEAR;
   1062 		soft_misc.misc_bits.tx_clk_vc_rst = NGE_CLEAR;
   1063 		soft_misc.misc_bits.fs_clk_vc_rst = NGE_CLEAR;
   1064 		soft_misc.misc_bits.rst_ex_m2pintf = NGE_CLEAR;
   1065 		nge_reg_put32(ngep, NGE_SOFT_MISC, soft_misc.misc_val);
   1066 
   1067 		/* Program PMU registers */
   1068 		pmu_cntl0.cntl0_val = nge_reg_get32(ngep, NGE_PMU_CNTL0);
   1069 		pmu_cntl0.cntl0_bits.core_spd10_fp =
   1070 		    NGE_PMU_CORE_SPD10_BUSY;
   1071 		pmu_cntl0.cntl0_bits.core_spd10_idle =
   1072 		    NGE_PMU_CORE_SPD10_IDLE;
   1073 		pmu_cntl0.cntl0_bits.core_spd100_fp =
   1074 		    NGE_PMU_CORE_SPD100_BUSY;
   1075 		pmu_cntl0.cntl0_bits.core_spd100_idle =
   1076 		    NGE_PMU_CORE_SPD100_IDLE;
   1077 		pmu_cntl0.cntl0_bits.core_spd1000_fp =
   1078 		    NGE_PMU_CORE_SPD1000_BUSY;
   1079 		pmu_cntl0.cntl0_bits.core_spd1000_idle =
   1080 		    NGE_PMU_CORE_SPD100_IDLE;
   1081 		pmu_cntl0.cntl0_bits.core_spd10_idle =
   1082 		    NGE_PMU_CORE_SPD10_IDLE;
   1083 		nge_reg_put32(ngep, NGE_PMU_CNTL0, pmu_cntl0.cntl0_val);
   1084 
   1085 		/* Set the core idle limit value */
   1086 		nge_reg_put32(ngep, NGE_PMU_CIDLE_LIMIT,
   1087 		    NGE_PMU_CIDLE_LIMIT_DEF);
   1088 
   1089 		/* Set the device idle limit value */
   1090 		nge_reg_put32(ngep, NGE_PMU_DIDLE_LIMIT,
   1091 		    NGE_PMU_DIDLE_LIMIT_DEF);
   1092 
   1093 		/* Enable the core/device idle timer in PMU control 2 */
   1094 		pmu_cntl2.cntl2_val = nge_reg_get32(ngep, NGE_PMU_CNTL2);
   1095 		pmu_cntl2.cntl2_bits.cidle_timer = NGE_SET;
   1096 		pmu_cntl2.cntl2_bits.didle_timer = NGE_SET;
   1097 		pmu_cntl2.cntl2_bits.core_enable = NGE_SET;
   1098 		pmu_cntl2.cntl2_bits.dev_enable = NGE_SET;
   1099 		nge_reg_put32(ngep, NGE_PMU_CNTL2, pmu_cntl2.cntl2_val);
   1100 	}
   1101 	/*
   1102 	 * Stop the chipset and clear buffer management
   1103 	 */
   1104 	err = nge_chip_stop(ngep, B_FALSE);
   1105 	if (err == DDI_FAILURE)
   1106 		return (err);
   1107 	/*
   1108 	 * Clear the power state bits for phy since interface no longer
   1109 	 * works after rebooting from Windows on a multi-boot machine
   1110 	 */
   1111 	if (ngep->chipinfo.device == DEVICE_ID_MCP51_268 ||
   1112 	    ngep->chipinfo.device == DEVICE_ID_MCP51_269 ||
   1113 	    ngep->chipinfo.device == DEVICE_ID_MCP55_372 ||
   1114 	    ngep->chipinfo.device == DEVICE_ID_MCP55_373 ||
   1115 	    ngep->chipinfo.device == DEVICE_ID_MCP61_3EE ||
   1116 	    ngep->chipinfo.device == DEVICE_ID_MCP61_3EF ||
   1117 	    ngep->chipinfo.device == DEVICE_ID_MCP77_760 ||
   1118 	    ngep->chipinfo.device == DEVICE_ID_MCP79_AB0) {
   1119 
   1120 		pm_cntl2.cntl_val = nge_reg_get32(ngep, NGE_PM_CNTL2);
   1121 		/* bring phy out of coma mode */
   1122 		pm_cntl2.cntl_bits.phy_coma_set = NGE_CLEAR;
   1123 		/* disable auto reset coma bits */
   1124 		pm_cntl2.cntl_bits.resv4 = NGE_CLEAR;
   1125 		/* restore power to gated clocks */
   1126 		pm_cntl2.cntl_bits.resv8_11 = NGE_CLEAR;
   1127 		nge_reg_put32(ngep, NGE_PM_CNTL2, pm_cntl2.cntl_val);
   1128 	}
   1129 
   1130 	ngep->nge_chip_state = NGE_CHIP_RESET;
   1131 	return (DDI_SUCCESS);
   1132 }
   1133 
   1134 int
   1135 nge_chip_start(nge_t *ngep)
   1136 {
   1137 	int err;
   1138 	nge_itc itc;
   1139 	nge_tx_cntl tx_cntl;
   1140 	nge_rx_cntrl0 rx_cntl0;
   1141 	nge_rx_cntl1 rx_cntl1;
   1142 	nge_tx_en tx_en;
   1143 	nge_rx_en rx_en;
   1144 	nge_mii_cs mii_cs;
   1145 	nge_swtr_cntl swtr_cntl;
   1146 	nge_rx_fifo_wm rx_fifo;
   1147 	nge_intr_mask intr_mask;
   1148 	nge_mintr_mask mintr_mask;
   1149 	nge_dev_spec_param_t	*dev_param_p;
   1150 
   1151 	NGE_TRACE(("nge_chip_start($%p)", (void *)ngep));
   1152 
   1153 	/*
   1154 	 * Setup buffer management
   1155 	 */
   1156 	err = nge_buff_setup(ngep);
   1157 	if (err == DDI_FAILURE)
   1158 		return (err);
   1159 
   1160 	dev_param_p = &ngep->dev_spec_param;
   1161 
   1162 	/*
   1163 	 * Enable polling attribute
   1164 	 */
   1165 	mii_cs.cs_val = nge_reg_get32(ngep, NGE_MII_CS);
   1166 	mii_cs.cs_bits.ap_paddr = ngep->phy_xmii_addr;
   1167 	mii_cs.cs_bits.ap_en = NGE_SET;
   1168 	mii_cs.cs_bits.ap_intv = MII_POLL_INTV;
   1169 	nge_reg_put32(ngep, NGE_MII_CS, mii_cs.cs_val);
   1170 
   1171 	/*
   1172 	 * Setup link
   1173 	 */
   1174 	(*ngep->physops->phys_update)(ngep);
   1175 
   1176 	/*
   1177 	 * Configure the tx's parameters
   1178 	 */
   1179 	tx_cntl.cntl_val = nge_reg_get32(ngep, NGE_TX_CNTL);
   1180 	if (dev_param_p->tx_pause_frame)
   1181 		tx_cntl.cntl_bits.paen = NGE_SET;
   1182 	else
   1183 		tx_cntl.cntl_bits.paen = NGE_CLEAR;
   1184 	tx_cntl.cntl_bits.retry_en = NGE_SET;
   1185 	tx_cntl.cntl_bits.pad_en = NGE_SET;
   1186 	tx_cntl.cntl_bits.fappend_en = NGE_SET;
   1187 	tx_cntl.cntl_bits.two_def_en = NGE_SET;
   1188 	tx_cntl.cntl_bits.max_retry = 15;
   1189 	tx_cntl.cntl_bits.burst_en = NGE_CLEAR;
   1190 	tx_cntl.cntl_bits.uflo_err_mask = NGE_CLEAR;
   1191 	tx_cntl.cntl_bits.tlcol_mask = NGE_CLEAR;
   1192 	tx_cntl.cntl_bits.lcar_mask = NGE_CLEAR;
   1193 	tx_cntl.cntl_bits.def_mask = NGE_CLEAR;
   1194 	tx_cntl.cntl_bits.exdef_mask = NGE_SET;
   1195 	tx_cntl.cntl_bits.lcar_mask = NGE_SET;
   1196 	tx_cntl.cntl_bits.tlcol_mask = NGE_SET;
   1197 	tx_cntl.cntl_bits.uflo_err_mask = NGE_SET;
   1198 	tx_cntl.cntl_bits.jam_seq_en = NGE_CLEAR;
   1199 	nge_reg_put32(ngep, NGE_TX_CNTL, tx_cntl.cntl_val);
   1200 
   1201 
   1202 	/*
   1203 	 * Configure the parameters of Rx's state machine
   1204 	 * Enabe the parameters:
   1205 	 * 1). Pad Strip
   1206 	 * 2). FCS Relay
   1207 	 * 3). Pause
   1208 	 * 4). Address filter
   1209 	 * 5). Runt Packet receive
   1210 	 * 6). Broadcast
   1211 	 * 7). Receive Deferral
   1212 	 *
   1213 	 * Disable the following parameters for decreasing
   1214 	 * the number of interrupts:
   1215 	 * 1). Runt Inerrupt.
   1216 	 * 2). Rx's Late Collision interrupt.
   1217 	 * 3). Rx's Max length Error Interrupt.
   1218 	 * 4). Rx's Length Field error Interrupt.
   1219 	 * 5). Rx's FCS error interrupt.
   1220 	 * 6). Rx's overflow error interrupt.
   1221 	 * 7). Rx's Frame alignment error interrupt.
   1222 	 */
   1223 	rx_cntl0.cntl_val = nge_reg_get32(ngep, NGE_RX_CNTL0);
   1224 	rx_cntl0.cntl_bits.padsen = NGE_CLEAR;
   1225 	rx_cntl0.cntl_bits.fcsren = NGE_CLEAR;
   1226 	if (dev_param_p->rx_pause_frame)
   1227 		rx_cntl0.cntl_bits.paen = NGE_SET;
   1228 	else
   1229 		rx_cntl0.cntl_bits.paen = NGE_CLEAR;
   1230 	rx_cntl0.cntl_bits.lben = NGE_CLEAR;
   1231 	rx_cntl0.cntl_bits.afen = NGE_SET;
   1232 	rx_cntl0.cntl_bits.runten = NGE_CLEAR;
   1233 	rx_cntl0.cntl_bits.brdis = NGE_CLEAR;
   1234 	rx_cntl0.cntl_bits.rdfen = NGE_CLEAR;
   1235 	rx_cntl0.cntl_bits.runtm = NGE_CLEAR;
   1236 	rx_cntl0.cntl_bits.slfb = NGE_CLEAR;
   1237 	rx_cntl0.cntl_bits.rlcolm = NGE_CLEAR;
   1238 	rx_cntl0.cntl_bits.maxerm = NGE_CLEAR;
   1239 	rx_cntl0.cntl_bits.lferm = NGE_CLEAR;
   1240 	rx_cntl0.cntl_bits.crcm = NGE_CLEAR;
   1241 	rx_cntl0.cntl_bits.ofolm = NGE_CLEAR;
   1242 	rx_cntl0.cntl_bits.framerm = NGE_CLEAR;
   1243 	nge_reg_put32(ngep, NGE_RX_CNTL0, rx_cntl0.cntl_val);
   1244 
   1245 	/*
   1246 	 * Configure the watermark for the rx's statemachine
   1247 	 */
   1248 	rx_fifo.wm_val = nge_reg_get32(ngep, NGE_RX_FIFO_WM);
   1249 	rx_fifo.wm_bits.data_hwm = ngep->rx_datahwm;
   1250 	rx_fifo.wm_bits.prd_lwm = ngep->rx_prdlwm;
   1251 	rx_fifo.wm_bits.prd_hwm = ngep->rx_prdhwm;
   1252 	nge_reg_put32(ngep, NGE_RX_FIFO_WM, rx_fifo.wm_val);
   1253 
   1254 	/*
   1255 	 * Configure the deffer time slot for rx's state machine
   1256 	 */
   1257 	nge_reg_put8(ngep, NGE_RX_DEf, ngep->rx_def);
   1258 
   1259 	/*
   1260 	 * Configure the length of rx's packet
   1261 	 */
   1262 	rx_cntl1.cntl_val = nge_reg_get32(ngep, NGE_RX_CNTL1);
   1263 	rx_cntl1.cntl_bits.length = ngep->max_sdu;
   1264 	nge_reg_put32(ngep, NGE_RX_CNTL1, rx_cntl1.cntl_val);
   1265 	/*
   1266 	 * Enable Tx's state machine
   1267 	 */
   1268 	tx_en.val = nge_reg_get8(ngep, NGE_TX_EN);
   1269 	tx_en.bits.tx_en = NGE_SET;
   1270 	nge_reg_put8(ngep, NGE_TX_EN, tx_en.val);
   1271 
   1272 	/*
   1273 	 * Enable Rx's state machine
   1274 	 */
   1275 	rx_en.val = nge_reg_get8(ngep, NGE_RX_EN);
   1276 	rx_en.bits.rx_en = NGE_SET;
   1277 	nge_reg_put8(ngep, NGE_RX_EN, rx_en.val);
   1278 
   1279 	itc.itc_val = nge_reg_get32(ngep, NGE_SWTR_ITC);
   1280 	itc.itc_bits.sw_intv = ngep->sw_intr_intv;
   1281 	nge_reg_put32(ngep, NGE_SWTR_ITC, itc.itc_val);
   1282 
   1283 	swtr_cntl.ctrl_val = nge_reg_get8(ngep, NGE_SWTR_CNTL);
   1284 	swtr_cntl.cntl_bits.sten = NGE_SET;
   1285 	swtr_cntl.cntl_bits.stren = NGE_SET;
   1286 	nge_reg_put32(ngep, NGE_SWTR_CNTL, swtr_cntl.ctrl_val);
   1287 
   1288 	/*
   1289 	 * Disable all mii read/write operation Interrupt
   1290 	 */
   1291 	mintr_mask.mask_val = nge_reg_get8(ngep, NGE_MINTR_MASK);
   1292 	mintr_mask.mask_bits.mrei = NGE_CLEAR;
   1293 	mintr_mask.mask_bits.mcc2 = NGE_CLEAR;
   1294 	mintr_mask.mask_bits.mcc1 = NGE_CLEAR;
   1295 	mintr_mask.mask_bits.mapi = NGE_SET;
   1296 	mintr_mask.mask_bits.mpdi = NGE_SET;
   1297 	nge_reg_put8(ngep, NGE_MINTR_MASK, mintr_mask.mask_val);
   1298 
   1299 	/*
   1300 	 * Enable all interrupt event
   1301 	 */
   1302 	intr_mask.mask_val = nge_reg_get32(ngep, NGE_INTR_MASK);
   1303 	intr_mask.mask_bits.reint = NGE_SET;
   1304 	intr_mask.mask_bits.rcint = NGE_SET;
   1305 	intr_mask.mask_bits.miss = NGE_SET;
   1306 	intr_mask.mask_bits.teint = NGE_SET;
   1307 	intr_mask.mask_bits.tcint = NGE_CLEAR;
   1308 	intr_mask.mask_bits.stint = NGE_CLEAR;
   1309 	intr_mask.mask_bits.mint = NGE_CLEAR;
   1310 	intr_mask.mask_bits.rfint = NGE_CLEAR;
   1311 	intr_mask.mask_bits.tfint = NGE_SET;
   1312 	intr_mask.mask_bits.feint = NGE_SET;
   1313 	intr_mask.mask_bits.resv10 = NGE_CLEAR;
   1314 	intr_mask.mask_bits.resv11 = NGE_CLEAR;
   1315 	intr_mask.mask_bits.resv12 = NGE_CLEAR;
   1316 	intr_mask.mask_bits.resv13 = NGE_CLEAR;
   1317 	intr_mask.mask_bits.phyint = NGE_CLEAR;
   1318 	ngep->intr_masks = intr_mask.mask_val;
   1319 	nge_reg_put32(ngep, NGE_INTR_MASK, intr_mask.mask_val);
   1320 	ngep->nge_chip_state = NGE_CHIP_RUNNING;
   1321 	return (DDI_SUCCESS);
   1322 }
   1323 
   1324 /*
   1325  * nge_chip_sync() -- program the chip with the unicast MAC address,
   1326  * the multicast hash table, the required level of promiscuity.
   1327  */
   1328 void
   1329 nge_chip_sync(nge_t *ngep)
   1330 {
   1331 	uint8_t i;
   1332 	uint64_t macaddr;
   1333 	uint64_t mul_addr;
   1334 	uint64_t mul_mask;
   1335 	nge_rx_cntrl0 rx_cntl;
   1336 	nge_uni_addr1 uni_adr1;
   1337 
   1338 	NGE_TRACE(("nge_chip_sync($%p)", (void *)ngep));
   1339 
   1340 	macaddr = 0x0ull;
   1341 	mul_addr = 0x0ull;
   1342 	mul_mask = 0x0ull;
   1343 	rx_cntl.cntl_val = nge_reg_get32(ngep, NGE_RX_CNTL0);
   1344 
   1345 	if (ngep->promisc) {
   1346 		rx_cntl.cntl_bits.afen = NGE_CLEAR;
   1347 		rx_cntl.cntl_bits.brdis = NGE_SET;
   1348 	} else {
   1349 		rx_cntl.cntl_bits.afen = NGE_SET;
   1350 		rx_cntl.cntl_bits.brdis = NGE_CLEAR;
   1351 	}
   1352 
   1353 	/*
   1354 	 * Transform the MAC address from host to chip format, the unicast
   1355 	 * MAC address(es) ...
   1356 	 */
   1357 	for (i = ETHERADDRL, macaddr = 0ull; i != 0; --i) {
   1358 		macaddr |= ngep->cur_uni_addr.addr[i-1];
   1359 		macaddr <<= (i > 1) ? 8 : 0;
   1360 	}
   1361 
   1362 	nge_reg_put32(ngep, NGE_UNI_ADDR0, (uint32_t)macaddr);
   1363 	macaddr = macaddr >>32;
   1364 	uni_adr1.addr_val = nge_reg_get32(ngep, NGE_UNI_ADDR1);
   1365 	uni_adr1.addr_bits.addr = (uint16_t)macaddr;
   1366 	uni_adr1.addr_bits.resv16_31 = (uint16_t)0;
   1367 	nge_reg_put32(ngep, NGE_UNI_ADDR1, uni_adr1.addr_val);
   1368 
   1369 	/*
   1370 	 * Reprogram the  multicast address table ...
   1371 	 */
   1372 	for (i = ETHERADDRL, mul_addr = 0ull; i != 0; --i) {
   1373 		mul_addr |= ngep->cur_mul_addr.addr[i-1];
   1374 		mul_addr <<= (i > 1) ? 8 : 0;
   1375 		mul_mask |= ngep->cur_mul_mask.addr[i-1];
   1376 		mul_mask <<= (i > 1) ? 8 : 0;
   1377 	}
   1378 	nge_reg_put32(ngep, NGE_MUL_ADDR0, (uint32_t)mul_addr);
   1379 	mul_addr >>= 32;
   1380 	nge_reg_put32(ngep, NGE_MUL_ADDR1, mul_addr);
   1381 	nge_reg_put32(ngep, NGE_MUL_MASK, (uint32_t)mul_mask);
   1382 	mul_mask >>= 32;
   1383 	nge_reg_put32(ngep, NGE_MUL_MASK1, mul_mask);
   1384 	/*
   1385 	 * Set or clear the PROMISCUOUS mode bit
   1386 	 */
   1387 	nge_reg_put32(ngep, NGE_RX_CNTL0, rx_cntl.cntl_val);
   1388 	/*
   1389 	 * For internal PHY loopback, the link will
   1390 	 * not be up, so it need to sync mac modes directly.
   1391 	 */
   1392 	if (ngep->param_loop_mode == NGE_LOOP_INTERNAL_PHY)
   1393 		nge_sync_mac_modes(ngep);
   1394 }
   1395 
   1396 static void
   1397 nge_chip_err(nge_t *ngep)
   1398 {
   1399 	nge_reg010 reg010_ins;
   1400 	nge_sw_statistics_t *psw_stat;
   1401 	nge_intr_mask intr_mask;
   1402 
   1403 	NGE_TRACE(("nge_chip_err($%p)", (void *)ngep));
   1404 
   1405 	psw_stat = (nge_sw_statistics_t *)&ngep->statistics.sw_statistics;
   1406 	reg010_ins.reg010_val = nge_reg_get32(ngep, NGE_REG010);
   1407 	if (reg010_ins.reg010_bits.resv0)
   1408 		psw_stat->fe_err.tso_err_mss ++;
   1409 
   1410 	if (reg010_ins.reg010_bits.resv1)
   1411 		psw_stat->fe_err.tso_dis ++;
   1412 
   1413 	if (reg010_ins.reg010_bits.resv2)
   1414 		psw_stat->fe_err.tso_err_nosum ++;
   1415 
   1416 	if (reg010_ins.reg010_bits.resv3)
   1417 		psw_stat->fe_err.tso_err_hov ++;
   1418 
   1419 	if (reg010_ins.reg010_bits.resv4)
   1420 		psw_stat->fe_err.tso_err_huf ++;
   1421 
   1422 	if (reg010_ins.reg010_bits.resv5)
   1423 		psw_stat->fe_err.tso_err_l2 ++;
   1424 
   1425 	if (reg010_ins.reg010_bits.resv6)
   1426 		psw_stat->fe_err.tso_err_ip ++;
   1427 
   1428 	if (reg010_ins.reg010_bits.resv7)
   1429 		psw_stat->fe_err.tso_err_l4 ++;
   1430 
   1431 	if (reg010_ins.reg010_bits.resv8)
   1432 		psw_stat->fe_err.tso_err_tcp ++;
   1433 
   1434 	if (reg010_ins.reg010_bits.resv9)
   1435 		psw_stat->fe_err.hsum_err_ip ++;
   1436 
   1437 	if (reg010_ins.reg010_bits.resv10)
   1438 		psw_stat->fe_err.hsum_err_l4 ++;
   1439 
   1440 	if (reg010_ins.reg010_val != 0) {
   1441 
   1442 		/*
   1443 		 * Fatal error is triggered by malformed driver commands.
   1444 		 * Disable unless debugging.
   1445 		 */
   1446 		intr_mask.mask_val = nge_reg_get32(ngep, NGE_INTR_MASK);
   1447 		intr_mask.mask_bits.feint = NGE_CLEAR;
   1448 		nge_reg_put32(ngep, NGE_INTR_MASK, intr_mask.mask_val);
   1449 		ngep->intr_masks = intr_mask.mask_val;
   1450 
   1451 	}
   1452 }
   1453 
   1454 static void
   1455 nge_sync_mac_modes(nge_t *ngep)
   1456 {
   1457 	nge_tx_def tx_def;
   1458 	nge_tx_fifo_wm tx_fifo;
   1459 	nge_bkoff_cntl bk_cntl;
   1460 	nge_mac2phy m2p;
   1461 	nge_rx_cntrl0 rx_cntl0;
   1462 	nge_tx_cntl tx_cntl;
   1463 	nge_dev_spec_param_t	*dev_param_p;
   1464 
   1465 	dev_param_p = &ngep->dev_spec_param;
   1466 
   1467 	tx_def.def_val = nge_reg_get32(ngep, NGE_TX_DEF);
   1468 	m2p.m2p_val = nge_reg_get32(ngep, NGE_MAC2PHY);
   1469 	tx_fifo.wm_val = nge_reg_get32(ngep, NGE_TX_FIFO_WM);
   1470 	bk_cntl.cntl_val = nge_reg_get32(ngep, NGE_BKOFF_CNTL);
   1471 	bk_cntl.bkoff_bits.rseed = BKOFF_RSEED;
   1472 	switch (ngep->param_link_speed) {
   1473 	case 10:
   1474 		m2p.m2p_bits.speed = low_speed;
   1475 		tx_def.def_bits.ifg1_def = TX_IFG1_DEFAULT;
   1476 		if (ngep->phy_mode == RGMII_IN) {
   1477 			tx_def.def_bits.ifg2_def = TX_IFG2_RGMII_10_100;
   1478 			tx_def.def_bits.if_def = TX_IFG_RGMII_OTHER;
   1479 		} else {
   1480 			tx_def.def_bits.if_def = TX_TIFG_MII;
   1481 			tx_def.def_bits.ifg2_def = TX_IFG2_MII;
   1482 		}
   1483 		tx_fifo.wm_bits.nbfb_wm = TX_FIFO_NOB_WM_MII;
   1484 		bk_cntl.bkoff_bits.sltm = BKOFF_SLIM_MII;
   1485 		break;
   1486 
   1487 	case 100:
   1488 		m2p.m2p_bits.speed = fast_speed;
   1489 		tx_def.def_bits.ifg1_def = TX_IFG1_DEFAULT;
   1490 		if (ngep->phy_mode == RGMII_IN) {
   1491 			tx_def.def_bits.ifg2_def = TX_IFG2_RGMII_10_100;
   1492 			tx_def.def_bits.if_def = TX_IFG_RGMII_OTHER;
   1493 		} else {
   1494 			tx_def.def_bits.if_def = TX_TIFG_MII;
   1495 			tx_def.def_bits.ifg2_def = TX_IFG2_MII;
   1496 		}
   1497 		tx_fifo.wm_bits.nbfb_wm = TX_FIFO_NOB_WM_MII;
   1498 		bk_cntl.bkoff_bits.sltm = BKOFF_SLIM_MII;
   1499 		break;
   1500 
   1501 	case 1000:
   1502 		m2p.m2p_bits.speed = giga_speed;
   1503 		tx_def.def_bits.ifg1_def = TX_IFG1_DEFAULT;
   1504 		if (ngep->param_link_duplex == LINK_DUPLEX_FULL) {
   1505 			tx_def.def_bits.ifg2_def = TX_IFG2_RGMII_1000;
   1506 			tx_def.def_bits.if_def = TX_IFG_RGMII_1000_FD;
   1507 		} else {
   1508 			tx_def.def_bits.ifg2_def = TX_IFG2_RGMII_1000;
   1509 			tx_def.def_bits.if_def = TX_IFG_RGMII_OTHER;
   1510 		}
   1511 
   1512 		tx_fifo.wm_bits.nbfb_wm = TX_FIFO_NOB_WM_GMII;
   1513 		bk_cntl.bkoff_bits.sltm = BKOFF_SLIM_GMII;
   1514 		break;
   1515 	}
   1516 
   1517 	if (ngep->chipinfo.device == DEVICE_ID_MCP55_373 ||
   1518 	    ngep->chipinfo.device == DEVICE_ID_MCP55_372) {
   1519 		m2p.m2p_bits.phyintr = NGE_CLEAR;
   1520 		m2p.m2p_bits.phyintrlvl = NGE_CLEAR;
   1521 	}
   1522 	if (ngep->param_link_duplex == LINK_DUPLEX_HALF) {
   1523 		m2p.m2p_bits.hdup_en = NGE_SET;
   1524 	}
   1525 	else
   1526 		m2p.m2p_bits.hdup_en = NGE_CLEAR;
   1527 	nge_reg_put32(ngep, NGE_MAC2PHY, m2p.m2p_val);
   1528 	nge_reg_put32(ngep, NGE_TX_DEF, tx_def.def_val);
   1529 
   1530 	tx_fifo.wm_bits.data_lwm = TX_FIFO_DATA_LWM;
   1531 	tx_fifo.wm_bits.prd_lwm = TX_FIFO_PRD_LWM;
   1532 	tx_fifo.wm_bits.uprd_hwm = TX_FIFO_PRD_HWM;
   1533 	tx_fifo.wm_bits.fb_wm = TX_FIFO_TBFW;
   1534 	nge_reg_put32(ngep, NGE_TX_FIFO_WM, tx_fifo.wm_val);
   1535 
   1536 	nge_reg_put32(ngep, NGE_BKOFF_CNTL, bk_cntl.cntl_val);
   1537 
   1538 	rx_cntl0.cntl_val = nge_reg_get32(ngep, NGE_RX_CNTL0);
   1539 	if (ngep->param_link_rx_pause && dev_param_p->rx_pause_frame) {
   1540 		if (rx_cntl0.cntl_bits.paen == NGE_CLEAR) {
   1541 			rx_cntl0.cntl_bits.paen = NGE_SET;
   1542 			nge_reg_put32(ngep, NGE_RX_CNTL0, rx_cntl0.cntl_val);
   1543 	}
   1544 	} else {
   1545 		if (rx_cntl0.cntl_bits.paen == NGE_SET) {
   1546 			rx_cntl0.cntl_bits.paen = NGE_CLEAR;
   1547 			nge_reg_put32(ngep, NGE_RX_CNTL0, rx_cntl0.cntl_val);
   1548 		}
   1549 	}
   1550 
   1551 	tx_cntl.cntl_val = nge_reg_get32(ngep, NGE_TX_CNTL);
   1552 	if (ngep->param_link_tx_pause && dev_param_p->tx_pause_frame) {
   1553 		if (tx_cntl.cntl_bits.paen == NGE_CLEAR) {
   1554 			tx_cntl.cntl_bits.paen = NGE_SET;
   1555 			nge_reg_put32(ngep, NGE_TX_CNTL, tx_cntl.cntl_val);
   1556 		}
   1557 	} else {
   1558 		if (tx_cntl.cntl_bits.paen == NGE_SET) {
   1559 			tx_cntl.cntl_bits.paen = NGE_CLEAR;
   1560 			nge_reg_put32(ngep, NGE_TX_CNTL, tx_cntl.cntl_val);
   1561 		}
   1562 	}
   1563 }
   1564 
   1565 /*
   1566  * Handler for hardware link state change.
   1567  *
   1568  * When this routine is called, the hardware link state has changed
   1569  * and the new state is reflected in the param_* variables.  Here
   1570  * we must update the softstate, reprogram the MAC to match, and
   1571  * record the change in the log and/or on the console.
   1572  */
   1573 static void
   1574 nge_factotum_link_handler(nge_t *ngep)
   1575 {
   1576 	/*
   1577 	 * Update the s/w link_state
   1578 	 */
   1579 	if (ngep->param_link_up)
   1580 		ngep->link_state = LINK_STATE_UP;
   1581 	else
   1582 		ngep->link_state = LINK_STATE_DOWN;
   1583 
   1584 	/*
   1585 	 * Reprogram the MAC modes to match
   1586 	 */
   1587 	nge_sync_mac_modes(ngep);
   1588 }
   1589 
   1590 static boolean_t
   1591 nge_factotum_link_check(nge_t *ngep)
   1592 {
   1593 	boolean_t lchg;
   1594 	boolean_t check;
   1595 
   1596 	ASSERT(mutex_owned(ngep->genlock));
   1597 
   1598 	(*ngep->physops->phys_check)(ngep);
   1599 	switch (ngep->link_state) {
   1600 	case LINK_STATE_UP:
   1601 		lchg = (ngep->param_link_up == B_FALSE);
   1602 		check = (ngep->param_link_up == B_FALSE);
   1603 		break;
   1604 
   1605 	case LINK_STATE_DOWN:
   1606 		lchg = (ngep->param_link_up == B_TRUE);
   1607 		check = (ngep->param_link_up == B_TRUE);
   1608 		break;
   1609 
   1610 	default:
   1611 		check = B_TRUE;
   1612 		break;
   1613 	}
   1614 
   1615 	/*
   1616 	 * If <check> is false, we're sure the link hasn't changed.
   1617 	 * If true, however, it's not yet definitive; we have to call
   1618 	 * nge_phys_check() to determine whether the link has settled
   1619 	 * into a new state yet ... and if it has, then call the link
   1620 	 * state change handler.But when the chip is 5700 in Dell 6650
   1621 	 * ,even if check is false, the link may have changed.So we
   1622 	 * have to call nge_phys_check() to determine the link state.
   1623 	 */
   1624 	if (check)
   1625 		nge_factotum_link_handler(ngep);
   1626 
   1627 	return (lchg);
   1628 }
   1629 
   1630 /*
   1631  * Factotum routine to check for Tx stall, using the 'watchdog' counter
   1632  */
   1633 static boolean_t nge_factotum_stall_check(nge_t *ngep);
   1634 
   1635 static boolean_t
   1636 nge_factotum_stall_check(nge_t *ngep)
   1637 {
   1638 	uint32_t dogval;
   1639 	send_ring_t *srp;
   1640 	srp = ngep->send;
   1641 	/*
   1642 	 * Specific check for Tx stall ...
   1643 	 *
   1644 	 * The 'watchdog' counter is incremented whenever a packet
   1645 	 * is queued, reset to 1 when some (but not all) buffers
   1646 	 * are reclaimed, reset to 0 (disabled) when all buffers
   1647 	 * are reclaimed, and shifted left here.  If it exceeds the
   1648 	 * threshold value, the chip is assumed to have stalled and
   1649 	 * is put into the ERROR state.  The factotum will then reset
   1650 	 * it on the next pass.
   1651 	 *
   1652 	 * All of which should ensure that we don't get into a state
   1653 	 * where packets are left pending indefinitely!
   1654 	 */
   1655 	if (ngep->watchdog == 0 &&
   1656 	    srp->tx_free < srp->desc.nslots)
   1657 		ngep->watchdog = 1;
   1658 	dogval = nge_atomic_shl32(&ngep->watchdog, 1);
   1659 	if (dogval >= nge_watchdog_check)
   1660 		nge_tx_recycle(ngep, B_FALSE);
   1661 	if (dogval < nge_watchdog_count)
   1662 		return (B_FALSE);
   1663 	else {
   1664 		ngep->statistics.sw_statistics.tx_stall++;
   1665 		return (B_TRUE);
   1666 	}
   1667 }
   1668 
   1669 
   1670 /*
   1671  * The factotum is woken up when there's something to do that we'd rather
   1672  * not do from inside a hardware interrupt handler or high-level cyclic.
   1673  * Its two main tasks are:
   1674  *	reset & restart the chip after an error
   1675  *	check the link status whenever necessary
   1676  */
   1677 /* ARGSUSED */
   1678 uint_t
   1679 nge_chip_factotum(caddr_t args1, caddr_t args2)
   1680 {
   1681 	uint_t result;
   1682 	nge_t *ngep;
   1683 	boolean_t err;
   1684 	boolean_t linkchg;
   1685 
   1686 	ngep = (nge_t *)args1;
   1687 
   1688 	NGE_TRACE(("nge_chip_factotum($%p)", (void *)ngep));
   1689 
   1690 	mutex_enter(ngep->softlock);
   1691 	if (ngep->factotum_flag == 0) {
   1692 		mutex_exit(ngep->softlock);
   1693 		return (DDI_INTR_UNCLAIMED);
   1694 	}
   1695 	ngep->factotum_flag = 0;
   1696 	mutex_exit(ngep->softlock);
   1697 	err = B_FALSE;
   1698 	linkchg = B_FALSE;
   1699 	result = DDI_INTR_CLAIMED;
   1700 
   1701 	mutex_enter(ngep->genlock);
   1702 	switch (ngep->nge_chip_state) {
   1703 	default:
   1704 		break;
   1705 
   1706 	case NGE_CHIP_RUNNING:
   1707 		linkchg = nge_factotum_link_check(ngep);
   1708 		err = nge_factotum_stall_check(ngep);
   1709 		break;
   1710 
   1711 	case NGE_CHIP_FAULT:
   1712 		(void) nge_restart(ngep);
   1713 		NGE_REPORT((ngep, "automatic recovery activated"));
   1714 		break;
   1715 	}
   1716 
   1717 	if (err)
   1718 		(void) nge_chip_stop(ngep, B_TRUE);
   1719 	mutex_exit(ngep->genlock);
   1720 
   1721 	/*
   1722 	 * If the link state changed, tell the world about it (if
   1723 	 * this version of MAC supports link state notification).
   1724 	 * Note: can't do this while still holding the mutex.
   1725 	 */
   1726 	if (linkchg)
   1727 		mac_link_update(ngep->mh, ngep->link_state);
   1728 
   1729 	return (result);
   1730 
   1731 }
   1732 
   1733 static void
   1734 nge_intr_handle(nge_t *ngep, nge_intr_src *pintr_src)
   1735 {
   1736 	boolean_t brx;
   1737 	boolean_t btx;
   1738 	nge_mintr_src mintr_src;
   1739 
   1740 	brx = B_FALSE;
   1741 	btx = B_FALSE;
   1742 	ngep->statistics.sw_statistics.intr_count++;
   1743 	ngep->statistics.sw_statistics.intr_lval = pintr_src->intr_val;
   1744 	brx = (pintr_src->int_bits.reint | pintr_src->int_bits.miss
   1745 	    | pintr_src->int_bits.rcint | pintr_src->int_bits.stint)
   1746 	    != 0 ? B_TRUE : B_FALSE;
   1747 	if (pintr_src->int_bits.reint)
   1748 		ngep->statistics.sw_statistics.rx_err++;
   1749 	if (pintr_src->int_bits.miss)
   1750 		ngep->statistics.sw_statistics.rx_nobuffer++;
   1751 
   1752 	btx = (pintr_src->int_bits.teint | pintr_src->int_bits.tfint)
   1753 	    != 0 ? B_TRUE : B_FALSE;
   1754 	if (btx)
   1755 		nge_tx_recycle(ngep, B_TRUE);
   1756 	if (brx)
   1757 		nge_receive(ngep);
   1758 	if (pintr_src->int_bits.teint)
   1759 		ngep->statistics.sw_statistics.tx_stop_err++;
   1760 	if (ngep->intr_moderation && brx) {
   1761 		if (ngep->poll) {
   1762 			if (ngep->recv_count < ngep->param_rx_intr_hwater) {
   1763 				ngep->quiet_time++;
   1764 				if (ngep->quiet_time ==
   1765 				    ngep->param_poll_quiet_time) {
   1766 					ngep->poll = B_FALSE;
   1767 					ngep->quiet_time = 0;
   1768 				}
   1769 			} else
   1770 				ngep->quiet_time = 0;
   1771 		} else {
   1772 			if (ngep->recv_count > ngep->param_rx_intr_lwater) {
   1773 				ngep->busy_time++;
   1774 				if (ngep->busy_time ==
   1775 				    ngep->param_poll_busy_time) {
   1776 					ngep->poll = B_TRUE;
   1777 					ngep->busy_time = 0;
   1778 				}
   1779 			} else
   1780 				ngep->busy_time = 0;
   1781 		}
   1782 	}
   1783 	ngep->recv_count = 0;
   1784 	if (pintr_src->int_bits.feint)
   1785 		nge_chip_err(ngep);
   1786 	/* link interrupt, check the link state */
   1787 	if (pintr_src->int_bits.mint) {
   1788 		mintr_src.src_val = nge_reg_get32(ngep, NGE_MINTR_SRC);
   1789 		nge_reg_put32(ngep, NGE_MINTR_SRC, mintr_src.src_val);
   1790 		nge_wake_factotum(ngep);
   1791 	}
   1792 }
   1793 
   1794 /*
   1795  *	nge_chip_intr() -- handle chip interrupts
   1796  */
   1797 /* ARGSUSED */
   1798 uint_t
   1799 nge_chip_intr(caddr_t arg1, caddr_t arg2)
   1800 {
   1801 	nge_t *ngep = (nge_t *)arg1;
   1802 	nge_intr_src intr_src;
   1803 	nge_intr_mask intr_mask;
   1804 
   1805 	mutex_enter(ngep->genlock);
   1806 
   1807 	if (ngep->suspended) {
   1808 		mutex_exit(ngep->genlock);
   1809 		return (DDI_INTR_UNCLAIMED);
   1810 	}
   1811 
   1812 	/*
   1813 	 * Check whether chip's says it's asserting #INTA;
   1814 	 * if not, don't process or claim the interrupt.
   1815 	 */
   1816 	intr_src.intr_val = nge_reg_get32(ngep, NGE_INTR_SRC);
   1817 	if (intr_src.intr_val == 0) {
   1818 		mutex_exit(ngep->genlock);
   1819 		return (DDI_INTR_UNCLAIMED);
   1820 	}
   1821 	/*
   1822 	 * Ack the interrupt
   1823 	 */
   1824 	nge_reg_put32(ngep, NGE_INTR_SRC, intr_src.intr_val);
   1825 
   1826 	if (ngep->nge_chip_state != NGE_CHIP_RUNNING) {
   1827 		mutex_exit(ngep->genlock);
   1828 		return (DDI_INTR_CLAIMED);
   1829 	}
   1830 	nge_intr_handle(ngep, &intr_src);
   1831 	if (ngep->poll && !ngep->ch_intr_mode) {
   1832 		intr_mask.mask_val = nge_reg_get32(ngep, NGE_INTR_MASK);
   1833 		intr_mask.mask_bits.stint = NGE_SET;
   1834 		intr_mask.mask_bits.rcint = NGE_CLEAR;
   1835 		nge_reg_put32(ngep, NGE_INTR_MASK, intr_mask.mask_val);
   1836 		ngep->ch_intr_mode = B_TRUE;
   1837 	} else if ((ngep->ch_intr_mode) && (!ngep->poll)) {
   1838 		nge_reg_put32(ngep, NGE_INTR_MASK, ngep->intr_masks);
   1839 		ngep->ch_intr_mode = B_FALSE;
   1840 	}
   1841 	mutex_exit(ngep->genlock);
   1842 	return (DDI_INTR_CLAIMED);
   1843 }
   1844 
   1845 static enum ioc_reply
   1846 nge_pp_ioctl(nge_t *ngep, int cmd, mblk_t *mp, struct iocblk *iocp)
   1847 {
   1848 	int err;
   1849 	uint64_t sizemask;
   1850 	uint64_t mem_va;
   1851 	uint64_t maxoff;
   1852 	boolean_t peek;
   1853 	nge_peekpoke_t *ppd;
   1854 	int (*ppfn)(nge_t *ngep, nge_peekpoke_t *ppd);
   1855 
   1856 	switch (cmd) {
   1857 	default:
   1858 		return (IOC_INVAL);
   1859 
   1860 	case NGE_PEEK:
   1861 		peek = B_TRUE;
   1862 		break;
   1863 
   1864 	case NGE_POKE:
   1865 		peek = B_FALSE;
   1866 		break;
   1867 	}
   1868 
   1869 	/*
   1870 	 * Validate format of ioctl
   1871 	 */
   1872 	if (iocp->ioc_count != sizeof (nge_peekpoke_t))
   1873 		return (IOC_INVAL);
   1874 	if (mp->b_cont == NULL)
   1875 		return (IOC_INVAL);
   1876 	ppd = (nge_peekpoke_t *)mp->b_cont->b_rptr;
   1877 
   1878 	/*
   1879 	 * Validate request parameters
   1880 	 */
   1881 	switch (ppd->pp_acc_space) {
   1882 	default:
   1883 		return (IOC_INVAL);
   1884 
   1885 	case NGE_PP_SPACE_CFG:
   1886 		/*
   1887 		 * Config space
   1888 		 */
   1889 		sizemask = 8|4|2|1;
   1890 		mem_va = 0;
   1891 		maxoff = PCI_CONF_HDR_SIZE;
   1892 		ppfn = peek ? nge_chip_peek_cfg : nge_chip_poke_cfg;
   1893 		break;
   1894 
   1895 	case NGE_PP_SPACE_REG:
   1896 		/*
   1897 		 * Memory-mapped I/O space
   1898 		 */
   1899 		sizemask = 8|4|2|1;
   1900 		mem_va = 0;
   1901 		maxoff = NGE_REG_SIZE;
   1902 		ppfn = peek ? nge_chip_peek_reg : nge_chip_poke_reg;
   1903 		break;
   1904 
   1905 	case NGE_PP_SPACE_MII:
   1906 		sizemask = 4|2|1;
   1907 		mem_va = 0;
   1908 		maxoff = NGE_MII_SIZE;
   1909 		ppfn = peek ? nge_chip_peek_mii : nge_chip_poke_mii;
   1910 		break;
   1911 
   1912 	case NGE_PP_SPACE_SEEPROM:
   1913 		sizemask = 4|2|1;
   1914 		mem_va = 0;
   1915 		maxoff = NGE_SEEROM_SIZE;
   1916 		ppfn = peek ? nge_chip_peek_seeprom : nge_chip_poke_seeprom;
   1917 		break;
   1918 	}
   1919 
   1920 	switch (ppd->pp_acc_size) {
   1921 	default:
   1922 		return (IOC_INVAL);
   1923 
   1924 	case 8:
   1925 	case 4:
   1926 	case 2:
   1927 	case 1:
   1928 		if ((ppd->pp_acc_size & sizemask) == 0)
   1929 			return (IOC_INVAL);
   1930 		break;
   1931 	}
   1932 
   1933 	if ((ppd->pp_acc_offset % ppd->pp_acc_size) != 0)
   1934 		return (IOC_INVAL);
   1935 
   1936 	if (ppd->pp_acc_offset >= maxoff)
   1937 		return (IOC_INVAL);
   1938 
   1939 	if (ppd->pp_acc_offset+ppd->pp_acc_size > maxoff)
   1940 		return (IOC_INVAL);
   1941 
   1942 	/*
   1943 	 * All OK - go do it!
   1944 	 */
   1945 	ppd->pp_acc_offset += mem_va;
   1946 	if (ppfn)
   1947 		err = (*ppfn)(ngep, ppd);
   1948 	if (err != DDI_SUCCESS)
   1949 		return (IOC_INVAL);
   1950 	return (peek ? IOC_REPLY : IOC_ACK);
   1951 }
   1952 
   1953 static enum ioc_reply nge_diag_ioctl(nge_t *ngep, int cmd, mblk_t *mp,
   1954 					struct iocblk *iocp);
   1955 #pragma	no_inline(nge_diag_ioctl)
   1956 
   1957 static enum ioc_reply
   1958 nge_diag_ioctl(nge_t *ngep, int cmd, mblk_t *mp, struct iocblk *iocp)
   1959 {
   1960 	ASSERT(mutex_owned(ngep->genlock));
   1961 
   1962 	switch (cmd) {
   1963 	default:
   1964 		nge_error(ngep, "nge_diag_ioctl: invalid cmd 0x%x", cmd);
   1965 		return (IOC_INVAL);
   1966 
   1967 	case NGE_DIAG:
   1968 		return (IOC_ACK);
   1969 
   1970 	case NGE_PEEK:
   1971 	case NGE_POKE:
   1972 		return (nge_pp_ioctl(ngep, cmd, mp, iocp));
   1973 
   1974 	case NGE_PHY_RESET:
   1975 		return (IOC_RESTART_ACK);
   1976 
   1977 	case NGE_SOFT_RESET:
   1978 	case NGE_HARD_RESET:
   1979 		return (IOC_ACK);
   1980 	}
   1981 
   1982 	/* NOTREACHED */
   1983 }
   1984 
   1985 enum ioc_reply
   1986 nge_chip_ioctl(nge_t *ngep, mblk_t *mp, struct iocblk *iocp)
   1987 {
   1988 	int cmd;
   1989 
   1990 	ASSERT(mutex_owned(ngep->genlock));
   1991 
   1992 	cmd = iocp->ioc_cmd;
   1993 
   1994 	switch (cmd) {
   1995 	default:
   1996 		return (IOC_INVAL);
   1997 
   1998 	case NGE_DIAG:
   1999 	case NGE_PEEK:
   2000 	case NGE_POKE:
   2001 	case NGE_PHY_RESET:
   2002 	case NGE_SOFT_RESET:
   2003 	case NGE_HARD_RESET:
   2004 #if	NGE_DEBUGGING
   2005 		return (nge_diag_ioctl(ngep, cmd, mp, iocp));
   2006 #else
   2007 		return (IOC_INVAL);
   2008 #endif
   2009 
   2010 	case NGE_MII_READ:
   2011 	case NGE_MII_WRITE:
   2012 		return (IOC_INVAL);
   2013 
   2014 #if	NGE_SEE_IO32
   2015 	case NGE_SEE_READ:
   2016 	case NGE_SEE_WRITE:
   2017 		return (IOC_INVAL);
   2018 #endif
   2019 
   2020 #if	NGE_FLASH_IO32
   2021 	case NGE_FLASH_READ:
   2022 	case NGE_FLASH_WRITE:
   2023 		return (IOC_INVAL);
   2024 #endif
   2025 	}
   2026 }
   2027