Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

scsi: lpfc: vmid: Implement CT commands for appid

Implement CT commands for registering and deregistering the appid for the
application. Also, a small change in decrementing the ndlp ref counter has
been added.

Link: https://lore.kernel.org/r/20210608043556.274139-10-muneendra.kumar@broadcom.com
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Gaurav Srivastava <gaurav.srivastava@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Muneendra Kumar <muneendra.kumar@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by

Gaurav Srivastava and committed by
Martin K. Petersen
742b0cf8 dc50715e

+255
+255
drivers/scsi/lpfc/lpfc_ct.c
··· 75 75 76 76 77 77 static char *lpfc_release_version = LPFC_DRIVER_VERSION; 78 + static void 79 + lpfc_cmpl_ct_cmd_vmid(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, 80 + struct lpfc_iocbq *rspiocb); 78 81 79 82 static void 80 83 lpfc_ct_ignore_hbq_buffer(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq, ··· 3779 3776 sprintf(fwrevision, "%d.%d%d%c%d", b1, b2, b3, c, b4); 3780 3777 } 3781 3778 return; 3779 + } 3780 + 3781 + static void 3782 + lpfc_cmpl_ct_cmd_vmid(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, 3783 + struct lpfc_iocbq *rspiocb) 3784 + { 3785 + struct lpfc_vport *vport = cmdiocb->vport; 3786 + struct lpfc_dmabuf *inp = cmdiocb->context1; 3787 + struct lpfc_dmabuf *outp = cmdiocb->context2; 3788 + struct lpfc_sli_ct_request *ctcmd = inp->virt; 3789 + struct lpfc_sli_ct_request *ctrsp = outp->virt; 3790 + u16 rsp = ctrsp->CommandResponse.bits.CmdRsp; 3791 + struct app_id_object *app; 3792 + u32 cmd, hash, bucket; 3793 + struct lpfc_vmid *vmp, *cur; 3794 + u8 *data = outp->virt; 3795 + int i; 3796 + 3797 + cmd = be16_to_cpu(ctcmd->CommandResponse.bits.CmdRsp); 3798 + if (cmd == SLI_CTAS_DALLAPP_ID) 3799 + lpfc_ct_free_iocb(phba, cmdiocb); 3800 + 3801 + if (lpfc_els_chk_latt(vport) || rspiocb->iocb.ulpStatus) { 3802 + if (cmd != SLI_CTAS_DALLAPP_ID) 3803 + return; 3804 + } 3805 + /* Check for a CT LS_RJT response */ 3806 + if (rsp == be16_to_cpu(SLI_CT_RESPONSE_FS_RJT)) { 3807 + if (cmd != SLI_CTAS_DALLAPP_ID) 3808 + lpfc_printf_vlog(vport, KERN_DEBUG, LOG_DISCOVERY, 3809 + "3306 VMID FS_RJT Data: x%x x%x x%x\n", 3810 + cmd, ctrsp->ReasonCode, 3811 + ctrsp->Explanation); 3812 + if ((cmd != SLI_CTAS_DALLAPP_ID) || 3813 + (ctrsp->ReasonCode != SLI_CT_UNABLE_TO_PERFORM_REQ) || 3814 + (ctrsp->Explanation != SLI_CT_APP_ID_NOT_AVAILABLE)) { 3815 + /* If DALLAPP_ID failed retry later */ 3816 + if (cmd == SLI_CTAS_DALLAPP_ID) 3817 + vport->load_flag |= FC_DEREGISTER_ALL_APP_ID; 3818 + return; 3819 + } 3820 + } 3821 + 3822 + switch (cmd) { 3823 + case SLI_CTAS_RAPP_IDENT: 3824 + app = (struct app_id_object *)(RAPP_IDENT_OFFSET + data); 3825 + lpfc_printf_vlog(vport, KERN_DEBUG, LOG_DISCOVERY, 3826 + "6712 RAPP_IDENT app id %d port id x%x id " 3827 + "len %d\n", be32_to_cpu(app->app_id), 3828 + be32_to_cpu(app->port_id), 3829 + app->obj.entity_id_len); 3830 + 3831 + if (app->obj.entity_id_len == 0 || app->port_id == 0) 3832 + return; 3833 + 3834 + hash = lpfc_vmid_hash_fn(app->obj.entity_id, 3835 + app->obj.entity_id_len); 3836 + vmp = lpfc_get_vmid_from_hashtable(vport, hash, 3837 + app->obj.entity_id); 3838 + if (vmp) { 3839 + write_lock(&vport->vmid_lock); 3840 + vmp->un.app_id = be32_to_cpu(app->app_id); 3841 + vmp->flag |= LPFC_VMID_REGISTERED; 3842 + vmp->flag &= ~LPFC_VMID_REQ_REGISTER; 3843 + write_unlock(&vport->vmid_lock); 3844 + /* Set IN USE flag */ 3845 + vport->vmid_flag |= LPFC_VMID_IN_USE; 3846 + } else { 3847 + lpfc_printf_vlog(vport, KERN_DEBUG, LOG_DISCOVERY, 3848 + "6901 No entry found %s hash %d\n", 3849 + app->obj.entity_id, hash); 3850 + } 3851 + break; 3852 + case SLI_CTAS_DAPP_IDENT: 3853 + app = (struct app_id_object *)(DAPP_IDENT_OFFSET + data); 3854 + lpfc_printf_vlog(vport, KERN_DEBUG, LOG_DISCOVERY, 3855 + "6713 DAPP_IDENT app id %d port id x%x\n", 3856 + be32_to_cpu(app->app_id), 3857 + be32_to_cpu(app->port_id)); 3858 + break; 3859 + case SLI_CTAS_DALLAPP_ID: 3860 + lpfc_printf_vlog(vport, KERN_DEBUG, LOG_DISCOVERY, 3861 + "8856 Deregistered all app ids\n"); 3862 + read_lock(&vport->vmid_lock); 3863 + for (i = 0; i < phba->cfg_max_vmid; i++) { 3864 + vmp = &vport->vmid[i]; 3865 + if (vmp->flag != LPFC_VMID_SLOT_FREE) 3866 + memset(vmp, 0, sizeof(struct lpfc_vmid)); 3867 + } 3868 + read_unlock(&vport->vmid_lock); 3869 + /* for all elements in the hash table */ 3870 + if (!hash_empty(vport->hash_table)) 3871 + hash_for_each(vport->hash_table, bucket, cur, hnode) 3872 + hash_del(&cur->hnode); 3873 + vport->load_flag |= FC_ALLOW_VMID; 3874 + break; 3875 + default: 3876 + lpfc_printf_vlog(vport, KERN_DEBUG, LOG_DISCOVERY, 3877 + "8857 Invalid command code\n"); 3878 + } 3879 + } 3880 + 3881 + /** 3882 + * lpfc_vmid_cmd - Build and send a FDMI cmd to the specified NPort 3883 + * @vport: pointer to a host virtual N_Port data structure. 3884 + * @ndlp: ndlp to send FDMI cmd to (if NULL use FDMI_DID) 3885 + * cmdcode: FDMI command to send 3886 + * mask: Mask of HBA or PORT Attributes to send 3887 + * 3888 + * Builds and sends a FDMI command using the CT subsystem. 3889 + */ 3890 + int 3891 + lpfc_vmid_cmd(struct lpfc_vport *vport, 3892 + int cmdcode, struct lpfc_vmid *vmid) 3893 + { 3894 + struct lpfc_hba *phba = vport->phba; 3895 + struct lpfc_dmabuf *mp, *bmp; 3896 + struct lpfc_sli_ct_request *ctreq; 3897 + struct ulp_bde64 *bpl; 3898 + u32 size; 3899 + u32 rsp_size; 3900 + u8 *data; 3901 + struct lpfc_vmid_rapp_ident_list *rap; 3902 + struct lpfc_vmid_dapp_ident_list *dap; 3903 + u8 retry = 0; 3904 + struct lpfc_nodelist *ndlp; 3905 + 3906 + void (*cmpl)(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, 3907 + struct lpfc_iocbq *rspiocb); 3908 + 3909 + ndlp = lpfc_findnode_did(vport, FDMI_DID); 3910 + if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) 3911 + return 0; 3912 + 3913 + cmpl = lpfc_cmpl_ct_cmd_vmid; 3914 + 3915 + /* fill in BDEs for command */ 3916 + /* Allocate buffer for command payload */ 3917 + mp = kmalloc(sizeof(*mp), GFP_KERNEL); 3918 + if (!mp) 3919 + goto vmid_free_mp_exit; 3920 + 3921 + mp->virt = lpfc_mbuf_alloc(phba, 0, &mp->phys); 3922 + if (!mp->virt) 3923 + goto vmid_free_mp_virt_exit; 3924 + 3925 + /* Allocate buffer for Buffer ptr list */ 3926 + bmp = kmalloc(sizeof(*bmp), GFP_KERNEL); 3927 + if (!bmp) 3928 + goto vmid_free_bmp_exit; 3929 + 3930 + bmp->virt = lpfc_mbuf_alloc(phba, 0, &bmp->phys); 3931 + if (!bmp->virt) 3932 + goto vmid_free_bmp_virt_exit; 3933 + 3934 + INIT_LIST_HEAD(&mp->list); 3935 + INIT_LIST_HEAD(&bmp->list); 3936 + 3937 + lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY, 3938 + "3275 VMID Request Data: x%x x%x x%x\n", 3939 + vport->fc_flag, vport->port_state, cmdcode); 3940 + ctreq = (struct lpfc_sli_ct_request *)mp->virt; 3941 + data = mp->virt; 3942 + /* First populate the CT_IU preamble */ 3943 + memset(data, 0, LPFC_BPL_SIZE); 3944 + ctreq->RevisionId.bits.Revision = SLI_CT_REVISION; 3945 + ctreq->RevisionId.bits.InId = 0; 3946 + 3947 + ctreq->FsType = SLI_CT_MANAGEMENT_SERVICE; 3948 + ctreq->FsSubType = SLI_CT_APP_SEV_Subtypes; 3949 + 3950 + ctreq->CommandResponse.bits.CmdRsp = cpu_to_be16(cmdcode); 3951 + rsp_size = LPFC_BPL_SIZE; 3952 + size = 0; 3953 + 3954 + switch (cmdcode) { 3955 + case SLI_CTAS_RAPP_IDENT: 3956 + lpfc_printf_vlog(vport, KERN_DEBUG, LOG_DISCOVERY, 3957 + "1329 RAPP_IDENT for %s\n", vmid->host_vmid); 3958 + ctreq->un.PortID = cpu_to_be32(vport->fc_myDID); 3959 + rap = (struct lpfc_vmid_rapp_ident_list *) 3960 + (DAPP_IDENT_OFFSET + data); 3961 + rap->no_of_objects = cpu_to_be32(1); 3962 + rap->obj[0].entity_id_len = vmid->vmid_len; 3963 + memcpy(rap->obj[0].entity_id, vmid->host_vmid, vmid->vmid_len); 3964 + size = RAPP_IDENT_OFFSET + 3965 + sizeof(struct lpfc_vmid_rapp_ident_list); 3966 + retry = 1; 3967 + break; 3968 + 3969 + case SLI_CTAS_GALLAPPIA_ID: 3970 + ctreq->un.PortID = cpu_to_be32(vport->fc_myDID); 3971 + size = GALLAPPIA_ID_SIZE; 3972 + break; 3973 + 3974 + case SLI_CTAS_DAPP_IDENT: 3975 + lpfc_printf_vlog(vport, KERN_DEBUG, LOG_DISCOVERY, 3976 + "1469 DAPP_IDENT for %s\n", vmid->host_vmid); 3977 + ctreq->un.PortID = cpu_to_be32(vport->fc_myDID); 3978 + dap = (struct lpfc_vmid_dapp_ident_list *) 3979 + (DAPP_IDENT_OFFSET + data); 3980 + dap->no_of_objects = cpu_to_be32(1); 3981 + dap->obj[0].entity_id_len = vmid->vmid_len; 3982 + memcpy(dap->obj[0].entity_id, vmid->host_vmid, vmid->vmid_len); 3983 + size = DAPP_IDENT_OFFSET + 3984 + sizeof(struct lpfc_vmid_dapp_ident_list); 3985 + write_lock(&vport->vmid_lock); 3986 + vmid->flag &= ~LPFC_VMID_REGISTERED; 3987 + write_unlock(&vport->vmid_lock); 3988 + retry = 1; 3989 + break; 3990 + 3991 + case SLI_CTAS_DALLAPP_ID: 3992 + ctreq->un.PortID = cpu_to_be32(vport->fc_myDID); 3993 + size = DALLAPP_ID_SIZE; 3994 + break; 3995 + 3996 + default: 3997 + lpfc_printf_vlog(vport, KERN_DEBUG, LOG_DISCOVERY, 3998 + "7062 VMID cmdcode x%x not supported\n", 3999 + cmdcode); 4000 + goto vmid_free_all_mem; 4001 + } 4002 + 4003 + ctreq->CommandResponse.bits.Size = cpu_to_be16(rsp_size); 4004 + 4005 + bpl = (struct ulp_bde64 *)bmp->virt; 4006 + bpl->addrHigh = putPaddrHigh(mp->phys); 4007 + bpl->addrLow = putPaddrLow(mp->phys); 4008 + bpl->tus.f.bdeFlags = 0; 4009 + bpl->tus.f.bdeSize = size; 4010 + 4011 + /* The lpfc_ct_cmd/lpfc_get_req shall increment ndlp reference count 4012 + * to hold ndlp reference for the corresponding callback function. 4013 + */ 4014 + if (!lpfc_ct_cmd(vport, mp, bmp, ndlp, cmpl, rsp_size, retry)) 4015 + return 0; 4016 + 4017 + vmid_free_all_mem: 4018 + lpfc_mbuf_free(phba, bmp->virt, bmp->phys); 4019 + vmid_free_bmp_virt_exit: 4020 + kfree(bmp); 4021 + vmid_free_bmp_exit: 4022 + lpfc_mbuf_free(phba, mp->virt, mp->phys); 4023 + vmid_free_mp_virt_exit: 4024 + kfree(mp); 4025 + vmid_free_mp_exit: 4026 + 4027 + /* Issue CT request failed */ 4028 + lpfc_printf_vlog(vport, KERN_DEBUG, LOG_DISCOVERY, 4029 + "3276 VMID CT request failed Data: x%x\n", cmdcode); 4030 + return -EIO; 3782 4031 }