* Bugreports.to..: <Linux390@de.ibm.com>
* (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000, 2001
*
- * $Revision: 1.33 $
*/
#include <linux/timer.h>
struct DCTL_data {
- unsigned char subcommand; /* e.g Inhibit Write, Enable Write,... */
- unsigned char modifier; /* Subcommand modifier */
- unsigned short res; /* reserved */
+ unsigned char subcommand; /* e.g Inhibit Write, Enable Write,... */
+ unsigned char modifier; /* Subcommand modifier */
+ unsigned short res; /* reserved */
} __attribute__ ((packed));
/*
* Setup ERP to do the ERP action 4 (see Reference manual).
* Set the current request to PENDING to block the CQR queue for that device
* until the state change interrupt appears.
- * Use a timer (20 seconds) to retry the cqr if the interrupt is still missing.
+ * Use a timer (20 seconds) to retry the cqr if the interrupt is still
+ * missing.
*
* PARAMETER
* sense sense data of the actual error
/* interrupt (this enables easier enqueing of the cqr) */
if (erp->function != dasd_3990_erp_action_4) {
- DEV_MESSAGE(KERN_INFO, device,
- "dasd_3990_erp_action_4: first time retry"
- "%s", " ");
+ DEV_MESSAGE(KERN_INFO, device, "%s",
+ "dasd_3990_erp_action_4: first time retry");
erp->retries = 256;
erp->function = dasd_3990_erp_action_4;
dasd_3990_erp_block_queue(erp, 30*HZ);
+ } else if (sense[25] == 0x1E) { /* busy */
+ DEV_MESSAGE(KERN_INFO, device,
+ "busy - redriving request later, "
+ "%d retries left",
+ erp->retries);
+ dasd_3990_erp_block_queue(erp, HZ);
} else {
/* no state change pending - retry */
}
break;
- case 0x50: /* Format 5 - Data Check with displacement information */
+ case 0x50: /* Format 5 - Data Check with displacement information */
switch (msg_no) {
case 0x00:
DEV_MESSAGE(KERN_WARNING, device, "%s",
}
break;
- case 0x60: /* Format 6 - Usage Statistics/Overrun Errors */
+ case 0x60: /* Format 6 - Usage Statistics/Overrun Errors */
switch (msg_no) {
case 0x00:
DEV_MESSAGE(KERN_WARNING, device, "%s",
}
break;
- case 0x70: /* Format 7 - Device Connection Control Checks */
+ case 0x70: /* Format 7 - Device Connection Control Checks */
switch (msg_no) {
case 0x00:
DEV_MESSAGE(KERN_WARNING, device, "%s",
}
break;
- case 0x80: /* Format 8 - Additional Device Equipment Checks */
+ case 0x80: /* Format 8 - Additional Device Equipment Checks */
switch (msg_no) {
case 0x00: /* No Message */
case 0x01:
}
break;
- case 0x90: /* Format 9 - Device Read, Write, and Seek Checks */
+ case 0x90: /* Format 9 - Device Read, Write, and Seek Checks */
switch (msg_no) {
case 0x00:
break; /* No Message */
case 0x0B:
DEV_MESSAGE(KERN_WARNING, device, "%s",
"FORMAT F - Volume is suspended duplex");
+ /* call extended error reporting (EER) */
+ dasd_eer_write(device, erp->refers,
+ DASD_EER_PPRCSUSPEND);
break;
case 0x0C:
DEV_MESSAGE(KERN_WARNING, device, "%s",
"fetch mode active");
/* not possible to handle this situation in Linux */
- panic("No way to inform appliction about the possibly "
- "incorret data");
+ panic("No way to inform application about the possibly "
+ "incorrect data");
} else if (sense[2] & SNS2_ENV_DATA_PRESENT) {
erp = dasd_3990_erp_int_req(erp);
break;
- case 0x0F: /* length mismatch during update write command */
+ case 0x0F: /* length mismatch during update write command */
DEV_MESSAGE(KERN_ERR, device, "%s",
"update write command error - should not "
"happen;\n"
erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
break;
- case 0x10: /* logging required for other channel program */
+ case 0x10: /* logging required for other channel program */
erp = dasd_3990_erp_action_10_32(erp, sense);
break;
/* not possible to handle this situation in Linux */
panic
- ("Invalid data - No way to inform appliction about "
- "the possibly incorret data");
+ ("Invalid data - No way to inform application "
+ "about the possibly incorrect data");
break;
case 0x1D: /* state-change pending */
erp = dasd_3990_erp_action_4(erp, sense);
break;
+ case 0x1E: /* busy */
+ DEV_MESSAGE(KERN_DEBUG, device, "%s",
+ "Busy condition exists "
+ "for the subsystem or device");
+ erp = dasd_3990_erp_action_4(erp, sense);
+ break;
+
default: /* all others errors - default erp */
break;
}
/* inspect the 32 byte sense data */
erp_new = dasd_3990_erp_inspect_32(erp, sense);
- } /* end distinguish between 24 and 32 byte sense data */
+ } /* end distinguish between 24 and 32 byte sense data */
return erp_new;
-
-} /* END dasd_3990_erp_inspect */
+}
/*
* DASD_3990_ERP_ADD_ERP
erp = dasd_3990_erp_compound(erp, sense);
} else {
- /* no retry left and no additional special handling necessary */
+ /* No retry left and no additional special handling */
+ /*necessary */
DEV_MESSAGE(KERN_ERR, device,
"no retries left for erp %p - "
"set status to FAILED", erp);