USB: Spelling fixes
[firefly-linux-kernel-4.4.55.git] / drivers / usb / host / ehci-sched.c
index d4a8ace496769308338bce8e081511d80032e1d6..dce305bd62a52b92848d5333033d15829b39d282 100644 (file)
@@ -211,7 +211,7 @@ static inline void carryover_tt_bandwidth(unsigned short tt_usecs[8])
  * low/fullspeed transfer can "carry over" from one uframe to the next,
  * since the TT just performs downstream transfers in sequence.
  *
- * For example two seperate 100 usec transfers can start in the same uframe,
+ * For example two separate 100 usec transfers can start in the same uframe,
  * and the second one would "carry over" 75 usecs into the next uframe.
  */
 static void
@@ -479,109 +479,6 @@ static int disable_periodic (struct ehci_hcd *ehci)
 }
 
 /*-------------------------------------------------------------------------*/
-#ifdef CONFIG_CPU_FREQ
-
-static int safe_to_modify_i (struct ehci_hcd *ehci, struct ehci_qh *qh)
-{
-       int now; /* current (frame * 8) + uframe */
-       int prev_start, next_start; /* uframes from/to split start */
-       int start_uframe = ffs(le32_to_cpup (&qh->hw_info2) & QH_SMASK);
-       int end_uframe = fls((le32_to_cpup (&qh->hw_info2) & QH_CMASK) >> 8);
-       int split_duration = end_uframe - start_uframe;
-
-       now = readl(&ehci->regs->frame_index) % (ehci->periodic_size << 3);
-
-       next_start = ((1024 << 3) + (qh->start << 3) + start_uframe - now)
-                       % (qh->period << 3);
-       prev_start = (qh->period << 3) - next_start;
-
-       /*
-        * Make sure there will be at least one uframe when qh is safe.
-        */
-       if ((qh->period << 3) <= (ehci->i_thresh + 2 + split_duration))
-               /* never safe */
-               return -EINVAL;
-
-       /*
-        * Wait 1 uframe after transaction should have started, to make
-        * sure controller has time to write back overlay, so we can
-        * check QTD_STS_STS to see if transaction is in progress.
-        */
-       if ((next_start > ehci->i_thresh) && (prev_start > 1))
-               /* safe to set "i" bit if split isn't in progress */
-               return (qh->hw_token & STATUS_BIT(ehci)) ? 0 : 1;
-       else
-               return 0;
-}
-
-/* Set inactivate bit for all the split interrupt QHs. */
-static void qh_inactivate_split_intr_qhs (struct ehci_hcd *ehci)
-{
-       struct ehci_qh  *qh;
-       int             not_done, safe;
-       u32             inactivate = INACTIVATE_BIT(ehci);
-       u32             active = ACTIVE_BIT(ehci);
-
-       do {
-               not_done = 0;
-               list_for_each_entry(qh, &ehci->split_intr_qhs,
-                               split_intr_qhs) {
-                       if (qh->hw_info1 & inactivate)
-                               /* already off */
-                               continue;
-                       /*
-                        * To avoid setting "I" after the start split happens,
-                        * don't set it if the QH might be cached in the
-                        * controller.  Some HCs (Broadcom/ServerWorks HT1000)
-                        * will stop in the middle of a split transaction when
-                        * the "I" bit is set.
-                        */
-                       safe = safe_to_modify_i(ehci, qh);
-                       if (safe == 0) {
-                               not_done = 1;
-                       } else if (safe > 0) {
-                               qh->was_active = qh->hw_token & active;
-                               qh->hw_info1 |= inactivate;
-                       }
-               }
-       } while (not_done);
-       wmb();
-}
-
-static void qh_reactivate_split_intr_qhs (struct ehci_hcd *ehci)
-{
-       struct ehci_qh  *qh;
-       u32             token;
-       int             not_done, safe;
-       u32             inactivate = INACTIVATE_BIT(ehci);
-       u32             active = ACTIVE_BIT(ehci);
-       u32             halt = HALT_BIT(ehci);
-
-       do {
-               not_done = 0;
-               list_for_each_entry(qh, &ehci->split_intr_qhs, split_intr_qhs) {
-                       if (!(qh->hw_info1 & inactivate)) /* already on */
-                               continue;
-                       /*
-                        * Don't reactivate if cached, or controller might
-                        * overwrite overlay after we modify it!
-                        */
-                       safe = safe_to_modify_i(ehci, qh);
-                       if (safe == 0) {
-                               not_done = 1;
-                       } else if (safe > 0) {
-                               /* See EHCI 1.0 section 4.15.2.4. */
-                               token = qh->hw_token;
-                               qh->hw_token = (token | halt) & ~active;
-                               wmb();
-                               qh->hw_info1 &= ~inactivate;
-                               wmb();
-                               qh->hw_token = (token & ~halt) | qh->was_active;
-                       }
-               }
-       } while (not_done);
-}
-#endif
 
 /* periodic schedule slots have iso tds (normal or split) first, then a
  * sparse tree for active interrupt transfers.
@@ -599,17 +496,6 @@ static int qh_link_periodic (struct ehci_hcd *ehci, struct ehci_qh *qh)
                period, hc32_to_cpup(ehci, &qh->hw_info2) & (QH_CMASK | QH_SMASK),
                qh, qh->start, qh->usecs, qh->c_usecs);
 
-#ifdef CONFIG_CPU_FREQ
-       /*
-        * If low/full speed interrupt QHs are inactive (because of
-        * cpufreq changing processor speeds), start QH with I flag set--
-        * it will automatically be cleared when cpufreq is done.
-        */
-       if (ehci->cpufreq_changing)
-               if (!(qh->hw_info1 & (cpu_to_le32(1 << 13))))
-                       qh->hw_info1 |= INACTIVATE_BIT(ehci);
-#endif
-
        /* high bandwidth, or otherwise every microframe */
        if (period == 0)
                period = 1;
@@ -658,12 +544,6 @@ static int qh_link_periodic (struct ehci_hcd *ehci, struct ehci_qh *qh)
                ? ((qh->usecs + qh->c_usecs) / qh->period)
                : (qh->usecs * 8);
 
-#ifdef CONFIG_CPU_FREQ
-       /* add qh to list of low/full speed interrupt QHs, if applicable */
-       if (!(qh->hw_info1 & (cpu_to_le32(1 << 13)))) {
-               list_add(&qh->split_intr_qhs, &ehci->split_intr_qhs);
-       }
-#endif
        /* maybe enable periodic schedule processing */
        if (!ehci->periodic_sched++)
                return enable_periodic (ehci);
@@ -683,13 +563,6 @@ static void qh_unlink_periodic (struct ehci_hcd *ehci, struct ehci_qh *qh)
        // THEN
        //   qh->hw_info1 |= __constant_cpu_to_hc32(1 << 7 /* "ignore" */);
 
-#ifdef CONFIG_CPU_FREQ
-       /* remove qh from list of low/full speed interrupt QHs */
-       if (!(qh->hw_info1 & (cpu_to_le32(1 << 13)))) {
-               list_del_init(&qh->split_intr_qhs);
-       }
-#endif
-
        /* high bandwidth, or otherwise part of every microframe */
        if ((period = qh->period) == 0)
                period = 1;
@@ -924,7 +797,6 @@ done:
 
 static int intr_submit (
        struct ehci_hcd         *ehci,
-       struct usb_host_endpoint *ep,
        struct urb              *urb,
        struct list_head        *qtd_list,
        gfp_t                   mem_flags
@@ -932,23 +804,26 @@ static int intr_submit (
        unsigned                epnum;
        unsigned long           flags;
        struct ehci_qh          *qh;
-       int                     status = 0;
+       int                     status;
        struct list_head        empty;
 
        /* get endpoint and transfer/schedule data */
-       epnum = ep->desc.bEndpointAddress;
+       epnum = urb->ep->desc.bEndpointAddress;
 
        spin_lock_irqsave (&ehci->lock, flags);
 
        if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE,
                        &ehci_to_hcd(ehci)->flags))) {
                status = -ESHUTDOWN;
-               goto done;
+               goto done_not_linked;
        }
+       status = usb_hcd_link_urb_to_ep(ehci_to_hcd(ehci), urb);
+       if (unlikely(status))
+               goto done_not_linked;
 
        /* get qh and force any scheduling errors */
        INIT_LIST_HEAD (&empty);
-       qh = qh_append_tds (ehci, urb, &empty, epnum, &ep->hcpriv);
+       qh = qh_append_tds(ehci, urb, &empty, epnum, &urb->ep->hcpriv);
        if (qh == NULL) {
                status = -ENOMEM;
                goto done;
@@ -959,13 +834,16 @@ static int intr_submit (
        }
 
        /* then queue the urb's tds to the qh */
-       qh = qh_append_tds (ehci, urb, qtd_list, epnum, &ep->hcpriv);
+       qh = qh_append_tds(ehci, urb, qtd_list, epnum, &urb->ep->hcpriv);
        BUG_ON (qh == NULL);
 
        /* ... update usbfs periodic stats */
        ehci_to_hcd(ehci)->self.bandwidth_int_reqs++;
 
 done:
+       if (unlikely(status))
+               usb_hcd_unlink_urb_from_ep(ehci_to_hcd(ehci), urb);
+done_not_linked:
        spin_unlock_irqrestore (&ehci->lock, flags);
        if (status)
                qtd_list_free (ehci, urb, qtd_list);
@@ -1749,7 +1627,7 @@ itd_complete (
 
        /* give urb back to the driver ... can be out-of-order */
        dev = urb->dev;
-       ehci_urb_done (ehci, urb);
+       ehci_urb_done(ehci, urb, 0);
        urb = NULL;
 
        /* defer stopping schedule; completion can submit */
@@ -1813,12 +1691,19 @@ static int itd_submit (struct ehci_hcd *ehci, struct urb *urb,
        /* schedule ... need to lock */
        spin_lock_irqsave (&ehci->lock, flags);
        if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE,
-                              &ehci_to_hcd(ehci)->flags)))
+                              &ehci_to_hcd(ehci)->flags))) {
                status = -ESHUTDOWN;
-       else
-               status = iso_stream_schedule (ehci, urb, stream);
+               goto done_not_linked;
+       }
+       status = usb_hcd_link_urb_to_ep(ehci_to_hcd(ehci), urb);
+       if (unlikely(status))
+               goto done_not_linked;
+       status = iso_stream_schedule(ehci, urb, stream);
        if (likely (status == 0))
                itd_link_urb (ehci, urb, ehci->periodic_size << 3, stream);
+       else
+               usb_hcd_unlink_urb_from_ep(ehci_to_hcd(ehci), urb);
+done_not_linked:
        spin_unlock_irqrestore (&ehci->lock, flags);
 
 done:
@@ -2115,7 +2000,7 @@ sitd_complete (
 
        /* give urb back to the driver */
        dev = urb->dev;
-       ehci_urb_done (ehci, urb);
+       ehci_urb_done(ehci, urb, 0);
        urb = NULL;
 
        /* defer stopping schedule; completion can submit */
@@ -2176,12 +2061,19 @@ static int sitd_submit (struct ehci_hcd *ehci, struct urb *urb,
        /* schedule ... need to lock */
        spin_lock_irqsave (&ehci->lock, flags);
        if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE,
-                              &ehci_to_hcd(ehci)->flags)))
+                              &ehci_to_hcd(ehci)->flags))) {
                status = -ESHUTDOWN;
-       else
-               status = iso_stream_schedule (ehci, urb, stream);
+               goto done_not_linked;
+       }
+       status = usb_hcd_link_urb_to_ep(ehci_to_hcd(ehci), urb);
+       if (unlikely(status))
+               goto done_not_linked;
+       status = iso_stream_schedule(ehci, urb, stream);
        if (status == 0)
                sitd_link_urb (ehci, urb, ehci->periodic_size << 3, stream);
+       else
+               usb_hcd_unlink_urb_from_ep(ehci_to_hcd(ehci), urb);
+done_not_linked:
        spin_unlock_irqrestore (&ehci->lock, flags);
 
 done: