|
@@ -228,25 +228,22 @@ dasd_diag_term_IO(struct dasd_ccw_req * cqr)
|
|
|
}
|
|
|
|
|
|
/* Handle external interruption. */
|
|
|
-static void
|
|
|
-dasd_ext_handler(__u16 code)
|
|
|
+static void dasd_ext_handler(unsigned int ext_int_code,
|
|
|
+ unsigned int param32, unsigned long param64)
|
|
|
{
|
|
|
struct dasd_ccw_req *cqr, *next;
|
|
|
struct dasd_device *device;
|
|
|
unsigned long long expires;
|
|
|
unsigned long flags;
|
|
|
- u8 int_code, status;
|
|
|
addr_t ip;
|
|
|
int rc;
|
|
|
|
|
|
- int_code = *((u8 *) DASD_DIAG_LC_INT_CODE);
|
|
|
- status = *((u8 *) DASD_DIAG_LC_INT_STATUS);
|
|
|
- switch (int_code) {
|
|
|
+ switch (ext_int_code >> 24) {
|
|
|
case DASD_DIAG_CODE_31BIT:
|
|
|
- ip = (addr_t) *((u32 *) DASD_DIAG_LC_INT_PARM_31BIT);
|
|
|
+ ip = (addr_t) param32;
|
|
|
break;
|
|
|
case DASD_DIAG_CODE_64BIT:
|
|
|
- ip = (addr_t) *((u64 *) DASD_DIAG_LC_INT_PARM_64BIT);
|
|
|
+ ip = (addr_t) param64;
|
|
|
break;
|
|
|
default:
|
|
|
return;
|
|
@@ -281,7 +278,7 @@ dasd_ext_handler(__u16 code)
|
|
|
cqr->stopclk = get_clock();
|
|
|
|
|
|
expires = 0;
|
|
|
- if (status == 0) {
|
|
|
+ if ((ext_int_code & 0xff0000) == 0) {
|
|
|
cqr->status = DASD_CQR_SUCCESS;
|
|
|
/* Start first request on queue if possible -> fast_io. */
|
|
|
if (!list_empty(&device->ccw_queue)) {
|
|
@@ -296,8 +293,8 @@ dasd_ext_handler(__u16 code)
|
|
|
} else {
|
|
|
cqr->status = DASD_CQR_QUEUED;
|
|
|
DBF_DEV_EVENT(DBF_DEBUG, device, "interrupt status for "
|
|
|
- "request %p was %d (%d retries left)", cqr, status,
|
|
|
- cqr->retries);
|
|
|
+ "request %p was %d (%d retries left)", cqr,
|
|
|
+ (ext_int_code >> 16) & 0xff, cqr->retries);
|
|
|
dasd_diag_erp(device);
|
|
|
}
|
|
|
|