#ifndef _CHELSIO_CH_H
#define _CHELSIO_CH_H
#include <sys/debug.h>
#ifdef __cplusplus
extern "C" {
#endif
#define CHIDNUM (666)
#define CHNAME "chxge"
#define CHMINPSZ (0)
#define CHMAXPSZ ETHERMTU
#define CHHIWAT (32 * 1024)
#define CHLOWAT (1)
#define CH_NO_HWCKSUM 0x1
#define CH_NO_CPL 0x2
#define CH_OFFLOAD 0x4
#define CH_ARP 0x8
#define CH_TCP_MF 0x10
#define CH_UDP_MF 0x20
#define CH_UDP 0x40
#define SZ_INUSE 64
#define BAR0 1
#define BAR1 2
#define BAR2 3
#define BAR3 4
#ifdef CONFIG_CHELSIO_T1_OFFLOAD
typedef struct tbuf {
struct tbuf *tb_next;
caddr_t tb_base;
uint64_t tb_pa;
ulong_t tb_dh;
ulong_t tb_ah;
void *tb_sa;
uint32_t tb_debug;
uint32_t tb_len;
} tbuf_t;
#endif
typedef struct ch_esb {
struct ch_esb *cs_next;
struct ch_esb *cs_owner;
void *cs_sa;
ulong_t cs_dh;
ulong_t cs_ah;
caddr_t cs_buf;
uint64_t cs_pa;
uint32_t cs_index;
uint32_t cs_flag;
#ifdef FRAGMENT
ddi_dma_cookie_t cs_cookie[MAXFS];
uint_t cs_ncookie;
#endif
frtn_t cs_frtn;
} ch_esb_t;
typedef struct ch_mc {
struct ch_mc *cmc_next;
uint8_t cmc_mca[6];
} ch_mc_t;
typedef struct free_dh {
struct free_dh *dhe_next;
ulong_t dhe_dh;
} free_dh_t;
typedef struct ch_cfg {
uint32_t cksum_enabled: 1;
uint32_t burstsize_set: 1;
uint32_t burstsize: 2;
uint32_t transaction_cnt_set: 1;
uint32_t transaction_cnt: 3;
uint32_t relaxed_ordering: 1;
uint32_t enable_dvma: 1;
} ch_cfg_t;
typedef struct ch {
dev_info_t *ch_dip;
gld_mac_info_t *ch_macp;
ch_cfg_t ch_config;
uint_t ch_flags;
uint_t ch_state;
uint_t ch_blked;
kmutex_t ch_lock;
caddr_t ch_pci;
ddi_acc_handle_t ch_hpci;
off_t ch_pcisz;
caddr_t ch_bar0;
ddi_acc_handle_t ch_hbar0;
off_t ch_bar0sz;
ddi_iblock_cookie_t ch_icookp;
kmutex_t ch_intr;
uint32_t ch_maximum_mtu;
uint32_t ch_sm_buf_sz;
uint32_t ch_sm_buf_aln;
ch_esb_t *ch_small_esb_free;
ch_esb_t *ch_small_owner;
kmutex_t ch_small_esbl;
uint_t ch_sm_index;
uint32_t ch_bg_buf_sz;
uint32_t ch_bg_buf_aln;
ch_esb_t *ch_big_esb_free;
ch_esb_t *ch_big_owner;
kmutex_t ch_big_esbl;
uint_t ch_big_index;
kmutex_t ch_mc_lck;
ch_mc_t *ch_mc;
uint32_t ch_mc_cnt;
kmutex_t ch_dh_lck;
free_dh_t *ch_dh;
#if defined(__sparc)
free_dh_t *ch_vdh;
#endif
uint32_t ch_ip;
uint32_t ch_mtu;
pe_config_data_t config_data;
struct pe_port_t port[4];
pesge *sge;
struct pemc3 *mc3;
struct pemc4 *mc4;
struct pemc5 *mc5;
struct petp *tp;
struct pecspi *cspi;
struct peespi *espi;
struct peulp *ulp;
#ifdef CONFIG_CHELSIO_T1_OFFLOAD
uint32_t open_device_map;
#endif
struct adapter_params params;
uint16_t vendor_id;
uint16_t device_id;
uint16_t device_subid;
uint16_t chip_revision;
uint16_t chip_version;
uint32_t is_asic;
uint32_t config;
uint32_t ch_unit;
uint8_t init_counter;
char *ch_name;
uint32_t isr_intr;
uint32_t oerr;
uint32_t norcvbuf;
#ifdef CONFIG_CHELSIO_T1_OFFLOAD
int ch_refcnt;
void *ch_toeinst;
void (*toe_rcv)(void *, mblk_t *);
void (*toe_free)(void *, tbuf_t *);
int (*toe_tunnel)(void *, mblk_t *);
kcondvar_t *ch_tx_overflow_cv;
kmutex_t *ch_tx_overflow_mutex;
#endif
uint32_t slow_intr_mask;
#ifdef HOST_PAUSE
uint32_t txxg_cfg1;
int pause_on;
hrtime_t pause_time;
#endif
kmutex_t mac_lock;
} ch_t;
#define PEIDLE 0x00
#define PERUNNING 0x01
#define PEPROMISC 0x04
#define PEALLMULTI 0x08
#define PESUSPENDED 0x20
#define PENORES 0x40
#define PESTOP 0x80
#define PEINITDONE 0x100
#define TSO_CAPABLE 0x200
#ifdef CONFIG_CHELSIO_T1_OFFLOAD
#define TOEDEV_DEVMAP_BIT 0x1
#endif
#define DMA_STREAM 1
#define DMA_4KALN 2
#define DMA_OUT 4
#define DMA_SMALN 8
#define DMA_BGALN 16
#define CHMAXMC 64
#define CHMCALLOC (CHMAXMC * sizeof (struct ether_addr))
void *ch_alloc_dma_mem(ch_t *, int, int, int, uint64_t *, ulong_t *, ulong_t *);
void ch_free_dma_mem(ulong_t, ulong_t);
void ch_unbind_dma_handle(ch_t *, free_dh_t *);
void ch_send_up(ch_t *, mblk_t *, uint32_t, int);
void ch_gld_ok(ch_t *);
uint32_t t1_read_reg_4(ch_t *obj, uint32_t reg_val);
void t1_write_reg_4(ch_t *obj, uint32_t reg_val, uint32_t write_val);
uint32_t t1_os_pci_read_config_2(ch_t *obj, uint32_t reg, uint16_t *val);
uint32_t t1_os_pci_read_config_4(ch_t *obj, uint32_t reg, uint32_t *val);
int t1_os_pci_write_config_2(ch_t *obj, uint32_t reg, uint16_t val);
int t1_os_pci_write_config_4(ch_t *obj, uint32_t reg, uint32_t val);
uint32_t le32_to_cpu(uint32_t data);
void *t1_os_malloc_wait_zero(size_t len);
void t1_os_free(void *adr, size_t len);
int t1_num_of_ports(ch_t *obj);
int pe_os_mem_copy(ch_t *obj, void *dst, void *src, size_t len);
void *pe_os_malloc_contig_wait_zero(ch_t *, size_t, uint64_t *,
ulong_t *, ulong_t *, uint32_t);
void pe_set_mac(ch_t *sa, unsigned char *ac_enaddr);
unsigned char *pe_get_mac(ch_t *sa);
void pe_set_promiscuous(ch_t *sa, int flag);
int pe_get_stats(ch_t *sa, uint64_t *speed, uint32_t *intrcnt,
uint32_t *norcvbuf, uint32_t *oerrors, uint32_t *ierrors,
uint32_t *underrun, uint32_t *overrun, uint32_t *framing,
uint32_t *crc, uint32_t *carrier, uint32_t *collisions,
uint32_t *xcollisions, uint32_t *late, uint32_t *defer,
uint32_t *xerrs, uint32_t *rerrs, uint32_t *toolong, uint32_t *runt,
ulong_t *multixmt, ulong_t *multircv, ulong_t *brdcstxmt,
ulong_t *brdcstrcv);
int pe_attach(ch_t *);
void pe_detach(ch_t *);
void pe_init(void *);
uint_t pe_intr(ch_t *);
#ifdef CONFIG_CHELSIO_T1_OFFLOAD
#define toe_running(a) (a->open_device_map & TOEDEV_DEVMAP_BIT)
#endif
int pe_start(ch_t *sa, mblk_t *mb, uint32_t flg);
void pe_stop(ch_t *sa);
void pe_ioctl(ch_t *, queue_t *, mblk_t *);
int pe_set_mc(ch_t *, uint8_t *, int);
int tpi_read(ch_t *obj, u32 addr, u32 *value);
void CH_ALERT(const char *fmt, ...);
void CH_WARN(const char *fmt, ...);
void CH_ERR(const char *fmt, ...);
void t1_fatal_err(ch_t *chp);
#define memset(s, c, n) bzero(s, n)
extern int enable_checksum_offload;
void pe_dma_handle_init(ch_t *, int);
free_dh_t *ch_get_dma_handle(ch_t *);
void pe_free_fake_arp(void *);
void pe_mark_freelists(ch_t *chp);
#if defined(__sparc)
free_dh_t *ch_get_dvma_handle(ch_t *);
void ch_unbind_dvma_handle(ch_t *, free_dh_t *);
#endif
#define AMD_VENDOR_ID 0x1022
#define AMD_BRIDGE 0x7450
#define AMD_BRIDGE_REV 0x12
#ifdef __cplusplus
}
#endif
#endif