#ifndef _SYS_SCSI_TARGETS_SGENDEF_H
#define _SYS_SCSI_TARGETS_SGENDEF_H
#include <sys/types.h>
#include <sys/kstat.h>
#include <sys/condvar.h>
#include <sys/mutex.h>
#include <sys/buf.h>
#include <sys/scsi/scsi.h>
#ifdef __cplusplus
extern "C" {
#endif
#define SGEN_IOC (('S' << 16) | ('G' << 8))
#define SGEN_IOC_READY (SGEN_IOC | 0x01)
#define SGEN_IOC_DIAG (SGEN_IOC | 0x02)
#if defined(_KERNEL)
#define SGEN_DIAG1 ((1 << 8) | CE_CONT)
#define SGEN_DIAG2 ((2 << 8) | CE_CONT)
#define SGEN_DIAG3 ((3 << 8) | CE_CONT)
struct sgen_errstats {
kstat_named_t sgen_trans_err;
kstat_named_t sgen_restart;
kstat_named_t sgen_incmp_err;
kstat_named_t sgen_autosen_rcv;
kstat_named_t sgen_autosen_bad;
kstat_named_t sgen_sense_rcv;
kstat_named_t sgen_sense_bad;
kstat_named_t sgen_recov_err;
kstat_named_t sgen_nosen_err;
kstat_named_t sgen_unrecov_err;
};
typedef struct sgen_state {
struct scsi_device *sgen_scsidev;
struct uscsi_cmd *sgen_ucmd;
struct buf *sgen_cmdbuf;
struct scsi_pkt *sgen_cmdpkt;
kcondvar_t sgen_cmdbuf_cv;
int sgen_flags;
struct scsi_pkt *sgen_rqspkt;
struct buf *sgen_rqsbuf;
char *sgen_rqs_sen;
int sgen_arq_enabled;
int sgen_diag;
timeout_id_t sgen_restart_timeid;
kstat_t *sgen_kstats;
} sgen_state_t;
#define sgen_mutex sgen_scsidev->sd_mutex
#define sgen_devinfo sgen_scsidev->sd_dev
#define sgen_scsiaddr sgen_scsidev->sd_address
#define sgen_sense sgen_scsidev->sd_sense
#define SGEN_FL_OPEN 0x01
#define SGEN_FL_SUSP 0x02
#define SGEN_FL_BUSY 0x04
#define SGEN_FL_EXCL 0x08
#define SGEN_SET_OPEN(stp) \
(((sgen_state_t *)(stp))->sgen_flags |= SGEN_FL_OPEN)
#define SGEN_CLR_OPEN(stp) \
(((sgen_state_t *)(stp))->sgen_flags &= ~SGEN_FL_OPEN)
#define SGEN_IS_OPEN(stp) \
((((sgen_state_t *)(stp))->sgen_flags & SGEN_FL_OPEN) == SGEN_FL_OPEN)
#define SGEN_SET_SUSP(stp) \
(((sgen_state_t *)(stp))->sgen_flags |= SGEN_FL_SUSP)
#define SGEN_CLR_SUSP(stp) \
(((sgen_state_t *)(stp))->sgen_flags &= ~SGEN_FL_SUSP)
#define SGEN_IS_SUSP(stp) \
((((sgen_state_t *)(stp))->sgen_flags & SGEN_FL_SUSP) == SGEN_FL_SUSP)
#define SGEN_SET_BUSY(stp) \
(((sgen_state_t *)(stp))->sgen_flags |= SGEN_FL_BUSY)
#define SGEN_CLR_BUSY(stp) \
(((sgen_state_t *)(stp))->sgen_flags &= ~SGEN_FL_BUSY)
#define SGEN_IS_BUSY(stp) \
((((sgen_state_t *)(stp))->sgen_flags & SGEN_FL_BUSY) == SGEN_FL_BUSY)
#define SGEN_SET_EXCL(stp) \
(((sgen_state_t *)(stp))->sgen_flags |= SGEN_FL_EXCL)
#define SGEN_CLR_EXCL(stp) \
(((sgen_state_t *)(stp))->sgen_flags &= ~SGEN_FL_EXCL)
#define SGEN_IS_EXCL(stp) \
((((sgen_state_t *)(stp))->sgen_flags & SGEN_FL_EXCL) == SGEN_FL_EXCL)
typedef struct sgen_inq_node {
char *node_vendor;
char *node_product;
struct sgen_inq_node *node_next;
} sgen_inq_node_t;
typedef struct sgen_type_node {
uchar_t node_type;
struct sgen_type_node *node_next;
} sgen_type_node_t;
struct sgen_binddb {
int sdb_init;
kmutex_t sdb_lock;
sgen_inq_node_t *sdb_inq_nodes;
sgen_type_node_t *sdb_type_nodes;
};
#define SGEN_ESTIMATED_NUM_DEVS 4
#define SGEN_BSY_TIMEOUT (drv_usectohz(5 * 1000000))
#define SGEN_IO_TIME 60
#define COMMAND_DONE 0
#define COMMAND_DONE_ERROR 1
#define FETCH_SENSE 2
#define SET_BP_ERROR(bp, err) bioerror(bp, err);
#endif
#ifdef __cplusplus
}
#endif
#endif