Lines Matching refs:ccb
62 static void ataaction(struct cam_sim *sim, union ccb *ccb);
64 static void ata_cam_begin_transaction(device_t dev, union ccb *ccb);
67 static int ata_check_ids(device_t dev, union ccb *ccb);
266 union ccb *ccb; in ata_conn_event() local
274 if ((ccb = xpt_alloc_ccb_nowait()) == NULL) in ata_conn_event()
276 if (xpt_create_path(&ccb->ccb_h.path, NULL, in ata_conn_event()
279 xpt_free_ccb(ccb); in ata_conn_event()
282 xpt_rescan(ccb); in ata_conn_event()
446 request->u.atapi.saved_cmd : request->u.atapi.ccb[0]) { in ata_cmd2str()
734 ata_cam_begin_transaction(device_t dev, union ccb *ccb) in ata_cam_begin_transaction() argument
745 request->unit = ccb->ccb_h.target_id; in ata_cam_begin_transaction()
746 if (ccb->ccb_h.func_code == XPT_ATA_IO) { in ata_cam_begin_transaction()
747 request->data = ccb->ataio.data_ptr; in ata_cam_begin_transaction()
748 request->bytecount = ccb->ataio.dxfer_len; in ata_cam_begin_transaction()
749 request->u.ata.command = ccb->ataio.cmd.command; in ata_cam_begin_transaction()
750 request->u.ata.feature = ((uint16_t)ccb->ataio.cmd.features_exp << 8) | in ata_cam_begin_transaction()
751 (uint16_t)ccb->ataio.cmd.features; in ata_cam_begin_transaction()
752 request->u.ata.count = ((uint16_t)ccb->ataio.cmd.sector_count_exp << 8) | in ata_cam_begin_transaction()
753 (uint16_t)ccb->ataio.cmd.sector_count; in ata_cam_begin_transaction()
754 if (ccb->ataio.cmd.flags & CAM_ATAIO_48BIT) { in ata_cam_begin_transaction()
757 ((uint64_t)ccb->ataio.cmd.lba_high_exp << 40) | in ata_cam_begin_transaction()
758 ((uint64_t)ccb->ataio.cmd.lba_mid_exp << 32) | in ata_cam_begin_transaction()
759 ((uint64_t)ccb->ataio.cmd.lba_low_exp << 24); in ata_cam_begin_transaction()
762 ((uint64_t)(ccb->ataio.cmd.device & 0x0f) << 24); in ata_cam_begin_transaction()
764 request->u.ata.lba |= ((uint64_t)ccb->ataio.cmd.lba_high << 16) | in ata_cam_begin_transaction()
765 ((uint64_t)ccb->ataio.cmd.lba_mid << 8) | in ata_cam_begin_transaction()
766 (uint64_t)ccb->ataio.cmd.lba_low; in ata_cam_begin_transaction()
767 if (ccb->ataio.cmd.flags & CAM_ATAIO_NEEDRESULT) in ata_cam_begin_transaction()
769 if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE && in ata_cam_begin_transaction()
770 ccb->ataio.cmd.flags & CAM_ATAIO_DMA) in ata_cam_begin_transaction()
772 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) in ata_cam_begin_transaction()
774 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) in ata_cam_begin_transaction()
776 if (ccb->ataio.cmd.command == ATA_READ_MUL || in ata_cam_begin_transaction()
777 ccb->ataio.cmd.command == ATA_READ_MUL48 || in ata_cam_begin_transaction()
778 ccb->ataio.cmd.command == ATA_WRITE_MUL || in ata_cam_begin_transaction()
779 ccb->ataio.cmd.command == ATA_WRITE_MUL48) { in ata_cam_begin_transaction()
781 ch->curr[ccb->ccb_h.target_id].bytecount); in ata_cam_begin_transaction()
785 request->data = ccb->csio.data_ptr; in ata_cam_begin_transaction()
786 request->bytecount = ccb->csio.dxfer_len; in ata_cam_begin_transaction()
787 bcopy((ccb->ccb_h.flags & CAM_CDB_POINTER) ? in ata_cam_begin_transaction()
788 ccb->csio.cdb_io.cdb_ptr : ccb->csio.cdb_io.cdb_bytes, in ata_cam_begin_transaction()
789 request->u.atapi.ccb, ccb->csio.cdb_len); in ata_cam_begin_transaction()
791 if (ch->curr[ccb->ccb_h.target_id].atapi == 16) in ata_cam_begin_transaction()
793 if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE && in ata_cam_begin_transaction()
794 ch->curr[ccb->ccb_h.target_id].mode >= ATA_DMA) in ata_cam_begin_transaction()
796 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) in ata_cam_begin_transaction()
798 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) in ata_cam_begin_transaction()
801 ch->curr[ccb->ccb_h.target_id].bytecount); in ata_cam_begin_transaction()
804 request->timeout = (ccb->ccb_h.timeout + 999) / 1000; in ata_cam_begin_transaction()
806 request->ccb = ccb; in ata_cam_begin_transaction()
823 union ccb *ccb = request->ccb; in ata_cam_request_sense() local
830 request->unit = ccb->ccb_h.target_id; in ata_cam_request_sense()
831 request->data = (void *)&ccb->csio.sense_data; in ata_cam_request_sense()
832 request->bytecount = ccb->csio.sense_len; in ata_cam_request_sense()
833 request->u.atapi.ccb[0] = ATAPI_REQUEST_SENSE; in ata_cam_request_sense()
834 request->u.atapi.ccb[4] = ccb->csio.sense_len; in ata_cam_request_sense()
836 if (ch->curr[ccb->ccb_h.target_id].atapi == 16) in ata_cam_request_sense()
838 if (ch->curr[ccb->ccb_h.target_id].mode >= ATA_DMA) in ata_cam_request_sense()
842 ch->curr[ccb->ccb_h.target_id].bytecount); in ata_cam_request_sense()
844 request->timeout = (ccb->ccb_h.timeout + 999) / 1000; in ata_cam_request_sense()
846 request->ccb = ccb; in ata_cam_request_sense()
862 union ccb *ccb = request->ccb; in ata_cam_process_sense() local
872 ccb->ccb_h.status |= CAM_AUTOSNS_VALID; in ata_cam_process_sense()
874 ccb->ccb_h.status &= ~CAM_STATUS_MASK; in ata_cam_process_sense()
875 ccb->ccb_h.status |= CAM_AUTOSENSE_FAIL; in ata_cam_process_sense()
878 xpt_done(ccb); in ata_cam_process_sense()
888 union ccb *ccb = request->ccb; in ata_cam_end_transaction() local
896 ccb->ccb_h.status &= ~CAM_STATUS_MASK; in ata_cam_end_transaction()
899 ccb->ccb_h.status &= ~CAM_STATUS_MASK; in ata_cam_end_transaction()
900 ccb->ccb_h.status |= CAM_CMD_TIMEOUT | CAM_RELEASE_SIMQ; in ata_cam_end_transaction()
903 if (ccb->ccb_h.func_code == XPT_ATA_IO) { in ata_cam_end_transaction()
904 ccb->ccb_h.status |= CAM_ATA_STATUS_ERROR; in ata_cam_end_transaction()
906 ccb->ccb_h.status |= CAM_SCSI_STATUS_ERROR; in ata_cam_end_transaction()
907 ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND; in ata_cam_end_transaction()
910 ccb->ccb_h.status |= CAM_REQUEUE_REQ; in ata_cam_end_transaction()
912 ccb->ccb_h.status |= CAM_REQ_CMP_ERR; in ata_cam_end_transaction()
914 ccb->ccb_h.status |= CAM_REQ_CMP; in ata_cam_end_transaction()
915 if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP && in ata_cam_end_transaction()
916 !(ccb->ccb_h.status & CAM_DEV_QFRZN)) { in ata_cam_end_transaction()
917 xpt_freeze_devq(ccb->ccb_h.path, 1); in ata_cam_end_transaction()
918 ccb->ccb_h.status |= CAM_DEV_QFRZN; in ata_cam_end_transaction()
920 if (ccb->ccb_h.func_code == XPT_ATA_IO && in ata_cam_end_transaction()
922 (ccb->ataio.cmd.flags & CAM_ATAIO_NEEDRESULT))) { in ata_cam_end_transaction()
923 struct ata_res *res = &ccb->ataio.res; in ata_cam_end_transaction()
936 if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) { in ata_cam_end_transaction()
937 if (ccb->ccb_h.func_code == XPT_ATA_IO) { in ata_cam_end_transaction()
938 ccb->ataio.resid = in ata_cam_end_transaction()
939 ccb->ataio.dxfer_len - request->donecount; in ata_cam_end_transaction()
941 ccb->csio.resid = in ata_cam_end_transaction()
942 ccb->csio.dxfer_len - request->donecount; in ata_cam_end_transaction()
945 if ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_SCSI_STATUS_ERROR && in ata_cam_end_transaction()
946 (ccb->ccb_h.flags & CAM_DIS_AUTOSENSE) == 0) in ata_cam_end_transaction()
949 xpt_done(ccb); in ata_cam_end_transaction()
956 ata_check_ids(device_t dev, union ccb *ccb) in ata_check_ids() argument
960 if (ccb->ccb_h.target_id > ((ch->flags & ATA_NO_SLAVE) ? 0 : 1)) { in ata_check_ids()
961 ccb->ccb_h.status = CAM_TID_INVALID; in ata_check_ids()
962 xpt_done(ccb); in ata_check_ids()
965 if (ccb->ccb_h.target_lun != 0) { in ata_check_ids()
966 ccb->ccb_h.status = CAM_LUN_INVALID; in ata_check_ids()
967 xpt_done(ccb); in ata_check_ids()
973 KASSERT(ccb->ccb_h.func_code != XPT_ATA_IO || in ata_check_ids()
974 ((ccb->ataio.ata_flags & ATA_FLAG_AUX) == 0), in ata_check_ids()
980 ataaction(struct cam_sim *sim, union ccb *ccb) in ataaction() argument
985 CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE, ("ataaction func_code=%x\n", in ataaction()
986 ccb->ccb_h.func_code)); in ataaction()
990 switch (ccb->ccb_h.func_code) { in ataaction()
994 if (ata_check_ids(dev, ccb)) in ataaction()
997 << ccb->ccb_h.target_id)) == 0) { in ataaction()
998 ccb->ccb_h.status = CAM_SEL_TIMEOUT; in ataaction()
1003 if (ccb->ccb_h.func_code == XPT_ATA_IO && in ataaction()
1004 (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) && in ataaction()
1005 (ccb->ataio.cmd.control & ATA_A_RESET)) { in ataaction()
1006 struct ata_res *res = &ccb->ataio.res; in ataaction()
1009 if (ch->devices & (ATA_ATA_MASTER << ccb->ccb_h.target_id)) { in ataaction()
1016 ccb->ccb_h.status = CAM_REQ_CMP; in ataaction()
1019 ata_cam_begin_transaction(dev, ccb); in ataaction()
1023 ccb->ccb_h.status = CAM_REQ_INVALID; in ataaction()
1027 struct ccb_trans_settings *cts = &ccb->cts; in ataaction()
1030 if (ata_check_ids(dev, ccb)) in ataaction()
1033 d = &ch->curr[ccb->ccb_h.target_id]; in ataaction()
1035 d = &ch->user[ccb->ccb_h.target_id]; in ataaction()
1042 ccb->ccb_h.target_id, in ataaction()
1057 ccb->ccb_h.target_id, in ataaction()
1069 ccb->ccb_h.status = CAM_REQ_CMP; in ataaction()
1074 struct ccb_trans_settings *cts = &ccb->cts; in ataaction()
1077 if (ata_check_ids(dev, ccb)) in ataaction()
1080 d = &ch->curr[ccb->ccb_h.target_id]; in ataaction()
1082 d = &ch->user[ccb->ccb_h.target_id]; in ataaction()
1095 ATA_GETREV(dev, ccb->ccb_h.target_id); in ataaction()
1107 ch->user[ccb->ccb_h.target_id].caps; in ataaction()
1131 ch->user[ccb->ccb_h.target_id].caps; in ataaction()
1138 ccb->ccb_h.status = CAM_REQ_CMP; in ataaction()
1144 ccb->ccb_h.status = CAM_REQ_CMP; in ataaction()
1148 ccb->ccb_h.status = CAM_REQ_INVALID; in ataaction()
1152 struct ccb_pathinq *cpi = &ccb->cpi; in ataaction()
1194 ccb->ccb_h.status = CAM_REQ_INVALID; in ataaction()
1197 xpt_done(ccb); in ataaction()