Lines Matching +full:tmr +full:- +full:add

6  * © Copyright 2011-2013 Datera, Inc.
58 * Called from struct target_core_fabric_ops->check_stop_free()
69 struct scsi_cmnd *sc = tl_cmd->sc; in tcm_loop_release_cmd()
71 if (se_cmd->se_cmd_flags & SCF_SCSI_TMR_CDB) in tcm_loop_release_cmd()
103 struct se_cmd *se_cmd = &tl_cmd->tl_se_cmd; in tcm_loop_target_queue_cmd()
104 struct scsi_cmnd *sc = tl_cmd->sc; in tcm_loop_target_queue_cmd()
111 tl_hba = *(struct tcm_loop_hba **)shost_priv(sc->device->host); in tcm_loop_target_queue_cmd()
112 tl_tpg = &tl_hba->tl_hba_tpgs[sc->device->id]; in tcm_loop_target_queue_cmd()
115 * Ensure that this tl_tpg reference from the incoming sc->device->id in tcm_loop_target_queue_cmd()
118 if (!tl_tpg->tl_hba) { in tcm_loop_target_queue_cmd()
122 if (tl_tpg->tl_transport_status == TCM_TRANSPORT_OFFLINE) { in tcm_loop_target_queue_cmd()
126 tl_nexus = tl_tpg->tl_nexus; in tcm_loop_target_queue_cmd()
137 se_cmd->prot_pto = true; in tcm_loop_target_queue_cmd()
146 se_cmd->tag = tl_cmd->sc_cmd_tag; in tcm_loop_target_queue_cmd()
147 target_init_cmd(se_cmd, tl_nexus->se_sess, &tl_cmd->tl_sense_buf[0], in tcm_loop_target_queue_cmd()
148 tl_cmd->sc->device->lun, transfer_length, in tcm_loop_target_queue_cmd()
149 TCM_SIMPLE_TAG, sc->sc_data_direction, 0); in tcm_loop_target_queue_cmd()
151 if (target_submit_prep(se_cmd, sc->cmnd, scsi_sglist(sc), in tcm_loop_target_queue_cmd()
165 * ->queuecommand can be and usually is called from interrupt context, so
173 __func__, sc->device->host->host_no, sc->device->id, in tcm_loop_queuecommand()
174 sc->device->channel, sc->device->lun, sc->cmnd[0], in tcm_loop_queuecommand()
178 tl_cmd->sc = sc; in tcm_loop_queuecommand()
179 tl_cmd->sc_cmd_tag = scsi_cmd_to_rq(sc)->tag; in tcm_loop_queuecommand()
186 * Called from SCSI EH process context to issue a LUN_RESET TMR
190 u64 lun, int task, enum tcm_tmreq_table tmr) in tcm_loop_issue_tmr() argument
201 tl_nexus = tl_tpg->tl_nexus; in tcm_loop_issue_tmr()
211 init_completion(&tl_cmd->tmr_done); in tcm_loop_issue_tmr()
213 se_cmd = &tl_cmd->tl_se_cmd; in tcm_loop_issue_tmr()
214 se_sess = tl_tpg->tl_nexus->se_sess; in tcm_loop_issue_tmr()
216 rc = target_submit_tmr(se_cmd, se_sess, tl_cmd->tl_sense_buf, lun, in tcm_loop_issue_tmr()
217 NULL, tmr, GFP_KERNEL, task, in tcm_loop_issue_tmr()
221 wait_for_completion(&tl_cmd->tmr_done); in tcm_loop_issue_tmr()
222 ret = se_cmd->se_tmr_req->response; in tcm_loop_issue_tmr()
242 tl_hba = *(struct tcm_loop_hba **)shost_priv(sc->device->host); in tcm_loop_abort_task()
243 tl_tpg = &tl_hba->tl_hba_tpgs[sc->device->id]; in tcm_loop_abort_task()
244 ret = tcm_loop_issue_tmr(tl_tpg, sc->device->lun, in tcm_loop_abort_task()
245 scsi_cmd_to_rq(sc)->tag, TMR_ABORT_TASK); in tcm_loop_abort_task()
250 * Called from SCSI EH process context to issue a LUN_RESET TMR
262 tl_hba = *(struct tcm_loop_hba **)shost_priv(sc->device->host); in tcm_loop_device_reset()
263 tl_tpg = &tl_hba->tl_hba_tpgs[sc->device->id]; in tcm_loop_device_reset()
265 ret = tcm_loop_issue_tmr(tl_tpg, sc->device->lun, in tcm_loop_device_reset()
278 tl_hba = *(struct tcm_loop_hba **)shost_priv(sc->device->host); in tcm_loop_target_reset()
284 * Locate the tl_tpg pointer from TargetID in sc->device->id in tcm_loop_target_reset()
286 tl_tpg = &tl_hba->tl_hba_tpgs[sc->device->id]; in tcm_loop_target_reset()
288 tl_tpg->tl_transport_status = TCM_TRANSPORT_ONLINE; in tcm_loop_target_reset()
303 .this_id = -1,
306 .dma_boundary = PAGE_SIZE - 1,
324 return -ENODEV; in tcm_loop_driver_probe()
326 tl_hba->sh = sh; in tcm_loop_driver_probe()
329 * Assign the struct tcm_loop_hba pointer to struct Scsi_Host->hostdata in tcm_loop_driver_probe()
331 *((struct tcm_loop_hba **)sh->hostdata) = tl_hba; in tcm_loop_driver_probe()
335 sh->max_id = 2; in tcm_loop_driver_probe()
336 sh->max_lun = 0; in tcm_loop_driver_probe()
337 sh->max_channel = 0; in tcm_loop_driver_probe()
338 sh->max_cmd_len = SCSI_MAX_VARLEN_CDB_SIZE; in tcm_loop_driver_probe()
339 sh->nr_hw_queues = tcm_loop_nr_hw_queues; in tcm_loop_driver_probe()
340 sh->can_queue = tcm_loop_can_queue; in tcm_loop_driver_probe()
341 sh->cmd_per_lun = tcm_loop_cmd_per_lun; in tcm_loop_driver_probe()
350 error = scsi_add_host(sh, &tl_hba->dev); in tcm_loop_driver_probe()
354 return -ENODEV; in tcm_loop_driver_probe()
365 sh = tl_hba->sh; in tcm_loop_driver_remove()
385 tl_hba->dev.bus = &tcm_loop_lld_bus; in tcm_loop_setup_hba_bus()
386 tl_hba->dev.parent = tcm_loop_primary; in tcm_loop_setup_hba_bus()
387 tl_hba->dev.release = &tcm_loop_release_adapter; in tcm_loop_setup_hba_bus()
388 dev_set_name(&tl_hba->dev, "tcm_loop_adapter_%d", tcm_loop_host_id); in tcm_loop_setup_hba_bus()
390 ret = device_register(&tl_hba->dev); in tcm_loop_setup_hba_bus()
392 pr_err("device_register() failed for tl_hba->dev: %d\n", ret); in tcm_loop_setup_hba_bus()
393 put_device(&tl_hba->dev); in tcm_loop_setup_hba_bus()
394 return -ENODEV; in tcm_loop_setup_hba_bus()
455 return &tl_tpg(se_tpg)->tl_hba->tl_wwn_address[0]; in tcm_loop_get_endpoint_wwn()
464 return tl_tpg(se_tpg)->tl_tpgt; in tcm_loop_get_tag()
480 return tl_tpg->tl_fabric_prot_type; in tcm_loop_check_prot_fabric_only()
493 return tl_cmd->sc_cmd_state; in tcm_loop_get_cmd_state()
500 * sc->sc_data_direction of DMA_TO_DEVICE with struct scatterlist array in tcm_loop_write_pending()
501 * memory, and memory has already been mapped to struct se_cmd->t_mem_list in tcm_loop_write_pending()
504 * We now tell TCM to add this WRITE CDB directly into the TCM storage in tcm_loop_write_pending()
516 struct scsi_cmnd *sc = tl_cmd->sc; in tcm_loop_queue_data_or_status()
519 func, sc, sc->cmnd[0]); in tcm_loop_queue_data_or_status()
521 if (se_cmd->sense_buffer && in tcm_loop_queue_data_or_status()
522 ((se_cmd->se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) || in tcm_loop_queue_data_or_status()
523 (se_cmd->se_cmd_flags & SCF_EMULATED_TASK_SENSE))) { in tcm_loop_queue_data_or_status()
525 memcpy(sc->sense_buffer, se_cmd->sense_buffer, in tcm_loop_queue_data_or_status()
527 sc->result = SAM_STAT_CHECK_CONDITION; in tcm_loop_queue_data_or_status()
529 sc->result = scsi_status; in tcm_loop_queue_data_or_status()
532 if ((se_cmd->se_cmd_flags & SCF_OVERFLOW_BIT) || in tcm_loop_queue_data_or_status()
533 (se_cmd->se_cmd_flags & SCF_UNDERFLOW_BIT)) in tcm_loop_queue_data_or_status()
534 scsi_set_resid(sc, se_cmd->residual_count); in tcm_loop_queue_data_or_status()
546 se_cmd, se_cmd->scsi_status); in tcm_loop_queue_status()
555 complete(&tl_cmd->tmr_done); in tcm_loop_queue_tm_rsp()
565 switch (tl_hba->tl_proto_id) { in tcm_loop_dump_proto_id()
587 struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba; in tcm_loop_port_link()
589 atomic_inc_mb(&tl_tpg->tl_tpg_port_count); in tcm_loop_port_link()
591 * Add Linux/SCSI struct scsi_device by HCTL in tcm_loop_port_link()
593 scsi_add_device(tl_hba->sh, 0, tl_tpg->tl_tpgt, lun->unpacked_lun); in tcm_loop_port_link()
608 tl_hba = tl_tpg->tl_hba; in tcm_loop_port_unlink()
610 sd = scsi_device_lookup(tl_hba->sh, 0, tl_tpg->tl_tpgt, in tcm_loop_port_unlink()
611 se_lun->unpacked_lun); in tcm_loop_port_unlink()
614 0, tl_tpg->tl_tpgt, se_lun->unpacked_lun); in tcm_loop_port_unlink()
623 atomic_dec_mb(&tl_tpg->tl_tpg_port_count); in tcm_loop_port_unlink()
637 return sprintf(page, "%d\n", tl_tpg->tl_fabric_prot_type); in tcm_loop_tpg_attrib_fabric_prot_type_show()
655 return -EINVAL; in tcm_loop_tpg_attrib_fabric_prot_type_store()
657 tl_tpg->tl_fabric_prot_type = val; in tcm_loop_tpg_attrib_fabric_prot_type_store()
677 tl_tpg->tl_nexus = p; in tcm_loop_alloc_sess_cb()
685 struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba; in tcm_loop_make_nexus()
689 if (tl_tpg->tl_nexus) { in tcm_loop_make_nexus()
690 pr_debug("tl_tpg->tl_nexus already exists\n"); in tcm_loop_make_nexus()
691 return -EEXIST; in tcm_loop_make_nexus()
696 return -ENOMEM; in tcm_loop_make_nexus()
698 tl_nexus->se_sess = target_setup_session(&tl_tpg->tl_se_tpg, 0, 0, in tcm_loop_make_nexus()
701 if (IS_ERR(tl_nexus->se_sess)) { in tcm_loop_make_nexus()
702 ret = PTR_ERR(tl_nexus->se_sess); in tcm_loop_make_nexus()
718 tl_nexus = tpg->tl_nexus; in tcm_loop_drop_nexus()
720 return -ENODEV; in tcm_loop_drop_nexus()
722 se_sess = tl_nexus->se_sess; in tcm_loop_drop_nexus()
724 return -ENODEV; in tcm_loop_drop_nexus()
726 if (atomic_read(&tpg->tl_tpg_port_count)) { in tcm_loop_drop_nexus()
728 atomic_read(&tpg->tl_tpg_port_count)); in tcm_loop_drop_nexus()
729 return -EPERM; in tcm_loop_drop_nexus()
733 tcm_loop_dump_proto_id(tpg->tl_hba), in tcm_loop_drop_nexus()
734 tl_nexus->se_sess->se_node_acl->initiatorname); in tcm_loop_drop_nexus()
739 tpg->tl_nexus = NULL; in tcm_loop_drop_nexus()
754 tl_nexus = tl_tpg->tl_nexus; in tcm_loop_tpg_nexus_show()
756 return -ENODEV; in tcm_loop_tpg_nexus_show()
759 tl_nexus->se_sess->se_node_acl->initiatorname); in tcm_loop_tpg_nexus_show()
770 struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba; in tcm_loop_tpg_nexus_store()
788 return -EINVAL; in tcm_loop_tpg_nexus_store()
794 if (tl_hba->tl_proto_id != SCSI_PROTOCOL_SAS) { in tcm_loop_tpg_nexus_store()
797 return -EINVAL; in tcm_loop_tpg_nexus_store()
804 if (tl_hba->tl_proto_id != SCSI_PROTOCOL_FCP) { in tcm_loop_tpg_nexus_store()
807 return -EINVAL; in tcm_loop_tpg_nexus_store()
814 if (tl_hba->tl_proto_id != SCSI_PROTOCOL_ISCSI) { in tcm_loop_tpg_nexus_store()
817 return -EINVAL; in tcm_loop_tpg_nexus_store()
824 return -EINVAL; in tcm_loop_tpg_nexus_store()
829 if (i_port[strlen(i_port)-1] == '\n') in tcm_loop_tpg_nexus_store()
830 i_port[strlen(i_port)-1] = '\0'; in tcm_loop_tpg_nexus_store()
846 ssize_t ret = -EINVAL; in tcm_loop_tpg_transport_status_show()
848 switch (tl_tpg->tl_transport_status) { in tcm_loop_tpg_transport_status_show()
873 tl_tpg->tl_transport_status = TCM_TRANSPORT_ONLINE; in tcm_loop_tpg_transport_status_store()
877 tl_tpg->tl_transport_status = TCM_TRANSPORT_OFFLINE; in tcm_loop_tpg_transport_status_store()
878 if (tl_tpg->tl_nexus) { in tcm_loop_tpg_transport_status_store()
879 struct se_session *tl_sess = tl_tpg->tl_nexus->se_sess; in tcm_loop_tpg_transport_status_store()
881 core_allocate_nexus_loss_ua(tl_sess->se_node_acl); in tcm_loop_tpg_transport_status_store()
885 return -EINVAL; in tcm_loop_tpg_transport_status_store()
894 struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba; in tcm_loop_tpg_address_show()
897 tl_hba->sh->host_no, tl_tpg->tl_tpgt); in tcm_loop_tpg_address_show()
924 return ERR_PTR(-EINVAL); in tcm_loop_make_naa_tpg()
927 return ERR_PTR(-EINVAL); in tcm_loop_make_naa_tpg()
932 return ERR_PTR(-EINVAL); in tcm_loop_make_naa_tpg()
934 tl_tpg = &tl_hba->tl_hba_tpgs[tpgt]; in tcm_loop_make_naa_tpg()
935 tl_tpg->tl_hba = tl_hba; in tcm_loop_make_naa_tpg()
936 tl_tpg->tl_tpgt = tpgt; in tcm_loop_make_naa_tpg()
940 ret = core_tpg_register(wwn, &tl_tpg->tl_se_tpg, tl_hba->tl_proto_id); in tcm_loop_make_naa_tpg()
942 return ERR_PTR(-ENOMEM); in tcm_loop_make_naa_tpg()
946 config_item_name(&wwn->wwn_group.cg_item), tpgt); in tcm_loop_make_naa_tpg()
947 return &tl_tpg->tl_se_tpg; in tcm_loop_make_naa_tpg()
953 struct se_wwn *wwn = se_tpg->se_tpg_wwn; in tcm_loop_drop_naa_tpg()
959 tl_hba = tl_tpg->tl_hba; in tcm_loop_drop_naa_tpg()
960 tpgt = tl_tpg->tl_tpgt; in tcm_loop_drop_naa_tpg()
970 tl_tpg->tl_hba = NULL; in tcm_loop_drop_naa_tpg()
971 tl_tpg->tl_tpgt = 0; in tcm_loop_drop_naa_tpg()
975 config_item_name(&wwn->wwn_group.cg_item), tpgt); in tcm_loop_drop_naa_tpg()
994 return ERR_PTR(-ENOMEM); in tcm_loop_make_scsi_hba()
1002 tl_hba->tl_proto_id = SCSI_PROTOCOL_SAS; in tcm_loop_make_scsi_hba()
1007 tl_hba->tl_proto_id = SCSI_PROTOCOL_FCP; in tcm_loop_make_scsi_hba()
1015 ret = -EINVAL; in tcm_loop_make_scsi_hba()
1018 tl_hba->tl_proto_id = SCSI_PROTOCOL_ISCSI; in tcm_loop_make_scsi_hba()
1024 ret = -EINVAL; in tcm_loop_make_scsi_hba()
1027 snprintf(&tl_hba->tl_wwn_address[0], TL_WWN_ADDR_LEN, "%s", &name[off]); in tcm_loop_make_scsi_hba()
1030 * Call device_register(tl_hba->dev) to register the emulated in tcm_loop_make_scsi_hba()
1031 * Linux/SCSI LLD of type struct Scsi_Host at tl_hba->sh after in tcm_loop_make_scsi_hba()
1038 sh = tl_hba->sh; in tcm_loop_make_scsi_hba()
1041 tcm_loop_dump_proto_id(tl_hba), name, sh->host_no); in tcm_loop_make_scsi_hba()
1042 return &tl_hba->tl_hba_wwn; in tcm_loop_make_scsi_hba()
1055 tcm_loop_dump_proto_id(tl_hba), tl_hba->tl_wwn_address, in tcm_loop_drop_scsi_hba()
1056 tl_hba->sh->host_no); in tcm_loop_drop_scsi_hba()
1058 * Call device_unregister() on the original tl_hba->dev. in tcm_loop_drop_scsi_hba()
1062 device_unregister(&tl_hba->dev); in tcm_loop_drop_scsi_hba()
1111 int ret = -ENOMEM; in tcm_loop_fabric_init()