Lines Matching full:ocs
44 #include "ocs.h"
86 static uint32_t ocs_abort_initiator_io(struct ocs_softc *ocs, union ccb *accb);
87 static void ocs_abort_inot(struct ocs_softc *ocs, union ccb *ccb);
88 static void ocs_abort_atio(struct ocs_softc *ocs, union ccb *ccb);
95 ocs_fcp_change_role(struct ocs_softc *ocs, ocs_fcport *fcp, uint32_t new_role);
99 static void ocs_delete_target(ocs_t *ocs, ocs_fcport *fcp, int tgt);
105 static inline ocs_io_t *ocs_scsi_find_io(struct ocs_softc *ocs, uint32_t tag) in ocs_scsi_find_io() argument
108 return ocs_io_get_instance(ocs, tag); in ocs_scsi_find_io()
117 if(io->ocs->io_in_use != 0) in ocs_target_io_free()
118 atomic_subtract_acq_32(&io->ocs->io_in_use, 1); in ocs_target_io_free()
122 ocs_attach_port(ocs_t *ocs, int chan) in ocs_attach_port() argument
127 uint32_t max_io = ocs_scsi_get_property(ocs, OCS_SCSI_MAX_IOS); in ocs_attach_port()
128 ocs_fcport *fcp = FCPORT(ocs, chan); in ocs_attach_port()
131 device_get_name(ocs->dev), ocs, in ocs_attach_port()
132 device_get_unit(ocs->dev), &ocs->sim_lock, in ocs_attach_port()
133 max_io, max_io, ocs->devq))) { in ocs_attach_port()
134 device_printf(ocs->dev, "Can't allocate SIM\n"); in ocs_attach_port()
138 mtx_lock(&ocs->sim_lock); in ocs_attach_port()
139 if (CAM_SUCCESS != xpt_bus_register(sim, ocs->dev, chan)) { in ocs_attach_port()
140 device_printf(ocs->dev, "Can't register bus %d\n", 0); in ocs_attach_port()
141 mtx_unlock(&ocs->sim_lock); in ocs_attach_port()
145 mtx_unlock(&ocs->sim_lock); in ocs_attach_port()
149 device_printf(ocs->dev, "Can't create path\n"); in ocs_attach_port()
151 mtx_unlock(&ocs->sim_lock); in ocs_attach_port()
156 fcp->ocs = ocs; in ocs_attach_port()
160 callout_init_mtx(&fcp->ldt, &ocs->sim_lock, 0); in ocs_attach_port()
167 ocs_detach_port(ocs_t *ocs, int32_t chan) in ocs_detach_port() argument
172 fcp = FCPORT(ocs, chan); in ocs_detach_port()
181 mtx_lock(&ocs->sim_lock); in ocs_detach_port()
182 ocs_tgt_resource_abort(ocs, &fcp->targ_rsrc_wildcard); in ocs_detach_port()
192 mtx_unlock(&ocs->sim_lock); in ocs_detach_port()
199 ocs_cam_attach(ocs_t *ocs) in ocs_cam_attach() argument
203 uint32_t max_io = ocs_scsi_get_property(ocs, OCS_SCSI_MAX_IOS); in ocs_cam_attach()
206 device_printf(ocs->dev, "Can't allocate SIMQ\n"); in ocs_cam_attach()
210 ocs->devq = devq; in ocs_cam_attach()
212 if (mtx_initialized(&ocs->sim_lock) == 0) { in ocs_cam_attach()
213 mtx_init(&ocs->sim_lock, "ocs_sim_lock", NULL, MTX_DEF); in ocs_cam_attach()
216 for (i = 0; i < (ocs->num_vports + 1); i++) { in ocs_cam_attach()
217 if (ocs_attach_port(ocs, i)) { in ocs_cam_attach()
218 ocs_log_err(ocs, "Attach port failed for chan: %d\n", i); in ocs_cam_attach()
223 ocs->io_high_watermark = max_io; in ocs_cam_attach()
224 ocs->io_in_use = 0; in ocs_cam_attach()
229 ocs_detach_port(ocs, i); in ocs_cam_attach()
232 cam_simq_free(ocs->devq); in ocs_cam_attach()
234 if (mtx_initialized(&ocs->sim_lock)) in ocs_cam_attach()
235 mtx_destroy(&ocs->sim_lock); in ocs_cam_attach()
241 ocs_cam_detach(ocs_t *ocs) in ocs_cam_detach() argument
245 for (i = (ocs->num_vports); i >= 0; i--) { in ocs_cam_detach()
246 ocs_detach_port(ocs, i); in ocs_cam_detach()
249 cam_simq_free(ocs->devq); in ocs_cam_detach()
251 if (mtx_initialized(&ocs->sim_lock)) in ocs_cam_detach()
252 mtx_destroy(&ocs->sim_lock); in ocs_cam_detach()
267 * @param ocs the driver instance's software context
272 ocs_scsi_tgt_new_device(ocs_t *ocs) in ocs_scsi_tgt_new_device() argument
274 ocs->enable_task_set_full = ocs_scsi_get_property(ocs, in ocs_scsi_tgt_new_device()
276 ocs_log_debug(ocs, "task set full processing is %s\n", in ocs_scsi_tgt_new_device()
277 ocs->enable_task_set_full ? "enabled" : "disabled"); in ocs_scsi_tgt_new_device()
284 * @brief Tears down target members of ocs structure.
288 * @param ocs pointer to ocs
293 ocs_scsi_tgt_del_device(ocs_t *ocs) in ocs_scsi_tgt_del_device() argument
371 ocs_t *ocs = sport->ocs; in ocs_scsi_tgt_new_sport() local
374 sport->tgt_data = FCPORT(ocs, 0); in ocs_scsi_tgt_new_sport()
423 ocs_t *ocs = node->ocs; in ocs_scsi_new_initiator() local
431 ocs_log_err(ocs, "FCP is NULL \n"); in ocs_scsi_new_initiator()
439 atomic_subtract_acq_32(&ocs->io_high_watermark, OCS_RSVD_INI_IO); in ocs_scsi_new_initiator()
495 ocs_t *ocs = node->ocs; in ocs_scsi_del_initiator() local
503 ocs_log_err(ocs, "FCP is NULL \n"); in ocs_scsi_del_initiator()
523 atomic_add_acq_32(&ocs->io_high_watermark, OCS_RSVD_INI_IO); in ocs_scsi_del_initiator()
551 ocs_t *ocs = io->ocs; in ocs_scsi_recv_cmd() local
560 ocs_log_err(ocs, "FCP is NULL \n"); in ocs_scsi_recv_cmd()
564 atomic_add_acq_32(&ocs->io_in_use, 1); in ocs_scsi_recv_cmd()
567 io->timeout = ocs->target_io_timer_sec; in ocs_scsi_recv_cmd()
569 if (ocs->enable_task_set_full && in ocs_scsi_recv_cmd()
570 (ocs->io_in_use >= ocs->io_high_watermark)) { in ocs_scsi_recv_cmd()
622 ocs->dev, "%s: no ATIO for LUN %lx (en=%s) OX_ID %#x\n", in ocs_scsi_recv_cmd()
684 ocs_t *ocs = tmfio->ocs; in ocs_scsi_recv_tmf() local
693 ocs_log_err(ocs, "FCP is NULL \n"); in ocs_scsi_recv_tmf()
703 device_printf(tmfio->ocs->dev, "%s: io=%u(index) cmd=%#x LU=%lx en=%s\n", in ocs_scsi_recv_tmf()
712 ocs->dev, "%s: no INOT for LUN %llx (en=%s) OX_ID %#x\n", in ocs_scsi_recv_tmf()
743 device_printf(ocs->dev, "%s: ABTS IO.%#x st=%#x\n", in ocs_scsi_recv_tmf()
749 device_printf(ocs->dev, in ocs_scsi_recv_tmf()
775 device_printf(ocs->dev, "%s: unsupported TMF %#x\n", in ocs_scsi_recv_tmf()
803 * @brief Initializes any initiator fields on the ocs structure.
807 * @param ocs pointer to ocs
812 ocs_scsi_ini_new_device(ocs_t *ocs) in ocs_scsi_ini_new_device() argument
820 * @brief Tears down initiator members of ocs structure.
824 * @param ocs pointer to ocs
830 ocs_scsi_ini_del_device(ocs_t *ocs) in ocs_scsi_ini_del_device() argument
907 ocs_t *ocs = sport->ocs; in ocs_scsi_ini_new_sport() local
908 ocs_fcport *fcp = FCPORT(ocs, 0); in ocs_scsi_ini_new_sport()
935 ocs_t *ocs = sport->ocs; in ocs_scsi_ini_del_sport() local
936 ocs_fcport *fcp = FCPORT(ocs, 0); in ocs_scsi_ini_del_sport()
946 ocs_t *ocs = sport->ocs; in ocs_scsi_sport_deleted() local
957 ocs_xport_status(ocs->xport, OCS_XPORT_PORT_STATUS, &value); in ocs_scsi_sport_deleted()
960 ocs_log_debug(ocs, "PORT offline,.. skipping\n"); in ocs_scsi_sport_deleted()
966 ocs_log_debug(ocs,"sport is not NULL, skipping\n"); in ocs_scsi_sport_deleted()
970 ocs_sport_vport_alloc(ocs->domain, fcp->vport); in ocs_scsi_sport_deleted()
1035 struct ocs_softc *ocs = node->ocs; in ocs_add_new_tgt() local
1043 device_printf(ocs->dev, "%s: ccb allocation failed\n", __func__); in ocs_add_new_tgt()
1051 ocs->dev, "%s: target path creation failed\n", __func__); in ocs_add_new_tgt()
1085 ocs_delete_target(ocs_t *ocs, ocs_fcport *fcp, int tgt) in ocs_delete_target() argument
1090 device_printf(ocs->dev, "%s: calling with NULL sim\n", __func__); in ocs_delete_target()
1124 ocs_t *ocs = fcp->ocs; in ocs_ldt_task() local
1135 if ((tgt->gone_timer != 0) && (ocs->attached)){ in ocs_ldt_task()
1141 ocs_delete_target(ocs, fcp, i); in ocs_ldt_task()
1180 struct ocs_softc *ocs = node->ocs; in ocs_scsi_del_target() local
1185 if (ocs == NULL) { in ocs_scsi_del_target()
1186 ocs_log_err(ocs,"OCS is NULL \n"); in ocs_scsi_del_target()
1192 ocs_log_err(ocs,"FCP is NULL \n"); in ocs_scsi_del_target()
1198 ocs_log_err(ocs,"target is invalid\n"); in ocs_scsi_del_target()
1205 if(!ocs->attached) { in ocs_scsi_del_target()
1206 ocs_delete_target(ocs, fcp, tgt_id); in ocs_scsi_del_target()
1317 ocs_t *ocs = io->ocs; in ocs_task_set_full_or_busy() local
1330 io->ocs->io_in_use, io->ocs->io_high_watermark); in ocs_task_set_full_or_busy()
1334 io->ocs->io_in_use); in ocs_task_set_full_or_busy()
1338 if (OCS_LOG_ENABLE_Q_FULL_BUSY_MSG(ocs)) { in ocs_task_set_full_or_busy()
1342 ocs_log_info(ocs, "OCS CAM TASK SET FULL. Tasks >= %d\n", in ocs_task_set_full_or_busy()
1343 ocs->io_high_watermark); in ocs_task_set_full_or_busy()
1347 ocs_log_info(ocs, "OCS CAM SCSI BUSY\n"); in ocs_task_set_full_or_busy()
1373 struct ocs_softc *ocs = csio->ccb_h.ccb_ocs_ptr; in ocs_scsi_target_io_cb() local
1389 bus_dmamap_sync(ocs->buf_dmat, io->tgt_io.dmap, op); in ocs_scsi_target_io_cb()
1391 bus_dmamap_unload(ocs->buf_dmat, io->tgt_io.dmap); in ocs_scsi_target_io_cb()
1426 /*device_printf(ocs->dev, "%s: CTIO state=%d tag=%#x\n", in ocs_scsi_target_io_cb()
1443 struct ocs_softc *ocs = NULL; in ocs_io_abort_cb() local
1448 ocs = io->ocs; in ocs_io_abort_cb()
1460 device_printf(ocs->dev, "%s: unhandled status %d\n", in ocs_io_abort_cb()
1490 struct ocs_softc *ocs = csio->ccb_h.ccb_ocs_ptr; in ocs_scsi_initiator_io_cb() local
1503 bus_dmamap_sync(ocs->buf_dmat, io->tgt_io.dmap, op); in ocs_scsi_initiator_io_cb()
1505 bus_dmamap_unload(ocs->buf_dmat, io->tgt_io.dmap); in ocs_scsi_initiator_io_cb()
1667 * @param ocs the driver instance's software context
1676 ocs_build_scsi_sgl(struct ocs_softc *ocs, union ccb *ccb, ocs_io_t *io, in ocs_build_scsi_sgl() argument
1682 if (!ocs || !ccb || !io || !sgl) { in ocs_build_scsi_sgl()
1684 ocs, ccb, io, sgl); in ocs_build_scsi_sgl()
1695 err = bus_dmamap_load_ccb(ocs->buf_dmat, io->tgt_io.dmap, ccb, in ocs_build_scsi_sgl()
1700 ocs->dev, "%s: bus_dmamap_load_ccb error (%d %d)\n", in ocs_build_scsi_sgl()
1713 * @param ocs the driver instance's software context
1719 ocs_target_io(struct ocs_softc *ocs, union ccb *ccb) in ocs_target_io() argument
1728 io = ocs_scsi_find_io(ocs, csio->tag_id); in ocs_target_io()
1737 /*device_printf(ocs->dev, in ocs_target_io()
1759 csio->ccb_h.ccb_ocs_ptr = ocs; in ocs_target_io()
1790 sgl_count = ocs_build_scsi_sgl(ocs, ccb, io, sgl, io->sgl_allocated); in ocs_target_io()
1801 device_printf(ocs->dev, "%s:" in ocs_target_io()
1808 device_printf(ocs->dev, "%s: building SGL failed\n", in ocs_target_io()
1814 device_printf(ocs->dev, "%s: Wrong value xfer and sendstatus" in ocs_target_io()
1824 device_printf(ocs->dev, "%s: CTIO state=%d tag=%#x\n", in ocs_target_io()
1839 /*device_printf(io->ocs->dev, "%s: tag=%x io=%p s=%#x\n", in ocs_target_tmf_cb()
1850 * @param ocs the driver instance's software context
1856 ocs_initiator_io(struct ocs_softc *ocs, union ccb *ccb) in ocs_initiator_io() argument
1867 fcp = FCPORT(ocs, cam_sim_bus(xpt_path_sim((ccb)->ccb_h.path))); in ocs_initiator_io()
1870 device_printf(ocs->dev, "%s: device LOST %d\n", __func__, in ocs_initiator_io()
1876 device_printf(ocs->dev, "%s: device not ready %d\n", __func__, in ocs_initiator_io()
1881 node = ocs_node_get_instance(ocs, fcp->tgt[ccb_h->target_id].node_id); in ocs_initiator_io()
1883 device_printf(ocs->dev, "%s: no device %d\n", __func__, in ocs_initiator_io()
1889 device_printf(ocs->dev, "%s: not target device %d\n", __func__, in ocs_initiator_io()
1896 device_printf(ocs->dev, "%s: unable to alloc IO\n", __func__); in ocs_initiator_io()
1904 csio->ccb_h.ccb_ocs_ptr = ocs; in ocs_initiator_io()
1908 sgl_count = ocs_build_scsi_sgl(ocs, ccb, io, sgl, io->sgl_allocated); in ocs_initiator_io()
1911 device_printf(ocs->dev, "%s: building SGL failed\n", __func__); in ocs_initiator_io()
1982 ocs_fcp_change_role(struct ocs_softc *ocs, ocs_fcport *fcp, uint32_t new_role) in ocs_fcp_change_role() argument
1988 for (was = 0, i = 0; i < (ocs->num_vports + 1); i++) { in ocs_fcp_change_role()
1989 if (FCPORT(ocs, i)->role != KNOB_ROLE_NONE) in ocs_fcp_change_role()
1997 ocs->enable_ini = (new_role & KNOB_ROLE_INITIATOR)? 1:0; in ocs_fcp_change_role()
1998 ocs->enable_tgt = (new_role & KNOB_ROLE_TARGET)? 1:0; in ocs_fcp_change_role()
2004 rc = ocs_xport_control(ocs->xport, OCS_XPORT_PORT_OFFLINE); in ocs_fcp_change_role()
2006 ocs_log_debug(ocs, "port offline failed : %d\n", rc); in ocs_fcp_change_role()
2009 rc = ocs_xport_control(ocs->xport, OCS_XPORT_PORT_ONLINE); in ocs_fcp_change_role()
2011 ocs_log_debug(ocs, "port online failed : %d\n", rc); in ocs_fcp_change_role()
2022 return ocs_sport_vport_del(ocs, ocs->domain, vport->wwpn, vport->wwnn); in ocs_fcp_change_role()
2031 return ocs_sport_vport_alloc(ocs->domain, vport); in ocs_fcp_change_role()
2053 struct ocs_softc *ocs = (struct ocs_softc *)cam_sim_softc(sim); in ocs_action() local
2070 rc = ocs_initiator_io(ocs, ccb); in ocs_action()
2096 ocs_fcport *fcp = FCPORT(ocs, bus); in ocs_action()
2106 if (ocs->ocs_xport == OCS_XPORT_FC) { in ocs_action()
2115 ocs_xport_status(ocs->xport, OCS_XPORT_LINK_SPEED, &value); in ocs_action()
2118 wwn = *((uint64_t *)ocs_scsi_get_property_ptr(ocs, OCS_SCSI_WWPN)); in ocs_action()
2121 wwn = *((uint64_t *)ocs_scsi_get_property_ptr(ocs, OCS_SCSI_WWNN)); in ocs_action()
2126 if (ocs->config_tgt) { in ocs_action()
2136 cpi->initiator_id = ocs->max_remote_nodes + 1; in ocs_action()
2138 if (!ocs->enable_ini) { in ocs_action()
2153 (ocs_scsi_get_property(ocs, OCS_SCSI_MAX_SGL) - 1); in ocs_action()
2170 ocs_fcport *fcp = FCPORT(ocs, bus); in ocs_action()
2173 if (ocs->ocs_xport != OCS_XPORT_FC) { in ocs_action()
2201 ocs_xport_status(ocs->xport, OCS_XPORT_LINK_SPEED, &value); in ocs_action()
2233 ocs_fcport *fcp = FCPORT(ocs, bus); in ocs_action()
2235 if (ocs->ocs_xport != OCS_XPORT_FC) { in ocs_action()
2242 wwn = *((uint64_t *)ocs_scsi_get_property_ptr(ocs, in ocs_action()
2246 wwn = *((uint64_t *)ocs_scsi_get_property_ptr(ocs, in ocs_action()
2266 ocs_fcport *fcp = FCPORT(ocs, bus); in ocs_action()
2268 if (ocs->ocs_xport != OCS_XPORT_FC) { in ocs_action()
2275 device_printf(ocs->dev, in ocs_action()
2305 device_printf(ocs->dev, in ocs_action()
2311 device_printf(ocs->dev, in ocs_action()
2315 ocs_fcp_change_role(ocs, fcp, knob->xport_specific.fc.role); in ocs_action()
2331 ocs_abort_atio(ocs, ccb); in ocs_action()
2334 ocs_abort_inot(ocs, ccb); in ocs_action()
2337 rc = ocs_abort_initiator_io(ocs, accb); in ocs_action()
2354 if (ocs_xport_control(ocs->xport, OCS_XPORT_PORT_OFFLINE) == 0) { in ocs_action()
2355 rc = ocs_xport_control(ocs->xport, OCS_XPORT_PORT_ONLINE); in ocs_action()
2357 ocs_log_debug(ocs, "Failed to bring port online" in ocs_action()
2371 ocs_fcport *fcp = FCPORT(ocs, bus); in ocs_action()
2373 node = ocs_node_get_instance(ocs, fcp->tgt[ccb_h->target_id].node_id); in ocs_action()
2375 device_printf(ocs->dev, "%s: no device %d\n", in ocs_action()
2384 device_printf(ocs->dev, "%s: unable to alloc IO\n", in ocs_action()
2413 ocs_fcport *fcp = FCPORT(ocs, bus); in ocs_action()
2415 device_printf(ocs->dev, "XPT_EN_LUN %sable %d:%d\n", in ocs_action()
2426 ocs_tgt_resource_abort(ocs, trsrc); in ocs_action()
2458 ocs_fcport *fcp = FCPORT(ocs, bus); in ocs_action()
2483 ccb->ccb_h.ccb_ocs_ptr = ocs; in ocs_action()
2499 io = ocs_scsi_find_io(ocs, ccb->cna2.tag_id); in ocs_action()
2501 device_printf(ocs->dev, in ocs_action()
2512 device_printf(ocs->dev, in ocs_action()
2529 if (ocs_target_io(ocs, ccb)) { in ocs_action()
2530 device_printf(ocs->dev, in ocs_action()
2537 device_printf(ocs->dev, "unhandled func_code = %#x\n", in ocs_action()
2570 ocs_log_test(io->ocs, "check response without data?!?\n"); in ocs_initiator_tmf_cb()
2576 ocs_log_test(io->ocs, "TMF status %08x\n", in ocs_initiator_tmf_cb()
2583 ocs_log_test(io->ocs, "status=%#x\n", scsi_status); in ocs_initiator_tmf_cb()
2599 * @param ocs the driver instance's software context
2630 ocs_tgt_resource_abort(struct ocs_softc *ocs, ocs_tgt_resource_t *trsrc) in ocs_tgt_resource_abort() argument
2656 ocs_abort_atio(struct ocs_softc *ocs, union ccb *ccb) in ocs_abort_atio() argument
2666 ocs_fcport *fcp = FCPORT(ocs, bus); in ocs_abort_atio()
2693 device_printf(ocs->dev, in ocs_abort_atio()
2704 device_printf(ocs->dev, "%s: abort not received or io completed \n", __func__); in ocs_abort_atio()
2717 ocs_abort_inot(struct ocs_softc *ocs, union ccb *ccb) in ocs_abort_inot() argument
2725 ocs_fcport *fcp = FCPORT(ocs, bus); in ocs_abort_inot()
2747 ocs_abort_initiator_io(struct ocs_softc *ocs, union ccb *accb) in ocs_abort_initiator_io() argument
2755 ocs_fcport *fcp = FCPORT(ocs, cam_sim_bus(xpt_path_sim((accb)->ccb_h.path))); in ocs_abort_initiator_io()
2756 node = ocs_node_get_instance(ocs, fcp->tgt[accb->ccb_h.target_id].node_id); in ocs_abort_initiator_io()
2758 device_printf(ocs->dev, "%s: no device %d\n", in ocs_abort_initiator_io()
2767 device_printf(ocs->dev, in ocs_abort_initiator_io()
2789 //ocs_t *ocs = obj; in ocs_scsi_ini_ddump()
2819 //ocs_t *ocs = obj; in ocs_scsi_tgt_ddump()
2890 lcrn = ocs_malloc(node->ocs, sizeof(struct ocs_lun_crn), in ocs_get_crn()
2920 ocs_free(node->ocs, lcrn, sizeof(*lcrn)); in ocs_del_crn()