cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ctcm_fsms.c (74822B)


      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
     11#undef DEBUG
     12#undef DEBUGDATA
     13#undef DEBUGCCW
     14
     15#define KMSG_COMPONENT "ctcm"
     16#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
     17
     18#include <linux/module.h>
     19#include <linux/init.h>
     20#include <linux/kernel.h>
     21#include <linux/slab.h>
     22#include <linux/errno.h>
     23#include <linux/types.h>
     24#include <linux/interrupt.h>
     25#include <linux/timer.h>
     26#include <linux/bitops.h>
     27
     28#include <linux/signal.h>
     29#include <linux/string.h>
     30
     31#include <linux/ip.h>
     32#include <linux/if_arp.h>
     33#include <linux/tcp.h>
     34#include <linux/skbuff.h>
     35#include <linux/ctype.h>
     36#include <net/dst.h>
     37
     38#include <linux/io.h>
     39#include <asm/ccwdev.h>
     40#include <asm/ccwgroup.h>
     41#include <linux/uaccess.h>
     42
     43#include <asm/idals.h>
     44
     45#include "fsm.h"
     46
     47#include "ctcm_dbug.h"
     48#include "ctcm_main.h"
     49#include "ctcm_fsms.h"
     50
     51const char *dev_state_names[] = {
     52	[DEV_STATE_STOPPED]		= "Stopped",
     53	[DEV_STATE_STARTWAIT_RXTX]	= "StartWait RXTX",
     54	[DEV_STATE_STARTWAIT_RX]	= "StartWait RX",
     55	[DEV_STATE_STARTWAIT_TX]	= "StartWait TX",
     56	[DEV_STATE_STOPWAIT_RXTX]	= "StopWait RXTX",
     57	[DEV_STATE_STOPWAIT_RX]		= "StopWait RX",
     58	[DEV_STATE_STOPWAIT_TX]		= "StopWait TX",
     59	[DEV_STATE_RUNNING]		= "Running",
     60};
     61
     62const char *dev_event_names[] = {
     63	[DEV_EVENT_START]	= "Start",
     64	[DEV_EVENT_STOP]	= "Stop",
     65	[DEV_EVENT_RXUP]	= "RX up",
     66	[DEV_EVENT_TXUP]	= "TX up",
     67	[DEV_EVENT_RXDOWN]	= "RX down",
     68	[DEV_EVENT_TXDOWN]	= "TX down",
     69	[DEV_EVENT_RESTART]	= "Restart",
     70};
     71
     72const char *ctc_ch_event_names[] = {
     73	[CTC_EVENT_IO_SUCCESS]	= "ccw_device success",
     74	[CTC_EVENT_IO_EBUSY]	= "ccw_device busy",
     75	[CTC_EVENT_IO_ENODEV]	= "ccw_device enodev",
     76	[CTC_EVENT_IO_UNKNOWN]	= "ccw_device unknown",
     77	[CTC_EVENT_ATTNBUSY]	= "Status ATTN & BUSY",
     78	[CTC_EVENT_ATTN]	= "Status ATTN",
     79	[CTC_EVENT_BUSY]	= "Status BUSY",
     80	[CTC_EVENT_UC_RCRESET]	= "Unit check remote reset",
     81	[CTC_EVENT_UC_RSRESET]	= "Unit check remote system reset",
     82	[CTC_EVENT_UC_TXTIMEOUT] = "Unit check TX timeout",
     83	[CTC_EVENT_UC_TXPARITY]	= "Unit check TX parity",
     84	[CTC_EVENT_UC_HWFAIL]	= "Unit check Hardware failure",
     85	[CTC_EVENT_UC_RXPARITY]	= "Unit check RX parity",
     86	[CTC_EVENT_UC_ZERO]	= "Unit check ZERO",
     87	[CTC_EVENT_UC_UNKNOWN]	= "Unit check Unknown",
     88	[CTC_EVENT_SC_UNKNOWN]	= "SubChannel check Unknown",
     89	[CTC_EVENT_MC_FAIL]	= "Machine check failure",
     90	[CTC_EVENT_MC_GOOD]	= "Machine check operational",
     91	[CTC_EVENT_IRQ]		= "IRQ normal",
     92	[CTC_EVENT_FINSTAT]	= "IRQ final",
     93	[CTC_EVENT_TIMER]	= "Timer",
     94	[CTC_EVENT_START]	= "Start",
     95	[CTC_EVENT_STOP]	= "Stop",
     96	/*
     97	* additional MPC events
     98	*/
     99	[CTC_EVENT_SEND_XID]	= "XID Exchange",
    100	[CTC_EVENT_RSWEEP_TIMER] = "MPC Group Sweep Timer",
    101};
    102
    103const char *ctc_ch_state_names[] = {
    104	[CTC_STATE_IDLE]	= "Idle",
    105	[CTC_STATE_STOPPED]	= "Stopped",
    106	[CTC_STATE_STARTWAIT]	= "StartWait",
    107	[CTC_STATE_STARTRETRY]	= "StartRetry",
    108	[CTC_STATE_SETUPWAIT]	= "SetupWait",
    109	[CTC_STATE_RXINIT]	= "RX init",
    110	[CTC_STATE_TXINIT]	= "TX init",
    111	[CTC_STATE_RX]		= "RX",
    112	[CTC_STATE_TX]		= "TX",
    113	[CTC_STATE_RXIDLE]	= "RX idle",
    114	[CTC_STATE_TXIDLE]	= "TX idle",
    115	[CTC_STATE_RXERR]	= "RX error",
    116	[CTC_STATE_TXERR]	= "TX error",
    117	[CTC_STATE_TERM]	= "Terminating",
    118	[CTC_STATE_DTERM]	= "Restarting",
    119	[CTC_STATE_NOTOP]	= "Not operational",
    120	/*
    121	* additional MPC states
    122	*/
    123	[CH_XID0_PENDING]	= "Pending XID0 Start",
    124	[CH_XID0_INPROGRESS]	= "In XID0 Negotiations ",
    125	[CH_XID7_PENDING]	= "Pending XID7 P1 Start",
    126	[CH_XID7_PENDING1]	= "Active XID7 P1 Exchange ",
    127	[CH_XID7_PENDING2]	= "Pending XID7 P2 Start ",
    128	[CH_XID7_PENDING3]	= "Active XID7 P2 Exchange ",
    129	[CH_XID7_PENDING4]	= "XID7 Complete - Pending READY ",
    130};
    131
    132static void ctcm_action_nop(fsm_instance *fi, int event, void *arg);
    133
    134/*
    135 * ----- static ctcm actions for channel statemachine -----
    136 *
    137*/
    138static void chx_txdone(fsm_instance *fi, int event, void *arg);
    139static void chx_rx(fsm_instance *fi, int event, void *arg);
    140static void chx_rxidle(fsm_instance *fi, int event, void *arg);
    141static void chx_firstio(fsm_instance *fi, int event, void *arg);
    142static void ctcm_chx_setmode(fsm_instance *fi, int event, void *arg);
    143static void ctcm_chx_start(fsm_instance *fi, int event, void *arg);
    144static void ctcm_chx_haltio(fsm_instance *fi, int event, void *arg);
    145static void ctcm_chx_stopped(fsm_instance *fi, int event, void *arg);
    146static void ctcm_chx_stop(fsm_instance *fi, int event, void *arg);
    147static void ctcm_chx_fail(fsm_instance *fi, int event, void *arg);
    148static void ctcm_chx_setuperr(fsm_instance *fi, int event, void *arg);
    149static void ctcm_chx_restart(fsm_instance *fi, int event, void *arg);
    150static void ctcm_chx_rxiniterr(fsm_instance *fi, int event, void *arg);
    151static void ctcm_chx_rxinitfail(fsm_instance *fi, int event, void *arg);
    152static void ctcm_chx_rxdisc(fsm_instance *fi, int event, void *arg);
    153static void ctcm_chx_txiniterr(fsm_instance *fi, int event, void *arg);
    154static void ctcm_chx_txretry(fsm_instance *fi, int event, void *arg);
    155static void ctcm_chx_iofatal(fsm_instance *fi, int event, void *arg);
    156
    157/*
    158 * ----- static ctcmpc actions for ctcmpc channel statemachine -----
    159 *
    160*/
    161static void ctcmpc_chx_txdone(fsm_instance *fi, int event, void *arg);
    162static void ctcmpc_chx_rx(fsm_instance *fi, int event, void *arg);
    163static void ctcmpc_chx_firstio(fsm_instance *fi, int event, void *arg);
    164/* shared :
    165static void ctcm_chx_setmode(fsm_instance *fi, int event, void *arg);
    166static void ctcm_chx_start(fsm_instance *fi, int event, void *arg);
    167static void ctcm_chx_haltio(fsm_instance *fi, int event, void *arg);
    168static void ctcm_chx_stopped(fsm_instance *fi, int event, void *arg);
    169static void ctcm_chx_stop(fsm_instance *fi, int event, void *arg);
    170static void ctcm_chx_fail(fsm_instance *fi, int event, void *arg);
    171static void ctcm_chx_setuperr(fsm_instance *fi, int event, void *arg);
    172static void ctcm_chx_restart(fsm_instance *fi, int event, void *arg);
    173static void ctcm_chx_rxiniterr(fsm_instance *fi, int event, void *arg);
    174static void ctcm_chx_rxinitfail(fsm_instance *fi, int event, void *arg);
    175static void ctcm_chx_rxdisc(fsm_instance *fi, int event, void *arg);
    176static void ctcm_chx_txiniterr(fsm_instance *fi, int event, void *arg);
    177static void ctcm_chx_txretry(fsm_instance *fi, int event, void *arg);
    178static void ctcm_chx_iofatal(fsm_instance *fi, int event, void *arg);
    179*/
    180static void ctcmpc_chx_attn(fsm_instance *fsm, int event, void *arg);
    181static void ctcmpc_chx_attnbusy(fsm_instance *, int, void *);
    182static void ctcmpc_chx_resend(fsm_instance *, int, void *);
    183static void ctcmpc_chx_send_sweep(fsm_instance *fsm, int event, void *arg);
    184
    185/*
    186 * Check return code of a preceding ccw_device call, halt_IO etc...
    187 *
    188 * ch	:	The channel, the error belongs to.
    189 * Returns the error code (!= 0) to inspect.
    190 */
    191void ctcm_ccw_check_rc(struct channel *ch, int rc, char *msg)
    192{
    193	CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
    194		"%s(%s): %s: %04x\n",
    195		CTCM_FUNTAIL, ch->id, msg, rc);
    196	switch (rc) {
    197	case -EBUSY:
    198		pr_info("%s: The communication peer is busy\n",
    199			ch->id);
    200		fsm_event(ch->fsm, CTC_EVENT_IO_EBUSY, ch);
    201		break;
    202	case -ENODEV:
    203		pr_err("%s: The specified target device is not valid\n",
    204		       ch->id);
    205		fsm_event(ch->fsm, CTC_EVENT_IO_ENODEV, ch);
    206		break;
    207	default:
    208		pr_err("An I/O operation resulted in error %04x\n",
    209		       rc);
    210		fsm_event(ch->fsm, CTC_EVENT_IO_UNKNOWN, ch);
    211	}
    212}
    213
    214void ctcm_purge_skb_queue(struct sk_buff_head *q)
    215{
    216	struct sk_buff *skb;
    217
    218	CTCM_DBF_TEXT(TRACE, CTC_DBF_DEBUG, __func__);
    219
    220	while ((skb = skb_dequeue(q))) {
    221		refcount_dec(&skb->users);
    222		dev_kfree_skb_any(skb);
    223	}
    224}
    225
    226/*
    227 * NOP action for statemachines
    228 */
    229static void ctcm_action_nop(fsm_instance *fi, int event, void *arg)
    230{
    231}
    232
    233/*
    234 * Actions for channel - statemachines.
    235 */
    236
    237/*
    238 * Normal data has been send. Free the corresponding
    239 * skb (it's in io_queue), reset dev->tbusy and
    240 * revert to idle state.
    241 *
    242 * fi		An instance of a channel statemachine.
    243 * event	The event, just happened.
    244 * arg		Generic pointer, casted from channel * upon call.
    245 */
    246static void chx_txdone(fsm_instance *fi, int event, void *arg)
    247{
    248	struct channel *ch = arg;
    249	struct net_device *dev = ch->netdev;
    250	struct ctcm_priv *priv = dev->ml_priv;
    251	struct sk_buff *skb;
    252	int first = 1;
    253	int i;
    254	unsigned long duration;
    255	unsigned long done_stamp = jiffies;
    256
    257	CTCM_PR_DEBUG("%s(%s): %s\n", __func__, ch->id, dev->name);
    258
    259	duration = done_stamp - ch->prof.send_stamp;
    260	if (duration > ch->prof.tx_time)
    261		ch->prof.tx_time = duration;
    262
    263	if (ch->irb->scsw.cmd.count != 0)
    264		CTCM_DBF_TEXT_(TRACE, CTC_DBF_DEBUG,
    265			"%s(%s): TX not complete, remaining %d bytes",
    266			     CTCM_FUNTAIL, dev->name, ch->irb->scsw.cmd.count);
    267	fsm_deltimer(&ch->timer);
    268	while ((skb = skb_dequeue(&ch->io_queue))) {
    269		priv->stats.tx_packets++;
    270		priv->stats.tx_bytes += skb->len - LL_HEADER_LENGTH;
    271		if (first) {
    272			priv->stats.tx_bytes += 2;
    273			first = 0;
    274		}
    275		refcount_dec(&skb->users);
    276		dev_kfree_skb_irq(skb);
    277	}
    278	spin_lock(&ch->collect_lock);
    279	clear_normalized_cda(&ch->ccw[4]);
    280	if (ch->collect_len > 0) {
    281		int rc;
    282
    283		if (ctcm_checkalloc_buffer(ch)) {
    284			spin_unlock(&ch->collect_lock);
    285			return;
    286		}
    287		ch->trans_skb->data = ch->trans_skb_data;
    288		skb_reset_tail_pointer(ch->trans_skb);
    289		ch->trans_skb->len = 0;
    290		if (ch->prof.maxmulti < (ch->collect_len + 2))
    291			ch->prof.maxmulti = ch->collect_len + 2;
    292		if (ch->prof.maxcqueue < skb_queue_len(&ch->collect_queue))
    293			ch->prof.maxcqueue = skb_queue_len(&ch->collect_queue);
    294		*((__u16 *)skb_put(ch->trans_skb, 2)) = ch->collect_len + 2;
    295		i = 0;
    296		while ((skb = skb_dequeue(&ch->collect_queue))) {
    297			skb_copy_from_linear_data(skb,
    298				skb_put(ch->trans_skb, skb->len), skb->len);
    299			priv->stats.tx_packets++;
    300			priv->stats.tx_bytes += skb->len - LL_HEADER_LENGTH;
    301			refcount_dec(&skb->users);
    302			dev_kfree_skb_irq(skb);
    303			i++;
    304		}
    305		ch->collect_len = 0;
    306		spin_unlock(&ch->collect_lock);
    307		ch->ccw[1].count = ch->trans_skb->len;
    308		fsm_addtimer(&ch->timer, CTCM_TIME_5_SEC, CTC_EVENT_TIMER, ch);
    309		ch->prof.send_stamp = jiffies;
    310		rc = ccw_device_start(ch->cdev, &ch->ccw[0], 0, 0xff, 0);
    311		ch->prof.doios_multi++;
    312		if (rc != 0) {
    313			priv->stats.tx_dropped += i;
    314			priv->stats.tx_errors += i;
    315			fsm_deltimer(&ch->timer);
    316			ctcm_ccw_check_rc(ch, rc, "chained TX");
    317		}
    318	} else {
    319		spin_unlock(&ch->collect_lock);
    320		fsm_newstate(fi, CTC_STATE_TXIDLE);
    321	}
    322	ctcm_clear_busy_do(dev);
    323}
    324
    325/*
    326 * Initial data is sent.
    327 * Notify device statemachine that we are up and
    328 * running.
    329 *
    330 * fi		An instance of a channel statemachine.
    331 * event	The event, just happened.
    332 * arg		Generic pointer, casted from channel * upon call.
    333 */
    334void ctcm_chx_txidle(fsm_instance *fi, int event, void *arg)
    335{
    336	struct channel *ch = arg;
    337	struct net_device *dev = ch->netdev;
    338	struct ctcm_priv *priv = dev->ml_priv;
    339
    340	CTCM_PR_DEBUG("%s(%s): %s\n", __func__, ch->id, dev->name);
    341
    342	fsm_deltimer(&ch->timer);
    343	fsm_newstate(fi, CTC_STATE_TXIDLE);
    344	fsm_event(priv->fsm, DEV_EVENT_TXUP, ch->netdev);
    345}
    346
    347/*
    348 * Got normal data, check for sanity, queue it up, allocate new buffer
    349 * trigger bottom half, and initiate next read.
    350 *
    351 * fi		An instance of a channel statemachine.
    352 * event	The event, just happened.
    353 * arg		Generic pointer, casted from channel * upon call.
    354 */
    355static void chx_rx(fsm_instance *fi, int event, void *arg)
    356{
    357	struct channel *ch = arg;
    358	struct net_device *dev = ch->netdev;
    359	struct ctcm_priv *priv = dev->ml_priv;
    360	int len = ch->max_bufsize - ch->irb->scsw.cmd.count;
    361	struct sk_buff *skb = ch->trans_skb;
    362	__u16 block_len = *((__u16 *)skb->data);
    363	int check_len;
    364	int rc;
    365
    366	fsm_deltimer(&ch->timer);
    367	if (len < 8) {
    368		CTCM_DBF_TEXT_(TRACE, CTC_DBF_NOTICE,
    369			"%s(%s): got packet with length %d < 8\n",
    370					CTCM_FUNTAIL, dev->name, len);
    371		priv->stats.rx_dropped++;
    372		priv->stats.rx_length_errors++;
    373						goto again;
    374	}
    375	if (len > ch->max_bufsize) {
    376		CTCM_DBF_TEXT_(TRACE, CTC_DBF_NOTICE,
    377			"%s(%s): got packet with length %d > %d\n",
    378				CTCM_FUNTAIL, dev->name, len, ch->max_bufsize);
    379		priv->stats.rx_dropped++;
    380		priv->stats.rx_length_errors++;
    381						goto again;
    382	}
    383
    384	/*
    385	 * VM TCP seems to have a bug sending 2 trailing bytes of garbage.
    386	 */
    387	switch (ch->protocol) {
    388	case CTCM_PROTO_S390:
    389	case CTCM_PROTO_OS390:
    390		check_len = block_len + 2;
    391		break;
    392	default:
    393		check_len = block_len;
    394		break;
    395	}
    396	if ((len < block_len) || (len > check_len)) {
    397		CTCM_DBF_TEXT_(TRACE, CTC_DBF_NOTICE,
    398			"%s(%s): got block length %d != rx length %d\n",
    399				CTCM_FUNTAIL, dev->name, block_len, len);
    400		if (do_debug)
    401			ctcmpc_dump_skb(skb, 0);
    402
    403		*((__u16 *)skb->data) = len;
    404		priv->stats.rx_dropped++;
    405		priv->stats.rx_length_errors++;
    406						goto again;
    407	}
    408	if (block_len > 2) {
    409		*((__u16 *)skb->data) = block_len - 2;
    410		ctcm_unpack_skb(ch, skb);
    411	}
    412 again:
    413	skb->data = ch->trans_skb_data;
    414	skb_reset_tail_pointer(skb);
    415	skb->len = 0;
    416	if (ctcm_checkalloc_buffer(ch))
    417		return;
    418	ch->ccw[1].count = ch->max_bufsize;
    419	rc = ccw_device_start(ch->cdev, &ch->ccw[0], 0, 0xff, 0);
    420	if (rc != 0)
    421		ctcm_ccw_check_rc(ch, rc, "normal RX");
    422}
    423
    424/*
    425 * Initialize connection by sending a __u16 of value 0.
    426 *
    427 * fi		An instance of a channel statemachine.
    428 * event	The event, just happened.
    429 * arg		Generic pointer, casted from channel * upon call.
    430 */
    431static void chx_firstio(fsm_instance *fi, int event, void *arg)
    432{
    433	int rc;
    434	struct channel *ch = arg;
    435	int fsmstate = fsm_getstate(fi);
    436
    437	CTCM_DBF_TEXT_(TRACE, CTC_DBF_NOTICE,
    438		"%s(%s) : %02x",
    439		CTCM_FUNTAIL, ch->id, fsmstate);
    440
    441	ch->sense_rc = 0;	/* reset unit check report control */
    442	if (fsmstate == CTC_STATE_TXIDLE)
    443		CTCM_DBF_TEXT_(TRACE, CTC_DBF_DEBUG,
    444			"%s(%s): remote side issued READ?, init.\n",
    445				CTCM_FUNTAIL, ch->id);
    446	fsm_deltimer(&ch->timer);
    447	if (ctcm_checkalloc_buffer(ch))
    448		return;
    449	if ((fsmstate == CTC_STATE_SETUPWAIT) &&
    450	    (ch->protocol == CTCM_PROTO_OS390)) {
    451		/* OS/390 resp. z/OS */
    452		if (CHANNEL_DIRECTION(ch->flags) == CTCM_READ) {
    453			*((__u16 *)ch->trans_skb->data) = CTCM_INITIAL_BLOCKLEN;
    454			fsm_addtimer(&ch->timer, CTCM_TIME_5_SEC,
    455				     CTC_EVENT_TIMER, ch);
    456			chx_rxidle(fi, event, arg);
    457		} else {
    458			struct net_device *dev = ch->netdev;
    459			struct ctcm_priv *priv = dev->ml_priv;
    460			fsm_newstate(fi, CTC_STATE_TXIDLE);
    461			fsm_event(priv->fsm, DEV_EVENT_TXUP, dev);
    462		}
    463		return;
    464	}
    465	/*
    466	 * Don't setup a timer for receiving the initial RX frame
    467	 * if in compatibility mode, since VM TCP delays the initial
    468	 * frame until it has some data to send.
    469	 */
    470	if ((CHANNEL_DIRECTION(ch->flags) == CTCM_WRITE) ||
    471	    (ch->protocol != CTCM_PROTO_S390))
    472		fsm_addtimer(&ch->timer, CTCM_TIME_5_SEC, CTC_EVENT_TIMER, ch);
    473
    474	*((__u16 *)ch->trans_skb->data) = CTCM_INITIAL_BLOCKLEN;
    475	ch->ccw[1].count = 2;	/* Transfer only length */
    476
    477	fsm_newstate(fi, (CHANNEL_DIRECTION(ch->flags) == CTCM_READ)
    478		     ? CTC_STATE_RXINIT : CTC_STATE_TXINIT);
    479	rc = ccw_device_start(ch->cdev, &ch->ccw[0], 0, 0xff, 0);
    480	if (rc != 0) {
    481		fsm_deltimer(&ch->timer);
    482		fsm_newstate(fi, CTC_STATE_SETUPWAIT);
    483		ctcm_ccw_check_rc(ch, rc, "init IO");
    484	}
    485	/*
    486	 * If in compatibility mode since we don't setup a timer, we
    487	 * also signal RX channel up immediately. This enables us
    488	 * to send packets early which in turn usually triggers some
    489	 * reply from VM TCP which brings up the RX channel to it's
    490	 * final state.
    491	 */
    492	if ((CHANNEL_DIRECTION(ch->flags) == CTCM_READ) &&
    493	    (ch->protocol == CTCM_PROTO_S390)) {
    494		struct net_device *dev = ch->netdev;
    495		struct ctcm_priv *priv = dev->ml_priv;
    496		fsm_event(priv->fsm, DEV_EVENT_RXUP, dev);
    497	}
    498}
    499
    500/*
    501 * Got initial data, check it. If OK,
    502 * notify device statemachine that we are up and
    503 * running.
    504 *
    505 * fi		An instance of a channel statemachine.
    506 * event	The event, just happened.
    507 * arg		Generic pointer, casted from channel * upon call.
    508 */
    509static void chx_rxidle(fsm_instance *fi, int event, void *arg)
    510{
    511	struct channel *ch = arg;
    512	struct net_device *dev = ch->netdev;
    513	struct ctcm_priv *priv = dev->ml_priv;
    514	__u16 buflen;
    515	int rc;
    516
    517	fsm_deltimer(&ch->timer);
    518	buflen = *((__u16 *)ch->trans_skb->data);
    519	CTCM_PR_DEBUG("%s: %s: Initial RX count = %d\n",
    520			__func__, dev->name, buflen);
    521
    522	if (buflen >= CTCM_INITIAL_BLOCKLEN) {
    523		if (ctcm_checkalloc_buffer(ch))
    524			return;
    525		ch->ccw[1].count = ch->max_bufsize;
    526		fsm_newstate(fi, CTC_STATE_RXIDLE);
    527		rc = ccw_device_start(ch->cdev, &ch->ccw[0], 0, 0xff, 0);
    528		if (rc != 0) {
    529			fsm_newstate(fi, CTC_STATE_RXINIT);
    530			ctcm_ccw_check_rc(ch, rc, "initial RX");
    531		} else
    532			fsm_event(priv->fsm, DEV_EVENT_RXUP, dev);
    533	} else {
    534		CTCM_PR_DEBUG("%s: %s: Initial RX count %d not %d\n",
    535				__func__, dev->name,
    536					buflen, CTCM_INITIAL_BLOCKLEN);
    537		chx_firstio(fi, event, arg);
    538	}
    539}
    540
    541/*
    542 * Set channel into extended mode.
    543 *
    544 * fi		An instance of a channel statemachine.
    545 * event	The event, just happened.
    546 * arg		Generic pointer, casted from channel * upon call.
    547 */
    548static void ctcm_chx_setmode(fsm_instance *fi, int event, void *arg)
    549{
    550	struct channel *ch = arg;
    551	int rc;
    552	unsigned long saveflags = 0;
    553	int timeout = CTCM_TIME_5_SEC;
    554
    555	fsm_deltimer(&ch->timer);
    556	if (IS_MPC(ch)) {
    557		timeout = 1500;
    558		CTCM_PR_DEBUG("enter %s: cp=%i ch=0x%p id=%s\n",
    559				__func__, smp_processor_id(), ch, ch->id);
    560	}
    561	fsm_addtimer(&ch->timer, timeout, CTC_EVENT_TIMER, ch);
    562	fsm_newstate(fi, CTC_STATE_SETUPWAIT);
    563	CTCM_CCW_DUMP((char *)&ch->ccw[6], sizeof(struct ccw1) * 2);
    564
    565	if (event == CTC_EVENT_TIMER)	/* only for timer not yet locked */
    566		spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
    567			/* Such conditional locking is undeterministic in
    568			 * static view. => ignore sparse warnings here. */
    569
    570	rc = ccw_device_start(ch->cdev, &ch->ccw[6], 0, 0xff, 0);
    571	if (event == CTC_EVENT_TIMER)	/* see above comments */
    572		spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
    573	if (rc != 0) {
    574		fsm_deltimer(&ch->timer);
    575		fsm_newstate(fi, CTC_STATE_STARTWAIT);
    576		ctcm_ccw_check_rc(ch, rc, "set Mode");
    577	} else
    578		ch->retry = 0;
    579}
    580
    581/*
    582 * Setup channel.
    583 *
    584 * fi		An instance of a channel statemachine.
    585 * event	The event, just happened.
    586 * arg		Generic pointer, casted from channel * upon call.
    587 */
    588static void ctcm_chx_start(fsm_instance *fi, int event, void *arg)
    589{
    590	struct channel *ch	= arg;
    591	unsigned long saveflags;
    592	int rc;
    593
    594	CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO, "%s(%s): %s",
    595		CTCM_FUNTAIL, ch->id,
    596		(CHANNEL_DIRECTION(ch->flags) == CTCM_READ) ? "RX" : "TX");
    597
    598	if (ch->trans_skb != NULL) {
    599		clear_normalized_cda(&ch->ccw[1]);
    600		dev_kfree_skb(ch->trans_skb);
    601		ch->trans_skb = NULL;
    602	}
    603	if (CHANNEL_DIRECTION(ch->flags) == CTCM_READ) {
    604		ch->ccw[1].cmd_code = CCW_CMD_READ;
    605		ch->ccw[1].flags = CCW_FLAG_SLI;
    606		ch->ccw[1].count = 0;
    607	} else {
    608		ch->ccw[1].cmd_code = CCW_CMD_WRITE;
    609		ch->ccw[1].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
    610		ch->ccw[1].count = 0;
    611	}
    612	if (ctcm_checkalloc_buffer(ch)) {
    613		CTCM_DBF_TEXT_(TRACE, CTC_DBF_DEBUG,
    614			"%s(%s): %s trans_skb alloc delayed "
    615			"until first transfer",
    616			CTCM_FUNTAIL, ch->id,
    617			(CHANNEL_DIRECTION(ch->flags) == CTCM_READ) ?
    618				"RX" : "TX");
    619	}
    620	ch->ccw[0].cmd_code = CCW_CMD_PREPARE;
    621	ch->ccw[0].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
    622	ch->ccw[0].count = 0;
    623	ch->ccw[0].cda = 0;
    624	ch->ccw[2].cmd_code = CCW_CMD_NOOP;	/* jointed CE + DE */
    625	ch->ccw[2].flags = CCW_FLAG_SLI;
    626	ch->ccw[2].count = 0;
    627	ch->ccw[2].cda = 0;
    628	memcpy(&ch->ccw[3], &ch->ccw[0], sizeof(struct ccw1) * 3);
    629	ch->ccw[4].cda = 0;
    630	ch->ccw[4].flags &= ~CCW_FLAG_IDA;
    631
    632	fsm_newstate(fi, CTC_STATE_STARTWAIT);
    633	fsm_addtimer(&ch->timer, 1000, CTC_EVENT_TIMER, ch);
    634	spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
    635	rc = ccw_device_halt(ch->cdev, 0);
    636	spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
    637	if (rc != 0) {
    638		if (rc != -EBUSY)
    639			fsm_deltimer(&ch->timer);
    640		ctcm_ccw_check_rc(ch, rc, "initial HaltIO");
    641	}
    642}
    643
    644/*
    645 * Shutdown a channel.
    646 *
    647 * fi		An instance of a channel statemachine.
    648 * event	The event, just happened.
    649 * arg		Generic pointer, casted from channel * upon call.
    650 */
    651static void ctcm_chx_haltio(fsm_instance *fi, int event, void *arg)
    652{
    653	struct channel *ch = arg;
    654	unsigned long saveflags = 0;
    655	int rc;
    656	int oldstate;
    657
    658	fsm_deltimer(&ch->timer);
    659	if (IS_MPC(ch))
    660		fsm_deltimer(&ch->sweep_timer);
    661
    662	fsm_addtimer(&ch->timer, CTCM_TIME_5_SEC, CTC_EVENT_TIMER, ch);
    663
    664	if (event == CTC_EVENT_STOP)	/* only for STOP not yet locked */
    665		spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
    666			/* Such conditional locking is undeterministic in
    667			 * static view. => ignore sparse warnings here. */
    668	oldstate = fsm_getstate(fi);
    669	fsm_newstate(fi, CTC_STATE_TERM);
    670	rc = ccw_device_halt(ch->cdev, 0);
    671
    672	if (event == CTC_EVENT_STOP)
    673		spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
    674			/* see remark above about conditional locking */
    675
    676	if (rc != 0 && rc != -EBUSY) {
    677		fsm_deltimer(&ch->timer);
    678		if (event != CTC_EVENT_STOP) {
    679			fsm_newstate(fi, oldstate);
    680			ctcm_ccw_check_rc(ch, rc, (char *)__func__);
    681		}
    682	}
    683}
    684
    685/*
    686 * Cleanup helper for chx_fail and chx_stopped
    687 * cleanup channels queue and notify interface statemachine.
    688 *
    689 * fi		An instance of a channel statemachine.
    690 * state	The next state (depending on caller).
    691 * ch		The channel to operate on.
    692 */
    693static void ctcm_chx_cleanup(fsm_instance *fi, int state,
    694		struct channel *ch)
    695{
    696	struct net_device *dev = ch->netdev;
    697	struct ctcm_priv *priv = dev->ml_priv;
    698
    699	CTCM_DBF_TEXT_(SETUP, CTC_DBF_NOTICE,
    700			"%s(%s): %s[%d]\n",
    701			CTCM_FUNTAIL, dev->name, ch->id, state);
    702
    703	fsm_deltimer(&ch->timer);
    704	if (IS_MPC(ch))
    705		fsm_deltimer(&ch->sweep_timer);
    706
    707	fsm_newstate(fi, state);
    708	if (state == CTC_STATE_STOPPED && ch->trans_skb != NULL) {
    709		clear_normalized_cda(&ch->ccw[1]);
    710		dev_kfree_skb_any(ch->trans_skb);
    711		ch->trans_skb = NULL;
    712	}
    713
    714	ch->th_seg = 0x00;
    715	ch->th_seq_num = 0x00;
    716	if (CHANNEL_DIRECTION(ch->flags) == CTCM_READ) {
    717		skb_queue_purge(&ch->io_queue);
    718		fsm_event(priv->fsm, DEV_EVENT_RXDOWN, dev);
    719	} else {
    720		ctcm_purge_skb_queue(&ch->io_queue);
    721		if (IS_MPC(ch))
    722			ctcm_purge_skb_queue(&ch->sweep_queue);
    723		spin_lock(&ch->collect_lock);
    724		ctcm_purge_skb_queue(&ch->collect_queue);
    725		ch->collect_len = 0;
    726		spin_unlock(&ch->collect_lock);
    727		fsm_event(priv->fsm, DEV_EVENT_TXDOWN, dev);
    728	}
    729}
    730
    731/*
    732 * A channel has successfully been halted.
    733 * Cleanup it's queue and notify interface statemachine.
    734 *
    735 * fi		An instance of a channel statemachine.
    736 * event	The event, just happened.
    737 * arg		Generic pointer, casted from channel * upon call.
    738 */
    739static void ctcm_chx_stopped(fsm_instance *fi, int event, void *arg)
    740{
    741	ctcm_chx_cleanup(fi, CTC_STATE_STOPPED, arg);
    742}
    743
    744/*
    745 * A stop command from device statemachine arrived and we are in
    746 * not operational mode. Set state to stopped.
    747 *
    748 * fi		An instance of a channel statemachine.
    749 * event	The event, just happened.
    750 * arg		Generic pointer, casted from channel * upon call.
    751 */
    752static void ctcm_chx_stop(fsm_instance *fi, int event, void *arg)
    753{
    754	fsm_newstate(fi, CTC_STATE_STOPPED);
    755}
    756
    757/*
    758 * A machine check for no path, not operational status or gone device has
    759 * happened.
    760 * Cleanup queue and notify interface statemachine.
    761 *
    762 * fi		An instance of a channel statemachine.
    763 * event	The event, just happened.
    764 * arg		Generic pointer, casted from channel * upon call.
    765 */
    766static void ctcm_chx_fail(fsm_instance *fi, int event, void *arg)
    767{
    768	ctcm_chx_cleanup(fi, CTC_STATE_NOTOP, arg);
    769}
    770
    771/*
    772 * Handle error during setup of channel.
    773 *
    774 * fi		An instance of a channel statemachine.
    775 * event	The event, just happened.
    776 * arg		Generic pointer, casted from channel * upon call.
    777 */
    778static void ctcm_chx_setuperr(fsm_instance *fi, int event, void *arg)
    779{
    780	struct channel *ch = arg;
    781	struct net_device *dev = ch->netdev;
    782	struct ctcm_priv *priv = dev->ml_priv;
    783
    784	/*
    785	 * Special case: Got UC_RCRESET on setmode.
    786	 * This means that remote side isn't setup. In this case
    787	 * simply retry after some 10 secs...
    788	 */
    789	if ((fsm_getstate(fi) == CTC_STATE_SETUPWAIT) &&
    790	    ((event == CTC_EVENT_UC_RCRESET) ||
    791	     (event == CTC_EVENT_UC_RSRESET))) {
    792		fsm_newstate(fi, CTC_STATE_STARTRETRY);
    793		fsm_deltimer(&ch->timer);
    794		fsm_addtimer(&ch->timer, CTCM_TIME_5_SEC, CTC_EVENT_TIMER, ch);
    795		if (!IS_MPC(ch) &&
    796		    (CHANNEL_DIRECTION(ch->flags) == CTCM_READ)) {
    797			int rc = ccw_device_halt(ch->cdev, 0);
    798			if (rc != 0)
    799				ctcm_ccw_check_rc(ch, rc,
    800					"HaltIO in chx_setuperr");
    801		}
    802		return;
    803	}
    804
    805	CTCM_DBF_TEXT_(ERROR, CTC_DBF_CRIT,
    806		"%s(%s) : %s error during %s channel setup state=%s\n",
    807		CTCM_FUNTAIL, dev->name, ctc_ch_event_names[event],
    808		(CHANNEL_DIRECTION(ch->flags) == CTCM_READ) ? "RX" : "TX",
    809		fsm_getstate_str(fi));
    810
    811	if (CHANNEL_DIRECTION(ch->flags) == CTCM_READ) {
    812		fsm_newstate(fi, CTC_STATE_RXERR);
    813		fsm_event(priv->fsm, DEV_EVENT_RXDOWN, dev);
    814	} else {
    815		fsm_newstate(fi, CTC_STATE_TXERR);
    816		fsm_event(priv->fsm, DEV_EVENT_TXDOWN, dev);
    817	}
    818}
    819
    820/*
    821 * Restart a channel after an error.
    822 *
    823 * fi		An instance of a channel statemachine.
    824 * event	The event, just happened.
    825 * arg		Generic pointer, casted from channel * upon call.
    826 */
    827static void ctcm_chx_restart(fsm_instance *fi, int event, void *arg)
    828{
    829	struct channel *ch = arg;
    830	struct net_device *dev = ch->netdev;
    831	unsigned long saveflags = 0;
    832	int oldstate;
    833	int rc;
    834
    835	CTCM_DBF_TEXT_(TRACE, CTC_DBF_NOTICE,
    836		"%s: %s[%d] of %s\n",
    837			CTCM_FUNTAIL, ch->id, event, dev->name);
    838
    839	fsm_deltimer(&ch->timer);
    840
    841	fsm_addtimer(&ch->timer, CTCM_TIME_5_SEC, CTC_EVENT_TIMER, ch);
    842	oldstate = fsm_getstate(fi);
    843	fsm_newstate(fi, CTC_STATE_STARTWAIT);
    844	if (event == CTC_EVENT_TIMER)	/* only for timer not yet locked */
    845		spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
    846			/* Such conditional locking is a known problem for
    847			 * sparse because its undeterministic in static view.
    848			 * Warnings should be ignored here. */
    849	rc = ccw_device_halt(ch->cdev, 0);
    850	if (event == CTC_EVENT_TIMER)
    851		spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
    852	if (rc != 0) {
    853		if (rc != -EBUSY) {
    854		    fsm_deltimer(&ch->timer);
    855		    fsm_newstate(fi, oldstate);
    856		}
    857		ctcm_ccw_check_rc(ch, rc, "HaltIO in ctcm_chx_restart");
    858	}
    859}
    860
    861/*
    862 * Handle error during RX initial handshake (exchange of
    863 * 0-length block header)
    864 *
    865 * fi		An instance of a channel statemachine.
    866 * event	The event, just happened.
    867 * arg		Generic pointer, casted from channel * upon call.
    868 */
    869static void ctcm_chx_rxiniterr(fsm_instance *fi, int event, void *arg)
    870{
    871	struct channel *ch = arg;
    872	struct net_device *dev = ch->netdev;
    873	struct ctcm_priv *priv = dev->ml_priv;
    874
    875	if (event == CTC_EVENT_TIMER) {
    876		if (!IS_MPCDEV(dev))
    877			/* TODO : check if MPC deletes timer somewhere */
    878			fsm_deltimer(&ch->timer);
    879		if (ch->retry++ < 3)
    880			ctcm_chx_restart(fi, event, arg);
    881		else {
    882			fsm_newstate(fi, CTC_STATE_RXERR);
    883			fsm_event(priv->fsm, DEV_EVENT_RXDOWN, dev);
    884		}
    885	} else {
    886		CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
    887			"%s(%s): %s in %s", CTCM_FUNTAIL, ch->id,
    888			ctc_ch_event_names[event], fsm_getstate_str(fi));
    889
    890		dev_warn(&dev->dev,
    891			"Initialization failed with RX/TX init handshake "
    892			"error %s\n", ctc_ch_event_names[event]);
    893	}
    894}
    895
    896/*
    897 * Notify device statemachine if we gave up initialization
    898 * of RX channel.
    899 *
    900 * fi		An instance of a channel statemachine.
    901 * event	The event, just happened.
    902 * arg		Generic pointer, casted from channel * upon call.
    903 */
    904static void ctcm_chx_rxinitfail(fsm_instance *fi, int event, void *arg)
    905{
    906	struct channel *ch = arg;
    907	struct net_device *dev = ch->netdev;
    908	struct ctcm_priv *priv = dev->ml_priv;
    909
    910	CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
    911			"%s(%s): RX %s busy, init. fail",
    912				CTCM_FUNTAIL, dev->name, ch->id);
    913	fsm_newstate(fi, CTC_STATE_RXERR);
    914	fsm_event(priv->fsm, DEV_EVENT_RXDOWN, dev);
    915}
    916
    917/*
    918 * Handle RX Unit check remote reset (remote disconnected)
    919 *
    920 * fi		An instance of a channel statemachine.
    921 * event	The event, just happened.
    922 * arg		Generic pointer, casted from channel * upon call.
    923 */
    924static void ctcm_chx_rxdisc(fsm_instance *fi, int event, void *arg)
    925{
    926	struct channel *ch = arg;
    927	struct channel *ch2;
    928	struct net_device *dev = ch->netdev;
    929	struct ctcm_priv *priv = dev->ml_priv;
    930
    931	CTCM_DBF_TEXT_(TRACE, CTC_DBF_NOTICE,
    932			"%s: %s: remote disconnect - re-init ...",
    933				CTCM_FUNTAIL, dev->name);
    934	fsm_deltimer(&ch->timer);
    935	/*
    936	 * Notify device statemachine
    937	 */
    938	fsm_event(priv->fsm, DEV_EVENT_RXDOWN, dev);
    939	fsm_event(priv->fsm, DEV_EVENT_TXDOWN, dev);
    940
    941	fsm_newstate(fi, CTC_STATE_DTERM);
    942	ch2 = priv->channel[CTCM_WRITE];
    943	fsm_newstate(ch2->fsm, CTC_STATE_DTERM);
    944
    945	ccw_device_halt(ch->cdev, 0);
    946	ccw_device_halt(ch2->cdev, 0);
    947}
    948
    949/*
    950 * Handle error during TX channel initialization.
    951 *
    952 * fi		An instance of a channel statemachine.
    953 * event	The event, just happened.
    954 * arg		Generic pointer, casted from channel * upon call.
    955 */
    956static void ctcm_chx_txiniterr(fsm_instance *fi, int event, void *arg)
    957{
    958	struct channel *ch = arg;
    959	struct net_device *dev = ch->netdev;
    960	struct ctcm_priv *priv = dev->ml_priv;
    961
    962	if (event == CTC_EVENT_TIMER) {
    963		fsm_deltimer(&ch->timer);
    964		if (ch->retry++ < 3)
    965			ctcm_chx_restart(fi, event, arg);
    966		else {
    967			fsm_newstate(fi, CTC_STATE_TXERR);
    968			fsm_event(priv->fsm, DEV_EVENT_TXDOWN, dev);
    969		}
    970	} else {
    971		CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
    972			"%s(%s): %s in %s", CTCM_FUNTAIL, ch->id,
    973			ctc_ch_event_names[event], fsm_getstate_str(fi));
    974
    975		dev_warn(&dev->dev,
    976			"Initialization failed with RX/TX init handshake "
    977			"error %s\n", ctc_ch_event_names[event]);
    978	}
    979}
    980
    981/*
    982 * Handle TX timeout by retrying operation.
    983 *
    984 * fi		An instance of a channel statemachine.
    985 * event	The event, just happened.
    986 * arg		Generic pointer, casted from channel * upon call.
    987 */
    988static void ctcm_chx_txretry(fsm_instance *fi, int event, void *arg)
    989{
    990	struct channel *ch = arg;
    991	struct net_device *dev = ch->netdev;
    992	struct ctcm_priv *priv = dev->ml_priv;
    993	struct sk_buff *skb;
    994
    995	CTCM_PR_DEBUG("Enter: %s: cp=%i ch=0x%p id=%s\n",
    996			__func__, smp_processor_id(), ch, ch->id);
    997
    998	fsm_deltimer(&ch->timer);
    999	if (ch->retry++ > 3) {
   1000		struct mpc_group *gptr = priv->mpcg;
   1001		CTCM_DBF_TEXT_(TRACE, CTC_DBF_INFO,
   1002				"%s: %s: retries exceeded",
   1003					CTCM_FUNTAIL, ch->id);
   1004		fsm_event(priv->fsm, DEV_EVENT_TXDOWN, dev);
   1005		/* call restart if not MPC or if MPC and mpcg fsm is ready.
   1006			use gptr as mpc indicator */
   1007		if (!(gptr && (fsm_getstate(gptr->fsm) != MPCG_STATE_READY)))
   1008			ctcm_chx_restart(fi, event, arg);
   1009				goto done;
   1010	}
   1011
   1012	CTCM_DBF_TEXT_(TRACE, CTC_DBF_DEBUG,
   1013			"%s : %s: retry %d",
   1014				CTCM_FUNTAIL, ch->id, ch->retry);
   1015	skb = skb_peek(&ch->io_queue);
   1016	if (skb) {
   1017		int rc = 0;
   1018		unsigned long saveflags = 0;
   1019		clear_normalized_cda(&ch->ccw[4]);
   1020		ch->ccw[4].count = skb->len;
   1021		if (set_normalized_cda(&ch->ccw[4], skb->data)) {
   1022			CTCM_DBF_TEXT_(TRACE, CTC_DBF_INFO,
   1023				"%s: %s: IDAL alloc failed",
   1024						CTCM_FUNTAIL, ch->id);
   1025			fsm_event(priv->fsm, DEV_EVENT_TXDOWN, dev);
   1026			ctcm_chx_restart(fi, event, arg);
   1027				goto done;
   1028		}
   1029		fsm_addtimer(&ch->timer, 1000, CTC_EVENT_TIMER, ch);
   1030		if (event == CTC_EVENT_TIMER) /* for TIMER not yet locked */
   1031			spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
   1032			/* Such conditional locking is a known problem for
   1033			 * sparse because its undeterministic in static view.
   1034			 * Warnings should be ignored here. */
   1035		if (do_debug_ccw)
   1036			ctcmpc_dumpit((char *)&ch->ccw[3],
   1037					sizeof(struct ccw1) * 3);
   1038
   1039		rc = ccw_device_start(ch->cdev, &ch->ccw[3], 0, 0xff, 0);
   1040		if (event == CTC_EVENT_TIMER)
   1041			spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev),
   1042					saveflags);
   1043		if (rc != 0) {
   1044			fsm_deltimer(&ch->timer);
   1045			ctcm_ccw_check_rc(ch, rc, "TX in chx_txretry");
   1046			ctcm_purge_skb_queue(&ch->io_queue);
   1047		}
   1048	}
   1049done:
   1050	return;
   1051}
   1052
   1053/*
   1054 * Handle fatal errors during an I/O command.
   1055 *
   1056 * fi		An instance of a channel statemachine.
   1057 * event	The event, just happened.
   1058 * arg		Generic pointer, casted from channel * upon call.
   1059 */
   1060static void ctcm_chx_iofatal(fsm_instance *fi, int event, void *arg)
   1061{
   1062	struct channel *ch = arg;
   1063	struct net_device *dev = ch->netdev;
   1064	struct ctcm_priv *priv = dev->ml_priv;
   1065	int rd = CHANNEL_DIRECTION(ch->flags);
   1066
   1067	fsm_deltimer(&ch->timer);
   1068	CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
   1069		"%s: %s: %s unrecoverable channel error",
   1070			CTCM_FUNTAIL, ch->id, rd == CTCM_READ ? "RX" : "TX");
   1071
   1072	if (IS_MPC(ch)) {
   1073		priv->stats.tx_dropped++;
   1074		priv->stats.tx_errors++;
   1075	}
   1076	if (rd == CTCM_READ) {
   1077		fsm_newstate(fi, CTC_STATE_RXERR);
   1078		fsm_event(priv->fsm, DEV_EVENT_RXDOWN, dev);
   1079	} else {
   1080		fsm_newstate(fi, CTC_STATE_TXERR);
   1081		fsm_event(priv->fsm, DEV_EVENT_TXDOWN, dev);
   1082	}
   1083}
   1084
   1085/*
   1086 * The ctcm statemachine for a channel.
   1087 */
   1088const fsm_node ch_fsm[] = {
   1089	{ CTC_STATE_STOPPED,	CTC_EVENT_STOP,		ctcm_action_nop  },
   1090	{ CTC_STATE_STOPPED,	CTC_EVENT_START,	ctcm_chx_start  },
   1091	{ CTC_STATE_STOPPED,	CTC_EVENT_FINSTAT,	ctcm_action_nop  },
   1092	{ CTC_STATE_STOPPED,	CTC_EVENT_MC_FAIL,	ctcm_action_nop  },
   1093
   1094	{ CTC_STATE_NOTOP,	CTC_EVENT_STOP,		ctcm_chx_stop  },
   1095	{ CTC_STATE_NOTOP,	CTC_EVENT_START,	ctcm_action_nop  },
   1096	{ CTC_STATE_NOTOP,	CTC_EVENT_FINSTAT,	ctcm_action_nop  },
   1097	{ CTC_STATE_NOTOP,	CTC_EVENT_MC_FAIL,	ctcm_action_nop  },
   1098	{ CTC_STATE_NOTOP,	CTC_EVENT_MC_GOOD,	ctcm_chx_start  },
   1099
   1100	{ CTC_STATE_STARTWAIT,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1101	{ CTC_STATE_STARTWAIT,	CTC_EVENT_START,	ctcm_action_nop  },
   1102	{ CTC_STATE_STARTWAIT,	CTC_EVENT_FINSTAT,	ctcm_chx_setmode  },
   1103	{ CTC_STATE_STARTWAIT,	CTC_EVENT_TIMER,	ctcm_chx_setuperr  },
   1104	{ CTC_STATE_STARTWAIT,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1105	{ CTC_STATE_STARTWAIT,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1106
   1107	{ CTC_STATE_STARTRETRY,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1108	{ CTC_STATE_STARTRETRY,	CTC_EVENT_TIMER,	ctcm_chx_setmode  },
   1109	{ CTC_STATE_STARTRETRY,	CTC_EVENT_FINSTAT,	ctcm_action_nop  },
   1110	{ CTC_STATE_STARTRETRY,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1111
   1112	{ CTC_STATE_SETUPWAIT,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1113	{ CTC_STATE_SETUPWAIT,	CTC_EVENT_START,	ctcm_action_nop  },
   1114	{ CTC_STATE_SETUPWAIT,	CTC_EVENT_FINSTAT,	chx_firstio  },
   1115	{ CTC_STATE_SETUPWAIT,	CTC_EVENT_UC_RCRESET,	ctcm_chx_setuperr  },
   1116	{ CTC_STATE_SETUPWAIT,	CTC_EVENT_UC_RSRESET,	ctcm_chx_setuperr  },
   1117	{ CTC_STATE_SETUPWAIT,	CTC_EVENT_TIMER,	ctcm_chx_setmode  },
   1118	{ CTC_STATE_SETUPWAIT,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1119	{ CTC_STATE_SETUPWAIT,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1120
   1121	{ CTC_STATE_RXINIT,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1122	{ CTC_STATE_RXINIT,	CTC_EVENT_START,	ctcm_action_nop  },
   1123	{ CTC_STATE_RXINIT,	CTC_EVENT_FINSTAT,	chx_rxidle  },
   1124	{ CTC_STATE_RXINIT,	CTC_EVENT_UC_RCRESET,	ctcm_chx_rxiniterr  },
   1125	{ CTC_STATE_RXINIT,	CTC_EVENT_UC_RSRESET,	ctcm_chx_rxiniterr  },
   1126	{ CTC_STATE_RXINIT,	CTC_EVENT_TIMER,	ctcm_chx_rxiniterr  },
   1127	{ CTC_STATE_RXINIT,	CTC_EVENT_ATTNBUSY,	ctcm_chx_rxinitfail  },
   1128	{ CTC_STATE_RXINIT,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1129	{ CTC_STATE_RXINIT,	CTC_EVENT_UC_ZERO,	chx_firstio  },
   1130	{ CTC_STATE_RXINIT,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1131
   1132	{ CTC_STATE_RXIDLE,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1133	{ CTC_STATE_RXIDLE,	CTC_EVENT_START,	ctcm_action_nop  },
   1134	{ CTC_STATE_RXIDLE,	CTC_EVENT_FINSTAT,	chx_rx  },
   1135	{ CTC_STATE_RXIDLE,	CTC_EVENT_UC_RCRESET,	ctcm_chx_rxdisc  },
   1136	{ CTC_STATE_RXIDLE,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1137	{ CTC_STATE_RXIDLE,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1138	{ CTC_STATE_RXIDLE,	CTC_EVENT_UC_ZERO,	chx_rx  },
   1139
   1140	{ CTC_STATE_TXINIT,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1141	{ CTC_STATE_TXINIT,	CTC_EVENT_START,	ctcm_action_nop  },
   1142	{ CTC_STATE_TXINIT,	CTC_EVENT_FINSTAT,	ctcm_chx_txidle  },
   1143	{ CTC_STATE_TXINIT,	CTC_EVENT_UC_RCRESET,	ctcm_chx_txiniterr  },
   1144	{ CTC_STATE_TXINIT,	CTC_EVENT_UC_RSRESET,	ctcm_chx_txiniterr  },
   1145	{ CTC_STATE_TXINIT,	CTC_EVENT_TIMER,	ctcm_chx_txiniterr  },
   1146	{ CTC_STATE_TXINIT,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1147	{ CTC_STATE_TXINIT,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1148
   1149	{ CTC_STATE_TXIDLE,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1150	{ CTC_STATE_TXIDLE,	CTC_EVENT_START,	ctcm_action_nop  },
   1151	{ CTC_STATE_TXIDLE,	CTC_EVENT_FINSTAT,	chx_firstio  },
   1152	{ CTC_STATE_TXIDLE,	CTC_EVENT_UC_RCRESET,	ctcm_action_nop  },
   1153	{ CTC_STATE_TXIDLE,	CTC_EVENT_UC_RSRESET,	ctcm_action_nop  },
   1154	{ CTC_STATE_TXIDLE,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1155	{ CTC_STATE_TXIDLE,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1156
   1157	{ CTC_STATE_TERM,	CTC_EVENT_STOP,		ctcm_action_nop  },
   1158	{ CTC_STATE_TERM,	CTC_EVENT_START,	ctcm_chx_restart  },
   1159	{ CTC_STATE_TERM,	CTC_EVENT_FINSTAT,	ctcm_chx_stopped  },
   1160	{ CTC_STATE_TERM,	CTC_EVENT_UC_RCRESET,	ctcm_action_nop  },
   1161	{ CTC_STATE_TERM,	CTC_EVENT_UC_RSRESET,	ctcm_action_nop  },
   1162	{ CTC_STATE_TERM,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1163
   1164	{ CTC_STATE_DTERM,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1165	{ CTC_STATE_DTERM,	CTC_EVENT_START,	ctcm_chx_restart  },
   1166	{ CTC_STATE_DTERM,	CTC_EVENT_FINSTAT,	ctcm_chx_setmode  },
   1167	{ CTC_STATE_DTERM,	CTC_EVENT_UC_RCRESET,	ctcm_action_nop  },
   1168	{ CTC_STATE_DTERM,	CTC_EVENT_UC_RSRESET,	ctcm_action_nop  },
   1169	{ CTC_STATE_DTERM,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1170
   1171	{ CTC_STATE_TX,		CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1172	{ CTC_STATE_TX,		CTC_EVENT_START,	ctcm_action_nop  },
   1173	{ CTC_STATE_TX,		CTC_EVENT_FINSTAT,	chx_txdone  },
   1174	{ CTC_STATE_TX,		CTC_EVENT_UC_RCRESET,	ctcm_chx_txretry  },
   1175	{ CTC_STATE_TX,		CTC_EVENT_UC_RSRESET,	ctcm_chx_txretry  },
   1176	{ CTC_STATE_TX,		CTC_EVENT_TIMER,	ctcm_chx_txretry  },
   1177	{ CTC_STATE_TX,		CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1178	{ CTC_STATE_TX,		CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1179
   1180	{ CTC_STATE_RXERR,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1181	{ CTC_STATE_TXERR,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1182	{ CTC_STATE_TXERR,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1183	{ CTC_STATE_RXERR,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1184};
   1185
   1186int ch_fsm_len = ARRAY_SIZE(ch_fsm);
   1187
   1188/*
   1189 * MPC actions for mpc channel statemachine
   1190 * handling of MPC protocol requires extra
   1191 * statemachine and actions which are prefixed ctcmpc_ .
   1192 * The ctc_ch_states and ctc_ch_state_names,
   1193 * ctc_ch_events and ctc_ch_event_names share the ctcm definitions
   1194 * which are expanded by some elements.
   1195 */
   1196
   1197/*
   1198 * Actions for mpc channel statemachine.
   1199 */
   1200
   1201/*
   1202 * Normal data has been send. Free the corresponding
   1203 * skb (it's in io_queue), reset dev->tbusy and
   1204 * revert to idle state.
   1205 *
   1206 * fi		An instance of a channel statemachine.
   1207 * event	The event, just happened.
   1208 * arg		Generic pointer, casted from channel * upon call.
   1209 */
   1210static void ctcmpc_chx_txdone(fsm_instance *fi, int event, void *arg)
   1211{
   1212	struct channel		*ch = arg;
   1213	struct net_device	*dev = ch->netdev;
   1214	struct ctcm_priv	*priv = dev->ml_priv;
   1215	struct mpc_group	*grp = priv->mpcg;
   1216	struct sk_buff		*skb;
   1217	int		first = 1;
   1218	int		i;
   1219	__u32		data_space;
   1220	unsigned long	duration;
   1221	struct sk_buff	*peekskb;
   1222	int		rc;
   1223	struct th_header *header;
   1224	struct pdu	*p_header;
   1225	unsigned long done_stamp = jiffies;
   1226
   1227	CTCM_PR_DEBUG("Enter %s: %s cp:%i\n",
   1228			__func__, dev->name, smp_processor_id());
   1229
   1230	duration = done_stamp - ch->prof.send_stamp;
   1231	if (duration > ch->prof.tx_time)
   1232		ch->prof.tx_time = duration;
   1233
   1234	if (ch->irb->scsw.cmd.count != 0)
   1235		CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_DEBUG,
   1236			"%s(%s): TX not complete, remaining %d bytes",
   1237			     CTCM_FUNTAIL, dev->name, ch->irb->scsw.cmd.count);
   1238	fsm_deltimer(&ch->timer);
   1239	while ((skb = skb_dequeue(&ch->io_queue))) {
   1240		priv->stats.tx_packets++;
   1241		priv->stats.tx_bytes += skb->len - TH_HEADER_LENGTH;
   1242		if (first) {
   1243			priv->stats.tx_bytes += 2;
   1244			first = 0;
   1245		}
   1246		refcount_dec(&skb->users);
   1247		dev_kfree_skb_irq(skb);
   1248	}
   1249	spin_lock(&ch->collect_lock);
   1250	clear_normalized_cda(&ch->ccw[4]);
   1251	if ((ch->collect_len <= 0) || (grp->in_sweep != 0)) {
   1252		spin_unlock(&ch->collect_lock);
   1253		fsm_newstate(fi, CTC_STATE_TXIDLE);
   1254				goto done;
   1255	}
   1256
   1257	if (ctcm_checkalloc_buffer(ch)) {
   1258		spin_unlock(&ch->collect_lock);
   1259				goto done;
   1260	}
   1261	ch->trans_skb->data = ch->trans_skb_data;
   1262	skb_reset_tail_pointer(ch->trans_skb);
   1263	ch->trans_skb->len = 0;
   1264	if (ch->prof.maxmulti < (ch->collect_len + TH_HEADER_LENGTH))
   1265		ch->prof.maxmulti = ch->collect_len + TH_HEADER_LENGTH;
   1266	if (ch->prof.maxcqueue < skb_queue_len(&ch->collect_queue))
   1267		ch->prof.maxcqueue = skb_queue_len(&ch->collect_queue);
   1268	i = 0;
   1269	p_header = NULL;
   1270	data_space = grp->group_max_buflen - TH_HEADER_LENGTH;
   1271
   1272	CTCM_PR_DBGDATA("%s: building trans_skb from collect_q"
   1273		       " data_space:%04x\n",
   1274		       __func__, data_space);
   1275
   1276	while ((skb = skb_dequeue(&ch->collect_queue))) {
   1277		skb_put_data(ch->trans_skb, skb->data, skb->len);
   1278		p_header = (struct pdu *)
   1279			(skb_tail_pointer(ch->trans_skb) - skb->len);
   1280		p_header->pdu_flag = 0x00;
   1281		if (be16_to_cpu(skb->protocol) == ETH_P_SNAP)
   1282			p_header->pdu_flag |= 0x60;
   1283		else
   1284			p_header->pdu_flag |= 0x20;
   1285
   1286		CTCM_PR_DBGDATA("%s: trans_skb len:%04x \n",
   1287				__func__, ch->trans_skb->len);
   1288		CTCM_PR_DBGDATA("%s: pdu header and data for up"
   1289				" to 32 bytes sent to vtam\n", __func__);
   1290		CTCM_D3_DUMP((char *)p_header, min_t(int, skb->len, 32));
   1291
   1292		ch->collect_len -= skb->len;
   1293		data_space -= skb->len;
   1294		priv->stats.tx_packets++;
   1295		priv->stats.tx_bytes += skb->len;
   1296		refcount_dec(&skb->users);
   1297		dev_kfree_skb_any(skb);
   1298		peekskb = skb_peek(&ch->collect_queue);
   1299		if (peekskb->len > data_space)
   1300			break;
   1301		i++;
   1302	}
   1303	/* p_header points to the last one we handled */
   1304	if (p_header)
   1305		p_header->pdu_flag |= PDU_LAST;	/*Say it's the last one*/
   1306
   1307	header = skb_push(ch->trans_skb, TH_HEADER_LENGTH);
   1308	memset(header, 0, TH_HEADER_LENGTH);
   1309
   1310	header->th_ch_flag = TH_HAS_PDU;  /* Normal data */
   1311	ch->th_seq_num++;
   1312	header->th_seq_num = ch->th_seq_num;
   1313
   1314	CTCM_PR_DBGDATA("%s: ToVTAM_th_seq= %08x\n" ,
   1315					__func__, ch->th_seq_num);
   1316
   1317	CTCM_PR_DBGDATA("%s: trans_skb len:%04x \n",
   1318		       __func__, ch->trans_skb->len);
   1319	CTCM_PR_DBGDATA("%s: up-to-50 bytes of trans_skb "
   1320			"data to vtam from collect_q\n", __func__);
   1321	CTCM_D3_DUMP((char *)ch->trans_skb->data,
   1322				min_t(int, ch->trans_skb->len, 50));
   1323
   1324	spin_unlock(&ch->collect_lock);
   1325	clear_normalized_cda(&ch->ccw[1]);
   1326
   1327	CTCM_PR_DBGDATA("ccwcda=0x%p data=0x%p\n",
   1328			(void *)(unsigned long)ch->ccw[1].cda,
   1329			ch->trans_skb->data);
   1330	ch->ccw[1].count = ch->max_bufsize;
   1331
   1332	if (set_normalized_cda(&ch->ccw[1], ch->trans_skb->data)) {
   1333		dev_kfree_skb_any(ch->trans_skb);
   1334		ch->trans_skb = NULL;
   1335		CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_ERROR,
   1336			"%s: %s: IDAL alloc failed",
   1337				CTCM_FUNTAIL, ch->id);
   1338		fsm_event(priv->mpcg->fsm, MPCG_EVENT_INOP, dev);
   1339		return;
   1340	}
   1341
   1342	CTCM_PR_DBGDATA("ccwcda=0x%p data=0x%p\n",
   1343			(void *)(unsigned long)ch->ccw[1].cda,
   1344			ch->trans_skb->data);
   1345
   1346	ch->ccw[1].count = ch->trans_skb->len;
   1347	fsm_addtimer(&ch->timer, CTCM_TIME_5_SEC, CTC_EVENT_TIMER, ch);
   1348	ch->prof.send_stamp = jiffies;
   1349	if (do_debug_ccw)
   1350		ctcmpc_dumpit((char *)&ch->ccw[0], sizeof(struct ccw1) * 3);
   1351	rc = ccw_device_start(ch->cdev, &ch->ccw[0], 0, 0xff, 0);
   1352	ch->prof.doios_multi++;
   1353	if (rc != 0) {
   1354		priv->stats.tx_dropped += i;
   1355		priv->stats.tx_errors += i;
   1356		fsm_deltimer(&ch->timer);
   1357		ctcm_ccw_check_rc(ch, rc, "chained TX");
   1358	}
   1359done:
   1360	ctcm_clear_busy(dev);
   1361	return;
   1362}
   1363
   1364/*
   1365 * Got normal data, check for sanity, queue it up, allocate new buffer
   1366 * trigger bottom half, and initiate next read.
   1367 *
   1368 * fi		An instance of a channel statemachine.
   1369 * event	The event, just happened.
   1370 * arg		Generic pointer, casted from channel * upon call.
   1371 */
   1372static void ctcmpc_chx_rx(fsm_instance *fi, int event, void *arg)
   1373{
   1374	struct channel		*ch = arg;
   1375	struct net_device	*dev = ch->netdev;
   1376	struct ctcm_priv	*priv = dev->ml_priv;
   1377	struct mpc_group	*grp = priv->mpcg;
   1378	struct sk_buff		*skb = ch->trans_skb;
   1379	struct sk_buff		*new_skb;
   1380	unsigned long		saveflags = 0;	/* avoids compiler warning */
   1381	int len	= ch->max_bufsize - ch->irb->scsw.cmd.count;
   1382
   1383	CTCM_PR_DEBUG("%s: %s: cp:%i %s maxbuf : %04x, len: %04x\n",
   1384			CTCM_FUNTAIL, dev->name, smp_processor_id(),
   1385				ch->id, ch->max_bufsize, len);
   1386	fsm_deltimer(&ch->timer);
   1387
   1388	if (skb == NULL) {
   1389		CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
   1390			"%s(%s): TRANS_SKB = NULL",
   1391				CTCM_FUNTAIL, dev->name);
   1392			goto again;
   1393	}
   1394
   1395	if (len < TH_HEADER_LENGTH) {
   1396		CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
   1397				"%s(%s): packet length %d too short",
   1398					CTCM_FUNTAIL, dev->name, len);
   1399		priv->stats.rx_dropped++;
   1400		priv->stats.rx_length_errors++;
   1401	} else {
   1402		/* must have valid th header or game over */
   1403		__u32	block_len = len;
   1404		len = TH_HEADER_LENGTH + XID2_LENGTH + 4;
   1405		new_skb = __dev_alloc_skb(ch->max_bufsize, GFP_ATOMIC);
   1406
   1407		if (new_skb == NULL) {
   1408			CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
   1409				"%s(%s): skb allocation failed",
   1410						CTCM_FUNTAIL, dev->name);
   1411			fsm_event(priv->mpcg->fsm, MPCG_EVENT_INOP, dev);
   1412					goto again;
   1413		}
   1414		switch (fsm_getstate(grp->fsm)) {
   1415		case MPCG_STATE_RESET:
   1416		case MPCG_STATE_INOP:
   1417			dev_kfree_skb_any(new_skb);
   1418			break;
   1419		case MPCG_STATE_FLOWC:
   1420		case MPCG_STATE_READY:
   1421			skb_put_data(new_skb, skb->data, block_len);
   1422			skb_queue_tail(&ch->io_queue, new_skb);
   1423			tasklet_schedule(&ch->ch_tasklet);
   1424			break;
   1425		default:
   1426			skb_put_data(new_skb, skb->data, len);
   1427			skb_queue_tail(&ch->io_queue, new_skb);
   1428			tasklet_hi_schedule(&ch->ch_tasklet);
   1429			break;
   1430		}
   1431	}
   1432
   1433again:
   1434	switch (fsm_getstate(grp->fsm)) {
   1435	int rc, dolock;
   1436	case MPCG_STATE_FLOWC:
   1437	case MPCG_STATE_READY:
   1438		if (ctcm_checkalloc_buffer(ch))
   1439			break;
   1440		ch->trans_skb->data = ch->trans_skb_data;
   1441		skb_reset_tail_pointer(ch->trans_skb);
   1442		ch->trans_skb->len = 0;
   1443		ch->ccw[1].count = ch->max_bufsize;
   1444			if (do_debug_ccw)
   1445			ctcmpc_dumpit((char *)&ch->ccw[0],
   1446					sizeof(struct ccw1) * 3);
   1447		dolock = !in_hardirq();
   1448		if (dolock)
   1449			spin_lock_irqsave(
   1450				get_ccwdev_lock(ch->cdev), saveflags);
   1451		rc = ccw_device_start(ch->cdev, &ch->ccw[0], 0, 0xff, 0);
   1452		if (dolock) /* see remark about conditional locking */
   1453			spin_unlock_irqrestore(
   1454				get_ccwdev_lock(ch->cdev), saveflags);
   1455		if (rc != 0)
   1456			ctcm_ccw_check_rc(ch, rc, "normal RX");
   1457		break;
   1458	default:
   1459		break;
   1460	}
   1461
   1462	CTCM_PR_DEBUG("Exit %s: %s, ch=0x%p, id=%s\n",
   1463			__func__, dev->name, ch, ch->id);
   1464
   1465}
   1466
   1467/*
   1468 * Initialize connection by sending a __u16 of value 0.
   1469 *
   1470 * fi		An instance of a channel statemachine.
   1471 * event	The event, just happened.
   1472 * arg		Generic pointer, casted from channel * upon call.
   1473 */
   1474static void ctcmpc_chx_firstio(fsm_instance *fi, int event, void *arg)
   1475{
   1476	struct channel		*ch = arg;
   1477	struct net_device	*dev = ch->netdev;
   1478	struct ctcm_priv	*priv = dev->ml_priv;
   1479	struct mpc_group	*gptr = priv->mpcg;
   1480
   1481	CTCM_PR_DEBUG("Enter %s: id=%s, ch=0x%p\n",
   1482				__func__, ch->id, ch);
   1483
   1484	CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_INFO,
   1485			"%s: %s: chstate:%i, grpstate:%i, prot:%i\n",
   1486			CTCM_FUNTAIL, ch->id, fsm_getstate(fi),
   1487			fsm_getstate(gptr->fsm), ch->protocol);
   1488
   1489	if (fsm_getstate(fi) == CTC_STATE_TXIDLE)
   1490		MPC_DBF_DEV_NAME(TRACE, dev, "remote side issued READ? ");
   1491
   1492	fsm_deltimer(&ch->timer);
   1493	if (ctcm_checkalloc_buffer(ch))
   1494				goto done;
   1495
   1496	switch (fsm_getstate(fi)) {
   1497	case CTC_STATE_STARTRETRY:
   1498	case CTC_STATE_SETUPWAIT:
   1499		if (CHANNEL_DIRECTION(ch->flags) == CTCM_READ) {
   1500			ctcmpc_chx_rxidle(fi, event, arg);
   1501		} else {
   1502			fsm_newstate(fi, CTC_STATE_TXIDLE);
   1503			fsm_event(priv->fsm, DEV_EVENT_TXUP, dev);
   1504		}
   1505				goto done;
   1506	default:
   1507		break;
   1508	}
   1509
   1510	fsm_newstate(fi, (CHANNEL_DIRECTION(ch->flags) == CTCM_READ)
   1511		     ? CTC_STATE_RXINIT : CTC_STATE_TXINIT);
   1512
   1513done:
   1514	CTCM_PR_DEBUG("Exit %s: id=%s, ch=0x%p\n",
   1515				__func__, ch->id, ch);
   1516	return;
   1517}
   1518
   1519/*
   1520 * Got initial data, check it. If OK,
   1521 * notify device statemachine that we are up and
   1522 * running.
   1523 *
   1524 * fi		An instance of a channel statemachine.
   1525 * event	The event, just happened.
   1526 * arg		Generic pointer, casted from channel * upon call.
   1527 */
   1528void ctcmpc_chx_rxidle(fsm_instance *fi, int event, void *arg)
   1529{
   1530	struct channel *ch = arg;
   1531	struct net_device *dev = ch->netdev;
   1532	struct ctcm_priv  *priv = dev->ml_priv;
   1533	struct mpc_group  *grp = priv->mpcg;
   1534	int rc;
   1535	unsigned long saveflags = 0;	/* avoids compiler warning */
   1536
   1537	fsm_deltimer(&ch->timer);
   1538	CTCM_PR_DEBUG("%s: %s: %s: cp:%i, chstate:%i grpstate:%i\n",
   1539			__func__, ch->id, dev->name, smp_processor_id(),
   1540				fsm_getstate(fi), fsm_getstate(grp->fsm));
   1541
   1542	fsm_newstate(fi, CTC_STATE_RXIDLE);
   1543	/* XID processing complete */
   1544
   1545	switch (fsm_getstate(grp->fsm)) {
   1546	case MPCG_STATE_FLOWC:
   1547	case MPCG_STATE_READY:
   1548		if (ctcm_checkalloc_buffer(ch))
   1549				goto done;
   1550		ch->trans_skb->data = ch->trans_skb_data;
   1551		skb_reset_tail_pointer(ch->trans_skb);
   1552		ch->trans_skb->len = 0;
   1553		ch->ccw[1].count = ch->max_bufsize;
   1554		CTCM_CCW_DUMP((char *)&ch->ccw[0], sizeof(struct ccw1) * 3);
   1555		if (event == CTC_EVENT_START)
   1556			/* see remark about conditional locking */
   1557			spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
   1558		rc = ccw_device_start(ch->cdev, &ch->ccw[0], 0, 0xff, 0);
   1559		if (event == CTC_EVENT_START)
   1560			spin_unlock_irqrestore(
   1561					get_ccwdev_lock(ch->cdev), saveflags);
   1562		if (rc != 0) {
   1563			fsm_newstate(fi, CTC_STATE_RXINIT);
   1564			ctcm_ccw_check_rc(ch, rc, "initial RX");
   1565				goto done;
   1566		}
   1567		break;
   1568	default:
   1569		break;
   1570	}
   1571
   1572	fsm_event(priv->fsm, DEV_EVENT_RXUP, dev);
   1573done:
   1574	return;
   1575}
   1576
   1577/*
   1578 * ctcmpc channel FSM action
   1579 * called from several points in ctcmpc_ch_fsm
   1580 * ctcmpc only
   1581 */
   1582static void ctcmpc_chx_attn(fsm_instance *fsm, int event, void *arg)
   1583{
   1584	struct channel	  *ch     = arg;
   1585	struct net_device *dev    = ch->netdev;
   1586	struct ctcm_priv  *priv   = dev->ml_priv;
   1587	struct mpc_group  *grp = priv->mpcg;
   1588
   1589	CTCM_PR_DEBUG("%s(%s): %s(ch=0x%p), cp=%i, ChStat:%s, GrpStat:%s\n",
   1590		__func__, dev->name, ch->id, ch, smp_processor_id(),
   1591			fsm_getstate_str(ch->fsm), fsm_getstate_str(grp->fsm));
   1592
   1593	switch (fsm_getstate(grp->fsm)) {
   1594	case MPCG_STATE_XID2INITW:
   1595		/* ok..start yside xid exchanges */
   1596		if (!ch->in_mpcgroup)
   1597			break;
   1598		if (fsm_getstate(ch->fsm) ==  CH_XID0_PENDING) {
   1599			fsm_deltimer(&grp->timer);
   1600			fsm_addtimer(&grp->timer,
   1601				MPC_XID_TIMEOUT_VALUE,
   1602				MPCG_EVENT_TIMER, dev);
   1603			fsm_event(grp->fsm, MPCG_EVENT_XID0DO, ch);
   1604
   1605		} else if (fsm_getstate(ch->fsm) < CH_XID7_PENDING1)
   1606			/* attn rcvd before xid0 processed via bh */
   1607			fsm_newstate(ch->fsm, CH_XID7_PENDING1);
   1608		break;
   1609	case MPCG_STATE_XID2INITX:
   1610	case MPCG_STATE_XID0IOWAIT:
   1611	case MPCG_STATE_XID0IOWAIX:
   1612		/* attn rcvd before xid0 processed on ch
   1613		but mid-xid0 processing for group    */
   1614		if (fsm_getstate(ch->fsm) < CH_XID7_PENDING1)
   1615			fsm_newstate(ch->fsm, CH_XID7_PENDING1);
   1616		break;
   1617	case MPCG_STATE_XID7INITW:
   1618	case MPCG_STATE_XID7INITX:
   1619	case MPCG_STATE_XID7INITI:
   1620	case MPCG_STATE_XID7INITZ:
   1621		switch (fsm_getstate(ch->fsm)) {
   1622		case CH_XID7_PENDING:
   1623			fsm_newstate(ch->fsm, CH_XID7_PENDING1);
   1624			break;
   1625		case CH_XID7_PENDING2:
   1626			fsm_newstate(ch->fsm, CH_XID7_PENDING3);
   1627			break;
   1628		}
   1629		fsm_event(grp->fsm, MPCG_EVENT_XID7DONE, dev);
   1630		break;
   1631	}
   1632
   1633	return;
   1634}
   1635
   1636/*
   1637 * ctcmpc channel FSM action
   1638 * called from one point in ctcmpc_ch_fsm
   1639 * ctcmpc only
   1640 */
   1641static void ctcmpc_chx_attnbusy(fsm_instance *fsm, int event, void *arg)
   1642{
   1643	struct channel	  *ch     = arg;
   1644	struct net_device *dev    = ch->netdev;
   1645	struct ctcm_priv  *priv   = dev->ml_priv;
   1646	struct mpc_group  *grp    = priv->mpcg;
   1647
   1648	CTCM_PR_DEBUG("%s(%s): %s\n  ChState:%s GrpState:%s\n",
   1649			__func__, dev->name, ch->id,
   1650			fsm_getstate_str(ch->fsm), fsm_getstate_str(grp->fsm));
   1651
   1652	fsm_deltimer(&ch->timer);
   1653
   1654	switch (fsm_getstate(grp->fsm)) {
   1655	case MPCG_STATE_XID0IOWAIT:
   1656		/* vtam wants to be primary.start yside xid exchanges*/
   1657		/* only receive one attn-busy at a time so must not  */
   1658		/* change state each time			     */
   1659		grp->changed_side = 1;
   1660		fsm_newstate(grp->fsm, MPCG_STATE_XID2INITW);
   1661		break;
   1662	case MPCG_STATE_XID2INITW:
   1663		if (grp->changed_side == 1) {
   1664			grp->changed_side = 2;
   1665			break;
   1666		}
   1667		/* process began via call to establish_conn	 */
   1668		/* so must report failure instead of reverting	 */
   1669		/* back to ready-for-xid passive state		 */
   1670		if (grp->estconnfunc)
   1671				goto done;
   1672		/* this attnbusy is NOT the result of xside xid  */
   1673		/* collisions so yside must have been triggered  */
   1674		/* by an ATTN that was not intended to start XID */
   1675		/* processing. Revert back to ready-for-xid and  */
   1676		/* wait for ATTN interrupt to signal xid start	 */
   1677		if (fsm_getstate(ch->fsm) == CH_XID0_INPROGRESS) {
   1678			fsm_newstate(ch->fsm, CH_XID0_PENDING) ;
   1679			fsm_deltimer(&grp->timer);
   1680				goto done;
   1681		}
   1682		fsm_event(grp->fsm, MPCG_EVENT_INOP, dev);
   1683				goto done;
   1684	case MPCG_STATE_XID2INITX:
   1685		/* XID2 was received before ATTN Busy for second
   1686		   channel.Send yside xid for second channel.
   1687		*/
   1688		if (grp->changed_side == 1) {
   1689			grp->changed_side = 2;
   1690			break;
   1691		}
   1692		fallthrough;
   1693	case MPCG_STATE_XID0IOWAIX:
   1694	case MPCG_STATE_XID7INITW:
   1695	case MPCG_STATE_XID7INITX:
   1696	case MPCG_STATE_XID7INITI:
   1697	case MPCG_STATE_XID7INITZ:
   1698	default:
   1699		/* multiple attn-busy indicates too out-of-sync      */
   1700		/* and they are certainly not being received as part */
   1701		/* of valid mpc group negotiations..		     */
   1702		fsm_event(grp->fsm, MPCG_EVENT_INOP, dev);
   1703				goto done;
   1704	}
   1705
   1706	if (grp->changed_side == 1) {
   1707		fsm_deltimer(&grp->timer);
   1708		fsm_addtimer(&grp->timer, MPC_XID_TIMEOUT_VALUE,
   1709			     MPCG_EVENT_TIMER, dev);
   1710	}
   1711	if (ch->in_mpcgroup)
   1712		fsm_event(grp->fsm, MPCG_EVENT_XID0DO, ch);
   1713	else
   1714		CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
   1715			"%s(%s): channel %s not added to group",
   1716				CTCM_FUNTAIL, dev->name, ch->id);
   1717
   1718done:
   1719	return;
   1720}
   1721
   1722/*
   1723 * ctcmpc channel FSM action
   1724 * called from several points in ctcmpc_ch_fsm
   1725 * ctcmpc only
   1726 */
   1727static void ctcmpc_chx_resend(fsm_instance *fsm, int event, void *arg)
   1728{
   1729	struct channel	   *ch	   = arg;
   1730	struct net_device  *dev    = ch->netdev;
   1731	struct ctcm_priv   *priv   = dev->ml_priv;
   1732	struct mpc_group   *grp    = priv->mpcg;
   1733
   1734	fsm_event(grp->fsm, MPCG_EVENT_XID0DO, ch);
   1735	return;
   1736}
   1737
   1738/*
   1739 * ctcmpc channel FSM action
   1740 * called from several points in ctcmpc_ch_fsm
   1741 * ctcmpc only
   1742 */
   1743static void ctcmpc_chx_send_sweep(fsm_instance *fsm, int event, void *arg)
   1744{
   1745	struct channel *ach = arg;
   1746	struct net_device *dev = ach->netdev;
   1747	struct ctcm_priv *priv = dev->ml_priv;
   1748	struct mpc_group *grp = priv->mpcg;
   1749	struct channel *wch = priv->channel[CTCM_WRITE];
   1750	struct channel *rch = priv->channel[CTCM_READ];
   1751	struct sk_buff *skb;
   1752	struct th_sweep *header;
   1753	int rc = 0;
   1754	unsigned long saveflags = 0;
   1755
   1756	CTCM_PR_DEBUG("ctcmpc enter: %s(): cp=%i ch=0x%p id=%s\n",
   1757			__func__, smp_processor_id(), ach, ach->id);
   1758
   1759	if (grp->in_sweep == 0)
   1760				goto done;
   1761
   1762	CTCM_PR_DBGDATA("%s: 1: ToVTAM_th_seq= %08x\n" ,
   1763				__func__, wch->th_seq_num);
   1764	CTCM_PR_DBGDATA("%s: 1: FromVTAM_th_seq= %08x\n" ,
   1765				__func__, rch->th_seq_num);
   1766
   1767	if (fsm_getstate(wch->fsm) != CTC_STATE_TXIDLE) {
   1768		/* give the previous IO time to complete */
   1769		fsm_addtimer(&wch->sweep_timer,
   1770			200, CTC_EVENT_RSWEEP_TIMER, wch);
   1771				goto done;
   1772	}
   1773
   1774	skb = skb_dequeue(&wch->sweep_queue);
   1775	if (!skb)
   1776				goto done;
   1777
   1778	if (set_normalized_cda(&wch->ccw[4], skb->data)) {
   1779		grp->in_sweep = 0;
   1780		ctcm_clear_busy_do(dev);
   1781		dev_kfree_skb_any(skb);
   1782		fsm_event(grp->fsm, MPCG_EVENT_INOP, dev);
   1783				goto done;
   1784	} else {
   1785		refcount_inc(&skb->users);
   1786		skb_queue_tail(&wch->io_queue, skb);
   1787	}
   1788
   1789	/* send out the sweep */
   1790	wch->ccw[4].count = skb->len;
   1791
   1792	header = (struct th_sweep *)skb->data;
   1793	switch (header->th.th_ch_flag) {
   1794	case TH_SWEEP_REQ:
   1795		grp->sweep_req_pend_num--;
   1796		break;
   1797	case TH_SWEEP_RESP:
   1798		grp->sweep_rsp_pend_num--;
   1799		break;
   1800	}
   1801
   1802	header->sw.th_last_seq = wch->th_seq_num;
   1803
   1804	CTCM_CCW_DUMP((char *)&wch->ccw[3], sizeof(struct ccw1) * 3);
   1805	CTCM_PR_DBGDATA("%s: sweep packet\n", __func__);
   1806	CTCM_D3_DUMP((char *)header, TH_SWEEP_LENGTH);
   1807
   1808	fsm_addtimer(&wch->timer, CTCM_TIME_5_SEC, CTC_EVENT_TIMER, wch);
   1809	fsm_newstate(wch->fsm, CTC_STATE_TX);
   1810
   1811	spin_lock_irqsave(get_ccwdev_lock(wch->cdev), saveflags);
   1812	wch->prof.send_stamp = jiffies;
   1813	rc = ccw_device_start(wch->cdev, &wch->ccw[3], 0, 0xff, 0);
   1814	spin_unlock_irqrestore(get_ccwdev_lock(wch->cdev), saveflags);
   1815
   1816	if ((grp->sweep_req_pend_num == 0) &&
   1817	   (grp->sweep_rsp_pend_num == 0)) {
   1818		grp->in_sweep = 0;
   1819		rch->th_seq_num = 0x00;
   1820		wch->th_seq_num = 0x00;
   1821		ctcm_clear_busy_do(dev);
   1822	}
   1823
   1824	CTCM_PR_DBGDATA("%s: To-/From-VTAM_th_seq = %08x/%08x\n" ,
   1825			__func__, wch->th_seq_num, rch->th_seq_num);
   1826
   1827	if (rc != 0)
   1828		ctcm_ccw_check_rc(wch, rc, "send sweep");
   1829
   1830done:
   1831	return;
   1832}
   1833
   1834
   1835/*
   1836 * The ctcmpc statemachine for a channel.
   1837 */
   1838
   1839const fsm_node ctcmpc_ch_fsm[] = {
   1840	{ CTC_STATE_STOPPED,	CTC_EVENT_STOP,		ctcm_action_nop  },
   1841	{ CTC_STATE_STOPPED,	CTC_EVENT_START,	ctcm_chx_start  },
   1842	{ CTC_STATE_STOPPED,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1843	{ CTC_STATE_STOPPED,	CTC_EVENT_FINSTAT,	ctcm_action_nop  },
   1844	{ CTC_STATE_STOPPED,	CTC_EVENT_MC_FAIL,	ctcm_action_nop  },
   1845
   1846	{ CTC_STATE_NOTOP,	CTC_EVENT_STOP,		ctcm_chx_stop  },
   1847	{ CTC_STATE_NOTOP,	CTC_EVENT_START,	ctcm_action_nop  },
   1848	{ CTC_STATE_NOTOP,	CTC_EVENT_FINSTAT,	ctcm_action_nop  },
   1849	{ CTC_STATE_NOTOP,	CTC_EVENT_MC_FAIL,	ctcm_action_nop  },
   1850	{ CTC_STATE_NOTOP,	CTC_EVENT_MC_GOOD,	ctcm_chx_start  },
   1851	{ CTC_STATE_NOTOP,	CTC_EVENT_UC_RCRESET,	ctcm_chx_stop  },
   1852	{ CTC_STATE_NOTOP,	CTC_EVENT_UC_RSRESET,	ctcm_chx_stop  },
   1853	{ CTC_STATE_NOTOP,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1854
   1855	{ CTC_STATE_STARTWAIT,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1856	{ CTC_STATE_STARTWAIT,	CTC_EVENT_START,	ctcm_action_nop  },
   1857	{ CTC_STATE_STARTWAIT,	CTC_EVENT_FINSTAT,	ctcm_chx_setmode  },
   1858	{ CTC_STATE_STARTWAIT,	CTC_EVENT_TIMER,	ctcm_chx_setuperr  },
   1859	{ CTC_STATE_STARTWAIT,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1860	{ CTC_STATE_STARTWAIT,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1861
   1862	{ CTC_STATE_STARTRETRY,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1863	{ CTC_STATE_STARTRETRY,	CTC_EVENT_TIMER,	ctcm_chx_setmode  },
   1864	{ CTC_STATE_STARTRETRY,	CTC_EVENT_FINSTAT,	ctcm_chx_setmode  },
   1865	{ CTC_STATE_STARTRETRY,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1866	{ CTC_STATE_STARTRETRY,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1867
   1868	{ CTC_STATE_SETUPWAIT,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1869	{ CTC_STATE_SETUPWAIT,	CTC_EVENT_START,	ctcm_action_nop  },
   1870	{ CTC_STATE_SETUPWAIT,	CTC_EVENT_FINSTAT,	ctcmpc_chx_firstio  },
   1871	{ CTC_STATE_SETUPWAIT,	CTC_EVENT_UC_RCRESET,	ctcm_chx_setuperr  },
   1872	{ CTC_STATE_SETUPWAIT,	CTC_EVENT_UC_RSRESET,	ctcm_chx_setuperr  },
   1873	{ CTC_STATE_SETUPWAIT,	CTC_EVENT_TIMER,	ctcm_chx_setmode  },
   1874	{ CTC_STATE_SETUPWAIT,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1875	{ CTC_STATE_SETUPWAIT,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1876
   1877	{ CTC_STATE_RXINIT,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1878	{ CTC_STATE_RXINIT,	CTC_EVENT_START,	ctcm_action_nop  },
   1879	{ CTC_STATE_RXINIT,	CTC_EVENT_FINSTAT,	ctcmpc_chx_rxidle  },
   1880	{ CTC_STATE_RXINIT,	CTC_EVENT_UC_RCRESET,	ctcm_chx_rxiniterr  },
   1881	{ CTC_STATE_RXINIT,	CTC_EVENT_UC_RSRESET,	ctcm_chx_rxiniterr  },
   1882	{ CTC_STATE_RXINIT,	CTC_EVENT_TIMER,	ctcm_chx_rxiniterr  },
   1883	{ CTC_STATE_RXINIT,	CTC_EVENT_ATTNBUSY,	ctcm_chx_rxinitfail  },
   1884	{ CTC_STATE_RXINIT,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1885	{ CTC_STATE_RXINIT,	CTC_EVENT_UC_ZERO,	ctcmpc_chx_firstio  },
   1886	{ CTC_STATE_RXINIT,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1887
   1888	{ CH_XID0_PENDING,	CTC_EVENT_FINSTAT,	ctcm_action_nop  },
   1889	{ CH_XID0_PENDING,	CTC_EVENT_ATTN,		ctcmpc_chx_attn  },
   1890	{ CH_XID0_PENDING,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1891	{ CH_XID0_PENDING,	CTC_EVENT_START,	ctcm_action_nop  },
   1892	{ CH_XID0_PENDING,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1893	{ CH_XID0_PENDING,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1894	{ CH_XID0_PENDING,	CTC_EVENT_UC_RCRESET,	ctcm_chx_setuperr  },
   1895	{ CH_XID0_PENDING,	CTC_EVENT_UC_RSRESET,	ctcm_chx_setuperr  },
   1896	{ CH_XID0_PENDING,	CTC_EVENT_UC_RSRESET,	ctcm_chx_setuperr  },
   1897	{ CH_XID0_PENDING,	CTC_EVENT_ATTNBUSY,	ctcm_chx_iofatal  },
   1898
   1899	{ CH_XID0_INPROGRESS,	CTC_EVENT_FINSTAT,	ctcmpc_chx_rx  },
   1900	{ CH_XID0_INPROGRESS,	CTC_EVENT_ATTN,		ctcmpc_chx_attn  },
   1901	{ CH_XID0_INPROGRESS,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1902	{ CH_XID0_INPROGRESS,	CTC_EVENT_START,	ctcm_action_nop  },
   1903	{ CH_XID0_INPROGRESS,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1904	{ CH_XID0_INPROGRESS,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1905	{ CH_XID0_INPROGRESS,	CTC_EVENT_UC_ZERO,	ctcmpc_chx_rx  },
   1906	{ CH_XID0_INPROGRESS,	CTC_EVENT_UC_RCRESET,	ctcm_chx_setuperr },
   1907	{ CH_XID0_INPROGRESS,	CTC_EVENT_ATTNBUSY,	ctcmpc_chx_attnbusy  },
   1908	{ CH_XID0_INPROGRESS,	CTC_EVENT_TIMER,	ctcmpc_chx_resend  },
   1909	{ CH_XID0_INPROGRESS,	CTC_EVENT_IO_EBUSY,	ctcm_chx_fail  },
   1910
   1911	{ CH_XID7_PENDING,	CTC_EVENT_FINSTAT,	ctcmpc_chx_rx  },
   1912	{ CH_XID7_PENDING,	CTC_EVENT_ATTN,		ctcmpc_chx_attn  },
   1913	{ CH_XID7_PENDING,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1914	{ CH_XID7_PENDING,	CTC_EVENT_START,	ctcm_action_nop  },
   1915	{ CH_XID7_PENDING,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1916	{ CH_XID7_PENDING,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1917	{ CH_XID7_PENDING,	CTC_EVENT_UC_ZERO,	ctcmpc_chx_rx  },
   1918	{ CH_XID7_PENDING,	CTC_EVENT_UC_RCRESET,	ctcm_chx_setuperr  },
   1919	{ CH_XID7_PENDING,	CTC_EVENT_UC_RSRESET,	ctcm_chx_setuperr  },
   1920	{ CH_XID7_PENDING,	CTC_EVENT_UC_RSRESET,	ctcm_chx_setuperr  },
   1921	{ CH_XID7_PENDING,	CTC_EVENT_ATTNBUSY,	ctcm_chx_iofatal  },
   1922	{ CH_XID7_PENDING,	CTC_EVENT_TIMER,	ctcmpc_chx_resend  },
   1923	{ CH_XID7_PENDING,	CTC_EVENT_IO_EBUSY,	ctcm_chx_fail  },
   1924
   1925	{ CH_XID7_PENDING1,	CTC_EVENT_FINSTAT,	ctcmpc_chx_rx  },
   1926	{ CH_XID7_PENDING1,	CTC_EVENT_ATTN,		ctcmpc_chx_attn  },
   1927	{ CH_XID7_PENDING1,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1928	{ CH_XID7_PENDING1,	CTC_EVENT_START,	ctcm_action_nop  },
   1929	{ CH_XID7_PENDING1,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1930	{ CH_XID7_PENDING1,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1931	{ CH_XID7_PENDING1,	CTC_EVENT_UC_ZERO,	ctcmpc_chx_rx  },
   1932	{ CH_XID7_PENDING1,	CTC_EVENT_UC_RCRESET,	ctcm_chx_setuperr  },
   1933	{ CH_XID7_PENDING1,	CTC_EVENT_UC_RSRESET,	ctcm_chx_setuperr  },
   1934	{ CH_XID7_PENDING1,	CTC_EVENT_ATTNBUSY,	ctcm_chx_iofatal  },
   1935	{ CH_XID7_PENDING1,	CTC_EVENT_TIMER,	ctcmpc_chx_resend  },
   1936	{ CH_XID7_PENDING1,	CTC_EVENT_IO_EBUSY,	ctcm_chx_fail  },
   1937
   1938	{ CH_XID7_PENDING2,	CTC_EVENT_FINSTAT,	ctcmpc_chx_rx  },
   1939	{ CH_XID7_PENDING2,	CTC_EVENT_ATTN,		ctcmpc_chx_attn  },
   1940	{ CH_XID7_PENDING2,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1941	{ CH_XID7_PENDING2,	CTC_EVENT_START,	ctcm_action_nop  },
   1942	{ CH_XID7_PENDING2,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1943	{ CH_XID7_PENDING2,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1944	{ CH_XID7_PENDING2,	CTC_EVENT_UC_ZERO,	ctcmpc_chx_rx  },
   1945	{ CH_XID7_PENDING2,	CTC_EVENT_UC_RCRESET,	ctcm_chx_setuperr  },
   1946	{ CH_XID7_PENDING2,	CTC_EVENT_UC_RSRESET,	ctcm_chx_setuperr  },
   1947	{ CH_XID7_PENDING2,	CTC_EVENT_ATTNBUSY,	ctcm_chx_iofatal  },
   1948	{ CH_XID7_PENDING2,	CTC_EVENT_TIMER,	ctcmpc_chx_resend  },
   1949	{ CH_XID7_PENDING2,	CTC_EVENT_IO_EBUSY,	ctcm_chx_fail  },
   1950
   1951	{ CH_XID7_PENDING3,	CTC_EVENT_FINSTAT,	ctcmpc_chx_rx  },
   1952	{ CH_XID7_PENDING3,	CTC_EVENT_ATTN,		ctcmpc_chx_attn  },
   1953	{ CH_XID7_PENDING3,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1954	{ CH_XID7_PENDING3,	CTC_EVENT_START,	ctcm_action_nop  },
   1955	{ CH_XID7_PENDING3,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1956	{ CH_XID7_PENDING3,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1957	{ CH_XID7_PENDING3,	CTC_EVENT_UC_ZERO,	ctcmpc_chx_rx  },
   1958	{ CH_XID7_PENDING3,	CTC_EVENT_UC_RCRESET,	ctcm_chx_setuperr  },
   1959	{ CH_XID7_PENDING3,	CTC_EVENT_UC_RSRESET,	ctcm_chx_setuperr  },
   1960	{ CH_XID7_PENDING3,	CTC_EVENT_ATTNBUSY,	ctcm_chx_iofatal  },
   1961	{ CH_XID7_PENDING3,	CTC_EVENT_TIMER,	ctcmpc_chx_resend  },
   1962	{ CH_XID7_PENDING3,	CTC_EVENT_IO_EBUSY,	ctcm_chx_fail  },
   1963
   1964	{ CH_XID7_PENDING4,	CTC_EVENT_FINSTAT,	ctcmpc_chx_rx  },
   1965	{ CH_XID7_PENDING4,	CTC_EVENT_ATTN,		ctcmpc_chx_attn  },
   1966	{ CH_XID7_PENDING4,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1967	{ CH_XID7_PENDING4,	CTC_EVENT_START,	ctcm_action_nop  },
   1968	{ CH_XID7_PENDING4,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1969	{ CH_XID7_PENDING4,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1970	{ CH_XID7_PENDING4,	CTC_EVENT_UC_ZERO,	ctcmpc_chx_rx  },
   1971	{ CH_XID7_PENDING4,	CTC_EVENT_UC_RCRESET,	ctcm_chx_setuperr  },
   1972	{ CH_XID7_PENDING4,	CTC_EVENT_UC_RSRESET,	ctcm_chx_setuperr  },
   1973	{ CH_XID7_PENDING4,	CTC_EVENT_ATTNBUSY,	ctcm_chx_iofatal  },
   1974	{ CH_XID7_PENDING4,	CTC_EVENT_TIMER,	ctcmpc_chx_resend  },
   1975	{ CH_XID7_PENDING4,	CTC_EVENT_IO_EBUSY,	ctcm_chx_fail  },
   1976
   1977	{ CTC_STATE_RXIDLE,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1978	{ CTC_STATE_RXIDLE,	CTC_EVENT_START,	ctcm_action_nop  },
   1979	{ CTC_STATE_RXIDLE,	CTC_EVENT_FINSTAT,	ctcmpc_chx_rx  },
   1980	{ CTC_STATE_RXIDLE,	CTC_EVENT_UC_RCRESET,	ctcm_chx_rxdisc  },
   1981	{ CTC_STATE_RXIDLE,	CTC_EVENT_UC_RSRESET,	ctcm_chx_fail  },
   1982	{ CTC_STATE_RXIDLE,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1983	{ CTC_STATE_RXIDLE,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1984	{ CTC_STATE_RXIDLE,	CTC_EVENT_UC_ZERO,	ctcmpc_chx_rx  },
   1985
   1986	{ CTC_STATE_TXINIT,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1987	{ CTC_STATE_TXINIT,	CTC_EVENT_START,	ctcm_action_nop  },
   1988	{ CTC_STATE_TXINIT,	CTC_EVENT_FINSTAT,	ctcm_chx_txidle  },
   1989	{ CTC_STATE_TXINIT,	CTC_EVENT_UC_RCRESET,	ctcm_chx_txiniterr  },
   1990	{ CTC_STATE_TXINIT,	CTC_EVENT_UC_RSRESET,	ctcm_chx_txiniterr  },
   1991	{ CTC_STATE_TXINIT,	CTC_EVENT_TIMER,	ctcm_chx_txiniterr  },
   1992	{ CTC_STATE_TXINIT,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   1993	{ CTC_STATE_TXINIT,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   1994	{ CTC_STATE_TXINIT,	CTC_EVENT_RSWEEP_TIMER,	ctcmpc_chx_send_sweep },
   1995
   1996	{ CTC_STATE_TXIDLE,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   1997	{ CTC_STATE_TXIDLE,	CTC_EVENT_START,	ctcm_action_nop  },
   1998	{ CTC_STATE_TXIDLE,	CTC_EVENT_FINSTAT,	ctcmpc_chx_firstio  },
   1999	{ CTC_STATE_TXIDLE,	CTC_EVENT_UC_RCRESET,	ctcm_chx_fail  },
   2000	{ CTC_STATE_TXIDLE,	CTC_EVENT_UC_RSRESET,	ctcm_chx_fail  },
   2001	{ CTC_STATE_TXIDLE,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   2002	{ CTC_STATE_TXIDLE,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   2003	{ CTC_STATE_TXIDLE,	CTC_EVENT_RSWEEP_TIMER,	ctcmpc_chx_send_sweep },
   2004
   2005	{ CTC_STATE_TERM,	CTC_EVENT_STOP,		ctcm_action_nop  },
   2006	{ CTC_STATE_TERM,	CTC_EVENT_START,	ctcm_chx_restart  },
   2007	{ CTC_STATE_TERM,	CTC_EVENT_FINSTAT,	ctcm_chx_stopped  },
   2008	{ CTC_STATE_TERM,	CTC_EVENT_UC_RCRESET,	ctcm_action_nop  },
   2009	{ CTC_STATE_TERM,	CTC_EVENT_UC_RSRESET,	ctcm_action_nop  },
   2010	{ CTC_STATE_TERM,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   2011	{ CTC_STATE_TERM,	CTC_EVENT_IO_EBUSY,	ctcm_chx_fail  },
   2012	{ CTC_STATE_TERM,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   2013
   2014	{ CTC_STATE_DTERM,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   2015	{ CTC_STATE_DTERM,	CTC_EVENT_START,	ctcm_chx_restart  },
   2016	{ CTC_STATE_DTERM,	CTC_EVENT_FINSTAT,	ctcm_chx_setmode  },
   2017	{ CTC_STATE_DTERM,	CTC_EVENT_UC_RCRESET,	ctcm_action_nop  },
   2018	{ CTC_STATE_DTERM,	CTC_EVENT_UC_RSRESET,	ctcm_action_nop  },
   2019	{ CTC_STATE_DTERM,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   2020	{ CTC_STATE_DTERM,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   2021
   2022	{ CTC_STATE_TX,		CTC_EVENT_STOP,		ctcm_chx_haltio  },
   2023	{ CTC_STATE_TX,		CTC_EVENT_START,	ctcm_action_nop  },
   2024	{ CTC_STATE_TX,		CTC_EVENT_FINSTAT,	ctcmpc_chx_txdone  },
   2025	{ CTC_STATE_TX,		CTC_EVENT_UC_RCRESET,	ctcm_chx_fail  },
   2026	{ CTC_STATE_TX,		CTC_EVENT_UC_RSRESET,	ctcm_chx_fail  },
   2027	{ CTC_STATE_TX,		CTC_EVENT_TIMER,	ctcm_chx_txretry  },
   2028	{ CTC_STATE_TX,		CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   2029	{ CTC_STATE_TX,		CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   2030	{ CTC_STATE_TX,		CTC_EVENT_RSWEEP_TIMER,	ctcmpc_chx_send_sweep },
   2031	{ CTC_STATE_TX,		CTC_EVENT_IO_EBUSY,	ctcm_chx_fail  },
   2032
   2033	{ CTC_STATE_RXERR,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   2034	{ CTC_STATE_TXERR,	CTC_EVENT_STOP,		ctcm_chx_haltio  },
   2035	{ CTC_STATE_TXERR,	CTC_EVENT_IO_ENODEV,	ctcm_chx_iofatal  },
   2036	{ CTC_STATE_TXERR,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   2037	{ CTC_STATE_RXERR,	CTC_EVENT_MC_FAIL,	ctcm_chx_fail  },
   2038};
   2039
   2040int mpc_ch_fsm_len = ARRAY_SIZE(ctcmpc_ch_fsm);
   2041
   2042/*
   2043 * Actions for interface - statemachine.
   2044 */
   2045
   2046/*
   2047 * Startup channels by sending CTC_EVENT_START to each channel.
   2048 *
   2049 * fi		An instance of an interface statemachine.
   2050 * event	The event, just happened.
   2051 * arg		Generic pointer, casted from struct net_device * upon call.
   2052 */
   2053static void dev_action_start(fsm_instance *fi, int event, void *arg)
   2054{
   2055	struct net_device *dev = arg;
   2056	struct ctcm_priv *priv = dev->ml_priv;
   2057	int direction;
   2058
   2059	CTCMY_DBF_DEV_NAME(SETUP, dev, "");
   2060
   2061	fsm_deltimer(&priv->restart_timer);
   2062	fsm_newstate(fi, DEV_STATE_STARTWAIT_RXTX);
   2063	if (IS_MPC(priv))
   2064		priv->mpcg->channels_terminating = 0;
   2065	for (direction = CTCM_READ; direction <= CTCM_WRITE; direction++) {
   2066		struct channel *ch = priv->channel[direction];
   2067		fsm_event(ch->fsm, CTC_EVENT_START, ch);
   2068	}
   2069}
   2070
   2071/*
   2072 * Shutdown channels by sending CTC_EVENT_STOP to each channel.
   2073 *
   2074 * fi		An instance of an interface statemachine.
   2075 * event	The event, just happened.
   2076 * arg		Generic pointer, casted from struct net_device * upon call.
   2077 */
   2078static void dev_action_stop(fsm_instance *fi, int event, void *arg)
   2079{
   2080	int direction;
   2081	struct net_device *dev = arg;
   2082	struct ctcm_priv *priv = dev->ml_priv;
   2083
   2084	CTCMY_DBF_DEV_NAME(SETUP, dev, "");
   2085
   2086	fsm_newstate(fi, DEV_STATE_STOPWAIT_RXTX);
   2087	for (direction = CTCM_READ; direction <= CTCM_WRITE; direction++) {
   2088		struct channel *ch = priv->channel[direction];
   2089		fsm_event(ch->fsm, CTC_EVENT_STOP, ch);
   2090		ch->th_seq_num = 0x00;
   2091		CTCM_PR_DEBUG("%s: CH_th_seq= %08x\n",
   2092				__func__, ch->th_seq_num);
   2093	}
   2094	if (IS_MPC(priv))
   2095		fsm_newstate(priv->mpcg->fsm, MPCG_STATE_RESET);
   2096}
   2097
   2098static void dev_action_restart(fsm_instance *fi, int event, void *arg)
   2099{
   2100	int restart_timer;
   2101	struct net_device *dev = arg;
   2102	struct ctcm_priv *priv = dev->ml_priv;
   2103
   2104	CTCMY_DBF_DEV_NAME(TRACE, dev, "");
   2105
   2106	if (IS_MPC(priv)) {
   2107		restart_timer = CTCM_TIME_1_SEC;
   2108	} else {
   2109		restart_timer = CTCM_TIME_5_SEC;
   2110	}
   2111	dev_info(&dev->dev, "Restarting device\n");
   2112
   2113	dev_action_stop(fi, event, arg);
   2114	fsm_event(priv->fsm, DEV_EVENT_STOP, dev);
   2115	if (IS_MPC(priv))
   2116		fsm_newstate(priv->mpcg->fsm, MPCG_STATE_RESET);
   2117
   2118	/* going back into start sequence too quickly can	  */
   2119	/* result in the other side becoming unreachable   due	  */
   2120	/* to sense reported when IO is aborted			  */
   2121	fsm_addtimer(&priv->restart_timer, restart_timer,
   2122			DEV_EVENT_START, dev);
   2123}
   2124
   2125/*
   2126 * Called from channel statemachine
   2127 * when a channel is up and running.
   2128 *
   2129 * fi		An instance of an interface statemachine.
   2130 * event	The event, just happened.
   2131 * arg		Generic pointer, casted from struct net_device * upon call.
   2132 */
   2133static void dev_action_chup(fsm_instance *fi, int event, void *arg)
   2134{
   2135	struct net_device *dev = arg;
   2136	struct ctcm_priv *priv = dev->ml_priv;
   2137	int dev_stat = fsm_getstate(fi);
   2138
   2139	CTCM_DBF_TEXT_(SETUP, CTC_DBF_NOTICE,
   2140			"%s(%s): priv = %p [%d,%d]\n ",	CTCM_FUNTAIL,
   2141				dev->name, dev->ml_priv, dev_stat, event);
   2142
   2143	switch (fsm_getstate(fi)) {
   2144	case DEV_STATE_STARTWAIT_RXTX:
   2145		if (event == DEV_EVENT_RXUP)
   2146			fsm_newstate(fi, DEV_STATE_STARTWAIT_TX);
   2147		else
   2148			fsm_newstate(fi, DEV_STATE_STARTWAIT_RX);
   2149		break;
   2150	case DEV_STATE_STARTWAIT_RX:
   2151		if (event == DEV_EVENT_RXUP) {
   2152			fsm_newstate(fi, DEV_STATE_RUNNING);
   2153			dev_info(&dev->dev,
   2154				"Connected with remote side\n");
   2155			ctcm_clear_busy(dev);
   2156		}
   2157		break;
   2158	case DEV_STATE_STARTWAIT_TX:
   2159		if (event == DEV_EVENT_TXUP) {
   2160			fsm_newstate(fi, DEV_STATE_RUNNING);
   2161			dev_info(&dev->dev,
   2162				"Connected with remote side\n");
   2163			ctcm_clear_busy(dev);
   2164		}
   2165		break;
   2166	case DEV_STATE_STOPWAIT_TX:
   2167		if (event == DEV_EVENT_RXUP)
   2168			fsm_newstate(fi, DEV_STATE_STOPWAIT_RXTX);
   2169		break;
   2170	case DEV_STATE_STOPWAIT_RX:
   2171		if (event == DEV_EVENT_TXUP)
   2172			fsm_newstate(fi, DEV_STATE_STOPWAIT_RXTX);
   2173		break;
   2174	}
   2175
   2176	if (IS_MPC(priv)) {
   2177		if (event == DEV_EVENT_RXUP)
   2178			mpc_channel_action(priv->channel[CTCM_READ],
   2179				CTCM_READ, MPC_CHANNEL_ADD);
   2180		else
   2181			mpc_channel_action(priv->channel[CTCM_WRITE],
   2182				CTCM_WRITE, MPC_CHANNEL_ADD);
   2183	}
   2184}
   2185
   2186/*
   2187 * Called from device statemachine
   2188 * when a channel has been shutdown.
   2189 *
   2190 * fi		An instance of an interface statemachine.
   2191 * event	The event, just happened.
   2192 * arg		Generic pointer, casted from struct net_device * upon call.
   2193 */
   2194static void dev_action_chdown(fsm_instance *fi, int event, void *arg)
   2195{
   2196
   2197	struct net_device *dev = arg;
   2198	struct ctcm_priv *priv = dev->ml_priv;
   2199
   2200	CTCMY_DBF_DEV_NAME(SETUP, dev, "");
   2201
   2202	switch (fsm_getstate(fi)) {
   2203	case DEV_STATE_RUNNING:
   2204		if (event == DEV_EVENT_TXDOWN)
   2205			fsm_newstate(fi, DEV_STATE_STARTWAIT_TX);
   2206		else
   2207			fsm_newstate(fi, DEV_STATE_STARTWAIT_RX);
   2208		break;
   2209	case DEV_STATE_STARTWAIT_RX:
   2210		if (event == DEV_EVENT_TXDOWN)
   2211			fsm_newstate(fi, DEV_STATE_STARTWAIT_RXTX);
   2212		break;
   2213	case DEV_STATE_STARTWAIT_TX:
   2214		if (event == DEV_EVENT_RXDOWN)
   2215			fsm_newstate(fi, DEV_STATE_STARTWAIT_RXTX);
   2216		break;
   2217	case DEV_STATE_STOPWAIT_RXTX:
   2218		if (event == DEV_EVENT_TXDOWN)
   2219			fsm_newstate(fi, DEV_STATE_STOPWAIT_RX);
   2220		else
   2221			fsm_newstate(fi, DEV_STATE_STOPWAIT_TX);
   2222		break;
   2223	case DEV_STATE_STOPWAIT_RX:
   2224		if (event == DEV_EVENT_RXDOWN)
   2225			fsm_newstate(fi, DEV_STATE_STOPPED);
   2226		break;
   2227	case DEV_STATE_STOPWAIT_TX:
   2228		if (event == DEV_EVENT_TXDOWN)
   2229			fsm_newstate(fi, DEV_STATE_STOPPED);
   2230		break;
   2231	}
   2232	if (IS_MPC(priv)) {
   2233		if (event == DEV_EVENT_RXDOWN)
   2234			mpc_channel_action(priv->channel[CTCM_READ],
   2235				CTCM_READ, MPC_CHANNEL_REMOVE);
   2236		else
   2237			mpc_channel_action(priv->channel[CTCM_WRITE],
   2238				CTCM_WRITE, MPC_CHANNEL_REMOVE);
   2239	}
   2240}
   2241
   2242const fsm_node dev_fsm[] = {
   2243	{ DEV_STATE_STOPPED,        DEV_EVENT_START,   dev_action_start   },
   2244	{ DEV_STATE_STOPWAIT_RXTX,  DEV_EVENT_START,   dev_action_start   },
   2245	{ DEV_STATE_STOPWAIT_RXTX,  DEV_EVENT_RXDOWN,  dev_action_chdown  },
   2246	{ DEV_STATE_STOPWAIT_RXTX,  DEV_EVENT_TXDOWN,  dev_action_chdown  },
   2247	{ DEV_STATE_STOPWAIT_RXTX,  DEV_EVENT_RESTART, dev_action_restart },
   2248	{ DEV_STATE_STOPWAIT_RX,    DEV_EVENT_START,   dev_action_start   },
   2249	{ DEV_STATE_STOPWAIT_RX,    DEV_EVENT_RXUP,    dev_action_chup    },
   2250	{ DEV_STATE_STOPWAIT_RX,    DEV_EVENT_TXUP,    dev_action_chup    },
   2251	{ DEV_STATE_STOPWAIT_RX,    DEV_EVENT_RXDOWN,  dev_action_chdown  },
   2252	{ DEV_STATE_STOPWAIT_RX,    DEV_EVENT_RESTART, dev_action_restart },
   2253	{ DEV_STATE_STOPWAIT_TX,    DEV_EVENT_START,   dev_action_start   },
   2254	{ DEV_STATE_STOPWAIT_TX,    DEV_EVENT_RXUP,    dev_action_chup    },
   2255	{ DEV_STATE_STOPWAIT_TX,    DEV_EVENT_TXUP,    dev_action_chup    },
   2256	{ DEV_STATE_STOPWAIT_TX,    DEV_EVENT_TXDOWN,  dev_action_chdown  },
   2257	{ DEV_STATE_STOPWAIT_TX,    DEV_EVENT_RESTART, dev_action_restart },
   2258	{ DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_STOP,    dev_action_stop    },
   2259	{ DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_RXUP,    dev_action_chup    },
   2260	{ DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_TXUP,    dev_action_chup    },
   2261	{ DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_RXDOWN,  dev_action_chdown  },
   2262	{ DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_TXDOWN,  dev_action_chdown  },
   2263	{ DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_RESTART, dev_action_restart },
   2264	{ DEV_STATE_STARTWAIT_TX,   DEV_EVENT_STOP,    dev_action_stop    },
   2265	{ DEV_STATE_STARTWAIT_TX,   DEV_EVENT_RXUP,    dev_action_chup    },
   2266	{ DEV_STATE_STARTWAIT_TX,   DEV_EVENT_TXUP,    dev_action_chup    },
   2267	{ DEV_STATE_STARTWAIT_TX,   DEV_EVENT_RXDOWN,  dev_action_chdown  },
   2268	{ DEV_STATE_STARTWAIT_TX,   DEV_EVENT_RESTART, dev_action_restart },
   2269	{ DEV_STATE_STARTWAIT_RX,   DEV_EVENT_STOP,    dev_action_stop    },
   2270	{ DEV_STATE_STARTWAIT_RX,   DEV_EVENT_RXUP,    dev_action_chup    },
   2271	{ DEV_STATE_STARTWAIT_RX,   DEV_EVENT_TXUP,    dev_action_chup    },
   2272	{ DEV_STATE_STARTWAIT_RX,   DEV_EVENT_TXDOWN,  dev_action_chdown  },
   2273	{ DEV_STATE_STARTWAIT_RX,   DEV_EVENT_RESTART, dev_action_restart },
   2274	{ DEV_STATE_RUNNING,        DEV_EVENT_STOP,    dev_action_stop    },
   2275	{ DEV_STATE_RUNNING,        DEV_EVENT_RXDOWN,  dev_action_chdown  },
   2276	{ DEV_STATE_RUNNING,        DEV_EVENT_TXDOWN,  dev_action_chdown  },
   2277	{ DEV_STATE_RUNNING,        DEV_EVENT_TXUP,    ctcm_action_nop    },
   2278	{ DEV_STATE_RUNNING,        DEV_EVENT_RXUP,    ctcm_action_nop    },
   2279	{ DEV_STATE_RUNNING,        DEV_EVENT_RESTART, dev_action_restart },
   2280};
   2281
   2282int dev_fsm_len = ARRAY_SIZE(dev_fsm);
   2283
   2284/* --- This is the END my friend --- */
   2285