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.
223 lines
4.8 KiB
223 lines
4.8 KiB
/*++
|
|
|
|
Copyright (c) 2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ideintrf.c
|
|
|
|
Abstract:
|
|
|
|
This module implements the "Pci Native Ide" interfaces supported
|
|
by the PCI driver.
|
|
|
|
Author:
|
|
|
|
Andrew Thornton (andrewth) 1-26-2001
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "pcip.h"
|
|
|
|
VOID
|
|
nativeIde_RefDereference(
|
|
IN PVOID Context
|
|
);
|
|
|
|
NTSTATUS
|
|
nativeIde_Constructor(
|
|
IN PVOID DeviceExtension,
|
|
IN PVOID PciInterface,
|
|
IN PVOID InterfaceSpecificData,
|
|
IN USHORT Version,
|
|
IN USHORT Size,
|
|
OUT PINTERFACE InterfaceReturn
|
|
);
|
|
|
|
NTSTATUS
|
|
nativeIde_Initializer(
|
|
IN PPCI_ARBITER_INSTANCE Instance
|
|
);
|
|
|
|
VOID
|
|
nativeIde_InterruptControl(
|
|
IN PVOID Context,
|
|
IN BOOLEAN Enable
|
|
);
|
|
|
|
|
|
//
|
|
// Define the Pci Routing interface "Interface" structure.
|
|
//
|
|
|
|
PCI_INTERFACE PciNativeIdeInterface = {
|
|
&GUID_PCI_NATIVE_IDE_INTERFACE, // InterfaceType
|
|
sizeof(PCI_NATIVE_IDE_INTERFACE), // MinSize
|
|
PCI_NATIVE_IDE_INTERFACE_VERSION, // MinVersion
|
|
PCI_NATIVE_IDE_INTERFACE_VERSION, // MaxVersion
|
|
PCIIF_PDO, // Flags
|
|
0, // ReferenceCount
|
|
PciInterface_NativeIde, // Signature
|
|
nativeIde_Constructor, // Constructor
|
|
nativeIde_Initializer // Instance Initializer
|
|
};
|
|
|
|
|
|
VOID
|
|
nativeIde_RefDereference(
|
|
IN PVOID Context
|
|
)
|
|
{
|
|
return;
|
|
}
|
|
|
|
NTSTATUS
|
|
nativeIde_Constructor(
|
|
PVOID DeviceExtension,
|
|
PVOID PciInterface,
|
|
PVOID InterfaceSpecificData,
|
|
USHORT Version,
|
|
USHORT Size,
|
|
PINTERFACE InterfaceReturn
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initialize the PCI_NATIVE_IDE_INTERFACE fields.
|
|
|
|
Arguments:
|
|
|
|
DeviceExtension - Extension of the device
|
|
|
|
PciInterface Pointer to the PciInterface record for this
|
|
interface type.
|
|
|
|
InterfaceSpecificData - from the QUERY_INTERFACE irp
|
|
|
|
Version - Version of the interface requested
|
|
|
|
Size - Size of the buffer
|
|
|
|
InterfaceReturn - Buffer to return the interface in
|
|
|
|
Return Value:
|
|
|
|
Status
|
|
|
|
--*/
|
|
|
|
{
|
|
PPCI_NATIVE_IDE_INTERFACE interface = (PPCI_NATIVE_IDE_INTERFACE)InterfaceReturn;
|
|
PPCI_PDO_EXTENSION pdo = DeviceExtension;
|
|
|
|
ASSERT_PCI_PDO_EXTENSION(pdo);
|
|
|
|
if (!PCI_IS_NATIVE_CAPABLE_IDE_CONTROLLER(pdo)) {
|
|
return STATUS_INVALID_DEVICE_REQUEST;
|
|
}
|
|
|
|
interface->Size = sizeof(PCI_NATIVE_IDE_INTERFACE);
|
|
interface->Context = DeviceExtension;
|
|
interface->Version = PCI_NATIVE_IDE_INTERFACE_VERSION;
|
|
interface->InterfaceReference = nativeIde_RefDereference;
|
|
interface->InterfaceDereference = nativeIde_RefDereference;
|
|
|
|
interface->InterruptControl = nativeIde_InterruptControl;
|
|
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
NTSTATUS
|
|
nativeIde_Initializer(
|
|
IN PPCI_ARBITER_INSTANCE Instance
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
For bus interface, does nothing, shouldn't actually be called.
|
|
|
|
Arguments:
|
|
|
|
Instance Pointer to the PDO extension.
|
|
|
|
Return Value:
|
|
|
|
Returns the status of this operation.
|
|
|
|
--*/
|
|
|
|
{
|
|
PCI_ASSERTMSG("PCI nativeide_Initializer, unexpected call.", 0);
|
|
|
|
return STATUS_UNSUCCESSFUL;
|
|
}
|
|
|
|
|
|
VOID
|
|
nativeIde_InterruptControl(
|
|
IN PVOID Context,
|
|
IN BOOLEAN Enable
|
|
)
|
|
/*++
|
|
|
|
|
|
Routine Description:
|
|
|
|
Controls the enabling and disabling of native mode PCI IDE controllers
|
|
IoSpaceEnable bits which on some controllers (currently Intel ICH3)
|
|
will mask off interrupt generation and this prevent the system from
|
|
crashing...
|
|
|
|
Arguments:
|
|
|
|
Context - Context from the PCI_NATIVE_IDE_INTERFACE
|
|
|
|
Enable - If TRUE then set the IoSpaceEnable bit in the command register,
|
|
otherwise disable it.
|
|
|
|
|
|
Return Value:
|
|
|
|
None - if this operation fails we have aleady bugchecked in the PCI driver
|
|
|
|
|
|
N.B. This function is called from with an ISR and this must be callable at
|
|
DEVICE_LEVEL
|
|
|
|
--*/
|
|
{
|
|
PPCI_PDO_EXTENSION pdo = Context;
|
|
USHORT command;
|
|
|
|
//
|
|
// Remember we gave the IDE driver control of this
|
|
//
|
|
pdo->IoSpaceUnderNativeIdeControl = TRUE;
|
|
|
|
PciReadDeviceConfig(pdo,
|
|
&command,
|
|
FIELD_OFFSET(PCI_COMMON_CONFIG, Command),
|
|
sizeof(command)
|
|
);
|
|
|
|
if (Enable) {
|
|
command |= PCI_ENABLE_IO_SPACE;
|
|
pdo->CommandEnables |= PCI_ENABLE_IO_SPACE;
|
|
} else {
|
|
command &= ~PCI_ENABLE_IO_SPACE;
|
|
pdo->CommandEnables &= ~PCI_ENABLE_IO_SPACE;
|
|
}
|
|
|
|
PciWriteDeviceConfig(pdo,
|
|
&command,
|
|
FIELD_OFFSET(PCI_COMMON_CONFIG, Command),
|
|
sizeof(command)
|
|
);
|
|
|
|
}
|
|
|