if (timeout == 0)
                return (int)size;
 
-       while (timeout--) {
-               if (!((volatile unsigned long)dev->status & USB_ST_NOT_PROC))
-                       break;
-               wait_ms(1);
-       }
-       if (dev->status == 0)
-               return dev->act_len;
-       else
+       if (dev->status != 0) {
+               /*
+                * Let's wait a while for the timeout to elapse.
+                * It has no real use, but it keeps the interface happy.
+                */
+               wait_ms(timeout);
                return -1;
+       }
+
+       return dev->act_len;
 }
 
 /*-------------------------------------------------------------------
 
 
        config = (struct usb_config_descriptor *)&buffer[0];
-       result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, 8);
-       if (result < 8) {
+       result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, 9);
+       if (result < 9) {
                if (result < 0)
                        printf("unable to get descriptor, error %lX\n",
                                dev->status);
                else
                        printf("config descriptor too short " \
-                               "(expected %i, got %i)\n", 8, result);
+                               "(expected %i, got %i)\n", 9, result);
                return -1;
        }
        tmp = le16_to_cpu(config->wTotalLength);
         * Several USB stick devices report ERR: CTL_TIMEOUT, caused by an
         * invalid header while reading 8 bytes as device descriptor. */
        dev->descriptor.bMaxPacketSize0 = 8;        /* Start off at 8 bytes  */
-       dev->maxpacketsize = 0;         /* Default to 8 byte max packet size */
+       dev->maxpacketsize = PACKET_SIZE_8;
        dev->epmaxpacketin [0] = 8;
        dev->epmaxpacketout[0] = 8;
 
                return 1;
        }
 #else
-       /* this is a Windows scheme of initialization sequence, with double
-        * reset of the device (Linux uses the same sequence, but without double
-        * reset. This double reset is not considered harmful and matches the
-        * Windows behaviour)
+       /* This is a Windows scheme of initialization sequence, with double
+        * reset of the device (Linux uses the same sequence)
         * Some equipment is said to work only with such init sequence; this
         * patch is based on the work by Alan Stern:
         * http://sourceforge.net/mailarchive/forum.php?thread_id=5729457&forum_id=5398
         */
-       int j;
        struct usb_device_descriptor *desc;
        int port = -1;
        struct usb_device *parent = dev->parent;
 
        desc = (struct usb_device_descriptor *)tmpbuf;
        dev->descriptor.bMaxPacketSize0 = 64;       /* Start off at 64 bytes  */
-       dev->maxpacketsize = 64;        /* Default to 64 byte max packet size */
+       /* Default to 64 byte max packet size */
+       dev->maxpacketsize = PACKET_SIZE_64;
        dev->epmaxpacketin [0] = 64;
        dev->epmaxpacketout[0] = 64;
-       for (j = 0; j < 3; ++j) {
-               err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, 64);
-               if (err < 0) {
-                       USB_PRINTF("usb_new_device: 64 byte descr\n");
-                       break;
-               }
+
+       err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, 64);
+       if (err < 0) {
+               USB_PRINTF("usb_new_device: usb_get_descriptor() failed\n");
+               return 1;
        }
+
        dev->descriptor.bMaxPacketSize0 = desc->bMaxPacketSize0;
 
        /* find the port number we're at */
        if (parent) {
+               int j;
 
                for (j = 0; j < parent->maxchild; j++) {
                        if (parent->children[j] == dev) {
        dev->epmaxpacketin [0] = dev->descriptor.bMaxPacketSize0;
        dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;
        switch (dev->descriptor.bMaxPacketSize0) {
-       case 8: dev->maxpacketsize = 0; break;
-       case 16: dev->maxpacketsize = 1; break;
-       case 32: dev->maxpacketsize = 2; break;
-       case 64: dev->maxpacketsize = 3; break;
+       case 8: dev->maxpacketsize  = PACKET_SIZE_8; break;
+       case 16: dev->maxpacketsize = PACKET_SIZE_16; break;
+       case 32: dev->maxpacketsize = PACKET_SIZE_32; break;
+       case 64: dev->maxpacketsize = PACKET_SIZE_64; break;
        }
        dev->devnum = addr;
 
 
        td->index = index;
        td->data = (__u32)data;
 #ifdef OHCI_FILL_TRACE
-       if ((usb_pipetype(urb_priv->pipe) == PIPE_BULK) &&
-                                               usb_pipeout(urb_priv->pipe)) {
+       if (usb_pipebulk(urb_priv->pipe) && usb_pipeout(urb_priv->pipe)) {
                for (i = 0; i < len; i++)
                printf("td->data[%d] %#2x ", i, ((unsigned char *)td->data)[i]);
                printf("\n");
        tdBE   = m32_swap(td->hwBE);
        tdCBP  = m32_swap(td->hwCBP);
 
-       if (!(usb_pipetype(lurb_priv->pipe) == PIPE_CONTROL &&
+       if (!(usb_pipecontrol(lurb_priv->pipe) &&
            ((td->index == 0) || (td->index == lurb_priv->length - 1)))) {
                if (tdBE != 0) {
                        if (td->hwCBP == 0)
        dbg("dl_done_list: processing TD %x, len %x\n",
                lurb_priv->td_cnt, lurb_priv->length);
 
-       if (ed->state != ED_NEW &&
-               (usb_pipetype(lurb_priv->pipe) != PIPE_INTERRUPT)) {
+       if (ed->state != ED_NEW && (!usb_pipeint(lurb_priv->pipe))) {
                edHeadP = m32_swap(ed->hwHeadP) & 0xfffffff0;
                edTailP = m32_swap(ed->hwTailP);
 
 #else
        wait_ms(1);
 #endif
-       if ((pipe & PIPE_INTERRUPT) == PIPE_INTERRUPT) {
+       if (usb_pipeint(pipe)) {
                info("Root-Hub submit IRQ: NOT implemented");
                return 0;
        }
 
        /* allow more time for a BULK device to react - some are slow */
 #define BULK_TO         5000   /* timeout in milliseconds */
-       if (usb_pipetype(pipe) == PIPE_BULK)
+       if (usb_pipebulk(pipe))
                timeout = BULK_TO;
        else
                timeout = 100;
 #endif
 
        /* free TDs in urb_priv */
-       if (usb_pipetype(pipe) != PIPE_INTERRUPT)
+       if (!usb_pipeint(pipe))
                urb_free_priv(urb);
        return 0;
 }
 
        struct usb_interface_descriptor if_desc[USB_MAXINTERFACES];
 } __attribute__ ((packed));
 
+enum {
+       /* Maximum packet size; encoded as 0,1,2,3 = 8,16,32,64 */
+       PACKET_SIZE_8   = 0,
+       PACKET_SIZE_16  = 1,
+       PACKET_SIZE_32  = 2,
+       PACKET_SIZE_64  = 3,
+};
 
 struct usb_device {
        int devnum;                     /* Device number on USB bus */
        char prod[32];                  /* product */
        char serial[32];                /* serial number */
 
-       int maxpacketsize;              /* Maximum packet size; encoded as 0,1,2,3 = 8,16,32,64 */
-       unsigned int toggle[2];         /* one bit for each endpoint ([0] = IN, [1] = OUT) */
-       unsigned int halted[2];         /* endpoint halts; one bit per endpoint # & direction; */
+       /* Maximum packet size; one of: PACKET_SIZE_* */
+       int maxpacketsize;
+       /* one bit for each endpoint ([0] = IN, [1] = OUT) */
+       unsigned int toggle[2];
+       /* endpoint halts; one bit per endpoint # & direction; */
+       unsigned int halted[2];
                            /* [0] = IN, [1] = OUT */
        int epmaxpacketin[16];          /* INput endpoint specific maximums */
        int epmaxpacketout[16];         /* OUTput endpoint specific maximums */