Lines Matching refs:ccb

71 static void siis_begin_transaction(device_t dev, union ccb *ccb);
76 static int siis_setup_fis(device_t dev, struct siis_cmd *ctp, union ccb *ccb, int tag);
89 static void siis_process_read_log(device_t dev, union ccb *ccb);
90 static void siis_process_request_sense(device_t dev, union ccb *ccb);
92 static void siisaction(struct cam_sim *sim, union ccb *ccb);
746 slot->ccb = NULL; in siis_slotsalloc()
812 union ccb *ccb; in siis_phy_check_events() local
823 if ((ccb = xpt_alloc_ccb_nowait()) == NULL) in siis_phy_check_events()
825 if (xpt_create_path(&ccb->ccb_h.path, NULL, in siis_phy_check_events()
828 xpt_free_ccb(ccb); in siis_phy_check_events()
831 xpt_rescan(ccb); in siis_phy_check_events()
892 union ccb *fccb = ch->frozen; in siis_ch_intr()
910 if (ch->slot[i].ccb->ccb_h.target_id != port) in siis_ch_intr()
950 siis_check_collision(device_t dev, union ccb *ccb) in siis_check_collision() argument
955 if ((ccb->ccb_h.func_code == XPT_ATA_IO) && in siis_check_collision()
956 (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) { in siis_check_collision()
959 ch->curr[ccb->ccb_h.target_id].tags))) == 0) in siis_check_collision()
962 if ((ccb->ccb_h.func_code == XPT_ATA_IO) && in siis_check_collision()
963 (ccb->ataio.cmd.flags & (CAM_ATAIO_CONTROL | CAM_ATAIO_NEEDRESULT))) { in siis_check_collision()
976 siis_begin_transaction(device_t dev, union ccb *ccb) in siis_begin_transaction() argument
985 if ((ccb->ccb_h.func_code == XPT_ATA_IO) && in siis_begin_transaction()
986 (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) in siis_begin_transaction()
987 tags = ch->curr[ccb->ccb_h.target_id].tags; in siis_begin_transaction()
991 slot->ccb = ccb; in siis_begin_transaction()
995 if ((ccb->ccb_h.func_code == XPT_ATA_IO) && in siis_begin_transaction()
996 (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) { in siis_begin_transaction()
997 ch->numtslots[ccb->ccb_h.target_id]++; in siis_begin_transaction()
999 if ((ccb->ccb_h.func_code == XPT_ATA_IO) && in siis_begin_transaction()
1000 (ccb->ataio.cmd.flags & (CAM_ATAIO_CONTROL | CAM_ATAIO_NEEDRESULT))) in siis_begin_transaction()
1004 if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) { in siis_begin_transaction()
1007 ccb, siis_dmasetprd, slot, 0); in siis_begin_transaction()
1036 if (slot->ccb->ccb_h.func_code == XPT_ATA_IO) in siis_dmasetprd()
1047 ((slot->ccb->ccb_h.flags & CAM_DIR_IN) ? in siis_dmasetprd()
1060 union ccb *ccb = slot->ccb; in siis_execute_transaction() local
1070 if (ccb->ccb_h.func_code == XPT_ATA_IO) { in siis_execute_transaction()
1071 if (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) { in siis_execute_transaction()
1075 if (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA) { in siis_execute_transaction()
1079 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) { in siis_execute_transaction()
1083 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) { in siis_execute_transaction()
1088 } else if (ccb->ccb_h.func_code == XPT_SCSI_IO) { in siis_execute_transaction()
1089 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) in siis_execute_transaction()
1092 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) in siis_execute_transaction()
1096 if ((ccb->ccb_h.func_code == XPT_ATA_IO) && in siis_execute_transaction()
1097 (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) && in siis_execute_transaction()
1098 (ccb->ataio.cmd.control & ATA_A_RESET)) { in siis_execute_transaction()
1103 if (!siis_setup_fis(dev, ctp, ccb, slot->slot)) { in siis_execute_transaction()
1119 callout_reset_sbt(&slot->timeout, SBT_1MS * ccb->ccb_h.timeout, 0, in siis_execute_transaction()
1162 SBT_1MS * slot->ccb->ccb_h.timeout, 0, in siis_rearm_timeout()
1174 union ccb *ccb = slot->ccb; in siis_timeout() local
1182 if ((ccb->ccb_h.func_code == XPT_ATA_IO) && in siis_timeout()
1183 (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) && in siis_timeout()
1184 (ccb->ataio.cmd.control & ATA_A_RESET)) { in siis_timeout()
1213 union ccb *ccb = slot->ccb; in siis_end_transaction() local
1223 if (ccb->ccb_h.func_code == XPT_ATA_IO) { in siis_end_transaction()
1224 struct ata_res *res = &ccb->ataio.res; in siis_end_transaction()
1226 (ccb->ataio.cmd.flags & CAM_ATAIO_NEEDRESULT)) { in siis_end_transaction()
1242 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN && in siis_end_transaction()
1244 ccb->ataio.resid = ccb->ataio.dxfer_len - in siis_end_transaction()
1248 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN && in siis_end_transaction()
1250 ccb->csio.resid = ccb->csio.dxfer_len - in siis_end_transaction()
1254 if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) { in siis_end_transaction()
1256 (ccb->ccb_h.flags & CAM_DIR_IN) ? in siis_end_transaction()
1263 ccb->ccb_h.status |= CAM_RELEASE_SIMQ; in siis_end_transaction()
1267 !(ccb->ccb_h.status & CAM_DEV_QFRZN)) { in siis_end_transaction()
1268 xpt_freeze_devq(ccb->ccb_h.path, 1); in siis_end_transaction()
1269 ccb->ccb_h.status |= CAM_DEV_QFRZN; in siis_end_transaction()
1271 ccb->ccb_h.status &= ~CAM_STATUS_MASK; in siis_end_transaction()
1274 ccb->ccb_h.status |= CAM_REQ_CMP; in siis_end_transaction()
1275 if (ccb->ccb_h.func_code == XPT_SCSI_IO) in siis_end_transaction()
1276 ccb->csio.scsi_status = SCSI_STATUS_OK; in siis_end_transaction()
1280 ccb->ccb_h.status |= CAM_REQ_INVALID; in siis_end_transaction()
1283 ccb->ccb_h.status |= CAM_REQUEUE_REQ; in siis_end_transaction()
1287 if (ccb->ccb_h.func_code == XPT_SCSI_IO) { in siis_end_transaction()
1288 ccb->ccb_h.status |= CAM_SCSI_STATUS_ERROR; in siis_end_transaction()
1289 ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND; in siis_end_transaction()
1291 ccb->ccb_h.status |= CAM_ATA_STATUS_ERROR; in siis_end_transaction()
1296 ccb->ccb_h.status |= CAM_UNCOR_PARITY; in siis_end_transaction()
1300 ccb->ccb_h.status |= CAM_CMD_TIMEOUT; in siis_end_transaction()
1303 ccb->ccb_h.status |= CAM_REQ_CMP_ERR; in siis_end_transaction()
1310 slot->ccb = NULL; in siis_end_transaction()
1313 if ((ccb->ccb_h.func_code == XPT_ATA_IO) && in siis_end_transaction()
1314 (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) { in siis_end_transaction()
1315 ch->numtslots[ccb->ccb_h.target_id]--; in siis_end_transaction()
1325 if (ccb->ccb_h.recovery_type == RECOVERY_READ_LOG) { in siis_end_transaction()
1326 siis_process_read_log(dev, ccb); in siis_end_transaction()
1328 } else if (ccb->ccb_h.recovery_type == RECOVERY_REQUEST_SENSE) { in siis_end_transaction()
1329 siis_process_request_sense(dev, ccb); in siis_end_transaction()
1332 ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_SCSI_STATUS_ERROR && in siis_end_transaction()
1333 (ccb->ccb_h.flags & CAM_DIS_AUTOSENSE) == 0)) { in siis_end_transaction()
1334 ch->hold[slot->slot] = ccb; in siis_end_transaction()
1337 xpt_done(ccb); in siis_end_transaction()
1357 union ccb *fccb = ch->frozen; in siis_end_transaction()
1368 union ccb *ccb; in siis_issue_recovery() local
1380 ccb = xpt_alloc_ccb_nowait(); in siis_issue_recovery()
1381 if (ccb == NULL) { in siis_issue_recovery()
1397 xpt_setup_ccb(&ccb->ccb_h, ch->hold[i]->ccb_h.path, in siis_issue_recovery()
1399 if (ccb->ccb_h.func_code == XPT_ATA_IO) { in siis_issue_recovery()
1401 ccb->ccb_h.recovery_type = RECOVERY_READ_LOG; in siis_issue_recovery()
1402 ccb->ccb_h.func_code = XPT_ATA_IO; in siis_issue_recovery()
1403 ccb->ccb_h.flags = CAM_DIR_IN; in siis_issue_recovery()
1404 ccb->ccb_h.timeout = 1000; /* 1s should be enough. */ in siis_issue_recovery()
1405 ataio = &ccb->ataio; in siis_issue_recovery()
1408 xpt_free_ccb(ccb); in siis_issue_recovery()
1424 ccb->ccb_h.recovery_type = RECOVERY_REQUEST_SENSE; in siis_issue_recovery()
1425 ccb->ccb_h.recovery_slot = i; in siis_issue_recovery()
1426 ccb->ccb_h.func_code = XPT_SCSI_IO; in siis_issue_recovery()
1427 ccb->ccb_h.flags = CAM_DIR_IN; in siis_issue_recovery()
1428 ccb->ccb_h.status = 0; in siis_issue_recovery()
1429 ccb->ccb_h.timeout = 1000; /* 1s should be enough. */ in siis_issue_recovery()
1430 csio = &ccb->csio; in siis_issue_recovery()
1439 siis_begin_transaction(dev, ccb); in siis_issue_recovery()
1443 siis_process_read_log(device_t dev, union ccb *ccb) in siis_process_read_log() argument
1451 data = ccb->ataio.data_ptr; in siis_process_read_log()
1452 if ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP && in siis_process_read_log()
1457 if (ch->hold[i]->ccb_h.target_id != ccb->ccb_h.target_id) in siis_process_read_log()
1481 if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) in siis_process_read_log()
1489 if (ch->hold[i]->ccb_h.target_id != ccb->ccb_h.target_id) in siis_process_read_log()
1496 free(ccb->ataio.data_ptr, M_SIIS); in siis_process_read_log()
1497 xpt_free_ccb(ccb); in siis_process_read_log()
1501 siis_process_request_sense(device_t dev, union ccb *ccb) in siis_process_request_sense() argument
1508 i = ccb->ccb_h.recovery_slot; in siis_process_request_sense()
1509 if ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in siis_process_request_sense()
1518 xpt_free_ccb(ccb); in siis_process_request_sense()
1591 union ccb *fccb = ch->frozen; in siis_reset()
1685 siis_setup_fis(device_t dev, struct siis_cmd *ctp, union ccb *ccb, int tag) in siis_setup_fis() argument
1692 fis[1] = (ccb->ccb_h.target_id & 0x0f); in siis_setup_fis()
1693 if (ccb->ccb_h.func_code == XPT_SCSI_IO) { in siis_setup_fis()
1696 if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE && in siis_setup_fis()
1697 ch->curr[ccb->ccb_h.target_id].mode >= ATA_DMA) in siis_setup_fis()
1700 fis[5] = ccb->csio.dxfer_len; in siis_setup_fis()
1701 fis[6] = ccb->csio.dxfer_len >> 8; in siis_setup_fis()
1705 bzero(ctp->u.atapi.ccb, 16); in siis_setup_fis()
1706 bcopy((ccb->ccb_h.flags & CAM_CDB_POINTER) ? in siis_setup_fis()
1707 ccb->csio.cdb_io.cdb_ptr : ccb->csio.cdb_io.cdb_bytes, in siis_setup_fis()
1708 ctp->u.atapi.ccb, ccb->csio.cdb_len); in siis_setup_fis()
1709 } else if ((ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) == 0) { in siis_setup_fis()
1711 fis[2] = ccb->ataio.cmd.command; in siis_setup_fis()
1712 fis[3] = ccb->ataio.cmd.features; in siis_setup_fis()
1713 fis[4] = ccb->ataio.cmd.lba_low; in siis_setup_fis()
1714 fis[5] = ccb->ataio.cmd.lba_mid; in siis_setup_fis()
1715 fis[6] = ccb->ataio.cmd.lba_high; in siis_setup_fis()
1716 fis[7] = ccb->ataio.cmd.device; in siis_setup_fis()
1717 fis[8] = ccb->ataio.cmd.lba_low_exp; in siis_setup_fis()
1718 fis[9] = ccb->ataio.cmd.lba_mid_exp; in siis_setup_fis()
1719 fis[10] = ccb->ataio.cmd.lba_high_exp; in siis_setup_fis()
1720 fis[11] = ccb->ataio.cmd.features_exp; in siis_setup_fis()
1721 fis[12] = ccb->ataio.cmd.sector_count; in siis_setup_fis()
1722 if (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA) { in siis_setup_fis()
1726 fis[13] = ccb->ataio.cmd.sector_count_exp; in siis_setup_fis()
1727 if (ccb->ataio.ata_flags & ATA_FLAG_ICC) in siis_setup_fis()
1728 fis[14] = ccb->ataio.icc; in siis_setup_fis()
1730 if (ccb->ataio.ata_flags & ATA_FLAG_AUX) { in siis_setup_fis()
1731 fis[16] = ccb->ataio.aux & 0xff; in siis_setup_fis()
1732 fis[17] = (ccb->ataio.aux >> 8) & 0xff; in siis_setup_fis()
1733 fis[18] = (ccb->ataio.aux >> 16) & 0xff; in siis_setup_fis()
1734 fis[19] = (ccb->ataio.aux >> 24) & 0xff; in siis_setup_fis()
1786 siis_check_ids(device_t dev, union ccb *ccb) in siis_check_ids() argument
1789 if (ccb->ccb_h.target_id > 15) { in siis_check_ids()
1790 ccb->ccb_h.status = CAM_TID_INVALID; in siis_check_ids()
1791 xpt_done(ccb); in siis_check_ids()
1794 if (ccb->ccb_h.target_lun != 0) { in siis_check_ids()
1795 ccb->ccb_h.status = CAM_LUN_INVALID; in siis_check_ids()
1796 xpt_done(ccb); in siis_check_ids()
1803 siisaction(struct cam_sim *sim, union ccb *ccb) in siisaction() argument
1808 CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE, ("siisaction func_code=%x\n", in siisaction()
1809 ccb->ccb_h.func_code)); in siisaction()
1814 switch (ccb->ccb_h.func_code) { in siisaction()
1818 if (siis_check_ids(dev, ccb)) in siisaction()
1822 ccb->ccb_h.target_id > 0 && ccb->ccb_h.target_id < 15)) { in siisaction()
1823 ccb->ccb_h.status = CAM_SEL_TIMEOUT; in siisaction()
1826 ccb->ccb_h.recovery_type = RECOVERY_NONE; in siisaction()
1828 if (siis_check_collision(dev, ccb)) { in siisaction()
1830 ch->frozen = ccb; in siisaction()
1835 siis_begin_transaction(dev, ccb); in siisaction()
1839 ccb->ccb_h.status = CAM_REQ_INVALID; in siisaction()
1843 struct ccb_trans_settings *cts = &ccb->cts; in siisaction()
1846 if (siis_check_ids(dev, ccb)) in siisaction()
1849 d = &ch->curr[ccb->ccb_h.target_id]; in siisaction()
1851 d = &ch->user[ccb->ccb_h.target_id]; in siisaction()
1871 ccb->ccb_h.status = CAM_REQ_CMP; in siisaction()
1877 struct ccb_trans_settings *cts = &ccb->cts; in siisaction()
1881 if (siis_check_ids(dev, ccb)) in siisaction()
1884 d = &ch->curr[ccb->ccb_h.target_id]; in siisaction()
1886 d = &ch->user[ccb->ccb_h.target_id]; in siisaction()
1894 (ccb->ccb_h.target_id == 15 || in siisaction()
1895 (ccb->ccb_h.target_id == 0 && !ch->pm_present))) { in siisaction()
1908 ch->user[ccb->ccb_h.target_id].caps; in siisaction()
1929 ccb->ccb_h.status = CAM_REQ_CMP; in siisaction()
1935 ccb->ccb_h.status = CAM_REQ_CMP; in siisaction()
1939 ccb->ccb_h.status = CAM_REQ_INVALID; in siisaction()
1943 struct ccb_pathinq *cpi = &ccb->cpi; in siisaction()
1974 ccb->ccb_h.status = CAM_REQ_INVALID; in siisaction()
1977 xpt_done(ccb); in siisaction()