359 lines
		
	
	
	
		
			8.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			359 lines
		
	
	
	
		
			8.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*
 | ||
|  |  * 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 --- */ |