^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-2018 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-2013 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) #define FC_MAX_HOLD_RSCN 32 /* max number of deferred RSCNs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define FC_MAX_NS_RSP 64512 /* max size NameServer rsp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define FC_MAXLOOP 126 /* max devices supported on a fc loop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define LPFC_DISC_FLOGI_TMO 10 /* Discovery FLOGI ratov */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) /* This is the protocol dependent definition for a Node List Entry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * This is used by Fibre Channel protocol to support FCP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) /* worker thread events */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) enum lpfc_work_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) LPFC_EVT_ONLINE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) LPFC_EVT_OFFLINE_PREP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) LPFC_EVT_OFFLINE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) LPFC_EVT_WARM_START,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) LPFC_EVT_KILL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) LPFC_EVT_ELS_RETRY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) LPFC_EVT_DEV_LOSS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) LPFC_EVT_FASTPATH_MGMT_EVT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) LPFC_EVT_RESET_HBA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) LPFC_EVT_RECOVER_PORT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) /* structure used to queue event to the discovery tasklet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) struct lpfc_work_evt {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) struct list_head evt_listp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) void *evt_arg1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) void *evt_arg2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) enum lpfc_work_type evt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) struct lpfc_scsi_check_condition_event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) struct lpfc_scsi_varqueuedepth_event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) struct lpfc_scsi_event_header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) struct lpfc_fabric_event_header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) struct lpfc_fcprdchkerr_event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) /* structure used for sending events from fast path */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) struct lpfc_fast_path_event {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) struct lpfc_work_evt work_evt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) struct lpfc_vport *vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) struct lpfc_scsi_check_condition_event check_cond_evt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) struct lpfc_scsi_varqueuedepth_event queue_depth_evt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) struct lpfc_scsi_event_header scsi_evt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) struct lpfc_fabric_event_header fabric_evt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) struct lpfc_fcprdchkerr_event read_check_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) } un;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define LPFC_SLI4_MAX_XRI 1024 /* Used to make the ndlp's xri_bitmap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define XRI_BITMAP_ULONGS (LPFC_SLI4_MAX_XRI / BITS_PER_LONG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) struct lpfc_node_rrqs {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) unsigned long xri_bitmap[XRI_BITMAP_ULONGS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) struct lpfc_nodelist {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) struct list_head nlp_listp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) struct lpfc_name nlp_portname;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) struct lpfc_name nlp_nodename;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) uint32_t nlp_flag; /* entry flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) uint32_t nlp_DID; /* FC D_ID of entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) uint32_t nlp_last_elscmd; /* Last ELS cmd sent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) uint16_t nlp_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define NLP_FC_NODE 0x1 /* entry is an FC node */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define NLP_FABRIC 0x4 /* entry rep a Fabric entity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define NLP_FCP_TARGET 0x8 /* entry is an FCP target */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #define NLP_FCP_INITIATOR 0x10 /* entry is an FCP Initiator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define NLP_NVME_TARGET 0x20 /* entry is a NVME Target */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define NLP_NVME_INITIATOR 0x40 /* entry is a NVME Initiator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define NLP_NVME_DISCOVERY 0x80 /* entry has NVME disc srvc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) uint16_t nlp_fc4_type; /* FC types node supports. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) /* Assigned from GID_FF, only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) * FCP (0x8) and NVME (0x28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) * supported.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define NLP_FC4_NONE 0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define NLP_FC4_FCP 0x1 /* FC4 Type FCP (value x8)) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define NLP_FC4_NVME 0x2 /* FC4 TYPE NVME (value x28) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) uint16_t nlp_rpi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) uint16_t nlp_state; /* state transition indicator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) uint16_t nlp_prev_state; /* state transition indicator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) uint16_t nlp_xri; /* output exchange id for RPI */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) uint16_t nlp_sid; /* scsi id */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define NLP_NO_SID 0xffff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) uint16_t nlp_maxframe; /* Max RCV frame size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) uint8_t nlp_class_sup; /* Supported Classes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) uint8_t nlp_retry; /* used for ELS retries */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) uint8_t nlp_fcp_info; /* class info, bits 0-3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define NLP_FCP_2_DEVICE 0x10 /* FCP-2 device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) u8 nlp_nvme_info; /* NVME NSLER Support */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define NLP_NVME_NSLER 0x1 /* NVME NSLER device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) uint16_t nlp_usg_map; /* ndlp management usage bitmap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define NLP_USG_NODE_ACT_BIT 0x1 /* Indicate ndlp is actively used */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define NLP_USG_IACT_REQ_BIT 0x2 /* Request to inactivate ndlp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define NLP_USG_FREE_REQ_BIT 0x4 /* Request to invoke ndlp memory free */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define NLP_USG_FREE_ACK_BIT 0x8 /* Indicate ndlp memory free invoked */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) struct timer_list nlp_delayfunc; /* Used for delayed ELS cmds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) struct lpfc_hba *phba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) struct fc_rport *rport; /* scsi_transport_fc port structure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) struct lpfc_nvme_rport *nrport; /* nvme transport rport struct. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) struct lpfc_vport *vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) struct lpfc_work_evt els_retry_evt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) struct lpfc_work_evt dev_loss_evt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) struct lpfc_work_evt recovery_evt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) struct kref kref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) atomic_t cmd_pending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) uint32_t cmd_qdepth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) unsigned long last_change_time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) unsigned long *active_rrqs_xri_bitmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) struct lpfc_scsicmd_bkt *lat_data; /* Latency data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) uint32_t fc4_prli_sent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) uint32_t upcall_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define NLP_WAIT_FOR_UNREG 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) uint32_t nvme_fb_size; /* NVME target's supported byte cnt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define NVME_FB_BIT_SHIFT 9 /* PRLI Rsp first burst in 512B units. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) uint32_t nlp_defer_did;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) struct lpfc_node_rrq {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) uint16_t xritag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) uint16_t send_rrq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) uint16_t rxid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) uint32_t nlp_DID; /* FC D_ID of entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) struct lpfc_vport *vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) struct lpfc_nodelist *ndlp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) unsigned long rrq_stop_time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #define lpfc_ndlp_check_qdepth(phba, ndlp) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) (ndlp->cmd_qdepth < phba->sli4_hba.max_cfg_param.max_xri)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) /* Defines for nlp_flag (uint32) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) #define NLP_IGNR_REG_CMPL 0x00000001 /* Rcvd rscn before we cmpl reg login */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) #define NLP_REG_LOGIN_SEND 0x00000002 /* sent reglogin to adapter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #define NLP_RELEASE_RPI 0x00000004 /* Release RPI to free pool */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #define NLP_SUPPRESS_RSP 0x00000010 /* Remote NPort supports suppress rsp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) #define NLP_PLOGI_SND 0x00000020 /* sent PLOGI request for this entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) #define NLP_PRLI_SND 0x00000040 /* sent PRLI request for this entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #define NLP_ADISC_SND 0x00000080 /* sent ADISC request for this entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) #define NLP_LOGO_SND 0x00000100 /* sent LOGO request for this entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #define NLP_RNID_SND 0x00000400 /* sent RNID request for this entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) #define NLP_ELS_SND_MASK 0x000007e0 /* sent ELS request for this entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) #define NLP_NVMET_RECOV 0x00001000 /* NVMET auditing node for recovery. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) #define NLP_FCP_PRLI_RJT 0x00002000 /* Rport does not support FCP PRLI. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) #define NLP_UNREG_INP 0x00008000 /* UNREG_RPI cmd is in progress */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) #define NLP_DEFER_RM 0x00010000 /* Remove this ndlp if no longer used */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) #define NLP_DELAY_TMO 0x00020000 /* delay timeout is running for node */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) #define NLP_NPR_2B_DISC 0x00040000 /* node is included in num_disc_nodes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) #define NLP_RCV_PLOGI 0x00080000 /* Rcv'ed PLOGI from remote system */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) #define NLP_LOGO_ACC 0x00100000 /* Process LOGO after ACC completes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) #define NLP_TGT_NO_SCSIID 0x00200000 /* good PRLI but no binding for scsid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) #define NLP_ISSUE_LOGO 0x00400000 /* waiting to issue a LOGO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) #define NLP_IN_DEV_LOSS 0x00800000 /* devloss in progress */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) #define NLP_ACC_REGLOGIN 0x01000000 /* Issue Reg Login after successful
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) ACC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) #define NLP_NPR_ADISC 0x02000000 /* Issue ADISC when dq'ed from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) NPR list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) #define NLP_RM_DFLT_RPI 0x04000000 /* need to remove leftover dflt RPI */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) #define NLP_NODEV_REMOVE 0x08000000 /* Defer removal till discovery ends */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) #define NLP_TARGET_REMOVE 0x10000000 /* Target remove in process */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) #define NLP_SC_REQ 0x20000000 /* Target requires authentication */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) #define NLP_FIRSTBURST 0x40000000 /* Target supports FirstBurst */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) #define NLP_RPI_REGISTERED 0x80000000 /* nlp_rpi is valid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) /* ndlp usage management macros */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) #define NLP_CHK_NODE_ACT(ndlp) (((ndlp)->nlp_usg_map \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) & NLP_USG_NODE_ACT_BIT) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) !((ndlp)->nlp_usg_map \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) & NLP_USG_FREE_ACK_BIT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) #define NLP_SET_NODE_ACT(ndlp) ((ndlp)->nlp_usg_map \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) |= NLP_USG_NODE_ACT_BIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) #define NLP_INT_NODE_ACT(ndlp) ((ndlp)->nlp_usg_map \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) = NLP_USG_NODE_ACT_BIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) #define NLP_CLR_NODE_ACT(ndlp) ((ndlp)->nlp_usg_map \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) &= ~NLP_USG_NODE_ACT_BIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) #define NLP_CHK_IACT_REQ(ndlp) ((ndlp)->nlp_usg_map \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) & NLP_USG_IACT_REQ_BIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) #define NLP_SET_IACT_REQ(ndlp) ((ndlp)->nlp_usg_map \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) |= NLP_USG_IACT_REQ_BIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) #define NLP_CHK_FREE_REQ(ndlp) ((ndlp)->nlp_usg_map \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) & NLP_USG_FREE_REQ_BIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) #define NLP_SET_FREE_REQ(ndlp) ((ndlp)->nlp_usg_map \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) |= NLP_USG_FREE_REQ_BIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) #define NLP_CHK_FREE_ACK(ndlp) ((ndlp)->nlp_usg_map \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) & NLP_USG_FREE_ACK_BIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) #define NLP_SET_FREE_ACK(ndlp) ((ndlp)->nlp_usg_map \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) |= NLP_USG_FREE_ACK_BIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) /* There are 4 different double linked lists nodelist entries can reside on.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) * The Port Login (PLOGI) list and Address Discovery (ADISC) list are used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) * when Link Up discovery or Registered State Change Notification (RSCN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) * processing is needed. Each list holds the nodes that require a PLOGI or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) * ADISC Extended Link Service (ELS) request. These lists keep track of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) * nodes affected by an RSCN, or a Link Up (Typically, all nodes are effected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) * by Link Up) event. The unmapped_list contains all nodes that have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) * successfully logged into at the Fibre Channel level. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) * mapped_list will contain all nodes that are mapped FCP targets.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) * The bind list is a list of undiscovered (potentially non-existent) nodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) * that we have saved binding information on. This information is used when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) * nodes transition from the unmapped to the mapped list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) /* Defines for nlp_state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) #define NLP_STE_UNUSED_NODE 0x0 /* node is just allocated */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) #define NLP_STE_PLOGI_ISSUE 0x1 /* PLOGI was sent to NL_PORT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) #define NLP_STE_ADISC_ISSUE 0x2 /* ADISC was sent to NL_PORT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) #define NLP_STE_REG_LOGIN_ISSUE 0x3 /* REG_LOGIN was issued for NL_PORT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) #define NLP_STE_PRLI_ISSUE 0x4 /* PRLI was sent to NL_PORT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) #define NLP_STE_LOGO_ISSUE 0x5 /* LOGO was sent to NL_PORT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) #define NLP_STE_UNMAPPED_NODE 0x6 /* PRLI completed from NL_PORT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) #define NLP_STE_MAPPED_NODE 0x7 /* Identified as a FCP Target */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) #define NLP_STE_NPR_NODE 0x8 /* NPort disappeared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) #define NLP_STE_MAX_STATE 0x9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) #define NLP_STE_FREED_NODE 0xff /* node entry was freed to MEM_NLP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) /* For UNUSED_NODE state, the node has just been allocated.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) * For PLOGI_ISSUE and REG_LOGIN_ISSUE, the node is on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) * the PLOGI list. For REG_LOGIN_COMPL, the node is taken off the PLOGI list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) * and put on the unmapped list. For ADISC processing, the node is taken off
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) * the ADISC list and placed on either the mapped or unmapped list (depending
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) * on its previous state). Once on the unmapped list, a PRLI is issued and the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) * state changed to PRLI_ISSUE. When the PRLI completion occurs, the state is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) * changed to PRLI_COMPL. If the completion indicates a mapped
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) * node, the node is taken off the unmapped list. The binding list is checked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) * for a valid binding, or a binding is automatically assigned. If binding
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) * assignment is unsuccessful, the node is left on the unmapped list. If
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) * binding assignment is successful, the associated binding list entry (if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) * any) is removed, and the node is placed on the mapped list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) * For a Link Down, all nodes on the ADISC, PLOGI, unmapped or mapped
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) * lists will receive a DEVICE_RECOVERY event. If the linkdown or devloss timers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) * expire, all effected nodes will receive a DEVICE_RM event.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) * For a Link Up or RSCN, all nodes will move from the mapped / unmapped lists
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) * to either the ADISC or PLOGI list. After a Nameserver query or ALPA loopmap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) * check, additional nodes may be added (DEVICE_ADD) or removed (DEVICE_RM) to /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) * from the PLOGI or ADISC lists. Once the PLOGI and ADISC lists are populated,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) * we will first process the ADISC list. 32 entries are processed initially and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) * ADISC is initited for each one. Completions / Events for each node are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) * funnelled thru the state machine. As each node finishes ADISC processing, it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) * starts ADISC for any nodes waiting for ADISC processing. If no nodes are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) * waiting, and the ADISC list count is identically 0, then we are done. For
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) * Link Up discovery, since all nodes on the PLOGI list are UNREG_LOGIN'ed, we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) * can issue a CLEAR_LA and reenable Link Events. Next we will process the PLOGI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) * list. 32 entries are processed initially and PLOGI is initited for each one.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) * Completions / Events for each node are funnelled thru the state machine. As
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) * each node finishes PLOGI processing, it starts PLOGI for any nodes waiting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) * for PLOGI processing. If no nodes are waiting, and the PLOGI list count is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) * identically 0, then we are done. We have now completed discovery / RSCN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) * handling. Upon completion, ALL nodes should be on either the mapped or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) * unmapped lists.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) /* Defines for Node List Entry Events that could happen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) #define NLP_EVT_RCV_PLOGI 0x0 /* Rcv'd an ELS PLOGI command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) #define NLP_EVT_RCV_PRLI 0x1 /* Rcv'd an ELS PRLI command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) #define NLP_EVT_RCV_LOGO 0x2 /* Rcv'd an ELS LOGO command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) #define NLP_EVT_RCV_ADISC 0x3 /* Rcv'd an ELS ADISC command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) #define NLP_EVT_RCV_PDISC 0x4 /* Rcv'd an ELS PDISC command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) #define NLP_EVT_RCV_PRLO 0x5 /* Rcv'd an ELS PRLO command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) #define NLP_EVT_CMPL_PLOGI 0x6 /* Sent an ELS PLOGI command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) #define NLP_EVT_CMPL_PRLI 0x7 /* Sent an ELS PRLI command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) #define NLP_EVT_CMPL_LOGO 0x8 /* Sent an ELS LOGO command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) #define NLP_EVT_CMPL_ADISC 0x9 /* Sent an ELS ADISC command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) #define NLP_EVT_CMPL_REG_LOGIN 0xa /* REG_LOGIN mbox cmd completed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) #define NLP_EVT_DEVICE_RM 0xb /* Device not found in NS / ALPAmap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) #define NLP_EVT_DEVICE_RECOVERY 0xc /* Device existence unknown */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) #define NLP_EVT_MAX_EVENT 0xd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) #define NLP_EVT_NOTHING_PENDING 0xff