ReactOS 0.4.16-dev-2615-g89221f5
xboxdisk.c File Reference
#include <freeldr.h>
#include <hwide.h>
#include <debug.h>
Include dependency graph for xboxdisk.c:

Go to the source code of this file.

Functions

 DBG_DEFAULT_CHANNEL (DISK)
 
PCSTR DiskGetErrorCodeString (_In_ ULONG ErrorCode)
 
static VOID XboxDiskInit (VOID)
 
static PDEVICE_UNIT XboxDiskDriveNumberToDeviceUnit (UCHAR DriveNumber)
 
BOOLEAN DiskResetController (UCHAR DriveNumber)
 
CONFIGURATION_TYPE DiskGetConfigType (_In_ UCHAR DriveNumber)
 
VOID __cdecl DiskStopFloppyMotor (VOID)
 
BOOLEAN XboxDiskReadLogicalSectors (IN UCHAR DriveNumber, IN ULONGLONG SectorNumber, IN ULONG SectorCount, OUT PVOID Buffer)
 
BOOLEAN XboxDiskGetDriveGeometry (UCHAR DriveNumber, PGEOMETRY Geometry)
 
ULONG XboxDiskGetCacheableBlockCount (UCHAR DriveNumber)
 

Variables

static PDEVICE_UNIT HardDrive = NULL
 
static PDEVICE_UNIT CdDrive = NULL
 
static BOOLEAN AtaInitialized = FALSE
 

Function Documentation

◆ DBG_DEFAULT_CHANNEL()

DBG_DEFAULT_CHANNEL ( DISK  )

◆ DiskGetConfigType()

CONFIGURATION_TYPE DiskGetConfigType ( _In_ UCHAR  DriveNumber)

Definition at line 101 of file xboxdisk.c.

103{
104 PDEVICE_UNIT DeviceUnit;
105
106 DeviceUnit = XboxDiskDriveNumberToDeviceUnit(DriveNumber);
107 if (!DeviceUnit)
108 return -1; // MaximumType;
109
110 if (DeviceUnit == CdDrive) // (DeviceUnit->Flags & ATA_DEVICE_ATAPI)
111 return CdromController;
112 else // if (DeviceUnit == HardDrive)
113 return DiskPeripheral;
114}
@ DiskPeripheral
Definition: arc.h:138
@ CdromController
Definition: arc.h:128
Data structure for the ATA device.
Definition: hwide.h:12
static PDEVICE_UNIT XboxDiskDriveNumberToDeviceUnit(UCHAR DriveNumber)
Definition: xboxdisk.c:73
static PDEVICE_UNIT CdDrive
Definition: xboxdisk.c:20

◆ DiskGetErrorCodeString()

PCSTR DiskGetErrorCodeString ( _In_ ULONG  ErrorCode)

Definition at line 27 of file xboxdisk.c.

29{
30#if 0 // TODO: ATA/IDE error code descriptions.
31 switch (ErrorCode)
32 {
33 default: return "Unknown error code";
34 }
35#endif
36 return NULL;
37}
#define NULL
Definition: types.h:112
_In_ NDIS_ERROR_CODE ErrorCode
Definition: ndis.h:4436

◆ DiskResetController()

BOOLEAN DiskResetController ( UCHAR  DriveNumber)

Definition at line 93 of file xboxdisk.c.

94{
95 WARN("DiskResetController(0x%x) DISK OPERATION FAILED -- RESETTING CONTROLLER\n", DriveNumber);
96 /* No-op on XBOX */
97 return TRUE;
98}
#define WARN(fmt,...)
Definition: precomp.h:61
#define TRUE
Definition: types.h:120

◆ DiskStopFloppyMotor()

VOID __cdecl DiskStopFloppyMotor ( VOID  )

Definition at line 117 of file xboxdisk.c.

118{
119 /* No-op on XBOX */
120}

◆ XboxDiskDriveNumberToDeviceUnit()

static PDEVICE_UNIT XboxDiskDriveNumberToDeviceUnit ( UCHAR  DriveNumber)
inlinestatic

Definition at line 73 of file xboxdisk.c.

74{
75 /* Xbox has only 1 IDE controller and no floppy */
76 if (DriveNumber < 0x80 || (DriveNumber & 0x0F) >= 2)
77 return NULL;
78
79 if (!AtaInitialized)
81
82 /* HDD */
83 if ((DriveNumber == 0x80) && HardDrive)
84 return HardDrive;
85
86 /* CD */
87 if (((DriveNumber & 0xF0) > 0x80) && CdDrive)
88 return CdDrive;
89
90 return NULL;
91}
static PDEVICE_UNIT HardDrive
Definition: xboxdisk.c:19
static BOOLEAN AtaInitialized
Definition: xboxdisk.c:21
static VOID XboxDiskInit(VOID)
Definition: xboxdisk.c:43

Referenced by DiskGetConfigType(), XboxDiskGetCacheableBlockCount(), XboxDiskGetDriveGeometry(), and XboxDiskReadLogicalSectors().

◆ XboxDiskGetCacheableBlockCount()

ULONG XboxDiskGetCacheableBlockCount ( UCHAR  DriveNumber)

Definition at line 166 of file xboxdisk.c.

167{
168 PDEVICE_UNIT DeviceUnit;
169
170 DeviceUnit = XboxDiskDriveNumberToDeviceUnit(DriveNumber);
171 if (!DeviceUnit)
172 return 1; // Unknown count.
173
174 /*
175 * If LBA is supported then the block size will be 64 sectors (32k).
176 * If not then the block size is the size of one track.
177 */
178 if (DeviceUnit->Flags & ATA_DEVICE_LBA)
179 return 64;
180 else
181 return DeviceUnit->SectorsPerTrack;
182}
#define ATA_DEVICE_LBA
Definition: hwide.h:31
ULONG SectorsPerTrack
Definition: hwide.h:20
ULONG Flags
Definition: hwide.h:29

Referenced by MachInit().

◆ XboxDiskGetDriveGeometry()

BOOLEAN XboxDiskGetDriveGeometry ( UCHAR  DriveNumber,
PGEOMETRY  Geometry 
)

Definition at line 146 of file xboxdisk.c.

147{
148 PDEVICE_UNIT DeviceUnit;
149
150 TRACE("XboxDiskGetDriveGeometry(0x%x)\n", DriveNumber);
151
152 DeviceUnit = XboxDiskDriveNumberToDeviceUnit(DriveNumber);
153 if (!DeviceUnit)
154 return FALSE;
155
156 Geometry->Cylinders = DeviceUnit->Cylinders;
157 Geometry->Heads = DeviceUnit->Heads;
158 Geometry->SectorsPerTrack = DeviceUnit->SectorsPerTrack;
159 Geometry->BytesPerSector = DeviceUnit->SectorSize;
160 Geometry->Sectors = DeviceUnit->TotalSectors;
161
162 return TRUE;
163}
#define FALSE
Definition: types.h:117
#define TRACE(s)
Definition: solgame.cpp:4
ULONG Cylinders
Definition: hwide.h:14
ULONG SectorSize
Definition: hwide.h:23
ULONG64 TotalSectors
Definition: hwide.h:26
ULONG Heads
Definition: hwide.h:17
ULONG BytesPerSector
Number of bytes per sector.
Definition: disk.h:28
ULONG Cylinders
Number of cylinders on the disk.
Definition: disk.h:25
ULONGLONG Sectors
Total number of disk sectors/LBA blocks.
Definition: disk.h:29
ULONG SectorsPerTrack
Number of sectors per track.
Definition: disk.h:27
ULONG Heads
Number of heads on the disk.
Definition: disk.h:26

Referenced by MachInit(), and XboxGetHarddiskConfigurationData().

◆ XboxDiskInit()

static VOID XboxDiskInit ( VOID  )
static

Definition at line 43 of file xboxdisk.c.

44{
45 UCHAR DetectedCount, UnitNumber;
46
49
50 /* Find first HDD and CD */
51 AtaInit(&DetectedCount);
52 for (UnitNumber = 0; UnitNumber < DetectedCount; UnitNumber++)
53 {
54 PDEVICE_UNIT DeviceUnit = AtaGetDevice(UnitNumber);
55 if (!DeviceUnit)
56 continue;
57
58 if (DeviceUnit->Flags & ATA_DEVICE_ATAPI)
59 {
60 if (!CdDrive)
61 CdDrive = DeviceUnit;
62 }
63 else
64 {
65 if (!HardDrive)
66 HardDrive = DeviceUnit;
67 }
68 }
69}
PDEVICE_UNIT AtaGetDevice(_In_ UCHAR UnitNumber)
Definition: hwide.c:1270
BOOLEAN AtaInit(_Out_ PUCHAR DetectedCount)
Definition: hwide.c:1279
#define ATA_DEVICE_ATAPI
Definition: hwide.h:30
#define ASSERT(a)
Definition: mode.c:44
unsigned char UCHAR
Definition: typedefs.h:53

Referenced by XboxDiskDriveNumberToDeviceUnit().

◆ XboxDiskReadLogicalSectors()

BOOLEAN XboxDiskReadLogicalSectors ( IN UCHAR  DriveNumber,
IN ULONGLONG  SectorNumber,
IN ULONG  SectorCount,
OUT PVOID  Buffer 
)

Definition at line 123 of file xboxdisk.c.

128{
129 PDEVICE_UNIT DeviceUnit;
131
132 TRACE("XboxDiskReadLogicalSectors() DriveNumber: 0x%x SectorNumber: %I64u SectorCount: %u Buffer: 0x%x\n",
133 DriveNumber, SectorNumber, SectorCount, Buffer);
134
135 DeviceUnit = XboxDiskDriveNumberToDeviceUnit(DriveNumber);
136 if (!DeviceUnit)
137 return FALSE;
138
139 Success = AtaReadLogicalSectors(DeviceUnit, SectorNumber, SectorCount, Buffer);
140 if (!Success)
141 DiskError("Disk Read Failed", -1);
142 return Success;
143}
unsigned char BOOLEAN
Definition: actypes.h:127
VOID DiskError(_In_ PCSTR ErrorString, _In_ ULONG ErrorCode)
Definition: disk.c:48
Definition: bufpool.h:45
@ Success
Definition: eventcreate.c:712
BOOLEAN AtaReadLogicalSectors(_In_ PDEVICE_UNIT DeviceUnit, _In_ ULONG64 SectorNumber, _In_ ULONG SectorCount, _Out_writes_bytes_all_(SectorCount *DeviceUnit->SectorSize) PVOID Buffer)
Definition: hwide.c:1230
ULONG SectorCount
Definition: part_brfr.c:22

Referenced by MachInit().

Variable Documentation

◆ AtaInitialized

BOOLEAN AtaInitialized = FALSE
static

Definition at line 21 of file xboxdisk.c.

Referenced by XboxDiskDriveNumberToDeviceUnit(), and XboxDiskInit().

◆ CdDrive

PDEVICE_UNIT CdDrive = NULL
static

Definition at line 20 of file xboxdisk.c.

Referenced by DiskGetConfigType(), XboxDiskDriveNumberToDeviceUnit(), and XboxDiskInit().

◆ HardDrive

PDEVICE_UNIT HardDrive = NULL
static

Definition at line 19 of file xboxdisk.c.

Referenced by XboxDiskDriveNumberToDeviceUnit(), and XboxDiskInit().