USB_HostState = HOST_STATE_Attached_WaitForDeviceSettle;\r
                        break;\r
                case HOST_STATE_Attached_WaitForDeviceSettle:\r
+                       #if HOST_DEVICE_SETTLE_DELAY_MS > 0\r
                        _delay_ms(1);\r
 \r
                        if (!(WaitMSRemaining--))\r
                                \r
                                USB_HostState = HOST_STATE_Attached_WaitForConnect;\r
                        }\r
+                       #else\r
+                       USB_HostState = HOST_STATE_Attached_WaitForConnect;                     \r
+                       #endif\r
                        \r
                        break;\r
                case HOST_STATE_Attached_WaitForConnect:                \r
                                break;\r
                        }\r
 \r
-                       Pipe_SetInfiniteINRequests();\r
-                       \r
                        USB_ControlRequest = (USB_Request_Header_t)\r
                                {\r
                                        .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),\r
        bool    BusSuspended = USB_Host_IsBusSuspended();\r
        uint8_t ErrorCode    = HOST_WAITERROR_Successful;\r
        \r
-       USB_INT_Clear(USB_INT_HSOFI);\r
        USB_Host_ResumeBus();\r
 \r
        while (MS)\r
        USB_Host_ResetBus();\r
        while (!(USB_Host_IsBusResetComplete()));\r
 \r
+       USB_Host_ResumeBus();\r
+\r
        USB_INT_Clear(USB_INT_HSOFI);\r
-       USB_Host_ResumeBus();   \r
-       \r
+\r
        for (uint8_t MSRem = 10; MSRem != 0; MSRem--)\r
        {\r
                /* Workaround for powerless-pull-up devices. After a USB bus reset,\r
 \r
                if (USB_INT_HasOccurred(USB_INT_HSOFI))\r
                {\r
+                       USB_INT_Clear(USB_INT_HSOFI);\r
                        USB_INT_Clear(USB_INT_DDISCI);\r
                        break;\r
                }\r
 \r
        USB_INT_Enable(USB_INT_DDISCI);\r
 }\r
+\r
+uint8_t USB_Host_SetDeviceConfiguration(uint8_t ConfigNumber)\r
+{\r
+       USB_ControlRequest = (USB_Request_Header_t)\r
+               {\r
+                       .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),\r
+                       .bRequest      = REQ_SetConfiguration,\r
+                       .wValue        = ConfigNumber,\r
+                       .wIndex        = 0,\r
+                       .wLength       = 0,\r
+               };\r
+\r
+       Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
+       \r
+       return USB_Host_SendControlRequest(NULL);\r
+}\r
+\r
+uint8_t USB_Host_GetDeviceDescriptor(void* DeviceDescriptorPtr)\r
+{\r
+       USB_ControlRequest = (USB_Request_Header_t)\r
+               {\r
+                       bmRequestType: (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),\r
+                       bRequest:      REQ_GetDescriptor,\r
+                       wValue:        (DTYPE_Device << 8),\r
+                       wIndex:        0,\r
+                       wLength:       sizeof(USB_Descriptor_Device_t),\r
+               };\r
+\r
+       Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
+       \r
+       return USB_Host_SendControlRequest(DeviceDescriptorPtr);\r
+}\r
+\r
+uint8_t USB_Host_ClearPipeStall(uint8_t EndpointNum)\r
+{\r
+       if (Pipe_GetPipeToken() == PIPE_TOKEN_IN)\r
+         EndpointNum |= (1 << 7);\r
+\r
+       USB_ControlRequest = (USB_Request_Header_t)\r
+               {\r
+                       .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_ENDPOINT),\r
+                       .bRequest      = REQ_ClearFeature,\r
+                       .wValue        = FEATURE_ENDPOINT_HALT,\r
+                       .wIndex        = EndpointNum,\r
+                       .wLength       = 0,\r
+               };\r
+\r
+       Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
+       \r
+       return USB_Host_SendControlRequest(NULL);\r
+}\r
+\r
 #endif\r