#ifndef _MXFEIMPL_H
#define _MXFEIMPL_H
#ifdef _KERNEL
#include <sys/mac_provider.h>
#define MXFE_TXRING 128
#define MXFE_RXRING 256
#define MXFE_TXRECLAIM 32
#define MXFE_TXRESCHED 120
#define MXFE_LINKTIMER 5000
#define MXFE_HEADROOM 34
#define MXFE_BUFSZ (1664)
#define MXFE_SETUP_LEN 192
typedef struct mxfe mxfe_t;
typedef struct mxfe_card mxfe_card_t;
typedef struct mxfe_rxbuf mxfe_rxbuf_t;
typedef struct mxfe_txbuf mxfe_txbuf_t;
typedef struct mxfe_desc mxfe_desc_t;
struct mxfe_card {
uint16_t card_venid;
uint16_t card_devid;
uint16_t card_revid;
uint16_t card_revmask;
char *card_cardname;
unsigned card_model;
};
struct mxfe {
dev_info_t *mxfe_dip;
mac_handle_t mxfe_mh;
mxfe_card_t *mxfe_cardp;
ushort_t mxfe_cachesize;
ushort_t mxfe_sromwidth;
int mxfe_flags;
kmutex_t mxfe_xmtlock;
kmutex_t mxfe_intrlock;
ddi_iblock_cookie_t mxfe_icookie;
uint32_t *mxfe_regs;
ddi_acc_handle_t mxfe_regshandle;
int mxfe_rxhead;
struct mxfe_desc *mxfe_rxdescp;
ddi_dma_handle_t mxfe_rxdesc_dmah;
ddi_acc_handle_t mxfe_rxdesc_acch;
uint32_t mxfe_rxdesc_paddr;
struct mxfe_rxbuf **mxfe_rxbufs;
int mxfe_txreclaim;
int mxfe_txsend;
int mxfe_txavail;
struct mxfe_desc *mxfe_txdescp;
ddi_dma_handle_t mxfe_txdesc_dmah;
ddi_acc_handle_t mxfe_txdesc_acch;
uint32_t mxfe_txdesc_paddr;
struct mxfe_txbuf **mxfe_txbufs;
hrtime_t mxfe_txstall_time;
boolean_t mxfe_wantw;
uchar_t mxfe_curraddr[ETHERADDRL];
boolean_t mxfe_promisc;
int mxfe_nwaystate;
uint64_t mxfe_lastifspeed;
link_duplex_t mxfe_lastduplex;
link_state_t mxfe_lastlinkup;
link_state_t mxfe_linkup;
link_duplex_t mxfe_duplex;
uint64_t mxfe_ifspeed;
boolean_t mxfe_resetting;
int mxfe_phyaddr;
int mxfe_phyid;
int mxfe_phyinuse;
uint8_t mxfe_adv_aneg;
uint8_t mxfe_adv_100T4;
uint8_t mxfe_adv_100fdx;
uint8_t mxfe_adv_100hdx;
uint8_t mxfe_adv_10fdx;
uint8_t mxfe_adv_10hdx;
uint8_t mxfe_cap_aneg;
uint8_t mxfe_cap_100T4;
uint8_t mxfe_cap_100fdx;
uint8_t mxfe_cap_100hdx;
uint8_t mxfe_cap_10fdx;
uint8_t mxfe_cap_10hdx;
int mxfe_forcephy;
uint16_t mxfe_bmsr;
uint16_t mxfe_anlpar;
uint16_t mxfe_aner;
kstat_t *mxfe_intrstat;
uint64_t mxfe_ipackets;
uint64_t mxfe_opackets;
uint64_t mxfe_rbytes;
uint64_t mxfe_obytes;
uint64_t mxfe_brdcstrcv;
uint64_t mxfe_multircv;
uint64_t mxfe_brdcstxmt;
uint64_t mxfe_multixmt;
unsigned mxfe_norcvbuf;
unsigned mxfe_noxmtbuf;
unsigned mxfe_errrcv;
unsigned mxfe_errxmt;
unsigned mxfe_missed;
unsigned mxfe_underflow;
unsigned mxfe_overflow;
unsigned mxfe_align_errors;
unsigned mxfe_fcs_errors;
unsigned mxfe_carrier_errors;
unsigned mxfe_collisions;
unsigned mxfe_ex_collisions;
unsigned mxfe_tx_late_collisions;
unsigned mxfe_defer_xmts;
unsigned mxfe_first_collisions;
unsigned mxfe_multi_collisions;
unsigned mxfe_sqe_errors;
unsigned mxfe_macxmt_errors;
unsigned mxfe_macrcv_errors;
unsigned mxfe_toolong_errors;
unsigned mxfe_runt;
unsigned mxfe_jabber;
};
struct mxfe_rxbuf {
caddr_t rxb_buf;
ddi_dma_handle_t rxb_dmah;
ddi_acc_handle_t rxb_acch;
uint32_t rxb_paddr;
};
struct mxfe_txbuf {
caddr_t txb_buf;
uint32_t txb_paddr;
ddi_dma_handle_t txb_dmah;
ddi_acc_handle_t txb_acch;
};
struct mxfe_desc {
unsigned desc_status;
unsigned desc_control;
unsigned desc_buffer1;
unsigned desc_buffer2;
};
#define PUTTXDESC(mxfep, member, val) \
ddi_put32(mxfep->mxfe_txdesc_acch, &member, val)
#define PUTRXDESC(mxfep, member, val) \
ddi_put32(mxfep->mxfe_rxdesc_acch, &member, val)
#define GETTXDESC(mxfep, member) \
ddi_get32(mxfep->mxfe_txdesc_acch, &member)
#define GETRXDESC(mxfep, member) \
ddi_get32(mxfep->mxfe_rxdesc_acch, &member)
#define RXSTAT_OWN 0x80000000U
#define RXSTAT_RXLEN 0x3FFF0000U
#define RXSTAT_RXERR 0x00008000U
#define RXSTAT_DESCERR 0x00004000U
#define RXSTAT_RXTYPE 0x00003000U
#define RXSTAT_RUNT 0x00000800U
#define RXSTAT_GROUP 0x00000400U
#define RXSTAT_FIRST 0x00000200U
#define RXSTAT_LAST 0x00000100U
#define RXSTAT_TOOLONG 0x00000080U
#define RXSTAT_COLLSEEN 0x00000040U
#define RXSTAT_FRTYPE 0x00000020U
#define RXSTAT_WATCHDOG 0x00000010U
#define RXSTAT_DRIBBLE 0x00000004U
#define RXSTAT_CRCERR 0x00000002U
#define RXSTAT_OFLOW 0x00000001U
#define RXSTAT_ERRS (RXSTAT_DESCERR | RXSTAT_RUNT | \
RXSTAT_COLLSEEN | RXSTAT_DRIBBLE | \
RXSTAT_CRCERR | RXSTAT_OFLOW)
#define RXLENGTH(x) ((x & RXSTAT_RXLEN) >> 16)
#define RXCTL_ENDRING 0x02000000U
#define RXCTL_CHAIN 0x01000000U
#define RXCTL_BUFLEN2 0x003FF800U
#define RXCTL_BUFLEN1 0x000007FFU
#define TXSTAT_OWN 0x80000000U
#define TXSTAT_URCNT 0x00C00000U
#define TXSTAT_TXERR 0x00008000U
#define TXSTAT_JABBER 0x00004000U
#define TXSTAT_CARRLOST 0x00000800U
#define TXSTAT_NOCARR 0x00000400U
#define TXSTAT_LATECOL 0x00000200U
#define TXSTAT_EXCOLL 0x00000100U
#define TXSTAT_SQE 0x00000080U
#define TXSTAT_COLLCNT 0x00000078U
#define TXSTAT_UFLOW 0x00000002U
#define TXSTAT_DEFER 0x00000001U
#define TXCOLLCNT(x) ((x & TXSTAT_COLLCNT) >> 3)
#define TXUFLOWCNT(x) ((x & TXSTAT_URCNT) >> 22)
#define TXCTL_INTCMPLTE 0x80000000U
#define TXCTL_LAST 0x40000000U
#define TXCTL_FIRST 0x20000000U
#define TXCTL_NOCRC 0x04000000U
#define TXCTL_SETUP 0x08000000U
#define TXCTL_ENDRING 0x02000000U
#define TXCTL_CHAIN 0x01000000U
#define TXCTL_NOPAD 0x00800000U
#define TXCTL_HASHPERF 0x00400000U
#define TXCTL_BUFLEN2 0x003FF800U
#define TXCTL_BUFLEN1 0x000007FFU
#define MXFE_RUNNING 0x1
#define MXFE_SUSPENDED 0x2
#define MXFE_SYMBOL 0x8
#define MXFE_NOLINK 0x0
#define MXFE_NWAYCHECK 0x2
#define MXFE_NWAYRENEG 0x3
#define MXFE_GOODLINK 0x4
#define MXFE_MODEL(mxfep) ((mxfep)->mxfe_cardp->card_model)
#define MXFE_98715 0x1
#define MXFE_98715A 0x2
#define MXFE_98715AEC 0x3
#define MXFE_98715B 0x4
#define MXFE_98725 0x5
#define MXFE_98713 0x6
#define MXFE_98713A 0x7
#define MXFE_PNICII 0x8
#define GETCSR(mxfep, reg) \
ddi_get32(mxfep->mxfe_regshandle, mxfep->mxfe_regs + (reg/4))
#define PUTCSR(mxfep, reg, val) \
ddi_put32(mxfep->mxfe_regshandle, mxfep->mxfe_regs + (reg/4), val)
#define SETBIT(mxfep, reg, val) \
PUTCSR(mxfep, reg, GETCSR(mxfep, reg) | (val))
#define CLRBIT(mxfep, reg, val) \
PUTCSR(mxfep, reg, GETCSR(mxfep, reg) & ~(val))
#define SYNCTXDESC(mxfep, index, who) \
(void) ddi_dma_sync(mxfep->mxfe_txdesc_dmah, \
(index * sizeof (mxfe_desc_t)), sizeof (mxfe_desc_t), who)
#define SYNCTXBUF(txb, len, who) \
(void) (ddi_dma_sync(txb->txb_dmah, 0, len, who))
#define SYNCRXDESC(mxfep, index, who) \
(void) ddi_dma_sync(mxfep->mxfe_rxdesc_dmah, \
(index * sizeof (mxfe_desc_t)), sizeof (mxfe_desc_t), who)
#define SYNCRXBUF(rxb, len, who) \
(void) (ddi_dma_sync(rxb->rxb_dmah, 0, len, who))
#define DWARN 0x0001
#define DINTR 0x0002
#define DWSRV 0x0004
#define DMACID 0x0008
#define DDLPI 0x0010
#define DPHY 0x0020
#define DPCI 0x0040
#define DCHATTY 0x0080
#define DDMA 0x0100
#define DLINK 0x0200
#define DSROM 0x0400
#define DRECV 0x0800
#define DXMIT 0x1000
#ifdef DEBUG
#define DBG(lvl, ...) mxfe_dprintf(mxfep, __func__, lvl, __VA_ARGS__);
#else
#define DBG(lvl, ...)
#endif
#endif
#endif