Lines Matching +full:layer +full:- +full:depth
1 /*-
2 * Copyright 2016-2023 Microchip Technology, Inc. and/or its subsidiaries.
42 device_t dev = softs->os_specific.pqi_dev; in update_sim_properties()
46 cpi->version_num = 1; in update_sim_properties()
47 cpi->hba_inquiry = PI_SDTR_ABLE|PI_TAG_ABLE|PI_WIDE_16; in update_sim_properties()
48 cpi->target_sprt = 0; in update_sim_properties()
49 cpi->hba_misc = PIM_NOBUSRESET | PIM_UNMAPPED; in update_sim_properties()
50 cpi->hba_eng_cnt = 0; in update_sim_properties()
51 cpi->max_lun = PQI_MAX_MULTILUN; in update_sim_properties()
52 cpi->max_target = MAX_TARGET_DEVICES; in update_sim_properties()
53 cpi->maxio = (softs->pqi_cap.max_sg_elem - 1) * PAGE_SIZE; in update_sim_properties()
54 cpi->initiator_id = 255; in update_sim_properties()
55 strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN-1); in update_sim_properties()
56 cpi->sim_vid[sizeof(cpi->sim_vid)-1] = '\0'; in update_sim_properties()
57 strncpy(cpi->hba_vid, "Microsemi", HBA_IDLEN-1); in update_sim_properties()
58 cpi->hba_vid[sizeof(cpi->hba_vid)-1] = '\0'; in update_sim_properties()
59 strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN-1); in update_sim_properties()
60 cpi->dev_name[sizeof(cpi->dev_name)-1] = '\0'; in update_sim_properties()
61 cpi->unit_number = cam_sim_unit(sim); in update_sim_properties()
62 cpi->bus_id = cam_sim_bus(sim); in update_sim_properties()
63 cpi->base_transfer_speed = 1200000; /* Base bus speed in KB/sec */ in update_sim_properties()
64 cpi->protocol = PROTO_SCSI; in update_sim_properties()
65 cpi->protocol_version = SCSI_REV_SPC4; in update_sim_properties()
66 cpi->transport = XPORT_SPI; in update_sim_properties()
67 cpi->transport_version = 2; in update_sim_properties()
68 cpi->ccb_h.status = CAM_REQ_CMP; in update_sim_properties()
69 cpi->hba_vendor = pci_get_vendor(dev); in update_sim_properties()
70 cpi->hba_device = pci_get_device(dev); in update_sim_properties()
71 cpi->hba_subvendor = pci_get_subvendor(dev); in update_sim_properties()
72 cpi->hba_subdevice = pci_get_subdevice(dev); in update_sim_properties()
85 struct ccb_trans_settings_scsi *scsi = &cts->proto_specific.scsi; in get_transport_settings()
86 struct ccb_trans_settings_sas *sas = &cts->xport_specific.sas; in get_transport_settings()
87 struct ccb_trans_settings_spi *spi = &cts->xport_specific.spi; in get_transport_settings()
91 cts->protocol = PROTO_SCSI; in get_transport_settings()
92 cts->protocol_version = SCSI_REV_SPC4; in get_transport_settings()
93 cts->transport = XPORT_SPI; in get_transport_settings()
94 cts->transport_version = 2; in get_transport_settings()
95 spi->valid = CTS_SPI_VALID_DISC; in get_transport_settings()
96 spi->flags = CTS_SPI_FLAGS_DISC_ENB; in get_transport_settings()
97 scsi->valid = CTS_SCSI_VALID_TQ; in get_transport_settings()
98 scsi->flags = CTS_SCSI_FLAGS_TAG_ENB; in get_transport_settings()
99 sas->valid = CTS_SAS_VALID_SPEED; in get_transport_settings()
100 cts->ccb_h.status = CAM_REQ_CMP; in get_transport_settings()
106 * Add the target to CAM layer and rescan, when a new device is found
116 lun = (device->is_multi_lun) ? CAM_LUN_WILDCARD : device->lun; in os_add_device()
117 if(softs->os_specific.sim_registered) { in os_add_device()
123 if (xpt_create_path(&ccb->ccb_h.path, NULL, in os_add_device()
124 cam_sim_path(softs->os_specific.sim), in os_add_device()
125 device->target, lun) != CAM_REQ_CMP) { in os_add_device()
137 * Remove the device from CAM layer when deleted or hot removed
147 lun = (device->is_multi_lun) ? CAM_LUN_WILDCARD : device->lun; in os_remove_device()
148 if(softs->os_specific.sim_registered) { in os_remove_device()
150 cam_sim_path(softs->os_specific.sim), in os_remove_device()
151 device->target, lun) != CAM_REQ_CMP) { in os_remove_device()
157 /* softs->device_list[device->target][device->lun] = NULL; */ in os_remove_device()
160 softs->dev_list[index] = NULL; in os_remove_device()
177 csio = (struct ccb_scsiio *)&rcb->cm_ccb->csio; in pqi_release_camq()
178 softs = rcb->softs; in pqi_release_camq()
182 if (softs->os_specific.pqi_flags & PQI_FLAG_BUSY) { in pqi_release_camq()
183 softs->os_specific.pqi_flags &= ~PQI_FLAG_BUSY; in pqi_release_camq()
184 if (csio->ccb_h.status & CAM_RELEASE_SIMQ) in pqi_release_camq()
185 xpt_release_simq(xpt_path_sim(csio->ccb_h.path), 0); in pqi_release_camq()
187 csio->ccb_h.status |= CAM_RELEASE_SIMQ; in pqi_release_camq()
196 pqisrc_softstate_t *softs = rcb->softs; in pqi_synch_request()
200 if (!(rcb->cm_flags & PQI_CMD_MAPPED)) in pqi_synch_request()
203 if (rcb->bcount != 0 ) { in pqi_synch_request()
204 if ((rcb->cm_ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) in pqi_synch_request()
205 bus_dmamap_sync(softs->os_specific.pqi_buffer_dmat, in pqi_synch_request()
206 rcb->cm_datamap,BUS_DMASYNC_POSTREAD); in pqi_synch_request()
207 if ((rcb->cm_ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) in pqi_synch_request()
208 bus_dmamap_sync(softs->os_specific.pqi_buffer_dmat, in pqi_synch_request()
209 rcb->cm_datamap,BUS_DMASYNC_POSTWRITE); in pqi_synch_request()
210 bus_dmamap_unload(softs->os_specific.pqi_buffer_dmat, in pqi_synch_request()
211 rcb->cm_datamap); in pqi_synch_request()
213 rcb->cm_flags &= ~PQI_CMD_MAPPED; in pqi_synch_request()
215 if(rcb->sgt && rcb->nseg) in pqi_synch_request()
216 os_mem_free(rcb->softs, (void*)rcb->sgt, in pqi_synch_request()
217 rcb->nseg*sizeof(sgt_t)); in pqi_synch_request()
223 * Function to dma-unmap the completed request
231 pqisrc_put_tag(&rcb->softs->taglist, rcb->tag); in pqi_unmap_request()
251 cdb = (csio->ccb_h.flags & CAM_CDB_POINTER) ? in smartpqi_fix_ld_inquiry()
252 (uint8_t *)csio->cdb_io.cdb_ptr : csio->cdb_io.cdb_bytes; in smartpqi_fix_ld_inquiry()
256 (csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN && in smartpqi_fix_ld_inquiry()
257 csio->dxfer_len >= SHORT_INQUIRY_LENGTH) { in smartpqi_fix_ld_inquiry()
259 inq = (struct scsi_inquiry_data *)csio->data_ptr; in smartpqi_fix_ld_inquiry()
261 /* device = softs->device_list[csio->ccb_h.target_id][csio->ccb_h.target_lun]; */ in smartpqi_fix_ld_inquiry()
262 int target = csio->ccb_h.target_id; in smartpqi_fix_ld_inquiry()
263 int lun = csio->ccb_h.target_lun; in smartpqi_fix_ld_inquiry()
264 int index = pqisrc_find_btl_list_index(softs,softs->bus_id,target,lun); in smartpqi_fix_ld_inquiry()
266 device = softs->dev_list[index]; in smartpqi_fix_ld_inquiry()
271 (device->devtype != DISK_DEVICE) || in smartpqi_fix_ld_inquiry()
276 strncpy(inq->vendor, device->vendor, in smartpqi_fix_ld_inquiry()
277 SID_VENDOR_SIZE-1); in smartpqi_fix_ld_inquiry()
278 inq->vendor[sizeof(inq->vendor)-1] = '\0'; in smartpqi_fix_ld_inquiry()
279 strncpy(inq->product, in smartpqi_fix_ld_inquiry()
280 pqisrc_raidlevel_to_string(device->raid_level), in smartpqi_fix_ld_inquiry()
281 SID_PRODUCT_SIZE-1); in smartpqi_fix_ld_inquiry()
282 inq->product[sizeof(inq->product)-1] = '\0'; in smartpqi_fix_ld_inquiry()
283 strncpy(inq->revision, device->volume_offline?"OFF":"OK", in smartpqi_fix_ld_inquiry()
284 SID_REVISION_SIZE-1); in smartpqi_fix_ld_inquiry()
285 inq->revision[sizeof(inq->revision)-1] = '\0'; in smartpqi_fix_ld_inquiry()
295 pqisrc_softstate_t *softs = rcb->softs; in pqi_complete_scsi_io()
300 smartpqi_fix_ld_inquiry(rcb->softs, csio); in pqi_complete_scsi_io()
302 release_tag = rcb->tag; in pqi_complete_scsi_io()
304 pqisrc_put_tag(&softs->taglist, release_tag); in pqi_complete_scsi_io()
311 * Handle completion of a command - pass results back through the CCB
323 csio = (struct ccb_scsiio *)&rcb->cm_ccb->csio; in os_io_response_success()
328 rcb->status = PQI_STATUS_SUCCESS; in os_io_response_success()
329 csio->ccb_h.status = CAM_REQ_CMP; in os_io_response_success()
342 memset(&csio->sense_data, 0, csio->sense_len); in copy_sense_data_to_csio()
344 sense_data_len = (sense_data_len > csio->sense_len) ? in copy_sense_data_to_csio()
345 csio->sense_len : sense_data_len; in copy_sense_data_to_csio()
348 memcpy(&csio->sense_data, sense_data, sense_data_len); in copy_sense_data_to_csio()
350 if (csio->sense_len > sense_data_len) in copy_sense_data_to_csio()
351 csio->sense_resid = csio->sense_len - sense_data_len; in copy_sense_data_to_csio()
353 csio->sense_resid = 0; in copy_sense_data_to_csio()
369 csio = (struct ccb_scsiio *)&rcb->cm_ccb->csio; in os_raid_response_error()
374 softs = rcb->softs; in os_raid_response_error()
376 csio->ccb_h.status = CAM_REQ_CMP_ERR; in os_raid_response_error()
378 if (!err_info || !rcb->dvp) { in os_raid_response_error()
379 DBG_ERR("couldn't be accessed! error info = %p, rcb->dvp = %p\n", in os_raid_response_error()
380 err_info, rcb->dvp); in os_raid_response_error()
384 csio->scsi_status = err_info->status; in os_raid_response_error()
386 if (csio->ccb_h.func_code == XPT_SCSI_IO) { in os_raid_response_error()
390 switch(csio->scsi_status) { in os_raid_response_error()
392 csio->ccb_h.status = CAM_REQ_CMP; in os_raid_response_error()
399 LE_16(err_info->sense_data_len); in os_raid_response_error()
402 sense_data = err_info->data; in os_raid_response_error()
405 csio->ccb_h.status = CAM_SCSI_STATUS_ERROR in os_raid_response_error()
415 resid = rcb->bcount-err_info->data_out_transferred; in os_raid_response_error()
416 csio->resid = resid; in os_raid_response_error()
417 csio->ccb_h.status = CAM_REQ_CMP; in os_raid_response_error()
421 csio->ccb_h.status = CAM_REQ_CMP; in os_raid_response_error()
446 rcb->status = PQI_STATUS_SUCCESS; in os_aio_response_error()
447 csio = (struct ccb_scsiio *)&rcb->cm_ccb->csio; in os_aio_response_error()
451 softs = rcb->softs; in os_aio_response_error()
453 if (!err_info || !rcb->dvp) { in os_aio_response_error()
454 csio->ccb_h.status = CAM_REQ_CMP_ERR; in os_aio_response_error()
455 DBG_ERR("couldn't be accessed! error info = %p, rcb->dvp = %p\n", in os_aio_response_error()
456 err_info, rcb->dvp); in os_aio_response_error()
460 switch (err_info->service_resp) { in os_aio_response_error()
462 csio->ccb_h.status = err_info->status; in os_aio_response_error()
465 switch(err_info->status) { in os_aio_response_error()
467 csio->ccb_h.status = CAM_REQ_ABORTED; in os_aio_response_error()
468 DBG_WARN_BTL(rcb->dvp, "IO aborted\n"); in os_aio_response_error()
471 csio->ccb_h.status = CAM_REQ_CMP; in os_aio_response_error()
472 csio->resid = in os_aio_response_error()
473 LE_32(err_info->resd_count); in os_aio_response_error()
476 csio->ccb_h.status = CAM_REQ_CMP; in os_aio_response_error()
479 DBG_WARN_BTL(rcb->dvp,"AIO Path Disabled\n"); in os_aio_response_error()
481 if (rcb->tm_req) { in os_aio_response_error()
482 rcb->req_pending = false; in os_aio_response_error()
483 rcb->status = PQI_STATUS_SUCCESS; in os_aio_response_error()
487 rcb->dvp->aio_enabled = false; in os_aio_response_error()
488 rcb->dvp->offload_enabled = false; in os_aio_response_error()
489 csio->ccb_h.status |= CAM_REQUEUE_REQ; in os_aio_response_error()
495 DBG_WARN_BTL(rcb->dvp,"IO Error/Invalid/No device\n"); in os_aio_response_error()
496 csio->ccb_h.status |= in os_aio_response_error()
504 (err_info->service_resp == PQI_AIO_SERV_RESPONSE_TMF_COMPLETE) ? "COMPLETE" : "SUCCEEDED"); in os_aio_response_error()
505 rcb->status = PQI_STATUS_SUCCESS; in os_aio_response_error()
506 rcb->req_pending = false; in os_aio_response_error()
511 (err_info->service_resp == PQI_AIO_SERV_RESPONSE_TMF_REJECTED) ? "REJECTED" : "INCORRECT LUN"); in os_aio_response_error()
512 rcb->status = PQI_STATUS_TIMEOUT; in os_aio_response_error()
513 rcb->req_pending = false; in os_aio_response_error()
516 DBG_WARN_BTL(rcb->dvp,"Scsi Status Error\n"); in os_aio_response_error()
517 csio->ccb_h.status |= CAM_SCSI_STATUS_ERROR; in os_aio_response_error()
521 if(err_info->data_pres == DATA_PRESENT_SENSE_DATA ) { in os_aio_response_error()
522 csio->scsi_status = PQI_AIO_STATUS_CHECK_CONDITION; in os_aio_response_error()
524 unsigned sense_data_len = LE_16(err_info->data_len); in os_aio_response_error()
526 sense_data = err_info->data; in os_aio_response_error()
530 csio->ccb_h.status = CAM_SCSI_STATUS_ERROR | CAM_AUTOSNS_VALID; in os_aio_response_error()
541 if ((ccb->ccb_h.status & CAM_DEV_QFRZN) == 0) { in pqi_freeze_ccb()
542 ccb->ccb_h.status |= CAM_DEV_QFRZN; in pqi_freeze_ccb()
543 xpt_freeze_devq(ccb->ccb_h.path, 1); in pqi_freeze_ccb()
548 * Command-mapping helper function - populate this command's s/g table.
554 pqisrc_softstate_t *softs = rcb->softs; in pqi_request_map_helper()
557 if (error || nseg > softs->pqi_cap.max_sg_elem) in pqi_request_map_helper()
559 DBG_ERR_BTL(rcb->dvp, "map failed err = %d or nseg(%d) > sgelem(%u)\n", in pqi_request_map_helper()
560 error, nseg, softs->pqi_cap.max_sg_elem); in pqi_request_map_helper()
564 rcb->sgt = os_mem_alloc(softs, nseg * sizeof(sgt_t)); in pqi_request_map_helper()
566 if (!rcb->sgt) { in pqi_request_map_helper()
567 DBG_ERR_BTL(rcb->dvp, "os_mem_alloc() failed; nseg = %d\n", nseg); in pqi_request_map_helper()
571 rcb->nseg = nseg; in pqi_request_map_helper()
573 rcb->sgt[i].addr = segs[i].ds_addr; in pqi_request_map_helper()
574 rcb->sgt[i].len = segs[i].ds_len; in pqi_request_map_helper()
575 rcb->sgt[i].flags = 0; in pqi_request_map_helper()
578 if ((rcb->cm_ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) in pqi_request_map_helper()
579 bus_dmamap_sync(softs->os_specific.pqi_buffer_dmat, in pqi_request_map_helper()
580 rcb->cm_datamap, BUS_DMASYNC_PREREAD); in pqi_request_map_helper()
581 if ((rcb->cm_ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) in pqi_request_map_helper()
582 bus_dmamap_sync(softs->os_specific.pqi_buffer_dmat, in pqi_request_map_helper()
583 rcb->cm_datamap, BUS_DMASYNC_PREWRITE); in pqi_request_map_helper()
586 rcb->status = PQI_STATUS_FAILURE; in pqi_request_map_helper()
591 rcb->req_pending = false; in pqi_request_map_helper()
592 DBG_ERR_BTL(rcb->dvp, "Build IO failed, error = %d\n", error); in pqi_request_map_helper()
599 ccb = rcb->cm_ccb; in pqi_request_map_helper()
600 ccb->ccb_h.status = CAM_RESRC_UNAVAIL; in pqi_request_map_helper()
608 * Function to dma-map the request buffer
613 pqisrc_softstate_t *softs = rcb->softs; in pqi_map_request()
615 union ccb *ccb = rcb->cm_ccb; in pqi_map_request()
620 if (rcb->cm_flags & PQI_CMD_MAPPED) in pqi_map_request()
623 rcb->cm_flags |= PQI_CMD_MAPPED; in pqi_map_request()
625 if (rcb->bcount) { in pqi_map_request()
626 bsd_status = bus_dmamap_load_ccb(softs->os_specific.pqi_buffer_dmat, in pqi_map_request()
627 rcb->cm_datamap, ccb, pqi_request_map_helper, rcb, 0); in pqi_map_request()
629 DBG_ERR_BTL(rcb->dvp, "bus_dmamap_load_ccb failed, return status = %d transfer length = %u\n", in pqi_map_request()
630 bsd_status, rcb->bcount); in pqi_map_request()
640 rcb->status = PQI_STATUS_FAILURE; in pqi_map_request()
658 rcb->error_info = NULL; in os_reset_rcb()
659 rcb->req = NULL; in os_reset_rcb()
660 rcb->status = -1; in os_reset_rcb()
661 rcb->tag = INVALID_ELEM; in os_reset_rcb()
662 rcb->dvp = NULL; in os_reset_rcb()
663 rcb->cdbp = NULL; in os_reset_rcb()
664 rcb->softs = NULL; in os_reset_rcb()
665 rcb->cm_flags = 0; in os_reset_rcb()
666 rcb->cm_data = NULL; in os_reset_rcb()
667 rcb->bcount = 0; in os_reset_rcb()
668 rcb->nseg = 0; in os_reset_rcb()
669 rcb->sgt = NULL; in os_reset_rcb()
670 rcb->cm_ccb = NULL; in os_reset_rcb()
671 rcb->encrypt_enable = false; in os_reset_rcb()
672 rcb->ioaccel_handle = 0; in os_reset_rcb()
673 rcb->resp_qid = 0; in os_reset_rcb()
674 rcb->req_pending = false; in os_reset_rcb()
675 rcb->tm_req = false; in os_reset_rcb()
684 xpt_free_path(ccb->ccb_h.path); in smartpqi_lunrescan_cb()
709 cam_sim_path(softs->os_specific.sim), target, lun); in smartpqi_lun_rescan()
718 xpt_setup_ccb(&ccb->ccb_h, path, 5); in smartpqi_lun_rescan()
719 ccb->ccb_h.func_code = XPT_SCAN_LUN; in smartpqi_lun_rescan()
720 ccb->ccb_h.cbfcnp = smartpqi_lunrescan_cb; in smartpqi_lun_rescan()
721 ccb->crcn.flags = CAM_FLAG_NONE; in smartpqi_lun_rescan()
740 /* if(softs->device_list[target][lun]){ */ in smartpqi_target_rescan()
741 if(softs->dev_list[index] != NULL) { in smartpqi_target_rescan()
742 device = softs->dev_list[index]; in smartpqi_target_rescan()
743 DBG_INFO("calling smartpqi_lun_rescan with TL = %d:%d\n",device->target,device->lun); in smartpqi_target_rescan()
744 smartpqi_lun_rescan(softs, device->target, device->lun); in smartpqi_target_rescan()
757 union ccb *ccb = rcb->cm_ccb; in os_get_task_attr()
760 switch(ccb->csio.tag_action) { in os_get_task_attr()
786 for (tag = 1; tag <= softs->max_outstanding_io; tag++) { in os_complete_outstanding_cmds_nodevice()
787 rcb_t *prcb = &softs->rcb[tag]; in os_complete_outstanding_cmds_nodevice()
788 dvp = prcb->dvp; in os_complete_outstanding_cmds_nodevice()
789 if(prcb->req_pending && prcb->cm_ccb ) { in os_complete_outstanding_cmds_nodevice()
790 prcb->req_pending = false; in os_complete_outstanding_cmds_nodevice()
791 prcb->cm_ccb->ccb_h.status = CAM_REQ_ABORTED | CAM_REQ_CMP; in os_complete_outstanding_cmds_nodevice()
792 pqi_complete_scsi_io(&prcb->cm_ccb->csio, prcb); in os_complete_outstanding_cmds_nodevice()
817 /* if( softs->device_list[ccb->ccb_h.target_id][ccb->ccb_h.target_lun] == NULL ) { */ in pqisrc_io_start()
818 target = ccb->ccb_h.target_id; in pqisrc_io_start()
819 lun = ccb->ccb_h.target_lun; in pqisrc_io_start()
820 index = pqisrc_find_btl_list_index(softs,softs->bus_id,target,lun); in pqisrc_io_start()
823 ccb->ccb_h.status = CAM_DEV_NOT_THERE; in pqisrc_io_start()
824 DBG_INFO("Invalid index/device!!!, Device BTL %u:%d:%d\n", softs->bus_id, target, lun); in pqisrc_io_start()
828 if( softs->dev_list[index] == NULL ) { in pqisrc_io_start()
829 ccb->ccb_h.status = CAM_DEV_NOT_THERE; in pqisrc_io_start()
830 DBG_INFO("Device = %d not there\n", ccb->ccb_h.target_id); in pqisrc_io_start()
834 /* DBG_INFO("starting IO on BTL = %d:%d:%d index = %d\n",softs->bus_id,target,lun,index); */ in pqisrc_io_start()
836 /* dvp = softs->device_list[ccb->ccb_h.target_id][ccb->ccb_h.target_lun]; */ in pqisrc_io_start()
837 dvp = softs->dev_list[index]; in pqisrc_io_start()
840 ccb->ccb_h.status = CAM_SCSI_BUS_RESET in pqisrc_io_start()
842 DBG_WARN("Device = %d BUSY/IN_RESET\n", ccb->ccb_h.target_id); in pqisrc_io_start()
847 ccb->ccb_h.status = CAM_DEV_NOT_THERE | CAM_REQ_CMP; in pqisrc_io_start()
848 DBG_WARN("Device = %d GONE/OFFLINE\n", ccb->ccb_h.target_id); in pqisrc_io_start()
853 ccb->ccb_h.status = CAM_SCSI_BUSY | CAM_REQ_INPROG | CAM_BUSY; in pqisrc_io_start()
854 DBG_WARN("Device %d reset returned busy\n", ccb->ccb_h.target_id); in pqisrc_io_start()
858 if (dvp->expose_device == false) { in pqisrc_io_start()
859 ccb->ccb_h.status = CAM_DEV_NOT_THERE; in pqisrc_io_start()
860 DBG_INFO("Device = %d not exposed\n", ccb->ccb_h.target_id); in pqisrc_io_start()
864 tag = pqisrc_get_tag(&softs->taglist); in pqisrc_io_start()
867 xpt_freeze_simq(softs->os_specific.sim, 1); in pqisrc_io_start()
868 softs->os_specific.pqi_flags |= PQI_FLAG_BUSY; in pqisrc_io_start()
869 ccb->ccb_h.status |= (CAM_REQUEUE_REQ | CAM_RELEASE_SIMQ); in pqisrc_io_start()
873 DBG_IO("tag = %u &softs->taglist : %p\n", tag, &softs->taglist); in pqisrc_io_start()
875 rcb = &softs->rcb[tag]; in pqisrc_io_start()
877 rcb->tag = tag; in pqisrc_io_start()
878 rcb->softs = softs; in pqisrc_io_start()
879 rcb->cmdlen = ccb->csio.cdb_len; in pqisrc_io_start()
880 ccb->ccb_h.sim_priv.entries[0].ptr = rcb; in pqisrc_io_start()
882 rcb->cm_ccb = ccb; in pqisrc_io_start()
883 /* rcb->dvp = softs->device_list[ccb->ccb_h.target_id][ccb->ccb_h.target_lun]; */ in pqisrc_io_start()
884 rcb->dvp = softs->dev_list[index]; in pqisrc_io_start()
886 rcb->cm_data = (void *)ccb->csio.data_ptr; in pqisrc_io_start()
887 rcb->bcount = ccb->csio.dxfer_len; in pqisrc_io_start()
893 * if we ever learn a transport layer other than simple, may fail in pqisrc_io_start()
897 xpt_freeze_simq(softs->os_specific.sim, 1); in pqisrc_io_start()
900 softs->os_specific.pqi_flags |= PQI_FLAG_BUSY; in pqisrc_io_start()
903 rcb->req_pending = false; in pqisrc_io_start()
904 ccb->ccb_h.status |= CAM_REQUEUE_REQ | CAM_RELEASE_SIMQ; in pqisrc_io_start()
906 ccb->ccb_h.target_id); in pqisrc_io_start()
921 PQI_STATUS_SUCCESS == rcb->status) in pqi_tmf_status_to_bsd_tmf_status()
934 struct ccb_hdr *ccb_h = &ccb->ccb_h; in pqisrc_scsi_abort_task()
935 rcb_t *prcb = ccb->ccb_h.sim_priv.entries[0].ptr; in pqisrc_scsi_abort_task()
941 tag = pqisrc_get_tag(&softs->taglist); in pqisrc_scsi_abort_task()
942 rcb = &softs->rcb[tag]; in pqisrc_scsi_abort_task()
943 rcb->tag = tag; in pqisrc_scsi_abort_task()
945 if (rcb->dvp == NULL) { in pqisrc_scsi_abort_task()
946 DBG_ERR("dvp is null, tmf type : 0x%x\n", ccb_h->func_code); in pqisrc_scsi_abort_task()
951 rcb->tm_req = true; in pqisrc_scsi_abort_task()
953 rval = pqisrc_send_tmf(softs, rcb->dvp, rcb, prcb, in pqisrc_scsi_abort_task()
957 ccb->ccb_h.status = CAM_REQ_ABORTED; in pqisrc_scsi_abort_task()
961 pqisrc_put_tag(&softs->taglist, tag); in pqisrc_scsi_abort_task()
974 struct ccb_hdr *ccb_h = &ccb->ccb_h; in pqisrc_scsi_abort_task_set()
981 tag = pqisrc_get_tag(&softs->taglist); in pqisrc_scsi_abort_task_set()
982 rcb = &softs->rcb[tag]; in pqisrc_scsi_abort_task_set()
983 rcb->tag = tag; in pqisrc_scsi_abort_task_set()
984 rcb->cm_ccb = ccb; in pqisrc_scsi_abort_task_set()
986 if (rcb->dvp == NULL) { in pqisrc_scsi_abort_task_set()
987 DBG_ERR("dvp is null, tmf type : 0x%x\n", ccb_h->func_code); in pqisrc_scsi_abort_task_set()
992 rcb->tm_req = true; in pqisrc_scsi_abort_task_set()
994 rval = pqisrc_send_tmf(softs, rcb->dvp, rcb, NULL, in pqisrc_scsi_abort_task_set()
1001 pqisrc_put_tag(&softs->taglist, tag); in pqisrc_scsi_abort_task_set()
1015 /* pqi_scsi_dev_t *devp = softs->device_list[ccb->ccb_h.target_id][ccb->ccb_h.target_lun]; */ in pqisrc_target_reset()
1016 struct ccb_hdr *ccb_h = &ccb->ccb_h; in pqisrc_target_reset()
1026 bus = softs->bus_id; in pqisrc_target_reset()
1027 target = ccb->ccb_h.target_id; in pqisrc_target_reset()
1028 lun = ccb->ccb_h.target_lun; in pqisrc_target_reset()
1033 return (-1); in pqisrc_target_reset()
1036 pqi_scsi_dev_t *devp = softs->dev_list[index]; in pqisrc_target_reset()
1038 DBG_ERR("bad target %d, tmf type : 0x%x\n", ccb_h->target_id, ccb_h->func_code); in pqisrc_target_reset()
1039 return (-1); in pqisrc_target_reset()
1042 tag = pqisrc_get_tag(&softs->taglist); in pqisrc_target_reset()
1043 rcb = &softs->rcb[tag]; in pqisrc_target_reset()
1044 rcb->tag = tag; in pqisrc_target_reset()
1045 rcb->cm_ccb = ccb; in pqisrc_target_reset()
1047 rcb->tm_req = true; in pqisrc_target_reset()
1054 devp->reset_in_progress = false; in pqisrc_target_reset()
1057 pqisrc_put_tag(&softs->taglist, tag); in pqisrc_target_reset()
1072 struct ccb_hdr *ccb_h = &ccb->ccb_h; in smartpqi_cam_action()
1076 switch (ccb_h->func_code) { in smartpqi_cam_action()
1087 ccg = &ccb->ccg; in smartpqi_cam_action()
1088 if (ccg->block_size == 0) { in smartpqi_cam_action()
1089 ccb->ccb_h.status &= ~CAM_SIM_QUEUED; in smartpqi_cam_action()
1090 ccb->ccb_h.status |= CAM_REQ_INVALID; in smartpqi_cam_action()
1094 ccb->ccb_h.status = CAM_REQ_CMP; in smartpqi_cam_action()
1099 update_sim_properties(sim, &ccb->cpi); in smartpqi_cam_action()
1100 ccb->ccb_h.status = CAM_REQ_CMP; in smartpqi_cam_action()
1104 get_transport_settings(softs, &ccb->cts); in smartpqi_cam_action()
1105 ccb->ccb_h.status = CAM_REQ_CMP; in smartpqi_cam_action()
1109 ccb->ccb_h.status = CAM_REQ_CMP_ERR; in smartpqi_cam_action()
1112 ccb->ccb_h.target_id); in smartpqi_cam_action()
1118 ccb->ccb_h.status = CAM_REQ_CMP_ERR; in smartpqi_cam_action()
1120 ccb->ccb_h.target_id); in smartpqi_cam_action()
1127 ccb->ccb_h.status = CAM_REQ_CMP_ERR; in smartpqi_cam_action()
1129 ccb->ccb_h.target_id); in smartpqi_cam_action()
1133 ccb->ccb_h.status = CAM_REQ_CMP; in smartpqi_cam_action()
1137 ccb->ccb_h.status = CAM_REQ_CMP; in smartpqi_cam_action()
1140 ccb->ccb_h.status = CAM_FUNC_NOTAVAIL; in smartpqi_cam_action()
1144 ccb->ccb_h.status = CAM_FUNC_NOTAVAIL; in smartpqi_cam_action()
1162 for (i = 1; i < softs->intr_count; i++ ) in smartpqi_poll()
1167 * Function to adjust the queue depth of a device
1191 * Function to register async callback for setting queue depth
1210 uint32_t t_id = cgd->ccb_h.target_id; in smartpqi_async()
1212 /* if (t_id <= (PQI_CTLR_INDEX - 1)) { */ in smartpqi_async()
1215 /* pqi_scsi_dev_t *dvp = softs->device_list[t_id][cgd->ccb_h.target_lun]; */ in smartpqi_async()
1216 int lun = cgd->ccb_h.target_lun; in smartpqi_async()
1217 int index = pqisrc_find_btl_list_index(softs,softs->bus_id,t_id,lun); in smartpqi_async()
1219 pqi_scsi_dev_t *dvp = softs->dev_list[index]; in smartpqi_async()
1224 smartpqi_adjust_queue_depth(path, dvp->queue_depth); in smartpqi_async()
1238 * Function to register sim with CAM layer for smartpqi driver
1251 max_transactions = softs->max_io_for_scsi_ml; in register_sim()
1252 softs->os_specific.devq = cam_simq_alloc(max_transactions); in register_sim()
1253 if (softs->os_specific.devq == NULL) { in register_sim()
1261 card_index, &softs->os_specific.cam_lock, \ in register_sim()
1262 1, max_transactions, softs->os_specific.devq); in register_sim()
1266 cam_simq_free(softs->os_specific.devq); in register_sim()
1270 softs->os_specific.sim = sim; in register_sim()
1271 mtx_lock(&softs->os_specific.cam_lock); in register_sim()
1272 status = xpt_bus_register(sim, softs->os_specific.pqi_dev, 0); in register_sim()
1275 cam_sim_free(softs->os_specific.sim, FALSE); in register_sim()
1276 cam_simq_free(softs->os_specific.devq); in register_sim()
1277 mtx_unlock(&softs->os_specific.cam_lock); in register_sim()
1281 softs->os_specific.sim_registered = TRUE; in register_sim()
1288 if (xpt_create_path(&ccb->ccb_h.path, NULL, in register_sim()
1289 cam_sim_path(softs->os_specific.sim), in register_sim()
1294 xpt_bus_deregister(cam_sim_path(softs->os_specific.sim)); in register_sim()
1295 cam_sim_free(softs->os_specific.sim, TRUE); in register_sim()
1296 mtx_unlock(&softs->os_specific.cam_lock); in register_sim()
1300 * Callback to set the queue depth per target which is in register_sim()
1303 softs->os_specific.path = ccb->ccb_h.path; in register_sim()
1305 xpt_setup_ccb(&csa.ccb_h, softs->os_specific.path, 5); in register_sim()
1316 mtx_unlock(&softs->os_specific.cam_lock); in register_sim()
1323 * Function to deregister smartpqi sim from cam layer
1332 if (softs->os_specific.mtx_init) { in deregister_sim()
1333 mtx_lock(&softs->os_specific.cam_lock); in deregister_sim()
1337 xpt_setup_ccb(&csa.ccb_h, softs->os_specific.path, 5); in deregister_sim()
1343 xpt_free_path(softs->os_specific.path); in deregister_sim()
1345 if (softs->os_specific.sim) { in deregister_sim()
1346 xpt_release_simq(softs->os_specific.sim, 0); in deregister_sim()
1347 xpt_bus_deregister(cam_sim_path(softs->os_specific.sim)); in deregister_sim()
1348 softs->os_specific.sim_registered = FALSE; in deregister_sim()
1349 cam_sim_free(softs->os_specific.sim, FALSE); in deregister_sim()
1350 softs->os_specific.sim = NULL; in deregister_sim()
1353 if (softs->os_specific.mtx_init) { in deregister_sim()
1354 mtx_unlock(&softs->os_specific.cam_lock); in deregister_sim()
1356 if (softs->os_specific.devq != NULL) { in deregister_sim()
1357 cam_simq_free(softs->os_specific.devq); in deregister_sim()
1359 if (softs->os_specific.mtx_init) { in deregister_sim()
1360 mtx_destroy(&softs->os_specific.cam_lock); in deregister_sim()
1361 softs->os_specific.mtx_init = FALSE; in deregister_sim()
1364 mtx_destroy(&softs->os_specific.map_lock); in deregister_sim()
1376 if(softs->os_specific.sim_registered) { in os_rescan_target()
1378 cam_sim_path(softs->os_specific.sim), in os_rescan_target()
1379 device->target, device->lun) != CAM_REQ_CMP) { in os_rescan_target()
1381 device->bus, device->target, device->lun); in os_rescan_target()
1388 device->scsi_rescan = false; in os_rescan_target()