Modules/USB - Slight correctness fixes, and fixed a race condition
[tpg/acess2.git] / KernelLand / Modules / USB / Core / usb.c
1 /*
2  * Acess2 USB Stack
3  * - By John Hodge (thePowersGang)
4  *
5  * usb.c
6  * - USB Structure
7  */
8 #define DEBUG   1
9 #include <acess.h>
10 #include <vfs.h>
11 #include <drv_pci.h>
12 #include "usb.h"
13
14 // === IMPORTS ===
15 extern tUSBHost *gUSB_Hosts;
16 extern tUSBDriver gUSBHub_Driver;
17
18 // === STRUCTURES ===
19
20 // === PROTOTYPES ===
21 tUSBHub *USB_RegisterHost(tUSBHostDef *HostDef, void *ControllerPtr, int nPorts);
22
23 // === GLOBALS ===
24 tUSBDriver      *gpUSB_InterfaceDrivers = &gUSBHub_Driver;
25
26 // === CODE ===
27 tUSBHub *USB_RegisterHost(tUSBHostDef *HostDef, void *ControllerPtr, int nPorts)
28 {
29         tUSBHost        *host;
30         
31         host = malloc(sizeof(tUSBHost) + nPorts*sizeof(void*));
32         if(!host) {
33                 // Oh, bugger.
34                 return NULL;
35         }
36         host->HostDef = HostDef;
37         host->Ptr = ControllerPtr;
38         memset(host->AddressBitmap, 0, sizeof(host->AddressBitmap));
39
40         host->RootHubDev.ParentHub = NULL;
41         host->RootHubDev.Host = host;
42         host->RootHubDev.Address = 0;
43
44 //      host->RootHubIf.Next = NULL;
45         host->RootHubIf.Dev = &host->RootHubDev;
46         host->RootHubIf.Driver = NULL;
47         host->RootHubIf.Data = NULL;
48         host->RootHubIf.nEndpoints = 0;
49
50         host->RootHub.Interface = &host->RootHubIf;
51         host->RootHub.nPorts = nPorts;
52         memset(host->RootHub.Devices, 0, sizeof(void*)*nPorts);
53
54         // TODO: Lock
55         host->Next = gUSB_Hosts;
56         gUSB_Hosts = host;
57
58         return &host->RootHub;
59 }
60
61 // --- Drivers ---
62 void USB_RegisterDriver(tUSBDriver *Driver)
63 {
64         Driver->Next = gpUSB_InterfaceDrivers;
65         gpUSB_InterfaceDrivers = Driver;
66 }
67
68 tUSBDriver *USB_int_FindDriverByClass(Uint32 ClassCode)
69 {
70         ENTER("xClassCode", ClassCode);
71         for( tUSBDriver *ret = gpUSB_InterfaceDrivers; ret; ret = ret->Next )
72         {
73                 LOG(" 0x%x & 0x%x == 0x%x?", ClassCode, ret->Match.Class.ClassMask, ret->Match.Class.ClassCode);
74                 if( (ClassCode & ret->Match.Class.ClassMask) == ret->Match.Class.ClassCode )
75                 {
76                         LOG("Found '%s'", ret->Name);
77                         LEAVE('p', ret);
78                         return ret;
79                 }
80         }
81         LEAVE('n');
82         return NULL;
83 }
84
85 // --- Hub Registration ---
86 // NOTE: Doesn't do much nowdays
87 tUSBHub *USB_RegisterHub(tUSBInterface *Device, int PortCount)
88 {
89         tUSBHub *ret;
90         
91         ret = malloc(sizeof(tUSBHub) + sizeof(ret->Devices[0])*PortCount);
92         ret->Interface = Device;
93         ret->nPorts = PortCount;
94         memset(ret->Devices, 0, sizeof(ret->Devices[0])*PortCount);
95         return ret;
96 }
97
98 void USB_RemoveHub(tUSBHub *Hub)
99 {
100         for( int i = 0; i < Hub->nPorts; i ++ )
101         {
102                 if( Hub->Devices[i] )
103                 {
104                         USB_DeviceDisconnected( Hub, i );
105                 }
106         }
107         free(Hub);
108 }
109

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