aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/cio
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/s390/cio')
-rw-r--r--drivers/s390/cio/chsc.c16
-rw-r--r--drivers/s390/cio/cio.c4
-rw-r--r--drivers/s390/cio/css.c2
-rw-r--r--drivers/s390/cio/css.h8
-rw-r--r--drivers/s390/cio/device.c38
-rw-r--r--drivers/s390/cio/device.h1
-rw-r--r--drivers/s390/cio/device_fsm.c19
7 files changed, 40 insertions, 48 deletions
diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c
index 597c0c76a2ad..44a2ea40806e 100644
--- a/drivers/s390/cio/chsc.c
+++ b/drivers/s390/cio/chsc.c
@@ -132,7 +132,7 @@ static void terminate_internal_io(struct subchannel *sch)
132 device_set_intretry(sch); 132 device_set_intretry(sch);
133 /* Call handler. */ 133 /* Call handler. */
134 if (sch->driver && sch->driver->termination) 134 if (sch->driver && sch->driver->termination)
135 sch->driver->termination(&sch->dev); 135 sch->driver->termination(sch);
136} 136}
137 137
138static int 138static int
@@ -172,12 +172,12 @@ s390_subchannel_remove_chpid(struct device *dev, void *data)
172 terminate_internal_io(sch); 172 terminate_internal_io(sch);
173 /* Re-start path verification. */ 173 /* Re-start path verification. */
174 if (sch->driver && sch->driver->verify) 174 if (sch->driver && sch->driver->verify)
175 sch->driver->verify(&sch->dev); 175 sch->driver->verify(sch);
176 } 176 }
177 } else { 177 } else {
178 /* trigger path verification. */ 178 /* trigger path verification. */
179 if (sch->driver && sch->driver->verify) 179 if (sch->driver && sch->driver->verify)
180 sch->driver->verify(&sch->dev); 180 sch->driver->verify(sch);
181 else if (sch->lpm == mask) 181 else if (sch->lpm == mask)
182 goto out_unreg; 182 goto out_unreg;
183 } 183 }
@@ -279,7 +279,7 @@ __s390_process_res_acc(struct subchannel_id schid, void *data)
279 if (!old_lpm && sch->lpm) 279 if (!old_lpm && sch->lpm)
280 device_trigger_reprobe(sch); 280 device_trigger_reprobe(sch);
281 else if (sch->driver && sch->driver->verify) 281 else if (sch->driver && sch->driver->verify)
282 sch->driver->verify(&sch->dev); 282 sch->driver->verify(sch);
283out: 283out:
284 spin_unlock_irq(sch->lock); 284 spin_unlock_irq(sch->lock);
285 put_device(&sch->dev); 285 put_device(&sch->dev);
@@ -549,7 +549,7 @@ __chp_add(struct subchannel_id schid, void *data)
549 | mask) & sch->opm; 549 | mask) & sch->opm;
550 550
551 if (sch->driver && sch->driver->verify) 551 if (sch->driver && sch->driver->verify)
552 sch->driver->verify(&sch->dev); 552 sch->driver->verify(sch);
553 553
554 spin_unlock_irq(sch->lock); 554 spin_unlock_irq(sch->lock);
555 put_device(&sch->dev); 555 put_device(&sch->dev);
@@ -589,7 +589,7 @@ static void __s390_subchannel_vary_chpid(struct subchannel *sch,
589 if (!old_lpm) 589 if (!old_lpm)
590 device_trigger_reprobe(sch); 590 device_trigger_reprobe(sch);
591 else if (sch->driver && sch->driver->verify) 591 else if (sch->driver && sch->driver->verify)
592 sch->driver->verify(&sch->dev); 592 sch->driver->verify(sch);
593 break; 593 break;
594 } 594 }
595 sch->opm &= ~mask; 595 sch->opm &= ~mask;
@@ -603,13 +603,13 @@ static void __s390_subchannel_vary_chpid(struct subchannel *sch,
603 terminate_internal_io(sch); 603 terminate_internal_io(sch);
604 /* Re-start path verification. */ 604 /* Re-start path verification. */
605 if (sch->driver && sch->driver->verify) 605 if (sch->driver && sch->driver->verify)
606 sch->driver->verify(&sch->dev); 606 sch->driver->verify(sch);
607 } 607 }
608 } else if (!sch->lpm) { 608 } else if (!sch->lpm) {
609 if (device_trigger_verify(sch) != 0) 609 if (device_trigger_verify(sch) != 0)
610 css_schedule_eval(sch->schid); 610 css_schedule_eval(sch->schid);
611 } else if (sch->driver && sch->driver->verify) 611 } else if (sch->driver && sch->driver->verify)
612 sch->driver->verify(&sch->dev); 612 sch->driver->verify(sch);
613 break; 613 break;
614 } 614 }
615 spin_unlock_irqrestore(sch->lock, flags); 615 spin_unlock_irqrestore(sch->lock, flags);
diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c
index 46905345159e..469b00774c5e 100644
--- a/drivers/s390/cio/cio.c
+++ b/drivers/s390/cio/cio.c
@@ -147,7 +147,7 @@ cio_tpi(void)
147 spin_lock(sch->lock); 147 spin_lock(sch->lock);
148 memcpy (&sch->schib.scsw, &irb->scsw, sizeof (struct scsw)); 148 memcpy (&sch->schib.scsw, &irb->scsw, sizeof (struct scsw));
149 if (sch->driver && sch->driver->irq) 149 if (sch->driver && sch->driver->irq)
150 sch->driver->irq(&sch->dev); 150 sch->driver->irq(sch);
151 spin_unlock(sch->lock); 151 spin_unlock(sch->lock);
152 irq_exit (); 152 irq_exit ();
153 _local_bh_enable(); 153 _local_bh_enable();
@@ -680,7 +680,7 @@ do_IRQ (struct pt_regs *regs)
680 sizeof (irb->scsw)); 680 sizeof (irb->scsw));
681 /* Call interrupt handler if there is one. */ 681 /* Call interrupt handler if there is one. */
682 if (sch->driver && sch->driver->irq) 682 if (sch->driver && sch->driver->irq)
683 sch->driver->irq(&sch->dev); 683 sch->driver->irq(sch);
684 } 684 }
685 if (sch) 685 if (sch)
686 spin_unlock(sch->lock); 686 spin_unlock(sch->lock);
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c
index bc2f8fa576a3..614cc694184e 100644
--- a/drivers/s390/cio/css.c
+++ b/drivers/s390/cio/css.c
@@ -293,7 +293,7 @@ static int css_evaluate_known_subchannel(struct subchannel *sch, int slow)
293 action = UNREGISTER; 293 action = UNREGISTER;
294 if (sch->driver && sch->driver->notify) { 294 if (sch->driver && sch->driver->notify) {
295 spin_unlock_irqrestore(sch->lock, flags); 295 spin_unlock_irqrestore(sch->lock, flags);
296 ret = sch->driver->notify(&sch->dev, event); 296 ret = sch->driver->notify(sch, event);
297 spin_lock_irqsave(sch->lock, flags); 297 spin_lock_irqsave(sch->lock, flags);
298 if (ret) 298 if (ret)
299 action = NONE; 299 action = NONE;
diff --git a/drivers/s390/cio/css.h b/drivers/s390/cio/css.h
index 1d8306cc74c4..32acd24a407c 100644
--- a/drivers/s390/cio/css.h
+++ b/drivers/s390/cio/css.h
@@ -125,10 +125,10 @@ struct subchannel;
125struct css_driver { 125struct css_driver {
126 unsigned int subchannel_type; 126 unsigned int subchannel_type;
127 struct device_driver drv; 127 struct device_driver drv;
128 void (*irq)(struct device *); 128 void (*irq)(struct subchannel *);
129 int (*notify)(struct device *, int); 129 int (*notify)(struct subchannel *, int);
130 void (*verify)(struct device *); 130 void (*verify)(struct subchannel *);
131 void (*termination)(struct device *); 131 void (*termination)(struct subchannel *);
132 int (*probe)(struct subchannel *); 132 int (*probe)(struct subchannel *);
133 int (*remove)(struct subchannel *); 133 int (*remove)(struct subchannel *);
134 void (*shutdown)(struct subchannel *); 134 void (*shutdown)(struct subchannel *);
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c
index 74f6b539974a..000c64129ed8 100644
--- a/drivers/s390/cio/device.c
+++ b/drivers/s390/cio/device.c
@@ -115,11 +115,12 @@ static int ccw_uevent(struct device *dev, struct kobj_uevent_env *env)
115 115
116struct bus_type ccw_bus_type; 116struct bus_type ccw_bus_type;
117 117
118static int io_subchannel_probe (struct subchannel *); 118static void io_subchannel_irq(struct subchannel *);
119static int io_subchannel_remove (struct subchannel *); 119static int io_subchannel_probe(struct subchannel *);
120static int io_subchannel_notify(struct device *, int); 120static int io_subchannel_remove(struct subchannel *);
121static void io_subchannel_verify(struct device *); 121static int io_subchannel_notify(struct subchannel *, int);
122static void io_subchannel_ioterm(struct device *); 122static void io_subchannel_verify(struct subchannel *);
123static void io_subchannel_ioterm(struct subchannel *);
123static void io_subchannel_shutdown(struct subchannel *); 124static void io_subchannel_shutdown(struct subchannel *);
124 125
125static struct css_driver io_subchannel_driver = { 126static struct css_driver io_subchannel_driver = {
@@ -1096,6 +1097,18 @@ out:
1096 put_device(&cdev->dev); 1097 put_device(&cdev->dev);
1097} 1098}
1098 1099
1100static void io_subchannel_irq(struct subchannel *sch)
1101{
1102 struct ccw_device *cdev;
1103
1104 cdev = sch->dev.driver_data;
1105
1106 CIO_TRACE_EVENT(3, "IRQ");
1107 CIO_TRACE_EVENT(3, sch->dev.bus_id);
1108 if (cdev)
1109 dev_fsm_event(cdev, DEV_EVENT_INTERRUPT);
1110}
1111
1099static int 1112static int
1100io_subchannel_probe (struct subchannel *sch) 1113io_subchannel_probe (struct subchannel *sch)
1101{ 1114{
@@ -1183,12 +1196,11 @@ io_subchannel_remove (struct subchannel *sch)
1183 return 0; 1196 return 0;
1184} 1197}
1185 1198
1186static int 1199static int io_subchannel_notify(struct subchannel *sch, int event)
1187io_subchannel_notify(struct device *dev, int event)
1188{ 1200{
1189 struct ccw_device *cdev; 1201 struct ccw_device *cdev;
1190 1202
1191 cdev = dev->driver_data; 1203 cdev = sch->dev.driver_data;
1192 if (!cdev) 1204 if (!cdev)
1193 return 0; 1205 return 0;
1194 if (!cdev->drv) 1206 if (!cdev->drv)
@@ -1198,22 +1210,20 @@ io_subchannel_notify(struct device *dev, int event)
1198 return cdev->drv->notify ? cdev->drv->notify(cdev, event) : 0; 1210 return cdev->drv->notify ? cdev->drv->notify(cdev, event) : 0;
1199} 1211}
1200 1212
1201static void 1213static void io_subchannel_verify(struct subchannel *sch)
1202io_subchannel_verify(struct device *dev)
1203{ 1214{
1204 struct ccw_device *cdev; 1215 struct ccw_device *cdev;
1205 1216
1206 cdev = dev->driver_data; 1217 cdev = sch->dev.driver_data;
1207 if (cdev) 1218 if (cdev)
1208 dev_fsm_event(cdev, DEV_EVENT_VERIFY); 1219 dev_fsm_event(cdev, DEV_EVENT_VERIFY);
1209} 1220}
1210 1221
1211static void 1222static void io_subchannel_ioterm(struct subchannel *sch)
1212io_subchannel_ioterm(struct device *dev)
1213{ 1223{
1214 struct ccw_device *cdev; 1224 struct ccw_device *cdev;
1215 1225
1216 cdev = dev->driver_data; 1226 cdev = sch->dev.driver_data;
1217 if (!cdev) 1227 if (!cdev)
1218 return; 1228 return;
1219 /* Internal I/O will be retried by the interrupt handler. */ 1229 /* Internal I/O will be retried by the interrupt handler. */
diff --git a/drivers/s390/cio/device.h b/drivers/s390/cio/device.h
index 0d4089600439..6183731fb9a2 100644
--- a/drivers/s390/cio/device.h
+++ b/drivers/s390/cio/device.h
@@ -74,7 +74,6 @@ extern struct workqueue_struct *ccw_device_notify_work;
74extern wait_queue_head_t ccw_device_init_wq; 74extern wait_queue_head_t ccw_device_init_wq;
75extern atomic_t ccw_device_init_count; 75extern atomic_t ccw_device_init_count;
76 76
77void io_subchannel_irq (struct device *pdev);
78void io_subchannel_recog_done(struct ccw_device *cdev); 77void io_subchannel_recog_done(struct ccw_device *cdev);
79 78
80int ccw_device_cancel_halt_clear(struct ccw_device *); 79int ccw_device_cancel_halt_clear(struct ccw_device *);
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c
index 31c0f7885161..baca6c6c9855 100644
--- a/drivers/s390/cio/device_fsm.c
+++ b/drivers/s390/cio/device_fsm.c
@@ -399,7 +399,7 @@ ccw_device_oper_notify(struct work_struct *work)
399 sch = to_subchannel(cdev->dev.parent); 399 sch = to_subchannel(cdev->dev.parent);
400 if (sch->driver && sch->driver->notify) { 400 if (sch->driver && sch->driver->notify) {
401 spin_unlock_irqrestore(cdev->ccwlock, flags); 401 spin_unlock_irqrestore(cdev->ccwlock, flags);
402 ret = sch->driver->notify(&sch->dev, CIO_OPER); 402 ret = sch->driver->notify(sch, CIO_OPER);
403 spin_lock_irqsave(cdev->ccwlock, flags); 403 spin_lock_irqsave(cdev->ccwlock, flags);
404 } else 404 } else
405 ret = 0; 405 ret = 0;
@@ -1273,21 +1273,4 @@ fsm_func_t *dev_jumptable[NR_DEV_STATES][NR_DEV_EVENTS] = {
1273 }, 1273 },
1274}; 1274};
1275 1275
1276/*
1277 * io_subchannel_irq is called for "real" interrupts or for status
1278 * pending conditions on msch.
1279 */
1280void
1281io_subchannel_irq (struct device *pdev)
1282{
1283 struct ccw_device *cdev;
1284
1285 cdev = to_subchannel(pdev)->dev.driver_data;
1286
1287 CIO_TRACE_EVENT (3, "IRQ");
1288 CIO_TRACE_EVENT (3, pdev->bus_id);
1289 if (cdev)
1290 dev_fsm_event(cdev, DEV_EVENT_INTERRUPT);
1291}
1292
1293EXPORT_SYMBOL_GPL(ccw_device_set_timeout); 1276EXPORT_SYMBOL_GPL(ccw_device_set_timeout);