/*
* drivers/s390/cio/ccwgroup.c
* bus driver for ccwgroup
- * $Revision: 1.15 $
+ * $Revision: 1.17 $
*
* Copyright (C) 2002 IBM Deutschland Entwicklung GmbH,
* IBM Corporation
for (i = 0; i < gdev->count; i++) {
sprintf(str, "cdev%d", i);
sysfs_remove_link(&gdev->dev.kobj, str);
- /* Hack: Make sure we act on still valid subdirs. */
- if (atomic_read(&gdev->cdev[i]->dev.kobj.dentry->d_count))
- sysfs_remove_link(&gdev->cdev[i]->dev.kobj,
- "group_device");
+ sysfs_remove_link(&gdev->cdev[i]->dev.kobj, "group_device");
}
}
.dev = {
.bus = &ccwgroup_bus_type,
.parent = root,
- .release = &ccwgroup_release,
+ .release = ccwgroup_release,
},
};
/*
* drivers/s390/cio/chsc.c
* S/390 common I/O routines -- channel subsystem call
- * $Revision: 1.77 $
+ * $Revision: 1.78 $
*
* Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH,
* IBM Corporation
static DEVICE_ATTR(status, 0644, chp_status_show, chp_status_write);
+
+static void
+chp_release(struct device *dev)
+{
+}
+
/*
* Entries for chpids on the system bus.
* This replaces /proc/chpids.
/* fill in status, etc. */
chp->id = chpid;
chp->state = status;
- chp->dev.parent = &css_bus_device;
-
+ chp->dev = (struct device) {
+ .parent = &css_bus_device,
+ .release = chp_release,
+ };
snprintf(chp->dev.bus_id, BUS_ID_SIZE, "chp0.%x", chpid);
/* make it known to the system */
}
static inline int
-__ccw_device_retry_loop(struct ccw_device *cdev, struct ccw1 *ccw, long magic,
- unsigned long flags)
+__ccw_device_retry_loop(struct ccw_device *cdev, struct ccw1 *ccw, long magic)
{
int ret;
struct subchannel *sch;
ret = cio_start (sch, ccw, magic, 0);
if ((ret == -EBUSY) || (ret == -EACCES)) {
/* Try again later. */
+ spin_unlock_irq(&sch->lock);
schedule_timeout(1);
+ spin_lock_irq(&sch->lock);
continue;
}
if (ret != 0)
break;
/* Wait for end of request. */
cdev->private->intparm = magic;
- spin_unlock_irqrestore(&sch->lock, flags);
+ spin_unlock_irq(&sch->lock);
wait_event(cdev->private->wait_q,
(cdev->private->intparm == -EIO) ||
(cdev->private->intparm == -EAGAIN) ||
(cdev->private->intparm == 0));
- spin_lock_irqsave(&sch->lock, flags);
+ spin_lock_irq(&sch->lock);
/* Check at least for channel end / device end */
if (cdev->private->intparm == -EIO) {
/* Non-retryable error. */
/* Success. */
break;
/* Try again later. */
+ spin_unlock_irq(&sch->lock);
schedule_timeout(1);
+ spin_lock_irq(&sch->lock);
} while (1);
return ret;
{
void (*handler)(struct ccw_device *, unsigned long, struct irb *);
char dbf_txt[15];
- unsigned long flags;
struct subchannel *sch;
int ret;
struct ccw1 *rdc_ccw;
return ret;
}
- spin_lock_irqsave(&sch->lock, flags);
+ spin_lock_irq(&sch->lock);
/* Save interrupt handler. */
handler = cdev->handler;
/* Temporarily install own handler. */
ret = -EBUSY;
else
/* 0x00D9C4C3 == ebcdic "RDC" */
- ret = __ccw_device_retry_loop(cdev, rdc_ccw, 0x00D9C4C3, flags);
+ ret = __ccw_device_retry_loop(cdev, rdc_ccw, 0x00D9C4C3);
/* Restore interrupt handler. */
cdev->handler = handler;
- spin_unlock_irqrestore(&sch->lock, flags);
+ spin_unlock_irq(&sch->lock);
clear_normalized_cda (rdc_ccw);
kfree(rdc_ccw);
char dbf_txt[15];
struct subchannel *sch;
struct ciw *ciw;
- unsigned long flags;
char *rcd_buf;
int ret;
struct ccw1 *rcd_ccw;
rcd_ccw->count = ciw->count;
rcd_ccw->flags = CCW_FLAG_SLI;
- spin_lock_irqsave(&sch->lock, flags);
+ spin_lock_irq(&sch->lock);
/* Save interrupt handler. */
handler = cdev->handler;
/* Temporarily install own handler. */
ret = -EBUSY;
else
/* 0x00D9C3C4 == ebcdic "RCD" */
- ret = __ccw_device_retry_loop(cdev, rcd_ccw, 0x00D9C3C4, flags);
+ ret = __ccw_device_retry_loop(cdev, rcd_ccw, 0x00D9C3C4);
/* Restore interrupt handler. */
cdev->handler = handler;
- spin_unlock_irqrestore(&sch->lock, flags);
+ spin_unlock_irq(&sch->lock);
/*
* on success we update the user input parms