[PATCH] s390: email-address change
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / s390 / net / ctcmain.c
blob1901feef07d9a83d7df43447c5c32ee13924cf04
1 /*
2 * $Id: ctcmain.c,v 1.79 2006/01/11 11:32:18 cohuck Exp $
4 * CTC / ESCON network driver
6 * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
7 * Author(s): Fritz Elfert (elfert@de.ibm.com, felfert@millenux.com)
8 * Fixes by : Jochen Röhrig (roehrig@de.ibm.com)
9 * Arnaldo Carvalho de Melo <acme@conectiva.com.br>
10 Peter Tiedemann (ptiedem@de.ibm.com)
11 * Driver Model stuff by : Cornelia Huck <huckc@de.ibm.com>
13 * Documentation used:
14 * - Principles of Operation (IBM doc#: SA22-7201-06)
15 * - Common IO/-Device Commands and Self Description (IBM doc#: SA22-7204-02)
16 * - Common IO/-Device Commands and Self Description (IBM doc#: SN22-5535)
17 * - ESCON Channel-to-Channel Adapter (IBM doc#: SA22-7203-00)
18 * - ESCON I/O Interface (IBM doc#: SA22-7202-029
20 * and the source of the original CTC driver by:
21 * Dieter Wellerdiek (wel@de.ibm.com)
22 * Martin Schwidefsky (schwidefsky@de.ibm.com)
23 * Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
24 * Jochen Röhrig (roehrig@de.ibm.com)
26 * This program is free software; you can redistribute it and/or modify
27 * it under the terms of the GNU General Public License as published by
28 * the Free Software Foundation; either version 2, or (at your option)
29 * any later version.
31 * This program is distributed in the hope that it will be useful,
32 * but WITHOUT ANY WARRANTY; without even the implied warranty of
33 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
34 * GNU General Public License for more details.
36 * You should have received a copy of the GNU General Public License
37 * along with this program; if not, write to the Free Software
38 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
40 * RELEASE-TAG: CTC/ESCON network driver $Revision: 1.79 $
43 #undef DEBUG
44 #include <linux/module.h>
45 #include <linux/init.h>
46 #include <linux/kernel.h>
47 #include <linux/slab.h>
48 #include <linux/errno.h>
49 #include <linux/types.h>
50 #include <linux/interrupt.h>
51 #include <linux/timer.h>
52 #include <linux/sched.h>
53 #include <linux/bitops.h>
55 #include <linux/signal.h>
56 #include <linux/string.h>
58 #include <linux/ip.h>
59 #include <linux/if_arp.h>
60 #include <linux/tcp.h>
61 #include <linux/skbuff.h>
62 #include <linux/ctype.h>
63 #include <net/dst.h>
65 #include <asm/io.h>
66 #include <asm/ccwdev.h>
67 #include <asm/ccwgroup.h>
68 #include <asm/uaccess.h>
70 #include <asm/idals.h>
72 #include "ctctty.h"
73 #include "fsm.h"
74 #include "cu3088.h"
76 #include "ctcdbug.h"
77 #include "ctcmain.h"
79 MODULE_AUTHOR("(C) 2000 IBM Corp. by Fritz Elfert (felfert@millenux.com)");
80 MODULE_DESCRIPTION("Linux for S/390 CTC/Escon Driver");
81 MODULE_LICENSE("GPL");
82 /**
83 * States of the interface statemachine.
85 enum dev_states {
86 DEV_STATE_STOPPED,
87 DEV_STATE_STARTWAIT_RXTX,
88 DEV_STATE_STARTWAIT_RX,
89 DEV_STATE_STARTWAIT_TX,
90 DEV_STATE_STOPWAIT_RXTX,
91 DEV_STATE_STOPWAIT_RX,
92 DEV_STATE_STOPWAIT_TX,
93 DEV_STATE_RUNNING,
94 /**
95 * MUST be always the last element!!
97 CTC_NR_DEV_STATES
100 static const char *dev_state_names[] = {
101 "Stopped",
102 "StartWait RXTX",
103 "StartWait RX",
104 "StartWait TX",
105 "StopWait RXTX",
106 "StopWait RX",
107 "StopWait TX",
108 "Running",
112 * Events of the interface statemachine.
114 enum dev_events {
115 DEV_EVENT_START,
116 DEV_EVENT_STOP,
117 DEV_EVENT_RXUP,
118 DEV_EVENT_TXUP,
119 DEV_EVENT_RXDOWN,
120 DEV_EVENT_TXDOWN,
121 DEV_EVENT_RESTART,
123 * MUST be always the last element!!
125 CTC_NR_DEV_EVENTS
128 static const char *dev_event_names[] = {
129 "Start",
130 "Stop",
131 "RX up",
132 "TX up",
133 "RX down",
134 "TX down",
135 "Restart",
139 * Events of the channel statemachine
141 enum ch_events {
143 * Events, representing return code of
144 * I/O operations (ccw_device_start, ccw_device_halt et al.)
146 CH_EVENT_IO_SUCCESS,
147 CH_EVENT_IO_EBUSY,
148 CH_EVENT_IO_ENODEV,
149 CH_EVENT_IO_EIO,
150 CH_EVENT_IO_UNKNOWN,
152 CH_EVENT_ATTNBUSY,
153 CH_EVENT_ATTN,
154 CH_EVENT_BUSY,
157 * Events, representing unit-check
159 CH_EVENT_UC_RCRESET,
160 CH_EVENT_UC_RSRESET,
161 CH_EVENT_UC_TXTIMEOUT,
162 CH_EVENT_UC_TXPARITY,
163 CH_EVENT_UC_HWFAIL,
164 CH_EVENT_UC_RXPARITY,
165 CH_EVENT_UC_ZERO,
166 CH_EVENT_UC_UNKNOWN,
169 * Events, representing subchannel-check
171 CH_EVENT_SC_UNKNOWN,
174 * Events, representing machine checks
176 CH_EVENT_MC_FAIL,
177 CH_EVENT_MC_GOOD,
180 * Event, representing normal IRQ
182 CH_EVENT_IRQ,
183 CH_EVENT_FINSTAT,
186 * Event, representing timer expiry.
188 CH_EVENT_TIMER,
191 * Events, representing commands from upper levels.
193 CH_EVENT_START,
194 CH_EVENT_STOP,
197 * MUST be always the last element!!
199 NR_CH_EVENTS,
203 * States of the channel statemachine.
205 enum ch_states {
207 * Channel not assigned to any device,
208 * initial state, direction invalid
210 CH_STATE_IDLE,
213 * Channel assigned but not operating
215 CH_STATE_STOPPED,
216 CH_STATE_STARTWAIT,
217 CH_STATE_STARTRETRY,
218 CH_STATE_SETUPWAIT,
219 CH_STATE_RXINIT,
220 CH_STATE_TXINIT,
221 CH_STATE_RX,
222 CH_STATE_TX,
223 CH_STATE_RXIDLE,
224 CH_STATE_TXIDLE,
225 CH_STATE_RXERR,
226 CH_STATE_TXERR,
227 CH_STATE_TERM,
228 CH_STATE_DTERM,
229 CH_STATE_NOTOP,
232 * MUST be always the last element!!
234 NR_CH_STATES,
237 static int loglevel = CTC_LOGLEVEL_DEFAULT;
240 * Linked list of all detected channels.
242 static struct channel *channels = NULL;
245 * Print Banner.
247 static void
248 print_banner(void)
250 static int printed = 0;
251 char vbuf[] = "$Revision: 1.79 $";
252 char *version = vbuf;
254 if (printed)
255 return;
256 if ((version = strchr(version, ':'))) {
257 char *p = strchr(version + 1, '$');
258 if (p)
259 *p = '\0';
260 } else
261 version = " ??? ";
262 printk(KERN_INFO "CTC driver Version%s"
263 #ifdef DEBUG
264 " (DEBUG-VERSION, " __DATE__ __TIME__ ")"
265 #endif
266 " initialized\n", version);
267 printed = 1;
271 * Return type of a detected device.
273 static enum channel_types
274 get_channel_type(struct ccw_device_id *id)
276 enum channel_types type = (enum channel_types) id->driver_info;
278 if (type == channel_type_ficon)
279 type = channel_type_escon;
281 return type;
284 static const char *ch_event_names[] = {
285 "ccw_device success",
286 "ccw_device busy",
287 "ccw_device enodev",
288 "ccw_device ioerr",
289 "ccw_device unknown",
291 "Status ATTN & BUSY",
292 "Status ATTN",
293 "Status BUSY",
295 "Unit check remote reset",
296 "Unit check remote system reset",
297 "Unit check TX timeout",
298 "Unit check TX parity",
299 "Unit check Hardware failure",
300 "Unit check RX parity",
301 "Unit check ZERO",
302 "Unit check Unknown",
304 "SubChannel check Unknown",
306 "Machine check failure",
307 "Machine check operational",
309 "IRQ normal",
310 "IRQ final",
312 "Timer",
314 "Start",
315 "Stop",
318 static const char *ch_state_names[] = {
319 "Idle",
320 "Stopped",
321 "StartWait",
322 "StartRetry",
323 "SetupWait",
324 "RX init",
325 "TX init",
326 "RX",
327 "TX",
328 "RX idle",
329 "TX idle",
330 "RX error",
331 "TX error",
332 "Terminating",
333 "Restarting",
334 "Not operational",
337 #ifdef DEBUG
339 * Dump header and first 16 bytes of an sk_buff for debugging purposes.
341 * @param skb The sk_buff to dump.
342 * @param offset Offset relative to skb-data, where to start the dump.
344 static void
345 ctc_dump_skb(struct sk_buff *skb, int offset)
347 unsigned char *p = skb->data;
348 __u16 bl;
349 struct ll_header *header;
350 int i;
352 if (!(loglevel & CTC_LOGLEVEL_DEBUG))
353 return;
354 p += offset;
355 bl = *((__u16 *) p);
356 p += 2;
357 header = (struct ll_header *) p;
358 p -= 2;
360 printk(KERN_DEBUG "dump:\n");
361 printk(KERN_DEBUG "blocklen=%d %04x\n", bl, bl);
363 printk(KERN_DEBUG "h->length=%d %04x\n", header->length,
364 header->length);
365 printk(KERN_DEBUG "h->type=%04x\n", header->type);
366 printk(KERN_DEBUG "h->unused=%04x\n", header->unused);
367 if (bl > 16)
368 bl = 16;
369 printk(KERN_DEBUG "data: ");
370 for (i = 0; i < bl; i++)
371 printk("%02x%s", *p++, (i % 16) ? " " : "\n<7>");
372 printk("\n");
374 #else
375 static inline void
376 ctc_dump_skb(struct sk_buff *skb, int offset)
379 #endif
382 * Unpack a just received skb and hand it over to
383 * upper layers.
385 * @param ch The channel where this skb has been received.
386 * @param pskb The received skb.
388 static __inline__ void
389 ctc_unpack_skb(struct channel *ch, struct sk_buff *pskb)
391 struct net_device *dev = ch->netdev;
392 struct ctc_priv *privptr = (struct ctc_priv *) dev->priv;
393 __u16 len = *((__u16 *) pskb->data);
395 DBF_TEXT(trace, 4, __FUNCTION__);
396 skb_put(pskb, 2 + LL_HEADER_LENGTH);
397 skb_pull(pskb, 2);
398 pskb->dev = dev;
399 pskb->ip_summed = CHECKSUM_UNNECESSARY;
400 while (len > 0) {
401 struct sk_buff *skb;
402 struct ll_header *header = (struct ll_header *) pskb->data;
404 skb_pull(pskb, LL_HEADER_LENGTH);
405 if ((ch->protocol == CTC_PROTO_S390) &&
406 (header->type != ETH_P_IP)) {
408 #ifndef DEBUG
409 if (!(ch->logflags & LOG_FLAG_ILLEGALPKT)) {
410 #endif
412 * Check packet type only if we stick strictly
413 * to S/390's protocol of OS390. This only
414 * supports IP. Otherwise allow any packet
415 * type.
417 ctc_pr_warn(
418 "%s Illegal packet type 0x%04x received, dropping\n",
419 dev->name, header->type);
420 ch->logflags |= LOG_FLAG_ILLEGALPKT;
421 #ifndef DEBUG
423 #endif
424 #ifdef DEBUG
425 ctc_dump_skb(pskb, -6);
426 #endif
427 privptr->stats.rx_dropped++;
428 privptr->stats.rx_frame_errors++;
429 return;
431 pskb->protocol = ntohs(header->type);
432 if (header->length <= LL_HEADER_LENGTH) {
433 #ifndef DEBUG
434 if (!(ch->logflags & LOG_FLAG_ILLEGALSIZE)) {
435 #endif
436 ctc_pr_warn(
437 "%s Illegal packet size %d "
438 "received (MTU=%d blocklen=%d), "
439 "dropping\n", dev->name, header->length,
440 dev->mtu, len);
441 ch->logflags |= LOG_FLAG_ILLEGALSIZE;
442 #ifndef DEBUG
444 #endif
445 #ifdef DEBUG
446 ctc_dump_skb(pskb, -6);
447 #endif
448 privptr->stats.rx_dropped++;
449 privptr->stats.rx_length_errors++;
450 return;
452 header->length -= LL_HEADER_LENGTH;
453 len -= LL_HEADER_LENGTH;
454 if ((header->length > skb_tailroom(pskb)) ||
455 (header->length > len)) {
456 #ifndef DEBUG
457 if (!(ch->logflags & LOG_FLAG_OVERRUN)) {
458 #endif
459 ctc_pr_warn(
460 "%s Illegal packet size %d "
461 "(beyond the end of received data), "
462 "dropping\n", dev->name, header->length);
463 ch->logflags |= LOG_FLAG_OVERRUN;
464 #ifndef DEBUG
466 #endif
467 #ifdef DEBUG
468 ctc_dump_skb(pskb, -6);
469 #endif
470 privptr->stats.rx_dropped++;
471 privptr->stats.rx_length_errors++;
472 return;
474 skb_put(pskb, header->length);
475 pskb->mac.raw = pskb->data;
476 len -= header->length;
477 skb = dev_alloc_skb(pskb->len);
478 if (!skb) {
479 #ifndef DEBUG
480 if (!(ch->logflags & LOG_FLAG_NOMEM)) {
481 #endif
482 ctc_pr_warn(
483 "%s Out of memory in ctc_unpack_skb\n",
484 dev->name);
485 ch->logflags |= LOG_FLAG_NOMEM;
486 #ifndef DEBUG
488 #endif
489 privptr->stats.rx_dropped++;
490 return;
492 memcpy(skb_put(skb, pskb->len), pskb->data, pskb->len);
493 skb->mac.raw = skb->data;
494 skb->dev = pskb->dev;
495 skb->protocol = pskb->protocol;
496 pskb->ip_summed = CHECKSUM_UNNECESSARY;
497 if (ch->protocol == CTC_PROTO_LINUX_TTY)
498 ctc_tty_netif_rx(skb);
499 else
500 netif_rx_ni(skb);
502 * Successful rx; reset logflags
504 ch->logflags = 0;
505 dev->last_rx = jiffies;
506 privptr->stats.rx_packets++;
507 privptr->stats.rx_bytes += skb->len;
508 if (len > 0) {
509 skb_pull(pskb, header->length);
510 if (skb_tailroom(pskb) < LL_HEADER_LENGTH) {
511 #ifndef DEBUG
512 if (!(ch->logflags & LOG_FLAG_OVERRUN)) {
513 #endif
514 ctc_pr_warn(
515 "%s Overrun in ctc_unpack_skb\n",
516 dev->name);
517 ch->logflags |= LOG_FLAG_OVERRUN;
518 #ifndef DEBUG
520 #endif
521 return;
523 skb_put(pskb, LL_HEADER_LENGTH);
529 * Check return code of a preceeding ccw_device call, halt_IO etc...
531 * @param ch The channel, the error belongs to.
532 * @param return_code The error code to inspect.
534 static void inline
535 ccw_check_return_code(struct channel *ch, int return_code, char *msg)
537 DBF_TEXT(trace, 5, __FUNCTION__);
538 switch (return_code) {
539 case 0:
540 fsm_event(ch->fsm, CH_EVENT_IO_SUCCESS, ch);
541 break;
542 case -EBUSY:
543 ctc_pr_warn("%s (%s): Busy !\n", ch->id, msg);
544 fsm_event(ch->fsm, CH_EVENT_IO_EBUSY, ch);
545 break;
546 case -ENODEV:
547 ctc_pr_emerg("%s (%s): Invalid device called for IO\n",
548 ch->id, msg);
549 fsm_event(ch->fsm, CH_EVENT_IO_ENODEV, ch);
550 break;
551 case -EIO:
552 ctc_pr_emerg("%s (%s): Status pending... \n",
553 ch->id, msg);
554 fsm_event(ch->fsm, CH_EVENT_IO_EIO, ch);
555 break;
556 default:
557 ctc_pr_emerg("%s (%s): Unknown error in do_IO %04x\n",
558 ch->id, msg, return_code);
559 fsm_event(ch->fsm, CH_EVENT_IO_UNKNOWN, ch);
564 * Check sense of a unit check.
566 * @param ch The channel, the sense code belongs to.
567 * @param sense The sense code to inspect.
569 static void inline
570 ccw_unit_check(struct channel *ch, unsigned char sense)
572 DBF_TEXT(trace, 5, __FUNCTION__);
573 if (sense & SNS0_INTERVENTION_REQ) {
574 if (sense & 0x01) {
575 if (ch->protocol != CTC_PROTO_LINUX_TTY)
576 ctc_pr_debug("%s: Interface disc. or Sel. reset "
577 "(remote)\n", ch->id);
578 fsm_event(ch->fsm, CH_EVENT_UC_RCRESET, ch);
579 } else {
580 ctc_pr_debug("%s: System reset (remote)\n", ch->id);
581 fsm_event(ch->fsm, CH_EVENT_UC_RSRESET, ch);
583 } else if (sense & SNS0_EQUIPMENT_CHECK) {
584 if (sense & SNS0_BUS_OUT_CHECK) {
585 ctc_pr_warn("%s: Hardware malfunction (remote)\n",
586 ch->id);
587 fsm_event(ch->fsm, CH_EVENT_UC_HWFAIL, ch);
588 } else {
589 ctc_pr_warn("%s: Read-data parity error (remote)\n",
590 ch->id);
591 fsm_event(ch->fsm, CH_EVENT_UC_RXPARITY, ch);
593 } else if (sense & SNS0_BUS_OUT_CHECK) {
594 if (sense & 0x04) {
595 ctc_pr_warn("%s: Data-streaming timeout)\n", ch->id);
596 fsm_event(ch->fsm, CH_EVENT_UC_TXTIMEOUT, ch);
597 } else {
598 ctc_pr_warn("%s: Data-transfer parity error\n", ch->id);
599 fsm_event(ch->fsm, CH_EVENT_UC_TXPARITY, ch);
601 } else if (sense & SNS0_CMD_REJECT) {
602 ctc_pr_warn("%s: Command reject\n", ch->id);
603 } else if (sense == 0) {
604 ctc_pr_debug("%s: Unit check ZERO\n", ch->id);
605 fsm_event(ch->fsm, CH_EVENT_UC_ZERO, ch);
606 } else {
607 ctc_pr_warn("%s: Unit Check with sense code: %02x\n",
608 ch->id, sense);
609 fsm_event(ch->fsm, CH_EVENT_UC_UNKNOWN, ch);
613 static void
614 ctc_purge_skb_queue(struct sk_buff_head *q)
616 struct sk_buff *skb;
618 DBF_TEXT(trace, 5, __FUNCTION__);
620 while ((skb = skb_dequeue(q))) {
621 atomic_dec(&skb->users);
622 dev_kfree_skb_irq(skb);
626 static __inline__ int
627 ctc_checkalloc_buffer(struct channel *ch, int warn)
629 DBF_TEXT(trace, 5, __FUNCTION__);
630 if ((ch->trans_skb == NULL) ||
631 (ch->flags & CHANNEL_FLAGS_BUFSIZE_CHANGED)) {
632 if (ch->trans_skb != NULL)
633 dev_kfree_skb(ch->trans_skb);
634 clear_normalized_cda(&ch->ccw[1]);
635 ch->trans_skb = __dev_alloc_skb(ch->max_bufsize,
636 GFP_ATOMIC | GFP_DMA);
637 if (ch->trans_skb == NULL) {
638 if (warn)
639 ctc_pr_warn(
640 "%s: Couldn't alloc %s trans_skb\n",
641 ch->id,
642 (CHANNEL_DIRECTION(ch->flags) == READ) ?
643 "RX" : "TX");
644 return -ENOMEM;
646 ch->ccw[1].count = ch->max_bufsize;
647 if (set_normalized_cda(&ch->ccw[1], ch->trans_skb->data)) {
648 dev_kfree_skb(ch->trans_skb);
649 ch->trans_skb = NULL;
650 if (warn)
651 ctc_pr_warn(
652 "%s: set_normalized_cda for %s "
653 "trans_skb failed, dropping packets\n",
654 ch->id,
655 (CHANNEL_DIRECTION(ch->flags) == READ) ?
656 "RX" : "TX");
657 return -ENOMEM;
659 ch->ccw[1].count = 0;
660 ch->trans_skb_data = ch->trans_skb->data;
661 ch->flags &= ~CHANNEL_FLAGS_BUFSIZE_CHANGED;
663 return 0;
667 * Dummy NOP action for statemachines
669 static void
670 fsm_action_nop(fsm_instance * fi, int event, void *arg)
675 * Actions for channel - statemachines.
676 *****************************************************************************/
679 * Normal data has been send. Free the corresponding
680 * skb (it's in io_queue), reset dev->tbusy and
681 * revert to idle state.
683 * @param fi An instance of a channel statemachine.
684 * @param event The event, just happened.
685 * @param arg Generic pointer, casted from channel * upon call.
687 static void
688 ch_action_txdone(fsm_instance * fi, int event, void *arg)
690 struct channel *ch = (struct channel *) arg;
691 struct net_device *dev = ch->netdev;
692 struct ctc_priv *privptr = dev->priv;
693 struct sk_buff *skb;
694 int first = 1;
695 int i;
696 unsigned long duration;
697 struct timespec done_stamp = xtime;
699 DBF_TEXT(trace, 4, __FUNCTION__);
701 duration =
702 (done_stamp.tv_sec - ch->prof.send_stamp.tv_sec) * 1000000 +
703 (done_stamp.tv_nsec - ch->prof.send_stamp.tv_nsec) / 1000;
704 if (duration > ch->prof.tx_time)
705 ch->prof.tx_time = duration;
707 if (ch->irb->scsw.count != 0)
708 ctc_pr_debug("%s: TX not complete, remaining %d bytes\n",
709 dev->name, ch->irb->scsw.count);
710 fsm_deltimer(&ch->timer);
711 while ((skb = skb_dequeue(&ch->io_queue))) {
712 privptr->stats.tx_packets++;
713 privptr->stats.tx_bytes += skb->len - LL_HEADER_LENGTH;
714 if (first) {
715 privptr->stats.tx_bytes += 2;
716 first = 0;
718 atomic_dec(&skb->users);
719 dev_kfree_skb_irq(skb);
721 spin_lock(&ch->collect_lock);
722 clear_normalized_cda(&ch->ccw[4]);
723 if (ch->collect_len > 0) {
724 int rc;
726 if (ctc_checkalloc_buffer(ch, 1)) {
727 spin_unlock(&ch->collect_lock);
728 return;
730 ch->trans_skb->tail = ch->trans_skb->data = ch->trans_skb_data;
731 ch->trans_skb->len = 0;
732 if (ch->prof.maxmulti < (ch->collect_len + 2))
733 ch->prof.maxmulti = ch->collect_len + 2;
734 if (ch->prof.maxcqueue < skb_queue_len(&ch->collect_queue))
735 ch->prof.maxcqueue = skb_queue_len(&ch->collect_queue);
736 *((__u16 *) skb_put(ch->trans_skb, 2)) = ch->collect_len + 2;
737 i = 0;
738 while ((skb = skb_dequeue(&ch->collect_queue))) {
739 memcpy(skb_put(ch->trans_skb, skb->len), skb->data,
740 skb->len);
741 privptr->stats.tx_packets++;
742 privptr->stats.tx_bytes += skb->len - LL_HEADER_LENGTH;
743 atomic_dec(&skb->users);
744 dev_kfree_skb_irq(skb);
745 i++;
747 ch->collect_len = 0;
748 spin_unlock(&ch->collect_lock);
749 ch->ccw[1].count = ch->trans_skb->len;
750 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
751 ch->prof.send_stamp = xtime;
752 rc = ccw_device_start(ch->cdev, &ch->ccw[0],
753 (unsigned long) ch, 0xff, 0);
754 ch->prof.doios_multi++;
755 if (rc != 0) {
756 privptr->stats.tx_dropped += i;
757 privptr->stats.tx_errors += i;
758 fsm_deltimer(&ch->timer);
759 ccw_check_return_code(ch, rc, "chained TX");
761 } else {
762 spin_unlock(&ch->collect_lock);
763 fsm_newstate(fi, CH_STATE_TXIDLE);
765 ctc_clear_busy(dev);
769 * Initial data is sent.
770 * Notify device statemachine that we are up and
771 * running.
773 * @param fi An instance of a channel statemachine.
774 * @param event The event, just happened.
775 * @param arg Generic pointer, casted from channel * upon call.
777 static void
778 ch_action_txidle(fsm_instance * fi, int event, void *arg)
780 struct channel *ch = (struct channel *) arg;
782 DBF_TEXT(trace, 4, __FUNCTION__);
783 fsm_deltimer(&ch->timer);
784 fsm_newstate(fi, CH_STATE_TXIDLE);
785 fsm_event(((struct ctc_priv *) ch->netdev->priv)->fsm, DEV_EVENT_TXUP,
786 ch->netdev);
790 * Got normal data, check for sanity, queue it up, allocate new buffer
791 * trigger bottom half, and initiate next read.
793 * @param fi An instance of a channel statemachine.
794 * @param event The event, just happened.
795 * @param arg Generic pointer, casted from channel * upon call.
797 static void
798 ch_action_rx(fsm_instance * fi, int event, void *arg)
800 struct channel *ch = (struct channel *) arg;
801 struct net_device *dev = ch->netdev;
802 struct ctc_priv *privptr = dev->priv;
803 int len = ch->max_bufsize - ch->irb->scsw.count;
804 struct sk_buff *skb = ch->trans_skb;
805 __u16 block_len = *((__u16 *) skb->data);
806 int check_len;
807 int rc;
809 DBF_TEXT(trace, 4, __FUNCTION__);
810 fsm_deltimer(&ch->timer);
811 if (len < 8) {
812 ctc_pr_debug("%s: got packet with length %d < 8\n",
813 dev->name, len);
814 privptr->stats.rx_dropped++;
815 privptr->stats.rx_length_errors++;
816 goto again;
818 if (len > ch->max_bufsize) {
819 ctc_pr_debug("%s: got packet with length %d > %d\n",
820 dev->name, len, ch->max_bufsize);
821 privptr->stats.rx_dropped++;
822 privptr->stats.rx_length_errors++;
823 goto again;
827 * VM TCP seems to have a bug sending 2 trailing bytes of garbage.
829 switch (ch->protocol) {
830 case CTC_PROTO_S390:
831 case CTC_PROTO_OS390:
832 check_len = block_len + 2;
833 break;
834 default:
835 check_len = block_len;
836 break;
838 if ((len < block_len) || (len > check_len)) {
839 ctc_pr_debug("%s: got block length %d != rx length %d\n",
840 dev->name, block_len, len);
841 #ifdef DEBUG
842 ctc_dump_skb(skb, 0);
843 #endif
844 *((__u16 *) skb->data) = len;
845 privptr->stats.rx_dropped++;
846 privptr->stats.rx_length_errors++;
847 goto again;
849 block_len -= 2;
850 if (block_len > 0) {
851 *((__u16 *) skb->data) = block_len;
852 ctc_unpack_skb(ch, skb);
854 again:
855 skb->data = skb->tail = ch->trans_skb_data;
856 skb->len = 0;
857 if (ctc_checkalloc_buffer(ch, 1))
858 return;
859 ch->ccw[1].count = ch->max_bufsize;
860 rc = ccw_device_start(ch->cdev, &ch->ccw[0], (unsigned long) ch, 0xff, 0);
861 if (rc != 0)
862 ccw_check_return_code(ch, rc, "normal RX");
865 static void ch_action_rxidle(fsm_instance * fi, int event, void *arg);
868 * Initialize connection by sending a __u16 of value 0.
870 * @param fi An instance of a channel statemachine.
871 * @param event The event, just happened.
872 * @param arg Generic pointer, casted from channel * upon call.
874 static void
875 ch_action_firstio(fsm_instance * fi, int event, void *arg)
877 struct channel *ch = (struct channel *) arg;
878 int rc;
880 DBF_TEXT(trace, 4, __FUNCTION__);
882 if (fsm_getstate(fi) == CH_STATE_TXIDLE)
883 ctc_pr_debug("%s: remote side issued READ?, init ...\n", ch->id);
884 fsm_deltimer(&ch->timer);
885 if (ctc_checkalloc_buffer(ch, 1))
886 return;
887 if ((fsm_getstate(fi) == CH_STATE_SETUPWAIT) &&
888 (ch->protocol == CTC_PROTO_OS390)) {
889 /* OS/390 resp. z/OS */
890 if (CHANNEL_DIRECTION(ch->flags) == READ) {
891 *((__u16 *) ch->trans_skb->data) = CTC_INITIAL_BLOCKLEN;
892 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC,
893 CH_EVENT_TIMER, ch);
894 ch_action_rxidle(fi, event, arg);
895 } else {
896 struct net_device *dev = ch->netdev;
897 fsm_newstate(fi, CH_STATE_TXIDLE);
898 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
899 DEV_EVENT_TXUP, dev);
901 return;
905 * Don´t setup a timer for receiving the initial RX frame
906 * if in compatibility mode, since VM TCP delays the initial
907 * frame until it has some data to send.
909 if ((CHANNEL_DIRECTION(ch->flags) == WRITE) ||
910 (ch->protocol != CTC_PROTO_S390))
911 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
913 *((__u16 *) ch->trans_skb->data) = CTC_INITIAL_BLOCKLEN;
914 ch->ccw[1].count = 2; /* Transfer only length */
916 fsm_newstate(fi, (CHANNEL_DIRECTION(ch->flags) == READ)
917 ? CH_STATE_RXINIT : CH_STATE_TXINIT);
918 rc = ccw_device_start(ch->cdev, &ch->ccw[0], (unsigned long) ch, 0xff, 0);
919 if (rc != 0) {
920 fsm_deltimer(&ch->timer);
921 fsm_newstate(fi, CH_STATE_SETUPWAIT);
922 ccw_check_return_code(ch, rc, "init IO");
925 * If in compatibility mode since we don´t setup a timer, we
926 * also signal RX channel up immediately. This enables us
927 * to send packets early which in turn usually triggers some
928 * reply from VM TCP which brings up the RX channel to it´s
929 * final state.
931 if ((CHANNEL_DIRECTION(ch->flags) == READ) &&
932 (ch->protocol == CTC_PROTO_S390)) {
933 struct net_device *dev = ch->netdev;
934 fsm_event(((struct ctc_priv *) dev->priv)->fsm, DEV_EVENT_RXUP,
935 dev);
940 * Got initial data, check it. If OK,
941 * notify device statemachine that we are up and
942 * running.
944 * @param fi An instance of a channel statemachine.
945 * @param event The event, just happened.
946 * @param arg Generic pointer, casted from channel * upon call.
948 static void
949 ch_action_rxidle(fsm_instance * fi, int event, void *arg)
951 struct channel *ch = (struct channel *) arg;
952 struct net_device *dev = ch->netdev;
953 __u16 buflen;
954 int rc;
956 DBF_TEXT(trace, 4, __FUNCTION__);
957 fsm_deltimer(&ch->timer);
958 buflen = *((__u16 *) ch->trans_skb->data);
959 #ifdef DEBUG
960 ctc_pr_debug("%s: Initial RX count %d\n", dev->name, buflen);
961 #endif
962 if (buflen >= CTC_INITIAL_BLOCKLEN) {
963 if (ctc_checkalloc_buffer(ch, 1))
964 return;
965 ch->ccw[1].count = ch->max_bufsize;
966 fsm_newstate(fi, CH_STATE_RXIDLE);
967 rc = ccw_device_start(ch->cdev, &ch->ccw[0],
968 (unsigned long) ch, 0xff, 0);
969 if (rc != 0) {
970 fsm_newstate(fi, CH_STATE_RXINIT);
971 ccw_check_return_code(ch, rc, "initial RX");
972 } else
973 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
974 DEV_EVENT_RXUP, dev);
975 } else {
976 ctc_pr_debug("%s: Initial RX count %d not %d\n",
977 dev->name, buflen, CTC_INITIAL_BLOCKLEN);
978 ch_action_firstio(fi, event, arg);
983 * Set channel into extended mode.
985 * @param fi An instance of a channel statemachine.
986 * @param event The event, just happened.
987 * @param arg Generic pointer, casted from channel * upon call.
989 static void
990 ch_action_setmode(fsm_instance * fi, int event, void *arg)
992 struct channel *ch = (struct channel *) arg;
993 int rc;
994 unsigned long saveflags;
996 DBF_TEXT(trace, 4, __FUNCTION__);
997 fsm_deltimer(&ch->timer);
998 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
999 fsm_newstate(fi, CH_STATE_SETUPWAIT);
1000 saveflags = 0; /* avoids compiler warning with
1001 spin_unlock_irqrestore */
1002 if (event == CH_EVENT_TIMER) // only for timer not yet locked
1003 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
1004 rc = ccw_device_start(ch->cdev, &ch->ccw[6], (unsigned long) ch, 0xff, 0);
1005 if (event == CH_EVENT_TIMER)
1006 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
1007 if (rc != 0) {
1008 fsm_deltimer(&ch->timer);
1009 fsm_newstate(fi, CH_STATE_STARTWAIT);
1010 ccw_check_return_code(ch, rc, "set Mode");
1011 } else
1012 ch->retry = 0;
1016 * Setup channel.
1018 * @param fi An instance of a channel statemachine.
1019 * @param event The event, just happened.
1020 * @param arg Generic pointer, casted from channel * upon call.
1022 static void
1023 ch_action_start(fsm_instance * fi, int event, void *arg)
1025 struct channel *ch = (struct channel *) arg;
1026 unsigned long saveflags;
1027 int rc;
1028 struct net_device *dev;
1030 DBF_TEXT(trace, 4, __FUNCTION__);
1031 if (ch == NULL) {
1032 ctc_pr_warn("ch_action_start ch=NULL\n");
1033 return;
1035 if (ch->netdev == NULL) {
1036 ctc_pr_warn("ch_action_start dev=NULL, id=%s\n", ch->id);
1037 return;
1039 dev = ch->netdev;
1041 #ifdef DEBUG
1042 ctc_pr_debug("%s: %s channel start\n", dev->name,
1043 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX");
1044 #endif
1046 if (ch->trans_skb != NULL) {
1047 clear_normalized_cda(&ch->ccw[1]);
1048 dev_kfree_skb(ch->trans_skb);
1049 ch->trans_skb = NULL;
1051 if (CHANNEL_DIRECTION(ch->flags) == READ) {
1052 ch->ccw[1].cmd_code = CCW_CMD_READ;
1053 ch->ccw[1].flags = CCW_FLAG_SLI;
1054 ch->ccw[1].count = 0;
1055 } else {
1056 ch->ccw[1].cmd_code = CCW_CMD_WRITE;
1057 ch->ccw[1].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
1058 ch->ccw[1].count = 0;
1060 if (ctc_checkalloc_buffer(ch, 0)) {
1061 ctc_pr_notice(
1062 "%s: Could not allocate %s trans_skb, delaying "
1063 "allocation until first transfer\n",
1064 dev->name,
1065 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX");
1068 ch->ccw[0].cmd_code = CCW_CMD_PREPARE;
1069 ch->ccw[0].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
1070 ch->ccw[0].count = 0;
1071 ch->ccw[0].cda = 0;
1072 ch->ccw[2].cmd_code = CCW_CMD_NOOP; /* jointed CE + DE */
1073 ch->ccw[2].flags = CCW_FLAG_SLI;
1074 ch->ccw[2].count = 0;
1075 ch->ccw[2].cda = 0;
1076 memcpy(&ch->ccw[3], &ch->ccw[0], sizeof (struct ccw1) * 3);
1077 ch->ccw[4].cda = 0;
1078 ch->ccw[4].flags &= ~CCW_FLAG_IDA;
1080 fsm_newstate(fi, CH_STATE_STARTWAIT);
1081 fsm_addtimer(&ch->timer, 1000, CH_EVENT_TIMER, ch);
1082 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
1083 rc = ccw_device_halt(ch->cdev, (unsigned long) ch);
1084 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
1085 if (rc != 0) {
1086 if (rc != -EBUSY)
1087 fsm_deltimer(&ch->timer);
1088 ccw_check_return_code(ch, rc, "initial HaltIO");
1090 #ifdef DEBUG
1091 ctc_pr_debug("ctc: %s(): leaving\n", __func__);
1092 #endif
1096 * Shutdown a channel.
1098 * @param fi An instance of a channel statemachine.
1099 * @param event The event, just happened.
1100 * @param arg Generic pointer, casted from channel * upon call.
1102 static void
1103 ch_action_haltio(fsm_instance * fi, int event, void *arg)
1105 struct channel *ch = (struct channel *) arg;
1106 unsigned long saveflags;
1107 int rc;
1108 int oldstate;
1110 DBF_TEXT(trace, 3, __FUNCTION__);
1111 fsm_deltimer(&ch->timer);
1112 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
1113 saveflags = 0; /* avoids comp warning with
1114 spin_unlock_irqrestore */
1115 if (event == CH_EVENT_STOP) // only for STOP not yet locked
1116 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
1117 oldstate = fsm_getstate(fi);
1118 fsm_newstate(fi, CH_STATE_TERM);
1119 rc = ccw_device_halt(ch->cdev, (unsigned long) ch);
1120 if (event == CH_EVENT_STOP)
1121 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
1122 if (rc != 0) {
1123 if (rc != -EBUSY) {
1124 fsm_deltimer(&ch->timer);
1125 fsm_newstate(fi, oldstate);
1127 ccw_check_return_code(ch, rc, "HaltIO in ch_action_haltio");
1132 * A channel has successfully been halted.
1133 * Cleanup it's queue and notify interface statemachine.
1135 * @param fi An instance of a channel statemachine.
1136 * @param event The event, just happened.
1137 * @param arg Generic pointer, casted from channel * upon call.
1139 static void
1140 ch_action_stopped(fsm_instance * fi, int event, void *arg)
1142 struct channel *ch = (struct channel *) arg;
1143 struct net_device *dev = ch->netdev;
1145 DBF_TEXT(trace, 3, __FUNCTION__);
1146 fsm_deltimer(&ch->timer);
1147 fsm_newstate(fi, CH_STATE_STOPPED);
1148 if (ch->trans_skb != NULL) {
1149 clear_normalized_cda(&ch->ccw[1]);
1150 dev_kfree_skb(ch->trans_skb);
1151 ch->trans_skb = NULL;
1153 if (CHANNEL_DIRECTION(ch->flags) == READ) {
1154 skb_queue_purge(&ch->io_queue);
1155 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1156 DEV_EVENT_RXDOWN, dev);
1157 } else {
1158 ctc_purge_skb_queue(&ch->io_queue);
1159 spin_lock(&ch->collect_lock);
1160 ctc_purge_skb_queue(&ch->collect_queue);
1161 ch->collect_len = 0;
1162 spin_unlock(&ch->collect_lock);
1163 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1164 DEV_EVENT_TXDOWN, dev);
1169 * A stop command from device statemachine arrived and we are in
1170 * not operational mode. Set state to stopped.
1172 * @param fi An instance of a channel statemachine.
1173 * @param event The event, just happened.
1174 * @param arg Generic pointer, casted from channel * upon call.
1176 static void
1177 ch_action_stop(fsm_instance * fi, int event, void *arg)
1179 fsm_newstate(fi, CH_STATE_STOPPED);
1183 * A machine check for no path, not operational status or gone device has
1184 * happened.
1185 * Cleanup queue and notify interface statemachine.
1187 * @param fi An instance of a channel statemachine.
1188 * @param event The event, just happened.
1189 * @param arg Generic pointer, casted from channel * upon call.
1191 static void
1192 ch_action_fail(fsm_instance * fi, int event, void *arg)
1194 struct channel *ch = (struct channel *) arg;
1195 struct net_device *dev = ch->netdev;
1197 DBF_TEXT(trace, 3, __FUNCTION__);
1198 fsm_deltimer(&ch->timer);
1199 fsm_newstate(fi, CH_STATE_NOTOP);
1200 if (CHANNEL_DIRECTION(ch->flags) == READ) {
1201 skb_queue_purge(&ch->io_queue);
1202 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1203 DEV_EVENT_RXDOWN, dev);
1204 } else {
1205 ctc_purge_skb_queue(&ch->io_queue);
1206 spin_lock(&ch->collect_lock);
1207 ctc_purge_skb_queue(&ch->collect_queue);
1208 ch->collect_len = 0;
1209 spin_unlock(&ch->collect_lock);
1210 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1211 DEV_EVENT_TXDOWN, dev);
1216 * Handle error during setup of channel.
1218 * @param fi An instance of a channel statemachine.
1219 * @param event The event, just happened.
1220 * @param arg Generic pointer, casted from channel * upon call.
1222 static void
1223 ch_action_setuperr(fsm_instance * fi, int event, void *arg)
1225 struct channel *ch = (struct channel *) arg;
1226 struct net_device *dev = ch->netdev;
1228 DBF_TEXT(setup, 3, __FUNCTION__);
1230 * Special case: Got UC_RCRESET on setmode.
1231 * This means that remote side isn't setup. In this case
1232 * simply retry after some 10 secs...
1234 if ((fsm_getstate(fi) == CH_STATE_SETUPWAIT) &&
1235 ((event == CH_EVENT_UC_RCRESET) ||
1236 (event == CH_EVENT_UC_RSRESET))) {
1237 fsm_newstate(fi, CH_STATE_STARTRETRY);
1238 fsm_deltimer(&ch->timer);
1239 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
1240 if (CHANNEL_DIRECTION(ch->flags) == READ) {
1241 int rc = ccw_device_halt(ch->cdev, (unsigned long) ch);
1242 if (rc != 0)
1243 ccw_check_return_code(
1244 ch, rc, "HaltIO in ch_action_setuperr");
1246 return;
1249 ctc_pr_debug("%s: Error %s during %s channel setup state=%s\n",
1250 dev->name, ch_event_names[event],
1251 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX",
1252 fsm_getstate_str(fi));
1253 if (CHANNEL_DIRECTION(ch->flags) == READ) {
1254 fsm_newstate(fi, CH_STATE_RXERR);
1255 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1256 DEV_EVENT_RXDOWN, dev);
1257 } else {
1258 fsm_newstate(fi, CH_STATE_TXERR);
1259 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1260 DEV_EVENT_TXDOWN, dev);
1265 * Restart a channel after an error.
1267 * @param fi An instance of a channel statemachine.
1268 * @param event The event, just happened.
1269 * @param arg Generic pointer, casted from channel * upon call.
1271 static void
1272 ch_action_restart(fsm_instance * fi, int event, void *arg)
1274 unsigned long saveflags;
1275 int oldstate;
1276 int rc;
1278 struct channel *ch = (struct channel *) arg;
1279 struct net_device *dev = ch->netdev;
1281 DBF_TEXT(trace, 3, __FUNCTION__);
1282 fsm_deltimer(&ch->timer);
1283 ctc_pr_debug("%s: %s channel restart\n", dev->name,
1284 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX");
1285 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
1286 oldstate = fsm_getstate(fi);
1287 fsm_newstate(fi, CH_STATE_STARTWAIT);
1288 saveflags = 0; /* avoids compiler warning with
1289 spin_unlock_irqrestore */
1290 if (event == CH_EVENT_TIMER) // only for timer not yet locked
1291 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
1292 rc = ccw_device_halt(ch->cdev, (unsigned long) ch);
1293 if (event == CH_EVENT_TIMER)
1294 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
1295 if (rc != 0) {
1296 if (rc != -EBUSY) {
1297 fsm_deltimer(&ch->timer);
1298 fsm_newstate(fi, oldstate);
1300 ccw_check_return_code(ch, rc, "HaltIO in ch_action_restart");
1305 * Handle error during RX initial handshake (exchange of
1306 * 0-length block header)
1308 * @param fi An instance of a channel statemachine.
1309 * @param event The event, just happened.
1310 * @param arg Generic pointer, casted from channel * upon call.
1312 static void
1313 ch_action_rxiniterr(fsm_instance * fi, int event, void *arg)
1315 struct channel *ch = (struct channel *) arg;
1316 struct net_device *dev = ch->netdev;
1318 DBF_TEXT(setup, 3, __FUNCTION__);
1319 if (event == CH_EVENT_TIMER) {
1320 fsm_deltimer(&ch->timer);
1321 ctc_pr_debug("%s: Timeout during RX init handshake\n", dev->name);
1322 if (ch->retry++ < 3)
1323 ch_action_restart(fi, event, arg);
1324 else {
1325 fsm_newstate(fi, CH_STATE_RXERR);
1326 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1327 DEV_EVENT_RXDOWN, dev);
1329 } else
1330 ctc_pr_warn("%s: Error during RX init handshake\n", dev->name);
1334 * Notify device statemachine if we gave up initialization
1335 * of RX channel.
1337 * @param fi An instance of a channel statemachine.
1338 * @param event The event, just happened.
1339 * @param arg Generic pointer, casted from channel * upon call.
1341 static void
1342 ch_action_rxinitfail(fsm_instance * fi, int event, void *arg)
1344 struct channel *ch = (struct channel *) arg;
1345 struct net_device *dev = ch->netdev;
1347 DBF_TEXT(setup, 3, __FUNCTION__);
1348 fsm_newstate(fi, CH_STATE_RXERR);
1349 ctc_pr_warn("%s: RX initialization failed\n", dev->name);
1350 ctc_pr_warn("%s: RX <-> RX connection detected\n", dev->name);
1351 fsm_event(((struct ctc_priv *) dev->priv)->fsm, DEV_EVENT_RXDOWN, dev);
1355 * Handle RX Unit check remote reset (remote disconnected)
1357 * @param fi An instance of a channel statemachine.
1358 * @param event The event, just happened.
1359 * @param arg Generic pointer, casted from channel * upon call.
1361 static void
1362 ch_action_rxdisc(fsm_instance * fi, int event, void *arg)
1364 struct channel *ch = (struct channel *) arg;
1365 struct channel *ch2;
1366 struct net_device *dev = ch->netdev;
1368 DBF_TEXT(trace, 3, __FUNCTION__);
1369 fsm_deltimer(&ch->timer);
1370 ctc_pr_debug("%s: Got remote disconnect, re-initializing ...\n",
1371 dev->name);
1374 * Notify device statemachine
1376 fsm_event(((struct ctc_priv *) dev->priv)->fsm, DEV_EVENT_RXDOWN, dev);
1377 fsm_event(((struct ctc_priv *) dev->priv)->fsm, DEV_EVENT_TXDOWN, dev);
1379 fsm_newstate(fi, CH_STATE_DTERM);
1380 ch2 = ((struct ctc_priv *) dev->priv)->channel[WRITE];
1381 fsm_newstate(ch2->fsm, CH_STATE_DTERM);
1383 ccw_device_halt(ch->cdev, (unsigned long) ch);
1384 ccw_device_halt(ch2->cdev, (unsigned long) ch2);
1388 * Handle error during TX channel initialization.
1390 * @param fi An instance of a channel statemachine.
1391 * @param event The event, just happened.
1392 * @param arg Generic pointer, casted from channel * upon call.
1394 static void
1395 ch_action_txiniterr(fsm_instance * fi, int event, void *arg)
1397 struct channel *ch = (struct channel *) arg;
1398 struct net_device *dev = ch->netdev;
1400 DBF_TEXT(setup, 2, __FUNCTION__);
1401 if (event == CH_EVENT_TIMER) {
1402 fsm_deltimer(&ch->timer);
1403 ctc_pr_debug("%s: Timeout during TX init handshake\n", dev->name);
1404 if (ch->retry++ < 3)
1405 ch_action_restart(fi, event, arg);
1406 else {
1407 fsm_newstate(fi, CH_STATE_TXERR);
1408 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1409 DEV_EVENT_TXDOWN, dev);
1411 } else
1412 ctc_pr_warn("%s: Error during TX init handshake\n", dev->name);
1416 * Handle TX timeout by retrying operation.
1418 * @param fi An instance of a channel statemachine.
1419 * @param event The event, just happened.
1420 * @param arg Generic pointer, casted from channel * upon call.
1422 static void
1423 ch_action_txretry(fsm_instance * fi, int event, void *arg)
1425 struct channel *ch = (struct channel *) arg;
1426 struct net_device *dev = ch->netdev;
1427 unsigned long saveflags;
1429 DBF_TEXT(trace, 4, __FUNCTION__);
1430 fsm_deltimer(&ch->timer);
1431 if (ch->retry++ > 3) {
1432 ctc_pr_debug("%s: TX retry failed, restarting channel\n",
1433 dev->name);
1434 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1435 DEV_EVENT_TXDOWN, dev);
1436 ch_action_restart(fi, event, arg);
1437 } else {
1438 struct sk_buff *skb;
1440 ctc_pr_debug("%s: TX retry %d\n", dev->name, ch->retry);
1441 if ((skb = skb_peek(&ch->io_queue))) {
1442 int rc = 0;
1444 clear_normalized_cda(&ch->ccw[4]);
1445 ch->ccw[4].count = skb->len;
1446 if (set_normalized_cda(&ch->ccw[4], skb->data)) {
1447 ctc_pr_debug(
1448 "%s: IDAL alloc failed, chan restart\n",
1449 dev->name);
1450 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1451 DEV_EVENT_TXDOWN, dev);
1452 ch_action_restart(fi, event, arg);
1453 return;
1455 fsm_addtimer(&ch->timer, 1000, CH_EVENT_TIMER, ch);
1456 saveflags = 0; /* avoids compiler warning with
1457 spin_unlock_irqrestore */
1458 if (event == CH_EVENT_TIMER) // only for TIMER not yet locked
1459 spin_lock_irqsave(get_ccwdev_lock(ch->cdev),
1460 saveflags);
1461 rc = ccw_device_start(ch->cdev, &ch->ccw[3],
1462 (unsigned long) ch, 0xff, 0);
1463 if (event == CH_EVENT_TIMER)
1464 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev),
1465 saveflags);
1466 if (rc != 0) {
1467 fsm_deltimer(&ch->timer);
1468 ccw_check_return_code(ch, rc, "TX in ch_action_txretry");
1469 ctc_purge_skb_queue(&ch->io_queue);
1477 * Handle fatal errors during an I/O command.
1479 * @param fi An instance of a channel statemachine.
1480 * @param event The event, just happened.
1481 * @param arg Generic pointer, casted from channel * upon call.
1483 static void
1484 ch_action_iofatal(fsm_instance * fi, int event, void *arg)
1486 struct channel *ch = (struct channel *) arg;
1487 struct net_device *dev = ch->netdev;
1489 DBF_TEXT(trace, 3, __FUNCTION__);
1490 fsm_deltimer(&ch->timer);
1491 if (CHANNEL_DIRECTION(ch->flags) == READ) {
1492 ctc_pr_debug("%s: RX I/O error\n", dev->name);
1493 fsm_newstate(fi, CH_STATE_RXERR);
1494 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1495 DEV_EVENT_RXDOWN, dev);
1496 } else {
1497 ctc_pr_debug("%s: TX I/O error\n", dev->name);
1498 fsm_newstate(fi, CH_STATE_TXERR);
1499 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1500 DEV_EVENT_TXDOWN, dev);
1504 static void
1505 ch_action_reinit(fsm_instance *fi, int event, void *arg)
1507 struct channel *ch = (struct channel *)arg;
1508 struct net_device *dev = ch->netdev;
1509 struct ctc_priv *privptr = dev->priv;
1511 DBF_TEXT(trace, 4, __FUNCTION__);
1512 ch_action_iofatal(fi, event, arg);
1513 fsm_addtimer(&privptr->restart_timer, 1000, DEV_EVENT_RESTART, dev);
1517 * The statemachine for a channel.
1519 static const fsm_node ch_fsm[] = {
1520 {CH_STATE_STOPPED, CH_EVENT_STOP, fsm_action_nop },
1521 {CH_STATE_STOPPED, CH_EVENT_START, ch_action_start },
1522 {CH_STATE_STOPPED, CH_EVENT_FINSTAT, fsm_action_nop },
1523 {CH_STATE_STOPPED, CH_EVENT_MC_FAIL, fsm_action_nop },
1525 {CH_STATE_NOTOP, CH_EVENT_STOP, ch_action_stop },
1526 {CH_STATE_NOTOP, CH_EVENT_START, fsm_action_nop },
1527 {CH_STATE_NOTOP, CH_EVENT_FINSTAT, fsm_action_nop },
1528 {CH_STATE_NOTOP, CH_EVENT_MC_FAIL, fsm_action_nop },
1529 {CH_STATE_NOTOP, CH_EVENT_MC_GOOD, ch_action_start },
1531 {CH_STATE_STARTWAIT, CH_EVENT_STOP, ch_action_haltio },
1532 {CH_STATE_STARTWAIT, CH_EVENT_START, fsm_action_nop },
1533 {CH_STATE_STARTWAIT, CH_EVENT_FINSTAT, ch_action_setmode },
1534 {CH_STATE_STARTWAIT, CH_EVENT_TIMER, ch_action_setuperr },
1535 {CH_STATE_STARTWAIT, CH_EVENT_IO_ENODEV, ch_action_iofatal },
1536 {CH_STATE_STARTWAIT, CH_EVENT_IO_EIO, ch_action_reinit },
1537 {CH_STATE_STARTWAIT, CH_EVENT_MC_FAIL, ch_action_fail },
1539 {CH_STATE_STARTRETRY, CH_EVENT_STOP, ch_action_haltio },
1540 {CH_STATE_STARTRETRY, CH_EVENT_TIMER, ch_action_setmode },
1541 {CH_STATE_STARTRETRY, CH_EVENT_FINSTAT, fsm_action_nop },
1542 {CH_STATE_STARTRETRY, CH_EVENT_MC_FAIL, ch_action_fail },
1544 {CH_STATE_SETUPWAIT, CH_EVENT_STOP, ch_action_haltio },
1545 {CH_STATE_SETUPWAIT, CH_EVENT_START, fsm_action_nop },
1546 {CH_STATE_SETUPWAIT, CH_EVENT_FINSTAT, ch_action_firstio },
1547 {CH_STATE_SETUPWAIT, CH_EVENT_UC_RCRESET, ch_action_setuperr },
1548 {CH_STATE_SETUPWAIT, CH_EVENT_UC_RSRESET, ch_action_setuperr },
1549 {CH_STATE_SETUPWAIT, CH_EVENT_TIMER, ch_action_setmode },
1550 {CH_STATE_SETUPWAIT, CH_EVENT_IO_ENODEV, ch_action_iofatal },
1551 {CH_STATE_SETUPWAIT, CH_EVENT_IO_EIO, ch_action_reinit },
1552 {CH_STATE_SETUPWAIT, CH_EVENT_MC_FAIL, ch_action_fail },
1554 {CH_STATE_RXINIT, CH_EVENT_STOP, ch_action_haltio },
1555 {CH_STATE_RXINIT, CH_EVENT_START, fsm_action_nop },
1556 {CH_STATE_RXINIT, CH_EVENT_FINSTAT, ch_action_rxidle },
1557 {CH_STATE_RXINIT, CH_EVENT_UC_RCRESET, ch_action_rxiniterr },
1558 {CH_STATE_RXINIT, CH_EVENT_UC_RSRESET, ch_action_rxiniterr },
1559 {CH_STATE_RXINIT, CH_EVENT_TIMER, ch_action_rxiniterr },
1560 {CH_STATE_RXINIT, CH_EVENT_ATTNBUSY, ch_action_rxinitfail },
1561 {CH_STATE_RXINIT, CH_EVENT_IO_ENODEV, ch_action_iofatal },
1562 {CH_STATE_RXINIT, CH_EVENT_IO_EIO, ch_action_reinit },
1563 {CH_STATE_RXINIT, CH_EVENT_UC_ZERO, ch_action_firstio },
1564 {CH_STATE_RXINIT, CH_EVENT_MC_FAIL, ch_action_fail },
1566 {CH_STATE_RXIDLE, CH_EVENT_STOP, ch_action_haltio },
1567 {CH_STATE_RXIDLE, CH_EVENT_START, fsm_action_nop },
1568 {CH_STATE_RXIDLE, CH_EVENT_FINSTAT, ch_action_rx },
1569 {CH_STATE_RXIDLE, CH_EVENT_UC_RCRESET, ch_action_rxdisc },
1570 // {CH_STATE_RXIDLE, CH_EVENT_UC_RSRESET, ch_action_rxretry },
1571 {CH_STATE_RXIDLE, CH_EVENT_IO_ENODEV, ch_action_iofatal },
1572 {CH_STATE_RXIDLE, CH_EVENT_IO_EIO, ch_action_reinit },
1573 {CH_STATE_RXIDLE, CH_EVENT_MC_FAIL, ch_action_fail },
1574 {CH_STATE_RXIDLE, CH_EVENT_UC_ZERO, ch_action_rx },
1576 {CH_STATE_TXINIT, CH_EVENT_STOP, ch_action_haltio },
1577 {CH_STATE_TXINIT, CH_EVENT_START, fsm_action_nop },
1578 {CH_STATE_TXINIT, CH_EVENT_FINSTAT, ch_action_txidle },
1579 {CH_STATE_TXINIT, CH_EVENT_UC_RCRESET, ch_action_txiniterr },
1580 {CH_STATE_TXINIT, CH_EVENT_UC_RSRESET, ch_action_txiniterr },
1581 {CH_STATE_TXINIT, CH_EVENT_TIMER, ch_action_txiniterr },
1582 {CH_STATE_TXINIT, CH_EVENT_IO_ENODEV, ch_action_iofatal },
1583 {CH_STATE_TXINIT, CH_EVENT_IO_EIO, ch_action_reinit },
1584 {CH_STATE_TXINIT, CH_EVENT_MC_FAIL, ch_action_fail },
1586 {CH_STATE_TXIDLE, CH_EVENT_STOP, ch_action_haltio },
1587 {CH_STATE_TXIDLE, CH_EVENT_START, fsm_action_nop },
1588 {CH_STATE_TXIDLE, CH_EVENT_FINSTAT, ch_action_firstio },
1589 {CH_STATE_TXIDLE, CH_EVENT_UC_RCRESET, fsm_action_nop },
1590 {CH_STATE_TXIDLE, CH_EVENT_UC_RSRESET, fsm_action_nop },
1591 {CH_STATE_TXIDLE, CH_EVENT_IO_ENODEV, ch_action_iofatal },
1592 {CH_STATE_TXIDLE, CH_EVENT_IO_EIO, ch_action_reinit },
1593 {CH_STATE_TXIDLE, CH_EVENT_MC_FAIL, ch_action_fail },
1595 {CH_STATE_TERM, CH_EVENT_STOP, fsm_action_nop },
1596 {CH_STATE_TERM, CH_EVENT_START, ch_action_restart },
1597 {CH_STATE_TERM, CH_EVENT_FINSTAT, ch_action_stopped },
1598 {CH_STATE_TERM, CH_EVENT_UC_RCRESET, fsm_action_nop },
1599 {CH_STATE_TERM, CH_EVENT_UC_RSRESET, fsm_action_nop },
1600 {CH_STATE_TERM, CH_EVENT_MC_FAIL, ch_action_fail },
1602 {CH_STATE_DTERM, CH_EVENT_STOP, ch_action_haltio },
1603 {CH_STATE_DTERM, CH_EVENT_START, ch_action_restart },
1604 {CH_STATE_DTERM, CH_EVENT_FINSTAT, ch_action_setmode },
1605 {CH_STATE_DTERM, CH_EVENT_UC_RCRESET, fsm_action_nop },
1606 {CH_STATE_DTERM, CH_EVENT_UC_RSRESET, fsm_action_nop },
1607 {CH_STATE_DTERM, CH_EVENT_MC_FAIL, ch_action_fail },
1609 {CH_STATE_TX, CH_EVENT_STOP, ch_action_haltio },
1610 {CH_STATE_TX, CH_EVENT_START, fsm_action_nop },
1611 {CH_STATE_TX, CH_EVENT_FINSTAT, ch_action_txdone },
1612 {CH_STATE_TX, CH_EVENT_UC_RCRESET, ch_action_txretry },
1613 {CH_STATE_TX, CH_EVENT_UC_RSRESET, ch_action_txretry },
1614 {CH_STATE_TX, CH_EVENT_TIMER, ch_action_txretry },
1615 {CH_STATE_TX, CH_EVENT_IO_ENODEV, ch_action_iofatal },
1616 {CH_STATE_TX, CH_EVENT_IO_EIO, ch_action_reinit },
1617 {CH_STATE_TX, CH_EVENT_MC_FAIL, ch_action_fail },
1619 {CH_STATE_RXERR, CH_EVENT_STOP, ch_action_haltio },
1620 {CH_STATE_TXERR, CH_EVENT_STOP, ch_action_haltio },
1621 {CH_STATE_TXERR, CH_EVENT_MC_FAIL, ch_action_fail },
1622 {CH_STATE_RXERR, CH_EVENT_MC_FAIL, ch_action_fail },
1625 static const int CH_FSM_LEN = sizeof (ch_fsm) / sizeof (fsm_node);
1628 * Functions related to setup and device detection.
1629 *****************************************************************************/
1631 static inline int
1632 less_than(char *id1, char *id2)
1634 int dev1, dev2, i;
1636 for (i = 0; i < 5; i++) {
1637 id1++;
1638 id2++;
1640 dev1 = simple_strtoul(id1, &id1, 16);
1641 dev2 = simple_strtoul(id2, &id2, 16);
1643 return (dev1 < dev2);
1647 * Add a new channel to the list of channels.
1648 * Keeps the channel list sorted.
1650 * @param cdev The ccw_device to be added.
1651 * @param type The type class of the new channel.
1653 * @return 0 on success, !0 on error.
1655 static int
1656 add_channel(struct ccw_device *cdev, enum channel_types type)
1658 struct channel **c = &channels;
1659 struct channel *ch;
1661 DBF_TEXT(trace, 2, __FUNCTION__);
1662 if ((ch =
1663 (struct channel *) kmalloc(sizeof (struct channel),
1664 GFP_KERNEL)) == NULL) {
1665 ctc_pr_warn("ctc: Out of memory in add_channel\n");
1666 return -1;
1668 memset(ch, 0, sizeof (struct channel));
1669 if ((ch->ccw = (struct ccw1 *) kmalloc(8*sizeof(struct ccw1),
1670 GFP_KERNEL | GFP_DMA)) == NULL) {
1671 kfree(ch);
1672 ctc_pr_warn("ctc: Out of memory in add_channel\n");
1673 return -1;
1676 memset(ch->ccw, 0, 8*sizeof(struct ccw1)); // assure all flags and counters are reset
1679 * "static" ccws are used in the following way:
1681 * ccw[0..2] (Channel program for generic I/O):
1682 * 0: prepare
1683 * 1: read or write (depending on direction) with fixed
1684 * buffer (idal allocated once when buffer is allocated)
1685 * 2: nop
1686 * ccw[3..5] (Channel program for direct write of packets)
1687 * 3: prepare
1688 * 4: write (idal allocated on every write).
1689 * 5: nop
1690 * ccw[6..7] (Channel program for initial channel setup):
1691 * 6: set extended mode
1692 * 7: nop
1694 * ch->ccw[0..5] are initialized in ch_action_start because
1695 * the channel's direction is yet unknown here.
1697 ch->ccw[6].cmd_code = CCW_CMD_SET_EXTENDED;
1698 ch->ccw[6].flags = CCW_FLAG_SLI;
1700 ch->ccw[7].cmd_code = CCW_CMD_NOOP;
1701 ch->ccw[7].flags = CCW_FLAG_SLI;
1703 ch->cdev = cdev;
1704 snprintf(ch->id, CTC_ID_SIZE, "ch-%s", cdev->dev.bus_id);
1705 ch->type = type;
1706 ch->fsm = init_fsm(ch->id, ch_state_names,
1707 ch_event_names, NR_CH_STATES, NR_CH_EVENTS,
1708 ch_fsm, CH_FSM_LEN, GFP_KERNEL);
1709 if (ch->fsm == NULL) {
1710 ctc_pr_warn("ctc: Could not create FSM in add_channel\n");
1711 kfree(ch->ccw);
1712 kfree(ch);
1713 return -1;
1715 fsm_newstate(ch->fsm, CH_STATE_IDLE);
1716 if ((ch->irb = (struct irb *) kmalloc(sizeof (struct irb),
1717 GFP_KERNEL)) == NULL) {
1718 ctc_pr_warn("ctc: Out of memory in add_channel\n");
1719 kfree_fsm(ch->fsm);
1720 kfree(ch->ccw);
1721 kfree(ch);
1722 return -1;
1724 memset(ch->irb, 0, sizeof (struct irb));
1725 while (*c && less_than((*c)->id, ch->id))
1726 c = &(*c)->next;
1727 if (*c && (!strncmp((*c)->id, ch->id, CTC_ID_SIZE))) {
1728 ctc_pr_debug(
1729 "ctc: add_channel: device %s already in list, "
1730 "using old entry\n", (*c)->id);
1731 kfree(ch->irb);
1732 kfree_fsm(ch->fsm);
1733 kfree(ch->ccw);
1734 kfree(ch);
1735 return 0;
1737 fsm_settimer(ch->fsm, &ch->timer);
1738 skb_queue_head_init(&ch->io_queue);
1739 skb_queue_head_init(&ch->collect_queue);
1740 ch->next = *c;
1741 *c = ch;
1742 return 0;
1746 * Release a specific channel in the channel list.
1748 * @param ch Pointer to channel struct to be released.
1750 static void
1751 channel_free(struct channel *ch)
1753 ch->flags &= ~CHANNEL_FLAGS_INUSE;
1754 fsm_newstate(ch->fsm, CH_STATE_IDLE);
1758 * Remove a specific channel in the channel list.
1760 * @param ch Pointer to channel struct to be released.
1762 static void
1763 channel_remove(struct channel *ch)
1765 struct channel **c = &channels;
1767 DBF_TEXT(trace, 2, __FUNCTION__);
1768 if (ch == NULL)
1769 return;
1771 channel_free(ch);
1772 while (*c) {
1773 if (*c == ch) {
1774 *c = ch->next;
1775 fsm_deltimer(&ch->timer);
1776 kfree_fsm(ch->fsm);
1777 clear_normalized_cda(&ch->ccw[4]);
1778 if (ch->trans_skb != NULL) {
1779 clear_normalized_cda(&ch->ccw[1]);
1780 dev_kfree_skb(ch->trans_skb);
1782 kfree(ch->ccw);
1783 kfree(ch->irb);
1784 kfree(ch);
1785 return;
1787 c = &((*c)->next);
1792 * Get a specific channel from the channel list.
1794 * @param type Type of channel we are interested in.
1795 * @param id Id of channel we are interested in.
1796 * @param direction Direction we want to use this channel for.
1798 * @return Pointer to a channel or NULL if no matching channel available.
1800 static struct channel
1802 channel_get(enum channel_types type, char *id, int direction)
1804 struct channel *ch = channels;
1806 DBF_TEXT(trace, 3, __FUNCTION__);
1807 #ifdef DEBUG
1808 ctc_pr_debug("ctc: %s(): searching for ch with id %s and type %d\n",
1809 __func__, id, type);
1810 #endif
1812 while (ch && ((strncmp(ch->id, id, CTC_ID_SIZE)) || (ch->type != type))) {
1813 #ifdef DEBUG
1814 ctc_pr_debug("ctc: %s(): ch=0x%p (id=%s, type=%d\n",
1815 __func__, ch, ch->id, ch->type);
1816 #endif
1817 ch = ch->next;
1819 #ifdef DEBUG
1820 ctc_pr_debug("ctc: %s(): ch=0x%pq (id=%s, type=%d\n",
1821 __func__, ch, ch->id, ch->type);
1822 #endif
1823 if (!ch) {
1824 ctc_pr_warn("ctc: %s(): channel with id %s "
1825 "and type %d not found in channel list\n",
1826 __func__, id, type);
1827 } else {
1828 if (ch->flags & CHANNEL_FLAGS_INUSE)
1829 ch = NULL;
1830 else {
1831 ch->flags |= CHANNEL_FLAGS_INUSE;
1832 ch->flags &= ~CHANNEL_FLAGS_RWMASK;
1833 ch->flags |= (direction == WRITE)
1834 ? CHANNEL_FLAGS_WRITE : CHANNEL_FLAGS_READ;
1835 fsm_newstate(ch->fsm, CH_STATE_STOPPED);
1838 return ch;
1842 * Return the channel type by name.
1844 * @param name Name of network interface.
1846 * @return Type class of channel to be used for that interface.
1848 static enum channel_types inline
1849 extract_channel_media(char *name)
1851 enum channel_types ret = channel_type_unknown;
1853 if (name != NULL) {
1854 if (strncmp(name, "ctc", 3) == 0)
1855 ret = channel_type_parallel;
1856 if (strncmp(name, "escon", 5) == 0)
1857 ret = channel_type_escon;
1859 return ret;
1862 static long
1863 __ctc_check_irb_error(struct ccw_device *cdev, struct irb *irb)
1865 if (!IS_ERR(irb))
1866 return 0;
1868 switch (PTR_ERR(irb)) {
1869 case -EIO:
1870 ctc_pr_warn("i/o-error on device %s\n", cdev->dev.bus_id);
1871 // CTC_DBF_TEXT(trace, 2, "ckirberr");
1872 // CTC_DBF_TEXT_(trace, 2, " rc%d", -EIO);
1873 break;
1874 case -ETIMEDOUT:
1875 ctc_pr_warn("timeout on device %s\n", cdev->dev.bus_id);
1876 // CTC_DBF_TEXT(trace, 2, "ckirberr");
1877 // CTC_DBF_TEXT_(trace, 2, " rc%d", -ETIMEDOUT);
1878 break;
1879 default:
1880 ctc_pr_warn("unknown error %ld on device %s\n", PTR_ERR(irb),
1881 cdev->dev.bus_id);
1882 // CTC_DBF_TEXT(trace, 2, "ckirberr");
1883 // CTC_DBF_TEXT(trace, 2, " rc???");
1885 return PTR_ERR(irb);
1889 * Main IRQ handler.
1891 * @param cdev The ccw_device the interrupt is for.
1892 * @param intparm interruption parameter.
1893 * @param irb interruption response block.
1895 static void
1896 ctc_irq_handler(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
1898 struct channel *ch;
1899 struct net_device *dev;
1900 struct ctc_priv *priv;
1902 DBF_TEXT(trace, 5, __FUNCTION__);
1903 if (__ctc_check_irb_error(cdev, irb))
1904 return;
1906 /* Check for unsolicited interrupts. */
1907 if (!cdev->dev.driver_data) {
1908 ctc_pr_warn("ctc: Got unsolicited irq: %s c-%02x d-%02x\n",
1909 cdev->dev.bus_id, irb->scsw.cstat,
1910 irb->scsw.dstat);
1911 return;
1914 priv = ((struct ccwgroup_device *)cdev->dev.driver_data)
1915 ->dev.driver_data;
1917 /* Try to extract channel from driver data. */
1918 if (priv->channel[READ]->cdev == cdev)
1919 ch = priv->channel[READ];
1920 else if (priv->channel[WRITE]->cdev == cdev)
1921 ch = priv->channel[WRITE];
1922 else {
1923 ctc_pr_err("ctc: Can't determine channel for interrupt, "
1924 "device %s\n", cdev->dev.bus_id);
1925 return;
1928 dev = (struct net_device *) (ch->netdev);
1929 if (dev == NULL) {
1930 ctc_pr_crit("ctc: ctc_irq_handler dev=NULL bus_id=%s, ch=0x%p\n",
1931 cdev->dev.bus_id, ch);
1932 return;
1935 #ifdef DEBUG
1936 ctc_pr_debug("%s: interrupt for device: %s received c-%02x d-%02x\n",
1937 dev->name, ch->id, irb->scsw.cstat, irb->scsw.dstat);
1938 #endif
1940 /* Copy interruption response block. */
1941 memcpy(ch->irb, irb, sizeof(struct irb));
1943 /* Check for good subchannel return code, otherwise error message */
1944 if (ch->irb->scsw.cstat) {
1945 fsm_event(ch->fsm, CH_EVENT_SC_UNKNOWN, ch);
1946 ctc_pr_warn("%s: subchannel check for device: %s - %02x %02x\n",
1947 dev->name, ch->id, ch->irb->scsw.cstat,
1948 ch->irb->scsw.dstat);
1949 return;
1952 /* Check the reason-code of a unit check */
1953 if (ch->irb->scsw.dstat & DEV_STAT_UNIT_CHECK) {
1954 ccw_unit_check(ch, ch->irb->ecw[0]);
1955 return;
1957 if (ch->irb->scsw.dstat & DEV_STAT_BUSY) {
1958 if (ch->irb->scsw.dstat & DEV_STAT_ATTENTION)
1959 fsm_event(ch->fsm, CH_EVENT_ATTNBUSY, ch);
1960 else
1961 fsm_event(ch->fsm, CH_EVENT_BUSY, ch);
1962 return;
1964 if (ch->irb->scsw.dstat & DEV_STAT_ATTENTION) {
1965 fsm_event(ch->fsm, CH_EVENT_ATTN, ch);
1966 return;
1968 if ((ch->irb->scsw.stctl & SCSW_STCTL_SEC_STATUS) ||
1969 (ch->irb->scsw.stctl == SCSW_STCTL_STATUS_PEND) ||
1970 (ch->irb->scsw.stctl ==
1971 (SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND)))
1972 fsm_event(ch->fsm, CH_EVENT_FINSTAT, ch);
1973 else
1974 fsm_event(ch->fsm, CH_EVENT_IRQ, ch);
1979 * Actions for interface - statemachine.
1980 *****************************************************************************/
1983 * Startup channels by sending CH_EVENT_START to each channel.
1985 * @param fi An instance of an interface statemachine.
1986 * @param event The event, just happened.
1987 * @param arg Generic pointer, casted from struct net_device * upon call.
1989 static void
1990 dev_action_start(fsm_instance * fi, int event, void *arg)
1992 struct net_device *dev = (struct net_device *) arg;
1993 struct ctc_priv *privptr = dev->priv;
1994 int direction;
1996 DBF_TEXT(setup, 3, __FUNCTION__);
1997 fsm_deltimer(&privptr->restart_timer);
1998 fsm_newstate(fi, DEV_STATE_STARTWAIT_RXTX);
1999 for (direction = READ; direction <= WRITE; direction++) {
2000 struct channel *ch = privptr->channel[direction];
2001 fsm_event(ch->fsm, CH_EVENT_START, ch);
2006 * Shutdown channels by sending CH_EVENT_STOP to each channel.
2008 * @param fi An instance of an interface statemachine.
2009 * @param event The event, just happened.
2010 * @param arg Generic pointer, casted from struct net_device * upon call.
2012 static void
2013 dev_action_stop(fsm_instance * fi, int event, void *arg)
2015 struct net_device *dev = (struct net_device *) arg;
2016 struct ctc_priv *privptr = dev->priv;
2017 int direction;
2019 DBF_TEXT(trace, 3, __FUNCTION__);
2020 fsm_newstate(fi, DEV_STATE_STOPWAIT_RXTX);
2021 for (direction = READ; direction <= WRITE; direction++) {
2022 struct channel *ch = privptr->channel[direction];
2023 fsm_event(ch->fsm, CH_EVENT_STOP, ch);
2026 static void
2027 dev_action_restart(fsm_instance *fi, int event, void *arg)
2029 struct net_device *dev = (struct net_device *)arg;
2030 struct ctc_priv *privptr = dev->priv;
2032 DBF_TEXT(trace, 3, __FUNCTION__);
2033 ctc_pr_debug("%s: Restarting\n", dev->name);
2034 dev_action_stop(fi, event, arg);
2035 fsm_event(privptr->fsm, DEV_EVENT_STOP, dev);
2036 fsm_addtimer(&privptr->restart_timer, CTC_TIMEOUT_5SEC,
2037 DEV_EVENT_START, dev);
2041 * Called from channel statemachine
2042 * when a channel is up and running.
2044 * @param fi An instance of an interface statemachine.
2045 * @param event The event, just happened.
2046 * @param arg Generic pointer, casted from struct net_device * upon call.
2048 static void
2049 dev_action_chup(fsm_instance * fi, int event, void *arg)
2051 struct net_device *dev = (struct net_device *) arg;
2052 struct ctc_priv *privptr = dev->priv;
2054 DBF_TEXT(trace, 3, __FUNCTION__);
2055 switch (fsm_getstate(fi)) {
2056 case DEV_STATE_STARTWAIT_RXTX:
2057 if (event == DEV_EVENT_RXUP)
2058 fsm_newstate(fi, DEV_STATE_STARTWAIT_TX);
2059 else
2060 fsm_newstate(fi, DEV_STATE_STARTWAIT_RX);
2061 break;
2062 case DEV_STATE_STARTWAIT_RX:
2063 if (event == DEV_EVENT_RXUP) {
2064 fsm_newstate(fi, DEV_STATE_RUNNING);
2065 ctc_pr_info("%s: connected with remote side\n",
2066 dev->name);
2067 if (privptr->protocol == CTC_PROTO_LINUX_TTY)
2068 ctc_tty_setcarrier(dev, 1);
2069 ctc_clear_busy(dev);
2071 break;
2072 case DEV_STATE_STARTWAIT_TX:
2073 if (event == DEV_EVENT_TXUP) {
2074 fsm_newstate(fi, DEV_STATE_RUNNING);
2075 ctc_pr_info("%s: connected with remote side\n",
2076 dev->name);
2077 if (privptr->protocol == CTC_PROTO_LINUX_TTY)
2078 ctc_tty_setcarrier(dev, 1);
2079 ctc_clear_busy(dev);
2081 break;
2082 case DEV_STATE_STOPWAIT_TX:
2083 if (event == DEV_EVENT_RXUP)
2084 fsm_newstate(fi, DEV_STATE_STOPWAIT_RXTX);
2085 break;
2086 case DEV_STATE_STOPWAIT_RX:
2087 if (event == DEV_EVENT_TXUP)
2088 fsm_newstate(fi, DEV_STATE_STOPWAIT_RXTX);
2089 break;
2094 * Called from channel statemachine
2095 * when a channel has been shutdown.
2097 * @param fi An instance of an interface statemachine.
2098 * @param event The event, just happened.
2099 * @param arg Generic pointer, casted from struct net_device * upon call.
2101 static void
2102 dev_action_chdown(fsm_instance * fi, int event, void *arg)
2104 struct net_device *dev = (struct net_device *) arg;
2105 struct ctc_priv *privptr = dev->priv;
2107 DBF_TEXT(trace, 3, __FUNCTION__);
2108 switch (fsm_getstate(fi)) {
2109 case DEV_STATE_RUNNING:
2110 if (privptr->protocol == CTC_PROTO_LINUX_TTY)
2111 ctc_tty_setcarrier(dev, 0);
2112 if (event == DEV_EVENT_TXDOWN)
2113 fsm_newstate(fi, DEV_STATE_STARTWAIT_TX);
2114 else
2115 fsm_newstate(fi, DEV_STATE_STARTWAIT_RX);
2116 break;
2117 case DEV_STATE_STARTWAIT_RX:
2118 if (event == DEV_EVENT_TXDOWN)
2119 fsm_newstate(fi, DEV_STATE_STARTWAIT_RXTX);
2120 break;
2121 case DEV_STATE_STARTWAIT_TX:
2122 if (event == DEV_EVENT_RXDOWN)
2123 fsm_newstate(fi, DEV_STATE_STARTWAIT_RXTX);
2124 break;
2125 case DEV_STATE_STOPWAIT_RXTX:
2126 if (event == DEV_EVENT_TXDOWN)
2127 fsm_newstate(fi, DEV_STATE_STOPWAIT_RX);
2128 else
2129 fsm_newstate(fi, DEV_STATE_STOPWAIT_TX);
2130 break;
2131 case DEV_STATE_STOPWAIT_RX:
2132 if (event == DEV_EVENT_RXDOWN)
2133 fsm_newstate(fi, DEV_STATE_STOPPED);
2134 break;
2135 case DEV_STATE_STOPWAIT_TX:
2136 if (event == DEV_EVENT_TXDOWN)
2137 fsm_newstate(fi, DEV_STATE_STOPPED);
2138 break;
2142 static const fsm_node dev_fsm[] = {
2143 {DEV_STATE_STOPPED, DEV_EVENT_START, dev_action_start},
2145 {DEV_STATE_STOPWAIT_RXTX, DEV_EVENT_START, dev_action_start },
2146 {DEV_STATE_STOPWAIT_RXTX, DEV_EVENT_RXDOWN, dev_action_chdown },
2147 {DEV_STATE_STOPWAIT_RXTX, DEV_EVENT_TXDOWN, dev_action_chdown },
2148 {DEV_STATE_STOPWAIT_RXTX, DEV_EVENT_RESTART, dev_action_restart },
2150 {DEV_STATE_STOPWAIT_RX, DEV_EVENT_START, dev_action_start },
2151 {DEV_STATE_STOPWAIT_RX, DEV_EVENT_RXUP, dev_action_chup },
2152 {DEV_STATE_STOPWAIT_RX, DEV_EVENT_TXUP, dev_action_chup },
2153 {DEV_STATE_STOPWAIT_RX, DEV_EVENT_RXDOWN, dev_action_chdown },
2154 {DEV_STATE_STOPWAIT_RX, DEV_EVENT_RESTART, dev_action_restart },
2156 {DEV_STATE_STOPWAIT_TX, DEV_EVENT_START, dev_action_start },
2157 {DEV_STATE_STOPWAIT_TX, DEV_EVENT_RXUP, dev_action_chup },
2158 {DEV_STATE_STOPWAIT_TX, DEV_EVENT_TXUP, dev_action_chup },
2159 {DEV_STATE_STOPWAIT_TX, DEV_EVENT_TXDOWN, dev_action_chdown },
2160 {DEV_STATE_STOPWAIT_TX, DEV_EVENT_RESTART, dev_action_restart },
2162 {DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_STOP, dev_action_stop },
2163 {DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_RXUP, dev_action_chup },
2164 {DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_TXUP, dev_action_chup },
2165 {DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_RXDOWN, dev_action_chdown },
2166 {DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_TXDOWN, dev_action_chdown },
2167 {DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_RESTART, dev_action_restart },
2169 {DEV_STATE_STARTWAIT_TX, DEV_EVENT_STOP, dev_action_stop },
2170 {DEV_STATE_STARTWAIT_TX, DEV_EVENT_RXUP, dev_action_chup },
2171 {DEV_STATE_STARTWAIT_TX, DEV_EVENT_TXUP, dev_action_chup },
2172 {DEV_STATE_STARTWAIT_TX, DEV_EVENT_RXDOWN, dev_action_chdown },
2173 {DEV_STATE_STARTWAIT_TX, DEV_EVENT_RESTART, dev_action_restart },
2175 {DEV_STATE_STARTWAIT_RX, DEV_EVENT_STOP, dev_action_stop },
2176 {DEV_STATE_STARTWAIT_RX, DEV_EVENT_RXUP, dev_action_chup },
2177 {DEV_STATE_STARTWAIT_RX, DEV_EVENT_TXUP, dev_action_chup },
2178 {DEV_STATE_STARTWAIT_RX, DEV_EVENT_TXDOWN, dev_action_chdown },
2179 {DEV_STATE_STARTWAIT_RX, DEV_EVENT_RESTART, dev_action_restart },
2181 {DEV_STATE_RUNNING, DEV_EVENT_STOP, dev_action_stop },
2182 {DEV_STATE_RUNNING, DEV_EVENT_RXDOWN, dev_action_chdown },
2183 {DEV_STATE_RUNNING, DEV_EVENT_TXDOWN, dev_action_chdown },
2184 {DEV_STATE_RUNNING, DEV_EVENT_TXUP, fsm_action_nop },
2185 {DEV_STATE_RUNNING, DEV_EVENT_RXUP, fsm_action_nop },
2186 {DEV_STATE_RUNNING, DEV_EVENT_RESTART, dev_action_restart },
2189 static const int DEV_FSM_LEN = sizeof (dev_fsm) / sizeof (fsm_node);
2192 * Transmit a packet.
2193 * This is a helper function for ctc_tx().
2195 * @param ch Channel to be used for sending.
2196 * @param skb Pointer to struct sk_buff of packet to send.
2197 * The linklevel header has already been set up
2198 * by ctc_tx().
2200 * @return 0 on success, -ERRNO on failure. (Never fails.)
2202 static int
2203 transmit_skb(struct channel *ch, struct sk_buff *skb)
2205 unsigned long saveflags;
2206 struct ll_header header;
2207 int rc = 0;
2209 DBF_TEXT(trace, 5, __FUNCTION__);
2210 /* we need to acquire the lock for testing the state
2211 * otherwise we can have an IRQ changing the state to
2212 * TXIDLE after the test but before acquiring the lock.
2214 spin_lock_irqsave(&ch->collect_lock, saveflags);
2215 if (fsm_getstate(ch->fsm) != CH_STATE_TXIDLE) {
2216 int l = skb->len + LL_HEADER_LENGTH;
2218 if (ch->collect_len + l > ch->max_bufsize - 2) {
2219 spin_unlock_irqrestore(&ch->collect_lock, saveflags);
2220 return -EBUSY;
2221 } else {
2222 atomic_inc(&skb->users);
2223 header.length = l;
2224 header.type = skb->protocol;
2225 header.unused = 0;
2226 memcpy(skb_push(skb, LL_HEADER_LENGTH), &header,
2227 LL_HEADER_LENGTH);
2228 skb_queue_tail(&ch->collect_queue, skb);
2229 ch->collect_len += l;
2231 spin_unlock_irqrestore(&ch->collect_lock, saveflags);
2232 } else {
2233 __u16 block_len;
2234 int ccw_idx;
2235 struct sk_buff *nskb;
2236 unsigned long hi;
2237 spin_unlock_irqrestore(&ch->collect_lock, saveflags);
2239 * Protect skb against beeing free'd by upper
2240 * layers.
2242 atomic_inc(&skb->users);
2243 ch->prof.txlen += skb->len;
2244 header.length = skb->len + LL_HEADER_LENGTH;
2245 header.type = skb->protocol;
2246 header.unused = 0;
2247 memcpy(skb_push(skb, LL_HEADER_LENGTH), &header,
2248 LL_HEADER_LENGTH);
2249 block_len = skb->len + 2;
2250 *((__u16 *) skb_push(skb, 2)) = block_len;
2253 * IDAL support in CTC is broken, so we have to
2254 * care about skb's above 2G ourselves.
2256 hi = ((unsigned long) skb->tail + LL_HEADER_LENGTH) >> 31;
2257 if (hi) {
2258 nskb = alloc_skb(skb->len, GFP_ATOMIC | GFP_DMA);
2259 if (!nskb) {
2260 atomic_dec(&skb->users);
2261 skb_pull(skb, LL_HEADER_LENGTH + 2);
2262 ctc_clear_busy(ch->netdev);
2263 return -ENOMEM;
2264 } else {
2265 memcpy(skb_put(nskb, skb->len),
2266 skb->data, skb->len);
2267 atomic_inc(&nskb->users);
2268 atomic_dec(&skb->users);
2269 dev_kfree_skb_irq(skb);
2270 skb = nskb;
2274 ch->ccw[4].count = block_len;
2275 if (set_normalized_cda(&ch->ccw[4], skb->data)) {
2277 * idal allocation failed, try via copying to
2278 * trans_skb. trans_skb usually has a pre-allocated
2279 * idal.
2281 if (ctc_checkalloc_buffer(ch, 1)) {
2283 * Remove our header. It gets added
2284 * again on retransmit.
2286 atomic_dec(&skb->users);
2287 skb_pull(skb, LL_HEADER_LENGTH + 2);
2288 ctc_clear_busy(ch->netdev);
2289 return -EBUSY;
2292 ch->trans_skb->tail = ch->trans_skb->data;
2293 ch->trans_skb->len = 0;
2294 ch->ccw[1].count = skb->len;
2295 memcpy(skb_put(ch->trans_skb, skb->len), skb->data,
2296 skb->len);
2297 atomic_dec(&skb->users);
2298 dev_kfree_skb_irq(skb);
2299 ccw_idx = 0;
2300 } else {
2301 skb_queue_tail(&ch->io_queue, skb);
2302 ccw_idx = 3;
2304 ch->retry = 0;
2305 fsm_newstate(ch->fsm, CH_STATE_TX);
2306 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
2307 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
2308 ch->prof.send_stamp = xtime;
2309 rc = ccw_device_start(ch->cdev, &ch->ccw[ccw_idx],
2310 (unsigned long) ch, 0xff, 0);
2311 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
2312 if (ccw_idx == 3)
2313 ch->prof.doios_single++;
2314 if (rc != 0) {
2315 fsm_deltimer(&ch->timer);
2316 ccw_check_return_code(ch, rc, "single skb TX");
2317 if (ccw_idx == 3)
2318 skb_dequeue_tail(&ch->io_queue);
2320 * Remove our header. It gets added
2321 * again on retransmit.
2323 skb_pull(skb, LL_HEADER_LENGTH + 2);
2324 } else {
2325 if (ccw_idx == 0) {
2326 struct net_device *dev = ch->netdev;
2327 struct ctc_priv *privptr = dev->priv;
2328 privptr->stats.tx_packets++;
2329 privptr->stats.tx_bytes +=
2330 skb->len - LL_HEADER_LENGTH;
2335 ctc_clear_busy(ch->netdev);
2336 return rc;
2340 * Interface API for upper network layers
2341 *****************************************************************************/
2344 * Open an interface.
2345 * Called from generic network layer when ifconfig up is run.
2347 * @param dev Pointer to interface struct.
2349 * @return 0 on success, -ERRNO on failure. (Never fails.)
2351 static int
2352 ctc_open(struct net_device * dev)
2354 DBF_TEXT(trace, 5, __FUNCTION__);
2355 fsm_event(((struct ctc_priv *) dev->priv)->fsm, DEV_EVENT_START, dev);
2356 return 0;
2360 * Close an interface.
2361 * Called from generic network layer when ifconfig down is run.
2363 * @param dev Pointer to interface struct.
2365 * @return 0 on success, -ERRNO on failure. (Never fails.)
2367 static int
2368 ctc_close(struct net_device * dev)
2370 DBF_TEXT(trace, 5, __FUNCTION__);
2371 fsm_event(((struct ctc_priv *) dev->priv)->fsm, DEV_EVENT_STOP, dev);
2372 return 0;
2376 * Start transmission of a packet.
2377 * Called from generic network device layer.
2379 * @param skb Pointer to buffer containing the packet.
2380 * @param dev Pointer to interface struct.
2382 * @return 0 if packet consumed, !0 if packet rejected.
2383 * Note: If we return !0, then the packet is free'd by
2384 * the generic network layer.
2386 static int
2387 ctc_tx(struct sk_buff *skb, struct net_device * dev)
2389 int rc = 0;
2390 struct ctc_priv *privptr = (struct ctc_priv *) dev->priv;
2392 DBF_TEXT(trace, 5, __FUNCTION__);
2394 * Some sanity checks ...
2396 if (skb == NULL) {
2397 ctc_pr_warn("%s: NULL sk_buff passed\n", dev->name);
2398 privptr->stats.tx_dropped++;
2399 return 0;
2401 if (skb_headroom(skb) < (LL_HEADER_LENGTH + 2)) {
2402 ctc_pr_warn("%s: Got sk_buff with head room < %ld bytes\n",
2403 dev->name, LL_HEADER_LENGTH + 2);
2404 dev_kfree_skb(skb);
2405 privptr->stats.tx_dropped++;
2406 return 0;
2410 * If channels are not running, try to restart them
2411 * and throw away packet.
2413 if (fsm_getstate(privptr->fsm) != DEV_STATE_RUNNING) {
2414 fsm_event(privptr->fsm, DEV_EVENT_START, dev);
2415 if (privptr->protocol == CTC_PROTO_LINUX_TTY)
2416 return -EBUSY;
2417 dev_kfree_skb(skb);
2418 privptr->stats.tx_dropped++;
2419 privptr->stats.tx_errors++;
2420 privptr->stats.tx_carrier_errors++;
2421 return 0;
2424 if (ctc_test_and_set_busy(dev))
2425 return -EBUSY;
2427 dev->trans_start = jiffies;
2428 if (transmit_skb(privptr->channel[WRITE], skb) != 0)
2429 rc = 1;
2430 return rc;
2434 * Sets MTU of an interface.
2436 * @param dev Pointer to interface struct.
2437 * @param new_mtu The new MTU to use for this interface.
2439 * @return 0 on success, -EINVAL if MTU is out of valid range.
2440 * (valid range is 576 .. 65527). If VM is on the
2441 * remote side, maximum MTU is 32760, however this is
2442 * <em>not</em> checked here.
2444 static int
2445 ctc_change_mtu(struct net_device * dev, int new_mtu)
2447 struct ctc_priv *privptr = (struct ctc_priv *) dev->priv;
2449 DBF_TEXT(trace, 3, __FUNCTION__);
2450 if ((new_mtu < 576) || (new_mtu > 65527) ||
2451 (new_mtu > (privptr->channel[READ]->max_bufsize -
2452 LL_HEADER_LENGTH - 2)))
2453 return -EINVAL;
2454 dev->mtu = new_mtu;
2455 dev->hard_header_len = LL_HEADER_LENGTH + 2;
2456 return 0;
2460 * Returns interface statistics of a device.
2462 * @param dev Pointer to interface struct.
2464 * @return Pointer to stats struct of this interface.
2466 static struct net_device_stats *
2467 ctc_stats(struct net_device * dev)
2469 return &((struct ctc_priv *) dev->priv)->stats;
2473 * sysfs attributes
2476 static ssize_t
2477 buffer_show(struct device *dev, struct device_attribute *attr, char *buf)
2479 struct ctc_priv *priv;
2481 priv = dev->driver_data;
2482 if (!priv)
2483 return -ENODEV;
2484 return sprintf(buf, "%d\n",
2485 priv->buffer_size);
2488 static ssize_t
2489 buffer_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
2491 struct ctc_priv *priv;
2492 struct net_device *ndev;
2493 int bs1;
2494 char buffer[16];
2496 DBF_TEXT(trace, 3, __FUNCTION__);
2497 DBF_TEXT(trace, 3, buf);
2498 priv = dev->driver_data;
2499 if (!priv) {
2500 DBF_TEXT(trace, 3, "bfnopriv");
2501 return -ENODEV;
2504 sscanf(buf, "%u", &bs1);
2505 if (bs1 > CTC_BUFSIZE_LIMIT)
2506 goto einval;
2507 if (bs1 < (576 + LL_HEADER_LENGTH + 2))
2508 goto einval;
2509 priv->buffer_size = bs1; // just to overwrite the default
2511 ndev = priv->channel[READ]->netdev;
2512 if (!ndev) {
2513 DBF_TEXT(trace, 3, "bfnondev");
2514 return -ENODEV;
2517 if ((ndev->flags & IFF_RUNNING) &&
2518 (bs1 < (ndev->mtu + LL_HEADER_LENGTH + 2)))
2519 goto einval;
2521 priv->channel[READ]->max_bufsize = bs1;
2522 priv->channel[WRITE]->max_bufsize = bs1;
2523 if (!(ndev->flags & IFF_RUNNING))
2524 ndev->mtu = bs1 - LL_HEADER_LENGTH - 2;
2525 priv->channel[READ]->flags |= CHANNEL_FLAGS_BUFSIZE_CHANGED;
2526 priv->channel[WRITE]->flags |= CHANNEL_FLAGS_BUFSIZE_CHANGED;
2528 sprintf(buffer, "%d",priv->buffer_size);
2529 DBF_TEXT(trace, 3, buffer);
2530 return count;
2532 einval:
2533 DBF_TEXT(trace, 3, "buff_err");
2534 return -EINVAL;
2537 static ssize_t
2538 loglevel_show(struct device *dev, struct device_attribute *attr, char *buf)
2540 return sprintf(buf, "%d\n", loglevel);
2543 static ssize_t
2544 loglevel_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
2546 int ll1;
2548 DBF_TEXT(trace, 5, __FUNCTION__);
2549 sscanf(buf, "%i", &ll1);
2551 if ((ll1 > CTC_LOGLEVEL_MAX) || (ll1 < 0))
2552 return -EINVAL;
2553 loglevel = ll1;
2554 return count;
2557 static void
2558 ctc_print_statistics(struct ctc_priv *priv)
2560 char *sbuf;
2561 char *p;
2563 DBF_TEXT(trace, 4, __FUNCTION__);
2564 if (!priv)
2565 return;
2566 sbuf = (char *)kmalloc(2048, GFP_KERNEL);
2567 if (sbuf == NULL)
2568 return;
2569 p = sbuf;
2571 p += sprintf(p, " Device FSM state: %s\n",
2572 fsm_getstate_str(priv->fsm));
2573 p += sprintf(p, " RX channel FSM state: %s\n",
2574 fsm_getstate_str(priv->channel[READ]->fsm));
2575 p += sprintf(p, " TX channel FSM state: %s\n",
2576 fsm_getstate_str(priv->channel[WRITE]->fsm));
2577 p += sprintf(p, " Max. TX buffer used: %ld\n",
2578 priv->channel[WRITE]->prof.maxmulti);
2579 p += sprintf(p, " Max. chained SKBs: %ld\n",
2580 priv->channel[WRITE]->prof.maxcqueue);
2581 p += sprintf(p, " TX single write ops: %ld\n",
2582 priv->channel[WRITE]->prof.doios_single);
2583 p += sprintf(p, " TX multi write ops: %ld\n",
2584 priv->channel[WRITE]->prof.doios_multi);
2585 p += sprintf(p, " Netto bytes written: %ld\n",
2586 priv->channel[WRITE]->prof.txlen);
2587 p += sprintf(p, " Max. TX IO-time: %ld\n",
2588 priv->channel[WRITE]->prof.tx_time);
2590 ctc_pr_debug("Statistics for %s:\n%s",
2591 priv->channel[WRITE]->netdev->name, sbuf);
2592 kfree(sbuf);
2593 return;
2596 static ssize_t
2597 stats_show(struct device *dev, struct device_attribute *attr, char *buf)
2599 struct ctc_priv *priv = dev->driver_data;
2600 if (!priv)
2601 return -ENODEV;
2602 ctc_print_statistics(priv);
2603 return sprintf(buf, "0\n");
2606 static ssize_t
2607 stats_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
2609 struct ctc_priv *priv = dev->driver_data;
2610 if (!priv)
2611 return -ENODEV;
2612 /* Reset statistics */
2613 memset(&priv->channel[WRITE]->prof, 0,
2614 sizeof(priv->channel[WRITE]->prof));
2615 return count;
2618 static void
2619 ctc_netdev_unregister(struct net_device * dev)
2621 struct ctc_priv *privptr;
2623 if (!dev)
2624 return;
2625 privptr = (struct ctc_priv *) dev->priv;
2626 if (privptr->protocol != CTC_PROTO_LINUX_TTY)
2627 unregister_netdev(dev);
2628 else
2629 ctc_tty_unregister_netdev(dev);
2632 static int
2633 ctc_netdev_register(struct net_device * dev)
2635 struct ctc_priv *privptr = (struct ctc_priv *) dev->priv;
2636 if (privptr->protocol != CTC_PROTO_LINUX_TTY)
2637 return register_netdev(dev);
2638 else
2639 return ctc_tty_register_netdev(dev);
2642 static void
2643 ctc_free_netdevice(struct net_device * dev, int free_dev)
2645 struct ctc_priv *privptr;
2646 if (!dev)
2647 return;
2648 privptr = dev->priv;
2649 if (privptr) {
2650 if (privptr->fsm)
2651 kfree_fsm(privptr->fsm);
2652 kfree(privptr);
2654 #ifdef MODULE
2655 if (free_dev)
2656 free_netdev(dev);
2657 #endif
2660 static ssize_t
2661 ctc_proto_show(struct device *dev, struct device_attribute *attr, char *buf)
2663 struct ctc_priv *priv;
2665 priv = dev->driver_data;
2666 if (!priv)
2667 return -ENODEV;
2669 return sprintf(buf, "%d\n", priv->protocol);
2672 static ssize_t
2673 ctc_proto_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
2675 struct ctc_priv *priv;
2676 int value;
2678 DBF_TEXT(trace, 3, __FUNCTION__);
2679 pr_debug("%s() called\n", __FUNCTION__);
2681 priv = dev->driver_data;
2682 if (!priv)
2683 return -ENODEV;
2684 sscanf(buf, "%u", &value);
2685 if ((value < 0) || (value > CTC_PROTO_MAX))
2686 return -EINVAL;
2687 priv->protocol = value;
2689 return count;
2692 static ssize_t
2693 ctc_type_show(struct device *dev, struct device_attribute *attr, char *buf)
2695 struct ccwgroup_device *cgdev;
2697 cgdev = to_ccwgroupdev(dev);
2698 if (!cgdev)
2699 return -ENODEV;
2701 return sprintf(buf, "%s\n", cu3088_type[cgdev->cdev[0]->id.driver_info]);
2704 static DEVICE_ATTR(buffer, 0644, buffer_show, buffer_write);
2705 static DEVICE_ATTR(protocol, 0644, ctc_proto_show, ctc_proto_store);
2706 static DEVICE_ATTR(type, 0444, ctc_type_show, NULL);
2708 static DEVICE_ATTR(loglevel, 0644, loglevel_show, loglevel_write);
2709 static DEVICE_ATTR(stats, 0644, stats_show, stats_write);
2711 static struct attribute *ctc_attr[] = {
2712 &dev_attr_protocol.attr,
2713 &dev_attr_type.attr,
2714 &dev_attr_buffer.attr,
2715 NULL,
2718 static struct attribute_group ctc_attr_group = {
2719 .attrs = ctc_attr,
2722 static int
2723 ctc_add_attributes(struct device *dev)
2725 device_create_file(dev, &dev_attr_loglevel);
2726 device_create_file(dev, &dev_attr_stats);
2727 return 0;
2730 static void
2731 ctc_remove_attributes(struct device *dev)
2733 device_remove_file(dev, &dev_attr_stats);
2734 device_remove_file(dev, &dev_attr_loglevel);
2737 static int
2738 ctc_add_files(struct device *dev)
2740 pr_debug("%s() called\n", __FUNCTION__);
2742 return sysfs_create_group(&dev->kobj, &ctc_attr_group);
2745 static void
2746 ctc_remove_files(struct device *dev)
2748 pr_debug("%s() called\n", __FUNCTION__);
2750 sysfs_remove_group(&dev->kobj, &ctc_attr_group);
2754 * Add ctc specific attributes.
2755 * Add ctc private data.
2757 * @param cgdev pointer to ccwgroup_device just added
2759 * @returns 0 on success, !0 on failure.
2761 static int
2762 ctc_probe_device(struct ccwgroup_device *cgdev)
2764 struct ctc_priv *priv;
2765 int rc;
2766 char buffer[16];
2768 pr_debug("%s() called\n", __FUNCTION__);
2769 DBF_TEXT(setup, 3, __FUNCTION__);
2771 if (!get_device(&cgdev->dev))
2772 return -ENODEV;
2774 priv = kmalloc(sizeof (struct ctc_priv), GFP_KERNEL);
2775 if (!priv) {
2776 ctc_pr_err("%s: Out of memory\n", __func__);
2777 put_device(&cgdev->dev);
2778 return -ENOMEM;
2781 memset(priv, 0, sizeof (struct ctc_priv));
2782 rc = ctc_add_files(&cgdev->dev);
2783 if (rc) {
2784 kfree(priv);
2785 put_device(&cgdev->dev);
2786 return rc;
2788 priv->buffer_size = CTC_BUFSIZE_DEFAULT;
2789 cgdev->cdev[0]->handler = ctc_irq_handler;
2790 cgdev->cdev[1]->handler = ctc_irq_handler;
2791 cgdev->dev.driver_data = priv;
2793 sprintf(buffer, "%p", priv);
2794 DBF_TEXT(data, 3, buffer);
2796 sprintf(buffer, "%u", (unsigned int)sizeof(struct ctc_priv));
2797 DBF_TEXT(data, 3, buffer);
2799 sprintf(buffer, "%p", &channels);
2800 DBF_TEXT(data, 3, buffer);
2802 sprintf(buffer, "%u", (unsigned int)sizeof(struct channel));
2803 DBF_TEXT(data, 3, buffer);
2805 return 0;
2809 * Initialize everything of the net device except the name and the
2810 * channel structs.
2812 static struct net_device *
2813 ctc_init_netdevice(struct net_device * dev, int alloc_device,
2814 struct ctc_priv *privptr)
2816 if (!privptr)
2817 return NULL;
2819 DBF_TEXT(setup, 3, __FUNCTION__);
2821 if (alloc_device) {
2822 dev = kmalloc(sizeof (struct net_device), GFP_KERNEL);
2823 if (!dev)
2824 return NULL;
2825 memset(dev, 0, sizeof (struct net_device));
2828 dev->priv = privptr;
2829 privptr->fsm = init_fsm("ctcdev", dev_state_names,
2830 dev_event_names, CTC_NR_DEV_STATES, CTC_NR_DEV_EVENTS,
2831 dev_fsm, DEV_FSM_LEN, GFP_KERNEL);
2832 if (privptr->fsm == NULL) {
2833 if (alloc_device)
2834 kfree(dev);
2835 return NULL;
2837 fsm_newstate(privptr->fsm, DEV_STATE_STOPPED);
2838 fsm_settimer(privptr->fsm, &privptr->restart_timer);
2839 if (dev->mtu == 0)
2840 dev->mtu = CTC_BUFSIZE_DEFAULT - LL_HEADER_LENGTH - 2;
2841 dev->hard_start_xmit = ctc_tx;
2842 dev->open = ctc_open;
2843 dev->stop = ctc_close;
2844 dev->get_stats = ctc_stats;
2845 dev->change_mtu = ctc_change_mtu;
2846 dev->hard_header_len = LL_HEADER_LENGTH + 2;
2847 dev->addr_len = 0;
2848 dev->type = ARPHRD_SLIP;
2849 dev->tx_queue_len = 100;
2850 dev->flags = IFF_POINTOPOINT | IFF_NOARP;
2851 SET_MODULE_OWNER(dev);
2852 return dev;
2858 * Setup an interface.
2860 * @param cgdev Device to be setup.
2862 * @returns 0 on success, !0 on failure.
2864 static int
2865 ctc_new_device(struct ccwgroup_device *cgdev)
2867 char read_id[CTC_ID_SIZE];
2868 char write_id[CTC_ID_SIZE];
2869 int direction;
2870 enum channel_types type;
2871 struct ctc_priv *privptr;
2872 struct net_device *dev;
2873 int ret;
2874 char buffer[16];
2876 pr_debug("%s() called\n", __FUNCTION__);
2877 DBF_TEXT(setup, 3, __FUNCTION__);
2879 privptr = cgdev->dev.driver_data;
2880 if (!privptr)
2881 return -ENODEV;
2883 sprintf(buffer, "%d", privptr->buffer_size);
2884 DBF_TEXT(setup, 3, buffer);
2886 type = get_channel_type(&cgdev->cdev[0]->id);
2888 snprintf(read_id, CTC_ID_SIZE, "ch-%s", cgdev->cdev[0]->dev.bus_id);
2889 snprintf(write_id, CTC_ID_SIZE, "ch-%s", cgdev->cdev[1]->dev.bus_id);
2891 if (add_channel(cgdev->cdev[0], type))
2892 return -ENOMEM;
2893 if (add_channel(cgdev->cdev[1], type))
2894 return -ENOMEM;
2896 ret = ccw_device_set_online(cgdev->cdev[0]);
2897 if (ret != 0) {
2898 printk(KERN_WARNING
2899 "ccw_device_set_online (cdev[0]) failed with ret = %d\n", ret);
2902 ret = ccw_device_set_online(cgdev->cdev[1]);
2903 if (ret != 0) {
2904 printk(KERN_WARNING
2905 "ccw_device_set_online (cdev[1]) failed with ret = %d\n", ret);
2908 dev = ctc_init_netdevice(NULL, 1, privptr);
2910 if (!dev) {
2911 ctc_pr_warn("ctc_init_netdevice failed\n");
2912 goto out;
2915 if (privptr->protocol == CTC_PROTO_LINUX_TTY)
2916 strlcpy(dev->name, "ctctty%d", IFNAMSIZ);
2917 else
2918 strlcpy(dev->name, "ctc%d", IFNAMSIZ);
2920 for (direction = READ; direction <= WRITE; direction++) {
2921 privptr->channel[direction] =
2922 channel_get(type, direction == READ ? read_id : write_id,
2923 direction);
2924 if (privptr->channel[direction] == NULL) {
2925 if (direction == WRITE)
2926 channel_free(privptr->channel[READ]);
2928 ctc_free_netdevice(dev, 1);
2929 goto out;
2931 privptr->channel[direction]->netdev = dev;
2932 privptr->channel[direction]->protocol = privptr->protocol;
2933 privptr->channel[direction]->max_bufsize = privptr->buffer_size;
2935 /* sysfs magic */
2936 SET_NETDEV_DEV(dev, &cgdev->dev);
2938 if (ctc_netdev_register(dev) != 0) {
2939 ctc_free_netdevice(dev, 1);
2940 goto out;
2943 ctc_add_attributes(&cgdev->dev);
2945 strlcpy(privptr->fsm->name, dev->name, sizeof (privptr->fsm->name));
2947 print_banner();
2949 ctc_pr_info("%s: read: %s, write: %s, proto: %d\n",
2950 dev->name, privptr->channel[READ]->id,
2951 privptr->channel[WRITE]->id, privptr->protocol);
2953 return 0;
2954 out:
2955 ccw_device_set_offline(cgdev->cdev[1]);
2956 ccw_device_set_offline(cgdev->cdev[0]);
2958 return -ENODEV;
2962 * Shutdown an interface.
2964 * @param cgdev Device to be shut down.
2966 * @returns 0 on success, !0 on failure.
2968 static int
2969 ctc_shutdown_device(struct ccwgroup_device *cgdev)
2971 struct ctc_priv *priv;
2972 struct net_device *ndev;
2974 DBF_TEXT(setup, 3, __FUNCTION__);
2975 pr_debug("%s() called\n", __FUNCTION__);
2978 priv = cgdev->dev.driver_data;
2979 ndev = NULL;
2980 if (!priv)
2981 return -ENODEV;
2983 if (priv->channel[READ]) {
2984 ndev = priv->channel[READ]->netdev;
2986 /* Close the device */
2987 ctc_close(ndev);
2988 ndev->flags &=~IFF_RUNNING;
2990 ctc_remove_attributes(&cgdev->dev);
2992 channel_free(priv->channel[READ]);
2994 if (priv->channel[WRITE])
2995 channel_free(priv->channel[WRITE]);
2997 if (ndev) {
2998 ctc_netdev_unregister(ndev);
2999 ndev->priv = NULL;
3000 ctc_free_netdevice(ndev, 1);
3003 if (priv->fsm)
3004 kfree_fsm(priv->fsm);
3006 ccw_device_set_offline(cgdev->cdev[1]);
3007 ccw_device_set_offline(cgdev->cdev[0]);
3009 if (priv->channel[READ])
3010 channel_remove(priv->channel[READ]);
3011 if (priv->channel[WRITE])
3012 channel_remove(priv->channel[WRITE]);
3013 priv->channel[READ] = priv->channel[WRITE] = NULL;
3015 return 0;
3019 static void
3020 ctc_remove_device(struct ccwgroup_device *cgdev)
3022 struct ctc_priv *priv;
3024 pr_debug("%s() called\n", __FUNCTION__);
3025 DBF_TEXT(setup, 3, __FUNCTION__);
3027 priv = cgdev->dev.driver_data;
3028 if (!priv)
3029 return;
3030 if (cgdev->state == CCWGROUP_ONLINE)
3031 ctc_shutdown_device(cgdev);
3032 ctc_remove_files(&cgdev->dev);
3033 cgdev->dev.driver_data = NULL;
3034 kfree(priv);
3035 put_device(&cgdev->dev);
3038 static struct ccwgroup_driver ctc_group_driver = {
3039 .owner = THIS_MODULE,
3040 .name = "ctc",
3041 .max_slaves = 2,
3042 .driver_id = 0xC3E3C3,
3043 .probe = ctc_probe_device,
3044 .remove = ctc_remove_device,
3045 .set_online = ctc_new_device,
3046 .set_offline = ctc_shutdown_device,
3050 * Module related routines
3051 *****************************************************************************/
3054 * Prepare to be unloaded. Free IRQ's and release all resources.
3055 * This is called just before this module is unloaded. It is
3056 * <em>not</em> called, if the usage count is !0, so we don't need to check
3057 * for that.
3059 static void __exit
3060 ctc_exit(void)
3062 DBF_TEXT(setup, 3, __FUNCTION__);
3063 unregister_cu3088_discipline(&ctc_group_driver);
3064 ctc_tty_cleanup();
3065 ctc_unregister_dbf_views();
3066 ctc_pr_info("CTC driver unloaded\n");
3070 * Initialize module.
3071 * This is called just after the module is loaded.
3073 * @return 0 on success, !0 on error.
3075 static int __init
3076 ctc_init(void)
3078 int ret = 0;
3080 loglevel = CTC_LOGLEVEL_DEFAULT;
3082 DBF_TEXT(setup, 3, __FUNCTION__);
3084 print_banner();
3086 ret = ctc_register_dbf_views();
3087 if (ret){
3088 ctc_pr_crit("ctc_init failed with ctc_register_dbf_views rc = %d\n", ret);
3089 return ret;
3091 ctc_tty_init();
3092 ret = register_cu3088_discipline(&ctc_group_driver);
3093 if (ret) {
3094 ctc_tty_cleanup();
3095 ctc_unregister_dbf_views();
3097 return ret;
3100 module_init(ctc_init);
3101 module_exit(ctc_exit);
3103 /* --- This is the END my friend --- */