Make Host mode Class drivers only set the class driver instance's state values once...
[pub/USBasp.git] / LUFA / Drivers / USB / Class / Host / HID.c
index b0593f0..9dfc00a 100644 (file)
@@ -40,43 +40,20 @@ uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo
                                 uint16_t ConfigDescriptorSize,
                                 void* ConfigDescriptorData)
 {
-       USB_Descriptor_Interface_t* CurrentHIDInterface;
-
        USB_Descriptor_Endpoint_t*  DataINEndpoint  = NULL;
        USB_Descriptor_Endpoint_t*  DataOUTEndpoint = NULL;
+       USB_Descriptor_Interface_t* HIDInterface    = NULL;
+       USB_HID_Descriptor_HID_t*   HIDDescriptor   = NULL;
        
        memset(&HIDInterfaceInfo->State, 0x00, sizeof(HIDInterfaceInfo->State));
        
        if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
          return HID_ENUMERROR_InvalidConfigDescriptor;
-       
-       do
-       {
-               if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
-                                                                         DCOMP_HID_Host_NextHIDInterface) != DESCRIPTOR_SEARCH_COMP_Found)
-               {
-                       return HID_ENUMERROR_NoCompatibleInterfaceFound;
-               }
-               
-               CurrentHIDInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t);
-       } while (HIDInterfaceInfo->Config.HIDInterfaceProtocol &&
-                (CurrentHIDInterface->Protocol != HIDInterfaceInfo->Config.HIDInterfaceProtocol));
-
-       HIDInterfaceInfo->State.InterfaceNumber      = CurrentHIDInterface->InterfaceNumber;
-       HIDInterfaceInfo->State.SupportsBootProtocol = (CurrentHIDInterface->SubClass != HID_BOOTP_NonBootProtocol);
-
-       if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
-                                     DCOMP_HID_Host_NextHID) != DESCRIPTOR_SEARCH_COMP_Found)
-       {
-               return HID_ENUMERROR_NoCompatibleInterfaceFound;
-       }
-       
-       HIDInterfaceInfo->State.HIDReportSize = DESCRIPTOR_PCAST(ConfigDescriptorData,
-                                                                USB_HID_Descriptor_HID_t)->HIDReportLength;
 
        while (!(DataINEndpoint) || !(DataOUTEndpoint))
        {
-               if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+               if (!(HIDInterface) ||
+                   USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
                                              DCOMP_HID_Host_NextHIDInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
                {
                        if (DataINEndpoint || DataOUTEndpoint)
@@ -90,21 +67,17 @@ uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo
                                        return HID_ENUMERROR_NoCompatibleInterfaceFound;
                                }
                                
-                               CurrentHIDInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t);
+                               HIDInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t);
                        } while (HIDInterfaceInfo->Config.HIDInterfaceProtocol &&
-                                        (CurrentHIDInterface->Protocol != HIDInterfaceInfo->Config.HIDInterfaceProtocol));
+                                        (HIDInterface->Protocol != HIDInterfaceInfo->Config.HIDInterfaceProtocol));
                        
-                       HIDInterfaceInfo->State.InterfaceNumber      = CurrentHIDInterface->InterfaceNumber;
-                       HIDInterfaceInfo->State.SupportsBootProtocol = (CurrentHIDInterface->SubClass != HID_BOOTP_NonBootProtocol);
-
                        if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
                                                      DCOMP_HID_Host_NextHID) != DESCRIPTOR_SEARCH_COMP_Found)
                        {
                                return HID_ENUMERROR_NoCompatibleInterfaceFound;
                        }
 
-                       HIDInterfaceInfo->State.HIDReportSize = DESCRIPTOR_PCAST(ConfigDescriptorData,
-                                                                                USB_HID_Descriptor_HID_t)->HIDReportLength;
+                       HIDDescriptor = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_HID_Descriptor_HID_t);
 
                        DataINEndpoint  = NULL;
                        DataOUTEndpoint = NULL;
@@ -143,7 +116,10 @@ uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo
                }
        }
        
-       HIDInterfaceInfo->State.LargestReportSize = 8;
+       HIDInterfaceInfo->State.InterfaceNumber = HIDInterface->InterfaceNumber;
+       HIDInterfaceInfo->State.HIDReportSize   = HIDDescriptor->HIDReportLength;
+       HIDInterfaceInfo->State.SupportsBootProtocol = (HIDInterface->SubClass != HID_BOOTP_NonBootProtocol);
+       HIDInterfaceInfo->State.LargestReportSize    = 8;
        HIDInterfaceInfo->State.IsActive = true;
        
        return HID_ENUMERROR_NoError;