rge_chip.c revision bdb9230ac765cb7af3fc1f4119caf2c5720dceb3
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * CDDL HEADER START
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * The contents of this file are subject to the terms of the
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Common Development and Distribution License (the "License").
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * You may not use this file except in compliance with the License.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * See the License for the specific language governing permissions
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * and limitations under the License.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * When distributing Covered Code, include this CDDL HEADER in each
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * If applicable, add the following below this CDDL HEADER, with the
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * fields enclosed by brackets "[]" replaced with your own identifying
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * information: Portions Copyright [yyyy] [name of copyright owner]
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * CDDL HEADER END
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Use is subject to license terms.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek#define REG32(rgep, reg) ((uint32_t *)(rgep->io_regs+(reg)))
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek#define REG16(rgep, reg) ((uint16_t *)(rgep->io_regs+(reg)))
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek#define REG8(rgep, reg) ((uint8_t *)(rgep->io_regs+(reg)))
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek#define PIO_ADDR(rgep, offset) ((void *)(rgep->io_regs+(offset)))
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Patchable globals:
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * rge_autorecover
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Enables/disables automatic recovery after fault detection
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek#define RGE_DBG RGE_DBG_REGS /* debug flag for this code */
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Operating register get/set access routines
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinekstatic uint32_t rge_reg_get32(rge_t *rgep, uintptr_t regno);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek return (ddi_get32(rgep->io_handle, REG32(rgep, regno)));
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinekstatic void rge_reg_put32(rge_t *rgep, uintptr_t regno, uint32_t data);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinekrge_reg_put32(rge_t *rgep, uintptr_t regno, uint32_t data)
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ddi_put32(rgep->io_handle, REG32(rgep, regno), data);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinekstatic void rge_reg_set32(rge_t *rgep, uintptr_t regno, uint32_t bits);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinekrge_reg_set32(rge_t *rgep, uintptr_t regno, uint32_t bits)
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinekstatic void rge_reg_clr32(rge_t *rgep, uintptr_t regno, uint32_t bits);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinekrge_reg_clr32(rge_t *rgep, uintptr_t regno, uint32_t bits)
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinekstatic uint16_t rge_reg_get16(rge_t *rgep, uintptr_t regno);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek return (ddi_get16(rgep->io_handle, REG16(rgep, regno)));
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinekstatic void rge_reg_put16(rge_t *rgep, uintptr_t regno, uint16_t data);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinekrge_reg_put16(rge_t *rgep, uintptr_t regno, uint16_t data)
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ddi_put16(rgep->io_handle, REG16(rgep, regno), data);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinekstatic uint8_t rge_reg_get8(rge_t *rgep, uintptr_t regno);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek return (ddi_get8(rgep->io_handle, REG8(rgep, regno)));
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinekstatic void rge_reg_put8(rge_t *rgep, uintptr_t regno, uint8_t data);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinekrge_reg_put8(rge_t *rgep, uintptr_t regno, uint8_t data)
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ddi_put8(rgep->io_handle, REG8(rgep, regno), data);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinekstatic void rge_reg_set8(rge_t *rgep, uintptr_t regno, uint8_t bits);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinekrge_reg_set8(rge_t *rgep, uintptr_t regno, uint8_t bits)
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinekstatic void rge_reg_clr8(rge_t *rgep, uintptr_t regno, uint8_t bits);
uint32_t i;
for (i = 0; i < PHY_RESET_LOOP; i++) {
return ((uint16_t)~0u);
uint32_t i;
for (i = 0; i < PHY_RESET_LOOP; i++) {
uint32_t i;
for (i = 0; i < PHY_RESET_LOOP; i++) {
#pragma inline(rge_mii_put16)
static uint32_t
return (oldval);
#if RGE_DEBUGGING
return (B_TRUE);
return (B_FALSE);
* Synchronise the PHY's speed/duplex/autonegotiation capabilities
* is turned ON, and the speed/mastership is forced.
case RGE_LOOP_NONE:
case RGE_LOOP_INTERNAL_PHY:
case RGE_LOOP_INTERNAL_MAC:
case RGE_LOOP_INTERNAL_PHY:
case RGE_LOOP_INTERNAL_MAC:
if (adv_autoneg)
if (adv_1000fdx)
else if (adv_1000hdx)
else if (adv_100fdx)
else if (adv_100hdx)
else if (adv_10fdx)
else if (adv_10hdx)
control |= 0;
if (adv_1000fdx) {
if (adv_1000hdx)
if (adv_100fdx)
if (adv_100hdx)
if (adv_10fdx)
if (adv_10hdx)
if (adv_pause)
if (adv_asym_pause)
case MAC_VER_8169S_D:
case MAC_VER_8169S_E :
case MAC_VER_8169SB:
case MAC_VER_8169SC:
case MAC_VER_8168:
case MAC_VER_8168B_B:
case MAC_VER_8168B_C:
case MAC_VER_8168:
case MAC_VER_8168B_B:
case MAC_VER_8168B_C:
case MAC_VER_8101E:
case MAC_VER_8101E_B:
* + Read the vendor/device/revision/subsystem/cache-line-size registers,
for (i = 0; i < CHIP_RESET_LOOP; i++) {
if (fault)
#pragma inline(rge_get_mac_addr)
#pragma inline(rge_set_mac_addr)
val32 |= p[0];
#pragma inline(rge_set_multi_addr)
#pragma inline(rge_set_promisc)
switch (todo) {
case RGE_GET_MAC:
case RGE_SET_MAC:
case RGE_SET_MUL:
case RGE_SET_PROMISC:
if (++i > STATS_DUMP_LOOP) {
#pragma inline(rge_wake_factotum)
return (DDI_INTR_UNCLAIMED);
return (DDI_INTR_UNCLAIMED);
static boolean_t
return (B_TRUE);
return (B_FALSE);
static boolean_t
return (B_FALSE);
return (B_TRUE);
return (DDI_INTR_UNCLAIMED);
case RGE_CHIP_RUNNING:
case RGE_CHIP_ERROR:
case RGE_CHIP_FAULT:
if (rge_autorecover) {
if (error)
if (linkchg)
return (result);
case RGE_CHIP_RUNNING:
case RGE_CHIP_FAULT:
case RGE_CHIP_ERROR:
void *regaddr;
void *regaddr;
void *vaddr;
void *vaddr;
static enum ioc_reply
switch (cmd) {
return (IOC_INVAL);
case RGE_PEEK:
case RGE_POKE:
return (IOC_INVAL);
return (IOC_INVAL);
return (IOC_INVAL);
case RGE_PP_SPACE_CFG:
mem_va = 0;
case RGE_PP_SPACE_REG:
mem_va = 0;
case RGE_PP_SPACE_MII:
mem_va = 0;
case RGE_PP_SPACE_RGE:
case RGE_PP_SPACE_STATISTICS:
case RGE_PP_SPACE_TXDESC:
case RGE_PP_SPACE_TXBUFF:
case RGE_PP_SPACE_RXDESC:
case RGE_PP_SPACE_RXBUFF:
case RGE_PP_SPACE_TXDESC:
case RGE_PP_SPACE_RXDESC:
case RGE_PP_SPACE_STATISTICS:
return (IOC_INVAL);
return (IOC_INVAL);
return (IOC_INVAL);
return (IOC_INVAL);
return (IOC_INVAL);
static enum ioc_reply
switch (cmd) {
return (IOC_INVAL);
case RGE_DIAG:
return (IOC_ACK);
case RGE_PEEK:
case RGE_POKE:
case RGE_PHY_RESET:
return (IOC_RESTART_ACK);
case RGE_SOFT_RESET:
case RGE_HARD_RESET:
return (IOC_ACK);
static enum ioc_reply
return (IOC_INVAL);
return (IOC_INVAL);
return (IOC_INVAL);
switch (cmd) {
return (IOC_INVAL);
case RGE_MII_READ:
return (IOC_REPLY);
case RGE_MII_WRITE:
return (IOC_ACK);
enum ioc_reply
int cmd;
switch (cmd) {
return (IOC_INVAL);
case RGE_DIAG:
case RGE_PEEK:
case RGE_POKE:
case RGE_PHY_RESET:
case RGE_SOFT_RESET:
case RGE_HARD_RESET:
return (IOC_INVAL);
case RGE_MII_READ:
case RGE_MII_WRITE: