xref: /openbmc/linux/drivers/s390/net/netiucv.c (revision 643d1f7f)
1 /*
2  * IUCV network driver
3  *
4  * Copyright 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
5  * Author(s): Fritz Elfert (elfert@de.ibm.com, felfert@millenux.com)
6  *
7  * Sysfs integration and all bugs therein by Cornelia Huck
8  * (cornelia.huck@de.ibm.com)
9  *
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
17  *
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.
22  *
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.
27  *
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.
31  *
32  */
33 
34 #undef DEBUG
35 
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/bitops.h>
45 
46 #include <linux/signal.h>
47 #include <linux/string.h>
48 #include <linux/device.h>
49 
50 #include <linux/ip.h>
51 #include <linux/if_arp.h>
52 #include <linux/tcp.h>
53 #include <linux/skbuff.h>
54 #include <linux/ctype.h>
55 #include <net/dst.h>
56 
57 #include <asm/io.h>
58 #include <asm/uaccess.h>
59 
60 #include <net/iucv/iucv.h>
61 #include "fsm.h"
62 
63 MODULE_AUTHOR
64     ("(C) 2001 IBM Corporation by Fritz Elfert (felfert@millenux.com)");
65 MODULE_DESCRIPTION ("Linux for S/390 IUCV network driver");
66 
67 /**
68  * Debug Facility stuff
69  */
70 #define IUCV_DBF_SETUP_NAME "iucv_setup"
71 #define IUCV_DBF_SETUP_LEN 32
72 #define IUCV_DBF_SETUP_PAGES 2
73 #define IUCV_DBF_SETUP_NR_AREAS 1
74 #define IUCV_DBF_SETUP_LEVEL 3
75 
76 #define IUCV_DBF_DATA_NAME "iucv_data"
77 #define IUCV_DBF_DATA_LEN 128
78 #define IUCV_DBF_DATA_PAGES 2
79 #define IUCV_DBF_DATA_NR_AREAS 1
80 #define IUCV_DBF_DATA_LEVEL 2
81 
82 #define IUCV_DBF_TRACE_NAME "iucv_trace"
83 #define IUCV_DBF_TRACE_LEN 16
84 #define IUCV_DBF_TRACE_PAGES 4
85 #define IUCV_DBF_TRACE_NR_AREAS 1
86 #define IUCV_DBF_TRACE_LEVEL 3
87 
88 #define IUCV_DBF_TEXT(name,level,text) \
89 	do { \
90 		debug_text_event(iucv_dbf_##name,level,text); \
91 	} while (0)
92 
93 #define IUCV_DBF_HEX(name,level,addr,len) \
94 	do { \
95 		debug_event(iucv_dbf_##name,level,(void*)(addr),len); \
96 	} while (0)
97 
98 DECLARE_PER_CPU(char[256], iucv_dbf_txt_buf);
99 
100 #define IUCV_DBF_TEXT_(name,level,text...)				\
101 	do {								\
102 		char* iucv_dbf_txt_buf = get_cpu_var(iucv_dbf_txt_buf);	\
103 		sprintf(iucv_dbf_txt_buf, text);			\
104 		debug_text_event(iucv_dbf_##name,level,iucv_dbf_txt_buf); \
105 		put_cpu_var(iucv_dbf_txt_buf);				\
106 	} while (0)
107 
108 #define IUCV_DBF_SPRINTF(name,level,text...) \
109 	do { \
110 		debug_sprintf_event(iucv_dbf_trace, level, ##text ); \
111 		debug_sprintf_event(iucv_dbf_trace, level, text ); \
112 	} while (0)
113 
114 /**
115  * some more debug stuff
116  */
117 #define IUCV_HEXDUMP16(importance,header,ptr) \
118 PRINT_##importance(header "%02x %02x %02x %02x  %02x %02x %02x %02x  " \
119 		   "%02x %02x %02x %02x  %02x %02x %02x %02x\n", \
120 		   *(((char*)ptr)),*(((char*)ptr)+1),*(((char*)ptr)+2), \
121 		   *(((char*)ptr)+3),*(((char*)ptr)+4),*(((char*)ptr)+5), \
122 		   *(((char*)ptr)+6),*(((char*)ptr)+7),*(((char*)ptr)+8), \
123 		   *(((char*)ptr)+9),*(((char*)ptr)+10),*(((char*)ptr)+11), \
124 		   *(((char*)ptr)+12),*(((char*)ptr)+13), \
125 		   *(((char*)ptr)+14),*(((char*)ptr)+15)); \
126 PRINT_##importance(header "%02x %02x %02x %02x  %02x %02x %02x %02x  " \
127 		   "%02x %02x %02x %02x  %02x %02x %02x %02x\n", \
128 		   *(((char*)ptr)+16),*(((char*)ptr)+17), \
129 		   *(((char*)ptr)+18),*(((char*)ptr)+19), \
130 		   *(((char*)ptr)+20),*(((char*)ptr)+21), \
131 		   *(((char*)ptr)+22),*(((char*)ptr)+23), \
132 		   *(((char*)ptr)+24),*(((char*)ptr)+25), \
133 		   *(((char*)ptr)+26),*(((char*)ptr)+27), \
134 		   *(((char*)ptr)+28),*(((char*)ptr)+29), \
135 		   *(((char*)ptr)+30),*(((char*)ptr)+31));
136 
137 #define PRINTK_HEADER " iucv: "       /* for debugging */
138 
139 static struct device_driver netiucv_driver = {
140 	.name = "netiucv",
141 	.bus  = &iucv_bus,
142 };
143 
144 static int netiucv_callback_connreq(struct iucv_path *,
145 				    u8 ipvmid[8], u8 ipuser[16]);
146 static void netiucv_callback_connack(struct iucv_path *, u8 ipuser[16]);
147 static void netiucv_callback_connrej(struct iucv_path *, u8 ipuser[16]);
148 static void netiucv_callback_connsusp(struct iucv_path *, u8 ipuser[16]);
149 static void netiucv_callback_connres(struct iucv_path *, u8 ipuser[16]);
150 static void netiucv_callback_rx(struct iucv_path *, struct iucv_message *);
151 static void netiucv_callback_txdone(struct iucv_path *, struct iucv_message *);
152 
153 static struct iucv_handler netiucv_handler = {
154 	.path_pending	  = netiucv_callback_connreq,
155 	.path_complete	  = netiucv_callback_connack,
156 	.path_severed	  = netiucv_callback_connrej,
157 	.path_quiesced	  = netiucv_callback_connsusp,
158 	.path_resumed	  = netiucv_callback_connres,
159 	.message_pending  = netiucv_callback_rx,
160 	.message_complete = netiucv_callback_txdone
161 };
162 
163 /**
164  * Per connection profiling data
165  */
166 struct connection_profile {
167 	unsigned long maxmulti;
168 	unsigned long maxcqueue;
169 	unsigned long doios_single;
170 	unsigned long doios_multi;
171 	unsigned long txlen;
172 	unsigned long tx_time;
173 	struct timespec send_stamp;
174 	unsigned long tx_pending;
175 	unsigned long tx_max_pending;
176 };
177 
178 /**
179  * Representation of one iucv connection
180  */
181 struct iucv_connection {
182 	struct list_head	  list;
183 	struct iucv_path	  *path;
184 	struct sk_buff            *rx_buff;
185 	struct sk_buff            *tx_buff;
186 	struct sk_buff_head       collect_queue;
187 	struct sk_buff_head	  commit_queue;
188 	spinlock_t                collect_lock;
189 	int                       collect_len;
190 	int                       max_buffsize;
191 	fsm_timer                 timer;
192 	fsm_instance              *fsm;
193 	struct net_device         *netdev;
194 	struct connection_profile prof;
195 	char                      userid[9];
196 };
197 
198 /**
199  * Linked list of all connection structs.
200  */
201 static LIST_HEAD(iucv_connection_list);
202 static DEFINE_RWLOCK(iucv_connection_rwlock);
203 
204 /**
205  * Representation of event-data for the
206  * connection state machine.
207  */
208 struct iucv_event {
209 	struct iucv_connection *conn;
210 	void                   *data;
211 };
212 
213 /**
214  * Private part of the network device structure
215  */
216 struct netiucv_priv {
217 	struct net_device_stats stats;
218 	unsigned long           tbusy;
219 	fsm_instance            *fsm;
220         struct iucv_connection  *conn;
221 	struct device           *dev;
222 };
223 
224 /**
225  * Link level header for a packet.
226  */
227 struct ll_header {
228 	u16 next;
229 };
230 
231 #define NETIUCV_HDRLEN		 (sizeof(struct ll_header))
232 #define NETIUCV_BUFSIZE_MAX      32768
233 #define NETIUCV_BUFSIZE_DEFAULT  NETIUCV_BUFSIZE_MAX
234 #define NETIUCV_MTU_MAX          (NETIUCV_BUFSIZE_MAX - NETIUCV_HDRLEN)
235 #define NETIUCV_MTU_DEFAULT      9216
236 #define NETIUCV_QUEUELEN_DEFAULT 50
237 #define NETIUCV_TIMEOUT_5SEC     5000
238 
239 /**
240  * Compatibility macros for busy handling
241  * of network devices.
242  */
243 static inline void netiucv_clear_busy(struct net_device *dev)
244 {
245 	struct netiucv_priv *priv = netdev_priv(dev);
246 	clear_bit(0, &priv->tbusy);
247 	netif_wake_queue(dev);
248 }
249 
250 static inline int netiucv_test_and_set_busy(struct net_device *dev)
251 {
252 	struct netiucv_priv *priv = netdev_priv(dev);
253 	netif_stop_queue(dev);
254 	return test_and_set_bit(0, &priv->tbusy);
255 }
256 
257 static u8 iucvMagic[16] = {
258 	0xF0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
259 	0xF0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40
260 };
261 
262 /**
263  * Convert an iucv userId to its printable
264  * form (strip whitespace at end).
265  *
266  * @param An iucv userId
267  *
268  * @returns The printable string (static data!!)
269  */
270 static char *netiucv_printname(char *name)
271 {
272 	static char tmp[9];
273 	char *p = tmp;
274 	memcpy(tmp, name, 8);
275 	tmp[8] = '\0';
276 	while (*p && (!isspace(*p)))
277 		p++;
278 	*p = '\0';
279 	return tmp;
280 }
281 
282 /**
283  * States of the interface statemachine.
284  */
285 enum dev_states {
286 	DEV_STATE_STOPPED,
287 	DEV_STATE_STARTWAIT,
288 	DEV_STATE_STOPWAIT,
289 	DEV_STATE_RUNNING,
290 	/**
291 	 * MUST be always the last element!!
292 	 */
293 	NR_DEV_STATES
294 };
295 
296 static const char *dev_state_names[] = {
297 	"Stopped",
298 	"StartWait",
299 	"StopWait",
300 	"Running",
301 };
302 
303 /**
304  * Events of the interface statemachine.
305  */
306 enum dev_events {
307 	DEV_EVENT_START,
308 	DEV_EVENT_STOP,
309 	DEV_EVENT_CONUP,
310 	DEV_EVENT_CONDOWN,
311 	/**
312 	 * MUST be always the last element!!
313 	 */
314 	NR_DEV_EVENTS
315 };
316 
317 static const char *dev_event_names[] = {
318 	"Start",
319 	"Stop",
320 	"Connection up",
321 	"Connection down",
322 };
323 
324 /**
325  * Events of the connection statemachine
326  */
327 enum conn_events {
328 	/**
329 	 * Events, representing callbacks from
330 	 * lowlevel iucv layer)
331 	 */
332 	CONN_EVENT_CONN_REQ,
333 	CONN_EVENT_CONN_ACK,
334 	CONN_EVENT_CONN_REJ,
335 	CONN_EVENT_CONN_SUS,
336 	CONN_EVENT_CONN_RES,
337 	CONN_EVENT_RX,
338 	CONN_EVENT_TXDONE,
339 
340 	/**
341 	 * Events, representing errors return codes from
342 	 * calls to lowlevel iucv layer
343 	 */
344 
345 	/**
346 	 * Event, representing timer expiry.
347 	 */
348 	CONN_EVENT_TIMER,
349 
350 	/**
351 	 * Events, representing commands from upper levels.
352 	 */
353 	CONN_EVENT_START,
354 	CONN_EVENT_STOP,
355 
356 	/**
357 	 * MUST be always the last element!!
358 	 */
359 	NR_CONN_EVENTS,
360 };
361 
362 static const char *conn_event_names[] = {
363 	"Remote connection request",
364 	"Remote connection acknowledge",
365 	"Remote connection reject",
366 	"Connection suspended",
367 	"Connection resumed",
368 	"Data received",
369 	"Data sent",
370 
371 	"Timer",
372 
373 	"Start",
374 	"Stop",
375 };
376 
377 /**
378  * States of the connection statemachine.
379  */
380 enum conn_states {
381 	/**
382 	 * Connection not assigned to any device,
383 	 * initial state, invalid
384 	 */
385 	CONN_STATE_INVALID,
386 
387 	/**
388 	 * Userid assigned but not operating
389 	 */
390 	CONN_STATE_STOPPED,
391 
392 	/**
393 	 * Connection registered,
394 	 * no connection request sent yet,
395 	 * no connection request received
396 	 */
397 	CONN_STATE_STARTWAIT,
398 
399 	/**
400 	 * Connection registered and connection request sent,
401 	 * no acknowledge and no connection request received yet.
402 	 */
403 	CONN_STATE_SETUPWAIT,
404 
405 	/**
406 	 * Connection up and running idle
407 	 */
408 	CONN_STATE_IDLE,
409 
410 	/**
411 	 * Data sent, awaiting CONN_EVENT_TXDONE
412 	 */
413 	CONN_STATE_TX,
414 
415 	/**
416 	 * Error during registration.
417 	 */
418 	CONN_STATE_REGERR,
419 
420 	/**
421 	 * Error during registration.
422 	 */
423 	CONN_STATE_CONNERR,
424 
425 	/**
426 	 * MUST be always the last element!!
427 	 */
428 	NR_CONN_STATES,
429 };
430 
431 static const char *conn_state_names[] = {
432 	"Invalid",
433 	"Stopped",
434 	"StartWait",
435 	"SetupWait",
436 	"Idle",
437 	"TX",
438 	"Terminating",
439 	"Registration error",
440 	"Connect error",
441 };
442 
443 
444 /**
445  * Debug Facility Stuff
446  */
447 static debug_info_t *iucv_dbf_setup = NULL;
448 static debug_info_t *iucv_dbf_data = NULL;
449 static debug_info_t *iucv_dbf_trace = NULL;
450 
451 DEFINE_PER_CPU(char[256], iucv_dbf_txt_buf);
452 
453 static void iucv_unregister_dbf_views(void)
454 {
455 	if (iucv_dbf_setup)
456 		debug_unregister(iucv_dbf_setup);
457 	if (iucv_dbf_data)
458 		debug_unregister(iucv_dbf_data);
459 	if (iucv_dbf_trace)
460 		debug_unregister(iucv_dbf_trace);
461 }
462 static int iucv_register_dbf_views(void)
463 {
464 	iucv_dbf_setup = debug_register(IUCV_DBF_SETUP_NAME,
465 					IUCV_DBF_SETUP_PAGES,
466 					IUCV_DBF_SETUP_NR_AREAS,
467 					IUCV_DBF_SETUP_LEN);
468 	iucv_dbf_data = debug_register(IUCV_DBF_DATA_NAME,
469 				       IUCV_DBF_DATA_PAGES,
470 				       IUCV_DBF_DATA_NR_AREAS,
471 				       IUCV_DBF_DATA_LEN);
472 	iucv_dbf_trace = debug_register(IUCV_DBF_TRACE_NAME,
473 					IUCV_DBF_TRACE_PAGES,
474 					IUCV_DBF_TRACE_NR_AREAS,
475 					IUCV_DBF_TRACE_LEN);
476 
477 	if ((iucv_dbf_setup == NULL) || (iucv_dbf_data == NULL) ||
478 	    (iucv_dbf_trace == NULL)) {
479 		iucv_unregister_dbf_views();
480 		return -ENOMEM;
481 	}
482 	debug_register_view(iucv_dbf_setup, &debug_hex_ascii_view);
483 	debug_set_level(iucv_dbf_setup, IUCV_DBF_SETUP_LEVEL);
484 
485 	debug_register_view(iucv_dbf_data, &debug_hex_ascii_view);
486 	debug_set_level(iucv_dbf_data, IUCV_DBF_DATA_LEVEL);
487 
488 	debug_register_view(iucv_dbf_trace, &debug_hex_ascii_view);
489 	debug_set_level(iucv_dbf_trace, IUCV_DBF_TRACE_LEVEL);
490 
491 	return 0;
492 }
493 
494 /*
495  * Callback-wrappers, called from lowlevel iucv layer.
496  */
497 
498 static void netiucv_callback_rx(struct iucv_path *path,
499 				struct iucv_message *msg)
500 {
501 	struct iucv_connection *conn = path->private;
502 	struct iucv_event ev;
503 
504 	ev.conn = conn;
505 	ev.data = msg;
506 	fsm_event(conn->fsm, CONN_EVENT_RX, &ev);
507 }
508 
509 static void netiucv_callback_txdone(struct iucv_path *path,
510 				    struct iucv_message *msg)
511 {
512 	struct iucv_connection *conn = path->private;
513 	struct iucv_event ev;
514 
515 	ev.conn = conn;
516 	ev.data = msg;
517 	fsm_event(conn->fsm, CONN_EVENT_TXDONE, &ev);
518 }
519 
520 static void netiucv_callback_connack(struct iucv_path *path, u8 ipuser[16])
521 {
522 	struct iucv_connection *conn = path->private;
523 
524 	fsm_event(conn->fsm, CONN_EVENT_CONN_ACK, conn);
525 }
526 
527 static int netiucv_callback_connreq(struct iucv_path *path,
528 				    u8 ipvmid[8], u8 ipuser[16])
529 {
530 	struct iucv_connection *conn = path->private;
531 	struct iucv_event ev;
532 	int rc;
533 
534 	if (memcmp(iucvMagic, ipuser, sizeof(ipuser)))
535 		/* ipuser must match iucvMagic. */
536 		return -EINVAL;
537 	rc = -EINVAL;
538 	read_lock_bh(&iucv_connection_rwlock);
539 	list_for_each_entry(conn, &iucv_connection_list, list) {
540 		if (strncmp(ipvmid, conn->userid, 8))
541 			continue;
542 		/* Found a matching connection for this path. */
543 		conn->path = path;
544 		ev.conn = conn;
545 		ev.data = path;
546 		fsm_event(conn->fsm, CONN_EVENT_CONN_REQ, &ev);
547 		rc = 0;
548 	}
549 	read_unlock_bh(&iucv_connection_rwlock);
550 	return rc;
551 }
552 
553 static void netiucv_callback_connrej(struct iucv_path *path, u8 ipuser[16])
554 {
555 	struct iucv_connection *conn = path->private;
556 
557 	fsm_event(conn->fsm, CONN_EVENT_CONN_REJ, conn);
558 }
559 
560 static void netiucv_callback_connsusp(struct iucv_path *path, u8 ipuser[16])
561 {
562 	struct iucv_connection *conn = path->private;
563 
564 	fsm_event(conn->fsm, CONN_EVENT_CONN_SUS, conn);
565 }
566 
567 static void netiucv_callback_connres(struct iucv_path *path, u8 ipuser[16])
568 {
569 	struct iucv_connection *conn = path->private;
570 
571 	fsm_event(conn->fsm, CONN_EVENT_CONN_RES, conn);
572 }
573 
574 /**
575  * Dummy NOP action for all statemachines
576  */
577 static void fsm_action_nop(fsm_instance *fi, int event, void *arg)
578 {
579 }
580 
581 /*
582  * Actions of the connection statemachine
583  */
584 
585 /**
586  * netiucv_unpack_skb
587  * @conn: The connection where this skb has been received.
588  * @pskb: The received skb.
589  *
590  * Unpack a just received skb and hand it over to upper layers.
591  * Helper function for conn_action_rx.
592  */
593 static void netiucv_unpack_skb(struct iucv_connection *conn,
594 			       struct sk_buff *pskb)
595 {
596 	struct net_device     *dev = conn->netdev;
597 	struct netiucv_priv   *privptr = netdev_priv(dev);
598 	u16 offset = 0;
599 
600 	skb_put(pskb, NETIUCV_HDRLEN);
601 	pskb->dev = dev;
602 	pskb->ip_summed = CHECKSUM_NONE;
603 	pskb->protocol = ntohs(ETH_P_IP);
604 
605 	while (1) {
606 		struct sk_buff *skb;
607 		struct ll_header *header = (struct ll_header *) pskb->data;
608 
609 		if (!header->next)
610 			break;
611 
612 		skb_pull(pskb, NETIUCV_HDRLEN);
613 		header->next -= offset;
614 		offset += header->next;
615 		header->next -= NETIUCV_HDRLEN;
616 		if (skb_tailroom(pskb) < header->next) {
617 			PRINT_WARN("%s: Illegal next field in iucv header: "
618 			       "%d > %d\n",
619 			       dev->name, header->next, skb_tailroom(pskb));
620 			IUCV_DBF_TEXT_(data, 2, "Illegal next field: %d > %d\n",
621 				header->next, skb_tailroom(pskb));
622 			return;
623 		}
624 		skb_put(pskb, header->next);
625 		skb_reset_mac_header(pskb);
626 		skb = dev_alloc_skb(pskb->len);
627 		if (!skb) {
628 			PRINT_WARN("%s Out of memory in netiucv_unpack_skb\n",
629 			       dev->name);
630 			IUCV_DBF_TEXT(data, 2,
631 				"Out of memory in netiucv_unpack_skb\n");
632 			privptr->stats.rx_dropped++;
633 			return;
634 		}
635 		skb_copy_from_linear_data(pskb, skb_put(skb, pskb->len),
636 					  pskb->len);
637 		skb_reset_mac_header(skb);
638 		skb->dev = pskb->dev;
639 		skb->protocol = pskb->protocol;
640 		pskb->ip_summed = CHECKSUM_UNNECESSARY;
641 		privptr->stats.rx_packets++;
642 		privptr->stats.rx_bytes += skb->len;
643 		/*
644 		 * Since receiving is always initiated from a tasklet (in iucv.c),
645 		 * we must use netif_rx_ni() instead of netif_rx()
646 		 */
647 		netif_rx_ni(skb);
648 		dev->last_rx = jiffies;
649 		skb_pull(pskb, header->next);
650 		skb_put(pskb, NETIUCV_HDRLEN);
651 	}
652 }
653 
654 static void conn_action_rx(fsm_instance *fi, int event, void *arg)
655 {
656 	struct iucv_event *ev = arg;
657 	struct iucv_connection *conn = ev->conn;
658 	struct iucv_message *msg = ev->data;
659 	struct netiucv_priv *privptr = netdev_priv(conn->netdev);
660 	int rc;
661 
662 	IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
663 
664 	if (!conn->netdev) {
665 		iucv_message_reject(conn->path, msg);
666 		PRINT_WARN("Received data for unlinked connection\n");
667 		IUCV_DBF_TEXT(data, 2,
668 			      "Received data for unlinked connection\n");
669 		return;
670 	}
671 	if (msg->length > conn->max_buffsize) {
672 		iucv_message_reject(conn->path, msg);
673 		privptr->stats.rx_dropped++;
674 		PRINT_WARN("msglen %d > max_buffsize %d\n",
675 			   msg->length, conn->max_buffsize);
676 		IUCV_DBF_TEXT_(data, 2, "msglen %d > max_buffsize %d\n",
677 			       msg->length, conn->max_buffsize);
678 		return;
679 	}
680 	conn->rx_buff->data = conn->rx_buff->head;
681 	skb_reset_tail_pointer(conn->rx_buff);
682 	conn->rx_buff->len = 0;
683 	rc = iucv_message_receive(conn->path, msg, 0, conn->rx_buff->data,
684 				  msg->length, NULL);
685 	if (rc || msg->length < 5) {
686 		privptr->stats.rx_errors++;
687 		PRINT_WARN("iucv_receive returned %08x\n", rc);
688 		IUCV_DBF_TEXT_(data, 2, "rc %d from iucv_receive\n", rc);
689 		return;
690 	}
691 	netiucv_unpack_skb(conn, conn->rx_buff);
692 }
693 
694 static void conn_action_txdone(fsm_instance *fi, int event, void *arg)
695 {
696 	struct iucv_event *ev = arg;
697 	struct iucv_connection *conn = ev->conn;
698 	struct iucv_message *msg = ev->data;
699 	struct iucv_message txmsg;
700 	struct netiucv_priv *privptr = NULL;
701 	u32 single_flag = msg->tag;
702 	u32 txbytes = 0;
703 	u32 txpackets = 0;
704 	u32 stat_maxcq = 0;
705 	struct sk_buff *skb;
706 	unsigned long saveflags;
707 	struct ll_header header;
708 	int rc;
709 
710 	IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
711 
712 	if (conn && conn->netdev)
713 		privptr = netdev_priv(conn->netdev);
714 	conn->prof.tx_pending--;
715 	if (single_flag) {
716 		if ((skb = skb_dequeue(&conn->commit_queue))) {
717 			atomic_dec(&skb->users);
718 			dev_kfree_skb_any(skb);
719 			if (privptr) {
720 				privptr->stats.tx_packets++;
721 				privptr->stats.tx_bytes +=
722 					(skb->len - NETIUCV_HDRLEN
723 					 	  - NETIUCV_HDRLEN);
724 			}
725 		}
726 	}
727 	conn->tx_buff->data = conn->tx_buff->head;
728 	skb_reset_tail_pointer(conn->tx_buff);
729 	conn->tx_buff->len = 0;
730 	spin_lock_irqsave(&conn->collect_lock, saveflags);
731 	while ((skb = skb_dequeue(&conn->collect_queue))) {
732 		header.next = conn->tx_buff->len + skb->len + NETIUCV_HDRLEN;
733 		memcpy(skb_put(conn->tx_buff, NETIUCV_HDRLEN), &header,
734 		       NETIUCV_HDRLEN);
735 		skb_copy_from_linear_data(skb,
736 					  skb_put(conn->tx_buff, skb->len),
737 					  skb->len);
738 		txbytes += skb->len;
739 		txpackets++;
740 		stat_maxcq++;
741 		atomic_dec(&skb->users);
742 		dev_kfree_skb_any(skb);
743 	}
744 	if (conn->collect_len > conn->prof.maxmulti)
745 		conn->prof.maxmulti = conn->collect_len;
746 	conn->collect_len = 0;
747 	spin_unlock_irqrestore(&conn->collect_lock, saveflags);
748 	if (conn->tx_buff->len == 0) {
749 		fsm_newstate(fi, CONN_STATE_IDLE);
750 		return;
751 	}
752 
753 	header.next = 0;
754 	memcpy(skb_put(conn->tx_buff, NETIUCV_HDRLEN), &header, NETIUCV_HDRLEN);
755 	conn->prof.send_stamp = current_kernel_time();
756 	txmsg.class = 0;
757 	txmsg.tag = 0;
758 	rc = iucv_message_send(conn->path, &txmsg, 0, 0,
759 			       conn->tx_buff->data, conn->tx_buff->len);
760 	conn->prof.doios_multi++;
761 	conn->prof.txlen += conn->tx_buff->len;
762 	conn->prof.tx_pending++;
763 	if (conn->prof.tx_pending > conn->prof.tx_max_pending)
764 		conn->prof.tx_max_pending = conn->prof.tx_pending;
765 	if (rc) {
766 		conn->prof.tx_pending--;
767 		fsm_newstate(fi, CONN_STATE_IDLE);
768 		if (privptr)
769 			privptr->stats.tx_errors += txpackets;
770 		PRINT_WARN("iucv_send returned %08x\n",	rc);
771 		IUCV_DBF_TEXT_(data, 2, "rc %d from iucv_send\n", rc);
772 	} else {
773 		if (privptr) {
774 			privptr->stats.tx_packets += txpackets;
775 			privptr->stats.tx_bytes += txbytes;
776 		}
777 		if (stat_maxcq > conn->prof.maxcqueue)
778 			conn->prof.maxcqueue = stat_maxcq;
779 	}
780 }
781 
782 static void conn_action_connaccept(fsm_instance *fi, int event, void *arg)
783 {
784 	struct iucv_event *ev = arg;
785 	struct iucv_connection *conn = ev->conn;
786 	struct iucv_path *path = ev->data;
787 	struct net_device *netdev = conn->netdev;
788 	struct netiucv_priv *privptr = netdev_priv(netdev);
789 	int rc;
790 
791 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
792 
793 	conn->path = path;
794 	path->msglim = NETIUCV_QUEUELEN_DEFAULT;
795 	path->flags = 0;
796 	rc = iucv_path_accept(path, &netiucv_handler, NULL, conn);
797 	if (rc) {
798 		PRINT_WARN("%s: IUCV accept failed with error %d\n",
799 		       netdev->name, rc);
800 		IUCV_DBF_TEXT_(setup, 2, "rc %d from iucv_accept", rc);
801 		return;
802 	}
803 	fsm_newstate(fi, CONN_STATE_IDLE);
804 	netdev->tx_queue_len = conn->path->msglim;
805 	fsm_event(privptr->fsm, DEV_EVENT_CONUP, netdev);
806 }
807 
808 static void conn_action_connreject(fsm_instance *fi, int event, void *arg)
809 {
810 	struct iucv_event *ev = arg;
811 	struct iucv_path *path = ev->data;
812 
813 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
814 	iucv_path_sever(path, NULL);
815 }
816 
817 static void conn_action_connack(fsm_instance *fi, int event, void *arg)
818 {
819 	struct iucv_connection *conn = arg;
820 	struct net_device *netdev = conn->netdev;
821 	struct netiucv_priv *privptr = netdev_priv(netdev);
822 
823 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
824 	fsm_deltimer(&conn->timer);
825 	fsm_newstate(fi, CONN_STATE_IDLE);
826 	netdev->tx_queue_len = conn->path->msglim;
827 	fsm_event(privptr->fsm, DEV_EVENT_CONUP, netdev);
828 }
829 
830 static void conn_action_conntimsev(fsm_instance *fi, int event, void *arg)
831 {
832 	struct iucv_connection *conn = arg;
833 
834 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
835 	fsm_deltimer(&conn->timer);
836 	iucv_path_sever(conn->path, NULL);
837 	fsm_newstate(fi, CONN_STATE_STARTWAIT);
838 }
839 
840 static void conn_action_connsever(fsm_instance *fi, int event, void *arg)
841 {
842 	struct iucv_connection *conn = arg;
843 	struct net_device *netdev = conn->netdev;
844 	struct netiucv_priv *privptr = netdev_priv(netdev);
845 
846 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
847 
848 	fsm_deltimer(&conn->timer);
849 	iucv_path_sever(conn->path, NULL);
850 	PRINT_INFO("%s: Remote dropped connection\n", netdev->name);
851 	IUCV_DBF_TEXT(data, 2,
852 		      "conn_action_connsever: Remote dropped connection\n");
853 	fsm_newstate(fi, CONN_STATE_STARTWAIT);
854 	fsm_event(privptr->fsm, DEV_EVENT_CONDOWN, netdev);
855 }
856 
857 static void conn_action_start(fsm_instance *fi, int event, void *arg)
858 {
859 	struct iucv_connection *conn = arg;
860 	int rc;
861 
862 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
863 
864 	fsm_newstate(fi, CONN_STATE_STARTWAIT);
865 	PRINT_DEBUG("%s('%s'): connecting ...\n",
866 		    conn->netdev->name, conn->userid);
867 
868 	/*
869 	 * We must set the state before calling iucv_connect because the
870 	 * callback handler could be called at any point after the connection
871 	 * request is sent
872 	 */
873 
874 	fsm_newstate(fi, CONN_STATE_SETUPWAIT);
875 	conn->path = iucv_path_alloc(NETIUCV_QUEUELEN_DEFAULT, 0, GFP_KERNEL);
876 	rc = iucv_path_connect(conn->path, &netiucv_handler, conn->userid,
877 			       NULL, iucvMagic, conn);
878 	switch (rc) {
879 	case 0:
880 		conn->netdev->tx_queue_len = conn->path->msglim;
881 		fsm_addtimer(&conn->timer, NETIUCV_TIMEOUT_5SEC,
882 			     CONN_EVENT_TIMER, conn);
883 		return;
884 	case 11:
885 		PRINT_INFO("%s: User %s is currently not available.\n",
886 			   conn->netdev->name,
887 			   netiucv_printname(conn->userid));
888 		fsm_newstate(fi, CONN_STATE_STARTWAIT);
889 		break;
890 	case 12:
891 		PRINT_INFO("%s: User %s is currently not ready.\n",
892 			   conn->netdev->name,
893 			   netiucv_printname(conn->userid));
894 		fsm_newstate(fi, CONN_STATE_STARTWAIT);
895 		break;
896 	case 13:
897 		PRINT_WARN("%s: Too many IUCV connections.\n",
898 			   conn->netdev->name);
899 		fsm_newstate(fi, CONN_STATE_CONNERR);
900 		break;
901 	case 14:
902 		PRINT_WARN("%s: User %s has too many IUCV connections.\n",
903 			   conn->netdev->name,
904 			   netiucv_printname(conn->userid));
905 		fsm_newstate(fi, CONN_STATE_CONNERR);
906 		break;
907 	case 15:
908 		PRINT_WARN("%s: No IUCV authorization in CP directory.\n",
909 			   conn->netdev->name);
910 		fsm_newstate(fi, CONN_STATE_CONNERR);
911 		break;
912 	default:
913 		PRINT_WARN("%s: iucv_connect returned error %d\n",
914 			   conn->netdev->name, rc);
915 		fsm_newstate(fi, CONN_STATE_CONNERR);
916 		break;
917 	}
918 	IUCV_DBF_TEXT_(setup, 5, "iucv_connect rc is %d\n", rc);
919 	kfree(conn->path);
920 	conn->path = NULL;
921 }
922 
923 static void netiucv_purge_skb_queue(struct sk_buff_head *q)
924 {
925 	struct sk_buff *skb;
926 
927 	while ((skb = skb_dequeue(q))) {
928 		atomic_dec(&skb->users);
929 		dev_kfree_skb_any(skb);
930 	}
931 }
932 
933 static void conn_action_stop(fsm_instance *fi, int event, void *arg)
934 {
935 	struct iucv_event *ev = arg;
936 	struct iucv_connection *conn = ev->conn;
937 	struct net_device *netdev = conn->netdev;
938 	struct netiucv_priv *privptr = netdev_priv(netdev);
939 
940 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
941 
942 	fsm_deltimer(&conn->timer);
943 	fsm_newstate(fi, CONN_STATE_STOPPED);
944 	netiucv_purge_skb_queue(&conn->collect_queue);
945 	if (conn->path) {
946 		IUCV_DBF_TEXT(trace, 5, "calling iucv_path_sever\n");
947 		iucv_path_sever(conn->path, iucvMagic);
948 		kfree(conn->path);
949 		conn->path = NULL;
950 	}
951 	netiucv_purge_skb_queue(&conn->commit_queue);
952 	fsm_event(privptr->fsm, DEV_EVENT_CONDOWN, netdev);
953 }
954 
955 static void conn_action_inval(fsm_instance *fi, int event, void *arg)
956 {
957 	struct iucv_connection *conn = arg;
958 	struct net_device *netdev = conn->netdev;
959 
960 	PRINT_WARN("%s: Cannot connect without username\n", netdev->name);
961 	IUCV_DBF_TEXT(data, 2, "conn_action_inval called\n");
962 }
963 
964 static const fsm_node conn_fsm[] = {
965 	{ CONN_STATE_INVALID,   CONN_EVENT_START,    conn_action_inval      },
966 	{ CONN_STATE_STOPPED,   CONN_EVENT_START,    conn_action_start      },
967 
968 	{ CONN_STATE_STOPPED,   CONN_EVENT_STOP,     conn_action_stop       },
969 	{ CONN_STATE_STARTWAIT, CONN_EVENT_STOP,     conn_action_stop       },
970 	{ CONN_STATE_SETUPWAIT, CONN_EVENT_STOP,     conn_action_stop       },
971 	{ CONN_STATE_IDLE,      CONN_EVENT_STOP,     conn_action_stop       },
972 	{ CONN_STATE_TX,        CONN_EVENT_STOP,     conn_action_stop       },
973 	{ CONN_STATE_REGERR,    CONN_EVENT_STOP,     conn_action_stop       },
974 	{ CONN_STATE_CONNERR,   CONN_EVENT_STOP,     conn_action_stop       },
975 
976 	{ CONN_STATE_STOPPED,   CONN_EVENT_CONN_REQ, conn_action_connreject },
977         { CONN_STATE_STARTWAIT, CONN_EVENT_CONN_REQ, conn_action_connaccept },
978 	{ CONN_STATE_SETUPWAIT, CONN_EVENT_CONN_REQ, conn_action_connaccept },
979 	{ CONN_STATE_IDLE,      CONN_EVENT_CONN_REQ, conn_action_connreject },
980 	{ CONN_STATE_TX,        CONN_EVENT_CONN_REQ, conn_action_connreject },
981 
982 	{ CONN_STATE_SETUPWAIT, CONN_EVENT_CONN_ACK, conn_action_connack    },
983 	{ CONN_STATE_SETUPWAIT, CONN_EVENT_TIMER,    conn_action_conntimsev },
984 
985 	{ CONN_STATE_SETUPWAIT, CONN_EVENT_CONN_REJ, conn_action_connsever  },
986 	{ CONN_STATE_IDLE,      CONN_EVENT_CONN_REJ, conn_action_connsever  },
987 	{ CONN_STATE_TX,        CONN_EVENT_CONN_REJ, conn_action_connsever  },
988 
989 	{ CONN_STATE_IDLE,      CONN_EVENT_RX,       conn_action_rx         },
990 	{ CONN_STATE_TX,        CONN_EVENT_RX,       conn_action_rx         },
991 
992 	{ CONN_STATE_TX,        CONN_EVENT_TXDONE,   conn_action_txdone     },
993 	{ CONN_STATE_IDLE,      CONN_EVENT_TXDONE,   conn_action_txdone     },
994 };
995 
996 static const int CONN_FSM_LEN = sizeof(conn_fsm) / sizeof(fsm_node);
997 
998 
999 /*
1000  * Actions for interface - statemachine.
1001  */
1002 
1003 /**
1004  * dev_action_start
1005  * @fi: An instance of an interface statemachine.
1006  * @event: The event, just happened.
1007  * @arg: Generic pointer, casted from struct net_device * upon call.
1008  *
1009  * Startup connection by sending CONN_EVENT_START to it.
1010  */
1011 static void dev_action_start(fsm_instance *fi, int event, void *arg)
1012 {
1013 	struct net_device   *dev = arg;
1014 	struct netiucv_priv *privptr = netdev_priv(dev);
1015 
1016 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1017 
1018 	fsm_newstate(fi, DEV_STATE_STARTWAIT);
1019 	fsm_event(privptr->conn->fsm, CONN_EVENT_START, privptr->conn);
1020 }
1021 
1022 /**
1023  * Shutdown connection by sending CONN_EVENT_STOP to it.
1024  *
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.
1028  */
1029 static void
1030 dev_action_stop(fsm_instance *fi, int event, void *arg)
1031 {
1032 	struct net_device   *dev = arg;
1033 	struct netiucv_priv *privptr = netdev_priv(dev);
1034 	struct iucv_event   ev;
1035 
1036 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1037 
1038 	ev.conn = privptr->conn;
1039 
1040 	fsm_newstate(fi, DEV_STATE_STOPWAIT);
1041 	fsm_event(privptr->conn->fsm, CONN_EVENT_STOP, &ev);
1042 }
1043 
1044 /**
1045  * Called from connection statemachine
1046  * when a connection is up and running.
1047  *
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.
1051  */
1052 static void
1053 dev_action_connup(fsm_instance *fi, int event, void *arg)
1054 {
1055 	struct net_device   *dev = arg;
1056 	struct netiucv_priv *privptr = netdev_priv(dev);
1057 
1058 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1059 
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;
1075 	}
1076 }
1077 
1078 /**
1079  * Called from connection statemachine
1080  * when a connection has been shutdown.
1081  *
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.
1085  */
1086 static void
1087 dev_action_conndown(fsm_instance *fi, int event, void *arg)
1088 {
1089 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1090 
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;
1099 	}
1100 }
1101 
1102 static const fsm_node dev_fsm[] = {
1103 	{ DEV_STATE_STOPPED,    DEV_EVENT_START,   dev_action_start    },
1104 
1105 	{ DEV_STATE_STOPWAIT,   DEV_EVENT_START,   dev_action_start    },
1106 	{ DEV_STATE_STOPWAIT,   DEV_EVENT_CONDOWN, dev_action_conndown },
1107 
1108 	{ DEV_STATE_STARTWAIT,  DEV_EVENT_STOP,    dev_action_stop     },
1109 	{ DEV_STATE_STARTWAIT,  DEV_EVENT_CONUP,   dev_action_connup   },
1110 
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      },
1114 };
1115 
1116 static const int DEV_FSM_LEN = sizeof(dev_fsm) / sizeof(fsm_node);
1117 
1118 /**
1119  * Transmit a packet.
1120  * This is a helper function for netiucv_tx().
1121  *
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().
1126  *
1127  * @return 0 on success, -ERRNO on failure. (Never fails.)
1128  */
1129 static int netiucv_transmit_skb(struct iucv_connection *conn,
1130 				struct sk_buff *skb)
1131 {
1132 	struct iucv_message msg;
1133 	unsigned long saveflags;
1134 	struct ll_header header;
1135 	int rc;
1136 
1137 	if (fsm_getstate(conn->fsm) != CONN_STATE_IDLE) {
1138 		int l = skb->len + NETIUCV_HDRLEN;
1139 
1140 		spin_lock_irqsave(&conn->collect_lock, saveflags);
1141 		if (conn->collect_len + l >
1142 		    (conn->max_buffsize - NETIUCV_HDRLEN)) {
1143 			rc = -EBUSY;
1144 			IUCV_DBF_TEXT(data, 2,
1145 				      "EBUSY from netiucv_transmit_skb\n");
1146 		} else {
1147 			atomic_inc(&skb->users);
1148 			skb_queue_tail(&conn->collect_queue, skb);
1149 			conn->collect_len += l;
1150 			rc = 0;
1151 		}
1152 		spin_unlock_irqrestore(&conn->collect_lock, saveflags);
1153 	} else {
1154 		struct sk_buff *nskb = skb;
1155 		/**
1156 		 * Copy the skb to a new allocated skb in lowmem only if the
1157 		 * data is located above 2G in memory or tailroom is < 2.
1158 		 */
1159 		unsigned long hi = ((unsigned long)(skb_tail_pointer(skb) +
1160 				    NETIUCV_HDRLEN)) >> 31;
1161 		int copied = 0;
1162 		if (hi || (skb_tailroom(skb) < 2)) {
1163 			nskb = alloc_skb(skb->len + NETIUCV_HDRLEN +
1164 					 NETIUCV_HDRLEN, GFP_ATOMIC | GFP_DMA);
1165 			if (!nskb) {
1166 				PRINT_WARN("%s: Could not allocate tx_skb\n",
1167 				       conn->netdev->name);
1168 				IUCV_DBF_TEXT(data, 2, "alloc_skb failed\n");
1169 				rc = -ENOMEM;
1170 				return rc;
1171 			} else {
1172 				skb_reserve(nskb, NETIUCV_HDRLEN);
1173 				memcpy(skb_put(nskb, skb->len),
1174 				       skb->data, skb->len);
1175 			}
1176 			copied = 1;
1177 		}
1178 		/**
1179 		 * skb now is below 2G and has enough room. Add headers.
1180 		 */
1181 		header.next = nskb->len + NETIUCV_HDRLEN;
1182 		memcpy(skb_push(nskb, NETIUCV_HDRLEN), &header, NETIUCV_HDRLEN);
1183 		header.next = 0;
1184 		memcpy(skb_put(nskb, NETIUCV_HDRLEN), &header,  NETIUCV_HDRLEN);
1185 
1186 		fsm_newstate(conn->fsm, CONN_STATE_TX);
1187 		conn->prof.send_stamp = current_kernel_time();
1188 
1189 		msg.tag = 1;
1190 		msg.class = 0;
1191 		rc = iucv_message_send(conn->path, &msg, 0, 0,
1192 				       nskb->data, nskb->len);
1193 		conn->prof.doios_single++;
1194 		conn->prof.txlen += skb->len;
1195 		conn->prof.tx_pending++;
1196 		if (conn->prof.tx_pending > conn->prof.tx_max_pending)
1197 			conn->prof.tx_max_pending = conn->prof.tx_pending;
1198 		if (rc) {
1199 			struct netiucv_priv *privptr;
1200 			fsm_newstate(conn->fsm, CONN_STATE_IDLE);
1201 			conn->prof.tx_pending--;
1202 			privptr = netdev_priv(conn->netdev);
1203 			if (privptr)
1204 				privptr->stats.tx_errors++;
1205 			if (copied)
1206 				dev_kfree_skb(nskb);
1207 			else {
1208 				/**
1209 				 * Remove our headers. They get added
1210 				 * again on retransmit.
1211 				 */
1212 				skb_pull(skb, NETIUCV_HDRLEN);
1213 				skb_trim(skb, skb->len - NETIUCV_HDRLEN);
1214 			}
1215 			PRINT_WARN("iucv_send returned %08x\n",	rc);
1216 			IUCV_DBF_TEXT_(data, 2, "rc %d from iucv_send\n", rc);
1217 		} else {
1218 			if (copied)
1219 				dev_kfree_skb(skb);
1220 			atomic_inc(&nskb->users);
1221 			skb_queue_tail(&conn->commit_queue, nskb);
1222 		}
1223 	}
1224 
1225 	return rc;
1226 }
1227 
1228 /*
1229  * Interface API for upper network layers
1230  */
1231 
1232 /**
1233  * Open an interface.
1234  * Called from generic network layer when ifconfig up is run.
1235  *
1236  * @param dev Pointer to interface struct.
1237  *
1238  * @return 0 on success, -ERRNO on failure. (Never fails.)
1239  */
1240 static int netiucv_open(struct net_device *dev)
1241 {
1242 	struct netiucv_priv *priv = netdev_priv(dev);
1243 
1244 	fsm_event(priv->fsm, DEV_EVENT_START, dev);
1245 	return 0;
1246 }
1247 
1248 /**
1249  * Close an interface.
1250  * Called from generic network layer when ifconfig down is run.
1251  *
1252  * @param dev Pointer to interface struct.
1253  *
1254  * @return 0 on success, -ERRNO on failure. (Never fails.)
1255  */
1256 static int netiucv_close(struct net_device *dev)
1257 {
1258 	struct netiucv_priv *priv = netdev_priv(dev);
1259 
1260 	fsm_event(priv->fsm, DEV_EVENT_STOP, dev);
1261 	return 0;
1262 }
1263 
1264 /**
1265  * Start transmission of a packet.
1266  * Called from generic network device layer.
1267  *
1268  * @param skb Pointer to buffer containing the packet.
1269  * @param dev Pointer to interface struct.
1270  *
1271  * @return 0 if packet consumed, !0 if packet rejected.
1272  *         Note: If we return !0, then the packet is free'd by
1273  *               the generic network layer.
1274  */
1275 static int netiucv_tx(struct sk_buff *skb, struct net_device *dev)
1276 {
1277 	struct netiucv_priv *privptr = netdev_priv(dev);
1278 	int rc;
1279 
1280 	IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
1281 	/**
1282 	 * Some sanity checks ...
1283 	 */
1284 	if (skb == NULL) {
1285 		PRINT_WARN("%s: NULL sk_buff passed\n", dev->name);
1286 		IUCV_DBF_TEXT(data, 2, "netiucv_tx: skb is NULL\n");
1287 		privptr->stats.tx_dropped++;
1288 		return 0;
1289 	}
1290 	if (skb_headroom(skb) < NETIUCV_HDRLEN) {
1291 		PRINT_WARN("%s: Got sk_buff with head room < %ld bytes\n",
1292 		       dev->name, NETIUCV_HDRLEN);
1293 		IUCV_DBF_TEXT(data, 2,
1294 			"netiucv_tx: skb_headroom < NETIUCV_HDRLEN\n");
1295 		dev_kfree_skb(skb);
1296 		privptr->stats.tx_dropped++;
1297 		return 0;
1298 	}
1299 
1300 	/**
1301 	 * If connection is not running, try to restart it
1302 	 * and throw away packet.
1303 	 */
1304 	if (fsm_getstate(privptr->fsm) != DEV_STATE_RUNNING) {
1305 		if (!in_atomic())
1306 			fsm_event(privptr->fsm, DEV_EVENT_START, dev);
1307 		dev_kfree_skb(skb);
1308 		privptr->stats.tx_dropped++;
1309 		privptr->stats.tx_errors++;
1310 		privptr->stats.tx_carrier_errors++;
1311 		return 0;
1312 	}
1313 
1314 	if (netiucv_test_and_set_busy(dev)) {
1315 		IUCV_DBF_TEXT(data, 2, "EBUSY from netiucv_tx\n");
1316 		return -EBUSY;
1317 	}
1318 	dev->trans_start = jiffies;
1319 	rc = netiucv_transmit_skb(privptr->conn, skb) != 0;
1320 	netiucv_clear_busy(dev);
1321 	return rc;
1322 }
1323 
1324 /**
1325  * netiucv_stats
1326  * @dev: Pointer to interface struct.
1327  *
1328  * Returns interface statistics of a device.
1329  *
1330  * Returns pointer to stats struct of this interface.
1331  */
1332 static struct net_device_stats *netiucv_stats (struct net_device * dev)
1333 {
1334 	struct netiucv_priv *priv = netdev_priv(dev);
1335 
1336 	IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1337 	return &priv->stats;
1338 }
1339 
1340 /**
1341  * netiucv_change_mtu
1342  * @dev: Pointer to interface struct.
1343  * @new_mtu: The new MTU to use for this interface.
1344  *
1345  * Sets MTU of an interface.
1346  *
1347  * Returns 0 on success, -EINVAL if MTU is out of valid range.
1348  *         (valid range is 576 .. NETIUCV_MTU_MAX).
1349  */
1350 static int netiucv_change_mtu(struct net_device * dev, int new_mtu)
1351 {
1352 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1353 	if (new_mtu < 576 || new_mtu > NETIUCV_MTU_MAX) {
1354 		IUCV_DBF_TEXT(setup, 2, "given MTU out of valid range\n");
1355 		return -EINVAL;
1356 	}
1357 	dev->mtu = new_mtu;
1358 	return 0;
1359 }
1360 
1361 /*
1362  * attributes in sysfs
1363  */
1364 
1365 static ssize_t user_show(struct device *dev, struct device_attribute *attr,
1366 			 char *buf)
1367 {
1368 	struct netiucv_priv *priv = dev->driver_data;
1369 
1370 	IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1371 	return sprintf(buf, "%s\n", netiucv_printname(priv->conn->userid));
1372 }
1373 
1374 static ssize_t user_write(struct device *dev, struct device_attribute *attr,
1375 			  const char *buf, size_t count)
1376 {
1377 	struct netiucv_priv *priv = dev->driver_data;
1378 	struct net_device *ndev = priv->conn->netdev;
1379 	char    *p;
1380 	char    *tmp;
1381 	char 	username[9];
1382 	int 	i;
1383 	struct iucv_connection *cp;
1384 
1385 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1386 	if (count > 9) {
1387 		PRINT_WARN("netiucv: username too long (%d)!\n", (int) count);
1388 		IUCV_DBF_TEXT_(setup, 2,
1389 			       "%d is length of username\n", (int) count);
1390 		return -EINVAL;
1391 	}
1392 
1393 	tmp = strsep((char **) &buf, "\n");
1394 	for (i = 0, p = tmp; i < 8 && *p; i++, p++) {
1395 		if (isalnum(*p) || (*p == '$')) {
1396 			username[i]= toupper(*p);
1397 			continue;
1398 		}
1399 		if (*p == '\n') {
1400 			/* trailing lf, grr */
1401 			break;
1402 		}
1403 		PRINT_WARN("netiucv: Invalid char %c in username!\n", *p);
1404 		IUCV_DBF_TEXT_(setup, 2,
1405 			       "username: invalid character %c\n", *p);
1406 		return -EINVAL;
1407 	}
1408 	while (i < 8)
1409 		username[i++] = ' ';
1410 	username[8] = '\0';
1411 
1412 	if (memcmp(username, priv->conn->userid, 9) &&
1413 	    (ndev->flags & (IFF_UP | IFF_RUNNING))) {
1414 		/* username changed while the interface is active. */
1415 		PRINT_WARN("netiucv: device %s active, connected to %s\n",
1416 			   dev->bus_id, priv->conn->userid);
1417 		PRINT_WARN("netiucv: user cannot be updated\n");
1418 		IUCV_DBF_TEXT(setup, 2, "user_write: device active\n");
1419 		return -EBUSY;
1420 	}
1421 	read_lock_bh(&iucv_connection_rwlock);
1422 	list_for_each_entry(cp, &iucv_connection_list, list) {
1423 		if (!strncmp(username, cp->userid, 9) && cp->netdev != ndev) {
1424 			read_unlock_bh(&iucv_connection_rwlock);
1425 			PRINT_WARN("netiucv: Connection to %s already "
1426 				   "exists\n", username);
1427 			return -EEXIST;
1428 		}
1429 	}
1430 	read_unlock_bh(&iucv_connection_rwlock);
1431 	memcpy(priv->conn->userid, username, 9);
1432 	return count;
1433 }
1434 
1435 static DEVICE_ATTR(user, 0644, user_show, user_write);
1436 
1437 static ssize_t buffer_show (struct device *dev, struct device_attribute *attr,
1438 			    char *buf)
1439 {	struct netiucv_priv *priv = dev->driver_data;
1440 
1441 	IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1442 	return sprintf(buf, "%d\n", priv->conn->max_buffsize);
1443 }
1444 
1445 static ssize_t buffer_write (struct device *dev, struct device_attribute *attr,
1446 			     const char *buf, size_t count)
1447 {
1448 	struct netiucv_priv *priv = dev->driver_data;
1449 	struct net_device *ndev = priv->conn->netdev;
1450 	char         *e;
1451 	int          bs1;
1452 
1453 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1454 	if (count >= 39)
1455 		return -EINVAL;
1456 
1457 	bs1 = simple_strtoul(buf, &e, 0);
1458 
1459 	if (e && (!isspace(*e))) {
1460 		PRINT_WARN("netiucv: Invalid character in buffer!\n");
1461 		IUCV_DBF_TEXT_(setup, 2, "buffer_write: invalid char %c\n", *e);
1462 		return -EINVAL;
1463 	}
1464 	if (bs1 > NETIUCV_BUFSIZE_MAX) {
1465 		PRINT_WARN("netiucv: Given buffer size %d too large.\n",
1466 			bs1);
1467 		IUCV_DBF_TEXT_(setup, 2,
1468 			"buffer_write: buffer size %d too large\n",
1469 			bs1);
1470 		return -EINVAL;
1471 	}
1472 	if ((ndev->flags & IFF_RUNNING) &&
1473 	    (bs1 < (ndev->mtu + NETIUCV_HDRLEN + 2))) {
1474 		PRINT_WARN("netiucv: Given buffer size %d too small.\n",
1475 			bs1);
1476 		IUCV_DBF_TEXT_(setup, 2,
1477 			"buffer_write: buffer size %d too small\n",
1478 			bs1);
1479 		return -EINVAL;
1480 	}
1481 	if (bs1 < (576 + NETIUCV_HDRLEN + NETIUCV_HDRLEN)) {
1482 		PRINT_WARN("netiucv: Given buffer size %d too small.\n",
1483 			bs1);
1484 		IUCV_DBF_TEXT_(setup, 2,
1485 			"buffer_write: buffer size %d too small\n",
1486 			bs1);
1487 		return -EINVAL;
1488 	}
1489 
1490 	priv->conn->max_buffsize = bs1;
1491 	if (!(ndev->flags & IFF_RUNNING))
1492 		ndev->mtu = bs1 - NETIUCV_HDRLEN - NETIUCV_HDRLEN;
1493 
1494 	return count;
1495 
1496 }
1497 
1498 static DEVICE_ATTR(buffer, 0644, buffer_show, buffer_write);
1499 
1500 static ssize_t dev_fsm_show (struct device *dev, struct device_attribute *attr,
1501 			     char *buf)
1502 {
1503 	struct netiucv_priv *priv = dev->driver_data;
1504 
1505 	IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1506 	return sprintf(buf, "%s\n", fsm_getstate_str(priv->fsm));
1507 }
1508 
1509 static DEVICE_ATTR(device_fsm_state, 0444, dev_fsm_show, NULL);
1510 
1511 static ssize_t conn_fsm_show (struct device *dev,
1512 			      struct device_attribute *attr, char *buf)
1513 {
1514 	struct netiucv_priv *priv = dev->driver_data;
1515 
1516 	IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1517 	return sprintf(buf, "%s\n", fsm_getstate_str(priv->conn->fsm));
1518 }
1519 
1520 static DEVICE_ATTR(connection_fsm_state, 0444, conn_fsm_show, NULL);
1521 
1522 static ssize_t maxmulti_show (struct device *dev,
1523 			      struct device_attribute *attr, char *buf)
1524 {
1525 	struct netiucv_priv *priv = dev->driver_data;
1526 
1527 	IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1528 	return sprintf(buf, "%ld\n", priv->conn->prof.maxmulti);
1529 }
1530 
1531 static ssize_t maxmulti_write (struct device *dev,
1532 			       struct device_attribute *attr,
1533 			       const char *buf, size_t count)
1534 {
1535 	struct netiucv_priv *priv = dev->driver_data;
1536 
1537 	IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
1538 	priv->conn->prof.maxmulti = 0;
1539 	return count;
1540 }
1541 
1542 static DEVICE_ATTR(max_tx_buffer_used, 0644, maxmulti_show, maxmulti_write);
1543 
1544 static ssize_t maxcq_show (struct device *dev, struct device_attribute *attr,
1545 			   char *buf)
1546 {
1547 	struct netiucv_priv *priv = dev->driver_data;
1548 
1549 	IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1550 	return sprintf(buf, "%ld\n", priv->conn->prof.maxcqueue);
1551 }
1552 
1553 static ssize_t maxcq_write (struct device *dev, struct device_attribute *attr,
1554 			    const char *buf, size_t count)
1555 {
1556 	struct netiucv_priv *priv = dev->driver_data;
1557 
1558 	IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
1559 	priv->conn->prof.maxcqueue = 0;
1560 	return count;
1561 }
1562 
1563 static DEVICE_ATTR(max_chained_skbs, 0644, maxcq_show, maxcq_write);
1564 
1565 static ssize_t sdoio_show (struct device *dev, struct device_attribute *attr,
1566 			   char *buf)
1567 {
1568 	struct netiucv_priv *priv = dev->driver_data;
1569 
1570 	IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1571 	return sprintf(buf, "%ld\n", priv->conn->prof.doios_single);
1572 }
1573 
1574 static ssize_t sdoio_write (struct device *dev, struct device_attribute *attr,
1575 			    const char *buf, size_t count)
1576 {
1577 	struct netiucv_priv *priv = dev->driver_data;
1578 
1579 	IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
1580 	priv->conn->prof.doios_single = 0;
1581 	return count;
1582 }
1583 
1584 static DEVICE_ATTR(tx_single_write_ops, 0644, sdoio_show, sdoio_write);
1585 
1586 static ssize_t mdoio_show (struct device *dev, struct device_attribute *attr,
1587 			   char *buf)
1588 {
1589 	struct netiucv_priv *priv = dev->driver_data;
1590 
1591 	IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1592 	return sprintf(buf, "%ld\n", priv->conn->prof.doios_multi);
1593 }
1594 
1595 static ssize_t mdoio_write (struct device *dev, struct device_attribute *attr,
1596 			    const char *buf, size_t count)
1597 {
1598 	struct netiucv_priv *priv = dev->driver_data;
1599 
1600 	IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1601 	priv->conn->prof.doios_multi = 0;
1602 	return count;
1603 }
1604 
1605 static DEVICE_ATTR(tx_multi_write_ops, 0644, mdoio_show, mdoio_write);
1606 
1607 static ssize_t txlen_show (struct device *dev, struct device_attribute *attr,
1608 			   char *buf)
1609 {
1610 	struct netiucv_priv *priv = dev->driver_data;
1611 
1612 	IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1613 	return sprintf(buf, "%ld\n", priv->conn->prof.txlen);
1614 }
1615 
1616 static ssize_t txlen_write (struct device *dev, struct device_attribute *attr,
1617 			    const char *buf, size_t count)
1618 {
1619 	struct netiucv_priv *priv = dev->driver_data;
1620 
1621 	IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
1622 	priv->conn->prof.txlen = 0;
1623 	return count;
1624 }
1625 
1626 static DEVICE_ATTR(netto_bytes, 0644, txlen_show, txlen_write);
1627 
1628 static ssize_t txtime_show (struct device *dev, struct device_attribute *attr,
1629 			    char *buf)
1630 {
1631 	struct netiucv_priv *priv = dev->driver_data;
1632 
1633 	IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1634 	return sprintf(buf, "%ld\n", priv->conn->prof.tx_time);
1635 }
1636 
1637 static ssize_t txtime_write (struct device *dev, struct device_attribute *attr,
1638 			     const char *buf, size_t count)
1639 {
1640 	struct netiucv_priv *priv = dev->driver_data;
1641 
1642 	IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
1643 	priv->conn->prof.tx_time = 0;
1644 	return count;
1645 }
1646 
1647 static DEVICE_ATTR(max_tx_io_time, 0644, txtime_show, txtime_write);
1648 
1649 static ssize_t txpend_show (struct device *dev, struct device_attribute *attr,
1650 			    char *buf)
1651 {
1652 	struct netiucv_priv *priv = dev->driver_data;
1653 
1654 	IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1655 	return sprintf(buf, "%ld\n", priv->conn->prof.tx_pending);
1656 }
1657 
1658 static ssize_t txpend_write (struct device *dev, struct device_attribute *attr,
1659 			     const char *buf, size_t count)
1660 {
1661 	struct netiucv_priv *priv = dev->driver_data;
1662 
1663 	IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
1664 	priv->conn->prof.tx_pending = 0;
1665 	return count;
1666 }
1667 
1668 static DEVICE_ATTR(tx_pending, 0644, txpend_show, txpend_write);
1669 
1670 static ssize_t txmpnd_show (struct device *dev, struct device_attribute *attr,
1671 			    char *buf)
1672 {
1673 	struct netiucv_priv *priv = dev->driver_data;
1674 
1675 	IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
1676 	return sprintf(buf, "%ld\n", priv->conn->prof.tx_max_pending);
1677 }
1678 
1679 static ssize_t txmpnd_write (struct device *dev, struct device_attribute *attr,
1680 			     const char *buf, size_t count)
1681 {
1682 	struct netiucv_priv *priv = dev->driver_data;
1683 
1684 	IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
1685 	priv->conn->prof.tx_max_pending = 0;
1686 	return count;
1687 }
1688 
1689 static DEVICE_ATTR(tx_max_pending, 0644, txmpnd_show, txmpnd_write);
1690 
1691 static struct attribute *netiucv_attrs[] = {
1692 	&dev_attr_buffer.attr,
1693 	&dev_attr_user.attr,
1694 	NULL,
1695 };
1696 
1697 static struct attribute_group netiucv_attr_group = {
1698 	.attrs = netiucv_attrs,
1699 };
1700 
1701 static struct attribute *netiucv_stat_attrs[] = {
1702 	&dev_attr_device_fsm_state.attr,
1703 	&dev_attr_connection_fsm_state.attr,
1704 	&dev_attr_max_tx_buffer_used.attr,
1705 	&dev_attr_max_chained_skbs.attr,
1706 	&dev_attr_tx_single_write_ops.attr,
1707 	&dev_attr_tx_multi_write_ops.attr,
1708 	&dev_attr_netto_bytes.attr,
1709 	&dev_attr_max_tx_io_time.attr,
1710 	&dev_attr_tx_pending.attr,
1711 	&dev_attr_tx_max_pending.attr,
1712 	NULL,
1713 };
1714 
1715 static struct attribute_group netiucv_stat_attr_group = {
1716 	.name  = "stats",
1717 	.attrs = netiucv_stat_attrs,
1718 };
1719 
1720 static int netiucv_add_files(struct device *dev)
1721 {
1722 	int ret;
1723 
1724 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1725 	ret = sysfs_create_group(&dev->kobj, &netiucv_attr_group);
1726 	if (ret)
1727 		return ret;
1728 	ret = sysfs_create_group(&dev->kobj, &netiucv_stat_attr_group);
1729 	if (ret)
1730 		sysfs_remove_group(&dev->kobj, &netiucv_attr_group);
1731 	return ret;
1732 }
1733 
1734 static void netiucv_remove_files(struct device *dev)
1735 {
1736 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1737 	sysfs_remove_group(&dev->kobj, &netiucv_stat_attr_group);
1738 	sysfs_remove_group(&dev->kobj, &netiucv_attr_group);
1739 }
1740 
1741 static int netiucv_register_device(struct net_device *ndev)
1742 {
1743 	struct netiucv_priv *priv = netdev_priv(ndev);
1744 	struct device *dev = kzalloc(sizeof(struct device), GFP_KERNEL);
1745 	int ret;
1746 
1747 
1748 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1749 
1750 	if (dev) {
1751 		snprintf(dev->bus_id, BUS_ID_SIZE, "net%s", ndev->name);
1752 		dev->bus = &iucv_bus;
1753 		dev->parent = iucv_root;
1754 		/*
1755 		 * The release function could be called after the
1756 		 * module has been unloaded. It's _only_ task is to
1757 		 * free the struct. Therefore, we specify kfree()
1758 		 * directly here. (Probably a little bit obfuscating
1759 		 * but legitime ...).
1760 		 */
1761 		dev->release = (void (*)(struct device *))kfree;
1762 		dev->driver = &netiucv_driver;
1763 	} else
1764 		return -ENOMEM;
1765 
1766 	ret = device_register(dev);
1767 
1768 	if (ret)
1769 		return ret;
1770 	ret = netiucv_add_files(dev);
1771 	if (ret)
1772 		goto out_unreg;
1773 	priv->dev = dev;
1774 	dev->driver_data = priv;
1775 	return 0;
1776 
1777 out_unreg:
1778 	device_unregister(dev);
1779 	return ret;
1780 }
1781 
1782 static void netiucv_unregister_device(struct device *dev)
1783 {
1784 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1785 	netiucv_remove_files(dev);
1786 	device_unregister(dev);
1787 }
1788 
1789 /**
1790  * Allocate and initialize a new connection structure.
1791  * Add it to the list of netiucv connections;
1792  */
1793 static struct iucv_connection *netiucv_new_connection(struct net_device *dev,
1794 						      char *username)
1795 {
1796 	struct iucv_connection *conn;
1797 
1798 	conn = kzalloc(sizeof(*conn), GFP_KERNEL);
1799 	if (!conn)
1800 		goto out;
1801 	skb_queue_head_init(&conn->collect_queue);
1802 	skb_queue_head_init(&conn->commit_queue);
1803 	spin_lock_init(&conn->collect_lock);
1804 	conn->max_buffsize = NETIUCV_BUFSIZE_DEFAULT;
1805 	conn->netdev = dev;
1806 
1807 	conn->rx_buff = alloc_skb(conn->max_buffsize, GFP_KERNEL | GFP_DMA);
1808 	if (!conn->rx_buff)
1809 		goto out_conn;
1810 	conn->tx_buff = alloc_skb(conn->max_buffsize, GFP_KERNEL | GFP_DMA);
1811 	if (!conn->tx_buff)
1812 		goto out_rx;
1813 	conn->fsm = init_fsm("netiucvconn", conn_state_names,
1814 			     conn_event_names, NR_CONN_STATES,
1815 			     NR_CONN_EVENTS, conn_fsm, CONN_FSM_LEN,
1816 			     GFP_KERNEL);
1817 	if (!conn->fsm)
1818 		goto out_tx;
1819 
1820 	fsm_settimer(conn->fsm, &conn->timer);
1821 	fsm_newstate(conn->fsm, CONN_STATE_INVALID);
1822 
1823 	if (username) {
1824 		memcpy(conn->userid, username, 9);
1825 		fsm_newstate(conn->fsm, CONN_STATE_STOPPED);
1826 	}
1827 
1828 	write_lock_bh(&iucv_connection_rwlock);
1829 	list_add_tail(&conn->list, &iucv_connection_list);
1830 	write_unlock_bh(&iucv_connection_rwlock);
1831 	return conn;
1832 
1833 out_tx:
1834 	kfree_skb(conn->tx_buff);
1835 out_rx:
1836 	kfree_skb(conn->rx_buff);
1837 out_conn:
1838 	kfree(conn);
1839 out:
1840 	return NULL;
1841 }
1842 
1843 /**
1844  * Release a connection structure and remove it from the
1845  * list of netiucv connections.
1846  */
1847 static void netiucv_remove_connection(struct iucv_connection *conn)
1848 {
1849 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1850 	write_lock_bh(&iucv_connection_rwlock);
1851 	list_del_init(&conn->list);
1852 	write_unlock_bh(&iucv_connection_rwlock);
1853 	fsm_deltimer(&conn->timer);
1854 	netiucv_purge_skb_queue(&conn->collect_queue);
1855 	if (conn->path) {
1856 		iucv_path_sever(conn->path, iucvMagic);
1857 		kfree(conn->path);
1858 		conn->path = NULL;
1859 	}
1860 	netiucv_purge_skb_queue(&conn->commit_queue);
1861 	kfree_fsm(conn->fsm);
1862 	kfree_skb(conn->rx_buff);
1863 	kfree_skb(conn->tx_buff);
1864 }
1865 
1866 /**
1867  * Release everything of a net device.
1868  */
1869 static void netiucv_free_netdevice(struct net_device *dev)
1870 {
1871 	struct netiucv_priv *privptr = netdev_priv(dev);
1872 
1873 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1874 
1875 	if (!dev)
1876 		return;
1877 
1878 	if (privptr) {
1879 		if (privptr->conn)
1880 			netiucv_remove_connection(privptr->conn);
1881 		if (privptr->fsm)
1882 			kfree_fsm(privptr->fsm);
1883 		privptr->conn = NULL; privptr->fsm = NULL;
1884 		/* privptr gets freed by free_netdev() */
1885 	}
1886 	free_netdev(dev);
1887 }
1888 
1889 /**
1890  * Initialize a net device. (Called from kernel in alloc_netdev())
1891  */
1892 static void netiucv_setup_netdevice(struct net_device *dev)
1893 {
1894 	dev->mtu	         = NETIUCV_MTU_DEFAULT;
1895 	dev->hard_start_xmit     = netiucv_tx;
1896 	dev->open	         = netiucv_open;
1897 	dev->stop	         = netiucv_close;
1898 	dev->get_stats	         = netiucv_stats;
1899 	dev->change_mtu          = netiucv_change_mtu;
1900 	dev->destructor          = netiucv_free_netdevice;
1901 	dev->hard_header_len     = NETIUCV_HDRLEN;
1902 	dev->addr_len            = 0;
1903 	dev->type                = ARPHRD_SLIP;
1904 	dev->tx_queue_len        = NETIUCV_QUEUELEN_DEFAULT;
1905 	dev->flags	         = IFF_POINTOPOINT | IFF_NOARP;
1906 }
1907 
1908 /**
1909  * Allocate and initialize everything of a net device.
1910  */
1911 static struct net_device *netiucv_init_netdevice(char *username)
1912 {
1913 	struct netiucv_priv *privptr;
1914 	struct net_device *dev;
1915 
1916 	dev = alloc_netdev(sizeof(struct netiucv_priv), "iucv%d",
1917 			   netiucv_setup_netdevice);
1918 	if (!dev)
1919 		return NULL;
1920 	if (dev_alloc_name(dev, dev->name) < 0)
1921 		goto out_netdev;
1922 
1923 	privptr = netdev_priv(dev);
1924 	privptr->fsm = init_fsm("netiucvdev", dev_state_names,
1925 				dev_event_names, NR_DEV_STATES, NR_DEV_EVENTS,
1926 				dev_fsm, DEV_FSM_LEN, GFP_KERNEL);
1927 	if (!privptr->fsm)
1928 		goto out_netdev;
1929 
1930 	privptr->conn = netiucv_new_connection(dev, username);
1931 	if (!privptr->conn) {
1932 		IUCV_DBF_TEXT(setup, 2, "NULL from netiucv_new_connection\n");
1933 		goto out_fsm;
1934 	}
1935 	fsm_newstate(privptr->fsm, DEV_STATE_STOPPED);
1936 	return dev;
1937 
1938 out_fsm:
1939 	kfree_fsm(privptr->fsm);
1940 out_netdev:
1941 	free_netdev(dev);
1942 	return NULL;
1943 }
1944 
1945 static ssize_t conn_write(struct device_driver *drv,
1946 			  const char *buf, size_t count)
1947 {
1948 	const char *p;
1949 	char username[9];
1950 	int i, rc;
1951 	struct net_device *dev;
1952 	struct netiucv_priv *priv;
1953 	struct iucv_connection *cp;
1954 
1955 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
1956 	if (count>9) {
1957 		PRINT_WARN("netiucv: username too long (%d)!\n", (int)count);
1958 		IUCV_DBF_TEXT(setup, 2, "conn_write: too long\n");
1959 		return -EINVAL;
1960 	}
1961 
1962 	for (i = 0, p = buf; i < 8 && *p; i++, p++) {
1963 		if (isalnum(*p) || *p == '$') {
1964 			username[i] = toupper(*p);
1965 			continue;
1966 		}
1967 		if (*p == '\n')
1968 			/* trailing lf, grr */
1969 			break;
1970 		PRINT_WARN("netiucv: Invalid character in username!\n");
1971 		IUCV_DBF_TEXT_(setup, 2,
1972 			       "conn_write: invalid character %c\n", *p);
1973 		return -EINVAL;
1974 	}
1975 	while (i < 8)
1976 		username[i++] = ' ';
1977 	username[8] = '\0';
1978 
1979 	read_lock_bh(&iucv_connection_rwlock);
1980 	list_for_each_entry(cp, &iucv_connection_list, list) {
1981 		if (!strncmp(username, cp->userid, 9)) {
1982 			read_unlock_bh(&iucv_connection_rwlock);
1983 			PRINT_WARN("netiucv: Connection to %s already "
1984 				   "exists\n", username);
1985 			return -EEXIST;
1986 		}
1987 	}
1988 	read_unlock_bh(&iucv_connection_rwlock);
1989 
1990 	dev = netiucv_init_netdevice(username);
1991 	if (!dev) {
1992 		PRINT_WARN("netiucv: Could not allocate network device "
1993 			   "structure for user '%s'\n",
1994 			   netiucv_printname(username));
1995 		IUCV_DBF_TEXT(setup, 2, "NULL from netiucv_init_netdevice\n");
1996 		return -ENODEV;
1997 	}
1998 
1999 	rc = netiucv_register_device(dev);
2000 	if (rc) {
2001 		IUCV_DBF_TEXT_(setup, 2,
2002 			"ret %d from netiucv_register_device\n", rc);
2003 		goto out_free_ndev;
2004 	}
2005 
2006 	/* sysfs magic */
2007 	priv = netdev_priv(dev);
2008 	SET_NETDEV_DEV(dev, priv->dev);
2009 
2010 	rc = register_netdev(dev);
2011 	if (rc)
2012 		goto out_unreg;
2013 
2014 	PRINT_INFO("%s: '%s'\n", dev->name, netiucv_printname(username));
2015 
2016 	return count;
2017 
2018 out_unreg:
2019 	netiucv_unregister_device(priv->dev);
2020 out_free_ndev:
2021 	PRINT_WARN("netiucv: Could not register '%s'\n", dev->name);
2022 	IUCV_DBF_TEXT(setup, 2, "conn_write: could not register\n");
2023 	netiucv_free_netdevice(dev);
2024 	return rc;
2025 }
2026 
2027 static DRIVER_ATTR(connection, 0200, NULL, conn_write);
2028 
2029 static ssize_t remove_write (struct device_driver *drv,
2030 			     const char *buf, size_t count)
2031 {
2032 	struct iucv_connection *cp;
2033         struct net_device *ndev;
2034         struct netiucv_priv *priv;
2035         struct device *dev;
2036         char name[IFNAMSIZ];
2037 	const char *p;
2038         int i;
2039 
2040         IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
2041 
2042         if (count >= IFNAMSIZ)
2043                 count = IFNAMSIZ - 1;;
2044 
2045 	for (i = 0, p = buf; i < count && *p; i++, p++) {
2046 		if (*p == '\n' || *p == ' ')
2047                         /* trailing lf, grr */
2048                         break;
2049 		name[i] = *p;
2050         }
2051         name[i] = '\0';
2052 
2053 	read_lock_bh(&iucv_connection_rwlock);
2054 	list_for_each_entry(cp, &iucv_connection_list, list) {
2055 		ndev = cp->netdev;
2056 		priv = netdev_priv(ndev);
2057                 dev = priv->dev;
2058 		if (strncmp(name, ndev->name, count))
2059 			continue;
2060 		read_unlock_bh(&iucv_connection_rwlock);
2061                 if (ndev->flags & (IFF_UP | IFF_RUNNING)) {
2062 			PRINT_WARN("netiucv: net device %s active with peer "
2063 				   "%s\n", ndev->name, priv->conn->userid);
2064                         PRINT_WARN("netiucv: %s cannot be removed\n",
2065 				   ndev->name);
2066 			IUCV_DBF_TEXT(data, 2, "remove_write: still active\n");
2067                         return -EBUSY;
2068                 }
2069                 unregister_netdev(ndev);
2070                 netiucv_unregister_device(dev);
2071                 return count;
2072         }
2073 	read_unlock_bh(&iucv_connection_rwlock);
2074         PRINT_WARN("netiucv: net device %s unknown\n", name);
2075 	IUCV_DBF_TEXT(data, 2, "remove_write: unknown device\n");
2076         return -EINVAL;
2077 }
2078 
2079 static DRIVER_ATTR(remove, 0200, NULL, remove_write);
2080 
2081 static struct attribute * netiucv_drv_attrs[] = {
2082 	&driver_attr_connection.attr,
2083 	&driver_attr_remove.attr,
2084 	NULL,
2085 };
2086 
2087 static struct attribute_group netiucv_drv_attr_group = {
2088 	.attrs = netiucv_drv_attrs,
2089 };
2090 
2091 static struct attribute_group *netiucv_drv_attr_groups[] = {
2092 	&netiucv_drv_attr_group,
2093 	NULL,
2094 };
2095 
2096 static void netiucv_banner(void)
2097 {
2098 	PRINT_INFO("NETIUCV driver initialized\n");
2099 }
2100 
2101 static void __exit netiucv_exit(void)
2102 {
2103 	struct iucv_connection *cp;
2104 	struct net_device *ndev;
2105 	struct netiucv_priv *priv;
2106 	struct device *dev;
2107 
2108 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
2109 	while (!list_empty(&iucv_connection_list)) {
2110 		cp = list_entry(iucv_connection_list.next,
2111 				struct iucv_connection, list);
2112 		ndev = cp->netdev;
2113 		priv = netdev_priv(ndev);
2114 		dev = priv->dev;
2115 
2116 		unregister_netdev(ndev);
2117 		netiucv_unregister_device(dev);
2118 	}
2119 
2120 	driver_unregister(&netiucv_driver);
2121 	iucv_unregister(&netiucv_handler, 1);
2122 	iucv_unregister_dbf_views();
2123 
2124 	PRINT_INFO("NETIUCV driver unloaded\n");
2125 	return;
2126 }
2127 
2128 static int __init netiucv_init(void)
2129 {
2130 	int rc;
2131 
2132 	rc = iucv_register_dbf_views();
2133 	if (rc)
2134 		goto out;
2135 	rc = iucv_register(&netiucv_handler, 1);
2136 	if (rc)
2137 		goto out_dbf;
2138 	IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
2139 	netiucv_driver.groups = netiucv_drv_attr_groups;
2140 	rc = driver_register(&netiucv_driver);
2141 	if (rc) {
2142 		PRINT_ERR("NETIUCV: failed to register driver.\n");
2143 		IUCV_DBF_TEXT_(setup, 2, "ret %d from driver_register\n", rc);
2144 		goto out_iucv;
2145 	}
2146 
2147 	netiucv_banner();
2148 	return rc;
2149 
2150 out_iucv:
2151 	iucv_unregister(&netiucv_handler, 1);
2152 out_dbf:
2153 	iucv_unregister_dbf_views();
2154 out:
2155 	return rc;
2156 }
2157 
2158 module_init(netiucv_init);
2159 module_exit(netiucv_exit);
2160 MODULE_LICENSE("GPL");
2161