Merge branch 'master' of git://www.denx.de/git/u-boot-mmc
authorTom Rini <trini@ti.com>
Tue, 7 May 2013 14:09:00 +0000 (10:09 -0400)
committerTom Rini <trini@ti.com>
Tue, 7 May 2013 14:09:00 +0000 (10:09 -0400)
common/cmd_usb.c
common/usb.c
common/usb_hub.c
common/usb_kbd.c
common/usb_storage.c
drivers/usb/host/ehci-hcd.c
drivers/usb/host/ohci-at91.c
include/common.h
include/usb.h
include/usb_defs.h

index dacdc2d..70e803b 100644 (file)
@@ -269,14 +269,42 @@ static void usb_display_config(struct usb_device *dev)
        printf("\n");
 }
 
+static struct usb_device *usb_find_device(int devnum)
+{
+       struct usb_device *dev;
+       int d;
+
+       for (d = 0; d < USB_MAX_DEVICE; d++) {
+               dev = usb_get_dev_index(d);
+               if (dev == NULL)
+                       return NULL;
+               if (dev->devnum == devnum)
+                       return dev;
+       }
+
+       return NULL;
+}
+
 static inline char *portspeed(int speed)
 {
-       if (speed == USB_SPEED_HIGH)
-               return "480 Mb/s";
-       else if (speed == USB_SPEED_LOW)
-               return "1.5 Mb/s";
-       else
-               return "12 Mb/s";
+       char *speed_str;
+
+       switch (speed) {
+       case USB_SPEED_SUPER:
+               speed_str = "5 Gb/s";
+               break;
+       case USB_SPEED_HIGH:
+               speed_str = "480 Mb/s";
+               break;
+       case USB_SPEED_LOW:
+               speed_str = "1.5 Mb/s";
+               break;
+       default:
+               speed_str = "12 Mb/s";
+               break;
+       }
+
+       return speed_str;
 }
 
 /* shows the device tree recursively */
@@ -348,6 +376,66 @@ static void usb_show_tree(struct usb_device *dev)
        usb_show_tree_graph(dev, &preamble[0]);
 }
 
+static int usb_test(struct usb_device *dev, int port, char* arg)
+{
+       int mode;
+
+       if (port > dev->maxchild) {
+               printf("Device is no hub or does not have %d ports.\n", port);
+               return 1;
+       }
+
+       switch (arg[0]) {
+       case 'J':
+       case 'j':
+               printf("Setting Test_J mode");
+               mode = USB_TEST_MODE_J;
+               break;
+       case 'K':
+       case 'k':
+               printf("Setting Test_K mode");
+               mode = USB_TEST_MODE_K;
+               break;
+       case 'S':
+       case 's':
+               printf("Setting Test_SE0_NAK mode");
+               mode = USB_TEST_MODE_SE0_NAK;
+               break;
+       case 'P':
+       case 'p':
+               printf("Setting Test_Packet mode");
+               mode = USB_TEST_MODE_PACKET;
+               break;
+       case 'F':
+       case 'f':
+               printf("Setting Test_Force_Enable mode");
+               mode = USB_TEST_MODE_FORCE_ENABLE;
+               break;
+       default:
+               printf("Unrecognized test mode: %s\nAvailable modes: "
+                      "J, K, S[E0_NAK], P[acket], F[orce_Enable]\n", arg);
+               return 1;
+       }
+
+       if (port)
+               printf(" on downstream facing port %d...\n", port);
+       else
+               printf(" on upstream facing port...\n");
+
+       if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0), USB_REQ_SET_FEATURE,
+                           port ? USB_RT_PORT : USB_RECIP_DEVICE,
+                           port ? USB_PORT_FEAT_TEST : USB_FEAT_TEST,
+                           (mode << 8) | port,
+                           NULL, 0, USB_CNTL_TIMEOUT) == -1) {
+               printf("Error during SET_FEATURE.\n");
+               return 1;
+       } else {
+               printf("Test mode successfully set. Use 'usb start' "
+                      "to return to normal operation.\n");
+               return 0;
+       }
+}
+
 
 /******************************************************************************
  * usb boot command intepreter. Derived from diskboot
@@ -441,17 +529,9 @@ static int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                        }
                        return 0;
                } else {
-                       int d;
-
-                       i = simple_strtoul(argv[2], NULL, 16);
+                       i = simple_strtoul(argv[2], NULL, 10);
                        printf("config for device %d\n", i);
-                       for (d = 0; d < USB_MAX_DEVICE; d++) {
-                               dev = usb_get_dev_index(d);
-                               if (dev == NULL)
-                                       break;
-                               if (dev->devnum == i)
-                                       break;
-                       }
+                       dev = usb_find_device(i);
                        if (dev == NULL) {
                                printf("*** No device available ***\n");
                                return 0;
@@ -462,6 +542,18 @@ static int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                }
                return 0;
        }
+       if (strncmp(argv[1], "test", 4) == 0) {
+               if (argc < 5)
+                       return CMD_RET_USAGE;
+               i = simple_strtoul(argv[2], NULL, 10);
+               dev = usb_find_device(i);
+               if (dev == NULL) {
+                       printf("Device %d does not exist.\n", i);
+                       return 1;
+               }
+               i = simple_strtoul(argv[3], NULL, 10);
+               return usb_test(dev, i, argv[4]);
+       }
 #ifdef CONFIG_USB_STORAGE
        if (strncmp(argv[1], "stor", 4) == 0)
                return usb_stor_info();
@@ -571,7 +663,6 @@ static int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        return CMD_RET_USAGE;
 }
 
-#ifdef CONFIG_USB_STORAGE
 U_BOOT_CMD(
        usb,    5,      1,      do_usb,
        "USB sub-system",
@@ -580,30 +671,26 @@ U_BOOT_CMD(
        "usb stop [f] - stop USB [f]=force stop\n"
        "usb tree - show USB device tree\n"
        "usb info [dev] - show available USB devices\n"
+       "usb test [dev] [port] [mode] - set USB 2.0 test mode\n"
+       "    (specify port 0 to indicate the device's upstream port)\n"
+       "    Available modes: J, K, S[E0_NAK], P[acket], F[orce_Enable]\n"
+#ifdef CONFIG_USB_STORAGE
        "usb storage - show details of USB storage devices\n"
        "usb dev [dev] - show or set current USB storage device\n"
        "usb part [dev] - print partition table of one or all USB storage"
-       " devices\n"
+       "    devices\n"
        "usb read addr blk# cnt - read `cnt' blocks starting at block `blk#'\n"
        "    to memory address `addr'\n"
        "usb write addr blk# cnt - write `cnt' blocks starting at block `blk#'\n"
        "    from memory address `addr'"
+#endif /* CONFIG_USB_STORAGE */
 );
 
 
+#ifdef CONFIG_USB_STORAGE
 U_BOOT_CMD(
        usbboot,        3,      1,      do_usbboot,
        "boot from USB device",
        "loadAddr dev:part"
 );
-
-#else
-U_BOOT_CMD(
-       usb,    5,      1,      do_usb,
-       "USB sub-system",
-       "start - start (scan) USB controller\n"
-       "usb reset - reset (rescan) USB controller\n"
-       "usb tree - show USB device tree\n"
-       "usb info [dev] - show available USB devices"
-);
-#endif
+#endif /* CONFIG_USB_STORAGE */
index 6fc0fc1..55fff5b 100644 (file)
 #include <asm/4xx_pci.h>
 #endif
 
-#ifdef DEBUG
-#define USB_DEBUG      1
-#define USB_HUB_DEBUG  1
-#else
-#define USB_DEBUG      0
-#define USB_HUB_DEBUG  0
-#endif
-
-#define USB_PRINTF(fmt, args...)       debug_cond(USB_DEBUG, fmt, ##args)
-#define USB_HUB_PRINTF(fmt, args...)   debug_cond(USB_HUB_DEBUG, fmt, ##args)
-
 #define USB_BUFSIZ     512
 
 static struct usb_device usb_dev[USB_MAX_DEVICE];
@@ -130,7 +119,7 @@ int usb_init(void)
                usb_started = 1;
        }
 
-       USB_PRINTF("scan end\n");
+       debug("scan end\n");
        /* if we were not able to find at least one working bus, bail out */
        if (!usb_started) {
                puts("USB error: all controllers failed lowlevel init\n");
@@ -216,9 +205,9 @@ int usb_control_msg(struct usb_device *dev, unsigned int pipe,
        setup_packet->value = cpu_to_le16(value);
        setup_packet->index = cpu_to_le16(index);
        setup_packet->length = cpu_to_le16(size);
-       USB_PRINTF("usb_control_msg: request: 0x%X, requesttype: 0x%X, " \
-                  "value 0x%X index 0x%X length 0x%X\n",
-                  request, requesttype, value, index, size);
+       debug("usb_control_msg: request: 0x%X, requesttype: 0x%X, " \
+             "value 0x%X index 0x%X length 0x%X\n",
+             request, requesttype, value, index, size);
        dev->status = USB_ST_NOT_PROC; /*not yet processed */
 
        if (submit_control_msg(dev, pipe, data, size, setup_packet) < 0)
@@ -314,22 +303,22 @@ usb_set_maxpacket_ep(struct usb_device *dev, int if_idx, int ep_idx)
                /* Control => bidirectional */
                dev->epmaxpacketout[b] = ep_wMaxPacketSize;
                dev->epmaxpacketin[b] = ep_wMaxPacketSize;
-               USB_PRINTF("##Control EP epmaxpacketout/in[%d] = %d\n",
-                          b, dev->epmaxpacketin[b]);
+               debug("##Control EP epmaxpacketout/in[%d] = %d\n",
+                     b, dev->epmaxpacketin[b]);
        } else {
                if ((ep->bEndpointAddress & 0x80) == 0) {
                        /* OUT Endpoint */
                        if (ep_wMaxPacketSize > dev->epmaxpacketout[b]) {
                                dev->epmaxpacketout[b] = ep_wMaxPacketSize;
-                               USB_PRINTF("##EP epmaxpacketout[%d] = %d\n",
-                                          b, dev->epmaxpacketout[b]);
+                               debug("##EP epmaxpacketout[%d] = %d\n",
+                                     b, dev->epmaxpacketout[b]);
                        }
                } else {
                        /* IN Endpoint */
                        if (ep_wMaxPacketSize > dev->epmaxpacketin[b]) {
                                dev->epmaxpacketin[b] = ep_wMaxPacketSize;
-                               USB_PRINTF("##EP epmaxpacketin[%d] = %d\n",
-                                          b, dev->epmaxpacketin[b]);
+                               debug("##EP epmaxpacketin[%d] = %d\n",
+                                     b, dev->epmaxpacketin[b]);
                        }
                } /* if out */
        } /* if control */
@@ -358,8 +347,8 @@ static int usb_parse_config(struct usb_device *dev,
 {
        struct usb_descriptor_header *head;
        int index, ifno, epno, curr_if_num;
-       int i;
        u16 ep_wMaxPacketSize;
+       struct usb_interface *if_desc = NULL;
 
        ifno = -1;
        epno = -1;
@@ -387,23 +376,27 @@ static int usb_parse_config(struct usb_device *dev,
                             &buffer[index])->bInterfaceNumber != curr_if_num) {
                                /* this is a new interface, copy new desc */
                                ifno = dev->config.no_of_if;
+                               if_desc = &dev->config.if_desc[ifno];
                                dev->config.no_of_if++;
-                               memcpy(&dev->config.if_desc[ifno],
-                                       &buffer[index], buffer[index]);
-                               dev->config.if_desc[ifno].no_of_ep = 0;
-                               dev->config.if_desc[ifno].num_altsetting = 1;
+                               memcpy(if_desc, &buffer[index], buffer[index]);
+                               if_desc->no_of_ep = 0;
+                               if_desc->num_altsetting = 1;
                                curr_if_num =
-                                    dev->config.if_desc[ifno].desc.bInterfaceNumber;
+                                    if_desc->desc.bInterfaceNumber;
                        } else {
                                /* found alternate setting for the interface */
-                               dev->config.if_desc[ifno].num_altsetting++;
+                               if (ifno >= 0) {
+                                       if_desc = &dev->config.if_desc[ifno];
+                                       if_desc->num_altsetting++;
+                               }
                        }
                        break;
                case USB_DT_ENDPOINT:
                        epno = dev->config.if_desc[ifno].no_of_ep;
+                       if_desc = &dev->config.if_desc[ifno];
                        /* found an endpoint */
-                       dev->config.if_desc[ifno].no_of_ep++;
-                       memcpy(&dev->config.if_desc[ifno].ep_desc[epno],
+                       if_desc->no_of_ep++;
+                       memcpy(&if_desc->ep_desc[epno],
                                &buffer[index], buffer[index]);
                        ep_wMaxPacketSize = get_unaligned(&dev->config.\
                                                        if_desc[ifno].\
@@ -414,23 +407,30 @@ static int usb_parse_config(struct usb_device *dev,
                                        if_desc[ifno].\
                                        ep_desc[epno].\
                                        wMaxPacketSize);
-                       USB_PRINTF("if %d, ep %d\n", ifno, epno);
+                       debug("if %d, ep %d\n", ifno, epno);
+                       break;
+               case USB_DT_SS_ENDPOINT_COMP:
+                       if_desc = &dev->config.if_desc[ifno];
+                       memcpy(&if_desc->ss_ep_comp_desc[epno],
+                               &buffer[index], buffer[index]);
                        break;
                default:
                        if (head->bLength == 0)
                                return 1;
 
-                       USB_PRINTF("unknown Description Type : %x\n",
-                                  head->bDescriptorType);
+                       debug("unknown Description Type : %x\n",
+                             head->bDescriptorType);
 
+#ifdef DEBUG
                        {
-#ifdef USB_DEBUG
                                unsigned char *ch = (unsigned char *)head;
-#endif
+                               int i;
+
                                for (i = 0; i < head->bLength; i++)
-                                       USB_PRINTF("%02X ", *ch++);
-                               USB_PRINTF("\n\n\n");
+                                       debug("%02X ", *ch++);
+                               debug("\n\n\n");
                        }
+#endif
                        break;
                }
                index += head->bLength;
@@ -514,8 +514,7 @@ int usb_get_configuration_no(struct usb_device *dev,
        }
 
        result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, tmp);
-       USB_PRINTF("get_conf_no %d Result %d, wLength %d\n",
-                  cfgno, result, tmp);
+       debug("get_conf_no %d Result %d, wLength %d\n", cfgno, result, tmp);
        return result;
 }
 
@@ -527,7 +526,7 @@ static int usb_set_address(struct usb_device *dev)
 {
        int res;
 
-       USB_PRINTF("set address %d\n", dev->devnum);
+       debug("set address %d\n", dev->devnum);
        res = usb_control_msg(dev, usb_snddefctrl(dev),
                                USB_REQ_SET_ADDRESS, 0,
                                (dev->devnum), 0,
@@ -579,7 +578,7 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate)
 static int usb_set_configuration(struct usb_device *dev, int configuration)
 {
        int res;
-       USB_PRINTF("set configuration %d\n", configuration);
+       debug("set configuration %d\n", configuration);
        /* set setup command */
        res = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
                                USB_REQ_SET_CONFIGURATION, 0,
@@ -731,19 +730,19 @@ int usb_string(struct usb_device *dev, int index, char *buf, size_t size)
        if (!dev->have_langid) {
                err = usb_string_sub(dev, 0, 0, tbuf);
                if (err < 0) {
-                       USB_PRINTF("error getting string descriptor 0 " \
-                                  "(error=%lx)\n", dev->status);
+                       debug("error getting string descriptor 0 " \
+                             "(error=%lx)\n", dev->status);
                        return -1;
                } else if (tbuf[0] < 4) {
-                       USB_PRINTF("string descriptor 0 too short\n");
+                       debug("string descriptor 0 too short\n");
                        return -1;
                } else {
                        dev->have_langid = -1;
                        dev->string_langid = tbuf[2] | (tbuf[3] << 8);
                                /* always use the first langid listed */
-                       USB_PRINTF("USB device number %d default " \
-                                  "language ID 0x%x\n",
-                                  dev->devnum, dev->string_langid);
+                       debug("USB device number %d default " \
+                             "language ID 0x%x\n",
+                             dev->devnum, dev->string_langid);
                }
        }
 
@@ -789,7 +788,7 @@ struct usb_device *usb_get_dev_index(int index)
 struct usb_device *usb_alloc_new_device(void *controller)
 {
        int i;
-       USB_PRINTF("New Device %d\n", dev_index);
+       debug("New Device %d\n", dev_index);
        if (dev_index == USB_MAX_DEVICE) {
                printf("ERROR, too many USB Devices, max=%d\n", USB_MAX_DEVICE);
                return NULL;
@@ -813,7 +812,7 @@ struct usb_device *usb_alloc_new_device(void *controller)
 void usb_free_device(void)
 {
        dev_index--;
-       USB_PRINTF("Freeing device node: %d\n", dev_index);
+       debug("Freeing device node: %d\n", dev_index);
        memset(&usb_dev[dev_index], 0, sizeof(struct usb_device));
        usb_dev[dev_index].devnum = -1;
 }
@@ -880,11 +879,16 @@ int usb_new_device(struct usb_device *dev)
 
        err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, 64);
        if (err < 0) {
-               USB_PRINTF("usb_new_device: usb_get_descriptor() failed\n");
+               debug("usb_new_device: usb_get_descriptor() failed\n");
                return 1;
        }
 
        dev->descriptor.bMaxPacketSize0 = desc->bMaxPacketSize0;
+       /*
+        * Fetch the device class, driver can use this info
+        * to differentiate between HUB and DEVICE.
+        */
+       dev->descriptor.bDeviceClass = desc->bDeviceClass;
 
        /* find the port number we're at */
        if (parent) {
@@ -973,9 +977,9 @@ int usb_new_device(struct usb_device *dev)
                        "len %d, status %lX\n", dev->act_len, dev->status);
                return -1;
        }
-       USB_PRINTF("new device strings: Mfr=%d, Product=%d, SerialNumber=%d\n",
-                  dev->descriptor.iManufacturer, dev->descriptor.iProduct,
-                  dev->descriptor.iSerialNumber);
+       debug("new device strings: Mfr=%d, Product=%d, SerialNumber=%d\n",
+             dev->descriptor.iManufacturer, dev->descriptor.iProduct,
+             dev->descriptor.iSerialNumber);
        memset(dev->mf, 0, sizeof(dev->mf));
        memset(dev->prod, 0, sizeof(dev->prod));
        memset(dev->serial, 0, sizeof(dev->serial));
@@ -988,9 +992,9 @@ int usb_new_device(struct usb_device *dev)
        if (dev->descriptor.iSerialNumber)
                usb_string(dev, dev->descriptor.iSerialNumber,
                           dev->serial, sizeof(dev->serial));
-       USB_PRINTF("Manufacturer %s\n", dev->mf);
-       USB_PRINTF("Product      %s\n", dev->prod);
-       USB_PRINTF("SerialNumber %s\n", dev->serial);
+       debug("Manufacturer %s\n", dev->mf);
+       debug("Product      %s\n", dev->prod);
+       debug("SerialNumber %s\n", dev->serial);
        /* now prode if the device is a hub */
        usb_hub_probe(dev, 0);
        return 0;
index b5eeb62..0d79ec3 100644 (file)
 #include <asm/4xx_pci.h>
 #endif
 
-#ifdef DEBUG
-#define USB_DEBUG      1
-#define USB_HUB_DEBUG  1
-#else
-#define USB_DEBUG      0
-#define USB_HUB_DEBUG  0
-#endif
-
-#define USB_PRINTF(fmt, args...)       debug_cond(USB_DEBUG, fmt, ##args)
-#define USB_HUB_PRINTF(fmt, args...)   debug_cond(USB_HUB_DEBUG, fmt, ##args)
-
 #define USB_BUFSIZ     512
 
 static struct usb_hub_device hub_dev[USB_MAX_HUB];
@@ -111,13 +100,52 @@ static void usb_hub_power_on(struct usb_hub_device *hub)
        int i;
        struct usb_device *dev;
        unsigned pgood_delay = hub->desc.bPwrOn2PwrGood * 2;
+       ALLOC_CACHE_ALIGN_BUFFER(struct usb_port_status, portsts, 1);
+       unsigned short portstatus;
+       int ret;
 
        dev = hub->pusb_dev;
-       /* Enable power to the ports */
-       USB_HUB_PRINTF("enabling power on all ports\n");
+
+       /*
+        * Enable power to the ports:
+        * Here we Power-cycle the ports: aka,
+        * turning them off and turning on again.
+        */
+       debug("enabling power on all ports\n");
+       for (i = 0; i < dev->maxchild; i++) {
+               usb_clear_port_feature(dev, i + 1, USB_PORT_FEAT_POWER);
+               debug("port %d returns %lX\n", i + 1, dev->status);
+       }
+
+       /* Wait at least 2*bPwrOn2PwrGood for PP to change */
+       mdelay(pgood_delay);
+
+       for (i = 0; i < dev->maxchild; i++) {
+               ret = usb_get_port_status(dev, i + 1, portsts);
+               if (ret < 0) {
+                       debug("port %d: get_port_status failed\n", i + 1);
+                       return;
+               }
+
+               /*
+                * Check to confirm the state of Port Power:
+                * xHCI says "After modifying PP, s/w shall read
+                * PP and confirm that it has reached the desired state
+                * before modifying it again, undefined behavior may occur
+                * if this procedure is not followed".
+                * EHCI doesn't say anything like this, but no harm in keeping
+                * this.
+                */
+               portstatus = le16_to_cpu(portsts->wPortStatus);
+               if (portstatus & (USB_PORT_STAT_POWER << 1)) {
+                       debug("port %d: Port power change failed\n", i + 1);
+                       return;
+               }
+       }
+
        for (i = 0; i < dev->maxchild; i++) {
                usb_set_port_feature(dev, i + 1, USB_PORT_FEAT_POWER);
-               USB_HUB_PRINTF("port %d returns %lX\n", i + 1, dev->status);
+               debug("port %d returns %lX\n", i + 1, dev->status);
        }
 
        /* Wait at least 100 msec for power to become stable */
@@ -142,12 +170,24 @@ static struct usb_hub_device *usb_hub_allocate(void)
 
 static inline char *portspeed(int portstatus)
 {
-       if (portstatus & (1 << USB_PORT_FEAT_HIGHSPEED))
-               return "480 Mb/s";
-       else if (portstatus & (1 << USB_PORT_FEAT_LOWSPEED))
-               return "1.5 Mb/s";
-       else
-               return "12 Mb/s";
+       char *speed_str;
+
+       switch (portstatus & USB_PORT_STAT_SPEED_MASK) {
+       case USB_PORT_STAT_SUPER_SPEED:
+               speed_str = "5 Gb/s";
+               break;
+       case USB_PORT_STAT_HIGH_SPEED:
+               speed_str = "480 Mb/s";
+               break;
+       case USB_PORT_STAT_LOW_SPEED:
+               speed_str = "1.5 Mb/s";
+               break;
+       default:
+               speed_str = "12 Mb/s";
+               break;
+       }
+
+       return speed_str;
 }
 
 int hub_port_reset(struct usb_device *dev, int port,
@@ -157,29 +197,28 @@ int hub_port_reset(struct usb_device *dev, int port,
        ALLOC_CACHE_ALIGN_BUFFER(struct usb_port_status, portsts, 1);
        unsigned short portstatus, portchange;
 
-       USB_HUB_PRINTF("hub_port_reset: resetting port %d...\n", port);
+       debug("hub_port_reset: resetting port %d...\n", port);
        for (tries = 0; tries < MAX_TRIES; tries++) {
 
                usb_set_port_feature(dev, port + 1, USB_PORT_FEAT_RESET);
                mdelay(200);
 
                if (usb_get_port_status(dev, port + 1, portsts) < 0) {
-                       USB_HUB_PRINTF("get_port_status failed status %lX\n",
-                                       dev->status);
+                       debug("get_port_status failed status %lX\n",
+                             dev->status);
                        return -1;
                }
                portstatus = le16_to_cpu(portsts->wPortStatus);
                portchange = le16_to_cpu(portsts->wPortChange);
 
-               USB_HUB_PRINTF("portstatus %x, change %x, %s\n",
-                               portstatus, portchange,
-                               portspeed(portstatus));
+               debug("portstatus %x, change %x, %s\n", portstatus, portchange,
+                                                       portspeed(portstatus));
 
-               USB_HUB_PRINTF("STAT_C_CONNECTION = %d STAT_CONNECTION = %d" \
-                              "  USB_PORT_STAT_ENABLE %d\n",
-                       (portchange & USB_PORT_STAT_C_CONNECTION) ? 1 : 0,
-                       (portstatus & USB_PORT_STAT_CONNECTION) ? 1 : 0,
-                       (portstatus & USB_PORT_STAT_ENABLE) ? 1 : 0);
+               debug("STAT_C_CONNECTION = %d STAT_CONNECTION = %d" \
+                     "  USB_PORT_STAT_ENABLE %d\n",
+                     (portchange & USB_PORT_STAT_C_CONNECTION) ? 1 : 0,
+                     (portstatus & USB_PORT_STAT_CONNECTION) ? 1 : 0,
+                     (portstatus & USB_PORT_STAT_ENABLE) ? 1 : 0);
 
                if ((portchange & USB_PORT_STAT_C_CONNECTION) ||
                    !(portstatus & USB_PORT_STAT_CONNECTION))
@@ -192,9 +231,9 @@ int hub_port_reset(struct usb_device *dev, int port,
        }
 
        if (tries == MAX_TRIES) {
-               USB_HUB_PRINTF("Cannot enable port %i after %i retries, " \
-                               "disabling port.\n", port + 1, MAX_TRIES);
-               USB_HUB_PRINTF("Maybe the USB cable is bad?\n");
+               debug("Cannot enable port %i after %i retries, " \
+                     "disabling port.\n", port + 1, MAX_TRIES);
+               debug("Maybe the USB cable is bad?\n");
                return -1;
        }
 
@@ -212,15 +251,15 @@ void usb_hub_port_connect_change(struct usb_device *dev, int port)
 
        /* Check status */
        if (usb_get_port_status(dev, port + 1, portsts) < 0) {
-               USB_HUB_PRINTF("get_port_status failed\n");
+               debug("get_port_status failed\n");
                return;
        }
 
        portstatus = le16_to_cpu(portsts->wPortStatus);
-       USB_HUB_PRINTF("portstatus %x, change %x, %s\n",
-                       portstatus,
-                       le16_to_cpu(portsts->wPortChange),
-                       portspeed(portstatus));
+       debug("portstatus %x, change %x, %s\n",
+             portstatus,
+             le16_to_cpu(portsts->wPortChange),
+             portspeed(portstatus));
 
        /* Clear the connection change status */
        usb_clear_port_feature(dev, port + 1, USB_PORT_FEAT_C_CONNECTION);
@@ -228,7 +267,7 @@ void usb_hub_port_connect_change(struct usb_device *dev, int port)
        /* Disconnect any existing devices under this port */
        if (((!(portstatus & USB_PORT_STAT_CONNECTION)) &&
             (!(portstatus & USB_PORT_STAT_ENABLE))) || (dev->children[port])) {
-               USB_HUB_PRINTF("usb_disconnect(&hub->children[port]);\n");
+               debug("usb_disconnect(&hub->children[port]);\n");
                /* Return now if nothing is connected */
                if (!(portstatus & USB_PORT_STAT_CONNECTION))
                        return;
@@ -246,12 +285,20 @@ void usb_hub_port_connect_change(struct usb_device *dev, int port)
        /* Allocate a new device struct for it */
        usb = usb_alloc_new_device(dev->controller);
 
-       if (portstatus & USB_PORT_STAT_HIGH_SPEED)
+       switch (portstatus & USB_PORT_STAT_SPEED_MASK) {
+       case USB_PORT_STAT_SUPER_SPEED:
+               usb->speed = USB_SPEED_SUPER;
+               break;
+       case USB_PORT_STAT_HIGH_SPEED:
                usb->speed = USB_SPEED_HIGH;
-       else if (portstatus & USB_PORT_STAT_LOW_SPEED)
+               break;
+       case USB_PORT_STAT_LOW_SPEED:
                usb->speed = USB_SPEED_LOW;
-       else
+               break;
+       default:
                usb->speed = USB_SPEED_FULL;
+               break;
+       }
 
        dev->children[port] = usb;
        usb->parent = dev;
@@ -261,7 +308,7 @@ void usb_hub_port_connect_change(struct usb_device *dev, int port)
                /* Woops, disable the port */
                usb_free_device();
                dev->children[port] = NULL;
-               USB_HUB_PRINTF("hub: disabling port %d\n", port + 1);
+               debug("hub: disabling port %d\n", port + 1);
                usb_clear_port_feature(dev, port + 1, USB_PORT_FEAT_ENABLE);
        }
 }
@@ -275,9 +322,7 @@ static int usb_hub_configure(struct usb_device *dev)
        short hubCharacteristics;
        struct usb_hub_descriptor *descriptor;
        struct usb_hub_device *hub;
-#ifdef USB_HUB_DEBUG
-       struct usb_hub_status *hubsts;
-#endif
+       __maybe_unused struct usb_hub_status *hubsts;
 
        /* "allocate" Hub device */
        hub = usb_hub_allocate();
@@ -286,8 +331,8 @@ static int usb_hub_configure(struct usb_device *dev)
        hub->pusb_dev = dev;
        /* Get the the hub descriptor */
        if (usb_get_hub_descriptor(dev, buffer, 4) < 0) {
-               USB_HUB_PRINTF("usb_hub_configure: failed to get hub " \
-                                  "descriptor, giving up %lX\n", dev->status);
+               debug("usb_hub_configure: failed to get hub " \
+                     "descriptor, giving up %lX\n", dev->status);
                return -1;
        }
        descriptor = (struct usb_hub_descriptor *)buffer;
@@ -295,15 +340,14 @@ static int usb_hub_configure(struct usb_device *dev)
        /* silence compiler warning if USB_BUFSIZ is > 256 [= sizeof(char)] */
        i = descriptor->bLength;
        if (i > USB_BUFSIZ) {
-               USB_HUB_PRINTF("usb_hub_configure: failed to get hub " \
-                               "descriptor - too long: %d\n",
-                               descriptor->bLength);
+               debug("usb_hub_configure: failed to get hub " \
+                     "descriptor - too long: %d\n", descriptor->bLength);
                return -1;
        }
 
        if (usb_get_hub_descriptor(dev, buffer, descriptor->bLength) < 0) {
-               USB_HUB_PRINTF("usb_hub_configure: failed to get hub " \
-                               "descriptor 2nd giving up %lX\n", dev->status);
+               debug("usb_hub_configure: failed to get hub " \
+                     "descriptor 2nd giving up %lX\n", dev->status);
                return -1;
        }
        memcpy((unsigned char *)&hub->desc, buffer, descriptor->bLength);
@@ -325,74 +369,75 @@ static int usb_hub_configure(struct usb_device *dev)
                hub->desc.PortPowerCtrlMask[i] = descriptor->PortPowerCtrlMask[i];
 
        dev->maxchild = descriptor->bNbrPorts;
-       USB_HUB_PRINTF("%d ports detected\n", dev->maxchild);
+       debug("%d ports detected\n", dev->maxchild);
 
        hubCharacteristics = get_unaligned(&hub->desc.wHubCharacteristics);
        switch (hubCharacteristics & HUB_CHAR_LPSM) {
        case 0x00:
-               USB_HUB_PRINTF("ganged power switching\n");
+               debug("ganged power switching\n");
                break;
        case 0x01:
-               USB_HUB_PRINTF("individual port power switching\n");
+               debug("individual port power switching\n");
                break;
        case 0x02:
        case 0x03:
-               USB_HUB_PRINTF("unknown reserved power switching mode\n");
+               debug("unknown reserved power switching mode\n");
                break;
        }
 
        if (hubCharacteristics & HUB_CHAR_COMPOUND)
-               USB_HUB_PRINTF("part of a compound device\n");
+               debug("part of a compound device\n");
        else
-               USB_HUB_PRINTF("standalone hub\n");
+               debug("standalone hub\n");
 
        switch (hubCharacteristics & HUB_CHAR_OCPM) {
        case 0x00:
-               USB_HUB_PRINTF("global over-current protection\n");
+               debug("global over-current protection\n");
                break;
        case 0x08:
-               USB_HUB_PRINTF("individual port over-current protection\n");
+               debug("individual port over-current protection\n");
                break;
        case 0x10:
        case 0x18:
-               USB_HUB_PRINTF("no over-current protection\n");
+               debug("no over-current protection\n");
                break;
        }
 
-       USB_HUB_PRINTF("power on to power good time: %dms\n",
-                       descriptor->bPwrOn2PwrGood * 2);
-       USB_HUB_PRINTF("hub controller current requirement: %dmA\n",
-                       descriptor->bHubContrCurrent);
+       debug("power on to power good time: %dms\n",
+             descriptor->bPwrOn2PwrGood * 2);
+       debug("hub controller current requirement: %dmA\n",
+             descriptor->bHubContrCurrent);
 
        for (i = 0; i < dev->maxchild; i++)
-               USB_HUB_PRINTF("port %d is%s removable\n", i + 1,
-                       hub->desc.DeviceRemovable[(i + 1) / 8] & \
-                                          (1 << ((i + 1) % 8)) ? " not" : "");
+               debug("port %d is%s removable\n", i + 1,
+                     hub->desc.DeviceRemovable[(i + 1) / 8] & \
+                     (1 << ((i + 1) % 8)) ? " not" : "");
 
        if (sizeof(struct usb_hub_status) > USB_BUFSIZ) {
-               USB_HUB_PRINTF("usb_hub_configure: failed to get Status - " \
-                               "too long: %d\n", descriptor->bLength);
+               debug("usb_hub_configure: failed to get Status - " \
+                     "too long: %d\n", descriptor->bLength);
                return -1;
        }
 
        if (usb_get_hub_status(dev, buffer) < 0) {
-               USB_HUB_PRINTF("usb_hub_configure: failed to get Status %lX\n",
-                               dev->status);
+               debug("usb_hub_configure: failed to get Status %lX\n",
+                     dev->status);
                return -1;
        }
 
-#ifdef USB_HUB_DEBUG
+#ifdef DEBUG
        hubsts = (struct usb_hub_status *)buffer;
 #endif
-       USB_HUB_PRINTF("get_hub_status returned status %X, change %X\n",
-                       le16_to_cpu(hubsts->wHubStatus),
-                       le16_to_cpu(hubsts->wHubChange));
-       USB_HUB_PRINTF("local power source is %s\n",
-               (le16_to_cpu(hubsts->wHubStatus) & HUB_STATUS_LOCAL_POWER) ? \
-               "lost (inactive)" : "good");
-       USB_HUB_PRINTF("%sover-current condition exists\n",
-               (le16_to_cpu(hubsts->wHubStatus) & HUB_STATUS_OVERCURRENT) ? \
-               "" : "no ");
+
+       debug("get_hub_status returned status %X, change %X\n",
+             le16_to_cpu(hubsts->wHubStatus),
+             le16_to_cpu(hubsts->wHubChange));
+       debug("local power source is %s\n",
+             (le16_to_cpu(hubsts->wHubStatus) & HUB_STATUS_LOCAL_POWER) ? \
+             "lost (inactive)" : "good");
+       debug("%sover-current condition exists\n",
+             (le16_to_cpu(hubsts->wHubStatus) & HUB_STATUS_OVERCURRENT) ? \
+             "" : "no ");
        usb_hub_power_on(hub);
 
        for (i = 0; i < dev->maxchild; i++) {
@@ -412,7 +457,7 @@ static int usb_hub_configure(struct usb_device *dev)
                do {
                        ret = usb_get_port_status(dev, i + 1, portsts);
                        if (ret < 0) {
-                               USB_HUB_PRINTF("get_port_status failed\n");
+                               debug("get_port_status failed\n");
                                break;
                        }
 
@@ -423,22 +468,21 @@ static int usb_hub_configure(struct usb_device *dev)
                                (portstatus & USB_PORT_STAT_CONNECTION))
                                break;
 
-                       mdelay(100);
                } while (get_timer(start) < CONFIG_SYS_HZ * 10);
 
                if (ret < 0)
                        continue;
 
-               USB_HUB_PRINTF("Port %d Status %X Change %X\n",
-                               i + 1, portstatus, portchange);
+               debug("Port %d Status %X Change %X\n",
+                     i + 1, portstatus, portchange);
 
                if (portchange & USB_PORT_STAT_C_CONNECTION) {
-                       USB_HUB_PRINTF("port %d connection change\n", i + 1);
+                       debug("port %d connection change\n", i + 1);
                        usb_hub_port_connect_change(dev, i);
                }
                if (portchange & USB_PORT_STAT_C_ENABLE) {
-                       USB_HUB_PRINTF("port %d enable change, status %x\n",
-                                       i + 1, portstatus);
+                       debug("port %d enable change, status %x\n",
+                             i + 1, portstatus);
                        usb_clear_port_feature(dev, i + 1,
                                                USB_PORT_FEAT_C_ENABLE);
 
@@ -448,27 +492,27 @@ static int usb_hub_configure(struct usb_device *dev)
                        if (!(portstatus & USB_PORT_STAT_ENABLE) &&
                             (portstatus & USB_PORT_STAT_CONNECTION) &&
                             ((dev->children[i]))) {
-                               USB_HUB_PRINTF("already running port %i "  \
-                                               "disabled by hub (EMI?), " \
-                                               "re-enabling...\n", i + 1);
-                                       usb_hub_port_connect_change(dev, i);
+                               debug("already running port %i "  \
+                                     "disabled by hub (EMI?), " \
+                                     "re-enabling...\n", i + 1);
+                                     usb_hub_port_connect_change(dev, i);
                        }
                }
                if (portstatus & USB_PORT_STAT_SUSPEND) {
-                       USB_HUB_PRINTF("port %d suspend change\n", i + 1);
+                       debug("port %d suspend change\n", i + 1);
                        usb_clear_port_feature(dev, i + 1,
                                                USB_PORT_FEAT_SUSPEND);
                }
 
                if (portchange & USB_PORT_STAT_C_OVERCURRENT) {
-                       USB_HUB_PRINTF("port %d over-current change\n", i + 1);
+                       debug("port %d over-current change\n", i + 1);
                        usb_clear_port_feature(dev, i + 1,
                                                USB_PORT_FEAT_C_OVER_CURRENT);
                        usb_hub_power_on(hub);
                }
 
                if (portchange & USB_PORT_STAT_C_RESET) {
-                       USB_HUB_PRINTF("port %d reset change\n", i + 1);
+                       debug("port %d reset change\n", i + 1);
                        usb_clear_port_feature(dev, i + 1,
                                                USB_PORT_FEAT_C_RESET);
                }
@@ -503,7 +547,7 @@ int usb_hub_probe(struct usb_device *dev, int ifnum)
        if ((ep->bmAttributes & 3) != 3)
                return 0;
        /* We found a hub */
-       USB_HUB_PRINTF("USB hub found\n");
+       debug("USB hub found\n");
        ret = usb_hub_configure(dev);
        return ret;
 }
index 4efbcfe..b962849 100644 (file)
 
 #include <usb.h>
 
-#ifdef USB_KBD_DEBUG
-#define USB_KBD_PRINTF(fmt, args...)   printf(fmt, ##args)
-#else
-#define USB_KBD_PRINTF(fmt, args...)
-#endif
-
 /*
  * If overwrite_console returns 1, the stdin, stderr and stdout
  * are switched to the serial port, else the settings in the
@@ -262,7 +256,7 @@ static int usb_kbd_translate(struct usb_kbd_pdata *data, unsigned char scancode,
 
        /* Report keycode if any */
        if (keycode) {
-               USB_KBD_PRINTF("%c", keycode);
+               debug("%c", keycode);
                usb_kbd_put_queue(data, keycode);
        }
 
@@ -324,8 +318,8 @@ static int usb_kbd_irq_worker(struct usb_device *dev)
 static int usb_kbd_irq(struct usb_device *dev)
 {
        if ((dev->irq_status != 0) || (dev->irq_act_len != 8)) {
-               USB_KBD_PRINTF("USB KBD: Error %lX, len %d\n",
-                               dev->irq_status, dev->irq_act_len);
+               debug("USB KBD: Error %lX, len %d\n",
+                     dev->irq_status, dev->irq_act_len);
                return 1;
        }
 
@@ -437,7 +431,7 @@ static int usb_kbd_probe(struct usb_device *dev, unsigned int ifnum)
        if ((ep->bmAttributes & 3) != 3)
                return 0;
 
-       USB_KBD_PRINTF("USB KBD: found set protocol...\n");
+       debug("USB KBD: found set protocol...\n");
 
        data = malloc(sizeof(struct usb_kbd_pdata));
        if (!data) {
@@ -463,10 +457,10 @@ static int usb_kbd_probe(struct usb_device *dev, unsigned int ifnum)
        /* We found a USB Keyboard, install it. */
        usb_set_protocol(dev, iface->desc.bInterfaceNumber, 0);
 
-       USB_KBD_PRINTF("USB KBD: found set idle...\n");
+       debug("USB KBD: found set idle...\n");
        usb_set_idle(dev, iface->desc.bInterfaceNumber, REPEAT_RATE, 0);
 
-       USB_KBD_PRINTF("USB KBD: enable interrupt pipe...\n");
+       debug("USB KBD: enable interrupt pipe...\n");
        usb_submit_int_msg(dev, pipe, data->new, maxp > 8 ? 8 : maxp,
                                ep->bInterval);
 
@@ -497,16 +491,16 @@ int drv_usb_kbd_init(void)
                        continue;
 
                /* We found a keyboard, check if it is already registered. */
-               USB_KBD_PRINTF("USB KBD: found set up device.\n");
+               debug("USB KBD: found set up device.\n");
                old_dev = stdio_get_by_name(DEVNAME);
                if (old_dev) {
                        /* Already registered, just return ok. */
-                       USB_KBD_PRINTF("USB KBD: is already registered.\n");
+                       debug("USB KBD: is already registered.\n");
                        return 1;
                }
 
                /* Register the keyboard */
-               USB_KBD_PRINTF("USB KBD: register.\n");
+               debug("USB KBD: register.\n");
                memset(&usb_kbd_dev, 0, sizeof(struct stdio_dev));
                strcpy(usb_kbd_dev.name, DEVNAME);
                usb_kbd_dev.flags =  DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM;
index c5db044..457970f 100644 (file)
 #undef BBB_COMDAT_TRACE
 #undef BBB_XPORT_TRACE
 
-#ifdef USB_STOR_DEBUG
-#define USB_BLK_DEBUG  1
-#else
-#define USB_BLK_DEBUG  0
-#endif
-
-#define USB_STOR_PRINTF(fmt, args...)  debug_cond(USB_BLK_DEBUG, fmt, ##args)
-
 #include <scsi.h>
 /* direction table -- this indicates the direction of the data
  * transfer for each command code -- a 1 indicates input
@@ -228,8 +220,7 @@ static unsigned int usb_get_max_lun(struct us_data *us)
                              0, us->ifnum,
                              result, sizeof(char),
                              USB_CNTL_TIMEOUT * 5);
-       USB_STOR_PRINTF("Get Max LUN -> len = %i, result = %i\n",
-                       len, (int) *result);
+       debug("Get Max LUN -> len = %i, result = %i\n", len, (int) *result);
        return (len > 0) ? *result : 0;
 }
 
@@ -262,7 +253,7 @@ int usb_stor_scan(int mode)
        usb_max_devs = 0;
        for (i = 0; i < USB_MAX_DEVICE; i++) {
                dev = usb_get_dev_index(i); /* get device */
-               USB_STOR_PRINTF("i=%d\n", i);
+               debug("i=%d\n", i);
                if (dev == NULL)
                        break; /* no more devices available */
 
@@ -278,9 +269,9 @@ int usb_stor_scan(int mode)
                             lun++) {
                                usb_dev_desc[usb_max_devs].lun = lun;
                                if (usb_stor_get_info(dev, &usb_stor[start],
-                                                     &usb_dev_desc[usb_max_devs]) == 1) {
-                               usb_max_devs++;
-               }
+                                   &usb_dev_desc[usb_max_devs]) == 1) {
+                                       usb_max_devs++;
+                               }
                        }
                }
                /* if storage device */
@@ -309,7 +300,7 @@ static int usb_stor_irq(struct usb_device *dev)
 }
 
 
-#ifdef USB_STOR_DEBUG
+#ifdef DEBUG
 
 static void usb_show_srb(ccb *pccb)
 {
@@ -361,45 +352,49 @@ static int us_one_transfer(struct us_data *us, int pipe, char *buf, int length)
                /* set up the transfer loop */
                do {
                        /* transfer the data */
-                       USB_STOR_PRINTF("Bulk xfer 0x%x(%d) try #%d\n",
-                                 (unsigned int)buf, this_xfer, 11 - maxtry);
+                       debug("Bulk xfer 0x%x(%d) try #%d\n",
+                             (unsigned int)buf, this_xfer, 11 - maxtry);
                        result = usb_bulk_msg(us->pusb_dev, pipe, buf,
                                              this_xfer, &partial,
                                              USB_CNTL_TIMEOUT * 5);
-                       USB_STOR_PRINTF("bulk_msg returned %d xferred %d/%d\n",
-                                 result, partial, this_xfer);
+                       debug("bulk_msg returned %d xferred %d/%d\n",
+                             result, partial, this_xfer);
                        if (us->pusb_dev->status != 0) {
                                /* if we stall, we need to clear it before
                                 * we go on
                                 */
-#ifdef USB_STOR_DEBUG
+#ifdef DEBUG
                                display_int_status(us->pusb_dev->status);
 #endif
                                if (us->pusb_dev->status & USB_ST_STALLED) {
-                                       USB_STOR_PRINTF("stalled ->clearing endpoint halt for pipe 0x%x\n", pipe);
+                                       debug("stalled ->clearing endpoint" \
+                                             "halt for pipe 0x%x\n", pipe);
                                        stat = us->pusb_dev->status;
                                        usb_clear_halt(us->pusb_dev, pipe);
                                        us->pusb_dev->status = stat;
                                        if (this_xfer == partial) {
-                                               USB_STOR_PRINTF("bulk transferred with error %lX, but data ok\n", us->pusb_dev->status);
+                                               debug("bulk transferred" \
+                                                     "with error %lX," \
+                                                     " but data ok\n",
+                                                     us->pusb_dev->status);
                                                return 0;
                                        }
                                        else
                                                return result;
                                }
                                if (us->pusb_dev->status & USB_ST_NAK_REC) {
-                                       USB_STOR_PRINTF("Device NAKed bulk_msg\n");
+                                       debug("Device NAKed bulk_msg\n");
                                        return result;
                                }
-                               USB_STOR_PRINTF("bulk transferred with error");
+                               debug("bulk transferred with error");
                                if (this_xfer == partial) {
-                                       USB_STOR_PRINTF(" %ld, but data ok\n",
-                                                       us->pusb_dev->status);
+                                       debug(" %ld, but data ok\n",
+                                             us->pusb_dev->status);
                                        return 0;
                                }
                                /* if our try counter reaches 0, bail out */
-                                       USB_STOR_PRINTF(" %ld, data %d\n",
-                                               us->pusb_dev->status, partial);
+                                       debug(" %ld, data %d\n",
+                                             us->pusb_dev->status, partial);
                                if (!maxtry--)
                                                return result;
                        }
@@ -433,35 +428,34 @@ static int usb_stor_BBB_reset(struct us_data *us)
         *
         * This comment stolen from FreeBSD's /sys/dev/usb/umass.c.
         */
-       USB_STOR_PRINTF("BBB_reset\n");
+       debug("BBB_reset\n");
        result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev, 0),
                                 US_BBB_RESET,
                                 USB_TYPE_CLASS | USB_RECIP_INTERFACE,
                                 0, us->ifnum, NULL, 0, USB_CNTL_TIMEOUT * 5);
 
        if ((result < 0) && (us->pusb_dev->status & USB_ST_STALLED)) {
-               USB_STOR_PRINTF("RESET:stall\n");
+               debug("RESET:stall\n");
                return -1;
        }
 
        /* long wait for reset */
        mdelay(150);
-       USB_STOR_PRINTF("BBB_reset result %d: status %lX reset\n", result,
-                       us->pusb_dev->status);
+       debug("BBB_reset result %d: status %lX reset\n",
+             result, us->pusb_dev->status);
        pipe = usb_rcvbulkpipe(us->pusb_dev, us->ep_in);
        result = usb_clear_halt(us->pusb_dev, pipe);
        /* long wait for reset */
        mdelay(150);
-       USB_STOR_PRINTF("BBB_reset result %d: status %lX clearing IN endpoint\n",
-                       result, us->pusb_dev->status);
+       debug("BBB_reset result %d: status %lX clearing IN endpoint\n",
+             result, us->pusb_dev->status);
        /* long wait for reset */
        pipe = usb_sndbulkpipe(us->pusb_dev, us->ep_out);
        result = usb_clear_halt(us->pusb_dev, pipe);
        mdelay(150);
-       USB_STOR_PRINTF("BBB_reset result %d: status %lX"
-                       " clearing OUT endpoint\n", result,
-                       us->pusb_dev->status);
-       USB_STOR_PRINTF("BBB_reset done\n");
+       debug("BBB_reset result %d: status %lX clearing OUT endpoint\n",
+             result, us->pusb_dev->status);
+       debug("BBB_reset done\n");
        return 0;
 }
 
@@ -474,7 +468,7 @@ static int usb_stor_CB_reset(struct us_data *us)
        unsigned char cmd[12];
        int result;
 
-       USB_STOR_PRINTF("CB_reset\n");
+       debug("CB_reset\n");
        memset(cmd, 0xff, sizeof(cmd));
        cmd[0] = SCSI_SEND_DIAG;
        cmd[1] = 4;
@@ -486,13 +480,12 @@ static int usb_stor_CB_reset(struct us_data *us)
 
        /* long wait for reset */
        mdelay(1500);
-       USB_STOR_PRINTF("CB_reset result %d: status %lX"
-                       " clearing endpoint halt\n", result,
-                       us->pusb_dev->status);
+       debug("CB_reset result %d: status %lX clearing endpoint halt\n",
+             result, us->pusb_dev->status);
        usb_clear_halt(us->pusb_dev, usb_rcvbulkpipe(us->pusb_dev, us->ep_in));
        usb_clear_halt(us->pusb_dev, usb_rcvbulkpipe(us->pusb_dev, us->ep_out));
 
-       USB_STOR_PRINTF("CB_reset done\n");
+       debug("CB_reset done\n");
        return 0;
 }
 
@@ -511,7 +504,7 @@ static int usb_stor_BBB_comdat(ccb *srb, struct us_data *us)
        dir_in = US_DIRECTION(srb->cmd[0]);
 
 #ifdef BBB_COMDAT_TRACE
-       printf("dir %d lun %d cmdlen %d cmd %p datalen %d pdata %p\n",
+       printf("dir %d lun %d cmdlen %d cmd %p datalen %lu pdata %p\n",
                dir_in, srb->lun, srb->cmdlen, srb->cmd, srb->datalen,
                srb->pdata);
        if (srb->cmdlen) {
@@ -522,7 +515,7 @@ static int usb_stor_BBB_comdat(ccb *srb, struct us_data *us)
 #endif
        /* sanity checks */
        if (!(srb->cmdlen <= CBWCDBLENGTH)) {
-               USB_STOR_PRINTF("usb_stor_BBB_comdat:cmdlen too large\n");
+               debug("usb_stor_BBB_comdat:cmdlen too large\n");
                return -1;
        }
 
@@ -541,7 +534,7 @@ static int usb_stor_BBB_comdat(ccb *srb, struct us_data *us)
        result = usb_bulk_msg(us->pusb_dev, pipe, cbw, UMASS_BBB_CBW_SIZE,
                              &actlen, USB_CNTL_TIMEOUT * 5);
        if (result < 0)
-               USB_STOR_PRINTF("usb_stor_BBB_comdat:usb_bulk_msg error\n");
+               debug("usb_stor_BBB_comdat:usb_bulk_msg error\n");
        return result;
 }
 
@@ -564,8 +557,8 @@ static int usb_stor_CB_comdat(ccb *srb, struct us_data *us)
                pipe = usb_sndbulkpipe(us->pusb_dev, us->ep_out);
 
        while (retry--) {
-               USB_STOR_PRINTF("CBI gets a command: Try %d\n", 5 - retry);
-#ifdef USB_STOR_DEBUG
+               debug("CBI gets a command: Try %d\n", 5 - retry);
+#ifdef DEBUG
                usb_show_srb(srb);
 #endif
                /* let's send the command via the control pipe */
@@ -576,35 +569,35 @@ static int usb_stor_CB_comdat(ccb *srb, struct us_data *us)
                                         0, us->ifnum,
                                         srb->cmd, srb->cmdlen,
                                         USB_CNTL_TIMEOUT * 5);
-               USB_STOR_PRINTF("CB_transport: control msg returned %d,"
-                               " status %lX\n", result, us->pusb_dev->status);
+               debug("CB_transport: control msg returned %d, status %lX\n",
+                     result, us->pusb_dev->status);
                /* check the return code for the command */
                if (result < 0) {
                        if (us->pusb_dev->status & USB_ST_STALLED) {
                                status = us->pusb_dev->status;
-                               USB_STOR_PRINTF(" stall during command found,"
-                                               " clear pipe\n");
+                               debug(" stall during command found," \
+                                     " clear pipe\n");
                                usb_clear_halt(us->pusb_dev,
                                              usb_sndctrlpipe(us->pusb_dev, 0));
                                us->pusb_dev->status = status;
                        }
-                       USB_STOR_PRINTF(" error during command %02X"
-                                       " Stat = %lX\n", srb->cmd[0],
-                                       us->pusb_dev->status);
+                       debug(" error during command %02X" \
+                             " Stat = %lX\n", srb->cmd[0],
+                             us->pusb_dev->status);
                        return result;
                }
                /* transfer the data payload for this command, if one exists*/
 
-               USB_STOR_PRINTF("CB_transport: control msg returned %d,"
-                               " direction is %s to go 0x%lx\n", result,
-                               dir_in ? "IN" : "OUT", srb->datalen);
+               debug("CB_transport: control msg returned %d," \
+                     " direction is %s to go 0x%lx\n", result,
+                     dir_in ? "IN" : "OUT", srb->datalen);
                if (srb->datalen) {
                        result = us_one_transfer(us, pipe, (char *)srb->pdata,
                                                 srb->datalen);
-                       USB_STOR_PRINTF("CBI attempted to transfer data,"
-                                       " result is %d status %lX, len %d\n",
-                                       result, us->pusb_dev->status,
-                                       us->pusb_dev->act_len);
+                       debug("CBI attempted to transfer data," \
+                             " result is %d status %lX, len %d\n",
+                             result, us->pusb_dev->status,
+                               us->pusb_dev->act_len);
                        if (!(us->pusb_dev->status & USB_ST_NAK_REC))
                                break;
                } /* if (srb->datalen) */
@@ -635,10 +628,9 @@ static int usb_stor_CBI_get_status(ccb *srb, struct us_data *us)
                us->ip_wanted = 0;
                return USB_STOR_TRANSPORT_ERROR;
        }
-       USB_STOR_PRINTF
-               ("Got interrupt data 0x%x, transfered %d status 0x%lX\n",
-                us->ip_data, us->pusb_dev->irq_act_len,
-                us->pusb_dev->irq_status);
+       debug("Got interrupt data 0x%x, transfered %d status 0x%lX\n",
+             us->ip_data, us->pusb_dev->irq_act_len,
+             us->pusb_dev->irq_status);
        /* UFI gives us ASC and ASCQ, like a request sense */
        if (us->subclass == US_SC_UFI) {
                if (srb->cmd[0] == SCSI_REQ_SENSE ||
@@ -691,11 +683,11 @@ static int usb_stor_BBB_transport(ccb *srb, struct us_data *us)
        dir_in = US_DIRECTION(srb->cmd[0]);
 
        /* COMMAND phase */
-       USB_STOR_PRINTF("COMMAND phase\n");
+       debug("COMMAND phase\n");
        result = usb_stor_BBB_comdat(srb, us);
        if (result < 0) {
-               USB_STOR_PRINTF("failed to send CBW status %ld\n",
-                       us->pusb_dev->status);
+               debug("failed to send CBW status %ld\n",
+                     us->pusb_dev->status);
                usb_stor_BBB_reset(us);
                return USB_STOR_TRANSPORT_FAILED;
        }
@@ -708,7 +700,7 @@ static int usb_stor_BBB_transport(ccb *srb, struct us_data *us)
        /* no data, go immediately to the STATUS phase */
        if (srb->datalen == 0)
                goto st;
-       USB_STOR_PRINTF("DATA phase\n");
+       debug("DATA phase\n");
        if (dir_in)
                pipe = pipein;
        else
@@ -717,7 +709,7 @@ static int usb_stor_BBB_transport(ccb *srb, struct us_data *us)
                              &data_actlen, USB_CNTL_TIMEOUT * 5);
        /* special handling of STALL in DATA phase */
        if ((result < 0) && (us->pusb_dev->status & USB_ST_STALLED)) {
-               USB_STOR_PRINTF("DATA:stall\n");
+               debug("DATA:stall\n");
                /* clear the STALL on the endpoint */
                result = usb_stor_BBB_clear_endpt_stall(us,
                                        dir_in ? us->ep_in : us->ep_out);
@@ -726,8 +718,8 @@ static int usb_stor_BBB_transport(ccb *srb, struct us_data *us)
                        goto st;
        }
        if (result < 0) {
-               USB_STOR_PRINTF("usb_bulk_msg error status %ld\n",
-                       us->pusb_dev->status);
+               debug("usb_bulk_msg error status %ld\n",
+                     us->pusb_dev->status);
                usb_stor_BBB_reset(us);
                return USB_STOR_TRANSPORT_FAILED;
        }
@@ -740,14 +732,14 @@ static int usb_stor_BBB_transport(ccb *srb, struct us_data *us)
 st:
        retry = 0;
 again:
-       USB_STOR_PRINTF("STATUS phase\n");
+       debug("STATUS phase\n");
        result = usb_bulk_msg(us->pusb_dev, pipein, csw, UMASS_BBB_CSW_SIZE,
                                &actlen, USB_CNTL_TIMEOUT*5);
 
        /* special handling of STALL in STATUS phase */
        if ((result < 0) && (retry < 1) &&
            (us->pusb_dev->status & USB_ST_STALLED)) {
-               USB_STOR_PRINTF("STATUS:stall\n");
+               debug("STATUS:stall\n");
                /* clear the STALL on the endpoint */
                result = usb_stor_BBB_clear_endpt_stall(us, us->ep_in);
                if (result >= 0 && (retry++ < 1))
@@ -755,8 +747,8 @@ again:
                        goto again;
        }
        if (result < 0) {
-               USB_STOR_PRINTF("usb_bulk_msg error status %ld\n",
-                       us->pusb_dev->status);
+               debug("usb_bulk_msg error status %ld\n",
+                     us->pusb_dev->status);
                usb_stor_BBB_reset(us);
                return USB_STOR_TRANSPORT_FAILED;
        }
@@ -771,27 +763,27 @@ again:
        if (pipe == 0 && srb->datalen != 0 && srb->datalen - data_actlen != 0)
                pipe = srb->datalen - data_actlen;
        if (CSWSIGNATURE != le32_to_cpu(csw->dCSWSignature)) {
-               USB_STOR_PRINTF("!CSWSIGNATURE\n");
+               debug("!CSWSIGNATURE\n");
                usb_stor_BBB_reset(us);
                return USB_STOR_TRANSPORT_FAILED;
        } else if ((CBWTag - 1) != le32_to_cpu(csw->dCSWTag)) {
-               USB_STOR_PRINTF("!Tag\n");
+               debug("!Tag\n");
                usb_stor_BBB_reset(us);
                return USB_STOR_TRANSPORT_FAILED;
        } else if (csw->bCSWStatus > CSWSTATUS_PHASE) {
-               USB_STOR_PRINTF(">PHASE\n");
+               debug(">PHASE\n");
                usb_stor_BBB_reset(us);
                return USB_STOR_TRANSPORT_FAILED;
        } else if (csw->bCSWStatus == CSWSTATUS_PHASE) {
-               USB_STOR_PRINTF("=PHASE\n");
+               debug("=PHASE\n");
                usb_stor_BBB_reset(us);
                return USB_STOR_TRANSPORT_FAILED;
        } else if (data_actlen > srb->datalen) {
-               USB_STOR_PRINTF("transferred %dB instead of %ldB\n",
-                       data_actlen, srb->datalen);
+               debug("transferred %dB instead of %ldB\n",
+                     data_actlen, srb->datalen);
                return USB_STOR_TRANSPORT_FAILED;
        } else if (csw->bCSWStatus == CSWSTATUS_FAILED) {
-               USB_STOR_PRINTF("FAILED\n");
+               debug("FAILED\n");
                return USB_STOR_TRANSPORT_FAILED;
        }
 
@@ -812,14 +804,14 @@ static int usb_stor_CB_transport(ccb *srb, struct us_data *us)
        /* issue the command */
 do_retry:
        result = usb_stor_CB_comdat(srb, us);
-       USB_STOR_PRINTF("command / Data returned %d, status %lX\n",
-                       result, us->pusb_dev->status);
+       debug("command / Data returned %d, status %lX\n",
+             result, us->pusb_dev->status);
        /* if this is an CBI Protocol, get IRQ */
        if (us->protocol == US_PR_CBI) {
                status = usb_stor_CBI_get_status(srb, us);
                /* if the status is error, report it */
                if (status == USB_STOR_TRANSPORT_ERROR) {
-                       USB_STOR_PRINTF(" USB CBI Command Error\n");
+                       debug(" USB CBI Command Error\n");
                        return status;
                }
                srb->sense_buf[12] = (unsigned char)(us->ip_data >> 8);
@@ -827,7 +819,7 @@ do_retry:
                if (!us->ip_data) {
                        /* if the status is good, report it */
                        if (status == USB_STOR_TRANSPORT_GOOD) {
-                               USB_STOR_PRINTF(" USB CBI Command Good\n");
+                               debug(" USB CBI Command Good\n");
                                return status;
                        }
                }
@@ -835,7 +827,7 @@ do_retry:
        /* do we have to issue an auto request? */
        /* HERE we have to check the result */
        if ((result < 0) && !(us->pusb_dev->status & USB_ST_STALLED)) {
-               USB_STOR_PRINTF("ERROR %lX\n", us->pusb_dev->status);
+               debug("ERROR %lX\n", us->pusb_dev->status);
                us->transport_reset(us);
                return USB_STOR_TRANSPORT_ERROR;
        }
@@ -843,7 +835,7 @@ do_retry:
            ((srb->cmd[0] == SCSI_REQ_SENSE) ||
            (srb->cmd[0] == SCSI_INQUIRY))) {
                /* do not issue an autorequest after request sense */
-               USB_STOR_PRINTF("No auto request and good\n");
+               debug("No auto request and good\n");
                return USB_STOR_TRANSPORT_GOOD;
        }
        /* issue an request_sense */
@@ -856,19 +848,19 @@ do_retry:
        psrb->cmdlen = 12;
        /* issue the command */
        result = usb_stor_CB_comdat(psrb, us);
-       USB_STOR_PRINTF("auto request returned %d\n", result);
+       debug("auto request returned %d\n", result);
        /* if this is an CBI Protocol, get IRQ */
        if (us->protocol == US_PR_CBI)
                status = usb_stor_CBI_get_status(psrb, us);
 
        if ((result < 0) && !(us->pusb_dev->status & USB_ST_STALLED)) {
-               USB_STOR_PRINTF(" AUTO REQUEST ERROR %ld\n",
-                               us->pusb_dev->status);
+               debug(" AUTO REQUEST ERROR %ld\n",
+                     us->pusb_dev->status);
                return USB_STOR_TRANSPORT_ERROR;
        }
-       USB_STOR_PRINTF("autorequest returned 0x%02X 0x%02X 0x%02X 0x%02X\n",
-                       srb->sense_buf[0], srb->sense_buf[2],
-                       srb->sense_buf[12], srb->sense_buf[13]);
+       debug("autorequest returned 0x%02X 0x%02X 0x%02X 0x%02X\n",
+             srb->sense_buf[0], srb->sense_buf[2],
+             srb->sense_buf[12], srb->sense_buf[13]);
        /* Check the auto request result */
        if ((srb->sense_buf[2] == 0) &&
            (srb->sense_buf[12] == 0) &&
@@ -923,7 +915,7 @@ static int usb_inquiry(ccb *srb, struct us_data *ss)
                srb->datalen = 36;
                srb->cmdlen = 12;
                i = ss->transport(srb, ss);
-               USB_STOR_PRINTF("inquiry returns %d\n", i);
+               debug("inquiry returns %d\n", i);
                if (i == 0)
                        break;
        } while (--retry);
@@ -948,9 +940,9 @@ static int usb_request_sense(ccb *srb, struct us_data *ss)
        srb->pdata = &srb->sense_buf[0];
        srb->cmdlen = 12;
        ss->transport(srb, ss);
-       USB_STOR_PRINTF("Request Sense returned %02X %02X %02X\n",
-                       srb->sense_buf[2], srb->sense_buf[12],
-                       srb->sense_buf[13]);
+       debug("Request Sense returned %02X %02X %02X\n",
+             srb->sense_buf[2], srb->sense_buf[12],
+             srb->sense_buf[13]);
        srb->pdata = (uchar *)ptr;
        return 0;
 }
@@ -1017,7 +1009,7 @@ static int usb_read_10(ccb *srb, struct us_data *ss, unsigned long start,
        srb->cmd[7] = ((unsigned char) (blocks >> 8)) & 0xff;
        srb->cmd[8] = (unsigned char) blocks & 0xff;
        srb->cmdlen = 12;
-       USB_STOR_PRINTF("read10: start %lx blocks %x\n", start, blocks);
+       debug("read10: start %lx blocks %x\n", start, blocks);
        return ss->transport(srb, ss);
 }
 
@@ -1034,7 +1026,7 @@ static int usb_write_10(ccb *srb, struct us_data *ss, unsigned long start,
        srb->cmd[7] = ((unsigned char) (blocks >> 8)) & 0xff;
        srb->cmd[8] = (unsigned char) blocks & 0xff;
        srb->cmdlen = 12;
-       USB_STOR_PRINTF("write10: start %lx blocks %x\n", start, blocks);
+       debug("write10: start %lx blocks %x\n", start, blocks);
        return ss->transport(srb, ss);
 }
 
@@ -1078,7 +1070,7 @@ unsigned long usb_stor_read(int device, unsigned long blknr,
 
        device &= 0xff;
        /* Setup  device */
-       USB_STOR_PRINTF("\nusb_read: dev %d \n", device);
+       debug("\nusb_read: dev %d \n", device);
        dev = NULL;
        for (i = 0; i < USB_MAX_DEVICE; i++) {
                dev = usb_get_dev_index(i);
@@ -1095,8 +1087,8 @@ unsigned long usb_stor_read(int device, unsigned long blknr,
        start = blknr;
        blks = blkcnt;
 
-       USB_STOR_PRINTF("\nusb_read: dev %d startblk " LBAF ", blccnt " LBAF
-                       " buffer %lx\n", device, start, blks, buf_addr);
+       debug("\nusb_read: dev %d startblk " LBAF ", blccnt " LBAF
+             " buffer %lx\n", device, start, blks, buf_addr);
 
        do {
                /* XXX need some comment here */
@@ -1112,7 +1104,7 @@ retry_it:
                srb->datalen = usb_dev_desc[device].blksz * smallblks;
                srb->pdata = (unsigned char *)buf_addr;
                if (usb_read_10(srb, ss, start, smallblks)) {
-                       USB_STOR_PRINTF("Read ERROR\n");
+                       debug("Read ERROR\n");
                        usb_request_sense(srb, ss);
                        if (retry--)
                                goto retry_it;
@@ -1125,9 +1117,9 @@ retry_it:
        } while (blks != 0);
        ss->flags &= ~USB_READY;
 
-       USB_STOR_PRINTF("usb_read: end startblk " LBAF
-                       ", blccnt %x buffer %lx\n",
-                       start, smallblks, buf_addr);
+       debug("usb_read: end startblk " LBAF
+             ", blccnt %x buffer %lx\n",
+             start, smallblks, buf_addr);
 
        usb_disable_asynch(0); /* asynch transfer allowed */
        if (blkcnt >= USB_MAX_XFER_BLK)
@@ -1151,7 +1143,7 @@ unsigned long usb_stor_write(int device, unsigned long blknr,
 
        device &= 0xff;
        /* Setup  device */
-       USB_STOR_PRINTF("\nusb_write: dev %d \n", device);
+       debug("\nusb_write: dev %d \n", device);
        dev = NULL;
        for (i = 0; i < USB_MAX_DEVICE; i++) {
                dev = usb_get_dev_index(i);
@@ -1169,8 +1161,8 @@ unsigned long usb_stor_write(int device, unsigned long blknr,
        start = blknr;
        blks = blkcnt;
 
-       USB_STOR_PRINTF("\nusb_write: dev %d startblk " LBAF ", blccnt " LBAF
-                       " buffer %lx\n", device, start, blks, buf_addr);
+       debug("\nusb_write: dev %d startblk " LBAF ", blccnt " LBAF
+             " buffer %lx\n", device, start, blks, buf_addr);
 
        do {
                /* If write fails retry for max retry count else
@@ -1188,7 +1180,7 @@ retry_it:
                srb->datalen = usb_dev_desc[device].blksz * smallblks;
                srb->pdata = (unsigned char *)buf_addr;
                if (usb_write_10(srb, ss, start, smallblks)) {
-                       USB_STOR_PRINTF("Write ERROR\n");
+                       debug("Write ERROR\n");
                        usb_request_sense(srb, ss);
                        if (retry--)
                                goto retry_it;
@@ -1201,9 +1193,8 @@ retry_it:
        } while (blks != 0);
        ss->flags &= ~USB_READY;
 
-       USB_STOR_PRINTF("usb_write: end startblk " LBAF
-                       ", blccnt %x buffer %lx\n",
-                       start, smallblks, buf_addr);
+       debug("usb_write: end startblk " LBAF ", blccnt %x buffer %lx\n",
+             start, smallblks, buf_addr);
 
        usb_disable_asynch(0); /* asynch transfer allowed */
        if (blkcnt >= USB_MAX_XFER_BLK)
@@ -1218,6 +1209,7 @@ int usb_storage_probe(struct usb_device *dev, unsigned int ifnum,
 {
        struct usb_interface *iface;
        int i;
+       struct usb_endpoint_descriptor *ep_desc;
        unsigned int flags = 0;
 
        int protocol = 0;
@@ -1228,12 +1220,12 @@ int usb_storage_probe(struct usb_device *dev, unsigned int ifnum,
 
 #if 0
        /* this is the place to patch some storage devices */
-       USB_STOR_PRINTF("iVendor %X iProduct %X\n", dev->descriptor.idVendor,
+       debug("iVendor %X iProduct %X\n", dev->descriptor.idVendor,
                        dev->descriptor.idProduct);
 
        if ((dev->descriptor.idVendor) == 0x066b &&
            (dev->descriptor.idProduct) == 0x0103) {
-               USB_STOR_PRINTF("patched for E-USB\n");
+               debug("patched for E-USB\n");
                protocol = US_PR_CB;
                subclass = US_SC_UFI;       /* an assumption */
        }
@@ -1250,7 +1242,7 @@ int usb_storage_probe(struct usb_device *dev, unsigned int ifnum,
        memset(ss, 0, sizeof(struct us_data));
 
        /* At this point, we know we've got a live one */
-       USB_STOR_PRINTF("\n\nUSB Mass Storage device detected\n");
+       debug("\n\nUSB Mass Storage device detected\n");
 
        /* Initialize the us_data structure with some useful info */
        ss->flags = flags;
@@ -1270,21 +1262,21 @@ int usb_storage_probe(struct usb_device *dev, unsigned int ifnum,
        }
 
        /* set the handler pointers based on the protocol */
-       USB_STOR_PRINTF("Transport: ");
+       debug("Transport: ");
        switch (ss->protocol) {
        case US_PR_CB:
-               USB_STOR_PRINTF("Control/Bulk\n");
+               debug("Control/Bulk\n");
                ss->transport = usb_stor_CB_transport;
                ss->transport_reset = usb_stor_CB_reset;
                break;
 
        case US_PR_CBI:
-               USB_STOR_PRINTF("Control/Bulk/Interrupt\n");
+               debug("Control/Bulk/Interrupt\n");
                ss->transport = usb_stor_CB_transport;
                ss->transport_reset = usb_stor_CB_reset;
                break;
        case US_PR_BULK:
-               USB_STOR_PRINTF("Bulk/Bulk/Bulk\n");
+               debug("Bulk/Bulk/Bulk\n");
                ss->transport = usb_stor_BBB_transport;
                ss->transport_reset = usb_stor_BBB_reset;
                break;
@@ -1300,34 +1292,35 @@ int usb_storage_probe(struct usb_device *dev, unsigned int ifnum,
         * We will ignore any others.
         */
        for (i = 0; i < iface->desc.bNumEndpoints; i++) {
+               ep_desc = &iface->ep_desc[i];
                /* is it an BULK endpoint? */
-               if ((iface->ep_desc[i].bmAttributes &
+               if ((ep_desc->bmAttributes &
                     USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK) {
-                       if (iface->ep_desc[i].bEndpointAddress & USB_DIR_IN)
-                               ss->ep_in = iface->ep_desc[i].bEndpointAddress &
-                                       USB_ENDPOINT_NUMBER_MASK;
+                       if (ep_desc->bEndpointAddress & USB_DIR_IN)
+                               ss->ep_in = ep_desc->bEndpointAddress &
+                                               USB_ENDPOINT_NUMBER_MASK;
                        else
                                ss->ep_out =
-                                       iface->ep_desc[i].bEndpointAddress &
+                                       ep_desc->bEndpointAddress &
                                        USB_ENDPOINT_NUMBER_MASK;
                }
 
                /* is it an interrupt endpoint? */
-               if ((iface->ep_desc[i].bmAttributes &
-                   USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT) {
-                       ss->ep_int = iface->ep_desc[i].bEndpointAddress &
-                               USB_ENDPOINT_NUMBER_MASK;
-                       ss->irqinterval = iface->ep_desc[i].bInterval;
+               if ((ep_desc->bmAttributes &
+                    USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT) {
+                       ss->ep_int = ep_desc->bEndpointAddress &
+                                               USB_ENDPOINT_NUMBER_MASK;
+                       ss->irqinterval = ep_desc->bInterval;
                }
        }
-       USB_STOR_PRINTF("Endpoints In %d Out %d Int %d\n",
-                 ss->ep_in, ss->ep_out, ss->ep_int);
+       debug("Endpoints In %d Out %d Int %d\n",
+             ss->ep_in, ss->ep_out, ss->ep_int);
 
        /* Do some basic sanity checks, and bail if we find a problem */
        if (usb_set_interface(dev, iface->desc.bInterfaceNumber, 0) ||
            !ss->ep_in || !ss->ep_out ||
            (ss->protocol == US_PR_CBI && ss->ep_int == 0)) {
-               USB_STOR_PRINTF("Problems with device\n");
+               debug("Problems with device\n");
                return 0;
        }
        /* set class specific stuff */
@@ -1366,7 +1359,7 @@ int usb_stor_get_info(struct usb_device *dev, struct us_data *ss,
 
        dev_desc->target = dev->devnum;
        pccb->lun = dev_desc->lun;
-       USB_STOR_PRINTF(" address %d\n", dev_desc->target);
+       debug(" address %d\n", dev_desc->target);
 
        if (usb_inquiry(pccb, ss))
                return -1;
@@ -1392,8 +1385,8 @@ int usb_stor_get_info(struct usb_device *dev, struct us_data *ss,
        usb_bin_fixup(dev->descriptor, (uchar *)dev_desc->vendor,
                      (uchar *)dev_desc->product);
 #endif /* CONFIG_USB_BIN_FIXUP */
-       USB_STOR_PRINTF("ISO Vers %X, Response Data %X\n", usb_stor_buf[2],
-                       usb_stor_buf[3]);
+       debug("ISO Vers %X, Response Data %X\n", usb_stor_buf[2],
+             usb_stor_buf[3]);
        if (usb_test_unit_ready(pccb, ss)) {
                printf("Device NOT ready\n"
                       "   Request Sense returned %02X %02X %02X\n",
@@ -1413,8 +1406,7 @@ int usb_stor_get_info(struct usb_device *dev, struct us_data *ss,
                cap[1] = 0x200;
        }
        ss->flags &= ~USB_READY;
-       USB_STOR_PRINTF("Read Capacity returns: 0x%lx, 0x%lx\n", cap[0],
-                       cap[1]);
+       debug("Read Capacity returns: 0x%lx, 0x%lx\n", cap[0], cap[1]);
 #if 0
        if (cap[0] > (0x200000 * 10)) /* greater than 10 GByte */
                cap[0] >>= 16;
@@ -1426,17 +1418,16 @@ int usb_stor_get_info(struct usb_device *dev, struct us_data *ss,
        cap[0] += 1;
        capacity = &cap[0];
        blksz = &cap[1];
-       USB_STOR_PRINTF("Capacity = 0x%lx, blocksz = 0x%lx\n",
-                       *capacity, *blksz);
+       debug("Capacity = 0x%lx, blocksz = 0x%lx\n", *capacity, *blksz);
        dev_desc->lba = *capacity;
        dev_desc->blksz = *blksz;
        dev_desc->log2blksz = LOG2(dev_desc->blksz);
        dev_desc->type = perq;
-       USB_STOR_PRINTF(" address %d\n", dev_desc->target);
-       USB_STOR_PRINTF("partype: %d\n", dev_desc->part_type);
+       debug(" address %d\n", dev_desc->target);
+       debug("partype: %d\n", dev_desc->part_type);
 
        init_part(dev_desc);
 
-       USB_STOR_PRINTF("partype: %d\n", dev_desc->part_type);
+       debug("partype: %d\n", dev_desc->part_type);
        return 1;
 }
index c816878..e0f3e4b 100644 (file)
@@ -122,6 +122,31 @@ static struct descriptor {
 #define ehci_is_TDI()  (0)
 #endif
 
+int __ehci_get_port_speed(struct ehci_hcor *hcor, uint32_t reg)
+{
+       return PORTSC_PSPD(reg);
+}
+
+int ehci_get_port_speed(struct ehci_hcor *hcor, uint32_t reg)
+       __attribute__((weak, alias("__ehci_get_port_speed")));
+
+void __ehci_set_usbmode(int index)
+{
+       uint32_t tmp;
+       uint32_t *reg_ptr;
+
+       reg_ptr = (uint32_t *)((u8 *)&ehcic[index].hcor->or_usbcmd + USBMODE);
+       tmp = ehci_readl(reg_ptr);
+       tmp |= USBMODE_CM_HC;
+#if defined(CONFIG_EHCI_MMIO_BIG_ENDIAN)
+       tmp |= USBMODE_BE;
+#endif
+       ehci_writel(reg_ptr, tmp);
+}
+
+void ehci_set_usbmode(int index)
+       __attribute__((weak, alias("__ehci_set_usbmode")));
+
 void __ehci_powerup_fixup(uint32_t *status_reg, uint32_t *reg)
 {
        mdelay(50);
@@ -149,8 +174,6 @@ static int handshake(uint32_t *ptr, uint32_t mask, uint32_t done, int usec)
 static int ehci_reset(int index)
 {
        uint32_t cmd;
-       uint32_t tmp;
-       uint32_t *reg_ptr;
        int ret = 0;
 
        cmd = ehci_readl(&ehcic[index].hcor->or_usbcmd);
@@ -163,15 +186,8 @@ static int ehci_reset(int index)
                goto out;
        }
 
-       if (ehci_is_TDI()) {
-               reg_ptr = (uint32_t *)((u8 *)ehcic[index].hcor + USBMODE);
-               tmp = ehci_readl(reg_ptr);
-               tmp |= USBMODE_CM_HC;
-#if defined(CONFIG_EHCI_MMIO_BIG_ENDIAN)
-               tmp |= USBMODE_BE;
-#endif
-               ehci_writel(reg_ptr, tmp);
-       }
+       if (ehci_is_TDI())
+               ehci_set_usbmode(index);
 
 #ifdef CONFIG_USB_EHCI_TXFIFO_THRESH
        cmd = ehci_readl(&ehcic[index].hcor->or_txfilltuning);
@@ -587,16 +603,6 @@ fail:
        return -1;
 }
 
-static inline int min3(int a, int b, int c)
-{
-
-       if (b < a)
-               a = b;
-       if (c < a)
-               a = c;
-       return a;
-}
-
 int
 ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
                 int length, struct devrequest *req)
@@ -607,15 +613,14 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
        int len, srclen;
        uint32_t reg;
        uint32_t *status_reg;
+       int port = le16_to_cpu(req->index) & 0xff;
        struct ehci_ctrl *ctrl = dev->controller;
 
-       if (le16_to_cpu(req->index) > CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS) {
-               printf("The request port(%d) is not configured\n",
-                       le16_to_cpu(req->index) - 1);
+       if (port > CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS) {
+               printf("The request port(%d) is not configured\n", port - 1);
                return -1;
        }
-       status_reg = (uint32_t *)&ctrl->hcor->or_portsc[
-                                               le16_to_cpu(req->index) - 1];
+       status_reg = (uint32_t *)&ctrl->hcor->or_portsc[port - 1];
        srclen = 0;
 
        debug("req=%u (%#x), type=%u (%#x), value=%u, index=%u\n",
@@ -711,7 +716,7 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
                        tmpbuf[1] |= USB_PORT_STAT_POWER >> 8;
 
                if (ehci_is_TDI()) {
-                       switch (PORTSC_PSPD(reg)) {
+                       switch (ehci_get_port_speed(ctrl->hcor, reg)) {
                        case PORTSC_PSPD_FS:
                                break;
                        case PORTSC_PSPD_LS:
@@ -732,7 +737,7 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
                        tmpbuf[2] |= USB_PORT_STAT_C_ENABLE;
                if (reg & EHCI_PS_OCC)
                        tmpbuf[2] |= USB_PORT_STAT_C_OVERCURRENT;
-               if (ctrl->portreset & (1 << le16_to_cpu(req->index)))
+               if (ctrl->portreset & (1 << port))
                        tmpbuf[2] |= USB_PORT_STAT_C_RESET;
 
                srcptr = tmpbuf;
@@ -758,7 +763,7 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
                            EHCI_PS_IS_LOWSPEED(reg)) {
                                /* Low speed device, give up ownership. */
                                debug("port %d low speed --> companion\n",
-                                     req->index - 1);
+                                     port - 1);
                                reg |= EHCI_PS_PO;
                                ehci_writel(status_reg, reg);
                                break;
@@ -784,13 +789,17 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
                                ret = handshake(status_reg, EHCI_PS_PR, 0,
                                                2 * 1000);
                                if (!ret)
-                                       ctrl->portreset |=
-                                               1 << le16_to_cpu(req->index);
+                                       ctrl->portreset |= 1 << port;
                                else
                                        printf("port(%d) reset error\n",
-                                       le16_to_cpu(req->index) - 1);
+                                              port - 1);
                        }
                        break;
+               case USB_PORT_FEAT_TEST:
+                       reg &= ~(0xf << 16);
+                       reg |= ((le16_to_cpu(req->index) >> 8) & 0xf) << 16;
+                       ehci_writel(status_reg, reg);
+                       break;
                default:
                        debug("unknown feature %x\n", le16_to_cpu(req->value));
                        goto unknown;
@@ -817,7 +826,7 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
                        reg = (reg & ~EHCI_PS_CLEAR) | EHCI_PS_OCC;
                        break;
                case USB_PORT_FEAT_C_RESET:
-                       ctrl->portreset &= ~(1 << le16_to_cpu(req->index));
+                       ctrl->portreset &= ~(1 << port);
                        break;
                default:
                        debug("unknown feature %x\n", le16_to_cpu(req->value));
index efd711d..aa5cf57 100644 (file)
@@ -55,7 +55,7 @@ int usb_cpu_init(void)
 
        /* Enable USB host clock. */
        writel(1 << ATMEL_ID_UHP, &pmc->pcer);
-#ifdef CONFIG_AT91SAM9261
+#if defined(CONFIG_AT91SAM9261) || defined(CONFIG_AT91SAM9G10)
        writel(ATMEL_PMC_UHP | AT91_PMC_HCK0, &pmc->scer);
 #else
        writel(ATMEL_PMC_UHP, &pmc->scer);
@@ -70,7 +70,7 @@ int usb_cpu_stop(void)
 
        /* Disable USB host clock. */
        writel(1 << ATMEL_ID_UHP, &pmc->pcdr);
-#ifdef CONFIG_AT91SAM9261
+#if defined(CONFIG_AT91SAM9261) || defined(CONFIG_AT91SAM9G10)
        writel(ATMEL_PMC_UHP | AT91_PMC_HCK0, &pmc->scdr);
 #else
        writel(ATMEL_PMC_UHP, &pmc->scdr);
index 8a1f3e4..40e4b07 100644 (file)
@@ -199,18 +199,35 @@ typedef void (interrupt_handler_t)(void *);
  * General Purpose Utilities
  */
 #define min(X, Y)                              \
-       ({ typeof (X) __x = (X);                \
-               typeof (Y) __y = (Y);           \
+       ({ typeof(X) __x = (X);                 \
+               typeof(Y) __y = (Y);            \
                (__x < __y) ? __x : __y; })
 
 #define max(X, Y)                              \
-       ({ typeof (X) __x = (X);                \
-               typeof (Y) __y = (Y);           \
+       ({ typeof(X) __x = (X);                 \
+               typeof(Y) __y = (Y);            \
                (__x > __y) ? __x : __y; })
 
 #define MIN(x, y)  min(x, y)
 #define MAX(x, y)  max(x, y)
 
+#define min3(X, Y, Z)                          \
+       ({ typeof(X) __x = (X);                 \
+               typeof(Y) __y = (Y);            \
+               typeof(Z) __z = (Z);            \
+               __x < __y ? (__x < __z ? __x : __z) :   \
+               (__y < __z ? __y : __z); })
+
+#define max3(X, Y, Z)                          \
+       ({ typeof(X) __x = (X);                 \
+               typeof(Y) __y = (Y);            \
+               typeof(Z) __z = (Z);            \
+               __x > __y ? (__x > __z ? __x : __z) :   \
+               (__y > __z ? __y : __z); })
+
+#define MIN3(x, y, z)  min3(x, y, z)
+#define MAX3(x, y, z)  max3(x, y, z)
+
 /*
  * Return the absolute value of a number.
  *
index d79c865..d7b082d 100644 (file)
@@ -76,6 +76,12 @@ struct usb_interface {
        unsigned char   act_altsetting;
 
        struct usb_endpoint_descriptor ep_desc[USB_MAXENDPOINTS];
+       /*
+        * Super Speed Device will have Super Speed Endpoint
+        * Companion Descriptor  (section 9.6.7 of usb 3.0 spec)
+        * Revision 1.0 June 6th 2011
+        */
+       struct usb_ss_ep_comp_descriptor ss_ep_comp_desc[USB_MAXENDPOINTS];
 } __attribute__ ((packed));
 
 /* Configuration information.. */
index 9502544..4f3601a 100644 (file)
 #define USB_REQ_SET_IDLE            0x0A
 #define USB_REQ_SET_PROTOCOL        0x0B
 
+/* Device features */
+#define USB_FEAT_HALT               0x00
+#define USB_FEAT_WAKEUP             0x01
+#define USB_FEAT_TEST               0x02
+
+/* Test modes */
+#define USB_TEST_MODE_J             0x01
+#define USB_TEST_MODE_K             0x02
+#define USB_TEST_MODE_SE0_NAK       0x03
+#define USB_TEST_MODE_PACKET        0x04
+#define USB_TEST_MODE_FORCE_ENABLE  0x05
+
 
 /* "pipe" definitions */
 
 #define USB_PORT_FEAT_C_SUSPEND      18
 #define USB_PORT_FEAT_C_OVER_CURRENT 19
 #define USB_PORT_FEAT_C_RESET        20
+#define USB_PORT_FEAT_TEST           21
+
+/*
+ * Changes to Port feature numbers for Super speed,
+ * from USB 3.0 spec Table 10-8
+ */
+#define USB_SS_PORT_FEAT_U1_TIMEOUT    23
+#define USB_SS_PORT_FEAT_U2_TIMEOUT    24
+#define USB_SS_PORT_FEAT_C_LINK_STATE  25
+#define USB_SS_PORT_FEAT_C_CONFIG_ERROR        26
+#define USB_SS_PORT_FEAT_BH_RESET      28
+#define USB_SS_PORT_FEAT_C_BH_RESET    29
 
 /* wPortStatus bits */
 #define USB_PORT_STAT_CONNECTION    0x0001
 #define USB_PORT_STAT_POWER         0x0100
 #define USB_PORT_STAT_LOW_SPEED     0x0200
 #define USB_PORT_STAT_HIGH_SPEED    0x0400     /* support for EHCI */
-#define USB_PORT_STAT_SPEED    \
+#define USB_PORT_STAT_SUPER_SPEED   0x0600     /* faking support to XHCI */
+#define USB_PORT_STAT_SPEED_MASK       \
        (USB_PORT_STAT_LOW_SPEED | USB_PORT_STAT_HIGH_SPEED)
 
+/*
+ * Changes to wPortStatus bit field in USB 3.0
+ * See USB 3.0 spec Table 10-11
+ */
+#define USB_SS_PORT_STAT_LINK_STATE    0x01e0
+#define USB_SS_PORT_STAT_POWER         0x0200
+#define USB_SS_PORT_STAT_SPEED         0x1c00
+#define USB_SS_PORT_STAT_SPEED_5GBPS   0x0000
+
 /* wPortChange bits */
 #define USB_PORT_STAT_C_CONNECTION  0x0001
 #define USB_PORT_STAT_C_ENABLE      0x0002
 #define USB_PORT_STAT_C_OVERCURRENT 0x0008
 #define USB_PORT_STAT_C_RESET       0x0010
 
+/*
+ * Changes to wPortChange bit fields in USB 3.0
+ * See USB 3.0 spec Table 10-12
+ */
+#define USB_SS_PORT_STAT_C_BH_RESET    0x0020
+#define USB_SS_PORT_STAT_C_LINK_STATE  0x0040
+#define USB_SS_PORT_STAT_C_CONFIG_ERROR        0x0080
+
 /* wHubCharacteristics (masks) */
 #define HUB_CHAR_LPSM               0x0003
 #define HUB_CHAR_COMPOUND           0x0004
 #define HUB_CHAR_OCPM               0x0018
 
 /*
- *Hub Status & Hub Change bit masks
+ * Hub Status & Hub Change bit masks
  */
 #define HUB_STATUS_LOCAL_POWER 0x0001
 #define HUB_STATUS_OVERCURRENT 0x0002