#ifndef _SYS_SCSI_ADAPTERS_EMUL64VAR_H
#define _SYS_SCSI_ADAPTERS_EMUL64VAR_H
#include <sys/avl.h>
#include <sys/note.h>
#include <sys/emul64.h>
#ifdef __cplusplus
extern "C" {
#endif
#define TRUE 1
#define FALSE 0
#define UNDEFINED -1
#define CNUM(emul64) (ddi_get_instance(emul64->emul64_tran.tran_dev))
#define EMUL64_RETRY_DELAY 5
#define EMUL64_RETRIES 0
#define EMUL64_INITIAL_SOFT_SPACE 5
#define MSW(x) (int16_t)(((int32_t)x >> 16) & 0xFFFF)
#define LSW(x) (int16_t)((int32_t)x & 0xFFFF)
#define TGT(sp) (CMD2PKT(sp)->pkt_address.a_target)
#define LUN(sp) (CMD2PKT(sp)->pkt_address.a_lun)
#define HW_REV(val) (((val) >>8) & 0xff)
#define FW_REV(val) ((val) & 0xff)
#define EMUL64_NLUNS_PER_TARGET 32
#define EMUL64_DEFAULT_SCSI_OPTIONS \
SCSI_OPTIONS_PARITY | \
SCSI_OPTIONS_DR | \
SCSI_OPTIONS_SYNC | \
SCSI_OPTIONS_TAG | \
SCSI_OPTIONS_FAST | \
SCSI_OPTIONS_WIDE
#define TAG_REJECT 28
#define ACTION_CONTINUE 0
#define ACTION_RETURN 1
#define ACTION_IGNORE 2
#define EMUL64_RESET_BUS_IF_BUSY 0x01
#define EMUL64_FORCE_RESET_BUS 0x02
#define PERIOD_MASK(val) ((val) & 0xff)
#define OFFSET_MASK(val) (((val) >>8) & 0xff)
#define EMUL64_GRACE 10
#define EMUL64_TIMEOUT_DELAY(secs, delay) (secs * (1000000 / delay))
#define EMUL64_NOINTR_POLL_DELAY_TIME 1000
#define EMUL64_CHIP_RESET_BUSY_WAIT_TIME 100
#define EMUL64_RESET_WAIT 1000
#define EMUL64_SOFT_RESET_TIME 1
#define EMUL64_SS_OPEN 0x01
#define EMUL64_SS_DRAINING 0x02
#define EMUL64_SS_QUIESCED 0x04
#define EMUL64_SS_DRAIN_ERROR 0x08
#ifndef EMUL64_RESET_TARGET
#define EMUL64_RESET_TARGET (('i' << 8) | 0x03)
#endif
#define EMUL64_DEBUG if (emul64debug) emul64_i_log
#define EMUL64_DEBUG2 if (emul64debug > 1) emul64_i_log
#define REQ_TGT_LUN(tgt, lun) (((tgt) << 8) | (lun))
#define RESP_CQ_FLAGS(resp) ((resp->resp_header.cq_flags_seq) & 0xff)
#define EMUL64_NDATASEGS 4
#define EMUL64_SET_PKT_FLAGS(scsa_flags, emul64_flags) { \
emul64_flags = (scsa_flags >> 11) & 0xe; \
emul64_flags |= (scsa_flags >> 1) & 0x1; \
}
#define SHUTDOWN_THROTTLE -1
#define CLEAR_THROTTLE (EMUL64_MAX_REQUESTS -1)
#define EMUL64_GET_PKT_STATE(state) ((uint32_t)(state >> 8))
#define EMUL64_GET_PKT_STATS(stats) ((uint32_t)(stats))
#define EMUL64_STAT_NEGOTIATE 0x0080
#define EMUL64_SET_REASON(sp, reason) { \
if ((sp) && CMD2PKT(sp)->pkt_reason == CMD_CMPLT) \
CMD2PKT(sp)->pkt_reason = (reason); \
}
#define EMUL64_REQ_MUTEX(emul64) (&emul64->emul64_request_mutex)
#define EMUL64_RESP_MUTEX(emul64) (&emul64->emul64_response_mutex)
#define EMUL64_HOTPLUG_MUTEX(emul64) (&emul64->emul64_hotplug_mutex)
#define EMUL64_MUTEX_ENTER(emul64) mutex_enter(EMUL64_RESP_MUTEX(emul64)), \
mutex_enter(EMUL64_REQ_MUTEX(emul64))
#define EMUL64_MUTEX_EXIT(emul64) mutex_exit(EMUL64_RESP_MUTEX(emul64)), \
mutex_exit(EMUL64_REQ_MUTEX(emul64))
#define EMUL64_CV(emul64) (&(emul64)->emul64_cv)
#define SDEV2TRAN(sd) ((sd)->sd_address.a_hba_tran)
#define SDEV2ADDR(sd) (&((sd)->sd_address))
#define PKT2TRAN(pkt) ((pkt)->pkt_address.a_hba_tran)
#define ADDR2TRAN(ap) ((ap)->a_hba_tran)
#define TRAN2EMUL64(tran) ((struct emul64 *)(tran)->tran_hba_private)
#define SDEV2EMUL64(sd) (TRAN2EMUL64(SDEV2TRAN(sd)))
#define PKT2EMUL64(pkt) (TRAN2EMUL64(PKT2TRAN(pkt)))
#define ADDR2EMUL64(ap) (TRAN2EMUL64(ADDR2TRAN(ap)))
#define CMD2ADDR(cmd) (&CMD2PKT(cmd)->pkt_address)
#define CMD2TRAN(cmd) (CMD2PKT(cmd)->pkt_address.a_hba_tran)
#define CMD2EMUL64(cmd) (TRAN2EMUL64(CMD2TRAN(cmd)))
typedef enum emul64_rng_overlap {
O_NONE,
O_SAME,
O_SUBSET,
O_OVERLAP
} emul64_rng_overlap_t;
typedef struct blklist {
diskaddr_t bl_blkno;
uchar_t *bl_data;
avl_node_t bl_node;
} blklist_t;
typedef struct emul64_nowrite {
struct emul64_nowrite *emul64_nwnext;
emul64_range_t emul64_blocked;
} emul64_nowrite_t;
typedef struct emul64_tgt {
struct scsi_address emul64_tgt_saddr;
struct emul64_tgt *emul64_tgt_next;
emul64_nowrite_t *emul64_tgt_nowrite;
diskaddr_t emul64_tgt_sectors;
char emul64_tgt_inq[8+16];
uint_t emul64_tgt_dtype;
uint_t emul64_tgt_ncyls;
uint_t emul64_tgt_nheads;
uint_t emul64_tgt_nsect;
uint64_t emul64_list_length;
avl_tree_t emul64_tgt_data;
kmutex_t emul64_tgt_blk_lock;
krwlock_t emul64_tgt_nw_lock;
ushort_t emul64_einj_state;
ushort_t emul64_einj_sense_length;
uint_t emul64_einj_pkt_state;
uint_t emul64_einj_pkt_reason;
struct scsi_status emul64_einj_scsi_status;
uint8_t *emul64_einj_sense_data;
} emul64_tgt_t;
struct emul64_slot {
struct emul64_cmd *slot_cmd;
clock_t slot_deadline;
};
struct emul64_reset_notify_entry {
struct scsi_address *ap;
void (*callback)(caddr_t);
caddr_t arg;
struct emul64_reset_notify_entry *next;
};
struct emul64 {
scsi_hba_tran_t *emul64_tran;
dev_info_t *emul64_dip;
ddi_iblock_cookie_t emul64_iblock;
uint16_t emul64_major_rev;
uint16_t emul64_minor_rev;
timeout_id_t emul64_timeout_id;
int emul64_scsi_options;
int emul64_target_scsi_options[NTARGETS_WIDE];
int emul64_scsi_tag_age_limit;
clock_t emul64_scsi_reset_delay;
uint8_t emul64_initiator_id;
uint8_t emul64_suspended;
uint16_t emul64_cap[NTARGETS_WIDE];
int16_t emul64_synch[NTARGETS_WIDE];
struct emul64regs *emul64_reg;
kmutex_t emul64_request_mutex;
kmutex_t emul64_response_mutex;
uchar_t emul64_max_lun[NTARGETS_WIDE];
int nt_total_sectors[NTARGETS_WIDE][EMUL64_NLUNS_PER_TARGET];
struct emul64_reset_notify_entry *emul64_reset_notify_listf;
ushort_t emul64_backoff;
uint_t emul64_softstate;
int emul64_hotplug_waiting;
kcondvar_t emul64_cv;
kmutex_t emul64_hotplug_mutex;
taskq_t *emul64_taskq;
emul64_tgt_t *emul64_tgt;
};
_NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_request_mutex,
emul64::emul64_queue_space))
_NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_request_mutex,
emul64::emul64_request_in))
_NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_request_mutex,
emul64::emul64_request_out))
_NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_request_mutex,
emul64::emul64_request_ptr))
_NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_request_mutex,
emul64::emul64_mbox))
_NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_request_mutex,
emul64::emul64_slots))
_NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_response_mutex,
emul64::emul64_response_in))
_NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_response_mutex,
emul64::emul64_response_out))
_NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_response_mutex,
emul64::emul64_response_ptr))
extern void emul64_bsd_init();
extern void emul64_bsd_fini();
extern void emul64_bsd_get_props(dev_info_t *);
extern emul64_rng_overlap_t emul64_overlap(emul64_range_t *,
diskaddr_t, size_t);
extern int emul64_bsd_blkcompare(const void *, const void *);
extern int emul64debug;
extern long emul64_nowrite_count;
extern kmutex_t emul64_stats_mutex;
extern int emul64_collect_stats;
extern uint64_t emul64_taskq_max;
extern int emul64_max_task;
extern int emul64_task_nthreads;
#ifdef __cplusplus
}
#endif
#endif