blob: 570a960bfb5b0c7ec7e1e22a5ef727d3b4336a04 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 * CTC / ESCON network driver
3 *
4 * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
5 * Author(s): Fritz Elfert (elfert@de.ibm.com, felfert@millenux.com)
6 * Fixes by : Jochen Röhrig (roehrig@de.ibm.com)
7 * Arnaldo Carvalho de Melo <acme@conectiva.com.br>
8 Peter Tiedemann (ptiedem@de.ibm.com)
Frank Pavlic56347a22006-04-13 20:19:12 +02009 * Driver Model stuff by : Cornelia Huck <cornelia.huck@de.ibm.com>
Linus Torvalds1da177e2005-04-16 15:20:36 -070010 *
11 * Documentation used:
12 * - Principles of Operation (IBM doc#: SA22-7201-06)
13 * - Common IO/-Device Commands and Self Description (IBM doc#: SA22-7204-02)
14 * - Common IO/-Device Commands and Self Description (IBM doc#: SN22-5535)
15 * - ESCON Channel-to-Channel Adapter (IBM doc#: SA22-7203-00)
16 * - ESCON I/O Interface (IBM doc#: SA22-7202-029
17 *
18 * and the source of the original CTC driver by:
19 * Dieter Wellerdiek (wel@de.ibm.com)
20 * Martin Schwidefsky (schwidefsky@de.ibm.com)
21 * Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
22 * Jochen Röhrig (roehrig@de.ibm.com)
23 *
24 * This program is free software; you can redistribute it and/or modify
25 * it under the terms of the GNU General Public License as published by
26 * the Free Software Foundation; either version 2, or (at your option)
27 * any later version.
28 *
29 * This program is distributed in the hope that it will be useful,
30 * but WITHOUT ANY WARRANTY; without even the implied warranty of
31 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
32 * GNU General Public License for more details.
33 *
34 * You should have received a copy of the GNU General Public License
35 * along with this program; if not, write to the Free Software
36 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
37 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070038 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070039#undef DEBUG
Linus Torvalds1da177e2005-04-16 15:20:36 -070040#include <linux/module.h>
41#include <linux/init.h>
42#include <linux/kernel.h>
43#include <linux/slab.h>
44#include <linux/errno.h>
45#include <linux/types.h>
46#include <linux/interrupt.h>
47#include <linux/timer.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070048#include <linux/bitops.h>
49
50#include <linux/signal.h>
51#include <linux/string.h>
52
53#include <linux/ip.h>
54#include <linux/if_arp.h>
55#include <linux/tcp.h>
56#include <linux/skbuff.h>
57#include <linux/ctype.h>
58#include <net/dst.h>
59
60#include <asm/io.h>
61#include <asm/ccwdev.h>
62#include <asm/ccwgroup.h>
63#include <asm/uaccess.h>
64
65#include <asm/idals.h>
66
Linus Torvalds1da177e2005-04-16 15:20:36 -070067#include "fsm.h"
68#include "cu3088.h"
Frank Pavlic7394c922005-05-12 20:36:47 +020069
Linus Torvalds1da177e2005-04-16 15:20:36 -070070#include "ctcdbug.h"
Frank Pavlic7394c922005-05-12 20:36:47 +020071#include "ctcmain.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070072
73MODULE_AUTHOR("(C) 2000 IBM Corp. by Fritz Elfert (felfert@millenux.com)");
74MODULE_DESCRIPTION("Linux for S/390 CTC/Escon Driver");
75MODULE_LICENSE("GPL");
Linus Torvalds1da177e2005-04-16 15:20:36 -070076/**
77 * States of the interface statemachine.
78 */
79enum dev_states {
80 DEV_STATE_STOPPED,
81 DEV_STATE_STARTWAIT_RXTX,
82 DEV_STATE_STARTWAIT_RX,
83 DEV_STATE_STARTWAIT_TX,
84 DEV_STATE_STOPWAIT_RXTX,
85 DEV_STATE_STOPWAIT_RX,
86 DEV_STATE_STOPWAIT_TX,
87 DEV_STATE_RUNNING,
88 /**
89 * MUST be always the last element!!
90 */
Frank Pavlic7394c922005-05-12 20:36:47 +020091 CTC_NR_DEV_STATES
Linus Torvalds1da177e2005-04-16 15:20:36 -070092};
93
94static const char *dev_state_names[] = {
95 "Stopped",
96 "StartWait RXTX",
97 "StartWait RX",
98 "StartWait TX",
99 "StopWait RXTX",
100 "StopWait RX",
101 "StopWait TX",
102 "Running",
103};
104
105/**
106 * Events of the interface statemachine.
107 */
108enum dev_events {
109 DEV_EVENT_START,
110 DEV_EVENT_STOP,
111 DEV_EVENT_RXUP,
112 DEV_EVENT_TXUP,
113 DEV_EVENT_RXDOWN,
114 DEV_EVENT_TXDOWN,
115 DEV_EVENT_RESTART,
116 /**
117 * MUST be always the last element!!
118 */
Frank Pavlic7394c922005-05-12 20:36:47 +0200119 CTC_NR_DEV_EVENTS
Linus Torvalds1da177e2005-04-16 15:20:36 -0700120};
121
122static const char *dev_event_names[] = {
123 "Start",
124 "Stop",
125 "RX up",
126 "TX up",
127 "RX down",
128 "TX down",
129 "Restart",
130};
Frank Pavlice172577d2005-09-08 09:50:06 +0200131
Linus Torvalds1da177e2005-04-16 15:20:36 -0700132/**
133 * Events of the channel statemachine
134 */
135enum ch_events {
136 /**
137 * Events, representing return code of
138 * I/O operations (ccw_device_start, ccw_device_halt et al.)
139 */
140 CH_EVENT_IO_SUCCESS,
141 CH_EVENT_IO_EBUSY,
142 CH_EVENT_IO_ENODEV,
143 CH_EVENT_IO_EIO,
144 CH_EVENT_IO_UNKNOWN,
145
146 CH_EVENT_ATTNBUSY,
147 CH_EVENT_ATTN,
148 CH_EVENT_BUSY,
149
150 /**
151 * Events, representing unit-check
152 */
153 CH_EVENT_UC_RCRESET,
154 CH_EVENT_UC_RSRESET,
155 CH_EVENT_UC_TXTIMEOUT,
156 CH_EVENT_UC_TXPARITY,
157 CH_EVENT_UC_HWFAIL,
158 CH_EVENT_UC_RXPARITY,
159 CH_EVENT_UC_ZERO,
160 CH_EVENT_UC_UNKNOWN,
161
162 /**
163 * Events, representing subchannel-check
164 */
165 CH_EVENT_SC_UNKNOWN,
166
167 /**
168 * Events, representing machine checks
169 */
170 CH_EVENT_MC_FAIL,
171 CH_EVENT_MC_GOOD,
172
173 /**
174 * Event, representing normal IRQ
175 */
176 CH_EVENT_IRQ,
177 CH_EVENT_FINSTAT,
178
179 /**
180 * Event, representing timer expiry.
181 */
182 CH_EVENT_TIMER,
183
184 /**
185 * Events, representing commands from upper levels.
186 */
187 CH_EVENT_START,
188 CH_EVENT_STOP,
189
190 /**
191 * MUST be always the last element!!
192 */
193 NR_CH_EVENTS,
194};
195
Linus Torvalds1da177e2005-04-16 15:20:36 -0700196/**
197 * States of the channel statemachine.
198 */
199enum ch_states {
200 /**
201 * Channel not assigned to any device,
202 * initial state, direction invalid
203 */
204 CH_STATE_IDLE,
205
206 /**
207 * Channel assigned but not operating
208 */
209 CH_STATE_STOPPED,
210 CH_STATE_STARTWAIT,
211 CH_STATE_STARTRETRY,
212 CH_STATE_SETUPWAIT,
213 CH_STATE_RXINIT,
214 CH_STATE_TXINIT,
215 CH_STATE_RX,
216 CH_STATE_TX,
217 CH_STATE_RXIDLE,
218 CH_STATE_TXIDLE,
219 CH_STATE_RXERR,
220 CH_STATE_TXERR,
221 CH_STATE_TERM,
222 CH_STATE_DTERM,
223 CH_STATE_NOTOP,
224
225 /**
226 * MUST be always the last element!!
227 */
228 NR_CH_STATES,
229};
230
Frank Pavlic7394c922005-05-12 20:36:47 +0200231static int loglevel = CTC_LOGLEVEL_DEFAULT;
232
233/**
234 * Linked list of all detected channels.
235 */
236static struct channel *channels = NULL;
237
238/**
239 * Print Banner.
240 */
241static void
242print_banner(void)
243{
244 static int printed = 0;
Frank Pavlic7394c922005-05-12 20:36:47 +0200245
246 if (printed)
247 return;
Heiko Carstense018ba12006-02-01 03:06:31 -0800248
249 printk(KERN_INFO "CTC driver initialized\n");
Frank Pavlic7394c922005-05-12 20:36:47 +0200250 printed = 1;
251}
252
253/**
254 * Return type of a detected device.
255 */
256static enum channel_types
257get_channel_type(struct ccw_device_id *id)
258{
259 enum channel_types type = (enum channel_types) id->driver_info;
260
261 if (type == channel_type_ficon)
262 type = channel_type_escon;
263
264 return type;
265}
266
267static const char *ch_event_names[] = {
268 "ccw_device success",
269 "ccw_device busy",
270 "ccw_device enodev",
271 "ccw_device ioerr",
272 "ccw_device unknown",
273
274 "Status ATTN & BUSY",
275 "Status ATTN",
276 "Status BUSY",
277
278 "Unit check remote reset",
279 "Unit check remote system reset",
280 "Unit check TX timeout",
281 "Unit check TX parity",
282 "Unit check Hardware failure",
283 "Unit check RX parity",
284 "Unit check ZERO",
285 "Unit check Unknown",
286
287 "SubChannel check Unknown",
288
289 "Machine check failure",
290 "Machine check operational",
291
292 "IRQ normal",
293 "IRQ final",
294
295 "Timer",
296
297 "Start",
298 "Stop",
299};
300
Linus Torvalds1da177e2005-04-16 15:20:36 -0700301static const char *ch_state_names[] = {
302 "Idle",
303 "Stopped",
304 "StartWait",
305 "StartRetry",
306 "SetupWait",
307 "RX init",
308 "TX init",
309 "RX",
310 "TX",
311 "RX idle",
312 "TX idle",
313 "RX error",
314 "TX error",
315 "Terminating",
316 "Restarting",
317 "Not operational",
318};
Frank Pavlice172577d2005-09-08 09:50:06 +0200319
Linus Torvalds1da177e2005-04-16 15:20:36 -0700320#ifdef DEBUG
321/**
322 * Dump header and first 16 bytes of an sk_buff for debugging purposes.
323 *
324 * @param skb The sk_buff to dump.
325 * @param offset Offset relative to skb-data, where to start the dump.
326 */
327static void
328ctc_dump_skb(struct sk_buff *skb, int offset)
329{
330 unsigned char *p = skb->data;
331 __u16 bl;
332 struct ll_header *header;
333 int i;
334
335 if (!(loglevel & CTC_LOGLEVEL_DEBUG))
336 return;
337 p += offset;
338 bl = *((__u16 *) p);
339 p += 2;
340 header = (struct ll_header *) p;
341 p -= 2;
342
343 printk(KERN_DEBUG "dump:\n");
344 printk(KERN_DEBUG "blocklen=%d %04x\n", bl, bl);
345
346 printk(KERN_DEBUG "h->length=%d %04x\n", header->length,
347 header->length);
348 printk(KERN_DEBUG "h->type=%04x\n", header->type);
349 printk(KERN_DEBUG "h->unused=%04x\n", header->unused);
350 if (bl > 16)
351 bl = 16;
352 printk(KERN_DEBUG "data: ");
353 for (i = 0; i < bl; i++)
354 printk("%02x%s", *p++, (i % 16) ? " " : "\n<7>");
355 printk("\n");
356}
357#else
358static inline void
359ctc_dump_skb(struct sk_buff *skb, int offset)
360{
361}
362#endif
363
364/**
365 * Unpack a just received skb and hand it over to
366 * upper layers.
367 *
368 * @param ch The channel where this skb has been received.
369 * @param pskb The received skb.
370 */
Heiko Carstens4d284ca2007-02-05 21:18:53 +0100371static void
Linus Torvalds1da177e2005-04-16 15:20:36 -0700372ctc_unpack_skb(struct channel *ch, struct sk_buff *pskb)
373{
374 struct net_device *dev = ch->netdev;
375 struct ctc_priv *privptr = (struct ctc_priv *) dev->priv;
376 __u16 len = *((__u16 *) pskb->data);
377
378 DBF_TEXT(trace, 4, __FUNCTION__);
379 skb_put(pskb, 2 + LL_HEADER_LENGTH);
380 skb_pull(pskb, 2);
381 pskb->dev = dev;
382 pskb->ip_summed = CHECKSUM_UNNECESSARY;
383 while (len > 0) {
384 struct sk_buff *skb;
385 struct ll_header *header = (struct ll_header *) pskb->data;
386
387 skb_pull(pskb, LL_HEADER_LENGTH);
388 if ((ch->protocol == CTC_PROTO_S390) &&
389 (header->type != ETH_P_IP)) {
390
391#ifndef DEBUG
392 if (!(ch->logflags & LOG_FLAG_ILLEGALPKT)) {
393#endif
394 /**
395 * Check packet type only if we stick strictly
396 * to S/390's protocol of OS390. This only
397 * supports IP. Otherwise allow any packet
398 * type.
399 */
400 ctc_pr_warn(
401 "%s Illegal packet type 0x%04x received, dropping\n",
402 dev->name, header->type);
403 ch->logflags |= LOG_FLAG_ILLEGALPKT;
404#ifndef DEBUG
405 }
406#endif
407#ifdef DEBUG
408 ctc_dump_skb(pskb, -6);
409#endif
410 privptr->stats.rx_dropped++;
411 privptr->stats.rx_frame_errors++;
412 return;
413 }
414 pskb->protocol = ntohs(header->type);
415 if (header->length <= LL_HEADER_LENGTH) {
416#ifndef DEBUG
417 if (!(ch->logflags & LOG_FLAG_ILLEGALSIZE)) {
418#endif
419 ctc_pr_warn(
420 "%s Illegal packet size %d "
421 "received (MTU=%d blocklen=%d), "
422 "dropping\n", dev->name, header->length,
423 dev->mtu, len);
424 ch->logflags |= LOG_FLAG_ILLEGALSIZE;
425#ifndef DEBUG
426 }
427#endif
428#ifdef DEBUG
429 ctc_dump_skb(pskb, -6);
430#endif
431 privptr->stats.rx_dropped++;
432 privptr->stats.rx_length_errors++;
433 return;
434 }
435 header->length -= LL_HEADER_LENGTH;
436 len -= LL_HEADER_LENGTH;
437 if ((header->length > skb_tailroom(pskb)) ||
438 (header->length > len)) {
439#ifndef DEBUG
440 if (!(ch->logflags & LOG_FLAG_OVERRUN)) {
441#endif
442 ctc_pr_warn(
443 "%s Illegal packet size %d "
444 "(beyond the end of received data), "
445 "dropping\n", dev->name, header->length);
446 ch->logflags |= LOG_FLAG_OVERRUN;
447#ifndef DEBUG
448 }
449#endif
450#ifdef DEBUG
451 ctc_dump_skb(pskb, -6);
452#endif
453 privptr->stats.rx_dropped++;
454 privptr->stats.rx_length_errors++;
455 return;
456 }
457 skb_put(pskb, header->length);
458 pskb->mac.raw = pskb->data;
459 len -= header->length;
460 skb = dev_alloc_skb(pskb->len);
461 if (!skb) {
462#ifndef DEBUG
463 if (!(ch->logflags & LOG_FLAG_NOMEM)) {
464#endif
465 ctc_pr_warn(
466 "%s Out of memory in ctc_unpack_skb\n",
467 dev->name);
468 ch->logflags |= LOG_FLAG_NOMEM;
469#ifndef DEBUG
470 }
471#endif
472 privptr->stats.rx_dropped++;
473 return;
474 }
475 memcpy(skb_put(skb, pskb->len), pskb->data, pskb->len);
476 skb->mac.raw = skb->data;
477 skb->dev = pskb->dev;
478 skb->protocol = pskb->protocol;
479 pskb->ip_summed = CHECKSUM_UNNECESSARY;
Frank Pavlic56347a22006-04-13 20:19:12 +0200480 netif_rx_ni(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700481 /**
482 * Successful rx; reset logflags
483 */
484 ch->logflags = 0;
485 dev->last_rx = jiffies;
486 privptr->stats.rx_packets++;
487 privptr->stats.rx_bytes += skb->len;
488 if (len > 0) {
489 skb_pull(pskb, header->length);
490 if (skb_tailroom(pskb) < LL_HEADER_LENGTH) {
491#ifndef DEBUG
492 if (!(ch->logflags & LOG_FLAG_OVERRUN)) {
493#endif
494 ctc_pr_warn(
495 "%s Overrun in ctc_unpack_skb\n",
496 dev->name);
497 ch->logflags |= LOG_FLAG_OVERRUN;
498#ifndef DEBUG
499 }
500#endif
501 return;
502 }
503 skb_put(pskb, LL_HEADER_LENGTH);
504 }
505 }
506}
507
508/**
509 * Check return code of a preceeding ccw_device call, halt_IO etc...
510 *
511 * @param ch The channel, the error belongs to.
512 * @param return_code The error code to inspect.
513 */
Heiko Carstens4d284ca2007-02-05 21:18:53 +0100514static void
Linus Torvalds1da177e2005-04-16 15:20:36 -0700515ccw_check_return_code(struct channel *ch, int return_code, char *msg)
516{
517 DBF_TEXT(trace, 5, __FUNCTION__);
518 switch (return_code) {
519 case 0:
520 fsm_event(ch->fsm, CH_EVENT_IO_SUCCESS, ch);
521 break;
522 case -EBUSY:
523 ctc_pr_warn("%s (%s): Busy !\n", ch->id, msg);
524 fsm_event(ch->fsm, CH_EVENT_IO_EBUSY, ch);
525 break;
526 case -ENODEV:
527 ctc_pr_emerg("%s (%s): Invalid device called for IO\n",
528 ch->id, msg);
529 fsm_event(ch->fsm, CH_EVENT_IO_ENODEV, ch);
530 break;
531 case -EIO:
532 ctc_pr_emerg("%s (%s): Status pending... \n",
533 ch->id, msg);
534 fsm_event(ch->fsm, CH_EVENT_IO_EIO, ch);
535 break;
536 default:
537 ctc_pr_emerg("%s (%s): Unknown error in do_IO %04x\n",
538 ch->id, msg, return_code);
539 fsm_event(ch->fsm, CH_EVENT_IO_UNKNOWN, ch);
540 }
541}
542
543/**
544 * Check sense of a unit check.
545 *
546 * @param ch The channel, the sense code belongs to.
547 * @param sense The sense code to inspect.
548 */
Heiko Carstens4d284ca2007-02-05 21:18:53 +0100549static void
Linus Torvalds1da177e2005-04-16 15:20:36 -0700550ccw_unit_check(struct channel *ch, unsigned char sense)
551{
552 DBF_TEXT(trace, 5, __FUNCTION__);
553 if (sense & SNS0_INTERVENTION_REQ) {
554 if (sense & 0x01) {
Frank Pavlic56347a22006-04-13 20:19:12 +0200555 ctc_pr_debug("%s: Interface disc. or Sel. reset "
Linus Torvalds1da177e2005-04-16 15:20:36 -0700556 "(remote)\n", ch->id);
557 fsm_event(ch->fsm, CH_EVENT_UC_RCRESET, ch);
558 } else {
559 ctc_pr_debug("%s: System reset (remote)\n", ch->id);
560 fsm_event(ch->fsm, CH_EVENT_UC_RSRESET, ch);
561 }
562 } else if (sense & SNS0_EQUIPMENT_CHECK) {
563 if (sense & SNS0_BUS_OUT_CHECK) {
564 ctc_pr_warn("%s: Hardware malfunction (remote)\n",
565 ch->id);
566 fsm_event(ch->fsm, CH_EVENT_UC_HWFAIL, ch);
567 } else {
568 ctc_pr_warn("%s: Read-data parity error (remote)\n",
569 ch->id);
570 fsm_event(ch->fsm, CH_EVENT_UC_RXPARITY, ch);
571 }
572 } else if (sense & SNS0_BUS_OUT_CHECK) {
573 if (sense & 0x04) {
574 ctc_pr_warn("%s: Data-streaming timeout)\n", ch->id);
575 fsm_event(ch->fsm, CH_EVENT_UC_TXTIMEOUT, ch);
576 } else {
577 ctc_pr_warn("%s: Data-transfer parity error\n", ch->id);
578 fsm_event(ch->fsm, CH_EVENT_UC_TXPARITY, ch);
579 }
580 } else if (sense & SNS0_CMD_REJECT) {
581 ctc_pr_warn("%s: Command reject\n", ch->id);
582 } else if (sense == 0) {
583 ctc_pr_debug("%s: Unit check ZERO\n", ch->id);
584 fsm_event(ch->fsm, CH_EVENT_UC_ZERO, ch);
585 } else {
586 ctc_pr_warn("%s: Unit Check with sense code: %02x\n",
587 ch->id, sense);
588 fsm_event(ch->fsm, CH_EVENT_UC_UNKNOWN, ch);
589 }
590}
591
592static void
593ctc_purge_skb_queue(struct sk_buff_head *q)
594{
595 struct sk_buff *skb;
596
597 DBF_TEXT(trace, 5, __FUNCTION__);
598
599 while ((skb = skb_dequeue(q))) {
600 atomic_dec(&skb->users);
601 dev_kfree_skb_irq(skb);
602 }
603}
604
Heiko Carstens4d284ca2007-02-05 21:18:53 +0100605static int
Linus Torvalds1da177e2005-04-16 15:20:36 -0700606ctc_checkalloc_buffer(struct channel *ch, int warn)
607{
608 DBF_TEXT(trace, 5, __FUNCTION__);
609 if ((ch->trans_skb == NULL) ||
610 (ch->flags & CHANNEL_FLAGS_BUFSIZE_CHANGED)) {
611 if (ch->trans_skb != NULL)
612 dev_kfree_skb(ch->trans_skb);
613 clear_normalized_cda(&ch->ccw[1]);
614 ch->trans_skb = __dev_alloc_skb(ch->max_bufsize,
615 GFP_ATOMIC | GFP_DMA);
616 if (ch->trans_skb == NULL) {
617 if (warn)
618 ctc_pr_warn(
619 "%s: Couldn't alloc %s trans_skb\n",
620 ch->id,
621 (CHANNEL_DIRECTION(ch->flags) == READ) ?
622 "RX" : "TX");
623 return -ENOMEM;
624 }
625 ch->ccw[1].count = ch->max_bufsize;
626 if (set_normalized_cda(&ch->ccw[1], ch->trans_skb->data)) {
627 dev_kfree_skb(ch->trans_skb);
628 ch->trans_skb = NULL;
629 if (warn)
630 ctc_pr_warn(
631 "%s: set_normalized_cda for %s "
632 "trans_skb failed, dropping packets\n",
633 ch->id,
634 (CHANNEL_DIRECTION(ch->flags) == READ) ?
635 "RX" : "TX");
636 return -ENOMEM;
637 }
638 ch->ccw[1].count = 0;
639 ch->trans_skb_data = ch->trans_skb->data;
640 ch->flags &= ~CHANNEL_FLAGS_BUFSIZE_CHANGED;
641 }
642 return 0;
643}
644
645/**
646 * Dummy NOP action for statemachines
647 */
648static void
649fsm_action_nop(fsm_instance * fi, int event, void *arg)
650{
651}
Frank Pavlice172577d2005-09-08 09:50:06 +0200652
Linus Torvalds1da177e2005-04-16 15:20:36 -0700653/**
654 * Actions for channel - statemachines.
655 *****************************************************************************/
656
657/**
658 * Normal data has been send. Free the corresponding
659 * skb (it's in io_queue), reset dev->tbusy and
660 * revert to idle state.
661 *
662 * @param fi An instance of a channel statemachine.
663 * @param event The event, just happened.
664 * @param arg Generic pointer, casted from channel * upon call.
665 */
666static void
667ch_action_txdone(fsm_instance * fi, int event, void *arg)
668{
669 struct channel *ch = (struct channel *) arg;
670 struct net_device *dev = ch->netdev;
671 struct ctc_priv *privptr = dev->priv;
672 struct sk_buff *skb;
673 int first = 1;
674 int i;
675 unsigned long duration;
676 struct timespec done_stamp = xtime;
677
678 DBF_TEXT(trace, 4, __FUNCTION__);
679
680 duration =
681 (done_stamp.tv_sec - ch->prof.send_stamp.tv_sec) * 1000000 +
682 (done_stamp.tv_nsec - ch->prof.send_stamp.tv_nsec) / 1000;
683 if (duration > ch->prof.tx_time)
684 ch->prof.tx_time = duration;
685
686 if (ch->irb->scsw.count != 0)
687 ctc_pr_debug("%s: TX not complete, remaining %d bytes\n",
688 dev->name, ch->irb->scsw.count);
689 fsm_deltimer(&ch->timer);
690 while ((skb = skb_dequeue(&ch->io_queue))) {
691 privptr->stats.tx_packets++;
692 privptr->stats.tx_bytes += skb->len - LL_HEADER_LENGTH;
693 if (first) {
694 privptr->stats.tx_bytes += 2;
695 first = 0;
696 }
697 atomic_dec(&skb->users);
698 dev_kfree_skb_irq(skb);
699 }
700 spin_lock(&ch->collect_lock);
701 clear_normalized_cda(&ch->ccw[4]);
702 if (ch->collect_len > 0) {
703 int rc;
704
705 if (ctc_checkalloc_buffer(ch, 1)) {
706 spin_unlock(&ch->collect_lock);
707 return;
708 }
709 ch->trans_skb->tail = ch->trans_skb->data = ch->trans_skb_data;
710 ch->trans_skb->len = 0;
711 if (ch->prof.maxmulti < (ch->collect_len + 2))
712 ch->prof.maxmulti = ch->collect_len + 2;
713 if (ch->prof.maxcqueue < skb_queue_len(&ch->collect_queue))
714 ch->prof.maxcqueue = skb_queue_len(&ch->collect_queue);
715 *((__u16 *) skb_put(ch->trans_skb, 2)) = ch->collect_len + 2;
716 i = 0;
717 while ((skb = skb_dequeue(&ch->collect_queue))) {
718 memcpy(skb_put(ch->trans_skb, skb->len), skb->data,
719 skb->len);
720 privptr->stats.tx_packets++;
721 privptr->stats.tx_bytes += skb->len - LL_HEADER_LENGTH;
722 atomic_dec(&skb->users);
723 dev_kfree_skb_irq(skb);
724 i++;
725 }
726 ch->collect_len = 0;
727 spin_unlock(&ch->collect_lock);
728 ch->ccw[1].count = ch->trans_skb->len;
729 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
730 ch->prof.send_stamp = xtime;
731 rc = ccw_device_start(ch->cdev, &ch->ccw[0],
732 (unsigned long) ch, 0xff, 0);
733 ch->prof.doios_multi++;
734 if (rc != 0) {
735 privptr->stats.tx_dropped += i;
736 privptr->stats.tx_errors += i;
737 fsm_deltimer(&ch->timer);
738 ccw_check_return_code(ch, rc, "chained TX");
739 }
740 } else {
741 spin_unlock(&ch->collect_lock);
742 fsm_newstate(fi, CH_STATE_TXIDLE);
743 }
744 ctc_clear_busy(dev);
745}
746
747/**
748 * Initial data is sent.
749 * Notify device statemachine that we are up and
750 * running.
751 *
752 * @param fi An instance of a channel statemachine.
753 * @param event The event, just happened.
754 * @param arg Generic pointer, casted from channel * upon call.
755 */
756static void
757ch_action_txidle(fsm_instance * fi, int event, void *arg)
758{
759 struct channel *ch = (struct channel *) arg;
760
761 DBF_TEXT(trace, 4, __FUNCTION__);
762 fsm_deltimer(&ch->timer);
763 fsm_newstate(fi, CH_STATE_TXIDLE);
764 fsm_event(((struct ctc_priv *) ch->netdev->priv)->fsm, DEV_EVENT_TXUP,
765 ch->netdev);
766}
767
768/**
769 * Got normal data, check for sanity, queue it up, allocate new buffer
770 * trigger bottom half, and initiate next read.
771 *
772 * @param fi An instance of a channel statemachine.
773 * @param event The event, just happened.
774 * @param arg Generic pointer, casted from channel * upon call.
775 */
776static void
777ch_action_rx(fsm_instance * fi, int event, void *arg)
778{
779 struct channel *ch = (struct channel *) arg;
780 struct net_device *dev = ch->netdev;
781 struct ctc_priv *privptr = dev->priv;
782 int len = ch->max_bufsize - ch->irb->scsw.count;
783 struct sk_buff *skb = ch->trans_skb;
784 __u16 block_len = *((__u16 *) skb->data);
785 int check_len;
786 int rc;
787
788 DBF_TEXT(trace, 4, __FUNCTION__);
789 fsm_deltimer(&ch->timer);
790 if (len < 8) {
791 ctc_pr_debug("%s: got packet with length %d < 8\n",
792 dev->name, len);
793 privptr->stats.rx_dropped++;
794 privptr->stats.rx_length_errors++;
795 goto again;
796 }
797 if (len > ch->max_bufsize) {
798 ctc_pr_debug("%s: got packet with length %d > %d\n",
799 dev->name, len, ch->max_bufsize);
800 privptr->stats.rx_dropped++;
801 privptr->stats.rx_length_errors++;
802 goto again;
803 }
804
805 /**
806 * VM TCP seems to have a bug sending 2 trailing bytes of garbage.
807 */
808 switch (ch->protocol) {
809 case CTC_PROTO_S390:
810 case CTC_PROTO_OS390:
811 check_len = block_len + 2;
812 break;
813 default:
814 check_len = block_len;
815 break;
816 }
817 if ((len < block_len) || (len > check_len)) {
818 ctc_pr_debug("%s: got block length %d != rx length %d\n",
819 dev->name, block_len, len);
820#ifdef DEBUG
821 ctc_dump_skb(skb, 0);
822#endif
823 *((__u16 *) skb->data) = len;
824 privptr->stats.rx_dropped++;
825 privptr->stats.rx_length_errors++;
826 goto again;
827 }
828 block_len -= 2;
829 if (block_len > 0) {
830 *((__u16 *) skb->data) = block_len;
831 ctc_unpack_skb(ch, skb);
832 }
833 again:
834 skb->data = skb->tail = ch->trans_skb_data;
835 skb->len = 0;
836 if (ctc_checkalloc_buffer(ch, 1))
837 return;
838 ch->ccw[1].count = ch->max_bufsize;
839 rc = ccw_device_start(ch->cdev, &ch->ccw[0], (unsigned long) ch, 0xff, 0);
840 if (rc != 0)
841 ccw_check_return_code(ch, rc, "normal RX");
842}
843
844static void ch_action_rxidle(fsm_instance * fi, int event, void *arg);
845
846/**
847 * Initialize connection by sending a __u16 of value 0.
848 *
849 * @param fi An instance of a channel statemachine.
850 * @param event The event, just happened.
851 * @param arg Generic pointer, casted from channel * upon call.
852 */
853static void
854ch_action_firstio(fsm_instance * fi, int event, void *arg)
855{
856 struct channel *ch = (struct channel *) arg;
857 int rc;
858
859 DBF_TEXT(trace, 4, __FUNCTION__);
860
861 if (fsm_getstate(fi) == CH_STATE_TXIDLE)
862 ctc_pr_debug("%s: remote side issued READ?, init ...\n", ch->id);
863 fsm_deltimer(&ch->timer);
864 if (ctc_checkalloc_buffer(ch, 1))
865 return;
866 if ((fsm_getstate(fi) == CH_STATE_SETUPWAIT) &&
867 (ch->protocol == CTC_PROTO_OS390)) {
868 /* OS/390 resp. z/OS */
869 if (CHANNEL_DIRECTION(ch->flags) == READ) {
870 *((__u16 *) ch->trans_skb->data) = CTC_INITIAL_BLOCKLEN;
871 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC,
872 CH_EVENT_TIMER, ch);
873 ch_action_rxidle(fi, event, arg);
874 } else {
875 struct net_device *dev = ch->netdev;
876 fsm_newstate(fi, CH_STATE_TXIDLE);
877 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
878 DEV_EVENT_TXUP, dev);
879 }
880 return;
881 }
882
883 /**
884 * Don´t setup a timer for receiving the initial RX frame
885 * if in compatibility mode, since VM TCP delays the initial
886 * frame until it has some data to send.
887 */
888 if ((CHANNEL_DIRECTION(ch->flags) == WRITE) ||
889 (ch->protocol != CTC_PROTO_S390))
890 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
891
892 *((__u16 *) ch->trans_skb->data) = CTC_INITIAL_BLOCKLEN;
893 ch->ccw[1].count = 2; /* Transfer only length */
894
895 fsm_newstate(fi, (CHANNEL_DIRECTION(ch->flags) == READ)
896 ? CH_STATE_RXINIT : CH_STATE_TXINIT);
897 rc = ccw_device_start(ch->cdev, &ch->ccw[0], (unsigned long) ch, 0xff, 0);
898 if (rc != 0) {
899 fsm_deltimer(&ch->timer);
900 fsm_newstate(fi, CH_STATE_SETUPWAIT);
901 ccw_check_return_code(ch, rc, "init IO");
902 }
903 /**
904 * If in compatibility mode since we don´t setup a timer, we
905 * also signal RX channel up immediately. This enables us
906 * to send packets early which in turn usually triggers some
907 * reply from VM TCP which brings up the RX channel to it´s
908 * final state.
909 */
910 if ((CHANNEL_DIRECTION(ch->flags) == READ) &&
911 (ch->protocol == CTC_PROTO_S390)) {
912 struct net_device *dev = ch->netdev;
913 fsm_event(((struct ctc_priv *) dev->priv)->fsm, DEV_EVENT_RXUP,
914 dev);
915 }
916}
917
918/**
919 * Got initial data, check it. If OK,
920 * notify device statemachine that we are up and
921 * running.
922 *
923 * @param fi An instance of a channel statemachine.
924 * @param event The event, just happened.
925 * @param arg Generic pointer, casted from channel * upon call.
926 */
927static void
928ch_action_rxidle(fsm_instance * fi, int event, void *arg)
929{
930 struct channel *ch = (struct channel *) arg;
931 struct net_device *dev = ch->netdev;
932 __u16 buflen;
933 int rc;
934
935 DBF_TEXT(trace, 4, __FUNCTION__);
936 fsm_deltimer(&ch->timer);
937 buflen = *((__u16 *) ch->trans_skb->data);
938#ifdef DEBUG
939 ctc_pr_debug("%s: Initial RX count %d\n", dev->name, buflen);
940#endif
941 if (buflen >= CTC_INITIAL_BLOCKLEN) {
942 if (ctc_checkalloc_buffer(ch, 1))
943 return;
944 ch->ccw[1].count = ch->max_bufsize;
945 fsm_newstate(fi, CH_STATE_RXIDLE);
946 rc = ccw_device_start(ch->cdev, &ch->ccw[0],
947 (unsigned long) ch, 0xff, 0);
948 if (rc != 0) {
949 fsm_newstate(fi, CH_STATE_RXINIT);
950 ccw_check_return_code(ch, rc, "initial RX");
951 } else
952 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
953 DEV_EVENT_RXUP, dev);
954 } else {
955 ctc_pr_debug("%s: Initial RX count %d not %d\n",
956 dev->name, buflen, CTC_INITIAL_BLOCKLEN);
957 ch_action_firstio(fi, event, arg);
958 }
959}
960
961/**
962 * Set channel into extended mode.
963 *
964 * @param fi An instance of a channel statemachine.
965 * @param event The event, just happened.
966 * @param arg Generic pointer, casted from channel * upon call.
967 */
968static void
969ch_action_setmode(fsm_instance * fi, int event, void *arg)
970{
971 struct channel *ch = (struct channel *) arg;
972 int rc;
973 unsigned long saveflags;
974
975 DBF_TEXT(trace, 4, __FUNCTION__);
976 fsm_deltimer(&ch->timer);
977 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
978 fsm_newstate(fi, CH_STATE_SETUPWAIT);
979 saveflags = 0; /* avoids compiler warning with
980 spin_unlock_irqrestore */
981 if (event == CH_EVENT_TIMER) // only for timer not yet locked
982 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
983 rc = ccw_device_start(ch->cdev, &ch->ccw[6], (unsigned long) ch, 0xff, 0);
984 if (event == CH_EVENT_TIMER)
985 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
986 if (rc != 0) {
987 fsm_deltimer(&ch->timer);
988 fsm_newstate(fi, CH_STATE_STARTWAIT);
989 ccw_check_return_code(ch, rc, "set Mode");
990 } else
991 ch->retry = 0;
992}
993
994/**
995 * Setup channel.
996 *
997 * @param fi An instance of a channel statemachine.
998 * @param event The event, just happened.
999 * @param arg Generic pointer, casted from channel * upon call.
1000 */
1001static void
1002ch_action_start(fsm_instance * fi, int event, void *arg)
1003{
1004 struct channel *ch = (struct channel *) arg;
1005 unsigned long saveflags;
1006 int rc;
1007 struct net_device *dev;
1008
1009 DBF_TEXT(trace, 4, __FUNCTION__);
1010 if (ch == NULL) {
1011 ctc_pr_warn("ch_action_start ch=NULL\n");
1012 return;
1013 }
1014 if (ch->netdev == NULL) {
1015 ctc_pr_warn("ch_action_start dev=NULL, id=%s\n", ch->id);
1016 return;
1017 }
1018 dev = ch->netdev;
1019
1020#ifdef DEBUG
1021 ctc_pr_debug("%s: %s channel start\n", dev->name,
1022 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX");
1023#endif
1024
1025 if (ch->trans_skb != NULL) {
1026 clear_normalized_cda(&ch->ccw[1]);
1027 dev_kfree_skb(ch->trans_skb);
1028 ch->trans_skb = NULL;
1029 }
1030 if (CHANNEL_DIRECTION(ch->flags) == READ) {
1031 ch->ccw[1].cmd_code = CCW_CMD_READ;
1032 ch->ccw[1].flags = CCW_FLAG_SLI;
1033 ch->ccw[1].count = 0;
1034 } else {
1035 ch->ccw[1].cmd_code = CCW_CMD_WRITE;
1036 ch->ccw[1].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
1037 ch->ccw[1].count = 0;
1038 }
1039 if (ctc_checkalloc_buffer(ch, 0)) {
1040 ctc_pr_notice(
1041 "%s: Could not allocate %s trans_skb, delaying "
1042 "allocation until first transfer\n",
1043 dev->name,
1044 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX");
1045 }
1046
1047 ch->ccw[0].cmd_code = CCW_CMD_PREPARE;
1048 ch->ccw[0].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
1049 ch->ccw[0].count = 0;
1050 ch->ccw[0].cda = 0;
1051 ch->ccw[2].cmd_code = CCW_CMD_NOOP; /* jointed CE + DE */
1052 ch->ccw[2].flags = CCW_FLAG_SLI;
1053 ch->ccw[2].count = 0;
1054 ch->ccw[2].cda = 0;
1055 memcpy(&ch->ccw[3], &ch->ccw[0], sizeof (struct ccw1) * 3);
1056 ch->ccw[4].cda = 0;
1057 ch->ccw[4].flags &= ~CCW_FLAG_IDA;
1058
1059 fsm_newstate(fi, CH_STATE_STARTWAIT);
1060 fsm_addtimer(&ch->timer, 1000, CH_EVENT_TIMER, ch);
1061 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
1062 rc = ccw_device_halt(ch->cdev, (unsigned long) ch);
1063 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
1064 if (rc != 0) {
1065 if (rc != -EBUSY)
1066 fsm_deltimer(&ch->timer);
1067 ccw_check_return_code(ch, rc, "initial HaltIO");
1068 }
1069#ifdef DEBUG
1070 ctc_pr_debug("ctc: %s(): leaving\n", __func__);
1071#endif
1072}
1073
1074/**
1075 * Shutdown a channel.
1076 *
1077 * @param fi An instance of a channel statemachine.
1078 * @param event The event, just happened.
1079 * @param arg Generic pointer, casted from channel * upon call.
1080 */
1081static void
1082ch_action_haltio(fsm_instance * fi, int event, void *arg)
1083{
1084 struct channel *ch = (struct channel *) arg;
1085 unsigned long saveflags;
1086 int rc;
1087 int oldstate;
1088
1089 DBF_TEXT(trace, 3, __FUNCTION__);
1090 fsm_deltimer(&ch->timer);
1091 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
1092 saveflags = 0; /* avoids comp warning with
1093 spin_unlock_irqrestore */
1094 if (event == CH_EVENT_STOP) // only for STOP not yet locked
1095 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
1096 oldstate = fsm_getstate(fi);
1097 fsm_newstate(fi, CH_STATE_TERM);
1098 rc = ccw_device_halt(ch->cdev, (unsigned long) ch);
1099 if (event == CH_EVENT_STOP)
1100 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
1101 if (rc != 0) {
1102 if (rc != -EBUSY) {
1103 fsm_deltimer(&ch->timer);
1104 fsm_newstate(fi, oldstate);
1105 }
1106 ccw_check_return_code(ch, rc, "HaltIO in ch_action_haltio");
1107 }
1108}
1109
1110/**
1111 * A channel has successfully been halted.
1112 * Cleanup it's queue and notify interface statemachine.
1113 *
1114 * @param fi An instance of a channel statemachine.
1115 * @param event The event, just happened.
1116 * @param arg Generic pointer, casted from channel * upon call.
1117 */
1118static void
1119ch_action_stopped(fsm_instance * fi, int event, void *arg)
1120{
1121 struct channel *ch = (struct channel *) arg;
1122 struct net_device *dev = ch->netdev;
1123
1124 DBF_TEXT(trace, 3, __FUNCTION__);
1125 fsm_deltimer(&ch->timer);
1126 fsm_newstate(fi, CH_STATE_STOPPED);
1127 if (ch->trans_skb != NULL) {
1128 clear_normalized_cda(&ch->ccw[1]);
1129 dev_kfree_skb(ch->trans_skb);
1130 ch->trans_skb = NULL;
1131 }
1132 if (CHANNEL_DIRECTION(ch->flags) == READ) {
1133 skb_queue_purge(&ch->io_queue);
1134 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1135 DEV_EVENT_RXDOWN, dev);
1136 } else {
1137 ctc_purge_skb_queue(&ch->io_queue);
1138 spin_lock(&ch->collect_lock);
1139 ctc_purge_skb_queue(&ch->collect_queue);
1140 ch->collect_len = 0;
1141 spin_unlock(&ch->collect_lock);
1142 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1143 DEV_EVENT_TXDOWN, dev);
1144 }
1145}
1146
1147/**
1148 * A stop command from device statemachine arrived and we are in
1149 * not operational mode. Set state to stopped.
1150 *
1151 * @param fi An instance of a channel statemachine.
1152 * @param event The event, just happened.
1153 * @param arg Generic pointer, casted from channel * upon call.
1154 */
1155static void
1156ch_action_stop(fsm_instance * fi, int event, void *arg)
1157{
1158 fsm_newstate(fi, CH_STATE_STOPPED);
1159}
1160
1161/**
1162 * A machine check for no path, not operational status or gone device has
1163 * happened.
1164 * Cleanup queue and notify interface statemachine.
1165 *
1166 * @param fi An instance of a channel statemachine.
1167 * @param event The event, just happened.
1168 * @param arg Generic pointer, casted from channel * upon call.
1169 */
1170static void
1171ch_action_fail(fsm_instance * fi, int event, void *arg)
1172{
1173 struct channel *ch = (struct channel *) arg;
1174 struct net_device *dev = ch->netdev;
1175
1176 DBF_TEXT(trace, 3, __FUNCTION__);
1177 fsm_deltimer(&ch->timer);
1178 fsm_newstate(fi, CH_STATE_NOTOP);
1179 if (CHANNEL_DIRECTION(ch->flags) == READ) {
1180 skb_queue_purge(&ch->io_queue);
1181 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1182 DEV_EVENT_RXDOWN, dev);
1183 } else {
1184 ctc_purge_skb_queue(&ch->io_queue);
1185 spin_lock(&ch->collect_lock);
1186 ctc_purge_skb_queue(&ch->collect_queue);
1187 ch->collect_len = 0;
1188 spin_unlock(&ch->collect_lock);
1189 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1190 DEV_EVENT_TXDOWN, dev);
1191 }
1192}
1193
1194/**
1195 * Handle error during setup of channel.
1196 *
1197 * @param fi An instance of a channel statemachine.
1198 * @param event The event, just happened.
1199 * @param arg Generic pointer, casted from channel * upon call.
1200 */
1201static void
1202ch_action_setuperr(fsm_instance * fi, int event, void *arg)
1203{
1204 struct channel *ch = (struct channel *) arg;
1205 struct net_device *dev = ch->netdev;
1206
1207 DBF_TEXT(setup, 3, __FUNCTION__);
1208 /**
1209 * Special case: Got UC_RCRESET on setmode.
1210 * This means that remote side isn't setup. In this case
1211 * simply retry after some 10 secs...
1212 */
1213 if ((fsm_getstate(fi) == CH_STATE_SETUPWAIT) &&
1214 ((event == CH_EVENT_UC_RCRESET) ||
1215 (event == CH_EVENT_UC_RSRESET))) {
1216 fsm_newstate(fi, CH_STATE_STARTRETRY);
1217 fsm_deltimer(&ch->timer);
1218 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
1219 if (CHANNEL_DIRECTION(ch->flags) == READ) {
1220 int rc = ccw_device_halt(ch->cdev, (unsigned long) ch);
1221 if (rc != 0)
1222 ccw_check_return_code(
1223 ch, rc, "HaltIO in ch_action_setuperr");
1224 }
1225 return;
1226 }
1227
1228 ctc_pr_debug("%s: Error %s during %s channel setup state=%s\n",
1229 dev->name, ch_event_names[event],
1230 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX",
1231 fsm_getstate_str(fi));
1232 if (CHANNEL_DIRECTION(ch->flags) == READ) {
1233 fsm_newstate(fi, CH_STATE_RXERR);
1234 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1235 DEV_EVENT_RXDOWN, dev);
1236 } else {
1237 fsm_newstate(fi, CH_STATE_TXERR);
1238 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1239 DEV_EVENT_TXDOWN, dev);
1240 }
1241}
1242
1243/**
1244 * Restart a channel after an error.
1245 *
1246 * @param fi An instance of a channel statemachine.
1247 * @param event The event, just happened.
1248 * @param arg Generic pointer, casted from channel * upon call.
1249 */
1250static void
1251ch_action_restart(fsm_instance * fi, int event, void *arg)
1252{
1253 unsigned long saveflags;
1254 int oldstate;
1255 int rc;
1256
1257 struct channel *ch = (struct channel *) arg;
1258 struct net_device *dev = ch->netdev;
1259
1260 DBF_TEXT(trace, 3, __FUNCTION__);
1261 fsm_deltimer(&ch->timer);
1262 ctc_pr_debug("%s: %s channel restart\n", dev->name,
1263 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX");
1264 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
1265 oldstate = fsm_getstate(fi);
1266 fsm_newstate(fi, CH_STATE_STARTWAIT);
1267 saveflags = 0; /* avoids compiler warning with
1268 spin_unlock_irqrestore */
1269 if (event == CH_EVENT_TIMER) // only for timer not yet locked
1270 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
1271 rc = ccw_device_halt(ch->cdev, (unsigned long) ch);
1272 if (event == CH_EVENT_TIMER)
1273 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
1274 if (rc != 0) {
1275 if (rc != -EBUSY) {
1276 fsm_deltimer(&ch->timer);
1277 fsm_newstate(fi, oldstate);
1278 }
1279 ccw_check_return_code(ch, rc, "HaltIO in ch_action_restart");
1280 }
1281}
1282
1283/**
1284 * Handle error during RX initial handshake (exchange of
1285 * 0-length block header)
1286 *
1287 * @param fi An instance of a channel statemachine.
1288 * @param event The event, just happened.
1289 * @param arg Generic pointer, casted from channel * upon call.
1290 */
1291static void
1292ch_action_rxiniterr(fsm_instance * fi, int event, void *arg)
1293{
1294 struct channel *ch = (struct channel *) arg;
1295 struct net_device *dev = ch->netdev;
1296
1297 DBF_TEXT(setup, 3, __FUNCTION__);
1298 if (event == CH_EVENT_TIMER) {
1299 fsm_deltimer(&ch->timer);
1300 ctc_pr_debug("%s: Timeout during RX init handshake\n", dev->name);
1301 if (ch->retry++ < 3)
1302 ch_action_restart(fi, event, arg);
1303 else {
1304 fsm_newstate(fi, CH_STATE_RXERR);
1305 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1306 DEV_EVENT_RXDOWN, dev);
1307 }
1308 } else
1309 ctc_pr_warn("%s: Error during RX init handshake\n", dev->name);
1310}
1311
1312/**
1313 * Notify device statemachine if we gave up initialization
1314 * of RX channel.
1315 *
1316 * @param fi An instance of a channel statemachine.
1317 * @param event The event, just happened.
1318 * @param arg Generic pointer, casted from channel * upon call.
1319 */
1320static void
1321ch_action_rxinitfail(fsm_instance * fi, int event, void *arg)
1322{
1323 struct channel *ch = (struct channel *) arg;
1324 struct net_device *dev = ch->netdev;
1325
1326 DBF_TEXT(setup, 3, __FUNCTION__);
1327 fsm_newstate(fi, CH_STATE_RXERR);
1328 ctc_pr_warn("%s: RX initialization failed\n", dev->name);
1329 ctc_pr_warn("%s: RX <-> RX connection detected\n", dev->name);
1330 fsm_event(((struct ctc_priv *) dev->priv)->fsm, DEV_EVENT_RXDOWN, dev);
1331}
1332
1333/**
1334 * Handle RX Unit check remote reset (remote disconnected)
1335 *
1336 * @param fi An instance of a channel statemachine.
1337 * @param event The event, just happened.
1338 * @param arg Generic pointer, casted from channel * upon call.
1339 */
1340static void
1341ch_action_rxdisc(fsm_instance * fi, int event, void *arg)
1342{
1343 struct channel *ch = (struct channel *) arg;
1344 struct channel *ch2;
1345 struct net_device *dev = ch->netdev;
1346
1347 DBF_TEXT(trace, 3, __FUNCTION__);
1348 fsm_deltimer(&ch->timer);
1349 ctc_pr_debug("%s: Got remote disconnect, re-initializing ...\n",
1350 dev->name);
1351
1352 /**
1353 * Notify device statemachine
1354 */
1355 fsm_event(((struct ctc_priv *) dev->priv)->fsm, DEV_EVENT_RXDOWN, dev);
1356 fsm_event(((struct ctc_priv *) dev->priv)->fsm, DEV_EVENT_TXDOWN, dev);
1357
1358 fsm_newstate(fi, CH_STATE_DTERM);
1359 ch2 = ((struct ctc_priv *) dev->priv)->channel[WRITE];
1360 fsm_newstate(ch2->fsm, CH_STATE_DTERM);
1361
1362 ccw_device_halt(ch->cdev, (unsigned long) ch);
1363 ccw_device_halt(ch2->cdev, (unsigned long) ch2);
1364}
1365
1366/**
1367 * Handle error during TX channel initialization.
1368 *
1369 * @param fi An instance of a channel statemachine.
1370 * @param event The event, just happened.
1371 * @param arg Generic pointer, casted from channel * upon call.
1372 */
1373static void
1374ch_action_txiniterr(fsm_instance * fi, int event, void *arg)
1375{
1376 struct channel *ch = (struct channel *) arg;
1377 struct net_device *dev = ch->netdev;
1378
1379 DBF_TEXT(setup, 2, __FUNCTION__);
1380 if (event == CH_EVENT_TIMER) {
1381 fsm_deltimer(&ch->timer);
1382 ctc_pr_debug("%s: Timeout during TX init handshake\n", dev->name);
1383 if (ch->retry++ < 3)
1384 ch_action_restart(fi, event, arg);
1385 else {
1386 fsm_newstate(fi, CH_STATE_TXERR);
1387 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1388 DEV_EVENT_TXDOWN, dev);
1389 }
1390 } else
1391 ctc_pr_warn("%s: Error during TX init handshake\n", dev->name);
1392}
1393
1394/**
1395 * Handle TX timeout by retrying operation.
1396 *
1397 * @param fi An instance of a channel statemachine.
1398 * @param event The event, just happened.
1399 * @param arg Generic pointer, casted from channel * upon call.
1400 */
1401static void
1402ch_action_txretry(fsm_instance * fi, int event, void *arg)
1403{
1404 struct channel *ch = (struct channel *) arg;
1405 struct net_device *dev = ch->netdev;
1406 unsigned long saveflags;
1407
1408 DBF_TEXT(trace, 4, __FUNCTION__);
1409 fsm_deltimer(&ch->timer);
1410 if (ch->retry++ > 3) {
1411 ctc_pr_debug("%s: TX retry failed, restarting channel\n",
1412 dev->name);
1413 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1414 DEV_EVENT_TXDOWN, dev);
1415 ch_action_restart(fi, event, arg);
1416 } else {
1417 struct sk_buff *skb;
1418
1419 ctc_pr_debug("%s: TX retry %d\n", dev->name, ch->retry);
1420 if ((skb = skb_peek(&ch->io_queue))) {
1421 int rc = 0;
1422
1423 clear_normalized_cda(&ch->ccw[4]);
1424 ch->ccw[4].count = skb->len;
1425 if (set_normalized_cda(&ch->ccw[4], skb->data)) {
1426 ctc_pr_debug(
1427 "%s: IDAL alloc failed, chan restart\n",
1428 dev->name);
1429 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1430 DEV_EVENT_TXDOWN, dev);
1431 ch_action_restart(fi, event, arg);
1432 return;
1433 }
1434 fsm_addtimer(&ch->timer, 1000, CH_EVENT_TIMER, ch);
1435 saveflags = 0; /* avoids compiler warning with
1436 spin_unlock_irqrestore */
1437 if (event == CH_EVENT_TIMER) // only for TIMER not yet locked
1438 spin_lock_irqsave(get_ccwdev_lock(ch->cdev),
1439 saveflags);
1440 rc = ccw_device_start(ch->cdev, &ch->ccw[3],
1441 (unsigned long) ch, 0xff, 0);
1442 if (event == CH_EVENT_TIMER)
1443 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev),
1444 saveflags);
1445 if (rc != 0) {
1446 fsm_deltimer(&ch->timer);
1447 ccw_check_return_code(ch, rc, "TX in ch_action_txretry");
1448 ctc_purge_skb_queue(&ch->io_queue);
1449 }
1450 }
1451 }
1452
1453}
1454
1455/**
1456 * Handle fatal errors during an I/O command.
1457 *
1458 * @param fi An instance of a channel statemachine.
1459 * @param event The event, just happened.
1460 * @param arg Generic pointer, casted from channel * upon call.
1461 */
1462static void
1463ch_action_iofatal(fsm_instance * fi, int event, void *arg)
1464{
1465 struct channel *ch = (struct channel *) arg;
1466 struct net_device *dev = ch->netdev;
1467
1468 DBF_TEXT(trace, 3, __FUNCTION__);
1469 fsm_deltimer(&ch->timer);
1470 if (CHANNEL_DIRECTION(ch->flags) == READ) {
1471 ctc_pr_debug("%s: RX I/O error\n", dev->name);
1472 fsm_newstate(fi, CH_STATE_RXERR);
1473 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1474 DEV_EVENT_RXDOWN, dev);
1475 } else {
1476 ctc_pr_debug("%s: TX I/O error\n", dev->name);
1477 fsm_newstate(fi, CH_STATE_TXERR);
1478 fsm_event(((struct ctc_priv *) dev->priv)->fsm,
1479 DEV_EVENT_TXDOWN, dev);
1480 }
1481}
1482
Jeff Garzike82b0f22006-05-26 21:58:38 -04001483static void
Linus Torvalds1da177e2005-04-16 15:20:36 -07001484ch_action_reinit(fsm_instance *fi, int event, void *arg)
1485{
1486 struct channel *ch = (struct channel *)arg;
1487 struct net_device *dev = ch->netdev;
1488 struct ctc_priv *privptr = dev->priv;
Jeff Garzike82b0f22006-05-26 21:58:38 -04001489
Linus Torvalds1da177e2005-04-16 15:20:36 -07001490 DBF_TEXT(trace, 4, __FUNCTION__);
1491 ch_action_iofatal(fi, event, arg);
1492 fsm_addtimer(&privptr->restart_timer, 1000, DEV_EVENT_RESTART, dev);
1493}
1494
Linus Torvalds1da177e2005-04-16 15:20:36 -07001495/**
1496 * The statemachine for a channel.
1497 */
1498static const fsm_node ch_fsm[] = {
1499 {CH_STATE_STOPPED, CH_EVENT_STOP, fsm_action_nop },
1500 {CH_STATE_STOPPED, CH_EVENT_START, ch_action_start },
1501 {CH_STATE_STOPPED, CH_EVENT_FINSTAT, fsm_action_nop },
1502 {CH_STATE_STOPPED, CH_EVENT_MC_FAIL, fsm_action_nop },
1503
1504 {CH_STATE_NOTOP, CH_EVENT_STOP, ch_action_stop },
1505 {CH_STATE_NOTOP, CH_EVENT_START, fsm_action_nop },
1506 {CH_STATE_NOTOP, CH_EVENT_FINSTAT, fsm_action_nop },
1507 {CH_STATE_NOTOP, CH_EVENT_MC_FAIL, fsm_action_nop },
1508 {CH_STATE_NOTOP, CH_EVENT_MC_GOOD, ch_action_start },
1509
1510 {CH_STATE_STARTWAIT, CH_EVENT_STOP, ch_action_haltio },
1511 {CH_STATE_STARTWAIT, CH_EVENT_START, fsm_action_nop },
1512 {CH_STATE_STARTWAIT, CH_EVENT_FINSTAT, ch_action_setmode },
1513 {CH_STATE_STARTWAIT, CH_EVENT_TIMER, ch_action_setuperr },
1514 {CH_STATE_STARTWAIT, CH_EVENT_IO_ENODEV, ch_action_iofatal },
1515 {CH_STATE_STARTWAIT, CH_EVENT_IO_EIO, ch_action_reinit },
1516 {CH_STATE_STARTWAIT, CH_EVENT_MC_FAIL, ch_action_fail },
1517
1518 {CH_STATE_STARTRETRY, CH_EVENT_STOP, ch_action_haltio },
1519 {CH_STATE_STARTRETRY, CH_EVENT_TIMER, ch_action_setmode },
1520 {CH_STATE_STARTRETRY, CH_EVENT_FINSTAT, fsm_action_nop },
1521 {CH_STATE_STARTRETRY, CH_EVENT_MC_FAIL, ch_action_fail },
1522
1523 {CH_STATE_SETUPWAIT, CH_EVENT_STOP, ch_action_haltio },
1524 {CH_STATE_SETUPWAIT, CH_EVENT_START, fsm_action_nop },
1525 {CH_STATE_SETUPWAIT, CH_EVENT_FINSTAT, ch_action_firstio },
1526 {CH_STATE_SETUPWAIT, CH_EVENT_UC_RCRESET, ch_action_setuperr },
1527 {CH_STATE_SETUPWAIT, CH_EVENT_UC_RSRESET, ch_action_setuperr },
1528 {CH_STATE_SETUPWAIT, CH_EVENT_TIMER, ch_action_setmode },
1529 {CH_STATE_SETUPWAIT, CH_EVENT_IO_ENODEV, ch_action_iofatal },
1530 {CH_STATE_SETUPWAIT, CH_EVENT_IO_EIO, ch_action_reinit },
1531 {CH_STATE_SETUPWAIT, CH_EVENT_MC_FAIL, ch_action_fail },
1532
1533 {CH_STATE_RXINIT, CH_EVENT_STOP, ch_action_haltio },
1534 {CH_STATE_RXINIT, CH_EVENT_START, fsm_action_nop },
1535 {CH_STATE_RXINIT, CH_EVENT_FINSTAT, ch_action_rxidle },
1536 {CH_STATE_RXINIT, CH_EVENT_UC_RCRESET, ch_action_rxiniterr },
1537 {CH_STATE_RXINIT, CH_EVENT_UC_RSRESET, ch_action_rxiniterr },
1538 {CH_STATE_RXINIT, CH_EVENT_TIMER, ch_action_rxiniterr },
1539 {CH_STATE_RXINIT, CH_EVENT_ATTNBUSY, ch_action_rxinitfail },
1540 {CH_STATE_RXINIT, CH_EVENT_IO_ENODEV, ch_action_iofatal },
1541 {CH_STATE_RXINIT, CH_EVENT_IO_EIO, ch_action_reinit },
1542 {CH_STATE_RXINIT, CH_EVENT_UC_ZERO, ch_action_firstio },
1543 {CH_STATE_RXINIT, CH_EVENT_MC_FAIL, ch_action_fail },
1544
1545 {CH_STATE_RXIDLE, CH_EVENT_STOP, ch_action_haltio },
1546 {CH_STATE_RXIDLE, CH_EVENT_START, fsm_action_nop },
1547 {CH_STATE_RXIDLE, CH_EVENT_FINSTAT, ch_action_rx },
1548 {CH_STATE_RXIDLE, CH_EVENT_UC_RCRESET, ch_action_rxdisc },
1549// {CH_STATE_RXIDLE, CH_EVENT_UC_RSRESET, ch_action_rxretry },
1550 {CH_STATE_RXIDLE, CH_EVENT_IO_ENODEV, ch_action_iofatal },
1551 {CH_STATE_RXIDLE, CH_EVENT_IO_EIO, ch_action_reinit },
1552 {CH_STATE_RXIDLE, CH_EVENT_MC_FAIL, ch_action_fail },
1553 {CH_STATE_RXIDLE, CH_EVENT_UC_ZERO, ch_action_rx },
1554
1555 {CH_STATE_TXINIT, CH_EVENT_STOP, ch_action_haltio },
1556 {CH_STATE_TXINIT, CH_EVENT_START, fsm_action_nop },
1557 {CH_STATE_TXINIT, CH_EVENT_FINSTAT, ch_action_txidle },
1558 {CH_STATE_TXINIT, CH_EVENT_UC_RCRESET, ch_action_txiniterr },
1559 {CH_STATE_TXINIT, CH_EVENT_UC_RSRESET, ch_action_txiniterr },
1560 {CH_STATE_TXINIT, CH_EVENT_TIMER, ch_action_txiniterr },
1561 {CH_STATE_TXINIT, CH_EVENT_IO_ENODEV, ch_action_iofatal },
1562 {CH_STATE_TXINIT, CH_EVENT_IO_EIO, ch_action_reinit },
1563 {CH_STATE_TXINIT, CH_EVENT_MC_FAIL, ch_action_fail },
1564
1565 {CH_STATE_TXIDLE, CH_EVENT_STOP, ch_action_haltio },
1566 {CH_STATE_TXIDLE, CH_EVENT_START, fsm_action_nop },
1567 {CH_STATE_TXIDLE, CH_EVENT_FINSTAT, ch_action_firstio },
1568 {CH_STATE_TXIDLE, CH_EVENT_UC_RCRESET, fsm_action_nop },
1569 {CH_STATE_TXIDLE, CH_EVENT_UC_RSRESET, fsm_action_nop },
1570 {CH_STATE_TXIDLE, CH_EVENT_IO_ENODEV, ch_action_iofatal },
1571 {CH_STATE_TXIDLE, CH_EVENT_IO_EIO, ch_action_reinit },
1572 {CH_STATE_TXIDLE, CH_EVENT_MC_FAIL, ch_action_fail },
1573
1574 {CH_STATE_TERM, CH_EVENT_STOP, fsm_action_nop },
1575 {CH_STATE_TERM, CH_EVENT_START, ch_action_restart },
1576 {CH_STATE_TERM, CH_EVENT_FINSTAT, ch_action_stopped },
1577 {CH_STATE_TERM, CH_EVENT_UC_RCRESET, fsm_action_nop },
1578 {CH_STATE_TERM, CH_EVENT_UC_RSRESET, fsm_action_nop },
1579 {CH_STATE_TERM, CH_EVENT_MC_FAIL, ch_action_fail },
1580
1581 {CH_STATE_DTERM, CH_EVENT_STOP, ch_action_haltio },
1582 {CH_STATE_DTERM, CH_EVENT_START, ch_action_restart },
1583 {CH_STATE_DTERM, CH_EVENT_FINSTAT, ch_action_setmode },
1584 {CH_STATE_DTERM, CH_EVENT_UC_RCRESET, fsm_action_nop },
1585 {CH_STATE_DTERM, CH_EVENT_UC_RSRESET, fsm_action_nop },
1586 {CH_STATE_DTERM, CH_EVENT_MC_FAIL, ch_action_fail },
1587
1588 {CH_STATE_TX, CH_EVENT_STOP, ch_action_haltio },
1589 {CH_STATE_TX, CH_EVENT_START, fsm_action_nop },
1590 {CH_STATE_TX, CH_EVENT_FINSTAT, ch_action_txdone },
1591 {CH_STATE_TX, CH_EVENT_UC_RCRESET, ch_action_txretry },
1592 {CH_STATE_TX, CH_EVENT_UC_RSRESET, ch_action_txretry },
1593 {CH_STATE_TX, CH_EVENT_TIMER, ch_action_txretry },
1594 {CH_STATE_TX, CH_EVENT_IO_ENODEV, ch_action_iofatal },
1595 {CH_STATE_TX, CH_EVENT_IO_EIO, ch_action_reinit },
1596 {CH_STATE_TX, CH_EVENT_MC_FAIL, ch_action_fail },
1597
1598 {CH_STATE_RXERR, CH_EVENT_STOP, ch_action_haltio },
1599 {CH_STATE_TXERR, CH_EVENT_STOP, ch_action_haltio },
1600 {CH_STATE_TXERR, CH_EVENT_MC_FAIL, ch_action_fail },
1601 {CH_STATE_RXERR, CH_EVENT_MC_FAIL, ch_action_fail },
1602};
1603
1604static const int CH_FSM_LEN = sizeof (ch_fsm) / sizeof (fsm_node);
Frank Pavlice172577d2005-09-08 09:50:06 +02001605
Linus Torvalds1da177e2005-04-16 15:20:36 -07001606/**
1607 * Functions related to setup and device detection.
1608 *****************************************************************************/
1609
1610static inline int
1611less_than(char *id1, char *id2)
1612{
1613 int dev1, dev2, i;
1614
1615 for (i = 0; i < 5; i++) {
1616 id1++;
1617 id2++;
1618 }
1619 dev1 = simple_strtoul(id1, &id1, 16);
1620 dev2 = simple_strtoul(id2, &id2, 16);
Jeff Garzike82b0f22006-05-26 21:58:38 -04001621
Linus Torvalds1da177e2005-04-16 15:20:36 -07001622 return (dev1 < dev2);
1623}
1624
1625/**
1626 * Add a new channel to the list of channels.
1627 * Keeps the channel list sorted.
1628 *
1629 * @param cdev The ccw_device to be added.
1630 * @param type The type class of the new channel.
1631 *
1632 * @return 0 on success, !0 on error.
1633 */
1634static int
1635add_channel(struct ccw_device *cdev, enum channel_types type)
1636{
1637 struct channel **c = &channels;
1638 struct channel *ch;
1639
1640 DBF_TEXT(trace, 2, __FUNCTION__);
Ahmed S. Darwishb7127df2007-04-27 16:01:50 +02001641 ch = kzalloc(sizeof(struct channel), GFP_KERNEL);
1642 if (!ch) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001643 ctc_pr_warn("ctc: Out of memory in add_channel\n");
1644 return -1;
1645 }
Ahmed S. Darwishb7127df2007-04-27 16:01:50 +02001646 /* assure all flags and counters are reset */
1647 ch->ccw = kzalloc(8 * sizeof(struct ccw1), GFP_KERNEL | GFP_DMA);
1648 if (!ch->ccw) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001649 kfree(ch);
1650 ctc_pr_warn("ctc: Out of memory in add_channel\n");
1651 return -1;
1652 }
1653
Linus Torvalds1da177e2005-04-16 15:20:36 -07001654
1655 /**
1656 * "static" ccws are used in the following way:
1657 *
1658 * ccw[0..2] (Channel program for generic I/O):
1659 * 0: prepare
1660 * 1: read or write (depending on direction) with fixed
1661 * buffer (idal allocated once when buffer is allocated)
1662 * 2: nop
1663 * ccw[3..5] (Channel program for direct write of packets)
1664 * 3: prepare
1665 * 4: write (idal allocated on every write).
1666 * 5: nop
1667 * ccw[6..7] (Channel program for initial channel setup):
1668 * 6: set extended mode
1669 * 7: nop
1670 *
1671 * ch->ccw[0..5] are initialized in ch_action_start because
1672 * the channel's direction is yet unknown here.
1673 */
1674 ch->ccw[6].cmd_code = CCW_CMD_SET_EXTENDED;
1675 ch->ccw[6].flags = CCW_FLAG_SLI;
1676
1677 ch->ccw[7].cmd_code = CCW_CMD_NOOP;
1678 ch->ccw[7].flags = CCW_FLAG_SLI;
1679
1680 ch->cdev = cdev;
1681 snprintf(ch->id, CTC_ID_SIZE, "ch-%s", cdev->dev.bus_id);
1682 ch->type = type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001683 ch->fsm = init_fsm(ch->id, ch_state_names,
1684 ch_event_names, NR_CH_STATES, NR_CH_EVENTS,
1685 ch_fsm, CH_FSM_LEN, GFP_KERNEL);
1686 if (ch->fsm == NULL) {
1687 ctc_pr_warn("ctc: Could not create FSM in add_channel\n");
1688 kfree(ch->ccw);
1689 kfree(ch);
1690 return -1;
1691 }
1692 fsm_newstate(ch->fsm, CH_STATE_IDLE);
Ahmed S. Darwishb7127df2007-04-27 16:01:50 +02001693 ch->irb = kzalloc(sizeof(struct irb), GFP_KERNEL);
1694 if (!ch->irb) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001695 ctc_pr_warn("ctc: Out of memory in add_channel\n");
1696 kfree_fsm(ch->fsm);
1697 kfree(ch->ccw);
1698 kfree(ch);
1699 return -1;
1700 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001701 while (*c && less_than((*c)->id, ch->id))
1702 c = &(*c)->next;
1703 if (*c && (!strncmp((*c)->id, ch->id, CTC_ID_SIZE))) {
1704 ctc_pr_debug(
1705 "ctc: add_channel: device %s already in list, "
1706 "using old entry\n", (*c)->id);
1707 kfree(ch->irb);
1708 kfree_fsm(ch->fsm);
1709 kfree(ch->ccw);
1710 kfree(ch);
1711 return 0;
1712 }
Frank Pavlic4c7ae6e2006-09-15 16:25:03 +02001713
1714 spin_lock_init(&ch->collect_lock);
1715
Linus Torvalds1da177e2005-04-16 15:20:36 -07001716 fsm_settimer(ch->fsm, &ch->timer);
1717 skb_queue_head_init(&ch->io_queue);
1718 skb_queue_head_init(&ch->collect_queue);
1719 ch->next = *c;
1720 *c = ch;
1721 return 0;
1722}
1723
1724/**
1725 * Release a specific channel in the channel list.
1726 *
1727 * @param ch Pointer to channel struct to be released.
1728 */
1729static void
1730channel_free(struct channel *ch)
1731{
1732 ch->flags &= ~CHANNEL_FLAGS_INUSE;
1733 fsm_newstate(ch->fsm, CH_STATE_IDLE);
1734}
1735
1736/**
1737 * Remove a specific channel in the channel list.
1738 *
1739 * @param ch Pointer to channel struct to be released.
1740 */
1741static void
1742channel_remove(struct channel *ch)
1743{
1744 struct channel **c = &channels;
1745
1746 DBF_TEXT(trace, 2, __FUNCTION__);
1747 if (ch == NULL)
1748 return;
1749
1750 channel_free(ch);
1751 while (*c) {
1752 if (*c == ch) {
1753 *c = ch->next;
1754 fsm_deltimer(&ch->timer);
1755 kfree_fsm(ch->fsm);
1756 clear_normalized_cda(&ch->ccw[4]);
1757 if (ch->trans_skb != NULL) {
1758 clear_normalized_cda(&ch->ccw[1]);
1759 dev_kfree_skb(ch->trans_skb);
1760 }
1761 kfree(ch->ccw);
1762 kfree(ch->irb);
1763 kfree(ch);
1764 return;
1765 }
1766 c = &((*c)->next);
1767 }
1768}
1769
1770/**
1771 * Get a specific channel from the channel list.
1772 *
1773 * @param type Type of channel we are interested in.
1774 * @param id Id of channel we are interested in.
1775 * @param direction Direction we want to use this channel for.
1776 *
1777 * @return Pointer to a channel or NULL if no matching channel available.
1778 */
1779static struct channel
1780*
1781channel_get(enum channel_types type, char *id, int direction)
1782{
1783 struct channel *ch = channels;
1784
1785 DBF_TEXT(trace, 3, __FUNCTION__);
1786#ifdef DEBUG
1787 ctc_pr_debug("ctc: %s(): searching for ch with id %s and type %d\n",
1788 __func__, id, type);
1789#endif
1790
1791 while (ch && ((strncmp(ch->id, id, CTC_ID_SIZE)) || (ch->type != type))) {
1792#ifdef DEBUG
1793 ctc_pr_debug("ctc: %s(): ch=0x%p (id=%s, type=%d\n",
1794 __func__, ch, ch->id, ch->type);
1795#endif
1796 ch = ch->next;
1797 }
1798#ifdef DEBUG
1799 ctc_pr_debug("ctc: %s(): ch=0x%pq (id=%s, type=%d\n",
1800 __func__, ch, ch->id, ch->type);
1801#endif
1802 if (!ch) {
1803 ctc_pr_warn("ctc: %s(): channel with id %s "
1804 "and type %d not found in channel list\n",
1805 __func__, id, type);
1806 } else {
1807 if (ch->flags & CHANNEL_FLAGS_INUSE)
1808 ch = NULL;
1809 else {
1810 ch->flags |= CHANNEL_FLAGS_INUSE;
1811 ch->flags &= ~CHANNEL_FLAGS_RWMASK;
1812 ch->flags |= (direction == WRITE)
1813 ? CHANNEL_FLAGS_WRITE : CHANNEL_FLAGS_READ;
1814 fsm_newstate(ch->fsm, CH_STATE_STOPPED);
1815 }
1816 }
1817 return ch;
1818}
1819
1820/**
1821 * Return the channel type by name.
1822 *
1823 * @param name Name of network interface.
1824 *
1825 * @return Type class of channel to be used for that interface.
1826 */
1827static enum channel_types inline
1828extract_channel_media(char *name)
1829{
1830 enum channel_types ret = channel_type_unknown;
1831
1832 if (name != NULL) {
1833 if (strncmp(name, "ctc", 3) == 0)
1834 ret = channel_type_parallel;
1835 if (strncmp(name, "escon", 5) == 0)
1836 ret = channel_type_escon;
1837 }
1838 return ret;
1839}
1840
1841static long
1842__ctc_check_irb_error(struct ccw_device *cdev, struct irb *irb)
1843{
1844 if (!IS_ERR(irb))
1845 return 0;
1846
1847 switch (PTR_ERR(irb)) {
1848 case -EIO:
1849 ctc_pr_warn("i/o-error on device %s\n", cdev->dev.bus_id);
1850// CTC_DBF_TEXT(trace, 2, "ckirberr");
1851// CTC_DBF_TEXT_(trace, 2, " rc%d", -EIO);
1852 break;
1853 case -ETIMEDOUT:
1854 ctc_pr_warn("timeout on device %s\n", cdev->dev.bus_id);
1855// CTC_DBF_TEXT(trace, 2, "ckirberr");
1856// CTC_DBF_TEXT_(trace, 2, " rc%d", -ETIMEDOUT);
1857 break;
1858 default:
1859 ctc_pr_warn("unknown error %ld on device %s\n", PTR_ERR(irb),
1860 cdev->dev.bus_id);
1861// CTC_DBF_TEXT(trace, 2, "ckirberr");
1862// CTC_DBF_TEXT(trace, 2, " rc???");
1863 }
1864 return PTR_ERR(irb);
1865}
1866
1867/**
1868 * Main IRQ handler.
1869 *
1870 * @param cdev The ccw_device the interrupt is for.
1871 * @param intparm interruption parameter.
1872 * @param irb interruption response block.
1873 */
1874static void
1875ctc_irq_handler(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
1876{
1877 struct channel *ch;
1878 struct net_device *dev;
1879 struct ctc_priv *priv;
1880
1881 DBF_TEXT(trace, 5, __FUNCTION__);
1882 if (__ctc_check_irb_error(cdev, irb))
1883 return;
1884
1885 /* Check for unsolicited interrupts. */
1886 if (!cdev->dev.driver_data) {
1887 ctc_pr_warn("ctc: Got unsolicited irq: %s c-%02x d-%02x\n",
1888 cdev->dev.bus_id, irb->scsw.cstat,
1889 irb->scsw.dstat);
1890 return;
1891 }
Jeff Garzike82b0f22006-05-26 21:58:38 -04001892
Linus Torvalds1da177e2005-04-16 15:20:36 -07001893 priv = ((struct ccwgroup_device *)cdev->dev.driver_data)
1894 ->dev.driver_data;
1895
1896 /* Try to extract channel from driver data. */
1897 if (priv->channel[READ]->cdev == cdev)
1898 ch = priv->channel[READ];
1899 else if (priv->channel[WRITE]->cdev == cdev)
1900 ch = priv->channel[WRITE];
1901 else {
1902 ctc_pr_err("ctc: Can't determine channel for interrupt, "
1903 "device %s\n", cdev->dev.bus_id);
1904 return;
1905 }
Jeff Garzike82b0f22006-05-26 21:58:38 -04001906
Linus Torvalds1da177e2005-04-16 15:20:36 -07001907 dev = (struct net_device *) (ch->netdev);
1908 if (dev == NULL) {
1909 ctc_pr_crit("ctc: ctc_irq_handler dev=NULL bus_id=%s, ch=0x%p\n",
1910 cdev->dev.bus_id, ch);
1911 return;
1912 }
1913
1914#ifdef DEBUG
1915 ctc_pr_debug("%s: interrupt for device: %s received c-%02x d-%02x\n",
1916 dev->name, ch->id, irb->scsw.cstat, irb->scsw.dstat);
1917#endif
1918
1919 /* Copy interruption response block. */
1920 memcpy(ch->irb, irb, sizeof(struct irb));
1921
1922 /* Check for good subchannel return code, otherwise error message */
1923 if (ch->irb->scsw.cstat) {
1924 fsm_event(ch->fsm, CH_EVENT_SC_UNKNOWN, ch);
1925 ctc_pr_warn("%s: subchannel check for device: %s - %02x %02x\n",
1926 dev->name, ch->id, ch->irb->scsw.cstat,
1927 ch->irb->scsw.dstat);
1928 return;
1929 }
1930
1931 /* Check the reason-code of a unit check */
1932 if (ch->irb->scsw.dstat & DEV_STAT_UNIT_CHECK) {
1933 ccw_unit_check(ch, ch->irb->ecw[0]);
1934 return;
1935 }
1936 if (ch->irb->scsw.dstat & DEV_STAT_BUSY) {
1937 if (ch->irb->scsw.dstat & DEV_STAT_ATTENTION)
1938 fsm_event(ch->fsm, CH_EVENT_ATTNBUSY, ch);
1939 else
1940 fsm_event(ch->fsm, CH_EVENT_BUSY, ch);
1941 return;
1942 }
1943 if (ch->irb->scsw.dstat & DEV_STAT_ATTENTION) {
1944 fsm_event(ch->fsm, CH_EVENT_ATTN, ch);
1945 return;
1946 }
1947 if ((ch->irb->scsw.stctl & SCSW_STCTL_SEC_STATUS) ||
1948 (ch->irb->scsw.stctl == SCSW_STCTL_STATUS_PEND) ||
1949 (ch->irb->scsw.stctl ==
1950 (SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND)))
1951 fsm_event(ch->fsm, CH_EVENT_FINSTAT, ch);
1952 else
1953 fsm_event(ch->fsm, CH_EVENT_IRQ, ch);
1954
1955}
Frank Pavlice172577d2005-09-08 09:50:06 +02001956
Linus Torvalds1da177e2005-04-16 15:20:36 -07001957/**
1958 * Actions for interface - statemachine.
1959 *****************************************************************************/
1960
1961/**
1962 * Startup channels by sending CH_EVENT_START to each channel.
1963 *
1964 * @param fi An instance of an interface statemachine.
1965 * @param event The event, just happened.
1966 * @param arg Generic pointer, casted from struct net_device * upon call.
1967 */
1968static void
1969dev_action_start(fsm_instance * fi, int event, void *arg)
1970{
1971 struct net_device *dev = (struct net_device *) arg;
1972 struct ctc_priv *privptr = dev->priv;
1973 int direction;
1974
1975 DBF_TEXT(setup, 3, __FUNCTION__);
1976 fsm_deltimer(&privptr->restart_timer);
1977 fsm_newstate(fi, DEV_STATE_STARTWAIT_RXTX);
1978 for (direction = READ; direction <= WRITE; direction++) {
1979 struct channel *ch = privptr->channel[direction];
1980 fsm_event(ch->fsm, CH_EVENT_START, ch);
1981 }
1982}
1983
1984/**
1985 * Shutdown channels by sending CH_EVENT_STOP to each channel.
1986 *
1987 * @param fi An instance of an interface statemachine.
1988 * @param event The event, just happened.
1989 * @param arg Generic pointer, casted from struct net_device * upon call.
1990 */
1991static void
1992dev_action_stop(fsm_instance * fi, int event, void *arg)
1993{
1994 struct net_device *dev = (struct net_device *) arg;
1995 struct ctc_priv *privptr = dev->priv;
1996 int direction;
1997
1998 DBF_TEXT(trace, 3, __FUNCTION__);
1999 fsm_newstate(fi, DEV_STATE_STOPWAIT_RXTX);
2000 for (direction = READ; direction <= WRITE; direction++) {
2001 struct channel *ch = privptr->channel[direction];
2002 fsm_event(ch->fsm, CH_EVENT_STOP, ch);
2003 }
2004}
Jeff Garzike82b0f22006-05-26 21:58:38 -04002005static void
Linus Torvalds1da177e2005-04-16 15:20:36 -07002006dev_action_restart(fsm_instance *fi, int event, void *arg)
2007{
2008 struct net_device *dev = (struct net_device *)arg;
2009 struct ctc_priv *privptr = dev->priv;
Jeff Garzike82b0f22006-05-26 21:58:38 -04002010
Linus Torvalds1da177e2005-04-16 15:20:36 -07002011 DBF_TEXT(trace, 3, __FUNCTION__);
2012 ctc_pr_debug("%s: Restarting\n", dev->name);
2013 dev_action_stop(fi, event, arg);
2014 fsm_event(privptr->fsm, DEV_EVENT_STOP, dev);
2015 fsm_addtimer(&privptr->restart_timer, CTC_TIMEOUT_5SEC,
2016 DEV_EVENT_START, dev);
2017}
2018
2019/**
2020 * Called from channel statemachine
2021 * when a channel is up and running.
2022 *
2023 * @param fi An instance of an interface statemachine.
2024 * @param event The event, just happened.
2025 * @param arg Generic pointer, casted from struct net_device * upon call.
2026 */
2027static void
2028dev_action_chup(fsm_instance * fi, int event, void *arg)
2029{
2030 struct net_device *dev = (struct net_device *) arg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002031
2032 DBF_TEXT(trace, 3, __FUNCTION__);
2033 switch (fsm_getstate(fi)) {
2034 case DEV_STATE_STARTWAIT_RXTX:
2035 if (event == DEV_EVENT_RXUP)
2036 fsm_newstate(fi, DEV_STATE_STARTWAIT_TX);
2037 else
2038 fsm_newstate(fi, DEV_STATE_STARTWAIT_RX);
2039 break;
2040 case DEV_STATE_STARTWAIT_RX:
2041 if (event == DEV_EVENT_RXUP) {
2042 fsm_newstate(fi, DEV_STATE_RUNNING);
2043 ctc_pr_info("%s: connected with remote side\n",
2044 dev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002045 ctc_clear_busy(dev);
2046 }
2047 break;
2048 case DEV_STATE_STARTWAIT_TX:
2049 if (event == DEV_EVENT_TXUP) {
2050 fsm_newstate(fi, DEV_STATE_RUNNING);
2051 ctc_pr_info("%s: connected with remote side\n",
2052 dev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002053 ctc_clear_busy(dev);
2054 }
2055 break;
2056 case DEV_STATE_STOPWAIT_TX:
2057 if (event == DEV_EVENT_RXUP)
2058 fsm_newstate(fi, DEV_STATE_STOPWAIT_RXTX);
2059 break;
2060 case DEV_STATE_STOPWAIT_RX:
2061 if (event == DEV_EVENT_TXUP)
2062 fsm_newstate(fi, DEV_STATE_STOPWAIT_RXTX);
2063 break;
2064 }
2065}
2066
2067/**
2068 * Called from channel statemachine
2069 * when a channel has been shutdown.
2070 *
2071 * @param fi An instance of an interface statemachine.
2072 * @param event The event, just happened.
2073 * @param arg Generic pointer, casted from struct net_device * upon call.
2074 */
2075static void
2076dev_action_chdown(fsm_instance * fi, int event, void *arg)
2077{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002078
2079 DBF_TEXT(trace, 3, __FUNCTION__);
2080 switch (fsm_getstate(fi)) {
2081 case DEV_STATE_RUNNING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002082 if (event == DEV_EVENT_TXDOWN)
2083 fsm_newstate(fi, DEV_STATE_STARTWAIT_TX);
2084 else
2085 fsm_newstate(fi, DEV_STATE_STARTWAIT_RX);
2086 break;
2087 case DEV_STATE_STARTWAIT_RX:
2088 if (event == DEV_EVENT_TXDOWN)
2089 fsm_newstate(fi, DEV_STATE_STARTWAIT_RXTX);
2090 break;
2091 case DEV_STATE_STARTWAIT_TX:
2092 if (event == DEV_EVENT_RXDOWN)
2093 fsm_newstate(fi, DEV_STATE_STARTWAIT_RXTX);
2094 break;
2095 case DEV_STATE_STOPWAIT_RXTX:
2096 if (event == DEV_EVENT_TXDOWN)
2097 fsm_newstate(fi, DEV_STATE_STOPWAIT_RX);
2098 else
2099 fsm_newstate(fi, DEV_STATE_STOPWAIT_TX);
2100 break;
2101 case DEV_STATE_STOPWAIT_RX:
2102 if (event == DEV_EVENT_RXDOWN)
2103 fsm_newstate(fi, DEV_STATE_STOPPED);
2104 break;
2105 case DEV_STATE_STOPWAIT_TX:
2106 if (event == DEV_EVENT_TXDOWN)
2107 fsm_newstate(fi, DEV_STATE_STOPPED);
2108 break;
2109 }
2110}
2111
2112static const fsm_node dev_fsm[] = {
2113 {DEV_STATE_STOPPED, DEV_EVENT_START, dev_action_start},
2114
2115 {DEV_STATE_STOPWAIT_RXTX, DEV_EVENT_START, dev_action_start },
2116 {DEV_STATE_STOPWAIT_RXTX, DEV_EVENT_RXDOWN, dev_action_chdown },
2117 {DEV_STATE_STOPWAIT_RXTX, DEV_EVENT_TXDOWN, dev_action_chdown },
2118 {DEV_STATE_STOPWAIT_RXTX, DEV_EVENT_RESTART, dev_action_restart },
2119
2120 {DEV_STATE_STOPWAIT_RX, DEV_EVENT_START, dev_action_start },
2121 {DEV_STATE_STOPWAIT_RX, DEV_EVENT_RXUP, dev_action_chup },
2122 {DEV_STATE_STOPWAIT_RX, DEV_EVENT_TXUP, dev_action_chup },
2123 {DEV_STATE_STOPWAIT_RX, DEV_EVENT_RXDOWN, dev_action_chdown },
2124 {DEV_STATE_STOPWAIT_RX, DEV_EVENT_RESTART, dev_action_restart },
2125
2126 {DEV_STATE_STOPWAIT_TX, DEV_EVENT_START, dev_action_start },
2127 {DEV_STATE_STOPWAIT_TX, DEV_EVENT_RXUP, dev_action_chup },
2128 {DEV_STATE_STOPWAIT_TX, DEV_EVENT_TXUP, dev_action_chup },
2129 {DEV_STATE_STOPWAIT_TX, DEV_EVENT_TXDOWN, dev_action_chdown },
2130 {DEV_STATE_STOPWAIT_TX, DEV_EVENT_RESTART, dev_action_restart },
2131
2132 {DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_STOP, dev_action_stop },
2133 {DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_RXUP, dev_action_chup },
2134 {DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_TXUP, dev_action_chup },
2135 {DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_RXDOWN, dev_action_chdown },
2136 {DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_TXDOWN, dev_action_chdown },
2137 {DEV_STATE_STARTWAIT_RXTX, DEV_EVENT_RESTART, dev_action_restart },
2138
2139 {DEV_STATE_STARTWAIT_TX, DEV_EVENT_STOP, dev_action_stop },
2140 {DEV_STATE_STARTWAIT_TX, DEV_EVENT_RXUP, dev_action_chup },
2141 {DEV_STATE_STARTWAIT_TX, DEV_EVENT_TXUP, dev_action_chup },
2142 {DEV_STATE_STARTWAIT_TX, DEV_EVENT_RXDOWN, dev_action_chdown },
2143 {DEV_STATE_STARTWAIT_TX, DEV_EVENT_RESTART, dev_action_restart },
2144
2145 {DEV_STATE_STARTWAIT_RX, DEV_EVENT_STOP, dev_action_stop },
2146 {DEV_STATE_STARTWAIT_RX, DEV_EVENT_RXUP, dev_action_chup },
2147 {DEV_STATE_STARTWAIT_RX, DEV_EVENT_TXUP, dev_action_chup },
2148 {DEV_STATE_STARTWAIT_RX, DEV_EVENT_TXDOWN, dev_action_chdown },
2149 {DEV_STATE_STARTWAIT_RX, DEV_EVENT_RESTART, dev_action_restart },
2150
2151 {DEV_STATE_RUNNING, DEV_EVENT_STOP, dev_action_stop },
2152 {DEV_STATE_RUNNING, DEV_EVENT_RXDOWN, dev_action_chdown },
2153 {DEV_STATE_RUNNING, DEV_EVENT_TXDOWN, dev_action_chdown },
2154 {DEV_STATE_RUNNING, DEV_EVENT_TXUP, fsm_action_nop },
2155 {DEV_STATE_RUNNING, DEV_EVENT_RXUP, fsm_action_nop },
2156 {DEV_STATE_RUNNING, DEV_EVENT_RESTART, dev_action_restart },
2157};
2158
2159static const int DEV_FSM_LEN = sizeof (dev_fsm) / sizeof (fsm_node);
2160
2161/**
2162 * Transmit a packet.
2163 * This is a helper function for ctc_tx().
2164 *
2165 * @param ch Channel to be used for sending.
2166 * @param skb Pointer to struct sk_buff of packet to send.
2167 * The linklevel header has already been set up
2168 * by ctc_tx().
2169 *
2170 * @return 0 on success, -ERRNO on failure. (Never fails.)
2171 */
2172static int
2173transmit_skb(struct channel *ch, struct sk_buff *skb)
2174{
2175 unsigned long saveflags;
2176 struct ll_header header;
2177 int rc = 0;
2178
2179 DBF_TEXT(trace, 5, __FUNCTION__);
Frank Pavlice172577d2005-09-08 09:50:06 +02002180 /* we need to acquire the lock for testing the state
Jeff Garzike82b0f22006-05-26 21:58:38 -04002181 * otherwise we can have an IRQ changing the state to
Frank Pavlice172577d2005-09-08 09:50:06 +02002182 * TXIDLE after the test but before acquiring the lock.
2183 */
2184 spin_lock_irqsave(&ch->collect_lock, saveflags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002185 if (fsm_getstate(ch->fsm) != CH_STATE_TXIDLE) {
2186 int l = skb->len + LL_HEADER_LENGTH;
2187
Frank Pavlice172577d2005-09-08 09:50:06 +02002188 if (ch->collect_len + l > ch->max_bufsize - 2) {
2189 spin_unlock_irqrestore(&ch->collect_lock, saveflags);
2190 return -EBUSY;
2191 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002192 atomic_inc(&skb->users);
2193 header.length = l;
2194 header.type = skb->protocol;
2195 header.unused = 0;
2196 memcpy(skb_push(skb, LL_HEADER_LENGTH), &header,
2197 LL_HEADER_LENGTH);
2198 skb_queue_tail(&ch->collect_queue, skb);
2199 ch->collect_len += l;
2200 }
2201 spin_unlock_irqrestore(&ch->collect_lock, saveflags);
2202 } else {
2203 __u16 block_len;
2204 int ccw_idx;
2205 struct sk_buff *nskb;
2206 unsigned long hi;
Frank Pavlice172577d2005-09-08 09:50:06 +02002207 spin_unlock_irqrestore(&ch->collect_lock, saveflags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002208 /**
2209 * Protect skb against beeing free'd by upper
2210 * layers.
2211 */
2212 atomic_inc(&skb->users);
2213 ch->prof.txlen += skb->len;
2214 header.length = skb->len + LL_HEADER_LENGTH;
2215 header.type = skb->protocol;
2216 header.unused = 0;
2217 memcpy(skb_push(skb, LL_HEADER_LENGTH), &header,
2218 LL_HEADER_LENGTH);
2219 block_len = skb->len + 2;
2220 *((__u16 *) skb_push(skb, 2)) = block_len;
2221
2222 /**
2223 * IDAL support in CTC is broken, so we have to
2224 * care about skb's above 2G ourselves.
2225 */
2226 hi = ((unsigned long) skb->tail + LL_HEADER_LENGTH) >> 31;
2227 if (hi) {
2228 nskb = alloc_skb(skb->len, GFP_ATOMIC | GFP_DMA);
2229 if (!nskb) {
2230 atomic_dec(&skb->users);
2231 skb_pull(skb, LL_HEADER_LENGTH + 2);
Frank Pavlice172577d2005-09-08 09:50:06 +02002232 ctc_clear_busy(ch->netdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002233 return -ENOMEM;
2234 } else {
2235 memcpy(skb_put(nskb, skb->len),
2236 skb->data, skb->len);
2237 atomic_inc(&nskb->users);
2238 atomic_dec(&skb->users);
2239 dev_kfree_skb_irq(skb);
2240 skb = nskb;
2241 }
2242 }
2243
2244 ch->ccw[4].count = block_len;
2245 if (set_normalized_cda(&ch->ccw[4], skb->data)) {
2246 /**
2247 * idal allocation failed, try via copying to
2248 * trans_skb. trans_skb usually has a pre-allocated
2249 * idal.
2250 */
2251 if (ctc_checkalloc_buffer(ch, 1)) {
2252 /**
2253 * Remove our header. It gets added
2254 * again on retransmit.
2255 */
2256 atomic_dec(&skb->users);
2257 skb_pull(skb, LL_HEADER_LENGTH + 2);
Frank Pavlice172577d2005-09-08 09:50:06 +02002258 ctc_clear_busy(ch->netdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002259 return -EBUSY;
2260 }
2261
2262 ch->trans_skb->tail = ch->trans_skb->data;
2263 ch->trans_skb->len = 0;
2264 ch->ccw[1].count = skb->len;
2265 memcpy(skb_put(ch->trans_skb, skb->len), skb->data,
2266 skb->len);
2267 atomic_dec(&skb->users);
2268 dev_kfree_skb_irq(skb);
2269 ccw_idx = 0;
2270 } else {
2271 skb_queue_tail(&ch->io_queue, skb);
2272 ccw_idx = 3;
2273 }
2274 ch->retry = 0;
2275 fsm_newstate(ch->fsm, CH_STATE_TX);
2276 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
2277 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
2278 ch->prof.send_stamp = xtime;
2279 rc = ccw_device_start(ch->cdev, &ch->ccw[ccw_idx],
2280 (unsigned long) ch, 0xff, 0);
2281 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
2282 if (ccw_idx == 3)
2283 ch->prof.doios_single++;
2284 if (rc != 0) {
2285 fsm_deltimer(&ch->timer);
2286 ccw_check_return_code(ch, rc, "single skb TX");
2287 if (ccw_idx == 3)
2288 skb_dequeue_tail(&ch->io_queue);
2289 /**
2290 * Remove our header. It gets added
2291 * again on retransmit.
2292 */
2293 skb_pull(skb, LL_HEADER_LENGTH + 2);
2294 } else {
2295 if (ccw_idx == 0) {
2296 struct net_device *dev = ch->netdev;
2297 struct ctc_priv *privptr = dev->priv;
2298 privptr->stats.tx_packets++;
2299 privptr->stats.tx_bytes +=
2300 skb->len - LL_HEADER_LENGTH;
2301 }
2302 }
2303 }
2304
Frank Pavlice172577d2005-09-08 09:50:06 +02002305 ctc_clear_busy(ch->netdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002306 return rc;
2307}
Frank Pavlice172577d2005-09-08 09:50:06 +02002308
Linus Torvalds1da177e2005-04-16 15:20:36 -07002309/**
2310 * Interface API for upper network layers
2311 *****************************************************************************/
2312
2313/**
2314 * Open an interface.
2315 * Called from generic network layer when ifconfig up is run.
2316 *
2317 * @param dev Pointer to interface struct.
2318 *
2319 * @return 0 on success, -ERRNO on failure. (Never fails.)
2320 */
2321static int
2322ctc_open(struct net_device * dev)
2323{
2324 DBF_TEXT(trace, 5, __FUNCTION__);
2325 fsm_event(((struct ctc_priv *) dev->priv)->fsm, DEV_EVENT_START, dev);
2326 return 0;
2327}
2328
2329/**
2330 * Close an interface.
2331 * Called from generic network layer when ifconfig down is run.
2332 *
2333 * @param dev Pointer to interface struct.
2334 *
2335 * @return 0 on success, -ERRNO on failure. (Never fails.)
2336 */
2337static int
2338ctc_close(struct net_device * dev)
2339{
2340 DBF_TEXT(trace, 5, __FUNCTION__);
2341 fsm_event(((struct ctc_priv *) dev->priv)->fsm, DEV_EVENT_STOP, dev);
2342 return 0;
2343}
2344
2345/**
2346 * Start transmission of a packet.
2347 * Called from generic network device layer.
2348 *
2349 * @param skb Pointer to buffer containing the packet.
2350 * @param dev Pointer to interface struct.
2351 *
2352 * @return 0 if packet consumed, !0 if packet rejected.
2353 * Note: If we return !0, then the packet is free'd by
2354 * the generic network layer.
2355 */
2356static int
2357ctc_tx(struct sk_buff *skb, struct net_device * dev)
2358{
2359 int rc = 0;
2360 struct ctc_priv *privptr = (struct ctc_priv *) dev->priv;
2361
2362 DBF_TEXT(trace, 5, __FUNCTION__);
2363 /**
2364 * Some sanity checks ...
2365 */
2366 if (skb == NULL) {
2367 ctc_pr_warn("%s: NULL sk_buff passed\n", dev->name);
2368 privptr->stats.tx_dropped++;
2369 return 0;
2370 }
2371 if (skb_headroom(skb) < (LL_HEADER_LENGTH + 2)) {
2372 ctc_pr_warn("%s: Got sk_buff with head room < %ld bytes\n",
2373 dev->name, LL_HEADER_LENGTH + 2);
2374 dev_kfree_skb(skb);
2375 privptr->stats.tx_dropped++;
2376 return 0;
2377 }
2378
2379 /**
2380 * If channels are not running, try to restart them
Jeff Garzike82b0f22006-05-26 21:58:38 -04002381 * and throw away packet.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002382 */
2383 if (fsm_getstate(privptr->fsm) != DEV_STATE_RUNNING) {
2384 fsm_event(privptr->fsm, DEV_EVENT_START, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002385 dev_kfree_skb(skb);
2386 privptr->stats.tx_dropped++;
2387 privptr->stats.tx_errors++;
2388 privptr->stats.tx_carrier_errors++;
2389 return 0;
2390 }
2391
2392 if (ctc_test_and_set_busy(dev))
2393 return -EBUSY;
2394
2395 dev->trans_start = jiffies;
2396 if (transmit_skb(privptr->channel[WRITE], skb) != 0)
2397 rc = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002398 return rc;
2399}
2400
2401/**
2402 * Sets MTU of an interface.
2403 *
2404 * @param dev Pointer to interface struct.
2405 * @param new_mtu The new MTU to use for this interface.
2406 *
2407 * @return 0 on success, -EINVAL if MTU is out of valid range.
2408 * (valid range is 576 .. 65527). If VM is on the
2409 * remote side, maximum MTU is 32760, however this is
2410 * <em>not</em> checked here.
2411 */
2412static int
2413ctc_change_mtu(struct net_device * dev, int new_mtu)
2414{
2415 struct ctc_priv *privptr = (struct ctc_priv *) dev->priv;
2416
2417 DBF_TEXT(trace, 3, __FUNCTION__);
2418 if ((new_mtu < 576) || (new_mtu > 65527) ||
2419 (new_mtu > (privptr->channel[READ]->max_bufsize -
2420 LL_HEADER_LENGTH - 2)))
2421 return -EINVAL;
2422 dev->mtu = new_mtu;
2423 dev->hard_header_len = LL_HEADER_LENGTH + 2;
2424 return 0;
2425}
2426
2427/**
2428 * Returns interface statistics of a device.
2429 *
2430 * @param dev Pointer to interface struct.
2431 *
2432 * @return Pointer to stats struct of this interface.
2433 */
2434static struct net_device_stats *
2435ctc_stats(struct net_device * dev)
2436{
2437 return &((struct ctc_priv *) dev->priv)->stats;
2438}
2439
2440/*
2441 * sysfs attributes
2442 */
Frank Pavlic7394c922005-05-12 20:36:47 +02002443
Linus Torvalds1da177e2005-04-16 15:20:36 -07002444static ssize_t
Yani Ioannou3fd3c0a2005-05-17 06:43:27 -04002445buffer_show(struct device *dev, struct device_attribute *attr, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002446{
2447 struct ctc_priv *priv;
2448
2449 priv = dev->driver_data;
2450 if (!priv)
2451 return -ENODEV;
2452 return sprintf(buf, "%d\n",
2453 priv->buffer_size);
2454}
2455
2456static ssize_t
Yani Ioannou3fd3c0a2005-05-17 06:43:27 -04002457buffer_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002458{
2459 struct ctc_priv *priv;
2460 struct net_device *ndev;
2461 int bs1;
Frank Pavlic7394c922005-05-12 20:36:47 +02002462 char buffer[16];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002463
2464 DBF_TEXT(trace, 3, __FUNCTION__);
Frank Pavlic7394c922005-05-12 20:36:47 +02002465 DBF_TEXT(trace, 3, buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002466 priv = dev->driver_data;
Frank Pavlic7394c922005-05-12 20:36:47 +02002467 if (!priv) {
2468 DBF_TEXT(trace, 3, "bfnopriv");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002469 return -ENODEV;
Frank Pavlic7394c922005-05-12 20:36:47 +02002470 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002471
Frank Pavlic7394c922005-05-12 20:36:47 +02002472 sscanf(buf, "%u", &bs1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002473 if (bs1 > CTC_BUFSIZE_LIMIT)
Frank Pavlic7394c922005-05-12 20:36:47 +02002474 goto einval;
2475 if (bs1 < (576 + LL_HEADER_LENGTH + 2))
2476 goto einval;
2477 priv->buffer_size = bs1; // just to overwrite the default
2478
2479 ndev = priv->channel[READ]->netdev;
2480 if (!ndev) {
2481 DBF_TEXT(trace, 3, "bfnondev");
2482 return -ENODEV;
2483 }
2484
Linus Torvalds1da177e2005-04-16 15:20:36 -07002485 if ((ndev->flags & IFF_RUNNING) &&
2486 (bs1 < (ndev->mtu + LL_HEADER_LENGTH + 2)))
Frank Pavlic7394c922005-05-12 20:36:47 +02002487 goto einval;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002488
Frank Pavlic7394c922005-05-12 20:36:47 +02002489 priv->channel[READ]->max_bufsize = bs1;
2490 priv->channel[WRITE]->max_bufsize = bs1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002491 if (!(ndev->flags & IFF_RUNNING))
2492 ndev->mtu = bs1 - LL_HEADER_LENGTH - 2;
2493 priv->channel[READ]->flags |= CHANNEL_FLAGS_BUFSIZE_CHANGED;
2494 priv->channel[WRITE]->flags |= CHANNEL_FLAGS_BUFSIZE_CHANGED;
2495
Frank Pavlic7394c922005-05-12 20:36:47 +02002496 sprintf(buffer, "%d",priv->buffer_size);
2497 DBF_TEXT(trace, 3, buffer);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002498 return count;
2499
Frank Pavlic7394c922005-05-12 20:36:47 +02002500einval:
2501 DBF_TEXT(trace, 3, "buff_err");
2502 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002503}
2504
2505static ssize_t
Yani Ioannou3fd3c0a2005-05-17 06:43:27 -04002506loglevel_show(struct device *dev, struct device_attribute *attr, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002507{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002508 return sprintf(buf, "%d\n", loglevel);
2509}
2510
2511static ssize_t
Yani Ioannou3fd3c0a2005-05-17 06:43:27 -04002512loglevel_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002513{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002514 int ll1;
2515
2516 DBF_TEXT(trace, 5, __FUNCTION__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002517 sscanf(buf, "%i", &ll1);
2518
2519 if ((ll1 > CTC_LOGLEVEL_MAX) || (ll1 < 0))
2520 return -EINVAL;
2521 loglevel = ll1;
2522 return count;
2523}
2524
2525static void
2526ctc_print_statistics(struct ctc_priv *priv)
2527{
2528 char *sbuf;
2529 char *p;
2530
2531 DBF_TEXT(trace, 4, __FUNCTION__);
2532 if (!priv)
2533 return;
Robert P. J. Day5cbded52006-12-13 00:35:56 -08002534 sbuf = kmalloc(2048, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002535 if (sbuf == NULL)
2536 return;
2537 p = sbuf;
2538
2539 p += sprintf(p, " Device FSM state: %s\n",
2540 fsm_getstate_str(priv->fsm));
2541 p += sprintf(p, " RX channel FSM state: %s\n",
2542 fsm_getstate_str(priv->channel[READ]->fsm));
2543 p += sprintf(p, " TX channel FSM state: %s\n",
2544 fsm_getstate_str(priv->channel[WRITE]->fsm));
2545 p += sprintf(p, " Max. TX buffer used: %ld\n",
2546 priv->channel[WRITE]->prof.maxmulti);
2547 p += sprintf(p, " Max. chained SKBs: %ld\n",
2548 priv->channel[WRITE]->prof.maxcqueue);
2549 p += sprintf(p, " TX single write ops: %ld\n",
2550 priv->channel[WRITE]->prof.doios_single);
2551 p += sprintf(p, " TX multi write ops: %ld\n",
2552 priv->channel[WRITE]->prof.doios_multi);
2553 p += sprintf(p, " Netto bytes written: %ld\n",
2554 priv->channel[WRITE]->prof.txlen);
2555 p += sprintf(p, " Max. TX IO-time: %ld\n",
2556 priv->channel[WRITE]->prof.tx_time);
2557
2558 ctc_pr_debug("Statistics for %s:\n%s",
2559 priv->channel[WRITE]->netdev->name, sbuf);
2560 kfree(sbuf);
2561 return;
2562}
2563
2564static ssize_t
Yani Ioannou3fd3c0a2005-05-17 06:43:27 -04002565stats_show(struct device *dev, struct device_attribute *attr, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002566{
2567 struct ctc_priv *priv = dev->driver_data;
2568 if (!priv)
2569 return -ENODEV;
2570 ctc_print_statistics(priv);
2571 return sprintf(buf, "0\n");
2572}
2573
2574static ssize_t
Yani Ioannou3fd3c0a2005-05-17 06:43:27 -04002575stats_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002576{
2577 struct ctc_priv *priv = dev->driver_data;
2578 if (!priv)
2579 return -ENODEV;
2580 /* Reset statistics */
2581 memset(&priv->channel[WRITE]->prof, 0,
2582 sizeof(priv->channel[WRITE]->prof));
2583 return count;
2584}
2585
Linus Torvalds1da177e2005-04-16 15:20:36 -07002586static void
2587ctc_netdev_unregister(struct net_device * dev)
2588{
2589 struct ctc_priv *privptr;
2590
2591 if (!dev)
2592 return;
2593 privptr = (struct ctc_priv *) dev->priv;
Frank Pavlic56347a22006-04-13 20:19:12 +02002594 unregister_netdev(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002595}
2596
2597static int
2598ctc_netdev_register(struct net_device * dev)
2599{
Frank Pavlic56347a22006-04-13 20:19:12 +02002600 return register_netdev(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002601}
2602
2603static void
2604ctc_free_netdevice(struct net_device * dev, int free_dev)
2605{
2606 struct ctc_priv *privptr;
2607 if (!dev)
2608 return;
2609 privptr = dev->priv;
2610 if (privptr) {
2611 if (privptr->fsm)
2612 kfree_fsm(privptr->fsm);
2613 kfree(privptr);
2614 }
2615#ifdef MODULE
2616 if (free_dev)
2617 free_netdev(dev);
2618#endif
2619}
2620
Linus Torvalds1da177e2005-04-16 15:20:36 -07002621static ssize_t
Yani Ioannou3fd3c0a2005-05-17 06:43:27 -04002622ctc_proto_show(struct device *dev, struct device_attribute *attr, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002623{
2624 struct ctc_priv *priv;
2625
2626 priv = dev->driver_data;
2627 if (!priv)
2628 return -ENODEV;
2629
2630 return sprintf(buf, "%d\n", priv->protocol);
2631}
2632
2633static ssize_t
Yani Ioannou3fd3c0a2005-05-17 06:43:27 -04002634ctc_proto_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002635{
2636 struct ctc_priv *priv;
2637 int value;
2638
2639 DBF_TEXT(trace, 3, __FUNCTION__);
2640 pr_debug("%s() called\n", __FUNCTION__);
2641
2642 priv = dev->driver_data;
2643 if (!priv)
2644 return -ENODEV;
2645 sscanf(buf, "%u", &value);
Frank Pavlic56347a22006-04-13 20:19:12 +02002646 if (!((value == CTC_PROTO_S390) ||
2647 (value == CTC_PROTO_LINUX) ||
2648 (value == CTC_PROTO_OS390)))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002649 return -EINVAL;
2650 priv->protocol = value;
2651
2652 return count;
2653}
2654
Linus Torvalds1da177e2005-04-16 15:20:36 -07002655static ssize_t
Yani Ioannou3fd3c0a2005-05-17 06:43:27 -04002656ctc_type_show(struct device *dev, struct device_attribute *attr, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002657{
2658 struct ccwgroup_device *cgdev;
2659
2660 cgdev = to_ccwgroupdev(dev);
2661 if (!cgdev)
2662 return -ENODEV;
2663
2664 return sprintf(buf, "%s\n", cu3088_type[cgdev->cdev[0]->id.driver_info]);
2665}
2666
Frank Pavlic7394c922005-05-12 20:36:47 +02002667static DEVICE_ATTR(buffer, 0644, buffer_show, buffer_write);
2668static DEVICE_ATTR(protocol, 0644, ctc_proto_show, ctc_proto_store);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002669static DEVICE_ATTR(type, 0444, ctc_type_show, NULL);
2670
Frank Pavlic7394c922005-05-12 20:36:47 +02002671static DEVICE_ATTR(loglevel, 0644, loglevel_show, loglevel_write);
2672static DEVICE_ATTR(stats, 0644, stats_show, stats_write);
2673
Linus Torvalds1da177e2005-04-16 15:20:36 -07002674static struct attribute *ctc_attr[] = {
2675 &dev_attr_protocol.attr,
2676 &dev_attr_type.attr,
2677 &dev_attr_buffer.attr,
2678 NULL,
2679};
2680
2681static struct attribute_group ctc_attr_group = {
2682 .attrs = ctc_attr,
2683};
2684
2685static int
Frank Pavlic7394c922005-05-12 20:36:47 +02002686ctc_add_attributes(struct device *dev)
2687{
Heiko Carstensd7cf0d52006-07-18 13:46:58 +02002688 int rc;
2689
2690 rc = device_create_file(dev, &dev_attr_loglevel);
2691 if (rc)
2692 goto out;
2693 rc = device_create_file(dev, &dev_attr_stats);
2694 if (!rc)
2695 goto out;
2696 device_remove_file(dev, &dev_attr_loglevel);
2697out:
2698 return rc;
Frank Pavlic7394c922005-05-12 20:36:47 +02002699}
2700
2701static void
2702ctc_remove_attributes(struct device *dev)
2703{
2704 device_remove_file(dev, &dev_attr_stats);
2705 device_remove_file(dev, &dev_attr_loglevel);
2706}
2707
2708static int
Linus Torvalds1da177e2005-04-16 15:20:36 -07002709ctc_add_files(struct device *dev)
2710{
2711 pr_debug("%s() called\n", __FUNCTION__);
2712
2713 return sysfs_create_group(&dev->kobj, &ctc_attr_group);
2714}
2715
2716static void
2717ctc_remove_files(struct device *dev)
2718{
2719 pr_debug("%s() called\n", __FUNCTION__);
2720
2721 sysfs_remove_group(&dev->kobj, &ctc_attr_group);
2722}
2723
2724/**
2725 * Add ctc specific attributes.
2726 * Add ctc private data.
Jeff Garzike82b0f22006-05-26 21:58:38 -04002727 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07002728 * @param cgdev pointer to ccwgroup_device just added
2729 *
2730 * @returns 0 on success, !0 on failure.
2731 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002732static int
2733ctc_probe_device(struct ccwgroup_device *cgdev)
2734{
2735 struct ctc_priv *priv;
2736 int rc;
Frank Pavlic7394c922005-05-12 20:36:47 +02002737 char buffer[16];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002738
2739 pr_debug("%s() called\n", __FUNCTION__);
Frank Pavlic7394c922005-05-12 20:36:47 +02002740 DBF_TEXT(setup, 3, __FUNCTION__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002741
2742 if (!get_device(&cgdev->dev))
2743 return -ENODEV;
2744
Ahmed S. Darwishb7127df2007-04-27 16:01:50 +02002745 priv = kzalloc(sizeof(struct ctc_priv), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002746 if (!priv) {
2747 ctc_pr_err("%s: Out of memory\n", __func__);
2748 put_device(&cgdev->dev);
2749 return -ENOMEM;
2750 }
2751
Linus Torvalds1da177e2005-04-16 15:20:36 -07002752 rc = ctc_add_files(&cgdev->dev);
2753 if (rc) {
2754 kfree(priv);
2755 put_device(&cgdev->dev);
2756 return rc;
2757 }
2758 priv->buffer_size = CTC_BUFSIZE_DEFAULT;
2759 cgdev->cdev[0]->handler = ctc_irq_handler;
2760 cgdev->cdev[1]->handler = ctc_irq_handler;
2761 cgdev->dev.driver_data = priv;
2762
Frank Pavlic7394c922005-05-12 20:36:47 +02002763 sprintf(buffer, "%p", priv);
2764 DBF_TEXT(data, 3, buffer);
2765
2766 sprintf(buffer, "%u", (unsigned int)sizeof(struct ctc_priv));
2767 DBF_TEXT(data, 3, buffer);
2768
2769 sprintf(buffer, "%p", &channels);
2770 DBF_TEXT(data, 3, buffer);
2771
2772 sprintf(buffer, "%u", (unsigned int)sizeof(struct channel));
2773 DBF_TEXT(data, 3, buffer);
2774
Linus Torvalds1da177e2005-04-16 15:20:36 -07002775 return 0;
2776}
2777
2778/**
Frank Pavlic7394c922005-05-12 20:36:47 +02002779 * Initialize everything of the net device except the name and the
2780 * channel structs.
2781 */
2782static struct net_device *
2783ctc_init_netdevice(struct net_device * dev, int alloc_device,
2784 struct ctc_priv *privptr)
2785{
2786 if (!privptr)
2787 return NULL;
2788
2789 DBF_TEXT(setup, 3, __FUNCTION__);
2790
2791 if (alloc_device) {
Ahmed S. Darwishb7127df2007-04-27 16:01:50 +02002792 dev = kzalloc(sizeof(struct net_device), GFP_KERNEL);
Frank Pavlic7394c922005-05-12 20:36:47 +02002793 if (!dev)
2794 return NULL;
Frank Pavlic7394c922005-05-12 20:36:47 +02002795 }
2796
2797 dev->priv = privptr;
2798 privptr->fsm = init_fsm("ctcdev", dev_state_names,
2799 dev_event_names, CTC_NR_DEV_STATES, CTC_NR_DEV_EVENTS,
2800 dev_fsm, DEV_FSM_LEN, GFP_KERNEL);
2801 if (privptr->fsm == NULL) {
2802 if (alloc_device)
2803 kfree(dev);
2804 return NULL;
2805 }
2806 fsm_newstate(privptr->fsm, DEV_STATE_STOPPED);
2807 fsm_settimer(privptr->fsm, &privptr->restart_timer);
2808 if (dev->mtu == 0)
2809 dev->mtu = CTC_BUFSIZE_DEFAULT - LL_HEADER_LENGTH - 2;
2810 dev->hard_start_xmit = ctc_tx;
2811 dev->open = ctc_open;
2812 dev->stop = ctc_close;
2813 dev->get_stats = ctc_stats;
2814 dev->change_mtu = ctc_change_mtu;
2815 dev->hard_header_len = LL_HEADER_LENGTH + 2;
2816 dev->addr_len = 0;
2817 dev->type = ARPHRD_SLIP;
2818 dev->tx_queue_len = 100;
2819 dev->flags = IFF_POINTOPOINT | IFF_NOARP;
2820 SET_MODULE_OWNER(dev);
2821 return dev;
2822}
2823
2824
2825/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07002826 *
2827 * Setup an interface.
2828 *
2829 * @param cgdev Device to be setup.
2830 *
2831 * @returns 0 on success, !0 on failure.
2832 */
2833static int
2834ctc_new_device(struct ccwgroup_device *cgdev)
2835{
2836 char read_id[CTC_ID_SIZE];
2837 char write_id[CTC_ID_SIZE];
2838 int direction;
2839 enum channel_types type;
2840 struct ctc_priv *privptr;
2841 struct net_device *dev;
2842 int ret;
Frank Pavlic7394c922005-05-12 20:36:47 +02002843 char buffer[16];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002844
2845 pr_debug("%s() called\n", __FUNCTION__);
2846 DBF_TEXT(setup, 3, __FUNCTION__);
2847
2848 privptr = cgdev->dev.driver_data;
2849 if (!privptr)
2850 return -ENODEV;
2851
Frank Pavlic7394c922005-05-12 20:36:47 +02002852 sprintf(buffer, "%d", privptr->buffer_size);
2853 DBF_TEXT(setup, 3, buffer);
2854
Linus Torvalds1da177e2005-04-16 15:20:36 -07002855 type = get_channel_type(&cgdev->cdev[0]->id);
Jeff Garzike82b0f22006-05-26 21:58:38 -04002856
Linus Torvalds1da177e2005-04-16 15:20:36 -07002857 snprintf(read_id, CTC_ID_SIZE, "ch-%s", cgdev->cdev[0]->dev.bus_id);
2858 snprintf(write_id, CTC_ID_SIZE, "ch-%s", cgdev->cdev[1]->dev.bus_id);
2859
2860 if (add_channel(cgdev->cdev[0], type))
2861 return -ENOMEM;
2862 if (add_channel(cgdev->cdev[1], type))
2863 return -ENOMEM;
2864
2865 ret = ccw_device_set_online(cgdev->cdev[0]);
2866 if (ret != 0) {
2867 printk(KERN_WARNING
2868 "ccw_device_set_online (cdev[0]) failed with ret = %d\n", ret);
2869 }
2870
2871 ret = ccw_device_set_online(cgdev->cdev[1]);
2872 if (ret != 0) {
2873 printk(KERN_WARNING
2874 "ccw_device_set_online (cdev[1]) failed with ret = %d\n", ret);
2875 }
2876
2877 dev = ctc_init_netdevice(NULL, 1, privptr);
2878
2879 if (!dev) {
2880 ctc_pr_warn("ctc_init_netdevice failed\n");
2881 goto out;
2882 }
2883
Frank Pavlic56347a22006-04-13 20:19:12 +02002884 strlcpy(dev->name, "ctc%d", IFNAMSIZ);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002885
2886 for (direction = READ; direction <= WRITE; direction++) {
2887 privptr->channel[direction] =
2888 channel_get(type, direction == READ ? read_id : write_id,
2889 direction);
2890 if (privptr->channel[direction] == NULL) {
Jeff Garzike82b0f22006-05-26 21:58:38 -04002891 if (direction == WRITE)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002892 channel_free(privptr->channel[READ]);
2893
2894 ctc_free_netdevice(dev, 1);
2895 goto out;
2896 }
2897 privptr->channel[direction]->netdev = dev;
2898 privptr->channel[direction]->protocol = privptr->protocol;
2899 privptr->channel[direction]->max_bufsize = privptr->buffer_size;
2900 }
2901 /* sysfs magic */
2902 SET_NETDEV_DEV(dev, &cgdev->dev);
2903
2904 if (ctc_netdev_register(dev) != 0) {
2905 ctc_free_netdevice(dev, 1);
2906 goto out;
2907 }
2908
Heiko Carstensd7cf0d52006-07-18 13:46:58 +02002909 if (ctc_add_attributes(&cgdev->dev)) {
2910 ctc_netdev_unregister(dev);
2911 dev->priv = NULL;
2912 ctc_free_netdevice(dev, 1);
2913 goto out;
2914 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002915
2916 strlcpy(privptr->fsm->name, dev->name, sizeof (privptr->fsm->name));
2917
2918 print_banner();
2919
2920 ctc_pr_info("%s: read: %s, write: %s, proto: %d\n",
2921 dev->name, privptr->channel[READ]->id,
2922 privptr->channel[WRITE]->id, privptr->protocol);
2923
2924 return 0;
2925out:
2926 ccw_device_set_offline(cgdev->cdev[1]);
2927 ccw_device_set_offline(cgdev->cdev[0]);
2928
2929 return -ENODEV;
2930}
2931
2932/**
2933 * Shutdown an interface.
2934 *
2935 * @param cgdev Device to be shut down.
2936 *
2937 * @returns 0 on success, !0 on failure.
2938 */
2939static int
2940ctc_shutdown_device(struct ccwgroup_device *cgdev)
2941{
2942 struct ctc_priv *priv;
2943 struct net_device *ndev;
Jeff Garzike82b0f22006-05-26 21:58:38 -04002944
Frank Pavlic7394c922005-05-12 20:36:47 +02002945 DBF_TEXT(setup, 3, __FUNCTION__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002946 pr_debug("%s() called\n", __FUNCTION__);
2947
Frank Pavlic7394c922005-05-12 20:36:47 +02002948
Linus Torvalds1da177e2005-04-16 15:20:36 -07002949 priv = cgdev->dev.driver_data;
2950 ndev = NULL;
2951 if (!priv)
2952 return -ENODEV;
2953
2954 if (priv->channel[READ]) {
2955 ndev = priv->channel[READ]->netdev;
2956
2957 /* Close the device */
2958 ctc_close(ndev);
2959 ndev->flags &=~IFF_RUNNING;
2960
2961 ctc_remove_attributes(&cgdev->dev);
2962
2963 channel_free(priv->channel[READ]);
2964 }
2965 if (priv->channel[WRITE])
2966 channel_free(priv->channel[WRITE]);
2967
2968 if (ndev) {
2969 ctc_netdev_unregister(ndev);
2970 ndev->priv = NULL;
2971 ctc_free_netdevice(ndev, 1);
2972 }
2973
2974 if (priv->fsm)
2975 kfree_fsm(priv->fsm);
2976
2977 ccw_device_set_offline(cgdev->cdev[1]);
2978 ccw_device_set_offline(cgdev->cdev[0]);
2979
2980 if (priv->channel[READ])
2981 channel_remove(priv->channel[READ]);
2982 if (priv->channel[WRITE])
2983 channel_remove(priv->channel[WRITE]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002984 priv->channel[READ] = priv->channel[WRITE] = NULL;
2985
2986 return 0;
2987
2988}
2989
2990static void
2991ctc_remove_device(struct ccwgroup_device *cgdev)
2992{
2993 struct ctc_priv *priv;
2994
2995 pr_debug("%s() called\n", __FUNCTION__);
Frank Pavlic7394c922005-05-12 20:36:47 +02002996 DBF_TEXT(setup, 3, __FUNCTION__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002997
2998 priv = cgdev->dev.driver_data;
2999 if (!priv)
3000 return;
3001 if (cgdev->state == CCWGROUP_ONLINE)
3002 ctc_shutdown_device(cgdev);
3003 ctc_remove_files(&cgdev->dev);
3004 cgdev->dev.driver_data = NULL;
3005 kfree(priv);
3006 put_device(&cgdev->dev);
3007}
3008
3009static struct ccwgroup_driver ctc_group_driver = {
3010 .owner = THIS_MODULE,
3011 .name = "ctc",
3012 .max_slaves = 2,
3013 .driver_id = 0xC3E3C3,
3014 .probe = ctc_probe_device,
3015 .remove = ctc_remove_device,
3016 .set_online = ctc_new_device,
3017 .set_offline = ctc_shutdown_device,
3018};
3019
3020/**
3021 * Module related routines
3022 *****************************************************************************/
3023
3024/**
3025 * Prepare to be unloaded. Free IRQ's and release all resources.
3026 * This is called just before this module is unloaded. It is
3027 * <em>not</em> called, if the usage count is !0, so we don't need to check
3028 * for that.
3029 */
3030static void __exit
3031ctc_exit(void)
3032{
Frank Pavlic7394c922005-05-12 20:36:47 +02003033 DBF_TEXT(setup, 3, __FUNCTION__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003034 unregister_cu3088_discipline(&ctc_group_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003035 ctc_unregister_dbf_views();
3036 ctc_pr_info("CTC driver unloaded\n");
3037}
3038
3039/**
3040 * Initialize module.
3041 * This is called just after the module is loaded.
3042 *
3043 * @return 0 on success, !0 on error.
3044 */
3045static int __init
3046ctc_init(void)
3047{
3048 int ret = 0;
3049
Frank Pavlic7394c922005-05-12 20:36:47 +02003050 loglevel = CTC_LOGLEVEL_DEFAULT;
3051
3052 DBF_TEXT(setup, 3, __FUNCTION__);
3053
Linus Torvalds1da177e2005-04-16 15:20:36 -07003054 print_banner();
3055
3056 ret = ctc_register_dbf_views();
3057 if (ret){
3058 ctc_pr_crit("ctc_init failed with ctc_register_dbf_views rc = %d\n", ret);
3059 return ret;
3060 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003061 ret = register_cu3088_discipline(&ctc_group_driver);
3062 if (ret) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003063 ctc_unregister_dbf_views();
3064 }
3065 return ret;
3066}
3067
3068module_init(ctc_init);
3069module_exit(ctc_exit);
3070
3071/* --- This is the END my friend --- */