[PATCH] s390 fixes (2/12).

From: Martin Schwidefsky (schwidefsky@de.ibm.com)
Date: Mon Feb 03 2003 - 14:45:32 EST


Bug fixes for the CTC driver

also removes the bogus intparm_t typedef
diff -urN linux-2.5.59/drivers/s390/net/ctcmain.c linux-2.5.59-s390/drivers/s390/net/ctcmain.c
--- linux-2.5.59/drivers/s390/net/ctcmain.c Fri Jan 17 03:22:01 2003
+++ linux-2.5.59-s390/drivers/s390/net/ctcmain.c Mon Feb 3 20:49:13 2003
@@ -1,5 +1,5 @@
 /*
- * $Id: ctcmain.c,v 1.30 2002/12/09 13:56:20 aberg Exp $
+ * $Id: ctcmain.c,v 1.35 2003/01/17 13:46:13 cohuck Exp $
  *
  * CTC / ESCON network driver
  *
@@ -36,7 +36,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * RELEASE-TAG: CTC/ESCON network driver $Revision: 1.30 $
+ * RELEASE-TAG: CTC/ESCON network driver $Revision: 1.35 $
  *
  */
 
@@ -105,10 +105,6 @@
 
 #define CTC_ID_SIZE DEVICE_ID_SIZE+3
 
-/**
- * If running on 64 bit, this must be changed. XXX Why? (bird)
- */
-typedef unsigned long intparm_t;
 
 struct ctc_profile {
         unsigned long maxmulti;
@@ -270,8 +266,6 @@
         return test_and_set_bit(0, &((struct ctc_priv *) dev->priv)->tbusy);
 }
 
-#define SET_DEVICE_START(device, value)
-
 /**
  * Print Banner.
  */
@@ -279,7 +273,7 @@
 print_banner(void)
 {
         static int printed = 0;
- char vbuf[] = "$Revision: 1.30 $";
+ char vbuf[] = "$Revision: 1.35 $";
         char *version = vbuf;
 
         if (printed)
@@ -882,7 +876,7 @@
                 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
                 ch->prof.send_stamp = xtime;
                 rc = ccw_device_start(ch->cdev, &ch->ccw[0],
- (intparm_t) ch, 0xff, 0);
+ (unsigned long) ch, 0xff, 0);
                 ch->prof.doios_multi++;
                 if (rc != 0) {
                         privptr->stats.tx_dropped += i;
@@ -985,7 +979,7 @@
         if (ctc_checkalloc_buffer(ch, 1))
                 return;
         ch->ccw[1].count = ch->max_bufsize;
- rc = ccw_device_start(ch->cdev, &ch->ccw[0], (intparm_t) ch, 0xff, 0);
+ rc = ccw_device_start(ch->cdev, &ch->ccw[0], (unsigned long) ch, 0xff, 0);
         if (rc != 0)
                 ccw_check_return_code(ch, rc);
 }
@@ -1042,7 +1036,7 @@
 
         fsm_newstate(fi, (CHANNEL_DIRECTION(ch->flags) == READ)
                      ? CH_STATE_RXINIT : CH_STATE_TXINIT);
- rc = ccw_device_start(ch->cdev, &ch->ccw[0], (intparm_t) ch, 0xff, 0);
+ rc = ccw_device_start(ch->cdev, &ch->ccw[0], (unsigned long) ch, 0xff, 0);
         if (rc != 0) {
                 fsm_deltimer(&ch->timer);
                 fsm_newstate(fi, CH_STATE_SETUPWAIT);
@@ -1089,7 +1083,7 @@
                 ch->ccw[1].count = ch->max_bufsize;
                 fsm_newstate(fi, CH_STATE_RXIDLE);
                 rc = ccw_device_start(ch->cdev, &ch->ccw[0],
- (intparm_t) ch, 0xff, 0);
+ (unsigned long) ch, 0xff, 0);
                 if (rc != 0) {
                         fsm_newstate(fi, CH_STATE_RXINIT);
                         ccw_check_return_code(ch, rc);
@@ -1122,7 +1116,7 @@
         fsm_newstate(fi, CH_STATE_SETUPWAIT);
         if (event == CH_EVENT_TIMER)
                 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
- rc = ccw_device_start(ch->cdev, &ch->ccw[6], (intparm_t) ch, 0xff, 0);
+ rc = ccw_device_start(ch->cdev, &ch->ccw[6], (unsigned long) ch, 0xff, 0);
         if (event == CH_EVENT_TIMER)
                 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
         if (rc != 0) {
@@ -1198,7 +1192,7 @@
         fsm_newstate(fi, CH_STATE_STARTWAIT);
         fsm_addtimer(&ch->timer, 1000, CH_EVENT_TIMER, ch);
         spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
- rc = ccw_device_halt(ch->cdev, (intparm_t) ch);
+ rc = ccw_device_halt(ch->cdev, (unsigned long) ch);
         spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
         if (rc != 0) {
                 fsm_deltimer(&ch->timer);
@@ -1228,7 +1222,7 @@
                 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
         oldstate = fsm_getstate(fi);
         fsm_newstate(fi, CH_STATE_TERM);
- rc = ccw_device_halt(ch->cdev, (intparm_t) ch);
+ rc = ccw_device_halt(ch->cdev, (unsigned long) ch);
         if (event == CH_EVENT_STOP)
                 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
         if (rc != 0) {
@@ -1345,7 +1339,7 @@
                 fsm_deltimer(&ch->timer);
                 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
                 if (CHANNEL_DIRECTION(ch->flags) == READ) {
- int rc = ccw_device_halt(ch->cdev, (intparm_t) ch);
+ int rc = ccw_device_halt(ch->cdev, (unsigned long) ch);
                         if (rc != 0)
                                 ccw_check_return_code(ch, rc);
                 }
@@ -1392,7 +1386,7 @@
         fsm_newstate(fi, CH_STATE_STARTWAIT);
         if (event == CH_EVENT_TIMER)
                 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
- rc = ccw_device_halt(ch->cdev, (intparm_t) ch);
+ rc = ccw_device_halt(ch->cdev, (unsigned long) ch);
         if (event == CH_EVENT_TIMER)
                 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
         if (rc != 0) {
@@ -1480,8 +1474,8 @@
         ch2 = ((struct ctc_priv *) dev->priv)->channel[WRITE];
         fsm_newstate(ch2->fsm, CH_STATE_DTERM);
 
- ccw_device_halt(ch->cdev, (intparm_t) ch);
- ccw_device_halt(ch2->cdev, (intparm_t) ch2);
+ ccw_device_halt(ch->cdev, (unsigned long) ch);
+ ccw_device_halt(ch2->cdev, (unsigned long) ch2);
 }
 
 /**
@@ -1556,7 +1550,7 @@
                                 spin_lock_irqsave(get_ccwdev_lock(ch->cdev),
                                                   saveflags);
                         rc = ccw_device_start(ch->cdev, &ch->ccw[3],
- (intparm_t) ch, 0xff, 0);
+ (unsigned long) ch, 0xff, 0);
                         if (event == CH_EVENT_TIMER)
                                 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev),
                                                        saveflags);
@@ -1956,23 +1950,36 @@
 {
         struct channel *ch;
         struct net_device *dev;
+ struct ctc_priv *priv;
+
+ /* Check for unsolicited interrupts. */
+ if (!cdev->dev.driver_data) {
+ printk(KERN_WARNING
+ "ctc: Got unsolicited irq: %s c-%02x d-%02x\n",
+ cdev->dev.bus_id, irb->scsw.cstat,
+ irb->scsw.dstat);
+ return;
+ }
         
+ priv = cdev->dev.driver_data;
         ch = (struct channel *) intparm;
- /**
- * Check for unsolicited interrupts.
- * If intparm is NULL, try to get channel from ccw_device.
- */
- if (ch == NULL) {
- ch = container_of(&cdev, struct channel, cdev);
- if (ch == NULL) {
- printk(KERN_WARNING
- "ctc: Got unsolicited irq: %s c-%02x d-%02x\n",
- cdev->dev.bus_id, irb->scsw.cstat,
- irb->scsw.dstat);
+ if ((ch != priv->channel[READ]) && (ch != priv->channel[WRITE]))
+ ch = NULL;
+
+ if (!ch) {
+ /* Try to extract channel from driver data. */
+ if (priv->channel[READ]->cdev == cdev)
+ ch = priv->channel[READ];
+ else if (priv->channel[WRITE]->cdev == cdev)
+ ch = priv->channel[READ];
+ else {
+ printk(KERN_ERR
+ "ctc: Can't determine channel for interrupt, "
+ "device %s\n", cdev->dev.bus_id);
                         return;
                 }
         }
-
+
         dev = (struct net_device *) (ch->netdev);
         if (dev == NULL) {
                 printk(KERN_CRIT
@@ -2342,7 +2349,7 @@
                 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
                 ch->prof.send_stamp = xtime;
                 rc = ccw_device_start(ch->cdev, &ch->ccw[ccw_idx],
- (intparm_t) ch, 0xff, 0);
+ (unsigned long) ch, 0xff, 0);
                 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
                 if (ccw_idx == 3)
                         ch->prof.doios_single++;
@@ -2401,7 +2408,6 @@
 static int
 ctc_close(struct net_device * dev)
 {
- SET_DEVICE_START(dev, 0);
         fsm_event(((struct ctc_priv *) dev->priv)->fsm, DEV_EVENT_STOP, dev);
         MOD_DEC_USE_COUNT;
         return 0;
@@ -2533,7 +2539,7 @@
         priv = dev->driver_data;
         if (!priv)
                 return -ENODEV;
- ndev = container_of((void *) priv, struct net_device, priv);
+ ndev = priv->channel[READ]->netdev;
         if (!ndev)
                 return -ENODEV;
         sscanf(buf, "%u", &bs1);
@@ -2755,7 +2761,6 @@
         dev->addr_len = 0;
         dev->type = ARPHRD_SLIP;
         dev->tx_queue_len = 100;
- SET_DEVICE_START(dev, 1);
         dev_init_buffers(dev);
         dev->flags = IFF_POINTOPOINT | IFF_NOARP;
         return dev;
@@ -2881,11 +2886,14 @@
         if (add_channel(cgdev->cdev[1], type))
                 return -ENOMEM;
 
+ ccw_device_set_online(cgdev->cdev[0]);
+ ccw_device_set_online(cgdev->cdev[1]);
+
         dev = ctc_init_netdevice(NULL, 1, privptr);
 
         if (!dev) {
                 printk(KERN_WARNING "ctc_init_netdevice failed\n");
- return -ENODEV;
+ goto out;
         }
 
         if (privptr->protocol == CTC_PROTO_LINUX_TTY)
@@ -2902,7 +2910,7 @@
                                 channel_free(privptr->channel[READ]);
 
                         ctc_free_netdevice(dev, 1);
- return -ENODEV;
+ goto out;
                 }
                 privptr->channel[direction]->netdev = dev;
                 privptr->channel[direction]->protocol = privptr->protocol;
@@ -2910,7 +2918,7 @@
         }
         if (ctc_netdev_register(dev) != 0) {
                 ctc_free_netdevice(dev, 1);
- return -ENODEV;
+ goto out;
         }
 
         ctc_add_attributes(&cgdev->dev);
@@ -2925,6 +2933,11 @@
                privptr->channel[WRITE]->id, privptr->protocol);
 
         return 0;
+out:
+ ccw_device_set_offline(cgdev->cdev[1]);
+ ccw_device_set_offline(cgdev->cdev[0]);
+
+ return -ENODEV;
 }
 
 /**
@@ -2944,7 +2957,7 @@
         priv = cgdev->dev.driver_data;
         if (!priv)
                 return -ENODEV;
- ndev = container_of((void *)priv, struct net_device, priv);
+ ndev = priv->channel[READ]->netdev;
 
         /* Close the device */
         ctc_close(ndev);
@@ -2961,6 +2974,9 @@
 
         kfree_fsm(priv->fsm);
 
+ ccw_device_set_offline(cgdev->cdev[1]);
+ ccw_device_set_offline(cgdev->cdev[0]);
+
         channel_remove(priv->channel[READ]);
         channel_remove(priv->channel[WRITE]);
         
diff -urN linux-2.5.59/drivers/s390/net/cu3088.c linux-2.5.59-s390/drivers/s390/net/cu3088.c
--- linux-2.5.59/drivers/s390/net/cu3088.c Fri Jan 17 03:21:51 2003
+++ linux-2.5.59-s390/drivers/s390/net/cu3088.c Mon Feb 3 20:49:13 2003
@@ -1,5 +1,5 @@
 /*
- * $Id: cu3088.c,v 1.22 2002/12/10 09:53:55 cohuck Exp $
+ * $Id: cu3088.c,v 1.26 2003/01/17 13:46:13 cohuck Exp $
  *
  * CTC / LCS ccw_device driver
  *
@@ -25,8 +25,6 @@
 
 #include <linux/init.h>
 #include <linux/module.h>
-#include <linux/device.h>
-#include <linux/slab.h>
 
 #include <asm/ccwdev.h>
 #include <asm/ccwgroup.h>
@@ -146,10 +144,8 @@
         if (rc)
                 return rc;
         rc = ccw_driver_register(&cu3088_driver);
- if (rc) {
+ if (rc)
                 device_unregister(&cu3088_root_dev);
- return rc;
- }
 
         return rc;
 }
@@ -168,5 +164,6 @@
 module_init(cu3088_init);
 module_exit(cu3088_exit);
 
+EXPORT_SYMBOL_GPL(cu3088_type);
 EXPORT_SYMBOL_GPL(register_cu3088_discipline);
 EXPORT_SYMBOL_GPL(unregister_cu3088_discipline);

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Fri Feb 07 2003 - 22:00:12 EST