aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/s390')
-rw-r--r--drivers/s390/block/dasd.c1
-rw-r--r--drivers/s390/block/dasd_diag.c2
-rw-r--r--drivers/s390/char/ctrlchar.c2
-rw-r--r--drivers/s390/char/keyboard.c2
-rw-r--r--drivers/s390/char/monwriter.c24
-rw-r--r--drivers/s390/char/sclp.c4
-rw-r--r--drivers/s390/cio/chsc.c48
-rw-r--r--drivers/s390/cio/cio.c10
-rw-r--r--drivers/s390/cio/css.c2
-rw-r--r--drivers/s390/cio/css.h7
-rw-r--r--drivers/s390/cio/device.c48
-rw-r--r--drivers/s390/cio/device.h1
-rw-r--r--drivers/s390/cio/device_fsm.c119
-rw-r--r--drivers/s390/cio/device_id.c14
-rw-r--r--drivers/s390/cio/device_ops.c20
-rw-r--r--drivers/s390/cio/device_pgid.c31
-rw-r--r--drivers/s390/cio/device_status.c7
-rw-r--r--drivers/s390/cio/qdio.c12
-rw-r--r--drivers/s390/crypto/ap_bus.c25
-rw-r--r--drivers/s390/net/iucv.c4
-rw-r--r--drivers/s390/scsi/zfcp_erp.c2
21 files changed, 183 insertions, 202 deletions
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c
index d0647d116eaa..79ffef6bfaf8 100644
--- a/drivers/s390/block/dasd.c
+++ b/drivers/s390/block/dasd.c
@@ -203,6 +203,7 @@ dasd_state_basic_to_known(struct dasd_device * device)
203 rc = dasd_flush_ccw_queue(device, 1); 203 rc = dasd_flush_ccw_queue(device, 1);
204 if (rc) 204 if (rc)
205 return rc; 205 return rc;
206 dasd_clear_timer(device);
206 207
207 DBF_DEV_EVENT(DBF_EMERG, device, "%p debug area deleted", device); 208 DBF_DEV_EVENT(DBF_EMERG, device, "%p debug area deleted", device);
208 if (device->debug_area != NULL) { 209 if (device->debug_area != NULL) {
diff --git a/drivers/s390/block/dasd_diag.c b/drivers/s390/block/dasd_diag.c
index 222a8a71a5e8..53db58a68617 100644
--- a/drivers/s390/block/dasd_diag.c
+++ b/drivers/s390/block/dasd_diag.c
@@ -218,7 +218,7 @@ dasd_diag_term_IO(struct dasd_ccw_req * cqr)
218 218
219/* Handle external interruption. */ 219/* Handle external interruption. */
220static void 220static void
221dasd_ext_handler(struct pt_regs *regs, __u16 code) 221dasd_ext_handler(__u16 code)
222{ 222{
223 struct dasd_ccw_req *cqr, *next; 223 struct dasd_ccw_req *cqr, *next;
224 struct dasd_device *device; 224 struct dasd_device *device;
diff --git a/drivers/s390/char/ctrlchar.c b/drivers/s390/char/ctrlchar.c
index d83eb6358bac..49e9628d9297 100644
--- a/drivers/s390/char/ctrlchar.c
+++ b/drivers/s390/char/ctrlchar.c
@@ -20,7 +20,7 @@ static int ctrlchar_sysrq_key;
20static void 20static void
21ctrlchar_handle_sysrq(void *tty) 21ctrlchar_handle_sysrq(void *tty)
22{ 22{
23 handle_sysrq(ctrlchar_sysrq_key, NULL, (struct tty_struct *) tty); 23 handle_sysrq(ctrlchar_sysrq_key, (struct tty_struct *) tty);
24} 24}
25 25
26static DECLARE_WORK(ctrlchar_work, ctrlchar_handle_sysrq, NULL); 26static DECLARE_WORK(ctrlchar_work, ctrlchar_handle_sysrq, NULL);
diff --git a/drivers/s390/char/keyboard.c b/drivers/s390/char/keyboard.c
index 3be06569180d..e3491a5f5219 100644
--- a/drivers/s390/char/keyboard.c
+++ b/drivers/s390/char/keyboard.c
@@ -304,7 +304,7 @@ kbd_keycode(struct kbd_data *kbd, unsigned int keycode)
304 if (kbd->sysrq) { 304 if (kbd->sysrq) {
305 if (kbd->sysrq == K(KT_LATIN, '-')) { 305 if (kbd->sysrq == K(KT_LATIN, '-')) {
306 kbd->sysrq = 0; 306 kbd->sysrq = 0;
307 handle_sysrq(value, NULL, kbd->tty); 307 handle_sysrq(value, kbd->tty);
308 return; 308 return;
309 } 309 }
310 if (value == '-') { 310 if (value == '-') {
diff --git a/drivers/s390/char/monwriter.c b/drivers/s390/char/monwriter.c
index 1e3939aeb8ab..b9b0fc3f812b 100644
--- a/drivers/s390/char/monwriter.c
+++ b/drivers/s390/char/monwriter.c
@@ -26,6 +26,7 @@
26#define MONWRITE_MAX_DATALEN 4024 26#define MONWRITE_MAX_DATALEN 4024
27 27
28static int mon_max_bufs = 255; 28static int mon_max_bufs = 255;
29static int mon_buf_count;
29 30
30struct mon_buf { 31struct mon_buf {
31 struct list_head list; 32 struct list_head list;
@@ -40,7 +41,6 @@ struct mon_private {
40 size_t hdr_to_read; 41 size_t hdr_to_read;
41 size_t data_to_read; 42 size_t data_to_read;
42 struct mon_buf *current_buf; 43 struct mon_buf *current_buf;
43 int mon_buf_count;
44}; 44};
45 45
46/* 46/*
@@ -73,12 +73,15 @@ static inline struct mon_buf *monwrite_find_hdr(struct mon_private *monpriv,
73 struct mon_buf *entry, *next; 73 struct mon_buf *entry, *next;
74 74
75 list_for_each_entry_safe(entry, next, &monpriv->list, list) 75 list_for_each_entry_safe(entry, next, &monpriv->list, list)
76 if (entry->hdr.applid == monhdr->applid && 76 if ((entry->hdr.mon_function == monhdr->mon_function ||
77 monhdr->mon_function == MONWRITE_STOP_INTERVAL) &&
78 entry->hdr.applid == monhdr->applid &&
77 entry->hdr.record_num == monhdr->record_num && 79 entry->hdr.record_num == monhdr->record_num &&
78 entry->hdr.version == monhdr->version && 80 entry->hdr.version == monhdr->version &&
79 entry->hdr.release == monhdr->release && 81 entry->hdr.release == monhdr->release &&
80 entry->hdr.mod_level == monhdr->mod_level) 82 entry->hdr.mod_level == monhdr->mod_level)
81 return entry; 83 return entry;
84
82 return NULL; 85 return NULL;
83} 86}
84 87
@@ -92,25 +95,27 @@ static int monwrite_new_hdr(struct mon_private *monpriv)
92 monhdr->mon_function > MONWRITE_START_CONFIG || 95 monhdr->mon_function > MONWRITE_START_CONFIG ||
93 monhdr->hdrlen != sizeof(struct monwrite_hdr)) 96 monhdr->hdrlen != sizeof(struct monwrite_hdr))
94 return -EINVAL; 97 return -EINVAL;
95 monbuf = monwrite_find_hdr(monpriv, monhdr); 98 monbuf = NULL;
99 if (monhdr->mon_function != MONWRITE_GEN_EVENT)
100 monbuf = monwrite_find_hdr(monpriv, monhdr);
96 if (monbuf) { 101 if (monbuf) {
97 if (monhdr->mon_function == MONWRITE_STOP_INTERVAL) { 102 if (monhdr->mon_function == MONWRITE_STOP_INTERVAL) {
98 monhdr->datalen = monbuf->hdr.datalen; 103 monhdr->datalen = monbuf->hdr.datalen;
99 rc = monwrite_diag(monhdr, monbuf->data, 104 rc = monwrite_diag(monhdr, monbuf->data,
100 APPLDATA_STOP_REC); 105 APPLDATA_STOP_REC);
101 list_del(&monbuf->list); 106 list_del(&monbuf->list);
102 monpriv->mon_buf_count--; 107 mon_buf_count--;
103 kfree(monbuf->data); 108 kfree(monbuf->data);
104 kfree(monbuf); 109 kfree(monbuf);
105 monbuf = NULL; 110 monbuf = NULL;
106 } 111 }
107 } else { 112 } else if (monhdr->mon_function != MONWRITE_STOP_INTERVAL) {
108 if (monpriv->mon_buf_count >= mon_max_bufs) 113 if (mon_buf_count >= mon_max_bufs)
109 return -ENOSPC; 114 return -ENOSPC;
110 monbuf = kzalloc(sizeof(struct mon_buf), GFP_KERNEL); 115 monbuf = kzalloc(sizeof(struct mon_buf), GFP_KERNEL);
111 if (!monbuf) 116 if (!monbuf)
112 return -ENOMEM; 117 return -ENOMEM;
113 monbuf->data = kzalloc(monbuf->hdr.datalen, 118 monbuf->data = kzalloc(monhdr->datalen,
114 GFP_KERNEL | GFP_DMA); 119 GFP_KERNEL | GFP_DMA);
115 if (!monbuf->data) { 120 if (!monbuf->data) {
116 kfree(monbuf); 121 kfree(monbuf);
@@ -118,7 +123,8 @@ static int monwrite_new_hdr(struct mon_private *monpriv)
118 } 123 }
119 monbuf->hdr = *monhdr; 124 monbuf->hdr = *monhdr;
120 list_add_tail(&monbuf->list, &monpriv->list); 125 list_add_tail(&monbuf->list, &monpriv->list);
121 monpriv->mon_buf_count++; 126 if (monhdr->mon_function != MONWRITE_GEN_EVENT)
127 mon_buf_count++;
122 } 128 }
123 monpriv->current_buf = monbuf; 129 monpriv->current_buf = monbuf;
124 return 0; 130 return 0;
@@ -186,7 +192,7 @@ static int monwrite_close(struct inode *inode, struct file *filp)
186 if (entry->hdr.mon_function != MONWRITE_GEN_EVENT) 192 if (entry->hdr.mon_function != MONWRITE_GEN_EVENT)
187 monwrite_diag(&entry->hdr, entry->data, 193 monwrite_diag(&entry->hdr, entry->data,
188 APPLDATA_STOP_REC); 194 APPLDATA_STOP_REC);
189 monpriv->mon_buf_count--; 195 mon_buf_count--;
190 list_del(&entry->list); 196 list_del(&entry->list);
191 kfree(entry->data); 197 kfree(entry->data);
192 kfree(entry); 198 kfree(entry);
diff --git a/drivers/s390/char/sclp.c b/drivers/s390/char/sclp.c
index 31e335751d6d..8a056df09d6b 100644
--- a/drivers/s390/char/sclp.c
+++ b/drivers/s390/char/sclp.c
@@ -324,7 +324,7 @@ __sclp_find_req(u32 sccb)
324 * Prepare read event data request if necessary. Start processing of next 324 * Prepare read event data request if necessary. Start processing of next
325 * request on queue. */ 325 * request on queue. */
326static void 326static void
327sclp_interrupt_handler(struct pt_regs *regs, __u16 code) 327sclp_interrupt_handler(__u16 code)
328{ 328{
329 struct sclp_req *req; 329 struct sclp_req *req;
330 u32 finished_sccb; 330 u32 finished_sccb;
@@ -743,7 +743,7 @@ EXPORT_SYMBOL(sclp_reactivate);
743/* Handler for external interruption used during initialization. Modify 743/* Handler for external interruption used during initialization. Modify
744 * request state to done. */ 744 * request state to done. */
745static void 745static void
746sclp_check_handler(struct pt_regs *regs, __u16 code) 746sclp_check_handler(__u16 code)
747{ 747{
748 u32 finished_sccb; 748 u32 finished_sccb;
749 749
diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c
index 3bb4e472d73d..2d78f0f4a40f 100644
--- a/drivers/s390/cio/chsc.c
+++ b/drivers/s390/cio/chsc.c
@@ -200,11 +200,13 @@ css_get_ssd_info(struct subchannel *sch)
200 spin_unlock_irq(&sch->lock); 200 spin_unlock_irq(&sch->lock);
201 free_page((unsigned long)page); 201 free_page((unsigned long)page);
202 if (!ret) { 202 if (!ret) {
203 int j, chpid; 203 int j, chpid, mask;
204 /* Allocate channel path structures, if needed. */ 204 /* Allocate channel path structures, if needed. */
205 for (j = 0; j < 8; j++) { 205 for (j = 0; j < 8; j++) {
206 mask = 0x80 >> j;
206 chpid = sch->ssd_info.chpid[j]; 207 chpid = sch->ssd_info.chpid[j];
207 if (chpid && (get_chp_status(chpid) < 0)) 208 if ((sch->schib.pmcw.pim & mask) &&
209 (get_chp_status(chpid) < 0))
208 new_channel_path(chpid); 210 new_channel_path(chpid);
209 } 211 }
210 } 212 }
@@ -222,13 +224,15 @@ s390_subchannel_remove_chpid(struct device *dev, void *data)
222 224
223 sch = to_subchannel(dev); 225 sch = to_subchannel(dev);
224 chpid = data; 226 chpid = data;
225 for (j = 0; j < 8; j++) 227 for (j = 0; j < 8; j++) {
226 if (sch->schib.pmcw.chpid[j] == chpid->id) 228 mask = 0x80 >> j;
229 if ((sch->schib.pmcw.pim & mask) &&
230 (sch->schib.pmcw.chpid[j] == chpid->id))
227 break; 231 break;
232 }
228 if (j >= 8) 233 if (j >= 8)
229 return 0; 234 return 0;
230 235
231 mask = 0x80 >> j;
232 spin_lock_irq(&sch->lock); 236 spin_lock_irq(&sch->lock);
233 237
234 stsch(sch->schid, &schib); 238 stsch(sch->schid, &schib);
@@ -366,7 +370,7 @@ __s390_process_res_acc(struct subchannel_id schid, void *data)
366 struct res_acc_data *res_data; 370 struct res_acc_data *res_data;
367 struct subchannel *sch; 371 struct subchannel *sch;
368 372
369 res_data = (struct res_acc_data *)data; 373 res_data = data;
370 sch = get_subchannel_by_schid(schid); 374 sch = get_subchannel_by_schid(schid);
371 if (!sch) 375 if (!sch)
372 /* Check if a subchannel is newly available. */ 376 /* Check if a subchannel is newly available. */
@@ -440,7 +444,7 @@ __get_chpid_from_lir(void *data)
440 u32 isinfo[28]; 444 u32 isinfo[28];
441 } *lir; 445 } *lir;
442 446
443 lir = (struct lir*) data; 447 lir = data;
444 if (!(lir->iq&0x80)) 448 if (!(lir->iq&0x80))
445 /* NULL link incident record */ 449 /* NULL link incident record */
446 return -EINVAL; 450 return -EINVAL;
@@ -620,18 +624,20 @@ __chp_add_new_sch(struct subchannel_id schid)
620static int 624static int
621__chp_add(struct subchannel_id schid, void *data) 625__chp_add(struct subchannel_id schid, void *data)
622{ 626{
623 int i; 627 int i, mask;
624 struct channel_path *chp; 628 struct channel_path *chp;
625 struct subchannel *sch; 629 struct subchannel *sch;
626 630
627 chp = (struct channel_path *)data; 631 chp = data;
628 sch = get_subchannel_by_schid(schid); 632 sch = get_subchannel_by_schid(schid);
629 if (!sch) 633 if (!sch)
630 /* Check if the subchannel is now available. */ 634 /* Check if the subchannel is now available. */
631 return __chp_add_new_sch(schid); 635 return __chp_add_new_sch(schid);
632 spin_lock_irq(&sch->lock); 636 spin_lock_irq(&sch->lock);
633 for (i=0; i<8; i++) 637 for (i=0; i<8; i++) {
634 if (sch->schib.pmcw.chpid[i] == chp->id) { 638 mask = 0x80 >> i;
639 if ((sch->schib.pmcw.pim & mask) &&
640 (sch->schib.pmcw.chpid[i] == chp->id)) {
635 if (stsch(sch->schid, &sch->schib) != 0) { 641 if (stsch(sch->schid, &sch->schib) != 0) {
636 /* Endgame. */ 642 /* Endgame. */
637 spin_unlock_irq(&sch->lock); 643 spin_unlock_irq(&sch->lock);
@@ -639,6 +645,7 @@ __chp_add(struct subchannel_id schid, void *data)
639 } 645 }
640 break; 646 break;
641 } 647 }
648 }
642 if (i==8) { 649 if (i==8) {
643 spin_unlock_irq(&sch->lock); 650 spin_unlock_irq(&sch->lock);
644 return 0; 651 return 0;
@@ -646,7 +653,7 @@ __chp_add(struct subchannel_id schid, void *data)
646 sch->lpm = ((sch->schib.pmcw.pim & 653 sch->lpm = ((sch->schib.pmcw.pim &
647 sch->schib.pmcw.pam & 654 sch->schib.pmcw.pam &
648 sch->schib.pmcw.pom) 655 sch->schib.pmcw.pom)
649 | 0x80 >> i) & sch->opm; 656 | mask) & sch->opm;
650 657
651 if (sch->driver && sch->driver->verify) 658 if (sch->driver && sch->driver->verify)
652 sch->driver->verify(&sch->dev); 659 sch->driver->verify(&sch->dev);
@@ -700,8 +707,7 @@ chp_process_crw(int chpid, int on)
700 return chp_add(chpid); 707 return chp_add(chpid);
701} 708}
702 709
703static inline int 710static inline int check_for_io_on_path(struct subchannel *sch, int index)
704__check_for_io_and_kill(struct subchannel *sch, int index)
705{ 711{
706 int cc; 712 int cc;
707 713
@@ -711,10 +717,8 @@ __check_for_io_and_kill(struct subchannel *sch, int index)
711 cc = stsch(sch->schid, &sch->schib); 717 cc = stsch(sch->schid, &sch->schib);
712 if (cc) 718 if (cc)
713 return 0; 719 return 0;
714 if (sch->schib.scsw.actl && sch->schib.pmcw.lpum == (0x80 >> index)) { 720 if (sch->schib.scsw.actl && sch->schib.pmcw.lpum == (0x80 >> index))
715 device_set_waiting(sch);
716 return 1; 721 return 1;
717 }
718 return 0; 722 return 0;
719} 723}
720 724
@@ -743,12 +747,10 @@ __s390_subchannel_vary_chpid(struct subchannel *sch, __u8 chpid, int on)
743 } else { 747 } else {
744 sch->opm &= ~(0x80 >> chp); 748 sch->opm &= ~(0x80 >> chp);
745 sch->lpm &= ~(0x80 >> chp); 749 sch->lpm &= ~(0x80 >> chp);
746 /* 750 if (check_for_io_on_path(sch, chp))
747 * Give running I/O a grace period in which it 751 /* Path verification is done after killing. */
748 * can successfully terminate, even using the 752 device_kill_io(sch);
749 * just varied off path. Then kill it. 753 else if (!sch->lpm) {
750 */
751 if (!__check_for_io_and_kill(sch, chp) && !sch->lpm) {
752 if (css_enqueue_subchannel_slow(sch->schid)) { 754 if (css_enqueue_subchannel_slow(sch->schid)) {
753 css_clear_subchannel_slow_list(); 755 css_clear_subchannel_slow_list();
754 need_rescan = 1; 756 need_rescan = 1;
diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c
index 2e2882daefbb..8936e460a807 100644
--- a/drivers/s390/cio/cio.c
+++ b/drivers/s390/cio/cio.c
@@ -19,6 +19,7 @@
19#include <asm/cio.h> 19#include <asm/cio.h>
20#include <asm/delay.h> 20#include <asm/delay.h>
21#include <asm/irq.h> 21#include <asm/irq.h>
22#include <asm/irq_regs.h>
22#include <asm/setup.h> 23#include <asm/setup.h>
23#include "airq.h" 24#include "airq.h"
24#include "cio.h" 25#include "cio.h"
@@ -606,15 +607,17 @@ do_IRQ (struct pt_regs *regs)
606 struct tpi_info *tpi_info; 607 struct tpi_info *tpi_info;
607 struct subchannel *sch; 608 struct subchannel *sch;
608 struct irb *irb; 609 struct irb *irb;
610 struct pt_regs *old_regs;
609 611
610 irq_enter (); 612 old_regs = set_irq_regs(regs);
613 irq_enter();
611 asm volatile ("mc 0,0"); 614 asm volatile ("mc 0,0");
612 if (S390_lowcore.int_clock >= S390_lowcore.jiffy_timer) 615 if (S390_lowcore.int_clock >= S390_lowcore.jiffy_timer)
613 /** 616 /**
614 * Make sure that the i/o interrupt did not "overtake" 617 * Make sure that the i/o interrupt did not "overtake"
615 * the last HZ timer interrupt. 618 * the last HZ timer interrupt.
616 */ 619 */
617 account_ticks(regs); 620 account_ticks();
618 /* 621 /*
619 * Get interrupt information from lowcore 622 * Get interrupt information from lowcore
620 */ 623 */
@@ -652,7 +655,8 @@ do_IRQ (struct pt_regs *regs)
652 * out of the sie which costs more cycles than it saves. 655 * out of the sie which costs more cycles than it saves.
653 */ 656 */
654 } while (!MACHINE_IS_VM && tpi (NULL) != 0); 657 } while (!MACHINE_IS_VM && tpi (NULL) != 0);
655 irq_exit (); 658 irq_exit();
659 set_irq_regs(old_regs);
656} 660}
657 661
658#ifdef CONFIG_CCW_CONSOLE 662#ifdef CONFIG_CCW_CONSOLE
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c
index 7086a74e9871..a2dee5bf5a17 100644
--- a/drivers/s390/cio/css.c
+++ b/drivers/s390/cio/css.c
@@ -177,7 +177,7 @@ get_subchannel_by_schid(struct subchannel_id schid)
177 struct device *dev; 177 struct device *dev;
178 178
179 dev = bus_find_device(&css_bus_type, NULL, 179 dev = bus_find_device(&css_bus_type, NULL,
180 (void *)&schid, check_subchannel); 180 &schid, check_subchannel);
181 181
182 return dev ? to_subchannel(dev) : NULL; 182 return dev ? to_subchannel(dev) : NULL;
183} 183}
diff --git a/drivers/s390/cio/css.h b/drivers/s390/cio/css.h
index 8aabb4adeb5f..4c2ff8336288 100644
--- a/drivers/s390/cio/css.h
+++ b/drivers/s390/cio/css.h
@@ -76,9 +76,8 @@ struct ccw_device_private {
76 int state; /* device state */ 76 int state; /* device state */
77 atomic_t onoff; 77 atomic_t onoff;
78 unsigned long registered; 78 unsigned long registered;
79 __u16 devno; /* device number */ 79 struct ccw_dev_id dev_id; /* device id */
80 __u16 sch_no; /* subchannel number */ 80 struct subchannel_id schid; /* subchannel number */
81 __u8 ssid; /* subchannel set id */
82 __u8 imask; /* lpm mask for SNID/SID/SPGID */ 81 __u8 imask; /* lpm mask for SNID/SID/SPGID */
83 int iretry; /* retry counter SNID/SID/SPGID */ 82 int iretry; /* retry counter SNID/SID/SPGID */
84 struct { 83 struct {
@@ -171,7 +170,7 @@ void device_trigger_reprobe(struct subchannel *);
171 170
172/* Helper functions for vary on/off. */ 171/* Helper functions for vary on/off. */
173int device_is_online(struct subchannel *); 172int device_is_online(struct subchannel *);
174void device_set_waiting(struct subchannel *); 173void device_kill_io(struct subchannel *);
175 174
176/* Machine check helper function. */ 175/* Machine check helper function. */
177void device_kill_pending_timer(struct subchannel *); 176void device_kill_pending_timer(struct subchannel *);
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c
index 688945662c15..94bdd4d8a4c9 100644
--- a/drivers/s390/cio/device.c
+++ b/drivers/s390/cio/device.c
@@ -552,21 +552,19 @@ ccw_device_register(struct ccw_device *cdev)
552} 552}
553 553
554struct match_data { 554struct match_data {
555 unsigned int devno; 555 struct ccw_dev_id dev_id;
556 unsigned int ssid;
557 struct ccw_device * sibling; 556 struct ccw_device * sibling;
558}; 557};
559 558
560static int 559static int
561match_devno(struct device * dev, void * data) 560match_devno(struct device * dev, void * data)
562{ 561{
563 struct match_data * d = (struct match_data *)data; 562 struct match_data * d = data;
564 struct ccw_device * cdev; 563 struct ccw_device * cdev;
565 564
566 cdev = to_ccwdev(dev); 565 cdev = to_ccwdev(dev);
567 if ((cdev->private->state == DEV_STATE_DISCONNECTED) && 566 if ((cdev->private->state == DEV_STATE_DISCONNECTED) &&
568 (cdev->private->devno == d->devno) && 567 ccw_dev_id_is_equal(&cdev->private->dev_id, &d->dev_id) &&
569 (cdev->private->ssid == d->ssid) &&
570 (cdev != d->sibling)) { 568 (cdev != d->sibling)) {
571 cdev->private->state = DEV_STATE_NOT_OPER; 569 cdev->private->state = DEV_STATE_NOT_OPER;
572 return 1; 570 return 1;
@@ -574,15 +572,13 @@ match_devno(struct device * dev, void * data)
574 return 0; 572 return 0;
575} 573}
576 574
577static struct ccw_device * 575static struct ccw_device * get_disc_ccwdev_by_dev_id(struct ccw_dev_id *dev_id,
578get_disc_ccwdev_by_devno(unsigned int devno, unsigned int ssid, 576 struct ccw_device *sibling)
579 struct ccw_device *sibling)
580{ 577{
581 struct device *dev; 578 struct device *dev;
582 struct match_data data; 579 struct match_data data;
583 580
584 data.devno = devno; 581 data.dev_id = *dev_id;
585 data.ssid = ssid;
586 data.sibling = sibling; 582 data.sibling = sibling;
587 dev = bus_find_device(&ccw_bus_type, NULL, &data, match_devno); 583 dev = bus_find_device(&ccw_bus_type, NULL, &data, match_devno);
588 584
@@ -595,7 +591,7 @@ ccw_device_add_changed(void *data)
595 591
596 struct ccw_device *cdev; 592 struct ccw_device *cdev;
597 593
598 cdev = (struct ccw_device *)data; 594 cdev = data;
599 if (device_add(&cdev->dev)) { 595 if (device_add(&cdev->dev)) {
600 put_device(&cdev->dev); 596 put_device(&cdev->dev);
601 return; 597 return;
@@ -616,9 +612,9 @@ ccw_device_do_unreg_rereg(void *data)
616 struct subchannel *sch; 612 struct subchannel *sch;
617 int need_rename; 613 int need_rename;
618 614
619 cdev = (struct ccw_device *)data; 615 cdev = data;
620 sch = to_subchannel(cdev->dev.parent); 616 sch = to_subchannel(cdev->dev.parent);
621 if (cdev->private->devno != sch->schib.pmcw.dev) { 617 if (cdev->private->dev_id.devno != sch->schib.pmcw.dev) {
622 /* 618 /*
623 * The device number has changed. This is usually only when 619 * The device number has changed. This is usually only when
624 * a device has been detached under VM and then re-appeared 620 * a device has been detached under VM and then re-appeared
@@ -633,10 +629,12 @@ ccw_device_do_unreg_rereg(void *data)
633 * get possibly sick... 629 * get possibly sick...
634 */ 630 */
635 struct ccw_device *other_cdev; 631 struct ccw_device *other_cdev;
632 struct ccw_dev_id dev_id;
636 633
637 need_rename = 1; 634 need_rename = 1;
638 other_cdev = get_disc_ccwdev_by_devno(sch->schib.pmcw.dev, 635 dev_id.devno = sch->schib.pmcw.dev;
639 sch->schid.ssid, cdev); 636 dev_id.ssid = sch->schid.ssid;
637 other_cdev = get_disc_ccwdev_by_dev_id(&dev_id, cdev);
640 if (other_cdev) { 638 if (other_cdev) {
641 struct subchannel *other_sch; 639 struct subchannel *other_sch;
642 640
@@ -652,7 +650,7 @@ ccw_device_do_unreg_rereg(void *data)
652 } 650 }
653 /* Update ssd info here. */ 651 /* Update ssd info here. */
654 css_get_ssd_info(sch); 652 css_get_ssd_info(sch);
655 cdev->private->devno = sch->schib.pmcw.dev; 653 cdev->private->dev_id.devno = sch->schib.pmcw.dev;
656 } else 654 } else
657 need_rename = 0; 655 need_rename = 0;
658 device_remove_files(&cdev->dev); 656 device_remove_files(&cdev->dev);
@@ -662,7 +660,7 @@ ccw_device_do_unreg_rereg(void *data)
662 snprintf (cdev->dev.bus_id, BUS_ID_SIZE, "0.%x.%04x", 660 snprintf (cdev->dev.bus_id, BUS_ID_SIZE, "0.%x.%04x",
663 sch->schid.ssid, sch->schib.pmcw.dev); 661 sch->schid.ssid, sch->schib.pmcw.dev);
664 PREPARE_WORK(&cdev->private->kick_work, 662 PREPARE_WORK(&cdev->private->kick_work,
665 ccw_device_add_changed, (void *)cdev); 663 ccw_device_add_changed, cdev);
666 queue_work(ccw_device_work, &cdev->private->kick_work); 664 queue_work(ccw_device_work, &cdev->private->kick_work);
667} 665}
668 666
@@ -687,7 +685,7 @@ io_subchannel_register(void *data)
687 int ret; 685 int ret;
688 unsigned long flags; 686 unsigned long flags;
689 687
690 cdev = (struct ccw_device *) data; 688 cdev = data;
691 sch = to_subchannel(cdev->dev.parent); 689 sch = to_subchannel(cdev->dev.parent);
692 690
693 if (klist_node_attached(&cdev->dev.knode_parent)) { 691 if (klist_node_attached(&cdev->dev.knode_parent)) {
@@ -759,7 +757,7 @@ io_subchannel_recog_done(struct ccw_device *cdev)
759 break; 757 break;
760 sch = to_subchannel(cdev->dev.parent); 758 sch = to_subchannel(cdev->dev.parent);
761 PREPARE_WORK(&cdev->private->kick_work, 759 PREPARE_WORK(&cdev->private->kick_work,
762 ccw_device_call_sch_unregister, (void *) cdev); 760 ccw_device_call_sch_unregister, cdev);
763 queue_work(slow_path_wq, &cdev->private->kick_work); 761 queue_work(slow_path_wq, &cdev->private->kick_work);
764 if (atomic_dec_and_test(&ccw_device_init_count)) 762 if (atomic_dec_and_test(&ccw_device_init_count))
765 wake_up(&ccw_device_init_wq); 763 wake_up(&ccw_device_init_wq);
@@ -774,7 +772,7 @@ io_subchannel_recog_done(struct ccw_device *cdev)
774 if (!get_device(&cdev->dev)) 772 if (!get_device(&cdev->dev))
775 break; 773 break;
776 PREPARE_WORK(&cdev->private->kick_work, 774 PREPARE_WORK(&cdev->private->kick_work,
777 io_subchannel_register, (void *) cdev); 775 io_subchannel_register, cdev);
778 queue_work(slow_path_wq, &cdev->private->kick_work); 776 queue_work(slow_path_wq, &cdev->private->kick_work);
779 break; 777 break;
780 } 778 }
@@ -792,9 +790,9 @@ io_subchannel_recog(struct ccw_device *cdev, struct subchannel *sch)
792 790
793 /* Init private data. */ 791 /* Init private data. */
794 priv = cdev->private; 792 priv = cdev->private;
795 priv->devno = sch->schib.pmcw.dev; 793 priv->dev_id.devno = sch->schib.pmcw.dev;
796 priv->ssid = sch->schid.ssid; 794 priv->dev_id.ssid = sch->schid.ssid;
797 priv->sch_no = sch->schid.sch_no; 795 priv->schid = sch->schid;
798 priv->state = DEV_STATE_NOT_OPER; 796 priv->state = DEV_STATE_NOT_OPER;
799 INIT_LIST_HEAD(&priv->cmb_list); 797 INIT_LIST_HEAD(&priv->cmb_list);
800 init_waitqueue_head(&priv->wait_q); 798 init_waitqueue_head(&priv->wait_q);
@@ -912,7 +910,7 @@ io_subchannel_remove (struct subchannel *sch)
912 */ 910 */
913 if (get_device(&cdev->dev)) { 911 if (get_device(&cdev->dev)) {
914 PREPARE_WORK(&cdev->private->kick_work, 912 PREPARE_WORK(&cdev->private->kick_work,
915 ccw_device_unregister, (void *) cdev); 913 ccw_device_unregister, cdev);
916 queue_work(ccw_device_work, &cdev->private->kick_work); 914 queue_work(ccw_device_work, &cdev->private->kick_work);
917 } 915 }
918 return 0; 916 return 0;
@@ -1055,7 +1053,7 @@ __ccwdev_check_busid(struct device *dev, void *id)
1055{ 1053{
1056 char *bus_id; 1054 char *bus_id;
1057 1055
1058 bus_id = (char *)id; 1056 bus_id = id;
1059 1057
1060 return (strncmp(bus_id, dev->bus_id, BUS_ID_SIZE) == 0); 1058 return (strncmp(bus_id, dev->bus_id, BUS_ID_SIZE) == 0);
1061} 1059}
diff --git a/drivers/s390/cio/device.h b/drivers/s390/cio/device.h
index 00be9a5b4acd..c6140cc97a80 100644
--- a/drivers/s390/cio/device.h
+++ b/drivers/s390/cio/device.h
@@ -21,7 +21,6 @@ enum dev_state {
21 /* states to wait for i/o completion before doing something */ 21 /* states to wait for i/o completion before doing something */
22 DEV_STATE_CLEAR_VERIFY, 22 DEV_STATE_CLEAR_VERIFY,
23 DEV_STATE_TIMEOUT_KILL, 23 DEV_STATE_TIMEOUT_KILL,
24 DEV_STATE_WAIT4IO,
25 DEV_STATE_QUIESCE, 24 DEV_STATE_QUIESCE,
26 /* special states for devices gone not operational */ 25 /* special states for devices gone not operational */
27 DEV_STATE_DISCONNECTED, 26 DEV_STATE_DISCONNECTED,
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c
index dace46fc32e8..de3d0857db9f 100644
--- a/drivers/s390/cio/device_fsm.c
+++ b/drivers/s390/cio/device_fsm.c
@@ -59,18 +59,6 @@ device_set_disconnected(struct subchannel *sch)
59 cdev->private->state = DEV_STATE_DISCONNECTED; 59 cdev->private->state = DEV_STATE_DISCONNECTED;
60} 60}
61 61
62void
63device_set_waiting(struct subchannel *sch)
64{
65 struct ccw_device *cdev;
66
67 if (!sch->dev.driver_data)
68 return;
69 cdev = sch->dev.driver_data;
70 ccw_device_set_timeout(cdev, 10*HZ);
71 cdev->private->state = DEV_STATE_WAIT4IO;
72}
73
74/* 62/*
75 * Timeout function. It just triggers a DEV_EVENT_TIMEOUT. 63 * Timeout function. It just triggers a DEV_EVENT_TIMEOUT.
76 */ 64 */
@@ -183,9 +171,9 @@ ccw_device_handle_oper(struct ccw_device *cdev)
183 cdev->id.cu_model != cdev->private->senseid.cu_model || 171 cdev->id.cu_model != cdev->private->senseid.cu_model ||
184 cdev->id.dev_type != cdev->private->senseid.dev_type || 172 cdev->id.dev_type != cdev->private->senseid.dev_type ||
185 cdev->id.dev_model != cdev->private->senseid.dev_model || 173 cdev->id.dev_model != cdev->private->senseid.dev_model ||
186 cdev->private->devno != sch->schib.pmcw.dev) { 174 cdev->private->dev_id.devno != sch->schib.pmcw.dev) {
187 PREPARE_WORK(&cdev->private->kick_work, 175 PREPARE_WORK(&cdev->private->kick_work,
188 ccw_device_do_unreg_rereg, (void *)cdev); 176 ccw_device_do_unreg_rereg, cdev);
189 queue_work(ccw_device_work, &cdev->private->kick_work); 177 queue_work(ccw_device_work, &cdev->private->kick_work);
190 return 0; 178 return 0;
191 } 179 }
@@ -255,7 +243,7 @@ ccw_device_recog_done(struct ccw_device *cdev, int state)
255 case DEV_STATE_NOT_OPER: 243 case DEV_STATE_NOT_OPER:
256 CIO_DEBUG(KERN_WARNING, 2, 244 CIO_DEBUG(KERN_WARNING, 2,
257 "SenseID : unknown device %04x on subchannel " 245 "SenseID : unknown device %04x on subchannel "
258 "0.%x.%04x\n", cdev->private->devno, 246 "0.%x.%04x\n", cdev->private->dev_id.devno,
259 sch->schid.ssid, sch->schid.sch_no); 247 sch->schid.ssid, sch->schid.sch_no);
260 break; 248 break;
261 case DEV_STATE_OFFLINE: 249 case DEV_STATE_OFFLINE:
@@ -282,14 +270,15 @@ ccw_device_recog_done(struct ccw_device *cdev, int state)
282 CIO_DEBUG(KERN_INFO, 2, "SenseID : device 0.%x.%04x reports: " 270 CIO_DEBUG(KERN_INFO, 2, "SenseID : device 0.%x.%04x reports: "
283 "CU Type/Mod = %04X/%02X, Dev Type/Mod = " 271 "CU Type/Mod = %04X/%02X, Dev Type/Mod = "
284 "%04X/%02X\n", 272 "%04X/%02X\n",
285 cdev->private->ssid, cdev->private->devno, 273 cdev->private->dev_id.ssid,
274 cdev->private->dev_id.devno,
286 cdev->id.cu_type, cdev->id.cu_model, 275 cdev->id.cu_type, cdev->id.cu_model,
287 cdev->id.dev_type, cdev->id.dev_model); 276 cdev->id.dev_type, cdev->id.dev_model);
288 break; 277 break;
289 case DEV_STATE_BOXED: 278 case DEV_STATE_BOXED:
290 CIO_DEBUG(KERN_WARNING, 2, 279 CIO_DEBUG(KERN_WARNING, 2,
291 "SenseID : boxed device %04x on subchannel " 280 "SenseID : boxed device %04x on subchannel "
292 "0.%x.%04x\n", cdev->private->devno, 281 "0.%x.%04x\n", cdev->private->dev_id.devno,
293 sch->schid.ssid, sch->schid.sch_no); 282 sch->schid.ssid, sch->schid.sch_no);
294 break; 283 break;
295 } 284 }
@@ -325,13 +314,13 @@ ccw_device_oper_notify(void *data)
325 struct subchannel *sch; 314 struct subchannel *sch;
326 int ret; 315 int ret;
327 316
328 cdev = (struct ccw_device *)data; 317 cdev = data;
329 sch = to_subchannel(cdev->dev.parent); 318 sch = to_subchannel(cdev->dev.parent);
330 ret = (sch->driver && sch->driver->notify) ? 319 ret = (sch->driver && sch->driver->notify) ?
331 sch->driver->notify(&sch->dev, CIO_OPER) : 0; 320 sch->driver->notify(&sch->dev, CIO_OPER) : 0;
332 if (!ret) 321 if (!ret)
333 /* Driver doesn't want device back. */ 322 /* Driver doesn't want device back. */
334 ccw_device_do_unreg_rereg((void *)cdev); 323 ccw_device_do_unreg_rereg(cdev);
335 else { 324 else {
336 /* Reenable channel measurements, if needed. */ 325 /* Reenable channel measurements, if needed. */
337 cmf_reenable(cdev); 326 cmf_reenable(cdev);
@@ -349,6 +338,8 @@ ccw_device_done(struct ccw_device *cdev, int state)
349 338
350 sch = to_subchannel(cdev->dev.parent); 339 sch = to_subchannel(cdev->dev.parent);
351 340
341 ccw_device_set_timeout(cdev, 0);
342
352 if (state != DEV_STATE_ONLINE) 343 if (state != DEV_STATE_ONLINE)
353 cio_disable_subchannel(sch); 344 cio_disable_subchannel(sch);
354 345
@@ -361,12 +352,12 @@ ccw_device_done(struct ccw_device *cdev, int state)
361 if (state == DEV_STATE_BOXED) 352 if (state == DEV_STATE_BOXED)
362 CIO_DEBUG(KERN_WARNING, 2, 353 CIO_DEBUG(KERN_WARNING, 2,
363 "Boxed device %04x on subchannel %04x\n", 354 "Boxed device %04x on subchannel %04x\n",
364 cdev->private->devno, sch->schid.sch_no); 355 cdev->private->dev_id.devno, sch->schid.sch_no);
365 356
366 if (cdev->private->flags.donotify) { 357 if (cdev->private->flags.donotify) {
367 cdev->private->flags.donotify = 0; 358 cdev->private->flags.donotify = 0;
368 PREPARE_WORK(&cdev->private->kick_work, ccw_device_oper_notify, 359 PREPARE_WORK(&cdev->private->kick_work, ccw_device_oper_notify,
369 (void *)cdev); 360 cdev);
370 queue_work(ccw_device_notify_work, &cdev->private->kick_work); 361 queue_work(ccw_device_notify_work, &cdev->private->kick_work);
371 } 362 }
372 wake_up(&cdev->private->wait_q); 363 wake_up(&cdev->private->wait_q);
@@ -410,7 +401,8 @@ static void __ccw_device_get_common_pgid(struct ccw_device *cdev)
410 /* PGID mismatch, can't pathgroup. */ 401 /* PGID mismatch, can't pathgroup. */
411 CIO_MSG_EVENT(0, "SNID - pgid mismatch for device " 402 CIO_MSG_EVENT(0, "SNID - pgid mismatch for device "
412 "0.%x.%04x, can't pathgroup\n", 403 "0.%x.%04x, can't pathgroup\n",
413 cdev->private->ssid, cdev->private->devno); 404 cdev->private->dev_id.ssid,
405 cdev->private->dev_id.devno);
414 cdev->private->options.pgroup = 0; 406 cdev->private->options.pgroup = 0;
415 return; 407 return;
416 } 408 }
@@ -521,7 +513,7 @@ ccw_device_nopath_notify(void *data)
521 struct subchannel *sch; 513 struct subchannel *sch;
522 int ret; 514 int ret;
523 515
524 cdev = (struct ccw_device *)data; 516 cdev = data;
525 sch = to_subchannel(cdev->dev.parent); 517 sch = to_subchannel(cdev->dev.parent);
526 /* Extra sanity. */ 518 /* Extra sanity. */
527 if (sch->lpm) 519 if (sch->lpm)
@@ -535,7 +527,7 @@ ccw_device_nopath_notify(void *data)
535 if (get_device(&cdev->dev)) { 527 if (get_device(&cdev->dev)) {
536 PREPARE_WORK(&cdev->private->kick_work, 528 PREPARE_WORK(&cdev->private->kick_work,
537 ccw_device_call_sch_unregister, 529 ccw_device_call_sch_unregister,
538 (void *)cdev); 530 cdev);
539 queue_work(ccw_device_work, 531 queue_work(ccw_device_work,
540 &cdev->private->kick_work); 532 &cdev->private->kick_work);
541 } else 533 } else
@@ -586,11 +578,15 @@ ccw_device_verify_done(struct ccw_device *cdev, int err)
586 } 578 }
587 break; 579 break;
588 case -ETIME: 580 case -ETIME:
581 /* Reset oper notify indication after verify error. */
582 cdev->private->flags.donotify = 0;
589 ccw_device_done(cdev, DEV_STATE_BOXED); 583 ccw_device_done(cdev, DEV_STATE_BOXED);
590 break; 584 break;
591 default: 585 default:
586 /* Reset oper notify indication after verify error. */
587 cdev->private->flags.donotify = 0;
592 PREPARE_WORK(&cdev->private->kick_work, 588 PREPARE_WORK(&cdev->private->kick_work,
593 ccw_device_nopath_notify, (void *)cdev); 589 ccw_device_nopath_notify, cdev);
594 queue_work(ccw_device_notify_work, &cdev->private->kick_work); 590 queue_work(ccw_device_notify_work, &cdev->private->kick_work);
595 ccw_device_done(cdev, DEV_STATE_NOT_OPER); 591 ccw_device_done(cdev, DEV_STATE_NOT_OPER);
596 break; 592 break;
@@ -721,7 +717,7 @@ ccw_device_offline_notoper(struct ccw_device *cdev, enum dev_event dev_event)
721 sch = to_subchannel(cdev->dev.parent); 717 sch = to_subchannel(cdev->dev.parent);
722 if (get_device(&cdev->dev)) { 718 if (get_device(&cdev->dev)) {
723 PREPARE_WORK(&cdev->private->kick_work, 719 PREPARE_WORK(&cdev->private->kick_work,
724 ccw_device_call_sch_unregister, (void *)cdev); 720 ccw_device_call_sch_unregister, cdev);
725 queue_work(ccw_device_work, &cdev->private->kick_work); 721 queue_work(ccw_device_work, &cdev->private->kick_work);
726 } 722 }
727 wake_up(&cdev->private->wait_q); 723 wake_up(&cdev->private->wait_q);
@@ -752,7 +748,7 @@ ccw_device_online_notoper(struct ccw_device *cdev, enum dev_event dev_event)
752 } 748 }
753 if (get_device(&cdev->dev)) { 749 if (get_device(&cdev->dev)) {
754 PREPARE_WORK(&cdev->private->kick_work, 750 PREPARE_WORK(&cdev->private->kick_work,
755 ccw_device_call_sch_unregister, (void *)cdev); 751 ccw_device_call_sch_unregister, cdev);
756 queue_work(ccw_device_work, &cdev->private->kick_work); 752 queue_work(ccw_device_work, &cdev->private->kick_work);
757 } 753 }
758 wake_up(&cdev->private->wait_q); 754 wake_up(&cdev->private->wait_q);
@@ -857,7 +853,7 @@ ccw_device_online_timeout(struct ccw_device *cdev, enum dev_event dev_event)
857 sch = to_subchannel(cdev->dev.parent); 853 sch = to_subchannel(cdev->dev.parent);
858 if (!sch->lpm) { 854 if (!sch->lpm) {
859 PREPARE_WORK(&cdev->private->kick_work, 855 PREPARE_WORK(&cdev->private->kick_work,
860 ccw_device_nopath_notify, (void *)cdev); 856 ccw_device_nopath_notify, cdev);
861 queue_work(ccw_device_notify_work, 857 queue_work(ccw_device_notify_work,
862 &cdev->private->kick_work); 858 &cdev->private->kick_work);
863 } else 859 } else
@@ -883,7 +879,8 @@ ccw_device_w4sense(struct ccw_device *cdev, enum dev_event dev_event)
883 /* Basic sense hasn't started. Try again. */ 879 /* Basic sense hasn't started. Try again. */
884 ccw_device_do_sense(cdev, irb); 880 ccw_device_do_sense(cdev, irb);
885 else { 881 else {
886 printk("Huh? %s(%s): unsolicited interrupt...\n", 882 printk(KERN_INFO "Huh? %s(%s): unsolicited "
883 "interrupt...\n",
887 __FUNCTION__, cdev->dev.bus_id); 884 __FUNCTION__, cdev->dev.bus_id);
888 if (cdev->handler) 885 if (cdev->handler)
889 cdev->handler (cdev, 0, irb); 886 cdev->handler (cdev, 0, irb);
@@ -942,10 +939,10 @@ ccw_device_killing_irq(struct ccw_device *cdev, enum dev_event dev_event)
942 cdev->private->state = DEV_STATE_ONLINE; 939 cdev->private->state = DEV_STATE_ONLINE;
943 if (cdev->handler) 940 if (cdev->handler)
944 cdev->handler(cdev, cdev->private->intparm, 941 cdev->handler(cdev, cdev->private->intparm,
945 ERR_PTR(-ETIMEDOUT)); 942 ERR_PTR(-EIO));
946 if (!sch->lpm) { 943 if (!sch->lpm) {
947 PREPARE_WORK(&cdev->private->kick_work, 944 PREPARE_WORK(&cdev->private->kick_work,
948 ccw_device_nopath_notify, (void *)cdev); 945 ccw_device_nopath_notify, cdev);
949 queue_work(ccw_device_notify_work, &cdev->private->kick_work); 946 queue_work(ccw_device_notify_work, &cdev->private->kick_work);
950 } else if (cdev->private->flags.doverify) 947 } else if (cdev->private->flags.doverify)
951 /* Start delayed path verification. */ 948 /* Start delayed path verification. */
@@ -968,7 +965,7 @@ ccw_device_killing_timeout(struct ccw_device *cdev, enum dev_event dev_event)
968 sch = to_subchannel(cdev->dev.parent); 965 sch = to_subchannel(cdev->dev.parent);
969 if (!sch->lpm) { 966 if (!sch->lpm) {
970 PREPARE_WORK(&cdev->private->kick_work, 967 PREPARE_WORK(&cdev->private->kick_work,
971 ccw_device_nopath_notify, (void *)cdev); 968 ccw_device_nopath_notify, cdev);
972 queue_work(ccw_device_notify_work, 969 queue_work(ccw_device_notify_work,
973 &cdev->private->kick_work); 970 &cdev->private->kick_work);
974 } else 971 } else
@@ -979,51 +976,15 @@ ccw_device_killing_timeout(struct ccw_device *cdev, enum dev_event dev_event)
979 cdev->private->state = DEV_STATE_ONLINE; 976 cdev->private->state = DEV_STATE_ONLINE;
980 if (cdev->handler) 977 if (cdev->handler)
981 cdev->handler(cdev, cdev->private->intparm, 978 cdev->handler(cdev, cdev->private->intparm,
982 ERR_PTR(-ETIMEDOUT)); 979 ERR_PTR(-EIO));
983}
984
985static void
986ccw_device_wait4io_irq(struct ccw_device *cdev, enum dev_event dev_event)
987{
988 struct irb *irb;
989 struct subchannel *sch;
990
991 irb = (struct irb *) __LC_IRB;
992 /*
993 * Accumulate status and find out if a basic sense is needed.
994 * This is fine since we have already adapted the lpm.
995 */
996 ccw_device_accumulate_irb(cdev, irb);
997 if (cdev->private->flags.dosense) {
998 if (ccw_device_do_sense(cdev, irb) == 0) {
999 cdev->private->state = DEV_STATE_W4SENSE;
1000 }
1001 return;
1002 }
1003
1004 /* Iff device is idle, reset timeout. */
1005 sch = to_subchannel(cdev->dev.parent);
1006 if (!stsch(sch->schid, &sch->schib))
1007 if (sch->schib.scsw.actl == 0)
1008 ccw_device_set_timeout(cdev, 0);
1009 /* Call the handler. */
1010 ccw_device_call_handler(cdev);
1011 if (!sch->lpm) {
1012 PREPARE_WORK(&cdev->private->kick_work,
1013 ccw_device_nopath_notify, (void *)cdev);
1014 queue_work(ccw_device_notify_work, &cdev->private->kick_work);
1015 } else if (cdev->private->flags.doverify)
1016 ccw_device_online_verify(cdev, 0);
1017} 980}
1018 981
1019static void 982void device_kill_io(struct subchannel *sch)
1020ccw_device_wait4io_timeout(struct ccw_device *cdev, enum dev_event dev_event)
1021{ 983{
1022 int ret; 984 int ret;
1023 struct subchannel *sch; 985 struct ccw_device *cdev;
1024 986
1025 sch = to_subchannel(cdev->dev.parent); 987 cdev = sch->dev.driver_data;
1026 ccw_device_set_timeout(cdev, 0);
1027 ret = ccw_device_cancel_halt_clear(cdev); 988 ret = ccw_device_cancel_halt_clear(cdev);
1028 if (ret == -EBUSY) { 989 if (ret == -EBUSY) {
1029 ccw_device_set_timeout(cdev, 3*HZ); 990 ccw_device_set_timeout(cdev, 3*HZ);
@@ -1033,7 +994,7 @@ ccw_device_wait4io_timeout(struct ccw_device *cdev, enum dev_event dev_event)
1033 if (ret == -ENODEV) { 994 if (ret == -ENODEV) {
1034 if (!sch->lpm) { 995 if (!sch->lpm) {
1035 PREPARE_WORK(&cdev->private->kick_work, 996 PREPARE_WORK(&cdev->private->kick_work,
1036 ccw_device_nopath_notify, (void *)cdev); 997 ccw_device_nopath_notify, cdev);
1037 queue_work(ccw_device_notify_work, 998 queue_work(ccw_device_notify_work,
1038 &cdev->private->kick_work); 999 &cdev->private->kick_work);
1039 } else 1000 } else
@@ -1042,12 +1003,12 @@ ccw_device_wait4io_timeout(struct ccw_device *cdev, enum dev_event dev_event)
1042 } 1003 }
1043 if (cdev->handler) 1004 if (cdev->handler)
1044 cdev->handler(cdev, cdev->private->intparm, 1005 cdev->handler(cdev, cdev->private->intparm,
1045 ERR_PTR(-ETIMEDOUT)); 1006 ERR_PTR(-EIO));
1046 if (!sch->lpm) { 1007 if (!sch->lpm) {
1047 PREPARE_WORK(&cdev->private->kick_work, 1008 PREPARE_WORK(&cdev->private->kick_work,
1048 ccw_device_nopath_notify, (void *)cdev); 1009 ccw_device_nopath_notify, cdev);
1049 queue_work(ccw_device_notify_work, &cdev->private->kick_work); 1010 queue_work(ccw_device_notify_work, &cdev->private->kick_work);
1050 } else if (cdev->private->flags.doverify) 1011 } else
1051 /* Start delayed path verification. */ 1012 /* Start delayed path verification. */
1052 ccw_device_online_verify(cdev, 0); 1013 ccw_device_online_verify(cdev, 0);
1053} 1014}
@@ -1284,12 +1245,6 @@ fsm_func_t *dev_jumptable[NR_DEV_STATES][NR_DEV_EVENTS] = {
1284 [DEV_EVENT_TIMEOUT] = ccw_device_killing_timeout, 1245 [DEV_EVENT_TIMEOUT] = ccw_device_killing_timeout,
1285 [DEV_EVENT_VERIFY] = ccw_device_nop, //FIXME 1246 [DEV_EVENT_VERIFY] = ccw_device_nop, //FIXME
1286 }, 1247 },
1287 [DEV_STATE_WAIT4IO] = {
1288 [DEV_EVENT_NOTOPER] = ccw_device_online_notoper,
1289 [DEV_EVENT_INTERRUPT] = ccw_device_wait4io_irq,
1290 [DEV_EVENT_TIMEOUT] = ccw_device_wait4io_timeout,
1291 [DEV_EVENT_VERIFY] = ccw_device_delay_verify,
1292 },
1293 [DEV_STATE_QUIESCE] = { 1248 [DEV_STATE_QUIESCE] = {
1294 [DEV_EVENT_NOTOPER] = ccw_device_quiesce_done, 1249 [DEV_EVENT_NOTOPER] = ccw_device_quiesce_done,
1295 [DEV_EVENT_INTERRUPT] = ccw_device_quiesce_done, 1250 [DEV_EVENT_INTERRUPT] = ccw_device_quiesce_done,
diff --git a/drivers/s390/cio/device_id.c b/drivers/s390/cio/device_id.c
index 1398367b5f68..a74785b9e4eb 100644
--- a/drivers/s390/cio/device_id.c
+++ b/drivers/s390/cio/device_id.c
@@ -251,7 +251,7 @@ ccw_device_check_sense_id(struct ccw_device *cdev)
251 */ 251 */
252 CIO_MSG_EVENT(2, "SenseID : device %04x on Subchannel " 252 CIO_MSG_EVENT(2, "SenseID : device %04x on Subchannel "
253 "0.%x.%04x reports cmd reject\n", 253 "0.%x.%04x reports cmd reject\n",
254 cdev->private->devno, sch->schid.ssid, 254 cdev->private->dev_id.devno, sch->schid.ssid,
255 sch->schid.sch_no); 255 sch->schid.sch_no);
256 return -EOPNOTSUPP; 256 return -EOPNOTSUPP;
257 } 257 }
@@ -259,7 +259,8 @@ ccw_device_check_sense_id(struct ccw_device *cdev)
259 CIO_MSG_EVENT(2, "SenseID : UC on dev 0.%x.%04x, " 259 CIO_MSG_EVENT(2, "SenseID : UC on dev 0.%x.%04x, "
260 "lpum %02X, cnt %02d, sns :" 260 "lpum %02X, cnt %02d, sns :"
261 " %02X%02X%02X%02X %02X%02X%02X%02X ...\n", 261 " %02X%02X%02X%02X %02X%02X%02X%02X ...\n",
262 cdev->private->ssid, cdev->private->devno, 262 cdev->private->dev_id.ssid,
263 cdev->private->dev_id.devno,
263 irb->esw.esw0.sublog.lpum, 264 irb->esw.esw0.sublog.lpum,
264 irb->esw.esw0.erw.scnt, 265 irb->esw.esw0.erw.scnt,
265 irb->ecw[0], irb->ecw[1], 266 irb->ecw[0], irb->ecw[1],
@@ -274,14 +275,15 @@ ccw_device_check_sense_id(struct ccw_device *cdev)
274 CIO_MSG_EVENT(2, "SenseID : path %02X for device %04x " 275 CIO_MSG_EVENT(2, "SenseID : path %02X for device %04x "
275 "on subchannel 0.%x.%04x is " 276 "on subchannel 0.%x.%04x is "
276 "'not operational'\n", sch->orb.lpm, 277 "'not operational'\n", sch->orb.lpm,
277 cdev->private->devno, sch->schid.ssid, 278 cdev->private->dev_id.devno,
278 sch->schid.sch_no); 279 sch->schid.ssid, sch->schid.sch_no);
279 return -EACCES; 280 return -EACCES;
280 } 281 }
281 /* Hmm, whatever happened, try again. */ 282 /* Hmm, whatever happened, try again. */
282 CIO_MSG_EVENT(2, "SenseID : start_IO() for device %04x on " 283 CIO_MSG_EVENT(2, "SenseID : start_IO() for device %04x on "
283 "subchannel 0.%x.%04x returns status %02X%02X\n", 284 "subchannel 0.%x.%04x returns status %02X%02X\n",
284 cdev->private->devno, sch->schid.ssid, sch->schid.sch_no, 285 cdev->private->dev_id.devno, sch->schid.ssid,
286 sch->schid.sch_no,
285 irb->scsw.dstat, irb->scsw.cstat); 287 irb->scsw.dstat, irb->scsw.cstat);
286 return -EAGAIN; 288 return -EAGAIN;
287} 289}
@@ -330,7 +332,7 @@ ccw_device_sense_id_irq(struct ccw_device *cdev, enum dev_event dev_event)
330 /* fall through. */ 332 /* fall through. */
331 default: /* Sense ID failed. Try asking VM. */ 333 default: /* Sense ID failed. Try asking VM. */
332 if (MACHINE_IS_VM) { 334 if (MACHINE_IS_VM) {
333 VM_virtual_device_info (cdev->private->devno, 335 VM_virtual_device_info (cdev->private->dev_id.devno,
334 &cdev->private->senseid); 336 &cdev->private->senseid);
335 if (cdev->private->senseid.cu_type != 0xFFFF) { 337 if (cdev->private->senseid.cu_type != 0xFFFF) {
336 /* Got the device information from VM. */ 338 /* Got the device information from VM. */
diff --git a/drivers/s390/cio/device_ops.c b/drivers/s390/cio/device_ops.c
index 93a897eebfff..b39c1fa48acd 100644
--- a/drivers/s390/cio/device_ops.c
+++ b/drivers/s390/cio/device_ops.c
@@ -50,7 +50,6 @@ ccw_device_clear(struct ccw_device *cdev, unsigned long intparm)
50 if (cdev->private->state == DEV_STATE_NOT_OPER) 50 if (cdev->private->state == DEV_STATE_NOT_OPER)
51 return -ENODEV; 51 return -ENODEV;
52 if (cdev->private->state != DEV_STATE_ONLINE && 52 if (cdev->private->state != DEV_STATE_ONLINE &&
53 cdev->private->state != DEV_STATE_WAIT4IO &&
54 cdev->private->state != DEV_STATE_W4SENSE) 53 cdev->private->state != DEV_STATE_W4SENSE)
55 return -EINVAL; 54 return -EINVAL;
56 sch = to_subchannel(cdev->dev.parent); 55 sch = to_subchannel(cdev->dev.parent);
@@ -155,7 +154,6 @@ ccw_device_halt(struct ccw_device *cdev, unsigned long intparm)
155 if (cdev->private->state == DEV_STATE_NOT_OPER) 154 if (cdev->private->state == DEV_STATE_NOT_OPER)
156 return -ENODEV; 155 return -ENODEV;
157 if (cdev->private->state != DEV_STATE_ONLINE && 156 if (cdev->private->state != DEV_STATE_ONLINE &&
158 cdev->private->state != DEV_STATE_WAIT4IO &&
159 cdev->private->state != DEV_STATE_W4SENSE) 157 cdev->private->state != DEV_STATE_W4SENSE)
160 return -EINVAL; 158 return -EINVAL;
161 sch = to_subchannel(cdev->dev.parent); 159 sch = to_subchannel(cdev->dev.parent);
@@ -216,6 +214,9 @@ ccw_device_call_handler(struct ccw_device *cdev)
216 (stctl & SCSW_STCTL_PRIM_STATUS))) 214 (stctl & SCSW_STCTL_PRIM_STATUS)))
217 return 0; 215 return 0;
218 216
217 /* Clear pending timers for device driver initiated I/O. */
218 if (ending_status)
219 ccw_device_set_timeout(cdev, 0);
219 /* 220 /*
220 * Now we are ready to call the device driver interrupt handler. 221 * Now we are ready to call the device driver interrupt handler.
221 */ 222 */
@@ -285,10 +286,10 @@ ccw_device_wake_up(struct ccw_device *cdev, unsigned long ip, struct irb *irb)
285 if (cdev->private->flags.doverify || 286 if (cdev->private->flags.doverify ||
286 cdev->private->state == DEV_STATE_VERIFY) 287 cdev->private->state == DEV_STATE_VERIFY)
287 cdev->private->intparm = -EAGAIN; 288 cdev->private->intparm = -EAGAIN;
288 if ((irb->scsw.dstat & DEV_STAT_UNIT_CHECK) && 289 else if ((irb->scsw.dstat & DEV_STAT_UNIT_CHECK) &&
289 !(irb->ecw[0] & 290 !(irb->ecw[0] &
290 (SNS0_CMD_REJECT | SNS0_INTERVENTION_REQ))) 291 (SNS0_CMD_REJECT | SNS0_INTERVENTION_REQ)))
291 cdev->private->intparm = -EAGAIN; 292 cdev->private->intparm = -EAGAIN;
292 else if ((irb->scsw.dstat & DEV_STAT_ATTENTION) && 293 else if ((irb->scsw.dstat & DEV_STAT_ATTENTION) &&
293 (irb->scsw.dstat & DEV_STAT_DEV_END) && 294 (irb->scsw.dstat & DEV_STAT_DEV_END) &&
294 (irb->scsw.dstat & DEV_STAT_UNIT_EXCEP)) 295 (irb->scsw.dstat & DEV_STAT_UNIT_EXCEP))
@@ -309,7 +310,10 @@ __ccw_device_retry_loop(struct ccw_device *cdev, struct ccw1 *ccw, long magic, _
309 310
310 sch = to_subchannel(cdev->dev.parent); 311 sch = to_subchannel(cdev->dev.parent);
311 do { 312 do {
313 ccw_device_set_timeout(cdev, 60 * HZ);
312 ret = cio_start (sch, ccw, lpm); 314 ret = cio_start (sch, ccw, lpm);
315 if (ret != 0)
316 ccw_device_set_timeout(cdev, 0);
313 if (ret == -EBUSY) { 317 if (ret == -EBUSY) {
314 /* Try again later. */ 318 /* Try again later. */
315 spin_unlock_irq(&sch->lock); 319 spin_unlock_irq(&sch->lock);
@@ -586,13 +590,13 @@ ccw_device_get_chp_desc(struct ccw_device *cdev, int chp_no)
586int 590int
587_ccw_device_get_subchannel_number(struct ccw_device *cdev) 591_ccw_device_get_subchannel_number(struct ccw_device *cdev)
588{ 592{
589 return cdev->private->sch_no; 593 return cdev->private->schid.sch_no;
590} 594}
591 595
592int 596int
593_ccw_device_get_device_number(struct ccw_device *cdev) 597_ccw_device_get_device_number(struct ccw_device *cdev)
594{ 598{
595 return cdev->private->devno; 599 return cdev->private->dev_id.devno;
596} 600}
597 601
598 602
diff --git a/drivers/s390/cio/device_pgid.c b/drivers/s390/cio/device_pgid.c
index 8ca2d078848c..2975ce888c19 100644
--- a/drivers/s390/cio/device_pgid.c
+++ b/drivers/s390/cio/device_pgid.c
@@ -79,7 +79,8 @@ __ccw_device_sense_pgid_start(struct ccw_device *cdev)
79 CIO_MSG_EVENT(2, "SNID - Device %04x on Subchannel " 79 CIO_MSG_EVENT(2, "SNID - Device %04x on Subchannel "
80 "0.%x.%04x, lpm %02X, became 'not " 80 "0.%x.%04x, lpm %02X, became 'not "
81 "operational'\n", 81 "operational'\n",
82 cdev->private->devno, sch->schid.ssid, 82 cdev->private->dev_id.devno,
83 sch->schid.ssid,
83 sch->schid.sch_no, cdev->private->imask); 84 sch->schid.sch_no, cdev->private->imask);
84 85
85 } 86 }
@@ -96,6 +97,9 @@ ccw_device_sense_pgid_start(struct ccw_device *cdev)
96{ 97{
97 int ret; 98 int ret;
98 99
100 /* Set a timeout of 60s */
101 ccw_device_set_timeout(cdev, 60*HZ);
102
99 cdev->private->state = DEV_STATE_SENSE_PGID; 103 cdev->private->state = DEV_STATE_SENSE_PGID;
100 cdev->private->imask = 0x80; 104 cdev->private->imask = 0x80;
101 cdev->private->iretry = 5; 105 cdev->private->iretry = 5;
@@ -132,7 +136,8 @@ __ccw_device_check_sense_pgid(struct ccw_device *cdev)
132 CIO_MSG_EVENT(2, "SNID - device 0.%x.%04x, unit check, " 136 CIO_MSG_EVENT(2, "SNID - device 0.%x.%04x, unit check, "
133 "lpum %02X, cnt %02d, sns : " 137 "lpum %02X, cnt %02d, sns : "
134 "%02X%02X%02X%02X %02X%02X%02X%02X ...\n", 138 "%02X%02X%02X%02X %02X%02X%02X%02X ...\n",
135 cdev->private->ssid, cdev->private->devno, 139 cdev->private->dev_id.ssid,
140 cdev->private->dev_id.devno,
136 irb->esw.esw0.sublog.lpum, 141 irb->esw.esw0.sublog.lpum,
137 irb->esw.esw0.erw.scnt, 142 irb->esw.esw0.erw.scnt,
138 irb->ecw[0], irb->ecw[1], 143 irb->ecw[0], irb->ecw[1],
@@ -144,7 +149,7 @@ __ccw_device_check_sense_pgid(struct ccw_device *cdev)
144 if (irb->scsw.cc == 3) { 149 if (irb->scsw.cc == 3) {
145 CIO_MSG_EVENT(2, "SNID - Device %04x on Subchannel 0.%x.%04x," 150 CIO_MSG_EVENT(2, "SNID - Device %04x on Subchannel 0.%x.%04x,"
146 " lpm %02X, became 'not operational'\n", 151 " lpm %02X, became 'not operational'\n",
147 cdev->private->devno, sch->schid.ssid, 152 cdev->private->dev_id.devno, sch->schid.ssid,
148 sch->schid.sch_no, sch->orb.lpm); 153 sch->schid.sch_no, sch->orb.lpm);
149 return -EACCES; 154 return -EACCES;
150 } 155 }
@@ -152,7 +157,7 @@ __ccw_device_check_sense_pgid(struct ccw_device *cdev)
152 if (cdev->private->pgid[i].inf.ps.state2 == SNID_STATE2_RESVD_ELSE) { 157 if (cdev->private->pgid[i].inf.ps.state2 == SNID_STATE2_RESVD_ELSE) {
153 CIO_MSG_EVENT(2, "SNID - Device %04x on Subchannel 0.%x.%04x " 158 CIO_MSG_EVENT(2, "SNID - Device %04x on Subchannel 0.%x.%04x "
154 "is reserved by someone else\n", 159 "is reserved by someone else\n",
155 cdev->private->devno, sch->schid.ssid, 160 cdev->private->dev_id.devno, sch->schid.ssid,
156 sch->schid.sch_no); 161 sch->schid.sch_no);
157 return -EUSERS; 162 return -EUSERS;
158 } 163 }
@@ -258,7 +263,7 @@ __ccw_device_do_pgid(struct ccw_device *cdev, __u8 func)
258 /* PGID command failed on this path. */ 263 /* PGID command failed on this path. */
259 CIO_MSG_EVENT(2, "SPID - Device %04x on Subchannel " 264 CIO_MSG_EVENT(2, "SPID - Device %04x on Subchannel "
260 "0.%x.%04x, lpm %02X, became 'not operational'\n", 265 "0.%x.%04x, lpm %02X, became 'not operational'\n",
261 cdev->private->devno, sch->schid.ssid, 266 cdev->private->dev_id.devno, sch->schid.ssid,
262 sch->schid.sch_no, cdev->private->imask); 267 sch->schid.sch_no, cdev->private->imask);
263 return ret; 268 return ret;
264} 269}
@@ -298,7 +303,7 @@ static int __ccw_device_do_nop(struct ccw_device *cdev)
298 /* nop command failed on this path. */ 303 /* nop command failed on this path. */
299 CIO_MSG_EVENT(2, "NOP - Device %04x on Subchannel " 304 CIO_MSG_EVENT(2, "NOP - Device %04x on Subchannel "
300 "0.%x.%04x, lpm %02X, became 'not operational'\n", 305 "0.%x.%04x, lpm %02X, became 'not operational'\n",
301 cdev->private->devno, sch->schid.ssid, 306 cdev->private->dev_id.devno, sch->schid.ssid,
302 sch->schid.sch_no, cdev->private->imask); 307 sch->schid.sch_no, cdev->private->imask);
303 return ret; 308 return ret;
304} 309}
@@ -325,8 +330,9 @@ __ccw_device_check_pgid(struct ccw_device *cdev)
325 CIO_MSG_EVENT(2, "SPID - device 0.%x.%04x, unit check, " 330 CIO_MSG_EVENT(2, "SPID - device 0.%x.%04x, unit check, "
326 "cnt %02d, " 331 "cnt %02d, "
327 "sns : %02X%02X%02X%02X %02X%02X%02X%02X ...\n", 332 "sns : %02X%02X%02X%02X %02X%02X%02X%02X ...\n",
328 cdev->private->ssid, 333 cdev->private->dev_id.ssid,
329 cdev->private->devno, irb->esw.esw0.erw.scnt, 334 cdev->private->dev_id.devno,
335 irb->esw.esw0.erw.scnt,
330 irb->ecw[0], irb->ecw[1], 336 irb->ecw[0], irb->ecw[1],
331 irb->ecw[2], irb->ecw[3], 337 irb->ecw[2], irb->ecw[3],
332 irb->ecw[4], irb->ecw[5], 338 irb->ecw[4], irb->ecw[5],
@@ -336,7 +342,7 @@ __ccw_device_check_pgid(struct ccw_device *cdev)
336 if (irb->scsw.cc == 3) { 342 if (irb->scsw.cc == 3) {
337 CIO_MSG_EVENT(2, "SPID - Device %04x on Subchannel 0.%x.%04x," 343 CIO_MSG_EVENT(2, "SPID - Device %04x on Subchannel 0.%x.%04x,"
338 " lpm %02X, became 'not operational'\n", 344 " lpm %02X, became 'not operational'\n",
339 cdev->private->devno, sch->schid.ssid, 345 cdev->private->dev_id.devno, sch->schid.ssid,
340 sch->schid.sch_no, cdev->private->imask); 346 sch->schid.sch_no, cdev->private->imask);
341 return -EACCES; 347 return -EACCES;
342 } 348 }
@@ -359,7 +365,7 @@ static int __ccw_device_check_nop(struct ccw_device *cdev)
359 if (irb->scsw.cc == 3) { 365 if (irb->scsw.cc == 3) {
360 CIO_MSG_EVENT(2, "NOP - Device %04x on Subchannel 0.%x.%04x," 366 CIO_MSG_EVENT(2, "NOP - Device %04x on Subchannel 0.%x.%04x,"
361 " lpm %02X, became 'not operational'\n", 367 " lpm %02X, became 'not operational'\n",
362 cdev->private->devno, sch->schid.ssid, 368 cdev->private->dev_id.devno, sch->schid.ssid,
363 sch->schid.sch_no, cdev->private->imask); 369 sch->schid.sch_no, cdev->private->imask);
364 return -EACCES; 370 return -EACCES;
365 } 371 }
@@ -480,6 +486,8 @@ ccw_device_verify_start(struct ccw_device *cdev)
480 ccw_device_verify_done(cdev, -ENODEV); 486 ccw_device_verify_done(cdev, -ENODEV);
481 return; 487 return;
482 } 488 }
489 /* After 60s path verification is considered to have failed. */
490 ccw_device_set_timeout(cdev, 60*HZ);
483 __ccw_device_verify_start(cdev); 491 __ccw_device_verify_start(cdev);
484} 492}
485 493
@@ -554,6 +562,9 @@ ccw_device_disband_irq(struct ccw_device *cdev, enum dev_event dev_event)
554void 562void
555ccw_device_disband_start(struct ccw_device *cdev) 563ccw_device_disband_start(struct ccw_device *cdev)
556{ 564{
565 /* After 60s disbanding is considered to have failed. */
566 ccw_device_set_timeout(cdev, 60*HZ);
567
557 cdev->private->flags.pgid_single = 0; 568 cdev->private->flags.pgid_single = 0;
558 cdev->private->iretry = 5; 569 cdev->private->iretry = 5;
559 cdev->private->imask = 0x80; 570 cdev->private->imask = 0x80;
diff --git a/drivers/s390/cio/device_status.c b/drivers/s390/cio/device_status.c
index caf148d5caad..3f7cbce4cd87 100644
--- a/drivers/s390/cio/device_status.c
+++ b/drivers/s390/cio/device_status.c
@@ -32,19 +32,18 @@ ccw_device_msg_control_check(struct ccw_device *cdev, struct irb *irb)
32 SCHN_STAT_CHN_CTRL_CHK | 32 SCHN_STAT_CHN_CTRL_CHK |
33 SCHN_STAT_INTF_CTRL_CHK))) 33 SCHN_STAT_INTF_CTRL_CHK)))
34 return; 34 return;
35
36 CIO_MSG_EVENT(0, "Channel-Check or Interface-Control-Check " 35 CIO_MSG_EVENT(0, "Channel-Check or Interface-Control-Check "
37 "received" 36 "received"
38 " ... device %04x on subchannel 0.%x.%04x, dev_stat " 37 " ... device %04x on subchannel 0.%x.%04x, dev_stat "
39 ": %02X sch_stat : %02X\n", 38 ": %02X sch_stat : %02X\n",
40 cdev->private->devno, cdev->private->ssid, 39 cdev->private->dev_id.devno, cdev->private->schid.ssid,
41 cdev->private->sch_no, 40 cdev->private->schid.sch_no,
42 irb->scsw.dstat, irb->scsw.cstat); 41 irb->scsw.dstat, irb->scsw.cstat);
43 42
44 if (irb->scsw.cc != 3) { 43 if (irb->scsw.cc != 3) {
45 char dbf_text[15]; 44 char dbf_text[15];
46 45
47 sprintf(dbf_text, "chk%x", cdev->private->sch_no); 46 sprintf(dbf_text, "chk%x", cdev->private->schid.sch_no);
48 CIO_TRACE_EVENT(0, dbf_text); 47 CIO_TRACE_EVENT(0, dbf_text);
49 CIO_HEX_EVENT(0, irb, sizeof (struct irb)); 48 CIO_HEX_EVENT(0, irb, sizeof (struct irb));
50 } 49 }
diff --git a/drivers/s390/cio/qdio.c b/drivers/s390/cio/qdio.c
index cde822d8b5c8..476aa1da5cbc 100644
--- a/drivers/s390/cio/qdio.c
+++ b/drivers/s390/cio/qdio.c
@@ -1741,7 +1741,7 @@ qdio_fill_qs(struct qdio_irq *irq_ptr, struct ccw_device *cdev,
1741 void *ptr; 1741 void *ptr;
1742 int available; 1742 int available;
1743 1743
1744 sprintf(dbf_text,"qfqs%4x",cdev->private->sch_no); 1744 sprintf(dbf_text,"qfqs%4x",cdev->private->schid.sch_no);
1745 QDIO_DBF_TEXT0(0,setup,dbf_text); 1745 QDIO_DBF_TEXT0(0,setup,dbf_text);
1746 for (i=0;i<no_input_qs;i++) { 1746 for (i=0;i<no_input_qs;i++) {
1747 q=irq_ptr->input_qs[i]; 1747 q=irq_ptr->input_qs[i];
@@ -2924,7 +2924,7 @@ qdio_establish_handle_irq(struct ccw_device *cdev, int cstat, int dstat)
2924 2924
2925 irq_ptr = cdev->private->qdio_data; 2925 irq_ptr = cdev->private->qdio_data;
2926 2926
2927 sprintf(dbf_text,"qehi%4x",cdev->private->sch_no); 2927 sprintf(dbf_text,"qehi%4x",cdev->private->schid.sch_no);
2928 QDIO_DBF_TEXT0(0,setup,dbf_text); 2928 QDIO_DBF_TEXT0(0,setup,dbf_text);
2929 QDIO_DBF_TEXT0(0,trace,dbf_text); 2929 QDIO_DBF_TEXT0(0,trace,dbf_text);
2930 2930
@@ -2943,7 +2943,7 @@ qdio_initialize(struct qdio_initialize *init_data)
2943 int rc; 2943 int rc;
2944 char dbf_text[15]; 2944 char dbf_text[15];
2945 2945
2946 sprintf(dbf_text,"qini%4x",init_data->cdev->private->sch_no); 2946 sprintf(dbf_text,"qini%4x",init_data->cdev->private->schid.sch_no);
2947 QDIO_DBF_TEXT0(0,setup,dbf_text); 2947 QDIO_DBF_TEXT0(0,setup,dbf_text);
2948 QDIO_DBF_TEXT0(0,trace,dbf_text); 2948 QDIO_DBF_TEXT0(0,trace,dbf_text);
2949 2949
@@ -2964,7 +2964,7 @@ qdio_allocate(struct qdio_initialize *init_data)
2964 struct qdio_irq *irq_ptr; 2964 struct qdio_irq *irq_ptr;
2965 char dbf_text[15]; 2965 char dbf_text[15];
2966 2966
2967 sprintf(dbf_text,"qalc%4x",init_data->cdev->private->sch_no); 2967 sprintf(dbf_text,"qalc%4x",init_data->cdev->private->schid.sch_no);
2968 QDIO_DBF_TEXT0(0,setup,dbf_text); 2968 QDIO_DBF_TEXT0(0,setup,dbf_text);
2969 QDIO_DBF_TEXT0(0,trace,dbf_text); 2969 QDIO_DBF_TEXT0(0,trace,dbf_text);
2970 if ( (init_data->no_input_qs>QDIO_MAX_QUEUES_PER_IRQ) || 2970 if ( (init_data->no_input_qs>QDIO_MAX_QUEUES_PER_IRQ) ||
@@ -3187,7 +3187,7 @@ qdio_establish(struct qdio_initialize *init_data)
3187 tiqdio_set_delay_target(irq_ptr,TIQDIO_DELAY_TARGET); 3187 tiqdio_set_delay_target(irq_ptr,TIQDIO_DELAY_TARGET);
3188 } 3188 }
3189 3189
3190 sprintf(dbf_text,"qest%4x",cdev->private->sch_no); 3190 sprintf(dbf_text,"qest%4x",cdev->private->schid.sch_no);
3191 QDIO_DBF_TEXT0(0,setup,dbf_text); 3191 QDIO_DBF_TEXT0(0,setup,dbf_text);
3192 QDIO_DBF_TEXT0(0,trace,dbf_text); 3192 QDIO_DBF_TEXT0(0,trace,dbf_text);
3193 3193
@@ -3529,7 +3529,7 @@ do_QDIO(struct ccw_device *cdev,unsigned int callflags,
3529#ifdef CONFIG_QDIO_DEBUG 3529#ifdef CONFIG_QDIO_DEBUG
3530 char dbf_text[20]; 3530 char dbf_text[20];
3531 3531
3532 sprintf(dbf_text,"doQD%04x",cdev->private->sch_no); 3532 sprintf(dbf_text,"doQD%04x",cdev->private->schid.sch_no);
3533 QDIO_DBF_TEXT3(0,trace,dbf_text); 3533 QDIO_DBF_TEXT3(0,trace,dbf_text);
3534#endif /* CONFIG_QDIO_DEBUG */ 3534#endif /* CONFIG_QDIO_DEBUG */
3535 3535
diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c
index 6ed0985c0c91..c5ccd20b110c 100644
--- a/drivers/s390/crypto/ap_bus.c
+++ b/drivers/s390/crypto/ap_bus.c
@@ -449,8 +449,6 @@ static int ap_device_probe(struct device *dev)
449 449
450 ap_dev->drv = ap_drv; 450 ap_dev->drv = ap_drv;
451 rc = ap_drv->probe ? ap_drv->probe(ap_dev) : -ENODEV; 451 rc = ap_drv->probe ? ap_drv->probe(ap_dev) : -ENODEV;
452 if (rc)
453 ap_dev->unregistered = 1;
454 return rc; 452 return rc;
455} 453}
456 454
@@ -487,14 +485,7 @@ static int ap_device_remove(struct device *dev)
487 struct ap_device *ap_dev = to_ap_dev(dev); 485 struct ap_device *ap_dev = to_ap_dev(dev);
488 struct ap_driver *ap_drv = ap_dev->drv; 486 struct ap_driver *ap_drv = ap_dev->drv;
489 487
490 spin_lock_bh(&ap_dev->lock); 488 ap_flush_queue(ap_dev);
491 __ap_flush_queue(ap_dev);
492 /**
493 * set ->unregistered to 1 while holding the lock. This prevents
494 * new messages to be put on the queue from now on.
495 */
496 ap_dev->unregistered = 1;
497 spin_unlock_bh(&ap_dev->lock);
498 if (ap_drv->remove) 489 if (ap_drv->remove)
499 ap_drv->remove(ap_dev); 490 ap_drv->remove(ap_dev);
500 return 0; 491 return 0;
@@ -763,6 +754,7 @@ static void ap_scan_bus(void *data)
763 break; 754 break;
764 ap_dev->qid = qid; 755 ap_dev->qid = qid;
765 ap_dev->queue_depth = queue_depth; 756 ap_dev->queue_depth = queue_depth;
757 ap_dev->unregistered = 1;
766 spin_lock_init(&ap_dev->lock); 758 spin_lock_init(&ap_dev->lock);
767 INIT_LIST_HEAD(&ap_dev->pendingq); 759 INIT_LIST_HEAD(&ap_dev->pendingq);
768 INIT_LIST_HEAD(&ap_dev->requestq); 760 INIT_LIST_HEAD(&ap_dev->requestq);
@@ -784,7 +776,12 @@ static void ap_scan_bus(void *data)
784 /* Add device attributes. */ 776 /* Add device attributes. */
785 rc = sysfs_create_group(&ap_dev->device.kobj, 777 rc = sysfs_create_group(&ap_dev->device.kobj,
786 &ap_dev_attr_group); 778 &ap_dev_attr_group);
787 if (rc) 779 if (!rc) {
780 spin_lock_bh(&ap_dev->lock);
781 ap_dev->unregistered = 0;
782 spin_unlock_bh(&ap_dev->lock);
783 }
784 else
788 device_unregister(&ap_dev->device); 785 device_unregister(&ap_dev->device);
789 } 786 }
790} 787}
@@ -970,6 +967,8 @@ void ap_queue_message(struct ap_device *ap_dev, struct ap_message *ap_msg)
970 rc = __ap_queue_message(ap_dev, ap_msg); 967 rc = __ap_queue_message(ap_dev, ap_msg);
971 if (!rc) 968 if (!rc)
972 wake_up(&ap_poll_wait); 969 wake_up(&ap_poll_wait);
970 if (rc == -ENODEV)
971 ap_dev->unregistered = 1;
973 } else { 972 } else {
974 ap_dev->drv->receive(ap_dev, ap_msg, ERR_PTR(-ENODEV)); 973 ap_dev->drv->receive(ap_dev, ap_msg, ERR_PTR(-ENODEV));
975 rc = 0; 974 rc = 0;
@@ -1028,6 +1027,8 @@ static int __ap_poll_all(struct device *dev, void *data)
1028 spin_lock(&ap_dev->lock); 1027 spin_lock(&ap_dev->lock);
1029 if (!ap_dev->unregistered) { 1028 if (!ap_dev->unregistered) {
1030 rc = ap_poll_queue(to_ap_dev(dev), (unsigned long *) data); 1029 rc = ap_poll_queue(to_ap_dev(dev), (unsigned long *) data);
1030 if (rc)
1031 ap_dev->unregistered = 1;
1031 } else 1032 } else
1032 rc = 0; 1033 rc = 0;
1033 spin_unlock(&ap_dev->lock); 1034 spin_unlock(&ap_dev->lock);
@@ -1061,7 +1062,7 @@ static int ap_poll_thread(void *data)
1061 unsigned long flags; 1062 unsigned long flags;
1062 int requests; 1063 int requests;
1063 1064
1064 set_user_nice(current, -20); 1065 set_user_nice(current, 19);
1065 while (1) { 1066 while (1) {
1066 if (need_resched()) { 1067 if (need_resched()) {
1067 schedule(); 1068 schedule();
diff --git a/drivers/s390/net/iucv.c b/drivers/s390/net/iucv.c
index 809dd8d7f47a..1476ce2b437c 100644
--- a/drivers/s390/net/iucv.c
+++ b/drivers/s390/net/iucv.c
@@ -116,7 +116,7 @@ static DEFINE_SPINLOCK(iucv_irq_queue_lock);
116 *Internal function prototypes 116 *Internal function prototypes
117 */ 117 */
118static void iucv_tasklet_handler(unsigned long); 118static void iucv_tasklet_handler(unsigned long);
119static void iucv_irq_handler(struct pt_regs *, __u16); 119static void iucv_irq_handler(__u16);
120 120
121static DECLARE_TASKLET(iucv_tasklet,iucv_tasklet_handler,0); 121static DECLARE_TASKLET(iucv_tasklet,iucv_tasklet_handler,0);
122 122
@@ -2251,7 +2251,7 @@ iucv_sever(__u16 pathid, __u8 user_data[16])
2251 * Places the interrupt buffer on a queue and schedules iucv_tasklet_handler(). 2251 * Places the interrupt buffer on a queue and schedules iucv_tasklet_handler().
2252 */ 2252 */
2253static void 2253static void
2254iucv_irq_handler(struct pt_regs *regs, __u16 code) 2254iucv_irq_handler(__u16 code)
2255{ 2255{
2256 iucv_irqdata *irqdata; 2256 iucv_irqdata *irqdata;
2257 2257
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c
index 862a411a4aa0..c88babce9bca 100644
--- a/drivers/s390/scsi/zfcp_erp.c
+++ b/drivers/s390/scsi/zfcp_erp.c
@@ -1987,7 +1987,7 @@ zfcp_erp_adapter_strategy_open_qdio(struct zfcp_erp_action *erp_action)
1987 sbale = &(adapter->response_queue.buffer[i]->element[0]); 1987 sbale = &(adapter->response_queue.buffer[i]->element[0]);
1988 sbale->length = 0; 1988 sbale->length = 0;
1989 sbale->flags = SBAL_FLAGS_LAST_ENTRY; 1989 sbale->flags = SBAL_FLAGS_LAST_ENTRY;
1990 sbale->addr = 0; 1990 sbale->addr = NULL;
1991 } 1991 }
1992 1992
1993 ZFCP_LOG_TRACE("calling do_QDIO on adapter %s (flags=0x%x, " 1993 ZFCP_LOG_TRACE("calling do_QDIO on adapter %s (flags=0x%x, "