/* 
 * File...........: linux/drivers/s390/block/dasd_3370_erp.c
 * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com>
 * Bugreports.to..: <Linux390@de.ibm.com>
 * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000
 *
 * $Revision: 1.9 $
 */

#define PRINTK_HEADER "dasd_erp(3370)"

#include "dasd_int.h"


/*
 * DASD_3370_ERP_EXAMINE 
 *
 * DESCRIPTION
 *   Checks only for fatal/no/recover error. 
 *   A detailed examination of the sense data is done later outside
 *   the interrupt handler.
 *
 *   The logic is based on the 'IBM 3880 Storage Control Reference' manual
 *   'Chapter 7. 3370 Sense Data'.
 *
 * RETURN VALUES
 *   dasd_era_none	no error 
 *   dasd_era_fatal	for all fatal (unrecoverable errors)
 *   dasd_era_recover	for all others.
 */
dasd_era_t
dasd_3370_erp_examine(struct dasd_ccw_req * cqr, struct irb * irb)
{
	char *sense = irb->ecw;

	/* check for successful execution first */
	if (irb->scsw.cstat == 0x00 &&
	    irb->scsw.dstat == (DEV_STAT_CHN_END | DEV_STAT_DEV_END))
		return dasd_era_none;
	if (sense[0] & 0x80) {	/* CMD reject */
		return dasd_era_fatal;
	}
	if (sense[0] & 0x40) {	/* Drive offline */
		return dasd_era_recover;
	}
	if (sense[0] & 0x20) {	/* Bus out parity */
		return dasd_era_recover;
	}
	if (sense[0] & 0x10) {	/* equipment check */
		if (sense[1] & 0x80) {
			return dasd_era_fatal;
		}
		return dasd_era_recover;
	}
	if (sense[0] & 0x08) {	/* data check */
		if (sense[1] & 0x80) {
			return dasd_era_fatal;
		}
		return dasd_era_recover;
	}
	if (sense[0] & 0x04) {	/* overrun */
		if (sense[1] & 0x80) {
			return dasd_era_fatal;
		}
		return dasd_era_recover;
	}
	if (sense[1] & 0x40) {	/* invalid blocksize */
		return dasd_era_fatal;
	}
	if (sense[1] & 0x04) {	/* file protected */
		return dasd_era_recover;
	}
	if (sense[1] & 0x01) {	/* operation incomplete */
		return dasd_era_recover;
	}
	if (sense[2] & 0x80) {	/* check data erroor */
		return dasd_era_recover;
	}
	if (sense[2] & 0x10) {	/* Env. data present */
		return dasd_era_recover;
	}
	/* examine the 24 byte sense data */
	return dasd_era_recover;

}				/* END dasd_3370_erp_examine */

/*
 * Overrides for Emacs so that we follow Linus's tabbing style.
 * Emacs will notice this stuff at the end of the file and automatically
 * adjust the settings for this buffer only.  This must remain at the end
 * of the file.
 * ---------------------------------------------------------------------------
 * Local variables:
 * c-indent-level: 4 
 * c-brace-imaginary-offset: 0
 * c-brace-offset: -4
 * c-argdecl-indent: 4
 * c-label-offset: -4
 * c-continued-statement-offset: 4
 * c-continued-brace-offset: 0
 * indent-tabs-mode: 1
 * tab-width: 8
 * End:
 */
