Fiddling with multiboot modules (and some bug searching in ATA code)
[tpg/acess2.git] / Modules / Storage / ATA / main.c
index de22df9..f4130b0 100644 (file)
@@ -12,9 +12,6 @@
 #include <tpl_drv_disk.h>
 #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

UCC git Repository :: git.ucc.asn.au