Modules/USB - Less chatty device initialisation
[tpg/acess2.git] / KernelLand / Modules / USB / Core / usb_devinit.c
index 4b18b30..7b1b724 100644 (file)
@@ -5,8 +5,7 @@
  * usb_devinit.c
  * - USB Device Initialisation
  */
-#define DEBUG  0
-
+#define DEBUG  1
 #include <acess.h>
 #include <vfs.h>
 #include <drv_pci.h>
@@ -14,6 +13,8 @@
 #include "usb_proto.h"
 #include "usb_lowlevel.h"
 
+#define DUMP_DESCRIPTORS       0
+
 // === PROTOTYPES ===
 void   USB_DeviceConnected(tUSBHub *Hub, int Port);
 void   USB_DeviceDisconnected(tUSBHub *Hub, int Port);
@@ -55,7 +56,8 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port)
                LOG("Getting device descriptor");
                // Endpoint 0, Desc Type 1, Index 0
                USB_int_ReadDescriptor(dev, 0, 1, 0, sizeof(desc), &desc);
-               
+
+               #if DUMP_DESCRIPTORS            
                LOG("Device Descriptor = {");
                LOG(" .Length = %i", desc.Length);
                LOG(" .Type = %i", desc.Type);
@@ -72,25 +74,34 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port)
                LOG(" .SerialNumberStr = Str %i", desc.SerialNumberStr);
                LOG(" .NumConfigurations = %i", desc.SerialNumberStr);
                LOG("}");
-               
+       
+               #if DEBUG       
                if( desc.ManufacturerStr )
                {
                        char    *tmp = USB_int_GetDeviceString(dev, 0, desc.ManufacturerStr);
-                       LOG("ManufacturerStr = '%s'", tmp);
-                       free(tmp);
+                       if( tmp ) {
+                               LOG("ManufacturerStr = '%s'", tmp);
+                               free(tmp);
+                       }
                }
                if( desc.ProductStr )
                {
                        char    *tmp = USB_int_GetDeviceString(dev, 0, desc.ProductStr);
-                       LOG("ProductStr = '%s'", tmp);
-                       free(tmp);
+                       if( tmp ) {
+                               LOG("ProductStr = '%s'", tmp);
+                               free(tmp);
+                       }
                }
                if( desc.SerialNumberStr )
                {
                        char    *tmp = USB_int_GetDeviceString(dev, 0, desc.SerialNumberStr);
-                       LOG("SerialNumbertStr = '%s'", tmp);
-                       free(tmp);
+                       if( tmp ) {
+                               LOG("SerialNumbertStr = '%s'", tmp);
+                               free(tmp);
+                       }
                }
+               #endif
+               #endif
        }
 
        // TODO: Support alternate configurations
@@ -104,6 +115,7 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port)
                size_t  total_length;
        
                USB_int_ReadDescriptor(dev, 0, 2, i, sizeof(desc), &desc);
+               #if DUMP_DESCRIPTORS
                LOG("Configuration Descriptor %i = {", i);
                LOG(" .Length = %i", desc.Length);
                LOG(" .Type = %i", desc.Type);
@@ -119,6 +131,7 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port)
                        LOG("ConfigurationStr = '%s'", tmp);
                        free(tmp);
                }
+               #endif
 
                // TODO: Split here and allow some method of selection
 
@@ -142,6 +155,10 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port)
                        size_t  iface_base_ofs;
 
                        iface = (void*)(full_buf + ptr_ofs);
+                       if( iface->Length == 0 ) {
+                               Log_Warning("USB", "Bad USB descriptor (length = 0)");
+                               break ;
+                       }
                        ptr_ofs += iface->Length;
                        if( ptr_ofs > total_length ) {
                                // Sanity fail
@@ -155,18 +172,22 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port)
                                continue ;
                        }
 
+                       #if DUMP_DESCRIPTORS
                        LOG("Interface %i/%i = {", i, j);
                        LOG(" .InterfaceNum = %i", iface->InterfaceNum);
                        LOG(" .NumEndpoints = %i", iface->NumEndpoints);
                        LOG(" .InterfaceClass = 0x%x", iface->InterfaceClass);
                        LOG(" .InterfaceSubClass = 0x%x", iface->InterfaceSubClass);
                        LOG(" .InterfaceProcol = 0x%x", iface->InterfaceProtocol);
+                       # if DEBUG      
                        if( iface->InterfaceStr ) {
                                char    *tmp = USB_int_GetDeviceString(dev, 0, iface->InterfaceStr);
                                LOG(" .InterfaceStr = %i '%s'", iface->InterfaceStr, tmp);
                                free(tmp);
                        }
+                       # endif
                        LOG("}");
+                       #endif
 
                        dev_if = malloc(sizeof(tUSBInterface) + iface->NumEndpoints*sizeof(dev_if->Endpoints[0]));
                        dev_if->Dev = dev;

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