276 lines
7.6 KiB
C
276 lines
7.6 KiB
C
/*****************************************************************************
|
||
*
|
||
* COPYRIGHT 1993 - COLORADO MEMORY SYSTEMS, INC.
|
||
* ALL RIGHTS RESERVED.
|
||
*
|
||
******************************************************************************
|
||
*
|
||
* FILE: \SE\DRIVER\DEVICE\JUMBO\SRC\0X1101F.C
|
||
*
|
||
* FUNCTION: cqd_FormatInterrupt
|
||
*
|
||
* PURPOSE: Format an entire track.
|
||
*
|
||
* HISTORY:
|
||
* $Log: J:\se.vcs\driver\q117cd\src\0x1101f.c $
|
||
*
|
||
* Rev 1.7 03 Jun 1994 15:39:56 KEVINKES
|
||
* Changed drive_parm.drive_select to device_cfg.drive_select.
|
||
*
|
||
* Rev 1.6 21 Jan 1994 18:22:44 KEVINKES
|
||
* Fixed compiler warnings.
|
||
*
|
||
* Rev 1.5 07 Jan 1994 10:54:56 CHETDOUG
|
||
* Fixed up Trakker format.
|
||
*
|
||
* Rev 1.4 13 Dec 1993 16:35:16 KEVINKES
|
||
* Added code to support double buffering of the format sector headers.
|
||
*
|
||
* Rev 1.3 15 Nov 1993 16:25:14 KEVINKES
|
||
* Added abort handling.
|
||
*
|
||
* Rev 1.2 11 Nov 1993 15:20:18 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.1 08 Nov 1993 14:03:36 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.0 18 Oct 1993 17:18:36 KEVINKES
|
||
* Initial Revision.
|
||
*
|
||
*****************************************************************************/
|
||
#define FCT_ID 0x1101f
|
||
#include "include\public\adi_api.h"
|
||
#include "include\public\frb_api.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*/
|
||
|
||
dBoolean cqd_FormatInterrupt
|
||
(
|
||
/* INPUT PARAMETERS: */
|
||
|
||
dVoidPtr context
|
||
|
||
/* UPDATE PARAMETERS: */
|
||
|
||
/* OUTPUT PARAMETERS: */
|
||
|
||
)
|
||
/* COMMENTS: *****************************************************************
|
||
*
|
||
* DEFINITIONS: *************************************************************/
|
||
{
|
||
|
||
/* DATA: ********************************************************************/
|
||
|
||
FDCStatus f_stat; /* FDC status response */
|
||
SeekCmd seek;
|
||
FDCResult result;
|
||
dUWord hdr_selector;
|
||
dBoolean wakeup=dFALSE;
|
||
CqdContextPtr cqd_context;
|
||
dUWord datasize;
|
||
|
||
/* CODE: ********************************************************************/
|
||
|
||
cqd_context = (CqdContextPtr)context;
|
||
|
||
if (kdi_ReportAbortStatus(cqd_context->kdi_context) !=
|
||
NO_ABORT_PENDING) {
|
||
|
||
cqd_context->fmt_op.retval = kdi_Error(ERR_ABORT, FCT_ID, ERR_SEQ_1);
|
||
|
||
return dTRUE;
|
||
|
||
}
|
||
|
||
|
||
/* Format all of the segments on the tape track. Whenever a boundary */
|
||
/* condition is reached (e.g. sectors > sectors per floppy track) */
|
||
/* update the sector id information as necessary. */
|
||
|
||
if (cqd_context->operation_status.current_segment == 0) {
|
||
|
||
if ((cqd_context->fmt_op.retval =
|
||
cqd_ReadFDC(
|
||
cqd_context,
|
||
(dUByte *)&result,
|
||
sizeof(result))) == DONT_PANIC) {
|
||
|
||
if ((result.ST0 & ST0_IC) == 0) {
|
||
|
||
/* If we timed out, then we did the sense interrupt status */
|
||
/* without clearing the interrupt from the interrupt controller. */
|
||
/* Since the FDC did not indicate an error, we assume that we */
|
||
/* missed the interrupt and send the EOI. Only needed for an */
|
||
/* 82072. */
|
||
|
||
if (kdi_GetInterfaceType(cqd_context->kdi_context) != MICRO_CHANNEL) {
|
||
|
||
if (result.ST0 !=
|
||
(dUByte)(cqd_context->device_cfg.drive_select | ST0_SE)) {
|
||
|
||
cqd_context->fmt_op.retval =
|
||
kdi_Error(ERR_FDC_FAULT, FCT_ID, ERR_SEQ_1);
|
||
|
||
}
|
||
}
|
||
|
||
if (cqd_context->fmt_op.NCN != result.PCN) {
|
||
|
||
cqd_context->fmt_op.retval =
|
||
kdi_Error(ERR_CMD_FAULT, FCT_ID, ERR_SEQ_1);
|
||
|
||
}
|
||
|
||
cqd_context->controller_data.fdc_pcn = result.PCN;
|
||
|
||
} else {
|
||
|
||
cqd_context->fmt_op.retval =
|
||
kdi_Error(ERR_FDC_FAULT, FCT_ID, ERR_SEQ_2);
|
||
|
||
}
|
||
|
||
}
|
||
|
||
} else {
|
||
|
||
kdi_FlushDMABuffers(cqd_context->kdi_context,
|
||
DMA_READ,
|
||
cqd_context->fmt_op.phy_ptr,
|
||
cqd_context->rd_wr_op.bytes_transferred_so_far,
|
||
cqd_context->rd_wr_op.total_bytes_of_transfer
|
||
);
|
||
|
||
if ((cqd_context->fmt_op.retval = cqd_ReadFDC(
|
||
cqd_context,
|
||
(dUByte *)&f_stat,
|
||
sizeof(f_stat))) == DONT_PANIC) {
|
||
|
||
if (f_stat.ST0 & ST0_IC) {
|
||
|
||
cqd_context->fmt_op.retval =
|
||
kdi_Error(ERR_FORMAT_TIMED_OUT, FCT_ID, ERR_SEQ_1);
|
||
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
|
||
if (cqd_context->fmt_op.retval == DONT_PANIC) {
|
||
|
||
if (cqd_context->operation_status.current_segment !=
|
||
(dUWord)cqd_context->tape_cfg.seg_tape_track) {
|
||
|
||
/* Start the format by programming the DMA, starting the tape, and */
|
||
/* starting the floppy controller. */
|
||
|
||
/* Map the transfer through the DMA hardware. */
|
||
|
||
cqd_context->rd_wr_op.bytes_transferred_so_far =
|
||
cqd_context->fmt_op.hdr_offset[cqd_context->fmt_op.current_hdr];
|
||
cqd_context->rd_wr_op.total_bytes_of_transfer =
|
||
cqd_context->floppy_tape_parms.fsect_seg * sizeof(dUDWord);
|
||
|
||
if (kdi_Trakker(cqd_context->kdi_context)) {
|
||
datasize = (dUWord)(cqd_context->floppy_tape_parms.fsect_seg * sizeof(dUDWord));
|
||
kdi_ProgramDMA(cqd_context->kdi_context,
|
||
DMA_READ,
|
||
(dVoidPtr)(cqd_context->fmt_op.current_hdr * datasize),
|
||
0,
|
||
&cqd_context->rd_wr_op.total_bytes_of_transfer
|
||
);
|
||
} else {
|
||
|
||
kdi_ProgramDMA(cqd_context->kdi_context,
|
||
DMA_READ,
|
||
cqd_context->fmt_op.phy_ptr,
|
||
cqd_context->rd_wr_op.bytes_transferred_so_far,
|
||
&cqd_context->rd_wr_op.total_bytes_of_transfer
|
||
);
|
||
|
||
}
|
||
|
||
kdi_ClaimInterrupt(cqd_context->kdi_context);
|
||
|
||
if ((cqd_context->fmt_op.retval =
|
||
cqd_ProgramFDC(
|
||
cqd_context,
|
||
(dUByte *)&cqd_context->controller_data.fmt_cmd,
|
||
sizeof(FormatCmd),
|
||
dTRUE)) != DONT_PANIC) {
|
||
|
||
kdi_FlushDMABuffers(cqd_context->kdi_context,
|
||
DMA_READ,
|
||
cqd_context->fmt_op.phy_ptr,
|
||
cqd_context->rd_wr_op.bytes_transferred_so_far,
|
||
cqd_context->rd_wr_op.total_bytes_of_transfer
|
||
);
|
||
|
||
wakeup = dTRUE;
|
||
|
||
}
|
||
|
||
hdr_selector = cqd_context->fmt_op.current_hdr;
|
||
cqd_context->fmt_op.current_hdr = cqd_context->fmt_op.next_hdr;
|
||
cqd_context->fmt_op.next_hdr = hdr_selector;
|
||
if (cqd_BuildFormatHdr(cqd_context, cqd_context->fmt_op.current_hdr) != DONT_PANIC)
|
||
wakeup = dTRUE;
|
||
cqd_context->operation_status.current_segment++;
|
||
|
||
|
||
} else {
|
||
|
||
cqd_context->controller_data.start_format_mode = dFALSE;
|
||
|
||
if (cqd_context->controller_data.fdc_pcn < 128) {
|
||
|
||
seek.NCN = (dUByte)(cqd_context->controller_data.fdc_pcn + FW_CMD_REPORT_STATUS);
|
||
|
||
} else {
|
||
|
||
seek.NCN = (dUByte)(cqd_context->controller_data.fdc_pcn - FW_CMD_REPORT_STATUS);
|
||
|
||
}
|
||
|
||
seek.cmd = 0x0f;
|
||
seek.drive = (dUByte)cqd_context->device_cfg.drive_select;
|
||
cqd_context->fmt_op.NCN = seek.NCN;
|
||
|
||
kdi_ClaimInterrupt(cqd_context->kdi_context);
|
||
|
||
if ((cqd_context->fmt_op.retval = cqd_ProgramFDC(
|
||
cqd_context,
|
||
(dUByte *)&seek,
|
||
sizeof(seek),
|
||
dFALSE)) == DONT_PANIC) {
|
||
|
||
cqd_context->controller_data.end_format_mode = dTRUE;
|
||
|
||
} else {
|
||
|
||
wakeup = dTRUE;
|
||
|
||
}
|
||
|
||
}
|
||
|
||
} else {
|
||
|
||
wakeup = dTRUE;
|
||
|
||
}
|
||
|
||
return wakeup;
|
||
}
|