]> git.hungrycats.org Git - linux/commitdiff
[PATCH] s390: network device driver
authorAndrew Morton <akpm@osdl.org>
Thu, 3 Jun 2004 01:03:27 +0000 (18:03 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Thu, 3 Jun 2004 01:03:27 +0000 (18:03 -0700)
From: Martin Schwidefsky <schwidefsky@de.ibm.com>

Network driver changes:
 - iucv: Fix special case of a "Connection Pending" interrupt within
   iucv_do_int.
 - netiucv: Revoke broken iucvMagic change for more than one connection.
 - qeth: Fix string parsing in notifier_register attribute function.
 - qeth: Add code for socket ioctl SIOC_QETH_GET_CARD_TYPE.
 - qeth: Fix debug log entry and buffer copy in qeth_snmp_command_cb.
 - qeth: Fix race on qeth_dbf_txt_buf.

Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/s390/net/iucv.c
drivers/s390/net/netiucv.c
drivers/s390/net/qeth.h
drivers/s390/net/qeth_main.c
drivers/s390/net/qeth_sys.c

index 8dd8becea88359bc877aea35c29c74e9a93d7cd9..36790af32b760e3d5ba0ced22d6ae9aa361e6a2d 100644 (file)
@@ -1,5 +1,5 @@
 /* 
- * $Id: iucv.c,v 1.32 2004/05/18 09:28:43 braunu Exp $
+ * $Id: iucv.c,v 1.33 2004/05/24 10:19:18 braunu Exp $
  *
  * IUCV network driver
  *
@@ -29,7 +29,7 @@
  * 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.32 $
+ * RELEASE-TAG: IUCV lowlevel driver $Revision: 1.33 $
  *
  */
 \f
@@ -352,7 +352,7 @@ do { \
 static void
 iucv_banner(void)
 {
-       char vbuf[] = "$Revision: 1.32 $";
+       char vbuf[] = "$Revision: 1.33 $";
        char *version = vbuf;
 
        if ((version = strchr(version, ':'))) {
@@ -2368,7 +2368,8 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
                                        iucv_debug(2,
                                                   "found a matching handler");
                                        break;
-                               }
+                               } else
+                                       h = NULL;
                        }
                        spin_unlock_irqrestore (&iucv_lock, flags);
                        if (h) {
index 2b3753d554413fc58d5fc486062d371109ef457f..570a93b673919f385400a7a31d0e5c04e2e01be2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: netiucv.c,v 1.53 2004/05/07 14:29:37 mschwide Exp $
+ * $Id: netiucv.c,v 1.54 2004/05/28 08:04:14 braunu Exp $
  *
  * IUCV network driver
  *
@@ -30,7 +30,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * RELEASE-TAG: IUCV network driver $Revision: 1.53 $
+ * RELEASE-TAG: IUCV network driver $Revision: 1.54 $
  *
  */
 \f
@@ -60,7 +60,6 @@
 #include <asm/io.h>
 #include <asm/bitops.h>
 #include <asm/uaccess.h>
-#include <asm/ebcdic.h>
 
 #include "iucv.h"
 #include "fsm.h"
@@ -167,10 +166,10 @@ static __inline__ int netiucv_test_and_set_busy(struct net_device *dev)
 }
 
 static __u8 iucv_host[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
-//static __u8 iucvMagic[16] = {
-//     0xF0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
-//     0xF0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40
-//};
+static __u8 iucvMagic[16] = {
+       0xF0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+       0xF0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40
+};
 
 /**
  * This mask means the 16-byte IUCV "magic" and the origin userid must
@@ -769,18 +768,10 @@ conn_action_start(fsm_instance *fi, int event, void *arg)
        struct iucv_event *ev = (struct iucv_event *)arg;
        struct iucv_connection *conn = ev->conn;
        __u16 msglimit;
-       int rc, len;
-       __u8 iucvMagic[16] = {
-       0xF0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
-        0xF0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40
-       };
+       int rc;
 
        pr_debug("%s() called\n", __FUNCTION__);
 
-       len = (IFNAMSIZ < sizeof(conn->netdev->name)) ?
-               IFNAMSIZ : sizeof(conn->netdev->name);
-       memcpy(iucvMagic, conn->netdev->name, len);
-       ASCEBC (iucvMagic, len);
        if (conn->handle == 0) {
                conn->handle =
                        iucv_register_program(iucvMagic, conn->userid, mask,
@@ -1958,7 +1949,7 @@ static struct device_driver netiucv_driver = {
 static void
 netiucv_banner(void)
 {
-       char vbuf[] = "$Revision: 1.53 $";
+       char vbuf[] = "$Revision: 1.54 $";
        char *version = vbuf;
 
        if ((version = strchr(version, ':'))) {
index a299fa1dbe263cf5abf379625dd4f605a30be54b..beb2c0fcc4ed1141cea5403278d483560ad903ff 100644 (file)
@@ -23,7 +23,7 @@
 
 #include "qeth_mpc.h"
 
-#define VERSION_QETH_H                 "$Revision: 1.108 $"
+#define VERSION_QETH_H                 "$Revision: 1.109 $"
 
 #ifdef CONFIG_QETH_IPV6
 #define QETH_VERSION_IPV6      ":IPv6"
                debug_event(qeth_dbf_##name,level,(void*)(addr),len); \
        } while (0)
 
-#define QETH_DBF_TEXT_(name,level,text...)                               \
-       do {                                                              \
-               sprintf(qeth_dbf_text_buf, text);                         \
-               debug_text_event(qeth_dbf_##name,level,qeth_dbf_text_buf);\
+extern DEFINE_PER_CPU(char[256], qeth_dbf_txt_buf);
+
+#define QETH_DBF_TEXT_(name,level,text...)                             \
+       do {                                                            \
+               char* dbf_txt_buf = get_cpu_var(qeth_dbf_txt_buf);      \
+               sprintf(dbf_txt_buf, text);                             \
+               debug_text_event(qeth_dbf_##name,level,dbf_txt_buf);    \
+               put_cpu_var(qeth_dbf_txt_buf);                          \
        } while (0)
 
 #define QETH_DBF_SPRINTF(name,level,text...) \
index ceab62acf37e39b325e806f308fa1834667b49e8..ee7b0bcc22575a7d07dee127e5ae7aa7ac8f6641 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *
- * linux/drivers/s390/net/qeth_main.c ($Revision: 1.112 $)
+ * linux/drivers/s390/net/qeth_main.c ($Revision: 1.118 $)
  *
  * Linux on zSeries OSA Express and HiperSockets support
  *
@@ -12,7 +12,7 @@
  *                       Frank Pavlic (pavlic@de.ibm.com) and
  *                       Thomas Spatzier <tspat@de.ibm.com>
  *
- *    $Revision: 1.112 $        $Date: 2004/05/19 09:28:21 $
+ *    $Revision: 1.118 $        $Date: 2004/06/02 06:34:52 $
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -78,7 +78,7 @@ qeth_eyecatcher(void)
 #include "qeth_mpc.h"
 #include "qeth_fs.h"
 
-#define VERSION_QETH_C "$Revision: 1.112 $"
+#define VERSION_QETH_C "$Revision: 1.118 $"
 static const char *version = "qeth S/390 OSA-Express driver";
 
 /**
@@ -91,7 +91,8 @@ static debug_info_t *qeth_dbf_control = NULL;
 static debug_info_t *qeth_dbf_trace = NULL;
 static debug_info_t *qeth_dbf_sense = NULL;
 static debug_info_t *qeth_dbf_qerr = NULL;
-static char qeth_dbf_text_buf[255];
+
+DEFINE_PER_CPU(char[256], qeth_dbf_txt_buf);
 
 /**
  * some more definitions and declarations
@@ -4182,9 +4183,10 @@ qeth_snmp_command_cb(struct qeth_card *card, struct qeth_reply *reply,
        }
        data_len = *((__u16*)QETH_IPA_PDU_LEN_PDU1(data));
        if (cmd->data.setadapterparms.hdr.seq_no == 1)
-               data_len -= (__u16)((char*)&snmp->request - (char *)cmd);
-       else
                data_len -= (__u16)((char *)&snmp->data - (char *)cmd);
+       else
+               data_len -= (__u16)((char*)&snmp->request - (char *)cmd);
+
        /* check if there is enough room in userspace */
        if ((qinfo->udata_len - qinfo->udata_offset) < data_len) {
                QETH_DBF_TEXT_(trace, 4, "scer3%i", -ENOMEM);
@@ -4193,15 +4195,17 @@ qeth_snmp_command_cb(struct qeth_card *card, struct qeth_reply *reply,
        }
        QETH_DBF_TEXT_(trace, 4, "snore%i",
                       cmd->data.setadapterparms.hdr.used_total);
-       QETH_DBF_TEXT_(trace, 4, "sseqn%i", cmd->data.setassparms.hdr.seq_no);
+       QETH_DBF_TEXT_(trace, 4, "sseqn%i", cmd->data.setadapterparms.hdr.seq_no);
        /*copy entries to user buffer*/
        if (cmd->data.setadapterparms.hdr.seq_no == 1) {
                memcpy(qinfo->udata + qinfo->udata_offset,
-                      (char *)snmp,offsetof(struct qeth_snmp_cmd,data));
+                      (char *)snmp,
+                      data_len + offsetof(struct qeth_snmp_cmd,data));
                qinfo->udata_offset += offsetof(struct qeth_snmp_cmd, data);
+       } else {
+               memcpy(qinfo->udata + qinfo->udata_offset,
+                      (char *)&snmp->request, data_len);
        }
-       memcpy(qinfo->udata + qinfo->udata_offset,
-              (char *)&snmp->data, data_len);
        qinfo->udata_offset += data_len;
        /* check if all replies received ... */
                QETH_DBF_TEXT_(trace, 4, "srtot%i",
@@ -4212,7 +4216,6 @@ qeth_snmp_command_cb(struct qeth_card *card, struct qeth_reply *reply,
            cmd->data.setadapterparms.hdr.used_total)
                return 1;
        return 0;
-
 }
 
 static struct qeth_cmd_buffer *
@@ -4280,7 +4283,6 @@ qeth_snmp_command(struct qeth_card *card, char *udata)
         else
                copy_to_user(udata, qinfo.udata, qinfo.udata_len);
 
-
        kfree(qinfo.udata);
        return rc;
 }
@@ -4476,6 +4478,10 @@ qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data);
                break;
        case SIOC_QETH_GET_CARD_TYPE:
+               if ((card->info.type == QETH_CARD_TYPE_OSAE) &&
+                   !card->info.guestlan)
+                       return 1;
+               return 0;
                break;
        case SIOCGMIIPHY:
                mii_data = (struct mii_ioctl_data *) &rq->ifr_ifru.ifru_data;
index 5178a6cc2548c8c869a848c0c18e1ef869c19b9a..910c5f5666b67d7b0a125c1676f1af5f9ef9b499 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *
- * linux/drivers/s390/net/qeth_sys.c ($Revision: 1.30 $)
+ * linux/drivers/s390/net/qeth_sys.c ($Revision: 1.32 $)
  *
  * Linux on zSeries OSA Express and HiperSockets support
  * This file contains code related to sysfs.
@@ -20,7 +20,7 @@
 #include "qeth_mpc.h"
 #include "qeth_fs.h"
 
-const char *VERSION_QETH_SYS_C = "$Revision: 1.30 $";
+const char *VERSION_QETH_SYS_C = "$Revision: 1.32 $";
 
 /*****************************************************************************/
 /*                                                                           */
@@ -1447,14 +1447,16 @@ qeth_driver_notifier_register_store(struct device_driver *ddrv, const char *buf,
 {
        int rc;
        int signum;
-       char *tmp;
+       char *tmp, *tmp2;
 
        tmp = strsep((char **) &buf, "\n");
-       if (!strcmp(tmp, "unregister")){
-               return qeth_notifier_unregister(current);
+       if (!strncmp(tmp, "unregister", 10)){
+               if ((rc = qeth_notifier_unregister(current)))
+                       return rc;
+               return count;
        }
 
-       signum = simple_strtoul(buf, &tmp, 10);
+       signum = simple_strtoul(tmp, &tmp2, 10);
        if ((signum < 0) || (signum > 32)){
                PRINT_WARN("Signal number %d is out of range\n", signum);
                return -EINVAL;
@@ -1465,7 +1467,7 @@ qeth_driver_notifier_register_store(struct device_driver *ddrv, const char *buf,
        return count;
 }
 
-static DRIVER_ATTR(notifier_register, 0644, 0,
+static DRIVER_ATTR(notifier_register, 0200, 0,
                   qeth_driver_notifier_register_store);
 
 int