xref: /freebsd/sys/dev/ocs_fc/ocs_common.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
1*ef270ab1SKenneth D. Merry /*-
2*ef270ab1SKenneth D. Merry  * Copyright (c) 2017 Broadcom. All rights reserved.
3*ef270ab1SKenneth D. Merry  * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries.
4*ef270ab1SKenneth D. Merry  *
5*ef270ab1SKenneth D. Merry  * Redistribution and use in source and binary forms, with or without
6*ef270ab1SKenneth D. Merry  * modification, are permitted provided that the following conditions are met:
7*ef270ab1SKenneth D. Merry  *
8*ef270ab1SKenneth D. Merry  * 1. Redistributions of source code must retain the above copyright notice,
9*ef270ab1SKenneth D. Merry  *    this list of conditions and the following disclaimer.
10*ef270ab1SKenneth D. Merry  *
11*ef270ab1SKenneth D. Merry  * 2. Redistributions in binary form must reproduce the above copyright notice,
12*ef270ab1SKenneth D. Merry  *    this list of conditions and the following disclaimer in the documentation
13*ef270ab1SKenneth D. Merry  *    and/or other materials provided with the distribution.
14*ef270ab1SKenneth D. Merry  *
15*ef270ab1SKenneth D. Merry  * 3. Neither the name of the copyright holder nor the names of its contributors
16*ef270ab1SKenneth D. Merry  *    may be used to endorse or promote products derived from this software
17*ef270ab1SKenneth D. Merry  *    without specific prior written permission.
18*ef270ab1SKenneth D. Merry  *
19*ef270ab1SKenneth D. Merry  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20*ef270ab1SKenneth D. Merry  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*ef270ab1SKenneth D. Merry  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*ef270ab1SKenneth D. Merry  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23*ef270ab1SKenneth D. Merry  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*ef270ab1SKenneth D. Merry  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*ef270ab1SKenneth D. Merry  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*ef270ab1SKenneth D. Merry  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*ef270ab1SKenneth D. Merry  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*ef270ab1SKenneth D. Merry  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*ef270ab1SKenneth D. Merry  * POSSIBILITY OF SUCH DAMAGE.
30*ef270ab1SKenneth D. Merry  */
31*ef270ab1SKenneth D. Merry 
32*ef270ab1SKenneth D. Merry /**
33*ef270ab1SKenneth D. Merry  * @file
34*ef270ab1SKenneth D. Merry  * Contains declarations shared between the alex layer and HW/SLI4
35*ef270ab1SKenneth D. Merry  */
36*ef270ab1SKenneth D. Merry 
37*ef270ab1SKenneth D. Merry #if !defined(__OCS_COMMON_H__)
38*ef270ab1SKenneth D. Merry #define __OCS_COMMON_H__
39*ef270ab1SKenneth D. Merry 
40*ef270ab1SKenneth D. Merry #include "ocs_sm.h"
41*ef270ab1SKenneth D. Merry #include "ocs_utils.h"
42*ef270ab1SKenneth D. Merry 
43*ef270ab1SKenneth D. Merry #define OCS_CTRLMASK_XPORT_DISABLE_AUTORSP_TSEND	(1U << 0)
44*ef270ab1SKenneth D. Merry #define OCS_CTRLMASK_XPORT_DISABLE_AUTORSP_TRECEIVE	(1U << 1)
45*ef270ab1SKenneth D. Merry #define OCS_CTRLMASK_XPORT_ENABLE_TARGET_RSCN		(1U << 3)
46*ef270ab1SKenneth D. Merry #define OCS_CTRLMASK_TGT_ALWAYS_VERIFY_DIF		(1U << 4)
47*ef270ab1SKenneth D. Merry #define OCS_CTRLMASK_TGT_SET_DIF_REF_TAG_CRC		(1U << 5)
48*ef270ab1SKenneth D. Merry #define OCS_CTRLMASK_TEST_CHAINED_SGLS			(1U << 6)
49*ef270ab1SKenneth D. Merry #define OCS_CTRLMASK_ISCSI_ISNS_ENABLE			(1U << 7)
50*ef270ab1SKenneth D. Merry #define OCS_CTRLMASK_ENABLE_FABRIC_EMULATION		(1U << 8)
51*ef270ab1SKenneth D. Merry #define OCS_CTRLMASK_INHIBIT_INITIATOR			(1U << 9)
52*ef270ab1SKenneth D. Merry #define OCS_CTRLMASK_CRASH_RESET			(1U << 10)
53*ef270ab1SKenneth D. Merry 
54*ef270ab1SKenneth D. Merry #define enable_target_rscn(ocs) \
55*ef270ab1SKenneth D. Merry 	((ocs->ctrlmask & OCS_CTRLMASK_XPORT_ENABLE_TARGET_RSCN) != 0)
56*ef270ab1SKenneth D. Merry 
57*ef270ab1SKenneth D. Merry /* Used for error injection testing. */
58*ef270ab1SKenneth D. Merry typedef enum {
59*ef270ab1SKenneth D. Merry 	NO_ERR_INJECT = 0,
60*ef270ab1SKenneth D. Merry 	INJECT_DROP_CMD,
61*ef270ab1SKenneth D. Merry 	INJECT_FREE_DROPPED,
62*ef270ab1SKenneth D. Merry 	INJECT_DROP_DATA,
63*ef270ab1SKenneth D. Merry 	INJECT_DROP_RESP,
64*ef270ab1SKenneth D. Merry 	INJECT_DELAY_CMD,
65*ef270ab1SKenneth D. Merry } ocs_err_injection_e;
66*ef270ab1SKenneth D. Merry 
67*ef270ab1SKenneth D. Merry #define MAX_OCS_DEVICES                 64
68*ef270ab1SKenneth D. Merry 
69*ef270ab1SKenneth D. Merry typedef enum {OCS_XPORT_FC, OCS_XPORT_ISCSI} ocs_xport_e;
70*ef270ab1SKenneth D. Merry 
71*ef270ab1SKenneth D. Merry #define OCS_SERVICE_PARMS_LENGTH		0x74
72*ef270ab1SKenneth D. Merry #define OCS_DISPLAY_NAME_LENGTH			32
73*ef270ab1SKenneth D. Merry #define OCS_DISPLAY_BUS_INFO_LENGTH		16
74*ef270ab1SKenneth D. Merry 
75*ef270ab1SKenneth D. Merry #define OCS_WWN_LENGTH				32
76*ef270ab1SKenneth D. Merry 
77*ef270ab1SKenneth D. Merry typedef struct ocs_hw_s ocs_hw_t;
78*ef270ab1SKenneth D. Merry typedef struct ocs_domain_s ocs_domain_t;
79*ef270ab1SKenneth D. Merry typedef struct ocs_sli_port_s ocs_sli_port_t;
80*ef270ab1SKenneth D. Merry typedef struct ocs_sli_port_s ocs_sport_t;
81*ef270ab1SKenneth D. Merry typedef struct ocs_remote_node_s ocs_remote_node_t;
82*ef270ab1SKenneth D. Merry typedef struct ocs_remote_node_group_s ocs_remote_node_group_t;
83*ef270ab1SKenneth D. Merry typedef struct ocs_node_s ocs_node_t;
84*ef270ab1SKenneth D. Merry typedef struct ocs_io_s ocs_io_t;
85*ef270ab1SKenneth D. Merry typedef struct ocs_xport_s ocs_xport_t;
86*ef270ab1SKenneth D. Merry typedef struct ocs_node_cb_s ocs_node_cb_t;
87*ef270ab1SKenneth D. Merry typedef struct ocs_ns_s ocs_ns_t;
88*ef270ab1SKenneth D. Merry 
89*ef270ab1SKenneth D. Merry /* Node group data structure */
90*ef270ab1SKenneth D. Merry typedef struct ocs_node_group_dir_s ocs_node_group_dir_t;
91*ef270ab1SKenneth D. Merry 
92*ef270ab1SKenneth D. Merry #include "ocs_cam.h"
93*ef270ab1SKenneth D. Merry 
94*ef270ab1SKenneth D. Merry /*--------------------------------------------------
95*ef270ab1SKenneth D. Merry  * Shared HW/SLI objects
96*ef270ab1SKenneth D. Merry  *
97*ef270ab1SKenneth D. Merry  * Several objects used by the HW/SLI layers are communal; part of the
98*ef270ab1SKenneth D. Merry  * object is for the sole use of the lower layers, but implementations
99*ef270ab1SKenneth D. Merry  * are free to add their own fields if desired.
100*ef270ab1SKenneth D. Merry  */
101*ef270ab1SKenneth D. Merry 
102*ef270ab1SKenneth D. Merry /**
103*ef270ab1SKenneth D. Merry  * @brief Description of discovered Fabric Domain
104*ef270ab1SKenneth D. Merry  *
105*ef270ab1SKenneth D. Merry  * @note Not all fields are valid for all mediums (FC/ethernet).
106*ef270ab1SKenneth D. Merry  */
107*ef270ab1SKenneth D. Merry typedef struct ocs_domain_record_s {
108*ef270ab1SKenneth D. Merry 	uint32_t	index;		/**< FCF table index (used in REG_FCFI) */
109*ef270ab1SKenneth D. Merry 	uint32_t	priority;	/**< FCF reported priority */
110*ef270ab1SKenneth D. Merry 	uint8_t		address[6];	/**< Switch MAC/FC address */
111*ef270ab1SKenneth D. Merry 	uint8_t		wwn[8];		/**< Switch WWN */
112*ef270ab1SKenneth D. Merry 	union {
113*ef270ab1SKenneth D. Merry 		uint8_t	vlan[512];	/**< bitmap of valid VLAN IDs */
114*ef270ab1SKenneth D. Merry 		uint8_t	loop[128];	/**< FC-AL position map */
115*ef270ab1SKenneth D. Merry 	} map;
116*ef270ab1SKenneth D. Merry 	uint32_t	speed;		/**< link speed */
117*ef270ab1SKenneth D. Merry 	uint32_t	fc_id;		/**< our ports fc_id */
118*ef270ab1SKenneth D. Merry 	uint32_t	is_fc:1,	/**< Connection medium is native FC */
119*ef270ab1SKenneth D. Merry 			is_ethernet:1,	/**< Connection medium is ethernet (FCoE) */
120*ef270ab1SKenneth D. Merry 			is_loop:1,	/**< Topology is FC-AL */
121*ef270ab1SKenneth D. Merry 			is_nport:1,	/**< Topology is N-PORT */
122*ef270ab1SKenneth D. Merry 			:28;
123*ef270ab1SKenneth D. Merry } ocs_domain_record_t;
124*ef270ab1SKenneth D. Merry 
125*ef270ab1SKenneth D. Merry /**
126*ef270ab1SKenneth D. Merry  * @brief Node group directory entry
127*ef270ab1SKenneth D. Merry  */
128*ef270ab1SKenneth D. Merry struct ocs_node_group_dir_s {
129*ef270ab1SKenneth D. Merry 	uint32_t instance_index;		/*<< instance index */
130*ef270ab1SKenneth D. Merry 	ocs_sport_t *sport;			/*<< pointer to sport */
131*ef270ab1SKenneth D. Merry 	uint8_t service_params[OCS_SERVICE_PARMS_LENGTH];	/**< Login parameters */
132*ef270ab1SKenneth D. Merry 	ocs_list_link_t link;			/**< linked list link */
133*ef270ab1SKenneth D. Merry 	ocs_list_t node_group_list;		/**< linked list of node groups */
134*ef270ab1SKenneth D. Merry 	uint32_t node_group_list_count;		/**< current number of elements on the node group list */
135*ef270ab1SKenneth D. Merry 	uint32_t next_idx;			/*<< index of the next node group in list */
136*ef270ab1SKenneth D. Merry };
137*ef270ab1SKenneth D. Merry 
138*ef270ab1SKenneth D. Merry typedef enum {
139*ef270ab1SKenneth D. Merry 	OCS_SPORT_TOPOLOGY_UNKNOWN=0,
140*ef270ab1SKenneth D. Merry 	OCS_SPORT_TOPOLOGY_FABRIC,
141*ef270ab1SKenneth D. Merry 	OCS_SPORT_TOPOLOGY_P2P,
142*ef270ab1SKenneth D. Merry 	OCS_SPORT_TOPOLOGY_LOOP,
143*ef270ab1SKenneth D. Merry } ocs_sport_topology_e;
144*ef270ab1SKenneth D. Merry 
145*ef270ab1SKenneth D. Merry /**
146*ef270ab1SKenneth D. Merry  * @brief SLI Port object
147*ef270ab1SKenneth D. Merry  *
148*ef270ab1SKenneth D. Merry  * The SLI Port object represents the connection between the driver and the
149*ef270ab1SKenneth D. Merry  * FC/FCoE domain. In some topologies / hardware, it is possible to have
150*ef270ab1SKenneth D. Merry  * multiple connections to the domain via different WWN. Each would require
151*ef270ab1SKenneth D. Merry  * a separate SLI port object.
152*ef270ab1SKenneth D. Merry  */
153*ef270ab1SKenneth D. Merry struct ocs_sli_port_s {
154*ef270ab1SKenneth D. Merry 	ocs_t *ocs;				/**< pointer to ocs */
155*ef270ab1SKenneth D. Merry 	uint32_t tgt_id;			/**< target id */
156*ef270ab1SKenneth D. Merry 	uint32_t index;				/**< ??? */
157*ef270ab1SKenneth D. Merry 	uint32_t instance_index;
158*ef270ab1SKenneth D. Merry 	char display_name[OCS_DISPLAY_NAME_LENGTH]; /**< sport display name */
159*ef270ab1SKenneth D. Merry 	ocs_domain_t *domain;			/**< current fabric domain */
160*ef270ab1SKenneth D. Merry 	uint32_t	is_vport:1;		/**< this SPORT is a virtual port */
161*ef270ab1SKenneth D. Merry 	uint64_t	wwpn;			/**< WWPN from HW (host endian) */
162*ef270ab1SKenneth D. Merry 	uint64_t	wwnn;			/**< WWNN from HW (host endian) */
163*ef270ab1SKenneth D. Merry 	ocs_list_t node_list;			/**< list of nodes */
164*ef270ab1SKenneth D. Merry 	ocs_scsi_ini_sport_t ini_sport;		/**< initiator backend private sport data */
165*ef270ab1SKenneth D. Merry 	ocs_scsi_tgt_sport_t tgt_sport;		/**< target backend private sport data */
166*ef270ab1SKenneth D. Merry 	void	*tgt_data;			/**< target backend private pointer */
167*ef270ab1SKenneth D. Merry 	void	*ini_data;			/**< initiator backend private pointer */
168*ef270ab1SKenneth D. Merry 	ocs_mgmt_functions_t *mgmt_functions;
169*ef270ab1SKenneth D. Merry 
170*ef270ab1SKenneth D. Merry 	/*
171*ef270ab1SKenneth D. Merry 	 * Members private to HW/SLI
172*ef270ab1SKenneth D. Merry 	 */
173*ef270ab1SKenneth D. Merry 	ocs_sm_ctx_t	ctx;		/**< state machine context */
174*ef270ab1SKenneth D. Merry 	ocs_hw_t	*hw;		/**< pointer to HW */
175*ef270ab1SKenneth D. Merry 	uint32_t	indicator;	/**< VPI */
176*ef270ab1SKenneth D. Merry 	uint32_t	fc_id;		/**< FC address */
177*ef270ab1SKenneth D. Merry 	ocs_dma_t	dma;		/**< memory for Service Parameters */
178*ef270ab1SKenneth D. Merry 
179*ef270ab1SKenneth D. Merry 	uint8_t		wwnn_str[OCS_WWN_LENGTH];	/**< WWN (ASCII) */
180*ef270ab1SKenneth D. Merry 	uint64_t	sli_wwpn;	/**< WWPN (wire endian) */
181*ef270ab1SKenneth D. Merry 	uint64_t	sli_wwnn;	/**< WWNN (wire endian) */
182*ef270ab1SKenneth D. Merry 	uint32_t	sm_free_req_pending:1;	/**< Free request received while waiting for attach response */
183*ef270ab1SKenneth D. Merry 
184*ef270ab1SKenneth D. Merry 	/*
185*ef270ab1SKenneth D. Merry 	 * Implementation specific fields allowed here
186*ef270ab1SKenneth D. Merry 	 */
187*ef270ab1SKenneth D. Merry 	ocs_sm_ctx_t	sm;			/**< sport context state machine */
188*ef270ab1SKenneth D. Merry 	sparse_vector_t lookup;			/**< fc_id to node lookup object */
189*ef270ab1SKenneth D. Merry 	ocs_list_link_t link;
190*ef270ab1SKenneth D. Merry 	uint32_t	enable_ini:1,		/**< SCSI initiator enabled for this node */
191*ef270ab1SKenneth D. Merry 			enable_tgt:1,		/**< SCSI target enabled for this node */
192*ef270ab1SKenneth D. Merry 			enable_rscn:1,		/**< This SPORT will be expecting RSCN */
193*ef270ab1SKenneth D. Merry 			shutting_down:1,	/**< sport in process of shutting down */
194*ef270ab1SKenneth D. Merry 			p2p_winner:1;		/**< TRUE if we're the point-to-point winner */
195*ef270ab1SKenneth D. Merry 	ocs_sport_topology_e topology;		/**< topology: fabric/p2p/unknown */
196*ef270ab1SKenneth D. Merry 	uint8_t		service_params[OCS_SERVICE_PARMS_LENGTH]; /**< Login parameters */
197*ef270ab1SKenneth D. Merry 	uint32_t	p2p_remote_port_id;	/**< Remote node's port id for p2p */
198*ef270ab1SKenneth D. Merry 	uint32_t	p2p_port_id;		/**< our port's id */
199*ef270ab1SKenneth D. Merry 
200*ef270ab1SKenneth D. Merry 	/* List of remote node group directory entries (used by high login mode) */
201*ef270ab1SKenneth D. Merry 	ocs_lock_t	node_group_lock;
202*ef270ab1SKenneth D. Merry 	uint32_t	node_group_dir_next_instance; /**< HLM next node group directory instance value */
203*ef270ab1SKenneth D. Merry 	uint32_t	node_group_next_instance; /**< HLM next node group instance value */
204*ef270ab1SKenneth D. Merry 	ocs_list_t	node_group_dir_list;
205*ef270ab1SKenneth D. Merry };
206*ef270ab1SKenneth D. Merry 
207*ef270ab1SKenneth D. Merry /**
208*ef270ab1SKenneth D. Merry  * @brief Fibre Channel domain object
209*ef270ab1SKenneth D. Merry  *
210*ef270ab1SKenneth D. Merry  * This object is a container for the various SLI components needed
211*ef270ab1SKenneth D. Merry  * to connect to the domain of a FC or FCoE switch
212*ef270ab1SKenneth D. Merry  */
213*ef270ab1SKenneth D. Merry struct ocs_domain_s {
214*ef270ab1SKenneth D. Merry 	ocs_t *ocs;				/**< pointer back to ocs */
215*ef270ab1SKenneth D. Merry 	uint32_t instance_index;		/**< unique instance index value */
216*ef270ab1SKenneth D. Merry 	char display_name[OCS_DISPLAY_NAME_LENGTH]; /**< Node display name */
217*ef270ab1SKenneth D. Merry 	ocs_list_t sport_list;			/**< linked list of SLI ports */
218*ef270ab1SKenneth D. Merry 	ocs_scsi_ini_domain_t ini_domain;	/**< initiator backend private domain data */
219*ef270ab1SKenneth D. Merry 	ocs_scsi_tgt_domain_t tgt_domain;	/**< target backend private domain data */
220*ef270ab1SKenneth D. Merry 	ocs_mgmt_functions_t *mgmt_functions;
221*ef270ab1SKenneth D. Merry 
222*ef270ab1SKenneth D. Merry 	/* Declarations private to HW/SLI */
223*ef270ab1SKenneth D. Merry 	ocs_hw_t	*hw;		/**< pointer to HW */
224*ef270ab1SKenneth D. Merry 	ocs_sm_ctx_t	sm;		/**< state machine context */
225*ef270ab1SKenneth D. Merry 	uint32_t	fcf;		/**< FC Forwarder table index */
226*ef270ab1SKenneth D. Merry 	uint32_t	fcf_indicator;	/**< FCFI */
227*ef270ab1SKenneth D. Merry 	uint32_t	vlan_id;	/**< VLAN tag for this domain */
228*ef270ab1SKenneth D. Merry 	uint32_t	indicator;	/**< VFI */
229*ef270ab1SKenneth D. Merry 	ocs_dma_t	dma;		/**< memory for Service Parameters */
230*ef270ab1SKenneth D. Merry 	uint32_t	req_rediscover_fcf:1;	/**< TRUE if fcf rediscover is needed (in response
231*ef270ab1SKenneth D. Merry 						 * to Vlink Clear async event */
232*ef270ab1SKenneth D. Merry 
233*ef270ab1SKenneth D. Merry 	/* Declarations private to FC transport */
234*ef270ab1SKenneth D. Merry 	uint64_t	fcf_wwn;	/**< WWN for FCF/switch */
235*ef270ab1SKenneth D. Merry 	ocs_list_link_t link;
236*ef270ab1SKenneth D. Merry 	ocs_sm_ctx_t	drvsm;		/**< driver domain sm context */
237*ef270ab1SKenneth D. Merry 	uint32_t	attached:1,	/**< set true after attach completes */
238*ef270ab1SKenneth D. Merry 			is_fc:1,	/**< is FC */
239*ef270ab1SKenneth D. Merry 			is_loop:1,	/**< is loop topology */
240*ef270ab1SKenneth D. Merry 			is_nlport:1,	/**< is public loop */
241*ef270ab1SKenneth D. Merry 			domain_found_pending:1,	/**< A domain found is pending, drec is updated */
242*ef270ab1SKenneth D. Merry 			req_domain_free:1,	/**< True if domain object should be free'd */
243*ef270ab1SKenneth D. Merry 			req_accept_frames:1,	/**< set in domain state machine to enable frames */
244*ef270ab1SKenneth D. Merry 			domain_notify_pend:1;  /** Set in domain SM to avoid duplicate node event post */
245*ef270ab1SKenneth D. Merry 	ocs_domain_record_t pending_drec; /**< Pending drec if a domain found is pending */
246*ef270ab1SKenneth D. Merry 	uint8_t		service_params[OCS_SERVICE_PARMS_LENGTH]; /**< any sports service parameters */
247*ef270ab1SKenneth D. Merry 	uint8_t		flogi_service_params[OCS_SERVICE_PARMS_LENGTH]; /**< Fabric/P2p service parameters from FLOGI */
248*ef270ab1SKenneth D. Merry 	uint8_t		femul_enable;	/**< TRUE if Fabric Emulation mode is enabled */
249*ef270ab1SKenneth D. Merry 
250*ef270ab1SKenneth D. Merry 	/* Declarations shared with back-ends */
251*ef270ab1SKenneth D. Merry 	sparse_vector_t lookup;		/**< d_id to node lookup object */
252*ef270ab1SKenneth D. Merry 	ocs_lock_t	lookup_lock;
253*ef270ab1SKenneth D. Merry 
254*ef270ab1SKenneth D. Merry 	ocs_sli_port_t	*sport;		/**< Pointer to first (physical) SLI port (also at the head of sport_list) */
255*ef270ab1SKenneth D. Merry 	uint32_t	sport_instance_count; /**< count of sport instances */
256*ef270ab1SKenneth D. Merry 
257*ef270ab1SKenneth D. Merry 	/* Fabric Emulation */
258*ef270ab1SKenneth D. Merry 	ocs_bitmap_t *portid_pool;
259*ef270ab1SKenneth D. Merry 	ocs_ns_t *ocs_ns;			/*>> Directory(Name) services data */
260*ef270ab1SKenneth D. Merry };
261*ef270ab1SKenneth D. Merry 
262*ef270ab1SKenneth D. Merry /**
263*ef270ab1SKenneth D. Merry  * @brief Remote Node object
264*ef270ab1SKenneth D. Merry  *
265*ef270ab1SKenneth D. Merry  * This object represents a connection between the SLI port and another
266*ef270ab1SKenneth D. Merry  * Nx_Port on the fabric. Note this can be either a well known port such
267*ef270ab1SKenneth D. Merry  * as a F_Port (i.e. ff:ff:fe) or another N_Port.
268*ef270ab1SKenneth D. Merry  */
269*ef270ab1SKenneth D. Merry struct ocs_remote_node_s {
270*ef270ab1SKenneth D. Merry 	/*
271*ef270ab1SKenneth D. Merry 	 * Members private to HW/SLI
272*ef270ab1SKenneth D. Merry 	 */
273*ef270ab1SKenneth D. Merry 	uint32_t	indicator;	/**< RPI */
274*ef270ab1SKenneth D. Merry 	uint32_t	index;
275*ef270ab1SKenneth D. Merry 	uint32_t	fc_id;		/**< FC address */
276*ef270ab1SKenneth D. Merry 
277*ef270ab1SKenneth D. Merry 	uint32_t	attached:1,	/**< true if attached */
278*ef270ab1SKenneth D. Merry 			node_group:1,	/**< true if in node group */
279*ef270ab1SKenneth D. Merry 			free_group:1;	/**< true if the node group should be free'd */
280*ef270ab1SKenneth D. Merry 
281*ef270ab1SKenneth D. Merry 	ocs_sli_port_t	*sport;		/**< associated SLI port */
282*ef270ab1SKenneth D. Merry 
283*ef270ab1SKenneth D. Merry 	/*
284*ef270ab1SKenneth D. Merry 	 * Implementation specific fields allowed here
285*ef270ab1SKenneth D. Merry 	 */
286*ef270ab1SKenneth D. Merry 	void *node;			/**< associated node */
287*ef270ab1SKenneth D. Merry };
288*ef270ab1SKenneth D. Merry 
289*ef270ab1SKenneth D. Merry struct ocs_remote_node_group_s {
290*ef270ab1SKenneth D. Merry 	/*
291*ef270ab1SKenneth D. Merry 	 * Members private to HW/SLI
292*ef270ab1SKenneth D. Merry 	 */
293*ef270ab1SKenneth D. Merry 	uint32_t	indicator;	/**< RPI */
294*ef270ab1SKenneth D. Merry 	uint32_t	index;
295*ef270ab1SKenneth D. Merry 
296*ef270ab1SKenneth D. Merry 	/*
297*ef270ab1SKenneth D. Merry 	 * Implementation specific fields allowed here
298*ef270ab1SKenneth D. Merry 	 */
299*ef270ab1SKenneth D. Merry 
300*ef270ab1SKenneth D. Merry 	uint32_t instance_index;		/*<< instance index */
301*ef270ab1SKenneth D. Merry 	ocs_node_group_dir_t *node_group_dir;	/*<< pointer to the node group directory */
302*ef270ab1SKenneth D. Merry 	ocs_list_link_t link;			/*<< linked list link */
303*ef270ab1SKenneth D. Merry };
304*ef270ab1SKenneth D. Merry 
305*ef270ab1SKenneth D. Merry typedef enum {
306*ef270ab1SKenneth D. Merry 	OCS_NODE_SHUTDOWN_DEFAULT = 0,
307*ef270ab1SKenneth D. Merry 	OCS_NODE_SHUTDOWN_EXPLICIT_LOGO,
308*ef270ab1SKenneth D. Merry 	OCS_NODE_SHUTDOWN_IMPLICIT_LOGO,
309*ef270ab1SKenneth D. Merry } ocs_node_shutd_rsn_e;
310*ef270ab1SKenneth D. Merry 
311*ef270ab1SKenneth D. Merry typedef enum {
312*ef270ab1SKenneth D. Merry 	OCS_NODE_SEND_LS_ACC_NONE = 0,
313*ef270ab1SKenneth D. Merry 	OCS_NODE_SEND_LS_ACC_PLOGI,
314*ef270ab1SKenneth D. Merry 	OCS_NODE_SEND_LS_ACC_PRLI,
315*ef270ab1SKenneth D. Merry } ocs_node_send_ls_acc_e;
316*ef270ab1SKenneth D. Merry 
317*ef270ab1SKenneth D. Merry /**
318*ef270ab1SKenneth D. Merry  * @brief FC Node object
319*ef270ab1SKenneth D. Merry  *
320*ef270ab1SKenneth D. Merry  */
321*ef270ab1SKenneth D. Merry struct ocs_node_s {
322*ef270ab1SKenneth D. Merry 	ocs_t *ocs;				/**< pointer back to ocs structure */
323*ef270ab1SKenneth D. Merry 	uint32_t instance_index;		/**< unique instance index value */
324*ef270ab1SKenneth D. Merry 	char display_name[OCS_DISPLAY_NAME_LENGTH]; /**< Node display name */
325*ef270ab1SKenneth D. Merry 	ocs_sport_t *sport;
326*ef270ab1SKenneth D. Merry 	uint32_t hold_frames:1;			/**< hold incoming frames if true */
327*ef270ab1SKenneth D. Merry 	ocs_rlock_t lock;			/**< node wide lock */
328*ef270ab1SKenneth D. Merry 	ocs_lock_t active_ios_lock;		/**< active SCSI and XPORT I/O's for this node */
329*ef270ab1SKenneth D. Merry 	ocs_list_t active_ios;			/**< active I/O's for this node */
330*ef270ab1SKenneth D. Merry 	uint32_t max_wr_xfer_size;		/**< Max write IO size per phase for the transport */
331*ef270ab1SKenneth D. Merry 	ocs_scsi_ini_node_t ini_node;		/**< backend initiator private node data */
332*ef270ab1SKenneth D. Merry 	ocs_scsi_tgt_node_t tgt_node;		/**< backend target private node data */
333*ef270ab1SKenneth D. Merry 	ocs_mgmt_functions_t *mgmt_functions;
334*ef270ab1SKenneth D. Merry 
335*ef270ab1SKenneth D. Merry 	/* Declarations private to HW/SLI */
336*ef270ab1SKenneth D. Merry 	ocs_remote_node_t	rnode;		/**< Remote node */
337*ef270ab1SKenneth D. Merry 
338*ef270ab1SKenneth D. Merry 	/* Declarations private to FC transport */
339*ef270ab1SKenneth D. Merry 	ocs_sm_ctx_t		sm;		/**< state machine context */
340*ef270ab1SKenneth D. Merry 	uint32_t		evtdepth;	/**< current event posting nesting depth */
341*ef270ab1SKenneth D. Merry 	uint32_t		req_free:1,	/**< this node is to be free'd */
342*ef270ab1SKenneth D. Merry 				attached:1,	/**< node is attached (REGLOGIN complete) */
343*ef270ab1SKenneth D. Merry 				fcp_enabled:1,	/**< node is enabled to handle FCP */
344*ef270ab1SKenneth D. Merry 				rscn_pending:1,	/**< for name server node RSCN is pending */
345*ef270ab1SKenneth D. Merry 				send_plogi:1,	/**< if initiator, send PLOGI at node initialization */
346*ef270ab1SKenneth D. Merry 				send_plogi_acc:1,/**< send PLOGI accept, upon completion of node attach */
347*ef270ab1SKenneth D. Merry 				io_alloc_enabled:1, /**< TRUE if ocs_scsi_io_alloc() and ocs_els_io_alloc() are enabled */
348*ef270ab1SKenneth D. Merry 				sent_prli:1;    /**< if initiator, sent prli. */
349*ef270ab1SKenneth D. Merry 	ocs_node_send_ls_acc_e	send_ls_acc;	/**< type of LS acc to send */
350*ef270ab1SKenneth D. Merry 	ocs_io_t		*ls_acc_io;	/**< SCSI IO for LS acc */
351*ef270ab1SKenneth D. Merry 	uint32_t		ls_acc_oxid;	/**< OX_ID for pending accept */
352*ef270ab1SKenneth D. Merry 	uint32_t		ls_acc_did;	/**< D_ID for pending accept */
353*ef270ab1SKenneth D. Merry 	ocs_node_shutd_rsn_e	shutdown_reason;/**< reason for node shutdown */
354*ef270ab1SKenneth D. Merry 	ocs_dma_t		sparm_dma_buf;	/**< service parameters buffer */
355*ef270ab1SKenneth D. Merry 	uint8_t			service_params[OCS_SERVICE_PARMS_LENGTH]; /**< plogi/acc frame from remote device */
356*ef270ab1SKenneth D. Merry 	ocs_lock_t		pend_frames_lock; /**< lock for inbound pending frames list */
357*ef270ab1SKenneth D. Merry 	ocs_list_t		pend_frames;	/**< inbound pending frames list */
358*ef270ab1SKenneth D. Merry 	uint32_t		pend_frames_processed;	/**< count of frames processed in hold frames interval */
359*ef270ab1SKenneth D. Merry 	uint32_t		ox_id_in_use;	/**< used to verify one at a time us of ox_id */
360*ef270ab1SKenneth D. Merry 	uint32_t		els_retries_remaining;	/**< for ELS, number of retries remaining */
361*ef270ab1SKenneth D. Merry 	uint32_t		els_req_cnt;	/**< number of outstanding ELS requests */
362*ef270ab1SKenneth D. Merry 	uint32_t		els_cmpl_cnt;	/**< number of outstanding ELS completions */
363*ef270ab1SKenneth D. Merry 	uint32_t		abort_cnt;	/**< Abort counter for debugging purpose */
364*ef270ab1SKenneth D. Merry 
365*ef270ab1SKenneth D. Merry 	char current_state_name[OCS_DISPLAY_NAME_LENGTH]; /**< current node state */
366*ef270ab1SKenneth D. Merry 	char prev_state_name[OCS_DISPLAY_NAME_LENGTH]; /**< previous node state */
367*ef270ab1SKenneth D. Merry 	ocs_sm_event_t		current_evt;	/**< current event */
368*ef270ab1SKenneth D. Merry 	ocs_sm_event_t		prev_evt;	/**< current event */
369*ef270ab1SKenneth D. Merry 	uint32_t		targ:1,		/**< node is target capable */
370*ef270ab1SKenneth D. Merry 				init:1,		/**< node is initiator capable */
371*ef270ab1SKenneth D. Merry 				refound:1,	/**< Handle node refound case when node is being deleted  */
372*ef270ab1SKenneth D. Merry 				fcp2device:1,    /* FCP2 device */
373*ef270ab1SKenneth D. Merry 				reserved:4,
374*ef270ab1SKenneth D. Merry 				fc_type:8;
375*ef270ab1SKenneth D. Merry 	ocs_list_t		els_io_pend_list;   /**< list of pending (not yet processed) ELS IOs */
376*ef270ab1SKenneth D. Merry 	ocs_list_t		els_io_active_list; /**< list of active (processed) ELS IOs */
377*ef270ab1SKenneth D. Merry 
378*ef270ab1SKenneth D. Merry 	ocs_sm_function_t	nodedb_state;	/**< Node debugging, saved state */
379*ef270ab1SKenneth D. Merry 
380*ef270ab1SKenneth D. Merry 	ocs_timer_t		gidpt_delay_timer;	/**< GIDPT delay timer */
381*ef270ab1SKenneth D. Merry 	time_t			time_last_gidpt_msec;	/**< Start time of last target RSCN GIDPT  */
382*ef270ab1SKenneth D. Merry 
383*ef270ab1SKenneth D. Merry 	/* WWN */
384*ef270ab1SKenneth D. Merry 	char wwnn[OCS_WWN_LENGTH];		/**< remote port WWN (uses iSCSI naming) */
385*ef270ab1SKenneth D. Merry 	char wwpn[OCS_WWN_LENGTH];		/**< remote port WWN (uses iSCSI naming) */
386*ef270ab1SKenneth D. Merry 
387*ef270ab1SKenneth D. Merry 	/* Statistics */
388*ef270ab1SKenneth D. Merry 	uint32_t		chained_io_count;	/**< count of IOs with chained SGL's */
389*ef270ab1SKenneth D. Merry 
390*ef270ab1SKenneth D. Merry 	ocs_list_link_t		link;		/**< node list link */
391*ef270ab1SKenneth D. Merry 
392*ef270ab1SKenneth D. Merry 	ocs_remote_node_group_t	*node_group;	/**< pointer to node group (if HLM enabled) */
393*ef270ab1SKenneth D. Merry };
394*ef270ab1SKenneth D. Merry 
395*ef270ab1SKenneth D. Merry /**
396*ef270ab1SKenneth D. Merry  * @brief Virtual port specification
397*ef270ab1SKenneth D. Merry  *
398*ef270ab1SKenneth D. Merry  * Collection of the information required to restore a virtual port across
399*ef270ab1SKenneth D. Merry  * link events
400*ef270ab1SKenneth D. Merry  */
401*ef270ab1SKenneth D. Merry 
402*ef270ab1SKenneth D. Merry typedef struct ocs_vport_spec_s ocs_vport_spec_t;
403*ef270ab1SKenneth D. Merry struct ocs_vport_spec_s {
404*ef270ab1SKenneth D. Merry 	uint32_t domain_instance;		/*>> instance index of this domain for the sport */
405*ef270ab1SKenneth D. Merry 	uint64_t wwnn;				/*>> node name */
406*ef270ab1SKenneth D. Merry 	uint64_t wwpn;				/*>> port name */
407*ef270ab1SKenneth D. Merry 	uint32_t fc_id;				/*>> port id */
408*ef270ab1SKenneth D. Merry 	uint32_t enable_tgt:1,			/*>> port is a target */
409*ef270ab1SKenneth D. Merry 		enable_ini:1;			/*>> port is an initiator */
410*ef270ab1SKenneth D. Merry 	ocs_list_link_t link;			/*>> link */
411*ef270ab1SKenneth D. Merry 	void	*tgt_data;			/**< target backend pointer */
412*ef270ab1SKenneth D. Merry 	void	*ini_data;			/**< initiator backend pointer */
413*ef270ab1SKenneth D. Merry 	ocs_sport_t *sport;			/**< Used to match record after attaching for update */
414*ef270ab1SKenneth D. Merry };
415*ef270ab1SKenneth D. Merry 
416*ef270ab1SKenneth D. Merry #endif /* __OCS_COMMON_H__*/
417