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

536 lines
18 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\Q117CD\SRC\0X11013.C
*
* FUNCTION: cqd_CmdSetTapeParms
*
* PURPOSE:
*
* HISTORY:
* $Log: J:\se.vcs\driver\q117cd\src\0x11013.c $
*
* Rev 1.9 24 Jan 1996 10:55:08 BOBLEHMA
* Added wide tape support for the 3010 and 3020.
*
* Rev 1.8 14 Nov 1995 16:36:54 boblehma
* Changed the timeouts for 425 foot QIC80 tape to what is needed for a
* 1000 ft tape. This is a temporary fix until the code is changed so
* the 1000 ft tapes is the default startup condition. It is too close to
* release to make this change now.
*
* Rev 1.7 19 Oct 1995 16:30:54 boblehma
* Changed the max floppy track for Qic 80 Verbatim from 149 to 254.
*
* Rev 1.6 04 Oct 1995 10:59:50 boblehma
* Verbatim cartridge code merge.
*
* Rev 1.6.1.0 06 Sep 1995 16:17:30 BOBLEHMA
* Added support for the Verbatim 1000 foot tape. Added time outs for this
* tape type.
*
* Rev 1.6 30 Jan 1995 14:24:30 BOBLEHMA
* Changed vendor to VENDOR_WANGTEK_REXON.
*
* Rev 1.5 26 Jan 1995 14:59:46 BOBLEHMA
* Reorganized the initial switch from using the segments per track to using
* the tape_type. The tape type will be initialize in cqd_GetTapeParameters
* and will be changed only if a 205' tape is found. This was needed to support
* the QIC 80 flexible tapes (we can not be sure of the segments per track with
* a flexible length tape).
*
* Rev 1.4 21 Oct 1994 09:52:00 BOBLEHMA
* Set the max_floppy_track to one less than the internal count for all drives
* not just the 3010 and 3020.
*
* Rev 1.3 29 Aug 1994 12:06:40 BOBLEHMA
* Added code to set the tape_cfg and floppy_tape_parameter fields. This data
* was originally in the cqd_GetTapeParameters function.
*
* Rev 1.2 18 Feb 1994 09:33:58 KEVINKES
* Moved the tape timeout initializations into a check for
* 3010 and 3020 tape types.
*
* Rev 1.1 21 Jan 1994 18:22:14 KEVINKES
* Fixed compiler warnings.
*
* Rev 1.0 18 Oct 1993 17:22:22 KEVINKES
* Initial Revision.
*
*****************************************************************************/
#define FCT_ID 0x11013
#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_CmdSetTapeParms
(
/* INPUT PARAMETERS: */
CqdContextPtr cqd_context,
dUDWord segments_per_track,
TapeLengthPtr tape_length_ptr
/* UPDATE PARAMETERS: */
/* OUTPUT PARAMETERS: */
)
/* COMMENTS: *****************************************************************
*
* DEFINITIONS: *************************************************************/
{
/* DATA: ********************************************************************/
dStatus status = DONT_PANIC;
dUDWord tape_length = 0l;
dUDWord temp_sides = 0l;
/* CODE: ********************************************************************/
cqd_context->tape_cfg.seg_tape_track = segments_per_track;
/* switch (cqd_context->device_descriptor.drive_class) { */
switch (cqd_context->floppy_tape_parms.tape_type) {
case QIC40_SHORT:
case QIC40_XLONG:
if (segments_per_track == SEG_TTRK_40) {
kdi_CheckedDump(
QIC117INFO,
"Q117i: Tape Type QIC40_SHORT\n", 0l);
cqd_context->tape_cfg.num_tape_tracks = (dUWord)NUM_TTRK_40;
cqd_context->floppy_tape_parms.tape_type = QIC40_SHORT;
cqd_context->floppy_tape_parms.ftrack_fside = FTK_FSD_40;
cqd_context->floppy_tape_parms.fsect_fside =
(dUDWord)FSC_FTK *
(dUDWord)FTK_FSD_40;
cqd_context->floppy_tape_parms.log_sectors =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track *
(dUDWord)NUM_TTRK_40;
cqd_context->floppy_tape_parms.fsect_ttrack =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track;
cqd_context->floppy_tape_parms.time_out[L_SLOW] = kdi_wt130s;
cqd_context->floppy_tape_parms.time_out[L_FAST] = kdi_wt065s;
cqd_context->floppy_tape_parms.time_out[PHYSICAL] = kdi_wt065s;
} else {
kdi_CheckedDump(
QIC117INFO,
"Q117i: Tape Type QIC40_XLONG\n", 0l);
cqd_context->tape_cfg.num_tape_tracks = (dUWord)NUM_TTRK_40;
cqd_context->floppy_tape_parms.ftrack_fside = FTK_FSD_40XL;
cqd_context->floppy_tape_parms.fsect_fside =
(dUDWord)FSC_FTK *
(dUDWord)FTK_FSD_40XL;
cqd_context->floppy_tape_parms.log_sectors =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track *
(dUDWord)NUM_TTRK_40;
cqd_context->floppy_tape_parms.fsect_ttrack =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track;
cqd_context->floppy_tape_parms.time_out[L_SLOW] = kdi_wt250s;
cqd_context->floppy_tape_parms.time_out[L_FAST] = kdi_wt125s;
cqd_context->floppy_tape_parms.time_out[PHYSICAL] = kdi_wt125s;
}
break;
case QIC40_LONG:
kdi_CheckedDump(
QIC117INFO,
"Q117i: Tape Type QIC40_LONG\n", 0l);
cqd_context->tape_cfg.num_tape_tracks = (dUWord)NUM_TTRK_40;
cqd_context->floppy_tape_parms.ftrack_fside = FTK_FSD_40L;
cqd_context->floppy_tape_parms.fsect_fside =
(dUDWord)FSC_FTK *
(dUDWord)FTK_FSD_40L;
cqd_context->floppy_tape_parms.log_sectors =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track *
(dUDWord)NUM_TTRK_40;
cqd_context->floppy_tape_parms.fsect_ttrack =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track;
cqd_context->floppy_tape_parms.time_out[L_SLOW] = kdi_wt180s;
cqd_context->floppy_tape_parms.time_out[L_FAST] = kdi_wt090s;
cqd_context->floppy_tape_parms.time_out[PHYSICAL] = kdi_wt090s;
break;
case QICEST_40:
kdi_CheckedDump(
QIC117INFO,
"Q117i: Tape Type QICEST_40\n", 0l);
cqd_context->tape_cfg.num_tape_tracks = (dUWord)NUM_TTRK_40;
cqd_context->floppy_tape_parms.ftrack_fside = FTK_FSD_QICEST_40;
cqd_context->floppy_tape_parms.fsect_fside =
(dUDWord)FSC_FTK *
(dUDWord)FTK_FSD_QICEST_40;
cqd_context->floppy_tape_parms.log_sectors =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track *
(dUDWord)NUM_TTRK_40;
cqd_context->floppy_tape_parms.fsect_ttrack =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track;
cqd_context->floppy_tape_parms.time_out[L_SLOW] = kdi_wt700s;
cqd_context->floppy_tape_parms.time_out[L_FAST] = kdi_wt350s;
cqd_context->floppy_tape_parms.time_out[PHYSICAL] = kdi_wt350s;
break;
case QIC80_SHORT:
case QIC80_XLONG:
case QIC80_EXLONG:
if (segments_per_track == SEG_TTRK_80) {
kdi_CheckedDump(
QIC117INFO,
"Q117i: Tape Type QIC80_SHORT\n", 0l);
cqd_context->tape_cfg.num_tape_tracks = (dUWord)NUM_TTRK_80;
cqd_context->floppy_tape_parms.tape_type = QIC80_SHORT;
cqd_context->floppy_tape_parms.ftrack_fside = FTK_FSD_80;
cqd_context->floppy_tape_parms.fsect_fside =
(dUDWord)FSC_FTK *
(dUDWord)FTK_FSD_80;
cqd_context->floppy_tape_parms.log_sectors =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track *
(dUDWord)NUM_TTRK_80;
cqd_context->floppy_tape_parms.fsect_ttrack =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track;
cqd_context->floppy_tape_parms.time_out[L_SLOW] = kdi_wt100s;
cqd_context->floppy_tape_parms.time_out[L_FAST] = kdi_wt050s;
cqd_context->floppy_tape_parms.time_out[PHYSICAL] = kdi_wt050s;
} else if (segments_per_track == SEG_TTRK_80XL) {
kdi_CheckedDump(
QIC117INFO,
"Q117i: Tape Type QIC80_XLONG\n", 0l);
cqd_context->tape_cfg.num_tape_tracks = (dUWord)NUM_TTRK_80;
cqd_context->floppy_tape_parms.tape_type = QIC80_XLONG;
cqd_context->floppy_tape_parms.ftrack_fside = FTK_FSD_80XL;
cqd_context->floppy_tape_parms.fsect_fside =
(dUDWord)FSC_FTK *
(dUDWord)FTK_FSD_80XL;
cqd_context->floppy_tape_parms.log_sectors =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track *
(dUDWord)NUM_TTRK_80;
cqd_context->floppy_tape_parms.fsect_ttrack =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track;
cqd_context->floppy_tape_parms.time_out[L_SLOW] = kdi_wt460s; /* was 200 */
cqd_context->floppy_tape_parms.time_out[L_FAST] = kdi_wt250s; /* was 100 */
cqd_context->floppy_tape_parms.time_out[PHYSICAL] = kdi_wt250s; /* was 100 */
} else {
kdi_CheckedDump(
QIC117INFO,
"Q117i: Tape Type QIC80_EXLONG\n", 0l);
cqd_context->tape_cfg.num_tape_tracks = (dUWord)NUM_TTRK_80;
cqd_context->floppy_tape_parms.tape_type = QIC80_EXLONG;
cqd_context->floppy_tape_parms.ftrack_fside = FTK_FSD_FLEX80;
cqd_context->floppy_tape_parms.fsect_fside =
(dUDWord)FSC_FTK *
(dUDWord)FTK_FSD_FLEX80;
cqd_context->floppy_tape_parms.log_sectors =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track *
(dUDWord)NUM_TTRK_80;
cqd_context->floppy_tape_parms.fsect_ttrack =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track;
cqd_context->floppy_tape_parms.time_out[L_SLOW] = kdi_wt460s;
cqd_context->floppy_tape_parms.time_out[L_FAST] = kdi_wt250s;
cqd_context->floppy_tape_parms.time_out[PHYSICAL] = kdi_wt250s;
}
break;
case QIC80_LONG:
kdi_CheckedDump(
QIC117INFO,
"Q117i: Tape Type QIC80_LONG\n", 0l);
cqd_context->tape_cfg.num_tape_tracks = (dUWord)NUM_TTRK_80;
cqd_context->floppy_tape_parms.ftrack_fside = FTK_FSD_80L;
cqd_context->floppy_tape_parms.fsect_fside =
(dUDWord)FSC_FTK *
(dUDWord)FTK_FSD_80L;
cqd_context->floppy_tape_parms.log_sectors =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track *
(dUDWord)NUM_TTRK_80;
cqd_context->floppy_tape_parms.fsect_ttrack =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track;
cqd_context->floppy_tape_parms.time_out[L_SLOW] = kdi_wt130s;
cqd_context->floppy_tape_parms.time_out[L_FAST] = kdi_wt065s;
cqd_context->floppy_tape_parms.time_out[PHYSICAL] = kdi_wt065s;
break;
case QICEST_80:
kdi_CheckedDump(
QIC117INFO,
"Q117i: Tape Type QICEST_80\n", 0l);
cqd_context->tape_cfg.num_tape_tracks = (dUWord)NUM_TTRK_80;
cqd_context->floppy_tape_parms.ftrack_fside = FTK_FSD_QICEST_80;
cqd_context->floppy_tape_parms.fsect_fside =
(dUDWord)FSC_FTK *
(dUDWord)FTK_FSD_QICEST_80;
cqd_context->floppy_tape_parms.log_sectors =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track *
(dUDWord)NUM_TTRK_80;
cqd_context->floppy_tape_parms.fsect_ttrack =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track;
cqd_context->floppy_tape_parms.time_out[L_SLOW] = kdi_wt475s;
cqd_context->floppy_tape_parms.time_out[L_FAST] = kdi_wt250s;
cqd_context->floppy_tape_parms.time_out[PHYSICAL] = kdi_wt250s;
break;
case QICFLX_80W:
kdi_CheckedDump(
QIC117INFO,
"Q117i: Tape Type QICFLX_80W\n", 0l);
cqd_context->tape_cfg.num_tape_tracks = (dUWord)NUM_TTRK_80W;
cqd_context->floppy_tape_parms.ftrack_fside = FTK_FSD_FLEX80;
cqd_context->floppy_tape_parms.fsect_fside =
(dUDWord)FSC_FTK *
(dUDWord)FTK_FSD_FLEX80;
cqd_context->floppy_tape_parms.log_sectors =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track *
(dUDWord)NUM_TTRK_80W;
cqd_context->floppy_tape_parms.fsect_ttrack =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track;
tape_length = segments_per_track * SEG_LENGTH_80W;
break;
case QICFLX_3010:
kdi_CheckedDump(
QIC117INFO,
"Q117i: Tape Type QICFLX_3010\n", 0l);
cqd_context->tape_cfg.num_tape_tracks = (dUWord)NUM_TTRK_3010;
cqd_context->floppy_tape_parms.tape_type = QICFLX_3010;
cqd_context->floppy_tape_parms.ftrack_fside = FTK_FSD_3010;
cqd_context->floppy_tape_parms.fsect_fside =
(dUDWord)FSC_FTK *
(dUDWord)FTK_FSD_3010;
cqd_context->floppy_tape_parms.log_sectors =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track *
(dUDWord)NUM_TTRK_3010;
cqd_context->floppy_tape_parms.fsect_ttrack =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track;
tape_length = segments_per_track * SEG_LENGTH_3010;
break;
case QICFLX_3010_WIDE:
kdi_CheckedDump(
QIC117INFO,
"Q117i: Tape Type QICFLX_3010_WIDE\n", 0l);
cqd_context->tape_cfg.num_tape_tracks = (dUWord)NUM_TTRK_3010W;
cqd_context->floppy_tape_parms.tape_type = QICFLX_3010_WIDE;
cqd_context->floppy_tape_parms.ftrack_fside = FTK_FSD_3010;
cqd_context->floppy_tape_parms.fsect_fside =
(dUDWord)FSC_FTK *
(dUDWord)FTK_FSD_3010;
cqd_context->floppy_tape_parms.log_sectors =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track *
(dUDWord)NUM_TTRK_3010W;
cqd_context->floppy_tape_parms.fsect_ttrack =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track;
tape_length = segments_per_track * SEG_LENGTH_3010;
break;
case QICFLX_3020:
kdi_CheckedDump(
QIC117INFO,
"Q117i: Tape Type QICEST_3020\n", 0l);
cqd_context->tape_cfg.num_tape_tracks = (dUWord)NUM_TTRK_3020;
cqd_context->floppy_tape_parms.tape_type = QICFLX_3020;
cqd_context->floppy_tape_parms.ftrack_fside = FTK_FSD_3020;
cqd_context->floppy_tape_parms.fsect_fside =
(dUDWord)FSC_FTK *
(dUDWord)FTK_FSD_3020;
cqd_context->floppy_tape_parms.log_sectors =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track *
(dUDWord)NUM_TTRK_3020;
cqd_context->floppy_tape_parms.fsect_ttrack =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track;
tape_length = segments_per_track * SEG_LENGTH_3020;
break;
case QICFLX_3020_WIDE:
kdi_CheckedDump(
QIC117INFO,
"Q117i: Tape Type QICEST_3020\n", 0l);
cqd_context->tape_cfg.num_tape_tracks = (dUWord)NUM_TTRK_3020W;
cqd_context->floppy_tape_parms.tape_type = QICFLX_3020_WIDE;
cqd_context->floppy_tape_parms.ftrack_fside = FTK_FSD_3020;
cqd_context->floppy_tape_parms.fsect_fside =
(dUDWord)FSC_FTK *
(dUDWord)FTK_FSD_3020;
cqd_context->floppy_tape_parms.log_sectors =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track *
(dUDWord)NUM_TTRK_3020W;
cqd_context->floppy_tape_parms.fsect_ttrack =
(dUDWord)FSC_SEG *
(dUDWord)cqd_context->tape_cfg.seg_tape_track;
tape_length = segments_per_track * SEG_LENGTH_3020;
break;
default:
status = kdi_Error(ERR_UNKNOWN_TAPE_LENGTH, FCT_ID, ERR_SEQ_4);
break;
}
/*
* If flexible format, calculate the timeout values
*/
if ((cqd_context->floppy_tape_parms.tape_type == QICFLX_80W) ||
(cqd_context->floppy_tape_parms.tape_type == QICFLX_3010) ||
(cqd_context->floppy_tape_parms.tape_type == QICFLX_3010_WIDE) ||
(cqd_context->floppy_tape_parms.tape_type == QICFLX_3020) ||
(cqd_context->floppy_tape_parms.tape_type == QICFLX_3020_WIDE)) {
cqd_context->floppy_tape_parms.time_out[L_SLOW] =
((((tape_length / SPEED_SLOW_30n0) *
SPEED_TOLERANCE) + SPEED_ROUNDING_FACTOR) / SPEED_FACTOR) * kdi_wt001s;
cqd_context->floppy_tape_parms.time_out[L_FAST] =
((((tape_length / SPEED_FAST_30n0) *
SPEED_TOLERANCE) + SPEED_ROUNDING_FACTOR) / SPEED_FACTOR) * kdi_wt001s;
cqd_context->floppy_tape_parms.time_out[PHYSICAL] =
((((tape_length / SPEED_PHYSICAL_30n0) *
SPEED_TOLERANCE) + SPEED_ROUNDING_FACTOR) / SPEED_FACTOR) * kdi_wt001s;
}
/*
* Calculate logical segments and max floppy data
*/
cqd_CalcFmtSegmentsAndTracks( cqd_context );
cqd_context->tape_cfg.log_segments =
cqd_context->tape_cfg.num_tape_tracks *
cqd_context->tape_cfg.seg_tape_track;
if (cqd_context->floppy_tape_parms.ftrack_fside != 0){
temp_sides = cqd_context->tape_cfg.log_segments /
(SEG_FTK * cqd_context->floppy_tape_parms.ftrack_fside);
if (( cqd_context->tape_cfg.log_segments %
(SEG_FTK * cqd_context->floppy_tape_parms.ftrack_fside) ) == 0) {
--temp_sides;
}
cqd_context->tape_cfg.max_floppy_side = (dUByte)temp_sides;
cqd_context->tape_cfg.max_floppy_track =
(dUByte)(cqd_context->floppy_tape_parms.ftrack_fside-1);
cqd_context->tape_cfg.max_floppy_sector = FSC_FTK;
}
/* Determine the Tape Format Code */
switch (cqd_context->floppy_tape_parms.tape_status.length) {
case QICEST:
kdi_CheckedDump(
QIC117INFO,
"Q117i: Tape Format Code QICEST_FORMAT\n", 0l);
cqd_context->tape_cfg.tape_format_code = QICEST_FORMAT;
if ( cqd_context->device_descriptor.vendor == VENDOR_WANGTEK_REXON) {
cqd_context->drive_parms.seek_mode = SEEK_SKIP_EXTENDED;
}
if (!cqd_context->pegasus_supported) {
status = kdi_Error(ERR_FW_INVALID_MEDIA, FCT_ID, ERR_SEQ_1);
}
break;
case QIC_FLEXIBLE_550_WIDE:
case QIC_FLEXIBLE_900:
case QIC_FLEXIBLE_900_WIDE:
kdi_CheckedDump(
QIC117INFO,
"Q117i: Tape Format Code QICFLX_FORMAT\n", 0l);
cqd_context->tape_cfg.tape_format_code = QICFLX_FORMAT;
break;
default:
if (cqd_context->floppy_tape_parms.tape_type == QIC40_XLONG ||
cqd_context->floppy_tape_parms.tape_type == QIC80_XLONG) {
kdi_CheckedDump(
QIC117INFO,
"Q117i: Tape Format Code QIC_FORMAT\n", 0l);
cqd_context->tape_cfg.tape_format_code = QIC_XLFORMAT;
} else if (cqd_context->floppy_tape_parms.tape_type == QIC80_EXLONG) {
kdi_CheckedDump(
QIC117INFO,
"Q117i: Tape Format Code QIC_FORMAT\n", 0l);
cqd_context->tape_cfg.tape_format_code = QICFLX_FORMAT;
} else {
kdi_CheckedDump(
QIC117INFO,
"Q117i: Tape Format Code QIC_FORMAT\n", 0l);
cqd_context->tape_cfg.tape_format_code = QIC_FORMAT;
}
}
/*
* Return the tape_cfg data if necessary
*/
if (tape_length_ptr != dNULL_PTR) {
tape_length_ptr->tape_cfg = cqd_context->tape_cfg;
}
return status;
}