Lines Matching defs:ctsio

458 static void ctl_serialize_other_sc_cmd(struct ctl_scsiio *ctsio);
472 struct ctl_scsiio *ctsio,
478 static int ctl_inquiry_evpd_supported(struct ctl_scsiio *ctsio, int alloc_len);
479 static int ctl_inquiry_evpd_serial(struct ctl_scsiio *ctsio, int alloc_len);
480 static int ctl_inquiry_evpd_devid(struct ctl_scsiio *ctsio, int alloc_len);
481 static int ctl_inquiry_evpd_eid(struct ctl_scsiio *ctsio, int alloc_len);
482 static int ctl_inquiry_evpd_mpp(struct ctl_scsiio *ctsio, int alloc_len);
483 static int ctl_inquiry_evpd_scsi_ports(struct ctl_scsiio *ctsio,
485 static int ctl_inquiry_evpd_block_limits(struct ctl_scsiio *ctsio,
487 static int ctl_inquiry_evpd_bdc(struct ctl_scsiio *ctsio, int alloc_len);
488 static int ctl_inquiry_evpd_lbp(struct ctl_scsiio *ctsio, int alloc_len);
489 static int ctl_inquiry_evpd(struct ctl_scsiio *ctsio);
490 static int ctl_inquiry_std(struct ctl_scsiio *ctsio);
505 struct ctl_scsiio *ctsio);
508 struct ctl_scsiio *ctsio);
509 static int ctl_scsiio(struct ctl_scsiio *ctsio);
547 ctl_get_cmd_entry(struct ctl_scsiio *ctsio, int *sa);
549 ctl_validate_command(struct ctl_scsiio *ctsio);
786 struct ctl_scsiio *ctsio;
794 ctsio = &msg_info->hdr.original_sc->scsiio;
795 ctsio->io_hdr.flags |= CTL_FLAG_IO_ACTIVE;
796 ctsio->io_hdr.msg_type = CTL_MSG_FINISH_IO;
797 ctsio->io_hdr.status = msg_info->hdr.status;
798 ctsio->scsi_status = msg_info->scsi.scsi_status;
799 ctsio->sense_len = msg_info->scsi.sense_len;
800 memcpy(&ctsio->sense_data, &msg_info->scsi.sense_data,
802 ctl_enqueue_isc((union ctl_io *)ctsio);
809 struct ctl_scsiio *ctsio;
817 ctsio = &msg_info->hdr.serializing_sc->scsiio;
818 ctsio->io_hdr.msg_type = CTL_MSG_FINISH_IO;
819 ctl_enqueue_isc((union ctl_io *)ctsio);
1436 // populate ctsio from msg
2259 ctl_serialize_other_sc_cmd(struct ctl_scsiio *ctsio)
2261 struct ctl_softc *softc = CTL_SOFTC(ctsio);
2262 struct ctl_port *port = CTL_PORT(ctsio);
2269 targ_lun = ctsio->io_hdr.nexus.targ_mapped_lun;
2273 ctl_set_internal_failure(ctsio, /*sks_valid*/ 0,
2290 ctl_set_busy(ctsio);
2302 ctl_set_busy(ctsio);
2306 entry = ctl_get_cmd_entry(ctsio, NULL);
2307 if (ctl_scsiio_lun_check(lun, entry, ctsio) != 0) {
2312 CTL_LUN(ctsio) = lun;
2313 CTL_BACKEND_LUN(ctsio) = lun->be_lun;
2323 TAILQ_INSERT_TAIL(&lun->ooa_queue, &ctsio->io_hdr, ooa_links);
2325 bio = (union ctl_io *)TAILQ_PREV(&ctsio->io_hdr, ctl_ooaq, ooa_links);
2326 switch (ctl_check_ooa(lun, (union ctl_io *)ctsio, &bio)) {
2328 ctsio->io_hdr.blocker = bio;
2329 TAILQ_INSERT_TAIL(&bio->io_hdr.blocked_queue, &ctsio->io_hdr,
2336 ctsio->io_hdr.flags |= CTL_FLAG_IS_WAS_ON_RTR;
2337 ctl_enqueue_rtr((union ctl_io *)ctsio);
2340 ctsio->io_hdr.flags &= ~CTL_FLAG_IO_ACTIVE;
2344 msg_info.hdr.original_sc = ctsio->io_hdr.remote_io;
2345 msg_info.hdr.serializing_sc = (union ctl_io *)ctsio;
2352 TAILQ_REMOVE(&lun->ooa_queue, &ctsio->io_hdr, ooa_links);
2354 ctl_set_overlapped_cmd(ctsio);
2357 TAILQ_REMOVE(&lun->ooa_queue, &ctsio->io_hdr, ooa_links);
2359 ctl_set_overlapped_tag(ctsio, ctsio->tag_num);
2363 TAILQ_REMOVE(&lun->ooa_queue, &ctsio->io_hdr, ooa_links);
2366 ctl_set_internal_failure(ctsio, /*sks_valid*/ 0,
2369 ctl_copy_sense_data_back((union ctl_io *)ctsio, &msg_info);
2370 msg_info.hdr.original_sc = ctsio->io_hdr.remote_io;
2375 ctl_free_io((union ctl_io *)ctsio);
5209 ctl_scsi_release(struct ctl_scsiio *ctsio)
5211 struct ctl_lun *lun = CTL_LUN(ctsio);
5216 residx = ctl_get_initindex(&ctsio->io_hdr.nexus);
5240 ctl_set_success(ctsio);
5241 ctl_done((union ctl_io *)ctsio);
5246 ctl_scsi_reserve(struct ctl_scsiio *ctsio)
5248 struct ctl_lun *lun = CTL_LUN(ctsio);
5253 residx = ctl_get_initindex(&ctsio->io_hdr.nexus);
5265 ctl_set_reservation_conflict(ctsio);
5271 ctl_set_success(ctsio);
5277 ctl_set_success(ctsio);
5281 ctl_done((union ctl_io *)ctsio);
5286 ctl_start_stop(struct ctl_scsiio *ctsio)
5288 struct ctl_lun *lun = CTL_LUN(ctsio);
5294 cdb = (struct scsi_start_stop_unit *)ctsio->cdb;
5301 residx = ctl_get_initindex(&ctsio->io_hdr.nexus);
5305 ctl_set_reservation_conflict(ctsio);
5306 ctl_done((union ctl_io *)ctsio);
5313 ctl_set_invalid_field(ctsio,
5319 ctl_done((union ctl_io *)ctsio);
5326 ctl_set_sense(ctsio, /*current_error*/ 1,
5330 ctl_done((union ctl_io *)ctsio);
5335 retval = lun->backend->config_write((union ctl_io *)ctsio);
5340 ctl_prevent_allow(struct ctl_scsiio *ctsio)
5342 struct ctl_lun *lun = CTL_LUN(ctsio);
5349 cdb = (struct scsi_prevent *)ctsio->cdb;
5352 ctl_set_invalid_opcode(ctsio);
5353 ctl_done((union ctl_io *)ctsio);
5357 initidx = ctl_get_initindex(&ctsio->io_hdr.nexus);
5369 retval = lun->backend->config_write((union ctl_io *)ctsio);
5380 ctl_sync_cache(struct ctl_scsiio *ctsio)
5382 struct ctl_lun *lun = CTL_LUN(ctsio);
5393 switch (ctsio->cdb[0]) {
5396 cdb = (struct scsi_sync_cache *)ctsio->cdb;
5405 cdb = (struct scsi_sync_cache_16 *)ctsio->cdb;
5413 ctl_set_invalid_opcode(ctsio);
5414 ctl_done((union ctl_io *)ctsio);
5426 ctl_set_lba_out_of_range(ctsio,
5428 ctl_done((union ctl_io *)ctsio);
5432 lbalen = (struct ctl_lba_len_flags *)&ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
5436 retval = lun->backend->config_write((union ctl_io *)ctsio);
5443 ctl_format(struct ctl_scsiio *ctsio)
5450 cdb = (struct scsi_format *)ctsio->cdb;
5460 if (((ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0)
5462 ctsio->kern_data_ptr = malloc(length, M_CTL, M_WAITOK);
5463 ctsio->kern_data_len = length;
5464 ctsio->kern_total_len = length;
5465 ctsio->kern_rel_offset = 0;
5466 ctsio->kern_sg_entries = 0;
5467 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
5468 ctsio->be_move_done = ctl_config_move_done;
5469 ctl_datamove((union ctl_io *)ctsio);
5481 ctsio->kern_data_ptr;
5485 ctl_set_invalid_field(ctsio,
5497 ctsio->kern_data_ptr;
5501 ctl_set_invalid_field(ctsio,
5512 ctl_set_success(ctsio);
5515 if (ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) {
5516 free(ctsio->kern_data_ptr, M_CTL);
5517 ctsio->io_hdr.flags &= ~CTL_FLAG_ALLOCATED;
5520 ctl_done((union ctl_io *)ctsio);
5525 ctl_read_buffer(struct ctl_scsiio *ctsio)
5527 struct ctl_lun *lun = CTL_LUN(ctsio);
5536 switch (ctsio->cdb[0]) {
5540 cdb = (struct scsi_read_buffer *)ctsio->cdb;
5549 cdb = (struct scsi_read_buffer_16 *)ctsio->cdb;
5556 ctl_set_invalid_opcode(ctsio);
5557 ctl_done((union ctl_io *)ctsio);
5563 ctl_set_invalid_field(ctsio,
5569 ctl_done((union ctl_io *)ctsio);
5576 ctsio->kern_data_ptr = descr;
5579 ctsio->kern_data_ptr = echo_descr;
5586 ctsio->kern_data_ptr = lun->write_buffer + buffer_offset;
5588 ctsio->kern_data_len = len;
5589 ctsio->kern_total_len = len;
5590 ctsio->kern_rel_offset = 0;
5591 ctsio->kern_sg_entries = 0;
5592 ctl_set_success(ctsio);
5593 ctsio->be_move_done = ctl_config_move_done;
5594 ctl_datamove((union ctl_io *)ctsio);
5599 ctl_write_buffer(struct ctl_scsiio *ctsio)
5601 struct ctl_lun *lun = CTL_LUN(ctsio);
5607 cdb = (struct scsi_write_buffer *)ctsio->cdb;
5613 ctl_set_invalid_field(ctsio,
5619 ctl_done((union ctl_io *)ctsio);
5627 if ((ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0) {
5632 ctsio->kern_data_ptr = lun->write_buffer + buffer_offset;
5633 ctsio->kern_data_len = len;
5634 ctsio->kern_total_len = len;
5635 ctsio->kern_rel_offset = 0;
5636 ctsio->kern_sg_entries = 0;
5637 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
5638 ctsio->be_move_done = ctl_config_move_done;
5639 ctl_datamove((union ctl_io *)ctsio);
5644 ctl_set_success(ctsio);
5645 ctl_done((union ctl_io *)ctsio);
5650 ctl_write_same(struct ctl_scsiio *ctsio)
5652 struct ctl_lun *lun = CTL_LUN(ctsio);
5661 switch (ctsio->cdb[0]) {
5665 cdb = (struct scsi_write_same_10 *)ctsio->cdb;
5675 cdb = (struct scsi_write_same_16 *)ctsio->cdb;
5687 ctl_set_invalid_opcode(ctsio);
5688 ctl_done((union ctl_io *)ctsio);
5696 ctl_set_invalid_field(ctsio, /*sks_valid*/ 1,
5698 ctl_done((union ctl_io *)ctsio);
5710 ctl_set_lba_out_of_range(ctsio,
5712 ctl_done((union ctl_io *)ctsio);
5719 ctl_set_invalid_field(ctsio,
5725 ctl_done((union ctl_io *)ctsio);
5738 (ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0) {
5739 ctsio->kern_data_ptr = malloc(len, M_CTL, M_WAITOK);
5740 ctsio->kern_data_len = len;
5741 ctsio->kern_total_len = len;
5742 ctsio->kern_rel_offset = 0;
5743 ctsio->kern_sg_entries = 0;
5744 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
5745 ctsio->be_move_done = ctl_config_move_done;
5746 ctl_datamove((union ctl_io *)ctsio);
5751 lbalen = (struct ctl_lba_len_flags *)&ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
5755 retval = lun->backend->config_write((union ctl_io *)ctsio);
5761 ctl_unmap(struct ctl_scsiio *ctsio)
5763 struct ctl_lun *lun = CTL_LUN(ctsio);
5775 cdb = (struct scsi_unmap *)ctsio->cdb;
5783 if ((ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0) {
5784 ctsio->kern_data_ptr = malloc(len, M_CTL, M_WAITOK);
5785 ctsio->kern_data_len = len;
5786 ctsio->kern_total_len = len;
5787 ctsio->kern_rel_offset = 0;
5788 ctsio->kern_sg_entries = 0;
5789 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
5790 ctsio->be_move_done = ctl_config_move_done;
5791 ctl_datamove((union ctl_io *)ctsio);
5796 len = ctsio->kern_total_len - ctsio->kern_data_resid;
5797 hdr = (struct scsi_unmap_header *)ctsio->kern_data_ptr;
5802 ctl_set_invalid_field(ctsio,
5820 ctl_set_lba_out_of_range(ctsio,
5822 ctl_done((union ctl_io *)ctsio);
5835 ctl_set_success(ctsio);
5841 &ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
5845 ctl_try_unblock_others(lun, (union ctl_io *)ctsio, FALSE);
5848 retval = lun->backend->config_write((union ctl_io *)ctsio);
5852 if (ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) {
5853 free(ctsio->kern_data_ptr, M_CTL);
5854 ctsio->io_hdr.flags &= ~CTL_FLAG_ALLOCATED;
5856 ctl_done((union ctl_io *)ctsio);
5861 ctl_default_page_handler(struct ctl_scsiio *ctsio,
5864 struct ctl_lun *lun = CTL_LUN(ctsio);
5869 initidx = ctl_get_initindex(&ctsio->io_hdr.nexus);
5885 ctl_get_initindex(&ctsio->io_hdr.nexus),
5915 ctl_ie_page_handler(struct ctl_scsiio *ctsio,
5918 struct ctl_lun *lun = CTL_LUN(ctsio);
5922 (void)ctl_default_page_handler(ctsio, page_index, page_ptr);
5963 struct ctl_scsiio *ctsio;
5969 ctsio = &io->scsiio;
5974 ctsio->io_hdr.ctl_private[CTL_PRIV_MODEPAGE].bytes;
5981 (ctsio->kern_data_ptr + *len_used);
5984 free(ctsio->kern_data_ptr, M_CTL);
5985 ctl_set_success(ctsio);
5986 ctl_done((union ctl_io *)ctsio);
5990 free(ctsio->kern_data_ptr, M_CTL);
5991 ctl_set_param_len_error(ctsio);
5992 ctl_done((union ctl_io *)ctsio);
5998 free(ctsio->kern_data_ptr, M_CTL);
5999 ctl_set_param_len_error(ctsio);
6000 ctl_done((union ctl_io *)ctsio);
6056 ctl_set_invalid_field(ctsio,
6062 free(ctsio->kern_data_ptr, M_CTL);
6063 ctl_done((union ctl_io *)ctsio);
6081 ctl_set_invalid_field(ctsio,
6087 free(ctsio->kern_data_ptr, M_CTL);
6088 ctl_done((union ctl_io *)ctsio);
6092 free(ctsio->kern_data_ptr, M_CTL);
6093 ctl_set_param_len_error(ctsio);
6094 ctl_done((union ctl_io *)ctsio);
6132 ctl_set_invalid_field(ctsio,
6138 free(ctsio->kern_data_ptr, M_CTL);
6139 ctl_done((union ctl_io *)ctsio);
6151 retval = page_index->select_handler(ctsio, page_index,
6171 ctl_set_success(ctsio);
6172 free(ctsio->kern_data_ptr, M_CTL);
6173 ctl_done((union ctl_io *)ctsio);
6182 ctl_mode_select(struct ctl_scsiio *ctsio)
6184 struct ctl_lun *lun = CTL_LUN(ctsio);
6189 initidx = ctl_get_initindex(&ctsio->io_hdr.nexus);
6190 switch (ctsio->cdb[0]) {
6194 cdb = (struct scsi_mode_select_6 *)ctsio->cdb;
6206 cdb = (struct scsi_mode_select_10 *)ctsio->cdb;
6216 ctl_set_invalid_opcode(ctsio);
6217 ctl_done((union ctl_io *)ctsio);
6223 ctl_set_invalid_field(ctsio, /*sks_valid*/ 0,
6226 ctl_done((union ctl_io *)ctsio);
6240 ctl_set_success(ctsio);
6241 ctl_done((union ctl_io *)ctsio);
6251 ctl_set_success(ctsio);
6252 ctl_done((union ctl_io *)ctsio);
6261 ctl_set_param_len_error(ctsio);
6262 ctl_done((union ctl_io *)ctsio);
6272 if ((ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0) {
6273 ctsio->kern_data_ptr = malloc(param_len, M_CTL, M_WAITOK);
6274 ctsio->kern_data_len = param_len;
6275 ctsio->kern_total_len = param_len;
6276 ctsio->kern_rel_offset = 0;
6277 ctsio->kern_sg_entries = 0;
6278 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
6279 ctsio->be_move_done = ctl_config_move_done;
6280 ctl_datamove((union ctl_io *)ctsio);
6285 switch (ctsio->cdb[0]) {
6289 mh6 = (struct scsi_mode_header_6 *)ctsio->kern_data_ptr;
6296 mh10 = (struct scsi_mode_header_10 *)ctsio->kern_data_ptr;
6301 panic("%s: Invalid CDB type %#x", __func__, ctsio->cdb[0]);
6305 free(ctsio->kern_data_ptr, M_CTL);
6306 ctl_set_param_len_error(ctsio);
6307 ctl_done((union ctl_io *)ctsio);
6317 ctsio->io_hdr.flags |= CTL_FLAG_IO_CONT;
6318 ctsio->io_cont = ctl_do_mode_select;
6321 ctsio->io_hdr.ctl_private[CTL_PRIV_MODEPAGE].bytes;
6326 return (ctl_do_mode_select((union ctl_io *)ctsio));
6330 ctl_mode_sense(struct ctl_scsiio *ctsio)
6332 struct ctl_lun *lun = CTL_LUN(ctsio);
6344 switch (ctsio->cdb[0]) {
6348 cdb = (struct scsi_mode_sense_6 *)ctsio->cdb;
6365 cdb = (struct scsi_mode_sense_10 *)ctsio->cdb;
6382 ctl_set_invalid_opcode(ctsio);
6383 ctl_done((union ctl_io *)ctsio);
6405 ctl_set_invalid_field(ctsio,
6411 ctl_done((union ctl_io *)ctsio);
6473 ctl_set_invalid_field(ctsio,
6479 ctl_done((union ctl_io *)ctsio);
6488 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
6489 ctsio->kern_sg_entries = 0;
6490 ctsio->kern_rel_offset = 0;
6491 ctsio->kern_data_len = min(total_len, alloc_len);
6492 ctsio->kern_total_len = ctsio->kern_data_len;
6494 switch (ctsio->cdb[0]) {
6498 header = (struct scsi_mode_hdr_6 *)ctsio->kern_data_ptr;
6519 header = (struct scsi_mode_hdr_10 *)ctsio->kern_data_ptr;
6538 panic("%s: Invalid CDB type %#x", __func__, ctsio->cdb[0]);
6587 page_index->sense_handler(ctsio, page_index,pc);
6589 memcpy(ctsio->kern_data_ptr + data_used,
6632 page_index->sense_handler(ctsio, page_index,pc);
6634 memcpy(ctsio->kern_data_ptr + data_used,
6644 ctl_set_success(ctsio);
6645 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
6646 ctsio->be_move_done = ctl_config_move_done;
6647 ctl_datamove((union ctl_io *)ctsio);
6652 ctl_lbp_log_sense_handler(struct ctl_scsiio *ctsio,
6656 struct ctl_lun *lun = CTL_LUN(ctsio);
6720 ctl_sap_log_sense_handler(struct ctl_scsiio *ctsio,
6724 struct ctl_lun *lun = CTL_LUN(ctsio);
6769 ctl_ie_log_sense_handler(struct ctl_scsiio *ctsio,
6773 struct ctl_lun *lun = CTL_LUN(ctsio);
6789 ctl_log_sense(struct ctl_scsiio *ctsio)
6791 struct ctl_lun *lun = CTL_LUN(ctsio);
6800 cdb = (struct scsi_log_sense *)ctsio->cdb;
6821 ctl_set_invalid_field(ctsio,
6827 ctl_done((union ctl_io *)ctsio);
6833 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
6834 ctsio->kern_sg_entries = 0;
6835 ctsio->kern_rel_offset = 0;
6836 ctsio->kern_data_len = min(total_len, alloc_len);
6837 ctsio->kern_total_len = ctsio->kern_data_len;
6839 header = (struct scsi_log_header *)ctsio->kern_data_ptr;
6854 page_index->sense_handler(ctsio, page_index, pc);
6858 ctl_set_success(ctsio);
6859 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
6860 ctsio->be_move_done = ctl_config_move_done;
6861 ctl_datamove((union ctl_io *)ctsio);
6866 ctl_read_capacity(struct ctl_scsiio *ctsio)
6868 struct ctl_lun *lun = CTL_LUN(ctsio);
6875 cdb = (struct scsi_read_capacity *)ctsio->cdb;
6880 ctl_set_invalid_field(/*ctsio*/ ctsio,
6886 ctl_done((union ctl_io *)ctsio);
6890 ctsio->kern_data_ptr = malloc(sizeof(*data), M_CTL, M_WAITOK | M_ZERO);
6891 data = (struct scsi_read_capacity_data *)ctsio->kern_data_ptr;
6892 ctsio->kern_data_len = sizeof(*data);
6893 ctsio->kern_total_len = sizeof(*data);
6894 ctsio->kern_rel_offset = 0;
6895 ctsio->kern_sg_entries = 0;
6912 ctl_set_success(ctsio);
6913 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
6914 ctsio->be_move_done = ctl_config_move_done;
6915 ctl_datamove((union ctl_io *)ctsio);
6920 ctl_read_capacity_16(struct ctl_scsiio *ctsio)
6922 struct ctl_lun *lun = CTL_LUN(ctsio);
6930 cdb = (struct scsi_read_capacity_16 *)ctsio->cdb;
6937 ctl_set_invalid_field(/*ctsio*/ ctsio,
6943 ctl_done((union ctl_io *)ctsio);
6947 ctsio->kern_data_ptr = malloc(sizeof(*data), M_CTL, M_WAITOK | M_ZERO);
6948 data = (struct scsi_read_capacity_data_long *)ctsio->kern_data_ptr;
6949 ctsio->kern_rel_offset = 0;
6950 ctsio->kern_sg_entries = 0;
6951 ctsio->kern_data_len = min(sizeof(*data), alloc_len);
6952 ctsio->kern_total_len = ctsio->kern_data_len;
6962 ctl_set_success(ctsio);
6963 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
6964 ctsio->be_move_done = ctl_config_move_done;
6965 ctl_datamove((union ctl_io *)ctsio);
6970 ctl_get_lba_status(struct ctl_scsiio *ctsio)
6972 struct ctl_lun *lun = CTL_LUN(ctsio);
6982 cdb = (struct scsi_get_lba_status *)ctsio->cdb;
6987 ctl_set_lba_out_of_range(ctsio, lba);
6988 ctl_done((union ctl_io *)ctsio);
6993 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
6994 data = (struct scsi_get_lba_status_data *)ctsio->kern_data_ptr;
6995 ctsio->kern_rel_offset = 0;
6996 ctsio->kern_sg_entries = 0;
6997 ctsio->kern_data_len = min(total_len, alloc_len);
6998 ctsio->kern_total_len = ctsio->kern_data_len;
7007 ctl_set_success(ctsio);
7008 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7009 ctsio->be_move_done = ctl_config_move_done;
7011 lbalen = (struct ctl_lba_len_flags *)&ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
7015 retval = lun->backend->config_read((union ctl_io *)ctsio);
7020 ctl_read_defect(struct ctl_scsiio *ctsio)
7031 if (ctsio->cdb[0] == READ_DEFECT_DATA_10) {
7032 ccb10 = (struct scsi_read_defect_data_10 *)&ctsio->cdb;
7037 ccb12 = (struct scsi_read_defect_data_12 *)&ctsio->cdb;
7043 ctl_set_success(ctsio);
7044 ctl_done((union ctl_io *)ctsio);
7048 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
7049 ctsio->kern_rel_offset = 0;
7050 ctsio->kern_sg_entries = 0;
7051 ctsio->kern_data_len = min(data_len, alloc_len);
7052 ctsio->kern_total_len = ctsio->kern_data_len;
7054 if (ctsio->cdb[0] == READ_DEFECT_DATA_10) {
7056 ctsio->kern_data_ptr;
7061 ctsio->kern_data_ptr;
7067 ctl_set_success(ctsio);
7068 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7069 ctsio->be_move_done = ctl_config_move_done;
7070 ctl_datamove((union ctl_io *)ctsio);
7075 ctl_report_tagret_port_groups(struct ctl_scsiio *ctsio)
7077 struct ctl_softc *softc = CTL_SOFTC(ctsio);
7078 struct ctl_lun *lun = CTL_LUN(ctsio);
7090 cdb = (struct scsi_maintenance_in *)ctsio->cdb;
7101 ctl_set_invalid_field(/*ctsio*/ ctsio,
7107 ctl_done((union ctl_io *)ctsio);
7136 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
7137 ctsio->kern_sg_entries = 0;
7138 ctsio->kern_rel_offset = 0;
7139 ctsio->kern_data_len = min(total_len, alloc_len);
7140 ctsio->kern_total_len = ctsio->kern_data_len;
7144 ctsio->kern_data_ptr;
7151 ctsio->kern_data_ptr;
7236 ctl_set_success(ctsio);
7237 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7238 ctsio->be_move_done = ctl_config_move_done;
7239 ctl_datamove((union ctl_io *)ctsio);
7244 ctl_report_supported_opcodes(struct ctl_scsiio *ctsio)
7246 struct ctl_lun *lun = CTL_LUN(ctsio);
7258 cdb = (struct scsi_report_supported_opcodes *)ctsio->cdb;
7287 ctl_set_invalid_field(/*ctsio*/ ctsio,
7293 ctl_done((union ctl_io *)ctsio);
7301 ctl_set_invalid_field(/*ctsio*/ ctsio,
7307 ctl_done((union ctl_io *)ctsio);
7315 ctl_set_invalid_field(/*ctsio*/ ctsio,
7321 ctl_done((union ctl_io *)ctsio);
7327 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
7328 ctsio->kern_sg_entries = 0;
7329 ctsio->kern_rel_offset = 0;
7330 ctsio->kern_data_len = min(total_len, alloc_len);
7331 ctsio->kern_total_len = ctsio->kern_data_len;
7336 ctsio->kern_data_ptr;
7371 ctsio->kern_data_ptr;
7376 ctsio->kern_data_ptr;
7392 ctsio->kern_data_ptr;
7404 ctl_set_success(ctsio);
7405 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7406 ctsio->be_move_done = ctl_config_move_done;
7407 ctl_datamove((union ctl_io *)ctsio);
7412 ctl_report_supported_tmf(struct ctl_scsiio *ctsio)
7421 cdb = (struct scsi_report_supported_tmf *)ctsio->cdb;
7431 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
7432 ctsio->kern_sg_entries = 0;
7433 ctsio->kern_rel_offset = 0;
7434 ctsio->kern_data_len = min(total_len, alloc_len);
7435 ctsio->kern_total_len = ctsio->kern_data_len;
7437 data = (struct scsi_report_supported_tmf_ext_data *)ctsio->kern_data_ptr;
7443 ctl_set_success(ctsio);
7444 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7445 ctsio->be_move_done = ctl_config_move_done;
7446 ctl_datamove((union ctl_io *)ctsio);
7451 ctl_report_timestamp(struct ctl_scsiio *ctsio)
7462 cdb = (struct scsi_report_timestamp *)ctsio->cdb;
7469 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
7470 ctsio->kern_sg_entries = 0;
7471 ctsio->kern_rel_offset = 0;
7472 ctsio->kern_data_len = min(total_len, alloc_len);
7473 ctsio->kern_total_len = ctsio->kern_data_len;
7475 data = (struct scsi_report_timestamp_data *)ctsio->kern_data_ptr;
7483 ctl_set_success(ctsio);
7484 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7485 ctsio->be_move_done = ctl_config_move_done;
7486 ctl_datamove((union ctl_io *)ctsio);
7491 ctl_persistent_reserve_in(struct ctl_scsiio *ctsio)
7493 struct ctl_softc *softc = CTL_SOFTC(ctsio);
7494 struct ctl_lun *lun = CTL_LUN(ctsio);
7502 cdb = (struct scsi_per_res_in *)ctsio->cdb;
7533 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
7534 ctsio->kern_rel_offset = 0;
7535 ctsio->kern_sg_entries = 0;
7536 ctsio->kern_data_len = min(total_len, alloc_len);
7537 ctsio->kern_total_len = ctsio->kern_data_len;
7545 res_keys = (struct scsi_per_res_in_keys*)ctsio->kern_data_ptr;
7558 free(ctsio->kern_data_ptr, M_CTL);
7593 res = (struct scsi_per_res_in_rsrv *)ctsio->kern_data_ptr;
7618 free(ctsio->kern_data_ptr, M_CTL);
7646 res_cap = (struct scsi_per_res_cap *)ctsio->kern_data_ptr;
7665 res_status = (struct scsi_per_res_in_full*)ctsio->kern_data_ptr;
7678 free(ctsio->kern_data_ptr, M_CTL);
7719 ctl_set_success(ctsio);
7720 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7721 ctsio->be_move_done = ctl_config_move_done;
7722 ctl_datamove((union ctl_io *)ctsio);
7733 struct ctl_scsiio *ctsio, struct scsi_per_res_out *cdb,
7746 ctl_set_invalid_field(/*ctsio*/ ctsio,
7752 ctl_done((union ctl_io *)ctsio);
7758 ctl_set_invalid_field(/*ctsio*/ ctsio,
7764 ctl_done((union ctl_io *)ctsio);
7788 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
7801 free(ctsio->kern_data_ptr, M_CTL);
7802 ctl_set_invalid_field(ctsio,
7808 ctl_done((union ctl_io *)ctsio);
7827 free(ctsio->kern_data_ptr, M_CTL);
7828 ctl_set_invalid_field(ctsio,
7834 ctl_done((union ctl_io *)ctsio);
7849 free(ctsio->kern_data_ptr, M_CTL);
7850 ctl_set_reservation_conflict(ctsio);
7851 ctl_done((union ctl_io *)ctsio);
7858 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
7876 ctl_set_invalid_field(/*ctsio*/ ctsio,
7882 ctl_done((union ctl_io *)ctsio);
7888 ctl_set_invalid_field(/*ctsio*/ ctsio,
7894 ctl_done((union ctl_io *)ctsio);
7935 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
7964 free(ctsio->kern_data_ptr, M_CTL);
7965 ctl_set_reservation_conflict(ctsio);
7966 ctl_done((union ctl_io *)ctsio);
7972 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8056 ctl_persistent_reserve_out(struct ctl_scsiio *ctsio)
8058 struct ctl_softc *softc = CTL_SOFTC(ctsio);
8059 struct ctl_lun *lun = CTL_LUN(ctsio);
8072 cdb = (struct scsi_per_res_out *)ctsio->cdb;
8085 ctl_set_invalid_field(/*ctsio*/ ctsio,
8091 ctl_done((union ctl_io *)ctsio);
8096 ctl_set_invalid_field(/*ctsio*/ ctsio,
8102 ctl_done((union ctl_io *)ctsio);
8109 if ((ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0) {
8110 ctsio->kern_data_ptr = malloc(param_len, M_CTL, M_WAITOK);
8111 ctsio->kern_data_len = param_len;
8112 ctsio->kern_total_len = param_len;
8113 ctsio->kern_rel_offset = 0;
8114 ctsio->kern_sg_entries = 0;
8115 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
8116 ctsio->be_move_done = ctl_config_move_done;
8117 ctl_datamove((union ctl_io *)ctsio);
8122 param = (struct scsi_per_res_out_parms *)ctsio->kern_data_ptr;
8124 residx = ctl_get_initindex(&ctsio->io_hdr.nexus);
8142 free(ctsio->kern_data_ptr, M_CTL);
8143 ctl_set_reservation_conflict(ctsio);
8144 ctl_done((union ctl_io *)ctsio);
8152 free(ctsio->kern_data_ptr, M_CTL);
8153 ctl_set_reservation_conflict(ctsio);
8154 ctl_done((union ctl_io *)ctsio);
8162 free(ctsio->kern_data_ptr, M_CTL);
8163 ctl_set_reservation_conflict(ctsio);
8164 ctl_done((union ctl_io *)ctsio);
8191 free(ctsio->kern_data_ptr, M_CTL);
8192 ctl_set_invalid_field(ctsio,
8198 ctl_done((union ctl_io *)ctsio);
8253 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8272 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8297 free(ctsio->kern_data_ptr, M_CTL);
8298 ctl_set_reservation_conflict(ctsio);
8299 ctl_done((union ctl_io *)ctsio);
8320 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8352 free(ctsio->kern_data_ptr, M_CTL);
8353 ctl_set_illegal_pr_release(ctsio);
8354 ctl_done((union ctl_io *)ctsio);
8378 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8403 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8415 residx, ctsio, cdb, param);
8425 free(ctsio->kern_data_ptr, M_CTL);
8426 ctl_set_success(ctsio);
8427 ctl_done((union ctl_io *)ctsio);
8560 ctl_read_write(struct ctl_scsiio *ctsio)
8562 struct ctl_lun *lun = CTL_LUN(ctsio);
8569 CTL_DEBUG_PRINT(("ctl_read_write: command: %#x\n", ctsio->cdb[0]));
8572 isread = ctsio->cdb[0] == READ_6 || ctsio->cdb[0] == READ_10
8573 || ctsio->cdb[0] == READ_12 || ctsio->cdb[0] == READ_16;
8574 switch (ctsio->cdb[0]) {
8579 cdb = (struct scsi_rw_6 *)ctsio->cdb;
8596 cdb = (struct scsi_rw_10 *)ctsio->cdb;
8608 cdb = (struct scsi_write_verify_10 *)ctsio->cdb;
8620 cdb = (struct scsi_rw_12 *)ctsio->cdb;
8632 cdb = (struct scsi_write_verify_12 *)ctsio->cdb;
8644 cdb = (struct scsi_rw_16 *)ctsio->cdb;
8657 ctl_set_invalid_opcode(ctsio);
8658 ctl_done((union ctl_io *)ctsio);
8662 cdb = (struct scsi_write_atomic_16 *)ctsio->cdb;
8670 ctl_set_invalid_field(ctsio, /*sks_valid*/ 1,
8673 ctl_done((union ctl_io *)ctsio);
8681 cdb = (struct scsi_write_verify_16 *)ctsio->cdb;
8694 ctl_set_invalid_opcode(ctsio);
8695 ctl_done((union ctl_io *)ctsio);
8709 ctl_set_lba_out_of_range(ctsio,
8711 ctl_done((union ctl_io *)ctsio);
8721 ctl_set_success(ctsio);
8722 ctl_done((union ctl_io *)ctsio);
8736 &ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
8741 ctsio->kern_total_len = num_blocks * lun->be_lun->blocksize;
8742 ctsio->kern_rel_offset = 0;
8746 retval = lun->backend->data_submit((union ctl_io *)ctsio);
8754 struct ctl_scsiio *ctsio;
8758 ctsio = &io->scsiio;
8759 ctsio->io_hdr.status = CTL_STATUS_NONE;
8760 ctsio->io_hdr.flags &= ~CTL_FLAG_IO_CONT;
8762 &ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
8767 retval = lun->backend->data_submit((union ctl_io *)ctsio);
8772 ctl_cnw(struct ctl_scsiio *ctsio)
8774 struct ctl_lun *lun = CTL_LUN(ctsio);
8780 CTL_DEBUG_PRINT(("ctl_cnw: command: %#x\n", ctsio->cdb[0]));
8783 switch (ctsio->cdb[0]) {
8787 cdb = (struct scsi_compare_and_write *)ctsio->cdb;
8801 ctl_set_invalid_opcode(ctsio);
8802 ctl_done((union ctl_io *)ctsio);
8816 ctl_set_lba_out_of_range(ctsio,
8818 ctl_done((union ctl_io *)ctsio);
8826 ctl_set_success(ctsio);
8827 ctl_done((union ctl_io *)ctsio);
8835 ctsio->kern_total_len = 2 * num_blocks * lun->be_lun->blocksize;
8836 ctsio->kern_rel_offset = 0;
8843 ctsio->io_hdr.flags |= CTL_FLAG_IO_CONT;
8844 ctsio->io_cont = ctl_cnw_cont;
8847 &ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
8853 retval = lun->backend->data_submit((union ctl_io *)ctsio);
8858 ctl_verify(struct ctl_scsiio *ctsio)
8860 struct ctl_lun *lun = CTL_LUN(ctsio);
8867 CTL_DEBUG_PRINT(("ctl_verify: command: %#x\n", ctsio->cdb[0]));
8871 switch (ctsio->cdb[0]) {
8875 cdb = (struct scsi_verify_10 *)ctsio->cdb;
8887 cdb = (struct scsi_verify_12 *)ctsio->cdb;
8899 cdb = (struct scsi_rw_16 *)ctsio->cdb;
8913 ctl_set_invalid_opcode(ctsio);
8914 ctl_done((union ctl_io *)ctsio);
8926 ctl_set_lba_out_of_range(ctsio,
8928 ctl_done((union ctl_io *)ctsio);
8936 ctl_set_success(ctsio);
8937 ctl_done((union ctl_io *)ctsio);
8942 &ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
8947 ctsio->kern_total_len = num_blocks * lun->be_lun->blocksize;
8950 ctsio->kern_total_len = 0;
8952 ctsio->kern_rel_offset = 0;
8955 retval = lun->backend->data_submit((union ctl_io *)ctsio);
8960 ctl_report_luns(struct ctl_scsiio *ctsio)
8962 struct ctl_softc *softc = CTL_SOFTC(ctsio);
8963 struct ctl_port *port = CTL_PORT(ctsio);
8964 struct ctl_lun *lun, *request_lun = CTL_LUN(ctsio);
8972 cdb = (struct scsi_report_luns *)ctsio->cdb;
8996 ctl_set_invalid_field(ctsio,
9002 ctl_done((union ctl_io *)ctsio);
9015 ctl_set_invalid_field(ctsio,
9021 ctl_done((union ctl_io *)ctsio);
9028 ctsio->kern_data_ptr = malloc(lun_datalen, M_CTL, M_WAITOK | M_ZERO);
9029 lun_data = (struct scsi_report_luns_data *)ctsio->kern_data_ptr;
9030 ctsio->kern_sg_entries = 0;
9032 initidx = ctl_get_initindex(&ctsio->io_hdr.nexus);
9078 ctsio->kern_rel_offset = 0;
9079 ctsio->kern_sg_entries = 0;
9080 ctsio->kern_data_len = min(lun_datalen, alloc_len);
9081 ctsio->kern_total_len = ctsio->kern_data_len;
9096 ctl_set_success(ctsio);
9097 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9098 ctsio->be_move_done = ctl_config_move_done;
9099 ctl_datamove((union ctl_io *)ctsio);
9104 ctl_request_sense(struct ctl_scsiio *ctsio)
9106 struct ctl_softc *softc = CTL_SOFTC(ctsio);
9107 struct ctl_lun *lun = CTL_LUN(ctsio);
9117 cdb = (struct scsi_request_sense *)ctsio->cdb;
9129 ctsio->kern_data_ptr = malloc(sizeof(*sense_ptr), M_CTL, M_WAITOK);
9130 sense_ptr = (struct scsi_sense_data *)ctsio->kern_data_ptr;
9131 ctsio->kern_sg_entries = 0;
9132 ctsio->kern_rel_offset = 0;
9139 ctsio->kern_data_len = cdb->length;
9140 ctsio->kern_total_len = cdb->length;
9159 initidx = ctl_get_initindex(&ctsio->io_hdr.nexus);
9228 ctl_set_success(ctsio);
9229 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9230 ctsio->be_move_done = ctl_config_move_done;
9231 ctl_datamove((union ctl_io *)ctsio);
9236 ctl_tur(struct ctl_scsiio *ctsio)
9241 ctl_set_success(ctsio);
9242 ctl_done((union ctl_io *)ctsio);
9251 ctl_inquiry_evpd_supported(struct ctl_scsiio *ctsio, int alloc_len)
9253 struct ctl_lun *lun = CTL_LUN(ctsio);
9260 ctsio->kern_data_ptr = malloc(sup_page_size, M_CTL, M_WAITOK | M_ZERO);
9261 pages = (struct scsi_vpd_supported_pages *)ctsio->kern_data_ptr;
9262 ctsio->kern_rel_offset = 0;
9263 ctsio->kern_sg_entries = 0;
9264 ctsio->kern_data_len = min(sup_page_size, alloc_len);
9265 ctsio->kern_total_len = ctsio->kern_data_len;
9303 ctl_set_success(ctsio);
9304 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9305 ctsio->be_move_done = ctl_config_move_done;
9306 ctl_datamove((union ctl_io *)ctsio);
9314 ctl_inquiry_evpd_serial(struct ctl_scsiio *ctsio, int alloc_len)
9316 struct ctl_lun *lun = CTL_LUN(ctsio);
9321 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
9322 sn_ptr = (struct scsi_vpd_unit_serial_number *)ctsio->kern_data_ptr;
9323 ctsio->kern_rel_offset = 0;
9324 ctsio->kern_sg_entries = 0;
9325 ctsio->kern_data_len = min(data_len, alloc_len);
9326 ctsio->kern_total_len = ctsio->kern_data_len;
9351 ctl_set_success(ctsio);
9352 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9353 ctsio->be_move_done = ctl_config_move_done;
9354 ctl_datamove((union ctl_io *)ctsio);
9363 ctl_inquiry_evpd_eid(struct ctl_scsiio *ctsio, int alloc_len)
9365 struct ctl_lun *lun = CTL_LUN(ctsio);
9370 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
9371 eid_ptr = (struct scsi_vpd_extended_inquiry_data *)ctsio->kern_data_ptr;
9372 ctsio->kern_sg_entries = 0;
9373 ctsio->kern_rel_offset = 0;
9374 ctsio->kern_data_len = min(data_len, alloc_len);
9375 ctsio->kern_total_len = ctsio->kern_data_len;
9419 ctl_set_success(ctsio);
9420 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9421 ctsio->be_move_done = ctl_config_move_done;
9422 ctl_datamove((union ctl_io *)ctsio);
9427 ctl_inquiry_evpd_mpp(struct ctl_scsiio *ctsio, int alloc_len)
9429 struct ctl_lun *lun = CTL_LUN(ctsio);
9436 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
9437 mpp_ptr = (struct scsi_vpd_mode_page_policy *)ctsio->kern_data_ptr;
9438 ctsio->kern_rel_offset = 0;
9439 ctsio->kern_sg_entries = 0;
9440 ctsio->kern_data_len = min(data_len, alloc_len);
9441 ctsio->kern_total_len = ctsio->kern_data_len;
9458 ctl_set_success(ctsio);
9459 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9460 ctsio->be_move_done = ctl_config_move_done;
9461 ctl_datamove((union ctl_io *)ctsio);
9469 ctl_inquiry_evpd_devid(struct ctl_scsiio *ctsio, int alloc_len)
9471 struct ctl_softc *softc = CTL_SOFTC(ctsio);
9472 struct ctl_port *port = CTL_PORT(ctsio);
9473 struct ctl_lun *lun = CTL_LUN(ctsio);
9491 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
9492 devid_ptr = (struct scsi_vpd_device_id *)ctsio->kern_data_ptr;
9493 ctsio->kern_sg_entries = 0;
9494 ctsio->kern_rel_offset = 0;
9495 ctsio->kern_sg_entries = 0;
9496 ctsio->kern_data_len = min(data_len, alloc_len);
9497 ctsio->kern_total_len = ctsio->kern_data_len;
9547 scsi_ulto2b(ctsio->io_hdr.nexus.targ_port, &desc->identifier[2]);
9562 g = 2 + ctsio->io_hdr.nexus.targ_port / softc->port_cnt;
9574 ctl_set_success(ctsio);
9575 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9576 ctsio->be_move_done = ctl_config_move_done;
9577 ctl_datamove((union ctl_io *)ctsio);
9582 ctl_inquiry_evpd_scsi_ports(struct ctl_scsiio *ctsio, int alloc_len)
9584 struct ctl_softc *softc = CTL_SOFTC(ctsio);
9585 struct ctl_lun *lun = CTL_LUN(ctsio);
9613 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
9614 sp = (struct scsi_vpd_scsi_ports *)ctsio->kern_data_ptr;
9615 ctsio->kern_sg_entries = 0;
9616 ctsio->kern_rel_offset = 0;
9617 ctsio->kern_sg_entries = 0;
9618 ctsio->kern_data_len = min(data_len, alloc_len);
9619 ctsio->kern_total_len = ctsio->kern_data_len;
9666 ctl_set_success(ctsio);
9667 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9668 ctsio->be_move_done = ctl_config_move_done;
9669 ctl_datamove((union ctl_io *)ctsio);
9674 ctl_inquiry_evpd_block_limits(struct ctl_scsiio *ctsio, int alloc_len)
9676 struct ctl_lun *lun = CTL_LUN(ctsio);
9680 ctsio->kern_data_ptr = malloc(sizeof(*bl_ptr), M_CTL, M_WAITOK | M_ZERO);
9681 bl_ptr = (struct scsi_vpd_block_limits *)ctsio->kern_data_ptr;
9682 ctsio->kern_sg_entries = 0;
9683 ctsio->kern_rel_offset = 0;
9684 ctsio->kern_sg_entries = 0;
9685 ctsio->kern_data_len = min(sizeof(*bl_ptr), alloc_len);
9686 ctsio->kern_total_len = ctsio->kern_data_len;
9732 ctl_set_success(ctsio);
9733 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9734 ctsio->be_move_done = ctl_config_move_done;
9735 ctl_datamove((union ctl_io *)ctsio);
9740 ctl_inquiry_evpd_bdc(struct ctl_scsiio *ctsio, int alloc_len)
9742 struct ctl_lun *lun = CTL_LUN(ctsio);
9747 ctsio->kern_data_ptr = malloc(sizeof(*bdc_ptr), M_CTL, M_WAITOK | M_ZERO);
9748 bdc_ptr = (struct scsi_vpd_block_device_characteristics *)ctsio->kern_data_ptr;
9749 ctsio->kern_sg_entries = 0;
9750 ctsio->kern_rel_offset = 0;
9751 ctsio->kern_data_len = min(sizeof(*bdc_ptr), alloc_len);
9752 ctsio->kern_total_len = ctsio->kern_data_len;
9780 ctl_set_success(ctsio);
9781 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9782 ctsio->be_move_done = ctl_config_move_done;
9783 ctl_datamove((union ctl_io *)ctsio);
9788 ctl_inquiry_evpd_lbp(struct ctl_scsiio *ctsio, int alloc_len)
9790 struct ctl_lun *lun = CTL_LUN(ctsio);
9794 ctsio->kern_data_ptr = malloc(sizeof(*lbp_ptr), M_CTL, M_WAITOK | M_ZERO);
9795 lbp_ptr = (struct scsi_vpd_logical_block_prov *)ctsio->kern_data_ptr;
9796 ctsio->kern_sg_entries = 0;
9797 ctsio->kern_rel_offset = 0;
9798 ctsio->kern_data_len = min(sizeof(*lbp_ptr), alloc_len);
9799 ctsio->kern_total_len = ctsio->kern_data_len;
9828 ctl_set_success(ctsio);
9829 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9830 ctsio->be_move_done = ctl_config_move_done;
9831 ctl_datamove((union ctl_io *)ctsio);
9839 ctl_inquiry_evpd(struct ctl_scsiio *ctsio)
9841 struct ctl_lun *lun = CTL_LUN(ctsio);
9845 cdb = (struct scsi_inquiry *)ctsio->cdb;
9850 retval = ctl_inquiry_evpd_supported(ctsio, alloc_len);
9853 retval = ctl_inquiry_evpd_serial(ctsio, alloc_len);
9856 retval = ctl_inquiry_evpd_devid(ctsio, alloc_len);
9859 retval = ctl_inquiry_evpd_eid(ctsio, alloc_len);
9862 retval = ctl_inquiry_evpd_mpp(ctsio, alloc_len);
9865 retval = ctl_inquiry_evpd_scsi_ports(ctsio, alloc_len);
9868 retval = ctl_inquiry_evpd_tpc(ctsio, alloc_len);
9873 retval = ctl_inquiry_evpd_block_limits(ctsio, alloc_len);
9878 retval = ctl_inquiry_evpd_bdc(ctsio, alloc_len);
9883 retval = ctl_inquiry_evpd_lbp(ctsio, alloc_len);
9887 ctl_set_invalid_field(ctsio,
9893 ctl_done((union ctl_io *)ctsio);
9905 ctl_inquiry_std(struct ctl_scsiio *ctsio)
9907 struct ctl_softc *softc = CTL_SOFTC(ctsio);
9908 struct ctl_port *port = CTL_PORT(ctsio);
9909 struct ctl_lun *lun = CTL_LUN(ctsio);
9920 cdb = (struct scsi_inquiry *)ctsio->cdb;
9929 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
9930 inq_ptr = (struct scsi_inquiry_data *)ctsio->kern_data_ptr;
9931 ctsio->kern_sg_entries = 0;
9932 ctsio->kern_rel_offset = 0;
9933 ctsio->kern_data_len = min(data_len, alloc_len);
9934 ctsio->kern_total_len = ctsio->kern_data_len;
10090 ctl_set_success(ctsio);
10091 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
10092 ctsio->be_move_done = ctl_config_move_done;
10093 ctl_datamove((union ctl_io *)ctsio);
10098 ctl_inquiry(struct ctl_scsiio *ctsio)
10105 cdb = (struct scsi_inquiry *)ctsio->cdb;
10107 retval = ctl_inquiry_evpd(ctsio);
10109 retval = ctl_inquiry_std(ctsio);
10111 ctl_set_invalid_field(ctsio,
10117 ctl_done((union ctl_io *)ctsio);
10125 ctl_get_config(struct ctl_scsiio *ctsio)
10127 struct ctl_lun *lun = CTL_LUN(ctsio);
10134 cdb = (struct scsi_get_config *)ctsio->cdb;
10152 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
10153 ctsio->kern_sg_entries = 0;
10154 ctsio->kern_rel_offset = 0;
10156 hdr = (struct scsi_get_config_header *)ctsio->kern_data_ptr;
10321 ctsio->kern_data_len = min(data_len, alloc_len);
10322 ctsio->kern_total_len = ctsio->kern_data_len;
10324 ctl_set_success(ctsio);
10325 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
10326 ctsio->be_move_done = ctl_config_move_done;
10327 ctl_datamove((union ctl_io *)ctsio);
10332 ctl_get_event_status(struct ctl_scsiio *ctsio)
10339 cdb = (struct scsi_get_event_status *)ctsio->cdb;
10341 ctl_set_invalid_field(ctsio, /*sks_valid*/ 1, /*command*/ 1,
10343 ctl_done((union ctl_io *)ctsio);
10350 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
10351 ctsio->kern_sg_entries = 0;
10352 ctsio->kern_rel_offset = 0;
10353 ctsio->kern_data_len = min(data_len, alloc_len);
10354 ctsio->kern_total_len = ctsio->kern_data_len;
10356 hdr = (struct scsi_get_event_status_header *)ctsio->kern_data_ptr;
10361 ctl_set_success(ctsio);
10362 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
10363 ctsio->be_move_done = ctl_config_move_done;
10364 ctl_datamove((union ctl_io *)ctsio);
10369 ctl_mechanism_status(struct ctl_scsiio *ctsio)
10375 cdb = (struct scsi_mechanism_status *)ctsio->cdb;
10379 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
10380 ctsio->kern_sg_entries = 0;
10381 ctsio->kern_rel_offset = 0;
10382 ctsio->kern_data_len = min(data_len, alloc_len);
10383 ctsio->kern_total_len = ctsio->kern_data_len;
10385 hdr = (struct scsi_mechanism_status_header *)ctsio->kern_data_ptr;
10392 ctl_set_success(ctsio);
10393 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
10394 ctsio->be_move_done = ctl_config_move_done;
10395 ctl_datamove((union ctl_io *)ctsio);
10411 ctl_read_toc(struct ctl_scsiio *ctsio)
10413 struct ctl_lun *lun = CTL_LUN(ctsio);
10420 cdb = (struct scsi_read_toc *)ctsio->cdb;
10430 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
10431 ctsio->kern_sg_entries = 0;
10432 ctsio->kern_rel_offset = 0;
10433 ctsio->kern_data_len = min(data_len, alloc_len);
10434 ctsio->kern_total_len = ctsio->kern_data_len;
10436 hdr = (struct scsi_read_toc_hdr *)ctsio->kern_data_ptr;
10468 ctl_set_success(ctsio);
10469 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
10470 ctsio->be_move_done = ctl_config_move_done;
10471 ctl_datamove((union ctl_io *)ctsio);
11045 const struct ctl_cmd_entry *entry, struct ctl_scsiio *ctsio)
11062 ctl_set_lun_unavail(ctsio);
11068 ctl_set_lun_transit(ctsio);
11074 ctl_set_lun_standby(ctsio);
11087 ctl_set_hw_write_protected(ctsio);
11092 ctl_set_sense(ctsio, /*current_error*/ 1,
11105 residx = ctl_get_initindex(&ctsio->io_hdr.nexus);
11109 ctl_set_reservation_conflict(ctsio);
11131 ctl_set_reservation_conflict(ctsio);
11139 ctl_set_lun_ejected(ctsio);
11142 ctl_set_lun_no_media(ctsio);
11144 ctl_set_lun_int_reqd(ctsio);
11146 ctl_set_lun_stopped(ctsio);
11247 ctl_scsiio_precheck(struct ctl_softc *softc, struct ctl_scsiio *ctsio)
11256 targ_lun = ctsio->io_hdr.nexus.targ_mapped_lun;
11271 CTL_LUN(ctsio) = lun;
11273 CTL_BACKEND_LUN(ctsio) = lun->be_lun;
11283 TAILQ_INSERT_TAIL(&lun->ooa_queue, &ctsio->io_hdr, ooa_links);
11287 entry = ctl_validate_command(ctsio);
11294 ctsio->io_hdr.flags &= ~CTL_FLAG_DATA_MASK;
11295 ctsio->io_hdr.flags |= entry->flags & CTL_FLAG_DATA_MASK;
11306 ctsio->io_hdr.flags |= CTL_FLAG_IS_WAS_ON_RTR;
11307 ctl_enqueue_rtr((union ctl_io *)ctsio);
11311 ctl_set_unsupported_lun(ctsio);
11312 ctl_done((union ctl_io *)ctsio);
11322 ctl_set_invalid_opcode(ctsio);
11323 ctl_done((union ctl_io *)ctsio);
11328 initidx = ctl_get_initindex(&ctsio->io_hdr.nexus);
11336 if (ctsio->cdb[0] != REQUEST_SENSE) {
11370 ua_type = ctl_build_ua(lun, initidx, &ctsio->sense_data,
11374 ctsio->scsi_status = SCSI_STATUS_CHECK_COND;
11375 ctsio->io_hdr.status = CTL_SCSI_ERROR | CTL_AUTOSENSE;
11376 ctsio->sense_len = sense_len;
11377 ctl_done((union ctl_io *)ctsio);
11383 if (ctl_scsiio_lun_check(lun, entry, ctsio) != 0) {
11385 ctl_done((union ctl_io *)ctsio);
11404 ctsio->io_hdr.flags |= CTL_FLAG_SENT_2OTHER_SC;
11405 ctsio->io_hdr.flags &= ~CTL_FLAG_IO_ACTIVE;
11409 msg_info.hdr.original_sc = (union ctl_io *)ctsio;
11411 msg_info.hdr.nexus = ctsio->io_hdr.nexus;
11412 msg_info.scsi.tag_num = ctsio->tag_num;
11413 msg_info.scsi.tag_type = ctsio->tag_type;
11414 msg_info.scsi.cdb_len = ctsio->cdb_len;
11415 memcpy(msg_info.scsi.cdb, ctsio->cdb, CTL_MAX_CDBLEN);
11420 ctl_set_busy(ctsio);
11421 ctl_done((union ctl_io *)ctsio);
11427 bio = (union ctl_io *)TAILQ_PREV(&ctsio->io_hdr, ctl_ooaq, ooa_links);
11428 switch (ctl_check_ooa(lun, (union ctl_io *)ctsio, &bio)) {
11430 ctsio->io_hdr.blocker = bio;
11431 TAILQ_INSERT_TAIL(&bio->io_hdr.blocked_queue, &ctsio->io_hdr,
11437 ctsio->io_hdr.flags |= CTL_FLAG_IS_WAS_ON_RTR;
11439 ctl_enqueue_rtr((union ctl_io *)ctsio);
11443 ctl_set_overlapped_cmd(ctsio);
11444 ctl_done((union ctl_io *)ctsio);
11448 ctl_set_overlapped_tag(ctsio, ctsio->tag_num & 0xff);
11449 ctl_done((union ctl_io *)ctsio);
11454 ctl_set_internal_failure(ctsio,
11457 ctl_done((union ctl_io *)ctsio);
11464 ctl_get_cmd_entry(struct ctl_scsiio *ctsio, int *sa)
11469 entry = &ctl_cmd_table[ctsio->cdb[0]];
11473 service_action = ctsio->cdb[1] & SERVICE_ACTION_MASK;
11481 ctl_validate_command(struct ctl_scsiio *ctsio)
11487 entry = ctl_get_cmd_entry(ctsio, &sa);
11490 ctl_set_invalid_field(ctsio,
11497 ctl_set_invalid_opcode(ctsio);
11498 ctl_done((union ctl_io *)ctsio);
11503 ctsio->cdb[0], ctsio->cdb[1]));
11505 diff = ctsio->cdb[i] & ~entry->usage[i - 1];
11508 ctl_set_invalid_field(ctsio,
11514 ctl_done((union ctl_io *)ctsio);
11544 ctl_scsiio(struct ctl_scsiio *ctsio)
11551 CTL_DEBUG_PRINT(("ctl_scsiio cdb[0]=%02X\n", ctsio->cdb[0]));
11553 entry = ctl_get_cmd_entry(ctsio, NULL);
11559 if (ctsio->io_hdr.flags & CTL_FLAG_ABORT) {
11560 ctl_done((union ctl_io *)ctsio);
11568 retval = entry->execute(ctsio);
12129 ctl_cmd_pattern_match(struct ctl_scsiio *ctsio, struct ctl_error_desc *desc)
12147 entry = ctl_get_cmd_entry(ctsio, NULL);
12173 retval = ctl_get_lba_len((union ctl_io *)ctsio, &lba1, &len1);