<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -148,6 +148,7 @@
 #define USB_EPCON_ENABLE (1 &lt;&lt; 31)
 #define USB_EPCON_SETNAK (1 &lt;&lt; 27)
 #define USB_EPCON_CLEARNAK (1 &lt;&lt; 26)
+#define USB_EPCON_STALL (1 &lt;&lt; 21)
 #define USB_EPCON_ACTIVE (1 &lt;&lt; 15)
 #define USB_EPCON_TYPE_MASK 0x3
 #define USB_EPCON_TYPE_SHIFT 18</diff>
      <filename>openiboot/includes/hardware/usb.h</filename>
    </modified>
    <modified>
      <diff>@@ -483,6 +483,10 @@ static void sendControl(void* buffer, int bufferLen) {
 	advanceTxQueue();
 }
 
+static void stallControl(void) {
+	InEPRegs[USB_CONTROLEP].control = USB_EPCON_STALL;
+}
+
 void usb_send_bulk(uint8_t endpoint, void* buffer, int bufferLen) {
 	usbTxRx(endpoint, USBIn, USBBulk, buffer, bufferLen);
 	ringBufferEnqueue(txQueue, endpoint);
@@ -605,6 +609,7 @@ static void usbIRQHandler(uint32_t token) {
 						case USB_GET_DESCRIPTOR:
 							length = setupPacket-&gt;wLength;
 							// descriptor type is high, descriptor index is low
+							int stall = FALSE;
 							switch(setupPacket-&gt;wValue &gt;&gt; 8) {
 								case USBDeviceDescriptorType:
 									if(length &gt; sizeof(USBDeviceDescriptor))
@@ -632,13 +637,14 @@ static void usbIRQHandler(uint32_t token) {
 									break;
 								default:
 									bufferPrintf(&quot;Unknown descriptor request: %d\r\n&quot;, setupPacket-&gt;wValue &gt;&gt; 8);
-									if(usb_state &lt; USBError) {
-										change_state(USBUnknownDescriptorRequest);
-									}
+									stall = TRUE;
 							}
 
 							if(usb_state &lt; USBError) {
-								sendControl(controlSendBuffer, length);
+								if(stall)
+									stallControl();
+								else
+									sendControl(controlSendBuffer, length);
 							}
 
 							break;
@@ -921,7 +927,7 @@ static uint8_t addStringDescriptor(const char* descriptorString) {
 	stringDescriptors = (USBStringDescriptor**) realloc(stringDescriptors, sizeof(USBStringDescriptor*) * numStringDescriptors);
 
 	int sLen = strlen(descriptorString);
-	stringDescriptors[newIndex] = (USBStringDescriptor*) malloc(sizeof(USBStringDescriptor) + sLen);
+	stringDescriptors[newIndex] = (USBStringDescriptor*) malloc(sizeof(USBStringDescriptor) + sLen * 2);
 	stringDescriptors[newIndex]-&gt;bLength = sizeof(USBStringDescriptor) + sLen * 2;
 	stringDescriptors[newIndex]-&gt;bDescriptorType = USBStringDescriptorType;
 	uint16_t* string = (uint16_t*) stringDescriptors[newIndex]-&gt;bString;</diff>
      <filename>openiboot/usb.c</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>06ba251ac2e4f202d96ba3c82c41726756d393d4</id>
    </parent>
  </parents>
  <author>
    <name>Hector Martin</name>
    <email>hector@marcansoft.com</email>
  </author>
  <url>http://github.com/planetbeing/iphonelinux/commit/9d4f371f57e3985f868e3fb4dda6469f94f1af23</url>
  <id>9d4f371f57e3985f868e3fb4dda6469f94f1af23</id>
  <committed-date>2009-06-23T22:02:49-07:00</committed-date>
  <authored-date>2009-06-23T21:52:26-07:00</authored-date>
  <message>Fix usb requests for unknown descriptors -&gt; EPSTALL</message>
  <tree>0021e0b70eef6d39ea0ed3fdc3adc903cda5a305</tree>
  <committer>
    <name>Hector Martin</name>
    <email>hector@marcansoft.com</email>
  </committer>
</commit>
