]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/s390/net/smsgiucv.c
Merge git://git.infradead.org/users/dwmw2/mtd-2.6.38
[mv-sheeva.git] / drivers / s390 / net / smsgiucv.c
index 70491274da16a7cf74120eaf79b416d12789c618..207b7d7424435ccefd62700a07cd424a0e732c40 100644 (file)
@@ -47,6 +47,7 @@ static struct device *smsg_dev;
 
 static DEFINE_SPINLOCK(smsg_list_lock);
 static LIST_HEAD(smsg_list);
+static int iucv_path_connected;
 
 static int smsg_path_pending(struct iucv_path *, u8 ipvmid[8], u8 ipuser[16]);
 static void smsg_message_pending(struct iucv_path *, struct iucv_message *);
@@ -59,7 +60,7 @@ static struct iucv_handler smsg_handler = {
 static int smsg_path_pending(struct iucv_path *path, u8 ipvmid[8],
                             u8 ipuser[16])
 {
-       if (strncmp(ipvmid, "*MSG    ", sizeof(ipvmid)) != 0)
+       if (strncmp(ipvmid, "*MSG    ", 8) != 0)
                return -EINVAL;
        /* Path pending from *MSG. */
        return iucv_path_accept(path, &smsg_handler, "SMSGIUCV        ", NULL);
@@ -142,8 +143,10 @@ static int smsg_pm_freeze(struct device *dev)
 #ifdef CONFIG_PM_DEBUG
        printk(KERN_WARNING "smsg_pm_freeze\n");
 #endif
-       if (smsg_path)
+       if (smsg_path && iucv_path_connected) {
                iucv_path_sever(smsg_path, NULL);
+               iucv_path_connected = 0;
+       }
        return 0;
 }
 
@@ -154,7 +157,7 @@ static int smsg_pm_restore_thaw(struct device *dev)
 #ifdef CONFIG_PM_DEBUG
        printk(KERN_WARNING "smsg_pm_restore_thaw\n");
 #endif
-       if (smsg_path) {
+       if (smsg_path && iucv_path_connected) {
                memset(smsg_path, 0, sizeof(*smsg_path));
                smsg_path->msglim = 255;
                smsg_path->flags = 0;
@@ -165,6 +168,8 @@ static int smsg_pm_restore_thaw(struct device *dev)
                        printk(KERN_ERR
                               "iucv_path_connect returned with rc %i\n", rc);
 #endif
+               if (!rc)
+                       iucv_path_connected = 1;
                cpcmd("SET SMSG IUCV", NULL, 0, NULL);
        }
        return 0;
@@ -214,6 +219,8 @@ static int __init smsg_init(void)
                               NULL, NULL, NULL);
        if (rc)
                goto out_free_path;
+       else
+               iucv_path_connected = 1;
        smsg_dev = kzalloc(sizeof(struct device), GFP_KERNEL);
        if (!smsg_dev) {
                rc = -ENOMEM;