xref: /openbmc/linux/drivers/scsi/elx/libefc/efc_node.h (revision 762f99f4f3cb41a775b5157dd761217beba65873)
1*6bc6180dSJames Smart /* SPDX-License-Identifier: GPL-2.0 */
2*6bc6180dSJames Smart /*
3*6bc6180dSJames Smart  * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
4*6bc6180dSJames Smart  * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
5*6bc6180dSJames Smart  */
6*6bc6180dSJames Smart 
7*6bc6180dSJames Smart #if !defined(__EFC_NODE_H__)
8*6bc6180dSJames Smart #define __EFC_NODE_H__
9*6bc6180dSJames Smart #include "scsi/fc/fc_ns.h"
10*6bc6180dSJames Smart 
11*6bc6180dSJames Smart #define EFC_NODEDB_PAUSE_FABRIC_LOGIN	(1 << 0)
12*6bc6180dSJames Smart #define EFC_NODEDB_PAUSE_NAMESERVER	(1 << 1)
13*6bc6180dSJames Smart #define EFC_NODEDB_PAUSE_NEW_NODES	(1 << 2)
14*6bc6180dSJames Smart 
15*6bc6180dSJames Smart #define MAX_ACC_REJECT_PAYLOAD	sizeof(struct fc_els_ls_rjt)
16*6bc6180dSJames Smart 
17*6bc6180dSJames Smart #define scsi_io_printf(io, fmt, ...) \
18*6bc6180dSJames Smart 	efc_log_debug(io->efc, "[%s] [%04x][i:%04x t:%04x h:%04x]" fmt, \
19*6bc6180dSJames Smart 	io->node->display_name, io->instance_index, io->init_task_tag, \
20*6bc6180dSJames Smart 	io->tgt_task_tag, io->hw_tag, ##__VA_ARGS__)
21*6bc6180dSJames Smart 
22*6bc6180dSJames Smart static inline void
efc_node_evt_set(struct efc_sm_ctx * ctx,enum efc_sm_event evt,const char * handler)23*6bc6180dSJames Smart efc_node_evt_set(struct efc_sm_ctx *ctx, enum efc_sm_event evt,
24*6bc6180dSJames Smart 		 const char *handler)
25*6bc6180dSJames Smart {
26*6bc6180dSJames Smart 	struct efc_node *node = ctx->app;
27*6bc6180dSJames Smart 
28*6bc6180dSJames Smart 	if (evt == EFC_EVT_ENTER) {
29*6bc6180dSJames Smart 		strncpy(node->current_state_name, handler,
30*6bc6180dSJames Smart 			sizeof(node->current_state_name));
31*6bc6180dSJames Smart 	} else if (evt == EFC_EVT_EXIT) {
32*6bc6180dSJames Smart 		strncpy(node->prev_state_name, node->current_state_name,
33*6bc6180dSJames Smart 			sizeof(node->prev_state_name));
34*6bc6180dSJames Smart 		strncpy(node->current_state_name, "invalid",
35*6bc6180dSJames Smart 			sizeof(node->current_state_name));
36*6bc6180dSJames Smart 	}
37*6bc6180dSJames Smart 	node->prev_evt = node->current_evt;
38*6bc6180dSJames Smart 	node->current_evt = evt;
39*6bc6180dSJames Smart }
40*6bc6180dSJames Smart 
41*6bc6180dSJames Smart /**
42*6bc6180dSJames Smart  * hold frames in pending frame list
43*6bc6180dSJames Smart  *
44*6bc6180dSJames Smart  * Unsolicited receive frames are held on the node pending frame list,
45*6bc6180dSJames Smart  * rather than being processed.
46*6bc6180dSJames Smart  */
47*6bc6180dSJames Smart 
48*6bc6180dSJames Smart static inline void
efc_node_hold_frames(struct efc_node * node)49*6bc6180dSJames Smart efc_node_hold_frames(struct efc_node *node)
50*6bc6180dSJames Smart {
51*6bc6180dSJames Smart 	node->hold_frames = true;
52*6bc6180dSJames Smart }
53*6bc6180dSJames Smart 
54*6bc6180dSJames Smart /**
55*6bc6180dSJames Smart  * accept frames
56*6bc6180dSJames Smart  *
57*6bc6180dSJames Smart  * Unsolicited receive frames processed rather than being held on the node
58*6bc6180dSJames Smart  * pending frame list.
59*6bc6180dSJames Smart  */
60*6bc6180dSJames Smart 
61*6bc6180dSJames Smart static inline void
efc_node_accept_frames(struct efc_node * node)62*6bc6180dSJames Smart efc_node_accept_frames(struct efc_node *node)
63*6bc6180dSJames Smart {
64*6bc6180dSJames Smart 	node->hold_frames = false;
65*6bc6180dSJames Smart }
66*6bc6180dSJames Smart 
67*6bc6180dSJames Smart /*
68*6bc6180dSJames Smart  * Node initiator/target enable defines
69*6bc6180dSJames Smart  * All combinations of the SLI port (nport) initiator/target enable,
70*6bc6180dSJames Smart  * and remote node initiator/target enable are enumerated.
71*6bc6180dSJames Smart  * ex: EFC_NODE_ENABLE_T_TO_IT decodes to target mode is enabled on SLI port
72*6bc6180dSJames Smart  * and I+T is enabled on remote node.
73*6bc6180dSJames Smart  */
74*6bc6180dSJames Smart enum efc_node_enable {
75*6bc6180dSJames Smart 	EFC_NODE_ENABLE_x_TO_x,
76*6bc6180dSJames Smart 	EFC_NODE_ENABLE_x_TO_T,
77*6bc6180dSJames Smart 	EFC_NODE_ENABLE_x_TO_I,
78*6bc6180dSJames Smart 	EFC_NODE_ENABLE_x_TO_IT,
79*6bc6180dSJames Smart 	EFC_NODE_ENABLE_T_TO_x,
80*6bc6180dSJames Smart 	EFC_NODE_ENABLE_T_TO_T,
81*6bc6180dSJames Smart 	EFC_NODE_ENABLE_T_TO_I,
82*6bc6180dSJames Smart 	EFC_NODE_ENABLE_T_TO_IT,
83*6bc6180dSJames Smart 	EFC_NODE_ENABLE_I_TO_x,
84*6bc6180dSJames Smart 	EFC_NODE_ENABLE_I_TO_T,
85*6bc6180dSJames Smart 	EFC_NODE_ENABLE_I_TO_I,
86*6bc6180dSJames Smart 	EFC_NODE_ENABLE_I_TO_IT,
87*6bc6180dSJames Smart 	EFC_NODE_ENABLE_IT_TO_x,
88*6bc6180dSJames Smart 	EFC_NODE_ENABLE_IT_TO_T,
89*6bc6180dSJames Smart 	EFC_NODE_ENABLE_IT_TO_I,
90*6bc6180dSJames Smart 	EFC_NODE_ENABLE_IT_TO_IT,
91*6bc6180dSJames Smart };
92*6bc6180dSJames Smart 
93*6bc6180dSJames Smart static inline enum efc_node_enable
efc_node_get_enable(struct efc_node * node)94*6bc6180dSJames Smart efc_node_get_enable(struct efc_node *node)
95*6bc6180dSJames Smart {
96*6bc6180dSJames Smart 	u32 retval = 0;
97*6bc6180dSJames Smart 
98*6bc6180dSJames Smart 	if (node->nport->enable_ini)
99*6bc6180dSJames Smart 		retval |= (1U << 3);
100*6bc6180dSJames Smart 	if (node->nport->enable_tgt)
101*6bc6180dSJames Smart 		retval |= (1U << 2);
102*6bc6180dSJames Smart 	if (node->init)
103*6bc6180dSJames Smart 		retval |= (1U << 1);
104*6bc6180dSJames Smart 	if (node->targ)
105*6bc6180dSJames Smart 		retval |= (1U << 0);
106*6bc6180dSJames Smart 	return (enum efc_node_enable)retval;
107*6bc6180dSJames Smart }
108*6bc6180dSJames Smart 
109*6bc6180dSJames Smart int
110*6bc6180dSJames Smart efc_node_check_els_req(struct efc_sm_ctx *ctx,
111*6bc6180dSJames Smart 		       enum efc_sm_event evt, void *arg,
112*6bc6180dSJames Smart 		       u8 cmd, void (*efc_node_common_func)(const char *,
113*6bc6180dSJames Smart 		       struct efc_sm_ctx *, enum efc_sm_event, void *),
114*6bc6180dSJames Smart 		       const char *funcname);
115*6bc6180dSJames Smart int
116*6bc6180dSJames Smart efc_node_check_ns_req(struct efc_sm_ctx *ctx,
117*6bc6180dSJames Smart 		      enum efc_sm_event evt, void *arg,
118*6bc6180dSJames Smart 		      u16 cmd, void (*efc_node_common_func)(const char *,
119*6bc6180dSJames Smart 		      struct efc_sm_ctx *, enum efc_sm_event, void *),
120*6bc6180dSJames Smart 		      const char *funcname);
121*6bc6180dSJames Smart int
122*6bc6180dSJames Smart efc_node_attach(struct efc_node *node);
123*6bc6180dSJames Smart struct efc_node *
124*6bc6180dSJames Smart efc_node_alloc(struct efc_nport *nport, u32 port_id,
125*6bc6180dSJames Smart 	       bool init, bool targ);
126*6bc6180dSJames Smart void
127*6bc6180dSJames Smart efc_node_free(struct efc_node *efc);
128*6bc6180dSJames Smart void
129*6bc6180dSJames Smart efc_node_update_display_name(struct efc_node *node);
130*6bc6180dSJames Smart void efc_node_post_event(struct efc_node *node, enum efc_sm_event evt,
131*6bc6180dSJames Smart 			 void *arg);
132*6bc6180dSJames Smart 
133*6bc6180dSJames Smart void
134*6bc6180dSJames Smart __efc_node_shutdown(struct efc_sm_ctx *ctx,
135*6bc6180dSJames Smart 		    enum efc_sm_event evt, void *arg);
136*6bc6180dSJames Smart void
137*6bc6180dSJames Smart __efc_node_wait_node_free(struct efc_sm_ctx *ctx,
138*6bc6180dSJames Smart 			  enum efc_sm_event evt, void *arg);
139*6bc6180dSJames Smart void
140*6bc6180dSJames Smart __efc_node_wait_els_shutdown(struct efc_sm_ctx *ctx,
141*6bc6180dSJames Smart 			     enum efc_sm_event evt, void *arg);
142*6bc6180dSJames Smart void
143*6bc6180dSJames Smart __efc_node_wait_ios_shutdown(struct efc_sm_ctx *ctx,
144*6bc6180dSJames Smart 			     enum efc_sm_event evt, void *arg);
145*6bc6180dSJames Smart void
146*6bc6180dSJames Smart efc_node_save_sparms(struct efc_node *node, void *payload);
147*6bc6180dSJames Smart void
148*6bc6180dSJames Smart efc_node_transition(struct efc_node *node,
149*6bc6180dSJames Smart 		    void (*state)(struct efc_sm_ctx *, enum efc_sm_event,
150*6bc6180dSJames Smart 				  void *), void *data);
151*6bc6180dSJames Smart void
152*6bc6180dSJames Smart __efc_node_common(const char *funcname, struct efc_sm_ctx *ctx,
153*6bc6180dSJames Smart 		  enum efc_sm_event evt, void *arg);
154*6bc6180dSJames Smart 
155*6bc6180dSJames Smart void
156*6bc6180dSJames Smart efc_node_initiate_cleanup(struct efc_node *node);
157*6bc6180dSJames Smart 
158*6bc6180dSJames Smart void
159*6bc6180dSJames Smart efc_node_build_eui_name(char *buf, u32 buf_len, uint64_t eui_name);
160*6bc6180dSJames Smart 
161*6bc6180dSJames Smart void
162*6bc6180dSJames Smart efc_node_pause(struct efc_node *node,
163*6bc6180dSJames Smart 	       void (*state)(struct efc_sm_ctx *ctx,
164*6bc6180dSJames Smart 			     enum efc_sm_event evt, void *arg));
165*6bc6180dSJames Smart void
166*6bc6180dSJames Smart __efc_node_paused(struct efc_sm_ctx *ctx,
167*6bc6180dSJames Smart 		  enum efc_sm_event evt, void *arg);
168*6bc6180dSJames Smart int
169*6bc6180dSJames Smart efc_node_active_ios_empty(struct efc_node *node);
170*6bc6180dSJames Smart void
171*6bc6180dSJames Smart efc_node_send_ls_io_cleanup(struct efc_node *node);
172*6bc6180dSJames Smart 
173*6bc6180dSJames Smart int
174*6bc6180dSJames Smart efc_els_io_list_empty(struct efc_node *node, struct list_head *list);
175*6bc6180dSJames Smart 
176*6bc6180dSJames Smart void
177*6bc6180dSJames Smart efc_process_node_pending(struct efc_node *domain);
178*6bc6180dSJames Smart 
179*6bc6180dSJames Smart u64 efc_node_get_wwnn(struct efc_node *node);
180*6bc6180dSJames Smart struct efc_node *
181*6bc6180dSJames Smart efc_node_find(struct efc_nport *nport, u32 id);
182*6bc6180dSJames Smart void
183*6bc6180dSJames Smart efc_node_post_els_resp(struct efc_node *node, u32 evt, void *arg);
184*6bc6180dSJames Smart void
185*6bc6180dSJames Smart efc_node_recv_els_frame(struct efc_node *node, struct efc_hw_sequence *s);
186*6bc6180dSJames Smart void
187*6bc6180dSJames Smart efc_node_recv_ct_frame(struct efc_node *node, struct efc_hw_sequence *seq);
188*6bc6180dSJames Smart void
189*6bc6180dSJames Smart efc_node_recv_fcp_cmd(struct efc_node *node, struct efc_hw_sequence *seq);
190*6bc6180dSJames Smart 
191*6bc6180dSJames Smart #endif /* __EFC_NODE_H__ */
192