mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
356 lines
8.0 KiB
356 lines
8.0 KiB
/* SPDX-License-Identifier: GPL-2.0 */ |
|
/* |
|
* Copyright IBM Corp. 2001, 2007 |
|
* Authors: Fritz Elfert ([email protected]) |
|
* Peter Tiedemann ([email protected]) |
|
* MPC additions : |
|
* Belinda Thompson ([email protected]) |
|
* Andy Richter ([email protected]) |
|
*/ |
|
#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); |
|
|
|
/* |
|
* ----- 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 --- */
|
|
|