Lines Matching +full:dont +full:- +full:validate

1 // SPDX-License-Identifier: GPL-2.0-or-later
6 * (c) Copyright 2010-2013 Datera, Inc.
11 * the TCM_FC / Open-FCoE.org fabric module.
40 * If strict, we require lower-case hex and colon separators to be sure
42 * so the name and wwn are mapped one-to-one.
54 for (cp = name; cp < &name[TCM_QLA2XXX_NAMELEN - 1]; cp++) { in tcm_qla2xxx_parse_wwn()
69 return cp - name; in tcm_qla2xxx_parse_wwn()
73 nibble = c - '0'; in tcm_qla2xxx_parse_wwn()
75 nibble = tolower(c) - 'a' + 10; in tcm_qla2xxx_parse_wwn()
83 err, cp - name, pos, byte); in tcm_qla2xxx_parse_wwn()
84 return -1; in tcm_qla2xxx_parse_wwn()
107 /* Validate and store the new name */ in tcm_qla2xxx_npiv_extract_wwn()
115 return -EINVAL; in tcm_qla2xxx_npiv_extract_wwn()
144 if (name[cnt-1] == '\n' || name[cnt-1] == 0) in tcm_qla2xxx_npiv_parse_wwn()
145 cnt--; in tcm_qla2xxx_npiv_parse_wwn()
147 /* validate we have enough characters for WWPN */ in tcm_qla2xxx_npiv_parse_wwn()
149 return -EINVAL; in tcm_qla2xxx_npiv_parse_wwn()
166 struct tcm_qla2xxx_lport *lport = tpg->lport; in tcm_qla2xxx_get_fabric_wwn()
168 return lport->lport_naa_name; in tcm_qla2xxx_get_fabric_wwn()
175 return tpg->lport_tpgt; in tcm_qla2xxx_get_tag()
183 return tpg->tpg_attrib.generate_node_acls; in tcm_qla2xxx_check_demo_mode()
191 return tpg->tpg_attrib.cache_dynamic_acls; in tcm_qla2xxx_check_demo_mode_cache()
199 return tpg->tpg_attrib.demo_mode_write_protect; in tcm_qla2xxx_check_demo_write_protect()
207 return tpg->tpg_attrib.prod_mode_write_protect; in tcm_qla2xxx_check_prod_write_protect()
215 return tpg->tpg_attrib.demo_mode_login_only; in tcm_qla2xxx_check_demo_mode_login_only()
223 return tpg->tpg_attrib.fabric_prot_type; in tcm_qla2xxx_check_prot_fabric_only()
231 return tpg->lport_tpgt; in tcm_qla2xxx_tpg_get_inst_index()
239 transport_generic_free_cmd(&mcmd->se_cmd, 0); in tcm_qla2xxx_complete_mcmd()
243 * Called from qla_target_template->free_mcmd(), and will call
245 * release callback. qla_hw_data->hardware_lock is expected to be held
251 INIT_WORK(&mcmd->free_work, tcm_qla2xxx_complete_mcmd); in tcm_qla2xxx_free_mcmd()
252 queue_work(tcm_qla2xxx_free_wq, &mcmd->free_work); in tcm_qla2xxx_free_mcmd()
260 cmd->cmd_in_wq = 0; in tcm_qla2xxx_complete_free()
262 WARN_ON(cmd->trc_flags & TRC_CMD_FREE); in tcm_qla2xxx_complete_free()
265 cmd->qpair->tgt_counters.qla_core_ret_sta_ctio++; in tcm_qla2xxx_complete_free()
266 cmd->trc_flags |= TRC_CMD_FREE; in tcm_qla2xxx_complete_free()
267 cmd->cmd_sent_to_fw = 0; in tcm_qla2xxx_complete_free()
269 spin_lock_irqsave(&cmd->sess->sess_cmd_lock, flags); in tcm_qla2xxx_complete_free()
270 list_del_init(&cmd->sess_cmd_list); in tcm_qla2xxx_complete_free()
271 spin_unlock_irqrestore(&cmd->sess->sess_cmd_lock, flags); in tcm_qla2xxx_complete_free()
273 transport_generic_free_cmd(&cmd->se_cmd, 0); in tcm_qla2xxx_complete_free()
278 struct se_session *se_sess = sess->se_sess; in tcm_qla2xxx_get_cmd()
282 tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); in tcm_qla2xxx_get_cmd()
286 cmd = &((struct qla_tgt_cmd *)se_sess->sess_cmd_map)[tag]; in tcm_qla2xxx_get_cmd()
288 cmd->se_cmd.map_tag = tag; in tcm_qla2xxx_get_cmd()
289 cmd->se_cmd.map_cpu = cpu; in tcm_qla2xxx_get_cmd()
296 target_free_tag(cmd->sess->se_sess, &cmd->se_cmd); in tcm_qla2xxx_rel_cmd()
300 * Called from qla_target_template->free_cmd(), and will call
302 * release callback. qla_hw_data->hardware_lock is expected to be held
306 cmd->qpair->tgt_counters.core_qla_free_cmd++; in tcm_qla2xxx_free_cmd()
307 cmd->cmd_in_wq = 1; in tcm_qla2xxx_free_cmd()
309 WARN_ON(cmd->trc_flags & TRC_CMD_DONE); in tcm_qla2xxx_free_cmd()
310 cmd->trc_flags |= TRC_CMD_DONE; in tcm_qla2xxx_free_cmd()
312 INIT_WORK(&cmd->work, tcm_qla2xxx_complete_free); in tcm_qla2xxx_free_cmd()
313 queue_work(tcm_qla2xxx_free_wq, &cmd->work); in tcm_qla2xxx_free_cmd()
317 * Called from struct target_core_fabric_ops->check_stop_free() context
323 if ((se_cmd->se_cmd_flags & SCF_SCSI_TMR_CDB) == 0) { in tcm_qla2xxx_check_stop_free()
325 cmd->trc_flags |= TRC_CMD_CHK_STOP; in tcm_qla2xxx_check_stop_free()
331 /* tcm_qla2xxx_release_cmd - Callback from TCM Core to release underlying
338 if (se_cmd->se_cmd_flags & SCF_SCSI_TMR_CDB) { in tcm_qla2xxx_release_cmd()
346 if (WARN_ON(cmd->cmd_sent_to_fw)) in tcm_qla2xxx_release_cmd()
365 kref_put(&sess->sess_kref, tcm_qla2xxx_release_session); in tcm_qla2xxx_put_sess()
370 struct fc_port *sess = se_sess->fabric_sess_ptr; in tcm_qla2xxx_close_session()
376 sess->explicit_logout = 1; in tcm_qla2xxx_close_session()
385 if (cmd->aborted) { in tcm_qla2xxx_write_pending()
386 /* Cmd can loop during Q-full. tcm_qla2xxx_aborted_task in tcm_qla2xxx_write_pending()
392 cmd, kref_read(&cmd->se_cmd.cmd_kref), in tcm_qla2xxx_write_pending()
393 cmd->se_cmd.transport_state, in tcm_qla2xxx_write_pending()
394 cmd->se_cmd.t_state, in tcm_qla2xxx_write_pending()
395 cmd->se_cmd.se_cmd_flags); in tcm_qla2xxx_write_pending()
396 transport_generic_request_failure(&cmd->se_cmd, in tcm_qla2xxx_write_pending()
400 cmd->trc_flags |= TRC_XFR_RDY; in tcm_qla2xxx_write_pending()
401 cmd->bufflen = se_cmd->data_length; in tcm_qla2xxx_write_pending()
402 cmd->dma_data_direction = target_reverse_dma_direction(se_cmd); in tcm_qla2xxx_write_pending()
404 cmd->sg_cnt = se_cmd->t_data_nents; in tcm_qla2xxx_write_pending()
405 cmd->sg = se_cmd->t_data_sg; in tcm_qla2xxx_write_pending()
407 cmd->prot_sg_cnt = se_cmd->t_prot_nents; in tcm_qla2xxx_write_pending()
408 cmd->prot_sg = se_cmd->t_prot_sg; in tcm_qla2xxx_write_pending()
409 cmd->blk_sz = se_cmd->se_dev->dev_attrib.block_size; in tcm_qla2xxx_write_pending()
410 se_cmd->pi_err = 0; in tcm_qla2xxx_write_pending()
421 if (!(se_cmd->se_cmd_flags & SCF_SCSI_TMR_CDB)) { in tcm_qla2xxx_get_cmd_state()
424 return cmd->state; in tcm_qla2xxx_get_cmd_state()
437 struct se_cmd *se_cmd = &cmd->se_cmd; in tcm_qla2xxx_handle_cmd()
450 if (se_cmd->cpuid != WORK_CPU_UNBOUND) in tcm_qla2xxx_handle_cmd()
453 sess = cmd->sess; in tcm_qla2xxx_handle_cmd()
456 return -EINVAL; in tcm_qla2xxx_handle_cmd()
459 se_sess = sess->se_sess; in tcm_qla2xxx_handle_cmd()
462 return -EINVAL; in tcm_qla2xxx_handle_cmd()
466 se_tpg = se_sess->se_tpg; in tcm_qla2xxx_handle_cmd()
468 if (unlikely(tpg->tpg_attrib.jam_host)) { in tcm_qla2xxx_handle_cmd()
469 /* return, and dont run target_submit_cmd,discarding command */ in tcm_qla2xxx_handle_cmd()
473 cmd->qpair->tgt_counters.qla_core_sbt_cmd++; in tcm_qla2xxx_handle_cmd()
475 spin_lock_irqsave(&sess->sess_cmd_lock, flags); in tcm_qla2xxx_handle_cmd()
476 list_add_tail(&cmd->sess_cmd_list, &sess->sess_cmd_list); in tcm_qla2xxx_handle_cmd()
477 spin_unlock_irqrestore(&sess->sess_cmd_lock, flags); in tcm_qla2xxx_handle_cmd()
479 rc = target_init_cmd(se_cmd, se_sess, &cmd->sense_buffer[0], in tcm_qla2xxx_handle_cmd()
480 cmd->unpacked_lun, data_length, fcp_task_attr, in tcm_qla2xxx_handle_cmd()
501 cmd->cmd_in_wq = 0; in tcm_qla2xxx_handle_data_work()
502 cmd->cmd_sent_to_fw = 0; in tcm_qla2xxx_handle_data_work()
503 if (cmd->aborted) { in tcm_qla2xxx_handle_data_work()
504 transport_generic_request_failure(&cmd->se_cmd, in tcm_qla2xxx_handle_data_work()
509 cmd->qpair->tgt_counters.qla_core_ret_ctio++; in tcm_qla2xxx_handle_data_work()
510 if (!cmd->write_data_transferred) { in tcm_qla2xxx_handle_data_work()
511 switch (cmd->dif_err_code) { in tcm_qla2xxx_handle_data_work()
513 cmd->se_cmd.pi_err = in tcm_qla2xxx_handle_data_work()
517 cmd->se_cmd.pi_err = in tcm_qla2xxx_handle_data_work()
521 cmd->se_cmd.pi_err = in tcm_qla2xxx_handle_data_work()
529 if (cmd->se_cmd.pi_err) in tcm_qla2xxx_handle_data_work()
530 transport_generic_request_failure(&cmd->se_cmd, in tcm_qla2xxx_handle_data_work()
531 cmd->se_cmd.pi_err); in tcm_qla2xxx_handle_data_work()
533 transport_generic_request_failure(&cmd->se_cmd, in tcm_qla2xxx_handle_data_work()
539 return target_execute_cmd(&cmd->se_cmd); in tcm_qla2xxx_handle_data_work()
547 cmd->trc_flags |= TRC_DATA_IN; in tcm_qla2xxx_handle_data()
548 cmd->cmd_in_wq = 1; in tcm_qla2xxx_handle_data()
549 INIT_WORK(&cmd->work, tcm_qla2xxx_handle_data_work); in tcm_qla2xxx_handle_data()
550 queue_work(tcm_qla2xxx_free_wq, &cmd->work); in tcm_qla2xxx_handle_data()
561 struct se_cmd *se_cmd = &cmd->se_cmd; in tcm_qla2xxx_dif_tags()
563 if (!(se_cmd->prot_checks & TARGET_DIF_CHECK_GUARD)) in tcm_qla2xxx_dif_tags()
566 if (!(se_cmd->prot_checks & TARGET_DIF_CHECK_APPTAG)) in tcm_qla2xxx_dif_tags()
578 struct fc_port *sess = mcmd->sess; in tcm_qla2xxx_handle_tmr()
579 struct se_cmd *se_cmd = &mcmd->se_cmd; in tcm_qla2xxx_handle_tmr()
584 pr_debug("%ld: ABTS received\n", sess->vha->host_no); in tcm_qla2xxx_handle_tmr()
588 pr_debug("%ld: 2G Abort Task received\n", sess->vha->host_no); in tcm_qla2xxx_handle_tmr()
592 pr_debug("%ld: CLEAR_ACA received\n", sess->vha->host_no); in tcm_qla2xxx_handle_tmr()
596 pr_debug("%ld: TARGET_RESET received\n", sess->vha->host_no); in tcm_qla2xxx_handle_tmr()
600 pr_debug("%ld: LUN_RESET received\n", sess->vha->host_no); in tcm_qla2xxx_handle_tmr()
604 pr_debug("%ld: CLEAR_TS received\n", sess->vha->host_no); in tcm_qla2xxx_handle_tmr()
608 pr_debug("%ld: ABORT_TS received\n", sess->vha->host_no); in tcm_qla2xxx_handle_tmr()
613 sess->vha->host_no, tmr_func); in tcm_qla2xxx_handle_tmr()
614 return -ENOSYS; in tcm_qla2xxx_handle_tmr()
617 return target_submit_tmr(se_cmd, sess->se_sess, NULL, lun, mcmd, in tcm_qla2xxx_handle_tmr()
627 if (!sess->se_sess) in tcm_qla2xxx_find_cmd_by_tag()
630 spin_lock_irqsave(&sess->sess_cmd_lock, flags); in tcm_qla2xxx_find_cmd_by_tag()
631 list_for_each_entry(cmd, &sess->sess_cmd_list, sess_cmd_list) { in tcm_qla2xxx_find_cmd_by_tag()
632 if (cmd->se_cmd.tag == tag) in tcm_qla2xxx_find_cmd_by_tag()
637 spin_unlock_irqrestore(&sess->sess_cmd_lock, flags); in tcm_qla2xxx_find_cmd_by_tag()
647 if (cmd->aborted) { in tcm_qla2xxx_queue_data_in()
648 /* Cmd can loop during Q-full. tcm_qla2xxx_aborted_task in tcm_qla2xxx_queue_data_in()
654 cmd, kref_read(&cmd->se_cmd.cmd_kref), in tcm_qla2xxx_queue_data_in()
655 cmd->se_cmd.transport_state, in tcm_qla2xxx_queue_data_in()
656 cmd->se_cmd.t_state, in tcm_qla2xxx_queue_data_in()
657 cmd->se_cmd.se_cmd_flags); in tcm_qla2xxx_queue_data_in()
661 cmd->trc_flags |= TRC_XMIT_DATA; in tcm_qla2xxx_queue_data_in()
662 cmd->bufflen = se_cmd->data_length; in tcm_qla2xxx_queue_data_in()
663 cmd->dma_data_direction = target_reverse_dma_direction(se_cmd); in tcm_qla2xxx_queue_data_in()
665 cmd->sg_cnt = se_cmd->t_data_nents; in tcm_qla2xxx_queue_data_in()
666 cmd->sg = se_cmd->t_data_sg; in tcm_qla2xxx_queue_data_in()
667 cmd->offset = 0; in tcm_qla2xxx_queue_data_in()
669 cmd->prot_sg_cnt = se_cmd->t_prot_nents; in tcm_qla2xxx_queue_data_in()
670 cmd->prot_sg = se_cmd->t_prot_sg; in tcm_qla2xxx_queue_data_in()
671 cmd->blk_sz = se_cmd->se_dev->dev_attrib.block_size; in tcm_qla2xxx_queue_data_in()
672 se_cmd->pi_err = 0; in tcm_qla2xxx_queue_data_in()
678 se_cmd->scsi_status); in tcm_qla2xxx_queue_data_in()
687 if (cmd->aborted) { in tcm_qla2xxx_queue_status()
689 * Cmd can loop during Q-full. tcm_qla2xxx_aborted_task in tcm_qla2xxx_queue_status()
695 cmd, kref_read(&cmd->se_cmd.cmd_kref), in tcm_qla2xxx_queue_status()
696 cmd->se_cmd.transport_state, cmd->se_cmd.t_state, in tcm_qla2xxx_queue_status()
697 cmd->se_cmd.se_cmd_flags); in tcm_qla2xxx_queue_status()
700 cmd->bufflen = se_cmd->data_length; in tcm_qla2xxx_queue_status()
701 cmd->sg = NULL; in tcm_qla2xxx_queue_status()
702 cmd->sg_cnt = 0; in tcm_qla2xxx_queue_status()
703 cmd->offset = 0; in tcm_qla2xxx_queue_status()
704 cmd->dma_data_direction = target_reverse_dma_direction(se_cmd); in tcm_qla2xxx_queue_status()
705 cmd->trc_flags |= TRC_XMIT_STATUS; in tcm_qla2xxx_queue_status()
707 if (se_cmd->data_direction == DMA_FROM_DEVICE) { in tcm_qla2xxx_queue_status()
709 * For FCP_READ with CHECK_CONDITION status, clear cmd->bufflen in tcm_qla2xxx_queue_status()
712 if (se_cmd->se_cmd_flags & SCF_OVERFLOW_BIT) { in tcm_qla2xxx_queue_status()
713 se_cmd->se_cmd_flags &= ~SCF_OVERFLOW_BIT; in tcm_qla2xxx_queue_status()
714 se_cmd->residual_count = 0; in tcm_qla2xxx_queue_status()
716 se_cmd->se_cmd_flags |= SCF_UNDERFLOW_BIT; in tcm_qla2xxx_queue_status()
717 se_cmd->residual_count += se_cmd->data_length; in tcm_qla2xxx_queue_status()
719 cmd->bufflen = 0; in tcm_qla2xxx_queue_status()
724 return qlt_xmit_response(cmd, xmit_type, se_cmd->scsi_status); in tcm_qla2xxx_queue_status()
729 struct se_tmr_req *se_tmr = se_cmd->se_tmr_req; in tcm_qla2xxx_queue_tm_rsp()
734 mcmd, se_tmr->function, se_tmr->response); in tcm_qla2xxx_queue_tm_rsp()
739 switch (se_tmr->response) { in tcm_qla2xxx_queue_tm_rsp()
741 mcmd->fc_tm_rsp = FC_TM_SUCCESS; in tcm_qla2xxx_queue_tm_rsp()
744 mcmd->fc_tm_rsp = FC_TM_BAD_CMD; in tcm_qla2xxx_queue_tm_rsp()
747 mcmd->fc_tm_rsp = FC_TM_REJECT; in tcm_qla2xxx_queue_tm_rsp()
751 mcmd->fc_tm_rsp = FC_TM_FAILED; in tcm_qla2xxx_queue_tm_rsp()
766 if (se_cmd->se_cmd_flags & SCF_SCSI_TMR_CDB) in tcm_qla2xxx_aborted_task()
771 spin_lock_irqsave(&cmd->sess->sess_cmd_lock, flags); in tcm_qla2xxx_aborted_task()
772 list_del_init(&cmd->sess_cmd_list); in tcm_qla2xxx_aborted_task()
773 spin_unlock_irqrestore(&cmd->sess->sess_cmd_lock, flags); in tcm_qla2xxx_aborted_task()
781 * Expected to be called with struct qla_hw_data->tgt.sess_lock held
785 struct se_node_acl *se_nacl = sess->se_sess->se_node_acl; in tcm_qla2xxx_clear_nacl_from_fcport_map()
786 struct se_portal_group *se_tpg = se_nacl->se_tpg; in tcm_qla2xxx_clear_nacl_from_fcport_map()
787 struct se_wwn *se_wwn = se_tpg->se_tpg_wwn; in tcm_qla2xxx_clear_nacl_from_fcport_map()
794 pr_debug("fc_rport domain: port_id 0x%06x\n", nacl->nport_id); in tcm_qla2xxx_clear_nacl_from_fcport_map()
796 node = btree_remove32(&lport->lport_fcport_map, nacl->nport_id); in tcm_qla2xxx_clear_nacl_from_fcport_map()
804 btree_insert32(&lport->lport_fcport_map, nacl->nport_id, in tcm_qla2xxx_clear_nacl_from_fcport_map()
809 se_nacl, nacl->nport_wwnn, nacl->nport_id); in tcm_qla2xxx_clear_nacl_from_fcport_map()
814 * This is done ahead of callbacks into tcm_qla2xxx_free_session() -> in tcm_qla2xxx_clear_nacl_from_fcport_map()
824 target_stop_session(sess->se_sess); in tcm_qla2xxx_shutdown_sess()
835 return -EINVAL; in tcm_qla2xxx_init_nodeacl()
837 nacl->nport_wwnn = wwnn; in tcm_qla2xxx_init_nodeacl()
838 tcm_qla2xxx_format_wwn(&nacl->nport_name[0], TCM_QLA2XXX_NAMELEN, wwnn); in tcm_qla2xxx_init_nodeacl()
854 return sprintf(page, "%d\n", tpg->tpg_attrib.name); \
863 struct tcm_qla2xxx_tpg_attrib *a = &tpg->tpg_attrib; \
871 return -EINVAL; \
876 return -EINVAL; \
879 a->name = val; \
911 struct se_wwn *se_wwn = se_tpg->se_tpg_wwn; in tcm_qla2xxx_enable_tpg()
914 struct scsi_qla_host *vha = lport->qla_vha; in tcm_qla2xxx_enable_tpg()
919 if (atomic_read(&tpg->lport_tpg_enabled)) in tcm_qla2xxx_enable_tpg()
920 return -EEXIST; in tcm_qla2xxx_enable_tpg()
922 atomic_set(&tpg->lport_tpg_enabled, 1); in tcm_qla2xxx_enable_tpg()
925 if (!atomic_read(&tpg->lport_tpg_enabled)) in tcm_qla2xxx_enable_tpg()
928 atomic_set(&tpg->lport_tpg_enabled, 0); in tcm_qla2xxx_enable_tpg()
929 qlt_stop_phase1(vha->vha_tgt.qla_tgt); in tcm_qla2xxx_enable_tpg()
930 qlt_stop_phase2(vha->vha_tgt.qla_tgt); in tcm_qla2xxx_enable_tpg()
957 return -EINVAL; in tcm_qla2xxx_tpg_fabric_prot_type_store()
959 tpg->tpg_attrib.fabric_prot_type = val; in tcm_qla2xxx_tpg_fabric_prot_type_store()
971 return sprintf(page, "%d\n", tpg->tpg_attrib.fabric_prot_type); in tcm_qla2xxx_tpg_fabric_prot_type_show()
993 return ERR_PTR(-EINVAL); in tcm_qla2xxx_make_tpg()
995 return ERR_PTR(-EINVAL); in tcm_qla2xxx_make_tpg()
999 return ERR_PTR(-ENOSYS); in tcm_qla2xxx_make_tpg()
1005 return ERR_PTR(-ENOMEM); in tcm_qla2xxx_make_tpg()
1007 tpg->lport = lport; in tcm_qla2xxx_make_tpg()
1008 tpg->lport_tpgt = tpgt; in tcm_qla2xxx_make_tpg()
1010 * By default allow READ-ONLY TPG demo-mode access w/ cached dynamic in tcm_qla2xxx_make_tpg()
1013 tpg->tpg_attrib.generate_node_acls = 1; in tcm_qla2xxx_make_tpg()
1014 tpg->tpg_attrib.demo_mode_write_protect = 1; in tcm_qla2xxx_make_tpg()
1015 tpg->tpg_attrib.cache_dynamic_acls = 1; in tcm_qla2xxx_make_tpg()
1016 tpg->tpg_attrib.demo_mode_login_only = 1; in tcm_qla2xxx_make_tpg()
1017 tpg->tpg_attrib.jam_host = 0; in tcm_qla2xxx_make_tpg()
1019 ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_FCP); in tcm_qla2xxx_make_tpg()
1025 lport->tpg_1 = tpg; in tcm_qla2xxx_make_tpg()
1027 return &tpg->se_tpg; in tcm_qla2xxx_make_tpg()
1034 struct tcm_qla2xxx_lport *lport = tpg->lport; in tcm_qla2xxx_drop_tpg()
1035 struct scsi_qla_host *vha = lport->qla_vha; in tcm_qla2xxx_drop_tpg()
1040 if (vha->vha_tgt.qla_tgt && !vha->vha_tgt.qla_tgt->tgt_stop) in tcm_qla2xxx_drop_tpg()
1041 qlt_stop_phase1(vha->vha_tgt.qla_tgt); in tcm_qla2xxx_drop_tpg()
1047 lport->tpg_1 = NULL; in tcm_qla2xxx_drop_tpg()
1054 struct se_wwn *se_wwn = se_tpg->se_tpg_wwn; in tcm_qla2xxx_npiv_enable_tpg()
1057 struct scsi_qla_host *vha = lport->qla_vha; in tcm_qla2xxx_npiv_enable_tpg()
1062 if (atomic_read(&tpg->lport_tpg_enabled)) in tcm_qla2xxx_npiv_enable_tpg()
1063 return -EEXIST; in tcm_qla2xxx_npiv_enable_tpg()
1065 atomic_set(&tpg->lport_tpg_enabled, 1); in tcm_qla2xxx_npiv_enable_tpg()
1068 if (!atomic_read(&tpg->lport_tpg_enabled)) in tcm_qla2xxx_npiv_enable_tpg()
1071 atomic_set(&tpg->lport_tpg_enabled, 0); in tcm_qla2xxx_npiv_enable_tpg()
1072 qlt_stop_phase1(vha->vha_tgt.qla_tgt); in tcm_qla2xxx_npiv_enable_tpg()
1073 qlt_stop_phase2(vha->vha_tgt.qla_tgt); in tcm_qla2xxx_npiv_enable_tpg()
1089 return ERR_PTR(-EINVAL); in tcm_qla2xxx_npiv_make_tpg()
1091 return ERR_PTR(-EINVAL); in tcm_qla2xxx_npiv_make_tpg()
1096 return ERR_PTR(-ENOMEM); in tcm_qla2xxx_npiv_make_tpg()
1098 tpg->lport = lport; in tcm_qla2xxx_npiv_make_tpg()
1099 tpg->lport_tpgt = tpgt; in tcm_qla2xxx_npiv_make_tpg()
1102 * By default allow READ-ONLY TPG demo-mode access w/ cached dynamic in tcm_qla2xxx_npiv_make_tpg()
1105 tpg->tpg_attrib.generate_node_acls = 1; in tcm_qla2xxx_npiv_make_tpg()
1106 tpg->tpg_attrib.demo_mode_write_protect = 1; in tcm_qla2xxx_npiv_make_tpg()
1107 tpg->tpg_attrib.cache_dynamic_acls = 1; in tcm_qla2xxx_npiv_make_tpg()
1108 tpg->tpg_attrib.demo_mode_login_only = 1; in tcm_qla2xxx_npiv_make_tpg()
1110 ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_FCP); in tcm_qla2xxx_npiv_make_tpg()
1115 lport->tpg_1 = tpg; in tcm_qla2xxx_npiv_make_tpg()
1116 return &tpg->se_tpg; in tcm_qla2xxx_npiv_make_tpg()
1120 * Expected to be called with struct qla_hw_data->tgt.sess_lock held
1130 lport = vha->vha_tgt.target_lport_ptr; in tcm_qla2xxx_find_sess_by_s_id()
1140 se_nacl = btree_lookup32(&lport->lport_fcport_map, key); in tcm_qla2xxx_find_sess_by_s_id()
1146 se_nacl, se_nacl->initiatorname); in tcm_qla2xxx_find_sess_by_s_id()
1149 if (!nacl->fc_port) { in tcm_qla2xxx_find_sess_by_s_id()
1154 return nacl->fc_port; in tcm_qla2xxx_find_sess_by_s_id()
1158 * Expected to be called with struct qla_hw_data->tgt.sess_lock held
1175 slot = btree_lookup32(&lport->lport_fcport_map, key); in tcm_qla2xxx_set_sess_by_s_id()
1179 nacl->nport_id = key; in tcm_qla2xxx_set_sess_by_s_id()
1180 rc = btree_insert32(&lport->lport_fcport_map, key, in tcm_qla2xxx_set_sess_by_s_id()
1189 fc_port->se_sess = se_sess; in tcm_qla2xxx_set_sess_by_s_id()
1190 nacl->fc_port = fc_port; in tcm_qla2xxx_set_sess_by_s_id()
1194 if (nacl->fc_port) { in tcm_qla2xxx_set_sess_by_s_id()
1196 pr_debug("Clearing existing nacl->fc_port and fc_port entry\n"); in tcm_qla2xxx_set_sess_by_s_id()
1197 btree_remove32(&lport->lport_fcport_map, key); in tcm_qla2xxx_set_sess_by_s_id()
1198 nacl->fc_port = NULL; in tcm_qla2xxx_set_sess_by_s_id()
1201 pr_debug("Replacing existing nacl->fc_port and fc_port entry\n"); in tcm_qla2xxx_set_sess_by_s_id()
1202 btree_update32(&lport->lport_fcport_map, key, new_se_nacl); in tcm_qla2xxx_set_sess_by_s_id()
1203 fc_port->se_sess = se_sess; in tcm_qla2xxx_set_sess_by_s_id()
1204 nacl->fc_port = fc_port; in tcm_qla2xxx_set_sess_by_s_id()
1210 btree_remove32(&lport->lport_fcport_map, key); in tcm_qla2xxx_set_sess_by_s_id()
1214 pr_debug("Replacing existing fc_port entry w/o active nacl->fc_port\n"); in tcm_qla2xxx_set_sess_by_s_id()
1215 btree_update32(&lport->lport_fcport_map, key, new_se_nacl); in tcm_qla2xxx_set_sess_by_s_id()
1216 fc_port->se_sess = se_sess; in tcm_qla2xxx_set_sess_by_s_id()
1217 nacl->fc_port = fc_port; in tcm_qla2xxx_set_sess_by_s_id()
1219 pr_debug("Setup nacl->fc_port %p by s_id for se_nacl: %p, initiatorname: %s\n", in tcm_qla2xxx_set_sess_by_s_id()
1220 nacl->fc_port, new_se_nacl, new_se_nacl->initiatorname); in tcm_qla2xxx_set_sess_by_s_id()
1224 * Expected to be called with struct qla_hw_data->tgt.sess_lock held
1235 lport = vha->vha_tgt.target_lport_ptr; in tcm_qla2xxx_find_sess_by_loop_id()
1244 fc_loopid = lport->lport_loopid_map + loop_id; in tcm_qla2xxx_find_sess_by_loop_id()
1245 se_nacl = fc_loopid->se_nacl; in tcm_qla2xxx_find_sess_by_loop_id()
1254 if (!nacl->fc_port) { in tcm_qla2xxx_find_sess_by_loop_id()
1259 return nacl->fc_port; in tcm_qla2xxx_find_sess_by_loop_id()
1263 * Expected to be called with struct qla_hw_data->tgt.sess_lock held
1279 lport->lport_loopid_map)[loop_id]; in tcm_qla2xxx_set_sess_by_loop_id()
1281 saved_nacl = fc_loopid->se_nacl; in tcm_qla2xxx_set_sess_by_loop_id()
1283 pr_debug("Setting up new fc_loopid->se_nacl to new_se_nacl\n"); in tcm_qla2xxx_set_sess_by_loop_id()
1284 fc_loopid->se_nacl = new_se_nacl; in tcm_qla2xxx_set_sess_by_loop_id()
1285 if (fc_port->se_sess != se_sess) in tcm_qla2xxx_set_sess_by_loop_id()
1286 fc_port->se_sess = se_sess; in tcm_qla2xxx_set_sess_by_loop_id()
1287 if (nacl->fc_port != fc_port) in tcm_qla2xxx_set_sess_by_loop_id()
1288 nacl->fc_port = fc_port; in tcm_qla2xxx_set_sess_by_loop_id()
1292 if (nacl->fc_port) { in tcm_qla2xxx_set_sess_by_loop_id()
1294 pr_debug("Clearing nacl->fc_port and fc_loopid->se_nacl\n"); in tcm_qla2xxx_set_sess_by_loop_id()
1295 fc_loopid->se_nacl = NULL; in tcm_qla2xxx_set_sess_by_loop_id()
1296 nacl->fc_port = NULL; in tcm_qla2xxx_set_sess_by_loop_id()
1300 pr_debug("Replacing existing nacl->fc_port and fc_loopid->se_nacl\n"); in tcm_qla2xxx_set_sess_by_loop_id()
1301 fc_loopid->se_nacl = new_se_nacl; in tcm_qla2xxx_set_sess_by_loop_id()
1302 if (fc_port->se_sess != se_sess) in tcm_qla2xxx_set_sess_by_loop_id()
1303 fc_port->se_sess = se_sess; in tcm_qla2xxx_set_sess_by_loop_id()
1304 if (nacl->fc_port != fc_port) in tcm_qla2xxx_set_sess_by_loop_id()
1305 nacl->fc_port = fc_port; in tcm_qla2xxx_set_sess_by_loop_id()
1310 pr_debug("Clearing fc_loopid->se_nacl\n"); in tcm_qla2xxx_set_sess_by_loop_id()
1311 fc_loopid->se_nacl = NULL; in tcm_qla2xxx_set_sess_by_loop_id()
1315 pr_debug("Replacing existing fc_loopid->se_nacl w/o active nacl->fc_port\n"); in tcm_qla2xxx_set_sess_by_loop_id()
1316 fc_loopid->se_nacl = new_se_nacl; in tcm_qla2xxx_set_sess_by_loop_id()
1317 if (fc_port->se_sess != se_sess) in tcm_qla2xxx_set_sess_by_loop_id()
1318 fc_port->se_sess = se_sess; in tcm_qla2xxx_set_sess_by_loop_id()
1319 if (nacl->fc_port != fc_port) in tcm_qla2xxx_set_sess_by_loop_id()
1320 nacl->fc_port = fc_port; in tcm_qla2xxx_set_sess_by_loop_id()
1322 pr_debug("Setup nacl->fc_port %p by loop_id for se_nacl: %p, initiatorname: %s\n", in tcm_qla2xxx_set_sess_by_loop_id()
1323 nacl->fc_port, new_se_nacl, new_se_nacl->initiatorname); in tcm_qla2xxx_set_sess_by_loop_id()
1327 * Should always be called with qla_hw_data->tgt.sess_lock held.
1332 struct se_session *se_sess = sess->se_sess; in tcm_qla2xxx_clear_sess_lookup()
1335 sess, port_id_to_be_id(sess->d_id)); in tcm_qla2xxx_clear_sess_lookup()
1337 sess, sess->loop_id); in tcm_qla2xxx_clear_sess_lookup()
1342 struct qla_tgt *tgt = sess->tgt; in tcm_qla2xxx_free_session()
1343 struct qla_hw_data *ha = tgt->ha; in tcm_qla2xxx_free_session()
1344 scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); in tcm_qla2xxx_free_session()
1348 se_sess = sess->se_sess; in tcm_qla2xxx_free_session()
1350 pr_err("struct fc_port->se_sess is NULL\n"); in tcm_qla2xxx_free_session()
1355 lport = vha->vha_tgt.target_lport_ptr; in tcm_qla2xxx_free_session()
1371 struct tcm_qla2xxx_lport *lport = tpg->lport; in tcm_qla2xxx_session_cb()
1372 struct qla_hw_data *ha = lport->qla_vha->hw; in tcm_qla2xxx_session_cb()
1373 struct se_node_acl *se_nacl = se_sess->se_node_acl; in tcm_qla2xxx_session_cb()
1377 uint16_t loop_id = qlat_sess->loop_id; in tcm_qla2xxx_session_cb()
1384 spin_lock_irqsave(&ha->tgt.sess_lock, flags); in tcm_qla2xxx_session_cb()
1386 port_id_to_be_id(qlat_sess->d_id)); in tcm_qla2xxx_session_cb()
1389 spin_unlock_irqrestore(&ha->tgt.sess_lock, flags); in tcm_qla2xxx_session_cb()
1395 * Called via qlt_create_sess():ha->qla2x_tmpl->check_initiator_node_acl()
1403 struct qla_hw_data *ha = vha->hw; in tcm_qla2xxx_check_initiator_node_acl()
1408 int num_tags = (ha->cur_fw_xcb_count) ? ha->cur_fw_xcb_count : in tcm_qla2xxx_check_initiator_node_acl()
1411 lport = vha->vha_tgt.target_lport_ptr; in tcm_qla2xxx_check_initiator_node_acl()
1415 return -EINVAL; in tcm_qla2xxx_check_initiator_node_acl()
1420 tpg = lport->tpg_1; in tcm_qla2xxx_check_initiator_node_acl()
1422 pr_err("Unable to locate struct tcm_qla2xxx_lport->tpg_1\n"); in tcm_qla2xxx_check_initiator_node_acl()
1423 return -EINVAL; in tcm_qla2xxx_check_initiator_node_acl()
1435 se_sess = target_setup_session(&tpg->se_tpg, num_tags, in tcm_qla2xxx_check_initiator_node_acl()
1448 struct qla_tgt *tgt = sess->tgt; in tcm_qla2xxx_update_sess()
1449 struct qla_hw_data *ha = tgt->ha; in tcm_qla2xxx_update_sess()
1450 scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); in tcm_qla2xxx_update_sess()
1451 struct tcm_qla2xxx_lport *lport = vha->vha_tgt.target_lport_ptr; in tcm_qla2xxx_update_sess()
1452 struct se_node_acl *se_nacl = sess->se_sess->se_node_acl; in tcm_qla2xxx_update_sess()
1458 if (sess->loop_id != loop_id || sess->d_id.b24 != s_id.b24) in tcm_qla2xxx_update_sess()
1459 pr_info("Updating session %p from port %8phC loop_id %d -> %d s_id %x:%x:%x -> %x:%x:%x\n", in tcm_qla2xxx_update_sess()
1460 sess, sess->port_name, in tcm_qla2xxx_update_sess()
1461 sess->loop_id, loop_id, sess->d_id.b.domain, in tcm_qla2xxx_update_sess()
1462 sess->d_id.b.area, sess->d_id.b.al_pa, s_id.b.domain, in tcm_qla2xxx_update_sess()
1465 if (sess->loop_id != loop_id) { in tcm_qla2xxx_update_sess()
1468 * update different sessions non-atomically, we might in tcm_qla2xxx_update_sess()
1474 if (lport->lport_loopid_map[sess->loop_id].se_nacl == se_nacl) in tcm_qla2xxx_update_sess()
1475 lport->lport_loopid_map[sess->loop_id].se_nacl = NULL; in tcm_qla2xxx_update_sess()
1477 lport->lport_loopid_map[loop_id].se_nacl = se_nacl; in tcm_qla2xxx_update_sess()
1479 sess->loop_id = loop_id; in tcm_qla2xxx_update_sess()
1482 if (sess->d_id.b24 != s_id.b24) { in tcm_qla2xxx_update_sess()
1483 key = (((u32) sess->d_id.b.domain << 16) | in tcm_qla2xxx_update_sess()
1484 ((u32) sess->d_id.b.area << 8) | in tcm_qla2xxx_update_sess()
1485 ((u32) sess->d_id.b.al_pa)); in tcm_qla2xxx_update_sess()
1487 if (btree_lookup32(&lport->lport_fcport_map, key)) in tcm_qla2xxx_update_sess()
1488 WARN(btree_remove32(&lport->lport_fcport_map, key) != in tcm_qla2xxx_update_sess()
1490 sess->d_id.b.domain, sess->d_id.b.area, in tcm_qla2xxx_update_sess()
1491 sess->d_id.b.al_pa); in tcm_qla2xxx_update_sess()
1494 sess->d_id.b.domain, sess->d_id.b.area, in tcm_qla2xxx_update_sess()
1495 sess->d_id.b.al_pa); in tcm_qla2xxx_update_sess()
1501 if (btree_lookup32(&lport->lport_fcport_map, key)) { in tcm_qla2xxx_update_sess()
1504 btree_update32(&lport->lport_fcport_map, key, se_nacl); in tcm_qla2xxx_update_sess()
1506 btree_insert32(&lport->lport_fcport_map, key, se_nacl, in tcm_qla2xxx_update_sess()
1510 sess->d_id = s_id; in tcm_qla2xxx_update_sess()
1511 nacl->nport_id = key; in tcm_qla2xxx_update_sess()
1514 sess->conf_compl_supported = conf_compl_supported; in tcm_qla2xxx_update_sess()
1547 rc = btree_init32(&lport->lport_fcport_map); in tcm_qla2xxx_init_lport()
1549 pr_err("Unable to initialize lport->lport_fcport_map btree\n"); in tcm_qla2xxx_init_lport()
1555 lport->lport_loopid_map = vzalloc(map_sz); in tcm_qla2xxx_init_lport()
1556 if (!lport->lport_loopid_map) { in tcm_qla2xxx_init_lport()
1557 pr_err("Unable to allocate lport->lport_loopid_map of %zu bytes\n", map_sz); in tcm_qla2xxx_init_lport()
1558 btree_destroy32(&lport->lport_fcport_map); in tcm_qla2xxx_init_lport()
1559 return -ENOMEM; in tcm_qla2xxx_init_lport()
1569 struct qla_hw_data *ha = vha->hw; in tcm_qla2xxx_lport_register_cb()
1575 ha->tgt.tgt_ops = &tcm_qla2xxx_template; in tcm_qla2xxx_lport_register_cb()
1576 vha->vha_tgt.target_lport_ptr = target_lport_ptr; in tcm_qla2xxx_lport_register_cb()
1577 lport->qla_vha = vha; in tcm_qla2xxx_lport_register_cb()
1589 int ret = -ENODEV; in tcm_qla2xxx_make_lport()
1592 return ERR_PTR(-EINVAL); in tcm_qla2xxx_make_lport()
1597 return ERR_PTR(-ENOMEM); in tcm_qla2xxx_make_lport()
1599 lport->lport_wwpn = wwpn; in tcm_qla2xxx_make_lport()
1600 tcm_qla2xxx_format_wwn(&lport->lport_name[0], TCM_QLA2XXX_NAMELEN, in tcm_qla2xxx_make_lport()
1602 sprintf(lport->lport_naa_name, "naa.%016llx", (unsigned long long) wwpn); in tcm_qla2xxx_make_lport()
1613 return &lport->lport_wwn; in tcm_qla2xxx_make_lport()
1615 vfree(lport->lport_loopid_map); in tcm_qla2xxx_make_lport()
1616 btree_destroy32(&lport->lport_fcport_map); in tcm_qla2xxx_make_lport()
1626 struct scsi_qla_host *vha = lport->qla_vha; in tcm_qla2xxx_drop_lport()
1635 if (vha->vha_tgt.qla_tgt && !vha->vha_tgt.qla_tgt->tgt_stopped) in tcm_qla2xxx_drop_lport()
1636 qlt_stop_phase2(vha->vha_tgt.qla_tgt); in tcm_qla2xxx_drop_lport()
1640 vfree(lport->lport_loopid_map); in tcm_qla2xxx_drop_lport()
1641 btree_for_each_safe32(&lport->lport_fcport_map, key, node) in tcm_qla2xxx_drop_lport()
1642 btree_remove32(&lport->lport_fcport_map, key); in tcm_qla2xxx_drop_lport()
1643 btree_destroy32(&lport->lport_fcport_map); in tcm_qla2xxx_drop_lport()
1652 struct Scsi_Host *sh = base_vha->host; in tcm_qla2xxx_lport_register_npiv_cb()
1657 (struct tcm_qla2xxx_lport *)base_vha->vha_tgt.target_lport_ptr; in tcm_qla2xxx_lport_register_npiv_cb()
1662 return -EPERM; in tcm_qla2xxx_lport_register_npiv_cb()
1665 if (!base_lport || !base_lport->tpg_1 || in tcm_qla2xxx_lport_register_npiv_cb()
1666 !atomic_read(&base_lport->tpg_1->lport_tpg_enabled)) { in tcm_qla2xxx_lport_register_npiv_cb()
1668 return -EPERM; in tcm_qla2xxx_lport_register_npiv_cb()
1681 return -ENODEV; in tcm_qla2xxx_lport_register_npiv_cb()
1686 npiv_vha = (struct scsi_qla_host *)vport->dd_data; in tcm_qla2xxx_lport_register_npiv_cb()
1687 npiv_vha->vha_tgt.target_lport_ptr = target_lport_ptr; in tcm_qla2xxx_lport_register_npiv_cb()
1688 lport->qla_vha = npiv_vha; in tcm_qla2xxx_lport_register_npiv_cb()
1689 scsi_host_get(npiv_vha->host); in tcm_qla2xxx_lport_register_npiv_cb()
1709 return ERR_PTR(-EINVAL); in tcm_qla2xxx_npiv_make_lport()
1714 return ERR_PTR(-EINVAL); in tcm_qla2xxx_npiv_make_lport()
1718 return ERR_PTR(-EINVAL); in tcm_qla2xxx_npiv_make_lport()
1723 return ERR_PTR(-ENOMEM); in tcm_qla2xxx_npiv_make_lport()
1725 lport->lport_npiv_wwpn = npiv_wwpn; in tcm_qla2xxx_npiv_make_lport()
1726 lport->lport_npiv_wwnn = npiv_wwnn; in tcm_qla2xxx_npiv_make_lport()
1727 sprintf(lport->lport_naa_name, "naa.%016llx", (unsigned long long) npiv_wwpn); in tcm_qla2xxx_npiv_make_lport()
1738 return &lport->lport_wwn; in tcm_qla2xxx_npiv_make_lport()
1740 vfree(lport->lport_loopid_map); in tcm_qla2xxx_npiv_make_lport()
1741 btree_destroy32(&lport->lport_fcport_map); in tcm_qla2xxx_npiv_make_lport()
1751 struct scsi_qla_host *npiv_vha = lport->qla_vha; in tcm_qla2xxx_npiv_drop_lport()
1752 struct qla_hw_data *ha = npiv_vha->hw; in tcm_qla2xxx_npiv_drop_lport()
1753 scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev); in tcm_qla2xxx_npiv_drop_lport()
1755 scsi_host_put(npiv_vha->host); in tcm_qla2xxx_npiv_drop_lport()
1757 * Notify libfc that we want to release the vha->fc_vport in tcm_qla2xxx_npiv_drop_lport()
1759 fc_vport_terminate(npiv_vha->fc_vport); in tcm_qla2xxx_npiv_drop_lport()
1760 scsi_host_put(base_vha->host); in tcm_qla2xxx_npiv_drop_lport()
1770 QLA2XXX_VERSION, utsname()->sysname, in tcm_qla2xxx_wwn_version_show()
1771 utsname()->machine, utsname()->release); in tcm_qla2xxx_wwn_version_show()
1786 * XXX: Limit assumes single page per scatter-gather-list entry.
1787 * Current maximum is ~4.9 MB per se_cmd->t_data_sg with PAGE_SIZE=4096
1875 QLA2XXX_VERSION, utsname()->sysname, in tcm_qla2xxx_register_configfs()
1876 utsname()->machine, utsname()->release); in tcm_qla2xxx_register_configfs()
1889 ret = -ENOMEM; in tcm_qla2xxx_register_configfs()