xref: /openbmc/linux/drivers/scsi/csiostor/csio_lnode.h (revision a3667aaed5698b84bad2f1b3f71adc86499f4bc6)
1*a3667aaeSNaresh Kumar Inna /*
2*a3667aaeSNaresh Kumar Inna  * This file is part of the Chelsio FCoE driver for Linux.
3*a3667aaeSNaresh Kumar Inna  *
4*a3667aaeSNaresh Kumar Inna  * Copyright (c) 2008-2012 Chelsio Communications, Inc. All rights reserved.
5*a3667aaeSNaresh Kumar Inna  *
6*a3667aaeSNaresh Kumar Inna  * This software is available to you under a choice of one of two
7*a3667aaeSNaresh Kumar Inna  * licenses.  You may choose to be licensed under the terms of the GNU
8*a3667aaeSNaresh Kumar Inna  * General Public License (GPL) Version 2, available from the file
9*a3667aaeSNaresh Kumar Inna  * COPYING in the main directory of this source tree, or the
10*a3667aaeSNaresh Kumar Inna  * OpenIB.org BSD license below:
11*a3667aaeSNaresh Kumar Inna  *
12*a3667aaeSNaresh Kumar Inna  *     Redistribution and use in source and binary forms, with or
13*a3667aaeSNaresh Kumar Inna  *     without modification, are permitted provided that the following
14*a3667aaeSNaresh Kumar Inna  *     conditions are met:
15*a3667aaeSNaresh Kumar Inna  *
16*a3667aaeSNaresh Kumar Inna  *      - Redistributions of source code must retain the above
17*a3667aaeSNaresh Kumar Inna  *        copyright notice, this list of conditions and the following
18*a3667aaeSNaresh Kumar Inna  *        disclaimer.
19*a3667aaeSNaresh Kumar Inna  *
20*a3667aaeSNaresh Kumar Inna  *      - Redistributions in binary form must reproduce the above
21*a3667aaeSNaresh Kumar Inna  *        copyright notice, this list of conditions and the following
22*a3667aaeSNaresh Kumar Inna  *        disclaimer in the documentation and/or other materials
23*a3667aaeSNaresh Kumar Inna  *        provided with the distribution.
24*a3667aaeSNaresh Kumar Inna  *
25*a3667aaeSNaresh Kumar Inna  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26*a3667aaeSNaresh Kumar Inna  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27*a3667aaeSNaresh Kumar Inna  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28*a3667aaeSNaresh Kumar Inna  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29*a3667aaeSNaresh Kumar Inna  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30*a3667aaeSNaresh Kumar Inna  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31*a3667aaeSNaresh Kumar Inna  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32*a3667aaeSNaresh Kumar Inna  * SOFTWARE.
33*a3667aaeSNaresh Kumar Inna  */
34*a3667aaeSNaresh Kumar Inna 
35*a3667aaeSNaresh Kumar Inna #ifndef __CSIO_LNODE_H__
36*a3667aaeSNaresh Kumar Inna #define __CSIO_LNODE_H__
37*a3667aaeSNaresh Kumar Inna 
38*a3667aaeSNaresh Kumar Inna #include <linux/kref.h>
39*a3667aaeSNaresh Kumar Inna #include <linux/timer.h>
40*a3667aaeSNaresh Kumar Inna #include <linux/workqueue.h>
41*a3667aaeSNaresh Kumar Inna #include <scsi/fc/fc_els.h>
42*a3667aaeSNaresh Kumar Inna 
43*a3667aaeSNaresh Kumar Inna 
44*a3667aaeSNaresh Kumar Inna #include "csio_defs.h"
45*a3667aaeSNaresh Kumar Inna #include "csio_hw.h"
46*a3667aaeSNaresh Kumar Inna 
47*a3667aaeSNaresh Kumar Inna #define CSIO_FCOE_MAX_NPIV	128
48*a3667aaeSNaresh Kumar Inna #define CSIO_FCOE_MAX_RNODES	2048
49*a3667aaeSNaresh Kumar Inna 
50*a3667aaeSNaresh Kumar Inna /* FDMI port attribute unknown speed */
51*a3667aaeSNaresh Kumar Inna #define CSIO_HBA_PORTSPEED_UNKNOWN	0x8000
52*a3667aaeSNaresh Kumar Inna 
53*a3667aaeSNaresh Kumar Inna extern int csio_fcoe_rnodes;
54*a3667aaeSNaresh Kumar Inna extern int csio_fdmi_enable;
55*a3667aaeSNaresh Kumar Inna 
56*a3667aaeSNaresh Kumar Inna /* State machine evets */
57*a3667aaeSNaresh Kumar Inna enum csio_ln_ev {
58*a3667aaeSNaresh Kumar Inna 	CSIO_LNE_NONE = (uint32_t)0,
59*a3667aaeSNaresh Kumar Inna 	CSIO_LNE_LINKUP,
60*a3667aaeSNaresh Kumar Inna 	CSIO_LNE_FAB_INIT_DONE,
61*a3667aaeSNaresh Kumar Inna 	CSIO_LNE_LINK_DOWN,
62*a3667aaeSNaresh Kumar Inna 	CSIO_LNE_DOWN_LINK,
63*a3667aaeSNaresh Kumar Inna 	CSIO_LNE_LOGO,
64*a3667aaeSNaresh Kumar Inna 	CSIO_LNE_CLOSE,
65*a3667aaeSNaresh Kumar Inna 	CSIO_LNE_MAX_EVENT,
66*a3667aaeSNaresh Kumar Inna };
67*a3667aaeSNaresh Kumar Inna 
68*a3667aaeSNaresh Kumar Inna 
69*a3667aaeSNaresh Kumar Inna struct csio_fcf_info {
70*a3667aaeSNaresh Kumar Inna 	struct list_head	list;
71*a3667aaeSNaresh Kumar Inna 	uint8_t			priority;
72*a3667aaeSNaresh Kumar Inna 	uint8_t			mac[6];
73*a3667aaeSNaresh Kumar Inna 	uint8_t			name_id[8];
74*a3667aaeSNaresh Kumar Inna 	uint8_t			fabric[8];
75*a3667aaeSNaresh Kumar Inna 	uint16_t		vf_id;
76*a3667aaeSNaresh Kumar Inna 	uint8_t			vlan_id;
77*a3667aaeSNaresh Kumar Inna 	uint16_t		max_fcoe_size;
78*a3667aaeSNaresh Kumar Inna 	uint8_t			fc_map[3];
79*a3667aaeSNaresh Kumar Inna 	uint32_t		fka_adv;
80*a3667aaeSNaresh Kumar Inna 	uint32_t		fcfi;
81*a3667aaeSNaresh Kumar Inna 	uint8_t			get_next:1;
82*a3667aaeSNaresh Kumar Inna 	uint8_t			link_aff:1;
83*a3667aaeSNaresh Kumar Inna 	uint8_t			fpma:1;
84*a3667aaeSNaresh Kumar Inna 	uint8_t			spma:1;
85*a3667aaeSNaresh Kumar Inna 	uint8_t			login:1;
86*a3667aaeSNaresh Kumar Inna 	uint8_t			portid;
87*a3667aaeSNaresh Kumar Inna 	uint8_t			spma_mac[6];
88*a3667aaeSNaresh Kumar Inna 	struct kref		kref;
89*a3667aaeSNaresh Kumar Inna };
90*a3667aaeSNaresh Kumar Inna 
91*a3667aaeSNaresh Kumar Inna /* Defines for flags */
92*a3667aaeSNaresh Kumar Inna #define	CSIO_LNF_FIPSUPP		0x00000001	/* Fip Supported */
93*a3667aaeSNaresh Kumar Inna #define	CSIO_LNF_NPIVSUPP		0x00000002	/* NPIV supported */
94*a3667aaeSNaresh Kumar Inna #define CSIO_LNF_LINK_ENABLE		0x00000004	/* Link enabled */
95*a3667aaeSNaresh Kumar Inna #define	CSIO_LNF_FDMI_ENABLE		0x00000008	/* FDMI support */
96*a3667aaeSNaresh Kumar Inna 
97*a3667aaeSNaresh Kumar Inna /* Transport events */
98*a3667aaeSNaresh Kumar Inna enum csio_ln_fc_evt {
99*a3667aaeSNaresh Kumar Inna 	CSIO_LN_FC_LINKUP = 1,
100*a3667aaeSNaresh Kumar Inna 	CSIO_LN_FC_LINKDOWN,
101*a3667aaeSNaresh Kumar Inna 	CSIO_LN_FC_RSCN,
102*a3667aaeSNaresh Kumar Inna 	CSIO_LN_FC_ATTRIB_UPDATE,
103*a3667aaeSNaresh Kumar Inna };
104*a3667aaeSNaresh Kumar Inna 
105*a3667aaeSNaresh Kumar Inna /* Lnode stats */
106*a3667aaeSNaresh Kumar Inna struct csio_lnode_stats {
107*a3667aaeSNaresh Kumar Inna 	uint32_t	n_link_up;	/* Link down */
108*a3667aaeSNaresh Kumar Inna 	uint32_t	n_link_down;	/* Link up */
109*a3667aaeSNaresh Kumar Inna 	uint32_t	n_err;		/* error */
110*a3667aaeSNaresh Kumar Inna 	uint32_t	n_err_nomem;	/* memory not available */
111*a3667aaeSNaresh Kumar Inna 	uint32_t	n_inval_parm;   /* Invalid parameters */
112*a3667aaeSNaresh Kumar Inna 	uint32_t	n_evt_unexp;	/* unexpected event */
113*a3667aaeSNaresh Kumar Inna 	uint32_t	n_evt_drop;	/* dropped event */
114*a3667aaeSNaresh Kumar Inna 	uint32_t	n_rnode_match;  /* matched rnode */
115*a3667aaeSNaresh Kumar Inna 	uint32_t	n_dev_loss_tmo; /* Device loss timeout */
116*a3667aaeSNaresh Kumar Inna 	uint32_t	n_fdmi_err;	/* fdmi err */
117*a3667aaeSNaresh Kumar Inna 	uint32_t	n_evt_fw[RSCN_DEV_LOST];	/* fw events */
118*a3667aaeSNaresh Kumar Inna 	enum csio_ln_ev	n_evt_sm[CSIO_LNE_MAX_EVENT];	/* State m/c events */
119*a3667aaeSNaresh Kumar Inna 	uint32_t	n_rnode_alloc;	/* rnode allocated */
120*a3667aaeSNaresh Kumar Inna 	uint32_t	n_rnode_free;	/* rnode freed */
121*a3667aaeSNaresh Kumar Inna 	uint32_t	n_rnode_nomem;	/* rnode alloc failure */
122*a3667aaeSNaresh Kumar Inna 	uint32_t        n_input_requests; /* Input Requests */
123*a3667aaeSNaresh Kumar Inna 	uint32_t        n_output_requests; /* Output Requests */
124*a3667aaeSNaresh Kumar Inna 	uint32_t        n_control_requests; /* Control Requests */
125*a3667aaeSNaresh Kumar Inna 	uint32_t        n_input_bytes; /* Input Bytes */
126*a3667aaeSNaresh Kumar Inna 	uint32_t        n_output_bytes; /* Output Bytes */
127*a3667aaeSNaresh Kumar Inna 	uint32_t	rsvd1;
128*a3667aaeSNaresh Kumar Inna };
129*a3667aaeSNaresh Kumar Inna 
130*a3667aaeSNaresh Kumar Inna /* Common Lnode params */
131*a3667aaeSNaresh Kumar Inna struct csio_lnode_params {
132*a3667aaeSNaresh Kumar Inna 	uint32_t	ra_tov;
133*a3667aaeSNaresh Kumar Inna 	uint32_t	fcfi;
134*a3667aaeSNaresh Kumar Inna 	uint32_t	log_level;	/* Module level for debugging */
135*a3667aaeSNaresh Kumar Inna };
136*a3667aaeSNaresh Kumar Inna 
137*a3667aaeSNaresh Kumar Inna struct csio_service_parms {
138*a3667aaeSNaresh Kumar Inna 	struct fc_els_csp	csp;		/* Common service parms */
139*a3667aaeSNaresh Kumar Inna 	uint8_t			wwpn[8];	/* WWPN */
140*a3667aaeSNaresh Kumar Inna 	uint8_t			wwnn[8];	/* WWNN */
141*a3667aaeSNaresh Kumar Inna 	struct fc_els_cssp	clsp[4];	/* Class service params */
142*a3667aaeSNaresh Kumar Inna 	uint8_t			vvl[16];	/* Vendor version level */
143*a3667aaeSNaresh Kumar Inna };
144*a3667aaeSNaresh Kumar Inna 
145*a3667aaeSNaresh Kumar Inna /* Lnode */
146*a3667aaeSNaresh Kumar Inna struct csio_lnode {
147*a3667aaeSNaresh Kumar Inna 	struct csio_sm		sm;		/* State machine + sibling
148*a3667aaeSNaresh Kumar Inna 						 * lnode list.
149*a3667aaeSNaresh Kumar Inna 						 */
150*a3667aaeSNaresh Kumar Inna 	struct csio_hw		*hwp;		/* Pointer to the HW module */
151*a3667aaeSNaresh Kumar Inna 	uint8_t			portid;		/* Port ID */
152*a3667aaeSNaresh Kumar Inna 	uint8_t			rsvd1;
153*a3667aaeSNaresh Kumar Inna 	uint16_t		rsvd2;
154*a3667aaeSNaresh Kumar Inna 	uint32_t		dev_num;	/* Device number */
155*a3667aaeSNaresh Kumar Inna 	uint32_t		flags;		/* Flags */
156*a3667aaeSNaresh Kumar Inna 	struct list_head	fcf_lsthead;	/* FCF entries */
157*a3667aaeSNaresh Kumar Inna 	struct csio_fcf_info	*fcfinfo;	/* FCF in use */
158*a3667aaeSNaresh Kumar Inna 	struct csio_ioreq	*mgmt_req;	/* MGMT request */
159*a3667aaeSNaresh Kumar Inna 
160*a3667aaeSNaresh Kumar Inna 	/* FCoE identifiers */
161*a3667aaeSNaresh Kumar Inna 	uint8_t			mac[6];
162*a3667aaeSNaresh Kumar Inna 	uint32_t		nport_id;
163*a3667aaeSNaresh Kumar Inna 	struct csio_service_parms ln_sparm;	/* Service parms */
164*a3667aaeSNaresh Kumar Inna 
165*a3667aaeSNaresh Kumar Inna 	/* Firmware identifiers */
166*a3667aaeSNaresh Kumar Inna 	uint32_t		fcf_flowid;	/*fcf flowid */
167*a3667aaeSNaresh Kumar Inna 	uint32_t		vnp_flowid;
168*a3667aaeSNaresh Kumar Inna 	uint16_t		ssn_cnt;	/* Registered Session */
169*a3667aaeSNaresh Kumar Inna 	uint8_t			cur_evt;	/* Current event */
170*a3667aaeSNaresh Kumar Inna 	uint8_t			prev_evt;	/* Previous event */
171*a3667aaeSNaresh Kumar Inna 
172*a3667aaeSNaresh Kumar Inna 	/* Children */
173*a3667aaeSNaresh Kumar Inna 	struct list_head	cln_head;	/* Head of the children lnode
174*a3667aaeSNaresh Kumar Inna 						 * list.
175*a3667aaeSNaresh Kumar Inna 						 */
176*a3667aaeSNaresh Kumar Inna 	uint32_t		num_vports;	/* Total NPIV/children LNodes*/
177*a3667aaeSNaresh Kumar Inna 	struct csio_lnode	*pln;		/* Parent lnode of child
178*a3667aaeSNaresh Kumar Inna 						 * lnodes.
179*a3667aaeSNaresh Kumar Inna 						 */
180*a3667aaeSNaresh Kumar Inna 	struct list_head	cmpl_q;		/* Pending I/Os on this lnode */
181*a3667aaeSNaresh Kumar Inna 
182*a3667aaeSNaresh Kumar Inna 	/* Remote node information */
183*a3667aaeSNaresh Kumar Inna 	struct list_head	rnhead;		/* Head of rnode list */
184*a3667aaeSNaresh Kumar Inna 	uint32_t		num_reg_rnodes;	/* Number of rnodes registered
185*a3667aaeSNaresh Kumar Inna 						 * with the host.
186*a3667aaeSNaresh Kumar Inna 						 */
187*a3667aaeSNaresh Kumar Inna 	uint32_t		n_scsi_tgts;	/* Number of scsi targets
188*a3667aaeSNaresh Kumar Inna 						 * found
189*a3667aaeSNaresh Kumar Inna 						 */
190*a3667aaeSNaresh Kumar Inna 	uint32_t		last_scan_ntgts;/* Number of scsi targets
191*a3667aaeSNaresh Kumar Inna 						 * found per last scan.
192*a3667aaeSNaresh Kumar Inna 						 */
193*a3667aaeSNaresh Kumar Inna 	uint32_t		tgt_scan_tick;	/* timer started after
194*a3667aaeSNaresh Kumar Inna 						 * new tgt found
195*a3667aaeSNaresh Kumar Inna 						 */
196*a3667aaeSNaresh Kumar Inna 	/* FC transport data */
197*a3667aaeSNaresh Kumar Inna 	struct fc_vport		*fc_vport;
198*a3667aaeSNaresh Kumar Inna 	struct fc_host_statistics fch_stats;
199*a3667aaeSNaresh Kumar Inna 
200*a3667aaeSNaresh Kumar Inna 	struct csio_lnode_stats stats;		/* Common lnode stats */
201*a3667aaeSNaresh Kumar Inna 	struct csio_lnode_params params;	/* Common lnode params */
202*a3667aaeSNaresh Kumar Inna };
203*a3667aaeSNaresh Kumar Inna 
204*a3667aaeSNaresh Kumar Inna #define	csio_lnode_to_hw(ln)	((ln)->hwp)
205*a3667aaeSNaresh Kumar Inna #define csio_root_lnode(ln)	(csio_lnode_to_hw((ln))->rln)
206*a3667aaeSNaresh Kumar Inna #define csio_parent_lnode(ln)	((ln)->pln)
207*a3667aaeSNaresh Kumar Inna #define	csio_ln_flowid(ln)	((ln)->vnp_flowid)
208*a3667aaeSNaresh Kumar Inna #define csio_ln_wwpn(ln)	((ln)->ln_sparm.wwpn)
209*a3667aaeSNaresh Kumar Inna #define csio_ln_wwnn(ln)	((ln)->ln_sparm.wwnn)
210*a3667aaeSNaresh Kumar Inna 
211*a3667aaeSNaresh Kumar Inna #define csio_is_root_ln(ln)	(((ln) == csio_root_lnode((ln))) ? 1 : 0)
212*a3667aaeSNaresh Kumar Inna #define csio_is_phys_ln(ln)	(((ln)->pln == NULL) ? 1 : 0)
213*a3667aaeSNaresh Kumar Inna #define csio_is_npiv_ln(ln)	(((ln)->pln != NULL) ? 1 : 0)
214*a3667aaeSNaresh Kumar Inna 
215*a3667aaeSNaresh Kumar Inna 
216*a3667aaeSNaresh Kumar Inna #define csio_ln_dbg(_ln, _fmt, ...)	\
217*a3667aaeSNaresh Kumar Inna 	csio_dbg(_ln->hwp, "%x:%x "_fmt, CSIO_DEVID_HI(_ln), \
218*a3667aaeSNaresh Kumar Inna 		 CSIO_DEVID_LO(_ln), ##__VA_ARGS__);
219*a3667aaeSNaresh Kumar Inna 
220*a3667aaeSNaresh Kumar Inna #define csio_ln_err(_ln, _fmt, ...)	\
221*a3667aaeSNaresh Kumar Inna 	csio_err(_ln->hwp, "%x:%x "_fmt, CSIO_DEVID_HI(_ln), \
222*a3667aaeSNaresh Kumar Inna 		 CSIO_DEVID_LO(_ln), ##__VA_ARGS__);
223*a3667aaeSNaresh Kumar Inna 
224*a3667aaeSNaresh Kumar Inna #define csio_ln_warn(_ln, _fmt, ...)	\
225*a3667aaeSNaresh Kumar Inna 	csio_warn(_ln->hwp, "%x:%x "_fmt, CSIO_DEVID_HI(_ln), \
226*a3667aaeSNaresh Kumar Inna 		 CSIO_DEVID_LO(_ln), ##__VA_ARGS__);
227*a3667aaeSNaresh Kumar Inna 
228*a3667aaeSNaresh Kumar Inna /* HW->Lnode notifications */
229*a3667aaeSNaresh Kumar Inna enum csio_ln_notify {
230*a3667aaeSNaresh Kumar Inna 	CSIO_LN_NOTIFY_HWREADY = 1,
231*a3667aaeSNaresh Kumar Inna 	CSIO_LN_NOTIFY_HWSTOP,
232*a3667aaeSNaresh Kumar Inna 	CSIO_LN_NOTIFY_HWREMOVE,
233*a3667aaeSNaresh Kumar Inna 	CSIO_LN_NOTIFY_HWRESET,
234*a3667aaeSNaresh Kumar Inna };
235*a3667aaeSNaresh Kumar Inna 
236*a3667aaeSNaresh Kumar Inna void csio_fcoe_fwevt_handler(struct csio_hw *,  __u8 cpl_op, __be64 *);
237*a3667aaeSNaresh Kumar Inna int csio_is_lnode_ready(struct csio_lnode *);
238*a3667aaeSNaresh Kumar Inna void csio_lnode_state_to_str(struct csio_lnode *ln, int8_t *str);
239*a3667aaeSNaresh Kumar Inna struct csio_lnode *csio_lnode_lookup_by_wwpn(struct csio_hw *, uint8_t *);
240*a3667aaeSNaresh Kumar Inna int csio_get_phy_port_stats(struct csio_hw *, uint8_t ,
241*a3667aaeSNaresh Kumar Inna 				      struct fw_fcoe_port_stats *);
242*a3667aaeSNaresh Kumar Inna int csio_scan_done(struct csio_lnode *, unsigned long, unsigned long,
243*a3667aaeSNaresh Kumar Inna 		   unsigned long, unsigned long);
244*a3667aaeSNaresh Kumar Inna void csio_notify_lnodes(struct csio_hw *, enum csio_ln_notify);
245*a3667aaeSNaresh Kumar Inna void csio_disable_lnodes(struct csio_hw *, uint8_t, bool);
246*a3667aaeSNaresh Kumar Inna void csio_lnode_async_event(struct csio_lnode *, enum csio_ln_fc_evt);
247*a3667aaeSNaresh Kumar Inna int csio_ln_fdmi_start(struct csio_lnode *, void *);
248*a3667aaeSNaresh Kumar Inna int csio_lnode_start(struct csio_lnode *);
249*a3667aaeSNaresh Kumar Inna void csio_lnode_stop(struct csio_lnode *);
250*a3667aaeSNaresh Kumar Inna void csio_lnode_close(struct csio_lnode *);
251*a3667aaeSNaresh Kumar Inna int csio_lnode_init(struct csio_lnode *, struct csio_hw *,
252*a3667aaeSNaresh Kumar Inna 			      struct csio_lnode *);
253*a3667aaeSNaresh Kumar Inna void csio_lnode_exit(struct csio_lnode *);
254*a3667aaeSNaresh Kumar Inna 
255*a3667aaeSNaresh Kumar Inna #endif /* ifndef __CSIO_LNODE_H__ */
256