Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / s390 / net / iucv.c
index e08e74e..e0c7deb 100644 (file)
@@ -1,6 +1,4 @@
-/* 
- * $Id: iucv.c,v 1.45 2005/04/26 22:59:06 braunu Exp $
- *
+/*
  * IUCV network driver
  *
  * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * RELEASE-TAG: IUCV lowlevel driver $Revision: 1.45 $
- *
  */
-\f
+
 /* #define DEBUG */
 
 #include <linux/module.h>
@@ -54,7 +50,7 @@
 #include <asm/s390_ext.h>
 #include <asm/ebcdic.h>
 #include <asm/smp.h>
-#include <asm/ccwdev.h> //for root device stuff
+#include <asm/s390_rdev.h>
 
 /* FLAGS:
  * All flags are defined in the field IPFLAGS1 of each function
@@ -85,7 +81,7 @@ iucv_bus_match (struct device *dev, struct device_driver *drv)
 struct bus_type iucv_bus = {
        .name = "iucv",
        .match = iucv_bus_match,
-};     
+};
 
 struct device *iucv_root;
 
@@ -301,7 +297,7 @@ MODULE_LICENSE("GPL");
 /*
  * Debugging stuff
  *******************************************************************************/
-\f
+
 
 #ifdef DEBUG
 static int debuglevel = 0;
@@ -348,24 +344,14 @@ do { \
 /*
  * Internal functions
  *******************************************************************************/
-\f
+
 /**
  * print start banner
  */
 static void
 iucv_banner(void)
 {
-       char vbuf[] = "$Revision: 1.45 $";
-       char *version = vbuf;
-
-       if ((version = strchr(version, ':'))) {
-               char *p = strchr(version + 1, '$');
-               if (p)
-                       *p = '\0';
-       } else
-               version = " ??? ";
-       printk(KERN_INFO
-              "IUCV lowlevel driver Version%s initialized\n", version);
+       printk(KERN_INFO "IUCV lowlevel driver initialized\n");
 }
 
 /**
@@ -400,7 +386,7 @@ iucv_init(void)
        }
 
        /* Note: GFP_DMA used used to get memory below 2G */
-       iucv_external_int_buffer = kmalloc(sizeof(iucv_GeneralInterrupt),
+       iucv_external_int_buffer = kzalloc(sizeof(iucv_GeneralInterrupt),
                                           GFP_KERNEL|GFP_DMA);
        if (!iucv_external_int_buffer) {
                printk(KERN_WARNING
@@ -410,10 +396,9 @@ iucv_init(void)
                bus_unregister(&iucv_bus);
                return -ENOMEM;
        }
-       memset(iucv_external_int_buffer, 0, sizeof(iucv_GeneralInterrupt));
 
        /* Initialize parameter pool */
-       iucv_param_pool = kmalloc(sizeof(iucv_param) * PARAM_POOL_SIZE,
+       iucv_param_pool = kzalloc(sizeof(iucv_param) * PARAM_POOL_SIZE,
                                  GFP_KERNEL|GFP_DMA);
        if (!iucv_param_pool) {
                printk(KERN_WARNING "%s: Could not allocate param pool\n",
@@ -424,7 +409,6 @@ iucv_init(void)
                bus_unregister(&iucv_bus);
                return -ENOMEM;
        }
-       memset(iucv_param_pool, 0, sizeof(iucv_param) * PARAM_POOL_SIZE);
 
        /* Initialize irq queue */
        INIT_LIST_HEAD(&iucv_irq_queue);
@@ -447,14 +431,10 @@ static void
 iucv_exit(void)
 {
        iucv_retrieve_buffer();
-       if (iucv_external_int_buffer) {
-               kfree(iucv_external_int_buffer);
-               iucv_external_int_buffer = NULL;
-       }
-       if (iucv_param_pool) {
-               kfree(iucv_param_pool);
-               iucv_param_pool = NULL;
-       }
+       kfree(iucv_external_int_buffer);
+       iucv_external_int_buffer = NULL;
+       kfree(iucv_param_pool);
+       iucv_param_pool = NULL;
        s390_root_dev_unregister(iucv_root);
        bus_unregister(&iucv_bus);
        printk(KERN_INFO "IUCV lowlevel driver unloaded\n");
@@ -481,7 +461,7 @@ grab_param(void)
                ptr++;
                if (ptr >= iucv_param_pool + PARAM_POOL_SIZE)
                        ptr = iucv_param_pool;
-       } while (atomic_compare_and_swap(0, 1, &ptr->in_use));
+       } while (atomic_cmpxchg(&ptr->in_use, 0, 1) != 0);
        hint = ptr - iucv_param_pool;
 
        memset(&ptr->param, 0, sizeof(ptr->param));
@@ -811,15 +791,14 @@ iucv_register_program (__u8 pgmname[16],
                }
 
                max_connections = iucv_query_maxconn();
-               iucv_pathid_table = kmalloc(max_connections * sizeof(handler *),
-                                      GFP_ATOMIC);
+               iucv_pathid_table = kcalloc(max_connections, sizeof(handler *),
+                                       GFP_ATOMIC);
                if (iucv_pathid_table == NULL) {
                        printk(KERN_WARNING "%s: iucv_pathid_table storage "
                               "allocation failed\n", __FUNCTION__);
                        kfree(new_handler);
                        return NULL;
                }
-               memset (iucv_pathid_table, 0, max_connections * sizeof(handler *));
        }
        memset(new_handler, 0, sizeof (handler));
        memcpy(new_handler->id.user_data, pgmname,
@@ -831,7 +810,7 @@ iucv_register_program (__u8 pgmname[16],
                        sizeof (new_handler->id.userid));
                EBC_TOUPPER (new_handler->id.userid,
                             sizeof (new_handler->id.userid));
-               
+
                if (pgmmask) {
                        memcpy (new_handler->id.mask, pgmmask,
                                sizeof (new_handler->id.mask));
@@ -1250,7 +1229,7 @@ iucv_purge (__u16 pathid, __u32 msgid, __u32 srccls, __u32 *audit)
                /* parm->ipaudit has only 3 bytes */
                *audit >>= 8;
        }
-       
+
        release_param(parm);
 
        iucv_debug(1, "b2f0_result = %ld", b2f0_result);
@@ -2351,14 +2330,14 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
                                        temp_buff1[j] &= (h->id.mask)[j];
                                        temp_buff2[j] &= (h->id.mask)[j];
                                }
-                               
+
                                iucv_dumpit("temp_buff1:",
                                            temp_buff1, sizeof(temp_buff1));
                                iucv_dumpit("temp_buff2",
                                            temp_buff2, sizeof(temp_buff2));
-                               
+
                                if (!memcmp (temp_buff1, temp_buff2, 24)) {
-                                       
+
                                        iucv_debug(2,
                                                   "found a matching handler");
                                        break;
@@ -2389,7 +2368,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
                        } else
                                iucv_sever(int_buf->ippathid, no_listener);
                        break;
-                       
+
                case 0x02:              /*connection complete */
                        if (messagesDisabled) {
                            iucv_setmask(~0);
@@ -2408,7 +2387,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
                        } else
                                iucv_sever(int_buf->ippathid, no_listener);
                        break;
-                       
+
                case 0x03:              /* connection severed */
                        if (messagesDisabled) {
                            iucv_setmask(~0);
@@ -2419,13 +2398,13 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
                                        interrupt->ConnectionSevered(
                                                (iucv_ConnectionSevered *)int_buf,
                                                h->pgm_data);
-                               
+
                                else
                                        iucv_sever (int_buf->ippathid, no_listener);
                        } else
                                iucv_sever(int_buf->ippathid, no_listener);
                        break;
-                       
+
                case 0x04:              /* connection quiesced */
                        if (messagesDisabled) {
                            iucv_setmask(~0);
@@ -2441,7 +2420,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
                                                   "ConnectionQuiesced not called");
                        }
                        break;
-                       
+
                case 0x05:              /* connection resumed */
                        if (messagesDisabled) {
                            iucv_setmask(~0);
@@ -2457,7 +2436,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
                                                   "ConnectionResumed not called");
                        }
                        break;
-                       
+
                case 0x06:              /* priority message complete */
                case 0x07:              /* nonpriority message complete */
                        if (h) {
@@ -2470,7 +2449,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
                                                   "MessageComplete not called");
                        }
                        break;
-                       
+
                case 0x08:              /* priority message pending  */
                case 0x09:              /* nonpriority message pending  */
                        if (h) {
@@ -2488,7 +2467,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
                               __FUNCTION__);
                        break;
        }                       /* end switch */
-       
+
        iucv_debug(2, "exiting pathid %d, type %02X",
                 int_buf->ippathid, int_buf->iptype);