47#include <sys/kernel.h>
49#include <sys/malloc.h>
52#include <sys/condvar.h>
53#include <sys/stddef.h>
55#include <sys/sysctl.h>
56#include <machine/stdarg.h>
72 int sense_key,
int asc,
int ascq, va_list ap)
86 if (asc == 0x29 || (asc == 0x2A && ascq == 0x01))
103 if (*sense_len == 0) {
104 if ((
lun != NULL) && (
lun->MODE_CTRLE.max_sense != 0))
105 *sense_len =
lun->MODE_CTRLE.max_sense;
111 current_error, sense_key, asc, ascq, ap);
117 int sense_key,
int asc,
int ascq, ...)
123 current_error, sense_key, asc, ascq, ap);
129 int asc,
int ascq, ...)
174 bzero(sense_dest,
sizeof(*sense_dest));
181 bzero(&stream_sense,
sizeof(stream_sense));
188 stream_bits = sense_src->
flags & ~SSD_KEY;
209 sizeof(sense_src->
info),
219 (sense_src->
fru != 0) ?
221 sizeof(sense_src->
fru),
253 uint8_t *info_ptr = NULL, *cmd_ptr = NULL, *fru_ptr = NULL;
254 uint8_t *sks_ptr = NULL, *stream_ptr = NULL;
255 int info_size = 0, cmd_size = 0, fru_size = 0;
256 int sks_size = 0, stream_size = 0;
265 for (pos = 0; pos < (int)(sense_src->
extra_len - 1);) {
275 if ((pos + header->
length +
sizeof(*header)) >
285 info_ptr =
info->info;
286 info_size =
sizeof(
info->info);
288 pos +=
info->length +
308 fru_size =
sizeof(
fru->fru);
328 stream_ptr = &stream_sense->
byte3;
329 stream_size =
sizeof(stream_sense->
byte3);
330 pos = stream_sense->
length +
339 pos +=
sizeof(*header) + header->
length;
394 int *ascq,
ctl_ua_type *ua_to_clear, uint8_t **info)
397 switch (ua_to_build) {
493 panic(
"%s: Unknown UA %x", __func__, ua_to_build);
506 mtx_assert(&lun->
lun_lock, MA_OWNED);
516 ua_to_build = (1 << (ffs(ua) - 1));
517 ua_to_clear = ua_to_build;
519 ctl_ua_to_ascq(lun, ua_to_build, &asc, &ascq, &ua_to_clear, &info);
522 if (ua_to_build == ua)
528 return (ua_to_build);
542 mtx_assert(&lun->
lun_lock, MA_OWNED);
563 ua_to_build = (1 << (ffs(ua[i]) - 1));
564 ua_to_clear = ua_to_build;
566 ctl_ua_to_ascq(lun, ua_to_build, &asc, &ascq, &ua_to_clear, &info);
574 ua[i] &= ~ua_to_clear;
587 return (ua_to_build);
619 int field,
int bit_valid,
int bit)
723 uint16_t retry_count)
729 sks[1] = (retry_count >> 8) & 0xff;
730 sks[2] = retry_count & 0xff;
void ctl_clr_ua_all(struct ctl_lun *lun, uint32_t except, ctl_ua_type ua)
void ctl_clr_ua_allluns(struct ctl_softc *ctl_softc, uint32_t initidx, ctl_ua_type ua_type)
void ctl_set_queue_full(struct ctl_scsiio *ctsio)
void ctl_set_hw_write_protected(struct ctl_scsiio *ctsio)
ctl_ua_type ctl_build_qae(struct ctl_lun *lun, uint32_t initidx, uint8_t *resp)
void ctl_set_task_aborted(struct ctl_scsiio *ctsio)
void ctl_set_space_alloc_fail(struct ctl_scsiio *ctsio)
void ctl_set_sense_data(struct scsi_sense_data *sense_data, u_int *sense_len, void *lunptr, scsi_sense_data_type sense_format, int current_error, int sense_key, int asc, int ascq,...)
void ctl_set_data_phase_error(struct ctl_scsiio *ctsio)
void ctl_set_lun_stopped(struct ctl_scsiio *ctsio)
ctl_ua_type ctl_build_ua(struct ctl_lun *lun, uint32_t initidx, struct scsi_sense_data *sense, u_int *sense_len, scsi_sense_data_type sense_format)
void ctl_set_medium_format_corrupted(struct ctl_scsiio *ctsio)
void ctl_set_lun_unavail(struct ctl_scsiio *ctsio)
void ctl_set_invalid_field(struct ctl_scsiio *ctsio, int sks_valid, int command, int field, int bit_valid, int bit)
void ctl_set_reservation_conflict(struct ctl_scsiio *ctsio)
void ctl_set_success(struct ctl_scsiio *ctsio)
void ctl_set_medium_error(struct ctl_scsiio *ctsio, int read)
void ctl_set_sense_data_va(struct scsi_sense_data *sense_data, u_int *sense_len, void *lunptr, scsi_sense_data_type sense_format, int current_error, int sense_key, int asc, int ascq, va_list ap)
void ctl_sense_to_desc(struct scsi_sense_data_fixed *sense_src, struct scsi_sense_data_desc *sense_dest)
void ctl_set_lun_no_media(struct ctl_scsiio *ctsio)
void ctl_set_param_len_error(struct ctl_scsiio *ctsio)
void ctl_set_ua(struct ctl_scsiio *ctsio, int asc, int ascq)
void ctl_set_unsupported_lun(struct ctl_scsiio *ctsio)
void ctl_set_illegal_pr_release(struct ctl_scsiio *ctsio)
void ctl_sense_to_fixed(struct scsi_sense_data_desc *sense_src, struct scsi_sense_data_fixed *sense_dest)
void ctl_set_internal_failure(struct ctl_scsiio *ctsio, int sks_valid, uint16_t retry_count)
void ctl_set_lun_int_reqd(struct ctl_scsiio *ctsio)
void ctl_set_invalid_opcode(struct ctl_scsiio *ctsio)
void ctl_set_lba_out_of_range(struct ctl_scsiio *ctsio, uint64_t lba)
void ctl_set_lun_ejected(struct ctl_scsiio *ctsio)
void ctl_set_medium_magazine_inaccessible(struct ctl_scsiio *ctsio)
void ctl_set_already_locked(struct ctl_scsiio *ctsio)
void ctl_set_lun_transit(struct ctl_scsiio *ctsio)
void ctl_set_overlapped_tag(struct ctl_scsiio *ctsio, uint8_t tag)
void ctl_set_lun_standby(struct ctl_scsiio *ctsio)
static void ctl_ua_to_ascq(struct ctl_lun *lun, ctl_ua_type ua_to_build, int *asc, int *ascq, ctl_ua_type *ua_to_clear, uint8_t **info)
void ctl_set_busy(struct ctl_scsiio *ctsio)
void ctl_set_sense(struct ctl_scsiio *ctsio, int current_error, int sense_key, int asc, int ascq,...)
void ctl_set_invalid_field_ciu(struct ctl_scsiio *ctsio)
void ctl_set_overlapped_cmd(struct ctl_scsiio *ctsio)
void ctl_set_aborted(struct ctl_scsiio *ctsio)
#define CTL_MAX_INIT_PER_PORT
void scsi_set_sense_data_va(struct scsi_sense_data *sense_data, u_int *sense_len, scsi_sense_data_type sense_format, int current_error, int sense_key, int asc, int ascq, va_list ap)
#define SSD_KEY_UNIT_ATTENTION
#define SSD_KEY_HARDWARE_ERROR
#define SSD_DESC_CURRENT_ERROR
#define SSD_KEY_ABORTED_COMMAND
#define SCSI_STATUS_CHECK_COND
static __inline void scsi_ulto2b(u_int32_t val, u_int8_t *bytes)
#define SSD_DEFERRED_ERROR
#define SSD_KEY_NOT_READY
#define SSD_KEY_MEDIUM_ERROR
static __inline uint32_t scsi_4btoul(const uint8_t *bytes)
static __inline void scsi_u64to8b(u_int64_t val, u_int8_t *bytes)
#define SCSI_STATUS_TASK_ABORTED
#define SCSI_STATUS_RESERV_CONFLICT
#define SSD_KEY_ILLEGAL_REQUEST
#define SSD_KEY_DATA_PROTECT
#define SSD_ERRCODE_VALID
#define SCSI_STATUS_QUEUE_FULL
ctl_ua_type ** pending_ua
struct ctl_softc * ctl_softc
struct scsi_sense_data sense_data
uint8_t add_sense_code_qual
u_int8_t add_sense_code_qual
u_int8_t sense_key_spec[3]
u_int8_t cmd_spec_info[4]
uint8_t sense_key_spec[3]