2 * drivers/s390/net/ctcm_mpc.c
4 * Copyright IBM Corp. 2004, 2007
5 * Authors: Belinda Thompson (belindat@us.ibm.com)
6 * Andy Richter (richtera@us.ibm.com)
7 * Peter Tiedemann (ptiedem@de.ibm.com)
11 This module exports functions to be used by CCS:
12 EXPORT_SYMBOL(ctc_mpc_alloc_channel);
13 EXPORT_SYMBOL(ctc_mpc_establish_connectivity);
14 EXPORT_SYMBOL(ctc_mpc_dealloc_ch);
15 EXPORT_SYMBOL(ctc_mpc_flow_control);
22 #include <linux/version.h>
23 #include <linux/module.h>
24 #include <linux/init.h>
25 #include <linux/kernel.h>
26 #include <linux/slab.h>
27 #include <linux/errno.h>
28 #include <linux/types.h>
29 #include <linux/interrupt.h>
30 #include <linux/timer.h>
31 #include <linux/sched.h>
33 #include <linux/signal.h>
34 #include <linux/string.h>
35 #include <linux/proc_fs.h>
38 #include <linux/if_arp.h>
39 #include <linux/tcp.h>
40 #include <linux/skbuff.h>
41 #include <linux/ctype.h>
42 #include <linux/netdevice.h>
45 #include <linux/io.h> /* instead of <asm/io.h> ok ? */
46 #include <asm/ccwdev.h>
47 #include <asm/ccwgroup.h>
48 #include <linux/bitops.h> /* instead of <asm/bitops.h> ok ? */
49 #include <linux/uaccess.h> /* instead of <asm/uaccess.h> ok ? */
50 #include <linux/wait.h>
51 #include <linux/moduleparam.h>
52 #include <asm/idals.h>
56 #include "ctcm_main.h"
57 #include "ctcm_fsms.h"
59 static const struct xid2 init_xid
= {
60 .xid2_type_id
= XID_FM2
,
72 .xid2_option
= XID2_0
,
75 .xid2_dlc_type
= XID2_READ_SIDE
,
79 .xid2_buf_len
= (MPC_BUFSIZE_DEFAULT
- 35),
82 static const struct th_header thnorm
= {
84 .th_ch_flag
= TH_IS_XID
,
85 .th_blk_flag
= TH_DATA_IS_XID
,
87 .th_seq_num
= 0x00000000,
90 static const struct th_header thdummy
= {
93 .th_blk_flag
= TH_DATA_IS_XID
,
95 .th_seq_num
= 0x00000000,
99 * Definition of one MPC group
103 * Compatibility macros for busy handling
104 * of network devices.
107 static void ctcmpc_unpack_skb(struct channel
*ch
, struct sk_buff
*pskb
);
110 * MPC Group state machine actions (static prototypes)
112 static void mpc_action_nop(fsm_instance
*fsm
, int event
, void *arg
);
113 static void mpc_action_go_ready(fsm_instance
*fsm
, int event
, void *arg
);
114 static void mpc_action_go_inop(fsm_instance
*fi
, int event
, void *arg
);
115 static void mpc_action_timeout(fsm_instance
*fi
, int event
, void *arg
);
116 static int mpc_validate_xid(struct mpcg_info
*mpcginfo
);
117 static void mpc_action_yside_xid(fsm_instance
*fsm
, int event
, void *arg
);
118 static void mpc_action_doxid0(fsm_instance
*fsm
, int event
, void *arg
);
119 static void mpc_action_doxid7(fsm_instance
*fsm
, int event
, void *arg
);
120 static void mpc_action_xside_xid(fsm_instance
*fsm
, int event
, void *arg
);
121 static void mpc_action_rcvd_xid0(fsm_instance
*fsm
, int event
, void *arg
);
122 static void mpc_action_rcvd_xid7(fsm_instance
*fsm
, int event
, void *arg
);
125 /*-------------------------------------------------------------------*
126 * Dump buffer format *
128 *--------------------------------------------------------------------*/
129 void ctcmpc_dumpit(char *buf
, int len
)
131 __u32 ct
, sw
, rm
, dup
;
133 char tbuf
[82], tdup
[82];
134 #if (UTS_MACHINE == s390x)
140 char bhex
[82], duphex
[82];
149 for (ct
= 0; ct
< len
; ct
++, ptr
++, rptr
++) {
151 #if (UTS_MACHINE == s390x)
152 sprintf(addr
, "%16.16lx", (unsigned long)rptr
);
154 sprintf(addr
, "%8.8X", (__u32
)rptr
);
157 sprintf(boff
, "%4.4X", (__u32
)ct
);
161 if ((sw
== 4) || (sw
== 12))
166 #if (UTS_MACHINE == s390x)
167 sprintf(tbuf
, "%2.2lX", (unsigned long)*ptr
);
169 sprintf(tbuf
, "%2.2X", (__u32
)*ptr
);
174 if ((0 != isprint(*ptr
)) && (*ptr
>= 0x20))
183 if ((strcmp(duphex
, bhex
)) != 0) {
185 sprintf(tdup
, "Duplicate as above "
188 " --- %s ---\n", tdup
);
190 printk(KERN_INFO
" %s (+%s) : %s [%s]\n",
191 addr
, boff
, bhex
, basc
);
193 strcpy(duphex
, bhex
);
203 for ( ; rm
> 0; rm
--, sw
++) {
204 if ((sw
== 4) || (sw
== 12))
212 sprintf(tdup
, "Duplicate as above to %s", addr
);
214 " --- %s ---\n", tdup
);
216 printk(KERN_INFO
" %s (+%s) : %s [%s]\n",
217 addr
, boff
, bhex
, basc
);
220 sprintf(tdup
, "Duplicate as above to %s", addr
);
222 " --- %s ---\n", tdup
);
225 printk(KERN_INFO
" %s (+%s) : %s [%s]\n",
226 addr
, boff
, bhex
, basc
);
232 } /* end of ctcmpc_dumpit */
237 * Dump header and first 16 bytes of an sk_buff for debugging purposes.
239 * skb The sk_buff to dump.
240 * offset Offset relative to skb-data, where to start the dump.
242 void ctcmpc_dump_skb(struct sk_buff
*skb
, int offset
)
244 unsigned char *p
= skb
->data
;
245 struct th_header
*header
;
254 header
= (struct th_header
*)p
;
256 printk(KERN_INFO
"dump:\n");
257 printk(KERN_INFO
"skb len=%d \n", skb
->len
);
259 switch (header
->th_ch_flag
) {
264 if ((header
->th_blk_flag
== TH_DATA_IS_XID
) &&
265 (header
->th_is_xid
== 0x01))
275 pheader
= (struct pdu
*)p
;
276 printk(KERN_INFO
"pdu->offset: %d hex: %04x\n",
277 pheader
->pdu_offset
, pheader
->pdu_offset
);
278 printk(KERN_INFO
"pdu->flag : %02x\n", pheader
->pdu_flag
);
279 printk(KERN_INFO
"pdu->proto : %02x\n", pheader
->pdu_proto
);
280 printk(KERN_INFO
"pdu->seq : %02x\n", pheader
->pdu_seq
);
284 printk(KERN_INFO
"th->seg : %02x\n", header
->th_seg
);
285 printk(KERN_INFO
"th->ch : %02x\n", header
->th_ch_flag
);
286 printk(KERN_INFO
"th->blk_flag: %02x\n", header
->th_blk_flag
);
287 printk(KERN_INFO
"th->type : %s\n",
288 (header
->th_is_xid
) ? "DATA" : "XID");
289 printk(KERN_INFO
"th->seqnum : %04x\n", header
->th_seq_num
);
295 printk(KERN_INFO
"data: ");
296 for (i
= 0; i
< bl
; i
++)
297 printk(KERN_INFO
"%02x%s", *p
++, (i
% 16) ? " " : "\n<7>");
298 printk(KERN_INFO
"\n");
303 * ctc_mpc_alloc_channel
304 * (exported interface)
306 * Device Initialization :
307 * ACTPATH driven IO operations
309 int ctc_mpc_alloc_channel(int port_num
, void (*callback
)(int, int))
312 struct net_device
*dev
;
313 struct mpc_group
*grp
;
314 struct ctcm_priv
*priv
;
316 ctcm_pr_debug("ctcmpc enter: %s()\n", __FUNCTION__
);
318 sprintf(device
, "%s%i", MPC_DEVICE_NAME
, port_num
);
319 dev
= __dev_get_by_name(&init_net
, device
);
322 printk(KERN_INFO
"ctc_mpc_alloc_channel %s dev=NULL\n", device
);
331 grp
->allochanfunc
= callback
;
332 grp
->port_num
= port_num
;
333 grp
->port_persist
= 1;
335 ctcm_pr_debug("ctcmpc: %s called for device %s state=%s\n",
338 fsm_getstate_str(grp
->fsm
));
340 switch (fsm_getstate(grp
->fsm
)) {
341 case MPCG_STATE_INOP
:
342 /* Group is in the process of terminating */
343 grp
->alloc_called
= 1;
345 case MPCG_STATE_RESET
:
346 /* MPC Group will transition to state */
347 /* MPCG_STATE_XID2INITW iff the minimum number */
348 /* of 1 read and 1 write channel have successfully*/
350 /*fsm_newstate(grp->fsm, MPCG_STATE_XID2INITW);*/
352 grp
->send_qllc_disc
= 1;
353 case MPCG_STATE_XID0IOWAIT
:
354 fsm_deltimer(&grp
->timer
);
355 grp
->outstanding_xid2
= 0;
356 grp
->outstanding_xid7
= 0;
357 grp
->outstanding_xid7_p2
= 0;
358 grp
->saved_xid2
= NULL
;
361 fsm_event(priv
->fsm
, DEV_EVENT_START
, dev
);
363 case MPCG_STATE_READY
:
364 /* XID exchanges completed after PORT was activated */
365 /* Link station already active */
366 /* Maybe timing issue...retry callback */
367 grp
->allocchan_callback_retries
++;
368 if (grp
->allocchan_callback_retries
< 4) {
369 if (grp
->allochanfunc
)
370 grp
->allochanfunc(grp
->port_num
,
371 grp
->group_max_buflen
);
373 /* there are problems...bail out */
374 /* there may be a state mismatch so restart */
375 grp
->port_persist
= 1;
376 fsm_event(grp
->fsm
, MPCG_EVENT_INOP
, dev
);
377 grp
->allocchan_callback_retries
= 0;
385 ctcm_pr_debug("ctcmpc exit: %s()\n", __FUNCTION__
);
388 EXPORT_SYMBOL(ctc_mpc_alloc_channel
);
391 * ctc_mpc_establish_connectivity
392 * (exported interface)
394 void ctc_mpc_establish_connectivity(int port_num
,
395 void (*callback
)(int, int, int))
398 struct net_device
*dev
;
399 struct mpc_group
*grp
;
400 struct ctcm_priv
*priv
;
401 struct channel
*rch
, *wch
;
403 ctcm_pr_debug("ctcmpc enter: %s()\n", __FUNCTION__
);
405 sprintf(device
, "%s%i", MPC_DEVICE_NAME
, port_num
);
406 dev
= __dev_get_by_name(&init_net
, device
);
409 printk(KERN_INFO
"ctc_mpc_establish_connectivity "
410 "%s dev=NULL\n", device
);
414 rch
= priv
->channel
[READ
];
415 wch
= priv
->channel
[WRITE
];
419 ctcm_pr_debug("ctcmpc: %s() called for device %s state=%s\n",
420 __FUNCTION__
, dev
->name
,
421 fsm_getstate_str(grp
->fsm
));
423 grp
->estconnfunc
= callback
;
424 grp
->port_num
= port_num
;
426 switch (fsm_getstate(grp
->fsm
)) {
427 case MPCG_STATE_READY
:
428 /* XID exchanges completed after PORT was activated */
429 /* Link station already active */
430 /* Maybe timing issue...retry callback */
431 fsm_deltimer(&grp
->timer
);
432 grp
->estconn_callback_retries
++;
433 if (grp
->estconn_callback_retries
< 4) {
434 if (grp
->estconnfunc
) {
435 grp
->estconnfunc(grp
->port_num
, 0,
436 grp
->group_max_buflen
);
437 grp
->estconnfunc
= NULL
;
440 /* there are problems...bail out */
441 fsm_event(grp
->fsm
, MPCG_EVENT_INOP
, dev
);
442 grp
->estconn_callback_retries
= 0;
445 case MPCG_STATE_INOP
:
446 case MPCG_STATE_RESET
:
447 /* MPC Group is not ready to start XID - min num of */
448 /* 1 read and 1 write channel have not been acquired*/
449 printk(KERN_WARNING
"ctcmpc: %s() REJECTED ACTIVE XID Req"
450 "uest - Channel Pair is not Active\n", __FUNCTION__
);
451 if (grp
->estconnfunc
) {
452 grp
->estconnfunc(grp
->port_num
, -1, 0);
453 grp
->estconnfunc
= NULL
;
456 case MPCG_STATE_XID2INITW
:
457 /* alloc channel was called but no XID exchange */
458 /* has occurred. initiate xside XID exchange */
459 /* make sure yside XID0 processing has not started */
460 if ((fsm_getstate(rch
->fsm
) > CH_XID0_PENDING
) ||
461 (fsm_getstate(wch
->fsm
) > CH_XID0_PENDING
)) {
462 printk(KERN_WARNING
"mpc: %s() ABORT ACTIVE XID"
463 " Request- PASSIVE XID in process\n"
467 grp
->send_qllc_disc
= 1;
468 fsm_newstate(grp
->fsm
, MPCG_STATE_XID0IOWAIT
);
469 fsm_deltimer(&grp
->timer
);
470 fsm_addtimer(&grp
->timer
, MPC_XID_TIMEOUT_VALUE
,
471 MPCG_EVENT_TIMER
, dev
);
472 grp
->outstanding_xid7
= 0;
473 grp
->outstanding_xid7_p2
= 0;
474 grp
->saved_xid2
= NULL
;
475 if ((rch
->in_mpcgroup
) &&
476 (fsm_getstate(rch
->fsm
) == CH_XID0_PENDING
))
477 fsm_event(grp
->fsm
, MPCG_EVENT_XID0DO
, rch
);
479 printk(KERN_WARNING
"mpc: %s() Unable to start"
480 " ACTIVE XID0 on read channel\n",
482 if (grp
->estconnfunc
) {
483 grp
->estconnfunc(grp
->port_num
, -1, 0);
484 grp
->estconnfunc
= NULL
;
486 fsm_deltimer(&grp
->timer
);
489 if ((wch
->in_mpcgroup
) &&
490 (fsm_getstate(wch
->fsm
) == CH_XID0_PENDING
))
491 fsm_event(grp
->fsm
, MPCG_EVENT_XID0DO
, wch
);
493 printk(KERN_WARNING
"mpc: %s() Unable to start"
494 " ACTIVE XID0 on write channel\n",
496 if (grp
->estconnfunc
) {
497 grp
->estconnfunc(grp
->port_num
, -1, 0);
498 grp
->estconnfunc
= NULL
;
500 fsm_deltimer(&grp
->timer
);
504 case MPCG_STATE_XID0IOWAIT
:
505 /* already in active XID negotiations */
511 ctcm_pr_debug("ctcmpc exit: %s()\n", __FUNCTION__
);
514 EXPORT_SYMBOL(ctc_mpc_establish_connectivity
);
518 * (exported interface)
520 void ctc_mpc_dealloc_ch(int port_num
)
522 struct net_device
*dev
;
524 struct ctcm_priv
*priv
;
525 struct mpc_group
*grp
;
527 ctcm_pr_debug("ctcmpc enter: %s()\n", __FUNCTION__
);
528 sprintf(device
, "%s%i", MPC_DEVICE_NAME
, port_num
);
529 dev
= __dev_get_by_name(&init_net
, device
);
532 printk(KERN_INFO
"%s() %s dev=NULL\n", __FUNCTION__
, device
);
536 ctcm_pr_debug("ctcmpc:%s %s() called for device %s refcount=%d\n",
537 dev
->name
, __FUNCTION__
,
538 dev
->name
, atomic_read(&dev
->refcnt
));
542 printk(KERN_INFO
"%s() %s priv=NULL\n",
543 __FUNCTION__
, device
);
546 fsm_deltimer(&priv
->restart_timer
);
550 printk(KERN_INFO
"%s() %s dev=NULL\n", __FUNCTION__
, device
);
553 grp
->channels_terminating
= 0;
555 fsm_deltimer(&grp
->timer
);
557 grp
->allochanfunc
= NULL
;
558 grp
->estconnfunc
= NULL
;
559 grp
->port_persist
= 0;
560 grp
->send_qllc_disc
= 0;
561 fsm_event(grp
->fsm
, MPCG_EVENT_INOP
, dev
);
565 ctcm_pr_debug("ctcmpc exit: %s()\n", __FUNCTION__
);
568 EXPORT_SYMBOL(ctc_mpc_dealloc_ch
);
571 * ctc_mpc_flow_control
572 * (exported interface)
574 void ctc_mpc_flow_control(int port_num
, int flowc
)
577 struct ctcm_priv
*priv
;
578 struct mpc_group
*grp
;
579 struct net_device
*dev
;
583 ctcm_pr_debug("ctcmpc enter: %s() %i\n", __FUNCTION__
, flowc
);
585 sprintf(device
, "%s%i", MPC_DEVICE_NAME
, port_num
);
586 dev
= __dev_get_by_name(&init_net
, device
);
589 printk(KERN_INFO
"ctc_mpc_flow_control %s dev=NULL\n", device
);
593 ctcm_pr_debug("ctcmpc: %s %s called \n", dev
->name
, __FUNCTION__
);
597 printk(KERN_INFO
"ctcmpc:%s() %s priv=NULL\n",
598 __FUNCTION__
, device
);
602 rch
= priv
->channel
[READ
];
604 mpcg_state
= fsm_getstate(grp
->fsm
);
607 if (mpcg_state
== MPCG_STATE_FLOWC
)
609 if (mpcg_state
== MPCG_STATE_READY
) {
610 if (grp
->flow_off_called
== 1)
611 grp
->flow_off_called
= 0;
613 fsm_newstate(grp
->fsm
, MPCG_STATE_FLOWC
);
618 if (mpcg_state
== MPCG_STATE_FLOWC
) {
619 fsm_newstate(grp
->fsm
, MPCG_STATE_READY
);
620 /* ensure any data that has accumulated */
621 /* on the io_queue will now be sen t */
622 tasklet_schedule(&rch
->ch_tasklet
);
624 /* possible race condition */
625 if (mpcg_state
== MPCG_STATE_READY
) {
626 grp
->flow_off_called
= 1;
632 ctcm_pr_debug("ctcmpc exit: %s() %i\n", __FUNCTION__
, flowc
);
634 EXPORT_SYMBOL(ctc_mpc_flow_control
);
636 static int mpc_send_qllc_discontact(struct net_device
*);
639 * helper function of ctcmpc_unpack_skb
641 static void mpc_rcvd_sweep_resp(struct mpcg_info
*mpcginfo
)
643 struct channel
*rch
= mpcginfo
->ch
;
644 struct net_device
*dev
= rch
->netdev
;
645 struct ctcm_priv
*priv
= dev
->priv
;
646 struct mpc_group
*grp
= priv
->mpcg
;
647 struct channel
*ch
= priv
->channel
[WRITE
];
650 ctcm_pr_debug("ctcmpc enter: %s(): ch=0x%p id=%s\n",
651 __FUNCTION__
, ch
, ch
->id
);
654 ctcmpc_dumpit((char *)mpcginfo
->sweep
, TH_SWEEP_LENGTH
);
656 grp
->sweep_rsp_pend_num
--;
658 if ((grp
->sweep_req_pend_num
== 0) &&
659 (grp
->sweep_rsp_pend_num
== 0)) {
660 fsm_deltimer(&ch
->sweep_timer
);
662 rch
->th_seq_num
= 0x00;
663 ch
->th_seq_num
= 0x00;
664 ctcm_clear_busy_do(dev
);
674 * helper function of mpc_rcvd_sweep_req
675 * which is a helper of ctcmpc_unpack_skb
677 static void ctcmpc_send_sweep_resp(struct channel
*rch
)
679 struct net_device
*dev
= rch
->netdev
;
680 struct ctcm_priv
*priv
= dev
->priv
;
681 struct mpc_group
*grp
= priv
->mpcg
;
683 struct th_sweep
*header
;
684 struct sk_buff
*sweep_skb
;
685 struct channel
*ch
= priv
->channel
[WRITE
];
688 ctcm_pr_debug("ctcmpc exit : %s(): ch=0x%p id=%s\n",
689 __FUNCTION__
, rch
, rch
->id
);
691 sweep_skb
= __dev_alloc_skb(MPC_BUFSIZE_DEFAULT
,
693 if (sweep_skb
== NULL
) {
694 printk(KERN_INFO
"Couldn't alloc sweep_skb\n");
699 header
= (struct th_sweep
*)
700 kmalloc(sizeof(struct th_sweep
), gfp_type());
703 dev_kfree_skb_any(sweep_skb
);
708 header
->th
.th_seg
= 0x00 ;
709 header
->th
.th_ch_flag
= TH_SWEEP_RESP
;
710 header
->th
.th_blk_flag
= 0x00;
711 header
->th
.th_is_xid
= 0x00;
712 header
->th
.th_seq_num
= 0x00;
713 header
->sw
.th_last_seq
= ch
->th_seq_num
;
715 memcpy(skb_put(sweep_skb
, TH_SWEEP_LENGTH
), header
, TH_SWEEP_LENGTH
);
719 dev
->trans_start
= jiffies
;
720 skb_queue_tail(&ch
->sweep_queue
, sweep_skb
);
722 fsm_addtimer(&ch
->sweep_timer
, 100, CTC_EVENT_RSWEEP_TIMER
, ch
);
729 ctcm_clear_busy_do(dev
);
730 fsm_event(grp
->fsm
, MPCG_EVENT_INOP
, dev
);
737 * helper function of ctcmpc_unpack_skb
739 static void mpc_rcvd_sweep_req(struct mpcg_info
*mpcginfo
)
741 struct channel
*rch
= mpcginfo
->ch
;
742 struct net_device
*dev
= rch
->netdev
;
743 struct ctcm_priv
*priv
= dev
->priv
;
744 struct mpc_group
*grp
= priv
->mpcg
;
745 struct channel
*ch
= priv
->channel
[WRITE
];
748 CTCM_DBF_TEXT_(MPC_TRACE
, CTC_DBF_DEBUG
,
749 " %s(): ch=0x%p id=%s\n", __FUNCTION__
, ch
, ch
->id
);
751 if (grp
->in_sweep
== 0) {
753 ctcm_test_and_set_busy(dev
);
754 grp
->sweep_req_pend_num
= grp
->active_channels
[READ
];
755 grp
->sweep_rsp_pend_num
= grp
->active_channels
[READ
];
759 ctcmpc_dumpit((char *)mpcginfo
->sweep
, TH_SWEEP_LENGTH
);
761 grp
->sweep_req_pend_num
--;
762 ctcmpc_send_sweep_resp(ch
);
768 * MPC Group Station FSM definitions
770 static const char *mpcg_event_names
[] = {
771 [MPCG_EVENT_INOP
] = "INOP Condition",
772 [MPCG_EVENT_DISCONC
] = "Discontact Received",
773 [MPCG_EVENT_XID0DO
] = "Channel Active - Start XID",
774 [MPCG_EVENT_XID2
] = "XID2 Received",
775 [MPCG_EVENT_XID2DONE
] = "XID0 Complete",
776 [MPCG_EVENT_XID7DONE
] = "XID7 Complete",
777 [MPCG_EVENT_TIMER
] = "XID Setup Timer",
778 [MPCG_EVENT_DOIO
] = "XID DoIO",
781 static const char *mpcg_state_names
[] = {
782 [MPCG_STATE_RESET
] = "Reset",
783 [MPCG_STATE_INOP
] = "INOP",
784 [MPCG_STATE_XID2INITW
] = "Passive XID- XID0 Pending Start",
785 [MPCG_STATE_XID2INITX
] = "Passive XID- XID0 Pending Complete",
786 [MPCG_STATE_XID7INITW
] = "Passive XID- XID7 Pending P1 Start",
787 [MPCG_STATE_XID7INITX
] = "Passive XID- XID7 Pending P2 Complete",
788 [MPCG_STATE_XID0IOWAIT
] = "Active XID- XID0 Pending Start",
789 [MPCG_STATE_XID0IOWAIX
] = "Active XID- XID0 Pending Complete",
790 [MPCG_STATE_XID7INITI
] = "Active XID- XID7 Pending Start",
791 [MPCG_STATE_XID7INITZ
] = "Active XID- XID7 Pending Complete ",
792 [MPCG_STATE_XID7INITF
] = "XID - XID7 Complete ",
793 [MPCG_STATE_FLOWC
] = "FLOW CONTROL ON",
794 [MPCG_STATE_READY
] = "READY",
798 * The MPC Group Station FSM
801 static const fsm_node mpcg_fsm
[] = {
802 { MPCG_STATE_RESET
, MPCG_EVENT_INOP
, mpc_action_go_inop
},
803 { MPCG_STATE_INOP
, MPCG_EVENT_INOP
, mpc_action_nop
},
804 { MPCG_STATE_FLOWC
, MPCG_EVENT_INOP
, mpc_action_go_inop
},
806 { MPCG_STATE_READY
, MPCG_EVENT_DISCONC
, mpc_action_discontact
},
807 { MPCG_STATE_READY
, MPCG_EVENT_INOP
, mpc_action_go_inop
},
809 { MPCG_STATE_XID2INITW
, MPCG_EVENT_XID0DO
, mpc_action_doxid0
},
810 { MPCG_STATE_XID2INITW
, MPCG_EVENT_XID2
, mpc_action_rcvd_xid0
},
811 { MPCG_STATE_XID2INITW
, MPCG_EVENT_INOP
, mpc_action_go_inop
},
812 { MPCG_STATE_XID2INITW
, MPCG_EVENT_TIMER
, mpc_action_timeout
},
813 { MPCG_STATE_XID2INITW
, MPCG_EVENT_DOIO
, mpc_action_yside_xid
},
815 { MPCG_STATE_XID2INITX
, MPCG_EVENT_XID0DO
, mpc_action_doxid0
},
816 { MPCG_STATE_XID2INITX
, MPCG_EVENT_XID2
, mpc_action_rcvd_xid0
},
817 { MPCG_STATE_XID2INITX
, MPCG_EVENT_INOP
, mpc_action_go_inop
},
818 { MPCG_STATE_XID2INITX
, MPCG_EVENT_TIMER
, mpc_action_timeout
},
819 { MPCG_STATE_XID2INITX
, MPCG_EVENT_DOIO
, mpc_action_yside_xid
},
821 { MPCG_STATE_XID7INITW
, MPCG_EVENT_XID2DONE
, mpc_action_doxid7
},
822 { MPCG_STATE_XID7INITW
, MPCG_EVENT_DISCONC
, mpc_action_discontact
},
823 { MPCG_STATE_XID7INITW
, MPCG_EVENT_XID2
, mpc_action_rcvd_xid7
},
824 { MPCG_STATE_XID7INITW
, MPCG_EVENT_INOP
, mpc_action_go_inop
},
825 { MPCG_STATE_XID7INITW
, MPCG_EVENT_TIMER
, mpc_action_timeout
},
826 { MPCG_STATE_XID7INITW
, MPCG_EVENT_XID7DONE
, mpc_action_doxid7
},
827 { MPCG_STATE_XID7INITW
, MPCG_EVENT_DOIO
, mpc_action_yside_xid
},
829 { MPCG_STATE_XID7INITX
, MPCG_EVENT_DISCONC
, mpc_action_discontact
},
830 { MPCG_STATE_XID7INITX
, MPCG_EVENT_XID2
, mpc_action_rcvd_xid7
},
831 { MPCG_STATE_XID7INITX
, MPCG_EVENT_INOP
, mpc_action_go_inop
},
832 { MPCG_STATE_XID7INITX
, MPCG_EVENT_XID7DONE
, mpc_action_doxid7
},
833 { MPCG_STATE_XID7INITX
, MPCG_EVENT_TIMER
, mpc_action_timeout
},
834 { MPCG_STATE_XID7INITX
, MPCG_EVENT_DOIO
, mpc_action_yside_xid
},
836 { MPCG_STATE_XID0IOWAIT
, MPCG_EVENT_XID0DO
, mpc_action_doxid0
},
837 { MPCG_STATE_XID0IOWAIT
, MPCG_EVENT_DISCONC
, mpc_action_discontact
},
838 { MPCG_STATE_XID0IOWAIT
, MPCG_EVENT_XID2
, mpc_action_rcvd_xid0
},
839 { MPCG_STATE_XID0IOWAIT
, MPCG_EVENT_INOP
, mpc_action_go_inop
},
840 { MPCG_STATE_XID0IOWAIT
, MPCG_EVENT_TIMER
, mpc_action_timeout
},
841 { MPCG_STATE_XID0IOWAIT
, MPCG_EVENT_DOIO
, mpc_action_xside_xid
},
843 { MPCG_STATE_XID0IOWAIX
, MPCG_EVENT_XID0DO
, mpc_action_doxid0
},
844 { MPCG_STATE_XID0IOWAIX
, MPCG_EVENT_DISCONC
, mpc_action_discontact
},
845 { MPCG_STATE_XID0IOWAIX
, MPCG_EVENT_XID2
, mpc_action_rcvd_xid0
},
846 { MPCG_STATE_XID0IOWAIX
, MPCG_EVENT_INOP
, mpc_action_go_inop
},
847 { MPCG_STATE_XID0IOWAIX
, MPCG_EVENT_TIMER
, mpc_action_timeout
},
848 { MPCG_STATE_XID0IOWAIX
, MPCG_EVENT_DOIO
, mpc_action_xside_xid
},
850 { MPCG_STATE_XID7INITI
, MPCG_EVENT_XID2DONE
, mpc_action_doxid7
},
851 { MPCG_STATE_XID7INITI
, MPCG_EVENT_XID2
, mpc_action_rcvd_xid7
},
852 { MPCG_STATE_XID7INITI
, MPCG_EVENT_DISCONC
, mpc_action_discontact
},
853 { MPCG_STATE_XID7INITI
, MPCG_EVENT_INOP
, mpc_action_go_inop
},
854 { MPCG_STATE_XID7INITI
, MPCG_EVENT_TIMER
, mpc_action_timeout
},
855 { MPCG_STATE_XID7INITI
, MPCG_EVENT_XID7DONE
, mpc_action_doxid7
},
856 { MPCG_STATE_XID7INITI
, MPCG_EVENT_DOIO
, mpc_action_xside_xid
},
858 { MPCG_STATE_XID7INITZ
, MPCG_EVENT_XID2
, mpc_action_rcvd_xid7
},
859 { MPCG_STATE_XID7INITZ
, MPCG_EVENT_XID7DONE
, mpc_action_doxid7
},
860 { MPCG_STATE_XID7INITZ
, MPCG_EVENT_DISCONC
, mpc_action_discontact
},
861 { MPCG_STATE_XID7INITZ
, MPCG_EVENT_INOP
, mpc_action_go_inop
},
862 { MPCG_STATE_XID7INITZ
, MPCG_EVENT_TIMER
, mpc_action_timeout
},
863 { MPCG_STATE_XID7INITZ
, MPCG_EVENT_DOIO
, mpc_action_xside_xid
},
865 { MPCG_STATE_XID7INITF
, MPCG_EVENT_INOP
, mpc_action_go_inop
},
866 { MPCG_STATE_XID7INITF
, MPCG_EVENT_XID7DONE
, mpc_action_go_ready
},
869 static int mpcg_fsm_len
= ARRAY_SIZE(mpcg_fsm
);
872 * MPC Group Station FSM action
873 * CTCM_PROTO_MPC only
875 static void mpc_action_go_ready(fsm_instance
*fsm
, int event
, void *arg
)
877 struct net_device
*dev
= arg
;
878 struct ctcm_priv
*priv
= NULL
;
879 struct mpc_group
*grp
= NULL
;
882 printk(KERN_INFO
"%s() dev=NULL\n", __FUNCTION__
);
886 ctcm_pr_debug("ctcmpc enter: %s %s()\n", dev
->name
, __FUNCTION__
);
890 printk(KERN_INFO
"%s() priv=NULL\n", __FUNCTION__
);
896 printk(KERN_INFO
"%s() grp=NULL\n", __FUNCTION__
);
900 fsm_deltimer(&grp
->timer
);
902 if (grp
->saved_xid2
->xid2_flag2
== 0x40) {
903 priv
->xid
->xid2_flag2
= 0x00;
904 if (grp
->estconnfunc
) {
905 grp
->estconnfunc(grp
->port_num
, 1,
906 grp
->group_max_buflen
);
907 grp
->estconnfunc
= NULL
;
908 } else if (grp
->allochanfunc
)
909 grp
->send_qllc_disc
= 1;
913 grp
->port_persist
= 1;
914 grp
->out_of_sequence
= 0;
915 grp
->estconn_called
= 0;
917 tasklet_hi_schedule(&grp
->mpc_tasklet2
);
919 ctcm_pr_debug("ctcmpc exit: %s %s()\n", dev
->name
, __FUNCTION__
);
923 fsm_event(grp
->fsm
, MPCG_EVENT_INOP
, dev
);
926 ctcm_pr_info("ctcmpc: %s()failure occurred\n", __FUNCTION__
);
930 * helper of ctcm_init_netdevice
931 * CTCM_PROTO_MPC only
933 void mpc_group_ready(unsigned long adev
)
935 struct net_device
*dev
= (struct net_device
*)adev
;
936 struct ctcm_priv
*priv
= NULL
;
937 struct mpc_group
*grp
= NULL
;
938 struct channel
*ch
= NULL
;
941 ctcm_pr_debug("ctcmpc enter: %s()\n", __FUNCTION__
);
944 printk(KERN_INFO
"%s() dev=NULL\n", __FUNCTION__
);
950 printk(KERN_INFO
"%s() priv=NULL\n", __FUNCTION__
);
956 printk(KERN_INFO
"ctcmpc:%s() grp=NULL\n", __FUNCTION__
);
960 printk(KERN_NOTICE
"ctcmpc: %s GROUP TRANSITIONED TO READY"
962 dev
->name
, grp
->group_max_buflen
);
964 fsm_newstate(grp
->fsm
, MPCG_STATE_READY
);
966 /* Put up a read on the channel */
967 ch
= priv
->channel
[READ
];
970 ctcm_pr_debug("ctcmpc: %s() ToDCM_pdu_seq= %08x\n" ,
971 __FUNCTION__
, ch
->pdu_seq
);
973 ctcmpc_chx_rxidle(ch
->fsm
, CTC_EVENT_START
, ch
);
974 /* Put the write channel in idle state */
975 ch
= priv
->channel
[WRITE
];
976 if (ch
->collect_len
> 0) {
977 spin_lock(&ch
->collect_lock
);
978 ctcm_purge_skb_queue(&ch
->collect_queue
);
980 spin_unlock(&ch
->collect_lock
);
982 ctcm_chx_txidle(ch
->fsm
, CTC_EVENT_START
, ch
);
984 ctcm_clear_busy(dev
);
986 if (grp
->estconnfunc
) {
987 grp
->estconnfunc(grp
->port_num
, 0,
988 grp
->group_max_buflen
);
989 grp
->estconnfunc
= NULL
;
991 if (grp
->allochanfunc
)
992 grp
->allochanfunc(grp
->port_num
,
993 grp
->group_max_buflen
);
995 grp
->send_qllc_disc
= 1;
996 grp
->changed_side
= 0;
998 ctcm_pr_debug("ctcmpc exit: %s()\n", __FUNCTION__
);
1004 * Increment the MPC Group Active Channel Counts
1005 * helper of dev_action (called from channel fsm)
1007 int mpc_channel_action(struct channel
*ch
, int direction
, int action
)
1009 struct net_device
*dev
= ch
->netdev
;
1010 struct ctcm_priv
*priv
;
1011 struct mpc_group
*grp
= NULL
;
1015 ctcm_pr_debug("ctcmpc enter: %s(): ch=0x%p id=%s\n",
1016 __FUNCTION__
, ch
, ch
->id
);
1019 printk(KERN_INFO
"ctcmpc_channel_action %i dev=NULL\n",
1028 "ctcmpc_channel_action%i priv=NULL, dev=%s\n",
1037 printk(KERN_INFO
"ctcmpc: %s()%i mpcgroup=NULL, dev=%s\n",
1038 __FUNCTION__
, action
, dev
->name
);
1044 "ctcmpc: %s() %i(): Grp:%s total_channel_paths=%i "
1045 "active_channels read=%i, write=%i\n",
1048 fsm_getstate_str(grp
->fsm
),
1049 grp
->num_channel_paths
,
1050 grp
->active_channels
[READ
],
1051 grp
->active_channels
[WRITE
]);
1053 if ((action
== MPC_CHANNEL_ADD
) && (ch
->in_mpcgroup
== 0)) {
1054 grp
->num_channel_paths
++;
1055 grp
->active_channels
[direction
]++;
1056 grp
->outstanding_xid2
++;
1057 ch
->in_mpcgroup
= 1;
1059 if (ch
->xid_skb
!= NULL
)
1060 dev_kfree_skb_any(ch
->xid_skb
);
1062 ch
->xid_skb
= __dev_alloc_skb(MPC_BUFSIZE_DEFAULT
,
1063 GFP_ATOMIC
| GFP_DMA
);
1064 if (ch
->xid_skb
== NULL
) {
1065 printk(KERN_INFO
"ctcmpc: %s()"
1066 "Couldn't alloc ch xid_skb\n", __FUNCTION__
);
1067 fsm_event(grp
->fsm
, MPCG_EVENT_INOP
, dev
);
1070 ch
->xid_skb_data
= ch
->xid_skb
->data
;
1071 ch
->xid_th
= (struct th_header
*)ch
->xid_skb
->data
;
1072 skb_put(ch
->xid_skb
, TH_HEADER_LENGTH
);
1073 ch
->xid
= (struct xid2
*)skb_tail_pointer(ch
->xid_skb
);
1074 skb_put(ch
->xid_skb
, XID2_LENGTH
);
1075 ch
->xid_id
= skb_tail_pointer(ch
->xid_skb
);
1076 ch
->xid_skb
->data
= ch
->xid_skb_data
;
1077 skb_reset_tail_pointer(ch
->xid_skb
);
1078 ch
->xid_skb
->len
= 0;
1080 memcpy(skb_put(ch
->xid_skb
, grp
->xid_skb
->len
),
1084 ch
->xid
->xid2_dlc_type
= ((CHANNEL_DIRECTION(ch
->flags
) == READ
)
1085 ? XID2_READ_SIDE
: XID2_WRITE_SIDE
);
1087 if (CHANNEL_DIRECTION(ch
->flags
) == WRITE
)
1088 ch
->xid
->xid2_buf_len
= 0x00;
1090 ch
->xid_skb
->data
= ch
->xid_skb_data
;
1091 skb_reset_tail_pointer(ch
->xid_skb
);
1092 ch
->xid_skb
->len
= 0;
1094 fsm_newstate(ch
->fsm
, CH_XID0_PENDING
);
1096 if ((grp
->active_channels
[READ
] > 0) &&
1097 (grp
->active_channels
[WRITE
] > 0) &&
1098 (fsm_getstate(grp
->fsm
) < MPCG_STATE_XID2INITW
)) {
1099 fsm_newstate(grp
->fsm
, MPCG_STATE_XID2INITW
);
1100 printk(KERN_NOTICE
"ctcmpc: %s MPC GROUP "
1101 "CHANNELS ACTIVE\n", dev
->name
);
1103 } else if ((action
== MPC_CHANNEL_REMOVE
) &&
1104 (ch
->in_mpcgroup
== 1)) {
1105 ch
->in_mpcgroup
= 0;
1106 grp
->num_channel_paths
--;
1107 grp
->active_channels
[direction
]--;
1109 if (ch
->xid_skb
!= NULL
)
1110 dev_kfree_skb_any(ch
->xid_skb
);
1113 if (grp
->channels_terminating
)
1116 if (((grp
->active_channels
[READ
] == 0) &&
1117 (grp
->active_channels
[WRITE
] > 0))
1118 || ((grp
->active_channels
[WRITE
] == 0) &&
1119 (grp
->active_channels
[READ
] > 0)))
1120 fsm_event(grp
->fsm
, MPCG_EVENT_INOP
, dev
);
1127 "ctcmpc: %s() %i Grp:%s ttl_chan_paths=%i "
1128 "active_chans read=%i, write=%i\n",
1131 fsm_getstate_str(grp
->fsm
),
1132 grp
->num_channel_paths
,
1133 grp
->active_channels
[READ
],
1134 grp
->active_channels
[WRITE
]);
1136 ctcm_pr_debug("ctcmpc exit : %s(): ch=0x%p id=%s\n",
1137 __FUNCTION__
, ch
, ch
->id
);
1144 * Unpack a just received skb and hand it over to
1146 * special MPC version of unpack_skb.
1148 * ch The channel where this skb has been received.
1149 * pskb The received skb.
1151 static void ctcmpc_unpack_skb(struct channel
*ch
, struct sk_buff
*pskb
)
1153 struct net_device
*dev
= ch
->netdev
;
1154 struct ctcm_priv
*priv
= dev
->priv
;
1155 struct mpc_group
*grp
= priv
->mpcg
;
1156 struct pdu
*curr_pdu
;
1157 struct mpcg_info
*mpcginfo
;
1158 struct th_header
*header
= NULL
;
1159 struct th_sweep
*sweep
= NULL
;
1160 int pdu_last_seen
= 0;
1162 struct sk_buff
*skb
;
1167 ctcm_pr_debug("ctcmpc enter: %s() %s cp:%i ch:%s\n",
1168 __FUNCTION__
, dev
->name
, smp_processor_id(), ch
->id
);
1170 header
= (struct th_header
*)pskb
->data
;
1171 if ((header
->th_seg
== 0) &&
1172 (header
->th_ch_flag
== 0) &&
1173 (header
->th_blk_flag
== 0) &&
1174 (header
->th_seq_num
== 0))
1175 /* nothing for us */ goto done
;
1177 if (do_debug_data
) {
1178 ctcm_pr_debug("ctcmpc: %s() th_header\n", __FUNCTION__
);
1179 ctcmpc_dumpit((char *)header
, TH_HEADER_LENGTH
);
1180 ctcm_pr_debug("ctcmpc: %s() pskb len: %04x \n",
1181 __FUNCTION__
, pskb
->len
);
1185 pskb
->ip_summed
= CHECKSUM_UNNECESSARY
;
1186 skb_pull(pskb
, TH_HEADER_LENGTH
);
1188 if (likely(header
->th_ch_flag
== TH_HAS_PDU
)) {
1190 ctcm_pr_debug("ctcmpc: %s() came into th_has_pdu\n",
1192 if ((fsm_getstate(grp
->fsm
) == MPCG_STATE_FLOWC
) ||
1193 ((fsm_getstate(grp
->fsm
) == MPCG_STATE_READY
) &&
1194 (header
->th_seq_num
!= ch
->th_seq_num
+ 1) &&
1195 (ch
->th_seq_num
!= 0))) {
1196 /* This is NOT the next segment *
1197 * we are not the correct race winner *
1198 * go away and let someone else win *
1199 * BUT..this only applies if xid negot *
1202 grp
->out_of_sequence
+= 1;
1203 __skb_push(pskb
, TH_HEADER_LENGTH
);
1204 skb_queue_tail(&ch
->io_queue
, pskb
);
1206 ctcm_pr_debug("ctcmpc: %s() th_seq_num "
1207 "expect:%08x got:%08x\n", __FUNCTION__
,
1208 ch
->th_seq_num
+ 1, header
->th_seq_num
);
1212 grp
->out_of_sequence
= 0;
1213 ch
->th_seq_num
= header
->th_seq_num
;
1216 ctcm_pr_debug("ctcmpc: %s() FromVTAM_th_seq=%08x\n",
1217 __FUNCTION__
, ch
->th_seq_num
);
1219 if (unlikely(fsm_getstate(grp
->fsm
) != MPCG_STATE_READY
))
1222 while ((pskb
->len
> 0) && !pdu_last_seen
) {
1223 curr_pdu
= (struct pdu
*)pskb
->data
;
1224 if (do_debug_data
) {
1225 ctcm_pr_debug("ctcm: %s() pdu_header\n",
1227 ctcmpc_dumpit((char *)pskb
->data
,
1229 ctcm_pr_debug("ctcm: %s() pskb len: %04x \n",
1230 __FUNCTION__
, pskb
->len
);
1232 skb_pull(pskb
, PDU_HEADER_LENGTH
);
1234 if (curr_pdu
->pdu_flag
& PDU_LAST
)
1236 if (curr_pdu
->pdu_flag
& PDU_CNTL
)
1237 pskb
->protocol
= htons(ETH_P_SNAP
);
1239 pskb
->protocol
= htons(ETH_P_SNA_DIX
);
1241 if ((pskb
->len
<= 0) || (pskb
->len
> ch
->max_bufsize
)) {
1243 "%s Illegal packet size %d "
1245 "dropping\n", dev
->name
,
1247 priv
->stats
.rx_dropped
++;
1248 priv
->stats
.rx_length_errors
++;
1251 skb_reset_mac_header(pskb
);
1252 new_len
= curr_pdu
->pdu_offset
;
1254 ctcm_pr_debug("ctcmpc: %s() new_len: %04x \n",
1255 __FUNCTION__
, new_len
);
1256 if ((new_len
== 0) || (new_len
> pskb
->len
)) {
1257 /* should never happen */
1258 /* pskb len must be hosed...bail out */
1260 "ctcmpc: %s(): invalid pdu"
1261 " offset of %04x - data may be"
1262 "lost\n", __FUNCTION__
, new_len
);
1265 skb
= __dev_alloc_skb(new_len
+4, GFP_ATOMIC
);
1269 "ctcm: %s Out of memory in "
1270 "%s()- request-len:%04x \n",
1274 priv
->stats
.rx_dropped
++;
1276 MPCG_EVENT_INOP
, dev
);
1280 memcpy(skb_put(skb
, new_len
),
1281 pskb
->data
, new_len
);
1283 skb_reset_mac_header(skb
);
1284 skb
->dev
= pskb
->dev
;
1285 skb
->protocol
= pskb
->protocol
;
1286 skb
->ip_summed
= CHECKSUM_UNNECESSARY
;
1287 *((__u32
*) skb_push(skb
, 4)) = ch
->pdu_seq
;
1291 ctcm_pr_debug("%s: ToDCM_pdu_seq= %08x\n",
1292 __FUNCTION__
, ch
->pdu_seq
);
1294 ctcm_pr_debug("ctcm: %s() skb:%0lx "
1295 "skb len: %d \n", __FUNCTION__
,
1296 (unsigned long)skb
, skb
->len
);
1297 if (do_debug_data
) {
1298 ctcm_pr_debug("ctcmpc: %s() up to 32 bytes"
1299 " of pdu_data sent\n",
1301 ctcmpc_dump32((char *)skb
->data
, skb
->len
);
1305 sendrc
= netif_rx(skb
);
1306 priv
->stats
.rx_packets
++;
1307 priv
->stats
.rx_bytes
+= skblen
;
1308 skb_pull(pskb
, new_len
); /* point to next PDU */
1311 mpcginfo
= (struct mpcg_info
*)
1312 kmalloc(sizeof(struct mpcg_info
), gfp_type());
1313 if (mpcginfo
== NULL
)
1317 mpcginfo
->th
= header
;
1318 mpcginfo
->skb
= pskb
;
1319 ctcm_pr_debug("ctcmpc: %s() Not PDU - may be control pkt\n",
1322 sweep
= (struct th_sweep
*)pskb
->data
;
1323 mpcginfo
->sweep
= sweep
;
1324 if (header
->th_ch_flag
== TH_SWEEP_REQ
)
1325 mpc_rcvd_sweep_req(mpcginfo
);
1326 else if (header
->th_ch_flag
== TH_SWEEP_RESP
)
1327 mpc_rcvd_sweep_resp(mpcginfo
);
1328 else if (header
->th_blk_flag
== TH_DATA_IS_XID
) {
1329 struct xid2
*thisxid
= (struct xid2
*)pskb
->data
;
1330 skb_pull(pskb
, XID2_LENGTH
);
1331 mpcginfo
->xid
= thisxid
;
1332 fsm_event(grp
->fsm
, MPCG_EVENT_XID2
, mpcginfo
);
1333 } else if (header
->th_blk_flag
== TH_DISCONTACT
)
1334 fsm_event(grp
->fsm
, MPCG_EVENT_DISCONC
, mpcginfo
);
1335 else if (header
->th_seq_num
!= 0) {
1336 printk(KERN_INFO
"%s unexpected packet"
1337 " expected control pkt\n", dev
->name
);
1338 priv
->stats
.rx_dropped
++;
1339 /* mpcginfo only used for non-data transfers */
1342 ctcmpc_dump_skb(pskb
, -8);
1347 dev_kfree_skb_any(pskb
);
1348 if (sendrc
== NET_RX_DROP
) {
1349 printk(KERN_WARNING
"%s %s() NETWORK BACKLOG EXCEEDED"
1350 " - PACKET DROPPED\n", dev
->name
, __FUNCTION__
);
1351 fsm_event(grp
->fsm
, MPCG_EVENT_INOP
, dev
);
1355 ctcm_pr_debug("ctcmpc exit : %s %s(): ch=0x%p id=%s\n",
1356 dev
->name
, __FUNCTION__
, ch
, ch
->id
);
1360 * tasklet helper for mpc's skb unpacking.
1362 * ch The channel to work on.
1363 * Allow flow control back pressure to occur here.
1364 * Throttling back channel can result in excessive
1365 * channel inactivity and system deact of channel
1367 void ctcmpc_bh(unsigned long thischan
)
1369 struct channel
*ch
= (struct channel
*)thischan
;
1370 struct sk_buff
*skb
;
1371 struct net_device
*dev
= ch
->netdev
;
1372 struct ctcm_priv
*priv
= dev
->priv
;
1373 struct mpc_group
*grp
= priv
->mpcg
;
1376 ctcm_pr_debug("%s cp:%i enter: %s() %s\n",
1377 dev
->name
, smp_processor_id(), __FUNCTION__
, ch
->id
);
1378 /* caller has requested driver to throttle back */
1379 while ((fsm_getstate(grp
->fsm
) != MPCG_STATE_FLOWC
) &&
1380 (skb
= skb_dequeue(&ch
->io_queue
))) {
1381 ctcmpc_unpack_skb(ch
, skb
);
1382 if (grp
->out_of_sequence
> 20) {
1383 /* assume data loss has occurred if */
1384 /* missing seq_num for extended */
1385 /* period of time */
1386 grp
->out_of_sequence
= 0;
1387 fsm_event(grp
->fsm
, MPCG_EVENT_INOP
, dev
);
1390 if (skb
== skb_peek(&ch
->io_queue
))
1394 ctcm_pr_debug("ctcmpc exit : %s %s(): ch=0x%p id=%s\n",
1395 dev
->name
, __FUNCTION__
, ch
, ch
->id
);
1400 * MPC Group Initializations
1402 struct mpc_group
*ctcmpc_init_mpc_group(struct ctcm_priv
*priv
)
1404 struct mpc_group
*grp
;
1406 CTCM_DBF_TEXT(MPC_SETUP
, 3, __FUNCTION__
);
1408 grp
= kzalloc(sizeof(struct mpc_group
), GFP_KERNEL
);
1413 init_fsm("mpcg", mpcg_state_names
, mpcg_event_names
,
1414 MPCG_NR_STATES
, MPCG_NR_EVENTS
, mpcg_fsm
,
1415 mpcg_fsm_len
, GFP_KERNEL
);
1416 if (grp
->fsm
== NULL
) {
1421 fsm_newstate(grp
->fsm
, MPCG_STATE_RESET
);
1422 fsm_settimer(grp
->fsm
, &grp
->timer
);
1425 __dev_alloc_skb(MPC_BUFSIZE_DEFAULT
, GFP_ATOMIC
| GFP_DMA
);
1426 if (grp
->xid_skb
== NULL
) {
1427 printk(KERN_INFO
"Couldn't alloc MPCgroup xid_skb\n");
1428 kfree_fsm(grp
->fsm
);
1432 /* base xid for all channels in group */
1433 grp
->xid_skb_data
= grp
->xid_skb
->data
;
1434 grp
->xid_th
= (struct th_header
*)grp
->xid_skb
->data
;
1435 memcpy(skb_put(grp
->xid_skb
, TH_HEADER_LENGTH
),
1436 &thnorm
, TH_HEADER_LENGTH
);
1438 grp
->xid
= (struct xid2
*) skb_tail_pointer(grp
->xid_skb
);
1439 memcpy(skb_put(grp
->xid_skb
, XID2_LENGTH
), &init_xid
, XID2_LENGTH
);
1440 grp
->xid
->xid2_adj_id
= jiffies
| 0xfff00000;
1441 grp
->xid
->xid2_sender_id
= jiffies
;
1443 grp
->xid_id
= skb_tail_pointer(grp
->xid_skb
);
1444 memcpy(skb_put(grp
->xid_skb
, 4), "VTAM", 4);
1447 __dev_alloc_skb(MPC_BUFSIZE_DEFAULT
, GFP_ATOMIC
|GFP_DMA
);
1448 if (grp
->rcvd_xid_skb
== NULL
) {
1449 printk(KERN_INFO
"Couldn't alloc MPCgroup rcvd_xid_skb\n");
1450 kfree_fsm(grp
->fsm
);
1451 dev_kfree_skb(grp
->xid_skb
);
1455 grp
->rcvd_xid_data
= grp
->rcvd_xid_skb
->data
;
1456 grp
->rcvd_xid_th
= (struct th_header
*)grp
->rcvd_xid_skb
->data
;
1457 memcpy(skb_put(grp
->rcvd_xid_skb
, TH_HEADER_LENGTH
),
1458 &thnorm
, TH_HEADER_LENGTH
);
1459 grp
->saved_xid2
= NULL
;
1460 priv
->xid
= grp
->xid
;
1466 * The MPC Group Station FSM
1470 * MPC Group Station FSM actions
1471 * CTCM_PROTO_MPC only
1475 * NOP action for statemachines
1477 static void mpc_action_nop(fsm_instance
*fi
, int event
, void *arg
)
1482 * invoked when the device transitions to dev_stopped
1483 * MPC will stop each individual channel if a single XID failure
1484 * occurs, or will intitiate all channels be stopped if a GROUP
1485 * level failure occurs.
1487 static void mpc_action_go_inop(fsm_instance
*fi
, int event
, void *arg
)
1489 struct net_device
*dev
= arg
;
1490 struct ctcm_priv
*priv
;
1491 struct mpc_group
*grp
;
1493 struct channel
*wch
, *rch
;
1496 printk(KERN_INFO
"%s() dev=NULL\n", __FUNCTION__
);
1500 ctcm_pr_debug("ctcmpc enter: %s %s()\n", dev
->name
, __FUNCTION__
);
1504 grp
->flow_off_called
= 0;
1506 fsm_deltimer(&grp
->timer
);
1508 if (grp
->channels_terminating
)
1511 grp
->channels_terminating
= 1;
1513 grp
->saved_state
= fsm_getstate(grp
->fsm
);
1514 fsm_newstate(grp
->fsm
, MPCG_STATE_INOP
);
1515 if (grp
->saved_state
> MPCG_STATE_XID7INITF
)
1516 printk(KERN_NOTICE
"%s:MPC GROUP INOPERATIVE\n", dev
->name
);
1517 if ((grp
->saved_state
!= MPCG_STATE_RESET
) ||
1518 /* dealloc_channel has been called */
1519 ((grp
->saved_state
== MPCG_STATE_RESET
) &&
1520 (grp
->port_persist
== 0)))
1521 fsm_deltimer(&priv
->restart_timer
);
1523 wch
= priv
->channel
[WRITE
];
1524 rch
= priv
->channel
[READ
];
1526 switch (grp
->saved_state
) {
1527 case MPCG_STATE_RESET
:
1528 case MPCG_STATE_INOP
:
1529 case MPCG_STATE_XID2INITW
:
1530 case MPCG_STATE_XID0IOWAIT
:
1531 case MPCG_STATE_XID2INITX
:
1532 case MPCG_STATE_XID7INITW
:
1533 case MPCG_STATE_XID7INITX
:
1534 case MPCG_STATE_XID0IOWAIX
:
1535 case MPCG_STATE_XID7INITI
:
1536 case MPCG_STATE_XID7INITZ
:
1537 case MPCG_STATE_XID7INITF
:
1539 case MPCG_STATE_FLOWC
:
1540 case MPCG_STATE_READY
:
1542 tasklet_hi_schedule(&wch
->ch_disc_tasklet
);
1545 grp
->xid2_tgnum
= 0;
1546 grp
->group_max_buflen
= 0; /*min of all received */
1547 grp
->outstanding_xid2
= 0;
1548 grp
->outstanding_xid7
= 0;
1549 grp
->outstanding_xid7_p2
= 0;
1550 grp
->saved_xid2
= NULL
;
1552 grp
->changed_side
= 0;
1554 grp
->rcvd_xid_skb
->data
= grp
->rcvd_xid_data
;
1555 skb_reset_tail_pointer(grp
->rcvd_xid_skb
);
1556 grp
->rcvd_xid_skb
->len
= 0;
1557 grp
->rcvd_xid_th
= (struct th_header
*)grp
->rcvd_xid_skb
->data
;
1558 memcpy(skb_put(grp
->rcvd_xid_skb
, TH_HEADER_LENGTH
), &thnorm
,
1561 if (grp
->send_qllc_disc
== 1) {
1562 grp
->send_qllc_disc
= 0;
1563 rc
= mpc_send_qllc_discontact(dev
);
1566 /* DO NOT issue DEV_EVENT_STOP directly out of this code */
1567 /* This can result in INOP of VTAM PU due to halting of */
1568 /* outstanding IO which causes a sense to be returned */
1569 /* Only about 3 senses are allowed and then IOS/VTAM will*/
1570 /* ebcome unreachable without manual intervention */
1571 if ((grp
->port_persist
== 1) || (grp
->alloc_called
)) {
1572 grp
->alloc_called
= 0;
1573 fsm_deltimer(&priv
->restart_timer
);
1574 fsm_addtimer(&priv
->restart_timer
,
1578 fsm_newstate(grp
->fsm
, MPCG_STATE_RESET
);
1579 if (grp
->saved_state
> MPCG_STATE_XID7INITF
)
1580 printk(KERN_NOTICE
"%s:MPC GROUP RECOVERY SCHEDULED\n",
1583 fsm_deltimer(&priv
->restart_timer
);
1584 fsm_addtimer(&priv
->restart_timer
, 500, DEV_EVENT_STOP
, dev
);
1585 fsm_newstate(grp
->fsm
, MPCG_STATE_RESET
);
1586 printk(KERN_NOTICE
"%s:MPC GROUP RECOVERY NOT ATTEMPTED\n",
1591 ctcm_pr_debug("ctcmpc exit:%s %s()\n", dev
->name
, __FUNCTION__
);
1596 * Handle mpc group action timeout.
1597 * MPC Group Station FSM action
1598 * CTCM_PROTO_MPC only
1600 * fi An instance of an mpc_group fsm.
1601 * event The event, just happened.
1602 * arg Generic pointer, casted from net_device * upon call.
1604 static void mpc_action_timeout(fsm_instance
*fi
, int event
, void *arg
)
1606 struct net_device
*dev
= arg
;
1607 struct ctcm_priv
*priv
;
1608 struct mpc_group
*grp
;
1609 struct channel
*wch
;
1610 struct channel
*rch
;
1612 CTCM_DBF_TEXT(MPC_TRACE
, 6, __FUNCTION__
);
1615 CTCM_DBF_TEXT_(MPC_ERROR
, 4, "%s: dev=NULL\n", __FUNCTION__
);
1621 wch
= priv
->channel
[WRITE
];
1622 rch
= priv
->channel
[READ
];
1624 switch (fsm_getstate(grp
->fsm
)) {
1625 case MPCG_STATE_XID2INITW
:
1626 /* Unless there is outstanding IO on the */
1627 /* channel just return and wait for ATTN */
1628 /* interrupt to begin XID negotiations */
1629 if ((fsm_getstate(rch
->fsm
) == CH_XID0_PENDING
) &&
1630 (fsm_getstate(wch
->fsm
) == CH_XID0_PENDING
))
1633 fsm_event(grp
->fsm
, MPCG_EVENT_INOP
, dev
);
1636 CTCM_DBF_TEXT_(MPC_TRACE
, 6, "%s: dev=%s exit",
1637 __FUNCTION__
, dev
->name
);
1642 * MPC Group Station FSM action
1643 * CTCM_PROTO_MPC only
1645 void mpc_action_discontact(fsm_instance
*fi
, int event
, void *arg
)
1647 struct mpcg_info
*mpcginfo
= arg
;
1648 struct channel
*ch
= mpcginfo
->ch
;
1649 struct net_device
*dev
= ch
->netdev
;
1650 struct ctcm_priv
*priv
= dev
->priv
;
1651 struct mpc_group
*grp
= priv
->mpcg
;
1654 printk(KERN_INFO
"%s() ch=NULL\n", __FUNCTION__
);
1657 if (ch
->netdev
== NULL
) {
1658 printk(KERN_INFO
"%s() dev=NULL\n", __FUNCTION__
);
1662 ctcm_pr_debug("ctcmpc enter: %s %s()\n", dev
->name
, __FUNCTION__
);
1664 grp
->send_qllc_disc
= 1;
1665 fsm_event(grp
->fsm
, MPCG_EVENT_INOP
, dev
);
1667 ctcm_pr_debug("ctcmpc exit: %s %s()\n", dev
->name
, __FUNCTION__
);
1672 * MPC Group Station - not part of FSM
1673 * CTCM_PROTO_MPC only
1674 * called from add_channel in ctcm_main.c
1676 void mpc_action_send_discontact(unsigned long thischan
)
1679 struct net_device
*dev
;
1680 struct ctcm_priv
*priv
;
1681 struct mpc_group
*grp
;
1683 unsigned long saveflags
;
1685 ch
= (struct channel
*)thischan
;
1690 ctcm_pr_info("ctcmpc: %s cp:%i enter: %s() GrpState:%s ChState:%s\n",
1694 fsm_getstate_str(grp
->fsm
),
1695 fsm_getstate_str(ch
->fsm
));
1696 saveflags
= 0; /* avoids compiler warning with
1697 spin_unlock_irqrestore */
1699 spin_lock_irqsave(get_ccwdev_lock(ch
->cdev
), saveflags
);
1700 rc
= ccw_device_start(ch
->cdev
, &ch
->ccw
[15],
1701 (unsigned long)ch
, 0xff, 0);
1702 spin_unlock_irqrestore(get_ccwdev_lock(ch
->cdev
), saveflags
);
1705 ctcm_pr_info("ctcmpc: %s() ch:%s IO failed \n",
1708 ctcm_ccw_check_rc(ch
, rc
, "send discontact");
1709 /* Not checking return code value here */
1710 /* Making best effort to notify partner*/
1711 /* that MPC Group is going down */
1714 ctcm_pr_debug("ctcmpc exit: %s %s()\n", dev
->name
, __FUNCTION__
);
1720 * helper function of mpc FSM
1721 * CTCM_PROTO_MPC only
1722 * mpc_action_rcvd_xid7
1724 static int mpc_validate_xid(struct mpcg_info
*mpcginfo
)
1726 struct channel
*ch
= mpcginfo
->ch
;
1727 struct net_device
*dev
= ch
->netdev
;
1728 struct ctcm_priv
*priv
= dev
->priv
;
1729 struct mpc_group
*grp
= priv
->mpcg
;
1730 struct xid2
*xid
= mpcginfo
->xid
;
1733 __u64 our_id
, their_id
= 0;
1736 len
= TH_HEADER_LENGTH
+ PDU_HEADER_LENGTH
;
1738 ctcm_pr_debug("ctcmpc enter: %s()\n", __FUNCTION__
);
1740 if (mpcginfo
->xid
== NULL
) {
1741 printk(KERN_INFO
"%s() xid=NULL\n", __FUNCTION__
);
1746 ctcm_pr_debug("ctcmpc : %s xid received()\n", __FUNCTION__
);
1747 ctcmpc_dumpit((char *)mpcginfo
->xid
, XID2_LENGTH
);
1749 /*the received direction should be the opposite of ours */
1750 if (((CHANNEL_DIRECTION(ch
->flags
) == READ
) ? XID2_WRITE_SIDE
:
1751 XID2_READ_SIDE
) != xid
->xid2_dlc_type
) {
1753 printk(KERN_INFO
"ctcmpc:%s() XID REJECTED - READ-WRITE CH "
1754 "Pairing Invalid \n", __FUNCTION__
);
1757 if (xid
->xid2_dlc_type
== XID2_READ_SIDE
) {
1758 ctcm_pr_debug("ctcmpc: %s(): grpmaxbuf:%d xid2buflen:%d\n",
1759 __FUNCTION__
, grp
->group_max_buflen
,
1762 if (grp
->group_max_buflen
== 0 ||
1763 grp
->group_max_buflen
> xid
->xid2_buf_len
- len
)
1764 grp
->group_max_buflen
= xid
->xid2_buf_len
- len
;
1768 if (grp
->saved_xid2
== NULL
) {
1770 (struct xid2
*)skb_tail_pointer(grp
->rcvd_xid_skb
);
1772 memcpy(skb_put(grp
->rcvd_xid_skb
,
1773 XID2_LENGTH
), xid
, XID2_LENGTH
);
1774 grp
->rcvd_xid_skb
->data
= grp
->rcvd_xid_data
;
1776 skb_reset_tail_pointer(grp
->rcvd_xid_skb
);
1777 grp
->rcvd_xid_skb
->len
= 0;
1779 /* convert two 32 bit numbers into 1 64 bit for id compare */
1780 our_id
= (__u64
)priv
->xid
->xid2_adj_id
;
1781 our_id
= our_id
<< 32;
1782 our_id
= our_id
+ priv
->xid
->xid2_sender_id
;
1783 their_id
= (__u64
)xid
->xid2_adj_id
;
1784 their_id
= their_id
<< 32;
1785 their_id
= their_id
+ xid
->xid2_sender_id
;
1786 /* lower id assume the xside role */
1787 if (our_id
< their_id
) {
1789 ctcm_pr_debug("ctcmpc :%s() WE HAVE LOW ID-"
1790 "TAKE XSIDE\n", __FUNCTION__
);
1793 ctcm_pr_debug("ctcmpc :%s() WE HAVE HIGH ID-"
1794 "TAKE YSIDE\n", __FUNCTION__
);
1798 if (xid
->xid2_flag4
!= grp
->saved_xid2
->xid2_flag4
) {
1800 printk(KERN_INFO
"%s XID REJECTED - XID Flag Byte4\n",
1803 if (xid
->xid2_flag2
== 0x40) {
1805 printk(KERN_INFO
"%s XID REJECTED - XID NOGOOD\n",
1808 if (xid
->xid2_adj_id
!= grp
->saved_xid2
->xid2_adj_id
) {
1810 printk(KERN_INFO
"%s XID REJECTED - "
1811 "Adjacent Station ID Mismatch\n",
1814 if (xid
->xid2_sender_id
!= grp
->saved_xid2
->xid2_sender_id
) {
1816 printk(KERN_INFO
"%s XID REJECTED - "
1817 "Sender Address Mismatch\n", __FUNCTION__
);
1823 ctcm_pr_info("ctcmpc : %s() failed\n", __FUNCTION__
);
1824 priv
->xid
->xid2_flag2
= 0x40;
1825 grp
->saved_xid2
->xid2_flag2
= 0x40;
1831 ctcm_pr_debug("ctcmpc exit: %s()\n", __FUNCTION__
);
1836 * MPC Group Station FSM action
1837 * CTCM_PROTO_MPC only
1839 static void mpc_action_side_xid(fsm_instance
*fsm
, void *arg
, int side
)
1841 struct channel
*ch
= arg
;
1842 struct ctcm_priv
*priv
;
1843 struct mpc_group
*grp
= NULL
;
1844 struct net_device
*dev
= NULL
;
1847 unsigned long saveflags
= 0; /* avoids compiler warning with
1848 spin_unlock_irqrestore */
1851 printk(KERN_INFO
"%s ch=NULL\n", __FUNCTION__
);
1856 ctcm_pr_debug("ctcmpc enter: %s(): cp=%i ch=0x%p id=%s\n",
1857 __FUNCTION__
, smp_processor_id(), ch
, ch
->id
);
1861 printk(KERN_INFO
"%s dev=NULL\n", __FUNCTION__
);
1867 printk(KERN_INFO
"%s priv=NULL\n", __FUNCTION__
);
1873 printk(KERN_INFO
"%s grp=NULL\n", __FUNCTION__
);
1877 if (ctcm_checkalloc_buffer(ch
))
1880 /* skb data-buffer referencing: */
1882 ch
->trans_skb
->data
= ch
->trans_skb_data
;
1883 skb_reset_tail_pointer(ch
->trans_skb
);
1884 ch
->trans_skb
->len
= 0;
1885 /* result of the previous 3 statements is NOT always
1886 * already set after ctcm_checkalloc_buffer
1887 * because of possible reuse of the trans_skb
1889 memset(ch
->trans_skb
->data
, 0, 16);
1890 ch
->rcvd_xid_th
= (struct th_header
*)ch
->trans_skb_data
;
1891 /* check is main purpose here: */
1892 skb_put(ch
->trans_skb
, TH_HEADER_LENGTH
);
1893 ch
->rcvd_xid
= (struct xid2
*)skb_tail_pointer(ch
->trans_skb
);
1894 /* check is main purpose here: */
1895 skb_put(ch
->trans_skb
, XID2_LENGTH
);
1896 ch
->rcvd_xid_id
= skb_tail_pointer(ch
->trans_skb
);
1897 /* cleanup back to startpoint */
1898 ch
->trans_skb
->data
= ch
->trans_skb_data
;
1899 skb_reset_tail_pointer(ch
->trans_skb
);
1900 ch
->trans_skb
->len
= 0;
1902 /* non-checking rewrite of above skb data-buffer referencing: */
1904 memset(ch->trans_skb->data, 0, 16);
1905 ch->rcvd_xid_th = (struct th_header *)ch->trans_skb_data;
1906 ch->rcvd_xid = (struct xid2 *)(ch->trans_skb_data + TH_HEADER_LENGTH);
1907 ch->rcvd_xid_id = ch->trans_skb_data + TH_HEADER_LENGTH + XID2_LENGTH;
1910 ch
->ccw
[8].flags
= CCW_FLAG_SLI
| CCW_FLAG_CC
;
1911 ch
->ccw
[8].count
= 0;
1912 ch
->ccw
[8].cda
= 0x00;
1914 if (side
== XSIDE
) {
1915 /* mpc_action_xside_xid */
1916 if (ch
->xid_th
== NULL
) {
1917 printk(KERN_INFO
"%s ch->xid_th=NULL\n", __FUNCTION__
);
1920 ch
->ccw
[9].cmd_code
= CCW_CMD_WRITE
;
1921 ch
->ccw
[9].flags
= CCW_FLAG_SLI
| CCW_FLAG_CC
;
1922 ch
->ccw
[9].count
= TH_HEADER_LENGTH
;
1923 ch
->ccw
[9].cda
= virt_to_phys(ch
->xid_th
);
1925 if (ch
->xid
== NULL
) {
1926 printk(KERN_INFO
"%s ch->xid=NULL\n", __FUNCTION__
);
1930 ch
->ccw
[10].cmd_code
= CCW_CMD_WRITE
;
1931 ch
->ccw
[10].flags
= CCW_FLAG_SLI
| CCW_FLAG_CC
;
1932 ch
->ccw
[10].count
= XID2_LENGTH
;
1933 ch
->ccw
[10].cda
= virt_to_phys(ch
->xid
);
1935 ch
->ccw
[11].cmd_code
= CCW_CMD_READ
;
1936 ch
->ccw
[11].flags
= CCW_FLAG_SLI
| CCW_FLAG_CC
;
1937 ch
->ccw
[11].count
= TH_HEADER_LENGTH
;
1938 ch
->ccw
[11].cda
= virt_to_phys(ch
->rcvd_xid_th
);
1940 ch
->ccw
[12].cmd_code
= CCW_CMD_READ
;
1941 ch
->ccw
[12].flags
= CCW_FLAG_SLI
| CCW_FLAG_CC
;
1942 ch
->ccw
[12].count
= XID2_LENGTH
;
1943 ch
->ccw
[12].cda
= virt_to_phys(ch
->rcvd_xid
);
1945 ch
->ccw
[13].cmd_code
= CCW_CMD_READ
;
1946 ch
->ccw
[13].cda
= virt_to_phys(ch
->rcvd_xid_id
);
1948 } else { /* side == YSIDE : mpc_action_yside_xid */
1949 ch
->ccw
[9].cmd_code
= CCW_CMD_READ
;
1950 ch
->ccw
[9].flags
= CCW_FLAG_SLI
| CCW_FLAG_CC
;
1951 ch
->ccw
[9].count
= TH_HEADER_LENGTH
;
1952 ch
->ccw
[9].cda
= virt_to_phys(ch
->rcvd_xid_th
);
1954 ch
->ccw
[10].cmd_code
= CCW_CMD_READ
;
1955 ch
->ccw
[10].flags
= CCW_FLAG_SLI
| CCW_FLAG_CC
;
1956 ch
->ccw
[10].count
= XID2_LENGTH
;
1957 ch
->ccw
[10].cda
= virt_to_phys(ch
->rcvd_xid
);
1959 if (ch
->xid_th
== NULL
) {
1960 printk(KERN_INFO
"%s ch->xid_th=NULL\n", __FUNCTION__
);
1963 ch
->ccw
[11].cmd_code
= CCW_CMD_WRITE
;
1964 ch
->ccw
[11].flags
= CCW_FLAG_SLI
| CCW_FLAG_CC
;
1965 ch
->ccw
[11].count
= TH_HEADER_LENGTH
;
1966 ch
->ccw
[11].cda
= virt_to_phys(ch
->xid_th
);
1968 if (ch
->xid
== NULL
) {
1969 printk(KERN_INFO
"%s ch->xid=NULL\n", __FUNCTION__
);
1972 ch
->ccw
[12].cmd_code
= CCW_CMD_WRITE
;
1973 ch
->ccw
[12].flags
= CCW_FLAG_SLI
| CCW_FLAG_CC
;
1974 ch
->ccw
[12].count
= XID2_LENGTH
;
1975 ch
->ccw
[12].cda
= virt_to_phys(ch
->xid
);
1977 if (ch
->xid_id
== NULL
) {
1978 printk(KERN_INFO
"%s ch->xid_id=NULL\n", __FUNCTION__
);
1981 ch
->ccw
[13].cmd_code
= CCW_CMD_WRITE
;
1982 ch
->ccw
[13].cda
= virt_to_phys(ch
->xid_id
);
1985 ch
->ccw
[13].flags
= CCW_FLAG_SLI
| CCW_FLAG_CC
;
1986 ch
->ccw
[13].count
= 4;
1988 ch
->ccw
[14].cmd_code
= CCW_CMD_NOOP
;
1989 ch
->ccw
[14].flags
= CCW_FLAG_SLI
;
1990 ch
->ccw
[14].count
= 0;
1991 ch
->ccw
[14].cda
= 0;
1994 ctcmpc_dumpit((char *)&ch
->ccw
[8], sizeof(struct ccw1
) * 7);
1996 ctcmpc_dumpit((char *)ch
->xid_th
, TH_HEADER_LENGTH
);
1997 ctcmpc_dumpit((char *)ch
->xid
, XID2_LENGTH
);
1998 ctcmpc_dumpit((char *)ch
->xid_id
, 4);
2000 /* Such conditional locking is a known problem for
2001 * sparse because its static undeterministic.
2002 * Warnings should be ignored here. */
2003 spin_lock_irqsave(get_ccwdev_lock(ch
->cdev
), saveflags
);
2007 fsm_addtimer(&ch
->timer
, 5000 , CTC_EVENT_TIMER
, ch
);
2008 rc
= ccw_device_start(ch
->cdev
, &ch
->ccw
[8],
2009 (unsigned long)ch
, 0xff, 0);
2011 if (gotlock
) /* see remark above about conditional locking */
2012 spin_unlock_irqrestore(get_ccwdev_lock(ch
->cdev
), saveflags
);
2015 ctcm_pr_info("ctcmpc: %s() ch:%s IO failed \n",
2016 __FUNCTION__
, ch
->id
);
2017 ctcm_ccw_check_rc(ch
, rc
,
2018 (side
== XSIDE
) ? "x-side XID" : "y-side XID");
2023 ctcm_pr_debug("ctcmpc exit : %s(): ch=0x%p id=%s\n",
2024 __FUNCTION__
, ch
, ch
->id
);
2030 * MPC Group Station FSM action
2031 * CTCM_PROTO_MPC only
2033 static void mpc_action_xside_xid(fsm_instance
*fsm
, int event
, void *arg
)
2035 mpc_action_side_xid(fsm
, arg
, XSIDE
);
2039 * MPC Group Station FSM action
2040 * CTCM_PROTO_MPC only
2042 static void mpc_action_yside_xid(fsm_instance
*fsm
, int event
, void *arg
)
2044 mpc_action_side_xid(fsm
, arg
, YSIDE
);
2048 * MPC Group Station FSM action
2049 * CTCM_PROTO_MPC only
2051 static void mpc_action_doxid0(fsm_instance
*fsm
, int event
, void *arg
)
2053 struct channel
*ch
= arg
;
2054 struct ctcm_priv
*priv
;
2055 struct mpc_group
*grp
= NULL
;
2056 struct net_device
*dev
= NULL
;
2059 ctcm_pr_debug("ctcmpc enter: %s(): cp=%i ch=0x%p id=%s\n",
2060 __FUNCTION__
, smp_processor_id(), ch
, ch
->id
);
2063 printk(KERN_WARNING
"%s ch=NULL\n", __FUNCTION__
);
2069 printk(KERN_WARNING
"%s dev=NULL\n", __FUNCTION__
);
2075 printk(KERN_WARNING
"%s priv=NULL\n", __FUNCTION__
);
2081 printk(KERN_WARNING
"%s grp=NULL\n", __FUNCTION__
);
2085 if (ch
->xid
== NULL
) {
2086 printk(KERN_WARNING
"%s ch-xid=NULL\n", __FUNCTION__
);
2090 fsm_newstate(ch
->fsm
, CH_XID0_INPROGRESS
);
2092 ch
->xid
->xid2_option
= XID2_0
;
2094 switch (fsm_getstate(grp
->fsm
)) {
2095 case MPCG_STATE_XID2INITW
:
2096 case MPCG_STATE_XID2INITX
:
2097 ch
->ccw
[8].cmd_code
= CCW_CMD_SENSE_CMD
;
2099 case MPCG_STATE_XID0IOWAIT
:
2100 case MPCG_STATE_XID0IOWAIX
:
2101 ch
->ccw
[8].cmd_code
= CCW_CMD_WRITE_CTL
;
2105 fsm_event(grp
->fsm
, MPCG_EVENT_DOIO
, ch
);
2109 ctcm_pr_debug("ctcmpc exit : %s(): ch=0x%p id=%s\n",
2110 __FUNCTION__
, ch
, ch
->id
);
2116 * MPC Group Station FSM action
2117 * CTCM_PROTO_MPC only
2119 static void mpc_action_doxid7(fsm_instance
*fsm
, int event
, void *arg
)
2121 struct net_device
*dev
= arg
;
2122 struct ctcm_priv
*priv
= NULL
;
2123 struct mpc_group
*grp
= NULL
;
2128 ctcm_pr_debug("ctcmpc enter: %s() \n", __FUNCTION__
);
2131 printk(KERN_INFO
"%s dev=NULL \n", __FUNCTION__
);
2138 printk(KERN_INFO
"%s priv=NULL \n", __FUNCTION__
);
2145 printk(KERN_INFO
"%s grp=NULL \n", __FUNCTION__
);
2150 for (direction
= READ
; direction
<= WRITE
; direction
++) {
2151 struct channel
*ch
= priv
->channel
[direction
];
2152 struct xid2
*thisxid
= ch
->xid
;
2153 ch
->xid_skb
->data
= ch
->xid_skb_data
;
2154 skb_reset_tail_pointer(ch
->xid_skb
);
2155 ch
->xid_skb
->len
= 0;
2156 thisxid
->xid2_option
= XID2_7
;
2160 if (grp
->outstanding_xid7_p2
> 0) {
2161 if (grp
->roll
== YSIDE
) {
2162 if (fsm_getstate(ch
->fsm
) == CH_XID7_PENDING1
) {
2163 fsm_newstate(ch
->fsm
, CH_XID7_PENDING2
);
2164 ch
->ccw
[8].cmd_code
= CCW_CMD_SENSE_CMD
;
2165 memcpy(skb_put(ch
->xid_skb
,
2167 &thdummy
, TH_HEADER_LENGTH
);
2170 } else if (fsm_getstate(ch
->fsm
) < CH_XID7_PENDING2
) {
2171 fsm_newstate(ch
->fsm
, CH_XID7_PENDING2
);
2172 ch
->ccw
[8].cmd_code
= CCW_CMD_WRITE_CTL
;
2173 memcpy(skb_put(ch
->xid_skb
,
2175 &thnorm
, TH_HEADER_LENGTH
);
2180 if (grp
->roll
== YSIDE
) {
2181 if (fsm_getstate(ch
->fsm
) < CH_XID7_PENDING4
) {
2182 fsm_newstate(ch
->fsm
, CH_XID7_PENDING4
);
2183 memcpy(skb_put(ch
->xid_skb
,
2185 &thnorm
, TH_HEADER_LENGTH
);
2186 ch
->ccw
[8].cmd_code
= CCW_CMD_WRITE_CTL
;
2189 } else if (fsm_getstate(ch
->fsm
) == CH_XID7_PENDING3
) {
2190 fsm_newstate(ch
->fsm
, CH_XID7_PENDING4
);
2191 ch
->ccw
[8].cmd_code
= CCW_CMD_SENSE_CMD
;
2192 memcpy(skb_put(ch
->xid_skb
, TH_HEADER_LENGTH
),
2193 &thdummy
, TH_HEADER_LENGTH
);
2199 fsm_event(grp
->fsm
, MPCG_EVENT_DOIO
, ch
);
2205 fsm_event(grp
->fsm
, MPCG_EVENT_INOP
, dev
);
2211 * MPC Group Station FSM action
2212 * CTCM_PROTO_MPC only
2214 static void mpc_action_rcvd_xid0(fsm_instance
*fsm
, int event
, void *arg
)
2217 struct mpcg_info
*mpcginfo
= arg
;
2218 struct channel
*ch
= mpcginfo
->ch
;
2219 struct net_device
*dev
= ch
->netdev
;
2220 struct ctcm_priv
*priv
;
2221 struct mpc_group
*grp
;
2224 ctcm_pr_debug("ctcmpc enter: %s(): cp=%i ch=0x%p id=%s\n",
2225 __FUNCTION__
, smp_processor_id(), ch
, ch
->id
);
2230 ctcm_pr_debug("ctcmpc in:%s() %s xid2:%i xid7:%i xidt_p2:%i \n",
2231 __FUNCTION__
, ch
->id
,
2232 grp
->outstanding_xid2
,
2233 grp
->outstanding_xid7
,
2234 grp
->outstanding_xid7_p2
);
2236 if (fsm_getstate(ch
->fsm
) < CH_XID7_PENDING
)
2237 fsm_newstate(ch
->fsm
, CH_XID7_PENDING
);
2239 grp
->outstanding_xid2
--;
2240 grp
->outstanding_xid7
++;
2241 grp
->outstanding_xid7_p2
++;
2243 /* must change state before validating xid to */
2244 /* properly handle interim interrupts received*/
2245 switch (fsm_getstate(grp
->fsm
)) {
2246 case MPCG_STATE_XID2INITW
:
2247 fsm_newstate(grp
->fsm
, MPCG_STATE_XID2INITX
);
2248 mpc_validate_xid(mpcginfo
);
2250 case MPCG_STATE_XID0IOWAIT
:
2251 fsm_newstate(grp
->fsm
, MPCG_STATE_XID0IOWAIX
);
2252 mpc_validate_xid(mpcginfo
);
2254 case MPCG_STATE_XID2INITX
:
2255 if (grp
->outstanding_xid2
== 0) {
2256 fsm_newstate(grp
->fsm
, MPCG_STATE_XID7INITW
);
2257 mpc_validate_xid(mpcginfo
);
2258 fsm_event(grp
->fsm
, MPCG_EVENT_XID2DONE
, dev
);
2261 case MPCG_STATE_XID0IOWAIX
:
2262 if (grp
->outstanding_xid2
== 0) {
2263 fsm_newstate(grp
->fsm
, MPCG_STATE_XID7INITI
);
2264 mpc_validate_xid(mpcginfo
);
2265 fsm_event(grp
->fsm
, MPCG_EVENT_XID2DONE
, dev
);
2272 ctcm_pr_debug("ctcmpc:%s() %s xid2:%i xid7:%i xidt_p2:%i \n",
2273 __FUNCTION__
, ch
->id
,
2274 grp
->outstanding_xid2
,
2275 grp
->outstanding_xid7
,
2276 grp
->outstanding_xid7_p2
);
2277 ctcm_pr_debug("ctcmpc:%s() %s grpstate: %s chanstate: %s \n",
2278 __FUNCTION__
, ch
->id
,
2279 fsm_getstate_str(grp
->fsm
),
2280 fsm_getstate_str(ch
->fsm
));
2288 * MPC Group Station FSM action
2289 * CTCM_PROTO_MPC only
2291 static void mpc_action_rcvd_xid7(fsm_instance
*fsm
, int event
, void *arg
)
2293 struct mpcg_info
*mpcginfo
= arg
;
2294 struct channel
*ch
= mpcginfo
->ch
;
2295 struct net_device
*dev
= ch
->netdev
;
2296 struct ctcm_priv
*priv
= dev
->priv
;
2297 struct mpc_group
*grp
= priv
->mpcg
;
2300 ctcm_pr_debug("ctcmpc enter: %s(): cp=%i ch=0x%p id=%s\n",
2301 __FUNCTION__
, smp_processor_id(), ch
, ch
->id
);
2303 ctcm_pr_debug("ctcmpc: outstanding_xid7: %i, "
2304 " outstanding_xid7_p2: %i\n",
2305 grp
->outstanding_xid7
,
2306 grp
->outstanding_xid7_p2
);
2309 grp
->outstanding_xid7
--;
2310 ch
->xid_skb
->data
= ch
->xid_skb_data
;
2311 skb_reset_tail_pointer(ch
->xid_skb
);
2312 ch
->xid_skb
->len
= 0;
2314 switch (fsm_getstate(grp
->fsm
)) {
2315 case MPCG_STATE_XID7INITI
:
2316 fsm_newstate(grp
->fsm
, MPCG_STATE_XID7INITZ
);
2317 mpc_validate_xid(mpcginfo
);
2319 case MPCG_STATE_XID7INITW
:
2320 fsm_newstate(grp
->fsm
, MPCG_STATE_XID7INITX
);
2321 mpc_validate_xid(mpcginfo
);
2323 case MPCG_STATE_XID7INITZ
:
2324 case MPCG_STATE_XID7INITX
:
2325 if (grp
->outstanding_xid7
== 0) {
2326 if (grp
->outstanding_xid7_p2
> 0) {
2327 grp
->outstanding_xid7
=
2328 grp
->outstanding_xid7_p2
;
2329 grp
->outstanding_xid7_p2
= 0;
2331 fsm_newstate(grp
->fsm
, MPCG_STATE_XID7INITF
);
2333 mpc_validate_xid(mpcginfo
);
2334 fsm_event(grp
->fsm
, MPCG_EVENT_XID7DONE
, dev
);
2337 mpc_validate_xid(mpcginfo
);
2344 ctcm_pr_debug("ctcmpc exit: %s(): cp=%i ch=0x%p id=%s\n",
2345 __FUNCTION__
, smp_processor_id(), ch
, ch
->id
);
2351 * mpc_action helper of an MPC Group Station FSM action
2352 * CTCM_PROTO_MPC only
2354 static int mpc_send_qllc_discontact(struct net_device
*dev
)
2358 struct sk_buff
*skb
;
2359 struct qllc
*qllcptr
;
2360 struct ctcm_priv
*priv
;
2361 struct mpc_group
*grp
;
2363 ctcm_pr_debug("ctcmpc enter: %s()\n", __FUNCTION__
);
2366 printk(KERN_INFO
"%s() dev=NULL\n", __FUNCTION__
);
2373 printk(KERN_INFO
"%s() priv=NULL\n", __FUNCTION__
);
2380 printk(KERN_INFO
"%s() grp=NULL\n", __FUNCTION__
);
2384 ctcm_pr_info("ctcmpc: %s() GROUP STATE: %s\n", __FUNCTION__
,
2385 mpcg_state_names
[grp
->saved_state
]);
2387 switch (grp
->saved_state
) {
2389 * establish conn callback function is
2390 * preferred method to report failure
2392 case MPCG_STATE_XID0IOWAIT
:
2393 case MPCG_STATE_XID0IOWAIX
:
2394 case MPCG_STATE_XID7INITI
:
2395 case MPCG_STATE_XID7INITZ
:
2396 case MPCG_STATE_XID2INITW
:
2397 case MPCG_STATE_XID2INITX
:
2398 case MPCG_STATE_XID7INITW
:
2399 case MPCG_STATE_XID7INITX
:
2400 if (grp
->estconnfunc
) {
2401 grp
->estconnfunc(grp
->port_num
, -1, 0);
2402 grp
->estconnfunc
= NULL
;
2405 case MPCG_STATE_FLOWC
:
2406 case MPCG_STATE_READY
:
2407 grp
->send_qllc_disc
= 2;
2408 new_len
= sizeof(struct qllc
);
2409 qllcptr
= kzalloc(new_len
, gfp_type() | GFP_DMA
);
2410 if (qllcptr
== NULL
) {
2412 "ctcmpc: Out of memory in %s()\n",
2418 qllcptr
->qllc_address
= 0xcc;
2419 qllcptr
->qllc_commands
= 0x03;
2421 skb
= __dev_alloc_skb(new_len
, GFP_ATOMIC
);
2424 printk(KERN_INFO
"%s Out of memory in mpc_send_qllc\n",
2426 priv
->stats
.rx_dropped
++;
2432 memcpy(skb_put(skb
, new_len
), qllcptr
, new_len
);
2435 if (skb_headroom(skb
) < 4) {
2436 printk(KERN_INFO
"ctcmpc: %s() Unable to"
2437 " build discontact for %s\n",
2438 __FUNCTION__
, dev
->name
);
2440 dev_kfree_skb_any(skb
);
2444 *((__u32
*)skb_push(skb
, 4)) = priv
->channel
[READ
]->pdu_seq
;
2445 priv
->channel
[READ
]->pdu_seq
++;
2447 ctcm_pr_debug("ctcmpc: %s ToDCM_pdu_seq= %08x\n",
2448 __FUNCTION__
, priv
->channel
[READ
]->pdu_seq
);
2450 /* receipt of CC03 resets anticipated sequence number on
2452 priv
->channel
[READ
]->pdu_seq
= 0x00;
2453 skb_reset_mac_header(skb
);
2455 skb
->protocol
= htons(ETH_P_SNAP
);
2456 skb
->ip_summed
= CHECKSUM_UNNECESSARY
;
2458 ctcmpc_dumpit((char *)skb
->data
, (sizeof(struct qllc
) + 4));
2468 ctcm_pr_debug("ctcmpc exit: %s()\n", __FUNCTION__
);
2471 /* --- This is the END my friend --- */