1 /*******************************************************************
2 * This file is part of the Emulex Linux Device Driver for *
3 * Enterprise Fibre Channel Host Bus Adapters. *
4 * Refer to the README file included with this package for *
5 * driver version and adapter support. *
6 * Copyright (C) 2004 Emulex Corporation. *
9 * This program is free software; you can redistribute it and/or *
10 * modify it under the terms of the GNU General Public License *
11 * as published by the Free Software Foundation; either version 2 *
12 * of the License, or (at your option) any later version. *
14 * This program is distributed in the hope that it will be useful, *
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
17 * GNU General Public License for more details, a copy of which *
18 * can be found in the file COPYING included with this package. *
19 *******************************************************************/
22 * $Id: lpfc_disc.h 1.45 2004/11/10 11:40:40EST sf_support Exp $
32 #define FC_MAX_HOLD_RSCN 32 /* max number of deferred RSCNs */
33 #define FC_MAX_NS_RSP 65536 /* max size NameServer rsp */
34 #define FC_MAXLOOP 126 /* max devices supported on a fc loop */
35 #define LPFC_DISC_FLOGI_TMO 10 /* Discovery FLOGI ratov */
37 /* Defines for failMask bitmask
38 * These are reasons that the device is not currently available
41 #define LPFC_DEV_LINK_DOWN 0x1 /* Link is down */
42 #define LPFC_DEV_DISAPPEARED 0x2 /* Device disappeared from mapped
44 #define LPFC_DEV_DISCOVERY_INP 0x4 /* Device to go through discovery */
45 #define LPFC_DEV_DISCONNECTED 0x8 /* noactive connection to remote dev */
47 /* These defines are used for set failMask routines */
48 #define LPFC_SET_BITMASK 1
49 #define LPFC_CLR_BITMASK 2
51 /* Provide an enumeration for the Types of addresses a FARP can resolve. */
52 typedef enum lpfc_farp_addr_type {
56 } LPFC_FARP_ADDR_TYPE;
58 /* This is the protocol dependent definition for a Node List Entry.
59 * This is used by Fibre Channel protocol to support FCP.
62 struct lpfc_bindlist {
63 struct list_head nlp_listp;
64 struct lpfc_target *nlp_Target; /* ptr to the tgt structure */
65 struct lpfc_name nlp_portname; /* port name */
66 struct lpfc_name nlp_nodename; /* node name */
67 uint16_t nlp_bind_type;
68 uint16_t nlp_sid; /* scsi id */
69 uint32_t nlp_DID; /* FibreChannel D_ID of entry */
72 struct lpfc_nodelist {
73 struct list_head nlp_listp;
74 struct lpfc_name nlp_portname; /* port name */
75 struct lpfc_name nlp_nodename; /* node name */
76 uint32_t nlp_failMask; /* failure mask for device */
77 uint32_t nlp_flag; /* entry flags */
78 uint32_t nlp_DID; /* FC D_ID of entry */
79 uint32_t nlp_last_elscmd; /* Last ELS cmd sent */
81 #define NLP_FC_NODE 0x1 /* entry is an FC node */
82 #define NLP_FABRIC 0x4 /* entry rep a Fabric entity */
83 #define NLP_FCP_TARGET 0x8 /* entry is an FCP target */
86 uint16_t nlp_state; /* state transition indicator */
87 uint16_t nlp_xri; /* output exchange id for RPI */
88 uint16_t nlp_sid; /* scsi id */
89 uint8_t nlp_retry; /* used for ELS retries */
90 uint8_t nlp_disc_refcnt; /* used for DSM */
91 uint8_t nlp_fcp_info; /* class info, bits 0-3 */
92 #define NLP_FCP_2_DEVICE 0x10 /* FCP-2 device */
94 struct timer_list nlp_delayfunc; /* Used for delayed ELS cmds */
95 struct timer_list nlp_tmofunc; /* Used for nodev tmo */
96 struct lpfc_target *nlp_Target; /* Pointer to the target
99 struct lpfc_bindlist *nlp_listp_bind; /* Linked list bounded remote
101 struct lpfc_nodelist *nlp_rpi_hash_next;
102 struct lpfc_hba *nlp_phba;
106 * lpfc_node_farp_list:
107 * This data structure defines the attributes associated with
108 * an outstanding FARP REQ to a remote node.
110 * listentry - head of this list of pending farp requests.
111 * rnode_addr - The address of the remote node. Either the IEEE, WWPN, or
112 * WWNN. Used in the FARP request.
115 struct lpfc_node_farp_pend {
116 struct list_head listentry;
117 struct lpfc_name rnode_addr;
120 /* Defines for nlp_flag (uint32) */
121 #define NLP_NO_LIST 0x0 /* Indicates immediately free node */
122 #define NLP_UNUSED_LIST 0x1 /* Flg to indicate node will be freed */
123 #define NLP_PLOGI_LIST 0x2 /* Flg to indicate sent PLOGI */
124 #define NLP_ADISC_LIST 0x3 /* Flg to indicate sent ADISC */
125 #define NLP_REGLOGIN_LIST 0x4 /* Flg to indicate sent REG_LOGIN */
126 #define NLP_PRLI_LIST 0x5 /* Flg to indicate sent PRLI */
127 #define NLP_UNMAPPED_LIST 0x6 /* Node is now unmapped */
128 #define NLP_MAPPED_LIST 0x7 /* Node is now mapped */
129 #define NLP_NPR_LIST 0x8 /* Node is in NPort Recovery state */
130 #define NLP_JUST_DQ 0x9 /* just deque ndlp in lpfc_nlp_list */
131 #define NLP_LIST_MASK 0xf /* mask to see what list node is on */
132 #define NLP_PLOGI_SND 0x20 /* sent PLOGI request for this entry */
133 #define NLP_PRLI_SND 0x40 /* sent PRLI request for this entry */
134 #define NLP_ADISC_SND 0x80 /* sent ADISC request for this entry */
135 #define NLP_LOGO_SND 0x100 /* sent LOGO request for this entry */
136 #define NLP_RNID_SND 0x400 /* sent RNID request for this entry */
137 #define NLP_ELS_SND_MASK 0x7e0 /* sent ELS request for this entry */
138 #define NLP_AUTOMAP 0x800 /* Entry was automap'ed */
139 #define NLP_SEED_WWPN 0x1000 /* Entry scsi id is seeded for WWPN */
140 #define NLP_SEED_WWNN 0x2000 /* Entry scsi id is seeded for WWNN */
141 #define NLP_SEED_DID 0x4000 /* Entry scsi id is seeded for DID */
142 #define NLP_SEED_MASK 0x807000 /* mask for seeded flags */
143 #define NLP_NS_NODE 0x8000 /* Authenticated entry by NameServer */
144 #define NLP_NODEV_TMO 0x10000 /* nodev timeout is running for node */
145 #define NLP_DELAY_TMO 0x20000 /* delay timeout is running for node */
146 #define NLP_NPR_2B_DISC 0x40000 /* node is included in num_disc_nodes */
147 #define NLP_RCV_PLOGI 0x80000 /* Rcv'ed PLOGI from remote system */
148 #define NLP_LOGO_ACC 0x100000 /* Process LOGO after ACC completes */
149 #define NLP_TGT_NO_SCSIID 0x200000 /* good PRLI but no binding for scsid */
150 #define NLP_SEED_ALPA 0x800000 /* SCSI id is derived from alpa array */
151 #define NLP_ACC_REGLOGIN 0x1000000 /* Issue Reg Login after successful
153 #define NLP_NPR_ADISC 0x2000000 /* Issue ADISC when dq'ed from
155 #define NLP_DELAY_REMOVE 0x4000000 /* Defer removal till end of DSM */
157 /* Defines for list searchs */
158 #define NLP_SEARCH_MAPPED 0x1 /* search mapped */
159 #define NLP_SEARCH_UNMAPPED 0x2 /* search unmapped */
160 #define NLP_SEARCH_PLOGI 0x4 /* search plogi */
161 #define NLP_SEARCH_ADISC 0x8 /* search adisc */
162 #define NLP_SEARCH_REGLOGIN 0x10 /* search reglogin */
163 #define NLP_SEARCH_PRLI 0x20 /* search prli */
164 #define NLP_SEARCH_NPR 0x40 /* search npr */
165 #define NLP_SEARCH_UNUSED 0x80 /* search mapped */
166 #define NLP_SEARCH_ALL 0xff /* search all lists */
168 /* There are 4 different double linked lists nodelist entries can reside on.
169 * The Port Login (PLOGI) list and Address Discovery (ADISC) list are used
170 * when Link Up discovery or Registered State Change Notification (RSCN)
171 * processing is needed. Each list holds the nodes that require a PLOGI or
172 * ADISC Extended Link Service (ELS) request. These lists keep track of the
173 * nodes affected by an RSCN, or a Link Up (Typically, all nodes are effected
174 * by Link Up) event. The unmapped_list contains all nodes that have
175 * successfully logged into at the Fibre Channel level. The
176 * mapped_list will contain all nodes that are mapped FCP targets.
178 * The bind list is a list of undiscovered (potentially non-existent) nodes
179 * that we have saved binding information on. This information is used when
180 * nodes transition from the unmapped to the mapped list.
183 /* Defines for nlp_state */
184 #define NLP_STE_UNUSED_NODE 0x0 /* node is just allocated */
185 #define NLP_STE_PLOGI_ISSUE 0x1 /* PLOGI was sent to NL_PORT */
186 #define NLP_STE_ADISC_ISSUE 0x2 /* ADISC was sent to NL_PORT */
187 #define NLP_STE_REG_LOGIN_ISSUE 0x3 /* REG_LOGIN was issued for NL_PORT */
188 #define NLP_STE_PRLI_ISSUE 0x4 /* PRLI was sent to NL_PORT */
189 #define NLP_STE_UNMAPPED_NODE 0x5 /* PRLI completed from NL_PORT */
190 #define NLP_STE_MAPPED_NODE 0x6 /* Identified as a FCP Target */
191 #define NLP_STE_NPR_NODE 0x7 /* NPort disappeared */
192 #define NLP_STE_MAX_STATE 0x8
193 #define NLP_STE_FREED_NODE 0xff /* node entry was freed to MEM_NLP */
195 /* For UNUSED_NODE state, the node has just been allocated.
196 * For PLOGI_ISSUE and REG_LOGIN_ISSUE, the node is on
197 * the PLOGI list. For REG_LOGIN_COMPL, the node is taken off the PLOGI list
198 * and put on the unmapped list. For ADISC processing, the node is taken off
199 * the ADISC list and placed on either the mapped or unmapped list (depending
200 * on its previous state). Once on the unmapped list, a PRLI is issued and the
201 * state changed to PRLI_ISSUE. When the PRLI completion occurs, the state is
202 * changed to PRLI_COMPL. If the completion indicates a mapped
203 * node, the node is taken off the unmapped list. The binding list is checked
204 * for a valid binding, or a binding is automatically assigned. If binding
205 * assignment is unsuccessful, the node is left on the unmapped list. If
206 * binding assignment is successful, the associated binding list entry (if
207 * any) is removed, and the node is placed on the mapped list.
210 * For a Link Down, all nodes on the ADISC, PLOGI, unmapped or mapped
211 * lists will receive a DEVICE_RECOVERY event. If the linkdown or nodev timers
212 * expire, all effected nodes will receive a DEVICE_RM event.
215 * For a Link Up or RSCN, all nodes will move from the mapped / unmapped lists
216 * to either the ADISC or PLOGI list. After a Nameserver query or ALPA loopmap
217 * check, additional nodes may be added (DEVICE_ADD) or removed (DEVICE_RM) to /
218 * from the PLOGI or ADISC lists. Once the PLOGI and ADISC lists are populated,
219 * we will first process the ADISC list. 32 entries are processed initially and
220 * ADISC is initited for each one. Completions / Events for each node are
221 * funnelled thru the state machine. As each node finishes ADISC processing, it
222 * starts ADISC for any nodes waiting for ADISC processing. If no nodes are
223 * waiting, and the ADISC list count is identically 0, then we are done. For
224 * Link Up discovery, since all nodes on the PLOGI list are UNREG_LOGIN'ed, we
225 * can issue a CLEAR_LA and reenable Link Events. Next we will process the PLOGI
226 * list. 32 entries are processed initially and PLOGI is initited for each one.
227 * Completions / Events for each node are funnelled thru the state machine. As
228 * each node finishes PLOGI processing, it starts PLOGI for any nodes waiting
229 * for PLOGI processing. If no nodes are waiting, and the PLOGI list count is
230 * identically 0, then we are done. We have now completed discovery / RSCN
231 * handling. Upon completion, ALL nodes should be on either the mapped or
235 /* Defines for Node List Entry Events that could happen */
236 #define NLP_EVT_RCV_PLOGI 0x0 /* Rcv'd an ELS PLOGI command */
237 #define NLP_EVT_RCV_PRLI 0x1 /* Rcv'd an ELS PRLI command */
238 #define NLP_EVT_RCV_LOGO 0x2 /* Rcv'd an ELS LOGO command */
239 #define NLP_EVT_RCV_ADISC 0x3 /* Rcv'd an ELS ADISC command */
240 #define NLP_EVT_RCV_PDISC 0x4 /* Rcv'd an ELS PDISC command */
241 #define NLP_EVT_RCV_PRLO 0x5 /* Rcv'd an ELS PRLO command */
242 #define NLP_EVT_CMPL_PLOGI 0x6 /* Sent an ELS PLOGI command */
243 #define NLP_EVT_CMPL_PRLI 0x7 /* Sent an ELS PRLI command */
244 #define NLP_EVT_CMPL_LOGO 0x8 /* Sent an ELS LOGO command */
245 #define NLP_EVT_CMPL_ADISC 0x9 /* Sent an ELS ADISC command */
246 #define NLP_EVT_CMPL_REG_LOGIN 0xa /* REG_LOGIN mbox cmd completed */
247 #define NLP_EVT_DEVICE_RM 0xb /* Device not found in NS / ALPAmap */
248 #define NLP_EVT_DEVICE_RECOVERY 0xc /* Device existence unknown */
249 #define NLP_EVT_MAX_EVENT 0xd
251 /* structure used to queue event to the discovery tasklet */
252 struct lpfc_disc_evt {
253 struct list_head evt_listp;
258 typedef struct lpfc_disc_evt LPFC_DISC_EVT_t;
260 #define LPFC_EVT_MBOX 0x1
261 #define LPFC_EVT_SOL_IOCB 0x2
262 #define LPFC_EVT_UNSOL_IOCB 0x3
263 #define LPFC_EVT_NODEV_TMO 0x4
264 #define LPFC_EVT_SCAN 0x5
266 /* Definitions for Binding Entry Type for lpfc_parse_binding_entry() */
267 #define LPFC_BIND_WW_NN_PN 0
268 #define LPFC_BIND_DID 1
270 #endif /* _H_LPFC_DISC */