|  | /* | 
|  | * drivers/s390/net/ctcm_fsms.h | 
|  | * | 
|  | * 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 --- */ |