diff options
Diffstat (limited to 'drivers/s390/block/dasd_diag.c')
-rw-r--r-- | drivers/s390/block/dasd_diag.c | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/drivers/s390/block/dasd_diag.c b/drivers/s390/block/dasd_diag.c index 2b3bc3ec0541..266b34b55403 100644 --- a/drivers/s390/block/dasd_diag.c +++ b/drivers/s390/block/dasd_diag.c | |||
@@ -228,25 +228,22 @@ dasd_diag_term_IO(struct dasd_ccw_req * cqr) | |||
228 | } | 228 | } |
229 | 229 | ||
230 | /* Handle external interruption. */ | 230 | /* Handle external interruption. */ |
231 | static void | 231 | static void dasd_ext_handler(unsigned int ext_int_code, |
232 | dasd_ext_handler(__u16 code) | 232 | unsigned int param32, unsigned long param64) |
233 | { | 233 | { |
234 | struct dasd_ccw_req *cqr, *next; | 234 | struct dasd_ccw_req *cqr, *next; |
235 | struct dasd_device *device; | 235 | struct dasd_device *device; |
236 | unsigned long long expires; | 236 | unsigned long long expires; |
237 | unsigned long flags; | 237 | unsigned long flags; |
238 | u8 int_code, status; | ||
239 | addr_t ip; | 238 | addr_t ip; |
240 | int rc; | 239 | int rc; |
241 | 240 | ||
242 | int_code = *((u8 *) DASD_DIAG_LC_INT_CODE); | 241 | switch (ext_int_code >> 24) { |
243 | status = *((u8 *) DASD_DIAG_LC_INT_STATUS); | ||
244 | switch (int_code) { | ||
245 | case DASD_DIAG_CODE_31BIT: | 242 | case DASD_DIAG_CODE_31BIT: |
246 | ip = (addr_t) *((u32 *) DASD_DIAG_LC_INT_PARM_31BIT); | 243 | ip = (addr_t) param32; |
247 | break; | 244 | break; |
248 | case DASD_DIAG_CODE_64BIT: | 245 | case DASD_DIAG_CODE_64BIT: |
249 | ip = (addr_t) *((u64 *) DASD_DIAG_LC_INT_PARM_64BIT); | 246 | ip = (addr_t) param64; |
250 | break; | 247 | break; |
251 | default: | 248 | default: |
252 | return; | 249 | return; |
@@ -281,7 +278,7 @@ dasd_ext_handler(__u16 code) | |||
281 | cqr->stopclk = get_clock(); | 278 | cqr->stopclk = get_clock(); |
282 | 279 | ||
283 | expires = 0; | 280 | expires = 0; |
284 | if (status == 0) { | 281 | if ((ext_int_code & 0xff0000) == 0) { |
285 | cqr->status = DASD_CQR_SUCCESS; | 282 | cqr->status = DASD_CQR_SUCCESS; |
286 | /* Start first request on queue if possible -> fast_io. */ | 283 | /* Start first request on queue if possible -> fast_io. */ |
287 | if (!list_empty(&device->ccw_queue)) { | 284 | if (!list_empty(&device->ccw_queue)) { |
@@ -296,8 +293,8 @@ dasd_ext_handler(__u16 code) | |||
296 | } else { | 293 | } else { |
297 | cqr->status = DASD_CQR_QUEUED; | 294 | cqr->status = DASD_CQR_QUEUED; |
298 | DBF_DEV_EVENT(DBF_DEBUG, device, "interrupt status for " | 295 | DBF_DEV_EVENT(DBF_DEBUG, device, "interrupt status for " |
299 | "request %p was %d (%d retries left)", cqr, status, | 296 | "request %p was %d (%d retries left)", cqr, |
300 | cqr->retries); | 297 | (ext_int_code >> 16) & 0xff, cqr->retries); |
301 | dasd_diag_erp(device); | 298 | dasd_diag_erp(device); |
302 | } | 299 | } |
303 | 300 | ||