Lines Matching refs:ccb

72 static void siis_begin_transaction(device_t dev, union ccb *ccb);
77 static int siis_setup_fis(device_t dev, struct siis_cmd *ctp, union ccb *ccb, int tag);
90 static void siis_process_read_log(device_t dev, union ccb *ccb);
91 static void siis_process_request_sense(device_t dev, union ccb *ccb);
93 static void siisaction(struct cam_sim *sim, union ccb *ccb);
748 slot->ccb = NULL; in siis_slotsalloc()
814 union ccb *ccb; in siis_phy_check_events() local
825 if ((ccb = xpt_alloc_ccb_nowait()) == NULL) in siis_phy_check_events()
827 if (xpt_create_path(&ccb->ccb_h.path, NULL, in siis_phy_check_events()
830 xpt_free_ccb(ccb); in siis_phy_check_events()
833 xpt_rescan(ccb); in siis_phy_check_events()
895 union ccb *fccb = ch->frozen; in siis_ch_intr()
913 if (ch->slot[i].ccb->ccb_h.target_id != port) in siis_ch_intr()
953 siis_check_collision(device_t dev, union ccb *ccb) in siis_check_collision() argument
958 if ((ccb->ccb_h.func_code == XPT_ATA_IO) && in siis_check_collision()
959 (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) { in siis_check_collision()
962 ch->curr[ccb->ccb_h.target_id].tags))) == 0) in siis_check_collision()
965 if ((ccb->ccb_h.func_code == XPT_ATA_IO) && in siis_check_collision()
966 (ccb->ataio.cmd.flags & (CAM_ATAIO_CONTROL | CAM_ATAIO_NEEDRESULT))) { in siis_check_collision()
979 siis_begin_transaction(device_t dev, union ccb *ccb) in siis_begin_transaction() argument
988 if ((ccb->ccb_h.func_code == XPT_ATA_IO) && in siis_begin_transaction()
989 (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) in siis_begin_transaction()
990 tags = ch->curr[ccb->ccb_h.target_id].tags; in siis_begin_transaction()
994 slot->ccb = ccb; in siis_begin_transaction()
998 if ((ccb->ccb_h.func_code == XPT_ATA_IO) && in siis_begin_transaction()
999 (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) { in siis_begin_transaction()
1000 ch->numtslots[ccb->ccb_h.target_id]++; in siis_begin_transaction()
1002 if ((ccb->ccb_h.func_code == XPT_ATA_IO) && in siis_begin_transaction()
1003 (ccb->ataio.cmd.flags & (CAM_ATAIO_CONTROL | CAM_ATAIO_NEEDRESULT))) in siis_begin_transaction()
1007 if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) { in siis_begin_transaction()
1010 ccb, siis_dmasetprd, slot, 0); in siis_begin_transaction()
1039 if (slot->ccb->ccb_h.func_code == XPT_ATA_IO) in siis_dmasetprd()
1050 ((slot->ccb->ccb_h.flags & CAM_DIR_IN) ? in siis_dmasetprd()
1063 union ccb *ccb = slot->ccb; in siis_execute_transaction() local
1073 if (ccb->ccb_h.func_code == XPT_ATA_IO) { in siis_execute_transaction()
1074 if (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) { in siis_execute_transaction()
1078 if (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA) { in siis_execute_transaction()
1082 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) { in siis_execute_transaction()
1086 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) { in siis_execute_transaction()
1091 } else if (ccb->ccb_h.func_code == XPT_SCSI_IO) { in siis_execute_transaction()
1092 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) in siis_execute_transaction()
1095 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) in siis_execute_transaction()
1099 if ((ccb->ccb_h.func_code == XPT_ATA_IO) && in siis_execute_transaction()
1100 (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) && in siis_execute_transaction()
1101 (ccb->ataio.cmd.control & ATA_A_RESET)) { in siis_execute_transaction()
1106 if (!siis_setup_fis(dev, ctp, ccb, slot->slot)) { in siis_execute_transaction()
1122 callout_reset_sbt(&slot->timeout, SBT_1MS * ccb->ccb_h.timeout, 0, in siis_execute_transaction()
1165 SBT_1MS * slot->ccb->ccb_h.timeout, 0, in siis_rearm_timeout()
1177 union ccb *ccb = slot->ccb; in siis_timeout() local
1185 if ((ccb->ccb_h.func_code == XPT_ATA_IO) && in siis_timeout()
1186 (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) && in siis_timeout()
1187 (ccb->ataio.cmd.control & ATA_A_RESET)) { in siis_timeout()
1216 union ccb *ccb = slot->ccb; in siis_end_transaction() local
1226 if (ccb->ccb_h.func_code == XPT_ATA_IO) { in siis_end_transaction()
1227 struct ata_res *res = &ccb->ataio.res; in siis_end_transaction()
1229 (ccb->ataio.cmd.flags & CAM_ATAIO_NEEDRESULT)) { in siis_end_transaction()
1245 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN && in siis_end_transaction()
1247 ccb->ataio.resid = ccb->ataio.dxfer_len - in siis_end_transaction()
1251 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN && in siis_end_transaction()
1253 ccb->csio.resid = ccb->csio.dxfer_len - in siis_end_transaction()
1257 if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) { in siis_end_transaction()
1259 (ccb->ccb_h.flags & CAM_DIR_IN) ? in siis_end_transaction()
1266 ccb->ccb_h.status |= CAM_RELEASE_SIMQ; in siis_end_transaction()
1270 !(ccb->ccb_h.status & CAM_DEV_QFRZN)) { in siis_end_transaction()
1271 xpt_freeze_devq(ccb->ccb_h.path, 1); in siis_end_transaction()
1272 ccb->ccb_h.status |= CAM_DEV_QFRZN; in siis_end_transaction()
1274 ccb->ccb_h.status &= ~CAM_STATUS_MASK; in siis_end_transaction()
1277 ccb->ccb_h.status |= CAM_REQ_CMP; in siis_end_transaction()
1278 if (ccb->ccb_h.func_code == XPT_SCSI_IO) in siis_end_transaction()
1279 ccb->csio.scsi_status = SCSI_STATUS_OK; in siis_end_transaction()
1283 ccb->ccb_h.status |= CAM_REQ_INVALID; in siis_end_transaction()
1286 ccb->ccb_h.status |= CAM_REQUEUE_REQ; in siis_end_transaction()
1290 if (ccb->ccb_h.func_code == XPT_SCSI_IO) { in siis_end_transaction()
1291 ccb->ccb_h.status |= CAM_SCSI_STATUS_ERROR; in siis_end_transaction()
1292 ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND; in siis_end_transaction()
1294 ccb->ccb_h.status |= CAM_ATA_STATUS_ERROR; in siis_end_transaction()
1299 ccb->ccb_h.status |= CAM_UNCOR_PARITY; in siis_end_transaction()
1303 ccb->ccb_h.status |= CAM_CMD_TIMEOUT; in siis_end_transaction()
1306 ccb->ccb_h.status |= CAM_REQ_CMP_ERR; in siis_end_transaction()
1313 slot->ccb = NULL; in siis_end_transaction()
1316 if ((ccb->ccb_h.func_code == XPT_ATA_IO) && in siis_end_transaction()
1317 (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) { in siis_end_transaction()
1318 ch->numtslots[ccb->ccb_h.target_id]--; in siis_end_transaction()
1328 if (ccb->ccb_h.recovery_type == RECOVERY_READ_LOG) { in siis_end_transaction()
1329 siis_process_read_log(dev, ccb); in siis_end_transaction()
1331 } else if (ccb->ccb_h.recovery_type == RECOVERY_REQUEST_SENSE) { in siis_end_transaction()
1332 siis_process_request_sense(dev, ccb); in siis_end_transaction()
1335 ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_SCSI_STATUS_ERROR && in siis_end_transaction()
1336 (ccb->ccb_h.flags & CAM_DIS_AUTOSENSE) == 0)) { in siis_end_transaction()
1337 ch->hold[slot->slot] = ccb; in siis_end_transaction()
1340 xpt_done(ccb); in siis_end_transaction()
1360 union ccb *fccb = ch->frozen; in siis_end_transaction()
1371 union ccb *ccb; in siis_issue_recovery() local
1383 ccb = xpt_alloc_ccb_nowait(); in siis_issue_recovery()
1384 if (ccb == NULL) { in siis_issue_recovery()
1400 ccb->ccb_h = ch->hold[i]->ccb_h; /* Reuse old header. */ in siis_issue_recovery()
1401 if (ccb->ccb_h.func_code == XPT_ATA_IO) { in siis_issue_recovery()
1403 ccb->ccb_h.recovery_type = RECOVERY_READ_LOG; in siis_issue_recovery()
1404 ccb->ccb_h.func_code = XPT_ATA_IO; in siis_issue_recovery()
1405 ccb->ccb_h.flags = CAM_DIR_IN; in siis_issue_recovery()
1406 ccb->ccb_h.timeout = 1000; /* 1s should be enough. */ in siis_issue_recovery()
1407 ataio = &ccb->ataio; in siis_issue_recovery()
1410 xpt_free_ccb(ccb); in siis_issue_recovery()
1426 ccb->ccb_h.recovery_type = RECOVERY_REQUEST_SENSE; in siis_issue_recovery()
1427 ccb->ccb_h.recovery_slot = i; in siis_issue_recovery()
1428 ccb->ccb_h.func_code = XPT_SCSI_IO; in siis_issue_recovery()
1429 ccb->ccb_h.flags = CAM_DIR_IN; in siis_issue_recovery()
1430 ccb->ccb_h.status = 0; in siis_issue_recovery()
1431 ccb->ccb_h.timeout = 1000; /* 1s should be enough. */ in siis_issue_recovery()
1432 csio = &ccb->csio; in siis_issue_recovery()
1441 siis_begin_transaction(dev, ccb); in siis_issue_recovery()
1445 siis_process_read_log(device_t dev, union ccb *ccb) in siis_process_read_log() argument
1453 data = ccb->ataio.data_ptr; in siis_process_read_log()
1454 if ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP && in siis_process_read_log()
1459 if (ch->hold[i]->ccb_h.target_id != ccb->ccb_h.target_id) in siis_process_read_log()
1483 if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) in siis_process_read_log()
1491 if (ch->hold[i]->ccb_h.target_id != ccb->ccb_h.target_id) in siis_process_read_log()
1498 free(ccb->ataio.data_ptr, M_SIIS); in siis_process_read_log()
1499 xpt_free_ccb(ccb); in siis_process_read_log()
1503 siis_process_request_sense(device_t dev, union ccb *ccb) in siis_process_request_sense() argument
1510 i = ccb->ccb_h.recovery_slot; in siis_process_request_sense()
1511 if ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in siis_process_request_sense()
1520 xpt_free_ccb(ccb); in siis_process_request_sense()
1593 union ccb *fccb = ch->frozen; in siis_reset()
1687 siis_setup_fis(device_t dev, struct siis_cmd *ctp, union ccb *ccb, int tag) in siis_setup_fis() argument
1694 fis[1] = (ccb->ccb_h.target_id & 0x0f); in siis_setup_fis()
1695 if (ccb->ccb_h.func_code == XPT_SCSI_IO) { in siis_setup_fis()
1698 if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE && in siis_setup_fis()
1699 ch->curr[ccb->ccb_h.target_id].mode >= ATA_DMA) in siis_setup_fis()
1702 fis[5] = ccb->csio.dxfer_len; in siis_setup_fis()
1703 fis[6] = ccb->csio.dxfer_len >> 8; in siis_setup_fis()
1707 bzero(ctp->u.atapi.ccb, 16); in siis_setup_fis()
1708 bcopy((ccb->ccb_h.flags & CAM_CDB_POINTER) ? in siis_setup_fis()
1709 ccb->csio.cdb_io.cdb_ptr : ccb->csio.cdb_io.cdb_bytes, in siis_setup_fis()
1710 ctp->u.atapi.ccb, ccb->csio.cdb_len); in siis_setup_fis()
1711 } else if ((ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) == 0) { in siis_setup_fis()
1713 fis[2] = ccb->ataio.cmd.command; in siis_setup_fis()
1714 fis[3] = ccb->ataio.cmd.features; in siis_setup_fis()
1715 fis[4] = ccb->ataio.cmd.lba_low; in siis_setup_fis()
1716 fis[5] = ccb->ataio.cmd.lba_mid; in siis_setup_fis()
1717 fis[6] = ccb->ataio.cmd.lba_high; in siis_setup_fis()
1718 fis[7] = ccb->ataio.cmd.device; in siis_setup_fis()
1719 fis[8] = ccb->ataio.cmd.lba_low_exp; in siis_setup_fis()
1720 fis[9] = ccb->ataio.cmd.lba_mid_exp; in siis_setup_fis()
1721 fis[10] = ccb->ataio.cmd.lba_high_exp; in siis_setup_fis()
1722 fis[11] = ccb->ataio.cmd.features_exp; in siis_setup_fis()
1723 fis[12] = ccb->ataio.cmd.sector_count; in siis_setup_fis()
1724 if (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA) { in siis_setup_fis()
1728 fis[13] = ccb->ataio.cmd.sector_count_exp; in siis_setup_fis()
1729 if (ccb->ataio.ata_flags & ATA_FLAG_ICC) in siis_setup_fis()
1730 fis[14] = ccb->ataio.icc; in siis_setup_fis()
1732 if (ccb->ataio.ata_flags & ATA_FLAG_AUX) { in siis_setup_fis()
1733 fis[16] = ccb->ataio.aux & 0xff; in siis_setup_fis()
1734 fis[17] = (ccb->ataio.aux >> 8) & 0xff; in siis_setup_fis()
1735 fis[18] = (ccb->ataio.aux >> 16) & 0xff; in siis_setup_fis()
1736 fis[19] = (ccb->ataio.aux >> 24) & 0xff; in siis_setup_fis()
1788 siis_check_ids(device_t dev, union ccb *ccb) in siis_check_ids() argument
1791 if (ccb->ccb_h.target_id > 15) { in siis_check_ids()
1792 ccb->ccb_h.status = CAM_TID_INVALID; in siis_check_ids()
1793 xpt_done(ccb); in siis_check_ids()
1796 if (ccb->ccb_h.target_lun != 0) { in siis_check_ids()
1797 ccb->ccb_h.status = CAM_LUN_INVALID; in siis_check_ids()
1798 xpt_done(ccb); in siis_check_ids()
1805 siisaction(struct cam_sim *sim, union ccb *ccb) in siisaction() argument
1810 CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE, ("siisaction func_code=%x\n", in siisaction()
1811 ccb->ccb_h.func_code)); in siisaction()
1816 switch (ccb->ccb_h.func_code) { in siisaction()
1820 if (siis_check_ids(dev, ccb)) in siisaction()
1824 ccb->ccb_h.target_id > 0 && ccb->ccb_h.target_id < 15)) { in siisaction()
1825 ccb->ccb_h.status = CAM_SEL_TIMEOUT; in siisaction()
1828 ccb->ccb_h.recovery_type = RECOVERY_NONE; in siisaction()
1830 if (siis_check_collision(dev, ccb)) { in siisaction()
1832 ch->frozen = ccb; in siisaction()
1837 siis_begin_transaction(dev, ccb); in siisaction()
1841 ccb->ccb_h.status = CAM_REQ_INVALID; in siisaction()
1845 struct ccb_trans_settings *cts = &ccb->cts; in siisaction()
1848 if (siis_check_ids(dev, ccb)) in siisaction()
1851 d = &ch->curr[ccb->ccb_h.target_id]; in siisaction()
1853 d = &ch->user[ccb->ccb_h.target_id]; in siisaction()
1873 ccb->ccb_h.status = CAM_REQ_CMP; in siisaction()
1879 struct ccb_trans_settings *cts = &ccb->cts; in siisaction()
1883 if (siis_check_ids(dev, ccb)) in siisaction()
1886 d = &ch->curr[ccb->ccb_h.target_id]; in siisaction()
1888 d = &ch->user[ccb->ccb_h.target_id]; in siisaction()
1896 (ccb->ccb_h.target_id == 15 || in siisaction()
1897 (ccb->ccb_h.target_id == 0 && !ch->pm_present))) { in siisaction()
1910 ch->user[ccb->ccb_h.target_id].caps; in siisaction()
1931 ccb->ccb_h.status = CAM_REQ_CMP; in siisaction()
1937 ccb->ccb_h.status = CAM_REQ_CMP; in siisaction()
1941 ccb->ccb_h.status = CAM_REQ_INVALID; in siisaction()
1945 struct ccb_pathinq *cpi = &ccb->cpi; in siisaction()
1976 ccb->ccb_h.status = CAM_REQ_INVALID; in siisaction()
1979 xpt_done(ccb); in siisaction()