Kernel - Slight reworks to timer code
[tpg/acess2.git] / Modules / Storage / FDDv2 / main.c
index bbe79f9..bec157c 100644 (file)
@@ -32,6 +32,17 @@ Uint64       FDD_ReadFS(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer);
 MODULE_DEFINE(0, FDD_VERSION, Storage_FDDv2, FDD_Install, NULL, "x86_ISADMA", NULL);
 tDrive gaFDD_Disks[MAX_DISKS];
 tVFS_Node      gaFDD_DiskNodes[MAX_DISKS];
+tVFS_NodeType  gFDD_RootNodeType = {
+       .TypeName = "FDD Root Node",
+       .ReadDir = FDD_ReadDir,
+       .FindDir = FDD_FindDir,
+       .IOCtl = FDD_IOCtl
+       };
+tVFS_NodeType  gFDD_DevNodeType = {
+       .TypeName = "FDD Device",
+       .Read = FDD_ReadFS,
+       .Write = NULL   // FDD_WriteFS?
+       };
 tDevFS_Driver  gFDD_DriverInfo = {
        NULL, "fdd",
        {
@@ -39,9 +50,7 @@ tDevFS_Driver gFDD_DriverInfo = {
        .NumACLs = 1,
        .ACLs = &gVFS_ACL_EveryoneRX,
        .Flags = VFS_FFLAG_DIRECTORY,
-       .ReadDir = FDD_ReadDir,
-       .FindDir = FDD_FindDir,
-       .IOCtl = FDD_IOCtl
+       .Type = &gFDD_RootNodeType
        }
        };
 
@@ -88,8 +97,7 @@ int FDD_RegisterFS(void)
                gaFDD_DiskNodes[i].Inode = i;
                gaFDD_DiskNodes[i].Flags = 0;
                gaFDD_DiskNodes[i].NumACLs = 0;
-               gaFDD_DiskNodes[i].Read = FDD_ReadFS;
-               gaFDD_DiskNodes[i].Write = NULL;//FDD_WriteFS;
+               gaFDD_DiskNodes[i].Type = &gFDD_DevNodeType;
                gaFDD_DiskNodes[i].Size = 1440*1024;    // TODO: Non 1.44 disks
        }
        
@@ -184,7 +192,7 @@ Uint64 FDD_ReadFS(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
        if( Offset )
        {
                 int    len;
-               if(rem_len > BYTES_PER_TRACK-Offset)
+               if(rem_len > BYTES_PER_TRACK - Offset)
                        len = BYTES_PER_TRACK - Offset;
                else
                        len = rem_len;
@@ -194,15 +202,18 @@ Uint64 FDD_ReadFS(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
                track ++;
        }
 
-       while( rem_len > BYTES_PER_TRACK )
+       if( rem_len > 0)
        {
-               FDD_int_ReadWriteWithinTrack(disk, track, 0, 0, BYTES_PER_TRACK, dest);
-               dest += BYTES_PER_TRACK;
-               rem_len -= BYTES_PER_TRACK;
-               track ++;
-       }
+               while( rem_len > BYTES_PER_TRACK )
+               {
+                       FDD_int_ReadWriteWithinTrack(disk, track, 0, 0, BYTES_PER_TRACK, dest);
+                       dest += BYTES_PER_TRACK;
+                               rem_len -= BYTES_PER_TRACK;
+                       track ++;
+               }
 
-       FDD_int_ReadWriteWithinTrack(disk, track, 0, 0, rem_len, dest);
+               FDD_int_ReadWriteWithinTrack(disk, track, 0, 0, rem_len, dest);
+       }
        
        LEAVE('X', Length);
        return Length;
@@ -218,6 +229,9 @@ int FDD_int_ReadWriteWithinTrack(int Disk, int Track, int bWrite, size_t Offset,
        if( Offset + Length > BYTES_PER_TRACK )
                return 1;
 
+       if( Length == 0 )
+               return 0;
+       
        ENTER("iDisk iTrack bbWrite xOffset xLength pBuffer",
                Disk, Track, bWrite, Offset, Length, Buffer);
        

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