1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43#undef DEBUG
44
45#include <linux/module.h>
46#include <linux/init.h>
47#include <linux/kernel.h>
48#include <linux/slab.h>
49#include <linux/errno.h>
50#include <linux/types.h>
51#include <linux/interrupt.h>
52#include <linux/timer.h>
53#include <linux/sched.h>
54#include <linux/bitops.h>
55
56#include <linux/signal.h>
57#include <linux/string.h>
58
59#include <linux/ip.h>
60#include <linux/if_arp.h>
61#include <linux/tcp.h>
62#include <linux/skbuff.h>
63#include <linux/ctype.h>
64#include <net/dst.h>
65
66#include <asm/io.h>
67#include <asm/ccwdev.h>
68#include <asm/ccwgroup.h>
69#include <asm/uaccess.h>
70
71#include <asm/idals.h>
72
73#include "ctctty.h"
74#include "fsm.h"
75#include "cu3088.h"
76#include "ctcdbug.h"
77
78MODULE_AUTHOR("(C) 2000 IBM Corp. by Fritz Elfert (felfert@millenux.com)");
79MODULE_DESCRIPTION("Linux for S/390 CTC/Escon Driver");
80MODULE_LICENSE("GPL");
81
82
83
84
85#define CCW_CMD_WRITE 0x01
86#define CCW_CMD_READ 0x02
87#define CCW_CMD_SET_EXTENDED 0xc3
88#define CCW_CMD_PREPARE 0xe3
89
90#define CTC_PROTO_S390 0
91#define CTC_PROTO_LINUX 1
92#define CTC_PROTO_LINUX_TTY 2
93#define CTC_PROTO_OS390 3
94#define CTC_PROTO_MAX 3
95
96#define CTC_BUFSIZE_LIMIT 65535
97#define CTC_BUFSIZE_DEFAULT 32768
98
99#define CTC_TIMEOUT_5SEC 5000
100
101#define CTC_INITIAL_BLOCKLEN 2
102
103#define READ 0
104#define WRITE 1
105
106#define CTC_ID_SIZE BUS_ID_SIZE+3
107
108
109struct ctc_profile {
110 unsigned long maxmulti;
111 unsigned long maxcqueue;
112 unsigned long doios_single;
113 unsigned long doios_multi;
114 unsigned long txlen;
115 unsigned long tx_time;
116 struct timespec send_stamp;
117};
118
119
120
121
122struct channel {
123
124
125
126
127 struct channel *next;
128 char id[CTC_ID_SIZE];
129 struct ccw_device *cdev;
130
131
132
133
134
135 enum channel_types type;
136
137
138
139
140 __u32 flags;
141
142
143
144
145 __u16 protocol;
146
147
148
149
150 struct ccw1 *ccw;
151 struct irb *irb;
152
153
154
155
156 int max_bufsize;
157
158
159
160
161 struct sk_buff *trans_skb;
162
163
164
165
166 struct sk_buff_head io_queue;
167
168
169
170
171 struct sk_buff_head collect_queue;
172
173
174
175
176 int collect_len;
177
178
179
180
181 spinlock_t collect_lock;
182
183
184
185
186
187 fsm_timer timer;
188
189
190
191
192 int retry;
193
194
195
196
197 fsm_instance *fsm;
198
199
200
201
202
203 struct net_device *netdev;
204
205 struct ctc_profile prof;
206
207 unsigned char *trans_skb_data;
208
209 __u16 logflags;
210};
211
212#define CHANNEL_FLAGS_READ 0
213#define CHANNEL_FLAGS_WRITE 1
214#define CHANNEL_FLAGS_INUSE 2
215#define CHANNEL_FLAGS_BUFSIZE_CHANGED 4
216#define CHANNEL_FLAGS_FAILED 8
217#define CHANNEL_FLAGS_WAITIRQ 16
218#define CHANNEL_FLAGS_RWMASK 1
219#define CHANNEL_DIRECTION(f) (f & CHANNEL_FLAGS_RWMASK)
220
221#define LOG_FLAG_ILLEGALPKT 1
222#define LOG_FLAG_ILLEGALSIZE 2
223#define LOG_FLAG_OVERRUN 4
224#define LOG_FLAG_NOMEM 8
225
226#define CTC_LOGLEVEL_INFO 1
227#define CTC_LOGLEVEL_NOTICE 2
228#define CTC_LOGLEVEL_WARN 4
229#define CTC_LOGLEVEL_EMERG 8
230#define CTC_LOGLEVEL_ERR 16
231#define CTC_LOGLEVEL_DEBUG 32
232#define CTC_LOGLEVEL_CRIT 64
233
234#define CTC_LOGLEVEL_DEFAULT \
235(CTC_LOGLEVEL_INFO | CTC_LOGLEVEL_NOTICE | CTC_LOGLEVEL_WARN | CTC_LOGLEVEL_CRIT)
236
237#define CTC_LOGLEVEL_MAX ((CTC_LOGLEVEL_CRIT<<1)-1)
238
239static int loglevel = CTC_LOGLEVEL_DEFAULT;
240
241#define ctc_pr_debug(fmt, arg...) \
242do { if (loglevel & CTC_LOGLEVEL_DEBUG) printk(KERN_DEBUG fmt,##arg); } while (0)
243
244#define ctc_pr_info(fmt, arg...) \
245do { if (loglevel & CTC_LOGLEVEL_INFO) printk(KERN_INFO fmt,##arg); } while (0)
246
247#define ctc_pr_notice(fmt, arg...) \
248do { if (loglevel & CTC_LOGLEVEL_NOTICE) printk(KERN_NOTICE fmt,##arg); } while (0)
249
250#define ctc_pr_warn(fmt, arg...) \
251do { if (loglevel & CTC_LOGLEVEL_WARN) printk(KERN_WARNING fmt,##arg); } while (0)
252
253#define ctc_pr_emerg(fmt, arg...) \
254do { if (loglevel & CTC_LOGLEVEL_EMERG) printk(KERN_EMERG fmt,##arg); } while (0)
255
256#define ctc_pr_err(fmt, arg...) \
257do { if (loglevel & CTC_LOGLEVEL_ERR) printk(KERN_ERR fmt,##arg); } while (0)
258
259#define ctc_pr_crit(fmt, arg...) \
260do { if (loglevel & CTC_LOGLEVEL_CRIT) printk(KERN_CRIT fmt,##arg); } while (0)
261
262
263
264
265static struct channel *channels = NULL;
266
267struct ctc_priv {
268 struct net_device_stats stats;
269 unsigned long tbusy;
270
271
272
273 fsm_instance *fsm;
274
275
276
277 __u16 protocol;
278
279
280
281 fsm_timer restart_timer;
282
283 struct channel *channel[2];
284};
285
286
287
288
289struct ll_header {
290 __u16 length;
291 __u16 type;
292 __u16 unused;
293};
294#define LL_HEADER_LENGTH (sizeof(struct ll_header))
295
296
297
298
299
300static __inline__ void
301ctc_clear_busy(struct net_device * dev)
302{
303 clear_bit(0, &(((struct ctc_priv *) dev->priv)->tbusy));
304 if (((struct ctc_priv *)dev->priv)->protocol != CTC_PROTO_LINUX_TTY)
305 netif_wake_queue(dev);
306}
307
308static __inline__ int
309ctc_test_and_set_busy(struct net_device * dev)
310{
311 if (((struct ctc_priv *)dev->priv)->protocol != CTC_PROTO_LINUX_TTY)
312 netif_stop_queue(dev);
313 return test_and_set_bit(0, &((struct ctc_priv *) dev->priv)->tbusy);
314}
315
316
317
318
319static void
320print_banner(void)
321{
322 static int printed = 0;
323 char vbuf[] = "$Revision: 1.68 $";
324 char *version = vbuf;
325
326 if (printed)
327 return;
328 if ((version = strchr(version, ':'))) {
329 char *p = strchr(version + 1, '$');
330 if (p)
331 *p = '\0';
332 } else
333 version = " ??? ";
334 printk(KERN_INFO "CTC driver Version%s"
335#ifdef DEBUG
336 " (DEBUG-VERSION, " __DATE__ __TIME__ ")"
337#endif
338 " initialized\n", version);
339 printed = 1;
340}
341
342
343
344
345static enum channel_types
346get_channel_type(struct ccw_device_id *id)
347{
348 enum channel_types type = (enum channel_types) id->driver_info;
349
350 if (type == channel_type_ficon)
351 type = channel_type_escon;
352
353 return type;
354}
355
356
357
358
359enum dev_states {
360 DEV_STATE_STOPPED,
361 DEV_STATE_STARTWAIT_RXTX,
362 DEV_STATE_STARTWAIT_RX,
363 DEV_STATE_STARTWAIT_TX,
364 DEV_STATE_STOPWAIT_RXTX,
365 DEV_STATE_STOPWAIT_RX,
366 DEV_STATE_STOPWAIT_TX,
367 DEV_STATE_RUNNING,
368
369
370
371 NR_DEV_STATES
372};
373
374static const char *dev_state_names[] = {
375 "Stopped",
376 "StartWait RXTX",
377 "StartWait RX",
378 "StartWait TX",
379 "StopWait RXTX",
380 "StopWait RX",
381 "StopWait TX",
382 "Running",
383};
384
385
386
387
388enum dev_events {
389 DEV_EVENT_START,
390 DEV_EVENT_STOP,
391 DEV_EVENT_RXUP,
392 DEV_EVENT_TXUP,
393 DEV_EVENT_RXDOWN,
394 DEV_EVENT_TXDOWN,
395 DEV_EVENT_RESTART,
396
397
398
399 NR_DEV_EVENTS
400};
401
402static const char *dev_event_names[] = {
403 "Start",
404 "Stop",
405 "RX up",
406 "TX up",
407 "RX down",
408 "TX down",
409 "Restart",
410};
411
412
413
414
415enum ch_events {
416
417
418
419
420 CH_EVENT_IO_SUCCESS,
421 CH_EVENT_IO_EBUSY,
422 CH_EVENT_IO_ENODEV,
423 CH_EVENT_IO_EIO,
424 CH_EVENT_IO_UNKNOWN,
425
426 CH_EVENT_ATTNBUSY,
427 CH_EVENT_ATTN,
428 CH_EVENT_BUSY,
429
430
431
432
433 CH_EVENT_UC_RCRESET,
434 CH_EVENT_UC_RSRESET,
435 CH_EVENT_UC_TXTIMEOUT,
436 CH_EVENT_UC_TXPARITY,
437 CH_EVENT_UC_HWFAIL,
438 CH_EVENT_UC_RXPARITY,
439 CH_EVENT_UC_ZERO,
440 CH_EVENT_UC_UNKNOWN,
441
442
443
444
445 CH_EVENT_SC_UNKNOWN,
446
447
448
449
450 CH_EVENT_MC_FAIL,
451 CH_EVENT_MC_GOOD,
452
453
454
455
456 CH_EVENT_IRQ,
457 CH_EVENT_FINSTAT,
458
459
460
461
462 CH_EVENT_TIMER,
463
464
465
466
467 CH_EVENT_START,
468 CH_EVENT_STOP,
469
470
471
472
473 NR_CH_EVENTS,
474};
475
476static const char *ch_event_names[] = {
477 "ccw_device success",
478 "ccw_device busy",
479 "ccw_device enodev",
480 "ccw_device ioerr",
481 "ccw_device unknown",
482
483 "Status ATTN & BUSY",
484 "Status ATTN",
485 "Status BUSY",
486
487 "Unit check remote reset",
488 "Unit check remote system reset",
489 "Unit check TX timeout",
490 "Unit check TX parity",
491 "Unit check Hardware failure",
492 "Unit check RX parity",
493 "Unit check ZERO",
494 "Unit check Unknown",
495
496 "SubChannel check Unknown",
497
498 "Machine check failure",
499 "Machine check operational",
500
501 "IRQ normal",
502 "IRQ final",
503
504 "Timer",
505
506 "Start",
507 "Stop",
508};
509
510
511
512
513enum ch_states {
514
515
516
517
518 CH_STATE_IDLE,
519
520
521
522
523 CH_STATE_STOPPED,
524 CH_STATE_STARTWAIT,
525 CH_STATE_STARTRETRY,
526 CH_STATE_SETUPWAIT,
527 CH_STATE_RXINIT,
528 CH_STATE_TXINIT,
529 CH_STATE_RX,
530 CH_STATE_TX,
531 CH_STATE_RXIDLE,
532 CH_STATE_TXIDLE,
533 CH_STATE_RXERR,
534 CH_STATE_TXERR,
535 CH_STATE_TERM,
536 CH_STATE_DTERM,
537 CH_STATE_NOTOP,
538
539
540
541
542 NR_CH_STATES,
543};
544
545static const char *ch_state_names[] = {
546 "Idle",
547 "Stopped",
548 "StartWait",
549 "StartRetry",
550 "SetupWait",
551 "RX init",
552 "TX init",
553 "RX",
554 "TX",
555 "RX idle",
556 "TX idle",
557 "RX error",
558 "TX error",
559 "Terminating",
560 "Restarting",
561 "Not operational",
562};
563
564#ifdef DEBUG
565
566
567
568
569
570
571static void
572ctc_dump_skb(struct sk_buff *skb, int offset)
573{
574 unsigned char *p = skb->data;
575 __u16 bl;
576 struct ll_header *header;
577 int i;
578
579 if (!(loglevel & CTC_LOGLEVEL_DEBUG))
580 return;
581 p += offset;
582 bl = *((__u16 *) p);
583 p += 2;
584 header = (struct ll_header *) p;
585 p -= 2;
586
587 printk(KERN_DEBUG "dump:\n");
588 printk(KERN_DEBUG "blocklen=%d %04x\n", bl, bl);
589
590 printk(KERN_DEBUG "h->length=%d %04x\n", header->length,
591 header->length);
592 printk(KERN_DEBUG "h->type=%04x\n", header->type);
593 printk(KERN_DEBUG "h->unused=%04x\n", header->unused);
594 if (bl > 16)
595 bl = 16;
596 printk(KERN_DEBUG "data: ");
597 for (i = 0; i < bl; i++)
598 printk("%02x%s", *p++, (i % 16) ? " " : "\n<7>");
599 printk("\n");
600}
601#else
602static inline void
603ctc_dump_skb(struct sk_buff *skb, int offset)
604{
605}
606#endif
607
608
609
610
611
612
613
614
615static __inline__ void
616ctc_unpack_skb(struct channel *ch, struct sk_buff *pskb)
617{
618 struct net_device *dev = ch->netdev;
619 struct ctc_priv *privptr = (struct ctc_priv *) dev->priv;
620 __u16 len = *((__u16 *) pskb->data);
621
622 DBF_TEXT(trace, 4, __FUNCTION__);
623 skb_put(pskb, 2 + LL_HEADER_LENGTH);
624 skb_pull(pskb, 2);
625 pskb->dev = dev;
626 pskb->ip_summed = CHECKSUM_UNNECESSARY;
627 while (len > 0) {
628 struct sk_buff *skb;
629 struct ll_header *header = (struct ll_header *) pskb->data;
630
631 skb_pull(pskb, LL_HEADER_LENGTH);
632 if ((ch->protocol == CTC_PROTO_S390) &&
633 (header->type != ETH_P_IP)) {
634
635#ifndef DEBUG
636 if (!(ch->logflags & LOG_FLAG_ILLEGALPKT)) {
637#endif
638
639
640
641
642
643
644 ctc_pr_warn(
645 "%s Illegal packet type 0x%04x received, dropping\n",
646 dev->name, header->type);
647 ch->logflags |= LOG_FLAG_ILLEGALPKT;
648#ifndef DEBUG
649 }
650#endif
651#ifdef DEBUG
652 ctc_dump_skb(pskb, -6);
653#endif
654 privptr->stats.rx_dropped++;
655 privptr->stats.rx_frame_errors++;
656 return;
657 }
658 pskb->protocol = ntohs(header->type);
659 if (header->length <= LL_HEADER_LENGTH) {
660#ifndef DEBUG
661 if (!(ch->logflags & LOG_FLAG_ILLEGALSIZE)) {
662#endif
663 ctc_pr_warn(
664 "%s Illegal packet size %d "
665 "received (MTU=%d blocklen=%d), "
666 "dropping\n", dev->name, header->length,
667 dev->mtu, len);
668 ch->logflags |= LOG_FLAG_ILLEGALSIZE;
669#ifndef DEBUG
670 }
671#endif
672#ifdef DEBUG
673 ctc_dump_skb(pskb, -6);
674#endif
675 privptr->stats.rx_dropped++;
676 privptr->stats.rx_length_errors++;
677 return;
678 }
679 header->length -= LL_HEADER_LENGTH;
680 len -= LL_HEADER_LENGTH;
681 if ((header->length > skb_tailroom(pskb)) ||
682 (header->length > len)) {
683#ifndef DEBUG
684 if (!(ch->logflags & LOG_FLAG_OVERRUN)) {
685#endif
686 ctc_pr_warn(
687 "%s Illegal packet size %d "
688 "(beyond the end of received data), "
689 "dropping\n", dev->name, header->length);
690 ch->logflags |= LOG_FLAG_OVERRUN;
691#ifndef DEBUG
692 }
693#endif
694#ifdef DEBUG
695 ctc_dump_skb(pskb, -6);
696#endif
697 privptr->stats.rx_dropped++;
698 privptr->stats.rx_length_errors++;
699 return;
700 }
701 skb_put(pskb, header->length);
702 pskb->mac.raw = pskb->data;
703 len -= header->length;
704 skb = dev_alloc_skb(pskb->len);
705 if (!skb) {
706#ifndef DEBUG
707 if (!(ch->logflags & LOG_FLAG_NOMEM)) {
708#endif
709 ctc_pr_warn(
710 "%s Out of memory in ctc_unpack_skb\n",
711 dev->name);
712 ch->logflags |= LOG_FLAG_NOMEM;
713#ifndef DEBUG
714 }
715#endif
716 privptr->stats.rx_dropped++;
717 return;
718 }
719 memcpy(skb_put(skb, pskb->len), pskb->data, pskb->len);
720 skb->mac.raw = skb->data;
721 skb->dev = pskb->dev;
722 skb->protocol = pskb->protocol;
723 pskb->ip_summed = CHECKSUM_UNNECESSARY;
724 if (ch->protocol == CTC_PROTO_LINUX_TTY)
725 ctc_tty_netif_rx(skb);
726 else
727 netif_rx_ni(skb);
728
729
730
731 ch->logflags = 0;
732 dev->last_rx = jiffies;
733 privptr->stats.rx_packets++;
734 privptr->stats.rx_bytes += skb->len;
735 if (len > 0) {
736 skb_pull(pskb, header->length);
737 if (skb_tailroom(pskb) < LL_HEADER_LENGTH) {
738#ifndef DEBUG
739 if (!(ch->logflags & LOG_FLAG_OVERRUN)) {
740#endif
741 ctc_pr_warn(
742 "%s Overrun in ctc_unpack_skb\n",
743 dev->name);
744 ch->logflags |= LOG_FLAG_OVERRUN;
745#ifndef DEBUG
746 }
747#endif
748 return;
749 }
750 skb_put(pskb, LL_HEADER_LENGTH);
751 }
752 }
753}
754
755
756
757
758
759
760
761static void inline
762ccw_check_return_code(struct channel *ch, int return_code, char *msg)
763{
764 DBF_TEXT(trace, 5, __FUNCTION__);
765 switch (return_code) {
766 case 0:
767 fsm_event(ch->fsm, CH_EVENT_IO_SUCCESS, ch);
768 break;
769 case -EBUSY:
770 ctc_pr_warn("%s (%s): Busy !\n", ch->id, msg);
771 fsm_event(ch->fsm, CH_EVENT_IO_EBUSY, ch);
772 break;
773 case -ENODEV:
774 ctc_pr_emerg("%s (%s): Invalid device called for IO\n",
775 ch->id, msg);
776 fsm_event(ch->fsm, CH_EVENT_IO_ENODEV, ch);
777 break;
778 case -EIO:
779 ctc_pr_emerg("%s (%s): Status pending... \n",
780 ch->id, msg);
781 fsm_event(ch->fsm, CH_EVENT_IO_EIO, ch);
782 break;
783 default:
784 ctc_pr_emerg("%s (%s): Unknown error in do_IO %04x\n",
785 ch->id, msg, return_code);
786 fsm_event(ch->fsm, CH_EVENT_IO_UNKNOWN, ch);
787 }
788}
789
790
791
792
793
794
795
796static void inline
797ccw_unit_check(struct channel *ch, unsigned char sense)
798{
799 DBF_TEXT(trace, 5, __FUNCTION__);
800 if (sense & SNS0_INTERVENTION_REQ) {
801 if (sense & 0x01) {
802 if (ch->protocol != CTC_PROTO_LINUX_TTY)
803 ctc_pr_debug("%s: Interface disc. or Sel. reset "
804 "(remote)\n", ch->id);
805 fsm_event(ch->fsm, CH_EVENT_UC_RCRESET, ch);
806 } else {
807 ctc_pr_debug("%s: System reset (remote)\n", ch->id);
808 fsm_event(ch->fsm, CH_EVENT_UC_RSRESET, ch);
809 }
810 } else if (sense & SNS0_EQUIPMENT_CHECK) {
811 if (sense & SNS0_BUS_OUT_CHECK) {
812 ctc_pr_warn("%s: Hardware malfunction (remote)\n",
813 ch->id);
814 fsm_event(ch->fsm, CH_EVENT_UC_HWFAIL, ch);
815 } else {
816 ctc_pr_warn("%s: Read-data parity error (remote)\n",
817 ch->id);
818 fsm_event(ch->fsm, CH_EVENT_UC_RXPARITY, ch);
819 }
820 } else if (sense & SNS0_BUS_OUT_CHECK) {
821 if (sense & 0x04) {
822 ctc_pr_warn("%s: Data-streaming timeout)\n", ch->id);
823 fsm_event(ch->fsm, CH_EVENT_UC_TXTIMEOUT, ch);
824 } else {
825 ctc_pr_warn("%s: Data-transfer parity error\n", ch->id);
826 fsm_event(ch->fsm, CH_EVENT_UC_TXPARITY, ch);
827 }
828 } else if (sense & SNS0_CMD_REJECT) {
829 ctc_pr_warn("%s: Command reject\n", ch->id);
830 } else if (sense == 0) {
831 ctc_pr_debug("%s: Unit check ZERO\n", ch->id);
832 fsm_event(ch->fsm, CH_EVENT_UC_ZERO, ch);
833 } else {
834 ctc_pr_warn("%s: Unit Check with sense code: %02x\n",
835 ch->id, sense);
836 fsm_event(ch->fsm, CH_EVENT_UC_UNKNOWN, ch);
837 }
838}
839
840static void
841ctc_purge_skb_queue(struct sk_buff_head *q)
842{
843 struct sk_buff *skb;
844
845 DBF_TEXT(trace, 5, __FUNCTION__);
846
847 while ((skb = skb_dequeue(q))) {
848 atomic_dec(&skb->users);
849 dev_kfree_skb_irq(skb);
850 }
851}
852
853static __inline__ int
854ctc_checkalloc_buffer(struct channel *ch, int warn)
855{
856 DBF_TEXT(trace, 5, __FUNCTION__);
857 if ((ch->trans_skb == NULL) ||
858 (ch->flags & CHANNEL_FLAGS_BUFSIZE_CHANGED)) {
859 if (ch->trans_skb != NULL)
860 dev_kfree_skb(ch->trans_skb);
861 clear_normalized_cda(&ch->ccw[1]);
862 ch->trans_skb = __dev_alloc_skb(ch->max_bufsize,
863 GFP_ATOMIC | GFP_DMA);
864 if (ch->trans_skb == NULL) {
865 if (warn)
866 ctc_pr_warn(
867 "%s: Couldn't alloc %s trans_skb\n",
868 ch->id,
869 (CHANNEL_DIRECTION(ch->flags) == READ) ?
870 "RX" : "TX");
871 return -ENOMEM;
872 }
873 ch->ccw[1].count = ch->max_bufsize;
874 if (set_normalized_cda(&ch->ccw[1], ch->trans_skb->data)) {
875 dev_kfree_skb(ch->trans_skb);
876 ch->trans_skb = NULL;
877 if (warn)
878 ctc_pr_warn(
879 "%s: set_normalized_cda for %s "
880 "trans_skb failed, dropping packets\n",
881 ch->id,
882 (CHANNEL_DIRECTION(ch->flags) == READ) ?
883 "RX" : "TX");
884 return -ENOMEM;
885 }
886 ch->ccw[1].count = 0;
887 ch->trans_skb_data = ch->trans_skb->data;
888 ch->flags &= ~CHANNEL_FLAGS_BUFSIZE_CHANGED;
889 }
890 return 0;
891}
892
893
894
895
896static void
897fsm_action_nop(fsm_instance * fi, int event, void *arg)
898{
899}
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914static void
915ch_action_txdone(fsm_instance * fi, int event, void *arg)
916{
917 struct channel *ch = (struct channel *) arg;
918 struct net_device *dev = ch->netdev;
919 struct ctc_priv *privptr = dev->priv;
920 struct sk_buff *skb;
921 int first = 1;
922 int i;
923 unsigned long duration;
924 struct timespec done_stamp = xtime;
925
926 DBF_TEXT(trace, 4, __FUNCTION__);
927
928 duration =
929 (done_stamp.tv_sec - ch->prof.send_stamp.tv_sec) * 1000000 +
930 (done_stamp.tv_nsec - ch->prof.send_stamp.tv_nsec) / 1000;
931 if (duration > ch->prof.tx_time)
932 ch->prof.tx_time = duration;
933
934 if (ch->irb->scsw.count != 0)
935 ctc_pr_debug("%s: TX not complete, remaining %d bytes\n",
936 dev->name, ch->irb->scsw.count);
937 fsm_deltimer(&ch->timer);
938 while ((skb = skb_dequeue(&ch->io_queue))) {
939 privptr->stats.tx_packets++;
940 privptr->stats.tx_bytes += skb->len - LL_HEADER_LENGTH;
941 if (first) {
942 privptr->stats.tx_bytes += 2;
943 first = 0;
944 }
945 atomic_dec(&skb->users);
946 dev_kfree_skb_irq(skb);
947 }
948 spin_lock(&ch->collect_lock);
949 clear_normalized_cda(&ch->ccw[4]);
950 if (ch->collect_len > 0) {
951 int rc;
952
953 if (ctc_checkalloc_buffer(ch, 1)) {
954 spin_unlock(&ch->collect_lock);
955 return;
956 }
957 ch->trans_skb->tail = ch->trans_skb->data = ch->trans_skb_data;
958 ch->trans_skb->len = 0;
959 if (ch->prof.maxmulti < (ch->collect_len + 2))
960 ch->prof.maxmulti = ch->collect_len + 2;
961 if (ch->prof.maxcqueue < skb_queue_len(&ch->collect_queue))
962 ch->prof.maxcqueue = skb_queue_len(&ch->collect_queue);
963 *((__u16 *) skb_put(ch->trans_skb, 2)) = ch->collect_len + 2;
964 i = 0;
965 while ((skb = skb_dequeue(&ch->collect_queue))) {
966 memcpy(skb_put(ch->trans_skb, skb->len), skb->data,
967 skb->len);
968 privptr->stats.tx_packets++;
969 privptr->stats.tx_bytes += skb->len - LL_HEADER_LENGTH;
970 atomic_dec(&skb->users);
971 dev_kfree_skb_irq(skb);
972 i++;
973 }
974 ch->collect_len = 0;
975 spin_unlock(&ch->collect_lock);
976 ch->ccw[1].count = ch->trans_skb->len;
977 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
978 ch->prof.send_stamp = xtime;
979 rc = ccw_device_start(ch->cdev, &ch->ccw[0],
980 (unsigned long) ch, 0xff, 0);
981 ch->prof.doios_multi++;
982 if (rc != 0) {
983 privptr->stats.tx_dropped += i;
984 privptr->stats.tx_errors += i;
985 fsm_deltimer(&ch->timer);
986 ccw_check_return_code(ch, rc, "chained TX");
987 }
988 } else {
989 spin_unlock(&ch->collect_lock);
990 fsm_newstate(fi, CH_STATE_TXIDLE);
991 }
992 ctc_clear_busy(dev);
993}
994
995
996
997
998
999
1000
1001
1002
1003
1004static void
1005ch_action_txidle(fsm_instance * fi, int event, void *arg)
1006{
1007 struct channel *ch = (struct channel *) arg;
1008
1009 DBF_TEXT(trace, 4, __FUNCTION__);
1010 fsm_deltimer(&ch->timer);
1011 fsm_newstate(fi, CH_STATE_TXIDLE);
1012 fsm_event(((struct ctc_priv *) ch->netdev->priv)->fsm, DEV_EVENT_TXUP,
1013 ch->netdev);
1014}
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024static void
1025ch_action_rx(fsm_instance * fi, int event, void *arg)
1026{
1027 struct channel *ch = (struct channel *) arg;
1028 struct net_device *dev = ch->netdev;
1029 struct ctc_priv *privptr = dev->priv;
1030 int len = ch->max_bufsize - ch->irb->scsw.count;
1031 struct sk_buff *skb = ch->trans_skb;
1032 __u16 block_len = *((__u16 *) skb->data);
1033 int check_len;
1034 int rc;
1035
1036 DBF_TEXT(trace, 4, __FUNCTION__);
1037 fsm_deltimer(&ch->timer);
1038 if (len < 8) {
1039 ctc_pr_debug("%s: got packet with length %d < 8\n",
1040 dev->name, len);
1041 privptr->stats.rx_dropped++;
1042 privptr->stats.rx_length_errors++;
1043 goto again;
1044 }
1045 if (len > ch->max_bufsize) {
1046 ctc_pr_debug("%s: got packet with length %d > %d\n",
1047 dev->name, len, ch->max_bufsize);
1048 privptr->stats.rx_dropped++;
1049 privptr->stats.rx_length_errors++;
1050 goto again;
1051 }
1052
1053
1054
1055
1056 switch (ch->protocol) {
1057 case CTC_PROTO_S390:
1058 case CTC_PROTO_OS390:
1059 check_len = block_len + 2;
1060 break;
1061 default:
1062 check_len = block_len;
1063 break;
1064 }
1065 if ((len < block_len) || (len > check_len)) {
1066 ctc_pr_debug("%s: got block length %d != rx length %d\n",
1067 dev->name, block_len, len);
1068#ifdef DEBUG
1069 ctc_dump_skb(skb, 0);
1070#endif
1071 *((__u16 *) skb->data) = len;
1072 privptr->stats.rx_dropped++;
1073 privptr->stats.rx_length_errors++;
1074 goto again;
1075 }
1076 block_len -= 2;
1077 if (block_len > 0) {
1078 *((__u16 *) skb->data) = block_len;
1079 ctc_unpack_skb(ch, skb);
1080 }
1081 again:
1082 skb->data = skb->tail = ch->trans_skb_data;
1083 skb->len = 0;
1084 if (ctc_checkalloc_buffer(ch, 1))
1085 return;
1086 ch->ccw[1].count = ch->max_bufsize;
1087 rc = ccw_device_start(ch->cdev, &ch->ccw[0], (unsigned long) ch, 0xff, 0);
1088 if (rc != 0)
1089 ccw_check_return_code(ch, rc, "normal RX");
1090}
1091
1092static void ch_action_rxidle(fsm_instance * fi, int event, void *arg);
1093
1094
1095
1096
1097
1098
1099
1100
1101static void
1102ch_action_firstio(fsm_instance * fi, int event, void *arg)
1103{
1104 struct channel *ch = (struct channel *) arg;
1105 int rc;
1106
1107 DBF_TEXT(trace, 4, __FUNCTION__);
1108
1109 if (fsm_getstate(fi) == CH_STATE_TXIDLE)
1110 ctc_pr_debug("%s: remote side issued READ?, init ...\n", ch->id);
1111 fsm_deltimer(&ch->timer);
1112 if (ctc_checkalloc_buffer(ch, 1))
1113 return;
1114 if ((fsm_getstate(fi) == CH_STATE_SETUPWAIT) &&
1115 (ch->protocol == CTC_PROTO_OS390)) {
1116
1117 if (CHANNEL_DIRECTION(ch->flags) == READ) {
1118 *((__u16 *) ch->trans_skb->data) = CTC_INITIAL_BLOCKLEN;
1119 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC,
1120 CH_EVENT_TIMER, ch);
1121 ch_action_rxidle(fi, event, arg);
1122 } else {
1123 struct net_device *dev = ch->netdev;
1124 fsm_newstate(fi, CH_STATE_TXIDLE);
1125 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1126 DEV_EVENT_TXUP, dev);
1127 }
1128 return;
1129 }
1130
1131
1132
1133
1134
1135
1136 if ((CHANNEL_DIRECTION(ch->flags) == WRITE) ||
1137 (ch->protocol != CTC_PROTO_S390))
1138 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
1139
1140 *((__u16 *) ch->trans_skb->data) = CTC_INITIAL_BLOCKLEN;
1141 ch->ccw[1].count = 2;
1142
1143 fsm_newstate(fi, (CHANNEL_DIRECTION(ch->flags) == READ)
1144 ? CH_STATE_RXINIT : CH_STATE_TXINIT);
1145 rc = ccw_device_start(ch->cdev, &ch->ccw[0], (unsigned long) ch, 0xff, 0);
1146 if (rc != 0) {
1147 fsm_deltimer(&ch->timer);
1148 fsm_newstate(fi, CH_STATE_SETUPWAIT);
1149 ccw_check_return_code(ch, rc, "init IO");
1150 }
1151
1152
1153
1154
1155
1156
1157
1158 if ((CHANNEL_DIRECTION(ch->flags) == READ) &&
1159 (ch->protocol == CTC_PROTO_S390)) {
1160 struct net_device *dev = ch->netdev;
1161 fsm_event(((struct ctc_priv *) dev->priv)->fsm, DEV_EVENT_RXUP,
1162 dev);
1163 }
1164}
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175static void
1176ch_action_rxidle(fsm_instance * fi, int event, void *arg)
1177{
1178 struct channel *ch = (struct channel *) arg;
1179 struct net_device *dev = ch->netdev;
1180 __u16 buflen;
1181 int rc;
1182
1183 DBF_TEXT(trace, 4, __FUNCTION__);
1184 fsm_deltimer(&ch->timer);
1185 buflen = *((__u16 *) ch->trans_skb->data);
1186#ifdef DEBUG
1187 ctc_pr_debug("%s: Initial RX count %d\n", dev->name, buflen);
1188#endif
1189 if (buflen >= CTC_INITIAL_BLOCKLEN) {
1190 if (ctc_checkalloc_buffer(ch, 1))
1191 return;
1192 ch->ccw[1].count = ch->max_bufsize;
1193 fsm_newstate(fi, CH_STATE_RXIDLE);
1194 rc = ccw_device_start(ch->cdev, &ch->ccw[0],
1195 (unsigned long) ch, 0xff, 0);
1196 if (rc != 0) {
1197 fsm_newstate(fi, CH_STATE_RXINIT);
1198 ccw_check_return_code(ch, rc, "initial RX");
1199 } else
1200 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1201 DEV_EVENT_RXUP, dev);
1202 } else {
1203 ctc_pr_debug("%s: Initial RX count %d not %d\n",
1204 dev->name, buflen, CTC_INITIAL_BLOCKLEN);
1205 ch_action_firstio(fi, event, arg);
1206 }
1207}
1208
1209
1210
1211
1212
1213
1214
1215
1216static void
1217ch_action_setmode(fsm_instance * fi, int event, void *arg)
1218{
1219 struct channel *ch = (struct channel *) arg;
1220 int rc;
1221 unsigned long saveflags;
1222
1223 DBF_TEXT(trace, 4, __FUNCTION__);
1224 fsm_deltimer(&ch->timer);
1225 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
1226 fsm_newstate(fi, CH_STATE_SETUPWAIT);
1227 saveflags = 0;
1228
1229 if (event == CH_EVENT_TIMER)
1230 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
1231 rc = ccw_device_start(ch->cdev, &ch->ccw[6], (unsigned long) ch, 0xff, 0);
1232 if (event == CH_EVENT_TIMER)
1233 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
1234 if (rc != 0) {
1235 fsm_deltimer(&ch->timer);
1236 fsm_newstate(fi, CH_STATE_STARTWAIT);
1237 ccw_check_return_code(ch, rc, "set Mode");
1238 } else
1239 ch->retry = 0;
1240}
1241
1242
1243
1244
1245
1246
1247
1248
1249static void
1250ch_action_start(fsm_instance * fi, int event, void *arg)
1251{
1252 struct channel *ch = (struct channel *) arg;
1253 unsigned long saveflags;
1254 int rc;
1255 struct net_device *dev;
1256
1257 DBF_TEXT(trace, 4, __FUNCTION__);
1258 if (ch == NULL) {
1259 ctc_pr_warn("ch_action_start ch=NULL\n");
1260 return;
1261 }
1262 if (ch->netdev == NULL) {
1263 ctc_pr_warn("ch_action_start dev=NULL, id=%s\n", ch->id);
1264 return;
1265 }
1266 dev = ch->netdev;
1267
1268#ifdef DEBUG
1269 ctc_pr_debug("%s: %s channel start\n", dev->name,
1270 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX");
1271#endif
1272
1273 if (ch->trans_skb != NULL) {
1274 clear_normalized_cda(&ch->ccw[1]);
1275 dev_kfree_skb(ch->trans_skb);
1276 ch->trans_skb = NULL;
1277 }
1278 if (CHANNEL_DIRECTION(ch->flags) == READ) {
1279 ch->ccw[1].cmd_code = CCW_CMD_READ;
1280 ch->ccw[1].flags = CCW_FLAG_SLI;
1281 ch->ccw[1].count = 0;
1282 } else {
1283 ch->ccw[1].cmd_code = CCW_CMD_WRITE;
1284 ch->ccw[1].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
1285 ch->ccw[1].count = 0;
1286 }
1287 if (ctc_checkalloc_buffer(ch, 0)) {
1288 ctc_pr_notice(
1289 "%s: Could not allocate %s trans_skb, delaying "
1290 "allocation until first transfer\n",
1291 dev->name,
1292 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX");
1293 }
1294
1295 ch->ccw[0].cmd_code = CCW_CMD_PREPARE;
1296 ch->ccw[0].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
1297 ch->ccw[0].count = 0;
1298 ch->ccw[0].cda = 0;
1299 ch->ccw[2].cmd_code = CCW_CMD_NOOP;
1300 ch->ccw[2].flags = CCW_FLAG_SLI;
1301 ch->ccw[2].count = 0;
1302 ch->ccw[2].cda = 0;
1303 memcpy(&ch->ccw[3], &ch->ccw[0], sizeof (struct ccw1) * 3);
1304 ch->ccw[4].cda = 0;
1305 ch->ccw[4].flags &= ~CCW_FLAG_IDA;
1306
1307 fsm_newstate(fi, CH_STATE_STARTWAIT);
1308 fsm_addtimer(&ch->timer, 1000, CH_EVENT_TIMER, ch);
1309 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
1310 rc = ccw_device_halt(ch->cdev, (unsigned long) ch);
1311 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
1312 if (rc != 0) {
1313 if (rc != -EBUSY)
1314 fsm_deltimer(&ch->timer);
1315 ccw_check_return_code(ch, rc, "initial HaltIO");
1316 }
1317#ifdef DEBUG
1318 ctc_pr_debug("ctc: %s(): leaving\n", __func__);
1319#endif
1320}
1321
1322
1323
1324
1325
1326
1327
1328
1329static void
1330ch_action_haltio(fsm_instance * fi, int event, void *arg)
1331{
1332 struct channel *ch = (struct channel *) arg;
1333 unsigned long saveflags;
1334 int rc;
1335 int oldstate;
1336
1337 DBF_TEXT(trace, 3, __FUNCTION__);
1338 fsm_deltimer(&ch->timer);
1339 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
1340 saveflags = 0;
1341
1342 if (event == CH_EVENT_STOP)
1343 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
1344 oldstate = fsm_getstate(fi);
1345 fsm_newstate(fi, CH_STATE_TERM);
1346 rc = ccw_device_halt(ch->cdev, (unsigned long) ch);
1347 if (event == CH_EVENT_STOP)
1348 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
1349 if (rc != 0) {
1350 if (rc != -EBUSY) {
1351 fsm_deltimer(&ch->timer);
1352 fsm_newstate(fi, oldstate);
1353 }
1354 ccw_check_return_code(ch, rc, "HaltIO in ch_action_haltio");
1355 }
1356}
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366static void
1367ch_action_stopped(fsm_instance * fi, int event, void *arg)
1368{
1369 struct channel *ch = (struct channel *) arg;
1370 struct net_device *dev = ch->netdev;
1371
1372 DBF_TEXT(trace, 3, __FUNCTION__);
1373 fsm_deltimer(&ch->timer);
1374 fsm_newstate(fi, CH_STATE_STOPPED);
1375 if (ch->trans_skb != NULL) {
1376 clear_normalized_cda(&ch->ccw[1]);
1377 dev_kfree_skb(ch->trans_skb);
1378 ch->trans_skb = NULL;
1379 }
1380 if (CHANNEL_DIRECTION(ch->flags) == READ) {
1381 skb_queue_purge(&ch->io_queue);
1382 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1383 DEV_EVENT_RXDOWN, dev);
1384 } else {
1385 ctc_purge_skb_queue(&ch->io_queue);
1386 spin_lock(&ch->collect_lock);
1387 ctc_purge_skb_queue(&ch->collect_queue);
1388 ch->collect_len = 0;
1389 spin_unlock(&ch->collect_lock);
1390 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1391 DEV_EVENT_TXDOWN, dev);
1392 }
1393}
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403static void
1404ch_action_stop(fsm_instance * fi, int event, void *arg)
1405{
1406 fsm_newstate(fi, CH_STATE_STOPPED);
1407}
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418static void
1419ch_action_fail(fsm_instance * fi, int event, void *arg)
1420{
1421 struct channel *ch = (struct channel *) arg;
1422 struct net_device *dev = ch->netdev;
1423
1424 DBF_TEXT(trace, 3, __FUNCTION__);
1425 fsm_deltimer(&ch->timer);
1426 fsm_newstate(fi, CH_STATE_NOTOP);
1427 if (CHANNEL_DIRECTION(ch->flags) == READ) {
1428 skb_queue_purge(&ch->io_queue);
1429 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1430 DEV_EVENT_RXDOWN, dev);
1431 } else {
1432 ctc_purge_skb_queue(&ch->io_queue);
1433 spin_lock(&ch->collect_lock);
1434 ctc_purge_skb_queue(&ch->collect_queue);
1435 ch->collect_len = 0;
1436 spin_unlock(&ch->collect_lock);
1437 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1438 DEV_EVENT_TXDOWN, dev);
1439 }
1440}
1441
1442
1443
1444
1445
1446
1447
1448
1449static void
1450ch_action_setuperr(fsm_instance * fi, int event, void *arg)
1451{
1452 struct channel *ch = (struct channel *) arg;
1453 struct net_device *dev = ch->netdev;
1454
1455 DBF_TEXT(setup, 3, __FUNCTION__);
1456
1457
1458
1459
1460
1461 if ((fsm_getstate(fi) == CH_STATE_SETUPWAIT) &&
1462 ((event == CH_EVENT_UC_RCRESET) ||
1463 (event == CH_EVENT_UC_RSRESET))) {
1464 fsm_newstate(fi, CH_STATE_STARTRETRY);
1465 fsm_deltimer(&ch->timer);
1466 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
1467 if (CHANNEL_DIRECTION(ch->flags) == READ) {
1468 int rc = ccw_device_halt(ch->cdev, (unsigned long) ch);
1469 if (rc != 0)
1470 ccw_check_return_code(
1471 ch, rc, "HaltIO in ch_action_setuperr");
1472 }
1473 return;
1474 }
1475
1476 ctc_pr_debug("%s: Error %s during %s channel setup state=%s\n",
1477 dev->name, ch_event_names[event],
1478 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX",
1479 fsm_getstate_str(fi));
1480 if (CHANNEL_DIRECTION(ch->flags) == READ) {
1481 fsm_newstate(fi, CH_STATE_RXERR);
1482 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1483 DEV_EVENT_RXDOWN, dev);
1484 } else {
1485 fsm_newstate(fi, CH_STATE_TXERR);
1486 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1487 DEV_EVENT_TXDOWN, dev);
1488 }
1489}
1490
1491
1492
1493
1494
1495
1496
1497
1498static void
1499ch_action_restart(fsm_instance * fi, int event, void *arg)
1500{
1501 unsigned long saveflags;
1502 int oldstate;
1503 int rc;
1504
1505 struct channel *ch = (struct channel *) arg;
1506 struct net_device *dev = ch->netdev;
1507
1508 DBF_TEXT(trace, 3, __FUNCTION__);
1509 fsm_deltimer(&ch->timer);
1510 ctc_pr_debug("%s: %s channel restart\n", dev->name,
1511 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX");
1512 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
1513 oldstate = fsm_getstate(fi);
1514 fsm_newstate(fi, CH_STATE_STARTWAIT);
1515 saveflags = 0;
1516
1517 if (event == CH_EVENT_TIMER)
1518 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
1519 rc = ccw_device_halt(ch->cdev, (unsigned long) ch);
1520 if (event == CH_EVENT_TIMER)
1521 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
1522 if (rc != 0) {
1523 if (rc != -EBUSY) {
1524 fsm_deltimer(&ch->timer);
1525 fsm_newstate(fi, oldstate);
1526 }
1527 ccw_check_return_code(ch, rc, "HaltIO in ch_action_restart");
1528 }
1529}
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539static void
1540ch_action_rxiniterr(fsm_instance * fi, int event, void *arg)
1541{
1542 struct channel *ch = (struct channel *) arg;
1543 struct net_device *dev = ch->netdev;
1544
1545 DBF_TEXT(setup, 3, __FUNCTION__);
1546 if (event == CH_EVENT_TIMER) {
1547 fsm_deltimer(&ch->timer);
1548 ctc_pr_debug("%s: Timeout during RX init handshake\n", dev->name);
1549 if (ch->retry++ < 3)
1550 ch_action_restart(fi, event, arg);
1551 else {
1552 fsm_newstate(fi, CH_STATE_RXERR);
1553 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1554 DEV_EVENT_RXDOWN, dev);
1555 }
1556 } else
1557 ctc_pr_warn("%s: Error during RX init handshake\n", dev->name);
1558}
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568static void
1569ch_action_rxinitfail(fsm_instance * fi, int event, void *arg)
1570{
1571 struct channel *ch = (struct channel *) arg;
1572 struct net_device *dev = ch->netdev;
1573
1574 DBF_TEXT(setup, 3, __FUNCTION__);
1575 fsm_newstate(fi, CH_STATE_RXERR);
1576 ctc_pr_warn("%s: RX initialization failed\n", dev->name);
1577 ctc_pr_warn("%s: RX <-> RX connection detected\n", dev->name);
1578 fsm_event(((struct ctc_priv *) dev->priv)->fsm, DEV_EVENT_RXDOWN, dev);
1579}
1580
1581
1582
1583
1584
1585
1586
1587
1588static void
1589ch_action_rxdisc(fsm_instance * fi, int event, void *arg)
1590{
1591 struct channel *ch = (struct channel *) arg;
1592 struct channel *ch2;
1593 struct net_device *dev = ch->netdev;
1594
1595 DBF_TEXT(trace, 3, __FUNCTION__);
1596 fsm_deltimer(&ch->timer);
1597 ctc_pr_debug("%s: Got remote disconnect, re-initializing ...\n",
1598 dev->name);
1599
1600
1601
1602
1603 fsm_event(((struct ctc_priv *) dev->priv)->fsm, DEV_EVENT_RXDOWN, dev);
1604 fsm_event(((struct ctc_priv *) dev->priv)->fsm, DEV_EVENT_TXDOWN, dev);
1605
1606 fsm_newstate(fi, CH_STATE_DTERM);
1607 ch2 = ((struct ctc_priv *) dev->priv)->channel[WRITE];
1608 fsm_newstate(ch2->fsm, CH_STATE_DTERM);
1609
1610 ccw_device_halt(ch->cdev, (unsigned long) ch);
1611 ccw_device_halt(ch2->cdev, (unsigned long) ch2);
1612}
1613
1614
1615
1616
1617
1618
1619
1620
1621static void
1622ch_action_txiniterr(fsm_instance * fi, int event, void *arg)
1623{
1624 struct channel *ch = (struct channel *) arg;
1625 struct net_device *dev = ch->netdev;
1626
1627 DBF_TEXT(setup, 2, __FUNCTION__);
1628 if (event == CH_EVENT_TIMER) {
1629 fsm_deltimer(&ch->timer);
1630 ctc_pr_debug("%s: Timeout during TX init handshake\n", dev->name);
1631 if (ch->retry++ < 3)
1632 ch_action_restart(fi, event, arg);
1633 else {
1634 fsm_newstate(fi, CH_STATE_TXERR);
1635 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1636 DEV_EVENT_TXDOWN, dev);
1637 }
1638 } else
1639 ctc_pr_warn("%s: Error during TX init handshake\n", dev->name);
1640}
1641
1642
1643
1644
1645
1646
1647
1648
1649static void
1650ch_action_txretry(fsm_instance * fi, int event, void *arg)
1651{
1652 struct channel *ch = (struct channel *) arg;
1653 struct net_device *dev = ch->netdev;
1654 unsigned long saveflags;
1655
1656 DBF_TEXT(trace, 4, __FUNCTION__);
1657 fsm_deltimer(&ch->timer);
1658 if (ch->retry++ > 3) {
1659 ctc_pr_debug("%s: TX retry failed, restarting channel\n",
1660 dev->name);
1661 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1662 DEV_EVENT_TXDOWN, dev);
1663 ch_action_restart(fi, event, arg);
1664 } else {
1665 struct sk_buff *skb;
1666
1667 ctc_pr_debug("%s: TX retry %d\n", dev->name, ch->retry);
1668 if ((skb = skb_peek(&ch->io_queue))) {
1669 int rc = 0;
1670
1671 clear_normalized_cda(&ch->ccw[4]);
1672 ch->ccw[4].count = skb->len;
1673 if (set_normalized_cda(&ch->ccw[4], skb->data)) {
1674 ctc_pr_debug(
1675 "%s: IDAL alloc failed, chan restart\n",
1676 dev->name);
1677 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1678 DEV_EVENT_TXDOWN, dev);
1679 ch_action_restart(fi, event, arg);
1680 return;
1681 }
1682 fsm_addtimer(&ch->timer, 1000, CH_EVENT_TIMER, ch);
1683 saveflags = 0;
1684
1685 if (event == CH_EVENT_TIMER)
1686 spin_lock_irqsave(get_ccwdev_lock(ch->cdev),
1687 saveflags);
1688 rc = ccw_device_start(ch->cdev, &ch->ccw[3],
1689 (unsigned long) ch, 0xff, 0);
1690 if (event == CH_EVENT_TIMER)
1691 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev),
1692 saveflags);
1693 if (rc != 0) {
1694 fsm_deltimer(&ch->timer);
1695 ccw_check_return_code(ch, rc, "TX in ch_action_txretry");
1696 ctc_purge_skb_queue(&ch->io_queue);
1697 }
1698 }
1699 }
1700
1701}
1702
1703
1704
1705
1706
1707
1708
1709
1710static void
1711ch_action_iofatal(fsm_instance * fi, int event, void *arg)
1712{
1713 struct channel *ch = (struct channel *) arg;
1714 struct net_device *dev = ch->netdev;
1715
1716 DBF_TEXT(trace, 3, __FUNCTION__);
1717 fsm_deltimer(&ch->timer);
1718 if (CHANNEL_DIRECTION(ch->flags) == READ) {
1719 ctc_pr_debug("%s: RX I/O error\n", dev->name);
1720 fsm_newstate(fi, CH_STATE_RXERR);
1721 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1722 DEV_EVENT_RXDOWN, dev);
1723 } else {
1724 ctc_pr_debug("%s: TX I/O error\n", dev->name);
1725 fsm_newstate(fi, CH_STATE_TXERR);
1726 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1727 DEV_EVENT_TXDOWN, dev);
1728 }
1729}
1730
1731static void
1732ch_action_reinit(fsm_instance *fi, int event, void *arg)
1733{
1734 struct channel *ch = (struct channel *)arg;
1735 struct net_device *dev = ch->netdev;
1736 struct ctc_priv *privptr = dev->priv;
1737
1738 DBF_TEXT(trace, 4, __FUNCTION__);
1739 ch_action_iofatal(fi, event, arg);
1740 fsm_addtimer(&privptr->restart_timer, 1000, DEV_EVENT_RESTART, dev);
1741}
1742
1743
1744
1745
1746
1747static const fsm_node ch_fsm[] = {
1748 {CH_STATE_STOPPED, CH_EVENT_STOP, fsm_action_nop },
1749 {CH_STATE_STOPPED, CH_EVENT_START, ch_action_start },
1750 {CH_STATE_STOPPED, CH_EVENT_FINSTAT, fsm_action_nop },
1751 {CH_STATE_STOPPED, CH_EVENT_MC_FAIL, fsm_action_nop },
1752
1753 {CH_STATE_NOTOP, CH_EVENT_STOP, ch_action_stop },
1754 {CH_STATE_NOTOP, CH_EVENT_START, fsm_action_nop },
1755 {CH_STATE_NOTOP, CH_EVENT_FINSTAT, fsm_action_nop },
1756 {CH_STATE_NOTOP, CH_EVENT_MC_FAIL, fsm_action_nop },
1757 {CH_STATE_NOTOP, CH_EVENT_MC_GOOD, ch_action_start },
1758
1759 {CH_STATE_STARTWAIT, CH_EVENT_STOP, ch_action_haltio },
1760 {CH_STATE_STARTWAIT, CH_EVENT_START, fsm_action_nop },
1761 {CH_STATE_STARTWAIT, CH_EVENT_FINSTAT, ch_action_setmode },
1762 {CH_STATE_STARTWAIT, CH_EVENT_TIMER, ch_action_setuperr },
1763 {CH_STATE_STARTWAIT, CH_EVENT_IO_ENODEV, ch_action_iofatal },
1764 {CH_STATE_STARTWAIT, CH_EVENT_IO_EIO, ch_action_reinit },
1765 {CH_STATE_STARTWAIT, CH_EVENT_MC_FAIL, ch_action_fail },
1766
1767 {CH_STATE_STARTRETRY, CH_EVENT_STOP, ch_action_haltio },
1768 {CH_STATE_STARTRETRY, CH_EVENT_TIMER, ch_action_setmode },
1769 {CH_STATE_STARTRETRY, CH_EVENT_FINSTAT, fsm_action_nop },
1770 {CH_STATE_STARTRETRY, CH_EVENT_MC_FAIL, ch_action_fail },
1771
1772 {CH_STATE_SETUPWAIT, CH_EVENT_STOP, ch_action_haltio },
1773 {CH_STATE_SETUPWAIT, CH_EVENT_START, fsm_action_nop },
1774 {CH_STATE_SETUPWAIT, CH_EVENT_FINSTAT, ch_action_firstio },
1775 {CH_STATE_SETUPWAIT, CH_EVENT_UC_RCRESET, ch_action_setuperr },
1776 {CH_STATE_SETUPWAIT, CH_EVENT_UC_RSRESET, ch_action_setuperr },
1777 {CH_STATE_SETUPWAIT, CH_EVENT_TIMER, ch_action_setmode },
1778 {CH_STATE_SETUPWAIT, CH_EVENT_IO_ENODEV, ch_action_iofatal },
1779 {CH_STATE_SETUPWAIT, CH_EVENT_IO_EIO, ch_action_reinit },
1780 {CH_STATE_SETUPWAIT, CH_EVENT_MC_FAIL, ch_action_fail },
1781
1782 {CH_STATE_RXINIT, CH_EVENT_STOP, ch_action_haltio },
1783 {CH_STATE_RXINIT, CH_EVENT_START, fsm_action_nop },
1784 {CH_STATE_RXINIT, CH_EVENT_FINSTAT, ch_action_rxidle },
1785 {CH_STATE_RXINIT, CH_EVENT_UC_RCRESET, ch_action_rxiniterr },
1786 {CH_STATE_RXINIT, CH_EVENT_UC_RSRESET, ch_action_rxiniterr },
1787 {CH_STATE_RXINIT, CH_EVENT_TIMER, ch_action_rxiniterr },
1788 {CH_STATE_RXINIT, CH_EVENT_ATTNBUSY, ch_action_rxinitfail },
1789 {CH_STATE_RXINIT, CH_EVENT_IO_ENODEV, ch_action_iofatal },
1790 {CH_STATE_RXINIT, CH_EVENT_IO_EIO, ch_action_reinit },
1791 {CH_STATE_RXINIT, CH_EVENT_UC_ZERO, ch_action_firstio },
1792 {CH_STATE_RXINIT, CH_EVENT_MC_FAIL, ch_action_fail },
1793
1794 {CH_STATE_RXIDLE, CH_EVENT_STOP, ch_action_haltio },
1795 {CH_STATE_RXIDLE, CH_EVENT_START, fsm_action_nop },
1796 {CH_STATE_RXIDLE, CH_EVENT_FINSTAT, ch_action_rx },
1797 {CH_STATE_RXIDLE, CH_EVENT_UC_RCRESET, ch_action_rxdisc },
1798
1799 {CH_STATE_RXIDLE, CH_EVENT_IO_ENODEV, ch_action_iofatal },
1800 {CH_STATE_RXIDLE, CH_EVENT_IO_EIO, ch_action_reinit },
1801 {CH_STATE_RXIDLE, CH_EVENT_MC_FAIL, ch_action_fail },
1802 {CH_STATE_RXIDLE, CH_EVENT_UC_ZERO, ch_action_rx },
1803
1804 {CH_STATE_TXINIT, CH_EVENT_STOP, ch_action_haltio },
1805 {CH_STATE_TXINIT, CH_EVENT_START, fsm_action_nop },
1806 {CH_STATE_TXINIT, CH_EVENT_FINSTAT, ch_action_txidle },
1807 {CH_STATE_TXINIT, CH_EVENT_UC_RCRESET, ch_action_txiniterr },
1808 {CH_STATE_TXINIT, CH_EVENT_UC_RSRESET, ch_action_txiniterr },
1809 {CH_STATE_TXINIT, CH_EVENT_TIMER, ch_action_txiniterr },
1810 {CH_STATE_TXINIT, CH_EVENT_IO_ENODEV, ch_action_iofatal },
1811 {CH_STATE_TXINIT, CH_EVENT_IO_EIO, ch_action_reinit },
1812 {CH_STATE_TXINIT, CH_EVENT_MC_FAIL, ch_action_fail },
1813
1814 {CH_STATE_TXIDLE, CH_EVENT_STOP, ch_action_haltio },
1815 {CH_STATE_TXIDLE, CH_EVENT_START, fsm_action_nop },
1816 {CH_STATE_TXIDLE, CH_EVENT_FINSTAT, ch_action_firstio },
1817 {CH_STATE_TXIDLE, CH_EVENT_UC_RCRESET, fsm_action_nop },
1818 {CH_STATE_TXIDLE, CH_EVENT_UC_RSRESET, fsm_action_nop },
1819 {CH_STATE_TXIDLE, CH_EVENT_IO_ENODEV, ch_action_iofatal },
1820 {CH_STATE_TXIDLE, CH_EVENT_IO_EIO, ch_action_reinit },
1821 {CH_STATE_TXIDLE, CH_EVENT_MC_FAIL, ch_action_fail },
1822
1823 {CH_STATE_TERM, CH_EVENT_STOP, fsm_action_nop },
1824 {CH_STATE_TERM, CH_EVENT_START, ch_action_restart },
1825 {CH_STATE_TERM, CH_EVENT_FINSTAT, ch_action_stopped },
1826 {CH_STATE_TERM, CH_EVENT_UC_RCRESET, fsm_action_nop },
1827 {CH_STATE_TERM, CH_EVENT_UC_RSRESET, fsm_action_nop },
1828 {CH_STATE_TERM, CH_EVENT_MC_FAIL, ch_action_fail },
1829
1830 {CH_STATE_DTERM, CH_EVENT_STOP, ch_action_haltio },
1831 {CH_STATE_DTERM, CH_EVENT_START, ch_action_restart },
1832 {CH_STATE_DTERM, CH_EVENT_FINSTAT, ch_action_setmode },
1833 {CH_STATE_DTERM, CH_EVENT_UC_RCRESET, fsm_action_nop },
1834 {CH_STATE_DTERM, CH_EVENT_UC_RSRESET, fsm_action_nop },
1835 {CH_STATE_DTERM, CH_EVENT_MC_FAIL, ch_action_fail },
1836
1837 {CH_STATE_TX, CH_EVENT_STOP, ch_action_haltio },
1838 {CH_STATE_TX, CH_EVENT_START, fsm_action_nop },
1839 {CH_STATE_TX, CH_EVENT_FINSTAT, ch_action_txdone },
1840 {CH_STATE_TX, CH_EVENT_UC_RCRESET, ch_action_txretry },
1841 {CH_STATE_TX, CH_EVENT_UC_RSRESET, ch_action_txretry },
1842 {CH_STATE_TX, CH_EVENT_TIMER, ch_action_txretry },
1843 {CH_STATE_TX, CH_EVENT_IO_ENODEV, ch_action_iofatal },
1844 {CH_STATE_TX, CH_EVENT_IO_EIO, ch_action_reinit },
1845 {CH_STATE_TX, CH_EVENT_MC_FAIL, ch_action_fail },
1846
1847 {CH_STATE_RXERR, CH_EVENT_STOP, ch_action_haltio },
1848 {CH_STATE_TXERR, CH_EVENT_STOP, ch_action_haltio },
1849 {CH_STATE_TXERR, CH_EVENT_MC_FAIL, ch_action_fail },
1850 {CH_STATE_RXERR, CH_EVENT_MC_FAIL, ch_action_fail },
1851};
1852
1853static const int CH_FSM_LEN = sizeof (ch_fsm) / sizeof (fsm_node);
1854
1855
1856
1857
1858
1859static inline int
1860less_than(char *id1, char *id2)
1861{
1862 int dev1, dev2, i;
1863
1864 for (i = 0; i < 5; i++) {
1865 id1++;
1866 id2++;
1867 }
1868 dev1 = simple_strtoul(id1, &id1, 16);
1869 dev2 = simple_strtoul(id2, &id2, 16);
1870
1871 return (dev1 < dev2);
1872}
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883static int
1884add_channel(struct ccw_device *cdev, enum channel_types type)
1885{
1886 struct channel **c = &channels;
1887 struct channel *ch;
1888
1889 DBF_TEXT(trace, 2, __FUNCTION__);
1890 if ((ch =
1891 (struct channel *) kmalloc(sizeof (struct channel),
1892 GFP_KERNEL)) == NULL) {
1893 ctc_pr_warn("ctc: Out of memory in add_channel\n");
1894 return -1;
1895 }
1896 memset(ch, 0, sizeof (struct channel));
1897 if ((ch->ccw = (struct ccw1 *) kmalloc(sizeof (struct ccw1) * 8,
1898 GFP_KERNEL | GFP_DMA)) == NULL) {
1899 kfree(ch);
1900 ctc_pr_warn("ctc: Out of memory in add_channel\n");
1901 return -1;
1902 }
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923 ch->ccw[6].cmd_code = CCW_CMD_SET_EXTENDED;
1924 ch->ccw[6].flags = CCW_FLAG_SLI;
1925 ch->ccw[6].count = 0;
1926 ch->ccw[6].cda = 0;
1927
1928 ch->ccw[7].cmd_code = CCW_CMD_NOOP;
1929 ch->ccw[7].flags = CCW_FLAG_SLI;
1930 ch->ccw[7].count = 0;
1931 ch->ccw[7].cda = 0;
1932
1933 ch->cdev = cdev;
1934 snprintf(ch->id, CTC_ID_SIZE, "ch-%s", cdev->dev.bus_id);
1935 ch->type = type;
1936 loglevel = CTC_LOGLEVEL_DEFAULT;
1937 ch->fsm = init_fsm(ch->id, ch_state_names,
1938 ch_event_names, NR_CH_STATES, NR_CH_EVENTS,
1939 ch_fsm, CH_FSM_LEN, GFP_KERNEL);
1940 if (ch->fsm == NULL) {
1941 ctc_pr_warn("ctc: Could not create FSM in add_channel\n");
1942 kfree(ch->ccw);
1943 kfree(ch);
1944 return -1;
1945 }
1946 fsm_newstate(ch->fsm, CH_STATE_IDLE);
1947 if ((ch->irb = (struct irb *) kmalloc(sizeof (struct irb),
1948 GFP_KERNEL)) == NULL) {
1949 ctc_pr_warn("ctc: Out of memory in add_channel\n");
1950 kfree_fsm(ch->fsm);
1951 kfree(ch->ccw);
1952 kfree(ch);
1953 return -1;
1954 }
1955 memset(ch->irb, 0, sizeof (struct irb));
1956 while (*c && less_than((*c)->id, ch->id))
1957 c = &(*c)->next;
1958 if (!strncmp((*c)->id, ch->id, CTC_ID_SIZE)) {
1959 ctc_pr_debug(
1960 "ctc: add_channel: device %s already in list, "
1961 "using old entry\n", (*c)->id);
1962 kfree(ch->irb);
1963 kfree_fsm(ch->fsm);
1964 kfree(ch->ccw);
1965 kfree(ch);
1966 return 0;
1967 }
1968 fsm_settimer(ch->fsm, &ch->timer);
1969 skb_queue_head_init(&ch->io_queue);
1970 skb_queue_head_init(&ch->collect_queue);
1971 ch->next = *c;
1972 *c = ch;
1973 return 0;
1974}
1975
1976
1977
1978
1979
1980
1981static void
1982channel_free(struct channel *ch)
1983{
1984 ch->flags &= ~CHANNEL_FLAGS_INUSE;
1985 fsm_newstate(ch->fsm, CH_STATE_IDLE);
1986}
1987
1988
1989
1990
1991
1992
1993static void
1994channel_remove(struct channel *ch)
1995{
1996 struct channel **c = &channels;
1997
1998 DBF_TEXT(trace, 2, __FUNCTION__);
1999 if (ch == NULL)
2000 return;
2001
2002 channel_free(ch);
2003 while (*c) {
2004 if (*c == ch) {
2005 *c = ch->next;
2006 fsm_deltimer(&ch->timer);
2007 kfree_fsm(ch->fsm);
2008 clear_normalized_cda(&ch->ccw[4]);
2009 if (ch->trans_skb != NULL) {
2010 clear_normalized_cda(&ch->ccw[1]);
2011 dev_kfree_skb(ch->trans_skb);
2012 }
2013 kfree(ch->ccw);
2014 return;
2015 }
2016 c = &((*c)->next);
2017 }
2018}
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029static struct channel
2030*
2031channel_get(enum channel_types type, char *id, int direction)
2032{
2033 struct channel *ch = channels;
2034
2035 DBF_TEXT(trace, 3, __FUNCTION__);
2036#ifdef DEBUG
2037 ctc_pr_debug("ctc: %s(): searching for ch with id %s and type %d\n",
2038 __func__, id, type);
2039#endif
2040
2041 while (ch && ((strncmp(ch->id, id, CTC_ID_SIZE)) || (ch->type != type))) {
2042#ifdef DEBUG
2043 ctc_pr_debug("ctc: %s(): ch=0x%p (id=%s, type=%d\n",
2044 __func__, ch, ch->id, ch->type);
2045#endif
2046 ch = ch->next;
2047 }
2048#ifdef DEBUG
2049 ctc_pr_debug("ctc: %s(): ch=0x%pq (id=%s, type=%d\n",
2050 __func__, ch, ch->id, ch->type);
2051#endif
2052 if (!ch) {
2053 ctc_pr_warn("ctc: %s(): channel with id %s "
2054 "and type %d not found in channel list\n",
2055 __func__, id, type);
2056 } else {
2057 if (ch->flags & CHANNEL_FLAGS_INUSE)
2058 ch = NULL;
2059 else {
2060 ch->flags |= CHANNEL_FLAGS_INUSE;
2061 ch->flags &= ~CHANNEL_FLAGS_RWMASK;
2062 ch->flags |= (direction == WRITE)
2063 ? CHANNEL_FLAGS_WRITE : CHANNEL_FLAGS_READ;
2064 fsm_newstate(ch->fsm, CH_STATE_STOPPED);
2065 }
2066 }
2067 return ch;
2068}
2069
2070
2071
2072
2073
2074
2075
2076
2077static enum channel_types inline
2078extract_channel_media(char *name)
2079{
2080 enum channel_types ret = channel_type_unknown;
2081
2082 if (name != NULL) {
2083 if (strncmp(name, "ctc", 3) == 0)
2084 ret = channel_type_parallel;
2085 if (strncmp(name, "escon", 5) == 0)
2086 ret = channel_type_escon;
2087 }
2088 return ret;
2089}
2090
2091static long
2092__ctc_check_irb_error(struct ccw_device *cdev, struct irb *irb)
2093{
2094 if (!IS_ERR(irb))
2095 return 0;
2096
2097 switch (PTR_ERR(irb)) {
2098 case -EIO:
2099 ctc_pr_warn("i/o-error on device %s\n", cdev->dev.bus_id);
2100
2101
2102 break;
2103 case -ETIMEDOUT:
2104 ctc_pr_warn("timeout on device %s\n", cdev->dev.bus_id);
2105
2106
2107 break;
2108 default:
2109 ctc_pr_warn("unknown error %ld on device %s\n", PTR_ERR(irb),
2110 cdev->dev.bus_id);
2111
2112
2113 }
2114 return PTR_ERR(irb);
2115}
2116
2117
2118
2119
2120
2121
2122
2123
2124static void
2125ctc_irq_handler(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
2126{
2127 struct channel *ch;
2128 struct net_device *dev;
2129 struct ctc_priv *priv;
2130
2131 DBF_TEXT(trace, 5, __FUNCTION__);
2132 if (__ctc_check_irb_error(cdev, irb))
2133 return;
2134
2135
2136 if (!cdev->dev.driver_data) {
2137 ctc_pr_warn("ctc: Got unsolicited irq: %s c-%02x d-%02x\n",
2138 cdev->dev.bus_id, irb->scsw.cstat,
2139 irb->scsw.dstat);
2140 return;
2141 }
2142
2143 priv = ((struct ccwgroup_device *)cdev->dev.driver_data)
2144 ->dev.driver_data;
2145
2146
2147 if (priv->channel[READ]->cdev == cdev)
2148 ch = priv->channel[READ];
2149 else if (priv->channel[WRITE]->cdev == cdev)
2150 ch = priv->channel[WRITE];
2151 else {
2152 ctc_pr_err("ctc: Can't determine channel for interrupt, "
2153 "device %s\n", cdev->dev.bus_id);
2154 return;
2155 }
2156
2157 dev = (struct net_device *) (ch->netdev);
2158 if (dev == NULL) {
2159 ctc_pr_crit("ctc: ctc_irq_handler dev=NULL bus_id=%s, ch=0x%p\n",
2160 cdev->dev.bus_id, ch);
2161 return;
2162 }
2163
2164#ifdef DEBUG
2165 ctc_pr_debug("%s: interrupt for device: %s received c-%02x d-%02x\n",
2166 dev->name, ch->id, irb->scsw.cstat, irb->scsw.dstat);
2167#endif
2168
2169
2170 memcpy(ch->irb, irb, sizeof(struct irb));
2171
2172
2173 if (ch->irb->scsw.cstat) {
2174 fsm_event(ch->fsm, CH_EVENT_SC_UNKNOWN, ch);
2175 ctc_pr_warn("%s: subchannel check for device: %s - %02x %02x\n",
2176 dev->name, ch->id, ch->irb->scsw.cstat,
2177 ch->irb->scsw.dstat);
2178 return;
2179 }
2180
2181
2182 if (ch->irb->scsw.dstat & DEV_STAT_UNIT_CHECK) {
2183 ccw_unit_check(ch, ch->irb->ecw[0]);
2184 return;
2185 }
2186 if (ch->irb->scsw.dstat & DEV_STAT_BUSY) {
2187 if (ch->irb->scsw.dstat & DEV_STAT_ATTENTION)
2188 fsm_event(ch->fsm, CH_EVENT_ATTNBUSY, ch);
2189 else
2190 fsm_event(ch->fsm, CH_EVENT_BUSY, ch);
2191 return;
2192 }
2193 if (ch->irb->scsw.dstat & DEV_STAT_ATTENTION) {
2194 fsm_event(ch->fsm, CH_EVENT_ATTN, ch);
2195 return;
2196 }
2197 if ((ch->irb->scsw.stctl & SCSW_STCTL_SEC_STATUS) ||
2198 (ch->irb->scsw.stctl == SCSW_STCTL_STATUS_PEND) ||
2199 (ch->irb->scsw.stctl ==
2200 (SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND)))
2201 fsm_event(ch->fsm, CH_EVENT_FINSTAT, ch);
2202 else
2203 fsm_event(ch->fsm, CH_EVENT_IRQ, ch);
2204
2205}
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218static void
2219dev_action_start(fsm_instance * fi, int event, void *arg)
2220{
2221 struct net_device *dev = (struct net_device *) arg;
2222 struct ctc_priv *privptr = dev->priv;
2223 int direction;
2224
2225 DBF_TEXT(setup, 3, __FUNCTION__);
2226 fsm_deltimer(&privptr->restart_timer);
2227 fsm_newstate(fi, DEV_STATE_STARTWAIT_RXTX);
2228 for (direction = READ; direction <= WRITE; direction++) {
2229 struct channel *ch = privptr->channel[direction];
2230 fsm_event(ch->fsm, CH_EVENT_START, ch);
2231 }
2232}
2233
2234
2235
2236
2237
2238
2239
2240
2241static void
2242dev_action_stop(fsm_instance * fi, int event, void *arg)
2243{
2244 struct net_device *dev = (struct net_device *) arg;
2245 struct ctc_priv *privptr = dev->priv;
2246 int direction;
2247
2248 DBF_TEXT(trace, 3, __FUNCTION__);
2249 fsm_newstate(fi, DEV_STATE_STOPWAIT_RXTX);
2250 for (direction = READ; direction <= WRITE; direction++) {
2251 struct channel *ch = privptr->channel[direction];
2252 fsm_event(ch->fsm, CH_EVENT_STOP, ch);
2253 }
2254}
2255static void
2256dev_action_restart(fsm_instance *fi, int event, void *arg)
2257{
2258 struct net_device *dev = (struct net_device *)arg;
2259 struct ctc_priv *privptr = dev->priv;
2260
2261 DBF_TEXT(trace, 3, __FUNCTION__);
2262 ctc_pr_debug("%s: Restarting\n", dev->name);
2263 dev_action_stop(fi, event, arg);
2264 fsm_event(privptr->fsm, DEV_EVENT_STOP, dev);
2265 fsm_addtimer(&privptr->restart_timer, CTC_TIMEOUT_5SEC,
2266 DEV_EVENT_START, dev);
2267}
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277static void
2278dev_action_chup(fsm_instance * fi, int event, void *arg)
2279{
2280 struct net_device *dev = (struct net_device *) arg;
2281 struct ctc_priv *privptr = dev->priv;
2282
2283 DBF_TEXT(trace, 3, __FUNCTION__);
2284 switch (fsm_getstate(fi)) {
2285 case DEV_STATE_STARTWAIT_RXTX:
2286 if (event == DEV_EVENT_RXUP)
2287 fsm_newstate(fi, DEV_STATE_STARTWAIT_TX);
2288 else
2289 fsm_newstate(fi, DEV_STATE_STARTWAIT_RX);
2290 break;
2291 case DEV_STATE_STARTWAIT_RX:
2292 if (event == DEV_EVENT_RXUP) {
2293 fsm_newstate(fi, DEV_STATE_RUNNING);
2294 ctc_pr_info("%s: connected with remote side\n",
2295 dev->name);
2296 if (privptr->protocol == CTC_PROTO_LINUX_TTY)
2297 ctc_tty_setcarrier(dev, 1);
2298 ctc_clear_busy(dev);
2299 }
2300 break;
2301 case DEV_STATE_STARTWAIT_TX:
2302 if (event == DEV_EVENT_TXUP) {
2303 fsm_newstate(fi, DEV_STATE_RUNNING);
2304 ctc_pr_info("%s: connected with remote side\n",
2305 dev->name);
2306 if (privptr->protocol == CTC_PROTO_LINUX_TTY)
2307 ctc_tty_setcarrier(dev, 1);
2308 ctc_clear_busy(dev);
2309 }
2310 break;
2311 case DEV_STATE_STOPWAIT_TX:
2312 if (event == DEV_EVENT_RXUP)
2313 fsm_newstate(fi, DEV_STATE_STOPWAIT_RXTX);
2314 break;
2315 case DEV_STATE_STOPWAIT_RX:
2316 if (event == DEV_EVENT_TXUP)
2317 fsm_newstate(fi, DEV_STATE_STOPWAIT_RXTX);
2318 break;
2319 }
2320}
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330static void
2331dev_action_chdown(fsm_instance * fi, int event, void *arg)
2332{
2333 struct net_device *dev = (struct net_device *) arg;
2334 struct ctc_priv *privptr = dev->priv;
2335
2336 DBF_TEXT(trace, 3, __FUNCTION__);
2337 switch (fsm_getstate(fi)) {
2338 case DEV_STATE_RUNNING:
2339 if (privptr->protocol == CTC_PROTO_LINUX_TTY)
2340 ctc_tty_setcarrier(dev, 0);
2341 if (event == DEV_EVENT_TXDOWN)
2342 fsm_newstate(fi, DEV_STATE_STARTWAIT_TX);
2343 else
2344 fsm_newstate(fi, DEV_STATE_STARTWAIT_RX);
2345 break;
2346 case DEV_STATE_STARTWAIT_RX:
2347 if (event == DEV_EVENT_TXDOWN)
2348 fsm_newstate(fi, DEV_STATE_STARTWAIT_RXTX);
2349 break;
2350 case DEV_STATE_STARTWAIT_TX:
2351 if (event == DEV_EVENT_RXDOWN)
2352 fsm_newstate(fi, DEV_STATE_STARTWAIT_RXTX);
2353 break;
2354 case DEV_STATE_STOPWAIT_RXTX:
2355 if (event == DEV_EVENT_TXDOWN)
2356 fsm_newstate(fi, DEV_STATE_STOPWAIT_RX);
2357 else
2358 fsm_newstate(fi, DEV_STATE_STOPWAIT_TX);
2359 break;
2360 case DEV_STATE_STOPWAIT_RX:
2361 if (event == DEV_EVENT_RXDOWN)
2362 fsm_newstate(fi, DEV_STATE_STOPPED);
2363 break;
2364 case DEV_STATE_STOPWAIT_TX:
2365 if (event == DEV_EVENT_TXDOWN)
2366 fsm_newstate(fi, DEV_STATE_STOPPED);
2367 break;
2368 }
2369}
2370
2371static const fsm_node dev_fsm[] = {
2372 {DEV_STATE_STOPPED, DEV_EVENT_START, dev_action_start},
2373
2374 {DEV_STATE_STOPWAIT_RXTX, DEV_EVENT_START, dev_action_start },
2375 {DEV_STATE_STOPWAIT_RXTX, DEV_EVENT_RXDOWN, dev_action_chdown },
2376 {DEV_STATE_STOPWAIT_RXTX, DEV_EVENT_TXDOWN, dev_action_chdown },
2377 {DEV_STATE_STOPWAIT_RXTX, DEV_EVENT_RESTART, dev_action_restart },
2378
2379 {DEV_STATE_STOPWAIT_RX, DEV_EVENT_START, dev_action_start },
2380 {DEV_STATE_STOPWAIT_RX, DEV_EVENT_RXUP, dev_action_chup },
2381 {DEV_STATE_STOPWAIT_RX, DEV_EVENT_TXUP, dev_action_chup },
2382 {DEV_STATE_STOPWAIT_RX, DEV_EVENT_RXDOWN, dev_action_chdown },
2383 {DEV_STATE_STOPWAIT_RX, DEV_EVENT_RESTART, dev_action_restart },
2384
2385 {DEV_STATE_STOPWAIT_TX, DEV_EVENT_START, dev_action_start },
2386 {DEV_STATE_STOPWAIT_TX, DEV_EVENT_RXUP, dev_action_chup },
2387 {DEV_STATE_STOPWAIT_TX, DEV_EVENT_TXUP, dev_action_chup },
2388 {DEV_STATE_STOPWAIT_TX, DEV_EVENT_TXDOWN, dev_action_chdown },
2389 {DEV_STATE_STOPWAIT_TX, DEV_EVENT_RESTART, dev_action_restart },
2390
2391 {DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_STOP, dev_action_stop },
2392 {DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_RXUP, dev_action_chup },
2393 {DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_TXUP, dev_action_chup },
2394 {DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_RXDOWN, dev_action_chdown },
2395 {DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_TXDOWN, dev_action_chdown },
2396 {DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_RESTART, dev_action_restart },
2397
2398 {DEV_STATE_STARTWAIT_TX, DEV_EVENT_STOP, dev_action_stop },
2399 {DEV_STATE_STARTWAIT_TX, DEV_EVENT_RXUP, dev_action_chup },
2400 {DEV_STATE_STARTWAIT_TX, DEV_EVENT_TXUP, dev_action_chup },
2401 {DEV_STATE_STARTWAIT_TX, DEV_EVENT_RXDOWN, dev_action_chdown },
2402 {DEV_STATE_STARTWAIT_TX, DEV_EVENT_RESTART, dev_action_restart },
2403
2404 {DEV_STATE_STARTWAIT_RX, DEV_EVENT_STOP, dev_action_stop },
2405 {DEV_STATE_STARTWAIT_RX, DEV_EVENT_RXUP, dev_action_chup },
2406 {DEV_STATE_STARTWAIT_RX, DEV_EVENT_TXUP, dev_action_chup },
2407 {DEV_STATE_STARTWAIT_RX, DEV_EVENT_TXDOWN, dev_action_chdown },
2408 {DEV_STATE_STARTWAIT_RX, DEV_EVENT_RESTART, dev_action_restart },
2409
2410 {DEV_STATE_RUNNING, DEV_EVENT_STOP, dev_action_stop },
2411 {DEV_STATE_RUNNING, DEV_EVENT_RXDOWN, dev_action_chdown },
2412 {DEV_STATE_RUNNING, DEV_EVENT_TXDOWN, dev_action_chdown },
2413 {DEV_STATE_RUNNING, DEV_EVENT_TXUP, fsm_action_nop },
2414 {DEV_STATE_RUNNING, DEV_EVENT_RXUP, fsm_action_nop },
2415 {DEV_STATE_RUNNING, DEV_EVENT_RESTART, dev_action_restart },
2416};
2417
2418static const int DEV_FSM_LEN = sizeof (dev_fsm) / sizeof (fsm_node);
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431static int
2432transmit_skb(struct channel *ch, struct sk_buff *skb)
2433{
2434 unsigned long saveflags;
2435 struct ll_header header;
2436 int rc = 0;
2437
2438 DBF_TEXT(trace, 5, __FUNCTION__);
2439 if (fsm_getstate(ch->fsm) != CH_STATE_TXIDLE) {
2440 int l = skb->len + LL_HEADER_LENGTH;
2441
2442 spin_lock_irqsave(&ch->collect_lock, saveflags);
2443 if (ch->collect_len + l > ch->max_bufsize - 2)
2444 rc = -EBUSY;
2445 else {
2446 atomic_inc(&skb->users);
2447 header.length = l;
2448 header.type = skb->protocol;
2449 header.unused = 0;
2450 memcpy(skb_push(skb, LL_HEADER_LENGTH), &header,
2451 LL_HEADER_LENGTH);
2452 skb_queue_tail(&ch->collect_queue, skb);
2453 ch->collect_len += l;
2454 }
2455 spin_unlock_irqrestore(&ch->collect_lock, saveflags);
2456 } else {
2457 __u16 block_len;
2458 int ccw_idx;
2459 struct sk_buff *nskb;
2460 unsigned long hi;
2461
2462
2463
2464
2465
2466 atomic_inc(&skb->users);
2467 ch->prof.txlen += skb->len;
2468 header.length = skb->len + LL_HEADER_LENGTH;
2469 header.type = skb->protocol;
2470 header.unused = 0;
2471 memcpy(skb_push(skb, LL_HEADER_LENGTH), &header,
2472 LL_HEADER_LENGTH);
2473 block_len = skb->len + 2;
2474 *((__u16 *) skb_push(skb, 2)) = block_len;
2475
2476
2477
2478
2479
2480 hi = ((unsigned long) skb->tail + LL_HEADER_LENGTH) >> 31;
2481 if (hi) {
2482 nskb = alloc_skb(skb->len, GFP_ATOMIC | GFP_DMA);
2483 if (!nskb) {
2484 atomic_dec(&skb->users);
2485 skb_pull(skb, LL_HEADER_LENGTH + 2);
2486 return -ENOMEM;
2487 } else {
2488 memcpy(skb_put(nskb, skb->len),
2489 skb->data, skb->len);
2490 atomic_inc(&nskb->users);
2491 atomic_dec(&skb->users);
2492 dev_kfree_skb_irq(skb);
2493 skb = nskb;
2494 }
2495 }
2496
2497 ch->ccw[4].count = block_len;
2498 if (set_normalized_cda(&ch->ccw[4], skb->data)) {
2499
2500
2501
2502
2503
2504 if (ctc_checkalloc_buffer(ch, 1)) {
2505
2506
2507
2508
2509 atomic_dec(&skb->users);
2510 skb_pull(skb, LL_HEADER_LENGTH + 2);
2511 return -EBUSY;
2512 }
2513
2514 ch->trans_skb->tail = ch->trans_skb->data;
2515 ch->trans_skb->len = 0;
2516 ch->ccw[1].count = skb->len;
2517 memcpy(skb_put(ch->trans_skb, skb->len), skb->data,
2518 skb->len);
2519 atomic_dec(&skb->users);
2520 dev_kfree_skb_irq(skb);
2521 ccw_idx = 0;
2522 } else {
2523 skb_queue_tail(&ch->io_queue, skb);
2524 ccw_idx = 3;
2525 }
2526 ch->retry = 0;
2527 fsm_newstate(ch->fsm, CH_STATE_TX);
2528 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
2529 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
2530 ch->prof.send_stamp = xtime;
2531 rc = ccw_device_start(ch->cdev, &ch->ccw[ccw_idx],
2532 (unsigned long) ch, 0xff, 0);
2533 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
2534 if (ccw_idx == 3)
2535 ch->prof.doios_single++;
2536 if (rc != 0) {
2537 fsm_deltimer(&ch->timer);
2538 ccw_check_return_code(ch, rc, "single skb TX");
2539 if (ccw_idx == 3)
2540 skb_dequeue_tail(&ch->io_queue);
2541
2542
2543
2544
2545 skb_pull(skb, LL_HEADER_LENGTH + 2);
2546 } else {
2547 if (ccw_idx == 0) {
2548 struct net_device *dev = ch->netdev;
2549 struct ctc_priv *privptr = dev->priv;
2550 privptr->stats.tx_packets++;
2551 privptr->stats.tx_bytes +=
2552 skb->len - LL_HEADER_LENGTH;
2553 }
2554 }
2555 }
2556
2557 return rc;
2558}
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572static int
2573ctc_open(struct net_device * dev)
2574{
2575 DBF_TEXT(trace, 5, __FUNCTION__);
2576 fsm_event(((struct ctc_priv *) dev->priv)->fsm, DEV_EVENT_START, dev);
2577 return 0;
2578}
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588static int
2589ctc_close(struct net_device * dev)
2590{
2591 DBF_TEXT(trace, 5, __FUNCTION__);
2592 fsm_event(((struct ctc_priv *) dev->priv)->fsm, DEV_EVENT_STOP, dev);
2593 return 0;
2594}
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607static int
2608ctc_tx(struct sk_buff *skb, struct net_device * dev)
2609{
2610 int rc = 0;
2611 struct ctc_priv *privptr = (struct ctc_priv *) dev->priv;
2612
2613 DBF_TEXT(trace, 5, __FUNCTION__);
2614
2615
2616
2617 if (skb == NULL) {
2618 ctc_pr_warn("%s: NULL sk_buff passed\n", dev->name);
2619 privptr->stats.tx_dropped++;
2620 return 0;
2621 }
2622 if (skb_headroom(skb) < (LL_HEADER_LENGTH + 2)) {
2623 ctc_pr_warn("%s: Got sk_buff with head room < %ld bytes\n",
2624 dev->name, LL_HEADER_LENGTH + 2);
2625 dev_kfree_skb(skb);
2626 privptr->stats.tx_dropped++;
2627 return 0;
2628 }
2629
2630
2631
2632
2633
2634 if (fsm_getstate(privptr->fsm) != DEV_STATE_RUNNING) {
2635 fsm_event(privptr->fsm, DEV_EVENT_START, dev);
2636 if (privptr->protocol == CTC_PROTO_LINUX_TTY)
2637 return -EBUSY;
2638 dev_kfree_skb(skb);
2639 privptr->stats.tx_dropped++;
2640 privptr->stats.tx_errors++;
2641 privptr->stats.tx_carrier_errors++;
2642 return 0;
2643 }
2644
2645 if (ctc_test_and_set_busy(dev))
2646 return -EBUSY;
2647
2648 dev->trans_start = jiffies;
2649 if (transmit_skb(privptr->channel[WRITE], skb) != 0)
2650 rc = 1;
2651 ctc_clear_busy(dev);
2652 return rc;
2653}
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666static int
2667ctc_change_mtu(struct net_device * dev, int new_mtu)
2668{
2669 struct ctc_priv *privptr = (struct ctc_priv *) dev->priv;
2670
2671 DBF_TEXT(trace, 3, __FUNCTION__);
2672 if ((new_mtu < 576) || (new_mtu > 65527) ||
2673 (new_mtu > (privptr->channel[READ]->max_bufsize -
2674 LL_HEADER_LENGTH - 2)))
2675 return -EINVAL;
2676 dev->mtu = new_mtu;
2677 dev->hard_header_len = LL_HEADER_LENGTH + 2;
2678 return 0;
2679}
2680
2681
2682
2683
2684
2685
2686
2687
2688static struct net_device_stats *
2689ctc_stats(struct net_device * dev)
2690{
2691 return &((struct ctc_priv *) dev->priv)->stats;
2692}
2693
2694
2695
2696
2697static ssize_t
2698buffer_show(struct device *dev, char *buf)
2699{
2700 struct ctc_priv *priv;
2701
2702 priv = dev->driver_data;
2703 if (!priv)
2704 return -ENODEV;
2705 return sprintf(buf, "%d\n",
2706 priv->channel[READ]->max_bufsize);
2707}
2708
2709static ssize_t
2710buffer_write(struct device *dev, const char *buf, size_t count)
2711{
2712 struct ctc_priv *priv;
2713 struct net_device *ndev;
2714 int bs1;
2715
2716 DBF_TEXT(trace, 3, __FUNCTION__);
2717 priv = dev->driver_data;
2718 if (!priv)
2719 return -ENODEV;
2720 ndev = priv->channel[READ]->netdev;
2721 if (!ndev)
2722 return -ENODEV;
2723 sscanf(buf, "%u", &bs1);
2724
2725 if (bs1 > CTC_BUFSIZE_LIMIT)
2726 return -EINVAL;
2727 if ((ndev->flags & IFF_RUNNING) &&
2728 (bs1 < (ndev->mtu + LL_HEADER_LENGTH + 2)))
2729 return -EINVAL;
2730 if (bs1 < (576 + LL_HEADER_LENGTH + 2))
2731 return -EINVAL;
2732
2733 priv->channel[READ]->max_bufsize =
2734 priv->channel[WRITE]->max_bufsize = bs1;
2735 if (!(ndev->flags & IFF_RUNNING))
2736 ndev->mtu = bs1 - LL_HEADER_LENGTH - 2;
2737 priv->channel[READ]->flags |= CHANNEL_FLAGS_BUFSIZE_CHANGED;
2738 priv->channel[WRITE]->flags |= CHANNEL_FLAGS_BUFSIZE_CHANGED;
2739
2740 return count;
2741
2742}
2743
2744static ssize_t
2745loglevel_show(struct device *dev, char *buf)
2746{
2747 struct ctc_priv *priv;
2748
2749 priv = dev->driver_data;
2750 if (!priv)
2751 return -ENODEV;
2752 return sprintf(buf, "%d\n", loglevel);
2753}
2754
2755static ssize_t
2756loglevel_write(struct device *dev, const char *buf, size_t count)
2757{
2758 struct ctc_priv *priv;
2759 int ll1;
2760
2761 DBF_TEXT(trace, 5, __FUNCTION__);
2762 priv = dev->driver_data;
2763 if (!priv)
2764 return -ENODEV;
2765 sscanf(buf, "%i", &ll1);
2766
2767 if ((ll1 > CTC_LOGLEVEL_MAX) || (ll1 < 0))
2768 return -EINVAL;
2769 loglevel = ll1;
2770 return count;
2771}
2772
2773static void
2774ctc_print_statistics(struct ctc_priv *priv)
2775{
2776 char *sbuf;
2777 char *p;
2778
2779 DBF_TEXT(trace, 4, __FUNCTION__);
2780 if (!priv)
2781 return;
2782 sbuf = (char *)kmalloc(2048, GFP_KERNEL);
2783 if (sbuf == NULL)
2784 return;
2785 p = sbuf;
2786
2787 p += sprintf(p, " Device FSM state: %s\n",
2788 fsm_getstate_str(priv->fsm));
2789 p += sprintf(p, " RX channel FSM state: %s\n",
2790 fsm_getstate_str(priv->channel[READ]->fsm));
2791 p += sprintf(p, " TX channel FSM state: %s\n",
2792 fsm_getstate_str(priv->channel[WRITE]->fsm));
2793 p += sprintf(p, " Max. TX buffer used: %ld\n",
2794 priv->channel[WRITE]->prof.maxmulti);
2795 p += sprintf(p, " Max. chained SKBs: %ld\n",
2796 priv->channel[WRITE]->prof.maxcqueue);
2797 p += sprintf(p, " TX single write ops: %ld\n",
2798 priv->channel[WRITE]->prof.doios_single);
2799 p += sprintf(p, " TX multi write ops: %ld\n",
2800 priv->channel[WRITE]->prof.doios_multi);
2801 p += sprintf(p, " Netto bytes written: %ld\n",
2802 priv->channel[WRITE]->prof.txlen);
2803 p += sprintf(p, " Max. TX IO-time: %ld\n",
2804 priv->channel[WRITE]->prof.tx_time);
2805
2806 ctc_pr_debug("Statistics for %s:\n%s",
2807 priv->channel[WRITE]->netdev->name, sbuf);
2808 kfree(sbuf);
2809 return;
2810}
2811
2812static ssize_t
2813stats_show(struct device *dev, char *buf)
2814{
2815 struct ctc_priv *priv = dev->driver_data;
2816 if (!priv)
2817 return -ENODEV;
2818 ctc_print_statistics(priv);
2819 return sprintf(buf, "0\n");
2820}
2821
2822static ssize_t
2823stats_write(struct device *dev, const char *buf, size_t count)
2824{
2825 struct ctc_priv *priv = dev->driver_data;
2826 if (!priv)
2827 return -ENODEV;
2828
2829 memset(&priv->channel[WRITE]->prof, 0,
2830 sizeof(priv->channel[WRITE]->prof));
2831 return count;
2832}
2833
2834static DEVICE_ATTR(buffer, 0644, buffer_show, buffer_write);
2835static DEVICE_ATTR(loglevel, 0644, loglevel_show, loglevel_write);
2836static DEVICE_ATTR(stats, 0644, stats_show, stats_write);
2837
2838static int
2839ctc_add_attributes(struct device *dev)
2840{
2841
2842 device_create_file(dev, &dev_attr_loglevel);
2843 device_create_file(dev, &dev_attr_stats);
2844 return 0;
2845}
2846
2847static void
2848ctc_remove_attributes(struct device *dev)
2849{
2850 device_remove_file(dev, &dev_attr_stats);
2851 device_remove_file(dev, &dev_attr_loglevel);
2852
2853}
2854
2855
2856static void
2857ctc_netdev_unregister(struct net_device * dev)
2858{
2859 struct ctc_priv *privptr;
2860
2861 if (!dev)
2862 return;
2863 privptr = (struct ctc_priv *) dev->priv;
2864 if (privptr->protocol != CTC_PROTO_LINUX_TTY)
2865 unregister_netdev(dev);
2866 else
2867 ctc_tty_unregister_netdev(dev);
2868}
2869
2870static int
2871ctc_netdev_register(struct net_device * dev)
2872{
2873 struct ctc_priv *privptr = (struct ctc_priv *) dev->priv;
2874 if (privptr->protocol != CTC_PROTO_LINUX_TTY)
2875 return register_netdev(dev);
2876 else
2877 return ctc_tty_register_netdev(dev);
2878}
2879
2880static void
2881ctc_free_netdevice(struct net_device * dev, int free_dev)
2882{
2883 struct ctc_priv *privptr;
2884 if (!dev)
2885 return;
2886 privptr = dev->priv;
2887 if (privptr) {
2888 if (privptr->fsm)
2889 kfree_fsm(privptr->fsm);
2890 kfree(privptr);
2891 }
2892#ifdef MODULE
2893 if (free_dev)
2894 free_netdev(dev);
2895#endif
2896}
2897
2898
2899
2900
2901
2902static struct net_device *
2903ctc_init_netdevice(struct net_device * dev, int alloc_device,
2904 struct ctc_priv *privptr)
2905{
2906 if (!privptr)
2907 return NULL;
2908
2909 DBF_TEXT(setup, 3, __FUNCTION__);
2910 if (alloc_device) {
2911 dev = kmalloc(sizeof (struct net_device), GFP_KERNEL);
2912 if (!dev)
2913 return NULL;
2914 memset(dev, 0, sizeof (struct net_device));
2915 }
2916
2917 dev->priv = privptr;
2918 privptr->fsm = init_fsm("ctcdev", dev_state_names,
2919 dev_event_names, NR_DEV_STATES, NR_DEV_EVENTS,
2920 dev_fsm, DEV_FSM_LEN, GFP_KERNEL);
2921 if (privptr->fsm == NULL) {
2922 if (alloc_device)
2923 kfree(dev);
2924 return NULL;
2925 }
2926 fsm_newstate(privptr->fsm, DEV_STATE_STOPPED);
2927 fsm_settimer(privptr->fsm, &privptr->restart_timer);
2928 dev->mtu = CTC_BUFSIZE_DEFAULT - LL_HEADER_LENGTH - 2;
2929 dev->hard_start_xmit = ctc_tx;
2930 dev->open = ctc_open;
2931 dev->stop = ctc_close;
2932 dev->get_stats = ctc_stats;
2933 dev->change_mtu = ctc_change_mtu;
2934 dev->hard_header_len = LL_HEADER_LENGTH + 2;
2935 dev->addr_len = 0;
2936 dev->type = ARPHRD_SLIP;
2937 dev->tx_queue_len = 100;
2938 dev->flags = IFF_POINTOPOINT | IFF_NOARP;
2939 SET_MODULE_OWNER(dev);
2940 return dev;
2941}
2942
2943static ssize_t
2944ctc_proto_show(struct device *dev, char *buf)
2945{
2946 struct ctc_priv *priv;
2947
2948 priv = dev->driver_data;
2949 if (!priv)
2950 return -ENODEV;
2951
2952 return sprintf(buf, "%d\n", priv->protocol);
2953}
2954
2955static ssize_t
2956ctc_proto_store(struct device *dev, const char *buf, size_t count)
2957{
2958 struct ctc_priv *priv;
2959 int value;
2960
2961 DBF_TEXT(trace, 3, __FUNCTION__);
2962 pr_debug("%s() called\n", __FUNCTION__);
2963
2964 priv = dev->driver_data;
2965 if (!priv)
2966 return -ENODEV;
2967 sscanf(buf, "%u", &value);
2968 if ((value < 0) || (value > CTC_PROTO_MAX))
2969 return -EINVAL;
2970 priv->protocol = value;
2971
2972 return count;
2973}
2974
2975static DEVICE_ATTR(protocol, 0644, ctc_proto_show, ctc_proto_store);
2976
2977static ssize_t
2978ctc_type_show(struct device *dev, char *buf)
2979{
2980 struct ccwgroup_device *cgdev;
2981
2982 cgdev = to_ccwgroupdev(dev);
2983 if (!cgdev)
2984 return -ENODEV;
2985
2986 return sprintf(buf, "%s\n", cu3088_type[cgdev->cdev[0]->id.driver_info]);
2987}
2988
2989static DEVICE_ATTR(type, 0444, ctc_type_show, NULL);
2990
2991static struct attribute *ctc_attr[] = {
2992 &dev_attr_protocol.attr,
2993 &dev_attr_type.attr,
2994 &dev_attr_buffer.attr,
2995 NULL,
2996};
2997
2998static struct attribute_group ctc_attr_group = {
2999 .attrs = ctc_attr,
3000};
3001
3002static int
3003ctc_add_files(struct device *dev)
3004{
3005 pr_debug("%s() called\n", __FUNCTION__);
3006
3007 return sysfs_create_group(&dev->kobj, &ctc_attr_group);
3008}
3009
3010static void
3011ctc_remove_files(struct device *dev)
3012{
3013 pr_debug("%s() called\n", __FUNCTION__);
3014
3015 sysfs_remove_group(&dev->kobj, &ctc_attr_group);
3016}
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027static int
3028ctc_probe_device(struct ccwgroup_device *cgdev)
3029{
3030 struct ctc_priv *priv;
3031 int rc;
3032
3033 pr_debug("%s() called\n", __FUNCTION__);
3034 DBF_TEXT(trace, 3, __FUNCTION__);
3035
3036 if (!get_device(&cgdev->dev))
3037 return -ENODEV;
3038
3039 priv = kmalloc(sizeof (struct ctc_priv), GFP_KERNEL);
3040 if (!priv) {
3041 ctc_pr_err("%s: Out of memory\n", __func__);
3042 put_device(&cgdev->dev);
3043 return -ENOMEM;
3044 }
3045
3046 memset(priv, 0, sizeof (struct ctc_priv));
3047 rc = ctc_add_files(&cgdev->dev);
3048 if (rc) {
3049 kfree(priv);
3050 put_device(&cgdev->dev);
3051 return rc;
3052 }
3053
3054 cgdev->cdev[0]->handler = ctc_irq_handler;
3055 cgdev->cdev[1]->handler = ctc_irq_handler;
3056 cgdev->dev.driver_data = priv;
3057
3058 return 0;
3059}
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069static int
3070ctc_new_device(struct ccwgroup_device *cgdev)
3071{
3072 char read_id[CTC_ID_SIZE];
3073 char write_id[CTC_ID_SIZE];
3074 int direction;
3075 enum channel_types type;
3076 struct ctc_priv *privptr;
3077 struct net_device *dev;
3078 int ret;
3079
3080 pr_debug("%s() called\n", __FUNCTION__);
3081 DBF_TEXT(setup, 3, __FUNCTION__);
3082
3083 privptr = cgdev->dev.driver_data;
3084 if (!privptr)
3085 return -ENODEV;
3086
3087 type = get_channel_type(&cgdev->cdev[0]->id);
3088
3089 snprintf(read_id, CTC_ID_SIZE, "ch-%s", cgdev->cdev[0]->dev.bus_id);
3090 snprintf(write_id, CTC_ID_SIZE, "ch-%s", cgdev->cdev[1]->dev.bus_id);
3091
3092 if (add_channel(cgdev->cdev[0], type))
3093 return -ENOMEM;
3094 if (add_channel(cgdev->cdev[1], type))
3095 return -ENOMEM;
3096
3097 ret = ccw_device_set_online(cgdev->cdev[0]);
3098 if (ret != 0) {
3099 printk(KERN_WARNING
3100 "ccw_device_set_online (cdev[0]) failed with ret = %d\n", ret);
3101 }
3102
3103 ret = ccw_device_set_online(cgdev->cdev[1]);
3104 if (ret != 0) {
3105 printk(KERN_WARNING
3106 "ccw_device_set_online (cdev[1]) failed with ret = %d\n", ret);
3107 }
3108
3109 dev = ctc_init_netdevice(NULL, 1, privptr);
3110
3111 if (!dev) {
3112 ctc_pr_warn("ctc_init_netdevice failed\n");
3113 goto out;
3114 }
3115
3116 if (privptr->protocol == CTC_PROTO_LINUX_TTY)
3117 strlcpy(dev->name, "ctctty%d", IFNAMSIZ);
3118 else
3119 strlcpy(dev->name, "ctc%d", IFNAMSIZ);
3120
3121 for (direction = READ; direction <= WRITE; direction++) {
3122 privptr->channel[direction] =
3123 channel_get(type, direction == READ ? read_id : write_id,
3124 direction);
3125 if (privptr->channel[direction] == NULL) {
3126 if (direction == WRITE)
3127 channel_free(privptr->channel[READ]);
3128
3129 ctc_free_netdevice(dev, 1);
3130 goto out;
3131 }
3132 privptr->channel[direction]->netdev = dev;
3133 privptr->channel[direction]->protocol = privptr->protocol;
3134 privptr->channel[direction]->max_bufsize = CTC_BUFSIZE_DEFAULT;
3135 }
3136
3137 SET_NETDEV_DEV(dev, &cgdev->dev);
3138
3139 if (ctc_netdev_register(dev) != 0) {
3140 ctc_free_netdevice(dev, 1);
3141 goto out;
3142 }
3143
3144 ctc_add_attributes(&cgdev->dev);
3145
3146 strlcpy(privptr->fsm->name, dev->name, sizeof (privptr->fsm->name));
3147
3148 print_banner();
3149
3150 ctc_pr_info("%s: read: %s, write: %s, proto: %d\n",
3151 dev->name, privptr->channel[READ]->id,
3152 privptr->channel[WRITE]->id, privptr->protocol);
3153
3154 return 0;
3155out:
3156 ccw_device_set_offline(cgdev->cdev[1]);
3157 ccw_device_set_offline(cgdev->cdev[0]);
3158
3159 return -ENODEV;
3160}
3161
3162
3163
3164
3165
3166
3167
3168
3169static int
3170ctc_shutdown_device(struct ccwgroup_device *cgdev)
3171{
3172 struct ctc_priv *priv;
3173 struct net_device *ndev;
3174
3175 DBF_TEXT(trace, 3, __FUNCTION__);
3176 pr_debug("%s() called\n", __FUNCTION__);
3177
3178 priv = cgdev->dev.driver_data;
3179 ndev = NULL;
3180 if (!priv)
3181 return -ENODEV;
3182
3183 if (priv->channel[READ]) {
3184 ndev = priv->channel[READ]->netdev;
3185
3186
3187 ctc_close(ndev);
3188 ndev->flags &=~IFF_RUNNING;
3189
3190 ctc_remove_attributes(&cgdev->dev);
3191
3192 channel_free(priv->channel[READ]);
3193 }
3194 if (priv->channel[WRITE])
3195 channel_free(priv->channel[WRITE]);
3196
3197 if (ndev) {
3198 ctc_netdev_unregister(ndev);
3199 ndev->priv = NULL;
3200 ctc_free_netdevice(ndev, 1);
3201 }
3202
3203 if (priv->fsm)
3204 kfree_fsm(priv->fsm);
3205
3206 ccw_device_set_offline(cgdev->cdev[1]);
3207 ccw_device_set_offline(cgdev->cdev[0]);
3208
3209 if (priv->channel[READ])
3210 channel_remove(priv->channel[READ]);
3211 if (priv->channel[WRITE])
3212 channel_remove(priv->channel[WRITE]);
3213
3214 priv->channel[READ] = priv->channel[WRITE] = NULL;
3215
3216 return 0;
3217
3218}
3219
3220static void
3221ctc_remove_device(struct ccwgroup_device *cgdev)
3222{
3223 struct ctc_priv *priv;
3224
3225 pr_debug("%s() called\n", __FUNCTION__);
3226 DBF_TEXT(trace, 3, __FUNCTION__);
3227
3228 priv = cgdev->dev.driver_data;
3229 if (!priv)
3230 return;
3231 if (cgdev->state == CCWGROUP_ONLINE)
3232 ctc_shutdown_device(cgdev);
3233 ctc_remove_files(&cgdev->dev);
3234 cgdev->dev.driver_data = NULL;
3235 kfree(priv);
3236 put_device(&cgdev->dev);
3237}
3238
3239static struct ccwgroup_driver ctc_group_driver = {
3240 .owner = THIS_MODULE,
3241 .name = "ctc",
3242 .max_slaves = 2,
3243 .driver_id = 0xC3E3C3,
3244 .probe = ctc_probe_device,
3245 .remove = ctc_remove_device,
3246 .set_online = ctc_new_device,
3247 .set_offline = ctc_shutdown_device,
3248};
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260static void __exit
3261ctc_exit(void)
3262{
3263 unregister_cu3088_discipline(&ctc_group_driver);
3264 ctc_tty_cleanup();
3265 ctc_unregister_dbf_views();
3266 ctc_pr_info("CTC driver unloaded\n");
3267}
3268
3269
3270
3271
3272
3273
3274
3275static int __init
3276ctc_init(void)
3277{
3278 int ret = 0;
3279
3280 print_banner();
3281
3282 ret = ctc_register_dbf_views();
3283 if (ret){
3284 ctc_pr_crit("ctc_init failed with ctc_register_dbf_views rc = %d\n", ret);
3285 return ret;
3286 }
3287 ctc_tty_init();
3288 ret = register_cu3088_discipline(&ctc_group_driver);
3289 if (ret) {
3290 ctc_tty_cleanup();
3291 ctc_unregister_dbf_views();
3292 }
3293 return ret;
3294}
3295
3296module_init(ctc_init);
3297module_exit(ctc_exit);
3298
3299
3300