diff options
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/block/dasd.c | 1 | ||||
-rw-r--r-- | drivers/s390/block/dasd_diag.c | 2 | ||||
-rw-r--r-- | drivers/s390/char/ctrlchar.c | 2 | ||||
-rw-r--r-- | drivers/s390/char/keyboard.c | 2 | ||||
-rw-r--r-- | drivers/s390/char/monwriter.c | 24 | ||||
-rw-r--r-- | drivers/s390/char/sclp.c | 4 | ||||
-rw-r--r-- | drivers/s390/cio/chsc.c | 48 | ||||
-rw-r--r-- | drivers/s390/cio/cio.c | 10 | ||||
-rw-r--r-- | drivers/s390/cio/css.c | 2 | ||||
-rw-r--r-- | drivers/s390/cio/css.h | 7 | ||||
-rw-r--r-- | drivers/s390/cio/device.c | 48 | ||||
-rw-r--r-- | drivers/s390/cio/device.h | 1 | ||||
-rw-r--r-- | drivers/s390/cio/device_fsm.c | 119 | ||||
-rw-r--r-- | drivers/s390/cio/device_id.c | 14 | ||||
-rw-r--r-- | drivers/s390/cio/device_ops.c | 20 | ||||
-rw-r--r-- | drivers/s390/cio/device_pgid.c | 31 | ||||
-rw-r--r-- | drivers/s390/cio/device_status.c | 7 | ||||
-rw-r--r-- | drivers/s390/cio/qdio.c | 12 | ||||
-rw-r--r-- | drivers/s390/crypto/ap_bus.c | 25 | ||||
-rw-r--r-- | drivers/s390/net/iucv.c | 4 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_erp.c | 2 |
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. */ |
220 | static void | 220 | static void |
221 | dasd_ext_handler(struct pt_regs *regs, __u16 code) | 221 | dasd_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; | |||
20 | static void | 20 | static void |
21 | ctrlchar_handle_sysrq(void *tty) | 21 | ctrlchar_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 | ||
26 | static DECLARE_WORK(ctrlchar_work, ctrlchar_handle_sysrq, NULL); | 26 | static 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 | ||
28 | static int mon_max_bufs = 255; | 28 | static int mon_max_bufs = 255; |
29 | static int mon_buf_count; | ||
29 | 30 | ||
30 | struct mon_buf { | 31 | struct 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. */ |
326 | static void | 326 | static void |
327 | sclp_interrupt_handler(struct pt_regs *regs, __u16 code) | 327 | sclp_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. */ |
745 | static void | 745 | static void |
746 | sclp_check_handler(struct pt_regs *regs, __u16 code) | 746 | sclp_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) | |||
620 | static int | 624 | static 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 | ||
703 | static inline int | 710 | static 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. */ |
173 | int device_is_online(struct subchannel *); | 172 | int device_is_online(struct subchannel *); |
174 | void device_set_waiting(struct subchannel *); | 173 | void device_kill_io(struct subchannel *); |
175 | 174 | ||
176 | /* Machine check helper function. */ | 175 | /* Machine check helper function. */ |
177 | void device_kill_pending_timer(struct subchannel *); | 176 | void 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 | ||
554 | struct match_data { | 554 | struct 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 | ||
560 | static int | 559 | static int |
561 | match_devno(struct device * dev, void * data) | 560 | match_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 | ||
577 | static struct ccw_device * | 575 | static struct ccw_device * get_disc_ccwdev_by_dev_id(struct ccw_dev_id *dev_id, |
578 | get_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 | ||
62 | void | ||
63 | device_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 | |||
985 | static void | ||
986 | ccw_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 | ||
1019 | static void | 982 | void device_kill_io(struct subchannel *sch) |
1020 | ccw_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) | |||
586 | int | 590 | int |
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 | ||
592 | int | 596 | int |
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) | |||
554 | void | 562 | void |
555 | ccw_device_disband_start(struct ccw_device *cdev) | 563 | ccw_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 | */ |
118 | static void iucv_tasklet_handler(unsigned long); | 118 | static void iucv_tasklet_handler(unsigned long); |
119 | static void iucv_irq_handler(struct pt_regs *, __u16); | 119 | static void iucv_irq_handler(__u16); |
120 | 120 | ||
121 | static DECLARE_TASKLET(iucv_tasklet,iucv_tasklet_handler,0); | 121 | static 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 | */ |
2253 | static void | 2253 | static void |
2254 | iucv_irq_handler(struct pt_regs *regs, __u16 code) | 2254 | iucv_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, " |