#ifndef _SYS_SCSI_TARGETS_SES_H
#define _SYS_SCSI_TARGETS_SES_H
#include <sys/note.h>
#ifdef __cplusplus
extern "C" {
#endif
#define EOK 0
#define INVOP 0x10
#define BP_PKT(bp) ((struct scsi_pkt *)(bp)->av_back)
#define SET_BP_PKT(bp, s) (bp)->av_back = (struct buf *)(s)
#define SCBP(pkt) ((struct scsi_status *)(pkt)->pkt_scbp)
#define SCBP_C(pkt) ((*(pkt)->pkt_scbp) & STATUS_MASK)
#define Scsidevp struct scsi_device *
#define Scsipktp struct scsi_pkt *
#define Uscmd struct uscsi_cmd
#define SES_SCSI_DEVP (un->ses_scsi_devp)
#define SES_DEVP(softc) ((softc)->ses_devp)
#define SES_DEVINFO(softc) (SES_DEVP(softc)->sd_dev)
#define SES_RQSENSE(softc) (SES_DEVP(softc)->sd_sense)
#define SES_ROUTE(softc) (&SES_DEVP(softc)->sd_address)
#define SES_MUTEX (&ssc->ses_devp->sd_mutex)
#define ISOPEN(softc) ((softc)->ses_lyropen || (softc)->ses_oflag)
#define UNUSED_PARAMETER(x) x = x
#define SAFTE_RD_RDCFG 0x00
#define SAFTE_RD_RDESTS 0x01
#define SAFTE_RD_RDDSTS 0x04
#define SAFTE_WT_DSTAT 0x10
#define SAFTE_WT_SLTOP 0x12
#define SAFTE_WT_FANSPD 0x13
#define SAFTE_WT_ACTPWS 0x14
#define SAFTE_WT_GLOBAL 0x15
#include <sys/scsi/targets/sesio.h>
typedef struct ses_softc ses_softc_t;
typedef struct {
int (*softc_init)(ses_softc_t *, int);
int (*init_enc)(ses_softc_t *);
int (*get_encstat)(ses_softc_t *, int);
int (*set_encstat)(ses_softc_t *, uchar_t, int);
int (*get_objstat)(ses_softc_t *, ses_objarg *, int);
int (*set_objstat)(ses_softc_t *, ses_objarg *, int);
} encvec;
typedef enum { SES_TYPE, SAFT_TYPE, SEN_TYPE } enctyp;
typedef struct {
uchar_t enctype;
uchar_t subenclosure;
ushort_t svalid : 1,
priv : 15;
uchar_t encstat[4];
} encobj;
#define ENCI_SVALID 0x80
struct ses_softc {
enctyp ses_type;
encvec ses_vec;
uint_t ses_nobjects;
void * ses_private;
encobj * ses_objmap;
uchar_t ses_encstat;
Scsidevp ses_devp;
struct buf *ses_rqbp;
Scsipktp ses_rqpkt;
struct buf *ses_sbufp;
timeout_id_t ses_restart_id;
kcondvar_t ses_sbufcv;
uchar_t ses_sbufbsy;
uchar_t ses_oflag;
uchar_t ses_present;
uchar_t ses_suspended;
uchar_t ses_arq;
uint_t ses_lyropen;
int ses_retries;
ddi_devid_t ses_dev_id;
Uscmd ses_uscsicmd;
uchar_t ses_srqcdb[CDB_SIZE];
uchar_t ses_srqsbuf[MAX_SENSE_LENGTH];
};
#ifndef __lint
#ifdef _KERNEL
_NOTE(MUTEX_PROTECTS_DATA(scsi_device::sd_mutex, ses_softc))
_NOTE(MUTEX_PROTECTS_DATA(scsi_device::sd_mutex, ses_softc::ses_lyropen))
_NOTE(SCHEME_PROTECTS_DATA("not shared", scsi_arq_status))
_NOTE(SCHEME_PROTECTS_DATA("not shared", ses_softc::ses_restart_id))
_NOTE(SCHEME_PROTECTS_DATA("not shared", ses_softc::ses_retries))
_NOTE(SCHEME_PROTECTS_DATA("not shared", ses_softc::ses_present))
_NOTE(SCHEME_PROTECTS_DATA("not shared", ses_softc::ses_suspended))
_NOTE(SCHEME_PROTECTS_DATA("stable data",
ses_softc::ses_type
ses_softc::ses_vec
ses_softc::ses_nobjects
ses_softc::ses_devp
ses_softc::ses_arq))
_NOTE(SCHEME_PROTECTS_DATA("sbufp cv",
ses_softc::ses_sbufp
ses_softc::ses_rqpkt
ses_softc::ses_rqbp
ses_softc::ses_sbufbsy
ses_softc::ses_uscsicmd
ses_softc::ses_srqcdb
ses_softc::ses_srqsbuf
ses_softc::ses_uscsicmd))
_NOTE(SCHEME_PROTECTS_DATA("unique per pkt", scsi_pkt buf uio scsi_cdb))
_NOTE(SCHEME_PROTECTS_DATA("unique per pkt", scsi_extended_sense scsi_status))
_NOTE(SCHEME_PROTECTS_DATA("unique per pkt", uscsi_cmd))
_NOTE(SCHEME_PROTECTS_DATA("stable data", scsi_device))
_NOTE(DATA_READABLE_WITHOUT_LOCK(ses_softc::ses_encstat))
_NOTE(DATA_READABLE_WITHOUT_LOCK(ses_softc::ses_objmap))
_NOTE(DATA_READABLE_WITHOUT_LOCK(ses_softc::ses_private))
_NOTE(DATA_READABLE_WITHOUT_LOCK(ses_softc::ses_lyropen))
_NOTE(DATA_READABLE_WITHOUT_LOCK(ses_softc::ses_oflag))
_NOTE(SCHEME_PROTECTS_DATA("absurdities", ses_objarg))
#endif
#endif
#ifdef DEBUG
#define SES_DEBUG
#endif
#if defined(_KERNEL) || defined(_KMEMUSER)
#define SES_CE_DEBUG ((1 << 8) | CE_CONT)
#define SES_CE_DEBUG1 ((2 << 8) | CE_CONT)
#define SES_CE_DEBUG2 ((3 << 8) | CE_CONT)
#define SES_CE_DEBUG3 ((4 << 8) | CE_CONT)
#define SES_CE_DEBUG4 ((5 << 8) | CE_CONT)
#define SES_CE_DEBUG5 ((6 << 8) | CE_CONT)
#define SES_CE_DEBUG6 ((7 << 8) | CE_CONT)
#define SES_CE_DEBUG7 ((8 << 8) | CE_CONT)
#define SES_CE_DEBUG8 ((9 << 8) | CE_CONT)
#define SES_CE_DEBUG9 ((10 << 8) | CE_CONT)
#ifndef SES_DEBUG
#define ses_debug 0
#endif
#define SES_LOG if (ses_debug) ses_log
#define SES_DEBUG_ENTER if (ses_debug) debug_enter
#define SES_IO_TIME 60
#define SES_RESTART_TIME 100
#define SES_BUSY_TIME 500
#define SES_ENABLE_RESTART(ms_time, pkt) { \
ssc->ses_restart_id = timeout(ses_restart, (void *) pkt, \
(ms_time)? (drv_usectohz(ms_time * 1000)) : \
drv_usectohz(1000)); \
}
#define SES_RETRY_COUNT 4
#define SES_RETRY_MULTIPLIER 8
#define SES_CMD_RETRY SES_RETRY_MULTIPLIER
#define SES_NO_RETRY 0
#define SES_SENSE_RETRY 1
#define SES_BUSY_RETRY 4
#define SES_CMD_RETRY1(retry) \
retry += (retry > 0)? (SES_RETRY_MULTIPLIER -1) : 0;
#define SES_CMD_RETRY2(retry) \
retry += (retry > 0)? (SES_RETRY_MULTIPLIER -2) : 0;
#define SES_CMD_RETRY4(retry) \
retry += (retry > 0)? (SES_RETRY_MULTIPLIER -4) : 0;
#define SES_CLOSED 0
#define SES_OPENING 1
#define SES_OPEN 2
#define COMMAND_DONE 0
#define COMMAND_DONE_ERROR 1
#define QUE_COMMAND_NOW 3
#define QUE_COMMAND 4
#define QUE_SENSE 5
#define SCSI_ESI_PF 0x10
#define SEN_ID "UNISYS SUN_SEN"
#define SEN_ID_LEN 24
#define SET_BP_ERROR(bp, err) bioerror(bp, err);
#if defined(_KERNEL)
extern void ses_log(ses_softc_t *, int, const char *, ...);
extern int ses_runcmd(ses_softc_t *, Uscmd *);
extern int ses_uscsi_cmd(ses_softc_t *, Uscmd *, int);
extern int ses_io_time;
#ifdef DEBUG
extern int ses_debug;
#endif
#endif
#endif
#ifdef __cplusplus
}
#endif
#endif