mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
326 lines
11 KiB
326 lines
11 KiB
/*****************************************************************************
|
|
*
|
|
* COPYRIGHT 1993 - COLORADO MEMORY SYSTEMS, INC.
|
|
* ALL RIGHTS RESERVED.
|
|
*
|
|
******************************************************************************
|
|
*
|
|
* FILE: \SE\DRIVER\DEVICE\JUMBO\SRC\0X1102E.C
|
|
*
|
|
* FUNCTION: cqd_CmdLoadTape
|
|
*
|
|
* PURPOSE: Determine the format (if any) on a tape cartridge. This
|
|
* routine is executed whenever the driver detects that a
|
|
* new tape has been inserted into the tape drive.
|
|
*
|
|
* HISTORY:
|
|
* $Log: J:\se.vcs\driver\q117cd\src\0x1102e.c $
|
|
*
|
|
* Rev 1.14 04 Oct 1995 10:59:18 boblehma
|
|
* IOMega 3010 bug fix code merge.
|
|
*
|
|
* Rev 1.15 27 Jun 1995 12:36:40 BOBLEHMA
|
|
* Removed call to cqd_PrepareIomega3010PhysRev. Firmware bug is now fixed
|
|
* by calling stop tape instead of pause tape in the cqd_ProcessFRB function.
|
|
*
|
|
* Rev 1.14 30 Jan 1995 14:24:24 BOBLEHMA
|
|
* Changed device_descriptor.version to cqd_context->firmware_version.
|
|
* Changed VENDOR_CONNER to VENDOR_ARCHIVE_CONNER.
|
|
*
|
|
* Rev 1.13 27 Jan 1995 13:22:36 BOBLEHMA
|
|
* Added a call to cqd_PrepareIomega3010PhysRev before the call to
|
|
* the firmware function Physical Reverse. Note that this function
|
|
* is a NOP if the drive is not an Iomega 3010.
|
|
*
|
|
* Rev 1.12 15 Dec 1994 09:03:04 MARKMILL
|
|
* Changed the handling of an error returned from cqd_CheckMediaCompatibility.
|
|
* Instead of returning immediately, the tape_cfg structure in cqd_context is
|
|
* copied to the load_tape structure and then the function is exited.
|
|
*
|
|
* Rev 1.11 09 Dec 1994 09:31:38 MARKMILL
|
|
* Replaced the code which sets the fast and slow transfer rates with a
|
|
* call to new function cqd_SetXferRates. Moved the setting of the supported
|
|
* fastest and slowest rates to before the call to cqd_CheckMediaCompatibility.
|
|
* This is to ensure that the rates get set, since cqd_CheckMediaCompatibility
|
|
* will exit the function of the tape format is not supported in the drive. This
|
|
* is the case when a referenced 3020 tape is in a 3020 drive on a 500 Kbps FDC.
|
|
* We want to allow the user to perform a format operation on the tape in that
|
|
* scenario, so the drive is "casted" to a 3010 drive (we fake out the upper
|
|
* levels of the code by reporting that the drive is a 3010).
|
|
*
|
|
* Rev 1.10 23 Nov 1994 10:10:04 MARKMILL
|
|
* Moved call to cqd_CmdSetSpeed from within the loop to determine the fastest
|
|
* supported transfer rate to after the loop to determine the slowest transfer
|
|
* rate. This was done to accomodate a conditional test for skipping the
|
|
* set speed operation if the drive is a 3020 on a 500 Kbps FDC with an
|
|
* unreferenced tape present.
|
|
*
|
|
* Rev 1.9 17 Feb 1994 15:20:58 KEVINKES
|
|
* Added a call to cqd_CheckMediaCompatibility.
|
|
*
|
|
* Rev 1.8 17 Feb 1994 11:34:34 KEVINKES
|
|
* Added an extra parameter to WaitCC.
|
|
*
|
|
* Rev 1.7 21 Jan 1994 18:22:54 KEVINKES
|
|
* Fixed compiler warnings.
|
|
*
|
|
* Rev 1.6 17 Dec 1993 10:42:54 KEVINKES
|
|
* Moved the clearing of persistent new cartridge to the beginning
|
|
* of the function.
|
|
*
|
|
* Rev 1.5 08 Dec 1993 19:06:56 CHETDOUG
|
|
* Renamed xfer_rate.supported_rates to device_cfg.supported_rates
|
|
*
|
|
* Rev 1.4 15 Nov 1993 16:25:52 KEVINKES
|
|
* Added code to clear the new rape flags.
|
|
*
|
|
* Rev 1.3 11 Nov 1993 15:20:26 KEVINKES
|
|
* Changed calls to cqd_inp and cqd_outp to kdi_ReadPort and kdi_WritePort.
|
|
* Modified the parameters to these calls. Changed FDC commands to be
|
|
* defines.
|
|
*
|
|
* Rev 1.2 08 Nov 1993 14:04:42 KEVINKES
|
|
* Removed all bit-field structures, removed all enumerated types, changed
|
|
* all defines to uppercase, and removed all signed data types wherever
|
|
* possible.
|
|
*
|
|
* Rev 1.1 25 Oct 1993 14:31:58 KEVINKES
|
|
* Fixed an infinate loop when checking for tape_slow by adding
|
|
* the check for rate != 0.
|
|
*
|
|
* Rev 1.0 18 Oct 1993 17:19:16 KEVINKES
|
|
* Initial Revision.
|
|
*
|
|
*****************************************************************************/
|
|
#define FCT_ID 0x1102e
|
|
#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_CmdLoadTape
|
|
(
|
|
/* INPUT PARAMETERS: */
|
|
|
|
CqdContextPtr cqd_context,
|
|
LoadTapePtr load_tape_ptr
|
|
|
|
/* UPDATE PARAMETERS: */
|
|
|
|
/* OUTPUT PARAMETERS: */
|
|
|
|
)
|
|
/* COMMENTS: *****************************************************************
|
|
*
|
|
* DEFINITIONS: *************************************************************/
|
|
{
|
|
|
|
/* DATA: ********************************************************************/
|
|
|
|
dStatus status=DONT_PANIC; /* dStatus or error condition.*/
|
|
dBoolean write_protect;
|
|
|
|
/* CODE: ********************************************************************/
|
|
|
|
cqd_context->persistent_new_cart = dFALSE;
|
|
cqd_context->operation_status.new_tape = dFALSE;
|
|
|
|
/* if we have a qic80 of firmware below a certain value */
|
|
/* (FIRM_VERSION_63), and if we have an */
|
|
/* unreferenced tape, and a cartridge is in the drive, */
|
|
/* then we re-try the reference burst. Only if the */
|
|
/* retry fails do we return an error. */
|
|
|
|
/* The firmware should do the retry automatically, but at the moment */
|
|
/* it does not. This will be corrected, and the retry not commanded, */
|
|
/* at some time to be determined. At that time, it should only be */
|
|
/* necessary to change the #define used to determine the firmware */
|
|
/* rev level. -- crc */
|
|
|
|
/* Check to see if the drive is a Jumbo B with firmware 63. This */
|
|
/* firmware has 2 bugs. If the tape is put in slowly, it can incorrectly */
|
|
/* return an invalid media error or write protect status. */
|
|
|
|
if (cqd_context->firmware_version <= FIRM_VERSION_63 &&
|
|
cqd_context->firmware_version >= FIRM_VERSION_60 &&
|
|
cqd_context->device_descriptor.vendor == VENDOR_CMS) {
|
|
|
|
status = cqd_GetDeviceError(cqd_context);
|
|
|
|
if (kdi_GetErrorType(status) == ERR_FW_INVALID_MEDIA) {
|
|
|
|
|
|
/* Fix both the invalid media error by sending a NewTape command */
|
|
/* to the drive. */
|
|
|
|
status = cqd_ClearTapeError(cqd_context);
|
|
|
|
} else {
|
|
|
|
/* Read the write protect status directly from port 2 on */
|
|
/* the Jumbo B processor to determine if the drive got a */
|
|
/* bogus write protect error. */
|
|
|
|
if (cqd_context->tape_cfg.write_protected &&
|
|
(status = cqd_ReadWrtProtect(cqd_context, &write_protect))
|
|
== DONT_PANIC) {
|
|
|
|
if (write_protect == dFALSE) {
|
|
|
|
status = cqd_ClearTapeError(cqd_context);
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
if (status != DONT_PANIC) {
|
|
|
|
return status;
|
|
|
|
}
|
|
}
|
|
|
|
status = cqd_GetDeviceError(cqd_context);
|
|
|
|
if (cqd_context->operation_status.cart_referenced == dFALSE &&
|
|
cqd_context->operation_status.no_tape == dFALSE &&
|
|
cqd_context->device_descriptor.vendor == VENDOR_CMS &&
|
|
cqd_context->firmware_version >= FIRM_VERSION_60 &&
|
|
cqd_context->firmware_version <= FIRM_VERSION_63) {
|
|
|
|
/* command: seek reference burst. N.b: Non-interruptible! */
|
|
|
|
if ((status = cqd_SendByte(cqd_context, FW_CMD_SEEK_LP)) != DONT_PANIC) {
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
/* Wait for the drive to become ready again. */
|
|
|
|
if ((status = cqd_WaitCommandComplete(cqd_context, INTERVAL_LOAD_POINT, dTRUE)) !=
|
|
DONT_PANIC) {
|
|
|
|
return status;
|
|
|
|
}
|
|
}
|
|
|
|
/* Rewind tape -- needed for Conner drives */
|
|
|
|
if ((cqd_context->operation_status.no_tape == dFALSE) &&
|
|
((cqd_context->device_descriptor.vendor == VENDOR_IOMEGA) ||
|
|
(cqd_context->device_descriptor.vendor == VENDOR_ARCHIVE_CONNER))) {
|
|
|
|
if (cqd_context->rd_wr_op.bot == dFALSE) {
|
|
|
|
if ((status = cqd_SendByte(cqd_context, FW_CMD_PHYSICAL_REV)) != DONT_PANIC) {
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
/* Wait for the drive to become ready again. */
|
|
|
|
if ((status = cqd_WaitCommandComplete(cqd_context, kdi_wt650s, dFALSE)) !=
|
|
DONT_PANIC) {
|
|
|
|
return status;
|
|
|
|
}
|
|
}
|
|
|
|
if (cqd_context->operation_status.cart_referenced == dFALSE) {
|
|
|
|
/* command: seek reference burst. N.b: Non-interruptible! */
|
|
|
|
if ((status = cqd_SendByte(cqd_context, FW_CMD_SEEK_LP)) != DONT_PANIC) {
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
/* Wait for the drive to become ready again. */
|
|
|
|
if ((status = cqd_WaitCommandComplete(cqd_context, INTERVAL_LOAD_POINT, dTRUE)) !=
|
|
DONT_PANIC) {
|
|
|
|
return status;
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if ((status = cqd_GetTapeParameters(cqd_context, 0l)) != DONT_PANIC) {
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
cqd_SetXferRates( cqd_context );
|
|
|
|
if ((status = cqd_CheckMediaCompatibility(cqd_context)) == DONT_PANIC) {
|
|
|
|
|
|
/************************************************************************
|
|
*
|
|
* Need to set the speed of the FDC and tape drive. If the drive is
|
|
* a CMS 3020 drive on a 500 Kbps FDC, then the drive_class data element
|
|
* was casted to QIC3010_DRIVE by cqd_ReportCMDVendorInfo because the
|
|
* 3020 does not support the 500Kbps transfer rate. In addition, if
|
|
* the drive contains an unreferenced tape, any attempts to set the
|
|
* transfer rate of the drive to 500 Kbps will result in a firmware
|
|
* error since the firmware defaults to the native mode of the drive
|
|
* when an unreferenced tape is present. Thus the set speed operation
|
|
* must be skipped if the following is true:
|
|
*
|
|
* 1) the drive is a CMS QIC-3020 and
|
|
* 2) the FDC is 500 Kbps and
|
|
* 3) a tape cartridge is present and
|
|
* 4) the tape is unreferenced
|
|
*
|
|
* If the described condition exists, the drive transfer rate can not
|
|
* be set until after writing the reference burst.
|
|
*
|
|
************************************************************************/
|
|
|
|
if( ! ((cqd_context->operation_status.no_tape == dFALSE) &&
|
|
(cqd_context->operation_status.cart_referenced == dFALSE) &&
|
|
(cqd_context->device_descriptor.drive_class == QIC3010_DRIVE) &&
|
|
(cqd_context->device_descriptor.native_class == QIC3020_DRIVE) &&
|
|
(cqd_context->device_descriptor.vendor == VENDOR_CMS)) ) {
|
|
|
|
status = cqd_CmdSetSpeed(cqd_context, cqd_context->tape_cfg.xfer_fast);
|
|
} else {
|
|
|
|
/* Temporarily set the transfer rate to 1 Mbps to keep the firmware
|
|
* happy. After the reference burst is written to the tape, the
|
|
* drive is configured for the proper transfer rate. Until then, we
|
|
* won't attempt to match the drive and FDC transfer rates. */
|
|
|
|
if ((status = cqd_SendByte(cqd_context, FW_CMD_SELECT_SPEED)) != DONT_PANIC) {
|
|
return status;
|
|
}
|
|
|
|
kdi_Sleep(cqd_context->kdi_context, INTERVAL_CMD, dFALSE);
|
|
if ((status = cqd_SendByte(cqd_context, (dUByte)(TAPE_1Mbps+CMD_OFFSET))) != DONT_PANIC) {
|
|
return status;
|
|
}
|
|
|
|
kdi_Sleep(cqd_context->kdi_context, INTERVAL_CMD, dFALSE);
|
|
}
|
|
}
|
|
|
|
cqd_context->operation_status.current_track = ILLEGAL_TRACK;
|
|
|
|
load_tape_ptr->tape_cfg = cqd_context->tape_cfg;
|
|
|
|
return status;
|
|
}
|