#ifndef _SYS_SCSI_IMPL_USCSI_H
#define _SYS_SCSI_IMPL_USCSI_H
#ifdef __cplusplus
extern "C" {
#endif
struct uscsi_cmd {
int uscsi_flags;
short uscsi_status;
short uscsi_timeout;
caddr_t uscsi_cdb;
caddr_t uscsi_bufaddr;
size_t uscsi_buflen;
size_t uscsi_resid;
uchar_t uscsi_cdblen;
uchar_t uscsi_rqlen;
uchar_t uscsi_rqstatus;
uchar_t uscsi_rqresid;
caddr_t uscsi_rqbuf;
ulong_t uscsi_path_instance;
};
#if defined(_SYSCALL32)
struct uscsi_cmd32 {
int uscsi_flags;
short uscsi_status;
short uscsi_timeout;
caddr32_t uscsi_cdb;
caddr32_t uscsi_bufaddr;
size32_t uscsi_buflen;
size32_t uscsi_resid;
uchar_t uscsi_cdblen;
uchar_t uscsi_rqlen;
uchar_t uscsi_rqstatus;
uchar_t uscsi_rqresid;
caddr32_t uscsi_rqbuf;
uint32_t uscsi_path_instance;
};
#define uscsi_cmd32touscsi_cmd(u32, ucmd) \
ucmd->uscsi_flags = u32->uscsi_flags; \
ucmd->uscsi_status = u32->uscsi_status; \
ucmd->uscsi_timeout = u32->uscsi_timeout; \
ucmd->uscsi_cdb = (caddr_t)(uintptr_t)u32->uscsi_cdb; \
ucmd->uscsi_bufaddr = (caddr_t)(uintptr_t)u32->uscsi_bufaddr; \
ucmd->uscsi_buflen = (size_t)u32->uscsi_buflen; \
ucmd->uscsi_resid = (size_t)u32->uscsi_resid; \
ucmd->uscsi_cdblen = u32->uscsi_cdblen; \
ucmd->uscsi_rqlen = u32->uscsi_rqlen; \
ucmd->uscsi_rqstatus = u32->uscsi_rqstatus; \
ucmd->uscsi_rqresid = u32->uscsi_rqresid; \
ucmd->uscsi_rqbuf = (caddr_t)(uintptr_t)u32->uscsi_rqbuf; \
ucmd->uscsi_path_instance = (ulong_t)u32->uscsi_path_instance;
#define uscsi_cmdtouscsi_cmd32(ucmd, u32) \
u32->uscsi_flags = ucmd->uscsi_flags; \
u32->uscsi_status = ucmd->uscsi_status; \
u32->uscsi_timeout = ucmd->uscsi_timeout; \
u32->uscsi_cdb = (caddr32_t)(uintptr_t)ucmd->uscsi_cdb; \
u32->uscsi_bufaddr = (caddr32_t)(uintptr_t)ucmd->uscsi_bufaddr; \
u32->uscsi_buflen = (size32_t)ucmd->uscsi_buflen; \
u32->uscsi_resid = (size32_t)ucmd->uscsi_resid; \
u32->uscsi_cdblen = ucmd->uscsi_cdblen; \
u32->uscsi_rqlen = ucmd->uscsi_rqlen; \
u32->uscsi_rqstatus = ucmd->uscsi_rqstatus; \
u32->uscsi_rqresid = ucmd->uscsi_rqresid; \
u32->uscsi_rqbuf = (caddr32_t)(uintptr_t)ucmd->uscsi_rqbuf; \
u32->uscsi_path_instance = (uint32_t)ucmd->uscsi_path_instance;
#endif
#define USCSI_SILENT 0x00000001
#define USCSI_DIAGNOSE 0x00000002
#define USCSI_ISOLATE 0x00000004
#define USCSI_READ 0x00000008
#define USCSI_WRITE 0x00000000
#define USCSI_RESET 0x00004000
#define USCSI_RESET_TARGET \
USCSI_RESET
#define USCSI_RESET_ALL 0x00008000
#define USCSI_RQENABLE 0x00010000
#define USCSI_RENEGOT 0x00020000
#define USCSI_RESET_LUN 0x00040000
#define USCSI_PATH_INSTANCE \
0x00080000
#define USCSI_ASYNC 0x00001000
#define USCSI_SYNC 0x00002000
#define USCSI_NOINTR 0x00000040
#define USCSI_NOTAG 0x00000100
#define USCSI_OTAG 0x00000200
#define USCSI_HTAG 0x00000400
#define USCSI_HEAD 0x00000800
#define USCSI_NOPARITY 0x00000010
#define USCSI_NODISCON 0x00000020
#define USCSI_PMFAILFAST 0x00100000
#define USCSI_RESERVED 0xffe00000
struct uscsi_rqs {
int rqs_flags;
ushort_t rqs_buflen;
ushort_t rqs_resid;
caddr_t rqs_bufaddr;
};
#if defined(_SYSCALL32)
struct uscsi_rqs32 {
int rqs_flags;
ushort_t rqs_buflen;
ushort_t rqs_resid;
caddr32_t rqs_bufaddr;
};
#endif
#define RQS_OVR 0x01
#define RQS_VALID 0x02
typedef uint64_t uscsi_xfer_t;
#define USCSIIOC (0x04 << 8)
#define USCSICMD (USCSIIOC|201)
#define USCSIMAXXFER (USCSIIOC|202)
#ifdef _KERNEL
#include <sys/scsi/scsi_types.h>
struct uscsi_cmd *scsi_uscsi_alloc();
int scsi_uscsi_copyin(intptr_t, int,
struct scsi_address *, struct uscsi_cmd **);
int scsi_uscsi_alloc_and_copyin(intptr_t, int,
struct scsi_address *, struct uscsi_cmd **);
int scsi_uscsi_pktinit(struct uscsi_cmd *, struct scsi_pkt *);
int scsi_uscsi_handle_cmd(dev_t, enum uio_seg,
struct uscsi_cmd *, int (*)(struct buf *),
struct buf *, void *);
int scsi_uscsi_pktfini(struct scsi_pkt *, struct uscsi_cmd *);
int scsi_uscsi_copyout(intptr_t, struct uscsi_cmd *);
void scsi_uscsi_free(struct uscsi_cmd *);
int scsi_uscsi_copyout_and_free(intptr_t, struct uscsi_cmd *);
#endif
#ifdef __cplusplus
}
#endif
#endif