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