#ifndef _IPRB_H
#define _IPRB_H
#define NUM_TX 128
#define NUM_RX 128
#define RX_WATCHDOG (15 * NANOSEC)
#define TX_WATCHDOG (15 * NANOSEC)
typedef struct {
ddi_acc_handle_t acch;
ddi_dma_handle_t dmah;
caddr_t vaddr;
uint32_t paddr;
} iprb_dma_t;
typedef struct iprb_mcast {
list_node_t node;
uint8_t addr[6];
} iprb_mcast_t;
typedef struct iprb {
dev_info_t *dip;
ddi_acc_handle_t pcih;
ddi_acc_handle_t regsh;
caddr_t regs;
uint16_t devid;
uint8_t revid;
mac_handle_t mach;
mii_handle_t miih;
ddi_intr_handle_t intrh;
ddi_periodic_t perh;
kmutex_t culock;
kmutex_t rulock;
uint8_t factaddr[6];
uint8_t curraddr[6];
int nmcast;
list_t mcast;
boolean_t promisc;
iprb_dma_t cmds[NUM_TX];
iprb_dma_t rxb[NUM_RX];
iprb_dma_t stats;
hrtime_t stats_time;
uint16_t cmd_head;
uint16_t cmd_last;
uint16_t cmd_tail;
uint16_t cmd_count;
uint16_t rx_index;
uint16_t rx_last;
hrtime_t rx_wdog;
hrtime_t rx_timeout;
hrtime_t tx_wdog;
hrtime_t tx_timeout;
uint16_t eeprom_bits;
boolean_t running;
boolean_t suspended;
boolean_t wantw;
boolean_t rxhangbug;
boolean_t resumebug;
boolean_t is557;
boolean_t canpause;
boolean_t canmwi;
uint64_t ipackets;
uint64_t rbytes;
uint64_t multircv;
uint64_t brdcstrcv;
uint64_t opackets;
uint64_t obytes;
uint64_t multixmt;
uint64_t brdcstxmt;
uint64_t ex_coll;
uint64_t late_coll;
uint64_t uflo;
uint64_t defer_xmt;
uint64_t one_coll;
uint64_t multi_coll;
uint64_t collisions;
uint64_t fcs_errs;
uint64_t align_errs;
uint64_t norcvbuf;
uint64_t oflo;
uint64_t runt;
uint64_t nocarrier;
uint64_t toolong;
uint64_t macxmt_errs;
uint64_t macrcv_errs;
} iprb_t;
#define REV_82557 1
#define REV_82558_A4 4
#define REV_82558_B0 5
#define REV_82559_A0 8
#define REV_82559S_A 9
#define REV_82550 12
#define REV_82550_C 13
#define REV_82551_E 14
#define REV_82551_F 15
#define REV_82551_10 16
#define CSR_STATE 0x00
#define CSR_STS 0x01
#define CSR_CMD 0x02
#define CSR_INTCTL 0x03
#define CSR_GEN_PTR 0x04
#define CSR_PORT 0x08
#define CSR_EECTL 0x0e
#define CSR_MDICTL 0x10
#define STATE_CUS 0xc0
#define STATE_CUS_IDLE 0x00
#define STATE_CUS_SUSP 0x40
#define STATE_CUS_LPQA 0x80
#define STATE_CUS_HQPA 0xc0
#define STATE_RUS 0x3c
#define STATE_RUS_IDLE 0x00
#define STATE_RUS_SUSP 0x04
#define STATE_RUS_NORES 0x08
#define STATE_RUS_READY 0x10
#define STS_FCP 0x01
#define STS_RSVD 0x02
#define STS_SWI 0x04
#define STS_MDI 0x08
#define STS_RNR 0x10
#define STS_CNA 0x20
#define STS_FR 0x40
#define STS_CX 0x80
#define CMD_CUC 0xf0
#define CUC_NOP 0x00
#define CUC_START 0x10
#define CUC_RESUME 0x20
#define CUC_STATSBASE 0x40
#define CUC_STATS 0x50
#define CUC_CUBASE 0x60
#define CUC_STATS_RST 0x70
#define CUC_SRES 0xa0
#define CMD_RUC 0x07
#define RUC_NOP 0x00
#define RUC_START 0x01
#define RUC_RESUME 0x02
#define RUC_DMAREDIR 0x03
#define RUC_ABORT 0x40
#define RUC_HDRSZ 0x50
#define RUC_RUBASE 0x60
#define INTCTL_MASK 0x01
#define INTCTL_SI 0x02
#define INTCTL_FCP 0x04
#define INTCTL_ER 0x08
#define INTCTL_RNR 0x10
#define INTCTL_CNA 0x20
#define INTCTL_FR 0x40
#define INTCTL_CX 0x80
#define PORT_SW_RESET 0x00
#define PORT_SELF_TEST 0x01
#define PORT_SEL_RESET 0x02
#define EEPROM_EEDO 0x0008
#define EEPROM_EEDI 0x0004
#define EEPROM_EECS 0x0002
#define EEPROM_EESK 0x0001
#define EEPROM_OP_RD 0x06
#define EEPROM_OP_WR 0x05
#define EEPROM_OP_WE 0x13
#define EEPROM_OP_WD 0x13
#define MDI_IE 0x20000000
#define MDI_R 0x10000000
#define MDI_OP_RD 0x08000000
#define MDI_OP_WR 0x04000000
#define MDI_PHYAD_SHIFT 21
#define MDI_REGAD_SHIFT 16
#define GET8(ip, offset) \
ddi_get8(ip->regsh, (void *)(ip->regs + (offset)))
#define GET16(ip, offset) \
ddi_get16(ip->regsh, (void *)(ip->regs + (offset)))
#define GET32(ip, offset) \
ddi_get32(ip->regsh, (void *)(ip->regs + (offset)))
#define PUT8(ip, offset, val) \
ddi_put8(ip->regsh, (void *)(ip->regs + (offset)), (val))
#define PUT16(ip, offset, val) \
ddi_put16(ip->regsh, (void *)(ip->regs + (offset)), (val))
#define PUT32(ip, offset, val) \
ddi_put32(ip->regsh, (void *)(ip->regs + (offset)), (val))
#define PUTDMA8(d, off, val) \
ddi_put8(d->acch, (void *)(d->vaddr + (off)), LE_8(val))
#define PUTDMA16(d, off, val) \
ddi_put16(d->acch, (void *)(d->vaddr + (off)), LE_16(val))
#define PUTDMA32(d, off, val) \
ddi_put32(d->acch, (void *)(d->vaddr + (off)), LE_32(val))
#define GETDMA8(d, off) \
LE_8(ddi_get8(d->acch, (void *)(d->vaddr + (off))))
#define GETDMA16(d, off) \
LE_16(ddi_get16(d->acch, (void *)(d->vaddr + (off))))
#define GETDMA32(d, off) \
LE_32(ddi_get32(d->acch, (void *)(d->vaddr + (off))))
#define SYNCDMA(d, off, size, dir) \
(void) ddi_dma_sync(d->dmah, off, size, dir)
#define CB_STS_OFFSET 0
#define CB_CMD_OFFSET 2
#define CB_LNK_OFFSET 4
#define CB_SIZE 2048
#define CB_IAS_ADR_OFFSET 8
#define CB_MCS_CNT_OFFSET 8
#define CB_MCS_ADR_OFFSET 10
#define CB_MCS_CNT_MAX ((CB_SIZE - CB_MCS_ADR_OFFSET) / 6)
#define CB_UCODE_OFFSET 8
#define CB_CONFIG_OFFSET 8
#define CB_TX_TBD_OFFSET 8
#define CB_TX_COUNT_OFFSET 12
#define CB_TX_EOF 0x8000
#define CB_TX_THRESH_OFFSET 14
#define CB_TX_NUMBER_OFFSET 15
#define CB_TX_DATA_OFFSET 16
#define PUTCB8(cb, o, v) PUTDMA8(cb, o, v)
#define PUTCB16(cb, o, v) PUTDMA16(cb, o, v)
#define PUTCB32(cb, o, v) PUTDMA32(cb, o, v)
#define PUTCBEA(cb, o, enet) \
ddi_rep_put8(cb->acch, enet, (void *)(cb->vaddr + (o)), 6, \
DDI_DEV_AUTOINCR);
#define GETCB8(cb, o) GETDMA8(cb, o)
#define GETCB16(cb, o) GETDMA16(cb, o)
#define GETCB32(cb, o) GETDMA32(cb, o)
#define SYNCCB(cb, o, s, dir) SYNCDMA(cb, o, s, dir)
#define CB_STS_OK 0x2000
#define CB_STS_C 0x8000
#define CB_CMD_NOP 0x0
#define CB_CMD_IAS 0x1
#define CB_CMD_CONFIG 0x2
#define CB_CMD_MCS 0x3
#define CB_CMD_TX 0x4
#define CB_CMD_UCODE 0x5
#define CB_CMD_SF 0x0008
#define CB_CMD_I 0x2000
#define CB_CMD_S 0x4000
#define CB_CMD_EL 0x8000
#define GETRFD16(r, o) GETDMA16(r, o)
#define PUTRFD16(r, o, v) PUTDMA16(r, o, v)
#define PUTRFD32(r, o, v) PUTDMA32(r, o, v)
#define SYNCRFD(r, o, s, dir) SYNCDMA(r, o, s, dir)
#define RFD_STS_OFFSET 0x00
#define RFD_CTL_OFFSET 0x02
#define RFD_LNK_OFFSET 0x04
#define RFD_CNT_OFFSET 0x0c
#define RFD_SIZ_OFFSET 0x0e
#define RFD_PKT_OFFSET 0x10
#define RFD_SIZE 2048
#define RFD_CTL_EL 0x8000
#define RFD_CTL_S 0x4000
#define RFD_CTL_H 0x0010
#define RFD_CTL_SF 0x0008
#define RFD_STS_C 0x8000
#define RFD_STS_OK 0x2000
#define RFD_STS_FCS 0x0800
#define RFD_STS_ALIGN 0x0400
#define RFD_STS_TOOBIG 0x0200
#define RFD_STS_DMAOFLO 0x0100
#define RFD_STS_TOOSHORT 0x0080
#define RFD_STS_802 0x0020
#define RFD_STS_RXERR 0x0010
#define RFD_STS_NOMATCH 0x0004
#define RFD_STS_IAMATCH 0x0002
#define RFD_STS_COLL_TCO 0x0001
#define RFD_STS_ERRS 0x0d90
#define RFD_CNT_EOF 0x8000
#define RFD_CNT_F 0x4000
#define STATS_TX_GOOD_OFFSET 0
#define STATS_TX_MAXCOL_OFFSET 4
#define STATS_TX_LATECOL_OFFSET 8
#define STATS_TX_UFLO_OFFSET 16
#define STATS_TX_DEFER_OFFSET 20
#define STATS_TX_ONECOL_OFFSET 24
#define STATS_TX_MULTCOL_OFFSET 28
#define STATS_TX_TOTCOL_OFFSET 32
#define STATS_RX_GOOD_OFFSET 36
#define STATS_RX_FCS_OFFSET 40
#define STATS_RX_ALIGN_OFFSET 44
#define STATS_RX_NOBUF_OFFSET 48
#define STATS_RX_OFLO_OFFSET 52
#define STATS_RX_COL_OFFSET 56
#define STATS_RX_SHORT_OFFSET 60
#define STATS_DONE_OFFSET 64
#define STATS_SIZE 68
#define STATS_DONE 0xa005
#define STATS_RST_DONE 0xa007
#define SYNCSTATS(sp, o, s, dir) SYNCDMA(sp, o, s, dir)
#define PUTSTAT(sp, o, v) PUTDMA32(sp, o, v)
#define GETSTAT(sp, o) GETDMA32(sp, o)
#endif