#ifndef _SYS_ERI_H
#define _SYS_ERI_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _KERNEL
typedef struct param_s {
uint32_t param_min;
uint32_t param_max;
uint32_t param_val;
char *param_name;
} param_t;
#define ERI_PARAM_CNT 51
typedef enum {
MIF_POLL_STOP,
MIF_POLL_START
} soft_mif_enable_t;
typedef struct stats {
uint64_t ipackets64;
uint64_t iipackets64;
uint32_t ierrors;
uint64_t opackets64;
uint64_t oerrors;
uint32_t collisions;
uint64_t ifspeed;
uint32_t txmac_urun;
uint32_t txmac_maxpkt_err;
uint32_t excessive_coll;
uint32_t late_coll;
uint32_t first_coll;
uint32_t defer_timer_exp;
uint32_t peak_attempt_cnt;
uint32_t tx_hang;
uint32_t rx_corr;
uint32_t no_free_rx_desc;
uint32_t rx_overflow;
uint32_t rx_ovrflpkts;
uint32_t rx_hang;
uint32_t rx_align_err;
uint32_t rx_crc_err;
uint32_t rx_length_err;
uint32_t rx_code_viol_err;
uint32_t pause_rxcount;
uint32_t pause_oncount;
uint32_t pause_offcount;
uint32_t pause_time_count;
uint32_t pausing;
uint32_t inits;
uint32_t rx_inits;
uint32_t tx_inits;
uint32_t tnocar;
uint32_t jab;
uint32_t notmds;
uint32_t nocanput;
uint32_t allocbfail;
uint32_t drop;
uint32_t rx_corrupted;
uint32_t rx_bad_pkts;
uint32_t rx_runt;
uint32_t rx_toolong_pkts;
uint32_t rxtag_err;
uint32_t parity_error;
uint32_t pci_error_int;
uint32_t unknown_fatal;
uint32_t pci_data_parity_err;
uint32_t pci_signal_target_abort;
uint32_t pci_rcvd_target_abort;
uint32_t pci_rcvd_master_abort;
uint32_t pci_signal_system_err;
uint32_t pci_det_parity_err;
uint64_t rbytes64;
uint64_t obytes64;
uint32_t multircv;
uint32_t multixmt;
uint32_t brdcstrcv;
uint32_t brdcstxmt;
uint32_t norcvbuf;
uint32_t noxmtbuf;
uint32_t pmcap;
uint32_t link_up;
uint32_t link_duplex;
} stats_t;
#define HSTAT(erip, x) erip->stats.x++;
#define HSTATN(erip, x, n) erip->stats.x += n;
#define RX_BCOPY_MAX 704
#define NMCFILTER_BITS 256
#define ERI_RPENDING (erip->rpending)
#define ERI_TPENDING (erip->tpending)
#define NEXTRMD(erip, rmdp) (((rmdp) + 1) == (erip)->rmdlimp ? \
(erip)->rmdp : ((rmdp) + 1))
#define NEXTTMD(erip, tmdp) (((tmdp) + 1) == (erip)->eri_tmdlimp ? \
(erip)->eri_tmdp : ((tmdp) + 1))
#define PREVTMD(erip, tmdp) ((tmdp) == (erip)->eri_tmdp ? \
((erip)->eri_tmdlimp - 1) : ((tmdp) - 1))
#define MSECOND(t) t
#define SECOND(t) t*1000
#define ERI_TICKS MSECOND(100)
#define ERI_NTRIES_LOW (SECOND(5)/ERI_TICKS)
#define ERI_NTRIES_HIGH (SECOND(5)/ERI_TICKS)
#define ERI_NTRIES_LOW_10 (SECOND(2)/ERI_TICKS)
#define ERI_LINKDOWN_TIME (SECOND(2)/ERI_TICKS)
#define ERI_ERIREV_1_0 0x1
#define ERI_LINKCHECK_TIMER SECOND(3)
#define ERI_P_FAULT_TIMER SECOND(3)
#define ERI_CHECK_HANG_TIMER MSECOND(400)
#define ERI_RMAC_HANG_WORKAROUND
#define ERI_AUTO_BRINGUP 0
#define ERI_FORCED_BRINGUP 1
#define NO_XCVR 2
#define INTERNAL_XCVR 0
#define EXTERNAL_XCVR 1
#define ERI_LINKDOWN_OK 0
#define ERI_FORCE_LINKDOWN 1
#define ERI_LINKDOWN_STARTED 2
#define ERI_LINKDOWN_DONE 3
#define ERI_HWAN_TRY 0
#define ERI_HWAN_INPROGRESS 1
#define ERI_HWAN_SUCCESFUL 2
#define ERI_HWAN_FAILED 3
#define RESET_TO_BE_ISSUED 0
#define RESET_ISSUED 1
#define ISOLATE_ISSUED 2
#define ERI_SERIAL_LINK_NOT_PRESENT 0
#define ERI_SERIAL_LINK_PRESENT 1
#define ERI_NO_SHARED_PIN_PHY 0
#define ERI_MII_PRESENT 1
#define ERI_SERDES_PRESENT 2
#define ERI_DEFAULT_SERIAL_LINK 0
#define ERI_DEFAULT_MII_LINK 1
#define ERI_AUTO_PHY 0
#define ERI_USE_SERIAL_LINK 1
#define ERI_USE_NON_SERIAL_LINK 2
#define ERI_START_LINK_BRINGUP 0
#define ERI_SERIAL_LINK_BRINGUP 1
#define ERI_SERDES_LINK_BRINGUP 2
#define ERI_MII_LINK_BRINGUP 3
#define ERI_DEFAULT_LINK_BRINGUP 4
#define ERI_ALT_LINK_BRINGUP 5
struct erisave {
ulong_t starts;
uint64_t reclaim_opackets;
};
struct eri {
mac_handle_t mh;
dev_info_t *dip;
uint_t instance;
int pci_mode;
int cpci_mode;
int low_power_mode;
int asic_rev;
int board_rev;
int burstsizes;
int pagesize;
uint32_t rxfifo_size;
int rpending;
int tpending;
int tx_cur_cnt;
uint_t multi_refcnt;
boolean_t promisc;
int mifpoll_enable;
int frame_enable;
int lance_mode_enable;
int ngu_enable;
int link_pulse_disabled;
int xmit_dma_mode;
int rcv_dma_mode;
uint8_t ouraddr[ETHERADDRL];
uint32_t flags;
uint32_t alloc_flag;
boolean_t wantw;
uint16_t ladrf[NMCFILTER_BITS/16];
uint16_t ladrf_refcnt[NMCFILTER_BITS];
volatile struct global *globregp;
volatile struct etx *etxregp;
volatile struct erx *erxregp;
volatile struct bmac *bmacregp;
volatile struct mif *mifregp;
volatile struct pcslink *pcsregp;
uint32_t *sw_reset_reg;
uint32_t rx_kick;
uint32_t rx_completion;
#ifdef RCV_OVRFLOW_CORRUPTION_BUG
uint32_t rx_ovrflpks;
#endif
uint32_t tx_kick;
uint32_t tx_completion;
struct rmd *rmdp;
struct rmd *rmdlimp;
struct eri_tmd *eri_tmdp;
struct eri_tmd *eri_tmdlimp;
volatile struct rmd *rnextp;
volatile struct rmd *rlastp;
volatile struct eri_tmd *tnextp;
volatile struct eri_tmd *tcurp;
ddi_dma_handle_t eri_dvmarh;
ddi_dma_handle_t ndmarh[ERI_RMDMAX];
ddi_dma_handle_t tbuf_handle;
ddi_acc_handle_t tbuf_acch;
caddr_t tbuf_kaddr;
uint32_t tbuf_ioaddr;
int rcv_handle_cnt;
int rx_reset_issued;
int tx_reset_issued;
int rxmac_reset_issued;
int txmac_reset_issued;
int global_reset_issued;
uint32_t rpending_mask;
int rmdmax_mask;
int init_macregs;
int phyad;
int xcvr;
int openloop_autoneg;
uint16_t mif_config;
uint16_t mif_mask;
uint32_t tx_config;
uint32_t vendor_id;
uint16_t device_id;
uint16_t device_rev;
uint32_t phy_address;
uint32_t xcvr_status;
uint32_t xcvr_state;
uint32_t bringup_mode;
uint32_t speed;
uint32_t duplex;
uint32_t capability;
uint16_t mii_control;
uint16_t mii_status;
uint16_t mii_anar;
uint16_t mii_lpanar;
int autoneg;
int force_linkdown;
int mode;
int linkup_10;
int pace_count;
int nlasttries;
int ntries;
int delay;
int linkup_attempts;
int polling_on;
int mifpoll_data;
int mifpoll_flag;
int pauseTX;
int pauseRX;
int macfdx;
timeout_id_t timerid;
int linkup_cnt;
uint16_t aner;
int linkup;
int linkup_state;
int linkup_changed;
int linkcheck;
caddr_t g_nd;
ddi_device_acc_attr_t dev_attr;
ddi_iblock_cookie_t cookie;
ddi_acc_handle_t globregh;
ddi_acc_handle_t etxregh;
ddi_acc_handle_t erxregh;
ddi_acc_handle_t bmacregh;
ddi_acc_handle_t mifregh;
ddi_acc_handle_t pcsregh;
ddi_acc_handle_t sw_reset_regh;
ddi_dma_cookie_t md_c;
ddi_acc_handle_t mdm_h;
ddi_dma_handle_t md_h;
ddi_acc_handle_t pci_config_handle;
ddi_dma_handle_t iopbhandle;
uintptr_t iopbkbase;
uintptr_t iopbiobase;
kstat_t *ksp;
kmutex_t xmitlock;
kmutex_t xcvrlock;
kmutex_t intrlock;
kmutex_t linklock;
mblk_t *tmblkp[ERI_TMDMAX];
mblk_t *rmblkp[ERI_RMDMAX];
param_t param_arr[ERI_PARAM_CNT];
struct stats stats;
uint32_t starts;
uint32_t txhung;
struct erisave erisave;
uint64_t ifspeed_old;
#ifdef ERI_RMAC_HANG_WORKAROUND
uint32_t check_rmac_hang;
uint32_t check2_rmac_hang;
uint32_t rxfifo_wr_ptr;
uint32_t rxfifo_rd_ptr;
uint32_t rxfifo_wr_ptr_c;
uint32_t rxfifo_rd_ptr_c;
#endif
uint32_t tx_int_me;
};
#define LADRF_MASK(bit) (1 << ((bit) % 16))
#define LADRF_WORD(erip, bit) erip->ladrf[(15 - ((bit) / 16))]
#define LADRF_SET(erip, bit) (LADRF_WORD(erip, bit) |= LADRF_MASK(bit))
#define LADRF_CLR(erip, bit) (LADRF_WORD(erip, bit) &= ~LADRF_MASK(bit))
#define ERIIOC ('G' << 8)
#define ERI_SET_LOOP_MODE (ERIIOC|1)
#define ERI_GET_LOOP_MODE (ERIIOC|2)
#define ERI_GET_LOOP_IFCNT (ERIIOC|4)
#define ERI_LOOPBACK_OFF 0
#define ERI_MAC_LOOPBACK_ON 1
#define ERI_PCS_LOOPBACK_ON 2
#define ERI_SER_LOOPBACK_ON 4
typedef struct {
int loopback;
} loopback_t;
#define ERI_UNKOWN 0x00
#define ERI_RUNNING 0x01
#define ERI_STARTED 0x02
#define ERI_SUSPENDED 0x08
#define ERI_INITIALIZED 0x10
#define ERI_NOTIMEOUTS 0x20
#define ERI_TXINIT 0x40
#define ERI_RXINIT 0x80
#define ERI_MACLOOPBACK 0x100
#define ERI_SERLOOPBACK 0x200
#define ERI_DLPI_LINKUP 0x400
#define ERI_FACTADDR_PRESENT 0x01
#define ERI_FACTADDR_USE 0x02
struct erikstat {
struct kstat_named erik_inits;
struct kstat_named erik_rx_inits;
struct kstat_named erik_tx_inits;
struct kstat_named erik_allocbfail;
struct kstat_named erik_drop;
struct kstat_named erik_pause_rxcount;
struct kstat_named erik_pause_oncount;
struct kstat_named erik_pause_offcount;
struct kstat_named erik_pause_time_count;
struct kstat_named erik_txmac_maxpkt_err;
struct kstat_named erik_defer_timer_exp;
struct kstat_named erik_peak_attempt_cnt;
struct kstat_named erik_jab;
struct kstat_named erik_notmds;
struct kstat_named erik_tx_hang;
struct kstat_named erik_no_free_rx_desc;
struct kstat_named erik_rx_hang;
struct kstat_named erik_rx_length_err;
struct kstat_named erik_rx_code_viol_err;
struct kstat_named erik_rx_bad_pkts;
struct kstat_named erik_rxtag_err;
struct kstat_named erik_parity_error;
struct kstat_named erik_pci_error_int;
struct kstat_named erik_unknown_fatal;
struct kstat_named erik_pci_data_parity_err;
struct kstat_named erik_pci_signal_target_abort;
struct kstat_named erik_pci_rcvd_target_abort;
struct kstat_named erik_pci_rcvd_master_abort;
struct kstat_named erik_pci_signal_system_err;
struct kstat_named erik_pci_det_parity_err;
struct kstat_named erik_pmcap;
};
#define ERI_DRAINTIME (400000)
#define ROUNDUP(a, n) (((a) + ((n) - 1)) & ~((n) - 1))
#define ROUNDUP2(a, n) (uchar_t *)((((uintptr_t)(a)) + ((n) - 1)) & ~((n) - 1))
#define ERI_BURSTSIZE (128)
#define ERI_BURSTMASK (ERIBURSTSIZE - 1)
#define ERI_BUFSIZE (1728)
#define ERI_HEADROOM (34)
#define ERI_FSTBYTE_OFFSET 2
#define ERI_CKSUM_OFFSET 14
#define ERI_PMCAP_NONE 0
#define ERI_PMCAP_4MHZ 4
#endif
#ifdef __cplusplus
}
#endif
#endif