#ifndef ELXL_H
#define ELXL_H
#define REG_CMD_STAT 0x0e
#define CMD_GLOBAL_RESET 0x0000
#define CMD_SELECT_WINDOW 0x0800
#define CMD_BNC_ENABLE 0x1000
#define CMD_RX_DISABLE 0x1800
#define CMD_RX_ENABLE 0x2000
#define CMD_RX_RESET 0x2800
#define CMD_UP_STALL 0x3000
#define CMD_UP_UNSTALL 0x3001
#define CMD_DN_STALL 0x3002
#define CMD_DN_UNSTALL 0x3003
#define CMD_TX_ENABLE 0x4800
#define CMD_TX_DISABLE 0x5000
#define CMD_TX_RESET 0x5800
#define CMD_INT_REQ 0x6000
#define CMD_INT_ACK 0x6800
#define CMD_INT_ENABLE 0x7000
#define CMD_IND_ENABLE 0x7800
#define CMD_SET_FILTER 0x8000
#define CMD_SET_RXEARLY 0x8800
#define CMD_SET_TXSTART 0x9800
#define CMD_STATS_ENABLE 0xa800
#define CMD_STATS_DISABLE 0xb000
#define CMD_BNC_DISABLE 0xb800
#define CMD_SET_TXRECLAIM 0xc000
#define CMD_CLEAR_HASHBIT 0xc800
#define CMD_SET_HASHBIT 0xcc00
#define INT_LATCH 0x0001
#define INT_HOST_ERROR 0x0002
#define INT_TX_COMPLETE 0x0004
#define INT_RX_COMPLETE 0x0010
#define INT_RX_EARLY 0x0020
#define INT_REQUESTED 0x0040
#define INT_STATS 0x0080
#define INT_LINK 0x0100
#define INT_DN_COMPLETE 0x0200
#define INT_UP_COMPLETE 0x0400
#define STAT_CMD_IN_PROGRESS 0x1000
#define INT_WATCHED \
(INT_HOST_ERROR | INT_STATS | INT_DN_COMPLETE | INT_UP_COMPLETE)
#define REG_TXPKTID 0x18
#define REG_TIMER 0x1a
#define REG_TXSTATUS 0x1b
#define TXSTATUS_RECLAIM_ERR 0x02
#define TXSTATUS_STATUS_OFLOW 0x04
#define TXSTATUS_MAXCOLLISIONS 0x08
#define TXSTATUS_UNDERRUN 0x10
#define TXSTATUS_JABBER 0x20
#define TXSTATUS_INT_REQ 0x40
#define TXSTATUS_COMPLETE 0x80
#define TXSTATUS_ERRS 0x32
#define REG_INTSTATUSAUTO 0x1e
#define REG_DMACTRL 0x20
#define DMACTRL_DNCMPLREQ 0x00000002
#define DMACTRL_DNSTALLED 0x00000004
#define DMACTRL_UPCOMPLETE 0x00000008
#define DMACTRL_DNCOMPLETE 0x00000010
#define DMACTRL_UPRXEAREN 0x00000020
#define DMACTRL_ARNCNTDN 0x00000040
#define DMACTRL_DNINPROG 0x00000080
#define DMACTRL_CNTSPEED 0x00000100
#define DMACTRL_CNTDNMODE 0x00000200
#define DMACTRL_ALTSEQDIS 0x00010000
#define DMACTRL_DEFEATMWI 0x00100000
#define DMACTRL_DEFEATMRL 0x00200000
#define DMACTRL_UPOVERDIS 0x00400000
#define DMACTRL_TARGABORT 0x40000000
#define DMACTRL_MSTRABORT 0x80000000
#define REG_DNLISTPTR 0x24
#define REG_DNBURSTTHRESH 0x2a
#define REG_DNPRIOTHRESH 0x2c
#define REG_DNPOLL 0x2d
#define REG_TXFREETHRESH 0x2f
#define REG_UPPKTSTATUS 0x30
#define REG_FREETIMER 0x34
#define REG_COUNTDOWN 0x36
#define REG_UPLISTPTR 0x38
#define REG_UPPRIOTHRESH 0x3c
#define REG_UPPOLL 0x3d
#define REG_UPBURSTTHRESH 0x3e
#define REG_REALTIMECNT 0x40
#define REG_DNMAXBURST 0x78
#define REG_UPMAXBURST 0x7a
#define W0_MFG_ID 0x00
#define W0_EE_CMD 0x0a
#define EE_CMD_ADDR 0x001f
#define EE_CMD_WRITE_EN 0x0000
#define EE_CMD_READ 0x0080
#define EE_CMD_READ8 0x0200
#define EE_CMD_BUSY 0x8000
#define W0_EE_DATA 0x0c
#define W2_STATION_ADDRESS 0x00
#define W2_STATION_MASK 0x06
#define W2_RESET_OPTIONS 0x0c
#define W2_RESET_OPT_LEDPOLAR 0x0010
#define W2_RESET_OPT_PHYPOWER 0x4000
#define W3_INTERNAL_CONFIG 0x00
#define W3_MAX_PKT_SIZE 0x04
#define W3_MAC_CONTROL 0x06
#define MAC_CONTROL_FDX 0x0020
#define MAC_CONTROL_ALLOW_LARGE 0x0040
#define MAC_CONTROL_FLOW_EN 0x0100
#define MAC_CONTROL_VLT_EN 0x0200
#define W3_MEDIAOPT 0x08
#define MEDIAOPT_100T4 0x0001
#define MEDIAOPT_100TX 0x0002
#define MEDIAOPT_100FX 0x0004
#define MEDIAOPT_10T 0x0008
#define MEDIAOPT_BNC 0x0010
#define MEDIAOPT_AUI 0x0020
#define MEDIAOPT_MII 0x0040
#define MEDIAOPT_10FL 0x0080
#define MEDIAOPT_MASK 0x00ff
#define W4_MEDIASTAT 0xa
#define MEDIASTAT_SQE_EN 0x0008
#define MEDIASTAT_JABGUARD_EN 0x0040
#define MEDIASTAT_LINKBEAT_EN 0x0080
#define MEDIASTAT_LINKDETECT 0x0800
#define MEDIASTAT_AUI_DIS 0x8000
#define W4_PHYSMGMT 0x08
#define PHYSMGMT_CLK 0x0001
#define PHYSMGMT_DATA 0x0002
#define PHYSMGMT_DIR 0x0004
#define W4_BADSSD 0x0c
#define W4_UBYTESOK 0x0d
#define W6_TX_BYTES 0x0c
#define W6_RX_BYTES 0x0a
#define W6_UPPER_FRAMES 0x09
#define W6_DEFER 0x08
#define W6_RX_FRAMES 0x07
#define W6_TX_FRAMES 0x06
#define W6_RX_OVERRUNS 0x05
#define W6_TX_LATE_COL 0x04
#define W6_SINGLE_COL 0x03
#define W6_MULT_COL 0x02
#define W6_SQE_ERRORS 0x01
#define W6_NO_CARRIER 0x00
#define FILTER_UNICAST 0x01
#define FILTER_ALLMULTI 0x02
#define FILTER_ALLBCAST 0x04
#define FILTER_PROMISC 0x08
#define FILTER_MULTIHASH 0x10
#define W7_VLANMASK 0x00
#define W7_VLANTYPE 0x04
#define W7_TIMER 0x0a
#define W7_TX_STATUS 0x0b
#define W7_POWEREVENT 0x0c
#define W7_INTSTATUS 0x0e
#define CONFIG_TXLARGE 0x4000
#define CONFIG_TXLARGE_SHIFT 14
#define CONFIG_RXLARGE 0x8000
#define CONFIG_RXLARGE_SHIFT 15
#define XCVR_SEL_10T 0x00000000U
#define XCVR_SEL_AUI 0x00100000U
#define XCVR_SEL_BNC 0x00300000U
#define XCVR_SEL_100TX 0x00400000U
#define XCVR_SEL_100FX 0x00500000U
#define XCVR_SEL_MII 0x00600000U
#define XCVR_SEL_AUTO 0x00800000U
#define XCVR_SEL_MASK 0x00f00000U
#define RAM_PARTITION_5_3 0x00000000U
#define RAM_PARTITION_3_1 0x00010000U
#define RAM_PARTITION_1_1 0x00020000U
#define RAM_PARTITION_3_5 0x00030000U
#define RAM_PARTITION_MASK 0x00030000U
#define CONFIG_AUTOSEL 0x0100
#define CONFIG_AUTOSEL_SHIFT 8
#define CONFIG_DISABLEROM 0x0200
#define CONFIG_DISABLEROM_SHIFT 9
#define INTPHY_ID 24
#define EX_FR_LENMASK 0x00001fff
#define EX_FR_LAST 0x80000000
typedef struct ex_pd {
uint32_t pd_link;
uint32_t pd_shared;
uint32_t pd_addr;
uint32_t pd_len;
} ex_pd_t;
#define pd_fsh pd_shared
#define pd_status pd_shared
struct ex_dpd {
uint32_t dpd_nextptr;
uint32_t dpd_fsh;
uint32_t dpd_addr;
uint32_t dpd_len;
};
struct ex_upd {
uint32_t upd_nextptr;
uint32_t upd_pktstatus;
uint32_t upd_addr;
uint32_t upd_len;
};
#define DPD_DMADDR(s, t) \
((s)->sc_dpddma + ((char *)((t)->tx_dpd) - (char *)((s)->sc_dpd)))
#define EX_DPD_DNIND 0x80000000
#define EX_DPD_TXIND 0x00008000
#define EX_DPD_NOCRC 0x00002000
#define EX_DPD_EMPTY 0x20000000
#define EX_DPD_UPDEFEAT 0x10000000
#define EX_DPD_UDPCKSUM 0x08000000
#define EX_DPD_TCPCKSUM 0x04000000
#define EX_DPD_IPCKSUM 0x02000000
#define EX_DPD_DNCMPLT 0x01000000
#define EX_DPD_IDMASK 0x000003fc
#define EX_DPD_IDSHIFT 2
#define EX_DPD_RNDMASK 0x00000003
#define EX_UPD_PKTLENMASK 0x00001fff
#define EX_UPD_ERROR 0x00004000
#define EX_UPD_COMPLETE 0x00008000
#define EX_UPD_OVERRUN 0x00010000
#define EX_UPD_RUNT 0x00020000
#define EX_UPD_ALIGNERR 0x00040000
#define EX_UPD_CRCERR 0x00080000
#define EX_UPD_OVERSIZED 0x00100000
#define EX_UPD_DRIBBLEBITS 0x00800000
#define EX_UPD_OVERFLOW 0x01000000
#define EX_UPD_IPCKSUMERR 0x02000000
#define EX_UPD_TCPCKSUMERR 0x04000000
#define EX_UPD_UDPCKSUMERR 0x08000000
#define EX_UPD_IPCHECKED 0x20000000
#define EX_UPD_TCPCHECKED 0x40000000
#define EX_UPD_UDPCHECKED 0x80000000
#define EX_UPD_ERR 0x001f4000
#define EX_UPD_ERR_VLAN 0x000f0000
#define EX_UPD_CKSUMERR 0x0e000000
#define EE_3COM_ADDR_0 0x00
#define EE_3COM_ADDR_1 0x01
#define EE_3COM_ADDR_2 0x02
#define EE_OEM_ADDR_0 0x0a
#define EE_OEM_ADDR_1 0x0b
#define EE_OEM_ADDR_2 0x0c
#define EE_CAPABILITIES 0x10
#define EX_NTX 256
#define EX_NRX 128
#define EX_BUFSZ 1536
typedef struct ex_desc {
struct ex_desc *ed_next;
struct ex_desc *ed_prev;
ddi_dma_handle_t ed_dmah;
ddi_acc_handle_t ed_acch;
caddr_t ed_buf;
uint32_t ed_bufaddr;
uint32_t ed_descaddr;
uint32_t ed_off;
ex_pd_t *ed_pd;
} ex_desc_t;
typedef struct ex_ring {
int r_count;
int r_avail;
ddi_dma_handle_t r_dmah;
ddi_acc_handle_t r_acch;
uint32_t r_paddr;
ex_pd_t *r_pd;
ex_desc_t *r_desc;
ex_desc_t *r_head;
ex_desc_t *r_tail;
} ex_ring_t;
struct ex_rxdesc {
ddi_dma_handle_t rx_dmah;
ddi_acc_handle_t rx_acch;
caddr_t rx_buf;
uint32_t rx_paddr;
struct ex_upd *rx_upd;
};
typedef struct ex_softc {
dev_info_t *ex_dip;
mac_handle_t ex_mach;
mii_handle_t ex_miih;
ddi_periodic_t ex_linkcheck;
ddi_acc_handle_t ex_pcih;
ddi_acc_handle_t ex_regsh;
caddr_t ex_regsva;
kmutex_t ex_txlock;
kmutex_t ex_intrlock;
ddi_intr_handle_t ex_intrh;
uint8_t ex_curraddr[6];
uint8_t ex_factaddr[6];
boolean_t ex_promisc;
unsigned ex_mccount;
boolean_t ex_running;
boolean_t ex_suspended;
ex_ring_t ex_rxring;
ex_ring_t ex_txring;
uint32_t ex_xcvr;
uint32_t ex_speed;
link_duplex_t ex_duplex;
boolean_t ex_fdx;
link_state_t ex_link;
boolean_t ex_mii_active;
uint32_t ex_mediaopt;
char ex_medias[128];
uint16_t ex_capab;
uint64_t ex_ipackets;
uint64_t ex_opackets;
uint64_t ex_ibytes;
uint64_t ex_obytes;
uint64_t ex_brdcstrcv;
uint64_t ex_multircv;
uint64_t ex_brdcstxmt;
uint64_t ex_multixmt;
unsigned ex_toolong;
unsigned ex_runt;
unsigned ex_oflo;
unsigned ex_fcs;
unsigned ex_align;
unsigned ex_allocbfail;
unsigned ex_txerr;
unsigned ex_uflo;
unsigned ex_jabber;
unsigned ex_excoll;
unsigned ex_sqe;
unsigned ex_nocarrier;
unsigned ex_multcol;
unsigned ex_defer;
unsigned ex_latecol;
unsigned ex_singlecol;
uint_t ex_conf;
#define CONF_INTPHY 0x0001
#define CONF_90XB 0x0002
} elxl_t;
#define WAIT_CMD(sc) \
{ \
int stat; \
do { \
stat = GET16(REG_CMD_STAT); \
} while ((stat & STAT_CMD_IN_PROGRESS) && (stat != 0xffff)); \
}
#define GET8(off) \
ddi_get8(sc->ex_regsh, (void *)(sc->ex_regsva + (off)))
#define GET16(off) \
ddi_get16(sc->ex_regsh, (void *)(sc->ex_regsva + (off)))
#define GET32(off) \
ddi_get32(sc->ex_regsh, (void *)(sc->ex_regsva + (off)))
#define PUT8(off, val) \
ddi_put8(sc->ex_regsh, (void *)(sc->ex_regsva + (off)), val)
#define PUT16(off, val) \
ddi_put16(sc->ex_regsh, (void *)(sc->ex_regsva + (off)), val)
#define PUT32(off, val) \
ddi_put32(sc->ex_regsh, (void *)(sc->ex_regsva + (off)), val)
#define SET16(off, val) PUT16(off, GET16(off) | val)
#define CLR16(off, val) PUT16(off, GET16(off) & ~(val))
#define PUT_CMD(x) PUT16(REG_CMD_STAT, (x))
#define SET_WIN(x) PUT16(REG_CMD_STAT, CMD_SELECT_WINDOW | (x))
#define PUT_PD(ring, member, val) ddi_put32(ring->r_acch, &member, (val))
#define GET_PD(ring, member) ddi_get32(ring->r_acch, &member)
#endif