X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Modules%2FStorage%2FATA%2Fmain.c;h=41228d886bc2bbcc351ca87ce23482b3439ad3c1;hb=5f2024e5977e0cca0993a20dad5ab794c94d5711;hp=05caaab04bdcc86bfe364b377140f09aa77b8529;hpb=b00c9161c75b0ef6a1de3b7b15444a783afe8a86;p=tpg%2Facess2.git diff --git a/Modules/Storage/ATA/main.c b/Modules/Storage/ATA/main.c index 05caaab0..41228d88 100644 --- a/Modules/Storage/ATA/main.c +++ b/Modules/Storage/ATA/main.c @@ -8,8 +8,8 @@ #include #include #include -#include -#include +#include +#include #include "common.h" // === MACROS === @@ -25,16 +25,27 @@ void ATA_int_MakePartition(tATA_Partition *Part, int Disk, int Num, Uint64 Start Uint16 ATA_GetBasePort(int Disk); // Filesystem Interface char *ATA_ReadDir(tVFS_Node *Node, int Pos); -tVFS_Node *ATA_FindDir(tVFS_Node *Node, char *Name); +tVFS_Node *ATA_FindDir(tVFS_Node *Node, const char *Name); Uint64 ATA_ReadFS(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer); -Uint64 ATA_WriteFS(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer); +Uint64 ATA_WriteFS(tVFS_Node *Node, Uint64 Offset, Uint64 Length, const void *Buffer); int ATA_IOCtl(tVFS_Node *Node, int Id, void *Data); // Read/Write Interface/Quantiser Uint ATA_ReadRaw(Uint64 Address, Uint Count, void *Buffer, Uint Disk); -Uint ATA_WriteRaw(Uint64 Address, Uint Count, void *Buffer, Uint Disk); +Uint ATA_WriteRaw(Uint64 Address, Uint Count, const void *Buffer, Uint Disk); // === GLOBALS === MODULE_DEFINE(0, VERSION, i386ATA, ATA_Install, NULL, "PCI", NULL); +tVFS_NodeType gATA_RootNodeType = { + .TypeName = "ATA Root Node", + .ReadDir = ATA_ReadDir, + .FindDir = ATA_FindDir + }; +tVFS_NodeType gATA_DiskNodeType = { + .TypeName = "ATA Volume", + .Read = ATA_ReadFS, + .Write = ATA_WriteFS, + .IOCtl = ATA_IOCtl + }; tDevFS_Driver gATA_DriverInfo = { NULL, "ata", { @@ -42,8 +53,7 @@ tDevFS_Driver gATA_DriverInfo = { .Size = -1, .Flags = VFS_FFLAG_DIRECTORY, .ACLs = &gVFS_ACL_EveryoneRX, - .ReadDir = ATA_ReadDir, - .FindDir = ATA_FindDir + .Type = &gATA_RootNodeType } }; tATA_Disk gATA_Disks[MAX_ATA_DISKS]; @@ -139,6 +149,11 @@ int ATA_ScanDisk(int Disk) LOG("gATA_Disks[ %i ].Sectors = 0x%x", Disk, gATA_Disks[ Disk ].Sectors); + // Create Name + gATA_Disks[ Disk ].Name[0] = 'A'+Disk; + gATA_Disks[ Disk ].Name[1] = '\0'; + + #if 1 { Uint64 val = gATA_Disks[ Disk ].Sectors / 2; char *units = "KiB"; @@ -154,13 +169,10 @@ int ATA_ScanDisk(int Disk) val /= 1024; units = "TiB"; } - Log_Log("ATA", "Disk %i: 0x%llx Sectors (%lli %s)", Disk, - gATA_Disks[ Disk ].Sectors, val, units); + Log_Notice("ATA", "Disk %s: 0x%llx Sectors (%lli %s)", + gATA_Disks[ Disk ].Name, gATA_Disks[ Disk ].Sectors, val, units); } - - // Create Name - gATA_Disks[ Disk ].Name[0] = 'A'+Disk; - gATA_Disks[ Disk ].Name[1] = '\0'; + #endif // Get pointer to vfs node and populate it node = &gATA_Disks[ Disk ].Node; @@ -169,17 +181,18 @@ int ATA_ScanDisk(int Disk) node->Inode = (Disk << 8) | 0xFF; node->ImplPtr = gATA_Disks[ Disk ].Name; - node->ATime = node->MTime - = node->CTime = now(); + node->ATime = node->MTime = node->CTime = now(); - node->Read = ATA_ReadFS; - node->Write = ATA_WriteFS; - node->IOCtl = ATA_IOCtl; + node->Type = &gATA_DiskNodeType; // --- Scan Partitions --- LOG("Reading MBR"); // Read Boot Sector - ATA_ReadDMA( Disk, 0, 1, &mbr ); + if( ATA_ReadDMA( Disk, 0, 1, &mbr ) != 0 ) { + Log_Warning("ATA", "Error in reading MBR on %i", Disk); + LEAVE('i', 0); + return 0; + } // Check for a GPT table if(mbr.Parts[0].SystemID == 0xEE) @@ -192,7 +205,7 @@ int ATA_ScanDisk(int Disk) Debug_HexDump("ATA_ScanDisk", &mbr, 512); #endif - LEAVE('i', 0); + LEAVE('i', 1); return 1; } @@ -218,10 +231,8 @@ void ATA_int_MakePartition(tATA_Partition *Part, int Disk, int Num, Uint64 Start Part->Node.Inode = (Disk << 8) | Num; Part->Node.ImplPtr = Part->Name; - Part->Node.Read = ATA_ReadFS; - Part->Node.Write = ATA_WriteFS; - Part->Node.IOCtl = ATA_IOCtl; - Log_Notice("ATA", "Note '%s' at 0x%llx, 0x%llx long", Part->Name, Part->Start, Part->Length); + Part->Node.Type = &gATA_DiskNodeType; + Log_Notice("ATA", "Partition %s at 0x%llx+0x%llx", Part->Name, Part->Start, Part->Length); LOG("Made '%s' (&Node=%p)", Part->Name, &Part->Node); LEAVE('-'); } @@ -246,9 +257,9 @@ char *ATA_ReadDir(tVFS_Node *UNUSED(Node), int Pos) } /** - * \fn tVFS_Node *ATA_FindDir(tVFS_Node *Node, char *Name) + * \fn tVFS_Node *ATA_FindDir(tVFS_Node *Node, const char *Name) */ -tVFS_Node *ATA_FindDir(tVFS_Node *UNUSED(Node), char *Name) +tVFS_Node *ATA_FindDir(tVFS_Node *UNUSED(Node), const char *Name) { int part; tATA_Disk *disk; @@ -324,9 +335,9 @@ Uint64 ATA_ReadFS(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) } /** - * \fn Uint64 ATA_WriteFS(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) + * \fn Uint64 ATA_WriteFS(tVFS_Node *Node, Uint64 Offset, Uint64 Length, const void *Buffer) */ -Uint64 ATA_WriteFS(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) +Uint64 ATA_WriteFS(tVFS_Node *Node, Uint64 Offset, Uint64 Length, const void *Buffer) { int disk = Node->Inode >> 8; int part = Node->Inode & 0xFF; @@ -411,9 +422,9 @@ Uint ATA_ReadRaw(Uint64 Address, Uint Count, void *Buffer, Uint Disk) } /** - * \fn Uint ATA_WriteRaw(Uint64 Address, Uint Count, void *Buffer, Uint Disk) + * \fn Uint ATA_WriteRaw(Uint64 Address, Uint Count, const void *Buffer, Uint Disk) */ -Uint ATA_WriteRaw(Uint64 Address, Uint Count, void *Buffer, Uint Disk) +Uint ATA_WriteRaw(Uint64 Address, Uint Count, const void *Buffer, Uint Disk) { int ret; Uint offset;