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.
265 lines
6.2 KiB
265 lines
6.2 KiB
/*****************************************************************************
|
|
*
|
|
* COPYRIGHT 1993 - COLORADO MEMORY SYSTEMS, INC.
|
|
* ALL RIGHTS RESERVED.
|
|
*
|
|
******************************************************************************
|
|
*
|
|
* FILE: \SE\DRIVER\Q117KDI\NT\SRC\0X15A15.C
|
|
*
|
|
* FUNCTION: kdi_GetFloppyController
|
|
*
|
|
* PURPOSE:
|
|
*
|
|
* HISTORY:
|
|
* $Log: J:\se.vcs\driver\q117kdi\nt\src\0x15a15.c $
|
|
*
|
|
* Rev 1.8 26 Apr 1994 16:23:30 KEVINKES
|
|
* Changed controller_wait to an SDDWord.
|
|
*
|
|
* Rev 1.7 20 Jan 1994 09:48:56 KEVINKES
|
|
* Added the ERR_KDI_CLAIMED_CONTROLLER return so we know when
|
|
* the controller was claimed.
|
|
*
|
|
* Rev 1.6 19 Jan 1994 15:43:02 KEVINKES
|
|
* Moved controller event confirmation into the conditional.
|
|
*
|
|
* Rev 1.5 19 Jan 1994 11:38:08 KEVINKES
|
|
* Fixed debug code.
|
|
*
|
|
* Rev 1.4 18 Jan 1994 17:18:02 KEVINKES
|
|
* Added code to keep from waiting for the event if we already own it.
|
|
*
|
|
* Rev 1.3 18 Jan 1994 16:30:14 KEVINKES
|
|
* Fixed compile errors and added debug changes.
|
|
*
|
|
* Rev 1.2 07 Dec 1993 16:44:02 KEVINKES
|
|
* Removed the call to ClaimInterrupt and added code to
|
|
* set the current_interrupt flag.
|
|
*
|
|
* Rev 1.1 06 Dec 1993 12:19:36 KEVINKES
|
|
* Added a call to ClaimInterrupt.
|
|
*
|
|
* Rev 1.0 03 Dec 1993 14:11:52 KEVINKES
|
|
* Initial Revision.
|
|
*
|
|
*****************************************************************************/
|
|
#define FCT_ID 0x15A15
|
|
#include <ntddk.h>
|
|
#include <flpyenbl.h>
|
|
#include "include\public\adi_api.h"
|
|
#include "include\public\frb_api.h"
|
|
#include "q117kdi\include\kdiwhio.h"
|
|
#include "q117kdi\include\kdiwpriv.h"
|
|
#include "include\private\kdi_pub.h"
|
|
/*endinclude*/
|
|
|
|
dStatus kdi_GetFloppyController
|
|
(
|
|
/* INPUT PARAMETERS: */
|
|
|
|
KdiContextPtr kdi_context
|
|
|
|
/* UPDATE PARAMETERS: */
|
|
|
|
/* OUTPUT PARAMETERS: */
|
|
|
|
)
|
|
/* COMMENTS: *****************************************************************
|
|
*
|
|
* DEFINITIONS: *************************************************************/
|
|
{
|
|
|
|
/* DATA: ********************************************************************/
|
|
|
|
dSDDWord controller_wait;
|
|
NTSTATUS wait_status;
|
|
|
|
/* CODE: ********************************************************************/
|
|
|
|
if (!kdi_context->own_floppy_event) {
|
|
|
|
controller_wait = RtlLargeIntegerNegate(
|
|
RtlConvertLongToLargeInteger(
|
|
(LONG)(10 * 1000 * 15000)
|
|
)
|
|
);
|
|
|
|
wait_status = STATUS_SUCCESS;
|
|
|
|
kdi_CheckedDump(
|
|
QIC117INFO,
|
|
"Q117i: Waiting Controller Event\n", 0l);
|
|
|
|
if (kdi_context->controller_data.floppyEnablerApiSupported) {
|
|
|
|
wait_status = kdi_FloppyEnabler(
|
|
kdi_context->controller_data.apiDeviceObject,
|
|
IOCTL_AQUIRE_FDC,
|
|
&controller_wait);
|
|
|
|
} else {
|
|
|
|
wait_status = KeWaitForSingleObject(
|
|
kdi_context->controller_event,
|
|
Executive,
|
|
KernelMode,
|
|
dFALSE,
|
|
&controller_wait);
|
|
}
|
|
|
|
if (wait_status == STATUS_TIMEOUT) {
|
|
|
|
kdi_CheckedDump(
|
|
QIC117INFO,
|
|
"Q117i: Timeout Controller Event\n", 0l);
|
|
|
|
kdi_context->current_interrupt = dFALSE;
|
|
kdi_context->own_floppy_event = dFALSE;
|
|
return kdi_Error( ERR_KDI_CONTROLLER_BUSY, FCT_ID, ERR_SEQ_1 );
|
|
|
|
} else {
|
|
|
|
kdi_context->current_interrupt = dTRUE;
|
|
kdi_context->own_floppy_event = dTRUE;
|
|
|
|
kdi_CheckedDump(
|
|
QIC117INFO,
|
|
"Q117i: Have Controller Event\n", 0l);
|
|
|
|
return kdi_Error( ERR_KDI_CLAIMED_CONTROLLER, FCT_ID, ERR_SEQ_1 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return DONT_PANIC;
|
|
}
|
|
dStatus kdi_FloppyEnabler(
|
|
PDEVICE_OBJECT deviceObject,
|
|
int ioctl,
|
|
void *data
|
|
)
|
|
{
|
|
PIRP irp;
|
|
PIO_STACK_LOCATION irpStack;
|
|
KEVENT DoneEvent;
|
|
void **parms;
|
|
IO_STATUS_BLOCK IoStatus;
|
|
|
|
kdi_CheckedDump(QIC117INFO,"Calling floppy enabler with %x\n", (int)ioctl);
|
|
|
|
KeInitializeEvent(
|
|
&DoneEvent,
|
|
NotificationEvent,
|
|
FALSE);
|
|
|
|
|
|
//
|
|
// Create an IRP for enabler
|
|
//
|
|
irp = IoBuildDeviceIoControlRequest(
|
|
ioctl,
|
|
deviceObject,
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
0,
|
|
TRUE,
|
|
&DoneEvent,
|
|
&IoStatus
|
|
);
|
|
|
|
|
|
|
|
if (irp == NULL) {
|
|
|
|
kdi_CheckedDump(QIC117DBGP,"kdi_FloppyEnabler: Can't allocate Irp\n", 0);
|
|
|
|
//
|
|
// If an Irp can't be allocated, then this call will
|
|
// simply return. This will leave the queue frozen for
|
|
// this device, which means it can no longer be accessed.
|
|
//
|
|
|
|
return ERROR_ENCODE(ERR_OUT_OF_BUFFERS, FCT_ID, 7);
|
|
}
|
|
|
|
|
|
irpStack = IoGetNextIrpStackLocation(irp);
|
|
irpStack->Parameters.DeviceIoControl.Type3InputBuffer = data;
|
|
|
|
|
|
//
|
|
// Call the driver and request the operation
|
|
//
|
|
(VOID)IoCallDriver(deviceObject, irp);
|
|
|
|
//
|
|
// Now wait for operation to complete (should already be done, but
|
|
// maybe not)
|
|
//
|
|
KeWaitForSingleObject(
|
|
&DoneEvent,
|
|
Suspended,
|
|
KernelMode,
|
|
FALSE,
|
|
NULL);
|
|
|
|
|
|
return IoStatus.Status;
|
|
}
|
|
//
|
|
// Get the floppy controller speed information
|
|
//
|
|
kdi_GetFDCSpeed(
|
|
KdiContextPtr kdi_context,
|
|
dUByte dma
|
|
)
|
|
{
|
|
#ifdef OLD_WAY
|
|
if (dma <= 3) {
|
|
return 0;
|
|
} else {
|
|
return XFER_2Mbps;
|
|
}
|
|
#else
|
|
FDC_INFORMATION info;
|
|
NTSTATUS status;
|
|
|
|
|
|
if (kdi_context->controller_data.floppyEnablerApiSupported) {
|
|
|
|
//
|
|
// Ask the enabler for information about the fdc data rates
|
|
//
|
|
status = kdi_FloppyEnabler(
|
|
kdi_context->controller_data.apiDeviceObject,
|
|
IOCTL_GET_FDC_INFO,
|
|
&info);
|
|
|
|
//
|
|
// If the enabler returns 2 mbps then allow the driver to run
|
|
// at that speed
|
|
//
|
|
if (NT_SUCCESS(status) && (info.SpeedsAvailable & FDC_SPEED_2MB)) {
|
|
|
|
return XFER_2Mbps;
|
|
|
|
} else {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (dma <= 3) {
|
|
return 0;
|
|
} else {
|
|
return XFER_2Mbps;
|
|
}
|
|
|
|
}
|
|
#endif
|
|
}
|