1*9610Sgdamore@opensolaris.org /* 2*9610Sgdamore@opensolaris.org * CDDL HEADER START 3*9610Sgdamore@opensolaris.org * 4*9610Sgdamore@opensolaris.org * The contents of this file are subject to the terms of the 5*9610Sgdamore@opensolaris.org * Common Development and Distribution License (the "License"). 6*9610Sgdamore@opensolaris.org * You may not use this file except in compliance with the License. 7*9610Sgdamore@opensolaris.org * 8*9610Sgdamore@opensolaris.org * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*9610Sgdamore@opensolaris.org * or http://www.opensolaris.org/os/licensing. 10*9610Sgdamore@opensolaris.org * See the License for the specific language governing permissions 11*9610Sgdamore@opensolaris.org * and limitations under the License. 12*9610Sgdamore@opensolaris.org * 13*9610Sgdamore@opensolaris.org * When distributing Covered Code, include this CDDL HEADER in each 14*9610Sgdamore@opensolaris.org * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*9610Sgdamore@opensolaris.org * If applicable, add the following below this CDDL HEADER, with the 16*9610Sgdamore@opensolaris.org * fields enclosed by brackets "[]" replaced with your own identifying 17*9610Sgdamore@opensolaris.org * information: Portions Copyright [yyyy] [name of copyright owner] 18*9610Sgdamore@opensolaris.org * 19*9610Sgdamore@opensolaris.org * CDDL HEADER END 20*9610Sgdamore@opensolaris.org */ 21*9610Sgdamore@opensolaris.org /* 22*9610Sgdamore@opensolaris.org * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23*9610Sgdamore@opensolaris.org * Use is subject to license terms. 24*9610Sgdamore@opensolaris.org */ 25*9610Sgdamore@opensolaris.org 26*9610Sgdamore@opensolaris.org #ifndef _SYS_HME_H 27*9610Sgdamore@opensolaris.org #define _SYS_HME_H 28*9610Sgdamore@opensolaris.org 29*9610Sgdamore@opensolaris.org #ifdef __cplusplus 30*9610Sgdamore@opensolaris.org extern "C" { 31*9610Sgdamore@opensolaris.org #endif 32*9610Sgdamore@opensolaris.org 33*9610Sgdamore@opensolaris.org /* mode */ 34*9610Sgdamore@opensolaris.org #define HME_AUTO_SPEED 0 35*9610Sgdamore@opensolaris.org #define HME_FORCE_SPEED 1 36*9610Sgdamore@opensolaris.org 37*9610Sgdamore@opensolaris.org /* speed */ 38*9610Sgdamore@opensolaris.org #define HME_SPEED_10 10 39*9610Sgdamore@opensolaris.org #define HME_SPEED_100 100 40*9610Sgdamore@opensolaris.org 41*9610Sgdamore@opensolaris.org /* half-duplex or full-duplex mode */ 42*9610Sgdamore@opensolaris.org 43*9610Sgdamore@opensolaris.org #define HME_HALF_DUPLEX 0 44*9610Sgdamore@opensolaris.org #define HME_FULL_DUPLEX 1 45*9610Sgdamore@opensolaris.org 46*9610Sgdamore@opensolaris.org #ifdef _KERNEL 47*9610Sgdamore@opensolaris.org 48*9610Sgdamore@opensolaris.org /* Named Dispatch Parameter Management Structure */ 49*9610Sgdamore@opensolaris.org typedef struct hmeparam_s { 50*9610Sgdamore@opensolaris.org uint32_t hme_param_min; 51*9610Sgdamore@opensolaris.org uint32_t hme_param_max; 52*9610Sgdamore@opensolaris.org uint32_t hme_param_val; 53*9610Sgdamore@opensolaris.org char *hme_param_name; 54*9610Sgdamore@opensolaris.org } hmeparam_t; 55*9610Sgdamore@opensolaris.org 56*9610Sgdamore@opensolaris.org 57*9610Sgdamore@opensolaris.org static hmeparam_t hme_param_arr[] = { 58*9610Sgdamore@opensolaris.org /* min max value name */ 59*9610Sgdamore@opensolaris.org { 0, 1, 1, "transceiver_inuse"}, 60*9610Sgdamore@opensolaris.org { 0, 1, 0, "link_status"}, 61*9610Sgdamore@opensolaris.org { 0, 1, 0, "link_speed"}, 62*9610Sgdamore@opensolaris.org { 0, 1, 0, "link_mode"}, 63*9610Sgdamore@opensolaris.org { 0, 255, 8, "ipg1"}, 64*9610Sgdamore@opensolaris.org { 0, 255, 4, "ipg2"}, 65*9610Sgdamore@opensolaris.org { 0, 1, 0, "use_int_xcvr"}, 66*9610Sgdamore@opensolaris.org { 0, 255, 0, "pace_size"}, 67*9610Sgdamore@opensolaris.org { 0, 1, 1, "adv_autoneg_cap"}, 68*9610Sgdamore@opensolaris.org { 0, 1, 1, "adv_100T4_cap"}, 69*9610Sgdamore@opensolaris.org { 0, 1, 1, "adv_100fdx_cap"}, 70*9610Sgdamore@opensolaris.org { 0, 1, 1, "adv_100hdx_cap"}, 71*9610Sgdamore@opensolaris.org { 0, 1, 1, "adv_10fdx_cap"}, 72*9610Sgdamore@opensolaris.org { 0, 1, 1, "adv_10hdx_cap"}, 73*9610Sgdamore@opensolaris.org { 0, 1, 1, "autoneg_cap"}, 74*9610Sgdamore@opensolaris.org { 0, 1, 1, "100T4_cap"}, 75*9610Sgdamore@opensolaris.org { 0, 1, 1, "100fdx_cap"}, 76*9610Sgdamore@opensolaris.org { 0, 1, 1, "100hdx_cap"}, 77*9610Sgdamore@opensolaris.org { 0, 1, 1, "10fdx_cap"}, 78*9610Sgdamore@opensolaris.org { 0, 1, 1, "10hdx_cap"}, 79*9610Sgdamore@opensolaris.org { 0, 1, 0, "lp_autoneg_cap"}, 80*9610Sgdamore@opensolaris.org { 0, 1, 0, "lp_100T4_cap"}, 81*9610Sgdamore@opensolaris.org { 0, 1, 0, "lp_100fdx_cap"}, 82*9610Sgdamore@opensolaris.org { 0, 1, 0, "lp_100hdx_cap"}, 83*9610Sgdamore@opensolaris.org { 0, 1, 0, "lp_10fdx_cap"}, 84*9610Sgdamore@opensolaris.org { 0, 1, 0, "lp_10hdx_cap"}, 85*9610Sgdamore@opensolaris.org { 0, 1, 1, "lance_mode"}, 86*9610Sgdamore@opensolaris.org { 0, 31, 16, "ipg0"}, 87*9610Sgdamore@opensolaris.org }; 88*9610Sgdamore@opensolaris.org 89*9610Sgdamore@opensolaris.org 90*9610Sgdamore@opensolaris.org #define hme_param_transceiver (hmep->hme_param_arr[0].hme_param_val) 91*9610Sgdamore@opensolaris.org #define hme_param_linkup (hmep->hme_param_arr[1].hme_param_val) 92*9610Sgdamore@opensolaris.org #define hme_param_speed (hmep->hme_param_arr[2].hme_param_val) 93*9610Sgdamore@opensolaris.org #define hme_param_mode (hmep->hme_param_arr[3].hme_param_val) 94*9610Sgdamore@opensolaris.org #define hme_param_ipg1 (hmep->hme_param_arr[4].hme_param_val) 95*9610Sgdamore@opensolaris.org #define hme_param_ipg2 (hmep->hme_param_arr[5].hme_param_val) 96*9610Sgdamore@opensolaris.org #define hme_param_use_intphy (hmep->hme_param_arr[6].hme_param_val) 97*9610Sgdamore@opensolaris.org #define hme_param_pace_count (hmep->hme_param_arr[7].hme_param_val) 98*9610Sgdamore@opensolaris.org #define hme_param_autoneg (hmep->hme_param_arr[8].hme_param_val) 99*9610Sgdamore@opensolaris.org #define hme_param_anar_100T4 (hmep->hme_param_arr[9].hme_param_val) 100*9610Sgdamore@opensolaris.org #define hme_param_anar_100fdx (hmep->hme_param_arr[10].hme_param_val) 101*9610Sgdamore@opensolaris.org #define hme_param_anar_100hdx (hmep->hme_param_arr[11].hme_param_val) 102*9610Sgdamore@opensolaris.org #define hme_param_anar_10fdx (hmep->hme_param_arr[12].hme_param_val) 103*9610Sgdamore@opensolaris.org #define hme_param_anar_10hdx (hmep->hme_param_arr[13].hme_param_val) 104*9610Sgdamore@opensolaris.org #define hme_param_bmsr_ancap (hmep->hme_param_arr[14].hme_param_val) 105*9610Sgdamore@opensolaris.org #define hme_param_bmsr_100T4 (hmep->hme_param_arr[15].hme_param_val) 106*9610Sgdamore@opensolaris.org #define hme_param_bmsr_100fdx (hmep->hme_param_arr[16].hme_param_val) 107*9610Sgdamore@opensolaris.org #define hme_param_bmsr_100hdx (hmep->hme_param_arr[17].hme_param_val) 108*9610Sgdamore@opensolaris.org #define hme_param_bmsr_10fdx (hmep->hme_param_arr[18].hme_param_val) 109*9610Sgdamore@opensolaris.org #define hme_param_bmsr_10hdx (hmep->hme_param_arr[19].hme_param_val) 110*9610Sgdamore@opensolaris.org #define hme_param_aner_lpancap (hmep->hme_param_arr[20].hme_param_val) 111*9610Sgdamore@opensolaris.org #define hme_param_anlpar_100T4 (hmep->hme_param_arr[21].hme_param_val) 112*9610Sgdamore@opensolaris.org #define hme_param_anlpar_100fdx (hmep->hme_param_arr[22].hme_param_val) 113*9610Sgdamore@opensolaris.org #define hme_param_anlpar_100hdx (hmep->hme_param_arr[23].hme_param_val) 114*9610Sgdamore@opensolaris.org #define hme_param_anlpar_10fdx (hmep->hme_param_arr[24].hme_param_val) 115*9610Sgdamore@opensolaris.org #define hme_param_anlpar_10hdx (hmep->hme_param_arr[25].hme_param_val) 116*9610Sgdamore@opensolaris.org #define hme_param_lance_mode (hmep->hme_param_arr[26].hme_param_val) 117*9610Sgdamore@opensolaris.org #define hme_param_ipg0 (hmep->hme_param_arr[27].hme_param_val) 118*9610Sgdamore@opensolaris.org 119*9610Sgdamore@opensolaris.org #define HME_PARAM_CNT 29 120*9610Sgdamore@opensolaris.org 121*9610Sgdamore@opensolaris.org 122*9610Sgdamore@opensolaris.org /* command */ 123*9610Sgdamore@opensolaris.org 124*9610Sgdamore@opensolaris.org #define HME_ND_GET ND_GET 125*9610Sgdamore@opensolaris.org #define HME_ND_SET ND_SET 126*9610Sgdamore@opensolaris.org 127*9610Sgdamore@opensolaris.org /* default IPG settings */ 128*9610Sgdamore@opensolaris.org #define IPG1 8 129*9610Sgdamore@opensolaris.org #define IPG2 4 130*9610Sgdamore@opensolaris.org 131*9610Sgdamore@opensolaris.org /* 132*9610Sgdamore@opensolaris.org * Declarations and definitions specific to the 133*9610Sgdamore@opensolaris.org * FEPS 10/100 Mbps Ethernet (hme) device. 134*9610Sgdamore@opensolaris.org */ 135*9610Sgdamore@opensolaris.org 136*9610Sgdamore@opensolaris.org /* 137*9610Sgdamore@opensolaris.org * Per-Stream instance state information. 138*9610Sgdamore@opensolaris.org * 139*9610Sgdamore@opensolaris.org * Each instance is dynamically allocated at open() and free'd 140*9610Sgdamore@opensolaris.org * at close(). Each per-Stream instance points to at most one 141*9610Sgdamore@opensolaris.org * per-device structure using the sb_hmep field. All instances 142*9610Sgdamore@opensolaris.org * are threaded together into one list of active instances 143*9610Sgdamore@opensolaris.org * ordered on minor device number. 144*9610Sgdamore@opensolaris.org */ 145*9610Sgdamore@opensolaris.org 146*9610Sgdamore@opensolaris.org #define MSECOND(t) t 147*9610Sgdamore@opensolaris.org #define SECOND(t) t*1000 148*9610Sgdamore@opensolaris.org #define HME_TICKS MSECOND(100) 149*9610Sgdamore@opensolaris.org 150*9610Sgdamore@opensolaris.org #define HME_LINKCHECK_TIMER SECOND(30) 151*9610Sgdamore@opensolaris.org 152*9610Sgdamore@opensolaris.org #define HME_2P0_REVID 0xa0 /* hme - feps. */ 153*9610Sgdamore@opensolaris.org #define HME_2P1_REVID 0x20 154*9610Sgdamore@opensolaris.org #define HME_2P1_REVID_OBP 0x21 155*9610Sgdamore@opensolaris.org #define HME_1C0_REVID 0xc0 /* cheerio 1.0, hme 2.0 equiv. */ 156*9610Sgdamore@opensolaris.org #define HME_2C0_REVID 0xc1 /* cheerio 2.0, hme 2.2 equiv. */ 157*9610Sgdamore@opensolaris.org #define HME_REV_VERS_MASK 0x0f /* Mask to retain bits for cheerio ver */ 158*9610Sgdamore@opensolaris.org 159*9610Sgdamore@opensolaris.org #define HME_NTRIES_LOW (SECOND(5)/HME_TICKS) /* 5 Seconds */ 160*9610Sgdamore@opensolaris.org #define HME_NTRIES_HIGH (SECOND(5)/HME_TICKS) /* 5 Seconds */ 161*9610Sgdamore@opensolaris.org #define HME_NTRIES_LOW_10 (SECOND(2)/HME_TICKS) /* 2 Seconds */ 162*9610Sgdamore@opensolaris.org #define HME_LINKDOWN_TIME (SECOND(2)/HME_TICKS) /* 2 Seconds */ 163*9610Sgdamore@opensolaris.org 164*9610Sgdamore@opensolaris.org #define HME_LINKDOWN_OK 0 165*9610Sgdamore@opensolaris.org #define HME_FORCE_LINKDOWN 1 166*9610Sgdamore@opensolaris.org #define HME_LINKDOWN_STARTED 2 167*9610Sgdamore@opensolaris.org #define HME_LINKDOWN_DONE 3 168*9610Sgdamore@opensolaris.org 169*9610Sgdamore@opensolaris.org #define P1_0 0x100 170*9610Sgdamore@opensolaris.org 171*9610Sgdamore@opensolaris.org #define HME_EXTERNAL_TRANSCEIVER 0 172*9610Sgdamore@opensolaris.org #define HME_INTERNAL_TRANSCEIVER 1 173*9610Sgdamore@opensolaris.org #define HME_NO_TRANSCEIVER 2 174*9610Sgdamore@opensolaris.org 175*9610Sgdamore@opensolaris.org #define HME_HWAN_TRY 0 /* Try Hardware autonegotiation */ 176*9610Sgdamore@opensolaris.org #define HME_HWAN_INPROGRESS 1 /* Hardware autonegotiation in progress */ 177*9610Sgdamore@opensolaris.org #define HME_HWAN_SUCCESFUL 2 /* Hardware autonegotiation succesful */ 178*9610Sgdamore@opensolaris.org #define HME_HWAN_FAILED 3 /* Hardware autonegotiation failed */ 179*9610Sgdamore@opensolaris.org 180*9610Sgdamore@opensolaris.org #define RESET_TO_BE_ISSUED 0 /* Reset command to be issued to the PHY */ 181*9610Sgdamore@opensolaris.org #define RESET_ISSUED 1 /* Reset command has been issued */ 182*9610Sgdamore@opensolaris.org #define ISOLATE_ISSUED 2 /* Isolate-remove command has been issued */ 183*9610Sgdamore@opensolaris.org #define POWER_OFF_ISSUED 3 /* The QSI Phy may have problems with */ 184*9610Sgdamore@opensolaris.org /* Power rampup. Issue powerdown in */ 185*9610Sgdamore@opensolaris.org /* the driver to insure good reset. */ 186*9610Sgdamore@opensolaris.org struct hmesave { 187*9610Sgdamore@opensolaris.org ulong_t hme_starts; 188*9610Sgdamore@opensolaris.org uint32_t hme_opackets; 189*9610Sgdamore@opensolaris.org }; 190*9610Sgdamore@opensolaris.org 191*9610Sgdamore@opensolaris.org typedef struct { 192*9610Sgdamore@opensolaris.org ddi_dma_handle_t dmah; 193*9610Sgdamore@opensolaris.org ddi_acc_handle_t acch; 194*9610Sgdamore@opensolaris.org caddr_t kaddr; 195*9610Sgdamore@opensolaris.org uint32_t paddr; 196*9610Sgdamore@opensolaris.org } hmebuf_t; 197*9610Sgdamore@opensolaris.org 198*9610Sgdamore@opensolaris.org /* 199*9610Sgdamore@opensolaris.org * HME Device Channel instance state information. 200*9610Sgdamore@opensolaris.org * 201*9610Sgdamore@opensolaris.org * Each instance is dynamically allocated on first attach. 202*9610Sgdamore@opensolaris.org */ 203*9610Sgdamore@opensolaris.org struct hme { 204*9610Sgdamore@opensolaris.org mac_handle_t hme_mh; /* GLDv3 handle */ 205*9610Sgdamore@opensolaris.org dev_info_t *dip; /* associated dev_info */ 206*9610Sgdamore@opensolaris.org int instance; /* instance */ 207*9610Sgdamore@opensolaris.org ulong_t pagesize; /* btop(9F) */ 208*9610Sgdamore@opensolaris.org 209*9610Sgdamore@opensolaris.org /* 210*9610Sgdamore@opensolaris.org * xcvr information 211*9610Sgdamore@opensolaris.org */ 212*9610Sgdamore@opensolaris.org uint16_t hme_idr1; /* PHY IDR1 register */ 213*9610Sgdamore@opensolaris.org uint16_t hme_idr2; /* PHY IDR2 register */ 214*9610Sgdamore@opensolaris.org uint16_t hme_anar; /* PHY ANAR register */ 215*9610Sgdamore@opensolaris.org uint16_t hme_anlpar; /* PHY ANLPAR register */ 216*9610Sgdamore@opensolaris.org uint16_t hme_aner; /* PHY ANER register */ 217*9610Sgdamore@opensolaris.org 218*9610Sgdamore@opensolaris.org int hme_mifpoll_enable; 219*9610Sgdamore@opensolaris.org int hme_frame_enable; 220*9610Sgdamore@opensolaris.org int hme_lance_mode_enable; 221*9610Sgdamore@opensolaris.org int hme_rxcv_enable; 222*9610Sgdamore@opensolaris.org 223*9610Sgdamore@opensolaris.org uint_t hme_burstsizes; /* binary encoded val */ 224*9610Sgdamore@opensolaris.org uint32_t hme_config; /* Config reg store */ 225*9610Sgdamore@opensolaris.org 226*9610Sgdamore@opensolaris.org int hme_phy_retries; /* phy reset failures */ 227*9610Sgdamore@opensolaris.org int hme_phy_failure; /* phy failure type */ 228*9610Sgdamore@opensolaris.org 229*9610Sgdamore@opensolaris.org int hme_64bit_xfer; /* 64-bit Sbus xfers */ 230*9610Sgdamore@opensolaris.org int hme_phyad; 231*9610Sgdamore@opensolaris.org int hme_autoneg; 232*9610Sgdamore@opensolaris.org 233*9610Sgdamore@opensolaris.org caddr_t hme_g_nd; /* head of the */ 234*9610Sgdamore@opensolaris.org /* named dispatch table */ 235*9610Sgdamore@opensolaris.org hmeparam_t hme_param_arr[HME_PARAM_CNT]; 236*9610Sgdamore@opensolaris.org int hme_transceiver; /* current PHY in use */ 237*9610Sgdamore@opensolaris.org int hme_link_pulse_disabled; 238*9610Sgdamore@opensolaris.org uint16_t hme_bmcr; /* PHY control register */ 239*9610Sgdamore@opensolaris.org uint16_t hme_bmsr; /* PHY status register */ 240*9610Sgdamore@opensolaris.org int hme_mode; /* auto/forced mode */ 241*9610Sgdamore@opensolaris.org int hme_linkup; /* link status */ 242*9610Sgdamore@opensolaris.org int hme_xcvr_state; /* transceiver status */ 243*9610Sgdamore@opensolaris.org int hme_forcespeed; /* speed in forced mode */ 244*9610Sgdamore@opensolaris.org int hme_tryspeed; /* speed in auto mode */ 245*9610Sgdamore@opensolaris.org int hme_fdx; /* full-duplex mode */ 246*9610Sgdamore@opensolaris.org int hme_pace_count; /* pacing pkt count */ 247*9610Sgdamore@opensolaris.org 248*9610Sgdamore@opensolaris.org int hme_macfdx; 249*9610Sgdamore@opensolaris.org int hme_linkcheck; 250*9610Sgdamore@opensolaris.org int hme_force_linkdown; 251*9610Sgdamore@opensolaris.org int hme_nlasttries; 252*9610Sgdamore@opensolaris.org int hme_ntries; 253*9610Sgdamore@opensolaris.org int hme_delay; 254*9610Sgdamore@opensolaris.org int hme_linkup_10; 255*9610Sgdamore@opensolaris.org int hme_linkup_cnt; 256*9610Sgdamore@opensolaris.org timeout_id_t hme_timerid; 257*9610Sgdamore@opensolaris.org int hme_cheerio_mode; 258*9610Sgdamore@opensolaris.org int hme_polling_on; 259*9610Sgdamore@opensolaris.org int hme_mifpoll_data; 260*9610Sgdamore@opensolaris.org int hme_mifpoll_flag; 261*9610Sgdamore@opensolaris.org 262*9610Sgdamore@opensolaris.org /* 263*9610Sgdamore@opensolaris.org * This is part of the hardening of the hme driver 264*9610Sgdamore@opensolaris.org * (following x fields) 265*9610Sgdamore@opensolaris.org */ 266*9610Sgdamore@opensolaris.org ushort_t hme_disabled; 267*9610Sgdamore@opensolaris.org 268*9610Sgdamore@opensolaris.org struct ether_addr hme_factaddr; /* factory mac address */ 269*9610Sgdamore@opensolaris.org struct ether_addr hme_ouraddr; /* individual address */ 270*9610Sgdamore@opensolaris.org uint32_t hme_addrflags; /* address flags */ 271*9610Sgdamore@opensolaris.org uint32_t hme_flags; /* misc. flags */ 272*9610Sgdamore@opensolaris.org boolean_t hme_wantw; /* xmit: out of resources */ 273*9610Sgdamore@opensolaris.org boolean_t hme_started; /* mac layer started */ 274*9610Sgdamore@opensolaris.org 275*9610Sgdamore@opensolaris.org uint8_t hme_devno; 276*9610Sgdamore@opensolaris.org 277*9610Sgdamore@opensolaris.org uint16_t hme_ladrf[4]; /* 64 bit multicast filter */ 278*9610Sgdamore@opensolaris.org uint32_t hme_ladrf_refcnt[64]; 279*9610Sgdamore@opensolaris.org boolean_t hme_promisc; 280*9610Sgdamore@opensolaris.org uint32_t hme_multi; /* refcount on mcast addrs */ 281*9610Sgdamore@opensolaris.org 282*9610Sgdamore@opensolaris.org struct hme_global *hme_globregp; /* HME global regs */ 283*9610Sgdamore@opensolaris.org struct hme_etx *hme_etxregp; /* HME ETX regs */ 284*9610Sgdamore@opensolaris.org struct hme_erx *hme_erxregp; /* HME ERX regs */ 285*9610Sgdamore@opensolaris.org struct hme_bmac *hme_bmacregp; /* BigMAC registers */ 286*9610Sgdamore@opensolaris.org struct hme_mif *hme_mifregp; /* HME transceiver */ 287*9610Sgdamore@opensolaris.org unsigned char *hme_romp; /* fcode rom pointer */ 288*9610Sgdamore@opensolaris.org 289*9610Sgdamore@opensolaris.org kmutex_t hme_xmitlock; /* protect xmit-side fields */ 290*9610Sgdamore@opensolaris.org kmutex_t hme_intrlock; /* protect intr-side fields */ 291*9610Sgdamore@opensolaris.org kmutex_t hme_linklock; /* protect link-side fields */ 292*9610Sgdamore@opensolaris.org ddi_iblock_cookie_t hme_cookie; /* interrupt cookie */ 293*9610Sgdamore@opensolaris.org 294*9610Sgdamore@opensolaris.org struct hme_rmd *hme_rmdp; /* receive descriptor ring start */ 295*9610Sgdamore@opensolaris.org struct hme_tmd *hme_tmdp; /* transmit descriptor ring start */ 296*9610Sgdamore@opensolaris.org 297*9610Sgdamore@opensolaris.org ddi_dma_handle_t hme_rmd_dmah; 298*9610Sgdamore@opensolaris.org ddi_acc_handle_t hme_rmd_acch; 299*9610Sgdamore@opensolaris.org caddr_t hme_rmd_kaddr; 300*9610Sgdamore@opensolaris.org uint32_t hme_rmd_paddr; 301*9610Sgdamore@opensolaris.org 302*9610Sgdamore@opensolaris.org ddi_dma_handle_t hme_tmd_dmah; 303*9610Sgdamore@opensolaris.org ddi_acc_handle_t hme_tmd_acch; 304*9610Sgdamore@opensolaris.org caddr_t hme_tmd_kaddr; 305*9610Sgdamore@opensolaris.org uint32_t hme_tmd_paddr; 306*9610Sgdamore@opensolaris.org 307*9610Sgdamore@opensolaris.org uint64_t hme_rxindex; 308*9610Sgdamore@opensolaris.org uint64_t hme_txindex; 309*9610Sgdamore@opensolaris.org uint64_t hme_txreclaim; 310*9610Sgdamore@opensolaris.org 311*9610Sgdamore@opensolaris.org hmebuf_t *hme_tbuf; /* hmebuf associated with TMD */ 312*9610Sgdamore@opensolaris.org hmebuf_t *hme_rbuf; /* hmebuf associated with RMD */ 313*9610Sgdamore@opensolaris.org 314*9610Sgdamore@opensolaris.org ddi_device_acc_attr_t hme_dev_attr; 315*9610Sgdamore@opensolaris.org ddi_acc_handle_t hme_globregh; /* HME global regs */ 316*9610Sgdamore@opensolaris.org ddi_acc_handle_t hme_etxregh; /* HME ETX regs */ 317*9610Sgdamore@opensolaris.org ddi_acc_handle_t hme_erxregh; /* HME ERX regs */ 318*9610Sgdamore@opensolaris.org ddi_acc_handle_t hme_bmacregh; /* BigMAC registers */ 319*9610Sgdamore@opensolaris.org ddi_acc_handle_t hme_mifregh; /* HME transceiver */ 320*9610Sgdamore@opensolaris.org ddi_acc_handle_t hme_romh; /* rom handle */ 321*9610Sgdamore@opensolaris.org 322*9610Sgdamore@opensolaris.org ddi_acc_handle_t pci_config_handle; /* HME PCI config */ 323*9610Sgdamore@opensolaris.org 324*9610Sgdamore@opensolaris.org /* 325*9610Sgdamore@opensolaris.org * DDI dma handle, kernel virtual base, 326*9610Sgdamore@opensolaris.org * and io virtual base of IOPB area. 327*9610Sgdamore@opensolaris.org */ 328*9610Sgdamore@opensolaris.org ddi_dma_handle_t hme_iopbhandle; 329*9610Sgdamore@opensolaris.org ulong_t hme_iopbkbase; 330*9610Sgdamore@opensolaris.org uint32_t hme_iopbiobase; 331*9610Sgdamore@opensolaris.org 332*9610Sgdamore@opensolaris.org kstat_t *hme_ksp; /* kstat pointer */ 333*9610Sgdamore@opensolaris.org kstat_t *hme_intrstats; /* kstat interrupt counter */ 334*9610Sgdamore@opensolaris.org uint64_t hme_iipackets; /* Used to store the Count of packets */ 335*9610Sgdamore@opensolaris.org /* recieved at the start of 'hme_check_link' */ 336*9610Sgdamore@opensolaris.org /* watch dog interval. */ 337*9610Sgdamore@opensolaris.org 338*9610Sgdamore@opensolaris.org uint64_t hme_ifspeed; /* ifspeed is now in bits/sec */ 339*9610Sgdamore@opensolaris.org uint64_t hme_ipackets; 340*9610Sgdamore@opensolaris.org uint64_t hme_rbytes; 341*9610Sgdamore@opensolaris.org uint64_t hme_ierrors; 342*9610Sgdamore@opensolaris.org uint64_t hme_opackets; 343*9610Sgdamore@opensolaris.org uint64_t hme_obytes; 344*9610Sgdamore@opensolaris.org uint64_t hme_oerrors; 345*9610Sgdamore@opensolaris.org uint64_t hme_multircv; /* # multicast packets received */ 346*9610Sgdamore@opensolaris.org uint64_t hme_multixmt; /* # multicast packets for xmit */ 347*9610Sgdamore@opensolaris.org uint64_t hme_brdcstrcv; /* # broadcast packets received */ 348*9610Sgdamore@opensolaris.org uint64_t hme_brdcstxmt; /* # broadcast packets for xmit */ 349*9610Sgdamore@opensolaris.org uint64_t hme_oflo; 350*9610Sgdamore@opensolaris.org uint64_t hme_uflo; 351*9610Sgdamore@opensolaris.org uint64_t hme_norcvbuf; /* # rcv packets discarded */ 352*9610Sgdamore@opensolaris.org uint64_t hme_noxmtbuf; /* # xmit packets discarded */ 353*9610Sgdamore@opensolaris.org uint64_t hme_duplex; 354*9610Sgdamore@opensolaris.org uint64_t hme_align_errors; 355*9610Sgdamore@opensolaris.org uint64_t hme_coll; 356*9610Sgdamore@opensolaris.org uint64_t hme_fcs_errors; 357*9610Sgdamore@opensolaris.org uint64_t hme_defer_xmts; 358*9610Sgdamore@opensolaris.org uint64_t hme_sqe_errors; 359*9610Sgdamore@opensolaris.org uint64_t hme_excol; 360*9610Sgdamore@opensolaris.org uint64_t hme_fstcol; 361*9610Sgdamore@opensolaris.org uint64_t hme_tlcol; 362*9610Sgdamore@opensolaris.org uint64_t hme_toolong_errors; 363*9610Sgdamore@opensolaris.org uint64_t hme_runt; 364*9610Sgdamore@opensolaris.org uint64_t hme_carrier_errors; 365*9610Sgdamore@opensolaris.org uint64_t hme_jab; 366*9610Sgdamore@opensolaris.org 367*9610Sgdamore@opensolaris.org uint32_t hme_cvc; 368*9610Sgdamore@opensolaris.org uint32_t hme_lenerr; 369*9610Sgdamore@opensolaris.org uint32_t hme_buff; 370*9610Sgdamore@opensolaris.org uint32_t hme_missed; 371*9610Sgdamore@opensolaris.org uint32_t hme_nocanput; 372*9610Sgdamore@opensolaris.org uint32_t hme_allocbfail; 373*9610Sgdamore@opensolaris.org uint32_t hme_babl; 374*9610Sgdamore@opensolaris.org uint32_t hme_tmder; 375*9610Sgdamore@opensolaris.org uint32_t hme_txlaterr; 376*9610Sgdamore@opensolaris.org uint32_t hme_rxlaterr; 377*9610Sgdamore@opensolaris.org uint32_t hme_slvparerr; 378*9610Sgdamore@opensolaris.org uint32_t hme_txparerr; 379*9610Sgdamore@opensolaris.org uint32_t hme_rxparerr; 380*9610Sgdamore@opensolaris.org uint32_t hme_slverrack; 381*9610Sgdamore@opensolaris.org uint32_t hme_txerrack; 382*9610Sgdamore@opensolaris.org uint32_t hme_rxerrack; 383*9610Sgdamore@opensolaris.org uint32_t hme_txtagerr; 384*9610Sgdamore@opensolaris.org uint32_t hme_rxtagerr; 385*9610Sgdamore@opensolaris.org uint32_t hme_eoperr; 386*9610Sgdamore@opensolaris.org uint32_t hme_notmds; 387*9610Sgdamore@opensolaris.org uint32_t hme_notbufs; 388*9610Sgdamore@opensolaris.org uint32_t hme_norbufs; 389*9610Sgdamore@opensolaris.org 390*9610Sgdamore@opensolaris.org /* 391*9610Sgdamore@opensolaris.org * check if transmitter is hung 392*9610Sgdamore@opensolaris.org */ 393*9610Sgdamore@opensolaris.org uint32_t hme_starts; 394*9610Sgdamore@opensolaris.org uint32_t hme_txhung; 395*9610Sgdamore@opensolaris.org time_t hme_msg_time; 396*9610Sgdamore@opensolaris.org struct hmesave hmesave; 397*9610Sgdamore@opensolaris.org 398*9610Sgdamore@opensolaris.org /* 399*9610Sgdamore@opensolaris.org * Debuging kstats 400*9610Sgdamore@opensolaris.org */ 401*9610Sgdamore@opensolaris.org uint32_t inits; 402*9610Sgdamore@opensolaris.org uint32_t phyfail; 403*9610Sgdamore@opensolaris.org uint32_t asic_rev; 404*9610Sgdamore@opensolaris.org }; 405*9610Sgdamore@opensolaris.org 406*9610Sgdamore@opensolaris.org /* flags */ 407*9610Sgdamore@opensolaris.org #define HMERUNNING 0x01 /* chip is initialized */ 408*9610Sgdamore@opensolaris.org #define HMESUSPENDED 0x08 /* suspended interface */ 409*9610Sgdamore@opensolaris.org #define HMEINITIALIZED 0x10 /* interface initialized */ 410*9610Sgdamore@opensolaris.org 411*9610Sgdamore@opensolaris.org /* Mac address flags */ 412*9610Sgdamore@opensolaris.org 413*9610Sgdamore@opensolaris.org #define HME_FACTADDR_PRESENT 0x01 /* factory MAC id present */ 414*9610Sgdamore@opensolaris.org #define HME_FACTADDR_USE 0x02 /* use factory MAC id */ 415*9610Sgdamore@opensolaris.org 416*9610Sgdamore@opensolaris.org struct hmekstat { 417*9610Sgdamore@opensolaris.org struct kstat_named hk_cvc; /* code violation errors */ 418*9610Sgdamore@opensolaris.org struct kstat_named hk_lenerr; /* rx len errors */ 419*9610Sgdamore@opensolaris.org struct kstat_named hk_buff; /* buff errors */ 420*9610Sgdamore@opensolaris.org struct kstat_named hk_missed; /* missed/dropped packets */ 421*9610Sgdamore@opensolaris.org struct kstat_named hk_nocanput; /* nocanput errors */ 422*9610Sgdamore@opensolaris.org struct kstat_named hk_allocbfail; /* allocb failures */ 423*9610Sgdamore@opensolaris.org struct kstat_named hk_babl; /* runt errors */ 424*9610Sgdamore@opensolaris.org struct kstat_named hk_tmder; /* tmd errors */ 425*9610Sgdamore@opensolaris.org struct kstat_named hk_txlaterr; /* tx late errors */ 426*9610Sgdamore@opensolaris.org struct kstat_named hk_rxlaterr; /* rx late errors */ 427*9610Sgdamore@opensolaris.org struct kstat_named hk_slvparerr; /* slave parity errors */ 428*9610Sgdamore@opensolaris.org struct kstat_named hk_txparerr; /* tx parity errors */ 429*9610Sgdamore@opensolaris.org struct kstat_named hk_rxparerr; /* rx parity errors */ 430*9610Sgdamore@opensolaris.org struct kstat_named hk_slverrack; /* slave error acks */ 431*9610Sgdamore@opensolaris.org struct kstat_named hk_txerrack; /* tx error acks */ 432*9610Sgdamore@opensolaris.org struct kstat_named hk_rxerrack; /* rx error acks */ 433*9610Sgdamore@opensolaris.org struct kstat_named hk_txtagerr; /* tx tag error */ 434*9610Sgdamore@opensolaris.org struct kstat_named hk_rxtagerr; /* rx tag error */ 435*9610Sgdamore@opensolaris.org struct kstat_named hk_eoperr; /* eop error */ 436*9610Sgdamore@opensolaris.org struct kstat_named hk_notmds; /* tmd errors */ 437*9610Sgdamore@opensolaris.org struct kstat_named hk_notbufs; /* tx buf errors */ 438*9610Sgdamore@opensolaris.org struct kstat_named hk_norbufs; /* rx buf errors */ 439*9610Sgdamore@opensolaris.org 440*9610Sgdamore@opensolaris.org struct kstat_named hk_inits; /* global inits */ 441*9610Sgdamore@opensolaris.org struct kstat_named hk_phyfail; /* phy failures */ 442*9610Sgdamore@opensolaris.org 443*9610Sgdamore@opensolaris.org struct kstat_named hk_asic_rev; /* asic_rev */ 444*9610Sgdamore@opensolaris.org }; 445*9610Sgdamore@opensolaris.org 446*9610Sgdamore@opensolaris.org #define HMEDRAINTIME (400000) /* # microseconds xmit drain */ 447*9610Sgdamore@opensolaris.org 448*9610Sgdamore@opensolaris.org #define ROUNDUP(a, n) (((a) + ((n) - 1)) & ~((n) - 1)) 449*9610Sgdamore@opensolaris.org #define ROUNDUP2(a, n) (uchar_t *)((((uintptr_t)(a)) + ((n) - 1)) & ~((n) - 1)) 450*9610Sgdamore@opensolaris.org 451*9610Sgdamore@opensolaris.org /* 452*9610Sgdamore@opensolaris.org * Xmit/receive buffer structure. 453*9610Sgdamore@opensolaris.org * This structure is organized to meet the following requirements: 454*9610Sgdamore@opensolaris.org * - bb_buf starts on an HMEBURSTSIZE boundary. 455*9610Sgdamore@opensolaris.org * - hmebuf is an even multiple of HMEBURSTSIZE 456*9610Sgdamore@opensolaris.org * - bb_buf[] is large enough to contain max VLAN frame (1522) plus 457*9610Sgdamore@opensolaris.org * (3 x HMEBURSTSIZE) rounded up to the next HMEBURSTSIZE 458*9610Sgdamore@opensolaris.org * XXX What about another 128 bytes (HMEC requirement). 459*9610Sgdamore@opensolaris.org * Fast aligned copy requires both the source and destination 460*9610Sgdamore@opensolaris.org * addresses have the same offset from some N-byte boundary. 461*9610Sgdamore@opensolaris.org */ 462*9610Sgdamore@opensolaris.org #define HMEBURSTSIZE (64) 463*9610Sgdamore@opensolaris.org #define HMEBURSTMASK (HMEBURSTSIZE - 1) 464*9610Sgdamore@opensolaris.org #define HMEBUFSIZE (1728) 465*9610Sgdamore@opensolaris.org 466*9610Sgdamore@opensolaris.org /* 467*9610Sgdamore@opensolaris.org * Define offset from start of bb_buf[] to point receive descriptor. 468*9610Sgdamore@opensolaris.org * Requirements: 469*9610Sgdamore@opensolaris.org * - must be 14 bytes back of a 4-byte boundary so the start of 470*9610Sgdamore@opensolaris.org * the network packet is 4-byte aligned. 471*9610Sgdamore@opensolaris.org * - leave some headroom for others 472*9610Sgdamore@opensolaris.org */ 473*9610Sgdamore@opensolaris.org #define HMEHEADROOM (34) 474*9610Sgdamore@opensolaris.org 475*9610Sgdamore@opensolaris.org /* Offset for the first byte in the receive buffer */ 476*9610Sgdamore@opensolaris.org #define HME_FSTBYTE_OFFSET 2 477*9610Sgdamore@opensolaris.org 478*9610Sgdamore@opensolaris.org #endif /* _KERNEL */ 479*9610Sgdamore@opensolaris.org 480*9610Sgdamore@opensolaris.org #ifdef __cplusplus 481*9610Sgdamore@opensolaris.org } 482*9610Sgdamore@opensolaris.org #endif 483*9610Sgdamore@opensolaris.org 484*9610Sgdamore@opensolaris.org #endif /* _SYS_HME_H */ 485