X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Modules%2FStorage%2FATA%2Fmain.c;h=f4130b04f346a8eec22d463fe4952ccb7a2a43b5;hb=4d1e33453da27fe61a5ce42c204e152b406b66f9;hp=de22df9e858f03b604d974aef32ac5dc941e60b0;hpb=3a0a1b2032b0d9dafe950c9d91ac1c046aab8229;p=tpg%2Facess2.git diff --git a/Modules/Storage/ATA/main.c b/Modules/Storage/ATA/main.c index de22df9e..f4130b04 100644 --- a/Modules/Storage/ATA/main.c +++ b/Modules/Storage/ATA/main.c @@ -12,9 +12,6 @@ #include #include "common.h" -// --- Flags --- -#define START_BEFORE_CMD 0 - // === STRUCTURES === typedef struct { @@ -96,7 +93,7 @@ Uint8 *gATA_BusMasterBasePtr = 0; int gATA_IRQPri = 14; int gATA_IRQSec = 15; int giaATA_ControllerLock[2] = {0}; //!< Spinlocks for each controller -Uint8 gATA_Buffers[2][4096] __attribute__ ((section(".padata"))); +Uint8 gATA_Buffers[2][(MAX_DMA_SECTORS+0xFFF)&~0xFFF] __attribute__ ((section(".padata"))); volatile int gaATA_IRQs[2] = {0}; tPRDT_Ent gATA_PRDTs[2] = { {0, 512, IDE_PRDT_LAST}, @@ -288,15 +285,24 @@ int ATA_ScanDisk(int Disk) LOG("gATA_Disks[ Disk ].Sectors = 0x%x", gATA_Disks[ Disk ].Sectors); - if( gATA_Disks[ Disk ].Sectors / (2048*1024) ) - Log("Disk %i: 0x%llx Sectors (%i GiB)", Disk, - gATA_Disks[ Disk ].Sectors, gATA_Disks[ Disk ].Sectors / (2048*1024)); - else if( gATA_Disks[ Disk ].Sectors / 2048 ) - Log("Disk %i: 0x%llx Sectors (%i MiB)", Disk, - gATA_Disks[ Disk ].Sectors, gATA_Disks[ Disk ].Sectors / 2048); - else - Log("Disk %i: 0x%llx Sectors (%i KiB)", Disk, - gATA_Disks[ Disk ].Sectors, gATA_Disks[ Disk ].Sectors / 2); + { + Uint64 val = gATA_Disks[ Disk ].Sectors / 2; + char *units = "KiB"; + if( val > 4*1024 ) { + val /= 1024; + units = "MiB"; + } + else if( val > 4*1024 ) { + val /= 1024; + units = "GiB"; + } + else if( val > 4*1024 ) { + val /= 1024; + units = "TiB"; + } + Log_Log("ATA", "Disk %i: 0x%llx Sectors (%i %s)", Disk, + gATA_Disks[ Disk ].Sectors, val, units); + } // Create Name gATA_Disks[ Disk ].Name[0] = 'A'+Disk; @@ -403,14 +409,17 @@ char *ATA_ReadDir(tVFS_Node *Node, int Pos) tVFS_Node *ATA_FindDir(tVFS_Node *Node, char *Name) { int part; + tATA_Disk *disk; + // Check first character if(Name[0] < 'A' || Name[0] > 'A'+MAX_ATA_DISKS) return NULL; + disk = &gATA_Disks[Name[0]-'A']; // Raw Disk if(Name[1] == '\0') { - if( gATA_Disks[Name[0]-'A'].Sectors == 0 ) + if( disk->Sectors == 0 && disk->Name[0] == '\0') return NULL; - return &gATA_Disks[Name[0]-'A'].Node; + return &disk->Node; } // Partitions @@ -418,7 +427,7 @@ tVFS_Node *ATA_FindDir(tVFS_Node *Node, char *Name) if(Name[2] == '\0') { // <= 9 part = Name[1] - '0'; part --; - return &gATA_Disks[Name[0]-'A'].Partitions[part].Node; + return &disk->Partitions[part].Node; } // > 9 if('0' > Name[2] || '9' < Name[2]) return NULL; @@ -427,7 +436,7 @@ tVFS_Node *ATA_FindDir(tVFS_Node *Node, char *Name) part = (Name[1] - '0') * 10; part += Name[2] - '0'; part --; - return &gATA_Disks[Name[0]-'A'].Partitions[part].Node; + return &disk->Partitions[part].Node; } @@ -657,6 +666,9 @@ int ATA_ReadDMA(Uint8 Disk, Uint64 Address, Uint Count, void *Buffer) // Complete Transfer ATA_int_BusMasterWriteByte( cont << 3, 8 ); // Read and stop + val = inb(base+0x7); + LOG("Status byte = 0x%02x", val); + LOG("Transfer Completed & Acknowledged"); // Copy to destination buffer