mirror of
https://github.com/reactos/reactos.git
synced 2024-12-29 10:35:28 +00:00
130 lines
3.3 KiB
C
130 lines
3.3 KiB
C
/*
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
* PROJECT: PCI IDE bus driver
|
|
* FILE: drivers/storage/pciide/pciide.c
|
|
* PURPOSE: Main file
|
|
* PROGRAMMERS: Hervé Poussineau (hpoussin@reactos.org)
|
|
*/
|
|
|
|
#include "pciide.h"
|
|
|
|
#define NDEBUG
|
|
#include <debug.h>
|
|
|
|
IDE_CHANNEL_STATE NTAPI
|
|
PciIdeChannelEnabled(
|
|
IN PVOID DeviceExtension,
|
|
IN ULONG Channel)
|
|
{
|
|
PCI_COMMON_CONFIG PciConfig;
|
|
NTSTATUS Status;
|
|
|
|
DPRINT("PciIdeChannelEnabled(%p, %lu)\n", DeviceExtension, Channel);
|
|
|
|
Status = PciIdeXGetBusData(
|
|
DeviceExtension,
|
|
&PciConfig,
|
|
0,
|
|
PCI_COMMON_HDR_LENGTH);
|
|
if (!NT_SUCCESS(Status))
|
|
{
|
|
DPRINT("PciIdeXGetBusData() failed with status 0x%08lx\n", Status);
|
|
return ChannelStateUnknown;
|
|
}
|
|
|
|
if (PCI_CONFIGURATION_TYPE(&PciConfig) != PCI_DEVICE_TYPE)
|
|
{
|
|
DPRINT("Wrong PCI card type. Disabling IDE channel #%lu\n", Channel);
|
|
return ChannelDisabled;
|
|
}
|
|
|
|
if (PciConfig.BaseClass != PCI_CLASS_MASS_STORAGE_CTLR || PciConfig.SubClass != PCI_SUBCLASS_MSC_IDE_CTLR)
|
|
{
|
|
DPRINT("Wrong PCI card base class/sub class. Disabling IDE channel #%lu\n", Channel);
|
|
return ChannelDisabled;
|
|
}
|
|
|
|
return ChannelStateUnknown;
|
|
}
|
|
|
|
BOOLEAN NTAPI
|
|
PciIdeSyncAccessRequired(
|
|
IN PVOID DeviceExtension)
|
|
{
|
|
DPRINT1("PciIdeSyncAccessRequired %p\n", DeviceExtension);
|
|
|
|
return FALSE; /* FIXME */
|
|
}
|
|
|
|
NTSTATUS NTAPI
|
|
PciIdeTransferModeSelect(
|
|
IN PVOID DeviceExtension,
|
|
IN PPCIIDE_TRANSFER_MODE_SELECT XferMode)
|
|
{
|
|
ULONG i;
|
|
|
|
DPRINT1("PciIdeTransferModeSelect(%p %p)\n", DeviceExtension, XferMode);
|
|
|
|
for (i = 0; i < MAX_IDE_DEVICE; i++)
|
|
XferMode->DevicePresent[i] = FALSE; /* FIXME */
|
|
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
ULONG NTAPI
|
|
PciIdeUseDma(
|
|
IN PVOID DeviceExtension,
|
|
IN PUCHAR CdbCommand,
|
|
IN PUCHAR Slave)
|
|
{
|
|
DPRINT("PciIdeUseDma(%p %p %p)\n", DeviceExtension, CdbCommand, Slave);
|
|
|
|
/* Nothing should prevent us to use DMA */
|
|
return 1;
|
|
}
|
|
|
|
NTSTATUS NTAPI
|
|
PciIdeGetControllerProperties(
|
|
IN PVOID DeviceExtension,
|
|
OUT PIDE_CONTROLLER_PROPERTIES ControllerProperties)
|
|
{
|
|
if (ControllerProperties->Size != sizeof(IDE_CONTROLLER_PROPERTIES))
|
|
return STATUS_REVISION_MISMATCH;
|
|
|
|
ControllerProperties->PciIdeChannelEnabled = PciIdeChannelEnabled;
|
|
ControllerProperties->PciIdeSyncAccessRequired = PciIdeSyncAccessRequired;
|
|
ControllerProperties->PciIdeTransferModeSelect = PciIdeTransferModeSelect;
|
|
ControllerProperties->IgnoreActiveBitForAtaDevice = FALSE;
|
|
ControllerProperties->AlwaysClearBusMasterInterrupt = TRUE;
|
|
ControllerProperties->PciIdeUseDma = PciIdeUseDma;
|
|
ControllerProperties->AlignmentRequirement = 1;
|
|
ControllerProperties->DefaultPIO = 0; /* FIXME */
|
|
ControllerProperties->PciIdeUdmaModesSupported = NULL; /* optional */
|
|
|
|
ControllerProperties->SupportedTransferMode[0][0] =
|
|
ControllerProperties->SupportedTransferMode[0][1] =
|
|
ControllerProperties->SupportedTransferMode[1][0] =
|
|
ControllerProperties->SupportedTransferMode[1][1] =
|
|
PIO_MODE0 | PIO_MODE1 | PIO_MODE2 | PIO_MODE3 | PIO_MODE4 |
|
|
SWDMA_MODE0 | SWDMA_MODE1 | SWDMA_MODE2 |
|
|
MWDMA_MODE0 | MWDMA_MODE1 | MWDMA_MODE2 |
|
|
UDMA_MODE0 | UDMA_MODE1 | UDMA_MODE2 | UDMA_MODE3 | UDMA_MODE4;
|
|
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
NTSTATUS NTAPI
|
|
DriverEntry(
|
|
IN PDRIVER_OBJECT DriverObject,
|
|
IN PUNICODE_STRING RegistryPath)
|
|
{
|
|
NTSTATUS Status;
|
|
|
|
Status = PciIdeXInitialize(
|
|
DriverObject,
|
|
RegistryPath,
|
|
PciIdeGetControllerProperties,
|
|
0);
|
|
|
|
return Status;
|
|
}
|