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()
1040 if (slot->ccb->ccb_h.func_code == XPT_ATA_IO) in siis_dmasetprd()
1051 ((slot->ccb->ccb_h.flags & CAM_DIR_IN) ? in siis_dmasetprd()
1064 union ccb *ccb = slot->ccb; in siis_execute_transaction() local
1075 if (ccb->ccb_h.func_code == XPT_ATA_IO) { in siis_execute_transaction()
1076 if (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) { in siis_execute_transaction()
1080 if (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA) { in siis_execute_transaction()
1084 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) { in siis_execute_transaction()
1088 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) { in siis_execute_transaction()
1093 } else if (ccb->ccb_h.func_code == XPT_SCSI_IO) { in siis_execute_transaction()
1094 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) in siis_execute_transaction()
1097 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) in siis_execute_transaction()
1101 if ((ccb->ccb_h.func_code == XPT_ATA_IO) && in siis_execute_transaction()
1102 (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) && in siis_execute_transaction()
1103 (ccb->ataio.cmd.control & ATA_A_RESET)) { in siis_execute_transaction()
1108 if (!siis_setup_fis(dev, ctp, ccb, slot->slot)) { in siis_execute_transaction()
1125 callout_reset_sbt(&slot->timeout, SBT_1MS * ccb->ccb_h.timeout, 0, in siis_execute_transaction()
1168 SBT_1MS * slot->ccb->ccb_h.timeout, 0, in siis_rearm_timeout()
1179 union ccb *ccb = slot->ccb; in siis_timeout() local
1187 if ((ccb->ccb_h.func_code == XPT_ATA_IO) && in siis_timeout()
1188 (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) && in siis_timeout()
1189 (ccb->ataio.cmd.control & ATA_A_RESET)) { in siis_timeout()
1218 union ccb *ccb = slot->ccb; in siis_end_transaction() local
1228 if (ccb->ccb_h.func_code == XPT_ATA_IO) { in siis_end_transaction()
1229 struct ata_res *res = &ccb->ataio.res; in siis_end_transaction()
1231 (ccb->ataio.cmd.flags & CAM_ATAIO_NEEDRESULT)) { in siis_end_transaction()
1247 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN && in siis_end_transaction()
1249 ccb->ataio.resid = ccb->ataio.dxfer_len - in siis_end_transaction()
1253 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN && in siis_end_transaction()
1255 ccb->csio.resid = ccb->csio.dxfer_len - in siis_end_transaction()
1259 if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) { in siis_end_transaction()
1261 (ccb->ccb_h.flags & CAM_DIR_IN) ? in siis_end_transaction()
1268 ccb->ccb_h.status |= CAM_RELEASE_SIMQ; in siis_end_transaction()
1272 !(ccb->ccb_h.status & CAM_DEV_QFRZN)) { in siis_end_transaction()
1273 xpt_freeze_devq(ccb->ccb_h.path, 1); in siis_end_transaction()
1274 ccb->ccb_h.status |= CAM_DEV_QFRZN; in siis_end_transaction()
1276 ccb->ccb_h.status &= ~CAM_STATUS_MASK; in siis_end_transaction()
1279 ccb->ccb_h.status |= CAM_REQ_CMP; in siis_end_transaction()
1280 if (ccb->ccb_h.func_code == XPT_SCSI_IO) in siis_end_transaction()
1281 ccb->csio.scsi_status = SCSI_STATUS_OK; in siis_end_transaction()
1285 ccb->ccb_h.status |= CAM_REQ_INVALID; in siis_end_transaction()
1288 ccb->ccb_h.status |= CAM_REQUEUE_REQ; in siis_end_transaction()
1292 if (ccb->ccb_h.func_code == XPT_SCSI_IO) { in siis_end_transaction()
1293 ccb->ccb_h.status |= CAM_SCSI_STATUS_ERROR; in siis_end_transaction()
1294 ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND; in siis_end_transaction()
1296 ccb->ccb_h.status |= CAM_ATA_STATUS_ERROR; in siis_end_transaction()
1301 ccb->ccb_h.status |= CAM_UNCOR_PARITY; in siis_end_transaction()
1305 ccb->ccb_h.status |= CAM_CMD_TIMEOUT; in siis_end_transaction()
1308 ccb->ccb_h.status |= CAM_REQ_CMP_ERR; in siis_end_transaction()
1315 slot->ccb = NULL; in siis_end_transaction()
1318 if ((ccb->ccb_h.func_code == XPT_ATA_IO) && in siis_end_transaction()
1319 (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) { in siis_end_transaction()
1320 ch->numtslots[ccb->ccb_h.target_id]--; in siis_end_transaction()
1330 if (ccb->ccb_h.recovery_type == RECOVERY_READ_LOG) { in siis_end_transaction()
1331 siis_process_read_log(dev, ccb); in siis_end_transaction()
1333 } else if (ccb->ccb_h.recovery_type == RECOVERY_REQUEST_SENSE) { in siis_end_transaction()
1334 siis_process_request_sense(dev, ccb); in siis_end_transaction()
1337 ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_SCSI_STATUS_ERROR && in siis_end_transaction()
1338 (ccb->ccb_h.flags & CAM_DIS_AUTOSENSE) == 0)) { in siis_end_transaction()
1339 ch->hold[slot->slot] = ccb; in siis_end_transaction()
1342 xpt_done(ccb); in siis_end_transaction()
1362 union ccb *fccb = ch->frozen; in siis_end_transaction()
1373 union ccb *ccb; in siis_issue_recovery() local
1385 ccb = xpt_alloc_ccb_nowait(); in siis_issue_recovery()
1386 if (ccb == NULL) { in siis_issue_recovery()
1402 ccb->ccb_h = ch->hold[i]->ccb_h; /* Reuse old header. */ in siis_issue_recovery()
1403 if (ccb->ccb_h.func_code == XPT_ATA_IO) { in siis_issue_recovery()
1405 ccb->ccb_h.recovery_type = RECOVERY_READ_LOG; in siis_issue_recovery()
1406 ccb->ccb_h.func_code = XPT_ATA_IO; in siis_issue_recovery()
1407 ccb->ccb_h.flags = CAM_DIR_IN; in siis_issue_recovery()
1408 ccb->ccb_h.timeout = 1000; /* 1s should be enough. */ in siis_issue_recovery()
1409 ataio = &ccb->ataio; in siis_issue_recovery()
1412 xpt_free_ccb(ccb); in siis_issue_recovery()
1428 ccb->ccb_h.recovery_type = RECOVERY_REQUEST_SENSE; in siis_issue_recovery()
1429 ccb->ccb_h.recovery_slot = i; in siis_issue_recovery()
1430 ccb->ccb_h.func_code = XPT_SCSI_IO; in siis_issue_recovery()
1431 ccb->ccb_h.flags = CAM_DIR_IN; in siis_issue_recovery()
1432 ccb->ccb_h.status = 0; in siis_issue_recovery()
1433 ccb->ccb_h.timeout = 1000; /* 1s should be enough. */ in siis_issue_recovery()
1434 csio = &ccb->csio; in siis_issue_recovery()
1443 siis_begin_transaction(dev, ccb); in siis_issue_recovery()
1447 siis_process_read_log(device_t dev, union ccb *ccb) in siis_process_read_log() argument
1455 data = ccb->ataio.data_ptr; in siis_process_read_log()
1456 if ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP && in siis_process_read_log()
1461 if (ch->hold[i]->ccb_h.target_id != ccb->ccb_h.target_id) in siis_process_read_log()
1485 if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) in siis_process_read_log()
1493 if (ch->hold[i]->ccb_h.target_id != ccb->ccb_h.target_id) in siis_process_read_log()
1500 free(ccb->ataio.data_ptr, M_SIIS); in siis_process_read_log()
1501 xpt_free_ccb(ccb); in siis_process_read_log()
1505 siis_process_request_sense(device_t dev, union ccb *ccb) in siis_process_request_sense() argument
1512 i = ccb->ccb_h.recovery_slot; in siis_process_request_sense()
1513 if ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in siis_process_request_sense()
1522 xpt_free_ccb(ccb); in siis_process_request_sense()
1595 union ccb *fccb = ch->frozen; in siis_reset()
1689 siis_setup_fis(device_t dev, struct siis_cmd *ctp, union ccb *ccb, int tag) in siis_setup_fis() argument
1696 fis[1] = (ccb->ccb_h.target_id & 0x0f); in siis_setup_fis()
1697 if (ccb->ccb_h.func_code == XPT_SCSI_IO) { in siis_setup_fis()
1700 if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE && in siis_setup_fis()
1701 ch->curr[ccb->ccb_h.target_id].mode >= ATA_DMA) in siis_setup_fis()
1704 fis[5] = ccb->csio.dxfer_len; in siis_setup_fis()
1705 fis[6] = ccb->csio.dxfer_len >> 8; in siis_setup_fis()
1709 bzero(ctp->u.atapi.ccb, 16); in siis_setup_fis()
1710 bcopy((ccb->ccb_h.flags & CAM_CDB_POINTER) ? in siis_setup_fis()
1711 ccb->csio.cdb_io.cdb_ptr : ccb->csio.cdb_io.cdb_bytes, in siis_setup_fis()
1712 ctp->u.atapi.ccb, ccb->csio.cdb_len); in siis_setup_fis()
1713 } else if ((ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) == 0) { in siis_setup_fis()
1715 fis[2] = ccb->ataio.cmd.command; in siis_setup_fis()
1716 fis[3] = ccb->ataio.cmd.features; in siis_setup_fis()
1717 fis[4] = ccb->ataio.cmd.lba_low; in siis_setup_fis()
1718 fis[5] = ccb->ataio.cmd.lba_mid; in siis_setup_fis()
1719 fis[6] = ccb->ataio.cmd.lba_high; in siis_setup_fis()
1720 fis[7] = ccb->ataio.cmd.device; in siis_setup_fis()
1721 fis[8] = ccb->ataio.cmd.lba_low_exp; in siis_setup_fis()
1722 fis[9] = ccb->ataio.cmd.lba_mid_exp; in siis_setup_fis()
1723 fis[10] = ccb->ataio.cmd.lba_high_exp; in siis_setup_fis()
1724 fis[11] = ccb->ataio.cmd.features_exp; in siis_setup_fis()
1725 if (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA) { in siis_setup_fis()
1729 fis[12] = ccb->ataio.cmd.sector_count; in siis_setup_fis()
1730 fis[13] = ccb->ataio.cmd.sector_count_exp; in siis_setup_fis()
1733 if (ccb->ataio.ata_flags & ATA_FLAG_AUX) { in siis_setup_fis()
1734 fis[16] = ccb->ataio.aux & 0xff; in siis_setup_fis()
1735 fis[17] = (ccb->ataio.aux >> 8) & 0xff; in siis_setup_fis()
1736 fis[18] = (ccb->ataio.aux >> 16) & 0xff; in siis_setup_fis()
1737 fis[19] = (ccb->ataio.aux >> 24) & 0xff; in siis_setup_fis()
1789 siis_check_ids(device_t dev, union ccb *ccb) in siis_check_ids() argument
1792 if (ccb->ccb_h.target_id > 15) { in siis_check_ids()
1793 ccb->ccb_h.status = CAM_TID_INVALID; in siis_check_ids()
1794 xpt_done(ccb); in siis_check_ids()
1797 if (ccb->ccb_h.target_lun != 0) { in siis_check_ids()
1798 ccb->ccb_h.status = CAM_LUN_INVALID; in siis_check_ids()
1799 xpt_done(ccb); in siis_check_ids()
1806 siisaction(struct cam_sim *sim, union ccb *ccb) in siisaction() argument
1811 CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE, ("siisaction func_code=%x\n", in siisaction()
1812 ccb->ccb_h.func_code)); in siisaction()
1817 switch (ccb->ccb_h.func_code) { in siisaction()
1821 if (siis_check_ids(dev, ccb)) in siisaction()
1825 ccb->ccb_h.target_id > 0 && ccb->ccb_h.target_id < 15)) { in siisaction()
1826 ccb->ccb_h.status = CAM_SEL_TIMEOUT; in siisaction()
1829 ccb->ccb_h.recovery_type = RECOVERY_NONE; in siisaction()
1831 if (siis_check_collision(dev, ccb)) { in siisaction()
1833 ch->frozen = ccb; in siisaction()
1838 siis_begin_transaction(dev, ccb); in siisaction()
1842 ccb->ccb_h.status = CAM_REQ_INVALID; in siisaction()
1846 struct ccb_trans_settings *cts = &ccb->cts; in siisaction()
1849 if (siis_check_ids(dev, ccb)) in siisaction()
1852 d = &ch->curr[ccb->ccb_h.target_id]; in siisaction()
1854 d = &ch->user[ccb->ccb_h.target_id]; in siisaction()
1874 ccb->ccb_h.status = CAM_REQ_CMP; in siisaction()
1880 struct ccb_trans_settings *cts = &ccb->cts; in siisaction()
1884 if (siis_check_ids(dev, ccb)) in siisaction()
1887 d = &ch->curr[ccb->ccb_h.target_id]; in siisaction()
1889 d = &ch->user[ccb->ccb_h.target_id]; in siisaction()
1897 (ccb->ccb_h.target_id == 15 || in siisaction()
1898 (ccb->ccb_h.target_id == 0 && !ch->pm_present))) { in siisaction()
1911 ch->user[ccb->ccb_h.target_id].caps; in siisaction()
1932 ccb->ccb_h.status = CAM_REQ_CMP; in siisaction()
1938 ccb->ccb_h.status = CAM_REQ_CMP; in siisaction()
1942 ccb->ccb_h.status = CAM_REQ_INVALID; in siisaction()
1946 struct ccb_pathinq *cpi = &ccb->cpi; in siisaction()
1977 ccb->ccb_h.status = CAM_REQ_INVALID; in siisaction()
1980 xpt_done(ccb); in siisaction()