aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/block/dasd_diag.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/s390/block/dasd_diag.c')
-rw-r--r--drivers/s390/block/dasd_diag.c19
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. */
231static void 231static void dasd_ext_handler(unsigned int ext_int_code,
232dasd_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