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