46#include <sys/kernel.h>
48#include <sys/malloc.h>
59#include <sys/callout.h>
214 uint32_t data_len,
int read_buffer, uint8_t mode,
215 uint8_t buffer_id, uint32_t buffer_offset,
227 if (read_buffer != 0)
238 if (read_buffer != 0)
253 int read_op, uint8_t
byte2,
int minimum_cdb_size,
254 uint64_t lba, uint32_t num_blocks,
ctl_tag_type tag_type,
272 if ((minimum_cdb_size < 10)
273 && ((lba & 0x1fffff) == lba)
274 && ((num_blocks & 0xff) == num_blocks)
289 cdb->
length = num_blocks & 0xff;
294 }
else if ((minimum_cdb_size < 12)
295 && ((num_blocks & 0xffff) == num_blocks)
296 && ((lba & 0xffffffff) == lba)) {
309 }
else if ((minimum_cdb_size < 16)
310 && ((num_blocks & 0xffffffff) == num_blocks)
311 && ((lba & 0xffffffff) == lba)) {
354 uint8_t
byte2, uint64_t lba, uint32_t num_blocks,
385 uint32_t
addr,
int reladr,
int pmi,
414 uint32_t data_len, uint64_t
addr,
int reladr,
446 int dbd,
int llbaa, uint8_t page_code, uint8_t pc,
447 uint8_t subpage,
int minimum_cdb_size,
452 if ((minimum_cdb_size < 10)
454 && (data_len < 256)) {
462 cdb->
page = page_code | pc;
476 cdb->
page = page_code | pc;
505 cdb->
how = power_conditions;
523 int minimum_cdb_size, uint64_t starting_lba,
529 if ((minimum_cdb_size < 16)
530 && ((block_count & 0xffff) == block_count)
531 && ((starting_lba & 0xffffffff) == starting_lba)) {
574 uint32_t data_len,
int action,
600 uint32_t data_len,
int action,
int type,
601 uint64_t key, uint64_t sa_key,
682ctl_scsi_alloc_io(uint32_t initid)
686 io = (
union ctl_io *)malloc(
sizeof(*io));
697ctl_scsi_free_io(
union ctl_io *io)
711 memset(io, 0,
sizeof(*io));
734 const char *task_desc;
741 sbuf_cat(sb, path_str);
743 sbuf_printf(sb,
" Tag: %#x/%d, Prio: %d\n",
748 sbuf_cat(sb, path_str);
750 if (task_desc == NULL)
751 sbuf_printf(sb,
"Unknown Task Action %d (%#x)",
754 sbuf_printf(sb,
"Task Action: %s", task_desc);
757 sbuf_printf(sb,
" Tag: %#x/%d\n",
761 sbuf_printf(sb,
"\n");
792 sbuf_cat(sb, path_str);
793 if (status_desc == NULL)
794 sbuf_printf(sb,
"CTL Status: Unknown status %#x\n",
797 sbuf_printf(sb,
"CTL Status: %s\n", status_desc->
description);
801 sbuf_cat(sb, path_str);
802 sbuf_printf(sb,
"SCSI Status: %s\n",
816 sbuf_new(&sb, str, str_len, SBUF_FIXEDLEN);
819 return (sbuf_data(&sb));
824 char *str,
int str_len)
828 sbuf_new(&sb, str, str_len, SBUF_FIXEDLEN);
831 return (sbuf_data(&sb));
869 for (i = 0; i < len; ) {
870 sbuf_new(&sb, str,
sizeof(str), SBUF_FIXEDLEN);
871 sbuf_cat(&sb, path_str);
873 for (j = 0; j < 16 && i < len; i++, j++) {
880 printf(
"%s", sbuf_data(&sb));
@ CTL_TASK_QUERY_ASYNC_EVENT
@ CTL_TASK_QUERY_TASK_SET
@ CTL_TASK_CLEAR_TASK_SET
@ CTL_TASK_ABORT_TASK_SET
@ CTL_TASK_I_T_NEXUS_RESET
int ctl_scsi_command_string(struct ctl_scsiio *ctsio, struct scsi_inquiry_data *inq_data, struct sbuf *sb)
const char * ctl_scsi_status_string(struct ctl_scsiio *ctsio)
void ctl_scsi_path_string(union ctl_io *io, char *path_str, int len)
int ctl_scsi_sense_sbuf(struct ctl_scsiio *ctsio, struct scsi_inquiry_data *inq_data, struct sbuf *sb, scsi_sense_string_flags flags)
void ctl_scsi_read_capacity_16(union ctl_io *io, uint8_t *data_ptr, uint32_t data_len, uint64_t addr, int reladr, int pmi, ctl_tag_type tag_type, uint8_t control)
void ctl_scsi_start_stop(union ctl_io *io, int start, int load_eject, int immediate, int power_conditions, ctl_tag_type tag_type, uint8_t control)
char * ctl_io_string(union ctl_io *io, char *str, int str_len)
void ctl_scsi_persistent_res_in(union ctl_io *io, uint8_t *data_ptr, uint32_t data_len, int action, ctl_tag_type tag_type, uint8_t control)
void ctl_io_sbuf(union ctl_io *io, struct sbuf *sb)
void ctl_scsi_read_write(union ctl_io *io, uint8_t *data_ptr, uint32_t data_len, int read_op, uint8_t byte2, int minimum_cdb_size, uint64_t lba, uint32_t num_blocks, ctl_tag_type tag_type, uint8_t control)
char * ctl_io_error_string(union ctl_io *io, struct scsi_inquiry_data *inq_data, char *str, int str_len)
void ctl_io_print(union ctl_io *io)
static struct ctl_status_desc ctl_status_table[]
static struct ctl_task_desc ctl_task_table[]
void ctl_scsi_tur(union ctl_io *io, ctl_tag_type tag_type, uint8_t control)
void ctl_scsi_read_capacity(union ctl_io *io, uint8_t *data_ptr, uint32_t data_len, uint32_t addr, int reladr, int pmi, ctl_tag_type tag_type, uint8_t control)
void ctl_scsi_inquiry(union ctl_io *io, uint8_t *data_ptr, int32_t data_len, uint8_t byte2, uint8_t page_code, ctl_tag_type tag_type, uint8_t control)
void ctl_data_print(union ctl_io *io)
void ctl_scsi_read_write_buffer(union ctl_io *io, uint8_t *data_ptr, uint32_t data_len, int read_buffer, uint8_t mode, uint8_t buffer_id, uint32_t buffer_offset, ctl_tag_type tag_type, uint8_t control)
const char * ctl_scsi_task_string(struct ctl_taskio *taskio)
void ctl_io_error_sbuf(union ctl_io *io, struct scsi_inquiry_data *inq_data, struct sbuf *sb)
void ctl_scsi_request_sense(union ctl_io *io, uint8_t *data_ptr, int32_t data_len, uint8_t byte2, ctl_tag_type tag_type, uint8_t control)
void ctl_scsi_persistent_res_out(union ctl_io *io, uint8_t *data_ptr, uint32_t data_len, int action, int type, uint64_t key, uint64_t sa_key, ctl_tag_type tag_type, uint8_t control)
void ctl_scsi_maintenance_in(union ctl_io *io, uint8_t *data_ptr, uint32_t data_len, uint8_t action, ctl_tag_type tag_type, uint8_t control)
void ctl_scsi_write_same(union ctl_io *io, uint8_t *data_ptr, uint32_t data_len, uint8_t byte2, uint64_t lba, uint32_t num_blocks, ctl_tag_type tag_type, uint8_t control)
void ctl_scsi_sync_cache(union ctl_io *io, int immed, int reladr, int minimum_cdb_size, uint64_t starting_lba, uint32_t block_count, ctl_tag_type tag_type, uint8_t control)
void ctl_scsi_mode_sense(union ctl_io *io, uint8_t *data_ptr, uint32_t data_len, int dbd, int llbaa, uint8_t page_code, uint8_t pc, uint8_t subpage, int minimum_cdb_size, ctl_tag_type tag_type, uint8_t control)
void ctl_io_error_print(union ctl_io *io, struct scsi_inquiry_data *inq_data)
void ctl_scsi_report_luns(union ctl_io *io, uint8_t *data_ptr, uint32_t data_len, uint8_t select_report, ctl_tag_type tag_type, uint8_t control)
#define ctl_scsi_zero_io(io)
#define SCSI_STATUS_CHECK_COND
#define SYNCHRONIZE_CACHE_16
#define PERSISTENT_RES_OUT
#define PERSISTENT_RES_IN
#define SRC16_SERVICE_ACTION
#define SYNCHRONIZE_CACHE
static __inline void scsi_ulto2b(u_int32_t val, u_int8_t *bytes)
static __inline void scsi_ulto4b(u_int32_t val, u_int8_t *bytes)
static __inline void scsi_u64to8b(u_int64_t val, u_int8_t *bytes)
#define SERVICE_ACTION_IN
static __inline void scsi_ulto3b(u_int32_t val, u_int8_t *bytes)
uint8_t cdb[CTL_MAX_CDBLEN]
ctl_task_type task_action
ctl_task_type task_action
struct scsi_per_res_key res_key
u_int8_t serv_act_res_key[8]