Merge branch 'for-linus' of git://gitorious.org/linux-omap-dss2/linux
[safe/jmp/linux-2.6] / drivers / s390 / net / claw.c
index 26e9585..147bb1a 100644 (file)
@@ -3,12 +3,12 @@
  *    ESCON CLAW network driver
  *
  *  Linux for zSeries version
- *    Copyright (C) 2002,2005 IBM Corporation
+ *    Copyright IBM Corp. 2002, 2009
  *  Author(s) Original code written by:
- *              Kazuo Iimura (iimura@jp.ibm.com)
+ *             Kazuo Iimura <iimura@jp.ibm.com>
  *           Rewritten by
- *              Andy Richter (richtera@us.ibm.com)
- *              Marc Price (mwprice@us.ibm.com)
+ *             Andy Richter <richtera@us.ibm.com>
+ *             Marc Price <mwprice@us.ibm.com>
  *
  *    sysfs parms:
  *   group x.x.rrrr,x.x.wwww
@@ -60,6 +60,9 @@
  *    1.25  Added Packing support
  *    1.5
  */
+
+#define KMSG_COMPONENT "claw"
+
 #include <asm/ccwdev.h>
 #include <asm/ccwgroup.h>
 #include <asm/debug.h>
 #include <linux/timer.h>
 #include <linux/types.h>
 
-#include "cu3088.h"
 #include "claw.h"
 
 /*
    CLAW uses the s390dbf file system  see claw_trace and claw_setup
 */
 
-
+static char version[] __initdata = "CLAW driver";
 static char debug_buffer[255];
 /**
  * Debug Facility Stuff
@@ -206,20 +208,30 @@ static struct net_device_stats *claw_stats(struct net_device *dev);
 static int pages_to_order_of_mag(int num_of_pages);
 static struct sk_buff *claw_pack_skb(struct claw_privbk *privptr);
 /* sysfs Functions */
-static ssize_t claw_hname_show(struct device *dev, struct device_attribute *attr, char *buf);
-static ssize_t claw_hname_write(struct device *dev, struct device_attribute *attr,
+static ssize_t claw_hname_show(struct device *dev,
+       struct device_attribute *attr, char *buf);
+static ssize_t claw_hname_write(struct device *dev,
+       struct device_attribute *attr,
        const char *buf, size_t count);
-static ssize_t claw_adname_show(struct device *dev, struct device_attribute *attr, char *buf);
-static ssize_t claw_adname_write(struct device *dev, struct device_attribute *attr,
+static ssize_t claw_adname_show(struct device *dev,
+       struct device_attribute *attr, char *buf);
+static ssize_t claw_adname_write(struct device *dev,
+       struct device_attribute *attr,
        const char *buf, size_t count);
-static ssize_t claw_apname_show(struct device *dev, struct device_attribute *attr, char *buf);
-static ssize_t claw_apname_write(struct device *dev, struct device_attribute *attr,
+static ssize_t claw_apname_show(struct device *dev,
+       struct device_attribute *attr, char *buf);
+static ssize_t claw_apname_write(struct device *dev,
+       struct device_attribute *attr,
        const char *buf, size_t count);
-static ssize_t claw_wbuff_show(struct device *dev, struct device_attribute *attr, char *buf);
-static ssize_t claw_wbuff_write(struct device *dev, struct device_attribute *attr,
+static ssize_t claw_wbuff_show(struct device *dev,
+       struct device_attribute *attr, char *buf);
+static ssize_t claw_wbuff_write(struct device *dev,
+       struct device_attribute *attr,
        const char *buf, size_t count);
-static ssize_t claw_rbuff_show(struct device *dev, struct device_attribute *attr, char *buf);
-static ssize_t claw_rbuff_write(struct device *dev, struct device_attribute *attr,
+static ssize_t claw_rbuff_show(struct device *dev,
+       struct device_attribute *attr, char *buf);
+static ssize_t claw_rbuff_write(struct device *dev,
+       struct device_attribute *attr,
        const char *buf, size_t count);
 static int claw_add_files(struct device *dev);
 static void claw_remove_files(struct device *dev);
@@ -240,6 +252,14 @@ static void claw_free_wrt_buf(struct net_device *dev);
 /* Functions for unpack reads   */
 static void unpack_read(struct net_device *dev);
 
+static int claw_pm_prepare(struct ccwgroup_device *gdev)
+{
+       return -EPERM;
+}
+
+/* the root device for claw group devices */
+static struct device *claw_root_dev;
+
 /* ccwgroup table  */
 
 static struct ccwgroup_driver claw_group_driver = {
@@ -251,6 +271,48 @@ static struct ccwgroup_driver claw_group_driver = {
         .remove      = claw_remove_device,
         .set_online  = claw_new_device,
         .set_offline = claw_shutdown_device,
+       .prepare     = claw_pm_prepare,
+};
+
+static struct ccw_device_id claw_ids[] = {
+       {CCW_DEVICE(0x3088, 0x61), .driver_info = claw_channel_type_claw},
+       {},
+};
+MODULE_DEVICE_TABLE(ccw, claw_ids);
+
+static struct ccw_driver claw_ccw_driver = {
+       .owner  = THIS_MODULE,
+       .name   = "claw",
+       .ids    = claw_ids,
+       .probe  = ccwgroup_probe_ccwdev,
+       .remove = ccwgroup_remove_ccwdev,
+};
+
+static ssize_t
+claw_driver_group_store(struct device_driver *ddrv, const char *buf,
+                       size_t count)
+{
+       int err;
+       err = ccwgroup_create_from_string(claw_root_dev,
+                                         claw_group_driver.driver_id,
+                                         &claw_ccw_driver, 3, buf);
+       return err ? err : count;
+}
+
+static DRIVER_ATTR(group, 0200, NULL, claw_driver_group_store);
+
+static struct attribute *claw_group_attrs[] = {
+       &driver_attr_group.attr,
+       NULL,
+};
+
+static struct attribute_group claw_group_attr_group = {
+       .attrs = claw_group_attrs,
+};
+
+static const struct attribute_group *claw_group_attr_groups[] = {
+       &claw_group_attr_group,
+       NULL,
 };
 
 /*
@@ -271,7 +333,7 @@ claw_probe(struct ccwgroup_device *cgdev)
        if (!get_device(&cgdev->dev))
                return -ENODEV;
        privptr = kzalloc(sizeof(struct claw_privbk), GFP_KERNEL);
-       cgdev->dev.driver_data = privptr;
+       dev_set_drvdata(&cgdev->dev, privptr);
        if (privptr == NULL) {
                probe_error(cgdev);
                put_device(&cgdev->dev);
@@ -298,8 +360,8 @@ claw_probe(struct ccwgroup_device *cgdev)
        if (rc) {
                probe_error(cgdev);
                put_device(&cgdev->dev);
-               printk(KERN_WARNING "add_files failed %s %s Exit Line %d \n",
-                       dev_name(&cgdev->cdev[0]->dev), __func__, __LINE__);
+               dev_err(&cgdev->dev, "Creating the /proc files for a new"
+               " CLAW device failed\n");
                CLAW_DBF_TEXT_(2, setup, "probex%d", rc);
                return rc;
        }
@@ -325,16 +387,14 @@ claw_tx(struct sk_buff *skb, struct net_device *dev)
 
        CLAW_DBF_TEXT(4, trace, "claw_tx");
         p_ch=&privptr->channel[WRITE];
-        if (skb == NULL) {
-                privptr->stats.tx_dropped++;
-               privptr->stats.tx_errors++;
-               CLAW_DBF_TEXT_(2, trace, "clawtx%d", -EIO);
-                return -EIO;
-        }
         spin_lock_irqsave(get_ccwdev_lock(p_ch->cdev), saveflags);
         rc=claw_hw_tx( skb, dev, 1 );
         spin_unlock_irqrestore(get_ccwdev_lock(p_ch->cdev), saveflags);
        CLAW_DBF_TEXT_(4, trace, "clawtx%d", rc);
+       if (rc)
+               rc = NETDEV_TX_BUSY;
+       else
+               rc = NETDEV_TX_OK;
         return rc;
 }   /*  end of claw_tx */
 
@@ -496,7 +556,8 @@ claw_open(struct net_device *dev)
            ~(DEV_STAT_CHN_END | DEV_STAT_DEV_END)) != 0x00) ||
            (((privptr->channel[READ].flag |
                privptr->channel[WRITE].flag) & CLAW_TIMER) != 0x00)) {
-                printk(KERN_INFO "%s: remote side is not ready\n", dev->name);
+               dev_info(&privptr->channel[READ].cdev->dev,
+                       "%s: remote side is not ready\n", dev->name);
                CLAW_DBF_TEXT(2, trace, "notrdy");
 
                 for ( i = 0; i < 2;  i++) {
@@ -581,15 +642,14 @@ claw_irq_handler(struct ccw_device *cdev,
 
        CLAW_DBF_TEXT(4, trace, "clawirq");
         /* Bypass all 'unsolicited interrupts' */
-       if (!cdev->dev.driver_data) {
-                printk(KERN_WARNING "claw: unsolicited interrupt for device:"
-                       "%s received c-%02x d-%02x\n",
-                      dev_name(&cdev->dev), irb->scsw.cmd.cstat,
-                      irb->scsw.cmd.dstat);
+       privptr = dev_get_drvdata(&cdev->dev);
+       if (!privptr) {
+               dev_warn(&cdev->dev, "An uninitialized CLAW device received an"
+                       " IRQ, c-%02x d-%02x\n",
+                       irb->scsw.cmd.cstat, irb->scsw.cmd.dstat);
                CLAW_DBF_TEXT(2, trace, "badirq");
                 return;
         }
-       privptr = (struct claw_privbk *)cdev->dev.driver_data;
 
        /* Try to extract channel from driver data. */
        if (privptr->channel[READ].cdev == cdev)
@@ -597,8 +657,7 @@ claw_irq_handler(struct ccw_device *cdev,
        else if (privptr->channel[WRITE].cdev == cdev)
                p_ch = &privptr->channel[WRITE];
        else {
-               printk(KERN_WARNING "claw: Can't determine channel for "
-                       "interrupt, device %s\n", dev_name(&cdev->dev));
+               dev_warn(&cdev->dev, "The device is not a CLAW device\n");
                CLAW_DBF_TEXT(2, trace, "badchan");
                return;
        }
@@ -612,7 +671,8 @@ claw_irq_handler(struct ccw_device *cdev,
 
        /* Check for good subchannel return code, otherwise info message */
        if (irb->scsw.cmd.cstat && !(irb->scsw.cmd.cstat & SCHN_STAT_PCI)) {
-                printk(KERN_INFO "%s: subchannel check for device: %04x -"
+               dev_info(&cdev->dev,
+                       "%s: subchannel check for device: %04x -"
                        " Sch Stat %02x  Dev Stat %02x CPA - %04x\n",
                         dev->name, p_ch->devno,
                        irb->scsw.cmd.cstat, irb->scsw.cmd.dstat,
@@ -651,7 +711,7 @@ claw_irq_handler(struct ccw_device *cdev,
                        wake_up(&p_ch->wait); /* wake claw_open (READ)*/
                } else if (p_ch->flag == CLAW_WRITE) {
                        p_ch->claw_state = CLAW_START_WRITE;
-                       /*      send SYSTEM_VALIDATE                    */
+                       /*      send SYSTEM_VALIDATE                    */
                        claw_strt_read(dev, LOCK_NO);
                        claw_send_control(dev,
                                SYSTEM_VALIDATE_REQUEST,
@@ -659,10 +719,9 @@ claw_irq_handler(struct ccw_device *cdev,
                                p_env->host_name,
                                p_env->adapter_name);
                } else {
-                       printk(KERN_WARNING "claw: unsolicited "
-                               "interrupt for device:"
-                               "%s received c-%02x d-%02x\n",
-                               dev_name(&cdev->dev),
+                       dev_warn(&cdev->dev, "The CLAW device received"
+                               " an unexpected IRQ, "
+                               "c-%02x d-%02x\n",
                                irb->scsw.cmd.cstat,
                                irb->scsw.cmd.dstat);
                        return;
@@ -677,8 +736,8 @@ claw_irq_handler(struct ccw_device *cdev,
                            (p_ch->irb->ecw[0] & 0x40) == 0x40 ||
                            (p_ch->irb->ecw[0])        == 0) {
                                privptr->stats.rx_errors++;
-                               printk(KERN_INFO "%s: Restart is "
-                                       "required after remote "
+                               dev_info(&cdev->dev,
+                                       "%s: Restart is required after remote "
                                        "side recovers \n",
                                        dev->name);
                        }
@@ -713,11 +772,13 @@ claw_irq_handler(struct ccw_device *cdev,
                return;
        case CLAW_START_WRITE:
                if (p_ch->irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) {
-                       printk(KERN_INFO "%s: Unit Check Occured in "
+                       dev_info(&cdev->dev,
+                               "%s: Unit Check Occured in "
                                "write channel\n", dev->name);
                        clear_bit(0, (void *)&p_ch->IO_active);
                        if (p_ch->irb->ecw[0] & 0x80) {
-                               printk(KERN_INFO "%s: Resetting Event "
+                               dev_info(&cdev->dev,
+                                       "%s: Resetting Event "
                                        "occurred:\n", dev->name);
                                init_timer(&p_ch->timer);
                                p_ch->timer.function =
@@ -725,7 +786,8 @@ claw_irq_handler(struct ccw_device *cdev,
                                p_ch->timer.data = (unsigned long)p_ch;
                                p_ch->timer.expires = jiffies + 10*HZ;
                                add_timer(&p_ch->timer);
-                               printk(KERN_INFO "%s: write connection "
+                               dev_info(&cdev->dev,
+                                       "%s: write connection "
                                        "restarting\n", dev->name);
                        }
                        CLAW_DBF_TEXT(4, trace, "rstrtwrt");
@@ -733,9 +795,10 @@ claw_irq_handler(struct ccw_device *cdev,
                }
                if (p_ch->irb->scsw.cmd.dstat & DEV_STAT_UNIT_EXCEP) {
                        clear_bit(0, (void *)&p_ch->IO_active);
-                       printk(KERN_INFO "%s: Unit Exception "
-                              "Occured in write channel\n",
-                              dev->name);
+                       dev_info(&cdev->dev,
+                               "%s: Unit Exception "
+                               "occurred in write channel\n",
+                               dev->name);
                }
                if (!((p_ch->irb->scsw.cmd.stctl & SCSW_STCTL_SEC_STATUS) ||
                (p_ch->irb->scsw.cmd.stctl == SCSW_STCTL_STATUS_PEND) ||
@@ -757,8 +820,9 @@ claw_irq_handler(struct ccw_device *cdev,
                CLAW_DBF_TEXT(4, trace, "StWtExit");
                return;
        default:
-               printk(KERN_WARNING "%s: wrong selection code - irq "
-                       "state=%d\n", dev->name, p_ch->claw_state);
+               dev_warn(&cdev->dev,
+                       "The CLAW device for %s received an unexpected IRQ\n",
+                        dev->name);
                CLAW_DBF_TEXT(2, trace, "badIRQ");
                return;
         }
@@ -910,8 +974,10 @@ claw_release(struct net_device *dev)
         if (((privptr->channel[READ].last_dstat |
                privptr->channel[WRITE].last_dstat) &
                ~(DEV_STAT_CHN_END | DEV_STAT_DEV_END)) != 0x00) {
-                printk(KERN_WARNING "%s: channel problems during close - "
-                       "read: %02x -  write: %02x\n",
+               dev_warn(&privptr->channel[READ].cdev->dev,
+                       "Deactivating %s completed with incorrect"
+                       " subchannel status "
+                       "(read %02x, write %02x)\n",
                 dev->name,
                privptr->channel[READ].last_dstat,
                privptr->channel[WRITE].last_dstat);
@@ -1012,7 +1078,7 @@ static int
 pages_to_order_of_mag(int num_of_pages)
 {
        int     order_of_mag=1;         /* assume 2 pages */
-       int     nump=2;
+       int     nump;
 
        CLAW_DBF_TEXT_(5, trace, "pages%d", num_of_pages);
        if (num_of_pages == 1)   {return 0; }  /* magnitude of 0 = 1 page */
@@ -1076,8 +1142,8 @@ add_claw_reads(struct net_device *dev, struct ccwbk* p_first,
         }
 
         if ( privptr-> p_read_active_first ==NULL ) {
-                privptr-> p_read_active_first= p_first;  /*    set new first */
-                privptr-> p_read_active_last = p_last;   /*    set new last  */
+               privptr->p_read_active_first = p_first;  /*  set new first */
+               privptr->p_read_active_last  = p_last;   /*  set new last  */
         }
         else {
 
@@ -1113,7 +1179,7 @@ add_claw_reads(struct net_device *dev, struct ccwbk* p_first,
                         privptr->p_read_active_last->r_TIC_2.cda=
                                (__u32)__pa(&p_first->read);
                 }
-                /*      chain in new set of blocks                              */
+               /*      chain in new set of blocks                         */
                 privptr->p_read_active_last->next = p_first;
                 privptr->p_read_active_last=p_last;
         } /* end of if ( privptr-> p_read_active_first ==NULL)  */
@@ -1135,21 +1201,18 @@ ccw_check_return_code(struct ccw_device *cdev, int return_code)
                case -EBUSY: /* BUSY is a transient state no action needed */
                        break;
                case -ENODEV:
-                       printk(KERN_EMERG "%s: Missing device called "
-                               "for IO ENODEV\n", dev_name(&cdev->dev));
-                       break;
-               case -EIO:
-                       printk(KERN_EMERG "%s: Status pending... EIO \n",
-                               dev_name(&cdev->dev));
+                       dev_err(&cdev->dev, "The remote channel adapter is not"
+                               " available\n");
                        break;
                case -EINVAL:
-                       printk(KERN_EMERG "%s: Invalid Dev State EINVAL \n",
-                               dev_name(&cdev->dev));
+                       dev_err(&cdev->dev,
+                               "The status of the remote channel adapter"
+                               " is not valid\n");
                        break;
                default:
-                       printk(KERN_EMERG "%s: Unknown error in "
-                                "Do_IO %d\n", dev_name(&cdev->dev),
-                              return_code);
+                       dev_err(&cdev->dev, "The common device layer"
+                               " returned error code %d\n",
+                                 return_code);
                }
        }
        CLAW_DBF_TEXT(4, trace, "ccwret");
@@ -1163,42 +1226,37 @@ static void
 ccw_check_unit_check(struct chbk * p_ch, unsigned char sense )
 {
        struct net_device *ndev = p_ch->ndev;
+       struct device *dev = &p_ch->cdev->dev;
 
        CLAW_DBF_TEXT(4, trace, "unitchek");
-        printk(KERN_INFO "%s: Unit Check with sense byte:0x%04x\n",
-              ndev->name, sense);
-
-        if (sense & 0x40) {
-                if (sense & 0x01) {
-                        printk(KERN_WARNING "%s: Interface disconnect or "
-                               "Selective reset "
-                               "occurred (remote side)\n", ndev->name);
-                }
-                else {
-                        printk(KERN_WARNING "%s: System reset occured"
-                               " (remote side)\n", ndev->name);
-                }
-        }
-        else if (sense & 0x20) {
-                if (sense & 0x04) {
-                        printk(KERN_WARNING "%s: Data-streaming "
-                               "timeout)\n", ndev->name);
-                }
-                else  {
-                        printk(KERN_WARNING "%s: Data-transfer parity"
-                               " error\n", ndev->name);
-                }
-        }
-        else if (sense & 0x10) {
-                if (sense & 0x20) {
-                        printk(KERN_WARNING "%s: Hardware malfunction "
-                               "(remote side)\n", ndev->name);
-                }
-                else {
-                        printk(KERN_WARNING "%s: read-data parity error "
-                               "(remote side)\n", ndev->name);
-                }
-        }
+       dev_warn(dev, "The communication peer of %s disconnected\n",
+               ndev->name);
+
+       if (sense & 0x40) {
+               if (sense & 0x01) {
+                       dev_warn(dev, "The remote channel adapter for"
+                               " %s has been reset\n",
+                               ndev->name);
+               }
+       } else if (sense & 0x20) {
+               if (sense & 0x04) {
+                       dev_warn(dev, "A data streaming timeout occurred"
+                               " for %s\n",
+                               ndev->name);
+               } else if (sense & 0x10) {
+                       dev_warn(dev, "The remote channel adapter for %s"
+                               " is faulty\n",
+                               ndev->name);
+               } else {
+                       dev_warn(dev, "A data transfer parity error occurred"
+                               " for %s\n",
+                               ndev->name);
+               }
+       } else if (sense & 0x10) {
+               dev_warn(dev, "A read data parity error occurred"
+                       " for %s\n",
+                       ndev->name);
+       }
 
 }   /*    end of ccw_check_unit_check    */
 
@@ -1235,7 +1293,7 @@ find_link(struct net_device *dev, char *host_name, char *ws_name )
                        break;
        }
 
-        return 0;
+       return rc;
 }    /*    end of find_link    */
 
 /*-------------------------------------------------------------------*
@@ -1347,7 +1405,10 @@ claw_hw_tx(struct sk_buff *skb, struct net_device *dev, long linkid)
                 privptr->p_write_free_chain=p_this_ccw->next;
                 p_this_ccw->next=NULL;
                 --privptr->write_free_count; /* -1 */
-                bytesInThisBuffer=len_of_data;
+               if (len_of_data >= privptr->p_env->write_size)
+                       bytesInThisBuffer = privptr->p_env->write_size;
+               else
+                       bytesInThisBuffer = len_of_data;
                 memcpy( p_this_ccw->p_buffer,pDataAddress, bytesInThisBuffer);
                 len_of_data-=bytesInThisBuffer;
                 pDataAddress+=(unsigned long)bytesInThisBuffer;
@@ -1375,7 +1436,7 @@ claw_hw_tx(struct sk_buff *skb, struct net_device *dev, long linkid)
         */
 
         if (p_first_ccw!=NULL) {
-                /*      setup ending ccw sequence for this segment              */
+               /*      setup ending ccw sequence for this segment           */
                 pEnd=privptr->p_end_ccw;
                 if (pEnd->write1) {
                         pEnd->write1=0x00;   /* second end ccw is now active */
@@ -1697,10 +1758,11 @@ init_ccw_bk(struct net_device *dev)
                         p_buf-> w_TIC_1.flags      = 0;
                         p_buf-> w_TIC_1.count      = 0;
 
-                        if (((unsigned long)p_buff+privptr->p_env->write_size) >=
+                       if (((unsigned long)p_buff +
+                                           privptr->p_env->write_size) >=
                           ((unsigned long)(p_buff+2*
-                               (privptr->p_env->write_size) -1) & PAGE_MASK)) {
-                        p_buff= p_buff+privptr->p_env->write_size;
+                           (privptr->p_env->write_size) - 1) & PAGE_MASK)) {
+                               p_buff = p_buff+privptr->p_env->write_size;
                         }
                 }
            }
@@ -1840,15 +1902,16 @@ init_ccw_bk(struct net_device *dev)
                         p_buf->header.opcode=0xff;
                         p_buf->header.flag=CLAW_PENDING;
 
-                        if (((unsigned long)p_buff+privptr->p_env->read_size) >=
-                               ((unsigned long)(p_buff+2*(privptr->p_env->read_size) -1)
-                                & PAGE_MASK) ) {
+                       if (((unsigned long)p_buff+privptr->p_env->read_size) >=
+                         ((unsigned long)(p_buff+2*(privptr->p_env->read_size)
+                                -1)
+                          & PAGE_MASK)) {
                                 p_buff= p_buff+privptr->p_env->read_size;
                         }
                         else {
                                 p_buff=
                                (void *)((unsigned long)
-                                       (p_buff+2*(privptr->p_env->read_size) -1)
+                                       (p_buff+2*(privptr->p_env->read_size)-1)
                                         & PAGE_MASK) ;
                         }
                 }   /* for read_buffers   */
@@ -1856,24 +1919,28 @@ init_ccw_bk(struct net_device *dev)
           else {  /* read Size >= PAGE_SIZE  */
                 for (i=0 ; i< privptr->p_env->read_buffers ; i++) {
                         p_buff = (void *)__get_free_pages(__GFP_DMA,
-                               (int)pages_to_order_of_mag(privptr->p_buff_pages_perread) );
+                               (int)pages_to_order_of_mag(
+                                       privptr->p_buff_pages_perread));
                         if (p_buff==NULL) {
                                 free_pages((unsigned long)privptr->p_buff_ccw,
-                                       (int)pages_to_order_of_mag(privptr->p_buff_ccw_num));
+                                       (int)pages_to_order_of_mag(privptr->
+                                       p_buff_ccw_num));
                                /* free the write pages  */
                                p_buf=privptr->p_buff_write;
                                 while (p_buf!=NULL) {
-                                        free_pages((unsigned long)p_buf->p_buffer,
-                                               (int)pages_to_order_of_mag(
-                                               privptr->p_buff_pages_perwrite ));
+                                       free_pages(
+                                           (unsigned long)p_buf->p_buffer,
+                                           (int)pages_to_order_of_mag(
+                                           privptr->p_buff_pages_perwrite));
                                         p_buf=p_buf->next;
                                 }
                                /* free any read pages already alloc  */
                                p_buf=privptr->p_buff_read;
                                 while (p_buf!=NULL) {
-                                        free_pages((unsigned long)p_buf->p_buffer,
-                                               (int)pages_to_order_of_mag(
-                                               privptr->p_buff_pages_perread ));
+                                       free_pages(
+                                           (unsigned long)p_buf->p_buffer,
+                                           (int)pages_to_order_of_mag(
+                                            privptr->p_buff_pages_perread));
                                         p_buf=p_buf->next;
                                 }
                                 privptr->p_buff_ccw=NULL;
@@ -1964,9 +2031,9 @@ probe_error( struct ccwgroup_device *cgdev)
        struct claw_privbk *privptr;
 
        CLAW_DBF_TEXT(4, trace, "proberr");
-       privptr = (struct claw_privbk *) cgdev->dev.driver_data;
+       privptr = dev_get_drvdata(&cgdev->dev);
        if (privptr != NULL) {
-               cgdev->dev.driver_data = NULL;
+               dev_set_drvdata(&cgdev->dev, NULL);
                kfree(privptr->p_env);
                kfree(privptr->p_mtc_envelope);
                kfree(privptr);
@@ -2003,7 +2070,7 @@ claw_process_control( struct net_device *dev, struct ccwbk * p_ccw)
        tdev = &privptr->channel[READ].cdev->dev;
        memcpy( &temp_host_name, p_env->host_name, 8);
         memcpy( &temp_ws_name, p_env->adapter_name , 8);
-        printk(KERN_INFO "%s: CLAW device %.8s: "
+       dev_info(tdev, "%s: CLAW device %.8s: "
                "Received Control Packet\n",
                dev->name, temp_ws_name);
         if (privptr->release_pend==1) {
@@ -2022,32 +2089,30 @@ claw_process_control( struct net_device *dev, struct ccwbk * p_ccw)
                if (p_ctlbk->version != CLAW_VERSION_ID) {
                        claw_snd_sys_validate_rsp(dev, p_ctlbk,
                                CLAW_RC_WRONG_VERSION);
-                       printk("%s: %d is wrong version id. "
-                              "Expected %d\n",
-                              dev->name, p_ctlbk->version,
-                              CLAW_VERSION_ID);
+                       dev_warn(tdev, "The communication peer of %s"
+                               " uses an incorrect API version %d\n",
+                               dev->name, p_ctlbk->version);
                }
                p_sysval = (struct sysval *)&(p_ctlbk->data);
-               printk("%s: Recv Sys Validate Request: "
-                      "Vers=%d,link_id=%d,Corr=%d,WS name=%."
-                      "8s,Host name=%.8s\n",
-                      dev->name, p_ctlbk->version,
-                      p_ctlbk->linkid,
-                      p_ctlbk->correlator,
-                      p_sysval->WS_name,
-                      p_sysval->host_name);
+               dev_info(tdev, "%s: Recv Sys Validate Request: "
+                       "Vers=%d,link_id=%d,Corr=%d,WS name=%.8s,"
+                       "Host name=%.8s\n",
+                       dev->name, p_ctlbk->version,
+                       p_ctlbk->linkid,
+                       p_ctlbk->correlator,
+                       p_sysval->WS_name,
+                       p_sysval->host_name);
                if (memcmp(temp_host_name, p_sysval->host_name, 8)) {
                        claw_snd_sys_validate_rsp(dev, p_ctlbk,
                                CLAW_RC_NAME_MISMATCH);
                        CLAW_DBF_TEXT(2, setup, "HSTBAD");
                        CLAW_DBF_TEXT_(2, setup, "%s", p_sysval->host_name);
                        CLAW_DBF_TEXT_(2, setup, "%s", temp_host_name);
-                       printk(KERN_INFO "%s:  Host name mismatch\n",
-                               dev->name);
-                       printk(KERN_INFO "%s: Received :%s: "
-                               "expected :%s: \n",
-                               dev->name,
+                       dev_warn(tdev,
+                               "Host name %s for %s does not match the"
+                               " remote adapter name %s\n",
                                p_sysval->host_name,
+                               dev->name,
                                temp_host_name);
                }
                if (memcmp(temp_ws_name, p_sysval->WS_name, 8)) {
@@ -2056,35 +2121,38 @@ claw_process_control( struct net_device *dev, struct ccwbk * p_ccw)
                        CLAW_DBF_TEXT(2, setup, "WSNBAD");
                        CLAW_DBF_TEXT_(2, setup, "%s", p_sysval->WS_name);
                        CLAW_DBF_TEXT_(2, setup, "%s", temp_ws_name);
-                       printk(KERN_INFO "%s: WS name mismatch\n",
-                               dev->name);
-                       printk(KERN_INFO "%s: Received :%s: "
-                              "expected :%s: \n",
-                              dev->name,
-                              p_sysval->WS_name,
-                              temp_ws_name);
+                       dev_warn(tdev, "Adapter name %s for %s does not match"
+                               " the remote host name %s\n",
+                               p_sysval->WS_name,
+                               dev->name,
+                               temp_ws_name);
                }
                if ((p_sysval->write_frame_size < p_env->write_size) &&
                    (p_env->packing == 0)) {
                        claw_snd_sys_validate_rsp(dev, p_ctlbk,
                                CLAW_RC_HOST_RCV_TOO_SMALL);
-                       printk(KERN_INFO "%s: host write size is too "
-                               "small\n", dev->name);
+                       dev_warn(tdev,
+                               "The local write buffer is smaller than the"
+                               " remote read buffer\n");
                        CLAW_DBF_TEXT(2, setup, "wrtszbad");
                }
                if ((p_sysval->read_frame_size < p_env->read_size) &&
                    (p_env->packing == 0)) {
                        claw_snd_sys_validate_rsp(dev, p_ctlbk,
                                CLAW_RC_HOST_RCV_TOO_SMALL);
-                       printk(KERN_INFO "%s: host read size is too "
-                               "small\n", dev->name);
+                       dev_warn(tdev,
+                               "The local read buffer is smaller than the"
+                               " remote write buffer\n");
                        CLAW_DBF_TEXT(2, setup, "rdsizbad");
                }
                claw_snd_sys_validate_rsp(dev, p_ctlbk, 0);
-               printk(KERN_INFO "%s: CLAW device %.8s: System validate "
-                       "completed.\n", dev->name, temp_ws_name);
-               printk("%s: sys Validate Rsize:%d Wsize:%d\n", dev->name,
-                       p_sysval->read_frame_size, p_sysval->write_frame_size);
+               dev_info(tdev,
+                       "CLAW device %.8s: System validate"
+                       " completed.\n", temp_ws_name);
+               dev_info(tdev,
+                       "%s: sys Validate Rsize:%d Wsize:%d\n",
+                       dev->name, p_sysval->read_frame_size,
+                       p_sysval->write_frame_size);
                privptr->system_validate_comp = 1;
                if (strncmp(p_env->api_type, WS_APPL_NAME_PACKED, 6) == 0)
                        p_env->packing = PACKING_ASK;
@@ -2092,8 +2160,10 @@ claw_process_control( struct net_device *dev, struct ccwbk * p_ccw)
                break;
        case SYSTEM_VALIDATE_RESPONSE:
                p_sysval = (struct sysval *)&(p_ctlbk->data);
-               printk("%s: Recv Sys Validate Resp: Vers=%d,Corr=%d,RC=%d,"
-                       "WS name=%.8s,Host name=%.8s\n",
+               dev_info(tdev,
+                       "Settings for %s validated (version=%d, "
+                       "remote device=%d, rc=%d, adapter name=%.8s, "
+                       "host name=%.8s)\n",
                        dev->name,
                        p_ctlbk->version,
                        p_ctlbk->correlator,
@@ -2102,41 +2172,39 @@ claw_process_control( struct net_device *dev, struct ccwbk * p_ccw)
                        p_sysval->host_name);
                switch (p_ctlbk->rc) {
                case 0:
-                       printk(KERN_INFO "%s: CLAW device "
-                               "%.8s: System validate "
-                               "completed.\n",
-                              dev->name, temp_ws_name);
+                       dev_info(tdev, "%s: CLAW device "
+                               "%.8s: System validate completed.\n",
+                               dev->name, temp_ws_name);
                        if (privptr->system_validate_comp == 0)
                                claw_strt_conn_req(dev);
                        privptr->system_validate_comp = 1;
                        break;
                case CLAW_RC_NAME_MISMATCH:
-                       printk(KERN_INFO "%s: Sys Validate "
-                               "Resp : Host, WS name is "
-                               "mismatch\n",
-                              dev->name);
+                       dev_warn(tdev, "Validating %s failed because of"
+                               " a host or adapter name mismatch\n",
+                               dev->name);
                        break;
                case CLAW_RC_WRONG_VERSION:
-                       printk(KERN_INFO "%s: Sys Validate "
-                               "Resp : Wrong version\n",
+                       dev_warn(tdev, "Validating %s failed because of a"
+                               " version conflict\n",
                                dev->name);
                        break;
                case CLAW_RC_HOST_RCV_TOO_SMALL:
-                       printk(KERN_INFO "%s: Sys Validate "
-                               "Resp : bad frame size\n",
+                       dev_warn(tdev, "Validating %s failed because of a"
+                               " frame size conflict\n",
                                dev->name);
                        break;
                default:
-                       printk(KERN_INFO "%s: Sys Validate "
-                               "error code=%d \n",
-                                dev->name, p_ctlbk->rc);
+                       dev_warn(tdev, "The communication peer of %s rejected"
+                               " the connection\n",
+                                dev->name);
                        break;
                }
                break;
 
        case CONNECTION_REQUEST:
                p_connect = (struct conncmd *)&(p_ctlbk->data);
-               printk(KERN_INFO "%s: Recv Conn Req: Vers=%d,link_id=%d,"
+               dev_info(tdev, "%s: Recv Conn Req: Vers=%d,link_id=%d,"
                        "Corr=%d,HOST appl=%.8s,WS appl=%.8s\n",
                        dev->name,
                        p_ctlbk->version,
@@ -2146,21 +2214,21 @@ claw_process_control( struct net_device *dev, struct ccwbk * p_ccw)
                        p_connect->WS_name);
                if (privptr->active_link_ID != 0) {
                        claw_snd_disc(dev, p_ctlbk);
-                       printk(KERN_INFO "%s: Conn Req error : "
-                               "already logical link is active \n",
+                       dev_info(tdev, "%s rejected a connection request"
+                               " because it is already active\n",
                                dev->name);
                }
                if (p_ctlbk->linkid != 1) {
                        claw_snd_disc(dev, p_ctlbk);
-                       printk(KERN_INFO "%s: Conn Req error : "
-                               "req logical link id is not 1\n",
+                       dev_info(tdev, "%s rejected a request to open multiple"
+                               " connections\n",
                                dev->name);
                }
                rc = find_link(dev, p_connect->host_name, p_connect->WS_name);
                if (rc != 0) {
                        claw_snd_disc(dev, p_ctlbk);
-                       printk(KERN_INFO "%s: Conn Resp error: "
-                               "req appl name does not match\n",
+                       dev_info(tdev, "%s rejected a connection request"
+                               " because of a type mismatch\n",
                                dev->name);
                }
                claw_send_control(dev,
@@ -2172,7 +2240,7 @@ claw_process_control( struct net_device *dev, struct ccwbk * p_ccw)
                        p_env->packing = PACK_SEND;
                        claw_snd_conn_req(dev, 0);
                }
-               printk(KERN_INFO "%s: CLAW device %.8s: Connection "
+               dev_info(tdev, "%s: CLAW device %.8s: Connection "
                        "completed link_id=%d.\n",
                        dev->name, temp_ws_name,
                        p_ctlbk->linkid);
@@ -2182,7 +2250,7 @@ claw_process_control( struct net_device *dev, struct ccwbk * p_ccw)
                break;
        case CONNECTION_RESPONSE:
                p_connect = (struct conncmd *)&(p_ctlbk->data);
-               printk(KERN_INFO "%s: Revc Conn Resp: Vers=%d,link_id=%d,"
+               dev_info(tdev, "%s: Recv Conn Resp: Vers=%d,link_id=%d,"
                        "Corr=%d,RC=%d,Host appl=%.8s, WS appl=%.8s\n",
                        dev->name,
                        p_ctlbk->version,
@@ -2193,16 +2261,18 @@ claw_process_control( struct net_device *dev, struct ccwbk * p_ccw)
                        p_connect->WS_name);
 
                if (p_ctlbk->rc != 0) {
-                       printk(KERN_INFO "%s: Conn Resp error: rc=%d \n",
-                               dev->name, p_ctlbk->rc);
+                       dev_warn(tdev, "The communication peer of %s rejected"
+                               " a connection request\n",
+                               dev->name);
                        return 1;
                }
                rc = find_link(dev,
                        p_connect->host_name, p_connect->WS_name);
                if (rc != 0) {
                        claw_snd_disc(dev, p_ctlbk);
-                       printk(KERN_INFO "%s: Conn Resp error: "
-                               "req appl name does not match\n",
+                       dev_warn(tdev, "The communication peer of %s"
+                               " rejected a connection "
+                               "request because of a type mismatch\n",
                                 dev->name);
                }
                /* should be until CONNECTION_CONFIRM */
@@ -2210,7 +2280,8 @@ claw_process_control( struct net_device *dev, struct ccwbk * p_ccw)
                break;
        case CONNECTION_CONFIRM:
                p_connect = (struct conncmd *)&(p_ctlbk->data);
-               printk(KERN_INFO "%s: Recv Conn Confirm:Vers=%d,link_id=%d,"
+               dev_info(tdev,
+                       "%s: Recv Conn Confirm:Vers=%d,link_id=%d,"
                        "Corr=%d,Host appl=%.8s,WS appl=%.8s\n",
                        dev->name,
                        p_ctlbk->version,
@@ -2221,21 +2292,21 @@ claw_process_control( struct net_device *dev, struct ccwbk * p_ccw)
                if (p_ctlbk->linkid == -(privptr->active_link_ID)) {
                        privptr->active_link_ID = p_ctlbk->linkid;
                        if (p_env->packing > PACKING_ASK) {
-                               printk(KERN_INFO "%s: Confirmed Now packing\n",
-                                       dev->name);
+                               dev_info(tdev,
+                               "%s: Confirmed Now packing\n", dev->name);
                                p_env->packing = DO_PACKED;
                        }
                        p_ch = &privptr->channel[WRITE];
                        wake_up(&p_ch->wait);
                } else {
-                      printk(KERN_INFO "%s: Conn confirm: "
-                               "unexpected linkid=%d \n",
+                       dev_warn(tdev, "Activating %s failed because of"
+                               " an incorrect link ID=%d\n",
                                dev->name, p_ctlbk->linkid);
                        claw_snd_disc(dev, p_ctlbk);
                }
                break;
        case DISCONNECT:
-               printk(KERN_INFO "%s: Disconnect: "
+               dev_info(tdev, "%s: Disconnect: "
                        "Vers=%d,link_id=%d,Corr=%d\n",
                        dev->name, p_ctlbk->version,
                        p_ctlbk->linkid, p_ctlbk->correlator);
@@ -2247,12 +2318,13 @@ claw_process_control( struct net_device *dev, struct ccwbk * p_ccw)
                        privptr->active_link_ID = 0;
                break;
        case CLAW_ERROR:
-               printk(KERN_INFO "%s: CLAW ERROR detected\n",
+               dev_warn(tdev, "The communication peer of %s failed\n",
                        dev->name);
                break;
        default:
-               printk(KERN_INFO "%s:  Unexpected command code=%d \n",
-                       dev->name,  p_ctlbk->command);
+               dev_warn(tdev, "The communication peer of %s sent"
+                       " an unknown command code\n",
+                       dev->name);
                break;
         }
 
@@ -2294,12 +2366,14 @@ claw_send_control(struct net_device *dev, __u8 type, __u8 link,
                         memcpy(&p_sysval->host_name, local_name, 8);
                         memcpy(&p_sysval->WS_name, remote_name, 8);
                        if (privptr->p_env->packing > 0) {
-                               p_sysval->read_frame_size=DEF_PACK_BUFSIZE;
-                               p_sysval->write_frame_size=DEF_PACK_BUFSIZE;
+                               p_sysval->read_frame_size = DEF_PACK_BUFSIZE;
+                               p_sysval->write_frame_size = DEF_PACK_BUFSIZE;
                        } else {
                                /* how big is the biggest group of packets */
-                               p_sysval->read_frame_size=privptr->p_env->read_size;
-                               p_sysval->write_frame_size=privptr->p_env->write_size;
+                          p_sysval->read_frame_size =
+                               privptr->p_env->read_size;
+                          p_sysval->write_frame_size =
+                               privptr->p_env->write_size;
                        }
                         memset(&p_sysval->reserved, 0x00, 4);
                         break;
@@ -2485,7 +2559,6 @@ unpack_read(struct net_device *dev )
        p_dev = &privptr->channel[READ].cdev->dev;
        p_env = privptr->p_env;
         p_this_ccw=privptr->p_read_active_first;
-        i=0;
        while (p_this_ccw!=NULL && p_this_ccw->header.flag!=CLAW_PENDING) {
                pack_off = 0;
                p = 0;
@@ -2511,8 +2584,10 @@ unpack_read(struct net_device *dev )
                         mtc_this_frm=1;
                         if (p_this_ccw->header.length!=
                                privptr->p_env->read_size ) {
-                                printk(KERN_INFO " %s: Invalid frame detected "
-                                       "length is %02x\n" ,
+                               dev_warn(p_dev,
+                                       "The communication peer of %s"
+                                       " sent a faulty"
+                                       " frame of length %02x\n",
                                         dev->name, p_this_ccw->header.length);
                         }
                 }
@@ -2544,7 +2619,7 @@ unpack_next:
                                goto NextFrame;
                        p_packd = p_this_ccw->p_buffer+pack_off;
                        p_packh = (struct clawph *) p_packd;
-                       if ((p_packh->len == 0) || /* all done with this frame? */
+                       if ((p_packh->len == 0) || /* done with this frame? */
                            (p_packh->flag != 0))
                                goto NextFrame;
                        bytes_to_mov = p_packh->len;
@@ -2594,9 +2669,9 @@ unpack_next:
                                 netif_rx(skb);
                         }
                         else {
+                               dev_info(p_dev, "Allocating a buffer for"
+                                       " incoming data failed\n");
                                 privptr->stats.rx_dropped++;
-                                printk(KERN_WARNING "%s: %s() low on memory\n",
-                               dev->name,__func__);
                         }
                         privptr->mtc_offset=0;
                         privptr->mtc_logical_link=-1;
@@ -2720,8 +2795,8 @@ claw_strt_out_IO( struct net_device *dev )
         if (test_and_set_bit(0, (void *)&p_ch->IO_active) == 0) {
                 parm = (unsigned long) p_ch;
                CLAW_DBF_TEXT(2, trace, "StWrtIO");
-                rc = ccw_device_start (p_ch->cdev,&p_first_ccw->write, parm,
-                                      0xff, 0);
+               rc = ccw_device_start(p_ch->cdev, &p_first_ccw->write, parm,
+                                     0xff, 0);
                 if (rc != 0) {
                         ccw_check_return_code(p_ch->cdev, rc);
                 }
@@ -2816,22 +2891,26 @@ claw_free_netdevice(struct net_device * dev, int free_dev)
  * Initialize everything of the net device except the name and the
  * channel structs.
  */
+static const struct net_device_ops claw_netdev_ops = {
+       .ndo_open               = claw_open,
+       .ndo_stop               = claw_release,
+       .ndo_get_stats          = claw_stats,
+       .ndo_start_xmit         = claw_tx,
+       .ndo_change_mtu         = claw_change_mtu,
+};
+
 static void
 claw_init_netdevice(struct net_device * dev)
 {
        CLAW_DBF_TEXT(2, setup, "init_dev");
        CLAW_DBF_TEXT_(2, setup, "%s", dev->name);
        dev->mtu = CLAW_DEFAULT_MTU_SIZE;
-       dev->hard_start_xmit = claw_tx;
-       dev->open = claw_open;
-       dev->stop = claw_release;
-       dev->get_stats = claw_stats;
-       dev->change_mtu = claw_change_mtu;
        dev->hard_header_len = 0;
        dev->addr_len = 0;
        dev->type = ARPHRD_SLIP;
        dev->tx_queue_len = 1300;
        dev->flags = IFF_POINTOPOINT | IFF_NOARP;
+       dev->netdev_ops = &claw_netdev_ops;
        CLAW_DBF_TEXT(2, setup, "initok");
        return;
 }
@@ -2880,11 +2959,12 @@ claw_new_device(struct ccwgroup_device *cgdev)
        int ret;
        struct ccw_dev_id dev_id;
 
-       printk(KERN_INFO "claw: add for %s\n",cgdev->cdev[READ]->dev.bus_id);
+       dev_info(&cgdev->dev, "add for %s\n",
+                dev_name(&cgdev->cdev[READ]->dev));
        CLAW_DBF_TEXT(2, setup, "new_dev");
-       privptr = cgdev->dev.driver_data;
-       cgdev->cdev[READ]->dev.driver_data = privptr;
-       cgdev->cdev[WRITE]->dev.driver_data = privptr;
+       privptr = dev_get_drvdata(&cgdev->dev);
+       dev_set_drvdata(&cgdev->cdev[READ]->dev, privptr);
+       dev_set_drvdata(&cgdev->cdev[WRITE]->dev, privptr);
        if (!privptr)
                return -ENODEV;
        p_env = privptr->p_env;
@@ -2896,33 +2976,34 @@ claw_new_device(struct ccwgroup_device *cgdev)
        if (ret == 0)
                ret = add_channel(cgdev->cdev[1],1,privptr);
        if (ret != 0) {
-               printk(KERN_WARNING
-                       "add channel failed with ret = %d\n", ret);
+               dev_warn(&cgdev->dev, "Creating a CLAW group device"
+                       " failed with error code %d\n", ret);
                goto out;
        }
        ret = ccw_device_set_online(cgdev->cdev[READ]);
        if (ret != 0) {
-               printk(KERN_WARNING
-                       "claw: ccw_device_set_online %s READ failed "
-                       "with ret = %d\n",cgdev->cdev[READ]->dev.bus_id,ret);
+               dev_warn(&cgdev->dev,
+                       "Setting the read subchannel online"
+                       " failed with error code %d\n", ret);
                goto out;
        }
        ret = ccw_device_set_online(cgdev->cdev[WRITE]);
        if (ret != 0) {
-               printk(KERN_WARNING
-                       "claw: ccw_device_set_online %s WRITE failed "
-                       "with ret = %d\n",cgdev->cdev[WRITE]->dev.bus_id, ret);
+               dev_warn(&cgdev->dev,
+                       "Setting the write subchannel online "
+                       "failed with error code %d\n", ret);
                goto out;
        }
        dev = alloc_netdev(0,"claw%d",claw_init_netdevice);
        if (!dev) {
-               printk(KERN_WARNING "%s:alloc_netdev failed\n",__func__);
+               dev_warn(&cgdev->dev,
+                       "Activating the CLAW device failed\n");
                goto out;
        }
        dev->ml_priv = privptr;
-       cgdev->dev.driver_data = privptr;
-        cgdev->cdev[READ]->dev.driver_data = privptr;
-        cgdev->cdev[WRITE]->dev.driver_data = privptr;
+       dev_set_drvdata(&cgdev->dev, privptr);
+       dev_set_drvdata(&cgdev->cdev[READ]->dev, privptr);
+       dev_set_drvdata(&cgdev->cdev[WRITE]->dev, privptr);
        /* sysfs magic */
         SET_NETDEV_DEV(dev, &cgdev->dev);
        if (register_netdev(dev) != 0) {
@@ -2944,13 +3025,13 @@ claw_new_device(struct ccwgroup_device *cgdev)
        privptr->channel[WRITE].ndev = dev;
        privptr->p_env->ndev = dev;
 
-       printk(KERN_INFO "%s:readsize=%d  writesize=%d "
+       dev_info(&cgdev->dev, "%s:readsize=%d  writesize=%d "
                "readbuffer=%d writebuffer=%d read=0x%04x write=0x%04x\n",
                 dev->name, p_env->read_size,
                p_env->write_size, p_env->read_buffers,
                 p_env->write_buffers, p_env->devno[READ],
                p_env->devno[WRITE]);
-        printk(KERN_INFO "%s:host_name:%.8s, adapter_name "
+       dev_info(&cgdev->dev, "%s:host_name:%.8s, adapter_name "
                ":%.8s api_type: %.8s\n",
                 dev->name, p_env->host_name,
                p_env->adapter_name , p_env->api_type);
@@ -2987,15 +3068,15 @@ claw_shutdown_device(struct ccwgroup_device *cgdev)
        struct net_device *ndev;
        int     ret;
 
-       CLAW_DBF_TEXT_(2, setup, "%s", cgdev->dev.bus_id);
-       priv = cgdev->dev.driver_data;
+       CLAW_DBF_TEXT_(2, setup, "%s", dev_name(&cgdev->dev));
+       priv = dev_get_drvdata(&cgdev->dev);
        if (!priv)
                return -ENODEV;
        ndev = priv->channel[READ].ndev;
        if (ndev) {
                /* Close the device */
-               printk(KERN_INFO
-                       "%s: shuting down \n",ndev->name);
+               dev_info(&cgdev->dev, "%s: shutting down \n",
+                       ndev->name);
                if (ndev->flags & IFF_RUNNING)
                        ret = claw_release(ndev);
                ndev->flags &=~IFF_RUNNING;
@@ -3017,11 +3098,10 @@ claw_remove_device(struct ccwgroup_device *cgdev)
        struct claw_privbk *priv;
 
        BUG_ON(!cgdev);
-       CLAW_DBF_TEXT_(2, setup, "%s", cgdev->dev.bus_id);
-       priv = cgdev->dev.driver_data;
+       CLAW_DBF_TEXT_(2, setup, "%s", dev_name(&cgdev->dev));
+       priv = dev_get_drvdata(&cgdev->dev);
        BUG_ON(!priv);
-       printk(KERN_INFO "claw: %s() called %s will be removed.\n",
-                       __func__, dev_name(&cgdev->cdev[0]->dev));
+       dev_info(&cgdev->dev, " will be removed.\n");
        if (cgdev->state == CCWGROUP_ONLINE)
                claw_shutdown_device(cgdev);
        claw_remove_files(&cgdev->dev);
@@ -3034,9 +3114,9 @@ claw_remove_device(struct ccwgroup_device *cgdev)
        kfree(priv->channel[1].irb);
        priv->channel[1].irb=NULL;
        kfree(priv);
-       cgdev->dev.driver_data=NULL;
-       cgdev->cdev[READ]->dev.driver_data = NULL;
-       cgdev->cdev[WRITE]->dev.driver_data = NULL;
+       dev_set_drvdata(&cgdev->dev, NULL);
+       dev_set_drvdata(&cgdev->cdev[READ]->dev, NULL);
+       dev_set_drvdata(&cgdev->cdev[WRITE]->dev, NULL);
        put_device(&cgdev->dev);
 
        return;
@@ -3052,7 +3132,7 @@ claw_hname_show(struct device *dev, struct device_attribute *attr, char *buf)
        struct claw_privbk *priv;
        struct claw_env *  p_env;
 
-       priv = dev->driver_data;
+       priv = dev_get_drvdata(dev);
        if (!priv)
                return -ENODEV;
        p_env = priv->p_env;
@@ -3060,12 +3140,13 @@ claw_hname_show(struct device *dev, struct device_attribute *attr, char *buf)
 }
 
 static ssize_t
-claw_hname_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+claw_hname_write(struct device *dev, struct device_attribute *attr,
+        const char *buf, size_t count)
 {
        struct claw_privbk *priv;
        struct claw_env *  p_env;
 
-       priv = dev->driver_data;
+       priv = dev_get_drvdata(dev);
        if (!priv)
                return -ENODEV;
        p_env = priv->p_env;
@@ -3089,7 +3170,7 @@ claw_adname_show(struct device *dev, struct device_attribute *attr, char *buf)
        struct claw_privbk *priv;
        struct claw_env *  p_env;
 
-       priv = dev->driver_data;
+       priv = dev_get_drvdata(dev);
        if (!priv)
                return -ENODEV;
        p_env = priv->p_env;
@@ -3097,12 +3178,13 @@ claw_adname_show(struct device *dev, struct device_attribute *attr, char *buf)
 }
 
 static ssize_t
-claw_adname_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+claw_adname_write(struct device *dev, struct device_attribute *attr,
+        const char *buf, size_t count)
 {
        struct claw_privbk *priv;
        struct claw_env *  p_env;
 
-       priv = dev->driver_data;
+       priv = dev_get_drvdata(dev);
        if (!priv)
                return -ENODEV;
        p_env = priv->p_env;
@@ -3126,7 +3208,7 @@ claw_apname_show(struct device *dev, struct device_attribute *attr, char *buf)
        struct claw_privbk *priv;
        struct claw_env *  p_env;
 
-       priv = dev->driver_data;
+       priv = dev_get_drvdata(dev);
        if (!priv)
                return -ENODEV;
        p_env = priv->p_env;
@@ -3135,12 +3217,13 @@ claw_apname_show(struct device *dev, struct device_attribute *attr, char *buf)
 }
 
 static ssize_t
-claw_apname_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+claw_apname_write(struct device *dev, struct device_attribute *attr,
+       const char *buf, size_t count)
 {
        struct claw_privbk *priv;
        struct claw_env *  p_env;
 
-       priv = dev->driver_data;
+       priv = dev_get_drvdata(dev);
        if (!priv)
                return -ENODEV;
        p_env = priv->p_env;
@@ -3174,7 +3257,7 @@ claw_wbuff_show(struct device *dev, struct device_attribute *attr, char *buf)
        struct claw_privbk *priv;
        struct claw_env * p_env;
 
-       priv = dev->driver_data;
+       priv = dev_get_drvdata(dev);
        if (!priv)
                return -ENODEV;
        p_env = priv->p_env;
@@ -3182,13 +3265,14 @@ claw_wbuff_show(struct device *dev, struct device_attribute *attr, char *buf)
 }
 
 static ssize_t
-claw_wbuff_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+claw_wbuff_write(struct device *dev, struct device_attribute *attr,
+       const char *buf, size_t count)
 {
        struct claw_privbk *priv;
        struct claw_env *  p_env;
        int nnn,max;
 
-       priv = dev->driver_data;
+       priv = dev_get_drvdata(dev);
        if (!priv)
                return -ENODEV;
        p_env = priv->p_env;
@@ -3215,7 +3299,7 @@ claw_rbuff_show(struct device *dev, struct device_attribute *attr, char *buf)
        struct claw_privbk *priv;
        struct claw_env *  p_env;
 
-       priv = dev->driver_data;
+       priv = dev_get_drvdata(dev);
        if (!priv)
                return -ENODEV;
        p_env = priv->p_env;
@@ -3223,13 +3307,14 @@ claw_rbuff_show(struct device *dev, struct device_attribute *attr, char *buf)
 }
 
 static ssize_t
-claw_rbuff_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+claw_rbuff_write(struct device *dev, struct device_attribute *attr,
+       const char *buf, size_t count)
 {
        struct claw_privbk *priv;
        struct claw_env *p_env;
        int nnn,max;
 
-       priv = dev->driver_data;
+       priv = dev_get_drvdata(dev);
        if (!priv)
                return -ENODEV;
        p_env = priv->p_env;
@@ -3284,9 +3369,13 @@ claw_remove_files(struct device *dev)
 static void __exit
 claw_cleanup(void)
 {
-       unregister_cu3088_discipline(&claw_group_driver);
+       driver_remove_file(&claw_group_driver.driver,
+                          &driver_attr_group);
+       ccwgroup_driver_unregister(&claw_group_driver);
+       ccw_driver_unregister(&claw_ccw_driver);
+       root_device_unregister(claw_root_dev);
        claw_unregister_debug_facility();
-       printk(KERN_INFO "claw: Driver unloaded\n");
+       pr_info("Driver unloaded\n");
 
 }
 
@@ -3300,22 +3389,37 @@ static int __init
 claw_init(void)
 {
        int ret = 0;
-       printk(KERN_INFO "claw: starting driver\n");
 
+       pr_info("Loading %s\n", version);
        ret = claw_register_debug_facility();
        if (ret) {
-               printk(KERN_WARNING "claw: %s() debug_register failed %d\n",
-                       __func__,ret);
-               return ret;
+               pr_err("Registering with the S/390 debug feature"
+                       " failed with error code %d\n", ret);
+               goto out_err;
        }
        CLAW_DBF_TEXT(2, setup, "init_mod");
-       ret = register_cu3088_discipline(&claw_group_driver);
-       if (ret) {
-               CLAW_DBF_TEXT(2, setup, "init_bad");
-               claw_unregister_debug_facility();
-               printk(KERN_WARNING "claw; %s() cu3088 register failed %d\n",
-                       __func__,ret);
-       }
+       claw_root_dev = root_device_register("claw");
+       ret = IS_ERR(claw_root_dev) ? PTR_ERR(claw_root_dev) : 0;
+       if (ret)
+               goto register_err;
+       ret = ccw_driver_register(&claw_ccw_driver);
+       if (ret)
+               goto ccw_err;
+       claw_group_driver.driver.groups = claw_group_attr_groups;
+       ret = ccwgroup_driver_register(&claw_group_driver);
+       if (ret)
+               goto ccwgroup_err;
+       return 0;
+
+ccwgroup_err:
+       ccw_driver_unregister(&claw_ccw_driver);
+ccw_err:
+       root_device_unregister(claw_root_dev);
+register_err:
+       CLAW_DBF_TEXT(2, setup, "init_bad");
+       claw_unregister_debug_facility();
+out_err:
+       pr_err("Initializing the claw device driver failed\n");
        return ret;
 }