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