1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* |
3 | * Copyright IBM Corp. 2001, 2007 |
4 | * Authors: Fritz Elfert (felfert@millenux.com) |
5 | * Peter Tiedemann (ptiedem@de.ibm.com) |
6 | * MPC additions : |
7 | * Belinda Thompson (belindat@us.ibm.com) |
8 | * Andy Richter (richtera@us.ibm.com) |
9 | */ |
10 | #ifndef _CTCM_FSMS_H_ |
11 | #define _CTCM_FSMS_H_ |
12 | |
13 | #include <linux/module.h> |
14 | #include <linux/init.h> |
15 | #include <linux/kernel.h> |
16 | #include <linux/slab.h> |
17 | #include <linux/errno.h> |
18 | #include <linux/types.h> |
19 | #include <linux/interrupt.h> |
20 | #include <linux/timer.h> |
21 | #include <linux/bitops.h> |
22 | |
23 | #include <linux/signal.h> |
24 | #include <linux/string.h> |
25 | |
26 | #include <linux/ip.h> |
27 | #include <linux/if_arp.h> |
28 | #include <linux/tcp.h> |
29 | #include <linux/skbuff.h> |
30 | #include <linux/ctype.h> |
31 | #include <net/dst.h> |
32 | |
33 | #include <linux/io.h> |
34 | #include <asm/ccwdev.h> |
35 | #include <asm/ccwgroup.h> |
36 | #include <linux/uaccess.h> |
37 | |
38 | #include <asm/idals.h> |
39 | |
40 | #include "fsm.h" |
41 | #include "ctcm_main.h" |
42 | |
43 | /* |
44 | * Definitions for the channel statemachine(s) for ctc and ctcmpc |
45 | * |
46 | * To allow better kerntyping, prefix-less definitions for channel states |
47 | * and channel events have been replaced : |
48 | * ch_event... -> ctc_ch_event... |
49 | * CH_EVENT... -> CTC_EVENT... |
50 | * ch_state... -> ctc_ch_state... |
51 | * CH_STATE... -> CTC_STATE... |
52 | */ |
53 | /* |
54 | * Events of the channel statemachine(s) for ctc and ctcmpc |
55 | */ |
56 | enum ctc_ch_events { |
57 | /* |
58 | * Events, representing return code of |
59 | * I/O operations (ccw_device_start, ccw_device_halt et al.) |
60 | */ |
61 | CTC_EVENT_IO_SUCCESS, |
62 | CTC_EVENT_IO_EBUSY, |
63 | CTC_EVENT_IO_ENODEV, |
64 | CTC_EVENT_IO_UNKNOWN, |
65 | |
66 | CTC_EVENT_ATTNBUSY, |
67 | CTC_EVENT_ATTN, |
68 | CTC_EVENT_BUSY, |
69 | /* |
70 | * Events, representing unit-check |
71 | */ |
72 | CTC_EVENT_UC_RCRESET, |
73 | CTC_EVENT_UC_RSRESET, |
74 | CTC_EVENT_UC_TXTIMEOUT, |
75 | CTC_EVENT_UC_TXPARITY, |
76 | CTC_EVENT_UC_HWFAIL, |
77 | CTC_EVENT_UC_RXPARITY, |
78 | CTC_EVENT_UC_ZERO, |
79 | CTC_EVENT_UC_UNKNOWN, |
80 | /* |
81 | * Events, representing subchannel-check |
82 | */ |
83 | CTC_EVENT_SC_UNKNOWN, |
84 | /* |
85 | * Events, representing machine checks |
86 | */ |
87 | CTC_EVENT_MC_FAIL, |
88 | CTC_EVENT_MC_GOOD, |
89 | /* |
90 | * Event, representing normal IRQ |
91 | */ |
92 | CTC_EVENT_IRQ, |
93 | CTC_EVENT_FINSTAT, |
94 | /* |
95 | * Event, representing timer expiry. |
96 | */ |
97 | CTC_EVENT_TIMER, |
98 | /* |
99 | * Events, representing commands from upper levels. |
100 | */ |
101 | CTC_EVENT_START, |
102 | CTC_EVENT_STOP, |
103 | CTC_NR_EVENTS, |
104 | /* |
105 | * additional MPC events |
106 | */ |
107 | CTC_EVENT_SEND_XID = CTC_NR_EVENTS, |
108 | CTC_EVENT_RSWEEP_TIMER, |
109 | /* |
110 | * MUST be always the last element!! |
111 | */ |
112 | CTC_MPC_NR_EVENTS, |
113 | }; |
114 | |
115 | /* |
116 | * States of the channel statemachine(s) for ctc and ctcmpc. |
117 | */ |
118 | enum ctc_ch_states { |
119 | /* |
120 | * Channel not assigned to any device, |
121 | * initial state, direction invalid |
122 | */ |
123 | CTC_STATE_IDLE, |
124 | /* |
125 | * Channel assigned but not operating |
126 | */ |
127 | CTC_STATE_STOPPED, |
128 | CTC_STATE_STARTWAIT, |
129 | CTC_STATE_STARTRETRY, |
130 | CTC_STATE_SETUPWAIT, |
131 | CTC_STATE_RXINIT, |
132 | CTC_STATE_TXINIT, |
133 | CTC_STATE_RX, |
134 | CTC_STATE_TX, |
135 | CTC_STATE_RXIDLE, |
136 | CTC_STATE_TXIDLE, |
137 | CTC_STATE_RXERR, |
138 | CTC_STATE_TXERR, |
139 | CTC_STATE_TERM, |
140 | CTC_STATE_DTERM, |
141 | CTC_STATE_NOTOP, |
142 | CTC_NR_STATES, /* MUST be the last element of non-expanded states */ |
143 | /* |
144 | * additional MPC states |
145 | */ |
146 | CH_XID0_PENDING = CTC_NR_STATES, |
147 | CH_XID0_INPROGRESS, |
148 | CH_XID7_PENDING, |
149 | CH_XID7_PENDING1, |
150 | CH_XID7_PENDING2, |
151 | CH_XID7_PENDING3, |
152 | CH_XID7_PENDING4, |
153 | CTC_MPC_NR_STATES, /* MUST be the last element of expanded mpc states */ |
154 | }; |
155 | |
156 | extern const char *ctc_ch_event_names[]; |
157 | |
158 | extern const char *ctc_ch_state_names[]; |
159 | |
160 | void ctcm_ccw_check_rc(struct channel *ch, int rc, char *msg); |
161 | void ctcm_purge_skb_queue(struct sk_buff_head *q); |
162 | |
163 | /* |
164 | * ----- non-static actions for ctcm channel statemachine ----- |
165 | * |
166 | */ |
167 | void ctcm_chx_txidle(fsm_instance *fi, int event, void *arg); |
168 | |
169 | /* |
170 | * ----- FSM (state/event/action) of the ctcm channel statemachine ----- |
171 | */ |
172 | extern const fsm_node ch_fsm[]; |
173 | extern int ch_fsm_len; |
174 | |
175 | |
176 | /* |
177 | * ----- non-static actions for ctcmpc channel statemachine ---- |
178 | * |
179 | */ |
180 | /* shared : |
181 | void ctcm_chx_txidle(fsm_instance * fi, int event, void *arg); |
182 | */ |
183 | void ctcmpc_chx_rxidle(fsm_instance *fi, int event, void *arg); |
184 | |
185 | /* |
186 | * ----- FSM (state/event/action) of the ctcmpc channel statemachine ----- |
187 | */ |
188 | extern const fsm_node ctcmpc_ch_fsm[]; |
189 | extern int mpc_ch_fsm_len; |
190 | |
191 | /* |
192 | * Definitions for the device interface statemachine for ctc and mpc |
193 | */ |
194 | |
195 | /* |
196 | * States of the device interface statemachine. |
197 | */ |
198 | enum dev_states { |
199 | DEV_STATE_STOPPED, |
200 | DEV_STATE_STARTWAIT_RXTX, |
201 | DEV_STATE_STARTWAIT_RX, |
202 | DEV_STATE_STARTWAIT_TX, |
203 | DEV_STATE_STOPWAIT_RXTX, |
204 | DEV_STATE_STOPWAIT_RX, |
205 | DEV_STATE_STOPWAIT_TX, |
206 | DEV_STATE_RUNNING, |
207 | /* |
208 | * MUST be always the last element!! |
209 | */ |
210 | CTCM_NR_DEV_STATES |
211 | }; |
212 | |
213 | extern const char *dev_state_names[]; |
214 | |
215 | /* |
216 | * Events of the device interface statemachine. |
217 | * ctcm and ctcmpc |
218 | */ |
219 | enum dev_events { |
220 | DEV_EVENT_START, |
221 | DEV_EVENT_STOP, |
222 | DEV_EVENT_RXUP, |
223 | DEV_EVENT_TXUP, |
224 | DEV_EVENT_RXDOWN, |
225 | DEV_EVENT_TXDOWN, |
226 | DEV_EVENT_RESTART, |
227 | /* |
228 | * MUST be always the last element!! |
229 | */ |
230 | CTCM_NR_DEV_EVENTS |
231 | }; |
232 | |
233 | extern const char *dev_event_names[]; |
234 | |
235 | /* |
236 | * Actions for the device interface statemachine. |
237 | * ctc and ctcmpc |
238 | */ |
239 | /* |
240 | static void dev_action_start(fsm_instance * fi, int event, void *arg); |
241 | static void dev_action_stop(fsm_instance * fi, int event, void *arg); |
242 | static void dev_action_restart(fsm_instance *fi, int event, void *arg); |
243 | static void dev_action_chup(fsm_instance * fi, int event, void *arg); |
244 | static void dev_action_chdown(fsm_instance * fi, int event, void *arg); |
245 | */ |
246 | |
247 | /* |
248 | * The (state/event/action) fsm table of the device interface statemachine. |
249 | * ctcm and ctcmpc |
250 | */ |
251 | extern const fsm_node dev_fsm[]; |
252 | extern int dev_fsm_len; |
253 | |
254 | |
255 | /* |
256 | * Definitions for the MPC Group statemachine |
257 | */ |
258 | |
259 | /* |
260 | * MPC Group Station FSM States |
261 | |
262 | State Name When In This State |
263 | ====================== ======================================= |
264 | MPCG_STATE_RESET Initial State When Driver Loaded |
265 | We receive and send NOTHING |
266 | |
267 | MPCG_STATE_INOP INOP Received. |
268 | Group level non-recoverable error |
269 | |
270 | MPCG_STATE_READY XID exchanges for at least 1 write and |
271 | 1 read channel have completed. |
272 | Group is ready for data transfer. |
273 | |
274 | States from ctc_mpc_alloc_channel |
275 | ============================================================== |
276 | MPCG_STATE_XID2INITW Awaiting XID2(0) Initiation |
277 | ATTN from other side will start |
278 | XID negotiations. |
279 | Y-side protocol only. |
280 | |
281 | MPCG_STATE_XID2INITX XID2(0) negotiations are in progress. |
282 | At least 1, but not all, XID2(0)'s |
283 | have been received from partner. |
284 | |
285 | MPCG_STATE_XID7INITW XID2(0) complete |
286 | No XID2(7)'s have yet been received. |
287 | XID2(7) negotiations pending. |
288 | |
289 | MPCG_STATE_XID7INITX XID2(7) negotiations in progress. |
290 | At least 1, but not all, XID2(7)'s |
291 | have been received from partner. |
292 | |
293 | MPCG_STATE_XID7INITF XID2(7) negotiations complete. |
294 | Transitioning to READY. |
295 | |
296 | MPCG_STATE_READY Ready for Data Transfer. |
297 | |
298 | |
299 | States from ctc_mpc_establish_connectivity call |
300 | ============================================================== |
301 | MPCG_STATE_XID0IOWAIT Initiating XID2(0) negotiations. |
302 | X-side protocol only. |
303 | ATTN-BUSY from other side will convert |
304 | this to Y-side protocol and the |
305 | ctc_mpc_alloc_channel flow will begin. |
306 | |
307 | MPCG_STATE_XID0IOWAIX XID2(0) negotiations are in progress. |
308 | At least 1, but not all, XID2(0)'s |
309 | have been received from partner. |
310 | |
311 | MPCG_STATE_XID7INITI XID2(0) complete |
312 | No XID2(7)'s have yet been received. |
313 | XID2(7) negotiations pending. |
314 | |
315 | MPCG_STATE_XID7INITZ XID2(7) negotiations in progress. |
316 | At least 1, but not all, XID2(7)'s |
317 | have been received from partner. |
318 | |
319 | MPCG_STATE_XID7INITF XID2(7) negotiations complete. |
320 | Transitioning to READY. |
321 | |
322 | MPCG_STATE_READY Ready for Data Transfer. |
323 | |
324 | */ |
325 | |
326 | enum mpcg_events { |
327 | MPCG_EVENT_INOP, |
328 | MPCG_EVENT_DISCONC, |
329 | MPCG_EVENT_XID0DO, |
330 | MPCG_EVENT_XID2, |
331 | MPCG_EVENT_XID2DONE, |
332 | MPCG_EVENT_XID7DONE, |
333 | MPCG_EVENT_TIMER, |
334 | MPCG_EVENT_DOIO, |
335 | MPCG_NR_EVENTS, |
336 | }; |
337 | |
338 | enum mpcg_states { |
339 | MPCG_STATE_RESET, |
340 | MPCG_STATE_INOP, |
341 | MPCG_STATE_XID2INITW, |
342 | MPCG_STATE_XID2INITX, |
343 | MPCG_STATE_XID7INITW, |
344 | MPCG_STATE_XID7INITX, |
345 | MPCG_STATE_XID0IOWAIT, |
346 | MPCG_STATE_XID0IOWAIX, |
347 | MPCG_STATE_XID7INITI, |
348 | MPCG_STATE_XID7INITZ, |
349 | MPCG_STATE_XID7INITF, |
350 | MPCG_STATE_FLOWC, |
351 | MPCG_STATE_READY, |
352 | MPCG_NR_STATES, |
353 | }; |
354 | |
355 | #endif |
356 | /* --- This is the END my friend --- */ |
357 | |