diff --git a/reactos/drivers/dd/ide/ide.c b/reactos/drivers/dd/ide/ide.c index 4560df40172..2a4b8006a38 100644 --- a/reactos/drivers/dd/ide/ide.c +++ b/reactos/drivers/dd/ide/ide.c @@ -1,4 +1,4 @@ -/* $Id: ide.c,v 1.45 2001/09/09 21:28:05 ekohl Exp $ +/* $Id: ide.c,v 1.46 2001/11/01 00:28:57 ekohl Exp $ * * IDE.C - IDE Disk driver * written by Rex Jolliff @@ -81,48 +81,6 @@ // ------------------------------------------------------- File Static Data -#define PCI_TYPE0_ADDRESSES 6 -#define PCI_TYPE1_ADDRESSES 2 - -typedef struct _PCI_COMMON_CONFIG -{ - USHORT VendorID; // (ro) - USHORT DeviceID; // (ro) - USHORT Command; // Device control - USHORT Status; - UCHAR RevisionID; // (ro) - UCHAR ProgIf; // (ro) - UCHAR SubClass; // (ro) - UCHAR BaseClass; // (ro) - UCHAR CacheLineSize; // (ro+) - UCHAR LatencyTimer; // (ro+) - UCHAR HeaderType; // (ro) - UCHAR BIST; // Built in self test - - union - { - struct _PCI_HEADER_TYPE_0 - { - ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; - ULONG CIS; - USHORT SubVendorID; - USHORT SubSystemID; - ULONG ROMBaseAddress; - ULONG Reserved2[2]; - - UCHAR InterruptLine; // - UCHAR InterruptPin; // (ro) - UCHAR MinimumGrant; // (ro) - UCHAR MaximumLatency; // (ro) - } type0; - - - } u; - - UCHAR DeviceSpecific[192]; - -} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; - typedef struct _IDE_CONTROLLER_PARAMETERS { @@ -645,6 +603,7 @@ IDEResetController(IN WORD CommandPort, return IDEReadError(CommandPort) == 1; } + // IDECreateDevices // // DESCRIPTION: @@ -683,7 +642,6 @@ IDECreateDevices(IN PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT DiskDeviceObject; PDEVICE_OBJECT PartitionDeviceObject; PIDE_DEVICE_EXTENSION DiskDeviceExtension; -// PIDE_DEVICE_EXTENSION PartitionDeviceExtension; UNICODE_STRING UnicodeDeviceDirName; OBJECT_ATTRIBUTES DeviceDirAttributes; HANDLE Handle; @@ -703,7 +661,8 @@ IDECreateDevices(IN PDRIVER_OBJECT DriverObject, /* Get the Drive Identification Data */ if (!IDEGetDriveIdentification(CommandPort, DriveIdx, &DrvParms)) { - DPRINT("Giving up on drive %d on controller %d...\n", + CHECKPOINT1; + DbgPrint("Giving up on drive %d on controller %d...\n", DriveIdx, ControllerExtension->Number); return FALSE; @@ -756,10 +715,6 @@ IDECreateDevices(IN PDRIVER_OBJECT DriverObject, /* Increase number of available physical disk drives */ IoGetConfigurationInformation()->DiskCount++; - /* Initialize device extension for the disk device */ -// DiskDeviceExtension = (PIDE_DEVICE_EXTENSION)DiskDeviceObject->DeviceExtension; -// DiskDeviceExtension->DiskExtension = (PVOID)DiskDeviceExtension; - /* * Initialize the controller timer here * (since it has to be tied to a device) @@ -809,18 +764,11 @@ IDECreateDevices(IN PDRIVER_OBJECT DriverObject, HarddiskIdx, &DrvParms, PartitionEntry); -// PartitionEntry->PartitionNumber, -// PartitionEntry->StartingOffset.QuadPart / 512 /* DrvParms.BytesPerSector*/, -// PartitionEntry->PartitionLength.QuadPart / 512 /*DrvParms.BytesPerSector*/); if (!NT_SUCCESS(Status)) { DbgPrint("IDECreateDevice() failed\n"); break; } - - /* Initialize pointer to disk device extension */ -// PartitionDeviceExtension = (PIDE_DEVICE_EXTENSION)PartitionDeviceObject->DeviceExtension; -// PartitionDeviceExtension->DiskExtension = (PVOID)DiskDeviceExtension; } if (PartitionList != NULL) @@ -847,15 +795,16 @@ IDECreateDevices(IN PDRIVER_OBJECT DriverObject, // BOOLEAN -IDEGetDriveIdentification(IN int CommandPort, - IN int DriveNum, - OUT PIDE_DRIVE_IDENTIFY DrvParms) +IDEGetDriveIdentification(IN int CommandPort, + IN int DriveNum, + OUT PIDE_DRIVE_IDENTIFY DrvParms) { // Get the Drive Identify block from drive or die if (IDEPolledRead(CommandPort, 0, 0, 0, 0, 0, (DriveNum ? IDE_DH_DRV1 : 0), IDE_CMD_IDENT_DRV, (BYTE *)DrvParms) != 0) { + CHECKPOINT1; return FALSE; } @@ -1045,9 +994,6 @@ IDECreatePartitionDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DiskNumber, IN PIDE_DRIVE_IDENTIFY DrvParms, IN PPARTITION_INFORMATION PartitionInfo) -// IN ULONG PartitionNumber, -// IN ULONGLONG Offset, -// IN ULONGLONG Size) { WCHAR NameBuffer[IDE_MAX_NAME_LENGTH]; WCHAR ArcNameBuffer[IDE_MAX_NAME_LENGTH + 15]; @@ -1153,31 +1099,32 @@ IDECreatePartitionDevice(IN PDRIVER_OBJECT DriverObject, // int 0 is success, non 0 is an error code // -static int -IDEPolledRead(IN WORD Address, - IN BYTE PreComp, - IN BYTE SectorCnt, - IN BYTE SectorNum , - IN BYTE CylinderLow, - IN BYTE CylinderHigh, - IN BYTE DrvHead, - IN BYTE Command, - OUT BYTE *Buffer) +static int +IDEPolledRead(IN WORD Address, + IN BYTE PreComp, + IN BYTE SectorCnt, + IN BYTE SectorNum, + IN BYTE CylinderLow, + IN BYTE CylinderHigh, + IN BYTE DrvHead, + IN BYTE Command, + OUT BYTE *Buffer) { BYTE Status; int RetryCount; /* Wait for STATUS.BUSY to clear */ - for (RetryCount = 0; RetryCount < IDE_MAX_BUSY_RETRIES; RetryCount++) + for (RetryCount = 0; RetryCount < IDE_MAX_BUSY_RETRIES; RetryCount++) { Status = IDEReadStatus(Address); - if (!(Status & IDE_SR_BUSY)) + if (!(Status & IDE_SR_BUSY) && !(Status & IDE_SR_DRQ)) +// if (!(Status & IDE_SR_BUSY)) { break; } KeStallExecutionProcessor(10); } - if (RetryCount == IDE_MAX_BUSY_RETRIES) + if (RetryCount == IDE_MAX_BUSY_RETRIES) { return IDE_ER_ABRT; } @@ -1185,39 +1132,40 @@ IDEPolledRead(IN WORD Address, /* Write Drive/Head to select drive */ IDEWriteDriveHead(Address, IDE_DH_FIXED | DrvHead); - /* Wait for STATUS.BUSY to clear and STATUS.DRDY to assert */ - for (RetryCount = 0; RetryCount < IDE_MAX_BUSY_RETRIES; RetryCount++) + /* Wait for STATUS.BUSY and STATUS.DRQ to clear */ + for (RetryCount = 0; RetryCount < IDE_MAX_BUSY_RETRIES; RetryCount++) { Status = IDEReadStatus(Address); - if (!(Status & IDE_SR_BUSY) && (Status & IDE_SR_DRDY)) + if (!(Status & IDE_SR_BUSY) && !(Status & IDE_SR_DRQ)) { break; } KeStallExecutionProcessor(10); } - if (RetryCount == IDE_MAX_BUSY_RETRIES) + if (RetryCount == IDE_MAX_BUSY_RETRIES) { + CHECKPOINT1; return IDE_ER_ABRT; } /* Issue command to drive */ - if (DrvHead & IDE_DH_LBA) + if (DrvHead & IDE_DH_LBA) { DPRINT("READ:DRV=%d:LBA=1:BLK=%08d:SC=%02x:CM=%02x\n", - DrvHead & IDE_DH_DRV1 ? 1 : 0, + DrvHead & IDE_DH_DRV1 ? 1 : 0, ((DrvHead & 0x0f) << 24) + (CylinderHigh << 16) + (CylinderLow << 8) + SectorNum, - SectorCnt, + SectorCnt, Command); - } - else + } + else { DPRINT("READ:DRV=%d:LBA=0:CH=%02x:CL=%02x:HD=%01x:SN=%02x:SC=%02x:CM=%02x\n", - DrvHead & IDE_DH_DRV1 ? 1 : 0, - CylinderHigh, - CylinderLow, - DrvHead & 0x0f, - SectorNum, - SectorCnt, + DrvHead & IDE_DH_DRV1 ? 1 : 0, + CylinderHigh, + CylinderLow, + DrvHead & 0x0f, + SectorNum, + SectorCnt, Command); } @@ -1233,24 +1181,22 @@ IDEPolledRead(IN WORD Address, IDEWriteCommand(Address, Command); KeStallExecutionProcessor(50); - while (1) + while (1) { - - // wait for DRQ or error + /* wait for DRQ or error */ for (RetryCount = 0; RetryCount < IDE_MAX_POLL_RETRIES; RetryCount++) { Status = IDEReadStatus(Address); - if (!(Status & IDE_SR_BUSY)) + if (!(Status & IDE_SR_BUSY)) { - if (Status & IDE_SR_ERR) - { - BYTE Err = IDEReadError(Address); - return Err; - } - else if (Status & IDE_SR_DRQ) + if (Status & IDE_SR_DRQ) { break; } + else + { + return IDE_ER_ABRT; + } } KeStallExecutionProcessor(10); } @@ -1259,17 +1205,25 @@ IDEPolledRead(IN WORD Address, return IDE_ER_ABRT; } - // Read data into buffer + /* Read data into buffer */ IDEReadBlock(Address, Buffer, IDE_SECTOR_BUF_SZ); Buffer += IDE_SECTOR_BUF_SZ; - // Check for more sectors to read - for (RetryCount = 0; RetryCount < IDE_MAX_BUSY_RETRIES && - (IDEReadStatus(Address) & IDE_SR_DRQ); RetryCount++) - ; - if (!(IDEReadStatus(Address) & IDE_SR_BUSY)) + /* Check for more sectors to read */ + for (RetryCount = 0; RetryCount < IDE_MAX_BUSY_RETRIES; RetryCount++) { - return 0; + Status = IDEReadStatus(Address); + if (!(Status & IDE_SR_BUSY)) + { + if (Status & IDE_SR_DRQ) + { + break; + } + else + { + return 0; + } + } } } } diff --git a/reactos/include/ddk/haltypes.h b/reactos/include/ddk/haltypes.h index ea5811a2bb3..c34c8e4208d 100644 --- a/reactos/include/ddk/haltypes.h +++ b/reactos/include/ddk/haltypes.h @@ -1,4 +1,4 @@ -/* $Id: haltypes.h,v 1.2 2001/09/23 22:14:03 chorns Exp $ +/* $Id: haltypes.h,v 1.3 2001/11/01 00:25:28 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -68,6 +68,166 @@ typedef struct _DEVICE_DESCRIPTION } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION; +/* PCI bus definitions */ + +#define PCI_TYPE0_ADDRESSES 6 +#define PCI_TYPE1_ADDRESSES 2 +#define PCI_TYPE2_ADDRESSES 5 + +typedef struct _PCI_COMMON_CONFIG +{ + USHORT VendorID; /* read-only */ + USHORT DeviceID; /* read-only */ + USHORT Command; + USHORT Status; + UCHAR RevisionID; /* read-only */ + UCHAR ProgIf; /* read-only */ + UCHAR SubClass; /* read-only */ + UCHAR BaseClass; /* read-only */ + UCHAR CacheLineSize; /* read-only */ + UCHAR LatencyTimer; /* read-only */ + UCHAR HeaderType; /* read-only */ + UCHAR BIST; + union + { + struct _PCI_HEADER_TYPE_0 + { + ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; + ULONG CIS; + USHORT SubVendorID; + USHORT SubSystemID; + ULONG ROMBaseAddress; + ULONG Reserved2[2]; + + UCHAR InterruptLine; + UCHAR InterruptPin; /* read-only */ + UCHAR MinimumGrant; /* read-only */ + UCHAR MaximumLatency; /* read-only */ + } type0; + + /* PCI to PCI Bridge */ + struct _PCI_HEADER_TYPE_1 + { + ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; + UCHAR PrimaryBus; + UCHAR SecondaryBus; + UCHAR SubordinateBus; + UCHAR SecondaryLatency; + UCHAR IOBase; + UCHAR IOLimit; + USHORT SecondaryStatus; + USHORT MemoryBase; + USHORT MemoryLimit; + USHORT PrefetchBase; + USHORT PrefetchLimit; + ULONG PrefetchBaseUpper32; + ULONG PrefetchLimitUpper32; + USHORT IOBaseUpper16; + USHORT IOLimitUpper16; + UCHAR CapabilitiesPtr; + UCHAR Reserved1[3]; + ULONG ROMBaseAddress; + UCHAR InterruptLine; + UCHAR InterruptPin; + USHORT BridgeControl; + } type1; + + /* PCI to CARDBUS Bridge */ + struct _PCI_HEADER_TYPE_2 + { + ULONG SocketRegistersBaseAddress; + UCHAR CapabilitiesPtr; + UCHAR Reserved; + USHORT SecondaryStatus; + UCHAR PrimaryBus; + UCHAR SecondaryBus; + UCHAR SubordinateBus; + UCHAR SecondaryLatency; + struct + { + ULONG Base; + ULONG Limit; + } Range[PCI_TYPE2_ADDRESSES-1]; + UCHAR InterruptLine; + UCHAR InterruptPin; + USHORT BridgeControl; + } type2; + } u; + UCHAR DeviceSpecific[192]; +} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; + +#define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET (PCI_COMMON_CONFIG, DeviceSpecific)) + +#define PCI_MAX_DEVICES 32 +#define PCI_MAX_FUNCTION 8 + +#define PCI_INVALID_VENDORID 0xFFFF + + +/* Bit encodings for PCI_COMMON_CONFIG.HeaderType */ + +#define PCI_MULTIFUNCTION 0x80 +#define PCI_DEVICE_TYPE 0x00 +#define PCI_BRIDGE_TYPE 0x01 + + +/* Bit encodings for PCI_COMMON_CONFIG.Command */ + +#define PCI_ENABLE_IO_SPACE 0x0001 +#define PCI_ENABLE_MEMORY_SPACE 0x0002 +#define PCI_ENABLE_BUS_MASTER 0x0004 +#define PCI_ENABLE_SPECIAL_CYCLES 0x0008 +#define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010 +#define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020 +#define PCI_ENABLE_PARITY 0x0040 +#define PCI_ENABLE_WAIT_CYCLE 0x0080 +#define PCI_ENABLE_SERR 0x0100 +#define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200 + + +/* Bit encodings for PCI_COMMON_CONFIG.Status */ + +#define PCI_STATUS_FAST_BACK_TO_BACK 0x0080 +#define PCI_STATUS_DATA_PARITY_DETECTED 0x0100 +#define PCI_STATUS_DEVSEL 0x0600 /* 2 bits wide */ +#define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800 +#define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000 +#define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000 +#define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000 +#define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000 + + +/* Bit encodes for PCI_COMMON_CONFIG.u.type0.BaseAddresses */ + +#define PCI_ADDRESS_IO_SPACE 0x00000001 +#define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006 +#define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008 + +#define PCI_TYPE_32BIT 0 +#define PCI_TYPE_20BIT 2 +#define PCI_TYPE_64BIT 4 + + +/* Bit encodes for PCI_COMMON_CONFIG.u.type0.ROMBaseAddresses */ + +#define PCI_ROMADDRESS_ENABLED 0x00000001 + + +typedef struct _PCI_SLOT_NUMBER +{ + union + { + struct + { + ULONG DeviceNumber:5; + ULONG FunctionNumber:3; + ULONG Reserved:24; + } bits; + ULONG AsULONG; + } u; +} PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER; + + /* Hal dispatch table */ typedef enum _HAL_QUERY_INFORMATION_CLASS diff --git a/reactos/include/ddk/iodef.h b/reactos/include/ddk/iodef.h index d5308dad6ed..b7dc36a9cab 100644 --- a/reactos/include/ddk/iodef.h +++ b/reactos/include/ddk/iodef.h @@ -119,50 +119,50 @@ enum /* * Possible device types */ -#define FILE_DEVICE_BEEP 0x00000001 -#define FILE_DEVICE_CD_ROM 0x00000002 +#define FILE_DEVICE_BEEP 0x00000001 +#define FILE_DEVICE_CD_ROM 0x00000002 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 -#define FILE_DEVICE_CONTROLLER 0x00000004 -#define FILE_DEVICE_DATALINK 0x00000005 -#define FILE_DEVICE_DFS 0x00000006 -#define FILE_DEVICE_DISK 0x00000007 -#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 -#define FILE_DEVICE_FILE_SYSTEM 0x00000009 -#define FILE_DEVICE_INPORT_PORT 0x0000000a -#define FILE_DEVICE_KEYBOARD 0x0000000b -#define FILE_DEVICE_MAILSLOT 0x0000000c -#define FILE_DEVICE_MIDI_IN 0x0000000d -#define FILE_DEVICE_MIDI_OUT 0x0000000e -#define FILE_DEVICE_MOUSE 0x0000000f +#define FILE_DEVICE_CONTROLLER 0x00000004 +#define FILE_DEVICE_DATALINK 0x00000005 +#define FILE_DEVICE_DFS 0x00000006 +#define FILE_DEVICE_DISK 0x00000007 +#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 +#define FILE_DEVICE_FILE_SYSTEM 0x00000009 +#define FILE_DEVICE_INPORT_PORT 0x0000000a +#define FILE_DEVICE_KEYBOARD 0x0000000b +#define FILE_DEVICE_MAILSLOT 0x0000000c +#define FILE_DEVICE_MIDI_IN 0x0000000d +#define FILE_DEVICE_MIDI_OUT 0x0000000e +#define FILE_DEVICE_MOUSE 0x0000000f #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010 -#define FILE_DEVICE_NAMED_PIPE 0x00000011 -#define FILE_DEVICE_NETWORK 0x00000012 -#define FILE_DEVICE_NETWORK_BROWSER 0x00000013 +#define FILE_DEVICE_NAMED_PIPE 0x00000011 +#define FILE_DEVICE_NETWORK 0x00000012 +#define FILE_DEVICE_NETWORK_BROWSER 0x00000013 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014 -#define FILE_DEVICE_NULL 0x00000015 -#define FILE_DEVICE_PARALLEL_PORT 0x00000016 -#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017 -#define FILE_DEVICE_PRINTER 0x00000018 -#define FILE_DEVICE_SCANNER 0x00000019 +#define FILE_DEVICE_NULL 0x00000015 +#define FILE_DEVICE_PARALLEL_PORT 0x00000016 +#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017 +#define FILE_DEVICE_PRINTER 0x00000018 +#define FILE_DEVICE_SCANNER 0x00000019 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a -#define FILE_DEVICE_SERIAL_PORT 0x0000001b -#define FILE_DEVICE_SCREEN 0x0000001c -#define FILE_DEVICE_SOUND 0x0000001d -#define FILE_DEVICE_STREAMS 0x0000001e -#define FILE_DEVICE_TAPE 0x0000001f -#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020 -#define FILE_DEVICE_TRANSPORT 0x00000021 -#define FILE_DEVICE_UNKNOWN 0x00000022 -#define FILE_DEVICE_VIDEO 0x00000023 -#define FILE_DEVICE_VIRTUAL_DISK 0x00000024 -#define FILE_DEVICE_WAVE_IN 0x00000025 -#define FILE_DEVICE_WAVE_OUT 0x00000026 -#define FILE_DEVICE_8042_PORT 0x00000027 +#define FILE_DEVICE_SERIAL_PORT 0x0000001b +#define FILE_DEVICE_SCREEN 0x0000001c +#define FILE_DEVICE_SOUND 0x0000001d +#define FILE_DEVICE_STREAMS 0x0000001e +#define FILE_DEVICE_TAPE 0x0000001f +#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020 +#define FILE_DEVICE_TRANSPORT 0x00000021 +#define FILE_DEVICE_UNKNOWN 0x00000022 +#define FILE_DEVICE_VIDEO 0x00000023 +#define FILE_DEVICE_VIRTUAL_DISK 0x00000024 +#define FILE_DEVICE_WAVE_IN 0x00000025 +#define FILE_DEVICE_WAVE_OUT 0x00000026 +#define FILE_DEVICE_8042_PORT 0x00000027 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028 -#define FILE_DEVICE_BATTERY 0x00000029 -#define FILE_DEVICE_BUS_EXTENDER 0x0000002a -#define FILE_DEVICE_MODEM 0x0000002b -#define FILE_DEVICE_VDM 0x0000002c +#define FILE_DEVICE_BATTERY 0x00000029 +#define FILE_DEVICE_BUS_EXTENDER 0x0000002a +#define FILE_DEVICE_MODEM 0x0000002b +#define FILE_DEVICE_VDM 0x0000002c #define FILE_DEVICE_MASS_STORAGE 0x0000002d #define FILE_DEVICE_SMB 0x0000002e #define FILE_DEVICE_KS 0x0000002f @@ -246,6 +246,8 @@ enum IRP_MJ_MAXIMUM_FUNCTION, }; +#define IRP_MJ_SCSI IRP_MJ_INTERNAL_DEVICE_CONTROL + /* * Minor function numbers for IRP_MJ_FILE_SYSTEM_CONTROL */ @@ -254,6 +256,11 @@ enum #define IRP_MN_VERIFY_VOLUME 0x02 #define IRP_MN_LOAD_FILE_SYSTEM 0x03 +/* + * Minor function numbers for IRP_MJ_SCSI + */ +#define IRP_MN_SCSI_CLASS 0x01 + /* * Minor function codes for IRP_MJ_POWER */