47693af92e50a1ad81825eb01b7157a211269613mx * CDDL HEADER START
47693af92e50a1ad81825eb01b7157a211269613mx * The contents of this file are subject to the terms of the
47693af92e50a1ad81825eb01b7157a211269613mx * Common Development and Distribution License (the "License").
47693af92e50a1ad81825eb01b7157a211269613mx * You may not use this file except in compliance with the License.
47693af92e50a1ad81825eb01b7157a211269613mx * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
47693af92e50a1ad81825eb01b7157a211269613mx * See the License for the specific language governing permissions
47693af92e50a1ad81825eb01b7157a211269613mx * and limitations under the License.
47693af92e50a1ad81825eb01b7157a211269613mx * When distributing Covered Code, include this CDDL HEADER in each
47693af92e50a1ad81825eb01b7157a211269613mx * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
47693af92e50a1ad81825eb01b7157a211269613mx * If applicable, add the following below this CDDL HEADER, with the
47693af92e50a1ad81825eb01b7157a211269613mx * fields enclosed by brackets "[]" replaced with your own identifying
47693af92e50a1ad81825eb01b7157a211269613mx * information: Portions Copyright [yyyy] [name of copyright owner]
47693af92e50a1ad81825eb01b7157a211269613mx * CDDL HEADER END
d635b452b5b58e50f0c67983f4a57a04deefce77Winson Wang - Sun Microsystems - Beijing China * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
47693af92e50a1ad81825eb01b7157a211269613mx * Use is subject to license terms.
51fc88a818087605a0e5f11eddb8b66576f72c23Winson Wang - Sun Microsystems - Beijing Chinastatic uint32_t nge_watchdog_count = 1 << 5;
51fc88a818087605a0e5f11eddb8b66576f72c23Winson Wang - Sun Microsystems - Beijing Chinastatic uint32_t nge_watchdog_check = 1 << 3;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Operating register get/set access routines
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#pragma inline(nge_reg_get8)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx NGE_TRACE(("nge_reg_get8($%p, 0x%lx)", (void *)ngep, regno));
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (ddi_get8(ngep->io_handle, PIO_ADDR(ngep, regno)));
6f3e57ac9d0b054c3169579f3422080b8ba10105mxvoid nge_reg_put8(nge_t *ngep, nge_regno_t regno, uint8_t data);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#pragma inline(nge_reg_put8)
6f3e57ac9d0b054c3169579f3422080b8ba10105mxnge_reg_put8(nge_t *ngep, nge_regno_t regno, uint8_t data)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#pragma inline(nge_reg_get16)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx NGE_TRACE(("nge_reg_get16($%p, 0x%lx)", (void *)ngep, regno));
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (ddi_get16(ngep->io_handle, PIO_ADDR(ngep, regno)));
6f3e57ac9d0b054c3169579f3422080b8ba10105mxvoid nge_reg_put16(nge_t *ngep, nge_regno_t regno, uint16_t data);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#pragma inline(nge_reg_put16)
6f3e57ac9d0b054c3169579f3422080b8ba10105mxnge_reg_put16(nge_t *ngep, nge_regno_t regno, uint16_t data)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#pragma inline(nge_reg_get32)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx NGE_TRACE(("nge_reg_get32($%p, 0x%lx)", (void *)ngep, regno));
6f3e57ac9d0b054c3169579f3422080b8ba10105mx return (ddi_get32(ngep->io_handle, PIO_ADDR(ngep, regno)));
6f3e57ac9d0b054c3169579f3422080b8ba10105mxvoid nge_reg_put32(nge_t *ngep, nge_regno_t regno, uint32_t data);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx#pragma inline(nge_reg_put32)
6f3e57ac9d0b054c3169579f3422080b8ba10105mxnge_reg_put32(nge_t *ngep, nge_regno_t regno, uint32_t data)
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic int nge_chip_peek_cfg(nge_t *ngep, nge_peekpoke_t *ppd);
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic int nge_chip_poke_cfg(nge_t *ngep, nge_peekpoke_t *ppd);
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic int nge_chip_peek_reg(nge_t *ngep, nge_peekpoke_t *ppd);
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic int nge_chip_poke_reg(nge_t *ngep, nge_peekpoke_t *ppd);
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic int nge_chip_peek_mii(nge_t *ngep, nge_peekpoke_t *ppd);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ppd->pp_acc_data = nge_mii_get16(ngep, ppd->pp_acc_offset/2);
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic int nge_chip_poke_mii(nge_t *ngep, nge_peekpoke_t *ppd);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_mii_put16(ngep, ppd->pp_acc_offset/2, ppd->pp_acc_data);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Basic SEEPROM get/set access routine
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * This uses the chip's SEEPROM auto-access method, controlled by the
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Serial EEPROM Address/Data Registers at 0x504h, so the CPU
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * doesn't have to fiddle with the individual bits.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * The caller should hold <genlock> and *also* have already acquired
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * the right to access the SEEPROM.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Return value:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * 0 on success,
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * ENODATA on access timeout (maybe retryable: device may just be busy)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * EPROTO on other h/w or s/w errors.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * <*dp> is an input to a SEEPROM_ACCESS_WRITE operation, or an output
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * from a (successful) SEEPROM_ACCESS_READ.
6f3e57ac9d0b054c3169579f3422080b8ba10105mxnge_seeprom_access(nge_t *ngep, uint32_t cmd, nge_regno_t addr, uint16_t *dp)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Check there's no command in progress.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Note: this *shouldn't* ever find that there is a command
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * in progress, because we already hold the <genlock> mutex.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Also, to ensure we don't have a conflict with the chip's
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * internal firmware or a process accessing the same (shared)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * So this is just a final consistency check: we shouldn't
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * see EITHER the START bit (command started but not complete)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * OR the COMPLETE bit (command completed but not cleared).
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * This should not happen. If so, we have to restart eeprom
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * state machine
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Polling the status bit to make assure the eeprom is ready
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Assemble the command ...
a55f711916b9f7718fabc2d1822bf5719aa6140fMiles Xu, Sun Microsystems cmd_reg.cmd_bits.addr = (uint32_t)addr;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Polling whether the access is successful.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx switch (cmd) {
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems dev_param_p->mac_addr_order = B_FALSE;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems dev_param_p->mac_addr_order = B_FALSE;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems dev_param_p->mac_addr_order = B_FALSE;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems dev_param_p->mac_addr_order = B_FALSE;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems dev_param_p->advanced_pm = B_TRUE;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems dev_param_p->mac_addr_order = B_TRUE;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems dev_param_p->tx_pause_frame = B_FALSE;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems dev_param_p->rx_pause_frame = B_FALSE;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems dev_param_p->tx_rx_64byte = B_TRUE;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems dev_param_p->rx_hw_checksum = B_FALSE;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems dev_param_p->desc_type = DESC_OFFLOAD;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems dev_param_p->rx_desc_num = NGE_RECV_SLOTS_DESC_1024;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems dev_param_p->tx_desc_num = NGE_SEND_SLOTS_DESC_1024;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems dev_param_p->nge_split = NGE_SPLIT_32;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China case DEVICE_ID_MCP77_760:
9fa05d92f6b225eb418fb782225c991b887ea8b7Winson Wang - Sun Microsystems - Beijing China case DEVICE_ID_MCP79_AB0:
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China dev_param_p->msi = B_FALSE;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China dev_param_p->msi_x = B_FALSE;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China dev_param_p->vlan = B_FALSE;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China dev_param_p->advanced_pm = B_TRUE;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China dev_param_p->mac_addr_order = B_TRUE;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China dev_param_p->tx_pause_frame = B_FALSE;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China dev_param_p->rx_pause_frame = B_FALSE;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China dev_param_p->jumbo = B_FALSE;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China dev_param_p->tx_rx_64byte = B_TRUE;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China dev_param_p->rx_hw_checksum = B_FALSE;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China dev_param_p->tx_hw_checksum = 0;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China dev_param_p->desc_type = DESC_HOT;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China dev_param_p->rx_desc_num = NGE_RECV_SLOTS_DESC_1024;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China dev_param_p->tx_desc_num = NGE_SEND_SLOTS_DESC_1024;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China dev_param_p->nge_split = NGE_SPLIT_32;
d27d4a13eaba374ddedac2be3de8c5318360ca01Miles Xu, Sun Microsystems dev_param_p->mac_addr_order = B_FALSE;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Perform first-stage chip (re-)initialisation, using only config-space
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * accesses:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * + Read the vendor/device/revision/subsystem/cache-line-size registers,
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * returning the data in the structure pointed to by <infop>.
6f3e57ac9d0b054c3169579f3422080b8ba10105mxvoid nge_chip_cfg_init(nge_t *ngep, chip_info_t *infop, boolean_t reset);
6f3e57ac9d0b054c3169579f3422080b8ba10105mxnge_chip_cfg_init(nge_t *ngep, chip_info_t *infop, boolean_t reset)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * save PCI cache line size and subsystem vendor ID
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Read all the config-space registers that characterise the
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * chip, specifically vendor/device/revision/subsystem vendor
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * and subsystem device id. We expect (but don't check) that
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* reading the vendor information once */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* Disable the hidden for MSI support */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* Disable the vector off for mcp55 */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* Enable the MSI mapping */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx NGE_TRACE(("nge_chip_stop($%p, %d)", (void *)ngep, fault));
9ae6bcf17ff4e3ecd536b6572764993c9778d76djj /* Clear any pending PHY interrupt */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* Mask all interrupts */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* Disable auto-polling of phy */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* Reset buffer management & DMA */
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China ngep->nge_chip_state = NGE_CHIP_ERROR;
d635b452b5b58e50f0c67983f4a57a04deefce77Winson Wang - Sun Microsystems - Beijing China /* Disable rx's machine */
d635b452b5b58e50f0c67983f4a57a04deefce77Winson Wang - Sun Microsystems - Beijing China rx_en.val = nge_reg_get8(ngep, NGE_RX_EN);
d635b452b5b58e50f0c67983f4a57a04deefce77Winson Wang - Sun Microsystems - Beijing China rx_en.bits.rx_en = NGE_CLEAR;
d635b452b5b58e50f0c67983f4a57a04deefce77Winson Wang - Sun Microsystems - Beijing China nge_reg_put8(ngep, NGE_RX_EN, rx_en.val);
d635b452b5b58e50f0c67983f4a57a04deefce77Winson Wang - Sun Microsystems - Beijing China /* Disable tx's machine */
d635b452b5b58e50f0c67983f4a57a04deefce77Winson Wang - Sun Microsystems - Beijing China tx_en.val = nge_reg_get8(ngep, NGE_TX_EN);
d635b452b5b58e50f0c67983f4a57a04deefce77Winson Wang - Sun Microsystems - Beijing China tx_en.bits.tx_en = NGE_CLEAR;
d635b452b5b58e50f0c67983f4a57a04deefce77Winson Wang - Sun Microsystems - Beijing China nge_reg_put8(ngep, NGE_TX_EN, tx_en.val);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Clean the status of tx's state machine
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * and Make assure the tx's channel is idle
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China ngep->nge_chip_state = NGE_CHIP_ERROR;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Clean the status of rx's state machine
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * and Make assure the tx's channel is idle
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China ngep->nge_chip_state = NGE_CHIP_ERROR;
9ae6bcf17ff4e3ecd536b6572764993c9778d76djj /* Disable auto-poll of rx's state machine */
9ae6bcf17ff4e3ecd536b6572764993c9778d76djj /* Disable auto-polling of tx's state machine */
9ae6bcf17ff4e3ecd536b6572764993c9778d76djj /* Restore buffer management */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx pmu_cntl2.cntl2_val = nge_reg_get32(ngep, NGE_PMU_CNTL2);
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic void
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Filling the address and length of rx's descriptors
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic void
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Filling the address and length of tx's descriptors
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Configure Rx&Tx's buffer
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Configure buffer attribute
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Enable Dma access request
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Enbale Buffer management
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Support Standoffload Descriptor
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Support receive hardware checksum
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Disable Tx PRD coarse update
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Disable 64-byte access
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Skip Rx Error Frame is not supported and if
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * enable it, jumbo frame does not work any more.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Can not support hot mode now
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* Disable the vlan strip for devices which support vlan */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* Disable the vlan insert for devices which supprot vlan */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* Set the maximum TX PRD fetch size to 64 bytes */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* Set the maximum RX PRD fetch size to 64 bytes */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Upload Rx data as it arrives, rather than waiting for full frame
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Normal HOT table accesses
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Normal HOT buffer requesting
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Signal controller to check for new Rx descriptors
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * When chipset resets, the chipset can not restore the orignial
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * mac address to the mac address registers.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * When the driver is dettached, the function will write the orignial
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * mac address to the mac address registers.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Clear the statistics by reading the statistics register
6f3e57ac9d0b054c3169579f3422080b8ba10105mx for (ksip = nge_statistics; ksip->name != NULL; ++ksip) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Setup seeprom control
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Reading the unicast mac address table
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China ngep->chipinfo.hw_mac_addr = mac;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China if (ngep->dev_spec_param.mac_addr_order) {
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China for (i = 0; i < ETHERADDRL; i++) {
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China ngep->chipinfo.vendor_addr.addr[i] =
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China (uchar_t)mac;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China ngep->cur_uni_addr.addr[i] =
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China (uchar_t)mac;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China for (i = ETHERADDRL; i-- != 0; ) {
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China ngep->chipinfo.vendor_addr.addr[i] =
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China (uchar_t)mac;
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China ngep->cur_uni_addr.addr[i] =
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China (uchar_t)mac;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx pci_config_put8(ngep->cfg_handle, PCI_CONF_LATENCY_TIMER,
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* Program software misc register */
9ae6bcf17ff4e3ecd536b6572764993c9778d76djj /* wait for 32 us */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* Program PMU registers */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx pmu_cntl0.cntl0_val = nge_reg_get32(ngep, NGE_PMU_CNTL0);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* Set the core idle limit value */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* Set the device idle limit value */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* Enable the core/device idle timer in PMU control 2 */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx pmu_cntl2.cntl2_val = nge_reg_get32(ngep, NGE_PMU_CNTL2);
9ae6bcf17ff4e3ecd536b6572764993c9778d76djj * Stop the chipset and clear buffer management
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Clear the power state bits for phy since interface no longer
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * works after rebooting from Windows on a multi-boot machine
a01a4735489b25416b449c3231ab8b710caaeb1cWinson Wang - Sun Microsystems - Beijing China ngep->chipinfo.device == DEVICE_ID_MCP61_3EF ||
9fa05d92f6b225eb418fb782225c991b887ea8b7Winson Wang - Sun Microsystems - Beijing China ngep->chipinfo.device == DEVICE_ID_MCP77_760 ||
9fa05d92f6b225eb418fb782225c991b887ea8b7Winson Wang - Sun Microsystems - Beijing China ngep->chipinfo.device == DEVICE_ID_MCP79_AB0) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* bring phy out of coma mode */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* disable auto reset coma bits */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* restore power to gated clocks */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Setup buffer management
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Enable polling attribute
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Setup link
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Configure the tx's parameters
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Configure the parameters of Rx's state machine
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Enabe the parameters:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * 1). Pad Strip
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * 2). FCS Relay
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * 3). Pause
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * 4). Address filter
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * 5). Runt Packet receive
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * 6). Broadcast
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * 7). Receive Deferral
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Disable the following parameters for decreasing
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * the number of interrupts:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * 1). Runt Inerrupt.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * 2). Rx's Late Collision interrupt.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * 3). Rx's Max length Error Interrupt.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * 4). Rx's Length Field error Interrupt.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * 5). Rx's FCS error interrupt.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * 6). Rx's overflow error interrupt.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * 7). Rx's Frame alignment error interrupt.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Configure the watermark for the rx's statemachine
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Configure the deffer time slot for rx's state machine
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Configure the length of rx's packet
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Enable Tx's state machine
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Enable Rx's state machine
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Disable all mii read/write operation Interrupt
6f3e57ac9d0b054c3169579f3422080b8ba10105mx mintr_mask.mask_val = nge_reg_get8(ngep, NGE_MINTR_MASK);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Enable all interrupt event
51fc88a818087605a0e5f11eddb8b66576f72c23Winson Wang - Sun Microsystems - Beijing China intr_mask.mask_bits.teint = NGE_SET;
51fc88a818087605a0e5f11eddb8b66576f72c23Winson Wang - Sun Microsystems - Beijing China intr_mask.mask_bits.tcint = NGE_CLEAR;
51fc88a818087605a0e5f11eddb8b66576f72c23Winson Wang - Sun Microsystems - Beijing China intr_mask.mask_bits.tfint = NGE_SET;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * nge_chip_sync() -- program the chip with the unicast MAC address,
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * the multicast hash table, the required level of promiscuity.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Transform the MAC address from host to chip format, the unicast
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * MAC address(es) ...
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Reprogram the multicast address table ...
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Set or clear the PROMISCUOUS mode bit
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * For internal PHY loopback, the link will
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * not be up, so it need to sync mac modes directly.
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic void
6f3e57ac9d0b054c3169579f3422080b8ba10105mx psw_stat = (nge_sw_statistics_t *)&ngep->statistics.sw_statistics;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Fatal error is triggered by malformed driver commands.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Disable unless debugging.
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic void
6f3e57ac9d0b054c3169579f3422080b8ba10105mx case 1000:
86d6718f496c4610ccde9646950290901cd512beLi-Zhen You if (ngep->param_link_rx_pause && dev_param_p->rx_pause_frame) {
86d6718f496c4610ccde9646950290901cd512beLi-Zhen You nge_reg_put32(ngep, NGE_RX_CNTL0, rx_cntl0.cntl_val);
86d6718f496c4610ccde9646950290901cd512beLi-Zhen You nge_reg_put32(ngep, NGE_RX_CNTL0, rx_cntl0.cntl_val);
86d6718f496c4610ccde9646950290901cd512beLi-Zhen You tx_cntl.cntl_val = nge_reg_get32(ngep, NGE_TX_CNTL);
86d6718f496c4610ccde9646950290901cd512beLi-Zhen You if (ngep->param_link_tx_pause && dev_param_p->tx_pause_frame) {
86d6718f496c4610ccde9646950290901cd512beLi-Zhen You nge_reg_put32(ngep, NGE_TX_CNTL, tx_cntl.cntl_val);
86d6718f496c4610ccde9646950290901cd512beLi-Zhen You nge_reg_put32(ngep, NGE_TX_CNTL, tx_cntl.cntl_val);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Handler for hardware link state change.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * When this routine is called, the hardware link state has changed
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * and the new state is reflected in the param_* variables. Here
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * we must update the softstate, reprogram the MAC to match, and
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * record the change in the log and/or on the console.
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic void
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Update the s/w link_state
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Reprogram the MAC modes to match
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * If <check> is false, we're sure the link hasn't changed.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * If true, however, it's not yet definitive; we have to call
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * nge_phys_check() to determine whether the link has settled
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * into a new state yet ... and if it has, then call the link
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * state change handler.But when the chip is 5700 in Dell 6650
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * ,even if check is false, the link may have changed.So we
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * have to call nge_phys_check() to determine the link state.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Factotum routine to check for Tx stall, using the 'watchdog' counter
51fc88a818087605a0e5f11eddb8b66576f72c23Winson Wang - Sun Microsystems - Beijing China send_ring_t *srp;
51fc88a818087605a0e5f11eddb8b66576f72c23Winson Wang - Sun Microsystems - Beijing China srp = ngep->send;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Specific check for Tx stall ...
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * The 'watchdog' counter is incremented whenever a packet
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * is queued, reset to 1 when some (but not all) buffers
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * are reclaimed, reset to 0 (disabled) when all buffers
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * are reclaimed, and shifted left here. If it exceeds the
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * threshold value, the chip is assumed to have stalled and
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * is put into the ERROR state. The factotum will then reset
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * it on the next pass.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * All of which should ensure that we don't get into a state
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * where packets are left pending indefinitely!
51fc88a818087605a0e5f11eddb8b66576f72c23Winson Wang - Sun Microsystems - Beijing China if (ngep->watchdog == 0 &&
51fc88a818087605a0e5f11eddb8b66576f72c23Winson Wang - Sun Microsystems - Beijing China srp->tx_free < srp->desc.nslots)
51fc88a818087605a0e5f11eddb8b66576f72c23Winson Wang - Sun Microsystems - Beijing China ngep->watchdog = 1;
51fc88a818087605a0e5f11eddb8b66576f72c23Winson Wang - Sun Microsystems - Beijing China if (dogval >= nge_watchdog_check)
51fc88a818087605a0e5f11eddb8b66576f72c23Winson Wang - Sun Microsystems - Beijing China nge_tx_recycle(ngep, B_FALSE);
51fc88a818087605a0e5f11eddb8b66576f72c23Winson Wang - Sun Microsystems - Beijing China if (dogval < nge_watchdog_count)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * The factotum is woken up when there's something to do that we'd rather
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * not do from inside a hardware interrupt handler or high-level cyclic.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Its two main tasks are:
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * reset & restart the chip after an error
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * check the link status whenever necessary
6f3e57ac9d0b054c3169579f3422080b8ba10105mx/* ARGSUSED */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * If the link state changed, tell the world about it (if
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * this version of MAC supports link state notification).
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Note: can't do this while still holding the mutex.
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic void
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ngep->statistics.sw_statistics.intr_lval = pintr_src->intr_val;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx brx = (pintr_src->int_bits.reint | pintr_src->int_bits.miss
51fc88a818087605a0e5f11eddb8b66576f72c23Winson Wang - Sun Microsystems - Beijing China btx = (pintr_src->int_bits.teint | pintr_src->int_bits.tfint)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* link interrupt, check the link state */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * nge_chip_intr() -- handle chip interrupts
6f3e57ac9d0b054c3169579f3422080b8ba10105mx/* ARGSUSED */
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Check whether chip's says it's asserting #INTA;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * if not, don't process or claim the interrupt.
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Ack the interrupt
6f3e57ac9d0b054c3169579f3422080b8ba10105mxnge_pp_ioctl(nge_t *ngep, int cmd, mblk_t *mp, struct iocblk *iocp)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx switch (cmd) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Validate format of ioctl
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Validate request parameters
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Config space
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * Memory-mapped I/O space
6f3e57ac9d0b054c3169579f3422080b8ba10105mx ppfn = peek ? nge_chip_peek_seeprom : nge_chip_poke_seeprom;
6f3e57ac9d0b054c3169579f3422080b8ba10105mx * All OK - go do it!
6f3e57ac9d0b054c3169579f3422080b8ba10105mxstatic enum ioc_reply nge_diag_ioctl(nge_t *ngep, int cmd, mblk_t *mp,
6f3e57ac9d0b054c3169579f3422080b8ba10105mxnge_diag_ioctl(nge_t *ngep, int cmd, mblk_t *mp, struct iocblk *iocp)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx switch (cmd) {
6f3e57ac9d0b054c3169579f3422080b8ba10105mx nge_error(ngep, "nge_diag_ioctl: invalid cmd 0x%x", cmd);
6f3e57ac9d0b054c3169579f3422080b8ba10105mx /* NOTREACHED */
6f3e57ac9d0b054c3169579f3422080b8ba10105mxnge_chip_ioctl(nge_t *ngep, mblk_t *mp, struct iocblk *iocp)
6f3e57ac9d0b054c3169579f3422080b8ba10105mx switch (cmd) {