/*++ Copyright (C) Microsoft Corporation, 1991 - 1999 Module Name: fdc_data.h Abstract: This file includes data and hardware declarations for the NEC PD765 (aka AT, ISA, and ix86) and Intel 82077 (aka MIPS) floppy driver for NT. Author: Environment: Kernel mode only. Notes: --*/ #if DBG // // For checked kernels, define a macro to print out informational // messages. // // FdcDebug is normally 0. At compile-time or at run-time, it can be // set to some bit pattern for increasingly detailed messages. // // Big, nasty errors are noted with DBGP. Errors that might be // recoverable are handled by the WARN bit. More information on // unusual but possibly normal happenings are handled by the INFO bit. // And finally, boring details such as routines entered and register // dumps are handled by the SHOW bit. // #define FDCDBGP ((ULONG)0x00000001) #define FDCWARN ((ULONG)0x00000002) #define FDCINFO ((ULONG)0x00000004) #define FDCSHOW ((ULONG)0x00000008) #define FDCIRPPATH ((ULONG)0x00000010) #define FDCFORMAT ((ULONG)0x00000020) #define FDCSTATUS ((ULONG)0x00000040) extern ULONG FdcDebugLevel; #define FdcDump(LEVEL,STRING) \ do { \ if (FdcDebugLevel & LEVEL) { \ DbgPrint STRING; \ } \ } while (0) #else #define FdcDump(LEVEL,STRING) do {NOTHING;} while (0) #endif // // Macros to access the controller. Note that the *_PORT_UCHAR macros // work on all machines, whether the I/O ports are separate or in // memory space. // #define READ_CONTROLLER( Address ) \ READ_PORT_UCHAR( ( PUCHAR )Address ) #define WRITE_CONTROLLER( Address, Value ) \ WRITE_PORT_UCHAR( ( PUCHAR )Address, ( UCHAR )Value ) // // Retry counts - // // When moving a byte to/from the FIFO, we sit in a tight loop for a while // waiting for the controller to become ready. The number of times through // the loop is controlled by FIFO_TIGHTLOOP_RETRY_COUNT. When that count // expires, we'll wait in 10ms increments. FIFO_DELAY_RETRY_COUNT controls // how many times we wait. // // The ISR_SENSE_RETRY_COUNT is the maximum number of 1 microsecond // stalls that the ISR will do waiting for the controller to accept // a SENSE INTERRUPT command. We do this because there is a hardware // quirk in at least the NCR 8 processor machine where it can take // up to 50 microseconds to accept the command. // // When attempting I/O, we may run into many different errors. The // hardware retries things 8 times invisibly. If the hardware reports // any type of error, we will recalibrate and retry the operation // up to RECALIBRATE_RETRY_COUNT times. When this expires, we check to // see if there's an overrun - if so, the DMA is probably being hogged // by a higher priority device, so we repeat the earlier loop up to // OVERRUN_RETRY_COUNT times. // // Any packet that is about to be returned with an error caused by an // unexpected hardware error or state will be restarted from the very // beginning after resetting the hardware HARDWARE_RESET_RETRY_COUNT // times. // #define FIFO_TIGHTLOOP_RETRY_COUNT 500 #define FIFO_ISR_TIGHTLOOP_RETRY_COUNT 25 #define ISR_SENSE_RETRY_COUNT 50 #define FIFO_DELAY_RETRY_COUNT 5 #define RECALIBRATE_RETRY_COUNT 3 #define OVERRUN_RETRY_COUNT 1 #define HARDWARE_RESET_RETRY_COUNT 2 #define FLOPPY_RESET_ISR_THRESHOLD 20 #define RQM_READY_RETRY_COUNT 100 #define ONE_SECOND (10 * 1000 * 1000) // 100ns increments #define CANCEL_TIMER -1 #define START_TIMER (IsNEC_98 ? 15 : 9) #define EXPIRED_TIMER 0 #define RESET_NOT_RESETTING 0 #define RESET_DRIVE_RESETTING 1 // // Need some maximum size values so that we can appropriately set up the DMA // channels // #define MAX_BYTES_PER_SECTOR (IsNEC_98 ? 1024 : 512) #define MAX_SECTORS_PER_TRACK 36 // // Boot Configuration Information // // // Define the maximum number of controllers and floppies per controller // that this driver will support. // // The number of floppies per controller is fixed at 4, since the // controllers don't have enough bits to select more than that (and // actually, many controllers will only support 2). The number of // controllers per machine is arbitrary; 3 should be more than enough. // #define MAXIMUM_CONTROLLERS_PER_MACHINE 3 #define MAXIMUM_DISKETTES_PER_CONTROLLER 4 // // Floppy register structure. The base address of the controller is // passed in by configuration management. Note that this is the 82077 // structure, which is a superset of the PD765 structure. Not all of // the registers are used. // typedef union _CONTROLLER { struct { PUCHAR StatusA; PUCHAR StatusB; PUCHAR DriveControl; PUCHAR Tape; PUCHAR Status; PUCHAR Fifo; PUCHAR Reserved; union { PUCHAR DataRate; PUCHAR DiskChange; } DRDC; PUCHAR ModeChange; // for NEC98 : 0xbe PUCHAR ModeChangeEx; // for NEC98 : 0x4be }; PUCHAR Address[8]; } CONTROLLER, *PCONTROLLER; // // Io Port address information structure. This structure is used to save // information about ioport addresses as it is collected from a resource // requirements list. // typedef struct _IO_PORT_INFO { LARGE_INTEGER BaseAddress; UCHAR Map; LIST_ENTRY ListEntry; } IO_PORT_INFO, *PIO_PORT_INFO; // // Parameter fields passed to the CONFIGURE command. // #define COMMND_CONFIGURE_IMPLIED_SEEKS 0x40 #define COMMND_CONFIGURE_FIFO_THRESHOLD 0x0F #define COMMND_CONFIGURE_DISABLE_FIFO 0x20 #define COMMND_CONFIGURE_DISABLE_POLLING 0x10 // // Write Enable bit for PERPENDICULAR MODE command. // #define COMMND_PERPENDICULAR_MODE_OW 0x80 // // The command table is used by FlIssueCommand() to determine how many // bytes to get and receive, and whether or not to wait for an interrupt. // Some commands have extra bits; COMMAND_MASK takes these off. // FirstResultByte indicates whether the command has a result stage // or not; if so, it's 1 because the ISR read the 1st byte, and // NumberOfResultBytes is 1 less than expected. If not, it's 0 and // NumberOfResultBytes is 2, since the ISR will have issued a SENSE // INTERRUPT STATUS command. // #define COMMAND_MASK 0x1f #define FDC_NO_DATA 0x00 #define FDC_READ_DATA 0x01 #define FDC_WRITE_DATA 0x02 typedef struct _COMMAND_TABLE { UCHAR OpCode; UCHAR NumberOfParameters; UCHAR FirstResultByte; UCHAR NumberOfResultBytes; BOOLEAN InterruptExpected; BOOLEAN AlwaysImplemented; UCHAR DataTransfer; } COMMAND_TABLE; // // Bits in the DRIVE_CONTROL register. // #define DRVCTL_RESET 0x00 #define DRVCTL_ENABLE_CONTROLLER (IsNEC_98 ? 0x80 : 0x04) #define DRVCTL_ENABLE_DMA_AND_INTERRUPTS (IsNEC_98 ? 0x10 : 0x08) #define DRVCTL_DRIVE_0 0x10 #define DRVCTL_DRIVE_1 0x21 #define DRVCTL_DRIVE_2 0x42 #define DRVCTL_DRIVE_3 0x83 #define DRVCTL_DRIVE_MASK 0x03 #define DRVCTL_MOTOR_MASK (IsNEC_98 ? 0x08 : 0xf0) #define DRVCTL_HD_BIT 0x20 // for NEC98 #define DRVCTL_AI_ENABLE 0x20 // for NEC98. Indicate AI enable bit. // // Bits in the STATUS register. // #define STATUS_DRIVE_0_BUSY 0x01 #define STATUS_DRIVE_1_BUSY 0x02 #define STATUS_DRIVE_2_BUSY 0x04 #define STATUS_DRIVE_3_BUSY 0x08 #define STATUS_CONTROLLER_BUSY 0x10 #define STATUS_DMA_UNUSED 0x20 #define STATUS_DIRECTION_READ 0x40 #define STATUS_DATA_REQUEST 0x80 #define STATUS_IO_READY_MASK 0xc0 #define STATUS_READ_READY 0xc0 #define STATUS_WRITE_READY 0x80 #define STATUS_IO_READY_MASK1 0x80 // for NEC98. #define STATUS_RQM_READY 0x80 // for NEC98. // // Bits in the DATA_RATE register. // #define DATART_0125 0x03 #define DATART_0250 0x02 #define DATART_0300 0x01 #define DATART_0500 0x00 #define DATART_1000 0x03 #define DATART_RESERVED 0xfc // // Bits in the DISK_CHANGE register. // #define DSKCHG_RESERVED 0x7f #define DSKCHG_DISKETTE_REMOVED 0x80 // // Bits in status register 0. // #define STREG0_DRIVE_0 0x00 #define STREG0_DRIVE_1 0x01 #define STREG0_DRIVE_2 0x02 #define STREG0_DRIVE_3 0x03 #define STREG0_HEAD 0x04 #define STREG0_DRIVE_NOT_READY 0x08 #define STREG0_DRIVE_FAULT 0x10 #define STREG0_SEEK_COMPLETE 0x20 #define STREG0_END_NORMAL 0x00 #define STREG0_END_ERROR 0x40 #define STREG0_END_INVALID_COMMAND 0x80 #define STREG0_END_DRIVE_NOT_READY 0xC0 #define STREG0_END_MASK 0xC0 // // Bits in status register 1. // #define STREG1_ID_NOT_FOUND 0x01 #define STREG1_WRITE_PROTECTED 0x02 #define STREG1_SECTOR_NOT_FOUND 0x04 #define STREG1_RESERVED1 0x08 #define STREG1_DATA_OVERRUN 0x10 #define STREG1_CRC_ERROR 0x20 #define STREG1_RESERVED2 0x40 #define STREG1_END_OF_DISKETTE 0x80 // // Bits in status register 2. // #define STREG2_SUCCESS 0x00 #define STREG2_DATA_NOT_FOUND 0x01 #define STREG2_BAD_CYLINDER 0x02 #define STREG2_SCAN_FAIL 0x04 #define STREG2_SCAN_EQUAL 0x08 #define STREG2_WRONG_CYLINDER 0x10 #define STREG2_CRC_ERROR 0x20 #define STREG2_DELETED_DATA 0x40 #define STREG2_RESERVED 0x80 // // Bits in status register 3. // #define STREG3_DRIVE_0 0x00 #define STREG3_DRIVE_1 0x01 #define STREG3_DRIVE_2 0x02 #define STREG3_DRIVE_3 0x03 #define STREG3_HEAD 0x04 #define STREG3_TWO_SIDED 0x08 #define STREG3_TRACK_0 0x10 #define STREG3_DRIVE_READY 0x20 #define STREG3_WRITE_PROTECTED 0x40 #define STREG3_DRIVE_FAULT 0x80 #define VALID_NEC_FDC 0x90 // version number #define NSC_PRIMARY_VERSION 0x70 // National 8477 verion number #define NSC_MASK 0xF0 // mask for National version number #define INTEL_MASK 0xe0 #define INTEL_44_PIN_VERSION 0x40 #define INTEL_64_PIN_VERSION 0x00 #define DMA_DIR_UNKNOWN 0xff /* The DMA direction is not currently known */ #define DMA_WRITE 0 /* Program the DMA to write (FDC->DMA->RAM) */ #define DMA_READ 1 /* Program the DMA to read (RAM->DMA->FDC) */ // // Strings for PnP Identification. // #define FDC_FLOPPY_COMPATIBLE_IDS L"*PNP0700\0GenFloppyDisk\0\0" #define FDC_FLOPPY_COMPATIBLE_IDS_LENGTH 24 // NB wide characters. #define FDC_TAPE_COMPATIBLE_IDS L"QICPNP\0\0" #define FDC_TAPE_COMPATIBLE_IDS_LENGTH 8 // NB wide characters. #define FDC_CONTROLLER_COMPATIBLE_IDS L"*PNP0700\0\0" #define FDC_CONTROLLER_COMPATIBLE_IDS_LENGTH 10 // NB wide characters. // // Runtime device structures // // // There is one FDC_EXTENSION attached to the device object of each // floppy drive. Only data directly related to that drive (and the media // in it) is stored here; common data is in CONTROLLER_DATA. So the // FDC_EXTENSION has a pointer to the CONTROLLER_DATA. // typedef struct _FDC_EXTENSION_HEADER { // // A flag to indicate whether this is a FDO or a PDO // BOOLEAN IsFDO; // // A pointer to our own device object. // PDEVICE_OBJECT Self; } FDC_EXTENSION_HEADER, *PFDC_EXTENSION_HEADER; typedef enum _FDC_DEVICE_TYPE { FloppyControllerDevice, FloppyDiskDevice, FloppyTapeDevice } FDC_DEVICE_TYPE; typedef struct _FDC_PDO_EXTENSION { FDC_EXTENSION_HEADER; // // A pointer to the FDO that created us. // PDEVICE_OBJECT ParentFdo; // // The instance number for this PDO. Determined by the order of the // callbacks from IoQueryDeviceDescription. // USHORT Instance; // // The type of device this PDO supports. Currently disk or tape. // FDC_DEVICE_TYPE DeviceType; SHORT TapeVendorId; // // A flag that indicates whether this PDO is pending removal. // BOOLEAN Removed; // // This PDO's entry in its parent's list of related PDOs. // LIST_ENTRY PdoLink; // // The enumerated number of this specific device, as returned from // IoQueryDeviceDescription. // ULONG PeripheralNumber; PDEVICE_OBJECT TargetObject; } FDC_PDO_EXTENSION, *PFDC_PDO_EXTENSION; typedef struct _FDC_FDO_EXTENSION { FDC_EXTENSION_HEADER; // // A kernel resource for controlling access to the FDC. // ERESOURCE Resource; // // A pointer to the PDO to which this FDO is attached. // PDEVICE_OBJECT UnderlyingPDO; // // The top of the object stack to which this FDO is attached. // PDEVICE_OBJECT TargetObject; // // A list and count of PDOs that were created by this FDO. // LIST_ENTRY PDOs; ULONG NumPDOs; BOOLEAN Removed; ULONG OutstandingRequests; KEVENT RemoveEvent; BOOLEAN TapeEnumerationPending; KEVENT TapeEnumerationEvent; // // Some stuff for power management // LIST_ENTRY PowerQueue; KSPIN_LOCK PowerQueueSpinLock; KEVENT PowerEvent; SYSTEM_POWER_STATE CurrentPowerState; LARGE_INTEGER LastMotorSettleTime; BOOLEAN WakeUp; // // The bus number on which this physical device lives. // INTERFACE_TYPE BusType; ULONG BusNumber; ULONG ControllerNumber; BOOLEAN DeviceObjectInitialized; LARGE_INTEGER InterruptDelay; LARGE_INTEGER Minimum10msDelay; KEVENT InterruptEvent; LONG InterruptTimer; CCHAR ResettingController; KEVENT AllocateAdapterChannelEvent; LONG AdapterChannelRefCount; PKEVENT AcquireEvent; HANDLE AcquireEventHandle; KEVENT SynchEvent; KDPC LogErrorDpc; KDPC BufferTimerDpc; KTIMER BufferTimer; PKINTERRUPT InterruptObject; PVOID MapRegisterBase; PADAPTER_OBJECT AdapterObject; PDEVICE_OBJECT CurrentDeviceObject; PDRIVER_OBJECT DriverObject; CONTROLLER ControllerAddress; ULONG SpanOfControllerAddress; ULONG NumberOfMapRegisters; ULONG BuffersRequested; ULONG BufferCount; ULONG BufferSize; PTRANSFER_BUFFER TransferBuffers; ULONG IsrReentered; ULONG ControllerVector; KIRQL ControllerIrql; KINTERRUPT_MODE InterruptMode; KAFFINITY ProcessorMask; UCHAR FifoBuffer[10]; BOOLEAN AllowInterruptProcessing; BOOLEAN SharableVector; BOOLEAN SaveFloatState; BOOLEAN HardwareFailed; BOOLEAN CommandHasResultPhase; BOOLEAN ControllerConfigurable; BOOLEAN MappedControllerAddress; BOOLEAN CurrentInterrupt; BOOLEAN Model30; UCHAR PerpendicularDrives; UCHAR NumberOfDrives; UCHAR DriveControlImage; UCHAR HardwareFailCount; BOOLEAN ControllerInUse; UCHAR FdcType; UCHAR FdcSpeeds; PIRP CurrentIrp; UCHAR DriveOnValue; PDEVICE_OBJECT LastDeviceObject; BOOLEAN Clock48MHz; BOOLEAN FdcEnablerSupported; PDEVICE_OBJECT FdcEnablerDeviceObject; PFILE_OBJECT FdcEnablerFileObject; BOOLEAN ResetFlag; // for NEC98 BOOLEAN FloppyEquip; // for NEC98 UCHAR MotorRunning; // for NEC98 UCHAR ResultStatus0[4]; // for NEC98 #ifdef TOSHIBAJ // For 3mode support BOOLEAN Available3Mode; // Feb.9.1998 KIADP010 Assign Toshiba special registers. PUCHAR ConfigBase; #endif } FDC_FDO_EXTENSION, *PFDC_FDO_EXTENSION; #ifdef TOSHIBAJ // Feb.9.1998 KIADP011 Get base address and identifier // Feb.9.1998 KIADP012 Identify controller // Feb.9.1998 KIADP013 Change Speed // Definitions for SMC 37C67X/777 // Ports #define SMC_INDEX_PORT(port) (port) #define SMC_DATA_PORT(port) (port)+1 // Key #define SMC_KEY_ENTER_CONFIG 0x55 #define SMC_KEY_EXIT_CONFIG 0xaa #define SMC_CONFIG_PORT_LENGTH 2 // Index #define SMC_INDEX_DEVICE 0x07 #define SMC_INDEX_IDENTIFY 0x20 #define SMC_INDEX_CONF_ADDR_0 0x26 #define SMC_INDEX_CONF_ADDR_1 0x27 #define SMC_INDEX_FDC_OPT 0xf1 // Device #define SMC_DEVICE_FDC 0x00 // Mask #define SMC_MASK_DENSEL 0x0c // Dencity select #define SMC_DELSEL_HIGH 0x08 // 300rpm #define SMC_DENSEL_LOW 0x0c // 360rpm #endif // // NEC98: Registory path of MultifunctionAdapter. // #define ISA_BUS_NODE \ "\\Registry\\MACHINE\\HARDWARE\\DESCRIPTION\\System\\MultifunctionAdapter\\%d" // // Macro // // // Enable/Disable Controller // #define DISABLE_CONTROLLER_IMAGE(FdoExtension) \ { \ if (IsNEC_98) { \ FdoExtension->DriveControlImage |= DRVCTL_ENABLE_DMA_AND_INTERRUPTS; \ FdoExtension->DriveControlImage |= DRVCTL_ENABLE_CONTROLLER; \ FdoExtension->ResetFlag = FALSE; \ } else { \ FdoExtension->DriveControlImage |= DRVCTL_ENABLE_DMA_AND_INTERRUPTS; \ FdoExtension->DriveControlImage &= ~( DRVCTL_ENABLE_CONTROLLER ); \ } \ } #define ENABLE_CONTROLLER_IMAGE(FdoExtension) \ { \ if (IsNEC_98) { \ FdoExtension->DriveControlImage &= ~( DRVCTL_ENABLE_CONTROLLER ); \ FdoExtension->DriveControlImage |= DRVCTL_AI_ENABLE; \ } else { \ FdoExtension->DriveControlImage |= DRVCTL_ENABLE_CONTROLLER; \ } \ } // // Dma speed // #define DEFAULT_DMA_SPEED (IsNEC_98 ? Compatible : TypeA) // // Paging Driver with Mutex // #define FDC_PAGE_INITIALIZE_DRIVER_WITH_MUTEX \ { \ if (!IsNEC_98) { \ PagingMutex = ExAllocatePool(NonPagedPool, sizeof(FAST_MUTEX)); \ if (!PagingMutex) { \ return STATUS_INSUFFICIENT_RESOURCES; \ } \ ExInitializeFastMutex(PagingMutex); \ MmPageEntireDriver(DriverEntry); \ } \ } #define FDC_PAGE_RESET_DRIVER_WITH_MUTEX \ { \ if (!IsNEC_98) { \ ExAcquireFastMutex( PagingMutex ); \ if ( ++PagingReferenceCount == 1 ) { \ MmResetDriverPaging( DriverEntry ); \ } \ ExReleaseFastMutex( PagingMutex ); \ } \ } #define FDC_PAGE_ENTIRE_DRIVER_WITH_MUTEX \ { \ if (!IsNEC_98) { \ ExAcquireFastMutex(PagingMutex); \ if (--PagingReferenceCount == 0) { \ MmPageEntireDriver(DriverEntry); \ } \ ExReleaseFastMutex(PagingMutex); \ } \ } // // Prototypes of external routines. // /* LONG sprintf( CHAR *, const CHAR *, ... ); */ // // Prototypes of driver routines. // NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ); NTSTATUS FcAllocateCommonBuffers( IN PFDC_FDO_EXTENSION FdoExtension ); NTSTATUS FcInitializeControllerHardware( IN PFDC_FDO_EXTENSION FdoExtension, IN PDEVICE_OBJECT DeviceObject ); NTSTATUS FdcCreateClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FdcInternalDeviceControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FdcPnp( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FdcPower( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FdcAddDevice( IN PDRIVER_OBJECT DriverObject, IN OUT PDEVICE_OBJECT PhysicalDeviceObject ); BOOLEAN FdcInterruptService( IN PKINTERRUPT Interrupt, IN PVOID Context ); VOID FdcDeferredProcedure( IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); NTSTATUS FcAcquireFdc( IN OUT PFDC_FDO_EXTENSION FdoExtension, IN PLARGE_INTEGER TimeOut ); NTSTATUS FcReleaseFdc( IN OUT PFDC_FDO_EXTENSION FdoExtension ); VOID FcReportFdcInformation( IN PFDC_PDO_EXTENSION PdoExtension, IN PFDC_FDO_EXTENSION FdcExtension, IN OUT PIO_STACK_LOCATION IrpSp ); NTSTATUS FcTurnOnMotor( IN PFDC_FDO_EXTENSION FdcExtension, IN OUT PIO_STACK_LOCATION irpSp ); NTSTATUS FcTurnOffMotor( IN PFDC_FDO_EXTENSION FdoExtension ); VOID FcAllocateAdapterChannel( IN OUT PFDC_FDO_EXTENSION FdoExtension ); VOID FcFreeAdapterChannel( IN OUT PFDC_FDO_EXTENSION FdoExtension ); IO_ALLOCATION_ACTION FdcAllocateAdapterChannel( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID MapRegisterBase, IN PVOID Context ); NTSTATUS FcSendByte( IN UCHAR ByteToSend, IN PFDC_FDO_EXTENSION FdoExtension, IN BOOLEAN AllowLongDelay ); NTSTATUS FcGetByte( OUT PUCHAR ByteToGet, IN OUT PFDC_FDO_EXTENSION FdoExtension, IN BOOLEAN AllowLongDelay ); NTSTATUS FcIssueCommand( IN OUT PFDC_FDO_EXTENSION FdoExtension, IN PUCHAR FifoInBuffer, OUT PUCHAR FifoOutBuffer, IN PVOID IoHandle, IN ULONG IoOffset, IN ULONG TransferBytes ); VOID FcLogErrorDpc( IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemContext1, IN PVOID SystemContext2 ); BOOLEAN FcClearIsrReentered( IN PVOID Context ); NTSTATUS FcGetFdcInformation( IN OUT PFDC_FDO_EXTENSION FdoExtension ); VOID FdcCheckTimer( IN PDEVICE_OBJECT DeviceObject, IN OUT PVOID Context ); BOOLEAN FdcTimerSync( IN OUT PVOID Context ); VOID FdcStartIo( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FcStartCommand( IN OUT PFDC_FDO_EXTENSION FdoExtension, IN PUCHAR FifoInBuffer, OUT PUCHAR FifoOutBuffer, IN PVOID IoHandle, IN ULONG IoOffset, IN ULONG TransferBytes, IN BOOLEAN AllowLongDelay ); NTSTATUS FcFinishCommand( IN OUT PFDC_FDO_EXTENSION FdoExtension, IN PUCHAR FifoInBuffer, OUT PUCHAR FifoOutBuffer, IN PVOID IoHandle, IN ULONG IoOffset, IN ULONG TransferBytes, IN BOOLEAN AllowLongDelay ); NTSTATUS FcFinishReset( IN OUT PFDC_FDO_EXTENSION FdoExtension ); VOID FdcBufferThread( IN PVOID Context ); NTSTATUS FcFdcEnabler( IN PDEVICE_OBJECT DeviceObject, IN ULONG Ioctl, IN OUT PVOID Data ); NTSTATUS FcSynchronizeQueue( IN OUT PFDC_FDO_EXTENSION FdoExtension, IN PIRP Irp ); NTSTATUS FdcPnpComplete( PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context ); NTSTATUS FdcStartDevice( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FdcInitializeDeviceObject( IN PDEVICE_OBJECT DeviceObject ); NTSTATUS FdcFdoPnp( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FdcPdoPnp( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FdcFilterResourceRequirements( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FdcQueryDeviceRelations( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FdcConfigCallBack( IN PVOID Context, IN PUNICODE_STRING PathName, IN INTERFACE_TYPE BusType, IN ULONG BusNumber, IN PKEY_VALUE_FULL_INFORMATION *BusInformation, IN CONFIGURATION_TYPE ControllerType, IN ULONG ControllerNumber, IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation, IN CONFIGURATION_TYPE PeripheralType, IN ULONG PeripheralNumber, IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation ); NTSTATUS FdcFdoConfigCallBack( IN PVOID Context, IN PUNICODE_STRING PathName, IN INTERFACE_TYPE BusType, IN ULONG BusNumber, IN PKEY_VALUE_FULL_INFORMATION *BusInformation, IN CONFIGURATION_TYPE ControllerType, IN ULONG ControllerNumber, IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation, IN CONFIGURATION_TYPE PeripheralType, IN ULONG PeripheralNumber, IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation ); NTSTATUS FdcEnumerateQ117( IN PFDC_FDO_EXTENSION FdoExtension ); VOID FdcGetEnablerDevice( IN OUT PFDC_FDO_EXTENSION FdoExtension ); NTSTATUS FdcPdoInternalDeviceControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FdcFdoInternalDeviceControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); PVOID FdcGetControllerBase( IN INTERFACE_TYPE BusType, IN ULONG BusNumber, PHYSICAL_ADDRESS IoAddress, ULONG NumberOfBytes, BOOLEAN InIoSpace ); // // For NEC98 // NTSTATUS FdcHdbit( IN PDEVICE_OBJECT DeviceObject, IN PFDC_FDO_EXTENSION FdoExtension, IN PSET_HD_BIT_PARMS SetHdBitParams ); ULONG FdcGet0Seg( IN PUCHAR ConfigrationData1, IN ULONG Offset ); ULONG FdcFindIsaBusNode( IN OUT VOID ); UCHAR FdcRqmReadyWait( IN PFDC_FDO_EXTENSION FdoExtension, IN ULONG IssueSenseInterrupt ); #ifdef TOSHIBAJ NTSTATUS FcFdcEnable3Mode( IN PFDC_FDO_EXTENSION FdoExtension, IN PIRP Irp ); NTSTATUS FcFdcAvailable3Mode( IN PFDC_FDO_EXTENSION FdoExtension, IN PIRP Irp ); BOOLEAN FcCheckConfigPort( IN PUCHAR ConfigPort ); #endif