--- /dev/null
+#\r
+# ReactOS USB-Cromwell Drivers\r
+#\r
+\r
+PATH_TO_TOP = ../../..\r
+\r
+include $(PATH_TO_TOP)/rules.mak\r
+\r
+DRIVERS = core host\r
+\r
+all: $(DRIVERS)\r
+\r
+depends: \r
+\r
+implib: $(DRIVERS:%=%_implib)\r
+\r
+clean: $(DRIVERS:%=%_clean)\r
+\r
+install: $(DRIVERS:%=%_install)\r
+\r
+bootcd: $(DRIVERS:%=%_bootcd)\r
+\r
+.PHONY: all depends implib clean install bootcd\r
+\r
+\r
+#\r
+# USB DRIVERS\r
+#\r
+$(DRIVERS): %:\r
+ $(MAKE) -C $*\r
+\r
+$(DRIVERS:%=%_implib): %_implib:\r
+ $(MAKE) -C $* implib\r
+\r
+$(DRIVERS:%=%_clean): %_clean:\r
+ $(MAKE) -C $* clean\r
+\r
+$(DRIVERS:%=%_install): %_install:\r
+ $(MAKE) -C $* install\r
+\r
+$(DRIVERS:%=%_bootcd): %_bootcd:\r
+ $(MAKE) -C $* bootcd\r
+\r
+.PHONY: $(DRIVERS) $(DRIVERS:%=%_implib) $(DRIVERS:%=%_clean) $(DRIVERS:%=%_install) $(DRIVERS:%=%_bootcd)\r
+\r
+\r
+etags:\r
+ find . -name "*.[ch]" -print | etags --language=c -\r
+\r
+# EOF\r
--- /dev/null
+/* \r
+ * buffer_simple.c -- replacement for usb/core/buffer.c\r
+ *\r
+ * (c) Georg Acher, georg@acher.org\r
+ *\r
+ */\r
+\r
+#include "../usb_wrapper.h"\r
+#define __KERNEL__\r
+#define CONFIG_PCI\r
+#include "hcd.h"\r
+\r
+/*------------------------------------------------------------------------*/ \r
+int hcd_buffer_create (struct usb_hcd *hcd)\r
+{\r
+ return 0;\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+void hcd_buffer_destroy (struct usb_hcd *hcd)\r
+{\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+void *hcd_buffer_alloc (\r
+ struct usb_bus *bus,\r
+ size_t size,\r
+ int mem_flags,\r
+ dma_addr_t *dma\r
+)\r
+{\r
+ return kmalloc(size,0);\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+void hcd_buffer_free (\r
+ struct usb_bus *bus,\r
+ size_t size,\r
+ void *addr,\r
+ dma_addr_t dma\r
+)\r
+{\r
+ kfree(addr);\r
+}\r
+\r
--- /dev/null
+#if 0\r
+#include <linux/usb.h>\r
+#include <linux/module.h>\r
+#include <linux/init.h>\r
+#include <linux/slab.h>\r
+#include <asm/byteorder.h>\r
+#else\r
+#include "../usb_wrapper.h"\r
+#endif\r
+\r
+#define USB_MAXALTSETTING 128 /* Hard limit */\r
+#define USB_MAXENDPOINTS 30 /* Hard limit */\r
+\r
+/* these maximums are arbitrary */\r
+#define USB_MAXCONFIG 8\r
+#define USB_ALTSETTINGALLOC 4\r
+#define USB_MAXINTERFACES 32\r
+\r
+static int usb_parse_endpoint(struct usb_host_endpoint *endpoint, unsigned char *buffer, int size)\r
+{\r
+ struct usb_descriptor_header *header;\r
+ unsigned char *begin;\r
+ int parsed = 0, len, numskipped;\r
+\r
+ header = (struct usb_descriptor_header *)buffer;\r
+\r
+ /* Everything should be fine being passed into here, but we sanity */\r
+ /* check JIC */\r
+ if (header->bLength > size) {\r
+ err("ran out of descriptors parsing");\r
+ return -1;\r
+ }\r
+ \r
+ if (header->bDescriptorType != USB_DT_ENDPOINT) {\r
+ warn("unexpected descriptor 0x%X, expecting endpoint, 0x%X",\r
+ header->bDescriptorType, USB_DT_ENDPOINT);\r
+ return parsed;\r
+ }\r
+\r
+ if (header->bLength == USB_DT_ENDPOINT_AUDIO_SIZE)\r
+ memcpy(&endpoint->desc, buffer, USB_DT_ENDPOINT_AUDIO_SIZE);\r
+ else\r
+ memcpy(&endpoint->desc, buffer, USB_DT_ENDPOINT_SIZE);\r
+ \r
+ le16_to_cpus(&endpoint->desc.wMaxPacketSize);\r
+\r
+ buffer += header->bLength;\r
+ size -= header->bLength;\r
+ parsed += header->bLength;\r
+\r
+ /* Skip over the rest of the Class Specific or Vendor Specific */\r
+ /* descriptors */\r
+ begin = buffer;\r
+ numskipped = 0;\r
+ while (size >= sizeof(struct usb_descriptor_header)) {\r
+ header = (struct usb_descriptor_header *)buffer;\r
+\r
+ if (header->bLength < 2) {\r
+ err("invalid descriptor length of %d", header->bLength);\r
+ return -1;\r
+ }\r
+\r
+ /* If we find another "proper" descriptor then we're done */\r
+ if ((header->bDescriptorType == USB_DT_ENDPOINT) ||\r
+ (header->bDescriptorType == USB_DT_INTERFACE) ||\r
+ (header->bDescriptorType == USB_DT_CONFIG) ||\r
+ (header->bDescriptorType == USB_DT_DEVICE))\r
+ break;\r
+\r
+ dbg("skipping descriptor 0x%X",\r
+ header->bDescriptorType);\r
+ numskipped++;\r
+\r
+ buffer += header->bLength;\r
+ size -= header->bLength;\r
+ parsed += header->bLength;\r
+ }\r
+ if (numskipped)\r
+ dbg("skipped %d class/vendor specific endpoint descriptors", numskipped);\r
+\r
+ /* Copy any unknown descriptors into a storage area for drivers */\r
+ /* to later parse */\r
+ len = (int)(buffer - begin);\r
+ if (!len) {\r
+ endpoint->extra = NULL;\r
+ endpoint->extralen = 0;\r
+ return parsed;\r
+ }\r
+\r
+ endpoint->extra = kmalloc(len, GFP_KERNEL);\r
+\r
+ if (!endpoint->extra) {\r
+ err("couldn't allocate memory for endpoint extra descriptors");\r
+ endpoint->extralen = 0;\r
+ return parsed;\r
+ }\r
+\r
+ memcpy(endpoint->extra, begin, len);\r
+ endpoint->extralen = len;\r
+\r
+ return parsed;\r
+}\r
+\r
+static int usb_parse_interface(struct usb_interface *interface, unsigned char *buffer, int size)\r
+{\r
+ int i, len, numskipped, retval, parsed = 0;\r
+ struct usb_descriptor_header *header;\r
+ struct usb_host_interface *ifp;\r
+ unsigned char *begin;\r
+\r
+ interface->act_altsetting = 0;\r
+ interface->num_altsetting = 0;\r
+ interface->max_altsetting = USB_ALTSETTINGALLOC;\r
+ device_initialize(&interface->dev);\r
+\r
+ interface->altsetting = kmalloc(sizeof(*interface->altsetting) * interface->max_altsetting,\r
+ GFP_KERNEL);\r
+ \r
+ if (!interface->altsetting) {\r
+ err("couldn't kmalloc interface->altsetting");\r
+ return -1;\r
+ }\r
+\r
+ while (size > 0) {\r
+ struct usb_interface_descriptor *d;\r
+ \r
+ if (interface->num_altsetting >= interface->max_altsetting) {\r
+ struct usb_host_interface *ptr;\r
+ int oldmas;\r
+\r
+ oldmas = interface->max_altsetting;\r
+ interface->max_altsetting += USB_ALTSETTINGALLOC;\r
+ if (interface->max_altsetting > USB_MAXALTSETTING) {\r
+ warn("too many alternate settings (incr %d max %d)\n",\r
+ USB_ALTSETTINGALLOC, USB_MAXALTSETTING);\r
+ return -1;\r
+ }\r
+\r
+ ptr = kmalloc(sizeof(*ptr) * interface->max_altsetting, GFP_KERNEL);\r
+ if (ptr == NULL) {\r
+ err("couldn't kmalloc interface->altsetting");\r
+ return -1;\r
+ }\r
+ memcpy(ptr, interface->altsetting, sizeof(*interface->altsetting) * oldmas);\r
+ kfree(interface->altsetting);\r
+ interface->altsetting = ptr;\r
+ }\r
+\r
+ ifp = interface->altsetting + interface->num_altsetting;\r
+ ifp->endpoint = NULL;\r
+ ifp->extra = NULL;\r
+ ifp->extralen = 0;\r
+ interface->num_altsetting++;\r
+\r
+ memcpy(ifp, buffer, USB_DT_INTERFACE_SIZE);\r
+\r
+ /* Skip over the interface */\r
+ buffer += ifp->desc.bLength;\r
+ parsed += ifp->desc.bLength;\r
+ size -= ifp->desc.bLength;\r
+\r
+ begin = buffer;\r
+ numskipped = 0;\r
+\r
+ /* Skip over any interface, class or vendor descriptors */\r
+ while (size >= sizeof(struct usb_descriptor_header)) {\r
+ header = (struct usb_descriptor_header *)buffer;\r
+\r
+ if (header->bLength < 2) {\r
+ err("invalid descriptor length of %d", header->bLength);\r
+ return -1;\r
+ }\r
+\r
+ /* If we find another "proper" descriptor then we're done */\r
+ if ((header->bDescriptorType == USB_DT_INTERFACE) ||\r
+ (header->bDescriptorType == USB_DT_ENDPOINT) ||\r
+ (header->bDescriptorType == USB_DT_CONFIG) ||\r
+ (header->bDescriptorType == USB_DT_DEVICE))\r
+ break;\r
+\r
+ numskipped++;\r
+\r
+ buffer += header->bLength;\r
+ parsed += header->bLength;\r
+ size -= header->bLength;\r
+ }\r
+\r
+ if (numskipped)\r
+ dbg("skipped %d class/vendor specific interface descriptors", numskipped);\r
+\r
+ /* Copy any unknown descriptors into a storage area for */\r
+ /* drivers to later parse */\r
+ len = (int)(buffer - begin);\r
+ if (len) {\r
+ ifp->extra = kmalloc(len, GFP_KERNEL);\r
+\r
+ if (!ifp->extra) {\r
+ err("couldn't allocate memory for interface extra descriptors");\r
+ ifp->extralen = 0;\r
+ return -1;\r
+ }\r
+ memcpy(ifp->extra, begin, len);\r
+ ifp->extralen = len;\r
+ }\r
+\r
+ /* Did we hit an unexpected descriptor? */\r
+ header = (struct usb_descriptor_header *)buffer;\r
+ if ((size >= sizeof(struct usb_descriptor_header)) &&\r
+ ((header->bDescriptorType == USB_DT_CONFIG) ||\r
+ (header->bDescriptorType == USB_DT_DEVICE)))\r
+ return parsed;\r
+\r
+ if (ifp->desc.bNumEndpoints > USB_MAXENDPOINTS) {\r
+ warn("too many endpoints");\r
+ return -1;\r
+ }\r
+\r
+ ifp->endpoint = (struct usb_host_endpoint *)\r
+ kmalloc(ifp->desc.bNumEndpoints *\r
+ sizeof(struct usb_host_endpoint), GFP_KERNEL);\r
+ if (!ifp->endpoint) {\r
+ err("out of memory");\r
+ return -1; \r
+ }\r
+\r
+ memset(ifp->endpoint, 0, ifp->desc.bNumEndpoints *\r
+ sizeof(struct usb_host_endpoint));\r
+ \r
+ for (i = 0; i < ifp->desc.bNumEndpoints; i++) {\r
+ header = (struct usb_descriptor_header *)buffer;\r
+\r
+ if (header->bLength > size) {\r
+ err("ran out of descriptors parsing");\r
+ return -1;\r
+ }\r
+ \r
+ retval = usb_parse_endpoint(ifp->endpoint + i, buffer, size);\r
+ if (retval < 0)\r
+ return retval;\r
+\r
+ buffer += retval;\r
+ parsed += retval;\r
+ size -= retval;\r
+ }\r
+\r
+ /* We check to see if it's an alternate to this one */\r
+ d = (struct usb_interface_descriptor *)buffer;\r
+ if (size < USB_DT_INTERFACE_SIZE\r
+ || d->bDescriptorType != USB_DT_INTERFACE\r
+ || !d->bAlternateSetting)\r
+ return parsed;\r
+ }\r
+\r
+ return parsed;\r
+}\r
+\r
+int usb_parse_configuration(struct usb_host_config *config, char *buffer)\r
+{\r
+ int i, retval, size;\r
+ struct usb_descriptor_header *header;\r
+\r
+ memcpy(&config->desc, buffer, USB_DT_CONFIG_SIZE);\r
+ le16_to_cpus(&config->desc.wTotalLength);\r
+ size = config->desc.wTotalLength;\r
+\r
+ if (config->desc.bNumInterfaces > USB_MAXINTERFACES) {\r
+ warn("too many interfaces");\r
+ return -1;\r
+ }\r
+\r
+ config->interface = (struct usb_interface *)\r
+ kmalloc(config->desc.bNumInterfaces *\r
+ sizeof(struct usb_interface), GFP_KERNEL);\r
+ dbg("kmalloc IF %p, numif %i", config->interface, config->desc.bNumInterfaces);\r
+ if (!config->interface) {\r
+ err("out of memory");\r
+ return -1; \r
+ }\r
+\r
+ memset(config->interface, 0,\r
+ config->desc.bNumInterfaces * sizeof(struct usb_interface));\r
+\r
+ buffer += config->desc.bLength;\r
+ size -= config->desc.bLength;\r
+ \r
+ config->extra = NULL;\r
+ config->extralen = 0;\r
+\r
+ for (i = 0; i < config->desc.bNumInterfaces; i++) {\r
+ int numskipped, len;\r
+ char *begin;\r
+\r
+ /* Skip over the rest of the Class Specific or Vendor */\r
+ /* Specific descriptors */\r
+ begin = buffer;\r
+ numskipped = 0;\r
+ while (size >= sizeof(struct usb_descriptor_header)) {\r
+ header = (struct usb_descriptor_header *)buffer;\r
+\r
+ if ((header->bLength > size) || (header->bLength < 2)) {\r
+ err("invalid descriptor length of %d", header->bLength);\r
+ return -1;\r
+ }\r
+\r
+ /* If we find another "proper" descriptor then we're done */\r
+ if ((header->bDescriptorType == USB_DT_ENDPOINT) ||\r
+ (header->bDescriptorType == USB_DT_INTERFACE) ||\r
+ (header->bDescriptorType == USB_DT_CONFIG) ||\r
+ (header->bDescriptorType == USB_DT_DEVICE))\r
+ break;\r
+\r
+ dbg("skipping descriptor 0x%X", header->bDescriptorType);\r
+ numskipped++;\r
+\r
+ buffer += header->bLength;\r
+ size -= header->bLength;\r
+ }\r
+ if (numskipped)\r
+ dbg("skipped %d class/vendor specific endpoint descriptors", numskipped);\r
+\r
+ /* Copy any unknown descriptors into a storage area for */\r
+ /* drivers to later parse */\r
+ len = (int)(buffer - begin);\r
+ if (len) {\r
+ if (config->extralen) {\r
+ warn("extra config descriptor");\r
+ } else {\r
+ config->extra = kmalloc(len, GFP_KERNEL);\r
+ if (!config->extra) {\r
+ err("couldn't allocate memory for config extra descriptors");\r
+ config->extralen = 0;\r
+ return -1;\r
+ }\r
+\r
+ memcpy(config->extra, begin, len);\r
+ config->extralen = len;\r
+ }\r
+ }\r
+\r
+ retval = usb_parse_interface(config->interface + i, buffer, size);\r
+ if (retval < 0)\r
+ return retval;\r
+\r
+ buffer += retval;\r
+ size -= retval;\r
+ }\r
+\r
+ return size;\r
+}\r
+\r
+// hub-only!! ... and only exported for reset/reinit path.\r
+// otherwise used internally on disconnect/destroy path\r
+void usb_destroy_configuration(struct usb_device *dev)\r
+{\r
+ int c, i, j, k;\r
+ \r
+ if (!dev->config)\r
+ return;\r
+\r
+ if (dev->rawdescriptors) {\r
+ for (i = 0; i < dev->descriptor.bNumConfigurations; i++)\r
+ kfree(dev->rawdescriptors[i]);\r
+\r
+ kfree(dev->rawdescriptors);\r
+ }\r
+\r
+ for (c = 0; c < dev->descriptor.bNumConfigurations; c++) {\r
+ struct usb_host_config *cf = &dev->config[c];\r
+\r
+ if (!cf->interface)\r
+ break;\r
+\r
+ for (i = 0; i < cf->desc.bNumInterfaces; i++) {\r
+ struct usb_interface *ifp =\r
+ &cf->interface[i];\r
+ \r
+ if (!ifp->altsetting)\r
+ break;\r
+\r
+ for (j = 0; j < ifp->num_altsetting; j++) {\r
+ struct usb_host_interface *as =\r
+ &ifp->altsetting[j];\r
+ \r
+ if(as->extra) {\r
+ kfree(as->extra);\r
+ }\r
+\r
+ if (!as->endpoint)\r
+ break;\r
+ \r
+ for(k = 0; k < as->desc.bNumEndpoints; k++) {\r
+ if(as->endpoint[k].extra) {\r
+ kfree(as->endpoint[k].extra);\r
+ }\r
+ } \r
+ kfree(as->endpoint);\r
+ }\r
+\r
+ kfree(ifp->altsetting);\r
+ }\r
+ kfree(cf->interface);\r
+ }\r
+ kfree(dev->config);\r
+}\r
+\r
+\r
+// hub-only!! ... and only in reset path, or usb_new_device()\r
+// (used by real hubs and virtual root hubs)\r
+int usb_get_configuration(struct usb_device *dev)\r
+{\r
+ int result;\r
+ unsigned int cfgno, length;\r
+ unsigned char *buffer;\r
+ unsigned char *bigbuffer;\r
+ struct usb_config_descriptor *desc;\r
+\r
+ if (dev->descriptor.bNumConfigurations > USB_MAXCONFIG) {\r
+ warn("too many configurations");\r
+ return -EINVAL;\r
+ }\r
+\r
+ if (dev->descriptor.bNumConfigurations < 1) {\r
+ warn("not enough configurations");\r
+ return -EINVAL;\r
+ }\r
+\r
+ dev->config = (struct usb_host_config *)\r
+ kmalloc(dev->descriptor.bNumConfigurations *\r
+ sizeof(struct usb_host_config), GFP_KERNEL);\r
+ if (!dev->config) {\r
+ err("out of memory");\r
+ return -ENOMEM; \r
+ }\r
+ memset(dev->config, 0, dev->descriptor.bNumConfigurations *\r
+ sizeof(struct usb_host_config));\r
+\r
+ dev->rawdescriptors = (char **)kmalloc(sizeof(char *) *\r
+ dev->descriptor.bNumConfigurations, GFP_KERNEL);\r
+ if (!dev->rawdescriptors) {\r
+ err("out of memory");\r
+ return -ENOMEM;\r
+ }\r
+\r
+ buffer = kmalloc(8, GFP_KERNEL);\r
+ if (!buffer) {\r
+ err("unable to allocate memory for configuration descriptors");\r
+ return -ENOMEM;\r
+ }\r
+ desc = (struct usb_config_descriptor *)buffer;\r
+\r
+ for (cfgno = 0; cfgno < dev->descriptor.bNumConfigurations; cfgno++) {\r
+ /* We grab the first 8 bytes so we know how long the whole */\r
+ /* configuration is */\r
+ result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, 8);\r
+ if (result < 8) {\r
+ if (result < 0)\r
+ err("unable to get descriptor");\r
+ else {\r
+ err("config descriptor too short (expected %i, got %i)", 8, result);\r
+ result = -EINVAL;\r
+ }\r
+ goto err;\r
+ }\r
+\r
+ /* Get the full buffer */\r
+ length = le16_to_cpu(desc->wTotalLength);\r
+\r
+ bigbuffer = kmalloc(length, GFP_KERNEL);\r
+ if (!bigbuffer) {\r
+ err("unable to allocate memory for configuration descriptors");\r
+ result = -ENOMEM;\r
+ goto err;\r
+ }\r
+\r
+ /* Now that we know the length, get the whole thing */\r
+ result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, bigbuffer, length);\r
+ if (result < 0) {\r
+ err("couldn't get all of config descriptors");\r
+ kfree(bigbuffer);\r
+ goto err;\r
+ } \r
+ \r
+ if (result < length) {\r
+ err("config descriptor too short (expected %i, got %i)", length, result);\r
+ result = -EINVAL;\r
+ kfree(bigbuffer);\r
+ goto err;\r
+ }\r
+\r
+ dev->rawdescriptors[cfgno] = bigbuffer;\r
+\r
+ result = usb_parse_configuration(&dev->config[cfgno], bigbuffer);\r
+ if (result > 0)\r
+ dbg("descriptor data left");\r
+ else if (result < 0) {\r
+ result = -EINVAL;\r
+ goto err;\r
+ }\r
+ }\r
+\r
+ kfree(buffer);\r
+ return 0;\r
+err:\r
+ kfree(buffer);\r
+ dev->descriptor.bNumConfigurations = cfgno;\r
+ return result;\r
+}\r
+\r
--- /dev/null
+/*\r
+ * (C) Copyright David Brownell 2000-2002\r
+ * \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of the GNU General Public License as published by the\r
+ * Free Software Foundation; either version 2 of the License, or (at your\r
+ * option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but\r
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\r
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License\r
+ * for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software Foundation,\r
+ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\r
+ */\r
+\r
+#if 0\r
+#include <linux/config.h>\r
+\r
+#ifdef CONFIG_USB_DEBUG\r
+ #define DEBUG\r
+#else\r
+ #undef DEBUG\r
+#endif\r
+\r
+#include <linux/kernel.h>\r
+#include <linux/module.h>\r
+#include <linux/pci.h>\r
+#include <asm/io.h>\r
+#include <asm/irq.h>\r
+#include <linux/usb.h>\r
+#include "hcd.h"\r
+#else\r
+#define DEBUG\r
+#include "../usb_wrapper.h"\r
+#include "hcd.h"\r
+#endif\r
+\r
+\r
+/* PCI-based HCs are normal, but custom bus glue should be ok */\r
+\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* configure so an HC device and id are always provided */\r
+/* always called with process context; sleeping is OK */\r
+\r
+/**\r
+ * usb_hcd_pci_probe - initialize PCI-based HCDs\r
+ * @dev: USB Host Controller being probed\r
+ * @id: pci hotplug id connecting controller to HCD framework\r
+ * Context: !in_interrupt()\r
+ *\r
+ * Allocates basic PCI resources for this USB host controller, and\r
+ * then invokes the start() method for the HCD associated with it\r
+ * through the hotplug entry's driver_data.\r
+ *\r
+ * Store this function in the HCD's struct pci_driver as probe().\r
+ */\r
+int STDCALL usb_hcd_pci_probe (struct pci_dev *dev, const struct pci_device_id *id)\r
+{\r
+ struct hc_driver *driver;\r
+ unsigned long resource, len;\r
+ void *base;\r
+ struct usb_hcd *hcd;\r
+ int retval, region;\r
+ char buf [8];\r
+ //char *bufp = buf;\r
+\r
+ if (usb_disabled())\r
+ return -ENODEV;\r
+\r
+ if (!id || !(driver = (struct hc_driver *) id->driver_data))\r
+ return -EINVAL;\r
+\r
+ if (pci_enable_device (dev) < 0)\r
+ return -ENODEV;\r
+\r
+ if (!dev->irq) {\r
+ err ("Found HC with no IRQ. Check BIOS/PCI %s setup!",\r
+ dev->slot_name);\r
+ return -ENODEV;\r
+ }\r
+\r
+ if (driver->flags & HCD_MEMORY) { // EHCI, OHCI\r
+ region = 0;\r
+ resource = pci_resource_start (dev, 0);\r
+ len = pci_resource_len (dev, 0);\r
+ if (!request_mem_region (resource, len, driver->description)) {\r
+ dbg ("controller already in use");\r
+ return -EBUSY;\r
+ }\r
+ base = ioremap_nocache (resource, len);\r
+ if (base == NULL) {\r
+ dbg ("error mapping memory");\r
+ retval = -EFAULT;\r
+clean_1:\r
+ release_mem_region (resource, len);\r
+ err ("init %s fail, %d", dev->slot_name, retval);\r
+ return retval;\r
+ }\r
+\r
+ } else { // UHCI\r
+ resource = len = 0;\r
+ for (region = 0; region < PCI_ROM_RESOURCE; region++) {\r
+ if (!(pci_resource_flags (dev, region) & IORESOURCE_IO))\r
+ continue;\r
+\r
+ resource = pci_resource_start (dev, region);\r
+ len = pci_resource_len (dev, region);\r
+ if (request_region (resource, len,\r
+ driver->description))\r
+ break;\r
+ }\r
+ if (region == PCI_ROM_RESOURCE) {\r
+ dbg ("no i/o regions available");\r
+ return -EBUSY;\r
+ }\r
+ base = (void *) resource;\r
+ }\r
+\r
+ // driver->start(), later on, will transfer device from\r
+ // control by SMM/BIOS to control by Linux (if needed)\r
+\r
+ pci_set_master (dev);\r
+\r
+ hcd = driver->hcd_alloc ();\r
+ if (hcd == NULL){\r
+ dbg ("hcd alloc fail");\r
+ retval = -ENOMEM;\r
+clean_2:\r
+ if (driver->flags & HCD_MEMORY) {\r
+ iounmap (base);\r
+ goto clean_1;\r
+ } else {\r
+ release_region (resource, len);\r
+ err ("init %s fail, %d", dev->slot_name, retval);\r
+ return retval;\r
+ }\r
+ }\r
+ pci_set_drvdata (dev, hcd);\r
+ hcd->driver = driver;\r
+ hcd->description = driver->description;\r
+ hcd->pdev = dev;\r
+ hcd->self.bus_name = dev->slot_name;\r
+ hcd->product_desc = dev->dev.name;\r
+ hcd->self.controller = &dev->dev;\r
+ hcd->controller = hcd->self.controller;\r
+\r
+ if ((retval = hcd_buffer_create (hcd)) != 0) {\r
+clean_3:\r
+ driver->hcd_free (hcd);\r
+ goto clean_2;\r
+ }\r
+\r
+ dev_info (hcd->controller, "%s\n", hcd->product_desc);\r
+\r
+#ifndef __sparc__\r
+ sprintf (buf, "%d", dev->irq);\r
+#else\r
+ bufp = __irq_itoa(dev->irq);\r
+#endif\r
+ if (request_irq (dev->irq, usb_hcd_irq, SA_SHIRQ, hcd->description, hcd)\r
+ != 0) {\r
+ dev_err (hcd->controller,\r
+ "request interrupt %s failed\n", bufp);\r
+ retval = -EBUSY;\r
+ goto clean_3;\r
+ }\r
+ hcd->irq = dev->irq;\r
+\r
+ hcd->regs = base;\r
+ hcd->region = region;\r
+ dev_info (hcd->controller, "irq %s, %s %p\n", bufp,\r
+ (driver->flags & HCD_MEMORY) ? "pci mem" : "io base",\r
+ base);\r
+\r
+ usb_bus_init (&hcd->self);\r
+ hcd->self.op = &usb_hcd_operations;\r
+ hcd->self.hcpriv = (void *) hcd;\r
+\r
+ INIT_LIST_HEAD (&hcd->dev_list);\r
+\r
+ usb_register_bus (&hcd->self);\r
+\r
+ if ((retval = driver->start (hcd)) < 0)\r
+ usb_hcd_pci_remove (dev);\r
+\r
+ return retval;\r
+} \r
+EXPORT_SYMBOL (usb_hcd_pci_probe);\r
+\r
+\r
+/* may be called without controller electrically present */\r
+/* may be called with controller, bus, and devices active */\r
+\r
+/**\r
+ * usb_hcd_pci_remove - shutdown processing for PCI-based HCDs\r
+ * @dev: USB Host Controller being removed\r
+ * Context: !in_interrupt()\r
+ *\r
+ * Reverses the effect of usb_hcd_pci_probe(), first invoking\r
+ * the HCD's stop() method. It is always called from a thread\r
+ * context, normally "rmmod", "apmd", or something similar.\r
+ *\r
+ * Store this function in the HCD's struct pci_driver as remove().\r
+ */\r
+void STDCALL usb_hcd_pci_remove (struct pci_dev *dev)\r
+{\r
+ struct usb_hcd *hcd;\r
+ struct usb_device *hub;\r
+\r
+ hcd = pci_get_drvdata(dev);\r
+ if (!hcd)\r
+ return;\r
+ dev_info (hcd->controller, "remove, state %x\n", hcd->state);\r
+\r
+ if (in_interrupt ())\r
+ BUG ();\r
+\r
+ hub = hcd->self.root_hub;\r
+ hcd->state = USB_STATE_QUIESCING;\r
+\r
+ dev_dbg (hcd->controller, "roothub graceful disconnect\n");\r
+ usb_disconnect (&hub);\r
+\r
+ hcd->driver->stop (hcd);\r
+ hcd_buffer_destroy (hcd);\r
+ hcd->state = USB_STATE_HALT;\r
+ pci_set_drvdata (dev, 0);\r
+\r
+ free_irq (hcd->irq, hcd);\r
+ if (hcd->driver->flags & HCD_MEMORY) {\r
+ iounmap (hcd->regs);\r
+ release_mem_region (pci_resource_start (dev, 0),\r
+ pci_resource_len (dev, 0));\r
+ } else {\r
+ release_region (pci_resource_start (dev, hcd->region),\r
+ pci_resource_len (dev, hcd->region));\r
+ }\r
+\r
+ usb_deregister_bus (&hcd->self);\r
+ if (atomic_read (&hcd->self.refcnt) != 1) {\r
+ dev_warn (hcd->controller,\r
+ "dangling refs (%d) to bus %d!\n",\r
+ atomic_read (&hcd->self.refcnt) - 1,\r
+ hcd->self.busnum);\r
+ }\r
+ hcd->driver->hcd_free (hcd);\r
+}\r
+EXPORT_SYMBOL (usb_hcd_pci_remove);\r
+\r
+\r
+#ifdef CONFIG_PM\r
+\r
+/*\r
+ * Some "sleep" power levels imply updating struct usb_driver\r
+ * to include a callback asking hcds to do their bit by checking\r
+ * if all the drivers can suspend. Gets involved with remote wakeup.\r
+ *\r
+ * If there are pending urbs, then HCs will need to access memory,\r
+ * causing extra power drain. New sleep()/wakeup() PM calls might\r
+ * be needed, beyond PCI suspend()/resume(). The root hub timer\r
+ * still be accessing memory though ...\r
+ *\r
+ * FIXME: USB should have some power budgeting support working with\r
+ * all kinds of hubs.\r
+ *\r
+ * FIXME: This assumes only D0->D3 suspend and D3->D0 resume.\r
+ * D1 and D2 states should do something, yes?\r
+ *\r
+ * FIXME: Should provide generic enable_wake(), calling pci_enable_wake()\r
+ * for all supported states, so that USB remote wakeup can work for any\r
+ * devices that support it (and are connected via powered hubs).\r
+ *\r
+ * FIXME: resume doesn't seem to work right any more...\r
+ */\r
+\r
+\r
+// 2.4 kernels have issued concurrent resumes (w/APM)\r
+// we defend against that error; PCI doesn't yet.\r
+\r
+/**\r
+ * usb_hcd_pci_suspend - power management suspend of a PCI-based HCD\r
+ * @dev: USB Host Controller being suspended\r
+ *\r
+ * Store this function in the HCD's struct pci_driver as suspend().\r
+ */\r
+int usb_hcd_pci_suspend (struct pci_dev *dev, u32 state)\r
+{\r
+ struct usb_hcd *hcd;\r
+ int retval;\r
+\r
+ hcd = pci_get_drvdata(dev);\r
+ dev_info (hcd->controller, "suspend to state %d\n", state);\r
+\r
+ pci_save_state (dev, hcd->pci_state);\r
+\r
+ // FIXME for all connected devices, leaf-to-root:\r
+ // driver->suspend()\r
+ // proposed "new 2.5 driver model" will automate that\r
+\r
+ /* driver may want to disable DMA etc */\r
+ retval = hcd->driver->suspend (hcd, state);\r
+ hcd->state = USB_STATE_SUSPENDED;\r
+\r
+ pci_set_power_state (dev, state);\r
+ return retval;\r
+}\r
+EXPORT_SYMBOL (usb_hcd_pci_suspend);\r
+\r
+/**\r
+ * usb_hcd_pci_resume - power management resume of a PCI-based HCD\r
+ * @dev: USB Host Controller being resumed\r
+ *\r
+ * Store this function in the HCD's struct pci_driver as resume().\r
+ */\r
+int usb_hcd_pci_resume (struct pci_dev *dev)\r
+{\r
+ struct usb_hcd *hcd;\r
+ int retval;\r
+\r
+ hcd = pci_get_drvdata(dev);\r
+ dev_info (hcd->controller, "resume\n");\r
+\r
+ /* guard against multiple resumes (APM bug?) */\r
+ atomic_inc (&hcd->resume_count);\r
+ if (atomic_read (&hcd->resume_count) != 1) {\r
+ dev_err (hcd->controller, "concurrent PCI resumes\n");\r
+ retval = 0;\r
+ goto done;\r
+ }\r
+\r
+ retval = -EBUSY;\r
+ if (hcd->state != USB_STATE_SUSPENDED) {\r
+ dev_dbg (hcd->controller, "can't resume, not suspended!\n");\r
+ goto done;\r
+ }\r
+ hcd->state = USB_STATE_RESUMING;\r
+\r
+ pci_set_power_state (dev, 0);\r
+ pci_restore_state (dev, hcd->pci_state);\r
+\r
+ retval = hcd->driver->resume (hcd);\r
+ if (!HCD_IS_RUNNING (hcd->state)) {\r
+ dev_dbg (hcd->controller, "resume fail, retval %d\n", retval);\r
+ usb_hc_died (hcd);\r
+// FIXME: recover, reset etc.\r
+ } else {\r
+ // FIXME for all connected devices, root-to-leaf:\r
+ // driver->resume ();\r
+ // proposed "new 2.5 driver model" will automate that\r
+ }\r
+\r
+done:\r
+ atomic_dec (&hcd->resume_count);\r
+ return retval;\r
+}\r
+EXPORT_SYMBOL (usb_hcd_pci_resume);\r
+\r
+#endif /* CONFIG_PM */\r
+\r
+\r
--- /dev/null
+/*\r
+ * (C) Copyright Linus Torvalds 1999\r
+ * (C) Copyright Johannes Erdfelt 1999-2001\r
+ * (C) Copyright Andreas Gal 1999\r
+ * (C) Copyright Gregory P. Smith 1999\r
+ * (C) Copyright Deti Fliegl 1999\r
+ * (C) Copyright Randy Dunlap 2000\r
+ * (C) Copyright David Brownell 2000-2002\r
+ * \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of the GNU General Public License as published by the\r
+ * Free Software Foundation; either version 2 of the License, or (at your\r
+ * option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but\r
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\r
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License\r
+ * for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software Foundation,\r
+ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\r
+ */\r
+\r
+#if 0\r
+#include <linux/config.h>\r
+\r
+#ifdef CONFIG_USB_DEBUG\r
+#define DEBUG\r
+#endif\r
+\r
+#include <linux/module.h>\r
+#include <linux/version.h>\r
+#include <linux/kernel.h>\r
+#include <linux/slab.h>\r
+#include <linux/completion.h>\r
+#include <linux/uts.h> /* for UTS_SYSNAME */\r
+#include <linux/pci.h> /* for hcd->pdev and dma addressing */\r
+#include <linux/dma-mapping.h>\r
+#include <asm/byteorder.h>\r
+\r
+#include <linux/usb.h>\r
+#else\r
+#include "../usb_wrapper.h"\r
+//#define DEBUG\r
+#endif\r
+\r
+#include "hcd.h"\r
+\r
+// #define USB_BANDWIDTH_MESSAGES\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/*\r
+ * USB Host Controller Driver framework\r
+ *\r
+ * Plugs into usbcore (usb_bus) and lets HCDs share code, minimizing\r
+ * HCD-specific behaviors/bugs.\r
+ *\r
+ * This does error checks, tracks devices and urbs, and delegates to a\r
+ * "hc_driver" only for code (and data) that really needs to know about\r
+ * hardware differences. That includes root hub registers, i/o queues,\r
+ * and so on ... but as little else as possible.\r
+ *\r
+ * Shared code includes most of the "root hub" code (these are emulated,\r
+ * though each HC's hardware works differently) and PCI glue, plus request\r
+ * tracking overhead. The HCD code should only block on spinlocks or on\r
+ * hardware handshaking; blocking on software events (such as other kernel\r
+ * threads releasing resources, or completing actions) is all generic.\r
+ *\r
+ * Happens the USB 2.0 spec says this would be invisible inside the "USBD",\r
+ * and includes mostly a "HCDI" (HCD Interface) along with some APIs used\r
+ * only by the hub driver ... and that neither should be seen or used by\r
+ * usb client device drivers.\r
+ *\r
+ * Contributors of ideas or unattributed patches include: David Brownell,\r
+ * Roman Weissgaerber, Rory Bolt, Greg Kroah-Hartman, ...\r
+ *\r
+ * HISTORY:\r
+ * 2002-02-21 Pull in most of the usb_bus support from usb.c; some\r
+ * associated cleanup. "usb_hcd" still != "usb_bus".\r
+ * 2001-12-12 Initial patch version for Linux 2.5.1 kernel.\r
+ */\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* host controllers we manage */\r
+LIST_HEAD (usb_bus_list);\r
+EXPORT_SYMBOL_GPL (usb_bus_list);\r
+\r
+/* used when allocating bus numbers */\r
+#define USB_MAXBUS 64\r
+struct usb_busmap {\r
+ unsigned long busmap [USB_MAXBUS / (8*sizeof (unsigned long))];\r
+};\r
+static struct usb_busmap busmap;\r
+\r
+/* used when updating list of hcds */\r
+DECLARE_MUTEX (usb_bus_list_lock); /* exported only for usbfs */\r
+EXPORT_SYMBOL_GPL (usb_bus_list_lock);\r
+\r
+/* used when updating hcd data */\r
+static spinlock_t hcd_data_lock = SPIN_LOCK_UNLOCKED;\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/*\r
+ * Sharable chunks of root hub code.\r
+ */\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+#define KERNEL_REL ((LINUX_VERSION_CODE >> 16) & 0x0ff)\r
+#define KERNEL_VER ((LINUX_VERSION_CODE >> 8) & 0x0ff)\r
+\r
+/* usb 2.0 root hub device descriptor */\r
+static const u8 usb2_rh_dev_descriptor [18] = {\r
+ 0x12, /* __u8 bLength; */\r
+ 0x01, /* __u8 bDescriptorType; Device */\r
+ 0x00, 0x02, /* __u16 bcdUSB; v2.0 */\r
+\r
+ 0x09, /* __u8 bDeviceClass; HUB_CLASSCODE */\r
+ 0x00, /* __u8 bDeviceSubClass; */\r
+ 0x01, /* __u8 bDeviceProtocol; [ usb 2.0 single TT ]*/\r
+ 0x08, /* __u8 bMaxPacketSize0; 8 Bytes */\r
+\r
+ 0x00, 0x00, /* __u16 idVendor; */\r
+ 0x00, 0x00, /* __u16 idProduct; */\r
+ KERNEL_VER, KERNEL_REL, /* __u16 bcdDevice */\r
+\r
+ 0x03, /* __u8 iManufacturer; */\r
+ 0x02, /* __u8 iProduct; */\r
+ 0x01, /* __u8 iSerialNumber; */\r
+ 0x01 /* __u8 bNumConfigurations; */\r
+};\r
+\r
+/* no usb 2.0 root hub "device qualifier" descriptor: one speed only */\r
+\r
+/* usb 1.1 root hub device descriptor */\r
+static const u8 usb11_rh_dev_descriptor [18] = {\r
+ 0x12, /* __u8 bLength; */\r
+ 0x01, /* __u8 bDescriptorType; Device */\r
+ 0x10, 0x01, /* __u16 bcdUSB; v1.1 */\r
+\r
+ 0x09, /* __u8 bDeviceClass; HUB_CLASSCODE */\r
+ 0x00, /* __u8 bDeviceSubClass; */\r
+ 0x00, /* __u8 bDeviceProtocol; [ low/full speeds only ] */\r
+ 0x08, /* __u8 bMaxPacketSize0; 8 Bytes */\r
+\r
+ 0x00, 0x00, /* __u16 idVendor; */\r
+ 0x00, 0x00, /* __u16 idProduct; */\r
+ KERNEL_VER, KERNEL_REL, /* __u16 bcdDevice */\r
+\r
+ 0x03, /* __u8 iManufacturer; */\r
+ 0x02, /* __u8 iProduct; */\r
+ 0x01, /* __u8 iSerialNumber; */\r
+ 0x01 /* __u8 bNumConfigurations; */\r
+};\r
+\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* Configuration descriptors for our root hubs */\r
+\r
+static const u8 fs_rh_config_descriptor [] = {\r
+\r
+ /* one configuration */\r
+ 0x09, /* __u8 bLength; */\r
+ 0x02, /* __u8 bDescriptorType; Configuration */\r
+ 0x19, 0x00, /* __u16 wTotalLength; */\r
+ 0x01, /* __u8 bNumInterfaces; (1) */\r
+ 0x01, /* __u8 bConfigurationValue; */\r
+ 0x00, /* __u8 iConfiguration; */\r
+ 0x40, /* __u8 bmAttributes; \r
+ Bit 7: Bus-powered,\r
+ 6: Self-powered,\r
+ 5 Remote-wakwup,\r
+ 4..0: resvd */\r
+ 0x00, /* __u8 MaxPower; */\r
+ \r
+ /* USB 1.1:\r
+ * USB 2.0, single TT organization (mandatory):\r
+ * one interface, protocol 0\r
+ *\r
+ * USB 2.0, multiple TT organization (optional):\r
+ * two interfaces, protocols 1 (like single TT)\r
+ * and 2 (multiple TT mode) ... config is\r
+ * sometimes settable\r
+ * NOT IMPLEMENTED\r
+ */\r
+\r
+ /* one interface */\r
+ 0x09, /* __u8 if_bLength; */\r
+ 0x04, /* __u8 if_bDescriptorType; Interface */\r
+ 0x00, /* __u8 if_bInterfaceNumber; */\r
+ 0x00, /* __u8 if_bAlternateSetting; */\r
+ 0x01, /* __u8 if_bNumEndpoints; */\r
+ 0x09, /* __u8 if_bInterfaceClass; HUB_CLASSCODE */\r
+ 0x00, /* __u8 if_bInterfaceSubClass; */\r
+ 0x00, /* __u8 if_bInterfaceProtocol; [usb1.1 or single tt] */\r
+ 0x00, /* __u8 if_iInterface; */\r
+ \r
+ /* one endpoint (status change endpoint) */\r
+ 0x07, /* __u8 ep_bLength; */\r
+ 0x05, /* __u8 ep_bDescriptorType; Endpoint */\r
+ 0x81, /* __u8 ep_bEndpointAddress; IN Endpoint 1 */\r
+ 0x03, /* __u8 ep_bmAttributes; Interrupt */\r
+ 0x02, 0x00, /* __u16 ep_wMaxPacketSize; 1 + (MAX_ROOT_PORTS / 8) */\r
+ 0xff /* __u8 ep_bInterval; (255ms -- usb 2.0 spec) */\r
+};\r
+\r
+static const u8 hs_rh_config_descriptor [] = {\r
+\r
+ /* one configuration */\r
+ 0x09, /* __u8 bLength; */\r
+ 0x02, /* __u8 bDescriptorType; Configuration */\r
+ 0x19, 0x00, /* __u16 wTotalLength; */\r
+ 0x01, /* __u8 bNumInterfaces; (1) */\r
+ 0x01, /* __u8 bConfigurationValue; */\r
+ 0x00, /* __u8 iConfiguration; */\r
+ 0x40, /* __u8 bmAttributes; \r
+ Bit 7: Bus-powered,\r
+ 6: Self-powered,\r
+ 5 Remote-wakwup,\r
+ 4..0: resvd */\r
+ 0x00, /* __u8 MaxPower; */\r
+ \r
+ /* USB 1.1:\r
+ * USB 2.0, single TT organization (mandatory):\r
+ * one interface, protocol 0\r
+ *\r
+ * USB 2.0, multiple TT organization (optional):\r
+ * two interfaces, protocols 1 (like single TT)\r
+ * and 2 (multiple TT mode) ... config is\r
+ * sometimes settable\r
+ * NOT IMPLEMENTED\r
+ */\r
+\r
+ /* one interface */\r
+ 0x09, /* __u8 if_bLength; */\r
+ 0x04, /* __u8 if_bDescriptorType; Interface */\r
+ 0x00, /* __u8 if_bInterfaceNumber; */\r
+ 0x00, /* __u8 if_bAlternateSetting; */\r
+ 0x01, /* __u8 if_bNumEndpoints; */\r
+ 0x09, /* __u8 if_bInterfaceClass; HUB_CLASSCODE */\r
+ 0x00, /* __u8 if_bInterfaceSubClass; */\r
+ 0x00, /* __u8 if_bInterfaceProtocol; [usb1.1 or single tt] */\r
+ 0x00, /* __u8 if_iInterface; */\r
+ \r
+ /* one endpoint (status change endpoint) */\r
+ 0x07, /* __u8 ep_bLength; */\r
+ 0x05, /* __u8 ep_bDescriptorType; Endpoint */\r
+ 0x81, /* __u8 ep_bEndpointAddress; IN Endpoint 1 */\r
+ 0x03, /* __u8 ep_bmAttributes; Interrupt */\r
+ 0x02, 0x00, /* __u16 ep_wMaxPacketSize; 1 + (MAX_ROOT_PORTS / 8) */\r
+ 0x0c /* __u8 ep_bInterval; (256ms -- usb 2.0 spec) */\r
+};\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/*\r
+ * helper routine for returning string descriptors in UTF-16LE\r
+ * input can actually be ISO-8859-1; ASCII is its 7-bit subset\r
+ */\r
+static int ascii2utf (char *s, u8 *utf, int utfmax)\r
+{\r
+ int retval;\r
+\r
+ for (retval = 0; *s && utfmax > 1; utfmax -= 2, retval += 2) {\r
+ *utf++ = *s++;\r
+ *utf++ = 0;\r
+ }\r
+ return retval;\r
+}\r
+\r
+/*\r
+ * rh_string - provides manufacturer, product and serial strings for root hub\r
+ * @id: the string ID number (1: serial number, 2: product, 3: vendor)\r
+ * @hcd: the host controller for this root hub\r
+ * @type: string describing our driver \r
+ * @data: return packet in UTF-16 LE\r
+ * @len: length of the return packet\r
+ *\r
+ * Produces either a manufacturer, product or serial number string for the\r
+ * virtual root hub device.\r
+ */\r
+static int rh_string (\r
+ int id,\r
+ struct usb_hcd *hcd,\r
+ u8 *data,\r
+ int len\r
+) {\r
+ char buf [100];\r
+\r
+ // language ids\r
+ if (id == 0) {\r
+ *data++ = 4; *data++ = 3; /* 4 bytes string data */\r
+ *data++ = 0x09; *data++ = 0x04; /* MSFT-speak for "en-us" */\r
+ return 4;\r
+\r
+ // serial number\r
+ } else if (id == 1) {\r
+ strcpy (buf, hcd->self.bus_name);\r
+\r
+ // product description\r
+ } else if (id == 2) {\r
+ strcpy (buf, hcd->product_desc);\r
+\r
+ // id 3 == vendor description\r
+ } else if (id == 3) {\r
+ sprintf (buf, "%s %s %s", UTS_SYSNAME, UTS_RELEASE,\r
+ hcd->description);\r
+\r
+ // unsupported IDs --> "protocol stall"\r
+ } else\r
+ return 0;\r
+\r
+ data [0] = 2 * (strlen (buf) + 1);\r
+ data [1] = 3; /* type == string */\r
+ return 2 + ascii2utf (buf, data + 2, len - 2);\r
+}\r
+\r
+\r
+/* Root hub control transfers execute synchronously */\r
+static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)\r
+{\r
+ struct usb_ctrlrequest *cmd = (struct usb_ctrlrequest *) urb->setup_packet;\r
+ u16 typeReq, wValue, wIndex, wLength;\r
+ const u8 *bufp = 0;\r
+ u8 *ubuf = urb->transfer_buffer;\r
+ int len = 0;\r
+ //unsigned long flags;\r
+\r
+ typeReq = (cmd->bRequestType << 8) | cmd->bRequest;\r
+ wValue = le16_to_cpu (cmd->wValue);\r
+ wIndex = le16_to_cpu (cmd->wIndex);\r
+ wLength = le16_to_cpu (cmd->wLength);\r
+\r
+ if (wLength > urb->transfer_buffer_length)\r
+ goto error;\r
+\r
+ /* set up for success */\r
+ urb->status = 0;\r
+ urb->actual_length = wLength;\r
+ switch (typeReq) {\r
+\r
+ /* DEVICE REQUESTS */\r
+\r
+ case DeviceRequest | USB_REQ_GET_STATUS:\r
+ // DEVICE_REMOTE_WAKEUP\r
+ ubuf [0] = 1; // selfpowered\r
+ ubuf [1] = 0;\r
+ /* FALLTHROUGH */\r
+ case DeviceOutRequest | USB_REQ_CLEAR_FEATURE:\r
+ case DeviceOutRequest | USB_REQ_SET_FEATURE:\r
+ dev_dbg (hcd->controller, "no device features yet yet\n");\r
+ break;\r
+ case DeviceRequest | USB_REQ_GET_CONFIGURATION:\r
+ ubuf [0] = 1;\r
+ /* FALLTHROUGH */\r
+ case DeviceOutRequest | USB_REQ_SET_CONFIGURATION:\r
+ break;\r
+ case DeviceRequest | USB_REQ_GET_DESCRIPTOR:\r
+ switch (wValue & 0xff00) {\r
+ case USB_DT_DEVICE << 8:\r
+ if (hcd->driver->flags & HCD_USB2)\r
+ bufp = usb2_rh_dev_descriptor;\r
+ else if (hcd->driver->flags & HCD_USB11)\r
+ bufp = usb11_rh_dev_descriptor;\r
+ else\r
+ goto error;\r
+ len = 18;\r
+ break;\r
+ case USB_DT_CONFIG << 8:\r
+ if (hcd->driver->flags & HCD_USB2) {\r
+ bufp = hs_rh_config_descriptor;\r
+ len = sizeof hs_rh_config_descriptor;\r
+ } else {\r
+ bufp = fs_rh_config_descriptor;\r
+ len = sizeof fs_rh_config_descriptor;\r
+ }\r
+ break;\r
+ case USB_DT_STRING << 8:\r
+ urb->actual_length = rh_string (\r
+ wValue & 0xff, hcd,\r
+ ubuf, wLength);\r
+ break;\r
+ default:\r
+ goto error;\r
+ }\r
+ break;\r
+ case DeviceRequest | USB_REQ_GET_INTERFACE:\r
+ ubuf [0] = 0;\r
+ /* FALLTHROUGH */\r
+ case DeviceOutRequest | USB_REQ_SET_INTERFACE:\r
+ break;\r
+ case DeviceOutRequest | USB_REQ_SET_ADDRESS:\r
+ // wValue == urb->dev->devaddr\r
+ dev_dbg (hcd->controller, "root hub device address %d\n",\r
+ wValue);\r
+ break;\r
+\r
+ /* INTERFACE REQUESTS (no defined feature/status flags) */\r
+\r
+ /* ENDPOINT REQUESTS */\r
+\r
+ case EndpointRequest | USB_REQ_GET_STATUS:\r
+ // ENDPOINT_HALT flag\r
+ ubuf [0] = 0;\r
+ ubuf [1] = 0;\r
+ /* FALLTHROUGH */\r
+ case EndpointOutRequest | USB_REQ_CLEAR_FEATURE:\r
+ case EndpointOutRequest | USB_REQ_SET_FEATURE:\r
+ dev_dbg (hcd->controller, "no endpoint features yet\n");\r
+ break;\r
+\r
+ /* CLASS REQUESTS (and errors) */\r
+\r
+ default:\r
+ /* non-generic request */\r
+ urb->status = hcd->driver->hub_control (hcd,\r
+ typeReq, wValue, wIndex,\r
+ ubuf, wLength);\r
+ break;\r
+error:\r
+ /* "protocol stall" on error */\r
+ urb->status = -EPIPE;\r
+ dev_dbg (hcd->controller, "unsupported hub control message (maxchild %d)\n",\r
+ urb->dev->maxchild);\r
+ }\r
+ if (urb->status) {\r
+ urb->actual_length = 0;\r
+ dev_dbg (hcd->controller, "CTRL: TypeReq=0x%x val=0x%x idx=0x%x len=%d ==> %d\n",\r
+ typeReq, wValue, wIndex, wLength, urb->status);\r
+ }\r
+ if (bufp) {\r
+ if (urb->transfer_buffer_length < len)\r
+ len = urb->transfer_buffer_length;\r
+ urb->actual_length = len;\r
+ // always USB_DIR_IN, toward host\r
+ memcpy (ubuf, bufp, len);\r
+ }\r
+\r
+ /* any errors get returned through the urb completion */\r
+ local_irq_save (flags);\r
+ usb_hcd_giveback_urb (hcd, urb, NULL);\r
+ local_irq_restore (flags);\r
+ return 0;\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/*\r
+ * Root Hub interrupt transfers are synthesized with a timer.\r
+ * Completions are called in_interrupt() but not in_irq().\r
+ */\r
+\r
+static void rh_report_status (unsigned long ptr);\r
+\r
+static int rh_status_urb (struct usb_hcd *hcd, struct urb *urb) \r
+{\r
+ int len = 1 + (urb->dev->maxchild / 8);\r
+\r
+ /* rh_timer protected by hcd_data_lock */\r
+ if (hcd->rh_timer.data\r
+ || urb->status != -EINPROGRESS\r
+ || urb->transfer_buffer_length < len) {\r
+ dev_dbg (hcd->controller,\r
+ "not queuing rh status urb, stat %d\n",\r
+ urb->status);\r
+ return -EINVAL;\r
+ }\r
+\r
+ init_timer (&hcd->rh_timer);\r
+\r
+ hcd->rh_timer.function = rh_report_status;\r
+ hcd->rh_timer.data = (unsigned long) urb;\r
+ /* USB 2.0 spec says 256msec; this is close enough */\r
+ hcd->rh_timer.expires = jiffies + HZ/4;\r
+ add_timer (&hcd->rh_timer);\r
+ urb->hcpriv = hcd; /* nonzero to indicate it's queued */\r
+ return 0;\r
+}\r
+\r
+/* timer callback */\r
+\r
+static void rh_report_status (unsigned long ptr)\r
+{\r
+ struct urb *urb;\r
+ struct usb_hcd *hcd;\r
+ int length;\r
+ //unsigned long flags;\r
+\r
+ urb = (struct urb *) ptr;\r
+ local_irq_save (flags);\r
+ spin_lock (&urb->lock);\r
+\r
+ /* do nothing if the hc is gone or the urb's been unlinked */\r
+ if (!urb->dev\r
+ || urb->status != -EINPROGRESS\r
+ || (hcd = urb->dev->bus->hcpriv) == 0\r
+ || !HCD_IS_RUNNING (hcd->state)) {\r
+ spin_unlock (&urb->lock);\r
+ local_irq_restore (flags);\r
+ return;\r
+ }\r
+\r
+ length = hcd->driver->hub_status_data (hcd, urb->transfer_buffer);\r
+\r
+ /* complete the status urb, or retrigger the timer */\r
+ spin_lock (&hcd_data_lock);\r
+ if (length > 0) {\r
+ hcd->rh_timer.data = 0;\r
+ urb->actual_length = length;\r
+ urb->status = 0;\r
+ urb->hcpriv = 0;\r
+ } else\r
+ mod_timer (&hcd->rh_timer, jiffies + HZ/4);\r
+ spin_unlock (&hcd_data_lock);\r
+ spin_unlock (&urb->lock);\r
+\r
+ /* local irqs are always blocked in completions */\r
+ if (length > 0)\r
+ usb_hcd_giveback_urb (hcd, urb, NULL);\r
+ local_irq_restore (flags);\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+static int rh_urb_enqueue (struct usb_hcd *hcd, struct urb *urb)\r
+{\r
+ if (usb_pipeint (urb->pipe)) {\r
+ int retval;\r
+ unsigned long flags;\r
+\r
+ spin_lock_irqsave (&hcd_data_lock, flags);\r
+ retval = rh_status_urb (hcd, urb);\r
+ spin_unlock_irqrestore (&hcd_data_lock, flags);\r
+ return retval;\r
+ }\r
+ if (usb_pipecontrol (urb->pipe))\r
+ return rh_call_control (hcd, urb);\r
+ else\r
+ return -EINVAL;\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+void usb_rh_status_dequeue (struct usb_hcd *hcd, struct urb *urb)\r
+{\r
+ //unsigned long flags;\r
+\r
+ /* note: always a synchronous unlink */\r
+ del_timer_sync (&hcd->rh_timer);\r
+ hcd->rh_timer.data = 0;\r
+\r
+ local_irq_save (flags);\r
+ urb->hcpriv = 0;\r
+ usb_hcd_giveback_urb (hcd, urb, NULL);\r
+ local_irq_restore (flags);\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* exported only within usbcore */\r
+void usb_bus_get (struct usb_bus *bus)\r
+{\r
+ atomic_inc (&bus->refcnt);\r
+}\r
+\r
+/* exported only within usbcore */\r
+void usb_bus_put (struct usb_bus *bus)\r
+{\r
+ if (atomic_dec_and_test (&bus->refcnt))\r
+ kfree (bus);\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/**\r
+ * usb_bus_init - shared initialization code\r
+ * @bus: the bus structure being initialized\r
+ *\r
+ * This code is used to initialize a usb_bus structure, memory for which is\r
+ * separately managed.\r
+ */\r
+void STDCALL usb_bus_init (struct usb_bus *bus)\r
+{\r
+ memset (&bus->devmap, 0, sizeof(struct usb_devmap));\r
+\r
+ bus->devnum_next = 1;\r
+\r
+ bus->root_hub = NULL;\r
+ bus->hcpriv = NULL;\r
+ bus->busnum = -1;\r
+ bus->bandwidth_allocated = 0;\r
+ bus->bandwidth_int_reqs = 0;\r
+ bus->bandwidth_isoc_reqs = 0;\r
+\r
+ INIT_LIST_HEAD (&bus->bus_list);\r
+\r
+ atomic_set (&bus->refcnt, 1);\r
+}\r
+\r
+/**\r
+ * usb_alloc_bus - creates a new USB host controller structure\r
+ * @op: pointer to a struct usb_operations that this bus structure should use\r
+ * Context: !in_interrupt()\r
+ *\r
+ * Creates a USB host controller bus structure with the specified \r
+ * usb_operations and initializes all the necessary internal objects.\r
+ *\r
+ * If no memory is available, NULL is returned.\r
+ *\r
+ * The caller should call usb_free_bus() when it is finished with the structure.\r
+ */\r
+struct usb_bus STDCALL *usb_alloc_bus (struct usb_operations *op)\r
+{\r
+ struct usb_bus *bus;\r
+\r
+ bus = kmalloc (sizeof *bus, GFP_KERNEL);\r
+ if (!bus)\r
+ return NULL;\r
+ usb_bus_init (bus);\r
+ bus->op = op;\r
+ return bus;\r
+}\r
+\r
+/**\r
+ * usb_free_bus - frees the memory used by a bus structure\r
+ * @bus: pointer to the bus to free\r
+ *\r
+ * To be invoked by a HCD, only as the last step of decoupling from\r
+ * hardware. It is an error to call this if the reference count is\r
+ * anything but one. That would indicate that some system component\r
+ * did not correctly shut down, and thought the hardware was still\r
+ * accessible.\r
+ */\r
+void STDCALL usb_free_bus (struct usb_bus *bus)\r
+{\r
+ if (!bus)\r
+ return;\r
+ if (atomic_read (&bus->refcnt) != 1)\r
+ err ("usb_free_bus #%d, count != 1", bus->busnum);\r
+ usb_bus_put (bus);\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/**\r
+ * usb_register_bus - registers the USB host controller with the usb core\r
+ * @bus: pointer to the bus to register\r
+ * Context: !in_interrupt()\r
+ *\r
+ * Assigns a bus number, and links the controller into usbcore data\r
+ * structures so that it can be seen by scanning the bus list.\r
+ */\r
+void STDCALL usb_register_bus(struct usb_bus *bus)\r
+{\r
+ int busnum;\r
+\r
+ down (&usb_bus_list_lock);\r
+ busnum = find_next_zero_bit (busmap.busmap, USB_MAXBUS, 1);\r
+ if (busnum < USB_MAXBUS) {\r
+ set_bit (busnum, busmap.busmap);\r
+ bus->busnum = busnum;\r
+ } else\r
+ warn ("too many buses");\r
+\r
+ usb_bus_get (bus);\r
+\r
+ /* Add it to the list of buses */\r
+ list_add (&bus->bus_list, &usb_bus_list);\r
+ up (&usb_bus_list_lock);\r
+\r
+ usbfs_add_bus (bus);\r
+\r
+ dev_info (bus->controller, "new USB bus registered, assigned bus number %d\n", bus->busnum);\r
+}\r
+\r
+/**\r
+ * usb_deregister_bus - deregisters the USB host controller\r
+ * @bus: pointer to the bus to deregister\r
+ * Context: !in_interrupt()\r
+ *\r
+ * Recycles the bus number, and unlinks the controller from usbcore data\r
+ * structures so that it won't be seen by scanning the bus list.\r
+ */\r
+void STDCALL usb_deregister_bus (struct usb_bus *bus)\r
+{\r
+ dev_info (bus->controller, "USB bus %d deregistered\n", bus->busnum);\r
+\r
+ /*\r
+ * NOTE: make sure that all the devices are removed by the\r
+ * controller code, as well as having it call this when cleaning\r
+ * itself up\r
+ */\r
+ down (&usb_bus_list_lock);\r
+ list_del (&bus->bus_list);\r
+ up (&usb_bus_list_lock);\r
+\r
+ usbfs_remove_bus (bus);\r
+\r
+ clear_bit (bus->busnum, busmap.busmap);\r
+\r
+ usb_bus_put (bus);\r
+}\r
+\r
+/**\r
+ * usb_register_root_hub - called by HCD to register its root hub \r
+ * @usb_dev: the usb root hub device to be registered.\r
+ * @parent_dev: the parent device of this root hub.\r
+ *\r
+ * The USB host controller calls this function to register the root hub\r
+ * properly with the USB subsystem. It sets up the device properly in\r
+ * the driverfs tree, and then calls usb_new_device() to register the\r
+ * usb device.\r
+ */\r
+int STDCALL usb_register_root_hub (struct usb_device *usb_dev, struct device *parent_dev)\r
+{\r
+ int retval;\r
+\r
+ sprintf (&usb_dev->dev.bus_id[0], "usb%d", usb_dev->bus->busnum);\r
+ usb_dev->state = USB_STATE_DEFAULT;\r
+ retval = usb_new_device (usb_dev, parent_dev);\r
+ if (retval)\r
+ dev_err (parent_dev, "can't register root hub for %s, %d\n",\r
+ usb_dev->dev.bus_id, retval);\r
+ return retval;\r
+}\r
+\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/**\r
+ * usb_calc_bus_time - approximate periodic transaction time in nanoseconds\r
+ * @speed: from dev->speed; USB_SPEED_{LOW,FULL,HIGH}\r
+ * @is_input: true iff the transaction sends data to the host\r
+ * @isoc: true for isochronous transactions, false for interrupt ones\r
+ * @bytecount: how many bytes in the transaction.\r
+ *\r
+ * Returns approximate bus time in nanoseconds for a periodic transaction.\r
+ * See USB 2.0 spec section 5.11.3; only periodic transfers need to be\r
+ * scheduled in software, this function is only used for such scheduling.\r
+ */\r
+long STDCALL usb_calc_bus_time (int speed, int is_input, int isoc, int bytecount)\r
+{\r
+ unsigned long tmp;\r
+\r
+ switch (speed) {\r
+ case USB_SPEED_LOW: /* INTR only */\r
+ if (is_input) {\r
+ tmp = (67667L * (31L + 10L * BitTime (bytecount))) / 1000L;\r
+ return (64060L + (2 * BW_HUB_LS_SETUP) + BW_HOST_DELAY + tmp);\r
+ } else {\r
+ tmp = (66700L * (31L + 10L * BitTime (bytecount))) / 1000L;\r
+ return (64107L + (2 * BW_HUB_LS_SETUP) + BW_HOST_DELAY + tmp);\r
+ }\r
+ case USB_SPEED_FULL: /* ISOC or INTR */\r
+ if (isoc) {\r
+ tmp = (8354L * (31L + 10L * BitTime (bytecount))) / 1000L;\r
+ return (((is_input) ? 7268L : 6265L) + BW_HOST_DELAY + tmp);\r
+ } else {\r
+ tmp = (8354L * (31L + 10L * BitTime (bytecount))) / 1000L;\r
+ return (9107L + BW_HOST_DELAY + tmp);\r
+ }\r
+ case USB_SPEED_HIGH: /* ISOC or INTR */\r
+ // FIXME adjust for input vs output\r
+ if (isoc)\r
+ tmp = HS_USECS (bytecount);\r
+ else\r
+ tmp = HS_USECS_ISO (bytecount);\r
+ return tmp;\r
+ default:\r
+ dbg ("bogus device speed!");\r
+ return -1;\r
+ }\r
+}\r
+\r
+/*\r
+ * usb_check_bandwidth():\r
+ *\r
+ * old_alloc is from host_controller->bandwidth_allocated in microseconds;\r
+ * bustime is from calc_bus_time(), but converted to microseconds.\r
+ *\r
+ * returns <bustime in us> if successful,\r
+ * or -ENOSPC if bandwidth request fails.\r
+ *\r
+ * FIXME:\r
+ * This initial implementation does not use Endpoint.bInterval\r
+ * in managing bandwidth allocation.\r
+ * It probably needs to be expanded to use Endpoint.bInterval.\r
+ * This can be done as a later enhancement (correction).\r
+ *\r
+ * This will also probably require some kind of\r
+ * frame allocation tracking...meaning, for example,\r
+ * that if multiple drivers request interrupts every 10 USB frames,\r
+ * they don't all have to be allocated at\r
+ * frame numbers N, N+10, N+20, etc. Some of them could be at\r
+ * N+11, N+21, N+31, etc., and others at\r
+ * N+12, N+22, N+32, etc.\r
+ *\r
+ * Similarly for isochronous transfers...\r
+ *\r
+ * Individual HCDs can schedule more directly ... this logic\r
+ * is not correct for high speed transfers.\r
+ */\r
+int STDCALL usb_check_bandwidth (struct usb_device *dev, struct urb *urb)\r
+{\r
+ unsigned int pipe = urb->pipe;\r
+ long bustime;\r
+ int is_in = usb_pipein (pipe);\r
+ int is_iso = usb_pipeisoc (pipe);\r
+ int old_alloc = dev->bus->bandwidth_allocated;\r
+ int new_alloc;\r
+\r
+\r
+ bustime = NS_TO_US (usb_calc_bus_time (dev->speed, is_in, is_iso,\r
+ usb_maxpacket (dev, pipe, !is_in)));\r
+ if (is_iso)\r
+ bustime /= urb->number_of_packets;\r
+\r
+ new_alloc = old_alloc + (int) bustime;\r
+ if (new_alloc > FRAME_TIME_MAX_USECS_ALLOC) {\r
+#ifdef DEBUG\r
+ char *mode = \r
+#ifdef CONFIG_USB_BANDWIDTH\r
+ "";\r
+#else\r
+ "would have ";\r
+#endif\r
+ dev_dbg (&dev->dev, "usb_check_bandwidth %sFAILED: %d + %ld = %d usec\n",\r
+ mode, old_alloc, bustime, new_alloc);\r
+#endif\r
+#ifdef CONFIG_USB_BANDWIDTH\r
+ bustime = -ENOSPC; /* report error */\r
+#endif\r
+ }\r
+\r
+ return bustime;\r
+}\r
+\r
+\r
+/**\r
+ * usb_claim_bandwidth - records bandwidth for a periodic transfer\r
+ * @dev: source/target of request\r
+ * @urb: request (urb->dev == dev)\r
+ * @bustime: bandwidth consumed, in (average) microseconds per frame\r
+ * @isoc: true iff the request is isochronous\r
+ *\r
+ * Bus bandwidth reservations are recorded purely for diagnostic purposes.\r
+ * HCDs are expected not to overcommit periodic bandwidth, and to record such\r
+ * reservations whenever endpoints are added to the periodic schedule.\r
+ *\r
+ * FIXME averaging per-frame is suboptimal. Better to sum over the HCD's\r
+ * entire periodic schedule ... 32 frames for OHCI, 1024 for UHCI, settable\r
+ * for EHCI (256/512/1024 frames, default 1024) and have the bus expose how\r
+ * large its periodic schedule is.\r
+ */\r
+void STDCALL usb_claim_bandwidth (struct usb_device *dev, struct urb *urb, int bustime, int isoc)\r
+{\r
+ dev->bus->bandwidth_allocated += bustime;\r
+ if (isoc)\r
+ dev->bus->bandwidth_isoc_reqs++;\r
+ else\r
+ dev->bus->bandwidth_int_reqs++;\r
+ urb->bandwidth = bustime;\r
+\r
+#ifdef USB_BANDWIDTH_MESSAGES\r
+ dev_dbg (&dev->dev, "bandwidth alloc increased by %d (%s) to %d for %d requesters\n",\r
+ bustime,\r
+ isoc ? "ISOC" : "INTR",\r
+ dev->bus->bandwidth_allocated,\r
+ dev->bus->bandwidth_int_reqs + dev->bus->bandwidth_isoc_reqs);\r
+#endif\r
+}\r
+\r
+\r
+/**\r
+ * usb_release_bandwidth - reverses effect of usb_claim_bandwidth()\r
+ * @dev: source/target of request\r
+ * @urb: request (urb->dev == dev)\r
+ * @isoc: true iff the request is isochronous\r
+ *\r
+ * This records that previously allocated bandwidth has been released.\r
+ * Bandwidth is released when endpoints are removed from the host controller's\r
+ * periodic schedule.\r
+ */\r
+void STDCALL usb_release_bandwidth (struct usb_device *dev, struct urb *urb, int isoc)\r
+{\r
+ dev->bus->bandwidth_allocated -= urb->bandwidth;\r
+ if (isoc)\r
+ dev->bus->bandwidth_isoc_reqs--;\r
+ else\r
+ dev->bus->bandwidth_int_reqs--;\r
+\r
+#ifdef USB_BANDWIDTH_MESSAGES\r
+ dev_dbg (&dev->dev, "bandwidth alloc reduced by %d (%s) to %d for %d requesters\n",\r
+ urb->bandwidth,\r
+ isoc ? "ISOC" : "INTR",\r
+ dev->bus->bandwidth_allocated,\r
+ dev->bus->bandwidth_int_reqs + dev->bus->bandwidth_isoc_reqs);\r
+#endif\r
+ urb->bandwidth = 0;\r
+}\r
+\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/*\r
+ * Generic HC operations.\r
+ */\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* called from khubd, or root hub init threads for hcd-private init */\r
+static int hcd_alloc_dev (struct usb_device *udev)\r
+{\r
+ struct hcd_dev *dev;\r
+ struct usb_hcd *hcd;\r
+ unsigned long flags;\r
+\r
+ if (!udev || udev->hcpriv)\r
+ return -EINVAL;\r
+ if (!udev->bus || !udev->bus->hcpriv)\r
+ return -ENODEV;\r
+ hcd = udev->bus->hcpriv;\r
+ if (hcd->state == USB_STATE_QUIESCING)\r
+ return -ENOLINK;\r
+\r
+ dev = (struct hcd_dev *) kmalloc (sizeof *dev, GFP_KERNEL);\r
+ if (dev == NULL)\r
+ return -ENOMEM;\r
+ memset (dev, 0, sizeof *dev);\r
+\r
+ INIT_LIST_HEAD (&dev->dev_list);\r
+ INIT_LIST_HEAD (&dev->urb_list);\r
+\r
+ spin_lock_irqsave (&hcd_data_lock, flags);\r
+ list_add (&dev->dev_list, &hcd->dev_list);\r
+ // refcount is implicit\r
+ udev->hcpriv = dev;\r
+ spin_unlock_irqrestore (&hcd_data_lock, flags);\r
+\r
+ return 0;\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+static void urb_unlink (struct urb *urb)\r
+{\r
+ unsigned long flags;\r
+ struct usb_device *dev;\r
+\r
+ /* Release any periodic transfer bandwidth */\r
+ if (urb->bandwidth)\r
+ usb_release_bandwidth (urb->dev, urb,\r
+ usb_pipeisoc (urb->pipe));\r
+\r
+ /* clear all state linking urb to this dev (and hcd) */\r
+\r
+ spin_lock_irqsave (&hcd_data_lock, flags);\r
+ list_del_init (&urb->urb_list);\r
+ dev = urb->dev;\r
+ spin_unlock_irqrestore (&hcd_data_lock, flags);\r
+ usb_put_dev (dev);\r
+}\r
+\r
+\r
+/* may be called in any context with a valid urb->dev usecount\r
+ * caller surrenders "ownership" of urb\r
+ * expects usb_submit_urb() to have sanity checked and conditioned all\r
+ * inputs in the urb\r
+ */\r
+static int hcd_submit_urb (struct urb *urb, int mem_flags)\r
+{\r
+ int status;\r
+ struct usb_hcd *hcd = urb->dev->bus->hcpriv;\r
+ struct hcd_dev *dev = urb->dev->hcpriv;\r
+ unsigned long flags;\r
+ \r
+\r
+ if (!hcd || !dev)\r
+ return -ENODEV;\r
+// printk("submit_urb %p, # %i, t %i\n",urb,urb->dev->devnum,usb_pipetype(urb->pipe));\r
+ /*\r
+ * FIXME: make urb timeouts be generic, keeping the HCD cores\r
+ * as simple as possible.\r
+ */\r
+\r
+ // NOTE: a generic device/urb monitoring hook would go here.\r
+ // hcd_monitor_hook(MONITOR_URB_SUBMIT, urb)\r
+ // It would catch submission paths for all urbs.\r
+\r
+ /*\r
+ * Atomically queue the urb, first to our records, then to the HCD.\r
+ * Access to urb->status is controlled by urb->lock ... changes on\r
+ * i/o completion (normal or fault) or unlinking.\r
+ */\r
+\r
+ // FIXME: verify that quiescing hc works right (RH cleans up)\r
+\r
+ spin_lock_irqsave (&hcd_data_lock, flags);\r
+ if (HCD_IS_RUNNING (hcd->state) && hcd->state != USB_STATE_QUIESCING) {\r
+ usb_get_dev (urb->dev);\r
+ list_add_tail (&urb->urb_list, &dev->urb_list);\r
+ status = 0;\r
+ } else {\r
+ INIT_LIST_HEAD (&urb->urb_list);\r
+ status = -ESHUTDOWN;\r
+ }\r
+ spin_unlock_irqrestore (&hcd_data_lock, flags);\r
+ if (status)\r
+ return status;\r
+\r
+ /* increment urb's reference count as part of giving it to the HCD\r
+ * (which now controls it). HCD guarantees that it either returns\r
+ * an error or calls giveback(), but not both.\r
+ */\r
+\r
+ urb = usb_get_urb (urb);\r
+ if (urb->dev == hcd->self.root_hub) {\r
+ /* NOTE: requirement on hub callers (usbfs and the hub\r
+ * driver, for now) that URBs' urb->transfer_buffer be\r
+ * valid and usb_buffer_{sync,unmap}() not be needed, since\r
+ * they could clobber root hub response data.\r
+ */\r
+ urb->transfer_flags |= URB_NO_DMA_MAP;\r
+ status = rh_urb_enqueue (hcd, urb);\r
+ goto done;\r
+ }\r
+\r
+ /* lower level hcd code should use *_dma exclusively,\r
+ * unless it uses pio or talks to another transport.\r
+ */\r
+ if (!(urb->transfer_flags & URB_NO_DMA_MAP)\r
+ && hcd->controller->dma_mask) {\r
+ if (usb_pipecontrol (urb->pipe))\r
+ urb->setup_dma = dma_map_single (\r
+ hcd->controller,\r
+ urb->setup_packet,\r
+ sizeof (struct usb_ctrlrequest),\r
+ DMA_TO_DEVICE);\r
+ if (urb->transfer_buffer_length != 0)\r
+ urb->transfer_dma = dma_map_single (\r
+ hcd->controller,\r
+ urb->transfer_buffer,\r
+ urb->transfer_buffer_length,\r
+ usb_pipein (urb->pipe)\r
+ ? DMA_FROM_DEVICE\r
+ : DMA_TO_DEVICE);\r
+ }\r
+\r
+ status = hcd->driver->urb_enqueue (hcd, urb, mem_flags);\r
+done:\r
+ if (status) {\r
+ usb_put_urb (urb);\r
+ urb_unlink (urb);\r
+ }\r
+ return status;\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* called in any context */\r
+static int hcd_get_frame_number (struct usb_device *udev)\r
+{\r
+ struct usb_hcd *hcd = (struct usb_hcd *)udev->bus->hcpriv;\r
+ return hcd->driver->get_frame_number (hcd);\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* this makes the hcd giveback() the urb more quickly, by kicking it\r
+ * off hardware queues (which may take a while) and returning it as\r
+ * soon as practical. we've already set up the urb's return status,\r
+ * but we can't know if the callback completed already.\r
+ */\r
+static void\r
+unlink1 (struct usb_hcd *hcd, struct urb *urb)\r
+{\r
+ if (urb == (struct urb *) hcd->rh_timer.data)\r
+ usb_rh_status_dequeue (hcd, urb);\r
+ else {\r
+ int value;\r
+\r
+ /* failures "should" be harmless */\r
+ value = hcd->driver->urb_dequeue (hcd, urb);\r
+ if (value != 0)\r
+ dev_dbg (hcd->controller,\r
+ "dequeue %p --> %d\n",\r
+ urb, value);\r
+ }\r
+}\r
+\r
+struct completion_splice { // modified urb context:\r
+ /* did we complete? */\r
+ struct completion done;\r
+\r
+ /* original urb data */\r
+ usb_complete_t complete;\r
+ void *context;\r
+};\r
+\r
+static void unlink_complete (struct urb *urb, struct pt_regs *regs)\r
+{\r
+ struct completion_splice *splice;\r
+\r
+ splice = (struct completion_splice *) urb->context;\r
+\r
+ /* issue original completion call */\r
+ urb->complete = splice->complete;\r
+ urb->context = splice->context;\r
+ urb->complete (urb, regs);\r
+\r
+ /* then let the synchronous unlink call complete */\r
+ complete (&splice->done);\r
+}\r
+\r
+/*\r
+ * called in any context; note ASYNC_UNLINK restrictions\r
+ *\r
+ * caller guarantees urb won't be recycled till both unlink()\r
+ * and the urb's completion function return\r
+ */\r
+static int hcd_unlink_urb (struct urb *urb)\r
+{\r
+ struct hcd_dev *dev;\r
+ struct usb_hcd *hcd = 0;\r
+ struct device *sys = 0;\r
+ unsigned long flags;\r
+ struct completion_splice splice;\r
+ int retval;\r
+\r
+ if (!urb)\r
+ return -EINVAL;\r
+\r
+ /*\r
+ * we contend for urb->status with the hcd core,\r
+ * which changes it while returning the urb.\r
+ *\r
+ * Caller guaranteed that the urb pointer hasn't been freed, and\r
+ * that it was submitted. But as a rule it can't know whether or\r
+ * not it's already been unlinked ... so we respect the reversed\r
+ * lock sequence needed for the usb_hcd_giveback_urb() code paths\r
+ * (urb lock, then hcd_data_lock) in case some other CPU is now\r
+ * unlinking it.\r
+ */\r
+ spin_lock_irqsave (&urb->lock, flags);\r
+ spin_lock (&hcd_data_lock);\r
+\r
+ if (!urb->dev || !urb->dev->bus) {\r
+ retval = -ENODEV;\r
+ goto done;\r
+ }\r
+\r
+ dev = urb->dev->hcpriv;\r
+ sys = &urb->dev->dev;\r
+ hcd = urb->dev->bus->hcpriv;\r
+ if (!dev || !hcd) {\r
+ retval = -ENODEV;\r
+ goto done;\r
+ }\r
+\r
+ if (!urb->hcpriv) {\r
+ retval = -EINVAL;\r
+ goto done;\r
+ }\r
+\r
+ /* Any status except -EINPROGRESS means something already started to\r
+ * unlink this URB from the hardware. So there's no more work to do.\r
+ *\r
+ * FIXME use better explicit urb state\r
+ */\r
+ if (urb->status != -EINPROGRESS) {\r
+ retval = -EBUSY;\r
+ goto done;\r
+ }\r
+\r
+ /* maybe set up to block until the urb's completion fires. the\r
+ * lower level hcd code is always async, locking on urb->status\r
+ * updates; an intercepted completion unblocks us.\r
+ */\r
+ if (!(urb->transfer_flags & URB_ASYNC_UNLINK)) {\r
+ if (in_interrupt ()) {\r
+ dev_dbg (hcd->controller, "non-async unlink in_interrupt");\r
+ retval = -EWOULDBLOCK;\r
+ goto done;\r
+ }\r
+ /* synchronous unlink: block till we see the completion */\r
+ init_completion (&splice.done);\r
+ splice.complete = urb->complete;\r
+ splice.context = urb->context;\r
+ urb->complete = unlink_complete;\r
+ urb->context = &splice;\r
+ urb->status = -ENOENT;\r
+ } else {\r
+ /* asynchronous unlink */\r
+ urb->status = -ECONNRESET;\r
+ }\r
+ spin_unlock (&hcd_data_lock);\r
+ spin_unlock_irqrestore (&urb->lock, flags);\r
+\r
+ // FIXME remove splicing, so this becomes unlink1 (hcd, urb);\r
+ if (urb == (struct urb *) hcd->rh_timer.data) {\r
+ usb_rh_status_dequeue (hcd, urb);\r
+ retval = 0;\r
+ } else {\r
+ retval = hcd->driver->urb_dequeue (hcd, urb);\r
+\r
+ /* hcds shouldn't really fail these calls, but... */\r
+ if (retval) {\r
+ dev_dbg (sys, "dequeue %p --> %d\n", urb, retval);\r
+ if (!(urb->transfer_flags & URB_ASYNC_UNLINK)) {\r
+ spin_lock_irqsave (&urb->lock, flags);\r
+ urb->complete = splice.complete;\r
+ urb->context = splice.context;\r
+ spin_unlock_irqrestore (&urb->lock, flags);\r
+ }\r
+ goto bye;\r
+ }\r
+ }\r
+\r
+ /* block till giveback, if needed */\r
+ if (urb->transfer_flags & URB_ASYNC_UNLINK)\r
+ return -EINPROGRESS;\r
+\r
+ wait_for_completion (&splice.done);\r
+ return 0;\r
+\r
+done:\r
+ spin_unlock (&hcd_data_lock);\r
+ spin_unlock_irqrestore (&urb->lock, flags);\r
+bye:\r
+ if (retval && sys && sys->driver)\r
+ dev_dbg (sys, "hcd_unlink_urb %p fail %d\n", urb, retval);\r
+ return retval;\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* disables the endpoint: cancels any pending urbs, then synchronizes with\r
+ * the hcd to make sure all endpoint state is gone from hardware. use for\r
+ * set_configuration, set_interface, driver removal, physical disconnect.\r
+ *\r
+ * example: a qh stored in hcd_dev.ep[], holding state related to endpoint\r
+ * type, maxpacket size, toggle, halt status, and scheduling.\r
+ */\r
+static void hcd_endpoint_disable (struct usb_device *udev, int endpoint)\r
+{\r
+ unsigned long flags;\r
+ struct hcd_dev *dev;\r
+ struct usb_hcd *hcd;\r
+ struct urb *urb;\r
+ unsigned epnum = endpoint & USB_ENDPOINT_NUMBER_MASK;\r
+\r
+ dev = udev->hcpriv;\r
+ hcd = udev->bus->hcpriv;\r
+\r
+rescan:\r
+ /* (re)block new requests, as best we can */\r
+ if (endpoint & USB_DIR_IN) {\r
+ usb_endpoint_halt (udev, epnum, 0);\r
+ udev->epmaxpacketin [epnum] = 0;\r
+ } else {\r
+ usb_endpoint_halt (udev, epnum, 1);\r
+ udev->epmaxpacketout [epnum] = 0;\r
+ }\r
+\r
+ /* then kill any current requests */\r
+ spin_lock_irqsave (&hcd_data_lock, flags);\r
+ list_for_each_entry (urb, &dev->urb_list, urb_list) {\r
+ int tmp = urb->pipe;\r
+\r
+ /* ignore urbs for other endpoints */\r
+ if (usb_pipeendpoint (tmp) != epnum)\r
+ continue;\r
+ if ((tmp ^ endpoint) & USB_DIR_IN)\r
+ continue;\r
+\r
+ /* another cpu may be in hcd, spinning on hcd_data_lock\r
+ * to giveback() this urb. the races here should be\r
+ * small, but a full fix needs a new "can't submit"\r
+ * urb state.\r
+ */\r
+ if (urb->status != -EINPROGRESS)\r
+ continue;\r
+ usb_get_urb (urb);\r
+ spin_unlock_irqrestore (&hcd_data_lock, flags);\r
+\r
+ spin_lock_irqsave (&urb->lock, flags);\r
+ tmp = urb->status;\r
+ if (tmp == -EINPROGRESS)\r
+ urb->status = -ESHUTDOWN;\r
+ spin_unlock_irqrestore (&urb->lock, flags);\r
+\r
+ /* kick hcd unless it's already returning this */\r
+ if (tmp == -EINPROGRESS) {\r
+ tmp = urb->pipe;\r
+ unlink1 (hcd, urb);\r
+ dev_dbg (hcd->controller,\r
+ "shutdown urb %p pipe %08x ep%d%s%s\n",\r
+ urb, tmp, usb_pipeendpoint (tmp),\r
+ (tmp & USB_DIR_IN) ? "in" : "out",\r
+ ({ char *s; \\r
+ switch (usb_pipetype (tmp)) { \\r
+ case PIPE_CONTROL: s = ""; break; \\r
+ case PIPE_BULK: s = "-bulk"; break; \\r
+ case PIPE_INTERRUPT: s = "-intr"; break; \\r
+ default: s = "-iso"; break; \\r
+ }; s;}));\r
+ }\r
+ usb_put_urb (urb);\r
+\r
+ /* list contents may have changed */\r
+ goto rescan;\r
+ }\r
+ spin_unlock_irqrestore (&hcd_data_lock, flags);\r
+\r
+ /* synchronize with the hardware, so old configuration state\r
+ * clears out immediately (and will be freed).\r
+ */\r
+ might_sleep ();\r
+ if (hcd->driver->endpoint_disable)\r
+ hcd->driver->endpoint_disable (hcd, dev, endpoint);\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* called by khubd, rmmod, apmd, or other thread for hcd-private cleanup.\r
+ * we're guaranteed that the device is fully quiesced. also, that each\r
+ * endpoint has been hcd_endpoint_disabled.\r
+ */\r
+\r
+static int hcd_free_dev (struct usb_device *udev)\r
+{\r
+ struct hcd_dev *dev;\r
+ struct usb_hcd *hcd;\r
+ unsigned long flags;\r
+\r
+ if (!udev || !udev->hcpriv)\r
+ return -EINVAL;\r
+\r
+ if (!udev->bus || !udev->bus->hcpriv)\r
+ return -ENODEV;\r
+\r
+ // should udev->devnum == -1 ??\r
+\r
+ dev = udev->hcpriv;\r
+ hcd = udev->bus->hcpriv;\r
+\r
+ /* device driver problem with refcounts? */\r
+ if (!list_empty (&dev->urb_list)) {\r
+ dev_dbg (hcd->controller, "free busy dev, %s devnum %d (bug!)\n",\r
+ hcd->self.bus_name, udev->devnum);\r
+ return -EINVAL;\r
+ }\r
+\r
+ spin_lock_irqsave (&hcd_data_lock, flags);\r
+ list_del (&dev->dev_list);\r
+ udev->hcpriv = NULL;\r
+ spin_unlock_irqrestore (&hcd_data_lock, flags);\r
+\r
+ kfree (dev);\r
+ return 0;\r
+}\r
+\r
+/*\r
+ * usb_hcd_operations - adapts usb_bus framework to HCD framework (bus glue)\r
+ *\r
+ * When registering a USB bus through the HCD framework code, use this\r
+ * usb_operations vector. The PCI glue layer does so automatically; only\r
+ * bus glue for non-PCI system busses will need to use this.\r
+ */\r
+struct usb_operations usb_hcd_operations = {\r
+ .allocate = hcd_alloc_dev,\r
+ .get_frame_number = hcd_get_frame_number,\r
+ .submit_urb = hcd_submit_urb,\r
+ .unlink_urb = hcd_unlink_urb,\r
+ .deallocate = hcd_free_dev,\r
+ .buffer_alloc = hcd_buffer_alloc,\r
+ .buffer_free = hcd_buffer_free,\r
+ .disable = hcd_endpoint_disable,\r
+};\r
+EXPORT_SYMBOL (usb_hcd_operations);\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/**\r
+ * usb_hcd_giveback_urb - return URB from HCD to device driver\r
+ * @hcd: host controller returning the URB\r
+ * @urb: urb being returned to the USB device driver.\r
+ * @regs: pt_regs, passed down to the URB completion handler\r
+ * Context: in_interrupt()\r
+ *\r
+ * This hands the URB from HCD to its USB device driver, using its\r
+ * completion function. The HCD has freed all per-urb resources\r
+ * (and is done using urb->hcpriv). It also released all HCD locks;\r
+ * the device driver won't cause problems if it frees, modifies,\r
+ * or resubmits this URB.\r
+ */\r
+void STDCALL usb_hcd_giveback_urb (struct usb_hcd *hcd, struct urb *urb, struct pt_regs *regs)\r
+{\r
+ urb_unlink (urb);\r
+\r
+ // NOTE: a generic device/urb monitoring hook would go here.\r
+ // hcd_monitor_hook(MONITOR_URB_FINISH, urb, dev)\r
+ // It would catch exit/unlink paths for all urbs.\r
+\r
+ /* lower level hcd code should use *_dma exclusively */\r
+ if (!(urb->transfer_flags & URB_NO_DMA_MAP)) {\r
+ if (usb_pipecontrol (urb->pipe))\r
+ pci_unmap_single (hcd->pdev, urb->setup_dma,\r
+ sizeof (struct usb_ctrlrequest),\r
+ PCI_DMA_TODEVICE);\r
+ if (urb->transfer_buffer_length != 0)\r
+ pci_unmap_single (hcd->pdev, urb->transfer_dma,\r
+ urb->transfer_buffer_length,\r
+ usb_pipein (urb->pipe)\r
+ ? PCI_DMA_FROMDEVICE\r
+ : PCI_DMA_TODEVICE);\r
+ }\r
+\r
+ /* pass ownership to the completion handler */\r
+ urb->complete (urb, regs);\r
+ usb_put_urb (urb);\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/**\r
+ * usb_hcd_irq - hook IRQs to HCD framework (bus glue)\r
+ * @irq: the IRQ being raised\r
+ * @__hcd: pointer to the HCD whose IRQ is beinng signaled\r
+ * @r: saved hardware registers\r
+ *\r
+ * When registering a USB bus through the HCD framework code, use this\r
+ * to handle interrupts. The PCI glue layer does so automatically; only\r
+ * bus glue for non-PCI system busses will need to use this.\r
+ */\r
+irqreturn_t usb_hcd_irq (int irq, void *__hcd, struct pt_regs * r)\r
+{\r
+ struct usb_hcd *hcd = __hcd;\r
+ int start = hcd->state;\r
+\r
+ if (unlikely (hcd->state == USB_STATE_HALT)) /* irq sharing? */\r
+ return IRQ_NONE;\r
+\r
+ hcd->driver->irq (hcd, r);\r
+ if (hcd->state != start && hcd->state == USB_STATE_HALT)\r
+ usb_hc_died (hcd);\r
+ return IRQ_HANDLED;\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+static void hcd_panic (void *_hcd)\r
+{\r
+ struct usb_hcd *hcd = _hcd;\r
+ hcd->driver->stop (hcd);\r
+}\r
+\r
+/**\r
+ * usb_hc_died - report abnormal shutdown of a host controller (bus glue)\r
+ * @hcd: pointer to the HCD representing the controller\r
+ *\r
+ * This is called by bus glue to report a USB host controller that died\r
+ * while operations may still have been pending. It's called automatically\r
+ * by the PCI glue, so only glue for non-PCI busses should need to call it. \r
+ */\r
+void STDCALL usb_hc_died (struct usb_hcd *hcd)\r
+{\r
+ struct list_head *devlist, *urblist;\r
+ struct hcd_dev *dev;\r
+ struct urb *urb;\r
+ unsigned long flags;\r
+ \r
+ /* flag every pending urb as done */\r
+ spin_lock_irqsave (&hcd_data_lock, flags);\r
+ list_for_each (devlist, &hcd->dev_list) {\r
+ dev = list_entry (devlist, struct hcd_dev, dev_list);\r
+ list_for_each (urblist, &dev->urb_list) {\r
+ urb = list_entry (urblist, struct urb, urb_list);\r
+ dev_dbg (hcd->controller, "shutdown %s urb %p pipe %x, current status %d\n",\r
+ hcd->self.bus_name, urb, urb->pipe, urb->status);\r
+ if (urb->status == -EINPROGRESS)\r
+ urb->status = -ESHUTDOWN;\r
+ }\r
+ }\r
+ urb = (struct urb *) hcd->rh_timer.data;\r
+ if (urb)\r
+ urb->status = -ESHUTDOWN;\r
+ spin_unlock_irqrestore (&hcd_data_lock, flags);\r
+\r
+ /* hcd->stop() needs a task context */\r
+ INIT_WORK (&hcd->work, hcd_panic, hcd);\r
+ (void) schedule_work (&hcd->work);\r
+}\r
+\r
--- /dev/null
+/*\r
+ * Copyright (c) 2001-2002 by David Brownell\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of the GNU General Public License as published by the\r
+ * Free Software Foundation; either version 2 of the License, or (at your\r
+ * option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but\r
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\r
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License\r
+ * for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software Foundation,\r
+ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\r
+ */\r
+\r
+\r
+#ifdef __KERNEL__\r
+\r
+/* This file contains declarations of usbcore internals that are mostly\r
+ * used or exposed by Host Controller Drivers.\r
+ */\r
+\r
+/*\r
+ * USB Packet IDs (PIDs)\r
+ */\r
+#define USB_PID_UNDEF_0 0xf0\r
+#define USB_PID_OUT 0xe1\r
+#define USB_PID_ACK 0xd2\r
+#define USB_PID_DATA0 0xc3\r
+#define USB_PID_PING 0xb4 /* USB 2.0 */\r
+#define USB_PID_SOF 0xa5\r
+#define USB_PID_NYET 0x96 /* USB 2.0 */\r
+#define USB_PID_DATA2 0x87 /* USB 2.0 */\r
+#define USB_PID_SPLIT 0x78 /* USB 2.0 */\r
+#define USB_PID_IN 0x69\r
+#define USB_PID_NAK 0x5a\r
+#define USB_PID_DATA1 0x4b\r
+#define USB_PID_PREAMBLE 0x3c /* Token mode */\r
+#define USB_PID_ERR 0x3c /* USB 2.0: handshake mode */\r
+#define USB_PID_SETUP 0x2d\r
+#define USB_PID_STALL 0x1e\r
+#define USB_PID_MDATA 0x0f /* USB 2.0 */\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/*\r
+ * USB Host Controller Driver (usb_hcd) framework\r
+ *\r
+ * Since "struct usb_bus" is so thin, you can't share much code in it.\r
+ * This framework is a layer over that, and should be more sharable.\r
+ */\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+struct usb_hcd { /* usb_bus.hcpriv points to this */\r
+\r
+ /*\r
+ * housekeeping\r
+ */\r
+ struct usb_bus self; /* hcd is-a bus */\r
+\r
+ const char *product_desc; /* product/vendor string */\r
+ const char *description; /* "ehci-hcd" etc */\r
+\r
+ struct timer_list rh_timer; /* drives root hub */\r
+ struct list_head dev_list; /* devices on this bus */\r
+ struct work_struct work;\r
+\r
+ /*\r
+ * hardware info/state\r
+ */\r
+ struct hc_driver *driver; /* hw-specific hooks */\r
+ int irq; /* irq allocated */\r
+ void *regs; /* device memory/io */\r
+ struct device *controller; /* handle to hardware */\r
+\r
+ /* a few non-PCI controllers exist, mostly for OHCI */\r
+ struct pci_dev *pdev; /* pci is typical */\r
+#ifdef CONFIG_PCI\r
+ int region; /* pci region for regs */\r
+ u32 pci_state [16]; /* for PM state save */\r
+ atomic_t resume_count; /* multiple resumes issue */\r
+#endif\r
+\r
+#define HCD_BUFFER_POOLS 4\r
+ struct pci_pool *pool [HCD_BUFFER_POOLS];\r
+\r
+ int state;\r
+# define __ACTIVE 0x01\r
+# define __SLEEPY 0x02\r
+# define __SUSPEND 0x04\r
+# define __TRANSIENT 0x80\r
+\r
+# define USB_STATE_HALT 0\r
+# define USB_STATE_RUNNING (__ACTIVE)\r
+# define USB_STATE_READY (__ACTIVE|__SLEEPY)\r
+# define USB_STATE_QUIESCING (__SUSPEND|__TRANSIENT|__ACTIVE)\r
+# define USB_STATE_RESUMING (__SUSPEND|__TRANSIENT)\r
+# define USB_STATE_SUSPENDED (__SUSPEND)\r
+\r
+#define HCD_IS_RUNNING(state) ((state) & __ACTIVE)\r
+#define HCD_IS_SUSPENDED(state) ((state) & __SUSPEND)\r
+\r
+ /* more shared queuing code would be good; it should support\r
+ * smarter scheduling, handle transaction translators, etc;\r
+ * input size of periodic table to an interrupt scheduler. \r
+ * (ohci 32, uhci 1024, ehci 256/512/1024).\r
+ */\r
+};\r
+\r
+/* 2.4 does this a bit differently ... */\r
+static inline struct usb_bus *hcd_to_bus (struct usb_hcd *hcd)\r
+{\r
+ return &hcd->self;\r
+}\r
+\r
+\r
+struct hcd_dev { /* usb_device.hcpriv points to this */\r
+ struct list_head dev_list; /* on this hcd */\r
+ struct list_head urb_list; /* pending on this dev */\r
+\r
+ /* per-configuration HC/HCD state, such as QH or ED */\r
+ void *ep[32];\r
+};\r
+\r
+// urb.hcpriv is really hardware-specific\r
+\r
+struct hcd_timeout { /* timeouts we allocate */\r
+ struct list_head timeout_list;\r
+ struct timer_list timer;\r
+};\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/*\r
+ * FIXME usb_operations should vanish or become hc_driver,\r
+ * when usb_bus and usb_hcd become the same thing.\r
+ */\r
+\r
+struct usb_operations {\r
+ int (*allocate)(struct usb_device *);\r
+ int (*deallocate)(struct usb_device *);\r
+ int (*get_frame_number) (struct usb_device *usb_dev);\r
+ int (*submit_urb) (struct urb *urb, int mem_flags);\r
+ int (*unlink_urb) (struct urb *urb);\r
+\r
+ /* allocate dma-consistent buffer for URB_DMA_NOMAPPING */\r
+ void *(*buffer_alloc)(struct usb_bus *bus, size_t size,\r
+ int mem_flags,\r
+ dma_addr_t *dma);\r
+ void (*buffer_free)(struct usb_bus *bus, size_t size,\r
+ void *addr, dma_addr_t dma);\r
+\r
+ void (*disable)(struct usb_device *udev, int bEndpointAddress);\r
+};\r
+\r
+/* each driver provides one of these, and hardware init support */\r
+\r
+struct pt_regs;\r
+\r
+struct hc_driver {\r
+ const char *description; /* "ehci-hcd" etc */\r
+\r
+ /* irq handler */\r
+ void (*irq) (struct usb_hcd *hcd, struct pt_regs *regs);\r
+\r
+ int flags;\r
+#define HCD_MEMORY 0x0001 /* HC regs use memory (else I/O) */\r
+#define HCD_USB11 0x0010 /* USB 1.1 */\r
+#define HCD_USB2 0x0020 /* USB 2.0 */\r
+\r
+ /* called to init HCD and root hub */\r
+ int (*start) (struct usb_hcd *hcd);\r
+\r
+ /* called after all devices were suspended */\r
+ int (*suspend) (struct usb_hcd *hcd, u32 state);\r
+\r
+ /* called before any devices get resumed */\r
+ int (*resume) (struct usb_hcd *hcd);\r
+\r
+ /* cleanly make HCD stop writing memory and doing I/O */\r
+ void (*stop) (struct usb_hcd *hcd);\r
+\r
+ /* return current frame number */\r
+ int (*get_frame_number) (struct usb_hcd *hcd);\r
+\r
+ /* memory lifecycle */\r
+ struct usb_hcd *(*hcd_alloc) (void);\r
+ void (*hcd_free) (struct usb_hcd *hcd);\r
+\r
+ /* manage i/o requests, device state */\r
+ int (*urb_enqueue) (struct usb_hcd *hcd, struct urb *urb,\r
+ int mem_flags);\r
+ int (*urb_dequeue) (struct usb_hcd *hcd, struct urb *urb);\r
+\r
+ /* hw synch, freeing endpoint resources that urb_dequeue can't */\r
+ void (*endpoint_disable)(struct usb_hcd *hcd,\r
+ struct hcd_dev *dev, int bEndpointAddress);\r
+\r
+ /* root hub support */\r
+ int (*hub_status_data) (struct usb_hcd *hcd, char *buf);\r
+ int (*hub_control) (struct usb_hcd *hcd,\r
+ u16 typeReq, u16 wValue, u16 wIndex,\r
+ char *buf, u16 wLength);\r
+};\r
+\r
+extern void STDCALL usb_hcd_giveback_urb (struct usb_hcd *hcd, struct urb *urb, struct pt_regs *regs);\r
+extern void STDCALL usb_bus_init (struct usb_bus *bus);\r
+extern void usb_rh_status_dequeue (struct usb_hcd *hcd, struct urb *urb);\r
+\r
+#ifdef CONFIG_PCI\r
+struct pci_dev;\r
+struct pci_device_id;\r
+extern int STDCALL usb_hcd_pci_probe (struct pci_dev *dev,\r
+ const struct pci_device_id *id);\r
+extern void STDCALL usb_hcd_pci_remove (struct pci_dev *dev);\r
+\r
+#ifdef CONFIG_PM\r
+// FIXME: see Documentation/power/pci.txt (2.4.6 and later?)\r
+// extern int usb_hcd_pci_save_state (struct pci_dev *dev, u32 state);\r
+extern int usb_hcd_pci_suspend (struct pci_dev *dev, u32 state);\r
+extern int usb_hcd_pci_resume (struct pci_dev *dev);\r
+// extern int usb_hcd_pci_enable_wake (struct pci_dev *dev, u32 state, int flg);\r
+#endif /* CONFIG_PM */\r
+\r
+#endif /* CONFIG_PCI */\r
+\r
+/* pci-ish (pdev null is ok) buffer alloc/mapping support */\r
+int hcd_buffer_create (struct usb_hcd *hcd);\r
+void hcd_buffer_destroy (struct usb_hcd *hcd);\r
+\r
+void *hcd_buffer_alloc (struct usb_bus *bus, size_t size,\r
+ int mem_flags, dma_addr_t *dma);\r
+void hcd_buffer_free (struct usb_bus *bus, size_t size,\r
+ void *addr, dma_addr_t dma);\r
+\r
+/* generic bus glue, needed for host controllers that don't use PCI */\r
+extern struct usb_operations usb_hcd_operations;\r
+extern irqreturn_t usb_hcd_irq (int irq, void *__hcd, struct pt_regs *r);\r
+extern void STDCALL usb_hc_died (struct usb_hcd *hcd);\r
+\r
+/* -------------------------------------------------------------------------- */\r
+\r
+/* Enumeration is only for the hub driver, or HCD virtual root hubs */\r
+extern int usb_new_device(struct usb_device *dev, struct device *parent);\r
+extern void STDCALL usb_connect(struct usb_device *dev);\r
+extern void usb_disconnect(struct usb_device **);\r
+\r
+/* exported to hub driver ONLY to support usb_reset_device () */\r
+extern int usb_get_configuration(struct usb_device *dev);\r
+extern void usb_set_maxpacket(struct usb_device *dev);\r
+extern void usb_destroy_configuration(struct usb_device *dev);\r
+extern int usb_set_address(struct usb_device *dev);\r
+\r
+/* use these only before the device's address has been set */\r
+#define usb_snddefctrl(dev) ((PIPE_CONTROL << 30))\r
+#define usb_rcvdefctrl(dev) ((PIPE_CONTROL << 30) | USB_DIR_IN)\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/*\r
+ * HCD Root Hub support\r
+ */\r
+\r
+#include "hub.h"\r
+\r
+/* (shifted) direction/type/recipient from the USB 2.0 spec, table 9.2 */\r
+#define DeviceRequest \\r
+ ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8)\r
+#define DeviceOutRequest \\r
+ ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8)\r
+\r
+#define InterfaceRequest \\r
+ ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8)\r
+\r
+#define EndpointRequest \\r
+ ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8)\r
+#define EndpointOutRequest \\r
+ ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8)\r
+\r
+/* table 9.6 standard features */\r
+#define DEVICE_REMOTE_WAKEUP 1\r
+#define ENDPOINT_HALT 0\r
+\r
+/* class requests from the USB 2.0 hub spec, table 11-15 */\r
+/* GetBusState and SetHubDescriptor are optional, omitted */\r
+#define ClearHubFeature (0x2000 | USB_REQ_CLEAR_FEATURE)\r
+#define ClearPortFeature (0x2300 | USB_REQ_CLEAR_FEATURE)\r
+#define GetHubDescriptor (0xa000 | USB_REQ_GET_DESCRIPTOR)\r
+#define GetHubStatus (0xa000 | USB_REQ_GET_STATUS)\r
+#define GetPortStatus (0xa300 | USB_REQ_GET_STATUS)\r
+#define SetHubFeature (0x2000 | USB_REQ_SET_FEATURE)\r
+#define SetPortFeature (0x2300 | USB_REQ_SET_FEATURE)\r
+\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/*\r
+ * Generic bandwidth allocation constants/support\r
+ */\r
+#define FRAME_TIME_USECS 1000L\r
+#define BitTime(bytecount) (7 * 8 * bytecount / 6) /* with integer truncation */\r
+ /* Trying not to use worst-case bit-stuffing\r
+ of (7/6 * 8 * bytecount) = 9.33 * bytecount */\r
+ /* bytecount = data payload byte count */\r
+\r
+#define NS_TO_US(ns) ((ns + 500L) / 1000L)\r
+ /* convert & round nanoseconds to microseconds */\r
+\r
+extern void STDCALL usb_claim_bandwidth (struct usb_device *dev, struct urb *urb,\r
+ int bustime, int isoc);\r
+extern void STDCALL usb_release_bandwidth (struct usb_device *dev, struct urb *urb,\r
+ int isoc);\r
+\r
+/*\r
+ * Full/low speed bandwidth allocation constants/support.\r
+ */\r
+#define BW_HOST_DELAY 1000L /* nanoseconds */\r
+#define BW_HUB_LS_SETUP 333L /* nanoseconds */\r
+ /* 4 full-speed bit times (est.) */\r
+\r
+#define FRAME_TIME_BITS 12000L /* frame = 1 millisecond */\r
+#define FRAME_TIME_MAX_BITS_ALLOC (90L * FRAME_TIME_BITS / 100L)\r
+#define FRAME_TIME_MAX_USECS_ALLOC (90L * FRAME_TIME_USECS / 100L)\r
+\r
+extern int STDCALL usb_check_bandwidth (struct usb_device *dev, struct urb *urb);\r
+\r
+/*\r
+ * Ceiling microseconds (typical) for that many bytes at high speed\r
+ * ISO is a bit less, no ACK ... from USB 2.0 spec, 5.11.3 (and needed\r
+ * to preallocate bandwidth)\r
+ */\r
+#define USB2_HOST_DELAY 5 /* nsec, guess */\r
+#define HS_USECS(bytes) NS_TO_US ( ((55 * 8 * 2083)/1000) \\r
+ + ((2083UL * (3167 + BitTime (bytes)))/1000) \\r
+ + USB2_HOST_DELAY)\r
+#define HS_USECS_ISO(bytes) NS_TO_US ( ((long)(38 * 8 * 2.083)) \\r
+ + ((2083UL * (3167 + BitTime (bytes)))/1000) \\r
+ + USB2_HOST_DELAY)\r
+\r
+extern long STDCALL usb_calc_bus_time (int speed, int is_input,\r
+ int isoc, int bytecount);\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+extern struct usb_bus STDCALL *usb_alloc_bus (struct usb_operations *);\r
+extern void STDCALL usb_free_bus (struct usb_bus *);\r
+\r
+extern void STDCALL usb_register_bus (struct usb_bus *);\r
+extern void STDCALL usb_deregister_bus (struct usb_bus *);\r
+\r
+extern int STDCALL usb_register_root_hub (struct usb_device *usb_dev,\r
+ struct device *parent_dev);\r
+\r
+/* for portability to 2.4, hcds should call this */\r
+static inline int hcd_register_root (struct usb_hcd *hcd)\r
+{\r
+ return usb_register_root_hub (\r
+ hcd_to_bus (hcd)->root_hub, hcd->controller);\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* exported only within usbcore */\r
+\r
+extern struct list_head usb_bus_list;\r
+extern struct semaphore usb_bus_list_lock;\r
+\r
+extern void usb_bus_get (struct usb_bus *bus);\r
+extern void usb_bus_put (struct usb_bus *bus);\r
+\r
+extern int usb_find_interface_driver (struct usb_device *dev,\r
+ struct usb_interface *interface);\r
+\r
+#define usb_endpoint_halt(dev, ep, out) ((dev)->halted[out] |= (1 << (ep)))\r
+\r
+#define usb_endpoint_out(ep_dir) (!((ep_dir) & USB_DIR_IN))\r
+\r
+/*\r
+ * USB device fs stuff\r
+ */\r
+\r
+#ifdef CONFIG_USB_DEVICEFS\r
+\r
+/*\r
+ * these are expected to be called from the USB core/hub thread\r
+ * with the kernel lock held\r
+ */\r
+extern void usbfs_add_bus(struct usb_bus *bus);\r
+extern void usbfs_remove_bus(struct usb_bus *bus);\r
+extern void usbfs_add_device(struct usb_device *dev);\r
+extern void usbfs_remove_device(struct usb_device *dev);\r
+extern void usbfs_update_special (void);\r
+\r
+extern int usbfs_init(void);\r
+extern void usbfs_cleanup(void);\r
+\r
+#else /* CONFIG_USB_DEVICEFS */\r
+\r
+static inline void usbfs_add_bus(struct usb_bus *bus) {}\r
+static inline void usbfs_remove_bus(struct usb_bus *bus) {}\r
+static inline void usbfs_add_device(struct usb_device *dev) {}\r
+static inline void usbfs_remove_device(struct usb_device *dev) {}\r
+static inline void usbfs_update_special (void) {}\r
+\r
+static inline int usbfs_init(void) { return 0; }\r
+static inline void usbfs_cleanup(void) { }\r
+\r
+#endif /* CONFIG_USB_DEVICEFS */\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* hub.h ... DeviceRemovable in 2.4.2-ac11, gone in 2.4.10 */\r
+// bleech -- resurfaced in 2.4.11 or 2.4.12\r
+#define bitmap DeviceRemovable\r
+\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* random stuff */\r
+\r
+#define RUN_CONTEXT (in_irq () ? "in_irq" \\r
+ : (in_interrupt () ? "in_interrupt" : "can sleep"))\r
+\r
+\r
+#endif /* __KERNEL__ */\r
+\r
--- /dev/null
+/*\r
+ * USB hub driver.\r
+ *\r
+ * (C) Copyright 1999 Linus Torvalds\r
+ * (C) Copyright 1999 Johannes Erdfelt\r
+ * (C) Copyright 1999 Gregory P. Smith\r
+ * (C) Copyright 2001 Brad Hards (bhards@bigpond.net.au)\r
+ *\r
+ */\r
+#define DEBUG\r
+#if 0\r
+#include <linux/config.h>\r
+#include <linux/kernel.h>\r
+#include <linux/errno.h>\r
+#include <linux/module.h>\r
+#include <linux/completion.h>\r
+#include <linux/sched.h>\r
+#include <linux/list.h>\r
+#include <linux/slab.h>\r
+#include <linux/smp_lock.h>\r
+#include <linux/ioctl.h>\r
+#ifdef CONFIG_USB_DEBUG\r
+ #define DEBUG\r
+#else\r
+ #undef DEBUG\r
+#endif\r
+#include <linux/usb.h>\r
+#include <linux/usbdevice_fs.h>\r
+#include <linux/suspend.h>\r
+\r
+#include <asm/semaphore.h>\r
+#include <asm/uaccess.h>\r
+#include <asm/byteorder.h>\r
+\r
+#include "hcd.h"\r
+#include "hub.h"\r
+#else\r
+#include "../usb_wrapper.h"\r
+#include "hcd.h"\r
+#include "hub.h"\r
+#define DEBUG\r
+#endif\r
+\r
+/* Wakes up khubd */\r
+static spinlock_t hub_event_lock = SPIN_LOCK_UNLOCKED;\r
+static DECLARE_MUTEX(usb_address0_sem);\r
+\r
+static LIST_HEAD(hub_event_list); /* List of hubs needing servicing */\r
+static LIST_HEAD(hub_list); /* List of all hubs (for cleanup) */\r
+\r
+static DECLARE_WAIT_QUEUE_HEAD(khubd_wait);\r
+static pid_t khubd_pid = 0; /* PID of khubd */\r
+static DECLARE_COMPLETION(khubd_exited);\r
+\r
+#ifdef DEBUG\r
+static inline char *portspeed (int portstatus)\r
+{\r
+ if (portstatus & (1 << USB_PORT_FEAT_HIGHSPEED))\r
+ return "480 Mb/s";\r
+ else if (portstatus & (1 << USB_PORT_FEAT_LOWSPEED))\r
+ return "1.5 Mb/s";\r
+ else\r
+ return "12 Mb/s";\r
+}\r
+#endif\r
+\r
+/* for dev_info, dev_dbg, etc */\r
+static inline struct device *hubdev (struct usb_device *dev)\r
+{\r
+ return &dev->actconfig->interface [0].dev;\r
+}\r
+\r
+/* USB 2.0 spec Section 11.24.4.5 */\r
+static int get_hub_descriptor(struct usb_device *dev, void *data, int size)\r
+{\r
+ return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),\r
+ USB_REQ_GET_DESCRIPTOR, USB_DIR_IN | USB_RT_HUB,\r
+ USB_DT_HUB << 8, 0, data, size, HZ * USB_CTRL_GET_TIMEOUT);\r
+}\r
+\r
+/*\r
+ * USB 2.0 spec Section 11.24.2.1\r
+ */\r
+static int clear_hub_feature(struct usb_device *dev, int feature)\r
+{\r
+ return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),\r
+ USB_REQ_CLEAR_FEATURE, USB_RT_HUB, feature, 0, NULL, 0, HZ);\r
+}\r
+\r
+/*\r
+ * USB 2.0 spec Section 11.24.2.2\r
+ * BUG: doesn't handle port indicator selector in high byte of wIndex\r
+ */\r
+static int clear_port_feature(struct usb_device *dev, int port, int feature)\r
+{\r
+ return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),\r
+ USB_REQ_CLEAR_FEATURE, USB_RT_PORT, feature, port, NULL, 0, HZ);\r
+}\r
+\r
+/*\r
+ * USB 2.0 spec Section 11.24.2.13\r
+ * BUG: doesn't handle port indicator selector in high byte of wIndex\r
+ */\r
+static int set_port_feature(struct usb_device *dev, int port, int feature)\r
+{\r
+ return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),\r
+ USB_REQ_SET_FEATURE, USB_RT_PORT, feature, port, NULL, 0, HZ);\r
+}\r
+\r
+/*\r
+ * USB 2.0 spec Section 11.24.2.6\r
+ */\r
+static int get_hub_status(struct usb_device *dev,\r
+ struct usb_hub_status *data)\r
+{\r
+ return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),\r
+ USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_HUB, 0, 0,\r
+ data, sizeof(*data), HZ * USB_CTRL_GET_TIMEOUT);\r
+}\r
+\r
+/*\r
+ * USB 2.0 spec Section 11.24.2.7\r
+ */\r
+static int get_port_status(struct usb_device *dev, int port,\r
+ struct usb_port_status *data)\r
+{\r
+ return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),\r
+ USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_PORT, 0, port,\r
+ data, sizeof(*data), HZ * USB_CTRL_GET_TIMEOUT);\r
+}\r
+\r
+/* completion function, fires on port status changes and various faults */\r
+static void hub_irq(struct urb *urb, struct pt_regs *regs)\r
+{\r
+ struct usb_hub *hub = (struct usb_hub *)urb->context;\r
+ unsigned long flags;\r
+ int status;\r
+\r
+ switch (urb->status) {\r
+ case -ENOENT: /* synchronous unlink */\r
+ case -ECONNRESET: /* async unlink */\r
+ case -ESHUTDOWN: /* hardware going away */\r
+ return;\r
+\r
+ default: /* presumably an error */\r
+ /* Cause a hub reset after 10 consecutive errors */\r
+ dev_dbg (&hub->intf->dev, "transfer --> %d\n", urb->status);\r
+ if ((++hub->nerrors < 10) || hub->error)\r
+ goto resubmit;\r
+ hub->error = urb->status;\r
+ /* FALL THROUGH */\r
+ \r
+ /* let khubd handle things */\r
+ case 0: /* we got data: port status changed */\r
+ break;\r
+ }\r
+\r
+ hub->nerrors = 0;\r
+\r
+ /* Something happened, let khubd figure it out */\r
+ spin_lock_irqsave(&hub_event_lock, flags);\r
+ if (list_empty(&hub->event_list)) {\r
+ list_add(&hub->event_list, &hub_event_list);\r
+ wake_up(&khubd_wait);\r
+ }\r
+ spin_unlock_irqrestore(&hub_event_lock, flags);\r
+\r
+resubmit:\r
+ if ((status = usb_submit_urb (hub->urb, GFP_ATOMIC)) != 0\r
+ /* ENODEV means we raced disconnect() */\r
+ && status != -ENODEV)\r
+ dev_err (&hub->intf->dev, "resubmit --> %d\n", urb->status);\r
+}\r
+\r
+/* USB 2.0 spec Section 11.24.2.3 */\r
+static inline int\r
+hub_clear_tt_buffer (struct usb_device *hub, u16 devinfo, u16 tt)\r
+{\r
+ return usb_control_msg (hub, usb_rcvctrlpipe (hub, 0),\r
+ HUB_CLEAR_TT_BUFFER, USB_DIR_IN | USB_RECIP_OTHER,\r
+ devinfo, tt, 0, 0, HZ);\r
+}\r
+\r
+/*\r
+ * enumeration blocks khubd for a long time. we use keventd instead, since\r
+ * long blocking there is the exception, not the rule. accordingly, HCDs\r
+ * talking to TTs must queue control transfers (not just bulk and iso), so\r
+ * both can talk to the same hub concurrently.\r
+ */\r
+static void hub_tt_kevent (void *arg)\r
+{\r
+ struct usb_hub *hub = arg;\r
+ unsigned long flags;\r
+\r
+ spin_lock_irqsave (&hub->tt.lock, flags);\r
+ while (!list_empty (&hub->tt.clear_list)) {\r
+ struct list_head *temp;\r
+ struct usb_tt_clear *clear;\r
+ struct usb_device *dev;\r
+ int status;\r
+\r
+ temp = hub->tt.clear_list.next;\r
+ clear = list_entry (temp, struct usb_tt_clear, clear_list);\r
+ list_del (&clear->clear_list);\r
+\r
+ /* drop lock so HCD can concurrently report other TT errors */\r
+ spin_unlock_irqrestore (&hub->tt.lock, flags);\r
+ dev = interface_to_usbdev (hub->intf);\r
+ status = hub_clear_tt_buffer (dev, clear->devinfo, clear->tt);\r
+ spin_lock_irqsave (&hub->tt.lock, flags);\r
+\r
+ if (status)\r
+ err ("usb-%s-%s clear tt %d (%04x) error %d",\r
+ dev->bus->bus_name, dev->devpath,\r
+ clear->tt, clear->devinfo, status);\r
+ kfree (clear);\r
+ }\r
+ spin_unlock_irqrestore (&hub->tt.lock, flags);\r
+}\r
+\r
+/**\r
+ * usb_hub_tt_clear_buffer - clear control/bulk TT state in high speed hub\r
+ * @dev: the device whose split transaction failed\r
+ * @pipe: identifies the endpoint of the failed transaction\r
+ *\r
+ * High speed HCDs use this to tell the hub driver that some split control or\r
+ * bulk transaction failed in a way that requires clearing internal state of\r
+ * a transaction translator. This is normally detected (and reported) from\r
+ * interrupt context.\r
+ *\r
+ * It may not be possible for that hub to handle additional full (or low)\r
+ * speed transactions until that state is fully cleared out.\r
+ */\r
+void usb_hub_tt_clear_buffer (struct usb_device *dev, int pipe)\r
+{\r
+ struct usb_tt *tt = dev->tt;\r
+ unsigned long flags;\r
+ struct usb_tt_clear *clear;\r
+\r
+ /* we've got to cope with an arbitrary number of pending TT clears,\r
+ * since each TT has "at least two" buffers that can need it (and\r
+ * there can be many TTs per hub). even if they're uncommon.\r
+ */\r
+ if ((clear = kmalloc (sizeof *clear, SLAB_ATOMIC)) == 0) {\r
+ err ("can't save CLEAR_TT_BUFFER state for hub at usb-%s-%s",\r
+ dev->bus->bus_name, tt->hub->devpath);\r
+ /* FIXME recover somehow ... RESET_TT? */\r
+ return;\r
+ }\r
+\r
+ /* info that CLEAR_TT_BUFFER needs */\r
+ clear->tt = tt->multi ? dev->ttport : 1;\r
+ clear->devinfo = usb_pipeendpoint (pipe);\r
+ clear->devinfo |= dev->devnum << 4;\r
+ clear->devinfo |= usb_pipecontrol (pipe)\r
+ ? (USB_ENDPOINT_XFER_CONTROL << 11)\r
+ : (USB_ENDPOINT_XFER_BULK << 11);\r
+ if (usb_pipein (pipe))\r
+ clear->devinfo |= 1 << 15;\r
+ \r
+ /* tell keventd to clear state for this TT */\r
+ spin_lock_irqsave (&tt->lock, flags);\r
+ list_add_tail (&clear->clear_list, &tt->clear_list);\r
+ schedule_work (&tt->kevent);\r
+ spin_unlock_irqrestore (&tt->lock, flags);\r
+}\r
+\r
+static void hub_power_on(struct usb_hub *hub)\r
+{\r
+ struct usb_device *dev;\r
+ int i;\r
+\r
+ /* Enable power to the ports */\r
+ dev_dbg(hubdev(interface_to_usbdev(hub->intf)),\r
+ "enabling power on all ports\n");\r
+ dev = interface_to_usbdev(hub->intf);\r
+\r
+ for (i = 0; i < hub->descriptor->bNbrPorts; i++)\r
+ set_port_feature(dev, i + 1, USB_PORT_FEAT_POWER);\r
+\r
+ /* Wait for power to be enabled */\r
+ wait_ms(hub->descriptor->bPwrOn2PwrGood * 2);\r
+}\r
+\r
+static int hub_hub_status(struct usb_hub *hub,\r
+ u16 *status, u16 *change)\r
+{\r
+ struct usb_device *dev = interface_to_usbdev (hub->intf);\r
+ int ret;\r
+\r
+ ret = get_hub_status(dev, &hub->status->hub);\r
+ if (ret < 0)\r
+ dev_err (hubdev (dev),\r
+ "%s failed (err = %d)\n", __FUNCTION__, ret);\r
+ else {\r
+ *status = le16_to_cpu(hub->status->hub.wHubStatus);\r
+ *change = le16_to_cpu(hub->status->hub.wHubChange); \r
+ ret = 0;\r
+ }\r
+ return ret;\r
+}\r
+\r
+static int hub_configure(struct usb_hub *hub,\r
+ struct usb_endpoint_descriptor *endpoint)\r
+{\r
+ struct usb_device *dev = interface_to_usbdev (hub->intf);\r
+ struct device *hub_dev;\r
+ u16 hubstatus, hubchange;\r
+ unsigned int pipe;\r
+ int maxp, ret;\r
+ char *message;\r
+\r
+ hub->buffer = usb_buffer_alloc(dev, sizeof(*hub->buffer), GFP_KERNEL,\r
+ &hub->buffer_dma);\r
+ if (!hub->buffer) {\r
+ message = "can't allocate hub irq buffer";\r
+ ret = -ENOMEM;\r
+ goto fail;\r
+ }\r
+\r
+ hub->status = kmalloc(sizeof(*hub->status), GFP_KERNEL);\r
+ if (!hub->status) {\r
+ message = "can't kmalloc hub status buffer";\r
+ ret = -ENOMEM;\r
+ goto fail;\r
+ }\r
+\r
+ hub->descriptor = kmalloc(sizeof(*hub->descriptor), GFP_KERNEL);\r
+ if (!hub->descriptor) {\r
+ message = "can't kmalloc hub descriptor";\r
+ ret = -ENOMEM;\r
+ goto fail;\r
+ }\r
+\r
+ /* Request the entire hub descriptor.\r
+ * hub->descriptor can handle USB_MAXCHILDREN ports,\r
+ * but the hub can/will return fewer bytes here.\r
+ */\r
+ ret = get_hub_descriptor(dev, hub->descriptor,\r
+ sizeof(*hub->descriptor));\r
+ if (ret < 0) {\r
+ message = "can't read hub descriptor";\r
+ goto fail;\r
+ } else if (hub->descriptor->bNbrPorts > USB_MAXCHILDREN) {\r
+ message = "hub has too many ports!";\r
+ ret = -ENODEV;\r
+ goto fail;\r
+ }\r
+\r
+ hub_dev = hubdev(dev);\r
+ dev->maxchild = hub->descriptor->bNbrPorts;\r
+ dev_info (hub_dev, "%d port%s detected\n", dev->maxchild,\r
+ (dev->maxchild == 1) ? "" : "s");\r
+\r
+ le16_to_cpus(&hub->descriptor->wHubCharacteristics);\r
+\r
+ if (hub->descriptor->wHubCharacteristics & HUB_CHAR_COMPOUND) {\r
+ int i;\r
+ char portstr [USB_MAXCHILDREN + 1];\r
+\r
+ for (i = 0; i < dev->maxchild; i++)\r
+ portstr[i] = hub->descriptor->DeviceRemovable\r
+ [((i + 1) / 8)] & (1 << ((i + 1) % 8))\r
+ ? 'F' : 'R';\r
+ portstr[dev->maxchild] = 0;\r
+ dev_dbg(hub_dev, "compound device; port removable status: %s\n", portstr);\r
+ } else\r
+ dev_dbg(hub_dev, "standalone hub\n");\r
+\r
+ switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_LPSM) {\r
+ case 0x00:\r
+ dev_dbg(hub_dev, "ganged power switching\n");\r
+ break;\r
+ case 0x01:\r
+ dev_dbg(hub_dev, "individual port power switching\n");\r
+ break;\r
+ case 0x02:\r
+ case 0x03:\r
+ dev_dbg(hub_dev, "unknown reserved power switching mode\n");\r
+ break;\r
+ }\r
+\r
+ switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_OCPM) {\r
+ case 0x00:\r
+ dev_dbg(hub_dev, "global over-current protection\n");\r
+ break;\r
+ case 0x08:\r
+ dev_dbg(hub_dev, "individual port over-current protection\n");\r
+ break;\r
+ case 0x10:\r
+ case 0x18:\r
+ dev_dbg(hub_dev, "no over-current protection\n");\r
+ break;\r
+ }\r
+\r
+ spin_lock_init (&hub->tt.lock);\r
+ INIT_LIST_HEAD (&hub->tt.clear_list);\r
+ INIT_WORK (&hub->tt.kevent, hub_tt_kevent, hub);\r
+ switch (dev->descriptor.bDeviceProtocol) {\r
+ case 0:\r
+ break;\r
+ case 1:\r
+ dev_dbg(hub_dev, "Single TT\n");\r
+ hub->tt.hub = dev;\r
+ break;\r
+ case 2:\r
+ dev_dbg(hub_dev, "TT per port\n");\r
+ hub->tt.hub = dev;\r
+ hub->tt.multi = 1;\r
+ break;\r
+ default:\r
+ dev_dbg(hub_dev, "Unrecognized hub protocol %d\n",\r
+ dev->descriptor.bDeviceProtocol);\r
+ break;\r
+ }\r
+\r
+ switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_TTTT) {\r
+ case 0x00:\r
+ if (dev->descriptor.bDeviceProtocol != 0)\r
+ dev_dbg(hub_dev, "TT requires at most 8 FS bit times\n");\r
+ break;\r
+ case 0x20:\r
+ dev_dbg(hub_dev, "TT requires at most 16 FS bit times\n");\r
+ break;\r
+ case 0x40:\r
+ dev_dbg(hub_dev, "TT requires at most 24 FS bit times\n");\r
+ break;\r
+ case 0x60:\r
+ dev_dbg(hub_dev, "TT requires at most 32 FS bit times\n");\r
+ break;\r
+ }\r
+\r
+ dev_dbg(hub_dev, "Port indicators are %s supported\n", \r
+ (hub->descriptor->wHubCharacteristics & HUB_CHAR_PORTIND)\r
+ ? "" : "not");\r
+\r
+ dev_dbg(hub_dev, "power on to power good time: %dms\n",\r
+ hub->descriptor->bPwrOn2PwrGood * 2);\r
+ dev_dbg(hub_dev, "hub controller current requirement: %dmA\n",\r
+ hub->descriptor->bHubContrCurrent);\r
+\r
+ ret = hub_hub_status(hub, &hubstatus, &hubchange);\r
+ if (ret < 0) {\r
+ message = "can't get hub status";\r
+ goto fail;\r
+ }\r
+\r
+ dev_dbg(hub_dev, "local power source is %s\n",\r
+ (hubstatus & HUB_STATUS_LOCAL_POWER)\r
+ ? "lost (inactive)" : "good");\r
+\r
+ dev_dbg(hub_dev, "%sover-current condition exists\n",\r
+ (hubstatus & HUB_STATUS_OVERCURRENT) ? "" : "no ");\r
+\r
+ /* Start the interrupt endpoint */\r
+ pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);\r
+ maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));\r
+\r
+ if (maxp > sizeof(*hub->buffer))\r
+ maxp = sizeof(*hub->buffer);\r
+\r
+ hub->urb = usb_alloc_urb(0, GFP_KERNEL);\r
+ if (!hub->urb) {\r
+ message = "couldn't allocate interrupt urb";\r
+ ret = -ENOMEM;\r
+ goto fail;\r
+ }\r
+\r
+ usb_fill_int_urb(hub->urb, dev, pipe, *hub->buffer, maxp, hub_irq,\r
+ hub, endpoint->bInterval);\r
+ hub->urb->transfer_dma = hub->buffer_dma;\r
+ hub->urb->transfer_flags |= URB_NO_DMA_MAP;\r
+ ret = usb_submit_urb(hub->urb, GFP_KERNEL);\r
+ if (ret) {\r
+ message = "couldn't submit status urb";\r
+ goto fail;\r
+ }\r
+\r
+ /* Wake up khubd */\r
+ wake_up(&khubd_wait);\r
+\r
+ hub_power_on(hub);\r
+\r
+ return 0;\r
+\r
+fail:\r
+ dev_err (&hub->intf->dev, "config failed, %s (err %d)\n",\r
+ message, ret);\r
+ /* hub_disconnect() frees urb and descriptor */\r
+ return ret;\r
+}\r
+\r
+static void hub_disconnect(struct usb_interface *intf)\r
+{\r
+ struct usb_hub *hub = usb_get_intfdata (intf);\r
+ unsigned long flags;\r
+\r
+ if (!hub)\r
+ return;\r
+\r
+ usb_set_intfdata (intf, NULL);\r
+ spin_lock_irqsave(&hub_event_lock, flags);\r
+\r
+ /* Delete it and then reset it */\r
+ list_del(&hub->event_list);\r
+ INIT_LIST_HEAD(&hub->event_list);\r
+ list_del(&hub->hub_list);\r
+ INIT_LIST_HEAD(&hub->hub_list);\r
+\r
+ spin_unlock_irqrestore(&hub_event_lock, flags);\r
+\r
+ down(&hub->khubd_sem); /* Wait for khubd to leave this hub alone. */\r
+ up(&hub->khubd_sem);\r
+\r
+ /* assuming we used keventd, it must quiesce too */\r
+ if (hub->tt.hub)\r
+ flush_scheduled_work ();\r
+\r
+ if (hub->urb) {\r
+ usb_unlink_urb(hub->urb);\r
+ usb_free_urb(hub->urb);\r
+ hub->urb = NULL;\r
+ }\r
+\r
+ if (hub->descriptor) {\r
+ kfree(hub->descriptor);\r
+ hub->descriptor = NULL;\r
+ }\r
+\r
+ if (hub->status) {\r
+ kfree(hub->status);\r
+ hub->status = NULL;\r
+ }\r
+\r
+ if (hub->buffer) {\r
+ usb_buffer_free(interface_to_usbdev(intf),\r
+ sizeof(*hub->buffer), hub->buffer,\r
+ hub->buffer_dma);\r
+ hub->buffer = NULL;\r
+ }\r
+\r
+ /* Free the memory */\r
+ kfree(hub);\r
+}\r
+\r
+static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)\r
+{\r
+ struct usb_host_interface *desc;\r
+ struct usb_endpoint_descriptor *endpoint;\r
+ struct usb_device *dev;\r
+ struct usb_hub *hub;\r
+ unsigned long flags;\r
+\r
+ desc = intf->altsetting + intf->act_altsetting;\r
+ dev = interface_to_usbdev(intf);\r
+\r
+ /* Some hubs have a subclass of 1, which AFAICT according to the */\r
+ /* specs is not defined, but it works */\r
+ if ((desc->desc.bInterfaceSubClass != 0) &&\r
+ (desc->desc.bInterfaceSubClass != 1)) {\r
+descriptor_error:\r
+ dev_err (&intf->dev, "bad descriptor, ignoring hub\n");\r
+ return -EIO;\r
+ }\r
+\r
+ /* Multiple endpoints? What kind of mutant ninja-hub is this? */\r
+ if (desc->desc.bNumEndpoints != 1) {\r
+ goto descriptor_error;\r
+ }\r
+\r
+ endpoint = &desc->endpoint[0].desc;\r
+\r
+ /* Output endpoint? Curiouser and curiouser.. */\r
+ if (!(endpoint->bEndpointAddress & USB_DIR_IN)) {\r
+ goto descriptor_error;\r
+ }\r
+\r
+ /* If it's not an interrupt endpoint, we'd better punt! */\r
+ if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)\r
+ != USB_ENDPOINT_XFER_INT) {\r
+ goto descriptor_error;\r
+ return -EIO;\r
+ }\r
+\r
+ /* We found a hub */\r
+ dev_info (hubdev (dev), "USB hub found\n");\r
+\r
+ hub = kmalloc(sizeof(*hub), GFP_KERNEL);\r
+ if (!hub) {\r
+ err("couldn't kmalloc hub struct");\r
+ return -ENOMEM;\r
+ }\r
+\r
+ memset(hub, 0, sizeof(*hub));\r
+\r
+ INIT_LIST_HEAD(&hub->event_list);\r
+ hub->intf = intf;\r
+ init_MUTEX(&hub->khubd_sem);\r
+\r
+ /* Record the new hub's existence */\r
+ spin_lock_irqsave(&hub_event_lock, flags);\r
+ INIT_LIST_HEAD(&hub->hub_list);\r
+ list_add(&hub->hub_list, &hub_list);\r
+ spin_unlock_irqrestore(&hub_event_lock, flags);\r
+\r
+ usb_set_intfdata (intf, hub);\r
+\r
+ if (hub_configure(hub, endpoint) >= 0) {\r
+ strcpy (intf->dev.name, "Hub");\r
+ return 0;\r
+ }\r
+\r
+ hub_disconnect (intf);\r
+ return -ENODEV;\r
+}\r
+\r
+static int\r
+hub_ioctl(struct usb_interface *intf, unsigned int code, void *user_data)\r
+{\r
+ struct usb_device *hub = interface_to_usbdev (intf);\r
+\r
+ /* assert ifno == 0 (part of hub spec) */\r
+ switch (code) {\r
+ case USBDEVFS_HUB_PORTINFO: {\r
+ struct usbdevfs_hub_portinfo *info = user_data;\r
+ unsigned long flags;\r
+ int i;\r
+\r
+ spin_lock_irqsave(&hub_event_lock, flags);\r
+ if (hub->devnum <= 0)\r
+ info->nports = 0;\r
+ else {\r
+ info->nports = hub->maxchild;\r
+ for (i = 0; i < info->nports; i++) {\r
+ if (hub->children[i] == NULL)\r
+ info->port[i] = 0;\r
+ else\r
+ info->port[i] =\r
+ hub->children[i]->devnum;\r
+ }\r
+ }\r
+ spin_unlock_irqrestore(&hub_event_lock, flags);\r
+\r
+ return info->nports + 1;\r
+ }\r
+\r
+ default:\r
+ return -ENOSYS;\r
+ }\r
+}\r
+\r
+static int hub_reset(struct usb_hub *hub)\r
+{\r
+ struct usb_device *dev = interface_to_usbdev(hub->intf);\r
+ int i;\r
+\r
+ /* Disconnect any attached devices */\r
+ for (i = 0; i < hub->descriptor->bNbrPorts; i++) {\r
+ if (dev->children[i])\r
+ usb_disconnect(&dev->children[i]);\r
+ }\r
+\r
+ /* Attempt to reset the hub */\r
+ if (hub->urb)\r
+ usb_unlink_urb(hub->urb);\r
+ else\r
+ return -1;\r
+\r
+ if (usb_reset_device(dev))\r
+ return -1;\r
+\r
+ hub->urb->dev = dev; \r
+ if (usb_submit_urb(hub->urb, GFP_KERNEL))\r
+ return -1;\r
+\r
+ hub_power_on(hub);\r
+\r
+ return 0;\r
+}\r
+\r
+static void hub_start_disconnect(struct usb_device *dev)\r
+{\r
+ struct usb_device *parent = dev->parent;\r
+ int i;\r
+\r
+ /* Find the device pointer to disconnect */\r
+ if (parent) {\r
+ for (i = 0; i < parent->maxchild; i++) {\r
+ if (parent->children[i] == dev) {\r
+ usb_disconnect(&parent->children[i]);\r
+ return;\r
+ }\r
+ }\r
+ }\r
+\r
+ err("cannot disconnect hub %s", dev->devpath);\r
+}\r
+\r
+static int hub_port_status(struct usb_device *dev, int port,\r
+ u16 *status, u16 *change)\r
+{\r
+ struct usb_hub *hub = usb_get_intfdata (dev->actconfig->interface);\r
+ int ret;\r
+\r
+ ret = get_port_status(dev, port + 1, &hub->status->port);\r
+ if (ret < 0)\r
+ dev_err (hubdev (dev),\r
+ "%s failed (err = %d)\n", __FUNCTION__, ret);\r
+ else {\r
+ *status = le16_to_cpu(hub->status->port.wPortStatus);\r
+ *change = le16_to_cpu(hub->status->port.wPortChange); \r
+ ret = 0;\r
+ }\r
+ return ret;\r
+}\r
+\r
+#define HUB_RESET_TRIES 5\r
+#define HUB_PROBE_TRIES 2\r
+#define HUB_SHORT_RESET_TIME 10\r
+#define HUB_LONG_RESET_TIME 200\r
+#define HUB_RESET_TIMEOUT 500\r
+\r
+/* return: -1 on error, 0 on success, 1 on disconnect. */\r
+static int hub_port_wait_reset(struct usb_device *hub, int port,\r
+ struct usb_device *dev, unsigned int delay)\r
+{\r
+ int delay_time, ret;\r
+ u16 portstatus;\r
+ u16 portchange;\r
+\r
+ for (delay_time = 0;\r
+ delay_time < HUB_RESET_TIMEOUT;\r
+ delay_time += delay) {\r
+ /* wait to give the device a chance to reset */\r
+ wait_ms(delay);\r
+\r
+ /* read and decode port status */\r
+ ret = hub_port_status(hub, port, &portstatus, &portchange);\r
+ if (ret < 0) {\r
+ return -1;\r
+ }\r
+\r
+ /* Device went away? */\r
+ if (!(portstatus & USB_PORT_STAT_CONNECTION))\r
+ return 1;\r
+\r
+ /* bomb out completely if something weird happened */\r
+ if ((portchange & USB_PORT_STAT_C_CONNECTION))\r
+ return -1;\r
+\r
+ /* if we`ve finished resetting, then break out of the loop */\r
+ if (!(portstatus & USB_PORT_STAT_RESET) &&\r
+ (portstatus & USB_PORT_STAT_ENABLE)) {\r
+ if (portstatus & USB_PORT_STAT_HIGH_SPEED)\r
+ dev->speed = USB_SPEED_HIGH;\r
+ else if (portstatus & USB_PORT_STAT_LOW_SPEED)\r
+ dev->speed = USB_SPEED_LOW;\r
+ else\r
+ dev->speed = USB_SPEED_FULL;\r
+ return 0;\r
+ }\r
+\r
+ /* switch to the long delay after two short delay failures */\r
+ if (delay_time >= 2 * HUB_SHORT_RESET_TIME)\r
+ delay = HUB_LONG_RESET_TIME;\r
+\r
+ dev_dbg (hubdev (hub),\r
+ "port %d not reset yet, waiting %dms\n",\r
+ port + 1, delay);\r
+ }\r
+\r
+ return -1;\r
+}\r
+\r
+/* return: -1 on error, 0 on success, 1 on disconnect. */\r
+static int hub_port_reset(struct usb_device *hub, int port,\r
+ struct usb_device *dev, unsigned int delay)\r
+{\r
+ int i, status;\r
+\r
+ /* Reset the port */\r
+ for (i = 0; i < HUB_RESET_TRIES; i++) {\r
+ set_port_feature(hub, port + 1, USB_PORT_FEAT_RESET);\r
+\r
+ /* return on disconnect or reset */\r
+ status = hub_port_wait_reset(hub, port, dev, delay);\r
+ if (status != -1) {\r
+ clear_port_feature(hub,\r
+ port + 1, USB_PORT_FEAT_C_RESET);\r
+ dev->state = status\r
+ ? USB_STATE_NOTATTACHED\r
+ : USB_STATE_DEFAULT;\r
+ return status;\r
+ }\r
+\r
+ dev_dbg (hubdev (hub),\r
+ "port %d not enabled, trying reset again...\n",\r
+ port + 1);\r
+ delay = HUB_LONG_RESET_TIME;\r
+ }\r
+\r
+ dev_err (hubdev (hub),\r
+ "Cannot enable port %i. Maybe the USB cable is bad?\n",\r
+ port + 1);\r
+\r
+ return -1;\r
+}\r
+\r
+int hub_port_disable(struct usb_device *hub, int port)\r
+{\r
+ int ret;\r
+\r
+ ret = clear_port_feature(hub, port + 1, USB_PORT_FEAT_ENABLE);\r
+ if (ret)\r
+ dev_err(hubdev(hub), "cannot disable port %d (err = %d)\n",\r
+ port + 1, ret);\r
+\r
+ return ret;\r
+}\r
+\r
+/* USB 2.0 spec, 7.1.7.3 / fig 7-29:\r
+ *\r
+ * Between connect detection and reset signaling there must be a delay\r
+ * of 100ms at least for debounce and power-settling. The corresponding\r
+ * timer shall restart whenever the downstream port detects a disconnect.\r
+ * \r
+ * Apparently there are some bluetooth and irda-dongles and a number\r
+ * of low-speed devices which require longer delays of about 200-400ms.\r
+ * Not covered by the spec - but easy to deal with.\r
+ *\r
+ * This implementation uses 400ms minimum debounce timeout and checks\r
+ * every 25ms for transient disconnects to restart the delay.\r
+ */\r
+\r
+#define HUB_DEBOUNCE_TIMEOUT 400\r
+#define HUB_DEBOUNCE_STEP 25\r
+#define HUB_DEBOUNCE_STABLE 4\r
+\r
+/* return: -1 on error, 0 on success, 1 on disconnect. */\r
+static int hub_port_debounce(struct usb_device *hub, int port)\r
+{\r
+ int ret;\r
+ int delay_time, stable_count;\r
+ u16 portchange, portstatus;\r
+ unsigned connection;\r
+\r
+ connection = 0;\r
+ stable_count = 0;\r
+ for (delay_time = 0; delay_time < HUB_DEBOUNCE_TIMEOUT; delay_time += HUB_DEBOUNCE_STEP) {\r
+ wait_ms(HUB_DEBOUNCE_STEP);\r
+\r
+ ret = hub_port_status(hub, port, &portstatus, &portchange);\r
+ if (ret < 0)\r
+ return -1;\r
+\r
+ if ((portstatus & USB_PORT_STAT_CONNECTION) == connection) {\r
+ if (connection) {\r
+ if (++stable_count == HUB_DEBOUNCE_STABLE)\r
+ break;\r
+ }\r
+ } else {\r
+ stable_count = 0;\r
+ }\r
+ connection = portstatus & USB_PORT_STAT_CONNECTION;\r
+\r
+ if ((portchange & USB_PORT_STAT_C_CONNECTION)) {\r
+ clear_port_feature(hub, port+1, USB_PORT_FEAT_C_CONNECTION);\r
+ }\r
+ }\r
+\r
+ /* XXX Replace this with dbg() when 2.6 is about to ship. */\r
+ dev_dbg (hubdev (hub),\r
+ "debounce: port %d: delay %dms stable %d status 0x%x\n",\r
+ port + 1, delay_time, stable_count, portstatus);\r
+\r
+ return ((portstatus&USB_PORT_STAT_CONNECTION)) ? 0 : 1;\r
+}\r
+\r
+static void hub_port_connect_change(struct usb_hub *hubstate, int port,\r
+ u16 portstatus, u16 portchange)\r
+{\r
+ struct usb_device *hub = interface_to_usbdev(hubstate->intf);\r
+ struct usb_device *dev;\r
+ unsigned int delay = HUB_SHORT_RESET_TIME;\r
+ int i;\r
+\r
+ dev_dbg (&hubstate->intf->dev,\r
+ "port %d, status %x, change %x, %s\n",\r
+ port + 1, portstatus, portchange, portspeed (portstatus));\r
+\r
+ /* Clear the connection change status */\r
+ clear_port_feature(hub, port + 1, USB_PORT_FEAT_C_CONNECTION);\r
+\r
+ /* Disconnect any existing devices under this port */\r
+ if (hub->children[port])\r
+ usb_disconnect(&hub->children[port]);\r
+\r
+ /* Return now if nothing is connected */\r
+ if (!(portstatus & USB_PORT_STAT_CONNECTION)) {\r
+ if (portstatus & USB_PORT_STAT_ENABLE)\r
+ hub_port_disable(hub, port);\r
+\r
+ return;\r
+ }\r
+\r
+ if (hub_port_debounce(hub, port)) {\r
+ dev_err (&hubstate->intf->dev,\r
+ "connect-debounce failed, port %d disabled\n",\r
+ port+1);\r
+ hub_port_disable(hub, port);\r
+ return;\r
+ }\r
+\r
+ /* Some low speed devices have problems with the quick delay, so */\r
+ /* be a bit pessimistic with those devices. RHbug #23670 */\r
+ if (portstatus & USB_PORT_STAT_LOW_SPEED)\r
+ delay = HUB_LONG_RESET_TIME;\r
+\r
+ down(&usb_address0_sem);\r
+\r
+ for (i = 0; i < HUB_PROBE_TRIES; i++) {\r
+ struct usb_device *pdev;\r
+ int len;\r
+\r
+ /* Allocate a new device struct */\r
+ dev = usb_alloc_dev(hub, hub->bus);\r
+ if (!dev) {\r
+ dev_err (&hubstate->intf->dev,\r
+ "couldn't allocate usb_device\n");\r
+ break;\r
+ }\r
+\r
+ hub->children[port] = dev;\r
+ dev->state = USB_STATE_POWERED;\r
+\r
+ /* Reset the device, and detect its speed */\r
+ if (hub_port_reset(hub, port, dev, delay)) {\r
+ usb_put_dev(dev);\r
+ break;\r
+ }\r
+\r
+ /* Find a new address for it */\r
+ usb_connect(dev);\r
+\r
+ /* Set up TT records, if needed */\r
+ if (hub->tt) {\r
+ dev->tt = hub->tt;\r
+ dev->ttport = hub->ttport;\r
+ } else if (dev->speed != USB_SPEED_HIGH\r
+ && hub->speed == USB_SPEED_HIGH) {\r
+ dev->tt = &hubstate->tt;\r
+ dev->ttport = port + 1;\r
+ }\r
+\r
+ /* Save readable and stable topology id, distinguishing\r
+ * devices by location for diagnostics, tools, etc. The\r
+ * string is a path along hub ports, from the root. Each\r
+ * device's id will be stable until USB is re-cabled, and\r
+ * hubs are often labeled with these port numbers.\r
+ *\r
+ * Initial size: ".NN" times five hubs + NUL = 16 bytes max\r
+ * (quite rare, since most hubs have 4-6 ports).\r
+ */\r
+ pdev = dev->parent;\r
+ if (pdev->devpath [0] != '0') /* parent not root? */\r
+ len = snprintf (dev->devpath, sizeof dev->devpath,\r
+ "%s.%d", pdev->devpath, port + 1);\r
+ /* root == "0", root port 2 == "2", port 3 that hub "2.3" */\r
+ else\r
+ len = snprintf (dev->devpath, sizeof dev->devpath,\r
+ "%d", port + 1);\r
+ if (len == sizeof dev->devpath)\r
+ dev_err (&hubstate->intf->dev,\r
+ "devpath size! usb/%03d/%03d path %s\n",\r
+ dev->bus->busnum, dev->devnum, dev->devpath);\r
+ dev_info (&hubstate->intf->dev,\r
+ "new USB device on port %d, assigned address %d\n",\r
+ port + 1, dev->devnum);\r
+\r
+ /* put the device in the global device tree. the hub port\r
+ * is the "bus_id"; hubs show in hierarchy like bridges\r
+ */\r
+ dev->dev.parent = dev->parent->dev.parent->parent;\r
+\r
+ /* Run it through the hoops (find a driver, etc) */\r
+ if (!usb_new_device(dev, &hub->dev))\r
+ goto done;\r
+\r
+ /* Free the configuration if there was an error */\r
+ usb_put_dev(dev);\r
+\r
+ /* Switch to a long reset time */\r
+ delay = HUB_LONG_RESET_TIME;\r
+ }\r
+\r
+ hub->children[port] = NULL;\r
+ hub_port_disable(hub, port);\r
+done:\r
+ up(&usb_address0_sem);\r
+}\r
+\r
+static void hub_events(void)\r
+{\r
+ unsigned long flags;\r
+ struct list_head *tmp;\r
+ struct usb_device *dev;\r
+ struct usb_hub *hub;\r
+ u16 hubstatus;\r
+ u16 hubchange;\r
+ u16 portstatus;\r
+ u16 portchange;\r
+ int i, ret;\r
+ int m=0;\r
+ /*\r
+ * We restart the list every time to avoid a deadlock with\r
+ * deleting hubs downstream from this one. This should be\r
+ * safe since we delete the hub from the event list.\r
+ * Not the most efficient, but avoids deadlocks.\r
+ */\r
+\r
+ while (m<5) {\r
+ m++;\r
+ spin_lock_irqsave(&hub_event_lock, flags);\r
+\r
+ if (list_empty(&hub_event_list))\r
+ break;\r
+\r
+ /* Grab the next entry from the beginning of the list */\r
+ tmp = hub_event_list.next;\r
+\r
+ hub = list_entry(tmp, struct usb_hub, event_list);\r
+ dev = interface_to_usbdev(hub->intf);\r
+\r
+ list_del_init(tmp);\r
+\r
+ if (unlikely(down_trylock(&hub->khubd_sem)))\r
+ BUG(); /* never blocks, we were on list */\r
+\r
+ spin_unlock_irqrestore(&hub_event_lock, flags);\r
+\r
+ if (hub->error) {\r
+ dev_dbg (&hub->intf->dev, "resetting for error %d\n",\r
+ hub->error);\r
+\r
+ if (hub_reset(hub)) {\r
+ dev_dbg (&hub->intf->dev,\r
+ "can't reset; disconnecting\n");\r
+ up(&hub->khubd_sem);\r
+ hub_start_disconnect(dev);\r
+ continue;\r
+ }\r
+\r
+ hub->nerrors = 0;\r
+ hub->error = 0;\r
+ }\r
+\r
+ for (i = 0; i < hub->descriptor->bNbrPorts; i++) {\r
+ ret = hub_port_status(dev, i, &portstatus, &portchange);\r
+ if (ret < 0) {\r
+ continue;\r
+ }\r
+\r
+ if (portchange & USB_PORT_STAT_C_CONNECTION) {\r
+ hub_port_connect_change(hub, i, portstatus, portchange);\r
+ } else if (portchange & USB_PORT_STAT_C_ENABLE) {\r
+ dev_dbg (hubdev (dev),\r
+ "port %d enable change, status %x\n",\r
+ i + 1, portstatus);\r
+ clear_port_feature(dev,\r
+ i + 1, USB_PORT_FEAT_C_ENABLE);\r
+\r
+ /*\r
+ * EM interference sometimes causes badly\r
+ * shielded USB devices to be shutdown by\r
+ * the hub, this hack enables them again.\r
+ * Works at least with mouse driver. \r
+ */\r
+ if (!(portstatus & USB_PORT_STAT_ENABLE)\r
+ && (portstatus & USB_PORT_STAT_CONNECTION)\r
+ && (dev->children[i])) {\r
+ dev_err (&hub->intf->dev,\r
+ "port %i "\r
+ "disabled by hub (EMI?), "\r
+ "re-enabling...",\r
+ i + 1);\r
+ hub_port_connect_change(hub,\r
+ i, portstatus, portchange);\r
+ }\r
+ }\r
+\r
+ if (portchange & USB_PORT_STAT_C_SUSPEND) {\r
+ dev_dbg (&hub->intf->dev,\r
+ "suspend change on port %d\n",\r
+ i + 1);\r
+ clear_port_feature(dev,\r
+ i + 1, USB_PORT_FEAT_C_SUSPEND);\r
+ }\r
+ \r
+ if (portchange & USB_PORT_STAT_C_OVERCURRENT) {\r
+ dev_err (&hub->intf->dev,\r
+ "over-current change on port %d\n",\r
+ i + 1);\r
+ clear_port_feature(dev,\r
+ i + 1, USB_PORT_FEAT_C_OVER_CURRENT);\r
+ hub_power_on(hub);\r
+ }\r
+\r
+ if (portchange & USB_PORT_STAT_C_RESET) {\r
+ dev_dbg (&hub->intf->dev,\r
+ "reset change on port %d\n",\r
+ i + 1);\r
+ clear_port_feature(dev,\r
+ i + 1, USB_PORT_FEAT_C_RESET);\r
+ }\r
+ } /* end for i */\r
+\r
+ /* deal with hub status changes */\r
+ if (hub_hub_status(hub, &hubstatus, &hubchange) < 0)\r
+ dev_err (&hub->intf->dev, "get_hub_status failed\n");\r
+ else {\r
+ if (hubchange & HUB_CHANGE_LOCAL_POWER) {\r
+ dev_dbg (&hub->intf->dev, "power change\n");\r
+ clear_hub_feature(dev, C_HUB_LOCAL_POWER);\r
+ }\r
+ if (hubchange & HUB_CHANGE_OVERCURRENT) {\r
+ dev_dbg (&hub->intf->dev, "overcurrent change\n");\r
+ wait_ms(500); /* Cool down */\r
+ clear_hub_feature(dev, C_HUB_OVER_CURRENT);\r
+ hub_power_on(hub);\r
+ }\r
+ }\r
+ up(&hub->khubd_sem);\r
+ } /* end while (1) */\r
+\r
+ spin_unlock_irqrestore(&hub_event_lock, flags);\r
+}\r
+\r
+static int hub_thread(void *__hub)\r
+{\r
+ /*\r
+ * This thread doesn't need any user-level access,\r
+ * so get rid of all our resources\r
+ */\r
+\r
+ daemonize("khubd");\r
+ allow_signal(SIGKILL);\r
+ /* Send me a signal to get me die (for debugging) */\r
+ do {\r
+ \r
+ hub_events();\r
+ wait_event_interruptible(khubd_wait, !list_empty(&hub_event_list)); \r
+\r
+ if (current->flags & PF_FREEZE)\r
+ refrigerator(PF_IOTHREAD);\r
+\r
+ } while (!signal_pending(current));\r
+\r
+// dbg("hub_thread exiting");\r
+ complete_and_exit(&khubd_exited, 0);\r
+}\r
+\r
+static struct usb_device_id hub_id_table [] = {\r
+ { .match_flags = USB_DEVICE_ID_MATCH_DEV_CLASS,\r
+ .bDeviceClass = USB_CLASS_HUB},\r
+ { .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS,\r
+ .bInterfaceClass = USB_CLASS_HUB},\r
+ { } /* Terminating entry */\r
+};\r
+\r
+MODULE_DEVICE_TABLE (usb, hub_id_table);\r
+\r
+static struct usb_driver hub_driver = {\r
+ .owner = THIS_MODULE,\r
+ .name = "hub",\r
+ .probe = hub_probe,\r
+ .disconnect = hub_disconnect,\r
+ .ioctl = hub_ioctl,\r
+ .id_table = hub_id_table,\r
+};\r
+\r
+/*\r
+ * This should be a separate module.\r
+ */\r
+int usb_hub_init(void)\r
+{\r
+ pid_t pid;\r
+\r
+ if (usb_register(&hub_driver) < 0) {\r
+ err("Unable to register USB hub driver");\r
+ return -1;\r
+ }\r
+\r
+ pid = kernel_thread(hub_thread, NULL,\r
+ CLONE_FS | CLONE_FILES | CLONE_SIGHAND);\r
+ if (pid >= 0) {\r
+ khubd_pid = pid;\r
+ return 0;\r
+ }\r
+\r
+ /* Fall through if kernel_thread failed */\r
+ usb_deregister(&hub_driver);\r
+ err("failed to start hub_thread");\r
+\r
+ return -1;\r
+}\r
+\r
+void usb_hub_cleanup(void)\r
+{\r
+ int ret;\r
+\r
+ /* Kill the thread */\r
+ ret = kill_proc(khubd_pid, SIGKILL, 1);\r
+\r
+ wait_for_completion(&khubd_exited);\r
+\r
+ /*\r
+ * Hub resources are freed for us by usb_deregister. It calls\r
+ * usb_driver_purge on every device which in turn calls that\r
+ * devices disconnect function if it is using this driver.\r
+ * The hub_disconnect function takes care of releasing the\r
+ * individual hub resources. -greg\r
+ */\r
+ usb_deregister(&hub_driver);\r
+} /* usb_hub_cleanup() */\r
+\r
+/*\r
+ * WARNING - If a driver calls usb_reset_device, you should simulate a\r
+ * disconnect() and probe() for other interfaces you doesn't claim. This\r
+ * is left up to the driver writer right now. This insures other drivers\r
+ * have a chance to re-setup their interface.\r
+ *\r
+ * Take a look at proc_resetdevice in devio.c for some sample code to\r
+ * do this.\r
+ * Use this only from within your probe function, otherwise use\r
+ * usb_reset_device() below, which ensure proper locking\r
+ */\r
+int usb_physical_reset_device(struct usb_device *dev)\r
+{\r
+ struct usb_device *parent = dev->parent;\r
+ struct usb_device_descriptor *descriptor;\r
+ int i, ret, port = -1;\r
+\r
+ if (!parent) {\r
+ err("attempting to reset root hub!");\r
+ return -EINVAL;\r
+ }\r
+\r
+ for (i = 0; i < parent->maxchild; i++)\r
+ if (parent->children[i] == dev) {\r
+ port = i;\r
+ break;\r
+ }\r
+\r
+ if (port < 0)\r
+ return -ENOENT;\r
+\r
+ descriptor = kmalloc(sizeof *descriptor, GFP_NOIO);\r
+ if (!descriptor) {\r
+ return -ENOMEM;\r
+ }\r
+\r
+ down(&usb_address0_sem);\r
+\r
+ /* Send a reset to the device */\r
+ if (hub_port_reset(parent, port, dev, HUB_SHORT_RESET_TIME)) {\r
+ hub_port_disable(parent, port);\r
+ up(&usb_address0_sem);\r
+ kfree(descriptor);\r
+ return(-ENODEV);\r
+ }\r
+\r
+ /* Reprogram the Address */\r
+ ret = usb_set_address(dev);\r
+ if (ret < 0) {\r
+ err("USB device not accepting new address (error=%d)", ret);\r
+ hub_port_disable(parent, port);\r
+ up(&usb_address0_sem);\r
+ kfree(descriptor);\r
+ return ret;\r
+ }\r
+\r
+ /* Let the SET_ADDRESS settle */\r
+ wait_ms(10);\r
+\r
+ up(&usb_address0_sem);\r
+\r
+ /*\r
+ * Now we fetch the configuration descriptors for the device and\r
+ * see if anything has changed. If it has, we dump the current\r
+ * parsed descriptors and reparse from scratch. Then we leave\r
+ * the device alone for the caller to finish setting up.\r
+ *\r
+ * If nothing changed, we reprogram the configuration and then\r
+ * the alternate settings.\r
+ */\r
+\r
+ ret = usb_get_descriptor(dev, USB_DT_DEVICE, 0, descriptor,\r
+ sizeof(*descriptor));\r
+ if (ret < 0) {\r
+ kfree(descriptor);\r
+ return ret;\r
+ }\r
+\r
+ le16_to_cpus(&descriptor->bcdUSB);\r
+ le16_to_cpus(&descriptor->idVendor);\r
+ le16_to_cpus(&descriptor->idProduct);\r
+ le16_to_cpus(&descriptor->bcdDevice);\r
+\r
+ if (RtlCompareMemory(&dev->descriptor, descriptor, sizeof(*descriptor))) {\r
+ kfree(descriptor);\r
+ usb_destroy_configuration(dev);\r
+\r
+ ret = usb_get_device_descriptor(dev);\r
+ if (ret < sizeof(dev->descriptor)) {\r
+ if (ret < 0)\r
+ err("unable to get device %s descriptor "\r
+ "(error=%d)", dev->devpath, ret);\r
+ else\r
+ err("USB device %s descriptor short read "\r
+ "(expected %Zi, got %i)",\r
+ dev->devpath,\r
+ sizeof(dev->descriptor), ret);\r
+\r
+ clear_bit(dev->devnum, dev->bus->devmap.devicemap);\r
+ dev->devnum = -1;\r
+ return -EIO;\r
+ }\r
+\r
+ ret = usb_get_configuration(dev);\r
+ if (ret < 0) {\r
+ err("unable to get configuration (error=%d)", ret);\r
+ usb_destroy_configuration(dev);\r
+ clear_bit(dev->devnum, dev->bus->devmap.devicemap);\r
+ dev->devnum = -1;\r
+ return 1;\r
+ }\r
+\r
+ dev->actconfig = dev->config;\r
+ usb_set_maxpacket(dev);\r
+\r
+ return 1;\r
+ }\r
+\r
+ kfree(descriptor);\r
+\r
+ ret = usb_set_configuration(dev, dev->actconfig->desc.bConfigurationValue);\r
+ if (ret < 0) {\r
+ err("failed to set dev %s active configuration (error=%d)",\r
+ dev->devpath, ret);\r
+ return ret;\r
+ }\r
+\r
+ for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) {\r
+ struct usb_interface *intf = &dev->actconfig->interface[i];\r
+ struct usb_interface_descriptor *as;\r
+\r
+ as = &intf->altsetting[intf->act_altsetting].desc;\r
+ ret = usb_set_interface(dev, as->bInterfaceNumber,\r
+ as->bAlternateSetting);\r
+ if (ret < 0) {\r
+ err("failed to set active alternate setting "\r
+ "for dev %s interface %d (error=%d)",\r
+ dev->devpath, i, ret);\r
+ return ret;\r
+ }\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int usb_reset_device(struct usb_device *udev)\r
+{\r
+ //struct device *gdev = &udev->dev;\r
+ int r;\r
+ \r
+ down_read(&gdev->bus->subsys.rwsem);\r
+ r = usb_physical_reset_device(udev);\r
+ up_read(&gdev->bus->subsys.rwsem);\r
+\r
+ return r;\r
+}\r
+\r
+\r
--- /dev/null
+#ifndef __LINUX_HUB_H\r
+#define __LINUX_HUB_H\r
+\r
+/*\r
+ * Hub protocol and driver data structures.\r
+ *\r
+ * Some of these are known to the "virtual root hub" code\r
+ * in host controller drivers.\r
+ */\r
+#if 0\r
+#include <linux/list.h>\r
+#include <linux/workqueue.h>\r
+#include <linux/compiler.h> /* likely()/unlikely() */\r
+#endif \r
+/*\r
+ * Hub request types\r
+ */\r
+\r
+#define USB_RT_HUB (USB_TYPE_CLASS | USB_RECIP_DEVICE)\r
+#define USB_RT_PORT (USB_TYPE_CLASS | USB_RECIP_OTHER)\r
+\r
+/*\r
+ * Hub class requests\r
+ * See USB 2.0 spec Table 11-16\r
+ */\r
+#define HUB_CLEAR_TT_BUFFER 8\r
+#define HUB_RESET_TT 9\r
+#define HUB_GET_TT_STATE 10\r
+#define HUB_STOP_TT 11\r
+\r
+/*\r
+ * Hub Class feature numbers\r
+ * See USB 2.0 spec Table 11-17\r
+ */\r
+#define C_HUB_LOCAL_POWER 0\r
+#define C_HUB_OVER_CURRENT 1\r
+\r
+/*\r
+ * Port feature numbers\r
+ * See USB 2.0 spec Table 11-17\r
+ */\r
+#define USB_PORT_FEAT_CONNECTION 0\r
+#define USB_PORT_FEAT_ENABLE 1\r
+#define USB_PORT_FEAT_SUSPEND 2\r
+#define USB_PORT_FEAT_OVER_CURRENT 3\r
+#define USB_PORT_FEAT_RESET 4\r
+#define USB_PORT_FEAT_POWER 8\r
+#define USB_PORT_FEAT_LOWSPEED 9\r
+#define USB_PORT_FEAT_HIGHSPEED 10\r
+#define USB_PORT_FEAT_C_CONNECTION 16\r
+#define USB_PORT_FEAT_C_ENABLE 17\r
+#define USB_PORT_FEAT_C_SUSPEND 18\r
+#define USB_PORT_FEAT_C_OVER_CURRENT 19\r
+#define USB_PORT_FEAT_C_RESET 20\r
+#define USB_PORT_FEAT_TEST 21\r
+#define USB_PORT_FEAT_INDICATOR 22\r
+\r
+/* \r
+ * Hub Status and Hub Change results\r
+ * See USB 2.0 spec Table 11-19 and Table 11-20\r
+ */\r
+struct usb_port_status {\r
+ __u16 wPortStatus;\r
+ __u16 wPortChange; \r
+} __attribute__ ((packed));\r
+\r
+/* \r
+ * wPortStatus bit field\r
+ * See USB 2.0 spec Table 11-21\r
+ */\r
+#define USB_PORT_STAT_CONNECTION 0x0001\r
+#define USB_PORT_STAT_ENABLE 0x0002\r
+#define USB_PORT_STAT_SUSPEND 0x0004\r
+#define USB_PORT_STAT_OVERCURRENT 0x0008\r
+#define USB_PORT_STAT_RESET 0x0010\r
+/* bits 5 to 7 are reserved */\r
+#define USB_PORT_STAT_POWER 0x0100\r
+#define USB_PORT_STAT_LOW_SPEED 0x0200\r
+#define USB_PORT_STAT_HIGH_SPEED 0x0400\r
+#define USB_PORT_STAT_TEST 0x0800\r
+#define USB_PORT_STAT_INDICATOR 0x1000\r
+/* bits 13 to 15 are reserved */\r
+\r
+/* \r
+ * wPortChange bit field\r
+ * See USB 2.0 spec Table 11-22\r
+ * Bits 0 to 4 shown, bits 5 to 15 are reserved\r
+ */\r
+#define USB_PORT_STAT_C_CONNECTION 0x0001\r
+#define USB_PORT_STAT_C_ENABLE 0x0002\r
+#define USB_PORT_STAT_C_SUSPEND 0x0004\r
+#define USB_PORT_STAT_C_OVERCURRENT 0x0008\r
+#define USB_PORT_STAT_C_RESET 0x0010\r
+\r
+/*\r
+ * wHubCharacteristics (masks) \r
+ * See USB 2.0 spec Table 11-13, offset 3\r
+ */\r
+#define HUB_CHAR_LPSM 0x0003 /* D1 .. D0 */\r
+#define HUB_CHAR_COMPOUND 0x0004 /* D2 */\r
+#define HUB_CHAR_OCPM 0x0018 /* D4 .. D3 */\r
+#define HUB_CHAR_TTTT 0x0060 /* D6 .. D5 */\r
+#define HUB_CHAR_PORTIND 0x0080 /* D7 */\r
+\r
+struct usb_hub_status {\r
+ __u16 wHubStatus;\r
+ __u16 wHubChange;\r
+} __attribute__ ((packed));\r
+\r
+/*\r
+ * Hub Status & Hub Change bit masks\r
+ * See USB 2.0 spec Table 11-19 and Table 11-20\r
+ * Bits 0 and 1 for wHubStatus and wHubChange\r
+ * Bits 2 to 15 are reserved for both\r
+ */\r
+#define HUB_STATUS_LOCAL_POWER 0x0001\r
+#define HUB_STATUS_OVERCURRENT 0x0002\r
+#define HUB_CHANGE_LOCAL_POWER 0x0001\r
+#define HUB_CHANGE_OVERCURRENT 0x0002\r
+\r
+\r
+/* \r
+ * Hub descriptor \r
+ * See USB 2.0 spec Table 11-13\r
+ */\r
+\r
+#define USB_DT_HUB (USB_TYPE_CLASS | 0x09)\r
+#define USB_DT_HUB_NONVAR_SIZE 7\r
+\r
+struct usb_hub_descriptor {\r
+ __u8 bDescLength;\r
+ __u8 bDescriptorType;\r
+ __u8 bNbrPorts;\r
+ __u16 wHubCharacteristics;\r
+ __u8 bPwrOn2PwrGood;\r
+ __u8 bHubContrCurrent;\r
+ /* add 1 bit for hub status change; round to bytes */\r
+ __u8 DeviceRemovable[(USB_MAXCHILDREN + 1 + 7) / 8];\r
+ __u8 PortPwrCtrlMask[(USB_MAXCHILDREN + 1 + 7) / 8];\r
+} __attribute__ ((packed));\r
+\r
+struct usb_device;\r
+\r
+/*\r
+ * As of USB 2.0, full/low speed devices are segregated into trees.\r
+ * One type grows from USB 1.1 host controllers (OHCI, UHCI etc).\r
+ * The other type grows from high speed hubs when they connect to\r
+ * full/low speed devices using "Transaction Translators" (TTs).\r
+ *\r
+ * TTs should only be known to the hub driver, and high speed bus\r
+ * drivers (only EHCI for now). They affect periodic scheduling and\r
+ * sometimes control/bulk error recovery.\r
+ */\r
+struct usb_tt {\r
+ struct usb_device *hub; /* upstream highspeed hub */\r
+ int multi; /* true means one TT per port */\r
+\r
+ /* for control/bulk error recovery (CLEAR_TT_BUFFER) */\r
+ spinlock_t lock;\r
+ struct list_head clear_list; /* of usb_tt_clear */\r
+ struct work_struct kevent;\r
+};\r
+\r
+struct usb_tt_clear {\r
+ struct list_head clear_list;\r
+ unsigned tt;\r
+ u16 devinfo;\r
+};\r
+\r
+extern void usb_hub_tt_clear_buffer (struct usb_device *dev, int pipe);\r
+\r
+struct usb_hub {\r
+ struct usb_interface *intf; /* the "real" device */\r
+ struct urb *urb; /* for interrupt polling pipe */\r
+\r
+ /* buffer for urb ... 1 bit each for hub and children, rounded up */\r
+ char (*buffer)[(USB_MAXCHILDREN + 1 + 7) / 8];\r
+ dma_addr_t buffer_dma; /* DMA address for buffer */\r
+ union {\r
+ struct usb_hub_status hub;\r
+ struct usb_port_status port;\r
+ } *status; /* buffer for status reports */\r
+\r
+ int error; /* last reported error */\r
+ int nerrors; /* track consecutive errors */\r
+\r
+ struct list_head hub_list; /* all hubs */\r
+ struct list_head event_list; /* hubs w/data or errs ready */\r
+\r
+ struct usb_hub_descriptor *descriptor; /* class descriptor */\r
+ struct semaphore khubd_sem;\r
+ struct usb_tt tt; /* Transaction Translator */\r
+};\r
+\r
+#endif /* __LINUX_HUB_H */\r
--- /dev/null
+PATH_TO_TOP = ../../../..\r
+\r
+TARGET_TYPE = export_driver\r
+\r
+TARGET_NAME = usbcore\r
+\r
+TARGET_DDKLIBS = ntoskrnl.a\r
+\r
+TARGET_CFLAGS = -Wall -I$(PATH_TO_TOP)/ntoskrnl/include\r
+\r
+TARGET_OBJECTS = \\r
+ message.o hcd.o hcd-pci.o hub.o usb.o config.o urb.o \\r
+ buffer_simple.o usb-debug.o ../sys/ros_wrapper.o \\r
+ ../sys/linuxwrapper.o usbcore.o\r
+\r
+include $(PATH_TO_TOP)/rules.mak\r
+\r
+include $(TOOLS_PATH)/helper.mk\r
--- /dev/null
+\r
+O_TARGET := message.o hcd.o hcd-pci.o hub.o usb.o config.o urb.o buffer_simple.o urb.o usb-debug.o\r
+\r
+#O_TARGET := urb.o\r
+\r
+include $(TOPDIR)/Rules.make\r
--- /dev/null
+/*\r
+ * message.c - synchronous message handling\r
+ */\r
+#if 0\r
+#include <linux/pci.h> /* for scatterlist macros */\r
+#include <linux/usb.h>\r
+#include <linux/module.h>\r
+#include <linux/slab.h>\r
+#include <linux/init.h>\r
+#include <linux/mm.h>\r
+#include <asm/byteorder.h>\r
+#else\r
+#include "../usb_wrapper.h"\r
+#endif\r
+\r
+#include "hcd.h" /* for usbcore internals */\r
+\r
+struct usb_api_data {\r
+ wait_queue_head_t wqh;\r
+ int done;\r
+};\r
+\r
+static void usb_api_blocking_completion(struct urb *urb, struct pt_regs *regs)\r
+{\r
+ struct usb_api_data *awd = (struct usb_api_data *)urb->context;\r
+\r
+ awd->done = 1;\r
+ wmb();\r
+ wake_up(&awd->wqh);\r
+}\r
+\r
+// Starts urb and waits for completion or timeout\r
+static int usb_start_wait_urb(struct urb *urb, int timeout, int* actual_length)\r
+{ \r
+ //DECLARE_WAITQUEUE(wait, current); // Fireball, 24Jan05 - silent gcc complaining about unused wait variable\r
+ struct usb_api_data awd;\r
+ int status;\r
+\r
+ init_waitqueue_head(&awd.wqh); \r
+ awd.done = 0;\r
+\r
+ set_current_state(TASK_UNINTERRUPTIBLE);\r
+ add_wait_queue(&awd.wqh, &wait);\r
+\r
+ urb->context = &awd;\r
+ status = usb_submit_urb(urb, GFP_ATOMIC);\r
+ if (status) {\r
+ // something went wrong\r
+ usb_free_urb(urb);\r
+ set_current_state(TASK_RUNNING);\r
+ remove_wait_queue(&awd.wqh, &wait);\r
+ return status;\r
+ }\r
+ \r
+ while (timeout && !awd.done)\r
+ { \r
+ timeout = schedule_timeout(timeout);\r
+ set_current_state(TASK_UNINTERRUPTIBLE);\r
+ rmb();\r
+ }\r
+\r
+ set_current_state(TASK_RUNNING);\r
+ remove_wait_queue(&awd.wqh, &wait);\r
+\r
+ if (!timeout && !awd.done) {\r
+ if (urb->status != -EINPROGRESS) { /* No callback?!! */\r
+ printk(KERN_ERR "usb: raced timeout, "\r
+ "pipe 0x%x status %d time left %d\n",\r
+ urb->pipe, urb->status, timeout);\r
+ status = urb->status;\r
+ } else {\r
+ warn("usb_control/bulk_msg: timeout");\r
+ usb_unlink_urb(urb); // remove urb safely\r
+ status = -ETIMEDOUT;\r
+ }\r
+ } else\r
+ status = urb->status;\r
+\r
+ if (actual_length)\r
+ *actual_length = urb->actual_length;\r
+\r
+ usb_free_urb(urb);\r
+ return status;\r
+}\r
+\r
+/*-------------------------------------------------------------------*/\r
+// returns status (negative) or length (positive)\r
+int usb_internal_control_msg(struct usb_device *usb_dev, unsigned int pipe, \r
+ struct usb_ctrlrequest *cmd, void *data, int len, int timeout)\r
+{\r
+ struct urb *urb;\r
+ int retv;\r
+ int length;\r
+\r
+ urb = usb_alloc_urb(0, GFP_NOIO);\r
+ if (!urb)\r
+ return -ENOMEM;\r
+ \r
+ usb_fill_control_urb(urb, usb_dev, pipe, (unsigned char*)cmd, data, len,\r
+ usb_api_blocking_completion, 0);\r
+\r
+ retv = usb_start_wait_urb(urb, timeout, &length);\r
+\r
+ if (retv < 0)\r
+ return retv;\r
+ else\r
+ return length;\r
+}\r
+\r
+/**\r
+ * usb_control_msg - Builds a control urb, sends it off and waits for completion\r
+ * @dev: pointer to the usb device to send the message to\r
+ * @pipe: endpoint "pipe" to send the message to\r
+ * @request: USB message request value\r
+ * @requesttype: USB message request type value\r
+ * @value: USB message value\r
+ * @index: USB message index value\r
+ * @data: pointer to the data to send\r
+ * @size: length in bytes of the data to send\r
+ * @timeout: time in jiffies to wait for the message to complete before\r
+ * timing out (if 0 the wait is forever)\r
+ * Context: !in_interrupt ()\r
+ *\r
+ * This function sends a simple control message to a specified endpoint\r
+ * and waits for the message to complete, or timeout.\r
+ * \r
+ * If successful, it returns the number of bytes transferred, otherwise a negative error number.\r
+ *\r
+ * Don't use this function from within an interrupt context, like a\r
+ * bottom half handler. If you need an asynchronous message, or need to send\r
+ * a message from within interrupt context, use usb_submit_urb()\r
+ * If a thread in your driver uses this call, make sure your disconnect()\r
+ * method can wait for it to complete. Since you don't have a handle on\r
+ * the URB used, you can't cancel the request.\r
+ */\r
+int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request, __u8 requesttype,\r
+ __u16 value, __u16 index, void *data, __u16 size, int timeout)\r
+{\r
+ struct usb_ctrlrequest *dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_NOIO);\r
+ int ret;\r
+ \r
+ if (!dr)\r
+ return -ENOMEM;\r
+\r
+ dr->bRequestType= requesttype;\r
+ dr->bRequest = request;\r
+ dr->wValue = cpu_to_le16p(&value);\r
+ dr->wIndex = cpu_to_le16p(&index);\r
+ dr->wLength = cpu_to_le16p(&size);\r
+\r
+ //dbg("usb_control_msg"); \r
+\r
+ ret = usb_internal_control_msg(dev, pipe, dr, data, size, timeout);\r
+\r
+ kfree(dr);\r
+\r
+ return ret;\r
+}\r
+\r
+\r
+/**\r
+ * usb_bulk_msg - Builds a bulk urb, sends it off and waits for completion\r
+ * @usb_dev: pointer to the usb device to send the message to\r
+ * @pipe: endpoint "pipe" to send the message to\r
+ * @data: pointer to the data to send\r
+ * @len: length in bytes of the data to send\r
+ * @actual_length: pointer to a location to put the actual length transferred in bytes\r
+ * @timeout: time in jiffies to wait for the message to complete before\r
+ * timing out (if 0 the wait is forever)\r
+ * Context: !in_interrupt ()\r
+ *\r
+ * This function sends a simple bulk message to a specified endpoint\r
+ * and waits for the message to complete, or timeout.\r
+ * \r
+ * If successful, it returns 0, otherwise a negative error number.\r
+ * The number of actual bytes transferred will be stored in the \r
+ * actual_length paramater.\r
+ *\r
+ * Don't use this function from within an interrupt context, like a\r
+ * bottom half handler. If you need an asynchronous message, or need to\r
+ * send a message from within interrupt context, use usb_submit_urb()\r
+ * If a thread in your driver uses this call, make sure your disconnect()\r
+ * method can wait for it to complete. Since you don't have a handle on\r
+ * the URB used, you can't cancel the request.\r
+ */\r
+int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, \r
+ void *data, int len, int *actual_length, int timeout)\r
+{\r
+ struct urb *urb;\r
+\r
+ if (len < 0)\r
+ return -EINVAL;\r
+\r
+ urb=usb_alloc_urb(0, GFP_KERNEL);\r
+ if (!urb)\r
+ return -ENOMEM;\r
+\r
+ usb_fill_bulk_urb(urb, usb_dev, pipe, data, len,\r
+ usb_api_blocking_completion, 0);\r
+\r
+ return usb_start_wait_urb(urb,timeout,actual_length);\r
+}\r
+\r
+/*-------------------------------------------------------------------*/\r
+//#warning "Scatter-gather stuff disabled"\r
+#if 0\r
+static void sg_clean (struct usb_sg_request *io)\r
+{\r
+ if (io->urbs) {\r
+ while (io->entries--)\r
+ usb_free_urb (io->urbs [io->entries]);\r
+ kfree (io->urbs);\r
+ io->urbs = 0;\r
+ }\r
+ if (io->dev->dev.dma_mask != 0)\r
+ usb_buffer_unmap_sg (io->dev, io->pipe, io->sg, io->nents);\r
+ io->dev = 0;\r
+}\r
+\r
+static void sg_complete (struct urb *urb, struct pt_regs *regs)\r
+{\r
+ struct usb_sg_request *io = (struct usb_sg_request *) urb->context;\r
+ unsigned long flags;\r
+\r
+ spin_lock_irqsave (&io->lock, flags);\r
+\r
+ /* In 2.5 we require hcds' endpoint queues not to progress after fault\r
+ * reports, until the completion callback (this!) returns. That lets\r
+ * device driver code (like this routine) unlink queued urbs first,\r
+ * if it needs to, since the HC won't work on them at all. So it's\r
+ * not possible for page N+1 to overwrite page N, and so on.\r
+ *\r
+ * That's only for "hard" faults; "soft" faults (unlinks) sometimes\r
+ * complete before the HCD can get requests away from hardware,\r
+ * though never during cleanup after a hard fault.\r
+ */\r
+ if (io->status\r
+ && (io->status != -ECONNRESET\r
+ || urb->status != -ECONNRESET)\r
+ && urb->actual_length) {\r
+ dev_err (io->dev->bus->controller,\r
+ "dev %s ep%d%s scatterlist error %d/%d\n",\r
+ io->dev->devpath,\r
+ usb_pipeendpoint (urb->pipe),\r
+ usb_pipein (urb->pipe) ? "in" : "out",\r
+ urb->status, io->status);\r
+ // BUG ();\r
+ }\r
+\r
+ if (urb->status && urb->status != -ECONNRESET) {\r
+ int i, found, status;\r
+\r
+ io->status = urb->status;\r
+\r
+ /* the previous urbs, and this one, completed already.\r
+ * unlink the later ones so they won't rx/tx bad data,\r
+ *\r
+ * FIXME don't bother unlinking urbs that haven't yet been\r
+ * submitted; those non-error cases shouldn't be syslogged\r
+ */\r
+ for (i = 0, found = 0; i < io->entries; i++) {\r
+ if (found) {\r
+ status = usb_unlink_urb (io->urbs [i]);\r
+ if (status && status != -EINPROGRESS)\r
+ err ("sg_complete, unlink --> %d",\r
+ status);\r
+ } else if (urb == io->urbs [i])\r
+ found = 1;\r
+ }\r
+ }\r
+\r
+ /* on the last completion, signal usb_sg_wait() */\r
+ io->bytes += urb->actual_length;\r
+ io->count--;\r
+ if (!io->count)\r
+ complete (&io->complete);\r
+\r
+ spin_unlock_irqrestore (&io->lock, flags);\r
+}\r
+\r
+\r
+/**\r
+ * usb_sg_init - initializes scatterlist-based bulk/interrupt I/O request\r
+ * @io: request block being initialized. until usb_sg_wait() returns,\r
+ * treat this as a pointer to an opaque block of memory,\r
+ * @dev: the usb device that will send or receive the data\r
+ * @pipe: endpoint "pipe" used to transfer the data\r
+ * @period: polling rate for interrupt endpoints, in frames or\r
+ * (for high speed endpoints) microframes; ignored for bulk\r
+ * @sg: scatterlist entries\r
+ * @nents: how many entries in the scatterlist\r
+ * @length: how many bytes to send from the scatterlist, or zero to\r
+ * send every byte identified in the list.\r
+ * @mem_flags: SLAB_* flags affecting memory allocations in this call\r
+ *\r
+ * Returns zero for success, else a negative errno value. This initializes a\r
+ * scatter/gather request, allocating resources such as I/O mappings and urb\r
+ * memory (except maybe memory used by USB controller drivers).\r
+ *\r
+ * The request must be issued using usb_sg_wait(), which waits for the I/O to\r
+ * complete (or to be canceled) and then cleans up all resources allocated by\r
+ * usb_sg_init().\r
+ *\r
+ * The request may be canceled with usb_sg_cancel(), either before or after\r
+ * usb_sg_wait() is called.\r
+ */\r
+int usb_sg_init (\r
+ struct usb_sg_request *io,\r
+ struct usb_device *dev,\r
+ unsigned pipe, \r
+ unsigned period,\r
+ struct scatterlist *sg,\r
+ int nents,\r
+ size_t length,\r
+ int mem_flags\r
+)\r
+{\r
+ int i;\r
+ int urb_flags;\r
+ int dma;\r
+\r
+ if (!io || !dev || !sg\r
+ || usb_pipecontrol (pipe)\r
+ || usb_pipeisoc (pipe)\r
+ || nents <= 0)\r
+ return -EINVAL;\r
+\r
+ spin_lock_init (&io->lock);\r
+ io->dev = dev;\r
+ io->pipe = pipe;\r
+ io->sg = sg;\r
+ io->nents = nents;\r
+\r
+ /* not all host controllers use DMA (like the mainstream pci ones);\r
+ * they can use PIO (sl811) or be software over another transport.\r
+ */\r
+ dma = (dev->dev.dma_mask != 0);\r
+ if (dma)\r
+ io->entries = usb_buffer_map_sg (dev, pipe, sg, nents);\r
+ else\r
+ io->entries = nents;\r
+\r
+ /* initialize all the urbs we'll use */\r
+ if (io->entries <= 0)\r
+ return io->entries;\r
+\r
+ io->count = 0;\r
+ io->urbs = kmalloc (io->entries * sizeof *io->urbs, mem_flags);\r
+ if (!io->urbs)\r
+ goto nomem;\r
+\r
+ urb_flags = URB_ASYNC_UNLINK | URB_NO_DMA_MAP | URB_NO_INTERRUPT;\r
+ if (usb_pipein (pipe))\r
+ urb_flags |= URB_SHORT_NOT_OK;\r
+\r
+ for (i = 0; i < io->entries; i++, io->count = i) {\r
+ unsigned len;\r
+\r
+ io->urbs [i] = usb_alloc_urb (0, mem_flags);\r
+ if (!io->urbs [i]) {\r
+ io->entries = i;\r
+ goto nomem;\r
+ }\r
+\r
+ io->urbs [i]->dev = dev;\r
+ io->urbs [i]->pipe = pipe;\r
+ io->urbs [i]->interval = period;\r
+ io->urbs [i]->transfer_flags = urb_flags;\r
+\r
+ io->urbs [i]->complete = sg_complete;\r
+ io->urbs [i]->context = io;\r
+ io->urbs [i]->status = -EINPROGRESS;\r
+ io->urbs [i]->actual_length = 0;\r
+\r
+ if (dma) {\r
+ /* hc may use _only_ transfer_dma */\r
+ io->urbs [i]->transfer_dma = sg_dma_address (sg + i);\r
+ len = sg_dma_len (sg + i);\r
+ } else {\r
+ /* hc may use _only_ transfer_buffer */\r
+ io->urbs [i]->transfer_buffer =\r
+ page_address (sg [i].page) + sg [i].offset;\r
+ len = sg [i].length;\r
+ }\r
+\r
+ if (length) {\r
+ len = min_t (unsigned, len, length);\r
+ length -= len;\r
+ if (length == 0)\r
+ io->entries = i + 1;\r
+ }\r
+ io->urbs [i]->transfer_buffer_length = len;\r
+ }\r
+ io->urbs [--i]->transfer_flags &= ~URB_NO_INTERRUPT;\r
+\r
+ /* transaction state */\r
+ io->status = 0;\r
+ io->bytes = 0;\r
+ init_completion (&io->complete);\r
+ return 0;\r
+\r
+nomem:\r
+ sg_clean (io);\r
+ return -ENOMEM;\r
+}\r
+\r
+\r
+/**\r
+ * usb_sg_wait - synchronously execute scatter/gather request\r
+ * @io: request block handle, as initialized with usb_sg_init().\r
+ * some fields become accessible when this call returns.\r
+ * Context: !in_interrupt ()\r
+ *\r
+ * This function blocks until the specified I/O operation completes. It\r
+ * leverages the grouping of the related I/O requests to get good transfer\r
+ * rates, by queueing the requests. At higher speeds, such queuing can\r
+ * significantly improve USB throughput.\r
+ *\r
+ * There are three kinds of completion for this function.\r
+ * (1) success, where io->status is zero. The number of io->bytes\r
+ * transferred is as requested.\r
+ * (2) error, where io->status is a negative errno value. The number\r
+ * of io->bytes transferred before the error is usually less\r
+ * than requested, and can be nonzero.\r
+ * (3) cancelation, a type of error with status -ECONNRESET that\r
+ * is initiated by usb_sg_cancel().\r
+ *\r
+ * When this function returns, all memory allocated through usb_sg_init() or\r
+ * this call will have been freed. The request block parameter may still be\r
+ * passed to usb_sg_cancel(), or it may be freed. It could also be\r
+ * reinitialized and then reused.\r
+ *\r
+ * Data Transfer Rates:\r
+ *\r
+ * Bulk transfers are valid for full or high speed endpoints.\r
+ * The best full speed data rate is 19 packets of 64 bytes each\r
+ * per frame, or 1216 bytes per millisecond.\r
+ * The best high speed data rate is 13 packets of 512 bytes each\r
+ * per microframe, or 52 KBytes per millisecond.\r
+ *\r
+ * The reason to use interrupt transfers through this API would most likely\r
+ * be to reserve high speed bandwidth, where up to 24 KBytes per millisecond\r
+ * could be transferred. That capability is less useful for low or full\r
+ * speed interrupt endpoints, which allow at most one packet per millisecond,\r
+ * of at most 8 or 64 bytes (respectively).\r
+ */\r
+void usb_sg_wait (struct usb_sg_request *io)\r
+{\r
+ int i;\r
+ unsigned long flags;\r
+\r
+ /* queue the urbs. */\r
+ spin_lock_irqsave (&io->lock, flags);\r
+ for (i = 0; i < io->entries && !io->status; i++) {\r
+ int retval;\r
+\r
+ retval = usb_submit_urb (io->urbs [i], SLAB_ATOMIC);\r
+\r
+ /* after we submit, let completions or cancelations fire;\r
+ * we handshake using io->status.\r
+ */\r
+ spin_unlock_irqrestore (&io->lock, flags);\r
+ switch (retval) {\r
+ /* maybe we retrying will recover */\r
+ case -ENXIO: // hc didn't queue this one\r
+ case -EAGAIN:\r
+ case -ENOMEM:\r
+ retval = 0;\r
+ i--;\r
+ // FIXME: should it usb_sg_cancel() on INTERRUPT?\r
+ yield ();\r
+ break;\r
+\r
+ /* no error? continue immediately.\r
+ *\r
+ * NOTE: to work better with UHCI (4K I/O buffer may\r
+ * need 3K of TDs) it may be good to limit how many\r
+ * URBs are queued at once; N milliseconds?\r
+ */\r
+ case 0:\r
+ cpu_relax ();\r
+ break;\r
+\r
+ /* fail any uncompleted urbs */\r
+ default:\r
+ io->urbs [i]->status = retval;\r
+ dbg ("usb_sg_msg, submit --> %d", retval);\r
+ usb_sg_cancel (io);\r
+ }\r
+ spin_lock_irqsave (&io->lock, flags);\r
+ if (retval && io->status == -ECONNRESET)\r
+ io->status = retval;\r
+ }\r
+ spin_unlock_irqrestore (&io->lock, flags);\r
+\r
+ /* OK, yes, this could be packaged as non-blocking.\r
+ * So could the submit loop above ... but it's easier to\r
+ * solve neither problem than to solve both!\r
+ */\r
+ wait_for_completion (&io->complete);\r
+\r
+ sg_clean (io);\r
+}\r
+\r
+/**\r
+ * usb_sg_cancel - stop scatter/gather i/o issued by usb_sg_wait()\r
+ * @io: request block, initialized with usb_sg_init()\r
+ *\r
+ * This stops a request after it has been started by usb_sg_wait().\r
+ * It can also prevents one initialized by usb_sg_init() from starting,\r
+ * so that call just frees resources allocated to the request.\r
+ */\r
+void usb_sg_cancel (struct usb_sg_request *io)\r
+{\r
+ unsigned long flags;\r
+\r
+ spin_lock_irqsave (&io->lock, flags);\r
+\r
+ /* shut everything down, if it didn't already */\r
+ if (!io->status) {\r
+ int i;\r
+\r
+ io->status = -ECONNRESET;\r
+ for (i = 0; i < io->entries; i++) {\r
+ int retval;\r
+\r
+ if (!io->urbs [i]->dev)\r
+ continue;\r
+ retval = usb_unlink_urb (io->urbs [i]);\r
+ if (retval && retval != -EINPROGRESS)\r
+ warn ("usb_sg_cancel, unlink --> %d", retval);\r
+ // FIXME don't warn on "not yet submitted" error\r
+ }\r
+ }\r
+ spin_unlock_irqrestore (&io->lock, flags);\r
+}\r
+#endif\r
+/*-------------------------------------------------------------------*/\r
+\r
+/**\r
+ * usb_get_descriptor - issues a generic GET_DESCRIPTOR request\r
+ * @dev: the device whose descriptor is being retrieved\r
+ * @type: the descriptor type (USB_DT_*)\r
+ * @index: the number of the descriptor\r
+ * @buf: where to put the descriptor\r
+ * @size: how big is "buf"?\r
+ * Context: !in_interrupt ()\r
+ *\r
+ * Gets a USB descriptor. Convenience functions exist to simplify\r
+ * getting some types of descriptors. Use\r
+ * usb_get_device_descriptor() for USB_DT_DEVICE,\r
+ * and usb_get_string() or usb_string() for USB_DT_STRING.\r
+ * Configuration descriptors (USB_DT_CONFIG) are part of the device\r
+ * structure, at least for the current configuration.\r
+ * In addition to a number of USB-standard descriptors, some\r
+ * devices also use class-specific or vendor-specific descriptors.\r
+ *\r
+ * This call is synchronous, and may not be used in an interrupt context.\r
+ *\r
+ * Returns the number of bytes received on success, or else the status code\r
+ * returned by the underlying usb_control_msg() call.\r
+ */\r
+int usb_get_descriptor(struct usb_device *dev, unsigned char type, unsigned char index, void *buf, int size)\r
+{\r
+ int i = 5;\r
+ int result;\r
+ \r
+ memset(buf,0,size); // Make sure we parse really received data\r
+\r
+ while (i--) {\r
+ /* retries if the returned length was 0; flakey device */\r
+ if ((result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),\r
+ USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,\r
+ (type << 8) + index, 0, buf, size,\r
+ HZ * USB_CTRL_GET_TIMEOUT)) > 0\r
+ || result == -EPIPE)\r
+ break;\r
+ }\r
+ return result;\r
+}\r
+\r
+/**\r
+ * usb_get_string - gets a string descriptor\r
+ * @dev: the device whose string descriptor is being retrieved\r
+ * @langid: code for language chosen (from string descriptor zero)\r
+ * @index: the number of the descriptor\r
+ * @buf: where to put the string\r
+ * @size: how big is "buf"?\r
+ * Context: !in_interrupt ()\r
+ *\r
+ * Retrieves a string, encoded using UTF-16LE (Unicode, 16 bits per character,\r
+ * in little-endian byte order).\r
+ * The usb_string() function will often be a convenient way to turn\r
+ * these strings into kernel-printable form.\r
+ *\r
+ * Strings may be referenced in device, configuration, interface, or other\r
+ * descriptors, and could also be used in vendor-specific ways.\r
+ *\r
+ * This call is synchronous, and may not be used in an interrupt context.\r
+ *\r
+ * Returns the number of bytes received on success, or else the status code\r
+ * returned by the underlying usb_control_msg() call.\r
+ */\r
+int usb_get_string(struct usb_device *dev, unsigned short langid, unsigned char index, void *buf, int size)\r
+{\r
+ return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),\r
+ USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,\r
+ (USB_DT_STRING << 8) + index, langid, buf, size,\r
+ HZ * USB_CTRL_GET_TIMEOUT);\r
+}\r
+\r
+/**\r
+ * usb_get_device_descriptor - (re)reads the device descriptor\r
+ * @dev: the device whose device descriptor is being updated\r
+ * Context: !in_interrupt ()\r
+ *\r
+ * Updates the copy of the device descriptor stored in the device structure,\r
+ * which dedicates space for this purpose. Note that several fields are\r
+ * converted to the host CPU's byte order: the USB version (bcdUSB), and\r
+ * vendors product and version fields (idVendor, idProduct, and bcdDevice).\r
+ * That lets device drivers compare against non-byteswapped constants.\r
+ *\r
+ * There's normally no need to use this call, although some devices\r
+ * will change their descriptors after events like updating firmware.\r
+ *\r
+ * This call is synchronous, and may not be used in an interrupt context.\r
+ *\r
+ * Returns the number of bytes received on success, or else the status code\r
+ * returned by the underlying usb_control_msg() call.\r
+ */\r
+int usb_get_device_descriptor(struct usb_device *dev)\r
+{\r
+ int ret = usb_get_descriptor(dev, USB_DT_DEVICE, 0, &dev->descriptor,\r
+ sizeof(dev->descriptor));\r
+ if (ret >= 0) {\r
+ le16_to_cpus(&dev->descriptor.bcdUSB);\r
+ le16_to_cpus(&dev->descriptor.idVendor);\r
+ le16_to_cpus(&dev->descriptor.idProduct);\r
+ le16_to_cpus(&dev->descriptor.bcdDevice);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/**\r
+ * usb_get_status - issues a GET_STATUS call\r
+ * @dev: the device whose status is being checked\r
+ * @type: USB_RECIP_*; for device, interface, or endpoint\r
+ * @target: zero (for device), else interface or endpoint number\r
+ * @data: pointer to two bytes of bitmap data\r
+ * Context: !in_interrupt ()\r
+ *\r
+ * Returns device, interface, or endpoint status. Normally only of\r
+ * interest to see if the device is self powered, or has enabled the\r
+ * remote wakeup facility; or whether a bulk or interrupt endpoint\r
+ * is halted ("stalled").\r
+ *\r
+ * Bits in these status bitmaps are set using the SET_FEATURE request,\r
+ * and cleared using the CLEAR_FEATURE request. The usb_clear_halt()\r
+ * function should be used to clear halt ("stall") status.\r
+ *\r
+ * This call is synchronous, and may not be used in an interrupt context.\r
+ *\r
+ * Returns the number of bytes received on success, or else the status code\r
+ * returned by the underlying usb_control_msg() call.\r
+ */\r
+int usb_get_status(struct usb_device *dev, int type, int target, void *data)\r
+{\r
+ return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),\r
+ USB_REQ_GET_STATUS, USB_DIR_IN | type, 0, target, data, 2,\r
+ HZ * USB_CTRL_GET_TIMEOUT);\r
+}\r
+\r
+\r
+// hub-only!! ... and only exported for reset/reinit path.\r
+// otherwise used internally, when setting up a config\r
+void usb_set_maxpacket(struct usb_device *dev)\r
+{\r
+ int i, b;\r
+\r
+ /* NOTE: affects all endpoints _except_ ep0 */\r
+ for (i=0; i<dev->actconfig->desc.bNumInterfaces; i++) {\r
+ struct usb_interface *ifp = dev->actconfig->interface + i;\r
+ struct usb_host_interface *as = ifp->altsetting + ifp->act_altsetting;\r
+ struct usb_host_endpoint *ep = as->endpoint;\r
+ int e;\r
+\r
+ for (e=0; e<as->desc.bNumEndpoints; e++) {\r
+ struct usb_endpoint_descriptor *d;\r
+ d = &ep [e].desc;\r
+ b = d->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;\r
+ if ((d->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==\r
+ USB_ENDPOINT_XFER_CONTROL) { /* Control => bidirectional */\r
+ dev->epmaxpacketout[b] = d->wMaxPacketSize;\r
+ dev->epmaxpacketin [b] = d->wMaxPacketSize;\r
+ }\r
+ else if (usb_endpoint_out(d->bEndpointAddress)) {\r
+ if (d->wMaxPacketSize > dev->epmaxpacketout[b])\r
+ dev->epmaxpacketout[b] = d->wMaxPacketSize;\r
+ }\r
+ else {\r
+ if (d->wMaxPacketSize > dev->epmaxpacketin [b])\r
+ dev->epmaxpacketin [b] = d->wMaxPacketSize;\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+/**\r
+ * usb_clear_halt - tells device to clear endpoint halt/stall condition\r
+ * @dev: device whose endpoint is halted\r
+ * @pipe: endpoint "pipe" being cleared\r
+ * Context: !in_interrupt ()\r
+ *\r
+ * This is used to clear halt conditions for bulk and interrupt endpoints,\r
+ * as reported by URB completion status. Endpoints that are halted are\r
+ * sometimes referred to as being "stalled". Such endpoints are unable\r
+ * to transmit or receive data until the halt status is cleared. Any URBs\r
+ * queued for such an endpoint should normally be unlinked by the driver\r
+ * before clearing the halt condition, as described in sections 5.7.5\r
+ * and 5.8.5 of the USB 2.0 spec.\r
+ *\r
+ * Note that control and isochronous endpoints don't halt, although control\r
+ * endpoints report "protocol stall" (for unsupported requests) using the\r
+ * same status code used to report a true stall.\r
+ *\r
+ * This call is synchronous, and may not be used in an interrupt context.\r
+ *\r
+ * Returns zero on success, or else the status code returned by the\r
+ * underlying usb_control_msg() call.\r
+ */\r
+int usb_clear_halt(struct usb_device *dev, int pipe)\r
+{\r
+ int result;\r
+ int endp = usb_pipeendpoint(pipe);\r
+ \r
+ if (usb_pipein (pipe))\r
+ endp |= USB_DIR_IN;\r
+\r
+ /* we don't care if it wasn't halted first. in fact some devices\r
+ * (like some ibmcam model 1 units) seem to expect hosts to make\r
+ * this request for iso endpoints, which can't halt!\r
+ */\r
+ result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),\r
+ USB_REQ_CLEAR_FEATURE, USB_RECIP_ENDPOINT, 0, endp, NULL, 0,\r
+ HZ * USB_CTRL_SET_TIMEOUT);\r
+\r
+ /* don't un-halt or force to DATA0 except on success */\r
+ if (result < 0)\r
+ return result;\r
+\r
+ /* NOTE: seems like Microsoft and Apple don't bother verifying\r
+ * the clear "took", so some devices could lock up if you check...\r
+ * such as the Hagiwara FlashGate DUAL. So we won't bother.\r
+ *\r
+ * NOTE: make sure the logic here doesn't diverge much from\r
+ * the copy in usb-storage, for as long as we need two copies.\r
+ */\r
+\r
+ /* toggle was reset by the clear, then ep was reactivated */\r
+ usb_settoggle(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe), 0);\r
+ usb_endpoint_running(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe));\r
+\r
+ return 0;\r
+}\r
+\r
+/**\r
+ * usb_set_interface - Makes a particular alternate setting be current\r
+ * @dev: the device whose interface is being updated\r
+ * @interface: the interface being updated\r
+ * @alternate: the setting being chosen.\r
+ * Context: !in_interrupt ()\r
+ *\r
+ * This is used to enable data transfers on interfaces that may not\r
+ * be enabled by default. Not all devices support such configurability.\r
+ * Only the driver bound to an interface may change its setting.\r
+ *\r
+ * Within any given configuration, each interface may have several\r
+ * alternative settings. These are often used to control levels of\r
+ * bandwidth consumption. For example, the default setting for a high\r
+ * speed interrupt endpoint may not send more than 64 bytes per microframe,\r
+ * while interrupt transfers of up to 3KBytes per microframe are legal.\r
+ * Also, isochronous endpoints may never be part of an\r
+ * interface's default setting. To access such bandwidth, alternate\r
+ * interface settings must be made current.\r
+ *\r
+ * Note that in the Linux USB subsystem, bandwidth associated with\r
+ * an endpoint in a given alternate setting is not reserved until an URB\r
+ * is submitted that needs that bandwidth. Some other operating systems\r
+ * allocate bandwidth early, when a configuration is chosen.\r
+ *\r
+ * This call is synchronous, and may not be used in an interrupt context.\r
+ * Also, drivers must not change altsettings while urbs are scheduled for\r
+ * endpoints in that interface; all such urbs must first be completed\r
+ * (perhaps forced by unlinking).\r
+ *\r
+ * Returns zero on success, or else the status code returned by the\r
+ * underlying usb_control_msg() call.\r
+ */\r
+int usb_set_interface(struct usb_device *dev, int interface, int alternate)\r
+{\r
+ struct usb_interface *iface;\r
+ struct usb_host_interface *iface_as;\r
+ int i, ret;\r
+ void (*disable)(struct usb_device *, int) = dev->bus->op->disable;\r
+\r
+ iface = usb_ifnum_to_if(dev, interface);\r
+ if (!iface) {\r
+ warn("selecting invalid interface %d", interface);\r
+ return -EINVAL;\r
+ }\r
+\r
+ /* 9.4.10 says devices don't need this, if the interface\r
+ only has one alternate setting */\r
+ if (iface->num_altsetting == 1) {\r
+ dbg("ignoring set_interface for dev %d, iface %d, alt %d",\r
+ dev->devnum, interface, alternate);\r
+ return 0;\r
+ }\r
+\r
+ if (alternate < 0 || alternate >= iface->num_altsetting)\r
+ return -EINVAL;\r
+\r
+ if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),\r
+ USB_REQ_SET_INTERFACE, USB_RECIP_INTERFACE,\r
+ iface->altsetting[alternate]\r
+ .desc.bAlternateSetting,\r
+ interface, NULL, 0, HZ * 5)) < 0)\r
+ return ret;\r
+\r
+ /* FIXME drivers shouldn't need to replicate/bugfix the logic here\r
+ * when they implement async or easily-killable versions of this or\r
+ * other "should-be-internal" functions (like clear_halt).\r
+ * should hcd+usbcore postprocess control requests?\r
+ */\r
+\r
+ /* prevent submissions using previous endpoint settings */\r
+ iface_as = iface->altsetting + iface->act_altsetting;\r
+ for (i = 0; i < iface_as->desc.bNumEndpoints; i++) {\r
+ u8 ep = iface_as->endpoint [i].desc.bEndpointAddress;\r
+ int out = !(ep & USB_DIR_IN);\r
+\r
+ /* clear out hcd state, then usbcore state */\r
+ if (disable)\r
+ disable (dev, ep);\r
+ ep &= USB_ENDPOINT_NUMBER_MASK;\r
+ (out ? dev->epmaxpacketout : dev->epmaxpacketin ) [ep] = 0;\r
+ }\r
+ iface->act_altsetting = alternate;\r
+\r
+ /* 9.1.1.5: reset toggles for all endpoints affected by this iface-as\r
+ *\r
+ * Note:\r
+ * Despite EP0 is always present in all interfaces/AS, the list of\r
+ * endpoints from the descriptor does not contain EP0. Due to its\r
+ * omnipresence one might expect EP0 being considered "affected" by\r
+ * any SetInterface request and hence assume toggles need to be reset.\r
+ * However, EP0 toggles are re-synced for every individual transfer\r
+ * during the SETUP stage - hence EP0 toggles are "don't care" here.\r
+ * (Likewise, EP0 never "halts" on well designed devices.)\r
+ */\r
+\r
+ iface_as = &iface->altsetting[alternate];\r
+ for (i = 0; i < iface_as->desc.bNumEndpoints; i++) {\r
+ u8 ep = iface_as->endpoint[i].desc.bEndpointAddress;\r
+ int out = !(ep & USB_DIR_IN);\r
+\r
+ ep &= USB_ENDPOINT_NUMBER_MASK;\r
+ usb_settoggle (dev, ep, out, 0);\r
+ (out ? dev->epmaxpacketout : dev->epmaxpacketin) [ep]\r
+ = iface_as->endpoint [i].desc.wMaxPacketSize;\r
+ usb_endpoint_running (dev, ep, out);\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+/**\r
+ * usb_set_configuration - Makes a particular device setting be current\r
+ * @dev: the device whose configuration is being updated\r
+ * @configuration: the configuration being chosen.\r
+ * Context: !in_interrupt ()\r
+ *\r
+ * This is used to enable non-default device modes. Not all devices\r
+ * support this kind of configurability. By default, configuration\r
+ * zero is selected after enumeration; many devices only have a single\r
+ * configuration.\r
+ *\r
+ * USB devices may support one or more configurations, which affect\r
+ * power consumption and the functionality available. For example,\r
+ * the default configuration is limited to using 100mA of bus power,\r
+ * so that when certain device functionality requires more power,\r
+ * and the device is bus powered, that functionality will be in some\r
+ * non-default device configuration. Other device modes may also be\r
+ * reflected as configuration options, such as whether two ISDN\r
+ * channels are presented as independent 64Kb/s interfaces or as one\r
+ * bonded 128Kb/s interface.\r
+ *\r
+ * Note that USB has an additional level of device configurability,\r
+ * associated with interfaces. That configurability is accessed using\r
+ * usb_set_interface().\r
+ *\r
+ * This call is synchronous, and may not be used in an interrupt context.\r
+ *\r
+ * Returns zero on success, or else the status code returned by the\r
+ * underlying usb_control_msg() call.\r
+ */\r
+int usb_set_configuration(struct usb_device *dev, int configuration)\r
+{\r
+ int i, ret;\r
+ struct usb_host_config *cp = NULL;\r
+ void (*disable)(struct usb_device *, int) = dev->bus->op->disable;\r
+ \r
+ for (i=0; i<dev->descriptor.bNumConfigurations; i++) {\r
+ if (dev->config[i].desc.bConfigurationValue == configuration) {\r
+ cp = &dev->config[i];\r
+ break;\r
+ }\r
+ }\r
+ if ((!cp && configuration != 0) || (cp && configuration == 0)) {\r
+ warn("selecting invalid configuration %d", configuration);\r
+ return -EINVAL;\r
+ }\r
+\r
+ /* if it's already configured, clear out old state first. */\r
+ if (dev->state != USB_STATE_ADDRESS && disable) {\r
+ for (i = 1 /* skip ep0 */; i < 15; i++) {\r
+ disable (dev, i);\r
+ disable (dev, USB_DIR_IN | i);\r
+ }\r
+ }\r
+ dev->toggle[0] = dev->toggle[1] = 0;\r
+ dev->halted[0] = dev->halted[1] = 0;\r
+ dev->state = USB_STATE_ADDRESS;\r
+\r
+ if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),\r
+ USB_REQ_SET_CONFIGURATION, 0, configuration, 0,\r
+ NULL, 0, HZ * USB_CTRL_SET_TIMEOUT)) < 0)\r
+ return ret;\r
+ if (configuration)\r
+ dev->state = USB_STATE_CONFIGURED;\r
+ dev->actconfig = cp;\r
+\r
+ /* reset more hc/hcd endpoint state */\r
+ usb_set_maxpacket(dev);\r
+\r
+ return 0;\r
+}\r
+\r
+\r
+/**\r
+ * usb_string - returns ISO 8859-1 version of a string descriptor\r
+ * @dev: the device whose string descriptor is being retrieved\r
+ * @index: the number of the descriptor\r
+ * @buf: where to put the string\r
+ * @size: how big is "buf"?\r
+ * Context: !in_interrupt ()\r
+ * \r
+ * This converts the UTF-16LE encoded strings returned by devices, from\r
+ * usb_get_string_descriptor(), to null-terminated ISO-8859-1 encoded ones\r
+ * that are more usable in most kernel contexts. Note that all characters\r
+ * in the chosen descriptor that can't be encoded using ISO-8859-1\r
+ * are converted to the question mark ("?") character, and this function\r
+ * chooses strings in the first language supported by the device.\r
+ *\r
+ * The ASCII (or, redundantly, "US-ASCII") character set is the seven-bit\r
+ * subset of ISO 8859-1. ISO-8859-1 is the eight-bit subset of Unicode,\r
+ * and is appropriate for use many uses of English and several other\r
+ * Western European languages. (But it doesn't include the "Euro" symbol.)\r
+ *\r
+ * This call is synchronous, and may not be used in an interrupt context.\r
+ *\r
+ * Returns length of the string (>= 0) or usb_control_msg status (< 0).\r
+ */\r
+int usb_string(struct usb_device *dev, int index, char *buf, size_t size)\r
+{\r
+ unsigned char *tbuf;\r
+ int err, len;\r
+ unsigned int u, idx;\r
+\r
+ if (size <= 0 || !buf || !index)\r
+ return -EINVAL;\r
+ buf[0] = 0;\r
+ tbuf = kmalloc(256, GFP_KERNEL);\r
+ if (!tbuf)\r
+ return -ENOMEM;\r
+\r
+ /* get langid for strings if it's not yet known */\r
+ if (!dev->have_langid) {\r
+ err = usb_get_string(dev, 0, 0, tbuf, 4);\r
+ if (err < 0) {\r
+ err("error getting string descriptor 0 (error=%d)", err);\r
+ goto errout;\r
+ } else if (tbuf[0] < 4) {\r
+ err("string descriptor 0 too short");\r
+ err = -EINVAL;\r
+ goto errout;\r
+ } else {\r
+ dev->have_langid = -1;\r
+ dev->string_langid = tbuf[2] | (tbuf[3]<< 8);\r
+ /* always use the first langid listed */\r
+ dbg("USB device number %d default language ID 0x%x",\r
+ dev->devnum, dev->string_langid);\r
+ }\r
+ }\r
+\r
+ /*\r
+ * ask for the length of the string \r
+ */\r
+\r
+ err = usb_get_string(dev, dev->string_langid, index, tbuf, 2);\r
+ if(err<2)\r
+ goto errout;\r
+ len=tbuf[0]; \r
+ \r
+ err = usb_get_string(dev, dev->string_langid, index, tbuf, len);\r
+ if (err < 0)\r
+ goto errout;\r
+\r
+ size--; /* leave room for trailing NULL char in output buffer */\r
+ for (idx = 0, u = 2; u < err; u += 2) {\r
+ if (idx >= size)\r
+ break;\r
+ if (tbuf[u+1]) /* high byte */\r
+ buf[idx++] = '?'; /* non ISO-8859-1 character */\r
+ else\r
+ buf[idx++] = tbuf[u];\r
+ }\r
+ buf[idx] = 0;\r
+ err = idx;\r
+\r
+ errout:\r
+ kfree(tbuf);\r
+ return err;\r
+}\r
+\r
+// synchronous request completion model\r
+EXPORT_SYMBOL(usb_control_msg);\r
+EXPORT_SYMBOL(usb_bulk_msg);\r
+\r
+EXPORT_SYMBOL(usb_sg_init);\r
+EXPORT_SYMBOL(usb_sg_cancel);\r
+EXPORT_SYMBOL(usb_sg_wait);\r
+\r
+// synchronous control message convenience routines\r
+EXPORT_SYMBOL(usb_get_descriptor);\r
+EXPORT_SYMBOL(usb_get_device_descriptor);\r
+EXPORT_SYMBOL(usb_get_status);\r
+EXPORT_SYMBOL(usb_get_string);\r
+EXPORT_SYMBOL(usb_string);\r
+EXPORT_SYMBOL(usb_clear_halt);\r
+EXPORT_SYMBOL(usb_set_configuration);\r
+EXPORT_SYMBOL(usb_set_interface);\r
+\r
--- /dev/null
+#include "../usb_wrapper.h"\r
+#include "hcd.h"\r
+\r
+/**\r
+ * usb_init_urb - initializes a urb so that it can be used by a USB driver\r
+ * @urb: pointer to the urb to initialize\r
+ *\r
+ * Initializes a urb so that the USB subsystem can use it properly.\r
+ *\r
+ * If a urb is created with a call to usb_alloc_urb() it is not\r
+ * necessary to call this function. Only use this if you allocate the\r
+ * space for a struct urb on your own. If you call this function, be\r
+ * careful when freeing the memory for your urb that it is no longer in\r
+ * use by the USB core.\r
+ *\r
+ * Only use this function if you _really_ understand what you are doing.\r
+ */\r
+void STDCALL usb_init_urb(struct urb *urb)\r
+{\r
+ if (urb) {\r
+ memset(urb, 0, sizeof(*urb));\r
+ urb->count = (atomic_t)ATOMIC_INIT(1);\r
+ spin_lock_init(&urb->lock);\r
+ }\r
+}\r
+\r
+/**\r
+ * usb_alloc_urb - creates a new urb for a USB driver to use\r
+ * @iso_packets: number of iso packets for this urb\r
+ * @mem_flags: the type of memory to allocate, see kmalloc() for a list of\r
+ * valid options for this.\r
+ *\r
+ * Creates an urb for the USB driver to use, initializes a few internal\r
+ * structures, incrementes the usage counter, and returns a pointer to it.\r
+ *\r
+ * If no memory is available, NULL is returned.\r
+ *\r
+ * If the driver want to use this urb for interrupt, control, or bulk\r
+ * endpoints, pass '0' as the number of iso packets.\r
+ *\r
+ * The driver must call usb_free_urb() when it is finished with the urb.\r
+ */\r
+struct urb STDCALL *usb_alloc_urb(int iso_packets, int mem_flags)\r
+{\r
+ struct urb *urb;\r
+\r
+ urb = (struct urb *)kmalloc(sizeof(struct urb) + \r
+ iso_packets * sizeof(struct usb_iso_packet_descriptor),\r
+ mem_flags);\r
+ if (!urb) {\r
+ err("alloc_urb: kmalloc failed");\r
+ return NULL;\r
+ }\r
+ usb_init_urb(urb);\r
+ return urb;\r
+}\r
+\r
+/**\r
+ * usb_free_urb - frees the memory used by a urb when all users of it are finished\r
+ * @urb: pointer to the urb to free\r
+ *\r
+ * Must be called when a user of a urb is finished with it. When the last user\r
+ * of the urb calls this function, the memory of the urb is freed.\r
+ *\r
+ * Note: The transfer buffer associated with the urb is not freed, that must be\r
+ * done elsewhere.\r
+ */\r
+void STDCALL usb_free_urb(struct urb *urb)\r
+{\r
+ if (urb)\r
+ if (atomic_dec_and_test(&urb->count))\r
+ {\r
+ kfree(urb);\r
+ }\r
+}\r
+\r
+/**\r
+ * usb_get_urb - increments the reference count of the urb\r
+ * @urb: pointer to the urb to modify\r
+ *\r
+ * This must be called whenever a urb is transferred from a device driver to a\r
+ * host controller driver. This allows proper reference counting to happen\r
+ * for urbs.\r
+ *\r
+ * A pointer to the urb with the incremented reference counter is returned.\r
+ */\r
+struct urb STDCALL * usb_get_urb(struct urb *urb)\r
+{\r
+ if (urb) {\r
+ atomic_inc(&urb->count);\r
+ return urb;\r
+ } else\r
+ return NULL;\r
+}\r
+ \r
+\r
+/*-------------------------------------------------------------------*/\r
+\r
+/**\r
+ * usb_submit_urb - issue an asynchronous transfer request for an endpoint\r
+ * @urb: pointer to the urb describing the request\r
+ * @mem_flags: the type of memory to allocate, see kmalloc() for a list\r
+ * of valid options for this.\r
+ *\r
+ * This submits a transfer request, and transfers control of the URB\r
+ * describing that request to the USB subsystem. Request completion will\r
+ * be indicated later, asynchronously, by calling the completion handler.\r
+ * The three types of completion are success, error, and unlink\r
+ * (also called "request cancellation").\r
+ * URBs may be submitted in interrupt context.\r
+ *\r
+ * The caller must have correctly initialized the URB before submitting\r
+ * it. Functions such as usb_fill_bulk_urb() and usb_fill_control_urb() are\r
+ * available to ensure that most fields are correctly initialized, for\r
+ * the particular kind of transfer, although they will not initialize\r
+ * any transfer flags.\r
+ *\r
+ * Successful submissions return 0; otherwise this routine returns a\r
+ * negative error number. If the submission is successful, the complete()\r
+ * callback from the urb will be called exactly once, when the USB core and\r
+ * host controller driver are finished with the urb. When the completion\r
+ * function is called, control of the URB is returned to the device\r
+ * driver which issued the request. The completion handler may then\r
+ * immediately free or reuse that URB.\r
+ *\r
+ * For control endpoints, the synchronous usb_control_msg() call is\r
+ * often used (in non-interrupt context) instead of this call.\r
+ * That is often used through convenience wrappers, for the requests\r
+ * that are standardized in the USB 2.0 specification. For bulk\r
+ * endpoints, a synchronous usb_bulk_msg() call is available.\r
+ *\r
+ * Request Queuing:\r
+ *\r
+ * URBs may be submitted to endpoints before previous ones complete, to\r
+ * minimize the impact of interrupt latencies and system overhead on data\r
+ * throughput. This is required for continuous isochronous data streams,\r
+ * and may also be required for some kinds of interrupt transfers. Such\r
+ * queueing also maximizes bandwidth utilization by letting USB controllers\r
+ * start work on later requests before driver software has finished the\r
+ * completion processing for earlier requests.\r
+ *\r
+ * Bulk and Isochronous URBs may always be queued. At this writing, all\r
+ * mainstream host controller drivers support queueing for control and\r
+ * interrupt transfer requests.\r
+ *\r
+ * Reserved Bandwidth Transfers:\r
+ *\r
+ * Periodic transfers (interrupt or isochronous) are performed repeatedly,\r
+ * using the interval specified in the urb. Submitting the first urb to\r
+ * the endpoint reserves the bandwidth necessary to make those transfers.\r
+ * If the USB subsystem can't allocate sufficient bandwidth to perform\r
+ * the periodic request, submitting such a periodic request should fail.\r
+ *\r
+ * Device drivers must explicitly request that repetition, by ensuring that\r
+ * some URB is always on the endpoint's queue (except possibly for short\r
+ * periods during completion callacks). When there is no longer an urb\r
+ * queued, the endpoint's bandwidth reservation is canceled. This means\r
+ * drivers can use their completion handlers to ensure they keep bandwidth\r
+ * they need, by reinitializing and resubmitting the just-completed urb\r
+ * until the driver longer needs that periodic bandwidth.\r
+ *\r
+ * Memory Flags:\r
+ *\r
+ * The general rules for how to decide which mem_flags to use\r
+ * are the same as for kmalloc. There are four\r
+ * different possible values; GFP_KERNEL, GFP_NOFS, GFP_NOIO and\r
+ * GFP_ATOMIC.\r
+ *\r
+ * GFP_NOFS is not ever used, as it has not been implemented yet.\r
+ *\r
+ * GFP_ATOMIC is used when\r
+ * (a) you are inside a completion handler, an interrupt, bottom half,\r
+ * tasklet or timer, or\r
+ * (b) you are holding a spinlock or rwlock (does not apply to\r
+ * semaphores), or\r
+ * (c) current->state != TASK_RUNNING, this is the case only after\r
+ * you've changed it.\r
+ * \r
+ * GFP_NOIO is used in the block io path and error handling of storage\r
+ * devices.\r
+ *\r
+ * All other situations use GFP_KERNEL.\r
+ *\r
+ * Some more specific rules for mem_flags can be inferred, such as\r
+ * (1) start_xmit, timeout, and receive methods of network drivers must\r
+ * use GFP_ATOMIC (they are called with a spinlock held);\r
+ * (2) queuecommand methods of scsi drivers must use GFP_ATOMIC (also\r
+ * called with a spinlock held);\r
+ * (3) If you use a kernel thread with a network driver you must use\r
+ * GFP_NOIO, unless (b) or (c) apply;\r
+ * (4) after you have done a down() you can use GFP_KERNEL, unless (b) or (c)\r
+ * apply or your are in a storage driver's block io path;\r
+ * (5) USB probe and disconnect can use GFP_KERNEL unless (b) or (c) apply; and\r
+ * (6) changing firmware on a running storage or net device uses\r
+ * GFP_NOIO, unless b) or c) apply\r
+ *\r
+ */\r
+int STDCALL usb_submit_urb(struct urb *urb, int mem_flags)\r
+{\r
+ int pipe, temp, max;\r
+ struct usb_device *dev;\r
+ struct usb_operations *op;\r
+ int is_out;\r
+// printk("sub dev %p bus %p num %i op %p sub %p\n",\r
+// urb->dev, urb->dev->bus,urb->dev->devnum,urb->dev->bus->op, urb->dev->bus->op->submit_urb);\r
+ if (!urb || urb->hcpriv || !urb->complete)\r
+ return -EINVAL;\r
+ if (!(dev = urb->dev) ||\r
+ (dev->state < USB_STATE_DEFAULT) ||\r
+ (!dev->bus) || (dev->devnum <= 0))\r
+ return -ENODEV;\r
+ if (!(op = dev->bus->op) || !op->submit_urb)\r
+ return -ENODEV;\r
+\r
+ urb->status = -EINPROGRESS;\r
+ urb->actual_length = 0;\r
+ urb->bandwidth = 0;\r
+\r
+ /* Lots of sanity checks, so HCDs can rely on clean data\r
+ * and don't need to duplicate tests\r
+ */\r
+ pipe = urb->pipe;\r
+ temp = usb_pipetype (pipe);\r
+ is_out = usb_pipeout (pipe);\r
+\r
+ if (!usb_pipecontrol (pipe) && dev->state < USB_STATE_CONFIGURED)\r
+ return -ENODEV;\r
+\r
+ /* (actually HCDs may need to duplicate this, endpoint might yet\r
+ * stall due to queued bulk/intr transactions that complete after\r
+ * we check)\r
+ */\r
+ if (usb_endpoint_halted (dev, usb_pipeendpoint (pipe), is_out))\r
+ return -EPIPE;\r
+\r
+ /* FIXME there should be a sharable lock protecting us against\r
+ * config/altsetting changes and disconnects, kicking in here.\r
+ * (here == before maxpacket, and eventually endpoint type,\r
+ * checks get made.)\r
+ */\r
+\r
+ max = usb_maxpacket (dev, pipe, is_out);\r
+ if (max <= 0) {\r
+ dbg ("%s: bogus endpoint %d-%s on usb-%s-%s (bad maxpacket %d)",\r
+ __FUNCTION__,\r
+ usb_pipeendpoint (pipe), is_out ? "OUT" : "IN",\r
+ dev->bus->bus_name, dev->devpath,\r
+ max);\r
+ return -EMSGSIZE;\r
+ }\r
+\r
+ /* periodic transfers limit size per frame/uframe,\r
+ * but drivers only control those sizes for ISO.\r
+ * while we're checking, initialize return status.\r
+ */\r
+ if (temp == PIPE_ISOCHRONOUS) {\r
+ int n, len;\r
+\r
+ /* "high bandwidth" mode, 1-3 packets/uframe? */\r
+ if (dev->speed == USB_SPEED_HIGH) {\r
+ int mult = 1 + ((max >> 11) & 0x03);\r
+ max &= 0x03ff;\r
+ max *= mult;\r
+ }\r
+\r
+ if (urb->number_of_packets <= 0) \r
+ return -EINVAL;\r
+ for (n = 0; n < urb->number_of_packets; n++) {\r
+ len = urb->iso_frame_desc [n].length;\r
+ if (len < 0 || len > max) \r
+ return -EMSGSIZE;\r
+ urb->iso_frame_desc [n].status = -EXDEV;\r
+ urb->iso_frame_desc [n].actual_length = 0;\r
+ }\r
+ }\r
+\r
+ /* the I/O buffer must be mapped/unmapped, except when length=0 */\r
+ if (urb->transfer_buffer_length < 0)\r
+ return -EMSGSIZE;\r
+\r
+#ifdef DEBUG\r
+ /* stuff that drivers shouldn't do, but which shouldn't\r
+ * cause problems in HCDs if they get it wrong.\r
+ */\r
+ {\r
+ unsigned int orig_flags = urb->transfer_flags;\r
+ unsigned int allowed;\r
+\r
+ /* enforce simple/standard policy */\r
+ allowed = URB_ASYNC_UNLINK; // affects later unlinks\r
+ allowed |= URB_NO_DMA_MAP;\r
+ allowed |= URB_NO_INTERRUPT;\r
+ switch (temp) {\r
+ case PIPE_BULK:\r
+ if (is_out)\r
+ allowed |= URB_ZERO_PACKET;\r
+ /* FALLTHROUGH */\r
+ case PIPE_CONTROL:\r
+ allowed |= URB_NO_FSBR; /* only affects UHCI */\r
+ /* FALLTHROUGH */\r
+ default: /* all non-iso endpoints */\r
+ if (!is_out)\r
+ allowed |= URB_SHORT_NOT_OK;\r
+ break;\r
+ case PIPE_ISOCHRONOUS:\r
+ allowed |= URB_ISO_ASAP;\r
+ break;\r
+ }\r
+ urb->transfer_flags &= allowed;\r
+\r
+ /* fail if submitter gave bogus flags */\r
+ if (urb->transfer_flags != orig_flags) {\r
+ err ("BOGUS urb flags, %x --> %x",\r
+ orig_flags, urb->transfer_flags);\r
+ return -EINVAL;\r
+ }\r
+ }\r
+#endif\r
+ /*\r
+ * Force periodic transfer intervals to be legal values that are\r
+ * a power of two (so HCDs don't need to).\r
+ *\r
+ * FIXME want bus->{intr,iso}_sched_horizon values here. Each HC\r
+ * supports different values... this uses EHCI/UHCI defaults (and\r
+ * EHCI can use smaller non-default values).\r
+ */\r
+ switch (temp) {\r
+ case PIPE_ISOCHRONOUS:\r
+ case PIPE_INTERRUPT:\r
+ /* too small? */\r
+ if (urb->interval <= 0)\r
+ return -EINVAL;\r
+ /* too big? */\r
+ switch (dev->speed) {\r
+ case USB_SPEED_HIGH: /* units are microframes */\r
+ // NOTE usb handles 2^15\r
+ if (urb->interval > (1024 * 8))\r
+ urb->interval = 1024 * 8;\r
+ temp = 1024 * 8;\r
+ break;\r
+ case USB_SPEED_FULL: /* units are frames/msec */\r
+ case USB_SPEED_LOW:\r
+ if (temp == PIPE_INTERRUPT) {\r
+ if (urb->interval > 255)\r
+ return -EINVAL;\r
+ // NOTE ohci only handles up to 32\r
+ temp = 128;\r
+ } else {\r
+ if (urb->interval > 1024)\r
+ urb->interval = 1024;\r
+ // NOTE usb and ohci handle up to 2^15\r
+ temp = 1024;\r
+ }\r
+ break;\r
+ default:\r
+ return -EINVAL;\r
+ }\r
+ /* power of two? */\r
+ while (temp > urb->interval)\r
+ temp >>= 1;\r
+ urb->interval = temp;\r
+ }\r
+\r
+ return op->submit_urb (urb, mem_flags);\r
+}\r
+\r
+/*-------------------------------------------------------------------*/\r
+\r
+/**\r
+ * usb_unlink_urb - abort/cancel a transfer request for an endpoint\r
+ * @urb: pointer to urb describing a previously submitted request\r
+ *\r
+ * This routine cancels an in-progress request. The requests's\r
+ * completion handler will be called with a status code indicating\r
+ * that the request has been canceled, and that control of the URB\r
+ * has been returned to that device driver.\r
+ *\r
+ * When the URB_ASYNC_UNLINK transfer flag for the URB is clear, this\r
+ * request is synchronous. Success is indicated by returning zero,\r
+ * at which time the urb will have been unlinked,\r
+ * and the completion function will see status -ENOENT. Failure is\r
+ * indicated by any other return value. This mode may not be used\r
+ * when unlinking an urb from an interrupt context, such as a bottom\r
+ * half or a completion handler,\r
+ *\r
+ * When the URB_ASYNC_UNLINK transfer flag for the URB is set, this\r
+ * request is asynchronous. Success is indicated by returning -EINPROGRESS,\r
+ * at which time the urb will normally not have been unlinked,\r
+ * and the completion function will see status -ECONNRESET. Failure is\r
+ * indicated by any other return value.\r
+ */\r
+int STDCALL usb_unlink_urb(struct urb *urb)\r
+{\r
+ if (urb && urb->dev && urb->dev->bus && urb->dev->bus->op)\r
+ return urb->dev->bus->op->unlink_urb(urb);\r
+ else\r
+ return -ENODEV;\r
+}\r
--- /dev/null
+/*\r
+ * debug.c - USB debug helper routines.\r
+ *\r
+ * I just want these out of the way where they aren't in your\r
+ * face, but so that you can still use them..\r
+ */\r
+#define CONFIG_USB_DEBUG\r
+#if 0\r
+#include <linux/config.h>\r
+#include <linux/kernel.h>\r
+#include <linux/mm.h>\r
+#include <linux/slab.h>\r
+#ifdef CONFIG_USB_DEBUG\r
+ #define DEBUG\r
+#else\r
+ #undef DEBUG\r
+#endif\r
+#include <linux/usb.h>\r
+#else\r
+#include "../usb_wrapper.h"\r
+#endif\r
+\r
+static void usb_show_endpoint(struct usb_host_endpoint *endpoint)\r
+{\r
+ usb_show_endpoint_descriptor(&endpoint->desc);\r
+}\r
+\r
+static void usb_show_interface(struct usb_host_interface *altsetting)\r
+{\r
+ int i;\r
+\r
+ usb_show_interface_descriptor(&altsetting->desc);\r
+\r
+ for (i = 0; i < altsetting->desc.bNumEndpoints; i++)\r
+ usb_show_endpoint(altsetting->endpoint + i);\r
+}\r
+\r
+static void usb_show_config(struct usb_host_config *config)\r
+{\r
+ int i, j;\r
+ struct usb_interface *ifp;\r
+\r
+ usb_show_config_descriptor(&config->desc);\r
+ for (i = 0; i < config->desc.bNumInterfaces; i++) {\r
+ ifp = config->interface + i;\r
+\r
+ if (!ifp)\r
+ break;\r
+\r
+ printk("\n Interface: %d\n", i);\r
+ for (j = 0; j < ifp->num_altsetting; j++)\r
+ usb_show_interface(ifp->altsetting + j);\r
+ }\r
+}\r
+\r
+void usb_show_device(struct usb_device *dev)\r
+{\r
+ int i;\r
+\r
+ usb_show_device_descriptor(&dev->descriptor);\r
+ for (i = 0; i < dev->descriptor.bNumConfigurations; i++)\r
+ usb_show_config(dev->config + i);\r
+}\r
+\r
+/*\r
+ * Parse and show the different USB descriptors.\r
+ */\r
+void usb_show_device_descriptor(struct usb_device_descriptor *desc)\r
+{\r
+ if (!desc)\r
+ {\r
+ printk("Invalid USB device descriptor (NULL POINTER)\n");\r
+ return;\r
+ }\r
+ printk(" Length = %2d%s\n", desc->bLength,\r
+ desc->bLength == USB_DT_DEVICE_SIZE ? "" : " (!!!)");\r
+ printk(" DescriptorType = %02x\n", desc->bDescriptorType);\r
+\r
+ printk(" USB version = %x.%02x\n",\r
+ desc->bcdUSB >> 8, desc->bcdUSB & 0xff);\r
+ printk(" Vendor:Product = %04x:%04x\n",\r
+ desc->idVendor, desc->idProduct);\r
+ printk(" MaxPacketSize0 = %d\n", desc->bMaxPacketSize0);\r
+ printk(" NumConfigurations = %d\n", desc->bNumConfigurations);\r
+ printk(" Device version = %x.%02x\n",\r
+ desc->bcdDevice >> 8, desc->bcdDevice & 0xff);\r
+\r
+ printk(" Device Class:SubClass:Protocol = %02x:%02x:%02x\n",\r
+ desc->bDeviceClass, desc->bDeviceSubClass, desc->bDeviceProtocol);\r
+ switch (desc->bDeviceClass) {\r
+ case 0:\r
+ printk(" Per-interface classes\n");\r
+ break;\r
+ case USB_CLASS_AUDIO:\r
+ printk(" Audio device class\n");\r
+ break;\r
+ case USB_CLASS_COMM:\r
+ printk(" Communications class\n");\r
+ break;\r
+ case USB_CLASS_HID:\r
+ printk(" Human Interface Devices class\n");\r
+ break;\r
+ case USB_CLASS_PRINTER:\r
+ printk(" Printer device class\n");\r
+ break;\r
+ case USB_CLASS_MASS_STORAGE:\r
+ printk(" Mass Storage device class\n");\r
+ break;\r
+ case USB_CLASS_HUB:\r
+ printk(" Hub device class\n");\r
+ break;\r
+ case USB_CLASS_VENDOR_SPEC:\r
+ printk(" Vendor class\n");\r
+ break;\r
+ default:\r
+ printk(" Unknown class\n");\r
+ }\r
+}\r
+\r
+void usb_show_config_descriptor(struct usb_config_descriptor *desc)\r
+{\r
+ printk("Configuration:\n");\r
+ printk(" bLength = %4d%s\n", desc->bLength,\r
+ desc->bLength == USB_DT_CONFIG_SIZE ? "" : " (!!!)");\r
+ printk(" bDescriptorType = %02x\n", desc->bDescriptorType);\r
+ printk(" wTotalLength = %04x\n", desc->wTotalLength);\r
+ printk(" bNumInterfaces = %02x\n", desc->bNumInterfaces);\r
+ printk(" bConfigurationValue = %02x\n", desc->bConfigurationValue);\r
+ printk(" iConfiguration = %02x\n", desc->iConfiguration);\r
+ printk(" bmAttributes = %02x\n", desc->bmAttributes);\r
+ printk(" bMaxPower = %4dmA\n", desc->bMaxPower * 2);\r
+}\r
+\r
+void usb_show_interface_descriptor(struct usb_interface_descriptor *desc)\r
+{\r
+ printk(" Alternate Setting: %2d\n", desc->bAlternateSetting);\r
+ printk(" bLength = %4d%s\n", desc->bLength,\r
+ desc->bLength == USB_DT_INTERFACE_SIZE ? "" : " (!!!)");\r
+ printk(" bDescriptorType = %02x\n", desc->bDescriptorType);\r
+ printk(" bInterfaceNumber = %02x\n", desc->bInterfaceNumber);\r
+ printk(" bAlternateSetting = %02x\n", desc->bAlternateSetting);\r
+ printk(" bNumEndpoints = %02x\n", desc->bNumEndpoints);\r
+ printk(" bInterface Class:SubClass:Protocol = %02x:%02x:%02x\n",\r
+ desc->bInterfaceClass, desc->bInterfaceSubClass, desc->bInterfaceProtocol);\r
+ printk(" iInterface = %02x\n", desc->iInterface);\r
+}\r
+\r
+void usb_show_endpoint_descriptor(struct usb_endpoint_descriptor *desc)\r
+{\r
+ char *LengthCommentString = (desc->bLength ==\r
+ USB_DT_ENDPOINT_AUDIO_SIZE) ? " (Audio)" : (desc->bLength ==\r
+ USB_DT_ENDPOINT_SIZE) ? "" : " (!!!)";\r
+ char *EndpointType[4] = { "Control", "Isochronous", "Bulk", "Interrupt" };\r
+\r
+ printk(" Endpoint:\n");\r
+ printk(" bLength = %4d%s\n",\r
+ desc->bLength, LengthCommentString);\r
+ printk(" bDescriptorType = %02x\n", desc->bDescriptorType);\r
+ printk(" bEndpointAddress = %02x (%s)\n", desc->bEndpointAddress,\r
+ (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==\r
+ USB_ENDPOINT_XFER_CONTROL ? "i/o" :\r
+ (desc->bEndpointAddress & USB_ENDPOINT_DIR_MASK) ? "in" : "out");\r
+ printk(" bmAttributes = %02x (%s)\n", desc->bmAttributes,\r
+ EndpointType[USB_ENDPOINT_XFERTYPE_MASK & desc->bmAttributes]);\r
+ printk(" wMaxPacketSize = %04x\n", desc->wMaxPacketSize);\r
+ printk(" bInterval = %02x\n", desc->bInterval);\r
+\r
+ /* Audio extensions to the endpoint descriptor */\r
+ if (desc->bLength == USB_DT_ENDPOINT_AUDIO_SIZE) {\r
+ printk(" bRefresh = %02x\n", desc->bRefresh);\r
+ printk(" bSynchAddress = %02x\n", desc->bSynchAddress);\r
+ }\r
+}\r
+\r
+void usb_show_string(struct usb_device *dev, char *id, int index)\r
+{\r
+ char *buf;\r
+\r
+ if (!index)\r
+ return;\r
+ if (!(buf = kmalloc(256, GFP_KERNEL)))\r
+ return;\r
+ if (usb_string(dev, index, buf, 256) > 0)\r
+ dev_printk(KERN_INFO, &dev->dev, "%s: %s\n", id, buf);\r
+ kfree(buf);\r
+}\r
+\r
+void usb_dump_urb (struct urb *urb)\r
+{\r
+ printk ("urb :%p\n", urb);\r
+ printk ("dev :%p\n", urb->dev);\r
+ printk ("pipe :%08X\n", urb->pipe);\r
+ printk ("status :%d\n", urb->status);\r
+ printk ("transfer_flags :%08X\n", urb->transfer_flags);\r
+ printk ("transfer_buffer :%p\n", urb->transfer_buffer);\r
+ printk ("transfer_buffer_length:%d\n", urb->transfer_buffer_length);\r
+ printk ("actual_length :%d\n", urb->actual_length);\r
+ printk ("setup_packet :%p\n", urb->setup_packet);\r
+ printk ("start_frame :%d\n", urb->start_frame);\r
+ printk ("number_of_packets :%d\n", urb->number_of_packets);\r
+ printk ("interval :%d\n", urb->interval);\r
+ printk ("error_count :%d\n", urb->error_count);\r
+ printk ("context :%p\n", urb->context);\r
+ printk ("complete :%p\n", urb->complete);\r
+}\r
+\r
--- /dev/null
+/*\r
+ * drivers/usb/usb.c\r
+ *\r
+ * (C) Copyright Linus Torvalds 1999\r
+ * (C) Copyright Johannes Erdfelt 1999-2001\r
+ * (C) Copyright Andreas Gal 1999\r
+ * (C) Copyright Gregory P. Smith 1999\r
+ * (C) Copyright Deti Fliegl 1999 (new USB architecture)\r
+ * (C) Copyright Randy Dunlap 2000\r
+ * (C) Copyright David Brownell 2000-2001 (kernel hotplug, usb_device_id,\r
+ more docs, etc)\r
+ * (C) Copyright Yggdrasil Computing, Inc. 2000\r
+ * (usb_device_id matching changes by Adam J. Richter)\r
+ * (C) Copyright Greg Kroah-Hartman 2002-2003\r
+ *\r
+ * NOTE! This is not actually a driver at all, rather this is\r
+ * just a collection of helper routines that implement the\r
+ * generic USB things that the real drivers can use..\r
+ *\r
+ * Think of this as a "USB library" rather than anything else.\r
+ * It should be considered a slave, with no callbacks. Callbacks\r
+ * are evil.\r
+ */\r
+\r
+#if 0\r
+#include <linux/config.h>\r
+\r
+#ifdef CONFIG_USB_DEBUG\r
+ #define DEBUG\r
+#else\r
+ #undef DEBUG\r
+#endif\r
+\r
+#include <linux/module.h>\r
+#include <linux/string.h>\r
+#include <linux/bitops.h>\r
+#include <linux/slab.h>\r
+#include <linux/interrupt.h> /* for in_interrupt() */\r
+#include <linux/kmod.h>\r
+#include <linux/init.h>\r
+#include <linux/spinlock.h>\r
+#include <linux/errno.h>\r
+#include <linux/smp_lock.h>\r
+#include <linux/usb.h>\r
+\r
+#include <asm/io.h>\r
+#include <asm/scatterlist.h>\r
+#include <linux/mm.h>\r
+#include <linux/dma-mapping.h>\r
+#include "hcd.h"\r
+#include "usb.h"\r
+#else\r
+#include "../usb_wrapper.h"\r
+#include "hcd.h"\r
+#endif\r
+\r
+\r
+extern int usb_hub_init(void);\r
+extern void usb_hub_cleanup(void);\r
+extern int usb_major_init(void);\r
+extern void usb_major_cleanup(void);\r
+\r
+\r
+int nousb; /* Disable USB when built into kernel image */\r
+ /* Not honored on modular build */\r
+\r
+\r
+static int generic_probe (struct device *dev)\r
+{\r
+ return 0;\r
+}\r
+static int generic_remove (struct device *dev)\r
+{\r
+ return 0;\r
+}\r
+\r
+static struct device_driver usb_generic_driver = {\r
+ .name = "usb",\r
+ .bus = &usb_bus_type,\r
+ .probe = generic_probe,\r
+ .remove = generic_remove,\r
+};\r
+\r
+static int usb_generic_driver_data;\r
+\r
+/* needs to be called with BKL held */\r
+int usb_device_probe(struct device *dev)\r
+{\r
+ struct usb_interface * intf = to_usb_interface(dev);\r
+ struct usb_driver * driver = to_usb_driver(dev->driver);\r
+ const struct usb_device_id *id;\r
+ int error = -ENODEV;\r
+\r
+ dev_dbg(dev, "%s\n", __FUNCTION__);\r
+\r
+ if (!driver->probe)\r
+ return error;\r
+\r
+ id = usb_match_id (intf, driver->id_table);\r
+ if (id) {\r
+ dev_dbg (dev, "%s - got id\n", __FUNCTION__);\r
+ down (&driver->serialize);\r
+ error = driver->probe (intf, id);\r
+ up (&driver->serialize);\r
+ }\r
+ if (!error)\r
+ intf->driver = driver;\r
+\r
+ return error;\r
+}\r
+\r
+int usb_device_remove(struct device *dev)\r
+{\r
+ struct usb_interface *intf;\r
+ struct usb_driver *driver;\r
+\r
+ intf = list_entry(dev,struct usb_interface,dev);\r
+ driver = to_usb_driver(dev->driver);\r
+\r
+ down(&driver->serialize);\r
+\r
+ if (intf->driver && intf->driver->disconnect)\r
+ intf->driver->disconnect(intf);\r
+\r
+ /* if driver->disconnect didn't release the interface */\r
+ if (intf->driver)\r
+ usb_driver_release_interface(driver, intf);\r
+\r
+ up(&driver->serialize);\r
+\r
+ return 0;\r
+}\r
+\r
+/**\r
+ * usb_register - register a USB driver\r
+ * @new_driver: USB operations for the driver\r
+ *\r
+ * Registers a USB driver with the USB core. The list of unattached\r
+ * interfaces will be rescanned whenever a new driver is added, allowing\r
+ * the new driver to attach to any recognized devices.\r
+ * Returns a negative error code on failure and 0 on success.\r
+ * \r
+ * NOTE: if you want your driver to use the USB major number, you must call\r
+ * usb_register_dev() to enable that functionality. This function no longer\r
+ * takes care of that.\r
+ */\r
+int usb_register(struct usb_driver *new_driver)\r
+{\r
+ int retval = 0;\r
+\r
+ if (nousb)\r
+ return -ENODEV;\r
+\r
+ new_driver->driver.name = (char *)new_driver->name;\r
+ new_driver->driver.bus = &usb_bus_type;\r
+ new_driver->driver.probe = usb_device_probe;\r
+ new_driver->driver.remove = usb_device_remove;\r
+\r
+ init_MUTEX(&new_driver->serialize);\r
+\r
+ retval = driver_register(&new_driver->driver);\r
+\r
+ if (!retval) {\r
+ info("registered new driver %s", new_driver->name);\r
+ usbfs_update_special();\r
+ } else {\r
+ err("problem %d when registering driver %s",\r
+ retval, new_driver->name);\r
+ }\r
+\r
+ return retval;\r
+}\r
+\r
+/**\r
+ * usb_deregister - unregister a USB driver\r
+ * @driver: USB operations of the driver to unregister\r
+ * Context: !in_interrupt (), must be called with BKL held\r
+ *\r
+ * Unlinks the specified driver from the internal USB driver list.\r
+ * \r
+ * NOTE: If you called usb_register_dev(), you still need to call\r
+ * usb_deregister_dev() to clean up your driver's allocated minor numbers,\r
+ * this * call will no longer do it for you.\r
+ */\r
+void usb_deregister(struct usb_driver *driver)\r
+{\r
+ info("deregistering driver %s", driver->name);\r
+\r
+ driver_unregister (&driver->driver);\r
+\r
+ usbfs_update_special();\r
+}\r
+\r
+/**\r
+ * usb_ifnum_to_if - get the interface object with a given interface number (usbcore-internal)\r
+ * @dev: the device whose current configuration is considered\r
+ * @ifnum: the desired interface\r
+ *\r
+ * This walks the device descriptor for the currently active configuration\r
+ * and returns a pointer to the interface with that particular interface\r
+ * number, or null.\r
+ *\r
+ * Note that configuration descriptors are not required to assign interface\r
+ * numbers sequentially, so that it would be incorrect to assume that\r
+ * the first interface in that descriptor corresponds to interface zero.\r
+ * This routine helps device drivers avoid such mistakes.\r
+ * However, you should make sure that you do the right thing with any\r
+ * alternate settings available for this interfaces.\r
+ */\r
+struct usb_interface *usb_ifnum_to_if(struct usb_device *dev, unsigned ifnum)\r
+{\r
+ int i;\r
+\r
+ for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++)\r
+ if (dev->actconfig->interface[i].altsetting[0]\r
+ .desc.bInterfaceNumber == ifnum)\r
+ return &dev->actconfig->interface[i];\r
+\r
+ return NULL;\r
+}\r
+\r
+/**\r
+ * usb_epnum_to_ep_desc - get the endpoint object with a given endpoint number\r
+ * @dev: the device whose current configuration is considered\r
+ * @epnum: the desired endpoint\r
+ *\r
+ * This walks the device descriptor for the currently active configuration,\r
+ * and returns a pointer to the endpoint with that particular endpoint\r
+ * number, or null.\r
+ *\r
+ * Note that interface descriptors are not required to assign endpont\r
+ * numbers sequentially, so that it would be incorrect to assume that\r
+ * the first endpoint in that descriptor corresponds to interface zero.\r
+ * This routine helps device drivers avoid such mistakes.\r
+ */\r
+struct usb_endpoint_descriptor *\r
+usb_epnum_to_ep_desc(struct usb_device *dev, unsigned epnum)\r
+{\r
+ int i, j, k;\r
+\r
+ for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++)\r
+ for (j = 0; j < dev->actconfig->interface[i].num_altsetting; j++)\r
+ for (k = 0; k < dev->actconfig->interface[i]\r
+ .altsetting[j].desc.bNumEndpoints; k++)\r
+ if (epnum == dev->actconfig->interface[i]\r
+ .altsetting[j].endpoint[k]\r
+ .desc.bEndpointAddress)\r
+ return &dev->actconfig->interface[i]\r
+ .altsetting[j].endpoint[k]\r
+ .desc;\r
+\r
+ return NULL;\r
+}\r
+\r
+/**\r
+ * usb_driver_claim_interface - bind a driver to an interface\r
+ * @driver: the driver to be bound\r
+ * @iface: the interface to which it will be bound\r
+ * @priv: driver data associated with that interface\r
+ *\r
+ * This is used by usb device drivers that need to claim more than one\r
+ * interface on a device when probing (audio and acm are current examples).\r
+ * No device driver should directly modify internal usb_interface or\r
+ * usb_device structure members.\r
+ *\r
+ * Few drivers should need to use this routine, since the most natural\r
+ * way to bind to an interface is to return the private data from\r
+ * the driver's probe() method. Any driver that does use this must\r
+ * first be sure that no other driver has claimed the interface, by\r
+ * checking with usb_interface_claimed().\r
+ */\r
+void usb_driver_claim_interface(struct usb_driver *driver, struct usb_interface *iface, void* priv)\r
+{\r
+ if (!iface || !driver)\r
+ return;\r
+\r
+ // FIXME change API to report an error in this case\r
+ if (iface->driver)\r
+ err ("%s driver booted %s off interface %p",\r
+ driver->name, iface->driver->name, iface);\r
+ else\r
+ dbg("%s driver claimed interface %p", driver->name, iface);\r
+\r
+ iface->driver = driver;\r
+ usb_set_intfdata(iface, priv);\r
+}\r
+\r
+/**\r
+ * usb_interface_claimed - returns true iff an interface is claimed\r
+ * @iface: the interface being checked\r
+ *\r
+ * This should be used by drivers to check other interfaces to see if\r
+ * they are available or not. If another driver has claimed the interface,\r
+ * they may not claim it. Otherwise it's OK to claim it using\r
+ * usb_driver_claim_interface().\r
+ *\r
+ * Returns true (nonzero) iff the interface is claimed, else false (zero).\r
+ */\r
+int usb_interface_claimed(struct usb_interface *iface)\r
+{\r
+ if (!iface)\r
+ return 0;\r
+\r
+ return (iface->driver != NULL);\r
+} /* usb_interface_claimed() */\r
+\r
+/**\r
+ * usb_driver_release_interface - unbind a driver from an interface\r
+ * @driver: the driver to be unbound\r
+ * @iface: the interface from which it will be unbound\r
+ * \r
+ * This should be used by drivers to release their claimed interfaces.\r
+ * It is normally called in their disconnect() methods, and only for\r
+ * drivers that bound to more than one interface in their probe().\r
+ *\r
+ * When the USB subsystem disconnect()s a driver from some interface,\r
+ * it automatically invokes this method for that interface. That\r
+ * means that even drivers that used usb_driver_claim_interface()\r
+ * usually won't need to call this.\r
+ */\r
+void usb_driver_release_interface(struct usb_driver *driver, struct usb_interface *iface)\r
+{\r
+ /* this should never happen, don't release something that's not ours */\r
+ if (!iface || iface->driver != driver)\r
+ return;\r
+\r
+ iface->driver = NULL;\r
+ usb_set_intfdata(iface, NULL);\r
+}\r
+\r
+/**\r
+ * usb_match_id - find first usb_device_id matching device or interface\r
+ * @interface: the interface of interest\r
+ * @id: array of usb_device_id structures, terminated by zero entry\r
+ *\r
+ * usb_match_id searches an array of usb_device_id's and returns\r
+ * the first one matching the device or interface, or null.\r
+ * This is used when binding (or rebinding) a driver to an interface.\r
+ * Most USB device drivers will use this indirectly, through the usb core,\r
+ * but some layered driver frameworks use it directly.\r
+ * These device tables are exported with MODULE_DEVICE_TABLE, through\r
+ * modutils and "modules.usbmap", to support the driver loading\r
+ * functionality of USB hotplugging.\r
+ *\r
+ * What Matches:\r
+ *\r
+ * The "match_flags" element in a usb_device_id controls which\r
+ * members are used. If the corresponding bit is set, the\r
+ * value in the device_id must match its corresponding member\r
+ * in the device or interface descriptor, or else the device_id\r
+ * does not match.\r
+ *\r
+ * "driver_info" is normally used only by device drivers,\r
+ * but you can create a wildcard "matches anything" usb_device_id\r
+ * as a driver's "modules.usbmap" entry if you provide an id with\r
+ * only a nonzero "driver_info" field. If you do this, the USB device\r
+ * driver's probe() routine should use additional intelligence to\r
+ * decide whether to bind to the specified interface.\r
+ * \r
+ * What Makes Good usb_device_id Tables:\r
+ *\r
+ * The match algorithm is very simple, so that intelligence in\r
+ * driver selection must come from smart driver id records.\r
+ * Unless you have good reasons to use another selection policy,\r
+ * provide match elements only in related groups, and order match\r
+ * specifiers from specific to general. Use the macros provided\r
+ * for that purpose if you can.\r
+ *\r
+ * The most specific match specifiers use device descriptor\r
+ * data. These are commonly used with product-specific matches;\r
+ * the USB_DEVICE macro lets you provide vendor and product IDs,\r
+ * and you can also match against ranges of product revisions.\r
+ * These are widely used for devices with application or vendor\r
+ * specific bDeviceClass values.\r
+ *\r
+ * Matches based on device class/subclass/protocol specifications\r
+ * are slightly more general; use the USB_DEVICE_INFO macro, or\r
+ * its siblings. These are used with single-function devices\r
+ * where bDeviceClass doesn't specify that each interface has\r
+ * its own class. \r
+ *\r
+ * Matches based on interface class/subclass/protocol are the\r
+ * most general; they let drivers bind to any interface on a\r
+ * multiple-function device. Use the USB_INTERFACE_INFO\r
+ * macro, or its siblings, to match class-per-interface style \r
+ * devices (as recorded in bDeviceClass).\r
+ * \r
+ * Within those groups, remember that not all combinations are\r
+ * meaningful. For example, don't give a product version range\r
+ * without vendor and product IDs; or specify a protocol without\r
+ * its associated class and subclass.\r
+ */ \r
+const struct usb_device_id *\r
+usb_match_id(struct usb_interface *interface, const struct usb_device_id *id)\r
+{\r
+ struct usb_host_interface *intf;\r
+ struct usb_device *dev;\r
+\r
+ /* proc_connectinfo in devio.c may call us with id == NULL. */\r
+ if (id == NULL)\r
+ return NULL;\r
+\r
+ intf = &interface->altsetting [interface->act_altsetting];\r
+ dev = interface_to_usbdev(interface);\r
+\r
+ /* It is important to check that id->driver_info is nonzero,\r
+ since an entry that is all zeroes except for a nonzero\r
+ id->driver_info is the way to create an entry that\r
+ indicates that the driver want to examine every\r
+ device and interface. */\r
+ for (; id->idVendor || id->bDeviceClass || id->bInterfaceClass ||\r
+ id->driver_info; id++) {\r
+\r
+ if ((id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) &&\r
+ id->idVendor != dev->descriptor.idVendor)\r
+ continue;\r
+\r
+ if ((id->match_flags & USB_DEVICE_ID_MATCH_PRODUCT) &&\r
+ id->idProduct != dev->descriptor.idProduct)\r
+ continue;\r
+\r
+ /* No need to test id->bcdDevice_lo != 0, since 0 is never\r
+ greater than any unsigned number. */\r
+ if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_LO) &&\r
+ (id->bcdDevice_lo > dev->descriptor.bcdDevice))\r
+ continue;\r
+\r
+ if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_HI) &&\r
+ (id->bcdDevice_hi < dev->descriptor.bcdDevice))\r
+ continue;\r
+\r
+ if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_CLASS) &&\r
+ (id->bDeviceClass != dev->descriptor.bDeviceClass))\r
+ continue;\r
+\r
+ if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_SUBCLASS) &&\r
+ (id->bDeviceSubClass!= dev->descriptor.bDeviceSubClass))\r
+ continue;\r
+\r
+ if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_PROTOCOL) &&\r
+ (id->bDeviceProtocol != dev->descriptor.bDeviceProtocol))\r
+ continue;\r
+\r
+ if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_CLASS) &&\r
+ (id->bInterfaceClass != intf->desc.bInterfaceClass))\r
+ continue;\r
+\r
+ if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_SUBCLASS) &&\r
+ (id->bInterfaceSubClass != intf->desc.bInterfaceSubClass))\r
+ continue;\r
+\r
+ if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_PROTOCOL) &&\r
+ (id->bInterfaceProtocol != intf->desc.bInterfaceProtocol))\r
+ continue;\r
+\r
+ return id;\r
+ }\r
+\r
+ return NULL;\r
+}\r
+\r
+/**\r
+ * usb_find_interface - find usb_interface pointer for driver and device\r
+ * @drv: the driver whose current configuration is considered\r
+ * @minor: the minor number of the desired device\r
+ *\r
+ * This walks the driver device list and returns a pointer to the interface \r
+ * with the matching minor. Note, this only works for devices that share the\r
+ * USB major number.\r
+ */\r
+struct usb_interface *usb_find_interface(struct usb_driver *drv, int minor)\r
+{\r
+ struct list_head *entry;\r
+ struct device *dev;\r
+ struct usb_interface *intf;\r
+\r
+ list_for_each(entry, &drv->driver.devices) {\r
+ dev = container_of(entry, struct device, driver_list);\r
+\r
+ /* can't look at usb devices, only interfaces */\r
+ if (dev->driver == &usb_generic_driver)\r
+ continue;\r
+\r
+ intf = to_usb_interface(dev);\r
+ if (intf->minor == -1)\r
+ continue;\r
+ if (intf->minor == minor)\r
+ return intf;\r
+ }\r
+\r
+ /* no device found that matches */\r
+ return NULL; \r
+}\r
+\r
+static int usb_device_match (struct device *dev, struct device_driver *drv)\r
+{\r
+ struct usb_interface *intf;\r
+ struct usb_driver *usb_drv;\r
+ const struct usb_device_id *id;\r
+\r
+ /* check for generic driver, which we don't match any device with */\r
+ if (drv == &usb_generic_driver)\r
+ return 0;\r
+\r
+ intf = to_usb_interface(dev);\r
+\r
+ usb_drv = to_usb_driver(drv);\r
+ id = usb_drv->id_table;\r
+ \r
+ id = usb_match_id (intf, usb_drv->id_table);\r
+ if (id)\r
+ return 1;\r
+\r
+ return 0;\r
+}\r
+\r
+\r
+#ifdef CONFIG_HOTPLUG\r
+\r
+/*\r
+ * USB hotplugging invokes what /proc/sys/kernel/hotplug says\r
+ * (normally /sbin/hotplug) when USB devices get added or removed.\r
+ *\r
+ * This invokes a user mode policy agent, typically helping to load driver\r
+ * or other modules, configure the device, and more. Drivers can provide\r
+ * a MODULE_DEVICE_TABLE to help with module loading subtasks.\r
+ *\r
+ * We're called either from khubd (the typical case) or from root hub\r
+ * (init, kapmd, modprobe, rmmod, etc), but the agents need to handle\r
+ * delays in event delivery. Use sysfs (and DEVPATH) to make sure the\r
+ * device (and this configuration!) are still present.\r
+ */\r
+static int usb_hotplug (struct device *dev, char **envp, int num_envp,\r
+ char *buffer, int buffer_size)\r
+{\r
+ struct usb_interface *intf;\r
+ struct usb_device *usb_dev;\r
+ char *scratch;\r
+ int i = 0;\r
+ int length = 0;\r
+\r
+ dbg ("%s", __FUNCTION__);\r
+\r
+ if (!dev)\r
+ return -ENODEV;\r
+\r
+ /* Must check driver_data here, as on remove driver is always NULL */\r
+ if ((dev->driver == &usb_generic_driver) || \r
+ (dev->driver_data == &usb_generic_driver_data))\r
+ return 0;\r
+\r
+ intf = to_usb_interface(dev);\r
+ usb_dev = interface_to_usbdev (intf);\r
+ \r
+ if (usb_dev->devnum < 0) {\r
+ dbg ("device already deleted ??");\r
+ return -ENODEV;\r
+ }\r
+ if (!usb_dev->bus) {\r
+ dbg ("bus already removed?");\r
+ return -ENODEV;\r
+ }\r
+\r
+ scratch = buffer;\r
+\r
+#ifdef CONFIG_USB_DEVICEFS\r
+ /* If this is available, userspace programs can directly read\r
+ * all the device descriptors we don't tell them about. Or\r
+ * even act as usermode drivers.\r
+ *\r
+ * FIXME reduce hardwired intelligence here\r
+ */\r
+ envp [i++] = scratch;\r
+ length += snprintf (scratch, buffer_size - length,\r
+ "DEVICE=/proc/bus/usb/%03d/%03d",\r
+ usb_dev->bus->busnum, usb_dev->devnum);\r
+ if ((buffer_size - length <= 0) || (i >= num_envp))\r
+ return -ENOMEM;\r
+ ++length;\r
+ scratch += length;\r
+#endif\r
+\r
+ /* per-device configurations are common */\r
+ envp [i++] = scratch;\r
+ length += snprintf (scratch, buffer_size - length, "PRODUCT=%x/%x/%x",\r
+ usb_dev->descriptor.idVendor,\r
+ usb_dev->descriptor.idProduct,\r
+ usb_dev->descriptor.bcdDevice);\r
+ if ((buffer_size - length <= 0) || (i >= num_envp))\r
+ return -ENOMEM;\r
+ ++length;\r
+ scratch += length;\r
+\r
+ /* class-based driver binding models */\r
+ envp [i++] = scratch;\r
+ length += snprintf (scratch, buffer_size - length, "TYPE=%d/%d/%d",\r
+ usb_dev->descriptor.bDeviceClass,\r
+ usb_dev->descriptor.bDeviceSubClass,\r
+ usb_dev->descriptor.bDeviceProtocol);\r
+ if ((buffer_size - length <= 0) || (i >= num_envp))\r
+ return -ENOMEM;\r
+ ++length;\r
+ scratch += length;\r
+\r
+ if (usb_dev->descriptor.bDeviceClass == 0) {\r
+ int alt = intf->act_altsetting;\r
+\r
+ /* 2.4 only exposed interface zero. in 2.5, hotplug\r
+ * agents are called for all interfaces, and can use\r
+ * $DEVPATH/bInterfaceNumber if necessary.\r
+ */\r
+ envp [i++] = scratch;\r
+ length += snprintf (scratch, buffer_size - length,\r
+ "INTERFACE=%d/%d/%d",\r
+ intf->altsetting[alt].desc.bInterfaceClass,\r
+ intf->altsetting[alt].desc.bInterfaceSubClass,\r
+ intf->altsetting[alt].desc.bInterfaceProtocol);\r
+ if ((buffer_size - length <= 0) || (i >= num_envp))\r
+ return -ENOMEM;\r
+ ++length;\r
+ scratch += length;\r
+\r
+ }\r
+ envp [i++] = 0;\r
+\r
+ return 0;\r
+}\r
+\r
+#else\r
+\r
+static int usb_hotplug (struct device *dev, char **envp,\r
+ int num_envp, char *buffer, int buffer_size)\r
+{\r
+ return -ENODEV;\r
+}\r
+\r
+#endif /* CONFIG_HOTPLUG */\r
+\r
+/**\r
+ * usb_alloc_dev - allocate a usb device structure (usbcore-internal)\r
+ * @parent: hub to which device is connected\r
+ * @bus: bus used to access the device\r
+ * Context: !in_interrupt ()\r
+ *\r
+ * Only hub drivers (including virtual root hub drivers for host\r
+ * controllers) should ever call this.\r
+ *\r
+ * This call is synchronous, and may not be used in an interrupt context.\r
+ */\r
+struct usb_device STDCALL *usb_alloc_dev(struct usb_device *parent, struct usb_bus *bus)\r
+{\r
+ struct usb_device *dev;\r
+\r
+ dev = kmalloc(sizeof(*dev), GFP_KERNEL);\r
+ if (!dev)\r
+ return NULL;\r
+\r
+ memset(dev, 0, sizeof(*dev));\r
+\r
+ device_initialize(&dev->dev);\r
+ dev->state = USB_STATE_ATTACHED;\r
+\r
+ usb_bus_get(bus);\r
+\r
+ if (!parent)\r
+ dev->devpath [0] = '0';\r
+ dev->bus = bus;\r
+ dev->parent = parent;\r
+ INIT_LIST_HEAD(&dev->filelist);\r
+\r
+ init_MUTEX(&dev->serialize);\r
+\r
+ if (dev->bus->op->allocate)\r
+ dev->bus->op->allocate(dev);\r
+\r
+ return dev;\r
+}\r
+\r
+/**\r
+ * usb_get_dev - increments the reference count of the usb device structure\r
+ * @dev: the device being referenced\r
+ *\r
+ * Each live reference to a device should be refcounted.\r
+ *\r
+ * Drivers for USB interfaces should normally record such references in\r
+ * their probe() methods, when they bind to an interface, and release\r
+ * them by calling usb_put_dev(), in their disconnect() methods.\r
+ *\r
+ * A pointer to the device with the incremented reference counter is returned.\r
+ */\r
+struct usb_device *usb_get_dev (struct usb_device *dev)\r
+{\r
+ struct device *tmp;\r
+\r
+ if (!dev)\r
+ return NULL;\r
+\r
+ tmp = get_device(&dev->dev);\r
+ if (tmp) \r
+ return to_usb_device(tmp);\r
+ else\r
+ return NULL;\r
+}\r
+\r
+/**\r
+ * usb_put_dev - release a use of the usb device structure\r
+ * @dev: device that's been disconnected\r
+ *\r
+ * Must be called when a user of a device is finished with it. When the last\r
+ * user of the device calls this function, the memory of the device is freed.\r
+ */\r
+void STDCALL usb_put_dev(struct usb_device *dev)\r
+{\r
+ if (dev)\r
+ put_device(&dev->dev);\r
+}\r
+\r
+/**\r
+ * usb_release_dev - free a usb device structure when all users of it are finished.\r
+ * @dev: device that's been disconnected\r
+ *\r
+ * Will be called only by the device core when all users of this usb device are\r
+ * done.\r
+ */\r
+static void usb_release_dev(struct device *dev)\r
+{\r
+ struct usb_device *udev;\r
+\r
+ udev = to_usb_device(dev);\r
+\r
+ if (udev->bus && udev->bus->op && udev->bus->op->deallocate)\r
+ udev->bus->op->deallocate(udev);\r
+ usb_destroy_configuration (udev);\r
+ usb_bus_put (udev->bus);\r
+ kfree (udev);\r
+}\r
+\r
+\r
+static struct usb_device *match_device(struct usb_device *dev,\r
+ u16 vendor_id, u16 product_id)\r
+{\r
+ struct usb_device *ret_dev = NULL;\r
+ int child;\r
+\r
+ dbg("looking at vendor %d, product %d",\r
+ dev->descriptor.idVendor,\r
+ dev->descriptor.idProduct);\r
+\r
+ /* see if this device matches */\r
+ if ((dev->descriptor.idVendor == vendor_id) &&\r
+ (dev->descriptor.idProduct == product_id)) {\r
+ dbg ("found the device!");\r
+ ret_dev = usb_get_dev(dev);\r
+ goto exit;\r
+ }\r
+\r
+ /* look through all of the children of this device */\r
+ for (child = 0; child < dev->maxchild; ++child) {\r
+ if (dev->children[child]) {\r
+ ret_dev = match_device(dev->children[child],\r
+ vendor_id, product_id);\r
+ if (ret_dev)\r
+ goto exit;\r
+ }\r
+ }\r
+exit:\r
+ return ret_dev;\r
+}\r
+\r
+/**\r
+ * usb_find_device - find a specific usb device in the system\r
+ * @vendor_id: the vendor id of the device to find\r
+ * @product_id: the product id of the device to find\r
+ *\r
+ * Returns a pointer to a struct usb_device if such a specified usb\r
+ * device is present in the system currently. The usage count of the\r
+ * device will be incremented if a device is found. Make sure to call\r
+ * usb_put_dev() when the caller is finished with the device.\r
+ *\r
+ * If a device with the specified vendor and product id is not found,\r
+ * NULL is returned.\r
+ */\r
+struct usb_device *usb_find_device(u16 vendor_id, u16 product_id)\r
+{\r
+ struct list_head *buslist;\r
+ struct usb_bus *bus;\r
+ struct usb_device *dev = NULL;\r
+ \r
+ down(&usb_bus_list_lock);\r
+ for (buslist = usb_bus_list.next;\r
+ buslist != &usb_bus_list; \r
+ buslist = buslist->next) {\r
+ bus = container_of(buslist, struct usb_bus, bus_list);\r
+ dev = match_device(bus->root_hub, vendor_id, product_id);\r
+ if (dev)\r
+ goto exit;\r
+ }\r
+exit:\r
+ up(&usb_bus_list_lock);\r
+ return dev;\r
+}\r
+\r
+/**\r
+ * usb_get_current_frame_number - return current bus frame number\r
+ * @dev: the device whose bus is being queried\r
+ *\r
+ * Returns the current frame number for the USB host controller\r
+ * used with the given USB device. This can be used when scheduling\r
+ * isochronous requests.\r
+ *\r
+ * Note that different kinds of host controller have different\r
+ * "scheduling horizons". While one type might support scheduling only\r
+ * 32 frames into the future, others could support scheduling up to\r
+ * 1024 frames into the future.\r
+ */\r
+int usb_get_current_frame_number(struct usb_device *dev)\r
+{\r
+ return dev->bus->op->get_frame_number (dev);\r
+}\r
+\r
+/*-------------------------------------------------------------------*/\r
+/*\r
+ * __usb_get_extra_descriptor() finds a descriptor of specific type in the\r
+ * extra field of the interface and endpoint descriptor structs.\r
+ */\r
+\r
+int __usb_get_extra_descriptor(char *buffer, unsigned size, unsigned char type, void **ptr)\r
+{\r
+ struct usb_descriptor_header *header;\r
+\r
+ while (size >= sizeof(struct usb_descriptor_header)) {\r
+ header = (struct usb_descriptor_header *)buffer;\r
+\r
+ if (header->bLength < 2) {\r
+ err("invalid descriptor length of %d", header->bLength);\r
+ return -1;\r
+ }\r
+\r
+ if (header->bDescriptorType == type) {\r
+ *ptr = header;\r
+ return 0;\r
+ }\r
+\r
+ buffer += header->bLength;\r
+ size -= header->bLength;\r
+ }\r
+ return -1;\r
+}\r
+\r
+/**\r
+ * usb_disconnect - disconnect a device (usbcore-internal)\r
+ * @pdev: pointer to device being disconnected\r
+ * Context: !in_interrupt ()\r
+ *\r
+ * Something got disconnected. Get rid of it, and all of its children.\r
+ *\r
+ * Only hub drivers (including virtual root hub drivers for host\r
+ * controllers) should ever call this.\r
+ *\r
+ * This call is synchronous, and may not be used in an interrupt context.\r
+ */\r
+void usb_disconnect(struct usb_device **pdev)\r
+{\r
+ struct usb_device *dev = *pdev;\r
+ struct usb_bus *bus;\r
+ struct usb_operations *ops;\r
+ int i;\r
+\r
+ might_sleep ();\r
+\r
+ if (!dev) {\r
+ pr_debug ("%s nodev\n", __FUNCTION__);\r
+ return;\r
+ }\r
+ bus = dev->bus;\r
+ if (!bus) {\r
+ pr_debug ("%s nobus\n", __FUNCTION__);\r
+ return;\r
+ }\r
+ ops = bus->op;\r
+\r
+ *pdev = NULL;\r
+\r
+ /* mark the device as inactive, so any further urb submissions for\r
+ * this device will fail.\r
+ */\r
+ dev->state = USB_STATE_NOTATTACHED;\r
+\r
+ dev_info (&dev->dev, "USB disconnect, address %d\n", dev->devnum);\r
+\r
+ /* Free up all the children before we remove this device */\r
+ for (i = 0; i < USB_MAXCHILDREN; i++) {\r
+ struct usb_device **child = dev->children + i;\r
+ if (*child)\r
+ usb_disconnect(child);\r
+ }\r
+\r
+ /* disconnect() drivers from interfaces (a key side effect) */\r
+ dev_dbg (&dev->dev, "unregistering interfaces\n");\r
+ if (dev->actconfig) {\r
+ for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) {\r
+ struct usb_interface *interface;\r
+\r
+ /* remove this interface */\r
+ interface = &dev->actconfig->interface[i];\r
+ device_unregister(&interface->dev);\r
+ }\r
+ }\r
+\r
+ /* deallocate hcd/hardware state */\r
+ if (ops->disable) {\r
+ void (*disable)(struct usb_device *, int) = ops->disable;\r
+\r
+ for (i = 0; i < 15; i++) {\r
+ disable (dev, i);\r
+ disable (dev, USB_DIR_IN | i);\r
+ }\r
+ }\r
+\r
+ dev_dbg (&dev->dev, "unregistering device\n");\r
+ /* Free the device number and remove the /proc/bus/usb entry */\r
+ if (dev->devnum > 0) {\r
+ clear_bit(dev->devnum, dev->bus->devmap.devicemap);\r
+ usbfs_remove_device(dev);\r
+ }\r
+ device_unregister(&dev->dev);\r
+\r
+ /* Decrement the reference count, it'll auto free everything when */\r
+ /* it hits 0 which could very well be now */\r
+ usb_put_dev(dev);\r
+}\r
+\r
+/**\r
+ * usb_connect - pick device address (usbcore-internal)\r
+ * @dev: newly detected device (in DEFAULT state)\r
+ *\r
+ * Picks a device address. It's up to the hub (or root hub) driver\r
+ * to handle and manage enumeration, starting from the DEFAULT state.\r
+ * Only hub drivers (including virtual root hub drivers for host\r
+ * controllers) should ever call this.\r
+ */\r
+void STDCALL usb_connect(struct usb_device *dev)\r
+{\r
+ int devnum;\r
+ // FIXME needs locking for SMP!!\r
+ /* why? this is called only from the hub thread, \r
+ * which hopefully doesn't run on multiple CPU's simultaneously 8-)\r
+ * ... it's also called from modprobe/rmmod/apmd threads as part\r
+ * of virtual root hub init/reinit. In the init case, the hub code \r
+ * won't have seen this, but not so for reinit ... \r
+ */\r
+ dev->descriptor.bMaxPacketSize0 = 8; /* Start off at 8 bytes */\r
+\r
+ /* Try to allocate the next devnum beginning at bus->devnum_next. */\r
+ devnum = find_next_zero_bit(dev->bus->devmap.devicemap, 128, dev->bus->devnum_next);\r
+ if (devnum >= 128)\r
+ devnum = find_next_zero_bit(dev->bus->devmap.devicemap, 128, 1);\r
+\r
+ dev->bus->devnum_next = ( devnum >= 127 ? 1 : devnum + 1);\r
+\r
+ if (devnum < 128) {\r
+ set_bit(devnum, dev->bus->devmap.devicemap);\r
+ dev->devnum = devnum;\r
+ }\r
+}\r
+\r
+\r
+// hub-only!! ... and only exported for reset/reinit path.\r
+// otherwise used internally, for usb_new_device()\r
+int usb_set_address(struct usb_device *dev)\r
+{\r
+ int retval;\r
+\r
+ if (dev->devnum == 0)\r
+ return -EINVAL;\r
+ if (dev->state != USB_STATE_DEFAULT && dev->state != USB_STATE_ADDRESS)\r
+ return -EINVAL;\r
+ retval = usb_control_msg(dev, usb_snddefctrl(dev), USB_REQ_SET_ADDRESS,\r
+ 0, dev->devnum, 0, NULL, 0, HZ * USB_CTRL_SET_TIMEOUT);\r
+ if (retval == 0)\r
+ dev->state = USB_STATE_ADDRESS;\r
+ return retval;\r
+}\r
+\r
+\r
+/* improve on the default device description, if we can ... and\r
+ * while we're at it, maybe show the vendor and product strings.\r
+ */\r
+static void set_device_description (struct usb_device *dev)\r
+{\r
+ void *buf;\r
+ int mfgr = dev->descriptor.iManufacturer;\r
+ int prod = dev->descriptor.iProduct;\r
+ int vendor_id = dev->descriptor.idVendor;\r
+ int product_id = dev->descriptor.idProduct;\r
+ char *mfgr_str, *prod_str;\r
+\r
+ /* set default; keep it if there are no strings, or kmalloc fails */\r
+ sprintf (dev->dev.name, "USB device %04x:%04x",\r
+ vendor_id, product_id);\r
+\r
+ if (!(buf = kmalloc(256 * 2, GFP_KERNEL)))\r
+ return;\r
+ \r
+ prod_str = (char *) buf;\r
+ mfgr_str = (char *) buf + 256;\r
+\r
+ if (prod && usb_string (dev, prod, prod_str, 256) > 0) {\r
+#ifdef DEBUG\r
+ dev_printk (KERN_INFO, &dev->dev, "Product: %s\n", prod_str);\r
+#endif\r
+ } else {\r
+ prod_str = 0;\r
+ }\r
+\r
+ if (mfgr && usb_string (dev, mfgr, mfgr_str, 256) > 0) {\r
+#ifdef DEBUG\r
+ dev_printk (KERN_INFO, &dev->dev, "Manufacturer: %s\n", mfgr_str);\r
+#endif\r
+ } else {\r
+ mfgr_str = 0;\r
+ }\r
+\r
+ /* much like pci ... describe as either:\r
+ * - both strings: 'product descr (vendor descr)'\r
+ * - product only: 'product descr (USB device vvvv:pppp)'\r
+ * - vendor only: 'USB device vvvv:pppp (vendor descr)'\r
+ * - neither string: 'USB device vvvv:pppp'\r
+ */\r
+\r
+ if (prod_str && mfgr_str) {\r
+\r
+ snprintf(dev->dev.name, sizeof dev->dev.name,\r
+ "%s (%s)", prod_str, mfgr_str);\r
+ } else if (prod_str) {\r
+ snprintf(dev->dev.name, sizeof dev->dev.name,\r
+ "%s (USB device %04x:%04x)",\r
+ prod_str, vendor_id, product_id);\r
+\r
+ } else if (mfgr_str) {\r
+ snprintf(dev->dev.name, sizeof dev->dev.name,\r
+ "USB device %04x:%04x (%s)",\r
+ vendor_id, product_id, mfgr_str);\r
+ }\r
+ //usbprintk("USB connected: %s\n",dev->dev.name);\r
+ kfree(buf);\r
+}\r
+\r
+/*\r
+ * By the time we get here, we chose a new device address\r
+ * and is in the default state. We need to identify the thing and\r
+ * get the ball rolling..\r
+ *\r
+ * Returns 0 for success, != 0 for error.\r
+ *\r
+ * This call is synchronous, and may not be used in an interrupt context.\r
+ *\r
+ * Only hub drivers (including virtual root hub drivers for host\r
+ * controllers) should ever call this.\r
+ */\r
+#define NEW_DEVICE_RETRYS 2\r
+#define SET_ADDRESS_RETRYS 2\r
+int usb_new_device(struct usb_device *dev, struct device *parent)\r
+{\r
+ int err = 0;\r
+ int i;\r
+ int j;\r
+\r
+ /*\r
+ * Set the driver for the usb device to point to the "generic" driver.\r
+ * This prevents the main usb device from being sent to the usb bus\r
+ * probe function. Yes, it's a hack, but a nice one :)\r
+ *\r
+ * Do it asap, so more driver model stuff (like the device.h message\r
+ * utilities) can be used in hcd submit/unlink code paths.\r
+ */\r
+ usb_generic_driver.bus = &usb_bus_type;\r
+ dev->dev.parent = parent;\r
+ dev->dev.driver = &usb_generic_driver;\r
+ dev->dev.bus = &usb_bus_type;\r
+ dev->dev.release = usb_release_dev;\r
+ dev->dev.driver_data = &usb_generic_driver_data;\r
+ usb_get_dev(dev);\r
+ if (dev->dev.bus_id[0] == 0)\r
+ sprintf (&dev->dev.bus_id[0], "%d-%s",\r
+ dev->bus->busnum, dev->devpath);\r
+\r
+ /* dma masks come from the controller; readonly, except to hcd */\r
+ dev->dev.dma_mask = parent->dma_mask;\r
+\r
+ /* USB 2.0 section 5.5.3 talks about ep0 maxpacket ...\r
+ * it's fixed size except for full speed devices.\r
+ */\r
+ switch (dev->speed) {\r
+ case USB_SPEED_HIGH: /* fixed at 64 */\r
+ i = 64;\r
+ break;\r
+ case USB_SPEED_FULL: /* 8, 16, 32, or 64 */\r
+ /* to determine the ep0 maxpacket size, read the first 8\r
+ * bytes from the device descriptor to get bMaxPacketSize0;\r
+ * then correct our initial (small) guess.\r
+ */\r
+ // FALLTHROUGH\r
+ case USB_SPEED_LOW: /* fixed at 8 */\r
+ i = 8;\r
+ break;\r
+ default:\r
+ return -EINVAL;\r
+ }\r
+ dev->epmaxpacketin [0] = i;\r
+ dev->epmaxpacketout[0] = i;\r
+\r
+ for (i = 0; i < NEW_DEVICE_RETRYS; ++i) {\r
+\r
+ for (j = 0; j < SET_ADDRESS_RETRYS; ++j) {\r
+ err = usb_set_address(dev);\r
+ if (err >= 0)\r
+ break;\r
+ wait_ms(200);\r
+ }\r
+ if (err < 0) {\r
+ dev_err(&dev->dev, "USB device not accepting new address=%d (error=%d)\n",\r
+ dev->devnum, err);\r
+ dev->state = USB_STATE_DEFAULT;\r
+ clear_bit(dev->devnum, dev->bus->devmap.devicemap);\r
+ dev->devnum = -1;\r
+ return 1;\r
+ }\r
+\r
+ wait_ms(10); /* Let the SET_ADDRESS settle */\r
+\r
+ /* high and low speed devices don't need this... */\r
+ err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, &dev->descriptor, 8);\r
+ if (err >= 8)\r
+ break;\r
+ wait_ms(100);\r
+ }\r
+\r
+ if (err < 8) {\r
+ if (err < 0)\r
+ dev_err(&dev->dev, "USB device not responding, giving up (error=%d)\n", err);\r
+ else\r
+ dev_err(&dev->dev, "USB device descriptor short read (expected %i, got %i)\n", 8, err);\r
+ clear_bit(dev->devnum, dev->bus->devmap.devicemap);\r
+ dev->devnum = -1;\r
+ return 1;\r
+ }\r
+ if (dev->speed == USB_SPEED_FULL) {\r
+ dev->epmaxpacketin [0] = dev->descriptor.bMaxPacketSize0;\r
+ dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;\r
+ }\r
+\r
+ /* USB device state == addressed ... still not usable */\r
+\r
+ err = usb_get_device_descriptor(dev);\r
+ if (err < (signed)sizeof(dev->descriptor)) {\r
+ if (err < 0)\r
+ dev_err(&dev->dev, "unable to get device descriptor (error=%d)\n", err);\r
+ else\r
+ dev_err(&dev->dev, "USB device descriptor short read (expected %Zi, got %i)\n",\r
+ sizeof(dev->descriptor), err);\r
+ \r
+ clear_bit(dev->devnum, dev->bus->devmap.devicemap);\r
+ dev->devnum = -1;\r
+ return 1;\r
+ }\r
+\r
+ err = usb_get_configuration(dev);\r
+ if (err < 0) {\r
+ dev_err(&dev->dev, "unable to get device %d configuration (error=%d)\n",\r
+ dev->devnum, err);\r
+ clear_bit(dev->devnum, dev->bus->devmap.devicemap);\r
+ dev->devnum = -1;\r
+ return 1;\r
+ }\r
+\r
+ /* we set the default configuration here */\r
+ err = usb_set_configuration(dev, dev->config[0].desc.bConfigurationValue);\r
+ if (err) {\r
+ dev_err(&dev->dev, "failed to set device %d default configuration (error=%d)\n",\r
+ dev->devnum, err);\r
+ clear_bit(dev->devnum, dev->bus->devmap.devicemap);\r
+ dev->devnum = -1;\r
+ return 1;\r
+ }\r
+\r
+ /* USB device state == configured ... tell the world! */\r
+\r
+ dev_dbg(&dev->dev, "new device strings: Mfr=%d, Product=%d, SerialNumber=%d\n",\r
+ dev->descriptor.iManufacturer, dev->descriptor.iProduct, dev->descriptor.iSerialNumber);\r
+ set_device_description (dev);\r
+\r
+#ifdef DEBUG\r
+ if (dev->descriptor.iSerialNumber)\r
+ usb_show_string(dev, "SerialNumber", dev->descriptor.iSerialNumber);\r
+#endif\r
+ /* put into sysfs, with device and config specific files */\r
+ err = device_add (&dev->dev);\r
+ if (err)\r
+ return err;\r
+ usb_create_driverfs_dev_files (dev);\r
+\r
+ /* Register all of the interfaces for this device with the driver core.\r
+ * Remember, interfaces get bound to drivers, not devices. */\r
+ for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) {\r
+ struct usb_interface *interface = &dev->actconfig->interface[i];\r
+ struct usb_interface_descriptor *desc;\r
+\r
+ desc = &interface->altsetting [interface->act_altsetting].desc;\r
+ interface->dev.parent = &dev->dev;\r
+ interface->dev.driver = NULL;\r
+ interface->dev.bus = &usb_bus_type;\r
+ interface->dev.dma_mask = parent->dma_mask;\r
+ sprintf (&interface->dev.bus_id[0], "%d-%s:%d",\r
+ dev->bus->busnum, dev->devpath,\r
+ desc->bInterfaceNumber);\r
+ if (!desc->iInterface\r
+ || usb_string (dev, desc->iInterface,\r
+ interface->dev.name,\r
+ sizeof interface->dev.name) <= 0) {\r
+ /* typically devices won't bother with interface\r
+ * descriptions; this is the normal case. an\r
+ * interface's driver might describe it better.\r
+ * (also: iInterface is per-altsetting ...)\r
+ */\r
+ sprintf (&interface->dev.name[0],\r
+ "usb-%s-%s interface %d",\r
+ dev->bus->bus_name, dev->devpath,\r
+ desc->bInterfaceNumber);\r
+ }\r
+ dev_dbg (&dev->dev, "%s - registering interface %s\n", __FUNCTION__, interface->dev.bus_id);\r
+ device_add (&interface->dev);\r
+ usb_create_driverfs_intf_files (interface);\r
+ }\r
+ /* add a /proc/bus/usb entry */\r
+ usbfs_add_device(dev);\r
+\r
+ return 0;\r
+}\r
+\r
+/**\r
+ * usb_buffer_alloc - allocate dma-consistent buffer for URB_NO_DMA_MAP\r
+ * @dev: device the buffer will be used with\r
+ * @size: requested buffer size\r
+ * @mem_flags: affect whether allocation may block\r
+ * @dma: used to return DMA address of buffer\r
+ *\r
+ * Return value is either null (indicating no buffer could be allocated), or\r
+ * the cpu-space pointer to a buffer that may be used to perform DMA to the\r
+ * specified device. Such cpu-space buffers are returned along with the DMA\r
+ * address (through the pointer provided).\r
+ *\r
+ * These buffers are used with URB_NO_DMA_MAP set in urb->transfer_flags to\r
+ * avoid behaviors like using "DMA bounce buffers", or tying down I/O mapping\r
+ * hardware for long idle periods. The implementation varies between\r
+ * platforms, depending on details of how DMA will work to this device.\r
+ * Using these buffers also helps prevent cacheline sharing problems on\r
+ * architectures where CPU caches are not DMA-coherent.\r
+ *\r
+ * When the buffer is no longer used, free it with usb_buffer_free().\r
+ */\r
+void *usb_buffer_alloc (\r
+ struct usb_device *dev,\r
+ size_t size,\r
+ int mem_flags,\r
+ dma_addr_t *dma\r
+)\r
+{\r
+ if (!dev || !dev->bus || !dev->bus->op || !dev->bus->op->buffer_alloc)\r
+ return 0;\r
+ return dev->bus->op->buffer_alloc (dev->bus, size, mem_flags, dma);\r
+}\r
+\r
+/**\r
+ * usb_buffer_free - free memory allocated with usb_buffer_alloc()\r
+ * @dev: device the buffer was used with\r
+ * @size: requested buffer size\r
+ * @addr: CPU address of buffer\r
+ * @dma: DMA address of buffer\r
+ *\r
+ * This reclaims an I/O buffer, letting it be reused. The memory must have\r
+ * been allocated using usb_buffer_alloc(), and the parameters must match\r
+ * those provided in that allocation request. \r
+ */\r
+void usb_buffer_free (\r
+ struct usb_device *dev,\r
+ size_t size,\r
+ void *addr,\r
+ dma_addr_t dma\r
+)\r
+{\r
+ if (!dev || !dev->bus || !dev->bus->op || !dev->bus->op->buffer_free)\r
+ return;\r
+ dev->bus->op->buffer_free (dev->bus, size, addr, dma);\r
+}\r
+\r
+/**\r
+ * usb_buffer_map - create DMA mapping(s) for an urb\r
+ * @urb: urb whose transfer_buffer will be mapped\r
+ *\r
+ * Return value is either null (indicating no buffer could be mapped), or\r
+ * the parameter. URB_NO_DMA_MAP is added to urb->transfer_flags if the\r
+ * operation succeeds. If the device is connected to this system through\r
+ * a non-DMA controller, this operation always succeeds.\r
+ *\r
+ * This call would normally be used for an urb which is reused, perhaps\r
+ * as the target of a large periodic transfer, with usb_buffer_dmasync()\r
+ * calls to synchronize memory and dma state. It may not be used for\r
+ * control requests.\r
+ *\r
+ * Reverse the effect of this call with usb_buffer_unmap().\r
+ */\r
+struct urb *usb_buffer_map (struct urb *urb)\r
+{\r
+ struct usb_bus *bus;\r
+ struct device *controller;\r
+\r
+ if (!urb\r
+ || usb_pipecontrol (urb->pipe)\r
+ || !urb->dev\r
+ || !(bus = urb->dev->bus)\r
+ || !(controller = bus->controller))\r
+ return 0;\r
+\r
+ if (controller->dma_mask) {\r
+ urb->transfer_dma = dma_map_single (controller,\r
+ urb->transfer_buffer, urb->transfer_buffer_length,\r
+ usb_pipein (urb->pipe)\r
+ ? DMA_FROM_DEVICE : DMA_TO_DEVICE);\r
+ // FIXME generic api broken like pci, can't report errors\r
+ // if (urb->transfer_dma == DMA_ADDR_INVALID) return 0;\r
+ } else\r
+ urb->transfer_dma = ~0;\r
+ urb->transfer_flags |= URB_NO_DMA_MAP;\r
+ return urb;\r
+}\r
+\r
+/**\r
+ * usb_buffer_dmasync - synchronize DMA and CPU view of buffer(s)\r
+ * @urb: urb whose transfer_buffer will be synchronized\r
+ */\r
+void usb_buffer_dmasync (struct urb *urb)\r
+{\r
+ struct usb_bus *bus;\r
+ struct device *controller;\r
+\r
+ if (!urb\r
+ || !(urb->transfer_flags & URB_NO_DMA_MAP)\r
+ || !urb->dev\r
+ || !(bus = urb->dev->bus)\r
+ || !(controller = bus->controller))\r
+ return;\r
+\r
+ if (controller->dma_mask)\r
+ dma_sync_single (controller,\r
+ urb->transfer_dma, urb->transfer_buffer_length,\r
+ usb_pipein (urb->pipe)\r
+ ? DMA_FROM_DEVICE : DMA_TO_DEVICE);\r
+}\r
+\r
+/**\r
+ * usb_buffer_unmap - free DMA mapping(s) for an urb\r
+ * @urb: urb whose transfer_buffer will be unmapped\r
+ *\r
+ * Reverses the effect of usb_buffer_map().\r
+ */\r
+void usb_buffer_unmap (struct urb *urb)\r
+{\r
+ struct usb_bus *bus;\r
+ struct device *controller;\r
+\r
+ if (!urb\r
+ || !(urb->transfer_flags & URB_NO_DMA_MAP)\r
+ || !urb->dev\r
+ || !(bus = urb->dev->bus)\r
+ || !(controller = bus->controller))\r
+ return;\r
+\r
+ if (controller->dma_mask)\r
+ dma_unmap_single (controller,\r
+ urb->transfer_dma, urb->transfer_buffer_length,\r
+ usb_pipein (urb->pipe)\r
+ ? DMA_FROM_DEVICE : DMA_TO_DEVICE);\r
+ urb->transfer_flags &= ~URB_NO_DMA_MAP;\r
+}\r
+\r
+/**\r
+ * usb_buffer_map_sg - create scatterlist DMA mapping(s) for an endpoint\r
+ * @dev: device to which the scatterlist will be mapped\r
+ * @pipe: endpoint defining the mapping direction\r
+ * @sg: the scatterlist to map\r
+ * @nents: the number of entries in the scatterlist\r
+ *\r
+ * Return value is either < 0 (indicating no buffers could be mapped), or\r
+ * the number of DMA mapping array entries in the scatterlist.\r
+ *\r
+ * The caller is responsible for placing the resulting DMA addresses from\r
+ * the scatterlist into URB transfer buffer pointers, and for setting the\r
+ * URB_NO_DMA_MAP transfer flag in each of those URBs.\r
+ *\r
+ * Top I/O rates come from queuing URBs, instead of waiting for each one\r
+ * to complete before starting the next I/O. This is particularly easy\r
+ * to do with scatterlists. Just allocate and submit one URB for each DMA\r
+ * mapping entry returned, stopping on the first error or when all succeed.\r
+ * Better yet, use the usb_sg_*() calls, which do that (and more) for you.\r
+ *\r
+ * This call would normally be used when translating scatterlist requests,\r
+ * rather than usb_buffer_map(), since on some hardware (with IOMMUs) it\r
+ * may be able to coalesce mappings for improved I/O efficiency.\r
+ *\r
+ * Reverse the effect of this call with usb_buffer_unmap_sg().\r
+ */\r
+int usb_buffer_map_sg (struct usb_device *dev, unsigned pipe,\r
+ struct scatterlist *sg, int nents)\r
+{\r
+ struct usb_bus *bus;\r
+ struct device *controller;\r
+\r
+ if (!dev\r
+ || usb_pipecontrol (pipe)\r
+ || !(bus = dev->bus)\r
+ || !(controller = bus->controller)\r
+ || !controller->dma_mask)\r
+ return -1;\r
+\r
+ // FIXME generic api broken like pci, can't report errors\r
+ return dma_map_sg (controller, sg, nents,\r
+ usb_pipein (pipe) ? DMA_FROM_DEVICE : DMA_TO_DEVICE);\r
+}\r
+\r
+/**\r
+ * usb_buffer_dmasync_sg - synchronize DMA and CPU view of scatterlist buffer(s)\r
+ * @dev: device to which the scatterlist will be mapped\r
+ * @pipe: endpoint defining the mapping direction\r
+ * @sg: the scatterlist to synchronize\r
+ * @n_hw_ents: the positive return value from usb_buffer_map_sg\r
+ *\r
+ * Use this when you are re-using a scatterlist's data buffers for\r
+ * another USB request.\r
+ */\r
+void usb_buffer_dmasync_sg (struct usb_device *dev, unsigned pipe,\r
+ struct scatterlist *sg, int n_hw_ents)\r
+{\r
+ struct usb_bus *bus;\r
+ struct device *controller;\r
+\r
+ if (!dev\r
+ || !(bus = dev->bus)\r
+ || !(controller = bus->controller)\r
+ || !controller->dma_mask)\r
+ return;\r
+\r
+ dma_sync_sg (controller, sg, n_hw_ents,\r
+ usb_pipein (pipe) ? DMA_FROM_DEVICE : DMA_TO_DEVICE);\r
+}\r
+\r
+/**\r
+ * usb_buffer_unmap_sg - free DMA mapping(s) for a scatterlist\r
+ * @dev: device to which the scatterlist will be mapped\r
+ * @pipe: endpoint defining the mapping direction\r
+ * @sg: the scatterlist to unmap\r
+ * @n_hw_ents: the positive return value from usb_buffer_map_sg\r
+ *\r
+ * Reverses the effect of usb_buffer_map_sg().\r
+ */\r
+void usb_buffer_unmap_sg (struct usb_device *dev, unsigned pipe,\r
+ struct scatterlist *sg, int n_hw_ents)\r
+{\r
+ struct usb_bus *bus;\r
+ struct device *controller;\r
+\r
+ if (!dev\r
+ || !(bus = dev->bus)\r
+ || !(controller = bus->controller)\r
+ || !controller->dma_mask)\r
+ return;\r
+\r
+ dma_unmap_sg (controller, sg, n_hw_ents,\r
+ usb_pipein (pipe) ? DMA_FROM_DEVICE : DMA_TO_DEVICE);\r
+}\r
+\r
+\r
+struct bus_type usb_bus_type = {\r
+ .name = "usb",\r
+ .match = usb_device_match,\r
+ .hotplug = usb_hotplug,\r
+};\r
+\r
+#ifndef MODULE\r
+\r
+static int __init usb_setup_disable(char *str)\r
+{\r
+ nousb = 1;\r
+ return 1;\r
+}\r
+\r
+/* format to disable USB on kernel command line is: nousb */\r
+__setup("nousb", usb_setup_disable);\r
+\r
+#endif\r
+\r
+/*\r
+ * for external read access to <nousb>\r
+ */\r
+int STDCALL usb_disabled(void)\r
+{\r
+ return nousb;\r
+}\r
+\r
+/*\r
+ * Init\r
+ */\r
+static int __init usb_init(void)\r
+{\r
+ if (nousb) {\r
+ info("USB support disabled\n");\r
+ return 0;\r
+ }\r
+\r
+ bus_register(&usb_bus_type);\r
+ usb_major_init();\r
+ usbfs_init();\r
+ usb_hub_init();\r
+\r
+ driver_register(&usb_generic_driver);\r
+\r
+ return 0;\r
+}\r
+\r
+/*\r
+ * Cleanup\r
+ */\r
+static void __exit usb_exit(void)\r
+{\r
+ /* This will matter if shutdown/reboot does exitcalls. */\r
+ if (nousb)\r
+ return;\r
+\r
+ driver_unregister(&usb_generic_driver);\r
+ usb_major_cleanup();\r
+ usbfs_cleanup();\r
+ usb_hub_cleanup();\r
+ bus_unregister(&usb_bus_type);\r
+}\r
+\r
+subsys_initcall(usb_init);\r
+module_exit(usb_exit);\r
+\r
+/*\r
+ * USB may be built into the kernel or be built as modules.\r
+ * These symbols are exported for device (or host controller)\r
+ * driver modules to use.\r
+ */\r
+EXPORT_SYMBOL(usb_epnum_to_ep_desc);\r
+\r
+EXPORT_SYMBOL(usb_register);\r
+EXPORT_SYMBOL(usb_deregister);\r
+EXPORT_SYMBOL(usb_disabled);\r
+\r
+EXPORT_SYMBOL(usb_device_probe);\r
+EXPORT_SYMBOL(usb_device_remove);\r
+\r
+EXPORT_SYMBOL(usb_alloc_dev);\r
+EXPORT_SYMBOL(usb_put_dev);\r
+EXPORT_SYMBOL(usb_get_dev);\r
+EXPORT_SYMBOL(usb_hub_tt_clear_buffer);\r
+\r
+EXPORT_SYMBOL(usb_driver_claim_interface);\r
+EXPORT_SYMBOL(usb_interface_claimed);\r
+EXPORT_SYMBOL(usb_driver_release_interface);\r
+EXPORT_SYMBOL(usb_match_id);\r
+EXPORT_SYMBOL(usb_find_interface);\r
+EXPORT_SYMBOL(usb_ifnum_to_if);\r
+\r
+EXPORT_SYMBOL(usb_new_device);\r
+EXPORT_SYMBOL(usb_reset_device);\r
+EXPORT_SYMBOL(usb_connect);\r
+EXPORT_SYMBOL(usb_disconnect);\r
+\r
+EXPORT_SYMBOL(__usb_get_extra_descriptor);\r
+\r
+EXPORT_SYMBOL(usb_find_device);\r
+EXPORT_SYMBOL(usb_get_current_frame_number);\r
+\r
+EXPORT_SYMBOL (usb_buffer_alloc);\r
+EXPORT_SYMBOL (usb_buffer_free);\r
+\r
+EXPORT_SYMBOL (usb_buffer_map);\r
+EXPORT_SYMBOL (usb_buffer_dmasync);\r
+EXPORT_SYMBOL (usb_buffer_unmap);\r
+\r
+EXPORT_SYMBOL (usb_buffer_map_sg);\r
+EXPORT_SYMBOL (usb_buffer_dmasync_sg);\r
+EXPORT_SYMBOL (usb_buffer_unmap_sg);\r
+\r
+MODULE_LICENSE("GPL");\r
--- /dev/null
+/* Functions local to drivers/usb/core/ */\r
+\r
+extern void usb_create_driverfs_dev_files (struct usb_device *dev);\r
+extern void usb_create_driverfs_intf_files (struct usb_interface *intf);\r
+\r
--- /dev/null
+/*\r
+ ReactOS specific functions for usbcore module\r
+ by Aleksey Bragin (aleksey@reactos.com)\r
+*/\r
+\r
+#include <ddk/ntddk.h>\r
+\r
+\r
+/*\r
+ * Standard DriverEntry method.\r
+ */\r
+NTSTATUS STDCALL\r
+DriverEntry(IN PVOID Context1, IN PVOID Context2)\r
+{\r
+ return STATUS_SUCCESS;\r
+}\r
--- /dev/null
+;\r
+; Exports definition file for usbcore.sys\r
+;\r
+EXPORTS\r
+usb_init_urb@4\r
+usb_alloc_urb@8\r
+usb_free_urb@4\r
+usb_get_urb@4\r
+usb_submit_urb@8\r
+usb_unlink_urb@4\r
+usb_bus_init@4\r
+usb_alloc_bus@4\r
+usb_free_bus@4\r
+usb_register_bus@4\r
+usb_deregister_bus@4\r
+usb_register_root_hub@8\r
+usb_calc_bus_time@16\r
+usb_check_bandwidth@8\r
+usb_claim_bandwidth@16\r
+usb_release_bandwidth@12\r
+usb_hcd_giveback_urb@12\r
+;usb_hcd_irq@12\r
+usb_hc_died@4\r
+usb_alloc_dev@8\r
+usb_connect@4\r
+usb_put_dev@4\r
+usb_disabled@0\r
+usb_hcd_pci_probe@8\r
+usb_hcd_pci_remove@4
\ No newline at end of file
--- /dev/null
+\r
+usbcore.nostrip.sys: file format pei-i386\r
+\r
+Disassembly of section .text:\r
+\r
+00011000 <__end__>:\r
+ 11000: 55 push %ebp\r
+ 11001: 89 e5 mov %esp,%ebp\r
+ 11003: 83 ec 08 sub $0x8,%esp\r
+ 11006: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11009: 8b 40 54 mov 0x54(%eax),%eax\r
+ 1100c: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 1100f: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 11012: c7 40 04 01 00 00 00 movl $0x1,0x4(%eax)\r
+ 11019: 83 ec 0c sub $0xc,%esp\r
+ 1101c: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 1101f: e8 41 88 00 00 call 19865 <_my_wake_up>\r
+ 11024: 83 c4 10 add $0x10,%esp\r
+ 11027: c9 leave \r
+ 11028: c3 ret \r
+\r
+00011029 <_usb_start_wait_urb>:\r
+ 11029: 55 push %ebp\r
+ 1102a: 89 e5 mov %esp,%ebp\r
+ 1102c: 83 ec 18 sub $0x18,%esp\r
+ 1102f: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 11036: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11039: 8d 55 f8 lea 0xfffffff8(%ebp),%edx\r
+ 1103c: 89 50 54 mov %edx,0x54(%eax)\r
+ 1103f: 83 ec 08 sub $0x8,%esp\r
+ 11042: 6a 00 push $0x0\r
+ 11044: ff 75 08 pushl 0x8(%ebp)\r
+ 11047: e8 57 71 00 00 call 181a3 <_usb_submit_urb@8>\r
+ 1104c: 83 c4 08 add $0x8,%esp\r
+ 1104f: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 11052: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 11056: 74 19 je 11071 <_usb_start_wait_urb+0x48>\r
+ 11058: 83 ec 0c sub $0xc,%esp\r
+ 1105b: ff 75 08 pushl 0x8(%ebp)\r
+ 1105e: e8 d3 70 00 00 call 18136 <_usb_free_urb@4>\r
+ 11063: 83 c4 0c add $0xc,%esp\r
+ 11066: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 11069: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 1106c: e9 bd 00 00 00 jmp 1112e <_usb_start_wait_urb+0x105>\r
+ 11071: 83 7d 0c 00 cmpl $0x0,0xc(%ebp)\r
+ 11075: 74 1f je 11096 <_usb_start_wait_urb+0x6d>\r
+ 11077: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 1107b: 75 19 jne 11096 <_usb_start_wait_urb+0x6d>\r
+ 1107d: 83 ec 0c sub $0xc,%esp\r
+ 11080: ff 75 0c pushl 0xc(%ebp)\r
+ 11083: e8 ec 87 00 00 call 19874 <_my_schedule_timeout>\r
+ 11088: 83 c4 10 add $0x10,%esp\r
+ 1108b: 89 45 0c mov %eax,0xc(%ebp)\r
+ 1108e: f0 83 44 24 00 00 lock addl $0x0,0x0(%esp,1)\r
+ 11094: eb db jmp 11071 <_usb_start_wait_urb+0x48>\r
+ 11096: 83 7d 0c 00 cmpl $0x0,0xc(%ebp)\r
+ 1109a: 75 64 jne 11100 <_usb_start_wait_urb+0xd7>\r
+ 1109c: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 110a0: 75 5e jne 11100 <_usb_start_wait_urb+0xd7>\r
+ 110a2: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 110a5: 83 78 1c 8d cmpl $0xffffff8d,0x1c(%eax)\r
+ 110a9: 74 3e je 110e9 <_usb_start_wait_urb+0xc0>\r
+ 110ab: 83 ec 04 sub $0x4,%esp\r
+ 110ae: 6a 45 push $0x45\r
+ 110b0: 68 00 b0 01 00 push $0x1b000\r
+ 110b5: 68 0a b0 01 00 push $0x1b00a\r
+ 110ba: e8 a1 89 00 00 call 19a60 <_DbgPrint>\r
+ 110bf: 83 c4 10 add $0x10,%esp\r
+ 110c2: ff 75 0c pushl 0xc(%ebp)\r
+ 110c5: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 110c8: ff 70 1c pushl 0x1c(%eax)\r
+ 110cb: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 110ce: ff 70 18 pushl 0x18(%eax)\r
+ 110d1: 68 14 b0 01 00 push $0x1b014\r
+ 110d6: e8 85 89 00 00 call 19a60 <_DbgPrint>\r
+ 110db: 83 c4 10 add $0x10,%esp\r
+ 110de: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 110e1: 8b 40 1c mov 0x1c(%eax),%eax\r
+ 110e4: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 110e7: eb 20 jmp 11109 <_usb_start_wait_urb+0xe0>\r
+ 110e9: 83 ec 0c sub $0xc,%esp\r
+ 110ec: ff 75 08 pushl 0x8(%ebp)\r
+ 110ef: e8 c6 73 00 00 call 184ba <_usb_unlink_urb@4>\r
+ 110f4: 83 c4 0c add $0xc,%esp\r
+ 110f7: c7 45 f4 92 ff ff ff movl $0xffffff92,0xfffffff4(%ebp)\r
+ 110fe: eb 09 jmp 11109 <_usb_start_wait_urb+0xe0>\r
+ 11100: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11103: 8b 40 1c mov 0x1c(%eax),%eax\r
+ 11106: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 11109: 83 7d 10 00 cmpl $0x0,0x10(%ebp)\r
+ 1110d: 74 0b je 1111a <_usb_start_wait_urb+0xf1>\r
+ 1110f: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 11112: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11115: 8b 52 30 mov 0x30(%edx),%edx\r
+ 11118: 89 10 mov %edx,(%eax)\r
+ 1111a: 83 ec 0c sub $0xc,%esp\r
+ 1111d: ff 75 08 pushl 0x8(%ebp)\r
+ 11120: e8 11 70 00 00 call 18136 <_usb_free_urb@4>\r
+ 11125: 83 c4 0c add $0xc,%esp\r
+ 11128: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 1112b: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 1112e: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 11131: c9 leave \r
+ 11132: c3 ret \r
+\r
+00011133 <_usb_internal_control_msg>:\r
+ 11133: 55 push %ebp\r
+ 11134: 89 e5 mov %esp,%ebp\r
+ 11136: 83 ec 18 sub $0x18,%esp\r
+ 11139: 83 ec 08 sub $0x8,%esp\r
+ 1113c: 6a 00 push $0x0\r
+ 1113e: 6a 00 push $0x0\r
+ 11140: e8 a7 6f 00 00 call 180ec <_usb_alloc_urb@8>\r
+ 11145: 83 c4 08 add $0x8,%esp\r
+ 11148: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 1114b: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 1114f: 75 09 jne 1115a <_usb_internal_control_msg+0x27>\r
+ 11151: c7 45 f0 f4 ff ff ff movl $0xfffffff4,0xfffffff0(%ebp)\r
+ 11158: eb 4d jmp 111a7 <_usb_internal_control_msg+0x74>\r
+ 1115a: 6a 00 push $0x0\r
+ 1115c: 68 00 10 01 00 push $0x11000\r
+ 11161: ff 75 18 pushl 0x18(%ebp)\r
+ 11164: ff 75 14 pushl 0x14(%ebp)\r
+ 11167: ff 75 10 pushl 0x10(%ebp)\r
+ 1116a: ff 75 0c pushl 0xc(%ebp)\r
+ 1116d: ff 75 08 pushl 0x8(%ebp)\r
+ 11170: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 11173: e8 34 00 00 00 call 111ac <_usb_fill_control_urb>\r
+ 11178: 83 c4 20 add $0x20,%esp\r
+ 1117b: 83 ec 04 sub $0x4,%esp\r
+ 1117e: 8d 45 f4 lea 0xfffffff4(%ebp),%eax\r
+ 11181: 50 push %eax\r
+ 11182: ff 75 1c pushl 0x1c(%ebp)\r
+ 11185: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 11188: e8 9c fe ff ff call 11029 <_usb_start_wait_urb>\r
+ 1118d: 83 c4 10 add $0x10,%esp\r
+ 11190: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 11193: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 11197: 79 08 jns 111a1 <_usb_internal_control_msg+0x6e>\r
+ 11199: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1119c: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 1119f: eb 06 jmp 111a7 <_usb_internal_control_msg+0x74>\r
+ 111a1: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 111a4: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 111a7: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 111aa: c9 leave \r
+ 111ab: c3 ret \r
+\r
+000111ac <_usb_fill_control_urb>:\r
+ 111ac: 55 push %ebp\r
+ 111ad: 89 e5 mov %esp,%ebp\r
+ 111af: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 111b2: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 111b5: 89 42 14 mov %eax,0x14(%edx)\r
+ 111b8: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 111bb: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 111be: 89 42 18 mov %eax,0x18(%edx)\r
+ 111c1: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 111c4: 8b 45 14 mov 0x14(%ebp),%eax\r
+ 111c7: 89 42 38 mov %eax,0x38(%edx)\r
+ 111ca: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 111cd: 8b 45 18 mov 0x18(%ebp),%eax\r
+ 111d0: 89 42 24 mov %eax,0x24(%edx)\r
+ 111d3: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 111d6: 8b 45 1c mov 0x1c(%ebp),%eax\r
+ 111d9: 89 42 2c mov %eax,0x2c(%edx)\r
+ 111dc: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 111df: 8b 45 20 mov 0x20(%ebp),%eax\r
+ 111e2: 89 42 58 mov %eax,0x58(%edx)\r
+ 111e5: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 111e8: 8b 45 24 mov 0x24(%ebp),%eax\r
+ 111eb: 89 42 54 mov %eax,0x54(%edx)\r
+ 111ee: 5d pop %ebp\r
+ 111ef: c3 ret \r
+\r
+000111f0 <_usb_control_msg>:\r
+ 111f0: 55 push %ebp\r
+ 111f1: 89 e5 mov %esp,%ebp\r
+ 111f3: 56 push %esi\r
+ 111f4: 53 push %ebx\r
+ 111f5: 83 ec 20 sub $0x20,%esp\r
+ 111f8: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 111fb: 8b 55 14 mov 0x14(%ebp),%edx\r
+ 111fe: 8b 4d 18 mov 0x18(%ebp),%ecx\r
+ 11201: 8b 5d 1c mov 0x1c(%ebp),%ebx\r
+ 11204: 8b 75 24 mov 0x24(%ebp),%esi\r
+ 11207: 88 45 f7 mov %al,0xfffffff7(%ebp)\r
+ 1120a: 88 55 f6 mov %dl,0xfffffff6(%ebp)\r
+ 1120d: 66 89 4d f4 mov %cx,0xfffffff4(%ebp)\r
+ 11211: 66 89 5d f2 mov %bx,0xfffffff2(%ebp)\r
+ 11215: 66 89 75 f0 mov %si,0xfffffff0(%ebp)\r
+ 11219: 83 ec 08 sub $0x8,%esp\r
+ 1121c: 6a 08 push $0x8\r
+ 1121e: 6a 01 push $0x1\r
+ 11220: e8 0b 88 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 11225: 83 c4 08 add $0x8,%esp\r
+ 11228: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 1122b: 83 7d ec 00 cmpl $0x0,0xffffffec(%ebp)\r
+ 1122f: 75 09 jne 1123a <_usb_control_msg+0x4a>\r
+ 11231: c7 45 e4 f4 ff ff ff movl $0xfffffff4,0xffffffe4(%ebp)\r
+ 11238: eb 6a jmp 112a4 <_usb_control_msg+0xb4>\r
+ 1123a: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 1123d: 8a 45 f6 mov 0xfffffff6(%ebp),%al\r
+ 11240: 88 02 mov %al,(%edx)\r
+ 11242: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 11245: 8a 45 f7 mov 0xfffffff7(%ebp),%al\r
+ 11248: 88 42 01 mov %al,0x1(%edx)\r
+ 1124b: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 1124e: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 11251: 66 89 42 02 mov %ax,0x2(%edx)\r
+ 11255: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 11258: 66 8b 45 f2 mov 0xfffffff2(%ebp),%ax\r
+ 1125c: 66 89 42 04 mov %ax,0x4(%edx)\r
+ 11260: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 11263: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 11266: 66 89 42 06 mov %ax,0x6(%edx)\r
+ 1126a: 83 ec 08 sub $0x8,%esp\r
+ 1126d: ff 75 28 pushl 0x28(%ebp)\r
+ 11270: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 11273: 25 ff ff 00 00 and $0xffff,%eax\r
+ 11278: 50 push %eax\r
+ 11279: ff 75 20 pushl 0x20(%ebp)\r
+ 1127c: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 1127f: ff 75 0c pushl 0xc(%ebp)\r
+ 11282: ff 75 08 pushl 0x8(%ebp)\r
+ 11285: e8 a9 fe ff ff call 11133 <_usb_internal_control_msg>\r
+ 1128a: 83 c4 20 add $0x20,%esp\r
+ 1128d: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 11290: 83 ec 0c sub $0xc,%esp\r
+ 11293: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 11296: e8 a5 87 00 00 call 19a40 <_ExFreePool@4>\r
+ 1129b: 83 c4 0c add $0xc,%esp\r
+ 1129e: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 112a1: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 112a4: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 112a7: 8d 65 f8 lea 0xfffffff8(%ebp),%esp\r
+ 112aa: 5b pop %ebx\r
+ 112ab: 5e pop %esi\r
+ 112ac: 5d pop %ebp\r
+ 112ad: c3 ret \r
+\r
+000112ae <_usb_bulk_msg>:\r
+ 112ae: 55 push %ebp\r
+ 112af: 89 e5 mov %esp,%ebp\r
+ 112b1: 83 ec 08 sub $0x8,%esp\r
+ 112b4: 83 7d 14 00 cmpl $0x0,0x14(%ebp)\r
+ 112b8: 79 09 jns 112c3 <_usb_bulk_msg+0x15>\r
+ 112ba: c7 45 f8 ea ff ff ff movl $0xffffffea,0xfffffff8(%ebp)\r
+ 112c1: eb 59 jmp 1131c <_usb_bulk_msg+0x6e>\r
+ 112c3: 83 ec 08 sub $0x8,%esp\r
+ 112c6: 6a 00 push $0x0\r
+ 112c8: 6a 00 push $0x0\r
+ 112ca: e8 1d 6e 00 00 call 180ec <_usb_alloc_urb@8>\r
+ 112cf: 83 c4 08 add $0x8,%esp\r
+ 112d2: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 112d5: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 112d9: 75 09 jne 112e4 <_usb_bulk_msg+0x36>\r
+ 112db: c7 45 f8 f4 ff ff ff movl $0xfffffff4,0xfffffff8(%ebp)\r
+ 112e2: eb 38 jmp 1131c <_usb_bulk_msg+0x6e>\r
+ 112e4: 83 ec 04 sub $0x4,%esp\r
+ 112e7: 6a 00 push $0x0\r
+ 112e9: 68 00 10 01 00 push $0x11000\r
+ 112ee: ff 75 14 pushl 0x14(%ebp)\r
+ 112f1: ff 75 10 pushl 0x10(%ebp)\r
+ 112f4: ff 75 0c pushl 0xc(%ebp)\r
+ 112f7: ff 75 08 pushl 0x8(%ebp)\r
+ 112fa: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 112fd: e8 1f 00 00 00 call 11321 <_usb_fill_bulk_urb>\r
+ 11302: 83 c4 20 add $0x20,%esp\r
+ 11305: 83 ec 04 sub $0x4,%esp\r
+ 11308: ff 75 18 pushl 0x18(%ebp)\r
+ 1130b: ff 75 1c pushl 0x1c(%ebp)\r
+ 1130e: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 11311: e8 13 fd ff ff call 11029 <_usb_start_wait_urb>\r
+ 11316: 83 c4 10 add $0x10,%esp\r
+ 11319: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 1131c: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1131f: c9 leave \r
+ 11320: c3 ret \r
+\r
+00011321 <_usb_fill_bulk_urb>:\r
+ 11321: 55 push %ebp\r
+ 11322: 89 e5 mov %esp,%ebp\r
+ 11324: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11327: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1132a: 89 42 14 mov %eax,0x14(%edx)\r
+ 1132d: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11330: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 11333: 89 42 18 mov %eax,0x18(%edx)\r
+ 11336: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11339: 8b 45 14 mov 0x14(%ebp),%eax\r
+ 1133c: 89 42 24 mov %eax,0x24(%edx)\r
+ 1133f: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11342: 8b 45 18 mov 0x18(%ebp),%eax\r
+ 11345: 89 42 2c mov %eax,0x2c(%edx)\r
+ 11348: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 1134b: 8b 45 1c mov 0x1c(%ebp),%eax\r
+ 1134e: 89 42 58 mov %eax,0x58(%edx)\r
+ 11351: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11354: 8b 45 20 mov 0x20(%ebp),%eax\r
+ 11357: 89 42 54 mov %eax,0x54(%edx)\r
+ 1135a: 5d pop %ebp\r
+ 1135b: c3 ret \r
+\r
+0001135c <_usb_get_descriptor>:\r
+ 1135c: 55 push %ebp\r
+ 1135d: 89 e5 mov %esp,%ebp\r
+ 1135f: 83 ec 18 sub $0x18,%esp\r
+ 11362: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11365: 8b 55 10 mov 0x10(%ebp),%edx\r
+ 11368: 88 45 ff mov %al,0xffffffff(%ebp)\r
+ 1136b: 88 55 fe mov %dl,0xfffffffe(%ebp)\r
+ 1136e: c7 45 f8 05 00 00 00 movl $0x5,0xfffffff8(%ebp)\r
+ 11375: 83 ec 04 sub $0x4,%esp\r
+ 11378: ff 75 18 pushl 0x18(%ebp)\r
+ 1137b: 6a 00 push $0x0\r
+ 1137d: ff 75 14 pushl 0x14(%ebp)\r
+ 11380: e8 cb 86 00 00 call 19a50 <_memset>\r
+ 11385: 83 c4 10 add $0x10,%esp\r
+ 11388: 8d 45 f8 lea 0xfffffff8(%ebp),%eax\r
+ 1138b: ff 08 decl (%eax)\r
+ 1138d: 83 7d f8 ff cmpl $0xffffffff,0xfffffff8(%ebp)\r
+ 11391: 74 69 je 113fc <_usb_get_descriptor+0xa0>\r
+ 11393: 83 ec 0c sub $0xc,%esp\r
+ 11396: 68 f4 01 00 00 push $0x1f4\r
+ 1139b: 8b 45 18 mov 0x18(%ebp),%eax\r
+ 1139e: 25 ff ff 00 00 and $0xffff,%eax\r
+ 113a3: 50 push %eax\r
+ 113a4: ff 75 14 pushl 0x14(%ebp)\r
+ 113a7: 6a 00 push $0x0\r
+ 113a9: b8 00 00 00 00 mov $0x0,%eax\r
+ 113ae: 8a 45 ff mov 0xffffffff(%ebp),%al\r
+ 113b1: 89 c2 mov %eax,%edx\r
+ 113b3: c1 e2 08 shl $0x8,%edx\r
+ 113b6: b8 00 00 00 00 mov $0x0,%eax\r
+ 113bb: 8a 45 fe mov 0xfffffffe(%ebp),%al\r
+ 113be: 01 d0 add %edx,%eax\r
+ 113c0: 25 ff ff 00 00 and $0xffff,%eax\r
+ 113c5: 50 push %eax\r
+ 113c6: 68 80 00 00 00 push $0x80\r
+ 113cb: 6a 06 push $0x6\r
+ 113cd: 6a 00 push $0x0\r
+ 113cf: ff 75 08 pushl 0x8(%ebp)\r
+ 113d2: e8 2a 00 00 00 call 11401 <___create_pipe>\r
+ 113d7: 83 c4 08 add $0x8,%esp\r
+ 113da: 0d 80 00 00 80 or $0x80000080,%eax\r
+ 113df: 50 push %eax\r
+ 113e0: ff 75 08 pushl 0x8(%ebp)\r
+ 113e3: e8 08 fe ff ff call 111f0 <_usb_control_msg>\r
+ 113e8: 83 c4 30 add $0x30,%esp\r
+ 113eb: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 113ee: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 113f2: 7f 08 jg 113fc <_usb_get_descriptor+0xa0>\r
+ 113f4: 83 7d f4 e0 cmpl $0xffffffe0,0xfffffff4(%ebp)\r
+ 113f8: 74 02 je 113fc <_usb_get_descriptor+0xa0>\r
+ 113fa: eb 8c jmp 11388 <_usb_get_descriptor+0x2c>\r
+ 113fc: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 113ff: c9 leave \r
+ 11400: c3 ret \r
+\r
+00011401 <___create_pipe>:\r
+ 11401: 55 push %ebp\r
+ 11402: 89 e5 mov %esp,%ebp\r
+ 11404: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11407: 8b 00 mov (%eax),%eax\r
+ 11409: c1 e0 08 shl $0x8,%eax\r
+ 1140c: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 1140f: c1 e2 0f shl $0xf,%edx\r
+ 11412: 09 d0 or %edx,%eax\r
+ 11414: 5d pop %ebp\r
+ 11415: c3 ret \r
+\r
+00011416 <_usb_get_string>:\r
+ 11416: 55 push %ebp\r
+ 11417: 89 e5 mov %esp,%ebp\r
+ 11419: 83 ec 08 sub $0x8,%esp\r
+ 1141c: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1141f: 8b 55 10 mov 0x10(%ebp),%edx\r
+ 11422: 66 89 45 fe mov %ax,0xfffffffe(%ebp)\r
+ 11426: 88 55 fd mov %dl,0xfffffffd(%ebp)\r
+ 11429: 83 ec 0c sub $0xc,%esp\r
+ 1142c: 68 f4 01 00 00 push $0x1f4\r
+ 11431: 8b 45 18 mov 0x18(%ebp),%eax\r
+ 11434: 25 ff ff 00 00 and $0xffff,%eax\r
+ 11439: 50 push %eax\r
+ 1143a: ff 75 14 pushl 0x14(%ebp)\r
+ 1143d: 66 8b 45 fe mov 0xfffffffe(%ebp),%ax\r
+ 11441: 25 ff ff 00 00 and $0xffff,%eax\r
+ 11446: 50 push %eax\r
+ 11447: b8 00 00 00 00 mov $0x0,%eax\r
+ 1144c: 8a 45 fd mov 0xfffffffd(%ebp),%al\r
+ 1144f: 05 00 03 00 00 add $0x300,%eax\r
+ 11454: 25 ff ff 00 00 and $0xffff,%eax\r
+ 11459: 50 push %eax\r
+ 1145a: 68 80 00 00 00 push $0x80\r
+ 1145f: 6a 06 push $0x6\r
+ 11461: 6a 00 push $0x0\r
+ 11463: ff 75 08 pushl 0x8(%ebp)\r
+ 11466: e8 96 ff ff ff call 11401 <___create_pipe>\r
+ 1146b: 83 c4 08 add $0x8,%esp\r
+ 1146e: 0d 80 00 00 80 or $0x80000080,%eax\r
+ 11473: 50 push %eax\r
+ 11474: ff 75 08 pushl 0x8(%ebp)\r
+ 11477: e8 74 fd ff ff call 111f0 <_usb_control_msg>\r
+ 1147c: 83 c4 30 add $0x30,%esp\r
+ 1147f: c9 leave \r
+ 11480: c3 ret \r
+\r
+00011481 <_usb_get_device_descriptor>:\r
+ 11481: 55 push %ebp\r
+ 11482: 89 e5 mov %esp,%ebp\r
+ 11484: 83 ec 08 sub $0x8,%esp\r
+ 11487: 83 ec 0c sub $0xc,%esp\r
+ 1148a: 6a 12 push $0x12\r
+ 1148c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1148f: 05 70 01 00 00 add $0x170,%eax\r
+ 11494: 50 push %eax\r
+ 11495: 6a 00 push $0x0\r
+ 11497: 6a 01 push $0x1\r
+ 11499: ff 75 08 pushl 0x8(%ebp)\r
+ 1149c: e8 bb fe ff ff call 1135c <_usb_get_descriptor>\r
+ 114a1: 83 c4 20 add $0x20,%esp\r
+ 114a4: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 114a7: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 114aa: c9 leave \r
+ 114ab: c3 ret \r
+\r
+000114ac <_usb_get_status>:\r
+ 114ac: 55 push %ebp\r
+ 114ad: 89 e5 mov %esp,%ebp\r
+ 114af: 83 ec 08 sub $0x8,%esp\r
+ 114b2: 83 ec 0c sub $0xc,%esp\r
+ 114b5: 68 f4 01 00 00 push $0x1f4\r
+ 114ba: 6a 02 push $0x2\r
+ 114bc: ff 75 14 pushl 0x14(%ebp)\r
+ 114bf: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 114c2: 25 ff ff 00 00 and $0xffff,%eax\r
+ 114c7: 50 push %eax\r
+ 114c8: 6a 00 push $0x0\r
+ 114ca: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 114cd: b0 80 mov $0x80,%al\r
+ 114cf: 09 d0 or %edx,%eax\r
+ 114d1: 25 ff 00 00 00 and $0xff,%eax\r
+ 114d6: 50 push %eax\r
+ 114d7: 6a 00 push $0x0\r
+ 114d9: 6a 00 push $0x0\r
+ 114db: ff 75 08 pushl 0x8(%ebp)\r
+ 114de: e8 1e ff ff ff call 11401 <___create_pipe>\r
+ 114e3: 83 c4 08 add $0x8,%esp\r
+ 114e6: 0d 80 00 00 80 or $0x80000080,%eax\r
+ 114eb: 50 push %eax\r
+ 114ec: ff 75 08 pushl 0x8(%ebp)\r
+ 114ef: e8 fc fc ff ff call 111f0 <_usb_control_msg>\r
+ 114f4: 83 c4 30 add $0x30,%esp\r
+ 114f7: c9 leave \r
+ 114f8: c3 ret \r
+\r
+000114f9 <_usb_set_maxpacket>:\r
+ 114f9: 55 push %ebp\r
+ 114fa: 89 e5 mov %esp,%ebp\r
+ 114fc: 53 push %ebx\r
+ 114fd: 83 ec 1c sub $0x1c,%esp\r
+ 11500: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 11507: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1150a: 8b 80 88 01 00 00 mov 0x188(%eax),%eax\r
+ 11510: 8a 40 04 mov 0x4(%eax),%al\r
+ 11513: 25 ff 00 00 00 and $0xff,%eax\r
+ 11518: 3b 45 f8 cmp 0xfffffff8(%ebp),%eax\r
+ 1151b: 0f 8e 49 01 00 00 jle 1166a <_usb_set_maxpacket+0x171>\r
+ 11521: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11524: 8b 98 88 01 00 00 mov 0x188(%eax),%ebx\r
+ 1152a: 8b 4d f8 mov 0xfffffff8(%ebp),%ecx\r
+ 1152d: 89 c8 mov %ecx,%eax\r
+ 1152f: c1 e0 02 shl $0x2,%eax\r
+ 11532: 01 c8 add %ecx,%eax\r
+ 11534: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 1153b: 01 d0 add %edx,%eax\r
+ 1153d: 01 c0 add %eax,%eax\r
+ 1153f: 01 c8 add %ecx,%eax\r
+ 11541: c1 e0 02 shl $0x2,%eax\r
+ 11544: 03 43 0c add 0xc(%ebx),%eax\r
+ 11547: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 1154a: 8b 4d f0 mov 0xfffffff0(%ebp),%ecx\r
+ 1154d: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 11550: 8b 50 04 mov 0x4(%eax),%edx\r
+ 11553: 89 d0 mov %edx,%eax\r
+ 11555: 01 c0 add %eax,%eax\r
+ 11557: 01 d0 add %edx,%eax\r
+ 11559: c1 e0 03 shl $0x3,%eax\r
+ 1155c: 03 01 add (%ecx),%eax\r
+ 1155e: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 11561: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 11564: 8b 40 0c mov 0xc(%eax),%eax\r
+ 11567: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 1156a: c7 45 e4 00 00 00 00 movl $0x0,0xffffffe4(%ebp)\r
+ 11571: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 11574: 8a 40 04 mov 0x4(%eax),%al\r
+ 11577: 25 ff 00 00 00 and $0xff,%eax\r
+ 1157c: 3b 45 e4 cmp 0xffffffe4(%ebp),%eax\r
+ 1157f: 0f 8e db 00 00 00 jle 11660 <_usb_set_maxpacket+0x167>\r
+ 11585: 8b 55 e4 mov 0xffffffe4(%ebp),%edx\r
+ 11588: 89 d0 mov %edx,%eax\r
+ 1158a: c1 e0 02 shl $0x2,%eax\r
+ 1158d: 01 d0 add %edx,%eax\r
+ 1158f: c1 e0 02 shl $0x2,%eax\r
+ 11592: 03 45 e8 add 0xffffffe8(%ebp),%eax\r
+ 11595: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 11598: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 1159b: 8a 40 02 mov 0x2(%eax),%al\r
+ 1159e: 25 ff 00 00 00 and $0xff,%eax\r
+ 115a3: 83 e0 0f and $0xf,%eax\r
+ 115a6: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 115a9: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 115ac: 8a 40 03 mov 0x3(%eax),%al\r
+ 115af: 25 ff 00 00 00 and $0xff,%eax\r
+ 115b4: 83 e0 03 and $0x3,%eax\r
+ 115b7: 85 c0 test %eax,%eax\r
+ 115b9: 75 2e jne 115e9 <_usb_set_maxpacket+0xf0>\r
+ 115bb: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 115be: 8b 4d f4 mov 0xfffffff4(%ebp),%ecx\r
+ 115c1: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 115c4: 66 8b 40 04 mov 0x4(%eax),%ax\r
+ 115c8: 25 ff ff 00 00 and $0xffff,%eax\r
+ 115cd: 89 44 8a 78 mov %eax,0x78(%edx,%ecx,4)\r
+ 115d1: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 115d4: 8b 4d f4 mov 0xfffffff4(%ebp),%ecx\r
+ 115d7: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 115da: 66 8b 40 04 mov 0x4(%eax),%ax\r
+ 115de: 25 ff ff 00 00 and $0xffff,%eax\r
+ 115e3: 89 44 8a 38 mov %eax,0x38(%edx,%ecx,4)\r
+ 115e7: eb 6d jmp 11656 <_usb_set_maxpacket+0x15d>\r
+ 115e9: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 115ec: 80 78 02 00 cmpb $0x0,0x2(%eax)\r
+ 115f0: 78 33 js 11625 <_usb_set_maxpacket+0x12c>\r
+ 115f2: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 115f5: 66 8b 40 04 mov 0x4(%eax),%ax\r
+ 115f9: 89 c1 mov %eax,%ecx\r
+ 115fb: 81 e1 ff ff 00 00 and $0xffff,%ecx\r
+ 11601: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11604: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 11607: 3b 4c 82 78 cmp 0x78(%edx,%eax,4),%ecx\r
+ 1160b: 7e 49 jle 11656 <_usb_set_maxpacket+0x15d>\r
+ 1160d: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11610: 8b 4d f4 mov 0xfffffff4(%ebp),%ecx\r
+ 11613: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 11616: 66 8b 40 04 mov 0x4(%eax),%ax\r
+ 1161a: 25 ff ff 00 00 and $0xffff,%eax\r
+ 1161f: 89 44 8a 78 mov %eax,0x78(%edx,%ecx,4)\r
+ 11623: eb 31 jmp 11656 <_usb_set_maxpacket+0x15d>\r
+ 11625: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 11628: 66 8b 40 04 mov 0x4(%eax),%ax\r
+ 1162c: 89 c1 mov %eax,%ecx\r
+ 1162e: 81 e1 ff ff 00 00 and $0xffff,%ecx\r
+ 11634: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11637: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 1163a: 3b 4c 82 38 cmp 0x38(%edx,%eax,4),%ecx\r
+ 1163e: 7e 16 jle 11656 <_usb_set_maxpacket+0x15d>\r
+ 11640: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11643: 8b 4d f4 mov 0xfffffff4(%ebp),%ecx\r
+ 11646: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 11649: 66 8b 40 04 mov 0x4(%eax),%ax\r
+ 1164d: 25 ff ff 00 00 and $0xffff,%eax\r
+ 11652: 89 44 8a 38 mov %eax,0x38(%edx,%ecx,4)\r
+ 11656: 8d 45 e4 lea 0xffffffe4(%ebp),%eax\r
+ 11659: ff 00 incl (%eax)\r
+ 1165b: e9 11 ff ff ff jmp 11571 <_usb_set_maxpacket+0x78>\r
+ 11660: 8d 45 f8 lea 0xfffffff8(%ebp),%eax\r
+ 11663: ff 00 incl (%eax)\r
+ 11665: e9 9d fe ff ff jmp 11507 <_usb_set_maxpacket+0xe>\r
+ 1166a: 83 c4 1c add $0x1c,%esp\r
+ 1166d: 5b pop %ebx\r
+ 1166e: 5d pop %ebp\r
+ 1166f: c3 ret \r
+\r
+00011670 <_usb_clear_halt>:\r
+ 11670: 55 push %ebp\r
+ 11671: 89 e5 mov %esp,%ebp\r
+ 11673: 57 push %edi\r
+ 11674: 56 push %esi\r
+ 11675: 53 push %ebx\r
+ 11676: 83 ec 0c sub $0xc,%esp\r
+ 11679: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1167c: c1 f8 0f sar $0xf,%eax\r
+ 1167f: 83 e0 0f and $0xf,%eax\r
+ 11682: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 11685: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11688: c1 e8 07 shr $0x7,%eax\r
+ 1168b: 83 e0 01 and $0x1,%eax\r
+ 1168e: 85 c0 test %eax,%eax\r
+ 11690: 74 09 je 1169b <_usb_clear_halt+0x2b>\r
+ 11692: 8d 45 ec lea 0xffffffec(%ebp),%eax\r
+ 11695: 81 08 80 00 00 00 orl $0x80,(%eax)\r
+ 1169b: 83 ec 0c sub $0xc,%esp\r
+ 1169e: 68 f4 01 00 00 push $0x1f4\r
+ 116a3: 6a 00 push $0x0\r
+ 116a5: 6a 00 push $0x0\r
+ 116a7: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 116aa: 25 ff ff 00 00 and $0xffff,%eax\r
+ 116af: 50 push %eax\r
+ 116b0: 6a 00 push $0x0\r
+ 116b2: 6a 02 push $0x2\r
+ 116b4: 6a 01 push $0x1\r
+ 116b6: 6a 00 push $0x0\r
+ 116b8: ff 75 08 pushl 0x8(%ebp)\r
+ 116bb: e8 41 fd ff ff call 11401 <___create_pipe>\r
+ 116c0: 83 c4 08 add $0x8,%esp\r
+ 116c3: 0d 00 00 00 80 or $0x80000000,%eax\r
+ 116c8: 50 push %eax\r
+ 116c9: ff 75 08 pushl 0x8(%ebp)\r
+ 116cc: e8 1f fb ff ff call 111f0 <_usb_control_msg>\r
+ 116d1: 83 c4 30 add $0x30,%esp\r
+ 116d4: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 116d7: 83 7d f0 00 cmpl $0x0,0xfffffff0(%ebp)\r
+ 116db: 79 0b jns 116e8 <_usb_clear_halt+0x78>\r
+ 116dd: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 116e0: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 116e3: e9 83 00 00 00 jmp 1176b <_usb_clear_halt+0xfb>\r
+ 116e8: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 116eb: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 116ee: c1 e8 07 shr $0x7,%eax\r
+ 116f1: 83 f0 01 xor $0x1,%eax\r
+ 116f4: 89 c6 mov %eax,%esi\r
+ 116f6: 83 e6 01 and $0x1,%esi\r
+ 116f9: 8b 7d 08 mov 0x8(%ebp),%edi\r
+ 116fc: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 116ff: c1 e8 07 shr $0x7,%eax\r
+ 11702: 83 f0 01 xor $0x1,%eax\r
+ 11705: 89 c2 mov %eax,%edx\r
+ 11707: 83 e2 01 and $0x1,%edx\r
+ 1170a: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1170d: c1 f8 0f sar $0xf,%eax\r
+ 11710: 89 c1 mov %eax,%ecx\r
+ 11712: 83 e1 0f and $0xf,%ecx\r
+ 11715: b8 01 00 00 00 mov $0x1,%eax\r
+ 1171a: d3 e0 shl %cl,%eax\r
+ 1171c: f7 d0 not %eax\r
+ 1171e: 23 44 97 28 and 0x28(%edi,%edx,4),%eax\r
+ 11722: 89 44 b3 28 mov %eax,0x28(%ebx,%esi,4)\r
+ 11726: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 11729: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1172c: c1 e8 07 shr $0x7,%eax\r
+ 1172f: 83 f0 01 xor $0x1,%eax\r
+ 11732: 89 c6 mov %eax,%esi\r
+ 11734: 83 e6 01 and $0x1,%esi\r
+ 11737: 8b 7d 08 mov 0x8(%ebp),%edi\r
+ 1173a: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1173d: c1 e8 07 shr $0x7,%eax\r
+ 11740: 83 f0 01 xor $0x1,%eax\r
+ 11743: 89 c2 mov %eax,%edx\r
+ 11745: 83 e2 01 and $0x1,%edx\r
+ 11748: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1174b: c1 f8 0f sar $0xf,%eax\r
+ 1174e: 89 c1 mov %eax,%ecx\r
+ 11750: 83 e1 0f and $0xf,%ecx\r
+ 11753: b8 01 00 00 00 mov $0x1,%eax\r
+ 11758: d3 e0 shl %cl,%eax\r
+ 1175a: f7 d0 not %eax\r
+ 1175c: 23 44 97 30 and 0x30(%edi,%edx,4),%eax\r
+ 11760: 89 44 b3 30 mov %eax,0x30(%ebx,%esi,4)\r
+ 11764: c7 45 e8 00 00 00 00 movl $0x0,0xffffffe8(%ebp)\r
+ 1176b: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 1176e: 8d 65 f4 lea 0xfffffff4(%ebp),%esp\r
+ 11771: 5b pop %ebx\r
+ 11772: 5e pop %esi\r
+ 11773: 5f pop %edi\r
+ 11774: 5d pop %ebp\r
+ 11775: c3 ret \r
+\r
+00011776 <_usb_set_interface>:\r
+ 11776: 55 push %ebp\r
+ 11777: 89 e5 mov %esp,%ebp\r
+ 11779: 57 push %edi\r
+ 1177a: 56 push %esi\r
+ 1177b: 53 push %ebx\r
+ 1177c: 83 ec 3c sub $0x3c,%esp\r
+ 1177f: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11782: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 11788: 8b 40 20 mov 0x20(%eax),%eax\r
+ 1178b: 8b 40 1c mov 0x1c(%eax),%eax\r
+ 1178e: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 11791: 83 ec 08 sub $0x8,%esp\r
+ 11794: ff 75 0c pushl 0xc(%ebp)\r
+ 11797: ff 75 08 pushl 0x8(%ebp)\r
+ 1179a: e8 d6 44 00 00 call 15c75 <_usb_ifnum_to_if>\r
+ 1179f: 83 c4 10 add $0x10,%esp\r
+ 117a2: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 117a5: 83 7d f0 00 cmpl $0x0,0xfffffff0(%ebp)\r
+ 117a9: 75 0c jne 117b7 <_usb_set_interface+0x41>\r
+ 117ab: c7 45 d4 ea ff ff ff movl $0xffffffea,0xffffffd4(%ebp)\r
+ 117b2: e9 85 02 00 00 jmp 11a3c <_usb_set_interface+0x2c6>\r
+ 117b7: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 117ba: 83 78 08 01 cmpl $0x1,0x8(%eax)\r
+ 117be: 75 0c jne 117cc <_usb_set_interface+0x56>\r
+ 117c0: c7 45 d4 00 00 00 00 movl $0x0,0xffffffd4(%ebp)\r
+ 117c7: e9 70 02 00 00 jmp 11a3c <_usb_set_interface+0x2c6>\r
+ 117cc: 83 7d 10 00 cmpl $0x0,0x10(%ebp)\r
+ 117d0: 78 0d js 117df <_usb_set_interface+0x69>\r
+ 117d2: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 117d5: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 117d8: 3b 42 08 cmp 0x8(%edx),%eax\r
+ 117db: 73 02 jae 117df <_usb_set_interface+0x69>\r
+ 117dd: eb 0c jmp 117eb <_usb_set_interface+0x75>\r
+ 117df: c7 45 d4 ea ff ff ff movl $0xffffffea,0xffffffd4(%ebp)\r
+ 117e6: e9 51 02 00 00 jmp 11a3c <_usb_set_interface+0x2c6>\r
+ 117eb: 83 ec 0c sub $0xc,%esp\r
+ 117ee: 68 f4 01 00 00 push $0x1f4\r
+ 117f3: 6a 00 push $0x0\r
+ 117f5: 6a 00 push $0x0\r
+ 117f7: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 117fa: 25 ff ff 00 00 and $0xffff,%eax\r
+ 117ff: 50 push %eax\r
+ 11800: 8b 4d f0 mov 0xfffffff0(%ebp),%ecx\r
+ 11803: 8b 55 10 mov 0x10(%ebp),%edx\r
+ 11806: 89 d0 mov %edx,%eax\r
+ 11808: 01 c0 add %eax,%eax\r
+ 1180a: 01 d0 add %edx,%eax\r
+ 1180c: 8d 14 c5 00 00 00 00 lea 0x0(,%eax,8),%edx\r
+ 11813: 8b 01 mov (%ecx),%eax\r
+ 11815: 8a 44 02 03 mov 0x3(%edx,%eax,1),%al\r
+ 11819: 25 ff 00 00 00 and $0xff,%eax\r
+ 1181e: 50 push %eax\r
+ 1181f: 6a 01 push $0x1\r
+ 11821: 6a 0b push $0xb\r
+ 11823: 6a 00 push $0x0\r
+ 11825: ff 75 08 pushl 0x8(%ebp)\r
+ 11828: e8 d4 fb ff ff call 11401 <___create_pipe>\r
+ 1182d: 83 c4 08 add $0x8,%esp\r
+ 11830: 0d 00 00 00 80 or $0x80000000,%eax\r
+ 11835: 50 push %eax\r
+ 11836: ff 75 08 pushl 0x8(%ebp)\r
+ 11839: e8 b2 f9 ff ff call 111f0 <_usb_control_msg>\r
+ 1183e: 83 c4 30 add $0x30,%esp\r
+ 11841: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 11844: 83 7d e4 00 cmpl $0x0,0xffffffe4(%ebp)\r
+ 11848: 79 0b jns 11855 <_usb_set_interface+0xdf>\r
+ 1184a: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 1184d: 89 45 d4 mov %eax,0xffffffd4(%ebp)\r
+ 11850: e9 e7 01 00 00 jmp 11a3c <_usb_set_interface+0x2c6>\r
+ 11855: 8b 4d f0 mov 0xfffffff0(%ebp),%ecx\r
+ 11858: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 1185b: 8b 50 04 mov 0x4(%eax),%edx\r
+ 1185e: 89 d0 mov %edx,%eax\r
+ 11860: 01 c0 add %eax,%eax\r
+ 11862: 01 d0 add %edx,%eax\r
+ 11864: c1 e0 03 shl $0x3,%eax\r
+ 11867: 03 01 add (%ecx),%eax\r
+ 11869: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 1186c: c7 45 e8 00 00 00 00 movl $0x0,0xffffffe8(%ebp)\r
+ 11873: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 11876: 8a 40 04 mov 0x4(%eax),%al\r
+ 11879: 25 ff 00 00 00 and $0xff,%eax\r
+ 1187e: 3b 45 e8 cmp 0xffffffe8(%ebp),%eax\r
+ 11881: 0f 8e 96 00 00 00 jle 1191d <_usb_set_interface+0x1a7>\r
+ 11887: 8b 4d ec mov 0xffffffec(%ebp),%ecx\r
+ 1188a: 8b 55 e8 mov 0xffffffe8(%ebp),%edx\r
+ 1188d: 89 d0 mov %edx,%eax\r
+ 1188f: c1 e0 02 shl $0x2,%eax\r
+ 11892: 01 d0 add %edx,%eax\r
+ 11894: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 1189b: 8b 41 0c mov 0xc(%ecx),%eax\r
+ 1189e: 8a 44 02 02 mov 0x2(%edx,%eax,1),%al\r
+ 118a2: 88 45 df mov %al,0xffffffdf(%ebp)\r
+ 118a5: 0f be 45 df movsbl 0xffffffdf(%ebp),%eax\r
+ 118a9: f7 d0 not %eax\r
+ 118ab: c1 e8 1f shr $0x1f,%eax\r
+ 118ae: 89 45 d8 mov %eax,0xffffffd8(%ebp)\r
+ 118b1: 83 7d e0 00 cmpl $0x0,0xffffffe0(%ebp)\r
+ 118b5: 74 17 je 118ce <_usb_set_interface+0x158>\r
+ 118b7: 83 ec 08 sub $0x8,%esp\r
+ 118ba: b8 00 00 00 00 mov $0x0,%eax\r
+ 118bf: 8a 45 df mov 0xffffffdf(%ebp),%al\r
+ 118c2: 50 push %eax\r
+ 118c3: ff 75 08 pushl 0x8(%ebp)\r
+ 118c6: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 118c9: ff d0 call *%eax\r
+ 118cb: 83 c4 10 add $0x10,%esp\r
+ 118ce: 8d 45 df lea 0xffffffdf(%ebp),%eax\r
+ 118d1: 80 20 0f andb $0xf,(%eax)\r
+ 118d4: b8 00 00 00 00 mov $0x0,%eax\r
+ 118d9: 8a 45 df mov 0xffffffdf(%ebp),%al\r
+ 118dc: 89 45 d0 mov %eax,0xffffffd0(%ebp)\r
+ 118df: 8b 45 d0 mov 0xffffffd0(%ebp),%eax\r
+ 118e2: c1 e0 02 shl $0x2,%eax\r
+ 118e5: 89 45 d0 mov %eax,0xffffffd0(%ebp)\r
+ 118e8: 83 7d d8 00 cmpl $0x0,0xffffffd8(%ebp)\r
+ 118ec: 74 0f je 118fd <_usb_set_interface+0x187>\r
+ 118ee: 8b 55 d0 mov 0xffffffd0(%ebp),%edx\r
+ 118f1: 03 55 08 add 0x8(%ebp),%edx\r
+ 118f4: 89 55 cc mov %edx,0xffffffcc(%ebp)\r
+ 118f7: 83 45 cc 78 addl $0x78,0xffffffcc(%ebp)\r
+ 118fb: eb 0d jmp 1190a <_usb_set_interface+0x194>\r
+ 118fd: 8b 45 d0 mov 0xffffffd0(%ebp),%eax\r
+ 11900: 03 45 08 add 0x8(%ebp),%eax\r
+ 11903: 89 45 cc mov %eax,0xffffffcc(%ebp)\r
+ 11906: 83 45 cc 38 addl $0x38,0xffffffcc(%ebp)\r
+ 1190a: 8b 55 cc mov 0xffffffcc(%ebp),%edx\r
+ 1190d: c7 02 00 00 00 00 movl $0x0,(%edx)\r
+ 11913: 8d 45 e8 lea 0xffffffe8(%ebp),%eax\r
+ 11916: ff 00 incl (%eax)\r
+ 11918: e9 56 ff ff ff jmp 11873 <_usb_set_interface+0xfd>\r
+ 1191d: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 11920: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 11923: 89 42 04 mov %eax,0x4(%edx)\r
+ 11926: 8b 4d f0 mov 0xfffffff0(%ebp),%ecx\r
+ 11929: 8b 55 10 mov 0x10(%ebp),%edx\r
+ 1192c: 89 d0 mov %edx,%eax\r
+ 1192e: 01 c0 add %eax,%eax\r
+ 11930: 01 d0 add %edx,%eax\r
+ 11932: c1 e0 03 shl $0x3,%eax\r
+ 11935: 03 01 add (%ecx),%eax\r
+ 11937: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 1193a: c7 45 e8 00 00 00 00 movl $0x0,0xffffffe8(%ebp)\r
+ 11941: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 11944: 8a 40 04 mov 0x4(%eax),%al\r
+ 11947: 25 ff 00 00 00 and $0xff,%eax\r
+ 1194c: 3b 45 e8 cmp 0xffffffe8(%ebp),%eax\r
+ 1194f: 0f 8e e0 00 00 00 jle 11a35 <_usb_set_interface+0x2bf>\r
+ 11955: 8b 4d ec mov 0xffffffec(%ebp),%ecx\r
+ 11958: 8b 55 e8 mov 0xffffffe8(%ebp),%edx\r
+ 1195b: 89 d0 mov %edx,%eax\r
+ 1195d: c1 e0 02 shl $0x2,%eax\r
+ 11960: 01 d0 add %edx,%eax\r
+ 11962: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 11969: 8b 41 0c mov 0xc(%ecx),%eax\r
+ 1196c: 8a 44 02 02 mov 0x2(%edx,%eax,1),%al\r
+ 11970: 88 45 df mov %al,0xffffffdf(%ebp)\r
+ 11973: 0f be 45 df movsbl 0xffffffdf(%ebp),%eax\r
+ 11977: f7 d0 not %eax\r
+ 11979: c1 e8 1f shr $0x1f,%eax\r
+ 1197c: 89 45 d8 mov %eax,0xffffffd8(%ebp)\r
+ 1197f: 8d 45 df lea 0xffffffdf(%ebp),%eax\r
+ 11982: 80 20 0f andb $0xf,(%eax)\r
+ 11985: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 11988: 8b 75 d8 mov 0xffffffd8(%ebp),%esi\r
+ 1198b: 8b 7d 08 mov 0x8(%ebp),%edi\r
+ 1198e: 8b 55 d8 mov 0xffffffd8(%ebp),%edx\r
+ 11991: b9 00 00 00 00 mov $0x0,%ecx\r
+ 11996: 8a 4d df mov 0xffffffdf(%ebp),%cl\r
+ 11999: b8 01 00 00 00 mov $0x1,%eax\r
+ 1199e: d3 e0 shl %cl,%eax\r
+ 119a0: f7 d0 not %eax\r
+ 119a2: 23 44 97 28 and 0x28(%edi,%edx,4),%eax\r
+ 119a6: 89 44 b3 28 mov %eax,0x28(%ebx,%esi,4)\r
+ 119aa: b8 00 00 00 00 mov $0x0,%eax\r
+ 119af: 8a 45 df mov 0xffffffdf(%ebp),%al\r
+ 119b2: 89 45 c8 mov %eax,0xffffffc8(%ebp)\r
+ 119b5: 8b 45 c8 mov 0xffffffc8(%ebp),%eax\r
+ 119b8: c1 e0 02 shl $0x2,%eax\r
+ 119bb: 89 45 c8 mov %eax,0xffffffc8(%ebp)\r
+ 119be: 83 7d d8 00 cmpl $0x0,0xffffffd8(%ebp)\r
+ 119c2: 74 0f je 119d3 <_usb_set_interface+0x25d>\r
+ 119c4: 8b 55 c8 mov 0xffffffc8(%ebp),%edx\r
+ 119c7: 03 55 08 add 0x8(%ebp),%edx\r
+ 119ca: 89 55 c4 mov %edx,0xffffffc4(%ebp)\r
+ 119cd: 83 45 c4 78 addl $0x78,0xffffffc4(%ebp)\r
+ 119d1: eb 0d jmp 119e0 <_usb_set_interface+0x26a>\r
+ 119d3: 8b 45 c8 mov 0xffffffc8(%ebp),%eax\r
+ 119d6: 03 45 08 add 0x8(%ebp),%eax\r
+ 119d9: 89 45 c4 mov %eax,0xffffffc4(%ebp)\r
+ 119dc: 83 45 c4 38 addl $0x38,0xffffffc4(%ebp)\r
+ 119e0: 8b 4d ec mov 0xffffffec(%ebp),%ecx\r
+ 119e3: 8b 55 e8 mov 0xffffffe8(%ebp),%edx\r
+ 119e6: 89 d0 mov %edx,%eax\r
+ 119e8: c1 e0 02 shl $0x2,%eax\r
+ 119eb: 01 d0 add %edx,%eax\r
+ 119ed: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 119f4: 8b 41 0c mov 0xc(%ecx),%eax\r
+ 119f7: 66 8b 44 02 04 mov 0x4(%edx,%eax,1),%ax\r
+ 119fc: 25 ff ff 00 00 and $0xffff,%eax\r
+ 11a01: 8b 55 c4 mov 0xffffffc4(%ebp),%edx\r
+ 11a04: 89 02 mov %eax,(%edx)\r
+ 11a06: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 11a09: 8b 75 d8 mov 0xffffffd8(%ebp),%esi\r
+ 11a0c: 8b 7d 08 mov 0x8(%ebp),%edi\r
+ 11a0f: 8b 55 d8 mov 0xffffffd8(%ebp),%edx\r
+ 11a12: b9 00 00 00 00 mov $0x0,%ecx\r
+ 11a17: 8a 4d df mov 0xffffffdf(%ebp),%cl\r
+ 11a1a: b8 01 00 00 00 mov $0x1,%eax\r
+ 11a1f: d3 e0 shl %cl,%eax\r
+ 11a21: f7 d0 not %eax\r
+ 11a23: 23 44 97 30 and 0x30(%edi,%edx,4),%eax\r
+ 11a27: 89 44 b3 30 mov %eax,0x30(%ebx,%esi,4)\r
+ 11a2b: 8d 45 e8 lea 0xffffffe8(%ebp),%eax\r
+ 11a2e: ff 00 incl (%eax)\r
+ 11a30: e9 0c ff ff ff jmp 11941 <_usb_set_interface+0x1cb>\r
+ 11a35: c7 45 d4 00 00 00 00 movl $0x0,0xffffffd4(%ebp)\r
+ 11a3c: 8b 45 d4 mov 0xffffffd4(%ebp),%eax\r
+ 11a3f: 8d 65 f4 lea 0xfffffff4(%ebp),%esp\r
+ 11a42: 5b pop %ebx\r
+ 11a43: 5e pop %esi\r
+ 11a44: 5f pop %edi\r
+ 11a45: 5d pop %ebp\r
+ 11a46: c3 ret \r
+\r
+00011a47 <_usb_set_configuration>:\r
+ 11a47: 55 push %ebp\r
+ 11a48: 89 e5 mov %esp,%ebp\r
+ 11a4a: 83 ec 18 sub $0x18,%esp\r
+ 11a4d: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 11a54: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11a57: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 11a5d: 8b 40 20 mov 0x20(%eax),%eax\r
+ 11a60: 8b 40 1c mov 0x1c(%eax),%eax\r
+ 11a63: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 11a66: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 11a6d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11a70: 8a 80 81 01 00 00 mov 0x181(%eax),%al\r
+ 11a76: 25 ff 00 00 00 and $0xff,%eax\r
+ 11a7b: 3b 45 fc cmp 0xfffffffc(%ebp),%eax\r
+ 11a7e: 7e 48 jle 11ac8 <_usb_set_configuration+0x81>\r
+ 11a80: 8b 4d 08 mov 0x8(%ebp),%ecx\r
+ 11a83: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 11a86: 89 d0 mov %edx,%eax\r
+ 11a88: 01 c0 add %eax,%eax\r
+ 11a8a: 01 d0 add %edx,%eax\r
+ 11a8c: 8d 14 c5 00 00 00 00 lea 0x0(,%eax,8),%edx\r
+ 11a93: 8b 81 84 01 00 00 mov 0x184(%ecx),%eax\r
+ 11a99: 8a 44 02 05 mov 0x5(%edx,%eax,1),%al\r
+ 11a9d: 25 ff 00 00 00 and $0xff,%eax\r
+ 11aa2: 3b 45 0c cmp 0xc(%ebp),%eax\r
+ 11aa5: 75 1a jne 11ac1 <_usb_set_configuration+0x7a>\r
+ 11aa7: 8b 4d 08 mov 0x8(%ebp),%ecx\r
+ 11aaa: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 11aad: 89 d0 mov %edx,%eax\r
+ 11aaf: 01 c0 add %eax,%eax\r
+ 11ab1: 01 d0 add %edx,%eax\r
+ 11ab3: c1 e0 03 shl $0x3,%eax\r
+ 11ab6: 03 81 84 01 00 00 add 0x184(%ecx),%eax\r
+ 11abc: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 11abf: eb 07 jmp 11ac8 <_usb_set_configuration+0x81>\r
+ 11ac1: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 11ac4: ff 00 incl (%eax)\r
+ 11ac6: eb a5 jmp 11a6d <_usb_set_configuration+0x26>\r
+ 11ac8: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 11acc: 75 06 jne 11ad4 <_usb_set_configuration+0x8d>\r
+ 11ace: 83 7d 0c 00 cmpl $0x0,0xc(%ebp)\r
+ 11ad2: 75 0c jne 11ae0 <_usb_set_configuration+0x99>\r
+ 11ad4: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 11ad8: 74 12 je 11aec <_usb_set_configuration+0xa5>\r
+ 11ada: 83 7d 0c 00 cmpl $0x0,0xc(%ebp)\r
+ 11ade: 75 0c jne 11aec <_usb_set_configuration+0xa5>\r
+ 11ae0: c7 45 ec ea ff ff ff movl $0xffffffea,0xffffffec(%ebp)\r
+ 11ae7: e9 f2 00 00 00 jmp 11bde <_usb_set_configuration+0x197>\r
+ 11aec: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11aef: 83 78 14 04 cmpl $0x4,0x14(%eax)\r
+ 11af3: 74 3f je 11b34 <_usb_set_configuration+0xed>\r
+ 11af5: 83 7d f0 00 cmpl $0x0,0xfffffff0(%ebp)\r
+ 11af9: 74 39 je 11b34 <_usb_set_configuration+0xed>\r
+ 11afb: c7 45 fc 01 00 00 00 movl $0x1,0xfffffffc(%ebp)\r
+ 11b02: 83 7d fc 0e cmpl $0xe,0xfffffffc(%ebp)\r
+ 11b06: 7f 2c jg 11b34 <_usb_set_configuration+0xed>\r
+ 11b08: 83 ec 08 sub $0x8,%esp\r
+ 11b0b: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 11b0e: ff 75 08 pushl 0x8(%ebp)\r
+ 11b11: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 11b14: ff d0 call *%eax\r
+ 11b16: 83 c4 10 add $0x10,%esp\r
+ 11b19: 83 ec 08 sub $0x8,%esp\r
+ 11b1c: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 11b1f: 0c 80 or $0x80,%al\r
+ 11b21: 50 push %eax\r
+ 11b22: ff 75 08 pushl 0x8(%ebp)\r
+ 11b25: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 11b28: ff d0 call *%eax\r
+ 11b2a: 83 c4 10 add $0x10,%esp\r
+ 11b2d: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 11b30: ff 00 incl (%eax)\r
+ 11b32: eb ce jmp 11b02 <_usb_set_configuration+0xbb>\r
+ 11b34: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11b37: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11b3a: c7 40 2c 00 00 00 00 movl $0x0,0x2c(%eax)\r
+ 11b41: c7 42 28 00 00 00 00 movl $0x0,0x28(%edx)\r
+ 11b48: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11b4b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11b4e: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)\r
+ 11b55: c7 42 30 00 00 00 00 movl $0x0,0x30(%edx)\r
+ 11b5c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11b5f: c7 40 14 04 00 00 00 movl $0x4,0x14(%eax)\r
+ 11b66: 83 ec 0c sub $0xc,%esp\r
+ 11b69: 68 f4 01 00 00 push $0x1f4\r
+ 11b6e: 6a 00 push $0x0\r
+ 11b70: 6a 00 push $0x0\r
+ 11b72: 6a 00 push $0x0\r
+ 11b74: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11b77: 25 ff ff 00 00 and $0xffff,%eax\r
+ 11b7c: 50 push %eax\r
+ 11b7d: 6a 00 push $0x0\r
+ 11b7f: 6a 09 push $0x9\r
+ 11b81: 6a 00 push $0x0\r
+ 11b83: ff 75 08 pushl 0x8(%ebp)\r
+ 11b86: e8 76 f8 ff ff call 11401 <___create_pipe>\r
+ 11b8b: 83 c4 08 add $0x8,%esp\r
+ 11b8e: 0d 00 00 00 80 or $0x80000000,%eax\r
+ 11b93: 50 push %eax\r
+ 11b94: ff 75 08 pushl 0x8(%ebp)\r
+ 11b97: e8 54 f6 ff ff call 111f0 <_usb_control_msg>\r
+ 11b9c: 83 c4 30 add $0x30,%esp\r
+ 11b9f: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 11ba2: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 11ba6: 79 08 jns 11bb0 <_usb_set_configuration+0x169>\r
+ 11ba8: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 11bab: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 11bae: eb 2e jmp 11bde <_usb_set_configuration+0x197>\r
+ 11bb0: 83 7d 0c 00 cmpl $0x0,0xc(%ebp)\r
+ 11bb4: 74 0a je 11bc0 <_usb_set_configuration+0x179>\r
+ 11bb6: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11bb9: c7 40 14 05 00 00 00 movl $0x5,0x14(%eax)\r
+ 11bc0: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11bc3: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 11bc6: 89 82 88 01 00 00 mov %eax,0x188(%edx)\r
+ 11bcc: ff 75 08 pushl 0x8(%ebp)\r
+ 11bcf: e8 25 f9 ff ff call 114f9 <_usb_set_maxpacket>\r
+ 11bd4: 83 c4 04 add $0x4,%esp\r
+ 11bd7: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 11bde: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 11be1: c9 leave \r
+ 11be2: c3 ret \r
+\r
+00011be3 <_usb_string>:\r
+ 11be3: 55 push %ebp\r
+ 11be4: 89 e5 mov %esp,%ebp\r
+ 11be6: 83 ec 18 sub $0x18,%esp\r
+ 11be9: 83 7d 14 00 cmpl $0x0,0x14(%ebp)\r
+ 11bed: 74 0c je 11bfb <_usb_string+0x18>\r
+ 11bef: 83 7d 10 00 cmpl $0x0,0x10(%ebp)\r
+ 11bf3: 74 06 je 11bfb <_usb_string+0x18>\r
+ 11bf5: 83 7d 0c 00 cmpl $0x0,0xc(%ebp)\r
+ 11bf9: 75 0c jne 11c07 <_usb_string+0x24>\r
+ 11bfb: c7 45 e8 ea ff ff ff movl $0xffffffea,0xffffffe8(%ebp)\r
+ 11c02: e9 a7 01 00 00 jmp 11dae <_usb_string+0x1cb>\r
+ 11c07: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 11c0a: c6 00 00 movb $0x0,(%eax)\r
+ 11c0d: 83 ec 08 sub $0x8,%esp\r
+ 11c10: 68 00 01 00 00 push $0x100\r
+ 11c15: 6a 01 push $0x1\r
+ 11c17: e8 14 7e 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 11c1c: 83 c4 08 add $0x8,%esp\r
+ 11c1f: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 11c22: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 11c26: 75 0c jne 11c34 <_usb_string+0x51>\r
+ 11c28: c7 45 e8 f4 ff ff ff movl $0xfffffff4,0xffffffe8(%ebp)\r
+ 11c2f: e9 7a 01 00 00 jmp 11dae <_usb_string+0x1cb>\r
+ 11c34: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11c37: 83 b8 90 01 00 00 00 cmpl $0x0,0x190(%eax)\r
+ 11c3e: 75 6e jne 11cae <_usb_string+0xcb>\r
+ 11c40: 83 ec 0c sub $0xc,%esp\r
+ 11c43: 6a 04 push $0x4\r
+ 11c45: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 11c48: 6a 00 push $0x0\r
+ 11c4a: 6a 00 push $0x0\r
+ 11c4c: ff 75 08 pushl 0x8(%ebp)\r
+ 11c4f: e8 c2 f7 ff ff call 11416 <_usb_get_string>\r
+ 11c54: 83 c4 20 add $0x20,%esp\r
+ 11c57: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 11c5a: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 11c5e: 79 05 jns 11c65 <_usb_string+0x82>\r
+ 11c60: e9 35 01 00 00 jmp 11d9a <_usb_string+0x1b7>\r
+ 11c65: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 11c68: 80 38 03 cmpb $0x3,(%eax)\r
+ 11c6b: 77 0c ja 11c79 <_usb_string+0x96>\r
+ 11c6d: c7 45 f8 ea ff ff ff movl $0xffffffea,0xfffffff8(%ebp)\r
+ 11c74: e9 21 01 00 00 jmp 11d9a <_usb_string+0x1b7>\r
+ 11c79: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11c7c: c7 80 90 01 00 00 ff movl $0xffffffff,0x190(%eax)\r
+ 11c83: ff ff ff \r
+ 11c86: 8b 4d 08 mov 0x8(%ebp),%ecx\r
+ 11c89: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 11c8c: 83 c0 02 add $0x2,%eax\r
+ 11c8f: ba 00 00 00 00 mov $0x0,%edx\r
+ 11c94: 8a 10 mov (%eax),%dl\r
+ 11c96: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 11c99: 83 c0 03 add $0x3,%eax\r
+ 11c9c: 8a 00 mov (%eax),%al\r
+ 11c9e: 25 ff 00 00 00 and $0xff,%eax\r
+ 11ca3: c1 e0 08 shl $0x8,%eax\r
+ 11ca6: 09 d0 or %edx,%eax\r
+ 11ca8: 89 81 94 01 00 00 mov %eax,0x194(%ecx)\r
+ 11cae: 83 ec 0c sub $0xc,%esp\r
+ 11cb1: 6a 02 push $0x2\r
+ 11cb3: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 11cb6: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11cb9: 25 ff 00 00 00 and $0xff,%eax\r
+ 11cbe: 50 push %eax\r
+ 11cbf: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11cc2: 8b 80 94 01 00 00 mov 0x194(%eax),%eax\r
+ 11cc8: 25 ff ff 00 00 and $0xffff,%eax\r
+ 11ccd: 50 push %eax\r
+ 11cce: ff 75 08 pushl 0x8(%ebp)\r
+ 11cd1: e8 40 f7 ff ff call 11416 <_usb_get_string>\r
+ 11cd6: 83 c4 20 add $0x20,%esp\r
+ 11cd9: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 11cdc: 83 7d f8 01 cmpl $0x1,0xfffffff8(%ebp)\r
+ 11ce0: 7f 05 jg 11ce7 <_usb_string+0x104>\r
+ 11ce2: e9 b3 00 00 00 jmp 11d9a <_usb_string+0x1b7>\r
+ 11ce7: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 11cea: 8a 00 mov (%eax),%al\r
+ 11cec: 25 ff 00 00 00 and $0xff,%eax\r
+ 11cf1: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 11cf4: 83 ec 0c sub $0xc,%esp\r
+ 11cf7: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 11cfa: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 11cfd: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11d00: 25 ff 00 00 00 and $0xff,%eax\r
+ 11d05: 50 push %eax\r
+ 11d06: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11d09: 8b 80 94 01 00 00 mov 0x194(%eax),%eax\r
+ 11d0f: 25 ff ff 00 00 and $0xffff,%eax\r
+ 11d14: 50 push %eax\r
+ 11d15: ff 75 08 pushl 0x8(%ebp)\r
+ 11d18: e8 f9 f6 ff ff call 11416 <_usb_get_string>\r
+ 11d1d: 83 c4 20 add $0x20,%esp\r
+ 11d20: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 11d23: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 11d27: 79 02 jns 11d2b <_usb_string+0x148>\r
+ 11d29: eb 6f jmp 11d9a <_usb_string+0x1b7>\r
+ 11d2b: 8d 45 14 lea 0x14(%ebp),%eax\r
+ 11d2e: ff 08 decl (%eax)\r
+ 11d30: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 11d37: c7 45 f0 02 00 00 00 movl $0x2,0xfffffff0(%ebp)\r
+ 11d3e: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 11d41: 3b 45 f0 cmp 0xfffffff0(%ebp),%eax\r
+ 11d44: 76 45 jbe 11d8b <_usb_string+0x1a8>\r
+ 11d46: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 11d49: 3b 45 14 cmp 0x14(%ebp),%eax\r
+ 11d4c: 72 02 jb 11d50 <_usb_string+0x16d>\r
+ 11d4e: eb 3b jmp 11d8b <_usb_string+0x1a8>\r
+ 11d50: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 11d53: 03 45 fc add 0xfffffffc(%ebp),%eax\r
+ 11d56: 40 inc %eax\r
+ 11d57: 80 38 00 cmpb $0x0,(%eax)\r
+ 11d5a: 74 10 je 11d6c <_usb_string+0x189>\r
+ 11d5c: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 11d5f: 03 45 10 add 0x10(%ebp),%eax\r
+ 11d62: c6 00 3f movb $0x3f,(%eax)\r
+ 11d65: 8d 45 ec lea 0xffffffec(%ebp),%eax\r
+ 11d68: ff 00 incl (%eax)\r
+ 11d6a: eb 17 jmp 11d83 <_usb_string+0x1a0>\r
+ 11d6c: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 11d6f: 89 c2 mov %eax,%edx\r
+ 11d71: 03 55 10 add 0x10(%ebp),%edx\r
+ 11d74: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 11d77: 03 45 f0 add 0xfffffff0(%ebp),%eax\r
+ 11d7a: 8a 00 mov (%eax),%al\r
+ 11d7c: 88 02 mov %al,(%edx)\r
+ 11d7e: 8d 45 ec lea 0xffffffec(%ebp),%eax\r
+ 11d81: ff 00 incl (%eax)\r
+ 11d83: 8d 45 f0 lea 0xfffffff0(%ebp),%eax\r
+ 11d86: 83 00 02 addl $0x2,(%eax)\r
+ 11d89: eb b3 jmp 11d3e <_usb_string+0x15b>\r
+ 11d8b: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 11d8e: 03 45 ec add 0xffffffec(%ebp),%eax\r
+ 11d91: c6 00 00 movb $0x0,(%eax)\r
+ 11d94: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 11d97: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 11d9a: 83 ec 0c sub $0xc,%esp\r
+ 11d9d: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 11da0: e8 9b 7c 00 00 call 19a40 <_ExFreePool@4>\r
+ 11da5: 83 c4 0c add $0xc,%esp\r
+ 11da8: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 11dab: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 11dae: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 11db1: c9 leave \r
+ 11db2: c3 ret \r
+ 11db3: 90 nop \r
+ 11db4: 90 nop \r
+ 11db5: 90 nop \r
+ 11db6: 90 nop \r
+ 11db7: 90 nop \r
+ 11db8: 90 nop \r
+ 11db9: 90 nop \r
+ 11dba: 90 nop \r
+ 11dbb: 90 nop \r
+ 11dbc: 90 nop \r
+ 11dbd: 90 nop \r
+ 11dbe: 90 nop \r
+ 11dbf: 90 nop \r
+\r
+00011dc0 <_ascii2utf>:\r
+ 11dc0: 55 push %ebp\r
+ 11dc1: 89 e5 mov %esp,%ebp\r
+ 11dc3: 83 ec 04 sub $0x4,%esp\r
+ 11dc6: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 11dcd: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11dd0: 80 38 00 cmpb $0x0,(%eax)\r
+ 11dd3: 74 33 je 11e08 <_ascii2utf+0x48>\r
+ 11dd5: 83 7d 10 01 cmpl $0x1,0x10(%ebp)\r
+ 11dd9: 7e 2d jle 11e08 <_ascii2utf+0x48>\r
+ 11ddb: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11dde: 89 c2 mov %eax,%edx\r
+ 11de0: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11de3: ff 45 08 incl 0x8(%ebp)\r
+ 11de6: 8a 00 mov (%eax),%al\r
+ 11de8: 88 02 mov %al,(%edx)\r
+ 11dea: 8d 45 0c lea 0xc(%ebp),%eax\r
+ 11ded: ff 00 incl (%eax)\r
+ 11def: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11df2: c6 00 00 movb $0x0,(%eax)\r
+ 11df5: 8d 45 0c lea 0xc(%ebp),%eax\r
+ 11df8: ff 00 incl (%eax)\r
+ 11dfa: 8d 45 10 lea 0x10(%ebp),%eax\r
+ 11dfd: 83 28 02 subl $0x2,(%eax)\r
+ 11e00: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 11e03: 83 00 02 addl $0x2,(%eax)\r
+ 11e06: eb c5 jmp 11dcd <_ascii2utf+0xd>\r
+ 11e08: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 11e0b: c9 leave \r
+ 11e0c: c3 ret \r
+\r
+00011e0d <_rh_string>:\r
+ 11e0d: 55 push %ebp\r
+ 11e0e: 89 e5 mov %esp,%ebp\r
+ 11e10: 53 push %ebx\r
+ 11e11: 81 ec 84 00 00 00 sub $0x84,%esp\r
+ 11e17: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 11e1b: 75 38 jne 11e55 <_rh_string+0x48>\r
+ 11e1d: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 11e20: c6 00 04 movb $0x4,(%eax)\r
+ 11e23: 8d 45 10 lea 0x10(%ebp),%eax\r
+ 11e26: ff 00 incl (%eax)\r
+ 11e28: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 11e2b: c6 00 03 movb $0x3,(%eax)\r
+ 11e2e: 8d 45 10 lea 0x10(%ebp),%eax\r
+ 11e31: ff 00 incl (%eax)\r
+ 11e33: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 11e36: c6 00 09 movb $0x9,(%eax)\r
+ 11e39: 8d 45 10 lea 0x10(%ebp),%eax\r
+ 11e3c: ff 00 incl (%eax)\r
+ 11e3e: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 11e41: c6 00 04 movb $0x4,(%eax)\r
+ 11e44: 8d 45 10 lea 0x10(%ebp),%eax\r
+ 11e47: ff 00 incl (%eax)\r
+ 11e49: c7 45 84 04 00 00 00 movl $0x4,0xffffff84(%ebp)\r
+ 11e50: e9 af 00 00 00 jmp 11f04 <_rh_string+0xf7>\r
+ 11e55: 83 7d 08 01 cmpl $0x1,0x8(%ebp)\r
+ 11e59: 75 17 jne 11e72 <_rh_string+0x65>\r
+ 11e5b: 83 ec 08 sub $0x8,%esp\r
+ 11e5e: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11e61: ff 70 08 pushl 0x8(%eax)\r
+ 11e64: 8d 45 88 lea 0xffffff88(%ebp),%eax\r
+ 11e67: 50 push %eax\r
+ 11e68: e8 33 7c 00 00 call 19aa0 <_strcpy>\r
+ 11e6d: 83 c4 10 add $0x10,%esp\r
+ 11e70: eb 52 jmp 11ec4 <_rh_string+0xb7>\r
+ 11e72: 83 7d 08 02 cmpl $0x2,0x8(%ebp)\r
+ 11e76: 75 17 jne 11e8f <_rh_string+0x82>\r
+ 11e78: 83 ec 08 sub $0x8,%esp\r
+ 11e7b: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11e7e: ff 70 4c pushl 0x4c(%eax)\r
+ 11e81: 8d 45 88 lea 0xffffff88(%ebp),%eax\r
+ 11e84: 50 push %eax\r
+ 11e85: e8 16 7c 00 00 call 19aa0 <_strcpy>\r
+ 11e8a: 83 c4 10 add $0x10,%esp\r
+ 11e8d: eb 35 jmp 11ec4 <_rh_string+0xb7>\r
+ 11e8f: 83 7d 08 03 cmpl $0x3,0x8(%ebp)\r
+ 11e93: 75 26 jne 11ebb <_rh_string+0xae>\r
+ 11e95: 83 ec 0c sub $0xc,%esp\r
+ 11e98: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11e9b: ff 70 50 pushl 0x50(%eax)\r
+ 11e9e: 68 a6 b0 01 00 push $0x1b0a6\r
+ 11ea3: 68 ab b0 01 00 push $0x1b0ab\r
+ 11ea8: 68 b0 b0 01 00 push $0x1b0b0\r
+ 11ead: 8d 45 88 lea 0xffffff88(%ebp),%eax\r
+ 11eb0: 50 push %eax\r
+ 11eb1: e8 da 7b 00 00 call 19a90 <_sprintf>\r
+ 11eb6: 83 c4 20 add $0x20,%esp\r
+ 11eb9: eb 09 jmp 11ec4 <_rh_string+0xb7>\r
+ 11ebb: c7 45 84 00 00 00 00 movl $0x0,0xffffff84(%ebp)\r
+ 11ec2: eb 40 jmp 11f04 <_rh_string+0xf7>\r
+ 11ec4: 8b 5d 10 mov 0x10(%ebp),%ebx\r
+ 11ec7: 8d 45 88 lea 0xffffff88(%ebp),%eax\r
+ 11eca: 83 ec 0c sub $0xc,%esp\r
+ 11ecd: 50 push %eax\r
+ 11ece: e8 ad 7b 00 00 call 19a80 <_strlen>\r
+ 11ed3: 83 c4 10 add $0x10,%esp\r
+ 11ed6: 01 c0 add %eax,%eax\r
+ 11ed8: 83 c0 02 add $0x2,%eax\r
+ 11edb: 88 03 mov %al,(%ebx)\r
+ 11edd: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 11ee0: 40 inc %eax\r
+ 11ee1: c6 00 03 movb $0x3,(%eax)\r
+ 11ee4: 8b 45 14 mov 0x14(%ebp),%eax\r
+ 11ee7: 83 e8 02 sub $0x2,%eax\r
+ 11eea: 50 push %eax\r
+ 11eeb: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 11eee: 83 c0 02 add $0x2,%eax\r
+ 11ef1: 50 push %eax\r
+ 11ef2: 8d 45 88 lea 0xffffff88(%ebp),%eax\r
+ 11ef5: 50 push %eax\r
+ 11ef6: e8 c5 fe ff ff call 11dc0 <_ascii2utf>\r
+ 11efb: 83 c4 0c add $0xc,%esp\r
+ 11efe: 83 c0 02 add $0x2,%eax\r
+ 11f01: 89 45 84 mov %eax,0xffffff84(%ebp)\r
+ 11f04: 8b 45 84 mov 0xffffff84(%ebp),%eax\r
+ 11f07: 8b 5d fc mov 0xfffffffc(%ebp),%ebx\r
+ 11f0a: c9 leave \r
+ 11f0b: c3 ret \r
+\r
+00011f0c <_rh_call_control>:\r
+ 11f0c: 55 push %ebp\r
+ 11f0d: 89 e5 mov %esp,%ebp\r
+ 11f0f: 53 push %ebx\r
+ 11f10: 83 ec 24 sub $0x24,%esp\r
+ 11f13: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11f16: 8b 40 38 mov 0x38(%eax),%eax\r
+ 11f19: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 11f1c: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 11f23: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11f26: 8b 40 24 mov 0x24(%eax),%eax\r
+ 11f29: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 11f2c: c7 45 e4 00 00 00 00 movl $0x0,0xffffffe4(%ebp)\r
+ 11f33: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 11f36: 8a 00 mov (%eax),%al\r
+ 11f38: 25 ff 00 00 00 and $0xff,%eax\r
+ 11f3d: 89 c2 mov %eax,%edx\r
+ 11f3f: c1 e2 08 shl $0x8,%edx\r
+ 11f42: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 11f45: 8a 40 01 mov 0x1(%eax),%al\r
+ 11f48: 25 ff 00 00 00 and $0xff,%eax\r
+ 11f4d: 09 d0 or %edx,%eax\r
+ 11f4f: 66 89 45 f6 mov %ax,0xfffffff6(%ebp)\r
+ 11f53: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 11f56: 66 8b 40 02 mov 0x2(%eax),%ax\r
+ 11f5a: 66 89 45 f4 mov %ax,0xfffffff4(%ebp)\r
+ 11f5e: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 11f61: 66 8b 40 04 mov 0x4(%eax),%ax\r
+ 11f65: 66 89 45 f2 mov %ax,0xfffffff2(%ebp)\r
+ 11f69: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 11f6c: 66 8b 40 06 mov 0x6(%eax),%ax\r
+ 11f70: 66 89 45 f0 mov %ax,0xfffffff0(%ebp)\r
+ 11f74: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 11f77: 89 c2 mov %eax,%edx\r
+ 11f79: 81 e2 ff ff 00 00 and $0xffff,%edx\r
+ 11f7f: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11f82: 3b 50 2c cmp 0x2c(%eax),%edx\r
+ 11f85: 7e 05 jle 11f8c <_rh_call_control+0x80>\r
+ 11f87: e9 49 02 00 00 jmp 121d5 <_rh_call_control+0x2c9>\r
+ 11f8c: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11f8f: c7 40 1c 00 00 00 00 movl $0x0,0x1c(%eax)\r
+ 11f96: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 11f99: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 11f9c: 25 ff ff 00 00 and $0xffff,%eax\r
+ 11fa1: 89 42 30 mov %eax,0x30(%edx)\r
+ 11fa4: 66 8b 45 f6 mov 0xfffffff6(%ebp),%ax\r
+ 11fa8: 89 c2 mov %eax,%edx\r
+ 11faa: 81 e2 ff ff 00 00 and $0xffff,%edx\r
+ 11fb0: 89 55 dc mov %edx,0xffffffdc(%ebp)\r
+ 11fb3: 81 7d dc 01 01 00 00 cmpl $0x101,0xffffffdc(%ebp)\r
+ 11fba: 0f 84 1f 02 00 00 je 121df <_rh_call_control+0x2d3>\r
+ 11fc0: 81 7d dc 01 01 00 00 cmpl $0x101,0xffffffdc(%ebp)\r
+ 11fc7: 7f 42 jg 1200b <_rh_call_control+0xff>\r
+ 11fc9: 83 7d dc 05 cmpl $0x5,0xffffffdc(%ebp)\r
+ 11fcd: 0f 84 0c 02 00 00 je 121df <_rh_call_control+0x2d3>\r
+ 11fd3: 83 7d dc 05 cmpl $0x5,0xffffffdc(%ebp)\r
+ 11fd7: 7f 19 jg 11ff2 <_rh_call_control+0xe6>\r
+ 11fd9: 83 7d dc 01 cmpl $0x1,0xffffffdc(%ebp)\r
+ 11fdd: 0f 84 fc 01 00 00 je 121df <_rh_call_control+0x2d3>\r
+ 11fe3: 83 7d dc 03 cmpl $0x3,0xffffffdc(%ebp)\r
+ 11fe7: 0f 84 f2 01 00 00 je 121df <_rh_call_control+0x2d3>\r
+ 11fed: e9 9e 01 00 00 jmp 12190 <_rh_call_control+0x284>\r
+ 11ff2: 83 7d dc 09 cmpl $0x9,0xffffffdc(%ebp)\r
+ 11ff6: 0f 84 e3 01 00 00 je 121df <_rh_call_control+0x2d3>\r
+ 11ffc: 83 7d dc 0b cmpl $0xb,0xffffffdc(%ebp)\r
+ 12000: 0f 84 d9 01 00 00 je 121df <_rh_call_control+0x2d3>\r
+ 12006: e9 85 01 00 00 jmp 12190 <_rh_call_control+0x284>\r
+ 1200b: 81 7d dc 06 80 00 00 cmpl $0x8006,0xffffffdc(%ebp)\r
+ 12012: 74 77 je 1208b <_rh_call_control+0x17f>\r
+ 12014: 81 7d dc 06 80 00 00 cmpl $0x8006,0xffffffdc(%ebp)\r
+ 1201b: 7f 1b jg 12038 <_rh_call_control+0x12c>\r
+ 1201d: 81 7d dc 03 01 00 00 cmpl $0x103,0xffffffdc(%ebp)\r
+ 12024: 0f 84 b5 01 00 00 je 121df <_rh_call_control+0x2d3>\r
+ 1202a: 81 7d dc 00 80 00 00 cmpl $0x8000,0xffffffdc(%ebp)\r
+ 12031: 74 3b je 1206e <_rh_call_control+0x162>\r
+ 12033: e9 58 01 00 00 jmp 12190 <_rh_call_control+0x284>\r
+ 12038: 81 7d dc 0a 80 00 00 cmpl $0x800a,0xffffffdc(%ebp)\r
+ 1203f: 0f 84 34 01 00 00 je 12179 <_rh_call_control+0x26d>\r
+ 12045: 81 7d dc 0a 80 00 00 cmpl $0x800a,0xffffffdc(%ebp)\r
+ 1204c: 7f 0e jg 1205c <_rh_call_control+0x150>\r
+ 1204e: 81 7d dc 08 80 00 00 cmpl $0x8008,0xffffffdc(%ebp)\r
+ 12055: 74 29 je 12080 <_rh_call_control+0x174>\r
+ 12057: e9 34 01 00 00 jmp 12190 <_rh_call_control+0x284>\r
+ 1205c: 81 7d dc 00 81 00 00 cmpl $0x8100,0xffffffdc(%ebp)\r
+ 12063: 0f 84 18 01 00 00 je 12181 <_rh_call_control+0x275>\r
+ 12069: e9 22 01 00 00 jmp 12190 <_rh_call_control+0x284>\r
+ 1206e: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 12071: c6 00 01 movb $0x1,(%eax)\r
+ 12074: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 12077: 40 inc %eax\r
+ 12078: c6 00 00 movb $0x0,(%eax)\r
+ 1207b: e9 5f 01 00 00 jmp 121df <_rh_call_control+0x2d3>\r
+ 12080: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 12083: c6 00 01 movb $0x1,(%eax)\r
+ 12086: e9 54 01 00 00 jmp 121df <_rh_call_control+0x2d3>\r
+ 1208b: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 1208e: 25 ff ff 00 00 and $0xffff,%eax\r
+ 12093: 25 00 ff 00 00 and $0xff00,%eax\r
+ 12098: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 1209b: 81 7d e0 00 02 00 00 cmpl $0x200,0xffffffe0(%ebp)\r
+ 120a2: 74 6f je 12113 <_rh_call_control+0x207>\r
+ 120a4: 81 7d e0 00 02 00 00 cmpl $0x200,0xffffffe0(%ebp)\r
+ 120ab: 7f 0e jg 120bb <_rh_call_control+0x1af>\r
+ 120ad: 81 7d e0 00 01 00 00 cmpl $0x100,0xffffffe0(%ebp)\r
+ 120b4: 74 17 je 120cd <_rh_call_control+0x1c1>\r
+ 120b6: e9 1a 01 00 00 jmp 121d5 <_rh_call_control+0x2c9>\r
+ 120bb: 81 7d e0 00 03 00 00 cmpl $0x300,0xffffffe0(%ebp)\r
+ 120c2: 0f 84 84 00 00 00 je 1214c <_rh_call_control+0x240>\r
+ 120c8: e9 08 01 00 00 jmp 121d5 <_rh_call_control+0x2c9>\r
+ 120cd: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 120d0: 8b 40 74 mov 0x74(%eax),%eax\r
+ 120d3: 8b 40 08 mov 0x8(%eax),%eax\r
+ 120d6: c1 e8 05 shr $0x5,%eax\r
+ 120d9: 83 e0 01 and $0x1,%eax\r
+ 120dc: 85 c0 test %eax,%eax\r
+ 120de: 74 09 je 120e9 <_rh_call_control+0x1dd>\r
+ 120e0: c7 45 ec 50 b0 01 00 movl $0x1b050,0xffffffec(%ebp)\r
+ 120e7: eb 1e jmp 12107 <_rh_call_control+0x1fb>\r
+ 120e9: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 120ec: 8b 40 74 mov 0x74(%eax),%eax\r
+ 120ef: 8b 40 08 mov 0x8(%eax),%eax\r
+ 120f2: c1 e8 04 shr $0x4,%eax\r
+ 120f5: 83 e0 01 and $0x1,%eax\r
+ 120f8: 85 c0 test %eax,%eax\r
+ 120fa: 0f 84 d5 00 00 00 je 121d5 <_rh_call_control+0x2c9>\r
+ 12100: c7 45 ec 62 b0 01 00 movl $0x1b062,0xffffffec(%ebp)\r
+ 12107: c7 45 e4 12 00 00 00 movl $0x12,0xffffffe4(%ebp)\r
+ 1210e: e9 cc 00 00 00 jmp 121df <_rh_call_control+0x2d3>\r
+ 12113: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12116: 8b 40 74 mov 0x74(%eax),%eax\r
+ 12119: 8b 40 08 mov 0x8(%eax),%eax\r
+ 1211c: c1 e8 05 shr $0x5,%eax\r
+ 1211f: 83 e0 01 and $0x1,%eax\r
+ 12122: 85 c0 test %eax,%eax\r
+ 12124: 74 13 je 12139 <_rh_call_control+0x22d>\r
+ 12126: c7 45 ec 8d b0 01 00 movl $0x1b08d,0xffffffec(%ebp)\r
+ 1212d: c7 45 e4 19 00 00 00 movl $0x19,0xffffffe4(%ebp)\r
+ 12134: e9 a6 00 00 00 jmp 121df <_rh_call_control+0x2d3>\r
+ 12139: c7 45 ec 74 b0 01 00 movl $0x1b074,0xffffffec(%ebp)\r
+ 12140: c7 45 e4 19 00 00 00 movl $0x19,0xffffffe4(%ebp)\r
+ 12147: e9 93 00 00 00 jmp 121df <_rh_call_control+0x2d3>\r
+ 1214c: 8b 5d 0c mov 0xc(%ebp),%ebx\r
+ 1214f: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 12152: 25 ff ff 00 00 and $0xffff,%eax\r
+ 12157: 50 push %eax\r
+ 12158: ff 75 e8 pushl 0xffffffe8(%ebp)\r
+ 1215b: ff 75 08 pushl 0x8(%ebp)\r
+ 1215e: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 12161: 25 ff ff 00 00 and $0xffff,%eax\r
+ 12166: 25 ff 00 00 00 and $0xff,%eax\r
+ 1216b: 50 push %eax\r
+ 1216c: e8 9c fc ff ff call 11e0d <_rh_string>\r
+ 12171: 83 c4 10 add $0x10,%esp\r
+ 12174: 89 43 30 mov %eax,0x30(%ebx)\r
+ 12177: eb 66 jmp 121df <_rh_call_control+0x2d3>\r
+ 12179: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 1217c: c6 00 00 movb $0x0,(%eax)\r
+ 1217f: eb 5e jmp 121df <_rh_call_control+0x2d3>\r
+ 12181: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 12184: c6 00 00 movb $0x0,(%eax)\r
+ 12187: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 1218a: 40 inc %eax\r
+ 1218b: c6 00 00 movb $0x0,(%eax)\r
+ 1218e: eb 4f jmp 121df <_rh_call_control+0x2d3>\r
+ 12190: 8b 5d 0c mov 0xc(%ebp),%ebx\r
+ 12193: 83 ec 08 sub $0x8,%esp\r
+ 12196: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12199: 8b 50 74 mov 0x74(%eax),%edx\r
+ 1219c: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 1219f: 25 ff ff 00 00 and $0xffff,%eax\r
+ 121a4: 50 push %eax\r
+ 121a5: ff 75 e8 pushl 0xffffffe8(%ebp)\r
+ 121a8: 66 8b 45 f2 mov 0xfffffff2(%ebp),%ax\r
+ 121ac: 25 ff ff 00 00 and $0xffff,%eax\r
+ 121b1: 50 push %eax\r
+ 121b2: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 121b5: 25 ff ff 00 00 and $0xffff,%eax\r
+ 121ba: 50 push %eax\r
+ 121bb: 66 8b 45 f6 mov 0xfffffff6(%ebp),%ax\r
+ 121bf: 25 ff ff 00 00 and $0xffff,%eax\r
+ 121c4: 50 push %eax\r
+ 121c5: ff 75 08 pushl 0x8(%ebp)\r
+ 121c8: 8b 42 38 mov 0x38(%edx),%eax\r
+ 121cb: ff d0 call *%eax\r
+ 121cd: 83 c4 20 add $0x20,%esp\r
+ 121d0: 89 43 1c mov %eax,0x1c(%ebx)\r
+ 121d3: eb 0a jmp 121df <_rh_call_control+0x2d3>\r
+ 121d5: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 121d8: c7 40 1c e0 ff ff ff movl $0xffffffe0,0x1c(%eax)\r
+ 121df: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 121e2: 83 78 1c 00 cmpl $0x0,0x1c(%eax)\r
+ 121e6: 74 0a je 121f2 <_rh_call_control+0x2e6>\r
+ 121e8: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 121eb: c7 40 30 00 00 00 00 movl $0x0,0x30(%eax)\r
+ 121f2: 83 7d ec 00 cmpl $0x0,0xffffffec(%ebp)\r
+ 121f6: 74 31 je 12229 <_rh_call_control+0x31d>\r
+ 121f8: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 121fb: 8b 40 2c mov 0x2c(%eax),%eax\r
+ 121fe: 3b 45 e4 cmp 0xffffffe4(%ebp),%eax\r
+ 12201: 7d 09 jge 1220c <_rh_call_control+0x300>\r
+ 12203: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12206: 8b 40 2c mov 0x2c(%eax),%eax\r
+ 12209: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 1220c: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 1220f: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 12212: 89 42 30 mov %eax,0x30(%edx)\r
+ 12215: 83 ec 04 sub $0x4,%esp\r
+ 12218: ff 75 e4 pushl 0xffffffe4(%ebp)\r
+ 1221b: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 1221e: ff 75 e8 pushl 0xffffffe8(%ebp)\r
+ 12221: e8 4a 78 00 00 call 19a70 <_memcpy>\r
+ 12226: 83 c4 10 add $0x10,%esp\r
+ 12229: 83 ec 04 sub $0x4,%esp\r
+ 1222c: 6a 00 push $0x0\r
+ 1222e: ff 75 0c pushl 0xc(%ebp)\r
+ 12231: ff 75 08 pushl 0x8(%ebp)\r
+ 12234: e8 5d 14 00 00 call 13696 <_usb_hcd_giveback_urb@12>\r
+ 12239: 83 c4 04 add $0x4,%esp\r
+ 1223c: b8 00 00 00 00 mov $0x0,%eax\r
+ 12241: 8b 5d fc mov 0xfffffffc(%ebp),%ebx\r
+ 12244: c9 leave \r
+ 12245: c3 ret \r
+\r
+00012246 <_rh_status_urb>:\r
+ 12246: 55 push %ebp\r
+ 12247: 89 e5 mov %esp,%ebp\r
+ 12249: 83 ec 18 sub $0x18,%esp\r
+ 1224c: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1224f: 8b 40 14 mov 0x14(%eax),%eax\r
+ 12252: 8b 80 ac 01 00 00 mov 0x1ac(%eax),%eax\r
+ 12258: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 1225b: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 1225f: 79 04 jns 12265 <_rh_status_urb+0x1f>\r
+ 12261: 83 45 f4 07 addl $0x7,0xfffffff4(%ebp)\r
+ 12265: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 12268: c1 f8 03 sar $0x3,%eax\r
+ 1226b: 40 inc %eax\r
+ 1226c: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 1226f: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12272: 83 78 58 00 cmpl $0x0,0x58(%eax)\r
+ 12276: 75 16 jne 1228e <_rh_status_urb+0x48>\r
+ 12278: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1227b: 83 78 1c 8d cmpl $0xffffff8d,0x1c(%eax)\r
+ 1227f: 75 0d jne 1228e <_rh_status_urb+0x48>\r
+ 12281: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12284: 8b 40 2c mov 0x2c(%eax),%eax\r
+ 12287: 3b 45 fc cmp 0xfffffffc(%ebp),%eax\r
+ 1228a: 7c 02 jl 1228e <_rh_status_urb+0x48>\r
+ 1228c: eb 09 jmp 12297 <_rh_status_urb+0x51>\r
+ 1228e: c7 45 f8 ea ff ff ff movl $0xffffffea,0xfffffff8(%ebp)\r
+ 12295: eb 55 jmp 122ec <_rh_status_urb+0xa6>\r
+ 12297: 83 ec 0c sub $0xc,%esp\r
+ 1229a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1229d: 83 c0 54 add $0x54,%eax\r
+ 122a0: 50 push %eax\r
+ 122a1: e8 83 00 00 00 call 12329 <_init_timer>\r
+ 122a6: 83 c4 10 add $0x10,%esp\r
+ 122a9: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 122ac: c7 40 54 5e 23 01 00 movl $0x1235e,0x54(%eax)\r
+ 122b3: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 122b6: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 122b9: 89 42 58 mov %eax,0x58(%edx)\r
+ 122bc: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 122bf: a1 40 c2 01 00 mov 0x1c240,%eax\r
+ 122c4: 83 c0 19 add $0x19,%eax\r
+ 122c7: 89 42 5c mov %eax,0x5c(%edx)\r
+ 122ca: 83 ec 0c sub $0xc,%esp\r
+ 122cd: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 122d0: 83 c0 54 add $0x54,%eax\r
+ 122d3: 50 push %eax\r
+ 122d4: e8 18 00 00 00 call 122f1 <_add_timer>\r
+ 122d9: 83 c4 10 add $0x10,%esp\r
+ 122dc: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 122df: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 122e2: 89 42 08 mov %eax,0x8(%edx)\r
+ 122e5: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 122ec: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 122ef: c9 leave \r
+ 122f0: c3 ret \r
+\r
+000122f1 <_add_timer>:\r
+ 122f1: 55 push %ebp\r
+ 122f2: 89 e5 mov %esp,%ebp\r
+ 122f4: 83 ec 04 sub $0x4,%esp\r
+ 122f7: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 122fe: 83 7d fc 13 cmpl $0x13,0xfffffffc(%ebp)\r
+ 12302: 7f 23 jg 12327 <_add_timer+0x36>\r
+ 12304: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12307: 83 3c 85 60 c1 01 00 cmpl $0x0,0x1c160(,%eax,4)\r
+ 1230e: 00 \r
+ 1230f: 75 0f jne 12320 <_add_timer+0x2f>\r
+ 12311: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 12314: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12317: 89 04 95 60 c1 01 00 mov %eax,0x1c160(,%edx,4)\r
+ 1231e: eb 07 jmp 12327 <_add_timer+0x36>\r
+ 12320: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 12323: ff 00 incl (%eax)\r
+ 12325: eb d7 jmp 122fe <_add_timer+0xd>\r
+ 12327: c9 leave \r
+ 12328: c3 ret \r
+\r
+00012329 <_init_timer>:\r
+ 12329: 55 push %ebp\r
+ 1232a: 89 e5 mov %esp,%ebp\r
+ 1232c: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 1232f: 83 c2 0c add $0xc,%edx\r
+ 12332: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12335: 83 c0 0c add $0xc,%eax\r
+ 12338: 89 02 mov %eax,(%edx)\r
+ 1233a: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 1233d: 83 c2 0c add $0xc,%edx\r
+ 12340: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12343: 83 c0 0c add $0xc,%eax\r
+ 12346: 89 42 04 mov %eax,0x4(%edx)\r
+ 12349: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1234c: c7 00 00 00 00 00 movl $0x0,(%eax)\r
+ 12352: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12355: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax)\r
+ 1235c: 5d pop %ebp\r
+ 1235d: c3 ret \r
+\r
+0001235e <_rh_report_status>:\r
+ 1235e: 55 push %ebp\r
+ 1235f: 89 e5 mov %esp,%ebp\r
+ 12361: 83 ec 18 sub $0x18,%esp\r
+ 12364: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12367: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 1236a: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1236d: c7 00 01 00 00 00 movl $0x1,(%eax)\r
+ 12373: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12376: 83 78 14 00 cmpl $0x0,0x14(%eax)\r
+ 1237a: 0f 84 c6 00 00 00 je 12446 <_rh_report_status+0xe8>\r
+ 12380: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12383: 83 78 1c 8d cmpl $0xffffff8d,0x1c(%eax)\r
+ 12387: 0f 85 b9 00 00 00 jne 12446 <_rh_report_status+0xe8>\r
+ 1238d: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12390: 8b 40 14 mov 0x14(%eax),%eax\r
+ 12393: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 12399: 8b 40 30 mov 0x30(%eax),%eax\r
+ 1239c: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 1239f: 85 c0 test %eax,%eax\r
+ 123a1: 0f 84 9f 00 00 00 je 12446 <_rh_report_status+0xe8>\r
+ 123a7: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 123aa: 8b 80 e0 00 00 00 mov 0xe0(%eax),%eax\r
+ 123b0: 83 e0 01 and $0x1,%eax\r
+ 123b3: 85 c0 test %eax,%eax\r
+ 123b5: 75 05 jne 123bc <_rh_report_status+0x5e>\r
+ 123b7: e9 8a 00 00 00 jmp 12446 <_rh_report_status+0xe8>\r
+ 123bc: 83 ec 08 sub $0x8,%esp\r
+ 123bf: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 123c2: 8b 50 74 mov 0x74(%eax),%edx\r
+ 123c5: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 123c8: ff 70 24 pushl 0x24(%eax)\r
+ 123cb: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 123ce: 8b 42 34 mov 0x34(%edx),%eax\r
+ 123d1: ff d0 call *%eax\r
+ 123d3: 83 c4 10 add $0x10,%esp\r
+ 123d6: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 123d9: c7 05 00 c0 01 00 01 movl $0x1,0x1c000\r
+ 123e0: 00 00 00 \r
+ 123e3: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 123e7: 7e 29 jle 12412 <_rh_report_status+0xb4>\r
+ 123e9: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 123ec: c7 40 58 00 00 00 00 movl $0x0,0x58(%eax)\r
+ 123f3: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 123f6: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 123f9: 89 42 30 mov %eax,0x30(%edx)\r
+ 123fc: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 123ff: c7 40 1c 00 00 00 00 movl $0x0,0x1c(%eax)\r
+ 12406: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12409: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax)\r
+ 12410: eb 1b jmp 1242d <_rh_report_status+0xcf>\r
+ 12412: 83 ec 08 sub $0x8,%esp\r
+ 12415: a1 40 c2 01 00 mov 0x1c240,%eax\r
+ 1241a: 83 c0 19 add $0x19,%eax\r
+ 1241d: 50 push %eax\r
+ 1241e: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12421: 83 c0 54 add $0x54,%eax\r
+ 12424: 50 push %eax\r
+ 12425: e8 1e 00 00 00 call 12448 <_mod_timer>\r
+ 1242a: 83 c4 10 add $0x10,%esp\r
+ 1242d: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 12431: 7e 13 jle 12446 <_rh_report_status+0xe8>\r
+ 12433: 83 ec 04 sub $0x4,%esp\r
+ 12436: 6a 00 push $0x0\r
+ 12438: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 1243b: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 1243e: e8 53 12 00 00 call 13696 <_usb_hcd_giveback_urb@12>\r
+ 12443: 83 c4 04 add $0x4,%esp\r
+ 12446: c9 leave \r
+ 12447: c3 ret \r
+\r
+00012448 <_mod_timer>:\r
+ 12448: 55 push %ebp\r
+ 12449: 89 e5 mov %esp,%ebp\r
+ 1244b: 83 ec 08 sub $0x8,%esp\r
+ 1244e: 83 ec 0c sub $0xc,%esp\r
+ 12451: ff 75 08 pushl 0x8(%ebp)\r
+ 12454: e8 19 00 00 00 call 12472 <_del_timer>\r
+ 12459: 83 c4 10 add $0x10,%esp\r
+ 1245c: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 1245f: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12462: 89 42 08 mov %eax,0x8(%edx)\r
+ 12465: ff 75 08 pushl 0x8(%ebp)\r
+ 12468: e8 84 fe ff ff call 122f1 <_add_timer>\r
+ 1246d: 83 c4 04 add $0x4,%esp\r
+ 12470: c9 leave \r
+ 12471: c3 ret \r
+\r
+00012472 <_del_timer>:\r
+ 12472: 55 push %ebp\r
+ 12473: 89 e5 mov %esp,%ebp\r
+ 12475: 83 ec 04 sub $0x4,%esp\r
+ 12478: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 1247f: 83 7d fc 13 cmpl $0x13,0xfffffffc(%ebp)\r
+ 12483: 7f 26 jg 124ab <_del_timer+0x39>\r
+ 12485: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12488: 8b 04 85 60 c1 01 00 mov 0x1c160(,%eax,4),%eax\r
+ 1248f: 3b 45 08 cmp 0x8(%ebp),%eax\r
+ 12492: 75 10 jne 124a4 <_del_timer+0x32>\r
+ 12494: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12497: c7 04 85 60 c1 01 00 movl $0x0,0x1c160(,%eax,4)\r
+ 1249e: 00 00 00 00 \r
+ 124a2: eb 07 jmp 124ab <_del_timer+0x39>\r
+ 124a4: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 124a7: ff 00 incl (%eax)\r
+ 124a9: eb d4 jmp 1247f <_del_timer+0xd>\r
+ 124ab: c9 leave \r
+ 124ac: c3 ret \r
+\r
+000124ad <_rh_urb_enqueue>:\r
+ 124ad: 55 push %ebp\r
+ 124ae: 89 e5 mov %esp,%ebp\r
+ 124b0: 83 ec 18 sub $0x18,%esp\r
+ 124b3: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 124b6: 8b 40 18 mov 0x18(%eax),%eax\r
+ 124b9: c1 e8 1e shr $0x1e,%eax\r
+ 124bc: 83 e0 03 and $0x3,%eax\r
+ 124bf: 83 f8 01 cmp $0x1,%eax\r
+ 124c2: 75 23 jne 124e7 <_rh_urb_enqueue+0x3a>\r
+ 124c4: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 124cb: 83 ec 08 sub $0x8,%esp\r
+ 124ce: ff 75 0c pushl 0xc(%ebp)\r
+ 124d1: ff 75 08 pushl 0x8(%ebp)\r
+ 124d4: e8 6d fd ff ff call 12246 <_rh_status_urb>\r
+ 124d9: 83 c4 10 add $0x10,%esp\r
+ 124dc: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 124df: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 124e2: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 124e5: eb 2e jmp 12515 <_rh_urb_enqueue+0x68>\r
+ 124e7: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 124ea: 8b 40 18 mov 0x18(%eax),%eax\r
+ 124ed: c1 e8 1e shr $0x1e,%eax\r
+ 124f0: 83 e0 03 and $0x3,%eax\r
+ 124f3: 83 f8 02 cmp $0x2,%eax\r
+ 124f6: 75 16 jne 1250e <_rh_urb_enqueue+0x61>\r
+ 124f8: 83 ec 08 sub $0x8,%esp\r
+ 124fb: ff 75 0c pushl 0xc(%ebp)\r
+ 124fe: ff 75 08 pushl 0x8(%ebp)\r
+ 12501: e8 06 fa ff ff call 11f0c <_rh_call_control>\r
+ 12506: 83 c4 10 add $0x10,%esp\r
+ 12509: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 1250c: eb 07 jmp 12515 <_rh_urb_enqueue+0x68>\r
+ 1250e: c7 45 f4 ea ff ff ff movl $0xffffffea,0xfffffff4(%ebp)\r
+ 12515: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 12518: c9 leave \r
+ 12519: c3 ret \r
+\r
+0001251a <_usb_rh_status_dequeue>:\r
+ 1251a: 55 push %ebp\r
+ 1251b: 89 e5 mov %esp,%ebp\r
+ 1251d: 83 ec 08 sub $0x8,%esp\r
+ 12520: 83 ec 0c sub $0xc,%esp\r
+ 12523: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12526: 83 c0 54 add $0x54,%eax\r
+ 12529: 50 push %eax\r
+ 1252a: e8 2c 00 00 00 call 1255b <_del_timer_sync>\r
+ 1252f: 83 c4 10 add $0x10,%esp\r
+ 12532: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12535: c7 40 58 00 00 00 00 movl $0x0,0x58(%eax)\r
+ 1253c: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1253f: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax)\r
+ 12546: 83 ec 04 sub $0x4,%esp\r
+ 12549: 6a 00 push $0x0\r
+ 1254b: ff 75 0c pushl 0xc(%ebp)\r
+ 1254e: ff 75 08 pushl 0x8(%ebp)\r
+ 12551: e8 40 11 00 00 call 13696 <_usb_hcd_giveback_urb@12>\r
+ 12556: 83 c4 04 add $0x4,%esp\r
+ 12559: c9 leave \r
+ 1255a: c3 ret \r
+\r
+0001255b <_del_timer_sync>:\r
+ 1255b: 55 push %ebp\r
+ 1255c: 89 e5 mov %esp,%ebp\r
+ 1255e: 83 ec 04 sub $0x4,%esp\r
+ 12561: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 12568: 83 7d fc 13 cmpl $0x13,0xfffffffc(%ebp)\r
+ 1256c: 7f 26 jg 12594 <_del_timer_sync+0x39>\r
+ 1256e: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12571: 8b 04 85 60 c1 01 00 mov 0x1c160(,%eax,4),%eax\r
+ 12578: 3b 45 08 cmp 0x8(%ebp),%eax\r
+ 1257b: 75 10 jne 1258d <_del_timer_sync+0x32>\r
+ 1257d: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12580: c7 04 85 60 c1 01 00 movl $0x0,0x1c160(,%eax,4)\r
+ 12587: 00 00 00 00 \r
+ 1258b: eb 07 jmp 12594 <_del_timer_sync+0x39>\r
+ 1258d: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 12590: ff 00 incl (%eax)\r
+ 12592: eb d4 jmp 12568 <_del_timer_sync+0xd>\r
+ 12594: c9 leave \r
+ 12595: c3 ret \r
+\r
+00012596 <_usb_bus_get>:\r
+ 12596: 55 push %ebp\r
+ 12597: 89 e5 mov %esp,%ebp\r
+ 12599: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1259c: 83 c0 48 add $0x48,%eax\r
+ 1259f: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 125a2: 83 c2 48 add $0x48,%edx\r
+ 125a5: 8b 12 mov (%edx),%edx\r
+ 125a7: 42 inc %edx\r
+ 125a8: 89 10 mov %edx,(%eax)\r
+ 125aa: 5d pop %ebp\r
+ 125ab: c3 ret \r
+\r
+000125ac <_usb_bus_put>:\r
+ 125ac: 55 push %ebp\r
+ 125ad: 89 e5 mov %esp,%ebp\r
+ 125af: 83 ec 08 sub $0x8,%esp\r
+ 125b2: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 125b5: 83 c2 48 add $0x48,%edx\r
+ 125b8: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 125bb: 83 c0 48 add $0x48,%eax\r
+ 125be: 8b 00 mov (%eax),%eax\r
+ 125c0: 48 dec %eax\r
+ 125c1: 89 02 mov %eax,(%edx)\r
+ 125c3: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 125c6: 83 c0 48 add $0x48,%eax\r
+ 125c9: 83 38 00 cmpl $0x0,(%eax)\r
+ 125cc: 75 0e jne 125dc <_usb_bus_put+0x30>\r
+ 125ce: 83 ec 0c sub $0xc,%esp\r
+ 125d1: ff 75 08 pushl 0x8(%ebp)\r
+ 125d4: e8 67 74 00 00 call 19a40 <_ExFreePool@4>\r
+ 125d9: 83 c4 0c add $0xc,%esp\r
+ 125dc: c9 leave \r
+ 125dd: c3 ret \r
+\r
+000125de <_usb_bus_init@4>:\r
+ 125de: 55 push %ebp\r
+ 125df: 89 e5 mov %esp,%ebp\r
+ 125e1: 83 ec 08 sub $0x8,%esp\r
+ 125e4: 83 ec 04 sub $0x4,%esp\r
+ 125e7: 6a 10 push $0x10\r
+ 125e9: 6a 00 push $0x0\r
+ 125eb: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 125ee: 83 c0 10 add $0x10,%eax\r
+ 125f1: 50 push %eax\r
+ 125f2: e8 59 74 00 00 call 19a50 <_memset>\r
+ 125f7: 83 c4 10 add $0x10,%esp\r
+ 125fa: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 125fd: c7 40 0c 01 00 00 00 movl $0x1,0xc(%eax)\r
+ 12604: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12607: c7 40 24 00 00 00 00 movl $0x0,0x24(%eax)\r
+ 1260e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12611: c7 40 30 00 00 00 00 movl $0x0,0x30(%eax)\r
+ 12618: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1261b: c7 40 04 ff ff ff ff movl $0xffffffff,0x4(%eax)\r
+ 12622: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12625: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)\r
+ 1262c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1262f: c7 40 38 00 00 00 00 movl $0x0,0x38(%eax)\r
+ 12636: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12639: c7 40 3c 00 00 00 00 movl $0x0,0x3c(%eax)\r
+ 12640: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 12643: 83 c2 28 add $0x28,%edx\r
+ 12646: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12649: 83 c0 28 add $0x28,%eax\r
+ 1264c: 89 02 mov %eax,(%edx)\r
+ 1264e: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 12651: 83 c2 28 add $0x28,%edx\r
+ 12654: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12657: 83 c0 28 add $0x28,%eax\r
+ 1265a: 89 42 04 mov %eax,0x4(%edx)\r
+ 1265d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12660: 83 c0 48 add $0x48,%eax\r
+ 12663: c7 00 01 00 00 00 movl $0x1,(%eax)\r
+ 12669: c9 leave \r
+ 1266a: c2 04 00 ret $0x4\r
+\r
+0001266d <_usb_alloc_bus@4>:\r
+ 1266d: 55 push %ebp\r
+ 1266e: 89 e5 mov %esp,%ebp\r
+ 12670: 83 ec 08 sub $0x8,%esp\r
+ 12673: 83 ec 08 sub $0x8,%esp\r
+ 12676: 6a 4c push $0x4c\r
+ 12678: 6a 01 push $0x1\r
+ 1267a: e8 b1 73 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 1267f: 83 c4 08 add $0x8,%esp\r
+ 12682: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 12685: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 12689: 75 09 jne 12694 <_usb_alloc_bus@4+0x27>\r
+ 1268b: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 12692: eb 1d jmp 126b1 <_usb_alloc_bus@4+0x44>\r
+ 12694: 83 ec 0c sub $0xc,%esp\r
+ 12697: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 1269a: e8 3f ff ff ff call 125de <_usb_bus_init@4>\r
+ 1269f: 83 c4 0c add $0xc,%esp\r
+ 126a2: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 126a5: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 126a8: 89 50 20 mov %edx,0x20(%eax)\r
+ 126ab: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 126ae: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 126b1: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 126b4: c9 leave \r
+ 126b5: c2 04 00 ret $0x4\r
+\r
+000126b8 <_usb_free_bus@4>:\r
+ 126b8: 55 push %ebp\r
+ 126b9: 89 e5 mov %esp,%ebp\r
+ 126bb: 83 ec 08 sub $0x8,%esp\r
+ 126be: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 126c2: 75 02 jne 126c6 <_usb_free_bus@4+0xe>\r
+ 126c4: eb 0e jmp 126d4 <_usb_free_bus@4+0x1c>\r
+ 126c6: 83 ec 0c sub $0xc,%esp\r
+ 126c9: ff 75 08 pushl 0x8(%ebp)\r
+ 126cc: e8 db fe ff ff call 125ac <_usb_bus_put>\r
+ 126d1: 83 c4 10 add $0x10,%esp\r
+ 126d4: c9 leave \r
+ 126d5: c2 04 00 ret $0x4\r
+\r
+000126d8 <_usb_register_bus@4>:\r
+ 126d8: 55 push %ebp\r
+ 126d9: 89 e5 mov %esp,%ebp\r
+ 126db: 83 ec 08 sub $0x8,%esp\r
+ 126de: 83 ec 04 sub $0x4,%esp\r
+ 126e1: 6a 01 push $0x1\r
+ 126e3: 6a 40 push $0x40\r
+ 126e5: 68 10 c0 01 00 push $0x1c010\r
+ 126ea: e8 b4 00 00 00 call 127a3 <_find_next_zero_bit>\r
+ 126ef: 83 c4 10 add $0x10,%esp\r
+ 126f2: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 126f5: 83 7d fc 3f cmpl $0x3f,0xfffffffc(%ebp)\r
+ 126f9: 7f 1c jg 12717 <_usb_register_bus@4+0x3f>\r
+ 126fb: 83 ec 08 sub $0x8,%esp\r
+ 126fe: 68 10 c0 01 00 push $0x1c010\r
+ 12703: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 12706: e8 8a 00 00 00 call 12795 <_set_bit>\r
+ 1270b: 83 c4 10 add $0x10,%esp\r
+ 1270e: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 12711: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12714: 89 42 04 mov %eax,0x4(%edx)\r
+ 12717: ff 75 08 pushl 0x8(%ebp)\r
+ 1271a: e8 77 fe ff ff call 12596 <_usb_bus_get>\r
+ 1271f: 83 c4 04 add $0x4,%esp\r
+ 12722: 83 ec 08 sub $0x8,%esp\r
+ 12725: 68 00 a0 01 00 push $0x1a000\r
+ 1272a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1272d: 83 c0 28 add $0x28,%eax\r
+ 12730: 50 push %eax\r
+ 12731: e8 1a 00 00 00 call 12750 <_list_add>\r
+ 12736: 83 c4 10 add $0x10,%esp\r
+ 12739: 83 ec 0c sub $0xc,%esp\r
+ 1273c: ff 75 08 pushl 0x8(%ebp)\r
+ 1273f: e8 07 00 00 00 call 1274b <_usbfs_add_bus>\r
+ 12744: 83 c4 10 add $0x10,%esp\r
+ 12747: c9 leave \r
+ 12748: c2 04 00 ret $0x4\r
+\r
+0001274b <_usbfs_add_bus>:\r
+ 1274b: 55 push %ebp\r
+ 1274c: 89 e5 mov %esp,%ebp\r
+ 1274e: 5d pop %ebp\r
+ 1274f: c3 ret \r
+\r
+00012750 <_list_add>:\r
+ 12750: 55 push %ebp\r
+ 12751: 89 e5 mov %esp,%ebp\r
+ 12753: 83 ec 08 sub $0x8,%esp\r
+ 12756: 83 ec 04 sub $0x4,%esp\r
+ 12759: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1275c: ff 30 pushl (%eax)\r
+ 1275e: ff 75 0c pushl 0xc(%ebp)\r
+ 12761: ff 75 08 pushl 0x8(%ebp)\r
+ 12764: e8 05 00 00 00 call 1276e <___list_add>\r
+ 12769: 83 c4 10 add $0x10,%esp\r
+ 1276c: c9 leave \r
+ 1276d: c3 ret \r
+\r
+0001276e <___list_add>:\r
+ 1276e: 55 push %ebp\r
+ 1276f: 89 e5 mov %esp,%ebp\r
+ 12771: 8b 55 10 mov 0x10(%ebp),%edx\r
+ 12774: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12777: 89 42 04 mov %eax,0x4(%edx)\r
+ 1277a: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 1277d: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 12780: 89 02 mov %eax,(%edx)\r
+ 12782: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 12785: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12788: 89 42 04 mov %eax,0x4(%edx)\r
+ 1278b: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 1278e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12791: 89 02 mov %eax,(%edx)\r
+ 12793: 5d pop %ebp\r
+ 12794: c3 ret \r
+\r
+00012795 <_set_bit>:\r
+ 12795: 55 push %ebp\r
+ 12796: 89 e5 mov %esp,%ebp\r
+ 12798: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 1279b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1279e: 0f ab 02 bts %eax,(%edx)\r
+ 127a1: 5d pop %ebp\r
+ 127a2: c3 ret \r
+\r
+000127a3 <_find_next_zero_bit>:\r
+ 127a3: 55 push %ebp\r
+ 127a4: 89 e5 mov %esp,%ebp\r
+ 127a6: 83 ec 18 sub $0x18,%esp\r
+ 127a9: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 127ac: c1 f8 05 sar $0x5,%eax\r
+ 127af: c1 e0 02 shl $0x2,%eax\r
+ 127b2: 03 45 08 add 0x8(%ebp),%eax\r
+ 127b5: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 127b8: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 127bf: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 127c2: 83 e0 1f and $0x1f,%eax\r
+ 127c5: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 127c8: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 127cc: 74 42 je 12810 <_find_next_zero_bit+0x6d>\r
+ 127ce: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 127d1: 8b 4d f4 mov 0xfffffff4(%ebp),%ecx\r
+ 127d4: 8b 00 mov (%eax),%eax\r
+ 127d6: d3 e8 shr %cl,%eax\r
+ 127d8: f7 d0 not %eax\r
+ 127da: 0f bc c0 bsf %eax,%eax\r
+ 127dd: 75 05 jne 127e4 <_find_next_zero_bit+0x41>\r
+ 127df: b8 20 00 00 00 mov $0x20,%eax\r
+ 127e4: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 127e7: b8 20 00 00 00 mov $0x20,%eax\r
+ 127ec: 2b 45 f4 sub 0xfffffff4(%ebp),%eax\r
+ 127ef: 3b 45 f8 cmp 0xfffffff8(%ebp),%eax\r
+ 127f2: 7e 0b jle 127ff <_find_next_zero_bit+0x5c>\r
+ 127f4: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 127f7: 03 45 f8 add 0xfffffff8(%ebp),%eax\r
+ 127fa: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 127fd: eb 43 jmp 12842 <_find_next_zero_bit+0x9f>\r
+ 127ff: b8 20 00 00 00 mov $0x20,%eax\r
+ 12804: 2b 45 f4 sub 0xfffffff4(%ebp),%eax\r
+ 12807: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 1280a: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 1280d: 83 00 04 addl $0x4,(%eax)\r
+ 12810: 83 ec 08 sub $0x8,%esp\r
+ 12813: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 12816: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12819: 29 d0 sub %edx,%eax\r
+ 1281b: 8d 14 c5 00 00 00 00 lea 0x0(,%eax,8),%edx\r
+ 12822: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12825: 29 d0 sub %edx,%eax\r
+ 12827: 50 push %eax\r
+ 12828: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 1282b: e8 17 00 00 00 call 12847 <_find_first_zero_bit>\r
+ 12830: 83 c4 10 add $0x10,%esp\r
+ 12833: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 12836: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12839: 03 45 10 add 0x10(%ebp),%eax\r
+ 1283c: 03 45 f0 add 0xfffffff0(%ebp),%eax\r
+ 1283f: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 12842: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 12845: c9 leave \r
+ 12846: c3 ret \r
+\r
+00012847 <_find_first_zero_bit>:\r
+ 12847: 55 push %ebp\r
+ 12848: 89 e5 mov %esp,%ebp\r
+ 1284a: 57 push %edi\r
+ 1284b: 53 push %ebx\r
+ 1284c: 83 ec 14 sub $0x14,%esp\r
+ 1284f: 83 7d 0c 00 cmpl $0x0,0xc(%ebp)\r
+ 12853: 75 09 jne 1285e <_find_first_zero_bit+0x17>\r
+ 12855: c7 45 e4 00 00 00 00 movl $0x0,0xffffffe4(%ebp)\r
+ 1285c: eb 48 jmp 128a6 <_find_first_zero_bit+0x5f>\r
+ 1285e: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12861: 83 c0 1f add $0x1f,%eax\r
+ 12864: 89 c1 mov %eax,%ecx\r
+ 12866: c1 e9 05 shr $0x5,%ecx\r
+ 12869: 8b 7d 08 mov 0x8(%ebp),%edi\r
+ 1286c: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 1286f: b8 ff ff ff ff mov $0xffffffff,%eax\r
+ 12874: 31 d2 xor %edx,%edx\r
+ 12876: f3 af repz scas %es:(%edi),%eax\r
+ 12878: 74 09 je 12883 <_find_first_zero_bit+0x3c>\r
+ 1287a: 33 47 fc xor 0xfffffffc(%edi),%eax\r
+ 1287d: 83 ef 04 sub $0x4,%edi\r
+ 12880: 0f bc d0 bsf %eax,%edx\r
+ 12883: 29 df sub %ebx,%edi\r
+ 12885: c1 e7 03 shl $0x3,%edi\r
+ 12888: 01 fa add %edi,%edx\r
+ 1288a: 89 c3 mov %eax,%ebx\r
+ 1288c: 89 d0 mov %edx,%eax\r
+ 1288e: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 12891: 89 c8 mov %ecx,%eax\r
+ 12893: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 12896: 89 f8 mov %edi,%eax\r
+ 12898: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 1289b: 89 d8 mov %ebx,%eax\r
+ 1289d: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 128a0: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 128a3: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 128a6: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 128a9: 83 c4 14 add $0x14,%esp\r
+ 128ac: 5b pop %ebx\r
+ 128ad: 5f pop %edi\r
+ 128ae: 5d pop %ebp\r
+ 128af: c3 ret \r
+\r
+000128b0 <_usb_deregister_bus@4>:\r
+ 128b0: 55 push %ebp\r
+ 128b1: 89 e5 mov %esp,%ebp\r
+ 128b3: 83 ec 08 sub $0x8,%esp\r
+ 128b6: 83 ec 0c sub $0xc,%esp\r
+ 128b9: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 128bc: 83 c0 28 add $0x28,%eax\r
+ 128bf: 50 push %eax\r
+ 128c0: e8 4c 00 00 00 call 12911 <_list_del>\r
+ 128c5: 83 c4 10 add $0x10,%esp\r
+ 128c8: 83 ec 0c sub $0xc,%esp\r
+ 128cb: ff 75 08 pushl 0x8(%ebp)\r
+ 128ce: e8 39 00 00 00 call 1290c <_usbfs_remove_bus>\r
+ 128d3: 83 c4 10 add $0x10,%esp\r
+ 128d6: 83 ec 08 sub $0x8,%esp\r
+ 128d9: 68 10 c0 01 00 push $0x1c010\r
+ 128de: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 128e1: ff 70 04 pushl 0x4(%eax)\r
+ 128e4: e8 15 00 00 00 call 128fe <_clear_bit>\r
+ 128e9: 83 c4 10 add $0x10,%esp\r
+ 128ec: 83 ec 0c sub $0xc,%esp\r
+ 128ef: ff 75 08 pushl 0x8(%ebp)\r
+ 128f2: e8 b5 fc ff ff call 125ac <_usb_bus_put>\r
+ 128f7: 83 c4 10 add $0x10,%esp\r
+ 128fa: c9 leave \r
+ 128fb: c2 04 00 ret $0x4\r
+\r
+000128fe <_clear_bit>:\r
+ 128fe: 55 push %ebp\r
+ 128ff: 89 e5 mov %esp,%ebp\r
+ 12901: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 12904: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12907: 0f b3 02 btr %eax,(%edx)\r
+ 1290a: 5d pop %ebp\r
+ 1290b: c3 ret \r
+\r
+0001290c <_usbfs_remove_bus>:\r
+ 1290c: 55 push %ebp\r
+ 1290d: 89 e5 mov %esp,%ebp\r
+ 1290f: 5d pop %ebp\r
+ 12910: c3 ret \r
+\r
+00012911 <_list_del>:\r
+ 12911: 55 push %ebp\r
+ 12912: 89 e5 mov %esp,%ebp\r
+ 12914: 83 ec 08 sub $0x8,%esp\r
+ 12917: 83 ec 08 sub $0x8,%esp\r
+ 1291a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1291d: ff 30 pushl (%eax)\r
+ 1291f: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12922: ff 70 04 pushl 0x4(%eax)\r
+ 12925: e8 18 00 00 00 call 12942 <___list_del>\r
+ 1292a: 83 c4 10 add $0x10,%esp\r
+ 1292d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12930: c7 00 00 00 00 00 movl $0x0,(%eax)\r
+ 12936: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12939: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax)\r
+ 12940: c9 leave \r
+ 12941: c3 ret \r
+\r
+00012942 <___list_del>:\r
+ 12942: 55 push %ebp\r
+ 12943: 89 e5 mov %esp,%ebp\r
+ 12945: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 12948: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1294b: 89 42 04 mov %eax,0x4(%edx)\r
+ 1294e: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 12951: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12954: 89 02 mov %eax,(%edx)\r
+ 12956: 5d pop %ebp\r
+ 12957: c3 ret \r
+\r
+00012958 <_usb_register_root_hub@8>:\r
+ 12958: 55 push %ebp\r
+ 12959: 89 e5 mov %esp,%ebp\r
+ 1295b: 83 ec 08 sub $0x8,%esp\r
+ 1295e: 83 ec 04 sub $0x4,%esp\r
+ 12961: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12964: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 1296a: ff 70 04 pushl 0x4(%eax)\r
+ 1296d: 68 b9 b0 01 00 push $0x1b0b9\r
+ 12972: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12975: 05 48 01 00 00 add $0x148,%eax\r
+ 1297a: 50 push %eax\r
+ 1297b: e8 10 71 00 00 call 19a90 <_sprintf>\r
+ 12980: 83 c4 10 add $0x10,%esp\r
+ 12983: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12986: c7 40 14 03 00 00 00 movl $0x3,0x14(%eax)\r
+ 1298d: 83 ec 08 sub $0x8,%esp\r
+ 12990: ff 75 0c pushl 0xc(%ebp)\r
+ 12993: ff 75 08 pushl 0x8(%ebp)\r
+ 12996: e8 f8 41 00 00 call 16b93 <_usb_new_device>\r
+ 1299b: 83 c4 10 add $0x10,%esp\r
+ 1299e: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 129a1: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 129a4: c9 leave \r
+ 129a5: c2 08 00 ret $0x8\r
+\r
+000129a8 <_usb_calc_bus_time@16>:\r
+ 129a8: 55 push %ebp\r
+ 129a9: 89 e5 mov %esp,%ebp\r
+ 129ab: 83 ec 14 sub $0x14,%esp\r
+ 129ae: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 129b1: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 129b4: 83 7d f0 02 cmpl $0x2,0xfffffff0(%ebp)\r
+ 129b8: 0f 84 21 01 00 00 je 12adf <_usb_calc_bus_time@16+0x137>\r
+ 129be: 83 7d f0 02 cmpl $0x2,0xfffffff0(%ebp)\r
+ 129c2: 7f 0b jg 129cf <_usb_calc_bus_time@16+0x27>\r
+ 129c4: 83 7d f0 01 cmpl $0x1,0xfffffff0(%ebp)\r
+ 129c8: 74 14 je 129de <_usb_calc_bus_time@16+0x36>\r
+ 129ca: e9 e4 02 00 00 jmp 12cb3 <_usb_calc_bus_time@16+0x30b>\r
+ 129cf: 83 7d f0 03 cmpl $0x3,0xfffffff0(%ebp)\r
+ 129d3: 0f 84 12 02 00 00 je 12beb <_usb_calc_bus_time@16+0x243>\r
+ 129d9: e9 d5 02 00 00 jmp 12cb3 <_usb_calc_bus_time@16+0x30b>\r
+ 129de: 83 7d 0c 00 cmpl $0x0,0xc(%ebp)\r
+ 129e2: 74 76 je 12a5a <_usb_calc_bus_time@16+0xb2>\r
+ 129e4: 8b 55 14 mov 0x14(%ebp),%edx\r
+ 129e7: 89 d0 mov %edx,%eax\r
+ 129e9: c1 e0 03 shl $0x3,%eax\r
+ 129ec: 29 d0 sub %edx,%eax\r
+ 129ee: c1 e0 03 shl $0x3,%eax\r
+ 129f1: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 129f4: b8 ab aa aa 2a mov $0x2aaaaaab,%eax\r
+ 129f9: f7 6d ec imull 0xffffffec(%ebp)\r
+ 129fc: 89 d1 mov %edx,%ecx\r
+ 129fe: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 12a01: c1 f8 1f sar $0x1f,%eax\r
+ 12a04: 89 ca mov %ecx,%edx\r
+ 12a06: 29 c2 sub %eax,%edx\r
+ 12a08: 89 d0 mov %edx,%eax\r
+ 12a0a: c1 e0 02 shl $0x2,%eax\r
+ 12a0d: 01 d0 add %edx,%eax\r
+ 12a0f: c1 e0 03 shl $0x3,%eax\r
+ 12a12: 01 d0 add %edx,%eax\r
+ 12a14: c1 e0 02 shl $0x2,%eax\r
+ 12a17: 01 d0 add %edx,%eax\r
+ 12a19: c1 e0 03 shl $0x3,%eax\r
+ 12a1c: 01 d0 add %edx,%eax\r
+ 12a1e: 01 c0 add %eax,%eax\r
+ 12a20: 01 d0 add %edx,%eax\r
+ 12a22: c1 e0 02 shl $0x2,%eax\r
+ 12a25: 01 d0 add %edx,%eax\r
+ 12a27: c1 e0 05 shl $0x5,%eax\r
+ 12a2a: 29 d0 sub %edx,%eax\r
+ 12a2c: 01 c0 add %eax,%eax\r
+ 12a2e: 8d 88 0d 02 20 00 lea 0x20020d(%eax),%ecx\r
+ 12a34: b8 d3 4d 62 10 mov $0x10624dd3,%eax\r
+ 12a39: f7 e9 imul %ecx\r
+ 12a3b: c1 fa 06 sar $0x6,%edx\r
+ 12a3e: 89 c8 mov %ecx,%eax\r
+ 12a40: c1 f8 1f sar $0x1f,%eax\r
+ 12a43: 29 c2 sub %eax,%edx\r
+ 12a45: 89 d0 mov %edx,%eax\r
+ 12a47: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 12a4a: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12a4d: 05 be 00 01 00 add $0x100be,%eax\r
+ 12a52: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 12a55: e9 60 02 00 00 jmp 12cba <_usb_calc_bus_time@16+0x312>\r
+ 12a5a: 8b 55 14 mov 0x14(%ebp),%edx\r
+ 12a5d: 89 d0 mov %edx,%eax\r
+ 12a5f: c1 e0 03 shl $0x3,%eax\r
+ 12a62: 29 d0 sub %edx,%eax\r
+ 12a64: c1 e0 03 shl $0x3,%eax\r
+ 12a67: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 12a6a: b8 ab aa aa 2a mov $0x2aaaaaab,%eax\r
+ 12a6f: f7 6d ec imull 0xffffffec(%ebp)\r
+ 12a72: 89 d1 mov %edx,%ecx\r
+ 12a74: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 12a77: c1 f8 1f sar $0x1f,%eax\r
+ 12a7a: 29 c1 sub %eax,%ecx\r
+ 12a7c: 89 c8 mov %ecx,%eax\r
+ 12a7e: c1 e0 03 shl $0x3,%eax\r
+ 12a81: 01 c8 add %ecx,%eax\r
+ 12a83: c1 e0 02 shl $0x2,%eax\r
+ 12a86: 01 c8 add %ecx,%eax\r
+ 12a88: 8d 14 c5 00 00 00 00 lea 0x0(,%eax,8),%edx\r
+ 12a8f: 01 d0 add %edx,%eax\r
+ 12a91: 01 c0 add %eax,%eax\r
+ 12a93: 01 c8 add %ecx,%eax\r
+ 12a95: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 12a9c: 01 d0 add %edx,%eax\r
+ 12a9e: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 12aa5: 01 d0 add %edx,%eax\r
+ 12aa7: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 12aae: 01 d0 add %edx,%eax\r
+ 12ab0: c1 e0 03 shl $0x3,%eax\r
+ 12ab3: 8d 88 f4 8c 1f 00 lea 0x1f8cf4(%eax),%ecx\r
+ 12ab9: b8 d3 4d 62 10 mov $0x10624dd3,%eax\r
+ 12abe: f7 e9 imul %ecx\r
+ 12ac0: c1 fa 06 sar $0x6,%edx\r
+ 12ac3: 89 c8 mov %ecx,%eax\r
+ 12ac5: c1 f8 1f sar $0x1f,%eax\r
+ 12ac8: 29 c2 sub %eax,%edx\r
+ 12aca: 89 d0 mov %edx,%eax\r
+ 12acc: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 12acf: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12ad2: 05 ed 00 01 00 add $0x100ed,%eax\r
+ 12ad7: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 12ada: e9 db 01 00 00 jmp 12cba <_usb_calc_bus_time@16+0x312>\r
+ 12adf: 83 7d 10 00 cmpl $0x0,0x10(%ebp)\r
+ 12ae3: 0f 84 8e 00 00 00 je 12b77 <_usb_calc_bus_time@16+0x1cf>\r
+ 12ae9: 8b 55 14 mov 0x14(%ebp),%edx\r
+ 12aec: 89 d0 mov %edx,%eax\r
+ 12aee: c1 e0 03 shl $0x3,%eax\r
+ 12af1: 29 d0 sub %edx,%eax\r
+ 12af3: c1 e0 03 shl $0x3,%eax\r
+ 12af6: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 12af9: b8 ab aa aa 2a mov $0x2aaaaaab,%eax\r
+ 12afe: f7 6d ec imull 0xffffffec(%ebp)\r
+ 12b01: 89 d1 mov %edx,%ecx\r
+ 12b03: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 12b06: c1 f8 1f sar $0x1f,%eax\r
+ 12b09: 29 c1 sub %eax,%ecx\r
+ 12b0b: 89 c8 mov %ecx,%eax\r
+ 12b0d: c1 e0 03 shl $0x3,%eax\r
+ 12b10: 01 c8 add %ecx,%eax\r
+ 12b12: 8d 14 c5 00 00 00 00 lea 0x0(,%eax,8),%edx\r
+ 12b19: 01 d0 add %edx,%eax\r
+ 12b1b: 01 c0 add %eax,%eax\r
+ 12b1d: 01 c8 add %ecx,%eax\r
+ 12b1f: c1 e0 03 shl $0x3,%eax\r
+ 12b22: 01 c8 add %ecx,%eax\r
+ 12b24: c1 e0 02 shl $0x2,%eax\r
+ 12b27: 01 c8 add %ecx,%eax\r
+ 12b29: c1 e0 02 shl $0x2,%eax\r
+ 12b2c: 01 c8 add %ecx,%eax\r
+ 12b2e: c1 e0 02 shl $0x2,%eax\r
+ 12b31: 8d 88 9e f3 03 00 lea 0x3f39e(%eax),%ecx\r
+ 12b37: b8 d3 4d 62 10 mov $0x10624dd3,%eax\r
+ 12b3c: f7 e9 imul %ecx\r
+ 12b3e: c1 fa 06 sar $0x6,%edx\r
+ 12b41: 89 c8 mov %ecx,%eax\r
+ 12b43: c1 f8 1f sar $0x1f,%eax\r
+ 12b46: 29 c2 sub %eax,%edx\r
+ 12b48: 89 d0 mov %edx,%eax\r
+ 12b4a: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 12b4d: 83 7d 0c 00 cmpl $0x0,0xc(%ebp)\r
+ 12b51: 74 0d je 12b60 <_usb_calc_bus_time@16+0x1b8>\r
+ 12b53: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12b56: 05 4c 20 00 00 add $0x204c,%eax\r
+ 12b5b: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 12b5e: eb 0c jmp 12b6c <_usb_calc_bus_time@16+0x1c4>\r
+ 12b60: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 12b63: 81 c2 61 1c 00 00 add $0x1c61,%edx\r
+ 12b69: 89 55 f4 mov %edx,0xfffffff4(%ebp)\r
+ 12b6c: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 12b6f: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 12b72: e9 43 01 00 00 jmp 12cba <_usb_calc_bus_time@16+0x312>\r
+ 12b77: 8b 55 14 mov 0x14(%ebp),%edx\r
+ 12b7a: 89 d0 mov %edx,%eax\r
+ 12b7c: c1 e0 03 shl $0x3,%eax\r
+ 12b7f: 29 d0 sub %edx,%eax\r
+ 12b81: c1 e0 03 shl $0x3,%eax\r
+ 12b84: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 12b87: b8 ab aa aa 2a mov $0x2aaaaaab,%eax\r
+ 12b8c: f7 6d ec imull 0xffffffec(%ebp)\r
+ 12b8f: 89 d1 mov %edx,%ecx\r
+ 12b91: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 12b94: c1 f8 1f sar $0x1f,%eax\r
+ 12b97: 29 c1 sub %eax,%ecx\r
+ 12b99: 89 c8 mov %ecx,%eax\r
+ 12b9b: c1 e0 03 shl $0x3,%eax\r
+ 12b9e: 01 c8 add %ecx,%eax\r
+ 12ba0: 8d 14 c5 00 00 00 00 lea 0x0(,%eax,8),%edx\r
+ 12ba7: 01 d0 add %edx,%eax\r
+ 12ba9: 01 c0 add %eax,%eax\r
+ 12bab: 01 c8 add %ecx,%eax\r
+ 12bad: c1 e0 03 shl $0x3,%eax\r
+ 12bb0: 01 c8 add %ecx,%eax\r
+ 12bb2: c1 e0 02 shl $0x2,%eax\r
+ 12bb5: 01 c8 add %ecx,%eax\r
+ 12bb7: c1 e0 02 shl $0x2,%eax\r
+ 12bba: 01 c8 add %ecx,%eax\r
+ 12bbc: c1 e0 02 shl $0x2,%eax\r
+ 12bbf: 8d 88 9e f3 03 00 lea 0x3f39e(%eax),%ecx\r
+ 12bc5: b8 d3 4d 62 10 mov $0x10624dd3,%eax\r
+ 12bca: f7 e9 imul %ecx\r
+ 12bcc: c1 fa 06 sar $0x6,%edx\r
+ 12bcf: 89 c8 mov %ecx,%eax\r
+ 12bd1: c1 f8 1f sar $0x1f,%eax\r
+ 12bd4: 29 c2 sub %eax,%edx\r
+ 12bd6: 89 d0 mov %edx,%eax\r
+ 12bd8: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 12bdb: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12bde: 05 7b 27 00 00 add $0x277b,%eax\r
+ 12be3: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 12be6: e9 cf 00 00 00 jmp 12cba <_usb_calc_bus_time@16+0x312>\r
+ 12beb: 83 7d 10 00 cmpl $0x0,0x10(%ebp)\r
+ 12bef: 74 5e je 12c4f <_usb_calc_bus_time@16+0x2a7>\r
+ 12bf1: 8b 55 14 mov 0x14(%ebp),%edx\r
+ 12bf4: 89 d0 mov %edx,%eax\r
+ 12bf6: c1 e0 03 shl $0x3,%eax\r
+ 12bf9: 29 d0 sub %edx,%eax\r
+ 12bfb: c1 e0 03 shl $0x3,%eax\r
+ 12bfe: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 12c01: b8 ab aa aa 2a mov $0x2aaaaaab,%eax\r
+ 12c06: f7 6d ec imull 0xffffffec(%ebp)\r
+ 12c09: 89 d1 mov %edx,%ecx\r
+ 12c0b: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 12c0e: c1 f8 1f sar $0x1f,%eax\r
+ 12c11: 89 ca mov %ecx,%edx\r
+ 12c13: 29 c2 sub %eax,%edx\r
+ 12c15: 89 d0 mov %edx,%eax\r
+ 12c17: c1 e0 06 shl $0x6,%eax\r
+ 12c1a: 01 d0 add %edx,%eax\r
+ 12c1c: c1 e0 03 shl $0x3,%eax\r
+ 12c1f: 01 d0 add %edx,%eax\r
+ 12c21: c1 e0 02 shl $0x2,%eax\r
+ 12c24: 29 d0 sub %edx,%eax\r
+ 12c26: 8d 90 fd a8 64 00 lea 0x64a8fd(%eax),%edx\r
+ 12c2c: b8 d3 4d 62 10 mov $0x10624dd3,%eax\r
+ 12c31: f7 e2 mul %edx\r
+ 12c33: 89 d0 mov %edx,%eax\r
+ 12c35: c1 e8 06 shr $0x6,%eax\r
+ 12c38: 8d 90 8d 05 00 00 lea 0x58d(%eax),%edx\r
+ 12c3e: b8 d3 4d 62 10 mov $0x10624dd3,%eax\r
+ 12c43: f7 e2 mul %edx\r
+ 12c45: 89 d0 mov %edx,%eax\r
+ 12c47: c1 e8 06 shr $0x6,%eax\r
+ 12c4a: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 12c4d: eb 5c jmp 12cab <_usb_calc_bus_time@16+0x303>\r
+ 12c4f: 8b 55 14 mov 0x14(%ebp),%edx\r
+ 12c52: 89 d0 mov %edx,%eax\r
+ 12c54: c1 e0 03 shl $0x3,%eax\r
+ 12c57: 29 d0 sub %edx,%eax\r
+ 12c59: c1 e0 03 shl $0x3,%eax\r
+ 12c5c: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 12c5f: b8 ab aa aa 2a mov $0x2aaaaaab,%eax\r
+ 12c64: f7 6d ec imull 0xffffffec(%ebp)\r
+ 12c67: 89 d1 mov %edx,%ecx\r
+ 12c69: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 12c6c: c1 f8 1f sar $0x1f,%eax\r
+ 12c6f: 89 ca mov %ecx,%edx\r
+ 12c71: 29 c2 sub %eax,%edx\r
+ 12c73: 89 d0 mov %edx,%eax\r
+ 12c75: c1 e0 06 shl $0x6,%eax\r
+ 12c78: 01 d0 add %edx,%eax\r
+ 12c7a: c1 e0 03 shl $0x3,%eax\r
+ 12c7d: 01 d0 add %edx,%eax\r
+ 12c7f: c1 e0 02 shl $0x2,%eax\r
+ 12c82: 29 d0 sub %edx,%eax\r
+ 12c84: 8d 90 fd a8 64 00 lea 0x64a8fd(%eax),%edx\r
+ 12c8a: b8 d3 4d 62 10 mov $0x10624dd3,%eax\r
+ 12c8f: f7 e2 mul %edx\r
+ 12c91: 89 d0 mov %edx,%eax\r
+ 12c93: c1 e8 06 shr $0x6,%eax\r
+ 12c96: 8d 90 72 04 00 00 lea 0x472(%eax),%edx\r
+ 12c9c: b8 d3 4d 62 10 mov $0x10624dd3,%eax\r
+ 12ca1: f7 e2 mul %edx\r
+ 12ca3: 89 d0 mov %edx,%eax\r
+ 12ca5: c1 e8 06 shr $0x6,%eax\r
+ 12ca8: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 12cab: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12cae: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 12cb1: eb 07 jmp 12cba <_usb_calc_bus_time@16+0x312>\r
+ 12cb3: c7 45 f8 ff ff ff ff movl $0xffffffff,0xfffffff8(%ebp)\r
+ 12cba: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12cbd: c9 leave \r
+ 12cbe: c2 10 00 ret $0x10\r
+\r
+00012cc1 <_usb_check_bandwidth@8>:\r
+ 12cc1: 55 push %ebp\r
+ 12cc2: 89 e5 mov %esp,%ebp\r
+ 12cc4: 83 ec 20 sub $0x20,%esp\r
+ 12cc7: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12cca: 8b 40 18 mov 0x18(%eax),%eax\r
+ 12ccd: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 12cd0: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12cd3: 25 80 00 00 00 and $0x80,%eax\r
+ 12cd8: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 12cdb: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12cde: c1 e8 1e shr $0x1e,%eax\r
+ 12ce1: 83 e0 03 and $0x3,%eax\r
+ 12ce4: 85 c0 test %eax,%eax\r
+ 12ce6: 0f 94 c0 sete %al\r
+ 12ce9: 25 ff 00 00 00 and $0xff,%eax\r
+ 12cee: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 12cf1: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12cf4: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 12cfa: 8b 40 34 mov 0x34(%eax),%eax\r
+ 12cfd: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 12d00: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 12d04: 75 15 jne 12d1b <_usb_check_bandwidth@8+0x5a>\r
+ 12d06: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 12d09: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12d0c: c1 e8 0f shr $0xf,%eax\r
+ 12d0f: 83 e0 0f and $0xf,%eax\r
+ 12d12: 8b 44 82 78 mov 0x78(%edx,%eax,4),%eax\r
+ 12d16: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 12d19: eb 13 jmp 12d2e <_usb_check_bandwidth@8+0x6d>\r
+ 12d1b: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 12d1e: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12d21: c1 e8 0f shr $0xf,%eax\r
+ 12d24: 83 e0 0f and $0xf,%eax\r
+ 12d27: 8b 44 82 38 mov 0x38(%edx,%eax,4),%eax\r
+ 12d2b: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 12d2e: ff 75 e4 pushl 0xffffffe4(%ebp)\r
+ 12d31: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 12d34: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 12d37: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12d3a: ff 70 18 pushl 0x18(%eax)\r
+ 12d3d: e8 66 fc ff ff call 129a8 <_usb_calc_bus_time@16>\r
+ 12d42: 8d 88 f4 01 00 00 lea 0x1f4(%eax),%ecx\r
+ 12d48: b8 d3 4d 62 10 mov $0x10624dd3,%eax\r
+ 12d4d: f7 e9 imul %ecx\r
+ 12d4f: c1 fa 06 sar $0x6,%edx\r
+ 12d52: 89 c8 mov %ecx,%eax\r
+ 12d54: c1 f8 1f sar $0x1f,%eax\r
+ 12d57: 29 c2 sub %eax,%edx\r
+ 12d59: 89 d0 mov %edx,%eax\r
+ 12d5b: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 12d5e: 83 7d f0 00 cmpl $0x0,0xfffffff0(%ebp)\r
+ 12d62: 74 13 je 12d77 <_usb_check_bandwidth@8+0xb6>\r
+ 12d64: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12d67: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 12d6a: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12d6d: 8b 4d e0 mov 0xffffffe0(%ebp),%ecx\r
+ 12d70: 99 cltd \r
+ 12d71: f7 79 44 idivl 0x44(%ecx)\r
+ 12d74: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 12d77: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12d7a: 03 45 ec add 0xffffffec(%ebp),%eax\r
+ 12d7d: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 12d80: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12d83: c9 leave \r
+ 12d84: c2 08 00 ret $0x8\r
+\r
+00012d87 <_usb_claim_bandwidth@16>:\r
+ 12d87: 55 push %ebp\r
+ 12d88: 89 e5 mov %esp,%ebp\r
+ 12d8a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12d8d: 8b 88 bc 00 00 00 mov 0xbc(%eax),%ecx\r
+ 12d93: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12d96: 8b 90 bc 00 00 00 mov 0xbc(%eax),%edx\r
+ 12d9c: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 12d9f: 03 42 34 add 0x34(%edx),%eax\r
+ 12da2: 89 41 34 mov %eax,0x34(%ecx)\r
+ 12da5: 83 7d 14 00 cmpl $0x0,0x14(%ebp)\r
+ 12da9: 74 0e je 12db9 <_usb_claim_bandwidth@16+0x32>\r
+ 12dab: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12dae: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 12db4: ff 40 3c incl 0x3c(%eax)\r
+ 12db7: eb 0c jmp 12dc5 <_usb_claim_bandwidth@16+0x3e>\r
+ 12db9: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12dbc: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 12dc2: ff 40 38 incl 0x38(%eax)\r
+ 12dc5: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 12dc8: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 12dcb: 89 42 34 mov %eax,0x34(%edx)\r
+ 12dce: 5d pop %ebp\r
+ 12dcf: c2 10 00 ret $0x10\r
+\r
+00012dd2 <_usb_release_bandwidth@12>:\r
+ 12dd2: 55 push %ebp\r
+ 12dd3: 89 e5 mov %esp,%ebp\r
+ 12dd5: 53 push %ebx\r
+ 12dd6: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12dd9: 8b 98 bc 00 00 00 mov 0xbc(%eax),%ebx\r
+ 12ddf: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12de2: 8b 88 bc 00 00 00 mov 0xbc(%eax),%ecx\r
+ 12de8: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12deb: 8b 50 34 mov 0x34(%eax),%edx\r
+ 12dee: 8b 41 34 mov 0x34(%ecx),%eax\r
+ 12df1: 29 d0 sub %edx,%eax\r
+ 12df3: 89 43 34 mov %eax,0x34(%ebx)\r
+ 12df6: 83 7d 10 00 cmpl $0x0,0x10(%ebp)\r
+ 12dfa: 74 0e je 12e0a <_usb_release_bandwidth@12+0x38>\r
+ 12dfc: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12dff: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 12e05: ff 48 3c decl 0x3c(%eax)\r
+ 12e08: eb 0c jmp 12e16 <_usb_release_bandwidth@12+0x44>\r
+ 12e0a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12e0d: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 12e13: ff 48 38 decl 0x38(%eax)\r
+ 12e16: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12e19: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)\r
+ 12e20: 5b pop %ebx\r
+ 12e21: 5d pop %ebp\r
+ 12e22: c2 0c 00 ret $0xc\r
+\r
+00012e25 <_hcd_alloc_dev>:\r
+ 12e25: 55 push %ebp\r
+ 12e26: 89 e5 mov %esp,%ebp\r
+ 12e28: 83 ec 18 sub $0x18,%esp\r
+ 12e2b: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 12e2f: 74 0e je 12e3f <_hcd_alloc_dev+0x1a>\r
+ 12e31: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12e34: 83 b8 98 01 00 00 00 cmpl $0x0,0x198(%eax)\r
+ 12e3b: 75 02 jne 12e3f <_hcd_alloc_dev+0x1a>\r
+ 12e3d: eb 0c jmp 12e4b <_hcd_alloc_dev+0x26>\r
+ 12e3f: c7 45 f0 ea ff ff ff movl $0xffffffea,0xfffffff0(%ebp)\r
+ 12e46: e9 e7 00 00 00 jmp 12f32 <_hcd_alloc_dev+0x10d>\r
+ 12e4b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12e4e: 83 b8 bc 00 00 00 00 cmpl $0x0,0xbc(%eax)\r
+ 12e55: 74 0f je 12e66 <_hcd_alloc_dev+0x41>\r
+ 12e57: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12e5a: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 12e60: 83 78 30 00 cmpl $0x0,0x30(%eax)\r
+ 12e64: 75 0c jne 12e72 <_hcd_alloc_dev+0x4d>\r
+ 12e66: c7 45 f0 ed ff ff ff movl $0xffffffed,0xfffffff0(%ebp)\r
+ 12e6d: e9 c0 00 00 00 jmp 12f32 <_hcd_alloc_dev+0x10d>\r
+ 12e72: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12e75: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 12e7b: 8b 40 30 mov 0x30(%eax),%eax\r
+ 12e7e: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 12e81: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12e84: 81 b8 e0 00 00 00 85 cmpl $0x85,0xe0(%eax)\r
+ 12e8b: 00 00 00 \r
+ 12e8e: 75 0c jne 12e9c <_hcd_alloc_dev+0x77>\r
+ 12e90: c7 45 f0 bd ff ff ff movl $0xffffffbd,0xfffffff0(%ebp)\r
+ 12e97: e9 96 00 00 00 jmp 12f32 <_hcd_alloc_dev+0x10d>\r
+ 12e9c: 83 ec 08 sub $0x8,%esp\r
+ 12e9f: 68 90 00 00 00 push $0x90\r
+ 12ea4: 6a 01 push $0x1\r
+ 12ea6: e8 85 6b 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 12eab: 83 c4 08 add $0x8,%esp\r
+ 12eae: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 12eb1: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 12eb5: 75 09 jne 12ec0 <_hcd_alloc_dev+0x9b>\r
+ 12eb7: c7 45 f0 f4 ff ff ff movl $0xfffffff4,0xfffffff0(%ebp)\r
+ 12ebe: eb 72 jmp 12f32 <_hcd_alloc_dev+0x10d>\r
+ 12ec0: 83 ec 04 sub $0x4,%esp\r
+ 12ec3: 68 90 00 00 00 push $0x90\r
+ 12ec8: 6a 00 push $0x0\r
+ 12eca: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 12ecd: e8 7e 6b 00 00 call 19a50 <_memset>\r
+ 12ed2: 83 c4 10 add $0x10,%esp\r
+ 12ed5: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 12ed8: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12edb: 89 02 mov %eax,(%edx)\r
+ 12edd: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 12ee0: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12ee3: 89 42 04 mov %eax,0x4(%edx)\r
+ 12ee6: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 12ee9: 83 c2 08 add $0x8,%edx\r
+ 12eec: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12eef: 83 c0 08 add $0x8,%eax\r
+ 12ef2: 89 02 mov %eax,(%edx)\r
+ 12ef4: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 12ef7: 83 c2 08 add $0x8,%edx\r
+ 12efa: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12efd: 83 c0 08 add $0x8,%eax\r
+ 12f00: 89 42 04 mov %eax,0x4(%edx)\r
+ 12f03: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 12f0a: 83 ec 08 sub $0x8,%esp\r
+ 12f0d: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12f10: 83 c0 68 add $0x68,%eax\r
+ 12f13: 50 push %eax\r
+ 12f14: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 12f17: e8 34 f8 ff ff call 12750 <_list_add>\r
+ 12f1c: 83 c4 10 add $0x10,%esp\r
+ 12f1f: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 12f22: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12f25: 89 82 98 01 00 00 mov %eax,0x198(%edx)\r
+ 12f2b: c7 45 f0 00 00 00 00 movl $0x0,0xfffffff0(%ebp)\r
+ 12f32: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 12f35: c9 leave \r
+ 12f36: c3 ret \r
+\r
+00012f37 <_urb_unlink>:\r
+ 12f37: 55 push %ebp\r
+ 12f38: 89 e5 mov %esp,%ebp\r
+ 12f3a: 83 ec 08 sub $0x8,%esp\r
+ 12f3d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12f40: 83 78 34 00 cmpl $0x0,0x34(%eax)\r
+ 12f44: 74 25 je 12f6b <_urb_unlink+0x34>\r
+ 12f46: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12f49: 8b 40 18 mov 0x18(%eax),%eax\r
+ 12f4c: c1 e8 1e shr $0x1e,%eax\r
+ 12f4f: 83 e0 03 and $0x3,%eax\r
+ 12f52: 85 c0 test %eax,%eax\r
+ 12f54: 0f 94 c0 sete %al\r
+ 12f57: 25 ff 00 00 00 and $0xff,%eax\r
+ 12f5c: 50 push %eax\r
+ 12f5d: ff 75 08 pushl 0x8(%ebp)\r
+ 12f60: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12f63: ff 70 14 pushl 0x14(%eax)\r
+ 12f66: e8 67 fe ff ff call 12dd2 <_usb_release_bandwidth@12>\r
+ 12f6b: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 12f72: 83 ec 0c sub $0xc,%esp\r
+ 12f75: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12f78: 83 c0 0c add $0xc,%eax\r
+ 12f7b: 50 push %eax\r
+ 12f7c: e8 1c 00 00 00 call 12f9d <_list_del_init>\r
+ 12f81: 83 c4 10 add $0x10,%esp\r
+ 12f84: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12f87: 8b 40 14 mov 0x14(%eax),%eax\r
+ 12f8a: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 12f8d: 83 ec 0c sub $0xc,%esp\r
+ 12f90: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 12f93: e8 23 34 00 00 call 163bb <_usb_put_dev@4>\r
+ 12f98: 83 c4 0c add $0xc,%esp\r
+ 12f9b: c9 leave \r
+ 12f9c: c3 ret \r
+\r
+00012f9d <_list_del_init>:\r
+ 12f9d: 55 push %ebp\r
+ 12f9e: 89 e5 mov %esp,%ebp\r
+ 12fa0: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12fa3: ff 30 pushl (%eax)\r
+ 12fa5: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12fa8: ff 70 04 pushl 0x4(%eax)\r
+ 12fab: e8 92 f9 ff ff call 12942 <___list_del>\r
+ 12fb0: 83 c4 08 add $0x8,%esp\r
+ 12fb3: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 12fb6: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12fb9: 89 02 mov %eax,(%edx)\r
+ 12fbb: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 12fbe: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12fc1: 89 42 04 mov %eax,0x4(%edx)\r
+ 12fc4: c9 leave \r
+ 12fc5: c3 ret \r
+\r
+00012fc6 <_hcd_submit_urb>:\r
+ 12fc6: 55 push %ebp\r
+ 12fc7: 89 e5 mov %esp,%ebp\r
+ 12fc9: 83 ec 18 sub $0x18,%esp\r
+ 12fcc: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12fcf: 8b 40 14 mov 0x14(%eax),%eax\r
+ 12fd2: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 12fd8: 8b 40 30 mov 0x30(%eax),%eax\r
+ 12fdb: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 12fde: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12fe1: 8b 40 14 mov 0x14(%eax),%eax\r
+ 12fe4: 8b 80 98 01 00 00 mov 0x198(%eax),%eax\r
+ 12fea: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 12fed: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 12ff1: 74 06 je 12ff9 <_hcd_submit_urb+0x33>\r
+ 12ff3: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 12ff7: 75 0c jne 13005 <_hcd_submit_urb+0x3f>\r
+ 12ff9: c7 45 ec ed ff ff ff movl $0xffffffed,0xffffffec(%ebp)\r
+ 13000: e9 77 01 00 00 jmp 1317c <_hcd_submit_urb+0x1b6>\r
+ 13005: c7 45 f0 00 00 00 00 movl $0x0,0xfffffff0(%ebp)\r
+ 1300c: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1300f: 8b 80 e0 00 00 00 mov 0xe0(%eax),%eax\r
+ 13015: 83 e0 01 and $0x1,%eax\r
+ 13018: 85 c0 test %eax,%eax\r
+ 1301a: 74 42 je 1305e <_hcd_submit_urb+0x98>\r
+ 1301c: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1301f: 81 b8 e0 00 00 00 85 cmpl $0x85,0xe0(%eax)\r
+ 13026: 00 00 00 \r
+ 13029: 74 33 je 1305e <_hcd_submit_urb+0x98>\r
+ 1302b: 83 ec 0c sub $0xc,%esp\r
+ 1302e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13031: ff 70 14 pushl 0x14(%eax)\r
+ 13034: e8 31 33 00 00 call 1636a <_usb_get_dev>\r
+ 13039: 83 c4 10 add $0x10,%esp\r
+ 1303c: 83 ec 08 sub $0x8,%esp\r
+ 1303f: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 13042: 83 c0 08 add $0x8,%eax\r
+ 13045: 50 push %eax\r
+ 13046: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13049: 83 c0 0c add $0xc,%eax\r
+ 1304c: 50 push %eax\r
+ 1304d: e8 2f 01 00 00 call 13181 <_list_add_tail>\r
+ 13052: 83 c4 10 add $0x10,%esp\r
+ 13055: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 1305c: eb 24 jmp 13082 <_hcd_submit_urb+0xbc>\r
+ 1305e: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 13061: 83 c2 0c add $0xc,%edx\r
+ 13064: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13067: 83 c0 0c add $0xc,%eax\r
+ 1306a: 89 02 mov %eax,(%edx)\r
+ 1306c: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 1306f: 83 c2 0c add $0xc,%edx\r
+ 13072: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13075: 83 c0 0c add $0xc,%eax\r
+ 13078: 89 42 04 mov %eax,0x4(%edx)\r
+ 1307b: c7 45 fc 94 ff ff ff movl $0xffffff94,0xfffffffc(%ebp)\r
+ 13082: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 13086: 74 0b je 13093 <_hcd_submit_urb+0xcd>\r
+ 13088: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1308b: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 1308e: e9 e9 00 00 00 jmp 1317c <_hcd_submit_urb+0x1b6>\r
+ 13093: 83 ec 0c sub $0xc,%esp\r
+ 13096: ff 75 08 pushl 0x8(%ebp)\r
+ 13099: e8 d2 50 00 00 call 18170 <_usb_get_urb@4>\r
+ 1309e: 83 c4 0c add $0xc,%esp\r
+ 130a1: 89 45 08 mov %eax,0x8(%ebp)\r
+ 130a4: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 130a7: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 130aa: 8b 40 14 mov 0x14(%eax),%eax\r
+ 130ad: 3b 42 24 cmp 0x24(%edx),%eax\r
+ 130b0: 75 25 jne 130d7 <_hcd_submit_urb+0x111>\r
+ 130b2: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 130b5: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 130b8: 8b 40 20 mov 0x20(%eax),%eax\r
+ 130bb: 83 c8 04 or $0x4,%eax\r
+ 130be: 89 42 20 mov %eax,0x20(%edx)\r
+ 130c1: 83 ec 08 sub $0x8,%esp\r
+ 130c4: ff 75 08 pushl 0x8(%ebp)\r
+ 130c7: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 130ca: e8 de f3 ff ff call 124ad <_rh_urb_enqueue>\r
+ 130cf: 83 c4 10 add $0x10,%esp\r
+ 130d2: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 130d5: eb 7d jmp 13154 <_hcd_submit_urb+0x18e>\r
+ 130d7: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 130da: 8b 40 20 mov 0x20(%eax),%eax\r
+ 130dd: c1 e8 02 shr $0x2,%eax\r
+ 130e0: 83 e0 01 and $0x1,%eax\r
+ 130e3: 85 c0 test %eax,%eax\r
+ 130e5: 75 50 jne 13137 <_hcd_submit_urb+0x171>\r
+ 130e7: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 130ea: 8b 80 80 00 00 00 mov 0x80(%eax),%eax\r
+ 130f0: 83 b8 84 00 00 00 00 cmpl $0x0,0x84(%eax)\r
+ 130f7: 74 3e je 13137 <_hcd_submit_urb+0x171>\r
+ 130f9: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 130fc: 8b 40 18 mov 0x18(%eax),%eax\r
+ 130ff: c1 e8 1e shr $0x1e,%eax\r
+ 13102: 83 e0 03 and $0x3,%eax\r
+ 13105: 83 f8 02 cmp $0x2,%eax\r
+ 13108: 75 12 jne 1311c <_hcd_submit_urb+0x156>\r
+ 1310a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1310d: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 13110: 8b 52 38 mov 0x38(%edx),%edx\r
+ 13113: 81 e2 ff ff ff 0f and $0xfffffff,%edx\r
+ 13119: 89 50 3c mov %edx,0x3c(%eax)\r
+ 1311c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1311f: 83 78 2c 00 cmpl $0x0,0x2c(%eax)\r
+ 13123: 74 12 je 13137 <_hcd_submit_urb+0x171>\r
+ 13125: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13128: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 1312b: 8b 52 24 mov 0x24(%edx),%edx\r
+ 1312e: 81 e2 ff ff ff 0f and $0xfffffff,%edx\r
+ 13134: 89 50 28 mov %edx,0x28(%eax)\r
+ 13137: 83 ec 04 sub $0x4,%esp\r
+ 1313a: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1313d: 8b 40 74 mov 0x74(%eax),%eax\r
+ 13140: ff 75 0c pushl 0xc(%ebp)\r
+ 13143: ff 75 08 pushl 0x8(%ebp)\r
+ 13146: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 13149: 8b 40 28 mov 0x28(%eax),%eax\r
+ 1314c: ff d0 call *%eax\r
+ 1314e: 83 c4 10 add $0x10,%esp\r
+ 13151: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 13154: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 13158: 74 1c je 13176 <_hcd_submit_urb+0x1b0>\r
+ 1315a: 83 ec 0c sub $0xc,%esp\r
+ 1315d: ff 75 08 pushl 0x8(%ebp)\r
+ 13160: e8 d1 4f 00 00 call 18136 <_usb_free_urb@4>\r
+ 13165: 83 c4 0c add $0xc,%esp\r
+ 13168: 83 ec 0c sub $0xc,%esp\r
+ 1316b: ff 75 08 pushl 0x8(%ebp)\r
+ 1316e: e8 c4 fd ff ff call 12f37 <_urb_unlink>\r
+ 13173: 83 c4 10 add $0x10,%esp\r
+ 13176: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13179: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 1317c: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 1317f: c9 leave \r
+ 13180: c3 ret \r
+\r
+00013181 <_list_add_tail>:\r
+ 13181: 55 push %ebp\r
+ 13182: 89 e5 mov %esp,%ebp\r
+ 13184: ff 75 0c pushl 0xc(%ebp)\r
+ 13187: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1318a: ff 70 04 pushl 0x4(%eax)\r
+ 1318d: ff 75 08 pushl 0x8(%ebp)\r
+ 13190: e8 d9 f5 ff ff call 1276e <___list_add>\r
+ 13195: 83 c4 0c add $0xc,%esp\r
+ 13198: c9 leave \r
+ 13199: c3 ret \r
+\r
+0001319a <_hcd_get_frame_number>:\r
+ 1319a: 55 push %ebp\r
+ 1319b: 89 e5 mov %esp,%ebp\r
+ 1319d: 83 ec 08 sub $0x8,%esp\r
+ 131a0: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 131a3: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 131a9: 8b 40 30 mov 0x30(%eax),%eax\r
+ 131ac: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 131af: 83 ec 0c sub $0xc,%esp\r
+ 131b2: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 131b5: 8b 40 74 mov 0x74(%eax),%eax\r
+ 131b8: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 131bb: 8b 40 1c mov 0x1c(%eax),%eax\r
+ 131be: ff d0 call *%eax\r
+ 131c0: 83 c4 10 add $0x10,%esp\r
+ 131c3: c9 leave \r
+ 131c4: c3 ret \r
+\r
+000131c5 <_unlink1>:\r
+ 131c5: 55 push %ebp\r
+ 131c6: 89 e5 mov %esp,%ebp\r
+ 131c8: 83 ec 08 sub $0x8,%esp\r
+ 131cb: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 131ce: 8b 40 58 mov 0x58(%eax),%eax\r
+ 131d1: 3b 45 0c cmp 0xc(%ebp),%eax\r
+ 131d4: 75 13 jne 131e9 <_unlink1+0x24>\r
+ 131d6: 83 ec 08 sub $0x8,%esp\r
+ 131d9: ff 75 0c pushl 0xc(%ebp)\r
+ 131dc: ff 75 08 pushl 0x8(%ebp)\r
+ 131df: e8 36 f3 ff ff call 1251a <_usb_rh_status_dequeue>\r
+ 131e4: 83 c4 10 add $0x10,%esp\r
+ 131e7: eb 1a jmp 13203 <_unlink1+0x3e>\r
+ 131e9: 83 ec 08 sub $0x8,%esp\r
+ 131ec: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 131ef: 8b 40 74 mov 0x74(%eax),%eax\r
+ 131f2: ff 75 0c pushl 0xc(%ebp)\r
+ 131f5: ff 75 08 pushl 0x8(%ebp)\r
+ 131f8: 8b 40 2c mov 0x2c(%eax),%eax\r
+ 131fb: ff d0 call *%eax\r
+ 131fd: 83 c4 10 add $0x10,%esp\r
+ 13200: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 13203: c9 leave \r
+ 13204: c3 ret \r
+\r
+00013205 <_unlink_complete>:\r
+ 13205: 55 push %ebp\r
+ 13206: 89 e5 mov %esp,%ebp\r
+ 13208: 83 ec 08 sub $0x8,%esp\r
+ 1320b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1320e: 8b 40 54 mov 0x54(%eax),%eax\r
+ 13211: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 13214: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 13217: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1321a: 8b 40 08 mov 0x8(%eax),%eax\r
+ 1321d: 89 42 58 mov %eax,0x58(%edx)\r
+ 13220: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 13223: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13226: 8b 40 0c mov 0xc(%eax),%eax\r
+ 13229: 89 42 54 mov %eax,0x54(%edx)\r
+ 1322c: 83 ec 08 sub $0x8,%esp\r
+ 1322f: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13232: ff 75 0c pushl 0xc(%ebp)\r
+ 13235: ff 75 08 pushl 0x8(%ebp)\r
+ 13238: 8b 40 58 mov 0x58(%eax),%eax\r
+ 1323b: ff d0 call *%eax\r
+ 1323d: 83 c4 10 add $0x10,%esp\r
+ 13240: 83 ec 0c sub $0xc,%esp\r
+ 13243: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13246: e8 05 00 00 00 call 13250 <_complete>\r
+ 1324b: 83 c4 10 add $0x10,%esp\r
+ 1324e: c9 leave \r
+ 1324f: c3 ret \r
+\r
+00013250 <_complete>:\r
+ 13250: 55 push %ebp\r
+ 13251: 89 e5 mov %esp,%ebp\r
+ 13253: 83 ec 08 sub $0x8,%esp\r
+ 13256: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13259: ff 00 incl (%eax)\r
+ 1325b: 83 ec 0c sub $0xc,%esp\r
+ 1325e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13261: 83 c0 04 add $0x4,%eax\r
+ 13264: 50 push %eax\r
+ 13265: e8 fb 65 00 00 call 19865 <_my_wake_up>\r
+ 1326a: 83 c4 10 add $0x10,%esp\r
+ 1326d: c9 leave \r
+ 1326e: c3 ret \r
+\r
+0001326f <_hcd_unlink_urb>:\r
+ 1326f: 55 push %ebp\r
+ 13270: 89 e5 mov %esp,%ebp\r
+ 13272: 83 ec 38 sub $0x38,%esp\r
+ 13275: c7 45 f0 00 00 00 00 movl $0x0,0xfffffff0(%ebp)\r
+ 1327c: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 13283: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 13287: 75 0c jne 13295 <_hcd_unlink_urb+0x26>\r
+ 13289: c7 45 d0 ea ff ff ff movl $0xffffffea,0xffffffd0(%ebp)\r
+ 13290: e9 ab 01 00 00 jmp 13440 <_hcd_unlink_urb+0x1d1>\r
+ 13295: c7 45 e8 00 00 00 00 movl $0x0,0xffffffe8(%ebp)\r
+ 1329c: c7 05 00 c0 01 00 01 movl $0x1,0x1c000\r
+ 132a3: 00 00 00 \r
+ 132a6: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 132a9: 83 78 14 00 cmpl $0x0,0x14(%eax)\r
+ 132ad: 74 0f je 132be <_hcd_unlink_urb+0x4f>\r
+ 132af: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 132b2: 8b 40 14 mov 0x14(%eax),%eax\r
+ 132b5: 83 b8 bc 00 00 00 00 cmpl $0x0,0xbc(%eax)\r
+ 132bc: 75 0c jne 132ca <_hcd_unlink_urb+0x5b>\r
+ 132be: c7 45 d4 ed ff ff ff movl $0xffffffed,0xffffffd4(%ebp)\r
+ 132c5: e9 64 01 00 00 jmp 1342e <_hcd_unlink_urb+0x1bf>\r
+ 132ca: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 132cd: 8b 40 14 mov 0x14(%eax),%eax\r
+ 132d0: 8b 80 98 01 00 00 mov 0x198(%eax),%eax\r
+ 132d6: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 132d9: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 132dc: 8b 40 14 mov 0x14(%eax),%eax\r
+ 132df: 05 c0 00 00 00 add $0xc0,%eax\r
+ 132e4: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 132e7: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 132ea: 8b 40 14 mov 0x14(%eax),%eax\r
+ 132ed: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 132f3: 8b 40 30 mov 0x30(%eax),%eax\r
+ 132f6: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 132f9: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 132fd: 74 06 je 13305 <_hcd_unlink_urb+0x96>\r
+ 132ff: 83 7d f0 00 cmpl $0x0,0xfffffff0(%ebp)\r
+ 13303: 75 0c jne 13311 <_hcd_unlink_urb+0xa2>\r
+ 13305: c7 45 d4 ed ff ff ff movl $0xffffffed,0xffffffd4(%ebp)\r
+ 1330c: e9 1d 01 00 00 jmp 1342e <_hcd_unlink_urb+0x1bf>\r
+ 13311: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13314: 83 78 08 00 cmpl $0x0,0x8(%eax)\r
+ 13318: 75 0c jne 13326 <_hcd_unlink_urb+0xb7>\r
+ 1331a: c7 45 d4 ea ff ff ff movl $0xffffffea,0xffffffd4(%ebp)\r
+ 13321: e9 08 01 00 00 jmp 1342e <_hcd_unlink_urb+0x1bf>\r
+ 13326: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13329: 83 78 1c 8d cmpl $0xffffff8d,0x1c(%eax)\r
+ 1332d: 74 0c je 1333b <_hcd_unlink_urb+0xcc>\r
+ 1332f: c7 45 d4 f0 ff ff ff movl $0xfffffff0,0xffffffd4(%ebp)\r
+ 13336: e9 f3 00 00 00 jmp 1342e <_hcd_unlink_urb+0x1bf>\r
+ 1333b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1333e: 8b 40 20 mov 0x20(%eax),%eax\r
+ 13341: c1 e8 03 shr $0x3,%eax\r
+ 13344: 83 e0 01 and $0x1,%eax\r
+ 13347: 85 c0 test %eax,%eax\r
+ 13349: 75 38 jne 13383 <_hcd_unlink_urb+0x114>\r
+ 1334b: c7 45 d8 00 00 00 00 movl $0x0,0xffffffd8(%ebp)\r
+ 13352: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13355: 8b 40 58 mov 0x58(%eax),%eax\r
+ 13358: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 1335b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1335e: 8b 40 54 mov 0x54(%eax),%eax\r
+ 13361: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 13364: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13367: c7 40 58 05 32 01 00 movl $0x13205,0x58(%eax)\r
+ 1336e: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 13371: 8d 45 d8 lea 0xffffffd8(%ebp),%eax\r
+ 13374: 89 42 54 mov %eax,0x54(%edx)\r
+ 13377: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1337a: c7 40 1c fe ff ff ff movl $0xfffffffe,0x1c(%eax)\r
+ 13381: eb 0a jmp 1338d <_hcd_unlink_urb+0x11e>\r
+ 13383: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13386: c7 40 1c 98 ff ff ff movl $0xffffff98,0x1c(%eax)\r
+ 1338d: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 13390: 8b 40 58 mov 0x58(%eax),%eax\r
+ 13393: 3b 45 08 cmp 0x8(%ebp),%eax\r
+ 13396: 75 1a jne 133b2 <_hcd_unlink_urb+0x143>\r
+ 13398: 83 ec 08 sub $0x8,%esp\r
+ 1339b: ff 75 08 pushl 0x8(%ebp)\r
+ 1339e: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 133a1: e8 74 f1 ff ff call 1251a <_usb_rh_status_dequeue>\r
+ 133a6: 83 c4 10 add $0x10,%esp\r
+ 133a9: c7 45 d4 00 00 00 00 movl $0x0,0xffffffd4(%ebp)\r
+ 133b0: eb 4b jmp 133fd <_hcd_unlink_urb+0x18e>\r
+ 133b2: 83 ec 08 sub $0x8,%esp\r
+ 133b5: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 133b8: 8b 40 74 mov 0x74(%eax),%eax\r
+ 133bb: ff 75 08 pushl 0x8(%ebp)\r
+ 133be: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 133c1: 8b 40 2c mov 0x2c(%eax),%eax\r
+ 133c4: ff d0 call *%eax\r
+ 133c6: 83 c4 10 add $0x10,%esp\r
+ 133c9: 89 45 d4 mov %eax,0xffffffd4(%ebp)\r
+ 133cc: 83 7d d4 00 cmpl $0x0,0xffffffd4(%ebp)\r
+ 133d0: 74 2b je 133fd <_hcd_unlink_urb+0x18e>\r
+ 133d2: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 133d5: 8b 40 20 mov 0x20(%eax),%eax\r
+ 133d8: c1 e8 03 shr $0x3,%eax\r
+ 133db: 83 e0 01 and $0x1,%eax\r
+ 133de: 85 c0 test %eax,%eax\r
+ 133e0: 75 4c jne 1342e <_hcd_unlink_urb+0x1bf>\r
+ 133e2: c7 45 e8 00 00 00 00 movl $0x0,0xffffffe8(%ebp)\r
+ 133e9: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 133ec: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 133ef: 89 42 58 mov %eax,0x58(%edx)\r
+ 133f2: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 133f5: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 133f8: 89 42 54 mov %eax,0x54(%edx)\r
+ 133fb: eb 31 jmp 1342e <_hcd_unlink_urb+0x1bf>\r
+ 133fd: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13400: 8b 40 20 mov 0x20(%eax),%eax\r
+ 13403: c1 e8 03 shr $0x3,%eax\r
+ 13406: 83 e0 01 and $0x1,%eax\r
+ 13409: 85 c0 test %eax,%eax\r
+ 1340b: 74 09 je 13416 <_hcd_unlink_urb+0x1a7>\r
+ 1340d: c7 45 d0 8d ff ff ff movl $0xffffff8d,0xffffffd0(%ebp)\r
+ 13414: eb 2a jmp 13440 <_hcd_unlink_urb+0x1d1>\r
+ 13416: 83 ec 0c sub $0xc,%esp\r
+ 13419: 8d 45 d8 lea 0xffffffd8(%ebp),%eax\r
+ 1341c: 50 push %eax\r
+ 1341d: e8 b6 64 00 00 call 198d8 <_my_wait_for_completion>\r
+ 13422: 83 c4 10 add $0x10,%esp\r
+ 13425: c7 45 d0 00 00 00 00 movl $0x0,0xffffffd0(%ebp)\r
+ 1342c: eb 12 jmp 13440 <_hcd_unlink_urb+0x1d1>\r
+ 1342e: 83 7d d4 00 cmpl $0x0,0xffffffd4(%ebp)\r
+ 13432: 74 06 je 1343a <_hcd_unlink_urb+0x1cb>\r
+ 13434: 83 7d ec 00 cmpl $0x0,0xffffffec(%ebp)\r
+ 13438: 74 00 je 1343a <_hcd_unlink_urb+0x1cb>\r
+ 1343a: 8b 45 d4 mov 0xffffffd4(%ebp),%eax\r
+ 1343d: 89 45 d0 mov %eax,0xffffffd0(%ebp)\r
+ 13440: 8b 45 d0 mov 0xffffffd0(%ebp),%eax\r
+ 13443: c9 leave \r
+ 13444: c3 ret \r
+\r
+00013445 <_hcd_endpoint_disable>:\r
+ 13445: 55 push %ebp\r
+ 13446: 89 e5 mov %esp,%ebp\r
+ 13448: 53 push %ebx\r
+ 13449: 83 ec 24 sub $0x24,%esp\r
+ 1344c: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1344f: 83 e0 0f and $0xf,%eax\r
+ 13452: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 13455: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13458: 8b 80 98 01 00 00 mov 0x198(%eax),%eax\r
+ 1345e: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 13461: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13464: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 1346a: 8b 40 30 mov 0x30(%eax),%eax\r
+ 1346d: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 13470: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 13473: c1 e8 07 shr $0x7,%eax\r
+ 13476: 83 e0 01 and $0x1,%eax\r
+ 13479: 85 c0 test %eax,%eax\r
+ 1347b: 74 26 je 134a3 <_hcd_endpoint_disable+0x5e>\r
+ 1347d: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 13480: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 13483: 8b 4d e8 mov 0xffffffe8(%ebp),%ecx\r
+ 13486: b8 01 00 00 00 mov $0x1,%eax\r
+ 1348b: d3 e0 shl %cl,%eax\r
+ 1348d: 0b 42 30 or 0x30(%edx),%eax\r
+ 13490: 89 43 30 mov %eax,0x30(%ebx)\r
+ 13493: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 13496: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 13499: c7 44 82 38 00 00 00 movl $0x0,0x38(%edx,%eax,4)\r
+ 134a0: 00 \r
+ 134a1: eb 24 jmp 134c7 <_hcd_endpoint_disable+0x82>\r
+ 134a3: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 134a6: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 134a9: 8b 4d e8 mov 0xffffffe8(%ebp),%ecx\r
+ 134ac: b8 01 00 00 00 mov $0x1,%eax\r
+ 134b1: d3 e0 shl %cl,%eax\r
+ 134b3: 0b 42 34 or 0x34(%edx),%eax\r
+ 134b6: 89 43 34 mov %eax,0x34(%ebx)\r
+ 134b9: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 134bc: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 134bf: c7 44 82 78 00 00 00 movl $0x0,0x78(%edx,%eax,4)\r
+ 134c6: 00 \r
+ 134c7: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 134ce: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 134d1: 83 c0 08 add $0x8,%eax\r
+ 134d4: 8b 00 mov (%eax),%eax\r
+ 134d6: 83 e8 0c sub $0xc,%eax\r
+ 134d9: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 134dc: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 134df: 83 c2 0c add $0xc,%edx\r
+ 134e2: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 134e5: 83 c0 08 add $0x8,%eax\r
+ 134e8: 39 c2 cmp %eax,%edx\r
+ 134ea: 0f 84 a8 00 00 00 je 13598 <_hcd_endpoint_disable+0x153>\r
+ 134f0: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 134f3: 8b 40 18 mov 0x18(%eax),%eax\r
+ 134f6: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 134f9: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 134fc: c1 f8 0f sar $0xf,%eax\r
+ 134ff: 83 e0 0f and $0xf,%eax\r
+ 13502: 3b 45 e8 cmp 0xffffffe8(%ebp),%eax\r
+ 13505: 74 02 je 13509 <_hcd_endpoint_disable+0xc4>\r
+ 13507: eb 7e jmp 13587 <_hcd_endpoint_disable+0x142>\r
+ 13509: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1350c: 33 45 e4 xor 0xffffffe4(%ebp),%eax\r
+ 1350f: c1 e8 07 shr $0x7,%eax\r
+ 13512: 83 e0 01 and $0x1,%eax\r
+ 13515: 85 c0 test %eax,%eax\r
+ 13517: 74 02 je 1351b <_hcd_endpoint_disable+0xd6>\r
+ 13519: eb 6c jmp 13587 <_hcd_endpoint_disable+0x142>\r
+ 1351b: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 1351e: 83 78 1c 8d cmpl $0xffffff8d,0x1c(%eax)\r
+ 13522: 74 02 je 13526 <_hcd_endpoint_disable+0xe1>\r
+ 13524: eb 61 jmp 13587 <_hcd_endpoint_disable+0x142>\r
+ 13526: 83 ec 0c sub $0xc,%esp\r
+ 13529: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 1352c: e8 3f 4c 00 00 call 18170 <_usb_get_urb@4>\r
+ 13531: 83 c4 0c add $0xc,%esp\r
+ 13534: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 1353b: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 1353e: 8b 40 1c mov 0x1c(%eax),%eax\r
+ 13541: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 13544: 83 7d e4 8d cmpl $0xffffff8d,0xffffffe4(%ebp)\r
+ 13548: 75 0a jne 13554 <_hcd_endpoint_disable+0x10f>\r
+ 1354a: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 1354d: c7 40 1c 94 ff ff ff movl $0xffffff94,0x1c(%eax)\r
+ 13554: 83 7d e4 8d cmpl $0xffffff8d,0xffffffe4(%ebp)\r
+ 13558: 75 1a jne 13574 <_hcd_endpoint_disable+0x12f>\r
+ 1355a: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 1355d: 8b 40 18 mov 0x18(%eax),%eax\r
+ 13560: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 13563: 83 ec 08 sub $0x8,%esp\r
+ 13566: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 13569: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 1356c: e8 54 fc ff ff call 131c5 <_unlink1>\r
+ 13571: 83 c4 10 add $0x10,%esp\r
+ 13574: 83 ec 0c sub $0xc,%esp\r
+ 13577: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 1357a: e8 b7 4b 00 00 call 18136 <_usb_free_urb@4>\r
+ 1357f: 83 c4 0c add $0xc,%esp\r
+ 13582: e9 e9 fe ff ff jmp 13470 <_hcd_endpoint_disable+0x2b>\r
+ 13587: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 1358a: 8b 40 0c mov 0xc(%eax),%eax\r
+ 1358d: 83 e8 0c sub $0xc,%eax\r
+ 13590: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 13593: e9 44 ff ff ff jmp 134dc <_hcd_endpoint_disable+0x97>\r
+ 13598: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 1359b: 8b 40 74 mov 0x74(%eax),%eax\r
+ 1359e: 83 78 30 00 cmpl $0x0,0x30(%eax)\r
+ 135a2: 74 1a je 135be <_hcd_endpoint_disable+0x179>\r
+ 135a4: 83 ec 04 sub $0x4,%esp\r
+ 135a7: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 135aa: 8b 40 74 mov 0x74(%eax),%eax\r
+ 135ad: ff 75 0c pushl 0xc(%ebp)\r
+ 135b0: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 135b3: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 135b6: 8b 40 30 mov 0x30(%eax),%eax\r
+ 135b9: ff d0 call *%eax\r
+ 135bb: 83 c4 10 add $0x10,%esp\r
+ 135be: 8b 5d fc mov 0xfffffffc(%ebp),%ebx\r
+ 135c1: c9 leave \r
+ 135c2: c3 ret \r
+\r
+000135c3 <_hcd_free_dev>:\r
+ 135c3: 55 push %ebp\r
+ 135c4: 89 e5 mov %esp,%ebp\r
+ 135c6: 83 ec 18 sub $0x18,%esp\r
+ 135c9: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 135cd: 74 0c je 135db <_hcd_free_dev+0x18>\r
+ 135cf: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 135d2: 83 b8 98 01 00 00 00 cmpl $0x0,0x198(%eax)\r
+ 135d9: 75 0c jne 135e7 <_hcd_free_dev+0x24>\r
+ 135db: c7 45 f0 ea ff ff ff movl $0xffffffea,0xfffffff0(%ebp)\r
+ 135e2: e9 95 00 00 00 jmp 1367c <_hcd_free_dev+0xb9>\r
+ 135e7: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 135ea: 83 b8 bc 00 00 00 00 cmpl $0x0,0xbc(%eax)\r
+ 135f1: 74 0f je 13602 <_hcd_free_dev+0x3f>\r
+ 135f3: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 135f6: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 135fc: 83 78 30 00 cmpl $0x0,0x30(%eax)\r
+ 13600: 75 09 jne 1360b <_hcd_free_dev+0x48>\r
+ 13602: c7 45 f0 ed ff ff ff movl $0xffffffed,0xfffffff0(%ebp)\r
+ 13609: eb 71 jmp 1367c <_hcd_free_dev+0xb9>\r
+ 1360b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1360e: 8b 80 98 01 00 00 mov 0x198(%eax),%eax\r
+ 13614: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 13617: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1361a: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 13620: 8b 40 30 mov 0x30(%eax),%eax\r
+ 13623: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 13626: 83 ec 0c sub $0xc,%esp\r
+ 13629: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1362c: 83 c0 08 add $0x8,%eax\r
+ 1362f: 50 push %eax\r
+ 13630: e8 4c 00 00 00 call 13681 <_list_empty>\r
+ 13635: 83 c4 10 add $0x10,%esp\r
+ 13638: 85 c0 test %eax,%eax\r
+ 1363a: 75 09 jne 13645 <_hcd_free_dev+0x82>\r
+ 1363c: c7 45 f0 ea ff ff ff movl $0xffffffea,0xfffffff0(%ebp)\r
+ 13643: eb 37 jmp 1367c <_hcd_free_dev+0xb9>\r
+ 13645: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 1364c: 83 ec 0c sub $0xc,%esp\r
+ 1364f: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13652: e8 ba f2 ff ff call 12911 <_list_del>\r
+ 13657: 83 c4 10 add $0x10,%esp\r
+ 1365a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1365d: c7 80 98 01 00 00 00 movl $0x0,0x198(%eax)\r
+ 13664: 00 00 00 \r
+ 13667: 83 ec 0c sub $0xc,%esp\r
+ 1366a: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 1366d: e8 ce 63 00 00 call 19a40 <_ExFreePool@4>\r
+ 13672: 83 c4 0c add $0xc,%esp\r
+ 13675: c7 45 f0 00 00 00 00 movl $0x0,0xfffffff0(%ebp)\r
+ 1367c: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 1367f: c9 leave \r
+ 13680: c3 ret \r
+\r
+00013681 <_list_empty>:\r
+ 13681: 55 push %ebp\r
+ 13682: 89 e5 mov %esp,%ebp\r
+ 13684: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13687: 8b 00 mov (%eax),%eax\r
+ 13689: 3b 45 08 cmp 0x8(%ebp),%eax\r
+ 1368c: 0f 94 c0 sete %al\r
+ 1368f: 25 ff 00 00 00 and $0xff,%eax\r
+ 13694: 5d pop %ebp\r
+ 13695: c3 ret \r
+\r
+00013696 <_usb_hcd_giveback_urb@12>:\r
+ 13696: 55 push %ebp\r
+ 13697: 89 e5 mov %esp,%ebp\r
+ 13699: 83 ec 08 sub $0x8,%esp\r
+ 1369c: 83 ec 0c sub $0xc,%esp\r
+ 1369f: ff 75 0c pushl 0xc(%ebp)\r
+ 136a2: e8 90 f8 ff ff call 12f37 <_urb_unlink>\r
+ 136a7: 83 c4 10 add $0x10,%esp\r
+ 136aa: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 136ad: 8b 40 20 mov 0x20(%eax),%eax\r
+ 136b0: c1 e8 02 shr $0x2,%eax\r
+ 136b3: 83 e0 01 and $0x1,%eax\r
+ 136b6: 85 c0 test %eax,%eax\r
+ 136b8: 75 00 jne 136ba <_usb_hcd_giveback_urb@12+0x24>\r
+ 136ba: 83 ec 08 sub $0x8,%esp\r
+ 136bd: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 136c0: ff 75 10 pushl 0x10(%ebp)\r
+ 136c3: ff 75 0c pushl 0xc(%ebp)\r
+ 136c6: 8b 40 58 mov 0x58(%eax),%eax\r
+ 136c9: ff d0 call *%eax\r
+ 136cb: 83 c4 10 add $0x10,%esp\r
+ 136ce: 83 ec 0c sub $0xc,%esp\r
+ 136d1: ff 75 0c pushl 0xc(%ebp)\r
+ 136d4: e8 5d 4a 00 00 call 18136 <_usb_free_urb@4>\r
+ 136d9: 83 c4 0c add $0xc,%esp\r
+ 136dc: c9 leave \r
+ 136dd: c2 0c 00 ret $0xc\r
+\r
+000136e0 <_usb_hcd_irq>:\r
+ 136e0: 55 push %ebp\r
+ 136e1: 89 e5 mov %esp,%ebp\r
+ 136e3: 83 ec 18 sub $0x18,%esp\r
+ 136e6: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 136e9: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 136ec: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 136ef: 8b 80 e0 00 00 00 mov 0xe0(%eax),%eax\r
+ 136f5: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 136f8: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 136fb: 83 b8 e0 00 00 00 00 cmpl $0x0,0xe0(%eax)\r
+ 13702: 75 09 jne 1370d <_usb_hcd_irq+0x2d>\r
+ 13704: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 1370b: eb 46 jmp 13753 <_usb_hcd_irq+0x73>\r
+ 1370d: 83 ec 08 sub $0x8,%esp\r
+ 13710: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13713: 8b 40 74 mov 0x74(%eax),%eax\r
+ 13716: ff 75 10 pushl 0x10(%ebp)\r
+ 13719: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 1371c: 8b 40 04 mov 0x4(%eax),%eax\r
+ 1371f: ff d0 call *%eax\r
+ 13721: 83 c4 10 add $0x10,%esp\r
+ 13724: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13727: 8b 80 e0 00 00 00 mov 0xe0(%eax),%eax\r
+ 1372d: 3b 45 f8 cmp 0xfffffff8(%ebp),%eax\r
+ 13730: 74 1a je 1374c <_usb_hcd_irq+0x6c>\r
+ 13732: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13735: 83 b8 e0 00 00 00 00 cmpl $0x0,0xe0(%eax)\r
+ 1373c: 75 0e jne 1374c <_usb_hcd_irq+0x6c>\r
+ 1373e: 83 ec 0c sub $0xc,%esp\r
+ 13741: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13744: e8 31 00 00 00 call 1377a <_usb_hc_died@4>\r
+ 13749: 83 c4 0c add $0xc,%esp\r
+ 1374c: c7 45 f4 01 00 00 00 movl $0x1,0xfffffff4(%ebp)\r
+ 13753: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 13756: c9 leave \r
+ 13757: c3 ret \r
+\r
+00013758 <_hcd_panic>:\r
+ 13758: 55 push %ebp\r
+ 13759: 89 e5 mov %esp,%ebp\r
+ 1375b: 83 ec 08 sub $0x8,%esp\r
+ 1375e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13761: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 13764: 83 ec 0c sub $0xc,%esp\r
+ 13767: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1376a: 8b 40 74 mov 0x74(%eax),%eax\r
+ 1376d: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13770: 8b 40 18 mov 0x18(%eax),%eax\r
+ 13773: ff d0 call *%eax\r
+ 13775: 83 c4 10 add $0x10,%esp\r
+ 13778: c9 leave \r
+ 13779: c3 ret \r
+\r
+0001377a <_usb_hc_died@4>:\r
+ 1377a: 55 push %ebp\r
+ 1377b: 89 e5 mov %esp,%ebp\r
+ 1377d: 83 ec 18 sub $0x18,%esp\r
+ 13780: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 13787: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1378a: 83 c0 68 add $0x68,%eax\r
+ 1378d: 8b 00 mov (%eax),%eax\r
+ 1378f: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 13792: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13795: 83 c0 68 add $0x68,%eax\r
+ 13798: 3b 45 fc cmp 0xfffffffc(%ebp),%eax\r
+ 1379b: 74 4c je 137e9 <_usb_hc_died@4+0x6f>\r
+ 1379d: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 137a0: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 137a3: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 137a6: 83 c0 08 add $0x8,%eax\r
+ 137a9: 8b 00 mov (%eax),%eax\r
+ 137ab: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 137ae: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 137b1: 83 c0 08 add $0x8,%eax\r
+ 137b4: 3b 45 f8 cmp 0xfffffff8(%ebp),%eax\r
+ 137b7: 74 26 je 137df <_usb_hc_died@4+0x65>\r
+ 137b9: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 137bc: 83 e8 0c sub $0xc,%eax\r
+ 137bf: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 137c2: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 137c5: 83 78 1c 8d cmpl $0xffffff8d,0x1c(%eax)\r
+ 137c9: 75 0a jne 137d5 <_usb_hc_died@4+0x5b>\r
+ 137cb: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 137ce: c7 40 1c 94 ff ff ff movl $0xffffff94,0x1c(%eax)\r
+ 137d5: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 137d8: 8b 00 mov (%eax),%eax\r
+ 137da: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 137dd: eb cf jmp 137ae <_usb_hc_died@4+0x34>\r
+ 137df: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 137e2: 8b 00 mov (%eax),%eax\r
+ 137e4: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 137e7: eb a9 jmp 13792 <_usb_hc_died@4+0x18>\r
+ 137e9: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 137ec: 8b 40 58 mov 0x58(%eax),%eax\r
+ 137ef: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 137f2: 83 7d f0 00 cmpl $0x0,0xfffffff0(%ebp)\r
+ 137f6: 74 0a je 13802 <_usb_hc_died@4+0x88>\r
+ 137f8: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 137fb: c7 40 1c 94 ff ff ff movl $0xffffff94,0x1c(%eax)\r
+ 13802: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13805: 83 c0 70 add $0x70,%eax\r
+ 13808: c7 00 58 37 01 00 movl $0x13758,(%eax)\r
+ 1380e: 83 ec 0c sub $0xc,%esp\r
+ 13811: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13814: 83 c0 70 add $0x70,%eax\r
+ 13817: 50 push %eax\r
+ 13818: e8 07 00 00 00 call 13824 <_schedule_work>\r
+ 1381d: 83 c4 10 add $0x10,%esp\r
+ 13820: c9 leave \r
+ 13821: c2 04 00 ret $0x4\r
+\r
+00013824 <_schedule_work>:\r
+ 13824: 55 push %ebp\r
+ 13825: 89 e5 mov %esp,%ebp\r
+ 13827: 5d pop %ebp\r
+ 13828: c3 ret \r
+ 13829: 90 nop \r
+ 1382a: 90 nop \r
+ 1382b: 90 nop \r
+ 1382c: 90 nop \r
+ 1382d: 90 nop \r
+ 1382e: 90 nop \r
+ 1382f: 90 nop \r
+\r
+00013830 <_usb_hcd_pci_probe@8>:\r
+ 13830: 55 push %ebp\r
+ 13831: 89 e5 mov %esp,%ebp\r
+ 13833: 83 ec 38 sub $0x38,%esp\r
+ 13836: e8 ea 3a 00 00 call 17325 <_usb_disabled@0>\r
+ 1383b: 85 c0 test %eax,%eax\r
+ 1383d: 74 0c je 1384b <_usb_hcd_pci_probe@8+0x1b>\r
+ 1383f: c7 45 d4 ed ff ff ff movl $0xffffffed,0xffffffd4(%ebp)\r
+ 13846: e9 16 04 00 00 jmp 13c61 <_usb_hcd_pci_probe@8+0x431>\r
+ 1384b: 83 7d 0c 00 cmpl $0x0,0xc(%ebp)\r
+ 1384f: 74 0d je 1385e <_usb_hcd_pci_probe@8+0x2e>\r
+ 13851: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 13854: 8b 40 18 mov 0x18(%eax),%eax\r
+ 13857: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 1385a: 85 c0 test %eax,%eax\r
+ 1385c: 75 0c jne 1386a <_usb_hcd_pci_probe@8+0x3a>\r
+ 1385e: c7 45 d4 ea ff ff ff movl $0xffffffea,0xffffffd4(%ebp)\r
+ 13865: e9 f7 03 00 00 jmp 13c61 <_usb_hcd_pci_probe@8+0x431>\r
+ 1386a: 83 ec 0c sub $0xc,%esp\r
+ 1386d: ff 75 08 pushl 0x8(%ebp)\r
+ 13870: e8 7b 04 00 00 call 13cf0 <_pci_enable_device>\r
+ 13875: 83 c4 10 add $0x10,%esp\r
+ 13878: 85 c0 test %eax,%eax\r
+ 1387a: 79 0c jns 13888 <_usb_hcd_pci_probe@8+0x58>\r
+ 1387c: c7 45 d4 ed ff ff ff movl $0xffffffed,0xffffffd4(%ebp)\r
+ 13883: e9 d9 03 00 00 jmp 13c61 <_usb_hcd_pci_probe@8+0x431>\r
+ 13888: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1388b: 83 78 0c 00 cmpl $0x0,0xc(%eax)\r
+ 1388f: 75 0c jne 1389d <_usb_hcd_pci_probe@8+0x6d>\r
+ 13891: c7 45 d4 ed ff ff ff movl $0xffffffed,0xffffffd4(%ebp)\r
+ 13898: e9 c4 03 00 00 jmp 13c61 <_usb_hcd_pci_probe@8+0x431>\r
+ 1389d: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 138a0: 8b 40 08 mov 0x8(%eax),%eax\r
+ 138a3: 83 e0 01 and $0x1,%eax\r
+ 138a6: 85 c0 test %eax,%eax\r
+ 138a8: 0f 84 ec 00 00 00 je 1399a <_usb_hcd_pci_probe@8+0x16a>\r
+ 138ae: c7 45 e4 00 00 00 00 movl $0x0,0xffffffe4(%ebp)\r
+ 138b5: 83 ec 08 sub $0x8,%esp\r
+ 138b8: 6a 00 push $0x0\r
+ 138ba: ff 75 08 pushl 0x8(%ebp)\r
+ 138bd: e8 1c 04 00 00 call 13cde <_pci_resource_start>\r
+ 138c2: 83 c4 10 add $0x10,%esp\r
+ 138c5: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 138c8: 83 ec 08 sub $0x8,%esp\r
+ 138cb: 6a 00 push $0x0\r
+ 138cd: ff 75 08 pushl 0x8(%ebp)\r
+ 138d0: e8 ff 03 00 00 call 13cd4 <_pci_resource_len>\r
+ 138d5: 83 c4 10 add $0x10,%esp\r
+ 138d8: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 138db: 83 ec 04 sub $0x4,%esp\r
+ 138de: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 138e1: ff 30 pushl (%eax)\r
+ 138e3: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 138e6: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 138e9: e8 dc 03 00 00 call 13cca <_request_mem_region>\r
+ 138ee: 83 c4 10 add $0x10,%esp\r
+ 138f1: 85 c0 test %eax,%eax\r
+ 138f3: 75 38 jne 1392d <_usb_hcd_pci_probe@8+0xfd>\r
+ 138f5: 83 ec 04 sub $0x4,%esp\r
+ 138f8: 6a 5c push $0x5c\r
+ 138fa: 68 c0 b0 01 00 push $0x1b0c0\r
+ 138ff: 68 ca b0 01 00 push $0x1b0ca\r
+ 13904: e8 57 61 00 00 call 19a60 <_DbgPrint>\r
+ 13909: 83 c4 10 add $0x10,%esp\r
+ 1390c: 83 ec 08 sub $0x8,%esp\r
+ 1390f: 68 c0 b0 01 00 push $0x1b0c0\r
+ 13914: 68 d4 b0 01 00 push $0x1b0d4\r
+ 13919: e8 42 61 00 00 call 19a60 <_DbgPrint>\r
+ 1391e: 83 c4 10 add $0x10,%esp\r
+ 13921: c7 45 d4 f0 ff ff ff movl $0xfffffff0,0xffffffd4(%ebp)\r
+ 13928: e9 34 03 00 00 jmp 13c61 <_usb_hcd_pci_probe@8+0x431>\r
+ 1392d: 83 ec 08 sub $0x8,%esp\r
+ 13930: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 13933: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 13936: e8 87 03 00 00 call 13cc2 <_ioremap_nocache>\r
+ 1393b: 83 c4 10 add $0x10,%esp\r
+ 1393e: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 13941: 83 7d f0 00 cmpl $0x0,0xfffffff0(%ebp)\r
+ 13945: 0f 85 13 01 00 00 jne 13a5e <_usb_hcd_pci_probe@8+0x22e>\r
+ 1394b: 83 ec 04 sub $0x4,%esp\r
+ 1394e: 6a 61 push $0x61\r
+ 13950: 68 c0 b0 01 00 push $0x1b0c0\r
+ 13955: 68 ca b0 01 00 push $0x1b0ca\r
+ 1395a: e8 01 61 00 00 call 19a60 <_DbgPrint>\r
+ 1395f: 83 c4 10 add $0x10,%esp\r
+ 13962: 83 ec 08 sub $0x8,%esp\r
+ 13965: 68 c0 b0 01 00 push $0x1b0c0\r
+ 1396a: 68 f8 b0 01 00 push $0x1b0f8\r
+ 1396f: e8 ec 60 00 00 call 19a60 <_DbgPrint>\r
+ 13974: 83 c4 10 add $0x10,%esp\r
+ 13977: c7 45 e8 f2 ff ff ff movl $0xfffffff2,0xffffffe8(%ebp)\r
+ 1397e: 83 ec 08 sub $0x8,%esp\r
+ 13981: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 13984: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 13987: e8 2c 03 00 00 call 13cb8 <_release_mem_region>\r
+ 1398c: 83 c4 10 add $0x10,%esp\r
+ 1398f: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 13992: 89 45 d4 mov %eax,0xffffffd4(%ebp)\r
+ 13995: e9 c7 02 00 00 jmp 13c61 <_usb_hcd_pci_probe@8+0x431>\r
+ 1399a: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 139a1: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 139a8: c7 45 e4 00 00 00 00 movl $0x0,0xffffffe4(%ebp)\r
+ 139af: 83 7d e4 00 cmpl $0x0,0xffffffe4(%ebp)\r
+ 139b3: 79 65 jns 13a1a <_usb_hcd_pci_probe@8+0x1ea>\r
+ 139b5: 83 ec 08 sub $0x8,%esp\r
+ 139b8: ff 75 e4 pushl 0xffffffe4(%ebp)\r
+ 139bb: ff 75 08 pushl 0x8(%ebp)\r
+ 139be: e8 e3 02 00 00 call 13ca6 <_pci_resource_flags>\r
+ 139c3: 83 c4 10 add $0x10,%esp\r
+ 139c6: 83 e0 01 and $0x1,%eax\r
+ 139c9: 85 c0 test %eax,%eax\r
+ 139cb: 75 02 jne 139cf <_usb_hcd_pci_probe@8+0x19f>\r
+ 139cd: eb 44 jmp 13a13 <_usb_hcd_pci_probe@8+0x1e3>\r
+ 139cf: 83 ec 08 sub $0x8,%esp\r
+ 139d2: ff 75 e4 pushl 0xffffffe4(%ebp)\r
+ 139d5: ff 75 08 pushl 0x8(%ebp)\r
+ 139d8: e8 01 03 00 00 call 13cde <_pci_resource_start>\r
+ 139dd: 83 c4 10 add $0x10,%esp\r
+ 139e0: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 139e3: 83 ec 08 sub $0x8,%esp\r
+ 139e6: ff 75 e4 pushl 0xffffffe4(%ebp)\r
+ 139e9: ff 75 08 pushl 0x8(%ebp)\r
+ 139ec: e8 e3 02 00 00 call 13cd4 <_pci_resource_len>\r
+ 139f1: 83 c4 10 add $0x10,%esp\r
+ 139f4: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 139f7: 83 ec 04 sub $0x4,%esp\r
+ 139fa: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 139fd: ff 30 pushl (%eax)\r
+ 139ff: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 13a02: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 13a05: e8 92 02 00 00 call 13c9c <_request_region>\r
+ 13a0a: 83 c4 10 add $0x10,%esp\r
+ 13a0d: 85 c0 test %eax,%eax\r
+ 13a0f: 74 02 je 13a13 <_usb_hcd_pci_probe@8+0x1e3>\r
+ 13a11: eb 07 jmp 13a1a <_usb_hcd_pci_probe@8+0x1ea>\r
+ 13a13: 8d 45 e4 lea 0xffffffe4(%ebp),%eax\r
+ 13a16: ff 00 incl (%eax)\r
+ 13a18: eb 95 jmp 139af <_usb_hcd_pci_probe@8+0x17f>\r
+ 13a1a: 83 7d e4 00 cmpl $0x0,0xffffffe4(%ebp)\r
+ 13a1e: 75 38 jne 13a58 <_usb_hcd_pci_probe@8+0x228>\r
+ 13a20: 83 ec 04 sub $0x4,%esp\r
+ 13a23: 6a 76 push $0x76\r
+ 13a25: 68 c0 b0 01 00 push $0x1b0c0\r
+ 13a2a: 68 ca b0 01 00 push $0x1b0ca\r
+ 13a2f: e8 2c 60 00 00 call 19a60 <_DbgPrint>\r
+ 13a34: 83 c4 10 add $0x10,%esp\r
+ 13a37: 83 ec 08 sub $0x8,%esp\r
+ 13a3a: 68 c0 b0 01 00 push $0x1b0c0\r
+ 13a3f: 68 18 b1 01 00 push $0x1b118\r
+ 13a44: e8 17 60 00 00 call 19a60 <_DbgPrint>\r
+ 13a49: 83 c4 10 add $0x10,%esp\r
+ 13a4c: c7 45 d4 f0 ff ff ff movl $0xfffffff0,0xffffffd4(%ebp)\r
+ 13a53: e9 09 02 00 00 jmp 13c61 <_usb_hcd_pci_probe@8+0x431>\r
+ 13a58: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 13a5b: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 13a5e: 83 ec 0c sub $0xc,%esp\r
+ 13a61: ff 75 08 pushl 0x8(%ebp)\r
+ 13a64: e8 29 02 00 00 call 13c92 <_pci_set_master>\r
+ 13a69: 83 c4 10 add $0x10,%esp\r
+ 13a6c: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13a6f: 8b 40 20 mov 0x20(%eax),%eax\r
+ 13a72: ff d0 call *%eax\r
+ 13a74: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 13a77: 83 7d ec 00 cmpl $0x0,0xffffffec(%ebp)\r
+ 13a7b: 75 72 jne 13aef <_usb_hcd_pci_probe@8+0x2bf>\r
+ 13a7d: 83 ec 04 sub $0x4,%esp\r
+ 13a80: 68 83 00 00 00 push $0x83\r
+ 13a85: 68 c0 b0 01 00 push $0x1b0c0\r
+ 13a8a: 68 ca b0 01 00 push $0x1b0ca\r
+ 13a8f: e8 cc 5f 00 00 call 19a60 <_DbgPrint>\r
+ 13a94: 83 c4 10 add $0x10,%esp\r
+ 13a97: 83 ec 08 sub $0x8,%esp\r
+ 13a9a: 68 c0 b0 01 00 push $0x1b0c0\r
+ 13a9f: 68 3b b1 01 00 push $0x1b13b\r
+ 13aa4: e8 b7 5f 00 00 call 19a60 <_DbgPrint>\r
+ 13aa9: 83 c4 10 add $0x10,%esp\r
+ 13aac: c7 45 e8 f4 ff ff ff movl $0xfffffff4,0xffffffe8(%ebp)\r
+ 13ab3: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13ab6: 8b 40 08 mov 0x8(%eax),%eax\r
+ 13ab9: 83 e0 01 and $0x1,%eax\r
+ 13abc: 85 c0 test %eax,%eax\r
+ 13abe: 74 13 je 13ad3 <_usb_hcd_pci_probe@8+0x2a3>\r
+ 13ac0: 83 ec 0c sub $0xc,%esp\r
+ 13ac3: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 13ac6: e8 bd 01 00 00 call 13c88 <_iounmap>\r
+ 13acb: 83 c4 10 add $0x10,%esp\r
+ 13ace: e9 ab fe ff ff jmp 1397e <_usb_hcd_pci_probe@8+0x14e>\r
+ 13ad3: 83 ec 08 sub $0x8,%esp\r
+ 13ad6: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 13ad9: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 13adc: e8 9d 01 00 00 call 13c7e <_release_region>\r
+ 13ae1: 83 c4 10 add $0x10,%esp\r
+ 13ae4: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 13ae7: 89 45 d4 mov %eax,0xffffffd4(%ebp)\r
+ 13aea: e9 72 01 00 00 jmp 13c61 <_usb_hcd_pci_probe@8+0x431>\r
+ 13aef: 83 ec 08 sub $0x8,%esp\r
+ 13af2: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 13af5: ff 75 08 pushl 0x8(%ebp)\r
+ 13af8: e8 6b 01 00 00 call 13c68 <_pci_set_drvdata>\r
+ 13afd: 83 c4 10 add $0x10,%esp\r
+ 13b00: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 13b03: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13b06: 89 42 74 mov %eax,0x74(%edx)\r
+ 13b09: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 13b0c: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13b0f: 8b 00 mov (%eax),%eax\r
+ 13b11: 89 42 50 mov %eax,0x50(%edx)\r
+ 13b14: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 13b17: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13b1a: 89 82 84 00 00 00 mov %eax,0x84(%edx)\r
+ 13b20: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 13b23: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13b26: 8b 40 10 mov 0x10(%eax),%eax\r
+ 13b29: 89 42 08 mov %eax,0x8(%edx)\r
+ 13b2c: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 13b2f: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13b32: 83 c0 14 add $0x14,%eax\r
+ 13b35: 89 42 4c mov %eax,0x4c(%edx)\r
+ 13b38: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 13b3b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13b3e: 83 c0 14 add $0x14,%eax\r
+ 13b41: 89 02 mov %eax,(%edx)\r
+ 13b43: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 13b46: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 13b49: 8b 00 mov (%eax),%eax\r
+ 13b4b: 89 82 80 00 00 00 mov %eax,0x80(%edx)\r
+ 13b51: 83 ec 0c sub $0xc,%esp\r
+ 13b54: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 13b57: e8 c4 49 00 00 call 18520 <_hcd_buffer_create>\r
+ 13b5c: 83 c4 10 add $0x10,%esp\r
+ 13b5f: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 13b62: 83 7d e8 00 cmpl $0x0,0xffffffe8(%ebp)\r
+ 13b66: 74 16 je 13b7e <_usb_hcd_pci_probe@8+0x34e>\r
+ 13b68: 83 ec 0c sub $0xc,%esp\r
+ 13b6b: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13b6e: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 13b71: 8b 40 24 mov 0x24(%eax),%eax\r
+ 13b74: ff d0 call *%eax\r
+ 13b76: 83 c4 10 add $0x10,%esp\r
+ 13b79: e9 35 ff ff ff jmp 13ab3 <_usb_hcd_pci_probe@8+0x283>\r
+ 13b7e: 83 ec 04 sub $0x4,%esp\r
+ 13b81: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13b84: ff 70 0c pushl 0xc(%eax)\r
+ 13b87: 68 54 b1 01 00 push $0x1b154\r
+ 13b8c: 8d 45 d8 lea 0xffffffd8(%ebp),%eax\r
+ 13b8f: 50 push %eax\r
+ 13b90: e8 fb 5e 00 00 call 19a90 <_sprintf>\r
+ 13b95: 83 c4 10 add $0x10,%esp\r
+ 13b98: 83 ec 0c sub $0xc,%esp\r
+ 13b9b: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 13b9e: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 13ba1: ff 70 50 pushl 0x50(%eax)\r
+ 13ba4: 6a 00 push $0x0\r
+ 13ba6: 68 e0 36 01 00 push $0x136e0\r
+ 13bab: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13bae: ff 70 0c pushl 0xc(%eax)\r
+ 13bb1: e8 e0 5d 00 00 call 19996 <_my_request_irq>\r
+ 13bb6: 83 c4 20 add $0x20,%esp\r
+ 13bb9: 85 c0 test %eax,%eax\r
+ 13bbb: 74 09 je 13bc6 <_usb_hcd_pci_probe@8+0x396>\r
+ 13bbd: c7 45 e8 f0 ff ff ff movl $0xfffffff0,0xffffffe8(%ebp)\r
+ 13bc4: eb a2 jmp 13b68 <_usb_hcd_pci_probe@8+0x338>\r
+ 13bc6: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 13bc9: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13bcc: 8b 40 0c mov 0xc(%eax),%eax\r
+ 13bcf: 89 42 78 mov %eax,0x78(%edx)\r
+ 13bd2: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 13bd5: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 13bd8: 89 42 7c mov %eax,0x7c(%edx)\r
+ 13bdb: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 13bde: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 13be1: 89 82 88 00 00 00 mov %eax,0x88(%edx)\r
+ 13be7: 83 ec 0c sub $0xc,%esp\r
+ 13bea: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 13bed: e8 ec e9 ff ff call 125de <_usb_bus_init@4>\r
+ 13bf2: 83 c4 0c add $0xc,%esp\r
+ 13bf5: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 13bf8: c7 40 20 20 a0 01 00 movl $0x1a020,0x20(%eax)\r
+ 13bff: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 13c02: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 13c05: 89 42 30 mov %eax,0x30(%edx)\r
+ 13c08: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 13c0b: 83 c2 68 add $0x68,%edx\r
+ 13c0e: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 13c11: 83 c0 68 add $0x68,%eax\r
+ 13c14: 89 02 mov %eax,(%edx)\r
+ 13c16: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 13c19: 83 c2 68 add $0x68,%edx\r
+ 13c1c: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 13c1f: 83 c0 68 add $0x68,%eax\r
+ 13c22: 89 42 04 mov %eax,0x4(%edx)\r
+ 13c25: 83 ec 0c sub $0xc,%esp\r
+ 13c28: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 13c2b: e8 a8 ea ff ff call 126d8 <_usb_register_bus@4>\r
+ 13c30: 83 c4 0c add $0xc,%esp\r
+ 13c33: 83 ec 0c sub $0xc,%esp\r
+ 13c36: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13c39: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 13c3c: 8b 40 0c mov 0xc(%eax),%eax\r
+ 13c3f: ff d0 call *%eax\r
+ 13c41: 83 c4 10 add $0x10,%esp\r
+ 13c44: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 13c47: 83 7d e8 00 cmpl $0x0,0xffffffe8(%ebp)\r
+ 13c4b: 79 0e jns 13c5b <_usb_hcd_pci_probe@8+0x42b>\r
+ 13c4d: 83 ec 0c sub $0xc,%esp\r
+ 13c50: ff 75 08 pushl 0x8(%ebp)\r
+ 13c53: e8 a2 00 00 00 call 13cfa <_usb_hcd_pci_remove@4>\r
+ 13c58: 83 c4 0c add $0xc,%esp\r
+ 13c5b: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 13c5e: 89 45 d4 mov %eax,0xffffffd4(%ebp)\r
+ 13c61: 8b 45 d4 mov 0xffffffd4(%ebp),%eax\r
+ 13c64: c9 leave \r
+ 13c65: c2 08 00 ret $0x8\r
+\r
+00013c68 <_pci_set_drvdata>:\r
+ 13c68: 55 push %ebp\r
+ 13c69: 89 e5 mov %esp,%ebp\r
+ 13c6b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13c6e: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 13c71: 89 90 e4 00 00 00 mov %edx,0xe4(%eax)\r
+ 13c77: b8 00 00 00 00 mov $0x0,%eax\r
+ 13c7c: 5d pop %ebp\r
+ 13c7d: c3 ret \r
+\r
+00013c7e <_release_region>:\r
+ 13c7e: 55 push %ebp\r
+ 13c7f: 89 e5 mov %esp,%ebp\r
+ 13c81: b8 00 00 00 00 mov $0x0,%eax\r
+ 13c86: 5d pop %ebp\r
+ 13c87: c3 ret \r
+\r
+00013c88 <_iounmap>:\r
+ 13c88: 55 push %ebp\r
+ 13c89: 89 e5 mov %esp,%ebp\r
+ 13c8b: b8 00 00 00 00 mov $0x0,%eax\r
+ 13c90: 5d pop %ebp\r
+ 13c91: c3 ret \r
+\r
+00013c92 <_pci_set_master>:\r
+ 13c92: 55 push %ebp\r
+ 13c93: 89 e5 mov %esp,%ebp\r
+ 13c95: b8 00 00 00 00 mov $0x0,%eax\r
+ 13c9a: 5d pop %ebp\r
+ 13c9b: c3 ret \r
+\r
+00013c9c <_request_region>:\r
+ 13c9c: 55 push %ebp\r
+ 13c9d: 89 e5 mov %esp,%ebp\r
+ 13c9f: b8 00 00 00 00 mov $0x0,%eax\r
+ 13ca4: 5d pop %ebp\r
+ 13ca5: c3 ret \r
+\r
+00013ca6 <_pci_resource_flags>:\r
+ 13ca6: 55 push %ebp\r
+ 13ca7: 89 e5 mov %esp,%ebp\r
+ 13ca9: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 13cac: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 13caf: 8b 84 82 d4 00 00 00 mov 0xd4(%edx,%eax,4),%eax\r
+ 13cb6: 5d pop %ebp\r
+ 13cb7: c3 ret \r
+\r
+00013cb8 <_release_mem_region>:\r
+ 13cb8: 55 push %ebp\r
+ 13cb9: 89 e5 mov %esp,%ebp\r
+ 13cbb: b8 00 00 00 00 mov $0x0,%eax\r
+ 13cc0: 5d pop %ebp\r
+ 13cc1: c3 ret \r
+\r
+00013cc2 <_ioremap_nocache>:\r
+ 13cc2: 55 push %ebp\r
+ 13cc3: 89 e5 mov %esp,%ebp\r
+ 13cc5: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13cc8: 5d pop %ebp\r
+ 13cc9: c3 ret \r
+\r
+00013cca <_request_mem_region>:\r
+ 13cca: 55 push %ebp\r
+ 13ccb: 89 e5 mov %esp,%ebp\r
+ 13ccd: b8 01 00 00 00 mov $0x1,%eax\r
+ 13cd2: 5d pop %ebp\r
+ 13cd3: c3 ret \r
+\r
+00013cd4 <_pci_resource_len>:\r
+ 13cd4: 55 push %ebp\r
+ 13cd5: 89 e5 mov %esp,%ebp\r
+ 13cd7: b8 00 00 00 00 mov $0x0,%eax\r
+ 13cdc: 5d pop %ebp\r
+ 13cdd: c3 ret \r
+\r
+00013cde <_pci_resource_start>:\r
+ 13cde: 55 push %ebp\r
+ 13cdf: 89 e5 mov %esp,%ebp\r
+ 13ce1: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 13ce4: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 13ce7: 8b 84 82 c4 00 00 00 mov 0xc4(%edx,%eax,4),%eax\r
+ 13cee: 5d pop %ebp\r
+ 13cef: c3 ret \r
+\r
+00013cf0 <_pci_enable_device>:\r
+ 13cf0: 55 push %ebp\r
+ 13cf1: 89 e5 mov %esp,%ebp\r
+ 13cf3: b8 00 00 00 00 mov $0x0,%eax\r
+ 13cf8: 5d pop %ebp\r
+ 13cf9: c3 ret \r
+\r
+00013cfa <_usb_hcd_pci_remove@4>:\r
+ 13cfa: 55 push %ebp\r
+ 13cfb: 89 e5 mov %esp,%ebp\r
+ 13cfd: 83 ec 08 sub $0x8,%esp\r
+ 13d00: 83 ec 0c sub $0xc,%esp\r
+ 13d03: ff 75 08 pushl 0x8(%ebp)\r
+ 13d06: e8 22 01 00 00 call 13e2d <_pci_get_drvdata>\r
+ 13d0b: 83 c4 10 add $0x10,%esp\r
+ 13d0e: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 13d11: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 13d15: 75 05 jne 13d1c <_usb_hcd_pci_remove@4+0x22>\r
+ 13d17: e9 0d 01 00 00 jmp 13e29 <_usb_hcd_pci_remove@4+0x12f>\r
+ 13d1c: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13d1f: 8b 40 24 mov 0x24(%eax),%eax\r
+ 13d22: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 13d25: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13d28: c7 80 e0 00 00 00 85 movl $0x85,0xe0(%eax)\r
+ 13d2f: 00 00 00 \r
+ 13d32: 83 ec 0c sub $0xc,%esp\r
+ 13d35: 8d 45 f8 lea 0xfffffff8(%ebp),%eax\r
+ 13d38: 50 push %eax\r
+ 13d39: e8 d3 28 00 00 call 16611 <_usb_disconnect>\r
+ 13d3e: 83 c4 10 add $0x10,%esp\r
+ 13d41: 83 ec 0c sub $0xc,%esp\r
+ 13d44: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13d47: 8b 40 74 mov 0x74(%eax),%eax\r
+ 13d4a: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13d4d: 8b 40 18 mov 0x18(%eax),%eax\r
+ 13d50: ff d0 call *%eax\r
+ 13d52: 83 c4 10 add $0x10,%esp\r
+ 13d55: 83 ec 0c sub $0xc,%esp\r
+ 13d58: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13d5b: e8 ca 47 00 00 call 1852a <_hcd_buffer_destroy>\r
+ 13d60: 83 c4 10 add $0x10,%esp\r
+ 13d63: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13d66: c7 80 e0 00 00 00 00 movl $0x0,0xe0(%eax)\r
+ 13d6d: 00 00 00 \r
+ 13d70: 6a 00 push $0x0\r
+ 13d72: ff 75 08 pushl 0x8(%ebp)\r
+ 13d75: e8 ee fe ff ff call 13c68 <_pci_set_drvdata>\r
+ 13d7a: 83 c4 08 add $0x8,%esp\r
+ 13d7d: 83 ec 08 sub $0x8,%esp\r
+ 13d80: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13d83: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13d86: ff 70 78 pushl 0x78(%eax)\r
+ 13d89: e8 86 5c 00 00 call 19a14 <_my_free_irq>\r
+ 13d8e: 83 c4 10 add $0x10,%esp\r
+ 13d91: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13d94: 8b 40 74 mov 0x74(%eax),%eax\r
+ 13d97: 8b 40 08 mov 0x8(%eax),%eax\r
+ 13d9a: 83 e0 01 and $0x1,%eax\r
+ 13d9d: 85 c0 test %eax,%eax\r
+ 13d9f: 74 34 je 13dd5 <_usb_hcd_pci_remove@4+0xdb>\r
+ 13da1: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13da4: ff 70 7c pushl 0x7c(%eax)\r
+ 13da7: e8 dc fe ff ff call 13c88 <_iounmap>\r
+ 13dac: 83 c4 04 add $0x4,%esp\r
+ 13daf: 6a 00 push $0x0\r
+ 13db1: ff 75 08 pushl 0x8(%ebp)\r
+ 13db4: e8 1b ff ff ff call 13cd4 <_pci_resource_len>\r
+ 13db9: 83 c4 08 add $0x8,%esp\r
+ 13dbc: 50 push %eax\r
+ 13dbd: 6a 00 push $0x0\r
+ 13dbf: ff 75 08 pushl 0x8(%ebp)\r
+ 13dc2: e8 17 ff ff ff call 13cde <_pci_resource_start>\r
+ 13dc7: 83 c4 08 add $0x8,%esp\r
+ 13dca: 50 push %eax\r
+ 13dcb: e8 e8 fe ff ff call 13cb8 <_release_mem_region>\r
+ 13dd0: 83 c4 08 add $0x8,%esp\r
+ 13dd3: eb 32 jmp 13e07 <_usb_hcd_pci_remove@4+0x10d>\r
+ 13dd5: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13dd8: ff b0 88 00 00 00 pushl 0x88(%eax)\r
+ 13dde: ff 75 08 pushl 0x8(%ebp)\r
+ 13de1: e8 ee fe ff ff call 13cd4 <_pci_resource_len>\r
+ 13de6: 83 c4 08 add $0x8,%esp\r
+ 13de9: 50 push %eax\r
+ 13dea: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13ded: ff b0 88 00 00 00 pushl 0x88(%eax)\r
+ 13df3: ff 75 08 pushl 0x8(%ebp)\r
+ 13df6: e8 e3 fe ff ff call 13cde <_pci_resource_start>\r
+ 13dfb: 83 c4 08 add $0x8,%esp\r
+ 13dfe: 50 push %eax\r
+ 13dff: e8 7a fe ff ff call 13c7e <_release_region>\r
+ 13e04: 83 c4 08 add $0x8,%esp\r
+ 13e07: 83 ec 0c sub $0xc,%esp\r
+ 13e0a: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13e0d: e8 9e ea ff ff call 128b0 <_usb_deregister_bus@4>\r
+ 13e12: 83 c4 0c add $0xc,%esp\r
+ 13e15: 83 ec 0c sub $0xc,%esp\r
+ 13e18: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13e1b: 8b 40 74 mov 0x74(%eax),%eax\r
+ 13e1e: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13e21: 8b 40 24 mov 0x24(%eax),%eax\r
+ 13e24: ff d0 call *%eax\r
+ 13e26: 83 c4 10 add $0x10,%esp\r
+ 13e29: c9 leave \r
+ 13e2a: c2 04 00 ret $0x4\r
+\r
+00013e2d <_pci_get_drvdata>:\r
+ 13e2d: 55 push %ebp\r
+ 13e2e: 89 e5 mov %esp,%ebp\r
+ 13e30: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13e33: 8b 80 e4 00 00 00 mov 0xe4(%eax),%eax\r
+ 13e39: 5d pop %ebp\r
+ 13e3a: c3 ret \r
+ 13e3b: 90 nop \r
+ 13e3c: 90 nop \r
+ 13e3d: 90 nop \r
+ 13e3e: 90 nop \r
+ 13e3f: 90 nop \r
+\r
+00013e40 <_get_hub_descriptor>:\r
+ 13e40: 55 push %ebp\r
+ 13e41: 89 e5 mov %esp,%ebp\r
+ 13e43: 83 ec 08 sub $0x8,%esp\r
+ 13e46: 83 ec 0c sub $0xc,%esp\r
+ 13e49: 68 f4 01 00 00 push $0x1f4\r
+ 13e4e: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 13e51: 25 ff ff 00 00 and $0xffff,%eax\r
+ 13e56: 50 push %eax\r
+ 13e57: ff 75 0c pushl 0xc(%ebp)\r
+ 13e5a: 6a 00 push $0x0\r
+ 13e5c: 68 00 29 00 00 push $0x2900\r
+ 13e61: 68 a0 00 00 00 push $0xa0\r
+ 13e66: 6a 06 push $0x6\r
+ 13e68: 6a 00 push $0x0\r
+ 13e6a: ff 75 08 pushl 0x8(%ebp)\r
+ 13e6d: e8 16 00 00 00 call 13e88 <___create_pipe>\r
+ 13e72: 83 c4 08 add $0x8,%esp\r
+ 13e75: 0d 80 00 00 80 or $0x80000080,%eax\r
+ 13e7a: 50 push %eax\r
+ 13e7b: ff 75 08 pushl 0x8(%ebp)\r
+ 13e7e: e8 6d d3 ff ff call 111f0 <_usb_control_msg>\r
+ 13e83: 83 c4 30 add $0x30,%esp\r
+ 13e86: c9 leave \r
+ 13e87: c3 ret \r
+\r
+00013e88 <___create_pipe>:\r
+ 13e88: 55 push %ebp\r
+ 13e89: 89 e5 mov %esp,%ebp\r
+ 13e8b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13e8e: 8b 00 mov (%eax),%eax\r
+ 13e90: c1 e0 08 shl $0x8,%eax\r
+ 13e93: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 13e96: c1 e2 0f shl $0xf,%edx\r
+ 13e99: 09 d0 or %edx,%eax\r
+ 13e9b: 5d pop %ebp\r
+ 13e9c: c3 ret \r
+\r
+00013e9d <_clear_hub_feature>:\r
+ 13e9d: 55 push %ebp\r
+ 13e9e: 89 e5 mov %esp,%ebp\r
+ 13ea0: 83 ec 08 sub $0x8,%esp\r
+ 13ea3: 83 ec 0c sub $0xc,%esp\r
+ 13ea6: 6a 64 push $0x64\r
+ 13ea8: 6a 00 push $0x0\r
+ 13eaa: 6a 00 push $0x0\r
+ 13eac: 6a 00 push $0x0\r
+ 13eae: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 13eb1: 25 ff ff 00 00 and $0xffff,%eax\r
+ 13eb6: 50 push %eax\r
+ 13eb7: 6a 20 push $0x20\r
+ 13eb9: 6a 01 push $0x1\r
+ 13ebb: 6a 00 push $0x0\r
+ 13ebd: ff 75 08 pushl 0x8(%ebp)\r
+ 13ec0: e8 c3 ff ff ff call 13e88 <___create_pipe>\r
+ 13ec5: 83 c4 08 add $0x8,%esp\r
+ 13ec8: 0d 00 00 00 80 or $0x80000000,%eax\r
+ 13ecd: 50 push %eax\r
+ 13ece: ff 75 08 pushl 0x8(%ebp)\r
+ 13ed1: e8 1a d3 ff ff call 111f0 <_usb_control_msg>\r
+ 13ed6: 83 c4 30 add $0x30,%esp\r
+ 13ed9: c9 leave \r
+ 13eda: c3 ret \r
+\r
+00013edb <_clear_port_feature>:\r
+ 13edb: 55 push %ebp\r
+ 13edc: 89 e5 mov %esp,%ebp\r
+ 13ede: 83 ec 08 sub $0x8,%esp\r
+ 13ee1: 83 ec 0c sub $0xc,%esp\r
+ 13ee4: 6a 64 push $0x64\r
+ 13ee6: 6a 00 push $0x0\r
+ 13ee8: 6a 00 push $0x0\r
+ 13eea: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 13eed: 25 ff ff 00 00 and $0xffff,%eax\r
+ 13ef2: 50 push %eax\r
+ 13ef3: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 13ef6: 25 ff ff 00 00 and $0xffff,%eax\r
+ 13efb: 50 push %eax\r
+ 13efc: 6a 23 push $0x23\r
+ 13efe: 6a 01 push $0x1\r
+ 13f00: 6a 00 push $0x0\r
+ 13f02: ff 75 08 pushl 0x8(%ebp)\r
+ 13f05: e8 7e ff ff ff call 13e88 <___create_pipe>\r
+ 13f0a: 83 c4 08 add $0x8,%esp\r
+ 13f0d: 0d 00 00 00 80 or $0x80000000,%eax\r
+ 13f12: 50 push %eax\r
+ 13f13: ff 75 08 pushl 0x8(%ebp)\r
+ 13f16: e8 d5 d2 ff ff call 111f0 <_usb_control_msg>\r
+ 13f1b: 83 c4 30 add $0x30,%esp\r
+ 13f1e: c9 leave \r
+ 13f1f: c3 ret \r
+\r
+00013f20 <_set_port_feature>:\r
+ 13f20: 55 push %ebp\r
+ 13f21: 89 e5 mov %esp,%ebp\r
+ 13f23: 83 ec 08 sub $0x8,%esp\r
+ 13f26: 83 ec 0c sub $0xc,%esp\r
+ 13f29: 6a 64 push $0x64\r
+ 13f2b: 6a 00 push $0x0\r
+ 13f2d: 6a 00 push $0x0\r
+ 13f2f: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 13f32: 25 ff ff 00 00 and $0xffff,%eax\r
+ 13f37: 50 push %eax\r
+ 13f38: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 13f3b: 25 ff ff 00 00 and $0xffff,%eax\r
+ 13f40: 50 push %eax\r
+ 13f41: 6a 23 push $0x23\r
+ 13f43: 6a 03 push $0x3\r
+ 13f45: 6a 00 push $0x0\r
+ 13f47: ff 75 08 pushl 0x8(%ebp)\r
+ 13f4a: e8 39 ff ff ff call 13e88 <___create_pipe>\r
+ 13f4f: 83 c4 08 add $0x8,%esp\r
+ 13f52: 0d 00 00 00 80 or $0x80000000,%eax\r
+ 13f57: 50 push %eax\r
+ 13f58: ff 75 08 pushl 0x8(%ebp)\r
+ 13f5b: e8 90 d2 ff ff call 111f0 <_usb_control_msg>\r
+ 13f60: 83 c4 30 add $0x30,%esp\r
+ 13f63: c9 leave \r
+ 13f64: c3 ret \r
+\r
+00013f65 <_get_hub_status>:\r
+ 13f65: 55 push %ebp\r
+ 13f66: 89 e5 mov %esp,%ebp\r
+ 13f68: 83 ec 08 sub $0x8,%esp\r
+ 13f6b: 83 ec 0c sub $0xc,%esp\r
+ 13f6e: 68 f4 01 00 00 push $0x1f4\r
+ 13f73: 6a 04 push $0x4\r
+ 13f75: ff 75 0c pushl 0xc(%ebp)\r
+ 13f78: 6a 00 push $0x0\r
+ 13f7a: 6a 00 push $0x0\r
+ 13f7c: 68 a0 00 00 00 push $0xa0\r
+ 13f81: 6a 00 push $0x0\r
+ 13f83: 6a 00 push $0x0\r
+ 13f85: ff 75 08 pushl 0x8(%ebp)\r
+ 13f88: e8 fb fe ff ff call 13e88 <___create_pipe>\r
+ 13f8d: 83 c4 08 add $0x8,%esp\r
+ 13f90: 0d 80 00 00 80 or $0x80000080,%eax\r
+ 13f95: 50 push %eax\r
+ 13f96: ff 75 08 pushl 0x8(%ebp)\r
+ 13f99: e8 52 d2 ff ff call 111f0 <_usb_control_msg>\r
+ 13f9e: 83 c4 30 add $0x30,%esp\r
+ 13fa1: c9 leave \r
+ 13fa2: c3 ret \r
+\r
+00013fa3 <_get_port_status>:\r
+ 13fa3: 55 push %ebp\r
+ 13fa4: 89 e5 mov %esp,%ebp\r
+ 13fa6: 83 ec 08 sub $0x8,%esp\r
+ 13fa9: 83 ec 0c sub $0xc,%esp\r
+ 13fac: 68 f4 01 00 00 push $0x1f4\r
+ 13fb1: 6a 04 push $0x4\r
+ 13fb3: ff 75 10 pushl 0x10(%ebp)\r
+ 13fb6: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 13fb9: 25 ff ff 00 00 and $0xffff,%eax\r
+ 13fbe: 50 push %eax\r
+ 13fbf: 6a 00 push $0x0\r
+ 13fc1: 68 a3 00 00 00 push $0xa3\r
+ 13fc6: 6a 00 push $0x0\r
+ 13fc8: 6a 00 push $0x0\r
+ 13fca: ff 75 08 pushl 0x8(%ebp)\r
+ 13fcd: e8 b6 fe ff ff call 13e88 <___create_pipe>\r
+ 13fd2: 83 c4 08 add $0x8,%esp\r
+ 13fd5: 0d 80 00 00 80 or $0x80000080,%eax\r
+ 13fda: 50 push %eax\r
+ 13fdb: ff 75 08 pushl 0x8(%ebp)\r
+ 13fde: e8 0d d2 ff ff call 111f0 <_usb_control_msg>\r
+ 13fe3: 83 c4 30 add $0x30,%esp\r
+ 13fe6: c9 leave \r
+ 13fe7: c3 ret \r
+\r
+00013fe8 <_hub_irq>:\r
+ 13fe8: 55 push %ebp\r
+ 13fe9: 89 e5 mov %esp,%ebp\r
+ 13feb: 83 ec 18 sub $0x18,%esp\r
+ 13fee: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13ff1: 8b 40 54 mov 0x54(%eax),%eax\r
+ 13ff4: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 13ff7: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13ffa: 8b 40 1c mov 0x1c(%eax),%eax\r
+ 13ffd: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 14000: 83 7d f0 98 cmpl $0xffffff98,0xfffffff0(%ebp)\r
+ 14004: 0f 84 ad 00 00 00 je 140b7 <_hub_irq+0xcf>\r
+ 1400a: 83 7d f0 98 cmpl $0xffffff98,0xfffffff0(%ebp)\r
+ 1400e: 7f 0c jg 1401c <_hub_irq+0x34>\r
+ 14010: 83 7d f0 94 cmpl $0xffffff94,0xfffffff0(%ebp)\r
+ 14014: 0f 84 9d 00 00 00 je 140b7 <_hub_irq+0xcf>\r
+ 1401a: eb 10 jmp 1402c <_hub_irq+0x44>\r
+ 1401c: 83 7d f0 fe cmpl $0xfffffffe,0xfffffff0(%ebp)\r
+ 14020: 0f 84 91 00 00 00 je 140b7 <_hub_irq+0xcf>\r
+ 14026: 83 7d f0 00 cmpl $0x0,0xfffffff0(%ebp)\r
+ 1402a: 74 21 je 1404d <_hub_irq+0x65>\r
+ 1402c: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1402f: ff 40 18 incl 0x18(%eax)\r
+ 14032: 83 78 18 09 cmpl $0x9,0x18(%eax)\r
+ 14036: 7e 63 jle 1409b <_hub_irq+0xb3>\r
+ 14038: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1403b: 83 78 14 00 cmpl $0x0,0x14(%eax)\r
+ 1403f: 75 5a jne 1409b <_hub_irq+0xb3>\r
+ 14041: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14044: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 14047: 8b 52 1c mov 0x1c(%edx),%edx\r
+ 1404a: 89 50 14 mov %edx,0x14(%eax)\r
+ 1404d: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14050: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)\r
+ 14057: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 1405e: 83 ec 0c sub $0xc,%esp\r
+ 14061: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14064: 83 c0 24 add $0x24,%eax\r
+ 14067: 50 push %eax\r
+ 14068: e8 91 00 00 00 call 140fe <_list_empty>\r
+ 1406d: 83 c4 10 add $0x10,%esp\r
+ 14070: 85 c0 test %eax,%eax\r
+ 14072: 74 27 je 1409b <_hub_irq+0xb3>\r
+ 14074: 83 ec 08 sub $0x8,%esp\r
+ 14077: 68 40 a0 01 00 push $0x1a040\r
+ 1407c: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1407f: 83 c0 24 add $0x24,%eax\r
+ 14082: 50 push %eax\r
+ 14083: e8 31 00 00 00 call 140b9 <_list_add>\r
+ 14088: 83 c4 10 add $0x10,%esp\r
+ 1408b: 83 ec 0c sub $0xc,%esp\r
+ 1408e: 68 50 c0 01 00 push $0x1c050\r
+ 14093: e8 cd 57 00 00 call 19865 <_my_wake_up>\r
+ 14098: 83 c4 10 add $0x10,%esp\r
+ 1409b: 83 ec 08 sub $0x8,%esp\r
+ 1409e: 6a 00 push $0x0\r
+ 140a0: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 140a3: ff 70 04 pushl 0x4(%eax)\r
+ 140a6: e8 f8 40 00 00 call 181a3 <_usb_submit_urb@8>\r
+ 140ab: 83 c4 08 add $0x8,%esp\r
+ 140ae: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 140b1: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 140b5: 74 00 je 140b7 <_hub_irq+0xcf>\r
+ 140b7: c9 leave \r
+ 140b8: c3 ret \r
+\r
+000140b9 <_list_add>:\r
+ 140b9: 55 push %ebp\r
+ 140ba: 89 e5 mov %esp,%ebp\r
+ 140bc: 83 ec 08 sub $0x8,%esp\r
+ 140bf: 83 ec 04 sub $0x4,%esp\r
+ 140c2: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 140c5: ff 30 pushl (%eax)\r
+ 140c7: ff 75 0c pushl 0xc(%ebp)\r
+ 140ca: ff 75 08 pushl 0x8(%ebp)\r
+ 140cd: e8 05 00 00 00 call 140d7 <___list_add>\r
+ 140d2: 83 c4 10 add $0x10,%esp\r
+ 140d5: c9 leave \r
+ 140d6: c3 ret \r
+\r
+000140d7 <___list_add>:\r
+ 140d7: 55 push %ebp\r
+ 140d8: 89 e5 mov %esp,%ebp\r
+ 140da: 8b 55 10 mov 0x10(%ebp),%edx\r
+ 140dd: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 140e0: 89 42 04 mov %eax,0x4(%edx)\r
+ 140e3: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 140e6: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 140e9: 89 02 mov %eax,(%edx)\r
+ 140eb: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 140ee: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 140f1: 89 42 04 mov %eax,0x4(%edx)\r
+ 140f4: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 140f7: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 140fa: 89 02 mov %eax,(%edx)\r
+ 140fc: 5d pop %ebp\r
+ 140fd: c3 ret \r
+\r
+000140fe <_list_empty>:\r
+ 140fe: 55 push %ebp\r
+ 140ff: 89 e5 mov %esp,%ebp\r
+ 14101: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14104: 8b 00 mov (%eax),%eax\r
+ 14106: 3b 45 08 cmp 0x8(%ebp),%eax\r
+ 14109: 0f 94 c0 sete %al\r
+ 1410c: 25 ff 00 00 00 and $0xff,%eax\r
+ 14111: 5d pop %ebp\r
+ 14112: c3 ret \r
+\r
+00014113 <_hub_tt_kevent>:\r
+ 14113: 55 push %ebp\r
+ 14114: 89 e5 mov %esp,%ebp\r
+ 14116: 83 ec 28 sub $0x28,%esp\r
+ 14119: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1411c: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 1411f: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 14126: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14129: 83 c0 40 add $0x40,%eax\r
+ 1412c: 50 push %eax\r
+ 1412d: e8 cc ff ff ff call 140fe <_list_empty>\r
+ 14132: 83 c4 04 add $0x4,%esp\r
+ 14135: 85 c0 test %eax,%eax\r
+ 14137: 75 7a jne 141b3 <_hub_tt_kevent+0xa0>\r
+ 14139: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1413c: 8b 40 40 mov 0x40(%eax),%eax\r
+ 1413f: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 14142: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 14145: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 14148: 83 ec 0c sub $0xc,%esp\r
+ 1414b: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 1414e: e8 b9 00 00 00 call 1420c <_list_del>\r
+ 14153: 83 c4 10 add $0x10,%esp\r
+ 14156: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14159: 8b 00 mov (%eax),%eax\r
+ 1415b: 8b 80 b8 00 00 00 mov 0xb8(%eax),%eax\r
+ 14161: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 14164: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 14167: 2d c0 00 00 00 sub $0xc0,%eax\r
+ 1416c: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 1416f: 83 ec 04 sub $0x4,%esp\r
+ 14172: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 14175: 8b 40 08 mov 0x8(%eax),%eax\r
+ 14178: 25 ff ff 00 00 and $0xffff,%eax\r
+ 1417d: 50 push %eax\r
+ 1417e: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 14181: 66 8b 40 0c mov 0xc(%eax),%ax\r
+ 14185: 25 ff ff 00 00 and $0xffff,%eax\r
+ 1418a: 50 push %eax\r
+ 1418b: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 1418e: e8 22 00 00 00 call 141b5 <_hub_clear_tt_buffer>\r
+ 14193: 83 c4 10 add $0x10,%esp\r
+ 14196: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 14199: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 141a0: 83 ec 0c sub $0xc,%esp\r
+ 141a3: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 141a6: e8 95 58 00 00 call 19a40 <_ExFreePool@4>\r
+ 141ab: 83 c4 0c add $0xc,%esp\r
+ 141ae: e9 73 ff ff ff jmp 14126 <_hub_tt_kevent+0x13>\r
+ 141b3: c9 leave \r
+ 141b4: c3 ret \r
+\r
+000141b5 <_hub_clear_tt_buffer>:\r
+ 141b5: 55 push %ebp\r
+ 141b6: 89 e5 mov %esp,%ebp\r
+ 141b8: 83 ec 08 sub $0x8,%esp\r
+ 141bb: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 141be: 8b 55 10 mov 0x10(%ebp),%edx\r
+ 141c1: 66 89 45 fe mov %ax,0xfffffffe(%ebp)\r
+ 141c5: 66 89 55 fc mov %dx,0xfffffffc(%ebp)\r
+ 141c9: 83 ec 0c sub $0xc,%esp\r
+ 141cc: 6a 64 push $0x64\r
+ 141ce: 6a 00 push $0x0\r
+ 141d0: 6a 00 push $0x0\r
+ 141d2: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 141d5: 25 ff ff 00 00 and $0xffff,%eax\r
+ 141da: 50 push %eax\r
+ 141db: 66 8b 45 fe mov 0xfffffffe(%ebp),%ax\r
+ 141df: 25 ff ff 00 00 and $0xffff,%eax\r
+ 141e4: 50 push %eax\r
+ 141e5: 68 83 00 00 00 push $0x83\r
+ 141ea: 6a 08 push $0x8\r
+ 141ec: 6a 00 push $0x0\r
+ 141ee: ff 75 08 pushl 0x8(%ebp)\r
+ 141f1: e8 92 fc ff ff call 13e88 <___create_pipe>\r
+ 141f6: 83 c4 08 add $0x8,%esp\r
+ 141f9: 0d 80 00 00 80 or $0x80000080,%eax\r
+ 141fe: 50 push %eax\r
+ 141ff: ff 75 08 pushl 0x8(%ebp)\r
+ 14202: e8 e9 cf ff ff call 111f0 <_usb_control_msg>\r
+ 14207: 83 c4 30 add $0x30,%esp\r
+ 1420a: c9 leave \r
+ 1420b: c3 ret \r
+\r
+0001420c <_list_del>:\r
+ 1420c: 55 push %ebp\r
+ 1420d: 89 e5 mov %esp,%ebp\r
+ 1420f: 83 ec 08 sub $0x8,%esp\r
+ 14212: 83 ec 08 sub $0x8,%esp\r
+ 14215: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14218: ff 30 pushl (%eax)\r
+ 1421a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1421d: ff 70 04 pushl 0x4(%eax)\r
+ 14220: e8 18 00 00 00 call 1423d <___list_del>\r
+ 14225: 83 c4 10 add $0x10,%esp\r
+ 14228: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1422b: c7 00 00 00 00 00 movl $0x0,(%eax)\r
+ 14231: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14234: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax)\r
+ 1423b: c9 leave \r
+ 1423c: c3 ret \r
+\r
+0001423d <___list_del>:\r
+ 1423d: 55 push %ebp\r
+ 1423e: 89 e5 mov %esp,%ebp\r
+ 14240: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 14243: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14246: 89 42 04 mov %eax,0x4(%edx)\r
+ 14249: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 1424c: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1424f: 89 02 mov %eax,(%edx)\r
+ 14251: 5d pop %ebp\r
+ 14252: c3 ret \r
+\r
+00014253 <_usb_hub_tt_clear_buffer>:\r
+ 14253: 55 push %ebp\r
+ 14254: 89 e5 mov %esp,%ebp\r
+ 14256: 83 ec 28 sub $0x28,%esp\r
+ 14259: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1425c: 8b 40 1c mov 0x1c(%eax),%eax\r
+ 1425f: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 14262: 83 ec 08 sub $0x8,%esp\r
+ 14265: 6a 10 push $0x10\r
+ 14267: 6a 01 push $0x1\r
+ 14269: e8 c2 57 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 1426e: 83 c4 08 add $0x8,%esp\r
+ 14271: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 14274: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 14277: 85 c0 test %eax,%eax\r
+ 14279: 75 05 jne 14280 <_usb_hub_tt_clear_buffer+0x2d>\r
+ 1427b: e9 d3 00 00 00 jmp 14353 <_usb_hub_tt_clear_buffer+0x100>\r
+ 14280: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 14283: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 14286: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14289: 83 78 04 00 cmpl $0x0,0x4(%eax)\r
+ 1428d: 74 0b je 1429a <_usb_hub_tt_clear_buffer+0x47>\r
+ 1428f: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14292: 8b 40 20 mov 0x20(%eax),%eax\r
+ 14295: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 14298: eb 07 jmp 142a1 <_usb_hub_tt_clear_buffer+0x4e>\r
+ 1429a: c7 45 ec 01 00 00 00 movl $0x1,0xffffffec(%ebp)\r
+ 142a1: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 142a4: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 142a7: 89 42 08 mov %eax,0x8(%edx)\r
+ 142aa: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 142ad: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 142b0: c1 f8 0f sar $0xf,%eax\r
+ 142b3: 83 e0 0f and $0xf,%eax\r
+ 142b6: 66 89 42 0c mov %ax,0xc(%edx)\r
+ 142ba: 8b 4d f4 mov 0xfffffff4(%ebp),%ecx\r
+ 142bd: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 142c0: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 142c3: 8b 00 mov (%eax),%eax\r
+ 142c5: c1 e0 04 shl $0x4,%eax\r
+ 142c8: 66 0b 42 0c or 0xc(%edx),%ax\r
+ 142cc: 66 89 41 0c mov %ax,0xc(%ecx)\r
+ 142d0: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 142d3: 89 55 e8 mov %edx,0xffffffe8(%ebp)\r
+ 142d6: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 142d9: 66 8b 40 0c mov 0xc(%eax),%ax\r
+ 142dd: 25 ff ff 00 00 and $0xffff,%eax\r
+ 142e2: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 142e5: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 142e8: c1 f8 1e sar $0x1e,%eax\r
+ 142eb: 83 e0 03 and $0x3,%eax\r
+ 142ee: 83 f8 02 cmp $0x2,%eax\r
+ 142f1: 74 07 je 142fa <_usb_hub_tt_clear_buffer+0xa7>\r
+ 142f3: 81 4d e4 00 10 00 00 orl $0x1000,0xffffffe4(%ebp)\r
+ 142fa: 8b 55 e4 mov 0xffffffe4(%ebp),%edx\r
+ 142fd: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 14300: 66 89 50 0c mov %dx,0xc(%eax)\r
+ 14304: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 14307: c1 e8 07 shr $0x7,%eax\r
+ 1430a: 83 e0 01 and $0x1,%eax\r
+ 1430d: 85 c0 test %eax,%eax\r
+ 1430f: 74 14 je 14325 <_usb_hub_tt_clear_buffer+0xd2>\r
+ 14311: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 14314: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 14317: 66 8b 52 0c mov 0xc(%edx),%dx\r
+ 1431b: 81 ca 00 80 ff ff or $0xffff8000,%edx\r
+ 14321: 66 89 50 0c mov %dx,0xc(%eax)\r
+ 14325: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 1432c: 83 ec 08 sub $0x8,%esp\r
+ 1432f: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14332: 83 c0 0c add $0xc,%eax\r
+ 14335: 50 push %eax\r
+ 14336: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 14339: e8 1c 00 00 00 call 1435a <_list_add_tail>\r
+ 1433e: 83 c4 10 add $0x10,%esp\r
+ 14341: 83 ec 0c sub $0xc,%esp\r
+ 14344: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14347: 83 c0 14 add $0x14,%eax\r
+ 1434a: 50 push %eax\r
+ 1434b: e8 05 00 00 00 call 14355 <_schedule_work>\r
+ 14350: 83 c4 10 add $0x10,%esp\r
+ 14353: c9 leave \r
+ 14354: c3 ret \r
+\r
+00014355 <_schedule_work>:\r
+ 14355: 55 push %ebp\r
+ 14356: 89 e5 mov %esp,%ebp\r
+ 14358: 5d pop %ebp\r
+ 14359: c3 ret \r
+\r
+0001435a <_list_add_tail>:\r
+ 1435a: 55 push %ebp\r
+ 1435b: 89 e5 mov %esp,%ebp\r
+ 1435d: ff 75 0c pushl 0xc(%ebp)\r
+ 14360: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 14363: ff 70 04 pushl 0x4(%eax)\r
+ 14366: ff 75 08 pushl 0x8(%ebp)\r
+ 14369: e8 69 fd ff ff call 140d7 <___list_add>\r
+ 1436e: 83 c4 0c add $0xc,%esp\r
+ 14371: c9 leave \r
+ 14372: c3 ret \r
+\r
+00014373 <_hub_power_on>:\r
+ 14373: 55 push %ebp\r
+ 14374: 89 e5 mov %esp,%ebp\r
+ 14376: 83 ec 18 sub $0x18,%esp\r
+ 14379: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1437c: 8b 00 mov (%eax),%eax\r
+ 1437e: 8b 80 b8 00 00 00 mov 0xb8(%eax),%eax\r
+ 14384: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 14387: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 1438a: 2d c0 00 00 00 sub $0xc0,%eax\r
+ 1438f: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 14392: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 14399: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1439c: 8b 40 2c mov 0x2c(%eax),%eax\r
+ 1439f: 8a 40 02 mov 0x2(%eax),%al\r
+ 143a2: 25 ff 00 00 00 and $0xff,%eax\r
+ 143a7: 3b 45 f8 cmp 0xfffffff8(%ebp),%eax\r
+ 143aa: 7e 1c jle 143c8 <_hub_power_on+0x55>\r
+ 143ac: 83 ec 04 sub $0x4,%esp\r
+ 143af: 6a 08 push $0x8\r
+ 143b1: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 143b4: 40 inc %eax\r
+ 143b5: 50 push %eax\r
+ 143b6: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 143b9: e8 62 fb ff ff call 13f20 <_set_port_feature>\r
+ 143be: 83 c4 10 add $0x10,%esp\r
+ 143c1: 8d 45 f8 lea 0xfffffff8(%ebp),%eax\r
+ 143c4: ff 00 incl (%eax)\r
+ 143c6: eb d1 jmp 14399 <_hub_power_on+0x26>\r
+ 143c8: 83 ec 0c sub $0xc,%esp\r
+ 143cb: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 143ce: 8b 40 2c mov 0x2c(%eax),%eax\r
+ 143d1: 8a 40 05 mov 0x5(%eax),%al\r
+ 143d4: 25 ff 00 00 00 and $0xff,%eax\r
+ 143d9: 01 c0 add %eax,%eax\r
+ 143db: 50 push %eax\r
+ 143dc: e8 cf 50 00 00 call 194b0 <_wait_ms>\r
+ 143e1: 83 c4 10 add $0x10,%esp\r
+ 143e4: c9 leave \r
+ 143e5: c3 ret \r
+\r
+000143e6 <_hub_hub_status>:\r
+ 143e6: 55 push %ebp\r
+ 143e7: 89 e5 mov %esp,%ebp\r
+ 143e9: 83 ec 08 sub $0x8,%esp\r
+ 143ec: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 143ef: 8b 00 mov (%eax),%eax\r
+ 143f1: 8b 80 b8 00 00 00 mov 0xb8(%eax),%eax\r
+ 143f7: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 143fa: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 143fd: 2d c0 00 00 00 sub $0xc0,%eax\r
+ 14402: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 14405: 83 ec 08 sub $0x8,%esp\r
+ 14408: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1440b: ff 70 10 pushl 0x10(%eax)\r
+ 1440e: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 14411: e8 4f fb ff ff call 13f65 <_get_hub_status>\r
+ 14416: 83 c4 10 add $0x10,%esp\r
+ 14419: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 1441c: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 14420: 79 02 jns 14424 <_hub_hub_status+0x3e>\r
+ 14422: eb 26 jmp 1444a <_hub_hub_status+0x64>\r
+ 14424: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 14427: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1442a: 8b 40 10 mov 0x10(%eax),%eax\r
+ 1442d: 66 8b 00 mov (%eax),%ax\r
+ 14430: 66 89 02 mov %ax,(%edx)\r
+ 14433: 8b 55 10 mov 0x10(%ebp),%edx\r
+ 14436: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14439: 8b 40 10 mov 0x10(%eax),%eax\r
+ 1443c: 66 8b 40 02 mov 0x2(%eax),%ax\r
+ 14440: 66 89 02 mov %ax,(%edx)\r
+ 14443: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 1444a: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1444d: c9 leave \r
+ 1444e: c3 ret \r
+\r
+0001444f <_hub_configure>:\r
+ 1444f: 55 push %ebp\r
+ 14450: 89 e5 mov %esp,%ebp\r
+ 14452: 53 push %ebx\r
+ 14453: 83 ec 74 sub $0x74,%esp\r
+ 14456: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14459: 8b 00 mov (%eax),%eax\r
+ 1445b: 8b 80 b8 00 00 00 mov 0xb8(%eax),%eax\r
+ 14461: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 14464: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 14467: 2d c0 00 00 00 sub $0xc0,%eax\r
+ 1446c: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 1446f: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 14472: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14475: 83 c0 0c add $0xc,%eax\r
+ 14478: 50 push %eax\r
+ 14479: 6a 00 push $0x0\r
+ 1447b: 6a 03 push $0x3\r
+ 1447d: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 14480: e8 dd 2b 00 00 call 17062 <_usb_buffer_alloc>\r
+ 14485: 83 c4 10 add $0x10,%esp\r
+ 14488: 89 43 08 mov %eax,0x8(%ebx)\r
+ 1448b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1448e: 83 78 08 00 cmpl $0x0,0x8(%eax)\r
+ 14492: 75 13 jne 144a7 <_hub_configure+0x58>\r
+ 14494: c7 45 dc 58 b1 01 00 movl $0x1b158,0xffffffdc(%ebp)\r
+ 1449b: c7 45 e0 f4 ff ff ff movl $0xfffffff4,0xffffffe0(%ebp)\r
+ 144a2: e9 88 03 00 00 jmp 1482f <_hub_configure+0x3e0>\r
+ 144a7: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 144aa: 83 ec 08 sub $0x8,%esp\r
+ 144ad: 6a 04 push $0x4\r
+ 144af: 6a 01 push $0x1\r
+ 144b1: e8 7a 55 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 144b6: 83 c4 08 add $0x8,%esp\r
+ 144b9: 89 43 10 mov %eax,0x10(%ebx)\r
+ 144bc: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 144bf: 83 78 10 00 cmpl $0x0,0x10(%eax)\r
+ 144c3: 75 13 jne 144d8 <_hub_configure+0x89>\r
+ 144c5: c7 45 dc 78 b1 01 00 movl $0x1b178,0xffffffdc(%ebp)\r
+ 144cc: c7 45 e0 f4 ff ff ff movl $0xfffffff4,0xffffffe0(%ebp)\r
+ 144d3: e9 57 03 00 00 jmp 1482f <_hub_configure+0x3e0>\r
+ 144d8: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 144db: 83 ec 08 sub $0x8,%esp\r
+ 144de: 6a 0d push $0xd\r
+ 144e0: 6a 01 push $0x1\r
+ 144e2: e8 49 55 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 144e7: 83 c4 08 add $0x8,%esp\r
+ 144ea: 89 43 2c mov %eax,0x2c(%ebx)\r
+ 144ed: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 144f0: 83 78 2c 00 cmpl $0x0,0x2c(%eax)\r
+ 144f4: 75 13 jne 14509 <_hub_configure+0xba>\r
+ 144f6: c7 45 dc 98 b1 01 00 movl $0x1b198,0xffffffdc(%ebp)\r
+ 144fd: c7 45 e0 f4 ff ff ff movl $0xfffffff4,0xffffffe0(%ebp)\r
+ 14504: e9 26 03 00 00 jmp 1482f <_hub_configure+0x3e0>\r
+ 14509: 83 ec 04 sub $0x4,%esp\r
+ 1450c: 6a 0d push $0xd\r
+ 1450e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14511: ff 70 2c pushl 0x2c(%eax)\r
+ 14514: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 14517: e8 24 f9 ff ff call 13e40 <_get_hub_descriptor>\r
+ 1451c: 83 c4 10 add $0x10,%esp\r
+ 1451f: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 14522: 83 7d e0 00 cmpl $0x0,0xffffffe0(%ebp)\r
+ 14526: 79 0c jns 14534 <_hub_configure+0xe5>\r
+ 14528: c7 45 dc b5 b1 01 00 movl $0x1b1b5,0xffffffdc(%ebp)\r
+ 1452f: e9 fb 02 00 00 jmp 1482f <_hub_configure+0x3e0>\r
+ 14534: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14537: 8b 40 2c mov 0x2c(%eax),%eax\r
+ 1453a: 80 78 02 10 cmpb $0x10,0x2(%eax)\r
+ 1453e: 76 13 jbe 14553 <_hub_configure+0x104>\r
+ 14540: c7 45 dc cf b1 01 00 movl $0x1b1cf,0xffffffdc(%ebp)\r
+ 14547: c7 45 e0 ed ff ff ff movl $0xffffffed,0xffffffe0(%ebp)\r
+ 1454e: e9 dc 02 00 00 jmp 1482f <_hub_configure+0x3e0>\r
+ 14553: 83 ec 0c sub $0xc,%esp\r
+ 14556: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 14559: e8 49 03 00 00 call 148a7 <_hubdev>\r
+ 1455e: 83 c4 10 add $0x10,%esp\r
+ 14561: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 14564: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 14567: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1456a: 8b 40 2c mov 0x2c(%eax),%eax\r
+ 1456d: 8a 40 02 mov 0x2(%eax),%al\r
+ 14570: 25 ff 00 00 00 and $0xff,%eax\r
+ 14575: 89 82 ac 01 00 00 mov %eax,0x1ac(%edx)\r
+ 1457b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1457e: 8b 40 2c mov 0x2c(%eax),%eax\r
+ 14581: 66 8b 40 03 mov 0x3(%eax),%ax\r
+ 14585: 25 ff ff 00 00 and $0xffff,%eax\r
+ 1458a: c1 e8 02 shr $0x2,%eax\r
+ 1458d: 83 e0 01 and $0x1,%eax\r
+ 14590: 85 c0 test %eax,%eax\r
+ 14592: 0f 84 b5 00 00 00 je 1464d <_hub_configure+0x1fe>\r
+ 14598: c7 45 d8 00 00 00 00 movl $0x0,0xffffffd8(%ebp)\r
+ 1459f: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 145a2: 8b 80 ac 01 00 00 mov 0x1ac(%eax),%eax\r
+ 145a8: 3b 45 d8 cmp 0xffffffd8(%ebp),%eax\r
+ 145ab: 0f 8e 88 00 00 00 jle 14639 <_hub_configure+0x1ea>\r
+ 145b1: 8d 45 f8 lea 0xfffffff8(%ebp),%eax\r
+ 145b4: 03 45 d8 add 0xffffffd8(%ebp),%eax\r
+ 145b7: 83 e8 40 sub $0x40,%eax\r
+ 145ba: 89 45 b0 mov %eax,0xffffffb0(%ebp)\r
+ 145bd: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 145c0: 8b 40 2c mov 0x2c(%eax),%eax\r
+ 145c3: 89 45 a8 mov %eax,0xffffffa8(%ebp)\r
+ 145c6: 8b 45 d8 mov 0xffffffd8(%ebp),%eax\r
+ 145c9: 40 inc %eax\r
+ 145ca: 89 45 a4 mov %eax,0xffffffa4(%ebp)\r
+ 145cd: 83 7d a4 00 cmpl $0x0,0xffffffa4(%ebp)\r
+ 145d1: 79 04 jns 145d7 <_hub_configure+0x188>\r
+ 145d3: 83 45 a4 07 addl $0x7,0xffffffa4(%ebp)\r
+ 145d7: 8b 45 a4 mov 0xffffffa4(%ebp),%eax\r
+ 145da: c1 f8 03 sar $0x3,%eax\r
+ 145dd: 8b 4d a8 mov 0xffffffa8(%ebp),%ecx\r
+ 145e0: ba 00 00 00 00 mov $0x0,%edx\r
+ 145e5: 8a 54 08 07 mov 0x7(%eax,%ecx,1),%dl\r
+ 145e9: 89 55 a0 mov %edx,0xffffffa0(%ebp)\r
+ 145ec: 8b 45 d8 mov 0xffffffd8(%ebp),%eax\r
+ 145ef: 40 inc %eax\r
+ 145f0: 89 45 9c mov %eax,0xffffff9c(%ebp)\r
+ 145f3: 8b 55 9c mov 0xffffff9c(%ebp),%edx\r
+ 145f6: 89 55 98 mov %edx,0xffffff98(%ebp)\r
+ 145f9: 83 7d 98 00 cmpl $0x0,0xffffff98(%ebp)\r
+ 145fd: 79 04 jns 14603 <_hub_configure+0x1b4>\r
+ 145ff: 83 45 98 07 addl $0x7,0xffffff98(%ebp)\r
+ 14603: 8b 45 98 mov 0xffffff98(%ebp),%eax\r
+ 14606: c1 f8 03 sar $0x3,%eax\r
+ 14609: c1 e0 03 shl $0x3,%eax\r
+ 1460c: 8b 4d 9c mov 0xffffff9c(%ebp),%ecx\r
+ 1460f: 29 c1 sub %eax,%ecx\r
+ 14611: 8b 45 a0 mov 0xffffffa0(%ebp),%eax\r
+ 14614: d3 f8 sar %cl,%eax\r
+ 14616: 83 e0 01 and $0x1,%eax\r
+ 14619: 85 c0 test %eax,%eax\r
+ 1461b: 74 06 je 14623 <_hub_configure+0x1d4>\r
+ 1461d: c6 45 af 46 movb $0x46,0xffffffaf(%ebp)\r
+ 14621: eb 04 jmp 14627 <_hub_configure+0x1d8>\r
+ 14623: c6 45 af 52 movb $0x52,0xffffffaf(%ebp)\r
+ 14627: 8a 4d af mov 0xffffffaf(%ebp),%cl\r
+ 1462a: 8b 45 b0 mov 0xffffffb0(%ebp),%eax\r
+ 1462d: 88 08 mov %cl,(%eax)\r
+ 1462f: 8d 45 d8 lea 0xffffffd8(%ebp),%eax\r
+ 14632: ff 00 incl (%eax)\r
+ 14634: e9 66 ff ff ff jmp 1459f <_hub_configure+0x150>\r
+ 14639: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 1463c: 8d 55 f8 lea 0xfffffff8(%ebp),%edx\r
+ 1463f: 03 90 ac 01 00 00 add 0x1ac(%eax),%edx\r
+ 14645: 89 d0 mov %edx,%eax\r
+ 14647: 83 e8 40 sub $0x40,%eax\r
+ 1464a: c6 00 00 movb $0x0,(%eax)\r
+ 1464d: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 14650: 83 c2 40 add $0x40,%edx\r
+ 14653: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14656: 83 c0 40 add $0x40,%eax\r
+ 14659: 89 02 mov %eax,(%edx)\r
+ 1465b: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 1465e: 83 c2 40 add $0x40,%edx\r
+ 14661: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14664: 83 c0 40 add $0x40,%eax\r
+ 14667: 89 42 04 mov %eax,0x4(%edx)\r
+ 1466a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1466d: 83 c0 48 add $0x48,%eax\r
+ 14670: c7 00 13 41 01 00 movl $0x14113,(%eax)\r
+ 14676: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 14679: b9 00 00 00 00 mov $0x0,%ecx\r
+ 1467e: 8a 88 76 01 00 00 mov 0x176(%eax),%cl\r
+ 14684: 89 4d 94 mov %ecx,0xffffff94(%ebp)\r
+ 14687: 83 7d 94 01 cmpl $0x1,0xffffff94(%ebp)\r
+ 1468b: 74 08 je 14695 <_hub_configure+0x246>\r
+ 1468d: 83 7d 94 02 cmpl $0x2,0xffffff94(%ebp)\r
+ 14691: 74 0d je 146a0 <_hub_configure+0x251>\r
+ 14693: eb 1e jmp 146b3 <_hub_configure+0x264>\r
+ 14695: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 14698: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 1469b: 89 42 34 mov %eax,0x34(%edx)\r
+ 1469e: eb 13 jmp 146b3 <_hub_configure+0x264>\r
+ 146a0: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 146a3: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 146a6: 89 50 34 mov %edx,0x34(%eax)\r
+ 146a9: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 146ac: c7 40 38 01 00 00 00 movl $0x1,0x38(%eax)\r
+ 146b3: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 146b6: 8b 40 2c mov 0x2c(%eax),%eax\r
+ 146b9: 66 8b 40 03 mov 0x3(%eax),%ax\r
+ 146bd: 25 ff ff 00 00 and $0xffff,%eax\r
+ 146c2: 83 e0 60 and $0x60,%eax\r
+ 146c5: 85 c0 test %eax,%eax\r
+ 146c7: 74 02 je 146cb <_hub_configure+0x27c>\r
+ 146c9: eb 00 jmp 146cb <_hub_configure+0x27c>\r
+ 146cb: 83 ec 04 sub $0x4,%esp\r
+ 146ce: 8d 45 ec lea 0xffffffec(%ebp),%eax\r
+ 146d1: 50 push %eax\r
+ 146d2: 8d 45 ee lea 0xffffffee(%ebp),%eax\r
+ 146d5: 50 push %eax\r
+ 146d6: ff 75 08 pushl 0x8(%ebp)\r
+ 146d9: e8 08 fd ff ff call 143e6 <_hub_hub_status>\r
+ 146de: 83 c4 10 add $0x10,%esp\r
+ 146e1: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 146e4: 83 7d e0 00 cmpl $0x0,0xffffffe0(%ebp)\r
+ 146e8: 79 0c jns 146f6 <_hub_configure+0x2a7>\r
+ 146ea: c7 45 dc e7 b1 01 00 movl $0x1b1e7,0xffffffdc(%ebp)\r
+ 146f1: e9 39 01 00 00 jmp 1482f <_hub_configure+0x3e0>\r
+ 146f6: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 146f9: 8a 40 02 mov 0x2(%eax),%al\r
+ 146fc: 25 ff 00 00 00 and $0xff,%eax\r
+ 14701: 50 push %eax\r
+ 14702: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 14705: e8 7e f7 ff ff call 13e88 <___create_pipe>\r
+ 1470a: 83 c4 08 add $0x8,%esp\r
+ 1470d: 0d 80 00 00 40 or $0x40000080,%eax\r
+ 14712: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 14715: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 14718: c1 e8 07 shr $0x7,%eax\r
+ 1471b: 83 e0 01 and $0x1,%eax\r
+ 1471e: 85 c0 test %eax,%eax\r
+ 14720: 75 15 jne 14737 <_hub_configure+0x2e8>\r
+ 14722: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 14725: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 14728: c1 e8 0f shr $0xf,%eax\r
+ 1472b: 83 e0 0f and $0xf,%eax\r
+ 1472e: 8b 44 82 78 mov 0x78(%edx,%eax,4),%eax\r
+ 14732: 89 45 90 mov %eax,0xffffff90(%ebp)\r
+ 14735: eb 13 jmp 1474a <_hub_configure+0x2fb>\r
+ 14737: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 1473a: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 1473d: c1 e8 0f shr $0xf,%eax\r
+ 14740: 83 e0 0f and $0xf,%eax\r
+ 14743: 8b 44 82 38 mov 0x38(%edx,%eax,4),%eax\r
+ 14747: 89 45 90 mov %eax,0xffffff90(%ebp)\r
+ 1474a: 8b 45 90 mov 0xffffff90(%ebp),%eax\r
+ 1474d: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 14750: 83 7d e4 03 cmpl $0x3,0xffffffe4(%ebp)\r
+ 14754: 76 07 jbe 1475d <_hub_configure+0x30e>\r
+ 14756: c7 45 e4 03 00 00 00 movl $0x3,0xffffffe4(%ebp)\r
+ 1475d: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 14760: 83 ec 08 sub $0x8,%esp\r
+ 14763: 6a 00 push $0x0\r
+ 14765: 6a 00 push $0x0\r
+ 14767: e8 80 39 00 00 call 180ec <_usb_alloc_urb@8>\r
+ 1476c: 83 c4 08 add $0x8,%esp\r
+ 1476f: 89 43 04 mov %eax,0x4(%ebx)\r
+ 14772: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14775: 83 78 04 00 cmpl $0x0,0x4(%eax)\r
+ 14779: 75 13 jne 1478e <_hub_configure+0x33f>\r
+ 1477b: c7 45 dc fc b1 01 00 movl $0x1b1fc,0xffffffdc(%ebp)\r
+ 14782: c7 45 e0 f4 ff ff ff movl $0xfffffff4,0xffffffe0(%ebp)\r
+ 14789: e9 a1 00 00 00 jmp 1482f <_hub_configure+0x3e0>\r
+ 1478e: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 14791: 8a 40 06 mov 0x6(%eax),%al\r
+ 14794: 25 ff 00 00 00 and $0xff,%eax\r
+ 14799: 50 push %eax\r
+ 1479a: ff 75 08 pushl 0x8(%ebp)\r
+ 1479d: 68 e8 3f 01 00 push $0x13fe8\r
+ 147a2: ff 75 e4 pushl 0xffffffe4(%ebp)\r
+ 147a5: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 147a8: ff 70 08 pushl 0x8(%eax)\r
+ 147ab: ff 75 e8 pushl 0xffffffe8(%ebp)\r
+ 147ae: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 147b1: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 147b4: ff 70 04 pushl 0x4(%eax)\r
+ 147b7: e8 81 00 00 00 call 1483d <_usb_fill_int_urb>\r
+ 147bc: 83 c4 20 add $0x20,%esp\r
+ 147bf: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 147c2: 8b 50 04 mov 0x4(%eax),%edx\r
+ 147c5: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 147c8: 8b 40 0c mov 0xc(%eax),%eax\r
+ 147cb: 89 42 28 mov %eax,0x28(%edx)\r
+ 147ce: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 147d1: 8b 50 04 mov 0x4(%eax),%edx\r
+ 147d4: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 147d7: 8b 40 04 mov 0x4(%eax),%eax\r
+ 147da: 8b 40 20 mov 0x20(%eax),%eax\r
+ 147dd: 83 c8 04 or $0x4,%eax\r
+ 147e0: 89 42 20 mov %eax,0x20(%edx)\r
+ 147e3: 83 ec 08 sub $0x8,%esp\r
+ 147e6: 6a 00 push $0x0\r
+ 147e8: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 147eb: ff 70 04 pushl 0x4(%eax)\r
+ 147ee: e8 b0 39 00 00 call 181a3 <_usb_submit_urb@8>\r
+ 147f3: 83 c4 08 add $0x8,%esp\r
+ 147f6: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 147f9: 83 7d e0 00 cmpl $0x0,0xffffffe0(%ebp)\r
+ 147fd: 74 09 je 14808 <_hub_configure+0x3b9>\r
+ 147ff: c7 45 dc 1c b2 01 00 movl $0x1b21c,0xffffffdc(%ebp)\r
+ 14806: eb 27 jmp 1482f <_hub_configure+0x3e0>\r
+ 14808: 83 ec 0c sub $0xc,%esp\r
+ 1480b: 68 50 c0 01 00 push $0x1c050\r
+ 14810: e8 50 50 00 00 call 19865 <_my_wake_up>\r
+ 14815: 83 c4 10 add $0x10,%esp\r
+ 14818: 83 ec 0c sub $0xc,%esp\r
+ 1481b: ff 75 08 pushl 0x8(%ebp)\r
+ 1481e: e8 50 fb ff ff call 14373 <_hub_power_on>\r
+ 14823: 83 c4 10 add $0x10,%esp\r
+ 14826: c7 45 b4 00 00 00 00 movl $0x0,0xffffffb4(%ebp)\r
+ 1482d: eb 06 jmp 14835 <_hub_configure+0x3e6>\r
+ 1482f: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 14832: 89 45 b4 mov %eax,0xffffffb4(%ebp)\r
+ 14835: 8b 45 b4 mov 0xffffffb4(%ebp),%eax\r
+ 14838: 8b 5d fc mov 0xfffffffc(%ebp),%ebx\r
+ 1483b: c9 leave \r
+ 1483c: c3 ret \r
+\r
+0001483d <_usb_fill_int_urb>:\r
+ 1483d: 55 push %ebp\r
+ 1483e: 89 e5 mov %esp,%ebp\r
+ 14840: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 14843: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 14846: 89 42 14 mov %eax,0x14(%edx)\r
+ 14849: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 1484c: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 1484f: 89 42 18 mov %eax,0x18(%edx)\r
+ 14852: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 14855: 8b 45 14 mov 0x14(%ebp),%eax\r
+ 14858: 89 42 24 mov %eax,0x24(%edx)\r
+ 1485b: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 1485e: 8b 45 18 mov 0x18(%ebp),%eax\r
+ 14861: 89 42 2c mov %eax,0x2c(%edx)\r
+ 14864: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 14867: 8b 45 1c mov 0x1c(%ebp),%eax\r
+ 1486a: 89 42 58 mov %eax,0x58(%edx)\r
+ 1486d: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 14870: 8b 45 20 mov 0x20(%ebp),%eax\r
+ 14873: 89 42 54 mov %eax,0x54(%edx)\r
+ 14876: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 14879: 83 78 18 03 cmpl $0x3,0x18(%eax)\r
+ 1487d: 75 13 jne 14892 <_usb_fill_int_urb+0x55>\r
+ 1487f: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 14882: 8b 4d 24 mov 0x24(%ebp),%ecx\r
+ 14885: 49 dec %ecx\r
+ 14886: b8 01 00 00 00 mov $0x1,%eax\r
+ 1488b: d3 e0 shl %cl,%eax\r
+ 1488d: 89 42 48 mov %eax,0x48(%edx)\r
+ 14890: eb 09 jmp 1489b <_usb_fill_int_urb+0x5e>\r
+ 14892: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 14895: 8b 45 24 mov 0x24(%ebp),%eax\r
+ 14898: 89 42 48 mov %eax,0x48(%edx)\r
+ 1489b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1489e: c7 40 40 ff ff ff ff movl $0xffffffff,0x40(%eax)\r
+ 148a5: 5d pop %ebp\r
+ 148a6: c3 ret \r
+\r
+000148a7 <_hubdev>:\r
+ 148a7: 55 push %ebp\r
+ 148a8: 89 e5 mov %esp,%ebp\r
+ 148aa: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 148ad: 8b 80 88 01 00 00 mov 0x188(%eax),%eax\r
+ 148b3: 8b 40 0c mov 0xc(%eax),%eax\r
+ 148b6: 83 c0 18 add $0x18,%eax\r
+ 148b9: 5d pop %ebp\r
+ 148ba: c3 ret \r
+\r
+000148bb <_hub_disconnect>:\r
+ 148bb: 55 push %ebp\r
+ 148bc: 89 e5 mov %esp,%ebp\r
+ 148be: 83 ec 18 sub $0x18,%esp\r
+ 148c1: 83 ec 0c sub $0xc,%esp\r
+ 148c4: ff 75 08 pushl 0x8(%ebp)\r
+ 148c7: e8 66 01 00 00 call 14a32 <_usb_get_intfdata>\r
+ 148cc: 83 c4 10 add $0x10,%esp\r
+ 148cf: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 148d2: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 148d6: 75 05 jne 148dd <_hub_disconnect+0x22>\r
+ 148d8: e9 3f 01 00 00 jmp 14a1c <_hub_disconnect+0x161>\r
+ 148dd: 83 ec 08 sub $0x8,%esp\r
+ 148e0: 6a 00 push $0x0\r
+ 148e2: ff 75 08 pushl 0x8(%ebp)\r
+ 148e5: e8 34 01 00 00 call 14a1e <_usb_set_intfdata>\r
+ 148ea: 83 c4 10 add $0x10,%esp\r
+ 148ed: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 148f4: 83 ec 0c sub $0xc,%esp\r
+ 148f7: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 148fa: 83 c0 24 add $0x24,%eax\r
+ 148fd: 50 push %eax\r
+ 148fe: e8 09 f9 ff ff call 1420c <_list_del>\r
+ 14903: 83 c4 10 add $0x10,%esp\r
+ 14906: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 14909: 83 c2 24 add $0x24,%edx\r
+ 1490c: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1490f: 83 c0 24 add $0x24,%eax\r
+ 14912: 89 02 mov %eax,(%edx)\r
+ 14914: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 14917: 83 c2 24 add $0x24,%edx\r
+ 1491a: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1491d: 83 c0 24 add $0x24,%eax\r
+ 14920: 89 42 04 mov %eax,0x4(%edx)\r
+ 14923: 83 ec 0c sub $0xc,%esp\r
+ 14926: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14929: 83 c0 1c add $0x1c,%eax\r
+ 1492c: 50 push %eax\r
+ 1492d: e8 da f8 ff ff call 1420c <_list_del>\r
+ 14932: 83 c4 10 add $0x10,%esp\r
+ 14935: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 14938: 83 c2 1c add $0x1c,%edx\r
+ 1493b: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1493e: 83 c0 1c add $0x1c,%eax\r
+ 14941: 89 02 mov %eax,(%edx)\r
+ 14943: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 14946: 83 c2 1c add $0x1c,%edx\r
+ 14949: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1494c: 83 c0 1c add $0x1c,%eax\r
+ 1494f: 89 42 04 mov %eax,0x4(%edx)\r
+ 14952: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14955: 83 78 04 00 cmpl $0x0,0x4(%eax)\r
+ 14959: 74 2c je 14987 <_hub_disconnect+0xcc>\r
+ 1495b: 83 ec 0c sub $0xc,%esp\r
+ 1495e: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14961: ff 70 04 pushl 0x4(%eax)\r
+ 14964: e8 51 3b 00 00 call 184ba <_usb_unlink_urb@4>\r
+ 14969: 83 c4 0c add $0xc,%esp\r
+ 1496c: 83 ec 0c sub $0xc,%esp\r
+ 1496f: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14972: ff 70 04 pushl 0x4(%eax)\r
+ 14975: e8 bc 37 00 00 call 18136 <_usb_free_urb@4>\r
+ 1497a: 83 c4 0c add $0xc,%esp\r
+ 1497d: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14980: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax)\r
+ 14987: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1498a: 83 78 2c 00 cmpl $0x0,0x2c(%eax)\r
+ 1498e: 74 1b je 149ab <_hub_disconnect+0xf0>\r
+ 14990: 83 ec 0c sub $0xc,%esp\r
+ 14993: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14996: ff 70 2c pushl 0x2c(%eax)\r
+ 14999: e8 a2 50 00 00 call 19a40 <_ExFreePool@4>\r
+ 1499e: 83 c4 0c add $0xc,%esp\r
+ 149a1: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 149a4: c7 40 2c 00 00 00 00 movl $0x0,0x2c(%eax)\r
+ 149ab: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 149ae: 83 78 10 00 cmpl $0x0,0x10(%eax)\r
+ 149b2: 74 1b je 149cf <_hub_disconnect+0x114>\r
+ 149b4: 83 ec 0c sub $0xc,%esp\r
+ 149b7: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 149ba: ff 70 10 pushl 0x10(%eax)\r
+ 149bd: e8 7e 50 00 00 call 19a40 <_ExFreePool@4>\r
+ 149c2: 83 c4 0c add $0xc,%esp\r
+ 149c5: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 149c8: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax)\r
+ 149cf: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 149d2: 83 78 08 00 cmpl $0x0,0x8(%eax)\r
+ 149d6: 74 36 je 14a0e <_hub_disconnect+0x153>\r
+ 149d8: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 149db: 8b 80 b8 00 00 00 mov 0xb8(%eax),%eax\r
+ 149e1: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 149e4: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 149e7: 81 ea c0 00 00 00 sub $0xc0,%edx\r
+ 149ed: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 149f0: ff 70 0c pushl 0xc(%eax)\r
+ 149f3: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 149f6: ff 70 08 pushl 0x8(%eax)\r
+ 149f9: 6a 03 push $0x3\r
+ 149fb: 52 push %edx\r
+ 149fc: e8 d1 26 00 00 call 170d2 <_usb_buffer_free>\r
+ 14a01: 83 c4 10 add $0x10,%esp\r
+ 14a04: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14a07: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax)\r
+ 14a0e: 83 ec 0c sub $0xc,%esp\r
+ 14a11: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 14a14: e8 27 50 00 00 call 19a40 <_ExFreePool@4>\r
+ 14a19: 83 c4 0c add $0xc,%esp\r
+ 14a1c: c9 leave \r
+ 14a1d: c3 ret \r
+\r
+00014a1e <_usb_set_intfdata>:\r
+ 14a1e: 55 push %ebp\r
+ 14a1f: 89 e5 mov %esp,%ebp\r
+ 14a21: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 14a24: 83 c2 18 add $0x18,%edx\r
+ 14a27: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 14a2a: 89 82 9c 00 00 00 mov %eax,0x9c(%edx)\r
+ 14a30: 5d pop %ebp\r
+ 14a31: c3 ret \r
+\r
+00014a32 <_usb_get_intfdata>:\r
+ 14a32: 55 push %ebp\r
+ 14a33: 89 e5 mov %esp,%ebp\r
+ 14a35: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14a38: 83 c0 18 add $0x18,%eax\r
+ 14a3b: 8b 80 9c 00 00 00 mov 0x9c(%eax),%eax\r
+ 14a41: 5d pop %ebp\r
+ 14a42: c3 ret \r
+\r
+00014a43 <_hub_probe>:\r
+ 14a43: 55 push %ebp\r
+ 14a44: 89 e5 mov %esp,%ebp\r
+ 14a46: 83 ec 28 sub $0x28,%esp\r
+ 14a49: 8b 4d 08 mov 0x8(%ebp),%ecx\r
+ 14a4c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14a4f: 8b 50 04 mov 0x4(%eax),%edx\r
+ 14a52: 89 d0 mov %edx,%eax\r
+ 14a54: 01 c0 add %eax,%eax\r
+ 14a56: 01 d0 add %edx,%eax\r
+ 14a58: c1 e0 03 shl $0x3,%eax\r
+ 14a5b: 03 01 add (%ecx),%eax\r
+ 14a5d: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 14a60: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14a63: 8b 80 b8 00 00 00 mov 0xb8(%eax),%eax\r
+ 14a69: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 14a6c: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 14a6f: 2d c0 00 00 00 sub $0xc0,%eax\r
+ 14a74: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 14a77: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14a7a: 80 78 06 00 cmpb $0x0,0x6(%eax)\r
+ 14a7e: 74 15 je 14a95 <_hub_probe+0x52>\r
+ 14a80: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14a83: 80 78 06 01 cmpb $0x1,0x6(%eax)\r
+ 14a87: 74 0c je 14a95 <_hub_probe+0x52>\r
+ 14a89: c7 45 e4 fb ff ff ff movl $0xfffffffb,0xffffffe4(%ebp)\r
+ 14a90: e9 22 01 00 00 jmp 14bb7 <_hub_probe+0x174>\r
+ 14a95: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14a98: 80 78 04 01 cmpb $0x1,0x4(%eax)\r
+ 14a9c: 74 02 je 14aa0 <_hub_probe+0x5d>\r
+ 14a9e: eb e9 jmp 14a89 <_hub_probe+0x46>\r
+ 14aa0: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14aa3: 8b 40 0c mov 0xc(%eax),%eax\r
+ 14aa6: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 14aa9: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 14aac: 80 78 02 00 cmpb $0x0,0x2(%eax)\r
+ 14ab0: 78 02 js 14ab4 <_hub_probe+0x71>\r
+ 14ab2: eb d5 jmp 14a89 <_hub_probe+0x46>\r
+ 14ab4: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 14ab7: 8a 40 03 mov 0x3(%eax),%al\r
+ 14aba: 25 ff 00 00 00 and $0xff,%eax\r
+ 14abf: 83 e0 03 and $0x3,%eax\r
+ 14ac2: 83 f8 03 cmp $0x3,%eax\r
+ 14ac5: 74 02 je 14ac9 <_hub_probe+0x86>\r
+ 14ac7: eb c0 jmp 14a89 <_hub_probe+0x46>\r
+ 14ac9: 83 ec 08 sub $0x8,%esp\r
+ 14acc: 6a 4c push $0x4c\r
+ 14ace: 6a 01 push $0x1\r
+ 14ad0: e8 5b 4f 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 14ad5: 83 c4 08 add $0x8,%esp\r
+ 14ad8: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 14adb: 83 7d f0 00 cmpl $0x0,0xfffffff0(%ebp)\r
+ 14adf: 75 0c jne 14aed <_hub_probe+0xaa>\r
+ 14ae1: c7 45 e4 f4 ff ff ff movl $0xfffffff4,0xffffffe4(%ebp)\r
+ 14ae8: e9 ca 00 00 00 jmp 14bb7 <_hub_probe+0x174>\r
+ 14aed: 83 ec 04 sub $0x4,%esp\r
+ 14af0: 6a 4c push $0x4c\r
+ 14af2: 6a 00 push $0x0\r
+ 14af4: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 14af7: e8 54 4f 00 00 call 19a50 <_memset>\r
+ 14afc: 83 c4 10 add $0x10,%esp\r
+ 14aff: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 14b02: 83 c2 24 add $0x24,%edx\r
+ 14b05: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 14b08: 83 c0 24 add $0x24,%eax\r
+ 14b0b: 89 02 mov %eax,(%edx)\r
+ 14b0d: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 14b10: 83 c2 24 add $0x24,%edx\r
+ 14b13: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 14b16: 83 c0 24 add $0x24,%eax\r
+ 14b19: 89 42 04 mov %eax,0x4(%edx)\r
+ 14b1c: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 14b1f: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14b22: 89 02 mov %eax,(%edx)\r
+ 14b24: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 14b2b: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 14b2e: 83 c2 1c add $0x1c,%edx\r
+ 14b31: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 14b34: 83 c0 1c add $0x1c,%eax\r
+ 14b37: 89 02 mov %eax,(%edx)\r
+ 14b39: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 14b3c: 83 c2 1c add $0x1c,%edx\r
+ 14b3f: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 14b42: 83 c0 1c add $0x1c,%eax\r
+ 14b45: 89 42 04 mov %eax,0x4(%edx)\r
+ 14b48: 83 ec 08 sub $0x8,%esp\r
+ 14b4b: 68 48 a0 01 00 push $0x1a048\r
+ 14b50: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 14b53: 83 c0 1c add $0x1c,%eax\r
+ 14b56: 50 push %eax\r
+ 14b57: e8 5d f5 ff ff call 140b9 <_list_add>\r
+ 14b5c: 83 c4 10 add $0x10,%esp\r
+ 14b5f: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 14b62: ff 75 08 pushl 0x8(%ebp)\r
+ 14b65: e8 b4 fe ff ff call 14a1e <_usb_set_intfdata>\r
+ 14b6a: 83 c4 08 add $0x8,%esp\r
+ 14b6d: 83 ec 08 sub $0x8,%esp\r
+ 14b70: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 14b73: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 14b76: e8 d4 f8 ff ff call 1444f <_hub_configure>\r
+ 14b7b: 83 c4 10 add $0x10,%esp\r
+ 14b7e: 85 c0 test %eax,%eax\r
+ 14b80: 78 20 js 14ba2 <_hub_probe+0x15f>\r
+ 14b82: 83 ec 08 sub $0x8,%esp\r
+ 14b85: 68 37 b2 01 00 push $0x1b237\r
+ 14b8a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14b8d: 83 c0 18 add $0x18,%eax\r
+ 14b90: 50 push %eax\r
+ 14b91: e8 0a 4f 00 00 call 19aa0 <_strcpy>\r
+ 14b96: 83 c4 10 add $0x10,%esp\r
+ 14b99: c7 45 e4 00 00 00 00 movl $0x0,0xffffffe4(%ebp)\r
+ 14ba0: eb 15 jmp 14bb7 <_hub_probe+0x174>\r
+ 14ba2: 83 ec 0c sub $0xc,%esp\r
+ 14ba5: ff 75 08 pushl 0x8(%ebp)\r
+ 14ba8: e8 0e fd ff ff call 148bb <_hub_disconnect>\r
+ 14bad: 83 c4 10 add $0x10,%esp\r
+ 14bb0: c7 45 e4 ed ff ff ff movl $0xffffffed,0xffffffe4(%ebp)\r
+ 14bb7: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 14bba: c9 leave \r
+ 14bbb: c3 ret \r
+\r
+00014bbc <_hub_ioctl>:\r
+ 14bbc: 55 push %ebp\r
+ 14bbd: 89 e5 mov %esp,%ebp\r
+ 14bbf: 53 push %ebx\r
+ 14bc0: 83 ec 14 sub $0x14,%esp\r
+ 14bc3: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14bc6: 8b 80 b8 00 00 00 mov 0xb8(%eax),%eax\r
+ 14bcc: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 14bcf: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 14bd2: 2d c0 00 00 00 sub $0xc0,%eax\r
+ 14bd7: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 14bda: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 14bdd: 3d d2 04 00 00 cmp $0x4d2,%eax\r
+ 14be2: 74 05 je 14be9 <_hub_ioctl+0x2d>\r
+ 14be4: e9 8a 00 00 00 jmp 14c73 <_hub_ioctl+0xb7>\r
+ 14be9: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 14bec: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 14bef: c7 45 f0 00 00 00 00 movl $0x0,0xfffffff0(%ebp)\r
+ 14bf6: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 14bf9: 83 38 00 cmpl $0x0,(%eax)\r
+ 14bfc: 7f 0b jg 14c09 <_hub_ioctl+0x4d>\r
+ 14bfe: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 14c01: c7 00 00 00 00 00 movl $0x0,(%eax)\r
+ 14c07: eb 5f jmp 14c68 <_hub_ioctl+0xac>\r
+ 14c09: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 14c0c: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 14c0f: 8b 92 ac 01 00 00 mov 0x1ac(%edx),%edx\r
+ 14c15: 89 10 mov %edx,(%eax)\r
+ 14c17: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 14c1e: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 14c21: 8b 00 mov (%eax),%eax\r
+ 14c23: 3b 45 ec cmp 0xffffffec(%ebp),%eax\r
+ 14c26: 7e 40 jle 14c68 <_hub_ioctl+0xac>\r
+ 14c28: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 14c2b: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 14c2e: 83 bc 82 b0 01 00 00 cmpl $0x0,0x1b0(%edx,%eax,4)\r
+ 14c35: 00 \r
+ 14c36: 75 10 jne 14c48 <_hub_ioctl+0x8c>\r
+ 14c38: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 14c3b: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 14c3e: c7 44 82 04 00 00 00 movl $0x0,0x4(%edx,%eax,4)\r
+ 14c45: 00 \r
+ 14c46: eb 19 jmp 14c61 <_hub_ioctl+0xa5>\r
+ 14c48: 8b 5d f4 mov 0xfffffff4(%ebp),%ebx\r
+ 14c4b: 8b 4d ec mov 0xffffffec(%ebp),%ecx\r
+ 14c4e: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 14c51: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 14c54: 8b 84 82 b0 01 00 00 mov 0x1b0(%edx,%eax,4),%eax\r
+ 14c5b: 8b 00 mov (%eax),%eax\r
+ 14c5d: 89 44 8b 04 mov %eax,0x4(%ebx,%ecx,4)\r
+ 14c61: 8d 45 ec lea 0xffffffec(%ebp),%eax\r
+ 14c64: ff 00 incl (%eax)\r
+ 14c66: eb b6 jmp 14c1e <_hub_ioctl+0x62>\r
+ 14c68: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 14c6b: 8b 00 mov (%eax),%eax\r
+ 14c6d: 40 inc %eax\r
+ 14c6e: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 14c71: eb 07 jmp 14c7a <_hub_ioctl+0xbe>\r
+ 14c73: c7 45 e8 da ff ff ff movl $0xffffffda,0xffffffe8(%ebp)\r
+ 14c7a: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 14c7d: 83 c4 14 add $0x14,%esp\r
+ 14c80: 5b pop %ebx\r
+ 14c81: 5d pop %ebp\r
+ 14c82: c3 ret \r
+\r
+00014c83 <_hub_reset>:\r
+ 14c83: 55 push %ebp\r
+ 14c84: 89 e5 mov %esp,%ebp\r
+ 14c86: 83 ec 18 sub $0x18,%esp\r
+ 14c89: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14c8c: 8b 00 mov (%eax),%eax\r
+ 14c8e: 8b 80 b8 00 00 00 mov 0xb8(%eax),%eax\r
+ 14c94: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 14c97: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 14c9a: 2d c0 00 00 00 sub $0xc0,%eax\r
+ 14c9f: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 14ca2: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 14ca9: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14cac: 8b 40 2c mov 0x2c(%eax),%eax\r
+ 14caf: 8a 40 02 mov 0x2(%eax),%al\r
+ 14cb2: 25 ff 00 00 00 and $0xff,%eax\r
+ 14cb7: 3b 45 f8 cmp 0xfffffff8(%ebp),%eax\r
+ 14cba: 7e 31 jle 14ced <_hub_reset+0x6a>\r
+ 14cbc: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 14cbf: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 14cc2: 83 bc 82 b0 01 00 00 cmpl $0x0,0x1b0(%edx,%eax,4)\r
+ 14cc9: 00 \r
+ 14cca: 74 1a je 14ce6 <_hub_reset+0x63>\r
+ 14ccc: 83 ec 0c sub $0xc,%esp\r
+ 14ccf: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 14cd2: c1 e0 02 shl $0x2,%eax\r
+ 14cd5: 03 45 fc add 0xfffffffc(%ebp),%eax\r
+ 14cd8: 05 b0 01 00 00 add $0x1b0,%eax\r
+ 14cdd: 50 push %eax\r
+ 14cde: e8 2e 19 00 00 call 16611 <_usb_disconnect>\r
+ 14ce3: 83 c4 10 add $0x10,%esp\r
+ 14ce6: 8d 45 f8 lea 0xfffffff8(%ebp),%eax\r
+ 14ce9: ff 00 incl (%eax)\r
+ 14ceb: eb bc jmp 14ca9 <_hub_reset+0x26>\r
+ 14ced: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14cf0: 83 78 04 00 cmpl $0x0,0x4(%eax)\r
+ 14cf4: 74 13 je 14d09 <_hub_reset+0x86>\r
+ 14cf6: 83 ec 0c sub $0xc,%esp\r
+ 14cf9: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14cfc: ff 70 04 pushl 0x4(%eax)\r
+ 14cff: e8 b6 37 00 00 call 184ba <_usb_unlink_urb@4>\r
+ 14d04: 83 c4 0c add $0xc,%esp\r
+ 14d07: eb 09 jmp 14d12 <_hub_reset+0x8f>\r
+ 14d09: c7 45 f4 ff ff ff ff movl $0xffffffff,0xfffffff4(%ebp)\r
+ 14d10: eb 5c jmp 14d6e <_hub_reset+0xeb>\r
+ 14d12: 83 ec 0c sub $0xc,%esp\r
+ 14d15: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 14d18: e8 a3 0d 00 00 call 15ac0 <_usb_reset_device>\r
+ 14d1d: 83 c4 10 add $0x10,%esp\r
+ 14d20: 85 c0 test %eax,%eax\r
+ 14d22: 74 09 je 14d2d <_hub_reset+0xaa>\r
+ 14d24: c7 45 f4 ff ff ff ff movl $0xffffffff,0xfffffff4(%ebp)\r
+ 14d2b: eb 41 jmp 14d6e <_hub_reset+0xeb>\r
+ 14d2d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14d30: 8b 50 04 mov 0x4(%eax),%edx\r
+ 14d33: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14d36: 89 42 14 mov %eax,0x14(%edx)\r
+ 14d39: 83 ec 08 sub $0x8,%esp\r
+ 14d3c: 6a 00 push $0x0\r
+ 14d3e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14d41: ff 70 04 pushl 0x4(%eax)\r
+ 14d44: e8 5a 34 00 00 call 181a3 <_usb_submit_urb@8>\r
+ 14d49: 83 c4 08 add $0x8,%esp\r
+ 14d4c: 85 c0 test %eax,%eax\r
+ 14d4e: 74 09 je 14d59 <_hub_reset+0xd6>\r
+ 14d50: c7 45 f4 ff ff ff ff movl $0xffffffff,0xfffffff4(%ebp)\r
+ 14d57: eb 15 jmp 14d6e <_hub_reset+0xeb>\r
+ 14d59: 83 ec 0c sub $0xc,%esp\r
+ 14d5c: ff 75 08 pushl 0x8(%ebp)\r
+ 14d5f: e8 0f f6 ff ff call 14373 <_hub_power_on>\r
+ 14d64: 83 c4 10 add $0x10,%esp\r
+ 14d67: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 14d6e: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 14d71: c9 leave \r
+ 14d72: c3 ret \r
+\r
+00014d73 <_hub_start_disconnect>:\r
+ 14d73: 55 push %ebp\r
+ 14d74: 89 e5 mov %esp,%ebp\r
+ 14d76: 83 ec 08 sub $0x8,%esp\r
+ 14d79: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14d7c: 8b 80 b8 00 00 00 mov 0xb8(%eax),%eax\r
+ 14d82: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 14d85: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 14d89: 74 4a je 14dd5 <_hub_start_disconnect+0x62>\r
+ 14d8b: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 14d92: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14d95: 8b 80 ac 01 00 00 mov 0x1ac(%eax),%eax\r
+ 14d9b: 3b 45 f8 cmp 0xfffffff8(%ebp),%eax\r
+ 14d9e: 7e 35 jle 14dd5 <_hub_start_disconnect+0x62>\r
+ 14da0: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14da3: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 14da6: 8b 84 90 b0 01 00 00 mov 0x1b0(%eax,%edx,4),%eax\r
+ 14dad: 3b 45 08 cmp 0x8(%ebp),%eax\r
+ 14db0: 75 1c jne 14dce <_hub_start_disconnect+0x5b>\r
+ 14db2: 83 ec 0c sub $0xc,%esp\r
+ 14db5: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 14db8: c1 e0 02 shl $0x2,%eax\r
+ 14dbb: 03 45 fc add 0xfffffffc(%ebp),%eax\r
+ 14dbe: 05 b0 01 00 00 add $0x1b0,%eax\r
+ 14dc3: 50 push %eax\r
+ 14dc4: e8 48 18 00 00 call 16611 <_usb_disconnect>\r
+ 14dc9: 83 c4 10 add $0x10,%esp\r
+ 14dcc: eb 07 jmp 14dd5 <_hub_start_disconnect+0x62>\r
+ 14dce: 8d 45 f8 lea 0xfffffff8(%ebp),%eax\r
+ 14dd1: ff 00 incl (%eax)\r
+ 14dd3: eb bd jmp 14d92 <_hub_start_disconnect+0x1f>\r
+ 14dd5: c9 leave \r
+ 14dd6: c3 ret \r
+\r
+00014dd7 <_hub_port_status>:\r
+ 14dd7: 55 push %ebp\r
+ 14dd8: 89 e5 mov %esp,%ebp\r
+ 14dda: 83 ec 08 sub $0x8,%esp\r
+ 14ddd: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14de0: 8b 80 88 01 00 00 mov 0x188(%eax),%eax\r
+ 14de6: ff 70 0c pushl 0xc(%eax)\r
+ 14de9: e8 44 fc ff ff call 14a32 <_usb_get_intfdata>\r
+ 14dee: 83 c4 04 add $0x4,%esp\r
+ 14df1: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 14df4: 83 ec 04 sub $0x4,%esp\r
+ 14df7: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14dfa: ff 70 10 pushl 0x10(%eax)\r
+ 14dfd: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 14e00: 40 inc %eax\r
+ 14e01: 50 push %eax\r
+ 14e02: ff 75 08 pushl 0x8(%ebp)\r
+ 14e05: e8 99 f1 ff ff call 13fa3 <_get_port_status>\r
+ 14e0a: 83 c4 10 add $0x10,%esp\r
+ 14e0d: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 14e10: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 14e14: 79 02 jns 14e18 <_hub_port_status+0x41>\r
+ 14e16: eb 26 jmp 14e3e <_hub_port_status+0x67>\r
+ 14e18: 8b 55 10 mov 0x10(%ebp),%edx\r
+ 14e1b: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14e1e: 8b 40 10 mov 0x10(%eax),%eax\r
+ 14e21: 66 8b 00 mov (%eax),%ax\r
+ 14e24: 66 89 02 mov %ax,(%edx)\r
+ 14e27: 8b 55 14 mov 0x14(%ebp),%edx\r
+ 14e2a: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14e2d: 8b 40 10 mov 0x10(%eax),%eax\r
+ 14e30: 66 8b 40 02 mov 0x2(%eax),%ax\r
+ 14e34: 66 89 02 mov %ax,(%edx)\r
+ 14e37: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 14e3e: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 14e41: c9 leave \r
+ 14e42: c3 ret \r
+\r
+00014e43 <_hub_port_wait_reset>:\r
+ 14e43: 55 push %ebp\r
+ 14e44: 89 e5 mov %esp,%ebp\r
+ 14e46: 83 ec 18 sub $0x18,%esp\r
+ 14e49: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 14e50: 81 7d fc f3 01 00 00 cmpl $0x1f3,0xfffffffc(%ebp)\r
+ 14e57: 0f 8f 00 01 00 00 jg 14f5d <_hub_port_wait_reset+0x11a>\r
+ 14e5d: 83 ec 0c sub $0xc,%esp\r
+ 14e60: ff 75 14 pushl 0x14(%ebp)\r
+ 14e63: e8 48 46 00 00 call 194b0 <_wait_ms>\r
+ 14e68: 83 c4 10 add $0x10,%esp\r
+ 14e6b: 8d 45 f4 lea 0xfffffff4(%ebp),%eax\r
+ 14e6e: 50 push %eax\r
+ 14e6f: 8d 45 f6 lea 0xfffffff6(%ebp),%eax\r
+ 14e72: 50 push %eax\r
+ 14e73: ff 75 0c pushl 0xc(%ebp)\r
+ 14e76: ff 75 08 pushl 0x8(%ebp)\r
+ 14e79: e8 59 ff ff ff call 14dd7 <_hub_port_status>\r
+ 14e7e: 83 c4 10 add $0x10,%esp\r
+ 14e81: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 14e84: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 14e88: 79 0c jns 14e96 <_hub_port_wait_reset+0x53>\r
+ 14e8a: c7 45 f0 ff ff ff ff movl $0xffffffff,0xfffffff0(%ebp)\r
+ 14e91: e9 ce 00 00 00 jmp 14f64 <_hub_port_wait_reset+0x121>\r
+ 14e96: 66 8b 45 f6 mov 0xfffffff6(%ebp),%ax\r
+ 14e9a: 25 ff ff 00 00 and $0xffff,%eax\r
+ 14e9f: 83 e0 01 and $0x1,%eax\r
+ 14ea2: 85 c0 test %eax,%eax\r
+ 14ea4: 75 0c jne 14eb2 <_hub_port_wait_reset+0x6f>\r
+ 14ea6: c7 45 f0 01 00 00 00 movl $0x1,0xfffffff0(%ebp)\r
+ 14ead: e9 b2 00 00 00 jmp 14f64 <_hub_port_wait_reset+0x121>\r
+ 14eb2: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 14eb5: 25 ff ff 00 00 and $0xffff,%eax\r
+ 14eba: 83 e0 01 and $0x1,%eax\r
+ 14ebd: 85 c0 test %eax,%eax\r
+ 14ebf: 74 0c je 14ecd <_hub_port_wait_reset+0x8a>\r
+ 14ec1: c7 45 f0 ff ff ff ff movl $0xffffffff,0xfffffff0(%ebp)\r
+ 14ec8: e9 97 00 00 00 jmp 14f64 <_hub_port_wait_reset+0x121>\r
+ 14ecd: 66 8b 45 f6 mov 0xfffffff6(%ebp),%ax\r
+ 14ed1: 25 ff ff 00 00 and $0xffff,%eax\r
+ 14ed6: c1 e8 04 shr $0x4,%eax\r
+ 14ed9: 83 e0 01 and $0x1,%eax\r
+ 14edc: 85 c0 test %eax,%eax\r
+ 14ede: 75 63 jne 14f43 <_hub_port_wait_reset+0x100>\r
+ 14ee0: 66 8b 45 f6 mov 0xfffffff6(%ebp),%ax\r
+ 14ee4: 25 ff ff 00 00 and $0xffff,%eax\r
+ 14ee9: d1 e8 shr %eax\r
+ 14eeb: 83 e0 01 and $0x1,%eax\r
+ 14eee: 85 c0 test %eax,%eax\r
+ 14ef0: 74 51 je 14f43 <_hub_port_wait_reset+0x100>\r
+ 14ef2: 66 8b 45 f6 mov 0xfffffff6(%ebp),%ax\r
+ 14ef6: 25 ff ff 00 00 and $0xffff,%eax\r
+ 14efb: c1 e8 0a shr $0xa,%eax\r
+ 14efe: 83 e0 01 and $0x1,%eax\r
+ 14f01: 85 c0 test %eax,%eax\r
+ 14f03: 74 0c je 14f11 <_hub_port_wait_reset+0xce>\r
+ 14f05: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 14f08: c7 40 18 03 00 00 00 movl $0x3,0x18(%eax)\r
+ 14f0f: eb 29 jmp 14f3a <_hub_port_wait_reset+0xf7>\r
+ 14f11: 66 8b 45 f6 mov 0xfffffff6(%ebp),%ax\r
+ 14f15: 25 ff ff 00 00 and $0xffff,%eax\r
+ 14f1a: c1 e8 09 shr $0x9,%eax\r
+ 14f1d: 83 e0 01 and $0x1,%eax\r
+ 14f20: 85 c0 test %eax,%eax\r
+ 14f22: 74 0c je 14f30 <_hub_port_wait_reset+0xed>\r
+ 14f24: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 14f27: c7 40 18 01 00 00 00 movl $0x1,0x18(%eax)\r
+ 14f2e: eb 0a jmp 14f3a <_hub_port_wait_reset+0xf7>\r
+ 14f30: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 14f33: c7 40 18 02 00 00 00 movl $0x2,0x18(%eax)\r
+ 14f3a: c7 45 f0 00 00 00 00 movl $0x0,0xfffffff0(%ebp)\r
+ 14f41: eb 21 jmp 14f64 <_hub_port_wait_reset+0x121>\r
+ 14f43: 83 7d fc 13 cmpl $0x13,0xfffffffc(%ebp)\r
+ 14f47: 7e 07 jle 14f50 <_hub_port_wait_reset+0x10d>\r
+ 14f49: c7 45 14 c8 00 00 00 movl $0xc8,0x14(%ebp)\r
+ 14f50: 8b 55 14 mov 0x14(%ebp),%edx\r
+ 14f53: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 14f56: 01 10 add %edx,(%eax)\r
+ 14f58: e9 f3 fe ff ff jmp 14e50 <_hub_port_wait_reset+0xd>\r
+ 14f5d: c7 45 f0 ff ff ff ff movl $0xffffffff,0xfffffff0(%ebp)\r
+ 14f64: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 14f67: c9 leave \r
+ 14f68: c3 ret \r
+\r
+00014f69 <_hub_port_reset>:\r
+ 14f69: 55 push %ebp\r
+ 14f6a: 89 e5 mov %esp,%ebp\r
+ 14f6c: 83 ec 18 sub $0x18,%esp\r
+ 14f6f: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 14f76: 83 7d fc 04 cmpl $0x4,0xfffffffc(%ebp)\r
+ 14f7a: 0f 8f 85 00 00 00 jg 15005 <_hub_port_reset+0x9c>\r
+ 14f80: 83 ec 04 sub $0x4,%esp\r
+ 14f83: 6a 04 push $0x4\r
+ 14f85: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 14f88: 40 inc %eax\r
+ 14f89: 50 push %eax\r
+ 14f8a: ff 75 08 pushl 0x8(%ebp)\r
+ 14f8d: e8 8e ef ff ff call 13f20 <_set_port_feature>\r
+ 14f92: 83 c4 10 add $0x10,%esp\r
+ 14f95: ff 75 14 pushl 0x14(%ebp)\r
+ 14f98: ff 75 10 pushl 0x10(%ebp)\r
+ 14f9b: ff 75 0c pushl 0xc(%ebp)\r
+ 14f9e: ff 75 08 pushl 0x8(%ebp)\r
+ 14fa1: e8 9d fe ff ff call 14e43 <_hub_port_wait_reset>\r
+ 14fa6: 83 c4 10 add $0x10,%esp\r
+ 14fa9: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 14fac: 83 7d f8 ff cmpl $0xffffffff,0xfffffff8(%ebp)\r
+ 14fb0: 74 42 je 14ff4 <_hub_port_reset+0x8b>\r
+ 14fb2: 83 ec 04 sub $0x4,%esp\r
+ 14fb5: 6a 14 push $0x14\r
+ 14fb7: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 14fba: 40 inc %eax\r
+ 14fbb: 50 push %eax\r
+ 14fbc: ff 75 08 pushl 0x8(%ebp)\r
+ 14fbf: e8 17 ef ff ff call 13edb <_clear_port_feature>\r
+ 14fc4: 83 c4 10 add $0x10,%esp\r
+ 14fc7: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 14fca: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 14fcd: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 14fd1: 74 09 je 14fdc <_hub_port_reset+0x73>\r
+ 14fd3: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 14fda: eb 07 jmp 14fe3 <_hub_port_reset+0x7a>\r
+ 14fdc: c7 45 ec 03 00 00 00 movl $0x3,0xffffffec(%ebp)\r
+ 14fe3: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 14fe6: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 14fe9: 89 42 14 mov %eax,0x14(%edx)\r
+ 14fec: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 14fef: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 14ff2: eb 18 jmp 1500c <_hub_port_reset+0xa3>\r
+ 14ff4: c7 45 14 c8 00 00 00 movl $0xc8,0x14(%ebp)\r
+ 14ffb: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 14ffe: ff 00 incl (%eax)\r
+ 15000: e9 71 ff ff ff jmp 14f76 <_hub_port_reset+0xd>\r
+ 15005: c7 45 f4 ff ff ff ff movl $0xffffffff,0xfffffff4(%ebp)\r
+ 1500c: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 1500f: c9 leave \r
+ 15010: c3 ret \r
+\r
+00015011 <_hub_port_disable>:\r
+ 15011: 55 push %ebp\r
+ 15012: 89 e5 mov %esp,%ebp\r
+ 15014: 83 ec 08 sub $0x8,%esp\r
+ 15017: 83 ec 04 sub $0x4,%esp\r
+ 1501a: 6a 01 push $0x1\r
+ 1501c: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1501f: 40 inc %eax\r
+ 15020: 50 push %eax\r
+ 15021: ff 75 08 pushl 0x8(%ebp)\r
+ 15024: e8 b2 ee ff ff call 13edb <_clear_port_feature>\r
+ 15029: 83 c4 10 add $0x10,%esp\r
+ 1502c: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 1502f: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 15032: c9 leave \r
+ 15033: c3 ret \r
+\r
+00015034 <_hub_port_debounce>:\r
+ 15034: 55 push %ebp\r
+ 15035: 89 e5 mov %esp,%ebp\r
+ 15037: 83 ec 28 sub $0x28,%esp\r
+ 1503a: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 15041: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 15048: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 1504f: 81 7d f8 8f 01 00 00 cmpl $0x18f,0xfffffff8(%ebp)\r
+ 15056: 0f 8f a0 00 00 00 jg 150fc <_hub_port_debounce+0xc8>\r
+ 1505c: 83 ec 0c sub $0xc,%esp\r
+ 1505f: 6a 19 push $0x19\r
+ 15061: e8 4a 44 00 00 call 194b0 <_wait_ms>\r
+ 15066: 83 c4 10 add $0x10,%esp\r
+ 15069: 8d 45 f2 lea 0xfffffff2(%ebp),%eax\r
+ 1506c: 50 push %eax\r
+ 1506d: 8d 45 f0 lea 0xfffffff0(%ebp),%eax\r
+ 15070: 50 push %eax\r
+ 15071: ff 75 0c pushl 0xc(%ebp)\r
+ 15074: ff 75 08 pushl 0x8(%ebp)\r
+ 15077: e8 5b fd ff ff call 14dd7 <_hub_port_status>\r
+ 1507c: 83 c4 10 add $0x10,%esp\r
+ 1507f: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 15082: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 15086: 79 0c jns 15094 <_hub_port_debounce+0x60>\r
+ 15088: c7 45 e8 ff ff ff ff movl $0xffffffff,0xffffffe8(%ebp)\r
+ 1508f: e9 8d 00 00 00 jmp 15121 <_hub_port_debounce+0xed>\r
+ 15094: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 15097: 25 ff ff 00 00 and $0xffff,%eax\r
+ 1509c: 83 e0 01 and $0x1,%eax\r
+ 1509f: 3b 45 ec cmp 0xffffffec(%ebp),%eax\r
+ 150a2: 75 13 jne 150b7 <_hub_port_debounce+0x83>\r
+ 150a4: 83 7d ec 00 cmpl $0x0,0xffffffec(%ebp)\r
+ 150a8: 74 14 je 150be <_hub_port_debounce+0x8a>\r
+ 150aa: 8d 45 f4 lea 0xfffffff4(%ebp),%eax\r
+ 150ad: ff 00 incl (%eax)\r
+ 150af: 83 7d f4 04 cmpl $0x4,0xfffffff4(%ebp)\r
+ 150b3: 75 09 jne 150be <_hub_port_debounce+0x8a>\r
+ 150b5: eb 45 jmp 150fc <_hub_port_debounce+0xc8>\r
+ 150b7: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 150be: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 150c1: 25 ff ff 00 00 and $0xffff,%eax\r
+ 150c6: 83 e0 01 and $0x1,%eax\r
+ 150c9: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 150cc: 66 8b 45 f2 mov 0xfffffff2(%ebp),%ax\r
+ 150d0: 25 ff ff 00 00 and $0xffff,%eax\r
+ 150d5: 83 e0 01 and $0x1,%eax\r
+ 150d8: 85 c0 test %eax,%eax\r
+ 150da: 74 15 je 150f1 <_hub_port_debounce+0xbd>\r
+ 150dc: 83 ec 04 sub $0x4,%esp\r
+ 150df: 6a 10 push $0x10\r
+ 150e1: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 150e4: 40 inc %eax\r
+ 150e5: 50 push %eax\r
+ 150e6: ff 75 08 pushl 0x8(%ebp)\r
+ 150e9: e8 ed ed ff ff call 13edb <_clear_port_feature>\r
+ 150ee: 83 c4 10 add $0x10,%esp\r
+ 150f1: 8d 45 f8 lea 0xfffffff8(%ebp),%eax\r
+ 150f4: 83 00 19 addl $0x19,(%eax)\r
+ 150f7: e9 53 ff ff ff jmp 1504f <_hub_port_debounce+0x1b>\r
+ 150fc: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 150ff: 25 ff ff 00 00 and $0xffff,%eax\r
+ 15104: 83 e0 01 and $0x1,%eax\r
+ 15107: 85 c0 test %eax,%eax\r
+ 15109: 74 09 je 15114 <_hub_port_debounce+0xe0>\r
+ 1510b: c7 45 e4 00 00 00 00 movl $0x0,0xffffffe4(%ebp)\r
+ 15112: eb 07 jmp 1511b <_hub_port_debounce+0xe7>\r
+ 15114: c7 45 e4 01 00 00 00 movl $0x1,0xffffffe4(%ebp)\r
+ 1511b: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 1511e: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 15121: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 15124: c9 leave \r
+ 15125: c3 ret \r
+\r
+00015126 <_hub_port_connect_change>:\r
+ 15126: 55 push %ebp\r
+ 15127: 89 e5 mov %esp,%ebp\r
+ 15129: 83 ec 28 sub $0x28,%esp\r
+ 1512c: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 1512f: 8b 55 14 mov 0x14(%ebp),%edx\r
+ 15132: 66 89 45 fe mov %ax,0xfffffffe(%ebp)\r
+ 15136: 66 89 55 fc mov %dx,0xfffffffc(%ebp)\r
+ 1513a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1513d: 8b 00 mov (%eax),%eax\r
+ 1513f: 8b 80 b8 00 00 00 mov 0xb8(%eax),%eax\r
+ 15145: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 15148: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 1514b: 2d c0 00 00 00 sub $0xc0,%eax\r
+ 15150: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 15153: c7 45 f0 0a 00 00 00 movl $0xa,0xfffffff0(%ebp)\r
+ 1515a: 83 ec 04 sub $0x4,%esp\r
+ 1515d: 6a 10 push $0x10\r
+ 1515f: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 15162: 40 inc %eax\r
+ 15163: 50 push %eax\r
+ 15164: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 15167: e8 6f ed ff ff call 13edb <_clear_port_feature>\r
+ 1516c: 83 c4 10 add $0x10,%esp\r
+ 1516f: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 15172: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 15175: 83 bc 82 b0 01 00 00 cmpl $0x0,0x1b0(%edx,%eax,4)\r
+ 1517c: 00 \r
+ 1517d: 74 1a je 15199 <_hub_port_connect_change+0x73>\r
+ 1517f: 83 ec 0c sub $0xc,%esp\r
+ 15182: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 15185: c1 e0 02 shl $0x2,%eax\r
+ 15188: 03 45 f8 add 0xfffffff8(%ebp),%eax\r
+ 1518b: 05 b0 01 00 00 add $0x1b0,%eax\r
+ 15190: 50 push %eax\r
+ 15191: e8 7b 14 00 00 call 16611 <_usb_disconnect>\r
+ 15196: 83 c4 10 add $0x10,%esp\r
+ 15199: 66 8b 45 fe mov 0xfffffffe(%ebp),%ax\r
+ 1519d: 25 ff ff 00 00 and $0xffff,%eax\r
+ 151a2: 83 e0 01 and $0x1,%eax\r
+ 151a5: 85 c0 test %eax,%eax\r
+ 151a7: 75 2c jne 151d5 <_hub_port_connect_change+0xaf>\r
+ 151a9: 66 8b 45 fe mov 0xfffffffe(%ebp),%ax\r
+ 151ad: 25 ff ff 00 00 and $0xffff,%eax\r
+ 151b2: d1 e8 shr %eax\r
+ 151b4: 83 e0 01 and $0x1,%eax\r
+ 151b7: 85 c0 test %eax,%eax\r
+ 151b9: 0f 84 08 02 00 00 je 153c7 <_hub_port_connect_change+0x2a1>\r
+ 151bf: 83 ec 08 sub $0x8,%esp\r
+ 151c2: ff 75 0c pushl 0xc(%ebp)\r
+ 151c5: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 151c8: e8 44 fe ff ff call 15011 <_hub_port_disable>\r
+ 151cd: 83 c4 10 add $0x10,%esp\r
+ 151d0: e9 f2 01 00 00 jmp 153c7 <_hub_port_connect_change+0x2a1>\r
+ 151d5: 83 ec 08 sub $0x8,%esp\r
+ 151d8: ff 75 0c pushl 0xc(%ebp)\r
+ 151db: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 151de: e8 51 fe ff ff call 15034 <_hub_port_debounce>\r
+ 151e3: 83 c4 10 add $0x10,%esp\r
+ 151e6: 85 c0 test %eax,%eax\r
+ 151e8: 74 16 je 15200 <_hub_port_connect_change+0xda>\r
+ 151ea: 83 ec 08 sub $0x8,%esp\r
+ 151ed: ff 75 0c pushl 0xc(%ebp)\r
+ 151f0: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 151f3: e8 19 fe ff ff call 15011 <_hub_port_disable>\r
+ 151f8: 83 c4 10 add $0x10,%esp\r
+ 151fb: e9 c7 01 00 00 jmp 153c7 <_hub_port_connect_change+0x2a1>\r
+ 15200: 66 8b 45 fe mov 0xfffffffe(%ebp),%ax\r
+ 15204: 25 ff ff 00 00 and $0xffff,%eax\r
+ 15209: c1 e8 09 shr $0x9,%eax\r
+ 1520c: 83 e0 01 and $0x1,%eax\r
+ 1520f: 85 c0 test %eax,%eax\r
+ 15211: 74 07 je 1521a <_hub_port_connect_change+0xf4>\r
+ 15213: c7 45 f0 c8 00 00 00 movl $0xc8,0xfffffff0(%ebp)\r
+ 1521a: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 15221: 83 7d ec 01 cmpl $0x1,0xffffffec(%ebp)\r
+ 15225: 0f 8f 7a 01 00 00 jg 153a5 <_hub_port_connect_change+0x27f>\r
+ 1522b: 83 ec 08 sub $0x8,%esp\r
+ 1522e: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 15231: ff b0 bc 00 00 00 pushl 0xbc(%eax)\r
+ 15237: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 1523a: e8 3a 10 00 00 call 16279 <_usb_alloc_dev@8>\r
+ 1523f: 83 c4 08 add $0x8,%esp\r
+ 15242: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 15245: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 15249: 75 05 jne 15250 <_hub_port_connect_change+0x12a>\r
+ 1524b: e9 55 01 00 00 jmp 153a5 <_hub_port_connect_change+0x27f>\r
+ 15250: 8b 4d f8 mov 0xfffffff8(%ebp),%ecx\r
+ 15253: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 15256: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 15259: 89 84 91 b0 01 00 00 mov %eax,0x1b0(%ecx,%edx,4)\r
+ 15260: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 15263: c7 40 14 02 00 00 00 movl $0x2,0x14(%eax)\r
+ 1526a: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 1526d: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 15270: ff 75 0c pushl 0xc(%ebp)\r
+ 15273: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 15276: e8 ee fc ff ff call 14f69 <_hub_port_reset>\r
+ 1527b: 83 c4 10 add $0x10,%esp\r
+ 1527e: 85 c0 test %eax,%eax\r
+ 15280: 74 13 je 15295 <_hub_port_connect_change+0x16f>\r
+ 15282: 83 ec 0c sub $0xc,%esp\r
+ 15285: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 15288: e8 2e 11 00 00 call 163bb <_usb_put_dev@4>\r
+ 1528d: 83 c4 0c add $0xc,%esp\r
+ 15290: e9 10 01 00 00 jmp 153a5 <_hub_port_connect_change+0x27f>\r
+ 15295: 83 ec 0c sub $0xc,%esp\r
+ 15298: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 1529b: e8 16 15 00 00 call 167b6 <_usb_connect@4>\r
+ 152a0: 83 c4 0c add $0xc,%esp\r
+ 152a3: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 152a6: 83 78 1c 00 cmpl $0x0,0x1c(%eax)\r
+ 152aa: 74 1a je 152c6 <_hub_port_connect_change+0x1a0>\r
+ 152ac: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 152af: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 152b2: 8b 40 1c mov 0x1c(%eax),%eax\r
+ 152b5: 89 42 1c mov %eax,0x1c(%edx)\r
+ 152b8: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 152bb: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 152be: 8b 40 20 mov 0x20(%eax),%eax\r
+ 152c1: 89 42 20 mov %eax,0x20(%edx)\r
+ 152c4: eb 28 jmp 152ee <_hub_port_connect_change+0x1c8>\r
+ 152c6: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 152c9: 83 78 18 03 cmpl $0x3,0x18(%eax)\r
+ 152cd: 74 1f je 152ee <_hub_port_connect_change+0x1c8>\r
+ 152cf: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 152d2: 83 78 18 03 cmpl $0x3,0x18(%eax)\r
+ 152d6: 75 16 jne 152ee <_hub_port_connect_change+0x1c8>\r
+ 152d8: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 152db: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 152de: 83 c0 34 add $0x34,%eax\r
+ 152e1: 89 42 1c mov %eax,0x1c(%edx)\r
+ 152e4: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 152e7: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 152ea: 40 inc %eax\r
+ 152eb: 89 42 20 mov %eax,0x20(%edx)\r
+ 152ee: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 152f1: 8b 80 b8 00 00 00 mov 0xb8(%eax),%eax\r
+ 152f7: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 152fa: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 152fd: 80 78 04 30 cmpb $0x30,0x4(%eax)\r
+ 15301: 74 2a je 1532d <_hub_port_connect_change+0x207>\r
+ 15303: 83 ec 0c sub $0xc,%esp\r
+ 15306: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 15309: 40 inc %eax\r
+ 1530a: 50 push %eax\r
+ 1530b: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 1530e: 83 c0 04 add $0x4,%eax\r
+ 15311: 50 push %eax\r
+ 15312: 68 3b b2 01 00 push $0x1b23b\r
+ 15317: 6a 10 push $0x10\r
+ 15319: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 1531c: 83 c0 04 add $0x4,%eax\r
+ 1531f: 50 push %eax\r
+ 15320: e8 9b 47 00 00 call 19ac0 <__snprintf>\r
+ 15325: 83 c4 20 add $0x20,%esp\r
+ 15328: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 1532b: eb 1e jmp 1534b <_hub_port_connect_change+0x225>\r
+ 1532d: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 15330: 40 inc %eax\r
+ 15331: 50 push %eax\r
+ 15332: 68 41 b2 01 00 push $0x1b241\r
+ 15337: 6a 10 push $0x10\r
+ 15339: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 1533c: 83 c0 04 add $0x4,%eax\r
+ 1533f: 50 push %eax\r
+ 15340: e8 7b 47 00 00 call 19ac0 <__snprintf>\r
+ 15345: 83 c4 10 add $0x10,%esp\r
+ 15348: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 1534b: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 1534e: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 15351: 8b 80 b8 00 00 00 mov 0xb8(%eax),%eax\r
+ 15357: 8b 80 60 01 00 00 mov 0x160(%eax),%eax\r
+ 1535d: 8b 80 a0 00 00 00 mov 0xa0(%eax),%eax\r
+ 15363: 89 82 60 01 00 00 mov %eax,0x160(%edx)\r
+ 15369: 83 ec 08 sub $0x8,%esp\r
+ 1536c: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1536f: 05 c0 00 00 00 add $0xc0,%eax\r
+ 15374: 50 push %eax\r
+ 15375: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 15378: e8 16 18 00 00 call 16b93 <_usb_new_device>\r
+ 1537d: 83 c4 10 add $0x10,%esp\r
+ 15380: 85 c0 test %eax,%eax\r
+ 15382: 75 02 jne 15386 <_hub_port_connect_change+0x260>\r
+ 15384: eb 41 jmp 153c7 <_hub_port_connect_change+0x2a1>\r
+ 15386: 83 ec 0c sub $0xc,%esp\r
+ 15389: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 1538c: e8 2a 10 00 00 call 163bb <_usb_put_dev@4>\r
+ 15391: 83 c4 0c add $0xc,%esp\r
+ 15394: c7 45 f0 c8 00 00 00 movl $0xc8,0xfffffff0(%ebp)\r
+ 1539b: 8d 45 ec lea 0xffffffec(%ebp),%eax\r
+ 1539e: ff 00 incl (%eax)\r
+ 153a0: e9 7c fe ff ff jmp 15221 <_hub_port_connect_change+0xfb>\r
+ 153a5: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 153a8: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 153ab: c7 84 82 b0 01 00 00 movl $0x0,0x1b0(%edx,%eax,4)\r
+ 153b2: 00 00 00 00 \r
+ 153b6: 83 ec 08 sub $0x8,%esp\r
+ 153b9: ff 75 0c pushl 0xc(%ebp)\r
+ 153bc: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 153bf: e8 4d fc ff ff call 15011 <_hub_port_disable>\r
+ 153c4: 83 c4 10 add $0x10,%esp\r
+ 153c7: c9 leave \r
+ 153c8: c3 ret \r
+\r
+000153c9 <_hub_events>:\r
+ 153c9: 55 push %ebp\r
+ 153ca: 89 e5 mov %esp,%ebp\r
+ 153cc: 83 ec 28 sub $0x28,%esp\r
+ 153cf: c7 45 dc 00 00 00 00 movl $0x0,0xffffffdc(%ebp)\r
+ 153d6: 83 7d dc 04 cmpl $0x4,0xffffffdc(%ebp)\r
+ 153da: 0f 8f 9c 02 00 00 jg 1567c <_hub_events+0x2b3>\r
+ 153e0: 8d 45 dc lea 0xffffffdc(%ebp),%eax\r
+ 153e3: ff 00 incl (%eax)\r
+ 153e5: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 153ec: 68 40 a0 01 00 push $0x1a040\r
+ 153f1: e8 08 ed ff ff call 140fe <_list_empty>\r
+ 153f6: 83 c4 04 add $0x4,%esp\r
+ 153f9: 85 c0 test %eax,%eax\r
+ 153fb: 74 05 je 15402 <_hub_events+0x39>\r
+ 153fd: e9 7a 02 00 00 jmp 1567c <_hub_events+0x2b3>\r
+ 15402: a1 40 a0 01 00 mov 0x1a040,%eax\r
+ 15407: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 1540a: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1540d: 83 e8 24 sub $0x24,%eax\r
+ 15410: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 15413: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 15416: 8b 00 mov (%eax),%eax\r
+ 15418: 8b 80 b8 00 00 00 mov 0xb8(%eax),%eax\r
+ 1541e: 89 45 d8 mov %eax,0xffffffd8(%ebp)\r
+ 15421: 8b 45 d8 mov 0xffffffd8(%ebp),%eax\r
+ 15424: 2d c0 00 00 00 sub $0xc0,%eax\r
+ 15429: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 1542c: 83 ec 0c sub $0xc,%esp\r
+ 1542f: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 15432: e8 47 02 00 00 call 1567e <_list_del_init>\r
+ 15437: 83 c4 10 add $0x10,%esp\r
+ 1543a: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 1543d: 83 78 14 00 cmpl $0x0,0x14(%eax)\r
+ 15441: 74 39 je 1547c <_hub_events+0xb3>\r
+ 15443: 83 ec 0c sub $0xc,%esp\r
+ 15446: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 15449: e8 35 f8 ff ff call 14c83 <_hub_reset>\r
+ 1544e: 83 c4 10 add $0x10,%esp\r
+ 15451: 85 c0 test %eax,%eax\r
+ 15453: 74 13 je 15468 <_hub_events+0x9f>\r
+ 15455: 83 ec 0c sub $0xc,%esp\r
+ 15458: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 1545b: e8 13 f9 ff ff call 14d73 <_hub_start_disconnect>\r
+ 15460: 83 c4 10 add $0x10,%esp\r
+ 15463: e9 6e ff ff ff jmp 153d6 <_hub_events+0xd>\r
+ 15468: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 1546b: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)\r
+ 15472: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 15475: c7 40 14 00 00 00 00 movl $0x0,0x14(%eax)\r
+ 1547c: c7 45 e4 00 00 00 00 movl $0x0,0xffffffe4(%ebp)\r
+ 15483: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 15486: 8b 40 2c mov 0x2c(%eax),%eax\r
+ 15489: 8a 40 02 mov 0x2(%eax),%al\r
+ 1548c: 25 ff 00 00 00 and $0xff,%eax\r
+ 15491: 3b 45 e4 cmp 0xffffffe4(%ebp),%eax\r
+ 15494: 0f 8e 5c 01 00 00 jle 155f6 <_hub_events+0x22d>\r
+ 1549a: 8d 45 e8 lea 0xffffffe8(%ebp),%eax\r
+ 1549d: 50 push %eax\r
+ 1549e: 8d 45 ea lea 0xffffffea(%ebp),%eax\r
+ 154a1: 50 push %eax\r
+ 154a2: ff 75 e4 pushl 0xffffffe4(%ebp)\r
+ 154a5: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 154a8: e8 2a f9 ff ff call 14dd7 <_hub_port_status>\r
+ 154ad: 83 c4 10 add $0x10,%esp\r
+ 154b0: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 154b3: 83 7d e0 00 cmpl $0x0,0xffffffe0(%ebp)\r
+ 154b7: 79 05 jns 154be <_hub_events+0xf5>\r
+ 154b9: e9 2e 01 00 00 jmp 155ec <_hub_events+0x223>\r
+ 154be: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 154c1: 25 ff ff 00 00 and $0xffff,%eax\r
+ 154c6: 83 e0 01 and $0x1,%eax\r
+ 154c9: 85 c0 test %eax,%eax\r
+ 154cb: 74 23 je 154f0 <_hub_events+0x127>\r
+ 154cd: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 154d0: 25 ff ff 00 00 and $0xffff,%eax\r
+ 154d5: 50 push %eax\r
+ 154d6: 66 8b 45 ea mov 0xffffffea(%ebp),%ax\r
+ 154da: 25 ff ff 00 00 and $0xffff,%eax\r
+ 154df: 50 push %eax\r
+ 154e0: ff 75 e4 pushl 0xffffffe4(%ebp)\r
+ 154e3: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 154e6: e8 3b fc ff ff call 15126 <_hub_port_connect_change>\r
+ 154eb: 83 c4 10 add $0x10,%esp\r
+ 154ee: eb 79 jmp 15569 <_hub_events+0x1a0>\r
+ 154f0: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 154f3: 25 ff ff 00 00 and $0xffff,%eax\r
+ 154f8: d1 e8 shr %eax\r
+ 154fa: 83 e0 01 and $0x1,%eax\r
+ 154fd: 85 c0 test %eax,%eax\r
+ 154ff: 74 68 je 15569 <_hub_events+0x1a0>\r
+ 15501: 83 ec 04 sub $0x4,%esp\r
+ 15504: 6a 11 push $0x11\r
+ 15506: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 15509: 40 inc %eax\r
+ 1550a: 50 push %eax\r
+ 1550b: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 1550e: e8 c8 e9 ff ff call 13edb <_clear_port_feature>\r
+ 15513: 83 c4 10 add $0x10,%esp\r
+ 15516: 66 8b 45 ea mov 0xffffffea(%ebp),%ax\r
+ 1551a: 25 ff ff 00 00 and $0xffff,%eax\r
+ 1551f: d1 e8 shr %eax\r
+ 15521: 83 e0 01 and $0x1,%eax\r
+ 15524: 85 c0 test %eax,%eax\r
+ 15526: 75 41 jne 15569 <_hub_events+0x1a0>\r
+ 15528: 66 8b 45 ea mov 0xffffffea(%ebp),%ax\r
+ 1552c: 25 ff ff 00 00 and $0xffff,%eax\r
+ 15531: 83 e0 01 and $0x1,%eax\r
+ 15534: 85 c0 test %eax,%eax\r
+ 15536: 74 31 je 15569 <_hub_events+0x1a0>\r
+ 15538: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 1553b: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 1553e: 83 bc 82 b0 01 00 00 cmpl $0x0,0x1b0(%edx,%eax,4)\r
+ 15545: 00 \r
+ 15546: 74 21 je 15569 <_hub_events+0x1a0>\r
+ 15548: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 1554b: 25 ff ff 00 00 and $0xffff,%eax\r
+ 15550: 50 push %eax\r
+ 15551: 66 8b 45 ea mov 0xffffffea(%ebp),%ax\r
+ 15555: 25 ff ff 00 00 and $0xffff,%eax\r
+ 1555a: 50 push %eax\r
+ 1555b: ff 75 e4 pushl 0xffffffe4(%ebp)\r
+ 1555e: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 15561: e8 c0 fb ff ff call 15126 <_hub_port_connect_change>\r
+ 15566: 83 c4 10 add $0x10,%esp\r
+ 15569: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 1556c: 25 ff ff 00 00 and $0xffff,%eax\r
+ 15571: c1 e8 02 shr $0x2,%eax\r
+ 15574: 83 e0 01 and $0x1,%eax\r
+ 15577: 85 c0 test %eax,%eax\r
+ 15579: 74 15 je 15590 <_hub_events+0x1c7>\r
+ 1557b: 83 ec 04 sub $0x4,%esp\r
+ 1557e: 6a 12 push $0x12\r
+ 15580: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 15583: 40 inc %eax\r
+ 15584: 50 push %eax\r
+ 15585: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 15588: e8 4e e9 ff ff call 13edb <_clear_port_feature>\r
+ 1558d: 83 c4 10 add $0x10,%esp\r
+ 15590: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 15593: 25 ff ff 00 00 and $0xffff,%eax\r
+ 15598: c1 e8 03 shr $0x3,%eax\r
+ 1559b: 83 e0 01 and $0x1,%eax\r
+ 1559e: 85 c0 test %eax,%eax\r
+ 155a0: 74 23 je 155c5 <_hub_events+0x1fc>\r
+ 155a2: 83 ec 04 sub $0x4,%esp\r
+ 155a5: 6a 13 push $0x13\r
+ 155a7: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 155aa: 40 inc %eax\r
+ 155ab: 50 push %eax\r
+ 155ac: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 155af: e8 27 e9 ff ff call 13edb <_clear_port_feature>\r
+ 155b4: 83 c4 10 add $0x10,%esp\r
+ 155b7: 83 ec 0c sub $0xc,%esp\r
+ 155ba: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 155bd: e8 b1 ed ff ff call 14373 <_hub_power_on>\r
+ 155c2: 83 c4 10 add $0x10,%esp\r
+ 155c5: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 155c8: 25 ff ff 00 00 and $0xffff,%eax\r
+ 155cd: c1 e8 04 shr $0x4,%eax\r
+ 155d0: 83 e0 01 and $0x1,%eax\r
+ 155d3: 85 c0 test %eax,%eax\r
+ 155d5: 74 15 je 155ec <_hub_events+0x223>\r
+ 155d7: 83 ec 04 sub $0x4,%esp\r
+ 155da: 6a 14 push $0x14\r
+ 155dc: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 155df: 40 inc %eax\r
+ 155e0: 50 push %eax\r
+ 155e1: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 155e4: e8 f2 e8 ff ff call 13edb <_clear_port_feature>\r
+ 155e9: 83 c4 10 add $0x10,%esp\r
+ 155ec: 8d 45 e4 lea 0xffffffe4(%ebp),%eax\r
+ 155ef: ff 00 incl (%eax)\r
+ 155f1: e9 8d fe ff ff jmp 15483 <_hub_events+0xba>\r
+ 155f6: 83 ec 04 sub $0x4,%esp\r
+ 155f9: 8d 45 ec lea 0xffffffec(%ebp),%eax\r
+ 155fc: 50 push %eax\r
+ 155fd: 8d 45 ee lea 0xffffffee(%ebp),%eax\r
+ 15600: 50 push %eax\r
+ 15601: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 15604: e8 dd ed ff ff call 143e6 <_hub_hub_status>\r
+ 15609: 83 c4 10 add $0x10,%esp\r
+ 1560c: 85 c0 test %eax,%eax\r
+ 1560e: 79 05 jns 15615 <_hub_events+0x24c>\r
+ 15610: e9 c1 fd ff ff jmp 153d6 <_hub_events+0xd>\r
+ 15615: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 15618: 25 ff ff 00 00 and $0xffff,%eax\r
+ 1561d: 83 e0 01 and $0x1,%eax\r
+ 15620: 85 c0 test %eax,%eax\r
+ 15622: 74 10 je 15634 <_hub_events+0x26b>\r
+ 15624: 83 ec 08 sub $0x8,%esp\r
+ 15627: 6a 00 push $0x0\r
+ 15629: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 1562c: e8 6c e8 ff ff call 13e9d <_clear_hub_feature>\r
+ 15631: 83 c4 10 add $0x10,%esp\r
+ 15634: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 15637: 25 ff ff 00 00 and $0xffff,%eax\r
+ 1563c: d1 e8 shr %eax\r
+ 1563e: 83 e0 01 and $0x1,%eax\r
+ 15641: 85 c0 test %eax,%eax\r
+ 15643: 0f 84 8d fd ff ff je 153d6 <_hub_events+0xd>\r
+ 15649: 83 ec 0c sub $0xc,%esp\r
+ 1564c: 68 f4 01 00 00 push $0x1f4\r
+ 15651: e8 5a 3e 00 00 call 194b0 <_wait_ms>\r
+ 15656: 83 c4 10 add $0x10,%esp\r
+ 15659: 83 ec 08 sub $0x8,%esp\r
+ 1565c: 6a 01 push $0x1\r
+ 1565e: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 15661: e8 37 e8 ff ff call 13e9d <_clear_hub_feature>\r
+ 15666: 83 c4 10 add $0x10,%esp\r
+ 15669: 83 ec 0c sub $0xc,%esp\r
+ 1566c: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 1566f: e8 ff ec ff ff call 14373 <_hub_power_on>\r
+ 15674: 83 c4 10 add $0x10,%esp\r
+ 15677: e9 5a fd ff ff jmp 153d6 <_hub_events+0xd>\r
+ 1567c: c9 leave \r
+ 1567d: c3 ret \r
+\r
+0001567e <_list_del_init>:\r
+ 1567e: 55 push %ebp\r
+ 1567f: 89 e5 mov %esp,%ebp\r
+ 15681: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15684: ff 30 pushl (%eax)\r
+ 15686: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15689: ff 70 04 pushl 0x4(%eax)\r
+ 1568c: e8 ac eb ff ff call 1423d <___list_del>\r
+ 15691: 83 c4 08 add $0x8,%esp\r
+ 15694: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 15697: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1569a: 89 02 mov %eax,(%edx)\r
+ 1569c: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 1569f: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 156a2: 89 42 04 mov %eax,0x4(%edx)\r
+ 156a5: c9 leave \r
+ 156a6: c3 ret \r
+\r
+000156a7 <_hub_thread>:\r
+ 156a7: 55 push %ebp\r
+ 156a8: 89 e5 mov %esp,%ebp\r
+ 156aa: 83 ec 08 sub $0x8,%esp\r
+ 156ad: e8 17 fd ff ff call 153c9 <_hub_events>\r
+ 156b2: b8 00 00 00 00 mov $0x0,%eax\r
+ 156b7: c9 leave \r
+ 156b8: c3 ret \r
+\r
+000156b9 <_usb_hub_init>:\r
+ 156b9: 55 push %ebp\r
+ 156ba: 89 e5 mov %esp,%ebp\r
+ 156bc: 83 ec 08 sub $0x8,%esp\r
+ 156bf: 83 ec 0c sub $0xc,%esp\r
+ 156c2: 68 a0 a0 01 00 push $0x1a0a0\r
+ 156c7: e8 26 05 00 00 call 15bf2 <_usb_register>\r
+ 156cc: 83 c4 10 add $0x10,%esp\r
+ 156cf: 85 c0 test %eax,%eax\r
+ 156d1: 79 09 jns 156dc <_usb_hub_init+0x23>\r
+ 156d3: c7 45 f8 ff ff ff ff movl $0xffffffff,0xfffffff8(%ebp)\r
+ 156da: eb 45 jmp 15721 <_usb_hub_init+0x68>\r
+ 156dc: 83 ec 04 sub $0x4,%esp\r
+ 156df: 6a 00 push $0x0\r
+ 156e1: 6a 00 push $0x0\r
+ 156e3: 68 a7 56 01 00 push $0x156a7\r
+ 156e8: e8 03 40 00 00 call 196f0 <_my_kernel_thread>\r
+ 156ed: 83 c4 10 add $0x10,%esp\r
+ 156f0: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 156f3: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 156f7: 78 11 js 1570a <_usb_hub_init+0x51>\r
+ 156f9: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 156fc: a3 30 c0 01 00 mov %eax,0x1c030\r
+ 15701: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 15708: eb 17 jmp 15721 <_usb_hub_init+0x68>\r
+ 1570a: 83 ec 0c sub $0xc,%esp\r
+ 1570d: 68 a0 a0 01 00 push $0x1a0a0\r
+ 15712: e8 54 05 00 00 call 15c6b <_usb_deregister>\r
+ 15717: 83 c4 10 add $0x10,%esp\r
+ 1571a: c7 45 f8 ff ff ff ff movl $0xffffffff,0xfffffff8(%ebp)\r
+ 15721: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 15724: c9 leave \r
+ 15725: c3 ret \r
+\r
+00015726 <_usb_hub_cleanup>:\r
+ 15726: 55 push %ebp\r
+ 15727: 89 e5 mov %esp,%ebp\r
+ 15729: 83 ec 08 sub $0x8,%esp\r
+ 1572c: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 15733: 83 ec 0c sub $0xc,%esp\r
+ 15736: 68 60 c0 01 00 push $0x1c060\r
+ 1573b: e8 98 41 00 00 call 198d8 <_my_wait_for_completion>\r
+ 15740: 83 c4 10 add $0x10,%esp\r
+ 15743: 83 ec 0c sub $0xc,%esp\r
+ 15746: 68 a0 a0 01 00 push $0x1a0a0\r
+ 1574b: e8 1b 05 00 00 call 15c6b <_usb_deregister>\r
+ 15750: 83 c4 10 add $0x10,%esp\r
+ 15753: c9 leave \r
+ 15754: c3 ret \r
+\r
+00015755 <_usb_physical_reset_device>:\r
+ 15755: 55 push %ebp\r
+ 15756: 89 e5 mov %esp,%ebp\r
+ 15758: 53 push %ebx\r
+ 15759: 83 ec 24 sub $0x24,%esp\r
+ 1575c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1575f: 8b 80 b8 00 00 00 mov 0xb8(%eax),%eax\r
+ 15765: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 15768: c7 45 e8 ff ff ff ff movl $0xffffffff,0xffffffe8(%ebp)\r
+ 1576f: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 15773: 75 0c jne 15781 <_usb_physical_reset_device+0x2c>\r
+ 15775: c7 45 dc ea ff ff ff movl $0xffffffea,0xffffffdc(%ebp)\r
+ 1577c: e9 29 03 00 00 jmp 15aaa <_usb_physical_reset_device+0x355>\r
+ 15781: c7 45 f0 00 00 00 00 movl $0x0,0xfffffff0(%ebp)\r
+ 15788: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1578b: 8b 80 ac 01 00 00 mov 0x1ac(%eax),%eax\r
+ 15791: 3b 45 f0 cmp 0xfffffff0(%ebp),%eax\r
+ 15794: 7e 21 jle 157b7 <_usb_physical_reset_device+0x62>\r
+ 15796: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 15799: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 1579c: 8b 84 90 b0 01 00 00 mov 0x1b0(%eax,%edx,4),%eax\r
+ 157a3: 3b 45 08 cmp 0x8(%ebp),%eax\r
+ 157a6: 75 08 jne 157b0 <_usb_physical_reset_device+0x5b>\r
+ 157a8: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 157ab: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 157ae: eb 07 jmp 157b7 <_usb_physical_reset_device+0x62>\r
+ 157b0: 8d 45 f0 lea 0xfffffff0(%ebp),%eax\r
+ 157b3: ff 00 incl (%eax)\r
+ 157b5: eb d1 jmp 15788 <_usb_physical_reset_device+0x33>\r
+ 157b7: 83 7d e8 00 cmpl $0x0,0xffffffe8(%ebp)\r
+ 157bb: 79 0c jns 157c9 <_usb_physical_reset_device+0x74>\r
+ 157bd: c7 45 dc fe ff ff ff movl $0xfffffffe,0xffffffdc(%ebp)\r
+ 157c4: e9 e1 02 00 00 jmp 15aaa <_usb_physical_reset_device+0x355>\r
+ 157c9: 83 ec 08 sub $0x8,%esp\r
+ 157cc: 6a 12 push $0x12\r
+ 157ce: 6a 01 push $0x1\r
+ 157d0: e8 5b 42 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 157d5: 83 c4 08 add $0x8,%esp\r
+ 157d8: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 157db: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 157df: 75 0c jne 157ed <_usb_physical_reset_device+0x98>\r
+ 157e1: c7 45 dc f4 ff ff ff movl $0xfffffff4,0xffffffdc(%ebp)\r
+ 157e8: e9 bd 02 00 00 jmp 15aaa <_usb_physical_reset_device+0x355>\r
+ 157ed: 6a 0a push $0xa\r
+ 157ef: ff 75 08 pushl 0x8(%ebp)\r
+ 157f2: ff 75 e8 pushl 0xffffffe8(%ebp)\r
+ 157f5: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 157f8: e8 6c f7 ff ff call 14f69 <_hub_port_reset>\r
+ 157fd: 83 c4 10 add $0x10,%esp\r
+ 15800: 85 c0 test %eax,%eax\r
+ 15802: 74 2b je 1582f <_usb_physical_reset_device+0xda>\r
+ 15804: 83 ec 08 sub $0x8,%esp\r
+ 15807: ff 75 e8 pushl 0xffffffe8(%ebp)\r
+ 1580a: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 1580d: e8 ff f7 ff ff call 15011 <_hub_port_disable>\r
+ 15812: 83 c4 10 add $0x10,%esp\r
+ 15815: 83 ec 0c sub $0xc,%esp\r
+ 15818: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 1581b: e8 20 42 00 00 call 19a40 <_ExFreePool@4>\r
+ 15820: 83 c4 0c add $0xc,%esp\r
+ 15823: c7 45 dc ed ff ff ff movl $0xffffffed,0xffffffdc(%ebp)\r
+ 1582a: e9 7b 02 00 00 jmp 15aaa <_usb_physical_reset_device+0x355>\r
+ 1582f: 83 ec 0c sub $0xc,%esp\r
+ 15832: ff 75 08 pushl 0x8(%ebp)\r
+ 15835: e8 53 11 00 00 call 1698d <_usb_set_address>\r
+ 1583a: 83 c4 10 add $0x10,%esp\r
+ 1583d: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 15840: 83 7d ec 00 cmpl $0x0,0xffffffec(%ebp)\r
+ 15844: 79 2a jns 15870 <_usb_physical_reset_device+0x11b>\r
+ 15846: 83 ec 08 sub $0x8,%esp\r
+ 15849: ff 75 e8 pushl 0xffffffe8(%ebp)\r
+ 1584c: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 1584f: e8 bd f7 ff ff call 15011 <_hub_port_disable>\r
+ 15854: 83 c4 10 add $0x10,%esp\r
+ 15857: 83 ec 0c sub $0xc,%esp\r
+ 1585a: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 1585d: e8 de 41 00 00 call 19a40 <_ExFreePool@4>\r
+ 15862: 83 c4 0c add $0xc,%esp\r
+ 15865: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 15868: 89 45 dc mov %eax,0xffffffdc(%ebp)\r
+ 1586b: e9 3a 02 00 00 jmp 15aaa <_usb_physical_reset_device+0x355>\r
+ 15870: 83 ec 0c sub $0xc,%esp\r
+ 15873: 6a 0a push $0xa\r
+ 15875: e8 36 3c 00 00 call 194b0 <_wait_ms>\r
+ 1587a: 83 c4 10 add $0x10,%esp\r
+ 1587d: 83 ec 0c sub $0xc,%esp\r
+ 15880: 6a 12 push $0x12\r
+ 15882: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 15885: 6a 00 push $0x0\r
+ 15887: 6a 01 push $0x1\r
+ 15889: ff 75 08 pushl 0x8(%ebp)\r
+ 1588c: e8 cb ba ff ff call 1135c <_usb_get_descriptor>\r
+ 15891: 83 c4 20 add $0x20,%esp\r
+ 15894: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 15897: 83 7d ec 00 cmpl $0x0,0xffffffec(%ebp)\r
+ 1589b: 79 19 jns 158b6 <_usb_physical_reset_device+0x161>\r
+ 1589d: 83 ec 0c sub $0xc,%esp\r
+ 158a0: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 158a3: e8 98 41 00 00 call 19a40 <_ExFreePool@4>\r
+ 158a8: 83 c4 0c add $0xc,%esp\r
+ 158ab: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 158ae: 89 45 dc mov %eax,0xffffffdc(%ebp)\r
+ 158b1: e9 f4 01 00 00 jmp 15aaa <_usb_physical_reset_device+0x355>\r
+ 158b6: 83 ec 04 sub $0x4,%esp\r
+ 158b9: 6a 12 push $0x12\r
+ 158bb: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 158be: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 158c1: 05 70 01 00 00 add $0x170,%eax\r
+ 158c6: 50 push %eax\r
+ 158c7: e8 e4 41 00 00 call 19ab0 <_RtlCompareMemory@12>\r
+ 158cc: 83 c4 04 add $0x4,%esp\r
+ 158cf: 85 c0 test %eax,%eax\r
+ 158d1: 0f 84 e8 00 00 00 je 159bf <_usb_physical_reset_device+0x26a>\r
+ 158d7: 83 ec 0c sub $0xc,%esp\r
+ 158da: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 158dd: e8 5e 41 00 00 call 19a40 <_ExFreePool@4>\r
+ 158e2: 83 c4 0c add $0xc,%esp\r
+ 158e5: 83 ec 0c sub $0xc,%esp\r
+ 158e8: ff 75 08 pushl 0x8(%ebp)\r
+ 158eb: e8 05 23 00 00 call 17bf5 <_usb_destroy_configuration>\r
+ 158f0: 83 c4 10 add $0x10,%esp\r
+ 158f3: 83 ec 0c sub $0xc,%esp\r
+ 158f6: ff 75 08 pushl 0x8(%ebp)\r
+ 158f9: e8 83 bb ff ff call 11481 <_usb_get_device_descriptor>\r
+ 158fe: 83 c4 10 add $0x10,%esp\r
+ 15901: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 15904: 83 7d ec 11 cmpl $0x11,0xffffffec(%ebp)\r
+ 15908: 77 32 ja 1593c <_usb_physical_reset_device+0x1e7>\r
+ 1590a: 83 ec 08 sub $0x8,%esp\r
+ 1590d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15910: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 15916: 83 c0 10 add $0x10,%eax\r
+ 15919: 50 push %eax\r
+ 1591a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1591d: ff 30 pushl (%eax)\r
+ 1591f: e8 8e 01 00 00 call 15ab2 <_clear_bit>\r
+ 15924: 83 c4 10 add $0x10,%esp\r
+ 15927: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1592a: c7 00 ff ff ff ff movl $0xffffffff,(%eax)\r
+ 15930: c7 45 dc fb ff ff ff movl $0xfffffffb,0xffffffdc(%ebp)\r
+ 15937: e9 6e 01 00 00 jmp 15aaa <_usb_physical_reset_device+0x355>\r
+ 1593c: 83 ec 0c sub $0xc,%esp\r
+ 1593f: ff 75 08 pushl 0x8(%ebp)\r
+ 15942: e8 d1 24 00 00 call 17e18 <_usb_get_configuration>\r
+ 15947: 83 c4 10 add $0x10,%esp\r
+ 1594a: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 1594d: 83 7d ec 00 cmpl $0x0,0xffffffec(%ebp)\r
+ 15951: 79 40 jns 15993 <_usb_physical_reset_device+0x23e>\r
+ 15953: 83 ec 0c sub $0xc,%esp\r
+ 15956: ff 75 08 pushl 0x8(%ebp)\r
+ 15959: e8 97 22 00 00 call 17bf5 <_usb_destroy_configuration>\r
+ 1595e: 83 c4 10 add $0x10,%esp\r
+ 15961: 83 ec 08 sub $0x8,%esp\r
+ 15964: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15967: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 1596d: 83 c0 10 add $0x10,%eax\r
+ 15970: 50 push %eax\r
+ 15971: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15974: ff 30 pushl (%eax)\r
+ 15976: e8 37 01 00 00 call 15ab2 <_clear_bit>\r
+ 1597b: 83 c4 10 add $0x10,%esp\r
+ 1597e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15981: c7 00 ff ff ff ff movl $0xffffffff,(%eax)\r
+ 15987: c7 45 dc 01 00 00 00 movl $0x1,0xffffffdc(%ebp)\r
+ 1598e: e9 17 01 00 00 jmp 15aaa <_usb_physical_reset_device+0x355>\r
+ 15993: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15996: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 15999: 8b 92 84 01 00 00 mov 0x184(%edx),%edx\r
+ 1599f: 89 90 88 01 00 00 mov %edx,0x188(%eax)\r
+ 159a5: 83 ec 0c sub $0xc,%esp\r
+ 159a8: ff 75 08 pushl 0x8(%ebp)\r
+ 159ab: e8 49 bb ff ff call 114f9 <_usb_set_maxpacket>\r
+ 159b0: 83 c4 10 add $0x10,%esp\r
+ 159b3: c7 45 dc 01 00 00 00 movl $0x1,0xffffffdc(%ebp)\r
+ 159ba: e9 eb 00 00 00 jmp 15aaa <_usb_physical_reset_device+0x355>\r
+ 159bf: 83 ec 0c sub $0xc,%esp\r
+ 159c2: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 159c5: e8 76 40 00 00 call 19a40 <_ExFreePool@4>\r
+ 159ca: 83 c4 0c add $0xc,%esp\r
+ 159cd: 83 ec 08 sub $0x8,%esp\r
+ 159d0: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 159d3: 8b 80 88 01 00 00 mov 0x188(%eax),%eax\r
+ 159d9: 8a 40 05 mov 0x5(%eax),%al\r
+ 159dc: 25 ff 00 00 00 and $0xff,%eax\r
+ 159e1: 50 push %eax\r
+ 159e2: ff 75 08 pushl 0x8(%ebp)\r
+ 159e5: e8 5d c0 ff ff call 11a47 <_usb_set_configuration>\r
+ 159ea: 83 c4 10 add $0x10,%esp\r
+ 159ed: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 159f0: 83 7d ec 00 cmpl $0x0,0xffffffec(%ebp)\r
+ 159f4: 79 0b jns 15a01 <_usb_physical_reset_device+0x2ac>\r
+ 159f6: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 159f9: 89 45 dc mov %eax,0xffffffdc(%ebp)\r
+ 159fc: e9 a9 00 00 00 jmp 15aaa <_usb_physical_reset_device+0x355>\r
+ 15a01: c7 45 f0 00 00 00 00 movl $0x0,0xfffffff0(%ebp)\r
+ 15a08: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15a0b: 8b 80 88 01 00 00 mov 0x188(%eax),%eax\r
+ 15a11: 8a 40 04 mov 0x4(%eax),%al\r
+ 15a14: 25 ff 00 00 00 and $0xff,%eax\r
+ 15a19: 3b 45 f0 cmp 0xfffffff0(%ebp),%eax\r
+ 15a1c: 0f 8e 81 00 00 00 jle 15aa3 <_usb_physical_reset_device+0x34e>\r
+ 15a22: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15a25: 8b 98 88 01 00 00 mov 0x188(%eax),%ebx\r
+ 15a2b: 8b 4d f0 mov 0xfffffff0(%ebp),%ecx\r
+ 15a2e: 89 c8 mov %ecx,%eax\r
+ 15a30: c1 e0 02 shl $0x2,%eax\r
+ 15a33: 01 c8 add %ecx,%eax\r
+ 15a35: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 15a3c: 01 d0 add %edx,%eax\r
+ 15a3e: 01 c0 add %eax,%eax\r
+ 15a40: 01 c8 add %ecx,%eax\r
+ 15a42: c1 e0 02 shl $0x2,%eax\r
+ 15a45: 03 43 0c add 0xc(%ebx),%eax\r
+ 15a48: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 15a4b: 8b 4d e4 mov 0xffffffe4(%ebp),%ecx\r
+ 15a4e: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 15a51: 8b 50 04 mov 0x4(%eax),%edx\r
+ 15a54: 89 d0 mov %edx,%eax\r
+ 15a56: 01 c0 add %eax,%eax\r
+ 15a58: 01 d0 add %edx,%eax\r
+ 15a5a: c1 e0 03 shl $0x3,%eax\r
+ 15a5d: 03 01 add (%ecx),%eax\r
+ 15a5f: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 15a62: 83 ec 04 sub $0x4,%esp\r
+ 15a65: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 15a68: 8a 40 03 mov 0x3(%eax),%al\r
+ 15a6b: 25 ff 00 00 00 and $0xff,%eax\r
+ 15a70: 50 push %eax\r
+ 15a71: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 15a74: 8a 40 02 mov 0x2(%eax),%al\r
+ 15a77: 25 ff 00 00 00 and $0xff,%eax\r
+ 15a7c: 50 push %eax\r
+ 15a7d: ff 75 08 pushl 0x8(%ebp)\r
+ 15a80: e8 f1 bc ff ff call 11776 <_usb_set_interface>\r
+ 15a85: 83 c4 10 add $0x10,%esp\r
+ 15a88: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 15a8b: 83 7d ec 00 cmpl $0x0,0xffffffec(%ebp)\r
+ 15a8f: 79 08 jns 15a99 <_usb_physical_reset_device+0x344>\r
+ 15a91: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 15a94: 89 45 dc mov %eax,0xffffffdc(%ebp)\r
+ 15a97: eb 11 jmp 15aaa <_usb_physical_reset_device+0x355>\r
+ 15a99: 8d 45 f0 lea 0xfffffff0(%ebp),%eax\r
+ 15a9c: ff 00 incl (%eax)\r
+ 15a9e: e9 65 ff ff ff jmp 15a08 <_usb_physical_reset_device+0x2b3>\r
+ 15aa3: c7 45 dc 00 00 00 00 movl $0x0,0xffffffdc(%ebp)\r
+ 15aaa: 8b 45 dc mov 0xffffffdc(%ebp),%eax\r
+ 15aad: 8b 5d fc mov 0xfffffffc(%ebp),%ebx\r
+ 15ab0: c9 leave \r
+ 15ab1: c3 ret \r
+\r
+00015ab2 <_clear_bit>:\r
+ 15ab2: 55 push %ebp\r
+ 15ab3: 89 e5 mov %esp,%ebp\r
+ 15ab5: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 15ab8: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15abb: 0f b3 02 btr %eax,(%edx)\r
+ 15abe: 5d pop %ebp\r
+ 15abf: c3 ret \r
+\r
+00015ac0 <_usb_reset_device>:\r
+ 15ac0: 55 push %ebp\r
+ 15ac1: 89 e5 mov %esp,%ebp\r
+ 15ac3: 83 ec 08 sub $0x8,%esp\r
+ 15ac6: 83 ec 0c sub $0xc,%esp\r
+ 15ac9: ff 75 08 pushl 0x8(%ebp)\r
+ 15acc: e8 84 fc ff ff call 15755 <_usb_physical_reset_device>\r
+ 15ad1: 83 c4 10 add $0x10,%esp\r
+ 15ad4: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 15ad7: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 15ada: c9 leave \r
+ 15adb: c3 ret \r
+ 15adc: 90 nop \r
+ 15add: 90 nop \r
+ 15ade: 90 nop \r
+ 15adf: 90 nop \r
+\r
+00015ae0 <_generic_probe>:\r
+ 15ae0: 55 push %ebp\r
+ 15ae1: 89 e5 mov %esp,%ebp\r
+ 15ae3: b8 00 00 00 00 mov $0x0,%eax\r
+ 15ae8: 5d pop %ebp\r
+ 15ae9: c3 ret \r
+\r
+00015aea <_generic_remove>:\r
+ 15aea: 55 push %ebp\r
+ 15aeb: 89 e5 mov %esp,%ebp\r
+ 15aed: b8 00 00 00 00 mov $0x0,%eax\r
+ 15af2: 5d pop %ebp\r
+ 15af3: c3 ret \r
+\r
+00015af4 <_usb_device_probe>:\r
+ 15af4: 55 push %ebp\r
+ 15af5: 89 e5 mov %esp,%ebp\r
+ 15af7: 83 ec 18 sub $0x18,%esp\r
+ 15afa: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15afd: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 15b00: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 15b03: 83 e8 18 sub $0x18,%eax\r
+ 15b06: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 15b09: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15b0c: 8b 80 98 00 00 00 mov 0x98(%eax),%eax\r
+ 15b12: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 15b15: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 15b18: 83 e8 18 sub $0x18,%eax\r
+ 15b1b: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 15b1e: c7 45 f0 ed ff ff ff movl $0xffffffed,0xfffffff0(%ebp)\r
+ 15b25: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 15b28: 83 78 08 00 cmpl $0x0,0x8(%eax)\r
+ 15b2c: 75 08 jne 15b36 <_usb_device_probe+0x42>\r
+ 15b2e: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 15b31: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 15b34: eb 49 jmp 15b7f <_usb_device_probe+0x8b>\r
+ 15b36: 83 ec 08 sub $0x8,%esp\r
+ 15b39: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 15b3c: ff 70 14 pushl 0x14(%eax)\r
+ 15b3f: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 15b42: e8 0d 04 00 00 call 15f54 <_usb_match_id>\r
+ 15b47: 83 c4 10 add $0x10,%esp\r
+ 15b4a: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 15b4d: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 15b51: 74 17 je 15b6a <_usb_device_probe+0x76>\r
+ 15b53: 83 ec 08 sub $0x8,%esp\r
+ 15b56: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 15b59: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 15b5c: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 15b5f: 8b 40 08 mov 0x8(%eax),%eax\r
+ 15b62: ff d0 call *%eax\r
+ 15b64: 83 c4 10 add $0x10,%esp\r
+ 15b67: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 15b6a: 83 7d f0 00 cmpl $0x0,0xfffffff0(%ebp)\r
+ 15b6e: 75 09 jne 15b79 <_usb_device_probe+0x85>\r
+ 15b70: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 15b73: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 15b76: 89 42 10 mov %eax,0x10(%edx)\r
+ 15b79: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 15b7c: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 15b7f: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 15b82: c9 leave \r
+ 15b83: c3 ret \r
+\r
+00015b84 <_usb_device_remove>:\r
+ 15b84: 55 push %ebp\r
+ 15b85: 89 e5 mov %esp,%ebp\r
+ 15b87: 83 ec 18 sub $0x18,%esp\r
+ 15b8a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15b8d: 83 e8 18 sub $0x18,%eax\r
+ 15b90: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 15b93: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15b96: 8b 80 98 00 00 00 mov 0x98(%eax),%eax\r
+ 15b9c: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 15b9f: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 15ba2: 83 e8 18 sub $0x18,%eax\r
+ 15ba5: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 15ba8: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 15bab: 83 78 10 00 cmpl $0x0,0x10(%eax)\r
+ 15baf: 74 20 je 15bd1 <_usb_device_remove+0x4d>\r
+ 15bb1: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 15bb4: 8b 40 10 mov 0x10(%eax),%eax\r
+ 15bb7: 83 78 0c 00 cmpl $0x0,0xc(%eax)\r
+ 15bbb: 74 14 je 15bd1 <_usb_device_remove+0x4d>\r
+ 15bbd: 83 ec 0c sub $0xc,%esp\r
+ 15bc0: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 15bc3: 8b 40 10 mov 0x10(%eax),%eax\r
+ 15bc6: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 15bc9: 8b 40 0c mov 0xc(%eax),%eax\r
+ 15bcc: ff d0 call *%eax\r
+ 15bce: 83 c4 10 add $0x10,%esp\r
+ 15bd1: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 15bd4: 83 78 10 00 cmpl $0x0,0x10(%eax)\r
+ 15bd8: 74 11 je 15beb <_usb_device_remove+0x67>\r
+ 15bda: 83 ec 08 sub $0x8,%esp\r
+ 15bdd: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 15be0: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 15be3: e8 3f 03 00 00 call 15f27 <_usb_driver_release_interface>\r
+ 15be8: 83 c4 10 add $0x10,%esp\r
+ 15beb: b8 00 00 00 00 mov $0x0,%eax\r
+ 15bf0: c9 leave \r
+ 15bf1: c3 ret \r
+\r
+00015bf2 <_usb_register>:\r
+ 15bf2: 55 push %ebp\r
+ 15bf3: 89 e5 mov %esp,%ebp\r
+ 15bf5: 83 ec 08 sub $0x8,%esp\r
+ 15bf8: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 15bff: 83 3d 30 c1 01 00 00 cmpl $0x0,0x1c130\r
+ 15c06: 74 09 je 15c11 <_usb_register+0x1f>\r
+ 15c08: c7 45 f8 ed ff ff ff movl $0xffffffed,0xfffffff8(%ebp)\r
+ 15c0f: eb 50 jmp 15c61 <_usb_register+0x6f>\r
+ 15c11: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 15c14: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15c17: 8b 40 04 mov 0x4(%eax),%eax\r
+ 15c1a: 89 42 18 mov %eax,0x18(%edx)\r
+ 15c1d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15c20: c7 40 1c f8 a0 01 00 movl $0x1a0f8,0x1c(%eax)\r
+ 15c27: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15c2a: c7 40 20 f4 5a 01 00 movl $0x15af4,0x20(%eax)\r
+ 15c31: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15c34: c7 40 24 84 5b 01 00 movl $0x15b84,0x24(%eax)\r
+ 15c3b: 83 ec 0c sub $0xc,%esp\r
+ 15c3e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15c41: 83 c0 18 add $0x18,%eax\r
+ 15c44: 50 push %eax\r
+ 15c45: e8 92 3b 00 00 call 197dc <_my_driver_register>\r
+ 15c4a: 83 c4 10 add $0x10,%esp\r
+ 15c4d: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 15c50: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 15c54: 75 05 jne 15c5b <_usb_register+0x69>\r
+ 15c56: e8 0b 00 00 00 call 15c66 <_usbfs_update_special>\r
+ 15c5b: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 15c5e: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 15c61: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 15c64: c9 leave \r
+ 15c65: c3 ret \r
+\r
+00015c66 <_usbfs_update_special>:\r
+ 15c66: 55 push %ebp\r
+ 15c67: 89 e5 mov %esp,%ebp\r
+ 15c69: 5d pop %ebp\r
+ 15c6a: c3 ret \r
+\r
+00015c6b <_usb_deregister>:\r
+ 15c6b: 55 push %ebp\r
+ 15c6c: 89 e5 mov %esp,%ebp\r
+ 15c6e: e8 f3 ff ff ff call 15c66 <_usbfs_update_special>\r
+ 15c73: 5d pop %ebp\r
+ 15c74: c3 ret \r
+\r
+00015c75 <_usb_ifnum_to_if>:\r
+ 15c75: 55 push %ebp\r
+ 15c76: 89 e5 mov %esp,%ebp\r
+ 15c78: 53 push %ebx\r
+ 15c79: 83 ec 08 sub $0x8,%esp\r
+ 15c7c: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 15c83: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15c86: 8b 80 88 01 00 00 mov 0x188(%eax),%eax\r
+ 15c8c: 8a 40 04 mov 0x4(%eax),%al\r
+ 15c8f: 25 ff 00 00 00 and $0xff,%eax\r
+ 15c94: 3b 45 f8 cmp 0xfffffff8(%ebp),%eax\r
+ 15c97: 7e 6f jle 15d08 <_usb_ifnum_to_if+0x93>\r
+ 15c99: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15c9c: 8b 98 88 01 00 00 mov 0x188(%eax),%ebx\r
+ 15ca2: 8b 4d f8 mov 0xfffffff8(%ebp),%ecx\r
+ 15ca5: 89 c8 mov %ecx,%eax\r
+ 15ca7: c1 e0 02 shl $0x2,%eax\r
+ 15caa: 01 c8 add %ecx,%eax\r
+ 15cac: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 15cb3: 01 d0 add %edx,%eax\r
+ 15cb5: 01 c0 add %eax,%eax\r
+ 15cb7: 01 c8 add %ecx,%eax\r
+ 15cb9: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 15cc0: 8b 43 0c mov 0xc(%ebx),%eax\r
+ 15cc3: 8b 04 02 mov (%edx,%eax,1),%eax\r
+ 15cc6: 8a 40 02 mov 0x2(%eax),%al\r
+ 15cc9: 25 ff 00 00 00 and $0xff,%eax\r
+ 15cce: 3b 45 0c cmp 0xc(%ebp),%eax\r
+ 15cd1: 75 2b jne 15cfe <_usb_ifnum_to_if+0x89>\r
+ 15cd3: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15cd6: 8b 98 88 01 00 00 mov 0x188(%eax),%ebx\r
+ 15cdc: 8b 4d f8 mov 0xfffffff8(%ebp),%ecx\r
+ 15cdf: 89 c8 mov %ecx,%eax\r
+ 15ce1: c1 e0 02 shl $0x2,%eax\r
+ 15ce4: 01 c8 add %ecx,%eax\r
+ 15ce6: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 15ced: 01 d0 add %edx,%eax\r
+ 15cef: 01 c0 add %eax,%eax\r
+ 15cf1: 01 c8 add %ecx,%eax\r
+ 15cf3: c1 e0 02 shl $0x2,%eax\r
+ 15cf6: 03 43 0c add 0xc(%ebx),%eax\r
+ 15cf9: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 15cfc: eb 11 jmp 15d0f <_usb_ifnum_to_if+0x9a>\r
+ 15cfe: 8d 45 f8 lea 0xfffffff8(%ebp),%eax\r
+ 15d01: ff 00 incl (%eax)\r
+ 15d03: e9 7b ff ff ff jmp 15c83 <_usb_ifnum_to_if+0xe>\r
+ 15d08: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 15d0f: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 15d12: 83 c4 08 add $0x8,%esp\r
+ 15d15: 5b pop %ebx\r
+ 15d16: 5d pop %ebp\r
+ 15d17: c3 ret \r
+\r
+00015d18 <_usb_epnum_to_ep_desc>:\r
+ 15d18: 55 push %ebp\r
+ 15d19: 89 e5 mov %esp,%ebp\r
+ 15d1b: 56 push %esi\r
+ 15d1c: 53 push %ebx\r
+ 15d1d: 83 ec 10 sub $0x10,%esp\r
+ 15d20: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 15d27: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15d2a: 8b 80 88 01 00 00 mov 0x188(%eax),%eax\r
+ 15d30: 8a 40 04 mov 0x4(%eax),%al\r
+ 15d33: 25 ff 00 00 00 and $0xff,%eax\r
+ 15d38: 3b 45 f4 cmp 0xfffffff4(%ebp),%eax\r
+ 15d3b: 0f 8e 65 01 00 00 jle 15ea6 <_usb_epnum_to_ep_desc+0x18e>\r
+ 15d41: c7 45 f0 00 00 00 00 movl $0x0,0xfffffff0(%ebp)\r
+ 15d48: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15d4b: 8b 98 88 01 00 00 mov 0x188(%eax),%ebx\r
+ 15d51: 8b 4d f4 mov 0xfffffff4(%ebp),%ecx\r
+ 15d54: 89 c8 mov %ecx,%eax\r
+ 15d56: c1 e0 02 shl $0x2,%eax\r
+ 15d59: 01 c8 add %ecx,%eax\r
+ 15d5b: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 15d62: 01 d0 add %edx,%eax\r
+ 15d64: 01 c0 add %eax,%eax\r
+ 15d66: 01 c8 add %ecx,%eax\r
+ 15d68: 8d 0c 85 00 00 00 00 lea 0x0(,%eax,4),%ecx\r
+ 15d6f: 8b 53 0c mov 0xc(%ebx),%edx\r
+ 15d72: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 15d75: 3b 44 11 08 cmp 0x8(%ecx,%edx,1),%eax\r
+ 15d79: 0f 83 1d 01 00 00 jae 15e9c <_usb_epnum_to_ep_desc+0x184>\r
+ 15d7f: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 15d86: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15d89: 8b 98 88 01 00 00 mov 0x188(%eax),%ebx\r
+ 15d8f: 8b 4d f4 mov 0xfffffff4(%ebp),%ecx\r
+ 15d92: 89 c8 mov %ecx,%eax\r
+ 15d94: c1 e0 02 shl $0x2,%eax\r
+ 15d97: 01 c8 add %ecx,%eax\r
+ 15d99: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 15da0: 01 d0 add %edx,%eax\r
+ 15da2: 01 c0 add %eax,%eax\r
+ 15da4: 01 c8 add %ecx,%eax\r
+ 15da6: 8d 0c 85 00 00 00 00 lea 0x0(,%eax,4),%ecx\r
+ 15dad: 8b 5b 0c mov 0xc(%ebx),%ebx\r
+ 15db0: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 15db3: 89 d0 mov %edx,%eax\r
+ 15db5: 01 c0 add %eax,%eax\r
+ 15db7: 01 d0 add %edx,%eax\r
+ 15db9: 8d 14 c5 00 00 00 00 lea 0x0(,%eax,8),%edx\r
+ 15dc0: 8b 04 19 mov (%ecx,%ebx,1),%eax\r
+ 15dc3: 8a 44 02 04 mov 0x4(%edx,%eax,1),%al\r
+ 15dc7: 25 ff 00 00 00 and $0xff,%eax\r
+ 15dcc: 3b 45 ec cmp 0xffffffec(%ebp),%eax\r
+ 15dcf: 0f 8e bd 00 00 00 jle 15e92 <_usb_epnum_to_ep_desc+0x17a>\r
+ 15dd5: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15dd8: 8b 98 88 01 00 00 mov 0x188(%eax),%ebx\r
+ 15dde: 8b 4d f4 mov 0xfffffff4(%ebp),%ecx\r
+ 15de1: 89 c8 mov %ecx,%eax\r
+ 15de3: c1 e0 02 shl $0x2,%eax\r
+ 15de6: 01 c8 add %ecx,%eax\r
+ 15de8: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 15def: 01 d0 add %edx,%eax\r
+ 15df1: 01 c0 add %eax,%eax\r
+ 15df3: 01 c8 add %ecx,%eax\r
+ 15df5: 8d 0c 85 00 00 00 00 lea 0x0(,%eax,4),%ecx\r
+ 15dfc: 8b 5b 0c mov 0xc(%ebx),%ebx\r
+ 15dff: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 15e02: 89 d0 mov %edx,%eax\r
+ 15e04: 01 c0 add %eax,%eax\r
+ 15e06: 01 d0 add %edx,%eax\r
+ 15e08: 8d 34 c5 00 00 00 00 lea 0x0(,%eax,8),%esi\r
+ 15e0f: 8b 0c 19 mov (%ecx,%ebx,1),%ecx\r
+ 15e12: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 15e15: 89 d0 mov %edx,%eax\r
+ 15e17: c1 e0 02 shl $0x2,%eax\r
+ 15e1a: 01 d0 add %edx,%eax\r
+ 15e1c: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 15e23: 8b 44 0e 0c mov 0xc(%esi,%ecx,1),%eax\r
+ 15e27: 8a 44 02 02 mov 0x2(%edx,%eax,1),%al\r
+ 15e2b: 25 ff 00 00 00 and $0xff,%eax\r
+ 15e30: 3b 45 0c cmp 0xc(%ebp),%eax\r
+ 15e33: 75 53 jne 15e88 <_usb_epnum_to_ep_desc+0x170>\r
+ 15e35: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15e38: 8b 98 88 01 00 00 mov 0x188(%eax),%ebx\r
+ 15e3e: 8b 4d f4 mov 0xfffffff4(%ebp),%ecx\r
+ 15e41: 89 c8 mov %ecx,%eax\r
+ 15e43: c1 e0 02 shl $0x2,%eax\r
+ 15e46: 01 c8 add %ecx,%eax\r
+ 15e48: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 15e4f: 01 d0 add %edx,%eax\r
+ 15e51: 01 c0 add %eax,%eax\r
+ 15e53: 01 c8 add %ecx,%eax\r
+ 15e55: 8d 0c 85 00 00 00 00 lea 0x0(,%eax,4),%ecx\r
+ 15e5c: 8b 5b 0c mov 0xc(%ebx),%ebx\r
+ 15e5f: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 15e62: 89 d0 mov %edx,%eax\r
+ 15e64: 01 c0 add %eax,%eax\r
+ 15e66: 01 d0 add %edx,%eax\r
+ 15e68: 8d 34 c5 00 00 00 00 lea 0x0(,%eax,8),%esi\r
+ 15e6f: 8b 0c 19 mov (%ecx,%ebx,1),%ecx\r
+ 15e72: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 15e75: 89 d0 mov %edx,%eax\r
+ 15e77: c1 e0 02 shl $0x2,%eax\r
+ 15e7a: 01 d0 add %edx,%eax\r
+ 15e7c: c1 e0 02 shl $0x2,%eax\r
+ 15e7f: 03 44 0e 0c add 0xc(%esi,%ecx,1),%eax\r
+ 15e83: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 15e86: eb 25 jmp 15ead <_usb_epnum_to_ep_desc+0x195>\r
+ 15e88: 8d 45 ec lea 0xffffffec(%ebp),%eax\r
+ 15e8b: ff 00 incl (%eax)\r
+ 15e8d: e9 f4 fe ff ff jmp 15d86 <_usb_epnum_to_ep_desc+0x6e>\r
+ 15e92: 8d 45 f0 lea 0xfffffff0(%ebp),%eax\r
+ 15e95: ff 00 incl (%eax)\r
+ 15e97: e9 ac fe ff ff jmp 15d48 <_usb_epnum_to_ep_desc+0x30>\r
+ 15e9c: 8d 45 f4 lea 0xfffffff4(%ebp),%eax\r
+ 15e9f: ff 00 incl (%eax)\r
+ 15ea1: e9 81 fe ff ff jmp 15d27 <_usb_epnum_to_ep_desc+0xf>\r
+ 15ea6: c7 45 e8 00 00 00 00 movl $0x0,0xffffffe8(%ebp)\r
+ 15ead: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 15eb0: 83 c4 10 add $0x10,%esp\r
+ 15eb3: 5b pop %ebx\r
+ 15eb4: 5e pop %esi\r
+ 15eb5: 5d pop %ebp\r
+ 15eb6: c3 ret \r
+\r
+00015eb7 <_usb_driver_claim_interface>:\r
+ 15eb7: 55 push %ebp\r
+ 15eb8: 89 e5 mov %esp,%ebp\r
+ 15eba: 83 ec 08 sub $0x8,%esp\r
+ 15ebd: 83 7d 0c 00 cmpl $0x0,0xc(%ebp)\r
+ 15ec1: 74 22 je 15ee5 <_usb_driver_claim_interface+0x2e>\r
+ 15ec3: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 15ec7: 75 02 jne 15ecb <_usb_driver_claim_interface+0x14>\r
+ 15ec9: eb 1a jmp 15ee5 <_usb_driver_claim_interface+0x2e>\r
+ 15ecb: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 15ece: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15ed1: 89 42 10 mov %eax,0x10(%edx)\r
+ 15ed4: 83 ec 08 sub $0x8,%esp\r
+ 15ed7: ff 75 10 pushl 0x10(%ebp)\r
+ 15eda: ff 75 0c pushl 0xc(%ebp)\r
+ 15edd: e8 05 00 00 00 call 15ee7 <_usb_set_intfdata>\r
+ 15ee2: 83 c4 10 add $0x10,%esp\r
+ 15ee5: c9 leave \r
+ 15ee6: c3 ret \r
+\r
+00015ee7 <_usb_set_intfdata>:\r
+ 15ee7: 55 push %ebp\r
+ 15ee8: 89 e5 mov %esp,%ebp\r
+ 15eea: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 15eed: 83 c2 18 add $0x18,%edx\r
+ 15ef0: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 15ef3: 89 82 9c 00 00 00 mov %eax,0x9c(%edx)\r
+ 15ef9: 5d pop %ebp\r
+ 15efa: c3 ret \r
+\r
+00015efb <_usb_interface_claimed>:\r
+ 15efb: 55 push %ebp\r
+ 15efc: 89 e5 mov %esp,%ebp\r
+ 15efe: 83 ec 04 sub $0x4,%esp\r
+ 15f01: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 15f05: 75 09 jne 15f10 <_usb_interface_claimed+0x15>\r
+ 15f07: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 15f0e: eb 12 jmp 15f22 <_usb_interface_claimed+0x27>\r
+ 15f10: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15f13: 83 78 10 00 cmpl $0x0,0x10(%eax)\r
+ 15f17: 0f 95 c0 setne %al\r
+ 15f1a: 25 ff 00 00 00 and $0xff,%eax\r
+ 15f1f: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 15f22: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 15f25: c9 leave \r
+ 15f26: c3 ret \r
+\r
+00015f27 <_usb_driver_release_interface>:\r
+ 15f27: 55 push %ebp\r
+ 15f28: 89 e5 mov %esp,%ebp\r
+ 15f2a: 83 7d 0c 00 cmpl $0x0,0xc(%ebp)\r
+ 15f2e: 74 22 je 15f52 <_usb_driver_release_interface+0x2b>\r
+ 15f30: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 15f33: 8b 40 10 mov 0x10(%eax),%eax\r
+ 15f36: 3b 45 08 cmp 0x8(%ebp),%eax\r
+ 15f39: 75 17 jne 15f52 <_usb_driver_release_interface+0x2b>\r
+ 15f3b: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 15f3e: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax)\r
+ 15f45: 6a 00 push $0x0\r
+ 15f47: ff 75 0c pushl 0xc(%ebp)\r
+ 15f4a: e8 98 ff ff ff call 15ee7 <_usb_set_intfdata>\r
+ 15f4f: 83 c4 08 add $0x8,%esp\r
+ 15f52: c9 leave \r
+ 15f53: c3 ret \r
+\r
+00015f54 <_usb_match_id>:\r
+ 15f54: 55 push %ebp\r
+ 15f55: 89 e5 mov %esp,%ebp\r
+ 15f57: 83 ec 10 sub $0x10,%esp\r
+ 15f5a: 83 7d 0c 00 cmpl $0x0,0xc(%ebp)\r
+ 15f5e: 75 0c jne 15f6c <_usb_match_id+0x18>\r
+ 15f60: c7 45 f0 00 00 00 00 movl $0x0,0xfffffff0(%ebp)\r
+ 15f67: e9 0f 02 00 00 jmp 1617b <_usb_match_id+0x227>\r
+ 15f6c: 8b 4d 08 mov 0x8(%ebp),%ecx\r
+ 15f6f: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15f72: 8b 50 04 mov 0x4(%eax),%edx\r
+ 15f75: 89 d0 mov %edx,%eax\r
+ 15f77: 01 c0 add %eax,%eax\r
+ 15f79: 01 d0 add %edx,%eax\r
+ 15f7b: c1 e0 03 shl $0x3,%eax\r
+ 15f7e: 03 01 add (%ecx),%eax\r
+ 15f80: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 15f83: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 15f86: 8b 80 b8 00 00 00 mov 0xb8(%eax),%eax\r
+ 15f8c: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 15f8f: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 15f92: 2d c0 00 00 00 sub $0xc0,%eax\r
+ 15f97: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 15f9a: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 15f9d: 66 83 78 02 00 cmpw $0x0,0x2(%eax)\r
+ 15fa2: 75 20 jne 15fc4 <_usb_match_id+0x70>\r
+ 15fa4: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 15fa7: 80 78 0a 00 cmpb $0x0,0xa(%eax)\r
+ 15fab: 75 17 jne 15fc4 <_usb_match_id+0x70>\r
+ 15fad: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 15fb0: 80 78 0d 00 cmpb $0x0,0xd(%eax)\r
+ 15fb4: 75 0e jne 15fc4 <_usb_match_id+0x70>\r
+ 15fb6: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 15fb9: 83 78 10 00 cmpl $0x0,0x10(%eax)\r
+ 15fbd: 75 05 jne 15fc4 <_usb_match_id+0x70>\r
+ 15fbf: e9 b0 01 00 00 jmp 16174 <_usb_match_id+0x220>\r
+ 15fc4: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 15fc7: 66 8b 00 mov (%eax),%ax\r
+ 15fca: 25 ff ff 00 00 and $0xffff,%eax\r
+ 15fcf: 83 e0 01 and $0x1,%eax\r
+ 15fd2: 85 c0 test %eax,%eax\r
+ 15fd4: 74 18 je 15fee <_usb_match_id+0x9a>\r
+ 15fd6: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 15fd9: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 15fdc: 66 8b 40 02 mov 0x2(%eax),%ax\r
+ 15fe0: 66 3b 82 78 01 00 00 cmp 0x178(%edx),%ax\r
+ 15fe7: 74 05 je 15fee <_usb_match_id+0x9a>\r
+ 15fe9: e9 7b 01 00 00 jmp 16169 <_usb_match_id+0x215>\r
+ 15fee: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 15ff1: 66 8b 00 mov (%eax),%ax\r
+ 15ff4: 25 ff ff 00 00 and $0xffff,%eax\r
+ 15ff9: d1 e8 shr %eax\r
+ 15ffb: 83 e0 01 and $0x1,%eax\r
+ 15ffe: 85 c0 test %eax,%eax\r
+ 16000: 74 18 je 1601a <_usb_match_id+0xc6>\r
+ 16002: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 16005: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 16008: 66 8b 40 04 mov 0x4(%eax),%ax\r
+ 1600c: 66 3b 82 7a 01 00 00 cmp 0x17a(%edx),%ax\r
+ 16013: 74 05 je 1601a <_usb_match_id+0xc6>\r
+ 16015: e9 4f 01 00 00 jmp 16169 <_usb_match_id+0x215>\r
+ 1601a: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1601d: 66 8b 00 mov (%eax),%ax\r
+ 16020: 25 ff ff 00 00 and $0xffff,%eax\r
+ 16025: c1 e8 02 shr $0x2,%eax\r
+ 16028: 83 e0 01 and $0x1,%eax\r
+ 1602b: 85 c0 test %eax,%eax\r
+ 1602d: 74 18 je 16047 <_usb_match_id+0xf3>\r
+ 1602f: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 16032: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 16035: 66 8b 40 06 mov 0x6(%eax),%ax\r
+ 16039: 66 3b 82 7c 01 00 00 cmp 0x17c(%edx),%ax\r
+ 16040: 76 05 jbe 16047 <_usb_match_id+0xf3>\r
+ 16042: e9 22 01 00 00 jmp 16169 <_usb_match_id+0x215>\r
+ 16047: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1604a: 66 8b 00 mov (%eax),%ax\r
+ 1604d: 25 ff ff 00 00 and $0xffff,%eax\r
+ 16052: c1 e8 03 shr $0x3,%eax\r
+ 16055: 83 e0 01 and $0x1,%eax\r
+ 16058: 85 c0 test %eax,%eax\r
+ 1605a: 74 18 je 16074 <_usb_match_id+0x120>\r
+ 1605c: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1605f: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 16062: 66 8b 40 08 mov 0x8(%eax),%ax\r
+ 16066: 66 3b 82 7c 01 00 00 cmp 0x17c(%edx),%ax\r
+ 1606d: 73 05 jae 16074 <_usb_match_id+0x120>\r
+ 1606f: e9 f5 00 00 00 jmp 16169 <_usb_match_id+0x215>\r
+ 16074: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 16077: 66 8b 00 mov (%eax),%ax\r
+ 1607a: 25 ff ff 00 00 and $0xffff,%eax\r
+ 1607f: c1 e8 04 shr $0x4,%eax\r
+ 16082: 83 e0 01 and $0x1,%eax\r
+ 16085: 85 c0 test %eax,%eax\r
+ 16087: 74 16 je 1609f <_usb_match_id+0x14b>\r
+ 16089: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1608c: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 1608f: 8a 40 0a mov 0xa(%eax),%al\r
+ 16092: 3a 82 74 01 00 00 cmp 0x174(%edx),%al\r
+ 16098: 74 05 je 1609f <_usb_match_id+0x14b>\r
+ 1609a: e9 ca 00 00 00 jmp 16169 <_usb_match_id+0x215>\r
+ 1609f: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 160a2: 66 8b 00 mov (%eax),%ax\r
+ 160a5: 25 ff ff 00 00 and $0xffff,%eax\r
+ 160aa: c1 e8 05 shr $0x5,%eax\r
+ 160ad: 83 e0 01 and $0x1,%eax\r
+ 160b0: 85 c0 test %eax,%eax\r
+ 160b2: 74 16 je 160ca <_usb_match_id+0x176>\r
+ 160b4: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 160b7: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 160ba: 8a 40 0b mov 0xb(%eax),%al\r
+ 160bd: 3a 82 75 01 00 00 cmp 0x175(%edx),%al\r
+ 160c3: 74 05 je 160ca <_usb_match_id+0x176>\r
+ 160c5: e9 9f 00 00 00 jmp 16169 <_usb_match_id+0x215>\r
+ 160ca: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 160cd: 66 8b 00 mov (%eax),%ax\r
+ 160d0: 25 ff ff 00 00 and $0xffff,%eax\r
+ 160d5: c1 e8 06 shr $0x6,%eax\r
+ 160d8: 83 e0 01 and $0x1,%eax\r
+ 160db: 85 c0 test %eax,%eax\r
+ 160dd: 74 13 je 160f2 <_usb_match_id+0x19e>\r
+ 160df: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 160e2: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 160e5: 8a 40 0c mov 0xc(%eax),%al\r
+ 160e8: 3a 82 76 01 00 00 cmp 0x176(%edx),%al\r
+ 160ee: 74 02 je 160f2 <_usb_match_id+0x19e>\r
+ 160f0: eb 77 jmp 16169 <_usb_match_id+0x215>\r
+ 160f2: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 160f5: 66 8b 00 mov (%eax),%ax\r
+ 160f8: 25 ff ff 00 00 and $0xffff,%eax\r
+ 160fd: c1 e8 07 shr $0x7,%eax\r
+ 16100: 83 e0 01 and $0x1,%eax\r
+ 16103: 85 c0 test %eax,%eax\r
+ 16105: 74 10 je 16117 <_usb_match_id+0x1c3>\r
+ 16107: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1610a: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 1610d: 8a 40 0d mov 0xd(%eax),%al\r
+ 16110: 3a 42 05 cmp 0x5(%edx),%al\r
+ 16113: 74 02 je 16117 <_usb_match_id+0x1c3>\r
+ 16115: eb 52 jmp 16169 <_usb_match_id+0x215>\r
+ 16117: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1611a: 66 8b 00 mov (%eax),%ax\r
+ 1611d: 25 ff ff 00 00 and $0xffff,%eax\r
+ 16122: c1 e8 08 shr $0x8,%eax\r
+ 16125: 83 e0 01 and $0x1,%eax\r
+ 16128: 85 c0 test %eax,%eax\r
+ 1612a: 74 10 je 1613c <_usb_match_id+0x1e8>\r
+ 1612c: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1612f: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 16132: 8a 40 0e mov 0xe(%eax),%al\r
+ 16135: 3a 42 06 cmp 0x6(%edx),%al\r
+ 16138: 74 02 je 1613c <_usb_match_id+0x1e8>\r
+ 1613a: eb 2d jmp 16169 <_usb_match_id+0x215>\r
+ 1613c: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1613f: 66 8b 00 mov (%eax),%ax\r
+ 16142: 25 ff ff 00 00 and $0xffff,%eax\r
+ 16147: c1 e8 09 shr $0x9,%eax\r
+ 1614a: 83 e0 01 and $0x1,%eax\r
+ 1614d: 85 c0 test %eax,%eax\r
+ 1614f: 74 10 je 16161 <_usb_match_id+0x20d>\r
+ 16151: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 16154: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 16157: 8a 40 0f mov 0xf(%eax),%al\r
+ 1615a: 3a 42 07 cmp 0x7(%edx),%al\r
+ 1615d: 74 02 je 16161 <_usb_match_id+0x20d>\r
+ 1615f: eb 08 jmp 16169 <_usb_match_id+0x215>\r
+ 16161: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 16164: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 16167: eb 12 jmp 1617b <_usb_match_id+0x227>\r
+ 16169: 8d 45 0c lea 0xc(%ebp),%eax\r
+ 1616c: 83 00 14 addl $0x14,(%eax)\r
+ 1616f: e9 26 fe ff ff jmp 15f9a <_usb_match_id+0x46>\r
+ 16174: c7 45 f0 00 00 00 00 movl $0x0,0xfffffff0(%ebp)\r
+ 1617b: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 1617e: c9 leave \r
+ 1617f: c3 ret \r
+\r
+00016180 <_usb_find_interface>:\r
+ 16180: 55 push %ebp\r
+ 16181: 89 e5 mov %esp,%ebp\r
+ 16183: 83 ec 14 sub $0x14,%esp\r
+ 16186: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16189: 83 c0 28 add $0x28,%eax\r
+ 1618c: 8b 00 mov (%eax),%eax\r
+ 1618e: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 16191: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16194: 83 c0 28 add $0x28,%eax\r
+ 16197: 3b 45 fc cmp 0xfffffffc(%ebp),%eax\r
+ 1619a: 74 59 je 161f5 <_usb_find_interface+0x75>\r
+ 1619c: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1619f: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 161a2: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 161a5: 2d a4 00 00 00 sub $0xa4,%eax\r
+ 161aa: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 161ad: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 161b0: 81 b8 98 00 00 00 e0 cmpl $0x1a0e0,0x98(%eax)\r
+ 161b7: a0 01 00 \r
+ 161ba: 75 02 jne 161be <_usb_find_interface+0x3e>\r
+ 161bc: eb 2d jmp 161eb <_usb_find_interface+0x6b>\r
+ 161be: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 161c1: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 161c4: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 161c7: 83 e8 18 sub $0x18,%eax\r
+ 161ca: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 161cd: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 161d0: 83 78 14 ff cmpl $0xffffffff,0x14(%eax)\r
+ 161d4: 75 02 jne 161d8 <_usb_find_interface+0x58>\r
+ 161d6: eb 13 jmp 161eb <_usb_find_interface+0x6b>\r
+ 161d8: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 161db: 8b 40 14 mov 0x14(%eax),%eax\r
+ 161de: 3b 45 0c cmp 0xc(%ebp),%eax\r
+ 161e1: 75 08 jne 161eb <_usb_find_interface+0x6b>\r
+ 161e3: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 161e6: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 161e9: eb 11 jmp 161fc <_usb_find_interface+0x7c>\r
+ 161eb: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 161ee: 8b 00 mov (%eax),%eax\r
+ 161f0: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 161f3: eb 9c jmp 16191 <_usb_find_interface+0x11>\r
+ 161f5: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 161fc: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 161ff: c9 leave \r
+ 16200: c3 ret \r
+\r
+00016201 <_usb_device_match>:\r
+ 16201: 55 push %ebp\r
+ 16202: 89 e5 mov %esp,%ebp\r
+ 16204: 83 ec 14 sub $0x14,%esp\r
+ 16207: 81 7d 0c e0 a0 01 00 cmpl $0x1a0e0,0xc(%ebp)\r
+ 1620e: 75 09 jne 16219 <_usb_device_match+0x18>\r
+ 16210: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 16217: eb 51 jmp 1626a <_usb_device_match+0x69>\r
+ 16219: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1621c: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 1621f: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 16222: 83 e8 18 sub $0x18,%eax\r
+ 16225: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 16228: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1622b: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 1622e: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 16231: 83 e8 18 sub $0x18,%eax\r
+ 16234: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 16237: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1623a: 8b 40 14 mov 0x14(%eax),%eax\r
+ 1623d: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 16240: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 16243: ff 70 14 pushl 0x14(%eax)\r
+ 16246: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 16249: e8 06 fd ff ff call 15f54 <_usb_match_id>\r
+ 1624e: 83 c4 08 add $0x8,%esp\r
+ 16251: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 16254: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 16258: 74 09 je 16263 <_usb_device_match+0x62>\r
+ 1625a: c7 45 ec 01 00 00 00 movl $0x1,0xffffffec(%ebp)\r
+ 16261: eb 07 jmp 1626a <_usb_device_match+0x69>\r
+ 16263: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 1626a: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 1626d: c9 leave \r
+ 1626e: c3 ret \r
+\r
+0001626f <_usb_hotplug>:\r
+ 1626f: 55 push %ebp\r
+ 16270: 89 e5 mov %esp,%ebp\r
+ 16272: b8 ed ff ff ff mov $0xffffffed,%eax\r
+ 16277: 5d pop %ebp\r
+ 16278: c3 ret \r
+\r
+00016279 <_usb_alloc_dev@8>:\r
+ 16279: 55 push %ebp\r
+ 1627a: 89 e5 mov %esp,%ebp\r
+ 1627c: 83 ec 08 sub $0x8,%esp\r
+ 1627f: 83 ec 08 sub $0x8,%esp\r
+ 16282: 68 f0 01 00 00 push $0x1f0\r
+ 16287: 6a 01 push $0x1\r
+ 16289: e8 a2 37 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 1628e: 83 c4 08 add $0x8,%esp\r
+ 16291: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 16294: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 16298: 75 0c jne 162a6 <_usb_alloc_dev@8+0x2d>\r
+ 1629a: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 162a1: e9 bd 00 00 00 jmp 16363 <_usb_alloc_dev@8+0xea>\r
+ 162a6: 83 ec 04 sub $0x4,%esp\r
+ 162a9: 68 f0 01 00 00 push $0x1f0\r
+ 162ae: 6a 00 push $0x0\r
+ 162b0: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 162b3: e8 98 37 00 00 call 19a50 <_memset>\r
+ 162b8: 83 c4 10 add $0x10,%esp\r
+ 162bb: 83 ec 0c sub $0xc,%esp\r
+ 162be: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 162c1: 05 c0 00 00 00 add $0xc0,%eax\r
+ 162c6: 50 push %eax\r
+ 162c7: e8 94 35 00 00 call 19860 <_my_device_initialize>\r
+ 162cc: 83 c4 10 add $0x10,%esp\r
+ 162cf: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 162d2: c7 40 14 01 00 00 00 movl $0x1,0x14(%eax)\r
+ 162d9: 83 ec 0c sub $0xc,%esp\r
+ 162dc: ff 75 0c pushl 0xc(%ebp)\r
+ 162df: e8 b2 c2 ff ff call 12596 <_usb_bus_get>\r
+ 162e4: 83 c4 10 add $0x10,%esp\r
+ 162e7: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 162eb: 75 07 jne 162f4 <_usb_alloc_dev@8+0x7b>\r
+ 162ed: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 162f0: c6 40 04 30 movb $0x30,0x4(%eax)\r
+ 162f4: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 162f7: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 162fa: 89 82 bc 00 00 00 mov %eax,0xbc(%edx)\r
+ 16300: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 16303: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16306: 89 82 b8 00 00 00 mov %eax,0xb8(%edx)\r
+ 1630c: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 1630f: 81 c2 9c 01 00 00 add $0x19c,%edx\r
+ 16315: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 16318: 05 9c 01 00 00 add $0x19c,%eax\r
+ 1631d: 89 02 mov %eax,(%edx)\r
+ 1631f: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 16322: 81 c2 9c 01 00 00 add $0x19c,%edx\r
+ 16328: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1632b: 05 9c 01 00 00 add $0x19c,%eax\r
+ 16330: 89 42 04 mov %eax,0x4(%edx)\r
+ 16333: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 16336: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 1633c: 8b 40 20 mov 0x20(%eax),%eax\r
+ 1633f: 83 38 00 cmpl $0x0,(%eax)\r
+ 16342: 74 19 je 1635d <_usb_alloc_dev@8+0xe4>\r
+ 16344: 83 ec 0c sub $0xc,%esp\r
+ 16347: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1634a: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 16350: 8b 40 20 mov 0x20(%eax),%eax\r
+ 16353: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 16356: 8b 00 mov (%eax),%eax\r
+ 16358: ff d0 call *%eax\r
+ 1635a: 83 c4 10 add $0x10,%esp\r
+ 1635d: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 16360: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 16363: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 16366: c9 leave \r
+ 16367: c2 08 00 ret $0x8\r
+\r
+0001636a <_usb_get_dev>:\r
+ 1636a: 55 push %ebp\r
+ 1636b: 89 e5 mov %esp,%ebp\r
+ 1636d: 83 ec 18 sub $0x18,%esp\r
+ 16370: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 16374: 75 09 jne 1637f <_usb_get_dev+0x15>\r
+ 16376: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 1637d: eb 37 jmp 163b6 <_usb_get_dev+0x4c>\r
+ 1637f: 83 ec 0c sub $0xc,%esp\r
+ 16382: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16385: 05 c0 00 00 00 add $0xc0,%eax\r
+ 1638a: 50 push %eax\r
+ 1638b: e8 c6 34 00 00 call 19856 <_my_get_device>\r
+ 16390: 83 c4 10 add $0x10,%esp\r
+ 16393: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 16396: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 1639a: 74 13 je 163af <_usb_get_dev+0x45>\r
+ 1639c: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1639f: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 163a2: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 163a5: 2d c0 00 00 00 sub $0xc0,%eax\r
+ 163aa: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 163ad: eb 07 jmp 163b6 <_usb_get_dev+0x4c>\r
+ 163af: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 163b6: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 163b9: c9 leave \r
+ 163ba: c3 ret \r
+\r
+000163bb <_usb_put_dev@4>:\r
+ 163bb: 55 push %ebp\r
+ 163bc: 89 e5 mov %esp,%ebp\r
+ 163be: 5d pop %ebp\r
+ 163bf: c2 04 00 ret $0x4\r
+\r
+000163c2 <_usb_release_dev>:\r
+ 163c2: 55 push %ebp\r
+ 163c3: 89 e5 mov %esp,%ebp\r
+ 163c5: 83 ec 08 sub $0x8,%esp\r
+ 163c8: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 163cb: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 163ce: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 163d1: 2d c0 00 00 00 sub $0xc0,%eax\r
+ 163d6: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 163d9: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 163dc: 83 b8 bc 00 00 00 00 cmpl $0x0,0xbc(%eax)\r
+ 163e3: 74 3b je 16420 <_usb_release_dev+0x5e>\r
+ 163e5: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 163e8: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 163ee: 83 78 20 00 cmpl $0x0,0x20(%eax)\r
+ 163f2: 74 2c je 16420 <_usb_release_dev+0x5e>\r
+ 163f4: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 163f7: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 163fd: 8b 40 20 mov 0x20(%eax),%eax\r
+ 16400: 83 78 04 00 cmpl $0x0,0x4(%eax)\r
+ 16404: 74 1a je 16420 <_usb_release_dev+0x5e>\r
+ 16406: 83 ec 0c sub $0xc,%esp\r
+ 16409: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1640c: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 16412: 8b 40 20 mov 0x20(%eax),%eax\r
+ 16415: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 16418: 8b 40 04 mov 0x4(%eax),%eax\r
+ 1641b: ff d0 call *%eax\r
+ 1641d: 83 c4 10 add $0x10,%esp\r
+ 16420: 83 ec 0c sub $0xc,%esp\r
+ 16423: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 16426: e8 ca 17 00 00 call 17bf5 <_usb_destroy_configuration>\r
+ 1642b: 83 c4 10 add $0x10,%esp\r
+ 1642e: 83 ec 0c sub $0xc,%esp\r
+ 16431: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 16434: ff b0 bc 00 00 00 pushl 0xbc(%eax)\r
+ 1643a: e8 6d c1 ff ff call 125ac <_usb_bus_put>\r
+ 1643f: 83 c4 10 add $0x10,%esp\r
+ 16442: 83 ec 0c sub $0xc,%esp\r
+ 16445: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 16448: e8 f3 35 00 00 call 19a40 <_ExFreePool@4>\r
+ 1644d: 83 c4 0c add $0xc,%esp\r
+ 16450: c9 leave \r
+ 16451: c3 ret \r
+\r
+00016452 <_match_device>:\r
+ 16452: 55 push %ebp\r
+ 16453: 89 e5 mov %esp,%ebp\r
+ 16455: 83 ec 18 sub $0x18,%esp\r
+ 16458: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1645b: 8b 55 10 mov 0x10(%ebp),%edx\r
+ 1645e: 66 89 45 fe mov %ax,0xfffffffe(%ebp)\r
+ 16462: 66 89 55 fc mov %dx,0xfffffffc(%ebp)\r
+ 16466: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 1646d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16470: 66 8b 80 78 01 00 00 mov 0x178(%eax),%ax\r
+ 16477: 66 3b 45 fe cmp 0xfffffffe(%ebp),%ax\r
+ 1647b: 75 23 jne 164a0 <_match_device+0x4e>\r
+ 1647d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16480: 66 8b 80 7a 01 00 00 mov 0x17a(%eax),%ax\r
+ 16487: 66 3b 45 fc cmp 0xfffffffc(%ebp),%ax\r
+ 1648b: 75 13 jne 164a0 <_match_device+0x4e>\r
+ 1648d: 83 ec 0c sub $0xc,%esp\r
+ 16490: ff 75 08 pushl 0x8(%ebp)\r
+ 16493: e8 d2 fe ff ff call 1636a <_usb_get_dev>\r
+ 16498: 83 c4 10 add $0x10,%esp\r
+ 1649b: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 1649e: eb 62 jmp 16502 <_match_device+0xb0>\r
+ 164a0: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 164a7: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 164aa: 8b 80 ac 01 00 00 mov 0x1ac(%eax),%eax\r
+ 164b0: 3b 45 f4 cmp 0xfffffff4(%ebp),%eax\r
+ 164b3: 7e 4d jle 16502 <_match_device+0xb0>\r
+ 164b5: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 164b8: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 164bb: 83 bc 82 b0 01 00 00 cmpl $0x0,0x1b0(%edx,%eax,4)\r
+ 164c2: 00 \r
+ 164c3: 74 36 je 164fb <_match_device+0xa9>\r
+ 164c5: 83 ec 04 sub $0x4,%esp\r
+ 164c8: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 164cb: 25 ff ff 00 00 and $0xffff,%eax\r
+ 164d0: 50 push %eax\r
+ 164d1: 66 8b 45 fe mov 0xfffffffe(%ebp),%ax\r
+ 164d5: 25 ff ff 00 00 and $0xffff,%eax\r
+ 164da: 50 push %eax\r
+ 164db: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 164de: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 164e1: ff b4 82 b0 01 00 00 pushl 0x1b0(%edx,%eax,4)\r
+ 164e8: e8 65 ff ff ff call 16452 <_match_device>\r
+ 164ed: 83 c4 10 add $0x10,%esp\r
+ 164f0: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 164f3: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 164f7: 74 02 je 164fb <_match_device+0xa9>\r
+ 164f9: eb 07 jmp 16502 <_match_device+0xb0>\r
+ 164fb: 8d 45 f4 lea 0xfffffff4(%ebp),%eax\r
+ 164fe: ff 00 incl (%eax)\r
+ 16500: eb a5 jmp 164a7 <_match_device+0x55>\r
+ 16502: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 16505: c9 leave \r
+ 16506: c3 ret \r
+\r
+00016507 <_usb_find_device>:\r
+ 16507: 55 push %ebp\r
+ 16508: 89 e5 mov %esp,%ebp\r
+ 1650a: 83 ec 18 sub $0x18,%esp\r
+ 1650d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16510: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 16513: 66 89 45 fe mov %ax,0xfffffffe(%ebp)\r
+ 16517: 66 89 55 fc mov %dx,0xfffffffc(%ebp)\r
+ 1651b: c7 45 f0 00 00 00 00 movl $0x0,0xfffffff0(%ebp)\r
+ 16522: a1 00 a0 01 00 mov 0x1a000,%eax\r
+ 16527: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 1652a: 81 7d f8 00 a0 01 00 cmpl $0x1a000,0xfffffff8(%ebp)\r
+ 16531: 74 48 je 1657b <_usb_find_device+0x74>\r
+ 16533: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 16536: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 16539: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 1653c: 83 e8 28 sub $0x28,%eax\r
+ 1653f: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 16542: 83 ec 04 sub $0x4,%esp\r
+ 16545: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 16548: 25 ff ff 00 00 and $0xffff,%eax\r
+ 1654d: 50 push %eax\r
+ 1654e: 66 8b 45 fe mov 0xfffffffe(%ebp),%ax\r
+ 16552: 25 ff ff 00 00 and $0xffff,%eax\r
+ 16557: 50 push %eax\r
+ 16558: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 1655b: ff 70 24 pushl 0x24(%eax)\r
+ 1655e: e8 ef fe ff ff call 16452 <_match_device>\r
+ 16563: 83 c4 10 add $0x10,%esp\r
+ 16566: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 16569: 83 7d f0 00 cmpl $0x0,0xfffffff0(%ebp)\r
+ 1656d: 74 02 je 16571 <_usb_find_device+0x6a>\r
+ 1656f: eb 0a jmp 1657b <_usb_find_device+0x74>\r
+ 16571: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 16574: 8b 00 mov (%eax),%eax\r
+ 16576: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 16579: eb af jmp 1652a <_usb_find_device+0x23>\r
+ 1657b: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 1657e: c9 leave \r
+ 1657f: c3 ret \r
+\r
+00016580 <_usb_get_current_frame_number>:\r
+ 16580: 55 push %ebp\r
+ 16581: 89 e5 mov %esp,%ebp\r
+ 16583: 83 ec 08 sub $0x8,%esp\r
+ 16586: 83 ec 0c sub $0xc,%esp\r
+ 16589: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1658c: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 16592: 8b 40 20 mov 0x20(%eax),%eax\r
+ 16595: ff 75 08 pushl 0x8(%ebp)\r
+ 16598: 8b 40 08 mov 0x8(%eax),%eax\r
+ 1659b: ff d0 call *%eax\r
+ 1659d: 83 c4 10 add $0x10,%esp\r
+ 165a0: c9 leave \r
+ 165a1: c3 ret \r
+\r
+000165a2 <___usb_get_extra_descriptor>:\r
+ 165a2: 55 push %ebp\r
+ 165a3: 89 e5 mov %esp,%ebp\r
+ 165a5: 83 ec 0c sub $0xc,%esp\r
+ 165a8: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 165ab: 88 45 ff mov %al,0xffffffff(%ebp)\r
+ 165ae: 83 7d 0c 01 cmpl $0x1,0xc(%ebp)\r
+ 165b2: 76 51 jbe 16605 <___usb_get_extra_descriptor+0x63>\r
+ 165b4: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 165b7: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 165ba: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 165bd: 80 38 01 cmpb $0x1,(%eax)\r
+ 165c0: 77 09 ja 165cb <___usb_get_extra_descriptor+0x29>\r
+ 165c2: c7 45 f4 ff ff ff ff movl $0xffffffff,0xfffffff4(%ebp)\r
+ 165c9: eb 41 jmp 1660c <___usb_get_extra_descriptor+0x6a>\r
+ 165cb: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 165ce: 8a 40 01 mov 0x1(%eax),%al\r
+ 165d1: 3a 45 ff cmp 0xffffffff(%ebp),%al\r
+ 165d4: 75 11 jne 165e7 <___usb_get_extra_descriptor+0x45>\r
+ 165d6: 8b 55 14 mov 0x14(%ebp),%edx\r
+ 165d9: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 165dc: 89 02 mov %eax,(%edx)\r
+ 165de: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 165e5: eb 25 jmp 1660c <___usb_get_extra_descriptor+0x6a>\r
+ 165e7: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 165ea: 8a 00 mov (%eax),%al\r
+ 165ec: 25 ff 00 00 00 and $0xff,%eax\r
+ 165f1: 01 45 08 add %eax,0x8(%ebp)\r
+ 165f4: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 165f7: ba 00 00 00 00 mov $0x0,%edx\r
+ 165fc: 8a 10 mov (%eax),%dl\r
+ 165fe: 8d 45 0c lea 0xc(%ebp),%eax\r
+ 16601: 29 10 sub %edx,(%eax)\r
+ 16603: eb a9 jmp 165ae <___usb_get_extra_descriptor+0xc>\r
+ 16605: c7 45 f4 ff ff ff ff movl $0xffffffff,0xfffffff4(%ebp)\r
+ 1660c: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 1660f: c9 leave \r
+ 16610: c3 ret \r
+\r
+00016611 <_usb_disconnect>:\r
+ 16611: 55 push %ebp\r
+ 16612: 89 e5 mov %esp,%ebp\r
+ 16614: 53 push %ebx\r
+ 16615: 83 ec 14 sub $0x14,%esp\r
+ 16618: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1661b: 8b 00 mov (%eax),%eax\r
+ 1661d: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 16620: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 16624: 75 05 jne 1662b <_usb_disconnect+0x1a>\r
+ 16626: e9 73 01 00 00 jmp 1679e <_usb_disconnect+0x18d>\r
+ 1662b: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1662e: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 16634: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 16637: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 1663b: 75 05 jne 16642 <_usb_disconnect+0x31>\r
+ 1663d: e9 5c 01 00 00 jmp 1679e <_usb_disconnect+0x18d>\r
+ 16642: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 16645: 8b 40 20 mov 0x20(%eax),%eax\r
+ 16648: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 1664b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1664e: c7 00 00 00 00 00 movl $0x0,(%eax)\r
+ 16654: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 16657: c7 40 14 00 00 00 00 movl $0x0,0x14(%eax)\r
+ 1665e: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 16665: 83 7d ec 0f cmpl $0xf,0xffffffec(%ebp)\r
+ 16669: 7f 2e jg 16699 <_usb_disconnect+0x88>\r
+ 1666b: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 1666e: c1 e0 02 shl $0x2,%eax\r
+ 16671: 03 45 f8 add 0xfffffff8(%ebp),%eax\r
+ 16674: 05 b0 01 00 00 add $0x1b0,%eax\r
+ 16679: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 1667c: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 1667f: 83 38 00 cmpl $0x0,(%eax)\r
+ 16682: 74 0e je 16692 <_usb_disconnect+0x81>\r
+ 16684: 83 ec 0c sub $0xc,%esp\r
+ 16687: ff 75 e8 pushl 0xffffffe8(%ebp)\r
+ 1668a: e8 82 ff ff ff call 16611 <_usb_disconnect>\r
+ 1668f: 83 c4 10 add $0x10,%esp\r
+ 16692: 8d 45 ec lea 0xffffffec(%ebp),%eax\r
+ 16695: ff 00 incl (%eax)\r
+ 16697: eb cc jmp 16665 <_usb_disconnect+0x54>\r
+ 16699: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1669c: 83 b8 88 01 00 00 00 cmpl $0x0,0x188(%eax)\r
+ 166a3: 74 5f je 16704 <_usb_disconnect+0xf3>\r
+ 166a5: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 166ac: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 166af: 8b 80 88 01 00 00 mov 0x188(%eax),%eax\r
+ 166b5: 8a 40 04 mov 0x4(%eax),%al\r
+ 166b8: 25 ff 00 00 00 and $0xff,%eax\r
+ 166bd: 3b 45 ec cmp 0xffffffec(%ebp),%eax\r
+ 166c0: 7e 42 jle 16704 <_usb_disconnect+0xf3>\r
+ 166c2: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 166c5: 8b 98 88 01 00 00 mov 0x188(%eax),%ebx\r
+ 166cb: 8b 4d ec mov 0xffffffec(%ebp),%ecx\r
+ 166ce: 89 c8 mov %ecx,%eax\r
+ 166d0: c1 e0 02 shl $0x2,%eax\r
+ 166d3: 01 c8 add %ecx,%eax\r
+ 166d5: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 166dc: 01 d0 add %edx,%eax\r
+ 166de: 01 c0 add %eax,%eax\r
+ 166e0: 01 c8 add %ecx,%eax\r
+ 166e2: c1 e0 02 shl $0x2,%eax\r
+ 166e5: 03 43 0c add 0xc(%ebx),%eax\r
+ 166e8: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 166eb: 83 ec 0c sub $0xc,%esp\r
+ 166ee: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 166f1: 83 c0 18 add $0x18,%eax\r
+ 166f4: 50 push %eax\r
+ 166f5: e8 1d 31 00 00 call 19817 <_my_device_unregister>\r
+ 166fa: 83 c4 10 add $0x10,%esp\r
+ 166fd: 8d 45 ec lea 0xffffffec(%ebp),%eax\r
+ 16700: ff 00 incl (%eax)\r
+ 16702: eb a8 jmp 166ac <_usb_disconnect+0x9b>\r
+ 16704: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 16707: 83 78 1c 00 cmpl $0x0,0x1c(%eax)\r
+ 1670b: 74 42 je 1674f <_usb_disconnect+0x13e>\r
+ 1670d: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 16710: 8b 40 1c mov 0x1c(%eax),%eax\r
+ 16713: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 16716: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 1671d: 83 7d ec 0e cmpl $0xe,0xffffffec(%ebp)\r
+ 16721: 7f 2c jg 1674f <_usb_disconnect+0x13e>\r
+ 16723: 83 ec 08 sub $0x8,%esp\r
+ 16726: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 16729: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 1672c: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 1672f: ff d0 call *%eax\r
+ 16731: 83 c4 10 add $0x10,%esp\r
+ 16734: 83 ec 08 sub $0x8,%esp\r
+ 16737: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 1673a: 0c 80 or $0x80,%al\r
+ 1673c: 50 push %eax\r
+ 1673d: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 16740: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 16743: ff d0 call *%eax\r
+ 16745: 83 c4 10 add $0x10,%esp\r
+ 16748: 8d 45 ec lea 0xffffffec(%ebp),%eax\r
+ 1674b: ff 00 incl (%eax)\r
+ 1674d: eb ce jmp 1671d <_usb_disconnect+0x10c>\r
+ 1674f: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 16752: 83 38 00 cmpl $0x0,(%eax)\r
+ 16755: 7e 2b jle 16782 <_usb_disconnect+0x171>\r
+ 16757: 83 ec 08 sub $0x8,%esp\r
+ 1675a: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1675d: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 16763: 83 c0 10 add $0x10,%eax\r
+ 16766: 50 push %eax\r
+ 16767: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1676a: ff 30 pushl (%eax)\r
+ 1676c: e8 37 00 00 00 call 167a8 <_clear_bit>\r
+ 16771: 83 c4 10 add $0x10,%esp\r
+ 16774: 83 ec 0c sub $0xc,%esp\r
+ 16777: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 1677a: e8 24 00 00 00 call 167a3 <_usbfs_remove_device>\r
+ 1677f: 83 c4 10 add $0x10,%esp\r
+ 16782: 83 ec 0c sub $0xc,%esp\r
+ 16785: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 16788: 05 c0 00 00 00 add $0xc0,%eax\r
+ 1678d: 50 push %eax\r
+ 1678e: e8 84 30 00 00 call 19817 <_my_device_unregister>\r
+ 16793: 83 c4 10 add $0x10,%esp\r
+ 16796: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 16799: e8 1d fc ff ff call 163bb <_usb_put_dev@4>\r
+ 1679e: 8b 5d fc mov 0xfffffffc(%ebp),%ebx\r
+ 167a1: c9 leave \r
+ 167a2: c3 ret \r
+\r
+000167a3 <_usbfs_remove_device>:\r
+ 167a3: 55 push %ebp\r
+ 167a4: 89 e5 mov %esp,%ebp\r
+ 167a6: 5d pop %ebp\r
+ 167a7: c3 ret \r
+\r
+000167a8 <_clear_bit>:\r
+ 167a8: 55 push %ebp\r
+ 167a9: 89 e5 mov %esp,%ebp\r
+ 167ab: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 167ae: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 167b1: 0f b3 02 btr %eax,(%edx)\r
+ 167b4: 5d pop %ebp\r
+ 167b5: c3 ret \r
+\r
+000167b6 <_usb_connect@4>:\r
+ 167b6: 55 push %ebp\r
+ 167b7: 89 e5 mov %esp,%ebp\r
+ 167b9: 83 ec 18 sub $0x18,%esp\r
+ 167bc: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 167bf: c6 80 77 01 00 00 08 movb $0x8,0x177(%eax)\r
+ 167c6: 83 ec 04 sub $0x4,%esp\r
+ 167c9: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 167cc: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 167d2: ff 70 0c pushl 0xc(%eax)\r
+ 167d5: 68 80 00 00 00 push $0x80\r
+ 167da: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 167dd: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 167e3: 83 c0 10 add $0x10,%eax\r
+ 167e6: 50 push %eax\r
+ 167e7: e8 94 00 00 00 call 16880 <_find_next_zero_bit>\r
+ 167ec: 83 c4 10 add $0x10,%esp\r
+ 167ef: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 167f2: 83 7d fc 7f cmpl $0x7f,0xfffffffc(%ebp)\r
+ 167f6: 7e 22 jle 1681a <_usb_connect@4+0x64>\r
+ 167f8: 83 ec 04 sub $0x4,%esp\r
+ 167fb: 6a 01 push $0x1\r
+ 167fd: 68 80 00 00 00 push $0x80\r
+ 16802: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16805: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 1680b: 83 c0 10 add $0x10,%eax\r
+ 1680e: 50 push %eax\r
+ 1680f: e8 6c 00 00 00 call 16880 <_find_next_zero_bit>\r
+ 16814: 83 c4 10 add $0x10,%esp\r
+ 16817: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 1681a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1681d: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 16823: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 16826: 83 7d fc 7e cmpl $0x7e,0xfffffffc(%ebp)\r
+ 1682a: 7f 09 jg 16835 <_usb_connect@4+0x7f>\r
+ 1682c: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1682f: 40 inc %eax\r
+ 16830: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 16833: eb 07 jmp 1683c <_usb_connect@4+0x86>\r
+ 16835: c7 45 f4 01 00 00 00 movl $0x1,0xfffffff4(%ebp)\r
+ 1683c: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 1683f: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 16842: 89 42 0c mov %eax,0xc(%edx)\r
+ 16845: 83 7d fc 7f cmpl $0x7f,0xfffffffc(%ebp)\r
+ 16849: 7f 23 jg 1686e <_usb_connect@4+0xb8>\r
+ 1684b: 83 ec 08 sub $0x8,%esp\r
+ 1684e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16851: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 16857: 83 c0 10 add $0x10,%eax\r
+ 1685a: 50 push %eax\r
+ 1685b: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 1685e: e8 0f 00 00 00 call 16872 <_set_bit>\r
+ 16863: 83 c4 10 add $0x10,%esp\r
+ 16866: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 16869: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1686c: 89 02 mov %eax,(%edx)\r
+ 1686e: c9 leave \r
+ 1686f: c2 04 00 ret $0x4\r
+\r
+00016872 <_set_bit>:\r
+ 16872: 55 push %ebp\r
+ 16873: 89 e5 mov %esp,%ebp\r
+ 16875: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 16878: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1687b: 0f ab 02 bts %eax,(%edx)\r
+ 1687e: 5d pop %ebp\r
+ 1687f: c3 ret \r
+\r
+00016880 <_find_next_zero_bit>:\r
+ 16880: 55 push %ebp\r
+ 16881: 89 e5 mov %esp,%ebp\r
+ 16883: 83 ec 18 sub $0x18,%esp\r
+ 16886: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 16889: c1 f8 05 sar $0x5,%eax\r
+ 1688c: c1 e0 02 shl $0x2,%eax\r
+ 1688f: 03 45 08 add 0x8(%ebp),%eax\r
+ 16892: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 16895: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 1689c: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 1689f: 83 e0 1f and $0x1f,%eax\r
+ 168a2: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 168a5: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 168a9: 74 42 je 168ed <_find_next_zero_bit+0x6d>\r
+ 168ab: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 168ae: 8b 4d f4 mov 0xfffffff4(%ebp),%ecx\r
+ 168b1: 8b 00 mov (%eax),%eax\r
+ 168b3: d3 e8 shr %cl,%eax\r
+ 168b5: f7 d0 not %eax\r
+ 168b7: 0f bc c0 bsf %eax,%eax\r
+ 168ba: 75 05 jne 168c1 <_find_next_zero_bit+0x41>\r
+ 168bc: b8 20 00 00 00 mov $0x20,%eax\r
+ 168c1: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 168c4: b8 20 00 00 00 mov $0x20,%eax\r
+ 168c9: 2b 45 f4 sub 0xfffffff4(%ebp),%eax\r
+ 168cc: 3b 45 f8 cmp 0xfffffff8(%ebp),%eax\r
+ 168cf: 7e 0b jle 168dc <_find_next_zero_bit+0x5c>\r
+ 168d1: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 168d4: 03 45 f8 add 0xfffffff8(%ebp),%eax\r
+ 168d7: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 168da: eb 43 jmp 1691f <_find_next_zero_bit+0x9f>\r
+ 168dc: b8 20 00 00 00 mov $0x20,%eax\r
+ 168e1: 2b 45 f4 sub 0xfffffff4(%ebp),%eax\r
+ 168e4: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 168e7: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 168ea: 83 00 04 addl $0x4,(%eax)\r
+ 168ed: 83 ec 08 sub $0x8,%esp\r
+ 168f0: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 168f3: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 168f6: 29 d0 sub %edx,%eax\r
+ 168f8: 8d 14 c5 00 00 00 00 lea 0x0(,%eax,8),%edx\r
+ 168ff: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 16902: 29 d0 sub %edx,%eax\r
+ 16904: 50 push %eax\r
+ 16905: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 16908: e8 17 00 00 00 call 16924 <_find_first_zero_bit>\r
+ 1690d: 83 c4 10 add $0x10,%esp\r
+ 16910: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 16913: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 16916: 03 45 10 add 0x10(%ebp),%eax\r
+ 16919: 03 45 f0 add 0xfffffff0(%ebp),%eax\r
+ 1691c: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 1691f: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 16922: c9 leave \r
+ 16923: c3 ret \r
+\r
+00016924 <_find_first_zero_bit>:\r
+ 16924: 55 push %ebp\r
+ 16925: 89 e5 mov %esp,%ebp\r
+ 16927: 57 push %edi\r
+ 16928: 53 push %ebx\r
+ 16929: 83 ec 14 sub $0x14,%esp\r
+ 1692c: 83 7d 0c 00 cmpl $0x0,0xc(%ebp)\r
+ 16930: 75 09 jne 1693b <_find_first_zero_bit+0x17>\r
+ 16932: c7 45 e4 00 00 00 00 movl $0x0,0xffffffe4(%ebp)\r
+ 16939: eb 48 jmp 16983 <_find_first_zero_bit+0x5f>\r
+ 1693b: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1693e: 83 c0 1f add $0x1f,%eax\r
+ 16941: 89 c1 mov %eax,%ecx\r
+ 16943: c1 e9 05 shr $0x5,%ecx\r
+ 16946: 8b 7d 08 mov 0x8(%ebp),%edi\r
+ 16949: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 1694c: b8 ff ff ff ff mov $0xffffffff,%eax\r
+ 16951: 31 d2 xor %edx,%edx\r
+ 16953: f3 af repz scas %es:(%edi),%eax\r
+ 16955: 74 09 je 16960 <_find_first_zero_bit+0x3c>\r
+ 16957: 33 47 fc xor 0xfffffffc(%edi),%eax\r
+ 1695a: 83 ef 04 sub $0x4,%edi\r
+ 1695d: 0f bc d0 bsf %eax,%edx\r
+ 16960: 29 df sub %ebx,%edi\r
+ 16962: c1 e7 03 shl $0x3,%edi\r
+ 16965: 01 fa add %edi,%edx\r
+ 16967: 89 c3 mov %eax,%ebx\r
+ 16969: 89 d0 mov %edx,%eax\r
+ 1696b: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 1696e: 89 c8 mov %ecx,%eax\r
+ 16970: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 16973: 89 f8 mov %edi,%eax\r
+ 16975: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 16978: 89 d8 mov %ebx,%eax\r
+ 1697a: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 1697d: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 16980: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 16983: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 16986: 83 c4 14 add $0x14,%esp\r
+ 16989: 5b pop %ebx\r
+ 1698a: 5f pop %edi\r
+ 1698b: 5d pop %ebp\r
+ 1698c: c3 ret \r
+\r
+0001698d <_usb_set_address>:\r
+ 1698d: 55 push %ebp\r
+ 1698e: 89 e5 mov %esp,%ebp\r
+ 16990: 83 ec 08 sub $0x8,%esp\r
+ 16993: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16996: 83 38 00 cmpl $0x0,(%eax)\r
+ 16999: 75 09 jne 169a4 <_usb_set_address+0x17>\r
+ 1699b: c7 45 f8 ea ff ff ff movl $0xffffffea,0xfffffff8(%ebp)\r
+ 169a2: eb 61 jmp 16a05 <_usb_set_address+0x78>\r
+ 169a4: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 169a7: 83 78 14 03 cmpl $0x3,0x14(%eax)\r
+ 169ab: 74 12 je 169bf <_usb_set_address+0x32>\r
+ 169ad: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 169b0: 83 78 14 04 cmpl $0x4,0x14(%eax)\r
+ 169b4: 74 09 je 169bf <_usb_set_address+0x32>\r
+ 169b6: c7 45 f8 ea ff ff ff movl $0xffffffea,0xfffffff8(%ebp)\r
+ 169bd: eb 46 jmp 16a05 <_usb_set_address+0x78>\r
+ 169bf: 83 ec 0c sub $0xc,%esp\r
+ 169c2: 68 f4 01 00 00 push $0x1f4\r
+ 169c7: 6a 00 push $0x0\r
+ 169c9: 6a 00 push $0x0\r
+ 169cb: 6a 00 push $0x0\r
+ 169cd: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 169d0: 8b 00 mov (%eax),%eax\r
+ 169d2: 25 ff ff 00 00 and $0xffff,%eax\r
+ 169d7: 50 push %eax\r
+ 169d8: 6a 00 push $0x0\r
+ 169da: 6a 05 push $0x5\r
+ 169dc: 68 00 00 00 80 push $0x80000000\r
+ 169e1: ff 75 08 pushl 0x8(%ebp)\r
+ 169e4: e8 07 a8 ff ff call 111f0 <_usb_control_msg>\r
+ 169e9: 83 c4 30 add $0x30,%esp\r
+ 169ec: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 169ef: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 169f3: 75 0a jne 169ff <_usb_set_address+0x72>\r
+ 169f5: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 169f8: c7 40 14 04 00 00 00 movl $0x4,0x14(%eax)\r
+ 169ff: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 16a02: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 16a05: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 16a08: c9 leave \r
+ 16a09: c3 ret \r
+\r
+00016a0a <_set_device_description>:\r
+ 16a0a: 55 push %ebp\r
+ 16a0b: 89 e5 mov %esp,%ebp\r
+ 16a0d: 83 ec 28 sub $0x28,%esp\r
+ 16a10: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16a13: 8a 80 7e 01 00 00 mov 0x17e(%eax),%al\r
+ 16a19: 25 ff 00 00 00 and $0xff,%eax\r
+ 16a1e: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 16a21: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16a24: 8a 80 7f 01 00 00 mov 0x17f(%eax),%al\r
+ 16a2a: 25 ff 00 00 00 and $0xff,%eax\r
+ 16a2f: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 16a32: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16a35: 66 8b 80 78 01 00 00 mov 0x178(%eax),%ax\r
+ 16a3c: 25 ff ff 00 00 and $0xffff,%eax\r
+ 16a41: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 16a44: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16a47: 66 8b 80 7a 01 00 00 mov 0x17a(%eax),%ax\r
+ 16a4e: 25 ff ff 00 00 and $0xffff,%eax\r
+ 16a53: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 16a56: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 16a59: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 16a5c: 68 4c b2 01 00 push $0x1b24c\r
+ 16a61: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16a64: 05 c0 00 00 00 add $0xc0,%eax\r
+ 16a69: 50 push %eax\r
+ 16a6a: e8 21 30 00 00 call 19a90 <_sprintf>\r
+ 16a6f: 83 c4 10 add $0x10,%esp\r
+ 16a72: 83 ec 08 sub $0x8,%esp\r
+ 16a75: 68 00 02 00 00 push $0x200\r
+ 16a7a: 6a 01 push $0x1\r
+ 16a7c: e8 af 2f 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 16a81: 83 c4 08 add $0x8,%esp\r
+ 16a84: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 16a87: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 16a8b: 75 05 jne 16a92 <_set_device_description+0x88>\r
+ 16a8d: e9 ff 00 00 00 jmp 16b91 <_set_device_description+0x187>\r
+ 16a92: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 16a95: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 16a98: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 16a9b: 05 00 01 00 00 add $0x100,%eax\r
+ 16aa0: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 16aa3: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 16aa7: 74 1c je 16ac5 <_set_device_description+0xbb>\r
+ 16aa9: 68 00 01 00 00 push $0x100\r
+ 16aae: ff 75 e4 pushl 0xffffffe4(%ebp)\r
+ 16ab1: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 16ab4: ff 75 08 pushl 0x8(%ebp)\r
+ 16ab7: e8 27 b1 ff ff call 11be3 <_usb_string>\r
+ 16abc: 83 c4 10 add $0x10,%esp\r
+ 16abf: 85 c0 test %eax,%eax\r
+ 16ac1: 7e 02 jle 16ac5 <_set_device_description+0xbb>\r
+ 16ac3: eb 07 jmp 16acc <_set_device_description+0xc2>\r
+ 16ac5: c7 45 e4 00 00 00 00 movl $0x0,0xffffffe4(%ebp)\r
+ 16acc: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 16ad0: 74 1c je 16aee <_set_device_description+0xe4>\r
+ 16ad2: 68 00 01 00 00 push $0x100\r
+ 16ad7: ff 75 e8 pushl 0xffffffe8(%ebp)\r
+ 16ada: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 16add: ff 75 08 pushl 0x8(%ebp)\r
+ 16ae0: e8 fe b0 ff ff call 11be3 <_usb_string>\r
+ 16ae5: 83 c4 10 add $0x10,%esp\r
+ 16ae8: 85 c0 test %eax,%eax\r
+ 16aea: 7e 02 jle 16aee <_set_device_description+0xe4>\r
+ 16aec: eb 07 jmp 16af5 <_set_device_description+0xeb>\r
+ 16aee: c7 45 e8 00 00 00 00 movl $0x0,0xffffffe8(%ebp)\r
+ 16af5: 83 7d e4 00 cmpl $0x0,0xffffffe4(%ebp)\r
+ 16af9: 74 2c je 16b27 <_set_device_description+0x11d>\r
+ 16afb: 83 7d e8 00 cmpl $0x0,0xffffffe8(%ebp)\r
+ 16aff: 74 26 je 16b27 <_set_device_description+0x11d>\r
+ 16b01: 83 ec 0c sub $0xc,%esp\r
+ 16b04: ff 75 e8 pushl 0xffffffe8(%ebp)\r
+ 16b07: ff 75 e4 pushl 0xffffffe4(%ebp)\r
+ 16b0a: 68 61 b2 01 00 push $0x1b261\r
+ 16b0f: 68 80 00 00 00 push $0x80\r
+ 16b14: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16b17: 05 c0 00 00 00 add $0xc0,%eax\r
+ 16b1c: 50 push %eax\r
+ 16b1d: e8 9e 2f 00 00 call 19ac0 <__snprintf>\r
+ 16b22: 83 c4 20 add $0x20,%esp\r
+ 16b25: eb 5c jmp 16b83 <_set_device_description+0x179>\r
+ 16b27: 83 7d e4 00 cmpl $0x0,0xffffffe4(%ebp)\r
+ 16b2b: 74 29 je 16b56 <_set_device_description+0x14c>\r
+ 16b2d: 83 ec 08 sub $0x8,%esp\r
+ 16b30: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 16b33: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 16b36: ff 75 e4 pushl 0xffffffe4(%ebp)\r
+ 16b39: 68 69 b2 01 00 push $0x1b269\r
+ 16b3e: 68 80 00 00 00 push $0x80\r
+ 16b43: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16b46: 05 c0 00 00 00 add $0xc0,%eax\r
+ 16b4b: 50 push %eax\r
+ 16b4c: e8 6f 2f 00 00 call 19ac0 <__snprintf>\r
+ 16b51: 83 c4 20 add $0x20,%esp\r
+ 16b54: eb 2d jmp 16b83 <_set_device_description+0x179>\r
+ 16b56: 83 7d e8 00 cmpl $0x0,0xffffffe8(%ebp)\r
+ 16b5a: 74 27 je 16b83 <_set_device_description+0x179>\r
+ 16b5c: 83 ec 08 sub $0x8,%esp\r
+ 16b5f: ff 75 e8 pushl 0xffffffe8(%ebp)\r
+ 16b62: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 16b65: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 16b68: 68 83 b2 01 00 push $0x1b283\r
+ 16b6d: 68 80 00 00 00 push $0x80\r
+ 16b72: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16b75: 05 c0 00 00 00 add $0xc0,%eax\r
+ 16b7a: 50 push %eax\r
+ 16b7b: e8 40 2f 00 00 call 19ac0 <__snprintf>\r
+ 16b80: 83 c4 20 add $0x20,%esp\r
+ 16b83: 83 ec 0c sub $0xc,%esp\r
+ 16b86: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 16b89: e8 b2 2e 00 00 call 19a40 <_ExFreePool@4>\r
+ 16b8e: 83 c4 0c add $0xc,%esp\r
+ 16b91: c9 leave \r
+ 16b92: c3 ret \r
+\r
+00016b93 <_usb_new_device>:\r
+ 16b93: 55 push %ebp\r
+ 16b94: 89 e5 mov %esp,%ebp\r
+ 16b96: 53 push %ebx\r
+ 16b97: 83 ec 24 sub $0x24,%esp\r
+ 16b9a: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 16ba1: c7 05 e4 a0 01 00 f8 movl $0x1a0f8,0x1a0e4\r
+ 16ba8: a0 01 00 \r
+ 16bab: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 16bae: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 16bb1: 89 82 60 01 00 00 mov %eax,0x160(%edx)\r
+ 16bb7: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16bba: c7 80 58 01 00 00 e0 movl $0x1a0e0,0x158(%eax)\r
+ 16bc1: a0 01 00 \r
+ 16bc4: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16bc7: c7 80 40 01 00 00 f8 movl $0x1a0f8,0x140(%eax)\r
+ 16bce: a0 01 00 \r
+ 16bd1: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16bd4: c7 80 6c 01 00 00 c2 movl $0x163c2,0x16c(%eax)\r
+ 16bdb: 63 01 00 \r
+ 16bde: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16be1: c7 80 5c 01 00 00 70 movl $0x1c070,0x15c(%eax)\r
+ 16be8: c0 01 00 \r
+ 16beb: 83 ec 0c sub $0xc,%esp\r
+ 16bee: ff 75 08 pushl 0x8(%ebp)\r
+ 16bf1: e8 74 f7 ff ff call 1636a <_usb_get_dev>\r
+ 16bf6: 83 c4 10 add $0x10,%esp\r
+ 16bf9: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16bfc: 80 b8 48 01 00 00 00 cmpb $0x0,0x148(%eax)\r
+ 16c03: 75 29 jne 16c2e <_usb_new_device+0x9b>\r
+ 16c05: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16c08: 83 c0 04 add $0x4,%eax\r
+ 16c0b: 50 push %eax\r
+ 16c0c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16c0f: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 16c15: ff 70 04 pushl 0x4(%eax)\r
+ 16c18: 68 9d b2 01 00 push $0x1b29d\r
+ 16c1d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16c20: 05 48 01 00 00 add $0x148,%eax\r
+ 16c25: 50 push %eax\r
+ 16c26: e8 65 2e 00 00 call 19a90 <_sprintf>\r
+ 16c2b: 83 c4 10 add $0x10,%esp\r
+ 16c2e: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 16c31: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 16c34: 8b 80 84 00 00 00 mov 0x84(%eax),%eax\r
+ 16c3a: 89 82 44 01 00 00 mov %eax,0x144(%edx)\r
+ 16c40: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16c43: 8b 40 18 mov 0x18(%eax),%eax\r
+ 16c46: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 16c49: 83 7d e0 01 cmpl $0x1,0xffffffe0(%ebp)\r
+ 16c4d: 72 20 jb 16c6f <_usb_new_device+0xdc>\r
+ 16c4f: 83 7d e0 02 cmpl $0x2,0xffffffe0(%ebp)\r
+ 16c53: 76 11 jbe 16c66 <_usb_new_device+0xd3>\r
+ 16c55: 83 7d e0 03 cmpl $0x3,0xffffffe0(%ebp)\r
+ 16c59: 74 02 je 16c5d <_usb_new_device+0xca>\r
+ 16c5b: eb 12 jmp 16c6f <_usb_new_device+0xdc>\r
+ 16c5d: c7 45 f4 40 00 00 00 movl $0x40,0xfffffff4(%ebp)\r
+ 16c64: eb 15 jmp 16c7b <_usb_new_device+0xe8>\r
+ 16c66: c7 45 f4 08 00 00 00 movl $0x8,0xfffffff4(%ebp)\r
+ 16c6d: eb 0c jmp 16c7b <_usb_new_device+0xe8>\r
+ 16c6f: c7 45 e4 ea ff ff ff movl $0xffffffea,0xffffffe4(%ebp)\r
+ 16c76: e9 da 03 00 00 jmp 17055 <_usb_new_device+0x4c2>\r
+ 16c7b: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 16c7e: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 16c81: 89 42 38 mov %eax,0x38(%edx)\r
+ 16c84: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 16c87: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 16c8a: 89 42 78 mov %eax,0x78(%edx)\r
+ 16c8d: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 16c94: 83 7d f4 01 cmpl $0x1,0xfffffff4(%ebp)\r
+ 16c98: 0f 8f c8 00 00 00 jg 16d66 <_usb_new_device+0x1d3>\r
+ 16c9e: c7 45 f0 00 00 00 00 movl $0x0,0xfffffff0(%ebp)\r
+ 16ca5: 83 7d f0 01 cmpl $0x1,0xfffffff0(%ebp)\r
+ 16ca9: 7f 30 jg 16cdb <_usb_new_device+0x148>\r
+ 16cab: 83 ec 0c sub $0xc,%esp\r
+ 16cae: ff 75 08 pushl 0x8(%ebp)\r
+ 16cb1: e8 d7 fc ff ff call 1698d <_usb_set_address>\r
+ 16cb6: 83 c4 10 add $0x10,%esp\r
+ 16cb9: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 16cbc: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 16cc0: 78 02 js 16cc4 <_usb_new_device+0x131>\r
+ 16cc2: eb 17 jmp 16cdb <_usb_new_device+0x148>\r
+ 16cc4: 83 ec 0c sub $0xc,%esp\r
+ 16cc7: 68 c8 00 00 00 push $0xc8\r
+ 16ccc: e8 df 27 00 00 call 194b0 <_wait_ms>\r
+ 16cd1: 83 c4 10 add $0x10,%esp\r
+ 16cd4: 8d 45 f0 lea 0xfffffff0(%ebp),%eax\r
+ 16cd7: ff 00 incl (%eax)\r
+ 16cd9: eb ca jmp 16ca5 <_usb_new_device+0x112>\r
+ 16cdb: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 16cdf: 79 39 jns 16d1a <_usb_new_device+0x187>\r
+ 16ce1: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16ce4: c7 40 14 03 00 00 00 movl $0x3,0x14(%eax)\r
+ 16ceb: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16cee: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 16cf4: 83 c0 10 add $0x10,%eax\r
+ 16cf7: 50 push %eax\r
+ 16cf8: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16cfb: ff 30 pushl (%eax)\r
+ 16cfd: e8 a6 fa ff ff call 167a8 <_clear_bit>\r
+ 16d02: 83 c4 08 add $0x8,%esp\r
+ 16d05: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16d08: c7 00 ff ff ff ff movl $0xffffffff,(%eax)\r
+ 16d0e: c7 45 e4 01 00 00 00 movl $0x1,0xffffffe4(%ebp)\r
+ 16d15: e9 3b 03 00 00 jmp 17055 <_usb_new_device+0x4c2>\r
+ 16d1a: 83 ec 0c sub $0xc,%esp\r
+ 16d1d: 6a 0a push $0xa\r
+ 16d1f: e8 8c 27 00 00 call 194b0 <_wait_ms>\r
+ 16d24: 83 c4 10 add $0x10,%esp\r
+ 16d27: 83 ec 0c sub $0xc,%esp\r
+ 16d2a: 6a 08 push $0x8\r
+ 16d2c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16d2f: 05 70 01 00 00 add $0x170,%eax\r
+ 16d34: 50 push %eax\r
+ 16d35: 6a 00 push $0x0\r
+ 16d37: 6a 01 push $0x1\r
+ 16d39: ff 75 08 pushl 0x8(%ebp)\r
+ 16d3c: e8 1b a6 ff ff call 1135c <_usb_get_descriptor>\r
+ 16d41: 83 c4 20 add $0x20,%esp\r
+ 16d44: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 16d47: 83 7d f8 07 cmpl $0x7,0xfffffff8(%ebp)\r
+ 16d4b: 7e 02 jle 16d4f <_usb_new_device+0x1bc>\r
+ 16d4d: eb 17 jmp 16d66 <_usb_new_device+0x1d3>\r
+ 16d4f: 83 ec 0c sub $0xc,%esp\r
+ 16d52: 6a 64 push $0x64\r
+ 16d54: e8 57 27 00 00 call 194b0 <_wait_ms>\r
+ 16d59: 83 c4 10 add $0x10,%esp\r
+ 16d5c: 8d 45 f4 lea 0xfffffff4(%ebp),%eax\r
+ 16d5f: ff 00 incl (%eax)\r
+ 16d61: e9 2e ff ff ff jmp 16c94 <_usb_new_device+0x101>\r
+ 16d66: 83 7d f8 07 cmpl $0x7,0xfffffff8(%ebp)\r
+ 16d6a: 7f 2f jg 16d9b <_usb_new_device+0x208>\r
+ 16d6c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16d6f: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 16d75: 83 c0 10 add $0x10,%eax\r
+ 16d78: 50 push %eax\r
+ 16d79: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16d7c: ff 30 pushl (%eax)\r
+ 16d7e: e8 25 fa ff ff call 167a8 <_clear_bit>\r
+ 16d83: 83 c4 08 add $0x8,%esp\r
+ 16d86: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16d89: c7 00 ff ff ff ff movl $0xffffffff,(%eax)\r
+ 16d8f: c7 45 e4 01 00 00 00 movl $0x1,0xffffffe4(%ebp)\r
+ 16d96: e9 ba 02 00 00 jmp 17055 <_usb_new_device+0x4c2>\r
+ 16d9b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16d9e: 83 78 18 02 cmpl $0x2,0x18(%eax)\r
+ 16da2: 75 28 jne 16dcc <_usb_new_device+0x239>\r
+ 16da4: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 16da7: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16daa: 8a 80 77 01 00 00 mov 0x177(%eax),%al\r
+ 16db0: 25 ff 00 00 00 and $0xff,%eax\r
+ 16db5: 89 42 38 mov %eax,0x38(%edx)\r
+ 16db8: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 16dbb: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16dbe: 8a 80 77 01 00 00 mov 0x177(%eax),%al\r
+ 16dc4: 25 ff 00 00 00 and $0xff,%eax\r
+ 16dc9: 89 42 78 mov %eax,0x78(%edx)\r
+ 16dcc: 83 ec 0c sub $0xc,%esp\r
+ 16dcf: ff 75 08 pushl 0x8(%ebp)\r
+ 16dd2: e8 aa a6 ff ff call 11481 <_usb_get_device_descriptor>\r
+ 16dd7: 83 c4 10 add $0x10,%esp\r
+ 16dda: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 16ddd: 83 7d f8 11 cmpl $0x11,0xfffffff8(%ebp)\r
+ 16de1: 7f 2f jg 16e12 <_usb_new_device+0x27f>\r
+ 16de3: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16de6: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 16dec: 83 c0 10 add $0x10,%eax\r
+ 16def: 50 push %eax\r
+ 16df0: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16df3: ff 30 pushl (%eax)\r
+ 16df5: e8 ae f9 ff ff call 167a8 <_clear_bit>\r
+ 16dfa: 83 c4 08 add $0x8,%esp\r
+ 16dfd: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16e00: c7 00 ff ff ff ff movl $0xffffffff,(%eax)\r
+ 16e06: c7 45 e4 01 00 00 00 movl $0x1,0xffffffe4(%ebp)\r
+ 16e0d: e9 43 02 00 00 jmp 17055 <_usb_new_device+0x4c2>\r
+ 16e12: 83 ec 0c sub $0xc,%esp\r
+ 16e15: ff 75 08 pushl 0x8(%ebp)\r
+ 16e18: e8 fb 0f 00 00 call 17e18 <_usb_get_configuration>\r
+ 16e1d: 83 c4 10 add $0x10,%esp\r
+ 16e20: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 16e23: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 16e27: 79 2f jns 16e58 <_usb_new_device+0x2c5>\r
+ 16e29: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16e2c: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 16e32: 83 c0 10 add $0x10,%eax\r
+ 16e35: 50 push %eax\r
+ 16e36: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16e39: ff 30 pushl (%eax)\r
+ 16e3b: e8 68 f9 ff ff call 167a8 <_clear_bit>\r
+ 16e40: 83 c4 08 add $0x8,%esp\r
+ 16e43: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16e46: c7 00 ff ff ff ff movl $0xffffffff,(%eax)\r
+ 16e4c: c7 45 e4 01 00 00 00 movl $0x1,0xffffffe4(%ebp)\r
+ 16e53: e9 fd 01 00 00 jmp 17055 <_usb_new_device+0x4c2>\r
+ 16e58: 83 ec 08 sub $0x8,%esp\r
+ 16e5b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16e5e: 8b 80 84 01 00 00 mov 0x184(%eax),%eax\r
+ 16e64: 8a 40 05 mov 0x5(%eax),%al\r
+ 16e67: 25 ff 00 00 00 and $0xff,%eax\r
+ 16e6c: 50 push %eax\r
+ 16e6d: ff 75 08 pushl 0x8(%ebp)\r
+ 16e70: e8 d2 ab ff ff call 11a47 <_usb_set_configuration>\r
+ 16e75: 83 c4 10 add $0x10,%esp\r
+ 16e78: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 16e7b: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 16e7f: 74 2f je 16eb0 <_usb_new_device+0x31d>\r
+ 16e81: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16e84: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 16e8a: 83 c0 10 add $0x10,%eax\r
+ 16e8d: 50 push %eax\r
+ 16e8e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16e91: ff 30 pushl (%eax)\r
+ 16e93: e8 10 f9 ff ff call 167a8 <_clear_bit>\r
+ 16e98: 83 c4 08 add $0x8,%esp\r
+ 16e9b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16e9e: c7 00 ff ff ff ff movl $0xffffffff,(%eax)\r
+ 16ea4: c7 45 e4 01 00 00 00 movl $0x1,0xffffffe4(%ebp)\r
+ 16eab: e9 a5 01 00 00 jmp 17055 <_usb_new_device+0x4c2>\r
+ 16eb0: 83 ec 0c sub $0xc,%esp\r
+ 16eb3: ff 75 08 pushl 0x8(%ebp)\r
+ 16eb6: e8 4f fb ff ff call 16a0a <_set_device_description>\r
+ 16ebb: 83 c4 10 add $0x10,%esp\r
+ 16ebe: 83 ec 0c sub $0xc,%esp\r
+ 16ec1: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16ec4: 05 c0 00 00 00 add $0xc0,%eax\r
+ 16ec9: 50 push %eax\r
+ 16eca: e8 3b 28 00 00 call 1970a <_my_device_add>\r
+ 16ecf: 83 c4 10 add $0x10,%esp\r
+ 16ed2: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 16ed5: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 16ed9: 74 0b je 16ee6 <_usb_new_device+0x353>\r
+ 16edb: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 16ede: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 16ee1: e9 6f 01 00 00 jmp 17055 <_usb_new_device+0x4c2>\r
+ 16ee6: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 16eed: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16ef0: 8b 80 88 01 00 00 mov 0x188(%eax),%eax\r
+ 16ef6: 8a 40 04 mov 0x4(%eax),%al\r
+ 16ef9: 25 ff 00 00 00 and $0xff,%eax\r
+ 16efe: 3b 45 f4 cmp 0xfffffff4(%ebp),%eax\r
+ 16f01: 0f 8e 39 01 00 00 jle 17040 <_usb_new_device+0x4ad>\r
+ 16f07: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16f0a: 8b 98 88 01 00 00 mov 0x188(%eax),%ebx\r
+ 16f10: 8b 4d f4 mov 0xfffffff4(%ebp),%ecx\r
+ 16f13: 89 c8 mov %ecx,%eax\r
+ 16f15: c1 e0 02 shl $0x2,%eax\r
+ 16f18: 01 c8 add %ecx,%eax\r
+ 16f1a: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 16f21: 01 d0 add %edx,%eax\r
+ 16f23: 01 c0 add %eax,%eax\r
+ 16f25: 01 c8 add %ecx,%eax\r
+ 16f27: c1 e0 02 shl $0x2,%eax\r
+ 16f2a: 03 43 0c add 0xc(%ebx),%eax\r
+ 16f2d: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 16f30: 8b 4d ec mov 0xffffffec(%ebp),%ecx\r
+ 16f33: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 16f36: 8b 50 04 mov 0x4(%eax),%edx\r
+ 16f39: 89 d0 mov %edx,%eax\r
+ 16f3b: 01 c0 add %eax,%eax\r
+ 16f3d: 01 d0 add %edx,%eax\r
+ 16f3f: c1 e0 03 shl $0x3,%eax\r
+ 16f42: 03 01 add (%ecx),%eax\r
+ 16f44: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 16f47: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 16f4a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16f4d: 05 c0 00 00 00 add $0xc0,%eax\r
+ 16f52: 89 82 b8 00 00 00 mov %eax,0xb8(%edx)\r
+ 16f58: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 16f5b: c7 80 b0 00 00 00 00 movl $0x0,0xb0(%eax)\r
+ 16f62: 00 00 00 \r
+ 16f65: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 16f68: c7 80 98 00 00 00 f8 movl $0x1a0f8,0x98(%eax)\r
+ 16f6f: a0 01 00 \r
+ 16f72: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 16f75: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 16f78: 8b 80 84 00 00 00 mov 0x84(%eax),%eax\r
+ 16f7e: 89 82 9c 00 00 00 mov %eax,0x9c(%edx)\r
+ 16f84: 83 ec 0c sub $0xc,%esp\r
+ 16f87: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 16f8a: 8a 40 02 mov 0x2(%eax),%al\r
+ 16f8d: 25 ff 00 00 00 and $0xff,%eax\r
+ 16f92: 50 push %eax\r
+ 16f93: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16f96: 83 c0 04 add $0x4,%eax\r
+ 16f99: 50 push %eax\r
+ 16f9a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 16f9d: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 16fa3: ff 70 04 pushl 0x4(%eax)\r
+ 16fa6: 68 a3 b2 01 00 push $0x1b2a3\r
+ 16fab: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 16fae: 05 a0 00 00 00 add $0xa0,%eax\r
+ 16fb3: 50 push %eax\r
+ 16fb4: e8 d7 2a 00 00 call 19a90 <_sprintf>\r
+ 16fb9: 83 c4 20 add $0x20,%esp\r
+ 16fbc: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 16fbf: 80 78 08 00 cmpb $0x0,0x8(%eax)\r
+ 16fc3: 74 29 je 16fee <_usb_new_device+0x45b>\r
+ 16fc5: 68 80 00 00 00 push $0x80\r
+ 16fca: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 16fcd: 83 c0 18 add $0x18,%eax\r
+ 16fd0: 50 push %eax\r
+ 16fd1: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 16fd4: 8a 40 08 mov 0x8(%eax),%al\r
+ 16fd7: 25 ff 00 00 00 and $0xff,%eax\r
+ 16fdc: 50 push %eax\r
+ 16fdd: ff 75 08 pushl 0x8(%ebp)\r
+ 16fe0: e8 fe ab ff ff call 11be3 <_usb_string>\r
+ 16fe5: 83 c4 10 add $0x10,%esp\r
+ 16fe8: 85 c0 test %eax,%eax\r
+ 16fea: 7e 02 jle 16fee <_usb_new_device+0x45b>\r
+ 16fec: eb 36 jmp 17024 <_usb_new_device+0x491>\r
+ 16fee: 83 ec 0c sub $0xc,%esp\r
+ 16ff1: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 16ff4: 8a 40 02 mov 0x2(%eax),%al\r
+ 16ff7: 25 ff 00 00 00 and $0xff,%eax\r
+ 16ffc: 50 push %eax\r
+ 16ffd: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17000: 83 c0 04 add $0x4,%eax\r
+ 17003: 50 push %eax\r
+ 17004: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17007: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 1700d: ff 70 08 pushl 0x8(%eax)\r
+ 17010: 68 ac b2 01 00 push $0x1b2ac\r
+ 17015: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 17018: 83 c0 18 add $0x18,%eax\r
+ 1701b: 50 push %eax\r
+ 1701c: e8 6f 2a 00 00 call 19a90 <_sprintf>\r
+ 17021: 83 c4 20 add $0x20,%esp\r
+ 17024: 83 ec 0c sub $0xc,%esp\r
+ 17027: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 1702a: 83 c0 18 add $0x18,%eax\r
+ 1702d: 50 push %eax\r
+ 1702e: e8 d7 26 00 00 call 1970a <_my_device_add>\r
+ 17033: 83 c4 10 add $0x10,%esp\r
+ 17036: 8d 45 f4 lea 0xfffffff4(%ebp),%eax\r
+ 17039: ff 00 incl (%eax)\r
+ 1703b: e9 ad fe ff ff jmp 16eed <_usb_new_device+0x35a>\r
+ 17040: 83 ec 0c sub $0xc,%esp\r
+ 17043: ff 75 08 pushl 0x8(%ebp)\r
+ 17046: e8 12 00 00 00 call 1705d <_usbfs_add_device>\r
+ 1704b: 83 c4 10 add $0x10,%esp\r
+ 1704e: c7 45 e4 00 00 00 00 movl $0x0,0xffffffe4(%ebp)\r
+ 17055: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 17058: 8b 5d fc mov 0xfffffffc(%ebp),%ebx\r
+ 1705b: c9 leave \r
+ 1705c: c3 ret \r
+\r
+0001705d <_usbfs_add_device>:\r
+ 1705d: 55 push %ebp\r
+ 1705e: 89 e5 mov %esp,%ebp\r
+ 17060: 5d pop %ebp\r
+ 17061: c3 ret \r
+\r
+00017062 <_usb_buffer_alloc>:\r
+ 17062: 55 push %ebp\r
+ 17063: 89 e5 mov %esp,%ebp\r
+ 17065: 83 ec 08 sub $0x8,%esp\r
+ 17068: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 1706c: 74 2d je 1709b <_usb_buffer_alloc+0x39>\r
+ 1706e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17071: 83 b8 bc 00 00 00 00 cmpl $0x0,0xbc(%eax)\r
+ 17078: 74 21 je 1709b <_usb_buffer_alloc+0x39>\r
+ 1707a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1707d: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 17083: 83 78 20 00 cmpl $0x0,0x20(%eax)\r
+ 17087: 74 12 je 1709b <_usb_buffer_alloc+0x39>\r
+ 17089: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1708c: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 17092: 8b 40 20 mov 0x20(%eax),%eax\r
+ 17095: 83 78 14 00 cmpl $0x0,0x14(%eax)\r
+ 17099: 75 09 jne 170a4 <_usb_buffer_alloc+0x42>\r
+ 1709b: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 170a2: eb 29 jmp 170cd <_usb_buffer_alloc+0x6b>\r
+ 170a4: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 170a7: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 170ad: 8b 50 20 mov 0x20(%eax),%edx\r
+ 170b0: ff 75 14 pushl 0x14(%ebp)\r
+ 170b3: ff 75 10 pushl 0x10(%ebp)\r
+ 170b6: ff 75 0c pushl 0xc(%ebp)\r
+ 170b9: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 170bc: ff b0 bc 00 00 00 pushl 0xbc(%eax)\r
+ 170c2: 8b 42 14 mov 0x14(%edx),%eax\r
+ 170c5: ff d0 call *%eax\r
+ 170c7: 83 c4 10 add $0x10,%esp\r
+ 170ca: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 170cd: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 170d0: c9 leave \r
+ 170d1: c3 ret \r
+\r
+000170d2 <_usb_buffer_free>:\r
+ 170d2: 55 push %ebp\r
+ 170d3: 89 e5 mov %esp,%ebp\r
+ 170d5: 83 ec 08 sub $0x8,%esp\r
+ 170d8: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 170dc: 74 55 je 17133 <_usb_buffer_free+0x61>\r
+ 170de: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 170e1: 83 b8 bc 00 00 00 00 cmpl $0x0,0xbc(%eax)\r
+ 170e8: 74 49 je 17133 <_usb_buffer_free+0x61>\r
+ 170ea: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 170ed: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 170f3: 83 78 20 00 cmpl $0x0,0x20(%eax)\r
+ 170f7: 74 3a je 17133 <_usb_buffer_free+0x61>\r
+ 170f9: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 170fc: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 17102: 8b 40 20 mov 0x20(%eax),%eax\r
+ 17105: 83 78 18 00 cmpl $0x0,0x18(%eax)\r
+ 17109: 75 02 jne 1710d <_usb_buffer_free+0x3b>\r
+ 1710b: eb 26 jmp 17133 <_usb_buffer_free+0x61>\r
+ 1710d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17110: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 17116: 8b 50 20 mov 0x20(%eax),%edx\r
+ 17119: ff 75 14 pushl 0x14(%ebp)\r
+ 1711c: ff 75 10 pushl 0x10(%ebp)\r
+ 1711f: ff 75 0c pushl 0xc(%ebp)\r
+ 17122: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17125: ff b0 bc 00 00 00 pushl 0xbc(%eax)\r
+ 1712b: 8b 42 18 mov 0x18(%edx),%eax\r
+ 1712e: ff d0 call *%eax\r
+ 17130: 83 c4 10 add $0x10,%esp\r
+ 17133: c9 leave \r
+ 17134: c3 ret \r
+\r
+00017135 <_usb_buffer_map>:\r
+ 17135: 55 push %ebp\r
+ 17136: 89 e5 mov %esp,%ebp\r
+ 17138: 83 ec 0c sub $0xc,%esp\r
+ 1713b: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 1713f: 74 39 je 1717a <_usb_buffer_map+0x45>\r
+ 17141: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17144: 8b 40 18 mov 0x18(%eax),%eax\r
+ 17147: c1 e8 1e shr $0x1e,%eax\r
+ 1714a: 83 e0 03 and $0x3,%eax\r
+ 1714d: 83 f8 02 cmp $0x2,%eax\r
+ 17150: 74 28 je 1717a <_usb_buffer_map+0x45>\r
+ 17152: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17155: 83 78 14 00 cmpl $0x0,0x14(%eax)\r
+ 17159: 74 1f je 1717a <_usb_buffer_map+0x45>\r
+ 1715b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1715e: 8b 40 14 mov 0x14(%eax),%eax\r
+ 17161: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 17167: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 1716a: 85 c0 test %eax,%eax\r
+ 1716c: 74 0c je 1717a <_usb_buffer_map+0x45>\r
+ 1716e: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 17171: 8b 00 mov (%eax),%eax\r
+ 17173: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 17176: 85 c0 test %eax,%eax\r
+ 17178: 75 09 jne 17183 <_usb_buffer_map+0x4e>\r
+ 1717a: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 17181: eb 3f jmp 171c2 <_usb_buffer_map+0x8d>\r
+ 17183: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 17186: 83 b8 84 00 00 00 00 cmpl $0x0,0x84(%eax)\r
+ 1718d: 74 14 je 171a3 <_usb_buffer_map+0x6e>\r
+ 1718f: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17192: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 17195: 8b 52 24 mov 0x24(%edx),%edx\r
+ 17198: 81 e2 ff ff ff 0f and $0xfffffff,%edx\r
+ 1719e: 89 50 28 mov %edx,0x28(%eax)\r
+ 171a1: eb 0a jmp 171ad <_usb_buffer_map+0x78>\r
+ 171a3: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 171a6: c7 40 28 ff ff ff ff movl $0xffffffff,0x28(%eax)\r
+ 171ad: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 171b0: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 171b3: 8b 40 20 mov 0x20(%eax),%eax\r
+ 171b6: 83 c8 04 or $0x4,%eax\r
+ 171b9: 89 42 20 mov %eax,0x20(%edx)\r
+ 171bc: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 171bf: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 171c2: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 171c5: c9 leave \r
+ 171c6: c3 ret \r
+\r
+000171c7 <_usb_buffer_dmasync>:\r
+ 171c7: 55 push %ebp\r
+ 171c8: 89 e5 mov %esp,%ebp\r
+ 171ca: 83 ec 08 sub $0x8,%esp\r
+ 171cd: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 171d1: 74 3a je 1720d <_usb_buffer_dmasync+0x46>\r
+ 171d3: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 171d6: 8b 40 20 mov 0x20(%eax),%eax\r
+ 171d9: c1 e8 02 shr $0x2,%eax\r
+ 171dc: 83 e0 01 and $0x1,%eax\r
+ 171df: 85 c0 test %eax,%eax\r
+ 171e1: 74 2a je 1720d <_usb_buffer_dmasync+0x46>\r
+ 171e3: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 171e6: 83 78 14 00 cmpl $0x0,0x14(%eax)\r
+ 171ea: 74 21 je 1720d <_usb_buffer_dmasync+0x46>\r
+ 171ec: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 171ef: 8b 40 14 mov 0x14(%eax),%eax\r
+ 171f2: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 171f8: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 171fb: 85 c0 test %eax,%eax\r
+ 171fd: 74 0e je 1720d <_usb_buffer_dmasync+0x46>\r
+ 171ff: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 17202: 8b 00 mov (%eax),%eax\r
+ 17204: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 17207: 85 c0 test %eax,%eax\r
+ 17209: 75 02 jne 1720d <_usb_buffer_dmasync+0x46>\r
+ 1720b: eb 00 jmp 1720d <_usb_buffer_dmasync+0x46>\r
+ 1720d: c9 leave \r
+ 1720e: c3 ret \r
+\r
+0001720f <_usb_buffer_unmap>:\r
+ 1720f: 55 push %ebp\r
+ 17210: 89 e5 mov %esp,%ebp\r
+ 17212: 83 ec 08 sub $0x8,%esp\r
+ 17215: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 17219: 74 49 je 17264 <_usb_buffer_unmap+0x55>\r
+ 1721b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1721e: 8b 40 20 mov 0x20(%eax),%eax\r
+ 17221: c1 e8 02 shr $0x2,%eax\r
+ 17224: 83 e0 01 and $0x1,%eax\r
+ 17227: 85 c0 test %eax,%eax\r
+ 17229: 74 39 je 17264 <_usb_buffer_unmap+0x55>\r
+ 1722b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1722e: 83 78 14 00 cmpl $0x0,0x14(%eax)\r
+ 17232: 74 30 je 17264 <_usb_buffer_unmap+0x55>\r
+ 17234: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17237: 8b 40 14 mov 0x14(%eax),%eax\r
+ 1723a: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 17240: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 17243: 85 c0 test %eax,%eax\r
+ 17245: 74 1d je 17264 <_usb_buffer_unmap+0x55>\r
+ 17247: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1724a: 8b 00 mov (%eax),%eax\r
+ 1724c: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 1724f: 85 c0 test %eax,%eax\r
+ 17251: 75 02 jne 17255 <_usb_buffer_unmap+0x46>\r
+ 17253: eb 0f jmp 17264 <_usb_buffer_unmap+0x55>\r
+ 17255: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17258: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 1725b: 8b 52 20 mov 0x20(%edx),%edx\r
+ 1725e: 83 e2 fb and $0xfffffffb,%edx\r
+ 17261: 89 50 20 mov %edx,0x20(%eax)\r
+ 17264: c9 leave \r
+ 17265: c3 ret \r
+\r
+00017266 <_usb_buffer_map_sg>:\r
+ 17266: 55 push %ebp\r
+ 17267: 89 e5 mov %esp,%ebp\r
+ 17269: 83 ec 0c sub $0xc,%esp\r
+ 1726c: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 17270: 74 36 je 172a8 <_usb_buffer_map_sg+0x42>\r
+ 17272: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 17275: c1 e8 1e shr $0x1e,%eax\r
+ 17278: 83 e0 03 and $0x3,%eax\r
+ 1727b: 83 f8 02 cmp $0x2,%eax\r
+ 1727e: 74 28 je 172a8 <_usb_buffer_map_sg+0x42>\r
+ 17280: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17283: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 17289: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 1728c: 85 c0 test %eax,%eax\r
+ 1728e: 74 18 je 172a8 <_usb_buffer_map_sg+0x42>\r
+ 17290: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 17293: 8b 00 mov (%eax),%eax\r
+ 17295: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 17298: 85 c0 test %eax,%eax\r
+ 1729a: 74 0c je 172a8 <_usb_buffer_map_sg+0x42>\r
+ 1729c: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1729f: 83 b8 84 00 00 00 00 cmpl $0x0,0x84(%eax)\r
+ 172a6: 75 09 jne 172b1 <_usb_buffer_map_sg+0x4b>\r
+ 172a8: c7 45 f4 ff ff ff ff movl $0xffffffff,0xfffffff4(%ebp)\r
+ 172af: eb 07 jmp 172b8 <_usb_buffer_map_sg+0x52>\r
+ 172b1: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 172b8: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 172bb: c9 leave \r
+ 172bc: c3 ret \r
+\r
+000172bd <_usb_buffer_dmasync_sg>:\r
+ 172bd: 55 push %ebp\r
+ 172be: 89 e5 mov %esp,%ebp\r
+ 172c0: 83 ec 08 sub $0x8,%esp\r
+ 172c3: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 172c7: 74 1c je 172e5 <_usb_buffer_dmasync_sg+0x28>\r
+ 172c9: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 172cc: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 172d2: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 172d5: 85 c0 test %eax,%eax\r
+ 172d7: 74 0c je 172e5 <_usb_buffer_dmasync_sg+0x28>\r
+ 172d9: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 172dc: 8b 00 mov (%eax),%eax\r
+ 172de: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 172e1: 85 c0 test %eax,%eax\r
+ 172e3: 74 00 je 172e5 <_usb_buffer_dmasync_sg+0x28>\r
+ 172e5: c9 leave \r
+ 172e6: c3 ret \r
+\r
+000172e7 <_usb_buffer_unmap_sg>:\r
+ 172e7: 55 push %ebp\r
+ 172e8: 89 e5 mov %esp,%ebp\r
+ 172ea: 83 ec 08 sub $0x8,%esp\r
+ 172ed: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 172f1: 74 1c je 1730f <_usb_buffer_unmap_sg+0x28>\r
+ 172f3: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 172f6: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 172fc: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 172ff: 85 c0 test %eax,%eax\r
+ 17301: 74 0c je 1730f <_usb_buffer_unmap_sg+0x28>\r
+ 17303: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 17306: 8b 00 mov (%eax),%eax\r
+ 17308: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 1730b: 85 c0 test %eax,%eax\r
+ 1730d: 74 00 je 1730f <_usb_buffer_unmap_sg+0x28>\r
+ 1730f: c9 leave \r
+ 17310: c3 ret \r
+\r
+00017311 <_usb_setup_disable>:\r
+ 17311: 55 push %ebp\r
+ 17312: 89 e5 mov %esp,%ebp\r
+ 17314: c7 05 30 c1 01 00 01 movl $0x1,0x1c130\r
+ 1731b: 00 00 00 \r
+ 1731e: b8 01 00 00 00 mov $0x1,%eax\r
+ 17323: 5d pop %ebp\r
+ 17324: c3 ret \r
+\r
+00017325 <_usb_disabled@0>:\r
+ 17325: 55 push %ebp\r
+ 17326: 89 e5 mov %esp,%ebp\r
+ 17328: a1 30 c1 01 00 mov 0x1c130,%eax\r
+ 1732d: 5d pop %ebp\r
+ 1732e: c3 ret \r
+\r
+0001732f <_usb_init>:\r
+ 1732f: 55 push %ebp\r
+ 17330: 89 e5 mov %esp,%ebp\r
+ 17332: 83 ec 08 sub $0x8,%esp\r
+ 17335: 83 3d 30 c1 01 00 00 cmpl $0x0,0x1c130\r
+ 1733c: 74 09 je 17347 <_usb_init+0x18>\r
+ 1733e: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 17345: eb 26 jmp 1736d <_usb_init+0x3e>\r
+ 17347: e8 30 00 00 00 call 1737c <_usb_major_init>\r
+ 1734c: e8 21 00 00 00 call 17372 <_usbfs_init>\r
+ 17351: e8 63 e3 ff ff call 156b9 <_usb_hub_init>\r
+ 17356: 83 ec 0c sub $0xc,%esp\r
+ 17359: 68 e0 a0 01 00 push $0x1a0e0\r
+ 1735e: e8 79 24 00 00 call 197dc <_my_driver_register>\r
+ 17363: 83 c4 10 add $0x10,%esp\r
+ 17366: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 1736d: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 17370: c9 leave \r
+ 17371: c3 ret \r
+\r
+00017372 <_usbfs_init>:\r
+ 17372: 55 push %ebp\r
+ 17373: 89 e5 mov %esp,%ebp\r
+ 17375: b8 00 00 00 00 mov $0x0,%eax\r
+ 1737a: 5d pop %ebp\r
+ 1737b: c3 ret \r
+\r
+0001737c <_usb_major_init>:\r
+ 1737c: 55 push %ebp\r
+ 1737d: 89 e5 mov %esp,%ebp\r
+ 1737f: b8 00 00 00 00 mov $0x0,%eax\r
+ 17384: 5d pop %ebp\r
+ 17385: c3 ret \r
+\r
+00017386 <_usb_exit>:\r
+ 17386: 55 push %ebp\r
+ 17387: 89 e5 mov %esp,%ebp\r
+ 17389: 83 ec 08 sub $0x8,%esp\r
+ 1738c: 83 3d 30 c1 01 00 00 cmpl $0x0,0x1c130\r
+ 17393: 74 02 je 17397 <_usb_exit+0x11>\r
+ 17395: eb 0f jmp 173a6 <_usb_exit+0x20>\r
+ 17397: e8 11 00 00 00 call 173ad <_usb_major_cleanup>\r
+ 1739c: e8 07 00 00 00 call 173a8 <_usbfs_cleanup>\r
+ 173a1: e8 80 e3 ff ff call 15726 <_usb_hub_cleanup>\r
+ 173a6: c9 leave \r
+ 173a7: c3 ret \r
+\r
+000173a8 <_usbfs_cleanup>:\r
+ 173a8: 55 push %ebp\r
+ 173a9: 89 e5 mov %esp,%ebp\r
+ 173ab: 5d pop %ebp\r
+ 173ac: c3 ret \r
+\r
+000173ad <_usb_major_cleanup>:\r
+ 173ad: 55 push %ebp\r
+ 173ae: 89 e5 mov %esp,%ebp\r
+ 173b0: 5d pop %ebp\r
+ 173b1: c3 ret \r
+\r
+000173b2 <_subsys_usb_init>:\r
+ 173b2: 55 push %ebp\r
+ 173b3: 89 e5 mov %esp,%ebp\r
+ 173b5: 83 ec 08 sub $0x8,%esp\r
+ 173b8: e8 72 ff ff ff call 1732f <_usb_init>\r
+ 173bd: c9 leave \r
+ 173be: c3 ret \r
+\r
+000173bf <_module_exit_usb_exit>:\r
+ 173bf: 55 push %ebp\r
+ 173c0: 89 e5 mov %esp,%ebp\r
+ 173c2: 83 ec 08 sub $0x8,%esp\r
+ 173c5: e8 bc ff ff ff call 17386 <_usb_exit>\r
+ 173ca: c9 leave \r
+ 173cb: c3 ret \r
+ 173cc: 90 nop \r
+ 173cd: 90 nop \r
+ 173ce: 90 nop \r
+ 173cf: 90 nop \r
+\r
+000173d0 <_usb_parse_endpoint>:\r
+ 173d0: 55 push %ebp\r
+ 173d1: 89 e5 mov %esp,%ebp\r
+ 173d3: 53 push %ebx\r
+ 173d4: 83 ec 24 sub $0x24,%esp\r
+ 173d7: c7 45 f0 00 00 00 00 movl $0x0,0xfffffff0(%ebp)\r
+ 173de: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 173e1: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 173e4: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 173e7: 8a 00 mov (%eax),%al\r
+ 173e9: 25 ff 00 00 00 and $0xff,%eax\r
+ 173ee: 3b 45 10 cmp 0x10(%ebp),%eax\r
+ 173f1: 7e 0c jle 173ff <_usb_parse_endpoint+0x2f>\r
+ 173f3: c7 45 e4 ff ff ff ff movl $0xffffffff,0xffffffe4(%ebp)\r
+ 173fa: e9 7c 01 00 00 jmp 1757b <_usb_parse_endpoint+0x1ab>\r
+ 173ff: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 17402: 80 78 01 05 cmpb $0x5,0x1(%eax)\r
+ 17406: 74 0b je 17413 <_usb_parse_endpoint+0x43>\r
+ 17408: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 1740b: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 1740e: e9 68 01 00 00 jmp 1757b <_usb_parse_endpoint+0x1ab>\r
+ 17413: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 17416: 80 38 09 cmpb $0x9,(%eax)\r
+ 17419: 75 15 jne 17430 <_usb_parse_endpoint+0x60>\r
+ 1741b: 83 ec 04 sub $0x4,%esp\r
+ 1741e: 6a 09 push $0x9\r
+ 17420: ff 75 0c pushl 0xc(%ebp)\r
+ 17423: ff 75 08 pushl 0x8(%ebp)\r
+ 17426: e8 45 26 00 00 call 19a70 <_memcpy>\r
+ 1742b: 83 c4 10 add $0x10,%esp\r
+ 1742e: eb 13 jmp 17443 <_usb_parse_endpoint+0x73>\r
+ 17430: 83 ec 04 sub $0x4,%esp\r
+ 17433: 6a 07 push $0x7\r
+ 17435: ff 75 0c pushl 0xc(%ebp)\r
+ 17438: ff 75 08 pushl 0x8(%ebp)\r
+ 1743b: e8 30 26 00 00 call 19a70 <_memcpy>\r
+ 17440: 83 c4 10 add $0x10,%esp\r
+ 17443: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 17446: ba 00 00 00 00 mov $0x0,%edx\r
+ 1744b: 8a 10 mov (%eax),%dl\r
+ 1744d: 8d 45 0c lea 0xc(%ebp),%eax\r
+ 17450: 01 10 add %edx,(%eax)\r
+ 17452: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 17455: ba 00 00 00 00 mov $0x0,%edx\r
+ 1745a: 8a 10 mov (%eax),%dl\r
+ 1745c: 8d 45 10 lea 0x10(%ebp),%eax\r
+ 1745f: 29 10 sub %edx,(%eax)\r
+ 17461: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 17464: ba 00 00 00 00 mov $0x0,%edx\r
+ 17469: 8a 10 mov (%eax),%dl\r
+ 1746b: 8d 45 f0 lea 0xfffffff0(%ebp),%eax\r
+ 1746e: 01 10 add %edx,(%eax)\r
+ 17470: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 17473: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 17476: c7 45 e8 00 00 00 00 movl $0x0,0xffffffe8(%ebp)\r
+ 1747d: 83 7d 10 01 cmpl $0x1,0x10(%ebp)\r
+ 17481: 76 72 jbe 174f5 <_usb_parse_endpoint+0x125>\r
+ 17483: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 17486: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 17489: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1748c: 80 38 01 cmpb $0x1,(%eax)\r
+ 1748f: 77 0c ja 1749d <_usb_parse_endpoint+0xcd>\r
+ 17491: c7 45 e4 ff ff ff ff movl $0xffffffff,0xffffffe4(%ebp)\r
+ 17498: e9 de 00 00 00 jmp 1757b <_usb_parse_endpoint+0x1ab>\r
+ 1749d: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 174a0: 80 78 01 05 cmpb $0x5,0x1(%eax)\r
+ 174a4: 74 4f je 174f5 <_usb_parse_endpoint+0x125>\r
+ 174a6: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 174a9: 80 78 01 04 cmpb $0x4,0x1(%eax)\r
+ 174ad: 74 46 je 174f5 <_usb_parse_endpoint+0x125>\r
+ 174af: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 174b2: 80 78 01 02 cmpb $0x2,0x1(%eax)\r
+ 174b6: 74 3d je 174f5 <_usb_parse_endpoint+0x125>\r
+ 174b8: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 174bb: 80 78 01 01 cmpb $0x1,0x1(%eax)\r
+ 174bf: 74 34 je 174f5 <_usb_parse_endpoint+0x125>\r
+ 174c1: 8d 45 e8 lea 0xffffffe8(%ebp),%eax\r
+ 174c4: ff 00 incl (%eax)\r
+ 174c6: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 174c9: ba 00 00 00 00 mov $0x0,%edx\r
+ 174ce: 8a 10 mov (%eax),%dl\r
+ 174d0: 8d 45 0c lea 0xc(%ebp),%eax\r
+ 174d3: 01 10 add %edx,(%eax)\r
+ 174d5: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 174d8: ba 00 00 00 00 mov $0x0,%edx\r
+ 174dd: 8a 10 mov (%eax),%dl\r
+ 174df: 8d 45 10 lea 0x10(%ebp),%eax\r
+ 174e2: 29 10 sub %edx,(%eax)\r
+ 174e4: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 174e7: ba 00 00 00 00 mov $0x0,%edx\r
+ 174ec: 8a 10 mov (%eax),%dl\r
+ 174ee: 8d 45 f0 lea 0xfffffff0(%ebp),%eax\r
+ 174f1: 01 10 add %edx,(%eax)\r
+ 174f3: eb 88 jmp 1747d <_usb_parse_endpoint+0xad>\r
+ 174f5: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 174f8: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 174fb: 29 c2 sub %eax,%edx\r
+ 174fd: 89 d0 mov %edx,%eax\r
+ 174ff: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 17502: 83 7d ec 00 cmpl $0x0,0xffffffec(%ebp)\r
+ 17506: 75 1c jne 17524 <_usb_parse_endpoint+0x154>\r
+ 17508: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1750b: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)\r
+ 17512: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17515: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax)\r
+ 1751c: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 1751f: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 17522: eb 57 jmp 1757b <_usb_parse_endpoint+0x1ab>\r
+ 17524: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 17527: 83 ec 08 sub $0x8,%esp\r
+ 1752a: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 1752d: 6a 01 push $0x1\r
+ 1752f: e8 fc 24 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 17534: 83 c4 08 add $0x8,%esp\r
+ 17537: 89 43 0c mov %eax,0xc(%ebx)\r
+ 1753a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1753d: 83 78 0c 00 cmpl $0x0,0xc(%eax)\r
+ 17541: 75 12 jne 17555 <_usb_parse_endpoint+0x185>\r
+ 17543: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17546: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax)\r
+ 1754d: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 17550: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 17553: eb 26 jmp 1757b <_usb_parse_endpoint+0x1ab>\r
+ 17555: 83 ec 04 sub $0x4,%esp\r
+ 17558: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 1755b: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 1755e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17561: ff 70 0c pushl 0xc(%eax)\r
+ 17564: e8 07 25 00 00 call 19a70 <_memcpy>\r
+ 17569: 83 c4 10 add $0x10,%esp\r
+ 1756c: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 1756f: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 17572: 89 42 10 mov %eax,0x10(%edx)\r
+ 17575: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 17578: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 1757b: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 1757e: 8b 5d fc mov 0xfffffffc(%ebp),%ebx\r
+ 17581: c9 leave \r
+ 17582: c3 ret \r
+\r
+00017583 <_usb_parse_interface>:\r
+ 17583: 55 push %ebp\r
+ 17584: 89 e5 mov %esp,%ebp\r
+ 17586: 53 push %ebx\r
+ 17587: 83 ec 34 sub $0x34,%esp\r
+ 1758a: c7 45 e8 00 00 00 00 movl $0x0,0xffffffe8(%ebp)\r
+ 17591: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17594: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax)\r
+ 1759b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1759e: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax)\r
+ 175a5: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 175a8: c7 40 0c 04 00 00 00 movl $0x4,0xc(%eax)\r
+ 175af: 83 ec 0c sub $0xc,%esp\r
+ 175b2: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 175b5: 83 c0 18 add $0x18,%eax\r
+ 175b8: 50 push %eax\r
+ 175b9: e8 a2 22 00 00 call 19860 <_my_device_initialize>\r
+ 175be: 83 c4 10 add $0x10,%esp\r
+ 175c1: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 175c4: 83 ec 08 sub $0x8,%esp\r
+ 175c7: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 175ca: 8b 50 0c mov 0xc(%eax),%edx\r
+ 175cd: 89 d0 mov %edx,%eax\r
+ 175cf: 01 c0 add %eax,%eax\r
+ 175d1: 01 d0 add %edx,%eax\r
+ 175d3: c1 e0 03 shl $0x3,%eax\r
+ 175d6: 50 push %eax\r
+ 175d7: 6a 01 push $0x1\r
+ 175d9: e8 52 24 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 175de: 83 c4 08 add $0x8,%esp\r
+ 175e1: 89 03 mov %eax,(%ebx)\r
+ 175e3: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 175e6: 83 38 00 cmpl $0x0,(%eax)\r
+ 175e9: 75 0c jne 175f7 <_usb_parse_interface+0x74>\r
+ 175eb: c7 45 cc ff ff ff ff movl $0xffffffff,0xffffffcc(%ebp)\r
+ 175f2: e9 85 03 00 00 jmp 1797c <_usb_parse_interface+0x3f9>\r
+ 175f7: 83 7d 10 00 cmpl $0x0,0x10(%ebp)\r
+ 175fb: 0f 8e 75 03 00 00 jle 17976 <_usb_parse_interface+0x3f3>\r
+ 17601: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17604: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 17607: 8b 40 08 mov 0x8(%eax),%eax\r
+ 1760a: 3b 42 0c cmp 0xc(%edx),%eax\r
+ 1760d: 0f 82 9a 00 00 00 jb 176ad <_usb_parse_interface+0x12a>\r
+ 17613: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17616: 8b 40 0c mov 0xc(%eax),%eax\r
+ 17619: 89 45 d0 mov %eax,0xffffffd0(%ebp)\r
+ 1761c: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 1761f: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17622: 8b 40 0c mov 0xc(%eax),%eax\r
+ 17625: 83 c0 04 add $0x4,%eax\r
+ 17628: 89 42 0c mov %eax,0xc(%edx)\r
+ 1762b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1762e: 81 78 0c 80 00 00 00 cmpl $0x80,0xc(%eax)\r
+ 17635: 76 0c jbe 17643 <_usb_parse_interface+0xc0>\r
+ 17637: c7 45 cc ff ff ff ff movl $0xffffffff,0xffffffcc(%ebp)\r
+ 1763e: e9 39 03 00 00 jmp 1797c <_usb_parse_interface+0x3f9>\r
+ 17643: 83 ec 08 sub $0x8,%esp\r
+ 17646: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17649: 8b 50 0c mov 0xc(%eax),%edx\r
+ 1764c: 89 d0 mov %edx,%eax\r
+ 1764e: 01 c0 add %eax,%eax\r
+ 17650: 01 d0 add %edx,%eax\r
+ 17652: c1 e0 03 shl $0x3,%eax\r
+ 17655: 50 push %eax\r
+ 17656: 6a 01 push $0x1\r
+ 17658: e8 d3 23 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 1765d: 83 c4 08 add $0x8,%esp\r
+ 17660: 89 45 d4 mov %eax,0xffffffd4(%ebp)\r
+ 17663: 83 7d d4 00 cmpl $0x0,0xffffffd4(%ebp)\r
+ 17667: 75 0c jne 17675 <_usb_parse_interface+0xf2>\r
+ 17669: c7 45 cc ff ff ff ff movl $0xffffffff,0xffffffcc(%ebp)\r
+ 17670: e9 07 03 00 00 jmp 1797c <_usb_parse_interface+0x3f9>\r
+ 17675: 83 ec 04 sub $0x4,%esp\r
+ 17678: 8b 55 d0 mov 0xffffffd0(%ebp),%edx\r
+ 1767b: 89 d0 mov %edx,%eax\r
+ 1767d: 01 c0 add %eax,%eax\r
+ 1767f: 01 d0 add %edx,%eax\r
+ 17681: c1 e0 03 shl $0x3,%eax\r
+ 17684: 50 push %eax\r
+ 17685: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17688: ff 30 pushl (%eax)\r
+ 1768a: ff 75 d4 pushl 0xffffffd4(%ebp)\r
+ 1768d: e8 de 23 00 00 call 19a70 <_memcpy>\r
+ 17692: 83 c4 10 add $0x10,%esp\r
+ 17695: 83 ec 0c sub $0xc,%esp\r
+ 17698: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1769b: ff 30 pushl (%eax)\r
+ 1769d: e8 9e 23 00 00 call 19a40 <_ExFreePool@4>\r
+ 176a2: 83 c4 0c add $0xc,%esp\r
+ 176a5: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 176a8: 8b 45 d4 mov 0xffffffd4(%ebp),%eax\r
+ 176ab: 89 02 mov %eax,(%edx)\r
+ 176ad: 8b 4d 08 mov 0x8(%ebp),%ecx\r
+ 176b0: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 176b3: 8b 50 08 mov 0x8(%eax),%edx\r
+ 176b6: 89 d0 mov %edx,%eax\r
+ 176b8: 01 c0 add %eax,%eax\r
+ 176ba: 01 d0 add %edx,%eax\r
+ 176bc: c1 e0 03 shl $0x3,%eax\r
+ 176bf: 03 01 add (%ecx),%eax\r
+ 176c1: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 176c4: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 176c7: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)\r
+ 176ce: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 176d1: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax)\r
+ 176d8: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 176db: c7 40 14 00 00 00 00 movl $0x0,0x14(%eax)\r
+ 176e2: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 176e5: ff 40 08 incl 0x8(%eax)\r
+ 176e8: 83 ec 04 sub $0x4,%esp\r
+ 176eb: 6a 09 push $0x9\r
+ 176ed: ff 75 0c pushl 0xc(%ebp)\r
+ 176f0: ff 75 e0 pushl 0xffffffe0(%ebp)\r
+ 176f3: e8 78 23 00 00 call 19a70 <_memcpy>\r
+ 176f8: 83 c4 10 add $0x10,%esp\r
+ 176fb: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 176fe: ba 00 00 00 00 mov $0x0,%edx\r
+ 17703: 8a 10 mov (%eax),%dl\r
+ 17705: 8d 45 0c lea 0xc(%ebp),%eax\r
+ 17708: 01 10 add %edx,(%eax)\r
+ 1770a: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 1770d: ba 00 00 00 00 mov $0x0,%edx\r
+ 17712: 8a 10 mov (%eax),%dl\r
+ 17714: 8d 45 e8 lea 0xffffffe8(%ebp),%eax\r
+ 17717: 01 10 add %edx,(%eax)\r
+ 17719: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 1771c: ba 00 00 00 00 mov $0x0,%edx\r
+ 17721: 8a 10 mov (%eax),%dl\r
+ 17723: 8d 45 10 lea 0x10(%ebp),%eax\r
+ 17726: 29 10 sub %edx,(%eax)\r
+ 17728: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1772b: 89 45 dc mov %eax,0xffffffdc(%ebp)\r
+ 1772e: c7 45 f0 00 00 00 00 movl $0x0,0xfffffff0(%ebp)\r
+ 17735: 83 7d 10 01 cmpl $0x1,0x10(%ebp)\r
+ 17739: 76 72 jbe 177ad <_usb_parse_interface+0x22a>\r
+ 1773b: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1773e: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 17741: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 17744: 80 38 01 cmpb $0x1,(%eax)\r
+ 17747: 77 0c ja 17755 <_usb_parse_interface+0x1d2>\r
+ 17749: c7 45 cc ff ff ff ff movl $0xffffffff,0xffffffcc(%ebp)\r
+ 17750: e9 27 02 00 00 jmp 1797c <_usb_parse_interface+0x3f9>\r
+ 17755: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 17758: 80 78 01 04 cmpb $0x4,0x1(%eax)\r
+ 1775c: 74 4f je 177ad <_usb_parse_interface+0x22a>\r
+ 1775e: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 17761: 80 78 01 05 cmpb $0x5,0x1(%eax)\r
+ 17765: 74 46 je 177ad <_usb_parse_interface+0x22a>\r
+ 17767: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 1776a: 80 78 01 02 cmpb $0x2,0x1(%eax)\r
+ 1776e: 74 3d je 177ad <_usb_parse_interface+0x22a>\r
+ 17770: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 17773: 80 78 01 01 cmpb $0x1,0x1(%eax)\r
+ 17777: 74 34 je 177ad <_usb_parse_interface+0x22a>\r
+ 17779: 8d 45 f0 lea 0xfffffff0(%ebp),%eax\r
+ 1777c: ff 00 incl (%eax)\r
+ 1777e: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 17781: ba 00 00 00 00 mov $0x0,%edx\r
+ 17786: 8a 10 mov (%eax),%dl\r
+ 17788: 8d 45 0c lea 0xc(%ebp),%eax\r
+ 1778b: 01 10 add %edx,(%eax)\r
+ 1778d: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 17790: ba 00 00 00 00 mov $0x0,%edx\r
+ 17795: 8a 10 mov (%eax),%dl\r
+ 17797: 8d 45 e8 lea 0xffffffe8(%ebp),%eax\r
+ 1779a: 01 10 add %edx,(%eax)\r
+ 1779c: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 1779f: ba 00 00 00 00 mov $0x0,%edx\r
+ 177a4: 8a 10 mov (%eax),%dl\r
+ 177a6: 8d 45 10 lea 0x10(%ebp),%eax\r
+ 177a9: 29 10 sub %edx,(%eax)\r
+ 177ab: eb 88 jmp 17735 <_usb_parse_interface+0x1b2>\r
+ 177ad: 8b 45 dc mov 0xffffffdc(%ebp),%eax\r
+ 177b0: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 177b3: 29 c2 sub %eax,%edx\r
+ 177b5: 89 d0 mov %edx,%eax\r
+ 177b7: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 177ba: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 177be: 74 55 je 17815 <_usb_parse_interface+0x292>\r
+ 177c0: 8b 5d e0 mov 0xffffffe0(%ebp),%ebx\r
+ 177c3: 83 ec 08 sub $0x8,%esp\r
+ 177c6: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 177c9: 6a 01 push $0x1\r
+ 177cb: e8 60 22 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 177d0: 83 c4 08 add $0x8,%esp\r
+ 177d3: 89 43 10 mov %eax,0x10(%ebx)\r
+ 177d6: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 177d9: 83 78 10 00 cmpl $0x0,0x10(%eax)\r
+ 177dd: 75 16 jne 177f5 <_usb_parse_interface+0x272>\r
+ 177df: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 177e2: c7 40 14 00 00 00 00 movl $0x0,0x14(%eax)\r
+ 177e9: c7 45 cc ff ff ff ff movl $0xffffffff,0xffffffcc(%ebp)\r
+ 177f0: e9 87 01 00 00 jmp 1797c <_usb_parse_interface+0x3f9>\r
+ 177f5: 83 ec 04 sub $0x4,%esp\r
+ 177f8: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 177fb: ff 75 dc pushl 0xffffffdc(%ebp)\r
+ 177fe: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 17801: ff 70 10 pushl 0x10(%eax)\r
+ 17804: e8 67 22 00 00 call 19a70 <_memcpy>\r
+ 17809: 83 c4 10 add $0x10,%esp\r
+ 1780c: 8b 55 e0 mov 0xffffffe0(%ebp),%edx\r
+ 1780f: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 17812: 89 42 14 mov %eax,0x14(%edx)\r
+ 17815: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 17818: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 1781b: 83 7d 10 01 cmpl $0x1,0x10(%ebp)\r
+ 1781f: 76 1f jbe 17840 <_usb_parse_interface+0x2bd>\r
+ 17821: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 17824: 80 78 01 02 cmpb $0x2,0x1(%eax)\r
+ 17828: 74 0b je 17835 <_usb_parse_interface+0x2b2>\r
+ 1782a: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 1782d: 80 78 01 01 cmpb $0x1,0x1(%eax)\r
+ 17831: 74 02 je 17835 <_usb_parse_interface+0x2b2>\r
+ 17833: eb 0b jmp 17840 <_usb_parse_interface+0x2bd>\r
+ 17835: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 17838: 89 45 cc mov %eax,0xffffffcc(%ebp)\r
+ 1783b: e9 3c 01 00 00 jmp 1797c <_usb_parse_interface+0x3f9>\r
+ 17840: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 17843: 80 78 04 1e cmpb $0x1e,0x4(%eax)\r
+ 17847: 76 0c jbe 17855 <_usb_parse_interface+0x2d2>\r
+ 17849: c7 45 cc ff ff ff ff movl $0xffffffff,0xffffffcc(%ebp)\r
+ 17850: e9 27 01 00 00 jmp 1797c <_usb_parse_interface+0x3f9>\r
+ 17855: 8b 5d e0 mov 0xffffffe0(%ebp),%ebx\r
+ 17858: 83 ec 08 sub $0x8,%esp\r
+ 1785b: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 1785e: ba 00 00 00 00 mov $0x0,%edx\r
+ 17863: 8a 50 04 mov 0x4(%eax),%dl\r
+ 17866: 89 d0 mov %edx,%eax\r
+ 17868: c1 e0 02 shl $0x2,%eax\r
+ 1786b: 01 d0 add %edx,%eax\r
+ 1786d: c1 e0 02 shl $0x2,%eax\r
+ 17870: 50 push %eax\r
+ 17871: 6a 01 push $0x1\r
+ 17873: e8 b8 21 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 17878: 83 c4 08 add $0x8,%esp\r
+ 1787b: 89 43 0c mov %eax,0xc(%ebx)\r
+ 1787e: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 17881: 83 78 0c 00 cmpl $0x0,0xc(%eax)\r
+ 17885: 75 0c jne 17893 <_usb_parse_interface+0x310>\r
+ 17887: c7 45 cc ff ff ff ff movl $0xffffffff,0xffffffcc(%ebp)\r
+ 1788e: e9 e9 00 00 00 jmp 1797c <_usb_parse_interface+0x3f9>\r
+ 17893: 83 ec 04 sub $0x4,%esp\r
+ 17896: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 17899: ba 00 00 00 00 mov $0x0,%edx\r
+ 1789e: 8a 50 04 mov 0x4(%eax),%dl\r
+ 178a1: 89 d0 mov %edx,%eax\r
+ 178a3: c1 e0 02 shl $0x2,%eax\r
+ 178a6: 01 d0 add %edx,%eax\r
+ 178a8: c1 e0 02 shl $0x2,%eax\r
+ 178ab: 50 push %eax\r
+ 178ac: 6a 00 push $0x0\r
+ 178ae: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 178b1: ff 70 0c pushl 0xc(%eax)\r
+ 178b4: e8 97 21 00 00 call 19a50 <_memset>\r
+ 178b9: 83 c4 10 add $0x10,%esp\r
+ 178bc: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 178c3: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 178c6: 8a 40 04 mov 0x4(%eax),%al\r
+ 178c9: 25 ff 00 00 00 and $0xff,%eax\r
+ 178ce: 3b 45 f8 cmp 0xfffffff8(%ebp),%eax\r
+ 178d1: 7e 79 jle 1794c <_usb_parse_interface+0x3c9>\r
+ 178d3: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 178d6: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 178d9: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 178dc: 8a 00 mov (%eax),%al\r
+ 178de: 25 ff 00 00 00 and $0xff,%eax\r
+ 178e3: 3b 45 10 cmp 0x10(%ebp),%eax\r
+ 178e6: 7e 0c jle 178f4 <_usb_parse_interface+0x371>\r
+ 178e8: c7 45 cc ff ff ff ff movl $0xffffffff,0xffffffcc(%ebp)\r
+ 178ef: e9 88 00 00 00 jmp 1797c <_usb_parse_interface+0x3f9>\r
+ 178f4: 83 ec 04 sub $0x4,%esp\r
+ 178f7: ff 75 10 pushl 0x10(%ebp)\r
+ 178fa: ff 75 0c pushl 0xc(%ebp)\r
+ 178fd: 8b 4d e0 mov 0xffffffe0(%ebp),%ecx\r
+ 17900: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 17903: 89 d0 mov %edx,%eax\r
+ 17905: c1 e0 02 shl $0x2,%eax\r
+ 17908: 01 d0 add %edx,%eax\r
+ 1790a: c1 e0 02 shl $0x2,%eax\r
+ 1790d: 03 41 0c add 0xc(%ecx),%eax\r
+ 17910: 50 push %eax\r
+ 17911: e8 ba fa ff ff call 173d0 <_usb_parse_endpoint>\r
+ 17916: 83 c4 10 add $0x10,%esp\r
+ 17919: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 1791c: 83 7d ec 00 cmpl $0x0,0xffffffec(%ebp)\r
+ 17920: 79 08 jns 1792a <_usb_parse_interface+0x3a7>\r
+ 17922: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 17925: 89 45 cc mov %eax,0xffffffcc(%ebp)\r
+ 17928: eb 52 jmp 1797c <_usb_parse_interface+0x3f9>\r
+ 1792a: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 1792d: 8d 45 0c lea 0xc(%ebp),%eax\r
+ 17930: 01 10 add %edx,(%eax)\r
+ 17932: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 17935: 8d 45 e8 lea 0xffffffe8(%ebp),%eax\r
+ 17938: 01 10 add %edx,(%eax)\r
+ 1793a: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 1793d: 8d 45 10 lea 0x10(%ebp),%eax\r
+ 17940: 29 10 sub %edx,(%eax)\r
+ 17942: 8d 45 f8 lea 0xfffffff8(%ebp),%eax\r
+ 17945: ff 00 incl (%eax)\r
+ 17947: e9 77 ff ff ff jmp 178c3 <_usb_parse_interface+0x340>\r
+ 1794c: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1794f: 89 45 d8 mov %eax,0xffffffd8(%ebp)\r
+ 17952: 83 7d 10 08 cmpl $0x8,0x10(%ebp)\r
+ 17956: 7e 16 jle 1796e <_usb_parse_interface+0x3eb>\r
+ 17958: 8b 45 d8 mov 0xffffffd8(%ebp),%eax\r
+ 1795b: 80 78 01 04 cmpb $0x4,0x1(%eax)\r
+ 1795f: 75 0d jne 1796e <_usb_parse_interface+0x3eb>\r
+ 17961: 8b 45 d8 mov 0xffffffd8(%ebp),%eax\r
+ 17964: 80 78 03 00 cmpb $0x0,0x3(%eax)\r
+ 17968: 0f 85 89 fc ff ff jne 175f7 <_usb_parse_interface+0x74>\r
+ 1796e: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 17971: 89 45 cc mov %eax,0xffffffcc(%ebp)\r
+ 17974: eb 06 jmp 1797c <_usb_parse_interface+0x3f9>\r
+ 17976: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 17979: 89 45 cc mov %eax,0xffffffcc(%ebp)\r
+ 1797c: 8b 45 cc mov 0xffffffcc(%ebp),%eax\r
+ 1797f: 8b 5d fc mov 0xfffffffc(%ebp),%ebx\r
+ 17982: c9 leave \r
+ 17983: c3 ret \r
+\r
+00017984 <_usb_parse_configuration>:\r
+ 17984: 55 push %ebp\r
+ 17985: 89 e5 mov %esp,%ebp\r
+ 17987: 53 push %ebx\r
+ 17988: 83 ec 24 sub $0x24,%esp\r
+ 1798b: 83 ec 04 sub $0x4,%esp\r
+ 1798e: 6a 09 push $0x9\r
+ 17990: ff 75 0c pushl 0xc(%ebp)\r
+ 17993: ff 75 08 pushl 0x8(%ebp)\r
+ 17996: e8 d5 20 00 00 call 19a70 <_memcpy>\r
+ 1799b: 83 c4 10 add $0x10,%esp\r
+ 1799e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 179a1: 66 8b 40 02 mov 0x2(%eax),%ax\r
+ 179a5: 25 ff ff 00 00 and $0xffff,%eax\r
+ 179aa: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 179ad: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 179b0: 80 78 04 20 cmpb $0x20,0x4(%eax)\r
+ 179b4: 76 0c jbe 179c2 <_usb_parse_configuration+0x3e>\r
+ 179b6: c7 45 dc ff ff ff ff movl $0xffffffff,0xffffffdc(%ebp)\r
+ 179bd: e9 2b 02 00 00 jmp 17bed <_usb_parse_configuration+0x269>\r
+ 179c2: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 179c5: 83 ec 08 sub $0x8,%esp\r
+ 179c8: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 179cb: b9 00 00 00 00 mov $0x0,%ecx\r
+ 179d0: 8a 48 04 mov 0x4(%eax),%cl\r
+ 179d3: 89 c8 mov %ecx,%eax\r
+ 179d5: c1 e0 02 shl $0x2,%eax\r
+ 179d8: 01 c8 add %ecx,%eax\r
+ 179da: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 179e1: 01 d0 add %edx,%eax\r
+ 179e3: 01 c0 add %eax,%eax\r
+ 179e5: 01 c8 add %ecx,%eax\r
+ 179e7: c1 e0 02 shl $0x2,%eax\r
+ 179ea: 50 push %eax\r
+ 179eb: 6a 01 push $0x1\r
+ 179ed: e8 3e 20 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 179f2: 83 c4 08 add $0x8,%esp\r
+ 179f5: 89 43 0c mov %eax,0xc(%ebx)\r
+ 179f8: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 179fb: 83 78 0c 00 cmpl $0x0,0xc(%eax)\r
+ 179ff: 75 0c jne 17a0d <_usb_parse_configuration+0x89>\r
+ 17a01: c7 45 dc ff ff ff ff movl $0xffffffff,0xffffffdc(%ebp)\r
+ 17a08: e9 e0 01 00 00 jmp 17bed <_usb_parse_configuration+0x269>\r
+ 17a0d: 83 ec 04 sub $0x4,%esp\r
+ 17a10: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17a13: b9 00 00 00 00 mov $0x0,%ecx\r
+ 17a18: 8a 48 04 mov 0x4(%eax),%cl\r
+ 17a1b: 89 c8 mov %ecx,%eax\r
+ 17a1d: c1 e0 02 shl $0x2,%eax\r
+ 17a20: 01 c8 add %ecx,%eax\r
+ 17a22: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 17a29: 01 d0 add %edx,%eax\r
+ 17a2b: 01 c0 add %eax,%eax\r
+ 17a2d: 01 c8 add %ecx,%eax\r
+ 17a2f: c1 e0 02 shl $0x2,%eax\r
+ 17a32: 50 push %eax\r
+ 17a33: 6a 00 push $0x0\r
+ 17a35: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17a38: ff 70 0c pushl 0xc(%eax)\r
+ 17a3b: e8 10 20 00 00 call 19a50 <_memset>\r
+ 17a40: 83 c4 10 add $0x10,%esp\r
+ 17a43: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17a46: ba 00 00 00 00 mov $0x0,%edx\r
+ 17a4b: 8a 10 mov (%eax),%dl\r
+ 17a4d: 8d 45 0c lea 0xc(%ebp),%eax\r
+ 17a50: 01 10 add %edx,(%eax)\r
+ 17a52: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17a55: ba 00 00 00 00 mov $0x0,%edx\r
+ 17a5a: 8a 10 mov (%eax),%dl\r
+ 17a5c: 8d 45 f0 lea 0xfffffff0(%ebp),%eax\r
+ 17a5f: 29 10 sub %edx,(%eax)\r
+ 17a61: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17a64: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax)\r
+ 17a6b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17a6e: c7 40 14 00 00 00 00 movl $0x0,0x14(%eax)\r
+ 17a75: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 17a7c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17a7f: 8a 40 04 mov 0x4(%eax),%al\r
+ 17a82: 25 ff 00 00 00 and $0xff,%eax\r
+ 17a87: 3b 45 f8 cmp 0xfffffff8(%ebp),%eax\r
+ 17a8a: 0f 8e 57 01 00 00 jle 17be7 <_usb_parse_configuration+0x263>\r
+ 17a90: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 17a93: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 17a96: c7 45 e8 00 00 00 00 movl $0x0,0xffffffe8(%ebp)\r
+ 17a9d: 83 7d f0 01 cmpl $0x1,0xfffffff0(%ebp)\r
+ 17aa1: 76 74 jbe 17b17 <_usb_parse_configuration+0x193>\r
+ 17aa3: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 17aa6: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 17aa9: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 17aac: 8a 00 mov (%eax),%al\r
+ 17aae: 25 ff 00 00 00 and $0xff,%eax\r
+ 17ab3: 3b 45 f0 cmp 0xfffffff0(%ebp),%eax\r
+ 17ab6: 7f 0a jg 17ac2 <_usb_parse_configuration+0x13e>\r
+ 17ab8: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 17abb: 80 38 01 cmpb $0x1,(%eax)\r
+ 17abe: 76 02 jbe 17ac2 <_usb_parse_configuration+0x13e>\r
+ 17ac0: eb 0c jmp 17ace <_usb_parse_configuration+0x14a>\r
+ 17ac2: c7 45 dc ff ff ff ff movl $0xffffffff,0xffffffdc(%ebp)\r
+ 17ac9: e9 1f 01 00 00 jmp 17bed <_usb_parse_configuration+0x269>\r
+ 17ace: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 17ad1: 80 78 01 05 cmpb $0x5,0x1(%eax)\r
+ 17ad5: 74 40 je 17b17 <_usb_parse_configuration+0x193>\r
+ 17ad7: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 17ada: 80 78 01 04 cmpb $0x4,0x1(%eax)\r
+ 17ade: 74 37 je 17b17 <_usb_parse_configuration+0x193>\r
+ 17ae0: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 17ae3: 80 78 01 02 cmpb $0x2,0x1(%eax)\r
+ 17ae7: 74 2e je 17b17 <_usb_parse_configuration+0x193>\r
+ 17ae9: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 17aec: 80 78 01 01 cmpb $0x1,0x1(%eax)\r
+ 17af0: 74 25 je 17b17 <_usb_parse_configuration+0x193>\r
+ 17af2: 8d 45 e8 lea 0xffffffe8(%ebp),%eax\r
+ 17af5: ff 00 incl (%eax)\r
+ 17af7: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 17afa: ba 00 00 00 00 mov $0x0,%edx\r
+ 17aff: 8a 10 mov (%eax),%dl\r
+ 17b01: 8d 45 0c lea 0xc(%ebp),%eax\r
+ 17b04: 01 10 add %edx,(%eax)\r
+ 17b06: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 17b09: ba 00 00 00 00 mov $0x0,%edx\r
+ 17b0e: 8a 10 mov (%eax),%dl\r
+ 17b10: 8d 45 f0 lea 0xfffffff0(%ebp),%eax\r
+ 17b13: 29 10 sub %edx,(%eax)\r
+ 17b15: eb 86 jmp 17a9d <_usb_parse_configuration+0x119>\r
+ 17b17: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 17b1a: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 17b1d: 29 c2 sub %eax,%edx\r
+ 17b1f: 89 d0 mov %edx,%eax\r
+ 17b21: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 17b24: 83 7d e4 00 cmpl $0x0,0xffffffe4(%ebp)\r
+ 17b28: 74 60 je 17b8a <_usb_parse_configuration+0x206>\r
+ 17b2a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17b2d: 83 78 14 00 cmpl $0x0,0x14(%eax)\r
+ 17b31: 74 02 je 17b35 <_usb_parse_configuration+0x1b1>\r
+ 17b33: eb 55 jmp 17b8a <_usb_parse_configuration+0x206>\r
+ 17b35: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 17b38: 83 ec 08 sub $0x8,%esp\r
+ 17b3b: ff 75 e4 pushl 0xffffffe4(%ebp)\r
+ 17b3e: 6a 01 push $0x1\r
+ 17b40: e8 eb 1e 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 17b45: 83 c4 08 add $0x8,%esp\r
+ 17b48: 89 43 10 mov %eax,0x10(%ebx)\r
+ 17b4b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17b4e: 83 78 10 00 cmpl $0x0,0x10(%eax)\r
+ 17b52: 75 16 jne 17b6a <_usb_parse_configuration+0x1e6>\r
+ 17b54: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17b57: c7 40 14 00 00 00 00 movl $0x0,0x14(%eax)\r
+ 17b5e: c7 45 dc ff ff ff ff movl $0xffffffff,0xffffffdc(%ebp)\r
+ 17b65: e9 83 00 00 00 jmp 17bed <_usb_parse_configuration+0x269>\r
+ 17b6a: 83 ec 04 sub $0x4,%esp\r
+ 17b6d: ff 75 e4 pushl 0xffffffe4(%ebp)\r
+ 17b70: ff 75 e0 pushl 0xffffffe0(%ebp)\r
+ 17b73: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17b76: ff 70 10 pushl 0x10(%eax)\r
+ 17b79: e8 f2 1e 00 00 call 19a70 <_memcpy>\r
+ 17b7e: 83 c4 10 add $0x10,%esp\r
+ 17b81: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 17b84: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 17b87: 89 42 14 mov %eax,0x14(%edx)\r
+ 17b8a: 83 ec 04 sub $0x4,%esp\r
+ 17b8d: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 17b90: ff 75 0c pushl 0xc(%ebp)\r
+ 17b93: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 17b96: 8b 4d f8 mov 0xfffffff8(%ebp),%ecx\r
+ 17b99: 89 c8 mov %ecx,%eax\r
+ 17b9b: c1 e0 02 shl $0x2,%eax\r
+ 17b9e: 01 c8 add %ecx,%eax\r
+ 17ba0: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 17ba7: 01 d0 add %edx,%eax\r
+ 17ba9: 01 c0 add %eax,%eax\r
+ 17bab: 01 c8 add %ecx,%eax\r
+ 17bad: c1 e0 02 shl $0x2,%eax\r
+ 17bb0: 03 43 0c add 0xc(%ebx),%eax\r
+ 17bb3: 50 push %eax\r
+ 17bb4: e8 ca f9 ff ff call 17583 <_usb_parse_interface>\r
+ 17bb9: 83 c4 10 add $0x10,%esp\r
+ 17bbc: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 17bbf: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 17bc3: 79 08 jns 17bcd <_usb_parse_configuration+0x249>\r
+ 17bc5: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 17bc8: 89 45 dc mov %eax,0xffffffdc(%ebp)\r
+ 17bcb: eb 20 jmp 17bed <_usb_parse_configuration+0x269>\r
+ 17bcd: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 17bd0: 8d 45 0c lea 0xc(%ebp),%eax\r
+ 17bd3: 01 10 add %edx,(%eax)\r
+ 17bd5: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 17bd8: 8d 45 f0 lea 0xfffffff0(%ebp),%eax\r
+ 17bdb: 29 10 sub %edx,(%eax)\r
+ 17bdd: 8d 45 f8 lea 0xfffffff8(%ebp),%eax\r
+ 17be0: ff 00 incl (%eax)\r
+ 17be2: e9 95 fe ff ff jmp 17a7c <_usb_parse_configuration+0xf8>\r
+ 17be7: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 17bea: 89 45 dc mov %eax,0xffffffdc(%ebp)\r
+ 17bed: 8b 45 dc mov 0xffffffdc(%ebp),%eax\r
+ 17bf0: 8b 5d fc mov 0xfffffffc(%ebp),%ebx\r
+ 17bf3: c9 leave \r
+ 17bf4: c3 ret \r
+\r
+00017bf5 <_usb_destroy_configuration>:\r
+ 17bf5: 55 push %ebp\r
+ 17bf6: 89 e5 mov %esp,%ebp\r
+ 17bf8: 53 push %ebx\r
+ 17bf9: 83 ec 24 sub $0x24,%esp\r
+ 17bfc: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17bff: 83 b8 84 01 00 00 00 cmpl $0x0,0x184(%eax)\r
+ 17c06: 75 05 jne 17c0d <_usb_destroy_configuration+0x18>\r
+ 17c08: e9 06 02 00 00 jmp 17e13 <_usb_destroy_configuration+0x21e>\r
+ 17c0d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17c10: 83 b8 8c 01 00 00 00 cmpl $0x0,0x18c(%eax)\r
+ 17c17: 74 56 je 17c6f <_usb_destroy_configuration+0x7a>\r
+ 17c19: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 17c20: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17c23: 8a 80 81 01 00 00 mov 0x181(%eax),%al\r
+ 17c29: 25 ff 00 00 00 and $0xff,%eax\r
+ 17c2e: 3b 45 f4 cmp 0xfffffff4(%ebp),%eax\r
+ 17c31: 7e 28 jle 17c5b <_usb_destroy_configuration+0x66>\r
+ 17c33: 83 ec 0c sub $0xc,%esp\r
+ 17c36: 8b 4d 08 mov 0x8(%ebp),%ecx\r
+ 17c39: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 17c3c: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 17c43: 8b 81 8c 01 00 00 mov 0x18c(%ecx),%eax\r
+ 17c49: ff 34 02 pushl (%edx,%eax,1)\r
+ 17c4c: e8 ef 1d 00 00 call 19a40 <_ExFreePool@4>\r
+ 17c51: 83 c4 0c add $0xc,%esp\r
+ 17c54: 8d 45 f4 lea 0xfffffff4(%ebp),%eax\r
+ 17c57: ff 00 incl (%eax)\r
+ 17c59: eb c5 jmp 17c20 <_usb_destroy_configuration+0x2b>\r
+ 17c5b: 83 ec 0c sub $0xc,%esp\r
+ 17c5e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17c61: ff b0 8c 01 00 00 pushl 0x18c(%eax)\r
+ 17c67: e8 d4 1d 00 00 call 19a40 <_ExFreePool@4>\r
+ 17c6c: 83 c4 0c add $0xc,%esp\r
+ 17c6f: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 17c76: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17c79: 8a 80 81 01 00 00 mov 0x181(%eax),%al\r
+ 17c7f: 25 ff 00 00 00 and $0xff,%eax\r
+ 17c84: 3b 45 f8 cmp 0xfffffff8(%ebp),%eax\r
+ 17c87: 0f 8e 72 01 00 00 jle 17dff <_usb_destroy_configuration+0x20a>\r
+ 17c8d: 8b 4d 08 mov 0x8(%ebp),%ecx\r
+ 17c90: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 17c93: 89 d0 mov %edx,%eax\r
+ 17c95: 01 c0 add %eax,%eax\r
+ 17c97: 01 d0 add %edx,%eax\r
+ 17c99: c1 e0 03 shl $0x3,%eax\r
+ 17c9c: 03 81 84 01 00 00 add 0x184(%ecx),%eax\r
+ 17ca2: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 17ca5: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 17ca8: 83 78 0c 00 cmpl $0x0,0xc(%eax)\r
+ 17cac: 75 05 jne 17cb3 <_usb_destroy_configuration+0xbe>\r
+ 17cae: e9 4c 01 00 00 jmp 17dff <_usb_destroy_configuration+0x20a>\r
+ 17cb3: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 17cba: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 17cbd: 8a 40 04 mov 0x4(%eax),%al\r
+ 17cc0: 25 ff 00 00 00 and $0xff,%eax\r
+ 17cc5: 3b 45 f4 cmp 0xfffffff4(%ebp),%eax\r
+ 17cc8: 0f 8e 16 01 00 00 jle 17de4 <_usb_destroy_configuration+0x1ef>\r
+ 17cce: 8b 5d e8 mov 0xffffffe8(%ebp),%ebx\r
+ 17cd1: 8b 4d f4 mov 0xfffffff4(%ebp),%ecx\r
+ 17cd4: 89 c8 mov %ecx,%eax\r
+ 17cd6: c1 e0 02 shl $0x2,%eax\r
+ 17cd9: 01 c8 add %ecx,%eax\r
+ 17cdb: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 17ce2: 01 d0 add %edx,%eax\r
+ 17ce4: 01 c0 add %eax,%eax\r
+ 17ce6: 01 c8 add %ecx,%eax\r
+ 17ce8: c1 e0 02 shl $0x2,%eax\r
+ 17ceb: 03 43 0c add 0xc(%ebx),%eax\r
+ 17cee: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 17cf1: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 17cf4: 83 38 00 cmpl $0x0,(%eax)\r
+ 17cf7: 75 05 jne 17cfe <_usb_destroy_configuration+0x109>\r
+ 17cf9: e9 e6 00 00 00 jmp 17de4 <_usb_destroy_configuration+0x1ef>\r
+ 17cfe: c7 45 f0 00 00 00 00 movl $0x0,0xfffffff0(%ebp)\r
+ 17d05: 8b 55 e4 mov 0xffffffe4(%ebp),%edx\r
+ 17d08: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 17d0b: 3b 42 08 cmp 0x8(%edx),%eax\r
+ 17d0e: 0f 83 b6 00 00 00 jae 17dca <_usb_destroy_configuration+0x1d5>\r
+ 17d14: 8b 4d e4 mov 0xffffffe4(%ebp),%ecx\r
+ 17d17: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 17d1a: 89 d0 mov %edx,%eax\r
+ 17d1c: 01 c0 add %eax,%eax\r
+ 17d1e: 01 d0 add %edx,%eax\r
+ 17d20: c1 e0 03 shl $0x3,%eax\r
+ 17d23: 03 01 add (%ecx),%eax\r
+ 17d25: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 17d28: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 17d2b: 83 78 10 00 cmpl $0x0,0x10(%eax)\r
+ 17d2f: 74 11 je 17d42 <_usb_destroy_configuration+0x14d>\r
+ 17d31: 83 ec 0c sub $0xc,%esp\r
+ 17d34: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 17d37: ff 70 10 pushl 0x10(%eax)\r
+ 17d3a: e8 01 1d 00 00 call 19a40 <_ExFreePool@4>\r
+ 17d3f: 83 c4 0c add $0xc,%esp\r
+ 17d42: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 17d45: 83 78 0c 00 cmpl $0x0,0xc(%eax)\r
+ 17d49: 75 02 jne 17d4d <_usb_destroy_configuration+0x158>\r
+ 17d4b: eb 7d jmp 17dca <_usb_destroy_configuration+0x1d5>\r
+ 17d4d: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 17d54: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 17d57: 8a 40 04 mov 0x4(%eax),%al\r
+ 17d5a: 25 ff 00 00 00 and $0xff,%eax\r
+ 17d5f: 3b 45 ec cmp 0xffffffec(%ebp),%eax\r
+ 17d62: 7e 4b jle 17daf <_usb_destroy_configuration+0x1ba>\r
+ 17d64: 8b 4d e0 mov 0xffffffe0(%ebp),%ecx\r
+ 17d67: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 17d6a: 89 d0 mov %edx,%eax\r
+ 17d6c: c1 e0 02 shl $0x2,%eax\r
+ 17d6f: 01 d0 add %edx,%eax\r
+ 17d71: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 17d78: 8b 41 0c mov 0xc(%ecx),%eax\r
+ 17d7b: 83 7c 02 0c 00 cmpl $0x0,0xc(%edx,%eax,1)\r
+ 17d80: 74 26 je 17da8 <_usb_destroy_configuration+0x1b3>\r
+ 17d82: 83 ec 0c sub $0xc,%esp\r
+ 17d85: 8b 4d e0 mov 0xffffffe0(%ebp),%ecx\r
+ 17d88: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 17d8b: 89 d0 mov %edx,%eax\r
+ 17d8d: c1 e0 02 shl $0x2,%eax\r
+ 17d90: 01 d0 add %edx,%eax\r
+ 17d92: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 17d99: 8b 41 0c mov 0xc(%ecx),%eax\r
+ 17d9c: ff 74 02 0c pushl 0xc(%edx,%eax,1)\r
+ 17da0: e8 9b 1c 00 00 call 19a40 <_ExFreePool@4>\r
+ 17da5: 83 c4 0c add $0xc,%esp\r
+ 17da8: 8d 45 ec lea 0xffffffec(%ebp),%eax\r
+ 17dab: ff 00 incl (%eax)\r
+ 17dad: eb a5 jmp 17d54 <_usb_destroy_configuration+0x15f>\r
+ 17daf: 83 ec 0c sub $0xc,%esp\r
+ 17db2: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 17db5: ff 70 0c pushl 0xc(%eax)\r
+ 17db8: e8 83 1c 00 00 call 19a40 <_ExFreePool@4>\r
+ 17dbd: 83 c4 0c add $0xc,%esp\r
+ 17dc0: 8d 45 f0 lea 0xfffffff0(%ebp),%eax\r
+ 17dc3: ff 00 incl (%eax)\r
+ 17dc5: e9 3b ff ff ff jmp 17d05 <_usb_destroy_configuration+0x110>\r
+ 17dca: 83 ec 0c sub $0xc,%esp\r
+ 17dcd: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 17dd0: ff 30 pushl (%eax)\r
+ 17dd2: e8 69 1c 00 00 call 19a40 <_ExFreePool@4>\r
+ 17dd7: 83 c4 0c add $0xc,%esp\r
+ 17dda: 8d 45 f4 lea 0xfffffff4(%ebp),%eax\r
+ 17ddd: ff 00 incl (%eax)\r
+ 17ddf: e9 d6 fe ff ff jmp 17cba <_usb_destroy_configuration+0xc5>\r
+ 17de4: 83 ec 0c sub $0xc,%esp\r
+ 17de7: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 17dea: ff 70 0c pushl 0xc(%eax)\r
+ 17ded: e8 4e 1c 00 00 call 19a40 <_ExFreePool@4>\r
+ 17df2: 83 c4 0c add $0xc,%esp\r
+ 17df5: 8d 45 f8 lea 0xfffffff8(%ebp),%eax\r
+ 17df8: ff 00 incl (%eax)\r
+ 17dfa: e9 77 fe ff ff jmp 17c76 <_usb_destroy_configuration+0x81>\r
+ 17dff: 83 ec 0c sub $0xc,%esp\r
+ 17e02: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17e05: ff b0 84 01 00 00 pushl 0x184(%eax)\r
+ 17e0b: e8 30 1c 00 00 call 19a40 <_ExFreePool@4>\r
+ 17e10: 83 c4 0c add $0xc,%esp\r
+ 17e13: 8b 5d fc mov 0xfffffffc(%ebp),%ebx\r
+ 17e16: c9 leave \r
+ 17e17: c3 ret \r
+\r
+00017e18 <_usb_get_configuration>:\r
+ 17e18: 55 push %ebp\r
+ 17e19: 89 e5 mov %esp,%ebp\r
+ 17e1b: 53 push %ebx\r
+ 17e1c: 83 ec 24 sub $0x24,%esp\r
+ 17e1f: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17e22: 80 b8 81 01 00 00 08 cmpb $0x8,0x181(%eax)\r
+ 17e29: 76 0c jbe 17e37 <_usb_get_configuration+0x1f>\r
+ 17e2b: c7 45 e0 ea ff ff ff movl $0xffffffea,0xffffffe0(%ebp)\r
+ 17e32: e9 78 02 00 00 jmp 180af <_usb_get_configuration+0x297>\r
+ 17e37: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17e3a: 80 b8 81 01 00 00 00 cmpb $0x0,0x181(%eax)\r
+ 17e41: 75 0c jne 17e4f <_usb_get_configuration+0x37>\r
+ 17e43: c7 45 e0 ea ff ff ff movl $0xffffffea,0xffffffe0(%ebp)\r
+ 17e4a: e9 60 02 00 00 jmp 180af <_usb_get_configuration+0x297>\r
+ 17e4f: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 17e52: 83 ec 08 sub $0x8,%esp\r
+ 17e55: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17e58: ba 00 00 00 00 mov $0x0,%edx\r
+ 17e5d: 8a 90 81 01 00 00 mov 0x181(%eax),%dl\r
+ 17e63: 89 d0 mov %edx,%eax\r
+ 17e65: 01 c0 add %eax,%eax\r
+ 17e67: 01 d0 add %edx,%eax\r
+ 17e69: c1 e0 03 shl $0x3,%eax\r
+ 17e6c: 50 push %eax\r
+ 17e6d: 6a 01 push $0x1\r
+ 17e6f: e8 bc 1b 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 17e74: 83 c4 08 add $0x8,%esp\r
+ 17e77: 89 83 84 01 00 00 mov %eax,0x184(%ebx)\r
+ 17e7d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17e80: 83 b8 84 01 00 00 00 cmpl $0x0,0x184(%eax)\r
+ 17e87: 75 0c jne 17e95 <_usb_get_configuration+0x7d>\r
+ 17e89: c7 45 e0 f4 ff ff ff movl $0xfffffff4,0xffffffe0(%ebp)\r
+ 17e90: e9 1a 02 00 00 jmp 180af <_usb_get_configuration+0x297>\r
+ 17e95: 83 ec 04 sub $0x4,%esp\r
+ 17e98: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17e9b: ba 00 00 00 00 mov $0x0,%edx\r
+ 17ea0: 8a 90 81 01 00 00 mov 0x181(%eax),%dl\r
+ 17ea6: 89 d0 mov %edx,%eax\r
+ 17ea8: 01 c0 add %eax,%eax\r
+ 17eaa: 01 d0 add %edx,%eax\r
+ 17eac: c1 e0 03 shl $0x3,%eax\r
+ 17eaf: 50 push %eax\r
+ 17eb0: 6a 00 push $0x0\r
+ 17eb2: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17eb5: ff b0 84 01 00 00 pushl 0x184(%eax)\r
+ 17ebb: e8 90 1b 00 00 call 19a50 <_memset>\r
+ 17ec0: 83 c4 10 add $0x10,%esp\r
+ 17ec3: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 17ec6: 83 ec 08 sub $0x8,%esp\r
+ 17ec9: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17ecc: 8a 80 81 01 00 00 mov 0x181(%eax),%al\r
+ 17ed2: 25 ff 00 00 00 and $0xff,%eax\r
+ 17ed7: c1 e0 02 shl $0x2,%eax\r
+ 17eda: 50 push %eax\r
+ 17edb: 6a 01 push $0x1\r
+ 17edd: e8 4e 1b 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 17ee2: 83 c4 08 add $0x8,%esp\r
+ 17ee5: 89 83 8c 01 00 00 mov %eax,0x18c(%ebx)\r
+ 17eeb: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17eee: 83 b8 8c 01 00 00 00 cmpl $0x0,0x18c(%eax)\r
+ 17ef5: 75 0c jne 17f03 <_usb_get_configuration+0xeb>\r
+ 17ef7: c7 45 e0 f4 ff ff ff movl $0xfffffff4,0xffffffe0(%ebp)\r
+ 17efe: e9 ac 01 00 00 jmp 180af <_usb_get_configuration+0x297>\r
+ 17f03: 83 ec 08 sub $0x8,%esp\r
+ 17f06: 6a 08 push $0x8\r
+ 17f08: 6a 01 push $0x1\r
+ 17f0a: e8 21 1b 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 17f0f: 83 c4 08 add $0x8,%esp\r
+ 17f12: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 17f15: 83 7d ec 00 cmpl $0x0,0xffffffec(%ebp)\r
+ 17f19: 75 0c jne 17f27 <_usb_get_configuration+0x10f>\r
+ 17f1b: c7 45 e0 f4 ff ff ff movl $0xfffffff4,0xffffffe0(%ebp)\r
+ 17f22: e9 88 01 00 00 jmp 180af <_usb_get_configuration+0x297>\r
+ 17f27: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 17f2a: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 17f2d: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 17f34: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 17f37: 8a 80 81 01 00 00 mov 0x181(%eax),%al\r
+ 17f3d: 25 ff 00 00 00 and $0xff,%eax\r
+ 17f42: 3b 45 f4 cmp 0xfffffff4(%ebp),%eax\r
+ 17f45: 0f 86 2d 01 00 00 jbe 18078 <_usb_get_configuration+0x260>\r
+ 17f4b: 83 ec 0c sub $0xc,%esp\r
+ 17f4e: 6a 08 push $0x8\r
+ 17f50: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 17f53: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 17f56: 25 ff 00 00 00 and $0xff,%eax\r
+ 17f5b: 50 push %eax\r
+ 17f5c: 6a 02 push $0x2\r
+ 17f5e: ff 75 08 pushl 0x8(%ebp)\r
+ 17f61: e8 f6 93 ff ff call 1135c <_usb_get_descriptor>\r
+ 17f66: 83 c4 20 add $0x20,%esp\r
+ 17f69: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 17f6c: 83 7d f8 07 cmpl $0x7,0xfffffff8(%ebp)\r
+ 17f70: 7f 17 jg 17f89 <_usb_get_configuration+0x171>\r
+ 17f72: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 17f76: 79 05 jns 17f7d <_usb_get_configuration+0x165>\r
+ 17f78: e9 12 01 00 00 jmp 1808f <_usb_get_configuration+0x277>\r
+ 17f7d: c7 45 f8 ea ff ff ff movl $0xffffffea,0xfffffff8(%ebp)\r
+ 17f84: e9 06 01 00 00 jmp 1808f <_usb_get_configuration+0x277>\r
+ 17f89: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 17f8c: 66 8b 40 02 mov 0x2(%eax),%ax\r
+ 17f90: 25 ff ff 00 00 and $0xffff,%eax\r
+ 17f95: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 17f98: 83 ec 08 sub $0x8,%esp\r
+ 17f9b: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 17f9e: 6a 01 push $0x1\r
+ 17fa0: e8 8b 1a 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 17fa5: 83 c4 08 add $0x8,%esp\r
+ 17fa8: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 17fab: 83 7d e8 00 cmpl $0x0,0xffffffe8(%ebp)\r
+ 17faf: 75 0c jne 17fbd <_usb_get_configuration+0x1a5>\r
+ 17fb1: c7 45 f8 f4 ff ff ff movl $0xfffffff4,0xfffffff8(%ebp)\r
+ 17fb8: e9 d2 00 00 00 jmp 1808f <_usb_get_configuration+0x277>\r
+ 17fbd: 83 ec 0c sub $0xc,%esp\r
+ 17fc0: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 17fc3: ff 75 e8 pushl 0xffffffe8(%ebp)\r
+ 17fc6: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 17fc9: 25 ff 00 00 00 and $0xff,%eax\r
+ 17fce: 50 push %eax\r
+ 17fcf: 6a 02 push $0x2\r
+ 17fd1: ff 75 08 pushl 0x8(%ebp)\r
+ 17fd4: e8 83 93 ff ff call 1135c <_usb_get_descriptor>\r
+ 17fd9: 83 c4 20 add $0x20,%esp\r
+ 17fdc: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 17fdf: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 17fe3: 79 13 jns 17ff8 <_usb_get_configuration+0x1e0>\r
+ 17fe5: 83 ec 0c sub $0xc,%esp\r
+ 17fe8: ff 75 e8 pushl 0xffffffe8(%ebp)\r
+ 17feb: e8 50 1a 00 00 call 19a40 <_ExFreePool@4>\r
+ 17ff0: 83 c4 0c add $0xc,%esp\r
+ 17ff3: e9 97 00 00 00 jmp 1808f <_usb_get_configuration+0x277>\r
+ 17ff8: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 17ffb: 3b 45 f0 cmp 0xfffffff0(%ebp),%eax\r
+ 17ffe: 73 17 jae 18017 <_usb_get_configuration+0x1ff>\r
+ 18000: c7 45 f8 ea ff ff ff movl $0xffffffea,0xfffffff8(%ebp)\r
+ 18007: 83 ec 0c sub $0xc,%esp\r
+ 1800a: ff 75 e8 pushl 0xffffffe8(%ebp)\r
+ 1800d: e8 2e 1a 00 00 call 19a40 <_ExFreePool@4>\r
+ 18012: 83 c4 0c add $0xc,%esp\r
+ 18015: eb 78 jmp 1808f <_usb_get_configuration+0x277>\r
+ 18017: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 1801a: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 1801d: 8d 0c 85 00 00 00 00 lea 0x0(,%eax,4),%ecx\r
+ 18024: 8b 92 8c 01 00 00 mov 0x18c(%edx),%edx\r
+ 1802a: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 1802d: 89 04 11 mov %eax,(%ecx,%edx,1)\r
+ 18030: 83 ec 08 sub $0x8,%esp\r
+ 18033: ff 75 e8 pushl 0xffffffe8(%ebp)\r
+ 18036: 8b 4d 08 mov 0x8(%ebp),%ecx\r
+ 18039: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 1803c: 89 d0 mov %edx,%eax\r
+ 1803e: 01 c0 add %eax,%eax\r
+ 18040: 01 d0 add %edx,%eax\r
+ 18042: c1 e0 03 shl $0x3,%eax\r
+ 18045: 03 81 84 01 00 00 add 0x184(%ecx),%eax\r
+ 1804b: 50 push %eax\r
+ 1804c: e8 33 f9 ff ff call 17984 <_usb_parse_configuration>\r
+ 18051: 83 c4 10 add $0x10,%esp\r
+ 18054: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 18057: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 1805b: 7e 02 jle 1805f <_usb_get_configuration+0x247>\r
+ 1805d: eb 0f jmp 1806e <_usb_get_configuration+0x256>\r
+ 1805f: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 18063: 79 09 jns 1806e <_usb_get_configuration+0x256>\r
+ 18065: c7 45 f8 ea ff ff ff movl $0xffffffea,0xfffffff8(%ebp)\r
+ 1806c: eb 21 jmp 1808f <_usb_get_configuration+0x277>\r
+ 1806e: 8d 45 f4 lea 0xfffffff4(%ebp),%eax\r
+ 18071: ff 00 incl (%eax)\r
+ 18073: e9 bc fe ff ff jmp 17f34 <_usb_get_configuration+0x11c>\r
+ 18078: 83 ec 0c sub $0xc,%esp\r
+ 1807b: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 1807e: e8 bd 19 00 00 call 19a40 <_ExFreePool@4>\r
+ 18083: 83 c4 0c add $0xc,%esp\r
+ 18086: c7 45 e0 00 00 00 00 movl $0x0,0xffffffe0(%ebp)\r
+ 1808d: eb 20 jmp 180af <_usb_get_configuration+0x297>\r
+ 1808f: 83 ec 0c sub $0xc,%esp\r
+ 18092: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 18095: e8 a6 19 00 00 call 19a40 <_ExFreePool@4>\r
+ 1809a: 83 c4 0c add $0xc,%esp\r
+ 1809d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 180a0: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 180a3: 88 90 81 01 00 00 mov %dl,0x181(%eax)\r
+ 180a9: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 180ac: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 180af: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 180b2: 8b 5d fc mov 0xfffffffc(%ebp),%ebx\r
+ 180b5: c9 leave \r
+ 180b6: c3 ret \r
+ 180b7: 90 nop \r
+ 180b8: 90 nop \r
+ 180b9: 90 nop \r
+ 180ba: 90 nop \r
+ 180bb: 90 nop \r
+ 180bc: 90 nop \r
+ 180bd: 90 nop \r
+ 180be: 90 nop \r
+ 180bf: 90 nop \r
+\r
+000180c0 <_usb_init_urb@4>:\r
+ 180c0: 55 push %ebp\r
+ 180c1: 89 e5 mov %esp,%ebp\r
+ 180c3: 83 ec 08 sub $0x8,%esp\r
+ 180c6: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 180ca: 74 1c je 180e8 <_usb_init_urb@4+0x28>\r
+ 180cc: 83 ec 04 sub $0x4,%esp\r
+ 180cf: 6a 5c push $0x5c\r
+ 180d1: 6a 00 push $0x0\r
+ 180d3: ff 75 08 pushl 0x8(%ebp)\r
+ 180d6: e8 75 19 00 00 call 19a50 <_memset>\r
+ 180db: 83 c4 10 add $0x10,%esp\r
+ 180de: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 180e1: c7 40 04 01 00 00 00 movl $0x1,0x4(%eax)\r
+ 180e8: c9 leave \r
+ 180e9: c2 04 00 ret $0x4\r
+\r
+000180ec <_usb_alloc_urb@8>:\r
+ 180ec: 55 push %ebp\r
+ 180ed: 89 e5 mov %esp,%ebp\r
+ 180ef: 83 ec 08 sub $0x8,%esp\r
+ 180f2: 83 ec 08 sub $0x8,%esp\r
+ 180f5: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 180f8: c1 e0 04 shl $0x4,%eax\r
+ 180fb: 83 c0 5c add $0x5c,%eax\r
+ 180fe: 50 push %eax\r
+ 180ff: 6a 01 push $0x1\r
+ 18101: e8 2a 19 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 18106: 83 c4 08 add $0x8,%esp\r
+ 18109: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 1810c: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 18110: 75 09 jne 1811b <_usb_alloc_urb@8+0x2f>\r
+ 18112: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 18119: eb 14 jmp 1812f <_usb_alloc_urb@8+0x43>\r
+ 1811b: 83 ec 0c sub $0xc,%esp\r
+ 1811e: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 18121: e8 9a ff ff ff call 180c0 <_usb_init_urb@4>\r
+ 18126: 83 c4 0c add $0xc,%esp\r
+ 18129: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1812c: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 1812f: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 18132: c9 leave \r
+ 18133: c2 08 00 ret $0x8\r
+\r
+00018136 <_usb_free_urb@4>:\r
+ 18136: 55 push %ebp\r
+ 18137: 89 e5 mov %esp,%ebp\r
+ 18139: 83 ec 08 sub $0x8,%esp\r
+ 1813c: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 18140: 74 2a je 1816c <_usb_free_urb@4+0x36>\r
+ 18142: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 18145: 83 c2 04 add $0x4,%edx\r
+ 18148: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1814b: 83 c0 04 add $0x4,%eax\r
+ 1814e: 8b 00 mov (%eax),%eax\r
+ 18150: 48 dec %eax\r
+ 18151: 89 02 mov %eax,(%edx)\r
+ 18153: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18156: 83 c0 04 add $0x4,%eax\r
+ 18159: 83 38 00 cmpl $0x0,(%eax)\r
+ 1815c: 75 0e jne 1816c <_usb_free_urb@4+0x36>\r
+ 1815e: 83 ec 0c sub $0xc,%esp\r
+ 18161: ff 75 08 pushl 0x8(%ebp)\r
+ 18164: e8 d7 18 00 00 call 19a40 <_ExFreePool@4>\r
+ 18169: 83 c4 0c add $0xc,%esp\r
+ 1816c: c9 leave \r
+ 1816d: c2 04 00 ret $0x4\r
+\r
+00018170 <_usb_get_urb@4>:\r
+ 18170: 55 push %ebp\r
+ 18171: 89 e5 mov %esp,%ebp\r
+ 18173: 83 ec 04 sub $0x4,%esp\r
+ 18176: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 1817a: 74 19 je 18195 <_usb_get_urb@4+0x25>\r
+ 1817c: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 1817f: 83 c2 04 add $0x4,%edx\r
+ 18182: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18185: 83 c0 04 add $0x4,%eax\r
+ 18188: 8b 00 mov (%eax),%eax\r
+ 1818a: 40 inc %eax\r
+ 1818b: 89 02 mov %eax,(%edx)\r
+ 1818d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18190: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 18193: eb 07 jmp 1819c <_usb_get_urb@4+0x2c>\r
+ 18195: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 1819c: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1819f: c9 leave \r
+ 181a0: c2 04 00 ret $0x4\r
+\r
+000181a3 <_usb_submit_urb@8>:\r
+ 181a3: 55 push %ebp\r
+ 181a4: 89 e5 mov %esp,%ebp\r
+ 181a6: 53 push %ebx\r
+ 181a7: 83 ec 34 sub $0x34,%esp\r
+ 181aa: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 181ae: 74 12 je 181c2 <_usb_submit_urb@8+0x1f>\r
+ 181b0: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 181b3: 83 78 08 00 cmpl $0x0,0x8(%eax)\r
+ 181b7: 75 09 jne 181c2 <_usb_submit_urb@8+0x1f>\r
+ 181b9: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 181bc: 83 78 58 00 cmpl $0x0,0x58(%eax)\r
+ 181c0: 75 0c jne 181ce <_usb_submit_urb@8+0x2b>\r
+ 181c2: c7 45 d4 ea ff ff ff movl $0xffffffea,0xffffffd4(%ebp)\r
+ 181c9: e9 e2 02 00 00 jmp 184b0 <_usb_submit_urb@8+0x30d>\r
+ 181ce: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 181d1: 8b 40 14 mov 0x14(%eax),%eax\r
+ 181d4: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 181d7: 85 c0 test %eax,%eax\r
+ 181d9: 74 1f je 181fa <_usb_submit_urb@8+0x57>\r
+ 181db: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 181de: 83 78 14 02 cmpl $0x2,0x14(%eax)\r
+ 181e2: 76 16 jbe 181fa <_usb_submit_urb@8+0x57>\r
+ 181e4: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 181e7: 83 b8 bc 00 00 00 00 cmpl $0x0,0xbc(%eax)\r
+ 181ee: 74 0a je 181fa <_usb_submit_urb@8+0x57>\r
+ 181f0: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 181f3: 83 38 00 cmpl $0x0,(%eax)\r
+ 181f6: 7e 02 jle 181fa <_usb_submit_urb@8+0x57>\r
+ 181f8: eb 0c jmp 18206 <_usb_submit_urb@8+0x63>\r
+ 181fa: c7 45 d4 ed ff ff ff movl $0xffffffed,0xffffffd4(%ebp)\r
+ 18201: e9 aa 02 00 00 jmp 184b0 <_usb_submit_urb@8+0x30d>\r
+ 18206: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 18209: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 1820f: 8b 40 20 mov 0x20(%eax),%eax\r
+ 18212: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 18215: 85 c0 test %eax,%eax\r
+ 18217: 74 09 je 18222 <_usb_submit_urb@8+0x7f>\r
+ 18219: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 1821c: 83 78 0c 00 cmpl $0x0,0xc(%eax)\r
+ 18220: 75 0c jne 1822e <_usb_submit_urb@8+0x8b>\r
+ 18222: c7 45 d4 ed ff ff ff movl $0xffffffed,0xffffffd4(%ebp)\r
+ 18229: e9 82 02 00 00 jmp 184b0 <_usb_submit_urb@8+0x30d>\r
+ 1822e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18231: c7 40 1c 8d ff ff ff movl $0xffffff8d,0x1c(%eax)\r
+ 18238: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1823b: c7 40 30 00 00 00 00 movl $0x0,0x30(%eax)\r
+ 18242: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18245: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)\r
+ 1824c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1824f: 8b 40 18 mov 0x18(%eax),%eax\r
+ 18252: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 18255: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 18258: c1 f8 1e sar $0x1e,%eax\r
+ 1825b: 83 e0 03 and $0x3,%eax\r
+ 1825e: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 18261: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 18264: c1 e8 07 shr $0x7,%eax\r
+ 18267: 83 f0 01 xor $0x1,%eax\r
+ 1826a: 83 e0 01 and $0x1,%eax\r
+ 1826d: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 18270: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 18273: c1 f8 1e sar $0x1e,%eax\r
+ 18276: 83 e0 03 and $0x3,%eax\r
+ 18279: 83 f8 02 cmp $0x2,%eax\r
+ 1827c: 74 15 je 18293 <_usb_submit_urb@8+0xf0>\r
+ 1827e: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 18281: 83 78 14 04 cmpl $0x4,0x14(%eax)\r
+ 18285: 77 0c ja 18293 <_usb_submit_urb@8+0xf0>\r
+ 18287: c7 45 d4 ed ff ff ff movl $0xffffffed,0xffffffd4(%ebp)\r
+ 1828e: e9 1d 02 00 00 jmp 184b0 <_usb_submit_urb@8+0x30d>\r
+ 18293: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 18296: 8b 5d e4 mov 0xffffffe4(%ebp),%ebx\r
+ 18299: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1829c: c1 f8 0f sar $0xf,%eax\r
+ 1829f: 89 c1 mov %eax,%ecx\r
+ 182a1: 83 e1 0f and $0xf,%ecx\r
+ 182a4: b8 01 00 00 00 mov $0x1,%eax\r
+ 182a9: d3 e0 shl %cl,%eax\r
+ 182ab: 23 44 9a 30 and 0x30(%edx,%ebx,4),%eax\r
+ 182af: 85 c0 test %eax,%eax\r
+ 182b1: 74 0c je 182bf <_usb_submit_urb@8+0x11c>\r
+ 182b3: c7 45 d4 e0 ff ff ff movl $0xffffffe0,0xffffffd4(%ebp)\r
+ 182ba: e9 f1 01 00 00 jmp 184b0 <_usb_submit_urb@8+0x30d>\r
+ 182bf: 83 7d e4 00 cmpl $0x0,0xffffffe4(%ebp)\r
+ 182c3: 74 15 je 182da <_usb_submit_urb@8+0x137>\r
+ 182c5: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 182c8: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 182cb: c1 f8 0f sar $0xf,%eax\r
+ 182ce: 83 e0 0f and $0xf,%eax\r
+ 182d1: 8b 44 82 78 mov 0x78(%edx,%eax,4),%eax\r
+ 182d5: 89 45 d0 mov %eax,0xffffffd0(%ebp)\r
+ 182d8: eb 13 jmp 182ed <_usb_submit_urb@8+0x14a>\r
+ 182da: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 182dd: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 182e0: c1 f8 0f sar $0xf,%eax\r
+ 182e3: 83 e0 0f and $0xf,%eax\r
+ 182e6: 8b 44 82 38 mov 0x38(%edx,%eax,4),%eax\r
+ 182ea: 89 45 d0 mov %eax,0xffffffd0(%ebp)\r
+ 182ed: 8b 45 d0 mov 0xffffffd0(%ebp),%eax\r
+ 182f0: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 182f3: 83 7d f0 00 cmpl $0x0,0xfffffff0(%ebp)\r
+ 182f7: 7f 0c jg 18305 <_usb_submit_urb@8+0x162>\r
+ 182f9: c7 45 d4 a6 ff ff ff movl $0xffffffa6,0xffffffd4(%ebp)\r
+ 18300: e9 ab 01 00 00 jmp 184b0 <_usb_submit_urb@8+0x30d>\r
+ 18305: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 18309: 0f 85 ae 00 00 00 jne 183bd <_usb_submit_urb@8+0x21a>\r
+ 1830f: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 18312: 83 78 18 03 cmpl $0x3,0x18(%eax)\r
+ 18316: 75 20 jne 18338 <_usb_submit_urb@8+0x195>\r
+ 18318: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 1831b: c1 f8 0b sar $0xb,%eax\r
+ 1831e: 83 e0 03 and $0x3,%eax\r
+ 18321: 40 inc %eax\r
+ 18322: 89 45 d8 mov %eax,0xffffffd8(%ebp)\r
+ 18325: 8d 45 f0 lea 0xfffffff0(%ebp),%eax\r
+ 18328: 81 20 ff 03 00 00 andl $0x3ff,(%eax)\r
+ 1832e: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 18331: 0f af 45 d8 imul 0xffffffd8(%ebp),%eax\r
+ 18335: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 18338: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1833b: 83 78 44 00 cmpl $0x0,0x44(%eax)\r
+ 1833f: 7f 0c jg 1834d <_usb_submit_urb@8+0x1aa>\r
+ 18341: c7 45 d4 ea ff ff ff movl $0xffffffea,0xffffffd4(%ebp)\r
+ 18348: e9 63 01 00 00 jmp 184b0 <_usb_submit_urb@8+0x30d>\r
+ 1834d: c7 45 e0 00 00 00 00 movl $0x0,0xffffffe0(%ebp)\r
+ 18354: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18357: 8b 40 44 mov 0x44(%eax),%eax\r
+ 1835a: 3b 45 e0 cmp 0xffffffe0(%ebp),%eax\r
+ 1835d: 7e 5e jle 183bd <_usb_submit_urb@8+0x21a>\r
+ 1835f: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 18362: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 18365: c1 e0 04 shl $0x4,%eax\r
+ 18368: 01 d0 add %edx,%eax\r
+ 1836a: 83 c0 60 add $0x60,%eax\r
+ 1836d: 8b 00 mov (%eax),%eax\r
+ 1836f: 89 45 dc mov %eax,0xffffffdc(%ebp)\r
+ 18372: 83 7d dc 00 cmpl $0x0,0xffffffdc(%ebp)\r
+ 18376: 78 0a js 18382 <_usb_submit_urb@8+0x1df>\r
+ 18378: 8b 45 dc mov 0xffffffdc(%ebp),%eax\r
+ 1837b: 3b 45 f0 cmp 0xfffffff0(%ebp),%eax\r
+ 1837e: 7f 02 jg 18382 <_usb_submit_urb@8+0x1df>\r
+ 18380: eb 0c jmp 1838e <_usb_submit_urb@8+0x1eb>\r
+ 18382: c7 45 d4 a6 ff ff ff movl $0xffffffa6,0xffffffd4(%ebp)\r
+ 18389: e9 22 01 00 00 jmp 184b0 <_usb_submit_urb@8+0x30d>\r
+ 1838e: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 18391: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 18394: c1 e0 04 shl $0x4,%eax\r
+ 18397: 01 d0 add %edx,%eax\r
+ 18399: 83 c0 68 add $0x68,%eax\r
+ 1839c: c7 00 ee ff ff ff movl $0xffffffee,(%eax)\r
+ 183a2: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 183a5: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 183a8: c1 e0 04 shl $0x4,%eax\r
+ 183ab: 01 d0 add %edx,%eax\r
+ 183ad: 83 c0 64 add $0x64,%eax\r
+ 183b0: c7 00 00 00 00 00 movl $0x0,(%eax)\r
+ 183b6: 8d 45 e0 lea 0xffffffe0(%ebp),%eax\r
+ 183b9: ff 00 incl (%eax)\r
+ 183bb: eb 97 jmp 18354 <_usb_submit_urb@8+0x1b1>\r
+ 183bd: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 183c0: 83 78 2c 00 cmpl $0x0,0x2c(%eax)\r
+ 183c4: 79 0c jns 183d2 <_usb_submit_urb@8+0x22f>\r
+ 183c6: c7 45 d4 a6 ff ff ff movl $0xffffffa6,0xffffffd4(%ebp)\r
+ 183cd: e9 de 00 00 00 jmp 184b0 <_usb_submit_urb@8+0x30d>\r
+ 183d2: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 183d5: 83 c0 00 add $0x0,%eax\r
+ 183d8: 83 f8 01 cmp $0x1,%eax\r
+ 183db: 0f 87 b8 00 00 00 ja 18499 <_usb_submit_urb@8+0x2f6>\r
+ 183e1: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 183e4: 83 78 48 00 cmpl $0x0,0x48(%eax)\r
+ 183e8: 7f 0c jg 183f6 <_usb_submit_urb@8+0x253>\r
+ 183ea: c7 45 d4 ea ff ff ff movl $0xffffffea,0xffffffd4(%ebp)\r
+ 183f1: e9 ba 00 00 00 jmp 184b0 <_usb_submit_urb@8+0x30d>\r
+ 183f6: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 183f9: 8b 40 18 mov 0x18(%eax),%eax\r
+ 183fc: 89 45 cc mov %eax,0xffffffcc(%ebp)\r
+ 183ff: 83 7d cc 01 cmpl $0x1,0xffffffcc(%ebp)\r
+ 18403: 72 70 jb 18475 <_usb_submit_urb@8+0x2d2>\r
+ 18405: 83 7d cc 02 cmpl $0x2,0xffffffcc(%ebp)\r
+ 18409: 76 27 jbe 18432 <_usb_submit_urb@8+0x28f>\r
+ 1840b: 83 7d cc 03 cmpl $0x3,0xffffffcc(%ebp)\r
+ 1840f: 74 02 je 18413 <_usb_submit_urb@8+0x270>\r
+ 18411: eb 62 jmp 18475 <_usb_submit_urb@8+0x2d2>\r
+ 18413: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18416: 81 78 48 00 20 00 00 cmpl $0x2000,0x48(%eax)\r
+ 1841d: 7e 0a jle 18429 <_usb_submit_urb@8+0x286>\r
+ 1841f: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18422: c7 40 48 00 20 00 00 movl $0x2000,0x48(%eax)\r
+ 18429: c7 45 f4 00 20 00 00 movl $0x2000,0xfffffff4(%ebp)\r
+ 18430: eb 4c jmp 1847e <_usb_submit_urb@8+0x2db>\r
+ 18432: 83 7d f4 01 cmpl $0x1,0xfffffff4(%ebp)\r
+ 18436: 75 1e jne 18456 <_usb_submit_urb@8+0x2b3>\r
+ 18438: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1843b: 81 78 48 ff 00 00 00 cmpl $0xff,0x48(%eax)\r
+ 18442: 7e 09 jle 1844d <_usb_submit_urb@8+0x2aa>\r
+ 18444: c7 45 d4 ea ff ff ff movl $0xffffffea,0xffffffd4(%ebp)\r
+ 1844b: eb 63 jmp 184b0 <_usb_submit_urb@8+0x30d>\r
+ 1844d: c7 45 f4 80 00 00 00 movl $0x80,0xfffffff4(%ebp)\r
+ 18454: eb 28 jmp 1847e <_usb_submit_urb@8+0x2db>\r
+ 18456: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18459: 81 78 48 00 04 00 00 cmpl $0x400,0x48(%eax)\r
+ 18460: 7e 0a jle 1846c <_usb_submit_urb@8+0x2c9>\r
+ 18462: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18465: c7 40 48 00 04 00 00 movl $0x400,0x48(%eax)\r
+ 1846c: c7 45 f4 00 04 00 00 movl $0x400,0xfffffff4(%ebp)\r
+ 18473: eb 09 jmp 1847e <_usb_submit_urb@8+0x2db>\r
+ 18475: c7 45 d4 ea ff ff ff movl $0xffffffea,0xffffffd4(%ebp)\r
+ 1847c: eb 32 jmp 184b0 <_usb_submit_urb@8+0x30d>\r
+ 1847e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18481: 8b 40 48 mov 0x48(%eax),%eax\r
+ 18484: 3b 45 f4 cmp 0xfffffff4(%ebp),%eax\r
+ 18487: 7d 07 jge 18490 <_usb_submit_urb@8+0x2ed>\r
+ 18489: 8d 45 f4 lea 0xfffffff4(%ebp),%eax\r
+ 1848c: d1 38 sarl (%eax)\r
+ 1848e: eb ee jmp 1847e <_usb_submit_urb@8+0x2db>\r
+ 18490: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 18493: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 18496: 89 42 48 mov %eax,0x48(%edx)\r
+ 18499: 83 ec 08 sub $0x8,%esp\r
+ 1849c: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 1849f: ff 75 0c pushl 0xc(%ebp)\r
+ 184a2: ff 75 08 pushl 0x8(%ebp)\r
+ 184a5: 8b 40 0c mov 0xc(%eax),%eax\r
+ 184a8: ff d0 call *%eax\r
+ 184aa: 83 c4 10 add $0x10,%esp\r
+ 184ad: 89 45 d4 mov %eax,0xffffffd4(%ebp)\r
+ 184b0: 8b 45 d4 mov 0xffffffd4(%ebp),%eax\r
+ 184b3: 8b 5d fc mov 0xfffffffc(%ebp),%ebx\r
+ 184b6: c9 leave \r
+ 184b7: c2 08 00 ret $0x8\r
+\r
+000184ba <_usb_unlink_urb@4>:\r
+ 184ba: 55 push %ebp\r
+ 184bb: 89 e5 mov %esp,%ebp\r
+ 184bd: 83 ec 08 sub $0x8,%esp\r
+ 184c0: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 184c4: 74 4c je 18512 <_usb_unlink_urb@4+0x58>\r
+ 184c6: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 184c9: 83 78 14 00 cmpl $0x0,0x14(%eax)\r
+ 184cd: 74 43 je 18512 <_usb_unlink_urb@4+0x58>\r
+ 184cf: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 184d2: 8b 40 14 mov 0x14(%eax),%eax\r
+ 184d5: 83 b8 bc 00 00 00 00 cmpl $0x0,0xbc(%eax)\r
+ 184dc: 74 34 je 18512 <_usb_unlink_urb@4+0x58>\r
+ 184de: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 184e1: 8b 40 14 mov 0x14(%eax),%eax\r
+ 184e4: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 184ea: 83 78 20 00 cmpl $0x0,0x20(%eax)\r
+ 184ee: 74 22 je 18512 <_usb_unlink_urb@4+0x58>\r
+ 184f0: 83 ec 0c sub $0xc,%esp\r
+ 184f3: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 184f6: 8b 40 14 mov 0x14(%eax),%eax\r
+ 184f9: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax\r
+ 184ff: 8b 40 20 mov 0x20(%eax),%eax\r
+ 18502: ff 75 08 pushl 0x8(%ebp)\r
+ 18505: 8b 40 10 mov 0x10(%eax),%eax\r
+ 18508: ff d0 call *%eax\r
+ 1850a: 83 c4 10 add $0x10,%esp\r
+ 1850d: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 18510: eb 07 jmp 18519 <_usb_unlink_urb@4+0x5f>\r
+ 18512: c7 45 fc ed ff ff ff movl $0xffffffed,0xfffffffc(%ebp)\r
+ 18519: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1851c: c9 leave \r
+ 1851d: c2 04 00 ret $0x4\r
+\r
+00018520 <_hcd_buffer_create>:\r
+ 18520: 55 push %ebp\r
+ 18521: 89 e5 mov %esp,%ebp\r
+ 18523: b8 00 00 00 00 mov $0x0,%eax\r
+ 18528: 5d pop %ebp\r
+ 18529: c3 ret \r
+\r
+0001852a <_hcd_buffer_destroy>:\r
+ 1852a: 55 push %ebp\r
+ 1852b: 89 e5 mov %esp,%ebp\r
+ 1852d: 5d pop %ebp\r
+ 1852e: c3 ret \r
+\r
+0001852f <_hcd_buffer_alloc>:\r
+ 1852f: 55 push %ebp\r
+ 18530: 89 e5 mov %esp,%ebp\r
+ 18532: 83 ec 08 sub $0x8,%esp\r
+ 18535: 83 ec 08 sub $0x8,%esp\r
+ 18538: ff 75 0c pushl 0xc(%ebp)\r
+ 1853b: 6a 01 push $0x1\r
+ 1853d: e8 ee 14 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 18542: 83 c4 08 add $0x8,%esp\r
+ 18545: c9 leave \r
+ 18546: c3 ret \r
+\r
+00018547 <_hcd_buffer_free>:\r
+ 18547: 55 push %ebp\r
+ 18548: 89 e5 mov %esp,%ebp\r
+ 1854a: 83 ec 08 sub $0x8,%esp\r
+ 1854d: 83 ec 0c sub $0xc,%esp\r
+ 18550: ff 75 10 pushl 0x10(%ebp)\r
+ 18553: e8 e8 14 00 00 call 19a40 <_ExFreePool@4>\r
+ 18558: 83 c4 0c add $0xc,%esp\r
+ 1855b: c9 leave \r
+ 1855c: c3 ret \r
+ 1855d: 90 nop \r
+ 1855e: 90 nop \r
+ 1855f: 90 nop \r
+\r
+00018560 <_usb_show_endpoint>:\r
+ 18560: 55 push %ebp\r
+ 18561: 89 e5 mov %esp,%ebp\r
+ 18563: 83 ec 08 sub $0x8,%esp\r
+ 18566: 83 ec 0c sub $0xc,%esp\r
+ 18569: ff 75 08 pushl 0x8(%ebp)\r
+ 1856c: e8 86 09 00 00 call 18ef7 <_usb_show_endpoint_descriptor>\r
+ 18571: 83 c4 10 add $0x10,%esp\r
+ 18574: c9 leave \r
+ 18575: c3 ret \r
+\r
+00018576 <_usb_show_interface>:\r
+ 18576: 55 push %ebp\r
+ 18577: 89 e5 mov %esp,%ebp\r
+ 18579: 83 ec 08 sub $0x8,%esp\r
+ 1857c: 83 ec 0c sub $0xc,%esp\r
+ 1857f: ff 75 08 pushl 0x8(%ebp)\r
+ 18582: e8 89 07 00 00 call 18d10 <_usb_show_interface_descriptor>\r
+ 18587: 83 c4 10 add $0x10,%esp\r
+ 1858a: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 18591: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18594: 8a 40 04 mov 0x4(%eax),%al\r
+ 18597: 25 ff 00 00 00 and $0xff,%eax\r
+ 1859c: 3b 45 fc cmp 0xfffffffc(%ebp),%eax\r
+ 1859f: 7e 26 jle 185c7 <_usb_show_interface+0x51>\r
+ 185a1: 83 ec 0c sub $0xc,%esp\r
+ 185a4: 8b 4d 08 mov 0x8(%ebp),%ecx\r
+ 185a7: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 185aa: 89 d0 mov %edx,%eax\r
+ 185ac: c1 e0 02 shl $0x2,%eax\r
+ 185af: 01 d0 add %edx,%eax\r
+ 185b1: c1 e0 02 shl $0x2,%eax\r
+ 185b4: 03 41 0c add 0xc(%ecx),%eax\r
+ 185b7: 50 push %eax\r
+ 185b8: e8 a3 ff ff ff call 18560 <_usb_show_endpoint>\r
+ 185bd: 83 c4 10 add $0x10,%esp\r
+ 185c0: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 185c3: ff 00 incl (%eax)\r
+ 185c5: eb ca jmp 18591 <_usb_show_interface+0x1b>\r
+ 185c7: c9 leave \r
+ 185c8: c3 ret \r
+\r
+000185c9 <_usb_show_config>:\r
+ 185c9: 55 push %ebp\r
+ 185ca: 89 e5 mov %esp,%ebp\r
+ 185cc: 53 push %ebx\r
+ 185cd: 83 ec 14 sub $0x14,%esp\r
+ 185d0: 83 ec 0c sub $0xc,%esp\r
+ 185d3: ff 75 08 pushl 0x8(%ebp)\r
+ 185d6: e8 45 05 00 00 call 18b20 <_usb_show_config_descriptor>\r
+ 185db: 83 c4 10 add $0x10,%esp\r
+ 185de: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 185e5: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 185e8: 8a 40 04 mov 0x4(%eax),%al\r
+ 185eb: 25 ff 00 00 00 and $0xff,%eax\r
+ 185f0: 3b 45 f8 cmp 0xfffffff8(%ebp),%eax\r
+ 185f3: 0f 8e 95 00 00 00 jle 1868e <_usb_show_config+0xc5>\r
+ 185f9: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 185fc: 8b 4d f8 mov 0xfffffff8(%ebp),%ecx\r
+ 185ff: 89 c8 mov %ecx,%eax\r
+ 18601: c1 e0 02 shl $0x2,%eax\r
+ 18604: 01 c8 add %ecx,%eax\r
+ 18606: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 1860d: 01 d0 add %edx,%eax\r
+ 1860f: 01 c0 add %eax,%eax\r
+ 18611: 01 c8 add %ecx,%eax\r
+ 18613: c1 e0 02 shl $0x2,%eax\r
+ 18616: 03 43 0c add 0xc(%ebx),%eax\r
+ 18619: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 1861c: 83 7d f0 00 cmpl $0x0,0xfffffff0(%ebp)\r
+ 18620: 75 02 jne 18624 <_usb_show_config+0x5b>\r
+ 18622: eb 6a jmp 1868e <_usb_show_config+0xc5>\r
+ 18624: 83 ec 04 sub $0x4,%esp\r
+ 18627: 6a 32 push $0x32\r
+ 18629: 68 c4 b2 01 00 push $0x1b2c4\r
+ 1862e: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18633: e8 28 14 00 00 call 19a60 <_DbgPrint>\r
+ 18638: 83 c4 10 add $0x10,%esp\r
+ 1863b: 83 ec 08 sub $0x8,%esp\r
+ 1863e: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 18641: 68 d9 b2 01 00 push $0x1b2d9\r
+ 18646: e8 15 14 00 00 call 19a60 <_DbgPrint>\r
+ 1864b: 83 c4 10 add $0x10,%esp\r
+ 1864e: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 18655: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 18658: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 1865b: 3b 42 08 cmp 0x8(%edx),%eax\r
+ 1865e: 73 24 jae 18684 <_usb_show_config+0xbb>\r
+ 18660: 83 ec 0c sub $0xc,%esp\r
+ 18663: 8b 4d f0 mov 0xfffffff0(%ebp),%ecx\r
+ 18666: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 18669: 89 d0 mov %edx,%eax\r
+ 1866b: 01 c0 add %eax,%eax\r
+ 1866d: 01 d0 add %edx,%eax\r
+ 1866f: c1 e0 03 shl $0x3,%eax\r
+ 18672: 03 01 add (%ecx),%eax\r
+ 18674: 50 push %eax\r
+ 18675: e8 fc fe ff ff call 18576 <_usb_show_interface>\r
+ 1867a: 83 c4 10 add $0x10,%esp\r
+ 1867d: 8d 45 f4 lea 0xfffffff4(%ebp),%eax\r
+ 18680: ff 00 incl (%eax)\r
+ 18682: eb d1 jmp 18655 <_usb_show_config+0x8c>\r
+ 18684: 8d 45 f8 lea 0xfffffff8(%ebp),%eax\r
+ 18687: ff 00 incl (%eax)\r
+ 18689: e9 57 ff ff ff jmp 185e5 <_usb_show_config+0x1c>\r
+ 1868e: 8b 5d fc mov 0xfffffffc(%ebp),%ebx\r
+ 18691: c9 leave \r
+ 18692: c3 ret \r
+\r
+00018693 <_usb_show_device>:\r
+ 18693: 55 push %ebp\r
+ 18694: 89 e5 mov %esp,%ebp\r
+ 18696: 83 ec 08 sub $0x8,%esp\r
+ 18699: 83 ec 0c sub $0xc,%esp\r
+ 1869c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1869f: 05 70 01 00 00 add $0x170,%eax\r
+ 186a4: 50 push %eax\r
+ 186a5: e8 47 00 00 00 call 186f1 <_usb_show_device_descriptor>\r
+ 186aa: 83 c4 10 add $0x10,%esp\r
+ 186ad: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 186b4: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 186b7: 8a 80 81 01 00 00 mov 0x181(%eax),%al\r
+ 186bd: 25 ff 00 00 00 and $0xff,%eax\r
+ 186c2: 3b 45 fc cmp 0xfffffffc(%ebp),%eax\r
+ 186c5: 7e 28 jle 186ef <_usb_show_device+0x5c>\r
+ 186c7: 83 ec 0c sub $0xc,%esp\r
+ 186ca: 8b 4d 08 mov 0x8(%ebp),%ecx\r
+ 186cd: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 186d0: 89 d0 mov %edx,%eax\r
+ 186d2: 01 c0 add %eax,%eax\r
+ 186d4: 01 d0 add %edx,%eax\r
+ 186d6: c1 e0 03 shl $0x3,%eax\r
+ 186d9: 03 81 84 01 00 00 add 0x184(%ecx),%eax\r
+ 186df: 50 push %eax\r
+ 186e0: e8 e4 fe ff ff call 185c9 <_usb_show_config>\r
+ 186e5: 83 c4 10 add $0x10,%esp\r
+ 186e8: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 186eb: ff 00 incl (%eax)\r
+ 186ed: eb c5 jmp 186b4 <_usb_show_device+0x21>\r
+ 186ef: c9 leave \r
+ 186f0: c3 ret \r
+\r
+000186f1 <_usb_show_device_descriptor>:\r
+ 186f1: 55 push %ebp\r
+ 186f2: 89 e5 mov %esp,%ebp\r
+ 186f4: 83 ec 08 sub $0x8,%esp\r
+ 186f7: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 186fb: 75 2c jne 18729 <_usb_show_device_descriptor+0x38>\r
+ 186fd: 83 ec 04 sub $0x4,%esp\r
+ 18700: 6a 48 push $0x48\r
+ 18702: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18707: 68 d0 b2 01 00 push $0x1b2d0\r
+ 1870c: e8 4f 13 00 00 call 19a60 <_DbgPrint>\r
+ 18711: 83 c4 10 add $0x10,%esp\r
+ 18714: 83 ec 0c sub $0xc,%esp\r
+ 18717: 68 ec b2 01 00 push $0x1b2ec\r
+ 1871c: e8 3f 13 00 00 call 19a60 <_DbgPrint>\r
+ 18721: 83 c4 10 add $0x10,%esp\r
+ 18724: e9 f5 03 00 00 jmp 18b1e <_usb_show_device_descriptor+0x42d>\r
+ 18729: 83 ec 04 sub $0x4,%esp\r
+ 1872c: 6a 4c push $0x4c\r
+ 1872e: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18733: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18738: e8 23 13 00 00 call 19a60 <_DbgPrint>\r
+ 1873d: 83 c4 10 add $0x10,%esp\r
+ 18740: 83 ec 04 sub $0x4,%esp\r
+ 18743: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18746: 80 38 12 cmpb $0x12,(%eax)\r
+ 18749: 75 09 jne 18754 <_usb_show_device_descriptor+0x63>\r
+ 1874b: c7 45 fc 1a b3 01 00 movl $0x1b31a,0xfffffffc(%ebp)\r
+ 18752: eb 07 jmp 1875b <_usb_show_device_descriptor+0x6a>\r
+ 18754: c7 45 fc 1b b3 01 00 movl $0x1b31b,0xfffffffc(%ebp)\r
+ 1875b: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 1875e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18761: 8a 00 mov (%eax),%al\r
+ 18763: 25 ff 00 00 00 and $0xff,%eax\r
+ 18768: 50 push %eax\r
+ 18769: 68 24 b3 01 00 push $0x1b324\r
+ 1876e: e8 ed 12 00 00 call 19a60 <_DbgPrint>\r
+ 18773: 83 c4 10 add $0x10,%esp\r
+ 18776: 83 ec 04 sub $0x4,%esp\r
+ 18779: 6a 4d push $0x4d\r
+ 1877b: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18780: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18785: e8 d6 12 00 00 call 19a60 <_DbgPrint>\r
+ 1878a: 83 c4 10 add $0x10,%esp\r
+ 1878d: 83 ec 08 sub $0x8,%esp\r
+ 18790: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18793: 8a 40 01 mov 0x1(%eax),%al\r
+ 18796: 25 ff 00 00 00 and $0xff,%eax\r
+ 1879b: 50 push %eax\r
+ 1879c: 68 43 b3 01 00 push $0x1b343\r
+ 187a1: e8 ba 12 00 00 call 19a60 <_DbgPrint>\r
+ 187a6: 83 c4 10 add $0x10,%esp\r
+ 187a9: 83 ec 04 sub $0x4,%esp\r
+ 187ac: 6a 50 push $0x50\r
+ 187ae: 68 c4 b2 01 00 push $0x1b2c4\r
+ 187b3: 68 d0 b2 01 00 push $0x1b2d0\r
+ 187b8: e8 a3 12 00 00 call 19a60 <_DbgPrint>\r
+ 187bd: 83 c4 10 add $0x10,%esp\r
+ 187c0: 83 ec 04 sub $0x4,%esp\r
+ 187c3: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 187c6: 66 8b 40 02 mov 0x2(%eax),%ax\r
+ 187ca: 25 ff ff 00 00 and $0xffff,%eax\r
+ 187cf: 25 ff 00 00 00 and $0xff,%eax\r
+ 187d4: 50 push %eax\r
+ 187d5: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 187d8: 66 8b 40 02 mov 0x2(%eax),%ax\r
+ 187dc: 66 c1 e8 08 shr $0x8,%ax\r
+ 187e0: 25 ff ff 00 00 and $0xffff,%eax\r
+ 187e5: 50 push %eax\r
+ 187e6: 68 64 b3 01 00 push $0x1b364\r
+ 187eb: e8 70 12 00 00 call 19a60 <_DbgPrint>\r
+ 187f0: 83 c4 10 add $0x10,%esp\r
+ 187f3: 83 ec 04 sub $0x4,%esp\r
+ 187f6: 6a 52 push $0x52\r
+ 187f8: 68 c4 b2 01 00 push $0x1b2c4\r
+ 187fd: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18802: e8 59 12 00 00 call 19a60 <_DbgPrint>\r
+ 18807: 83 c4 10 add $0x10,%esp\r
+ 1880a: 83 ec 04 sub $0x4,%esp\r
+ 1880d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18810: 66 8b 40 0a mov 0xa(%eax),%ax\r
+ 18814: 25 ff ff 00 00 and $0xffff,%eax\r
+ 18819: 50 push %eax\r
+ 1881a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1881d: 66 8b 40 08 mov 0x8(%eax),%ax\r
+ 18821: 25 ff ff 00 00 and $0xffff,%eax\r
+ 18826: 50 push %eax\r
+ 18827: 68 88 b3 01 00 push $0x1b388\r
+ 1882c: e8 2f 12 00 00 call 19a60 <_DbgPrint>\r
+ 18831: 83 c4 10 add $0x10,%esp\r
+ 18834: 83 ec 04 sub $0x4,%esp\r
+ 18837: 6a 53 push $0x53\r
+ 18839: 68 c4 b2 01 00 push $0x1b2c4\r
+ 1883e: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18843: e8 18 12 00 00 call 19a60 <_DbgPrint>\r
+ 18848: 83 c4 10 add $0x10,%esp\r
+ 1884b: 83 ec 08 sub $0x8,%esp\r
+ 1884e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18851: 8a 40 07 mov 0x7(%eax),%al\r
+ 18854: 25 ff 00 00 00 and $0xff,%eax\r
+ 18859: 50 push %eax\r
+ 1885a: 68 ab b3 01 00 push $0x1b3ab\r
+ 1885f: e8 fc 11 00 00 call 19a60 <_DbgPrint>\r
+ 18864: 83 c4 10 add $0x10,%esp\r
+ 18867: 83 ec 04 sub $0x4,%esp\r
+ 1886a: 6a 54 push $0x54\r
+ 1886c: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18871: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18876: e8 e5 11 00 00 call 19a60 <_DbgPrint>\r
+ 1887b: 83 c4 10 add $0x10,%esp\r
+ 1887e: 83 ec 08 sub $0x8,%esp\r
+ 18881: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18884: 8a 40 11 mov 0x11(%eax),%al\r
+ 18887: 25 ff 00 00 00 and $0xff,%eax\r
+ 1888c: 50 push %eax\r
+ 1888d: 68 c7 b3 01 00 push $0x1b3c7\r
+ 18892: e8 c9 11 00 00 call 19a60 <_DbgPrint>\r
+ 18897: 83 c4 10 add $0x10,%esp\r
+ 1889a: 83 ec 04 sub $0x4,%esp\r
+ 1889d: 6a 56 push $0x56\r
+ 1889f: 68 c4 b2 01 00 push $0x1b2c4\r
+ 188a4: 68 d0 b2 01 00 push $0x1b2d0\r
+ 188a9: e8 b2 11 00 00 call 19a60 <_DbgPrint>\r
+ 188ae: 83 c4 10 add $0x10,%esp\r
+ 188b1: 83 ec 04 sub $0x4,%esp\r
+ 188b4: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 188b7: 66 8b 40 0c mov 0xc(%eax),%ax\r
+ 188bb: 25 ff ff 00 00 and $0xffff,%eax\r
+ 188c0: 25 ff 00 00 00 and $0xff,%eax\r
+ 188c5: 50 push %eax\r
+ 188c6: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 188c9: 66 8b 40 0c mov 0xc(%eax),%ax\r
+ 188cd: 66 c1 e8 08 shr $0x8,%ax\r
+ 188d1: 25 ff ff 00 00 and $0xffff,%eax\r
+ 188d6: 50 push %eax\r
+ 188d7: 68 e4 b3 01 00 push $0x1b3e4\r
+ 188dc: e8 7f 11 00 00 call 19a60 <_DbgPrint>\r
+ 188e1: 83 c4 10 add $0x10,%esp\r
+ 188e4: 83 ec 04 sub $0x4,%esp\r
+ 188e7: 6a 59 push $0x59\r
+ 188e9: 68 c4 b2 01 00 push $0x1b2c4\r
+ 188ee: 68 d0 b2 01 00 push $0x1b2d0\r
+ 188f3: e8 68 11 00 00 call 19a60 <_DbgPrint>\r
+ 188f8: 83 c4 10 add $0x10,%esp\r
+ 188fb: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 188fe: 8a 40 06 mov 0x6(%eax),%al\r
+ 18901: 25 ff 00 00 00 and $0xff,%eax\r
+ 18906: 50 push %eax\r
+ 18907: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1890a: 8a 40 05 mov 0x5(%eax),%al\r
+ 1890d: 25 ff 00 00 00 and $0xff,%eax\r
+ 18912: 50 push %eax\r
+ 18913: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18916: 8a 40 04 mov 0x4(%eax),%al\r
+ 18919: 25 ff 00 00 00 and $0xff,%eax\r
+ 1891e: 50 push %eax\r
+ 1891f: 68 08 b4 01 00 push $0x1b408\r
+ 18924: e8 37 11 00 00 call 19a60 <_DbgPrint>\r
+ 18929: 83 c4 10 add $0x10,%esp\r
+ 1892c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1892f: ba 00 00 00 00 mov $0x0,%edx\r
+ 18934: 8a 50 04 mov 0x4(%eax),%dl\r
+ 18937: 89 55 f8 mov %edx,0xfffffff8(%ebp)\r
+ 1893a: 83 7d f8 03 cmpl $0x3,0xfffffff8(%ebp)\r
+ 1893e: 0f 84 e0 00 00 00 je 18a24 <_usb_show_device_descriptor+0x333>\r
+ 18944: 83 7d f8 03 cmpl $0x3,0xfffffff8(%ebp)\r
+ 18948: 7f 1b jg 18965 <_usb_show_device_descriptor+0x274>\r
+ 1894a: 83 7d f8 01 cmpl $0x1,0xfffffff8(%ebp)\r
+ 1894e: 74 7c je 189cc <_usb_show_device_descriptor+0x2db>\r
+ 18950: 83 7d f8 01 cmpl $0x1,0xfffffff8(%ebp)\r
+ 18954: 0f 8f 9e 00 00 00 jg 189f8 <_usb_show_device_descriptor+0x307>\r
+ 1895a: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 1895e: 74 40 je 189a0 <_usb_show_device_descriptor+0x2af>\r
+ 18960: e9 92 01 00 00 jmp 18af7 <_usb_show_device_descriptor+0x406>\r
+ 18965: 83 7d f8 08 cmpl $0x8,0xfffffff8(%ebp)\r
+ 18969: 0f 84 0d 01 00 00 je 18a7c <_usb_show_device_descriptor+0x38b>\r
+ 1896f: 83 7d f8 08 cmpl $0x8,0xfffffff8(%ebp)\r
+ 18973: 7f 0f jg 18984 <_usb_show_device_descriptor+0x293>\r
+ 18975: 83 7d f8 07 cmpl $0x7,0xfffffff8(%ebp)\r
+ 18979: 0f 84 d1 00 00 00 je 18a50 <_usb_show_device_descriptor+0x35f>\r
+ 1897f: e9 73 01 00 00 jmp 18af7 <_usb_show_device_descriptor+0x406>\r
+ 18984: 83 7d f8 09 cmpl $0x9,0xfffffff8(%ebp)\r
+ 18988: 0f 84 17 01 00 00 je 18aa5 <_usb_show_device_descriptor+0x3b4>\r
+ 1898e: 81 7d f8 ff 00 00 00 cmpl $0xff,0xfffffff8(%ebp)\r
+ 18995: 0f 84 33 01 00 00 je 18ace <_usb_show_device_descriptor+0x3dd>\r
+ 1899b: e9 57 01 00 00 jmp 18af7 <_usb_show_device_descriptor+0x406>\r
+ 189a0: 83 ec 04 sub $0x4,%esp\r
+ 189a3: 6a 5c push $0x5c\r
+ 189a5: 68 c4 b2 01 00 push $0x1b2c4\r
+ 189aa: 68 d0 b2 01 00 push $0x1b2d0\r
+ 189af: e8 ac 10 00 00 call 19a60 <_DbgPrint>\r
+ 189b4: 83 c4 10 add $0x10,%esp\r
+ 189b7: 83 ec 0c sub $0xc,%esp\r
+ 189ba: 68 3b b4 01 00 push $0x1b43b\r
+ 189bf: e8 9c 10 00 00 call 19a60 <_DbgPrint>\r
+ 189c4: 83 c4 10 add $0x10,%esp\r
+ 189c7: e9 52 01 00 00 jmp 18b1e <_usb_show_device_descriptor+0x42d>\r
+ 189cc: 83 ec 04 sub $0x4,%esp\r
+ 189cf: 6a 5f push $0x5f\r
+ 189d1: 68 c4 b2 01 00 push $0x1b2c4\r
+ 189d6: 68 d0 b2 01 00 push $0x1b2d0\r
+ 189db: e8 80 10 00 00 call 19a60 <_DbgPrint>\r
+ 189e0: 83 c4 10 add $0x10,%esp\r
+ 189e3: 83 ec 0c sub $0xc,%esp\r
+ 189e6: 68 56 b4 01 00 push $0x1b456\r
+ 189eb: e8 70 10 00 00 call 19a60 <_DbgPrint>\r
+ 189f0: 83 c4 10 add $0x10,%esp\r
+ 189f3: e9 26 01 00 00 jmp 18b1e <_usb_show_device_descriptor+0x42d>\r
+ 189f8: 83 ec 04 sub $0x4,%esp\r
+ 189fb: 6a 62 push $0x62\r
+ 189fd: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18a02: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18a07: e8 54 10 00 00 call 19a60 <_DbgPrint>\r
+ 18a0c: 83 c4 10 add $0x10,%esp\r
+ 18a0f: 83 ec 0c sub $0xc,%esp\r
+ 18a12: 68 6e b4 01 00 push $0x1b46e\r
+ 18a17: e8 44 10 00 00 call 19a60 <_DbgPrint>\r
+ 18a1c: 83 c4 10 add $0x10,%esp\r
+ 18a1f: e9 fa 00 00 00 jmp 18b1e <_usb_show_device_descriptor+0x42d>\r
+ 18a24: 83 ec 04 sub $0x4,%esp\r
+ 18a27: 6a 65 push $0x65\r
+ 18a29: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18a2e: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18a33: e8 28 10 00 00 call 19a60 <_DbgPrint>\r
+ 18a38: 83 c4 10 add $0x10,%esp\r
+ 18a3b: 83 ec 0c sub $0xc,%esp\r
+ 18a3e: 68 88 b4 01 00 push $0x1b488\r
+ 18a43: e8 18 10 00 00 call 19a60 <_DbgPrint>\r
+ 18a48: 83 c4 10 add $0x10,%esp\r
+ 18a4b: e9 ce 00 00 00 jmp 18b1e <_usb_show_device_descriptor+0x42d>\r
+ 18a50: 83 ec 04 sub $0x4,%esp\r
+ 18a53: 6a 68 push $0x68\r
+ 18a55: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18a5a: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18a5f: e8 fc 0f 00 00 call 19a60 <_DbgPrint>\r
+ 18a64: 83 c4 10 add $0x10,%esp\r
+ 18a67: 83 ec 0c sub $0xc,%esp\r
+ 18a6a: 68 ab b4 01 00 push $0x1b4ab\r
+ 18a6f: e8 ec 0f 00 00 call 19a60 <_DbgPrint>\r
+ 18a74: 83 c4 10 add $0x10,%esp\r
+ 18a77: e9 a2 00 00 00 jmp 18b1e <_usb_show_device_descriptor+0x42d>\r
+ 18a7c: 83 ec 04 sub $0x4,%esp\r
+ 18a7f: 6a 6b push $0x6b\r
+ 18a81: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18a86: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18a8b: e8 d0 0f 00 00 call 19a60 <_DbgPrint>\r
+ 18a90: 83 c4 10 add $0x10,%esp\r
+ 18a93: 83 ec 0c sub $0xc,%esp\r
+ 18a96: 68 c8 b4 01 00 push $0x1b4c8\r
+ 18a9b: e8 c0 0f 00 00 call 19a60 <_DbgPrint>\r
+ 18aa0: 83 c4 10 add $0x10,%esp\r
+ 18aa3: eb 79 jmp 18b1e <_usb_show_device_descriptor+0x42d>\r
+ 18aa5: 83 ec 04 sub $0x4,%esp\r
+ 18aa8: 6a 6e push $0x6e\r
+ 18aaa: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18aaf: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18ab4: e8 a7 0f 00 00 call 19a60 <_DbgPrint>\r
+ 18ab9: 83 c4 10 add $0x10,%esp\r
+ 18abc: 83 ec 0c sub $0xc,%esp\r
+ 18abf: 68 e7 b4 01 00 push $0x1b4e7\r
+ 18ac4: e8 97 0f 00 00 call 19a60 <_DbgPrint>\r
+ 18ac9: 83 c4 10 add $0x10,%esp\r
+ 18acc: eb 50 jmp 18b1e <_usb_show_device_descriptor+0x42d>\r
+ 18ace: 83 ec 04 sub $0x4,%esp\r
+ 18ad1: 6a 71 push $0x71\r
+ 18ad3: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18ad8: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18add: e8 7e 0f 00 00 call 19a60 <_DbgPrint>\r
+ 18ae2: 83 c4 10 add $0x10,%esp\r
+ 18ae5: 83 ec 0c sub $0xc,%esp\r
+ 18ae8: 68 fd b4 01 00 push $0x1b4fd\r
+ 18aed: e8 6e 0f 00 00 call 19a60 <_DbgPrint>\r
+ 18af2: 83 c4 10 add $0x10,%esp\r
+ 18af5: eb 27 jmp 18b1e <_usb_show_device_descriptor+0x42d>\r
+ 18af7: 83 ec 04 sub $0x4,%esp\r
+ 18afa: 6a 74 push $0x74\r
+ 18afc: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18b01: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18b06: e8 55 0f 00 00 call 19a60 <_DbgPrint>\r
+ 18b0b: 83 c4 10 add $0x10,%esp\r
+ 18b0e: 83 ec 0c sub $0xc,%esp\r
+ 18b11: 68 0f b5 01 00 push $0x1b50f\r
+ 18b16: e8 45 0f 00 00 call 19a60 <_DbgPrint>\r
+ 18b1b: 83 c4 10 add $0x10,%esp\r
+ 18b1e: c9 leave \r
+ 18b1f: c3 ret \r
+\r
+00018b20 <_usb_show_config_descriptor>:\r
+ 18b20: 55 push %ebp\r
+ 18b21: 89 e5 mov %esp,%ebp\r
+ 18b23: 83 ec 08 sub $0x8,%esp\r
+ 18b26: 83 ec 04 sub $0x4,%esp\r
+ 18b29: 6a 7a push $0x7a\r
+ 18b2b: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18b30: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18b35: e8 26 0f 00 00 call 19a60 <_DbgPrint>\r
+ 18b3a: 83 c4 10 add $0x10,%esp\r
+ 18b3d: 83 ec 0c sub $0xc,%esp\r
+ 18b40: 68 22 b5 01 00 push $0x1b522\r
+ 18b45: e8 16 0f 00 00 call 19a60 <_DbgPrint>\r
+ 18b4a: 83 c4 10 add $0x10,%esp\r
+ 18b4d: 83 ec 04 sub $0x4,%esp\r
+ 18b50: 6a 7c push $0x7c\r
+ 18b52: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18b57: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18b5c: e8 ff 0e 00 00 call 19a60 <_DbgPrint>\r
+ 18b61: 83 c4 10 add $0x10,%esp\r
+ 18b64: 83 ec 04 sub $0x4,%esp\r
+ 18b67: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18b6a: 80 38 09 cmpb $0x9,(%eax)\r
+ 18b6d: 75 09 jne 18b78 <_usb_show_config_descriptor+0x58>\r
+ 18b6f: c7 45 fc 1a b3 01 00 movl $0x1b31a,0xfffffffc(%ebp)\r
+ 18b76: eb 07 jmp 18b7f <_usb_show_config_descriptor+0x5f>\r
+ 18b78: c7 45 fc 1b b3 01 00 movl $0x1b31b,0xfffffffc(%ebp)\r
+ 18b7f: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 18b82: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18b85: 8a 00 mov (%eax),%al\r
+ 18b87: 25 ff 00 00 00 and $0xff,%eax\r
+ 18b8c: 50 push %eax\r
+ 18b8d: 68 34 b5 01 00 push $0x1b534\r
+ 18b92: e8 c9 0e 00 00 call 19a60 <_DbgPrint>\r
+ 18b97: 83 c4 10 add $0x10,%esp\r
+ 18b9a: 83 ec 04 sub $0x4,%esp\r
+ 18b9d: 6a 7d push $0x7d\r
+ 18b9f: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18ba4: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18ba9: e8 b2 0e 00 00 call 19a60 <_DbgPrint>\r
+ 18bae: 83 c4 10 add $0x10,%esp\r
+ 18bb1: 83 ec 08 sub $0x8,%esp\r
+ 18bb4: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18bb7: 8a 40 01 mov 0x1(%eax),%al\r
+ 18bba: 25 ff 00 00 00 and $0xff,%eax\r
+ 18bbf: 50 push %eax\r
+ 18bc0: 68 54 b5 01 00 push $0x1b554\r
+ 18bc5: e8 96 0e 00 00 call 19a60 <_DbgPrint>\r
+ 18bca: 83 c4 10 add $0x10,%esp\r
+ 18bcd: 83 ec 04 sub $0x4,%esp\r
+ 18bd0: 6a 7e push $0x7e\r
+ 18bd2: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18bd7: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18bdc: e8 7f 0e 00 00 call 19a60 <_DbgPrint>\r
+ 18be1: 83 c4 10 add $0x10,%esp\r
+ 18be4: 83 ec 08 sub $0x8,%esp\r
+ 18be7: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18bea: 66 8b 40 02 mov 0x2(%eax),%ax\r
+ 18bee: 25 ff ff 00 00 and $0xffff,%eax\r
+ 18bf3: 50 push %eax\r
+ 18bf4: 68 74 b5 01 00 push $0x1b574\r
+ 18bf9: e8 62 0e 00 00 call 19a60 <_DbgPrint>\r
+ 18bfe: 83 c4 10 add $0x10,%esp\r
+ 18c01: 83 ec 04 sub $0x4,%esp\r
+ 18c04: 6a 7f push $0x7f\r
+ 18c06: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18c0b: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18c10: e8 4b 0e 00 00 call 19a60 <_DbgPrint>\r
+ 18c15: 83 c4 10 add $0x10,%esp\r
+ 18c18: 83 ec 08 sub $0x8,%esp\r
+ 18c1b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18c1e: 8a 40 04 mov 0x4(%eax),%al\r
+ 18c21: 25 ff 00 00 00 and $0xff,%eax\r
+ 18c26: 50 push %eax\r
+ 18c27: 68 94 b5 01 00 push $0x1b594\r
+ 18c2c: e8 2f 0e 00 00 call 19a60 <_DbgPrint>\r
+ 18c31: 83 c4 10 add $0x10,%esp\r
+ 18c34: 83 ec 04 sub $0x4,%esp\r
+ 18c37: 68 80 00 00 00 push $0x80\r
+ 18c3c: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18c41: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18c46: e8 15 0e 00 00 call 19a60 <_DbgPrint>\r
+ 18c4b: 83 c4 10 add $0x10,%esp\r
+ 18c4e: 83 ec 08 sub $0x8,%esp\r
+ 18c51: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18c54: 8a 40 05 mov 0x5(%eax),%al\r
+ 18c57: 25 ff 00 00 00 and $0xff,%eax\r
+ 18c5c: 50 push %eax\r
+ 18c5d: 68 b4 b5 01 00 push $0x1b5b4\r
+ 18c62: e8 f9 0d 00 00 call 19a60 <_DbgPrint>\r
+ 18c67: 83 c4 10 add $0x10,%esp\r
+ 18c6a: 83 ec 04 sub $0x4,%esp\r
+ 18c6d: 68 81 00 00 00 push $0x81\r
+ 18c72: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18c77: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18c7c: e8 df 0d 00 00 call 19a60 <_DbgPrint>\r
+ 18c81: 83 c4 10 add $0x10,%esp\r
+ 18c84: 83 ec 08 sub $0x8,%esp\r
+ 18c87: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18c8a: 8a 40 06 mov 0x6(%eax),%al\r
+ 18c8d: 25 ff 00 00 00 and $0xff,%eax\r
+ 18c92: 50 push %eax\r
+ 18c93: 68 d4 b5 01 00 push $0x1b5d4\r
+ 18c98: e8 c3 0d 00 00 call 19a60 <_DbgPrint>\r
+ 18c9d: 83 c4 10 add $0x10,%esp\r
+ 18ca0: 83 ec 04 sub $0x4,%esp\r
+ 18ca3: 68 82 00 00 00 push $0x82\r
+ 18ca8: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18cad: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18cb2: e8 a9 0d 00 00 call 19a60 <_DbgPrint>\r
+ 18cb7: 83 c4 10 add $0x10,%esp\r
+ 18cba: 83 ec 08 sub $0x8,%esp\r
+ 18cbd: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18cc0: 8a 40 07 mov 0x7(%eax),%al\r
+ 18cc3: 25 ff 00 00 00 and $0xff,%eax\r
+ 18cc8: 50 push %eax\r
+ 18cc9: 68 f4 b5 01 00 push $0x1b5f4\r
+ 18cce: e8 8d 0d 00 00 call 19a60 <_DbgPrint>\r
+ 18cd3: 83 c4 10 add $0x10,%esp\r
+ 18cd6: 83 ec 04 sub $0x4,%esp\r
+ 18cd9: 68 83 00 00 00 push $0x83\r
+ 18cde: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18ce3: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18ce8: e8 73 0d 00 00 call 19a60 <_DbgPrint>\r
+ 18ced: 83 c4 10 add $0x10,%esp\r
+ 18cf0: 83 ec 08 sub $0x8,%esp\r
+ 18cf3: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18cf6: 8a 40 08 mov 0x8(%eax),%al\r
+ 18cf9: 25 ff 00 00 00 and $0xff,%eax\r
+ 18cfe: 01 c0 add %eax,%eax\r
+ 18d00: 50 push %eax\r
+ 18d01: 68 14 b6 01 00 push $0x1b614\r
+ 18d06: e8 55 0d 00 00 call 19a60 <_DbgPrint>\r
+ 18d0b: 83 c4 10 add $0x10,%esp\r
+ 18d0e: c9 leave \r
+ 18d0f: c3 ret \r
+\r
+00018d10 <_usb_show_interface_descriptor>:\r
+ 18d10: 55 push %ebp\r
+ 18d11: 89 e5 mov %esp,%ebp\r
+ 18d13: 83 ec 08 sub $0x8,%esp\r
+ 18d16: 83 ec 04 sub $0x4,%esp\r
+ 18d19: 68 88 00 00 00 push $0x88\r
+ 18d1e: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18d23: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18d28: e8 33 0d 00 00 call 19a60 <_DbgPrint>\r
+ 18d2d: 83 c4 10 add $0x10,%esp\r
+ 18d30: 83 ec 08 sub $0x8,%esp\r
+ 18d33: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18d36: 8a 40 03 mov 0x3(%eax),%al\r
+ 18d39: 25 ff 00 00 00 and $0xff,%eax\r
+ 18d3e: 50 push %eax\r
+ 18d3f: 68 34 b6 01 00 push $0x1b634\r
+ 18d44: e8 17 0d 00 00 call 19a60 <_DbgPrint>\r
+ 18d49: 83 c4 10 add $0x10,%esp\r
+ 18d4c: 83 ec 04 sub $0x4,%esp\r
+ 18d4f: 68 8a 00 00 00 push $0x8a\r
+ 18d54: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18d59: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18d5e: e8 fd 0c 00 00 call 19a60 <_DbgPrint>\r
+ 18d63: 83 c4 10 add $0x10,%esp\r
+ 18d66: 83 ec 04 sub $0x4,%esp\r
+ 18d69: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18d6c: 80 38 09 cmpb $0x9,(%eax)\r
+ 18d6f: 75 09 jne 18d7a <_usb_show_interface_descriptor+0x6a>\r
+ 18d71: c7 45 fc 1a b3 01 00 movl $0x1b31a,0xfffffffc(%ebp)\r
+ 18d78: eb 07 jmp 18d81 <_usb_show_interface_descriptor+0x71>\r
+ 18d7a: c7 45 fc 1b b3 01 00 movl $0x1b31b,0xfffffffc(%ebp)\r
+ 18d81: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 18d84: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18d87: 8a 00 mov (%eax),%al\r
+ 18d89: 25 ff 00 00 00 and $0xff,%eax\r
+ 18d8e: 50 push %eax\r
+ 18d8f: 68 50 b6 01 00 push $0x1b650\r
+ 18d94: e8 c7 0c 00 00 call 19a60 <_DbgPrint>\r
+ 18d99: 83 c4 10 add $0x10,%esp\r
+ 18d9c: 83 ec 04 sub $0x4,%esp\r
+ 18d9f: 68 8b 00 00 00 push $0x8b\r
+ 18da4: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18da9: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18dae: e8 ad 0c 00 00 call 19a60 <_DbgPrint>\r
+ 18db3: 83 c4 10 add $0x10,%esp\r
+ 18db6: 83 ec 08 sub $0x8,%esp\r
+ 18db9: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18dbc: 8a 40 01 mov 0x1(%eax),%al\r
+ 18dbf: 25 ff 00 00 00 and $0xff,%eax\r
+ 18dc4: 50 push %eax\r
+ 18dc5: 68 74 b6 01 00 push $0x1b674\r
+ 18dca: e8 91 0c 00 00 call 19a60 <_DbgPrint>\r
+ 18dcf: 83 c4 10 add $0x10,%esp\r
+ 18dd2: 83 ec 04 sub $0x4,%esp\r
+ 18dd5: 68 8c 00 00 00 push $0x8c\r
+ 18dda: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18ddf: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18de4: e8 77 0c 00 00 call 19a60 <_DbgPrint>\r
+ 18de9: 83 c4 10 add $0x10,%esp\r
+ 18dec: 83 ec 08 sub $0x8,%esp\r
+ 18def: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18df2: 8a 40 02 mov 0x2(%eax),%al\r
+ 18df5: 25 ff 00 00 00 and $0xff,%eax\r
+ 18dfa: 50 push %eax\r
+ 18dfb: 68 98 b6 01 00 push $0x1b698\r
+ 18e00: e8 5b 0c 00 00 call 19a60 <_DbgPrint>\r
+ 18e05: 83 c4 10 add $0x10,%esp\r
+ 18e08: 83 ec 04 sub $0x4,%esp\r
+ 18e0b: 68 8d 00 00 00 push $0x8d\r
+ 18e10: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18e15: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18e1a: e8 41 0c 00 00 call 19a60 <_DbgPrint>\r
+ 18e1f: 83 c4 10 add $0x10,%esp\r
+ 18e22: 83 ec 08 sub $0x8,%esp\r
+ 18e25: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18e28: 8a 40 03 mov 0x3(%eax),%al\r
+ 18e2b: 25 ff 00 00 00 and $0xff,%eax\r
+ 18e30: 50 push %eax\r
+ 18e31: 68 bc b6 01 00 push $0x1b6bc\r
+ 18e36: e8 25 0c 00 00 call 19a60 <_DbgPrint>\r
+ 18e3b: 83 c4 10 add $0x10,%esp\r
+ 18e3e: 83 ec 04 sub $0x4,%esp\r
+ 18e41: 68 8e 00 00 00 push $0x8e\r
+ 18e46: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18e4b: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18e50: e8 0b 0c 00 00 call 19a60 <_DbgPrint>\r
+ 18e55: 83 c4 10 add $0x10,%esp\r
+ 18e58: 83 ec 08 sub $0x8,%esp\r
+ 18e5b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18e5e: 8a 40 04 mov 0x4(%eax),%al\r
+ 18e61: 25 ff 00 00 00 and $0xff,%eax\r
+ 18e66: 50 push %eax\r
+ 18e67: 68 e0 b6 01 00 push $0x1b6e0\r
+ 18e6c: e8 ef 0b 00 00 call 19a60 <_DbgPrint>\r
+ 18e71: 83 c4 10 add $0x10,%esp\r
+ 18e74: 83 ec 04 sub $0x4,%esp\r
+ 18e77: 68 90 00 00 00 push $0x90\r
+ 18e7c: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18e81: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18e86: e8 d5 0b 00 00 call 19a60 <_DbgPrint>\r
+ 18e8b: 83 c4 10 add $0x10,%esp\r
+ 18e8e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18e91: 8a 40 07 mov 0x7(%eax),%al\r
+ 18e94: 25 ff 00 00 00 and $0xff,%eax\r
+ 18e99: 50 push %eax\r
+ 18e9a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18e9d: 8a 40 06 mov 0x6(%eax),%al\r
+ 18ea0: 25 ff 00 00 00 and $0xff,%eax\r
+ 18ea5: 50 push %eax\r
+ 18ea6: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18ea9: 8a 40 05 mov 0x5(%eax),%al\r
+ 18eac: 25 ff 00 00 00 and $0xff,%eax\r
+ 18eb1: 50 push %eax\r
+ 18eb2: 68 04 b7 01 00 push $0x1b704\r
+ 18eb7: e8 a4 0b 00 00 call 19a60 <_DbgPrint>\r
+ 18ebc: 83 c4 10 add $0x10,%esp\r
+ 18ebf: 83 ec 04 sub $0x4,%esp\r
+ 18ec2: 68 91 00 00 00 push $0x91\r
+ 18ec7: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18ecc: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18ed1: e8 8a 0b 00 00 call 19a60 <_DbgPrint>\r
+ 18ed6: 83 c4 10 add $0x10,%esp\r
+ 18ed9: 83 ec 08 sub $0x8,%esp\r
+ 18edc: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18edf: 8a 40 08 mov 0x8(%eax),%al\r
+ 18ee2: 25 ff 00 00 00 and $0xff,%eax\r
+ 18ee7: 50 push %eax\r
+ 18ee8: 68 40 b7 01 00 push $0x1b740\r
+ 18eed: e8 6e 0b 00 00 call 19a60 <_DbgPrint>\r
+ 18ef2: 83 c4 10 add $0x10,%esp\r
+ 18ef5: c9 leave \r
+ 18ef6: c3 ret \r
+\r
+00018ef7 <_usb_show_endpoint_descriptor>:\r
+ 18ef7: 55 push %ebp\r
+ 18ef8: 89 e5 mov %esp,%ebp\r
+ 18efa: 83 ec 38 sub $0x38,%esp\r
+ 18efd: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18f00: 80 38 09 cmpb $0x9,(%eax)\r
+ 18f03: 74 1a je 18f1f <_usb_show_endpoint_descriptor+0x28>\r
+ 18f05: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18f08: 80 38 07 cmpb $0x7,(%eax)\r
+ 18f0b: 75 09 jne 18f16 <_usb_show_endpoint_descriptor+0x1f>\r
+ 18f0d: c7 45 d4 1a b3 01 00 movl $0x1b31a,0xffffffd4(%ebp)\r
+ 18f14: eb 10 jmp 18f26 <_usb_show_endpoint_descriptor+0x2f>\r
+ 18f16: c7 45 d4 1b b3 01 00 movl $0x1b31b,0xffffffd4(%ebp)\r
+ 18f1d: eb 07 jmp 18f26 <_usb_show_endpoint_descriptor+0x2f>\r
+ 18f1f: c7 45 d4 62 b7 01 00 movl $0x1b762,0xffffffd4(%ebp)\r
+ 18f26: 8b 45 d4 mov 0xffffffd4(%ebp),%eax\r
+ 18f29: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 18f2c: c7 45 d8 6b b7 01 00 movl $0x1b76b,0xffffffd8(%ebp)\r
+ 18f33: c7 45 dc 73 b7 01 00 movl $0x1b773,0xffffffdc(%ebp)\r
+ 18f3a: c7 45 e0 7f b7 01 00 movl $0x1b77f,0xffffffe0(%ebp)\r
+ 18f41: c7 45 e4 84 b7 01 00 movl $0x1b784,0xffffffe4(%ebp)\r
+ 18f48: 83 ec 04 sub $0x4,%esp\r
+ 18f4b: 68 9b 00 00 00 push $0x9b\r
+ 18f50: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18f55: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18f5a: e8 01 0b 00 00 call 19a60 <_DbgPrint>\r
+ 18f5f: 83 c4 10 add $0x10,%esp\r
+ 18f62: 83 ec 0c sub $0xc,%esp\r
+ 18f65: 68 8e b7 01 00 push $0x1b78e\r
+ 18f6a: e8 f1 0a 00 00 call 19a60 <_DbgPrint>\r
+ 18f6f: 83 c4 10 add $0x10,%esp\r
+ 18f72: 83 ec 04 sub $0x4,%esp\r
+ 18f75: 68 9d 00 00 00 push $0x9d\r
+ 18f7a: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18f7f: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18f84: e8 d7 0a 00 00 call 19a60 <_DbgPrint>\r
+ 18f89: 83 c4 10 add $0x10,%esp\r
+ 18f8c: 83 ec 04 sub $0x4,%esp\r
+ 18f8f: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 18f92: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18f95: 8a 00 mov (%eax),%al\r
+ 18f97: 25 ff 00 00 00 and $0xff,%eax\r
+ 18f9c: 50 push %eax\r
+ 18f9d: 68 a0 b7 01 00 push $0x1b7a0\r
+ 18fa2: e8 b9 0a 00 00 call 19a60 <_DbgPrint>\r
+ 18fa7: 83 c4 10 add $0x10,%esp\r
+ 18faa: 83 ec 04 sub $0x4,%esp\r
+ 18fad: 68 9e 00 00 00 push $0x9e\r
+ 18fb2: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18fb7: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18fbc: e8 9f 0a 00 00 call 19a60 <_DbgPrint>\r
+ 18fc1: 83 c4 10 add $0x10,%esp\r
+ 18fc4: 83 ec 08 sub $0x8,%esp\r
+ 18fc7: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 18fca: 8a 40 01 mov 0x1(%eax),%al\r
+ 18fcd: 25 ff 00 00 00 and $0xff,%eax\r
+ 18fd2: 50 push %eax\r
+ 18fd3: 68 c4 b7 01 00 push $0x1b7c4\r
+ 18fd8: e8 83 0a 00 00 call 19a60 <_DbgPrint>\r
+ 18fdd: 83 c4 10 add $0x10,%esp\r
+ 18fe0: 83 ec 04 sub $0x4,%esp\r
+ 18fe3: 68 a2 00 00 00 push $0xa2\r
+ 18fe8: 68 c4 b2 01 00 push $0x1b2c4\r
+ 18fed: 68 d0 b2 01 00 push $0x1b2d0\r
+ 18ff2: e8 69 0a 00 00 call 19a60 <_DbgPrint>\r
+ 18ff7: 83 c4 10 add $0x10,%esp\r
+ 18ffa: 83 ec 04 sub $0x4,%esp\r
+ 18ffd: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 19000: 8a 40 03 mov 0x3(%eax),%al\r
+ 19003: 25 ff 00 00 00 and $0xff,%eax\r
+ 19008: 83 e0 03 and $0x3,%eax\r
+ 1900b: 85 c0 test %eax,%eax\r
+ 1900d: 74 21 je 19030 <_usb_show_endpoint_descriptor+0x139>\r
+ 1900f: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 19012: 80 78 02 00 cmpb $0x0,0x2(%eax)\r
+ 19016: 79 09 jns 19021 <_usb_show_endpoint_descriptor+0x12a>\r
+ 19018: c7 45 cc e8 b7 01 00 movl $0x1b7e8,0xffffffcc(%ebp)\r
+ 1901f: eb 07 jmp 19028 <_usb_show_endpoint_descriptor+0x131>\r
+ 19021: c7 45 cc eb b7 01 00 movl $0x1b7eb,0xffffffcc(%ebp)\r
+ 19028: 8b 45 cc mov 0xffffffcc(%ebp),%eax\r
+ 1902b: 89 45 d0 mov %eax,0xffffffd0(%ebp)\r
+ 1902e: eb 07 jmp 19037 <_usb_show_endpoint_descriptor+0x140>\r
+ 19030: c7 45 d0 ef b7 01 00 movl $0x1b7ef,0xffffffd0(%ebp)\r
+ 19037: ff 75 d0 pushl 0xffffffd0(%ebp)\r
+ 1903a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1903d: 8a 40 02 mov 0x2(%eax),%al\r
+ 19040: 25 ff 00 00 00 and $0xff,%eax\r
+ 19045: 50 push %eax\r
+ 19046: 68 f4 b7 01 00 push $0x1b7f4\r
+ 1904b: e8 10 0a 00 00 call 19a60 <_DbgPrint>\r
+ 19050: 83 c4 10 add $0x10,%esp\r
+ 19053: 83 ec 04 sub $0x4,%esp\r
+ 19056: 68 a4 00 00 00 push $0xa4\r
+ 1905b: 68 c4 b2 01 00 push $0x1b2c4\r
+ 19060: 68 d0 b2 01 00 push $0x1b2d0\r
+ 19065: e8 f6 09 00 00 call 19a60 <_DbgPrint>\r
+ 1906a: 83 c4 10 add $0x10,%esp\r
+ 1906d: 83 ec 04 sub $0x4,%esp\r
+ 19070: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 19073: 8a 40 03 mov 0x3(%eax),%al\r
+ 19076: 25 ff 00 00 00 and $0xff,%eax\r
+ 1907b: 83 e0 03 and $0x3,%eax\r
+ 1907e: ff 74 85 d8 pushl 0xffffffd8(%ebp,%eax,4)\r
+ 19082: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 19085: 8a 40 03 mov 0x3(%eax),%al\r
+ 19088: 25 ff 00 00 00 and $0xff,%eax\r
+ 1908d: 50 push %eax\r
+ 1908e: 68 20 b8 01 00 push $0x1b820\r
+ 19093: e8 c8 09 00 00 call 19a60 <_DbgPrint>\r
+ 19098: 83 c4 10 add $0x10,%esp\r
+ 1909b: 83 ec 04 sub $0x4,%esp\r
+ 1909e: 68 a5 00 00 00 push $0xa5\r
+ 190a3: 68 c4 b2 01 00 push $0x1b2c4\r
+ 190a8: 68 d0 b2 01 00 push $0x1b2d0\r
+ 190ad: e8 ae 09 00 00 call 19a60 <_DbgPrint>\r
+ 190b2: 83 c4 10 add $0x10,%esp\r
+ 190b5: 83 ec 08 sub $0x8,%esp\r
+ 190b8: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 190bb: 66 8b 40 04 mov 0x4(%eax),%ax\r
+ 190bf: 25 ff ff 00 00 and $0xffff,%eax\r
+ 190c4: 50 push %eax\r
+ 190c5: 68 4c b8 01 00 push $0x1b84c\r
+ 190ca: e8 91 09 00 00 call 19a60 <_DbgPrint>\r
+ 190cf: 83 c4 10 add $0x10,%esp\r
+ 190d2: 83 ec 04 sub $0x4,%esp\r
+ 190d5: 68 a6 00 00 00 push $0xa6\r
+ 190da: 68 c4 b2 01 00 push $0x1b2c4\r
+ 190df: 68 d0 b2 01 00 push $0x1b2d0\r
+ 190e4: e8 77 09 00 00 call 19a60 <_DbgPrint>\r
+ 190e9: 83 c4 10 add $0x10,%esp\r
+ 190ec: 83 ec 08 sub $0x8,%esp\r
+ 190ef: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 190f2: 8a 40 06 mov 0x6(%eax),%al\r
+ 190f5: 25 ff 00 00 00 and $0xff,%eax\r
+ 190fa: 50 push %eax\r
+ 190fb: 68 70 b8 01 00 push $0x1b870\r
+ 19100: e8 5b 09 00 00 call 19a60 <_DbgPrint>\r
+ 19105: 83 c4 10 add $0x10,%esp\r
+ 19108: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1910b: 80 38 09 cmpb $0x9,(%eax)\r
+ 1910e: 75 6c jne 1917c <_usb_show_endpoint_descriptor+0x285>\r
+ 19110: 83 ec 04 sub $0x4,%esp\r
+ 19113: 68 aa 00 00 00 push $0xaa\r
+ 19118: 68 c4 b2 01 00 push $0x1b2c4\r
+ 1911d: 68 d0 b2 01 00 push $0x1b2d0\r
+ 19122: e8 39 09 00 00 call 19a60 <_DbgPrint>\r
+ 19127: 83 c4 10 add $0x10,%esp\r
+ 1912a: 83 ec 08 sub $0x8,%esp\r
+ 1912d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 19130: 8a 40 07 mov 0x7(%eax),%al\r
+ 19133: 25 ff 00 00 00 and $0xff,%eax\r
+ 19138: 50 push %eax\r
+ 19139: 68 94 b8 01 00 push $0x1b894\r
+ 1913e: e8 1d 09 00 00 call 19a60 <_DbgPrint>\r
+ 19143: 83 c4 10 add $0x10,%esp\r
+ 19146: 83 ec 04 sub $0x4,%esp\r
+ 19149: 68 ab 00 00 00 push $0xab\r
+ 1914e: 68 c4 b2 01 00 push $0x1b2c4\r
+ 19153: 68 d0 b2 01 00 push $0x1b2d0\r
+ 19158: e8 03 09 00 00 call 19a60 <_DbgPrint>\r
+ 1915d: 83 c4 10 add $0x10,%esp\r
+ 19160: 83 ec 08 sub $0x8,%esp\r
+ 19163: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 19166: 8a 40 08 mov 0x8(%eax),%al\r
+ 19169: 25 ff 00 00 00 and $0xff,%eax\r
+ 1916e: 50 push %eax\r
+ 1916f: 68 b8 b8 01 00 push $0x1b8b8\r
+ 19174: e8 e7 08 00 00 call 19a60 <_DbgPrint>\r
+ 19179: 83 c4 10 add $0x10,%esp\r
+ 1917c: c9 leave \r
+ 1917d: c3 ret \r
+\r
+0001917e <_usb_show_string>:\r
+ 1917e: 55 push %ebp\r
+ 1917f: 89 e5 mov %esp,%ebp\r
+ 19181: 83 ec 08 sub $0x8,%esp\r
+ 19184: 83 7d 10 00 cmpl $0x0,0x10(%ebp)\r
+ 19188: 75 02 jne 1918c <_usb_show_string+0xe>\r
+ 1918a: eb 42 jmp 191ce <_usb_show_string+0x50>\r
+ 1918c: 83 ec 08 sub $0x8,%esp\r
+ 1918f: 68 00 01 00 00 push $0x100\r
+ 19194: 6a 01 push $0x1\r
+ 19196: e8 95 08 00 00 call 19a30 <_ExAllocatePool@8>\r
+ 1919b: 83 c4 08 add $0x8,%esp\r
+ 1919e: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 191a1: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 191a4: 85 c0 test %eax,%eax\r
+ 191a6: 75 02 jne 191aa <_usb_show_string+0x2c>\r
+ 191a8: eb 24 jmp 191ce <_usb_show_string+0x50>\r
+ 191aa: 68 00 01 00 00 push $0x100\r
+ 191af: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 191b2: ff 75 10 pushl 0x10(%ebp)\r
+ 191b5: ff 75 08 pushl 0x8(%ebp)\r
+ 191b8: e8 26 8a ff ff call 11be3 <_usb_string>\r
+ 191bd: 83 c4 10 add $0x10,%esp\r
+ 191c0: 83 ec 0c sub $0xc,%esp\r
+ 191c3: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 191c6: e8 75 08 00 00 call 19a40 <_ExFreePool@4>\r
+ 191cb: 83 c4 0c add $0xc,%esp\r
+ 191ce: c9 leave \r
+ 191cf: c3 ret \r
+\r
+000191d0 <_usb_dump_urb>:\r
+ 191d0: 55 push %ebp\r
+ 191d1: 89 e5 mov %esp,%ebp\r
+ 191d3: 83 ec 08 sub $0x8,%esp\r
+ 191d6: 83 ec 04 sub $0x4,%esp\r
+ 191d9: 68 be 00 00 00 push $0xbe\r
+ 191de: 68 c4 b2 01 00 push $0x1b2c4\r
+ 191e3: 68 d0 b2 01 00 push $0x1b2d0\r
+ 191e8: e8 73 08 00 00 call 19a60 <_DbgPrint>\r
+ 191ed: 83 c4 10 add $0x10,%esp\r
+ 191f0: 83 ec 08 sub $0x8,%esp\r
+ 191f3: ff 75 08 pushl 0x8(%ebp)\r
+ 191f6: 68 dc b8 01 00 push $0x1b8dc\r
+ 191fb: e8 60 08 00 00 call 19a60 <_DbgPrint>\r
+ 19200: 83 c4 10 add $0x10,%esp\r
+ 19203: 83 ec 04 sub $0x4,%esp\r
+ 19206: 68 bf 00 00 00 push $0xbf\r
+ 1920b: 68 c4 b2 01 00 push $0x1b2c4\r
+ 19210: 68 d0 b2 01 00 push $0x1b2d0\r
+ 19215: e8 46 08 00 00 call 19a60 <_DbgPrint>\r
+ 1921a: 83 c4 10 add $0x10,%esp\r
+ 1921d: 83 ec 08 sub $0x8,%esp\r
+ 19220: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 19223: ff 70 14 pushl 0x14(%eax)\r
+ 19226: 68 f7 b8 01 00 push $0x1b8f7\r
+ 1922b: e8 30 08 00 00 call 19a60 <_DbgPrint>\r
+ 19230: 83 c4 10 add $0x10,%esp\r
+ 19233: 83 ec 04 sub $0x4,%esp\r
+ 19236: 68 c0 00 00 00 push $0xc0\r
+ 1923b: 68 c4 b2 01 00 push $0x1b2c4\r
+ 19240: 68 d0 b2 01 00 push $0x1b2d0\r
+ 19245: e8 16 08 00 00 call 19a60 <_DbgPrint>\r
+ 1924a: 83 c4 10 add $0x10,%esp\r
+ 1924d: 83 ec 08 sub $0x8,%esp\r
+ 19250: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 19253: ff 70 18 pushl 0x18(%eax)\r
+ 19256: 68 12 b9 01 00 push $0x1b912\r
+ 1925b: e8 00 08 00 00 call 19a60 <_DbgPrint>\r
+ 19260: 83 c4 10 add $0x10,%esp\r
+ 19263: 83 ec 04 sub $0x4,%esp\r
+ 19266: 68 c1 00 00 00 push $0xc1\r
+ 1926b: 68 c4 b2 01 00 push $0x1b2c4\r
+ 19270: 68 d0 b2 01 00 push $0x1b2d0\r
+ 19275: e8 e6 07 00 00 call 19a60 <_DbgPrint>\r
+ 1927a: 83 c4 10 add $0x10,%esp\r
+ 1927d: 83 ec 08 sub $0x8,%esp\r
+ 19280: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 19283: ff 70 1c pushl 0x1c(%eax)\r
+ 19286: 68 2f b9 01 00 push $0x1b92f\r
+ 1928b: e8 d0 07 00 00 call 19a60 <_DbgPrint>\r
+ 19290: 83 c4 10 add $0x10,%esp\r
+ 19293: 83 ec 04 sub $0x4,%esp\r
+ 19296: 68 c2 00 00 00 push $0xc2\r
+ 1929b: 68 c4 b2 01 00 push $0x1b2c4\r
+ 192a0: 68 d0 b2 01 00 push $0x1b2d0\r
+ 192a5: e8 b6 07 00 00 call 19a60 <_DbgPrint>\r
+ 192aa: 83 c4 10 add $0x10,%esp\r
+ 192ad: 83 ec 08 sub $0x8,%esp\r
+ 192b0: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 192b3: ff 70 20 pushl 0x20(%eax)\r
+ 192b6: 68 4a b9 01 00 push $0x1b94a\r
+ 192bb: e8 a0 07 00 00 call 19a60 <_DbgPrint>\r
+ 192c0: 83 c4 10 add $0x10,%esp\r
+ 192c3: 83 ec 04 sub $0x4,%esp\r
+ 192c6: 68 c3 00 00 00 push $0xc3\r
+ 192cb: 68 c4 b2 01 00 push $0x1b2c4\r
+ 192d0: 68 d0 b2 01 00 push $0x1b2d0\r
+ 192d5: e8 86 07 00 00 call 19a60 <_DbgPrint>\r
+ 192da: 83 c4 10 add $0x10,%esp\r
+ 192dd: 83 ec 08 sub $0x8,%esp\r
+ 192e0: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 192e3: ff 70 24 pushl 0x24(%eax)\r
+ 192e6: 68 67 b9 01 00 push $0x1b967\r
+ 192eb: e8 70 07 00 00 call 19a60 <_DbgPrint>\r
+ 192f0: 83 c4 10 add $0x10,%esp\r
+ 192f3: 83 ec 04 sub $0x4,%esp\r
+ 192f6: 68 c4 00 00 00 push $0xc4\r
+ 192fb: 68 c4 b2 01 00 push $0x1b2c4\r
+ 19300: 68 d0 b2 01 00 push $0x1b2d0\r
+ 19305: e8 56 07 00 00 call 19a60 <_DbgPrint>\r
+ 1930a: 83 c4 10 add $0x10,%esp\r
+ 1930d: 83 ec 08 sub $0x8,%esp\r
+ 19310: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 19313: ff 70 2c pushl 0x2c(%eax)\r
+ 19316: 68 82 b9 01 00 push $0x1b982\r
+ 1931b: e8 40 07 00 00 call 19a60 <_DbgPrint>\r
+ 19320: 83 c4 10 add $0x10,%esp\r
+ 19323: 83 ec 04 sub $0x4,%esp\r
+ 19326: 68 c5 00 00 00 push $0xc5\r
+ 1932b: 68 c4 b2 01 00 push $0x1b2c4\r
+ 19330: 68 d0 b2 01 00 push $0x1b2d0\r
+ 19335: e8 26 07 00 00 call 19a60 <_DbgPrint>\r
+ 1933a: 83 c4 10 add $0x10,%esp\r
+ 1933d: 83 ec 08 sub $0x8,%esp\r
+ 19340: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 19343: ff 70 30 pushl 0x30(%eax)\r
+ 19346: 68 9d b9 01 00 push $0x1b99d\r
+ 1934b: e8 10 07 00 00 call 19a60 <_DbgPrint>\r
+ 19350: 83 c4 10 add $0x10,%esp\r
+ 19353: 83 ec 04 sub $0x4,%esp\r
+ 19356: 68 c6 00 00 00 push $0xc6\r
+ 1935b: 68 c4 b2 01 00 push $0x1b2c4\r
+ 19360: 68 d0 b2 01 00 push $0x1b2d0\r
+ 19365: e8 f6 06 00 00 call 19a60 <_DbgPrint>\r
+ 1936a: 83 c4 10 add $0x10,%esp\r
+ 1936d: 83 ec 08 sub $0x8,%esp\r
+ 19370: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 19373: ff 70 38 pushl 0x38(%eax)\r
+ 19376: 68 b8 b9 01 00 push $0x1b9b8\r
+ 1937b: e8 e0 06 00 00 call 19a60 <_DbgPrint>\r
+ 19380: 83 c4 10 add $0x10,%esp\r
+ 19383: 83 ec 04 sub $0x4,%esp\r
+ 19386: 68 c7 00 00 00 push $0xc7\r
+ 1938b: 68 c4 b2 01 00 push $0x1b2c4\r
+ 19390: 68 d0 b2 01 00 push $0x1b2d0\r
+ 19395: e8 c6 06 00 00 call 19a60 <_DbgPrint>\r
+ 1939a: 83 c4 10 add $0x10,%esp\r
+ 1939d: 83 ec 08 sub $0x8,%esp\r
+ 193a0: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 193a3: ff 70 40 pushl 0x40(%eax)\r
+ 193a6: 68 d3 b9 01 00 push $0x1b9d3\r
+ 193ab: e8 b0 06 00 00 call 19a60 <_DbgPrint>\r
+ 193b0: 83 c4 10 add $0x10,%esp\r
+ 193b3: 83 ec 04 sub $0x4,%esp\r
+ 193b6: 68 c8 00 00 00 push $0xc8\r
+ 193bb: 68 c4 b2 01 00 push $0x1b2c4\r
+ 193c0: 68 d0 b2 01 00 push $0x1b2d0\r
+ 193c5: e8 96 06 00 00 call 19a60 <_DbgPrint>\r
+ 193ca: 83 c4 10 add $0x10,%esp\r
+ 193cd: 83 ec 08 sub $0x8,%esp\r
+ 193d0: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 193d3: ff 70 44 pushl 0x44(%eax)\r
+ 193d6: 68 ee b9 01 00 push $0x1b9ee\r
+ 193db: e8 80 06 00 00 call 19a60 <_DbgPrint>\r
+ 193e0: 83 c4 10 add $0x10,%esp\r
+ 193e3: 83 ec 04 sub $0x4,%esp\r
+ 193e6: 68 c9 00 00 00 push $0xc9\r
+ 193eb: 68 c4 b2 01 00 push $0x1b2c4\r
+ 193f0: 68 d0 b2 01 00 push $0x1b2d0\r
+ 193f5: e8 66 06 00 00 call 19a60 <_DbgPrint>\r
+ 193fa: 83 c4 10 add $0x10,%esp\r
+ 193fd: 83 ec 08 sub $0x8,%esp\r
+ 19400: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 19403: ff 70 48 pushl 0x48(%eax)\r
+ 19406: 68 09 ba 01 00 push $0x1ba09\r
+ 1940b: e8 50 06 00 00 call 19a60 <_DbgPrint>\r
+ 19410: 83 c4 10 add $0x10,%esp\r
+ 19413: 83 ec 04 sub $0x4,%esp\r
+ 19416: 68 ca 00 00 00 push $0xca\r
+ 1941b: 68 c4 b2 01 00 push $0x1b2c4\r
+ 19420: 68 d0 b2 01 00 push $0x1b2d0\r
+ 19425: e8 36 06 00 00 call 19a60 <_DbgPrint>\r
+ 1942a: 83 c4 10 add $0x10,%esp\r
+ 1942d: 83 ec 08 sub $0x8,%esp\r
+ 19430: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 19433: ff 70 4c pushl 0x4c(%eax)\r
+ 19436: 68 24 ba 01 00 push $0x1ba24\r
+ 1943b: e8 20 06 00 00 call 19a60 <_DbgPrint>\r
+ 19440: 83 c4 10 add $0x10,%esp\r
+ 19443: 83 ec 04 sub $0x4,%esp\r
+ 19446: 68 cb 00 00 00 push $0xcb\r
+ 1944b: 68 c4 b2 01 00 push $0x1b2c4\r
+ 19450: 68 d0 b2 01 00 push $0x1b2d0\r
+ 19455: e8 06 06 00 00 call 19a60 <_DbgPrint>\r
+ 1945a: 83 c4 10 add $0x10,%esp\r
+ 1945d: 83 ec 08 sub $0x8,%esp\r
+ 19460: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 19463: ff 70 54 pushl 0x54(%eax)\r
+ 19466: 68 3f ba 01 00 push $0x1ba3f\r
+ 1946b: e8 f0 05 00 00 call 19a60 <_DbgPrint>\r
+ 19470: 83 c4 10 add $0x10,%esp\r
+ 19473: 83 ec 04 sub $0x4,%esp\r
+ 19476: 68 cc 00 00 00 push $0xcc\r
+ 1947b: 68 c4 b2 01 00 push $0x1b2c4\r
+ 19480: 68 d0 b2 01 00 push $0x1b2d0\r
+ 19485: e8 d6 05 00 00 call 19a60 <_DbgPrint>\r
+ 1948a: 83 c4 10 add $0x10,%esp\r
+ 1948d: 83 ec 08 sub $0x8,%esp\r
+ 19490: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 19493: ff 70 58 pushl 0x58(%eax)\r
+ 19496: 68 5a ba 01 00 push $0x1ba5a\r
+ 1949b: e8 c0 05 00 00 call 19a60 <_DbgPrint>\r
+ 194a0: 83 c4 10 add $0x10,%esp\r
+ 194a3: c9 leave \r
+ 194a4: c3 ret \r
+ 194a5: 90 nop \r
+ 194a6: 90 nop \r
+ 194a7: 90 nop \r
+ 194a8: 90 nop \r
+ 194a9: 90 nop \r
+ 194aa: 90 nop \r
+ 194ab: 90 nop \r
+ 194ac: 90 nop \r
+ 194ad: 90 nop \r
+ 194ae: 90 nop \r
+ 194af: 90 nop \r
+\r
+000194b0 <_wait_ms>:\r
+ 194b0: 55 push %ebp\r
+ 194b1: 89 e5 mov %esp,%ebp\r
+ 194b3: 83 ec 08 sub $0x8,%esp\r
+ 194b6: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 194b9: 89 d0 mov %edx,%eax\r
+ 194bb: c1 e0 02 shl $0x2,%eax\r
+ 194be: 01 d0 add %edx,%eax\r
+ 194c0: 01 c0 add %eax,%eax\r
+ 194c2: f7 d8 neg %eax\r
+ 194c4: 99 cltd \r
+ 194c5: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 194c8: 89 55 fc mov %edx,0xfffffffc(%ebp)\r
+ 194cb: 83 ec 04 sub $0x4,%esp\r
+ 194ce: 8d 45 f8 lea 0xfffffff8(%ebp),%eax\r
+ 194d1: 50 push %eax\r
+ 194d2: 6a 00 push $0x0\r
+ 194d4: 6a 00 push $0x0\r
+ 194d6: e8 f5 05 00 00 call 19ad0 <_KeDelayExecutionThread@12>\r
+ 194db: 83 c4 04 add $0x4,%esp\r
+ 194de: c9 leave \r
+ 194df: c3 ret \r
+\r
+000194e0 <_init_wrapper>:\r
+ 194e0: 55 push %ebp\r
+ 194e1: 89 e5 mov %esp,%ebp\r
+ 194e3: 83 ec 04 sub $0x4,%esp\r
+ 194e6: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 194ed: 83 7d fc 13 cmpl $0x13,0xfffffffc(%ebp)\r
+ 194f1: 7f 15 jg 19508 <_init_wrapper+0x28>\r
+ 194f3: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 194f6: c7 04 85 60 c1 01 00 movl $0x0,0x1c160(,%eax,4)\r
+ 194fd: 00 00 00 00 \r
+ 19501: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 19504: ff 00 incl (%eax)\r
+ 19506: eb e5 jmp 194ed <_init_wrapper+0xd>\r
+ 19508: c7 05 40 c2 01 00 00 movl $0x0,0x1c240\r
+ 1950f: 00 00 00 \r
+ 19512: c7 05 40 c1 01 00 00 movl $0x0,0x1c140\r
+ 19519: 00 00 00 \r
+ 1951c: c7 05 30 c2 01 00 80 movl $0x1c080,0x1c230\r
+ 19523: c0 01 00 \r
+ 19526: c7 05 88 c0 01 00 00 movl $0x0,0x1c088\r
+ 1952d: 00 00 00 \r
+ 19530: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 19537: 83 7d fc 07 cmpl $0x7,0xfffffffc(%ebp)\r
+ 1953b: 7f 33 jg 19570 <_init_wrapper+0x90>\r
+ 1953d: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 19540: 89 d0 mov %edx,%eax\r
+ 19542: 01 c0 add %eax,%eax\r
+ 19544: 01 d0 add %edx,%eax\r
+ 19546: c1 e0 02 shl $0x2,%eax\r
+ 19549: c7 80 d0 c1 01 00 00 movl $0x0,0x1c1d0(%eax)\r
+ 19550: 00 00 00 \r
+ 19553: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 19556: 89 d0 mov %edx,%eax\r
+ 19558: 01 c0 add %eax,%eax\r
+ 1955a: 01 d0 add %edx,%eax\r
+ 1955c: c1 e0 02 shl $0x2,%eax\r
+ 1955f: c7 80 d4 c1 01 00 ff movl $0xffffffff,0x1c1d4(%eax)\r
+ 19566: ff ff ff \r
+ 19569: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 1956c: ff 00 incl (%eax)\r
+ 1956e: eb c7 jmp 19537 <_init_wrapper+0x57>\r
+ 19570: c7 05 b8 c0 01 00 00 movl $0x0,0x1c0b8\r
+ 19577: 00 00 00 \r
+ 1957a: c7 05 c0 c1 01 00 00 movl $0x0,0x1c1c0\r
+ 19581: 00 00 00 \r
+ 19584: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 1958b: 83 7d fc 07 cmpl $0x7,0xfffffffc(%ebp)\r
+ 1958f: 7f 15 jg 195a6 <_init_wrapper+0xc6>\r
+ 19591: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 19594: c7 04 85 98 c0 01 00 movl $0x0,0x1c098(,%eax,4)\r
+ 1959b: 00 00 00 00 \r
+ 1959f: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 195a2: ff 00 incl (%eax)\r
+ 195a4: eb e5 jmp 1958b <_init_wrapper+0xab>\r
+ 195a6: c9 leave \r
+ 195a7: c3 ret \r
+\r
+000195a8 <_handle_irqs>:\r
+ 195a8: 55 push %ebp\r
+ 195a9: 89 e5 mov %esp,%ebp\r
+ 195ab: 83 ec 08 sub $0x8,%esp\r
+ 195ae: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 195b5: 83 7d fc 07 cmpl $0x7,0xfffffffc(%ebp)\r
+ 195b9: 0f 8f 86 00 00 00 jg 19645 <_handle_irqs+0x9d>\r
+ 195bf: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 195c2: 89 c2 mov %eax,%edx\r
+ 195c4: 01 d2 add %edx,%edx\r
+ 195c6: 01 c2 add %eax,%edx\r
+ 195c8: 8d 04 95 00 00 00 00 lea 0x0(,%edx,4),%eax\r
+ 195cf: 83 b8 d0 c1 01 00 00 cmpl $0x0,0x1c1d0(%eax)\r
+ 195d6: 74 63 je 1963b <_handle_irqs+0x93>\r
+ 195d8: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 195db: 89 d0 mov %edx,%eax\r
+ 195dd: 01 c0 add %eax,%eax\r
+ 195df: 01 d0 add %edx,%eax\r
+ 195e1: c1 e0 02 shl $0x2,%eax\r
+ 195e4: 8b 80 d4 c1 01 00 mov 0x1c1d4(%eax),%eax\r
+ 195ea: 3b 45 08 cmp 0x8(%ebp),%eax\r
+ 195ed: 74 08 je 195f7 <_handle_irqs+0x4f>\r
+ 195ef: 83 7d 08 ff cmpl $0xffffffff,0x8(%ebp)\r
+ 195f3: 74 02 je 195f7 <_handle_irqs+0x4f>\r
+ 195f5: eb 44 jmp 1963b <_handle_irqs+0x93>\r
+ 195f7: 83 ec 04 sub $0x4,%esp\r
+ 195fa: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 195fd: 89 d0 mov %edx,%eax\r
+ 195ff: 01 c0 add %eax,%eax\r
+ 19601: 01 d0 add %edx,%eax\r
+ 19603: 8d 0c 85 00 00 00 00 lea 0x0(,%eax,4),%ecx\r
+ 1960a: 6a 00 push $0x0\r
+ 1960c: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 1960f: 89 d0 mov %edx,%eax\r
+ 19611: 01 c0 add %eax,%eax\r
+ 19613: 01 d0 add %edx,%eax\r
+ 19615: c1 e0 02 shl $0x2,%eax\r
+ 19618: ff b0 d8 c1 01 00 pushl 0x1c1d8(%eax)\r
+ 1961e: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 19621: 89 d0 mov %edx,%eax\r
+ 19623: 01 c0 add %eax,%eax\r
+ 19625: 01 d0 add %edx,%eax\r
+ 19627: c1 e0 02 shl $0x2,%eax\r
+ 1962a: ff b0 d4 c1 01 00 pushl 0x1c1d4(%eax)\r
+ 19630: 8b 81 d0 c1 01 00 mov 0x1c1d0(%ecx),%eax\r
+ 19636: ff d0 call *%eax\r
+ 19638: 83 c4 10 add $0x10,%esp\r
+ 1963b: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 1963e: ff 00 incl (%eax)\r
+ 19640: e9 70 ff ff ff jmp 195b5 <_handle_irqs+0xd>\r
+ 19645: c9 leave \r
+ 19646: c3 ret \r
+\r
+00019647 <_inc_jiffies>:\r
+ 19647: 55 push %ebp\r
+ 19648: 89 e5 mov %esp,%ebp\r
+ 1964a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1964d: 01 05 40 c2 01 00 add %eax,0x1c240\r
+ 19653: 5d pop %ebp\r
+ 19654: c3 ret \r
+\r
+00019655 <_do_all_timers>:\r
+ 19655: 55 push %ebp\r
+ 19656: 89 e5 mov %esp,%ebp\r
+ 19658: 83 ec 18 sub $0x18,%esp\r
+ 1965b: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 19662: 83 7d fc 13 cmpl $0x13,0xfffffffc(%ebp)\r
+ 19666: 0f 8f 82 00 00 00 jg 196ee <_do_all_timers+0x99>\r
+ 1966c: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1966f: 83 3c 85 60 c1 01 00 cmpl $0x0,0x1c160(,%eax,4)\r
+ 19676: 00 \r
+ 19677: 74 6b je 196e4 <_do_all_timers+0x8f>\r
+ 19679: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1967c: 8b 04 85 60 c1 01 00 mov 0x1c160(,%eax,4),%eax\r
+ 19683: 83 38 00 cmpl $0x0,(%eax)\r
+ 19686: 74 5c je 196e4 <_do_all_timers+0x8f>\r
+ 19688: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1968b: 8b 04 85 60 c1 01 00 mov 0x1c160(,%eax,4),%eax\r
+ 19692: 83 78 08 00 cmpl $0x0,0x8(%eax)\r
+ 19696: 74 4c je 196e4 <_do_all_timers+0x8f>\r
+ 19698: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1969b: 8b 04 85 60 c1 01 00 mov 0x1c160(,%eax,4),%eax\r
+ 196a2: 8b 00 mov (%eax),%eax\r
+ 196a4: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 196a7: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 196aa: 8b 04 85 60 c1 01 00 mov 0x1c160(,%eax,4),%eax\r
+ 196b1: 8b 40 04 mov 0x4(%eax),%eax\r
+ 196b4: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 196b7: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 196ba: 8b 04 85 60 c1 01 00 mov 0x1c160(,%eax,4),%eax\r
+ 196c1: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax)\r
+ 196c8: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 196cb: c7 04 85 60 c1 01 00 movl $0x0,0x1c160(,%eax,4)\r
+ 196d2: 00 00 00 00 \r
+ 196d6: 83 ec 0c sub $0xc,%esp\r
+ 196d9: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 196dc: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 196df: ff d0 call *%eax\r
+ 196e1: 83 c4 10 add $0x10,%esp\r
+ 196e4: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 196e7: ff 00 incl (%eax)\r
+ 196e9: e9 74 ff ff ff jmp 19662 <_do_all_timers+0xd>\r
+ 196ee: c9 leave \r
+ 196ef: c3 ret \r
+\r
+000196f0 <_my_kernel_thread>:\r
+ 196f0: 55 push %ebp\r
+ 196f1: 89 e5 mov %esp,%ebp\r
+ 196f3: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 196f6: a3 50 c1 01 00 mov %eax,0x1c150\r
+ 196fb: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 196fe: a3 b0 c1 01 00 mov %eax,0x1c1b0\r
+ 19703: b8 2a 00 00 00 mov $0x2a,%eax\r
+ 19708: 5d pop %ebp\r
+ 19709: c3 ret \r
+\r
+0001970a <_my_device_add>:\r
+ 1970a: 55 push %ebp\r
+ 1970b: 89 e5 mov %esp,%ebp\r
+ 1970d: 83 ec 18 sub $0x18,%esp\r
+ 19710: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 19717: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1971a: 83 b8 98 00 00 00 00 cmpl $0x0,0x98(%eax)\r
+ 19721: 74 32 je 19755 <_my_device_add+0x4b>\r
+ 19723: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 19726: 8b 80 98 00 00 00 mov 0x98(%eax),%eax\r
+ 1972c: 83 78 08 00 cmpl $0x0,0x8(%eax)\r
+ 19730: 0f 84 8d 00 00 00 je 197c3 <_my_device_add+0xb9>\r
+ 19736: 83 ec 0c sub $0xc,%esp\r
+ 19739: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1973c: 8b 80 98 00 00 00 mov 0x98(%eax),%eax\r
+ 19742: ff 75 08 pushl 0x8(%ebp)\r
+ 19745: 8b 40 08 mov 0x8(%eax),%eax\r
+ 19748: ff d0 call *%eax\r
+ 1974a: 83 c4 10 add $0x10,%esp\r
+ 1974d: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 19750: e9 82 00 00 00 jmp 197d7 <_my_device_add+0xcd>\r
+ 19755: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 1975c: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1975f: 3b 05 b8 c0 01 00 cmp 0x1c0b8,%eax\r
+ 19765: 7d 4d jge 197b4 <_my_device_add+0xaa>\r
+ 19767: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1976a: 8b 04 85 98 c0 01 00 mov 0x1c098(,%eax,4),%eax\r
+ 19771: 83 78 08 00 cmpl $0x0,0x8(%eax)\r
+ 19775: 74 36 je 197ad <_my_device_add+0xa3>\r
+ 19777: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 1977a: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1977d: 8b 04 85 98 c0 01 00 mov 0x1c098(,%eax,4),%eax\r
+ 19784: 89 82 98 00 00 00 mov %eax,0x98(%edx)\r
+ 1978a: 83 ec 0c sub $0xc,%esp\r
+ 1978d: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 19790: 8b 04 85 98 c0 01 00 mov 0x1c098(,%eax,4),%eax\r
+ 19797: ff 75 08 pushl 0x8(%ebp)\r
+ 1979a: 8b 40 08 mov 0x8(%eax),%eax\r
+ 1979d: ff d0 call *%eax\r
+ 1979f: 83 c4 10 add $0x10,%esp\r
+ 197a2: 85 c0 test %eax,%eax\r
+ 197a4: 75 07 jne 197ad <_my_device_add+0xa3>\r
+ 197a6: c7 45 f8 01 00 00 00 movl $0x1,0xfffffff8(%ebp)\r
+ 197ad: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 197b0: ff 00 incl (%eax)\r
+ 197b2: eb a8 jmp 1975c <_my_device_add+0x52>\r
+ 197b4: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 197b8: 74 09 je 197c3 <_my_device_add+0xb9>\r
+ 197ba: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 197c1: eb 14 jmp 197d7 <_my_device_add+0xcd>\r
+ 197c3: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 197c6: c7 80 98 00 00 00 00 movl $0x0,0x98(%eax)\r
+ 197cd: 00 00 00 \r
+ 197d0: c7 45 f4 ed ff ff ff movl $0xffffffed,0xfffffff4(%ebp)\r
+ 197d7: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 197da: c9 leave \r
+ 197db: c3 ret \r
+\r
+000197dc <_my_driver_register>:\r
+ 197dc: 55 push %ebp\r
+ 197dd: 89 e5 mov %esp,%ebp\r
+ 197df: 83 ec 04 sub $0x4,%esp\r
+ 197e2: 83 3d b8 c0 01 00 07 cmpl $0x7,0x1c0b8\r
+ 197e9: 7f 20 jg 1980b <_my_driver_register+0x2f>\r
+ 197eb: a1 b8 c0 01 00 mov 0x1c0b8,%eax\r
+ 197f0: 89 c2 mov %eax,%edx\r
+ 197f2: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 197f5: 89 04 95 98 c0 01 00 mov %eax,0x1c098(,%edx,4)\r
+ 197fc: ff 05 b8 c0 01 00 incl 0x1c0b8\r
+ 19802: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 19809: eb 07 jmp 19812 <_my_driver_register+0x36>\r
+ 1980b: c7 45 fc ff ff ff ff movl $0xffffffff,0xfffffffc(%ebp)\r
+ 19812: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 19815: c9 leave \r
+ 19816: c3 ret \r
+\r
+00019817 <_my_device_unregister>:\r
+ 19817: 55 push %ebp\r
+ 19818: 89 e5 mov %esp,%ebp\r
+ 1981a: 83 ec 08 sub $0x8,%esp\r
+ 1981d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 19820: 83 b8 98 00 00 00 00 cmpl $0x0,0x98(%eax)\r
+ 19827: 74 26 je 1984f <_my_device_unregister+0x38>\r
+ 19829: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1982c: 8b 80 98 00 00 00 mov 0x98(%eax),%eax\r
+ 19832: 83 78 0c 00 cmpl $0x0,0xc(%eax)\r
+ 19836: 74 17 je 1984f <_my_device_unregister+0x38>\r
+ 19838: 83 ec 0c sub $0xc,%esp\r
+ 1983b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1983e: 8b 80 98 00 00 00 mov 0x98(%eax),%eax\r
+ 19844: ff 75 08 pushl 0x8(%ebp)\r
+ 19847: 8b 40 0c mov 0xc(%eax),%eax\r
+ 1984a: ff d0 call *%eax\r
+ 1984c: 83 c4 10 add $0x10,%esp\r
+ 1984f: b8 00 00 00 00 mov $0x0,%eax\r
+ 19854: c9 leave \r
+ 19855: c3 ret \r
+\r
+00019856 <_my_get_device>:\r
+ 19856: 55 push %ebp\r
+ 19857: 89 e5 mov %esp,%ebp\r
+ 19859: b8 00 00 00 00 mov $0x0,%eax\r
+ 1985e: 5d pop %ebp\r
+ 1985f: c3 ret \r
+\r
+00019860 <_my_device_initialize>:\r
+ 19860: 55 push %ebp\r
+ 19861: 89 e5 mov %esp,%ebp\r
+ 19863: 5d pop %ebp\r
+ 19864: c3 ret \r
+\r
+00019865 <_my_wake_up>:\r
+ 19865: 55 push %ebp\r
+ 19866: 89 e5 mov %esp,%ebp\r
+ 19868: c7 05 c0 c1 01 00 01 movl $0x1,0x1c1c0\r
+ 1986f: 00 00 00 \r
+ 19872: 5d pop %ebp\r
+ 19873: c3 ret \r
+\r
+00019874 <_my_schedule_timeout>:\r
+ 19874: 55 push %ebp\r
+ 19875: 89 e5 mov %esp,%ebp\r
+ 19877: 83 ec 08 sub $0x8,%esp\r
+ 1987a: c7 45 fc 01 00 00 00 movl $0x1,0xfffffffc(%ebp)\r
+ 19881: 83 45 08 0a addl $0xa,0x8(%ebp)\r
+ 19885: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 19889: 7e 3e jle 198c9 <_my_schedule_timeout+0x55>\r
+ 1988b: e8 c5 fd ff ff call 19655 <_do_all_timers>\r
+ 19890: 83 ec 0c sub $0xc,%esp\r
+ 19893: 6a ff push $0xffffffff\r
+ 19895: e8 0e fd ff ff call 195a8 <_handle_irqs>\r
+ 1989a: 83 c4 10 add $0x10,%esp\r
+ 1989d: 83 3d c0 c1 01 00 00 cmpl $0x0,0x1c1c0\r
+ 198a4: 74 02 je 198a8 <_my_schedule_timeout+0x34>\r
+ 198a6: eb 21 jmp 198c9 <_my_schedule_timeout+0x55>\r
+ 198a8: 83 ec 0c sub $0xc,%esp\r
+ 198ab: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 198ae: e8 fd fb ff ff call 194b0 <_wait_ms>\r
+ 198b3: 83 c4 10 add $0x10,%esp\r
+ 198b6: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 198b9: e8 89 fd ff ff call 19647 <_inc_jiffies>\r
+ 198be: 83 c4 04 add $0x4,%esp\r
+ 198c1: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 198c4: 29 45 08 sub %eax,0x8(%ebp)\r
+ 198c7: eb bc jmp 19885 <_my_schedule_timeout+0x11>\r
+ 198c9: c7 05 c0 c1 01 00 00 movl $0x0,0x1c1c0\r
+ 198d0: 00 00 00 \r
+ 198d3: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 198d6: c9 leave \r
+ 198d7: c3 ret \r
+\r
+000198d8 <_my_wait_for_completion>:\r
+ 198d8: 55 push %ebp\r
+ 198d9: 89 e5 mov %esp,%ebp\r
+ 198db: 83 ec 08 sub $0x8,%esp\r
+ 198de: c7 45 fc 64 00 00 00 movl $0x64,0xfffffffc(%ebp)\r
+ 198e5: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 198e8: 83 38 00 cmpl $0x0,(%eax)\r
+ 198eb: 75 2c jne 19919 <_my_wait_for_completion+0x41>\r
+ 198ed: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 198f1: 7e 26 jle 19919 <_my_wait_for_completion+0x41>\r
+ 198f3: e8 5d fd ff ff call 19655 <_do_all_timers>\r
+ 198f8: 83 ec 0c sub $0xc,%esp\r
+ 198fb: 6a ff push $0xffffffff\r
+ 198fd: e8 a6 fc ff ff call 195a8 <_handle_irqs>\r
+ 19902: 83 c4 10 add $0x10,%esp\r
+ 19905: 83 ec 0c sub $0xc,%esp\r
+ 19908: 6a 0a push $0xa\r
+ 1990a: e8 a1 fb ff ff call 194b0 <_wait_ms>\r
+ 1990f: 83 c4 10 add $0x10,%esp\r
+ 19912: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 19915: ff 08 decl (%eax)\r
+ 19917: eb cc jmp 198e5 <_my_wait_for_completion+0xd>\r
+ 19919: c9 leave \r
+ 1991a: c3 ret \r
+\r
+0001991b <_my_pci_module_init>:\r
+ 1991b: 55 push %ebp\r
+ 1991c: 89 e5 mov %esp,%ebp\r
+ 1991e: 83 ec 18 sub $0x18,%esp\r
+ 19921: a1 88 c0 01 00 mov 0x1c088,%eax\r
+ 19926: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 19929: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 19930: 83 3d 88 c0 01 00 00 cmpl $0x0,0x1c088\r
+ 19937: 75 33 jne 1996c <_my_pci_module_init+0x51>\r
+ 19939: 83 ec 04 sub $0x4,%esp\r
+ 1993c: 68 ef 00 00 00 push $0xef\r
+ 19941: 68 78 ba 01 00 push $0x1ba78\r
+ 19946: 68 8e ba 01 00 push $0x1ba8e\r
+ 1994b: e8 10 01 00 00 call 19a60 <_DbgPrint>\r
+ 19950: 83 c4 10 add $0x10,%esp\r
+ 19953: 83 ec 0c sub $0xc,%esp\r
+ 19956: 68 97 ba 01 00 push $0x1ba97\r
+ 1995b: e8 00 01 00 00 call 19a60 <_DbgPrint>\r
+ 19960: 83 c4 10 add $0x10,%esp\r
+ 19963: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 1996a: eb 1b jmp 19987 <_my_pci_module_init+0x6c>\r
+ 1996c: 83 ec 08 sub $0x8,%esp\r
+ 1996f: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 19972: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 19975: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 19978: 8b 40 10 mov 0x10(%eax),%eax\r
+ 1997b: ff d0 call *%eax\r
+ 1997d: 83 c4 10 add $0x10,%esp\r
+ 19980: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 19987: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 1998a: c9 leave \r
+ 1998b: c3 ret \r
+\r
+0001998c <_my_pci_find_slot>:\r
+ 1998c: 55 push %ebp\r
+ 1998d: 89 e5 mov %esp,%ebp\r
+ 1998f: b8 00 00 00 00 mov $0x0,%eax\r
+ 19994: 5d pop %ebp\r
+ 19995: c3 ret \r
+\r
+00019996 <_my_request_irq>:\r
+ 19996: 55 push %ebp\r
+ 19997: 89 e5 mov %esp,%ebp\r
+ 19999: 83 ec 04 sub $0x4,%esp\r
+ 1999c: 83 3d 40 c1 01 00 07 cmpl $0x7,0x1c140\r
+ 199a3: 7f 63 jg 19a08 <_my_request_irq+0x72>\r
+ 199a5: 8b 15 40 c1 01 00 mov 0x1c140,%edx\r
+ 199ab: 89 d0 mov %edx,%eax\r
+ 199ad: 01 c0 add %eax,%eax\r
+ 199af: 01 d0 add %edx,%eax\r
+ 199b1: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 199b8: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 199bb: 89 82 d0 c1 01 00 mov %eax,0x1c1d0(%edx)\r
+ 199c1: 8b 15 40 c1 01 00 mov 0x1c140,%edx\r
+ 199c7: 89 d0 mov %edx,%eax\r
+ 199c9: 01 c0 add %eax,%eax\r
+ 199cb: 01 d0 add %edx,%eax\r
+ 199cd: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 199d4: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 199d7: 89 82 d4 c1 01 00 mov %eax,0x1c1d4(%edx)\r
+ 199dd: 8b 15 40 c1 01 00 mov 0x1c140,%edx\r
+ 199e3: 89 d0 mov %edx,%eax\r
+ 199e5: 01 c0 add %eax,%eax\r
+ 199e7: 01 d0 add %edx,%eax\r
+ 199e9: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 199f0: 8b 45 18 mov 0x18(%ebp),%eax\r
+ 199f3: 89 82 d8 c1 01 00 mov %eax,0x1c1d8(%edx)\r
+ 199f9: ff 05 40 c1 01 00 incl 0x1c140\r
+ 199ff: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 19a06: eb 07 jmp 19a0f <_my_request_irq+0x79>\r
+ 19a08: c7 45 fc 01 00 00 00 movl $0x1,0xfffffffc(%ebp)\r
+ 19a0f: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 19a12: c9 leave \r
+ 19a13: c3 ret \r
+\r
+00019a14 <_my_free_irq>:\r
+ 19a14: 55 push %ebp\r
+ 19a15: 89 e5 mov %esp,%ebp\r
+ 19a17: b8 00 00 00 00 mov $0x0,%eax\r
+ 19a1c: 5d pop %ebp\r
+ 19a1d: c3 ret \r
+ 19a1e: 90 nop \r
+ 19a1f: 90 nop \r
+\r
+00019a20 <_DriverEntry@8>:\r
+ 19a20: 55 push %ebp\r
+ 19a21: 89 e5 mov %esp,%ebp\r
+ 19a23: b8 00 00 00 00 mov $0x0,%eax\r
+ 19a28: 5d pop %ebp\r
+ 19a29: c2 08 00 ret $0x8\r
+ 19a2c: 90 nop \r
+ 19a2d: 90 nop \r
+ 19a2e: 90 nop \r
+ 19a2f: 90 nop \r
+\r
+00019a30 <_ExAllocatePool@8>:\r
+ 19a30: ff 25 64 e0 01 00 jmp *0x1e064\r
+ 19a36: 90 nop \r
+ 19a37: 90 nop \r
+ ...\r
+\r
+00019a40 <_ExFreePool@4>:\r
+ 19a40: ff 25 68 e0 01 00 jmp *0x1e068\r
+ 19a46: 90 nop \r
+ 19a47: 90 nop \r
+ ...\r
+\r
+00019a50 <_memset>:\r
+ 19a50: ff 25 7c e0 01 00 jmp *0x1e07c\r
+ 19a56: 90 nop \r
+ 19a57: 90 nop \r
+ ...\r
+\r
+00019a60 <_DbgPrint>:\r
+ 19a60: ff 25 60 e0 01 00 jmp *0x1e060\r
+ 19a66: 90 nop \r
+ 19a67: 90 nop \r
+ ...\r
+\r
+00019a70 <_memcpy>:\r
+ 19a70: ff 25 78 e0 01 00 jmp *0x1e078\r
+ 19a76: 90 nop \r
+ 19a77: 90 nop \r
+ ...\r
+\r
+00019a80 <_strlen>:\r
+ 19a80: ff 25 88 e0 01 00 jmp *0x1e088\r
+ 19a86: 90 nop \r
+ 19a87: 90 nop \r
+ ...\r
+\r
+00019a90 <_sprintf>:\r
+ 19a90: ff 25 80 e0 01 00 jmp *0x1e080\r
+ 19a96: 90 nop \r
+ 19a97: 90 nop \r
+ ...\r
+\r
+00019aa0 <_strcpy>:\r
+ 19aa0: ff 25 84 e0 01 00 jmp *0x1e084\r
+ 19aa6: 90 nop \r
+ 19aa7: 90 nop \r
+ ...\r
+\r
+00019ab0 <_RtlCompareMemory@12>:\r
+ 19ab0: ff 25 70 e0 01 00 jmp *0x1e070\r
+ 19ab6: 90 nop \r
+ 19ab7: 90 nop \r
+ ...\r
+\r
+00019ac0 <__snprintf>:\r
+ 19ac0: ff 25 74 e0 01 00 jmp *0x1e074\r
+ 19ac6: 90 nop \r
+ 19ac7: 90 nop \r
+ ...\r
+\r
+00019ad0 <_KeDelayExecutionThread@12>:\r
+ 19ad0: ff 25 6c e0 01 00 jmp *0x1e06c\r
+ 19ad6: 90 nop \r
+ 19ad7: 90 nop \r
+ ...\r
+\r
+00019ae0 <__CTOR_LIST__>:\r
+ 19ae0: ff (bad) \r
+ 19ae1: ff (bad) \r
+ 19ae2: ff (bad) \r
+ 19ae3: ff 00 incl (%eax)\r
+ 19ae5: 00 00 add %al,(%eax)\r
+ ...\r
+\r
+00019ae8 <__DTOR_LIST__>:\r
+ 19ae8: ff (bad) \r
+ 19ae9: ff (bad) \r
+ 19aea: ff (bad) \r
+ 19aeb: ff 00 incl (%eax)\r
+ 19aed: 00 00 add %al,(%eax)\r
+ ...\r
+\r
+00019af0 <etext>:\r
+ ...\r
--- /dev/null
+#define REACTOS_VERSION_DLL\r
+#define REACTOS_STR_FILE_DESCRIPTION "USB Core Device Driver\0"\r
+#define REACTOS_STR_INTERNAL_NAME "usbcore\0"\r
+#define REACTOS_STR_ORIGINAL_FILENAME "usbcore.sys\0"\r
+#include <reactos/version.rc>\r
--- /dev/null
+PATH_TO_TOP = ../../../..\r
+\r
+TARGET_TYPE = export_driver\r
+\r
+TARGET_NAME = ohci\r
+\r
+TARGET_DDKLIBS = ntoskrnl.a usbcore.a\r
+\r
+TARGET_CFLAGS = -Wall -I$(PATH_TO_TOP)/ntoskrnl/include\r
+\r
+TARGET_OBJECTS = \\r
+ ohci-hcd.o ohci_main.o ../sys/ros_wrapper.o ../sys/linuxwrapper.o\r
+\r
+include $(PATH_TO_TOP)/rules.mak\r
+\r
+include $(TOOLS_PATH)/helper.mk\r
--- /dev/null
+O_TARGET := ohci-hcd.o\r
+\r
+include $(TOPDIR)/Rules.make\r
--- /dev/null
+/*\r
+ * OHCI HCD (Host Controller Driver) for USB.\r
+ *\r
+ * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>\r
+ * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net>\r
+ *\r
+ * This file is licenced under the GPL.\r
+ */\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+#ifdef DEBUG\r
+\r
+#define edstring(ed_type) ({ char *temp; \\r
+ switch (ed_type) { \\r
+ case PIPE_CONTROL: temp = "ctrl"; break; \\r
+ case PIPE_BULK: temp = "bulk"; break; \\r
+ case PIPE_INTERRUPT: temp = "intr"; break; \\r
+ default: temp = "isoc"; break; \\r
+ }; temp;})\r
+#define pipestring(pipe) edstring(usb_pipetype(pipe))\r
+\r
+/* debug| print the main components of an URB\r
+ * small: 0) header + data packets 1) just header\r
+ */\r
+static void __attribute__((unused))\r
+urb_print (struct urb * urb, char * str, int small)\r
+{\r
+ unsigned int pipe= urb->pipe;\r
+\r
+ if (!urb->dev || !urb->dev->bus) {\r
+ dbg("%s URB: no dev", str);\r
+ return;\r
+ }\r
+\r
+#ifndef OHCI_VERBOSE_DEBUG\r
+ if (urb->status != 0)\r
+#endif\r
+ dbg("%s %p dev=%d ep=%d%s-%s flags=%x len=%d/%d stat=%d",\r
+ str,\r
+ urb,\r
+ usb_pipedevice (pipe),\r
+ usb_pipeendpoint (pipe),\r
+ usb_pipeout (pipe)? "out" : "in",\r
+ pipestring (pipe),\r
+ urb->transfer_flags,\r
+ urb->actual_length,\r
+ urb->transfer_buffer_length,\r
+ urb->status);\r
+\r
+#ifdef OHCI_VERBOSE_DEBUG\r
+ if (!small) {\r
+ int i, len;\r
+\r
+ if (usb_pipecontrol (pipe)) {\r
+ printk (KERN_DEBUG __FILE__ ": setup(8):");\r
+ for (i = 0; i < 8 ; i++)\r
+ printk (" %02x", ((__u8 *) urb->setup_packet) [i]);\r
+ printk ("\n");\r
+ }\r
+ if (urb->transfer_buffer_length > 0 && urb->transfer_buffer) {\r
+ printk (KERN_DEBUG __FILE__ ": data(%d/%d):",\r
+ urb->actual_length,\r
+ urb->transfer_buffer_length);\r
+ len = usb_pipeout (pipe)?\r
+ urb->transfer_buffer_length: urb->actual_length;\r
+ for (i = 0; i < 16 && i < len; i++)\r
+ printk (" %02x", ((__u8 *) urb->transfer_buffer) [i]);\r
+ printk ("%s stat:%d\n", i < len? "...": "", urb->status);\r
+ }\r
+ }\r
+#endif\r
+}\r
+\r
+#define ohci_dbg_sw(ohci, next, size, format, arg...) \\r
+ do { \\r
+ if (next) { \\r
+ unsigned s_len; \\r
+ s_len = snprintf (*next, *size, format, ## arg ); \\r
+ *size -= s_len; *next += s_len; \\r
+ } else \\r
+ ohci_dbg(ohci,format, ## arg ); \\r
+ } while (0);\r
+\r
+\r
+static void ohci_dump_intr_mask (\r
+ struct ohci_hcd *ohci,\r
+ char *label,\r
+ u32 mask,\r
+ char **next,\r
+ unsigned *size)\r
+{\r
+ ohci_dbg_sw (ohci, next, size, "%s 0x%08x%s%s%s%s%s%s%s%s%s\n",\r
+ label,\r
+ mask,\r
+ (mask & OHCI_INTR_MIE) ? " MIE" : "",\r
+ (mask & OHCI_INTR_OC) ? " OC" : "",\r
+ (mask & OHCI_INTR_RHSC) ? " RHSC" : "",\r
+ (mask & OHCI_INTR_FNO) ? " FNO" : "",\r
+ (mask & OHCI_INTR_UE) ? " UE" : "",\r
+ (mask & OHCI_INTR_RD) ? " RD" : "",\r
+ (mask & OHCI_INTR_SF) ? " SF" : "",\r
+ (mask & OHCI_INTR_WDH) ? " WDH" : "",\r
+ (mask & OHCI_INTR_SO) ? " SO" : ""\r
+ );\r
+}\r
+\r
+static void maybe_print_eds (\r
+ struct ohci_hcd *ohci,\r
+ char *label,\r
+ u32 value,\r
+ char **next,\r
+ unsigned *size)\r
+{\r
+ if (value)\r
+ ohci_dbg_sw (ohci, next, size, "%s %08x\n", label, value);\r
+}\r
+\r
+static char *hcfs2string (int state)\r
+{\r
+ switch (state) {\r
+ case OHCI_USB_RESET: return "reset";\r
+ case OHCI_USB_RESUME: return "resume";\r
+ case OHCI_USB_OPER: return "operational";\r
+ case OHCI_USB_SUSPEND: return "suspend";\r
+ }\r
+ return "?";\r
+}\r
+\r
+// dump control and status registers\r
+static void\r
+ohci_dump_status (struct ohci_hcd *controller, char **next, unsigned *size)\r
+{\r
+ struct ohci_regs *regs = controller->regs;\r
+ u32 temp;\r
+\r
+ temp = readl (®s->revision) & 0xff;\r
+ ohci_dbg_sw (controller, next, size,\r
+ "OHCI %d.%d, %s legacy support registers\n",\r
+ 0x03 & (temp >> 4), (temp & 0x0f),\r
+ (temp & 0x10) ? "with" : "NO");\r
+\r
+ temp = readl (®s->control);\r
+ ohci_dbg_sw (controller, next, size,\r
+ "control 0x%03x%s%s%s HCFS=%s%s%s%s%s CBSR=%d\n",\r
+ temp,\r
+ (temp & OHCI_CTRL_RWE) ? " RWE" : "",\r
+ (temp & OHCI_CTRL_RWC) ? " RWC" : "",\r
+ (temp & OHCI_CTRL_IR) ? " IR" : "",\r
+ hcfs2string (temp & OHCI_CTRL_HCFS),\r
+ (temp & OHCI_CTRL_BLE) ? " BLE" : "",\r
+ (temp & OHCI_CTRL_CLE) ? " CLE" : "",\r
+ (temp & OHCI_CTRL_IE) ? " IE" : "",\r
+ (temp & OHCI_CTRL_PLE) ? " PLE" : "",\r
+ temp & OHCI_CTRL_CBSR\r
+ );\r
+\r
+ temp = readl (®s->cmdstatus);\r
+ ohci_dbg_sw (controller, next, size,\r
+ "cmdstatus 0x%05x SOC=%d%s%s%s%s\n", temp,\r
+ (temp & OHCI_SOC) >> 16,\r
+ (temp & OHCI_OCR) ? " OCR" : "",\r
+ (temp & OHCI_BLF) ? " BLF" : "",\r
+ (temp & OHCI_CLF) ? " CLF" : "",\r
+ (temp & OHCI_HCR) ? " HCR" : ""\r
+ );\r
+\r
+ ohci_dump_intr_mask (controller, "intrstatus",\r
+ readl (®s->intrstatus), next, size);\r
+ ohci_dump_intr_mask (controller, "intrenable",\r
+ readl (®s->intrenable), next, size);\r
+ // intrdisable always same as intrenable\r
+\r
+ maybe_print_eds (controller, "ed_periodcurrent",\r
+ readl (®s->ed_periodcurrent), next, size);\r
+\r
+ maybe_print_eds (controller, "ed_controlhead",\r
+ readl (®s->ed_controlhead), next, size);\r
+ maybe_print_eds (controller, "ed_controlcurrent",\r
+ readl (®s->ed_controlcurrent), next, size);\r
+\r
+ maybe_print_eds (controller, "ed_bulkhead",\r
+ readl (®s->ed_bulkhead), next, size);\r
+ maybe_print_eds (controller, "ed_bulkcurrent",\r
+ readl (®s->ed_bulkcurrent), next, size);\r
+\r
+ maybe_print_eds (controller, "donehead",\r
+ readl (®s->donehead), next, size);\r
+}\r
+\r
+#define dbg_port_sw(hc,num,value,next,size) \\r
+ ohci_dbg_sw (hc, next, size, \\r
+ "roothub.portstatus [%d] " \\r
+ "0x%08x%s%s%s%s%s%s%s%s%s%s%s%s\n", \\r
+ num, temp, \\r
+ (temp & RH_PS_PRSC) ? " PRSC" : "", \\r
+ (temp & RH_PS_OCIC) ? " OCIC" : "", \\r
+ (temp & RH_PS_PSSC) ? " PSSC" : "", \\r
+ (temp & RH_PS_PESC) ? " PESC" : "", \\r
+ (temp & RH_PS_CSC) ? " CSC" : "", \\r
+ \\r
+ (temp & RH_PS_LSDA) ? " LSDA" : "", \\r
+ (temp & RH_PS_PPS) ? " PPS" : "", \\r
+ (temp & RH_PS_PRS) ? " PRS" : "", \\r
+ (temp & RH_PS_POCI) ? " POCI" : "", \\r
+ (temp & RH_PS_PSS) ? " PSS" : "", \\r
+ \\r
+ (temp & RH_PS_PES) ? " PES" : "", \\r
+ (temp & RH_PS_CCS) ? " CCS" : "" \\r
+ );\r
+\r
+\r
+static void\r
+ohci_dump_roothub (\r
+ struct ohci_hcd *controller,\r
+ int verbose,\r
+ char **next,\r
+ unsigned *size)\r
+{\r
+ u32 temp, ndp, i;\r
+\r
+ temp = roothub_a (controller);\r
+ if (temp == ~(u32)0)\r
+ return;\r
+ ndp = (temp & RH_A_NDP);\r
+\r
+ if (verbose) {\r
+ ohci_dbg_sw (controller, next, size,\r
+ "roothub.a %08x POTPGT=%d%s%s%s%s%s NDP=%d\n", temp,\r
+ ((temp & RH_A_POTPGT) >> 24) & 0xff,\r
+ (temp & RH_A_NOCP) ? " NOCP" : "",\r
+ (temp & RH_A_OCPM) ? " OCPM" : "",\r
+ (temp & RH_A_DT) ? " DT" : "",\r
+ (temp & RH_A_NPS) ? " NPS" : "",\r
+ (temp & RH_A_PSM) ? " PSM" : "",\r
+ ndp\r
+ );\r
+ temp = roothub_b (controller);\r
+ ohci_dbg_sw (controller, next, size,\r
+ "roothub.b %08x PPCM=%04x DR=%04x\n",\r
+ temp,\r
+ (temp & RH_B_PPCM) >> 16,\r
+ (temp & RH_B_DR)\r
+ );\r
+ temp = roothub_status (controller);\r
+ ohci_dbg_sw (controller, next, size,\r
+ "roothub.status %08x%s%s%s%s%s%s\n",\r
+ temp,\r
+ (temp & RH_HS_CRWE) ? " CRWE" : "",\r
+ (temp & RH_HS_OCIC) ? " OCIC" : "",\r
+ (temp & RH_HS_LPSC) ? " LPSC" : "",\r
+ (temp & RH_HS_DRWE) ? " DRWE" : "",\r
+ (temp & RH_HS_OCI) ? " OCI" : "",\r
+ (temp & RH_HS_LPS) ? " LPS" : ""\r
+ );\r
+ }\r
+\r
+ for (i = 0; i < ndp; i++) {\r
+ temp = roothub_portstatus (controller, i);\r
+ dbg_port_sw (controller, i, temp, next, size);\r
+ }\r
+}\r
+\r
+static void ohci_dump (struct ohci_hcd *controller, int verbose)\r
+{\r
+ ohci_dbg (controller, "OHCI controller state\n");\r
+\r
+ // dumps some of the state we know about\r
+ ohci_dump_status (controller, NULL, 0);\r
+ if (controller->hcca)\r
+ ohci_dbg (controller,\r
+ "hcca frame #%04x\n", controller->hcca->frame_no);\r
+ ohci_dump_roothub (controller, 1, NULL, 0);\r
+}\r
+\r
+static const char data0 [] = "DATA0";\r
+static const char data1 [] = "DATA1";\r
+\r
+static void ohci_dump_td (struct ohci_hcd *ohci, char *label, struct td *td)\r
+{\r
+ u32 tmp = le32_to_cpup (&td->hwINFO);\r
+\r
+ ohci_dbg (ohci, "%s td %p%s; urb %p index %d; hw next td %08x",\r
+ label, td,\r
+ (tmp & TD_DONE) ? " (DONE)" : "",\r
+ td->urb, td->index,\r
+ le32_to_cpup (&td->hwNextTD));\r
+ if ((tmp & TD_ISO) == 0) {\r
+ const char *toggle, *pid;\r
+ u32 cbp, be;\r
+\r
+ switch (tmp & TD_T) {\r
+ case TD_T_DATA0: toggle = data0; break;\r
+ case TD_T_DATA1: toggle = data1; break;\r
+ case TD_T_TOGGLE: toggle = "(CARRY)"; break;\r
+ default: toggle = "(?)"; break;\r
+ }\r
+ switch (tmp & TD_DP) {\r
+ case TD_DP_SETUP: pid = "SETUP"; break;\r
+ case TD_DP_IN: pid = "IN"; break;\r
+ case TD_DP_OUT: pid = "OUT"; break;\r
+ default: pid = "(bad pid)"; break;\r
+ }\r
+ ohci_dbg (ohci, " info %08x CC=%x %s DI=%d %s %s", tmp,\r
+ TD_CC_GET(tmp), /* EC, */ toggle,\r
+ (tmp & TD_DI) >> 21, pid,\r
+ (tmp & TD_R) ? "R" : "");\r
+ cbp = le32_to_cpup (&td->hwCBP);\r
+ be = le32_to_cpup (&td->hwBE);\r
+ ohci_dbg (ohci, " cbp %08x be %08x (len %d)", cbp, be,\r
+ cbp ? (be + 1 - cbp) : 0);\r
+ } else {\r
+ unsigned i;\r
+ ohci_dbg (ohci, " info %08x CC=%x FC=%d DI=%d SF=%04x", tmp,\r
+ TD_CC_GET(tmp),\r
+ (tmp >> 24) & 0x07,\r
+ (tmp & TD_DI) >> 21,\r
+ tmp & 0x0000ffff);\r
+ ohci_dbg (ohci, " bp0 %08x be %08x",\r
+ le32_to_cpup (&td->hwCBP) & ~0x0fff,\r
+ le32_to_cpup (&td->hwBE));\r
+ for (i = 0; i < MAXPSW; i++) {\r
+ u16 psw = le16_to_cpup (&td->hwPSW [i]);\r
+ int cc = (psw >> 12) & 0x0f;\r
+ ohci_dbg (ohci, " psw [%d] = %2x, CC=%x %s=%d", i,\r
+ psw, cc,\r
+ (cc >= 0x0e) ? "OFFSET" : "SIZE",\r
+ psw & 0x0fff);\r
+ }\r
+ }\r
+}\r
+\r
+/* caller MUST own hcd spinlock if verbose is set! */\r
+static void __attribute__((unused))\r
+ohci_dump_ed (struct ohci_hcd *ohci, char *label, struct ed *ed, int verbose)\r
+{\r
+ u32 tmp = ed->hwINFO;\r
+ char *type = "";\r
+\r
+ ohci_dbg (ohci, "%s, ed %p state 0x%x type %s; next ed %08x",\r
+ label,\r
+ ed, ed->state, edstring (ed->type),\r
+ le32_to_cpup (&ed->hwNextED));\r
+ switch (tmp & (ED_IN|ED_OUT)) {\r
+ case ED_OUT: type = "-OUT"; break;\r
+ case ED_IN: type = "-IN"; break;\r
+ /* else from TDs ... control */\r
+ }\r
+ ohci_dbg (ohci,\r
+ " info %08x MAX=%d%s%s%s%s EP=%d%s DEV=%d", le32_to_cpu (tmp),\r
+ 0x03ff & (le32_to_cpu (tmp) >> 16),\r
+ (tmp & ED_DEQUEUE) ? " DQ" : "",\r
+ (tmp & ED_ISO) ? " ISO" : "",\r
+ (tmp & ED_SKIP) ? " SKIP" : "",\r
+ (tmp & ED_LOWSPEED) ? " LOW" : "",\r
+ 0x000f & (le32_to_cpu (tmp) >> 7),\r
+ type,\r
+ 0x007f & le32_to_cpu (tmp));\r
+ ohci_dbg (ohci, " tds: head %08x %s%s tail %08x%s",\r
+ tmp = le32_to_cpup (&ed->hwHeadP),\r
+ (ed->hwHeadP & ED_C) ? data1 : data0,\r
+ (ed->hwHeadP & ED_H) ? " HALT" : "",\r
+ le32_to_cpup (&ed->hwTailP),\r
+ verbose ? "" : " (not listing)");\r
+ if (verbose) {\r
+ struct list_head *tmp;\r
+\r
+ /* use ed->td_list because HC concurrently modifies\r
+ * hwNextTD as it accumulates ed_donelist.\r
+ */\r
+ list_for_each (tmp, &ed->td_list) {\r
+ struct td *td;\r
+ td = list_entry (tmp, struct td, td_list);\r
+ ohci_dump_td (ohci, " ->", td);\r
+ }\r
+ }\r
+}\r
+\r
+#else\r
+static inline void ohci_dump (struct ohci_hcd *controller, int verbose) {}\r
+\r
+#undef OHCI_VERBOSE_DEBUG\r
+\r
+#endif /* DEBUG */\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+#ifdef STUB_DEBUG_FILES\r
+\r
+static inline void create_debug_files (struct ohci_hcd *bus) { }\r
+static inline void remove_debug_files (struct ohci_hcd *bus) { }\r
+\r
+#else\r
+\r
+static inline struct ohci_hcd *dev_to_ohci (struct device *dev)\r
+{\r
+ struct usb_hcd *hcd = dev_get_drvdata (dev);\r
+\r
+ return hcd_to_ohci (hcd);\r
+}\r
+\r
+static ssize_t\r
+show_list (struct ohci_hcd *ohci, char *buf, size_t count, struct ed *ed)\r
+{\r
+ unsigned temp, size = count;\r
+\r
+ if (!ed)\r
+ return 0;\r
+\r
+ /* print first --> last */\r
+ while (ed->ed_prev)\r
+ ed = ed->ed_prev;\r
+\r
+ /* dump a snapshot of the bulk or control schedule */\r
+ while (ed) {\r
+ u32 info = ed->hwINFO;\r
+ u32 scratch = cpu_to_le32p (&ed->hwINFO);\r
+ struct list_head *entry;\r
+ struct td *td;\r
+\r
+ temp = snprintf (buf, size,\r
+ "ed/%p %cs dev%d ep%d%s max %d %08x%s%s %s",\r
+ ed,\r
+ (info & ED_LOWSPEED) ? 'l' : 'f',\r
+ scratch & 0x7f,\r
+ (scratch >> 7) & 0xf,\r
+ (info & ED_IN) ? "in" : "out",\r
+ 0x03ff & (scratch >> 16),\r
+ scratch,\r
+ (info & ED_SKIP) ? " s" : "",\r
+ (ed->hwHeadP & ED_H) ? " H" : "",\r
+ (ed->hwHeadP & ED_C) ? data1 : data0);\r
+ size -= temp;\r
+ buf += temp;\r
+\r
+ list_for_each (entry, &ed->td_list) {\r
+ u32 cbp, be;\r
+\r
+ td = list_entry (entry, struct td, td_list);\r
+ scratch = cpu_to_le32p (&td->hwINFO);\r
+ cbp = le32_to_cpup (&td->hwCBP);\r
+ be = le32_to_cpup (&td->hwBE);\r
+ temp = snprintf (buf, size,\r
+ "\n\ttd %p %s %d cc=%x urb %p (%08x)",\r
+ td,\r
+ ({ char *pid;\r
+ switch (scratch & TD_DP) {\r
+ case TD_DP_SETUP: pid = "setup"; break;\r
+ case TD_DP_IN: pid = "in"; break;\r
+ case TD_DP_OUT: pid = "out"; break;\r
+ default: pid = "(?)"; break;\r
+ } pid;}),\r
+ cbp ? (be + 1 - cbp) : 0,\r
+ TD_CC_GET (scratch), td->urb, scratch);\r
+ size -= temp;\r
+ buf += temp;\r
+ }\r
+\r
+ temp = snprintf (buf, size, "\n");\r
+ size -= temp;\r
+ buf += temp;\r
+\r
+ ed = ed->ed_next;\r
+ }\r
+ return count - size;\r
+}\r
+\r
+static ssize_t\r
+show_async (struct device *dev, char *buf)\r
+{\r
+ struct ohci_hcd *ohci;\r
+ size_t temp;\r
+ unsigned long flags;\r
+\r
+ ohci = dev_to_ohci(dev);\r
+\r
+ /* display control and bulk lists together, for simplicity */\r
+ spin_lock_irqsave (&ohci->lock, flags);\r
+ temp = show_list (ohci, buf, PAGE_SIZE, ohci->ed_controltail);\r
+ temp += show_list (ohci, buf + temp, PAGE_SIZE - temp, ohci->ed_bulktail);\r
+ spin_unlock_irqrestore (&ohci->lock, flags);\r
+\r
+ return temp;\r
+}\r
+static DEVICE_ATTR (async, S_IRUGO, show_async, NULL);\r
+\r
+\r
+#define DBG_SCHED_LIMIT 64\r
+\r
+static ssize_t\r
+show_periodic (struct device *dev, char *buf)\r
+{\r
+ struct ohci_hcd *ohci;\r
+ struct ed **seen, *ed;\r
+ unsigned long flags;\r
+ unsigned temp, size, seen_count;\r
+ char *next;\r
+ unsigned i;\r
+\r
+ if (!(seen = kmalloc (DBG_SCHED_LIMIT * sizeof *seen, SLAB_ATOMIC)))\r
+ return 0;\r
+ seen_count = 0;\r
+\r
+ ohci = dev_to_ohci(dev);\r
+ next = buf;\r
+ size = PAGE_SIZE;\r
+\r
+ temp = snprintf (next, size, "size = %d\n", NUM_INTS);\r
+ size -= temp;\r
+ next += temp;\r
+\r
+ /* dump a snapshot of the periodic schedule (and load) */\r
+ spin_lock_irqsave (&ohci->lock, flags);\r
+ for (i = 0; i < NUM_INTS; i++) {\r
+ if (!(ed = ohci->periodic [i]))\r
+ continue;\r
+\r
+ temp = snprintf (next, size, "%2d [%3d]:", i, ohci->load [i]);\r
+ size -= temp;\r
+ next += temp;\r
+\r
+ do {\r
+ temp = snprintf (next, size, " ed%d/%p",\r
+ ed->interval, ed);\r
+ size -= temp;\r
+ next += temp;\r
+ for (temp = 0; temp < seen_count; temp++) {\r
+ if (seen [temp] == ed)\r
+ break;\r
+ }\r
+\r
+ /* show more info the first time around */\r
+ if (temp == seen_count) {\r
+ u32 info = ed->hwINFO;\r
+ u32 scratch = cpu_to_le32p (&ed->hwINFO);\r
+\r
+ temp = snprintf (next, size,\r
+ " (%cs dev%d%s ep%d%s"\r
+ " max %d %08x%s%s)",\r
+ (info & ED_LOWSPEED) ? 'l' : 'f',\r
+ scratch & 0x7f,\r
+ (info & ED_ISO) ? " iso" : "",\r
+ (scratch >> 7) & 0xf,\r
+ (info & ED_IN) ? "in" : "out",\r
+ 0x03ff & (scratch >> 16),\r
+ scratch,\r
+ (info & ED_SKIP) ? " s" : "",\r
+ (ed->hwHeadP & ED_H) ? " H" : "");\r
+ size -= temp;\r
+ next += temp;\r
+\r
+ // FIXME some TD info too\r
+\r
+ if (seen_count < DBG_SCHED_LIMIT)\r
+ seen [seen_count++] = ed;\r
+\r
+ ed = ed->ed_next;\r
+\r
+ } else {\r
+ /* we've seen it and what's after */\r
+ temp = 0;\r
+ ed = 0;\r
+ }\r
+\r
+ } while (ed);\r
+\r
+ temp = snprintf (next, size, "\n");\r
+ size -= temp;\r
+ next += temp;\r
+ }\r
+ spin_unlock_irqrestore (&ohci->lock, flags);\r
+ kfree (seen);\r
+\r
+ return PAGE_SIZE - size;\r
+}\r
+static DEVICE_ATTR (periodic, S_IRUGO, show_periodic, NULL);\r
+\r
+\r
+#undef DBG_SCHED_LIMIT\r
+\r
+static ssize_t\r
+show_registers (struct device *dev, char *buf)\r
+{\r
+ struct ohci_hcd *ohci;\r
+ struct ohci_regs *regs;\r
+ unsigned long flags;\r
+ unsigned temp, size;\r
+ char *next;\r
+ u32 rdata;\r
+\r
+ ohci = dev_to_ohci(dev);\r
+ regs = ohci->regs;\r
+ next = buf;\r
+ size = PAGE_SIZE;\r
+\r
+ spin_lock_irqsave (&ohci->lock, flags);\r
+\r
+ /* dump driver info, then registers in spec order */\r
+\r
+ ohci_dbg_sw (ohci, &next, &size,\r
+ "%s version " DRIVER_VERSION "\n", hcd_name);\r
+\r
+ ohci_dump_status(ohci, &next, &size);\r
+\r
+ /* hcca */\r
+ if (ohci->hcca)\r
+ ohci_dbg_sw (ohci, &next, &size,\r
+ "hcca frame 0x%04x\n", ohci->hcca->frame_no);\r
+\r
+ /* other registers mostly affect frame timings */\r
+ rdata = readl (®s->fminterval);\r
+ temp = snprintf (next, size,\r
+ "fmintvl 0x%08x %sFSMPS=0x%04x FI=0x%04x\n",\r
+ rdata, (rdata >> 31) ? " FIT" : "",\r
+ (rdata >> 16) & 0xefff, rdata & 0xffff);\r
+ size -= temp;\r
+ next += temp;\r
+\r
+ rdata = readl (®s->fmremaining);\r
+ temp = snprintf (next, size, "fmremaining 0x%08x %sFR=0x%04x\n",\r
+ rdata, (rdata >> 31) ? " FRT" : "",\r
+ rdata & 0x3fff);\r
+ size -= temp;\r
+ next += temp;\r
+\r
+ rdata = readl (®s->periodicstart);\r
+ temp = snprintf (next, size, "periodicstart 0x%04x\n",\r
+ rdata & 0x3fff);\r
+ size -= temp;\r
+ next += temp;\r
+\r
+ rdata = readl (®s->lsthresh);\r
+ temp = snprintf (next, size, "lsthresh 0x%04x\n",\r
+ rdata & 0x3fff);\r
+ size -= temp;\r
+ next += temp;\r
+\r
+ /* roothub */\r
+ ohci_dump_roothub (ohci, 1, &next, &size);\r
+\r
+ spin_unlock_irqrestore (&ohci->lock, flags);\r
+\r
+ return PAGE_SIZE - size;\r
+}\r
+static DEVICE_ATTR (registers, S_IRUGO, show_registers, NULL);\r
+\r
+\r
+static inline void create_debug_files (struct ohci_hcd *bus)\r
+{\r
+ device_create_file (bus->hcd.controller, &dev_attr_async);\r
+ device_create_file (bus->hcd.controller, &dev_attr_periodic);\r
+ device_create_file (bus->hcd.controller, &dev_attr_registers);\r
+ ohci_dbg (bus, "created debug files\n");\r
+}\r
+\r
+static inline void remove_debug_files (struct ohci_hcd *bus)\r
+{\r
+ device_remove_file (bus->hcd.controller, &dev_attr_async);\r
+ device_remove_file (bus->hcd.controller, &dev_attr_periodic);\r
+ device_remove_file (bus->hcd.controller, &dev_attr_registers);\r
+}\r
+\r
+#endif\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
--- /dev/null
+/*\r
+ * OHCI HCD (Host Controller Driver) for USB.\r
+ *\r
+ * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>\r
+ * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net>\r
+ * \r
+ * [ Initialisation is based on Linus' ]\r
+ * [ uhci code and gregs ohci fragments ]\r
+ * [ (C) Copyright 1999 Linus Torvalds ]\r
+ * [ (C) Copyright 1999 Gregory P. Smith]\r
+ * \r
+ * \r
+ * OHCI is the main "non-Intel/VIA" standard for USB 1.1 host controller\r
+ * interfaces (though some non-x86 Intel chips use it). It supports\r
+ * smarter hardware than UHCI. A download link for the spec available\r
+ * through the http://www.usb.org website.\r
+ *\r
+ * History:\r
+ * \r
+ * 2003/02/24 show registers in sysfs (Kevin Brosius)\r
+ *\r
+ * 2002/09/03 get rid of ed hashtables, rework periodic scheduling and\r
+ * bandwidth accounting; if debugging, show schedules in driverfs\r
+ * 2002/07/19 fixes to management of ED and schedule state.\r
+ * 2002/06/09 SA-1111 support (Christopher Hoover)\r
+ * 2002/06/01 remember frame when HC won't see EDs any more; use that info\r
+ * to fix urb unlink races caused by interrupt latency assumptions;\r
+ * minor ED field and function naming updates\r
+ * 2002/01/18 package as a patch for 2.5.3; this should match the\r
+ * 2.4.17 kernel modulo some bugs being fixed.\r
+ *\r
+ * 2001/10/18 merge pmac cleanup (Benjamin Herrenschmidt) and bugfixes\r
+ * from post-2.4.5 patches.\r
+ * 2001/09/20 URB_ZERO_PACKET support; hcca_dma portability, OPTi warning\r
+ * 2001/09/07 match PCI PM changes, errnos from Linus' tree\r
+ * 2001/05/05 fork 2.4.5 version into "hcd" framework, cleanup, simplify;\r
+ * pbook pci quirks gone (please fix pbook pci sw!) (db)\r
+ *\r
+ * 2001/04/08 Identify version on module load (gb)\r
+ * 2001/03/24 td/ed hashing to remove bus_to_virt (Steve Longerbeam);\r
+ pci_map_single (db)\r
+ * 2001/03/21 td and dev/ed allocation uses new pci_pool API (db)\r
+ * 2001/03/07 hcca allocation uses pci_alloc_consistent (Steve Longerbeam)\r
+ *\r
+ * 2000/09/26 fixed races in removing the private portion of the urb\r
+ * 2000/09/07 disable bulk and control lists when unlinking the last\r
+ * endpoint descriptor in order to avoid unrecoverable errors on\r
+ * the Lucent chips. (rwc@sgi)\r
+ * 2000/08/29 use bandwidth claiming hooks (thanks Randy!), fix some\r
+ * urb unlink probs, indentation fixes\r
+ * 2000/08/11 various oops fixes mostly affecting iso and cleanup from\r
+ * device unplugs.\r
+ * 2000/06/28 use PCI hotplug framework, for better power management\r
+ * and for Cardbus support (David Brownell)\r
+ * 2000/earlier: fixes for NEC/Lucent chips; suspend/resume handling\r
+ * when the controller loses power; handle UE; cleanup; ...\r
+ *\r
+ * v5.2 1999/12/07 URB 3rd preview, \r
+ * v5.1 1999/11/30 URB 2nd preview, cpia, (usb-scsi)\r
+ * v5.0 1999/11/22 URB Technical preview, Paul Mackerras powerbook susp/resume \r
+ * i386: HUB, Keyboard, Mouse, Printer \r
+ *\r
+ * v4.3 1999/10/27 multiple HCs, bulk_request\r
+ * v4.2 1999/09/05 ISO API alpha, new dev alloc, neg Error-codes\r
+ * v4.1 1999/08/27 Randy Dunlap's - ISO API first impl.\r
+ * v4.0 1999/08/18 \r
+ * v3.0 1999/06/25 \r
+ * v2.1 1999/05/09 code clean up\r
+ * v2.0 1999/05/04 \r
+ * v1.0 1999/04/27 initial release\r
+ *\r
+ * This file is licenced under the GPL.\r
+ */\r
+\r
+#if 0 \r
+#include <linux/config.h>\r
+\r
+#ifdef CONFIG_USB_DEBUG\r
+# define DEBUG\r
+#else\r
+# undef DEBUG\r
+#endif\r
+\r
+\r
+\r
+#include <linux/module.h>\r
+#include <linux/pci.h>\r
+#include <linux/kernel.h>\r
+#include <linux/delay.h>\r
+#include <linux/ioport.h>\r
+#include <linux/sched.h>\r
+#include <linux/slab.h>\r
+#include <linux/smp_lock.h>\r
+#include <linux/errno.h>\r
+#include <linux/init.h>\r
+#include <linux/timer.h>\r
+#include <linux/list.h>\r
+#include <linux/interrupt.h> /* for in_interrupt () */\r
+#include <linux/usb.h>\r
+#include "../core/hcd.h"\r
+\r
+#include <asm/io.h>\r
+#include <asm/irq.h>\r
+#include <asm/system.h>\r
+#include <asm/unaligned.h>\r
+#include <asm/byteorder.h>\r
+#else\r
+#include "ohci_config.h"\r
+\r
+#include "../usb_wrapper.h"\r
+#include "../core/hcd.h"\r
+\r
+//#define OHCI_VERBOSE_DEBUG\r
+#endif\r
+\r
+/*\r
+ * TO DO:\r
+ *\r
+ * - "disabled" and "sleeping" should be in hcd->state\r
+ * - lots more testing!!\r
+ */\r
+\r
+#define DRIVER_VERSION "2003 Feb 24"\r
+#define DRIVER_AUTHOR "Roman Weissgaerber, David Brownell"\r
+#define DRIVER_DESC "USB 1.1 'Open' Host Controller (OHCI) Driver"\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+// #define OHCI_VERBOSE_DEBUG /* not always helpful */\r
+\r
+/* For initializing controller (mask in an HCFS mode too) */\r
+#define OHCI_CONTROL_INIT \\r
+ (OHCI_CTRL_CBSR & 0x3) | OHCI_CTRL_IE | OHCI_CTRL_PLE\r
+\r
+#define OHCI_UNLINK_TIMEOUT (HZ / 10)\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+static const char hcd_name [] = "ohci-hcd";\r
+\r
+#include "ohci.h"\r
+\r
+static inline void disable (struct ohci_hcd *ohci)\r
+{\r
+ ohci->disabled = 1;\r
+ ohci->hcd.state = USB_STATE_HALT;\r
+}\r
+\r
+#include "ohci-hub.c"\r
+#include "ohci-dbg.c"\r
+#include "ohci-mem.c"\r
+#include "ohci-q.c"\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/*\r
+ * queue up an urb for anything except the root hub\r
+ */\r
+static int ohci_urb_enqueue (\r
+ struct usb_hcd *hcd,\r
+ struct urb *urb,\r
+ int mem_flags\r
+) {\r
+ struct ohci_hcd *ohci = hcd_to_ohci (hcd);\r
+ struct ed *ed;\r
+ urb_priv_t *urb_priv;\r
+ unsigned int pipe = urb->pipe;\r
+ int i, size = 0;\r
+ unsigned long flags;\r
+ int retval = 0;\r
+ \r
+#ifdef OHCI_VERBOSE_DEBUG\r
+ urb_print (urb, "SUB", usb_pipein (pipe));\r
+#endif\r
+ \r
+ /* every endpoint has a ed, locate and maybe (re)initialize it */\r
+ if (! (ed = ed_get (ohci, urb->dev, pipe, urb->interval)))\r
+ return -ENOMEM;\r
+\r
+ /* for the private part of the URB we need the number of TDs (size) */\r
+ switch (ed->type) {\r
+ case PIPE_CONTROL:\r
+ /* td_submit_urb() doesn't yet handle these */\r
+ if (urb->transfer_buffer_length > 4096)\r
+ return -EMSGSIZE;\r
+\r
+ /* 1 TD for setup, 1 for ACK, plus ... */\r
+ size = 2;\r
+ /* FALLTHROUGH */\r
+ // case PIPE_INTERRUPT:\r
+ // case PIPE_BULK:\r
+ default:\r
+ /* one TD for every 4096 Bytes (can be upto 8K) */\r
+ size += urb->transfer_buffer_length / 4096;\r
+ /* ... and for any remaining bytes ... */\r
+ if ((urb->transfer_buffer_length % 4096) != 0)\r
+ size++;\r
+ /* ... and maybe a zero length packet to wrap it up */\r
+ if (size == 0)\r
+ size++;\r
+ else if ((urb->transfer_flags & URB_ZERO_PACKET) != 0\r
+ && (urb->transfer_buffer_length\r
+ % usb_maxpacket (urb->dev, pipe,\r
+ usb_pipeout (pipe))) == 0)\r
+ size++;\r
+ break;\r
+ case PIPE_ISOCHRONOUS: /* number of packets from URB */\r
+ size = urb->number_of_packets;\r
+ break;\r
+ }\r
+\r
+ /* allocate the private part of the URB */\r
+ urb_priv = kmalloc (sizeof (urb_priv_t) + size * sizeof (struct td *),\r
+ mem_flags);\r
+ if (!urb_priv)\r
+ return -ENOMEM;\r
+ memset (urb_priv, 0, sizeof (urb_priv_t) + size * sizeof (struct td *));\r
+\r
+ /* fill the private part of the URB */\r
+ urb_priv->length = size;\r
+ urb_priv->ed = ed; \r
+\r
+ /* allocate the TDs (deferring hash chain updates) */\r
+ for (i = 0; i < size; i++) {\r
+ urb_priv->td [i] = td_alloc (ohci, mem_flags);\r
+ if (!urb_priv->td [i]) {\r
+ urb_priv->length = i;\r
+ urb_free_priv (ohci, urb_priv);\r
+ return -ENOMEM;\r
+ }\r
+ } \r
+\r
+ spin_lock_irqsave (&ohci->lock, flags);\r
+\r
+ /* don't submit to a dead HC */\r
+ if (ohci->disabled || ohci->sleeping) {\r
+ retval = -ENODEV;\r
+ goto fail;\r
+ }\r
+\r
+ /* schedule the ed if needed */\r
+ if (ed->state == ED_IDLE) {\r
+ retval = ed_schedule (ohci, ed);\r
+ if (retval < 0)\r
+ goto fail;\r
+ if (ed->type == PIPE_ISOCHRONOUS) {\r
+ u16 frame = le16_to_cpu (ohci->hcca->frame_no);\r
+\r
+ /* delay a few frames before the first TD */\r
+ frame += max_t (u16, 8, ed->interval);\r
+ frame &= ~(ed->interval - 1);\r
+ frame |= ed->branch;\r
+ urb->start_frame = frame;\r
+\r
+ /* yes, only URB_ISO_ASAP is supported, and\r
+ * urb->start_frame is never used as input.\r
+ */\r
+ }\r
+ } else if (ed->type == PIPE_ISOCHRONOUS)\r
+ urb->start_frame = ed->last_iso + ed->interval;\r
+\r
+ /* fill the TDs and link them to the ed; and\r
+ * enable that part of the schedule, if needed\r
+ * and update count of queued periodic urbs\r
+ */\r
+ urb->hcpriv = urb_priv;\r
+ td_submit_urb (ohci, urb);\r
+\r
+fail:\r
+ if (retval)\r
+ urb_free_priv (ohci, urb_priv);\r
+ spin_unlock_irqrestore (&ohci->lock, flags);\r
+ return retval;\r
+}\r
+\r
+/*\r
+ * decouple the URB from the HC queues (TDs, urb_priv); it's\r
+ * already marked using urb->status. reporting is always done\r
+ * asynchronously, and we might be dealing with an urb that's\r
+ * partially transferred, or an ED with other urbs being unlinked.\r
+ */\r
+static int ohci_urb_dequeue (struct usb_hcd *hcd, struct urb *urb)\r
+{\r
+ struct ohci_hcd *ohci = hcd_to_ohci (hcd);\r
+ unsigned long flags;\r
+ \r
+#ifdef OHCI_VERBOSE_DEBUG\r
+ urb_print (urb, "UNLINK", 1);\r
+#endif \r
+\r
+ spin_lock_irqsave (&ohci->lock, flags);\r
+ if (!ohci->disabled) {\r
+ urb_priv_t *urb_priv;\r
+\r
+ /* Unless an IRQ completed the unlink while it was being\r
+ * handed to us, flag it for unlink and giveback, and force\r
+ * some upcoming INTR_SF to call finish_unlinks()\r
+ */\r
+ urb_priv = urb->hcpriv;\r
+ if (urb_priv) {\r
+ urb_priv->state = URB_DEL; \r
+ if (urb_priv->ed->state == ED_OPER)\r
+ start_urb_unlink (ohci, urb_priv->ed);\r
+ }\r
+ } else {\r
+ /*\r
+ * with HC dead, we won't respect hc queue pointers\r
+ * any more ... just clean up every urb's memory.\r
+ */\r
+ if (urb->hcpriv) {\r
+ spin_unlock (&ohci->lock);\r
+ finish_urb (ohci, urb, NULL);\r
+ spin_lock (&ohci->lock);\r
+ }\r
+ }\r
+ spin_unlock_irqrestore (&ohci->lock, flags);\r
+ return 0;\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* frees config/altsetting state for endpoints,\r
+ * including ED memory, dummy TD, and bulk/intr data toggle\r
+ */\r
+\r
+static void\r
+ohci_endpoint_disable (struct usb_hcd *hcd, struct hcd_dev *dev, int ep)\r
+{\r
+ struct ohci_hcd *ohci = hcd_to_ohci (hcd);\r
+ int epnum = ep & USB_ENDPOINT_NUMBER_MASK;\r
+ unsigned long flags;\r
+ struct ed *ed;\r
+\r
+ /* ASSERT: any requests/urbs are being unlinked */\r
+ /* ASSERT: nobody can be submitting urbs for this any more */\r
+\r
+ epnum <<= 1;\r
+ if (epnum != 0 && !(ep & USB_DIR_IN))\r
+ epnum |= 1;\r
+\r
+rescan:\r
+ spin_lock_irqsave (&ohci->lock, flags);\r
+ ed = dev->ep [epnum];\r
+ if (!ed)\r
+ goto done;\r
+\r
+ if (!HCD_IS_RUNNING (ohci->hcd.state) || ohci->disabled)\r
+ ed->state = ED_IDLE;\r
+ switch (ed->state) {\r
+ case ED_UNLINK: /* wait for hw to finish? */\r
+ spin_unlock_irqrestore (&ohci->lock, flags);\r
+ set_current_state (TASK_UNINTERRUPTIBLE);\r
+ schedule_timeout (1);\r
+ goto rescan;\r
+ case ED_IDLE: /* fully unlinked */\r
+ if (list_empty (&ed->td_list)) {\r
+ td_free (ohci, ed->dummy);\r
+ ed_free (ohci, ed);\r
+ break;\r
+ }\r
+ /* else FALL THROUGH */\r
+ default:\r
+ /* caller was supposed to have unlinked any requests;\r
+ * that's not our job. can't recover; must leak ed.\r
+ */\r
+ ohci_err (ohci, "ed %p (#%d) state %d%s\n",\r
+ ed, epnum, ed->state,\r
+ list_empty (&ed->td_list) ? "" : "(has tds)");\r
+ td_free (ohci, ed->dummy);\r
+ break;\r
+ }\r
+ dev->ep [epnum] = 0;\r
+done:\r
+ spin_unlock_irqrestore (&ohci->lock, flags);\r
+ return;\r
+}\r
+\r
+static int ohci_get_frame (struct usb_hcd *hcd)\r
+{\r
+ struct ohci_hcd *ohci = hcd_to_ohci (hcd);\r
+\r
+ return le16_to_cpu (ohci->hcca->frame_no);\r
+}\r
+\r
+/*-------------------------------------------------------------------------*\r
+ * HC functions\r
+ *-------------------------------------------------------------------------*/\r
+\r
+/* reset the HC and BUS */\r
+\r
+static int hc_reset (struct ohci_hcd *ohci)\r
+{\r
+ u32 temp;\r
+ u32 ints;\r
+ u32 control;\r
+ \r
+ /* Disable HC interrupts */\r
+ writel (OHCI_INTR_MIE, &ohci->regs->intrdisable);\r
+ // acknowledge all pending interrupts\r
+ ints = readl(&ohci->regs->intrstatus);\r
+ writel (ints, &ohci->regs->intrstatus);\r
+\r
+ if (readl (&ohci->regs->control) & OHCI_CTRL_IR) {\r
+ // takeover without negotiation - there is noone to negotiate with\r
+ control = readl (&ohci->regs->control) & ~OHCI_CTRL_IR;\r
+ writel (control, &ohci->regs->control);\r
+ }\r
+\r
+ ohci_dbg (ohci, "USB HC reset_hc %s: ctrl = 0x%x ;\n",\r
+ hcd_to_bus (&ohci->hcd)->bus_name,\r
+ readl (&ohci->regs->control));\r
+\r
+ /* Reset USB (needed by some controllers); RemoteWakeupConnected\r
+ * saved if boot firmware (BIOS/SMM/...) told us it's connected\r
+ */\r
+ ohci->hc_control = readl (&ohci->regs->control);\r
+ ohci->hc_control &= OHCI_CTRL_RWC; /* hcfs 0 = RESET */\r
+ writel (ohci->hc_control, &ohci->regs->control);\r
+ // flush those pci writes\r
+ (void) readl (&ohci->regs->control);\r
+ wait_ms (50);\r
+\r
+ /* HC Reset requires max 10 us delay */\r
+ writel (OHCI_HCR, &ohci->regs->cmdstatus);\r
+ temp = 30; /* ... allow extra time */\r
+ while ((readl (&ohci->regs->cmdstatus) & OHCI_HCR) != 0) {\r
+ if (--temp == 0) {\r
+ ohci_err (ohci, "USB HC reset timed out!\n");\r
+ return -1;\r
+ }\r
+ udelay (1);\r
+ }\r
+\r
+ /* now we're in the SUSPEND state ... must go OPERATIONAL\r
+ * within 2msec else HC enters RESUME\r
+ *\r
+ * ... but some hardware won't init fmInterval "by the book"\r
+ * (SiS, OPTi ...), so reset again instead. SiS doesn't need\r
+ * this if we write fmInterval after we're OPERATIONAL.\r
+ */\r
+ writel (ohci->hc_control, &ohci->regs->control);\r
+ // flush those pci writes\r
+ (void) readl (&ohci->regs->control);\r
+\r
+ return 0;\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+#define FI 0x2edf /* 12000 bits per frame (-1) */\r
+#define LSTHRESH 0x628 /* lowspeed bit threshold */\r
+\r
+/* Start an OHCI controller, set the BUS operational\r
+ * enable interrupts \r
+ * connect the virtual root hub\r
+ */\r
+static int hc_start (struct ohci_hcd *ohci)\r
+{\r
+ u32 mask, tmp;\r
+ struct usb_device *udev;\r
+ struct usb_bus *bus;\r
+\r
+ spin_lock_init (&ohci->lock);\r
+ ohci->disabled = 1;\r
+ ohci->sleeping = 0;\r
+\r
+ /* Tell the controller where the control and bulk lists are\r
+ * The lists are empty now. */\r
+ writel (0, &ohci->regs->ed_controlhead);\r
+ writel (0, &ohci->regs->ed_bulkhead);\r
+\r
+ /* a reset clears this */\r
+ writel ((u32) ohci->hcca_dma, &ohci->regs->hcca);\r
+// usbprintk("HCCA: %p \n",ohci->regs->hcca);\r
+\r
+ /* force default fmInterval (we won't adjust it); init thresholds\r
+ * for last FS and LS packets, reserve 90% for periodic.\r
+ */\r
+ writel ((((6 * (FI - 210)) / 7) << 16) | FI, &ohci->regs->fminterval);\r
+ writel (((9 * FI) / 10) & 0x3fff, &ohci->regs->periodicstart);\r
+ writel (LSTHRESH, &ohci->regs->lsthresh);\r
+\r
+ /* some OHCI implementations are finicky about how they init.\r
+ * bogus values here mean not even enumeration could work.\r
+ */\r
+ if ((readl (&ohci->regs->fminterval) & 0x3fff0000) == 0\r
+ || !readl (&ohci->regs->periodicstart)) {\r
+ ohci_err (ohci, "init err\n");\r
+ return -EOVERFLOW;\r
+ }\r
+\r
+ /* start controller operations */\r
+ ohci->hc_control &= OHCI_CTRL_RWC;\r
+ ohci->hc_control |= OHCI_CONTROL_INIT | OHCI_USB_OPER;\r
+ ohci->disabled = 0;\r
+ writel (ohci->hc_control, &ohci->regs->control);\r
+\r
+ /* Choose the interrupts we care about now, others later on demand */\r
+ mask = OHCI_INTR_MIE | OHCI_INTR_UE | OHCI_INTR_WDH;\r
+ writel (mask, &ohci->regs->intrstatus);\r
+ writel (mask, &ohci->regs->intrenable);\r
+\r
+ /* handle root hub init quirks ... */\r
+ tmp = roothub_a (ohci);\r
+ tmp &= ~(RH_A_PSM | RH_A_OCPM);\r
+ if (ohci->flags & OHCI_QUIRK_SUPERIO) {\r
+ /* NSC 87560 and maybe others */\r
+ tmp |= RH_A_NOCP;\r
+ tmp &= ~(RH_A_POTPGT | RH_A_NPS);\r
+ } else {\r
+ /* hub power always on; required for AMD-756 and some\r
+ * Mac platforms, use this mode everywhere by default\r
+ */\r
+ tmp |= RH_A_NPS;\r
+ }\r
+ writel (tmp, &ohci->regs->roothub.a);\r
+ writel (RH_HS_LPSC, &ohci->regs->roothub.status);\r
+ writel (0, &ohci->regs->roothub.b);\r
+ // flush those pci writes\r
+ (void) readl (&ohci->regs->control);\r
+\r
+ // POTPGT delay is bits 24-31, in 2 ms units.\r
+ mdelay ((roothub_a (ohci) >> 23) & 0x1fe);\r
+ \r
+ /* connect the virtual root hub */\r
+ bus = hcd_to_bus (&ohci->hcd);\r
+ bus->root_hub = udev = usb_alloc_dev (NULL, bus);\r
+ ohci->hcd.state = USB_STATE_READY;\r
+ if (!udev) {\r
+ disable (ohci);\r
+ ohci->hc_control &= ~OHCI_CTRL_HCFS;\r
+ writel (ohci->hc_control, &ohci->regs->control);\r
+ ohci_err(ohci,"out of mem");\r
+ return -ENOMEM;\r
+ }\r
+\r
+ usb_connect (udev);\r
+ udev->speed = USB_SPEED_FULL;\r
+ if (hcd_register_root (&ohci->hcd) != 0) {\r
+ usb_put_dev (udev);\r
+ bus->root_hub = NULL;\r
+ disable (ohci);\r
+ ohci->hc_control &= ~OHCI_CTRL_HCFS;\r
+ writel (ohci->hc_control, &ohci->regs->control);\r
+ return -ENODEV;\r
+ }\r
+ create_debug_files (ohci);\r
+ return 0;\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* an interrupt happens */\r
+\r
+static void ohci_irq (struct usb_hcd *hcd, struct pt_regs *ptregs)\r
+{\r
+ struct ohci_hcd *ohci = hcd_to_ohci (hcd);\r
+ struct ohci_regs *regs = ohci->regs;\r
+ int ints; \r
+\r
+ /* we can eliminate a (slow) readl() if _only_ WDH caused this irq */\r
+ if ((ohci->hcca->done_head != 0)\r
+ && ! (le32_to_cpup (&ohci->hcca->done_head) & 0x01)) {\r
+ ints = OHCI_INTR_WDH;\r
+\r
+ /* cardbus/... hardware gone before remove() */\r
+ } else if ((ints = readl (®s->intrstatus)) == ~(u32)0) {\r
+ disable (ohci);\r
+ ohci_dbg (ohci, "device removed!\n");\r
+ return;\r
+\r
+ /* interrupt for some other device? */\r
+ } else if ((ints &= readl (®s->intrenable)) == 0) {\r
+ return;\r
+ } \r
+\r
+ if (ints & OHCI_INTR_UE) {\r
+ disable (ohci);\r
+ ohci_err (ohci, "OHCI Unrecoverable Error, disabled\n");\r
+ // e.g. due to PCI Master/Target Abort\r
+\r
+ ohci_dump (ohci, 1);\r
+ hc_reset (ohci);\r
+ }\r
+ \r
+ if (ints & OHCI_INTR_WDH) {\r
+ writel (OHCI_INTR_WDH, ®s->intrdisable); \r
+ dl_done_list (ohci, dl_reverse_done_list (ohci), ptregs);\r
+ writel (OHCI_INTR_WDH, ®s->intrenable); \r
+ }\r
+ \r
+ /* could track INTR_SO to reduce available PCI/... bandwidth */\r
+\r
+ /* handle any pending URB/ED unlinks, leaving INTR_SF enabled\r
+ * when there's still unlinking to be done (next frame).\r
+ */\r
+ spin_lock (&ohci->lock);\r
+ if (ohci->ed_rm_list)\r
+ finish_unlinks (ohci, le16_to_cpu (ohci->hcca->frame_no),\r
+ ptregs);\r
+ if ((ints & OHCI_INTR_SF) != 0 && !ohci->ed_rm_list)\r
+ writel (OHCI_INTR_SF, ®s->intrdisable); \r
+ spin_unlock (&ohci->lock);\r
+\r
+ writel (ints, ®s->intrstatus);\r
+ writel (OHCI_INTR_MIE, ®s->intrenable); \r
+ // flush those pci writes\r
+ (void) readl (&ohci->regs->control);\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+static void ohci_stop (struct usb_hcd *hcd)\r
+{ \r
+ struct ohci_hcd *ohci = hcd_to_ohci (hcd);\r
+ struct ohci_regs *regs = ohci->regs;\r
+ int ints;\r
+\r
+ ohci_dbg (ohci, "stop %s controller%s\n",\r
+ hcfs2string (ohci->hc_control & OHCI_CTRL_HCFS),\r
+ ohci->disabled ? " (disabled)" : ""\r
+ );\r
+ ohci_dump (ohci, 1);\r
+\r
+ if (!ohci->disabled)\r
+ hc_reset (ohci);\r
+\r
+ // Disable all interrupts\r
+ writel (OHCI_INTR_MIE, ®s->intrdisable); \r
+ // acknowledge all pending interrupts\r
+ ints = readl(®s->intrstatus);\r
+ writel (ints, ®s->intrstatus);\r
+ // flush register writes\r
+ (void) readl (&ohci->regs->control);\r
+ \r
+ remove_debug_files (ohci);\r
+ ohci_mem_cleanup (ohci);\r
+ if (ohci->hcca) {\r
+ pci_free_consistent (ohci->hcd.pdev, sizeof *ohci->hcca,\r
+ ohci->hcca, ohci->hcca_dma);\r
+ ohci->hcca = NULL;\r
+ ohci->hcca_dma = 0;\r
+ }\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+// FIXME: this restart logic should be generic,\r
+// and handle full hcd state cleanup\r
+\r
+/* controller died; cleanup debris, then restart */\r
+/* must not be called from interrupt context */\r
+\r
+#ifdef CONFIG_PM\r
+static int hc_restart (struct ohci_hcd *ohci)\r
+{\r
+ int temp;\r
+ int i;\r
+\r
+ ohci->disabled = 1;\r
+ ohci->sleeping = 0;\r
+ if (hcd_to_bus (&ohci->hcd)->root_hub)\r
+ usb_disconnect (&hcd_to_bus (&ohci->hcd)->root_hub);\r
+ \r
+ /* empty the interrupt branches */\r
+ for (i = 0; i < NUM_INTS; i++) ohci->load [i] = 0;\r
+ for (i = 0; i < NUM_INTS; i++) ohci->hcca->int_table [i] = 0;\r
+ \r
+ /* no EDs to remove */\r
+ ohci->ed_rm_list = NULL;\r
+\r
+ /* empty control and bulk lists */ \r
+ ohci->ed_controltail = NULL;\r
+ ohci->ed_bulktail = NULL;\r
+\r
+ if ((temp = hc_reset (ohci)) < 0 || (temp = hc_start (ohci)) < 0) {\r
+ ohci_err (ohci, "can't restart, %d\n", temp);\r
+ return temp;\r
+ } else\r
+ ohci_dbg (ohci, "restart complete\n");\r
+ return 0;\r
+}\r
+#endif\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+#define DRIVER_INFO DRIVER_VERSION " " DRIVER_DESC\r
+\r
+MODULE_AUTHOR (DRIVER_AUTHOR);\r
+MODULE_DESCRIPTION (DRIVER_INFO);\r
+MODULE_LICENSE ("GPL");\r
+\r
+#ifdef CONFIG_PCI\r
+#include "ohci-pci.c"\r
+#endif\r
+\r
+#ifdef CONFIG_SA1111\r
+#include "ohci-sa1111.c"\r
+#endif\r
+\r
+#if !(defined(CONFIG_PCI) || defined(CONFIG_SA1111))\r
+#error "missing bus glue for ohci-hcd"\r
+#endif\r
--- /dev/null
+/*\r
+ * OHCI HCD (Host Controller Driver) for USB.\r
+ * \r
+ * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>\r
+ * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net>\r
+ * \r
+ * This file is licenced under GPL\r
+ */\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/*\r
+ * OHCI Root Hub ... the nonsharable stuff\r
+ *\r
+ * Registers don't need cpu_to_le32, that happens transparently\r
+ */\r
+\r
+/* AMD-756 (D2 rev) reports corrupt register contents in some cases.\r
+ * The erratum (#4) description is incorrect. AMD's workaround waits\r
+ * till some bits (mostly reserved) are clear; ok for all revs.\r
+ */\r
+#define read_roothub(hc, register, mask) ({ \\r
+ u32 temp = readl (&hc->regs->roothub.register); \\r
+ if (temp == -1) \\r
+ disable (hc); \\r
+ else if (hc->flags & OHCI_QUIRK_AMD756) \\r
+ while (temp & mask) \\r
+ temp = readl (&hc->regs->roothub.register); \\r
+ temp; })\r
+\r
+static u32 roothub_a (struct ohci_hcd *hc)\r
+ { return read_roothub (hc, a, 0xfc0fe000); }\r
+static inline u32 roothub_b (struct ohci_hcd *hc)\r
+ { return readl (&hc->regs->roothub.b); }\r
+static inline u32 roothub_status (struct ohci_hcd *hc)\r
+ { return readl (&hc->regs->roothub.status); }\r
+static u32 roothub_portstatus (struct ohci_hcd *hc, int i)\r
+ { return read_roothub (hc, portstatus [i], 0xffe0fce0); }\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+#define dbg_port(hc,label,num,value) \\r
+ ohci_dbg (hc, \\r
+ "%s roothub.portstatus [%d] " \\r
+ "= 0x%08x%s%s%s%s%s%s%s%s%s%s%s%s\n", \\r
+ label, num, temp, \\r
+ (temp & RH_PS_PRSC) ? " PRSC" : "", \\r
+ (temp & RH_PS_OCIC) ? " OCIC" : "", \\r
+ (temp & RH_PS_PSSC) ? " PSSC" : "", \\r
+ (temp & RH_PS_PESC) ? " PESC" : "", \\r
+ (temp & RH_PS_CSC) ? " CSC" : "", \\r
+ \\r
+ (temp & RH_PS_LSDA) ? " LSDA" : "", \\r
+ (temp & RH_PS_PPS) ? " PPS" : "", \\r
+ (temp & RH_PS_PRS) ? " PRS" : "", \\r
+ (temp & RH_PS_POCI) ? " POCI" : "", \\r
+ (temp & RH_PS_PSS) ? " PSS" : "", \\r
+ \\r
+ (temp & RH_PS_PES) ? " PES" : "", \\r
+ (temp & RH_PS_CCS) ? " CCS" : "" \\r
+ );\r
+\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* build "status change" packet (one or two bytes) from HC registers */\r
+\r
+static int\r
+ohci_hub_status_data (struct usb_hcd *hcd, char *buf)\r
+{\r
+ struct ohci_hcd *ohci = hcd_to_ohci (hcd);\r
+ int ports, i, changed = 0, length = 1;\r
+\r
+ ports = roothub_a (ohci) & RH_A_NDP; \r
+ if (ports > MAX_ROOT_PORTS) {\r
+ if (ohci->disabled)\r
+ return -ESHUTDOWN;\r
+ ohci_err (ohci, "bogus NDP=%d, rereads as NDP=%d\n",\r
+ ports, readl (&ohci->regs->roothub.a) & RH_A_NDP);\r
+ /* retry later; "should not happen" */\r
+ return 0;\r
+ }\r
+\r
+ /* init status */\r
+ if (roothub_status (ohci) & (RH_HS_LPSC | RH_HS_OCIC))\r
+ buf [0] = changed = 1;\r
+ else\r
+ buf [0] = 0;\r
+ if (ports > 7) {\r
+ buf [1] = 0;\r
+ length++;\r
+ }\r
+\r
+ /* look at each port */\r
+ for (i = 0; i < ports; i++) {\r
+ u32 status = roothub_portstatus (ohci, i);\r
+\r
+ status &= RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC\r
+ | RH_PS_OCIC | RH_PS_PRSC;\r
+ if (status) {\r
+ changed = 1;\r
+ if (i < 7)\r
+ buf [0] |= 1 << (i + 1);\r
+ else\r
+ buf [1] |= 1 << (i - 7);\r
+ }\r
+ }\r
+ return changed ? length : 0;\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+static void\r
+ohci_hub_descriptor (\r
+ struct ohci_hcd *ohci,\r
+ struct usb_hub_descriptor *desc\r
+) {\r
+ u32 rh = roothub_a (ohci);\r
+ int ports = rh & RH_A_NDP; \r
+ u16 temp;\r
+\r
+ desc->bDescriptorType = 0x29;\r
+ desc->bPwrOn2PwrGood = (rh & RH_A_POTPGT) >> 24;\r
+ desc->bHubContrCurrent = 0;\r
+\r
+ desc->bNbrPorts = ports;\r
+ temp = 1 + (ports / 8);\r
+ desc->bDescLength = 7 + 2 * temp;\r
+\r
+ temp = 0;\r
+ if (rh & RH_A_PSM) /* per-port power switching? */\r
+ temp |= 0x0001;\r
+ if (rh & RH_A_NOCP) /* no overcurrent reporting? */\r
+ temp |= 0x0010;\r
+ else if (rh & RH_A_OCPM) /* per-port overcurrent reporting? */\r
+ temp |= 0x0008;\r
+ desc->wHubCharacteristics = cpu_to_le16 (temp);\r
+\r
+ /* two bitmaps: ports removable, and usb 1.0 legacy PortPwrCtrlMask */\r
+ rh = roothub_b (ohci);\r
+ desc->bitmap [0] = rh & RH_B_DR;\r
+ if (ports > 7) {\r
+ desc->bitmap [1] = (rh & RH_B_DR) >> 8;\r
+ desc->bitmap [2] = desc->bitmap [3] = 0xff;\r
+ } else\r
+ desc->bitmap [1] = 0xff;\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+static int ohci_hub_control (\r
+ struct usb_hcd *hcd,\r
+ u16 typeReq,\r
+ u16 wValue,\r
+ u16 wIndex,\r
+ char *buf,\r
+ u16 wLength\r
+) {\r
+ struct ohci_hcd *ohci = hcd_to_ohci (hcd);\r
+ int ports = hcd_to_bus (hcd)->root_hub->maxchild;\r
+ u32 temp;\r
+ int retval = 0;\r
+\r
+ switch (typeReq) {\r
+ case ClearHubFeature:\r
+ switch (wValue) {\r
+ case C_HUB_OVER_CURRENT:\r
+ writel (RH_HS_OCIC, &ohci->regs->roothub.status);\r
+ case C_HUB_LOCAL_POWER:\r
+ break;\r
+ default:\r
+ goto error;\r
+ }\r
+ break;\r
+ case ClearPortFeature:\r
+ if (!wIndex || wIndex > ports)\r
+ goto error;\r
+ wIndex--;\r
+\r
+ switch (wValue) {\r
+ case USB_PORT_FEAT_ENABLE:\r
+ temp = RH_PS_CCS;\r
+ break;\r
+ case USB_PORT_FEAT_C_ENABLE:\r
+ temp = RH_PS_PESC;\r
+ break;\r
+ case USB_PORT_FEAT_SUSPEND:\r
+ temp = RH_PS_POCI;\r
+ break;\r
+ case USB_PORT_FEAT_C_SUSPEND:\r
+ temp = RH_PS_PSSC;\r
+ break;\r
+ case USB_PORT_FEAT_POWER:\r
+ temp = RH_PS_LSDA;\r
+ break;\r
+ case USB_PORT_FEAT_C_CONNECTION:\r
+ temp = RH_PS_CSC;\r
+ break;\r
+ case USB_PORT_FEAT_C_OVER_CURRENT:\r
+ temp = RH_PS_OCIC;\r
+ break;\r
+ case USB_PORT_FEAT_C_RESET:\r
+ temp = RH_PS_PRSC;\r
+ break;\r
+ default:\r
+ goto error;\r
+ }\r
+ writel (temp, &ohci->regs->roothub.portstatus [wIndex]);\r
+ // readl (&ohci->regs->roothub.portstatus [wIndex]);\r
+ break;\r
+ case GetHubDescriptor:\r
+ ohci_hub_descriptor (ohci, (struct usb_hub_descriptor *) buf);\r
+ break;\r
+ case GetHubStatus:\r
+ temp = roothub_status (ohci) & ~(RH_HS_CRWE | RH_HS_DRWE);\r
+ *(u32 *) buf = cpu_to_le32 (temp);\r
+ break;\r
+ case GetPortStatus:\r
+ if (!wIndex || wIndex > ports)\r
+ goto error;\r
+ wIndex--;\r
+ temp = roothub_portstatus (ohci, wIndex);\r
+ *(u32 *) buf = cpu_to_le32 (temp);\r
+\r
+#ifndef OHCI_VERBOSE_DEBUG\r
+ if (*(u16*)(buf+2)) /* only if wPortChange is interesting */\r
+#endif\r
+ dbg_port (ohci, "GetStatus", wIndex + 1, temp);\r
+ break;\r
+ case SetHubFeature:\r
+ switch (wValue) {\r
+ case C_HUB_OVER_CURRENT:\r
+ // FIXME: this can be cleared, yes?\r
+ case C_HUB_LOCAL_POWER:\r
+ break;\r
+ default:\r
+ goto error;\r
+ }\r
+ break;\r
+ case SetPortFeature:\r
+ if (!wIndex || wIndex > ports)\r
+ goto error;\r
+ wIndex--;\r
+ switch (wValue) {\r
+ case USB_PORT_FEAT_SUSPEND:\r
+ writel (RH_PS_PSS,\r
+ &ohci->regs->roothub.portstatus [wIndex]);\r
+ break;\r
+ case USB_PORT_FEAT_POWER:\r
+ writel (RH_PS_PPS,\r
+ &ohci->regs->roothub.portstatus [wIndex]);\r
+ break;\r
+ case USB_PORT_FEAT_RESET:\r
+ temp = readl (&ohci->regs->roothub.portstatus [wIndex]);\r
+ if (temp & RH_PS_CCS)\r
+ writel (RH_PS_PRS,\r
+ &ohci->regs->roothub.portstatus [wIndex]);\r
+ break;\r
+ default:\r
+ goto error;\r
+ }\r
+ break;\r
+\r
+ default:\r
+error:\r
+ /* "protocol stall" on error */\r
+ retval = -EPIPE;\r
+ }\r
+ return retval;\r
+}\r
+\r
--- /dev/null
+/*\r
+ * OHCI HCD (Host Controller Driver) for USB.\r
+ * \r
+ * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>\r
+ * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net>\r
+ * \r
+ * This file is licenced under the GPL.\r
+ */\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/*\r
+ * There's basically three types of memory:\r
+ * - data used only by the HCD ... kmalloc is fine\r
+ * - async and periodic schedules, shared by HC and HCD ... these\r
+ * need to use pci_pool or pci_alloc_consistent\r
+ * - driver buffers, read/written by HC ... the hcd glue or the\r
+ * device driver provides us with dma addresses\r
+ *\r
+ * There's also PCI "register" data, which is memory mapped.\r
+ * No memory seen by this driver is pagable.\r
+ */\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+static struct usb_hcd *ohci_hcd_alloc (void)\r
+{\r
+ struct ohci_hcd *ohci;\r
+\r
+ ohci = (struct ohci_hcd *) kmalloc (sizeof *ohci, GFP_KERNEL);\r
+ if (ohci != 0) {\r
+ memset (ohci, 0, sizeof (struct ohci_hcd));\r
+ return &ohci->hcd;\r
+ }\r
+ return 0;\r
+}\r
+\r
+static void ohci_hcd_free (struct usb_hcd *hcd)\r
+{\r
+ kfree (hcd_to_ohci (hcd));\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+static int ohci_mem_init (struct ohci_hcd *ohci)\r
+{\r
+ ohci->td_cache = pci_pool_create ("ohci_td", ohci->hcd.pdev,\r
+ sizeof (struct td),\r
+ 32 /* byte alignment */,\r
+ 0 /* no page-crossing issues */);\r
+ if (!ohci->td_cache)\r
+ return -ENOMEM;\r
+ ohci->ed_cache = pci_pool_create ("ohci_ed", ohci->hcd.pdev,\r
+ sizeof (struct ed),\r
+ 16 /* byte alignment */,\r
+ 0 /* no page-crossing issues */);\r
+ if (!ohci->ed_cache) {\r
+ pci_pool_destroy (ohci->td_cache);\r
+ return -ENOMEM;\r
+ }\r
+ return 0;\r
+}\r
+\r
+static void ohci_mem_cleanup (struct ohci_hcd *ohci)\r
+{\r
+ if (ohci->td_cache) {\r
+ pci_pool_destroy (ohci->td_cache);\r
+ ohci->td_cache = 0;\r
+ }\r
+ if (ohci->ed_cache) {\r
+ pci_pool_destroy (ohci->ed_cache);\r
+ ohci->ed_cache = 0;\r
+ }\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* ohci "done list" processing needs this mapping */\r
+static inline struct td *\r
+dma_to_td (struct ohci_hcd *hc, dma_addr_t td_dma)\r
+{\r
+ struct td *td;\r
+\r
+ td_dma &= TD_MASK;\r
+ td = hc->td_hash [TD_HASH_FUNC(td_dma)];\r
+ while (td && td->td_dma != td_dma)\r
+ td = td->td_hash;\r
+ return td;\r
+}\r
+\r
+/* TDs ... */\r
+static struct td *\r
+td_alloc (struct ohci_hcd *hc, int mem_flags)\r
+{\r
+ dma_addr_t dma;\r
+ struct td *td;\r
+\r
+ td = pci_pool_alloc (hc->td_cache, mem_flags, &dma);\r
+ if (td) {\r
+ /* in case hc fetches it, make it look dead */\r
+ memset (td, 0, sizeof *td);\r
+ td->hwNextTD = cpu_to_le32 (dma);\r
+ td->td_dma = dma;\r
+ /* hashed in td_fill */\r
+ }\r
+ return td;\r
+}\r
+\r
+static void\r
+td_free (struct ohci_hcd *hc, struct td *td)\r
+{\r
+ struct td **prev = &hc->td_hash [TD_HASH_FUNC (td->td_dma)];\r
+\r
+ while (*prev && *prev != td)\r
+ prev = &(*prev)->td_hash;\r
+ if (*prev)\r
+ *prev = td->td_hash;\r
+ else if ((td->hwINFO & TD_DONE) != 0)\r
+ ohci_dbg (hc, "no hash for td %p\n", td);\r
+ pci_pool_free (hc->td_cache, td, td->td_dma);\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* EDs ... */\r
+static struct ed *\r
+ed_alloc (struct ohci_hcd *hc, int mem_flags)\r
+{\r
+ dma_addr_t dma;\r
+ struct ed *ed;\r
+\r
+ ed = pci_pool_alloc (hc->ed_cache, mem_flags, &dma);\r
+ if (ed) {\r
+ memset (ed, 0, sizeof (*ed));\r
+ INIT_LIST_HEAD (&ed->td_list);\r
+ ed->dma = dma;\r
+ }\r
+ return ed;\r
+}\r
+\r
+static void\r
+ed_free (struct ohci_hcd *hc, struct ed *ed)\r
+{\r
+ pci_pool_free (hc->ed_cache, ed, ed->dma);\r
+}\r
+\r
--- /dev/null
+/*\r
+ * OHCI HCD (Host Controller Driver) for USB.\r
+ *\r
+ * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>\r
+ * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net>\r
+ * \r
+ * [ Initialisation is based on Linus' ]\r
+ * [ uhci code and gregs ohci fragments ]\r
+ * [ (C) Copyright 1999 Linus Torvalds ]\r
+ * [ (C) Copyright 1999 Gregory P. Smith]\r
+ * \r
+ * PCI Bus Glue\r
+ *\r
+ * This file is licenced under the GPL.\r
+ */\r
+ \r
+#ifdef CONFIG_PMAC_PBOOK\r
+#include <asm/machdep.h>\r
+#include <asm/pmac_feature.h>\r
+#include <asm/pci-bridge.h>\r
+#include <asm/prom.h>\r
+#ifndef CONFIG_PM\r
+# define CONFIG_PM\r
+#endif\r
+#endif\r
+\r
+#ifndef CONFIG_PCI\r
+#error "This file is PCI bus glue. CONFIG_PCI must be defined."\r
+#endif\r
+\r
+#include "../linux/pci_ids.h"\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+static int __devinit\r
+ohci_pci_start (struct usb_hcd *hcd)\r
+{\r
+ struct ohci_hcd *ohci = hcd_to_ohci (hcd);\r
+ int ret;\r
+\r
+ if (hcd->pdev) {\r
+ ohci->hcca = pci_alloc_consistent (hcd->pdev,\r
+ sizeof *ohci->hcca, &ohci->hcca_dma);\r
+ if (!ohci->hcca)\r
+ return -ENOMEM;\r
+\r
+ /* AMD 756, for most chips (early revs), corrupts register\r
+ * values on read ... so enable the vendor workaround.\r
+ */\r
+ if (hcd->pdev->vendor == PCI_VENDOR_ID_AMD\r
+ && hcd->pdev->device == 0x740c) {\r
+ ohci->flags = OHCI_QUIRK_AMD756;\r
+ ohci_info (ohci, "AMD756 erratum 4 workaround\n");\r
+ }\r
+\r
+ /* FIXME for some of the early AMD 760 southbridges, OHCI\r
+ * won't work at all. blacklist them.\r
+ */\r
+\r
+ /* Apple's OHCI driver has a lot of bizarre workarounds\r
+ * for this chip. Evidently control and bulk lists\r
+ * can get confused. (B&W G3 models, and ...)\r
+ */\r
+ else if (hcd->pdev->vendor == PCI_VENDOR_ID_OPTI\r
+ && hcd->pdev->device == 0xc861) {\r
+ ohci_info (ohci,\r
+ "WARNING: OPTi workarounds unavailable\n");\r
+ }\r
+\r
+ /* Check for NSC87560. We have to look at the bridge (fn1) to\r
+ * identify the USB (fn2). This quirk might apply to more or\r
+ * even all NSC stuff.\r
+ */\r
+ else if (hcd->pdev->vendor == PCI_VENDOR_ID_NS) {\r
+ struct pci_dev *b, *hc;\r
+\r
+ hc = hcd->pdev;\r
+ b = pci_find_slot (hc->bus->number,\r
+ PCI_DEVFN (PCI_SLOT (hc->devfn), 1));\r
+ if (b && b->device == PCI_DEVICE_ID_NS_87560_LIO\r
+ && b->vendor == PCI_VENDOR_ID_NS) {\r
+ ohci->flags |= OHCI_QUIRK_SUPERIO;\r
+ ohci_info (ohci, "Using NSC SuperIO setup\n");\r
+ }\r
+ }\r
+ \r
+ }\r
+\r
+ memset (ohci->hcca, 0, sizeof (struct ohci_hcca));\r
+ if ((ret = ohci_mem_init (ohci)) < 0) {\r
+ ohci_stop (hcd);\r
+ return ret;\r
+ }\r
+ ohci->regs = hcd->regs;\r
+\r
+ if (hc_reset (ohci) < 0) {\r
+ ohci_stop (hcd);\r
+ return -ENODEV;\r
+ }\r
+\r
+ if (hc_start (ohci) < 0) {\r
+ ohci_err (ohci, "can't start\n");\r
+ ohci_stop (hcd);\r
+ return -EBUSY;\r
+ }\r
+\r
+#ifdef DEBUG\r
+ ohci_dump (ohci, 1);\r
+#endif\r
+ return 0;\r
+}\r
+\r
+#ifdef CONFIG_PM\r
+\r
+static int ohci_pci_suspend (struct usb_hcd *hcd, u32 state)\r
+{\r
+ struct ohci_hcd *ohci = hcd_to_ohci (hcd);\r
+ unsigned long flags;\r
+ u16 cmd;\r
+\r
+ if ((ohci->hc_control & OHCI_CTRL_HCFS) != OHCI_USB_OPER) {\r
+ ohci_dbg (ohci, "can't suspend (state is %s)\n",\r
+ hcfs2string (ohci->hc_control & OHCI_CTRL_HCFS));\r
+ return -EIO;\r
+ }\r
+\r
+ /* act as if usb suspend can always be used */\r
+ ohci_dbg (ohci, "suspend to %d\n", state);\r
+ ohci->sleeping = 1;\r
+\r
+ /* First stop processing */\r
+ spin_lock_irqsave (&ohci->lock, flags);\r
+ ohci->hc_control &=\r
+ ~(OHCI_CTRL_PLE|OHCI_CTRL_CLE|OHCI_CTRL_BLE|OHCI_CTRL_IE);\r
+ writel (ohci->hc_control, &ohci->regs->control);\r
+ writel (OHCI_INTR_SF, &ohci->regs->intrstatus);\r
+ (void) readl (&ohci->regs->intrstatus);\r
+ spin_unlock_irqrestore (&ohci->lock, flags);\r
+\r
+ /* Wait a frame or two */\r
+ mdelay (1);\r
+ if (!readl (&ohci->regs->intrstatus) & OHCI_INTR_SF)\r
+ mdelay (1);\r
+ \r
+#ifdef CONFIG_PMAC_PBOOK\r
+ if (_machine == _MACH_Pmac)\r
+ disable_irq (hcd->pdev->irq);\r
+ /* else, 2.4 assumes shared irqs -- don't disable */\r
+#endif\r
+\r
+ /* Enable remote wakeup */\r
+ writel (readl (&ohci->regs->intrenable) | OHCI_INTR_RD,\r
+ &ohci->regs->intrenable);\r
+\r
+ /* Suspend chip and let things settle down a bit */\r
+ ohci->hc_control = OHCI_USB_SUSPEND;\r
+ writel (ohci->hc_control, &ohci->regs->control);\r
+ (void) readl (&ohci->regs->control);\r
+ mdelay (500); /* No schedule here ! */\r
+\r
+ switch (readl (&ohci->regs->control) & OHCI_CTRL_HCFS) {\r
+ case OHCI_USB_RESET:\r
+ ohci_dbg (ohci, "suspend->reset ?\n");\r
+ break;\r
+ case OHCI_USB_RESUME:\r
+ ohci_dbg (ohci, "suspend->resume ?\n");\r
+ break;\r
+ case OHCI_USB_OPER:\r
+ ohci_dbg (ohci, "suspend->operational ?\n");\r
+ break;\r
+ case OHCI_USB_SUSPEND:\r
+ ohci_dbg (ohci, "suspended\n");\r
+ break;\r
+ }\r
+\r
+ /* In some rare situations, Apple's OHCI have happily trashed\r
+ * memory during sleep. We disable its bus master bit during\r
+ * suspend\r
+ */\r
+ pci_read_config_word (hcd->pdev, PCI_COMMAND, &cmd);\r
+ cmd &= ~PCI_COMMAND_MASTER;\r
+ pci_write_config_word (hcd->pdev, PCI_COMMAND, cmd);\r
+#ifdef CONFIG_PMAC_PBOOK\r
+ {\r
+ struct device_node *of_node;\r
+ \r
+ /* Disable USB PAD & cell clock */\r
+ of_node = pci_device_to_OF_node (hcd->pdev);\r
+ if (of_node)\r
+ pmac_call_feature(PMAC_FTR_USB_ENABLE, of_node, 0, 0);\r
+ }\r
+#endif\r
+ return 0;\r
+}\r
+\r
+\r
+static int ohci_pci_resume (struct usb_hcd *hcd)\r
+{\r
+ struct ohci_hcd *ohci = hcd_to_ohci (hcd);\r
+ int temp;\r
+ int retval = 0;\r
+ unsigned long flags;\r
+\r
+#ifdef CONFIG_PMAC_PBOOK\r
+ {\r
+ struct device_node *of_node;\r
+\r
+ /* Re-enable USB PAD & cell clock */\r
+ of_node = pci_device_to_OF_node (hcd->pdev);\r
+ if (of_node)\r
+ pmac_call_feature (PMAC_FTR_USB_ENABLE, of_node, 0, 1);\r
+ }\r
+#endif\r
+ /* did we suspend, or were we powered off? */\r
+ ohci->hc_control = readl (&ohci->regs->control);\r
+ temp = ohci->hc_control & OHCI_CTRL_HCFS;\r
+\r
+#ifdef DEBUG\r
+ /* the registers may look crazy here */\r
+ ohci_dump_status (ohci, 0, 0);\r
+#endif\r
+\r
+ /* Re-enable bus mastering */\r
+ pci_set_master (ohci->hcd.pdev);\r
+ \r
+ switch (temp) {\r
+\r
+ case OHCI_USB_RESET: // lost power\r
+ ohci_info (ohci, "USB restart\n");\r
+ retval = hc_restart (ohci);\r
+ break;\r
+\r
+ case OHCI_USB_SUSPEND: // host wakeup\r
+ case OHCI_USB_RESUME: // remote wakeup\r
+ ohci_info (ohci, "USB continue from %s wakeup\n",\r
+ (temp == OHCI_USB_SUSPEND)\r
+ ? "host" : "remote");\r
+ ohci->hc_control = OHCI_USB_RESUME;\r
+ writel (ohci->hc_control, &ohci->regs->control);\r
+ (void) readl (&ohci->regs->control);\r
+ mdelay (20); /* no schedule here ! */\r
+ /* Some controllers (lucent) need a longer delay here */\r
+ mdelay (15);\r
+\r
+ temp = readl (&ohci->regs->control);\r
+ temp = ohci->hc_control & OHCI_CTRL_HCFS;\r
+ if (temp != OHCI_USB_RESUME) {\r
+ ohci_err (ohci, "controller won't resume\n");\r
+ ohci->disabled = 1;\r
+ retval = -EIO;\r
+ break;\r
+ }\r
+\r
+ /* Some chips likes being resumed first */\r
+ writel (OHCI_USB_OPER, &ohci->regs->control);\r
+ (void) readl (&ohci->regs->control);\r
+ mdelay (3);\r
+\r
+ /* Then re-enable operations */\r
+ spin_lock_irqsave (&ohci->lock, flags);\r
+ ohci->disabled = 0;\r
+ ohci->sleeping = 0;\r
+ ohci->hc_control = OHCI_CONTROL_INIT | OHCI_USB_OPER;\r
+ if (!ohci->ed_rm_list) {\r
+ if (ohci->ed_controltail)\r
+ ohci->hc_control |= OHCI_CTRL_CLE;\r
+ if (ohci->ed_bulktail)\r
+ ohci->hc_control |= OHCI_CTRL_BLE;\r
+ }\r
+ hcd->state = USB_STATE_READY;\r
+ writel (ohci->hc_control, &ohci->regs->control);\r
+\r
+ /* trigger a start-frame interrupt (why?) */\r
+ writel (OHCI_INTR_SF, &ohci->regs->intrstatus);\r
+ writel (OHCI_INTR_SF, &ohci->regs->intrenable);\r
+\r
+ /* Check for a pending done list */\r
+ writel (OHCI_INTR_WDH, &ohci->regs->intrdisable); \r
+ (void) readl (&ohci->regs->intrdisable);\r
+ spin_unlock_irqrestore (&ohci->lock, flags);\r
+\r
+#ifdef CONFIG_PMAC_PBOOK\r
+ if (_machine == _MACH_Pmac)\r
+ enable_irq (hcd->pdev->irq);\r
+#endif\r
+ if (ohci->hcca->done_head)\r
+ dl_done_list (ohci, dl_reverse_done_list (ohci), NULL);\r
+ writel (OHCI_INTR_WDH, &ohci->regs->intrenable); \r
+\r
+ /* assume there are TDs on the bulk and control lists */\r
+ writel (OHCI_BLF | OHCI_CLF, &ohci->regs->cmdstatus);\r
+\r
+// ohci_dump_status (ohci);\r
+ohci_dbg (ohci, "sleeping = %d, disabled = %d\n",\r
+ ohci->sleeping, ohci->disabled);\r
+ break;\r
+\r
+ default:\r
+ ohci_warn (ohci, "odd PCI resume\n");\r
+ }\r
+ return retval;\r
+}\r
+\r
+#endif /* CONFIG_PM */\r
+\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+static const struct hc_driver ohci_pci_hc_driver = {\r
+ .description = hcd_name,\r
+\r
+ /*\r
+ * generic hardware linkage\r
+ */\r
+ .irq = ohci_irq,\r
+ .flags = HCD_MEMORY | HCD_USB11,\r
+\r
+ /*\r
+ * basic lifecycle operations\r
+ */\r
+ .start = ohci_pci_start,\r
+#ifdef CONFIG_PM\r
+ .suspend = ohci_pci_suspend,\r
+ .resume = ohci_pci_resume,\r
+#endif\r
+ .stop = ohci_stop,\r
+\r
+ /*\r
+ * memory lifecycle (except per-request)\r
+ */\r
+ .hcd_alloc = ohci_hcd_alloc,\r
+ .hcd_free = ohci_hcd_free,\r
+\r
+ /*\r
+ * managing i/o requests and associated device resources\r
+ */\r
+ .urb_enqueue = ohci_urb_enqueue,\r
+ .urb_dequeue = ohci_urb_dequeue,\r
+ .endpoint_disable = ohci_endpoint_disable,\r
+\r
+ /*\r
+ * scheduling support\r
+ */\r
+ .get_frame_number = ohci_get_frame,\r
+\r
+ /*\r
+ * root hub support\r
+ */\r
+ .hub_status_data = ohci_hub_status_data,\r
+ .hub_control = ohci_hub_control,\r
+};\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+static const struct pci_device_id __devinitdata pci_ids [] = { {\r
+\r
+ /* handle any USB OHCI controller */\r
+ .class = (PCI_CLASS_SERIAL_USB << 8) | 0x10,\r
+ .class_mask = ~0,\r
+ .driver_data = (unsigned long) &ohci_pci_hc_driver,\r
+\r
+ /* no matter who makes it */\r
+ .vendor = PCI_ANY_ID,\r
+ .device = PCI_ANY_ID,\r
+ .subvendor = PCI_ANY_ID,\r
+ .subdevice = PCI_ANY_ID,\r
+\r
+ }, { /* end: all zeroes */ }\r
+};\r
+MODULE_DEVICE_TABLE (pci, pci_ids);\r
+\r
+/* pci driver glue; this is a "new style" PCI driver module */\r
+static struct pci_driver ohci_pci_driver = {\r
+ .name = (char *) hcd_name,\r
+ .id_table = pci_ids,\r
+\r
+ .probe = usb_hcd_pci_probe,\r
+ .remove = usb_hcd_pci_remove,\r
+\r
+#ifdef CONFIG_PM\r
+ .suspend = usb_hcd_pci_suspend,\r
+ .resume = usb_hcd_pci_resume,\r
+#endif\r
+};\r
+\r
+ \r
+static int __init ohci_hcd_pci_init (void) \r
+{\r
+ printk (KERN_DEBUG "%s: " DRIVER_INFO " (PCI)\n", hcd_name);\r
+ if (usb_disabled())\r
+ return -ENODEV;\r
+\r
+ printk (KERN_DEBUG "%s: block sizes: ed %Zd td %Zd\n", hcd_name,\r
+ sizeof (struct ed), sizeof (struct td));\r
+ return pci_module_init (&ohci_pci_driver);\r
+}\r
+module_init (ohci_hcd_pci_init);\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+static void __exit ohci_hcd_pci_cleanup (void) \r
+{ \r
+ pci_unregister_driver (&ohci_pci_driver);\r
+}\r
+module_exit (ohci_hcd_pci_cleanup);\r
--- /dev/null
+/*\r
+ * OHCI HCD (Host Controller Driver) for USB.\r
+ * \r
+ * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>\r
+ * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net>\r
+ * \r
+ * This file is licenced under the GPL.\r
+ */\r
+\r
+static void urb_free_priv (struct ohci_hcd *hc, urb_priv_t *urb_priv)\r
+{\r
+ int last = urb_priv->length - 1;\r
+\r
+ if (last >= 0) {\r
+ int i;\r
+ struct td *td;\r
+\r
+ for (i = 0; i <= last; i++) {\r
+ td = urb_priv->td [i];\r
+ if (td)\r
+ td_free (hc, td);\r
+ }\r
+ }\r
+\r
+ kfree (urb_priv);\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/*\r
+ * URB goes back to driver, and isn't reissued.\r
+ * It's completely gone from HC data structures.\r
+ * PRECONDITION: no locks held, irqs blocked (Giveback can call into HCD.)\r
+ */\r
+static void\r
+finish_urb (struct ohci_hcd *ohci, struct urb *urb, struct pt_regs *regs)\r
+{\r
+ // ASSERT (urb->hcpriv != 0);\r
+\r
+ urb_free_priv (ohci, urb->hcpriv);\r
+ urb->hcpriv = NULL;\r
+\r
+ spin_lock (&urb->lock);\r
+ if (likely (urb->status == -EINPROGRESS))\r
+ urb->status = 0;\r
+ spin_unlock (&urb->lock);\r
+\r
+ // what lock protects these?\r
+ switch (usb_pipetype (urb->pipe)) {\r
+ case PIPE_ISOCHRONOUS:\r
+ hcd_to_bus (&ohci->hcd)->bandwidth_isoc_reqs--;\r
+ break;\r
+ case PIPE_INTERRUPT:\r
+ hcd_to_bus (&ohci->hcd)->bandwidth_int_reqs--;\r
+ break;\r
+ }\r
+\r
+#ifdef OHCI_VERBOSE_DEBUG\r
+ urb_print (urb, "RET", usb_pipeout (urb->pipe));\r
+#endif\r
+ usb_hcd_giveback_urb (&ohci->hcd, urb, regs);\r
+}\r
+\r
+\r
+/*-------------------------------------------------------------------------*\r
+ * ED handling functions\r
+ *-------------------------------------------------------------------------*/ \r
+\r
+/* search for the right schedule branch to use for a periodic ed.\r
+ * does some load balancing; returns the branch, or negative errno.\r
+ */\r
+static int balance (struct ohci_hcd *ohci, int interval, int load)\r
+{\r
+ int i, branch = -ENOSPC;\r
+\r
+ /* iso periods can be huge; iso tds specify frame numbers */\r
+ if (interval > NUM_INTS)\r
+ interval = NUM_INTS;\r
+\r
+ /* search for the least loaded schedule branch of that period\r
+ * that has enough bandwidth left unreserved.\r
+ */\r
+ for (i = 0; i < interval ; i++) {\r
+ if (branch < 0 || ohci->load [branch] > ohci->load [i]) {\r
+#if 1 /* CONFIG_USB_BANDWIDTH */\r
+ int j;\r
+\r
+ /* usb 1.1 says 90% of one frame */\r
+ for (j = i; j < NUM_INTS; j += interval) {\r
+ if ((ohci->load [j] + load) > 900)\r
+ break;\r
+ }\r
+ if (j < NUM_INTS)\r
+ continue;\r
+#endif\r
+ branch = i; \r
+ }\r
+ }\r
+ return branch;\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* both iso and interrupt requests have periods; this routine puts them\r
+ * into the schedule tree in the apppropriate place. most iso devices use\r
+ * 1msec periods, but that's not required.\r
+ */\r
+static void periodic_link (struct ohci_hcd *ohci, struct ed *ed)\r
+{\r
+ unsigned i;\r
+\r
+ ohci_vdbg (ohci, "link %sed %p branch %d [%dus.], interval %d\n",\r
+ (ed->hwINFO & ED_ISO) ? "iso " : "",\r
+ ed, ed->branch, ed->load, ed->interval);\r
+\r
+ for (i = ed->branch; i < NUM_INTS; i += ed->interval) {\r
+ struct ed **prev = &ohci->periodic [i];\r
+ u32 *prev_p = &ohci->hcca->int_table [i];\r
+ struct ed *here = *prev;\r
+\r
+ /* sorting each branch by period (slow before fast)\r
+ * lets us share the faster parts of the tree.\r
+ * (plus maybe: put interrupt eds before iso)\r
+ */\r
+ while (here && ed != here) {\r
+ if (ed->interval > here->interval)\r
+ break;\r
+ prev = &here->ed_next;\r
+ prev_p = &here->hwNextED;\r
+ here = *prev;\r
+ }\r
+ if (ed != here) {\r
+ ed->ed_next = here;\r
+ if (here)\r
+ ed->hwNextED = *prev_p;\r
+ wmb ();\r
+ *prev = ed;\r
+ *prev_p = cpu_to_le32p (&ed->dma);\r
+ }\r
+ ohci->load [i] += ed->load;\r
+ }\r
+ hcd_to_bus (&ohci->hcd)->bandwidth_allocated += ed->load / ed->interval;\r
+}\r
+\r
+/* link an ed into one of the HC chains */\r
+\r
+static int ed_schedule (struct ohci_hcd *ohci, struct ed *ed)\r
+{ \r
+ int branch;\r
+\r
+ ed->state = ED_OPER;\r
+ ed->ed_prev = 0;\r
+ ed->ed_next = 0;\r
+ ed->hwNextED = 0;\r
+ wmb ();\r
+\r
+ /* we care about rm_list when setting CLE/BLE in case the HC was at\r
+ * work on some TD when CLE/BLE was turned off, and isn't quiesced\r
+ * yet. finish_unlinks() restarts as needed, some upcoming INTR_SF.\r
+ *\r
+ * control and bulk EDs are doubly linked (ed_next, ed_prev), but\r
+ * periodic ones are singly linked (ed_next). that's because the\r
+ * periodic schedule encodes a tree like figure 3-5 in the ohci\r
+ * spec: each qh can have several "previous" nodes, and the tree\r
+ * doesn't have unused/idle descriptors.\r
+ */\r
+ switch (ed->type) {\r
+ case PIPE_CONTROL:\r
+ if (ohci->ed_controltail == NULL) {\r
+ writel (ed->dma, &ohci->regs->ed_controlhead);\r
+ } else {\r
+ ohci->ed_controltail->ed_next = ed;\r
+ ohci->ed_controltail->hwNextED = cpu_to_le32 (ed->dma);\r
+ }\r
+ ed->ed_prev = ohci->ed_controltail;\r
+ if (!ohci->ed_controltail && !ohci->ed_rm_list) {\r
+ ohci->hc_control |= OHCI_CTRL_CLE;\r
+ writel (0, &ohci->regs->ed_controlcurrent);\r
+ writel (ohci->hc_control, &ohci->regs->control);\r
+ }\r
+ ohci->ed_controltail = ed;\r
+ break;\r
+\r
+ case PIPE_BULK:\r
+ if (ohci->ed_bulktail == NULL) {\r
+ writel (ed->dma, &ohci->regs->ed_bulkhead);\r
+ } else {\r
+ ohci->ed_bulktail->ed_next = ed;\r
+ ohci->ed_bulktail->hwNextED = cpu_to_le32 (ed->dma);\r
+ }\r
+ ed->ed_prev = ohci->ed_bulktail;\r
+ if (!ohci->ed_bulktail && !ohci->ed_rm_list) {\r
+ ohci->hc_control |= OHCI_CTRL_BLE;\r
+ writel (0, &ohci->regs->ed_bulkcurrent);\r
+ writel (ohci->hc_control, &ohci->regs->control);\r
+ }\r
+ ohci->ed_bulktail = ed;\r
+ break;\r
+\r
+ // case PIPE_INTERRUPT:\r
+ // case PIPE_ISOCHRONOUS:\r
+ default:\r
+ branch = balance (ohci, ed->interval, ed->load);\r
+ if (branch < 0) {\r
+ ohci_dbg (ohci,\r
+ "ERR %d, interval %d msecs, load %d\n",\r
+ branch, ed->interval, ed->load);\r
+ // FIXME if there are TDs queued, fail them!\r
+ return branch;\r
+ }\r
+ ed->branch = branch;\r
+ periodic_link (ohci, ed);\r
+ } \r
+\r
+ /* the HC may not see the schedule updates yet, but if it does\r
+ * then they'll be properly ordered.\r
+ */\r
+ return 0;\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* scan the periodic table to find and unlink this ED */\r
+static void periodic_unlink (struct ohci_hcd *ohci, struct ed *ed)\r
+{\r
+ int i;\r
+\r
+ for (i = ed->branch; i < NUM_INTS; i += ed->interval) {\r
+ struct ed *temp;\r
+ struct ed **prev = &ohci->periodic [i];\r
+ u32 *prev_p = &ohci->hcca->int_table [i];\r
+\r
+ while (*prev && (temp = *prev) != ed) {\r
+ prev_p = &temp->hwNextED;\r
+ prev = &temp->ed_next;\r
+ }\r
+ if (*prev) {\r
+ *prev_p = ed->hwNextED;\r
+ *prev = ed->ed_next;\r
+ }\r
+ ohci->load [i] -= ed->load;\r
+ } \r
+ hcd_to_bus (&ohci->hcd)->bandwidth_allocated -= ed->load / ed->interval;\r
+\r
+ ohci_vdbg (ohci, "unlink %sed %p branch %d [%dus.], interval %d\n",\r
+ (ed->hwINFO & ED_ISO) ? "iso " : "",\r
+ ed, ed->branch, ed->load, ed->interval);\r
+}\r
+\r
+/* unlink an ed from one of the HC chains. \r
+ * just the link to the ed is unlinked.\r
+ * the link from the ed still points to another operational ed or 0\r
+ * so the HC can eventually finish the processing of the unlinked ed\r
+ */\r
+static void ed_deschedule (struct ohci_hcd *ohci, struct ed *ed) \r
+{\r
+ ed->hwINFO |= ED_SKIP;\r
+\r
+ switch (ed->type) {\r
+ case PIPE_CONTROL:\r
+ if (ed->ed_prev == NULL) {\r
+ if (!ed->hwNextED) {\r
+ ohci->hc_control &= ~OHCI_CTRL_CLE;\r
+ writel (ohci->hc_control, &ohci->regs->control);\r
+ writel (0, &ohci->regs->ed_controlcurrent);\r
+ // post those pci writes\r
+ (void) readl (&ohci->regs->control);\r
+ }\r
+ writel (le32_to_cpup (&ed->hwNextED),\r
+ &ohci->regs->ed_controlhead);\r
+ } else {\r
+ ed->ed_prev->ed_next = ed->ed_next;\r
+ ed->ed_prev->hwNextED = ed->hwNextED;\r
+ }\r
+ if (ohci->ed_controltail == ed) {\r
+ ohci->ed_controltail = ed->ed_prev;\r
+ if (ohci->ed_controltail)\r
+ ohci->ed_controltail->ed_next = 0;\r
+ } else if (ed->ed_next) {\r
+ ed->ed_next->ed_prev = ed->ed_prev;\r
+ }\r
+ break;\r
+\r
+ case PIPE_BULK:\r
+ if (ed->ed_prev == NULL) {\r
+ if (!ed->hwNextED) {\r
+ ohci->hc_control &= ~OHCI_CTRL_BLE;\r
+ writel (ohci->hc_control, &ohci->regs->control);\r
+ writel (0, &ohci->regs->ed_bulkcurrent);\r
+ // post those pci writes\r
+ (void) readl (&ohci->regs->control);\r
+ }\r
+ writel (le32_to_cpup (&ed->hwNextED),\r
+ &ohci->regs->ed_bulkhead);\r
+ } else {\r
+ ed->ed_prev->ed_next = ed->ed_next;\r
+ ed->ed_prev->hwNextED = ed->hwNextED;\r
+ }\r
+ if (ohci->ed_bulktail == ed) {\r
+ ohci->ed_bulktail = ed->ed_prev;\r
+ if (ohci->ed_bulktail)\r
+ ohci->ed_bulktail->ed_next = 0;\r
+ } else if (ed->ed_next) {\r
+ ed->ed_next->ed_prev = ed->ed_prev;\r
+ }\r
+ break;\r
+\r
+ // case PIPE_INTERRUPT:\r
+ // case PIPE_ISOCHRONOUS:\r
+ default:\r
+ periodic_unlink (ohci, ed);\r
+ break;\r
+ }\r
+\r
+ /* NOTE: Except for a couple of exceptionally clean unlink cases\r
+ * (like unlinking the only c/b ED, with no TDs) HCs may still be\r
+ * caching this operational ED (or its address). Safe unlinking\r
+ * involves not marking it ED_IDLE till INTR_SF; we always do that\r
+ * if td_list isn't empty. Otherwise the race is small; but ...\r
+ */\r
+ if (ed->state == ED_OPER) {\r
+ ed->state = ED_IDLE;\r
+ ed->hwINFO &= ~(ED_SKIP | ED_DEQUEUE);\r
+ ed->hwHeadP &= ~ED_H;\r
+ wmb ();\r
+ }\r
+}\r
+\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* get and maybe (re)init an endpoint. init _should_ be done only as part\r
+ * of usb_set_configuration() or usb_set_interface() ... but the USB stack\r
+ * isn't very stateful, so we re-init whenever the HC isn't looking.\r
+ */\r
+static struct ed *ed_get (\r
+ struct ohci_hcd *ohci,\r
+ struct usb_device *udev,\r
+ unsigned int pipe,\r
+ int interval\r
+) {\r
+ int is_out = !usb_pipein (pipe);\r
+ int type = usb_pipetype (pipe);\r
+ struct hcd_dev *dev = (struct hcd_dev *) udev->hcpriv;\r
+ struct ed *ed; \r
+ unsigned ep;\r
+ unsigned long flags;\r
+\r
+ ep = usb_pipeendpoint (pipe) << 1;\r
+ if (type != PIPE_CONTROL && is_out)\r
+ ep |= 1;\r
+\r
+ spin_lock_irqsave (&ohci->lock, flags);\r
+\r
+ if (!(ed = dev->ep [ep])) {\r
+ struct td *td;\r
+\r
+ ed = ed_alloc (ohci, SLAB_ATOMIC);\r
+ if (!ed) {\r
+ /* out of memory */\r
+ goto done;\r
+ }\r
+ dev->ep [ep] = ed;\r
+\r
+ /* dummy td; end of td list for ed */\r
+ td = td_alloc (ohci, SLAB_ATOMIC);\r
+ if (!td) {\r
+ /* out of memory */\r
+ ed_free (ohci, ed);\r
+ ed = 0;\r
+ goto done;\r
+ }\r
+ ed->dummy = td;\r
+ ed->hwTailP = cpu_to_le32 (td->td_dma);\r
+ ed->hwHeadP = ed->hwTailP; /* ED_C, ED_H zeroed */\r
+ ed->state = ED_IDLE;\r
+ ed->type = type;\r
+ }\r
+\r
+ /* NOTE: only ep0 currently needs this "re"init logic, during\r
+ * enumeration (after set_address, or if ep0 maxpacket >8).\r
+ */\r
+ if (ed->state == ED_IDLE) {\r
+ u32 info;\r
+\r
+ info = usb_pipedevice (pipe);\r
+ info |= (ep >> 1) << 7;\r
+ info |= usb_maxpacket (udev, pipe, is_out) << 16;\r
+ info = cpu_to_le32 (info);\r
+ if (udev->speed == USB_SPEED_LOW)\r
+ info |= ED_LOWSPEED;\r
+ /* only control transfers store pids in tds */\r
+ if (type != PIPE_CONTROL) {\r
+ info |= is_out ? ED_OUT : ED_IN;\r
+ if (type != PIPE_BULK) {\r
+ /* periodic transfers... */\r
+ if (type == PIPE_ISOCHRONOUS)\r
+ info |= ED_ISO;\r
+ else if (interval > 32) /* iso can be bigger */\r
+ interval = 32;\r
+ ed->interval = interval;\r
+ ed->load = usb_calc_bus_time (\r
+ udev->speed, !is_out,\r
+ type == PIPE_ISOCHRONOUS,\r
+ usb_maxpacket (udev, pipe, is_out))\r
+ / 1000;\r
+ }\r
+ }\r
+ ed->hwINFO = info;\r
+ }\r
+\r
+done:\r
+ spin_unlock_irqrestore (&ohci->lock, flags);\r
+ return ed; \r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* request unlinking of an endpoint from an operational HC.\r
+ * put the ep on the rm_list\r
+ * real work is done at the next start frame (SF) hardware interrupt\r
+ */\r
+static void start_urb_unlink (struct ohci_hcd *ohci, struct ed *ed)\r
+{ \r
+ ed->hwINFO |= ED_DEQUEUE;\r
+ ed->state = ED_UNLINK;\r
+ ed_deschedule (ohci, ed);\r
+\r
+ /* SF interrupt might get delayed; record the frame counter value that\r
+ * indicates when the HC isn't looking at it, so concurrent unlinks\r
+ * behave. frame_no wraps every 2^16 msec, and changes right before\r
+ * SF is triggered.\r
+ */\r
+ ed->tick = le16_to_cpu (ohci->hcca->frame_no) + 1;\r
+\r
+ /* rm_list is just singly linked, for simplicity */\r
+ ed->ed_next = ohci->ed_rm_list;\r
+ ed->ed_prev = 0;\r
+ ohci->ed_rm_list = ed;\r
+\r
+ /* enable SOF interrupt */\r
+ if (!ohci->sleeping) {\r
+ writel (OHCI_INTR_SF, &ohci->regs->intrstatus);\r
+ writel (OHCI_INTR_SF, &ohci->regs->intrenable);\r
+ // flush those pci writes\r
+ (void) readl (&ohci->regs->control);\r
+ }\r
+}\r
+\r
+/*-------------------------------------------------------------------------*\r
+ * TD handling functions\r
+ *-------------------------------------------------------------------------*/\r
+\r
+/* enqueue next TD for this URB (OHCI spec 5.2.8.2) */\r
+\r
+static void\r
+td_fill (struct ohci_hcd *ohci, u32 info,\r
+ dma_addr_t data, int len,\r
+ struct urb *urb, int index)\r
+{\r
+ struct td *td, *td_pt;\r
+ struct urb_priv *urb_priv = urb->hcpriv;\r
+ int is_iso = info & TD_ISO;\r
+ int hash;\r
+\r
+ // ASSERT (index < urb_priv->length);\r
+\r
+ /* aim for only one interrupt per urb. mostly applies to control\r
+ * and iso; other urbs rarely need more than one TD per urb.\r
+ * this way, only final tds (or ones with an error) cause IRQs.\r
+ * at least immediately; use DI=6 in case any control request is\r
+ * tempted to die part way through.\r
+ *\r
+ * NOTE: could delay interrupts even for the last TD, and get fewer\r
+ * interrupts ... increasing per-urb latency by sharing interrupts.\r
+ * Drivers that queue bulk urbs may request that behavior.\r
+ */\r
+ if (index != (urb_priv->length - 1)\r
+ || (urb->transfer_flags & URB_NO_INTERRUPT))\r
+ info |= TD_DI_SET (6);\r
+\r
+ /* use this td as the next dummy */\r
+ td_pt = urb_priv->td [index];\r
+\r
+ /* fill the old dummy TD */\r
+ td = urb_priv->td [index] = urb_priv->ed->dummy;\r
+ urb_priv->ed->dummy = td_pt;\r
+\r
+ td->ed = urb_priv->ed;\r
+ td->next_dl_td = NULL;\r
+ td->index = index;\r
+ td->urb = urb; \r
+ td->data_dma = data;\r
+ if (!len)\r
+ data = 0;\r
+\r
+ td->hwINFO = cpu_to_le32 (info);\r
+ if (is_iso) {\r
+ td->hwCBP = cpu_to_le32 (data & 0xFFFFF000);\r
+ td->hwPSW [0] = cpu_to_le16 ((data & 0x0FFF) | 0xE000);\r
+ td->ed->last_iso = info & 0xffff;\r
+ } else {\r
+ td->hwCBP = cpu_to_le32 (data); \r
+ } \r
+ if (data)\r
+ td->hwBE = cpu_to_le32 (data + len - 1);\r
+ else\r
+ td->hwBE = 0;\r
+ td->hwNextTD = cpu_to_le32 (td_pt->td_dma);\r
+\r
+ /* append to queue */\r
+ list_add_tail (&td->td_list, &td->ed->td_list);\r
+\r
+ /* hash it for later reverse mapping */\r
+ hash = TD_HASH_FUNC (td->td_dma);\r
+ td->td_hash = ohci->td_hash [hash];\r
+ ohci->td_hash [hash] = td;\r
+\r
+ /* HC might read the TD (or cachelines) right away ... */\r
+ wmb ();\r
+ td->ed->hwTailP = td->hwNextTD;\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* Prepare all TDs of a transfer, and queue them onto the ED.\r
+ * Caller guarantees HC is active.\r
+ * Usually the ED is already on the schedule, so TDs might be\r
+ * processed as soon as they're queued.\r
+ */\r
+static void td_submit_urb (\r
+ struct ohci_hcd *ohci,\r
+ struct urb *urb\r
+) {\r
+ struct urb_priv *urb_priv = urb->hcpriv;\r
+ dma_addr_t data;\r
+ int data_len = urb->transfer_buffer_length;\r
+ int cnt = 0;\r
+ u32 info = 0;\r
+ int is_out = usb_pipeout (urb->pipe);\r
+\r
+ /* OHCI handles the bulk/interrupt data toggles itself. We just\r
+ * use the device toggle bits for resetting, and rely on the fact\r
+ * that resetting toggle is meaningless if the endpoint is active.\r
+ */\r
+ if (!usb_gettoggle (urb->dev, usb_pipeendpoint (urb->pipe), is_out)) {\r
+ usb_settoggle (urb->dev, usb_pipeendpoint (urb->pipe),\r
+ is_out, 1);\r
+ urb_priv->ed->hwHeadP &= ~ED_C;\r
+ }\r
+\r
+ urb_priv->td_cnt = 0;\r
+\r
+ if (data_len)\r
+ data = urb->transfer_dma;\r
+ else\r
+ data = 0;\r
+\r
+ /* NOTE: TD_CC is set so we can tell which TDs the HC processed by\r
+ * using TD_CC_GET, as well as by seeing them on the done list.\r
+ * (CC = NotAccessed ... 0x0F, or 0x0E in PSWs for ISO.)\r
+ */\r
+ switch (urb_priv->ed->type) {\r
+\r
+ /* Bulk and interrupt are identical except for where in the schedule\r
+ * their EDs live.\r
+ */\r
+ case PIPE_INTERRUPT:\r
+ /* ... and periodic urbs have extra accounting */\r
+ hcd_to_bus (&ohci->hcd)->bandwidth_int_reqs++;\r
+ /* FALLTHROUGH */\r
+ case PIPE_BULK:\r
+ info = is_out\r
+ ? TD_T_TOGGLE | TD_CC | TD_DP_OUT\r
+ : TD_T_TOGGLE | TD_CC | TD_DP_IN;\r
+ /* TDs _could_ transfer up to 8K each */\r
+ while (data_len > 4096) {\r
+ td_fill (ohci, info, data, 4096, urb, cnt);\r
+ data += 4096;\r
+ data_len -= 4096;\r
+ cnt++;\r
+ }\r
+ /* maybe avoid ED halt on final TD short read */\r
+ if (!(urb->transfer_flags & URB_SHORT_NOT_OK))\r
+ info |= TD_R;\r
+ td_fill (ohci, info, data, data_len, urb, cnt);\r
+ cnt++;\r
+ if ((urb->transfer_flags & URB_ZERO_PACKET)\r
+ && cnt < urb_priv->length) {\r
+ td_fill (ohci, info, 0, 0, urb, cnt);\r
+ cnt++;\r
+ }\r
+ /* maybe kickstart bulk list */\r
+ if (urb_priv->ed->type == PIPE_BULK) {\r
+ wmb ();\r
+ writel (OHCI_BLF, &ohci->regs->cmdstatus);\r
+ }\r
+ break;\r
+\r
+ /* control manages DATA0/DATA1 toggle per-request; SETUP resets it,\r
+ * any DATA phase works normally, and the STATUS ack is special.\r
+ */\r
+ case PIPE_CONTROL:\r
+ info = TD_CC | TD_DP_SETUP | TD_T_DATA0;\r
+ td_fill (ohci, info, urb->setup_dma, 8, urb, cnt++);\r
+ if (data_len > 0) {\r
+ info = TD_CC | TD_R | TD_T_DATA1;\r
+ info |= is_out ? TD_DP_OUT : TD_DP_IN;\r
+ /* NOTE: mishandles transfers >8K, some >4K */\r
+ td_fill (ohci, info, data, data_len, urb, cnt++);\r
+ }\r
+ info = is_out\r
+ ? TD_CC | TD_DP_IN | TD_T_DATA1\r
+ : TD_CC | TD_DP_OUT | TD_T_DATA1;\r
+ td_fill (ohci, info, data, 0, urb, cnt++);\r
+ /* maybe kickstart control list */\r
+ wmb ();\r
+ writel (OHCI_CLF, &ohci->regs->cmdstatus);\r
+ break;\r
+\r
+ /* ISO has no retransmit, so no toggle; and it uses special TDs.\r
+ * Each TD could handle multiple consecutive frames (interval 1);\r
+ * we could often reduce the number of TDs here.\r
+ */\r
+ case PIPE_ISOCHRONOUS:\r
+ for (cnt = 0; cnt < urb->number_of_packets; cnt++) {\r
+ int frame = urb->start_frame;\r
+\r
+ // FIXME scheduling should handle frame counter\r
+ // roll-around ... exotic case (and OHCI has\r
+ // a 2^16 iso range, vs other HCs max of 2^10)\r
+ frame += cnt * urb->interval;\r
+ frame &= 0xffff;\r
+ td_fill (ohci, TD_CC | TD_ISO | frame,\r
+ data + urb->iso_frame_desc [cnt].offset,\r
+ urb->iso_frame_desc [cnt].length, urb, cnt);\r
+ }\r
+ hcd_to_bus (&ohci->hcd)->bandwidth_isoc_reqs++;\r
+ break;\r
+ }\r
+ // ASSERT (urb_priv->length == cnt);\r
+}\r
+\r
+/*-------------------------------------------------------------------------*\r
+ * Done List handling functions\r
+ *-------------------------------------------------------------------------*/\r
+\r
+/* calculate transfer length/status and update the urb\r
+ * PRECONDITION: irqsafe (only for urb->status locking)\r
+ */\r
+static void td_done (struct ohci_hcd *ohci, struct urb *urb, struct td *td)\r
+{\r
+ u32 tdINFO = le32_to_cpup (&td->hwINFO);\r
+ int cc = 0;\r
+\r
+ list_del (&td->td_list);\r
+\r
+ /* ISO ... drivers see per-TD length/status */\r
+ if (tdINFO & TD_ISO) {\r
+ u16 tdPSW = le16_to_cpu (td->hwPSW [0]);\r
+ int dlen = 0;\r
+\r
+ /* NOTE: assumes FC in tdINFO == 0 (and MAXPSW == 1) */\r
+\r
+ cc = (tdPSW >> 12) & 0xF;\r
+ if (tdINFO & TD_CC) /* hc didn't touch? */\r
+ return;\r
+\r
+ if (usb_pipeout (urb->pipe))\r
+ dlen = urb->iso_frame_desc [td->index].length;\r
+ else {\r
+ /* short reads are always OK for ISO */\r
+ if (cc == TD_DATAUNDERRUN)\r
+ cc = TD_CC_NOERROR;\r
+ dlen = tdPSW & 0x3ff;\r
+ }\r
+ urb->actual_length += dlen;\r
+ urb->iso_frame_desc [td->index].actual_length = dlen;\r
+ urb->iso_frame_desc [td->index].status = cc_to_error [cc];\r
+\r
+ if (cc != TD_CC_NOERROR)\r
+ ohci_vdbg (ohci,\r
+ "urb %p iso td %p (%d) len %d cc %d\n",\r
+ urb, td, 1 + td->index, dlen, cc);\r
+\r
+ /* BULK, INT, CONTROL ... drivers see aggregate length/status,\r
+ * except that "setup" bytes aren't counted and "short" transfers\r
+ * might not be reported as errors.\r
+ */\r
+ } else {\r
+ int type = usb_pipetype (urb->pipe);\r
+ u32 tdBE = le32_to_cpup (&td->hwBE);\r
+\r
+ cc = TD_CC_GET (tdINFO);\r
+\r
+ /* control endpoints only have soft stalls */\r
+ if (type != PIPE_CONTROL && cc == TD_CC_STALL)\r
+ usb_endpoint_halt (urb->dev,\r
+ usb_pipeendpoint (urb->pipe),\r
+ usb_pipeout (urb->pipe));\r
+\r
+ /* update packet status if needed (short is normally ok) */\r
+ if (cc == TD_DATAUNDERRUN\r
+ && !(urb->transfer_flags & URB_SHORT_NOT_OK))\r
+ cc = TD_CC_NOERROR;\r
+ if (cc != TD_CC_NOERROR && cc < 0x0E) {\r
+ spin_lock (&urb->lock);\r
+ if (urb->status == -EINPROGRESS)\r
+ urb->status = cc_to_error [cc];\r
+ spin_unlock (&urb->lock);\r
+ }\r
+\r
+ /* count all non-empty packets except control SETUP packet */\r
+ if ((type != PIPE_CONTROL || td->index != 0) && tdBE != 0) {\r
+ if (td->hwCBP == 0)\r
+ urb->actual_length += tdBE - td->data_dma + 1;\r
+ else\r
+ urb->actual_length +=\r
+ le32_to_cpup (&td->hwCBP)\r
+ - td->data_dma;\r
+ }\r
+\r
+ if (cc != TD_CC_NOERROR && cc < 0x0E)\r
+ ohci_vdbg (ohci,\r
+ "urb %p td %p (%d) cc %d, len=%d/%d\n",\r
+ urb, td, 1 + td->index, cc,\r
+ urb->actual_length,\r
+ urb->transfer_buffer_length);\r
+ }\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+static inline struct td *\r
+ed_halted (struct ohci_hcd *ohci, struct td *td, int cc, struct td *rev)\r
+{\r
+ struct urb *urb = td->urb;\r
+ struct ed *ed = td->ed;\r
+ struct list_head *tmp = td->td_list.next;\r
+ u32 toggle = ed->hwHeadP & ED_C;\r
+\r
+ /* clear ed halt; this is the td that caused it, but keep it inactive\r
+ * until its urb->complete() has a chance to clean up.\r
+ */\r
+ ed->hwINFO |= ED_SKIP;\r
+ wmb ();\r
+ ed->hwHeadP &= ~ED_H; \r
+\r
+ /* put any later tds from this urb onto the donelist, after 'td',\r
+ * order won't matter here: no errors, and nothing was transferred.\r
+ * also patch the ed so it looks as if those tds completed normally.\r
+ */\r
+ while (tmp != &ed->td_list) {\r
+ struct td *next;\r
+ u32 info;\r
+\r
+ next = list_entry (tmp, struct td, td_list);\r
+ tmp = next->td_list.next;\r
+\r
+ if (next->urb != urb)\r
+ break;\r
+\r
+ /* NOTE: if multi-td control DATA segments get supported,\r
+ * this urb had one of them, this td wasn't the last td\r
+ * in that segment (TD_R clear), this ed halted because\r
+ * of a short read, _and_ URB_SHORT_NOT_OK is clear ...\r
+ * then we need to leave the control STATUS packet queued\r
+ * and clear ED_SKIP.\r
+ */\r
+ info = next->hwINFO;\r
+ info |= cpu_to_le32 (TD_DONE);\r
+ info &= ~cpu_to_le32 (TD_CC);\r
+ next->hwINFO = info;\r
+\r
+ next->next_dl_td = rev; \r
+ rev = next;\r
+\r
+ if (ed->hwTailP == cpu_to_le32 (next->td_dma))\r
+ ed->hwTailP = next->hwNextTD;\r
+ ed->hwHeadP = next->hwNextTD | toggle;\r
+ }\r
+\r
+ /* help for troubleshooting: report anything that\r
+ * looks odd ... that doesn't include protocol stalls\r
+ * (or maybe some other things)\r
+ */\r
+ if (cc != TD_CC_STALL || !usb_pipecontrol (urb->pipe))\r
+ ohci_dbg (ohci,\r
+ "urb %p path %s ep%d%s %08x cc %d --> status %d\n",\r
+ urb, urb->dev->devpath,\r
+ usb_pipeendpoint (urb->pipe),\r
+ usb_pipein (urb->pipe) ? "in" : "out",\r
+ le32_to_cpu (td->hwINFO),\r
+ cc, cc_to_error [cc]);\r
+\r
+ return rev;\r
+}\r
+\r
+/* replies to the request have to be on a FIFO basis so\r
+ * we unreverse the hc-reversed done-list\r
+ */\r
+static struct td *dl_reverse_done_list (struct ohci_hcd *ohci)\r
+{\r
+ u32 td_dma;\r
+ struct td *td_rev = NULL;\r
+ struct td *td = NULL;\r
+ unsigned long flags;\r
+\r
+ spin_lock_irqsave (&ohci->lock, flags);\r
+ td_dma = le32_to_cpup (&ohci->hcca->done_head);\r
+ ohci->hcca->done_head = 0;\r
+\r
+ /* get TD from hc's singly linked list, and\r
+ * prepend to ours. ed->td_list changes later.\r
+ */\r
+ while (td_dma) { \r
+ int cc;\r
+\r
+ td = dma_to_td (ohci, td_dma);\r
+ if (!td) {\r
+ ohci_err (ohci, "bad entry %8x\n", td_dma);\r
+ break;\r
+ }\r
+\r
+ td->hwINFO |= cpu_to_le32 (TD_DONE);\r
+ cc = TD_CC_GET (le32_to_cpup (&td->hwINFO));\r
+\r
+ /* Non-iso endpoints can halt on error; un-halt,\r
+ * and dequeue any other TDs from this urb.\r
+ * No other TD could have caused the halt.\r
+ */\r
+ if (cc != TD_CC_NOERROR && (td->ed->hwHeadP & ED_H))\r
+ td_rev = ed_halted (ohci, td, cc, td_rev);\r
+\r
+ td->next_dl_td = td_rev; \r
+ td_rev = td;\r
+ td_dma = le32_to_cpup (&td->hwNextTD);\r
+ } \r
+ spin_unlock_irqrestore (&ohci->lock, flags);\r
+ return td_rev;\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* wrap-aware logic stolen from <linux/jiffies.h> */\r
+#define tick_before(t1,t2) ((((s16)(t1))-((s16)(t2))) < 0)\r
+\r
+/* there are some urbs/eds to unlink; called in_irq(), with HCD locked */\r
+static void\r
+finish_unlinks (struct ohci_hcd *ohci, u16 tick, struct pt_regs *regs)\r
+{\r
+ struct ed *ed, **last;\r
+\r
+rescan_all:\r
+ for (last = &ohci->ed_rm_list, ed = *last; ed != NULL; ed = *last) {\r
+ struct list_head *entry, *tmp;\r
+ int completed, modified;\r
+ u32 *prev;\r
+\r
+ /* only take off EDs that the HC isn't using, accounting for\r
+ * frame counter wraps.\r
+ */\r
+ if (tick_before (tick, ed->tick) && !ohci->disabled) {\r
+ last = &ed->ed_next;\r
+ continue;\r
+ }\r
+\r
+ /* reentrancy: if we drop the schedule lock, someone might\r
+ * have modified this list. normally it's just prepending\r
+ * entries (which we'd ignore), but paranoia won't hurt.\r
+ */\r
+ *last = ed->ed_next;\r
+ ed->ed_next = 0;\r
+ modified = 0;\r
+\r
+ /* unlink urbs as requested, but rescan the list after\r
+ * we call a completion since it might have unlinked\r
+ * another (earlier) urb\r
+ */\r
+rescan_this:\r
+ completed = 0;\r
+ prev = &ed->hwHeadP;\r
+ list_for_each_safe (entry, tmp, &ed->td_list) {\r
+ struct td *td;\r
+ struct urb *urb;\r
+ urb_priv_t *urb_priv;\r
+ u32 savebits;\r
+\r
+ td = list_entry (entry, struct td, td_list);\r
+ urb = td->urb;\r
+ urb_priv = td->urb->hcpriv;\r
+\r
+ if (urb_priv->state != URB_DEL) {\r
+ prev = &td->hwNextTD;\r
+ continue;\r
+ }\r
+\r
+ /* patch pointers hc uses ... tail, if we're removing\r
+ * an otherwise active td, and whatever td pointer\r
+ * points to this td\r
+ */\r
+ if (ed->hwTailP == cpu_to_le32 (td->td_dma))\r
+ ed->hwTailP = td->hwNextTD;\r
+ savebits = *prev & ~cpu_to_le32 (TD_MASK);\r
+ *prev = td->hwNextTD | savebits;\r
+\r
+ /* HC may have partly processed this TD */\r
+ td_done (ohci, urb, td);\r
+ urb_priv->td_cnt++;\r
+\r
+ /* if URB is done, clean up */\r
+ if (urb_priv->td_cnt == urb_priv->length) {\r
+ modified = completed = 1;\r
+ spin_unlock (&ohci->lock);\r
+ finish_urb (ohci, urb, regs);\r
+ spin_lock (&ohci->lock);\r
+ }\r
+ }\r
+ if (completed && !list_empty (&ed->td_list))\r
+ goto rescan_this;\r
+\r
+ /* ED's now officially unlinked, hc doesn't see */\r
+ ed->state = ED_IDLE;\r
+ ed->hwINFO &= ~(ED_SKIP | ED_DEQUEUE);\r
+ ed->hwHeadP &= ~ED_H;\r
+ ed->hwNextED = 0;\r
+\r
+ /* but if there's work queued, reschedule */\r
+ if (!list_empty (&ed->td_list)) {\r
+ if (!ohci->disabled && !ohci->sleeping)\r
+ ed_schedule (ohci, ed);\r
+ }\r
+\r
+ if (modified)\r
+ goto rescan_all;\r
+ }\r
+\r
+ /* maybe reenable control and bulk lists */ \r
+ if (!ohci->disabled && !ohci->ed_rm_list) {\r
+ u32 command = 0, control = 0;\r
+\r
+ if (ohci->ed_controltail) {\r
+ command |= OHCI_CLF;\r
+ if (!(ohci->hc_control & OHCI_CTRL_CLE)) {\r
+ control |= OHCI_CTRL_CLE;\r
+ writel (0, &ohci->regs->ed_controlcurrent);\r
+ }\r
+ }\r
+ if (ohci->ed_bulktail) {\r
+ command |= OHCI_BLF;\r
+ if (!(ohci->hc_control & OHCI_CTRL_BLE)) {\r
+ control |= OHCI_CTRL_BLE;\r
+ writel (0, &ohci->regs->ed_bulkcurrent);\r
+ }\r
+ }\r
+ \r
+ /* CLE/BLE to enable, CLF/BLF to (maybe) kickstart */\r
+ if (control) {\r
+ ohci->hc_control |= control;\r
+ writel (ohci->hc_control, &ohci->regs->control); \r
+ }\r
+ if (command)\r
+ writel (command, &ohci->regs->cmdstatus); \r
+ }\r
+}\r
+\r
+\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/*\r
+ * Process normal completions (error or success) and clean the schedules.\r
+ *\r
+ * This is the main path for handing urbs back to drivers. The only other\r
+ * path is finish_unlinks(), which unlinks URBs using ed_rm_list, instead of\r
+ * scanning the (re-reversed) donelist as this does.\r
+ */\r
+static void\r
+dl_done_list (struct ohci_hcd *ohci, struct td *td, struct pt_regs *regs)\r
+{\r
+ unsigned long flags;\r
+\r
+ spin_lock_irqsave (&ohci->lock, flags);\r
+ while (td) {\r
+ struct td *td_next = td->next_dl_td;\r
+ struct urb *urb = td->urb;\r
+ urb_priv_t *urb_priv = urb->hcpriv;\r
+ struct ed *ed = td->ed;\r
+\r
+ /* update URB's length and status from TD */\r
+ td_done (ohci, urb, td);\r
+ urb_priv->td_cnt++;\r
+\r
+ /* If all this urb's TDs are done, call complete() */\r
+ if (urb_priv->td_cnt == urb_priv->length) {\r
+ spin_unlock (&ohci->lock);\r
+ finish_urb (ohci, urb, regs);\r
+ spin_lock (&ohci->lock);\r
+ }\r
+\r
+ /* clean schedule: unlink EDs that are no longer busy */\r
+ if (list_empty (&ed->td_list))\r
+ ed_deschedule (ohci, ed);\r
+ /* ... reenabling halted EDs only after fault cleanup */\r
+ else if (!(ed->hwINFO & ED_DEQUEUE)) {\r
+ td = list_entry (ed->td_list.next, struct td, td_list);\r
+ if (!(td->hwINFO & TD_DONE))\r
+ ed->hwINFO &= ~ED_SKIP;\r
+ }\r
+\r
+ td = td_next;\r
+ } \r
+ spin_unlock_irqrestore (&ohci->lock, flags);\r
+}\r
--- /dev/null
+LIBRARY ohci.sys\r
+EXPORTS\r
--- /dev/null
+/*\r
+ * OHCI HCD (Host Controller Driver) for USB.\r
+ * \r
+ * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>\r
+ * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net>\r
+ * \r
+ * This file is licenced under the GPL.\r
+ */\r
+ \r
+/*\r
+ * OHCI Endpoint Descriptor (ED) ... holds TD queue\r
+ * See OHCI spec, section 4.2\r
+ *\r
+ * This is a "Queue Head" for those transfers, which is why\r
+ * both EHCI and UHCI call similar structures a "QH".\r
+ */\r
+struct ed {\r
+ /* first fields are hardware-specified, le32 */\r
+ __u32 hwINFO; /* endpoint config bitmap */\r
+ /* info bits defined by hcd */\r
+#define ED_DEQUEUE __constant_cpu_to_le32(1 << 27)\r
+ /* info bits defined by the hardware */\r
+#define ED_ISO __constant_cpu_to_le32(1 << 15)\r
+#define ED_SKIP __constant_cpu_to_le32(1 << 14)\r
+#define ED_LOWSPEED __constant_cpu_to_le32(1 << 13)\r
+#define ED_OUT __constant_cpu_to_le32(0x01 << 11)\r
+#define ED_IN __constant_cpu_to_le32(0x02 << 11)\r
+ __u32 hwTailP; /* tail of TD list */\r
+ __u32 hwHeadP; /* head of TD list (hc r/w) */\r
+#define ED_C __constant_cpu_to_le32(0x02) /* toggle carry */\r
+#define ED_H __constant_cpu_to_le32(0x01) /* halted */\r
+ __u32 hwNextED; /* next ED in list */\r
+\r
+ /* rest are purely for the driver's use */\r
+ dma_addr_t dma; /* addr of ED */\r
+ struct td *dummy; /* next TD to activate */\r
+\r
+ /* host's view of schedule */\r
+ struct ed *ed_next; /* on schedule or rm_list */\r
+ struct ed *ed_prev; /* for non-interrupt EDs */\r
+ struct list_head td_list; /* "shadow list" of our TDs */\r
+\r
+ /* create --> IDLE --> OPER --> ... --> IDLE --> destroy\r
+ * usually: OPER --> UNLINK --> (IDLE | OPER) --> ...\r
+ * some special cases : OPER --> IDLE ...\r
+ */\r
+ u8 state; /* ED_{IDLE,UNLINK,OPER} */\r
+#define ED_IDLE 0x00 /* NOT linked to HC */\r
+#define ED_UNLINK 0x01 /* being unlinked from hc */\r
+#define ED_OPER 0x02 /* IS linked to hc */\r
+\r
+ u8 type; /* PIPE_{BULK,...} */\r
+\r
+ /* periodic scheduling params (for intr and iso) */\r
+ u8 branch;\r
+ u16 interval;\r
+ u16 load;\r
+ u16 last_iso; /* iso only */\r
+\r
+ /* HC may see EDs on rm_list until next frame (frame_no == tick) */\r
+ u16 tick;\r
+} __attribute__ ((aligned(16)));\r
+\r
+#define ED_MASK ((u32)~0x0f) /* strip hw status in low addr bits */\r
+\r
+ \r
+/*\r
+ * OHCI Transfer Descriptor (TD) ... one per transfer segment\r
+ * See OHCI spec, sections 4.3.1 (general = control/bulk/interrupt)\r
+ * and 4.3.2 (iso)\r
+ */\r
+struct td {\r
+ /* first fields are hardware-specified, le32 */\r
+ __u32 hwINFO; /* transfer info bitmask */\r
+\r
+ /* hwINFO bits for both general and iso tds: */\r
+#define TD_CC 0xf0000000 /* condition code */\r
+#define TD_CC_GET(td_p) ((td_p >>28) & 0x0f)\r
+//#define TD_CC_SET(td_p, cc) (td_p) = ((td_p) & 0x0fffffff) | (((cc) & 0x0f) << 28)\r
+#define TD_DI 0x00E00000 /* frames before interrupt */\r
+#define TD_DI_SET(X) (((X) & 0x07)<< 21)\r
+ /* these two bits are available for definition/use by HCDs in both\r
+ * general and iso tds ... others are available for only one type\r
+ */\r
+#define TD_DONE 0x00020000 /* retired to donelist */\r
+#define TD_ISO 0x00010000 /* copy of ED_ISO */\r
+\r
+ /* hwINFO bits for general tds: */\r
+#define TD_EC 0x0C000000 /* error count */\r
+#define TD_T 0x03000000 /* data toggle state */\r
+#define TD_T_DATA0 0x02000000 /* DATA0 */\r
+#define TD_T_DATA1 0x03000000 /* DATA1 */\r
+#define TD_T_TOGGLE 0x00000000 /* uses ED_C */\r
+#define TD_DP 0x00180000 /* direction/pid */\r
+#define TD_DP_SETUP 0x00000000 /* SETUP pid */\r
+#define TD_DP_IN 0x00100000 /* IN pid */\r
+#define TD_DP_OUT 0x00080000 /* OUT pid */\r
+ /* 0x00180000 rsvd */\r
+#define TD_R 0x00040000 /* round: short packets OK? */\r
+\r
+ /* (no hwINFO #defines yet for iso tds) */\r
+\r
+ __u32 hwCBP; /* Current Buffer Pointer (or 0) */\r
+ __u32 hwNextTD; /* Next TD Pointer */\r
+ __u32 hwBE; /* Memory Buffer End Pointer */\r
+\r
+ /* PSW is only for ISO */\r
+#define MAXPSW 1 /* hardware allows 8 */\r
+ __u16 hwPSW [MAXPSW];\r
+\r
+ /* rest are purely for the driver's use */\r
+ __u8 index;\r
+ struct ed *ed;\r
+ struct td *td_hash; /* dma-->td hashtable */\r
+ struct td *next_dl_td;\r
+ struct urb *urb;\r
+\r
+ dma_addr_t td_dma; /* addr of this TD */\r
+ dma_addr_t data_dma; /* addr of data it points to */\r
+\r
+ struct list_head td_list; /* "shadow list", TDs on same ED */\r
+} __attribute__ ((aligned(32))); /* c/b/i need 16; only iso needs 32 */\r
+\r
+#define TD_MASK ((u32)~0x1f) /* strip hw status in low addr bits */\r
+\r
+/*\r
+ * Hardware transfer status codes -- CC from td->hwINFO or td->hwPSW\r
+ */\r
+#define TD_CC_NOERROR 0x00\r
+#define TD_CC_CRC 0x01\r
+#define TD_CC_BITSTUFFING 0x02\r
+#define TD_CC_DATATOGGLEM 0x03\r
+#define TD_CC_STALL 0x04\r
+#define TD_DEVNOTRESP 0x05\r
+#define TD_PIDCHECKFAIL 0x06\r
+#define TD_UNEXPECTEDPID 0x07\r
+#define TD_DATAOVERRUN 0x08\r
+#define TD_DATAUNDERRUN 0x09\r
+ /* 0x0A, 0x0B reserved for hardware */\r
+#define TD_BUFFEROVERRUN 0x0C\r
+#define TD_BUFFERUNDERRUN 0x0D\r
+ /* 0x0E, 0x0F reserved for HCD */\r
+#define TD_NOTACCESSED 0x0F\r
+\r
+\r
+/* map OHCI TD status codes (CC) to errno values */ \r
+static const int cc_to_error [16] = { \r
+ /* No Error */ 0,\r
+ /* CRC Error */ -EILSEQ,\r
+ /* Bit Stuff */ -EPROTO,\r
+ /* Data Togg */ -EILSEQ,\r
+ /* Stall */ -EPIPE,\r
+ /* DevNotResp */ -ETIMEDOUT,\r
+ /* PIDCheck */ -EPROTO,\r
+ /* UnExpPID */ -EPROTO,\r
+ /* DataOver */ -EOVERFLOW,\r
+ /* DataUnder */ -EREMOTEIO,\r
+ /* (for hw) */ -EIO,\r
+ /* (for hw) */ -EIO,\r
+ /* BufferOver */ -ECOMM,\r
+ /* BuffUnder */ -ENOSR,\r
+ /* (for HCD) */ -EALREADY,\r
+ /* (for HCD) */ -EALREADY \r
+};\r
+\r
+\r
+/*\r
+ * The HCCA (Host Controller Communications Area) is a 256 byte\r
+ * structure defined section 4.4.1 of the OHCI spec. The HC is\r
+ * told the base address of it. It must be 256-byte aligned.\r
+ */\r
+struct ohci_hcca {\r
+#define NUM_INTS 32\r
+ __u32 int_table [NUM_INTS]; /* periodic schedule */\r
+ __u16 frame_no; /* current frame number */\r
+ __u16 pad1; /* set to 0 on each frame_no change */\r
+ __u32 done_head; /* info returned for an interrupt */\r
+ u8 reserved_for_hc [116];\r
+ u8 what [4]; /* spec only identifies 252 bytes :) */\r
+} __attribute__ ((aligned(256)));\r
+\r
+ \r
+/*\r
+ * This is the structure of the OHCI controller's memory mapped I/O region.\r
+ * You must use readl() and writel() (in <asm/io.h>) to access these fields!!\r
+ * Layout is in section 7 (and appendix B) of the spec.\r
+ */\r
+struct ohci_regs {\r
+ /* control and status registers (section 7.1) */\r
+ __u32 revision;\r
+ __u32 control;\r
+ __u32 cmdstatus;\r
+ __u32 intrstatus;\r
+ __u32 intrenable;\r
+ __u32 intrdisable;\r
+\r
+ /* memory pointers (section 7.2) */\r
+ __u32 hcca;\r
+ __u32 ed_periodcurrent;\r
+ __u32 ed_controlhead;\r
+ __u32 ed_controlcurrent;\r
+ __u32 ed_bulkhead;\r
+ __u32 ed_bulkcurrent;\r
+ __u32 donehead;\r
+\r
+ /* frame counters (section 7.3) */\r
+ __u32 fminterval;\r
+ __u32 fmremaining;\r
+ __u32 fmnumber;\r
+ __u32 periodicstart;\r
+ __u32 lsthresh;\r
+\r
+ /* Root hub ports (section 7.4) */\r
+ struct ohci_roothub_regs {\r
+ __u32 a;\r
+ __u32 b;\r
+ __u32 status;\r
+#define MAX_ROOT_PORTS 15 /* maximum OHCI root hub ports (RH_A_NDP) */\r
+ __u32 portstatus [MAX_ROOT_PORTS];\r
+ } roothub;\r
+\r
+ /* and optional "legacy support" registers (appendix B) at 0x0100 */\r
+\r
+} __attribute__ ((aligned(32)));\r
+\r
+\r
+/* OHCI CONTROL AND STATUS REGISTER MASKS */\r
+\r
+/*\r
+ * HcControl (control) register masks\r
+ */\r
+#define OHCI_CTRL_CBSR (3 << 0) /* control/bulk service ratio */\r
+#define OHCI_CTRL_PLE (1 << 2) /* periodic list enable */\r
+#define OHCI_CTRL_IE (1 << 3) /* isochronous enable */\r
+#define OHCI_CTRL_CLE (1 << 4) /* control list enable */\r
+#define OHCI_CTRL_BLE (1 << 5) /* bulk list enable */\r
+#define OHCI_CTRL_HCFS (3 << 6) /* host controller functional state */\r
+#define OHCI_CTRL_IR (1 << 8) /* interrupt routing */\r
+#define OHCI_CTRL_RWC (1 << 9) /* remote wakeup connected */\r
+#define OHCI_CTRL_RWE (1 << 10) /* remote wakeup enable */\r
+\r
+/* pre-shifted values for HCFS */\r
+# define OHCI_USB_RESET (0 << 6)\r
+# define OHCI_USB_RESUME (1 << 6)\r
+# define OHCI_USB_OPER (2 << 6)\r
+# define OHCI_USB_SUSPEND (3 << 6)\r
+\r
+/*\r
+ * HcCommandStatus (cmdstatus) register masks\r
+ */\r
+#define OHCI_HCR (1 << 0) /* host controller reset */\r
+#define OHCI_CLF (1 << 1) /* control list filled */\r
+#define OHCI_BLF (1 << 2) /* bulk list filled */\r
+#define OHCI_OCR (1 << 3) /* ownership change request */\r
+#define OHCI_SOC (3 << 16) /* scheduling overrun count */\r
+\r
+/*\r
+ * masks used with interrupt registers:\r
+ * HcInterruptStatus (intrstatus)\r
+ * HcInterruptEnable (intrenable)\r
+ * HcInterruptDisable (intrdisable)\r
+ */\r
+#define OHCI_INTR_SO (1 << 0) /* scheduling overrun */\r
+#define OHCI_INTR_WDH (1 << 1) /* writeback of done_head */\r
+#define OHCI_INTR_SF (1 << 2) /* start frame */\r
+#define OHCI_INTR_RD (1 << 3) /* resume detect */\r
+#define OHCI_INTR_UE (1 << 4) /* unrecoverable error */\r
+#define OHCI_INTR_FNO (1 << 5) /* frame number overflow */\r
+#define OHCI_INTR_RHSC (1 << 6) /* root hub status change */\r
+#define OHCI_INTR_OC (1 << 30) /* ownership change */\r
+#define OHCI_INTR_MIE (1 << 31) /* master interrupt enable */\r
+\r
+\r
+/* OHCI ROOT HUB REGISTER MASKS */\r
+ \r
+/* roothub.portstatus [i] bits */\r
+#define RH_PS_CCS 0x00000001 /* current connect status */\r
+#define RH_PS_PES 0x00000002 /* port enable status*/\r
+#define RH_PS_PSS 0x00000004 /* port suspend status */\r
+#define RH_PS_POCI 0x00000008 /* port over current indicator */\r
+#define RH_PS_PRS 0x00000010 /* port reset status */\r
+#define RH_PS_PPS 0x00000100 /* port power status */\r
+#define RH_PS_LSDA 0x00000200 /* low speed device attached */\r
+#define RH_PS_CSC 0x00010000 /* connect status change */\r
+#define RH_PS_PESC 0x00020000 /* port enable status change */\r
+#define RH_PS_PSSC 0x00040000 /* port suspend status change */\r
+#define RH_PS_OCIC 0x00080000 /* over current indicator change */\r
+#define RH_PS_PRSC 0x00100000 /* port reset status change */\r
+\r
+/* roothub.status bits */\r
+#define RH_HS_LPS 0x00000001 /* local power status */\r
+#define RH_HS_OCI 0x00000002 /* over current indicator */\r
+#define RH_HS_DRWE 0x00008000 /* device remote wakeup enable */\r
+#define RH_HS_LPSC 0x00010000 /* local power status change */\r
+#define RH_HS_OCIC 0x00020000 /* over current indicator change */\r
+#define RH_HS_CRWE 0x80000000 /* clear remote wakeup enable */\r
+\r
+/* roothub.b masks */\r
+#define RH_B_DR 0x0000ffff /* device removable flags */\r
+#define RH_B_PPCM 0xffff0000 /* port power control mask */\r
+\r
+/* roothub.a masks */\r
+#define RH_A_NDP (0xff << 0) /* number of downstream ports */\r
+#define RH_A_PSM (1 << 8) /* power switching mode */\r
+#define RH_A_NPS (1 << 9) /* no power switching */\r
+#define RH_A_DT (1 << 10) /* device type (mbz) */\r
+#define RH_A_OCPM (1 << 11) /* over current protection mode */\r
+#define RH_A_NOCP (1 << 12) /* no over current protection */\r
+#define RH_A_POTPGT (0xff << 24) /* power on to power good time */\r
+\r
+\r
+/* hcd-private per-urb state */\r
+typedef struct urb_priv {\r
+ struct ed *ed;\r
+ __u16 length; // # tds in this request\r
+ __u16 td_cnt; // tds already serviced\r
+ int state;\r
+ struct td *td [0]; // all TDs in this request\r
+\r
+} urb_priv_t;\r
+\r
+#define URB_DEL 1\r
+\r
+#define TD_HASH_SIZE 64 /* power'o'two */\r
+// sizeof (struct td) ~= 64 == 2^6 ... \r
+#define TD_HASH_FUNC(td_dma) ((td_dma ^ (td_dma >> 6)) % TD_HASH_SIZE)\r
+\r
+\r
+/*\r
+ * This is the full ohci controller description\r
+ *\r
+ * Note how the "proper" USB information is just\r
+ * a subset of what the full implementation needs. (Linus)\r
+ */\r
+\r
+struct ohci_hcd {\r
+ spinlock_t lock;\r
+\r
+ /*\r
+ * I/O memory used to communicate with the HC (dma-consistent)\r
+ */\r
+ struct ohci_regs *regs;\r
+\r
+ /*\r
+ * main memory used to communicate with the HC (dma-consistent).\r
+ * hcd adds to schedule for a live hc any time, but removals finish\r
+ * only at the start of the next frame.\r
+ */\r
+ struct ohci_hcca *hcca;\r
+ dma_addr_t hcca_dma;\r
+\r
+ struct ed *ed_rm_list; /* to be removed */\r
+\r
+ struct ed *ed_bulktail; /* last in bulk list */\r
+ struct ed *ed_controltail; /* last in ctrl list */\r
+ struct ed *periodic [NUM_INTS]; /* shadow int_table */\r
+\r
+ /*\r
+ * memory management for queue data structures\r
+ */\r
+ struct pci_pool *td_cache;\r
+ struct pci_pool *ed_cache;\r
+ struct td *td_hash [TD_HASH_SIZE];\r
+\r
+ /*\r
+ * driver state\r
+ */\r
+ int disabled; /* e.g. got a UE, we're hung */\r
+ int sleeping;\r
+ int load [NUM_INTS];\r
+ u32 hc_control; /* copy of hc control reg */\r
+\r
+ unsigned long flags; /* for HC bugs */\r
+#define OHCI_QUIRK_AMD756 0x01 /* erratum #4 */\r
+#define OHCI_QUIRK_SUPERIO 0x02 /* natsemi */\r
+ // there are also chip quirks/bugs in init logic\r
+\r
+ /*\r
+ * framework state\r
+ */\r
+ struct usb_hcd hcd;\r
+};\r
+\r
+#define hcd_to_ohci(hcd_ptr) container_of(hcd_ptr, struct ohci_hcd, hcd)\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+#ifndef DEBUG\r
+#define STUB_DEBUG_FILES\r
+#endif /* DEBUG */\r
+\r
+#define ohci_dbg(ohci, fmt, args...) \\r
+ dev_dbg ((ohci)->hcd.controller , fmt , ## args )\r
+#define ohci_err(ohci, fmt, args...) \\r
+ dev_err ((ohci)->hcd.controller , fmt , ## args )\r
+#define ohci_info(ohci, fmt, args...) \\r
+ dev_info ((ohci)->hcd.controller , fmt , ## args )\r
+#define ohci_warn(ohci, fmt, args...) \\r
+ dev_warn ((ohci)->hcd.controller , fmt , ## args )\r
+\r
+#ifdef OHCI_VERBOSE_DEBUG\r
+# define ohci_vdbg ohci_dbg\r
+#else\r
+# define ohci_vdbg(ohci, fmt, args...) do { } while (0)\r
+#endif\r
+\r
--- /dev/null
+\r
+ohci.nostrip.sys: file format pei-i386\r
+\r
+Disassembly of section .text:\r
+\r
+00011000 <__end__>:\r
+ 11000: 55 push %ebp\r
+ 11001: 89 e5 mov %esp,%ebp\r
+ 11003: 83 ec 08 sub $0x8,%esp\r
+ 11006: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11009: 8b 40 04 mov 0x4(%eax),%eax\r
+ 1100c: 83 c0 48 add $0x48,%eax\r
+ 1100f: 8b 00 mov (%eax),%eax\r
+ 11011: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 11014: 83 7d fc ff cmpl $0xffffffff,0xfffffffc(%ebp)\r
+ 11018: 75 10 jne 1102a <__end__+0x2a>\r
+ 1101a: 83 ec 0c sub $0xc,%esp\r
+ 1101d: ff 75 08 pushl 0x8(%ebp)\r
+ 11020: e8 36 00 00 00 call 1105b <_disable>\r
+ 11025: 83 c4 10 add $0x10,%esp\r
+ 11028: eb 2c jmp 11056 <__end__+0x56>\r
+ 1102a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1102d: 8b 80 30 02 00 00 mov 0x230(%eax),%eax\r
+ 11033: 83 e0 01 and $0x1,%eax\r
+ 11036: 85 c0 test %eax,%eax\r
+ 11038: 74 1c je 11056 <__end__+0x56>\r
+ 1103a: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1103d: 25 00 e0 0f fc and $0xfc0fe000,%eax\r
+ 11042: 85 c0 test %eax,%eax\r
+ 11044: 74 10 je 11056 <__end__+0x56>\r
+ 11046: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11049: 8b 40 04 mov 0x4(%eax),%eax\r
+ 1104c: 83 c0 48 add $0x48,%eax\r
+ 1104f: 8b 00 mov (%eax),%eax\r
+ 11051: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 11054: eb e4 jmp 1103a <__end__+0x3a>\r
+ 11056: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 11059: c9 leave \r
+ 1105a: c3 ret \r
+\r
+0001105b <_disable>:\r
+ 1105b: 55 push %ebp\r
+ 1105c: 89 e5 mov %esp,%ebp\r
+ 1105e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11061: c7 80 a4 01 00 00 01 movl $0x1,0x1a4(%eax)\r
+ 11068: 00 00 00 \r
+ 1106b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1106e: c7 80 14 03 00 00 00 movl $0x0,0x314(%eax)\r
+ 11075: 00 00 00 \r
+ 11078: 5d pop %ebp\r
+ 11079: c3 ret \r
+\r
+0001107a <_roothub_portstatus>:\r
+ 1107a: 55 push %ebp\r
+ 1107b: 89 e5 mov %esp,%ebp\r
+ 1107d: 83 ec 04 sub $0x4,%esp\r
+ 11080: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11083: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11086: c1 e0 02 shl $0x2,%eax\r
+ 11089: 03 42 04 add 0x4(%edx),%eax\r
+ 1108c: 83 c0 54 add $0x54,%eax\r
+ 1108f: 8b 00 mov (%eax),%eax\r
+ 11091: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 11094: 83 7d fc ff cmpl $0xffffffff,0xfffffffc(%ebp)\r
+ 11098: 75 0d jne 110a7 <_roothub_portstatus+0x2d>\r
+ 1109a: ff 75 08 pushl 0x8(%ebp)\r
+ 1109d: e8 b9 ff ff ff call 1105b <_disable>\r
+ 110a2: 83 c4 04 add $0x4,%esp\r
+ 110a5: eb 32 jmp 110d9 <_roothub_portstatus+0x5f>\r
+ 110a7: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 110aa: 8b 80 30 02 00 00 mov 0x230(%eax),%eax\r
+ 110b0: 83 e0 01 and $0x1,%eax\r
+ 110b3: 85 c0 test %eax,%eax\r
+ 110b5: 74 22 je 110d9 <_roothub_portstatus+0x5f>\r
+ 110b7: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 110ba: 25 e0 fc e0 ff and $0xffe0fce0,%eax\r
+ 110bf: 85 c0 test %eax,%eax\r
+ 110c1: 74 16 je 110d9 <_roothub_portstatus+0x5f>\r
+ 110c3: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 110c6: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 110c9: c1 e0 02 shl $0x2,%eax\r
+ 110cc: 03 42 04 add 0x4(%edx),%eax\r
+ 110cf: 83 c0 54 add $0x54,%eax\r
+ 110d2: 8b 00 mov (%eax),%eax\r
+ 110d4: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 110d7: eb de jmp 110b7 <_roothub_portstatus+0x3d>\r
+ 110d9: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 110dc: c9 leave \r
+ 110dd: c3 ret \r
+\r
+000110de <_ohci_hub_status_data>:\r
+ 110de: 55 push %ebp\r
+ 110df: 89 e5 mov %esp,%ebp\r
+ 110e1: 53 push %ebx\r
+ 110e2: 83 ec 24 sub $0x24,%esp\r
+ 110e5: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 110e8: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 110eb: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 110ee: 2d 34 02 00 00 sub $0x234,%eax\r
+ 110f3: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 110f6: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 110fd: c7 45 e8 01 00 00 00 movl $0x1,0xffffffe8(%ebp)\r
+ 11104: 83 ec 0c sub $0xc,%esp\r
+ 11107: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 1110a: e8 f1 fe ff ff call 11000 <__end__>\r
+ 1110f: 83 c4 10 add $0x10,%esp\r
+ 11112: 25 ff 00 00 00 and $0xff,%eax\r
+ 11117: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 1111a: 83 7d f4 0f cmpl $0xf,0xfffffff4(%ebp)\r
+ 1111e: 7e 24 jle 11144 <_ohci_hub_status_data+0x66>\r
+ 11120: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 11123: 83 b8 a4 01 00 00 00 cmpl $0x0,0x1a4(%eax)\r
+ 1112a: 74 0c je 11138 <_ohci_hub_status_data+0x5a>\r
+ 1112c: c7 45 e0 94 ff ff ff movl $0xffffff94,0xffffffe0(%ebp)\r
+ 11133: e9 d8 00 00 00 jmp 11210 <_ohci_hub_status_data+0x132>\r
+ 11138: c7 45 e0 00 00 00 00 movl $0x0,0xffffffe0(%ebp)\r
+ 1113f: e9 cc 00 00 00 jmp 11210 <_ohci_hub_status_data+0x132>\r
+ 11144: 83 ec 0c sub $0xc,%esp\r
+ 11147: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 1114a: e8 c9 00 00 00 call 11218 <_roothub_status>\r
+ 1114f: 83 c4 10 add $0x10,%esp\r
+ 11152: 25 00 00 03 00 and $0x30000,%eax\r
+ 11157: 85 c0 test %eax,%eax\r
+ 11159: 74 0f je 1116a <_ohci_hub_status_data+0x8c>\r
+ 1115b: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1115e: c7 45 ec 01 00 00 00 movl $0x1,0xffffffec(%ebp)\r
+ 11165: c6 00 01 movb $0x1,(%eax)\r
+ 11168: eb 06 jmp 11170 <_ohci_hub_status_data+0x92>\r
+ 1116a: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1116d: c6 00 00 movb $0x0,(%eax)\r
+ 11170: 83 7d f4 07 cmpl $0x7,0xfffffff4(%ebp)\r
+ 11174: 7e 0c jle 11182 <_ohci_hub_status_data+0xa4>\r
+ 11176: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11179: 40 inc %eax\r
+ 1117a: c6 00 00 movb $0x0,(%eax)\r
+ 1117d: 8d 45 e8 lea 0xffffffe8(%ebp),%eax\r
+ 11180: ff 00 incl (%eax)\r
+ 11182: c7 45 f0 00 00 00 00 movl $0x0,0xfffffff0(%ebp)\r
+ 11189: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 1118c: 3b 45 f4 cmp 0xfffffff4(%ebp),%eax\r
+ 1118f: 7d 64 jge 111f5 <_ohci_hub_status_data+0x117>\r
+ 11191: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 11194: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 11197: e8 de fe ff ff call 1107a <_roothub_portstatus>\r
+ 1119c: 83 c4 08 add $0x8,%esp\r
+ 1119f: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 111a2: 8d 45 e4 lea 0xffffffe4(%ebp),%eax\r
+ 111a5: 81 20 00 00 1f 00 andl $0x1f0000,(%eax)\r
+ 111ab: 83 7d e4 00 cmpl $0x0,0xffffffe4(%ebp)\r
+ 111af: 74 3d je 111ee <_ohci_hub_status_data+0x110>\r
+ 111b1: c7 45 ec 01 00 00 00 movl $0x1,0xffffffec(%ebp)\r
+ 111b8: 83 7d f0 06 cmpl $0x6,0xfffffff0(%ebp)\r
+ 111bc: 7f 17 jg 111d5 <_ohci_hub_status_data+0xf7>\r
+ 111be: 8b 5d 0c mov 0xc(%ebp),%ebx\r
+ 111c1: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 111c4: 8b 4d f0 mov 0xfffffff0(%ebp),%ecx\r
+ 111c7: 41 inc %ecx\r
+ 111c8: b8 01 00 00 00 mov $0x1,%eax\r
+ 111cd: d3 e0 shl %cl,%eax\r
+ 111cf: 0a 02 or (%edx),%al\r
+ 111d1: 88 03 mov %al,(%ebx)\r
+ 111d3: eb 19 jmp 111ee <_ohci_hub_status_data+0x110>\r
+ 111d5: 8b 5d 0c mov 0xc(%ebp),%ebx\r
+ 111d8: 43 inc %ebx\r
+ 111d9: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 111dc: 42 inc %edx\r
+ 111dd: 8b 4d f0 mov 0xfffffff0(%ebp),%ecx\r
+ 111e0: 83 e9 07 sub $0x7,%ecx\r
+ 111e3: b8 01 00 00 00 mov $0x1,%eax\r
+ 111e8: d3 e0 shl %cl,%eax\r
+ 111ea: 0a 02 or (%edx),%al\r
+ 111ec: 88 03 mov %al,(%ebx)\r
+ 111ee: 8d 45 f0 lea 0xfffffff0(%ebp),%eax\r
+ 111f1: ff 00 incl (%eax)\r
+ 111f3: eb 94 jmp 11189 <_ohci_hub_status_data+0xab>\r
+ 111f5: 83 7d ec 00 cmpl $0x0,0xffffffec(%ebp)\r
+ 111f9: 74 08 je 11203 <_ohci_hub_status_data+0x125>\r
+ 111fb: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 111fe: 89 45 dc mov %eax,0xffffffdc(%ebp)\r
+ 11201: eb 07 jmp 1120a <_ohci_hub_status_data+0x12c>\r
+ 11203: c7 45 dc 00 00 00 00 movl $0x0,0xffffffdc(%ebp)\r
+ 1120a: 8b 45 dc mov 0xffffffdc(%ebp),%eax\r
+ 1120d: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 11210: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 11213: 8b 5d fc mov 0xfffffffc(%ebp),%ebx\r
+ 11216: c9 leave \r
+ 11217: c3 ret \r
+\r
+00011218 <_roothub_status>:\r
+ 11218: 55 push %ebp\r
+ 11219: 89 e5 mov %esp,%ebp\r
+ 1121b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1121e: 8b 40 04 mov 0x4(%eax),%eax\r
+ 11221: 83 c0 50 add $0x50,%eax\r
+ 11224: 8b 00 mov (%eax),%eax\r
+ 11226: 5d pop %ebp\r
+ 11227: c3 ret \r
+\r
+00011228 <_ohci_hub_descriptor>:\r
+ 11228: 55 push %ebp\r
+ 11229: 89 e5 mov %esp,%ebp\r
+ 1122b: 83 ec 18 sub $0x18,%esp\r
+ 1122e: 83 ec 0c sub $0xc,%esp\r
+ 11231: ff 75 08 pushl 0x8(%ebp)\r
+ 11234: e8 c7 fd ff ff call 11000 <__end__>\r
+ 11239: 83 c4 10 add $0x10,%esp\r
+ 1123c: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 1123f: 0f b6 45 fc movzbl 0xfffffffc(%ebp),%eax\r
+ 11243: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 11246: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11249: c6 40 01 29 movb $0x29,0x1(%eax)\r
+ 1124d: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 11250: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 11253: 25 00 00 00 ff and $0xff000000,%eax\r
+ 11258: c1 e8 18 shr $0x18,%eax\r
+ 1125b: 88 42 05 mov %al,0x5(%edx)\r
+ 1125e: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11261: c6 40 06 00 movb $0x0,0x6(%eax)\r
+ 11265: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 11268: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1126b: 88 42 02 mov %al,0x2(%edx)\r
+ 1126e: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 11271: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 11274: 83 7d f0 00 cmpl $0x0,0xfffffff0(%ebp)\r
+ 11278: 79 04 jns 1127e <_ohci_hub_descriptor+0x56>\r
+ 1127a: 83 45 f0 07 addl $0x7,0xfffffff0(%ebp)\r
+ 1127e: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 11281: c1 f8 03 sar $0x3,%eax\r
+ 11284: 40 inc %eax\r
+ 11285: 66 89 45 f6 mov %ax,0xfffffff6(%ebp)\r
+ 11289: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 1128c: 66 8b 45 f6 mov 0xfffffff6(%ebp),%ax\r
+ 11290: 25 ff ff 00 00 and $0xffff,%eax\r
+ 11295: 01 c0 add %eax,%eax\r
+ 11297: 83 c0 07 add $0x7,%eax\r
+ 1129a: 88 02 mov %al,(%edx)\r
+ 1129c: 66 c7 45 f6 00 00 movw $0x0,0xfffffff6(%ebp)\r
+ 112a2: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 112a5: c1 e8 08 shr $0x8,%eax\r
+ 112a8: 83 e0 01 and $0x1,%eax\r
+ 112ab: 85 c0 test %eax,%eax\r
+ 112ad: 74 07 je 112b6 <_ohci_hub_descriptor+0x8e>\r
+ 112af: 8d 45 f6 lea 0xfffffff6(%ebp),%eax\r
+ 112b2: 66 83 08 01 orw $0x1,(%eax)\r
+ 112b6: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 112b9: c1 e8 0c shr $0xc,%eax\r
+ 112bc: 83 e0 01 and $0x1,%eax\r
+ 112bf: 85 c0 test %eax,%eax\r
+ 112c1: 74 09 je 112cc <_ohci_hub_descriptor+0xa4>\r
+ 112c3: 8d 45 f6 lea 0xfffffff6(%ebp),%eax\r
+ 112c6: 66 83 08 10 orw $0x10,(%eax)\r
+ 112ca: eb 14 jmp 112e0 <_ohci_hub_descriptor+0xb8>\r
+ 112cc: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 112cf: c1 e8 0b shr $0xb,%eax\r
+ 112d2: 83 e0 01 and $0x1,%eax\r
+ 112d5: 85 c0 test %eax,%eax\r
+ 112d7: 74 07 je 112e0 <_ohci_hub_descriptor+0xb8>\r
+ 112d9: 8d 45 f6 lea 0xfffffff6(%ebp),%eax\r
+ 112dc: 66 83 08 08 orw $0x8,(%eax)\r
+ 112e0: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 112e3: 66 8b 45 f6 mov 0xfffffff6(%ebp),%ax\r
+ 112e7: 66 89 42 03 mov %ax,0x3(%edx)\r
+ 112eb: 83 ec 0c sub $0xc,%esp\r
+ 112ee: ff 75 08 pushl 0x8(%ebp)\r
+ 112f1: e8 3b 00 00 00 call 11331 <_roothub_b>\r
+ 112f6: 83 c4 10 add $0x10,%esp\r
+ 112f9: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 112fc: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 112ff: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 11302: 88 42 07 mov %al,0x7(%edx)\r
+ 11305: 83 7d f8 07 cmpl $0x7,0xfffffff8(%ebp)\r
+ 11309: 7e 1d jle 11328 <_ohci_hub_descriptor+0x100>\r
+ 1130b: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 1130e: 0f b7 45 fc movzwl 0xfffffffc(%ebp),%eax\r
+ 11312: c1 e8 08 shr $0x8,%eax\r
+ 11315: 88 42 08 mov %al,0x8(%edx)\r
+ 11318: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 1131b: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1131e: c6 40 0a ff movb $0xff,0xa(%eax)\r
+ 11322: c6 42 09 ff movb $0xff,0x9(%edx)\r
+ 11326: eb 07 jmp 1132f <_ohci_hub_descriptor+0x107>\r
+ 11328: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1132b: c6 40 08 ff movb $0xff,0x8(%eax)\r
+ 1132f: c9 leave \r
+ 11330: c3 ret \r
+\r
+00011331 <_roothub_b>:\r
+ 11331: 55 push %ebp\r
+ 11332: 89 e5 mov %esp,%ebp\r
+ 11334: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11337: 8b 40 04 mov 0x4(%eax),%eax\r
+ 1133a: 83 c0 4c add $0x4c,%eax\r
+ 1133d: 8b 00 mov (%eax),%eax\r
+ 1133f: 5d pop %ebp\r
+ 11340: c3 ret \r
+\r
+00011341 <_ohci_hub_control>:\r
+ 11341: 55 push %ebp\r
+ 11342: 89 e5 mov %esp,%ebp\r
+ 11344: 53 push %ebx\r
+ 11345: 83 ec 34 sub $0x34,%esp\r
+ 11348: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1134b: 8b 55 10 mov 0x10(%ebp),%edx\r
+ 1134e: 8b 4d 14 mov 0x14(%ebp),%ecx\r
+ 11351: 8b 5d 1c mov 0x1c(%ebp),%ebx\r
+ 11354: 66 89 45 fa mov %ax,0xfffffffa(%ebp)\r
+ 11358: 66 89 55 f8 mov %dx,0xfffffff8(%ebp)\r
+ 1135c: 66 89 4d f6 mov %cx,0xfffffff6(%ebp)\r
+ 11360: 66 89 5d f4 mov %bx,0xfffffff4(%ebp)\r
+ 11364: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11367: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 1136a: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 1136d: 2d 34 02 00 00 sub $0x234,%eax\r
+ 11372: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 11375: 83 ec 0c sub $0xc,%esp\r
+ 11378: ff 75 08 pushl 0x8(%ebp)\r
+ 1137b: e8 fb 02 00 00 call 1167b <_hcd_to_bus>\r
+ 11380: 83 c4 10 add $0x10,%esp\r
+ 11383: 8b 40 24 mov 0x24(%eax),%eax\r
+ 11386: 8b 80 ac 01 00 00 mov 0x1ac(%eax),%eax\r
+ 1138c: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 1138f: c7 45 e4 00 00 00 00 movl $0x0,0xffffffe4(%ebp)\r
+ 11396: 66 8b 45 fa mov 0xfffffffa(%ebp),%ax\r
+ 1139a: 89 c2 mov %eax,%edx\r
+ 1139c: 81 e2 ff ff 00 00 and $0xffff,%edx\r
+ 113a2: 89 55 d4 mov %edx,0xffffffd4(%ebp)\r
+ 113a5: 81 7d d4 03 23 00 00 cmpl $0x2303,0xffffffd4(%ebp)\r
+ 113ac: 0f 84 ef 01 00 00 je 115a1 <_ohci_hub_control+0x260>\r
+ 113b2: 81 7d d4 03 23 00 00 cmpl $0x2303,0xffffffd4(%ebp)\r
+ 113b9: 7f 32 jg 113ed <_ohci_hub_control+0xac>\r
+ 113bb: 81 7d d4 03 20 00 00 cmpl $0x2003,0xffffffd4(%ebp)\r
+ 113c2: 0f 84 c0 01 00 00 je 11588 <_ohci_hub_control+0x247>\r
+ 113c8: 81 7d d4 03 20 00 00 cmpl $0x2003,0xffffffd4(%ebp)\r
+ 113cf: 7f 0e jg 113df <_ohci_hub_control+0x9e>\r
+ 113d1: 81 7d d4 01 20 00 00 cmpl $0x2001,0xffffffd4(%ebp)\r
+ 113d8: 74 4d je 11427 <_ohci_hub_control+0xe6>\r
+ 113da: e9 8d 02 00 00 jmp 1166c <_ohci_hub_control+0x32b>\r
+ 113df: 81 7d d4 01 23 00 00 cmpl $0x2301,0xffffffd4(%ebp)\r
+ 113e6: 74 76 je 1145e <_ohci_hub_control+0x11d>\r
+ 113e8: e9 7f 02 00 00 jmp 1166c <_ohci_hub_control+0x32b>\r
+ 113ed: 81 7d d4 06 a0 00 00 cmpl $0xa006,0xffffffd4(%ebp)\r
+ 113f4: 0f 84 10 01 00 00 je 1150a <_ohci_hub_control+0x1c9>\r
+ 113fa: 81 7d d4 06 a0 00 00 cmpl $0xa006,0xffffffd4(%ebp)\r
+ 11401: 7f 12 jg 11415 <_ohci_hub_control+0xd4>\r
+ 11403: 81 7d d4 00 a0 00 00 cmpl $0xa000,0xffffffd4(%ebp)\r
+ 1140a: 0f 84 10 01 00 00 je 11520 <_ohci_hub_control+0x1df>\r
+ 11410: e9 57 02 00 00 jmp 1166c <_ohci_hub_control+0x32b>\r
+ 11415: 81 7d d4 00 a3 00 00 cmpl $0xa300,0xffffffd4(%ebp)\r
+ 1141c: 0f 84 1e 01 00 00 je 11540 <_ohci_hub_control+0x1ff>\r
+ 11422: e9 45 02 00 00 jmp 1166c <_ohci_hub_control+0x32b>\r
+ 11427: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1142a: 89 c2 mov %eax,%edx\r
+ 1142c: 81 e2 ff ff 00 00 and $0xffff,%edx\r
+ 11432: 89 55 e0 mov %edx,0xffffffe0(%ebp)\r
+ 11435: 83 7d e0 00 cmpl $0x0,0xffffffe0(%ebp)\r
+ 11439: 0f 84 34 02 00 00 je 11673 <_ohci_hub_control+0x332>\r
+ 1143f: 83 7d e0 01 cmpl $0x1,0xffffffe0(%ebp)\r
+ 11443: 74 05 je 1144a <_ohci_hub_control+0x109>\r
+ 11445: e9 22 02 00 00 jmp 1166c <_ohci_hub_control+0x32b>\r
+ 1144a: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 1144d: 8b 40 04 mov 0x4(%eax),%eax\r
+ 11450: 83 c0 50 add $0x50,%eax\r
+ 11453: c7 00 00 00 02 00 movl $0x20000,(%eax)\r
+ 11459: e9 15 02 00 00 jmp 11673 <_ohci_hub_control+0x332>\r
+ 1145e: 66 83 7d f6 00 cmpw $0x0,0xfffffff6(%ebp)\r
+ 11463: 0f 84 03 02 00 00 je 1166c <_ohci_hub_control+0x32b>\r
+ 11469: 66 8b 45 f6 mov 0xfffffff6(%ebp),%ax\r
+ 1146d: 25 ff ff 00 00 and $0xffff,%eax\r
+ 11472: 3b 45 ec cmp 0xffffffec(%ebp),%eax\r
+ 11475: 0f 8f f1 01 00 00 jg 1166c <_ohci_hub_control+0x32b>\r
+ 1147b: 8d 45 f6 lea 0xfffffff6(%ebp),%eax\r
+ 1147e: 66 ff 08 decw (%eax)\r
+ 11481: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 11484: 89 c2 mov %eax,%edx\r
+ 11486: 81 e2 ff ff 00 00 and $0xffff,%edx\r
+ 1148c: 89 55 dc mov %edx,0xffffffdc(%ebp)\r
+ 1148f: 83 7d dc 14 cmpl $0x14,0xffffffdc(%ebp)\r
+ 11493: 0f 87 d3 01 00 00 ja 1166c <_ohci_hub_control+0x32b>\r
+ 11499: 8b 55 dc mov 0xffffffdc(%ebp),%edx\r
+ 1149c: 8b 04 95 60 60 01 00 mov 0x16060(,%edx,4),%eax\r
+ 114a3: ff e0 jmp *%eax\r
+ 114a5: c7 45 e8 01 00 00 00 movl $0x1,0xffffffe8(%ebp)\r
+ 114ac: eb 3d jmp 114eb <_ohci_hub_control+0x1aa>\r
+ 114ae: c7 45 e8 00 00 02 00 movl $0x20000,0xffffffe8(%ebp)\r
+ 114b5: eb 34 jmp 114eb <_ohci_hub_control+0x1aa>\r
+ 114b7: c7 45 e8 08 00 00 00 movl $0x8,0xffffffe8(%ebp)\r
+ 114be: eb 2b jmp 114eb <_ohci_hub_control+0x1aa>\r
+ 114c0: c7 45 e8 00 00 04 00 movl $0x40000,0xffffffe8(%ebp)\r
+ 114c7: eb 22 jmp 114eb <_ohci_hub_control+0x1aa>\r
+ 114c9: c7 45 e8 00 02 00 00 movl $0x200,0xffffffe8(%ebp)\r
+ 114d0: eb 19 jmp 114eb <_ohci_hub_control+0x1aa>\r
+ 114d2: c7 45 e8 00 00 01 00 movl $0x10000,0xffffffe8(%ebp)\r
+ 114d9: eb 10 jmp 114eb <_ohci_hub_control+0x1aa>\r
+ 114db: c7 45 e8 00 00 08 00 movl $0x80000,0xffffffe8(%ebp)\r
+ 114e2: eb 07 jmp 114eb <_ohci_hub_control+0x1aa>\r
+ 114e4: c7 45 e8 00 00 10 00 movl $0x100000,0xffffffe8(%ebp)\r
+ 114eb: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 114ee: 66 8b 45 f6 mov 0xfffffff6(%ebp),%ax\r
+ 114f2: 25 ff ff 00 00 and $0xffff,%eax\r
+ 114f7: c1 e0 02 shl $0x2,%eax\r
+ 114fa: 03 42 04 add 0x4(%edx),%eax\r
+ 114fd: 8d 50 54 lea 0x54(%eax),%edx\r
+ 11500: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 11503: 89 02 mov %eax,(%edx)\r
+ 11505: e9 69 01 00 00 jmp 11673 <_ohci_hub_control+0x332>\r
+ 1150a: 83 ec 08 sub $0x8,%esp\r
+ 1150d: ff 75 18 pushl 0x18(%ebp)\r
+ 11510: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 11513: e8 10 fd ff ff call 11228 <_ohci_hub_descriptor>\r
+ 11518: 83 c4 10 add $0x10,%esp\r
+ 1151b: e9 53 01 00 00 jmp 11673 <_ohci_hub_control+0x332>\r
+ 11520: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 11523: e8 f0 fc ff ff call 11218 <_roothub_status>\r
+ 11528: 83 c4 04 add $0x4,%esp\r
+ 1152b: 25 ff 7f ff 7f and $0x7fff7fff,%eax\r
+ 11530: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 11533: 8b 55 18 mov 0x18(%ebp),%edx\r
+ 11536: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 11539: 89 02 mov %eax,(%edx)\r
+ 1153b: e9 33 01 00 00 jmp 11673 <_ohci_hub_control+0x332>\r
+ 11540: 66 83 7d f6 00 cmpw $0x0,0xfffffff6(%ebp)\r
+ 11545: 0f 84 21 01 00 00 je 1166c <_ohci_hub_control+0x32b>\r
+ 1154b: 66 8b 45 f6 mov 0xfffffff6(%ebp),%ax\r
+ 1154f: 25 ff ff 00 00 and $0xffff,%eax\r
+ 11554: 3b 45 ec cmp 0xffffffec(%ebp),%eax\r
+ 11557: 0f 8f 0f 01 00 00 jg 1166c <_ohci_hub_control+0x32b>\r
+ 1155d: 8d 45 f6 lea 0xfffffff6(%ebp),%eax\r
+ 11560: 66 ff 08 decw (%eax)\r
+ 11563: 66 8b 45 f6 mov 0xfffffff6(%ebp),%ax\r
+ 11567: 25 ff ff 00 00 and $0xffff,%eax\r
+ 1156c: 50 push %eax\r
+ 1156d: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 11570: e8 05 fb ff ff call 1107a <_roothub_portstatus>\r
+ 11575: 83 c4 08 add $0x8,%esp\r
+ 11578: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 1157b: 8b 55 18 mov 0x18(%ebp),%edx\r
+ 1157e: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 11581: 89 02 mov %eax,(%edx)\r
+ 11583: e9 eb 00 00 00 jmp 11673 <_ohci_hub_control+0x332>\r
+ 11588: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1158b: 25 ff ff 00 00 and $0xffff,%eax\r
+ 11590: 83 c0 00 add $0x0,%eax\r
+ 11593: 83 f8 01 cmp $0x1,%eax\r
+ 11596: 0f 87 d0 00 00 00 ja 1166c <_ohci_hub_control+0x32b>\r
+ 1159c: e9 d2 00 00 00 jmp 11673 <_ohci_hub_control+0x332>\r
+ 115a1: 66 83 7d f6 00 cmpw $0x0,0xfffffff6(%ebp)\r
+ 115a6: 0f 84 c0 00 00 00 je 1166c <_ohci_hub_control+0x32b>\r
+ 115ac: 66 8b 45 f6 mov 0xfffffff6(%ebp),%ax\r
+ 115b0: 25 ff ff 00 00 and $0xffff,%eax\r
+ 115b5: 3b 45 ec cmp 0xffffffec(%ebp),%eax\r
+ 115b8: 0f 8f ae 00 00 00 jg 1166c <_ohci_hub_control+0x32b>\r
+ 115be: 8d 45 f6 lea 0xfffffff6(%ebp),%eax\r
+ 115c1: 66 ff 08 decw (%eax)\r
+ 115c4: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 115c7: 89 c2 mov %eax,%edx\r
+ 115c9: 81 e2 ff ff 00 00 and $0xffff,%edx\r
+ 115cf: 89 55 d8 mov %edx,0xffffffd8(%ebp)\r
+ 115d2: 83 7d d8 04 cmpl $0x4,0xffffffd8(%ebp)\r
+ 115d6: 74 53 je 1162b <_ohci_hub_control+0x2ea>\r
+ 115d8: 83 7d d8 04 cmpl $0x4,0xffffffd8(%ebp)\r
+ 115dc: 7f 0b jg 115e9 <_ohci_hub_control+0x2a8>\r
+ 115de: 83 7d d8 02 cmpl $0x2,0xffffffd8(%ebp)\r
+ 115e2: 74 0d je 115f1 <_ohci_hub_control+0x2b0>\r
+ 115e4: e9 83 00 00 00 jmp 1166c <_ohci_hub_control+0x32b>\r
+ 115e9: 83 7d d8 08 cmpl $0x8,0xffffffd8(%ebp)\r
+ 115ed: 74 1f je 1160e <_ohci_hub_control+0x2cd>\r
+ 115ef: eb 7b jmp 1166c <_ohci_hub_control+0x32b>\r
+ 115f1: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 115f4: 66 8b 45 f6 mov 0xfffffff6(%ebp),%ax\r
+ 115f8: 25 ff ff 00 00 and $0xffff,%eax\r
+ 115fd: c1 e0 02 shl $0x2,%eax\r
+ 11600: 03 42 04 add 0x4(%edx),%eax\r
+ 11603: 83 c0 54 add $0x54,%eax\r
+ 11606: c7 00 04 00 00 00 movl $0x4,(%eax)\r
+ 1160c: eb 65 jmp 11673 <_ohci_hub_control+0x332>\r
+ 1160e: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 11611: 66 8b 45 f6 mov 0xfffffff6(%ebp),%ax\r
+ 11615: 25 ff ff 00 00 and $0xffff,%eax\r
+ 1161a: c1 e0 02 shl $0x2,%eax\r
+ 1161d: 03 42 04 add 0x4(%edx),%eax\r
+ 11620: 83 c0 54 add $0x54,%eax\r
+ 11623: c7 00 00 01 00 00 movl $0x100,(%eax)\r
+ 11629: eb 48 jmp 11673 <_ohci_hub_control+0x332>\r
+ 1162b: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 1162e: 66 8b 45 f6 mov 0xfffffff6(%ebp),%ax\r
+ 11632: 25 ff ff 00 00 and $0xffff,%eax\r
+ 11637: c1 e0 02 shl $0x2,%eax\r
+ 1163a: 03 42 04 add 0x4(%edx),%eax\r
+ 1163d: 83 c0 54 add $0x54,%eax\r
+ 11640: 8b 00 mov (%eax),%eax\r
+ 11642: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 11645: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 11648: 83 e0 01 and $0x1,%eax\r
+ 1164b: 85 c0 test %eax,%eax\r
+ 1164d: 74 24 je 11673 <_ohci_hub_control+0x332>\r
+ 1164f: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 11652: 66 8b 45 f6 mov 0xfffffff6(%ebp),%ax\r
+ 11656: 25 ff ff 00 00 and $0xffff,%eax\r
+ 1165b: c1 e0 02 shl $0x2,%eax\r
+ 1165e: 03 42 04 add 0x4(%edx),%eax\r
+ 11661: 83 c0 54 add $0x54,%eax\r
+ 11664: c7 00 10 00 00 00 movl $0x10,(%eax)\r
+ 1166a: eb 07 jmp 11673 <_ohci_hub_control+0x332>\r
+ 1166c: c7 45 e4 e0 ff ff ff movl $0xffffffe0,0xffffffe4(%ebp)\r
+ 11673: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 11676: 8b 5d fc mov 0xfffffffc(%ebp),%ebx\r
+ 11679: c9 leave \r
+ 1167a: c3 ret \r
+\r
+0001167b <_hcd_to_bus>:\r
+ 1167b: 55 push %ebp\r
+ 1167c: 89 e5 mov %esp,%ebp\r
+ 1167e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11681: 5d pop %ebp\r
+ 11682: c3 ret \r
+\r
+00011683 <_ohci_hcd_alloc>:\r
+ 11683: 55 push %ebp\r
+ 11684: 89 e5 mov %esp,%ebp\r
+ 11686: 83 ec 08 sub $0x8,%esp\r
+ 11689: 83 ec 08 sub $0x8,%esp\r
+ 1168c: 68 18 03 00 00 push $0x318\r
+ 11691: 6a 01 push $0x1\r
+ 11693: e8 d8 2e 00 00 call 14570 <_ExAllocatePool@8>\r
+ 11698: 83 c4 08 add $0x8,%esp\r
+ 1169b: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 1169e: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 116a2: 74 22 je 116c6 <_ohci_hcd_alloc+0x43>\r
+ 116a4: 83 ec 04 sub $0x4,%esp\r
+ 116a7: 68 18 03 00 00 push $0x318\r
+ 116ac: 6a 00 push $0x0\r
+ 116ae: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 116b1: e8 ea 2e 00 00 call 145a0 <_memset>\r
+ 116b6: 83 c4 10 add $0x10,%esp\r
+ 116b9: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 116bc: 05 34 02 00 00 add $0x234,%eax\r
+ 116c1: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 116c4: eb 07 jmp 116cd <_ohci_hcd_alloc+0x4a>\r
+ 116c6: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 116cd: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 116d0: c9 leave \r
+ 116d1: c3 ret \r
+\r
+000116d2 <_ohci_hcd_free>:\r
+ 116d2: 55 push %ebp\r
+ 116d3: 89 e5 mov %esp,%ebp\r
+ 116d5: 83 ec 08 sub $0x8,%esp\r
+ 116d8: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 116db: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 116de: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 116e1: 2d 34 02 00 00 sub $0x234,%eax\r
+ 116e6: 83 ec 0c sub $0xc,%esp\r
+ 116e9: 50 push %eax\r
+ 116ea: e8 91 2e 00 00 call 14580 <_ExFreePool@4>\r
+ 116ef: 83 c4 0c add $0xc,%esp\r
+ 116f2: c9 leave \r
+ 116f3: c3 ret \r
+\r
+000116f4 <_ohci_mem_init>:\r
+ 116f4: 55 push %ebp\r
+ 116f5: 89 e5 mov %esp,%ebp\r
+ 116f7: 83 ec 04 sub $0x4,%esp\r
+ 116fa: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 116fd: c7 80 9c 00 00 00 01 movl $0x1,0x9c(%eax)\r
+ 11704: 00 00 00 \r
+ 11707: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1170a: 83 b8 9c 00 00 00 00 cmpl $0x0,0x9c(%eax)\r
+ 11711: 75 09 jne 1171c <_ohci_mem_init+0x28>\r
+ 11713: c7 45 fc f4 ff ff ff movl $0xfffffff4,0xfffffffc(%ebp)\r
+ 1171a: eb 29 jmp 11745 <_ohci_mem_init+0x51>\r
+ 1171c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1171f: c7 80 a0 00 00 00 01 movl $0x1,0xa0(%eax)\r
+ 11726: 00 00 00 \r
+ 11729: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1172c: 83 b8 a0 00 00 00 00 cmpl $0x0,0xa0(%eax)\r
+ 11733: 75 09 jne 1173e <_ohci_mem_init+0x4a>\r
+ 11735: c7 45 fc f4 ff ff ff movl $0xfffffff4,0xfffffffc(%ebp)\r
+ 1173c: eb 07 jmp 11745 <_ohci_mem_init+0x51>\r
+ 1173e: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 11745: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 11748: c9 leave \r
+ 11749: c3 ret \r
+\r
+0001174a <_ohci_mem_cleanup>:\r
+ 1174a: 55 push %ebp\r
+ 1174b: 89 e5 mov %esp,%ebp\r
+ 1174d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11750: 83 b8 9c 00 00 00 00 cmpl $0x0,0x9c(%eax)\r
+ 11757: 74 0d je 11766 <_ohci_mem_cleanup+0x1c>\r
+ 11759: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1175c: c7 80 9c 00 00 00 00 movl $0x0,0x9c(%eax)\r
+ 11763: 00 00 00 \r
+ 11766: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11769: 83 b8 a0 00 00 00 00 cmpl $0x0,0xa0(%eax)\r
+ 11770: 74 0d je 1177f <_ohci_mem_cleanup+0x35>\r
+ 11772: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11775: c7 80 a0 00 00 00 00 movl $0x0,0xa0(%eax)\r
+ 1177c: 00 00 00 \r
+ 1177f: 5d pop %ebp\r
+ 11780: c3 ret \r
+\r
+00011781 <_td_alloc>:\r
+ 11781: 55 push %ebp\r
+ 11782: 89 e5 mov %esp,%ebp\r
+ 11784: 83 ec 08 sub $0x8,%esp\r
+ 11787: 83 ec 04 sub $0x4,%esp\r
+ 1178a: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 1178d: 50 push %eax\r
+ 1178e: ff 75 0c pushl 0xc(%ebp)\r
+ 11791: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11794: ff b0 9c 00 00 00 pushl 0x9c(%eax)\r
+ 1179a: e8 35 00 00 00 call 117d4 <_my_pci_pool_alloc>\r
+ 1179f: 83 c4 10 add $0x10,%esp\r
+ 117a2: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 117a5: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 117a9: 74 24 je 117cf <_td_alloc+0x4e>\r
+ 117ab: 83 ec 04 sub $0x4,%esp\r
+ 117ae: 6a 40 push $0x40\r
+ 117b0: 6a 00 push $0x0\r
+ 117b2: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 117b5: e8 e6 2d 00 00 call 145a0 <_memset>\r
+ 117ba: 83 c4 10 add $0x10,%esp\r
+ 117bd: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 117c0: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 117c3: 89 42 08 mov %eax,0x8(%edx)\r
+ 117c6: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 117c9: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 117cc: 89 42 24 mov %eax,0x24(%edx)\r
+ 117cf: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 117d2: c9 leave \r
+ 117d3: c3 ret \r
+\r
+000117d4 <_my_pci_pool_alloc>:\r
+ 117d4: 55 push %ebp\r
+ 117d5: 89 e5 mov %esp,%ebp\r
+ 117d7: 83 ec 08 sub $0x8,%esp\r
+ 117da: 83 ec 08 sub $0x8,%esp\r
+ 117dd: ff 75 0c pushl 0xc(%ebp)\r
+ 117e0: 6a 01 push $0x1\r
+ 117e2: e8 89 2d 00 00 call 14570 <_ExAllocatePool@8>\r
+ 117e7: 83 c4 08 add $0x8,%esp\r
+ 117ea: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 117ed: 8b 55 10 mov 0x10(%ebp),%edx\r
+ 117f0: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 117f3: 89 02 mov %eax,(%edx)\r
+ 117f5: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 117f8: c9 leave \r
+ 117f9: c3 ret \r
+\r
+000117fa <_td_free>:\r
+ 117fa: 55 push %ebp\r
+ 117fb: 89 e5 mov %esp,%ebp\r
+ 117fd: 83 ec 08 sub $0x8,%esp\r
+ 11800: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 11803: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11806: 8b 40 24 mov 0x24(%eax),%eax\r
+ 11809: c1 e8 06 shr $0x6,%eax\r
+ 1180c: 33 42 24 xor 0x24(%edx),%eax\r
+ 1180f: 83 e0 3f and $0x3f,%eax\r
+ 11812: c1 e0 02 shl $0x2,%eax\r
+ 11815: 03 45 08 add 0x8(%ebp),%eax\r
+ 11818: 05 a4 00 00 00 add $0xa4,%eax\r
+ 1181d: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 11820: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 11823: 83 38 00 cmpl $0x0,(%eax)\r
+ 11826: 74 17 je 1183f <_td_free+0x45>\r
+ 11828: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1182b: 8b 00 mov (%eax),%eax\r
+ 1182d: 3b 45 0c cmp 0xc(%ebp),%eax\r
+ 11830: 74 0d je 1183f <_td_free+0x45>\r
+ 11832: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 11835: 8b 00 mov (%eax),%eax\r
+ 11837: 83 c0 18 add $0x18,%eax\r
+ 1183a: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 1183d: eb e1 jmp 11820 <_td_free+0x26>\r
+ 1183f: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 11842: 83 38 00 cmpl $0x0,(%eax)\r
+ 11845: 74 0d je 11854 <_td_free+0x5a>\r
+ 11847: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1184a: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 1184d: 8b 52 18 mov 0x18(%edx),%edx\r
+ 11850: 89 10 mov %edx,(%eax)\r
+ 11852: eb 00 jmp 11854 <_td_free+0x5a>\r
+ 11854: 83 ec 0c sub $0xc,%esp\r
+ 11857: ff 75 0c pushl 0xc(%ebp)\r
+ 1185a: e8 21 2d 00 00 call 14580 <_ExFreePool@4>\r
+ 1185f: 83 c4 0c add $0xc,%esp\r
+ 11862: c9 leave \r
+ 11863: c3 ret \r
+\r
+00011864 <_ed_alloc>:\r
+ 11864: 55 push %ebp\r
+ 11865: 89 e5 mov %esp,%ebp\r
+ 11867: 83 ec 08 sub $0x8,%esp\r
+ 1186a: 83 ec 04 sub $0x4,%esp\r
+ 1186d: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 11870: 50 push %eax\r
+ 11871: ff 75 0c pushl 0xc(%ebp)\r
+ 11874: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11877: ff b0 a0 00 00 00 pushl 0xa0(%eax)\r
+ 1187d: e8 52 ff ff ff call 117d4 <_my_pci_pool_alloc>\r
+ 11882: 83 c4 10 add $0x10,%esp\r
+ 11885: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 11888: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 1188c: 74 38 je 118c6 <_ed_alloc+0x62>\r
+ 1188e: 83 ec 04 sub $0x4,%esp\r
+ 11891: 6a 40 push $0x40\r
+ 11893: 6a 00 push $0x0\r
+ 11895: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 11898: e8 03 2d 00 00 call 145a0 <_memset>\r
+ 1189d: 83 c4 10 add $0x10,%esp\r
+ 118a0: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 118a3: 83 c2 20 add $0x20,%edx\r
+ 118a6: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 118a9: 83 c0 20 add $0x20,%eax\r
+ 118ac: 89 02 mov %eax,(%edx)\r
+ 118ae: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 118b1: 83 c2 20 add $0x20,%edx\r
+ 118b4: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 118b7: 83 c0 20 add $0x20,%eax\r
+ 118ba: 89 42 04 mov %eax,0x4(%edx)\r
+ 118bd: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 118c0: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 118c3: 89 42 10 mov %eax,0x10(%edx)\r
+ 118c6: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 118c9: c9 leave \r
+ 118ca: c3 ret \r
+\r
+000118cb <_ed_free>:\r
+ 118cb: 55 push %ebp\r
+ 118cc: 89 e5 mov %esp,%ebp\r
+ 118ce: 83 ec 08 sub $0x8,%esp\r
+ 118d1: 83 ec 0c sub $0xc,%esp\r
+ 118d4: ff 75 0c pushl 0xc(%ebp)\r
+ 118d7: e8 a4 2c 00 00 call 14580 <_ExFreePool@4>\r
+ 118dc: 83 c4 0c add $0xc,%esp\r
+ 118df: c9 leave \r
+ 118e0: c3 ret \r
+\r
+000118e1 <_urb_free_priv>:\r
+ 118e1: 55 push %ebp\r
+ 118e2: 89 e5 mov %esp,%ebp\r
+ 118e4: 83 ec 18 sub $0x18,%esp\r
+ 118e7: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 118ea: 66 8b 40 04 mov 0x4(%eax),%ax\r
+ 118ee: 25 ff ff 00 00 and $0xffff,%eax\r
+ 118f3: 48 dec %eax\r
+ 118f4: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 118f7: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 118fb: 78 3a js 11937 <_urb_free_priv+0x56>\r
+ 118fd: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 11904: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 11907: 3b 45 fc cmp 0xfffffffc(%ebp),%eax\r
+ 1190a: 7f 2b jg 11937 <_urb_free_priv+0x56>\r
+ 1190c: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1190f: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 11912: 8b 44 90 0c mov 0xc(%eax,%edx,4),%eax\r
+ 11916: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 11919: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 1191d: 74 11 je 11930 <_urb_free_priv+0x4f>\r
+ 1191f: 83 ec 08 sub $0x8,%esp\r
+ 11922: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 11925: ff 75 08 pushl 0x8(%ebp)\r
+ 11928: e8 cd fe ff ff call 117fa <_td_free>\r
+ 1192d: 83 c4 10 add $0x10,%esp\r
+ 11930: 8d 45 f8 lea 0xfffffff8(%ebp),%eax\r
+ 11933: ff 00 incl (%eax)\r
+ 11935: eb cd jmp 11904 <_urb_free_priv+0x23>\r
+ 11937: 83 ec 0c sub $0xc,%esp\r
+ 1193a: ff 75 0c pushl 0xc(%ebp)\r
+ 1193d: e8 3e 2c 00 00 call 14580 <_ExFreePool@4>\r
+ 11942: 83 c4 0c add $0xc,%esp\r
+ 11945: c9 leave \r
+ 11946: c3 ret \r
+\r
+00011947 <_finish_urb>:\r
+ 11947: 55 push %ebp\r
+ 11948: 89 e5 mov %esp,%ebp\r
+ 1194a: 83 ec 08 sub $0x8,%esp\r
+ 1194d: 83 ec 08 sub $0x8,%esp\r
+ 11950: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11953: ff 70 08 pushl 0x8(%eax)\r
+ 11956: ff 75 08 pushl 0x8(%ebp)\r
+ 11959: e8 83 ff ff ff call 118e1 <_urb_free_priv>\r
+ 1195e: 83 c4 10 add $0x10,%esp\r
+ 11961: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11964: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax)\r
+ 1196b: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1196e: c7 00 01 00 00 00 movl $0x1,(%eax)\r
+ 11974: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11977: 83 78 1c 8d cmpl $0xffffff8d,0x1c(%eax)\r
+ 1197b: 75 0a jne 11987 <_finish_urb+0x40>\r
+ 1197d: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11980: c7 40 1c 00 00 00 00 movl $0x0,0x1c(%eax)\r
+ 11987: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1198a: 8b 40 18 mov 0x18(%eax),%eax\r
+ 1198d: c1 e8 1e shr $0x1e,%eax\r
+ 11990: 83 e0 03 and $0x3,%eax\r
+ 11993: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 11996: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 1199a: 74 08 je 119a4 <_finish_urb+0x5d>\r
+ 1199c: 83 7d fc 01 cmpl $0x1,0xfffffffc(%ebp)\r
+ 119a0: 74 18 je 119ba <_finish_urb+0x73>\r
+ 119a2: eb 2a jmp 119ce <_finish_urb+0x87>\r
+ 119a4: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 119a7: 05 34 02 00 00 add $0x234,%eax\r
+ 119ac: 50 push %eax\r
+ 119ad: e8 c9 fc ff ff call 1167b <_hcd_to_bus>\r
+ 119b2: 83 c4 04 add $0x4,%esp\r
+ 119b5: ff 48 3c decl 0x3c(%eax)\r
+ 119b8: eb 14 jmp 119ce <_finish_urb+0x87>\r
+ 119ba: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 119bd: 05 34 02 00 00 add $0x234,%eax\r
+ 119c2: 50 push %eax\r
+ 119c3: e8 b3 fc ff ff call 1167b <_hcd_to_bus>\r
+ 119c8: 83 c4 04 add $0x4,%esp\r
+ 119cb: ff 48 38 decl 0x38(%eax)\r
+ 119ce: 83 ec 04 sub $0x4,%esp\r
+ 119d1: ff 75 10 pushl 0x10(%ebp)\r
+ 119d4: ff 75 0c pushl 0xc(%ebp)\r
+ 119d7: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 119da: 05 34 02 00 00 add $0x234,%eax\r
+ 119df: 50 push %eax\r
+ 119e0: e8 db 2b 00 00 call 145c0 <_usb_hcd_giveback_urb@12>\r
+ 119e5: 83 c4 04 add $0x4,%esp\r
+ 119e8: c9 leave \r
+ 119e9: c3 ret \r
+\r
+000119ea <_balance>:\r
+ 119ea: 55 push %ebp\r
+ 119eb: 89 e5 mov %esp,%ebp\r
+ 119ed: 53 push %ebx\r
+ 119ee: 83 ec 0c sub $0xc,%esp\r
+ 119f1: c7 45 f4 e4 ff ff ff movl $0xffffffe4,0xfffffff4(%ebp)\r
+ 119f8: 83 7d 0c 20 cmpl $0x20,0xc(%ebp)\r
+ 119fc: 7e 07 jle 11a05 <_balance+0x1b>\r
+ 119fe: c7 45 0c 20 00 00 00 movl $0x20,0xc(%ebp)\r
+ 11a05: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 11a0c: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 11a0f: 3b 45 0c cmp 0xc(%ebp),%eax\r
+ 11a12: 7d 68 jge 11a7c <_balance+0x92>\r
+ 11a14: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 11a18: 78 1e js 11a38 <_balance+0x4e>\r
+ 11a1a: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 11a1d: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 11a20: 8b 4d 08 mov 0x8(%ebp),%ecx\r
+ 11a23: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 11a26: 8b 84 83 ac 01 00 00 mov 0x1ac(%ebx,%eax,4),%eax\r
+ 11a2d: 3b 84 91 ac 01 00 00 cmp 0x1ac(%ecx,%edx,4),%eax\r
+ 11a34: 7f 02 jg 11a38 <_balance+0x4e>\r
+ 11a36: eb 3d jmp 11a75 <_balance+0x8b>\r
+ 11a38: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 11a3b: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 11a3e: 83 7d f0 1f cmpl $0x1f,0xfffffff0(%ebp)\r
+ 11a42: 7f 23 jg 11a67 <_balance+0x7d>\r
+ 11a44: 8b 4d 08 mov 0x8(%ebp),%ecx\r
+ 11a47: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 11a4a: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 11a4d: 03 84 91 ac 01 00 00 add 0x1ac(%ecx,%edx,4),%eax\r
+ 11a54: 3d 84 03 00 00 cmp $0x384,%eax\r
+ 11a59: 7e 02 jle 11a5d <_balance+0x73>\r
+ 11a5b: eb 0a jmp 11a67 <_balance+0x7d>\r
+ 11a5d: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 11a60: 8d 45 f0 lea 0xfffffff0(%ebp),%eax\r
+ 11a63: 01 10 add %edx,(%eax)\r
+ 11a65: eb d7 jmp 11a3e <_balance+0x54>\r
+ 11a67: 83 7d f0 1f cmpl $0x1f,0xfffffff0(%ebp)\r
+ 11a6b: 7f 02 jg 11a6f <_balance+0x85>\r
+ 11a6d: eb 06 jmp 11a75 <_balance+0x8b>\r
+ 11a6f: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 11a72: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 11a75: 8d 45 f8 lea 0xfffffff8(%ebp),%eax\r
+ 11a78: ff 00 incl (%eax)\r
+ 11a7a: eb 90 jmp 11a0c <_balance+0x22>\r
+ 11a7c: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 11a7f: 83 c4 0c add $0xc,%esp\r
+ 11a82: 5b pop %ebx\r
+ 11a83: 5d pop %ebp\r
+ 11a84: c3 ret \r
+\r
+00011a85 <_periodic_link>:\r
+ 11a85: 55 push %ebp\r
+ 11a86: 89 e5 mov %esp,%ebp\r
+ 11a88: 56 push %esi\r
+ 11a89: 53 push %ebx\r
+ 11a8a: 83 ec 10 sub $0x10,%esp\r
+ 11a8d: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11a90: 8a 40 2a mov 0x2a(%eax),%al\r
+ 11a93: 25 ff 00 00 00 and $0xff,%eax\r
+ 11a98: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 11a9b: 83 7d f4 1f cmpl $0x1f,0xfffffff4(%ebp)\r
+ 11a9f: 0f 87 d8 00 00 00 ja 11b7d <_periodic_link+0xf8>\r
+ 11aa5: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 11aa8: c1 e0 02 shl $0x2,%eax\r
+ 11aab: 03 45 08 add 0x8(%ebp),%eax\r
+ 11aae: 83 c0 1c add $0x1c,%eax\r
+ 11ab1: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 11ab4: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11ab7: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 11aba: c1 e0 02 shl $0x2,%eax\r
+ 11abd: 03 42 08 add 0x8(%edx),%eax\r
+ 11ac0: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 11ac3: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 11ac6: 8b 00 mov (%eax),%eax\r
+ 11ac8: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 11acb: 83 7d e8 00 cmpl $0x0,0xffffffe8(%ebp)\r
+ 11acf: 74 36 je 11b07 <_periodic_link+0x82>\r
+ 11ad1: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11ad4: 3b 45 e8 cmp 0xffffffe8(%ebp),%eax\r
+ 11ad7: 74 2e je 11b07 <_periodic_link+0x82>\r
+ 11ad9: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11adc: 8b 55 e8 mov 0xffffffe8(%ebp),%edx\r
+ 11adf: 66 8b 40 2c mov 0x2c(%eax),%ax\r
+ 11ae3: 66 3b 42 2c cmp 0x2c(%edx),%ax\r
+ 11ae7: 76 02 jbe 11aeb <_periodic_link+0x66>\r
+ 11ae9: eb 1c jmp 11b07 <_periodic_link+0x82>\r
+ 11aeb: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 11aee: 83 c0 18 add $0x18,%eax\r
+ 11af1: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 11af4: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 11af7: 83 c0 0c add $0xc,%eax\r
+ 11afa: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 11afd: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 11b00: 8b 00 mov (%eax),%eax\r
+ 11b02: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 11b05: eb c4 jmp 11acb <_periodic_link+0x46>\r
+ 11b07: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11b0a: 3b 45 e8 cmp 0xffffffe8(%ebp),%eax\r
+ 11b0d: 74 2f je 11b3e <_periodic_link+0xb9>\r
+ 11b0f: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 11b12: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 11b15: 89 42 18 mov %eax,0x18(%edx)\r
+ 11b18: 83 7d e8 00 cmpl $0x0,0xffffffe8(%ebp)\r
+ 11b1c: 74 0b je 11b29 <_periodic_link+0xa4>\r
+ 11b1e: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11b21: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 11b24: 8b 12 mov (%edx),%edx\r
+ 11b26: 89 50 0c mov %edx,0xc(%eax)\r
+ 11b29: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 11b2c: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11b2f: 89 02 mov %eax,(%edx)\r
+ 11b31: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 11b34: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11b37: 83 c0 10 add $0x10,%eax\r
+ 11b3a: 8b 00 mov (%eax),%eax\r
+ 11b3c: 89 02 mov %eax,(%edx)\r
+ 11b3e: 8b 5d 08 mov 0x8(%ebp),%ebx\r
+ 11b41: 8b 75 f4 mov 0xfffffff4(%ebp),%esi\r
+ 11b44: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11b47: 8b 4d f4 mov 0xfffffff4(%ebp),%ecx\r
+ 11b4a: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11b4d: 66 8b 40 2e mov 0x2e(%eax),%ax\r
+ 11b51: 25 ff ff 00 00 and $0xffff,%eax\r
+ 11b56: 03 84 8a ac 01 00 00 add 0x1ac(%edx,%ecx,4),%eax\r
+ 11b5d: 89 84 b3 ac 01 00 00 mov %eax,0x1ac(%ebx,%esi,4)\r
+ 11b64: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11b67: 66 8b 40 2c mov 0x2c(%eax),%ax\r
+ 11b6b: 89 c2 mov %eax,%edx\r
+ 11b6d: 81 e2 ff ff 00 00 and $0xffff,%edx\r
+ 11b73: 8d 45 f4 lea 0xfffffff4(%ebp),%eax\r
+ 11b76: 01 10 add %edx,(%eax)\r
+ 11b78: e9 1e ff ff ff jmp 11a9b <_periodic_link+0x16>\r
+ 11b7d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11b80: 05 34 02 00 00 add $0x234,%eax\r
+ 11b85: 50 push %eax\r
+ 11b86: e8 f0 fa ff ff call 1167b <_hcd_to_bus>\r
+ 11b8b: 83 c4 04 add $0x4,%esp\r
+ 11b8e: 89 c3 mov %eax,%ebx\r
+ 11b90: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11b93: 8b 4d 0c mov 0xc(%ebp),%ecx\r
+ 11b96: 66 8b 40 2e mov 0x2e(%eax),%ax\r
+ 11b9a: ba 00 00 00 00 mov $0x0,%edx\r
+ 11b9f: 66 f7 71 2c divw 0x2c(%ecx)\r
+ 11ba3: 25 ff ff 00 00 and $0xffff,%eax\r
+ 11ba8: 01 43 34 add %eax,0x34(%ebx)\r
+ 11bab: 8d 65 f8 lea 0xfffffff8(%ebp),%esp\r
+ 11bae: 5b pop %ebx\r
+ 11baf: 5e pop %esi\r
+ 11bb0: 5d pop %ebp\r
+ 11bb1: c3 ret \r
+\r
+00011bb2 <_ed_schedule>:\r
+ 11bb2: 55 push %ebp\r
+ 11bb3: 89 e5 mov %esp,%ebp\r
+ 11bb5: 83 ec 0c sub $0xc,%esp\r
+ 11bb8: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11bbb: c6 40 28 02 movb $0x2,0x28(%eax)\r
+ 11bbf: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11bc2: c7 40 1c 00 00 00 00 movl $0x0,0x1c(%eax)\r
+ 11bc9: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11bcc: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)\r
+ 11bd3: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11bd6: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)\r
+ 11bdd: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11be0: ba 00 00 00 00 mov $0x0,%edx\r
+ 11be5: 8a 50 29 mov 0x29(%eax),%dl\r
+ 11be8: 89 55 f4 mov %edx,0xfffffff4(%ebp)\r
+ 11beb: 83 7d f4 02 cmpl $0x2,0xfffffff4(%ebp)\r
+ 11bef: 74 0f je 11c00 <_ed_schedule+0x4e>\r
+ 11bf1: 83 7d f4 03 cmpl $0x3,0xfffffff4(%ebp)\r
+ 11bf5: 0f 84 a0 00 00 00 je 11c9b <_ed_schedule+0xe9>\r
+ 11bfb: e9 33 01 00 00 jmp 11d33 <_ed_schedule+0x181>\r
+ 11c00: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11c03: 83 78 18 00 cmpl $0x0,0x18(%eax)\r
+ 11c07: 75 13 jne 11c1c <_ed_schedule+0x6a>\r
+ 11c09: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11c0c: 8b 50 04 mov 0x4(%eax),%edx\r
+ 11c0f: 83 c2 20 add $0x20,%edx\r
+ 11c12: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11c15: 8b 40 10 mov 0x10(%eax),%eax\r
+ 11c18: 89 02 mov %eax,(%edx)\r
+ 11c1a: eb 1b jmp 11c37 <_ed_schedule+0x85>\r
+ 11c1c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11c1f: 8b 50 18 mov 0x18(%eax),%edx\r
+ 11c22: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11c25: 89 42 18 mov %eax,0x18(%edx)\r
+ 11c28: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11c2b: 8b 50 18 mov 0x18(%eax),%edx\r
+ 11c2e: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11c31: 8b 40 10 mov 0x10(%eax),%eax\r
+ 11c34: 89 42 0c mov %eax,0xc(%edx)\r
+ 11c37: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 11c3a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11c3d: 8b 40 18 mov 0x18(%eax),%eax\r
+ 11c40: 89 42 1c mov %eax,0x1c(%edx)\r
+ 11c43: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11c46: 83 78 18 00 cmpl $0x0,0x18(%eax)\r
+ 11c4a: 75 41 jne 11c8d <_ed_schedule+0xdb>\r
+ 11c4c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11c4f: 83 78 10 00 cmpl $0x0,0x10(%eax)\r
+ 11c53: 75 38 jne 11c8d <_ed_schedule+0xdb>\r
+ 11c55: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11c58: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11c5b: 8b 80 2c 02 00 00 mov 0x22c(%eax),%eax\r
+ 11c61: 83 c8 10 or $0x10,%eax\r
+ 11c64: 89 82 2c 02 00 00 mov %eax,0x22c(%edx)\r
+ 11c6a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11c6d: 8b 40 04 mov 0x4(%eax),%eax\r
+ 11c70: 83 c0 24 add $0x24,%eax\r
+ 11c73: c7 00 00 00 00 00 movl $0x0,(%eax)\r
+ 11c79: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11c7c: 8b 50 04 mov 0x4(%eax),%edx\r
+ 11c7f: 83 c2 04 add $0x4,%edx\r
+ 11c82: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11c85: 8b 80 2c 02 00 00 mov 0x22c(%eax),%eax\r
+ 11c8b: 89 02 mov %eax,(%edx)\r
+ 11c8d: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11c90: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11c93: 89 42 18 mov %eax,0x18(%edx)\r
+ 11c96: e9 e5 00 00 00 jmp 11d80 <_ed_schedule+0x1ce>\r
+ 11c9b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11c9e: 83 78 14 00 cmpl $0x0,0x14(%eax)\r
+ 11ca2: 75 13 jne 11cb7 <_ed_schedule+0x105>\r
+ 11ca4: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11ca7: 8b 50 04 mov 0x4(%eax),%edx\r
+ 11caa: 83 c2 28 add $0x28,%edx\r
+ 11cad: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11cb0: 8b 40 10 mov 0x10(%eax),%eax\r
+ 11cb3: 89 02 mov %eax,(%edx)\r
+ 11cb5: eb 1b jmp 11cd2 <_ed_schedule+0x120>\r
+ 11cb7: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11cba: 8b 50 14 mov 0x14(%eax),%edx\r
+ 11cbd: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11cc0: 89 42 18 mov %eax,0x18(%edx)\r
+ 11cc3: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11cc6: 8b 50 14 mov 0x14(%eax),%edx\r
+ 11cc9: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11ccc: 8b 40 10 mov 0x10(%eax),%eax\r
+ 11ccf: 89 42 0c mov %eax,0xc(%edx)\r
+ 11cd2: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 11cd5: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11cd8: 8b 40 14 mov 0x14(%eax),%eax\r
+ 11cdb: 89 42 1c mov %eax,0x1c(%edx)\r
+ 11cde: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11ce1: 83 78 14 00 cmpl $0x0,0x14(%eax)\r
+ 11ce5: 75 41 jne 11d28 <_ed_schedule+0x176>\r
+ 11ce7: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11cea: 83 78 10 00 cmpl $0x0,0x10(%eax)\r
+ 11cee: 75 38 jne 11d28 <_ed_schedule+0x176>\r
+ 11cf0: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11cf3: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11cf6: 8b 80 2c 02 00 00 mov 0x22c(%eax),%eax\r
+ 11cfc: 83 c8 20 or $0x20,%eax\r
+ 11cff: 89 82 2c 02 00 00 mov %eax,0x22c(%edx)\r
+ 11d05: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11d08: 8b 40 04 mov 0x4(%eax),%eax\r
+ 11d0b: 83 c0 2c add $0x2c,%eax\r
+ 11d0e: c7 00 00 00 00 00 movl $0x0,(%eax)\r
+ 11d14: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11d17: 8b 50 04 mov 0x4(%eax),%edx\r
+ 11d1a: 83 c2 04 add $0x4,%edx\r
+ 11d1d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11d20: 8b 80 2c 02 00 00 mov 0x22c(%eax),%eax\r
+ 11d26: 89 02 mov %eax,(%edx)\r
+ 11d28: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11d2b: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11d2e: 89 42 14 mov %eax,0x14(%edx)\r
+ 11d31: eb 4d jmp 11d80 <_ed_schedule+0x1ce>\r
+ 11d33: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11d36: 66 8b 40 2e mov 0x2e(%eax),%ax\r
+ 11d3a: 25 ff ff 00 00 and $0xffff,%eax\r
+ 11d3f: 50 push %eax\r
+ 11d40: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11d43: 66 8b 40 2c mov 0x2c(%eax),%ax\r
+ 11d47: 25 ff ff 00 00 and $0xffff,%eax\r
+ 11d4c: 50 push %eax\r
+ 11d4d: ff 75 08 pushl 0x8(%ebp)\r
+ 11d50: e8 95 fc ff ff call 119ea <_balance>\r
+ 11d55: 83 c4 0c add $0xc,%esp\r
+ 11d58: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 11d5b: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 11d5f: 79 08 jns 11d69 <_ed_schedule+0x1b7>\r
+ 11d61: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 11d64: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 11d67: eb 1e jmp 11d87 <_ed_schedule+0x1d5>\r
+ 11d69: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 11d6c: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 11d6f: 88 42 2a mov %al,0x2a(%edx)\r
+ 11d72: ff 75 0c pushl 0xc(%ebp)\r
+ 11d75: ff 75 08 pushl 0x8(%ebp)\r
+ 11d78: e8 08 fd ff ff call 11a85 <_periodic_link>\r
+ 11d7d: 83 c4 08 add $0x8,%esp\r
+ 11d80: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 11d87: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 11d8a: c9 leave \r
+ 11d8b: c3 ret \r
+\r
+00011d8c <_periodic_unlink>:\r
+ 11d8c: 55 push %ebp\r
+ 11d8d: 89 e5 mov %esp,%ebp\r
+ 11d8f: 57 push %edi\r
+ 11d90: 56 push %esi\r
+ 11d91: 53 push %ebx\r
+ 11d92: 83 ec 10 sub $0x10,%esp\r
+ 11d95: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11d98: 8a 40 2a mov 0x2a(%eax),%al\r
+ 11d9b: 25 ff 00 00 00 and $0xff,%eax\r
+ 11da0: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 11da3: 83 7d f0 1f cmpl $0x1f,0xfffffff0(%ebp)\r
+ 11da7: 0f 8f a9 00 00 00 jg 11e56 <_periodic_unlink+0xca>\r
+ 11dad: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 11db0: c1 e0 02 shl $0x2,%eax\r
+ 11db3: 03 45 08 add 0x8(%ebp),%eax\r
+ 11db6: 83 c0 1c add $0x1c,%eax\r
+ 11db9: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 11dbc: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11dbf: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 11dc2: c1 e0 02 shl $0x2,%eax\r
+ 11dc5: 03 42 08 add 0x8(%edx),%eax\r
+ 11dc8: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 11dcb: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 11dce: 83 38 00 cmpl $0x0,(%eax)\r
+ 11dd1: 74 21 je 11df4 <_periodic_unlink+0x68>\r
+ 11dd3: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 11dd6: 8b 00 mov (%eax),%eax\r
+ 11dd8: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 11ddb: 3b 45 0c cmp 0xc(%ebp),%eax\r
+ 11dde: 74 14 je 11df4 <_periodic_unlink+0x68>\r
+ 11de0: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 11de3: 83 c0 0c add $0xc,%eax\r
+ 11de6: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 11de9: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 11dec: 83 c0 18 add $0x18,%eax\r
+ 11def: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 11df2: eb d7 jmp 11dcb <_periodic_unlink+0x3f>\r
+ 11df4: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 11df7: 83 38 00 cmpl $0x0,(%eax)\r
+ 11dfa: 74 16 je 11e12 <_periodic_unlink+0x86>\r
+ 11dfc: 8b 55 e4 mov 0xffffffe4(%ebp),%edx\r
+ 11dff: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11e02: 8b 40 0c mov 0xc(%eax),%eax\r
+ 11e05: 89 02 mov %eax,(%edx)\r
+ 11e07: 8b 55 e8 mov 0xffffffe8(%ebp),%edx\r
+ 11e0a: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11e0d: 8b 40 18 mov 0x18(%eax),%eax\r
+ 11e10: 89 02 mov %eax,(%edx)\r
+ 11e12: 8b 75 08 mov 0x8(%ebp),%esi\r
+ 11e15: 8b 7d f0 mov 0xfffffff0(%ebp),%edi\r
+ 11e18: 8b 4d 08 mov 0x8(%ebp),%ecx\r
+ 11e1b: 8b 5d f0 mov 0xfffffff0(%ebp),%ebx\r
+ 11e1e: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11e21: 66 8b 40 2e mov 0x2e(%eax),%ax\r
+ 11e25: 89 c2 mov %eax,%edx\r
+ 11e27: 81 e2 ff ff 00 00 and $0xffff,%edx\r
+ 11e2d: 8b 84 99 ac 01 00 00 mov 0x1ac(%ecx,%ebx,4),%eax\r
+ 11e34: 29 d0 sub %edx,%eax\r
+ 11e36: 89 84 be ac 01 00 00 mov %eax,0x1ac(%esi,%edi,4)\r
+ 11e3d: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11e40: 66 8b 40 2c mov 0x2c(%eax),%ax\r
+ 11e44: 89 c2 mov %eax,%edx\r
+ 11e46: 81 e2 ff ff 00 00 and $0xffff,%edx\r
+ 11e4c: 8d 45 f0 lea 0xfffffff0(%ebp),%eax\r
+ 11e4f: 01 10 add %edx,(%eax)\r
+ 11e51: e9 4d ff ff ff jmp 11da3 <_periodic_unlink+0x17>\r
+ 11e56: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11e59: 05 34 02 00 00 add $0x234,%eax\r
+ 11e5e: 50 push %eax\r
+ 11e5f: e8 17 f8 ff ff call 1167b <_hcd_to_bus>\r
+ 11e64: 83 c4 04 add $0x4,%esp\r
+ 11e67: 89 c3 mov %eax,%ebx\r
+ 11e69: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11e6c: 8b 4d 0c mov 0xc(%ebp),%ecx\r
+ 11e6f: 66 8b 40 2e mov 0x2e(%eax),%ax\r
+ 11e73: ba 00 00 00 00 mov $0x0,%edx\r
+ 11e78: 66 f7 71 2c divw 0x2c(%ecx)\r
+ 11e7c: 25 ff ff 00 00 and $0xffff,%eax\r
+ 11e81: 29 43 34 sub %eax,0x34(%ebx)\r
+ 11e84: 8d 65 f4 lea 0xfffffff4(%ebp),%esp\r
+ 11e87: 5b pop %ebx\r
+ 11e88: 5e pop %esi\r
+ 11e89: 5f pop %edi\r
+ 11e8a: 5d pop %ebp\r
+ 11e8b: c3 ret \r
+\r
+00011e8c <_ed_deschedule>:\r
+ 11e8c: 55 push %ebp\r
+ 11e8d: 89 e5 mov %esp,%ebp\r
+ 11e8f: 83 ec 04 sub $0x4,%esp\r
+ 11e92: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 11e95: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11e98: 8b 00 mov (%eax),%eax\r
+ 11e9a: 80 cc 40 or $0x40,%ah\r
+ 11e9d: 89 02 mov %eax,(%edx)\r
+ 11e9f: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11ea2: ba 00 00 00 00 mov $0x0,%edx\r
+ 11ea7: 8a 50 29 mov 0x29(%eax),%dl\r
+ 11eaa: 89 55 fc mov %edx,0xfffffffc(%ebp)\r
+ 11ead: 83 7d fc 02 cmpl $0x2,0xfffffffc(%ebp)\r
+ 11eb1: 74 0f je 11ec2 <_ed_deschedule+0x36>\r
+ 11eb3: 83 7d fc 03 cmpl $0x3,0xfffffffc(%ebp)\r
+ 11eb7: 0f 84 e4 00 00 00 je 11fa1 <_ed_deschedule+0x115>\r
+ 11ebd: e9 b0 01 00 00 jmp 12072 <_ed_deschedule+0x1e6>\r
+ 11ec2: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11ec5: 83 78 1c 00 cmpl $0x0,0x1c(%eax)\r
+ 11ec9: 75 61 jne 11f2c <_ed_deschedule+0xa0>\r
+ 11ecb: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11ece: 83 78 0c 00 cmpl $0x0,0xc(%eax)\r
+ 11ed2: 75 43 jne 11f17 <_ed_deschedule+0x8b>\r
+ 11ed4: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11ed7: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11eda: 8b 80 2c 02 00 00 mov 0x22c(%eax),%eax\r
+ 11ee0: 83 e0 ef and $0xffffffef,%eax\r
+ 11ee3: 89 82 2c 02 00 00 mov %eax,0x22c(%edx)\r
+ 11ee9: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11eec: 8b 50 04 mov 0x4(%eax),%edx\r
+ 11eef: 83 c2 04 add $0x4,%edx\r
+ 11ef2: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11ef5: 8b 80 2c 02 00 00 mov 0x22c(%eax),%eax\r
+ 11efb: 89 02 mov %eax,(%edx)\r
+ 11efd: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11f00: 8b 40 04 mov 0x4(%eax),%eax\r
+ 11f03: 83 c0 24 add $0x24,%eax\r
+ 11f06: c7 00 00 00 00 00 movl $0x0,(%eax)\r
+ 11f0c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11f0f: 8b 40 04 mov 0x4(%eax),%eax\r
+ 11f12: 83 c0 04 add $0x4,%eax\r
+ 11f15: 8b 00 mov (%eax),%eax\r
+ 11f17: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11f1a: 8b 50 04 mov 0x4(%eax),%edx\r
+ 11f1d: 83 c2 20 add $0x20,%edx\r
+ 11f20: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11f23: 83 c0 0c add $0xc,%eax\r
+ 11f26: 8b 00 mov (%eax),%eax\r
+ 11f28: 89 02 mov %eax,(%edx)\r
+ 11f2a: eb 1e jmp 11f4a <_ed_deschedule+0xbe>\r
+ 11f2c: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11f2f: 8b 50 1c mov 0x1c(%eax),%edx\r
+ 11f32: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11f35: 8b 40 18 mov 0x18(%eax),%eax\r
+ 11f38: 89 42 18 mov %eax,0x18(%edx)\r
+ 11f3b: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11f3e: 8b 50 1c mov 0x1c(%eax),%edx\r
+ 11f41: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11f44: 8b 40 0c mov 0xc(%eax),%eax\r
+ 11f47: 89 42 0c mov %eax,0xc(%edx)\r
+ 11f4a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11f4d: 8b 40 18 mov 0x18(%eax),%eax\r
+ 11f50: 3b 45 0c cmp 0xc(%ebp),%eax\r
+ 11f53: 75 2b jne 11f80 <_ed_deschedule+0xf4>\r
+ 11f55: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11f58: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11f5b: 8b 40 1c mov 0x1c(%eax),%eax\r
+ 11f5e: 89 42 18 mov %eax,0x18(%edx)\r
+ 11f61: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11f64: 83 78 18 00 cmpl $0x0,0x18(%eax)\r
+ 11f68: 0f 84 12 01 00 00 je 12080 <_ed_deschedule+0x1f4>\r
+ 11f6e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11f71: 8b 40 18 mov 0x18(%eax),%eax\r
+ 11f74: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)\r
+ 11f7b: e9 00 01 00 00 jmp 12080 <_ed_deschedule+0x1f4>\r
+ 11f80: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11f83: 83 78 18 00 cmpl $0x0,0x18(%eax)\r
+ 11f87: 0f 84 f3 00 00 00 je 12080 <_ed_deschedule+0x1f4>\r
+ 11f8d: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11f90: 8b 50 18 mov 0x18(%eax),%edx\r
+ 11f93: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11f96: 8b 40 1c mov 0x1c(%eax),%eax\r
+ 11f99: 89 42 1c mov %eax,0x1c(%edx)\r
+ 11f9c: e9 df 00 00 00 jmp 12080 <_ed_deschedule+0x1f4>\r
+ 11fa1: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11fa4: 83 78 1c 00 cmpl $0x0,0x1c(%eax)\r
+ 11fa8: 75 61 jne 1200b <_ed_deschedule+0x17f>\r
+ 11faa: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 11fad: 83 78 0c 00 cmpl $0x0,0xc(%eax)\r
+ 11fb1: 75 43 jne 11ff6 <_ed_deschedule+0x16a>\r
+ 11fb3: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 11fb6: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11fb9: 8b 80 2c 02 00 00 mov 0x22c(%eax),%eax\r
+ 11fbf: 83 e0 df and $0xffffffdf,%eax\r
+ 11fc2: 89 82 2c 02 00 00 mov %eax,0x22c(%edx)\r
+ 11fc8: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11fcb: 8b 50 04 mov 0x4(%eax),%edx\r
+ 11fce: 83 c2 04 add $0x4,%edx\r
+ 11fd1: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11fd4: 8b 80 2c 02 00 00 mov 0x22c(%eax),%eax\r
+ 11fda: 89 02 mov %eax,(%edx)\r
+ 11fdc: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11fdf: 8b 40 04 mov 0x4(%eax),%eax\r
+ 11fe2: 83 c0 2c add $0x2c,%eax\r
+ 11fe5: c7 00 00 00 00 00 movl $0x0,(%eax)\r
+ 11feb: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11fee: 8b 40 04 mov 0x4(%eax),%eax\r
+ 11ff1: 83 c0 04 add $0x4,%eax\r
+ 11ff4: 8b 00 mov (%eax),%eax\r
+ 11ff6: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 11ff9: 8b 50 04 mov 0x4(%eax),%edx\r
+ 11ffc: 83 c2 28 add $0x28,%edx\r
+ 11fff: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12002: 83 c0 0c add $0xc,%eax\r
+ 12005: 8b 00 mov (%eax),%eax\r
+ 12007: 89 02 mov %eax,(%edx)\r
+ 12009: eb 1e jmp 12029 <_ed_deschedule+0x19d>\r
+ 1200b: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1200e: 8b 50 1c mov 0x1c(%eax),%edx\r
+ 12011: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12014: 8b 40 18 mov 0x18(%eax),%eax\r
+ 12017: 89 42 18 mov %eax,0x18(%edx)\r
+ 1201a: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1201d: 8b 50 1c mov 0x1c(%eax),%edx\r
+ 12020: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12023: 8b 40 0c mov 0xc(%eax),%eax\r
+ 12026: 89 42 0c mov %eax,0xc(%edx)\r
+ 12029: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1202c: 8b 40 14 mov 0x14(%eax),%eax\r
+ 1202f: 3b 45 0c cmp 0xc(%ebp),%eax\r
+ 12032: 75 24 jne 12058 <_ed_deschedule+0x1cc>\r
+ 12034: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 12037: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1203a: 8b 40 1c mov 0x1c(%eax),%eax\r
+ 1203d: 89 42 14 mov %eax,0x14(%edx)\r
+ 12040: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12043: 83 78 14 00 cmpl $0x0,0x14(%eax)\r
+ 12047: 74 37 je 12080 <_ed_deschedule+0x1f4>\r
+ 12049: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1204c: 8b 40 14 mov 0x14(%eax),%eax\r
+ 1204f: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)\r
+ 12056: eb 28 jmp 12080 <_ed_deschedule+0x1f4>\r
+ 12058: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1205b: 83 78 18 00 cmpl $0x0,0x18(%eax)\r
+ 1205f: 74 1f je 12080 <_ed_deschedule+0x1f4>\r
+ 12061: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12064: 8b 50 18 mov 0x18(%eax),%edx\r
+ 12067: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1206a: 8b 40 1c mov 0x1c(%eax),%eax\r
+ 1206d: 89 42 1c mov %eax,0x1c(%edx)\r
+ 12070: eb 0e jmp 12080 <_ed_deschedule+0x1f4>\r
+ 12072: ff 75 0c pushl 0xc(%ebp)\r
+ 12075: ff 75 08 pushl 0x8(%ebp)\r
+ 12078: e8 0f fd ff ff call 11d8c <_periodic_unlink>\r
+ 1207d: 83 c4 08 add $0x8,%esp\r
+ 12080: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12083: 80 78 28 02 cmpb $0x2,0x28(%eax)\r
+ 12087: 75 25 jne 120ae <_ed_deschedule+0x222>\r
+ 12089: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1208c: c6 40 28 00 movb $0x0,0x28(%eax)\r
+ 12090: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 12093: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12096: 8b 00 mov (%eax),%eax\r
+ 12098: 25 ff bf ff f7 and $0xf7ffbfff,%eax\r
+ 1209d: 89 02 mov %eax,(%edx)\r
+ 1209f: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 120a2: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 120a5: 8b 40 08 mov 0x8(%eax),%eax\r
+ 120a8: 83 e0 fe and $0xfffffffe,%eax\r
+ 120ab: 89 42 08 mov %eax,0x8(%edx)\r
+ 120ae: c9 leave \r
+ 120af: c3 ret \r
+\r
+000120b0 <_ed_get>:\r
+ 120b0: 55 push %ebp\r
+ 120b1: 89 e5 mov %esp,%ebp\r
+ 120b3: 83 ec 38 sub $0x38,%esp\r
+ 120b6: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 120b9: c1 e8 07 shr $0x7,%eax\r
+ 120bc: 83 f0 01 xor $0x1,%eax\r
+ 120bf: 83 e0 01 and $0x1,%eax\r
+ 120c2: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 120c5: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 120c8: c1 e8 1e shr $0x1e,%eax\r
+ 120cb: 83 e0 03 and $0x3,%eax\r
+ 120ce: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 120d1: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 120d4: 8b 80 98 01 00 00 mov 0x198(%eax),%eax\r
+ 120da: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 120dd: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 120e0: c1 e8 0f shr $0xf,%eax\r
+ 120e3: 83 e0 0f and $0xf,%eax\r
+ 120e6: 01 c0 add %eax,%eax\r
+ 120e8: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 120eb: 83 7d f8 02 cmpl $0x2,0xfffffff8(%ebp)\r
+ 120ef: 74 0c je 120fd <_ed_get+0x4d>\r
+ 120f1: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 120f5: 74 06 je 120fd <_ed_get+0x4d>\r
+ 120f7: 8d 45 ec lea 0xffffffec(%ebp),%eax\r
+ 120fa: 83 08 01 orl $0x1,(%eax)\r
+ 120fd: c7 45 e8 00 00 00 00 movl $0x0,0xffffffe8(%ebp)\r
+ 12104: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 12107: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 1210a: 8b 44 90 10 mov 0x10(%eax,%edx,4),%eax\r
+ 1210e: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 12111: 85 c0 test %eax,%eax\r
+ 12113: 0f 85 92 00 00 00 jne 121ab <_ed_get+0xfb>\r
+ 12119: 83 ec 08 sub $0x8,%esp\r
+ 1211c: 6a 00 push $0x0\r
+ 1211e: ff 75 08 pushl 0x8(%ebp)\r
+ 12121: e8 3e f7 ff ff call 11864 <_ed_alloc>\r
+ 12126: 83 c4 10 add $0x10,%esp\r
+ 12129: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 1212c: 83 7d f0 00 cmpl $0x0,0xfffffff0(%ebp)\r
+ 12130: 75 05 jne 12137 <_ed_get+0x87>\r
+ 12132: e9 d0 01 00 00 jmp 12307 <_ed_get+0x257>\r
+ 12137: 8b 4d f4 mov 0xfffffff4(%ebp),%ecx\r
+ 1213a: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 1213d: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 12140: 89 44 91 10 mov %eax,0x10(%ecx,%edx,4)\r
+ 12144: 83 ec 08 sub $0x8,%esp\r
+ 12147: 6a 00 push $0x0\r
+ 12149: ff 75 08 pushl 0x8(%ebp)\r
+ 1214c: e8 30 f6 ff ff call 11781 <_td_alloc>\r
+ 12151: 83 c4 10 add $0x10,%esp\r
+ 12154: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 12157: 83 7d e4 00 cmpl $0x0,0xffffffe4(%ebp)\r
+ 1215b: 75 1d jne 1217a <_ed_get+0xca>\r
+ 1215d: 83 ec 08 sub $0x8,%esp\r
+ 12160: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 12163: ff 75 08 pushl 0x8(%ebp)\r
+ 12166: e8 60 f7 ff ff call 118cb <_ed_free>\r
+ 1216b: 83 c4 10 add $0x10,%esp\r
+ 1216e: c7 45 f0 00 00 00 00 movl $0x0,0xfffffff0(%ebp)\r
+ 12175: e9 8d 01 00 00 jmp 12307 <_ed_get+0x257>\r
+ 1217a: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 1217d: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 12180: 89 42 14 mov %eax,0x14(%edx)\r
+ 12183: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 12186: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 12189: 8b 40 24 mov 0x24(%eax),%eax\r
+ 1218c: 89 42 04 mov %eax,0x4(%edx)\r
+ 1218f: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 12192: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 12195: 8b 40 04 mov 0x4(%eax),%eax\r
+ 12198: 89 42 08 mov %eax,0x8(%edx)\r
+ 1219b: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 1219e: c6 40 28 00 movb $0x0,0x28(%eax)\r
+ 121a2: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 121a5: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 121a8: 88 42 29 mov %al,0x29(%edx)\r
+ 121ab: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 121ae: 80 78 28 00 cmpb $0x0,0x28(%eax)\r
+ 121b2: 0f 85 4f 01 00 00 jne 12307 <_ed_get+0x257>\r
+ 121b8: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 121bb: c1 e8 08 shr $0x8,%eax\r
+ 121be: 83 e0 7f and $0x7f,%eax\r
+ 121c1: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 121c4: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 121c7: d1 e8 shr %eax\r
+ 121c9: 89 c2 mov %eax,%edx\r
+ 121cb: c1 e2 07 shl $0x7,%edx\r
+ 121ce: 8d 45 e4 lea 0xffffffe4(%ebp),%eax\r
+ 121d1: 09 10 or %edx,(%eax)\r
+ 121d3: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 121d7: 74 1e je 121f7 <_ed_get+0x147>\r
+ 121d9: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 121dc: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 121df: c1 e8 0f shr $0xf,%eax\r
+ 121e2: 83 e0 0f and $0xf,%eax\r
+ 121e5: 8b 44 82 78 mov 0x78(%edx,%eax,4),%eax\r
+ 121e9: c1 e0 10 shl $0x10,%eax\r
+ 121ec: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 121ef: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 121f2: 09 45 e0 or %eax,0xffffffe0(%ebp)\r
+ 121f5: eb 1c jmp 12213 <_ed_get+0x163>\r
+ 121f7: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 121fa: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 121fd: c1 e8 0f shr $0xf,%eax\r
+ 12200: 83 e0 0f and $0xf,%eax\r
+ 12203: 8b 44 82 38 mov 0x38(%edx,%eax,4),%eax\r
+ 12207: c1 e0 10 shl $0x10,%eax\r
+ 1220a: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 1220d: 8b 55 e4 mov 0xffffffe4(%ebp),%edx\r
+ 12210: 09 55 e0 or %edx,0xffffffe0(%ebp)\r
+ 12213: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 12216: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 12219: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1221c: 83 78 18 01 cmpl $0x1,0x18(%eax)\r
+ 12220: 75 09 jne 1222b <_ed_get+0x17b>\r
+ 12222: 8d 45 e4 lea 0xffffffe4(%ebp),%eax\r
+ 12225: 81 08 00 20 00 00 orl $0x2000,(%eax)\r
+ 1222b: 83 7d f8 02 cmpl $0x2,0xfffffff8(%ebp)\r
+ 1222f: 0f 84 ca 00 00 00 je 122ff <_ed_get+0x24f>\r
+ 12235: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 12239: 74 0b je 12246 <_ed_get+0x196>\r
+ 1223b: 8b 55 e4 mov 0xffffffe4(%ebp),%edx\r
+ 1223e: 80 ce 08 or $0x8,%dh\r
+ 12241: 89 55 dc mov %edx,0xffffffdc(%ebp)\r
+ 12244: eb 09 jmp 1224f <_ed_get+0x19f>\r
+ 12246: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 12249: 80 cc 10 or $0x10,%ah\r
+ 1224c: 89 45 dc mov %eax,0xffffffdc(%ebp)\r
+ 1224f: 8b 55 dc mov 0xffffffdc(%ebp),%edx\r
+ 12252: 89 55 e4 mov %edx,0xffffffe4(%ebp)\r
+ 12255: 83 7d f8 03 cmpl $0x3,0xfffffff8(%ebp)\r
+ 12259: 0f 84 a0 00 00 00 je 122ff <_ed_get+0x24f>\r
+ 1225f: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 12263: 75 0b jne 12270 <_ed_get+0x1c0>\r
+ 12265: 8d 45 e4 lea 0xffffffe4(%ebp),%eax\r
+ 12268: 81 08 00 80 00 00 orl $0x8000,(%eax)\r
+ 1226e: eb 0d jmp 1227d <_ed_get+0x1cd>\r
+ 12270: 83 7d 14 20 cmpl $0x20,0x14(%ebp)\r
+ 12274: 7e 07 jle 1227d <_ed_get+0x1cd>\r
+ 12276: c7 45 14 20 00 00 00 movl $0x20,0x14(%ebp)\r
+ 1227d: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 12280: 8b 45 14 mov 0x14(%ebp),%eax\r
+ 12283: 66 89 42 2c mov %ax,0x2c(%edx)\r
+ 12287: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 1228a: 89 45 d8 mov %eax,0xffffffd8(%ebp)\r
+ 1228d: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 12291: 74 15 je 122a8 <_ed_get+0x1f8>\r
+ 12293: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 12296: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 12299: c1 e8 0f shr $0xf,%eax\r
+ 1229c: 83 e0 0f and $0xf,%eax\r
+ 1229f: 8b 44 82 78 mov 0x78(%edx,%eax,4),%eax\r
+ 122a3: 89 45 d4 mov %eax,0xffffffd4(%ebp)\r
+ 122a6: eb 13 jmp 122bb <_ed_get+0x20b>\r
+ 122a8: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 122ab: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 122ae: c1 e8 0f shr $0xf,%eax\r
+ 122b1: 83 e0 0f and $0xf,%eax\r
+ 122b4: 8b 44 82 38 mov 0x38(%edx,%eax,4),%eax\r
+ 122b8: 89 45 d4 mov %eax,0xffffffd4(%ebp)\r
+ 122bb: ff 75 d4 pushl 0xffffffd4(%ebp)\r
+ 122be: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 122c2: 0f 94 c0 sete %al\r
+ 122c5: 25 ff 00 00 00 and $0xff,%eax\r
+ 122ca: 50 push %eax\r
+ 122cb: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 122cf: 0f 94 c0 sete %al\r
+ 122d2: 25 ff 00 00 00 and $0xff,%eax\r
+ 122d7: 50 push %eax\r
+ 122d8: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 122db: ff 70 18 pushl 0x18(%eax)\r
+ 122de: e8 ed 22 00 00 call 145d0 <_usb_calc_bus_time@16>\r
+ 122e3: 89 c1 mov %eax,%ecx\r
+ 122e5: b8 d3 4d 62 10 mov $0x10624dd3,%eax\r
+ 122ea: f7 e9 imul %ecx\r
+ 122ec: c1 fa 06 sar $0x6,%edx\r
+ 122ef: 89 c8 mov %ecx,%eax\r
+ 122f1: c1 f8 1f sar $0x1f,%eax\r
+ 122f4: 29 c2 sub %eax,%edx\r
+ 122f6: 89 d0 mov %edx,%eax\r
+ 122f8: 8b 55 d8 mov 0xffffffd8(%ebp),%edx\r
+ 122fb: 66 89 42 2e mov %ax,0x2e(%edx)\r
+ 122ff: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 12302: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 12305: 89 02 mov %eax,(%edx)\r
+ 12307: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 1230a: c9 leave \r
+ 1230b: c3 ret \r
+\r
+0001230c <_start_urb_unlink>:\r
+ 1230c: 55 push %ebp\r
+ 1230d: 89 e5 mov %esp,%ebp\r
+ 1230f: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 12312: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12315: 8b 00 mov (%eax),%eax\r
+ 12317: 0d 00 00 00 08 or $0x8000000,%eax\r
+ 1231c: 89 02 mov %eax,(%edx)\r
+ 1231e: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12321: c6 40 28 01 movb $0x1,0x28(%eax)\r
+ 12325: ff 75 0c pushl 0xc(%ebp)\r
+ 12328: ff 75 08 pushl 0x8(%ebp)\r
+ 1232b: e8 5c fb ff ff call 11e8c <_ed_deschedule>\r
+ 12330: 83 c4 08 add $0x8,%esp\r
+ 12333: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 12336: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12339: 8b 40 08 mov 0x8(%eax),%eax\r
+ 1233c: 66 8b 80 80 00 00 00 mov 0x80(%eax),%ax\r
+ 12343: 40 inc %eax\r
+ 12344: 66 89 42 32 mov %ax,0x32(%edx)\r
+ 12348: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 1234b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1234e: 8b 40 10 mov 0x10(%eax),%eax\r
+ 12351: 89 42 18 mov %eax,0x18(%edx)\r
+ 12354: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12357: c7 40 1c 00 00 00 00 movl $0x0,0x1c(%eax)\r
+ 1235e: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 12361: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12364: 89 42 10 mov %eax,0x10(%edx)\r
+ 12367: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1236a: 83 b8 a8 01 00 00 00 cmpl $0x0,0x1a8(%eax)\r
+ 12371: 75 29 jne 1239c <_start_urb_unlink+0x90>\r
+ 12373: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12376: 8b 40 04 mov 0x4(%eax),%eax\r
+ 12379: 83 c0 0c add $0xc,%eax\r
+ 1237c: c7 00 04 00 00 00 movl $0x4,(%eax)\r
+ 12382: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12385: 8b 40 04 mov 0x4(%eax),%eax\r
+ 12388: 83 c0 10 add $0x10,%eax\r
+ 1238b: c7 00 04 00 00 00 movl $0x4,(%eax)\r
+ 12391: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12394: 8b 40 04 mov 0x4(%eax),%eax\r
+ 12397: 83 c0 04 add $0x4,%eax\r
+ 1239a: 8b 00 mov (%eax),%eax\r
+ 1239c: c9 leave \r
+ 1239d: c3 ret \r
+\r
+0001239e <_td_fill>:\r
+ 1239e: 55 push %ebp\r
+ 1239f: 89 e5 mov %esp,%ebp\r
+ 123a1: 83 ec 18 sub $0x18,%esp\r
+ 123a4: 8b 45 18 mov 0x18(%ebp),%eax\r
+ 123a7: 8b 40 08 mov 0x8(%eax),%eax\r
+ 123aa: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 123ad: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 123b0: 25 00 00 01 00 and $0x10000,%eax\r
+ 123b5: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 123b8: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 123bb: 66 8b 40 04 mov 0x4(%eax),%ax\r
+ 123bf: 25 ff ff 00 00 and $0xffff,%eax\r
+ 123c4: 48 dec %eax\r
+ 123c5: 3b 45 1c cmp 0x1c(%ebp),%eax\r
+ 123c8: 75 12 jne 123dc <_td_fill+0x3e>\r
+ 123ca: 8b 45 18 mov 0x18(%ebp),%eax\r
+ 123cd: 8b 40 20 mov 0x20(%eax),%eax\r
+ 123d0: c1 e8 07 shr $0x7,%eax\r
+ 123d3: 83 e0 01 and $0x1,%eax\r
+ 123d6: 85 c0 test %eax,%eax\r
+ 123d8: 75 02 jne 123dc <_td_fill+0x3e>\r
+ 123da: eb 09 jmp 123e5 <_td_fill+0x47>\r
+ 123dc: 8d 45 0c lea 0xc(%ebp),%eax\r
+ 123df: 81 08 00 00 c0 00 orl $0xc00000,(%eax)\r
+ 123e5: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 123e8: 8b 45 1c mov 0x1c(%ebp),%eax\r
+ 123eb: 8b 44 82 0c mov 0xc(%edx,%eax,4),%eax\r
+ 123ef: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 123f2: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 123f5: 8b 4d 1c mov 0x1c(%ebp),%ecx\r
+ 123f8: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 123fb: 8b 00 mov (%eax),%eax\r
+ 123fd: 8b 40 14 mov 0x14(%eax),%eax\r
+ 12400: 89 44 8a 0c mov %eax,0xc(%edx,%ecx,4)\r
+ 12404: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 12407: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 1240a: 8b 10 mov (%eax),%edx\r
+ 1240c: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1240f: 89 42 14 mov %eax,0x14(%edx)\r
+ 12412: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 12415: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 12418: 8b 00 mov (%eax),%eax\r
+ 1241a: 89 42 14 mov %eax,0x14(%edx)\r
+ 1241d: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12420: c7 40 1c 00 00 00 00 movl $0x0,0x1c(%eax)\r
+ 12427: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 1242a: 8b 45 1c mov 0x1c(%ebp),%eax\r
+ 1242d: 88 42 12 mov %al,0x12(%edx)\r
+ 12430: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 12433: 8b 45 18 mov 0x18(%ebp),%eax\r
+ 12436: 89 42 20 mov %eax,0x20(%edx)\r
+ 12439: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 1243c: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 1243f: 89 42 28 mov %eax,0x28(%edx)\r
+ 12442: 83 7d 14 00 cmpl $0x0,0x14(%ebp)\r
+ 12446: 75 07 jne 1244f <_td_fill+0xb1>\r
+ 12448: c7 45 10 00 00 00 00 movl $0x0,0x10(%ebp)\r
+ 1244f: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 12452: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12455: 89 02 mov %eax,(%edx)\r
+ 12457: 83 7d f0 00 cmpl $0x0,0xfffffff0(%ebp)\r
+ 1245b: 74 31 je 1248e <_td_fill+0xf0>\r
+ 1245d: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 12460: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 12463: 25 00 f0 ff ff and $0xfffff000,%eax\r
+ 12468: 89 42 04 mov %eax,0x4(%edx)\r
+ 1246b: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 1246e: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 12471: 25 ff 0f 00 00 and $0xfff,%eax\r
+ 12476: 0d 00 e0 ff ff or $0xffffe000,%eax\r
+ 1247b: 66 89 42 10 mov %ax,0x10(%edx)\r
+ 1247f: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12482: 8b 50 14 mov 0x14(%eax),%edx\r
+ 12485: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12488: 66 89 42 30 mov %ax,0x30(%edx)\r
+ 1248c: eb 09 jmp 12497 <_td_fill+0xf9>\r
+ 1248e: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 12491: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 12494: 89 42 04 mov %eax,0x4(%edx)\r
+ 12497: 83 7d 10 00 cmpl $0x0,0x10(%ebp)\r
+ 1249b: 74 0f je 124ac <_td_fill+0x10e>\r
+ 1249d: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 124a0: 8b 45 14 mov 0x14(%ebp),%eax\r
+ 124a3: 03 45 10 add 0x10(%ebp),%eax\r
+ 124a6: 48 dec %eax\r
+ 124a7: 89 42 0c mov %eax,0xc(%edx)\r
+ 124aa: eb 0a jmp 124b6 <_td_fill+0x118>\r
+ 124ac: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 124af: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)\r
+ 124b6: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 124b9: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 124bc: 8b 40 24 mov 0x24(%eax),%eax\r
+ 124bf: 89 42 08 mov %eax,0x8(%edx)\r
+ 124c2: 83 ec 08 sub $0x8,%esp\r
+ 124c5: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 124c8: 8b 40 14 mov 0x14(%eax),%eax\r
+ 124cb: 83 c0 20 add $0x20,%eax\r
+ 124ce: 50 push %eax\r
+ 124cf: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 124d2: 83 c0 2c add $0x2c,%eax\r
+ 124d5: 50 push %eax\r
+ 124d6: e8 4c 00 00 00 call 12527 <_list_add_tail>\r
+ 124db: 83 c4 10 add $0x10,%esp\r
+ 124de: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 124e1: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 124e4: 8b 40 24 mov 0x24(%eax),%eax\r
+ 124e7: c1 e8 06 shr $0x6,%eax\r
+ 124ea: 33 42 24 xor 0x24(%edx),%eax\r
+ 124ed: 83 e0 3f and $0x3f,%eax\r
+ 124f0: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 124f3: 8b 4d fc mov 0xfffffffc(%ebp),%ecx\r
+ 124f6: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 124f9: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 124fc: 8b 84 82 a4 00 00 00 mov 0xa4(%edx,%eax,4),%eax\r
+ 12503: 89 41 18 mov %eax,0x18(%ecx)\r
+ 12506: 8b 4d 08 mov 0x8(%ebp),%ecx\r
+ 12509: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 1250c: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1250f: 89 84 91 a4 00 00 00 mov %eax,0xa4(%ecx,%edx,4)\r
+ 12516: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12519: 8b 50 14 mov 0x14(%eax),%edx\r
+ 1251c: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1251f: 8b 40 08 mov 0x8(%eax),%eax\r
+ 12522: 89 42 04 mov %eax,0x4(%edx)\r
+ 12525: c9 leave \r
+ 12526: c3 ret \r
+\r
+00012527 <_list_add_tail>:\r
+ 12527: 55 push %ebp\r
+ 12528: 89 e5 mov %esp,%ebp\r
+ 1252a: 83 ec 08 sub $0x8,%esp\r
+ 1252d: 83 ec 04 sub $0x4,%esp\r
+ 12530: ff 75 0c pushl 0xc(%ebp)\r
+ 12533: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12536: ff 70 04 pushl 0x4(%eax)\r
+ 12539: ff 75 08 pushl 0x8(%ebp)\r
+ 1253c: e8 05 00 00 00 call 12546 <___list_add>\r
+ 12541: 83 c4 10 add $0x10,%esp\r
+ 12544: c9 leave \r
+ 12545: c3 ret \r
+\r
+00012546 <___list_add>:\r
+ 12546: 55 push %ebp\r
+ 12547: 89 e5 mov %esp,%ebp\r
+ 12549: 8b 55 10 mov 0x10(%ebp),%edx\r
+ 1254c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1254f: 89 42 04 mov %eax,0x4(%edx)\r
+ 12552: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 12555: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 12558: 89 02 mov %eax,(%edx)\r
+ 1255a: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 1255d: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12560: 89 42 04 mov %eax,0x4(%edx)\r
+ 12563: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 12566: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12569: 89 02 mov %eax,(%edx)\r
+ 1256b: 5d pop %ebp\r
+ 1256c: c3 ret \r
+\r
+0001256d <_td_submit_urb>:\r
+ 1256d: 55 push %ebp\r
+ 1256e: 89 e5 mov %esp,%ebp\r
+ 12570: 57 push %edi\r
+ 12571: 56 push %esi\r
+ 12572: 53 push %ebx\r
+ 12573: 83 ec 2c sub $0x2c,%esp\r
+ 12576: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12579: 8b 40 08 mov 0x8(%eax),%eax\r
+ 1257c: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 1257f: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12582: 8b 40 2c mov 0x2c(%eax),%eax\r
+ 12585: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 12588: c7 45 e4 00 00 00 00 movl $0x0,0xffffffe4(%ebp)\r
+ 1258f: c7 45 e0 00 00 00 00 movl $0x0,0xffffffe0(%ebp)\r
+ 12596: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12599: 8b 40 18 mov 0x18(%eax),%eax\r
+ 1259c: c1 e8 07 shr $0x7,%eax\r
+ 1259f: 83 f0 01 xor $0x1,%eax\r
+ 125a2: 83 e0 01 and $0x1,%eax\r
+ 125a5: 89 45 dc mov %eax,0xffffffdc(%ebp)\r
+ 125a8: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 125ab: 8b 58 14 mov 0x14(%eax),%ebx\r
+ 125ae: 8b 55 dc mov 0xffffffdc(%ebp),%edx\r
+ 125b1: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 125b4: 8b 40 18 mov 0x18(%eax),%eax\r
+ 125b7: c1 e8 0f shr $0xf,%eax\r
+ 125ba: 89 c1 mov %eax,%ecx\r
+ 125bc: 83 e1 0f and $0xf,%ecx\r
+ 125bf: 8b 44 93 28 mov 0x28(%ebx,%edx,4),%eax\r
+ 125c3: d3 e8 shr %cl,%eax\r
+ 125c5: 83 e0 01 and $0x1,%eax\r
+ 125c8: 85 c0 test %eax,%eax\r
+ 125ca: 75 5d jne 12629 <_td_submit_urb+0xbc>\r
+ 125cc: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 125cf: 8b 70 14 mov 0x14(%eax),%esi\r
+ 125d2: 8b 7d dc mov 0xffffffdc(%ebp),%edi\r
+ 125d5: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 125d8: 8b 50 14 mov 0x14(%eax),%edx\r
+ 125db: 8b 5d dc mov 0xffffffdc(%ebp),%ebx\r
+ 125de: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 125e1: 8b 40 18 mov 0x18(%eax),%eax\r
+ 125e4: c1 e8 0f shr $0xf,%eax\r
+ 125e7: 89 c1 mov %eax,%ecx\r
+ 125e9: 83 e1 0f and $0xf,%ecx\r
+ 125ec: b8 01 00 00 00 mov $0x1,%eax\r
+ 125f1: d3 e0 shl %cl,%eax\r
+ 125f3: f7 d0 not %eax\r
+ 125f5: 23 44 9a 28 and 0x28(%edx,%ebx,4),%eax\r
+ 125f9: 89 c2 mov %eax,%edx\r
+ 125fb: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 125fe: 8b 40 18 mov 0x18(%eax),%eax\r
+ 12601: c1 e8 0f shr $0xf,%eax\r
+ 12604: 89 c1 mov %eax,%ecx\r
+ 12606: 83 e1 0f and $0xf,%ecx\r
+ 12609: b8 01 00 00 00 mov $0x1,%eax\r
+ 1260e: d3 e0 shl %cl,%eax\r
+ 12610: 09 d0 or %edx,%eax\r
+ 12612: 89 44 be 28 mov %eax,0x28(%esi,%edi,4)\r
+ 12616: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 12619: 8b 10 mov (%eax),%edx\r
+ 1261b: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 1261e: 8b 00 mov (%eax),%eax\r
+ 12620: 8b 40 08 mov 0x8(%eax),%eax\r
+ 12623: 83 e0 fd and $0xfffffffd,%eax\r
+ 12626: 89 42 08 mov %eax,0x8(%edx)\r
+ 12629: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 1262c: 66 c7 40 06 00 00 movw $0x0,0x6(%eax)\r
+ 12632: 83 7d e8 00 cmpl $0x0,0xffffffe8(%ebp)\r
+ 12636: 74 0b je 12643 <_td_submit_urb+0xd6>\r
+ 12638: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1263b: 8b 40 28 mov 0x28(%eax),%eax\r
+ 1263e: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 12641: eb 07 jmp 1264a <_td_submit_urb+0xdd>\r
+ 12643: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 1264a: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 1264d: 8b 00 mov (%eax),%eax\r
+ 1264f: ba 00 00 00 00 mov $0x0,%edx\r
+ 12654: 8a 50 29 mov 0x29(%eax),%dl\r
+ 12657: 89 55 c8 mov %edx,0xffffffc8(%ebp)\r
+ 1265a: 83 7d c8 01 cmpl $0x1,0xffffffc8(%ebp)\r
+ 1265e: 74 2a je 1268a <_td_submit_urb+0x11d>\r
+ 12660: 83 7d c8 01 cmpl $0x1,0xffffffc8(%ebp)\r
+ 12664: 7f 0f jg 12675 <_td_submit_urb+0x108>\r
+ 12666: 83 7d c8 00 cmpl $0x0,0xffffffc8(%ebp)\r
+ 1266a: 0f 84 fa 01 00 00 je 1286a <_td_submit_urb+0x2fd>\r
+ 12670: e9 86 02 00 00 jmp 128fb <_td_submit_urb+0x38e>\r
+ 12675: 83 7d c8 02 cmpl $0x2,0xffffffc8(%ebp)\r
+ 12679: 0f 84 18 01 00 00 je 12797 <_td_submit_urb+0x22a>\r
+ 1267f: 83 7d c8 03 cmpl $0x3,0xffffffc8(%ebp)\r
+ 12683: 74 19 je 1269e <_td_submit_urb+0x131>\r
+ 12685: e9 71 02 00 00 jmp 128fb <_td_submit_urb+0x38e>\r
+ 1268a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1268d: 05 34 02 00 00 add $0x234,%eax\r
+ 12692: 50 push %eax\r
+ 12693: e8 e3 ef ff ff call 1167b <_hcd_to_bus>\r
+ 12698: 83 c4 04 add $0x4,%esp\r
+ 1269b: ff 40 38 incl 0x38(%eax)\r
+ 1269e: 83 7d dc 00 cmpl $0x0,0xffffffdc(%ebp)\r
+ 126a2: 74 09 je 126ad <_td_submit_urb+0x140>\r
+ 126a4: c7 45 d4 00 00 08 f0 movl $0xf0080000,0xffffffd4(%ebp)\r
+ 126ab: eb 07 jmp 126b4 <_td_submit_urb+0x147>\r
+ 126ad: c7 45 d4 00 00 10 f0 movl $0xf0100000,0xffffffd4(%ebp)\r
+ 126b4: 8b 45 d4 mov 0xffffffd4(%ebp),%eax\r
+ 126b7: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 126ba: 81 7d e8 00 10 00 00 cmpl $0x1000,0xffffffe8(%ebp)\r
+ 126c1: 7e 38 jle 126fb <_td_submit_urb+0x18e>\r
+ 126c3: 83 ec 08 sub $0x8,%esp\r
+ 126c6: ff 75 e4 pushl 0xffffffe4(%ebp)\r
+ 126c9: ff 75 0c pushl 0xc(%ebp)\r
+ 126cc: 68 00 10 00 00 push $0x1000\r
+ 126d1: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 126d4: ff 75 e0 pushl 0xffffffe0(%ebp)\r
+ 126d7: ff 75 08 pushl 0x8(%ebp)\r
+ 126da: e8 bf fc ff ff call 1239e <_td_fill>\r
+ 126df: 83 c4 20 add $0x20,%esp\r
+ 126e2: 8d 45 ec lea 0xffffffec(%ebp),%eax\r
+ 126e5: 81 00 00 10 00 00 addl $0x1000,(%eax)\r
+ 126eb: 8d 45 e8 lea 0xffffffe8(%ebp),%eax\r
+ 126ee: 81 28 00 10 00 00 subl $0x1000,(%eax)\r
+ 126f4: 8d 45 e4 lea 0xffffffe4(%ebp),%eax\r
+ 126f7: ff 00 incl (%eax)\r
+ 126f9: eb bf jmp 126ba <_td_submit_urb+0x14d>\r
+ 126fb: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 126fe: 8b 40 20 mov 0x20(%eax),%eax\r
+ 12701: 83 e0 01 and $0x1,%eax\r
+ 12704: 85 c0 test %eax,%eax\r
+ 12706: 75 09 jne 12711 <_td_submit_urb+0x1a4>\r
+ 12708: 8d 45 e0 lea 0xffffffe0(%ebp),%eax\r
+ 1270b: 81 08 00 00 04 00 orl $0x40000,(%eax)\r
+ 12711: 83 ec 08 sub $0x8,%esp\r
+ 12714: ff 75 e4 pushl 0xffffffe4(%ebp)\r
+ 12717: ff 75 0c pushl 0xc(%ebp)\r
+ 1271a: ff 75 e8 pushl 0xffffffe8(%ebp)\r
+ 1271d: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 12720: ff 75 e0 pushl 0xffffffe0(%ebp)\r
+ 12723: ff 75 08 pushl 0x8(%ebp)\r
+ 12726: e8 73 fc ff ff call 1239e <_td_fill>\r
+ 1272b: 83 c4 20 add $0x20,%esp\r
+ 1272e: 8d 45 e4 lea 0xffffffe4(%ebp),%eax\r
+ 12731: ff 00 incl (%eax)\r
+ 12733: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12736: 8b 40 20 mov 0x20(%eax),%eax\r
+ 12739: c1 e8 06 shr $0x6,%eax\r
+ 1273c: 83 e0 01 and $0x1,%eax\r
+ 1273f: 85 c0 test %eax,%eax\r
+ 12741: 74 31 je 12774 <_td_submit_urb+0x207>\r
+ 12743: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 12746: 66 8b 40 04 mov 0x4(%eax),%ax\r
+ 1274a: 25 ff ff 00 00 and $0xffff,%eax\r
+ 1274f: 3b 45 e4 cmp 0xffffffe4(%ebp),%eax\r
+ 12752: 7e 20 jle 12774 <_td_submit_urb+0x207>\r
+ 12754: 83 ec 08 sub $0x8,%esp\r
+ 12757: ff 75 e4 pushl 0xffffffe4(%ebp)\r
+ 1275a: ff 75 0c pushl 0xc(%ebp)\r
+ 1275d: 6a 00 push $0x0\r
+ 1275f: 6a 00 push $0x0\r
+ 12761: ff 75 e0 pushl 0xffffffe0(%ebp)\r
+ 12764: ff 75 08 pushl 0x8(%ebp)\r
+ 12767: e8 32 fc ff ff call 1239e <_td_fill>\r
+ 1276c: 83 c4 20 add $0x20,%esp\r
+ 1276f: 8d 45 e4 lea 0xffffffe4(%ebp),%eax\r
+ 12772: ff 00 incl (%eax)\r
+ 12774: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 12777: 8b 00 mov (%eax),%eax\r
+ 12779: 80 78 29 03 cmpb $0x3,0x29(%eax)\r
+ 1277d: 0f 85 78 01 00 00 jne 128fb <_td_submit_urb+0x38e>\r
+ 12783: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12786: 8b 40 04 mov 0x4(%eax),%eax\r
+ 12789: 83 c0 08 add $0x8,%eax\r
+ 1278c: c7 00 04 00 00 00 movl $0x4,(%eax)\r
+ 12792: e9 64 01 00 00 jmp 128fb <_td_submit_urb+0x38e>\r
+ 12797: c7 45 e0 00 00 00 f2 movl $0xf2000000,0xffffffe0(%ebp)\r
+ 1279e: 83 ec 08 sub $0x8,%esp\r
+ 127a1: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 127a4: 50 push %eax\r
+ 127a5: 8d 45 e4 lea 0xffffffe4(%ebp),%eax\r
+ 127a8: ff 00 incl (%eax)\r
+ 127aa: ff 75 0c pushl 0xc(%ebp)\r
+ 127ad: 6a 08 push $0x8\r
+ 127af: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 127b2: ff 70 3c pushl 0x3c(%eax)\r
+ 127b5: ff 75 e0 pushl 0xffffffe0(%ebp)\r
+ 127b8: ff 75 08 pushl 0x8(%ebp)\r
+ 127bb: e8 de fb ff ff call 1239e <_td_fill>\r
+ 127c0: 83 c4 20 add $0x20,%esp\r
+ 127c3: 83 7d e8 00 cmpl $0x0,0xffffffe8(%ebp)\r
+ 127c7: 7e 4f jle 12818 <_td_submit_urb+0x2ab>\r
+ 127c9: c7 45 e0 00 00 04 f3 movl $0xf3040000,0xffffffe0(%ebp)\r
+ 127d0: 83 7d dc 00 cmpl $0x0,0xffffffdc(%ebp)\r
+ 127d4: 74 0e je 127e4 <_td_submit_urb+0x277>\r
+ 127d6: 8b 55 e0 mov 0xffffffe0(%ebp),%edx\r
+ 127d9: 81 ca 00 00 08 00 or $0x80000,%edx\r
+ 127df: 89 55 d0 mov %edx,0xffffffd0(%ebp)\r
+ 127e2: eb 0b jmp 127ef <_td_submit_urb+0x282>\r
+ 127e4: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 127e7: 0d 00 00 10 00 or $0x100000,%eax\r
+ 127ec: 89 45 d0 mov %eax,0xffffffd0(%ebp)\r
+ 127ef: 8b 55 d0 mov 0xffffffd0(%ebp),%edx\r
+ 127f2: 89 55 e0 mov %edx,0xffffffe0(%ebp)\r
+ 127f5: 83 ec 08 sub $0x8,%esp\r
+ 127f8: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 127fb: 50 push %eax\r
+ 127fc: 8d 45 e4 lea 0xffffffe4(%ebp),%eax\r
+ 127ff: ff 00 incl (%eax)\r
+ 12801: ff 75 0c pushl 0xc(%ebp)\r
+ 12804: ff 75 e8 pushl 0xffffffe8(%ebp)\r
+ 12807: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 1280a: ff 75 e0 pushl 0xffffffe0(%ebp)\r
+ 1280d: ff 75 08 pushl 0x8(%ebp)\r
+ 12810: e8 89 fb ff ff call 1239e <_td_fill>\r
+ 12815: 83 c4 20 add $0x20,%esp\r
+ 12818: 83 7d dc 00 cmpl $0x0,0xffffffdc(%ebp)\r
+ 1281c: 74 09 je 12827 <_td_submit_urb+0x2ba>\r
+ 1281e: c7 45 cc 00 00 10 f3 movl $0xf3100000,0xffffffcc(%ebp)\r
+ 12825: eb 07 jmp 1282e <_td_submit_urb+0x2c1>\r
+ 12827: c7 45 cc 00 00 08 f3 movl $0xf3080000,0xffffffcc(%ebp)\r
+ 1282e: 8b 45 cc mov 0xffffffcc(%ebp),%eax\r
+ 12831: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 12834: 83 ec 08 sub $0x8,%esp\r
+ 12837: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 1283a: 50 push %eax\r
+ 1283b: 8d 45 e4 lea 0xffffffe4(%ebp),%eax\r
+ 1283e: ff 00 incl (%eax)\r
+ 12840: ff 75 0c pushl 0xc(%ebp)\r
+ 12843: 6a 00 push $0x0\r
+ 12845: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 12848: ff 75 e0 pushl 0xffffffe0(%ebp)\r
+ 1284b: ff 75 08 pushl 0x8(%ebp)\r
+ 1284e: e8 4b fb ff ff call 1239e <_td_fill>\r
+ 12853: 83 c4 20 add $0x20,%esp\r
+ 12856: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12859: 8b 40 04 mov 0x4(%eax),%eax\r
+ 1285c: 83 c0 08 add $0x8,%eax\r
+ 1285f: c7 00 02 00 00 00 movl $0x2,(%eax)\r
+ 12865: e9 91 00 00 00 jmp 128fb <_td_submit_urb+0x38e>\r
+ 1286a: c7 45 e4 00 00 00 00 movl $0x0,0xffffffe4(%ebp)\r
+ 12871: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12874: 8b 40 44 mov 0x44(%eax),%eax\r
+ 12877: 3b 45 e4 cmp 0xffffffe4(%ebp),%eax\r
+ 1287a: 7e 6b jle 128e7 <_td_submit_urb+0x37a>\r
+ 1287c: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1287f: 8b 40 40 mov 0x40(%eax),%eax\r
+ 12882: 89 45 d8 mov %eax,0xffffffd8(%ebp)\r
+ 12885: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12888: 8b 40 48 mov 0x48(%eax),%eax\r
+ 1288b: 89 c2 mov %eax,%edx\r
+ 1288d: 0f af 55 e4 imul 0xffffffe4(%ebp),%edx\r
+ 12891: 8d 45 d8 lea 0xffffffd8(%ebp),%eax\r
+ 12894: 01 10 add %edx,(%eax)\r
+ 12896: 8d 45 d8 lea 0xffffffd8(%ebp),%eax\r
+ 12899: 81 20 ff ff 00 00 andl $0xffff,(%eax)\r
+ 1289f: 83 ec 08 sub $0x8,%esp\r
+ 128a2: ff 75 e4 pushl 0xffffffe4(%ebp)\r
+ 128a5: ff 75 0c pushl 0xc(%ebp)\r
+ 128a8: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 128ab: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 128ae: c1 e0 04 shl $0x4,%eax\r
+ 128b1: 01 d0 add %edx,%eax\r
+ 128b3: 83 c0 60 add $0x60,%eax\r
+ 128b6: ff 30 pushl (%eax)\r
+ 128b8: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 128bb: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 128be: c1 e0 04 shl $0x4,%eax\r
+ 128c1: 01 d0 add %edx,%eax\r
+ 128c3: 8d 50 5c lea 0x5c(%eax),%edx\r
+ 128c6: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 128c9: 03 02 add (%edx),%eax\r
+ 128cb: 50 push %eax\r
+ 128cc: 8b 45 d8 mov 0xffffffd8(%ebp),%eax\r
+ 128cf: 0d 00 00 01 f0 or $0xf0010000,%eax\r
+ 128d4: 50 push %eax\r
+ 128d5: ff 75 08 pushl 0x8(%ebp)\r
+ 128d8: e8 c1 fa ff ff call 1239e <_td_fill>\r
+ 128dd: 83 c4 20 add $0x20,%esp\r
+ 128e0: 8d 45 e4 lea 0xffffffe4(%ebp),%eax\r
+ 128e3: ff 00 incl (%eax)\r
+ 128e5: eb 8a jmp 12871 <_td_submit_urb+0x304>\r
+ 128e7: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 128ea: 05 34 02 00 00 add $0x234,%eax\r
+ 128ef: 50 push %eax\r
+ 128f0: e8 86 ed ff ff call 1167b <_hcd_to_bus>\r
+ 128f5: 83 c4 04 add $0x4,%esp\r
+ 128f8: ff 40 3c incl 0x3c(%eax)\r
+ 128fb: 8d 65 f4 lea 0xfffffff4(%ebp),%esp\r
+ 128fe: 5b pop %ebx\r
+ 128ff: 5e pop %esi\r
+ 12900: 5f pop %edi\r
+ 12901: 5d pop %ebp\r
+ 12902: c3 ret \r
+\r
+00012903 <_td_done>:\r
+ 12903: 55 push %ebp\r
+ 12904: 89 e5 mov %esp,%ebp\r
+ 12906: 57 push %edi\r
+ 12907: 56 push %esi\r
+ 12908: 53 push %ebx\r
+ 12909: 83 ec 1c sub $0x1c,%esp\r
+ 1290c: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 1290f: 8b 00 mov (%eax),%eax\r
+ 12911: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 12914: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 1291b: 83 ec 0c sub $0xc,%esp\r
+ 1291e: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 12921: 83 c0 2c add $0x2c,%eax\r
+ 12924: 50 push %eax\r
+ 12925: e8 0f 02 00 00 call 12b39 <_list_del>\r
+ 1292a: 83 c4 10 add $0x10,%esp\r
+ 1292d: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 12930: c1 e8 10 shr $0x10,%eax\r
+ 12933: 83 e0 01 and $0x1,%eax\r
+ 12936: 85 c0 test %eax,%eax\r
+ 12938: 0f 84 d2 00 00 00 je 12a10 <_td_done+0x10d>\r
+ 1293e: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 12941: 66 8b 40 10 mov 0x10(%eax),%ax\r
+ 12945: 66 89 45 ea mov %ax,0xffffffea(%ebp)\r
+ 12949: c7 45 e4 00 00 00 00 movl $0x0,0xffffffe4(%ebp)\r
+ 12950: 66 8b 45 ea mov 0xffffffea(%ebp),%ax\r
+ 12954: 66 c1 e8 0c shr $0xc,%ax\r
+ 12958: 25 ff ff 00 00 and $0xffff,%eax\r
+ 1295d: 83 e0 0f and $0xf,%eax\r
+ 12960: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 12963: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 12966: 25 00 00 00 f0 and $0xf0000000,%eax\r
+ 1296b: 85 c0 test %eax,%eax\r
+ 1296d: 74 05 je 12974 <_td_done+0x71>\r
+ 1296f: e9 bd 01 00 00 jmp 12b31 <_td_done+0x22e>\r
+ 12974: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12977: 8b 40 18 mov 0x18(%eax),%eax\r
+ 1297a: c1 e8 07 shr $0x7,%eax\r
+ 1297d: 83 e0 01 and $0x1,%eax\r
+ 12980: 85 c0 test %eax,%eax\r
+ 12982: 75 1d jne 129a1 <_td_done+0x9e>\r
+ 12984: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 12987: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 1298a: 8a 40 12 mov 0x12(%eax),%al\r
+ 1298d: 25 ff 00 00 00 and $0xff,%eax\r
+ 12992: c1 e0 04 shl $0x4,%eax\r
+ 12995: 01 d0 add %edx,%eax\r
+ 12997: 83 c0 60 add $0x60,%eax\r
+ 1299a: 8b 00 mov (%eax),%eax\r
+ 1299c: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 1299f: eb 1e jmp 129bf <_td_done+0xbc>\r
+ 129a1: 83 7d ec 09 cmpl $0x9,0xffffffec(%ebp)\r
+ 129a5: 75 07 jne 129ae <_td_done+0xab>\r
+ 129a7: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 129ae: 66 8b 45 ea mov 0xffffffea(%ebp),%ax\r
+ 129b2: 25 ff ff 00 00 and $0xffff,%eax\r
+ 129b7: 25 ff 03 00 00 and $0x3ff,%eax\r
+ 129bc: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 129bf: 8b 4d 0c mov 0xc(%ebp),%ecx\r
+ 129c2: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 129c5: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 129c8: 03 42 30 add 0x30(%edx),%eax\r
+ 129cb: 89 41 30 mov %eax,0x30(%ecx)\r
+ 129ce: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 129d1: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 129d4: 8a 40 12 mov 0x12(%eax),%al\r
+ 129d7: 25 ff 00 00 00 and $0xff,%eax\r
+ 129dc: c1 e0 04 shl $0x4,%eax\r
+ 129df: 01 d0 add %edx,%eax\r
+ 129e1: 8d 50 64 lea 0x64(%eax),%edx\r
+ 129e4: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 129e7: 89 02 mov %eax,(%edx)\r
+ 129e9: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 129ec: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 129ef: 8a 40 12 mov 0x12(%eax),%al\r
+ 129f2: 25 ff 00 00 00 and $0xff,%eax\r
+ 129f7: c1 e0 04 shl $0x4,%eax\r
+ 129fa: 01 d0 add %edx,%eax\r
+ 129fc: 8d 50 68 lea 0x68(%eax),%edx\r
+ 129ff: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 12a02: 8b 04 85 20 60 01 00 mov 0x16020(,%eax,4),%eax\r
+ 12a09: 89 02 mov %eax,(%edx)\r
+ 12a0b: e9 21 01 00 00 jmp 12b31 <_td_done+0x22e>\r
+ 12a10: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12a13: 8b 40 18 mov 0x18(%eax),%eax\r
+ 12a16: c1 e8 1e shr $0x1e,%eax\r
+ 12a19: 83 e0 03 and $0x3,%eax\r
+ 12a1c: 89 45 e4 mov %eax,0xffffffe4(%ebp)\r
+ 12a1f: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 12a22: 83 c0 0c add $0xc,%eax\r
+ 12a25: 8b 00 mov (%eax),%eax\r
+ 12a27: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 12a2a: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 12a2d: c1 e8 1c shr $0x1c,%eax\r
+ 12a30: 83 e0 0f and $0xf,%eax\r
+ 12a33: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 12a36: 83 7d e4 02 cmpl $0x2,0xffffffe4(%ebp)\r
+ 12a3a: 74 51 je 12a8d <_td_done+0x18a>\r
+ 12a3c: 83 7d ec 04 cmpl $0x4,0xffffffec(%ebp)\r
+ 12a40: 75 4b jne 12a8d <_td_done+0x18a>\r
+ 12a42: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12a45: 8b 58 14 mov 0x14(%eax),%ebx\r
+ 12a48: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12a4b: 8b 40 18 mov 0x18(%eax),%eax\r
+ 12a4e: c1 e8 07 shr $0x7,%eax\r
+ 12a51: 83 f0 01 xor $0x1,%eax\r
+ 12a54: 89 c6 mov %eax,%esi\r
+ 12a56: 83 e6 01 and $0x1,%esi\r
+ 12a59: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12a5c: 8b 78 14 mov 0x14(%eax),%edi\r
+ 12a5f: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12a62: 8b 40 18 mov 0x18(%eax),%eax\r
+ 12a65: c1 e8 07 shr $0x7,%eax\r
+ 12a68: 83 f0 01 xor $0x1,%eax\r
+ 12a6b: 89 c2 mov %eax,%edx\r
+ 12a6d: 83 e2 01 and $0x1,%edx\r
+ 12a70: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12a73: 8b 40 18 mov 0x18(%eax),%eax\r
+ 12a76: c1 e8 0f shr $0xf,%eax\r
+ 12a79: 89 c1 mov %eax,%ecx\r
+ 12a7b: 83 e1 0f and $0xf,%ecx\r
+ 12a7e: b8 01 00 00 00 mov $0x1,%eax\r
+ 12a83: d3 e0 shl %cl,%eax\r
+ 12a85: 0b 44 97 30 or 0x30(%edi,%edx,4),%eax\r
+ 12a89: 89 44 b3 30 mov %eax,0x30(%ebx,%esi,4)\r
+ 12a8d: 83 7d ec 09 cmpl $0x9,0xffffffec(%ebp)\r
+ 12a91: 75 14 jne 12aa7 <_td_done+0x1a4>\r
+ 12a93: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12a96: 8b 40 20 mov 0x20(%eax),%eax\r
+ 12a99: 83 e0 01 and $0x1,%eax\r
+ 12a9c: 85 c0 test %eax,%eax\r
+ 12a9e: 75 07 jne 12aa7 <_td_done+0x1a4>\r
+ 12aa0: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec(%ebp)\r
+ 12aa7: 83 7d ec 00 cmpl $0x0,0xffffffec(%ebp)\r
+ 12aab: 74 28 je 12ad5 <_td_done+0x1d2>\r
+ 12aad: 83 7d ec 0d cmpl $0xd,0xffffffec(%ebp)\r
+ 12ab1: 7f 22 jg 12ad5 <_td_done+0x1d2>\r
+ 12ab3: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12ab6: c7 00 01 00 00 00 movl $0x1,(%eax)\r
+ 12abc: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12abf: 83 78 1c 8d cmpl $0xffffff8d,0x1c(%eax)\r
+ 12ac3: 75 10 jne 12ad5 <_td_done+0x1d2>\r
+ 12ac5: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12ac8: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 12acb: 8b 14 95 20 60 01 00 mov 0x16020(,%edx,4),%edx\r
+ 12ad2: 89 50 1c mov %edx,0x1c(%eax)\r
+ 12ad5: 83 7d e4 02 cmpl $0x2,0xffffffe4(%ebp)\r
+ 12ad9: 75 0b jne 12ae6 <_td_done+0x1e3>\r
+ 12adb: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 12ade: 80 78 12 00 cmpb $0x0,0x12(%eax)\r
+ 12ae2: 75 02 jne 12ae6 <_td_done+0x1e3>\r
+ 12ae4: eb 45 jmp 12b2b <_td_done+0x228>\r
+ 12ae6: 83 7d e0 00 cmpl $0x0,0xffffffe0(%ebp)\r
+ 12aea: 74 3f je 12b2b <_td_done+0x228>\r
+ 12aec: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 12aef: 83 78 04 00 cmpl $0x0,0x4(%eax)\r
+ 12af3: 75 1a jne 12b0f <_td_done+0x20c>\r
+ 12af5: 8b 5d 0c mov 0xc(%ebp),%ebx\r
+ 12af8: 8b 4d 0c mov 0xc(%ebp),%ecx\r
+ 12afb: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 12afe: 8b 50 28 mov 0x28(%eax),%edx\r
+ 12b01: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 12b04: 29 d0 sub %edx,%eax\r
+ 12b06: 03 41 30 add 0x30(%ecx),%eax\r
+ 12b09: 40 inc %eax\r
+ 12b0a: 89 43 30 mov %eax,0x30(%ebx)\r
+ 12b0d: eb 1c jmp 12b2b <_td_done+0x228>\r
+ 12b0f: 8b 5d 0c mov 0xc(%ebp),%ebx\r
+ 12b12: 8b 75 0c mov 0xc(%ebp),%esi\r
+ 12b15: 8b 4d 10 mov 0x10(%ebp),%ecx\r
+ 12b18: 83 c1 04 add $0x4,%ecx\r
+ 12b1b: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 12b1e: 8b 50 28 mov 0x28(%eax),%edx\r
+ 12b21: 8b 01 mov (%ecx),%eax\r
+ 12b23: 29 d0 sub %edx,%eax\r
+ 12b25: 03 46 30 add 0x30(%esi),%eax\r
+ 12b28: 89 43 30 mov %eax,0x30(%ebx)\r
+ 12b2b: 83 7d ec 00 cmpl $0x0,0xffffffec(%ebp)\r
+ 12b2f: 74 00 je 12b31 <_td_done+0x22e>\r
+ 12b31: 8d 65 f4 lea 0xfffffff4(%ebp),%esp\r
+ 12b34: 5b pop %ebx\r
+ 12b35: 5e pop %esi\r
+ 12b36: 5f pop %edi\r
+ 12b37: 5d pop %ebp\r
+ 12b38: c3 ret \r
+\r
+00012b39 <_list_del>:\r
+ 12b39: 55 push %ebp\r
+ 12b3a: 89 e5 mov %esp,%ebp\r
+ 12b3c: 83 ec 08 sub $0x8,%esp\r
+ 12b3f: 83 ec 08 sub $0x8,%esp\r
+ 12b42: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12b45: ff 30 pushl (%eax)\r
+ 12b47: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12b4a: ff 70 04 pushl 0x4(%eax)\r
+ 12b4d: e8 18 00 00 00 call 12b6a <___list_del>\r
+ 12b52: 83 c4 10 add $0x10,%esp\r
+ 12b55: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12b58: c7 00 00 00 00 00 movl $0x0,(%eax)\r
+ 12b5e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12b61: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax)\r
+ 12b68: c9 leave \r
+ 12b69: c3 ret \r
+\r
+00012b6a <___list_del>:\r
+ 12b6a: 55 push %ebp\r
+ 12b6b: 89 e5 mov %esp,%ebp\r
+ 12b6d: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 12b70: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12b73: 89 42 04 mov %eax,0x4(%edx)\r
+ 12b76: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 12b79: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12b7c: 89 02 mov %eax,(%edx)\r
+ 12b7e: 5d pop %ebp\r
+ 12b7f: c3 ret \r
+\r
+00012b80 <_dl_reverse_done_list>:\r
+ 12b80: 55 push %ebp\r
+ 12b81: 89 e5 mov %esp,%ebp\r
+ 12b83: 83 ec 18 sub $0x18,%esp\r
+ 12b86: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 12b8d: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 12b94: c7 45 f0 00 00 00 00 movl $0x0,0xfffffff0(%ebp)\r
+ 12b9b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12b9e: 8b 40 08 mov 0x8(%eax),%eax\r
+ 12ba1: 05 84 00 00 00 add $0x84,%eax\r
+ 12ba6: 8b 00 mov (%eax),%eax\r
+ 12ba8: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 12bab: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12bae: 8b 40 08 mov 0x8(%eax),%eax\r
+ 12bb1: c7 80 84 00 00 00 00 movl $0x0,0x84(%eax)\r
+ 12bb8: 00 00 00 \r
+ 12bbb: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 12bbf: 0f 84 85 00 00 00 je 12c4a <_dl_reverse_done_list+0xca>\r
+ 12bc5: 83 ec 08 sub $0x8,%esp\r
+ 12bc8: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 12bcb: ff 75 08 pushl 0x8(%ebp)\r
+ 12bce: e8 59 01 00 00 call 12d2c <_dma_to_td>\r
+ 12bd3: 83 c4 10 add $0x10,%esp\r
+ 12bd6: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 12bd9: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 12bdd: 75 02 jne 12be1 <_dl_reverse_done_list+0x61>\r
+ 12bdf: eb 69 jmp 12c4a <_dl_reverse_done_list+0xca>\r
+ 12be1: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 12be4: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 12be7: 8b 00 mov (%eax),%eax\r
+ 12be9: 0d 00 00 02 00 or $0x20000,%eax\r
+ 12bee: 89 02 mov %eax,(%edx)\r
+ 12bf0: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 12bf3: 8b 00 mov (%eax),%eax\r
+ 12bf5: c1 e8 1c shr $0x1c,%eax\r
+ 12bf8: 83 e0 0f and $0xf,%eax\r
+ 12bfb: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 12bfe: 83 7d ec 00 cmpl $0x0,0xffffffec(%ebp)\r
+ 12c02: 74 27 je 12c2b <_dl_reverse_done_list+0xab>\r
+ 12c04: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 12c07: 8b 40 14 mov 0x14(%eax),%eax\r
+ 12c0a: 8b 40 08 mov 0x8(%eax),%eax\r
+ 12c0d: 83 e0 01 and $0x1,%eax\r
+ 12c10: 85 c0 test %eax,%eax\r
+ 12c12: 74 17 je 12c2b <_dl_reverse_done_list+0xab>\r
+ 12c14: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 12c17: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 12c1a: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 12c1d: ff 75 08 pushl 0x8(%ebp)\r
+ 12c20: e8 2a 00 00 00 call 12c4f <_ed_halted>\r
+ 12c25: 83 c4 10 add $0x10,%esp\r
+ 12c28: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 12c2b: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 12c2e: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12c31: 89 42 1c mov %eax,0x1c(%edx)\r
+ 12c34: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 12c37: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 12c3a: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 12c3d: 83 c0 08 add $0x8,%eax\r
+ 12c40: 8b 00 mov (%eax),%eax\r
+ 12c42: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 12c45: e9 71 ff ff ff jmp 12bbb <_dl_reverse_done_list+0x3b>\r
+ 12c4a: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12c4d: c9 leave \r
+ 12c4e: c3 ret \r
+\r
+00012c4f <_ed_halted>:\r
+ 12c4f: 55 push %ebp\r
+ 12c50: 89 e5 mov %esp,%ebp\r
+ 12c52: 83 ec 18 sub $0x18,%esp\r
+ 12c55: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12c58: 8b 40 20 mov 0x20(%eax),%eax\r
+ 12c5b: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 12c5e: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12c61: 8b 40 14 mov 0x14(%eax),%eax\r
+ 12c64: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 12c67: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12c6a: 8b 40 2c mov 0x2c(%eax),%eax\r
+ 12c6d: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 12c70: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12c73: 8b 40 08 mov 0x8(%eax),%eax\r
+ 12c76: 83 e0 02 and $0x2,%eax\r
+ 12c79: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 12c7c: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 12c7f: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12c82: 8b 00 mov (%eax),%eax\r
+ 12c84: 80 cc 40 or $0x40,%ah\r
+ 12c87: 89 02 mov %eax,(%edx)\r
+ 12c89: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 12c8c: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12c8f: 8b 40 08 mov 0x8(%eax),%eax\r
+ 12c92: 83 e0 fe and $0xfffffffe,%eax\r
+ 12c95: 89 42 08 mov %eax,0x8(%edx)\r
+ 12c98: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12c9b: 83 c0 20 add $0x20,%eax\r
+ 12c9e: 3b 45 f4 cmp 0xfffffff4(%ebp),%eax\r
+ 12ca1: 74 7e je 12d21 <_ed_halted+0xd2>\r
+ 12ca3: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 12ca6: 83 e8 2c sub $0x2c,%eax\r
+ 12ca9: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 12cac: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 12caf: 8b 40 2c mov 0x2c(%eax),%eax\r
+ 12cb2: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 12cb5: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 12cb8: 8b 40 20 mov 0x20(%eax),%eax\r
+ 12cbb: 3b 45 fc cmp 0xfffffffc(%ebp),%eax\r
+ 12cbe: 74 02 je 12cc2 <_ed_halted+0x73>\r
+ 12cc0: eb 5f jmp 12d21 <_ed_halted+0xd2>\r
+ 12cc2: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 12cc5: 8b 00 mov (%eax),%eax\r
+ 12cc7: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 12cca: 8d 45 e8 lea 0xffffffe8(%ebp),%eax\r
+ 12ccd: 81 08 00 00 02 00 orl $0x20000,(%eax)\r
+ 12cd3: 8d 45 e8 lea 0xffffffe8(%ebp),%eax\r
+ 12cd6: 81 20 ff ff ff 0f andl $0xfffffff,(%eax)\r
+ 12cdc: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 12cdf: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 12ce2: 89 02 mov %eax,(%edx)\r
+ 12ce4: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 12ce7: 8b 45 14 mov 0x14(%ebp),%eax\r
+ 12cea: 89 42 1c mov %eax,0x1c(%edx)\r
+ 12ced: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 12cf0: 89 45 14 mov %eax,0x14(%ebp)\r
+ 12cf3: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12cf6: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 12cf9: 8b 40 04 mov 0x4(%eax),%eax\r
+ 12cfc: 3b 42 24 cmp 0x24(%edx),%eax\r
+ 12cff: 75 0c jne 12d0d <_ed_halted+0xbe>\r
+ 12d01: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12d04: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 12d07: 8b 52 08 mov 0x8(%edx),%edx\r
+ 12d0a: 89 50 04 mov %edx,0x4(%eax)\r
+ 12d0d: 8b 4d f8 mov 0xfffffff8(%ebp),%ecx\r
+ 12d10: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 12d13: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 12d16: 0b 42 08 or 0x8(%edx),%eax\r
+ 12d19: 89 41 08 mov %eax,0x8(%ecx)\r
+ 12d1c: e9 77 ff ff ff jmp 12c98 <_ed_halted+0x49>\r
+ 12d21: 83 7d 10 04 cmpl $0x4,0x10(%ebp)\r
+ 12d25: 75 00 jne 12d27 <_ed_halted+0xd8>\r
+ 12d27: 8b 45 14 mov 0x14(%ebp),%eax\r
+ 12d2a: c9 leave \r
+ 12d2b: c3 ret \r
+\r
+00012d2c <_dma_to_td>:\r
+ 12d2c: 55 push %ebp\r
+ 12d2d: 89 e5 mov %esp,%ebp\r
+ 12d2f: 83 ec 04 sub $0x4,%esp\r
+ 12d32: 8d 45 0c lea 0xc(%ebp),%eax\r
+ 12d35: 83 20 e0 andl $0xffffffe0,(%eax)\r
+ 12d38: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 12d3b: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12d3e: c1 e8 06 shr $0x6,%eax\r
+ 12d41: 33 45 0c xor 0xc(%ebp),%eax\r
+ 12d44: 83 e0 3f and $0x3f,%eax\r
+ 12d47: 8b 84 82 a4 00 00 00 mov 0xa4(%edx,%eax,4),%eax\r
+ 12d4e: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 12d51: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 12d55: 74 16 je 12d6d <_dma_to_td+0x41>\r
+ 12d57: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12d5a: 8b 40 24 mov 0x24(%eax),%eax\r
+ 12d5d: 3b 45 0c cmp 0xc(%ebp),%eax\r
+ 12d60: 74 0b je 12d6d <_dma_to_td+0x41>\r
+ 12d62: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12d65: 8b 40 18 mov 0x18(%eax),%eax\r
+ 12d68: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 12d6b: eb e4 jmp 12d51 <_dma_to_td+0x25>\r
+ 12d6d: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 12d70: c9 leave \r
+ 12d71: c3 ret \r
+\r
+00012d72 <_finish_unlinks>:\r
+ 12d72: 55 push %ebp\r
+ 12d73: 89 e5 mov %esp,%ebp\r
+ 12d75: 83 ec 38 sub $0x38,%esp\r
+ 12d78: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 12d7b: 66 89 45 fe mov %ax,0xfffffffe(%ebp)\r
+ 12d7f: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12d82: 83 c0 10 add $0x10,%eax\r
+ 12d85: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 12d88: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 12d8b: 8b 00 mov (%eax),%eax\r
+ 12d8d: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 12d90: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 12d94: 0f 84 f0 01 00 00 je 12f8a <_finish_unlinks+0x218>\r
+ 12d9a: 0f bf 55 fe movswl 0xfffffffe(%ebp),%edx\r
+ 12d9e: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12da1: 0f bf 40 32 movswl 0x32(%eax),%eax\r
+ 12da5: 29 c2 sub %eax,%edx\r
+ 12da7: 89 d0 mov %edx,%eax\r
+ 12da9: 85 c0 test %eax,%eax\r
+ 12dab: 79 1a jns 12dc7 <_finish_unlinks+0x55>\r
+ 12dad: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12db0: 83 b8 a4 01 00 00 00 cmpl $0x0,0x1a4(%eax)\r
+ 12db7: 75 0e jne 12dc7 <_finish_unlinks+0x55>\r
+ 12db9: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12dbc: 83 c0 18 add $0x18,%eax\r
+ 12dbf: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 12dc2: e9 b6 01 00 00 jmp 12f7d <_finish_unlinks+0x20b>\r
+ 12dc7: 8b 55 f4 mov 0xfffffff4(%ebp),%edx\r
+ 12dca: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12dcd: 8b 40 18 mov 0x18(%eax),%eax\r
+ 12dd0: 89 02 mov %eax,(%edx)\r
+ 12dd2: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12dd5: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)\r
+ 12ddc: c7 45 e4 00 00 00 00 movl $0x0,0xffffffe4(%ebp)\r
+ 12de3: c7 45 e8 00 00 00 00 movl $0x0,0xffffffe8(%ebp)\r
+ 12dea: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12ded: 83 c0 08 add $0x8,%eax\r
+ 12df0: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 12df3: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12df6: 83 c0 20 add $0x20,%eax\r
+ 12df9: 8b 00 mov (%eax),%eax\r
+ 12dfb: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 12dfe: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 12e01: 8b 00 mov (%eax),%eax\r
+ 12e03: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 12e06: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12e09: 83 c0 20 add $0x20,%eax\r
+ 12e0c: 3b 45 f0 cmp 0xfffffff0(%ebp),%eax\r
+ 12e0f: 0f 84 d1 00 00 00 je 12ee6 <_finish_unlinks+0x174>\r
+ 12e15: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 12e18: 83 e8 2c sub $0x2c,%eax\r
+ 12e1b: 89 45 dc mov %eax,0xffffffdc(%ebp)\r
+ 12e1e: 8b 45 dc mov 0xffffffdc(%ebp),%eax\r
+ 12e21: 8b 40 20 mov 0x20(%eax),%eax\r
+ 12e24: 89 45 d8 mov %eax,0xffffffd8(%ebp)\r
+ 12e27: 8b 45 dc mov 0xffffffdc(%ebp),%eax\r
+ 12e2a: 8b 40 20 mov 0x20(%eax),%eax\r
+ 12e2d: 8b 40 08 mov 0x8(%eax),%eax\r
+ 12e30: 89 45 d4 mov %eax,0xffffffd4(%ebp)\r
+ 12e33: 8b 45 d4 mov 0xffffffd4(%ebp),%eax\r
+ 12e36: 83 78 08 01 cmpl $0x1,0x8(%eax)\r
+ 12e3a: 74 0e je 12e4a <_finish_unlinks+0xd8>\r
+ 12e3c: 8b 45 dc mov 0xffffffdc(%ebp),%eax\r
+ 12e3f: 83 c0 08 add $0x8,%eax\r
+ 12e42: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 12e45: e9 89 00 00 00 jmp 12ed3 <_finish_unlinks+0x161>\r
+ 12e4a: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12e4d: 8b 55 dc mov 0xffffffdc(%ebp),%edx\r
+ 12e50: 8b 40 04 mov 0x4(%eax),%eax\r
+ 12e53: 3b 42 24 cmp 0x24(%edx),%eax\r
+ 12e56: 75 0c jne 12e64 <_finish_unlinks+0xf2>\r
+ 12e58: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12e5b: 8b 55 dc mov 0xffffffdc(%ebp),%edx\r
+ 12e5e: 8b 52 08 mov 0x8(%edx),%edx\r
+ 12e61: 89 50 04 mov %edx,0x4(%eax)\r
+ 12e64: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 12e67: 8b 00 mov (%eax),%eax\r
+ 12e69: 83 e0 1f and $0x1f,%eax\r
+ 12e6c: 89 45 d0 mov %eax,0xffffffd0(%ebp)\r
+ 12e6f: 8b 4d e0 mov 0xffffffe0(%ebp),%ecx\r
+ 12e72: 8b 55 dc mov 0xffffffdc(%ebp),%edx\r
+ 12e75: 8b 45 d0 mov 0xffffffd0(%ebp),%eax\r
+ 12e78: 0b 42 08 or 0x8(%edx),%eax\r
+ 12e7b: 89 01 mov %eax,(%ecx)\r
+ 12e7d: 83 ec 04 sub $0x4,%esp\r
+ 12e80: ff 75 dc pushl 0xffffffdc(%ebp)\r
+ 12e83: ff 75 d8 pushl 0xffffffd8(%ebp)\r
+ 12e86: ff 75 08 pushl 0x8(%ebp)\r
+ 12e89: e8 75 fa ff ff call 12903 <_td_done>\r
+ 12e8e: 83 c4 10 add $0x10,%esp\r
+ 12e91: 8b 45 d4 mov 0xffffffd4(%ebp),%eax\r
+ 12e94: 66 ff 40 06 incw 0x6(%eax)\r
+ 12e98: 8b 45 d4 mov 0xffffffd4(%ebp),%eax\r
+ 12e9b: 8b 55 d4 mov 0xffffffd4(%ebp),%edx\r
+ 12e9e: 66 8b 40 06 mov 0x6(%eax),%ax\r
+ 12ea2: 66 3b 42 04 cmp 0x4(%edx),%ax\r
+ 12ea6: 75 2b jne 12ed3 <_finish_unlinks+0x161>\r
+ 12ea8: c7 45 e8 01 00 00 00 movl $0x1,0xffffffe8(%ebp)\r
+ 12eaf: c7 45 e4 01 00 00 00 movl $0x1,0xffffffe4(%ebp)\r
+ 12eb6: 83 ec 04 sub $0x4,%esp\r
+ 12eb9: ff 75 10 pushl 0x10(%ebp)\r
+ 12ebc: ff 75 d8 pushl 0xffffffd8(%ebp)\r
+ 12ebf: ff 75 08 pushl 0x8(%ebp)\r
+ 12ec2: e8 80 ea ff ff call 11947 <_finish_urb>\r
+ 12ec7: 83 c4 10 add $0x10,%esp\r
+ 12eca: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12ecd: c7 00 01 00 00 00 movl $0x1,(%eax)\r
+ 12ed3: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 12ed6: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 12ed9: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 12edc: 8b 00 mov (%eax),%eax\r
+ 12ede: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 12ee1: e9 20 ff ff ff jmp 12e06 <_finish_unlinks+0x94>\r
+ 12ee6: 83 7d e8 00 cmpl $0x0,0xffffffe8(%ebp)\r
+ 12eea: 74 1b je 12f07 <_finish_unlinks+0x195>\r
+ 12eec: 83 ec 0c sub $0xc,%esp\r
+ 12eef: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12ef2: 83 c0 20 add $0x20,%eax\r
+ 12ef5: 50 push %eax\r
+ 12ef6: e8 6d 01 00 00 call 13068 <_list_empty>\r
+ 12efb: 83 c4 10 add $0x10,%esp\r
+ 12efe: 85 c0 test %eax,%eax\r
+ 12f00: 75 05 jne 12f07 <_finish_unlinks+0x195>\r
+ 12f02: e9 dc fe ff ff jmp 12de3 <_finish_unlinks+0x71>\r
+ 12f07: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12f0a: c6 40 28 00 movb $0x0,0x28(%eax)\r
+ 12f0e: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 12f11: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12f14: 8b 00 mov (%eax),%eax\r
+ 12f16: 25 ff bf ff f7 and $0xf7ffbfff,%eax\r
+ 12f1b: 89 02 mov %eax,(%edx)\r
+ 12f1d: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 12f20: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12f23: 8b 40 08 mov 0x8(%eax),%eax\r
+ 12f26: 83 e0 fe and $0xfffffffe,%eax\r
+ 12f29: 89 42 08 mov %eax,0x8(%edx)\r
+ 12f2c: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12f2f: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)\r
+ 12f36: 83 ec 0c sub $0xc,%esp\r
+ 12f39: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 12f3c: 83 c0 20 add $0x20,%eax\r
+ 12f3f: 50 push %eax\r
+ 12f40: e8 23 01 00 00 call 13068 <_list_empty>\r
+ 12f45: 83 c4 10 add $0x10,%esp\r
+ 12f48: 85 c0 test %eax,%eax\r
+ 12f4a: 75 26 jne 12f72 <_finish_unlinks+0x200>\r
+ 12f4c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12f4f: 83 b8 a4 01 00 00 00 cmpl $0x0,0x1a4(%eax)\r
+ 12f56: 75 1a jne 12f72 <_finish_unlinks+0x200>\r
+ 12f58: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12f5b: 83 b8 a8 01 00 00 00 cmpl $0x0,0x1a8(%eax)\r
+ 12f62: 75 0e jne 12f72 <_finish_unlinks+0x200>\r
+ 12f64: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 12f67: ff 75 08 pushl 0x8(%ebp)\r
+ 12f6a: e8 43 ec ff ff call 11bb2 <_ed_schedule>\r
+ 12f6f: 83 c4 08 add $0x8,%esp\r
+ 12f72: 83 7d e4 00 cmpl $0x0,0xffffffe4(%ebp)\r
+ 12f76: 74 05 je 12f7d <_finish_unlinks+0x20b>\r
+ 12f78: e9 02 fe ff ff jmp 12d7f <_finish_unlinks+0xd>\r
+ 12f7d: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 12f80: 8b 00 mov (%eax),%eax\r
+ 12f82: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 12f85: e9 06 fe ff ff jmp 12d90 <_finish_unlinks+0x1e>\r
+ 12f8a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12f8d: 83 b8 a4 01 00 00 00 cmpl $0x0,0x1a4(%eax)\r
+ 12f94: 0f 85 cc 00 00 00 jne 13066 <_finish_unlinks+0x2f4>\r
+ 12f9a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12f9d: 83 78 10 00 cmpl $0x0,0x10(%eax)\r
+ 12fa1: 0f 85 bf 00 00 00 jne 13066 <_finish_unlinks+0x2f4>\r
+ 12fa7: c7 45 d0 00 00 00 00 movl $0x0,0xffffffd0(%ebp)\r
+ 12fae: c7 45 d4 00 00 00 00 movl $0x0,0xffffffd4(%ebp)\r
+ 12fb5: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12fb8: 83 78 18 00 cmpl $0x0,0x18(%eax)\r
+ 12fbc: 74 2e je 12fec <_finish_unlinks+0x27a>\r
+ 12fbe: 8d 45 d0 lea 0xffffffd0(%ebp),%eax\r
+ 12fc1: 83 08 02 orl $0x2,(%eax)\r
+ 12fc4: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12fc7: 8b 80 2c 02 00 00 mov 0x22c(%eax),%eax\r
+ 12fcd: c1 e8 04 shr $0x4,%eax\r
+ 12fd0: 83 e0 01 and $0x1,%eax\r
+ 12fd3: 85 c0 test %eax,%eax\r
+ 12fd5: 75 15 jne 12fec <_finish_unlinks+0x27a>\r
+ 12fd7: 8d 45 d4 lea 0xffffffd4(%ebp),%eax\r
+ 12fda: 83 08 10 orl $0x10,(%eax)\r
+ 12fdd: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12fe0: 8b 40 04 mov 0x4(%eax),%eax\r
+ 12fe3: 83 c0 24 add $0x24,%eax\r
+ 12fe6: c7 00 00 00 00 00 movl $0x0,(%eax)\r
+ 12fec: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12fef: 83 78 14 00 cmpl $0x0,0x14(%eax)\r
+ 12ff3: 74 2e je 13023 <_finish_unlinks+0x2b1>\r
+ 12ff5: 8d 45 d0 lea 0xffffffd0(%ebp),%eax\r
+ 12ff8: 83 08 04 orl $0x4,(%eax)\r
+ 12ffb: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 12ffe: 8b 80 2c 02 00 00 mov 0x22c(%eax),%eax\r
+ 13004: c1 e8 05 shr $0x5,%eax\r
+ 13007: 83 e0 01 and $0x1,%eax\r
+ 1300a: 85 c0 test %eax,%eax\r
+ 1300c: 75 15 jne 13023 <_finish_unlinks+0x2b1>\r
+ 1300e: 8d 45 d4 lea 0xffffffd4(%ebp),%eax\r
+ 13011: 83 08 20 orl $0x20,(%eax)\r
+ 13014: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13017: 8b 40 04 mov 0x4(%eax),%eax\r
+ 1301a: 83 c0 2c add $0x2c,%eax\r
+ 1301d: c7 00 00 00 00 00 movl $0x0,(%eax)\r
+ 13023: 83 7d d4 00 cmpl $0x0,0xffffffd4(%ebp)\r
+ 13027: 74 29 je 13052 <_finish_unlinks+0x2e0>\r
+ 13029: 8b 4d 08 mov 0x8(%ebp),%ecx\r
+ 1302c: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 1302f: 8b 45 d4 mov 0xffffffd4(%ebp),%eax\r
+ 13032: 0b 82 2c 02 00 00 or 0x22c(%edx),%eax\r
+ 13038: 89 81 2c 02 00 00 mov %eax,0x22c(%ecx)\r
+ 1303e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13041: 8b 50 04 mov 0x4(%eax),%edx\r
+ 13044: 83 c2 04 add $0x4,%edx\r
+ 13047: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1304a: 8b 80 2c 02 00 00 mov 0x22c(%eax),%eax\r
+ 13050: 89 02 mov %eax,(%edx)\r
+ 13052: 83 7d d0 00 cmpl $0x0,0xffffffd0(%ebp)\r
+ 13056: 74 0e je 13066 <_finish_unlinks+0x2f4>\r
+ 13058: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1305b: 8b 50 04 mov 0x4(%eax),%edx\r
+ 1305e: 83 c2 08 add $0x8,%edx\r
+ 13061: 8b 45 d0 mov 0xffffffd0(%ebp),%eax\r
+ 13064: 89 02 mov %eax,(%edx)\r
+ 13066: c9 leave \r
+ 13067: c3 ret \r
+\r
+00013068 <_list_empty>:\r
+ 13068: 55 push %ebp\r
+ 13069: 89 e5 mov %esp,%ebp\r
+ 1306b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1306e: 8b 00 mov (%eax),%eax\r
+ 13070: 3b 45 08 cmp 0x8(%ebp),%eax\r
+ 13073: 0f 94 c0 sete %al\r
+ 13076: 25 ff 00 00 00 and $0xff,%eax\r
+ 1307b: 5d pop %ebp\r
+ 1307c: c3 ret \r
+\r
+0001307d <_dl_done_list>:\r
+ 1307d: 55 push %ebp\r
+ 1307e: 89 e5 mov %esp,%ebp\r
+ 13080: 83 ec 18 sub $0x18,%esp\r
+ 13083: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 1308a: 83 7d 0c 00 cmpl $0x0,0xc(%ebp)\r
+ 1308e: 0f 84 d1 00 00 00 je 13165 <_dl_done_list+0xe8>\r
+ 13094: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 13097: 8b 40 1c mov 0x1c(%eax),%eax\r
+ 1309a: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 1309d: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 130a0: 8b 40 20 mov 0x20(%eax),%eax\r
+ 130a3: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 130a6: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 130a9: 8b 40 08 mov 0x8(%eax),%eax\r
+ 130ac: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 130af: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 130b2: 8b 40 14 mov 0x14(%eax),%eax\r
+ 130b5: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 130b8: 83 ec 04 sub $0x4,%esp\r
+ 130bb: ff 75 0c pushl 0xc(%ebp)\r
+ 130be: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 130c1: ff 75 08 pushl 0x8(%ebp)\r
+ 130c4: e8 3a f8 ff ff call 12903 <_td_done>\r
+ 130c9: 83 c4 10 add $0x10,%esp\r
+ 130cc: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 130cf: 66 ff 40 06 incw 0x6(%eax)\r
+ 130d3: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 130d6: 8b 55 f0 mov 0xfffffff0(%ebp),%edx\r
+ 130d9: 66 8b 40 06 mov 0x6(%eax),%ax\r
+ 130dd: 66 3b 42 04 cmp 0x4(%edx),%ax\r
+ 130e1: 75 1d jne 13100 <_dl_done_list+0x83>\r
+ 130e3: 83 ec 04 sub $0x4,%esp\r
+ 130e6: ff 75 10 pushl 0x10(%ebp)\r
+ 130e9: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 130ec: ff 75 08 pushl 0x8(%ebp)\r
+ 130ef: e8 53 e8 ff ff call 11947 <_finish_urb>\r
+ 130f4: 83 c4 10 add $0x10,%esp\r
+ 130f7: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 130fa: c7 00 01 00 00 00 movl $0x1,(%eax)\r
+ 13100: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 13103: 83 c0 20 add $0x20,%eax\r
+ 13106: 50 push %eax\r
+ 13107: e8 5c ff ff ff call 13068 <_list_empty>\r
+ 1310c: 83 c4 04 add $0x4,%esp\r
+ 1310f: 85 c0 test %eax,%eax\r
+ 13111: 74 10 je 13123 <_dl_done_list+0xa6>\r
+ 13113: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 13116: ff 75 08 pushl 0x8(%ebp)\r
+ 13119: e8 6e ed ff ff call 11e8c <_ed_deschedule>\r
+ 1311e: 83 c4 08 add $0x8,%esp\r
+ 13121: eb 37 jmp 1315a <_dl_done_list+0xdd>\r
+ 13123: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 13126: 8b 00 mov (%eax),%eax\r
+ 13128: c1 e8 1b shr $0x1b,%eax\r
+ 1312b: 83 e0 01 and $0x1,%eax\r
+ 1312e: 85 c0 test %eax,%eax\r
+ 13130: 75 28 jne 1315a <_dl_done_list+0xdd>\r
+ 13132: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 13135: 8b 40 20 mov 0x20(%eax),%eax\r
+ 13138: 83 e8 2c sub $0x2c,%eax\r
+ 1313b: 89 45 0c mov %eax,0xc(%ebp)\r
+ 1313e: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 13141: 8b 00 mov (%eax),%eax\r
+ 13143: c1 e8 11 shr $0x11,%eax\r
+ 13146: 83 e0 01 and $0x1,%eax\r
+ 13149: 85 c0 test %eax,%eax\r
+ 1314b: 75 0d jne 1315a <_dl_done_list+0xdd>\r
+ 1314d: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 13150: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 13153: 8b 12 mov (%edx),%edx\r
+ 13155: 80 e6 bf and $0xbf,%dh\r
+ 13158: 89 10 mov %edx,(%eax)\r
+ 1315a: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1315d: 89 45 0c mov %eax,0xc(%ebp)\r
+ 13160: e9 25 ff ff ff jmp 1308a <_dl_done_list+0xd>\r
+ 13165: c9 leave \r
+ 13166: c3 ret \r
+\r
+00013167 <_ohci_urb_enqueue>:\r
+ 13167: 55 push %ebp\r
+ 13168: 89 e5 mov %esp,%ebp\r
+ 1316a: 56 push %esi\r
+ 1316b: 53 push %ebx\r
+ 1316c: 83 ec 50 sub $0x50,%esp\r
+ 1316f: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13172: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 13175: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 13178: 2d 34 02 00 00 sub $0x234,%eax\r
+ 1317d: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 13180: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 13183: 8b 40 18 mov 0x18(%eax),%eax\r
+ 13186: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 13189: c7 45 e0 00 00 00 00 movl $0x0,0xffffffe0(%ebp)\r
+ 13190: c7 45 d8 00 00 00 00 movl $0x0,0xffffffd8(%ebp)\r
+ 13197: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1319a: ff 70 48 pushl 0x48(%eax)\r
+ 1319d: ff 75 e8 pushl 0xffffffe8(%ebp)\r
+ 131a0: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 131a3: ff 70 14 pushl 0x14(%eax)\r
+ 131a6: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 131a9: e8 02 ef ff ff call 120b0 <_ed_get>\r
+ 131ae: 83 c4 10 add $0x10,%esp\r
+ 131b1: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 131b4: 83 7d f0 00 cmpl $0x0,0xfffffff0(%ebp)\r
+ 131b8: 75 0c jne 131c6 <_ohci_urb_enqueue+0x5f>\r
+ 131ba: c7 45 cc f4 ff ff ff movl $0xfffffff4,0xffffffcc(%ebp)\r
+ 131c1: e9 23 03 00 00 jmp 134e9 <_ohci_urb_enqueue+0x382>\r
+ 131c6: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 131c9: ba 00 00 00 00 mov $0x0,%edx\r
+ 131ce: 8a 50 29 mov 0x29(%eax),%dl\r
+ 131d1: 89 55 c0 mov %edx,0xffffffc0(%ebp)\r
+ 131d4: 83 7d c0 00 cmpl $0x0,0xffffffc0(%ebp)\r
+ 131d8: 0f 84 f7 00 00 00 je 132d5 <_ohci_urb_enqueue+0x16e>\r
+ 131de: 83 7d c0 02 cmpl $0x2,0xffffffc0(%ebp)\r
+ 131e2: 74 02 je 131e6 <_ohci_urb_enqueue+0x7f>\r
+ 131e4: eb 1f jmp 13205 <_ohci_urb_enqueue+0x9e>\r
+ 131e6: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 131e9: 81 78 2c 00 10 00 00 cmpl $0x1000,0x2c(%eax)\r
+ 131f0: 7e 0c jle 131fe <_ohci_urb_enqueue+0x97>\r
+ 131f2: c7 45 cc a6 ff ff ff movl $0xffffffa6,0xffffffcc(%ebp)\r
+ 131f9: e9 eb 02 00 00 jmp 134e9 <_ohci_urb_enqueue+0x382>\r
+ 131fe: c7 45 e0 02 00 00 00 movl $0x2,0xffffffe0(%ebp)\r
+ 13205: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 13208: 8b 40 2c mov 0x2c(%eax),%eax\r
+ 1320b: 89 45 c8 mov %eax,0xffffffc8(%ebp)\r
+ 1320e: 83 7d c8 00 cmpl $0x0,0xffffffc8(%ebp)\r
+ 13212: 79 07 jns 1321b <_ohci_urb_enqueue+0xb4>\r
+ 13214: 81 45 c8 ff 0f 00 00 addl $0xfff,0xffffffc8(%ebp)\r
+ 1321b: 8b 55 c8 mov 0xffffffc8(%ebp),%edx\r
+ 1321e: c1 fa 0c sar $0xc,%edx\r
+ 13221: 8d 45 e0 lea 0xffffffe0(%ebp),%eax\r
+ 13224: 01 10 add %edx,(%eax)\r
+ 13226: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 13229: 8b 40 2c mov 0x2c(%eax),%eax\r
+ 1322c: 25 ff 0f 00 00 and $0xfff,%eax\r
+ 13231: 85 c0 test %eax,%eax\r
+ 13233: 74 05 je 1323a <_ohci_urb_enqueue+0xd3>\r
+ 13235: 8d 45 e0 lea 0xffffffe0(%ebp),%eax\r
+ 13238: ff 00 incl (%eax)\r
+ 1323a: 83 7d e0 00 cmpl $0x0,0xffffffe0(%ebp)\r
+ 1323e: 75 0a jne 1324a <_ohci_urb_enqueue+0xe3>\r
+ 13240: 8d 45 e0 lea 0xffffffe0(%ebp),%eax\r
+ 13243: ff 00 incl (%eax)\r
+ 13245: e9 94 00 00 00 jmp 132de <_ohci_urb_enqueue+0x177>\r
+ 1324a: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1324d: 8b 40 20 mov 0x20(%eax),%eax\r
+ 13250: c1 e8 06 shr $0x6,%eax\r
+ 13253: 83 e0 01 and $0x1,%eax\r
+ 13256: 85 c0 test %eax,%eax\r
+ 13258: 0f 84 80 00 00 00 je 132de <_ohci_urb_enqueue+0x177>\r
+ 1325e: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 13261: 8b 40 2c mov 0x2c(%eax),%eax\r
+ 13264: 89 45 c4 mov %eax,0xffffffc4(%ebp)\r
+ 13267: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 1326a: c1 e8 07 shr $0x7,%eax\r
+ 1326d: 83 e0 01 and $0x1,%eax\r
+ 13270: 85 c0 test %eax,%eax\r
+ 13272: 75 2e jne 132a2 <_ohci_urb_enqueue+0x13b>\r
+ 13274: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 13277: 8b 40 14 mov 0x14(%eax),%eax\r
+ 1327a: 89 45 b8 mov %eax,0xffffffb8(%ebp)\r
+ 1327d: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 13280: c1 e8 0f shr $0xf,%eax\r
+ 13283: 83 e0 0f and $0xf,%eax\r
+ 13286: 89 45 b4 mov %eax,0xffffffb4(%ebp)\r
+ 13289: 8b 45 c4 mov 0xffffffc4(%ebp),%eax\r
+ 1328c: 8b 4d b4 mov 0xffffffb4(%ebp),%ecx\r
+ 1328f: 8b 5d b8 mov 0xffffffb8(%ebp),%ebx\r
+ 13292: 99 cltd \r
+ 13293: f7 7c 8b 78 idivl 0x78(%ebx,%ecx,4)\r
+ 13297: 89 55 b8 mov %edx,0xffffffb8(%ebp)\r
+ 1329a: 83 7d b8 00 cmpl $0x0,0xffffffb8(%ebp)\r
+ 1329e: 75 3e jne 132de <_ohci_urb_enqueue+0x177>\r
+ 132a0: eb 2c jmp 132ce <_ohci_urb_enqueue+0x167>\r
+ 132a2: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 132a5: 8b 40 14 mov 0x14(%eax),%eax\r
+ 132a8: 89 45 b8 mov %eax,0xffffffb8(%ebp)\r
+ 132ab: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 132ae: c1 e8 0f shr $0xf,%eax\r
+ 132b1: 83 e0 0f and $0xf,%eax\r
+ 132b4: 89 45 b4 mov %eax,0xffffffb4(%ebp)\r
+ 132b7: 8b 45 c4 mov 0xffffffc4(%ebp),%eax\r
+ 132ba: 8b 4d b4 mov 0xffffffb4(%ebp),%ecx\r
+ 132bd: 8b 5d b8 mov 0xffffffb8(%ebp),%ebx\r
+ 132c0: 99 cltd \r
+ 132c1: f7 7c 8b 38 idivl 0x38(%ebx,%ecx,4)\r
+ 132c5: 89 55 b8 mov %edx,0xffffffb8(%ebp)\r
+ 132c8: 83 7d b8 00 cmpl $0x0,0xffffffb8(%ebp)\r
+ 132cc: 75 10 jne 132de <_ohci_urb_enqueue+0x177>\r
+ 132ce: 8d 45 e0 lea 0xffffffe0(%ebp),%eax\r
+ 132d1: ff 00 incl (%eax)\r
+ 132d3: eb 09 jmp 132de <_ohci_urb_enqueue+0x177>\r
+ 132d5: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 132d8: 8b 40 44 mov 0x44(%eax),%eax\r
+ 132db: 89 45 e0 mov %eax,0xffffffe0(%ebp)\r
+ 132de: 83 ec 08 sub $0x8,%esp\r
+ 132e1: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 132e4: c1 e0 02 shl $0x2,%eax\r
+ 132e7: 83 c0 0c add $0xc,%eax\r
+ 132ea: 50 push %eax\r
+ 132eb: 6a 01 push $0x1\r
+ 132ed: e8 7e 12 00 00 call 14570 <_ExAllocatePool@8>\r
+ 132f2: 83 c4 08 add $0x8,%esp\r
+ 132f5: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 132f8: 83 7d ec 00 cmpl $0x0,0xffffffec(%ebp)\r
+ 132fc: 75 0c jne 1330a <_ohci_urb_enqueue+0x1a3>\r
+ 132fe: c7 45 cc f4 ff ff ff movl $0xfffffff4,0xffffffcc(%ebp)\r
+ 13305: e9 df 01 00 00 jmp 134e9 <_ohci_urb_enqueue+0x382>\r
+ 1330a: 83 ec 04 sub $0x4,%esp\r
+ 1330d: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 13310: c1 e0 02 shl $0x2,%eax\r
+ 13313: 83 c0 0c add $0xc,%eax\r
+ 13316: 50 push %eax\r
+ 13317: 6a 00 push $0x0\r
+ 13319: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 1331c: e8 7f 12 00 00 call 145a0 <_memset>\r
+ 13321: 83 c4 10 add $0x10,%esp\r
+ 13324: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 13327: 8b 45 e0 mov 0xffffffe0(%ebp),%eax\r
+ 1332a: 66 89 42 04 mov %ax,0x4(%edx)\r
+ 1332e: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 13331: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 13334: 89 02 mov %eax,(%edx)\r
+ 13336: c7 45 e4 00 00 00 00 movl $0x0,0xffffffe4(%ebp)\r
+ 1333d: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 13340: 3b 45 e0 cmp 0xffffffe0(%ebp),%eax\r
+ 13343: 7d 56 jge 1339b <_ohci_urb_enqueue+0x234>\r
+ 13345: 8b 5d ec mov 0xffffffec(%ebp),%ebx\r
+ 13348: 8b 75 e4 mov 0xffffffe4(%ebp),%esi\r
+ 1334b: 83 ec 08 sub $0x8,%esp\r
+ 1334e: ff 75 10 pushl 0x10(%ebp)\r
+ 13351: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 13354: e8 28 e4 ff ff call 11781 <_td_alloc>\r
+ 13359: 83 c4 10 add $0x10,%esp\r
+ 1335c: 89 44 b3 0c mov %eax,0xc(%ebx,%esi,4)\r
+ 13360: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 13363: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 13366: 83 7c 82 0c 00 cmpl $0x0,0xc(%edx,%eax,4)\r
+ 1336b: 75 27 jne 13394 <_ohci_urb_enqueue+0x22d>\r
+ 1336d: 8b 55 ec mov 0xffffffec(%ebp),%edx\r
+ 13370: 8b 45 e4 mov 0xffffffe4(%ebp),%eax\r
+ 13373: 66 89 42 04 mov %ax,0x4(%edx)\r
+ 13377: 83 ec 08 sub $0x8,%esp\r
+ 1337a: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 1337d: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 13380: e8 5c e5 ff ff call 118e1 <_urb_free_priv>\r
+ 13385: 83 c4 10 add $0x10,%esp\r
+ 13388: c7 45 cc f4 ff ff ff movl $0xfffffff4,0xffffffcc(%ebp)\r
+ 1338f: e9 55 01 00 00 jmp 134e9 <_ohci_urb_enqueue+0x382>\r
+ 13394: 8d 45 e4 lea 0xffffffe4(%ebp),%eax\r
+ 13397: ff 00 incl (%eax)\r
+ 13399: eb a2 jmp 1333d <_ohci_urb_enqueue+0x1d6>\r
+ 1339b: c7 45 dc 00 00 00 00 movl $0x0,0xffffffdc(%ebp)\r
+ 133a2: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 133a5: 83 b8 a4 01 00 00 00 cmpl $0x0,0x1a4(%eax)\r
+ 133ac: 75 0e jne 133bc <_ohci_urb_enqueue+0x255>\r
+ 133ae: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 133b1: 83 b8 a8 01 00 00 00 cmpl $0x0,0x1a8(%eax)\r
+ 133b8: 75 02 jne 133bc <_ohci_urb_enqueue+0x255>\r
+ 133ba: eb 0c jmp 133c8 <_ohci_urb_enqueue+0x261>\r
+ 133bc: c7 45 d8 ed ff ff ff movl $0xffffffed,0xffffffd8(%ebp)\r
+ 133c3: e9 04 01 00 00 jmp 134cc <_ohci_urb_enqueue+0x365>\r
+ 133c8: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 133cb: 80 78 28 00 cmpb $0x0,0x28(%eax)\r
+ 133cf: 0f 85 b0 00 00 00 jne 13485 <_ohci_urb_enqueue+0x31e>\r
+ 133d5: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 133d8: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 133db: e8 d2 e7 ff ff call 11bb2 <_ed_schedule>\r
+ 133e0: 83 c4 08 add $0x8,%esp\r
+ 133e3: 89 45 d8 mov %eax,0xffffffd8(%ebp)\r
+ 133e6: 83 7d d8 00 cmpl $0x0,0xffffffd8(%ebp)\r
+ 133ea: 79 05 jns 133f1 <_ohci_urb_enqueue+0x28a>\r
+ 133ec: e9 db 00 00 00 jmp 134cc <_ohci_urb_enqueue+0x365>\r
+ 133f1: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 133f4: 80 78 29 00 cmpb $0x0,0x29(%eax)\r
+ 133f8: 0f 85 b4 00 00 00 jne 134b2 <_ohci_urb_enqueue+0x34b>\r
+ 133fe: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 13401: 8b 40 08 mov 0x8(%eax),%eax\r
+ 13404: 66 8b 80 80 00 00 00 mov 0x80(%eax),%ax\r
+ 1340b: 66 89 45 d6 mov %ax,0xffffffd6(%ebp)\r
+ 1340f: 66 c7 45 d4 08 00 movw $0x8,0xffffffd4(%ebp)\r
+ 13415: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 13418: 66 8b 40 2c mov 0x2c(%eax),%ax\r
+ 1341c: 66 89 45 d2 mov %ax,0xffffffd2(%ebp)\r
+ 13420: 8b 45 d4 mov 0xffffffd4(%ebp),%eax\r
+ 13423: 66 3b 45 d2 cmp 0xffffffd2(%ebp),%ax\r
+ 13427: 76 10 jbe 13439 <_ohci_urb_enqueue+0x2d2>\r
+ 13429: 8b 45 d4 mov 0xffffffd4(%ebp),%eax\r
+ 1342c: 89 c2 mov %eax,%edx\r
+ 1342e: 81 e2 ff ff 00 00 and $0xffff,%edx\r
+ 13434: 89 55 bc mov %edx,0xffffffbc(%ebp)\r
+ 13437: eb 0f jmp 13448 <_ohci_urb_enqueue+0x2e1>\r
+ 13439: 66 8b 45 d2 mov 0xffffffd2(%ebp),%ax\r
+ 1343d: 89 c1 mov %eax,%ecx\r
+ 1343f: 81 e1 ff ff 00 00 and $0xffff,%ecx\r
+ 13445: 89 4d bc mov %ecx,0xffffffbc(%ebp)\r
+ 13448: 8d 45 d6 lea 0xffffffd6(%ebp),%eax\r
+ 1344b: 8b 5d bc mov 0xffffffbc(%ebp),%ebx\r
+ 1344e: 66 01 18 add %bx,(%eax)\r
+ 13451: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 13454: 66 8b 40 2c mov 0x2c(%eax),%ax\r
+ 13458: 48 dec %eax\r
+ 13459: 89 c2 mov %eax,%edx\r
+ 1345b: f7 d2 not %edx\r
+ 1345d: 8d 45 d6 lea 0xffffffd6(%ebp),%eax\r
+ 13460: 66 21 10 and %dx,(%eax)\r
+ 13463: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 13466: ba 00 00 00 00 mov $0x0,%edx\r
+ 1346b: 8a 50 2a mov 0x2a(%eax),%dl\r
+ 1346e: 8d 45 d6 lea 0xffffffd6(%ebp),%eax\r
+ 13471: 66 09 10 or %dx,(%eax)\r
+ 13474: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 13477: 66 8b 45 d6 mov 0xffffffd6(%ebp),%ax\r
+ 1347b: 25 ff ff 00 00 and $0xffff,%eax\r
+ 13480: 89 42 40 mov %eax,0x40(%edx)\r
+ 13483: eb 2d jmp 134b2 <_ohci_urb_enqueue+0x34b>\r
+ 13485: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 13488: 80 78 29 00 cmpb $0x0,0x29(%eax)\r
+ 1348c: 75 24 jne 134b2 <_ohci_urb_enqueue+0x34b>\r
+ 1348e: 8b 4d 0c mov 0xc(%ebp),%ecx\r
+ 13491: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 13494: 66 8b 40 30 mov 0x30(%eax),%ax\r
+ 13498: 89 c2 mov %eax,%edx\r
+ 1349a: 81 e2 ff ff 00 00 and $0xffff,%edx\r
+ 134a0: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 134a3: 66 8b 40 2c mov 0x2c(%eax),%ax\r
+ 134a7: 25 ff ff 00 00 and $0xffff,%eax\r
+ 134ac: 8d 04 02 lea (%edx,%eax,1),%eax\r
+ 134af: 89 41 40 mov %eax,0x40(%ecx)\r
+ 134b2: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 134b5: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 134b8: 89 42 08 mov %eax,0x8(%edx)\r
+ 134bb: 83 ec 08 sub $0x8,%esp\r
+ 134be: ff 75 0c pushl 0xc(%ebp)\r
+ 134c1: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 134c4: e8 a4 f0 ff ff call 1256d <_td_submit_urb>\r
+ 134c9: 83 c4 10 add $0x10,%esp\r
+ 134cc: 83 7d d8 00 cmpl $0x0,0xffffffd8(%ebp)\r
+ 134d0: 74 11 je 134e3 <_ohci_urb_enqueue+0x37c>\r
+ 134d2: 83 ec 08 sub $0x8,%esp\r
+ 134d5: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 134d8: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 134db: e8 01 e4 ff ff call 118e1 <_urb_free_priv>\r
+ 134e0: 83 c4 10 add $0x10,%esp\r
+ 134e3: 8b 45 d8 mov 0xffffffd8(%ebp),%eax\r
+ 134e6: 89 45 cc mov %eax,0xffffffcc(%ebp)\r
+ 134e9: 8b 45 cc mov 0xffffffcc(%ebp),%eax\r
+ 134ec: 8d 65 f8 lea 0xfffffff8(%ebp),%esp\r
+ 134ef: 5b pop %ebx\r
+ 134f0: 5e pop %esi\r
+ 134f1: 5d pop %ebp\r
+ 134f2: c3 ret \r
+\r
+000134f3 <_ohci_urb_dequeue>:\r
+ 134f3: 55 push %ebp\r
+ 134f4: 89 e5 mov %esp,%ebp\r
+ 134f6: 83 ec 18 sub $0x18,%esp\r
+ 134f9: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 134fc: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 134ff: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 13502: 2d 34 02 00 00 sub $0x234,%eax\r
+ 13507: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 1350a: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 13511: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13514: 83 b8 a4 01 00 00 00 cmpl $0x0,0x1a4(%eax)\r
+ 1351b: 75 36 jne 13553 <_ohci_urb_dequeue+0x60>\r
+ 1351d: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 13520: 8b 40 08 mov 0x8(%eax),%eax\r
+ 13523: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 13526: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 1352a: 74 4c je 13578 <_ohci_urb_dequeue+0x85>\r
+ 1352c: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 1352f: c7 40 08 01 00 00 00 movl $0x1,0x8(%eax)\r
+ 13536: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 13539: 8b 00 mov (%eax),%eax\r
+ 1353b: 80 78 28 02 cmpb $0x2,0x28(%eax)\r
+ 1353f: 75 37 jne 13578 <_ohci_urb_dequeue+0x85>\r
+ 13541: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 13544: ff 30 pushl (%eax)\r
+ 13546: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13549: e8 be ed ff ff call 1230c <_start_urb_unlink>\r
+ 1354e: 83 c4 08 add $0x8,%esp\r
+ 13551: eb 25 jmp 13578 <_ohci_urb_dequeue+0x85>\r
+ 13553: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 13556: 83 78 08 00 cmpl $0x0,0x8(%eax)\r
+ 1355a: 74 1c je 13578 <_ohci_urb_dequeue+0x85>\r
+ 1355c: 83 ec 04 sub $0x4,%esp\r
+ 1355f: 6a 00 push $0x0\r
+ 13561: ff 75 0c pushl 0xc(%ebp)\r
+ 13564: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13567: e8 db e3 ff ff call 11947 <_finish_urb>\r
+ 1356c: 83 c4 10 add $0x10,%esp\r
+ 1356f: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13572: c7 00 01 00 00 00 movl $0x1,(%eax)\r
+ 13578: b8 00 00 00 00 mov $0x0,%eax\r
+ 1357d: c9 leave \r
+ 1357e: c3 ret \r
+\r
+0001357f <_ohci_endpoint_disable>:\r
+ 1357f: 55 push %ebp\r
+ 13580: 89 e5 mov %esp,%ebp\r
+ 13582: 83 ec 18 sub $0x18,%esp\r
+ 13585: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13588: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 1358b: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1358e: 2d 34 02 00 00 sub $0x234,%eax\r
+ 13593: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 13596: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 13599: 83 e0 0f and $0xf,%eax\r
+ 1359c: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 1359f: 8d 45 f8 lea 0xfffffff8(%ebp),%eax\r
+ 135a2: d1 20 shll (%eax)\r
+ 135a4: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 135a8: 74 13 je 135bd <_ohci_endpoint_disable+0x3e>\r
+ 135aa: 8b 45 10 mov 0x10(%ebp),%eax\r
+ 135ad: c1 e8 07 shr $0x7,%eax\r
+ 135b0: 83 e0 01 and $0x1,%eax\r
+ 135b3: 85 c0 test %eax,%eax\r
+ 135b5: 75 06 jne 135bd <_ohci_endpoint_disable+0x3e>\r
+ 135b7: 8d 45 f8 lea 0xfffffff8(%ebp),%eax\r
+ 135ba: 83 08 01 orl $0x1,(%eax)\r
+ 135bd: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 135c4: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 135c7: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 135ca: 8b 44 90 10 mov 0x10(%eax,%edx,4),%eax\r
+ 135ce: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 135d1: 83 7d f0 00 cmpl $0x0,0xfffffff0(%ebp)\r
+ 135d5: 75 05 jne 135dc <_ohci_endpoint_disable+0x5d>\r
+ 135d7: e9 ac 00 00 00 jmp 13688 <_ohci_endpoint_disable+0x109>\r
+ 135dc: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 135df: 8b 80 14 03 00 00 mov 0x314(%eax),%eax\r
+ 135e5: 83 e0 01 and $0x1,%eax\r
+ 135e8: 85 c0 test %eax,%eax\r
+ 135ea: 74 0e je 135fa <_ohci_endpoint_disable+0x7b>\r
+ 135ec: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 135ef: 83 b8 a4 01 00 00 00 cmpl $0x0,0x1a4(%eax)\r
+ 135f6: 75 02 jne 135fa <_ohci_endpoint_disable+0x7b>\r
+ 135f8: eb 07 jmp 13601 <_ohci_endpoint_disable+0x82>\r
+ 135fa: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 135fd: c6 40 28 00 movb $0x0,0x28(%eax)\r
+ 13601: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 13604: ba 00 00 00 00 mov $0x0,%edx\r
+ 13609: 8a 50 28 mov 0x28(%eax),%dl\r
+ 1360c: 89 55 ec mov %edx,0xffffffec(%ebp)\r
+ 1360f: 83 7d ec 00 cmpl $0x0,0xffffffec(%ebp)\r
+ 13613: 74 17 je 1362c <_ohci_endpoint_disable+0xad>\r
+ 13615: 83 7d ec 01 cmpl $0x1,0xffffffec(%ebp)\r
+ 13619: 74 02 je 1361d <_ohci_endpoint_disable+0x9e>\r
+ 1361b: eb 49 jmp 13666 <_ohci_endpoint_disable+0xe7>\r
+ 1361d: 83 ec 0c sub $0xc,%esp\r
+ 13620: 6a 01 push $0x1\r
+ 13622: e8 9d 0d 00 00 call 143c4 <_my_schedule_timeout>\r
+ 13627: 83 c4 10 add $0x10,%esp\r
+ 1362a: eb 91 jmp 135bd <_ohci_endpoint_disable+0x3e>\r
+ 1362c: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 1362f: 83 c0 20 add $0x20,%eax\r
+ 13632: 50 push %eax\r
+ 13633: e8 30 fa ff ff call 13068 <_list_empty>\r
+ 13638: 83 c4 04 add $0x4,%esp\r
+ 1363b: 85 c0 test %eax,%eax\r
+ 1363d: 74 27 je 13666 <_ohci_endpoint_disable+0xe7>\r
+ 1363f: 83 ec 08 sub $0x8,%esp\r
+ 13642: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 13645: ff 70 14 pushl 0x14(%eax)\r
+ 13648: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 1364b: e8 aa e1 ff ff call 117fa <_td_free>\r
+ 13650: 83 c4 10 add $0x10,%esp\r
+ 13653: 83 ec 08 sub $0x8,%esp\r
+ 13656: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 13659: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 1365c: e8 6a e2 ff ff call 118cb <_ed_free>\r
+ 13661: 83 c4 10 add $0x10,%esp\r
+ 13664: eb 14 jmp 1367a <_ohci_endpoint_disable+0xfb>\r
+ 13666: 83 ec 08 sub $0x8,%esp\r
+ 13669: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 1366c: ff 70 14 pushl 0x14(%eax)\r
+ 1366f: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13672: e8 83 e1 ff ff call 117fa <_td_free>\r
+ 13677: 83 c4 10 add $0x10,%esp\r
+ 1367a: 8b 55 0c mov 0xc(%ebp),%edx\r
+ 1367d: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 13680: c7 44 82 10 00 00 00 movl $0x0,0x10(%edx,%eax,4)\r
+ 13687: 00 \r
+ 13688: c9 leave \r
+ 13689: c3 ret \r
+\r
+0001368a <_ohci_get_frame>:\r
+ 1368a: 55 push %ebp\r
+ 1368b: 89 e5 mov %esp,%ebp\r
+ 1368d: 83 ec 08 sub $0x8,%esp\r
+ 13690: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13693: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 13696: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 13699: 2d 34 02 00 00 sub $0x234,%eax\r
+ 1369e: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 136a1: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 136a4: 8b 40 08 mov 0x8(%eax),%eax\r
+ 136a7: 66 8b 80 80 00 00 00 mov 0x80(%eax),%ax\r
+ 136ae: 25 ff ff 00 00 and $0xffff,%eax\r
+ 136b3: c9 leave \r
+ 136b4: c3 ret \r
+\r
+000136b5 <_hc_reset>:\r
+ 136b5: 55 push %ebp\r
+ 136b6: 89 e5 mov %esp,%ebp\r
+ 136b8: 83 ec 18 sub $0x18,%esp\r
+ 136bb: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 136be: 8b 40 04 mov 0x4(%eax),%eax\r
+ 136c1: 83 c0 14 add $0x14,%eax\r
+ 136c4: c7 00 00 00 00 80 movl $0x80000000,(%eax)\r
+ 136ca: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 136cd: 8b 40 04 mov 0x4(%eax),%eax\r
+ 136d0: 83 c0 0c add $0xc,%eax\r
+ 136d3: 8b 00 mov (%eax),%eax\r
+ 136d5: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 136d8: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 136db: 8b 50 04 mov 0x4(%eax),%edx\r
+ 136de: 83 c2 0c add $0xc,%edx\r
+ 136e1: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 136e4: 89 02 mov %eax,(%edx)\r
+ 136e6: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 136e9: 8b 40 04 mov 0x4(%eax),%eax\r
+ 136ec: 83 c0 04 add $0x4,%eax\r
+ 136ef: 8b 00 mov (%eax),%eax\r
+ 136f1: c1 e8 08 shr $0x8,%eax\r
+ 136f4: 83 e0 01 and $0x1,%eax\r
+ 136f7: 85 c0 test %eax,%eax\r
+ 136f9: 74 1f je 1371a <_hc_reset+0x65>\r
+ 136fb: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 136fe: 8b 40 04 mov 0x4(%eax),%eax\r
+ 13701: 83 c0 04 add $0x4,%eax\r
+ 13704: 8b 00 mov (%eax),%eax\r
+ 13706: 80 e4 fe and $0xfe,%ah\r
+ 13709: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 1370c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1370f: 8b 50 04 mov 0x4(%eax),%edx\r
+ 13712: 83 c2 04 add $0x4,%edx\r
+ 13715: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 13718: 89 02 mov %eax,(%edx)\r
+ 1371a: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 1371d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13720: 8b 40 04 mov 0x4(%eax),%eax\r
+ 13723: 83 c0 04 add $0x4,%eax\r
+ 13726: 8b 00 mov (%eax),%eax\r
+ 13728: 89 82 2c 02 00 00 mov %eax,0x22c(%edx)\r
+ 1372e: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 13731: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13734: 8b 80 2c 02 00 00 mov 0x22c(%eax),%eax\r
+ 1373a: 25 00 02 00 00 and $0x200,%eax\r
+ 1373f: 89 82 2c 02 00 00 mov %eax,0x22c(%edx)\r
+ 13745: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13748: 8b 50 04 mov 0x4(%eax),%edx\r
+ 1374b: 83 c2 04 add $0x4,%edx\r
+ 1374e: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13751: 8b 80 2c 02 00 00 mov 0x22c(%eax),%eax\r
+ 13757: 89 02 mov %eax,(%edx)\r
+ 13759: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1375c: 8b 40 04 mov 0x4(%eax),%eax\r
+ 1375f: 83 c0 04 add $0x4,%eax\r
+ 13762: 8b 00 mov (%eax),%eax\r
+ 13764: 83 ec 0c sub $0xc,%esp\r
+ 13767: 6a 32 push $0x32\r
+ 13769: e8 92 08 00 00 call 14000 <_wait_ms>\r
+ 1376e: 83 c4 10 add $0x10,%esp\r
+ 13771: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13774: 8b 40 04 mov 0x4(%eax),%eax\r
+ 13777: 83 c0 08 add $0x8,%eax\r
+ 1377a: c7 00 01 00 00 00 movl $0x1,(%eax)\r
+ 13780: c7 45 fc 1e 00 00 00 movl $0x1e,0xfffffffc(%ebp)\r
+ 13787: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1378a: 8b 40 04 mov 0x4(%eax),%eax\r
+ 1378d: 83 c0 08 add $0x8,%eax\r
+ 13790: 8b 00 mov (%eax),%eax\r
+ 13792: 83 e0 01 and $0x1,%eax\r
+ 13795: 85 c0 test %eax,%eax\r
+ 13797: 74 23 je 137bc <_hc_reset+0x107>\r
+ 13799: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 1379c: ff 08 decl (%eax)\r
+ 1379e: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 137a2: 75 09 jne 137ad <_hc_reset+0xf8>\r
+ 137a4: c7 45 f0 ff ff ff ff movl $0xffffffff,0xfffffff0(%ebp)\r
+ 137ab: eb 35 jmp 137e2 <_hc_reset+0x12d>\r
+ 137ad: 83 ec 0c sub $0xc,%esp\r
+ 137b0: 6a 01 push $0x1\r
+ 137b2: e8 49 08 00 00 call 14000 <_wait_ms>\r
+ 137b7: 83 c4 10 add $0x10,%esp\r
+ 137ba: eb cb jmp 13787 <_hc_reset+0xd2>\r
+ 137bc: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 137bf: 8b 50 04 mov 0x4(%eax),%edx\r
+ 137c2: 83 c2 04 add $0x4,%edx\r
+ 137c5: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 137c8: 8b 80 2c 02 00 00 mov 0x22c(%eax),%eax\r
+ 137ce: 89 02 mov %eax,(%edx)\r
+ 137d0: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 137d3: 8b 40 04 mov 0x4(%eax),%eax\r
+ 137d6: 83 c0 04 add $0x4,%eax\r
+ 137d9: 8b 00 mov (%eax),%eax\r
+ 137db: c7 45 f0 00 00 00 00 movl $0x0,0xfffffff0(%ebp)\r
+ 137e2: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 137e5: c9 leave \r
+ 137e6: c3 ret \r
+\r
+000137e7 <_hc_start>:\r
+ 137e7: 55 push %ebp\r
+ 137e8: 89 e5 mov %esp,%ebp\r
+ 137ea: 53 push %ebx\r
+ 137eb: 83 ec 14 sub $0x14,%esp\r
+ 137ee: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 137f1: c7 80 a4 01 00 00 01 movl $0x1,0x1a4(%eax)\r
+ 137f8: 00 00 00 \r
+ 137fb: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 137fe: c7 80 a8 01 00 00 00 movl $0x0,0x1a8(%eax)\r
+ 13805: 00 00 00 \r
+ 13808: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1380b: 8b 40 04 mov 0x4(%eax),%eax\r
+ 1380e: 83 c0 20 add $0x20,%eax\r
+ 13811: c7 00 00 00 00 00 movl $0x0,(%eax)\r
+ 13817: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1381a: 8b 40 04 mov 0x4(%eax),%eax\r
+ 1381d: 83 c0 28 add $0x28,%eax\r
+ 13820: c7 00 00 00 00 00 movl $0x0,(%eax)\r
+ 13826: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13829: 8b 50 04 mov 0x4(%eax),%edx\r
+ 1382c: 83 c2 18 add $0x18,%edx\r
+ 1382f: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13832: 8b 40 0c mov 0xc(%eax),%eax\r
+ 13835: 89 02 mov %eax,(%edx)\r
+ 13837: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1383a: 8b 40 04 mov 0x4(%eax),%eax\r
+ 1383d: 83 c0 34 add $0x34,%eax\r
+ 13840: c7 00 df 2e 78 27 movl $0x27782edf,(%eax)\r
+ 13846: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13849: 8b 40 04 mov 0x4(%eax),%eax\r
+ 1384c: 83 c0 40 add $0x40,%eax\r
+ 1384f: c7 00 2f 2a 00 00 movl $0x2a2f,(%eax)\r
+ 13855: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13858: 8b 40 04 mov 0x4(%eax),%eax\r
+ 1385b: 83 c0 44 add $0x44,%eax\r
+ 1385e: c7 00 28 06 00 00 movl $0x628,(%eax)\r
+ 13864: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13867: 8b 40 04 mov 0x4(%eax),%eax\r
+ 1386a: 83 c0 34 add $0x34,%eax\r
+ 1386d: 8b 00 mov (%eax),%eax\r
+ 1386f: 25 00 00 ff 3f and $0x3fff0000,%eax\r
+ 13874: 85 c0 test %eax,%eax\r
+ 13876: 74 0f je 13887 <_hc_start+0xa0>\r
+ 13878: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1387b: 8b 40 04 mov 0x4(%eax),%eax\r
+ 1387e: 83 c0 40 add $0x40,%eax\r
+ 13881: 8b 00 mov (%eax),%eax\r
+ 13883: 85 c0 test %eax,%eax\r
+ 13885: 75 0c jne 13893 <_hc_start+0xac>\r
+ 13887: c7 45 e8 b5 ff ff ff movl $0xffffffb5,0xffffffe8(%ebp)\r
+ 1388e: e9 22 02 00 00 jmp 13ab5 <_hc_start+0x2ce>\r
+ 13893: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 13896: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13899: 8b 80 2c 02 00 00 mov 0x22c(%eax),%eax\r
+ 1389f: 25 00 02 00 00 and $0x200,%eax\r
+ 138a4: 89 82 2c 02 00 00 mov %eax,0x22c(%edx)\r
+ 138aa: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 138ad: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 138b0: 8b 80 2c 02 00 00 mov 0x22c(%eax),%eax\r
+ 138b6: 0c 8f or $0x8f,%al\r
+ 138b8: 89 82 2c 02 00 00 mov %eax,0x22c(%edx)\r
+ 138be: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 138c1: c7 80 a4 01 00 00 00 movl $0x0,0x1a4(%eax)\r
+ 138c8: 00 00 00 \r
+ 138cb: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 138ce: 8b 50 04 mov 0x4(%eax),%edx\r
+ 138d1: 83 c2 04 add $0x4,%edx\r
+ 138d4: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 138d7: 8b 80 2c 02 00 00 mov 0x22c(%eax),%eax\r
+ 138dd: 89 02 mov %eax,(%edx)\r
+ 138df: c7 45 f8 12 00 00 80 movl $0x80000012,0xfffffff8(%ebp)\r
+ 138e6: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 138e9: 8b 50 04 mov 0x4(%eax),%edx\r
+ 138ec: 83 c2 0c add $0xc,%edx\r
+ 138ef: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 138f2: 89 02 mov %eax,(%edx)\r
+ 138f4: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 138f7: 8b 50 04 mov 0x4(%eax),%edx\r
+ 138fa: 83 c2 10 add $0x10,%edx\r
+ 138fd: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 13900: 89 02 mov %eax,(%edx)\r
+ 13902: 83 ec 0c sub $0xc,%esp\r
+ 13905: ff 75 08 pushl 0x8(%ebp)\r
+ 13908: e8 f3 d6 ff ff call 11000 <__end__>\r
+ 1390d: 83 c4 10 add $0x10,%esp\r
+ 13910: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 13913: 8d 45 f4 lea 0xfffffff4(%ebp),%eax\r
+ 13916: 81 20 ff f6 ff ff andl $0xfffff6ff,(%eax)\r
+ 1391c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1391f: 8b 80 30 02 00 00 mov 0x230(%eax),%eax\r
+ 13925: d1 e8 shr %eax\r
+ 13927: 83 e0 01 and $0x1,%eax\r
+ 1392a: 85 c0 test %eax,%eax\r
+ 1392c: 74 14 je 13942 <_hc_start+0x15b>\r
+ 1392e: 8d 45 f4 lea 0xfffffff4(%ebp),%eax\r
+ 13931: 81 08 00 10 00 00 orl $0x1000,(%eax)\r
+ 13937: 8d 45 f4 lea 0xfffffff4(%ebp),%eax\r
+ 1393a: 81 20 ff fd ff 00 andl $0xfffdff,(%eax)\r
+ 13940: eb 09 jmp 1394b <_hc_start+0x164>\r
+ 13942: 8d 45 f4 lea 0xfffffff4(%ebp),%eax\r
+ 13945: 81 08 00 02 00 00 orl $0x200,(%eax)\r
+ 1394b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1394e: 8b 50 04 mov 0x4(%eax),%edx\r
+ 13951: 83 c2 48 add $0x48,%edx\r
+ 13954: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 13957: 89 02 mov %eax,(%edx)\r
+ 13959: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1395c: 8b 40 04 mov 0x4(%eax),%eax\r
+ 1395f: 83 c0 50 add $0x50,%eax\r
+ 13962: c7 00 00 00 01 00 movl $0x10000,(%eax)\r
+ 13968: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1396b: 8b 40 04 mov 0x4(%eax),%eax\r
+ 1396e: 83 c0 4c add $0x4c,%eax\r
+ 13971: c7 00 00 00 00 00 movl $0x0,(%eax)\r
+ 13977: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1397a: 8b 40 04 mov 0x4(%eax),%eax\r
+ 1397d: 83 c0 04 add $0x4,%eax\r
+ 13980: 8b 00 mov (%eax),%eax\r
+ 13982: 83 ec 0c sub $0xc,%esp\r
+ 13985: ff 75 08 pushl 0x8(%ebp)\r
+ 13988: e8 73 d6 ff ff call 11000 <__end__>\r
+ 1398d: 83 c4 04 add $0x4,%esp\r
+ 13990: 6a 00 push $0x0\r
+ 13992: e8 69 06 00 00 call 14000 <_wait_ms>\r
+ 13997: 83 c4 10 add $0x10,%esp\r
+ 1399a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1399d: 05 34 02 00 00 add $0x234,%eax\r
+ 139a2: 50 push %eax\r
+ 139a3: e8 d3 dc ff ff call 1167b <_hcd_to_bus>\r
+ 139a8: 83 c4 04 add $0x4,%esp\r
+ 139ab: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 139ae: 8b 5d ec mov 0xffffffec(%ebp),%ebx\r
+ 139b1: 83 ec 08 sub $0x8,%esp\r
+ 139b4: ff 75 ec pushl 0xffffffec(%ebp)\r
+ 139b7: 6a 00 push $0x0\r
+ 139b9: e8 22 0c 00 00 call 145e0 <_usb_alloc_dev@8>\r
+ 139be: 83 c4 08 add $0x8,%esp\r
+ 139c1: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 139c4: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 139c7: 89 43 24 mov %eax,0x24(%ebx)\r
+ 139ca: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 139cd: c7 80 14 03 00 00 03 movl $0x3,0x314(%eax)\r
+ 139d4: 00 00 00 \r
+ 139d7: 83 7d f0 00 cmpl $0x0,0xfffffff0(%ebp)\r
+ 139db: 75 3f jne 13a1c <_hc_start+0x235>\r
+ 139dd: ff 75 08 pushl 0x8(%ebp)\r
+ 139e0: e8 76 d6 ff ff call 1105b <_disable>\r
+ 139e5: 83 c4 04 add $0x4,%esp\r
+ 139e8: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 139eb: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 139ee: 8b 80 2c 02 00 00 mov 0x22c(%eax),%eax\r
+ 139f4: 24 3f and $0x3f,%al\r
+ 139f6: 89 82 2c 02 00 00 mov %eax,0x22c(%edx)\r
+ 139fc: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 139ff: 8b 50 04 mov 0x4(%eax),%edx\r
+ 13a02: 83 c2 04 add $0x4,%edx\r
+ 13a05: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13a08: 8b 80 2c 02 00 00 mov 0x22c(%eax),%eax\r
+ 13a0e: 89 02 mov %eax,(%edx)\r
+ 13a10: c7 45 e8 f4 ff ff ff movl $0xfffffff4,0xffffffe8(%ebp)\r
+ 13a17: e9 99 00 00 00 jmp 13ab5 <_hc_start+0x2ce>\r
+ 13a1c: 83 ec 0c sub $0xc,%esp\r
+ 13a1f: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 13a22: e8 c9 0b 00 00 call 145f0 <_usb_connect@4>\r
+ 13a27: 83 c4 0c add $0xc,%esp\r
+ 13a2a: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 13a2d: c7 40 18 02 00 00 00 movl $0x2,0x18(%eax)\r
+ 13a34: 83 ec 0c sub $0xc,%esp\r
+ 13a37: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13a3a: 05 34 02 00 00 add $0x234,%eax\r
+ 13a3f: 50 push %eax\r
+ 13a40: e8 7d 00 00 00 call 13ac2 <_hcd_register_root>\r
+ 13a45: 83 c4 10 add $0x10,%esp\r
+ 13a48: 85 c0 test %eax,%eax\r
+ 13a4a: 74 54 je 13aa0 <_hc_start+0x2b9>\r
+ 13a4c: 83 ec 0c sub $0xc,%esp\r
+ 13a4f: ff 75 f0 pushl 0xfffffff0(%ebp)\r
+ 13a52: e8 a9 0b 00 00 call 14600 <_usb_put_dev@4>\r
+ 13a57: 83 c4 0c add $0xc,%esp\r
+ 13a5a: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 13a5d: c7 40 24 00 00 00 00 movl $0x0,0x24(%eax)\r
+ 13a64: ff 75 08 pushl 0x8(%ebp)\r
+ 13a67: e8 ef d5 ff ff call 1105b <_disable>\r
+ 13a6c: 83 c4 04 add $0x4,%esp\r
+ 13a6f: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 13a72: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13a75: 8b 80 2c 02 00 00 mov 0x22c(%eax),%eax\r
+ 13a7b: 24 3f and $0x3f,%al\r
+ 13a7d: 89 82 2c 02 00 00 mov %eax,0x22c(%edx)\r
+ 13a83: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13a86: 8b 50 04 mov 0x4(%eax),%edx\r
+ 13a89: 83 c2 04 add $0x4,%edx\r
+ 13a8c: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13a8f: 8b 80 2c 02 00 00 mov 0x22c(%eax),%eax\r
+ 13a95: 89 02 mov %eax,(%edx)\r
+ 13a97: c7 45 e8 ed ff ff ff movl $0xffffffed,0xffffffe8(%ebp)\r
+ 13a9e: eb 15 jmp 13ab5 <_hc_start+0x2ce>\r
+ 13aa0: 83 ec 0c sub $0xc,%esp\r
+ 13aa3: ff 75 08 pushl 0x8(%ebp)\r
+ 13aa6: e8 12 00 00 00 call 13abd <_create_debug_files>\r
+ 13aab: 83 c4 10 add $0x10,%esp\r
+ 13aae: c7 45 e8 00 00 00 00 movl $0x0,0xffffffe8(%ebp)\r
+ 13ab5: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 13ab8: 8b 5d fc mov 0xfffffffc(%ebp),%ebx\r
+ 13abb: c9 leave \r
+ 13abc: c3 ret \r
+\r
+00013abd <_create_debug_files>:\r
+ 13abd: 55 push %ebp\r
+ 13abe: 89 e5 mov %esp,%ebp\r
+ 13ac0: 5d pop %ebp\r
+ 13ac1: c3 ret \r
+\r
+00013ac2 <_hcd_register_root>:\r
+ 13ac2: 55 push %ebp\r
+ 13ac3: 89 e5 mov %esp,%ebp\r
+ 13ac5: 83 ec 08 sub $0x8,%esp\r
+ 13ac8: 83 ec 08 sub $0x8,%esp\r
+ 13acb: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13ace: ff b0 80 00 00 00 pushl 0x80(%eax)\r
+ 13ad4: ff 75 08 pushl 0x8(%ebp)\r
+ 13ad7: e8 9f db ff ff call 1167b <_hcd_to_bus>\r
+ 13adc: 83 c4 04 add $0x4,%esp\r
+ 13adf: ff 70 24 pushl 0x24(%eax)\r
+ 13ae2: e8 29 0b 00 00 call 14610 <_usb_register_root_hub@8>\r
+ 13ae7: 83 c4 08 add $0x8,%esp\r
+ 13aea: c9 leave \r
+ 13aeb: c3 ret \r
+\r
+00013aec <_ohci_irq>:\r
+ 13aec: 55 push %ebp\r
+ 13aed: 89 e5 mov %esp,%ebp\r
+ 13aef: 83 ec 18 sub $0x18,%esp\r
+ 13af2: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13af5: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 13af8: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 13afb: 2d 34 02 00 00 sub $0x234,%eax\r
+ 13b00: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 13b03: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13b06: 8b 40 04 mov 0x4(%eax),%eax\r
+ 13b09: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 13b0c: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13b0f: 8b 40 08 mov 0x8(%eax),%eax\r
+ 13b12: 83 b8 84 00 00 00 00 cmpl $0x0,0x84(%eax)\r
+ 13b19: 74 1d je 13b38 <_ohci_irq+0x4c>\r
+ 13b1b: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13b1e: 8b 40 08 mov 0x8(%eax),%eax\r
+ 13b21: 05 84 00 00 00 add $0x84,%eax\r
+ 13b26: 8b 00 mov (%eax),%eax\r
+ 13b28: 83 e0 01 and $0x1,%eax\r
+ 13b2b: 85 c0 test %eax,%eax\r
+ 13b2d: 75 09 jne 13b38 <_ohci_irq+0x4c>\r
+ 13b2f: c7 45 f4 02 00 00 00 movl $0x2,0xfffffff4(%ebp)\r
+ 13b36: eb 39 jmp 13b71 <_ohci_irq+0x85>\r
+ 13b38: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 13b3b: 83 c0 0c add $0xc,%eax\r
+ 13b3e: 8b 00 mov (%eax),%eax\r
+ 13b40: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 13b43: 83 f8 ff cmp $0xffffffff,%eax\r
+ 13b46: 75 10 jne 13b58 <_ohci_irq+0x6c>\r
+ 13b48: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13b4b: e8 0b d5 ff ff call 1105b <_disable>\r
+ 13b50: 83 c4 04 add $0x4,%esp\r
+ 13b53: e9 0d 01 00 00 jmp 13c65 <_ohci_irq+0x179>\r
+ 13b58: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 13b5b: 83 c0 10 add $0x10,%eax\r
+ 13b5e: 8b 10 mov (%eax),%edx\r
+ 13b60: 8d 45 f4 lea 0xfffffff4(%ebp),%eax\r
+ 13b63: 21 10 and %edx,(%eax)\r
+ 13b65: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 13b68: 85 c0 test %eax,%eax\r
+ 13b6a: 75 05 jne 13b71 <_ohci_irq+0x85>\r
+ 13b6c: e9 f4 00 00 00 jmp 13c65 <_ohci_irq+0x179>\r
+ 13b71: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 13b74: c1 e8 04 shr $0x4,%eax\r
+ 13b77: 83 e0 01 and $0x1,%eax\r
+ 13b7a: 85 c0 test %eax,%eax\r
+ 13b7c: 74 29 je 13ba7 <_ohci_irq+0xbb>\r
+ 13b7e: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13b81: e8 d5 d4 ff ff call 1105b <_disable>\r
+ 13b86: 83 c4 04 add $0x4,%esp\r
+ 13b89: 83 ec 08 sub $0x8,%esp\r
+ 13b8c: 6a 01 push $0x1\r
+ 13b8e: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13b91: e8 d1 00 00 00 call 13c67 <_ohci_dump>\r
+ 13b96: 83 c4 10 add $0x10,%esp\r
+ 13b99: 83 ec 0c sub $0xc,%esp\r
+ 13b9c: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13b9f: e8 11 fb ff ff call 136b5 <_hc_reset>\r
+ 13ba4: 83 c4 10 add $0x10,%esp\r
+ 13ba7: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 13baa: d1 e8 shr %eax\r
+ 13bac: 83 e0 01 and $0x1,%eax\r
+ 13baf: 85 c0 test %eax,%eax\r
+ 13bb1: 74 38 je 13beb <_ohci_irq+0xff>\r
+ 13bb3: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 13bb6: 83 c0 14 add $0x14,%eax\r
+ 13bb9: c7 00 02 00 00 00 movl $0x2,(%eax)\r
+ 13bbf: 83 ec 04 sub $0x4,%esp\r
+ 13bc2: ff 75 0c pushl 0xc(%ebp)\r
+ 13bc5: 83 ec 04 sub $0x4,%esp\r
+ 13bc8: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13bcb: e8 b0 ef ff ff call 12b80 <_dl_reverse_done_list>\r
+ 13bd0: 83 c4 08 add $0x8,%esp\r
+ 13bd3: 50 push %eax\r
+ 13bd4: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13bd7: e8 a1 f4 ff ff call 1307d <_dl_done_list>\r
+ 13bdc: 83 c4 10 add $0x10,%esp\r
+ 13bdf: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 13be2: 83 c0 10 add $0x10,%eax\r
+ 13be5: c7 00 02 00 00 00 movl $0x2,(%eax)\r
+ 13beb: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13bee: c7 00 01 00 00 00 movl $0x1,(%eax)\r
+ 13bf4: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13bf7: 83 78 10 00 cmpl $0x0,0x10(%eax)\r
+ 13bfb: 74 24 je 13c21 <_ohci_irq+0x135>\r
+ 13bfd: 83 ec 04 sub $0x4,%esp\r
+ 13c00: ff 75 0c pushl 0xc(%ebp)\r
+ 13c03: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13c06: 8b 40 08 mov 0x8(%eax),%eax\r
+ 13c09: 66 8b 80 80 00 00 00 mov 0x80(%eax),%ax\r
+ 13c10: 25 ff ff 00 00 and $0xffff,%eax\r
+ 13c15: 50 push %eax\r
+ 13c16: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13c19: e8 54 f1 ff ff call 12d72 <_finish_unlinks>\r
+ 13c1e: 83 c4 10 add $0x10,%esp\r
+ 13c21: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 13c24: c1 e8 02 shr $0x2,%eax\r
+ 13c27: 83 e0 01 and $0x1,%eax\r
+ 13c2a: 85 c0 test %eax,%eax\r
+ 13c2c: 74 15 je 13c43 <_ohci_irq+0x157>\r
+ 13c2e: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13c31: 83 78 10 00 cmpl $0x0,0x10(%eax)\r
+ 13c35: 75 0c jne 13c43 <_ohci_irq+0x157>\r
+ 13c37: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 13c3a: 83 c0 14 add $0x14,%eax\r
+ 13c3d: c7 00 04 00 00 00 movl $0x4,(%eax)\r
+ 13c43: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 13c46: 83 c2 0c add $0xc,%edx\r
+ 13c49: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 13c4c: 89 02 mov %eax,(%edx)\r
+ 13c4e: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 13c51: 83 c0 10 add $0x10,%eax\r
+ 13c54: c7 00 00 00 00 80 movl $0x80000000,(%eax)\r
+ 13c5a: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13c5d: 8b 40 04 mov 0x4(%eax),%eax\r
+ 13c60: 83 c0 04 add $0x4,%eax\r
+ 13c63: 8b 00 mov (%eax),%eax\r
+ 13c65: c9 leave \r
+ 13c66: c3 ret \r
+\r
+00013c67 <_ohci_dump>:\r
+ 13c67: 55 push %ebp\r
+ 13c68: 89 e5 mov %esp,%ebp\r
+ 13c6a: 5d pop %ebp\r
+ 13c6b: c3 ret \r
+\r
+00013c6c <_ohci_stop>:\r
+ 13c6c: 55 push %ebp\r
+ 13c6d: 89 e5 mov %esp,%ebp\r
+ 13c6f: 83 ec 18 sub $0x18,%esp\r
+ 13c72: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13c75: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 13c78: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 13c7b: 2d 34 02 00 00 sub $0x234,%eax\r
+ 13c80: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 13c83: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13c86: 8b 40 04 mov 0x4(%eax),%eax\r
+ 13c89: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 13c8c: 6a 01 push $0x1\r
+ 13c8e: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13c91: e8 d1 ff ff ff call 13c67 <_ohci_dump>\r
+ 13c96: 83 c4 08 add $0x8,%esp\r
+ 13c99: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13c9c: 83 b8 a4 01 00 00 00 cmpl $0x0,0x1a4(%eax)\r
+ 13ca3: 75 0e jne 13cb3 <_ohci_stop+0x47>\r
+ 13ca5: 83 ec 0c sub $0xc,%esp\r
+ 13ca8: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13cab: e8 05 fa ff ff call 136b5 <_hc_reset>\r
+ 13cb0: 83 c4 10 add $0x10,%esp\r
+ 13cb3: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 13cb6: 83 c0 14 add $0x14,%eax\r
+ 13cb9: c7 00 00 00 00 80 movl $0x80000000,(%eax)\r
+ 13cbf: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 13cc2: 83 c0 0c add $0xc,%eax\r
+ 13cc5: 8b 00 mov (%eax),%eax\r
+ 13cc7: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 13cca: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 13ccd: 83 c2 0c add $0xc,%edx\r
+ 13cd0: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 13cd3: 89 02 mov %eax,(%edx)\r
+ 13cd5: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13cd8: 8b 40 04 mov 0x4(%eax),%eax\r
+ 13cdb: 83 c0 04 add $0x4,%eax\r
+ 13cde: 8b 00 mov (%eax),%eax\r
+ 13ce0: 83 ec 0c sub $0xc,%esp\r
+ 13ce3: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13ce6: e8 3e 00 00 00 call 13d29 <_remove_debug_files>\r
+ 13ceb: 83 c4 10 add $0x10,%esp\r
+ 13cee: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 13cf1: e8 54 da ff ff call 1174a <_ohci_mem_cleanup>\r
+ 13cf6: 83 c4 04 add $0x4,%esp\r
+ 13cf9: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13cfc: 83 78 08 00 cmpl $0x0,0x8(%eax)\r
+ 13d00: 74 25 je 13d27 <_ohci_stop+0xbb>\r
+ 13d02: 83 ec 0c sub $0xc,%esp\r
+ 13d05: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13d08: ff 70 08 pushl 0x8(%eax)\r
+ 13d0b: e8 70 08 00 00 call 14580 <_ExFreePool@4>\r
+ 13d10: 83 c4 0c add $0xc,%esp\r
+ 13d13: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13d16: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax)\r
+ 13d1d: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13d20: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)\r
+ 13d27: c9 leave \r
+ 13d28: c3 ret \r
+\r
+00013d29 <_remove_debug_files>:\r
+ 13d29: 55 push %ebp\r
+ 13d2a: 89 e5 mov %esp,%ebp\r
+ 13d2c: 5d pop %ebp\r
+ 13d2d: c3 ret \r
+\r
+00013d2e <_ohci_pci_start>:\r
+ 13d2e: 55 push %ebp\r
+ 13d2f: 89 e5 mov %esp,%ebp\r
+ 13d31: 53 push %ebx\r
+ 13d32: 83 ec 14 sub $0x14,%esp\r
+ 13d35: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13d38: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 13d3b: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 13d3e: 2d 34 02 00 00 sub $0x234,%eax\r
+ 13d43: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 13d46: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13d49: 83 b8 84 00 00 00 00 cmpl $0x0,0x84(%eax)\r
+ 13d50: 0f 84 ff 00 00 00 je 13e55 <_ohci_pci_start+0x127>\r
+ 13d56: 8b 5d f8 mov 0xfffffff8(%ebp),%ebx\r
+ 13d59: 83 ec 04 sub $0x4,%esp\r
+ 13d5c: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 13d5f: 83 c0 0c add $0xc,%eax\r
+ 13d62: 50 push %eax\r
+ 13d63: 68 00 01 00 00 push $0x100\r
+ 13d68: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13d6b: ff b0 84 00 00 00 pushl 0x84(%eax)\r
+ 13d71: e8 8e 01 00 00 call 13f04 <_my_pci_alloc_consistent>\r
+ 13d76: 83 c4 10 add $0x10,%esp\r
+ 13d79: 89 43 08 mov %eax,0x8(%ebx)\r
+ 13d7c: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 13d7f: 83 78 08 00 cmpl $0x0,0x8(%eax)\r
+ 13d83: 75 0c jne 13d91 <_ohci_pci_start+0x63>\r
+ 13d85: c7 45 e8 f4 ff ff ff movl $0xfffffff4,0xffffffe8(%ebp)\r
+ 13d8c: e9 6b 01 00 00 jmp 13efc <_ohci_pci_start+0x1ce>\r
+ 13d91: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13d94: 8b 80 84 00 00 00 mov 0x84(%eax),%eax\r
+ 13d9a: 81 38 22 10 00 00 cmpl $0x1022,(%eax)\r
+ 13da0: 75 24 jne 13dc6 <_ohci_pci_start+0x98>\r
+ 13da2: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13da5: 8b 80 84 00 00 00 mov 0x84(%eax),%eax\r
+ 13dab: 81 78 04 0c 74 00 00 cmpl $0x740c,0x4(%eax)\r
+ 13db2: 75 12 jne 13dc6 <_ohci_pci_start+0x98>\r
+ 13db4: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 13db7: c7 80 30 02 00 00 01 movl $0x1,0x230(%eax)\r
+ 13dbe: 00 00 00 \r
+ 13dc1: e9 8f 00 00 00 jmp 13e55 <_ohci_pci_start+0x127>\r
+ 13dc6: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13dc9: 8b 80 84 00 00 00 mov 0x84(%eax),%eax\r
+ 13dcf: 81 38 45 10 00 00 cmpl $0x1045,(%eax)\r
+ 13dd5: 75 14 jne 13deb <_ohci_pci_start+0xbd>\r
+ 13dd7: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13dda: 8b 80 84 00 00 00 mov 0x84(%eax),%eax\r
+ 13de0: 81 78 04 61 c8 00 00 cmpl $0xc861,0x4(%eax)\r
+ 13de7: 75 02 jne 13deb <_ohci_pci_start+0xbd>\r
+ 13de9: eb 6a jmp 13e55 <_ohci_pci_start+0x127>\r
+ 13deb: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13dee: 8b 80 84 00 00 00 mov 0x84(%eax),%eax\r
+ 13df4: 81 38 0b 10 00 00 cmpl $0x100b,(%eax)\r
+ 13dfa: 75 59 jne 13e55 <_ohci_pci_start+0x127>\r
+ 13dfc: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13dff: 8b 80 84 00 00 00 mov 0x84(%eax),%eax\r
+ 13e05: 89 45 ec mov %eax,0xffffffec(%ebp)\r
+ 13e08: 83 ec 08 sub $0x8,%esp\r
+ 13e0b: 6a 00 push $0x0\r
+ 13e0d: 8b 45 ec mov 0xffffffec(%ebp),%eax\r
+ 13e10: 8b 40 08 mov 0x8(%eax),%eax\r
+ 13e13: 8a 00 mov (%eax),%al\r
+ 13e15: 25 ff 00 00 00 and $0xff,%eax\r
+ 13e1a: 50 push %eax\r
+ 13e1b: e8 bc 06 00 00 call 144dc <_my_pci_find_slot>\r
+ 13e20: 83 c4 10 add $0x10,%esp\r
+ 13e23: 89 45 f0 mov %eax,0xfffffff0(%ebp)\r
+ 13e26: 83 7d f0 00 cmpl $0x0,0xfffffff0(%ebp)\r
+ 13e2a: 74 29 je 13e55 <_ohci_pci_start+0x127>\r
+ 13e2c: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 13e2f: 83 78 04 0e cmpl $0xe,0x4(%eax)\r
+ 13e33: 75 20 jne 13e55 <_ohci_pci_start+0x127>\r
+ 13e35: 8b 45 f0 mov 0xfffffff0(%ebp),%eax\r
+ 13e38: 81 38 0b 10 00 00 cmpl $0x100b,(%eax)\r
+ 13e3e: 75 15 jne 13e55 <_ohci_pci_start+0x127>\r
+ 13e40: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 13e43: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 13e46: 8b 92 30 02 00 00 mov 0x230(%edx),%edx\r
+ 13e4c: 83 ca 02 or $0x2,%edx\r
+ 13e4f: 89 90 30 02 00 00 mov %edx,0x230(%eax)\r
+ 13e55: 83 ec 04 sub $0x4,%esp\r
+ 13e58: 68 00 01 00 00 push $0x100\r
+ 13e5d: 6a 00 push $0x0\r
+ 13e5f: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 13e62: ff 70 08 pushl 0x8(%eax)\r
+ 13e65: e8 36 07 00 00 call 145a0 <_memset>\r
+ 13e6a: 83 c4 10 add $0x10,%esp\r
+ 13e6d: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 13e70: e8 7f d8 ff ff call 116f4 <_ohci_mem_init>\r
+ 13e75: 83 c4 04 add $0x4,%esp\r
+ 13e78: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 13e7b: 83 7d f4 00 cmpl $0x0,0xfffffff4(%ebp)\r
+ 13e7f: 79 16 jns 13e97 <_ohci_pci_start+0x169>\r
+ 13e81: 83 ec 0c sub $0xc,%esp\r
+ 13e84: ff 75 08 pushl 0x8(%ebp)\r
+ 13e87: e8 e0 fd ff ff call 13c6c <_ohci_stop>\r
+ 13e8c: 83 c4 10 add $0x10,%esp\r
+ 13e8f: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 13e92: 89 45 e8 mov %eax,0xffffffe8(%ebp)\r
+ 13e95: eb 65 jmp 13efc <_ohci_pci_start+0x1ce>\r
+ 13e97: 8b 55 f8 mov 0xfffffff8(%ebp),%edx\r
+ 13e9a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 13e9d: 8b 40 7c mov 0x7c(%eax),%eax\r
+ 13ea0: 89 42 04 mov %eax,0x4(%edx)\r
+ 13ea3: 83 ec 0c sub $0xc,%esp\r
+ 13ea6: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 13ea9: e8 07 f8 ff ff call 136b5 <_hc_reset>\r
+ 13eae: 83 c4 10 add $0x10,%esp\r
+ 13eb1: 85 c0 test %eax,%eax\r
+ 13eb3: 79 17 jns 13ecc <_ohci_pci_start+0x19e>\r
+ 13eb5: 83 ec 0c sub $0xc,%esp\r
+ 13eb8: ff 75 08 pushl 0x8(%ebp)\r
+ 13ebb: e8 ac fd ff ff call 13c6c <_ohci_stop>\r
+ 13ec0: 83 c4 10 add $0x10,%esp\r
+ 13ec3: c7 45 e8 ed ff ff ff movl $0xffffffed,0xffffffe8(%ebp)\r
+ 13eca: eb 30 jmp 13efc <_ohci_pci_start+0x1ce>\r
+ 13ecc: 83 ec 0c sub $0xc,%esp\r
+ 13ecf: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 13ed2: e8 10 f9 ff ff call 137e7 <_hc_start>\r
+ 13ed7: 83 c4 10 add $0x10,%esp\r
+ 13eda: 85 c0 test %eax,%eax\r
+ 13edc: 79 17 jns 13ef5 <_ohci_pci_start+0x1c7>\r
+ 13ede: 83 ec 0c sub $0xc,%esp\r
+ 13ee1: ff 75 08 pushl 0x8(%ebp)\r
+ 13ee4: e8 83 fd ff ff call 13c6c <_ohci_stop>\r
+ 13ee9: 83 c4 10 add $0x10,%esp\r
+ 13eec: c7 45 e8 f0 ff ff ff movl $0xfffffff0,0xffffffe8(%ebp)\r
+ 13ef3: eb 07 jmp 13efc <_ohci_pci_start+0x1ce>\r
+ 13ef5: c7 45 e8 00 00 00 00 movl $0x0,0xffffffe8(%ebp)\r
+ 13efc: 8b 45 e8 mov 0xffffffe8(%ebp),%eax\r
+ 13eff: 8b 5d fc mov 0xfffffffc(%ebp),%ebx\r
+ 13f02: c9 leave \r
+ 13f03: c3 ret \r
+\r
+00013f04 <_my_pci_alloc_consistent>:\r
+ 13f04: 55 push %ebp\r
+ 13f05: 89 e5 mov %esp,%ebp\r
+ 13f07: 83 ec 08 sub $0x8,%esp\r
+ 13f0a: 83 ec 08 sub $0x8,%esp\r
+ 13f0d: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 13f10: 05 00 01 00 00 add $0x100,%eax\r
+ 13f15: 50 push %eax\r
+ 13f16: 6a 01 push $0x1\r
+ 13f18: e8 53 06 00 00 call 14570 <_ExAllocatePool@8>\r
+ 13f1d: 83 c4 08 add $0x8,%esp\r
+ 13f20: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 13f23: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13f26: 05 ff 00 00 00 add $0xff,%eax\r
+ 13f2b: b0 00 mov $0x0,%al\r
+ 13f2d: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 13f30: 8b 55 10 mov 0x10(%ebp),%edx\r
+ 13f33: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13f36: 25 ff ff ff 0f and $0xfffffff,%eax\r
+ 13f3b: 89 02 mov %eax,(%edx)\r
+ 13f3d: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13f40: c9 leave \r
+ 13f41: c3 ret \r
+\r
+00013f42 <_ohci_hcd_pci_init>:\r
+ 13f42: 55 push %ebp\r
+ 13f43: 89 e5 mov %esp,%ebp\r
+ 13f45: 83 ec 08 sub $0x8,%esp\r
+ 13f48: 83 ec 04 sub $0x4,%esp\r
+ 13f4b: 68 85 01 00 00 push $0x185\r
+ 13f50: 68 38 61 01 00 push $0x16138\r
+ 13f55: 68 43 61 01 00 push $0x16143\r
+ 13f5a: e8 31 06 00 00 call 14590 <_DbgPrint>\r
+ 13f5f: 83 c4 10 add $0x10,%esp\r
+ 13f62: 83 ec 08 sub $0x8,%esp\r
+ 13f65: 68 00 60 01 00 push $0x16000\r
+ 13f6a: 68 4c 61 01 00 push $0x1614c\r
+ 13f6f: e8 1c 06 00 00 call 14590 <_DbgPrint>\r
+ 13f74: 83 c4 10 add $0x10,%esp\r
+ 13f77: e8 c4 06 00 00 call 14640 <_usb_disabled@0>\r
+ 13f7c: 85 c0 test %eax,%eax\r
+ 13f7e: 74 09 je 13f89 <_ohci_hcd_pci_init+0x47>\r
+ 13f80: c7 45 fc ed ff ff ff movl $0xffffffed,0xfffffffc(%ebp)\r
+ 13f87: eb 43 jmp 13fcc <_ohci_hcd_pci_init+0x8a>\r
+ 13f89: 83 ec 04 sub $0x4,%esp\r
+ 13f8c: 68 8a 01 00 00 push $0x18a\r
+ 13f91: 68 38 61 01 00 push $0x16138\r
+ 13f96: 68 43 61 01 00 push $0x16143\r
+ 13f9b: e8 f0 05 00 00 call 14590 <_DbgPrint>\r
+ 13fa0: 83 c4 10 add $0x10,%esp\r
+ 13fa3: 6a 40 push $0x40\r
+ 13fa5: 6a 40 push $0x40\r
+ 13fa7: 68 00 60 01 00 push $0x16000\r
+ 13fac: 68 98 61 01 00 push $0x16198\r
+ 13fb1: e8 da 05 00 00 call 14590 <_DbgPrint>\r
+ 13fb6: 83 c4 10 add $0x10,%esp\r
+ 13fb9: 83 ec 0c sub $0xc,%esp\r
+ 13fbc: 68 20 50 01 00 push $0x15020\r
+ 13fc1: e8 a5 04 00 00 call 1446b <_my_pci_module_init>\r
+ 13fc6: 83 c4 10 add $0x10,%esp\r
+ 13fc9: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 13fcc: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 13fcf: c9 leave \r
+ 13fd0: c3 ret \r
+\r
+00013fd1 <_module_init_ohci_hcd_pci_init>:\r
+ 13fd1: 55 push %ebp\r
+ 13fd2: 89 e5 mov %esp,%ebp\r
+ 13fd4: 83 ec 08 sub $0x8,%esp\r
+ 13fd7: e8 66 ff ff ff call 13f42 <_ohci_hcd_pci_init>\r
+ 13fdc: c9 leave \r
+ 13fdd: c3 ret \r
+\r
+00013fde <_ohci_hcd_pci_cleanup>:\r
+ 13fde: 55 push %ebp\r
+ 13fdf: 89 e5 mov %esp,%ebp\r
+ 13fe1: 5d pop %ebp\r
+ 13fe2: c3 ret \r
+\r
+00013fe3 <_module_exit_ohci_hcd_pci_cleanup>:\r
+ 13fe3: 55 push %ebp\r
+ 13fe4: 89 e5 mov %esp,%ebp\r
+ 13fe6: e8 f3 ff ff ff call 13fde <_ohci_hcd_pci_cleanup>\r
+ 13feb: 5d pop %ebp\r
+ 13fec: c3 ret \r
+ 13fed: 90 nop \r
+ 13fee: 90 nop \r
+ 13fef: 90 nop \r
+\r
+00013ff0 <_DriverEntry@8>:\r
+ 13ff0: 55 push %ebp\r
+ 13ff1: 89 e5 mov %esp,%ebp\r
+ 13ff3: b8 00 00 00 00 mov $0x0,%eax\r
+ 13ff8: 5d pop %ebp\r
+ 13ff9: c2 08 00 ret $0x8\r
+ 13ffc: 90 nop \r
+ 13ffd: 90 nop \r
+ 13ffe: 90 nop \r
+ 13fff: 90 nop \r
+\r
+00014000 <_wait_ms>:\r
+ 14000: 55 push %ebp\r
+ 14001: 89 e5 mov %esp,%ebp\r
+ 14003: 83 ec 08 sub $0x8,%esp\r
+ 14006: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 14009: 89 d0 mov %edx,%eax\r
+ 1400b: c1 e0 02 shl $0x2,%eax\r
+ 1400e: 01 d0 add %edx,%eax\r
+ 14010: 01 c0 add %eax,%eax\r
+ 14012: f7 d8 neg %eax\r
+ 14014: 99 cltd \r
+ 14015: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 14018: 89 55 fc mov %edx,0xfffffffc(%ebp)\r
+ 1401b: 83 ec 04 sub $0x4,%esp\r
+ 1401e: 8d 45 f8 lea 0xfffffff8(%ebp),%eax\r
+ 14021: 50 push %eax\r
+ 14022: 6a 00 push $0x0\r
+ 14024: 6a 00 push $0x0\r
+ 14026: e8 85 05 00 00 call 145b0 <_KeDelayExecutionThread@12>\r
+ 1402b: 83 c4 04 add $0x4,%esp\r
+ 1402e: c9 leave \r
+ 1402f: c3 ret \r
+\r
+00014030 <_init_wrapper>:\r
+ 14030: 55 push %ebp\r
+ 14031: 89 e5 mov %esp,%ebp\r
+ 14033: 83 ec 04 sub $0x4,%esp\r
+ 14036: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 1403d: 83 7d fc 13 cmpl $0x13,0xfffffffc(%ebp)\r
+ 14041: 7f 15 jg 14058 <_init_wrapper+0x28>\r
+ 14043: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14046: c7 04 85 c0 70 01 00 movl $0x0,0x170c0(,%eax,4)\r
+ 1404d: 00 00 00 00 \r
+ 14051: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 14054: ff 00 incl (%eax)\r
+ 14056: eb e5 jmp 1403d <_init_wrapper+0xd>\r
+ 14058: c7 05 a0 71 01 00 00 movl $0x0,0x171a0\r
+ 1405f: 00 00 00 \r
+ 14062: c7 05 a0 70 01 00 00 movl $0x0,0x170a0\r
+ 14069: 00 00 00 \r
+ 1406c: c7 05 90 71 01 00 00 movl $0x17000,0x17190\r
+ 14073: 70 01 00 \r
+ 14076: c7 05 08 70 01 00 00 movl $0x0,0x17008\r
+ 1407d: 00 00 00 \r
+ 14080: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 14087: 83 7d fc 07 cmpl $0x7,0xfffffffc(%ebp)\r
+ 1408b: 7f 33 jg 140c0 <_init_wrapper+0x90>\r
+ 1408d: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 14090: 89 d0 mov %edx,%eax\r
+ 14092: 01 c0 add %eax,%eax\r
+ 14094: 01 d0 add %edx,%eax\r
+ 14096: c1 e0 02 shl $0x2,%eax\r
+ 14099: c7 80 30 71 01 00 00 movl $0x0,0x17130(%eax)\r
+ 140a0: 00 00 00 \r
+ 140a3: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 140a6: 89 d0 mov %edx,%eax\r
+ 140a8: 01 c0 add %eax,%eax\r
+ 140aa: 01 d0 add %edx,%eax\r
+ 140ac: c1 e0 02 shl $0x2,%eax\r
+ 140af: c7 80 34 71 01 00 ff movl $0xffffffff,0x17134(%eax)\r
+ 140b6: ff ff ff \r
+ 140b9: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 140bc: ff 00 incl (%eax)\r
+ 140be: eb c7 jmp 14087 <_init_wrapper+0x57>\r
+ 140c0: c7 05 38 70 01 00 00 movl $0x0,0x17038\r
+ 140c7: 00 00 00 \r
+ 140ca: c7 05 20 71 01 00 00 movl $0x0,0x17120\r
+ 140d1: 00 00 00 \r
+ 140d4: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 140db: 83 7d fc 07 cmpl $0x7,0xfffffffc(%ebp)\r
+ 140df: 7f 15 jg 140f6 <_init_wrapper+0xc6>\r
+ 140e1: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 140e4: c7 04 85 18 70 01 00 movl $0x0,0x17018(,%eax,4)\r
+ 140eb: 00 00 00 00 \r
+ 140ef: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 140f2: ff 00 incl (%eax)\r
+ 140f4: eb e5 jmp 140db <_init_wrapper+0xab>\r
+ 140f6: c9 leave \r
+ 140f7: c3 ret \r
+\r
+000140f8 <_handle_irqs>:\r
+ 140f8: 55 push %ebp\r
+ 140f9: 89 e5 mov %esp,%ebp\r
+ 140fb: 83 ec 08 sub $0x8,%esp\r
+ 140fe: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 14105: 83 7d fc 07 cmpl $0x7,0xfffffffc(%ebp)\r
+ 14109: 0f 8f 86 00 00 00 jg 14195 <_handle_irqs+0x9d>\r
+ 1410f: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14112: 89 c2 mov %eax,%edx\r
+ 14114: 01 d2 add %edx,%edx\r
+ 14116: 01 c2 add %eax,%edx\r
+ 14118: 8d 04 95 00 00 00 00 lea 0x0(,%edx,4),%eax\r
+ 1411f: 83 b8 30 71 01 00 00 cmpl $0x0,0x17130(%eax)\r
+ 14126: 74 63 je 1418b <_handle_irqs+0x93>\r
+ 14128: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 1412b: 89 d0 mov %edx,%eax\r
+ 1412d: 01 c0 add %eax,%eax\r
+ 1412f: 01 d0 add %edx,%eax\r
+ 14131: c1 e0 02 shl $0x2,%eax\r
+ 14134: 8b 80 34 71 01 00 mov 0x17134(%eax),%eax\r
+ 1413a: 3b 45 08 cmp 0x8(%ebp),%eax\r
+ 1413d: 74 08 je 14147 <_handle_irqs+0x4f>\r
+ 1413f: 83 7d 08 ff cmpl $0xffffffff,0x8(%ebp)\r
+ 14143: 74 02 je 14147 <_handle_irqs+0x4f>\r
+ 14145: eb 44 jmp 1418b <_handle_irqs+0x93>\r
+ 14147: 83 ec 04 sub $0x4,%esp\r
+ 1414a: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 1414d: 89 d0 mov %edx,%eax\r
+ 1414f: 01 c0 add %eax,%eax\r
+ 14151: 01 d0 add %edx,%eax\r
+ 14153: 8d 0c 85 00 00 00 00 lea 0x0(,%eax,4),%ecx\r
+ 1415a: 6a 00 push $0x0\r
+ 1415c: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 1415f: 89 d0 mov %edx,%eax\r
+ 14161: 01 c0 add %eax,%eax\r
+ 14163: 01 d0 add %edx,%eax\r
+ 14165: c1 e0 02 shl $0x2,%eax\r
+ 14168: ff b0 38 71 01 00 pushl 0x17138(%eax)\r
+ 1416e: 8b 55 fc mov 0xfffffffc(%ebp),%edx\r
+ 14171: 89 d0 mov %edx,%eax\r
+ 14173: 01 c0 add %eax,%eax\r
+ 14175: 01 d0 add %edx,%eax\r
+ 14177: c1 e0 02 shl $0x2,%eax\r
+ 1417a: ff b0 34 71 01 00 pushl 0x17134(%eax)\r
+ 14180: 8b 81 30 71 01 00 mov 0x17130(%ecx),%eax\r
+ 14186: ff d0 call *%eax\r
+ 14188: 83 c4 10 add $0x10,%esp\r
+ 1418b: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 1418e: ff 00 incl (%eax)\r
+ 14190: e9 70 ff ff ff jmp 14105 <_handle_irqs+0xd>\r
+ 14195: c9 leave \r
+ 14196: c3 ret \r
+\r
+00014197 <_inc_jiffies>:\r
+ 14197: 55 push %ebp\r
+ 14198: 89 e5 mov %esp,%ebp\r
+ 1419a: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1419d: 01 05 a0 71 01 00 add %eax,0x171a0\r
+ 141a3: 5d pop %ebp\r
+ 141a4: c3 ret \r
+\r
+000141a5 <_do_all_timers>:\r
+ 141a5: 55 push %ebp\r
+ 141a6: 89 e5 mov %esp,%ebp\r
+ 141a8: 83 ec 18 sub $0x18,%esp\r
+ 141ab: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 141b2: 83 7d fc 13 cmpl $0x13,0xfffffffc(%ebp)\r
+ 141b6: 0f 8f 82 00 00 00 jg 1423e <_do_all_timers+0x99>\r
+ 141bc: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 141bf: 83 3c 85 c0 70 01 00 cmpl $0x0,0x170c0(,%eax,4)\r
+ 141c6: 00 \r
+ 141c7: 74 6b je 14234 <_do_all_timers+0x8f>\r
+ 141c9: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 141cc: 8b 04 85 c0 70 01 00 mov 0x170c0(,%eax,4),%eax\r
+ 141d3: 83 38 00 cmpl $0x0,(%eax)\r
+ 141d6: 74 5c je 14234 <_do_all_timers+0x8f>\r
+ 141d8: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 141db: 8b 04 85 c0 70 01 00 mov 0x170c0(,%eax,4),%eax\r
+ 141e2: 83 78 08 00 cmpl $0x0,0x8(%eax)\r
+ 141e6: 74 4c je 14234 <_do_all_timers+0x8f>\r
+ 141e8: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 141eb: 8b 04 85 c0 70 01 00 mov 0x170c0(,%eax,4),%eax\r
+ 141f2: 8b 00 mov (%eax),%eax\r
+ 141f4: 89 45 f8 mov %eax,0xfffffff8(%ebp)\r
+ 141f7: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 141fa: 8b 04 85 c0 70 01 00 mov 0x170c0(,%eax,4),%eax\r
+ 14201: 8b 40 04 mov 0x4(%eax),%eax\r
+ 14204: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 14207: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1420a: 8b 04 85 c0 70 01 00 mov 0x170c0(,%eax,4),%eax\r
+ 14211: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax)\r
+ 14218: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 1421b: c7 04 85 c0 70 01 00 movl $0x0,0x170c0(,%eax,4)\r
+ 14222: 00 00 00 00 \r
+ 14226: 83 ec 0c sub $0xc,%esp\r
+ 14229: ff 75 f4 pushl 0xfffffff4(%ebp)\r
+ 1422c: 8b 45 f8 mov 0xfffffff8(%ebp),%eax\r
+ 1422f: ff d0 call *%eax\r
+ 14231: 83 c4 10 add $0x10,%esp\r
+ 14234: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 14237: ff 00 incl (%eax)\r
+ 14239: e9 74 ff ff ff jmp 141b2 <_do_all_timers+0xd>\r
+ 1423e: c9 leave \r
+ 1423f: c3 ret \r
+\r
+00014240 <_my_kernel_thread>:\r
+ 14240: 55 push %ebp\r
+ 14241: 89 e5 mov %esp,%ebp\r
+ 14243: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14246: a3 b0 70 01 00 mov %eax,0x170b0\r
+ 1424b: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1424e: a3 10 71 01 00 mov %eax,0x17110\r
+ 14253: b8 2a 00 00 00 mov $0x2a,%eax\r
+ 14258: 5d pop %ebp\r
+ 14259: c3 ret \r
+\r
+0001425a <_my_device_add>:\r
+ 1425a: 55 push %ebp\r
+ 1425b: 89 e5 mov %esp,%ebp\r
+ 1425d: 83 ec 18 sub $0x18,%esp\r
+ 14260: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 14267: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1426a: 83 b8 98 00 00 00 00 cmpl $0x0,0x98(%eax)\r
+ 14271: 74 32 je 142a5 <_my_device_add+0x4b>\r
+ 14273: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14276: 8b 80 98 00 00 00 mov 0x98(%eax),%eax\r
+ 1427c: 83 78 08 00 cmpl $0x0,0x8(%eax)\r
+ 14280: 0f 84 8d 00 00 00 je 14313 <_my_device_add+0xb9>\r
+ 14286: 83 ec 0c sub $0xc,%esp\r
+ 14289: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1428c: 8b 80 98 00 00 00 mov 0x98(%eax),%eax\r
+ 14292: ff 75 08 pushl 0x8(%ebp)\r
+ 14295: 8b 40 08 mov 0x8(%eax),%eax\r
+ 14298: ff d0 call *%eax\r
+ 1429a: 83 c4 10 add $0x10,%esp\r
+ 1429d: 89 45 f4 mov %eax,0xfffffff4(%ebp)\r
+ 142a0: e9 82 00 00 00 jmp 14327 <_my_device_add+0xcd>\r
+ 142a5: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 142ac: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 142af: 3b 05 38 70 01 00 cmp 0x17038,%eax\r
+ 142b5: 7d 4d jge 14304 <_my_device_add+0xaa>\r
+ 142b7: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 142ba: 8b 04 85 18 70 01 00 mov 0x17018(,%eax,4),%eax\r
+ 142c1: 83 78 08 00 cmpl $0x0,0x8(%eax)\r
+ 142c5: 74 36 je 142fd <_my_device_add+0xa3>\r
+ 142c7: 8b 55 08 mov 0x8(%ebp),%edx\r
+ 142ca: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 142cd: 8b 04 85 18 70 01 00 mov 0x17018(,%eax,4),%eax\r
+ 142d4: 89 82 98 00 00 00 mov %eax,0x98(%edx)\r
+ 142da: 83 ec 0c sub $0xc,%esp\r
+ 142dd: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 142e0: 8b 04 85 18 70 01 00 mov 0x17018(,%eax,4),%eax\r
+ 142e7: ff 75 08 pushl 0x8(%ebp)\r
+ 142ea: 8b 40 08 mov 0x8(%eax),%eax\r
+ 142ed: ff d0 call *%eax\r
+ 142ef: 83 c4 10 add $0x10,%esp\r
+ 142f2: 85 c0 test %eax,%eax\r
+ 142f4: 75 07 jne 142fd <_my_device_add+0xa3>\r
+ 142f6: c7 45 f8 01 00 00 00 movl $0x1,0xfffffff8(%ebp)\r
+ 142fd: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 14300: ff 00 incl (%eax)\r
+ 14302: eb a8 jmp 142ac <_my_device_add+0x52>\r
+ 14304: 83 7d f8 00 cmpl $0x0,0xfffffff8(%ebp)\r
+ 14308: 74 09 je 14313 <_my_device_add+0xb9>\r
+ 1430a: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 14311: eb 14 jmp 14327 <_my_device_add+0xcd>\r
+ 14313: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14316: c7 80 98 00 00 00 00 movl $0x0,0x98(%eax)\r
+ 1431d: 00 00 00 \r
+ 14320: c7 45 f4 ed ff ff ff movl $0xffffffed,0xfffffff4(%ebp)\r
+ 14327: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 1432a: c9 leave \r
+ 1432b: c3 ret \r
+\r
+0001432c <_my_driver_register>:\r
+ 1432c: 55 push %ebp\r
+ 1432d: 89 e5 mov %esp,%ebp\r
+ 1432f: 83 ec 04 sub $0x4,%esp\r
+ 14332: 83 3d 38 70 01 00 07 cmpl $0x7,0x17038\r
+ 14339: 7f 20 jg 1435b <_my_driver_register+0x2f>\r
+ 1433b: a1 38 70 01 00 mov 0x17038,%eax\r
+ 14340: 89 c2 mov %eax,%edx\r
+ 14342: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14345: 89 04 95 18 70 01 00 mov %eax,0x17018(,%edx,4)\r
+ 1434c: ff 05 38 70 01 00 incl 0x17038\r
+ 14352: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 14359: eb 07 jmp 14362 <_my_driver_register+0x36>\r
+ 1435b: c7 45 fc ff ff ff ff movl $0xffffffff,0xfffffffc(%ebp)\r
+ 14362: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14365: c9 leave \r
+ 14366: c3 ret \r
+\r
+00014367 <_my_device_unregister>:\r
+ 14367: 55 push %ebp\r
+ 14368: 89 e5 mov %esp,%ebp\r
+ 1436a: 83 ec 08 sub $0x8,%esp\r
+ 1436d: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14370: 83 b8 98 00 00 00 00 cmpl $0x0,0x98(%eax)\r
+ 14377: 74 26 je 1439f <_my_device_unregister+0x38>\r
+ 14379: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1437c: 8b 80 98 00 00 00 mov 0x98(%eax),%eax\r
+ 14382: 83 78 0c 00 cmpl $0x0,0xc(%eax)\r
+ 14386: 74 17 je 1439f <_my_device_unregister+0x38>\r
+ 14388: 83 ec 0c sub $0xc,%esp\r
+ 1438b: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 1438e: 8b 80 98 00 00 00 mov 0x98(%eax),%eax\r
+ 14394: ff 75 08 pushl 0x8(%ebp)\r
+ 14397: 8b 40 0c mov 0xc(%eax),%eax\r
+ 1439a: ff d0 call *%eax\r
+ 1439c: 83 c4 10 add $0x10,%esp\r
+ 1439f: b8 00 00 00 00 mov $0x0,%eax\r
+ 143a4: c9 leave \r
+ 143a5: c3 ret \r
+\r
+000143a6 <_my_get_device>:\r
+ 143a6: 55 push %ebp\r
+ 143a7: 89 e5 mov %esp,%ebp\r
+ 143a9: b8 00 00 00 00 mov $0x0,%eax\r
+ 143ae: 5d pop %ebp\r
+ 143af: c3 ret \r
+\r
+000143b0 <_my_device_initialize>:\r
+ 143b0: 55 push %ebp\r
+ 143b1: 89 e5 mov %esp,%ebp\r
+ 143b3: 5d pop %ebp\r
+ 143b4: c3 ret \r
+\r
+000143b5 <_my_wake_up>:\r
+ 143b5: 55 push %ebp\r
+ 143b6: 89 e5 mov %esp,%ebp\r
+ 143b8: c7 05 20 71 01 00 01 movl $0x1,0x17120\r
+ 143bf: 00 00 00 \r
+ 143c2: 5d pop %ebp\r
+ 143c3: c3 ret \r
+\r
+000143c4 <_my_schedule_timeout>:\r
+ 143c4: 55 push %ebp\r
+ 143c5: 89 e5 mov %esp,%ebp\r
+ 143c7: 83 ec 08 sub $0x8,%esp\r
+ 143ca: c7 45 fc 01 00 00 00 movl $0x1,0xfffffffc(%ebp)\r
+ 143d1: 83 45 08 0a addl $0xa,0x8(%ebp)\r
+ 143d5: 83 7d 08 00 cmpl $0x0,0x8(%ebp)\r
+ 143d9: 7e 3e jle 14419 <_my_schedule_timeout+0x55>\r
+ 143db: e8 c5 fd ff ff call 141a5 <_do_all_timers>\r
+ 143e0: 83 ec 0c sub $0xc,%esp\r
+ 143e3: 6a ff push $0xffffffff\r
+ 143e5: e8 0e fd ff ff call 140f8 <_handle_irqs>\r
+ 143ea: 83 c4 10 add $0x10,%esp\r
+ 143ed: 83 3d 20 71 01 00 00 cmpl $0x0,0x17120\r
+ 143f4: 74 02 je 143f8 <_my_schedule_timeout+0x34>\r
+ 143f6: eb 21 jmp 14419 <_my_schedule_timeout+0x55>\r
+ 143f8: 83 ec 0c sub $0xc,%esp\r
+ 143fb: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 143fe: e8 fd fb ff ff call 14000 <_wait_ms>\r
+ 14403: 83 c4 10 add $0x10,%esp\r
+ 14406: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 14409: e8 89 fd ff ff call 14197 <_inc_jiffies>\r
+ 1440e: 83 c4 04 add $0x4,%esp\r
+ 14411: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14414: 29 45 08 sub %eax,0x8(%ebp)\r
+ 14417: eb bc jmp 143d5 <_my_schedule_timeout+0x11>\r
+ 14419: c7 05 20 71 01 00 00 movl $0x0,0x17120\r
+ 14420: 00 00 00 \r
+ 14423: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14426: c9 leave \r
+ 14427: c3 ret \r
+\r
+00014428 <_my_wait_for_completion>:\r
+ 14428: 55 push %ebp\r
+ 14429: 89 e5 mov %esp,%ebp\r
+ 1442b: 83 ec 08 sub $0x8,%esp\r
+ 1442e: c7 45 fc 64 00 00 00 movl $0x64,0xfffffffc(%ebp)\r
+ 14435: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14438: 83 38 00 cmpl $0x0,(%eax)\r
+ 1443b: 75 2c jne 14469 <_my_wait_for_completion+0x41>\r
+ 1443d: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp)\r
+ 14441: 7e 26 jle 14469 <_my_wait_for_completion+0x41>\r
+ 14443: e8 5d fd ff ff call 141a5 <_do_all_timers>\r
+ 14448: 83 ec 0c sub $0xc,%esp\r
+ 1444b: 6a ff push $0xffffffff\r
+ 1444d: e8 a6 fc ff ff call 140f8 <_handle_irqs>\r
+ 14452: 83 c4 10 add $0x10,%esp\r
+ 14455: 83 ec 0c sub $0xc,%esp\r
+ 14458: 6a 0a push $0xa\r
+ 1445a: e8 a1 fb ff ff call 14000 <_wait_ms>\r
+ 1445f: 83 c4 10 add $0x10,%esp\r
+ 14462: 8d 45 fc lea 0xfffffffc(%ebp),%eax\r
+ 14465: ff 08 decl (%eax)\r
+ 14467: eb cc jmp 14435 <_my_wait_for_completion+0xd>\r
+ 14469: c9 leave \r
+ 1446a: c3 ret \r
+\r
+0001446b <_my_pci_module_init>:\r
+ 1446b: 55 push %ebp\r
+ 1446c: 89 e5 mov %esp,%ebp\r
+ 1446e: 83 ec 18 sub $0x18,%esp\r
+ 14471: a1 08 70 01 00 mov 0x17008,%eax\r
+ 14476: 89 45 fc mov %eax,0xfffffffc(%ebp)\r
+ 14479: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)\r
+ 14480: 83 3d 08 70 01 00 00 cmpl $0x0,0x17008\r
+ 14487: 75 33 jne 144bc <_my_pci_module_init+0x51>\r
+ 14489: 83 ec 04 sub $0x4,%esp\r
+ 1448c: 68 ef 00 00 00 push $0xef\r
+ 14491: 68 c0 61 01 00 push $0x161c0\r
+ 14496: 68 d6 61 01 00 push $0x161d6\r
+ 1449b: e8 f0 00 00 00 call 14590 <_DbgPrint>\r
+ 144a0: 83 c4 10 add $0x10,%esp\r
+ 144a3: 83 ec 0c sub $0xc,%esp\r
+ 144a6: 68 df 61 01 00 push $0x161df\r
+ 144ab: e8 e0 00 00 00 call 14590 <_DbgPrint>\r
+ 144b0: 83 c4 10 add $0x10,%esp\r
+ 144b3: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 144ba: eb 1b jmp 144d7 <_my_pci_module_init+0x6c>\r
+ 144bc: 83 ec 08 sub $0x8,%esp\r
+ 144bf: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 144c2: ff 75 f8 pushl 0xfffffff8(%ebp)\r
+ 144c5: ff 75 fc pushl 0xfffffffc(%ebp)\r
+ 144c8: 8b 40 10 mov 0x10(%eax),%eax\r
+ 144cb: ff d0 call *%eax\r
+ 144cd: 83 c4 10 add $0x10,%esp\r
+ 144d0: c7 45 f4 00 00 00 00 movl $0x0,0xfffffff4(%ebp)\r
+ 144d7: 8b 45 f4 mov 0xfffffff4(%ebp),%eax\r
+ 144da: c9 leave \r
+ 144db: c3 ret \r
+\r
+000144dc <_my_pci_find_slot>:\r
+ 144dc: 55 push %ebp\r
+ 144dd: 89 e5 mov %esp,%ebp\r
+ 144df: b8 00 00 00 00 mov $0x0,%eax\r
+ 144e4: 5d pop %ebp\r
+ 144e5: c3 ret \r
+\r
+000144e6 <_my_request_irq>:\r
+ 144e6: 55 push %ebp\r
+ 144e7: 89 e5 mov %esp,%ebp\r
+ 144e9: 83 ec 04 sub $0x4,%esp\r
+ 144ec: 83 3d a0 70 01 00 07 cmpl $0x7,0x170a0\r
+ 144f3: 7f 63 jg 14558 <_my_request_irq+0x72>\r
+ 144f5: 8b 15 a0 70 01 00 mov 0x170a0,%edx\r
+ 144fb: 89 d0 mov %edx,%eax\r
+ 144fd: 01 c0 add %eax,%eax\r
+ 144ff: 01 d0 add %edx,%eax\r
+ 14501: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 14508: 8b 45 0c mov 0xc(%ebp),%eax\r
+ 1450b: 89 82 30 71 01 00 mov %eax,0x17130(%edx)\r
+ 14511: 8b 15 a0 70 01 00 mov 0x170a0,%edx\r
+ 14517: 89 d0 mov %edx,%eax\r
+ 14519: 01 c0 add %eax,%eax\r
+ 1451b: 01 d0 add %edx,%eax\r
+ 1451d: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 14524: 8b 45 08 mov 0x8(%ebp),%eax\r
+ 14527: 89 82 34 71 01 00 mov %eax,0x17134(%edx)\r
+ 1452d: 8b 15 a0 70 01 00 mov 0x170a0,%edx\r
+ 14533: 89 d0 mov %edx,%eax\r
+ 14535: 01 c0 add %eax,%eax\r
+ 14537: 01 d0 add %edx,%eax\r
+ 14539: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx\r
+ 14540: 8b 45 18 mov 0x18(%ebp),%eax\r
+ 14543: 89 82 38 71 01 00 mov %eax,0x17138(%edx)\r
+ 14549: ff 05 a0 70 01 00 incl 0x170a0\r
+ 1454f: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)\r
+ 14556: eb 07 jmp 1455f <_my_request_irq+0x79>\r
+ 14558: c7 45 fc 01 00 00 00 movl $0x1,0xfffffffc(%ebp)\r
+ 1455f: 8b 45 fc mov 0xfffffffc(%ebp),%eax\r
+ 14562: c9 leave \r
+ 14563: c3 ret \r
+\r
+00014564 <_my_free_irq>:\r
+ 14564: 55 push %ebp\r
+ 14565: 89 e5 mov %esp,%ebp\r
+ 14567: b8 00 00 00 00 mov $0x0,%eax\r
+ 1456c: 5d pop %ebp\r
+ 1456d: c3 ret \r
+ 1456e: 90 nop \r
+ 1456f: 90 nop \r
+\r
+00014570 <_ExAllocatePool@8>:\r
+ 14570: ff 25 8c 80 01 00 jmp *0x1808c\r
+ 14576: 90 nop \r
+ 14577: 90 nop \r
+ ...\r
+\r
+00014580 <_ExFreePool@4>:\r
+ 14580: ff 25 90 80 01 00 jmp *0x18090\r
+ 14586: 90 nop \r
+ 14587: 90 nop \r
+ ...\r
+\r
+00014590 <_DbgPrint>:\r
+ 14590: ff 25 88 80 01 00 jmp *0x18088\r
+ 14596: 90 nop \r
+ 14597: 90 nop \r
+ ...\r
+\r
+000145a0 <_memset>:\r
+ 145a0: ff 25 98 80 01 00 jmp *0x18098\r
+ 145a6: 90 nop \r
+ 145a7: 90 nop \r
+ ...\r
+\r
+000145b0 <_KeDelayExecutionThread@12>:\r
+ 145b0: ff 25 94 80 01 00 jmp *0x18094\r
+ 145b6: 90 nop \r
+ 145b7: 90 nop \r
+ ...\r
+\r
+000145c0 <_usb_hcd_giveback_urb@12>:\r
+ 145c0: ff 25 b4 80 01 00 jmp *0x180b4\r
+ 145c6: 90 nop \r
+ 145c7: 90 nop \r
+ ...\r
+\r
+000145d0 <_usb_calc_bus_time@16>:\r
+ 145d0: ff 25 a8 80 01 00 jmp *0x180a8\r
+ 145d6: 90 nop \r
+ 145d7: 90 nop \r
+ ...\r
+\r
+000145e0 <_usb_alloc_dev@8>:\r
+ 145e0: ff 25 a4 80 01 00 jmp *0x180a4\r
+ 145e6: 90 nop \r
+ 145e7: 90 nop \r
+ ...\r
+\r
+000145f0 <_usb_connect@4>:\r
+ 145f0: ff 25 ac 80 01 00 jmp *0x180ac\r
+ 145f6: 90 nop \r
+ 145f7: 90 nop \r
+ ...\r
+\r
+00014600 <_usb_put_dev@4>:\r
+ 14600: ff 25 c0 80 01 00 jmp *0x180c0\r
+ 14606: 90 nop \r
+ 14607: 90 nop \r
+ ...\r
+\r
+00014610 <_usb_register_root_hub@8>:\r
+ 14610: ff 25 c4 80 01 00 jmp *0x180c4\r
+ 14616: 90 nop \r
+ 14617: 90 nop \r
+ ...\r
+\r
+00014620 <_usb_hcd_pci_probe@8>:\r
+ 14620: ff 25 b8 80 01 00 jmp *0x180b8\r
+ 14626: 90 nop \r
+ 14627: 90 nop \r
+ ...\r
+\r
+00014630 <_usb_hcd_pci_remove@4>:\r
+ 14630: ff 25 bc 80 01 00 jmp *0x180bc\r
+ 14636: 90 nop \r
+ 14637: 90 nop \r
+ ...\r
+\r
+00014640 <_usb_disabled@0>:\r
+ 14640: ff 25 b0 80 01 00 jmp *0x180b0\r
+ 14646: 90 nop \r
+ 14647: 90 nop \r
+ ...\r
+\r
+00014650 <__CTOR_LIST__>:\r
+ 14650: ff (bad) \r
+ 14651: ff (bad) \r
+ 14652: ff (bad) \r
+ 14653: ff 00 incl (%eax)\r
+ 14655: 00 00 add %al,(%eax)\r
+ ...\r
+\r
+00014658 <__DTOR_LIST__>:\r
+ 14658: ff (bad) \r
+ 14659: ff (bad) \r
+ 1465a: ff (bad) \r
+ 1465b: ff 00 incl (%eax)\r
+ 1465d: 00 00 add %al,(%eax)\r
+ ...\r
+\r
+00014660 <etext>:\r
+ ...\r
--- /dev/null
+#define REACTOS_VERSION_DLL\r
+#define REACTOS_STR_FILE_DESCRIPTION "USB OHCI Device Driver\0"\r
+#define REACTOS_STR_INTERNAL_NAME "ohci\0"\r
+#define REACTOS_STR_ORIGINAL_FILENAME "ohci.sys\0"\r
+#include <reactos/version.rc>\r
--- /dev/null
+/*\r
+ * Configs for OHCI\r
+ */\r
+\r
+#define CONFIG_PCI\r
--- /dev/null
+/*\r
+ ReactOS specific functions for ohci module\r
+ by Aleksey Bragin (aleksey@reactos.com)\r
+*/\r
+\r
+#include <ddk/ntddk.h>\r
+\r
+\r
+/*\r
+ * Standard DriverEntry method.\r
+ */\r
+NTSTATUS STDCALL\r
+DriverEntry(IN PVOID Context1, IN PVOID Context2)\r
+{\r
+ return STATUS_SUCCESS;\r
+}\r
--- /dev/null
+#ifndef _I386_BITOPS_H\r
+#define _I386_BITOPS_H\r
+\r
+/*\r
+ * Copyright 1992, Linus Torvalds.\r
+ */\r
+\r
+//#include <linux/config.h>\r
+\r
+/*\r
+ * These have to be done with inline assembly: that way the bit-setting\r
+ * is guaranteed to be atomic. All bit operations return 0 if the bit\r
+ * was cleared before the operation and != 0 if it was not.\r
+ *\r
+ * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1).\r
+ */\r
+\r
+#ifdef CONFIG_SMP\r
+#define LOCK_PREFIX "lock ; "\r
+#else\r
+#define LOCK_PREFIX ""\r
+#endif\r
+\r
+#define ADDR (*(volatile long *) addr)\r
+\r
+/**\r
+ * set_bit - Atomically set a bit in memory\r
+ * @nr: the bit to set\r
+ * @addr: the address to start counting from\r
+ *\r
+ * This function is atomic and may not be reordered. See __set_bit()\r
+ * if you do not require the atomic guarantees.\r
+ * Note that @nr may be almost arbitrarily large; this function is not\r
+ * restricted to acting on a single-word quantity.\r
+ */\r
+static __inline__ void set_bit(int nr, volatile void * addr)\r
+{\r
+ __asm__ __volatile__( LOCK_PREFIX\r
+ "btsl %1,%0"\r
+ :"=m" (ADDR)\r
+ :"Ir" (nr));\r
+}\r
+\r
+/**\r
+ * __set_bit - Set a bit in memory\r
+ * @nr: the bit to set\r
+ * @addr: the address to start counting from\r
+ *\r
+ * Unlike set_bit(), this function is non-atomic and may be reordered.\r
+ * If it's called on the same region of memory simultaneously, the effect\r
+ * may be that only one operation succeeds.\r
+ */\r
+static __inline__ void __set_bit(int nr, volatile void * addr)\r
+{\r
+ __asm__(\r
+ "btsl %1,%0"\r
+ :"=m" (ADDR)\r
+ :"Ir" (nr));\r
+}\r
+\r
+/**\r
+ * clear_bit - Clears a bit in memory\r
+ * @nr: Bit to clear\r
+ * @addr: Address to start counting from\r
+ *\r
+ * clear_bit() is atomic and may not be reordered. However, it does\r
+ * not contain a memory barrier, so if it is used for locking purposes,\r
+ * you should call smp_mb__before_clear_bit() and/or smp_mb__after_clear_bit()\r
+ * in order to ensure changes are visible on other processors.\r
+ */\r
+static __inline__ void clear_bit(int nr, volatile void * addr)\r
+{\r
+ __asm__ __volatile__( LOCK_PREFIX\r
+ "btrl %1,%0"\r
+ :"=m" (ADDR)\r
+ :"Ir" (nr));\r
+}\r
+#define smp_mb__before_clear_bit() barrier()\r
+#define smp_mb__after_clear_bit() barrier()\r
+\r
+/**\r
+ * __change_bit - Toggle a bit in memory\r
+ * @nr: the bit to set\r
+ * @addr: the address to start counting from\r
+ *\r
+ * Unlike change_bit(), this function is non-atomic and may be reordered.\r
+ * If it's called on the same region of memory simultaneously, the effect\r
+ * may be that only one operation succeeds.\r
+ */\r
+static __inline__ void __change_bit(int nr, volatile void * addr)\r
+{\r
+ __asm__ __volatile__(\r
+ "btcl %1,%0"\r
+ :"=m" (ADDR)\r
+ :"Ir" (nr));\r
+}\r
+\r
+/**\r
+ * change_bit - Toggle a bit in memory\r
+ * @nr: Bit to clear\r
+ * @addr: Address to start counting from\r
+ *\r
+ * change_bit() is atomic and may not be reordered.\r
+ * Note that @nr may be almost arbitrarily large; this function is not\r
+ * restricted to acting on a single-word quantity.\r
+ */\r
+static __inline__ void change_bit(int nr, volatile void * addr)\r
+{\r
+ __asm__ __volatile__( LOCK_PREFIX\r
+ "btcl %1,%0"\r
+ :"=m" (ADDR)\r
+ :"Ir" (nr));\r
+}\r
+\r
+/**\r
+ * test_and_set_bit - Set a bit and return its old value\r
+ * @nr: Bit to set\r
+ * @addr: Address to count from\r
+ *\r
+ * This operation is atomic and cannot be reordered. \r
+ * It also implies a memory barrier.\r
+ */\r
+static __inline__ int test_and_set_bit(int nr, volatile void * addr)\r
+{\r
+ int oldbit;\r
+\r
+ __asm__ __volatile__( LOCK_PREFIX\r
+ "btsl %2,%1\n\tsbbl %0,%0"\r
+ :"=r" (oldbit),"=m" (ADDR)\r
+ :"Ir" (nr) : "memory");\r
+ return oldbit;\r
+}\r
+\r
+/**\r
+ * __test_and_set_bit - Set a bit and return its old value\r
+ * @nr: Bit to set\r
+ * @addr: Address to count from\r
+ *\r
+ * This operation is non-atomic and can be reordered. \r
+ * If two examples of this operation race, one can appear to succeed\r
+ * but actually fail. You must protect multiple accesses with a lock.\r
+ */\r
+static __inline__ int __test_and_set_bit(int nr, volatile void * addr)\r
+{\r
+ int oldbit;\r
+\r
+ __asm__(\r
+ "btsl %2,%1\n\tsbbl %0,%0"\r
+ :"=r" (oldbit),"=m" (ADDR)\r
+ :"Ir" (nr));\r
+ return oldbit;\r
+}\r
+\r
+/**\r
+ * test_and_clear_bit - Clear a bit and return its old value\r
+ * @nr: Bit to set\r
+ * @addr: Address to count from\r
+ *\r
+ * This operation is atomic and cannot be reordered. \r
+ * It also implies a memory barrier.\r
+ */\r
+static __inline__ int test_and_clear_bit(int nr, volatile void * addr)\r
+{\r
+ int oldbit;\r
+\r
+ __asm__ __volatile__( LOCK_PREFIX\r
+ "btrl %2,%1\n\tsbbl %0,%0"\r
+ :"=r" (oldbit),"=m" (ADDR)\r
+ :"Ir" (nr) : "memory");\r
+ return oldbit;\r
+}\r
+\r
+/**\r
+ * __test_and_clear_bit - Clear a bit and return its old value\r
+ * @nr: Bit to set\r
+ * @addr: Address to count from\r
+ *\r
+ * This operation is non-atomic and can be reordered. \r
+ * If two examples of this operation race, one can appear to succeed\r
+ * but actually fail. You must protect multiple accesses with a lock.\r
+ */\r
+static __inline__ int __test_and_clear_bit(int nr, volatile void * addr)\r
+{\r
+ int oldbit;\r
+\r
+ __asm__(\r
+ "btrl %2,%1\n\tsbbl %0,%0"\r
+ :"=r" (oldbit),"=m" (ADDR)\r
+ :"Ir" (nr));\r
+ return oldbit;\r
+}\r
+\r
+/* WARNING: non atomic and it can be reordered! */\r
+static __inline__ int __test_and_change_bit(int nr, volatile void * addr)\r
+{\r
+ int oldbit;\r
+\r
+ __asm__ __volatile__(\r
+ "btcl %2,%1\n\tsbbl %0,%0"\r
+ :"=r" (oldbit),"=m" (ADDR)\r
+ :"Ir" (nr) : "memory");\r
+ return oldbit;\r
+}\r
+\r
+/**\r
+ * test_and_change_bit - Change a bit and return its new value\r
+ * @nr: Bit to set\r
+ * @addr: Address to count from\r
+ *\r
+ * This operation is atomic and cannot be reordered. \r
+ * It also implies a memory barrier.\r
+ */\r
+static __inline__ int test_and_change_bit(int nr, volatile void * addr)\r
+{\r
+ int oldbit;\r
+\r
+ __asm__ __volatile__( LOCK_PREFIX\r
+ "btcl %2,%1\n\tsbbl %0,%0"\r
+ :"=r" (oldbit),"=m" (ADDR)\r
+ :"Ir" (nr) : "memory");\r
+ return oldbit;\r
+}\r
+\r
+#if 0 /* Fool kernel-doc since it doesn't do macros yet */\r
+/**\r
+ * test_bit - Determine whether a bit is set\r
+ * @nr: bit number to test\r
+ * @addr: Address to start counting from\r
+ */\r
+static int test_bit(int nr, const volatile void * addr);\r
+#endif\r
+\r
+static __inline__ int constant_test_bit(int nr, const volatile void * addr)\r
+{\r
+ return ((1UL << (nr & 31)) & (((const volatile unsigned int *) addr)[nr >> 5])) != 0;\r
+}\r
+\r
+static __inline__ int variable_test_bit(int nr, volatile void * addr)\r
+{\r
+ int oldbit;\r
+\r
+ __asm__ __volatile__(\r
+ "btl %2,%1\n\tsbbl %0,%0"\r
+ :"=r" (oldbit)\r
+ :"m" (ADDR),"Ir" (nr));\r
+ return oldbit;\r
+}\r
+\r
+#define test_bit(nr,addr) \\r
+(__builtin_constant_p(nr) ? \\r
+ constant_test_bit((nr),(addr)) : \\r
+ variable_test_bit((nr),(addr)))\r
+\r
+/**\r
+ * find_first_zero_bit - find the first zero bit in a memory region\r
+ * @addr: The address to start the search at\r
+ * @size: The maximum size to search\r
+ *\r
+ * Returns the bit-number of the first zero bit, not the number of the byte\r
+ * containing a bit.\r
+ */\r
+static __inline__ int find_first_zero_bit(void * addr, unsigned size)\r
+{\r
+ int d0, d1, d2;\r
+ int res;\r
+\r
+ if (!size)\r
+ return 0;\r
+ /* This looks at memory. Mark it volatile to tell gcc not to move it around */\r
+ __asm__ __volatile__(\r
+ "movl $-1,%%eax\n\t"\r
+ "xorl %%edx,%%edx\n\t"\r
+ "repe; scasl\n\t"\r
+ "je 1f\n\t"\r
+ "xorl -4(%%edi),%%eax\n\t"\r
+ "subl $4,%%edi\n\t"\r
+ "bsfl %%eax,%%edx\n"\r
+ "1:\tsubl %%ebx,%%edi\n\t"\r
+ "shll $3,%%edi\n\t"\r
+ "addl %%edi,%%edx"\r
+ :"=d" (res), "=&c" (d0), "=&D" (d1), "=&a" (d2)\r
+ :"1" ((size + 31) >> 5), "2" (addr), "b" (addr));\r
+ return res;\r
+}\r
+\r
+/**\r
+ * find_next_zero_bit - find the first zero bit in a memory region\r
+ * @addr: The address to base the search on\r
+ * @offset: The bitnumber to start searching at\r
+ * @size: The maximum size to search\r
+ */\r
+static __inline__ int find_next_zero_bit (void * addr, int size, int offset)\r
+{\r
+ unsigned long * p = ((unsigned long *) addr) + (offset >> 5);\r
+ int set = 0, bit = offset & 31, res;\r
+ \r
+ if (bit) {\r
+ /*\r
+ * Look for zero in first byte\r
+ */\r
+ __asm__("bsfl %1,%0\n\t"\r
+ "jne 1f\n\t"\r
+ "movl $32, %0\n"\r
+ "1:"\r
+ : "=r" (set)\r
+ : "r" (~(*p >> bit)));\r
+ if (set < (32 - bit))\r
+ return set + offset;\r
+ set = 32 - bit;\r
+ p++;\r
+ }\r
+ /*\r
+ * No zero yet, search remaining full bytes for a zero\r
+ */\r
+ res = find_first_zero_bit (p, size - 32 * (p - (unsigned long *) addr));\r
+ return (offset + set + res);\r
+}\r
+\r
+/**\r
+ * ffz - find first zero in word.\r
+ * @word: The word to search\r
+ *\r
+ * Undefined if no zero exists, so code should check against ~0UL first.\r
+ */\r
+static __inline__ unsigned long ffz(unsigned long word)\r
+{\r
+ __asm__("bsfl %1,%0"\r
+ :"=r" (word)\r
+ :"r" (~word));\r
+ return word;\r
+}\r
+\r
+#ifdef __KERNEL__\r
+\r
+/**\r
+ * ffs - find first bit set\r
+ * @x: the word to search\r
+ *\r
+ * This is defined the same way as\r
+ * the libc and compiler builtin ffs routines, therefore\r
+ * differs in spirit from the above ffz (man ffs).\r
+ */\r
+static __inline__ int ffs(int x)\r
+{\r
+ int r;\r
+\r
+ __asm__("bsfl %1,%0\n\t"\r
+ "jnz 1f\n\t"\r
+ "movl $-1,%0\n"\r
+ "1:" : "=r" (r) : "rm" (x));\r
+ return r+1;\r
+}\r
+\r
+/**\r
+ * hweightN - returns the hamming weight of a N-bit word\r
+ * @x: the word to weigh\r
+ *\r
+ * The Hamming Weight of a number is the total number of bits set in it.\r
+ */\r
+\r
+#define hweight32(x) generic_hweight32(x)\r
+#define hweight16(x) generic_hweight16(x)\r
+#define hweight8(x) generic_hweight8(x)\r
+\r
+#endif /* __KERNEL__ */\r
+\r
+#ifdef __KERNEL__\r
+\r
+#define ext2_set_bit __test_and_set_bit\r
+#define ext2_clear_bit __test_and_clear_bit\r
+#define ext2_test_bit test_bit\r
+#define ext2_find_first_zero_bit find_first_zero_bit\r
+#define ext2_find_next_zero_bit find_next_zero_bit\r
+\r
+/* Bitmap functions for the minix filesystem. */\r
+#define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,addr)\r
+#define minix_set_bit(nr,addr) __set_bit(nr,addr)\r
+#define minix_test_and_clear_bit(nr,addr) __test_and_clear_bit(nr,addr)\r
+#define minix_test_bit(nr,addr) test_bit(nr,addr)\r
+#define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size)\r
+\r
+#endif /* __KERNEL__ */\r
+\r
+#endif /* _I386_BITOPS_H */\r
--- /dev/null
+#ifndef _LINUX_BITOPS_H\r
+#define _LINUX_BITOPS_H\r
+\r
+\r
+/*\r
+ * ffs: find first bit set. This is defined the same way as\r
+ * the libc and compiler builtin ffs routines, therefore\r
+ * differs in spirit from the above ffz (man ffs).\r
+ */\r
+\r
+static inline int generic_ffs(int x)\r
+{\r
+ int r = 1;\r
+\r
+ if (!x)\r
+ return 0;\r
+ if (!(x & 0xffff)) {\r
+ x >>= 16;\r
+ r += 16;\r
+ }\r
+ if (!(x & 0xff)) {\r
+ x >>= 8;\r
+ r += 8;\r
+ }\r
+ if (!(x & 0xf)) {\r
+ x >>= 4;\r
+ r += 4;\r
+ }\r
+ if (!(x & 3)) {\r
+ x >>= 2;\r
+ r += 2;\r
+ }\r
+ if (!(x & 1)) {\r
+ x >>= 1;\r
+ r += 1;\r
+ }\r
+ return r;\r
+}\r
+\r
+/*\r
+ * hweightN: returns the hamming weight (i.e. the number\r
+ * of bits set) of a N-bit word\r
+ */\r
+\r
+static inline unsigned int generic_hweight32(unsigned int w)\r
+{\r
+ unsigned int res = (w & 0x55555555) + ((w >> 1) & 0x55555555);\r
+ res = (res & 0x33333333) + ((res >> 2) & 0x33333333);\r
+ res = (res & 0x0F0F0F0F) + ((res >> 4) & 0x0F0F0F0F);\r
+ res = (res & 0x00FF00FF) + ((res >> 8) & 0x00FF00FF);\r
+ return (res & 0x0000FFFF) + ((res >> 16) & 0x0000FFFF);\r
+}\r
+\r
+static inline unsigned int generic_hweight16(unsigned int w)\r
+{\r
+ unsigned int res = (w & 0x5555) + ((w >> 1) & 0x5555);\r
+ res = (res & 0x3333) + ((res >> 2) & 0x3333);\r
+ res = (res & 0x0F0F) + ((res >> 4) & 0x0F0F);\r
+ return (res & 0x00FF) + ((res >> 8) & 0x00FF);\r
+}\r
+\r
+static inline unsigned int generic_hweight8(unsigned int w)\r
+{\r
+ unsigned int res = (w & 0x55) + ((w >> 1) & 0x55);\r
+ res = (res & 0x33) + ((res >> 2) & 0x33);\r
+ return (res & 0x0F) + ((res >> 4) & 0x0F);\r
+}\r
+\r
+#include "asm/bitops.h"\r
+\r
+\r
+#endif\r
--- /dev/null
+#ifndef _Boot_H_\r
+#define _Boot_H_\r
+\r
+#include "config.h"\r
+\r
+/***************************************************************************\r
+ Includes used by XBox boot code\r
+ ***************************************************************************/\r
+/***************************************************************************\r
+ * *\r
+ * This program is free software; you can redistribute it and/or modify *\r
+ * it under the terms of the GNU General Public License as published by *\r
+ * the Free Software Foundation; either version 2 of the License, or *\r
+ * (at your option) any later version. *\r
+ * *\r
+ ***************************************************************************/\r
+\r
+/////////////////////////////////\r
+// configuration\r
+\r
+#include "consts.h"\r
+#include "stdint.h"\r
+#include "cromwell_types.h"\r
+\r
+\r
+unsigned int cromwell_config;\r
+unsigned int cromwell_retryload;\r
+unsigned int cromwell_loadbank;\r
+unsigned int cromwell_Biostype;\r
+\r
+unsigned int xbox_ram;\r
+\r
+#define XROMWELL 0\r
+#define CROMWELL 1\r
+\r
+#define ICON_WIDTH 64\r
+#define ICON_HEIGHT 64\r
+/*\r
+static double min (double a, double b)\r
+{\r
+ if (a < b) return a; else return b;\r
+}\r
+\r
+static inline double max (double a, double b)\r
+{\r
+ if (a > b) return a; else return b;\r
+}\r
+*/\r
+//#include "iso_fs.h"\r
+//#include "BootVideo.h"\r
+\r
+//#define ASSERT(exp) { if(!(exp)) { bprintf("Assert failed file " __FILE__ " line %d\n", __LINE__); } }\r
+\r
+#if 0\r
+extern volatile CURRENT_VIDEO_MODE_DETAILS vmode;\r
+unsigned int video_encoder;\r
+\r
+volatile u32 VIDEO_CURSOR_POSX;\r
+volatile u32 VIDEO_CURSOR_POSY;\r
+volatile u32 VIDEO_ATTR;\r
+volatile u32 VIDEO_LUMASCALING;\r
+volatile u32 VIDEO_RSCALING;\r
+volatile u32 VIDEO_BSCALING;\r
+volatile u32 BIOS_TICK_COUNT;\r
+volatile u32 VIDEO_VSYNC_POSITION;\r
+volatile u32 VIDEO_VSYNC_DIR;\r
+volatile u32 DVD_TRAY_STATE;\r
+\r
+u8 VIDEO_AV_MODE ;\r
+\r
+#define DVD_CLOSED 0\r
+#define DVD_CLOSING 1\r
+#define DVD_OPEN 2\r
+#define DVD_OPENING 3\r
+\r
+/////////////////////////////////\r
+// Superfunky i386 internal structures\r
+\r
+typedef struct gdt_t {\r
+ unsigned short m_wSize __attribute__ ((packed));\r
+ unsigned long m_dwBase32 __attribute__ ((packed));\r
+ unsigned short m_wDummy __attribute__ ((packed));\r
+} ts_descriptor_pointer;\r
+\r
+typedef struct { // inside an 8-byte protected mode interrupt vector\r
+ u16 m_wHandlerHighAddressLow16;\r
+ u16 m_wSelector;\r
+ u16 m_wType;\r
+ u16 m_wHandlerLinearAddressHigh16;\r
+} ts_pm_interrupt;\r
+\r
+typedef enum {\r
+ EDT_UNKNOWN= 0,\r
+ EDT_XBOXFS\r
+} enumDriveType;\r
+\r
+typedef struct tsHarddiskInfo { // this is the retained knowledge about an IDE device after init\r
+ unsigned short m_fwPortBase;\r
+ unsigned short m_wCountHeads;\r
+ unsigned short m_wCountCylinders;\r
+ unsigned short m_wCountSectorsPerTrack;\r
+ unsigned long m_dwCountSectorsTotal; /* total */\r
+ unsigned char m_bLbaMode; /* am i lba (0x40) or chs (0x00) */\r
+ unsigned char m_szIdentityModelNumber[40];\r
+ unsigned char term_space_1[2];\r
+ unsigned char m_szSerial[20];\r
+ unsigned char term_space_2[2];\r
+ char m_szFirmware[8];\r
+ unsigned char term_space_3[2];\r
+ unsigned char m_fDriveExists;\r
+ unsigned char m_fAtapi; // true if a CDROM, etc\r
+ enumDriveType m_enumDriveType;\r
+ unsigned char m_bCableConductors; // valid for device 0 if present\r
+ unsigned short m_wAtaRevisionSupported;\r
+ unsigned char s_length;\r
+ unsigned char m_length;\r
+ unsigned char m_fHasMbr;\r
+ unsigned short m_securitySettings; //This contains the contents of the ATA security regs\r
+} tsHarddiskInfo;\r
+\r
+/////////////////////////////////\r
+// LED-flashing codes\r
+// or these together as argument to I2cSetFrontpanelLed\r
+\r
+enum {\r
+ I2C_LED_RED0 = 0x80,\r
+ I2C_LED_RED1 = 0x40,\r
+ I2C_LED_RED2 = 0x20,\r
+ I2C_LED_RED3 = 0x10,\r
+ I2C_LED_GREEN0 = 0x08,\r
+ I2C_LED_GREEN1 = 0x04,\r
+ I2C_LED_GREEN2 = 0x02,\r
+ I2C_LED_GREEN3 = 0x01\r
+};\r
+\r
+///////////////////////////////\r
+/* BIOS-wide error codes all have b31 set */\r
+\r
+enum {\r
+ ERR_SUCCESS = 0, // completed without error\r
+\r
+ ERR_I2C_ERROR_TIMEOUT = 0x80000001, // I2C action failed because it did not complete in a reasonable time\r
+ ERR_I2C_ERROR_BUS = 0x80000002, // I2C action failed due to non retryable bus error\r
+\r
+ ERR_BOOT_PIC_ALG_BROKEN = 0x80000101 // PIC algorithm did not pass its self-test\r
+};\r
+\r
+/////////////////////////////////\r
+// some Boot API prototypes\r
+\r
+//////// BootPerformPicChallengeResponseAction.c\r
+\r
+/* ---------------------------- IO primitives -----------------------------------------------------------\r
+*/\r
+\r
+static __inline void IoOutputByte(u16 wAds, u8 bValue) {\r
+// __asm__ (" out %%al,%%dx" : : "edx" (dwAds), "al" (bValue) );\r
+ __asm__ __volatile__ ("outb %b0,%w1": :"a" (bValue), "Nd" (wAds));\r
+}\r
+\r
+static __inline void IoOutputWord(u16 wAds, u16 wValue) {\r
+// __asm__ (" out %%ax,%%dx " : : "edx" (dwAds), "ax" (wValue) );\r
+ __asm__ __volatile__ ("outw %0,%w1": :"a" (wValue), "Nd" (wAds));\r
+ }\r
+\r
+static __inline void IoOutputDword(u16 wAds, u32 dwValue) {\r
+// __asm__ (" out %%eax,%%dx " : : "edx" (dwAds), "ax" (wValue) );\r
+ __asm__ __volatile__ ("outl %0,%w1": :"a" (dwValue), "Nd" (wAds));\r
+}\r
+\r
+\r
+static __inline u8 IoInputByte(u16 wAds) {\r
+ unsigned char _v;\r
+\r
+ __asm__ __volatile__ ("inb %w1,%0":"=a" (_v):"Nd" (wAds));\r
+ return _v;\r
+}\r
+\r
+static __inline u16 IoInputWord(u16 wAds) {\r
+ u16 _v;\r
+\r
+ __asm__ __volatile__ ("inw %w1,%0":"=a" (_v):"Nd" (wAds));\r
+ return _v;\r
+}\r
+\r
+static __inline u32 IoInputDword(u16 wAds) {\r
+ u32 _v;\r
+\r
+ __asm__ __volatile__ ("inl %w1,%0":"=a" (_v):"Nd" (wAds));\r
+ return _v;\r
+}\r
+\r
+#define rdmsr(msr,val1,val2) \\r
+ __asm__ __volatile__("rdmsr" \\r
+ : "=a" (val1), "=d" (val2) \\r
+ : "c" (msr))\r
+\r
+#define wrmsr(msr,val1,val2) \\r
+ __asm__ __volatile__("wrmsr" \\r
+ : /* no outputs */ \\r
+ : "c" (msr), "a" (val1), "d" (val2))\r
+\r
+\r
+void BootPciInterruptEnable(void);\r
+\r
+ // boot process\r
+int BootPerformPicChallengeResponseAction(void);\r
+ // LED control (see associated enum above)\r
+int I2cSetFrontpanelLed(u8 b);\r
+\r
+#define bprintf(...)\r
+\r
+#if PRINT_TRACE\r
+#define TRACE bprintf(__FILE__ " :%d\n\r",__LINE__);\r
+#else\r
+#define TRACE\r
+#endif\r
+\r
+typedef struct _LIST_ENTRY {\r
+ struct _LIST_ENTRY *m_plistentryNext;\r
+ struct _LIST_ENTRY *m_plistentryPrevious;\r
+} LIST_ENTRY;\r
+\r
+void ListEntryInsertAfterCurrent(LIST_ENTRY *plistentryCurrent, LIST_ENTRY *plistentryNew);\r
+void ListEntryRemove(LIST_ENTRY *plistentryCurrent);\r
+\r
+////////// BootPerformXCodeActions.c\r
+\r
+int BootPerformXCodeActions(void);\r
+\r
+#include "BootEEPROM.h"\r
+#include "BootParser.h"\r
+\r
+////////// BootStartBios.c\r
+\r
+void StartBios(CONFIGENTRY *config,int nActivePartition, int nFATXPresent,int bootfrom);\r
+int BootMenu(CONFIGENTRY *config,int nDrive,int nActivePartition, int nFATXPresent);\r
+\r
+////////// BootResetActions.c\r
+void ClearIDT (void);\r
+void BootResetAction(void);\r
+void BootCpuCache(bool fEnable) ;\r
+int printk(const char *szFormat, ...);\r
+void BiosCmosWrite(u8 bAds, u8 bData);\r
+u8 BiosCmosRead(u8 bAds);\r
+\r
+\r
+///////// BootPciPeripheralInitialization.c\r
+void BootPciPeripheralInitialization(void);\r
+void BootAGPBUSInitialization(void);\r
+void BootDetectMemorySize(void);\r
+extern void ReadPCIByte(unsigned int bus, unsigned int dev, unsigned intfunc, unsigned int reg_off, unsigned char *pbyteval);\r
+extern void WritePCIByte(unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg_off, unsigned char byteval);\r
+extern void ReadPCIDword(unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg_off, unsigned int *pdwordval);\r
+extern void WritePCIDword(unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg_off, unsigned int dwordval);\r
+extern void ReadPCIBlock(unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg_off, unsigned char *buf, unsigned int nbytes);\r
+extern void WritePCIBlock(unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg_off, unsigned char *buf, unsigned int nbytes);\r
+\r
+void PciWriteByte (unsigned int bus, unsigned int dev, unsigned int func,\r
+ unsigned int reg_off, unsigned char byteval);\r
+u8 PciReadByte(unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg_off);\r
+u32 PciWriteDword(unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg_off, u32 dw);\r
+u32 PciReadDword(unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg_off);\r
+\r
+///////// BootPerformPicChallengeResponseAction.c\r
+\r
+int I2CTransmitWord(u8 bPicAddressI2cFormat, u16 wDataToWrite);\r
+int I2CTransmitByteGetReturn(u8 bPicAddressI2cFormat, u8 bDataToWrite);\r
+bool I2CGetTemperature(int *, int *);\r
+void I2CModifyBits(u8 bAds, u8 bReg, u8 bData, u8 bMask);\r
+\r
+///////// BootIde.c\r
+\r
+extern tsHarddiskInfo tsaHarddiskInfo[]; // static struct stores data about attached drives\r
+int BootIdeInit(void);\r
+int BootIdeReadSector(int nDriveIndex, void * pbBuffer, unsigned int block, int byte_offset, int n_bytes);\r
+int BootIdeBootSectorHddOrElTorito(int nDriveIndex, u8 * pbaResult);\r
+int BootIdeAtapiAdditionalSenseCode(int nDrive, u8 * pba, int nLengthMaxReturn);\r
+int BootIdeSetTransferMode(int nIndexDrive, int nMode);\r
+int BootIdeWaitNotBusy(unsigned uIoBase);\r
+bool BootIdeAtapiReportFriendlyError(int nDriveIndex, char * szErrorReturn, int nMaxLengthError);\r
+void BootIdeAtapiPrintkFriendlyError(int nDriveIndex);\r
+\r
+///////// BootUSB.c\r
+\r
+void BootStopUSB(void);\r
+void BootStartUSB(void);\r
+void USBGetEvents(void);\r
+\r
+#include "xpad.h"\r
+\r
+extern struct xpad_data XPAD_current[4];\r
+extern struct xpad_data XPAD_last[4];\r
+\r
+extern void wait_ms(u32 ticks);\r
+extern void wait_us(u32 ticks);\r
+extern void wait_smalldelay(void);\r
+\r
+\r
+void * memcpy(void *dest, const void *src, size_t size);\r
+void * memset(void *dest, int data, size_t size);\r
+int memcmp(const void *buffer1, const void *buffer2, size_t num);\r
+int _strncmp(const char *sz1, const char *sz2, int nMax);\r
+char * strcpy(char *sz, const char *szc);\r
+char * _strncpy (char * dest, const char * src, size_t n);\r
+void chrreplace(char *string, char search, char ch);\r
+\r
+#define printf printk\r
+#define sleep wait_ms\r
+int tolower(int ch);\r
+int isspace (int c);\r
+\r
+void MemoryManagementInitialization(void * pvStartAddress, u32 dwTotalMemoryAllocLength);\r
+void * malloc(size_t size);\r
+void free(void *);\r
+\r
+extern volatile int nCountI2cinterrupts, nCountUnusedInterrupts, nCountUnusedInterruptsPic2, nCountInterruptsSmc, nCountInterruptsIde;\r
+extern volatile bool fSeenPowerdown;\r
+typedef enum {\r
+ ETS_OPEN_OR_OPENING=0,\r
+ ETS_CLOSING,\r
+ ETS_CLOSED\r
+} TRAY_STATE;\r
+extern volatile TRAY_STATE traystate;\r
+\r
+\r
+extern void BootInterruptsWriteIdt(void);\r
+#endif\r
+int copy_swap_trim(unsigned char *dst, unsigned char *src, int len);\r
+void HMAC_SHA1( unsigned char *result,\r
+ unsigned char *key, int key_length,\r
+ unsigned char *text1, int text1_length,\r
+ unsigned char *text2, int text2_length );\r
+\r
+char *strrchr0(char *string, char ch);\r
+\r
+#endif // _Boot_H_\r
--- /dev/null
+#ifndef _Consts_H_\r
+#define _Consts_H_\r
+\r
+/*\r
+ *\r
+ * includes for startup code in a form usable by the .S files\r
+ *\r
+ */\r
+\r
+ /***************************************************************************\r
+ * *\r
+ * This program is free software; you can redistribute it and/or modify *\r
+ * it under the terms of the GNU General Public License as published by *\r
+ * the Free Software Foundation; either version 2 of the License, or *\r
+ * (at your option) any later version. *\r
+ * *\r
+ ***************************************************************************/\r
+\r
+#define PCI_CFG_ADDR 0x0CF8\r
+#define PCI_CFG_DATA 0x0CFC\r
+\r
+\r
+#define I2C_IO_BASE 0xc000\r
+\r
+#define BUS_0 0\r
+#define BUS_1 1\r
+\r
+#define DEV_0 0\r
+#define DEV_1 1\r
+#define DEV_2 2\r
+#define DEV_3 3\r
+#define DEV_4 4\r
+#define DEV_5 5\r
+#define DEV_6 6\r
+#define DEV_7 7\r
+#define DEV_8 8\r
+#define DEV_9 9\r
+#define DEV_a 0xa\r
+#define DEV_b 0xb\r
+#define DEV_c 0xc\r
+#define DEV_d 0xd\r
+#define DEV_e 0xe\r
+#define DEV_f 0xf\r
+#define DEV_10 0x10\r
+#define DEV_11 0x11\r
+#define DEV_12 0x12\r
+#define DEV_13 0x13\r
+#define DEV_14 0x14\r
+#define DEV_15 0x15\r
+#define DEV_16 0x16\r
+#define DEV_17 0x17\r
+#define DEV_18 0x18\r
+#define DEV_19 0x19\r
+#define DEV_1a 0x1a\r
+#define DEV_1b 0x1b\r
+#define DEV_1c 0x1c\r
+#define DEV_1d 0x1d\r
+#define DEV_1e 0x1e\r
+#define DEV_1f 0x1f\r
+\r
+#define FUNC_0 0\r
+/*\r
+#define boot_post_macro(value) \\r
+ movb $(value), %al ;\\r
+ outb %al, $0x80 \r
+*/\r
+\r
+#endif // _Consts_H_\r
+\r
+\r
--- /dev/null
+#ifndef cromwell_types_h\r
+#define cromwell_types_h\r
+\r
+/////////////////////////////////\r
+// some typedefs to make for easy sizing\r
+\r
+//typedef unsigned long ULONG;\r
+typedef unsigned int u32;\r
+typedef unsigned short u16;\r
+typedef unsigned char u8;\r
+#ifndef bool_already_defined_\r
+ typedef int bool;\r
+#endif\r
+typedef unsigned long RGBA; // LSB=R -> MSB = A\r
+//typedef long long __int64;\r
+\r
+#define guint int\r
+#define guint8 unsigned char\r
+\r
+#define true 1\r
+#define false 0\r
+\r
+#ifndef NULL\r
+#define NULL ((void *)0)\r
+#endif\r
+\r
+#endif /* #ifndef cromwell_types_h */\r
--- /dev/null
+#ifndef _I386_ERRNO_H\r
+#define _I386_ERRNO_H\r
+\r
+#define EPERM 1 /* Operation not permitted */\r
+#define ENOENT 2 /* No such file or directory */\r
+#define ESRCH 3 /* No such process */\r
+#define EINTR 4 /* Interrupted system call */\r
+#define EIO 5 /* I/O error */\r
+#define ENXIO 6 /* No such device or address */\r
+#define E2BIG 7 /* Argument list too long */\r
+#define ENOEXEC 8 /* Exec format error */\r
+#define EBADF 9 /* Bad file number */\r
+#define ECHILD 10 /* No child processes */\r
+#define EAGAIN 11 /* Try again */\r
+#define ENOMEM 12 /* Out of memory */\r
+#define EACCES 13 /* Permission denied */\r
+#define EFAULT 14 /* Bad address */\r
+#define ENOTBLK 15 /* Block device required */\r
+#define EBUSY 16 /* Device or resource busy */\r
+#define EEXIST 17 /* File exists */\r
+#define EXDEV 18 /* Cross-device link */\r
+#define ENODEV 19 /* No such device */\r
+#define ENOTDIR 20 /* Not a directory */\r
+#define EISDIR 21 /* Is a directory */\r
+#define EINVAL 22 /* Invalid argument */\r
+#define ENFILE 23 /* File table overflow */\r
+#define EMFILE 24 /* Too many open files */\r
+#define ENOTTY 25 /* Not a typewriter */\r
+#define ETXTBSY 26 /* Text file busy */\r
+#define EFBIG 27 /* File too large */\r
+#define ENOSPC 28 /* No space left on device */\r
+#define ESPIPE 29 /* Illegal seek */\r
+#define EROFS 30 /* Read-only file system */\r
+#define EMLINK 31 /* Too many links */\r
+#define EPIPE 32 /* Broken pipe */\r
+#define EDOM 33 /* Math argument out of domain of func */\r
+#define ERANGE 34 /* Math result not representable */\r
+#define EDEADLK 35 /* Resource deadlock would occur */\r
+#define ENAMETOOLONG 36 /* File name too long */\r
+#define ENOLCK 37 /* No record locks available */\r
+#define ENOSYS 38 /* Function not implemented */\r
+#define ENOTEMPTY 39 /* Directory not empty */\r
+#define ELOOP 40 /* Too many symbolic links encountered */\r
+#define EWOULDBLOCK EAGAIN /* Operation would block */\r
+#define ENOMSG 42 /* No message of desired type */\r
+#define EIDRM 43 /* Identifier removed */\r
+#define ECHRNG 44 /* Channel number out of range */\r
+#define EL2NSYNC 45 /* Level 2 not synchronized */\r
+#define EL3HLT 46 /* Level 3 halted */\r
+#define EL3RST 47 /* Level 3 reset */\r
+#define ELNRNG 48 /* Link number out of range */\r
+#define EUNATCH 49 /* Protocol driver not attached */\r
+#define ENOCSI 50 /* No CSI structure available */\r
+#define EL2HLT 51 /* Level 2 halted */\r
+#define EBADE 52 /* Invalid exchange */\r
+#define EBADR 53 /* Invalid request descriptor */\r
+#define EXFULL 54 /* Exchange full */\r
+#define ENOANO 55 /* No anode */\r
+#define EBADRQC 56 /* Invalid request code */\r
+#define EBADSLT 57 /* Invalid slot */\r
+\r
+#define EDEADLOCK EDEADLK\r
+\r
+#define EBFONT 59 /* Bad font file format */\r
+#define ENOSTR 60 /* Device not a stream */\r
+#define ENODATA 61 /* No data available */\r
+#define ETIME 62 /* Timer expired */\r
+#define ENOSR 63 /* Out of streams resources */\r
+#define ENONET 64 /* Machine is not on the network */\r
+#define ENOPKG 65 /* Package not installed */\r
+#define EREMOTE 66 /* Object is remote */\r
+#define ENOLINK 67 /* Link has been severed */\r
+#define EADV 68 /* Advertise error */\r
+#define ESRMNT 69 /* Srmount error */\r
+#define ECOMM 70 /* Communication error on send */\r
+#define EPROTO 71 /* Protocol error */\r
+#define EMULTIHOP 72 /* Multihop attempted */\r
+#define EDOTDOT 73 /* RFS specific error */\r
+#define EBADMSG 74 /* Not a data message */\r
+#define EOVERFLOW 75 /* Value too large for defined data type */\r
+#define ENOTUNIQ 76 /* Name not unique on network */\r
+#define EBADFD 77 /* File descriptor in bad state */\r
+#define EREMCHG 78 /* Remote address changed */\r
+#define ELIBACC 79 /* Can not access a needed shared library */\r
+#define ELIBBAD 80 /* Accessing a corrupted shared library */\r
+#define ELIBSCN 81 /* .lib section in a.out corrupted */\r
+#define ELIBMAX 82 /* Attempting to link in too many shared libraries */\r
+#define ELIBEXEC 83 /* Cannot exec a shared library directly */\r
+#define EILSEQ 84 /* Illegal byte sequence */\r
+#define ERESTART 85 /* Interrupted system call should be restarted */\r
+#define ESTRPIPE 86 /* Streams pipe error */\r
+#define EUSERS 87 /* Too many users */\r
+#define ENOTSOCK 88 /* Socket operation on non-socket */\r
+#define EDESTADDRREQ 89 /* Destination address required */\r
+#define EMSGSIZE 90 /* Message too long */\r
+#define EPROTOTYPE 91 /* Protocol wrong type for socket */\r
+#define ENOPROTOOPT 92 /* Protocol not available */\r
+#define EPROTONOSUPPORT 93 /* Protocol not supported */\r
+#define ESOCKTNOSUPPORT 94 /* Socket type not supported */\r
+#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */\r
+#define EPFNOSUPPORT 96 /* Protocol family not supported */\r
+#define EAFNOSUPPORT 97 /* Address family not supported by protocol */\r
+#define EADDRINUSE 98 /* Address already in use */\r
+#define EADDRNOTAVAIL 99 /* Cannot assign requested address */\r
+#define ENETDOWN 100 /* Network is down */\r
+#define ENETUNREACH 101 /* Network is unreachable */\r
+#define ENETRESET 102 /* Network dropped connection because of reset */\r
+#define ECONNABORTED 103 /* Software caused connection abort */\r
+#define ECONNRESET 104 /* Connection reset by peer */\r
+#define ENOBUFS 105 /* No buffer space available */\r
+#define EISCONN 106 /* Transport endpoint is already connected */\r
+#define ENOTCONN 107 /* Transport endpoint is not connected */\r
+#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */\r
+#define ETOOMANYREFS 109 /* Too many references: cannot splice */\r
+#define ETIMEDOUT 110 /* Connection timed out */\r
+#define ECONNREFUSED 111 /* Connection refused */\r
+#define EHOSTDOWN 112 /* Host is down */\r
+#define EHOSTUNREACH 113 /* No route to host */\r
+#define EALREADY 114 /* Operation already in progress */\r
+#define EINPROGRESS 115 /* Operation now in progress */\r
+#define ESTALE 116 /* Stale NFS file handle */\r
+#define EUCLEAN 117 /* Structure needs cleaning */\r
+#define ENOTNAM 118 /* Not a XENIX named type file */\r
+#define ENAVAIL 119 /* No XENIX semaphores available */\r
+#define EISNAM 120 /* Is a named type file */\r
+#define EREMOTEIO 121 /* Remote I/O error */\r
+#define EDQUOT 122 /* Quota exceeded */\r
+\r
+#define ENOMEDIUM 123 /* No medium found */\r
+#define EMEDIUMTYPE 124 /* Wrong medium type */\r
+\r
+#endif\r
--- /dev/null
+/*\r
+ * linux-wrapper.h\r
+ *\r
+ * Hard coded Linux kernel replacements for x86\r
+ *\r
+ * (c) 2003 Georg Acher (georg@acher.org)\r
+ *\r
+ * Emulation of:\r
+ * typedefs\r
+ * structs\r
+ * macros\r
+ *\r
+ * All structs and prototypes are based on kernel source 2.5.72\r
+ *\r
+ * #include <standard-GPL-header.h>\r
+ */\r
+\r
+/*------------------------------------------------------------------------*/\r
+/* Typedefs */\r
+/*------------------------------------------------------------------------*/ \r
+#include "cromwell_types.h"\r
+\r
+typedef unsigned int __u32;\r
+//typedef __u32 u32;\r
+typedef unsigned short __u16;\r
+//typedef __u16 u16;\r
+typedef unsigned char __u8;\r
+//typedef __u8 u8;\r
+\r
+typedef short s16;\r
+\r
+typedef u32 dma_addr_t;\r
+\r
+typedef int spinlock_t;\r
+typedef int atomic_t;\r
+#ifndef STANDALONE\r
+typedef int mode_t;\r
+typedef int pid_t;\r
+typedef int ssize_t;\r
+\r
+#endif\r
+typedef int irqreturn_t;\r
+typedef unsigned long kernel_ulong_t;\r
+\r
+typedef int wait_queue_head_t;\r
+/*------------------------------------------------------------------------*/ \r
+/* Stuff from xbox/linux environment */\r
+/*------------------------------------------------------------------------*/ \r
+\r
+#include "list.h"\r
+\r
+#ifndef STANDALONE\r
+#ifdef MODULE\r
+typedef int size_t;\r
+#define NULL ((void*)0)\r
+extern void * memset(void *,int,unsigned int);\r
+extern void * memcpy(void *,const void *,unsigned int);\r
+#if 0\r
+extern char * strcpy(char *,const char *);\r
+#else\r
+static inline char * strcpy(char * dest,const char *src)\r
+{\r
+int d0, d1, d2;\r
+__asm__ __volatile__(\r
+ "1:\tlodsb\n\t"\r
+ "stosb\n\t"\r
+ "testb %%al,%%al\n\t"\r
+ "jne 1b"\r
+ : "=&S" (d0), "=&D" (d1), "=&a" (d2)\r
+ :"0" (src),"1" (dest) : "memory");\r
+return dest;\r
+}\r
+#endif\r
+extern size_t strlen(const char *);\r
+\r
+extern int memcmp(const void *,const void *,unsigned int);\r
+\r
+#else\r
+#include "boot.h"\r
+#include "config.h"\r
+#endif\r
+#else\r
+#include <stdarg.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include "consts.h"\r
+#include <string.h>\r
+#endif\r
+\r
+/*------------------------------------------------------------------------*/ \r
+/* General structs */\r
+/*------------------------------------------------------------------------*/ \r
+\r
+struct timer_list { \r
+ void (*function)(unsigned long);\r
+ unsigned long data;\r
+ int expires;\r
+ struct list_head timer_list;\r
+};\r
+\r
+struct work_struct {\r
+ void (*func)(void *);\r
+};\r
+struct device {\r
+ char name[128];\r
+ struct bus_type *bus;\r
+ int dma_mask;\r
+ char bus_id[16];\r
+ struct device_driver* driver;\r
+ void *driver_data;\r
+ struct device *parent;\r
+ struct list_head driver_list;\r
+ void (*release)(struct device * dev);\r
+};\r
+struct class_device{int a;};\r
+struct semaphore{int a;};\r
+\r
+struct device_driver{\r
+ char *name;\r
+ struct bus_type *bus;\r
+ int (*probe) (struct device * dev);\r
+ int (*remove) (struct device * dev);\r
+ struct list_head devices;\r
+};\r
+\r
+struct bus_type {\r
+ char * name; \r
+ int (*match)(struct device * dev, struct device_driver * drv);\r
+ struct device * (*add) (struct device * parent, char * bus_id);\r
+ int (*hotplug) (struct device *dev, char **envp, \r
+ int num_envp, char *buffer, int buffer_size);\r
+};\r
+\r
+struct dummy_process\r
+{\r
+ int flags;\r
+};\r
+\r
+struct pt_regs\r
+{\r
+ int a;\r
+};\r
+struct completion {\r
+ unsigned int done;\r
+ wait_queue_head_t wait;\r
+};\r
+\r
+/* from mod_devicetable.h */\r
+\r
+struct usb_device_id {\r
+ /* which fields to match against? */\r
+ __u16 match_flags;\r
+\r
+ /* Used for product specific matches; range is inclusive */\r
+ __u16 idVendor;\r
+ __u16 idProduct;\r
+ __u16 bcdDevice_lo;\r
+ __u16 bcdDevice_hi;\r
+\r
+ /* Used for device class matches */\r
+ __u8 bDeviceClass;\r
+ __u8 bDeviceSubClass;\r
+ __u8 bDeviceProtocol;\r
+\r
+ /* Used for interface class matches */\r
+ __u8 bInterfaceClass;\r
+ __u8 bInterfaceSubClass;\r
+ __u8 bInterfaceProtocol;\r
+\r
+ /* not matched against */\r
+ kernel_ulong_t driver_info;\r
+};\r
+\r
+/* Some useful macros to use to create struct usb_device_id */\r
+#define USB_DEVICE_ID_MATCH_VENDOR 0x0001\r
+#define USB_DEVICE_ID_MATCH_PRODUCT 0x0002\r
+#define USB_DEVICE_ID_MATCH_DEV_LO 0x0004\r
+#define USB_DEVICE_ID_MATCH_DEV_HI 0x0008\r
+#define USB_DEVICE_ID_MATCH_DEV_CLASS 0x0010\r
+#define USB_DEVICE_ID_MATCH_DEV_SUBCLASS 0x0020\r
+#define USB_DEVICE_ID_MATCH_DEV_PROTOCOL 0x0040\r
+#define USB_DEVICE_ID_MATCH_INT_CLASS 0x0080\r
+#define USB_DEVICE_ID_MATCH_INT_SUBCLASS 0x0100\r
+#define USB_DEVICE_ID_MATCH_INT_PROTOCOL 0x0200\r
+\r
+/*------------------------------------------------------------------------*/ \r
+/* imported functions from top-level */\r
+/*------------------------------------------------------------------------*/ \r
+\r
+//void zxprintf(char* fmt, ...);\r
+//void zxsprintf(char *buffer, char* fmt, ...);\r
+//int zxsnprintf(char *buffer, size_t s, char* fmt, ...);\r
+\r
+/*------------------------------------------------------------------------*/ \r
+/* PCI structs (taken from linux/pci.h et al., but slightly modified) */\r
+/*------------------------------------------------------------------------*/ \r
+\r
+struct pci_dev {\r
+ int vendor;\r
+ int device;\r
+ struct pci_bus *bus;\r
+ int irq;\r
+ char *slot_name;\r
+ struct device dev;\r
+ int base[4];\r
+ int flags[4];\r
+ void * data;\r
+};\r
+\r
+struct pci_bus {\r
+ unsigned char number;\r
+};\r
+\r
+struct pci_device_id {\r
+ __u32 vendor, device; /* Vendor and device ID or PCI_ANY_ID*/\r
+ __u32 subvendor, subdevice; /* Subsystem ID's or PCI_ANY_ID */\r
+ __u32 class, class_mask; /* (class,subclass,prog-if) triplet */\r
+ kernel_ulong_t driver_data; /* Data private to the driver */\r
+};\r
+\r
+struct pci_driver {\r
+ struct list_head node;\r
+ char *name;\r
+ const struct pci_device_id *id_table; /* must be non-NULL for probe to be called */\r
+ int (*probe) (struct pci_dev *dev, const struct pci_device_id *id); /* New device inserted */\r
+ void (*remove) (struct pci_dev *dev); /* Device removed (NULL if not a hot-plug capable driver) */\r
+ int (*save_state) (struct pci_dev *dev, u32 state); /* Save Device Context */\r
+ int (*suspend) (struct pci_dev *dev, u32 state); /* Device suspended */\r
+ int (*resume) (struct pci_dev *dev); /* Device woken up */\r
+ int (*enable_wake) (struct pci_dev *dev, u32 state, int enable); /* Enable wake event */\r
+};\r
+\r
+struct scatterlist\r
+{\r
+ int page;\r
+ int offset;\r
+ int length;\r
+};\r
+\r
+struct usbdevfs_hub_portinfo\r
+{\r
+ int nports;\r
+ int port[8];\r
+};\r
+\r
+/*------------------------------------------------------------------------*/ \r
+/* constant defines */\r
+/*------------------------------------------------------------------------*/ \r
+\r
+#define TASK_UNINTERRUPTIBLE 0\r
+#define HZ 100 /* Don't rely on that... */\r
+#define KERN_DEBUG "DBG: "\r
+#define KERN_ERR "ERR: "\r
+#define KERN_WARNING "WRN: "\r
+#define KERN_INFO "INF: "\r
+#define GFP_KERNEL 0\r
+#define GFP_ATOMIC 0\r
+#define GFP_NOIO 0\r
+#define SLAB_ATOMIC 0\r
+#define PCI_ANY_ID (~0)\r
+#define SIGKILL 9\r
+#define THIS_MODULE 0\r
+//#define PAGE_SIZE 4096\r
+\r
+\r
+#define CLONE_FS 0\r
+#define CLONE_FILES 0\r
+#define CLONE_SIGHAND 0\r
+#define PF_FREEZE 0\r
+#define PF_IOTHREAD 0\r
+\r
+\r
+#define USBDEVFS_HUB_PORTINFO 1234\r
+#define SA_SHIRQ 0\r
+\r
+#undef PCI_COMMAND\r
+#define PCI_COMMAND 0\r
+#undef PCI_COMMAND_MASTER\r
+#define PCI_COMMAND_MASTER 0\r
+/*------------------------------------------------------------------------*/ \r
+/* Module/export macros */\r
+/*------------------------------------------------------------------------*/ \r
+\r
+#define MODULE_AUTHOR(a)\r
+#define MODULE_DESCRIPTION(a)\r
+#define MODULE_LICENSE(a)\r
+#define MODULE_DEVICE_TABLE(type,name) void* module_table_##name=&name\r
+\r
+#define __devinit\r
+#define __exit\r
+#define __init\r
+#define __devinitdata\r
+#define module_init(x) static void module_init_##x(void){ x();}\r
+#define module_exit(x) void module_exit_##x(void){ x();}\r
+#define EXPORT_SYMBOL_GPL(x)\r
+#define EXPORT_SYMBOL(x)\r
+\r
+#define __setup(x,y) int setup_##y=(int)y\r
+#define subsys_initcall(x) void subsys_##x(void){x();}\r
+\r
+/*------------------------------------------------------------------------*/ \r
+/* Access macros */\r
+/*------------------------------------------------------------------------*/ \r
+\r
+#define dev_get_drvdata(a) (a)->driver_data\r
+#define dev_set_drvdata(a,b) (a)->driver_data=(b)\r
+\r
+#define __io_virt(x) ((void *)(x))\r
+#define readl(addr) (*(volatile unsigned int *) __io_virt(addr))\r
+#define writel(b,addr) (*(volatile unsigned int *) __io_virt(addr) = (b))\r
+#define likely(x) (x)\r
+#define unlikely(x) (x)\r
+#define prefetch(x) 1\r
+\r
+/* The kernel macro for list_for_each_entry makes nonsense (have no clue\r
+ * why, this is just the same definition...) */\r
+\r
+#undef list_for_each_entry\r
+#define list_for_each_entry(pos, head, member) \\r
+ for (pos = list_entry((head)->next, typeof(*pos), member), \\r
+ prefetch(pos->member.next); \\r
+ &pos->member != (head); \\r
+ pos = list_entry(pos->member.next, typeof(*pos), member), \\r
+ prefetch(pos->member.next))\r
+\r
+/*------------------------------------------------------------------------*/ \r
+/* function wrapper macros */\r
+/*------------------------------------------------------------------------*/ \r
+#define kmalloc(x,y) ExAllocatePool(PagedPool,x)\r
+#define kfree(x) ExFreePool(x)\r
+\r
+//#define sprintf(a,b,format, arg...) zxsprintf((a),(b),format, ## arg)\r
+//#define snprintf(a,b,format, arg...) zxsnprintf((a),(b),format, ##arg)\r
+//#define printk(format, arg...) zxprintf(format, ## arg)\r
+#define snprintf(a,b,format, arg...) _snprintf((a),(b),format, ##arg)\r
+#define printk(format, arg...) DPRINT1(format, ## arg)\r
+#define BUG(...) do {} while(0)\r
+\r
+/* Locks & friends */\r
+\r
+#define DECLARE_MUTEX(x) struct semaphore x\r
+#define init_MUTEX(x)\r
+\r
+#define SPIN_LOCK_UNLOCKED 0\r
+#define spin_lock_init(a) do {} while(0)\r
+#define spin_lock(a) *(int*)a=1\r
+#define spin_unlock(a) do {} while(0)\r
+\r
+#define spin_lock_irqsave(a,b) b=0\r
+#define spin_unlock_irqrestore(a,b)\r
+\r
+#if 0\r
+#define local_irq_save(x) __asm__ __volatile__("pushfl ; popl %0 ; cli":"=g" (x): /* no input */ :"memory")\r
+#define local_irq_restore(x) __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory", "cc")\r
+#else\r
+#define local_irq_save(x) do {} while(0) \r
+#define local_irq_restore(x) do {} while(0) \r
+#endif\r
+\r
+#define atomic_inc(x) *(x)+=1\r
+#define atomic_dec(x) *(x)-=1\r
+#define atomic_dec_and_test(x) (*(x)-=1,(*(x))==0)\r
+#define atomic_set(x,a) *(x)=a\r
+#define atomic_read(x) *(x)\r
+#define ATOMIC_INIT(x) (x)\r
+\r
+#define down(x) do {} while(0) \r
+#define up(x) do {} while(0)\r
+#define down_trylock(a) 0\r
+\r
+#define down_read(a) do {} while(0)\r
+#define up_read(a) do {} while(0)\r
+\r
+#define DECLARE_WAIT_QUEUE_HEAD(x) int x\r
+\r
+#define DECLARE_COMPLETION(x) struct completion x\r
+\r
+/* driver */\r
+\r
+#define driver_unregister(a) do {} while(0)\r
+#define put_device(a) do {} while(0)\r
+\r
+\r
+/* PCI */\r
+#define pci_pool_create(a,b,c,d,e) (void*)1\r
+\r
+#define pci_pool_alloc(a,b,c) my_pci_pool_alloc(a,b,c) \r
+\r
+static void __inline__ *my_pci_pool_alloc(void* pool, size_t size,\r
+ dma_addr_t *dma_handle)\r
+{\r
+ void* a;\r
+ a=kmalloc(size,0); //FIXME\r
+#ifdef MODULE\r
+ *dma_handle=((u32)a)&0xfffffff;\r
+#else\r
+ *dma_handle=(u32)a;\r
+#endif\r
+ return a;\r
+}\r
+\r
+\r
+#define pci_pool_free(a,b,c) kfree(b)\r
+#define pci_alloc_consistent(a,b,c) my_pci_alloc_consistent(a,b,c)\r
+\r
+static void __inline__ *my_pci_alloc_consistent(struct pci_dev *hwdev, size_t size,\r
+ dma_addr_t *dma_handle)\r
+{\r
+ void* a;\r
+\r
+ a=kmalloc(size+256,0); //FIXME\r
+ a=(void*)(((int)a+255)&~255); // 256 alignment\r
+ *dma_handle=((u32)a)&0xfffffff;\r
+\r
+ return a;\r
+}\r
+\r
+#define pci_free_consistent(a,b,c,d) kfree(c)\r
+#define pci_pool_destroy(a) do {} while(0)\r
+\r
+#define pci_module_init(x) my_pci_module_init(x)\r
+int my_pci_module_init(struct pci_driver *x);\r
+\r
+#define pci_unregister_driver(a) do {} while(0) \r
+\r
+#define bus_register(a) do {} while(0)\r
+#define bus_unregister(a) do {} while(0)\r
+\r
+#define dma_map_single(a,b,c,d) ((u32)(b)&0xfffffff)\r
+#define dma_unmap_single(a,b,c,d) do {} while(0)\r
+#define pci_unmap_single(a,b,c,d) do {} while(0)\r
+#define dma_sync_single(a,b,c,d) do {} while(0)\r
+#define dma_sync_sg(a,b,c,d) do {} while(0)\r
+#define dma_map_sg(a,b,c,d) 0\r
+#define dma_unmap_sg(a,b,c,d) do {} while(0)\r
+\r
+#define usb_create_driverfs_dev_files(a) do {} while(0)\r
+#define usb_create_driverfs_intf_files(a) do {} while(0)\r
+#define sg_dma_address(x) ((u32)((x)->page*4096 + (x)->offset))\r
+#define sg_dma_len(x) ((x)->length) \r
+\r
+#define page_address(x) ((void*)(x/4096))\r
+\r
+#define DMA_TO_DEVICE 0\r
+#define DMA_FROM_DEVICE 0\r
+#define PCI_DMA_TODEVICE\r
+#define PCI_DMA_FROMDEVICE\r
+#define PCI_DMA_TODEVICE\r
+\r
+#define PCI_ROM_RESOURCE 0\r
+#define IORESOURCE_IO 1\r
+\r
+#define DECLARE_WAITQUEUE(a,b) wait_queue_head_t a=0\r
+#define init_waitqueue_head(a) do {} while(0)\r
+#define add_wait_queue(a,b) do {} while(0)\r
+#define remove_wait_queue(a,b) do {} while(0)\r
+\r
+#define wmb() __asm__ __volatile__ ("": : :"memory")\r
+#define rmb() __asm__ __volatile__ ("lock; addl $0,0(%%esp)": : :"memory")\r
+\r
+#define in_interrupt() 0\r
+\r
+#define init_completion(x) (x)->done=0\r
+#define wait_for_completion(x) my_wait_for_completion(x)\r
+void my_wait_for_completion(struct completion*);\r
+\r
+#define IRQ_NONE 0\r
+#define IRQ_HANDLED 1\r
+\r
+#define INIT_WORK(a,b,c) (a)->func=b\r
+\r
+#define set_current_state(a) do {} while(0)\r
+\r
+#define might_sleep() do {} while(0)\r
+#define daemonize(a) do {} while(0)\r
+#define allow_signal(a) do {} while(0)\r
+#define wait_event_interruptible(x,y) do {} while(0)\r
+#define flush_scheduled_work() do {} while(0)\r
+#define refrigerator(x) do {} while(0)\r
+#define signal_pending(x) 1 // fall through threads\r
+#define complete_and_exit(a,b) return 0\r
+\r
+#define kill_proc(a,b,c) 0\r
+#define yield() do {} while(0)\r
+#define cpu_relax() do {} while(0)\r
+\r
+/*------------------------------------------------------------------------*/ \r
+/* Kernel macros */\r
+/*------------------------------------------------------------------------*/ \r
+\r
+#define LINUX_VERSION_CODE 0x020572\r
+#define UTS_SYSNAME "XBOX"\r
+#define UTS_RELEASE "----"\r
+\r
+/* from linux/kernel.h */\r
+#define max_t(type,x,y) \\r
+ ({ type __x = (x); type __y = (y); __x > __y ? __x: __y; })\r
+\r
+#define min_t(type,x,y) \\r
+ ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; })\r
+\r
+#define container_of(ptr, type, member) ({ \\r
+ const typeof( ((type *)0)->member ) *__mptr = (ptr); \\r
+ (type *)( (char *)__mptr - offsetof(type,member) );})\r
+\r
+/* from linux/stddef.h */\r
+\r
+#undef offsetof\r
+#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)\r
+\r
+/*------------------------------------------------------------------------*/ \r
+/* Conversion macros */\r
+/*------------------------------------------------------------------------*/ \r
+\r
+#define __constant_cpu_to_le32(x) (x)\r
+#define cpu_to_le16(x) (x)\r
+#define le16_to_cpu(x) (x)\r
+#define cpu_to_le32(x) (x)\r
+#define cpu_to_le32p(x) (*(__u32*)(x))\r
+#define le32_to_cpup(x) (*(__u32*)(x))\r
+#define le32_to_cpu(x) ((u32)x)\r
+#define le16_to_cpus(x) do {} while (0)\r
+#define le16_to_cpup(x) (*(__u16*)(x))\r
+#define cpu_to_le16p(x) (*(__u16*)(x))\r
+\r
+/*------------------------------------------------------------------------*/ \r
+/* Debug output */\r
+/*------------------------------------------------------------------------*/ \r
+#ifdef DEBUG_MODE\r
+#define dev_printk(lvl,x,f,arg...) printk(f, ## arg)\r
+#define dev_dbg(x,f,arg...) do {} while (0) //printk(f, ## arg)\r
+#define dev_info(x,f,arg...) printk(f,## arg)\r
+#define dev_warn(x,f,arg...) printk(f,## arg)\r
+#define dev_err(x,f,arg...) printk(f,## arg)\r
+#define pr_debug(x,f,arg...) printk(f,## arg)\r
+#define usbprintk printk\r
+#endif\r
+\r
+#ifndef DEBUG_MODE\r
+#define dev_printk(lvl,x,f,arg...) do {} while (0)\r
+#define dev_dbg(x,f,arg...) do {} while (0) //printk(f, ## arg)\r
+#define dev_info(x,f,arg...) do {} while (0)\r
+#define dev_warn(x,f,arg...) do {} while (0)\r
+#define dev_err(x,f,arg...) do {} while (0)\r
+#define pr_debug(x,f,arg...) do {} while (0)\r
+#define usbprintk\r
+#endif\r
+\r
+\r
+\r
+#define PCI_DEVFN(a,b) 0\r
+#define PCI_SLOT(a) 0\r
+\r
+/*------------------------------------------------------------------------*/ \r
+/* Stuff from kernel */\r
+/*------------------------------------------------------------------------*/ \r
+\r
+#include "errno.h"\r
+#include "bitops.h"\r
+//#include "linux/pci_ids.h"\r
+\r
+/*------------------------------------------------------------------------*/ \r
+/* global variables */\r
+/*------------------------------------------------------------------------*/ \r
+\r
+#define jiffies my_jiffies\r
+extern int my_jiffies;\r
+#define current my_current\r
+extern struct dummy_process *my_current;\r
+\r
+extern struct list_head interrupt_list;\r
+\r
+/*------------------------------------------------------------------------*/ \r
+/* Function prototypes */\r
+/*------------------------------------------------------------------------*/ \r
+void STDCALL usb_hcd_pci_remove (struct pci_dev *dev);\r
+\r
+#define my_wait_ms(x) wait_ms(x)\r
+\r
+#define my_udelay(x) wait_ms(x)\r
+#define udelay(x) my_udelay(x)\r
+\r
+#define my_mdelay(x) wait_ms(1+x/1000);\r
+#define mdelay(x) my_mdelay(x);\r
+\r
+#define pci_find_slot(a,b) my_pci_find_slot(a,b)\r
+struct pci_dev *my_pci_find_slot(int a,int b);\r
+\r
+/*------------------------------------------------------------------------*/ \r
+/* Timer management */\r
+/*------------------------------------------------------------------------*/ \r
+\r
+#define MAX_TIMERS 20\r
+extern struct timer_list *main_timer_list[MAX_TIMERS];\r
+\r
+static void __inline__ init_timer(struct timer_list* t)\r
+{\r
+ INIT_LIST_HEAD(&t->timer_list);\r
+ t->function=NULL;\r
+ t->expires=0;\r
+}\r
+\r
+static void __inline__ add_timer(struct timer_list* t)\r
+{\r
+ int n;\r
+ for(n=0;n<MAX_TIMERS;n++)\r
+ if (main_timer_list[n]==0)\r
+ {\r
+ main_timer_list[n]=t;\r
+ break;\r
+ }\r
+}\r
+\r
+static void __inline__ del_timer(struct timer_list* t)\r
+{\r
+ int n;\r
+ for(n=0;n<MAX_TIMERS;n++)\r
+ if (main_timer_list[n]==t)\r
+ {\r
+ main_timer_list[n]=0;\r
+ break;\r
+ }\r
+}\r
+static void __inline__ del_timer_sync(struct timer_list* t)\r
+{\r
+ int n;\r
+ for(n=0;n<MAX_TIMERS;n++)\r
+ if (main_timer_list[n]==t)\r
+ {\r
+ main_timer_list[n]=0;\r
+ break;\r
+ }\r
+\r
+}\r
+static void __inline__ mod_timer(struct timer_list* t, int ex)\r
+{\r
+ del_timer(t);\r
+ t->expires=ex;\r
+ add_timer(t);\r
+}\r
+\r
+/*------------------------------------------------------------------------*/ \r
+/* Device driver and process related stuff */\r
+/*------------------------------------------------------------------------*/ \r
+\r
+static int __inline__ usb_major_init(void){return 0;}\r
+static void __inline__ usb_major_cleanup(void){}\r
+static void __inline__ schedule_work(void* p){}\r
+\r
+#define device_initialize(x) my_device_initialize(x)\r
+void my_device_initialize(struct device *dev);\r
+\r
+#define get_device(x) my_get_device(x)\r
+struct device *my_get_device(struct device *dev);\r
+\r
+#define device_add(x) my_device_add(x)\r
+int my_device_add(struct device *dev);\r
+\r
+#define driver_register(x) my_driver_register(x)\r
+int my_driver_register(struct device_driver *driver);\r
+\r
+#define device_unregister(a) my_device_unregister(a)\r
+int my_device_unregister(struct device *dev);\r
+\r
+#define DEVICE_ATTR(a,b,c,d) int xxx_##a\r
+#define device_create_file(a,b) do {} while(0)\r
+#define device_remove_file(a,b) do {} while(0)\r
+\r
+#define schedule_timeout(x) my_schedule_timeout(x)\r
+int my_schedule_timeout(int x);\r
+\r
+#define wake_up(x) my_wake_up(x)\r
+void my_wake_up(void*);\r
+\r
+// cannot be mapped via macro due to collision with urb->complete\r
+static void __inline__ complete(struct completion *p)\r
+{\r
+ /* Wake up x->wait */\r
+ p->done++;\r
+ wake_up(&p->wait);\r
+}\r
+\r
+#define kernel_thread(a,b,c) my_kernel_thread(a,b,c)\r
+int my_kernel_thread(int (*handler)(void*), void* parm, int flags);\r
+\r
+/*------------------------------------------------------------------------*/ \r
+/* PCI, simple and inlined... */\r
+/*------------------------------------------------------------------------*/ \r
+static int __inline__ pci_enable_device(struct pci_dev *dev) {return 0;}\r
+\r
+static unsigned long __inline__ pci_resource_start (struct pci_dev *dev, int x)\r
+{\r
+ return dev->base[x];\r
+}\r
+\r
+static unsigned long __inline__ pci_resource_len (struct pci_dev *dev, int x){return 0;}\r
+\r
+static int __inline__ request_mem_region(unsigned long addr, unsigned long len, const char * d){return 1;}\r
+\r
+static void __inline__ *ioremap_nocache(unsigned long addr, unsigned long len)\r
+{\r
+ return (void*)addr;\r
+}\r
+\r
+static int __inline__ release_mem_region(unsigned long addr, unsigned long len){return 0;}\r
+\r
+static int __inline__ pci_resource_flags(struct pci_dev *dev, int x)\r
+{\r
+ return dev->flags[x];\r
+}\r
+\r
+static int __inline__ request_region(unsigned long addr, unsigned long len, const char * d){return 0;}\r
+\r
+static int __inline__ pci_set_master(struct pci_dev *dev){return 0;}\r
+\r
+static int __inline__ iounmap(void* p){return 0;}\r
+\r
+static int __inline__ release_region(unsigned long addr, unsigned long len){return 0;}\r
+\r
+static int __inline__ pci_set_drvdata(struct pci_dev *dev, void* d)\r
+{\r
+ dev->data=(void*)d;\r
+ return 0;\r
+}\r
+\r
+static void __inline__ *pci_get_drvdata(struct pci_dev *dev)\r
+{\r
+ return dev->data;\r
+}\r
+\r
+/*------------------------------------------------------------------------*/ \r
+/* IRQ handling */\r
+/*------------------------------------------------------------------------*/ \r
+\r
+#define request_irq(a,b,c,d,e) my_request_irq(a,b,c,d,e)\r
+int my_request_irq(unsigned int irq,\r
+ int (*handler)(int, void *, struct pt_regs *),\r
+ unsigned long mode, const char *desc, void *data);\r
+\r
+#define free_irq(a,b) my_free_irq(a,b)\r
+int free_irq(int irq, void* p);\r
+\r
+\r
+\r
+struct my_irqs {\r
+ int (*handler)(int, void *, struct pt_regs *);\r
+ int irq;\r
+ void* data;\r
+};\r
+\r
+#define MAX_IRQS 8\r
+\r
+// Exported to top level\r
+\r
+void handle_irqs(int irq);\r
+void inc_jiffies(int);\r
+void init_wrapper(void);\r
+void do_all_timers(void);\r
+\r
+#define __KERNEL_DS 0x18\r
+\r
+\r
--- /dev/null
+#ifndef _BOOT_LIST_H\r
+#define _BOOT_LIST_H\r
+\r
+/*\r
+ * Simple doubly linked list implementation.\r
+ *\r
+ * Some of the internal functions ("__xxx") are useful when\r
+ * manipulating whole lists rather than single entries, as\r
+ * sometimes we already know the next/prev entries and we can\r
+ * generate better code by using them directly rather than\r
+ * using the generic single-entry routines.\r
+ */\r
+\r
+struct list_head {\r
+ struct list_head *next, *prev;\r
+};\r
+\r
+#define LIST_HEAD_INIT(name) { &(name), &(name) }\r
+\r
+#define LIST_HEAD(name) \\r
+ struct list_head name = LIST_HEAD_INIT(name)\r
+\r
+#define INIT_LIST_HEAD(ptr) do { \\r
+ (ptr)->next = (ptr); (ptr)->prev = (ptr); \\r
+} while (0)\r
+\r
+/*\r
+ * Insert a new entry between two known consecutive entries. \r
+ *\r
+ * This is only for internal list manipulation where we know\r
+ * the prev/next entries already!\r
+ */\r
+static inline void __list_add(struct list_head *new,\r
+ struct list_head *prev,\r
+ struct list_head *next)\r
+{\r
+ next->prev = new;\r
+ new->next = next;\r
+ new->prev = prev;\r
+ prev->next = new;\r
+}\r
+\r
+/**\r
+ * list_add - add a new entry\r
+ * @new: new entry to be added\r
+ * @head: list head to add it after\r
+ *\r
+ * Insert a new entry after the specified head.\r
+ * This is good for implementing stacks.\r
+ */\r
+static inline void list_add(struct list_head *new, struct list_head *head)\r
+{\r
+ __list_add(new, head, head->next);\r
+}\r
+\r
+/**\r
+ * list_add_tail - add a new entry\r
+ * @new: new entry to be added\r
+ * @head: list head to add it before\r
+ *\r
+ * Insert a new entry before the specified head.\r
+ * This is useful for implementing queues.\r
+ */\r
+static inline void list_add_tail(struct list_head *new, struct list_head *head)\r
+{\r
+ __list_add(new, head->prev, head);\r
+}\r
+\r
+/*\r
+ * Delete a list entry by making the prev/next entries\r
+ * point to each other.\r
+ *\r
+ * This is only for internal list manipulation where we know\r
+ * the prev/next entries already!\r
+ */\r
+static inline void __list_del(struct list_head *prev, struct list_head *next)\r
+{\r
+ next->prev = prev;\r
+ prev->next = next;\r
+}\r
+\r
+/**\r
+ * list_del - deletes entry from list.\r
+ * @entry: the element to delete from the list.\r
+ * Note: list_empty on entry does not return true after this, the entry is in an undefined state.\r
+ */\r
+static inline void list_del(struct list_head *entry)\r
+{\r
+ __list_del(entry->prev, entry->next);\r
+ entry->next = (void *) 0;\r
+ entry->prev = (void *) 0;\r
+}\r
+\r
+/**\r
+ * list_del_init - deletes entry from list and reinitialize it.\r
+ * @entry: the element to delete from the list.\r
+ */\r
+static inline void list_del_init(struct list_head *entry)\r
+{\r
+ __list_del(entry->prev, entry->next);\r
+ INIT_LIST_HEAD(entry); \r
+}\r
+\r
+/**\r
+ * list_move - delete from one list and add as another's head\r
+ * @list: the entry to move\r
+ * @head: the head that will precede our entry\r
+ */\r
+static inline void list_move(struct list_head *list, struct list_head *head)\r
+{\r
+ __list_del(list->prev, list->next);\r
+ list_add(list, head);\r
+}\r
+\r
+/**\r
+ * list_move_tail - delete from one list and add as another's tail\r
+ * @list: the entry to move\r
+ * @head: the head that will follow our entry\r
+ */\r
+static inline void list_move_tail(struct list_head *list,\r
+ struct list_head *head)\r
+{\r
+ __list_del(list->prev, list->next);\r
+ list_add_tail(list, head);\r
+}\r
+\r
+/**\r
+ * list_empty - tests whether a list is empty\r
+ * @head: the list to test.\r
+ */\r
+static inline int list_empty(struct list_head *head)\r
+{\r
+ return head->next == head;\r
+}\r
+\r
+static inline void __list_splice(struct list_head *list,\r
+ struct list_head *head)\r
+{\r
+ struct list_head *first = list->next;\r
+ struct list_head *last = list->prev;\r
+ struct list_head *at = head->next;\r
+\r
+ first->prev = head;\r
+ head->next = first;\r
+\r
+ last->next = at;\r
+ at->prev = last;\r
+}\r
+\r
+/**\r
+ * list_splice - join two lists\r
+ * @list: the new list to add.\r
+ * @head: the place to add it in the first list.\r
+ */\r
+static inline void list_splice(struct list_head *list, struct list_head *head)\r
+{\r
+ if (!list_empty(list))\r
+ __list_splice(list, head);\r
+}\r
+\r
+/**\r
+ * list_splice_init - join two lists and reinitialise the emptied list.\r
+ * @list: the new list to add.\r
+ * @head: the place to add it in the first list.\r
+ *\r
+ * The list at @list is reinitialised\r
+ */\r
+static inline void list_splice_init(struct list_head *list,\r
+ struct list_head *head)\r
+{\r
+ if (!list_empty(list)) {\r
+ __list_splice(list, head);\r
+ INIT_LIST_HEAD(list);\r
+ }\r
+}\r
+\r
+/**\r
+ * list_entry - get the struct for this entry\r
+ * @ptr: the &struct list_head pointer.\r
+ * @type: the type of the struct this is embedded in.\r
+ * @member: the name of the list_struct within the struct.\r
+ */\r
+#define list_entry(ptr, type, member) \\r
+ ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))\r
+\r
+/**\r
+ * list_for_each - iterate over a list\r
+ * @pos: the &struct list_head to use as a loop counter.\r
+ * @head: the head for your list.\r
+ */\r
+#define list_for_each(pos, head) \\r
+ for (pos = (head)->next; pos != (head); \\r
+ pos = pos->next)\r
+/**\r
+ * list_for_each_prev - iterate over a list backwards\r
+ * @pos: the &struct list_head to use as a loop counter.\r
+ * @head: the head for your list.\r
+ */\r
+#define list_for_each_prev(pos, head) \\r
+ for (pos = (head)->prev; pos != (head); \\r
+ pos = pos->prev)\r
+ \r
+/**\r
+ * list_for_each_safe - iterate over a list safe against removal of list entry\r
+ * @pos: the &struct list_head to use as a loop counter.\r
+ * @n: another &struct list_head to use as temporary storage\r
+ * @head: the head for your list.\r
+ */\r
+#define list_for_each_safe(pos, n, head) \\r
+ for (pos = (head)->next, n = pos->next; pos != (head); \\r
+ pos = n, n = pos->next)\r
+\r
+/**\r
+ * list_for_each_entry - iterate over list of given type\r
+ * @pos: the type * to use as a loop counter.\r
+ * @head: the head for your list.\r
+ * @member: the name of the list_struct within the struct.\r
+ */\r
+#define list_for_each_entry(pos, head, member) \\r
+ for (pos = list_entry((head)->next, typeof(*pos), member) \\r
+ &pos->member != (head); \\r
+ pos = list_entry(pos->member.next, typeof(*pos), member))\r
+\r
+#endif\r
--- /dev/null
+#ifndef PCI_IDS__H\r
+#define PCI_IDS__H\r
+\r
+#define PCI_VENDOR_ID_NS 0x100b\r
+#define PCI_DEVICE_ID_NS_87560_LIO 0x000e\r
+#define PCI_VENDOR_ID_AMD 0x1022\r
+#define PCI_VENDOR_ID_OPTI 0x1045\r
+\r
+#define PCI_CLASS_SERIAL_USB (PCI_CLASS_SERIAL_BUS_CTLR << 8 + PCI_SUBCLASS_SB_USB)\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+#ifndef __LINUX_USB_H\r
+#define __LINUX_USB_H\r
+\r
+\r
+#include "usb_ch9.h"\r
+\r
+#define USB_MAJOR 180\r
+\r
+\r
+#ifdef __KERNEL__\r
+#if 0\r
+#include <linux/config.h>\r
+#include <linux/errno.h> /* for -ENODEV */\r
+#include <linux/delay.h> /* for mdelay() */\r
+#include <linux/interrupt.h> /* for in_interrupt() */\r
+#include <linux/list.h> /* for struct list_head */\r
+#include <linux/device.h> /* for struct device */\r
+#include <linux/fs.h> /* for struct file_operations */\r
+#include <linux/completion.h> /* for struct completion */\r
+#include <linux/sched.h> /* for current && schedule_timeout */\r
+\r
+\r
+static __inline__ void wait_ms(unsigned int ms)\r
+{\r
+ if(!in_interrupt()) {\r
+ current->state = TASK_UNINTERRUPTIBLE;\r
+ schedule_timeout(1 + ms * HZ / 1000);\r
+ }\r
+ else\r
+ mdelay(ms);\r
+}\r
+#endif\r
+struct usb_device;\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/*\r
+ * Host-side wrappers for standard USB descriptors ... these are parsed\r
+ * from the data provided by devices. Parsing turns them from a flat\r
+ * sequence of descriptors into a hierarchy:\r
+ *\r
+ * - devices have one (usually) or more configs;\r
+ * - configs have one (often) or more interfaces;\r
+ * - interfaces have one (usually) or more settings;\r
+ * - each interface setting has zero or (usually) more endpoints.\r
+ *\r
+ * And there might be other descriptors mixed in with those.\r
+ *\r
+ * Devices may also have class-specific or vendor-specific descriptors.\r
+ */\r
+\r
+/* host-side wrapper for parsed endpoint descriptors */\r
+struct usb_host_endpoint {\r
+ struct usb_endpoint_descriptor desc;\r
+\r
+ unsigned char *extra; /* Extra descriptors */\r
+ int extralen;\r
+};\r
+\r
+/* host-side wrapper for one interface setting's parsed descriptors */\r
+struct usb_host_interface {\r
+ struct usb_interface_descriptor desc;\r
+\r
+ /* array of desc.bNumEndpoint endpoints associated with this\r
+ * interface setting. these will be in no particular order.\r
+ */\r
+ struct usb_host_endpoint *endpoint;\r
+\r
+ unsigned char *extra; /* Extra descriptors */\r
+ int extralen;\r
+};\r
+\r
+/**\r
+ * struct usb_interface - what usb device drivers talk to\r
+ * @altsetting: array of interface descriptors, one for each alternate\r
+ * setting that may be selected. Each one includes a set of\r
+ * endpoint configurations and will be in numberic order,\r
+ * 0..num_altsetting.\r
+ * @num_altsetting: number of altsettings defined.\r
+ * @act_altsetting: index of current altsetting. this number is always\r
+ * less than num_altsetting. after the device is configured, each\r
+ * interface uses its default setting of zero.\r
+ * @max_altsetting:\r
+ * @minor: the minor number assigned to this interface, if this\r
+ * interface is bound to a driver that uses the USB major number.\r
+ * If this interface does not use the USB major, this field should\r
+ * be unused. The driver should set this value in the probe()\r
+ * function of the driver, after it has been assigned a minor\r
+ * number from the USB core by calling usb_register_dev().\r
+ * @dev: driver model's view of this device\r
+ * @class_dev: driver model's class view of this device.\r
+ *\r
+ * USB device drivers attach to interfaces on a physical device. Each\r
+ * interface encapsulates a single high level function, such as feeding\r
+ * an audio stream to a speaker or reporting a change in a volume control.\r
+ * Many USB devices only have one interface. The protocol used to talk to\r
+ * an interface's endpoints can be defined in a usb "class" specification,\r
+ * or by a product's vendor. The (default) control endpoint is part of\r
+ * every interface, but is never listed among the interface's descriptors.\r
+ *\r
+ * The driver that is bound to the interface can use standard driver model\r
+ * calls such as dev_get_drvdata() on the dev member of this structure.\r
+ *\r
+ * Each interface may have alternate settings. The initial configuration\r
+ * of a device sets the first of these, but the device driver can change\r
+ * that setting using usb_set_interface(). Alternate settings are often\r
+ * used to control the the use of periodic endpoints, such as by having\r
+ * different endpoints use different amounts of reserved USB bandwidth.\r
+ * All standards-conformant USB devices that use isochronous endpoints\r
+ * will use them in non-default settings.\r
+ */\r
+struct usb_interface {\r
+ /* array of alternate settings for this interface.\r
+ * these will be in numeric order, 0..num_altsettting\r
+ */\r
+ struct usb_host_interface *altsetting;\r
+\r
+ unsigned act_altsetting; /* active alternate setting */\r
+ unsigned num_altsetting; /* number of alternate settings */\r
+ unsigned max_altsetting; /* total memory allocated */\r
+\r
+ struct usb_driver *driver; /* driver */\r
+ int minor; /* minor number this interface is bound to */\r
+ struct device dev; /* interface specific device info */\r
+ struct class_device class_dev;\r
+};\r
+#define to_usb_interface(d) container_of(d, struct usb_interface, dev)\r
+#define class_dev_to_usb_interface(d) container_of(d, struct usb_interface, class_dev)\r
+#define interface_to_usbdev(intf) \\r
+ container_of(intf->dev.parent, struct usb_device, dev)\r
+\r
+static inline void *usb_get_intfdata (struct usb_interface *intf)\r
+{\r
+ return dev_get_drvdata (&intf->dev);\r
+}\r
+\r
+static inline void usb_set_intfdata (struct usb_interface *intf, void *data)\r
+{\r
+ dev_set_drvdata(&intf->dev, data);\r
+}\r
+\r
+/* USB_DT_CONFIG: Configuration descriptor information.\r
+ *\r
+ * USB_DT_OTHER_SPEED_CONFIG is the same descriptor, except that the\r
+ * descriptor type is different. Highspeed-capable devices can look\r
+ * different depending on what speed they're currently running. Only\r
+ * devices with a USB_DT_DEVICE_QUALIFIER have an OTHER_SPEED_CONFIG.\r
+ */\r
+struct usb_host_config {\r
+ struct usb_config_descriptor desc;\r
+\r
+ /* the interfaces associated with this configuration\r
+ * these will be in numeric order, 0..desc.bNumInterfaces\r
+ */\r
+ struct usb_interface *interface;\r
+\r
+ unsigned char *extra; /* Extra descriptors */\r
+ int extralen;\r
+};\r
+\r
+// FIXME remove; exported only for drivers/usb/misc/auserwald.c\r
+// prefer usb_device->epnum[0..31]\r
+extern struct usb_endpoint_descriptor *\r
+ usb_epnum_to_ep_desc(struct usb_device *dev, unsigned epnum);\r
+\r
+int __usb_get_extra_descriptor(char *buffer, unsigned size,\r
+ unsigned char type, void **ptr);\r
+#define usb_get_extra_descriptor(ifpoint,type,ptr)\\r
+ __usb_get_extra_descriptor((ifpoint)->extra,(ifpoint)->extralen,\\r
+ type,(void**)ptr)\r
+\r
+/* -------------------------------------------------------------------------- */\r
+\r
+struct usb_operations;\r
+\r
+/* USB device number allocation bitmap */\r
+struct usb_devmap {\r
+ unsigned long devicemap[128 / (8*sizeof(unsigned long))];\r
+};\r
+\r
+/*\r
+ * Allocated per bus (tree of devices) we have:\r
+ */\r
+struct usb_bus {\r
+ struct device *controller; /* host/master side hardware */\r
+ int busnum; /* Bus number (in order of reg) */\r
+ char *bus_name; /* stable id (PCI slot_name etc) */\r
+\r
+ int devnum_next; /* Next open device number in round-robin allocation */\r
+\r
+ struct usb_devmap devmap; /* device address allocation map */\r
+ struct usb_operations *op; /* Operations (specific to the HC) */\r
+ struct usb_device *root_hub; /* Root hub */\r
+ struct list_head bus_list; /* list of busses */\r
+ void *hcpriv; /* Host Controller private data */\r
+\r
+ int bandwidth_allocated; /* on this bus: how much of the time\r
+ * reserved for periodic (intr/iso)\r
+ * requests is used, on average?\r
+ * Units: microseconds/frame.\r
+ * Limits: Full/low speed reserve 90%,\r
+ * while high speed reserves 80%.\r
+ */\r
+ int bandwidth_int_reqs; /* number of Interrupt requests */\r
+ int bandwidth_isoc_reqs; /* number of Isoc. requests */\r
+\r
+ struct dentry *usbfs_dentry; /* usbfs dentry entry for the bus */\r
+ struct dentry *usbdevfs_dentry; /* usbdevfs dentry entry for the bus */\r
+\r
+ atomic_t refcnt;\r
+};\r
+\r
+\r
+/* -------------------------------------------------------------------------- */\r
+\r
+/* This is arbitrary.\r
+ * From USB 2.0 spec Table 11-13, offset 7, a hub can\r
+ * have up to 255 ports. The most yet reported is 10.\r
+ */\r
+#define USB_MAXCHILDREN (16)\r
+\r
+struct usb_tt;\r
+\r
+struct usb_device {\r
+ int devnum; /* Address on USB bus */\r
+ char devpath [16]; /* Use in messages: /port/port/... */\r
+ enum usb_device_state state; /* configured, not attached, etc */\r
+ enum usb_device_speed speed; /* high/full/low (or error) */\r
+\r
+ struct usb_tt *tt; /* low/full speed dev, highspeed hub */\r
+ int ttport; /* device port on that tt hub */\r
+\r
+ struct semaphore serialize;\r
+\r
+ unsigned int toggle[2]; /* one bit for each endpoint ([0] = IN, [1] = OUT) */\r
+ unsigned int halted[2]; /* endpoint halts; one bit per endpoint # & direction; */\r
+ /* [0] = IN, [1] = OUT */\r
+ int epmaxpacketin[16]; /* INput endpoint specific maximums */\r
+ int epmaxpacketout[16]; /* OUTput endpoint specific maximums */\r
+\r
+ struct usb_device *parent; /* our hub, unless we're the root */\r
+ struct usb_bus *bus; /* Bus we're part of */\r
+\r
+ struct device dev; /* Generic device interface */\r
+\r
+ struct usb_device_descriptor descriptor;/* Descriptor */\r
+ struct usb_host_config *config; /* All of the configs */\r
+ struct usb_host_config *actconfig;/* the active configuration */\r
+\r
+ char **rawdescriptors; /* Raw descriptors for each config */\r
+\r
+ int have_langid; /* whether string_langid is valid yet */\r
+ int string_langid; /* language ID for strings */\r
+\r
+ void *hcpriv; /* Host Controller private data */\r
+ \r
+ struct list_head filelist;\r
+ struct dentry *usbfs_dentry; /* usbfs dentry entry for the device */\r
+ struct dentry *usbdevfs_dentry; /* usbdevfs dentry entry for the device */\r
+\r
+ /*\r
+ * Child devices - these can be either new devices\r
+ * (if this is a hub device), or different instances\r
+ * of this same device.\r
+ *\r
+ * Each instance needs its own set of data structures.\r
+ */\r
+\r
+ int maxchild; /* Number of ports if hub */\r
+ struct usb_device *children[USB_MAXCHILDREN];\r
+};\r
+#define to_usb_device(d) container_of(d, struct usb_device, dev)\r
+\r
+extern struct usb_device STDCALL *usb_alloc_dev(struct usb_device *parent, struct usb_bus *);\r
+extern struct usb_device *usb_get_dev(struct usb_device *dev);\r
+extern void STDCALL usb_put_dev(struct usb_device *dev);\r
+\r
+/* mostly for devices emulating SCSI over USB */\r
+extern int usb_reset_device(struct usb_device *dev);\r
+\r
+extern struct usb_device *usb_find_device(u16 vendor_id, u16 product_id);\r
+\r
+/* for drivers using iso endpoints */\r
+extern int usb_get_current_frame_number (struct usb_device *usb_dev);\r
+\r
+/* used these for multi-interface device registration */\r
+extern void usb_driver_claim_interface(struct usb_driver *driver,\r
+ struct usb_interface *iface, void* priv);\r
+extern int usb_interface_claimed(struct usb_interface *iface);\r
+extern void usb_driver_release_interface(struct usb_driver *driver,\r
+ struct usb_interface *iface);\r
+const struct usb_device_id *usb_match_id(struct usb_interface *interface,\r
+ const struct usb_device_id *id);\r
+\r
+extern struct usb_interface *usb_find_interface(struct usb_driver *drv, int minor);\r
+extern struct usb_interface *usb_ifnum_to_if(struct usb_device *dev, unsigned ifnum);\r
+\r
+\r
+/**\r
+ * usb_make_path - returns stable device path in the usb tree\r
+ * @dev: the device whose path is being constructed\r
+ * @buf: where to put the string\r
+ * @size: how big is "buf"?\r
+ *\r
+ * Returns length of the string (> 0) or negative if size was too small.\r
+ *\r
+ * This identifier is intended to be "stable", reflecting physical paths in\r
+ * hardware such as physical bus addresses for host controllers or ports on\r
+ * USB hubs. That makes it stay the same until systems are physically\r
+ * reconfigured, by re-cabling a tree of USB devices or by moving USB host\r
+ * controllers. Adding and removing devices, including virtual root hubs\r
+ * in host controller driver modules, does not change these path identifers;\r
+ * neither does rebooting or re-enumerating. These are more useful identifiers\r
+ * than changeable ("unstable") ones like bus numbers or device addresses.\r
+ *\r
+ * With a partial exception for devices connected to USB 2.0 root hubs, these\r
+ * identifiers are also predictable. So long as the device tree isn't changed,\r
+ * plugging any USB device into a given hub port always gives it the same path.\r
+ * Because of the use of "companion" controllers, devices connected to ports on\r
+ * USB 2.0 root hubs (EHCI host controllers) will get one path ID if they are\r
+ * high speed, and a different one if they are full or low speed.\r
+ */\r
+static inline int usb_make_path (struct usb_device *dev, char *buf, size_t size)\r
+{\r
+ int actual;\r
+ actual = snprintf (buf, size, "usb-%s-%s", dev->bus->bus_name, dev->devpath);\r
+ return (actual >= size) ? -1 : actual;\r
+}\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+#define USB_DEVICE_ID_MATCH_DEVICE (USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT)\r
+#define USB_DEVICE_ID_MATCH_DEV_RANGE (USB_DEVICE_ID_MATCH_DEV_LO | USB_DEVICE_ID_MATCH_DEV_HI)\r
+#define USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION (USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_DEV_RANGE)\r
+#define USB_DEVICE_ID_MATCH_DEV_INFO \\r
+ (USB_DEVICE_ID_MATCH_DEV_CLASS | USB_DEVICE_ID_MATCH_DEV_SUBCLASS | USB_DEVICE_ID_MATCH_DEV_PROTOCOL)\r
+#define USB_DEVICE_ID_MATCH_INT_INFO \\r
+ (USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS | USB_DEVICE_ID_MATCH_INT_PROTOCOL)\r
+\r
+/**\r
+ * USB_DEVICE - macro used to describe a specific usb device\r
+ * @vend: the 16 bit USB Vendor ID\r
+ * @prod: the 16 bit USB Product ID\r
+ *\r
+ * This macro is used to create a struct usb_device_id that matches a\r
+ * specific device.\r
+ */\r
+#define USB_DEVICE(vend,prod) \\r
+ .match_flags = USB_DEVICE_ID_MATCH_DEVICE, .idVendor = (vend), .idProduct = (prod)\r
+/**\r
+ * USB_DEVICE_VER - macro used to describe a specific usb device with a version range\r
+ * @vend: the 16 bit USB Vendor ID\r
+ * @prod: the 16 bit USB Product ID\r
+ * @lo: the bcdDevice_lo value\r
+ * @hi: the bcdDevice_hi value\r
+ *\r
+ * This macro is used to create a struct usb_device_id that matches a\r
+ * specific device, with a version range.\r
+ */\r
+#define USB_DEVICE_VER(vend,prod,lo,hi) \\r
+ .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION, .idVendor = (vend), .idProduct = (prod), .bcdDevice_lo = (lo), .bcdDevice_hi = (hi)\r
+\r
+/**\r
+ * USB_DEVICE_INFO - macro used to describe a class of usb devices\r
+ * @cl: bDeviceClass value\r
+ * @sc: bDeviceSubClass value\r
+ * @pr: bDeviceProtocol value\r
+ *\r
+ * This macro is used to create a struct usb_device_id that matches a\r
+ * specific class of devices.\r
+ */\r
+#define USB_DEVICE_INFO(cl,sc,pr) \\r
+ .match_flags = USB_DEVICE_ID_MATCH_DEV_INFO, .bDeviceClass = (cl), .bDeviceSubClass = (sc), .bDeviceProtocol = (pr)\r
+\r
+/**\r
+ * USB_INTERFACE_INFO - macro used to describe a class of usb interfaces \r
+ * @cl: bInterfaceClass value\r
+ * @sc: bInterfaceSubClass value\r
+ * @pr: bInterfaceProtocol value\r
+ *\r
+ * This macro is used to create a struct usb_device_id that matches a\r
+ * specific class of interfaces.\r
+ */\r
+#define USB_INTERFACE_INFO(cl,sc,pr) \\r
+ .match_flags = USB_DEVICE_ID_MATCH_INT_INFO, .bInterfaceClass = (cl), .bInterfaceSubClass = (sc), .bInterfaceProtocol = (pr)\r
+\r
+/* -------------------------------------------------------------------------- */\r
+\r
+/**\r
+ * struct usb_driver - identifies USB driver to usbcore\r
+ * @owner: Pointer to the module owner of this driver; initialize\r
+ * it using THIS_MODULE.\r
+ * @name: The driver name should be unique among USB drivers,\r
+ * and should normally be the same as the module name.\r
+ * @probe: Called to see if the driver is willing to manage a particular\r
+ * interface on a device. If it is, probe returns zero and uses\r
+ * dev_set_drvdata() to associate driver-specific data with the\r
+ * interface. It may also use usb_set_interface() to specify the\r
+ * appropriate altsetting. If unwilling to manage the interface,\r
+ * return a negative errno value.\r
+ * @disconnect: Called when the interface is no longer accessible, usually\r
+ * because its device has been (or is being) disconnected or the\r
+ * driver module is being unloaded.\r
+ * @ioctl: Used for drivers that want to talk to userspace through\r
+ * the "usbfs" filesystem. This lets devices provide ways to\r
+ * expose information to user space regardless of where they\r
+ * do (or don't) show up otherwise in the filesystem.\r
+ * @id_table: USB drivers use ID table to support hotplugging.\r
+ * Export this with MODULE_DEVICE_TABLE(usb,...). This must be set\r
+ * or your driver's probe function will never get called. \r
+ *\r
+ * USB drivers must provide a name, probe() and disconnect() methods,\r
+ * and an id_table. Other driver fields are optional.\r
+ *\r
+ * The id_table is used in hotplugging. It holds a set of descriptors,\r
+ * and specialized data may be associated with each entry. That table\r
+ * is used by both user and kernel mode hotplugging support.\r
+ *\r
+ * The probe() and disconnect() methods are called in a context where\r
+ * they can sleep, but they should avoid abusing the privilege. Most\r
+ * work to connect to a device should be done when the device is opened,\r
+ * and undone at the last close. The disconnect code needs to address\r
+ * concurrency issues with respect to open() and close() methods, as\r
+ * well as forcing all pending I/O requests to complete (by unlinking\r
+ * them as necessary, and blocking until the unlinks complete).\r
+ */\r
+struct usb_driver {\r
+ struct module *owner;\r
+\r
+ const char *name;\r
+\r
+ int (*probe) (struct usb_interface *intf,\r
+ const struct usb_device_id *id);\r
+\r
+ void (*disconnect) (struct usb_interface *intf);\r
+\r
+ int (*ioctl) (struct usb_interface *intf, unsigned int code, void *buf);\r
+\r
+ const struct usb_device_id *id_table;\r
+\r
+ struct device_driver driver;\r
+\r
+ struct semaphore serialize;\r
+};\r
+#define to_usb_driver(d) container_of(d, struct usb_driver, driver)\r
+\r
+extern struct bus_type usb_bus_type;\r
+\r
+/**\r
+ * struct usb_class_driver - identifies a USB driver that wants to use the USB major number\r
+ * @name: devfs name for this driver. Will also be used by the driver\r
+ * class code to create a usb class device.\r
+ * @fops: pointer to the struct file_operations of this driver.\r
+ * @mode: the mode for the devfs file to be created for this driver.\r
+ * @minor_base: the start of the minor range for this driver.\r
+ *\r
+ * This structure is used for the usb_register_dev() and\r
+ * usb_unregister_dev() functions, to consolodate a number of the\r
+ * paramaters used for them.\r
+ */\r
+struct usb_class_driver {\r
+ char *name;\r
+ struct file_operations *fops;\r
+ mode_t mode;\r
+ int minor_base; \r
+};\r
+\r
+/*\r
+ * use these in module_init()/module_exit()\r
+ * and don't forget MODULE_DEVICE_TABLE(usb, ...)\r
+ */\r
+extern int usb_register(struct usb_driver *);\r
+extern void usb_deregister(struct usb_driver *);\r
+\r
+extern int usb_register_dev(struct usb_interface *intf,\r
+ struct usb_class_driver *class_driver);\r
+extern void usb_deregister_dev(struct usb_interface *intf,\r
+ struct usb_class_driver *class_driver);\r
+\r
+extern int usb_device_probe(struct device *dev);\r
+extern int usb_device_remove(struct device *dev);\r
+extern int STDCALL usb_disabled(void);\r
+\r
+/* -------------------------------------------------------------------------- */\r
+\r
+/*\r
+ * URB support, for asynchronous request completions\r
+ */\r
+\r
+/*\r
+ * urb->transfer_flags:\r
+ */\r
+#define URB_SHORT_NOT_OK 0x0001 /* report short reads as errors */\r
+#define URB_ISO_ASAP 0x0002 /* iso-only, urb->start_frame ignored */\r
+#define URB_NO_DMA_MAP 0x0004 /* urb->*_dma are valid on submit */\r
+#define URB_ASYNC_UNLINK 0x0008 /* usb_unlink_urb() returns asap */\r
+#define URB_NO_FSBR 0x0020 /* UHCI-specific */\r
+#define URB_ZERO_PACKET 0x0040 /* Finish bulk OUTs with short packet */\r
+#define URB_NO_INTERRUPT 0x0080 /* HINT: no non-error interrupt needed */\r
+\r
+struct usb_iso_packet_descriptor {\r
+ unsigned int offset;\r
+ unsigned int length; /* expected length */\r
+ unsigned int actual_length;\r
+ unsigned int status;\r
+};\r
+\r
+struct urb;\r
+struct pt_regs;\r
+\r
+typedef void (*usb_complete_t)(struct urb *, struct pt_regs *);\r
+\r
+/**\r
+ * struct urb - USB Request Block\r
+ * @urb_list: For use by current owner of the URB.\r
+ * @pipe: Holds endpoint number, direction, type, and more.\r
+ * Create these values with the eight macros available;\r
+ * usb_{snd,rcv}TYPEpipe(dev,endpoint), where the type is "ctrl"\r
+ * (control), "bulk", "int" (interrupt), or "iso" (isochronous).\r
+ * For example usb_sndbulkpipe() or usb_rcvintpipe(). Endpoint\r
+ * numbers range from zero to fifteen. Note that "in" endpoint two\r
+ * is a different endpoint (and pipe) from "out" endpoint two.\r
+ * The current configuration controls the existence, type, and\r
+ * maximum packet size of any given endpoint.\r
+ * @dev: Identifies the USB device to perform the request.\r
+ * @status: This is read in non-iso completion functions to get the\r
+ * status of the particular request. ISO requests only use it\r
+ * to tell whether the URB was unlinked; detailed status for\r
+ * each frame is in the fields of the iso_frame-desc.\r
+ * @transfer_flags: A variety of flags may be used to affect how URB\r
+ * submission, unlinking, or operation are handled. Different\r
+ * kinds of URB can use different flags.\r
+ * @transfer_buffer: This identifies the buffer to (or from) which\r
+ * the I/O request will be performed (unless URB_NO_DMA_MAP is set).\r
+ * This buffer must be suitable for DMA; allocate it with kmalloc()\r
+ * or equivalent. For transfers to "in" endpoints, contents of\r
+ * this buffer will be modified. This buffer is used for data\r
+ * phases of control transfers.\r
+ * @transfer_dma: When transfer_flags includes URB_NO_DMA_MAP, the device\r
+ * driver is saying that it provided this DMA address, which the host\r
+ * controller driver should use instead of the transfer_buffer.\r
+ * @transfer_buffer_length: How big is transfer_buffer. The transfer may\r
+ * be broken up into chunks according to the current maximum packet\r
+ * size for the endpoint, which is a function of the configuration\r
+ * and is encoded in the pipe. When the length is zero, neither\r
+ * transfer_buffer nor transfer_dma is used.\r
+ * @actual_length: This is read in non-iso completion functions, and\r
+ * it tells how many bytes (out of transfer_buffer_length) were\r
+ * transferred. It will normally be the same as requested, unless\r
+ * either an error was reported or a short read was performed.\r
+ * The URB_SHORT_NOT_OK transfer flag may be used to make such\r
+ * short reads be reported as errors. \r
+ * @setup_packet: Only used for control transfers, this points to eight bytes\r
+ * of setup data. Control transfers always start by sending this data\r
+ * to the device. Then transfer_buffer is read or written, if needed.\r
+ * (Not used when URB_NO_DMA_MAP is set.)\r
+ * @setup_dma: For control transfers with URB_NO_DMA_MAP set, the device\r
+ * driver has provided this DMA address for the setup packet. The\r
+ * host controller driver should use this instead of setup_buffer.\r
+ * If there is a data phase, its buffer is identified by transfer_dma.\r
+ * @start_frame: Returns the initial frame for interrupt or isochronous\r
+ * transfers.\r
+ * @number_of_packets: Lists the number of ISO transfer buffers.\r
+ * @interval: Specifies the polling interval for interrupt or isochronous\r
+ * transfers. The units are frames (milliseconds) for for full and low\r
+ * speed devices, and microframes (1/8 millisecond) for highspeed ones.\r
+ * @error_count: Returns the number of ISO transfers that reported errors.\r
+ * @context: For use in completion functions. This normally points to\r
+ * request-specific driver context.\r
+ * @complete: Completion handler. This URB is passed as the parameter to the\r
+ * completion function. The completion function may then do what\r
+ * it likes with the URB, including resubmitting or freeing it.\r
+ * @iso_frame_desc: Used to provide arrays of ISO transfer buffers and to \r
+ * collect the transfer status for each buffer.\r
+ *\r
+ * This structure identifies USB transfer requests. URBs must be allocated by\r
+ * calling usb_alloc_urb() and freed with a call to usb_free_urb().\r
+ * Initialization may be done using various usb_fill_*_urb() functions. URBs\r
+ * are submitted using usb_submit_urb(), and pending requests may be canceled\r
+ * using usb_unlink_urb().\r
+ *\r
+ * Data Transfer Buffers:\r
+ *\r
+ * Normally drivers provide I/O buffers allocated with kmalloc() or otherwise\r
+ * taken from the general page pool. That is provided by transfer_buffer\r
+ * (control requests also use setup_packet), and host controller drivers\r
+ * perform a dma mapping (and unmapping) for each buffer transferred. Those\r
+ * mapping operations can be expensive on some platforms (perhaps using a dma\r
+ * bounce buffer or talking to an IOMMU),\r
+ * although they're cheap on commodity x86 and ppc hardware.\r
+ *\r
+ * Alternatively, drivers may pass the URB_NO_DMA_MAP transfer flag, which\r
+ * tells the host controller driver that no such mapping is needed since\r
+ * the device driver is DMA-aware. For example, they might allocate a DMA\r
+ * buffer with usb_buffer_alloc(), or call usb_buffer_map().\r
+ * When this transfer flag is provided, host controller drivers will use the\r
+ * dma addresses found in the transfer_dma and/or setup_dma fields rather than\r
+ * determing a dma address themselves.\r
+ *\r
+ * Initialization:\r
+ *\r
+ * All URBs submitted must initialize dev, pipe,\r
+ * transfer_flags (may be zero), complete, timeout (may be zero).\r
+ * The URB_ASYNC_UNLINK transfer flag affects later invocations of\r
+ * the usb_unlink_urb() routine.\r
+ *\r
+ * All URBs must also initialize \r
+ * transfer_buffer and transfer_buffer_length. They may provide the\r
+ * URB_SHORT_NOT_OK transfer flag, indicating that short reads are\r
+ * to be treated as errors; that flag is invalid for write requests.\r
+ *\r
+ * Bulk URBs may\r
+ * use the URB_ZERO_PACKET transfer flag, indicating that bulk OUT transfers\r
+ * should always terminate with a short packet, even if it means adding an\r
+ * extra zero length packet.\r
+ *\r
+ * Control URBs must provide a setup_packet.\r
+ *\r
+ * Interrupt UBS must provide an interval, saying how often (in milliseconds\r
+ * or, for highspeed devices, 125 microsecond units)\r
+ * to poll for transfers. After the URB has been submitted, the interval\r
+ * and start_frame fields reflect how the transfer was actually scheduled.\r
+ * The polling interval may be more frequent than requested.\r
+ * For example, some controllers have a maximum interval of 32 microseconds,\r
+ * while others support intervals of up to 1024 microseconds.\r
+ * Isochronous URBs also have transfer intervals. (Note that for isochronous\r
+ * endpoints, as well as high speed interrupt endpoints, the encoding of\r
+ * the transfer interval in the endpoint descriptor is logarithmic.)\r
+ *\r
+ * Isochronous URBs normally use the URB_ISO_ASAP transfer flag, telling\r
+ * the host controller to schedule the transfer as soon as bandwidth\r
+ * utilization allows, and then set start_frame to reflect the actual frame\r
+ * selected during submission. Otherwise drivers must specify the start_frame\r
+ * and handle the case where the transfer can't begin then. However, drivers\r
+ * won't know how bandwidth is currently allocated, and while they can\r
+ * find the current frame using usb_get_current_frame_number () they can't\r
+ * know the range for that frame number. (Ranges for frame counter values\r
+ * are HC-specific, and can go from 256 to 65536 frames from "now".)\r
+ *\r
+ * Isochronous URBs have a different data transfer model, in part because\r
+ * the quality of service is only "best effort". Callers provide specially\r
+ * allocated URBs, with number_of_packets worth of iso_frame_desc structures\r
+ * at the end. Each such packet is an individual ISO transfer. Isochronous\r
+ * URBs are normally queued, submitted by drivers to arrange that\r
+ * transfers are at least double buffered, and then explicitly resubmitted\r
+ * in completion handlers, so\r
+ * that data (such as audio or video) streams at as constant a rate as the\r
+ * host controller scheduler can support.\r
+ *\r
+ * Completion Callbacks:\r
+ *\r
+ * The completion callback is made in_interrupt(), and one of the first\r
+ * things that a completion handler should do is check the status field.\r
+ * The status field is provided for all URBs. It is used to report\r
+ * unlinked URBs, and status for all non-ISO transfers. It should not\r
+ * be examined before the URB is returned to the completion handler.\r
+ *\r
+ * The context field is normally used to link URBs back to the relevant\r
+ * driver or request state.\r
+ *\r
+ * When completion callback is invoked for non-isochronous URBs, the\r
+ * actual_length field tells how many bytes were transferred.\r
+ *\r
+ * ISO transfer status is reported in the status and actual_length fields\r
+ * of the iso_frame_desc array, and the number of errors is reported in\r
+ * error_count. Completion callbacks for ISO transfers will normally\r
+ * (re)submit URBs to ensure a constant transfer rate.\r
+ */\r
+struct urb\r
+{\r
+ spinlock_t lock; /* lock for the URB */\r
+ atomic_t count; /* reference count of the URB */\r
+ void *hcpriv; /* private data for host controller */\r
+ struct list_head urb_list; /* list pointer to all active urbs */\r
+ struct usb_device *dev; /* (in) pointer to associated device */\r
+ unsigned int pipe; /* (in) pipe information */\r
+ int status; /* (return) non-ISO status */\r
+ unsigned int transfer_flags; /* (in) URB_SHORT_NOT_OK | ...*/\r
+ void *transfer_buffer; /* (in) associated data buffer */\r
+ dma_addr_t transfer_dma; /* (in) dma addr for transfer_buffer */\r
+ int transfer_buffer_length; /* (in) data buffer length */\r
+ int actual_length; /* (return) actual transfer length */\r
+ int bandwidth; /* bandwidth for INT/ISO request */\r
+ unsigned char *setup_packet; /* (in) setup packet (control only) */\r
+ dma_addr_t setup_dma; /* (in) dma addr for setup_packet */\r
+ int start_frame; /* (modify) start frame (INT/ISO) */\r
+ int number_of_packets; /* (in) number of ISO packets */\r
+ int interval; /* (in) transfer interval (INT/ISO) */\r
+ int error_count; /* (return) number of ISO errors */\r
+ int timeout; /* (in) timeout, in jiffies */\r
+ void *context; /* (in) context for completion */\r
+ usb_complete_t complete; /* (in) completion routine */\r
+ struct usb_iso_packet_descriptor iso_frame_desc[0]; /* (in) ISO ONLY */\r
+};\r
+\r
+/* -------------------------------------------------------------------------- */\r
+\r
+/**\r
+ * usb_fill_control_urb - initializes a control urb\r
+ * @urb: pointer to the urb to initialize.\r
+ * @dev: pointer to the struct usb_device for this urb.\r
+ * @pipe: the endpoint pipe\r
+ * @setup_packet: pointer to the setup_packet buffer\r
+ * @transfer_buffer: pointer to the transfer buffer\r
+ * @buffer_length: length of the transfer buffer\r
+ * @complete: pointer to the usb_complete_t function\r
+ * @context: what to set the urb context to.\r
+ *\r
+ * Initializes a control urb with the proper information needed to submit\r
+ * it to a device.\r
+ */\r
+static inline void usb_fill_control_urb (struct urb *urb,\r
+ struct usb_device *dev,\r
+ unsigned int pipe,\r
+ unsigned char *setup_packet,\r
+ void *transfer_buffer,\r
+ int buffer_length,\r
+ usb_complete_t complete,\r
+ void *context)\r
+{\r
+ spin_lock_init(&urb->lock);\r
+ urb->dev = dev;\r
+ urb->pipe = pipe;\r
+ urb->setup_packet = setup_packet;\r
+ urb->transfer_buffer = transfer_buffer;\r
+ urb->transfer_buffer_length = buffer_length;\r
+ urb->complete = complete;\r
+ urb->context = context;\r
+}\r
+\r
+/**\r
+ * usb_fill_bulk_urb - macro to help initialize a bulk urb\r
+ * @urb: pointer to the urb to initialize.\r
+ * @dev: pointer to the struct usb_device for this urb.\r
+ * @pipe: the endpoint pipe\r
+ * @transfer_buffer: pointer to the transfer buffer\r
+ * @buffer_length: length of the transfer buffer\r
+ * @complete: pointer to the usb_complete_t function\r
+ * @context: what to set the urb context to.\r
+ *\r
+ * Initializes a bulk urb with the proper information needed to submit it\r
+ * to a device.\r
+ */\r
+static inline void usb_fill_bulk_urb (struct urb *urb,\r
+ struct usb_device *dev,\r
+ unsigned int pipe,\r
+ void *transfer_buffer,\r
+ int buffer_length,\r
+ usb_complete_t complete,\r
+ void *context)\r
+{\r
+ spin_lock_init(&urb->lock);\r
+ urb->dev = dev;\r
+ urb->pipe = pipe;\r
+ urb->transfer_buffer = transfer_buffer;\r
+ urb->transfer_buffer_length = buffer_length;\r
+ urb->complete = complete;\r
+ urb->context = context;\r
+}\r
+\r
+/**\r
+ * usb_fill_int_urb - macro to help initialize a interrupt urb\r
+ * @urb: pointer to the urb to initialize.\r
+ * @dev: pointer to the struct usb_device for this urb.\r
+ * @pipe: the endpoint pipe\r
+ * @transfer_buffer: pointer to the transfer buffer\r
+ * @buffer_length: length of the transfer buffer\r
+ * @complete: pointer to the usb_complete_t function\r
+ * @context: what to set the urb context to.\r
+ * @interval: what to set the urb interval to, encoded like\r
+ * the endpoint descriptor's bInterval value.\r
+ *\r
+ * Initializes a interrupt urb with the proper information needed to submit\r
+ * it to a device.\r
+ * Note that high speed interrupt endpoints use a logarithmic encoding of\r
+ * the endpoint interval, and express polling intervals in microframes\r
+ * (eight per millisecond) rather than in frames (one per millisecond).\r
+ */\r
+static inline void usb_fill_int_urb (struct urb *urb,\r
+ struct usb_device *dev,\r
+ unsigned int pipe,\r
+ void *transfer_buffer,\r
+ int buffer_length,\r
+ usb_complete_t complete,\r
+ void *context,\r
+ int interval)\r
+{\r
+ spin_lock_init(&urb->lock);\r
+ urb->dev = dev;\r
+ urb->pipe = pipe;\r
+ urb->transfer_buffer = transfer_buffer;\r
+ urb->transfer_buffer_length = buffer_length;\r
+ urb->complete = complete;\r
+ urb->context = context;\r
+ if (dev->speed == USB_SPEED_HIGH)\r
+ urb->interval = 1 << (interval - 1);\r
+ else\r
+ urb->interval = interval;\r
+ urb->start_frame = -1;\r
+}\r
+\r
+extern void STDCALL usb_init_urb(struct urb *urb);\r
+extern struct urb STDCALL *usb_alloc_urb(int iso_packets, int mem_flags);\r
+extern void STDCALL usb_free_urb(struct urb *urb);\r
+#define usb_put_urb usb_free_urb\r
+extern struct urb STDCALL *usb_get_urb(struct urb *urb);\r
+extern int STDCALL usb_submit_urb(struct urb *urb, int mem_flags);\r
+extern int STDCALL usb_unlink_urb(struct urb *urb);\r
+\r
+#define HAVE_USB_BUFFERS\r
+void *usb_buffer_alloc (struct usb_device *dev, size_t size,\r
+ int mem_flags, dma_addr_t *dma);\r
+void usb_buffer_free (struct usb_device *dev, size_t size,\r
+ void *addr, dma_addr_t dma);\r
+\r
+struct urb *usb_buffer_map (struct urb *urb);\r
+void usb_buffer_dmasync (struct urb *urb);\r
+void usb_buffer_unmap (struct urb *urb);\r
+\r
+struct scatterlist;\r
+int usb_buffer_map_sg (struct usb_device *dev, unsigned pipe,\r
+ struct scatterlist *sg, int nents);\r
+void usb_buffer_dmasync_sg (struct usb_device *dev, unsigned pipe,\r
+ struct scatterlist *sg, int n_hw_ents);\r
+void usb_buffer_unmap_sg (struct usb_device *dev, unsigned pipe,\r
+ struct scatterlist *sg, int n_hw_ents);\r
+\r
+/*-------------------------------------------------------------------*\r
+ * SYNCHRONOUS CALL SUPPORT *\r
+ *-------------------------------------------------------------------*/\r
+\r
+extern int usb_control_msg(struct usb_device *dev, unsigned int pipe,\r
+ __u8 request, __u8 requesttype, __u16 value, __u16 index,\r
+ void *data, __u16 size, int timeout);\r
+extern int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe,\r
+ void *data, int len, int *actual_length,\r
+ int timeout);\r
+\r
+/* wrappers around usb_control_msg() for the most common standard requests */\r
+extern int usb_get_descriptor(struct usb_device *dev, unsigned char desctype,\r
+ unsigned char descindex, void *buf, int size);\r
+extern int usb_get_device_descriptor(struct usb_device *dev);\r
+extern int usb_get_status(struct usb_device *dev,\r
+ int type, int target, void *data);\r
+extern int usb_get_string(struct usb_device *dev,\r
+ unsigned short langid, unsigned char index, void *buf, int size);\r
+extern int usb_string(struct usb_device *dev, int index,\r
+ char *buf, size_t size);\r
+\r
+/* wrappers that also update important state inside usbcore */\r
+extern int usb_clear_halt(struct usb_device *dev, int pipe);\r
+extern int usb_set_configuration(struct usb_device *dev, int configuration);\r
+extern int usb_set_interface(struct usb_device *dev, int ifnum, int alternate);\r
+\r
+/*\r
+ * timeouts, in seconds, used for sending/receiving control messages\r
+ * they typically complete within a few frames (msec) after they're issued\r
+ * USB identifies 5 second timeouts, maybe more in a few cases, and a few\r
+ * slow devices (like some MGE Ellipse UPSes) actually push that limit.\r
+ */\r
+#define USB_CTRL_GET_TIMEOUT 5\r
+#define USB_CTRL_SET_TIMEOUT 5\r
+\r
+\r
+/**\r
+ * struct usb_sg_request - support for scatter/gather I/O\r
+ * @status: zero indicates success, else negative errno\r
+ * @bytes: counts bytes transferred.\r
+ *\r
+ * These requests are initialized using usb_sg_init(), and then are used\r
+ * as request handles passed to usb_sg_wait() or usb_sg_cancel(). Most\r
+ * members of the request object aren't for driver access.\r
+ *\r
+ * The status and bytecount values are valid only after usb_sg_wait()\r
+ * returns. If the status is zero, then the bytecount matches the total\r
+ * from the request.\r
+ *\r
+ * After an error completion, drivers may need to clear a halt condition\r
+ * on the endpoint.\r
+ */\r
+struct usb_sg_request {\r
+ int status;\r
+ size_t bytes;\r
+\r
+ // members not documented above are private to usbcore,\r
+ // and are not provided for driver access!\r
+ spinlock_t lock;\r
+\r
+ struct usb_device *dev;\r
+ int pipe;\r
+ struct scatterlist *sg;\r
+ int nents;\r
+\r
+ int entries;\r
+ struct urb **urbs;\r
+\r
+ int count;\r
+ struct completion complete;\r
+};\r
+\r
+int usb_sg_init (\r
+ struct usb_sg_request *io,\r
+ struct usb_device *dev,\r
+ unsigned pipe, \r
+ unsigned period,\r
+ struct scatterlist *sg,\r
+ int nents,\r
+ size_t length,\r
+ int mem_flags\r
+);\r
+void usb_sg_cancel (struct usb_sg_request *io);\r
+void usb_sg_wait (struct usb_sg_request *io);\r
+\r
+\r
+/* -------------------------------------------------------------------------- */\r
+\r
+/*\r
+ * Calling this entity a "pipe" is glorifying it. A USB pipe\r
+ * is something embarrassingly simple: it basically consists\r
+ * of the following information:\r
+ * - device number (7 bits)\r
+ * - endpoint number (4 bits)\r
+ * - current Data0/1 state (1 bit) [Historical; now gone]\r
+ * - direction (1 bit)\r
+ * - speed (1 bit) [Historical and specific to USB 1.1; now gone.]\r
+ * - max packet size (2 bits: 8, 16, 32 or 64) [Historical; now gone.]\r
+ * - pipe type (2 bits: control, interrupt, bulk, isochronous)\r
+ *\r
+ * That's 18 bits. Really. Nothing more. And the USB people have\r
+ * documented these eighteen bits as some kind of glorious\r
+ * virtual data structure.\r
+ *\r
+ * Let's not fall in that trap. We'll just encode it as a simple\r
+ * unsigned int. The encoding is:\r
+ *\r
+ * - max size: bits 0-1 [Historical; now gone.]\r
+ * - direction: bit 7 (0 = Host-to-Device [Out],\r
+ * 1 = Device-to-Host [In] ...\r
+ * like endpoint bEndpointAddress)\r
+ * - device: bits 8-14 ... bit positions known to uhci-hcd\r
+ * - endpoint: bits 15-18 ... bit positions known to uhci-hcd\r
+ * - Data0/1: bit 19 [Historical; now gone. ]\r
+ * - lowspeed: bit 26 [Historical; now gone. ]\r
+ * - pipe type: bits 30-31 (00 = isochronous, 01 = interrupt,\r
+ * 10 = control, 11 = bulk)\r
+ *\r
+ * Why? Because it's arbitrary, and whatever encoding we select is really\r
+ * up to us. This one happens to share a lot of bit positions with the UHCI\r
+ * specification, so that much of the uhci driver can just mask the bits\r
+ * appropriately.\r
+ */\r
+\r
+/* NOTE: these are not the standard USB_ENDPOINT_XFER_* values!! */\r
+#define PIPE_ISOCHRONOUS 0\r
+#define PIPE_INTERRUPT 1\r
+#define PIPE_CONTROL 2\r
+#define PIPE_BULK 3\r
+\r
+#define usb_maxpacket(dev, pipe, out) (out \\r
+ ? (dev)->epmaxpacketout[usb_pipeendpoint(pipe)] \\r
+ : (dev)->epmaxpacketin [usb_pipeendpoint(pipe)] )\r
+\r
+#define usb_pipein(pipe) ((pipe) & USB_DIR_IN)\r
+#define usb_pipeout(pipe) (!usb_pipein(pipe))\r
+#define usb_pipedevice(pipe) (((pipe) >> 8) & 0x7f)\r
+#define usb_pipeendpoint(pipe) (((pipe) >> 15) & 0xf)\r
+#define usb_pipetype(pipe) (((pipe) >> 30) & 3)\r
+#define usb_pipeisoc(pipe) (usb_pipetype((pipe)) == PIPE_ISOCHRONOUS)\r
+#define usb_pipeint(pipe) (usb_pipetype((pipe)) == PIPE_INTERRUPT)\r
+#define usb_pipecontrol(pipe) (usb_pipetype((pipe)) == PIPE_CONTROL)\r
+#define usb_pipebulk(pipe) (usb_pipetype((pipe)) == PIPE_BULK)\r
+\r
+/* The D0/D1 toggle bits ... USE WITH CAUTION (they're almost hcd-internal) */\r
+#define usb_gettoggle(dev, ep, out) (((dev)->toggle[out] >> (ep)) & 1)\r
+#define usb_dotoggle(dev, ep, out) ((dev)->toggle[out] ^= (1 << (ep)))\r
+#define usb_settoggle(dev, ep, out, bit) ((dev)->toggle[out] = ((dev)->toggle[out] & ~(1 << (ep))) | ((bit) << (ep)))\r
+\r
+/* Endpoint halt control/status ... likewise USE WITH CAUTION */\r
+#define usb_endpoint_running(dev, ep, out) ((dev)->halted[out] &= ~(1 << (ep)))\r
+#define usb_endpoint_halted(dev, ep, out) ((dev)->halted[out] & (1 << (ep)))\r
+\r
+\r
+static inline unsigned int __create_pipe(struct usb_device *dev, unsigned int endpoint)\r
+{\r
+ return (dev->devnum << 8) | (endpoint << 15);\r
+}\r
+\r
+/* Create various pipes... */\r
+#define usb_sndctrlpipe(dev,endpoint) ((PIPE_CONTROL << 30) | __create_pipe(dev,endpoint))\r
+#define usb_rcvctrlpipe(dev,endpoint) ((PIPE_CONTROL << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)\r
+#define usb_sndisocpipe(dev,endpoint) ((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev,endpoint))\r
+#define usb_rcvisocpipe(dev,endpoint) ((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)\r
+#define usb_sndbulkpipe(dev,endpoint) ((PIPE_BULK << 30) | __create_pipe(dev,endpoint))\r
+#define usb_rcvbulkpipe(dev,endpoint) ((PIPE_BULK << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)\r
+#define usb_sndintpipe(dev,endpoint) ((PIPE_INTERRUPT << 30) | __create_pipe(dev,endpoint))\r
+#define usb_rcvintpipe(dev,endpoint) ((PIPE_INTERRUPT << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)\r
+\r
+/* -------------------------------------------------------------------------- */\r
+\r
+/*\r
+ * Debugging and troubleshooting/diagnostic helpers.\r
+ */\r
+void usb_show_device_descriptor(struct usb_device_descriptor *);\r
+void usb_show_config_descriptor(struct usb_config_descriptor *);\r
+void usb_show_interface_descriptor(struct usb_interface_descriptor *);\r
+void usb_show_endpoint_descriptor(struct usb_endpoint_descriptor *);\r
+void usb_show_device(struct usb_device *);\r
+void usb_show_string(struct usb_device *dev, char *id, int index);\r
+\r
+#ifdef DEBUG\r
+#define dbg(format, arg...) printk(KERN_DEBUG "%s: " format "\n" , __FILE__ , ## arg)\r
+#else\r
+#define dbg(format, arg...) do {} while (0)\r
+#endif\r
+\r
+\r
+\r
+#ifdef DEBUG_MODE\r
+#define info(format, arg...) printk(KERN_INFO __FILE__ ": " format "\n" , ## arg)\r
+#define err(format, arg...) printk(KERN_ERR __FILE__ ": " format "\n" , ## arg)\r
+#define warn(format, arg...) printk(KERN_WARNING __FILE__ ": " format "\n" , ## arg)\r
+#endif\r
+\r
+#ifndef DEBUG_MODE \r
+#define info(format, arg...) do {} while (0)\r
+#define err(format, arg...) do {} while (0)\r
+#define warn(format, arg...) do {} while (0)\r
+#endif\r
+\r
+#endif /* __KERNEL__ */\r
+\r
+#endif\r
--- /dev/null
+/*\r
+ * This file holds USB constants and structures that are needed for USB\r
+ * device APIs. These are used by the USB device model, which is defined\r
+ * in chapter 9 of the USB 2.0 specification. Linux has several APIs in C\r
+ * that need these:\r
+ *\r
+ * - the master/host side Linux-USB kernel driver API;\r
+ * - the "usbfs" user space API; and\r
+ * - (eventually) a Linux "gadget" slave/device side driver API.\r
+ *\r
+ * USB 2.0 adds an additional "On The Go" (OTG) mode, which lets systems\r
+ * act either as a USB master/host or as a USB slave/device. That means\r
+ * the master and slave side APIs will benefit from working well together.\r
+ */\r
+\r
+#ifndef __LINUX_USB_CH9_H\r
+#define __LINUX_USB_CH9_H\r
+#if 0\r
+#include <asm/types.h> /* __u8 etc */\r
+#endif\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* CONTROL REQUEST SUPPORT */\r
+\r
+/*\r
+ * USB directions\r
+ *\r
+ * This bit flag is used in endpoint descriptors' bEndpointAddress field.\r
+ * It's also one of three fields in control requests bRequestType.\r
+ */\r
+#define USB_DIR_OUT 0 /* to device */\r
+#define USB_DIR_IN 0x80 /* to host */\r
+\r
+/*\r
+ * USB types, the second of three bRequestType fields\r
+ */\r
+#define USB_TYPE_MASK (0x03 << 5)\r
+#define USB_TYPE_STANDARD (0x00 << 5)\r
+#define USB_TYPE_CLASS (0x01 << 5)\r
+#define USB_TYPE_VENDOR (0x02 << 5)\r
+#define USB_TYPE_RESERVED (0x03 << 5)\r
+\r
+/*\r
+ * USB recipients, the third of three bRequestType fields\r
+ */\r
+#define USB_RECIP_MASK 0x1f\r
+#define USB_RECIP_DEVICE 0x00\r
+#define USB_RECIP_INTERFACE 0x01\r
+#define USB_RECIP_ENDPOINT 0x02\r
+#define USB_RECIP_OTHER 0x03\r
+\r
+/*\r
+ * Standard requests, for the bRequest field of a SETUP packet.\r
+ *\r
+ * These are qualified by the bRequestType field, so that for example\r
+ * TYPE_CLASS or TYPE_VENDOR specific feature flags could be retrieved\r
+ * by a GET_STATUS request.\r
+ */\r
+#define USB_REQ_GET_STATUS 0x00\r
+#define USB_REQ_CLEAR_FEATURE 0x01\r
+#define USB_REQ_SET_FEATURE 0x03\r
+#define USB_REQ_SET_ADDRESS 0x05\r
+#define USB_REQ_GET_DESCRIPTOR 0x06\r
+#define USB_REQ_SET_DESCRIPTOR 0x07\r
+#define USB_REQ_GET_CONFIGURATION 0x08\r
+#define USB_REQ_SET_CONFIGURATION 0x09\r
+#define USB_REQ_GET_INTERFACE 0x0A\r
+#define USB_REQ_SET_INTERFACE 0x0B\r
+#define USB_REQ_SYNCH_FRAME 0x0C\r
+\r
+\r
+/**\r
+ * struct usb_ctrlrequest - SETUP data for a USB device control request\r
+ * @bRequestType: matches the USB bmRequestType field\r
+ * @bRequest: matches the USB bRequest field\r
+ * @wValue: matches the USB wValue field (le16 byte order)\r
+ * @wIndex: matches the USB wIndex field (le16 byte order)\r
+ * @wLength: matches the USB wLength field (le16 byte order)\r
+ *\r
+ * This structure is used to send control requests to a USB device. It matches\r
+ * the different fields of the USB 2.0 Spec section 9.3, table 9-2. See the\r
+ * USB spec for a fuller description of the different fields, and what they are\r
+ * used for.\r
+ *\r
+ * Note that the driver for any interface can issue control requests.\r
+ * For most devices, interfaces don't coordinate with each other, so\r
+ * such requests may be made at any time.\r
+ */\r
+struct usb_ctrlrequest {\r
+ __u8 bRequestType;\r
+ __u8 bRequest;\r
+ __u16 wValue;\r
+ __u16 wIndex;\r
+ __u16 wLength;\r
+} __attribute__ ((packed));\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/*\r
+ * STANDARD DESCRIPTORS ... as returned by GET_DESCRIPTOR, or\r
+ * (rarely) accepted by SET_DESCRIPTOR.\r
+ *\r
+ * Note that all multi-byte values here are encoded in little endian\r
+ * byte order "on the wire". But when exposed through Linux-USB APIs,\r
+ * they've been converted to cpu byte order.\r
+ */\r
+\r
+/*\r
+ * Descriptor types ... USB 2.0 spec table 9.5\r
+ */\r
+#define USB_DT_DEVICE 0x01\r
+#define USB_DT_CONFIG 0x02\r
+#define USB_DT_STRING 0x03\r
+#define USB_DT_INTERFACE 0x04\r
+#define USB_DT_ENDPOINT 0x05\r
+#define USB_DT_DEVICE_QUALIFIER 0x06\r
+#define USB_DT_OTHER_SPEED_CONFIG 0x07\r
+#define USB_DT_INTERFACE_POWER 0x08\r
+\r
+/* All standard descriptors have these 2 fields at the beginning */\r
+struct usb_descriptor_header {\r
+ __u8 bLength;\r
+ __u8 bDescriptorType;\r
+} __attribute__ ((packed));\r
+\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* USB_DT_DEVICE: Device descriptor */\r
+struct usb_device_descriptor {\r
+ __u8 bLength;\r
+ __u8 bDescriptorType;\r
+\r
+ __u16 bcdUSB;\r
+ __u8 bDeviceClass;\r
+ __u8 bDeviceSubClass;\r
+ __u8 bDeviceProtocol;\r
+ __u8 bMaxPacketSize0;\r
+ __u16 idVendor;\r
+ __u16 idProduct;\r
+ __u16 bcdDevice;\r
+ __u8 iManufacturer;\r
+ __u8 iProduct;\r
+ __u8 iSerialNumber;\r
+ __u8 bNumConfigurations;\r
+} __attribute__ ((packed));\r
+\r
+#define USB_DT_DEVICE_SIZE 18\r
+\r
+\r
+/*\r
+ * Device and/or Interface Class codes\r
+ * as found in bDeviceClass or bInterfaceClass\r
+ * and defined by www.usb.org documents\r
+ */\r
+#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */\r
+#define USB_CLASS_AUDIO 1\r
+#define USB_CLASS_COMM 2\r
+#define USB_CLASS_HID 3\r
+#define USB_CLASS_PHYSICAL 5\r
+#define USB_CLASS_STILL_IMAGE 6\r
+#define USB_CLASS_PRINTER 7\r
+#define USB_CLASS_MASS_STORAGE 8\r
+#define USB_CLASS_HUB 9\r
+#define USB_CLASS_CDC_DATA 0x0a\r
+#define USB_CLASS_CSCID 0x0b /* chip+ smart card */\r
+#define USB_CLASS_CONTENT_SEC 0x0d /* content security */\r
+#define USB_CLASS_APP_SPEC 0xfe\r
+#define USB_CLASS_VENDOR_SPEC 0xff\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* USB_DT_CONFIG: Configuration descriptor information.\r
+ *\r
+ * USB_DT_OTHER_SPEED_CONFIG is the same descriptor, except that the\r
+ * descriptor type is different. Highspeed-capable devices can look\r
+ * different depending on what speed they're currently running. Only\r
+ * devices with a USB_DT_DEVICE_QUALIFIER have any OTHER_SPEED_CONFIG\r
+ * descriptors.\r
+ */\r
+struct usb_config_descriptor {\r
+ __u8 bLength;\r
+ __u8 bDescriptorType;\r
+\r
+ __u16 wTotalLength;\r
+ __u8 bNumInterfaces;\r
+ __u8 bConfigurationValue;\r
+ __u8 iConfiguration;\r
+ __u8 bmAttributes;\r
+ __u8 bMaxPower;\r
+} __attribute__ ((packed));\r
+\r
+#define USB_DT_CONFIG_SIZE 9\r
+\r
+/* from config descriptor bmAttributes */\r
+#define USB_CONFIG_ATT_ONE (1 << 7) /* must be set */\r
+#define USB_CONFIG_ATT_SELFPOWER (1 << 6) /* self powered */\r
+#define USB_CONFIG_ATT_WAKEUP (1 << 5) /* can wakeup */\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* USB_DT_STRING: String descriptor */\r
+struct usb_string_descriptor {\r
+ __u8 bLength;\r
+ __u8 bDescriptorType;\r
+\r
+ __u16 wData[1]; /* UTF-16LE encoded */\r
+} __attribute__ ((packed));\r
+\r
+/* note that "string" zero is special, it holds language codes that\r
+ * the device supports, not Unicode characters.\r
+ */\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* USB_DT_INTERFACE: Interface descriptor */\r
+struct usb_interface_descriptor {\r
+ __u8 bLength;\r
+ __u8 bDescriptorType;\r
+\r
+ __u8 bInterfaceNumber;\r
+ __u8 bAlternateSetting;\r
+ __u8 bNumEndpoints;\r
+ __u8 bInterfaceClass;\r
+ __u8 bInterfaceSubClass;\r
+ __u8 bInterfaceProtocol;\r
+ __u8 iInterface;\r
+} __attribute__ ((packed));\r
+\r
+#define USB_DT_INTERFACE_SIZE 9\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* USB_DT_ENDPOINT: Endpoint descriptor */\r
+struct usb_endpoint_descriptor {\r
+ __u8 bLength;\r
+ __u8 bDescriptorType;\r
+\r
+ __u8 bEndpointAddress;\r
+ __u8 bmAttributes;\r
+ __u16 wMaxPacketSize;\r
+ __u8 bInterval;\r
+\r
+ // NOTE: these two are _only_ in audio endpoints.\r
+ // use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof.\r
+ __u8 bRefresh;\r
+ __u8 bSynchAddress;\r
+} __attribute__ ((packed));\r
+\r
+#define USB_DT_ENDPOINT_SIZE 7\r
+#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */\r
+\r
+\r
+/*\r
+ * Endpoints\r
+ */\r
+#define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */\r
+#define USB_ENDPOINT_DIR_MASK 0x80\r
+\r
+#define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */\r
+#define USB_ENDPOINT_XFER_CONTROL 0\r
+#define USB_ENDPOINT_XFER_ISOC 1\r
+#define USB_ENDPOINT_XFER_BULK 2\r
+#define USB_ENDPOINT_XFER_INT 3\r
+\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* USB_DT_DEVICE_QUALIFIER: Device Qualifier descriptor */\r
+struct usb_qualifier_descriptor {\r
+ __u8 bLength;\r
+ __u8 bDescriptorType;\r
+\r
+ __u16 bcdUSB;\r
+ __u8 bDeviceClass;\r
+ __u8 bDeviceSubClass;\r
+ __u8 bDeviceProtocol;\r
+ __u8 bMaxPacketSize0;\r
+ __u8 bNumConfigurations;\r
+ __u8 bRESERVED;\r
+} __attribute__ ((packed));\r
+\r
+\r
+/*-------------------------------------------------------------------------*/\r
+\r
+/* USB 2.0 defines three speeds, here's how Linux identifies them */\r
+\r
+enum usb_device_speed {\r
+ USB_SPEED_UNKNOWN = 0, /* enumerating */\r
+ USB_SPEED_LOW, USB_SPEED_FULL, /* usb 1.1 */\r
+ USB_SPEED_HIGH /* usb 2.0 */\r
+};\r
+\r
+enum usb_device_state {\r
+ /* NOTATTACHED isn't in the USB spec, and this state acts\r
+ * the same as ATTACHED ... but it's clearer this way.\r
+ */\r
+ USB_STATE_NOTATTACHED = 0,\r
+\r
+ /* the chapter 9 device states */\r
+ USB_STATE_ATTACHED,\r
+ USB_STATE_POWERED,\r
+ USB_STATE_DEFAULT, /* limited function */\r
+ USB_STATE_ADDRESS,\r
+ USB_STATE_CONFIGURED, /* most functions */\r
+\r
+ USB_STATE_SUSPENDED\r
+\r
+ /* NOTE: there are actually four different SUSPENDED\r
+ * states, returning to POWERED, DEFAULT, ADDRESS, or\r
+ * CONFIGURED respectively when SOF tokens flow again.\r
+ */\r
+};\r
+\r
+#endif /* __LINUX_USB_CH9_H */\r
--- /dev/null
+/*\r
+ * USB support for XBOX, based on Linux kernel source\r
+ *\r
+ * 2003-06-21 Georg Acher (georg@acher.org)\r
+ *\r
+*/\r
+ \r
+#include "../usb_wrapper.h"\r
+\r
+void subsys_usb_init(void);\r
+void module_exit_usb_exit(void);\r
+\r
+extern struct pci_device_id *module_table_pci_ids;\r
+\r
+// straigth call...\r
+int usb_hcd_pci_probe (struct pci_dev *dev, const struct pci_device_id *id);\r
+void usb_hcd_pci_remove (struct pci_dev *dev);\r
+\r
+void XPADInit(void);\r
+void XPADRemove(void);\r
+void XRemoteInit(void);\r
+void XRemoteRemove(void);\r
+\r
+extern int (*thread_handler)(void*);\r
+int (*hub_thread_handler)(void*);\r
+\r
+extern int nousb;\r
+extern int xpad_num;\r
+\r
+struct pci_dev xx_ohci_dev={\r
+ .vendor = 0,\r
+ .device = 0,\r
+ .bus = NULL,\r
+ .irq = 1, // currently not used...\r
+ .slot_name = "OHCI",\r
+ .dev = {.name = "PCI",.dma_mask=1},\r
+ .base = {0xfed00000}, \r
+ .flags = {}\r
+};\r
+\r
+/*------------------------------------------------------------------------*/ \r
+void BootStartUSB(void)\r
+{\r
+ int n;\r
+\r
+ nousb=0;\r
+\r
+ init_wrapper();\r
+ subsys_usb_init();\r
+ hub_thread_handler=thread_handler;\r
+ usb_hcd_pci_probe(&xx_ohci_dev, module_table_pci_ids); \r
+ XPADInit();\r
+ \r
+ XRemoteInit();\r
+ \r
+ UsbKeyBoardInit();\r
+\r
+ for(n=0;n<30;n++) {\r
+ USBGetEvents();\r
+ wait_ms(1);\r
+ }\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+void USBGetEvents(void)\r
+{ \r
+ inc_jiffies(1);\r
+ do_all_timers();\r
+ hub_thread_handler(NULL);\r
+ handle_irqs(-1); \r
+}\r
+/*------------------------------------------------------------------------*/ \r
+void BootStopUSB(void)\r
+{\r
+ int n;\r
+ \r
+ XPADRemove();\r
+ XRemoteRemove();\r
+ UsbKeyBoardRemove();\r
+ \r
+ for(n=0;n<100;n++)\r
+ {\r
+ USBGetEvents();\r
+ wait_ms(1);\r
+ } \r
+\r
+ module_exit_usb_exit();\r
+ usb_hcd_pci_remove(&xx_ohci_dev);\r
+ \r
+} \r
+/*------------------------------------------------------------------------*/ \r
--- /dev/null
+\r
+O_TARGET := usbwrapper.o BootUSB.o linuxwrapper.o xpad.o xremote.o usbkey.o risefall.o\r
+\r
+include $(TOPDIR)/Rules.make\r
--- /dev/null
+/*\r
+ * USB support based on Linux kernel source\r
+ *\r
+ * 2003-06-21 Georg Acher (georg@acher.org)\r
+ *\r
+ * Concept:\r
+ * \r
+ * 1) Forget all device interrupts, scheduling, semaphores, threads etc.\r
+ * 1a) Forget all DMA and PCI helper functions\r
+ * 2) Forget usbdevfs, procfs and ioctls\r
+ * 3) Emulate OHCI interrupts and root hub timer by polling\r
+ * 4) Emulate hub kernel thread by polling\r
+ * 5) Emulate synchronous USB-messages (usb_*_msg) with busy waiting\r
+ *\r
+ * To be done:\r
+ * 6) Remove code bloat \r
+ *\r
+ */\r
+\r
+#include "../usb_wrapper.h"\r
+\r
+/* internal state */\r
+\r
+static struct pci_dev *pci_probe_dev;\r
+extern int (*thread_handler)(void*);\r
+extern void* thread_parm;\r
+\r
+struct my_irqs reg_irqs[MAX_IRQS];\r
+int num_irqs;\r
+int need_wakeup;\r
+\r
+int my_jiffies;\r
+\r
+struct timer_list *main_timer_list[MAX_TIMERS];\r
+struct dummy_process act_cur={0};\r
+struct dummy_process *my_current;\r
+\r
+int (*thread_handler)(void*);\r
+void* thread_parm;\r
+\r
+#define MAX_DRVS 8\r
+static struct device_driver *m_drivers[MAX_DRVS];\r
+static int drvs_num;\r
+\r
+/*------------------------------------------------------------------------*/ \r
+/* \r
+ * Helper functions for top-level system\r
+ */\r
+/*------------------------------------------------------------------------*/ \r
+void init_wrapper(void)\r
+{\r
+ int n;\r
+ for(n=0;n<MAX_TIMERS;n++)\r
+ {\r
+ main_timer_list[n]=NULL;\r
+ }\r
+\r
+ my_jiffies=0;\r
+ num_irqs=0;\r
+ my_current=&act_cur;\r
+ pci_probe_dev=NULL;\r
+\r
+ for(n=0;n<MAX_IRQS;n++)\r
+ {\r
+ reg_irqs[n].handler=NULL;\r
+ reg_irqs[n].irq=-1;\r
+ }\r
+ drvs_num=0;\r
+ need_wakeup=0;\r
+ for(n=0;n<MAX_DRVS;n++)\r
+ m_drivers[n]=NULL;\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+void handle_irqs(int irq)\r
+{\r
+ int n;\r
+// printk("handle irqs\n");\r
+ for(n=0;n<MAX_IRQS;n++)\r
+ {\r
+ if (reg_irqs[n].handler && (irq==reg_irqs[n].irq || irq==-1))\r
+ reg_irqs[n].handler(reg_irqs[n].irq,reg_irqs[n].data,NULL);\r
+ }\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+void inc_jiffies(int n)\r
+{\r
+ my_jiffies+=n;\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+void do_all_timers(void)\r
+{\r
+ int n;\r
+ for(n=0;n<MAX_TIMERS;n++)\r
+ {\r
+ if (main_timer_list[n] &&\r
+ main_timer_list[n]->function && main_timer_list[n]->expires) \r
+ {\r
+ void (*function)(unsigned long)=main_timer_list[n]->function;\r
+ unsigned long data=main_timer_list[n]->data;\r
+ main_timer_list[n]->expires=0;\r
+\r
+ main_timer_list[n]=NULL; // remove timer\r
+// printk("do timer %i fn %p\n",n,function);\r
+\r
+ function(data);\r
+ }\r
+ }\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+// Purpose: Remember thread procedure and data in global var\r
+int my_kernel_thread(int (*handler)(void*), void* parm, int flags)\r
+{\r
+ thread_handler=handler;\r
+ thread_parm=parm;\r
+ return 42; // PID :-)\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+/* Device management\r
+ * As simple as possible, but as complete as necessary ...\r
+ */\r
+/*------------------------------------------------------------------------*/ \r
+\r
+\r
+/* calls probe function for hotplug (which does device matching), this is the\r
+only link between usbcore and the registered device drivers! */\r
+int my_device_add(struct device *dev)\r
+{\r
+ int n,found=0;\r
+// printk("drv_num %i %p %p\n",drvs_num,m_drivers[0]->probe,m_drivers[1]->probe);\r
+ if (dev->driver)\r
+ {\r
+ if (dev->driver->probe)\r
+ return dev->driver->probe(dev);\r
+ }\r
+ else\r
+ {\r
+ for(n=0;n<drvs_num;n++)\r
+ {\r
+ if (m_drivers[n]->probe)\r
+ {\r
+ dev->driver=m_drivers[n];\r
+// printk("probe%i %p ",n,m_drivers[n]->probe);\r
+ if (m_drivers[n]->probe(dev) == 0)\r
+ {\r
+// return 0;\r
+ found=1;\r
+ }\r
+ }\r
+ }\r
+ if (found) return 0;\r
+ }\r
+ dev->driver=NULL;\r
+ return -ENODEV;\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+int my_driver_register(struct device_driver *driver)\r
+{\r
+\r
+ if (drvs_num<MAX_DRVS)\r
+ {\r
+// printk("driver_register %i: %p %p",drvs_num,driver,driver->probe);\r
+ m_drivers[drvs_num++]=driver;\r
+ return 0;\r
+ }\r
+ return -1;\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+int my_device_unregister(struct device *dev)\r
+{\r
+ if (dev->driver && dev->driver->remove)\r
+ dev->driver->remove(dev);\r
+ return 0;\r
+ \r
+}\r
+/*------------------------------------------------------------------------*/ \r
+struct device *my_get_device(struct device *dev)\r
+{\r
+ return NULL;\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+void my_device_initialize(struct device *dev)\r
+{\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+void my_wake_up(void* p)\r
+{\r
+ need_wakeup=1;\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+/* wait until woken up (only one wait allowed!) */\r
+int my_schedule_timeout(int x)\r
+{\r
+ int wait=1;\r
+ x+=10; // safety\r
+// printk("schedule_timeout %i\n",x);\r
+ while(x>0)\r
+ {\r
+ do_all_timers();\r
+#ifndef HAVE_IRQS\r
+ handle_irqs(-1);\r
+\r
+#endif\r
+ if (need_wakeup)\r
+ break;\r
+ wait_ms(wait);\r
+ inc_jiffies(wait);\r
+ x-=wait;\r
+ }\r
+ need_wakeup=0;\r
+// printk("schedule DONE!!!!!!\n");\r
+ return x;\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+void my_wait_for_completion(struct completion *x)\r
+{\r
+ int n=100;\r
+// printk("wait for completion\n");\r
+ while(!x->done && (n>0))\r
+ {\r
+ do_all_timers(); \r
+#ifndef HAVE_IRQS\r
+ handle_irqs(-1);\r
+\r
+#endif\r
+ wait_ms(10); \r
+ n--;\r
+ }\r
+// printk("wait for completion done %i\n",x->done);\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+// Helper for pci_module_init\r
+/*------------------------------------------------------------------------*/ \r
+int my_pci_module_init(struct pci_driver *x)\r
+{\r
+ struct pci_dev *dev=pci_probe_dev;\r
+ const struct pci_device_id *id=NULL;\r
+ if (!pci_probe_dev)\r
+ {\r
+ printk(KERN_ERR "PCI device not set!\n");\r
+ return 0;\r
+ }\r
+ x->probe(dev, id);\r
+ return 0;\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+struct pci_dev *my_pci_find_slot(int a,int b)\r
+{\r
+ return NULL;\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+int my_request_irq(unsigned int irq,\r
+ int (*handler)(int,void *, struct pt_regs *),\r
+ unsigned long mode, const char *desc, void *data)\r
+{\r
+ if (num_irqs<MAX_IRQS)\r
+ {\r
+ reg_irqs[num_irqs].handler=handler;\r
+ reg_irqs[num_irqs].irq=irq;\r
+ reg_irqs[num_irqs].data=data;\r
+ num_irqs++;\r
+ return 0;\r
+ }\r
+ return 1;\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+int my_free_irq(int irq, void* p)\r
+{\r
+ /* No free... */\r
+ return 0;\r
+}\r
+/*------------------------------------------------------------------------*/ \r
--- /dev/null
+#include "../usb_wrapper.h"\r
+#include "config.h"\r
+#include "xremote.h"\r
+\r
+// This is for the Xpad\r
+extern unsigned char xpad_button_history[7];\r
+\r
+// This is for the Keyboard\r
+extern unsigned int current_keyboard_key;\r
+\r
+int risefall_xpad_BUTTON(unsigned char selected_Button) {\r
+ \r
+ int xpad_id; \r
+ int match;\r
+ extern int xpad_num;\r
+ \r
+ // USB keyboard section \r
+ \r
+ match=0;\r
+ if (current_keyboard_key!=0) {\r
+ switch (selected_Button) {\r
+ case TRIGGER_XPAD_KEY_A :\r
+ if (current_keyboard_key == 0x28) match=1;\r
+ break;\r
+ case TRIGGER_XPAD_KEY_B :\r
+ if (current_keyboard_key == 0x29) match=1;\r
+ break;\r
+ case TRIGGER_XPAD_PAD_UP :\r
+ if (current_keyboard_key == 0x52) match=1;\r
+ break;\r
+ case TRIGGER_XPAD_PAD_DOWN :\r
+ if (current_keyboard_key == 0x51) match=1;\r
+ break;\r
+ case TRIGGER_XPAD_PAD_LEFT :\r
+ if (current_keyboard_key == 0x50) match=1;\r
+ break;\r
+ case TRIGGER_XPAD_PAD_RIGHT :\r
+ if (current_keyboard_key == 0x4f) match=1;\r
+ break;\r
+ }\r
+\r
+ if (match) {\r
+ //A match occurred, so the event has now been processed\r
+ //Clear it, and return success\r
+ current_keyboard_key=0;\r
+ return 1;\r
+ }\r
+ }\r
+ \r
+ // Xbox IR remote section\r
+ \r
+ match=0;\r
+ if (!remotekeyIsRepeat) {\r
+ /* We only grab the key event when the button is first pressed.\r
+ * If it's being held down, we ignore the multiple events this \r
+ * generates */\r
+ \r
+ switch (selected_Button) {\r
+ case TRIGGER_XPAD_KEY_A:\r
+ if (current_remote_key == RC_KEY_SELECT) match=1;\r
+ break;\r
+ case TRIGGER_XPAD_PAD_UP:\r
+ if (current_remote_key == RC_KEY_UP) match=1;\r
+ break;\r
+ case TRIGGER_XPAD_PAD_DOWN:\r
+ if (current_remote_key == RC_KEY_DOWN) match=1;\r
+ break;\r
+ case TRIGGER_XPAD_PAD_LEFT:\r
+ if (current_remote_key == RC_KEY_LEFT) match=1;\r
+ break;\r
+ case TRIGGER_XPAD_PAD_RIGHT:\r
+ if (current_remote_key == RC_KEY_RIGHT) match=1;\r
+ break;\r
+ case TRIGGER_XPAD_KEY_BACK:\r
+ if (current_remote_key == RC_KEY_BACK) match=1;\r
+ break;\r
+ }\r
+ if (match) {\r
+ //A match occurred, so the event has now been processed\r
+ //Clear it, and return success\r
+ current_remote_key=0;\r
+ remotekeyIsRepeat=0;\r
+ return 1;\r
+ }\r
+ }\r
+ \r
+ // Xbox controller section\r
+ if (selected_Button < 6) {\r
+ \r
+ unsigned char Button;\r
+ \r
+ Button = XPAD_current[0].keys[selected_Button];\r
+ \r
+ if ((Button>0x30)&&(xpad_button_history[selected_Button]==0)) {\r
+ // Button Rising Edge\r
+ xpad_button_history[selected_Button] = 1; \r
+ return 1;\r
+ } \r
+ \r
+ if ((Button==0x00)&&(xpad_button_history[selected_Button]==1)) {\r
+ // Button Falling Edge\r
+ xpad_button_history[selected_Button] = 0; \r
+ return -1;\r
+ } \r
+ }\r
+ \r
+ if ((selected_Button > 5) & (selected_Button < 10) ) {\r
+ \r
+ unsigned char Buttonmask;\r
+ \r
+ switch (selected_Button) {\r
+ case TRIGGER_XPAD_PAD_UP :\r
+ Buttonmask = XPAD_PAD_UP; \r
+ break;\r
+ case TRIGGER_XPAD_PAD_DOWN :\r
+ Buttonmask = XPAD_PAD_DOWN;\r
+ break;\r
+ case TRIGGER_XPAD_PAD_LEFT :\r
+ Buttonmask = XPAD_PAD_LEFT;\r
+ break;\r
+ case TRIGGER_XPAD_PAD_RIGHT :\r
+ Buttonmask = XPAD_PAD_RIGHT;\r
+ break;\r
+ } \r
+ \r
+ // Rising Edge\r
+ if (((XPAD_current[0].pad&Buttonmask) != 0) & ((xpad_button_history[6]&Buttonmask) == 0)) {\r
+ xpad_button_history[6] ^= Buttonmask; // Flip the Bit\r
+ return 1;\r
+ } \r
+ // Falling Edge\r
+ if (((XPAD_current[0].pad&Buttonmask) == 0) & ((xpad_button_history[6]&Buttonmask) != 0)) {\r
+ xpad_button_history[6] ^= Buttonmask; // Flip the Bit\r
+ return -1;\r
+ }\r
+ }\r
+ return 0;\r
+}\r
--- /dev/null
+#include "../usb_wrapper.h"\r
+\r
+\r
+void wait_ms(int mils)\r
+{\r
+ LARGE_INTEGER Interval;\r
+\r
+ Interval.QuadPart = -mils*10;\r
+ KeDelayExecutionThread(KernelMode, FALSE, &Interval);\r
+}\r
--- /dev/null
+#include "../usb_wrapper.h"\r
+\r
+#define keyboarddebug 0\r
+\r
+#if keyboarddebug\r
+extern int printe(const char *szFormat, ...);\r
+int ycoffset = 0;\r
+#endif\r
+\r
+unsigned int current_keyboard_key;\r
+\r
+struct usb_kbd_info {\r
+ struct urb *urb;\r
+ unsigned char kbd_pkt[8];\r
+ unsigned char old[8];\r
+\r
+ /*\r
+ struct input_dev dev;\r
+ struct usb_device *usbdev;\r
+ struct urb irq, led;\r
+ struct usb_ctrlrequest dr;\r
+ unsigned char leds, newleds;\r
+ char name[128];\r
+ int open;\r
+ */\r
+};\r
+\r
+static void usb_kbd_irq(struct urb *urb, struct pt_regs *regs)\r
+{\r
+ struct usb_kbd_info *kbd = urb->context;\r
+ int i;\r
+\r
+ if (urb->status) return;\r
+ \r
+ memcpy(kbd->kbd_pkt, urb->transfer_buffer, 8);\r
+ \r
+ current_keyboard_key = kbd->kbd_pkt[2];\r
+ \r
+ \r
+ #if keyboarddebug\r
+ ycoffset += 15;\r
+ ycoffset = ycoffset % 600;\r
+ VIDEO_CURSOR_POSX=20;\r
+ VIDEO_CURSOR_POSY=ycoffset; \r
+ printe(" -%02x %02x %02x %02x %02x %02x\n",kbd->kbd_pkt[0],kbd->kbd_pkt[1],kbd->kbd_pkt[2],kbd->kbd_pkt[3],kbd->kbd_pkt[4],kbd->kbd_pkt[5]);\r
+ #endif\r
+ \r
+ usb_submit_urb(urb,GFP_ATOMIC);\r
+ \r
+}\r
+\r
+static int usb_kbd_probe(struct usb_interface *intf, const struct usb_device_id *id)\r
+{\r
+ struct urb *urb;\r
+ struct usb_device *udev = interface_to_usbdev (intf);\r
+ struct usb_endpoint_descriptor *ep_irq_in;\r
+ struct usb_endpoint_descriptor *ep_irq_out;\r
+ struct usb_kbd_info *usbk;\r
+\r
+ int i, pipe, maxp;\r
+ char *buf;\r
+\r
+ usbk=(struct usb_kbd_info *)kmalloc(sizeof(struct usb_kbd_info),0);\r
+ if (!usbk) return -1;\r
+\r
+ urb=usb_alloc_urb(0,0);\r
+ if (!urb) return -1;\r
+\r
+ usbk->urb=urb;\r
+\r
+ ep_irq_in = &intf->altsetting[0].endpoint[0].desc;\r
+ usb_fill_int_urb(urb, udev,\r
+ usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress),\r
+ usbk->kbd_pkt, 8, usb_kbd_irq,\r
+ usbk, 8);\r
+\r
+ usb_submit_urb(urb,GFP_ATOMIC);\r
+ usb_set_intfdata(intf,usbk);\r
+ #if keyboarddebug\r
+ printe("USB Keyboard Connected\n"); \r
+ #endif\r
+}\r
+\r
+\r
+static void usb_kbd_disconnect(struct usb_interface *intf)\r
+{\r
+ struct usb_kbd_info *usbk = usb_get_intfdata (intf);\r
+ usbprintk("Keyboard disconnected\n ");\r
+ usb_unlink_urb(usbk->urb);\r
+ usb_free_urb(usbk->urb);\r
+ kfree(usbk);\r
+}\r
+\r
+static struct usb_device_id usb_kbd_id_table [] = {\r
+ { USB_INTERFACE_INFO(3, 1, 1) },\r
+ { } /* Terminating entry */\r
+};\r
+\r
+\r
+static struct usb_driver usb_kbd_driver = {\r
+ .owner = THIS_MODULE,\r
+ .name = "keyboard",\r
+ .probe = usb_kbd_probe,\r
+ .disconnect = usb_kbd_disconnect,\r
+ .id_table = usb_kbd_id_table,\r
+};\r
+\r
+void UsbKeyBoardInit(void)\r
+{\r
+\r
+ //current_remote_key=0;\r
+ //sbprintk("Keyboard probe %p ",xremote_probe);\r
+ if (usb_register(&usb_kbd_driver) < 0) {\r
+ #if keyboarddebug\r
+ printe("Unable to register Keyboard driver");\r
+ #endif\r
+ return;\r
+ } \r
+}\r
+\r
+void UsbKeyBoardRemove(void) {\r
+ usb_deregister(&usb_kbd_driver);\r
+}\r
--- /dev/null
+/*\r
+ * Interface calls to BIOS\r
+ *\r
+ * 2003-06-21 Georg Acher (georg@acher.org)\r
+ *\r
+ */\r
+\r
+#include "boot.h"\r
+#include <stdarg.h>\r
+#include "video.h"\r
+\r
+/*------------------------------------------------------------------------*/ \r
+// Output window for USB messages\r
+int usb_curs_x=0;\r
+int usb_curs_y=0;\r
+\r
+void zxprintf(char* fmt, ...)\r
+{\r
+ va_list ap;\r
+ char buffer[1024];\r
+ int tmp_x, tmp_y;\r
+ tmp_x=VIDEO_CURSOR_POSX;\r
+ tmp_y=VIDEO_CURSOR_POSY;\r
+ \r
+ VIDEO_CURSOR_POSX=usb_curs_x;\r
+ VIDEO_CURSOR_POSY=usb_curs_y;\r
+ \r
+ if ((VIDEO_CURSOR_POSY==0) || (VIDEO_CURSOR_POSY > (vmode.height -16)))\r
+ {\r
+ BootVideoClearScreen(&jpegBackdrop, 3*vmode.height/4, \r
+ vmode.height);\r
+ VIDEO_CURSOR_POSY=3*vmode.height/4;\r
+ }\r
+\r
+ va_start(ap, fmt);\r
+ vsprintf(buffer,fmt,ap);\r
+ //printk(buffer);\r
+ va_end(ap);\r
+\r
+ usb_curs_x=VIDEO_CURSOR_POSX;\r
+ usb_curs_y=VIDEO_CURSOR_POSY;\r
+ VIDEO_CURSOR_POSX=tmp_x;\r
+ VIDEO_CURSOR_POSY=tmp_y;\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+int zxsnprintf(char *buffer, size_t s, char* fmt, ...)\r
+{\r
+ va_list ap;\r
+ int x;\r
+ va_start(ap, fmt);\r
+ x=vsprintf(buffer,fmt,ap);\r
+ va_end(ap);\r
+ return x;\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+int zxsprintf(char *buffer, char* fmt, ...)\r
+{\r
+ va_list ap;\r
+ int x;\r
+ va_start(ap, fmt);\r
+ x=vsprintf(buffer,fmt,ap);\r
+ va_end(ap);\r
+ return x;\r
+}\r
+/*------------------------------------------------------------------------*/ \r
--- /dev/null
+/*\r
+ * Simple XPAD driver for XBOX\r
+ *\r
+ * (c) 2003-07-04, Georg Acher (georg@acher.org)\r
+ *\r
+ * Inspired by linux/drivers/usb/input/xpad.c\r
+ * by Marko Friedemann <mfr@bmx-chemnitz.de>\r
+ *\r
+ */\r
+\r
+\r
+\r
+#include "../usb_wrapper.h"\r
+#include "config.h"\r
+\r
+// history for the Rising - falling events\r
+unsigned char xpad_button_history[7];\r
+\r
+/* Stores time and XPAD state */\r
+struct xpad_data XPAD_current[4];\r
+struct xpad_data XPAD_last[4];\r
+\r
+struct xpad_info\r
+{\r
+ struct urb *urb;\r
+ int num;\r
+ unsigned char data[32];\r
+};\r
+\r
+int xpad_num=0;\r
+/*------------------------------------------------------------------------*/ \r
+static void xpad_irq(struct urb *urb, struct pt_regs *regs)\r
+{\r
+ struct xpad_info *xpi = urb->context;\r
+ unsigned char* data= urb->transfer_buffer;\r
+ \r
+// struct xpad_data *xp=&XPAD_current[xpi->num];\r
+// struct xpad_data *xpo=&XPAD_last[xpi->num];\r
+\r
+ /* This hack means the xpad event always gets posted to the\r
+ * first xpad - avoids problems iterating over multiple xpads\r
+ * as the xpi->num entries are not reused when xpads are\r
+ * connected, then removed */\r
+\r
+ struct xpad_data *xp=&XPAD_current[0];\r
+ struct xpad_data *xpo=&XPAD_last[0];\r
+ \r
+ if (xpi->num<0 || xpi->num>3)\r
+ return;\r
+ \r
+ memcpy(xpo,xp,sizeof(struct xpad_data));\r
+ \r
+ xp->stick_left_x=(short) (((short)data[13] << 8) | data[12]);\r
+ xp->stick_left_y=(short) (((short)data[15] << 8) | data[14]);\r
+ xp->stick_right_x=(short) (((short)data[17] << 8) | data[16]);\r
+ xp->stick_right_y=(short) (((short)data[19] << 8) | data[18]);\r
+ xp->trig_left= data[10];\r
+ xp->trig_right= data[11];\r
+ xp->pad = data[2]&0xf;\r
+ xp->state = (data[2]>>4)&0xf;\r
+ xp->keys[0] = data[4]; // a\r
+ xp->keys[1] = data[5]; // b\r
+ xp->keys[2] = data[6]; // x\r
+ xp->keys[3] = data[7]; // y\r
+ xp->keys[4] = data[8]; // black\r
+ xp->keys[5] = data[9]; // white\r
+ xp->timestamp=jiffies; // FIXME: A more uniform flowing time would be better... \r
+ usb_submit_urb(urb,GFP_ATOMIC);\r
+\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id)\r
+{\r
+ struct urb *urb;\r
+ struct usb_device *udev = interface_to_usbdev (intf);\r
+ struct usb_endpoint_descriptor *ep_irq_in;\r
+ struct usb_endpoint_descriptor *ep_irq_out;\r
+ struct xpad_info *xpi;\r
+\r
+ xpi=kmalloc(sizeof(struct xpad_info),GFP_KERNEL);\r
+ if (!xpi) return -1;\r
+\r
+ urb=usb_alloc_urb(0,0);\r
+ if (!urb) return -1;\r
+\r
+ xpi->urb=urb;\r
+ xpi->num=xpad_num;\r
+ ep_irq_in = &intf->altsetting[0].endpoint[0].desc;\r
+ usb_fill_int_urb(urb, udev,\r
+ usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress),\r
+ xpi->data, 32, xpad_irq,\r
+ xpi, 32);\r
+\r
+ usb_submit_urb(urb,GFP_ATOMIC);\r
+\r
+ usb_set_intfdata(intf,xpi);\r
+ usbprintk("XPAD #%i connected\n",xpad_num);\r
+ #ifdef XPAD_VIBRA_STARTUP\r
+ {\r
+ // Brum Brum\r
+ char data1[6]={0,6,0,120,0,120};\r
+ char data2[6]={0,6,0,0,0,0};\r
+ int dummy; \r
+\r
+ usb_bulk_msg(udev, usb_sndbulkpipe(udev,2),\r
+ data1, 6, &dummy, 500);\r
+ wait_ms(500);\r
+ usb_bulk_msg(udev, usb_sndbulkpipe(udev,2),\r
+ data2, 6, &dummy, 500); \r
+ }\r
+ #endif\r
+ xpad_num++;\r
+ return 0;\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+static void xpad_disconnect(struct usb_interface *intf)\r
+{\r
+ struct xpad_info *xpi=usb_get_intfdata (intf);\r
+ usb_unlink_urb(xpi->urb);\r
+ usb_free_urb(xpi->urb);\r
+ kfree(xpi);\r
+ xpad_num--;\r
+}\r
+/*------------------------------------------------------------------------*/ \r
+static struct usb_device_id xpad_ids [] = {\r
+ { USB_DEVICE(0x044f, 0x0f07) },//Thrustmaster, Inc. Controller\r
+ { USB_DEVICE(0x045e, 0x0202) },//Microsoft Xbox Controller\r
+ { USB_DEVICE(0x045e, 0x0285) },//Microsoft Xbox Controller S\r
+ { USB_DEVICE(0x045e, 0x0289) },//Microsoft Xbox Controller S\r
+ { USB_DEVICE(0x046d, 0xca88) },//Logitech Compact Controller for Xbox\r
+ { USB_DEVICE(0x05fd, 0x1007) },//???Mad Catz Controller???\r
+ { USB_DEVICE(0x05fd, 0x107a) },//InterAct PowerPad Pro\r
+ { USB_DEVICE(0x0738, 0x4516) },//Mad Catz Control Pad\r
+ { USB_DEVICE(0x0738, 0x4522) },//Mad Catz LumiCON\r
+ { USB_DEVICE(0x0738, 0x4526) },//Mad Catz Control Pad Pro\r
+ { USB_DEVICE(0x0738, 0x4536) },//Mad Catz MicroCON\r
+ { USB_DEVICE(0x0738, 0x4556) },//Mad Catz Lynx Wireless Controller\r
+ { USB_DEVICE(0x0c12, 0x9902) },//HAMA VibraX - *FAULTY HARDWARE*\r
+ { USB_DEVICE(0x0e4c, 0x1097) },//Radica Gamester Controller\r
+ { USB_DEVICE(0x0e4c, 0x2390) },//Radica Games Jtech Controller\r
+ { USB_DEVICE(0x0e6f, 0x0003) },//Logic3 Freebird wireless Controller\r
+ { USB_DEVICE(0x0e6f, 0x0005) },//Eclipse wireless Controlle\r
+ { USB_DEVICE(0x0f30, 0x0202) },//Joytech Advanced Controller \r
+ { USB_DEVICE(0xffff, 0xffff) },//Chinese-made Xbox Controller \r
+ { USB_DEVICE(0x0000, 0x0000) }, // nothing detected - FAIL\r
+ { } /* Terminating entry */ \r
+};\r
+\r
+\r
+static struct usb_driver xpad_driver = {\r
+ .owner = THIS_MODULE,\r
+ .name = "XPAD",\r
+ .probe = xpad_probe,\r
+ .disconnect = xpad_disconnect,\r
+ .id_table = xpad_ids,\r
+};\r
+\r
+/*------------------------------------------------------------------------*/ \r
+void XPADInit(void)\r
+{\r
+ int n;\r
+ for(n=0;n<4;n++)\r
+ {\r
+ memset(&XPAD_current[n], 0, sizeof(struct xpad_data));\r
+ memset(&XPAD_last[n], 0, sizeof(struct xpad_data));\r
+ }\r
+ memset(&xpad_button_history, 0, sizeof(xpad_button_history));\r
+ \r
+ usbprintk("XPAD probe %p ",xpad_probe);\r
+ if (usb_register(&xpad_driver) < 0) {\r
+ err("Unable to register XPAD driver");\r
+ return;\r
+ } \r
+}\r
+/*------------------------------------------------------------------------*/ \r
+void XPADRemove(void) {\r
+ usb_deregister(&xpad_driver);\r
+}\r
+\r
+/*------------------------------------------------------------------------*/ \r
+\r
+\r
+\r
--- /dev/null
+/*\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or \r
+ * (at your option) any later version.\r
+ * \r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
+ * \r
+ */\r
+\r
+/*\r
+ * $Id: xremote.c,v 1.5 2004/11/22 19:10:57 davidmpye Exp $\r
+ *\r
+ * Copyright (c) 2002 Steven Toth <steve@toth.demon.co.uk>\r
+ *\r
+ * XBOX DVD dongle infrared device driver for the input driver suite.\r
+ *\r
+ * This work was derived from the usbkbd.c kernel module.\r
+ *\r
+ * History:\r
+ *\r
+ * 2002_08_31 - 0.1 - Initial release\r
+ * 2002_09_02 - 0.2 - Added IOCTL support enabling user space administration\r
+ * of the translation matrix.\r
+ *\r
+ */\r
+\r
+#include "../usb_wrapper.h"\r
+\r
+\r
+u16 current_remote_key;\r
+u8 remotekeyIsRepeat;\r
+\r
+struct xremote_info \r
+{\r
+ struct urb *urb;\r
+ unsigned char irpkt[8];\r
+};\r
+\r
+/* USB callback completion handler\r
+ * Code in transfer_buffer is received as six unsigned chars\r
+ * Example PLAY=00 06 ea 0a 40 00\r
+ * The command is located in byte[2], the rest are ignored.\r
+ * Key position is byte[4] bit0 (7-0 format) 0=down, 1=up\r
+ * All other bits are unknown / now required.\r
+ */\r
+\r
+static void xremote_irq(struct urb *urb, struct pt_regs *regs)\r
+{\r
+ struct xremote_info *xri = urb->context;\r
+ \r
+ if (urb->status) return;\r
+ if (urb->actual_length < 6) return;\r
+\r
+ /* Messy/unnecessary, fix this */\r
+ memcpy(xri->irpkt, urb->transfer_buffer, 6);\r
+\r
+ /* Set the key action based in the sent action */\r
+ current_remote_key = ((xri->irpkt[2] & 0xff)<<8) | (xri->irpkt[3] & 0xff);\r
+\r
+ if (((xri->irpkt[4] & 0xff) + ((xri->irpkt[5] & 0xff ) << 8))>0x41) {\r
+ remotekeyIsRepeat=0;\r
+ }\r
+ else remotekeyIsRepeat=1;\r
+ \r
+ usb_submit_urb(urb,GFP_ATOMIC);\r
+}\r
+\r
+static int xremote_probe(struct usb_interface *intf, const struct usb_device_id *id)\r
+{\r
+ struct urb *urb;\r
+ struct usb_device *udev = interface_to_usbdev (intf);\r
+ struct usb_endpoint_descriptor *ep_irq_in;\r
+ struct usb_endpoint_descriptor *ep_irq_out;\r
+ struct xremote_info *xri;\r
+\r
+ xri=(struct xremote_info *)kmalloc(sizeof(struct xremote_info),0);\r
+ if (!xri) return -1;\r
+\r
+ urb=usb_alloc_urb(0,0);\r
+ if (!urb) return -1;\r
+\r
+ xri->urb=urb;\r
+\r
+ ep_irq_in = &intf->altsetting[0].endpoint[0].desc;\r
+ usb_fill_int_urb(urb, udev,\r
+ usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress),\r
+ xri->irpkt, 8, xremote_irq,\r
+ xri, 8);\r
+\r
+ usb_submit_urb(urb,GFP_ATOMIC);\r
+ usb_set_intfdata(intf,xri);\r
+\r
+ usbprintk("DVD Remote connected\n");\r
+ return 0;\r
+}\r
+\r
+static void xremote_disconnect(struct usb_interface *intf)\r
+{\r
+ struct xremote_info *xri = usb_get_intfdata (intf);\r
+ usbprintk("DVD Remote disconnected\n ");\r
+ usb_unlink_urb(xri->urb);\r
+ usb_free_urb(xri->urb);\r
+ kfree(xri);\r
+}\r
+\r
+static struct usb_device_id xremote_id_table [] = {\r
+ { USB_DEVICE(0x040b, 0x6521) }, /* Gamester Xbox DVD Movie Playback Kit IR */\r
+ { USB_DEVICE(0x045e, 0x0284) }, /* Microsoft Xbox DVD Movie Playback Kit IR */\r
+ { USB_DEVICE(0x0000, 0x0000) }, // nothing detected - FAIL\r
+ { } /* Terminating entry */\r
+};\r
+\r
+static struct usb_driver xremote_driver = {\r
+ .owner = THIS_MODULE,\r
+ .name = "XRemote",\r
+ .probe = xremote_probe,\r
+ .disconnect = xremote_disconnect,\r
+ .id_table = xremote_id_table,\r
+};\r
+\r
+void XRemoteInit(void)\r
+{\r
+\r
+ current_remote_key=0;\r
+ usbprintk("XRemote probe %p ",xremote_probe);\r
+ if (usb_register(&xremote_driver) < 0) {\r
+ err("Unable to register XRemote driver");\r
+ return;\r
+ } \r
+}\r
+\r
+void XRemoteRemove(void) {\r
+ usb_deregister(&xremote_driver);\r
+}\r
--- /dev/null
+//#include <stdlib.h>\r
+//#include <ntos/types.h>\r
+//#include <ddk/extypes.h>\r
+#include <ddk/ntddk.h>\r
+#include <debug.h>\r
+\r
+void wait_ms(int mils);\r
+\r
+#include "linux/linux_wrapper.h"\r
+#define __KERNEL__\r
+#undef CONFIG_PCI\r
+#define CONFIG_PCI\r
+\r
+#include "linux/usb.h"\r