Modules/USB - Added prototype mass storage driver
[tpg/acess2.git] / KernelLand / Modules / USB / MSC / scsi.c
1 /*
2  * Acess2 USB Stack Mass Storage Driver
3  * - By John Hodge (thePowersGang)
4  *
5  * scsi.c
6  * - "SCSI Transparent Command Set" handling code
7  */
8 #define DEBUG   0
9 #include "common.h"
10 #include "scsi.h"
11
12 // === PROTOTYPES ===
13 Uint64  MSC_SCSI_GetSize(tUSBInterface *Dev, size_t *BlockSize);
14 int     MSC_SCSI_ReadData(void *Ptr, Uint64 Block, size_t Count, void *Dest);
15 int     MSC_SCSI_WriteData(void *Ptr, Uint64 Block, size_t Count, const void *Dest);
16
17 // === GLOBALS ===
18 tLVM_VolType    gMSC_SCSI_VolType = {
19         .Name = "USB-MSC-SCSI",
20         .Read = MSC_SCSI_ReadData,
21         .Write = MSC_SCSI_WriteData
22         };
23
24 // === CODE ===
25 Uint64 MSC_SCSI_GetSize(tUSBInterface *Dev, size_t *BlockSize)
26 {
27         struct sSCSI_Cmd_ReadCapacity16 cmd;
28         struct sSCSI_Ret_ReadCapacity16 ret;
29         
30         cmd.Op   = 0x9E;
31         cmd.Svc  = 0x10;
32         cmd.LBA  = BigEndian64( 0 );
33         cmd.AllocationLength = BigEndian32(sizeof(ret));
34         cmd.Flags   = 0;
35         cmd.Control = 0;
36
37         ret.BlockSize = 0;
38         ret.BlockCount = 0;     
39         MSC_RecvData(Dev, sizeof(cmd), &cmd, sizeof(ret), &ret);
40         
41         *BlockSize = BigEndian32(ret.BlockSize);
42         return BigEndian64(ret.BlockCount);
43 }
44
45 int MSC_SCSI_ReadData(void *Ptr, Uint64 Block, size_t Count, void *Dest)
46 {
47         tUSBInterface   *Dev = Ptr;
48         tMSCInfo        *info = USB_GetDeviceDataPtr(Dev);
49         struct sSCSI_Cmd_Read16 cmd;
50
51         // TODO: Bounds checking?
52         
53         cmd.Op     = 0x88;
54         cmd.Flags  = 0;
55         cmd.LBA    = BigEndian64(Block);
56         cmd.Length = BigEndian32(Count);
57         cmd.GroupNumber = 0;
58         cmd.Control = 0;
59         
60         MSC_RecvData(Dev, sizeof(cmd), &cmd, Count*info->BlockSize, Dest);
61         // TODO: Error check    
62
63         return Count;
64 }
65
66 int MSC_SCSI_WriteData(void *Ptr, Uint64 Block, size_t Count, const void *Data)
67 {
68         Log_Warning("MSC_SCSI", "TODO: Impliment MSC_SCSI_WriteData");
69         return 0;
70 }
71

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