^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*******************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * This file is part of the Emulex Linux Device Driver for *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Fibre Channel Host Bus Adapters. *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2017-2020 Broadcom. All Rights Reserved. The term *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2004-2016 Emulex. All rights reserved. *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * EMULEX and SLI are trademarks of Emulex. *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * www.broadcom.com *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * This program is free software; you can redistribute it and/or *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * modify it under the terms of version 2 of the GNU General *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * Public License as published by the Free Software Foundation. *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * This program is distributed in the hope that it will be useful. *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * TO BE LEGALLY INVALID. See the GNU General Public License for *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * more details, a copy of which can be found in the file COPYING *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * included with this package. *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) *******************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * Fibre Channel SCSI LAN Device Driver CT support: FC Generic Services FC-GS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/blkdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/pci.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include <linux/utsname.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include <scsi/scsi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <scsi/scsi_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include <scsi/scsi_host.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include <scsi/scsi_transport_fc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #include <scsi/fc/fc_fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #include "lpfc_hw4.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #include "lpfc_hw.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #include "lpfc_sli.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #include "lpfc_sli4.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #include "lpfc_nl.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #include "lpfc_disc.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #include "lpfc.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #include "lpfc_scsi.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #include "lpfc_logmsg.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #include "lpfc_crtn.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #include "lpfc_version.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #include "lpfc_vport.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #include "lpfc_debugfs.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) /* FDMI Port Speed definitions - FC-GS-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define HBA_PORTSPEED_1GFC 0x00000001 /* 1G FC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define HBA_PORTSPEED_2GFC 0x00000002 /* 2G FC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define HBA_PORTSPEED_4GFC 0x00000008 /* 4G FC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define HBA_PORTSPEED_10GFC 0x00000004 /* 10G FC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define HBA_PORTSPEED_8GFC 0x00000010 /* 8G FC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define HBA_PORTSPEED_16GFC 0x00000020 /* 16G FC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define HBA_PORTSPEED_32GFC 0x00000040 /* 32G FC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define HBA_PORTSPEED_20GFC 0x00000080 /* 20G FC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define HBA_PORTSPEED_40GFC 0x00000100 /* 40G FC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define HBA_PORTSPEED_128GFC 0x00000200 /* 128G FC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define HBA_PORTSPEED_64GFC 0x00000400 /* 64G FC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define HBA_PORTSPEED_256GFC 0x00000800 /* 256G FC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define HBA_PORTSPEED_UNKNOWN 0x00008000 /* Unknown */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define HBA_PORTSPEED_10GE 0x00010000 /* 10G E */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define HBA_PORTSPEED_40GE 0x00020000 /* 40G E */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define HBA_PORTSPEED_100GE 0x00040000 /* 100G E */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define HBA_PORTSPEED_25GE 0x00080000 /* 25G E */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define HBA_PORTSPEED_50GE 0x00100000 /* 50G E */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define HBA_PORTSPEED_400GE 0x00200000 /* 400G E */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define FOURBYTES 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) static char *lpfc_release_version = LPFC_DRIVER_VERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) lpfc_ct_ignore_hbq_buffer(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) struct lpfc_dmabuf *mp, uint32_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) if (!mp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) "0146 Ignoring unsolicited CT No HBQ "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) "status = x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) piocbq->iocb.ulpStatus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) "0145 Ignoring unsolicted CT HBQ Size:%d "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) "status = x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) size, piocbq->iocb.ulpStatus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) lpfc_ct_unsol_buffer(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) struct lpfc_dmabuf *mp, uint32_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) lpfc_ct_ignore_hbq_buffer(phba, piocbq, mp, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) lpfc_ct_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) struct lpfc_iocbq *piocbq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) struct lpfc_dmabuf *mp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) IOCB_t *icmd = &piocbq->iocb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) struct lpfc_iocbq *iocbq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) dma_addr_t paddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) struct list_head head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) struct lpfc_dmabuf *bdeBuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) if (lpfc_bsg_ct_unsol_event(phba, pring, piocbq) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) if (unlikely(icmd->ulpStatus == IOSTAT_NEED_BUFFER)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) lpfc_sli_hbqbuf_add_hbqs(phba, LPFC_ELS_HBQ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) } else if ((icmd->ulpStatus == IOSTAT_LOCAL_REJECT) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) ((icmd->un.ulpWord[4] & IOERR_PARAM_MASK) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) IOERR_RCV_BUFFER_WAITING)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) /* Not enough posted buffers; Try posting more buffers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) phba->fc_stat.NoRcvBuf++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) if (!(phba->sli3_options & LPFC_SLI3_HBQ_ENABLED))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) lpfc_post_buffer(phba, pring, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) /* If there are no BDEs associated with this IOCB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) * there is nothing to do.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) if (icmd->ulpBdeCount == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) INIT_LIST_HEAD(&head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) list_add_tail(&head, &piocbq->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) list_for_each_entry(iocbq, &head, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) icmd = &iocbq->iocb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) if (icmd->ulpBdeCount == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) bdeBuf = iocbq->context2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) iocbq->context2 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) size = icmd->un.cont64[0].tus.f.bdeSize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) lpfc_ct_unsol_buffer(phba, piocbq, bdeBuf, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) lpfc_in_buf_free(phba, bdeBuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) if (icmd->ulpBdeCount == 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) bdeBuf = iocbq->context3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) iocbq->context3 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) size = icmd->unsli3.rcvsli3.bde2.tus.f.bdeSize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) lpfc_ct_unsol_buffer(phba, piocbq, bdeBuf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) lpfc_in_buf_free(phba, bdeBuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) list_del(&head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) INIT_LIST_HEAD(&head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) list_add_tail(&head, &piocbq->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) list_for_each_entry(iocbq, &head, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) icmd = &iocbq->iocb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) if (icmd->ulpBdeCount == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) lpfc_ct_unsol_buffer(phba, iocbq, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) for (i = 0; i < icmd->ulpBdeCount; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) paddr = getPaddr(icmd->un.cont64[i].addrHigh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) icmd->un.cont64[i].addrLow);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) mp = lpfc_sli_ringpostbuf_get(phba, pring,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) paddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) size = icmd->un.cont64[i].tus.f.bdeSize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) lpfc_ct_unsol_buffer(phba, iocbq, mp, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) lpfc_in_buf_free(phba, mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) lpfc_post_buffer(phba, pring, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) list_del(&head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) * lpfc_ct_handle_unsol_abort - ct upper level protocol abort handler
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) * @phba: Pointer to HBA context object.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) * @dmabuf: pointer to a dmabuf that describes the FC sequence
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) * This function serves as the upper level protocol abort handler for CT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) * protocol.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) * Return 1 if abort has been handled, 0 otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) **/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) lpfc_ct_handle_unsol_abort(struct lpfc_hba *phba, struct hbq_dmabuf *dmabuf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) int handled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) /* CT upper level goes through BSG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) handled = lpfc_bsg_ct_unsol_abort(phba, dmabuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) return handled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) lpfc_free_ct_rsp(struct lpfc_hba *phba, struct lpfc_dmabuf *mlist)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) struct lpfc_dmabuf *mlast, *next_mlast;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) list_for_each_entry_safe(mlast, next_mlast, &mlist->list, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) lpfc_mbuf_free(phba, mlast->virt, mlast->phys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) list_del(&mlast->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) kfree(mlast);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) lpfc_mbuf_free(phba, mlist->virt, mlist->phys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) kfree(mlist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) static struct lpfc_dmabuf *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) lpfc_alloc_ct_rsp(struct lpfc_hba *phba, int cmdcode, struct ulp_bde64 *bpl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) uint32_t size, int *entries)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) struct lpfc_dmabuf *mlist = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) struct lpfc_dmabuf *mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) int cnt, i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) /* We get chunks of FCELSSIZE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) cnt = size > FCELSSIZE ? FCELSSIZE: size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) while (size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) /* Allocate buffer for rsp payload */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) mp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) if (!mp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) if (mlist)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) lpfc_free_ct_rsp(phba, mlist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) INIT_LIST_HEAD(&mp->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) if (cmdcode == be16_to_cpu(SLI_CTNS_GID_FT) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) cmdcode == be16_to_cpu(SLI_CTNS_GFF_ID))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) mp->virt = lpfc_mbuf_alloc(phba, MEM_PRI, &(mp->phys));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) mp->virt = lpfc_mbuf_alloc(phba, 0, &(mp->phys));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) if (!mp->virt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) kfree(mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) if (mlist)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) lpfc_free_ct_rsp(phba, mlist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) /* Queue it to a linked list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) if (!mlist)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) mlist = mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) list_add_tail(&mp->list, &mlist->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64I;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) /* build buffer ptr list for IOCB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) bpl->addrLow = le32_to_cpu(putPaddrLow(mp->phys) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) bpl->addrHigh = le32_to_cpu(putPaddrHigh(mp->phys) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) bpl->tus.f.bdeSize = (uint16_t) cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) bpl->tus.w = le32_to_cpu(bpl->tus.w);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) bpl++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) size -= cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) *entries = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) return mlist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) lpfc_ct_free_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *ctiocb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) struct lpfc_dmabuf *buf_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) if (ctiocb->context_un.ndlp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) lpfc_nlp_put(ctiocb->context_un.ndlp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) ctiocb->context_un.ndlp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) if (ctiocb->context1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) buf_ptr = (struct lpfc_dmabuf *) ctiocb->context1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) kfree(buf_ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) ctiocb->context1 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) if (ctiocb->context2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) lpfc_free_ct_rsp(phba, (struct lpfc_dmabuf *) ctiocb->context2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) ctiocb->context2 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) if (ctiocb->context3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) buf_ptr = (struct lpfc_dmabuf *) ctiocb->context3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) kfree(buf_ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) ctiocb->context3 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) lpfc_sli_release_iocbq(phba, ctiocb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) * lpfc_gen_req - Build and issue a GEN_REQUEST command to the SLI Layer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) * @vport: pointer to a host virtual N_Port data structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) * @bmp: Pointer to BPL for SLI command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) * @inp: Pointer to data buffer for response data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) * @outp: Pointer to data buffer that hold the CT command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) * @cmpl: completion routine to call when command completes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) * @ndlp: Destination NPort nodelist entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) * This function as the final part for issuing a CT command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) lpfc_gen_req(struct lpfc_vport *vport, struct lpfc_dmabuf *bmp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) struct lpfc_dmabuf *inp, struct lpfc_dmabuf *outp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) void (*cmpl) (struct lpfc_hba *, struct lpfc_iocbq *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) struct lpfc_iocbq *),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) struct lpfc_nodelist *ndlp, uint32_t usr_flg, uint32_t num_entry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) uint32_t tmo, uint8_t retry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) struct lpfc_hba *phba = vport->phba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) IOCB_t *icmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) struct lpfc_iocbq *geniocb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) /* Allocate buffer for command iocb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) geniocb = lpfc_sli_get_iocbq(phba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) if (geniocb == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) icmd = &geniocb->iocb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) icmd->un.genreq64.bdl.ulpIoTag32 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) icmd->un.genreq64.bdl.addrHigh = putPaddrHigh(bmp->phys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) icmd->un.genreq64.bdl.addrLow = putPaddrLow(bmp->phys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) icmd->un.genreq64.bdl.bdeFlags = BUFF_TYPE_BLP_64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) icmd->un.genreq64.bdl.bdeSize = (num_entry * sizeof(struct ulp_bde64));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) if (usr_flg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) geniocb->context3 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) geniocb->context3 = (uint8_t *) bmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) /* Save for completion so we can release these resources */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) geniocb->context1 = (uint8_t *) inp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) geniocb->context2 = (uint8_t *) outp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) geniocb->context_un.ndlp = lpfc_nlp_get(ndlp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) /* Fill in payload, bp points to frame payload */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) icmd->ulpCommand = CMD_GEN_REQUEST64_CR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) /* Fill in rest of iocb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) icmd->un.genreq64.w5.hcsw.Fctl = (SI | LA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) icmd->un.genreq64.w5.hcsw.Dfctl = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) icmd->un.genreq64.w5.hcsw.Rctl = FC_RCTL_DD_UNSOL_CTL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) icmd->un.genreq64.w5.hcsw.Type = FC_TYPE_CT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) if (!tmo) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) /* FC spec states we need 3 * ratov for CT requests */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) tmo = (3 * phba->fc_ratov);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) icmd->ulpTimeout = tmo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) icmd->ulpBdeCount = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) icmd->ulpLe = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) icmd->ulpClass = CLASS3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) icmd->ulpContext = ndlp->nlp_rpi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) if (phba->sli_rev == LPFC_SLI_REV4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) icmd->ulpContext = phba->sli4_hba.rpi_ids[ndlp->nlp_rpi];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) /* For GEN_REQUEST64_CR, use the RPI */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) icmd->ulpCt_h = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) icmd->ulpCt_l = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) /* Issue GEN REQ IOCB for NPORT <did> */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) "0119 Issue GEN REQ IOCB to NPORT x%x "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) "Data: x%x x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) ndlp->nlp_DID, icmd->ulpIoTag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) vport->port_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) geniocb->iocb_cmpl = cmpl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) geniocb->drvrTimeout = icmd->ulpTimeout + LPFC_DRVR_TIMEOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) geniocb->vport = vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) geniocb->retry = retry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, geniocb, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) if (rc == IOCB_ERROR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) geniocb->context_un.ndlp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) lpfc_nlp_put(ndlp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) lpfc_sli_release_iocbq(phba, geniocb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) * lpfc_ct_cmd - Build and issue a CT command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) * @vport: pointer to a host virtual N_Port data structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) * @inmp: Pointer to data buffer for response data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) * @bmp: Pointer to BPL for SLI command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) * @ndlp: Destination NPort nodelist entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) * @cmpl: completion routine to call when command completes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) * This function is called for issuing a CT command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) lpfc_ct_cmd(struct lpfc_vport *vport, struct lpfc_dmabuf *inmp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) struct lpfc_dmabuf *bmp, struct lpfc_nodelist *ndlp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) void (*cmpl) (struct lpfc_hba *, struct lpfc_iocbq *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) struct lpfc_iocbq *),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) uint32_t rsp_size, uint8_t retry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) struct lpfc_hba *phba = vport->phba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) struct ulp_bde64 *bpl = (struct ulp_bde64 *) bmp->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) struct lpfc_dmabuf *outmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) int cnt = 0, status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) int cmdcode = ((struct lpfc_sli_ct_request *) inmp->virt)->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) CommandResponse.bits.CmdRsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) bpl++; /* Skip past ct request */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) /* Put buffer(s) for ct rsp in bpl */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) outmp = lpfc_alloc_ct_rsp(phba, cmdcode, bpl, rsp_size, &cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) if (!outmp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) * Form the CT IOCB. The total number of BDEs in this IOCB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) * is the single command plus response count from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) * lpfc_alloc_ct_rsp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) cnt += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) status = lpfc_gen_req(vport, bmp, inmp, outmp, cmpl, ndlp, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) cnt, 0, retry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) lpfc_free_ct_rsp(phba, outmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) struct lpfc_vport *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) lpfc_find_vport_by_did(struct lpfc_hba *phba, uint32_t did) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) struct lpfc_vport *vport_curr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) spin_lock_irqsave(&phba->port_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) list_for_each_entry(vport_curr, &phba->port_list, listentry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) if ((vport_curr->fc_myDID) && (vport_curr->fc_myDID == did)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) spin_unlock_irqrestore(&phba->port_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) return vport_curr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) spin_unlock_irqrestore(&phba->port_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) lpfc_prep_node_fc4type(struct lpfc_vport *vport, uint32_t Did, uint8_t fc4_type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) struct lpfc_nodelist *ndlp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) if ((vport->port_type != LPFC_NPIV_PORT) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) !(vport->ct_flags & FC_CT_RFF_ID) || !vport->cfg_restrict_login) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) ndlp = lpfc_setup_disc_node(vport, Did);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) if (ndlp && NLP_CHK_NODE_ACT(ndlp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) "Parse GID_FTrsp: did:x%x flg:x%x x%x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) Did, ndlp->nlp_flag, vport->fc_flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) /* By default, the driver expects to support FCP FC4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) if (fc4_type == FC_TYPE_FCP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) ndlp->nlp_fc4_type |= NLP_FC4_FCP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) if (fc4_type == FC_TYPE_NVME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) ndlp->nlp_fc4_type |= NLP_FC4_NVME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) "0238 Process x%06x NameServer Rsp "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) "Data: x%x x%x x%x x%x x%x\n", Did,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) ndlp->nlp_flag, ndlp->nlp_fc4_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) ndlp->nlp_state, vport->fc_flag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) vport->fc_rscn_id_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) /* if ndlp needs to be discovered and prior
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) * state of ndlp hit devloss, change state to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) * allow rediscovery.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) if (ndlp->nlp_flag & NLP_NPR_2B_DISC &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) ndlp->nlp_state == NLP_STE_UNUSED_NODE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) lpfc_nlp_set_state(vport, ndlp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) NLP_STE_NPR_NODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) "Skip1 GID_FTrsp: did:x%x flg:x%x cnt:%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) Did, vport->fc_flag, vport->fc_rscn_id_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) "0239 Skip x%06x NameServer Rsp "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) "Data: x%x x%x %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) Did, vport->fc_flag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) vport->fc_rscn_id_cnt, ndlp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) if (!(vport->fc_flag & FC_RSCN_MODE) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) lpfc_rscn_payload_check(vport, Did)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) "Query GID_FTrsp: did:x%x flg:x%x cnt:%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) Did, vport->fc_flag, vport->fc_rscn_id_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) * This NPortID was previously a FCP/NVMe target,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) * Don't even bother to send GFF_ID.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) ndlp = lpfc_findnode_did(vport, Did);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) if (ndlp && NLP_CHK_NODE_ACT(ndlp) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) (ndlp->nlp_type &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) (NLP_FCP_TARGET | NLP_NVME_TARGET))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) if (fc4_type == FC_TYPE_FCP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) ndlp->nlp_fc4_type |= NLP_FC4_FCP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) if (fc4_type == FC_TYPE_NVME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) ndlp->nlp_fc4_type |= NLP_FC4_NVME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) lpfc_setup_disc_node(vport, Did);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) } else if (lpfc_ns_cmd(vport, SLI_CTNS_GFF_ID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) 0, Did) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) vport->num_disc_nodes++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) lpfc_setup_disc_node(vport, Did);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) "Skip2 GID_FTrsp: did:x%x flg:x%x cnt:%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) Did, vport->fc_flag, vport->fc_rscn_id_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) "0245 Skip x%06x NameServer Rsp "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) "Data: x%x x%x\n", Did,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) vport->fc_flag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) vport->fc_rscn_id_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) lpfc_ns_rsp_audit_did(struct lpfc_vport *vport, uint32_t Did, uint8_t fc4_type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) struct lpfc_hba *phba = vport->phba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) struct lpfc_nodelist *ndlp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) char *str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) if (phba->cfg_ns_query == LPFC_NS_QUERY_GID_FT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) str = "GID_FT";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) str = "GID_PT";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) "6430 Process %s rsp for %08x type %x %s %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) str, Did, fc4_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) (fc4_type == FC_TYPE_FCP) ? "FCP" : " ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) (fc4_type == FC_TYPE_NVME) ? "NVME" : " ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) * To conserve rpi's, filter out addresses for other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) * vports on the same physical HBAs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) if (Did != vport->fc_myDID &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) (!lpfc_find_vport_by_did(phba, Did) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) vport->cfg_peer_port_login)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) if (!phba->nvmet_support) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) /* FCPI/NVMEI path. Process Did */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) lpfc_prep_node_fc4type(vport, Did, fc4_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) /* NVMET path. NVMET only cares about NVMEI nodes. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) if (ndlp->nlp_type != NLP_NVME_INITIATOR ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) ndlp->nlp_state != NLP_STE_UNMAPPED_NODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) spin_lock_irq(shost->host_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) if (ndlp->nlp_DID == Did)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) ndlp->nlp_flag &= ~NLP_NVMET_RECOV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) ndlp->nlp_flag |= NLP_NVMET_RECOV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) spin_unlock_irq(shost->host_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) lpfc_ns_rsp(struct lpfc_vport *vport, struct lpfc_dmabuf *mp, uint8_t fc4_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) uint32_t Size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) struct lpfc_sli_ct_request *Response =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) (struct lpfc_sli_ct_request *) mp->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) struct lpfc_dmabuf *mlast, *next_mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) uint32_t *ctptr = (uint32_t *) & Response->un.gid.PortType;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) uint32_t Did, CTentry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) int Cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) struct list_head head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) struct lpfc_nodelist *ndlp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) lpfc_set_disctmo(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) vport->num_disc_nodes = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) vport->fc_ns_retry = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) list_add_tail(&head, &mp->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) list_for_each_entry_safe(mp, next_mp, &head, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) mlast = mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) Cnt = Size > FCELSSIZE ? FCELSSIZE : Size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) Size -= Cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) if (!ctptr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) ctptr = (uint32_t *) mlast->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) Cnt -= 16; /* subtract length of CT header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) /* Loop through entire NameServer list of DIDs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) while (Cnt >= sizeof(uint32_t)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) /* Get next DID from NameServer List */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) CTentry = *ctptr++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) Did = ((be32_to_cpu(CTentry)) & Mask_DID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) lpfc_ns_rsp_audit_did(vport, Did, fc4_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) if (CTentry & (cpu_to_be32(SLI_CT_LAST_ENTRY)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) goto nsout1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) Cnt -= sizeof(uint32_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) ctptr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) /* All GID_FT entries processed. If the driver is running in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) * in target mode, put impacted nodes into recovery and drop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) * the RPI to flush outstanding IO.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) if (vport->phba->nvmet_support) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) if (!(ndlp->nlp_flag & NLP_NVMET_RECOV))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) lpfc_disc_state_machine(vport, ndlp, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) NLP_EVT_DEVICE_RECOVERY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) spin_lock_irq(shost->host_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) ndlp->nlp_flag &= ~NLP_NVMET_RECOV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) spin_unlock_irq(shost->host_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) nsout1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) list_del(&head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) struct lpfc_iocbq *rspiocb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) struct lpfc_vport *vport = cmdiocb->vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) IOCB_t *irsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) struct lpfc_dmabuf *outp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) struct lpfc_dmabuf *inp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) struct lpfc_sli_ct_request *CTrsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) struct lpfc_sli_ct_request *CTreq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) struct lpfc_nodelist *ndlp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) int rc, type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) /* First save ndlp, before we overwrite it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) ndlp = cmdiocb->context_un.ndlp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) /* we pass cmdiocb to state machine which needs rspiocb as well */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) cmdiocb->context_un.rsp_iocb = rspiocb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) inp = (struct lpfc_dmabuf *) cmdiocb->context1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) outp = (struct lpfc_dmabuf *) cmdiocb->context2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) irsp = &rspiocb->iocb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) "GID_FT cmpl: status:x%x/x%x rtry:%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) irsp->ulpStatus, irsp->un.ulpWord[4], vport->fc_ns_retry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) /* Don't bother processing response if vport is being torn down. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) if (vport->load_flag & FC_UNLOADING) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) if (vport->fc_flag & FC_RSCN_MODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) lpfc_els_flush_rscn(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) if (lpfc_els_chk_latt(vport)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) "0216 Link event during NS query\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) if (vport->fc_flag & FC_RSCN_MODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) lpfc_els_flush_rscn(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) lpfc_vport_set_state(vport, FC_VPORT_FAILED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) if (lpfc_error_lost_link(irsp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) "0226 NS query failed due to link event\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) if (vport->fc_flag & FC_RSCN_MODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) lpfc_els_flush_rscn(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) spin_lock_irq(shost->host_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) if (vport->fc_flag & FC_RSCN_DEFERRED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) vport->fc_flag &= ~FC_RSCN_DEFERRED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) spin_unlock_irq(shost->host_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) /* This is a GID_FT completing so the gidft_inp counter was
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) * incremented before the GID_FT was issued to the wire.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) if (vport->gidft_inp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) vport->gidft_inp--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) * Skip processing the NS response
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) * Re-issue the NS cmd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) "0151 Process Deferred RSCN Data: x%x x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) vport->fc_flag, vport->fc_rscn_id_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) lpfc_els_handle_rscn(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) spin_unlock_irq(shost->host_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) if (irsp->ulpStatus) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) /* Check for retry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) if (vport->fc_ns_retry < LPFC_MAX_NS_RETRY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) if (irsp->ulpStatus != IOSTAT_LOCAL_REJECT ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) (irsp->un.ulpWord[4] & IOERR_PARAM_MASK) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) IOERR_NO_RESOURCES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) vport->fc_ns_retry++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) type = lpfc_get_gidft_type(vport, cmdiocb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) if (type == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) /* CT command is being retried */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) rc = lpfc_ns_cmd(vport, SLI_CTNS_GID_FT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) vport->fc_ns_retry, type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) if (rc == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) else { /* Unable to send NS cmd */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) if (vport->gidft_inp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) vport->gidft_inp--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) if (vport->fc_flag & FC_RSCN_MODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) lpfc_els_flush_rscn(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) lpfc_vport_set_state(vport, FC_VPORT_FAILED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) "0257 GID_FT Query error: 0x%x 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) irsp->ulpStatus, vport->fc_ns_retry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) /* Good status, continue checking */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) CTreq = (struct lpfc_sli_ct_request *) inp->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) if (CTrsp->CommandResponse.bits.CmdRsp ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) cpu_to_be16(SLI_CT_RESPONSE_FS_ACC)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) "0208 NameServer Rsp Data: x%x x%x "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) "x%x x%x sz x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) vport->fc_flag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) CTreq->un.gid.Fc4Type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) vport->num_disc_nodes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) vport->gidft_inp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) irsp->un.genreq64.bdl.bdeSize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) lpfc_ns_rsp(vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) outp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) CTreq->un.gid.Fc4Type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) (uint32_t) (irsp->un.genreq64.bdl.bdeSize));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) } else if (CTrsp->CommandResponse.bits.CmdRsp ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) be16_to_cpu(SLI_CT_RESPONSE_FS_RJT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) /* NameServer Rsp Error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) if ((CTrsp->ReasonCode == SLI_CT_UNABLE_TO_PERFORM_REQ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) && (CTrsp->Explanation == SLI_CT_NO_FC4_TYPES)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) lpfc_printf_vlog(vport, KERN_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) "0269 No NameServer Entries "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) "Data: x%x x%x x%x x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) CTrsp->CommandResponse.bits.CmdRsp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) (uint32_t) CTrsp->ReasonCode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) (uint32_t) CTrsp->Explanation,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) vport->fc_flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) "GID_FT no entry cmd:x%x rsn:x%x exp:x%x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) (uint32_t)CTrsp->CommandResponse.bits.CmdRsp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) (uint32_t) CTrsp->ReasonCode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) (uint32_t) CTrsp->Explanation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) lpfc_printf_vlog(vport, KERN_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) "0240 NameServer Rsp Error "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) "Data: x%x x%x x%x x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) CTrsp->CommandResponse.bits.CmdRsp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) (uint32_t) CTrsp->ReasonCode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) (uint32_t) CTrsp->Explanation,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) vport->fc_flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) "GID_FT rsp err1 cmd:x%x rsn:x%x exp:x%x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) (uint32_t)CTrsp->CommandResponse.bits.CmdRsp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) (uint32_t) CTrsp->ReasonCode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) (uint32_t) CTrsp->Explanation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) /* NameServer Rsp Error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) "0241 NameServer Rsp Error "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) "Data: x%x x%x x%x x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) CTrsp->CommandResponse.bits.CmdRsp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) (uint32_t) CTrsp->ReasonCode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) (uint32_t) CTrsp->Explanation,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) vport->fc_flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) "GID_FT rsp err2 cmd:x%x rsn:x%x exp:x%x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) (uint32_t)CTrsp->CommandResponse.bits.CmdRsp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) (uint32_t) CTrsp->ReasonCode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) (uint32_t) CTrsp->Explanation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) if (vport->gidft_inp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) vport->gidft_inp--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) "4216 GID_FT cmpl inp %d disc %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) vport->gidft_inp, vport->num_disc_nodes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) /* Link up / RSCN discovery */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) if ((vport->num_disc_nodes == 0) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) (vport->gidft_inp == 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) * The driver has cycled through all Nports in the RSCN payload.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) * Complete the handling by cleaning up and marking the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) * current driver state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) if (vport->port_state >= LPFC_DISC_AUTH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) if (vport->fc_flag & FC_RSCN_MODE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) lpfc_els_flush_rscn(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) spin_lock_irq(shost->host_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) vport->fc_flag |= FC_RSCN_MODE; /* RSCN still */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) spin_unlock_irq(shost->host_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) lpfc_els_flush_rscn(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) lpfc_disc_start(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) cmdiocb->context_un.ndlp = ndlp; /* Now restore ndlp for free */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) lpfc_ct_free_iocb(phba, cmdiocb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) lpfc_cmpl_ct_cmd_gid_pt(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) struct lpfc_iocbq *rspiocb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) struct lpfc_vport *vport = cmdiocb->vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) IOCB_t *irsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) struct lpfc_dmabuf *outp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) struct lpfc_dmabuf *inp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) struct lpfc_sli_ct_request *CTrsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) struct lpfc_sli_ct_request *CTreq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) struct lpfc_nodelist *ndlp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) /* First save ndlp, before we overwrite it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) ndlp = cmdiocb->context_un.ndlp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) /* we pass cmdiocb to state machine which needs rspiocb as well */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) cmdiocb->context_un.rsp_iocb = rspiocb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) inp = (struct lpfc_dmabuf *)cmdiocb->context1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) outp = (struct lpfc_dmabuf *)cmdiocb->context2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) irsp = &rspiocb->iocb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) "GID_PT cmpl: status:x%x/x%x rtry:%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) irsp->ulpStatus, irsp->un.ulpWord[4],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) vport->fc_ns_retry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) /* Don't bother processing response if vport is being torn down. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) if (vport->load_flag & FC_UNLOADING) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) if (vport->fc_flag & FC_RSCN_MODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) lpfc_els_flush_rscn(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) if (lpfc_els_chk_latt(vport)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) "4108 Link event during NS query\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) if (vport->fc_flag & FC_RSCN_MODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) lpfc_els_flush_rscn(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) lpfc_vport_set_state(vport, FC_VPORT_FAILED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) if (lpfc_error_lost_link(irsp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) "4166 NS query failed due to link event\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) if (vport->fc_flag & FC_RSCN_MODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) lpfc_els_flush_rscn(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) spin_lock_irq(shost->host_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) if (vport->fc_flag & FC_RSCN_DEFERRED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) vport->fc_flag &= ~FC_RSCN_DEFERRED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) spin_unlock_irq(shost->host_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) /* This is a GID_PT completing so the gidft_inp counter was
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) * incremented before the GID_PT was issued to the wire.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) if (vport->gidft_inp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) vport->gidft_inp--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) * Skip processing the NS response
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) * Re-issue the NS cmd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) "4167 Process Deferred RSCN Data: x%x x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) vport->fc_flag, vport->fc_rscn_id_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) lpfc_els_handle_rscn(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) spin_unlock_irq(shost->host_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) if (irsp->ulpStatus) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) /* Check for retry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) if (vport->fc_ns_retry < LPFC_MAX_NS_RETRY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) if (irsp->ulpStatus != IOSTAT_LOCAL_REJECT ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) (irsp->un.ulpWord[4] & IOERR_PARAM_MASK) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) IOERR_NO_RESOURCES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) vport->fc_ns_retry++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) /* CT command is being retried */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) rc = lpfc_ns_cmd(vport, SLI_CTNS_GID_PT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) vport->fc_ns_retry, GID_PT_N_PORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) if (rc == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) else { /* Unable to send NS cmd */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) if (vport->gidft_inp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) vport->gidft_inp--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) if (vport->fc_flag & FC_RSCN_MODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) lpfc_els_flush_rscn(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) lpfc_vport_set_state(vport, FC_VPORT_FAILED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) "4103 GID_FT Query error: 0x%x 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) irsp->ulpStatus, vport->fc_ns_retry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) /* Good status, continue checking */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) CTreq = (struct lpfc_sli_ct_request *)inp->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) CTrsp = (struct lpfc_sli_ct_request *)outp->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) if (CTrsp->CommandResponse.bits.CmdRsp ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) cpu_to_be16(SLI_CT_RESPONSE_FS_ACC)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) "4105 NameServer Rsp Data: x%x x%x "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) "x%x x%x sz x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) vport->fc_flag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) CTreq->un.gid.Fc4Type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) vport->num_disc_nodes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) vport->gidft_inp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) irsp->un.genreq64.bdl.bdeSize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) lpfc_ns_rsp(vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) outp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) CTreq->un.gid.Fc4Type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) (uint32_t)(irsp->un.genreq64.bdl.bdeSize));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) } else if (CTrsp->CommandResponse.bits.CmdRsp ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) be16_to_cpu(SLI_CT_RESPONSE_FS_RJT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) /* NameServer Rsp Error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) if ((CTrsp->ReasonCode == SLI_CT_UNABLE_TO_PERFORM_REQ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) && (CTrsp->Explanation == SLI_CT_NO_FC4_TYPES)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) lpfc_printf_vlog(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) "4106 No NameServer Entries "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) "Data: x%x x%x x%x x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) CTrsp->CommandResponse.bits.CmdRsp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) (uint32_t)CTrsp->ReasonCode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) (uint32_t)CTrsp->Explanation,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) vport->fc_flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) lpfc_debugfs_disc_trc(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) vport, LPFC_DISC_TRC_CT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) "GID_PT no entry cmd:x%x rsn:x%x exp:x%x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) (uint32_t)CTrsp->CommandResponse.bits.CmdRsp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) (uint32_t)CTrsp->ReasonCode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) (uint32_t)CTrsp->Explanation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) lpfc_printf_vlog(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) "4107 NameServer Rsp Error "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) "Data: x%x x%x x%x x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) CTrsp->CommandResponse.bits.CmdRsp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) (uint32_t)CTrsp->ReasonCode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) (uint32_t)CTrsp->Explanation,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) vport->fc_flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) lpfc_debugfs_disc_trc(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) vport, LPFC_DISC_TRC_CT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) "GID_PT rsp err1 cmd:x%x rsn:x%x exp:x%x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) (uint32_t)CTrsp->CommandResponse.bits.CmdRsp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) (uint32_t)CTrsp->ReasonCode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) (uint32_t)CTrsp->Explanation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) /* NameServer Rsp Error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) "4109 NameServer Rsp Error "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) "Data: x%x x%x x%x x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) CTrsp->CommandResponse.bits.CmdRsp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) (uint32_t)CTrsp->ReasonCode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) (uint32_t)CTrsp->Explanation,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) vport->fc_flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) lpfc_debugfs_disc_trc(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) vport, LPFC_DISC_TRC_CT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) "GID_PT rsp err2 cmd:x%x rsn:x%x exp:x%x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) (uint32_t)CTrsp->CommandResponse.bits.CmdRsp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) (uint32_t)CTrsp->ReasonCode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) (uint32_t)CTrsp->Explanation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) if (vport->gidft_inp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) vport->gidft_inp--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) "6450 GID_PT cmpl inp %d disc %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) vport->gidft_inp, vport->num_disc_nodes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) /* Link up / RSCN discovery */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) if ((vport->num_disc_nodes == 0) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) (vport->gidft_inp == 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) * The driver has cycled through all Nports in the RSCN payload.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) * Complete the handling by cleaning up and marking the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) * current driver state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) if (vport->port_state >= LPFC_DISC_AUTH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) if (vport->fc_flag & FC_RSCN_MODE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) lpfc_els_flush_rscn(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) spin_lock_irq(shost->host_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) vport->fc_flag |= FC_RSCN_MODE; /* RSCN still */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) spin_unlock_irq(shost->host_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) lpfc_els_flush_rscn(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) lpfc_disc_start(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) cmdiocb->context_un.ndlp = ndlp; /* Now restore ndlp for free */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) lpfc_ct_free_iocb(phba, cmdiocb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) lpfc_cmpl_ct_cmd_gff_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) struct lpfc_iocbq *rspiocb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) struct lpfc_vport *vport = cmdiocb->vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) IOCB_t *irsp = &rspiocb->iocb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) struct lpfc_dmabuf *inp = (struct lpfc_dmabuf *) cmdiocb->context1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) struct lpfc_dmabuf *outp = (struct lpfc_dmabuf *) cmdiocb->context2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) struct lpfc_sli_ct_request *CTrsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) int did, rc, retry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) uint8_t fbits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) struct lpfc_nodelist *ndlp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) did = ((struct lpfc_sli_ct_request *) inp->virt)->un.gff.PortId;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) did = be32_to_cpu(did);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) "GFF_ID cmpl: status:x%x/x%x did:x%x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) irsp->ulpStatus, irsp->un.ulpWord[4], did);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) if (irsp->ulpStatus == IOSTAT_SUCCESS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) /* Good status, continue checking */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) fbits = CTrsp->un.gff_acc.fbits[FCP_TYPE_FEATURE_OFFSET];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) "6431 Process GFF_ID rsp for %08x "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) "fbits %02x %s %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) did, fbits,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) (fbits & FC4_FEATURE_INIT) ? "Initiator" : " ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) (fbits & FC4_FEATURE_TARGET) ? "Target" : " ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) if (CTrsp->CommandResponse.bits.CmdRsp ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) be16_to_cpu(SLI_CT_RESPONSE_FS_ACC)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) if ((fbits & FC4_FEATURE_INIT) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) !(fbits & FC4_FEATURE_TARGET)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) lpfc_printf_vlog(vport, KERN_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) "0270 Skip x%x GFF "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) "NameServer Rsp Data: (init) "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) "x%x x%x\n", did, fbits,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) vport->fc_rscn_id_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) /* Check for retry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) if (cmdiocb->retry < LPFC_MAX_NS_RETRY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) retry = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) if (irsp->ulpStatus == IOSTAT_LOCAL_REJECT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) switch ((irsp->un.ulpWord[4] &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) IOERR_PARAM_MASK)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) case IOERR_NO_RESOURCES:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) /* We don't increment the retry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) * count for this case.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) case IOERR_LINK_DOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) case IOERR_SLI_ABORTED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) case IOERR_SLI_DOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) retry = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) cmdiocb->retry++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) cmdiocb->retry++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) if (retry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) /* CT command is being retried */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) rc = lpfc_ns_cmd(vport, SLI_CTNS_GFF_ID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) cmdiocb->retry, did);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) if (rc == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) /* success */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) lpfc_ct_free_iocb(phba, cmdiocb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) "0267 NameServer GFF Rsp "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) "x%x Error (%d %d) Data: x%x x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) did, irsp->ulpStatus, irsp->un.ulpWord[4],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) vport->fc_flag, vport->fc_rscn_id_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) /* This is a target port, unregistered port, or the GFF_ID failed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) ndlp = lpfc_setup_disc_node(vport, did);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) if (ndlp && NLP_CHK_NODE_ACT(ndlp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) "0242 Process x%x GFF "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) "NameServer Rsp Data: x%x x%x x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) did, ndlp->nlp_flag, vport->fc_flag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) vport->fc_rscn_id_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) "0243 Skip x%x GFF "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) "NameServer Rsp Data: x%x x%x\n", did,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) vport->fc_flag, vport->fc_rscn_id_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) /* Link up / RSCN discovery */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) if (vport->num_disc_nodes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) vport->num_disc_nodes--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) "6451 GFF_ID cmpl inp %d disc %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) vport->gidft_inp, vport->num_disc_nodes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) if (vport->num_disc_nodes == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) * The driver has cycled through all Nports in the RSCN payload.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) * Complete the handling by cleaning up and marking the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) * current driver state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) if (vport->port_state >= LPFC_DISC_AUTH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) if (vport->fc_flag & FC_RSCN_MODE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) lpfc_els_flush_rscn(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) spin_lock_irq(shost->host_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) vport->fc_flag |= FC_RSCN_MODE; /* RSCN still */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) spin_unlock_irq(shost->host_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) lpfc_els_flush_rscn(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) lpfc_disc_start(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) lpfc_ct_free_iocb(phba, cmdiocb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) lpfc_cmpl_ct_cmd_gft_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) struct lpfc_iocbq *rspiocb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) struct lpfc_vport *vport = cmdiocb->vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) IOCB_t *irsp = &rspiocb->iocb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) struct lpfc_dmabuf *inp = (struct lpfc_dmabuf *)cmdiocb->context1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) struct lpfc_dmabuf *outp = (struct lpfc_dmabuf *)cmdiocb->context2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) struct lpfc_sli_ct_request *CTrsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) int did;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) struct lpfc_nodelist *ndlp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) uint32_t fc4_data_0, fc4_data_1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) did = ((struct lpfc_sli_ct_request *)inp->virt)->un.gft.PortId;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) did = be32_to_cpu(did);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) "GFT_ID cmpl: status:x%x/x%x did:x%x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) irsp->ulpStatus, irsp->un.ulpWord[4], did);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) if (irsp->ulpStatus == IOSTAT_SUCCESS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) /* Good status, continue checking */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) CTrsp = (struct lpfc_sli_ct_request *)outp->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) fc4_data_0 = be32_to_cpu(CTrsp->un.gft_acc.fc4_types[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) fc4_data_1 = be32_to_cpu(CTrsp->un.gft_acc.fc4_types[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) "6432 Process GFT_ID rsp for %08x "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) "Data %08x %08x %s %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) did, fc4_data_0, fc4_data_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) (fc4_data_0 & LPFC_FC4_TYPE_BITMASK) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) "FCP" : " ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) (fc4_data_1 & LPFC_FC4_TYPE_BITMASK) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) "NVME" : " ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) ndlp = lpfc_findnode_did(vport, did);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) if (ndlp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) /* The bitmask value for FCP and NVME FCP types is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) * the same because they are 32 bits distant from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) * each other in word0 and word0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) if (fc4_data_0 & LPFC_FC4_TYPE_BITMASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) ndlp->nlp_fc4_type |= NLP_FC4_FCP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) if (fc4_data_1 & LPFC_FC4_TYPE_BITMASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) ndlp->nlp_fc4_type |= NLP_FC4_NVME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) "3064 Setting ndlp x%px, DID x%06x "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) "with FC4 x%08x, Data: x%08x x%08x "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) "%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) ndlp, did, ndlp->nlp_fc4_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) FC_TYPE_FCP, FC_TYPE_NVME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) ndlp->nlp_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) if (ndlp->nlp_state == NLP_STE_REG_LOGIN_ISSUE &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) ndlp->nlp_fc4_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) ndlp->nlp_prev_state = NLP_STE_REG_LOGIN_ISSUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) lpfc_nlp_set_state(vport, ndlp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) NLP_STE_PRLI_ISSUE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) lpfc_issue_els_prli(vport, ndlp, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) } else if (!ndlp->nlp_fc4_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) /* If fc4 type is still unknown, then LOGO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) lpfc_printf_vlog(vport, KERN_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) "6443 Sending LOGO ndlp x%px,"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) "DID x%06x with fc4_type: "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) "x%08x, state: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) ndlp, did, ndlp->nlp_fc4_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) ndlp->nlp_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) lpfc_issue_els_logo(vport, ndlp, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) ndlp->nlp_prev_state = NLP_STE_REG_LOGIN_ISSUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) lpfc_nlp_set_state(vport, ndlp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) NLP_STE_NPR_NODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) "3065 GFT_ID failed x%08x\n", irsp->ulpStatus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) lpfc_ct_free_iocb(phba, cmdiocb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) lpfc_cmpl_ct(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) struct lpfc_iocbq *rspiocb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) struct lpfc_vport *vport = cmdiocb->vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) struct lpfc_dmabuf *inp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) struct lpfc_dmabuf *outp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) IOCB_t *irsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) struct lpfc_sli_ct_request *CTrsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) struct lpfc_nodelist *ndlp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) int cmdcode, rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) uint8_t retry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) uint32_t latt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) /* First save ndlp, before we overwrite it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) ndlp = cmdiocb->context_un.ndlp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) /* we pass cmdiocb to state machine which needs rspiocb as well */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) cmdiocb->context_un.rsp_iocb = rspiocb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) inp = (struct lpfc_dmabuf *) cmdiocb->context1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) outp = (struct lpfc_dmabuf *) cmdiocb->context2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) irsp = &rspiocb->iocb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) cmdcode = be16_to_cpu(((struct lpfc_sli_ct_request *) inp->virt)->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) CommandResponse.bits.CmdRsp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) latt = lpfc_els_chk_latt(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) /* RFT request completes status <ulpStatus> CmdRsp <CmdRsp> */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) "0209 CT Request completes, latt %d, "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) "ulpStatus x%x CmdRsp x%x, Context x%x, Tag x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) latt, irsp->ulpStatus,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) CTrsp->CommandResponse.bits.CmdRsp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) cmdiocb->iocb.ulpContext, cmdiocb->iocb.ulpIoTag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) "CT cmd cmpl: status:x%x/x%x cmd:x%x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) irsp->ulpStatus, irsp->un.ulpWord[4], cmdcode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) if (irsp->ulpStatus) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) "0268 NS cmd x%x Error (x%x x%x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) cmdcode, irsp->ulpStatus, irsp->un.ulpWord[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) (((irsp->un.ulpWord[4] & IOERR_PARAM_MASK) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) IOERR_SLI_DOWN) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) ((irsp->un.ulpWord[4] & IOERR_PARAM_MASK) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) IOERR_SLI_ABORTED)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) retry = cmdiocb->retry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) if (retry >= LPFC_MAX_NS_RETRY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) retry++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) "0250 Retrying NS cmd %x\n", cmdcode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) rc = lpfc_ns_cmd(vport, cmdcode, retry, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) if (rc == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) cmdiocb->context_un.ndlp = ndlp; /* Now restore ndlp for free */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) lpfc_ct_free_iocb(phba, cmdiocb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) lpfc_cmpl_ct_cmd_rft_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) struct lpfc_iocbq *rspiocb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) IOCB_t *irsp = &rspiocb->iocb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) struct lpfc_vport *vport = cmdiocb->vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) if (irsp->ulpStatus == IOSTAT_SUCCESS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) struct lpfc_dmabuf *outp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) struct lpfc_sli_ct_request *CTrsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) outp = (struct lpfc_dmabuf *) cmdiocb->context2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) if (CTrsp->CommandResponse.bits.CmdRsp ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) be16_to_cpu(SLI_CT_RESPONSE_FS_ACC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) vport->ct_flags |= FC_CT_RFT_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) lpfc_cmpl_ct(phba, cmdiocb, rspiocb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) lpfc_cmpl_ct_cmd_rnn_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) struct lpfc_iocbq *rspiocb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) IOCB_t *irsp = &rspiocb->iocb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) struct lpfc_vport *vport = cmdiocb->vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) if (irsp->ulpStatus == IOSTAT_SUCCESS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) struct lpfc_dmabuf *outp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) struct lpfc_sli_ct_request *CTrsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) outp = (struct lpfc_dmabuf *) cmdiocb->context2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) if (CTrsp->CommandResponse.bits.CmdRsp ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) be16_to_cpu(SLI_CT_RESPONSE_FS_ACC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) vport->ct_flags |= FC_CT_RNN_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) lpfc_cmpl_ct(phba, cmdiocb, rspiocb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) lpfc_cmpl_ct_cmd_rspn_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) struct lpfc_iocbq *rspiocb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) IOCB_t *irsp = &rspiocb->iocb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) struct lpfc_vport *vport = cmdiocb->vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) if (irsp->ulpStatus == IOSTAT_SUCCESS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) struct lpfc_dmabuf *outp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) struct lpfc_sli_ct_request *CTrsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) outp = (struct lpfc_dmabuf *) cmdiocb->context2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) if (CTrsp->CommandResponse.bits.CmdRsp ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) be16_to_cpu(SLI_CT_RESPONSE_FS_ACC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) vport->ct_flags |= FC_CT_RSPN_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) lpfc_cmpl_ct(phba, cmdiocb, rspiocb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) lpfc_cmpl_ct_cmd_rsnn_nn(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) struct lpfc_iocbq *rspiocb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) IOCB_t *irsp = &rspiocb->iocb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) struct lpfc_vport *vport = cmdiocb->vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) if (irsp->ulpStatus == IOSTAT_SUCCESS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) struct lpfc_dmabuf *outp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) struct lpfc_sli_ct_request *CTrsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) outp = (struct lpfc_dmabuf *) cmdiocb->context2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) if (CTrsp->CommandResponse.bits.CmdRsp ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) be16_to_cpu(SLI_CT_RESPONSE_FS_ACC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) vport->ct_flags |= FC_CT_RSNN_NN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) lpfc_cmpl_ct(phba, cmdiocb, rspiocb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) lpfc_cmpl_ct_cmd_da_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) struct lpfc_iocbq *rspiocb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) struct lpfc_vport *vport = cmdiocb->vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) /* even if it fails we will act as though it succeeded. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) vport->ct_flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) lpfc_cmpl_ct(phba, cmdiocb, rspiocb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) lpfc_cmpl_ct_cmd_rff_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) struct lpfc_iocbq *rspiocb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) IOCB_t *irsp = &rspiocb->iocb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) struct lpfc_vport *vport = cmdiocb->vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) if (irsp->ulpStatus == IOSTAT_SUCCESS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) struct lpfc_dmabuf *outp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) struct lpfc_sli_ct_request *CTrsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) outp = (struct lpfc_dmabuf *) cmdiocb->context2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) if (CTrsp->CommandResponse.bits.CmdRsp ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) be16_to_cpu(SLI_CT_RESPONSE_FS_ACC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) vport->ct_flags |= FC_CT_RFF_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) lpfc_cmpl_ct(phba, cmdiocb, rspiocb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) * Although the symbolic port name is thought to be an integer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) * as of January 18, 2016, leave it as a string until more of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) * the record state becomes defined.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) lpfc_vport_symbolic_port_name(struct lpfc_vport *vport, char *symbol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) int n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) * Use the lpfc board number as the Symbolic Port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) * Name object. NPIV is not in play so this integer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) * value is sufficient and unique per FC-ID.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) n = scnprintf(symbol, size, "%d", vport->phba->brd_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) return n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) lpfc_vport_symbolic_node_name(struct lpfc_vport *vport, char *symbol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) char fwrev[FW_REV_STR_SIZE] = {0};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) char tmp[MAXHOSTNAMELEN] = {0};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) memset(symbol, 0, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) scnprintf(tmp, sizeof(tmp), "Emulex %s", vport->phba->ModelName);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) if (strlcat(symbol, tmp, size) >= size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) goto buffer_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) lpfc_decode_firmware_rev(vport->phba, fwrev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) scnprintf(tmp, sizeof(tmp), " FV%s", fwrev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) if (strlcat(symbol, tmp, size) >= size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) goto buffer_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) scnprintf(tmp, sizeof(tmp), " DV%s", lpfc_release_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) if (strlcat(symbol, tmp, size) >= size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) goto buffer_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) scnprintf(tmp, sizeof(tmp), " HN:%s", vport->phba->os_host_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) if (strlcat(symbol, tmp, size) >= size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) goto buffer_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) /* Note :- OS name is "Linux" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) scnprintf(tmp, sizeof(tmp), " OS:%s", init_utsname()->sysname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) strlcat(symbol, tmp, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) buffer_done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) return strnlen(symbol, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) static uint32_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) lpfc_find_map_node(struct lpfc_vport *vport)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) struct lpfc_nodelist *ndlp, *next_ndlp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) struct Scsi_Host *shost;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) uint32_t cnt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) shost = lpfc_shost_from_vport(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) spin_lock_irq(shost->host_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) if (ndlp->nlp_type & NLP_FABRIC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) if ((ndlp->nlp_state == NLP_STE_MAPPED_NODE) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) (ndlp->nlp_state == NLP_STE_UNMAPPED_NODE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) cnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) spin_unlock_irq(shost->host_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) return cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) * This routine will return the FC4 Type associated with the CT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) * GID_FT command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) lpfc_get_gidft_type(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) struct lpfc_sli_ct_request *CtReq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) struct lpfc_dmabuf *mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) uint32_t type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) mp = cmdiocb->context1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) if (mp == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) CtReq = (struct lpfc_sli_ct_request *)mp->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) type = (uint32_t)CtReq->un.gid.Fc4Type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) if ((type != SLI_CTPT_FCP) && (type != SLI_CTPT_NVME))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) return type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) * lpfc_ns_cmd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) * Description:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) * Issue Cmd to NameServer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) * SLI_CTNS_GID_FT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) * LI_CTNS_RFT_ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) lpfc_ns_cmd(struct lpfc_vport *vport, int cmdcode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) uint8_t retry, uint32_t context)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) struct lpfc_nodelist * ndlp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) struct lpfc_hba *phba = vport->phba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) struct lpfc_dmabuf *mp, *bmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) struct lpfc_sli_ct_request *CtReq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) struct ulp_bde64 *bpl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) void (*cmpl) (struct lpfc_hba *, struct lpfc_iocbq *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) struct lpfc_iocbq *) = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) uint32_t *ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) uint32_t rsp_size = 1024;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) size_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) int rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) ndlp = lpfc_findnode_did(vport, NameServer_DID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) if (!ndlp || !NLP_CHK_NODE_ACT(ndlp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) rc=1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) goto ns_cmd_exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) /* fill in BDEs for command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) /* Allocate buffer for command payload */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) mp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) if (!mp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) rc=2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) goto ns_cmd_exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) INIT_LIST_HEAD(&mp->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) mp->virt = lpfc_mbuf_alloc(phba, MEM_PRI, &(mp->phys));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) if (!mp->virt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) rc=3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) goto ns_cmd_free_mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) /* Allocate buffer for Buffer ptr list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) bmp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) if (!bmp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) rc=4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) goto ns_cmd_free_mpvirt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) INIT_LIST_HEAD(&bmp->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) bmp->virt = lpfc_mbuf_alloc(phba, MEM_PRI, &(bmp->phys));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) if (!bmp->virt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) rc=5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) goto ns_cmd_free_bmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) /* NameServer Req */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) lpfc_printf_vlog(vport, KERN_INFO ,LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) "0236 NameServer Req Data: x%x x%x x%x x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) cmdcode, vport->fc_flag, vport->fc_rscn_id_cnt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) context);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) bpl = (struct ulp_bde64 *) bmp->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) memset(bpl, 0, sizeof(struct ulp_bde64));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) bpl->addrHigh = le32_to_cpu(putPaddrHigh(mp->phys) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) bpl->addrLow = le32_to_cpu(putPaddrLow(mp->phys) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) bpl->tus.f.bdeFlags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) if (cmdcode == SLI_CTNS_GID_FT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) bpl->tus.f.bdeSize = GID_REQUEST_SZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) else if (cmdcode == SLI_CTNS_GID_PT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) bpl->tus.f.bdeSize = GID_REQUEST_SZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) else if (cmdcode == SLI_CTNS_GFF_ID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) bpl->tus.f.bdeSize = GFF_REQUEST_SZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) else if (cmdcode == SLI_CTNS_GFT_ID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) bpl->tus.f.bdeSize = GFT_REQUEST_SZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) else if (cmdcode == SLI_CTNS_RFT_ID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) bpl->tus.f.bdeSize = RFT_REQUEST_SZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) else if (cmdcode == SLI_CTNS_RNN_ID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) bpl->tus.f.bdeSize = RNN_REQUEST_SZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) else if (cmdcode == SLI_CTNS_RSPN_ID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) bpl->tus.f.bdeSize = RSPN_REQUEST_SZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) else if (cmdcode == SLI_CTNS_RSNN_NN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) bpl->tus.f.bdeSize = RSNN_REQUEST_SZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) else if (cmdcode == SLI_CTNS_DA_ID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) bpl->tus.f.bdeSize = DA_ID_REQUEST_SZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) else if (cmdcode == SLI_CTNS_RFF_ID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) bpl->tus.f.bdeSize = RFF_REQUEST_SZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) bpl->tus.f.bdeSize = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) bpl->tus.w = le32_to_cpu(bpl->tus.w);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) CtReq = (struct lpfc_sli_ct_request *) mp->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) memset(CtReq, 0, sizeof(struct lpfc_sli_ct_request));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) CtReq->RevisionId.bits.Revision = SLI_CT_REVISION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) CtReq->RevisionId.bits.InId = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) CtReq->FsType = SLI_CT_DIRECTORY_SERVICE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) CtReq->FsSubType = SLI_CT_DIRECTORY_NAME_SERVER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) CtReq->CommandResponse.bits.Size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) switch (cmdcode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) case SLI_CTNS_GID_FT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) CtReq->CommandResponse.bits.CmdRsp =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) cpu_to_be16(SLI_CTNS_GID_FT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) CtReq->un.gid.Fc4Type = context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) if (vport->port_state < LPFC_NS_QRY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) vport->port_state = LPFC_NS_QRY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) lpfc_set_disctmo(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) cmpl = lpfc_cmpl_ct_cmd_gid_ft;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) rsp_size = FC_MAX_NS_RSP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) case SLI_CTNS_GID_PT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) CtReq->CommandResponse.bits.CmdRsp =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) cpu_to_be16(SLI_CTNS_GID_PT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) CtReq->un.gid.PortType = context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) if (vport->port_state < LPFC_NS_QRY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) vport->port_state = LPFC_NS_QRY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) lpfc_set_disctmo(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) cmpl = lpfc_cmpl_ct_cmd_gid_pt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) rsp_size = FC_MAX_NS_RSP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) case SLI_CTNS_GFF_ID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) CtReq->CommandResponse.bits.CmdRsp =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) cpu_to_be16(SLI_CTNS_GFF_ID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) CtReq->un.gff.PortId = cpu_to_be32(context);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) cmpl = lpfc_cmpl_ct_cmd_gff_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) case SLI_CTNS_GFT_ID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) CtReq->CommandResponse.bits.CmdRsp =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) cpu_to_be16(SLI_CTNS_GFT_ID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) CtReq->un.gft.PortId = cpu_to_be32(context);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) cmpl = lpfc_cmpl_ct_cmd_gft_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) case SLI_CTNS_RFT_ID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) vport->ct_flags &= ~FC_CT_RFT_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) CtReq->CommandResponse.bits.CmdRsp =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) cpu_to_be16(SLI_CTNS_RFT_ID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) CtReq->un.rft.PortId = cpu_to_be32(vport->fc_myDID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) /* Register FC4 FCP type if enabled. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) if (vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) vport->cfg_enable_fc4_type == LPFC_ENABLE_FCP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) CtReq->un.rft.fcpReg = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) /* Register NVME type if enabled. Defined LE and swapped.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) * rsvd[0] is used as word1 because of the hard-coded
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) * word0 usage in the ct_request data structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) if (vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) CtReq->un.rft.rsvd[0] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) cpu_to_be32(LPFC_FC4_TYPE_BITMASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) ptr = (uint32_t *)CtReq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) "6433 Issue RFT (%s %s): %08x %08x %08x %08x "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) "%08x %08x %08x %08x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) CtReq->un.rft.fcpReg ? "FCP" : " ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) CtReq->un.rft.rsvd[0] ? "NVME" : " ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) *ptr, *(ptr + 1), *(ptr + 2), *(ptr + 3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) *(ptr + 4), *(ptr + 5),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) *(ptr + 6), *(ptr + 7));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) cmpl = lpfc_cmpl_ct_cmd_rft_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) case SLI_CTNS_RNN_ID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) vport->ct_flags &= ~FC_CT_RNN_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) CtReq->CommandResponse.bits.CmdRsp =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) cpu_to_be16(SLI_CTNS_RNN_ID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) CtReq->un.rnn.PortId = cpu_to_be32(vport->fc_myDID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) memcpy(CtReq->un.rnn.wwnn, &vport->fc_nodename,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) sizeof(struct lpfc_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) cmpl = lpfc_cmpl_ct_cmd_rnn_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) case SLI_CTNS_RSPN_ID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) vport->ct_flags &= ~FC_CT_RSPN_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) CtReq->CommandResponse.bits.CmdRsp =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) cpu_to_be16(SLI_CTNS_RSPN_ID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) CtReq->un.rspn.PortId = cpu_to_be32(vport->fc_myDID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) size = sizeof(CtReq->un.rspn.symbname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) CtReq->un.rspn.len =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) lpfc_vport_symbolic_port_name(vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) CtReq->un.rspn.symbname, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) cmpl = lpfc_cmpl_ct_cmd_rspn_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) case SLI_CTNS_RSNN_NN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) vport->ct_flags &= ~FC_CT_RSNN_NN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) CtReq->CommandResponse.bits.CmdRsp =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) cpu_to_be16(SLI_CTNS_RSNN_NN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) memcpy(CtReq->un.rsnn.wwnn, &vport->fc_nodename,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) sizeof(struct lpfc_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) size = sizeof(CtReq->un.rsnn.symbname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) CtReq->un.rsnn.len =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) lpfc_vport_symbolic_node_name(vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) CtReq->un.rsnn.symbname, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) cmpl = lpfc_cmpl_ct_cmd_rsnn_nn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) case SLI_CTNS_DA_ID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) /* Implement DA_ID Nameserver request */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) CtReq->CommandResponse.bits.CmdRsp =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) cpu_to_be16(SLI_CTNS_DA_ID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) CtReq->un.da_id.port_id = cpu_to_be32(vport->fc_myDID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) cmpl = lpfc_cmpl_ct_cmd_da_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) case SLI_CTNS_RFF_ID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) vport->ct_flags &= ~FC_CT_RFF_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) CtReq->CommandResponse.bits.CmdRsp =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) cpu_to_be16(SLI_CTNS_RFF_ID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) CtReq->un.rff.PortId = cpu_to_be32(vport->fc_myDID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) CtReq->un.rff.fbits = FC4_FEATURE_INIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) /* The driver always supports FC_TYPE_FCP. However, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) * caller can specify NVME (type x28) as well. But only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) * these that FC4 type is supported.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) if (((vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) (vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) (context == FC_TYPE_NVME)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) if ((vport == phba->pport) && phba->nvmet_support) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) CtReq->un.rff.fbits = (FC4_FEATURE_TARGET |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) FC4_FEATURE_NVME_DISC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) lpfc_nvmet_update_targetport(phba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) lpfc_nvme_update_localport(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) CtReq->un.rff.type_code = context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) } else if (((vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) (vport->cfg_enable_fc4_type == LPFC_ENABLE_FCP)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) (context == FC_TYPE_FCP))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) CtReq->un.rff.type_code = context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) goto ns_cmd_free_bmpvirt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) ptr = (uint32_t *)CtReq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) "6434 Issue RFF (%s): %08x %08x %08x %08x "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) "%08x %08x %08x %08x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) (context == FC_TYPE_NVME) ? "NVME" : "FCP",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) *ptr, *(ptr + 1), *(ptr + 2), *(ptr + 3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) *(ptr + 4), *(ptr + 5),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) *(ptr + 6), *(ptr + 7));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) cmpl = lpfc_cmpl_ct_cmd_rff_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) /* The lpfc_ct_cmd/lpfc_get_req shall increment ndlp reference count
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) * to hold ndlp reference for the corresponding callback function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) if (!lpfc_ct_cmd(vport, mp, bmp, ndlp, cmpl, rsp_size, retry)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) /* On success, The cmpl function will free the buffers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) "Issue CT cmd: cmd:x%x did:x%x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) cmdcode, ndlp->nlp_DID, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) rc=6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) /* Decrement ndlp reference count to release ndlp reference held
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) * for the failed command's callback function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) lpfc_nlp_put(ndlp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) ns_cmd_free_bmpvirt:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) ns_cmd_free_bmp:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) kfree(bmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) ns_cmd_free_mpvirt:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) lpfc_mbuf_free(phba, mp->virt, mp->phys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) ns_cmd_free_mp:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) kfree(mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) ns_cmd_exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) "0266 Issue NameServer Req x%x err %d Data: x%x x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) cmdcode, rc, vport->fc_flag, vport->fc_rscn_id_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) * lpfc_cmpl_ct_disc_fdmi - Handle a discovery FDMI completion
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) * @phba: Pointer to HBA context object.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) * @cmdiocb: Pointer to the command IOCBQ.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) * @rspiocb: Pointer to the response IOCBQ.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) * This function to handle the completion of a driver initiated FDMI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) * CT command issued during discovery.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) lpfc_cmpl_ct_disc_fdmi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) struct lpfc_iocbq *rspiocb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) struct lpfc_vport *vport = cmdiocb->vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) struct lpfc_dmabuf *inp = cmdiocb->context1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) struct lpfc_dmabuf *outp = cmdiocb->context2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) struct lpfc_sli_ct_request *CTcmd = inp->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) struct lpfc_sli_ct_request *CTrsp = outp->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) uint16_t fdmi_cmd = CTcmd->CommandResponse.bits.CmdRsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) uint16_t fdmi_rsp = CTrsp->CommandResponse.bits.CmdRsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) IOCB_t *irsp = &rspiocb->iocb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) struct lpfc_nodelist *ndlp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) uint32_t latt, cmd, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) latt = lpfc_els_chk_latt(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) "FDMI cmpl: status:x%x/x%x latt:%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) irsp->ulpStatus, irsp->un.ulpWord[4], latt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) if (latt || irsp->ulpStatus) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) /* Look for a retryable error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) if (irsp->ulpStatus == IOSTAT_LOCAL_REJECT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) switch ((irsp->un.ulpWord[4] & IOERR_PARAM_MASK)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) case IOERR_SLI_ABORTED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) case IOERR_SLI_DOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) /* Driver aborted this IO. No retry as error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) * is likely Offline->Online or some adapter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) * error. Recovery will try again.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) case IOERR_ABORT_IN_PROGRESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) case IOERR_SEQUENCE_TIMEOUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) case IOERR_ILLEGAL_FRAME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) case IOERR_NO_RESOURCES:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) case IOERR_ILLEGAL_COMMAND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) cmdiocb->retry++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) if (cmdiocb->retry >= LPFC_FDMI_MAX_RETRY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) /* Retry the same FDMI command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) err = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) cmdiocb, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) if (err == IOCB_ERROR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) "0229 FDMI cmd %04x failed, latt = %d "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) "ulpStatus: x%x, rid x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) be16_to_cpu(fdmi_cmd), latt, irsp->ulpStatus,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) irsp->un.ulpWord[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) lpfc_ct_free_iocb(phba, cmdiocb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) ndlp = lpfc_findnode_did(vport, FDMI_DID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) if (!ndlp || !NLP_CHK_NODE_ACT(ndlp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) /* Check for a CT LS_RJT response */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) cmd = be16_to_cpu(fdmi_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) if (fdmi_rsp == cpu_to_be16(SLI_CT_RESPONSE_FS_RJT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) /* FDMI rsp failed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) "0220 FDMI cmd failed FS_RJT Data: x%x", cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) /* Should we fallback to FDMI-2 / FDMI-1 ? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) case SLI_MGMT_RHBA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) if (vport->fdmi_hba_mask == LPFC_FDMI2_HBA_ATTR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) /* Fallback to FDMI-1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) vport->fdmi_hba_mask = LPFC_FDMI1_HBA_ATTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) vport->fdmi_port_mask = LPFC_FDMI1_PORT_ATTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) /* Start over */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_DHBA, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) case SLI_MGMT_RPRT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) if (vport->fdmi_port_mask == LPFC_FDMI2_PORT_ATTR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) /* Fallback to FDMI-1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) vport->fdmi_port_mask = LPFC_FDMI1_PORT_ATTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) /* Start over */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) lpfc_fdmi_cmd(vport, ndlp, cmd, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) if (vport->fdmi_port_mask == LPFC_FDMI2_SMART_ATTR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) vport->fdmi_port_mask = LPFC_FDMI2_PORT_ATTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) /* Retry the same command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) lpfc_fdmi_cmd(vport, ndlp, cmd, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) case SLI_MGMT_RPA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) if (vport->fdmi_port_mask == LPFC_FDMI2_PORT_ATTR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) /* Fallback to FDMI-1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) vport->fdmi_hba_mask = LPFC_FDMI1_HBA_ATTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) vport->fdmi_port_mask = LPFC_FDMI1_PORT_ATTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) /* Start over */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_DHBA, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) if (vport->fdmi_port_mask == LPFC_FDMI2_SMART_ATTR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) vport->fdmi_port_mask = LPFC_FDMI2_PORT_ATTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) /* Retry the same command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) lpfc_fdmi_cmd(vport, ndlp, cmd, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) * On success, need to cycle thru FDMI registration for discovery
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) * DHBA -> DPRT -> RHBA -> RPA (physical port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) * DPRT -> RPRT (vports)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) case SLI_MGMT_RHBA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_RPA, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) case SLI_MGMT_DHBA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_DPRT, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) case SLI_MGMT_DPRT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) if (vport->port_type == LPFC_PHYSICAL_PORT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_RHBA, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_RPRT, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) * lpfc_fdmi_change_check - Check for changed FDMI parameters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) * @vport: pointer to a host virtual N_Port data structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) * Check how many mapped NPorts we are connected to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) * Check if our hostname changed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) * Called from hbeat timeout routine to check if any FDMI parameters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) * changed. If so, re-register those Attributes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) lpfc_fdmi_change_check(struct lpfc_vport *vport)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) struct lpfc_hba *phba = vport->phba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) struct lpfc_nodelist *ndlp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) uint16_t cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) if (!lpfc_is_link_up(phba))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) /* Must be connected to a Fabric */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) if (!(vport->fc_flag & FC_FABRIC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) ndlp = lpfc_findnode_did(vport, FDMI_DID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) if (!ndlp || !NLP_CHK_NODE_ACT(ndlp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) /* Check if system hostname changed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) if (strcmp(phba->os_host_name, init_utsname()->nodename)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) memset(phba->os_host_name, 0, sizeof(phba->os_host_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) scnprintf(phba->os_host_name, sizeof(phba->os_host_name), "%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) init_utsname()->nodename);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) lpfc_ns_cmd(vport, SLI_CTNS_RSNN_NN, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) /* Since this effects multiple HBA and PORT attributes, we need
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) * de-register and go thru the whole FDMI registration cycle.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) * DHBA -> DPRT -> RHBA -> RPA (physical port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) * DPRT -> RPRT (vports)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) if (vport->port_type == LPFC_PHYSICAL_PORT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_DHBA, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_DPRT, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) /* Since this code path registers all the port attributes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) * we can just return without further checking.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) if (!(vport->fdmi_port_mask & LPFC_FDMI_PORT_ATTR_num_disc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) /* Check if the number of mapped NPorts changed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) cnt = lpfc_find_map_node(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) if (cnt == vport->fdmi_num_disc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) if (vport->port_type == LPFC_PHYSICAL_PORT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_RPA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) LPFC_FDMI_PORT_ATTR_num_disc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_RPRT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) LPFC_FDMI_PORT_ATTR_num_disc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) /* Routines for all individual HBA attributes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) lpfc_fdmi_hba_attr_wwnn(struct lpfc_vport *vport, struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) memcpy(&ae->un.AttrWWN, &vport->fc_sparam.nodeName,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) sizeof(struct lpfc_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) size = FOURBYTES + sizeof(struct lpfc_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) ad->AttrType = cpu_to_be16(RHBA_NODENAME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) lpfc_fdmi_hba_attr_manufacturer(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) uint32_t len, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) /* This string MUST be consistent with other FC platforms
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) * supported by Broadcom.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) strncpy(ae->un.AttrString,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) "Emulex Corporation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) len = strnlen(ae->un.AttrString,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) len += (len & 3) ? (4 - (len & 3)) : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) size = FOURBYTES + len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) ad->AttrType = cpu_to_be16(RHBA_MANUFACTURER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) lpfc_fdmi_hba_attr_sn(struct lpfc_vport *vport, struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) struct lpfc_hba *phba = vport->phba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) uint32_t len, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) strncpy(ae->un.AttrString, phba->SerialNumber,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) len = strnlen(ae->un.AttrString,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) len += (len & 3) ? (4 - (len & 3)) : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) size = FOURBYTES + len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) ad->AttrType = cpu_to_be16(RHBA_SERIAL_NUMBER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) lpfc_fdmi_hba_attr_model(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) struct lpfc_hba *phba = vport->phba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) uint32_t len, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) strncpy(ae->un.AttrString, phba->ModelName,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) len = strnlen(ae->un.AttrString, sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) len += (len & 3) ? (4 - (len & 3)) : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) size = FOURBYTES + len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) ad->AttrType = cpu_to_be16(RHBA_MODEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) lpfc_fdmi_hba_attr_description(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) struct lpfc_hba *phba = vport->phba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) uint32_t len, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) strncpy(ae->un.AttrString, phba->ModelDesc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) len = strnlen(ae->un.AttrString,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) len += (len & 3) ? (4 - (len & 3)) : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) size = FOURBYTES + len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) ad->AttrType = cpu_to_be16(RHBA_MODEL_DESCRIPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) lpfc_fdmi_hba_attr_hdw_ver(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) struct lpfc_hba *phba = vport->phba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) lpfc_vpd_t *vp = &phba->vpd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) uint32_t i, j, incr, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) /* Convert JEDEC ID to ascii for hardware version */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) incr = vp->rev.biuRev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) for (i = 0; i < 8; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) j = (incr & 0xf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) if (j <= 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) ae->un.AttrString[7 - i] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) (char)((uint8_t) 0x30 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) (uint8_t) j);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) ae->un.AttrString[7 - i] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) (char)((uint8_t) 0x61 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) (uint8_t) (j - 10));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) incr = (incr >> 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) size = FOURBYTES + 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) ad->AttrType = cpu_to_be16(RHBA_HARDWARE_VERSION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) lpfc_fdmi_hba_attr_drvr_ver(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) uint32_t len, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) strncpy(ae->un.AttrString, lpfc_release_version,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) len = strnlen(ae->un.AttrString,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) len += (len & 3) ? (4 - (len & 3)) : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) size = FOURBYTES + len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) ad->AttrType = cpu_to_be16(RHBA_DRIVER_VERSION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) lpfc_fdmi_hba_attr_rom_ver(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) struct lpfc_hba *phba = vport->phba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) uint32_t len, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) if (phba->sli_rev == LPFC_SLI_REV4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) lpfc_decode_firmware_rev(phba, ae->un.AttrString, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) strncpy(ae->un.AttrString, phba->OptionROMVersion,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) len = strnlen(ae->un.AttrString,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) len += (len & 3) ? (4 - (len & 3)) : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) size = FOURBYTES + len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) ad->AttrType = cpu_to_be16(RHBA_OPTION_ROM_VERSION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) lpfc_fdmi_hba_attr_fmw_ver(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) struct lpfc_hba *phba = vport->phba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) uint32_t len, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) lpfc_decode_firmware_rev(phba, ae->un.AttrString, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) len = strnlen(ae->un.AttrString,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) len += (len & 3) ? (4 - (len & 3)) : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) size = FOURBYTES + len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) ad->AttrType = cpu_to_be16(RHBA_FIRMWARE_VERSION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) lpfc_fdmi_hba_attr_os_ver(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) uint32_t len, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) snprintf(ae->un.AttrString, sizeof(ae->un.AttrString), "%s %s %s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) init_utsname()->sysname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) init_utsname()->release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) init_utsname()->version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) len = strnlen(ae->un.AttrString, sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) len += (len & 3) ? (4 - (len & 3)) : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) size = FOURBYTES + len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) ad->AttrType = cpu_to_be16(RHBA_OS_NAME_VERSION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) lpfc_fdmi_hba_attr_ct_len(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) ae->un.AttrInt = cpu_to_be32(LPFC_MAX_CT_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) size = FOURBYTES + sizeof(uint32_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) ad->AttrType = cpu_to_be16(RHBA_MAX_CT_PAYLOAD_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) lpfc_fdmi_hba_attr_symbolic_name(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) uint32_t len, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) len = lpfc_vport_symbolic_node_name(vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) ae->un.AttrString, 256);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) len += (len & 3) ? (4 - (len & 3)) : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) size = FOURBYTES + len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) ad->AttrType = cpu_to_be16(RHBA_SYM_NODENAME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) lpfc_fdmi_hba_attr_vendor_info(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) /* Nothing is defined for this currently */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) ae->un.AttrInt = cpu_to_be32(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) size = FOURBYTES + sizeof(uint32_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) ad->AttrType = cpu_to_be16(RHBA_VENDOR_INFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) lpfc_fdmi_hba_attr_num_ports(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) /* Each driver instance corresponds to a single port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) ae->un.AttrInt = cpu_to_be32(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) size = FOURBYTES + sizeof(uint32_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) ad->AttrType = cpu_to_be16(RHBA_NUM_PORTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) lpfc_fdmi_hba_attr_fabric_wwnn(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) memcpy(&ae->un.AttrWWN, &vport->fabric_nodename,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) sizeof(struct lpfc_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) size = FOURBYTES + sizeof(struct lpfc_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) ad->AttrType = cpu_to_be16(RHBA_FABRIC_WWNN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) lpfc_fdmi_hba_attr_bios_ver(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) struct lpfc_hba *phba = vport->phba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) uint32_t len, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) strlcat(ae->un.AttrString, phba->BIOSVersion,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) len = strnlen(ae->un.AttrString,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) len += (len & 3) ? (4 - (len & 3)) : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) size = FOURBYTES + len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) ad->AttrType = cpu_to_be16(RHBA_BIOS_VERSION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) lpfc_fdmi_hba_attr_bios_state(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) /* Driver doesn't have access to this information */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) ae->un.AttrInt = cpu_to_be32(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) size = FOURBYTES + sizeof(uint32_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) ad->AttrType = cpu_to_be16(RHBA_BIOS_STATE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) lpfc_fdmi_hba_attr_vendor_id(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) uint32_t len, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) strncpy(ae->un.AttrString, "EMULEX",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) len = strnlen(ae->un.AttrString,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) len += (len & 3) ? (4 - (len & 3)) : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) size = FOURBYTES + len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) ad->AttrType = cpu_to_be16(RHBA_VENDOR_ID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) /* Routines for all individual PORT attributes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) lpfc_fdmi_port_attr_fc4type(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) struct lpfc_hba *phba = vport->phba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) ae->un.AttrTypes[2] = 0x01; /* Type 0x8 - FCP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) ae->un.AttrTypes[7] = 0x01; /* Type 0x20 - CT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) /* Check to see if Firmware supports NVME and on physical port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) if ((phba->sli_rev == LPFC_SLI_REV4) && (vport == phba->pport) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) phba->sli4_hba.pc_sli4_params.nvme)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) ae->un.AttrTypes[6] = 0x01; /* Type 0x28 - NVME */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) size = FOURBYTES + 32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) ad->AttrType = cpu_to_be16(RPRT_SUPPORTED_FC4_TYPES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) lpfc_fdmi_port_attr_support_speed(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) struct lpfc_hba *phba = vport->phba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) ae->un.AttrInt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) if (!(phba->hba_flag & HBA_FCOE_MODE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) if (phba->lmt & LMT_128Gb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) ae->un.AttrInt |= HBA_PORTSPEED_128GFC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) if (phba->lmt & LMT_64Gb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) ae->un.AttrInt |= HBA_PORTSPEED_64GFC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) if (phba->lmt & LMT_32Gb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) ae->un.AttrInt |= HBA_PORTSPEED_32GFC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) if (phba->lmt & LMT_16Gb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) ae->un.AttrInt |= HBA_PORTSPEED_16GFC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) if (phba->lmt & LMT_10Gb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) ae->un.AttrInt |= HBA_PORTSPEED_10GFC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) if (phba->lmt & LMT_8Gb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) ae->un.AttrInt |= HBA_PORTSPEED_8GFC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) if (phba->lmt & LMT_4Gb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) ae->un.AttrInt |= HBA_PORTSPEED_4GFC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) if (phba->lmt & LMT_2Gb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) ae->un.AttrInt |= HBA_PORTSPEED_2GFC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) if (phba->lmt & LMT_1Gb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) ae->un.AttrInt |= HBA_PORTSPEED_1GFC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) /* FCoE links support only one speed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) switch (phba->fc_linkspeed) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) case LPFC_ASYNC_LINK_SPEED_10GBPS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) ae->un.AttrInt = HBA_PORTSPEED_10GE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) case LPFC_ASYNC_LINK_SPEED_25GBPS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) ae->un.AttrInt = HBA_PORTSPEED_25GE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) case LPFC_ASYNC_LINK_SPEED_40GBPS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) ae->un.AttrInt = HBA_PORTSPEED_40GE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) case LPFC_ASYNC_LINK_SPEED_100GBPS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) ae->un.AttrInt = HBA_PORTSPEED_100GE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) ae->un.AttrInt = cpu_to_be32(ae->un.AttrInt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) size = FOURBYTES + sizeof(uint32_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) ad->AttrType = cpu_to_be16(RPRT_SUPPORTED_SPEED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) lpfc_fdmi_port_attr_speed(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) struct lpfc_hba *phba = vport->phba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) if (!(phba->hba_flag & HBA_FCOE_MODE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) switch (phba->fc_linkspeed) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) case LPFC_LINK_SPEED_1GHZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) ae->un.AttrInt = HBA_PORTSPEED_1GFC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) case LPFC_LINK_SPEED_2GHZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) ae->un.AttrInt = HBA_PORTSPEED_2GFC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) case LPFC_LINK_SPEED_4GHZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) ae->un.AttrInt = HBA_PORTSPEED_4GFC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) case LPFC_LINK_SPEED_8GHZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) ae->un.AttrInt = HBA_PORTSPEED_8GFC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) case LPFC_LINK_SPEED_10GHZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) ae->un.AttrInt = HBA_PORTSPEED_10GFC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) case LPFC_LINK_SPEED_16GHZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) ae->un.AttrInt = HBA_PORTSPEED_16GFC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) case LPFC_LINK_SPEED_32GHZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) ae->un.AttrInt = HBA_PORTSPEED_32GFC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) case LPFC_LINK_SPEED_64GHZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) ae->un.AttrInt = HBA_PORTSPEED_64GFC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) case LPFC_LINK_SPEED_128GHZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) ae->un.AttrInt = HBA_PORTSPEED_128GFC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) ae->un.AttrInt = HBA_PORTSPEED_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) switch (phba->fc_linkspeed) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) case LPFC_ASYNC_LINK_SPEED_10GBPS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) ae->un.AttrInt = HBA_PORTSPEED_10GE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) case LPFC_ASYNC_LINK_SPEED_25GBPS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) ae->un.AttrInt = HBA_PORTSPEED_25GE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) case LPFC_ASYNC_LINK_SPEED_40GBPS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) ae->un.AttrInt = HBA_PORTSPEED_40GE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) case LPFC_ASYNC_LINK_SPEED_100GBPS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) ae->un.AttrInt = HBA_PORTSPEED_100GE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) ae->un.AttrInt = HBA_PORTSPEED_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) ae->un.AttrInt = cpu_to_be32(ae->un.AttrInt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) size = FOURBYTES + sizeof(uint32_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) ad->AttrType = cpu_to_be16(RPRT_PORT_SPEED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) lpfc_fdmi_port_attr_max_frame(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) struct serv_parm *hsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) hsp = (struct serv_parm *)&vport->fc_sparam;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) ae->un.AttrInt = (((uint32_t) hsp->cmn.bbRcvSizeMsb & 0x0F) << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) (uint32_t) hsp->cmn.bbRcvSizeLsb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) ae->un.AttrInt = cpu_to_be32(ae->un.AttrInt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) size = FOURBYTES + sizeof(uint32_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) ad->AttrType = cpu_to_be16(RPRT_MAX_FRAME_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) lpfc_fdmi_port_attr_os_devname(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) uint32_t len, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) snprintf(ae->un.AttrString, sizeof(ae->un.AttrString),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) "/sys/class/scsi_host/host%d", shost->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) len = strnlen((char *)ae->un.AttrString,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) len += (len & 3) ? (4 - (len & 3)) : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) size = FOURBYTES + len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) ad->AttrType = cpu_to_be16(RPRT_OS_DEVICE_NAME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) lpfc_fdmi_port_attr_host_name(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) uint32_t len, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) scnprintf(ae->un.AttrString, sizeof(ae->un.AttrString), "%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) vport->phba->os_host_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) len = strnlen(ae->un.AttrString, sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) len += (len & 3) ? (4 - (len & 3)) : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) size = FOURBYTES + len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) ad->AttrType = cpu_to_be16(RPRT_HOST_NAME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) lpfc_fdmi_port_attr_wwnn(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) memcpy(&ae->un.AttrWWN, &vport->fc_sparam.nodeName,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) sizeof(struct lpfc_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) size = FOURBYTES + sizeof(struct lpfc_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) ad->AttrType = cpu_to_be16(RPRT_NODENAME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) lpfc_fdmi_port_attr_wwpn(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) memcpy(&ae->un.AttrWWN, &vport->fc_sparam.portName,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) sizeof(struct lpfc_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) size = FOURBYTES + sizeof(struct lpfc_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) ad->AttrType = cpu_to_be16(RPRT_PORTNAME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) lpfc_fdmi_port_attr_symbolic_name(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) uint32_t len, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) len = lpfc_vport_symbolic_port_name(vport, ae->un.AttrString, 256);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) len += (len & 3) ? (4 - (len & 3)) : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) size = FOURBYTES + len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) ad->AttrType = cpu_to_be16(RPRT_SYM_PORTNAME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) lpfc_fdmi_port_attr_port_type(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) struct lpfc_hba *phba = vport->phba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730) if (phba->fc_topology == LPFC_TOPOLOGY_LOOP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) ae->un.AttrInt = cpu_to_be32(LPFC_FDMI_PORTTYPE_NLPORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) ae->un.AttrInt = cpu_to_be32(LPFC_FDMI_PORTTYPE_NPORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) size = FOURBYTES + sizeof(uint32_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) ad->AttrType = cpu_to_be16(RPRT_PORT_TYPE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) lpfc_fdmi_port_attr_class(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) ae->un.AttrInt = cpu_to_be32(FC_COS_CLASS2 | FC_COS_CLASS3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) size = FOURBYTES + sizeof(uint32_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) ad->AttrType = cpu_to_be16(RPRT_SUPPORTED_CLASS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) lpfc_fdmi_port_attr_fabric_wwpn(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) memcpy(&ae->un.AttrWWN, &vport->fabric_portname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) sizeof(struct lpfc_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) size = FOURBYTES + sizeof(struct lpfc_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) ad->AttrType = cpu_to_be16(RPRT_FABRICNAME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) lpfc_fdmi_port_attr_active_fc4type(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783) ae->un.AttrTypes[2] = 0x01; /* Type 0x8 - FCP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) ae->un.AttrTypes[7] = 0x01; /* Type 0x20 - CT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786) /* Check to see if NVME is configured or not */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) if (vport->phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) ae->un.AttrTypes[6] = 0x1; /* Type 0x28 - NVME */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790) size = FOURBYTES + 32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792) ad->AttrType = cpu_to_be16(RPRT_ACTIVE_FC4_TYPES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) lpfc_fdmi_port_attr_port_state(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804) /* Link Up - operational */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) ae->un.AttrInt = cpu_to_be32(LPFC_FDMI_PORTSTATE_ONLINE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) size = FOURBYTES + sizeof(uint32_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) ad->AttrType = cpu_to_be16(RPRT_PORT_STATE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813) lpfc_fdmi_port_attr_num_disc(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) vport->fdmi_num_disc = lpfc_find_map_node(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) ae->un.AttrInt = cpu_to_be32(vport->fdmi_num_disc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) size = FOURBYTES + sizeof(uint32_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) ad->AttrType = cpu_to_be16(RPRT_DISC_PORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829) lpfc_fdmi_port_attr_nportid(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836) ae->un.AttrInt = cpu_to_be32(vport->fc_myDID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837) size = FOURBYTES + sizeof(uint32_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839) ad->AttrType = cpu_to_be16(RPRT_PORT_ID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844) lpfc_fdmi_smart_attr_service(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848) uint32_t len, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) strncpy(ae->un.AttrString, "Smart SAN Initiator",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855) len = strnlen(ae->un.AttrString,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) len += (len & 3) ? (4 - (len & 3)) : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858) size = FOURBYTES + len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860) ad->AttrType = cpu_to_be16(RPRT_SMART_SERVICE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865) lpfc_fdmi_smart_attr_guid(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) memcpy(&ae->un.AttrString, &vport->fc_sparam.nodeName,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875) sizeof(struct lpfc_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) memcpy((((uint8_t *)&ae->un.AttrString) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) sizeof(struct lpfc_name)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) &vport->fc_sparam.portName, sizeof(struct lpfc_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879) size = FOURBYTES + (2 * sizeof(struct lpfc_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881) ad->AttrType = cpu_to_be16(RPRT_SMART_GUID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886) lpfc_fdmi_smart_attr_version(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890) uint32_t len, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895) strncpy(ae->un.AttrString, "Smart SAN Version 2.0",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) len = strnlen(ae->un.AttrString,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) len += (len & 3) ? (4 - (len & 3)) : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900) size = FOURBYTES + len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902) ad->AttrType = cpu_to_be16(RPRT_SMART_VERSION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) lpfc_fdmi_smart_attr_model(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) struct lpfc_hba *phba = vport->phba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) uint32_t len, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915) memset(ae, 0, sizeof(*ae));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917) strncpy(ae->un.AttrString, phba->ModelName,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918) sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919) len = strnlen(ae->un.AttrString, sizeof(ae->un.AttrString));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920) len += (len & 3) ? (4 - (len & 3)) : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921) size = FOURBYTES + len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923) ad->AttrType = cpu_to_be16(RPRT_SMART_MODEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928) lpfc_fdmi_smart_attr_port_info(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2929) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2930) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2931) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2932) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2933)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2934) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2936) /* SRIOV (type 3) is not supported */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2937) if (vport->vpi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2938) ae->un.AttrInt = cpu_to_be32(2); /* NPIV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2939) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2940) ae->un.AttrInt = cpu_to_be32(1); /* Physical */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2941) size = FOURBYTES + sizeof(uint32_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2942) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2943) ad->AttrType = cpu_to_be16(RPRT_SMART_PORT_INFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2944) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2945) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2946)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2947) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2948) lpfc_fdmi_smart_attr_qos(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2949) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2950) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2951) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2952) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2953)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2954) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2955) ae->un.AttrInt = cpu_to_be32(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2956) size = FOURBYTES + sizeof(uint32_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2957) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2958) ad->AttrType = cpu_to_be16(RPRT_SMART_QOS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2959) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2960) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2961)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2962) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2963) lpfc_fdmi_smart_attr_security(struct lpfc_vport *vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2964) struct lpfc_fdmi_attr_def *ad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2965) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2966) struct lpfc_fdmi_attr_entry *ae;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2967) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2968)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2969) ae = &ad->AttrValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2970) ae->un.AttrInt = cpu_to_be32(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2971) size = FOURBYTES + sizeof(uint32_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2972) ad->AttrLen = cpu_to_be16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2973) ad->AttrType = cpu_to_be16(RPRT_SMART_SECURITY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2974) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2975) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2976)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2977) /* RHBA attribute jump table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2978) int (*lpfc_fdmi_hba_action[])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2979) (struct lpfc_vport *vport, struct lpfc_fdmi_attr_def *ad) = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2980) /* Action routine Mask bit Attribute type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2981) lpfc_fdmi_hba_attr_wwnn, /* bit0 RHBA_NODENAME */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2982) lpfc_fdmi_hba_attr_manufacturer, /* bit1 RHBA_MANUFACTURER */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2983) lpfc_fdmi_hba_attr_sn, /* bit2 RHBA_SERIAL_NUMBER */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2984) lpfc_fdmi_hba_attr_model, /* bit3 RHBA_MODEL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2985) lpfc_fdmi_hba_attr_description, /* bit4 RHBA_MODEL_DESCRIPTION */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2986) lpfc_fdmi_hba_attr_hdw_ver, /* bit5 RHBA_HARDWARE_VERSION */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2987) lpfc_fdmi_hba_attr_drvr_ver, /* bit6 RHBA_DRIVER_VERSION */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2988) lpfc_fdmi_hba_attr_rom_ver, /* bit7 RHBA_OPTION_ROM_VERSION */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2989) lpfc_fdmi_hba_attr_fmw_ver, /* bit8 RHBA_FIRMWARE_VERSION */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2990) lpfc_fdmi_hba_attr_os_ver, /* bit9 RHBA_OS_NAME_VERSION */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2991) lpfc_fdmi_hba_attr_ct_len, /* bit10 RHBA_MAX_CT_PAYLOAD_LEN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2992) lpfc_fdmi_hba_attr_symbolic_name, /* bit11 RHBA_SYM_NODENAME */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2993) lpfc_fdmi_hba_attr_vendor_info, /* bit12 RHBA_VENDOR_INFO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2994) lpfc_fdmi_hba_attr_num_ports, /* bit13 RHBA_NUM_PORTS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2995) lpfc_fdmi_hba_attr_fabric_wwnn, /* bit14 RHBA_FABRIC_WWNN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2996) lpfc_fdmi_hba_attr_bios_ver, /* bit15 RHBA_BIOS_VERSION */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2997) lpfc_fdmi_hba_attr_bios_state, /* bit16 RHBA_BIOS_STATE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2998) lpfc_fdmi_hba_attr_vendor_id, /* bit17 RHBA_VENDOR_ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2999) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3001) /* RPA / RPRT attribute jump table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3002) int (*lpfc_fdmi_port_action[])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3003) (struct lpfc_vport *vport, struct lpfc_fdmi_attr_def *ad) = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3004) /* Action routine Mask bit Attribute type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3005) lpfc_fdmi_port_attr_fc4type, /* bit0 RPRT_SUPPORT_FC4_TYPES */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3006) lpfc_fdmi_port_attr_support_speed, /* bit1 RPRT_SUPPORTED_SPEED */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3007) lpfc_fdmi_port_attr_speed, /* bit2 RPRT_PORT_SPEED */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3008) lpfc_fdmi_port_attr_max_frame, /* bit3 RPRT_MAX_FRAME_SIZE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3009) lpfc_fdmi_port_attr_os_devname, /* bit4 RPRT_OS_DEVICE_NAME */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3010) lpfc_fdmi_port_attr_host_name, /* bit5 RPRT_HOST_NAME */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3011) lpfc_fdmi_port_attr_wwnn, /* bit6 RPRT_NODENAME */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3012) lpfc_fdmi_port_attr_wwpn, /* bit7 RPRT_PORTNAME */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3013) lpfc_fdmi_port_attr_symbolic_name, /* bit8 RPRT_SYM_PORTNAME */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3014) lpfc_fdmi_port_attr_port_type, /* bit9 RPRT_PORT_TYPE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3015) lpfc_fdmi_port_attr_class, /* bit10 RPRT_SUPPORTED_CLASS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3016) lpfc_fdmi_port_attr_fabric_wwpn, /* bit11 RPRT_FABRICNAME */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3017) lpfc_fdmi_port_attr_active_fc4type, /* bit12 RPRT_ACTIVE_FC4_TYPES */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3018) lpfc_fdmi_port_attr_port_state, /* bit13 RPRT_PORT_STATE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3019) lpfc_fdmi_port_attr_num_disc, /* bit14 RPRT_DISC_PORT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3020) lpfc_fdmi_port_attr_nportid, /* bit15 RPRT_PORT_ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3021) lpfc_fdmi_smart_attr_service, /* bit16 RPRT_SMART_SERVICE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3022) lpfc_fdmi_smart_attr_guid, /* bit17 RPRT_SMART_GUID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3023) lpfc_fdmi_smart_attr_version, /* bit18 RPRT_SMART_VERSION */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3024) lpfc_fdmi_smart_attr_model, /* bit19 RPRT_SMART_MODEL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3025) lpfc_fdmi_smart_attr_port_info, /* bit20 RPRT_SMART_PORT_INFO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3026) lpfc_fdmi_smart_attr_qos, /* bit21 RPRT_SMART_QOS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3027) lpfc_fdmi_smart_attr_security, /* bit22 RPRT_SMART_SECURITY */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3028) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3029)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3030) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3031) * lpfc_fdmi_cmd - Build and send a FDMI cmd to the specified NPort
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3032) * @vport: pointer to a host virtual N_Port data structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3033) * @ndlp: ndlp to send FDMI cmd to (if NULL use FDMI_DID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3034) * @cmdcode: FDMI command to send
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3035) * @new_mask: Mask of HBA or PORT Attributes to send
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3036) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3037) * Builds and sends a FDMI command using the CT subsystem.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3038) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3039) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3040) lpfc_fdmi_cmd(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3041) int cmdcode, uint32_t new_mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3042) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3043) struct lpfc_hba *phba = vport->phba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3044) struct lpfc_dmabuf *mp, *bmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3045) struct lpfc_sli_ct_request *CtReq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3046) struct ulp_bde64 *bpl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3047) uint32_t bit_pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3048) uint32_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3049) uint32_t rsp_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3050) uint32_t mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3051) struct lpfc_fdmi_reg_hba *rh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3052) struct lpfc_fdmi_port_entry *pe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3053) struct lpfc_fdmi_reg_portattr *pab = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3054) struct lpfc_fdmi_attr_block *ab = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3055) int (*func)(struct lpfc_vport *vport, struct lpfc_fdmi_attr_def *ad);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3056) void (*cmpl)(struct lpfc_hba *, struct lpfc_iocbq *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3057) struct lpfc_iocbq *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3058)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3059) if (!ndlp || !NLP_CHK_NODE_ACT(ndlp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3060) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3061)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3062) cmpl = lpfc_cmpl_ct_disc_fdmi; /* called from discovery */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3064) /* fill in BDEs for command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3065) /* Allocate buffer for command payload */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3066) mp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3067) if (!mp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3068) goto fdmi_cmd_exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3069)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3070) mp->virt = lpfc_mbuf_alloc(phba, 0, &(mp->phys));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3071) if (!mp->virt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3072) goto fdmi_cmd_free_mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3073)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3074) /* Allocate buffer for Buffer ptr list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3075) bmp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3076) if (!bmp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3077) goto fdmi_cmd_free_mpvirt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3079) bmp->virt = lpfc_mbuf_alloc(phba, 0, &(bmp->phys));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3080) if (!bmp->virt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3081) goto fdmi_cmd_free_bmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3082)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3083) INIT_LIST_HEAD(&mp->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3084) INIT_LIST_HEAD(&bmp->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3086) /* FDMI request */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3087) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3088) "0218 FDMI Request Data: x%x x%x x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3089) vport->fc_flag, vport->port_state, cmdcode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3090) CtReq = (struct lpfc_sli_ct_request *)mp->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3091)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3092) /* First populate the CT_IU preamble */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3093) memset(CtReq, 0, sizeof(struct lpfc_sli_ct_request));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3094) CtReq->RevisionId.bits.Revision = SLI_CT_REVISION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3095) CtReq->RevisionId.bits.InId = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3096)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3097) CtReq->FsType = SLI_CT_MANAGEMENT_SERVICE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3098) CtReq->FsSubType = SLI_CT_FDMI_Subtypes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3099)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3100) CtReq->CommandResponse.bits.CmdRsp = cpu_to_be16(cmdcode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3101) rsp_size = LPFC_BPL_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3102) size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3104) /* Next fill in the specific FDMI cmd information */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3105) switch (cmdcode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3106) case SLI_MGMT_RHAT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3107) case SLI_MGMT_RHBA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3108) rh = (struct lpfc_fdmi_reg_hba *)&CtReq->un.PortID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3109) /* HBA Identifier */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3110) memcpy(&rh->hi.PortName, &phba->pport->fc_sparam.portName,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3111) sizeof(struct lpfc_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3113) if (cmdcode == SLI_MGMT_RHBA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3114) /* Registered Port List */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3115) /* One entry (port) per adapter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3116) rh->rpl.EntryCnt = cpu_to_be32(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3117) memcpy(&rh->rpl.pe.PortName,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3118) &phba->pport->fc_sparam.portName,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3119) sizeof(struct lpfc_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3121) /* point to the HBA attribute block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3122) size = 2 * sizeof(struct lpfc_name) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3123) FOURBYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3124) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3125) size = sizeof(struct lpfc_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3126) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3127) ab = (struct lpfc_fdmi_attr_block *)((uint8_t *)rh + size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3128) ab->EntryCnt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3129) size += FOURBYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3130) bit_pos = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3131) if (new_mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3132) mask = new_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3133) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3134) mask = vport->fdmi_hba_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3136) /* Mask will dictate what attributes to build in the request */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3137) while (mask) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3138) if (mask & 0x1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3139) func = lpfc_fdmi_hba_action[bit_pos];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3140) size += func(vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3141) (struct lpfc_fdmi_attr_def *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3142) ((uint8_t *)rh + size));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3143) ab->EntryCnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3144) if ((size + 256) >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3145) (LPFC_BPL_SIZE - LPFC_CT_PREAMBLE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3146) goto hba_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3147) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3148) mask = mask >> 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3149) bit_pos++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3150) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3151) hba_out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3152) ab->EntryCnt = cpu_to_be32(ab->EntryCnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3153) /* Total size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3154) size = GID_REQUEST_SZ - 4 + size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3155) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3157) case SLI_MGMT_RPRT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3158) case SLI_MGMT_RPA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3159) pab = (struct lpfc_fdmi_reg_portattr *)&CtReq->un.PortID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3160) if (cmdcode == SLI_MGMT_RPRT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3161) rh = (struct lpfc_fdmi_reg_hba *)pab;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3162) /* HBA Identifier */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3163) memcpy(&rh->hi.PortName,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3164) &phba->pport->fc_sparam.portName,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3165) sizeof(struct lpfc_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3166) pab = (struct lpfc_fdmi_reg_portattr *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3167) ((uint8_t *)pab + sizeof(struct lpfc_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3168) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3170) memcpy((uint8_t *)&pab->PortName,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3171) (uint8_t *)&vport->fc_sparam.portName,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3172) sizeof(struct lpfc_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3173) size += sizeof(struct lpfc_name) + FOURBYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3174) pab->ab.EntryCnt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3175) bit_pos = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3176) if (new_mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3177) mask = new_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3178) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3179) mask = vport->fdmi_port_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3181) /* Mask will dictate what attributes to build in the request */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3182) while (mask) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3183) if (mask & 0x1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3184) func = lpfc_fdmi_port_action[bit_pos];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3185) size += func(vport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3186) (struct lpfc_fdmi_attr_def *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3187) ((uint8_t *)pab + size));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3188) pab->ab.EntryCnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3189) if ((size + 256) >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3190) (LPFC_BPL_SIZE - LPFC_CT_PREAMBLE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3191) goto port_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3192) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3193) mask = mask >> 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3194) bit_pos++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3195) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3196) port_out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3197) pab->ab.EntryCnt = cpu_to_be32(pab->ab.EntryCnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3198) /* Total size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3199) if (cmdcode == SLI_MGMT_RPRT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3200) size += sizeof(struct lpfc_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3201) size = GID_REQUEST_SZ - 4 + size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3202) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3204) case SLI_MGMT_GHAT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3205) case SLI_MGMT_GRPL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3206) rsp_size = FC_MAX_NS_RSP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3207) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3208) case SLI_MGMT_DHBA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3209) case SLI_MGMT_DHAT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3210) pe = (struct lpfc_fdmi_port_entry *)&CtReq->un.PortID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3211) memcpy((uint8_t *)&pe->PortName,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3212) (uint8_t *)&vport->fc_sparam.portName,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3213) sizeof(struct lpfc_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3214) size = GID_REQUEST_SZ - 4 + sizeof(struct lpfc_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3215) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3217) case SLI_MGMT_GPAT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3218) case SLI_MGMT_GPAS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3219) rsp_size = FC_MAX_NS_RSP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3220) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3221) case SLI_MGMT_DPRT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3222) case SLI_MGMT_DPA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3223) pe = (struct lpfc_fdmi_port_entry *)&CtReq->un.PortID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3224) memcpy((uint8_t *)&pe->PortName,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3225) (uint8_t *)&vport->fc_sparam.portName,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3226) sizeof(struct lpfc_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3227) size = GID_REQUEST_SZ - 4 + sizeof(struct lpfc_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3228) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3229) case SLI_MGMT_GRHL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3230) size = GID_REQUEST_SZ - 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3231) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3232) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3233) lpfc_printf_vlog(vport, KERN_WARNING, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3234) "0298 FDMI cmdcode x%x not supported\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3235) cmdcode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3236) goto fdmi_cmd_free_bmpvirt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3237) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3238) CtReq->CommandResponse.bits.Size = cpu_to_be16(rsp_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3240) bpl = (struct ulp_bde64 *)bmp->virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3241) bpl->addrHigh = le32_to_cpu(putPaddrHigh(mp->phys));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3242) bpl->addrLow = le32_to_cpu(putPaddrLow(mp->phys));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3243) bpl->tus.f.bdeFlags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3244) bpl->tus.f.bdeSize = size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3246) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3247) * The lpfc_ct_cmd/lpfc_get_req shall increment ndlp reference count
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3248) * to hold ndlp reference for the corresponding callback function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3249) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3250) if (!lpfc_ct_cmd(vport, mp, bmp, ndlp, cmpl, rsp_size, 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3251) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3253) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3254) * Decrement ndlp reference count to release ndlp reference held
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3255) * for the failed command's callback function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3256) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3257) lpfc_nlp_put(ndlp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3259) fdmi_cmd_free_bmpvirt:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3260) lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3261) fdmi_cmd_free_bmp:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3262) kfree(bmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3263) fdmi_cmd_free_mpvirt:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3264) lpfc_mbuf_free(phba, mp->virt, mp->phys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3265) fdmi_cmd_free_mp:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3266) kfree(mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3267) fdmi_cmd_exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3268) /* Issue FDMI request failed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3269) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3270) "0244 Issue FDMI request failed Data: x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3271) cmdcode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3272) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3273) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3275) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3276) * lpfc_delayed_disc_tmo - Timeout handler for delayed discovery timer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3277) * @t: Context object of the timer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3278) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3279) * This function set the WORKER_DELAYED_DISC_TMO flag and wake up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3280) * the worker thread.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3281) **/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3282) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3283) lpfc_delayed_disc_tmo(struct timer_list *t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3284) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3285) struct lpfc_vport *vport = from_timer(vport, t, delayed_disc_tmo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3286) struct lpfc_hba *phba = vport->phba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3287) uint32_t tmo_posted;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3288) unsigned long iflag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3290) spin_lock_irqsave(&vport->work_port_lock, iflag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3291) tmo_posted = vport->work_port_events & WORKER_DELAYED_DISC_TMO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3292) if (!tmo_posted)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3293) vport->work_port_events |= WORKER_DELAYED_DISC_TMO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3294) spin_unlock_irqrestore(&vport->work_port_lock, iflag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3296) if (!tmo_posted)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3297) lpfc_worker_wake_up(phba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3298) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3299) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3301) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3302) * lpfc_delayed_disc_timeout_handler - Function called by worker thread to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3303) * handle delayed discovery.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3304) * @vport: pointer to a host virtual N_Port data structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3305) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3306) * This function start nport discovery of the vport.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3307) **/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3308) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3309) lpfc_delayed_disc_timeout_handler(struct lpfc_vport *vport)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3310) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3311) struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3313) spin_lock_irq(shost->host_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3314) if (!(vport->fc_flag & FC_DISC_DELAYED)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3315) spin_unlock_irq(shost->host_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3316) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3317) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3318) vport->fc_flag &= ~FC_DISC_DELAYED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3319) spin_unlock_irq(shost->host_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3321) lpfc_do_scr_ns_plogi(vport->phba, vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3322) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3324) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3325) lpfc_decode_firmware_rev(struct lpfc_hba *phba, char *fwrevision, int flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3326) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3327) struct lpfc_sli *psli = &phba->sli;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3328) lpfc_vpd_t *vp = &phba->vpd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3329) uint32_t b1, b2, b3, b4, i, rev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3330) char c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3331) uint32_t *ptr, str[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3332) uint8_t *fwname;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3334) if (phba->sli_rev == LPFC_SLI_REV4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3335) snprintf(fwrevision, FW_REV_STR_SIZE, "%s", vp->rev.opFwName);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3336) else if (vp->rev.rBit) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3337) if (psli->sli_flag & LPFC_SLI_ACTIVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3338) rev = vp->rev.sli2FwRev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3339) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3340) rev = vp->rev.sli1FwRev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3342) b1 = (rev & 0x0000f000) >> 12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3343) b2 = (rev & 0x00000f00) >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3344) b3 = (rev & 0x000000c0) >> 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3345) b4 = (rev & 0x00000030) >> 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3347) switch (b4) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3348) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3349) c = 'N';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3350) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3351) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3352) c = 'A';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3353) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3354) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3355) c = 'B';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3356) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3357) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3358) c = 'X';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3359) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3360) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3361) c = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3362) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3363) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3364) b4 = (rev & 0x0000000f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3366) if (psli->sli_flag & LPFC_SLI_ACTIVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3367) fwname = vp->rev.sli2FwName;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3368) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3369) fwname = vp->rev.sli1FwName;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3371) for (i = 0; i < 16; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3372) if (fwname[i] == 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3373) fwname[i] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3375) ptr = (uint32_t*)fwname;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3377) for (i = 0; i < 3; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3378) str[i] = be32_to_cpu(*ptr++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3380) if (c == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3381) if (flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3382) sprintf(fwrevision, "%d.%d%d (%s)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3383) b1, b2, b3, (char *)str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3384) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3385) sprintf(fwrevision, "%d.%d%d", b1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3386) b2, b3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3387) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3388) if (flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3389) sprintf(fwrevision, "%d.%d%d%c%d (%s)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3390) b1, b2, b3, c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3391) b4, (char *)str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3392) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3393) sprintf(fwrevision, "%d.%d%d%c%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3394) b1, b2, b3, c, b4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3395) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3396) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3397) rev = vp->rev.smFwRev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3399) b1 = (rev & 0xff000000) >> 24;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3400) b2 = (rev & 0x00f00000) >> 20;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3401) b3 = (rev & 0x000f0000) >> 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3402) c = (rev & 0x0000ff00) >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3403) b4 = (rev & 0x000000ff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3405) sprintf(fwrevision, "%d.%d%d%c%d", b1, b2, b3, c, b4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3406) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3407) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3408) }