Lines Matching defs:ctsio

398 static void ctl_serialize_other_sc_cmd(struct ctl_scsiio *ctsio);
412 struct ctl_scsiio *ctsio,
418 static int ctl_inquiry_evpd_supported(struct ctl_scsiio *ctsio, int alloc_len);
419 static int ctl_inquiry_evpd_serial(struct ctl_scsiio *ctsio, int alloc_len);
420 static int ctl_inquiry_evpd_devid(struct ctl_scsiio *ctsio, int alloc_len);
421 static int ctl_inquiry_evpd_eid(struct ctl_scsiio *ctsio, int alloc_len);
422 static int ctl_inquiry_evpd_mpp(struct ctl_scsiio *ctsio, int alloc_len);
423 static int ctl_inquiry_evpd_scsi_ports(struct ctl_scsiio *ctsio,
425 static int ctl_inquiry_evpd_sfs(struct ctl_scsiio *ctsio, int alloc_len);
426 static int ctl_inquiry_evpd_block_limits(struct ctl_scsiio *ctsio,
428 static int ctl_inquiry_evpd_bdc(struct ctl_scsiio *ctsio, int alloc_len);
429 static int ctl_inquiry_evpd_lbp(struct ctl_scsiio *ctsio, int alloc_len);
430 static int ctl_inquiry_evpd(struct ctl_scsiio *ctsio);
431 static int ctl_inquiry_std(struct ctl_scsiio *ctsio);
447 struct ctl_scsiio *ctsio);
449 static void ctl_scsiio_precheck(struct ctl_scsiio *ctsio);
450 static int ctl_scsiio(struct ctl_scsiio *ctsio);
490 ctl_get_cmd_entry(struct ctl_scsiio *ctsio, int *sa);
492 ctl_validate_command(struct ctl_scsiio *ctsio);
762 struct ctl_scsiio *ctsio;
770 ctsio = &msg_info->hdr.original_sc->scsiio;
771 ctsio->io_hdr.flags &= ~CTL_FLAG_SENT_2OTHER_SC;
772 ctsio->io_hdr.flags |= CTL_FLAG_IO_ACTIVE;
773 ctsio->io_hdr.msg_type = CTL_MSG_FINISH_IO;
774 ctsio->io_hdr.status = msg_info->hdr.status;
775 ctsio->scsi_status = msg_info->scsi.scsi_status;
776 ctsio->sense_len = msg_info->scsi.sense_len;
777 memcpy(&ctsio->sense_data, &msg_info->scsi.sense_data,
779 ctl_enqueue_isc((union ctl_io *)ctsio);
786 struct ctl_scsiio *ctsio;
794 ctsio = &msg_info->hdr.serializing_sc->scsiio;
795 ctsio->io_hdr.msg_type = CTL_MSG_FINISH_IO;
796 ctl_enqueue_isc((union ctl_io *)ctsio);
1488 // populate ctsio from msg
2317 ctl_serialize_other_sc_cmd(struct ctl_scsiio *ctsio)
2319 struct ctl_softc *softc = CTL_SOFTC(ctsio);
2320 struct ctl_port *port = CTL_PORT(ctsio);
2327 targ_lun = ctsio->io_hdr.nexus.targ_mapped_lun;
2331 ctl_set_internal_failure(ctsio, /*sks_valid*/ 0,
2348 ctl_set_busy(ctsio);
2360 ctl_set_busy(ctsio);
2364 entry = ctl_get_cmd_entry(ctsio, NULL);
2365 ctsio->seridx = entry->seridx;
2366 if (ctl_scsiio_lun_check(lun, entry, ctsio) != 0) {
2371 CTL_LUN(ctsio) = lun;
2372 CTL_BACKEND_LUN(ctsio) = lun->be_lun;
2382 LIST_INSERT_HEAD(&lun->ooa_queue, &ctsio->io_hdr, ooa_links);
2384 bio = (union ctl_io *)LIST_NEXT(&ctsio->io_hdr, ooa_links);
2385 switch (ctl_check_ooa(lun, (union ctl_io *)ctsio, &bio)) {
2389 ctsio->io_hdr.flags |= CTL_FLAG_IS_WAS_ON_RTR;
2390 ctl_enqueue_rtr((union ctl_io *)ctsio);
2393 ctsio->io_hdr.flags &= ~CTL_FLAG_IO_ACTIVE;
2397 msg_info.hdr.original_sc = ctsio->io_hdr.remote_io;
2398 msg_info.hdr.serializing_sc = (union ctl_io *)ctsio;
2405 ctsio->io_hdr.blocker = bio;
2406 TAILQ_INSERT_TAIL(&bio->io_hdr.blocked_queue, &ctsio->io_hdr,
2411 LIST_REMOVE(&ctsio->io_hdr, ooa_links);
2413 ctl_set_overlapped_cmd(ctsio);
2416 LIST_REMOVE(&ctsio->io_hdr, ooa_links);
2418 ctl_set_overlapped_tag(ctsio, ctsio->tag_num & 0xff);
2420 ctl_copy_sense_data_back((union ctl_io *)ctsio, &msg_info);
2421 msg_info.hdr.original_sc = ctsio->io_hdr.remote_io;
2426 ctl_free_io((union ctl_io *)ctsio);
5215 ctl_scsi_release(struct ctl_scsiio *ctsio)
5217 struct ctl_lun *lun = CTL_LUN(ctsio);
5222 residx = ctl_get_initindex(&ctsio->io_hdr.nexus);
5246 ctl_set_success(ctsio);
5247 ctl_done((union ctl_io *)ctsio);
5252 ctl_scsi_reserve(struct ctl_scsiio *ctsio)
5254 struct ctl_lun *lun = CTL_LUN(ctsio);
5259 residx = ctl_get_initindex(&ctsio->io_hdr.nexus);
5271 ctl_set_reservation_conflict(ctsio);
5277 ctl_set_success(ctsio);
5283 ctl_set_success(ctsio);
5287 ctl_done((union ctl_io *)ctsio);
5292 ctl_start_stop(struct ctl_scsiio *ctsio)
5294 struct ctl_lun *lun = CTL_LUN(ctsio);
5300 cdb = (struct scsi_start_stop_unit *)ctsio->cdb;
5307 residx = ctl_get_initindex(&ctsio->io_hdr.nexus);
5310 ctl_set_reservation_conflict(ctsio);
5311 ctl_done((union ctl_io *)ctsio);
5318 ctl_set_invalid_field(ctsio,
5324 ctl_done((union ctl_io *)ctsio);
5331 ctl_set_sense(ctsio, /*current_error*/ 1,
5335 ctl_done((union ctl_io *)ctsio);
5340 retval = lun->backend->config_write((union ctl_io *)ctsio);
5345 ctl_prevent_allow(struct ctl_scsiio *ctsio)
5347 struct ctl_lun *lun = CTL_LUN(ctsio);
5354 cdb = (struct scsi_prevent *)ctsio->cdb;
5357 ctl_set_invalid_opcode(ctsio);
5358 ctl_done((union ctl_io *)ctsio);
5362 initidx = ctl_get_initindex(&ctsio->io_hdr.nexus);
5374 retval = lun->backend->config_write((union ctl_io *)ctsio);
5385 ctl_sync_cache(struct ctl_scsiio *ctsio)
5387 struct ctl_lun *lun = CTL_LUN(ctsio);
5398 switch (ctsio->cdb[0]) {
5401 cdb = (struct scsi_sync_cache *)ctsio->cdb;
5410 cdb = (struct scsi_sync_cache_16 *)ctsio->cdb;
5418 ctl_set_invalid_opcode(ctsio);
5419 ctl_done((union ctl_io *)ctsio);
5431 ctl_set_lba_out_of_range(ctsio,
5433 ctl_done((union ctl_io *)ctsio);
5437 lbalen = (struct ctl_lba_len_flags *)&ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
5441 retval = lun->backend->config_write((union ctl_io *)ctsio);
5448 ctl_format(struct ctl_scsiio *ctsio)
5455 cdb = (struct scsi_format *)ctsio->cdb;
5465 if (((ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0)
5467 ctsio->kern_data_ptr = malloc(length, M_CTL, M_WAITOK);
5468 ctsio->kern_data_len = length;
5469 ctsio->kern_total_len = length;
5470 ctsio->kern_rel_offset = 0;
5471 ctsio->kern_sg_entries = 0;
5472 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
5473 ctsio->be_move_done = ctl_config_move_done;
5474 ctl_datamove((union ctl_io *)ctsio);
5486 ctsio->kern_data_ptr;
5490 ctl_set_invalid_field(ctsio,
5502 ctsio->kern_data_ptr;
5506 ctl_set_invalid_field(ctsio,
5517 ctl_set_success(ctsio);
5520 if (ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) {
5521 free(ctsio->kern_data_ptr, M_CTL);
5522 ctsio->io_hdr.flags &= ~CTL_FLAG_ALLOCATED;
5525 ctl_done((union ctl_io *)ctsio);
5530 ctl_read_buffer(struct ctl_scsiio *ctsio)
5532 struct ctl_lun *lun = CTL_LUN(ctsio);
5541 switch (ctsio->cdb[0]) {
5545 cdb = (struct scsi_read_buffer *)ctsio->cdb;
5554 cdb = (struct scsi_read_buffer_16 *)ctsio->cdb;
5561 ctl_set_invalid_opcode(ctsio);
5562 ctl_done((union ctl_io *)ctsio);
5568 ctl_set_invalid_field(ctsio,
5574 ctl_done((union ctl_io *)ctsio);
5581 ctsio->kern_data_ptr = descr;
5584 ctsio->kern_data_ptr = echo_descr;
5591 ctsio->kern_data_ptr = lun->write_buffer + buffer_offset;
5593 ctsio->kern_data_len = len;
5594 ctsio->kern_total_len = len;
5595 ctsio->kern_rel_offset = 0;
5596 ctsio->kern_sg_entries = 0;
5597 ctl_set_success(ctsio);
5598 ctsio->be_move_done = ctl_config_move_done;
5599 ctl_datamove((union ctl_io *)ctsio);
5604 ctl_write_buffer(struct ctl_scsiio *ctsio)
5606 struct ctl_lun *lun = CTL_LUN(ctsio);
5612 cdb = (struct scsi_write_buffer *)ctsio->cdb;
5618 ctl_set_invalid_field(ctsio,
5624 ctl_done((union ctl_io *)ctsio);
5640 if (ctsio->kern_data_ptr == NULL) {
5641 ctsio->kern_data_ptr = lun->write_buffer + buffer_offset;
5642 ctsio->kern_data_len = len;
5643 ctsio->kern_total_len = len;
5644 ctsio->kern_rel_offset = 0;
5645 ctsio->kern_sg_entries = 0;
5646 ctsio->be_move_done = ctl_config_move_done;
5647 ctl_datamove((union ctl_io *)ctsio);
5652 ctl_set_success(ctsio);
5653 ctl_done((union ctl_io *)ctsio);
5661 struct ctl_scsiio *ctsio;
5667 ctsio = &io->scsiio;
5668 ctsio->io_hdr.status = CTL_STATUS_NONE;
5670 &ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
5673 ctsio->io_hdr.flags &= ~CTL_FLAG_IO_CONT;
5678 retval = lun->backend->config_write((union ctl_io *)ctsio);
5683 ctl_write_same(struct ctl_scsiio *ctsio)
5685 struct ctl_lun *lun = CTL_LUN(ctsio);
5695 switch (ctsio->cdb[0]) {
5699 cdb = (struct scsi_write_same_10 *)ctsio->cdb;
5709 cdb = (struct scsi_write_same_16 *)ctsio->cdb;
5721 ctl_set_invalid_opcode(ctsio);
5722 ctl_done((union ctl_io *)ctsio);
5730 ctl_set_invalid_field(ctsio, /*sks_valid*/ 1,
5732 ctl_done((union ctl_io *)ctsio);
5744 ctl_set_lba_out_of_range(ctsio,
5746 ctl_done((union ctl_io *)ctsio);
5758 ctl_set_invalid_field(ctsio,
5760 /*field*/ ctsio->cdb[0] == WRITE_SAME_10 ? 7 : 10,
5762 ctl_done((union ctl_io *)ctsio);
5766 ctsio->io_hdr.flags |= CTL_FLAG_IO_CONT;
5767 ctsio->io_cont = ctl_write_same_cont;
5780 (ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0) {
5781 ctsio->kern_data_ptr = malloc(len, M_CTL, M_WAITOK);
5782 ctsio->kern_data_len = len;
5783 ctsio->kern_total_len = len;
5784 ctsio->kern_rel_offset = 0;
5785 ctsio->kern_sg_entries = 0;
5786 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
5787 ctsio->be_move_done = ctl_config_move_done;
5788 ctl_datamove((union ctl_io *)ctsio);
5793 lbalen = (struct ctl_lba_len_flags *)&ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
5797 retval = lun->backend->config_write((union ctl_io *)ctsio);
5803 ctl_unmap(struct ctl_scsiio *ctsio)
5805 struct ctl_lun *lun = CTL_LUN(ctsio);
5817 cdb = (struct scsi_unmap *)ctsio->cdb;
5825 if ((ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0) {
5826 ctsio->kern_data_ptr = malloc(len, M_CTL, M_WAITOK);
5827 ctsio->kern_data_len = len;
5828 ctsio->kern_total_len = len;
5829 ctsio->kern_rel_offset = 0;
5830 ctsio->kern_sg_entries = 0;
5831 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
5832 ctsio->be_move_done = ctl_config_move_done;
5833 ctl_datamove((union ctl_io *)ctsio);
5838 len = ctsio->kern_total_len - ctsio->kern_data_resid;
5839 hdr = (struct scsi_unmap_header *)ctsio->kern_data_ptr;
5844 ctl_set_invalid_field(ctsio,
5862 ctl_set_lba_out_of_range(ctsio,
5864 ctl_done((union ctl_io *)ctsio);
5877 ctl_set_success(ctsio);
5883 &ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
5887 ctl_try_unblock_others(lun, (union ctl_io *)ctsio, FALSE);
5890 retval = lun->backend->config_write((union ctl_io *)ctsio);
5894 if (ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) {
5895 free(ctsio->kern_data_ptr, M_CTL);
5896 ctsio->io_hdr.flags &= ~CTL_FLAG_ALLOCATED;
5898 ctl_done((union ctl_io *)ctsio);
5903 ctl_default_page_handler(struct ctl_scsiio *ctsio,
5906 struct ctl_lun *lun = CTL_LUN(ctsio);
5911 initidx = ctl_get_initindex(&ctsio->io_hdr.nexus);
5927 ctl_get_initindex(&ctsio->io_hdr.nexus),
5958 ctl_ie_page_handler(struct ctl_scsiio *ctsio,
5961 struct ctl_lun *lun = CTL_LUN(ctsio);
5965 (void)ctl_default_page_handler(ctsio, page_index, page_ptr);
6006 struct ctl_scsiio *ctsio;
6014 ctsio = &io->scsiio;
6019 ctsio->io_hdr.ctl_private[CTL_PRIV_MODEPAGE].bytes;
6026 (ctsio->kern_data_ptr + *len_used);
6029 free(ctsio->kern_data_ptr, M_CTL);
6030 ctl_set_success(ctsio);
6031 ctl_done((union ctl_io *)ctsio);
6034 free(ctsio->kern_data_ptr, M_CTL);
6035 ctl_set_param_len_error(ctsio);
6036 ctl_done((union ctl_io *)ctsio);
6041 free(ctsio->kern_data_ptr, M_CTL);
6042 ctl_set_param_len_error(ctsio);
6043 ctl_done((union ctl_io *)ctsio);
6098 ctl_set_invalid_field(ctsio,
6104 free(ctsio->kern_data_ptr, M_CTL);
6105 ctl_done((union ctl_io *)ctsio);
6123 ctl_set_invalid_field(ctsio,
6129 free(ctsio->kern_data_ptr, M_CTL);
6130 ctl_done((union ctl_io *)ctsio);
6134 free(ctsio->kern_data_ptr, M_CTL);
6135 ctl_set_param_len_error(ctsio);
6136 ctl_done((union ctl_io *)ctsio);
6174 ctl_set_invalid_field(ctsio,
6180 free(ctsio->kern_data_ptr, M_CTL);
6181 ctl_done((union ctl_io *)ctsio);
6193 retval = page_index->select_handler(ctsio, page_index,
6213 ctl_set_success(ctsio);
6214 free(ctsio->kern_data_ptr, M_CTL);
6215 ctl_done((union ctl_io *)ctsio);
6224 ctl_mode_select(struct ctl_scsiio *ctsio)
6226 struct ctl_lun *lun = CTL_LUN(ctsio);
6231 initidx = ctl_get_initindex(&ctsio->io_hdr.nexus);
6232 switch (ctsio->cdb[0]) {
6236 cdb = (struct scsi_mode_select_6 *)ctsio->cdb;
6246 cdb = (struct scsi_mode_select_10 *)ctsio->cdb;
6254 ctl_set_invalid_opcode(ctsio);
6255 ctl_done((union ctl_io *)ctsio);
6261 ctl_set_invalid_field(ctsio, /*sks_valid*/ 0,
6264 ctl_done((union ctl_io *)ctsio);
6278 ctl_set_success(ctsio);
6279 ctl_done((union ctl_io *)ctsio);
6289 ctl_set_success(ctsio);
6290 ctl_done((union ctl_io *)ctsio);
6299 ctl_set_param_len_error(ctsio);
6300 ctl_done((union ctl_io *)ctsio);
6310 if ((ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0) {
6311 ctsio->kern_data_ptr = malloc(param_len, M_CTL, M_WAITOK);
6312 ctsio->kern_data_len = param_len;
6313 ctsio->kern_total_len = param_len;
6314 ctsio->kern_rel_offset = 0;
6315 ctsio->kern_sg_entries = 0;
6316 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
6317 ctsio->be_move_done = ctl_config_move_done;
6318 ctl_datamove((union ctl_io *)ctsio);
6323 switch (ctsio->cdb[0]) {
6327 mh6 = (struct scsi_mode_header_6 *)ctsio->kern_data_ptr;
6334 mh10 = (struct scsi_mode_header_10 *)ctsio->kern_data_ptr;
6339 panic("%s: Invalid CDB type %#x", __func__, ctsio->cdb[0]);
6343 free(ctsio->kern_data_ptr, M_CTL);
6344 ctl_set_param_len_error(ctsio);
6345 ctl_done((union ctl_io *)ctsio);
6355 ctsio->io_hdr.flags |= CTL_FLAG_IO_CONT;
6356 ctsio->io_cont = ctl_do_mode_select;
6359 ctsio->io_hdr.ctl_private[CTL_PRIV_MODEPAGE].bytes;
6364 return (ctl_do_mode_select((union ctl_io *)ctsio));
6368 ctl_mode_sense(struct ctl_scsiio *ctsio)
6370 struct ctl_lun *lun = CTL_LUN(ctsio);
6380 switch (ctsio->cdb[0]) {
6384 cdb = (struct scsi_mode_sense_6 *)ctsio->cdb;
6402 cdb = (struct scsi_mode_sense_10 *)ctsio->cdb;
6424 ctl_set_invalid_opcode(ctsio);
6425 ctl_done((union ctl_io *)ctsio);
6447 ctl_set_invalid_field(ctsio,
6453 ctl_done((union ctl_io *)ctsio);
6515 ctl_set_invalid_field(ctsio,
6521 ctl_done((union ctl_io *)ctsio);
6530 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
6531 ctsio->kern_sg_entries = 0;
6532 ctsio->kern_rel_offset = 0;
6533 ctsio->kern_data_len = min(total_len, alloc_len);
6534 ctsio->kern_total_len = ctsio->kern_data_len;
6536 switch (ctsio->cdb[0]) {
6540 header = (struct scsi_mode_hdr_6 *)ctsio->kern_data_ptr;
6557 header = (struct scsi_mode_hdr_10 *)ctsio->kern_data_ptr;
6574 panic("%s: Invalid CDB type %#x", __func__, ctsio->cdb[0]);
6638 page_index->sense_handler(ctsio, page_index,pc);
6640 memcpy(ctsio->kern_data_ptr + data_used,
6683 page_index->sense_handler(ctsio, page_index,pc);
6685 memcpy(ctsio->kern_data_ptr + data_used,
6695 ctl_set_success(ctsio);
6696 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
6697 ctsio->be_move_done = ctl_config_move_done;
6698 ctl_datamove((union ctl_io *)ctsio);
6703 ctl_temp_log_sense_handler(struct ctl_scsiio *ctsio,
6707 struct ctl_lun *lun = CTL_LUN(ctsio);
6737 ctl_lbp_log_sense_handler(struct ctl_scsiio *ctsio,
6741 struct ctl_lun *lun = CTL_LUN(ctsio);
6805 ctl_sap_log_sense_handler(struct ctl_scsiio *ctsio,
6809 struct ctl_lun *lun = CTL_LUN(ctsio);
6854 ctl_ie_log_sense_handler(struct ctl_scsiio *ctsio,
6858 struct ctl_lun *lun = CTL_LUN(ctsio);
6879 ctl_log_sense(struct ctl_scsiio *ctsio)
6881 struct ctl_lun *lun = CTL_LUN(ctsio);
6890 cdb = (struct scsi_log_sense *)ctsio->cdb;
6911 ctl_set_invalid_field(ctsio,
6917 ctl_done((union ctl_io *)ctsio);
6923 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
6924 ctsio->kern_sg_entries = 0;
6925 ctsio->kern_rel_offset = 0;
6926 ctsio->kern_data_len = min(total_len, alloc_len);
6927 ctsio->kern_total_len = ctsio->kern_data_len;
6929 header = (struct scsi_log_header *)ctsio->kern_data_ptr;
6944 page_index->sense_handler(ctsio, page_index, pc);
6948 ctl_set_success(ctsio);
6949 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
6950 ctsio->be_move_done = ctl_config_move_done;
6951 ctl_datamove((union ctl_io *)ctsio);
6956 ctl_read_capacity(struct ctl_scsiio *ctsio)
6958 struct ctl_lun *lun = CTL_LUN(ctsio);
6965 cdb = (struct scsi_read_capacity *)ctsio->cdb;
6970 ctl_set_invalid_field(/*ctsio*/ ctsio,
6976 ctl_done((union ctl_io *)ctsio);
6980 ctsio->kern_data_ptr = malloc(sizeof(*data), M_CTL, M_WAITOK | M_ZERO);
6981 data = (struct scsi_read_capacity_data *)ctsio->kern_data_ptr;
6982 ctsio->kern_data_len = sizeof(*data);
6983 ctsio->kern_total_len = sizeof(*data);
6984 ctsio->kern_rel_offset = 0;
6985 ctsio->kern_sg_entries = 0;
7002 ctl_set_success(ctsio);
7003 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7004 ctsio->be_move_done = ctl_config_move_done;
7005 ctl_datamove((union ctl_io *)ctsio);
7010 ctl_read_capacity_16(struct ctl_scsiio *ctsio)
7012 struct ctl_lun *lun = CTL_LUN(ctsio);
7020 cdb = (struct scsi_read_capacity_16 *)ctsio->cdb;
7027 ctl_set_invalid_field(/*ctsio*/ ctsio,
7033 ctl_done((union ctl_io *)ctsio);
7037 ctsio->kern_data_ptr = malloc(sizeof(*data), M_CTL, M_WAITOK | M_ZERO);
7038 data = (struct scsi_read_capacity_data_long *)ctsio->kern_data_ptr;
7039 ctsio->kern_rel_offset = 0;
7040 ctsio->kern_sg_entries = 0;
7041 ctsio->kern_data_len = min(sizeof(*data), alloc_len);
7042 ctsio->kern_total_len = ctsio->kern_data_len;
7052 ctl_set_success(ctsio);
7053 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7054 ctsio->be_move_done = ctl_config_move_done;
7055 ctl_datamove((union ctl_io *)ctsio);
7060 ctl_get_lba_status(struct ctl_scsiio *ctsio)
7062 struct ctl_lun *lun = CTL_LUN(ctsio);
7072 cdb = (struct scsi_get_lba_status *)ctsio->cdb;
7077 ctl_set_lba_out_of_range(ctsio, lba);
7078 ctl_done((union ctl_io *)ctsio);
7083 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
7084 data = (struct scsi_get_lba_status_data *)ctsio->kern_data_ptr;
7085 ctsio->kern_rel_offset = 0;
7086 ctsio->kern_sg_entries = 0;
7087 ctsio->kern_data_len = min(total_len, alloc_len);
7088 ctsio->kern_total_len = ctsio->kern_data_len;
7097 ctl_set_success(ctsio);
7098 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7099 ctsio->be_move_done = ctl_config_move_done;
7101 lbalen = (struct ctl_lba_len_flags *)&ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
7105 retval = lun->backend->config_read((union ctl_io *)ctsio);
7110 ctl_read_defect(struct ctl_scsiio *ctsio)
7121 if (ctsio->cdb[0] == READ_DEFECT_DATA_10) {
7122 ccb10 = (struct scsi_read_defect_data_10 *)&ctsio->cdb;
7127 ccb12 = (struct scsi_read_defect_data_12 *)&ctsio->cdb;
7133 ctl_set_success(ctsio);
7134 ctl_done((union ctl_io *)ctsio);
7138 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
7139 ctsio->kern_rel_offset = 0;
7140 ctsio->kern_sg_entries = 0;
7141 ctsio->kern_data_len = min(data_len, alloc_len);
7142 ctsio->kern_total_len = ctsio->kern_data_len;
7144 if (ctsio->cdb[0] == READ_DEFECT_DATA_10) {
7146 ctsio->kern_data_ptr;
7151 ctsio->kern_data_ptr;
7157 ctl_set_success(ctsio);
7158 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7159 ctsio->be_move_done = ctl_config_move_done;
7160 ctl_datamove((union ctl_io *)ctsio);
7165 ctl_report_ident_info(struct ctl_scsiio *ctsio)
7167 struct ctl_lun *lun = CTL_LUN(ctsio);
7176 cdb = (struct scsi_report_ident_info *)ctsio->cdb;
7197 ctl_set_invalid_field(/*ctsio*/ ctsio,
7203 ctl_done((union ctl_io *)ctsio);
7209 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
7210 ctsio->kern_sg_entries = 0;
7211 ctsio->kern_rel_offset = 0;
7212 ctsio->kern_data_len = min(total_len, alloc_len);
7213 ctsio->kern_total_len = ctsio->kern_data_len;
7215 rii_ptr = (struct scsi_report_ident_info_data *)ctsio->kern_data_ptr;
7239 ctl_set_success(ctsio);
7240 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7241 ctsio->be_move_done = ctl_config_move_done;
7242 ctl_datamove((union ctl_io *)ctsio);
7247 ctl_report_tagret_port_groups(struct ctl_scsiio *ctsio)
7249 struct ctl_softc *softc = CTL_SOFTC(ctsio);
7250 struct ctl_lun *lun = CTL_LUN(ctsio);
7262 cdb = (struct scsi_maintenance_in *)ctsio->cdb;
7273 ctl_set_invalid_field(/*ctsio*/ ctsio,
7279 ctl_done((union ctl_io *)ctsio);
7308 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
7309 ctsio->kern_sg_entries = 0;
7310 ctsio->kern_rel_offset = 0;
7311 ctsio->kern_data_len = min(total_len, alloc_len);
7312 ctsio->kern_total_len = ctsio->kern_data_len;
7316 ctsio->kern_data_ptr;
7323 ctsio->kern_data_ptr;
7408 ctl_set_success(ctsio);
7409 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7410 ctsio->be_move_done = ctl_config_move_done;
7411 ctl_datamove((union ctl_io *)ctsio);
7416 ctl_report_supported_opcodes(struct ctl_scsiio *ctsio)
7418 struct ctl_lun *lun = CTL_LUN(ctsio);
7430 cdb = (struct scsi_report_supported_opcodes *)ctsio->cdb;
7470 ctl_set_invalid_field(/*ctsio*/ ctsio,
7476 ctl_done((union ctl_io *)ctsio);
7483 ctl_set_invalid_field(/*ctsio*/ ctsio,
7489 ctl_done((union ctl_io *)ctsio);
7495 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
7496 ctsio->kern_sg_entries = 0;
7497 ctsio->kern_rel_offset = 0;
7498 ctsio->kern_data_len = min(total_len, alloc_len);
7499 ctsio->kern_total_len = ctsio->kern_data_len;
7504 ctsio->kern_data_ptr;
7539 ctsio->kern_data_ptr;
7544 ctsio->kern_data_ptr;
7560 ctsio->kern_data_ptr;
7572 ctl_set_success(ctsio);
7573 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7574 ctsio->be_move_done = ctl_config_move_done;
7575 ctl_datamove((union ctl_io *)ctsio);
7580 ctl_report_supported_tmf(struct ctl_scsiio *ctsio)
7589 cdb = (struct scsi_report_supported_tmf *)ctsio->cdb;
7599 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
7600 ctsio->kern_sg_entries = 0;
7601 ctsio->kern_rel_offset = 0;
7602 ctsio->kern_data_len = min(total_len, alloc_len);
7603 ctsio->kern_total_len = ctsio->kern_data_len;
7605 data = (struct scsi_report_supported_tmf_ext_data *)ctsio->kern_data_ptr;
7611 ctl_set_success(ctsio);
7612 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7613 ctsio->be_move_done = ctl_config_move_done;
7614 ctl_datamove((union ctl_io *)ctsio);
7619 ctl_report_timestamp(struct ctl_scsiio *ctsio)
7630 cdb = (struct scsi_report_timestamp *)ctsio->cdb;
7637 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
7638 ctsio->kern_sg_entries = 0;
7639 ctsio->kern_rel_offset = 0;
7640 ctsio->kern_data_len = min(total_len, alloc_len);
7641 ctsio->kern_total_len = ctsio->kern_data_len;
7643 data = (struct scsi_report_timestamp_data *)ctsio->kern_data_ptr;
7651 ctl_set_success(ctsio);
7652 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7653 ctsio->be_move_done = ctl_config_move_done;
7654 ctl_datamove((union ctl_io *)ctsio);
7659 ctl_persistent_reserve_in(struct ctl_scsiio *ctsio)
7661 struct ctl_softc *softc = CTL_SOFTC(ctsio);
7662 struct ctl_lun *lun = CTL_LUN(ctsio);
7670 cdb = (struct scsi_per_res_in *)ctsio->cdb;
7701 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
7702 ctsio->kern_rel_offset = 0;
7703 ctsio->kern_sg_entries = 0;
7704 ctsio->kern_data_len = min(total_len, alloc_len);
7705 ctsio->kern_total_len = ctsio->kern_data_len;
7713 res_keys = (struct scsi_per_res_in_keys*)ctsio->kern_data_ptr;
7726 free(ctsio->kern_data_ptr, M_CTL);
7761 res = (struct scsi_per_res_in_rsrv *)ctsio->kern_data_ptr;
7786 free(ctsio->kern_data_ptr, M_CTL);
7814 res_cap = (struct scsi_per_res_cap *)ctsio->kern_data_ptr;
7833 res_status = (struct scsi_per_res_in_full*)ctsio->kern_data_ptr;
7846 free(ctsio->kern_data_ptr, M_CTL);
7887 ctl_set_success(ctsio);
7888 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7889 ctsio->be_move_done = ctl_config_move_done;
7890 ctl_datamove((union ctl_io *)ctsio);
7901 struct ctl_scsiio *ctsio, struct scsi_per_res_out *cdb,
7914 ctl_set_invalid_field(/*ctsio*/ ctsio,
7920 ctl_done((union ctl_io *)ctsio);
7926 ctl_set_invalid_field(/*ctsio*/ ctsio,
7932 ctl_done((union ctl_io *)ctsio);
7956 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
7969 free(ctsio->kern_data_ptr, M_CTL);
7970 ctl_set_invalid_field(ctsio,
7976 ctl_done((union ctl_io *)ctsio);
7995 free(ctsio->kern_data_ptr, M_CTL);
7996 ctl_set_invalid_field(ctsio,
8002 ctl_done((union ctl_io *)ctsio);
8017 free(ctsio->kern_data_ptr, M_CTL);
8018 ctl_set_reservation_conflict(ctsio);
8019 ctl_done((union ctl_io *)ctsio);
8026 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8044 ctl_set_invalid_field(/*ctsio*/ ctsio,
8050 ctl_done((union ctl_io *)ctsio);
8056 ctl_set_invalid_field(/*ctsio*/ ctsio,
8062 ctl_done((union ctl_io *)ctsio);
8103 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8132 free(ctsio->kern_data_ptr, M_CTL);
8133 ctl_set_reservation_conflict(ctsio);
8134 ctl_done((union ctl_io *)ctsio);
8140 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8223 ctl_persistent_reserve_out(struct ctl_scsiio *ctsio)
8225 struct ctl_softc *softc = CTL_SOFTC(ctsio);
8226 struct ctl_lun *lun = CTL_LUN(ctsio);
8239 cdb = (struct scsi_per_res_out *)ctsio->cdb;
8252 ctl_set_invalid_field(/*ctsio*/ ctsio,
8258 ctl_done((union ctl_io *)ctsio);
8263 ctl_set_invalid_field(/*ctsio*/ ctsio,
8269 ctl_done((union ctl_io *)ctsio);
8278 ctl_set_invalid_field(ctsio,
8284 ctl_done((union ctl_io *)ctsio);
8288 if ((ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0) {
8289 ctsio->kern_data_ptr = malloc(param_len, M_CTL, M_WAITOK);
8290 ctsio->kern_data_len = param_len;
8291 ctsio->kern_total_len = param_len;
8292 ctsio->kern_rel_offset = 0;
8293 ctsio->kern_sg_entries = 0;
8294 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
8295 ctsio->be_move_done = ctl_config_move_done;
8296 ctl_datamove((union ctl_io *)ctsio);
8301 param = (struct scsi_per_res_out_parms *)ctsio->kern_data_ptr;
8303 residx = ctl_get_initindex(&ctsio->io_hdr.nexus);
8321 free(ctsio->kern_data_ptr, M_CTL);
8322 ctl_set_reservation_conflict(ctsio);
8323 ctl_done((union ctl_io *)ctsio);
8331 free(ctsio->kern_data_ptr, M_CTL);
8332 ctl_set_reservation_conflict(ctsio);
8333 ctl_done((union ctl_io *)ctsio);
8341 free(ctsio->kern_data_ptr, M_CTL);
8342 ctl_set_reservation_conflict(ctsio);
8343 ctl_done((union ctl_io *)ctsio);
8369 free(ctsio->kern_data_ptr, M_CTL);
8370 ctl_set_invalid_field(ctsio,
8376 ctl_done((union ctl_io *)ctsio);
8431 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8449 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8474 free(ctsio->kern_data_ptr, M_CTL);
8475 ctl_set_reservation_conflict(ctsio);
8476 ctl_done((union ctl_io *)ctsio);
8497 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8529 free(ctsio->kern_data_ptr, M_CTL);
8530 ctl_set_illegal_pr_release(ctsio);
8531 ctl_done((union ctl_io *)ctsio);
8555 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8580 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8592 residx, ctsio, cdb, param);
8602 free(ctsio->kern_data_ptr, M_CTL);
8603 ctl_set_success(ctsio);
8604 ctl_done((union ctl_io *)ctsio);
8737 ctl_read_write(struct ctl_scsiio *ctsio)
8739 struct ctl_lun *lun = CTL_LUN(ctsio);
8746 CTL_DEBUG_PRINT(("ctl_read_write: command: %#x\n", ctsio->cdb[0]));
8749 isread = ctsio->cdb[0] == READ_6 || ctsio->cdb[0] == READ_10
8750 || ctsio->cdb[0] == READ_12 || ctsio->cdb[0] == READ_16;
8751 switch (ctsio->cdb[0]) {
8756 cdb = (struct scsi_rw_6 *)ctsio->cdb;
8773 cdb = (struct scsi_rw_10 *)ctsio->cdb;
8785 cdb = (struct scsi_write_verify_10 *)ctsio->cdb;
8797 cdb = (struct scsi_rw_12 *)ctsio->cdb;
8809 cdb = (struct scsi_write_verify_12 *)ctsio->cdb;
8821 cdb = (struct scsi_rw_16 *)ctsio->cdb;
8834 ctl_set_invalid_opcode(ctsio);
8835 ctl_done((union ctl_io *)ctsio);
8839 cdb = (struct scsi_write_atomic_16 *)ctsio->cdb;
8847 ctl_set_invalid_field(ctsio, /*sks_valid*/ 1,
8850 ctl_done((union ctl_io *)ctsio);
8858 cdb = (struct scsi_write_verify_16 *)ctsio->cdb;
8871 ctl_set_invalid_opcode(ctsio);
8872 ctl_done((union ctl_io *)ctsio);
8886 ctl_set_lba_out_of_range(ctsio,
8888 ctl_done((union ctl_io *)ctsio);
8898 ctl_set_success(ctsio);
8899 ctl_done((union ctl_io *)ctsio);
8913 &ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
8918 ctsio->kern_total_len = num_blocks * lun->be_lun->blocksize;
8919 ctsio->kern_rel_offset = 0;
8923 retval = lun->backend->data_submit((union ctl_io *)ctsio);
8931 struct ctl_scsiio *ctsio;
8937 ctsio = &io->scsiio;
8938 ctsio->io_hdr.status = CTL_STATUS_NONE;
8939 ctsio->io_hdr.flags &= ~CTL_FLAG_IO_CONT;
8941 &ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
8946 retval = lun->backend->data_submit((union ctl_io *)ctsio);
8951 ctl_cnw(struct ctl_scsiio *ctsio)
8953 struct ctl_lun *lun = CTL_LUN(ctsio);
8959 CTL_DEBUG_PRINT(("ctl_cnw: command: %#x\n", ctsio->cdb[0]));
8962 switch (ctsio->cdb[0]) {
8966 cdb = (struct scsi_compare_and_write *)ctsio->cdb;
8980 ctl_set_invalid_opcode(ctsio);
8981 ctl_done((union ctl_io *)ctsio);
8995 ctl_set_lba_out_of_range(ctsio,
8997 ctl_done((union ctl_io *)ctsio);
9005 ctl_set_success(ctsio);
9006 ctl_done((union ctl_io *)ctsio);
9014 ctsio->kern_total_len = 2 * num_blocks * lun->be_lun->blocksize;
9015 ctsio->kern_rel_offset = 0;
9022 ctsio->io_hdr.flags |= CTL_FLAG_IO_CONT;
9023 ctsio->io_cont = ctl_cnw_cont;
9026 &ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
9032 retval = lun->backend->data_submit((union ctl_io *)ctsio);
9037 ctl_verify(struct ctl_scsiio *ctsio)
9039 struct ctl_lun *lun = CTL_LUN(ctsio);
9046 CTL_DEBUG_PRINT(("ctl_verify: command: %#x\n", ctsio->cdb[0]));
9050 switch (ctsio->cdb[0]) {
9054 cdb = (struct scsi_verify_10 *)ctsio->cdb;
9066 cdb = (struct scsi_verify_12 *)ctsio->cdb;
9078 cdb = (struct scsi_rw_16 *)ctsio->cdb;
9092 ctl_set_invalid_opcode(ctsio);
9093 ctl_done((union ctl_io *)ctsio);
9105 ctl_set_lba_out_of_range(ctsio,
9107 ctl_done((union ctl_io *)ctsio);
9115 ctl_set_success(ctsio);
9116 ctl_done((union ctl_io *)ctsio);
9121 &ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
9126 ctsio->kern_total_len = num_blocks * lun->be_lun->blocksize;
9129 ctsio->kern_total_len = 0;
9131 ctsio->kern_rel_offset = 0;
9134 retval = lun->backend->data_submit((union ctl_io *)ctsio);
9139 ctl_report_luns(struct ctl_scsiio *ctsio)
9141 struct ctl_softc *softc = CTL_SOFTC(ctsio);
9142 struct ctl_port *port = CTL_PORT(ctsio);
9143 struct ctl_lun *lun, *request_lun = CTL_LUN(ctsio);
9151 cdb = (struct scsi_report_luns *)ctsio->cdb;
9175 ctl_set_invalid_field(ctsio,
9181 ctl_done((union ctl_io *)ctsio);
9194 ctl_set_invalid_field(ctsio,
9200 ctl_done((union ctl_io *)ctsio);
9207 ctsio->kern_data_ptr = malloc(lun_datalen, M_CTL, M_WAITOK | M_ZERO);
9208 lun_data = (struct scsi_report_luns_data *)ctsio->kern_data_ptr;
9209 ctsio->kern_sg_entries = 0;
9211 initidx = ctl_get_initindex(&ctsio->io_hdr.nexus);
9257 ctsio->kern_rel_offset = 0;
9258 ctsio->kern_sg_entries = 0;
9259 ctsio->kern_data_len = min(lun_datalen, alloc_len);
9260 ctsio->kern_total_len = ctsio->kern_data_len;
9275 ctl_set_success(ctsio);
9276 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9277 ctsio->be_move_done = ctl_config_move_done;
9278 ctl_datamove((union ctl_io *)ctsio);
9283 ctl_request_sense(struct ctl_scsiio *ctsio)
9285 struct ctl_softc *softc = CTL_SOFTC(ctsio);
9286 struct ctl_lun *lun = CTL_LUN(ctsio);
9296 cdb = (struct scsi_request_sense *)ctsio->cdb;
9308 ctsio->kern_data_ptr = malloc(sizeof(*sense_ptr), M_CTL, M_WAITOK);
9309 sense_ptr = (struct scsi_sense_data *)ctsio->kern_data_ptr;
9310 ctsio->kern_sg_entries = 0;
9311 ctsio->kern_rel_offset = 0;
9312 ctsio->kern_data_len = ctsio->kern_total_len =
9332 initidx = ctl_get_initindex(&ctsio->io_hdr.nexus);
9401 ctl_set_success(ctsio);
9402 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9403 ctsio->be_move_done = ctl_config_move_done;
9404 ctl_datamove((union ctl_io *)ctsio);
9409 ctl_tur(struct ctl_scsiio *ctsio)
9414 ctl_set_success(ctsio);
9415 ctl_done((union ctl_io *)ctsio);
9424 ctl_inquiry_evpd_supported(struct ctl_scsiio *ctsio, int alloc_len)
9426 struct ctl_lun *lun = CTL_LUN(ctsio);
9433 ctsio->kern_data_ptr = malloc(sup_page_size, M_CTL, M_WAITOK | M_ZERO);
9434 pages = (struct scsi_vpd_supported_pages *)ctsio->kern_data_ptr;
9435 ctsio->kern_rel_offset = 0;
9436 ctsio->kern_sg_entries = 0;
9437 ctsio->kern_data_len = min(sup_page_size, alloc_len);
9438 ctsio->kern_total_len = ctsio->kern_data_len;
9478 ctl_set_success(ctsio);
9479 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9480 ctsio->be_move_done = ctl_config_move_done;
9481 ctl_datamove((union ctl_io *)ctsio);
9489 ctl_inquiry_evpd_serial(struct ctl_scsiio *ctsio, int alloc_len)
9491 struct ctl_lun *lun = CTL_LUN(ctsio);
9496 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
9497 sn_ptr = (struct scsi_vpd_unit_serial_number *)ctsio->kern_data_ptr;
9498 ctsio->kern_rel_offset = 0;
9499 ctsio->kern_sg_entries = 0;
9500 ctsio->kern_data_len = min(data_len, alloc_len);
9501 ctsio->kern_total_len = ctsio->kern_data_len;
9526 ctl_set_success(ctsio);
9527 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9528 ctsio->be_move_done = ctl_config_move_done;
9529 ctl_datamove((union ctl_io *)ctsio);
9537 ctl_inquiry_evpd_eid(struct ctl_scsiio *ctsio, int alloc_len)
9539 struct ctl_lun *lun = CTL_LUN(ctsio);
9544 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
9545 eid_ptr = (struct scsi_vpd_extended_inquiry_data *)ctsio->kern_data_ptr;
9546 ctsio->kern_sg_entries = 0;
9547 ctsio->kern_rel_offset = 0;
9548 ctsio->kern_data_len = min(data_len, alloc_len);
9549 ctsio->kern_total_len = ctsio->kern_data_len;
9593 ctl_set_success(ctsio);
9594 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9595 ctsio->be_move_done = ctl_config_move_done;
9596 ctl_datamove((union ctl_io *)ctsio);
9601 ctl_inquiry_evpd_mpp(struct ctl_scsiio *ctsio, int alloc_len)
9603 struct ctl_lun *lun = CTL_LUN(ctsio);
9610 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
9611 mpp_ptr = (struct scsi_vpd_mode_page_policy *)ctsio->kern_data_ptr;
9612 ctsio->kern_rel_offset = 0;
9613 ctsio->kern_sg_entries = 0;
9614 ctsio->kern_data_len = min(data_len, alloc_len);
9615 ctsio->kern_total_len = ctsio->kern_data_len;
9632 ctl_set_success(ctsio);
9633 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9634 ctsio->be_move_done = ctl_config_move_done;
9635 ctl_datamove((union ctl_io *)ctsio);
9643 ctl_inquiry_evpd_devid(struct ctl_scsiio *ctsio, int alloc_len)
9645 struct ctl_softc *softc = CTL_SOFTC(ctsio);
9646 struct ctl_port *port = CTL_PORT(ctsio);
9647 struct ctl_lun *lun = CTL_LUN(ctsio);
9665 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
9666 devid_ptr = (struct scsi_vpd_device_id *)ctsio->kern_data_ptr;
9667 ctsio->kern_sg_entries = 0;
9668 ctsio->kern_rel_offset = 0;
9669 ctsio->kern_sg_entries = 0;
9670 ctsio->kern_data_len = min(data_len, alloc_len);
9671 ctsio->kern_total_len = ctsio->kern_data_len;
9721 scsi_ulto2b(ctsio->io_hdr.nexus.targ_port, &desc->identifier[2]);
9736 g = 2 + ctsio->io_hdr.nexus.targ_port / softc->port_cnt;
9748 ctl_set_success(ctsio);
9749 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9750 ctsio->be_move_done = ctl_config_move_done;
9751 ctl_datamove((union ctl_io *)ctsio);
9756 ctl_inquiry_evpd_scsi_ports(struct ctl_scsiio *ctsio, int alloc_len)
9758 struct ctl_softc *softc = CTL_SOFTC(ctsio);
9759 struct ctl_lun *lun = CTL_LUN(ctsio);
9787 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
9788 sp = (struct scsi_vpd_scsi_ports *)ctsio->kern_data_ptr;
9789 ctsio->kern_sg_entries = 0;
9790 ctsio->kern_rel_offset = 0;
9791 ctsio->kern_sg_entries = 0;
9792 ctsio->kern_data_len = min(data_len, alloc_len);
9793 ctsio->kern_total_len = ctsio->kern_data_len;
9840 ctl_set_success(ctsio);
9841 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9842 ctsio->be_move_done = ctl_config_move_done;
9843 ctl_datamove((union ctl_io *)ctsio);
9848 ctl_inquiry_evpd_sfs(struct ctl_scsiio *ctsio, int alloc_len)
9850 struct ctl_lun *lun = CTL_LUN(ctsio);
9855 ctsio->kern_data_ptr = malloc(sfs_page_size, M_CTL, M_WAITOK | M_ZERO);
9856 sfs_ptr = (struct scsi_vpd_sfs *)ctsio->kern_data_ptr;
9857 ctsio->kern_sg_entries = 0;
9858 ctsio->kern_rel_offset = 0;
9859 ctsio->kern_sg_entries = 0;
9860 ctsio->kern_data_len = min(sfs_page_size, alloc_len);
9861 ctsio->kern_total_len = ctsio->kern_data_len;
9892 ctl_set_success(ctsio);
9893 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9894 ctsio->be_move_done = ctl_config_move_done;
9895 ctl_datamove((union ctl_io *)ctsio);
9900 ctl_inquiry_evpd_block_limits(struct ctl_scsiio *ctsio, int alloc_len)
9902 struct ctl_lun *lun = CTL_LUN(ctsio);
9907 ctsio->kern_data_ptr = malloc(sizeof(*bl_ptr), M_CTL, M_WAITOK | M_ZERO);
9908 bl_ptr = (struct scsi_vpd_block_limits *)ctsio->kern_data_ptr;
9909 ctsio->kern_sg_entries = 0;
9910 ctsio->kern_rel_offset = 0;
9911 ctsio->kern_sg_entries = 0;
9912 ctsio->kern_data_len = min(sizeof(*bl_ptr), alloc_len);
9913 ctsio->kern_total_len = ctsio->kern_data_len;
9968 ctl_set_success(ctsio);
9969 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9970 ctsio->be_move_done = ctl_config_move_done;
9971 ctl_datamove((union ctl_io *)ctsio);
9976 ctl_inquiry_evpd_bdc(struct ctl_scsiio *ctsio, int alloc_len)
9978 struct ctl_lun *lun = CTL_LUN(ctsio);
9983 ctsio->kern_data_ptr = malloc(sizeof(*bdc_ptr), M_CTL, M_WAITOK | M_ZERO);
9984 bdc_ptr = (struct scsi_vpd_block_device_characteristics *)ctsio->kern_data_ptr;
9985 ctsio->kern_sg_entries = 0;
9986 ctsio->kern_rel_offset = 0;
9987 ctsio->kern_data_len = min(sizeof(*bdc_ptr), alloc_len);
9988 ctsio->kern_total_len = ctsio->kern_data_len;
10016 ctl_set_success(ctsio);
10017 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
10018 ctsio->be_move_done = ctl_config_move_done;
10019 ctl_datamove((union ctl_io *)ctsio);
10024 ctl_inquiry_evpd_lbp(struct ctl_scsiio *ctsio, int alloc_len)
10026 struct ctl_lun *lun = CTL_LUN(ctsio);
10030 ctsio->kern_data_ptr = malloc(sizeof(*lbp_ptr), M_CTL, M_WAITOK | M_ZERO);
10031 lbp_ptr = (struct scsi_vpd_logical_block_prov *)ctsio->kern_data_ptr;
10032 ctsio->kern_sg_entries = 0;
10033 ctsio->kern_rel_offset = 0;
10034 ctsio->kern_data_len = min(sizeof(*lbp_ptr), alloc_len);
10035 ctsio->kern_total_len = ctsio->kern_data_len;
10065 ctl_set_success(ctsio);
10066 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
10067 ctsio->be_move_done = ctl_config_move_done;
10068 ctl_datamove((union ctl_io *)ctsio);
10076 ctl_inquiry_evpd(struct ctl_scsiio *ctsio)
10078 struct ctl_lun *lun = CTL_LUN(ctsio);
10082 cdb = (struct scsi_inquiry *)ctsio->cdb;
10087 retval = ctl_inquiry_evpd_supported(ctsio, alloc_len);
10090 retval = ctl_inquiry_evpd_serial(ctsio, alloc_len);
10093 retval = ctl_inquiry_evpd_devid(ctsio, alloc_len);
10096 retval = ctl_inquiry_evpd_eid(ctsio, alloc_len);
10099 retval = ctl_inquiry_evpd_mpp(ctsio, alloc_len);
10102 retval = ctl_inquiry_evpd_scsi_ports(ctsio, alloc_len);
10105 retval = ctl_inquiry_evpd_tpc(ctsio, alloc_len);
10108 retval = ctl_inquiry_evpd_sfs(ctsio, alloc_len);
10113 retval = ctl_inquiry_evpd_block_limits(ctsio, alloc_len);
10118 retval = ctl_inquiry_evpd_bdc(ctsio, alloc_len);
10123 retval = ctl_inquiry_evpd_lbp(ctsio, alloc_len);
10127 ctl_set_invalid_field(ctsio,
10133 ctl_done((union ctl_io *)ctsio);
10145 ctl_inquiry_std(struct ctl_scsiio *ctsio)
10147 struct ctl_softc *softc = CTL_SOFTC(ctsio);
10148 struct ctl_port *port = CTL_PORT(ctsio);
10149 struct ctl_lun *lun = CTL_LUN(ctsio);
10160 cdb = (struct scsi_inquiry *)ctsio->cdb;
10169 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
10170 inq_ptr = (struct scsi_inquiry_data *)ctsio->kern_data_ptr;
10171 ctsio->kern_sg_entries = 0;
10172 ctsio->kern_rel_offset = 0;
10173 ctsio->kern_data_len = min(data_len, alloc_len);
10174 ctsio->kern_total_len = ctsio->kern_data_len;
10331 ctl_set_success(ctsio);
10332 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
10333 ctsio->be_move_done = ctl_config_move_done;
10334 ctl_datamove((union ctl_io *)ctsio);
10339 ctl_inquiry(struct ctl_scsiio *ctsio)
10346 cdb = (struct scsi_inquiry *)ctsio->cdb;
10348 retval = ctl_inquiry_evpd(ctsio);
10350 retval = ctl_inquiry_std(ctsio);
10352 ctl_set_invalid_field(ctsio,
10358 ctl_done((union ctl_io *)ctsio);
10366 ctl_get_config(struct ctl_scsiio *ctsio)
10368 struct ctl_lun *lun = CTL_LUN(ctsio);
10375 cdb = (struct scsi_get_config *)ctsio->cdb;
10393 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
10394 ctsio->kern_sg_entries = 0;
10395 ctsio->kern_rel_offset = 0;
10397 hdr = (struct scsi_get_config_header *)ctsio->kern_data_ptr;
10562 ctsio->kern_data_len = min(data_len, alloc_len);
10563 ctsio->kern_total_len = ctsio->kern_data_len;
10565 ctl_set_success(ctsio);
10566 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
10567 ctsio->be_move_done = ctl_config_move_done;
10568 ctl_datamove((union ctl_io *)ctsio);
10573 ctl_get_event_status(struct ctl_scsiio *ctsio)
10579 cdb = (struct scsi_get_event_status *)ctsio->cdb;
10581 ctl_set_invalid_field(ctsio, /*sks_valid*/ 1, /*command*/ 1,
10583 ctl_done((union ctl_io *)ctsio);
10589 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
10590 ctsio->kern_sg_entries = 0;
10591 ctsio->kern_rel_offset = 0;
10592 ctsio->kern_data_len = min(data_len, alloc_len);
10593 ctsio->kern_total_len = ctsio->kern_data_len;
10595 hdr = (struct scsi_get_event_status_header *)ctsio->kern_data_ptr;
10600 ctl_set_success(ctsio);
10601 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
10602 ctsio->be_move_done = ctl_config_move_done;
10603 ctl_datamove((union ctl_io *)ctsio);
10608 ctl_mechanism_status(struct ctl_scsiio *ctsio)
10614 cdb = (struct scsi_mechanism_status *)ctsio->cdb;
10618 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
10619 ctsio->kern_sg_entries = 0;
10620 ctsio->kern_rel_offset = 0;
10621 ctsio->kern_data_len = min(data_len, alloc_len);
10622 ctsio->kern_total_len = ctsio->kern_data_len;
10624 hdr = (struct scsi_mechanism_status_header *)ctsio->kern_data_ptr;
10631 ctl_set_success(ctsio);
10632 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
10633 ctsio->be_move_done = ctl_config_move_done;
10634 ctl_datamove((union ctl_io *)ctsio);
10650 ctl_read_toc(struct ctl_scsiio *ctsio)
10652 struct ctl_lun *lun = CTL_LUN(ctsio);
10659 cdb = (struct scsi_read_toc *)ctsio->cdb;
10669 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
10670 ctsio->kern_sg_entries = 0;
10671 ctsio->kern_rel_offset = 0;
10672 ctsio->kern_data_len = min(data_len, alloc_len);
10673 ctsio->kern_total_len = ctsio->kern_data_len;
10675 hdr = (struct scsi_read_toc_hdr *)ctsio->kern_data_ptr;
10707 ctl_set_success(ctsio);
10708 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
10709 ctsio->be_move_done = ctl_config_move_done;
10710 ctl_datamove((union ctl_io *)ctsio);
12053 const struct ctl_cmd_entry *entry, struct ctl_scsiio *ctsio)
12070 ctl_set_lun_unavail(ctsio);
12076 ctl_set_lun_transit(ctsio);
12082 ctl_set_lun_standby(ctsio);
12094 ctl_set_hw_write_protected(ctsio);
12099 ctl_set_sense(ctsio, /*current_error*/ 1,
12112 residx = ctl_get_initindex(&ctsio->io_hdr.nexus);
12116 ctl_set_reservation_conflict(ctsio);
12138 ctl_set_reservation_conflict(ctsio);
12146 ctl_set_lun_ejected(ctsio);
12149 ctl_set_lun_no_media(ctsio);
12151 ctl_set_lun_int_reqd(ctsio);
12153 ctl_set_lun_stopped(ctsio);
12256 ctl_scsiio_precheck(struct ctl_scsiio *ctsio)
12258 struct ctl_softc *softc = CTL_SOFTC(ctsio);
12265 targ_lun = ctsio->io_hdr.nexus.targ_mapped_lun;
12280 CTL_LUN(ctsio) = lun;
12282 CTL_BACKEND_LUN(ctsio) = lun->be_lun;
12292 LIST_INSERT_HEAD(&lun->ooa_queue, &ctsio->io_hdr, ooa_links);
12296 entry = ctl_validate_command(ctsio);
12303 ctsio->io_hdr.flags &= ~CTL_FLAG_DATA_MASK;
12304 ctsio->io_hdr.flags |= entry->flags & CTL_FLAG_DATA_MASK;
12315 ctsio->io_hdr.flags |= CTL_FLAG_IS_WAS_ON_RTR;
12316 ctl_enqueue_rtr((union ctl_io *)ctsio);
12320 ctl_set_unsupported_lun(ctsio);
12321 ctl_done((union ctl_io *)ctsio);
12331 ctl_set_invalid_opcode(ctsio);
12332 ctl_done((union ctl_io *)ctsio);
12337 initidx = ctl_get_initindex(&ctsio->io_hdr.nexus);
12345 if (ctsio->cdb[0] != REQUEST_SENSE) {
12379 ua_type = ctl_build_ua(lun, initidx, &ctsio->sense_data,
12383 ctsio->scsi_status = SCSI_STATUS_CHECK_COND;
12384 ctsio->io_hdr.status = CTL_SCSI_ERROR | CTL_AUTOSENSE;
12385 ctsio->sense_len = sense_len;
12386 ctl_done((union ctl_io *)ctsio);
12391 if (ctl_scsiio_lun_check(lun, entry, ctsio) != 0) {
12393 ctl_done((union ctl_io *)ctsio);
12412 ctsio->io_hdr.flags |= CTL_FLAG_SENT_2OTHER_SC;
12413 ctsio->io_hdr.flags &= ~CTL_FLAG_IO_ACTIVE;
12417 msg_info.hdr.original_sc = (union ctl_io *)ctsio;
12419 msg_info.hdr.nexus = ctsio->io_hdr.nexus;
12420 msg_info.scsi.tag_num = ctsio->tag_num;
12421 msg_info.scsi.tag_type = ctsio->tag_type;
12422 memcpy(msg_info.scsi.cdb, ctsio->cdb, CTL_MAX_CDBLEN);
12423 msg_info.scsi.cdb_len = ctsio->cdb_len;
12424 msg_info.scsi.priority = ctsio->priority;
12429 ctsio->io_hdr.flags &= ~CTL_FLAG_SENT_2OTHER_SC;
12430 ctsio->io_hdr.flags |= CTL_FLAG_IO_ACTIVE;
12431 ctl_set_busy(ctsio);
12432 ctl_done((union ctl_io *)ctsio);
12438 bio = (union ctl_io *)LIST_NEXT(&ctsio->io_hdr, ooa_links);
12439 switch (ctl_check_ooa(lun, (union ctl_io *)ctsio, &bio)) {
12442 ctsio->io_hdr.flags |= CTL_FLAG_IS_WAS_ON_RTR;
12444 ctl_enqueue_rtr((union ctl_io *)ctsio);
12447 ctsio->io_hdr.blocker = bio;
12448 TAILQ_INSERT_TAIL(&bio->io_hdr.blocked_queue, &ctsio->io_hdr,
12454 ctl_set_overlapped_cmd(ctsio);
12455 ctl_done((union ctl_io *)ctsio);
12459 ctl_set_overlapped_tag(ctsio, ctsio->tag_num & 0xff);
12460 ctl_done((union ctl_io *)ctsio);
12468 ctl_get_cmd_entry(struct ctl_scsiio *ctsio, int *sa)
12473 entry = &ctl_cmd_table[ctsio->cdb[0]];
12477 service_action = ctsio->cdb[1] & SERVICE_ACTION_MASK;
12485 ctl_validate_command(struct ctl_scsiio *ctsio)
12491 entry = ctl_get_cmd_entry(ctsio, &sa);
12492 ctsio->seridx = entry->seridx;
12495 ctl_set_invalid_field(ctsio,
12502 ctl_set_invalid_opcode(ctsio);
12503 ctl_done((union ctl_io *)ctsio);
12508 ctsio->cdb[0], ctsio->cdb[1]));
12510 diff = ctsio->cdb[i] & ~entry->usage[i - 1];
12513 ctl_set_invalid_field(ctsio,
12519 ctl_done((union ctl_io *)ctsio);
12549 ctl_scsiio(struct ctl_scsiio *ctsio)
12556 CTL_DEBUG_PRINT(("ctl_scsiio cdb[0]=%02X\n", ctsio->cdb[0]));
12558 entry = ctl_get_cmd_entry(ctsio, NULL);
12564 if (ctsio->io_hdr.flags & CTL_FLAG_ABORT) {
12565 ctl_done((union ctl_io *)ctsio);
12573 retval = entry->execute(ctsio);
13137 ctl_cmd_pattern_match(struct ctl_scsiio *ctsio, struct ctl_error_desc *desc)
13155 entry = ctl_get_cmd_entry(ctsio, NULL);
13181 retval = ctl_get_lba_len((union ctl_io *)ctsio, &lba1, &len1);