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