#ifndef _IC_CACVAR_H_
#define _IC_CACVAR_H_
#define CAC_MAX_CCBS 128
#define CAC_MAX_XFER (0xffff * 512)
#define CAC_SG_SIZE 32
#define CAC_SECTOR_SIZE 512
#define cac_inb(sc, port) \
bus_space_read_1((sc)->sc_iot, (sc)->sc_ioh, port)
#define cac_inw(sc, port) \
bus_space_read_2((sc)->sc_iot, (sc)->sc_ioh, port)
#define cac_inl(sc, port) \
bus_space_read_4((sc)->sc_iot, (sc)->sc_ioh, port)
#define cac_outb(sc, port, val) \
bus_space_write_1((sc)->sc_iot, (sc)->sc_ioh, port, val)
#define cac_outw(sc, port, val) \
bus_space_write_2((sc)->sc_iot, (sc)->sc_ioh, port, val)
#define cac_outl(sc, port, val) \
bus_space_write_4((sc)->sc_iot, (sc)->sc_ioh, port, val)
#define CAC_GET1(x) \
(((u_char *)&(x))[0])
#define CAC_GET2(x) \
(((u_char *)&(x))[0] | (((u_char *)&(x))[1] << 8))
#define CAC_GET4(x) \
((((u_char *)&(x))[0] | (((u_char *)&(x))[1] << 8)) | \
(((u_char *)&(x))[2] << 16 | (((u_char *)&(x))[3] << 24)))
struct cac_ccb {
struct cac_hdr ccb_hdr;
struct cac_req ccb_req;
struct cac_sgb ccb_seg[CAC_SG_SIZE];
int ccb_flags;
int ccb_datasize;
paddr_t ccb_paddr;
bus_dmamap_t ccb_dmamap_xfer;
SIMPLEQ_ENTRY(cac_ccb) ccb_chain;
struct scsi_xfer *ccb_xs;
};
#define CAC_CCB_DATA_IN 0x0001
#define CAC_CCB_DATA_OUT 0x0002
#define CAC_CCB_ACTIVE 0x0004
struct cac_softc;
struct cac_linkage {
struct cac_ccb *(*cl_completed)(struct cac_softc *);
int (*cl_fifo_full)(struct cac_softc *);
void (*cl_intr_enable)(struct cac_softc *, int);
int (*cl_intr_pending)(struct cac_softc *);
void (*cl_submit)(struct cac_softc *, struct cac_ccb *);
};
struct cac_softc {
struct device sc_dv;
bus_space_tag_t sc_iot;
bus_space_handle_t sc_ioh;
bus_dma_tag_t sc_dmat;
bus_dmamap_t sc_dmamap;
int sc_nunits;
void *sc_ih;
struct scsibus_softc *sc_scsibus;
const struct cac_linkage *sc_cl;
caddr_t sc_ccbs;
paddr_t sc_ccbs_paddr;
SIMPLEQ_HEAD(, cac_ccb) sc_ccb_free;
SIMPLEQ_HEAD(, cac_ccb) sc_ccb_queue;
struct cac_drive_info *sc_dinfos;
int (*sc_ioctl)(struct device *, u_long, caddr_t);
struct ksensor *sc_sensors;
struct ksensordev sc_sensordev;
struct mutex sc_ccb_mtx;
struct scsi_iopool sc_iopool;
};
#define CAC_LOCK(sc) splbio()
#define CAC_UNLOCK(sc, lock) splx(lock)
typedef int cac_lock_t;
int cac_init(struct cac_softc *, int);
int cac_intr(void *);
int cac_flush(struct cac_softc *);
extern const struct cac_linkage cac_l0;
#endif