NT4/private/ntos/dd/qic117/0x11032.c
2020-09-30 17:12:29 +02:00

276 lines
7.8 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*****************************************************************************
*
* COPYRIGHT 1993 - COLORADO MEMORY SYSTEMS, INC.
* ALL RIGHTS RESERVED.
*
******************************************************************************
*
* FILE: \SE\DRIVER\DEVICE\JUMBO\SRC\0X11032.C
*
* FUNCTION: cqd_ProcessFRB
*
* PURPOSE: Determine type of I/O operation being requested, Call appropriate
* subroutines.
*
* In block mode operation this routine returns when done processing
* the queue. However, in concurrent operation (task switching or
* non-block mode) the routine NEVER returns. Therefore, it is up
* to ClearIO to stop the task.
*
* HISTORY:
* $Log: J:\se.vcs\driver\q117cd\src\0x11032.c $
*
* Rev 1.20 26 Apr 1995 15:12:46 derekhan
* added vendor
*
* Rev 1.19 26 Apr 1995 12:23:26 derekhan
* merge iomega fix
*
* Rev 1.18 13 Jul 1994 07:27:22 CRAIGOGA
* Added check for CMD_LOCATE_DEVICE if not configured or not selected.
*
* Rev 1.17 03 Jun 1994 15:30:14 BOBLEHMA
* Added a CmdSelectDevice before calling StopTape (practicing safe computing).
*
* Rev 1.16 20 May 1994 10:07:34 BOBLEHMA
* Added a stop tape call for an abort level 0. The stop tape was removed from
* deselect device so now call stop tape before the deselect device function.
*
* Rev 1.15 22 Mar 1994 15:33:34 CHETDOUG
* Format command should not enter format mode
* until after doing the calibrate tape length.
*
* Rev 1.14 22 Mar 1994 15:23:36 KEVINKES
* Modified set mode case statement to not attempt to set
* the mode on a select or a report cfg.
*
* Rev 1.13 01 Feb 1994 12:31:02 KEVINKES
* Modified debug code.
*
* Rev 1.12 27 Jan 1994 15:49:14 KEVINKES
* Modified debug code.
*
* Rev 1.11 20 Jan 1994 09:47:14 KEVINKES
* Added code to reset the FDC if the controller was just claimed
* since we don't know what state it's in.
*
* Rev 1.10 19 Jan 1994 14:05:18 KEVINKES
* Fixed a pointer mismatch.
*
* Rev 1.9 19 Jan 1994 14:02:30 KEVINKES
* Added code to always try to get the FDC.
*
* Rev 1.8 18 Jan 1994 16:19:24 KEVINKES
* Updated debug code.
*
* Rev 1.7 11 Jan 1994 15:16:14 KEVINKES
* Cleaned up the abort handling code to always process the abort even if
* there is no ERR_ABORT returned from DispatchFRB.
*
* Rev 1.6 22 Dec 1993 19:06:40 KEVINKES
* Modified so that a puase tape is issued after a LEVEL_1 Abort.
*
* Rev 1.5 15 Dec 1993 11:37:42 KEVINKES
* Added code to check for a persistent new tape status and return a
* new tape error.
*
* Rev 1.4 23 Nov 1993 18:46:52 KEVINKES
* Removed initialization for the kdi_context.
*
* Rev 1.3 15 Nov 1993 16:20:22 KEVINKES
* Added abort handling.
*
* Rev 1.2 25 Oct 1993 14:30:26 KEVINKES
* Modified so that the check for device selected only occurs if
* the device is configured.
*
* Rev 1.1 19 Oct 1993 15:12:56 KEVINKES
* Chenged DEVICE_NOT_SELECTED error test to check for
* CMD_SELECT_DEVICE AND CMD_REPORT_DEVICE_CFG.
*
* Rev 1.0 18 Oct 1993 17:24:36 KEVINKES
* Initial Revision.
*
*****************************************************************************/
#define FCT_ID 0x11032
#include "include\public\adi_api.h"
#include "include\public\frb_api.h"
#include "include\public\vendor.h"
#include "include\private\kdi_pub.h"
#include "include\private\cqd_pub.h"
#include "q117cd\include\cqd_defs.h"
#include "q117cd\include\cqd_strc.h"
#include "q117cd\include\cqd_hdr.h"
/*endinclude*/
dStatus cqd_ProcessFRB
(
/* INPUT PARAMETERS: */
dVoidPtr cqd_context,
/* UPDATE PARAMETERS: */
dVoidPtr frb
/* OUTPUT PARAMETERS: */
)
/* COMMENTS: *****************************************************************
*
* DEFINITIONS: *************************************************************/
{
/* DATA: ********************************************************************/
dStatus status=DONT_PANIC; /* dStatus or error condition.*/
/* CODE: ********************************************************************/
((CqdContextPtr)cqd_context)->no_pause = dFALSE;
if (kdi_ReportAbortStatus(((CqdContextPtr)cqd_context)->kdi_context) !=
NO_ABORT_PENDING) {
status = kdi_Error(ERR_ABORT, FCT_ID, ERR_SEQ_1);
}
if (status == DONT_PANIC) {
if ( !((CqdContextPtr)cqd_context)->configured &&
(((ADIRequestHdrPtr)frb)->driver_cmd != CMD_REPORT_DEVICE_CFG) &&
(((ADIRequestHdrPtr)frb)->driver_cmd != CMD_LOCATE_DEVICE) ) {
status = kdi_Error(ERR_DEVICE_NOT_CONFIGURED, FCT_ID, ERR_SEQ_1);
} else {
if (!((CqdContextPtr)cqd_context)->cmd_selected &&
((((ADIRequestHdrPtr)frb)->driver_cmd != CMD_SELECT_DEVICE) &&
(((ADIRequestHdrPtr)frb)->driver_cmd != CMD_LOCATE_DEVICE) &&
(((ADIRequestHdrPtr)frb)->driver_cmd != CMD_REPORT_DEVICE_CFG))) {
status = kdi_Error(ERR_DEVICE_NOT_SELECTED, FCT_ID, ERR_SEQ_1);
}
}
}
if (status == DONT_PANIC) {
if (((CqdContextPtr)cqd_context)->persistent_new_cart) {
if ((((ADIRequestHdrPtr)frb)->driver_cmd != CMD_REPORT_DEVICE_CFG) &&
(((ADIRequestHdrPtr)frb)->driver_cmd != CMD_SELECT_DEVICE) &&
(((ADIRequestHdrPtr)frb)->driver_cmd != CMD_LOAD_TAPE) &&
(((ADIRequestHdrPtr)frb)->driver_cmd != CMD_REPORT_STATUS)) {
status = kdi_Error(ERR_NEW_TAPE, FCT_ID, ERR_SEQ_1);
}
}
}
if (status == DONT_PANIC) {
status = kdi_GetFloppyController(((CqdContextPtr)cqd_context)->kdi_context);
if (kdi_GetErrorType(status) == ERR_KDI_CLAIMED_CONTROLLER) {
cqd_ResetFDC((CqdContextPtr)cqd_context);
status = DONT_PANIC;
}
if (status == DONT_PANIC) {
switch (((ADIRequestHdrPtr)frb)->driver_cmd) {
case CMD_LOCATE_DEVICE:
case CMD_SELECT_DEVICE:
case CMD_REPORT_DEVICE_CFG:
break;
case CMD_READ_VERIFY:
status = cqd_SetDeviceMode(
((CqdContextPtr)cqd_context),
VERIFY_MODE);
break;
case CMD_FORMAT:
default:
status = cqd_SetDeviceMode(
((CqdContextPtr)cqd_context),
PRIMARY_MODE);
}
if (status == DONT_PANIC) {
status = cqd_DispatchFRB(
((CqdContextPtr)cqd_context),
((ADIRequestHdrPtr)frb));
}
if (kdi_ReportAbortStatus(((CqdContextPtr)cqd_context)->kdi_context) ==
ABORT_LEVEL_1) {
cqd_PauseTape(((CqdContextPtr)cqd_context));
} else {
if (kdi_QueueEmpty(((CqdContextPtr)cqd_context)->kdi_context)) {
if (!((CqdContextPtr)cqd_context)->no_pause) {
if (kdi_GetErrorType(cqd_GetDeviceError(
((CqdContextPtr)cqd_context))) ==
ERR_DRV_NOT_READY) {
if (((CqdContextPtr)cqd_context)->device_descriptor.vendor == VENDOR_IOMEGA &&
((CqdContextPtr)cqd_context)->device_descriptor.drive_class == QIC3010_DRIVE) {
cqd_StopTape(((CqdContextPtr)cqd_context));
} else {
cqd_PauseTape(((CqdContextPtr)cqd_context));
}
}
}
}
}
if ((kdi_ReportAbortStatus(((CqdContextPtr)cqd_context)->kdi_context) ==
ABORT_LEVEL_0) && ((CqdContextPtr)cqd_context)->selected) {
(dVoid)cqd_CmdSelectDevice( (CqdContextPtr)cqd_context );
cqd_StopTape( (CqdContextPtr)cqd_context );
cqd_CmdDeselectDevice(((CqdContextPtr)cqd_context), dTRUE);
kdi_ReleaseFloppyController(((CqdContextPtr)cqd_context)->kdi_context);
((CqdContextPtr)cqd_context)->cmd_selected = dFALSE;
}
}
}
((ADIRequestHdrPtr)frb)->status = status;
#if DBG
DBG_ADD_ENTRY(QIC117SHOWMCMDS, (CqdContextPtr)cqd_context, DBG_IO_CMD_STAT);
DBG_ADD_ENTRY(QIC117SHOWMCMDS, (CqdContextPtr)cqd_context, ((ADIRequestHdrPtr)frb)->driver_cmd);
DBG_ADD_ENTRY(QIC117SHOWMCMDS, (CqdContextPtr)cqd_context, ((ADIRequestHdrPtr)frb)->status);
((CqdContextPtr)cqd_context)->dbg_lockout = dFALSE;
#endif
return status;
}