From: Martin Schwidefsky 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 --- 25-akpm/drivers/s390/net/iucv.c | 9 +++++---- 25-akpm/drivers/s390/net/netiucv.c | 25 ++++++++----------------- 25-akpm/drivers/s390/net/qeth.h | 14 +++++++++----- 25-akpm/drivers/s390/net/qeth_main.c | 30 ++++++++++++++++++------------ 25-akpm/drivers/s390/net/qeth_sys.c | 16 +++++++++------- 5 files changed, 49 insertions(+), 45 deletions(-) diff -puN drivers/s390/net/iucv.c~s390-4-4-network-device-driver drivers/s390/net/iucv.c --- 25/drivers/s390/net/iucv.c~s390-4-4-network-device-driver Wed Jun 2 14:34:33 2004 +++ 25-akpm/drivers/s390/net/iucv.c Wed Jun 2 14:34:33 2004 @@ -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 $ * */ @@ -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_ iucv_debug(2, "found a matching handler"); break; - } + } else + h = NULL; } spin_unlock_irqrestore (&iucv_lock, flags); if (h) { diff -puN drivers/s390/net/netiucv.c~s390-4-4-network-device-driver drivers/s390/net/netiucv.c --- 25/drivers/s390/net/netiucv.c~s390-4-4-network-device-driver Wed Jun 2 14:34:33 2004 +++ 25-akpm/drivers/s390/net/netiucv.c Wed Jun 2 14:34:33 2004 @@ -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 $ * */ @@ -60,7 +60,6 @@ #include #include #include -#include #include "iucv.h" #include "fsm.h" @@ -167,10 +166,10 @@ static __inline__ int netiucv_test_and_s } 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 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_driv static void netiucv_banner(void) { - char vbuf[] = "$Revision: 1.53 $"; + char vbuf[] = "$Revision: 1.54 $"; char *version = vbuf; if ((version = strchr(version, ':'))) { diff -puN drivers/s390/net/qeth.h~s390-4-4-network-device-driver drivers/s390/net/qeth.h --- 25/drivers/s390/net/qeth.h~s390-4-4-network-device-driver Wed Jun 2 14:34:33 2004 +++ 25-akpm/drivers/s390/net/qeth.h Wed Jun 2 14:34:33 2004 @@ -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" @@ -91,10 +91,14 @@ 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...) \ diff -puN drivers/s390/net/qeth_main.c~s390-4-4-network-device-driver drivers/s390/net/qeth_main.c --- 25/drivers/s390/net/qeth_main.c~s390-4-4-network-device-driver Wed Jun 2 14:34:33 2004 +++ 25-akpm/drivers/s390/net/qeth_main.c Wed Jun 2 14:34:33 2004 @@ -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 * - * $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 = 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 *c } 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 *c } 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 *c 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 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, st 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; diff -puN drivers/s390/net/qeth_sys.c~s390-4-4-network-device-driver drivers/s390/net/qeth_sys.c --- 25/drivers/s390/net/qeth_sys.c~s390-4-4-network-device-driver Wed Jun 2 14:34:33 2004 +++ 25-akpm/drivers/s390/net/qeth_sys.c Wed Jun 2 14:34:33 2004 @@ -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(stru { 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(stru return count; } -static DRIVER_ATTR(notifier_register, 0644, 0, +static DRIVER_ATTR(notifier_register, 0200, 0, qeth_driver_notifier_register_store); int _