Lines Matching +full:scan +full:- +full:count

1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright (c) 2003-2014 QLogic Corporation
24 * qla2x00_prep_ms_iocb() - Prepare common MS/CT IOCB fields for SNS CT query.
33 struct qla_hw_data *ha = vha->hw; in qla2x00_prep_ms_iocb()
36 ms_pkt = (ms_iocb_entry_t *)arg->iocb; in qla2x00_prep_ms_iocb()
39 ms_pkt->entry_type = MS_IOCB_TYPE; in qla2x00_prep_ms_iocb()
40 ms_pkt->entry_count = 1; in qla2x00_prep_ms_iocb()
41 SET_TARGET_ID(ha, ms_pkt->loop_id, SIMPLE_NAME_SERVER); in qla2x00_prep_ms_iocb()
42 ms_pkt->control_flags = cpu_to_le16(CF_READ | CF_HEAD_TAG); in qla2x00_prep_ms_iocb()
43 ms_pkt->timeout = cpu_to_le16(ha->r_a_tov / 10 * 2); in qla2x00_prep_ms_iocb()
44 ms_pkt->cmd_dsd_count = cpu_to_le16(1); in qla2x00_prep_ms_iocb()
45 ms_pkt->total_dsd_count = cpu_to_le16(2); in qla2x00_prep_ms_iocb()
46 ms_pkt->rsp_bytecount = cpu_to_le32(arg->rsp_size); in qla2x00_prep_ms_iocb()
47 ms_pkt->req_bytecount = cpu_to_le32(arg->req_size); in qla2x00_prep_ms_iocb()
49 put_unaligned_le64(arg->req_dma, &ms_pkt->req_dsd.address); in qla2x00_prep_ms_iocb()
50 ms_pkt->req_dsd.length = ms_pkt->req_bytecount; in qla2x00_prep_ms_iocb()
52 put_unaligned_le64(arg->rsp_dma, &ms_pkt->rsp_dsd.address); in qla2x00_prep_ms_iocb()
53 ms_pkt->rsp_dsd.length = ms_pkt->rsp_bytecount; in qla2x00_prep_ms_iocb()
55 vha->qla_stats.control_requests++; in qla2x00_prep_ms_iocb()
61 * qla24xx_prep_ms_iocb() - Prepare common CT IOCB fields for SNS CT query.
70 struct qla_hw_data *ha = vha->hw; in qla24xx_prep_ms_iocb()
73 ct_pkt = (struct ct_entry_24xx *)arg->iocb; in qla24xx_prep_ms_iocb()
76 ct_pkt->entry_type = CT_IOCB_TYPE; in qla24xx_prep_ms_iocb()
77 ct_pkt->entry_count = 1; in qla24xx_prep_ms_iocb()
78 ct_pkt->nport_handle = cpu_to_le16(arg->nport_handle); in qla24xx_prep_ms_iocb()
79 ct_pkt->timeout = cpu_to_le16(ha->r_a_tov / 10 * 2); in qla24xx_prep_ms_iocb()
80 ct_pkt->cmd_dsd_count = cpu_to_le16(1); in qla24xx_prep_ms_iocb()
81 ct_pkt->rsp_dsd_count = cpu_to_le16(1); in qla24xx_prep_ms_iocb()
82 ct_pkt->rsp_byte_count = cpu_to_le32(arg->rsp_size); in qla24xx_prep_ms_iocb()
83 ct_pkt->cmd_byte_count = cpu_to_le32(arg->req_size); in qla24xx_prep_ms_iocb()
85 put_unaligned_le64(arg->req_dma, &ct_pkt->dsd[0].address); in qla24xx_prep_ms_iocb()
86 ct_pkt->dsd[0].length = ct_pkt->cmd_byte_count; in qla24xx_prep_ms_iocb()
88 put_unaligned_le64(arg->rsp_dma, &ct_pkt->dsd[1].address); in qla24xx_prep_ms_iocb()
89 ct_pkt->dsd[1].length = ct_pkt->rsp_byte_count; in qla24xx_prep_ms_iocb()
90 ct_pkt->vp_index = vha->vp_idx; in qla24xx_prep_ms_iocb()
92 vha->qla_stats.control_requests++; in qla24xx_prep_ms_iocb()
98 * qla2x00_prep_ct_req() - Prepare common CT request fields for SNS query.
110 p->p.req.header.revision = 0x01; in qla2x00_prep_ct_req()
111 p->p.req.header.gs_type = 0xFC; in qla2x00_prep_ct_req()
112 p->p.req.header.gs_subtype = 0x02; in qla2x00_prep_ct_req()
113 p->p.req.command = cpu_to_be16(cmd); in qla2x00_prep_ct_req()
114 p->p.req.max_rsp_size = cpu_to_be16((rsp_size - 16) / 4); in qla2x00_prep_ct_req()
116 return &p->p.req; in qla2x00_prep_ct_req()
125 struct qla_hw_data *ha = vha->hw; in qla2x00_chk_ms_status()
129 if (ms_pkt->entry_status != 0) { in qla2x00_chk_ms_status()
132 routine, ms_pkt->entry_status, vha->d_id.b.domain, in qla2x00_chk_ms_status()
133 vha->d_id.b.area, vha->d_id.b.al_pa); in qla2x00_chk_ms_status()
137 ((struct ct_entry_24xx *)ms_pkt)->comp_status); in qla2x00_chk_ms_status()
139 comp_status = le16_to_cpu(ms_pkt->status); in qla2x00_chk_ms_status()
144 if (ct_rsp->header.response != in qla2x00_chk_ms_status()
148 routine, vha->d_id.b.domain, in qla2x00_chk_ms_status()
149 vha->d_id.b.area, vha->d_id.b.al_pa, in qla2x00_chk_ms_status()
150 comp_status, ct_rsp->header.response); in qla2x00_chk_ms_status()
160 if (le16_to_cpu(ms_pkt->loop_id.extended) == in qla2x00_chk_ms_status()
164 if (le16_to_cpu(ms_pkt->loop_id.extended) == in qla2x00_chk_ms_status()
173 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); in qla2x00_chk_ms_status()
174 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); in qla2x00_chk_ms_status()
184 vha->d_id.b.domain, vha->d_id.b.area, in qla2x00_chk_ms_status()
185 vha->d_id.b.al_pa); in qla2x00_chk_ms_status()
193 * qla2x00_ga_nxt() - SNS scan for fabric devices via GA_NXT command.
207 struct qla_hw_data *ha = vha->hw; in qla2x00_ga_nxt()
213 arg.iocb = ha->ms_iocb; in qla2x00_ga_nxt()
214 arg.req_dma = ha->ct_sns_dma; in qla2x00_ga_nxt()
215 arg.rsp_dma = ha->ct_sns_dma; in qla2x00_ga_nxt()
222 ms_pkt = ha->isp_ops->prep_ms_iocb(vha, &arg); in qla2x00_ga_nxt()
225 ct_req = qla2x00_prep_ct_req(ha->ct_sns, GA_NXT_CMD, in qla2x00_ga_nxt()
227 ct_rsp = &ha->ct_sns->p.rsp; in qla2x00_ga_nxt()
229 /* Prepare CT arguments -- port_id */ in qla2x00_ga_nxt()
230 ct_req->req.port_id.port_id = port_id_to_be_id(fcport->d_id); in qla2x00_ga_nxt()
233 rval = qla2x00_issue_iocb(vha, ha->ms_iocb, ha->ms_iocb_dma, in qla2x00_ga_nxt()
244 fcport->d_id = be_to_port_id(ct_rsp->rsp.ga_nxt.port_id); in qla2x00_ga_nxt()
246 memcpy(fcport->node_name, ct_rsp->rsp.ga_nxt.node_name, in qla2x00_ga_nxt()
248 memcpy(fcport->port_name, ct_rsp->rsp.ga_nxt.port_name, in qla2x00_ga_nxt()
251 fcport->fc4_type = (ct_rsp->rsp.ga_nxt.fc4_types[2] & BIT_0) ? in qla2x00_ga_nxt()
254 if (ct_rsp->rsp.ga_nxt.port_type != NS_N_PORT_TYPE && in qla2x00_ga_nxt()
255 ct_rsp->rsp.ga_nxt.port_type != NS_NL_PORT_TYPE) in qla2x00_ga_nxt()
256 fcport->d_id.b.domain = 0xf0; in qla2x00_ga_nxt()
259 "GA_NXT entry - nn %8phN pn %8phN " in qla2x00_ga_nxt()
261 fcport->node_name, fcport->port_name, in qla2x00_ga_nxt()
262 fcport->d_id.b.domain, fcport->d_id.b.area, in qla2x00_ga_nxt()
263 fcport->d_id.b.al_pa); in qla2x00_ga_nxt()
272 return vha->hw->max_fibre_devices * 4 + 16; in qla2x00_gid_pt_rsp_size()
276 * qla2x00_gid_pt() - SNS scan for fabric devices via GID_PT command.
280 * NOTE: Non-Nx_Ports are not requested.
295 struct qla_hw_data *ha = vha->hw; in qla2x00_gid_pt()
305 arg.iocb = ha->ms_iocb; in qla2x00_gid_pt()
306 arg.req_dma = ha->ct_sns_dma; in qla2x00_gid_pt()
307 arg.rsp_dma = ha->ct_sns_dma; in qla2x00_gid_pt()
314 ms_pkt = ha->isp_ops->prep_ms_iocb(vha, &arg); in qla2x00_gid_pt()
317 ct_req = qla2x00_prep_ct_req(ha->ct_sns, GID_PT_CMD, gid_pt_rsp_size); in qla2x00_gid_pt()
318 ct_rsp = &ha->ct_sns->p.rsp; in qla2x00_gid_pt()
320 /* Prepare CT arguments -- port_type */ in qla2x00_gid_pt()
321 ct_req->req.gid_pt.port_type = NS_NX_PORT_TYPE; in qla2x00_gid_pt()
324 rval = qla2x00_issue_iocb(vha, ha->ms_iocb, ha->ms_iocb_dma, in qla2x00_gid_pt()
335 for (i = 0; i < ha->max_fibre_devices; i++) { in qla2x00_gid_pt()
336 gid_data = &ct_rsp->rsp.gid_pt.entries[i]; in qla2x00_gid_pt()
337 list[i].d_id = be_to_port_id(gid_data->port_id); in qla2x00_gid_pt()
342 if (gid_data->control_byte & BIT_7) { in qla2x00_gid_pt()
343 list[i].d_id.b.rsvd_1 = gid_data->control_byte; in qla2x00_gid_pt()
354 if (i == ha->max_fibre_devices) in qla2x00_gid_pt()
362 * qla2x00_gpn_id() - SNS Get Port Name (GPN_ID) query.
377 struct qla_hw_data *ha = vha->hw; in qla2x00_gpn_id()
383 arg.iocb = ha->ms_iocb; in qla2x00_gpn_id()
384 arg.req_dma = ha->ct_sns_dma; in qla2x00_gpn_id()
385 arg.rsp_dma = ha->ct_sns_dma; in qla2x00_gpn_id()
390 for (i = 0; i < ha->max_fibre_devices; i++) { in qla2x00_gpn_id()
393 ms_pkt = ha->isp_ops->prep_ms_iocb(vha, &arg); in qla2x00_gpn_id()
396 ct_req = qla2x00_prep_ct_req(ha->ct_sns, GPN_ID_CMD, in qla2x00_gpn_id()
398 ct_rsp = &ha->ct_sns->p.rsp; in qla2x00_gpn_id()
400 /* Prepare CT arguments -- port_id */ in qla2x00_gpn_id()
401 ct_req->req.port_id.port_id = port_id_to_be_id(list[i].d_id); in qla2x00_gpn_id()
404 rval = qla2x00_issue_iocb(vha, ha->ms_iocb, ha->ms_iocb_dma, in qla2x00_gpn_id()
418 ct_rsp->rsp.gpn_id.port_name, WWN_SIZE); in qla2x00_gpn_id()
430 * qla2x00_gnn_id() - SNS Get Node Name (GNN_ID) query.
441 struct qla_hw_data *ha = vha->hw; in qla2x00_gnn_id()
450 arg.iocb = ha->ms_iocb; in qla2x00_gnn_id()
451 arg.req_dma = ha->ct_sns_dma; in qla2x00_gnn_id()
452 arg.rsp_dma = ha->ct_sns_dma; in qla2x00_gnn_id()
457 for (i = 0; i < ha->max_fibre_devices; i++) { in qla2x00_gnn_id()
460 ms_pkt = ha->isp_ops->prep_ms_iocb(vha, &arg); in qla2x00_gnn_id()
463 ct_req = qla2x00_prep_ct_req(ha->ct_sns, GNN_ID_CMD, in qla2x00_gnn_id()
465 ct_rsp = &ha->ct_sns->p.rsp; in qla2x00_gnn_id()
467 /* Prepare CT arguments -- port_id */ in qla2x00_gnn_id()
468 ct_req->req.port_id.port_id = port_id_to_be_id(list[i].d_id); in qla2x00_gnn_id()
471 rval = qla2x00_issue_iocb(vha, ha->ms_iocb, ha->ms_iocb_dma, in qla2x00_gnn_id()
485 ct_rsp->rsp.gnn_id.node_name, WWN_SIZE); in qla2x00_gnn_id()
488 "GID_PT entry - nn %8phN pn %8phN " in qla2x00_gnn_id()
505 struct scsi_qla_host *vha = sp->vha; in qla2x00_async_sns_sp_done()
509 sp->rc = rc; in qla2x00_async_sns_sp_done()
512 "Async done-%s exiting normally.\n", in qla2x00_async_sns_sp_done()
513 sp->name); in qla2x00_async_sns_sp_done()
516 "Async done-%s timeout\n", sp->name); in qla2x00_async_sns_sp_done()
518 ct_sns = (struct ct_sns_pkt *)sp->u.iocb_cmd.u.ctarg.rsp; in qla2x00_async_sns_sp_done()
520 sp->retry_count++; in qla2x00_async_sns_sp_done()
521 if (sp->retry_count > 3) in qla2x00_async_sns_sp_done()
525 "Async done-%s fail rc %x. Retry count %d\n", in qla2x00_async_sns_sp_done()
526 sp->name, rc, sp->retry_count); in qla2x00_async_sns_sp_done()
532 e->u.iosb.sp = sp; in qla2x00_async_sns_sp_done()
542 if (sp->u.iocb_cmd.u.ctarg.req) { in qla2x00_async_sns_sp_done()
543 dma_free_coherent(&vha->hw->pdev->dev, in qla2x00_async_sns_sp_done()
544 sp->u.iocb_cmd.u.ctarg.req_allocated_size, in qla2x00_async_sns_sp_done()
545 sp->u.iocb_cmd.u.ctarg.req, in qla2x00_async_sns_sp_done()
546 sp->u.iocb_cmd.u.ctarg.req_dma); in qla2x00_async_sns_sp_done()
547 sp->u.iocb_cmd.u.ctarg.req = NULL; in qla2x00_async_sns_sp_done()
550 if (sp->u.iocb_cmd.u.ctarg.rsp) { in qla2x00_async_sns_sp_done()
551 dma_free_coherent(&vha->hw->pdev->dev, in qla2x00_async_sns_sp_done()
552 sp->u.iocb_cmd.u.ctarg.rsp_allocated_size, in qla2x00_async_sns_sp_done()
553 sp->u.iocb_cmd.u.ctarg.rsp, in qla2x00_async_sns_sp_done()
554 sp->u.iocb_cmd.u.ctarg.rsp_dma); in qla2x00_async_sns_sp_done()
555 sp->u.iocb_cmd.u.ctarg.rsp = NULL; in qla2x00_async_sns_sp_done()
559 kref_put(&sp->cmd_kref, qla2x00_sp_release); in qla2x00_async_sns_sp_done()
563 e->u.iosb.sp = sp; in qla2x00_async_sns_sp_done()
568 * qla2x00_rft_id() - SNS Register FC-4 TYPEs (RFT_ID) supported by the HBA.
576 struct qla_hw_data *ha = vha->hw; in qla2x00_rft_id()
581 return qla_async_rftid(vha, &vha->d_id); in qla2x00_rft_id()
591 if (!vha->flags.online) in qla_async_rftid()
599 sp->type = SRB_CT_PTHRU_CMD; in qla_async_rftid()
600 sp->name = "rft_id"; in qla_async_rftid()
604 sp->u.iocb_cmd.u.ctarg.req = dma_alloc_coherent(&vha->hw->pdev->dev, in qla_async_rftid()
605 sizeof(struct ct_sns_pkt), &sp->u.iocb_cmd.u.ctarg.req_dma, in qla_async_rftid()
607 sp->u.iocb_cmd.u.ctarg.req_allocated_size = sizeof(struct ct_sns_pkt); in qla_async_rftid()
608 if (!sp->u.iocb_cmd.u.ctarg.req) { in qla_async_rftid()
615 sp->u.iocb_cmd.u.ctarg.rsp = dma_alloc_coherent(&vha->hw->pdev->dev, in qla_async_rftid()
616 sizeof(struct ct_sns_pkt), &sp->u.iocb_cmd.u.ctarg.rsp_dma, in qla_async_rftid()
618 sp->u.iocb_cmd.u.ctarg.rsp_allocated_size = sizeof(struct ct_sns_pkt); in qla_async_rftid()
619 if (!sp->u.iocb_cmd.u.ctarg.rsp) { in qla_async_rftid()
625 ct_sns = (struct ct_sns_pkt *)sp->u.iocb_cmd.u.ctarg.rsp; in qla_async_rftid()
627 ct_sns = (struct ct_sns_pkt *)sp->u.iocb_cmd.u.ctarg.req; in qla_async_rftid()
632 /* Prepare CT arguments -- port_id, FC-4 types */ in qla_async_rftid()
633 ct_req->req.rft_id.port_id = port_id_to_be_id(vha->d_id); in qla_async_rftid()
634 ct_req->req.rft_id.fc4_types[2] = 0x01; /* FCP-3 */ in qla_async_rftid()
636 if (vha->flags.nvme_enabled && qla_ini_mode_enabled(vha)) in qla_async_rftid()
637 ct_req->req.rft_id.fc4_types[6] = 1; /* NVMe type 28h */ in qla_async_rftid()
639 sp->u.iocb_cmd.u.ctarg.req_size = RFT_ID_REQ_SIZE; in qla_async_rftid()
640 sp->u.iocb_cmd.u.ctarg.rsp_size = RFT_ID_RSP_SIZE; in qla_async_rftid()
641 sp->u.iocb_cmd.u.ctarg.nport_handle = NPH_SNS; in qla_async_rftid()
644 "Async-%s - hdl=%x portid %06x.\n", in qla_async_rftid()
645 sp->name, sp->handle, d_id->b24); in qla_async_rftid()
656 kref_put(&sp->cmd_kref, qla2x00_sp_release); in qla_async_rftid()
662 * qla2x00_rff_id() - SNS Register FC-4 Features (RFF_ID) supported by the HBA.
671 struct qla_hw_data *ha = vha->hw; in qla2x00_rff_id()
679 return qla_async_rffid(vha, &vha->d_id, qlt_rff_id(vha), type); in qla2x00_rff_id()
695 sp->type = SRB_CT_PTHRU_CMD; in qla_async_rffid()
696 sp->name = "rff_id"; in qla_async_rffid()
700 sp->u.iocb_cmd.u.ctarg.req = dma_alloc_coherent(&vha->hw->pdev->dev, in qla_async_rffid()
701 sizeof(struct ct_sns_pkt), &sp->u.iocb_cmd.u.ctarg.req_dma, in qla_async_rffid()
703 sp->u.iocb_cmd.u.ctarg.req_allocated_size = sizeof(struct ct_sns_pkt); in qla_async_rffid()
704 if (!sp->u.iocb_cmd.u.ctarg.req) { in qla_async_rffid()
711 sp->u.iocb_cmd.u.ctarg.rsp = dma_alloc_coherent(&vha->hw->pdev->dev, in qla_async_rffid()
712 sizeof(struct ct_sns_pkt), &sp->u.iocb_cmd.u.ctarg.rsp_dma, in qla_async_rffid()
714 sp->u.iocb_cmd.u.ctarg.rsp_allocated_size = sizeof(struct ct_sns_pkt); in qla_async_rffid()
715 if (!sp->u.iocb_cmd.u.ctarg.rsp) { in qla_async_rffid()
721 ct_sns = (struct ct_sns_pkt *)sp->u.iocb_cmd.u.ctarg.rsp; in qla_async_rffid()
723 ct_sns = (struct ct_sns_pkt *)sp->u.iocb_cmd.u.ctarg.req; in qla_async_rffid()
728 /* Prepare CT arguments -- port_id, FC-4 feature, FC-4 type */ in qla_async_rffid()
729 ct_req->req.rff_id.port_id = port_id_to_be_id(*d_id); in qla_async_rffid()
730 ct_req->req.rff_id.fc4_feature = fc4feature; in qla_async_rffid()
731 ct_req->req.rff_id.fc4_type = fc4type; /* SCSI-FCP or FC-NVMe */ in qla_async_rffid()
733 sp->u.iocb_cmd.u.ctarg.req_size = RFF_ID_REQ_SIZE; in qla_async_rffid()
734 sp->u.iocb_cmd.u.ctarg.rsp_size = RFF_ID_RSP_SIZE; in qla_async_rffid()
735 sp->u.iocb_cmd.u.ctarg.nport_handle = NPH_SNS; in qla_async_rffid()
738 "Async-%s - hdl=%x portid %06x feature %x type %x.\n", in qla_async_rffid()
739 sp->name, sp->handle, d_id->b24, fc4feature, fc4type); in qla_async_rffid()
752 kref_put(&sp->cmd_kref, qla2x00_sp_release); in qla_async_rffid()
758 * qla2x00_rnn_id() - SNS Register Node Name (RNN_ID) of the HBA.
766 struct qla_hw_data *ha = vha->hw; in qla2x00_rnn_id()
771 return qla_async_rnnid(vha, &vha->d_id, vha->node_name); in qla2x00_rnn_id()
787 sp->type = SRB_CT_PTHRU_CMD; in qla_async_rnnid()
788 sp->name = "rnid"; in qla_async_rnnid()
792 sp->u.iocb_cmd.u.ctarg.req = dma_alloc_coherent(&vha->hw->pdev->dev, in qla_async_rnnid()
793 sizeof(struct ct_sns_pkt), &sp->u.iocb_cmd.u.ctarg.req_dma, in qla_async_rnnid()
795 sp->u.iocb_cmd.u.ctarg.req_allocated_size = sizeof(struct ct_sns_pkt); in qla_async_rnnid()
796 if (!sp->u.iocb_cmd.u.ctarg.req) { in qla_async_rnnid()
803 sp->u.iocb_cmd.u.ctarg.rsp = dma_alloc_coherent(&vha->hw->pdev->dev, in qla_async_rnnid()
804 sizeof(struct ct_sns_pkt), &sp->u.iocb_cmd.u.ctarg.rsp_dma, in qla_async_rnnid()
806 sp->u.iocb_cmd.u.ctarg.rsp_allocated_size = sizeof(struct ct_sns_pkt); in qla_async_rnnid()
807 if (!sp->u.iocb_cmd.u.ctarg.rsp) { in qla_async_rnnid()
813 ct_sns = (struct ct_sns_pkt *)sp->u.iocb_cmd.u.ctarg.rsp; in qla_async_rnnid()
815 ct_sns = (struct ct_sns_pkt *)sp->u.iocb_cmd.u.ctarg.req; in qla_async_rnnid()
820 /* Prepare CT arguments -- port_id, node_name */ in qla_async_rnnid()
821 ct_req->req.rnn_id.port_id = port_id_to_be_id(vha->d_id); in qla_async_rnnid()
822 memcpy(ct_req->req.rnn_id.node_name, vha->node_name, WWN_SIZE); in qla_async_rnnid()
824 sp->u.iocb_cmd.u.ctarg.req_size = RNN_ID_REQ_SIZE; in qla_async_rnnid()
825 sp->u.iocb_cmd.u.ctarg.rsp_size = RNN_ID_RSP_SIZE; in qla_async_rnnid()
826 sp->u.iocb_cmd.u.ctarg.nport_handle = NPH_SNS; in qla_async_rnnid()
829 "Async-%s - hdl=%x portid %06x\n", in qla_async_rnnid()
830 sp->name, sp->handle, d_id->b24); in qla_async_rnnid()
843 kref_put(&sp->cmd_kref, qla2x00_sp_release); in qla_async_rnnid()
851 struct qla_hw_data *ha = vha->hw; in qla2x00_get_sym_node_name()
855 ha->model_number, ha->mr.fw_version, qla2x00_version_str); in qla2x00_get_sym_node_name()
858 ha->model_number, ha->fw_major_version, ha->fw_minor_version, in qla2x00_get_sym_node_name()
859 ha->fw_subminor_version, qla2x00_version_str); in qla2x00_get_sym_node_name()
863 * qla2x00_rsnn_nn() - SNS Register Symbolic Node Name (RSNN_NN) of the HBA.
871 struct qla_hw_data *ha = vha->hw; in qla2x00_rsnn_nn()
894 sp->type = SRB_CT_PTHRU_CMD; in qla_async_rsnn_nn()
895 sp->name = "rsnn_nn"; in qla_async_rsnn_nn()
899 sp->u.iocb_cmd.u.ctarg.req = dma_alloc_coherent(&vha->hw->pdev->dev, in qla_async_rsnn_nn()
900 sizeof(struct ct_sns_pkt), &sp->u.iocb_cmd.u.ctarg.req_dma, in qla_async_rsnn_nn()
902 sp->u.iocb_cmd.u.ctarg.req_allocated_size = sizeof(struct ct_sns_pkt); in qla_async_rsnn_nn()
903 if (!sp->u.iocb_cmd.u.ctarg.req) { in qla_async_rsnn_nn()
910 sp->u.iocb_cmd.u.ctarg.rsp = dma_alloc_coherent(&vha->hw->pdev->dev, in qla_async_rsnn_nn()
911 sizeof(struct ct_sns_pkt), &sp->u.iocb_cmd.u.ctarg.rsp_dma, in qla_async_rsnn_nn()
913 sp->u.iocb_cmd.u.ctarg.rsp_allocated_size = sizeof(struct ct_sns_pkt); in qla_async_rsnn_nn()
914 if (!sp->u.iocb_cmd.u.ctarg.rsp) { in qla_async_rsnn_nn()
920 ct_sns = (struct ct_sns_pkt *)sp->u.iocb_cmd.u.ctarg.rsp; in qla_async_rsnn_nn()
922 ct_sns = (struct ct_sns_pkt *)sp->u.iocb_cmd.u.ctarg.req; in qla_async_rsnn_nn()
927 /* Prepare CT arguments -- node_name, symbolic node_name, size */ in qla_async_rsnn_nn()
928 memcpy(ct_req->req.rsnn_nn.node_name, vha->node_name, WWN_SIZE); in qla_async_rsnn_nn()
931 qla2x00_get_sym_node_name(vha, ct_req->req.rsnn_nn.sym_node_name, in qla_async_rsnn_nn()
932 sizeof(ct_req->req.rsnn_nn.sym_node_name)); in qla_async_rsnn_nn()
933 ct_req->req.rsnn_nn.name_len = in qla_async_rsnn_nn()
934 (uint8_t)strlen(ct_req->req.rsnn_nn.sym_node_name); in qla_async_rsnn_nn()
937 sp->u.iocb_cmd.u.ctarg.req_size = 24 + 1 + ct_req->req.rsnn_nn.name_len; in qla_async_rsnn_nn()
938 sp->u.iocb_cmd.u.ctarg.rsp_size = RSNN_NN_RSP_SIZE; in qla_async_rsnn_nn()
939 sp->u.iocb_cmd.u.ctarg.nport_handle = NPH_SNS; in qla_async_rsnn_nn()
942 "Async-%s - hdl=%x.\n", in qla_async_rsnn_nn()
943 sp->name, sp->handle); in qla_async_rsnn_nn()
956 kref_put(&sp->cmd_kref, qla2x00_sp_release); in qla_async_rsnn_nn()
962 * qla2x00_prep_sns_cmd() - Prepare common SNS command request fields for query.
976 struct qla_hw_data *ha = vha->hw; in qla2x00_prep_sns_cmd()
978 sns_cmd = ha->sns_cmd; in qla2x00_prep_sns_cmd()
981 sns_cmd->p.cmd.buffer_length = cpu_to_le16(wc); in qla2x00_prep_sns_cmd()
982 put_unaligned_le64(ha->sns_cmd_dma, &sns_cmd->p.cmd.buffer_address); in qla2x00_prep_sns_cmd()
983 sns_cmd->p.cmd.subcommand_length = cpu_to_le16(scmd_len); in qla2x00_prep_sns_cmd()
984 sns_cmd->p.cmd.subcommand = cpu_to_le16(cmd); in qla2x00_prep_sns_cmd()
985 wc = (data_size - 16) / 4; /* Size in 32bit words. */ in qla2x00_prep_sns_cmd()
986 sns_cmd->p.cmd.size = cpu_to_le16(wc); in qla2x00_prep_sns_cmd()
988 vha->qla_stats.control_requests++; in qla2x00_prep_sns_cmd()
994 * qla2x00_sns_ga_nxt() - SNS scan for fabric devices via GA_NXT command.
1006 struct qla_hw_data *ha = vha->hw; in qla2x00_sns_ga_nxt()
1014 /* Prepare SNS command arguments -- port_id. */ in qla2x00_sns_ga_nxt()
1015 sns_cmd->p.cmd.param[0] = fcport->d_id.b.al_pa; in qla2x00_sns_ga_nxt()
1016 sns_cmd->p.cmd.param[1] = fcport->d_id.b.area; in qla2x00_sns_ga_nxt()
1017 sns_cmd->p.cmd.param[2] = fcport->d_id.b.domain; in qla2x00_sns_ga_nxt()
1020 rval = qla2x00_send_sns(vha, ha->sns_cmd_dma, GA_NXT_SNS_CMD_SIZE / 2, in qla2x00_sns_ga_nxt()
1026 } else if (sns_cmd->p.gan_data[8] != 0x80 || in qla2x00_sns_ga_nxt()
1027 sns_cmd->p.gan_data[9] != 0x02) { in qla2x00_sns_ga_nxt()
1031 sns_cmd->p.gan_data, 16); in qla2x00_sns_ga_nxt()
1035 fcport->d_id.b.domain = sns_cmd->p.gan_data[17]; in qla2x00_sns_ga_nxt()
1036 fcport->d_id.b.area = sns_cmd->p.gan_data[18]; in qla2x00_sns_ga_nxt()
1037 fcport->d_id.b.al_pa = sns_cmd->p.gan_data[19]; in qla2x00_sns_ga_nxt()
1039 memcpy(fcport->node_name, &sns_cmd->p.gan_data[284], WWN_SIZE); in qla2x00_sns_ga_nxt()
1040 memcpy(fcport->port_name, &sns_cmd->p.gan_data[20], WWN_SIZE); in qla2x00_sns_ga_nxt()
1042 if (sns_cmd->p.gan_data[16] != NS_N_PORT_TYPE && in qla2x00_sns_ga_nxt()
1043 sns_cmd->p.gan_data[16] != NS_NL_PORT_TYPE) in qla2x00_sns_ga_nxt()
1044 fcport->d_id.b.domain = 0xf0; in qla2x00_sns_ga_nxt()
1047 "GA_NXT entry - nn %8phN pn %8phN " in qla2x00_sns_ga_nxt()
1049 fcport->node_name, fcport->port_name, in qla2x00_sns_ga_nxt()
1050 fcport->d_id.b.domain, fcport->d_id.b.area, in qla2x00_sns_ga_nxt()
1051 fcport->d_id.b.al_pa); in qla2x00_sns_ga_nxt()
1058 * qla2x00_sns_gid_pt() - SNS scan for fabric devices via GID_PT command.
1064 * NOTE: Non-Nx_Ports are not requested.
1072 struct qla_hw_data *ha = vha->hw; in qla2x00_sns_gid_pt()
1085 /* Prepare SNS command arguments -- port_type. */ in qla2x00_sns_gid_pt()
1086 sns_cmd->p.cmd.param[0] = NS_NX_PORT_TYPE; in qla2x00_sns_gid_pt()
1089 rval = qla2x00_send_sns(vha, ha->sns_cmd_dma, GID_PT_SNS_CMD_SIZE / 2, in qla2x00_sns_gid_pt()
1095 } else if (sns_cmd->p.gid_data[8] != 0x80 || in qla2x00_sns_gid_pt()
1096 sns_cmd->p.gid_data[9] != 0x02) { in qla2x00_sns_gid_pt()
1100 sns_cmd->p.gid_data, 16); in qla2x00_sns_gid_pt()
1104 for (i = 0; i < ha->max_fibre_devices; i++) { in qla2x00_sns_gid_pt()
1105 entry = &sns_cmd->p.gid_data[(i * 4) + 16]; in qla2x00_sns_gid_pt()
1123 if (i == ha->max_fibre_devices) in qla2x00_sns_gid_pt()
1131 * qla2x00_sns_gpn_id() - SNS Get Port Name (GPN_ID) query.
1143 struct qla_hw_data *ha = vha->hw; in qla2x00_sns_gpn_id()
1147 for (i = 0; i < ha->max_fibre_devices; i++) { in qla2x00_sns_gpn_id()
1153 /* Prepare SNS command arguments -- port_id. */ in qla2x00_sns_gpn_id()
1154 sns_cmd->p.cmd.param[0] = list[i].d_id.b.al_pa; in qla2x00_sns_gpn_id()
1155 sns_cmd->p.cmd.param[1] = list[i].d_id.b.area; in qla2x00_sns_gpn_id()
1156 sns_cmd->p.cmd.param[2] = list[i].d_id.b.domain; in qla2x00_sns_gpn_id()
1159 rval = qla2x00_send_sns(vha, ha->sns_cmd_dma, in qla2x00_sns_gpn_id()
1165 } else if (sns_cmd->p.gpn_data[8] != 0x80 || in qla2x00_sns_gpn_id()
1166 sns_cmd->p.gpn_data[9] != 0x02) { in qla2x00_sns_gpn_id()
1170 sns_cmd->p.gpn_data, 16); in qla2x00_sns_gpn_id()
1174 memcpy(list[i].port_name, &sns_cmd->p.gpn_data[16], in qla2x00_sns_gpn_id()
1187 * qla2x00_sns_gnn_id() - SNS Get Node Name (GNN_ID) query.
1199 struct qla_hw_data *ha = vha->hw; in qla2x00_sns_gnn_id()
1203 for (i = 0; i < ha->max_fibre_devices; i++) { in qla2x00_sns_gnn_id()
1209 /* Prepare SNS command arguments -- port_id. */ in qla2x00_sns_gnn_id()
1210 sns_cmd->p.cmd.param[0] = list[i].d_id.b.al_pa; in qla2x00_sns_gnn_id()
1211 sns_cmd->p.cmd.param[1] = list[i].d_id.b.area; in qla2x00_sns_gnn_id()
1212 sns_cmd->p.cmd.param[2] = list[i].d_id.b.domain; in qla2x00_sns_gnn_id()
1215 rval = qla2x00_send_sns(vha, ha->sns_cmd_dma, in qla2x00_sns_gnn_id()
1221 } else if (sns_cmd->p.gnn_data[8] != 0x80 || in qla2x00_sns_gnn_id()
1222 sns_cmd->p.gnn_data[9] != 0x02) { in qla2x00_sns_gnn_id()
1226 sns_cmd->p.gnn_data, 16); in qla2x00_sns_gnn_id()
1230 memcpy(list[i].node_name, &sns_cmd->p.gnn_data[16], in qla2x00_sns_gnn_id()
1234 "GID_PT entry - nn %8phN pn %8phN " in qla2x00_sns_gnn_id()
1250 * qla2x00_sns_rft_id() - SNS Register FC-4 TYPEs (RFT_ID) supported by the HBA.
1261 struct qla_hw_data *ha = vha->hw; in qla2x00_sns_rft_id()
1269 /* Prepare SNS command arguments -- port_id, FC-4 types */ in qla2x00_sns_rft_id()
1270 sns_cmd->p.cmd.param[0] = vha->d_id.b.al_pa; in qla2x00_sns_rft_id()
1271 sns_cmd->p.cmd.param[1] = vha->d_id.b.area; in qla2x00_sns_rft_id()
1272 sns_cmd->p.cmd.param[2] = vha->d_id.b.domain; in qla2x00_sns_rft_id()
1274 sns_cmd->p.cmd.param[5] = 0x01; /* FCP-3 */ in qla2x00_sns_rft_id()
1277 rval = qla2x00_send_sns(vha, ha->sns_cmd_dma, RFT_ID_SNS_CMD_SIZE / 2, in qla2x00_sns_rft_id()
1283 } else if (sns_cmd->p.rft_data[8] != 0x80 || in qla2x00_sns_rft_id()
1284 sns_cmd->p.rft_data[9] != 0x02) { in qla2x00_sns_rft_id()
1288 sns_cmd->p.rft_data, 16); in qla2x00_sns_rft_id()
1299 * qla2x00_sns_rnn_id() - SNS Register Node Name (RNN_ID) of the HBA.
1310 struct qla_hw_data *ha = vha->hw; in qla2x00_sns_rnn_id()
1318 /* Prepare SNS command arguments -- port_id, nodename. */ in qla2x00_sns_rnn_id()
1319 sns_cmd->p.cmd.param[0] = vha->d_id.b.al_pa; in qla2x00_sns_rnn_id()
1320 sns_cmd->p.cmd.param[1] = vha->d_id.b.area; in qla2x00_sns_rnn_id()
1321 sns_cmd->p.cmd.param[2] = vha->d_id.b.domain; in qla2x00_sns_rnn_id()
1323 sns_cmd->p.cmd.param[4] = vha->node_name[7]; in qla2x00_sns_rnn_id()
1324 sns_cmd->p.cmd.param[5] = vha->node_name[6]; in qla2x00_sns_rnn_id()
1325 sns_cmd->p.cmd.param[6] = vha->node_name[5]; in qla2x00_sns_rnn_id()
1326 sns_cmd->p.cmd.param[7] = vha->node_name[4]; in qla2x00_sns_rnn_id()
1327 sns_cmd->p.cmd.param[8] = vha->node_name[3]; in qla2x00_sns_rnn_id()
1328 sns_cmd->p.cmd.param[9] = vha->node_name[2]; in qla2x00_sns_rnn_id()
1329 sns_cmd->p.cmd.param[10] = vha->node_name[1]; in qla2x00_sns_rnn_id()
1330 sns_cmd->p.cmd.param[11] = vha->node_name[0]; in qla2x00_sns_rnn_id()
1333 rval = qla2x00_send_sns(vha, ha->sns_cmd_dma, RNN_ID_SNS_CMD_SIZE / 2, in qla2x00_sns_rnn_id()
1339 } else if (sns_cmd->p.rnn_data[8] != 0x80 || in qla2x00_sns_rnn_id()
1340 sns_cmd->p.rnn_data[9] != 0x02) { in qla2x00_sns_rnn_id()
1344 sns_cmd->p.rnn_data, 16); in qla2x00_sns_rnn_id()
1355 * qla2x00_mgmt_svr_login() - Login to fabric Management Service.
1365 struct qla_hw_data *ha = vha->hw; in qla2x00_mgmt_svr_login()
1368 if (vha->flags.management_server_logged_in) in qla2x00_mgmt_svr_login()
1371 rval = ha->isp_ops->fabric_login(vha, vha->mgmt_svr_loop_id, 0xff, 0xff, in qla2x00_mgmt_svr_login()
1377 "rval=%d\n", vha->mgmt_svr_loop_id, rval); in qla2x00_mgmt_svr_login()
1382 vha->mgmt_svr_loop_id, mb[0], mb[1], mb[2], mb[6], in qla2x00_mgmt_svr_login()
1386 vha->flags.management_server_logged_in = 1; in qla2x00_mgmt_svr_login()
1392 * qla2x00_prep_ms_fdmi_iocb() - Prepare common MS IOCB fields for FDMI query.
1404 struct qla_hw_data *ha = vha->hw; in qla2x00_prep_ms_fdmi_iocb()
1406 ms_pkt = ha->ms_iocb; in qla2x00_prep_ms_fdmi_iocb()
1409 ms_pkt->entry_type = MS_IOCB_TYPE; in qla2x00_prep_ms_fdmi_iocb()
1410 ms_pkt->entry_count = 1; in qla2x00_prep_ms_fdmi_iocb()
1411 SET_TARGET_ID(ha, ms_pkt->loop_id, vha->mgmt_svr_loop_id); in qla2x00_prep_ms_fdmi_iocb()
1412 ms_pkt->control_flags = cpu_to_le16(CF_READ | CF_HEAD_TAG); in qla2x00_prep_ms_fdmi_iocb()
1413 ms_pkt->timeout = cpu_to_le16(ha->r_a_tov / 10 * 2); in qla2x00_prep_ms_fdmi_iocb()
1414 ms_pkt->cmd_dsd_count = cpu_to_le16(1); in qla2x00_prep_ms_fdmi_iocb()
1415 ms_pkt->total_dsd_count = cpu_to_le16(2); in qla2x00_prep_ms_fdmi_iocb()
1416 ms_pkt->rsp_bytecount = cpu_to_le32(rsp_size); in qla2x00_prep_ms_fdmi_iocb()
1417 ms_pkt->req_bytecount = cpu_to_le32(req_size); in qla2x00_prep_ms_fdmi_iocb()
1419 put_unaligned_le64(ha->ct_sns_dma, &ms_pkt->req_dsd.address); in qla2x00_prep_ms_fdmi_iocb()
1420 ms_pkt->req_dsd.length = ms_pkt->req_bytecount; in qla2x00_prep_ms_fdmi_iocb()
1422 put_unaligned_le64(ha->ct_sns_dma, &ms_pkt->rsp_dsd.address); in qla2x00_prep_ms_fdmi_iocb()
1423 ms_pkt->rsp_dsd.length = ms_pkt->rsp_bytecount; in qla2x00_prep_ms_fdmi_iocb()
1429 * qla24xx_prep_ms_fdmi_iocb() - Prepare common MS IOCB fields for FDMI query.
1441 struct qla_hw_data *ha = vha->hw; in qla24xx_prep_ms_fdmi_iocb()
1443 ct_pkt = (struct ct_entry_24xx *)ha->ms_iocb; in qla24xx_prep_ms_fdmi_iocb()
1446 ct_pkt->entry_type = CT_IOCB_TYPE; in qla24xx_prep_ms_fdmi_iocb()
1447 ct_pkt->entry_count = 1; in qla24xx_prep_ms_fdmi_iocb()
1448 ct_pkt->nport_handle = cpu_to_le16(vha->mgmt_svr_loop_id); in qla24xx_prep_ms_fdmi_iocb()
1449 ct_pkt->timeout = cpu_to_le16(ha->r_a_tov / 10 * 2); in qla24xx_prep_ms_fdmi_iocb()
1450 ct_pkt->cmd_dsd_count = cpu_to_le16(1); in qla24xx_prep_ms_fdmi_iocb()
1451 ct_pkt->rsp_dsd_count = cpu_to_le16(1); in qla24xx_prep_ms_fdmi_iocb()
1452 ct_pkt->rsp_byte_count = cpu_to_le32(rsp_size); in qla24xx_prep_ms_fdmi_iocb()
1453 ct_pkt->cmd_byte_count = cpu_to_le32(req_size); in qla24xx_prep_ms_fdmi_iocb()
1455 put_unaligned_le64(ha->ct_sns_dma, &ct_pkt->dsd[0].address); in qla24xx_prep_ms_fdmi_iocb()
1456 ct_pkt->dsd[0].length = ct_pkt->cmd_byte_count; in qla24xx_prep_ms_fdmi_iocb()
1458 put_unaligned_le64(ha->ct_sns_dma, &ct_pkt->dsd[1].address); in qla24xx_prep_ms_fdmi_iocb()
1459 ct_pkt->dsd[1].length = ct_pkt->rsp_byte_count; in qla24xx_prep_ms_fdmi_iocb()
1460 ct_pkt->vp_index = vha->vp_idx; in qla24xx_prep_ms_fdmi_iocb()
1468 struct qla_hw_data *ha = vha->hw; in qla2x00_update_ms_fdmi_iocb()
1469 ms_iocb_entry_t *ms_pkt = ha->ms_iocb; in qla2x00_update_ms_fdmi_iocb()
1470 struct ct_entry_24xx *ct_pkt = (struct ct_entry_24xx *)ha->ms_iocb; in qla2x00_update_ms_fdmi_iocb()
1473 ct_pkt->cmd_byte_count = cpu_to_le32(req_size); in qla2x00_update_ms_fdmi_iocb()
1474 ct_pkt->dsd[0].length = ct_pkt->cmd_byte_count; in qla2x00_update_ms_fdmi_iocb()
1476 ms_pkt->req_bytecount = cpu_to_le32(req_size); in qla2x00_update_ms_fdmi_iocb()
1477 ms_pkt->req_dsd.length = ms_pkt->req_bytecount; in qla2x00_update_ms_fdmi_iocb()
1482 * qla2x00_prep_ct_fdmi_req() - Prepare common CT request fields for SNS query.
1495 p->p.req.header.revision = 0x01; in qla2x00_prep_ct_fdmi_req()
1496 p->p.req.header.gs_type = 0xFA; in qla2x00_prep_ct_fdmi_req()
1497 p->p.req.header.gs_subtype = 0x10; in qla2x00_prep_ct_fdmi_req()
1498 p->p.req.command = cpu_to_be16(cmd); in qla2x00_prep_ct_fdmi_req()
1499 p->p.req.max_rsp_size = cpu_to_be16((rsp_size - 16) / 4); in qla2x00_prep_ct_fdmi_req()
1501 return &p->p.req; in qla2x00_prep_ct_fdmi_req()
1512 if (ha->max_supported_speed == 2) { in qla25xx_fdmi_port_speed_capability()
1513 if (ha->min_supported_speed <= 6) in qla25xx_fdmi_port_speed_capability()
1516 if (ha->max_supported_speed == 2 || in qla25xx_fdmi_port_speed_capability()
1517 ha->max_supported_speed == 1) { in qla25xx_fdmi_port_speed_capability()
1518 if (ha->min_supported_speed <= 5) in qla25xx_fdmi_port_speed_capability()
1521 if (ha->max_supported_speed == 2 || in qla25xx_fdmi_port_speed_capability()
1522 ha->max_supported_speed == 1 || in qla25xx_fdmi_port_speed_capability()
1523 ha->max_supported_speed == 0) { in qla25xx_fdmi_port_speed_capability()
1524 if (ha->min_supported_speed <= 4) in qla25xx_fdmi_port_speed_capability()
1527 if (ha->max_supported_speed == 1 || in qla25xx_fdmi_port_speed_capability()
1528 ha->max_supported_speed == 0) { in qla25xx_fdmi_port_speed_capability()
1529 if (ha->min_supported_speed <= 3) in qla25xx_fdmi_port_speed_capability()
1532 if (ha->max_supported_speed == 0) { in qla25xx_fdmi_port_speed_capability()
1533 if (ha->min_supported_speed <= 2) in qla25xx_fdmi_port_speed_capability()
1539 if ((ha->pdev->subsystem_vendor == 0x103C) && in qla25xx_fdmi_port_speed_capability()
1540 ((ha->pdev->subsystem_device == 0x8002) || in qla25xx_fdmi_port_speed_capability()
1541 (ha->pdev->subsystem_device == 0x8086))) { in qla25xx_fdmi_port_speed_capability()
1563 switch (ha->link_data_rate) { in qla25xx_fdmi_port_speed_currently()
1586 * qla2x00_hba_attributes() - perform HBA attributes registration
1598 struct qla_hw_data *ha = vha->hw; in qla2x00_hba_attributes()
1606 eiter->type = cpu_to_be16(FDMI_HBA_NODE_NAME); in qla2x00_hba_attributes()
1607 memcpy(eiter->a.node_name, vha->node_name, sizeof(eiter->a.node_name)); in qla2x00_hba_attributes()
1608 alen = sizeof(eiter->a.node_name); in qla2x00_hba_attributes()
1610 eiter->len = cpu_to_be16(alen); in qla2x00_hba_attributes()
1613 "NODENAME = %016llx.\n", wwn_to_u64(eiter->a.node_name)); in qla2x00_hba_attributes()
1616 eiter->type = cpu_to_be16(FDMI_HBA_MANUFACTURER); in qla2x00_hba_attributes()
1618 eiter->a.manufacturer, sizeof(eiter->a.manufacturer), in qla2x00_hba_attributes()
1622 eiter->len = cpu_to_be16(alen); in qla2x00_hba_attributes()
1625 "MANUFACTURER = %s.\n", eiter->a.manufacturer); in qla2x00_hba_attributes()
1628 eiter->type = cpu_to_be16(FDMI_HBA_SERIAL_NUMBER); in qla2x00_hba_attributes()
1632 eiter->a.serial_num, sizeof(eiter->a.serial_num)); in qla2x00_hba_attributes()
1635 uint32_t sn = ((ha->serial0 & 0x1f) << 16) | in qla2x00_hba_attributes()
1636 (ha->serial2 << 8) | ha->serial1; in qla2x00_hba_attributes()
1638 eiter->a.serial_num, sizeof(eiter->a.serial_num), in qla2x00_hba_attributes()
1643 eiter->len = cpu_to_be16(alen); in qla2x00_hba_attributes()
1646 "SERIAL NUMBER = %s.\n", eiter->a.serial_num); in qla2x00_hba_attributes()
1649 eiter->type = cpu_to_be16(FDMI_HBA_MODEL); in qla2x00_hba_attributes()
1651 eiter->a.model, sizeof(eiter->a.model), in qla2x00_hba_attributes()
1652 "%s", ha->model_number); in qla2x00_hba_attributes()
1655 eiter->len = cpu_to_be16(alen); in qla2x00_hba_attributes()
1658 "MODEL NAME = %s.\n", eiter->a.model); in qla2x00_hba_attributes()
1661 eiter->type = cpu_to_be16(FDMI_HBA_MODEL_DESCRIPTION); in qla2x00_hba_attributes()
1663 eiter->a.model_desc, sizeof(eiter->a.model_desc), in qla2x00_hba_attributes()
1664 "%s", ha->model_desc); in qla2x00_hba_attributes()
1667 eiter->len = cpu_to_be16(alen); in qla2x00_hba_attributes()
1670 "MODEL DESCRIPTION = %s.\n", eiter->a.model_desc); in qla2x00_hba_attributes()
1673 eiter->type = cpu_to_be16(FDMI_HBA_HARDWARE_VERSION); in qla2x00_hba_attributes()
1678 eiter->a.hw_version, sizeof(eiter->a.hw_version)); in qla2x00_hba_attributes()
1682 eiter->a.hw_version, sizeof(eiter->a.hw_version)); in qla2x00_hba_attributes()
1687 eiter->a.hw_version, sizeof(eiter->a.hw_version), in qla2x00_hba_attributes()
1688 "HW:%s", ha->adapter_id); in qla2x00_hba_attributes()
1692 eiter->len = cpu_to_be16(alen); in qla2x00_hba_attributes()
1695 "HARDWARE VERSION = %s.\n", eiter->a.hw_version); in qla2x00_hba_attributes()
1698 eiter->type = cpu_to_be16(FDMI_HBA_DRIVER_VERSION); in qla2x00_hba_attributes()
1700 eiter->a.driver_version, sizeof(eiter->a.driver_version), in qla2x00_hba_attributes()
1704 eiter->len = cpu_to_be16(alen); in qla2x00_hba_attributes()
1707 "DRIVER VERSION = %s.\n", eiter->a.driver_version); in qla2x00_hba_attributes()
1710 eiter->type = cpu_to_be16(FDMI_HBA_OPTION_ROM_VERSION); in qla2x00_hba_attributes()
1712 eiter->a.orom_version, sizeof(eiter->a.orom_version), in qla2x00_hba_attributes()
1713 "%d.%02d", ha->efi_revision[1], ha->efi_revision[0]); in qla2x00_hba_attributes()
1716 eiter->len = cpu_to_be16(alen); in qla2x00_hba_attributes()
1721 eiter->a.orom_version[1], eiter->a.orom_version[0]); in qla2x00_hba_attributes()
1724 eiter->type = cpu_to_be16(FDMI_HBA_FIRMWARE_VERSION); in qla2x00_hba_attributes()
1725 ha->isp_ops->fw_version_str(vha, eiter->a.fw_version, in qla2x00_hba_attributes()
1726 sizeof(eiter->a.fw_version)); in qla2x00_hba_attributes()
1729 eiter->len = cpu_to_be16(alen); in qla2x00_hba_attributes()
1732 "FIRMWARE VERSION = %s.\n", eiter->a.fw_version); in qla2x00_hba_attributes()
1735 eiter->type = cpu_to_be16(FDMI_HBA_OS_NAME_AND_VERSION); in qla2x00_hba_attributes()
1739 eiter->a.os_version, sizeof(eiter->a.os_version), in qla2x00_hba_attributes()
1741 p_sysid->sysname, p_sysid->release, p_sysid->machine); in qla2x00_hba_attributes()
1745 eiter->a.os_version, sizeof(eiter->a.os_version), in qla2x00_hba_attributes()
1747 "Linux", fc_host_system_hostname(vha->host)); in qla2x00_hba_attributes()
1751 eiter->len = cpu_to_be16(alen); in qla2x00_hba_attributes()
1754 "OS VERSION = %s.\n", eiter->a.os_version); in qla2x00_hba_attributes()
1759 eiter->type = cpu_to_be16(FDMI_HBA_MAXIMUM_CT_PAYLOAD_LENGTH); in qla2x00_hba_attributes()
1760 eiter->a.max_ct_len = cpu_to_be32(ha->frame_payload_size >> 2); in qla2x00_hba_attributes()
1762 alen = sizeof(eiter->a.max_ct_len); in qla2x00_hba_attributes()
1764 eiter->len = cpu_to_be16(alen); in qla2x00_hba_attributes()
1767 "CT PAYLOAD LENGTH = 0x%x.\n", be32_to_cpu(eiter->a.max_ct_len)); in qla2x00_hba_attributes()
1770 eiter->type = cpu_to_be16(FDMI_HBA_NODE_SYMBOLIC_NAME); in qla2x00_hba_attributes()
1771 alen = qla2x00_get_sym_node_name(vha, eiter->a.sym_name, in qla2x00_hba_attributes()
1772 sizeof(eiter->a.sym_name)); in qla2x00_hba_attributes()
1775 eiter->len = cpu_to_be16(alen); in qla2x00_hba_attributes()
1778 "SYMBOLIC NAME = %s.\n", eiter->a.sym_name); in qla2x00_hba_attributes()
1781 eiter->type = cpu_to_be16(FDMI_HBA_VENDOR_SPECIFIC_INFO); in qla2x00_hba_attributes()
1782 eiter->a.vendor_specific_info = cpu_to_be32(PCI_VENDOR_ID_QLOGIC); in qla2x00_hba_attributes()
1783 alen = sizeof(eiter->a.vendor_specific_info); in qla2x00_hba_attributes()
1785 eiter->len = cpu_to_be16(alen); in qla2x00_hba_attributes()
1789 be32_to_cpu(eiter->a.vendor_specific_info)); in qla2x00_hba_attributes()
1792 eiter->type = cpu_to_be16(FDMI_HBA_NUM_PORTS); in qla2x00_hba_attributes()
1793 eiter->a.num_ports = cpu_to_be32(1); in qla2x00_hba_attributes()
1794 alen = sizeof(eiter->a.num_ports); in qla2x00_hba_attributes()
1796 eiter->len = cpu_to_be16(alen); in qla2x00_hba_attributes()
1799 "PORT COUNT = %x.\n", be32_to_cpu(eiter->a.num_ports)); in qla2x00_hba_attributes()
1802 eiter->type = cpu_to_be16(FDMI_HBA_FABRIC_NAME); in qla2x00_hba_attributes()
1803 memcpy(eiter->a.fabric_name, vha->fabric_node_name, in qla2x00_hba_attributes()
1804 sizeof(eiter->a.fabric_name)); in qla2x00_hba_attributes()
1805 alen = sizeof(eiter->a.fabric_name); in qla2x00_hba_attributes()
1807 eiter->len = cpu_to_be16(alen); in qla2x00_hba_attributes()
1810 "FABRIC NAME = %016llx.\n", wwn_to_u64(eiter->a.fabric_name)); in qla2x00_hba_attributes()
1813 eiter->type = cpu_to_be16(FDMI_HBA_BOOT_BIOS_NAME); in qla2x00_hba_attributes()
1815 eiter->a.bios_name, sizeof(eiter->a.bios_name), in qla2x00_hba_attributes()
1816 "BIOS %d.%02d", ha->bios_revision[1], ha->bios_revision[0]); in qla2x00_hba_attributes()
1819 eiter->len = cpu_to_be16(alen); in qla2x00_hba_attributes()
1822 "BIOS NAME = %s\n", eiter->a.bios_name); in qla2x00_hba_attributes()
1825 eiter->type = cpu_to_be16(FDMI_HBA_VENDOR_IDENTIFIER); in qla2x00_hba_attributes()
1827 eiter->a.vendor_identifier, sizeof(eiter->a.vendor_identifier), in qla2x00_hba_attributes()
1831 eiter->len = cpu_to_be16(alen); in qla2x00_hba_attributes()
1834 "VENDOR IDENTIFIER = %s.\n", eiter->a.vendor_identifier); in qla2x00_hba_attributes()
1840 * qla2x00_port_attributes() - perform Port attributes registration
1852 struct qla_hw_data *ha = vha->hw; in qla2x00_port_attributes()
1855 p_sysid->nodename : fc_host_system_hostname(vha->host); in qla2x00_port_attributes()
1862 eiter->type = cpu_to_be16(FDMI_PORT_FC4_TYPES); in qla2x00_port_attributes()
1863 eiter->a.fc4_types[0] = 0x00; in qla2x00_port_attributes()
1864 eiter->a.fc4_types[1] = 0x00; in qla2x00_port_attributes()
1865 eiter->a.fc4_types[2] = 0x01; in qla2x00_port_attributes()
1866 eiter->a.fc4_types[3] = 0x00; in qla2x00_port_attributes()
1867 alen = sizeof(eiter->a.fc4_types); in qla2x00_port_attributes()
1869 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
1872 "FC4 TYPES = %016llx.\n", *(uint64_t *)eiter->a.fc4_types); in qla2x00_port_attributes()
1873 if (vha->flags.nvme_enabled) { in qla2x00_port_attributes()
1874 eiter->a.fc4_types[6] = 1; /* NVMe type 28h */ in qla2x00_port_attributes()
1877 eiter->a.fc4_types[6]); in qla2x00_port_attributes()
1881 eiter->type = cpu_to_be16(FDMI_PORT_SUPPORT_SPEED); in qla2x00_port_attributes()
1882 eiter->a.sup_speed = cpu_to_be32( in qla2x00_port_attributes()
1884 alen = sizeof(eiter->a.sup_speed); in qla2x00_port_attributes()
1886 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
1889 "SUPPORTED SPEED = %x.\n", be32_to_cpu(eiter->a.sup_speed)); in qla2x00_port_attributes()
1892 eiter->type = cpu_to_be16(FDMI_PORT_CURRENT_SPEED); in qla2x00_port_attributes()
1893 eiter->a.cur_speed = cpu_to_be32( in qla2x00_port_attributes()
1895 alen = sizeof(eiter->a.cur_speed); in qla2x00_port_attributes()
1897 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
1900 "CURRENT SPEED = %x.\n", be32_to_cpu(eiter->a.cur_speed)); in qla2x00_port_attributes()
1903 eiter->type = cpu_to_be16(FDMI_PORT_MAX_FRAME_SIZE); in qla2x00_port_attributes()
1904 eiter->a.max_frame_size = cpu_to_be32(ha->frame_payload_size); in qla2x00_port_attributes()
1905 alen = sizeof(eiter->a.max_frame_size); in qla2x00_port_attributes()
1907 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
1910 "MAX FRAME SIZE = %x.\n", be32_to_cpu(eiter->a.max_frame_size)); in qla2x00_port_attributes()
1913 eiter->type = cpu_to_be16(FDMI_PORT_OS_DEVICE_NAME); in qla2x00_port_attributes()
1915 eiter->a.os_dev_name, sizeof(eiter->a.os_dev_name), in qla2x00_port_attributes()
1916 "%s:host%lu", QLA2XXX_DRIVER_NAME, vha->host_no); in qla2x00_port_attributes()
1919 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
1922 "OS DEVICE NAME = %s.\n", eiter->a.os_dev_name); in qla2x00_port_attributes()
1925 eiter->type = cpu_to_be16(FDMI_PORT_HOST_NAME); in qla2x00_port_attributes()
1927 hostname = "Linux-default"; in qla2x00_port_attributes()
1929 eiter->a.host_name, sizeof(eiter->a.host_name), in qla2x00_port_attributes()
1933 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
1936 "HOSTNAME = %s.\n", eiter->a.host_name); in qla2x00_port_attributes()
1943 eiter->type = cpu_to_be16(FDMI_PORT_NODE_NAME); in qla2x00_port_attributes()
1944 memcpy(eiter->a.node_name, vha->node_name, sizeof(eiter->a.node_name)); in qla2x00_port_attributes()
1945 alen = sizeof(eiter->a.node_name); in qla2x00_port_attributes()
1947 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
1950 "NODENAME = %016llx.\n", wwn_to_u64(eiter->a.node_name)); in qla2x00_port_attributes()
1954 eiter->type = cpu_to_be16(FDMI_PORT_NAME); in qla2x00_port_attributes()
1955 memcpy(eiter->a.port_name, vha->port_name, sizeof(eiter->a.port_name)); in qla2x00_port_attributes()
1956 alen = sizeof(eiter->a.port_name); in qla2x00_port_attributes()
1958 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
1961 "PORTNAME = %016llx.\n", wwn_to_u64(eiter->a.port_name)); in qla2x00_port_attributes()
1965 eiter->type = cpu_to_be16(FDMI_PORT_SYM_NAME); in qla2x00_port_attributes()
1966 alen = qla2x00_get_sym_node_name(vha, eiter->a.port_sym_name, in qla2x00_port_attributes()
1967 sizeof(eiter->a.port_sym_name)); in qla2x00_port_attributes()
1970 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
1973 "PORT SYMBOLIC NAME = %s\n", eiter->a.port_sym_name); in qla2x00_port_attributes()
1977 eiter->type = cpu_to_be16(FDMI_PORT_TYPE); in qla2x00_port_attributes()
1978 eiter->a.port_type = cpu_to_be32(NS_NX_PORT_TYPE); in qla2x00_port_attributes()
1979 alen = sizeof(eiter->a.port_type); in qla2x00_port_attributes()
1981 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
1984 "PORT TYPE = %x.\n", be32_to_cpu(eiter->a.port_type)); in qla2x00_port_attributes()
1988 eiter->type = cpu_to_be16(FDMI_PORT_SUPP_COS); in qla2x00_port_attributes()
1989 eiter->a.port_supported_cos = cpu_to_be32(FC_CLASS_3); in qla2x00_port_attributes()
1990 alen = sizeof(eiter->a.port_supported_cos); in qla2x00_port_attributes()
1992 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
1995 "SUPPORTED COS = %08x\n", be32_to_cpu(eiter->a.port_supported_cos)); in qla2x00_port_attributes()
1999 eiter->type = cpu_to_be16(FDMI_PORT_FABRIC_NAME); in qla2x00_port_attributes()
2000 memcpy(eiter->a.fabric_name, vha->fabric_node_name, in qla2x00_port_attributes()
2001 sizeof(eiter->a.fabric_name)); in qla2x00_port_attributes()
2002 alen = sizeof(eiter->a.fabric_name); in qla2x00_port_attributes()
2004 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
2007 "FABRIC NAME = %016llx.\n", wwn_to_u64(eiter->a.fabric_name)); in qla2x00_port_attributes()
2011 eiter->type = cpu_to_be16(FDMI_PORT_FC4_TYPE); in qla2x00_port_attributes()
2012 eiter->a.port_fc4_type[0] = 0x00; in qla2x00_port_attributes()
2013 eiter->a.port_fc4_type[1] = 0x00; in qla2x00_port_attributes()
2014 eiter->a.port_fc4_type[2] = 0x01; in qla2x00_port_attributes()
2015 eiter->a.port_fc4_type[3] = 0x00; in qla2x00_port_attributes()
2016 alen = sizeof(eiter->a.port_fc4_type); in qla2x00_port_attributes()
2018 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
2022 *(uint64_t *)eiter->a.port_fc4_type); in qla2x00_port_attributes()
2026 eiter->type = cpu_to_be16(FDMI_PORT_STATE); in qla2x00_port_attributes()
2027 eiter->a.port_state = cpu_to_be32(2); in qla2x00_port_attributes()
2028 alen = sizeof(eiter->a.port_state); in qla2x00_port_attributes()
2030 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
2033 "PORT_STATE = %x.\n", be32_to_cpu(eiter->a.port_state)); in qla2x00_port_attributes()
2037 eiter->type = cpu_to_be16(FDMI_PORT_COUNT); in qla2x00_port_attributes()
2038 eiter->a.num_ports = cpu_to_be32(1); in qla2x00_port_attributes()
2039 alen = sizeof(eiter->a.num_ports); in qla2x00_port_attributes()
2041 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
2044 "PORT COUNT = %x.\n", be32_to_cpu(eiter->a.num_ports)); in qla2x00_port_attributes()
2048 eiter->type = cpu_to_be16(FDMI_PORT_IDENTIFIER); in qla2x00_port_attributes()
2049 eiter->a.port_id = cpu_to_be32(vha->d_id.b24); in qla2x00_port_attributes()
2050 alen = sizeof(eiter->a.port_id); in qla2x00_port_attributes()
2052 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
2055 "PORT ID = %x.\n", be32_to_cpu(eiter->a.port_id)); in qla2x00_port_attributes()
2062 eiter->type = cpu_to_be16(FDMI_SMARTSAN_SERVICE); in qla2x00_port_attributes()
2064 eiter->a.smartsan_service, sizeof(eiter->a.smartsan_service), in qla2x00_port_attributes()
2068 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
2071 "SMARTSAN SERVICE CATEGORY = %s.\n", eiter->a.smartsan_service); in qla2x00_port_attributes()
2075 eiter->type = cpu_to_be16(FDMI_SMARTSAN_GUID); in qla2x00_port_attributes()
2076 memcpy(eiter->a.smartsan_guid, vha->node_name, WWN_SIZE); in qla2x00_port_attributes()
2077 memcpy(eiter->a.smartsan_guid + WWN_SIZE, vha->port_name, WWN_SIZE); in qla2x00_port_attributes()
2078 alen = sizeof(eiter->a.smartsan_guid); in qla2x00_port_attributes()
2080 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
2083 "Smart SAN GUID = %016llx-%016llx\n", in qla2x00_port_attributes()
2084 wwn_to_u64(eiter->a.smartsan_guid), in qla2x00_port_attributes()
2085 wwn_to_u64(eiter->a.smartsan_guid + WWN_SIZE)); in qla2x00_port_attributes()
2089 eiter->type = cpu_to_be16(FDMI_SMARTSAN_VERSION); in qla2x00_port_attributes()
2091 eiter->a.smartsan_version, sizeof(eiter->a.smartsan_version), in qla2x00_port_attributes()
2095 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
2098 "SMARTSAN VERSION = %s\n", eiter->a.smartsan_version); in qla2x00_port_attributes()
2102 eiter->type = cpu_to_be16(FDMI_SMARTSAN_PROD_NAME); in qla2x00_port_attributes()
2103 alen = scnprintf(eiter->a.smartsan_prod_name, in qla2x00_port_attributes()
2104 sizeof(eiter->a.smartsan_prod_name), in qla2x00_port_attributes()
2105 "ISP%04x", ha->pdev->device); in qla2x00_port_attributes()
2108 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
2111 "SMARTSAN PRODUCT NAME = %s\n", eiter->a.smartsan_prod_name); in qla2x00_port_attributes()
2115 eiter->type = cpu_to_be16(FDMI_SMARTSAN_PORT_INFO); in qla2x00_port_attributes()
2116 eiter->a.smartsan_port_info = cpu_to_be32(vha->vp_idx ? 2 : 1); in qla2x00_port_attributes()
2117 alen = sizeof(eiter->a.smartsan_port_info); in qla2x00_port_attributes()
2119 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
2122 "SMARTSAN PORT INFO = %x\n", eiter->a.smartsan_port_info); in qla2x00_port_attributes()
2126 eiter->type = cpu_to_be16(FDMI_SMARTSAN_SECURITY_SUPPORT); in qla2x00_port_attributes()
2127 eiter->a.smartsan_security_support = cpu_to_be32(1); in qla2x00_port_attributes()
2128 alen = sizeof(eiter->a.smartsan_security_support); in qla2x00_port_attributes()
2130 eiter->len = cpu_to_be16(alen); in qla2x00_port_attributes()
2134 be32_to_cpu(eiter->a.smartsan_security_support)); in qla2x00_port_attributes()
2141 * qla2x00_fdmi_rhba() - perform RHBA FDMI registration
2150 struct qla_hw_data *ha = vha->hw; in qla2x00_fdmi_rhba()
2152 unsigned int rval, count; in qla2x00_fdmi_rhba() local
2158 count = callopt != CALLOPT_FDMI1 ? in qla2x00_fdmi_rhba()
2164 "RHBA (callopt=%x count=%u size=%lu).\n", callopt, count, size); in qla2x00_fdmi_rhba()
2167 ms_pkt = ha->isp_ops->prep_ms_fdmi_iocb(vha, 0, size); in qla2x00_fdmi_rhba()
2170 ct_req = qla2x00_prep_ct_fdmi_req(ha->ct_sns, RHBA_CMD, size); in qla2x00_fdmi_rhba()
2171 ct_rsp = &ha->ct_sns->p.rsp; in qla2x00_fdmi_rhba()
2174 memcpy(ct_req->req.rhba.hba_identifier, vha->port_name, in qla2x00_fdmi_rhba()
2175 sizeof(ct_req->req.rhba.hba_identifier)); in qla2x00_fdmi_rhba()
2176 size += sizeof(ct_req->req.rhba.hba_identifier); in qla2x00_fdmi_rhba()
2178 ct_req->req.rhba.entry_count = cpu_to_be32(1); in qla2x00_fdmi_rhba()
2179 size += sizeof(ct_req->req.rhba.entry_count); in qla2x00_fdmi_rhba()
2181 memcpy(ct_req->req.rhba.port_name, vha->port_name, in qla2x00_fdmi_rhba()
2182 sizeof(ct_req->req.rhba.port_name)); in qla2x00_fdmi_rhba()
2183 size += sizeof(ct_req->req.rhba.port_name); in qla2x00_fdmi_rhba()
2185 /* Attribute count */ in qla2x00_fdmi_rhba()
2186 ct_req->req.rhba.attrs.count = cpu_to_be32(count); in qla2x00_fdmi_rhba()
2187 size += sizeof(ct_req->req.rhba.attrs.count); in qla2x00_fdmi_rhba()
2190 entries = &ct_req->req.rhba.attrs.entry; in qla2x00_fdmi_rhba()
2199 wwn_to_u64(ct_req->req.rhba.hba_identifier), in qla2x00_fdmi_rhba()
2200 wwn_to_u64(ct_req->req.rhba.port_name)); in qla2x00_fdmi_rhba()
2206 rval = qla2x00_issue_iocb(vha, ha->ms_iocb, ha->ms_iocb_dma, in qla2x00_fdmi_rhba()
2207 sizeof(*ha->ms_iocb)); in qla2x00_fdmi_rhba()
2216 if (ct_rsp->header.reason_code == CT_REASON_CANNOT_PERFORM && in qla2x00_fdmi_rhba()
2217 ct_rsp->header.explanation_code == in qla2x00_fdmi_rhba()
2226 ct_rsp->header.reason_code, in qla2x00_fdmi_rhba()
2227 ct_rsp->header.explanation_code); in qla2x00_fdmi_rhba()
2240 struct qla_hw_data *ha = vha->hw; in qla2x00_fdmi_dhba()
2246 ms_pkt = ha->isp_ops->prep_ms_fdmi_iocb(vha, DHBA_REQ_SIZE, in qla2x00_fdmi_dhba()
2249 ct_req = qla2x00_prep_ct_fdmi_req(ha->ct_sns, DHBA_CMD, DHBA_RSP_SIZE); in qla2x00_fdmi_dhba()
2250 ct_rsp = &ha->ct_sns->p.rsp; in qla2x00_fdmi_dhba()
2251 /* Prepare FDMI command arguments -- portname. */ in qla2x00_fdmi_dhba()
2252 memcpy(ct_req->req.dhba.port_name, vha->port_name, WWN_SIZE); in qla2x00_fdmi_dhba()
2254 "DHBA portname = %8phN.\n", ct_req->req.dhba.port_name); in qla2x00_fdmi_dhba()
2256 rval = qla2x00_issue_iocb(vha, ha->ms_iocb, ha->ms_iocb_dma, in qla2x00_fdmi_dhba()
2273 * qla2x00_fdmi_rprt() - perform RPRT registration
2283 struct scsi_qla_host *base_vha = pci_get_drvdata(vha->hw->pdev); in qla2x00_fdmi_rprt()
2284 struct qla_hw_data *ha = vha->hw; in qla2x00_fdmi_rprt()
2286 uint rval, count; in qla2x00_fdmi_rprt() local
2291 count = callopt == CALLOPT_FDMI2_SMARTSAN && ql2xsmartsan ? in qla2x00_fdmi_rprt()
2298 "RPRT (callopt=%x count=%u size=%lu).\n", callopt, count, size); in qla2x00_fdmi_rprt()
2300 ms_pkt = ha->isp_ops->prep_ms_fdmi_iocb(vha, 0, size); in qla2x00_fdmi_rprt()
2302 ct_req = qla2x00_prep_ct_fdmi_req(ha->ct_sns, RPRT_CMD, size); in qla2x00_fdmi_rprt()
2303 ct_rsp = &ha->ct_sns->p.rsp; in qla2x00_fdmi_rprt()
2305 memcpy(ct_req->req.rprt.hba_identifier, base_vha->port_name, in qla2x00_fdmi_rprt()
2306 sizeof(ct_req->req.rprt.hba_identifier)); in qla2x00_fdmi_rprt()
2307 size += sizeof(ct_req->req.rprt.hba_identifier); in qla2x00_fdmi_rprt()
2308 memcpy(ct_req->req.rprt.port_name, vha->port_name, in qla2x00_fdmi_rprt()
2309 sizeof(ct_req->req.rprt.port_name)); in qla2x00_fdmi_rprt()
2310 size += sizeof(ct_req->req.rprt.port_name); in qla2x00_fdmi_rprt()
2311 /* Attribute count */ in qla2x00_fdmi_rprt()
2312 ct_req->req.rprt.attrs.count = cpu_to_be32(count); in qla2x00_fdmi_rprt()
2313 size += sizeof(ct_req->req.rprt.attrs.count); in qla2x00_fdmi_rprt()
2315 entries = ct_req->req.rprt.attrs.entry; in qla2x00_fdmi_rprt()
2321 wwn_to_u64(ct_req->req.rprt.port_name), in qla2x00_fdmi_rprt()
2322 wwn_to_u64(ct_req->req.rprt.port_name)); in qla2x00_fdmi_rprt()
2326 rval = qla2x00_issue_iocb(vha, ha->ms_iocb, ha->ms_iocb_dma, in qla2x00_fdmi_rprt()
2327 sizeof(*ha->ms_iocb)); in qla2x00_fdmi_rprt()
2335 if (ct_rsp->header.reason_code == CT_REASON_CANNOT_PERFORM && in qla2x00_fdmi_rprt()
2336 ct_rsp->header.explanation_code == in qla2x00_fdmi_rprt()
2345 ct_rsp->header.reason_code, in qla2x00_fdmi_rprt()
2346 ct_rsp->header.explanation_code); in qla2x00_fdmi_rprt()
2354 * qla2x00_fdmi_rpa() - perform RPA registration
2363 struct qla_hw_data *ha = vha->hw; in qla2x00_fdmi_rpa()
2365 uint rval, count; in qla2x00_fdmi_rpa() local
2371 count = in qla2x00_fdmi_rpa()
2382 "RPA (callopt=%x count=%u size=%lu).\n", callopt, count, size); in qla2x00_fdmi_rpa()
2385 ms_pkt = ha->isp_ops->prep_ms_fdmi_iocb(vha, 0, size); in qla2x00_fdmi_rpa()
2388 ct_req = qla2x00_prep_ct_fdmi_req(ha->ct_sns, RPA_CMD, size); in qla2x00_fdmi_rpa()
2389 ct_rsp = &ha->ct_sns->p.rsp; in qla2x00_fdmi_rpa()
2392 memcpy(ct_req->req.rpa.port_name, vha->port_name, in qla2x00_fdmi_rpa()
2393 sizeof(ct_req->req.rpa.port_name)); in qla2x00_fdmi_rpa()
2394 size += sizeof(ct_req->req.rpa.port_name); in qla2x00_fdmi_rpa()
2396 /* Attribute count */ in qla2x00_fdmi_rpa()
2397 ct_req->req.rpa.attrs.count = cpu_to_be32(count); in qla2x00_fdmi_rpa()
2398 size += sizeof(ct_req->req.rpa.attrs.count); in qla2x00_fdmi_rpa()
2401 entries = ct_req->req.rpa.attrs.entry; in qla2x00_fdmi_rpa()
2409 "RPA %016llx.\n", wwn_to_u64(ct_req->req.rpa.port_name)); in qla2x00_fdmi_rpa()
2415 rval = qla2x00_issue_iocb(vha, ha->ms_iocb, ha->ms_iocb_dma, in qla2x00_fdmi_rpa()
2416 sizeof(*ha->ms_iocb)); in qla2x00_fdmi_rpa()
2425 if (ct_rsp->header.reason_code == CT_REASON_CANNOT_PERFORM && in qla2x00_fdmi_rpa()
2426 ct_rsp->header.explanation_code == in qla2x00_fdmi_rpa()
2435 ct_rsp->header.reason_code, in qla2x00_fdmi_rpa()
2436 ct_rsp->header.explanation_code); in qla2x00_fdmi_rpa()
2445 * qla2x00_fdmi_register() -
2454 struct qla_hw_data *ha = vha->hw; in qla2x00_fdmi_register()
2465 if (vha->vp_idx) { in qla2x00_fdmi_register()
2521 * qla2x00_gfpn_id() - SNS Get Fabric Port Name (GFPN_ID) query.
2532 struct qla_hw_data *ha = vha->hw; in qla2x00_gfpn_id()
2541 arg.iocb = ha->ms_iocb; in qla2x00_gfpn_id()
2542 arg.req_dma = ha->ct_sns_dma; in qla2x00_gfpn_id()
2543 arg.rsp_dma = ha->ct_sns_dma; in qla2x00_gfpn_id()
2548 for (i = 0; i < ha->max_fibre_devices; i++) { in qla2x00_gfpn_id()
2551 ms_pkt = ha->isp_ops->prep_ms_iocb(vha, &arg); in qla2x00_gfpn_id()
2554 ct_req = qla2x00_prep_ct_req(ha->ct_sns, GFPN_ID_CMD, in qla2x00_gfpn_id()
2556 ct_rsp = &ha->ct_sns->p.rsp; in qla2x00_gfpn_id()
2558 /* Prepare CT arguments -- port_id */ in qla2x00_gfpn_id()
2559 ct_req->req.port_id.port_id = port_id_to_be_id(list[i].d_id); in qla2x00_gfpn_id()
2562 rval = qla2x00_issue_iocb(vha, ha->ms_iocb, ha->ms_iocb_dma, in qla2x00_gfpn_id()
2576 ct_rsp->rsp.gfpn_id.port_name, WWN_SIZE); in qla2x00_gfpn_id()
2594 p->p.req.header.revision = 0x01; in qla24xx_prep_ct_fm_req()
2595 p->p.req.header.gs_type = 0xFA; in qla24xx_prep_ct_fm_req()
2596 p->p.req.header.gs_subtype = 0x01; in qla24xx_prep_ct_fm_req()
2597 p->p.req.command = cpu_to_be16(cmd); in qla24xx_prep_ct_fm_req()
2598 p->p.req.max_rsp_size = cpu_to_be16((rsp_size - 16) / 4); in qla24xx_prep_ct_fm_req()
2600 return &p->p.req; in qla24xx_prep_ct_fm_req()
2629 * qla2x00_gpsc() - FCS Get Port Speed Capabilities (GPSC) query.
2640 struct qla_hw_data *ha = vha->hw; in qla2x00_gpsc()
2648 if (!ha->flags.gpsc_supported) in qla2x00_gpsc()
2655 arg.iocb = ha->ms_iocb; in qla2x00_gpsc()
2656 arg.req_dma = ha->ct_sns_dma; in qla2x00_gpsc()
2657 arg.rsp_dma = ha->ct_sns_dma; in qla2x00_gpsc()
2660 arg.nport_handle = vha->mgmt_svr_loop_id; in qla2x00_gpsc()
2662 for (i = 0; i < ha->max_fibre_devices; i++) { in qla2x00_gpsc()
2668 ct_req = qla24xx_prep_ct_fm_req(ha->ct_sns, GPSC_CMD, in qla2x00_gpsc()
2670 ct_rsp = &ha->ct_sns->p.rsp; in qla2x00_gpsc()
2672 /* Prepare CT arguments -- port_name */ in qla2x00_gpsc()
2673 memcpy(ct_req->req.gpsc.port_name, list[i].fabric_port_name, in qla2x00_gpsc()
2677 rval = qla2x00_issue_iocb(vha, ha->ms_iocb, ha->ms_iocb_dma, in qla2x00_gpsc()
2687 (ct_rsp->header.reason_code == in qla2x00_gpsc()
2689 ct_rsp->header.reason_code == in qla2x00_gpsc()
2694 ha->flags.gpsc_supported = 0; in qla2x00_gpsc()
2700 list->fp_speed = qla2x00_port_speed_capability( in qla2x00_gpsc()
2701 be16_to_cpu(ct_rsp->rsp.gpsc.speed)); in qla2x00_gpsc()
2703 "GPSC ext entry - fpn " in qla2x00_gpsc()
2706 be16_to_cpu(ct_rsp->rsp.gpsc.speeds), in qla2x00_gpsc()
2707 be16_to_cpu(ct_rsp->rsp.gpsc.speed)); in qla2x00_gpsc()
2719 * qla2x00_gff_id() - SNS Get FC-4 Features (GFF_ID) query.
2734 struct qla_hw_data *ha = vha->hw; in qla2x00_gff_id()
2738 for (i = 0; i < ha->max_fibre_devices; i++) { in qla2x00_gff_id()
2747 arg.iocb = ha->ms_iocb; in qla2x00_gff_id()
2748 arg.req_dma = ha->ct_sns_dma; in qla2x00_gff_id()
2749 arg.rsp_dma = ha->ct_sns_dma; in qla2x00_gff_id()
2755 ms_pkt = ha->isp_ops->prep_ms_iocb(vha, &arg); in qla2x00_gff_id()
2758 ct_req = qla2x00_prep_ct_req(ha->ct_sns, GFF_ID_CMD, in qla2x00_gff_id()
2760 ct_rsp = &ha->ct_sns->p.rsp; in qla2x00_gff_id()
2762 /* Prepare CT arguments -- port_id */ in qla2x00_gff_id()
2763 ct_req->req.port_id.port_id = port_id_to_be_id(list[i].d_id); in qla2x00_gff_id()
2766 rval = qla2x00_issue_iocb(vha, ha->ms_iocb, ha->ms_iocb_dma, in qla2x00_gff_id()
2778 ct_rsp->rsp.gff_id.fc4_features[GFF_FCP_SCSI_OFFSET]; in qla2x00_gff_id()
2787 ct_rsp->rsp.gff_id.fc4_features[GFF_NVME_OFFSET]; in qla2x00_gff_id()
2810 e->u.fcport.fcport = fcport; in qla24xx_post_gpsc_work()
2816 struct fc_port *fcport = ea->fcport; in qla24xx_handle_gpsc_event()
2820 __func__, fcport->port_name, fcport->disc_state, in qla24xx_handle_gpsc_event()
2821 fcport->fw_login_state, ea->rc, ea->sp->gen2, fcport->login_gen, in qla24xx_handle_gpsc_event()
2822 ea->sp->gen2, fcport->rscn_gen|ea->sp->gen1, fcport->loop_id); in qla24xx_handle_gpsc_event()
2824 if (fcport->disc_state == DSC_DELETE_PEND) in qla24xx_handle_gpsc_event()
2827 /* We will figure-out what happen after AUTH completes */ in qla24xx_handle_gpsc_event()
2828 if (fcport->disc_state == DSC_LOGIN_AUTH_PEND) in qla24xx_handle_gpsc_event()
2831 if (ea->sp->gen2 != fcport->login_gen) { in qla24xx_handle_gpsc_event()
2835 __func__, fcport->port_name); in qla24xx_handle_gpsc_event()
2837 } else if (ea->sp->gen1 != fcport->rscn_gen) { in qla24xx_handle_gpsc_event()
2846 struct scsi_qla_host *vha = sp->vha; in qla24xx_async_gpsc_sp_done()
2847 struct qla_hw_data *ha = vha->hw; in qla24xx_async_gpsc_sp_done()
2848 fc_port_t *fcport = sp->fcport; in qla24xx_async_gpsc_sp_done()
2852 ct_rsp = &fcport->ct_desc.ct_sns->p.rsp; in qla24xx_async_gpsc_sp_done()
2855 "Async done-%s res %x, WWPN %8phC \n", in qla24xx_async_gpsc_sp_done()
2856 sp->name, res, fcport->port_name); in qla24xx_async_gpsc_sp_done()
2858 fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE); in qla24xx_async_gpsc_sp_done()
2867 if ((ct_rsp->header.reason_code == in qla24xx_async_gpsc_sp_done()
2869 (ct_rsp->header.reason_code == in qla24xx_async_gpsc_sp_done()
2873 ha->flags.gpsc_supported = 0; in qla24xx_async_gpsc_sp_done()
2877 fcport->fp_speed = qla2x00_port_speed_capability( in qla24xx_async_gpsc_sp_done()
2878 be16_to_cpu(ct_rsp->rsp.gpsc.speed)); in qla24xx_async_gpsc_sp_done()
2881 "Async-%s OUT WWPN %8phC speeds=%04x speed=%04x.\n", in qla24xx_async_gpsc_sp_done()
2882 sp->name, fcport->fabric_port_name, in qla24xx_async_gpsc_sp_done()
2883 be16_to_cpu(ct_rsp->rsp.gpsc.speeds), in qla24xx_async_gpsc_sp_done()
2884 be16_to_cpu(ct_rsp->rsp.gpsc.speed)); in qla24xx_async_gpsc_sp_done()
2894 kref_put(&sp->cmd_kref, qla2x00_sp_release); in qla24xx_async_gpsc_sp_done()
2903 if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT)) in qla24xx_async_gpsc()
2911 sp->type = SRB_CT_PTHRU_CMD; in qla24xx_async_gpsc()
2912 sp->name = "gpsc"; in qla24xx_async_gpsc()
2913 sp->gen1 = fcport->rscn_gen; in qla24xx_async_gpsc()
2914 sp->gen2 = fcport->login_gen; in qla24xx_async_gpsc()
2919 ct_req = qla24xx_prep_ct_fm_req(fcport->ct_desc.ct_sns, GPSC_CMD, in qla24xx_async_gpsc()
2923 memcpy(ct_req->req.gpsc.port_name, fcport->fabric_port_name, in qla24xx_async_gpsc()
2926 sp->u.iocb_cmd.u.ctarg.req = fcport->ct_desc.ct_sns; in qla24xx_async_gpsc()
2927 sp->u.iocb_cmd.u.ctarg.req_dma = fcport->ct_desc.ct_sns_dma; in qla24xx_async_gpsc()
2928 sp->u.iocb_cmd.u.ctarg.rsp = fcport->ct_desc.ct_sns; in qla24xx_async_gpsc()
2929 sp->u.iocb_cmd.u.ctarg.rsp_dma = fcport->ct_desc.ct_sns_dma; in qla24xx_async_gpsc()
2930 sp->u.iocb_cmd.u.ctarg.req_size = GPSC_REQ_SIZE; in qla24xx_async_gpsc()
2931 sp->u.iocb_cmd.u.ctarg.rsp_size = GPSC_RSP_SIZE; in qla24xx_async_gpsc()
2932 sp->u.iocb_cmd.u.ctarg.nport_handle = vha->mgmt_svr_loop_id; in qla24xx_async_gpsc()
2935 "Async-%s %8phC hdl=%x loopid=%x portid=%02x%02x%02x.\n", in qla24xx_async_gpsc()
2936 sp->name, fcport->port_name, sp->handle, in qla24xx_async_gpsc()
2937 fcport->loop_id, fcport->d_id.b.domain, in qla24xx_async_gpsc()
2938 fcport->d_id.b.area, fcport->d_id.b.al_pa); in qla24xx_async_gpsc()
2947 kref_put(&sp->cmd_kref, qla2x00_sp_release); in qla24xx_async_gpsc()
2954 struct srb_iocb *c = &sp->u.iocb_cmd; in qla24xx_sp_unmap()
2956 switch (sp->type) { in qla24xx_sp_unmap()
2958 qla2x00_els_dcmd2_free(vha, &c->u.els_plogi); in qla24xx_sp_unmap()
2962 if (sp->u.iocb_cmd.u.ctarg.req) { in qla24xx_sp_unmap()
2963 dma_free_coherent(&vha->hw->pdev->dev, in qla24xx_sp_unmap()
2964 sp->u.iocb_cmd.u.ctarg.req_allocated_size, in qla24xx_sp_unmap()
2965 sp->u.iocb_cmd.u.ctarg.req, in qla24xx_sp_unmap()
2966 sp->u.iocb_cmd.u.ctarg.req_dma); in qla24xx_sp_unmap()
2967 sp->u.iocb_cmd.u.ctarg.req = NULL; in qla24xx_sp_unmap()
2970 if (sp->u.iocb_cmd.u.ctarg.rsp) { in qla24xx_sp_unmap()
2971 dma_free_coherent(&vha->hw->pdev->dev, in qla24xx_sp_unmap()
2972 sp->u.iocb_cmd.u.ctarg.rsp_allocated_size, in qla24xx_sp_unmap()
2973 sp->u.iocb_cmd.u.ctarg.rsp, in qla24xx_sp_unmap()
2974 sp->u.iocb_cmd.u.ctarg.rsp_dma); in qla24xx_sp_unmap()
2975 sp->u.iocb_cmd.u.ctarg.rsp = NULL; in qla24xx_sp_unmap()
2981 kref_put(&sp->cmd_kref, qla2x00_sp_release); in qla24xx_sp_unmap()
2986 struct scsi_qla_host *vha = sp->vha; in qla24xx_async_gffid_sp_done()
2987 fc_port_t *fcport = sp->fcport; in qla24xx_async_gffid_sp_done()
2993 "Async done-%s res %x ID %x. %8phC\n", in qla24xx_async_gffid_sp_done()
2994 sp->name, res, fcport->d_id.b24, fcport->port_name); in qla24xx_async_gffid_sp_done()
2996 ct_rsp = sp->u.iocb_cmd.u.ctarg.rsp; in qla24xx_async_gffid_sp_done()
2997 fc4_scsi_feat = ct_rsp->rsp.gff_id.fc4_features[GFF_FCP_SCSI_OFFSET]; in qla24xx_async_gffid_sp_done()
2998 fc4_nvme_feat = ct_rsp->rsp.gff_id.fc4_features[GFF_NVME_OFFSET]; in qla24xx_async_gffid_sp_done()
2999 sp->rc = res; in qla24xx_async_gffid_sp_done()
3002 * FC-GS-7, 5.2.3.12 FC-4 Features - format in qla24xx_async_gffid_sp_done()
3003 * The format of the FC-4 Features object, as defined by the FC-4, in qla24xx_async_gffid_sp_done()
3004 * Shall be an array of 4-bit values, one for each type code value in qla24xx_async_gffid_sp_done()
3009 fcport->fc4_type = FS_FC4TYPE_FCP; in qla24xx_async_gffid_sp_done()
3010 fcport->fc4_features = fc4_scsi_feat & 0xf; in qla24xx_async_gffid_sp_done()
3015 fcport->fc4_type |= FS_FC4TYPE_NVME; in qla24xx_async_gffid_sp_done()
3016 fcport->fc4_features = fc4_nvme_feat & 0xf; in qla24xx_async_gffid_sp_done()
3020 if (sp->flags & SRB_WAKEUP_ON_COMP) { in qla24xx_async_gffid_sp_done()
3021 complete(sp->comp); in qla24xx_async_gffid_sp_done()
3023 if (sp->u.iocb_cmd.u.ctarg.req) { in qla24xx_async_gffid_sp_done()
3024 dma_free_coherent(&vha->hw->pdev->dev, in qla24xx_async_gffid_sp_done()
3025 sp->u.iocb_cmd.u.ctarg.req_allocated_size, in qla24xx_async_gffid_sp_done()
3026 sp->u.iocb_cmd.u.ctarg.req, in qla24xx_async_gffid_sp_done()
3027 sp->u.iocb_cmd.u.ctarg.req_dma); in qla24xx_async_gffid_sp_done()
3028 sp->u.iocb_cmd.u.ctarg.req = NULL; in qla24xx_async_gffid_sp_done()
3031 if (sp->u.iocb_cmd.u.ctarg.rsp) { in qla24xx_async_gffid_sp_done()
3032 dma_free_coherent(&vha->hw->pdev->dev, in qla24xx_async_gffid_sp_done()
3033 sp->u.iocb_cmd.u.ctarg.rsp_allocated_size, in qla24xx_async_gffid_sp_done()
3034 sp->u.iocb_cmd.u.ctarg.rsp, in qla24xx_async_gffid_sp_done()
3035 sp->u.iocb_cmd.u.ctarg.rsp_dma); in qla24xx_async_gffid_sp_done()
3036 sp->u.iocb_cmd.u.ctarg.rsp = NULL; in qla24xx_async_gffid_sp_done()
3040 kref_put(&sp->cmd_kref, qla2x00_sp_release); in qla24xx_async_gffid_sp_done()
3055 if (!vha->flags.online || !wait) in qla24xx_async_gffid()
3063 sp->type = SRB_CT_PTHRU_CMD; in qla24xx_async_gffid()
3064 sp->name = "gffid"; in qla24xx_async_gffid()
3065 sp->gen1 = fcport->rscn_gen; in qla24xx_async_gffid()
3066 sp->gen2 = fcport->login_gen; in qla24xx_async_gffid()
3069 sp->comp = &comp; in qla24xx_async_gffid()
3070 sp->u.iocb_cmd.timeout = qla2x00_els_dcmd2_iocb_timeout; in qla24xx_async_gffid()
3073 sp->flags = SRB_WAKEUP_ON_COMP; in qla24xx_async_gffid()
3075 sp->u.iocb_cmd.u.ctarg.req_allocated_size = sizeof(struct ct_sns_pkt); in qla24xx_async_gffid()
3076 sp->u.iocb_cmd.u.ctarg.req = dma_alloc_coherent(&vha->hw->pdev->dev, in qla24xx_async_gffid()
3077 sp->u.iocb_cmd.u.ctarg.req_allocated_size, in qla24xx_async_gffid()
3078 &sp->u.iocb_cmd.u.ctarg.req_dma, in qla24xx_async_gffid()
3080 if (!sp->u.iocb_cmd.u.ctarg.req) { in qla24xx_async_gffid()
3087 sp->u.iocb_cmd.u.ctarg.rsp_allocated_size = sizeof(struct ct_sns_pkt); in qla24xx_async_gffid()
3088 sp->u.iocb_cmd.u.ctarg.rsp = dma_alloc_coherent(&vha->hw->pdev->dev, in qla24xx_async_gffid()
3089 sp->u.iocb_cmd.u.ctarg.rsp_allocated_size, in qla24xx_async_gffid()
3090 &sp->u.iocb_cmd.u.ctarg.rsp_dma, in qla24xx_async_gffid()
3092 if (!sp->u.iocb_cmd.u.ctarg.rsp) { in qla24xx_async_gffid()
3100 ct_req = qla2x00_prep_ct_req(sp->u.iocb_cmd.u.ctarg.req, GFF_ID_CMD, GFF_ID_RSP_SIZE); in qla24xx_async_gffid()
3102 ct_req->req.gff_id.port_id[0] = fcport->d_id.b.domain; in qla24xx_async_gffid()
3103 ct_req->req.gff_id.port_id[1] = fcport->d_id.b.area; in qla24xx_async_gffid()
3104 ct_req->req.gff_id.port_id[2] = fcport->d_id.b.al_pa; in qla24xx_async_gffid()
3106 sp->u.iocb_cmd.u.ctarg.req_size = GFF_ID_REQ_SIZE; in qla24xx_async_gffid()
3107 sp->u.iocb_cmd.u.ctarg.rsp_size = GFF_ID_RSP_SIZE; in qla24xx_async_gffid()
3108 sp->u.iocb_cmd.u.ctarg.nport_handle = NPH_SNS; in qla24xx_async_gffid()
3117 "Async-%s hdl=%x portid %06x\n", in qla24xx_async_gffid()
3118 sp->name, sp->handle, fcport->d_id.b24); in qla24xx_async_gffid()
3121 wait_for_completion(sp->comp); in qla24xx_async_gffid()
3122 rval = sp->rc; in qla24xx_async_gffid()
3125 if (sp->u.iocb_cmd.u.ctarg.req) { in qla24xx_async_gffid()
3126 dma_free_coherent(&vha->hw->pdev->dev, in qla24xx_async_gffid()
3127 sp->u.iocb_cmd.u.ctarg.req_allocated_size, in qla24xx_async_gffid()
3128 sp->u.iocb_cmd.u.ctarg.req, in qla24xx_async_gffid()
3129 sp->u.iocb_cmd.u.ctarg.req_dma); in qla24xx_async_gffid()
3130 sp->u.iocb_cmd.u.ctarg.req = NULL; in qla24xx_async_gffid()
3133 if (sp->u.iocb_cmd.u.ctarg.rsp) { in qla24xx_async_gffid()
3134 dma_free_coherent(&vha->hw->pdev->dev, in qla24xx_async_gffid()
3135 sp->u.iocb_cmd.u.ctarg.rsp_allocated_size, in qla24xx_async_gffid()
3136 sp->u.iocb_cmd.u.ctarg.rsp, in qla24xx_async_gffid()
3137 sp->u.iocb_cmd.u.ctarg.rsp_dma); in qla24xx_async_gffid()
3138 sp->u.iocb_cmd.u.ctarg.rsp = NULL; in qla24xx_async_gffid()
3142 kref_put(&sp->cmd_kref, qla2x00_sp_release); in qla24xx_async_gffid()
3149 struct qla_hw_data *ha = vha->hw; in qla2x00_is_a_vp()
3155 if (!ha->num_vhosts) in qla2x00_is_a_vp()
3158 spin_lock_irqsave(&ha->vport_slock, flags); in qla2x00_is_a_vp()
3159 list_for_each_entry(vp, &ha->vp_list, list) { in qla2x00_is_a_vp()
3160 twwn = wwn_to_u64(vp->port_name); in qla2x00_is_a_vp()
3166 spin_unlock_irqrestore(&ha->vport_slock, flags); in qla2x00_is_a_vp()
3175 rscn_gen = atomic_read(&vha->rscn_gen); in qla_ok_to_clear_rscn()
3178 __func__, __LINE__, fcport->port_name, fcport->rscn_gen, in qla_ok_to_clear_rscn()
3179 vha->scan.rscn_gen_start, vha->scan.rscn_gen_end, rscn_gen); in qla_ok_to_clear_rscn()
3181 if (val_is_in_range(fcport->rscn_gen, vha->scan.rscn_gen_start, in qla_ok_to_clear_rscn()
3182 vha->scan.rscn_gen_end)) in qla_ok_to_clear_rscn()
3183 /* rscn came in before fabric scan */ in qla_ok_to_clear_rscn()
3186 if (val_is_in_range(fcport->rscn_gen, vha->scan.rscn_gen_end, rscn_gen)) in qla_ok_to_clear_rscn()
3187 /* rscn came in after fabric scan */ in qla_ok_to_clear_rscn()
3207 if (sp->gen1 != vha->hw->base_qpair->chip_reset) { in qla_fab_scan_finish()
3209 "%s scan stop due to chip reset %x/%x\n", in qla_fab_scan_finish()
3210 sp->name, sp->gen1, vha->hw->base_qpair->chip_reset); in qla_fab_scan_finish()
3214 rc = sp->rc; in qla_fab_scan_finish()
3216 vha->scan.scan_retry++; in qla_fab_scan_finish()
3217 if (vha->scan.scan_retry < MAX_SCAN_RETRIES) { in qla_fab_scan_finish()
3218 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); in qla_fab_scan_finish()
3219 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); in qla_fab_scan_finish()
3223 "%s: Fabric scan failed for %d retries.\n", in qla_fab_scan_finish()
3224 __func__, vha->scan.scan_retry); in qla_fab_scan_finish()
3226 * Unable to scan any rports. logout loop below in qla_fab_scan_finish()
3229 list_for_each_entry(fcport, &vha->vp_fcports, list) { in qla_fab_scan_finish()
3230 if ((fcport->flags & FCF_FABRIC_DEVICE) != 0) { in qla_fab_scan_finish()
3231 fcport->scan_state = QLA_FCPORT_SCAN; in qla_fab_scan_finish()
3232 if (fcport->loop_id == FC_NO_LOOP_ID) in qla_fab_scan_finish()
3233 fcport->logout_on_delete = 0; in qla_fab_scan_finish()
3235 fcport->logout_on_delete = 1; in qla_fab_scan_finish()
3241 vha->scan.scan_retry = 0; in qla_fab_scan_finish()
3243 list_for_each_entry(fcport, &vha->vp_fcports, list) in qla_fab_scan_finish()
3244 fcport->scan_state = QLA_FCPORT_SCAN; in qla_fab_scan_finish()
3246 for (i = 0; i < vha->hw->max_fibre_devices; i++) { in qla_fab_scan_finish()
3250 rp = &vha->scan.l[i]; in qla_fab_scan_finish()
3253 wwn = wwn_to_u64(rp->port_name); in qla_fab_scan_finish()
3258 for (k = i + 1; k < vha->hw->max_fibre_devices; k++) { in qla_fab_scan_finish()
3259 trp = &vha->scan.l[k]; in qla_fab_scan_finish()
3260 if (rp->id.b24 == trp->id.b24) { in qla_fab_scan_finish()
3266 rp->id.b24, rp->port_name, trp->port_name); in qla_fab_scan_finish()
3271 if (!memcmp(rp->port_name, vha->port_name, WWN_SIZE)) in qla_fab_scan_finish()
3275 if ((rp->id.b.domain & 0xf0) == 0xf0) in qla_fab_scan_finish()
3282 list_for_each_entry(fcport, &vha->vp_fcports, list) { in qla_fab_scan_finish()
3283 if (memcmp(rp->port_name, fcport->port_name, WWN_SIZE)) in qla_fab_scan_finish()
3285 fcport->scan_state = QLA_FCPORT_FOUND; in qla_fab_scan_finish()
3286 fcport->last_rscn_gen = fcport->rscn_gen; in qla_fab_scan_finish()
3287 fcport->fc4_type = rp->fc4type; in qla_fab_scan_finish()
3290 if (fcport->scan_needed) { in qla_fab_scan_finish()
3291 if (NVME_PRIORITY(vha->hw, fcport)) in qla_fab_scan_finish()
3292 fcport->do_prli_nvme = 1; in qla_fab_scan_finish()
3294 fcport->do_prli_nvme = 0; in qla_fab_scan_finish()
3300 if ((fcport->flags & FCF_FABRIC_DEVICE) == 0) { in qla_fab_scan_finish()
3302 fcport->flags |= FCF_FABRIC_DEVICE; in qla_fab_scan_finish()
3303 } else if (fcport->d_id.b24 != rp->id.b24 || in qla_fab_scan_finish()
3304 (fcport->scan_needed && in qla_fab_scan_finish()
3305 fcport->port_type != FCT_INITIATOR && in qla_fab_scan_finish()
3306 fcport->port_type != FCT_NVME_INITIATOR)) { in qla_fab_scan_finish()
3307 fcport->scan_needed = 0; in qla_fab_scan_finish()
3310 fcport->d_id.b24 = rp->id.b24; in qla_fab_scan_finish()
3317 __func__, __LINE__, rp->port_name); in qla_fab_scan_finish()
3318 qla24xx_post_newsess_work(vha, &rp->id, rp->port_name, in qla_fab_scan_finish()
3319 rp->node_name, NULL, rp->fc4type); in qla_fab_scan_finish()
3333 list_for_each_entry(fcport, &vha->vp_fcports, list) { in qla_fab_scan_finish()
3334 if ((fcport->flags & FCF_FABRIC_DEVICE) == 0) { in qla_fab_scan_finish()
3335 fcport->scan_needed = 0; in qla_fab_scan_finish()
3339 if (fcport->scan_state != QLA_FCPORT_FOUND) { in qla_fab_scan_finish()
3342 if (fcport->scan_needed && in qla_fab_scan_finish()
3343 fcport->disc_state == DSC_LOGIN_PEND) { in qla_fab_scan_finish()
3347 fcport->logout_on_delete = 1; in qla_fab_scan_finish()
3352 fcport->scan_needed = 0; in qla_fab_scan_finish()
3356 atomic_read(&fcport->state) == FCS_ONLINE) || in qla_fab_scan_finish()
3358 if (fcport->loop_id != FC_NO_LOOP_ID) { in qla_fab_scan_finish()
3359 if (fcport->flags & FCF_FCP2_DEVICE) in qla_fab_scan_finish()
3365 fcport->port_name); in qla_fab_scan_finish()
3367 fcport->tgt_link_down_time = 0; in qla_fab_scan_finish()
3373 if (fcport->scan_needed || in qla_fab_scan_finish()
3374 fcport->disc_state != DSC_LOGIN_COMPLETE) { in qla_fab_scan_finish()
3375 if (fcport->login_retry == 0) { in qla_fab_scan_finish()
3376 fcport->login_retry = in qla_fab_scan_finish()
3377 vha->hw->login_retry_count; in qla_fab_scan_finish()
3380 fcport->port_name, fcport->loop_id, in qla_fab_scan_finish()
3381 fcport->login_retry); in qla_fab_scan_finish()
3385 fcport->scan_needed = 0; in qla_fab_scan_finish()
3394 spin_lock_irqsave(&vha->work_lock, flags); in qla_fab_scan_finish()
3395 vha->scan.scan_flags &= ~SF_SCANNING; in qla_fab_scan_finish()
3396 spin_unlock_irqrestore(&vha->work_lock, flags); in qla_fab_scan_finish()
3399 list_for_each_entry(fcport, &vha->vp_fcports, list) { in qla_fab_scan_finish()
3400 if (fcport->scan_needed) { in qla_fab_scan_finish()
3401 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); in qla_fab_scan_finish()
3402 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); in qla_fab_scan_finish()
3418 e->u.iosb.sp = sp; in qla2x00_post_next_scan_work()
3426 struct qla_hw_data *ha = vha->hw; in qla2x00_find_free_fcp_nvme_slot()
3427 int num_fibre_dev = ha->max_fibre_devices; in qla2x00_find_free_fcp_nvme_slot()
3429 (struct ct_sns_gpnft_rsp *)sp->u.iocb_cmd.u.ctarg.rsp; in qla2x00_find_free_fcp_nvme_slot()
3439 d = &ct_rsp->entries[i]; in qla2x00_find_free_fcp_nvme_slot()
3442 id.b.domain = d->port_id[0]; in qla2x00_find_free_fcp_nvme_slot()
3443 id.b.area = d->port_id[1]; in qla2x00_find_free_fcp_nvme_slot()
3444 id.b.al_pa = d->port_id[2]; in qla2x00_find_free_fcp_nvme_slot()
3445 wwn = wwn_to_u64(d->port_name); in qla2x00_find_free_fcp_nvme_slot()
3452 __func__, id.b24, d->port_name); in qla2x00_find_free_fcp_nvme_slot()
3454 switch (vha->scan.step) { in qla2x00_find_free_fcp_nvme_slot()
3456 rp = &vha->scan.l[j]; in qla2x00_find_free_fcp_nvme_slot()
3457 rp->id = id; in qla2x00_find_free_fcp_nvme_slot()
3458 memcpy(rp->port_name, d->port_name, 8); in qla2x00_find_free_fcp_nvme_slot()
3460 rp->fc4type = FS_FC4TYPE_FCP; in qla2x00_find_free_fcp_nvme_slot()
3464 rp = &vha->scan.l[k]; in qla2x00_find_free_fcp_nvme_slot()
3465 if (id.b24 == rp->id.b24) { in qla2x00_find_free_fcp_nvme_slot()
3466 memcpy(rp->node_name, in qla2x00_find_free_fcp_nvme_slot()
3467 d->port_name, 8); in qla2x00_find_free_fcp_nvme_slot()
3476 rp = &vha->scan.l[k]; in qla2x00_find_free_fcp_nvme_slot()
3477 if (!memcmp(rp->port_name, d->port_name, 8)) { in qla2x00_find_free_fcp_nvme_slot()
3479 * Supports FC-NVMe & FCP in qla2x00_find_free_fcp_nvme_slot()
3481 rp->fc4type |= FS_FC4TYPE_NVME; in qla2x00_find_free_fcp_nvme_slot()
3487 /* We found new FC-NVMe only port */ in qla2x00_find_free_fcp_nvme_slot()
3490 rp = &vha->scan.l[k]; in qla2x00_find_free_fcp_nvme_slot()
3491 if (wwn_to_u64(rp->port_name)) { in qla2x00_find_free_fcp_nvme_slot()
3494 rp->id = id; in qla2x00_find_free_fcp_nvme_slot()
3495 memcpy(rp->port_name, d->port_name, 8); in qla2x00_find_free_fcp_nvme_slot()
3496 rp->fc4type = FS_FC4TYPE_NVME; in qla2x00_find_free_fcp_nvme_slot()
3504 rp = &vha->scan.l[k]; in qla2x00_find_free_fcp_nvme_slot()
3505 if (id.b24 == rp->id.b24) { in qla2x00_find_free_fcp_nvme_slot()
3506 memcpy(rp->node_name, d->port_name, 8); in qla2x00_find_free_fcp_nvme_slot()
3519 struct scsi_qla_host *vha = sp->vha; in qla_async_scan_sp_done()
3525 "Async done-%s res %x step %x\n", in qla_async_scan_sp_done()
3526 sp->name, res, vha->scan.step); in qla_async_scan_sp_done()
3528 sp->rc = res; in qla_async_scan_sp_done()
3531 const char *name = sp->name; in qla_async_scan_sp_done()
3555 spin_lock_irqsave(&vha->work_lock, flags); in qla_async_scan_sp_done()
3556 vha->scan.scan_flags &= ~SF_SCANNING; in qla_async_scan_sp_done()
3557 vha->scan.scan_retry++; in qla_async_scan_sp_done()
3558 spin_unlock_irqrestore(&vha->work_lock, flags); in qla_async_scan_sp_done()
3560 if (vha->scan.scan_retry < MAX_SCAN_RETRIES) { in qla_async_scan_sp_done()
3561 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); in qla_async_scan_sp_done()
3562 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); in qla_async_scan_sp_done()
3566 "Async done-%s rescan failed on all retries.\n", in qla_async_scan_sp_done()
3575 spin_lock_irqsave(&vha->work_lock, flags); in qla_async_scan_sp_done()
3576 vha->scan.scan_flags &= ~SF_SCANNING; in qla_async_scan_sp_done()
3577 spin_unlock_irqrestore(&vha->work_lock, flags); in qla_async_scan_sp_done()
3579 switch (vha->scan.step) { in qla_async_scan_sp_done()
3585 if (vha->flags.nvme_enabled) in qla_async_scan_sp_done()
3603 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); in qla_async_scan_sp_done()
3604 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); in qla_async_scan_sp_done()
3621 if (!vha->flags.online) in qla_fab_async_scan()
3624 spin_lock_irqsave(&vha->work_lock, flags); in qla_fab_async_scan()
3625 if (vha->scan.scan_flags & SF_SCANNING) { in qla_fab_async_scan()
3626 spin_unlock_irqrestore(&vha->work_lock, flags); in qla_fab_async_scan()
3628 "%s: scan active\n", __func__); in qla_fab_async_scan()
3631 vha->scan.scan_flags |= SF_SCANNING; in qla_fab_async_scan()
3633 vha->scan.step = FAB_SCAN_START; in qla_fab_async_scan()
3635 spin_unlock_irqrestore(&vha->work_lock, flags); in qla_fab_async_scan()
3637 switch (vha->scan.step) { in qla_fab_async_scan()
3640 "%s: Performing FCP Scan\n", __func__); in qla_fab_async_scan()
3645 spin_lock_irqsave(&vha->work_lock, flags); in qla_fab_async_scan()
3646 vha->scan.scan_flags &= ~SF_SCANNING; in qla_fab_async_scan()
3647 spin_unlock_irqrestore(&vha->work_lock, flags); in qla_fab_async_scan()
3651 sp->u.iocb_cmd.u.ctarg.req = dma_alloc_coherent(&vha->hw->pdev->dev, in qla_fab_async_scan()
3653 &sp->u.iocb_cmd.u.ctarg.req_dma, in qla_fab_async_scan()
3655 sp->u.iocb_cmd.u.ctarg.req_allocated_size = sizeof(struct ct_sns_pkt); in qla_fab_async_scan()
3656 if (!sp->u.iocb_cmd.u.ctarg.req) { in qla_fab_async_scan()
3659 spin_lock_irqsave(&vha->work_lock, flags); in qla_fab_async_scan()
3660 vha->scan.scan_flags &= ~SF_SCANNING; in qla_fab_async_scan()
3661 spin_unlock_irqrestore(&vha->work_lock, flags); in qla_fab_async_scan()
3667 vha->hw->max_fibre_devices * in qla_fab_async_scan()
3670 sp->u.iocb_cmd.u.ctarg.rsp = dma_alloc_coherent(&vha->hw->pdev->dev, in qla_fab_async_scan()
3672 &sp->u.iocb_cmd.u.ctarg.rsp_dma, in qla_fab_async_scan()
3674 sp->u.iocb_cmd.u.ctarg.rsp_allocated_size = rspsz; in qla_fab_async_scan()
3675 if (!sp->u.iocb_cmd.u.ctarg.rsp) { in qla_fab_async_scan()
3678 spin_lock_irqsave(&vha->work_lock, flags); in qla_fab_async_scan()
3679 vha->scan.scan_flags &= ~SF_SCANNING; in qla_fab_async_scan()
3680 spin_unlock_irqrestore(&vha->work_lock, flags); in qla_fab_async_scan()
3681 dma_free_coherent(&vha->hw->pdev->dev, in qla_fab_async_scan()
3682 sp->u.iocb_cmd.u.ctarg.req_allocated_size, in qla_fab_async_scan()
3683 sp->u.iocb_cmd.u.ctarg.req, in qla_fab_async_scan()
3684 sp->u.iocb_cmd.u.ctarg.req_dma); in qla_fab_async_scan()
3685 sp->u.iocb_cmd.u.ctarg.req = NULL; in qla_fab_async_scan()
3690 sp->u.iocb_cmd.u.ctarg.rsp_size = rspsz; in qla_fab_async_scan()
3693 "%s scan list size %d\n", __func__, vha->scan.size); in qla_fab_async_scan()
3695 memset(vha->scan.l, 0, vha->scan.size); in qla_fab_async_scan()
3697 vha->scan.step = FAB_SCAN_GPNFT_FCP; in qla_fab_async_scan()
3700 vha->scan.step = FAB_SCAN_GNNFT_FCP; in qla_fab_async_scan()
3703 vha->scan.step = FAB_SCAN_GPNFT_NVME; in qla_fab_async_scan()
3706 vha->scan.step = FAB_SCAN_GNNFT_NVME; in qla_fab_async_scan()
3717 "scan did not provide SP\n"); in qla_fab_async_scan()
3720 if (!sp->u.iocb_cmd.u.ctarg.req || !sp->u.iocb_cmd.u.ctarg.rsp) { in qla_fab_async_scan()
3723 __func__, sp->u.iocb_cmd.u.ctarg.req, in qla_fab_async_scan()
3724 sp->u.iocb_cmd.u.ctarg.rsp); in qla_fab_async_scan()
3725 spin_lock_irqsave(&vha->work_lock, flags); in qla_fab_async_scan()
3726 vha->scan.scan_flags &= ~SF_SCANNING; in qla_fab_async_scan()
3727 spin_unlock_irqrestore(&vha->work_lock, flags); in qla_fab_async_scan()
3729 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); in qla_fab_async_scan()
3730 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); in qla_fab_async_scan()
3734 rspsz = sp->u.iocb_cmd.u.ctarg.rsp_size; in qla_fab_async_scan()
3735 memset(sp->u.iocb_cmd.u.ctarg.req, 0, sp->u.iocb_cmd.u.ctarg.req_size); in qla_fab_async_scan()
3736 memset(sp->u.iocb_cmd.u.ctarg.rsp, 0, sp->u.iocb_cmd.u.ctarg.rsp_size); in qla_fab_async_scan()
3739 sp->type = SRB_CT_PTHRU_CMD; in qla_fab_async_scan()
3740 sp->gen1 = vha->hw->base_qpair->chip_reset; in qla_fab_async_scan()
3744 ct_sns = (struct ct_sns_pkt *)sp->u.iocb_cmd.u.ctarg.req; in qla_fab_async_scan()
3747 switch (vha->scan.step) { in qla_fab_async_scan()
3749 sp->name = "gpnft"; in qla_fab_async_scan()
3751 ct_req->req.gpn_ft.port_type = FC4_TYPE_FCP_SCSI; in qla_fab_async_scan()
3752 sp->u.iocb_cmd.u.ctarg.req_size = GPN_FT_REQ_SIZE; in qla_fab_async_scan()
3755 sp->name = "gnnft"; in qla_fab_async_scan()
3757 ct_req->req.gpn_ft.port_type = FC4_TYPE_FCP_SCSI; in qla_fab_async_scan()
3758 sp->u.iocb_cmd.u.ctarg.req_size = GNN_FT_REQ_SIZE; in qla_fab_async_scan()
3761 sp->name = "gpnft"; in qla_fab_async_scan()
3763 ct_req->req.gpn_ft.port_type = FC4_TYPE_NVME; in qla_fab_async_scan()
3764 sp->u.iocb_cmd.u.ctarg.req_size = GPN_FT_REQ_SIZE; in qla_fab_async_scan()
3767 sp->name = "gnnft"; in qla_fab_async_scan()
3769 ct_req->req.gpn_ft.port_type = FC4_TYPE_NVME; in qla_fab_async_scan()
3770 sp->u.iocb_cmd.u.ctarg.req_size = GNN_FT_REQ_SIZE; in qla_fab_async_scan()
3778 sp->u.iocb_cmd.u.ctarg.nport_handle = NPH_SNS; in qla_fab_async_scan()
3782 __func__, vha->scan.step, sp->u.iocb_cmd.u.ctarg.rsp_size, in qla_fab_async_scan()
3783 sp->u.iocb_cmd.u.ctarg.req_size, sp->handle, sp->name, in qla_fab_async_scan()
3784 ct_req->req.gpn_ft.port_type); in qla_fab_async_scan()
3794 if (sp->u.iocb_cmd.u.ctarg.req) { in qla_fab_async_scan()
3795 dma_free_coherent(&vha->hw->pdev->dev, in qla_fab_async_scan()
3796 sp->u.iocb_cmd.u.ctarg.req_allocated_size, in qla_fab_async_scan()
3797 sp->u.iocb_cmd.u.ctarg.req, in qla_fab_async_scan()
3798 sp->u.iocb_cmd.u.ctarg.req_dma); in qla_fab_async_scan()
3799 sp->u.iocb_cmd.u.ctarg.req = NULL; in qla_fab_async_scan()
3801 if (sp->u.iocb_cmd.u.ctarg.rsp) { in qla_fab_async_scan()
3802 dma_free_coherent(&vha->hw->pdev->dev, in qla_fab_async_scan()
3803 sp->u.iocb_cmd.u.ctarg.rsp_allocated_size, in qla_fab_async_scan()
3804 sp->u.iocb_cmd.u.ctarg.rsp, in qla_fab_async_scan()
3805 sp->u.iocb_cmd.u.ctarg.rsp_dma); in qla_fab_async_scan()
3806 sp->u.iocb_cmd.u.ctarg.rsp = NULL; in qla_fab_async_scan()
3810 kref_put(&sp->cmd_kref, qla2x00_sp_release); in qla_fab_async_scan()
3812 spin_lock_irqsave(&vha->work_lock, flags); in qla_fab_async_scan()
3813 vha->scan.scan_flags &= ~SF_SCANNING; in qla_fab_async_scan()
3814 if (vha->scan.scan_flags == 0) { in qla_fab_async_scan()
3816 "%s: Scan scheduled.\n", __func__); in qla_fab_async_scan()
3817 vha->scan.scan_flags |= SF_QUEUED; in qla_fab_async_scan()
3818 schedule_delayed_work(&vha->scan.scan_work, 5); in qla_fab_async_scan()
3820 spin_unlock_irqrestore(&vha->work_lock, flags); in qla_fab_async_scan()
3832 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); in qla_fab_scan_start()
3840 scan); in qla_scan_work_fn()
3845 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); in qla_scan_work_fn()
3846 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); in qla_scan_work_fn()
3848 spin_lock_irqsave(&vha->work_lock, flags); in qla_scan_work_fn()
3849 vha->scan.scan_flags &= ~SF_QUEUED; in qla_scan_work_fn()
3850 spin_unlock_irqrestore(&vha->work_lock, flags); in qla_scan_work_fn()
3856 fc_port_t *fcport = ea->fcport; in qla24xx_handle_gfpnid_event()
3860 __func__, fcport->port_name, fcport->disc_state, in qla24xx_handle_gfpnid_event()
3861 fcport->fw_login_state, ea->rc, fcport->login_gen, ea->sp->gen2, in qla24xx_handle_gfpnid_event()
3862 fcport->rscn_gen, ea->sp->gen1, vha->fcport_count); in qla24xx_handle_gfpnid_event()
3864 if (fcport->disc_state == DSC_DELETE_PEND) in qla24xx_handle_gfpnid_event()
3867 if (ea->sp->gen2 != fcport->login_gen) { in qla24xx_handle_gfpnid_event()
3871 __func__, fcport->port_name); in qla24xx_handle_gfpnid_event()
3873 } else if (ea->sp->gen1 != fcport->rscn_gen) { in qla24xx_handle_gfpnid_event()
3882 struct scsi_qla_host *vha = sp->vha; in qla2x00_async_gfpnid_sp_done()
3883 fc_port_t *fcport = sp->fcport; in qla2x00_async_gfpnid_sp_done()
3884 u8 *fpn = fcport->ct_desc.ct_sns->p.rsp.rsp.gfpn_id.port_name; in qla2x00_async_gfpnid_sp_done()
3890 memcpy(fcport->fabric_port_name, fpn, WWN_SIZE); in qla2x00_async_gfpnid_sp_done()
3898 "Async done-%s res %x, WWPN %8phC %8phC\n", in qla2x00_async_gfpnid_sp_done()
3899 sp->name, res, fcport->port_name, fcport->fabric_port_name); in qla2x00_async_gfpnid_sp_done()
3904 kref_put(&sp->cmd_kref, qla2x00_sp_release); in qla2x00_async_gfpnid_sp_done()
3913 if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT)) in qla24xx_async_gfpnid()
3921 sp->type = SRB_CT_PTHRU_CMD; in qla24xx_async_gfpnid()
3922 sp->name = "gfpnid"; in qla24xx_async_gfpnid()
3923 sp->gen1 = fcport->rscn_gen; in qla24xx_async_gfpnid()
3924 sp->gen2 = fcport->login_gen; in qla24xx_async_gfpnid()
3929 ct_req = qla2x00_prep_ct_req(fcport->ct_desc.ct_sns, GFPN_ID_CMD, in qla24xx_async_gfpnid()
3933 ct_req->req.port_id.port_id = port_id_to_be_id(fcport->d_id); in qla24xx_async_gfpnid()
3937 sp->u.iocb_cmd.u.ctarg.req = fcport->ct_desc.ct_sns; in qla24xx_async_gfpnid()
3938 sp->u.iocb_cmd.u.ctarg.req_dma = fcport->ct_desc.ct_sns_dma; in qla24xx_async_gfpnid()
3939 sp->u.iocb_cmd.u.ctarg.rsp = fcport->ct_desc.ct_sns; in qla24xx_async_gfpnid()
3940 sp->u.iocb_cmd.u.ctarg.rsp_dma = fcport->ct_desc.ct_sns_dma; in qla24xx_async_gfpnid()
3941 sp->u.iocb_cmd.u.ctarg.req_size = GFPN_ID_REQ_SIZE; in qla24xx_async_gfpnid()
3942 sp->u.iocb_cmd.u.ctarg.rsp_size = GFPN_ID_RSP_SIZE; in qla24xx_async_gfpnid()
3943 sp->u.iocb_cmd.u.ctarg.nport_handle = NPH_SNS; in qla24xx_async_gfpnid()
3946 "Async-%s - %8phC hdl=%x loopid=%x portid %06x.\n", in qla24xx_async_gfpnid()
3947 sp->name, fcport->port_name, in qla24xx_async_gfpnid()
3948 sp->handle, fcport->loop_id, fcport->d_id.b24); in qla24xx_async_gfpnid()
3958 kref_put(&sp->cmd_kref, qla2x00_sp_release); in qla24xx_async_gfpnid()
3968 ls = atomic_read(&vha->loop_state); in qla24xx_post_gfpnid_work()
3970 test_bit(UNLOADING, &vha->dpc_flags)) in qla24xx_post_gfpnid_work()
3977 e->u.fcport.fcport = fcport; in qla24xx_post_gfpnid_work()