Lines Matching refs:ctsio

390 static int ctl_ioctl_do_datamove(struct ctl_scsiio *ctsio);
391 static int ctl_serialize_other_sc_cmd(struct ctl_scsiio *ctsio);
410 struct ctl_scsiio *ctsio, int master);
417 struct ctl_scsiio *ctsio,
423 static int ctl_inquiry_evpd_supported(struct ctl_scsiio *ctsio, int alloc_len);
424 static int ctl_inquiry_evpd_serial(struct ctl_scsiio *ctsio, int alloc_len);
425 static int ctl_inquiry_evpd_devid(struct ctl_scsiio *ctsio, int alloc_len);
426 static int ctl_inquiry_evpd_eid(struct ctl_scsiio *ctsio, int alloc_len);
427 static int ctl_inquiry_evpd_mpp(struct ctl_scsiio *ctsio, int alloc_len);
428 static int ctl_inquiry_evpd_scsi_ports(struct ctl_scsiio *ctsio,
430 static int ctl_inquiry_evpd_block_limits(struct ctl_scsiio *ctsio,
432 static int ctl_inquiry_evpd_bdc(struct ctl_scsiio *ctsio, int alloc_len);
433 static int ctl_inquiry_evpd_lbp(struct ctl_scsiio *ctsio, int alloc_len);
434 static int ctl_inquiry_evpd(struct ctl_scsiio *ctsio);
435 static int ctl_inquiry_std(struct ctl_scsiio *ctsio);
447 struct ctl_scsiio *ctsio);
453 struct ctl_scsiio *ctsio);
454 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);
538 struct ctl_scsiio *ctsio;
546 ctsio = &msg_info->hdr.original_sc->scsiio;
547 ctsio->io_hdr.flags |= CTL_FLAG_IO_ACTIVE;
548 ctsio->io_hdr.msg_type = CTL_MSG_FINISH_IO;
549 ctsio->io_hdr.status = msg_info->hdr.status;
550 ctsio->scsi_status = msg_info->scsi.scsi_status;
551 ctsio->sense_len = msg_info->scsi.sense_len;
552 ctsio->sense_residual = msg_info->scsi.sense_residual;
553 ctsio->residual = msg_info->scsi.residual;
554 memcpy(&ctsio->sense_data, &msg_info->scsi.sense_data,
555 sizeof(ctsio->sense_data));
556 memcpy(&ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN].bytes,
558 ctl_enqueue_isc((union ctl_io *)ctsio);
565 struct ctl_scsiio *ctsio;
573 ctsio = &msg_info->hdr.serializing_sc->scsiio;
579 if (ctsio->io_hdr.io_type == 0xff) {
581 tmp_io = (union ctl_io *)ctsio;
583 ctsio);
603 ctsio->io_hdr.msg_type = CTL_MSG_FINISH_IO;
604 ctl_enqueue_isc((union ctl_io *)ctsio);
661 // populate ctsio from msg_info
842 printf("pOrig %x\n",(int) ctsio);
1660 ctl_ioctl_do_datamove(struct ctl_scsiio *ctsio)
1680 if (ctsio->io_hdr.flags & CTL_FLAG_NO_DATAMOVE) {
1681 ctsio->ext_data_filled = ctsio->ext_data_len;
1689 if (ctsio->io_hdr.flags & CTL_FLAG_EDPTR_SGLIST) {
1692 ext_sglen = ctsio->ext_sg_entries * sizeof(*ext_sglist);
1697 if (copyin(ctsio->ext_data_ptr, ext_sglist,
1699 ctl_set_internal_failure(ctsio,
1704 ext_sg_entries = ctsio->ext_sg_entries;
1708 ctsio->ext_data_filled) {
1710 ext_offset = ctsio->ext_data_filled - len_seen;
1717 ext_sglist->addr = ctsio->ext_data_ptr;
1718 ext_sglist->len = ctsio->ext_data_len;
1721 ext_offset = ctsio->ext_data_filled;
1724 if (ctsio->kern_sg_entries > 0) {
1725 kern_sglist = (struct ctl_sg_entry *)ctsio->kern_data_ptr;
1726 kern_sg_entries = ctsio->kern_sg_entries;
1729 kern_sglist->addr = ctsio->kern_data_ptr;
1730 kern_sglist->len = ctsio->kern_data_len;
1747 if (ctsio->io_hdr.flags & CTL_FLAG_BUS_ADDR) {
1762 if ((ctsio->io_hdr.flags & CTL_FLAG_DATA_MASK) ==
1769 ctl_set_internal_failure(ctsio,
1780 ctl_set_internal_failure(ctsio,
1800 ctsio->ext_data_filled += len_copied;
1806 "kern_data_len = %d\n", ctsio->ext_data_len,
1807 ctsio->kern_data_len));
1828 ctl_serialize_other_sc_cmd(struct ctl_scsiio *ctsio)
1838 targ_lun = ctsio->io_hdr.nexus.targ_mapped_lun;
1861 msg_info.hdr.original_sc = ctsio->io_hdr.original_sc;
1872 TAILQ_INSERT_TAIL(&lun->ooa_queue, &ctsio->io_hdr, ooa_links);
1874 switch (ctl_check_ooa(lun, (union ctl_io *)ctsio,
1875 (union ctl_io *)TAILQ_PREV(&ctsio->io_hdr, ctl_ooaq,
1878 ctsio->io_hdr.flags |= CTL_FLAG_BLOCKED;
1879 TAILQ_INSERT_TAIL(&lun->blocked_queue, &ctsio->io_hdr,
1885 ctsio->io_hdr.flags |= CTL_FLAG_IS_WAS_ON_RTR;
1886 ctl_enqueue_rtr((union ctl_io *)ctsio);
1890 msg_info.hdr.original_sc = ctsio->io_hdr.original_sc;
1891 msg_info.hdr.serializing_sc = (union ctl_io *)ctsio;
1915 msg_info.hdr.original_sc = ctsio->io_hdr.original_sc;
1921 TAILQ_REMOVE(&lun->ooa_queue, &ctsio->io_hdr, ooa_links);
1935 /*ascq*/ ctsio->tag_num & 0xff,
1941 msg_info.hdr.original_sc = ctsio->io_hdr.original_sc;
1947 TAILQ_REMOVE(&lun->ooa_queue, &ctsio->io_hdr, ooa_links);
1968 msg_info.hdr.original_sc = ctsio->io_hdr.original_sc;
1974 TAILQ_REMOVE(&lun->ooa_queue, &ctsio->io_hdr, ooa_links);
5210 ctl_scsi_release(struct ctl_scsiio *ctsio)
5221 residx = ctl_get_resindex(&ctsio->io_hdr.nexus);
5222 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
5224 switch (ctsio->cdb[0]) {
5228 cdb = (struct scsi_release_10 *)ctsio->cdb;
5251 if (((ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0)
5253 ctsio->kern_data_ptr = malloc(length, M_CTL, M_WAITOK);
5254 ctsio->kern_data_len = length;
5255 ctsio->kern_total_len = length;
5256 ctsio->kern_data_resid = 0;
5257 ctsio->kern_rel_offset = 0;
5258 ctsio->kern_sg_entries = 0;
5259 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
5260 ctsio->be_move_done = ctl_config_move_done;
5261 ctl_datamove((union ctl_io *)ctsio);
5267 thirdparty_id = scsi_8btou64(ctsio->kern_data_ptr);
5283 if (ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) {
5284 free(ctsio->kern_data_ptr, M_CTL);
5285 ctsio->io_hdr.flags &= ~CTL_FLAG_ALLOCATED;
5288 ctl_set_success(ctsio);
5289 ctl_done((union ctl_io *)ctsio);
5294 ctl_scsi_reserve(struct ctl_scsiio *ctsio)
5311 residx = ctl_get_resindex(&ctsio->io_hdr.nexus);
5312 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
5314 switch (ctsio->cdb[0]) {
5318 cdb = (struct scsi_reserve_10 *)ctsio->cdb;
5340 if (((ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0)
5342 ctsio->kern_data_ptr = malloc(length, M_CTL, M_WAITOK);
5343 ctsio->kern_data_len = length;
5344 ctsio->kern_total_len = length;
5345 ctsio->kern_data_resid = 0;
5346 ctsio->kern_rel_offset = 0;
5347 ctsio->kern_sg_entries = 0;
5348 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
5349 ctsio->be_move_done = ctl_config_move_done;
5350 ctl_datamove((union ctl_io *)ctsio);
5356 thirdparty_id = scsi_8btou64(ctsio->kern_data_ptr);
5360 ctl_set_reservation_conflict(ctsio);
5367 ctl_set_success(ctsio);
5372 if (ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) {
5373 free(ctsio->kern_data_ptr, M_CTL);
5374 ctsio->io_hdr.flags &= ~CTL_FLAG_ALLOCATED;
5377 ctl_done((union ctl_io *)ctsio);
5382 ctl_start_stop(struct ctl_scsiio *ctsio)
5390 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
5393 cdb = (struct scsi_start_stop_unit *)ctsio->cdb;
5413 ctl_set_invalid_field(ctsio,
5419 ctl_done((union ctl_io *)ctsio);
5427 residx = ctl_get_resindex(&ctsio->io_hdr.nexus);
5431 ctl_set_reservation_conflict(ctsio);
5432 ctl_done((union ctl_io *)ctsio);
5444 ctl_set_invalid_opcode(ctsio);
5445 ctl_done((union ctl_io *)ctsio);
5463 ctl_set_lun_not_ready(ctsio);
5464 ctl_done((union ctl_io *)ctsio);
5486 new_io = ctl_alloc_io(ctsio->io_hdr.pool);
5487 ctl_copy_io((union ctl_io *)ctsio, new_io);
5489 ctl_set_success(ctsio);
5490 ctl_done((union ctl_io *)ctsio);
5493 (union ctl_io *)ctsio);
5508 ctl_sync_cache(struct ctl_scsiio *ctsio)
5518 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
5522 switch (ctsio->cdb[0]) {
5525 cdb = (struct scsi_sync_cache *)ctsio->cdb;
5533 cdb = (struct scsi_sync_cache_16 *)ctsio->cdb;
5540 ctl_set_invalid_opcode(ctsio);
5541 ctl_done((union ctl_io *)ctsio);
5553 ctl_set_lba_out_of_range(ctsio);
5554 ctl_done((union ctl_io *)ctsio);
5562 ctl_set_invalid_opcode(ctsio);
5563 ctl_done((union ctl_io *)ctsio);
5576 retval = lun->backend->config_write((union ctl_io *)ctsio);
5579 ctl_set_success(ctsio);
5580 ctl_done((union ctl_io *)ctsio);
5589 ctl_format(struct ctl_scsiio *ctsio)
5597 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
5599 cdb = (struct scsi_format *)ctsio->cdb;
5609 if (((ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0)
5611 ctsio->kern_data_ptr = malloc(length, M_CTL, M_WAITOK);
5612 ctsio->kern_data_len = length;
5613 ctsio->kern_total_len = length;
5614 ctsio->kern_data_resid = 0;
5615 ctsio->kern_rel_offset = 0;
5616 ctsio->kern_sg_entries = 0;
5617 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
5618 ctsio->be_move_done = ctl_config_move_done;
5619 ctl_datamove((union ctl_io *)ctsio);
5631 ctsio->kern_data_ptr;
5635 ctl_set_invalid_field(ctsio,
5647 ctsio->kern_data_ptr;
5651 ctl_set_invalid_field(ctsio,
5673 ctl_set_success(ctsio);
5676 if (ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) {
5677 free(ctsio->kern_data_ptr, M_CTL);
5678 ctsio->io_hdr.flags &= ~CTL_FLAG_ALLOCATED;
5681 ctl_done((union ctl_io *)ctsio);
5686 ctl_read_buffer(struct ctl_scsiio *ctsio)
5696 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
5697 cdb = (struct scsi_read_buffer *)ctsio->cdb;
5702 ctl_set_invalid_field(ctsio,
5708 ctl_done((union ctl_io *)ctsio);
5716 ctl_set_invalid_field(ctsio,
5722 ctl_done((union ctl_io *)ctsio);
5729 ctsio->kern_data_ptr = descr;
5732 ctsio->kern_data_ptr = echo_descr;
5739 ctsio->kern_data_ptr = lun->write_buffer + buffer_offset;
5741 ctsio->kern_data_len = len;
5742 ctsio->kern_total_len = len;
5743 ctsio->kern_data_resid = 0;
5744 ctsio->kern_rel_offset = 0;
5745 ctsio->kern_sg_entries = 0;
5746 ctl_set_success(ctsio);
5747 ctsio->be_move_done = ctl_config_move_done;
5748 ctl_datamove((union ctl_io *)ctsio);
5753 ctl_write_buffer(struct ctl_scsiio *ctsio)
5761 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
5762 cdb = (struct scsi_write_buffer *)ctsio->cdb;
5765 ctl_set_invalid_field(ctsio,
5771 ctl_done((union ctl_io *)ctsio);
5779 ctl_set_invalid_field(ctsio,
5785 ctl_done((union ctl_io *)ctsio);
5793 if ((ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0) {
5798 ctsio->kern_data_ptr = lun->write_buffer + buffer_offset;
5799 ctsio->kern_data_len = len;
5800 ctsio->kern_total_len = len;
5801 ctsio->kern_data_resid = 0;
5802 ctsio->kern_rel_offset = 0;
5803 ctsio->kern_sg_entries = 0;
5804 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
5805 ctsio->be_move_done = ctl_config_move_done;
5806 ctl_datamove((union ctl_io *)ctsio);
5811 ctl_set_success(ctsio);
5812 ctl_done((union ctl_io *)ctsio);
5817 ctl_write_same(struct ctl_scsiio *ctsio)
5830 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
5832 switch (ctsio->cdb[0]) {
5836 cdb = (struct scsi_write_same_10 *)ctsio->cdb;
5846 cdb = (struct scsi_write_same_16 *)ctsio->cdb;
5858 ctl_set_invalid_opcode(ctsio);
5859 ctl_done((union ctl_io *)ctsio);
5868 ctl_set_invalid_field(ctsio, /*sks_valid*/ 1,
5870 ctl_done((union ctl_io *)ctsio);
5882 ctl_set_lba_out_of_range(ctsio);
5883 ctl_done((union ctl_io *)ctsio);
5890 ctl_set_invalid_field(ctsio,
5896 ctl_done((union ctl_io *)ctsio);
5909 (ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0) {
5910 ctsio->kern_data_ptr = malloc(len, M_CTL, M_WAITOK);;
5911 ctsio->kern_data_len = len;
5912 ctsio->kern_total_len = len;
5913 ctsio->kern_data_resid = 0;
5914 ctsio->kern_rel_offset = 0;
5915 ctsio->kern_sg_entries = 0;
5916 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
5917 ctsio->be_move_done = ctl_config_move_done;
5918 ctl_datamove((union ctl_io *)ctsio);
5923 lbalen = (struct ctl_lba_len_flags *)&ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
5927 retval = lun->backend->config_write((union ctl_io *)ctsio);
5933 ctl_unmap(struct ctl_scsiio *ctsio)
5949 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
5950 cdb = (struct scsi_unmap *)ctsio->cdb;
5959 if ((ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0) {
5960 ctsio->kern_data_ptr = malloc(len, M_CTL, M_WAITOK);;
5961 ctsio->kern_data_len = len;
5962 ctsio->kern_total_len = len;
5963 ctsio->kern_data_resid = 0;
5964 ctsio->kern_rel_offset = 0;
5965 ctsio->kern_sg_entries = 0;
5966 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
5967 ctsio->be_move_done = ctl_config_move_done;
5968 ctl_datamove((union ctl_io *)ctsio);
5973 len = ctsio->kern_total_len - ctsio->kern_data_resid;
5974 hdr = (struct scsi_unmap_header *)ctsio->kern_data_ptr;
5979 ctl_set_invalid_field(ctsio,
5997 ctl_set_lba_out_of_range(ctsio);
5998 ctl_done((union ctl_io *)ctsio);
6011 ctl_set_success(ctsio);
6017 &ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
6024 retval = lun->backend->config_write((union ctl_io *)ctsio);
6028 if (ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) {
6029 free(ctsio->kern_data_ptr, M_CTL);
6030 ctsio->io_hdr.flags &= ~CTL_FLAG_ALLOCATED;
6032 ctl_done((union ctl_io *)ctsio);
6050 ctl_control_page_handler(struct ctl_scsiio *ctsio,
6058 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
6059 initidx = ctl_get_initindex(&ctsio->io_hdr.nexus);
6116 ctl_caching_sp_handler(struct ctl_scsiio *ctsio,
6124 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
6125 initidx = ctl_get_initindex(&ctsio->io_hdr.nexus);
6153 ctl_debugconf_sp_select_handler(struct ctl_scsiio *ctsio,
6175 ctl_debugconf_sp_sense_handler(struct ctl_scsiio *ctsio,
6211 struct ctl_scsiio *ctsio;
6219 ctsio = &io->scsiio;
6224 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
6232 ctsio->io_hdr.ctl_private[CTL_PRIV_MODEPAGE].bytes;
6239 (ctsio->kern_data_ptr + *len_used);
6242 free(ctsio->kern_data_ptr, M_CTL);
6243 ctl_set_success(ctsio);
6244 ctl_done((union ctl_io *)ctsio);
6248 free(ctsio->kern_data_ptr, M_CTL);
6249 ctl_set_param_len_error(ctsio);
6250 ctl_done((union ctl_io *)ctsio);
6256 free(ctsio->kern_data_ptr, M_CTL);
6257 ctl_set_param_len_error(ctsio);
6258 ctl_done((union ctl_io *)ctsio);
6313 ctl_set_invalid_field(ctsio,
6319 free(ctsio->kern_data_ptr, M_CTL);
6320 ctl_done((union ctl_io *)ctsio);
6342 ctl_set_invalid_field(ctsio,
6348 free(ctsio->kern_data_ptr, M_CTL);
6349 ctl_done((union ctl_io *)ctsio);
6387 ctl_set_invalid_field(ctsio,
6393 free(ctsio->kern_data_ptr, M_CTL);
6394 ctl_done((union ctl_io *)ctsio);
6406 retval = page_index->select_handler(ctsio, page_index,
6426 ctl_set_success(ctsio);
6427 free(ctsio->kern_data_ptr, M_CTL);
6428 ctl_done((union ctl_io *)ctsio);
6437 ctl_mode_select(struct ctl_scsiio *ctsio)
6457 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
6464 switch (ctsio->cdb[0]) {
6468 cdb = (struct scsi_mode_select_6 *)ctsio->cdb;
6480 cdb = (struct scsi_mode_select_10 *)ctsio->cdb;
6490 ctl_set_invalid_opcode(ctsio);
6491 ctl_done((union ctl_io *)ctsio);
6502 ctl_set_success(ctsio);
6503 ctl_done((union ctl_io *)ctsio);
6512 ctl_set_param_len_error(ctsio);
6513 ctl_done((union ctl_io *)ctsio);
6523 if ((ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0) {
6524 ctsio->kern_data_ptr = malloc(param_len, M_CTL, M_WAITOK);
6525 ctsio->kern_data_len = param_len;
6526 ctsio->kern_total_len = param_len;
6527 ctsio->kern_data_resid = 0;
6528 ctsio->kern_rel_offset = 0;
6529 ctsio->kern_sg_entries = 0;
6530 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
6531 ctsio->be_move_done = ctl_config_move_done;
6532 ctl_datamove((union ctl_io *)ctsio);
6537 switch (ctsio->cdb[0]) {
6541 mh6 = (struct scsi_mode_header_6 *)ctsio->kern_data_ptr;
6548 mh10 = (struct scsi_mode_header_10 *)ctsio->kern_data_ptr;
6553 panic("Invalid CDB type %#x", ctsio->cdb[0]);
6558 free(ctsio->kern_data_ptr, M_CTL);
6559 ctl_set_param_len_error(ctsio);
6560 ctl_done((union ctl_io *)ctsio);
6570 ctsio->io_hdr.flags |= CTL_FLAG_IO_CONT;
6571 ctsio->io_cont = ctl_do_mode_select;
6574 ctsio->io_hdr.ctl_private[CTL_PRIV_MODEPAGE].bytes;
6584 return (ctl_do_mode_select((union ctl_io *)ctsio));
6588 ctl_mode_sense(struct ctl_scsiio *ctsio)
6604 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
6611 switch (ctsio->cdb[0]) {
6615 cdb = (struct scsi_mode_sense_6 *)ctsio->cdb;
6632 cdb = (struct scsi_mode_sense_10 *)ctsio->cdb;
6649 ctl_set_invalid_opcode(ctsio);
6650 ctl_done((union ctl_io *)ctsio);
6672 ctl_set_invalid_field(ctsio,
6678 ctl_done((union ctl_io *)ctsio);
6739 ctl_set_invalid_field(ctsio,
6745 ctl_done((union ctl_io *)ctsio);
6758 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
6759 ctsio->kern_sg_entries = 0;
6760 ctsio->kern_data_resid = 0;
6761 ctsio->kern_rel_offset = 0;
6763 ctsio->residual = alloc_len - total_len;
6764 ctsio->kern_data_len = total_len;
6765 ctsio->kern_total_len = total_len;
6767 ctsio->residual = 0;
6768 ctsio->kern_data_len = alloc_len;
6769 ctsio->kern_total_len = alloc_len;
6772 switch (ctsio->cdb[0]) {
6776 header = (struct scsi_mode_hdr_6 *)ctsio->kern_data_ptr;
6798 header = (struct scsi_mode_hdr_10 *)ctsio->kern_data_ptr;
6818 panic("invalid CDB type %#x", ctsio->cdb[0]);
6864 page_index->sense_handler(ctsio, page_index,pc);
6866 memcpy(ctsio->kern_data_ptr + data_used,
6904 page_index->sense_handler(ctsio, page_index,pc);
6906 memcpy(ctsio->kern_data_ptr + data_used,
6916 ctl_set_success(ctsio);
6917 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
6918 ctsio->be_move_done = ctl_config_move_done;
6919 ctl_datamove((union ctl_io *)ctsio);
6924 ctl_lbp_log_sense_handler(struct ctl_scsiio *ctsio,
6933 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
6993 ctl_sap_log_sense_handler(struct ctl_scsiio *ctsio,
7003 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
7054 ctl_log_sense(struct ctl_scsiio *ctsio)
7065 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
7066 cdb = (struct scsi_log_sense *)ctsio->cdb;
7087 ctl_set_invalid_field(ctsio,
7093 ctl_done((union ctl_io *)ctsio);
7099 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
7100 ctsio->kern_sg_entries = 0;
7101 ctsio->kern_data_resid = 0;
7102 ctsio->kern_rel_offset = 0;
7104 ctsio->residual = alloc_len - total_len;
7105 ctsio->kern_data_len = total_len;
7106 ctsio->kern_total_len = total_len;
7108 ctsio->residual = 0;
7109 ctsio->kern_data_len = alloc_len;
7110 ctsio->kern_total_len = alloc_len;
7113 header = (struct scsi_log_header *)ctsio->kern_data_ptr;
7126 page_index->sense_handler(ctsio, page_index, pc);
7130 ctl_set_success(ctsio);
7131 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7132 ctsio->be_move_done = ctl_config_move_done;
7133 ctl_datamove((union ctl_io *)ctsio);
7138 ctl_read_capacity(struct ctl_scsiio *ctsio)
7147 cdb = (struct scsi_read_capacity *)ctsio->cdb;
7152 ctl_set_invalid_field(/*ctsio*/ ctsio,
7158 ctl_done((union ctl_io *)ctsio);
7162 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
7164 ctsio->kern_data_ptr = malloc(sizeof(*data), M_CTL, M_WAITOK | M_ZERO);
7165 data = (struct scsi_read_capacity_data *)ctsio->kern_data_ptr;
7166 ctsio->residual = 0;
7167 ctsio->kern_data_len = sizeof(*data);
7168 ctsio->kern_total_len = sizeof(*data);
7169 ctsio->kern_data_resid = 0;
7170 ctsio->kern_rel_offset = 0;
7171 ctsio->kern_sg_entries = 0;
7188 ctl_set_success(ctsio);
7189 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7190 ctsio->be_move_done = ctl_config_move_done;
7191 ctl_datamove((union ctl_io *)ctsio);
7196 ctl_read_capacity_16(struct ctl_scsiio *ctsio)
7206 cdb = (struct scsi_read_capacity_16 *)ctsio->cdb;
7213 ctl_set_invalid_field(/*ctsio*/ ctsio,
7219 ctl_done((union ctl_io *)ctsio);
7223 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
7225 ctsio->kern_data_ptr = malloc(sizeof(*data), M_CTL, M_WAITOK | M_ZERO);
7226 data = (struct scsi_read_capacity_data_long *)ctsio->kern_data_ptr;
7229 ctsio->residual = alloc_len - sizeof(*data);
7230 ctsio->kern_data_len = sizeof(*data);
7231 ctsio->kern_total_len = sizeof(*data);
7233 ctsio->residual = 0;
7234 ctsio->kern_data_len = alloc_len;
7235 ctsio->kern_total_len = alloc_len;
7237 ctsio->kern_data_resid = 0;
7238 ctsio->kern_rel_offset = 0;
7239 ctsio->kern_sg_entries = 0;
7249 ctl_set_success(ctsio);
7250 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7251 ctsio->be_move_done = ctl_config_move_done;
7252 ctl_datamove((union ctl_io *)ctsio);
7257 ctl_get_lba_status(struct ctl_scsiio *ctsio)
7269 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
7270 cdb = (struct scsi_get_lba_status *)ctsio->cdb;
7275 ctl_set_lba_out_of_range(ctsio);
7276 ctl_done((union ctl_io *)ctsio);
7281 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
7282 data = (struct scsi_get_lba_status_data *)ctsio->kern_data_ptr;
7285 ctsio->residual = alloc_len - total_len;
7286 ctsio->kern_data_len = total_len;
7287 ctsio->kern_total_len = total_len;
7289 ctsio->residual = 0;
7290 ctsio->kern_data_len = alloc_len;
7291 ctsio->kern_total_len = alloc_len;
7293 ctsio->kern_data_resid = 0;
7294 ctsio->kern_rel_offset = 0;
7295 ctsio->kern_sg_entries = 0;
7304 ctl_set_success(ctsio);
7305 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7306 ctsio->be_move_done = ctl_config_move_done;
7308 lbalen = (struct ctl_lba_len_flags *)&ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
7312 retval = lun->backend->config_read((union ctl_io *)ctsio);
7317 ctl_read_defect(struct ctl_scsiio *ctsio)
7328 if (ctsio->cdb[0] == READ_DEFECT_DATA_10) {
7329 ccb10 = (struct scsi_read_defect_data_10 *)&ctsio->cdb;
7334 ccb12 = (struct scsi_read_defect_data_12 *)&ctsio->cdb;
7340 ctl_set_success(ctsio);
7341 ctl_done((union ctl_io *)ctsio);
7345 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
7347 ctsio->residual = alloc_len - data_len;
7348 ctsio->kern_data_len = data_len;
7349 ctsio->kern_total_len = data_len;
7351 ctsio->residual = 0;
7352 ctsio->kern_data_len = alloc_len;
7353 ctsio->kern_total_len = alloc_len;
7355 ctsio->kern_data_resid = 0;
7356 ctsio->kern_rel_offset = 0;
7357 ctsio->kern_sg_entries = 0;
7359 if (ctsio->cdb[0] == READ_DEFECT_DATA_10) {
7361 ctsio->kern_data_ptr;
7366 ctsio->kern_data_ptr;
7372 ctl_set_success(ctsio);
7373 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7374 ctsio->be_move_done = ctl_config_move_done;
7375 ctl_datamove((union ctl_io *)ctsio);
7380 ctl_report_tagret_port_groups(struct ctl_scsiio *ctsio)
7395 cdb = (struct scsi_maintenance_in *)ctsio->cdb;
7396 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
7409 ctl_set_invalid_field(/*ctsio*/ ctsio,
7415 ctl_done((union ctl_io *)ctsio);
7445 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
7447 ctsio->kern_sg_entries = 0;
7450 ctsio->residual = alloc_len - total_len;
7451 ctsio->kern_data_len = total_len;
7452 ctsio->kern_total_len = total_len;
7454 ctsio->residual = 0;
7455 ctsio->kern_data_len = alloc_len;
7456 ctsio->kern_total_len = alloc_len;
7458 ctsio->kern_data_resid = 0;
7459 ctsio->kern_rel_offset = 0;
7463 ctsio->kern_data_ptr;
7470 ctsio->kern_data_ptr;
7514 ctl_set_success(ctsio);
7515 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7516 ctsio->be_move_done = ctl_config_move_done;
7517 ctl_datamove((union ctl_io *)ctsio);
7522 ctl_report_supported_opcodes(struct ctl_scsiio *ctsio)
7536 cdb = (struct scsi_report_supported_opcodes *)ctsio->cdb;
7537 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
7567 ctl_set_invalid_field(/*ctsio*/ ctsio,
7573 ctl_done((union ctl_io *)ctsio);
7581 ctl_set_invalid_field(/*ctsio*/ ctsio,
7587 ctl_done((union ctl_io *)ctsio);
7593 ctl_set_invalid_field(/*ctsio*/ ctsio,
7599 ctl_done((union ctl_io *)ctsio);
7605 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
7607 ctsio->kern_sg_entries = 0;
7610 ctsio->residual = alloc_len - total_len;
7611 ctsio->kern_data_len = total_len;
7612 ctsio->kern_total_len = total_len;
7614 ctsio->residual = 0;
7615 ctsio->kern_data_len = alloc_len;
7616 ctsio->kern_total_len = alloc_len;
7618 ctsio->kern_data_resid = 0;
7619 ctsio->kern_rel_offset = 0;
7624 ctsio->kern_data_ptr;
7659 ctsio->kern_data_ptr;
7664 ctsio->kern_data_ptr;
7680 ctl_set_success(ctsio);
7681 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7682 ctsio->be_move_done = ctl_config_move_done;
7683 ctl_datamove((union ctl_io *)ctsio);
7688 ctl_report_supported_tmf(struct ctl_scsiio *ctsio)
7697 cdb = (struct scsi_report_supported_tmf *)ctsio->cdb;
7704 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
7706 ctsio->kern_sg_entries = 0;
7709 ctsio->residual = alloc_len - total_len;
7710 ctsio->kern_data_len = total_len;
7711 ctsio->kern_total_len = total_len;
7713 ctsio->residual = 0;
7714 ctsio->kern_data_len = alloc_len;
7715 ctsio->kern_total_len = alloc_len;
7717 ctsio->kern_data_resid = 0;
7718 ctsio->kern_rel_offset = 0;
7720 data = (struct scsi_report_supported_tmf_data *)ctsio->kern_data_ptr;
7724 ctl_set_success(ctsio);
7725 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7726 ctsio->be_move_done = ctl_config_move_done;
7727 ctl_datamove((union ctl_io *)ctsio);
7732 ctl_report_timestamp(struct ctl_scsiio *ctsio)
7743 cdb = (struct scsi_report_timestamp *)ctsio->cdb;
7750 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
7752 ctsio->kern_sg_entries = 0;
7755 ctsio->residual = alloc_len - total_len;
7756 ctsio->kern_data_len = total_len;
7757 ctsio->kern_total_len = total_len;
7759 ctsio->residual = 0;
7760 ctsio->kern_data_len = alloc_len;
7761 ctsio->kern_total_len = alloc_len;
7763 ctsio->kern_data_resid = 0;
7764 ctsio->kern_rel_offset = 0;
7766 data = (struct scsi_report_timestamp_data *)ctsio->kern_data_ptr;
7774 ctl_set_success(ctsio);
7775 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
7776 ctsio->be_move_done = ctl_config_move_done;
7777 ctl_datamove((union ctl_io *)ctsio);
7782 ctl_persistent_reserve_in(struct ctl_scsiio *ctsio)
7793 cdb = (struct scsi_per_res_in *)ctsio->cdb;
7797 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
7827 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
7830 ctsio->residual = alloc_len - total_len;
7831 ctsio->kern_data_len = total_len;
7832 ctsio->kern_total_len = total_len;
7834 ctsio->residual = 0;
7835 ctsio->kern_data_len = alloc_len;
7836 ctsio->kern_total_len = alloc_len;
7839 ctsio->kern_data_resid = 0;
7840 ctsio->kern_rel_offset = 0;
7841 ctsio->kern_sg_entries = 0;
7849 res_keys = (struct scsi_per_res_in_keys*)ctsio->kern_data_ptr;
7862 free(ctsio->kern_data_ptr, M_CTL);
7909 res = (struct scsi_per_res_in_rsrv *)ctsio->kern_data_ptr;
7934 free(ctsio->kern_data_ptr, M_CTL);
7962 res_cap = (struct scsi_per_res_cap *)ctsio->kern_data_ptr;
7980 res_status = (struct scsi_per_res_in_full*)ctsio->kern_data_ptr;
7993 free(ctsio->kern_data_ptr, M_CTL);
8040 ctl_set_success(ctsio);
8041 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
8042 ctsio->be_move_done = ctl_config_move_done;
8043 ctl_datamove((union ctl_io *)ctsio);
8063 struct ctl_scsiio *ctsio, struct scsi_per_res_out *cdb,
8079 ctl_set_invalid_field(/*ctsio*/ ctsio,
8085 ctl_done((union ctl_io *)ctsio);
8091 ctl_set_invalid_field(/*ctsio*/ ctsio,
8097 ctl_done((union ctl_io *)ctsio);
8119 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8137 free(ctsio->kern_data_ptr, M_CTL);
8138 ctl_set_invalid_field(ctsio,
8144 ctl_done((union ctl_io *)ctsio);
8163 free(ctsio->kern_data_ptr, M_CTL);
8164 ctl_set_invalid_field(ctsio,
8170 ctl_done((union ctl_io *)ctsio);
8185 free(ctsio->kern_data_ptr, M_CTL);
8186 ctl_set_reservation_conflict(ctsio);
8187 ctl_done((union ctl_io *)ctsio);
8191 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8213 ctl_set_invalid_field(/*ctsio*/ ctsio,
8219 ctl_done((union ctl_io *)ctsio);
8225 ctl_set_invalid_field(/*ctsio*/ ctsio,
8231 ctl_done((union ctl_io *)ctsio);
8270 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8304 free(ctsio->kern_data_ptr, M_CTL);
8305 ctl_set_reservation_conflict(ctsio);
8306 ctl_done((union ctl_io *)ctsio);
8309 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8402 ctl_persistent_reserve_out(struct ctl_scsiio *ctsio)
8421 cdb = (struct scsi_per_res_out *)ctsio->cdb;
8422 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
8435 ctl_set_invalid_field(/*ctsio*/ ctsio,
8441 ctl_done((union ctl_io *)ctsio);
8446 ctl_set_invalid_field(/*ctsio*/ ctsio,
8452 ctl_done((union ctl_io *)ctsio);
8459 if ((ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0) {
8460 ctsio->kern_data_ptr = malloc(param_len, M_CTL, M_WAITOK);
8461 ctsio->kern_data_len = param_len;
8462 ctsio->kern_total_len = param_len;
8463 ctsio->kern_data_resid = 0;
8464 ctsio->kern_rel_offset = 0;
8465 ctsio->kern_sg_entries = 0;
8466 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
8467 ctsio->be_move_done = ctl_config_move_done;
8468 ctl_datamove((union ctl_io *)ctsio);
8473 param = (struct scsi_per_res_out_parms *)ctsio->kern_data_ptr;
8475 residx = ctl_get_resindex(&ctsio->io_hdr.nexus);
8493 free(ctsio->kern_data_ptr, M_CTL);
8494 ctl_set_reservation_conflict(ctsio);
8495 ctl_done((union ctl_io *)ctsio);
8503 free(ctsio->kern_data_ptr, M_CTL);
8504 ctl_set_reservation_conflict(ctsio);
8505 ctl_done((union ctl_io *)ctsio);
8513 free(ctsio->kern_data_ptr, M_CTL);
8514 ctl_set_reservation_conflict(ctsio);
8515 ctl_done((union ctl_io *)ctsio);
8546 free(ctsio->kern_data_ptr, M_CTL);
8547 ctl_set_invalid_field(ctsio,
8553 ctl_done((union ctl_io *)ctsio);
8606 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8627 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8661 free(ctsio->kern_data_ptr, M_CTL);
8662 ctl_set_reservation_conflict(ctsio);
8663 ctl_done((union ctl_io *)ctsio);
8684 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8720 free(ctsio->kern_data_ptr, M_CTL);
8721 ctl_set_illegal_pr_release(ctsio);
8722 ctl_done((union ctl_io *)ctsio);
8748 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8775 persis_io.hdr.nexus = ctsio->io_hdr.nexus;
8790 residx, ctsio, cdb, param);
8800 free(ctsio->kern_data_ptr, M_CTL);
8801 ctl_set_success(ctsio);
8802 ctl_done((union ctl_io *)ctsio);
8923 ctl_read_write(struct ctl_scsiio *ctsio)
8932 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
8934 CTL_DEBUG_PRINT(("ctl_read_write: command: %#x\n", ctsio->cdb[0]));
8939 isread = ctsio->cdb[0] == READ_6 || ctsio->cdb[0] == READ_10
8940 || ctsio->cdb[0] == READ_12 || ctsio->cdb[0] == READ_16;
8941 switch (ctsio->cdb[0]) {
8946 cdb = (struct scsi_rw_6 *)ctsio->cdb;
8963 cdb = (struct scsi_rw_10 *)ctsio->cdb;
8975 cdb = (struct scsi_write_verify_10 *)ctsio->cdb;
8987 cdb = (struct scsi_rw_12 *)ctsio->cdb;
8999 cdb = (struct scsi_write_verify_12 *)ctsio->cdb;
9011 cdb = (struct scsi_rw_16 *)ctsio->cdb;
9024 ctl_set_invalid_opcode(ctsio);
9025 ctl_done((union ctl_io *)ctsio);
9029 cdb = (struct scsi_rw_16 *)ctsio->cdb;
9037 ctl_set_invalid_field(ctsio, /*sks_valid*/ 1,
9040 ctl_done((union ctl_io *)ctsio);
9048 cdb = (struct scsi_write_verify_16 *)ctsio->cdb;
9061 ctl_set_invalid_opcode(ctsio);
9062 ctl_done((union ctl_io *)ctsio);
9076 ctl_set_lba_out_of_range(ctsio);
9077 ctl_done((union ctl_io *)ctsio);
9087 ctl_set_success(ctsio);
9088 ctl_done((union ctl_io *)ctsio);
9104 &ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
9109 ctsio->kern_total_len = num_blocks * lun->be_lun->blocksize;
9110 ctsio->kern_rel_offset = 0;
9114 retval = lun->backend->data_submit((union ctl_io *)ctsio);
9122 struct ctl_scsiio *ctsio;
9127 ctsio = &io->scsiio;
9128 ctsio->io_hdr.status = CTL_STATUS_NONE;
9129 ctsio->io_hdr.flags &= ~CTL_FLAG_IO_CONT;
9130 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
9132 &ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
9137 retval = lun->backend->data_submit((union ctl_io *)ctsio);
9142 ctl_cnw(struct ctl_scsiio *ctsio)
9150 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
9152 CTL_DEBUG_PRINT(("ctl_cnw: command: %#x\n", ctsio->cdb[0]));
9157 switch (ctsio->cdb[0]) {
9161 cdb = (struct scsi_compare_and_write *)ctsio->cdb;
9175 ctl_set_invalid_opcode(ctsio);
9176 ctl_done((union ctl_io *)ctsio);
9190 ctl_set_lba_out_of_range(ctsio);
9191 ctl_done((union ctl_io *)ctsio);
9199 ctl_set_success(ctsio);
9200 ctl_done((union ctl_io *)ctsio);
9209 ctsio->kern_total_len = 2 * num_blocks * lun->be_lun->blocksize;
9210 ctsio->kern_rel_offset = 0;
9217 ctsio->io_hdr.flags |= CTL_FLAG_IO_CONT;
9218 ctsio->io_cont = ctl_cnw_cont;
9221 &ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
9227 retval = lun->backend->data_submit((union ctl_io *)ctsio);
9232 ctl_verify(struct ctl_scsiio *ctsio)
9241 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
9243 CTL_DEBUG_PRINT(("ctl_verify: command: %#x\n", ctsio->cdb[0]));
9249 switch (ctsio->cdb[0]) {
9253 cdb = (struct scsi_verify_10 *)ctsio->cdb;
9265 cdb = (struct scsi_verify_12 *)ctsio->cdb;
9277 cdb = (struct scsi_rw_16 *)ctsio->cdb;
9291 ctl_set_invalid_opcode(ctsio);
9292 ctl_done((union ctl_io *)ctsio);
9304 ctl_set_lba_out_of_range(ctsio);
9305 ctl_done((union ctl_io *)ctsio);
9313 ctl_set_success(ctsio);
9314 ctl_done((union ctl_io *)ctsio);
9319 &ctsio->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
9324 ctsio->kern_total_len = num_blocks * lun->be_lun->blocksize;
9327 ctsio->kern_total_len = 0;
9329 ctsio->kern_rel_offset = 0;
9332 retval = lun->backend->data_submit((union ctl_io *)ctsio);
9337 ctl_report_luns(struct ctl_scsiio *ctsio)
9352 cdb = (struct scsi_report_luns *)ctsio->cdb;
9353 port = ctl_io_port(&ctsio->io_hdr);
9374 ctl_set_invalid_field(ctsio,
9380 ctl_done((union ctl_io *)ctsio);
9393 ctl_set_invalid_field(ctsio,
9399 ctl_done((union ctl_io *)ctsio);
9404 ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
9409 ctsio->kern_data_ptr = malloc(lun_datalen, M_CTL, M_WAITOK | M_ZERO);
9410 lun_data = (struct scsi_report_luns_data *)ctsio->kern_data_ptr;
9411 ctsio->kern_sg_entries = 0;
9413 initidx = ctl_get_initindex(&ctsio->io_hdr.nexus);
9486 ctsio->residual = alloc_len - lun_datalen;
9487 ctsio->kern_data_len = lun_datalen;
9488 ctsio->kern_total_len = lun_datalen;
9490 ctsio->residual = 0;
9491 ctsio->kern_data_len = alloc_len;
9492 ctsio->kern_total_len = alloc_len;
9494 ctsio->kern_data_resid = 0;
9495 ctsio->kern_rel_offset = 0;
9496 ctsio->kern_sg_entries = 0;
9511 ctl_set_success(ctsio);
9512 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9513 ctsio->be_move_done = ctl_config_move_done;
9514 ctl_datamove((union ctl_io *)ctsio);
9519 ctl_request_sense(struct ctl_scsiio *ctsio)
9530 cdb = (struct scsi_request_sense *)ctsio->cdb;
9533 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
9545 ctsio->kern_data_ptr = malloc(sizeof(*sense_ptr), M_CTL, M_WAITOK);
9546 sense_ptr = (struct scsi_sense_data *)ctsio->kern_data_ptr;
9547 ctsio->kern_sg_entries = 0;
9554 ctsio->residual = 0;
9555 ctsio->kern_data_len = cdb->length;
9556 ctsio->kern_total_len = cdb->length;
9558 ctsio->kern_data_resid = 0;
9559 ctsio->kern_rel_offset = 0;
9560 ctsio->kern_sg_entries = 0;
9569 initidx = ctl_get_initindex(&ctsio->io_hdr.nexus);
9640 ctl_set_success(ctsio);
9641 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9642 ctsio->be_move_done = ctl_config_move_done;
9643 ctl_datamove((union ctl_io *)ctsio);
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_tur(struct ctl_scsiio *ctsio)
9679 ctl_set_success(ctsio);
9680 ctl_done((union ctl_io *)ctsio);
9687 ctl_cmddt_inquiry(struct ctl_scsiio *ctsio)
9697 ctl_inquiry_evpd_supported(struct ctl_scsiio *ctsio, int alloc_len)
9704 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
9708 ctsio->kern_data_ptr = malloc(sup_page_size, M_CTL, M_WAITOK | M_ZERO);
9709 pages = (struct scsi_vpd_supported_pages *)ctsio->kern_data_ptr;
9710 ctsio->kern_sg_entries = 0;
9713 ctsio->residual = alloc_len - sup_page_size;
9714 ctsio->kern_data_len = sup_page_size;
9715 ctsio->kern_total_len = sup_page_size;
9717 ctsio->residual = 0;
9718 ctsio->kern_data_len = alloc_len;
9719 ctsio->kern_total_len = alloc_len;
9721 ctsio->kern_data_resid = 0;
9722 ctsio->kern_rel_offset = 0;
9723 ctsio->kern_sg_entries = 0;
9761 ctl_set_success(ctsio);
9762 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9763 ctsio->be_move_done = ctl_config_move_done;
9764 ctl_datamove((union ctl_io *)ctsio);
9772 ctl_inquiry_evpd_serial(struct ctl_scsiio *ctsio, int alloc_len)
9778 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
9781 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
9782 sn_ptr = (struct scsi_vpd_unit_serial_number *)ctsio->kern_data_ptr;
9784 ctsio->residual = alloc_len - data_len;
9785 ctsio->kern_data_len = data_len;
9786 ctsio->kern_total_len = data_len;
9788 ctsio->residual = 0;
9789 ctsio->kern_data_len = alloc_len;
9790 ctsio->kern_total_len = alloc_len;
9792 ctsio->kern_data_resid = 0;
9793 ctsio->kern_rel_offset = 0;
9794 ctsio->kern_sg_entries = 0;
9819 ctl_set_success(ctsio);
9820 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9821 ctsio->be_move_done = ctl_config_move_done;
9822 ctl_datamove((union ctl_io *)ctsio);
9831 ctl_inquiry_evpd_eid(struct ctl_scsiio *ctsio, int alloc_len)
9837 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
9840 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
9841 eid_ptr = (struct scsi_vpd_extended_inquiry_data *)ctsio->kern_data_ptr;
9842 ctsio->kern_sg_entries = 0;
9845 ctsio->residual = alloc_len - data_len;
9846 ctsio->kern_data_len = data_len;
9847 ctsio->kern_total_len = data_len;
9849 ctsio->residual = 0;
9850 ctsio->kern_data_len = alloc_len;
9851 ctsio->kern_total_len = alloc_len;
9853 ctsio->kern_data_resid = 0;
9854 ctsio->kern_rel_offset = 0;
9855 ctsio->kern_sg_entries = 0;
9894 ctl_set_success(ctsio);
9895 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9896 ctsio->be_move_done = ctl_config_move_done;
9897 ctl_datamove((union ctl_io *)ctsio);
9902 ctl_inquiry_evpd_mpp(struct ctl_scsiio *ctsio, int alloc_len)
9908 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
9913 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
9914 mpp_ptr = (struct scsi_vpd_mode_page_policy *)ctsio->kern_data_ptr;
9915 ctsio->kern_sg_entries = 0;
9918 ctsio->residual = alloc_len - data_len;
9919 ctsio->kern_data_len = data_len;
9920 ctsio->kern_total_len = data_len;
9922 ctsio->residual = 0;
9923 ctsio->kern_data_len = alloc_len;
9924 ctsio->kern_total_len = alloc_len;
9926 ctsio->kern_data_resid = 0;
9927 ctsio->kern_rel_offset = 0;
9928 ctsio->kern_sg_entries = 0;
9945 ctl_set_success(ctsio);
9946 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
9947 ctsio->be_move_done = ctl_config_move_done;
9948 ctl_datamove((union ctl_io *)ctsio);
9956 ctl_inquiry_evpd_devid(struct ctl_scsiio *ctsio, int alloc_len)
9968 port = softc->ctl_ports[ctl_port_idx(ctsio->io_hdr.nexus.targ_port)];
9969 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
9983 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
9984 devid_ptr = (struct scsi_vpd_device_id *)ctsio->kern_data_ptr;
9985 ctsio->kern_sg_entries = 0;
9988 ctsio->residual = alloc_len - data_len;
9989 ctsio->kern_data_len = data_len;
9990 ctsio->kern_total_len = data_len;
9992 ctsio->residual = 0;
9993 ctsio->kern_data_len = alloc_len;
9994 ctsio->kern_total_len = alloc_len;
9996 ctsio->kern_data_resid = 0;
9997 ctsio->kern_rel_offset = 0;
9998 ctsio->kern_sg_entries = 0;
10046 scsi_ulto2b(ctsio->io_hdr.nexus.targ_port, &desc->identifier[2]);
10057 scsi_ulto2b(ctsio->io_hdr.nexus.targ_port / CTL_MAX_PORTS + 1,
10069 ctl_set_success(ctsio);
10070 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
10071 ctsio->be_move_done = ctl_config_move_done;
10072 ctl_datamove((union ctl_io *)ctsio);
10077 ctl_inquiry_evpd_scsi_ports(struct ctl_scsiio *ctsio, int alloc_len)
10088 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
10115 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
10116 sp = (struct scsi_vpd_scsi_ports *)ctsio->kern_data_ptr;
10117 ctsio->kern_sg_entries = 0;
10120 ctsio->residual = alloc_len - data_len;
10121 ctsio->kern_data_len = data_len;
10122 ctsio->kern_total_len = data_len;
10124 ctsio->residual = 0;
10125 ctsio->kern_data_len = alloc_len;
10126 ctsio->kern_total_len = alloc_len;
10128 ctsio->kern_data_resid = 0;
10129 ctsio->kern_rel_offset = 0;
10130 ctsio->kern_sg_entries = 0;
10181 ctl_set_success(ctsio);
10182 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
10183 ctsio->be_move_done = ctl_config_move_done;
10184 ctl_datamove((union ctl_io *)ctsio);
10189 ctl_inquiry_evpd_block_limits(struct ctl_scsiio *ctsio, int alloc_len)
10195 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
10197 ctsio->kern_data_ptr = malloc(sizeof(*bl_ptr), M_CTL, M_WAITOK | M_ZERO);
10198 bl_ptr = (struct scsi_vpd_block_limits *)ctsio->kern_data_ptr;
10199 ctsio->kern_sg_entries = 0;
10202 ctsio->residual = alloc_len - sizeof(*bl_ptr);
10203 ctsio->kern_data_len = sizeof(*bl_ptr);
10204 ctsio->kern_total_len = sizeof(*bl_ptr);
10206 ctsio->residual = 0;
10207 ctsio->kern_data_len = alloc_len;
10208 ctsio->kern_total_len = alloc_len;
10210 ctsio->kern_data_resid = 0;
10211 ctsio->kern_rel_offset = 0;
10212 ctsio->kern_sg_entries = 0;
10249 ctl_set_success(ctsio);
10250 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
10251 ctsio->be_move_done = ctl_config_move_done;
10252 ctl_datamove((union ctl_io *)ctsio);
10257 ctl_inquiry_evpd_bdc(struct ctl_scsiio *ctsio, int alloc_len)
10264 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
10266 ctsio->kern_data_ptr = malloc(sizeof(*bdc_ptr), M_CTL, M_WAITOK | M_ZERO);
10267 bdc_ptr = (struct scsi_vpd_block_device_characteristics *)ctsio->kern_data_ptr;
10268 ctsio->kern_sg_entries = 0;
10271 ctsio->residual = alloc_len - sizeof(*bdc_ptr);
10272 ctsio->kern_data_len = sizeof(*bdc_ptr);
10273 ctsio->kern_total_len = sizeof(*bdc_ptr);
10275 ctsio->residual = 0;
10276 ctsio->kern_data_len = alloc_len;
10277 ctsio->kern_total_len = alloc_len;
10279 ctsio->kern_data_resid = 0;
10280 ctsio->kern_rel_offset = 0;
10281 ctsio->kern_sg_entries = 0;
10309 ctl_set_success(ctsio);
10310 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
10311 ctsio->be_move_done = ctl_config_move_done;
10312 ctl_datamove((union ctl_io *)ctsio);
10317 ctl_inquiry_evpd_lbp(struct ctl_scsiio *ctsio, int alloc_len)
10322 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
10324 ctsio->kern_data_ptr = malloc(sizeof(*lbp_ptr), M_CTL, M_WAITOK | M_ZERO);
10325 lbp_ptr = (struct scsi_vpd_logical_block_prov *)ctsio->kern_data_ptr;
10326 ctsio->kern_sg_entries = 0;
10329 ctsio->residual = alloc_len - sizeof(*lbp_ptr);
10330 ctsio->kern_data_len = sizeof(*lbp_ptr);
10331 ctsio->kern_total_len = sizeof(*lbp_ptr);
10333 ctsio->residual = 0;
10334 ctsio->kern_data_len = alloc_len;
10335 ctsio->kern_total_len = alloc_len;
10337 ctsio->kern_data_resid = 0;
10338 ctsio->kern_rel_offset = 0;
10339 ctsio->kern_sg_entries = 0;
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);
10372 ctl_inquiry_evpd(struct ctl_scsiio *ctsio)
10378 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
10379 cdb = (struct scsi_inquiry *)ctsio->cdb;
10384 retval = ctl_inquiry_evpd_supported(ctsio, alloc_len);
10387 retval = ctl_inquiry_evpd_serial(ctsio, alloc_len);
10390 retval = ctl_inquiry_evpd_devid(ctsio, alloc_len);
10393 retval = ctl_inquiry_evpd_eid(ctsio, alloc_len);
10396 retval = ctl_inquiry_evpd_mpp(ctsio, alloc_len);
10399 retval = ctl_inquiry_evpd_scsi_ports(ctsio, alloc_len);
10402 retval = ctl_inquiry_evpd_tpc(ctsio, alloc_len);
10407 retval = ctl_inquiry_evpd_block_limits(ctsio, alloc_len);
10412 retval = ctl_inquiry_evpd_bdc(ctsio, alloc_len);
10417 retval = ctl_inquiry_evpd_lbp(ctsio, alloc_len);
10421 ctl_set_invalid_field(ctsio,
10427 ctl_done((union ctl_io *)ctsio);
10439 ctl_inquiry_std(struct ctl_scsiio *ctsio)
10457 ctl_port_idx(ctsio->io_hdr.nexus.targ_port)]->port_type;
10461 lun = ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
10462 cdb = (struct scsi_inquiry *)ctsio->cdb;
10471 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
10472 inq_ptr = (struct scsi_inquiry_data *)ctsio->kern_data_ptr;
10473 ctsio->kern_sg_entries = 0;
10474 ctsio->kern_data_resid = 0;
10475 ctsio->kern_rel_offset = 0;
10478 ctsio->residual = alloc_len - data_len;
10479 ctsio->kern_data_len = data_len;
10480 ctsio->kern_total_len = data_len;
10482 ctsio->residual = 0;
10483 ctsio->kern_data_len = alloc_len;
10484 ctsio->kern_total_len = alloc_len;
10676 ctl_set_success(ctsio);
10677 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
10678 ctsio->be_move_done = ctl_config_move_done;
10679 ctl_datamove((union ctl_io *)ctsio);
10684 ctl_inquiry(struct ctl_scsiio *ctsio)
10691 cdb = (struct scsi_inquiry *)ctsio->cdb;
10693 retval = ctl_inquiry_evpd(ctsio);
10695 retval = ctl_inquiry_std(ctsio);
10697 ctl_set_invalid_field(ctsio,
10703 ctl_done((union ctl_io *)ctsio);
11250 const struct ctl_cmd_entry *entry, struct ctl_scsiio *ctsio)
11266 ctl_set_lun_standby(ctsio);
11273 ctl_set_sense(ctsio, /*current_error*/ 1,
11281 ctl_set_sense(ctsio, /*current_error*/ 1,
11294 residx = ctl_get_resindex(&ctsio->io_hdr.nexus);
11298 ctl_set_reservation_conflict(ctsio);
11320 ctl_set_reservation_conflict(ctsio);
11329 ctl_set_lun_not_ready(ctsio);
11341 ctl_set_lun_stopped(ctsio);
11349 ctl_set_medium_format_corrupted(ctsio);
11626 ctl_scsiio_precheck(struct ctl_softc *softc, struct ctl_scsiio *ctsio)
11637 targ_lun = ctsio->io_hdr.nexus.targ_mapped_lun;
11649 ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr = NULL;
11650 ctsio->io_hdr.ctl_private[CTL_PRIV_BACKEND_LUN].ptr = NULL;
11652 ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr = lun;
11653 ctsio->io_hdr.ctl_private[CTL_PRIV_BACKEND_LUN].ptr =
11656 ctsio->io_hdr.flags |= CTL_FLAG_CONTROL_DEV;
11669 TAILQ_INSERT_TAIL(&lun->ooa_queue, &ctsio->io_hdr,
11673 ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr = NULL;
11674 ctsio->io_hdr.ctl_private[CTL_PRIV_BACKEND_LUN].ptr = NULL;
11678 entry = ctl_validate_command(ctsio);
11685 ctsio->io_hdr.flags &= ~CTL_FLAG_DATA_MASK;
11686 ctsio->io_hdr.flags |= entry->flags & CTL_FLAG_DATA_MASK;
11697 ctsio->io_hdr.flags |= CTL_FLAG_IS_WAS_ON_RTR;
11698 ctl_enqueue_rtr((union ctl_io *)ctsio);
11702 ctl_set_unsupported_lun(ctsio);
11703 ctl_done((union ctl_io *)ctsio);
11713 ctl_set_invalid_opcode(ctsio);
11714 ctl_done((union ctl_io *)ctsio);
11719 initidx = ctl_get_initindex(&ctsio->io_hdr.nexus);
11728 if ((ctsio->cdb[0] != REQUEST_SENSE)
11764 ua_type = ctl_build_ua(lun, initidx, &ctsio->sense_data,
11768 ctsio->scsi_status = SCSI_STATUS_CHECK_COND;
11769 ctsio->io_hdr.status = CTL_SCSI_ERROR | CTL_AUTOSENSE;
11770 ctsio->sense_len = SSD_FULL_SIZE;
11771 ctl_done((union ctl_io *)ctsio);
11777 if (ctl_scsiio_lun_check(lun, entry, ctsio) != 0) {
11779 ctl_done((union ctl_io *)ctsio);
11796 ctsio->io_hdr.flags |= CTL_FLAG_SENT_2OTHER_SC;
11799 msg_info.hdr.original_sc = (union ctl_io *)ctsio;
11801 printf("1. ctsio %p\n", ctsio);
11804 msg_info.hdr.nexus = ctsio->io_hdr.nexus;
11805 msg_info.scsi.tag_num = ctsio->tag_num;
11806 msg_info.scsi.tag_type = ctsio->tag_type;
11807 memcpy(msg_info.scsi.cdb, ctsio->cdb, CTL_MAX_CDBLEN);
11809 ctsio->io_hdr.flags &= ~CTL_FLAG_IO_ACTIVE;
11816 printf("CTL:opcode is %x\n", ctsio->cdb[0]);
11834 switch (ctl_check_ooa(lun, (union ctl_io *)ctsio,
11835 (union ctl_io *)TAILQ_PREV(&ctsio->io_hdr,
11838 ctsio->io_hdr.flags |= CTL_FLAG_BLOCKED;
11839 TAILQ_INSERT_TAIL(&lun->blocked_queue, &ctsio->io_hdr,
11845 ctsio->io_hdr.flags |= CTL_FLAG_IS_WAS_ON_RTR;
11847 ctl_enqueue_rtr((union ctl_io *)ctsio);
11851 ctl_set_overlapped_cmd(ctsio);
11852 ctl_done((union ctl_io *)ctsio);
11856 ctl_set_overlapped_tag(ctsio, ctsio->tag_num & 0xff);
11857 ctl_done((union ctl_io *)ctsio);
11862 ctl_set_internal_failure(ctsio,
11865 ctl_done((union ctl_io *)ctsio);
11872 ctl_get_cmd_entry(struct ctl_scsiio *ctsio, int *sa)
11877 entry = &ctl_cmd_table[ctsio->cdb[0]];
11881 service_action = ctsio->cdb[1] & SERVICE_ACTION_MASK;
11889 ctl_validate_command(struct ctl_scsiio *ctsio)
11895 entry = ctl_get_cmd_entry(ctsio, &sa);
11898 ctl_set_invalid_field(ctsio,
11905 ctl_set_invalid_opcode(ctsio);
11906 ctl_done((union ctl_io *)ctsio);
11911 ctsio->cdb[0], ctsio->cdb[1]));
11913 diff = ctsio->cdb[i] & ~entry->usage[i - 1];
11916 ctl_set_invalid_field(ctsio,
11922 ctl_done((union ctl_io *)ctsio);
11950 ctl_scsiio(struct ctl_scsiio *ctsio)
11957 CTL_DEBUG_PRINT(("ctl_scsiio cdb[0]=%02X\n", ctsio->cdb[0]));
11959 entry = ctl_get_cmd_entry(ctsio, NULL);
11965 if (ctsio->io_hdr.flags & CTL_FLAG_ABORT) {
11966 ctl_done((union ctl_io *)ctsio);
11974 retval = entry->execute(ctsio);
12539 ctl_cmd_pattern_match(struct ctl_scsiio *ctsio, struct ctl_error_desc *desc)
12557 entry = ctl_get_cmd_entry(ctsio, NULL);
12583 retval = ctl_get_lba_len((union ctl_io *)ctsio, &lba1, &len1);
13850 port = ctl_io_port(&ctsio->io_hdr);
14020 ctl_isc(struct ctl_scsiio *ctsio)
14025 lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
14027 CTL_DEBUG_PRINT(("ctl_isc: command: %02x\n", ctsio->cdb[0]));
14031 retval = lun->backend->data_submit((union ctl_io *)ctsio);