⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tape34xx.c

📁 ARM S3C2410 linux2.4 内核源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	    tape34xx_error_recovery_has_failed(ti,EIO);	    return;	case TS_LBL_INIT:	    // Block could not be located.	    tape34xx_error_recovery_has_failed(ti,EIO);	    return;	case TS_RFO_INIT:	    // Try to read beyond end of recorded area -> 0 bytes read	    tape34xx_error_recovery_has_failed(ti,0);	    return;	}    // Sensing special bits    if (sense[0]&SENSE_BUS_OUT_CHECK) {	tape34xx_error_recovery_do_retry(ti);	return;    }    if (sense[0]&SENSE_DATA_CHECK) {	// hardware failure, damaged tape or improper operating conditions	switch (sense[3]) {	case 0x23:	    // a read data check occurred	    if ((sense[2]&SENSE_TAPE_SYNC_MODE) ||		(inhibit_cu_recovery)) {		// data check is not permanent, may be recovered. 		// We always use async-mode with cu-recovery, so this should *never* happen.		tape34xx_error_recovery_HWBUG(ti,2);		return;	    } else {		// data check is permanent, CU recovery has failed		PRINT_WARN("Permanent read error, recovery failed!\n");		tape34xx_error_recovery_has_failed(ti,EIO);		return;	    }	case 0x25:	    // a write data check occurred	    if ((sense[2]&SENSE_TAPE_SYNC_MODE) ||		(inhibit_cu_recovery)) {		// data check is not permanent, may be recovered.		// We always use async-mode with cu-recovery, so this should *never* happen.		tape34xx_error_recovery_HWBUG(ti,3);		return;	    } else {		// data check is permanent, cu-recovery has failed		PRINT_WARN("Permanent write error, recovery failed!\n");		tape34xx_error_recovery_has_failed(ti,EIO);		return;	    }	case 0x26:	    // Data Check (read opposite) occurred. We'll recover this.	    tape34xx_error_recovery_read_opposite(ti);	    return;	case 0x28:	    // The ID-Mark at the beginning of the tape could not be written. This is fatal, we'll report and exit.	    PRINT_WARN("ID-Mark could not be written. Check your hardware!\n");	    tape34xx_error_recovery_has_failed(ti,EIO);	    return;	case 0x31:	    // Tape void. Tried to read beyond end of device. We'll report and exit.	    PRINT_WARN("Try to read beyond end of recorded area!\n");	    tape34xx_error_recovery_has_failed(ti,ENOSPC);	    return;	case 0x41:	    // Record sequence error. cu detected incorrect block-id sequence on tape. We'll report and exit.	    PRINT_WARN("Illegal block-id sequence found!\n");	    tape34xx_error_recovery_has_failed(ti,EIO);	    return;	    default:	    // well, all data checks for 3480 should result in one of the above erpa-codes. if not -> bug	    // On 3490, other data-check conditions do exist.		if (cu_type==0x3480) {		    tape34xx_error_recovery_HWBUG(ti,4);		    return;		}	}    }    if (sense[0]&SENSE_OVERRUN) {	// A data overrun between cu and drive occurred. The channel speed is to slow! We'll report this and exit!	switch (sense[3]) {	case 0x40: // overrun error	    PRINT_WARN ("Data overrun error between control-unit and drive. Use a faster channel connection, if possible! \n");	    tape34xx_error_recovery_has_failed(ti,EIO);	    return;	default:	    // Overrun bit is set, but erpa does not show overrun error. This is a bug.	    tape34xx_error_recovery_HWBUG(ti,5);	    return;	}    }    if (sense[1]&SENSE_RECORD_SEQUENCE_ERR) {	switch (sense[3]) {	case 0x41:	    // Record sequence error. cu detected incorrect block-id sequence on tape. We'll report and exit.	    PRINT_WARN("Illegal block-id sequence found!\n");	    tape34xx_error_recovery_has_failed(ti,EIO);	    return;	default:	    // Record sequence error bit is set, but erpa does not show record sequence error. This is a bug.	    tape34xx_error_recovery_HWBUG(ti,6);	    return;	}    }    // Sensing erpa codes    switch (sense[3]) {    case 0x00:	// Everything is fine, but we got a unit check. Report and ignore!	PRINT_WARN ("Non-error sense was found. Unit-check will be ignored, expect errors...\n");	return;    case 0x21:	// Data streaming not operational. Cu switches to interlock mode, we reissue the command.	PRINT_WARN ("Data streaming not operational. Switching to interlock-mode! \n");	tape34xx_error_recovery_do_retry(ti);	return;    case 0x22:	// Path equipment check. Might be drive adapter error, buffer error on the lower interface, internal path not useable, or error during cartridge load.	// All of the above are not recoverable	PRINT_WARN ("A path equipment check occurred. One of the following conditions occurred:\n");	PRINT_WARN ("drive adapter error,buffer error on the lower interface, internal path not useable, error during cartridge load.\n");	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x23:	// Read data check. Should have been be covered earlier -> Bug!	tape34xx_error_recovery_HWBUG(ti,7);	return;    case 0x24:	// Load display check. Load display was command was issued, but the drive is displaying a drive check message. Can be threated as "device end".	tape34xx_error_recovery_succeded(ti);	return;    case 0x25:	// Write data check. Should have been covered earlier -> Bug!	tape34xx_error_recovery_HWBUG(ti,8);	return;    case 0x26:	// Data check (read opposite). Should have been covered earlier -> Bug!	tape34xx_error_recovery_HWBUG(ti,9);	return;    case 0x27:	// Command reject. May indicate illegal channel program or buffer over/underrun. 	// Since all channel programms are issued by this driver and ought be correct,	// we assume a over/underrun situaltion and retry the channel program.	tape34xx_error_recovery_do_retry(ti);	return;    case 0x28:	// Write id mark check. Should have beed covered earlier -> bug!	tape34xx_error_recovery_HWBUG(ti,10);	return;    case 0x29:	// Function incompatible. Either idrc is on but hardware not capable doing idrc 	// or a perform subsystem func is issued and the cu is not online. Anyway, this 	// cannot be recovered and is an I/O error.	PRINT_WARN ("Function incompatible. Try to switch off idrc! \n");	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x2a:	// Unsolicited environmental data. An internal counter overflows, we can ignore	// this and reissue the cmd.	tape34xx_error_recovery_do_retry(ti);	return;    case 0x2b:	// Environmental data present. Indicates either unload completed ok or read buffered 	// log command completed ok. 	if (tapestate_get(ti)==TS_RUN_INIT) {	    // Rewind unload completed ok.	    tape34xx_error_recovery_succeded(ti);	    return;	}	// Since we do not issue read buffered log commands, this should never occur -> bug.	tape34xx_error_recovery_HWBUG(ti,11);	return;    case 0x2c:	// Permanent equipment check. cu has tried recovery, but did not succeed. This is an	// I/O error.	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x2d:	// Data security erase failure.	if (tapestate_get(ti)==TS_DSE_INIT) {	    // report an I/O error	    tape34xx_error_recovery_has_failed(ti,EIO);	    return;	}	// Data security erase failure, but no such command issued. This is a bug.	tape34xx_error_recovery_HWBUG(ti,12);	return;    case 0x2e:	// Not capable. This indicates either that the drive fails reading the format id mark	// or that that format specified is not supported by the drive. We write a message and	// return an I/O error.	PRINT_WARN("Drive not capable processing the tape format!");	tape34xx_error_recovery_has_failed(ti,EMEDIUMTYPE);	return;    case 0x2f:	// This erpa is reserved. This is a bug.	tape34xx_error_recovery_HWBUG(ti,13);	return;    case 0x30:	// The medium is write protected, while trying to write on it. We'll report this.	PRINT_WARN("Medium is write protected!\n");	tape34xx_error_recovery_has_failed(ti,EACCES);	return;    case 0x31:	// Tape void. Should have beed covered ealier -> bug	tape34xx_error_recovery_HWBUG(ti,14);	return;    case 0x32:	// Tension loss. We cannot recover this, it's an I/O error.	PRINT_WARN("The drive lost tape tension.\n");	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x33:	// Load Failure. The catridge was not inserted correctly or the tape is not threaded	// correctly. We cannot recover this, the user has to reload the catridge.	PRINT_WARN("Cartridge load failure. Reload the cartridge and try again.\n");	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x34:	// Unload failure. The drive cannot maintain tape tension and control tape movement 	// during an unload operation. 	PRINT_WARN("Failure during cartridge unload. Please try manually.\n");	if (tapestate_get(ti)!=TS_RUN_INIT) {	    tape34xx_error_recovery_HWBUG(ti,15);	    return;	}	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x35:	// Drive equipment check. One of the following:	// - cu cannot recover from a drive detected error	// - a check code message is displayed on drive message/load displays	// - the cartridge loader does not respond correctly	// - a failure occurs during an index, load, or unload cycle	PRINT_WARN("Equipment check! Please check the drive and the cartridge loader.\n");	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x36:	switch (cu_type) {	case 0x3480:	    // This erpa is reserved for 3480 -> BUG	    tape34xx_error_recovery_HWBUG(ti,16);	    return;	case 0x3490:	    // End of data. This is a permanent I/O error, which cannot be recovered.	    // A read-type command has reached the end-of-data mark.	    tape34xx_error_recovery_has_failed(ti,EIO);	    return;	}    case 0x37:	// Tape length error. The tape is shorter than reported in the beginning-of-tape data.	PRINT_WARN("Tape length error.\n");	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x38:	// Physical end of tape. A read/write operation reached the physical end of tape.	if (tapestate_get(ti)==TS_WRI_INIT ||	    tapestate_get(ti)==TS_DSE_INIT ||	    tapestate_get(ti)==TS_EGA_INIT ||	    tapestate_get(ti)==TS_WTM_INIT){ 	    tape34xx_error_recovery_has_failed(ti,ENOSPC);	} else {	    tape34xx_error_recovery_has_failed(ti,EIO);	}	return;    case 0x39:	// Backward at BOT. The drive is at BOT and is requestet to move backward.	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x3a:	// Drive switched not ready, but the command needs the drive to be ready.	PRINT_WARN("Drive not ready. Turn the ready/not ready switch to ready position and try again.\n");	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x3b:	// Manual rewind or unload. This causes an I/O error.	PRINT_WARN("Medium was rewound or unloaded manually. Expect errors! Please do only use the mtoffl and mtrew ioctl to unload tapes or rewind tapes.\n");	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x3c:    case 0x3d:    case 0x3e:    case 0x3f:	// These erpas are reserved -> BUG	tape34xx_error_recovery_HWBUG(ti,17);	return;    case 0x40:	// Overrun error. This should have been covered earlier -> bug.	tape34xx_error_recovery_HWBUG(ti,18);	return;    case 0x41:	// Record sequence error. This should have been covered earlier -> bug.	tape34xx_error_recovery_HWBUG(ti,19);	return;    case 0x42:	// Degraded mode. A condition that can cause degraded performace is detected.	PRINT_WARN("Subsystem is running in degraded mode. This may compromise your performace.\n");	tape34xx_error_recovery_do_retry(ti);	return;    case 0x43:	// Drive not ready. Probably swith the ready/not ready switch to ready?	PRINT_WARN("The drive is not ready. Maybe no medium in?\n");	tape34xx_error_recovery_has_failed(ti,ENOMEDIUM);	return;    case 0x44:	// Locate Block unsuccessfull. We'll report this.	if ((tapestate_get(ti)!=TS_BLOCK_INIT) &&	    (tapestate_get(ti)!=TS_LBL_INIT)) {	    tape34xx_error_recovery_HWBUG(ti,20); // No locate block was issued...	    return;	}	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x45:	// The drive is assigned elsewhere [to a different channel path/computer].	PRINT_WARN("The drive is assigned elsewhere.\n");	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x46:	// Drive not online. Drive may be switched offline, the power supply may be switched off 	// or the drive address may not be set correctly.	PRINT_WARN("The drive is not online.");	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x47:	// Volume fenced. cu reports volume integrity is lost! 	PRINT_WARN("Volume fenced. The volume integrity is lost! \n");	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x48:	// Log sense data and retry request. We'll do so...	tape34xx_error_recovery_do_retry(ti);	return;    case 0x49:	// Bus out check. A parity check error on the bus was found.	PRINT_WARN("Bus out check. A data transfer over the bus was corrupted.\n");	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x4a:	// Control unit erp failed. We'll report this.	PRINT_WARN("The control unit failed recovering an I/O error.\n");	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x4b:	// Cu and drive incompatible. The drive requests micro-program patches, which are not available on the cu.	PRINT_WARN("The drive needs microprogram patches from the control unit, which are not available.\n");	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x4c:	// Recovered Check-One failure. Cu develops a hardware error, but is able to recover. We'll reissue the command.	tape34xx_error_recovery_do_retry(ti);	return;    case 0x4d:	switch (cu_type) {	case 0x3480:	    // This erpa is reserved for 3480 -> bug      	    tape34xx_error_recovery_HWBUG(ti,21);	    return;	case 0x3490:	    // Resetting event recieved. Since the driver does not support resetting event recovery	    // (which has to be handled by the I/O Layer), we'll report and retry our command.	    tape34xx_error_recovery_do_retry(ti);	    return;	}    case 0x4e:	switch (cu_type) {	case 0x3480:	    // This erpa is reserved for 3480 -> bug.	    tape34xx_error_recovery_HWBUG(ti,22);	    return;	case 0x3490:	    // Maximum block size exeeded. This indicates, that the block to be written is larger	    // than allowed for buffered mode. We'll report this...	    PRINT_WARN("Maximum block size for buffered mode exceeded.\n");	    tape34xx_error_recovery_has_failed(ti,ENOBUFS);	    return;	}    case 0x4f:	// These erpas are reserved -> bug	tape34xx_error_recovery_HWBUG(ti,23);	return;    case 0x50:	// Read buffered log (Overflow). Cu is running in extended beffered log mode, and a counter overflows.	// This should never happen, since we're never running in extended buffered log mode -> bug.	tape34xx_error_recovery_do_retry(ti);	return;    case 0x51:	// Read buffered log (EOV). EOF processing occurs while the cu is in extended buffered log mode.	// This should never happen, since we're never running in extended buffered log mode -> bug.	tape34xx_error_recovery_do_retry(ti);	return;    case 0x52:	// End of Volume complete. Rewind unload completed ok. We'll report to the user...	if (tapestate_get(ti)!=TS_RUN_INIT) {	    tape34xx_error_recovery_HWBUG(ti,24);	    return;	}	tape34xx_error_recovery_succeded(ti);	return;    case 0x53:	// Global command intercept. We'll have to reissue our command.	tape34xx_error_recovery_do_retry(ti);	return;    case 0x54:	// Channel interface recovery (temporary). This can be recovered by reissuing the command.	tape34xx_error_recovery_do_retry(ti);	return;    case 0x55:	// Channel interface recovery (permanent). This cannot be recovered, we'll inform the user.	PRINT_WARN("A permanent channel interface error occurred.\n");	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x56:	// Channel protocol error. This cannot be recovered.	PRINT_WARN("A channel protocol error occurred.\n");	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x57:	switch (cu_type) {	case 0x3480:	    // Attention intercept. We have to reissue the command.	    PRINT_WARN("An attention intercept occurred, which will be recovered.\n");	    tape34xx_error_recovery_do_retry(ti);	    return;	case 0x3490:	    // Global status intercept. We have to reissue the command.	    PRINT_WARN("An global status intercept was recieved, which will be recovered.\n");	    tape34xx_error_recovery_do_retry(ti);	    return;	}    case 0x58:    case 0x59:	// These erpas are reserved -> bug.	tape34xx_error_recovery_HWBUG(ti,25);	return;    case 0x5a:	// Tape length incompatible. The tape inserted is too long, 	// which could cause damage to the tape or the drive.	PRINT_WARN("Tape length incompatible [should be IBM Cartridge System Tape]. May cause damage to drive or tape.n");	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x5b:	// Format 3480 XF incompatible	if (sense[1]&SENSE_BEGINNING_OF_TAPE) {	    // Everything is fine. The tape will be overwritten in a different format.	    tape34xx_error_recovery_do_retry(ti);	    return;	}	PRINT_WARN("Tape format is incompatible to the drive, which writes 3480-2 XF.\n");	tape34xx_error_recovery_has_failed(ti,EIO);	return;    case 0x5c:	// Format 3480-2 XF incompatible	PRINT_WARN("Tape format i

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -