Lines Matching refs:ccb
60 static void ataaction(struct cam_sim *sim, union ccb *ccb);
62 static void ata_cam_begin_transaction(device_t dev, union ccb *ccb);
65 static int ata_check_ids(device_t dev, union ccb *ccb);
264 union ccb *ccb; in ata_conn_event() local
272 if ((ccb = xpt_alloc_ccb_nowait()) == NULL) in ata_conn_event()
274 if (xpt_create_path(&ccb->ccb_h.path, NULL, in ata_conn_event()
277 xpt_free_ccb(ccb); in ata_conn_event()
280 xpt_rescan(ccb); in ata_conn_event()
444 request->u.atapi.saved_cmd : request->u.atapi.ccb[0]) { in ata_cmd2str()
732 ata_cam_begin_transaction(device_t dev, union ccb *ccb) in ata_cam_begin_transaction() argument
743 request->unit = ccb->ccb_h.target_id; in ata_cam_begin_transaction()
744 if (ccb->ccb_h.func_code == XPT_ATA_IO) { in ata_cam_begin_transaction()
745 request->data = ccb->ataio.data_ptr; in ata_cam_begin_transaction()
746 request->bytecount = ccb->ataio.dxfer_len; in ata_cam_begin_transaction()
747 request->u.ata.command = ccb->ataio.cmd.command; in ata_cam_begin_transaction()
748 request->u.ata.feature = ((uint16_t)ccb->ataio.cmd.features_exp << 8) | in ata_cam_begin_transaction()
749 (uint16_t)ccb->ataio.cmd.features; in ata_cam_begin_transaction()
750 request->u.ata.count = ((uint16_t)ccb->ataio.cmd.sector_count_exp << 8) | in ata_cam_begin_transaction()
751 (uint16_t)ccb->ataio.cmd.sector_count; in ata_cam_begin_transaction()
752 if (ccb->ataio.cmd.flags & CAM_ATAIO_48BIT) { in ata_cam_begin_transaction()
755 ((uint64_t)ccb->ataio.cmd.lba_high_exp << 40) | in ata_cam_begin_transaction()
756 ((uint64_t)ccb->ataio.cmd.lba_mid_exp << 32) | in ata_cam_begin_transaction()
757 ((uint64_t)ccb->ataio.cmd.lba_low_exp << 24); in ata_cam_begin_transaction()
760 ((uint64_t)(ccb->ataio.cmd.device & 0x0f) << 24); in ata_cam_begin_transaction()
762 request->u.ata.lba |= ((uint64_t)ccb->ataio.cmd.lba_high << 16) | in ata_cam_begin_transaction()
763 ((uint64_t)ccb->ataio.cmd.lba_mid << 8) | in ata_cam_begin_transaction()
764 (uint64_t)ccb->ataio.cmd.lba_low; in ata_cam_begin_transaction()
765 if (ccb->ataio.cmd.flags & CAM_ATAIO_NEEDRESULT) in ata_cam_begin_transaction()
767 if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE && in ata_cam_begin_transaction()
768 ccb->ataio.cmd.flags & CAM_ATAIO_DMA) in ata_cam_begin_transaction()
770 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) in ata_cam_begin_transaction()
772 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) in ata_cam_begin_transaction()
774 if (ccb->ataio.cmd.command == ATA_READ_MUL || in ata_cam_begin_transaction()
775 ccb->ataio.cmd.command == ATA_READ_MUL48 || in ata_cam_begin_transaction()
776 ccb->ataio.cmd.command == ATA_WRITE_MUL || in ata_cam_begin_transaction()
777 ccb->ataio.cmd.command == ATA_WRITE_MUL48) { in ata_cam_begin_transaction()
779 ch->curr[ccb->ccb_h.target_id].bytecount); in ata_cam_begin_transaction()
783 request->data = ccb->csio.data_ptr; in ata_cam_begin_transaction()
784 request->bytecount = ccb->csio.dxfer_len; in ata_cam_begin_transaction()
785 bcopy((ccb->ccb_h.flags & CAM_CDB_POINTER) ? in ata_cam_begin_transaction()
786 ccb->csio.cdb_io.cdb_ptr : ccb->csio.cdb_io.cdb_bytes, in ata_cam_begin_transaction()
787 request->u.atapi.ccb, ccb->csio.cdb_len); in ata_cam_begin_transaction()
789 if (ch->curr[ccb->ccb_h.target_id].atapi == 16) in ata_cam_begin_transaction()
791 if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE && in ata_cam_begin_transaction()
792 ch->curr[ccb->ccb_h.target_id].mode >= ATA_DMA) in ata_cam_begin_transaction()
794 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) in ata_cam_begin_transaction()
796 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) in ata_cam_begin_transaction()
799 ch->curr[ccb->ccb_h.target_id].bytecount); in ata_cam_begin_transaction()
802 request->timeout = (ccb->ccb_h.timeout + 999) / 1000; in ata_cam_begin_transaction()
804 request->ccb = ccb; in ata_cam_begin_transaction()
821 union ccb *ccb = request->ccb; in ata_cam_request_sense() local
828 request->unit = ccb->ccb_h.target_id; in ata_cam_request_sense()
829 request->data = (void *)&ccb->csio.sense_data; in ata_cam_request_sense()
830 request->bytecount = ccb->csio.sense_len; in ata_cam_request_sense()
831 request->u.atapi.ccb[0] = ATAPI_REQUEST_SENSE; in ata_cam_request_sense()
832 request->u.atapi.ccb[4] = ccb->csio.sense_len; in ata_cam_request_sense()
834 if (ch->curr[ccb->ccb_h.target_id].atapi == 16) in ata_cam_request_sense()
836 if (ch->curr[ccb->ccb_h.target_id].mode >= ATA_DMA) in ata_cam_request_sense()
840 ch->curr[ccb->ccb_h.target_id].bytecount); in ata_cam_request_sense()
842 request->timeout = (ccb->ccb_h.timeout + 999) / 1000; in ata_cam_request_sense()
844 request->ccb = ccb; in ata_cam_request_sense()
860 union ccb *ccb = request->ccb; in ata_cam_process_sense() local
870 ccb->ccb_h.status |= CAM_AUTOSNS_VALID; in ata_cam_process_sense()
872 ccb->ccb_h.status &= ~CAM_STATUS_MASK; in ata_cam_process_sense()
873 ccb->ccb_h.status |= CAM_AUTOSENSE_FAIL; in ata_cam_process_sense()
876 xpt_done(ccb); in ata_cam_process_sense()
886 union ccb *ccb = request->ccb; in ata_cam_end_transaction() local
894 ccb->ccb_h.status &= ~CAM_STATUS_MASK; in ata_cam_end_transaction()
897 ccb->ccb_h.status &= ~CAM_STATUS_MASK; in ata_cam_end_transaction()
898 ccb->ccb_h.status |= CAM_CMD_TIMEOUT | CAM_RELEASE_SIMQ; in ata_cam_end_transaction()
901 if (ccb->ccb_h.func_code == XPT_ATA_IO) { in ata_cam_end_transaction()
902 ccb->ccb_h.status |= CAM_ATA_STATUS_ERROR; in ata_cam_end_transaction()
904 ccb->ccb_h.status |= CAM_SCSI_STATUS_ERROR; in ata_cam_end_transaction()
905 ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND; in ata_cam_end_transaction()
908 ccb->ccb_h.status |= CAM_REQUEUE_REQ; in ata_cam_end_transaction()
910 ccb->ccb_h.status |= CAM_REQ_CMP_ERR; in ata_cam_end_transaction()
912 ccb->ccb_h.status |= CAM_REQ_CMP; in ata_cam_end_transaction()
913 if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP && in ata_cam_end_transaction()
914 !(ccb->ccb_h.status & CAM_DEV_QFRZN)) { in ata_cam_end_transaction()
915 xpt_freeze_devq(ccb->ccb_h.path, 1); in ata_cam_end_transaction()
916 ccb->ccb_h.status |= CAM_DEV_QFRZN; in ata_cam_end_transaction()
918 if (ccb->ccb_h.func_code == XPT_ATA_IO && in ata_cam_end_transaction()
920 (ccb->ataio.cmd.flags & CAM_ATAIO_NEEDRESULT))) { in ata_cam_end_transaction()
921 struct ata_res *res = &ccb->ataio.res; in ata_cam_end_transaction()
934 if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) { in ata_cam_end_transaction()
935 if (ccb->ccb_h.func_code == XPT_ATA_IO) { in ata_cam_end_transaction()
936 ccb->ataio.resid = in ata_cam_end_transaction()
937 ccb->ataio.dxfer_len - request->donecount; in ata_cam_end_transaction()
939 ccb->csio.resid = in ata_cam_end_transaction()
940 ccb->csio.dxfer_len - request->donecount; in ata_cam_end_transaction()
943 if ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_SCSI_STATUS_ERROR && in ata_cam_end_transaction()
944 (ccb->ccb_h.flags & CAM_DIS_AUTOSENSE) == 0) in ata_cam_end_transaction()
947 xpt_done(ccb); in ata_cam_end_transaction()
954 ata_check_ids(device_t dev, union ccb *ccb) in ata_check_ids() argument
958 if (ccb->ccb_h.target_id > ((ch->flags & ATA_NO_SLAVE) ? 0 : 1)) { in ata_check_ids()
959 ccb->ccb_h.status = CAM_TID_INVALID; in ata_check_ids()
960 xpt_done(ccb); in ata_check_ids()
963 if (ccb->ccb_h.target_lun != 0) { in ata_check_ids()
964 ccb->ccb_h.status = CAM_LUN_INVALID; in ata_check_ids()
965 xpt_done(ccb); in ata_check_ids()
971 KASSERT(ccb->ccb_h.func_code != XPT_ATA_IO || in ata_check_ids()
972 ((ccb->ataio.ata_flags & ATA_FLAG_AUX) == 0), in ata_check_ids()
978 ataaction(struct cam_sim *sim, union ccb *ccb) in ataaction() argument
983 CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE, ("ataaction func_code=%x\n", in ataaction()
984 ccb->ccb_h.func_code)); in ataaction()
988 switch (ccb->ccb_h.func_code) { in ataaction()
992 if (ata_check_ids(dev, ccb)) in ataaction()
995 << ccb->ccb_h.target_id)) == 0) { in ataaction()
996 ccb->ccb_h.status = CAM_SEL_TIMEOUT; in ataaction()
1001 if (ccb->ccb_h.func_code == XPT_ATA_IO && in ataaction()
1002 (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) && in ataaction()
1003 (ccb->ataio.cmd.control & ATA_A_RESET)) { in ataaction()
1004 struct ata_res *res = &ccb->ataio.res; in ataaction()
1007 if (ch->devices & (ATA_ATA_MASTER << ccb->ccb_h.target_id)) { in ataaction()
1014 ccb->ccb_h.status = CAM_REQ_CMP; in ataaction()
1017 ata_cam_begin_transaction(dev, ccb); in ataaction()
1021 ccb->ccb_h.status = CAM_REQ_INVALID; in ataaction()
1025 struct ccb_trans_settings *cts = &ccb->cts; in ataaction()
1028 if (ata_check_ids(dev, ccb)) in ataaction()
1031 d = &ch->curr[ccb->ccb_h.target_id]; in ataaction()
1033 d = &ch->user[ccb->ccb_h.target_id]; in ataaction()
1040 ccb->ccb_h.target_id, in ataaction()
1055 ccb->ccb_h.target_id, in ataaction()
1067 ccb->ccb_h.status = CAM_REQ_CMP; in ataaction()
1072 struct ccb_trans_settings *cts = &ccb->cts; in ataaction()
1075 if (ata_check_ids(dev, ccb)) in ataaction()
1078 d = &ch->curr[ccb->ccb_h.target_id]; in ataaction()
1080 d = &ch->user[ccb->ccb_h.target_id]; in ataaction()
1093 ATA_GETREV(dev, ccb->ccb_h.target_id); in ataaction()
1105 ch->user[ccb->ccb_h.target_id].caps; in ataaction()
1129 ch->user[ccb->ccb_h.target_id].caps; in ataaction()
1136 ccb->ccb_h.status = CAM_REQ_CMP; in ataaction()
1142 ccb->ccb_h.status = CAM_REQ_CMP; in ataaction()
1146 ccb->ccb_h.status = CAM_REQ_INVALID; in ataaction()
1150 struct ccb_pathinq *cpi = &ccb->cpi; in ataaction()
1192 ccb->ccb_h.status = CAM_REQ_INVALID; in ataaction()
1195 xpt_done(ccb); in ataaction()