USB: EHCI: use consistent NO_FRAME value
authorAlan Stern <stern@rowland.harvard.edu>
Fri, 11 Oct 2013 15:28:52 +0000 (11:28 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 11 Oct 2013 23:40:26 +0000 (16:40 -0700)
ehci-hcd is inconsistent in the sentinel values it uses to indicate
that no frame number has been assigned for a periodic transfer.  Some
places it uses NO_FRAME (defined as 65535), other places it uses -1,
and elsewhere it uses 9999.

This patch defines a value for NO_FRAME which can fit in a 16-bit
signed integer, and changes the code to use it everywhere.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/ehci-sched.c
drivers/usb/host/ehci.h

index 1fc2befc4fdc1d6d8a82b045702b8e9678bb656d..37e97a70894a0dd855759c7f718ff6fb8e4286fb 100644 (file)
@@ -813,7 +813,7 @@ static int qh_schedule(struct ehci_hcd *ehci, struct ehci_qh *qh)
        frame = qh->start;
 
        /* reuse the previous schedule slots, if we can */
-       if (frame < qh->period) {
+       if (frame != NO_FRAME) {
                uframe = ffs(hc32_to_cpup(ehci, &hw->hw_info2) & QH_SMASK);
                status = check_intr_schedule (ehci, frame, --uframe,
                                qh, &c_mask);
@@ -969,7 +969,7 @@ iso_stream_alloc (gfp_t mem_flags)
        if (likely (stream != NULL)) {
                INIT_LIST_HEAD(&stream->td_list);
                INIT_LIST_HEAD(&stream->free_list);
-               stream->next_uframe = -1;
+               stream->next_uframe = NO_FRAME;
        }
        return stream;
 }
@@ -1236,7 +1236,7 @@ itd_urb_transaction (
 
                memset (itd, 0, sizeof *itd);
                itd->itd_dma = itd_dma;
-               itd->frame = 9999;              /* an invalid value */
+               itd->frame = NO_FRAME;
                list_add (&itd->itd_list, &sched->td_list);
        }
        spin_unlock_irqrestore (&ehci->lock, flags);
@@ -1967,7 +1967,7 @@ sitd_urb_transaction (
 
                memset (sitd, 0, sizeof *sitd);
                sitd->sitd_dma = sitd_dma;
-               sitd->frame = 9999;             /* an invalid value */
+               sitd->frame = NO_FRAME;
                list_add (&sitd->sitd_list, &iso_sched->td_list);
        }
 
index 2d401927e143ff72090bde39ba333b94729d6896..b93eb59bb52922f33ae8818e81f99d99339b4d71 100644 (file)
@@ -54,6 +54,8 @@ struct ehci_stats {
        unsigned long           unlink;
 };
 
+#define NO_FRAME       29999                   /* frame not assigned yet */
+
 /* ehci_hcd->lock guards shared data against other CPUs:
  *   ehci_hcd: async, unlink, periodic (and shadow), ...
  *   usb_host_endpoint: hcpriv
@@ -405,7 +407,6 @@ struct ehci_qh {
        u16                     tt_usecs;       /* tt downstream bandwidth */
        unsigned short          period;         /* polling interval */
        unsigned short          start;          /* where polling starts */
-#define NO_FRAME ((unsigned short)~0)                  /* pick new start */
 
        struct usb_device       *dev;           /* access to TT */
        unsigned                is_out:1;       /* bulk or intr OUT */
@@ -454,7 +455,7 @@ struct ehci_iso_stream {
        struct usb_host_endpoint *ep;
 
        /* output of (re)scheduling */
-       int                     next_uframe;
+       unsigned                next_uframe;
        __hc32                  splits;
 
        /* the rest is derived from the endpoint descriptor,