1*11717Sgdamore@opensolaris.org /* 2*11717Sgdamore@opensolaris.org * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 3*11717Sgdamore@opensolaris.org * Use is subject to license terms. 4*11717Sgdamore@opensolaris.org */ 5*11717Sgdamore@opensolaris.org 6*11717Sgdamore@opensolaris.org /* 7*11717Sgdamore@opensolaris.org * Copyright (c) 1998 The NetBSD Foundation, Inc. 8*11717Sgdamore@opensolaris.org * All rights reserved. 9*11717Sgdamore@opensolaris.org * 10*11717Sgdamore@opensolaris.org * This code is derived from software contributed to The NetBSD Foundation 11*11717Sgdamore@opensolaris.org * by Frank van der Linden. 12*11717Sgdamore@opensolaris.org * 13*11717Sgdamore@opensolaris.org * Redistribution and use in source and binary forms, with or without 14*11717Sgdamore@opensolaris.org * modification, are permitted provided that the following conditions 15*11717Sgdamore@opensolaris.org * are met: 16*11717Sgdamore@opensolaris.org * 1. Redistributions of source code must retain the above copyright 17*11717Sgdamore@opensolaris.org * notice, this list of conditions and the following disclaimer. 18*11717Sgdamore@opensolaris.org * 2. Redistributions in binary form must reproduce the above copyright 19*11717Sgdamore@opensolaris.org * notice, this list of conditions and the following disclaimer in the 20*11717Sgdamore@opensolaris.org * documentation and/or other materials provided with the distribution. 21*11717Sgdamore@opensolaris.org * 22*11717Sgdamore@opensolaris.org * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 23*11717Sgdamore@opensolaris.org * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 24*11717Sgdamore@opensolaris.org * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 25*11717Sgdamore@opensolaris.org * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 26*11717Sgdamore@opensolaris.org * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 27*11717Sgdamore@opensolaris.org * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 28*11717Sgdamore@opensolaris.org * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 29*11717Sgdamore@opensolaris.org * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 30*11717Sgdamore@opensolaris.org * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 31*11717Sgdamore@opensolaris.org * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 32*11717Sgdamore@opensolaris.org * POSSIBILITY OF SUCH DAMAGE. 33*11717Sgdamore@opensolaris.org */ 34*11717Sgdamore@opensolaris.org 35*11717Sgdamore@opensolaris.org 36*11717Sgdamore@opensolaris.org #ifndef ELXL_H 37*11717Sgdamore@opensolaris.org #define ELXL_H 38*11717Sgdamore@opensolaris.org 39*11717Sgdamore@opensolaris.org /* 40*11717Sgdamore@opensolaris.org * This file defines the registers specific to the EtherLink XL family 41*11717Sgdamore@opensolaris.org * of NICs. 42*11717Sgdamore@opensolaris.org */ 43*11717Sgdamore@opensolaris.org 44*11717Sgdamore@opensolaris.org #define REG_CMD_STAT 0x0e /* Write command, read status */ 45*11717Sgdamore@opensolaris.org 46*11717Sgdamore@opensolaris.org #define CMD_GLOBAL_RESET 0x0000 47*11717Sgdamore@opensolaris.org #define CMD_SELECT_WINDOW 0x0800 48*11717Sgdamore@opensolaris.org #define CMD_BNC_ENABLE 0x1000 /* enable 10BASE2 DC-DC converter */ 49*11717Sgdamore@opensolaris.org #define CMD_RX_DISABLE 0x1800 50*11717Sgdamore@opensolaris.org #define CMD_RX_ENABLE 0x2000 51*11717Sgdamore@opensolaris.org #define CMD_RX_RESET 0x2800 52*11717Sgdamore@opensolaris.org #define CMD_UP_STALL 0x3000 53*11717Sgdamore@opensolaris.org #define CMD_UP_UNSTALL 0x3001 54*11717Sgdamore@opensolaris.org #define CMD_DN_STALL 0x3002 55*11717Sgdamore@opensolaris.org #define CMD_DN_UNSTALL 0x3003 56*11717Sgdamore@opensolaris.org #define CMD_TX_ENABLE 0x4800 57*11717Sgdamore@opensolaris.org #define CMD_TX_DISABLE 0x5000 58*11717Sgdamore@opensolaris.org #define CMD_TX_RESET 0x5800 59*11717Sgdamore@opensolaris.org #define CMD_INT_REQ 0x6000 60*11717Sgdamore@opensolaris.org #define CMD_INT_ACK 0x6800 61*11717Sgdamore@opensolaris.org #define CMD_INT_ENABLE 0x7000 62*11717Sgdamore@opensolaris.org #define CMD_IND_ENABLE 0x7800 63*11717Sgdamore@opensolaris.org #define CMD_SET_FILTER 0x8000 64*11717Sgdamore@opensolaris.org #define CMD_SET_RXEARLY 0x8800 65*11717Sgdamore@opensolaris.org #define CMD_SET_TXSTART 0x9800 66*11717Sgdamore@opensolaris.org #define CMD_STATS_ENABLE 0xa800 67*11717Sgdamore@opensolaris.org #define CMD_STATS_DISABLE 0xb000 68*11717Sgdamore@opensolaris.org #define CMD_BNC_DISABLE 0xb800 /* disable 10BASE2 DC-DC converter */ 69*11717Sgdamore@opensolaris.org #define CMD_SET_TXRECLAIM 0xc000 70*11717Sgdamore@opensolaris.org #define CMD_CLEAR_HASHBIT 0xc800 71*11717Sgdamore@opensolaris.org #define CMD_SET_HASHBIT 0xcc00 72*11717Sgdamore@opensolaris.org 73*11717Sgdamore@opensolaris.org /* 74*11717Sgdamore@opensolaris.org * Defines for the interrupt status register 75*11717Sgdamore@opensolaris.org */ 76*11717Sgdamore@opensolaris.org #define INT_LATCH 0x0001 77*11717Sgdamore@opensolaris.org #define INT_HOST_ERROR 0x0002 78*11717Sgdamore@opensolaris.org #define INT_TX_COMPLETE 0x0004 79*11717Sgdamore@opensolaris.org #define INT_RX_COMPLETE 0x0010 80*11717Sgdamore@opensolaris.org #define INT_RX_EARLY 0x0020 81*11717Sgdamore@opensolaris.org #define INT_REQUESTED 0x0040 82*11717Sgdamore@opensolaris.org #define INT_STATS 0x0080 83*11717Sgdamore@opensolaris.org #define INT_LINK 0x0100 /* NB: most NICs don't implement it! */ 84*11717Sgdamore@opensolaris.org #define INT_DN_COMPLETE 0x0200 85*11717Sgdamore@opensolaris.org #define INT_UP_COMPLETE 0x0400 86*11717Sgdamore@opensolaris.org #define STAT_CMD_IN_PROGRESS 0x1000 87*11717Sgdamore@opensolaris.org 88*11717Sgdamore@opensolaris.org #define INT_WATCHED \ 89*11717Sgdamore@opensolaris.org (INT_HOST_ERROR | INT_STATS | INT_DN_COMPLETE | INT_UP_COMPLETE) 90*11717Sgdamore@opensolaris.org 91*11717Sgdamore@opensolaris.org 92*11717Sgdamore@opensolaris.org /* 93*11717Sgdamore@opensolaris.org * Flat address space registers (outside the windows) 94*11717Sgdamore@opensolaris.org */ 95*11717Sgdamore@opensolaris.org 96*11717Sgdamore@opensolaris.org #define REG_TXPKTID 0x18 /* 90xB only */ 97*11717Sgdamore@opensolaris.org #define REG_TIMER 0x1a 98*11717Sgdamore@opensolaris.org #define REG_TXSTATUS 0x1b 99*11717Sgdamore@opensolaris.org #define TXSTATUS_RECLAIM_ERR 0x02 100*11717Sgdamore@opensolaris.org #define TXSTATUS_STATUS_OFLOW 0x04 /* bad news! */ 101*11717Sgdamore@opensolaris.org #define TXSTATUS_MAXCOLLISIONS 0x08 102*11717Sgdamore@opensolaris.org #define TXSTATUS_UNDERRUN 0x10 103*11717Sgdamore@opensolaris.org #define TXSTATUS_JABBER 0x20 104*11717Sgdamore@opensolaris.org #define TXSTATUS_INT_REQ 0x40 105*11717Sgdamore@opensolaris.org #define TXSTATUS_COMPLETE 0x80 106*11717Sgdamore@opensolaris.org #define TXSTATUS_ERRS 0x32 107*11717Sgdamore@opensolaris.org 108*11717Sgdamore@opensolaris.org #define REG_INTSTATUSAUTO 0x1e 109*11717Sgdamore@opensolaris.org #define REG_DMACTRL 0x20 110*11717Sgdamore@opensolaris.org #define DMACTRL_DNCMPLREQ 0x00000002 111*11717Sgdamore@opensolaris.org #define DMACTRL_DNSTALLED 0x00000004 112*11717Sgdamore@opensolaris.org #define DMACTRL_UPCOMPLETE 0x00000008 113*11717Sgdamore@opensolaris.org #define DMACTRL_DNCOMPLETE 0x00000010 114*11717Sgdamore@opensolaris.org #define DMACTRL_UPRXEAREN 0x00000020 115*11717Sgdamore@opensolaris.org #define DMACTRL_ARNCNTDN 0x00000040 116*11717Sgdamore@opensolaris.org #define DMACTRL_DNINPROG 0x00000080 117*11717Sgdamore@opensolaris.org #define DMACTRL_CNTSPEED 0x00000100 118*11717Sgdamore@opensolaris.org #define DMACTRL_CNTDNMODE 0x00000200 119*11717Sgdamore@opensolaris.org #define DMACTRL_ALTSEQDIS 0x00010000 120*11717Sgdamore@opensolaris.org #define DMACTRL_DEFEATMWI 0x00100000 121*11717Sgdamore@opensolaris.org #define DMACTRL_DEFEATMRL 0x00200000 122*11717Sgdamore@opensolaris.org #define DMACTRL_UPOVERDIS 0x00400000 123*11717Sgdamore@opensolaris.org #define DMACTRL_TARGABORT 0x40000000 124*11717Sgdamore@opensolaris.org #define DMACTRL_MSTRABORT 0x80000000 125*11717Sgdamore@opensolaris.org #define REG_DNLISTPTR 0x24 126*11717Sgdamore@opensolaris.org #define REG_DNBURSTTHRESH 0x2a /* 90xB only */ 127*11717Sgdamore@opensolaris.org #define REG_DNPRIOTHRESH 0x2c /* 90xB only */ 128*11717Sgdamore@opensolaris.org #define REG_DNPOLL 0x2d /* 90xB only */ 129*11717Sgdamore@opensolaris.org #define REG_TXFREETHRESH 0x2f /* 90x only */ 130*11717Sgdamore@opensolaris.org #define REG_UPPKTSTATUS 0x30 131*11717Sgdamore@opensolaris.org #define REG_FREETIMER 0x34 132*11717Sgdamore@opensolaris.org #define REG_COUNTDOWN 0x36 133*11717Sgdamore@opensolaris.org #define REG_UPLISTPTR 0x38 134*11717Sgdamore@opensolaris.org #define REG_UPPRIOTHRESH 0x3c /* 90xB only */ 135*11717Sgdamore@opensolaris.org #define REG_UPPOLL 0x3d /* 90xB only */ 136*11717Sgdamore@opensolaris.org #define REG_UPBURSTTHRESH 0x3e /* 90xB only */ 137*11717Sgdamore@opensolaris.org #define REG_REALTIMECNT 0x40 /* 90xB only */ 138*11717Sgdamore@opensolaris.org #define REG_DNMAXBURST 0x78 /* 90xB only */ 139*11717Sgdamore@opensolaris.org #define REG_UPMAXBURST 0x7a /* 90xB only */ 140*11717Sgdamore@opensolaris.org 141*11717Sgdamore@opensolaris.org /* 142*11717Sgdamore@opensolaris.org * Window 0. Eeprom access. 143*11717Sgdamore@opensolaris.org */ 144*11717Sgdamore@opensolaris.org #define W0_MFG_ID 0x00 145*11717Sgdamore@opensolaris.org #define W0_EE_CMD 0x0a 146*11717Sgdamore@opensolaris.org #define EE_CMD_ADDR 0x001f 147*11717Sgdamore@opensolaris.org #define EE_CMD_WRITE_EN 0x0000 148*11717Sgdamore@opensolaris.org #define EE_CMD_READ 0x0080 149*11717Sgdamore@opensolaris.org #define EE_CMD_READ8 0x0200 150*11717Sgdamore@opensolaris.org #define EE_CMD_BUSY 0x8000 151*11717Sgdamore@opensolaris.org #define W0_EE_DATA 0x0c 152*11717Sgdamore@opensolaris.org /* 153*11717Sgdamore@opensolaris.org * Window 2. 154*11717Sgdamore@opensolaris.org */ 155*11717Sgdamore@opensolaris.org #define W2_STATION_ADDRESS 0x00 156*11717Sgdamore@opensolaris.org #define W2_STATION_MASK 0x06 157*11717Sgdamore@opensolaris.org #define W2_RESET_OPTIONS 0x0c /* Reset options (90xB only) */ 158*11717Sgdamore@opensolaris.org #define W2_RESET_OPT_LEDPOLAR 0x0010 /* invert LED polarity */ 159*11717Sgdamore@opensolaris.org #define W2_RESET_OPT_PHYPOWER 0x4000 /* turn on PHY power */ 160*11717Sgdamore@opensolaris.org 161*11717Sgdamore@opensolaris.org 162*11717Sgdamore@opensolaris.org /* 163*11717Sgdamore@opensolaris.org * Window 3. 164*11717Sgdamore@opensolaris.org */ 165*11717Sgdamore@opensolaris.org #define W3_INTERNAL_CONFIG 0x00 /* 32 bits */ 166*11717Sgdamore@opensolaris.org #define W3_MAX_PKT_SIZE 0x04 /* 90xB only */ 167*11717Sgdamore@opensolaris.org #define W3_MAC_CONTROL 0x06 168*11717Sgdamore@opensolaris.org #define MAC_CONTROL_FDX 0x0020 169*11717Sgdamore@opensolaris.org #define MAC_CONTROL_ALLOW_LARGE 0x0040 170*11717Sgdamore@opensolaris.org #define MAC_CONTROL_FLOW_EN 0x0100 /* 90xB only */ 171*11717Sgdamore@opensolaris.org #define MAC_CONTROL_VLT_EN 0x0200 /* 90xB only */ 172*11717Sgdamore@opensolaris.org 173*11717Sgdamore@opensolaris.org /* 174*11717Sgdamore@opensolaris.org * This is reset options for the other cards, media options for 175*11717Sgdamore@opensolaris.org * the 90xB NICs. Reset options are in a separate register for 176*11717Sgdamore@opensolaris.org * the 90xB. 177*11717Sgdamore@opensolaris.org * 178*11717Sgdamore@opensolaris.org * Note that these bit values are also the same as the 179*11717Sgdamore@opensolaris.org * W3_RESET_OPTIONS media selection bits on 90x NICs, which 180*11717Sgdamore@opensolaris.org * conviently occupies the same register, and pretty much is 181*11717Sgdamore@opensolaris.org * the same thing. There are some differences in the upper bits, 182*11717Sgdamore@opensolaris.org * but we don't care about those. 183*11717Sgdamore@opensolaris.org */ 184*11717Sgdamore@opensolaris.org #define W3_MEDIAOPT 0x08 185*11717Sgdamore@opensolaris.org #define MEDIAOPT_100T4 0x0001 186*11717Sgdamore@opensolaris.org #define MEDIAOPT_100TX 0x0002 187*11717Sgdamore@opensolaris.org #define MEDIAOPT_100FX 0x0004 188*11717Sgdamore@opensolaris.org #define MEDIAOPT_10T 0x0008 189*11717Sgdamore@opensolaris.org #define MEDIAOPT_BNC 0x0010 190*11717Sgdamore@opensolaris.org #define MEDIAOPT_AUI 0x0020 191*11717Sgdamore@opensolaris.org #define MEDIAOPT_MII 0x0040 192*11717Sgdamore@opensolaris.org #define MEDIAOPT_10FL 0x0080 193*11717Sgdamore@opensolaris.org #define MEDIAOPT_MASK 0x00ff /* excludes 10BASEFL */ 194*11717Sgdamore@opensolaris.org 195*11717Sgdamore@opensolaris.org /* 196*11717Sgdamore@opensolaris.org * Window 4 registers. 197*11717Sgdamore@opensolaris.org */ 198*11717Sgdamore@opensolaris.org #define W4_MEDIASTAT 0xa 199*11717Sgdamore@opensolaris.org #define MEDIASTAT_SQE_EN 0x0008 200*11717Sgdamore@opensolaris.org #define MEDIASTAT_JABGUARD_EN 0x0040 201*11717Sgdamore@opensolaris.org #define MEDIASTAT_LINKBEAT_EN 0x0080 202*11717Sgdamore@opensolaris.org #define MEDIASTAT_LINKDETECT 0x0800 203*11717Sgdamore@opensolaris.org #define MEDIASTAT_AUI_DIS 0x8000 204*11717Sgdamore@opensolaris.org 205*11717Sgdamore@opensolaris.org /* 206*11717Sgdamore@opensolaris.org * Window 4, offset 8 is defined for MII/PHY access for EtherLink XL 207*11717Sgdamore@opensolaris.org * cards. 208*11717Sgdamore@opensolaris.org */ 209*11717Sgdamore@opensolaris.org #define W4_PHYSMGMT 0x08 210*11717Sgdamore@opensolaris.org #define PHYSMGMT_CLK 0x0001 211*11717Sgdamore@opensolaris.org #define PHYSMGMT_DATA 0x0002 212*11717Sgdamore@opensolaris.org #define PHYSMGMT_DIR 0x0004 213*11717Sgdamore@opensolaris.org 214*11717Sgdamore@opensolaris.org /* 215*11717Sgdamore@opensolaris.org * Counter in window 4 for packets with a bad start-of-stream delimiter/ 216*11717Sgdamore@opensolaris.org */ 217*11717Sgdamore@opensolaris.org #define W4_BADSSD 0x0c 218*11717Sgdamore@opensolaris.org 219*11717Sgdamore@opensolaris.org /* 220*11717Sgdamore@opensolaris.org * Upper bits of 20-bit byte counters. 221*11717Sgdamore@opensolaris.org */ 222*11717Sgdamore@opensolaris.org #define W4_UBYTESOK 0x0d 223*11717Sgdamore@opensolaris.org 224*11717Sgdamore@opensolaris.org /* 225*11717Sgdamore@opensolaris.org * W6 registers, used for statistics 226*11717Sgdamore@opensolaris.org */ 227*11717Sgdamore@opensolaris.org #define W6_TX_BYTES 0x0c 228*11717Sgdamore@opensolaris.org #define W6_RX_BYTES 0x0a 229*11717Sgdamore@opensolaris.org #define W6_UPPER_FRAMES 0x09 230*11717Sgdamore@opensolaris.org #define W6_DEFER 0x08 231*11717Sgdamore@opensolaris.org #define W6_RX_FRAMES 0x07 232*11717Sgdamore@opensolaris.org #define W6_TX_FRAMES 0x06 233*11717Sgdamore@opensolaris.org #define W6_RX_OVERRUNS 0x05 234*11717Sgdamore@opensolaris.org #define W6_TX_LATE_COL 0x04 235*11717Sgdamore@opensolaris.org #define W6_SINGLE_COL 0x03 236*11717Sgdamore@opensolaris.org #define W6_MULT_COL 0x02 237*11717Sgdamore@opensolaris.org #define W6_SQE_ERRORS 0x01 238*11717Sgdamore@opensolaris.org #define W6_NO_CARRIER 0x00 239*11717Sgdamore@opensolaris.org 240*11717Sgdamore@opensolaris.org /* 241*11717Sgdamore@opensolaris.org * Receive filter bits for use with CMD_SET_FILTER. 242*11717Sgdamore@opensolaris.org */ 243*11717Sgdamore@opensolaris.org #define FILTER_UNICAST 0x01 244*11717Sgdamore@opensolaris.org #define FILTER_ALLMULTI 0x02 245*11717Sgdamore@opensolaris.org #define FILTER_ALLBCAST 0x04 246*11717Sgdamore@opensolaris.org #define FILTER_PROMISC 0x08 247*11717Sgdamore@opensolaris.org #define FILTER_MULTIHASH 0x10 /* only on 90xB */ 248*11717Sgdamore@opensolaris.org 249*11717Sgdamore@opensolaris.org /* 250*11717Sgdamore@opensolaris.org * Window 7 registers. These are different for 90x and 90xB than 251*11717Sgdamore@opensolaris.org * for the EtherLink III / Fast EtherLink cards. 252*11717Sgdamore@opensolaris.org */ 253*11717Sgdamore@opensolaris.org 254*11717Sgdamore@opensolaris.org #define W7_VLANMASK 0x00 /* 90xB only */ 255*11717Sgdamore@opensolaris.org #define W7_VLANTYPE 0x04 /* 90xB only */ 256*11717Sgdamore@opensolaris.org #define W7_TIMER 0x0a /* 90x only */ 257*11717Sgdamore@opensolaris.org #define W7_TX_STATUS 0x0b /* 90x only */ 258*11717Sgdamore@opensolaris.org #define W7_POWEREVENT 0x0c /* 90xB only */ 259*11717Sgdamore@opensolaris.org #define W7_INTSTATUS 0x0e 260*11717Sgdamore@opensolaris.org 261*11717Sgdamore@opensolaris.org /* 262*11717Sgdamore@opensolaris.org * The Internal Config register is different on 90xB cards. The 263*11717Sgdamore@opensolaris.org * different masks / shifts are defined here. 264*11717Sgdamore@opensolaris.org */ 265*11717Sgdamore@opensolaris.org 266*11717Sgdamore@opensolaris.org /* 267*11717Sgdamore@opensolaris.org * Lower 16 bits. 268*11717Sgdamore@opensolaris.org */ 269*11717Sgdamore@opensolaris.org #define CONFIG_TXLARGE 0x4000 270*11717Sgdamore@opensolaris.org #define CONFIG_TXLARGE_SHIFT 14 271*11717Sgdamore@opensolaris.org 272*11717Sgdamore@opensolaris.org #define CONFIG_RXLARGE 0x8000 273*11717Sgdamore@opensolaris.org #define CONFIG_RXLARGE_SHIFT 15 274*11717Sgdamore@opensolaris.org 275*11717Sgdamore@opensolaris.org /* 276*11717Sgdamore@opensolaris.org * Upper 16 bits. 277*11717Sgdamore@opensolaris.org */ 278*11717Sgdamore@opensolaris.org #define XCVR_SEL_10T 0x00000000U 279*11717Sgdamore@opensolaris.org #define XCVR_SEL_AUI 0x00100000U 280*11717Sgdamore@opensolaris.org #define XCVR_SEL_BNC 0x00300000U 281*11717Sgdamore@opensolaris.org #define XCVR_SEL_100TX 0x00400000U /* 3com says don't use this! */ 282*11717Sgdamore@opensolaris.org #define XCVR_SEL_100FX 0x00500000U 283*11717Sgdamore@opensolaris.org #define XCVR_SEL_MII 0x00600000U 284*11717Sgdamore@opensolaris.org #define XCVR_SEL_AUTO 0x00800000U 285*11717Sgdamore@opensolaris.org #define XCVR_SEL_MASK 0x00f00000U 286*11717Sgdamore@opensolaris.org 287*11717Sgdamore@opensolaris.org #define RAM_PARTITION_5_3 0x00000000U 288*11717Sgdamore@opensolaris.org #define RAM_PARTITION_3_1 0x00010000U 289*11717Sgdamore@opensolaris.org #define RAM_PARTITION_1_1 0x00020000U 290*11717Sgdamore@opensolaris.org #define RAM_PARTITION_3_5 0x00030000U 291*11717Sgdamore@opensolaris.org #define RAM_PARTITION_MASK 0x00030000U 292*11717Sgdamore@opensolaris.org 293*11717Sgdamore@opensolaris.org #define CONFIG_AUTOSEL 0x0100 294*11717Sgdamore@opensolaris.org #define CONFIG_AUTOSEL_SHIFT 8 295*11717Sgdamore@opensolaris.org 296*11717Sgdamore@opensolaris.org #define CONFIG_DISABLEROM 0x0200 297*11717Sgdamore@opensolaris.org #define CONFIG_DISABLEROM_SHIFT 9 298*11717Sgdamore@opensolaris.org 299*11717Sgdamore@opensolaris.org /* 300*11717Sgdamore@opensolaris.org * ID of internal PHY. 301*11717Sgdamore@opensolaris.org */ 302*11717Sgdamore@opensolaris.org 303*11717Sgdamore@opensolaris.org #define INTPHY_ID 24 304*11717Sgdamore@opensolaris.org 305*11717Sgdamore@opensolaris.org /* 306*11717Sgdamore@opensolaris.org * Fragment header as laid out in memory for DMA access. 307*11717Sgdamore@opensolaris.org */ 308*11717Sgdamore@opensolaris.org 309*11717Sgdamore@opensolaris.org #define EX_FR_LENMASK 0x00001fff /* mask for length in fr_len field */ 310*11717Sgdamore@opensolaris.org #define EX_FR_LAST 0x80000000 /* indicates last fragment */ 311*11717Sgdamore@opensolaris.org 312*11717Sgdamore@opensolaris.org /* 313*11717Sgdamore@opensolaris.org * 3Com NICs have separate structures for packet upload (receive) and 314*11717Sgdamore@opensolaris.org * download (transmit) descriptors. However, the structures for the 315*11717Sgdamore@opensolaris.org * "legacy" transmit format are nearly identical except for the fact 316*11717Sgdamore@opensolaris.org * that the third field is named differently and the bit fields are 317*11717Sgdamore@opensolaris.org * different. To maximize code reuse, we use a single type to cover 318*11717Sgdamore@opensolaris.org * both uses. Note that for receive we can arrange these in a loop, 319*11717Sgdamore@opensolaris.org * but not for transmit. Note also that for simplicity, we only use 320*11717Sgdamore@opensolaris.org * the "type 0" legacy DPD format -- the features offered by the newer 321*11717Sgdamore@opensolaris.org * type 1 format are not something we need. 322*11717Sgdamore@opensolaris.org */ 323*11717Sgdamore@opensolaris.org typedef struct ex_pd { 324*11717Sgdamore@opensolaris.org uint32_t pd_link; 325*11717Sgdamore@opensolaris.org uint32_t pd_shared; 326*11717Sgdamore@opensolaris.org uint32_t pd_addr; 327*11717Sgdamore@opensolaris.org uint32_t pd_len; 328*11717Sgdamore@opensolaris.org } ex_pd_t; 329*11717Sgdamore@opensolaris.org #define pd_fsh pd_shared 330*11717Sgdamore@opensolaris.org #define pd_status pd_shared 331*11717Sgdamore@opensolaris.org 332*11717Sgdamore@opensolaris.org /* 333*11717Sgdamore@opensolaris.org * Type 0 Download Packet Descriptor (DPD). We don't use the other 334*11717Sgdamore@opensolaris.org * type, since it isn't supported by older 90x ASICs. 335*11717Sgdamore@opensolaris.org */ 336*11717Sgdamore@opensolaris.org struct ex_dpd { 337*11717Sgdamore@opensolaris.org uint32_t dpd_nextptr; /* prt to next fragheader */ 338*11717Sgdamore@opensolaris.org uint32_t dpd_fsh; /* frame start header */ 339*11717Sgdamore@opensolaris.org uint32_t dpd_addr; 340*11717Sgdamore@opensolaris.org uint32_t dpd_len; 341*11717Sgdamore@opensolaris.org }; 342*11717Sgdamore@opensolaris.org 343*11717Sgdamore@opensolaris.org struct ex_upd { 344*11717Sgdamore@opensolaris.org uint32_t upd_nextptr; 345*11717Sgdamore@opensolaris.org uint32_t upd_pktstatus; 346*11717Sgdamore@opensolaris.org uint32_t upd_addr; /* phys addr of frag */ 347*11717Sgdamore@opensolaris.org uint32_t upd_len; /* length of frag */ 348*11717Sgdamore@opensolaris.org }; 349*11717Sgdamore@opensolaris.org 350*11717Sgdamore@opensolaris.org #define DPD_DMADDR(s, t) \ 351*11717Sgdamore@opensolaris.org ((s)->sc_dpddma + ((char *)((t)->tx_dpd) - (char *)((s)->sc_dpd))) 352*11717Sgdamore@opensolaris.org 353*11717Sgdamore@opensolaris.org /* 354*11717Sgdamore@opensolaris.org * Frame Start Header bitfields. 355*11717Sgdamore@opensolaris.org */ 356*11717Sgdamore@opensolaris.org 357*11717Sgdamore@opensolaris.org #define EX_DPD_DNIND 0x80000000 /* intr on download done */ 358*11717Sgdamore@opensolaris.org #define EX_DPD_TXIND 0x00008000 /* intr on tx done */ 359*11717Sgdamore@opensolaris.org #define EX_DPD_NOCRC 0x00002000 /* no CRC append */ 360*11717Sgdamore@opensolaris.org 361*11717Sgdamore@opensolaris.org /* 362*11717Sgdamore@opensolaris.org * Lower 12 bits are the tx length for the 90x family. The 90xB 363*11717Sgdamore@opensolaris.org * assumes that the tx length is the sum of all frame lengths, 364*11717Sgdamore@opensolaris.org * and uses the bits as below. It also defines some more bits in 365*11717Sgdamore@opensolaris.org * the upper part. 366*11717Sgdamore@opensolaris.org */ 367*11717Sgdamore@opensolaris.org #define EX_DPD_EMPTY 0x20000000 /* no data in this DPD */ 368*11717Sgdamore@opensolaris.org #define EX_DPD_UPDEFEAT 0x10000000 /* don't round tx lengths up */ 369*11717Sgdamore@opensolaris.org #define EX_DPD_UDPCKSUM 0x08000000 /* do hardware UDP checksum */ 370*11717Sgdamore@opensolaris.org #define EX_DPD_TCPCKSUM 0x04000000 /* do hardware TCP checksum */ 371*11717Sgdamore@opensolaris.org #define EX_DPD_IPCKSUM 0x02000000 /* do hardware IP checksum */ 372*11717Sgdamore@opensolaris.org #define EX_DPD_DNCMPLT 0x01000000 /* packet has been downloaded */ 373*11717Sgdamore@opensolaris.org #define EX_DPD_IDMASK 0x000003fc /* mask for packet id */ 374*11717Sgdamore@opensolaris.org #define EX_DPD_IDSHIFT 2 375*11717Sgdamore@opensolaris.org #define EX_DPD_RNDMASK 0x00000003 /* mask for rounding */ 376*11717Sgdamore@opensolaris.org /* 0 -> dword, 2 -> word, 1,3 -> none */ 377*11717Sgdamore@opensolaris.org /* 378*11717Sgdamore@opensolaris.org * upd_pktstatus bitfields. 379*11717Sgdamore@opensolaris.org * The *CKSUMERR fields are only valid if the matching *CHECKED field 380*11717Sgdamore@opensolaris.org * is set. 381*11717Sgdamore@opensolaris.org */ 382*11717Sgdamore@opensolaris.org #define EX_UPD_PKTLENMASK 0x00001fff /* 12:0 -> packet length */ 383*11717Sgdamore@opensolaris.org #define EX_UPD_ERROR 0x00004000 /* rcv error */ 384*11717Sgdamore@opensolaris.org #define EX_UPD_COMPLETE 0x00008000 /* rcv complete */ 385*11717Sgdamore@opensolaris.org #define EX_UPD_OVERRUN 0x00010000 /* rcv overrun */ 386*11717Sgdamore@opensolaris.org #define EX_UPD_RUNT 0x00020000 /* pkt < 60 bytes */ 387*11717Sgdamore@opensolaris.org #define EX_UPD_ALIGNERR 0x00040000 /* alignment error */ 388*11717Sgdamore@opensolaris.org #define EX_UPD_CRCERR 0x00080000 /* CRC error */ 389*11717Sgdamore@opensolaris.org #define EX_UPD_OVERSIZED 0x00100000 /* oversize frame */ 390*11717Sgdamore@opensolaris.org #define EX_UPD_DRIBBLEBITS 0x00800000 /* pkt had dribble bits */ 391*11717Sgdamore@opensolaris.org #define EX_UPD_OVERFLOW 0x01000000 /* insufficient space for pkt */ 392*11717Sgdamore@opensolaris.org #define EX_UPD_IPCKSUMERR 0x02000000 /* IP cksum error (90xB) */ 393*11717Sgdamore@opensolaris.org #define EX_UPD_TCPCKSUMERR 0x04000000 /* TCP cksum error (90xB) */ 394*11717Sgdamore@opensolaris.org #define EX_UPD_UDPCKSUMERR 0x08000000 /* UDP cksum error (90xB) */ 395*11717Sgdamore@opensolaris.org #define EX_UPD_IPCHECKED 0x20000000 /* IP cksum done */ 396*11717Sgdamore@opensolaris.org #define EX_UPD_TCPCHECKED 0x40000000 /* TCP cksum done */ 397*11717Sgdamore@opensolaris.org #define EX_UPD_UDPCHECKED 0x80000000 /* UDP cksum done */ 398*11717Sgdamore@opensolaris.org 399*11717Sgdamore@opensolaris.org #define EX_UPD_ERR 0x001f4000 /* Errors we check for */ 400*11717Sgdamore@opensolaris.org #define EX_UPD_ERR_VLAN 0x000f0000 /* same for 802.1q */ 401*11717Sgdamore@opensolaris.org 402*11717Sgdamore@opensolaris.org #define EX_UPD_CKSUMERR 0x0e000000 /* any IP checksum error */ 403*11717Sgdamore@opensolaris.org 404*11717Sgdamore@opensolaris.org /* 405*11717Sgdamore@opensolaris.org * EEPROM offsets. These are 16-bit word addresses. There are a lot of 406*11717Sgdamore@opensolaris.org * other things in here, but we only care about the OEM address. 407*11717Sgdamore@opensolaris.org */ 408*11717Sgdamore@opensolaris.org #define EE_3COM_ADDR_0 0x00 409*11717Sgdamore@opensolaris.org #define EE_3COM_ADDR_1 0x01 410*11717Sgdamore@opensolaris.org #define EE_3COM_ADDR_2 0x02 411*11717Sgdamore@opensolaris.org #define EE_OEM_ADDR_0 0x0a 412*11717Sgdamore@opensolaris.org #define EE_OEM_ADDR_1 0x0b 413*11717Sgdamore@opensolaris.org #define EE_OEM_ADDR_2 0x0c 414*11717Sgdamore@opensolaris.org #define EE_CAPABILITIES 0x10 415*11717Sgdamore@opensolaris.org 416*11717Sgdamore@opensolaris.org #define EX_NTX 256 417*11717Sgdamore@opensolaris.org #define EX_NRX 128 418*11717Sgdamore@opensolaris.org #define EX_BUFSZ 1536 419*11717Sgdamore@opensolaris.org 420*11717Sgdamore@opensolaris.org typedef struct ex_desc { 421*11717Sgdamore@opensolaris.org struct ex_desc *ed_next; 422*11717Sgdamore@opensolaris.org struct ex_desc *ed_prev; 423*11717Sgdamore@opensolaris.org ddi_dma_handle_t ed_dmah; 424*11717Sgdamore@opensolaris.org ddi_acc_handle_t ed_acch; 425*11717Sgdamore@opensolaris.org caddr_t ed_buf; 426*11717Sgdamore@opensolaris.org uint32_t ed_bufaddr; 427*11717Sgdamore@opensolaris.org uint32_t ed_descaddr; 428*11717Sgdamore@opensolaris.org uint32_t ed_off; /* offset of pd */ 429*11717Sgdamore@opensolaris.org ex_pd_t *ed_pd; 430*11717Sgdamore@opensolaris.org } ex_desc_t; 431*11717Sgdamore@opensolaris.org 432*11717Sgdamore@opensolaris.org typedef struct ex_ring { 433*11717Sgdamore@opensolaris.org int r_count; 434*11717Sgdamore@opensolaris.org int r_avail; 435*11717Sgdamore@opensolaris.org ddi_dma_handle_t r_dmah; 436*11717Sgdamore@opensolaris.org ddi_acc_handle_t r_acch; 437*11717Sgdamore@opensolaris.org uint32_t r_paddr; 438*11717Sgdamore@opensolaris.org ex_pd_t *r_pd; 439*11717Sgdamore@opensolaris.org ex_desc_t *r_desc; 440*11717Sgdamore@opensolaris.org ex_desc_t *r_head; 441*11717Sgdamore@opensolaris.org ex_desc_t *r_tail; 442*11717Sgdamore@opensolaris.org } ex_ring_t; 443*11717Sgdamore@opensolaris.org 444*11717Sgdamore@opensolaris.org /* 445*11717Sgdamore@opensolaris.org * Higher level linked list of upload packet descriptors. 446*11717Sgdamore@opensolaris.org */ 447*11717Sgdamore@opensolaris.org struct ex_rxdesc { 448*11717Sgdamore@opensolaris.org ddi_dma_handle_t rx_dmah; 449*11717Sgdamore@opensolaris.org ddi_acc_handle_t rx_acch; 450*11717Sgdamore@opensolaris.org caddr_t rx_buf; 451*11717Sgdamore@opensolaris.org uint32_t rx_paddr; 452*11717Sgdamore@opensolaris.org struct ex_upd *rx_upd; 453*11717Sgdamore@opensolaris.org }; 454*11717Sgdamore@opensolaris.org 455*11717Sgdamore@opensolaris.org /* 456*11717Sgdamore@opensolaris.org * Ethernet software status per interface. 457*11717Sgdamore@opensolaris.org */ 458*11717Sgdamore@opensolaris.org typedef struct ex_softc { 459*11717Sgdamore@opensolaris.org dev_info_t *ex_dip; 460*11717Sgdamore@opensolaris.org mac_handle_t ex_mach; 461*11717Sgdamore@opensolaris.org mii_handle_t ex_miih; 462*11717Sgdamore@opensolaris.org ddi_periodic_t ex_linkcheck; 463*11717Sgdamore@opensolaris.org 464*11717Sgdamore@opensolaris.org ddi_acc_handle_t ex_pcih; 465*11717Sgdamore@opensolaris.org ddi_acc_handle_t ex_regsh; 466*11717Sgdamore@opensolaris.org caddr_t ex_regsva; 467*11717Sgdamore@opensolaris.org 468*11717Sgdamore@opensolaris.org kmutex_t ex_txlock; 469*11717Sgdamore@opensolaris.org kmutex_t ex_intrlock; 470*11717Sgdamore@opensolaris.org 471*11717Sgdamore@opensolaris.org ddi_intr_handle_t ex_intrh; 472*11717Sgdamore@opensolaris.org 473*11717Sgdamore@opensolaris.org uint8_t ex_curraddr[6]; 474*11717Sgdamore@opensolaris.org uint8_t ex_factaddr[6]; 475*11717Sgdamore@opensolaris.org boolean_t ex_promisc; 476*11717Sgdamore@opensolaris.org unsigned ex_mccount; 477*11717Sgdamore@opensolaris.org 478*11717Sgdamore@opensolaris.org boolean_t ex_running; 479*11717Sgdamore@opensolaris.org boolean_t ex_suspended; 480*11717Sgdamore@opensolaris.org 481*11717Sgdamore@opensolaris.org ex_ring_t ex_rxring; 482*11717Sgdamore@opensolaris.org ex_ring_t ex_txring; 483*11717Sgdamore@opensolaris.org 484*11717Sgdamore@opensolaris.org uint32_t ex_xcvr; 485*11717Sgdamore@opensolaris.org uint32_t ex_speed; 486*11717Sgdamore@opensolaris.org link_duplex_t ex_duplex; 487*11717Sgdamore@opensolaris.org boolean_t ex_fdx; 488*11717Sgdamore@opensolaris.org link_state_t ex_link; 489*11717Sgdamore@opensolaris.org boolean_t ex_mii_active; 490*11717Sgdamore@opensolaris.org uint32_t ex_mediaopt; 491*11717Sgdamore@opensolaris.org char ex_medias[128]; 492*11717Sgdamore@opensolaris.org uint16_t ex_capab; 493*11717Sgdamore@opensolaris.org 494*11717Sgdamore@opensolaris.org /* 495*11717Sgdamore@opensolaris.org * Kstats. 496*11717Sgdamore@opensolaris.org */ 497*11717Sgdamore@opensolaris.org uint64_t ex_ipackets; 498*11717Sgdamore@opensolaris.org uint64_t ex_opackets; 499*11717Sgdamore@opensolaris.org uint64_t ex_ibytes; 500*11717Sgdamore@opensolaris.org uint64_t ex_obytes; 501*11717Sgdamore@opensolaris.org uint64_t ex_brdcstrcv; 502*11717Sgdamore@opensolaris.org uint64_t ex_multircv; 503*11717Sgdamore@opensolaris.org uint64_t ex_brdcstxmt; 504*11717Sgdamore@opensolaris.org uint64_t ex_multixmt; 505*11717Sgdamore@opensolaris.org unsigned ex_toolong; 506*11717Sgdamore@opensolaris.org unsigned ex_runt; 507*11717Sgdamore@opensolaris.org unsigned ex_oflo; 508*11717Sgdamore@opensolaris.org unsigned ex_fcs; 509*11717Sgdamore@opensolaris.org unsigned ex_align; 510*11717Sgdamore@opensolaris.org unsigned ex_allocbfail; 511*11717Sgdamore@opensolaris.org unsigned ex_txerr; 512*11717Sgdamore@opensolaris.org unsigned ex_uflo; 513*11717Sgdamore@opensolaris.org unsigned ex_jabber; 514*11717Sgdamore@opensolaris.org unsigned ex_excoll; 515*11717Sgdamore@opensolaris.org unsigned ex_sqe; 516*11717Sgdamore@opensolaris.org unsigned ex_nocarrier; 517*11717Sgdamore@opensolaris.org unsigned ex_multcol; 518*11717Sgdamore@opensolaris.org unsigned ex_defer; 519*11717Sgdamore@opensolaris.org unsigned ex_latecol; 520*11717Sgdamore@opensolaris.org unsigned ex_singlecol; 521*11717Sgdamore@opensolaris.org 522*11717Sgdamore@opensolaris.org uint_t ex_conf; /* config flags */ 523*11717Sgdamore@opensolaris.org 524*11717Sgdamore@opensolaris.org #define CONF_INTPHY 0x0001 /* has internal PHY at address 24 */ 525*11717Sgdamore@opensolaris.org #define CONF_90XB 0x0002 /* is 90xB */ 526*11717Sgdamore@opensolaris.org 527*11717Sgdamore@opensolaris.org } elxl_t; 528*11717Sgdamore@opensolaris.org 529*11717Sgdamore@opensolaris.org #define WAIT_CMD(sc) \ 530*11717Sgdamore@opensolaris.org { \ 531*11717Sgdamore@opensolaris.org int stat; \ 532*11717Sgdamore@opensolaris.org do { \ 533*11717Sgdamore@opensolaris.org stat = GET16(REG_CMD_STAT); \ 534*11717Sgdamore@opensolaris.org } while ((stat & STAT_CMD_IN_PROGRESS) && (stat != 0xffff)); \ 535*11717Sgdamore@opensolaris.org } 536*11717Sgdamore@opensolaris.org 537*11717Sgdamore@opensolaris.org #define GET8(off) \ 538*11717Sgdamore@opensolaris.org ddi_get8(sc->ex_regsh, (void *)(sc->ex_regsva + (off))) 539*11717Sgdamore@opensolaris.org #define GET16(off) \ 540*11717Sgdamore@opensolaris.org ddi_get16(sc->ex_regsh, (void *)(sc->ex_regsva + (off))) 541*11717Sgdamore@opensolaris.org #define GET32(off) \ 542*11717Sgdamore@opensolaris.org ddi_get32(sc->ex_regsh, (void *)(sc->ex_regsva + (off))) 543*11717Sgdamore@opensolaris.org #define PUT8(off, val) \ 544*11717Sgdamore@opensolaris.org ddi_put8(sc->ex_regsh, (void *)(sc->ex_regsva + (off)), val) 545*11717Sgdamore@opensolaris.org #define PUT16(off, val) \ 546*11717Sgdamore@opensolaris.org ddi_put16(sc->ex_regsh, (void *)(sc->ex_regsva + (off)), val) 547*11717Sgdamore@opensolaris.org #define PUT32(off, val) \ 548*11717Sgdamore@opensolaris.org ddi_put32(sc->ex_regsh, (void *)(sc->ex_regsva + (off)), val) 549*11717Sgdamore@opensolaris.org 550*11717Sgdamore@opensolaris.org #define SET16(off, val) PUT16(off, GET16(off) | val) 551*11717Sgdamore@opensolaris.org #define CLR16(off, val) PUT16(off, GET16(off) & ~(val)) 552*11717Sgdamore@opensolaris.org 553*11717Sgdamore@opensolaris.org #define PUT_CMD(x) PUT16(REG_CMD_STAT, (x)) 554*11717Sgdamore@opensolaris.org #define SET_WIN(x) PUT16(REG_CMD_STAT, CMD_SELECT_WINDOW | (x)) 555*11717Sgdamore@opensolaris.org 556*11717Sgdamore@opensolaris.org #define PUT_PD(ring, member, val) ddi_put32(ring->r_acch, &member, (val)) 557*11717Sgdamore@opensolaris.org #define GET_PD(ring, member) ddi_get32(ring->r_acch, &member) 558*11717Sgdamore@opensolaris.org 559*11717Sgdamore@opensolaris.org #endif /* ELXL_H */ 560