Linux 2.6.17.7
[linux/fpc-iii.git] / drivers / s390 / net / netiucv.c
blobb452cc1afd550a5c7c24ed4bde87db498539952c
1 /*
2 * IUCV network driver
4 * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
5 * Author(s): Fritz Elfert (elfert@de.ibm.com, felfert@millenux.com)
7 * Sysfs integration and all bugs therein by Cornelia Huck
8 * (cornelia.huck@de.ibm.com)
10 * Documentation used:
11 * the source of the original IUCV driver by:
12 * Stefan Hegewald <hegewald@de.ibm.com>
13 * Hartmut Penner <hpenner@de.ibm.com>
14 * Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
15 * Martin Schwidefsky (schwidefsky@de.ibm.com)
16 * Alan Altmark (Alan_Altmark@us.ibm.com) Sept. 2000
18 * This program is free software; you can redistribute it and/or modify
19 * it under the terms of the GNU General Public License as published by
20 * the Free Software Foundation; either version 2, or (at your option)
21 * any later version.
23 * This program is distributed in the hope that it will be useful,
24 * but WITHOUT ANY WARRANTY; without even the implied warranty of
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26 * GNU General Public License for more details.
28 * You should have received a copy of the GNU General Public License
29 * along with this program; if not, write to the Free Software
30 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
34 #undef DEBUG
36 #include <linux/module.h>
37 #include <linux/init.h>
38 #include <linux/kernel.h>
39 #include <linux/slab.h>
40 #include <linux/errno.h>
41 #include <linux/types.h>
42 #include <linux/interrupt.h>
43 #include <linux/timer.h>
44 #include <linux/sched.h>
45 #include <linux/bitops.h>
47 #include <linux/signal.h>
48 #include <linux/string.h>
49 #include <linux/device.h>
51 #include <linux/ip.h>
52 #include <linux/if_arp.h>
53 #include <linux/tcp.h>
54 #include <linux/skbuff.h>
55 #include <linux/ctype.h>
56 #include <net/dst.h>
58 #include <asm/io.h>
59 #include <asm/uaccess.h>
61 #include "iucv.h"
62 #include "fsm.h"
64 MODULE_AUTHOR
65 ("(C) 2001 IBM Corporation by Fritz Elfert (felfert@millenux.com)");
66 MODULE_DESCRIPTION ("Linux for S/390 IUCV network driver");
69 #define PRINTK_HEADER " iucv: " /* for debugging */
71 static struct device_driver netiucv_driver = {
72 .name = "netiucv",
73 .bus = &iucv_bus,
76 /**
77 * Per connection profiling data
79 struct connection_profile {
80 unsigned long maxmulti;
81 unsigned long maxcqueue;
82 unsigned long doios_single;
83 unsigned long doios_multi;
84 unsigned long txlen;
85 unsigned long tx_time;
86 struct timespec send_stamp;
87 unsigned long tx_pending;
88 unsigned long tx_max_pending;
91 /**
92 * Representation of one iucv connection
94 struct iucv_connection {
95 struct iucv_connection *next;
96 iucv_handle_t handle;
97 __u16 pathid;
98 struct sk_buff *rx_buff;
99 struct sk_buff *tx_buff;
100 struct sk_buff_head collect_queue;
101 struct sk_buff_head commit_queue;
102 spinlock_t collect_lock;
103 int collect_len;
104 int max_buffsize;
105 fsm_timer timer;
106 fsm_instance *fsm;
107 struct net_device *netdev;
108 struct connection_profile prof;
109 char userid[9];
113 * Linked list of all connection structs.
115 static struct iucv_connection *iucv_connections;
118 * Representation of event-data for the
119 * connection state machine.
121 struct iucv_event {
122 struct iucv_connection *conn;
123 void *data;
127 * Private part of the network device structure
129 struct netiucv_priv {
130 struct net_device_stats stats;
131 unsigned long tbusy;
132 fsm_instance *fsm;
133 struct iucv_connection *conn;
134 struct device *dev;
138 * Link level header for a packet.
140 typedef struct ll_header_t {
141 __u16 next;
142 } ll_header;
144 #define NETIUCV_HDRLEN (sizeof(ll_header))
145 #define NETIUCV_BUFSIZE_MAX 32768
146 #define NETIUCV_BUFSIZE_DEFAULT NETIUCV_BUFSIZE_MAX
147 #define NETIUCV_MTU_MAX (NETIUCV_BUFSIZE_MAX - NETIUCV_HDRLEN)
148 #define NETIUCV_MTU_DEFAULT 9216
149 #define NETIUCV_QUEUELEN_DEFAULT 50
150 #define NETIUCV_TIMEOUT_5SEC 5000
153 * Compatibility macros for busy handling
154 * of network devices.
156 static __inline__ void netiucv_clear_busy(struct net_device *dev)
158 clear_bit(0, &(((struct netiucv_priv *)dev->priv)->tbusy));
159 netif_wake_queue(dev);
162 static __inline__ int netiucv_test_and_set_busy(struct net_device *dev)
164 netif_stop_queue(dev);
165 return test_and_set_bit(0, &((struct netiucv_priv *)dev->priv)->tbusy);
168 static __u8 iucv_host[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
169 static __u8 iucvMagic[16] = {
170 0xF0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
171 0xF0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40
175 * This mask means the 16-byte IUCV "magic" and the origin userid must
176 * match exactly as specified in order to give connection_pending()
177 * control.
179 static __u8 netiucv_mask[] = {
180 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
181 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
182 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
186 * Convert an iucv userId to its printable
187 * form (strip whitespace at end).
189 * @param An iucv userId
191 * @returns The printable string (static data!!)
193 static __inline__ char *
194 netiucv_printname(char *name)
196 static char tmp[9];
197 char *p = tmp;
198 memcpy(tmp, name, 8);
199 tmp[8] = '\0';
200 while (*p && (!isspace(*p)))
201 p++;
202 *p = '\0';
203 return tmp;
207 * States of the interface statemachine.
209 enum dev_states {
210 DEV_STATE_STOPPED,
211 DEV_STATE_STARTWAIT,
212 DEV_STATE_STOPWAIT,
213 DEV_STATE_RUNNING,
215 * MUST be always the last element!!
217 NR_DEV_STATES
220 static const char *dev_state_names[] = {
221 "Stopped",
222 "StartWait",
223 "StopWait",
224 "Running",
228 * Events of the interface statemachine.
230 enum dev_events {
231 DEV_EVENT_START,
232 DEV_EVENT_STOP,
233 DEV_EVENT_CONUP,
234 DEV_EVENT_CONDOWN,
236 * MUST be always the last element!!
238 NR_DEV_EVENTS
241 static const char *dev_event_names[] = {
242 "Start",
243 "Stop",
244 "Connection up",
245 "Connection down",
249 * Events of the connection statemachine
251 enum conn_events {
253 * Events, representing callbacks from
254 * lowlevel iucv layer)
256 CONN_EVENT_CONN_REQ,
257 CONN_EVENT_CONN_ACK,
258 CONN_EVENT_CONN_REJ,
259 CONN_EVENT_CONN_SUS,
260 CONN_EVENT_CONN_RES,
261 CONN_EVENT_RX,
262 CONN_EVENT_TXDONE,
265 * Events, representing errors return codes from
266 * calls to lowlevel iucv layer
270 * Event, representing timer expiry.
272 CONN_EVENT_TIMER,
275 * Events, representing commands from upper levels.
277 CONN_EVENT_START,
278 CONN_EVENT_STOP,
281 * MUST be always the last element!!
283 NR_CONN_EVENTS,
286 static const char *conn_event_names[] = {
287 "Remote connection request",
288 "Remote connection acknowledge",
289 "Remote connection reject",
290 "Connection suspended",
291 "Connection resumed",
292 "Data received",
293 "Data sent",
295 "Timer",
297 "Start",
298 "Stop",
302 * States of the connection statemachine.
304 enum conn_states {
306 * Connection not assigned to any device,
307 * initial state, invalid
309 CONN_STATE_INVALID,
312 * Userid assigned but not operating
314 CONN_STATE_STOPPED,
317 * Connection registered,
318 * no connection request sent yet,
319 * no connection request received
321 CONN_STATE_STARTWAIT,
324 * Connection registered and connection request sent,
325 * no acknowledge and no connection request received yet.
327 CONN_STATE_SETUPWAIT,
330 * Connection up and running idle
332 CONN_STATE_IDLE,
335 * Data sent, awaiting CONN_EVENT_TXDONE
337 CONN_STATE_TX,
340 * Error during registration.
342 CONN_STATE_REGERR,
345 * Error during registration.
347 CONN_STATE_CONNERR,
350 * MUST be always the last element!!
352 NR_CONN_STATES,
355 static const char *conn_state_names[] = {
356 "Invalid",
357 "Stopped",
358 "StartWait",
359 "SetupWait",
360 "Idle",
361 "TX",
362 "Terminating",
363 "Registration error",
364 "Connect error",
369 * Debug Facility Stuff
371 static debug_info_t *iucv_dbf_setup = NULL;
372 static debug_info_t *iucv_dbf_data = NULL;
373 static debug_info_t *iucv_dbf_trace = NULL;
375 DEFINE_PER_CPU(char[256], iucv_dbf_txt_buf);
377 static void
378 iucv_unregister_dbf_views(void)
380 if (iucv_dbf_setup)
381 debug_unregister(iucv_dbf_setup);
382 if (iucv_dbf_data)
383 debug_unregister(iucv_dbf_data);
384 if (iucv_dbf_trace)
385 debug_unregister(iucv_dbf_trace);
387 static int
388 iucv_register_dbf_views(void)
390 iucv_dbf_setup = debug_register(IUCV_DBF_SETUP_NAME,
391 IUCV_DBF_SETUP_PAGES,
392 IUCV_DBF_SETUP_NR_AREAS,
393 IUCV_DBF_SETUP_LEN);
394 iucv_dbf_data = debug_register(IUCV_DBF_DATA_NAME,
395 IUCV_DBF_DATA_PAGES,
396 IUCV_DBF_DATA_NR_AREAS,
397 IUCV_DBF_DATA_LEN);
398 iucv_dbf_trace = debug_register(IUCV_DBF_TRACE_NAME,
399 IUCV_DBF_TRACE_PAGES,
400 IUCV_DBF_TRACE_NR_AREAS,
401 IUCV_DBF_TRACE_LEN);
403 if ((iucv_dbf_setup == NULL) || (iucv_dbf_data == NULL) ||
404 (iucv_dbf_trace == NULL)) {
405 iucv_unregister_dbf_views();
406 return -ENOMEM;
408 debug_register_view(iucv_dbf_setup, &debug_hex_ascii_view);
409 debug_set_level(iucv_dbf_setup, IUCV_DBF_SETUP_LEVEL);
411 debug_register_view(iucv_dbf_data, &debug_hex_ascii_view);
412 debug_set_level(iucv_dbf_data, IUCV_DBF_DATA_LEVEL);
414 debug_register_view(iucv_dbf_trace, &debug_hex_ascii_view);
415 debug_set_level(iucv_dbf_trace, IUCV_DBF_TRACE_LEVEL);
417 return 0;
421 * Callback-wrappers, called from lowlevel iucv layer.
422 *****************************************************************************/
424 static void
425 netiucv_callback_rx(iucv_MessagePending *eib, void *pgm_data)
427 struct iucv_connection *conn = (struct iucv_connection *)pgm_data;
428 struct iucv_event ev;
430 ev.conn = conn;
431 ev.data = (void *)eib;
433 fsm_event(conn->fsm, CONN_EVENT_RX, &ev);
436 static void
437 netiucv_callback_txdone(iucv_MessageComplete *eib, void *pgm_data)
439 struct iucv_connection *conn = (struct iucv_connection *)pgm_data;
440 struct iucv_event ev;
442 ev.conn = conn;
443 ev.data = (void *)eib;
444 fsm_event(conn->fsm, CONN_EVENT_TXDONE, &ev);
447 static void
448 netiucv_callback_connack(iucv_ConnectionComplete *eib, void *pgm_data)
450 struct iucv_connection *conn = (struct iucv_connection *)pgm_data;
451 struct iucv_event ev;
453 ev.conn = conn;
454 ev.data = (void *)eib;
455 fsm_event(conn->fsm, CONN_EVENT_CONN_ACK, &ev);
458 static void
459 netiucv_callback_connreq(iucv_ConnectionPending *eib, void *pgm_data)
461 struct iucv_connection *conn = (struct iucv_connection *)pgm_data;
462 struct iucv_event ev;
464 ev.conn = conn;
465 ev.data = (void *)eib;
466 fsm_event(conn->fsm, CONN_EVENT_CONN_REQ, &ev);
469 static void
470 netiucv_callback_connrej(iucv_ConnectionSevered *eib, void *pgm_data)
472 struct iucv_connection *conn = (struct iucv_connection *)pgm_data;
473 struct iucv_event ev;
475 ev.conn = conn;
476 ev.data = (void *)eib;
477 fsm_event(conn->fsm, CONN_EVENT_CONN_REJ, &ev);
480 static void
481 netiucv_callback_connsusp(iucv_ConnectionQuiesced *eib, void *pgm_data)
483 struct iucv_connection *conn = (struct iucv_connection *)pgm_data;
484 struct iucv_event ev;
486 ev.conn = conn;
487 ev.data = (void *)eib;
488 fsm_event(conn->fsm, CONN_EVENT_CONN_SUS, &ev);
491 static void
492 netiucv_callback_connres(iucv_ConnectionResumed *eib, void *pgm_data)
494 struct iucv_connection *conn = (struct iucv_connection *)pgm_data;
495 struct iucv_event ev;
497 ev.conn = conn;
498 ev.data = (void *)eib;
499 fsm_event(conn->fsm, CONN_EVENT_CONN_RES, &ev);
502 static iucv_interrupt_ops_t netiucv_ops = {
503 .ConnectionPending = netiucv_callback_connreq,
504 .ConnectionComplete = netiucv_callback_connack,
505 .ConnectionSevered = netiucv_callback_connrej,
506 .ConnectionQuiesced = netiucv_callback_connsusp,
507 .ConnectionResumed = netiucv_callback_connres,
508 .MessagePending = netiucv_callback_rx,
509 .MessageComplete = netiucv_callback_txdone
513 * Dummy NOP action for all statemachines
515 static void
516 fsm_action_nop(fsm_instance *fi, int event, void *arg)
521 * Actions of the connection statemachine
522 *****************************************************************************/
525 * Helper function for conn_action_rx()
526 * Unpack a just received skb and hand it over to
527 * upper layers.
529 * @param conn The connection where this skb has been received.
530 * @param pskb The received skb.
532 //static __inline__ void
533 static void
534 netiucv_unpack_skb(struct iucv_connection *conn, struct sk_buff *pskb)
536 struct net_device *dev = conn->netdev;
537 struct netiucv_priv *privptr = dev->priv;
538 __u16 offset = 0;
540 skb_put(pskb, NETIUCV_HDRLEN);
541 pskb->dev = dev;
542 pskb->ip_summed = CHECKSUM_NONE;
543 pskb->protocol = ntohs(ETH_P_IP);
545 while (1) {
546 struct sk_buff *skb;
547 ll_header *header = (ll_header *)pskb->data;
549 if (!header->next)
550 break;
552 skb_pull(pskb, NETIUCV_HDRLEN);
553 header->next -= offset;
554 offset += header->next;
555 header->next -= NETIUCV_HDRLEN;
556 if (skb_tailroom(pskb) < header->next) {
557 PRINT_WARN("%s: Illegal next field in iucv header: "
558 "%d > %d\n",
559 dev->name, header->next, skb_tailroom(pskb));
560 IUCV_DBF_TEXT_(data, 2, "Illegal next field: %d > %d\n",
561 header->next, skb_tailroom(pskb));
562 return;
564 skb_put(pskb, header->next);
565 pskb->mac.raw = pskb->data;
566 skb = dev_alloc_skb(pskb->len);
567 if (!skb) {
568 PRINT_WARN("%s Out of memory in netiucv_unpack_skb\n",
569 dev->name);
570 IUCV_DBF_TEXT(data, 2,
571 "Out of memory in netiucv_unpack_skb\n");
572 privptr->stats.rx_dropped++;
573 return;
575 memcpy(skb_put(skb, pskb->len), pskb->data, pskb->len);
576 skb->mac.raw = skb->data;
577 skb->dev = pskb->dev;
578 skb->protocol = pskb->protocol;
579 pskb->ip_summed = CHECKSUM_UNNECESSARY;
581 * Since receiving is always initiated from a tasklet (in iucv.c),
582 * we must use netif_rx_ni() instead of netif_rx()
584 netif_rx_ni(skb);
585 dev->last_rx = jiffies;
586 privptr->stats.rx_packets++;
587 privptr->stats.rx_bytes += skb->len;
588 skb_pull(pskb, header->next);
589 skb_put(pskb, NETIUCV_HDRLEN);
593 static void
594 conn_action_rx(fsm_instance *fi, int event, void *arg)
596 struct iucv_event *ev = (struct iucv_event *)arg;
597 struct iucv_connection *conn = ev->conn;
598 iucv_MessagePending *eib = (iucv_MessagePending *)ev->data;
599 struct netiucv_priv *privptr =(struct netiucv_priv *)conn->netdev->priv;
601 __u32 msglen = eib->ln1msg2.ipbfln1f;
602 int rc;
604 IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
606 if (!conn->netdev) {
607 /* FRITZ: How to tell iucv LL to drop the msg? */
608 PRINT_WARN("Received data for unlinked connection\n");
609 IUCV_DBF_TEXT(data, 2,
610 "Received data for unlinked connection\n");
611 return;
613 if (msglen > conn->max_buffsize) {
614 /* FRITZ: How to tell iucv LL to drop the msg? */
615 privptr->stats.rx_dropped++;
616 PRINT_WARN("msglen %d > max_buffsize %d\n",
617 msglen, conn->max_buffsize);
618 IUCV_DBF_TEXT_(data, 2, "msglen %d > max_buffsize %d\n",
619 msglen, conn->max_buffsize);
620 return;
622 conn->rx_buff->data = conn->rx_buff->tail = conn->rx_buff->head;
623 conn->rx_buff->len = 0;
624 rc = iucv_receive(conn->pathid, eib->ipmsgid, eib->iptrgcls,
625 conn->rx_buff->data, msglen, NULL, NULL, NULL);
626 if (rc || msglen < 5) {
627 privptr->stats.rx_errors++;
628 PRINT_WARN("iucv_receive returned %08x\n", rc);
629 IUCV_DBF_TEXT_(data, 2, "rc %d from iucv_receive\n", rc);
630 return;
632 netiucv_unpack_skb(conn, conn->rx_buff);
635 static void
636 conn_action_txdone(fsm_instance *fi, int event, void *arg)
638 struct iucv_event *ev = (struct iucv_event *)arg;
639 struct iucv_connection *conn = ev->conn;
640 iucv_MessageComplete *eib = (iucv_MessageComplete *)ev->data;
641 struct netiucv_priv *privptr = NULL;
642 /* Shut up, gcc! skb is always below 2G. */
643 __u32 single_flag = eib->ipmsgtag;
644 __u32 txbytes = 0;
645 __u32 txpackets = 0;
646 __u32 stat_maxcq = 0;
647 struct sk_buff *skb;
648 unsigned long saveflags;
649 ll_header header;
651 IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
653 if (conn && conn->netdev && conn->netdev->priv)
654 privptr = (struct netiucv_priv *)conn->netdev->priv;
655 conn->prof.tx_pending--;
656 if (single_flag) {
657 if ((skb = skb_dequeue(&conn->commit_queue))) {
658 atomic_dec(&skb->users);
659 dev_kfree_skb_any(skb);
660 if (privptr) {
661 privptr->stats.tx_packets++;
662 privptr->stats.tx_bytes +=
663 (skb->len - NETIUCV_HDRLEN
664 - NETIUCV_HDRLEN);
668 conn->tx_buff->data = conn->tx_buff->tail = conn->tx_buff->head;
669 conn->tx_buff->len = 0;
670 spin_lock_irqsave(&conn->collect_lock, saveflags);
671 while ((skb = skb_dequeue(&conn->collect_queue))) {
672 header.next = conn->tx_buff->len + skb->len + NETIUCV_HDRLEN;
673 memcpy(skb_put(conn->tx_buff, NETIUCV_HDRLEN), &header,
674 NETIUCV_HDRLEN);
675 memcpy(skb_put(conn->tx_buff, skb->len), skb->data, skb->len);
676 txbytes += skb->len;
677 txpackets++;
678 stat_maxcq++;
679 atomic_dec(&skb->users);
680 dev_kfree_skb_any(skb);
682 if (conn->collect_len > conn->prof.maxmulti)
683 conn->prof.maxmulti = conn->collect_len;
684 conn->collect_len = 0;
685 spin_unlock_irqrestore(&conn->collect_lock, saveflags);
686 if (conn->tx_buff->len) {
687 int rc;
689 header.next = 0;
690 memcpy(skb_put(conn->tx_buff, NETIUCV_HDRLEN), &header,
691 NETIUCV_HDRLEN);
693 conn->prof.send_stamp = xtime;
694 rc = iucv_send(conn->pathid, NULL, 0, 0, 0, 0,
695 conn->tx_buff->data, conn->tx_buff->len);
696 conn->prof.doios_multi++;
697 conn->prof.txlen += conn->tx_buff->len;
698 conn->prof.tx_pending++;
699 if (conn->prof.tx_pending > conn->prof.tx_max_pending)
700 conn->prof.tx_max_pending = conn->prof.tx_pending;
701 if (rc) {
702 conn->prof.tx_pending--;
703 fsm_newstate(fi, CONN_STATE_IDLE);
704 if (privptr)
705 privptr->stats.tx_errors += txpackets;
706 PRINT_WARN("iucv_send returned %08x\n", rc);
707 IUCV_DBF_TEXT_(data, 2, "rc %d from iucv_send\n", rc);
708 } else {
709 if (privptr) {
710 privptr->stats.tx_packets += txpackets;
711 privptr->stats.tx_bytes += txbytes;
713 if (stat_maxcq > conn->prof.maxcqueue)
714 conn->prof.maxcqueue = stat_maxcq;
716 } else
717 fsm_newstate(fi, CONN_STATE_IDLE);
720 static void
721 conn_action_connaccept(fsm_instance *fi, int event, void *arg)
723 struct iucv_event *ev = (struct iucv_event *)arg;
724 struct iucv_connection *conn = ev->conn;
725 iucv_ConnectionPending *eib = (iucv_ConnectionPending *)ev->data;
726 struct net_device *netdev = conn->netdev;
727 struct netiucv_priv *privptr = (struct netiucv_priv *)netdev->priv;
728 int rc;
729 __u16 msglimit;
730 __u8 udata[16];
732 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
734 rc = iucv_accept(eib->ippathid, NETIUCV_QUEUELEN_DEFAULT, udata, 0,
735 conn->handle, conn, NULL, &msglimit);
736 if (rc) {
737 PRINT_WARN("%s: IUCV accept failed with error %d\n",
738 netdev->name, rc);
739 IUCV_DBF_TEXT_(setup, 2, "rc %d from iucv_accept", rc);
740 return;
742 fsm_newstate(fi, CONN_STATE_IDLE);
743 conn->pathid = eib->ippathid;
744 netdev->tx_queue_len = msglimit;
745 fsm_event(privptr->fsm, DEV_EVENT_CONUP, netdev);
748 static void
749 conn_action_connreject(fsm_instance *fi, int event, void *arg)
751 struct iucv_event *ev = (struct iucv_event *)arg;
752 struct iucv_connection *conn = ev->conn;
753 struct net_device *netdev = conn->netdev;
754 iucv_ConnectionPending *eib = (iucv_ConnectionPending *)ev->data;
755 __u8 udata[16];
757 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
759 iucv_sever(eib->ippathid, udata);
760 if (eib->ippathid != conn->pathid) {
761 PRINT_INFO("%s: IR Connection Pending; "
762 "pathid %d does not match original pathid %d\n",
763 netdev->name, eib->ippathid, conn->pathid);
764 IUCV_DBF_TEXT_(data, 2,
765 "connreject: IR pathid %d, conn. pathid %d\n",
766 eib->ippathid, conn->pathid);
767 iucv_sever(conn->pathid, udata);
771 static void
772 conn_action_connack(fsm_instance *fi, int event, void *arg)
774 struct iucv_event *ev = (struct iucv_event *)arg;
775 struct iucv_connection *conn = ev->conn;
776 iucv_ConnectionComplete *eib = (iucv_ConnectionComplete *)ev->data;
777 struct net_device *netdev = conn->netdev;
778 struct netiucv_priv *privptr = (struct netiucv_priv *)netdev->priv;
780 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
782 fsm_deltimer(&conn->timer);
783 fsm_newstate(fi, CONN_STATE_IDLE);
784 if (eib->ippathid != conn->pathid) {
785 PRINT_INFO("%s: IR Connection Complete; "
786 "pathid %d does not match original pathid %d\n",
787 netdev->name, eib->ippathid, conn->pathid);
788 IUCV_DBF_TEXT_(data, 2,
789 "connack: IR pathid %d, conn. pathid %d\n",
790 eib->ippathid, conn->pathid);
791 conn->pathid = eib->ippathid;
793 netdev->tx_queue_len = eib->ipmsglim;
794 fsm_event(privptr->fsm, DEV_EVENT_CONUP, netdev);
797 static void
798 conn_action_conntimsev(fsm_instance *fi, int event, void *arg)
800 struct iucv_connection *conn = (struct iucv_connection *)arg;
801 __u8 udata[16];
803 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
805 fsm_deltimer(&conn->timer);
806 iucv_sever(conn->pathid, udata);
807 fsm_newstate(fi, CONN_STATE_STARTWAIT);
810 static void
811 conn_action_connsever(fsm_instance *fi, int event, void *arg)
813 struct iucv_event *ev = (struct iucv_event *)arg;
814 struct iucv_connection *conn = ev->conn;
815 struct net_device *netdev = conn->netdev;
816 struct netiucv_priv *privptr = (struct netiucv_priv *)netdev->priv;
817 __u8 udata[16];
819 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
821 fsm_deltimer(&conn->timer);
822 iucv_sever(conn->pathid, udata);
823 PRINT_INFO("%s: Remote dropped connection\n", netdev->name);
824 IUCV_DBF_TEXT(data, 2,
825 "conn_action_connsever: Remote dropped connection\n");
826 fsm_newstate(fi, CONN_STATE_STARTWAIT);
827 fsm_event(privptr->fsm, DEV_EVENT_CONDOWN, netdev);
830 static void
831 conn_action_start(fsm_instance *fi, int event, void *arg)
833 struct iucv_event *ev = (struct iucv_event *)arg;
834 struct iucv_connection *conn = ev->conn;
835 __u16 msglimit;
836 int rc;
838 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
840 if (!conn->handle) {
841 IUCV_DBF_TEXT(trace, 5, "calling iucv_register_program\n");
842 conn->handle =
843 iucv_register_program(iucvMagic, conn->userid,
844 netiucv_mask,
845 &netiucv_ops, conn);
846 fsm_newstate(fi, CONN_STATE_STARTWAIT);
847 if (!conn->handle) {
848 fsm_newstate(fi, CONN_STATE_REGERR);
849 conn->handle = NULL;
850 IUCV_DBF_TEXT(setup, 2,
851 "NULL from iucv_register_program\n");
852 return;
855 PRINT_DEBUG("%s('%s'): registered successfully\n",
856 conn->netdev->name, conn->userid);
859 PRINT_DEBUG("%s('%s'): connecting ...\n",
860 conn->netdev->name, conn->userid);
862 /* We must set the state before calling iucv_connect because the callback
863 * handler could be called at any point after the connection request is
864 * sent */
866 fsm_newstate(fi, CONN_STATE_SETUPWAIT);
867 rc = iucv_connect(&(conn->pathid), NETIUCV_QUEUELEN_DEFAULT, iucvMagic,
868 conn->userid, iucv_host, 0, NULL, &msglimit,
869 conn->handle, conn);
870 switch (rc) {
871 case 0:
872 conn->netdev->tx_queue_len = msglimit;
873 fsm_addtimer(&conn->timer, NETIUCV_TIMEOUT_5SEC,
874 CONN_EVENT_TIMER, conn);
875 return;
876 case 11:
877 PRINT_INFO("%s: User %s is currently not available.\n",
878 conn->netdev->name,
879 netiucv_printname(conn->userid));
880 fsm_newstate(fi, CONN_STATE_STARTWAIT);
881 return;
882 case 12:
883 PRINT_INFO("%s: User %s is currently not ready.\n",
884 conn->netdev->name,
885 netiucv_printname(conn->userid));
886 fsm_newstate(fi, CONN_STATE_STARTWAIT);
887 return;
888 case 13:
889 PRINT_WARN("%s: Too many IUCV connections.\n",
890 conn->netdev->name);
891 fsm_newstate(fi, CONN_STATE_CONNERR);
892 break;
893 case 14:
894 PRINT_WARN(
895 "%s: User %s has too many IUCV connections.\n",
896 conn->netdev->name,
897 netiucv_printname(conn->userid));
898 fsm_newstate(fi, CONN_STATE_CONNERR);
899 break;
900 case 15:
901 PRINT_WARN(
902 "%s: No IUCV authorization in CP directory.\n",
903 conn->netdev->name);
904 fsm_newstate(fi, CONN_STATE_CONNERR);
905 break;
906 default:
907 PRINT_WARN("%s: iucv_connect returned error %d\n",
908 conn->netdev->name, rc);
909 fsm_newstate(fi, CONN_STATE_CONNERR);
910 break;
912 IUCV_DBF_TEXT_(setup, 5, "iucv_connect rc is %d\n", rc);
913 IUCV_DBF_TEXT(trace, 5, "calling iucv_unregister_program\n");
914 iucv_unregister_program(conn->handle);
915 conn->handle = NULL;
918 static void
919 netiucv_purge_skb_queue(struct sk_buff_head *q)
921 struct sk_buff *skb;
923 while ((skb = skb_dequeue(q))) {
924 atomic_dec(&skb->users);
925 dev_kfree_skb_any(skb);
929 static void
930 conn_action_stop(fsm_instance *fi, int event, void *arg)
932 struct iucv_event *ev = (struct iucv_event *)arg;
933 struct iucv_connection *conn = ev->conn;
934 struct net_device *netdev = conn->netdev;
935 struct netiucv_priv *privptr = (struct netiucv_priv *)netdev->priv;
937 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
939 fsm_deltimer(&conn->timer);
940 fsm_newstate(fi, CONN_STATE_STOPPED);
941 netiucv_purge_skb_queue(&conn->collect_queue);
942 if (conn->handle)
943 IUCV_DBF_TEXT(trace, 5, "calling iucv_unregister_program\n");
944 iucv_unregister_program(conn->handle);
945 conn->handle = NULL;
946 netiucv_purge_skb_queue(&conn->commit_queue);
947 fsm_event(privptr->fsm, DEV_EVENT_CONDOWN, netdev);
950 static void
951 conn_action_inval(fsm_instance *fi, int event, void *arg)
953 struct iucv_event *ev = (struct iucv_event *)arg;
954 struct iucv_connection *conn = ev->conn;
955 struct net_device *netdev = conn->netdev;
957 PRINT_WARN("%s: Cannot connect without username\n",
958 netdev->name);
959 IUCV_DBF_TEXT(data, 2, "conn_action_inval called\n");
962 static const fsm_node conn_fsm[] = {
963 { CONN_STATE_INVALID, CONN_EVENT_START, conn_action_inval },
964 { CONN_STATE_STOPPED, CONN_EVENT_START, conn_action_start },
966 { CONN_STATE_STOPPED, CONN_EVENT_STOP, conn_action_stop },
967 { CONN_STATE_STARTWAIT, CONN_EVENT_STOP, conn_action_stop },
968 { CONN_STATE_SETUPWAIT, CONN_EVENT_STOP, conn_action_stop },
969 { CONN_STATE_IDLE, CONN_EVENT_STOP, conn_action_stop },
970 { CONN_STATE_TX, CONN_EVENT_STOP, conn_action_stop },
971 { CONN_STATE_REGERR, CONN_EVENT_STOP, conn_action_stop },
972 { CONN_STATE_CONNERR, CONN_EVENT_STOP, conn_action_stop },
974 { CONN_STATE_STOPPED, CONN_EVENT_CONN_REQ, conn_action_connreject },
975 { CONN_STATE_STARTWAIT, CONN_EVENT_CONN_REQ, conn_action_connaccept },
976 { CONN_STATE_SETUPWAIT, CONN_EVENT_CONN_REQ, conn_action_connaccept },
977 { CONN_STATE_IDLE, CONN_EVENT_CONN_REQ, conn_action_connreject },
978 { CONN_STATE_TX, CONN_EVENT_CONN_REQ, conn_action_connreject },
980 { CONN_STATE_SETUPWAIT, CONN_EVENT_CONN_ACK, conn_action_connack },
981 { CONN_STATE_SETUPWAIT, CONN_EVENT_TIMER, conn_action_conntimsev },
983 { CONN_STATE_SETUPWAIT, CONN_EVENT_CONN_REJ, conn_action_connsever },
984 { CONN_STATE_IDLE, CONN_EVENT_CONN_REJ, conn_action_connsever },
985 { CONN_STATE_TX, CONN_EVENT_CONN_REJ, conn_action_connsever },
987 { CONN_STATE_IDLE, CONN_EVENT_RX, conn_action_rx },
988 { CONN_STATE_TX, CONN_EVENT_RX, conn_action_rx },
990 { CONN_STATE_TX, CONN_EVENT_TXDONE, conn_action_txdone },
991 { CONN_STATE_IDLE, CONN_EVENT_TXDONE, conn_action_txdone },
994 static const int CONN_FSM_LEN = sizeof(conn_fsm) / sizeof(fsm_node);
998 * Actions for interface - statemachine.
999 *****************************************************************************/
1002 * Startup connection by sending CONN_EVENT_START to it.
1004 * @param fi An instance of an interface statemachine.
1005 * @param event The event, just happened.
1006 * @param arg Generic pointer, casted from struct net_device * upon call.
1008 static void
1009 dev_action_start(fsm_instance *fi, int event, void *arg)
1011 struct net_device *dev = (struct net_device *)arg;
1012 struct netiucv_priv *privptr = dev->priv;
1013 struct iucv_event ev;
1015 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1017 ev.conn = privptr->conn;
1018 fsm_newstate(fi, DEV_STATE_STARTWAIT);
1019 fsm_event(privptr->conn->fsm, CONN_EVENT_START, &ev);
1023 * Shutdown connection by sending CONN_EVENT_STOP to it.
1025 * @param fi An instance of an interface statemachine.
1026 * @param event The event, just happened.
1027 * @param arg Generic pointer, casted from struct net_device * upon call.
1029 static void
1030 dev_action_stop(fsm_instance *fi, int event, void *arg)
1032 struct net_device *dev = (struct net_device *)arg;
1033 struct netiucv_priv *privptr = dev->priv;
1034 struct iucv_event ev;
1036 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1038 ev.conn = privptr->conn;
1040 fsm_newstate(fi, DEV_STATE_STOPWAIT);
1041 fsm_event(privptr->conn->fsm, CONN_EVENT_STOP, &ev);
1045 * Called from connection statemachine
1046 * when a connection is up and running.
1048 * @param fi An instance of an interface statemachine.
1049 * @param event The event, just happened.
1050 * @param arg Generic pointer, casted from struct net_device * upon call.
1052 static void
1053 dev_action_connup(fsm_instance *fi, int event, void *arg)
1055 struct net_device *dev = (struct net_device *)arg;
1056 struct netiucv_priv *privptr = dev->priv;
1058 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1060 switch (fsm_getstate(fi)) {
1061 case DEV_STATE_STARTWAIT:
1062 fsm_newstate(fi, DEV_STATE_RUNNING);
1063 PRINT_INFO("%s: connected with remote side %s\n",
1064 dev->name, privptr->conn->userid);
1065 IUCV_DBF_TEXT(setup, 3,
1066 "connection is up and running\n");
1067 break;
1068 case DEV_STATE_STOPWAIT:
1069 PRINT_INFO(
1070 "%s: got connection UP event during shutdown!\n",
1071 dev->name);
1072 IUCV_DBF_TEXT(data, 2,
1073 "dev_action_connup: in DEV_STATE_STOPWAIT\n");
1074 break;
1079 * Called from connection statemachine
1080 * when a connection has been shutdown.
1082 * @param fi An instance of an interface statemachine.
1083 * @param event The event, just happened.
1084 * @param arg Generic pointer, casted from struct net_device * upon call.
1086 static void
1087 dev_action_conndown(fsm_instance *fi, int event, void *arg)
1089 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1091 switch (fsm_getstate(fi)) {
1092 case DEV_STATE_RUNNING:
1093 fsm_newstate(fi, DEV_STATE_STARTWAIT);
1094 break;
1095 case DEV_STATE_STOPWAIT:
1096 fsm_newstate(fi, DEV_STATE_STOPPED);
1097 IUCV_DBF_TEXT(setup, 3, "connection is down\n");
1098 break;
1102 static const fsm_node dev_fsm[] = {
1103 { DEV_STATE_STOPPED, DEV_EVENT_START, dev_action_start },
1105 { DEV_STATE_STOPWAIT, DEV_EVENT_START, dev_action_start },
1106 { DEV_STATE_STOPWAIT, DEV_EVENT_CONDOWN, dev_action_conndown },
1108 { DEV_STATE_STARTWAIT, DEV_EVENT_STOP, dev_action_stop },
1109 { DEV_STATE_STARTWAIT, DEV_EVENT_CONUP, dev_action_connup },
1111 { DEV_STATE_RUNNING, DEV_EVENT_STOP, dev_action_stop },
1112 { DEV_STATE_RUNNING, DEV_EVENT_CONDOWN, dev_action_conndown },
1113 { DEV_STATE_RUNNING, DEV_EVENT_CONUP, fsm_action_nop },
1116 static const int DEV_FSM_LEN = sizeof(dev_fsm) / sizeof(fsm_node);
1119 * Transmit a packet.
1120 * This is a helper function for netiucv_tx().
1122 * @param conn Connection to be used for sending.
1123 * @param skb Pointer to struct sk_buff of packet to send.
1124 * The linklevel header has already been set up
1125 * by netiucv_tx().
1127 * @return 0 on success, -ERRNO on failure. (Never fails.)
1129 static int
1130 netiucv_transmit_skb(struct iucv_connection *conn, struct sk_buff *skb) {
1131 unsigned long saveflags;
1132 ll_header header;
1133 int rc = 0;
1135 if (fsm_getstate(conn->fsm) != CONN_STATE_IDLE) {
1136 int l = skb->len + NETIUCV_HDRLEN;
1138 spin_lock_irqsave(&conn->collect_lock, saveflags);
1139 if (conn->collect_len + l >
1140 (conn->max_buffsize - NETIUCV_HDRLEN)) {
1141 rc = -EBUSY;
1142 IUCV_DBF_TEXT(data, 2,
1143 "EBUSY from netiucv_transmit_skb\n");
1144 } else {
1145 atomic_inc(&skb->users);
1146 skb_queue_tail(&conn->collect_queue, skb);
1147 conn->collect_len += l;
1149 spin_unlock_irqrestore(&conn->collect_lock, saveflags);
1150 } else {
1151 struct sk_buff *nskb = skb;
1153 * Copy the skb to a new allocated skb in lowmem only if the
1154 * data is located above 2G in memory or tailroom is < 2.
1156 unsigned long hi =
1157 ((unsigned long)(skb->tail + NETIUCV_HDRLEN)) >> 31;
1158 int copied = 0;
1159 if (hi || (skb_tailroom(skb) < 2)) {
1160 nskb = alloc_skb(skb->len + NETIUCV_HDRLEN +
1161 NETIUCV_HDRLEN, GFP_ATOMIC | GFP_DMA);
1162 if (!nskb) {
1163 PRINT_WARN("%s: Could not allocate tx_skb\n",
1164 conn->netdev->name);
1165 IUCV_DBF_TEXT(data, 2, "alloc_skb failed\n");
1166 rc = -ENOMEM;
1167 return rc;
1168 } else {
1169 skb_reserve(nskb, NETIUCV_HDRLEN);
1170 memcpy(skb_put(nskb, skb->len),
1171 skb->data, skb->len);
1173 copied = 1;
1176 * skb now is below 2G and has enough room. Add headers.
1178 header.next = nskb->len + NETIUCV_HDRLEN;
1179 memcpy(skb_push(nskb, NETIUCV_HDRLEN), &header, NETIUCV_HDRLEN);
1180 header.next = 0;
1181 memcpy(skb_put(nskb, NETIUCV_HDRLEN), &header, NETIUCV_HDRLEN);
1183 fsm_newstate(conn->fsm, CONN_STATE_TX);
1184 conn->prof.send_stamp = xtime;
1186 rc = iucv_send(conn->pathid, NULL, 0, 0, 1 /* single_flag */,
1187 0, nskb->data, nskb->len);
1188 /* Shut up, gcc! nskb is always below 2G. */
1189 conn->prof.doios_single++;
1190 conn->prof.txlen += skb->len;
1191 conn->prof.tx_pending++;
1192 if (conn->prof.tx_pending > conn->prof.tx_max_pending)
1193 conn->prof.tx_max_pending = conn->prof.tx_pending;
1194 if (rc) {
1195 struct netiucv_priv *privptr;
1196 fsm_newstate(conn->fsm, CONN_STATE_IDLE);
1197 conn->prof.tx_pending--;
1198 privptr = (struct netiucv_priv *)conn->netdev->priv;
1199 if (privptr)
1200 privptr->stats.tx_errors++;
1201 if (copied)
1202 dev_kfree_skb(nskb);
1203 else {
1205 * Remove our headers. They get added
1206 * again on retransmit.
1208 skb_pull(skb, NETIUCV_HDRLEN);
1209 skb_trim(skb, skb->len - NETIUCV_HDRLEN);
1211 PRINT_WARN("iucv_send returned %08x\n", rc);
1212 IUCV_DBF_TEXT_(data, 2, "rc %d from iucv_send\n", rc);
1213 } else {
1214 if (copied)
1215 dev_kfree_skb(skb);
1216 atomic_inc(&nskb->users);
1217 skb_queue_tail(&conn->commit_queue, nskb);
1221 return rc;
1225 * Interface API for upper network layers
1226 *****************************************************************************/
1229 * Open an interface.
1230 * Called from generic network layer when ifconfig up is run.
1232 * @param dev Pointer to interface struct.
1234 * @return 0 on success, -ERRNO on failure. (Never fails.)
1236 static int
1237 netiucv_open(struct net_device *dev) {
1238 fsm_event(((struct netiucv_priv *)dev->priv)->fsm, DEV_EVENT_START,dev);
1239 return 0;
1243 * Close an interface.
1244 * Called from generic network layer when ifconfig down is run.
1246 * @param dev Pointer to interface struct.
1248 * @return 0 on success, -ERRNO on failure. (Never fails.)
1250 static int
1251 netiucv_close(struct net_device *dev) {
1252 fsm_event(((struct netiucv_priv *)dev->priv)->fsm, DEV_EVENT_STOP, dev);
1253 return 0;
1257 * Start transmission of a packet.
1258 * Called from generic network device layer.
1260 * @param skb Pointer to buffer containing the packet.
1261 * @param dev Pointer to interface struct.
1263 * @return 0 if packet consumed, !0 if packet rejected.
1264 * Note: If we return !0, then the packet is free'd by
1265 * the generic network layer.
1267 static int netiucv_tx(struct sk_buff *skb, struct net_device *dev)
1269 int rc = 0;
1270 struct netiucv_priv *privptr = dev->priv;
1272 IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
1274 * Some sanity checks ...
1276 if (skb == NULL) {
1277 PRINT_WARN("%s: NULL sk_buff passed\n", dev->name);
1278 IUCV_DBF_TEXT(data, 2, "netiucv_tx: skb is NULL\n");
1279 privptr->stats.tx_dropped++;
1280 return 0;
1282 if (skb_headroom(skb) < NETIUCV_HDRLEN) {
1283 PRINT_WARN("%s: Got sk_buff with head room < %ld bytes\n",
1284 dev->name, NETIUCV_HDRLEN);
1285 IUCV_DBF_TEXT(data, 2,
1286 "netiucv_tx: skb_headroom < NETIUCV_HDRLEN\n");
1287 dev_kfree_skb(skb);
1288 privptr->stats.tx_dropped++;
1289 return 0;
1293 * If connection is not running, try to restart it
1294 * and throw away packet.
1296 if (fsm_getstate(privptr->fsm) != DEV_STATE_RUNNING) {
1297 fsm_event(privptr->fsm, DEV_EVENT_START, dev);
1298 dev_kfree_skb(skb);
1299 privptr->stats.tx_dropped++;
1300 privptr->stats.tx_errors++;
1301 privptr->stats.tx_carrier_errors++;
1302 return 0;
1305 if (netiucv_test_and_set_busy(dev)) {
1306 IUCV_DBF_TEXT(data, 2, "EBUSY from netiucv_tx\n");
1307 return -EBUSY;
1309 dev->trans_start = jiffies;
1310 if (netiucv_transmit_skb(privptr->conn, skb))
1311 rc = 1;
1312 netiucv_clear_busy(dev);
1313 return rc;
1317 * Returns interface statistics of a device.
1319 * @param dev Pointer to interface struct.
1321 * @return Pointer to stats struct of this interface.
1323 static struct net_device_stats *
1324 netiucv_stats (struct net_device * dev)
1326 IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1327 return &((struct netiucv_priv *)dev->priv)->stats;
1331 * Sets MTU of an interface.
1333 * @param dev Pointer to interface struct.
1334 * @param new_mtu The new MTU to use for this interface.
1336 * @return 0 on success, -EINVAL if MTU is out of valid range.
1337 * (valid range is 576 .. NETIUCV_MTU_MAX).
1339 static int
1340 netiucv_change_mtu (struct net_device * dev, int new_mtu)
1342 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1343 if ((new_mtu < 576) || (new_mtu > NETIUCV_MTU_MAX)) {
1344 IUCV_DBF_TEXT(setup, 2, "given MTU out of valid range\n");
1345 return -EINVAL;
1347 dev->mtu = new_mtu;
1348 return 0;
1352 * attributes in sysfs
1353 *****************************************************************************/
1355 static ssize_t
1356 user_show (struct device *dev, struct device_attribute *attr, char *buf)
1358 struct netiucv_priv *priv = dev->driver_data;
1360 IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1361 return sprintf(buf, "%s\n", netiucv_printname(priv->conn->userid));
1364 static ssize_t
1365 user_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1367 struct netiucv_priv *priv = dev->driver_data;
1368 struct net_device *ndev = priv->conn->netdev;
1369 char *p;
1370 char *tmp;
1371 char username[10];
1372 int i;
1374 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1375 if (count>9) {
1376 PRINT_WARN("netiucv: username too long (%d)!\n", (int)count);
1377 IUCV_DBF_TEXT_(setup, 2,
1378 "%d is length of username\n", (int)count);
1379 return -EINVAL;
1382 tmp = strsep((char **) &buf, "\n");
1383 for (i=0, p=tmp; i<8 && *p; i++, p++) {
1384 if (isalnum(*p) || (*p == '$'))
1385 username[i]= *p;
1386 else if (*p == '\n') {
1387 /* trailing lf, grr */
1388 break;
1389 } else {
1390 PRINT_WARN("netiucv: Invalid char %c in username!\n",
1391 *p);
1392 IUCV_DBF_TEXT_(setup, 2,
1393 "username: invalid character %c\n",
1394 *p);
1395 return -EINVAL;
1398 while (i<9)
1399 username[i++] = ' ';
1400 username[9] = '\0';
1402 if (memcmp(username, priv->conn->userid, 8)) {
1403 /* username changed */
1404 if (ndev->flags & (IFF_UP | IFF_RUNNING)) {
1405 PRINT_WARN(
1406 "netiucv: device %s active, connected to %s\n",
1407 dev->bus_id, priv->conn->userid);
1408 PRINT_WARN("netiucv: user cannot be updated\n");
1409 IUCV_DBF_TEXT(setup, 2, "user_write: device active\n");
1410 return -EBUSY;
1413 memcpy(priv->conn->userid, username, 9);
1415 return count;
1419 static DEVICE_ATTR(user, 0644, user_show, user_write);
1421 static ssize_t
1422 buffer_show (struct device *dev, struct device_attribute *attr, char *buf)
1424 struct netiucv_priv *priv = dev->driver_data;
1426 IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1427 return sprintf(buf, "%d\n", priv->conn->max_buffsize);
1430 static ssize_t
1431 buffer_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1433 struct netiucv_priv *priv = dev->driver_data;
1434 struct net_device *ndev = priv->conn->netdev;
1435 char *e;
1436 int bs1;
1438 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1439 if (count >= 39)
1440 return -EINVAL;
1442 bs1 = simple_strtoul(buf, &e, 0);
1444 if (e && (!isspace(*e))) {
1445 PRINT_WARN("netiucv: Invalid character in buffer!\n");
1446 IUCV_DBF_TEXT_(setup, 2, "buffer_write: invalid char %c\n", *e);
1447 return -EINVAL;
1449 if (bs1 > NETIUCV_BUFSIZE_MAX) {
1450 PRINT_WARN("netiucv: Given buffer size %d too large.\n",
1451 bs1);
1452 IUCV_DBF_TEXT_(setup, 2,
1453 "buffer_write: buffer size %d too large\n",
1454 bs1);
1455 return -EINVAL;
1457 if ((ndev->flags & IFF_RUNNING) &&
1458 (bs1 < (ndev->mtu + NETIUCV_HDRLEN + 2))) {
1459 PRINT_WARN("netiucv: Given buffer size %d too small.\n",
1460 bs1);
1461 IUCV_DBF_TEXT_(setup, 2,
1462 "buffer_write: buffer size %d too small\n",
1463 bs1);
1464 return -EINVAL;
1466 if (bs1 < (576 + NETIUCV_HDRLEN + NETIUCV_HDRLEN)) {
1467 PRINT_WARN("netiucv: Given buffer size %d too small.\n",
1468 bs1);
1469 IUCV_DBF_TEXT_(setup, 2,
1470 "buffer_write: buffer size %d too small\n",
1471 bs1);
1472 return -EINVAL;
1475 priv->conn->max_buffsize = bs1;
1476 if (!(ndev->flags & IFF_RUNNING))
1477 ndev->mtu = bs1 - NETIUCV_HDRLEN - NETIUCV_HDRLEN;
1479 return count;
1483 static DEVICE_ATTR(buffer, 0644, buffer_show, buffer_write);
1485 static ssize_t
1486 dev_fsm_show (struct device *dev, struct device_attribute *attr, char *buf)
1488 struct netiucv_priv *priv = dev->driver_data;
1490 IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1491 return sprintf(buf, "%s\n", fsm_getstate_str(priv->fsm));
1494 static DEVICE_ATTR(device_fsm_state, 0444, dev_fsm_show, NULL);
1496 static ssize_t
1497 conn_fsm_show (struct device *dev, struct device_attribute *attr, char *buf)
1499 struct netiucv_priv *priv = dev->driver_data;
1501 IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1502 return sprintf(buf, "%s\n", fsm_getstate_str(priv->conn->fsm));
1505 static DEVICE_ATTR(connection_fsm_state, 0444, conn_fsm_show, NULL);
1507 static ssize_t
1508 maxmulti_show (struct device *dev, struct device_attribute *attr, char *buf)
1510 struct netiucv_priv *priv = dev->driver_data;
1512 IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1513 return sprintf(buf, "%ld\n", priv->conn->prof.maxmulti);
1516 static ssize_t
1517 maxmulti_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1519 struct netiucv_priv *priv = dev->driver_data;
1521 IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
1522 priv->conn->prof.maxmulti = 0;
1523 return count;
1526 static DEVICE_ATTR(max_tx_buffer_used, 0644, maxmulti_show, maxmulti_write);
1528 static ssize_t
1529 maxcq_show (struct device *dev, struct device_attribute *attr, char *buf)
1531 struct netiucv_priv *priv = dev->driver_data;
1533 IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1534 return sprintf(buf, "%ld\n", priv->conn->prof.maxcqueue);
1537 static ssize_t
1538 maxcq_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1540 struct netiucv_priv *priv = dev->driver_data;
1542 IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
1543 priv->conn->prof.maxcqueue = 0;
1544 return count;
1547 static DEVICE_ATTR(max_chained_skbs, 0644, maxcq_show, maxcq_write);
1549 static ssize_t
1550 sdoio_show (struct device *dev, struct device_attribute *attr, char *buf)
1552 struct netiucv_priv *priv = dev->driver_data;
1554 IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1555 return sprintf(buf, "%ld\n", priv->conn->prof.doios_single);
1558 static ssize_t
1559 sdoio_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1561 struct netiucv_priv *priv = dev->driver_data;
1563 IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
1564 priv->conn->prof.doios_single = 0;
1565 return count;
1568 static DEVICE_ATTR(tx_single_write_ops, 0644, sdoio_show, sdoio_write);
1570 static ssize_t
1571 mdoio_show (struct device *dev, struct device_attribute *attr, char *buf)
1573 struct netiucv_priv *priv = dev->driver_data;
1575 IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1576 return sprintf(buf, "%ld\n", priv->conn->prof.doios_multi);
1579 static ssize_t
1580 mdoio_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1582 struct netiucv_priv *priv = dev->driver_data;
1584 IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1585 priv->conn->prof.doios_multi = 0;
1586 return count;
1589 static DEVICE_ATTR(tx_multi_write_ops, 0644, mdoio_show, mdoio_write);
1591 static ssize_t
1592 txlen_show (struct device *dev, struct device_attribute *attr, char *buf)
1594 struct netiucv_priv *priv = dev->driver_data;
1596 IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1597 return sprintf(buf, "%ld\n", priv->conn->prof.txlen);
1600 static ssize_t
1601 txlen_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1603 struct netiucv_priv *priv = dev->driver_data;
1605 IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
1606 priv->conn->prof.txlen = 0;
1607 return count;
1610 static DEVICE_ATTR(netto_bytes, 0644, txlen_show, txlen_write);
1612 static ssize_t
1613 txtime_show (struct device *dev, struct device_attribute *attr, char *buf)
1615 struct netiucv_priv *priv = dev->driver_data;
1617 IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1618 return sprintf(buf, "%ld\n", priv->conn->prof.tx_time);
1621 static ssize_t
1622 txtime_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1624 struct netiucv_priv *priv = dev->driver_data;
1626 IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
1627 priv->conn->prof.tx_time = 0;
1628 return count;
1631 static DEVICE_ATTR(max_tx_io_time, 0644, txtime_show, txtime_write);
1633 static ssize_t
1634 txpend_show (struct device *dev, struct device_attribute *attr, char *buf)
1636 struct netiucv_priv *priv = dev->driver_data;
1638 IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1639 return sprintf(buf, "%ld\n", priv->conn->prof.tx_pending);
1642 static ssize_t
1643 txpend_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1645 struct netiucv_priv *priv = dev->driver_data;
1647 IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
1648 priv->conn->prof.tx_pending = 0;
1649 return count;
1652 static DEVICE_ATTR(tx_pending, 0644, txpend_show, txpend_write);
1654 static ssize_t
1655 txmpnd_show (struct device *dev, struct device_attribute *attr, char *buf)
1657 struct netiucv_priv *priv = dev->driver_data;
1659 IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1660 return sprintf(buf, "%ld\n", priv->conn->prof.tx_max_pending);
1663 static ssize_t
1664 txmpnd_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1666 struct netiucv_priv *priv = dev->driver_data;
1668 IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
1669 priv->conn->prof.tx_max_pending = 0;
1670 return count;
1673 static DEVICE_ATTR(tx_max_pending, 0644, txmpnd_show, txmpnd_write);
1675 static struct attribute *netiucv_attrs[] = {
1676 &dev_attr_buffer.attr,
1677 &dev_attr_user.attr,
1678 NULL,
1681 static struct attribute_group netiucv_attr_group = {
1682 .attrs = netiucv_attrs,
1685 static struct attribute *netiucv_stat_attrs[] = {
1686 &dev_attr_device_fsm_state.attr,
1687 &dev_attr_connection_fsm_state.attr,
1688 &dev_attr_max_tx_buffer_used.attr,
1689 &dev_attr_max_chained_skbs.attr,
1690 &dev_attr_tx_single_write_ops.attr,
1691 &dev_attr_tx_multi_write_ops.attr,
1692 &dev_attr_netto_bytes.attr,
1693 &dev_attr_max_tx_io_time.attr,
1694 &dev_attr_tx_pending.attr,
1695 &dev_attr_tx_max_pending.attr,
1696 NULL,
1699 static struct attribute_group netiucv_stat_attr_group = {
1700 .name = "stats",
1701 .attrs = netiucv_stat_attrs,
1704 static inline int
1705 netiucv_add_files(struct device *dev)
1707 int ret;
1709 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1710 ret = sysfs_create_group(&dev->kobj, &netiucv_attr_group);
1711 if (ret)
1712 return ret;
1713 ret = sysfs_create_group(&dev->kobj, &netiucv_stat_attr_group);
1714 if (ret)
1715 sysfs_remove_group(&dev->kobj, &netiucv_attr_group);
1716 return ret;
1719 static inline void
1720 netiucv_remove_files(struct device *dev)
1722 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1723 sysfs_remove_group(&dev->kobj, &netiucv_stat_attr_group);
1724 sysfs_remove_group(&dev->kobj, &netiucv_attr_group);
1727 static int
1728 netiucv_register_device(struct net_device *ndev)
1730 struct netiucv_priv *priv = ndev->priv;
1731 struct device *dev = kzalloc(sizeof(struct device), GFP_KERNEL);
1732 int ret;
1735 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1737 if (dev) {
1738 snprintf(dev->bus_id, BUS_ID_SIZE, "net%s", ndev->name);
1739 dev->bus = &iucv_bus;
1740 dev->parent = iucv_root;
1742 * The release function could be called after the
1743 * module has been unloaded. It's _only_ task is to
1744 * free the struct. Therefore, we specify kfree()
1745 * directly here. (Probably a little bit obfuscating
1746 * but legitime ...).
1748 dev->release = (void (*)(struct device *))kfree;
1749 dev->driver = &netiucv_driver;
1750 } else
1751 return -ENOMEM;
1753 ret = device_register(dev);
1755 if (ret)
1756 return ret;
1757 ret = netiucv_add_files(dev);
1758 if (ret)
1759 goto out_unreg;
1760 priv->dev = dev;
1761 dev->driver_data = priv;
1762 return 0;
1764 out_unreg:
1765 device_unregister(dev);
1766 return ret;
1769 static void
1770 netiucv_unregister_device(struct device *dev)
1772 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1773 netiucv_remove_files(dev);
1774 device_unregister(dev);
1778 * Allocate and initialize a new connection structure.
1779 * Add it to the list of netiucv connections;
1781 static struct iucv_connection *
1782 netiucv_new_connection(struct net_device *dev, char *username)
1784 struct iucv_connection **clist = &iucv_connections;
1785 struct iucv_connection *conn =
1786 kzalloc(sizeof(struct iucv_connection), GFP_KERNEL);
1788 if (conn) {
1789 skb_queue_head_init(&conn->collect_queue);
1790 skb_queue_head_init(&conn->commit_queue);
1791 conn->max_buffsize = NETIUCV_BUFSIZE_DEFAULT;
1792 conn->netdev = dev;
1794 conn->rx_buff = alloc_skb(NETIUCV_BUFSIZE_DEFAULT,
1795 GFP_KERNEL | GFP_DMA);
1796 if (!conn->rx_buff) {
1797 kfree(conn);
1798 return NULL;
1800 conn->tx_buff = alloc_skb(NETIUCV_BUFSIZE_DEFAULT,
1801 GFP_KERNEL | GFP_DMA);
1802 if (!conn->tx_buff) {
1803 kfree_skb(conn->rx_buff);
1804 kfree(conn);
1805 return NULL;
1807 conn->fsm = init_fsm("netiucvconn", conn_state_names,
1808 conn_event_names, NR_CONN_STATES,
1809 NR_CONN_EVENTS, conn_fsm, CONN_FSM_LEN,
1810 GFP_KERNEL);
1811 if (!conn->fsm) {
1812 kfree_skb(conn->tx_buff);
1813 kfree_skb(conn->rx_buff);
1814 kfree(conn);
1815 return NULL;
1817 fsm_settimer(conn->fsm, &conn->timer);
1818 fsm_newstate(conn->fsm, CONN_STATE_INVALID);
1820 if (username) {
1821 memcpy(conn->userid, username, 9);
1822 fsm_newstate(conn->fsm, CONN_STATE_STOPPED);
1825 conn->next = *clist;
1826 *clist = conn;
1828 return conn;
1832 * Release a connection structure and remove it from the
1833 * list of netiucv connections.
1835 static void
1836 netiucv_remove_connection(struct iucv_connection *conn)
1838 struct iucv_connection **clist = &iucv_connections;
1840 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1841 if (conn == NULL)
1842 return;
1843 while (*clist) {
1844 if (*clist == conn) {
1845 *clist = conn->next;
1846 if (conn->handle) {
1847 iucv_unregister_program(conn->handle);
1848 conn->handle = NULL;
1850 fsm_deltimer(&conn->timer);
1851 kfree_fsm(conn->fsm);
1852 kfree_skb(conn->rx_buff);
1853 kfree_skb(conn->tx_buff);
1854 return;
1856 clist = &((*clist)->next);
1861 * Release everything of a net device.
1863 static void
1864 netiucv_free_netdevice(struct net_device *dev)
1866 struct netiucv_priv *privptr;
1868 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1870 if (!dev)
1871 return;
1873 privptr = (struct netiucv_priv *)dev->priv;
1874 if (privptr) {
1875 if (privptr->conn)
1876 netiucv_remove_connection(privptr->conn);
1877 if (privptr->fsm)
1878 kfree_fsm(privptr->fsm);
1879 privptr->conn = NULL; privptr->fsm = NULL;
1880 /* privptr gets freed by free_netdev() */
1882 free_netdev(dev);
1886 * Initialize a net device. (Called from kernel in alloc_netdev())
1888 static void
1889 netiucv_setup_netdevice(struct net_device *dev)
1891 memset(dev->priv, 0, sizeof(struct netiucv_priv));
1893 dev->mtu = NETIUCV_MTU_DEFAULT;
1894 dev->hard_start_xmit = netiucv_tx;
1895 dev->open = netiucv_open;
1896 dev->stop = netiucv_close;
1897 dev->get_stats = netiucv_stats;
1898 dev->change_mtu = netiucv_change_mtu;
1899 dev->destructor = netiucv_free_netdevice;
1900 dev->hard_header_len = NETIUCV_HDRLEN;
1901 dev->addr_len = 0;
1902 dev->type = ARPHRD_SLIP;
1903 dev->tx_queue_len = NETIUCV_QUEUELEN_DEFAULT;
1904 dev->flags = IFF_POINTOPOINT | IFF_NOARP;
1905 SET_MODULE_OWNER(dev);
1909 * Allocate and initialize everything of a net device.
1911 static struct net_device *
1912 netiucv_init_netdevice(char *username)
1914 struct netiucv_priv *privptr;
1915 struct net_device *dev;
1917 dev = alloc_netdev(sizeof(struct netiucv_priv), "iucv%d",
1918 netiucv_setup_netdevice);
1919 if (!dev)
1920 return NULL;
1921 if (dev_alloc_name(dev, dev->name) < 0) {
1922 free_netdev(dev);
1923 return NULL;
1926 privptr = (struct netiucv_priv *)dev->priv;
1927 privptr->fsm = init_fsm("netiucvdev", dev_state_names,
1928 dev_event_names, NR_DEV_STATES, NR_DEV_EVENTS,
1929 dev_fsm, DEV_FSM_LEN, GFP_KERNEL);
1930 if (!privptr->fsm) {
1931 free_netdev(dev);
1932 return NULL;
1934 privptr->conn = netiucv_new_connection(dev, username);
1935 if (!privptr->conn) {
1936 kfree_fsm(privptr->fsm);
1937 free_netdev(dev);
1938 IUCV_DBF_TEXT(setup, 2, "NULL from netiucv_new_connection\n");
1939 return NULL;
1941 fsm_newstate(privptr->fsm, DEV_STATE_STOPPED);
1943 return dev;
1946 static ssize_t
1947 conn_write(struct device_driver *drv, const char *buf, size_t count)
1949 char *p;
1950 char username[10];
1951 int i, ret;
1952 struct net_device *dev;
1954 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1955 if (count>9) {
1956 PRINT_WARN("netiucv: username too long (%d)!\n", (int)count);
1957 IUCV_DBF_TEXT(setup, 2, "conn_write: too long\n");
1958 return -EINVAL;
1961 for (i=0, p=(char *)buf; i<8 && *p; i++, p++) {
1962 if (isalnum(*p) || (*p == '$'))
1963 username[i]= *p;
1964 else if (*p == '\n') {
1965 /* trailing lf, grr */
1966 break;
1967 } else {
1968 PRINT_WARN("netiucv: Invalid character in username!\n");
1969 IUCV_DBF_TEXT_(setup, 2,
1970 "conn_write: invalid character %c\n", *p);
1971 return -EINVAL;
1974 while (i<9)
1975 username[i++] = ' ';
1976 username[9] = '\0';
1977 dev = netiucv_init_netdevice(username);
1978 if (!dev) {
1979 PRINT_WARN(
1980 "netiucv: Could not allocate network device structure "
1981 "for user '%s'\n", netiucv_printname(username));
1982 IUCV_DBF_TEXT(setup, 2, "NULL from netiucv_init_netdevice\n");
1983 return -ENODEV;
1986 if ((ret = netiucv_register_device(dev))) {
1987 IUCV_DBF_TEXT_(setup, 2,
1988 "ret %d from netiucv_register_device\n", ret);
1989 goto out_free_ndev;
1992 /* sysfs magic */
1993 SET_NETDEV_DEV(dev,
1994 (struct device*)((struct netiucv_priv*)dev->priv)->dev);
1996 if ((ret = register_netdev(dev))) {
1997 netiucv_unregister_device((struct device*)
1998 ((struct netiucv_priv*)dev->priv)->dev);
1999 goto out_free_ndev;
2002 PRINT_INFO("%s: '%s'\n", dev->name, netiucv_printname(username));
2004 return count;
2006 out_free_ndev:
2007 PRINT_WARN("netiucv: Could not register '%s'\n", dev->name);
2008 IUCV_DBF_TEXT(setup, 2, "conn_write: could not register\n");
2009 netiucv_free_netdevice(dev);
2010 return ret;
2013 DRIVER_ATTR(connection, 0200, NULL, conn_write);
2015 static ssize_t
2016 remove_write (struct device_driver *drv, const char *buf, size_t count)
2018 struct iucv_connection **clist = &iucv_connections;
2019 struct net_device *ndev;
2020 struct netiucv_priv *priv;
2021 struct device *dev;
2022 char name[IFNAMSIZ];
2023 char *p;
2024 int i;
2026 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
2028 if (count >= IFNAMSIZ)
2029 count = IFNAMSIZ-1;
2031 for (i=0, p=(char *)buf; i<count && *p; i++, p++) {
2032 if ((*p == '\n') | (*p == ' ')) {
2033 /* trailing lf, grr */
2034 break;
2035 } else {
2036 name[i]=*p;
2039 name[i] = '\0';
2041 while (*clist) {
2042 ndev = (*clist)->netdev;
2043 priv = (struct netiucv_priv*)ndev->priv;
2044 dev = priv->dev;
2046 if (strncmp(name, ndev->name, count)) {
2047 clist = &((*clist)->next);
2048 continue;
2050 if (ndev->flags & (IFF_UP | IFF_RUNNING)) {
2051 PRINT_WARN(
2052 "netiucv: net device %s active with peer %s\n",
2053 ndev->name, priv->conn->userid);
2054 PRINT_WARN("netiucv: %s cannot be removed\n",
2055 ndev->name);
2056 IUCV_DBF_TEXT(data, 2, "remove_write: still active\n");
2057 return -EBUSY;
2059 unregister_netdev(ndev);
2060 netiucv_unregister_device(dev);
2061 return count;
2063 PRINT_WARN("netiucv: net device %s unknown\n", name);
2064 IUCV_DBF_TEXT(data, 2, "remove_write: unknown device\n");
2065 return -EINVAL;
2068 DRIVER_ATTR(remove, 0200, NULL, remove_write);
2070 static void
2071 netiucv_banner(void)
2073 PRINT_INFO("NETIUCV driver initialized\n");
2076 static void __exit
2077 netiucv_exit(void)
2079 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
2080 while (iucv_connections) {
2081 struct net_device *ndev = iucv_connections->netdev;
2082 struct netiucv_priv *priv = (struct netiucv_priv*)ndev->priv;
2083 struct device *dev = priv->dev;
2085 unregister_netdev(ndev);
2086 netiucv_unregister_device(dev);
2089 driver_remove_file(&netiucv_driver, &driver_attr_connection);
2090 driver_remove_file(&netiucv_driver, &driver_attr_remove);
2091 driver_unregister(&netiucv_driver);
2092 iucv_unregister_dbf_views();
2094 PRINT_INFO("NETIUCV driver unloaded\n");
2095 return;
2098 static int __init
2099 netiucv_init(void)
2101 int ret;
2103 ret = iucv_register_dbf_views();
2104 if (ret) {
2105 PRINT_WARN("netiucv_init failed, "
2106 "iucv_register_dbf_views rc = %d\n", ret);
2107 return ret;
2109 IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
2110 ret = driver_register(&netiucv_driver);
2111 if (ret) {
2112 PRINT_ERR("NETIUCV: failed to register driver.\n");
2113 IUCV_DBF_TEXT_(setup, 2, "ret %d from driver_register\n", ret);
2114 iucv_unregister_dbf_views();
2115 return ret;
2118 /* Add entry for specifying connections. */
2119 ret = driver_create_file(&netiucv_driver, &driver_attr_connection);
2120 if (!ret) {
2121 ret = driver_create_file(&netiucv_driver, &driver_attr_remove);
2122 netiucv_banner();
2123 } else {
2124 PRINT_ERR("NETIUCV: failed to add driver attribute.\n");
2125 IUCV_DBF_TEXT_(setup, 2, "ret %d from driver_create_file\n", ret);
2126 driver_unregister(&netiucv_driver);
2127 iucv_unregister_dbf_views();
2129 return ret;
2132 module_init(netiucv_init);
2133 module_exit(netiucv_exit);
2134 MODULE_LICENSE("GPL");