LCOV - code coverage report
Current view: top level - drivers/usb/host - uhci-q.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 0 678 0.0 %
Date: 2022-04-01 14:58:12 Functions: 0 27 0.0 %
Branches: 0 419 0.0 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0
       2                 :            : /*
       3                 :            :  * Universal Host Controller Interface driver for USB.
       4                 :            :  *
       5                 :            :  * Maintainer: Alan Stern <stern@rowland.harvard.edu>
       6                 :            :  *
       7                 :            :  * (C) Copyright 1999 Linus Torvalds
       8                 :            :  * (C) Copyright 1999-2002 Johannes Erdfelt, johannes@erdfelt.com
       9                 :            :  * (C) Copyright 1999 Randy Dunlap
      10                 :            :  * (C) Copyright 1999 Georg Acher, acher@in.tum.de
      11                 :            :  * (C) Copyright 1999 Deti Fliegl, deti@fliegl.de
      12                 :            :  * (C) Copyright 1999 Thomas Sailer, sailer@ife.ee.ethz.ch
      13                 :            :  * (C) Copyright 1999 Roman Weissgaerber, weissg@vienna.at
      14                 :            :  * (C) Copyright 2000 Yggdrasil Computing, Inc. (port of new PCI interface
      15                 :            :  *               support from usb-ohci.c by Adam Richter, adam@yggdrasil.com).
      16                 :            :  * (C) Copyright 1999 Gregory P. Smith (from usb-ohci.c)
      17                 :            :  * (C) Copyright 2004-2007 Alan Stern, stern@rowland.harvard.edu
      18                 :            :  */
      19                 :            : 
      20                 :            : 
      21                 :            : /*
      22                 :            :  * Technically, updating td->status here is a race, but it's not really a
      23                 :            :  * problem. The worst that can happen is that we set the IOC bit again
      24                 :            :  * generating a spurious interrupt. We could fix this by creating another
      25                 :            :  * QH and leaving the IOC bit always set, but then we would have to play
      26                 :            :  * games with the FSBR code to make sure we get the correct order in all
      27                 :            :  * the cases. I don't think it's worth the effort
      28                 :            :  */
      29                 :          0 : static void uhci_set_next_interrupt(struct uhci_hcd *uhci)
      30                 :            : {
      31         [ #  # ]:          0 :         if (uhci->is_stopped)
      32                 :          0 :                 mod_timer(&uhci_to_hcd(uhci)->rh_timer, jiffies);
      33                 :          0 :         uhci->term_td->status |= cpu_to_hc32(uhci, TD_CTRL_IOC);
      34                 :          0 : }
      35                 :            : 
      36                 :          0 : static inline void uhci_clear_next_interrupt(struct uhci_hcd *uhci)
      37                 :            : {
      38                 :          0 :         uhci->term_td->status &= ~cpu_to_hc32(uhci, TD_CTRL_IOC);
      39                 :          0 : }
      40                 :            : 
      41                 :            : 
      42                 :            : /*
      43                 :            :  * Full-Speed Bandwidth Reclamation (FSBR).
      44                 :            :  * We turn on FSBR whenever a queue that wants it is advancing,
      45                 :            :  * and leave it on for a short time thereafter.
      46                 :            :  */
      47                 :          0 : static void uhci_fsbr_on(struct uhci_hcd *uhci)
      48                 :            : {
      49                 :          0 :         struct uhci_qh *lqh;
      50                 :            : 
      51                 :            :         /* The terminating skeleton QH always points back to the first
      52                 :            :          * FSBR QH.  Make the last async QH point to the terminating
      53                 :            :          * skeleton QH. */
      54                 :          0 :         uhci->fsbr_is_on = 1;
      55                 :          0 :         lqh = list_entry(uhci->skel_async_qh->node.prev,
      56                 :            :                         struct uhci_qh, node);
      57                 :          0 :         lqh->link = LINK_TO_QH(uhci, uhci->skel_term_qh);
      58                 :          0 : }
      59                 :            : 
      60                 :          0 : static void uhci_fsbr_off(struct uhci_hcd *uhci)
      61                 :            : {
      62                 :          0 :         struct uhci_qh *lqh;
      63                 :            : 
      64                 :            :         /* Remove the link from the last async QH to the terminating
      65                 :            :          * skeleton QH. */
      66                 :          0 :         uhci->fsbr_is_on = 0;
      67                 :          0 :         lqh = list_entry(uhci->skel_async_qh->node.prev,
      68                 :            :                         struct uhci_qh, node);
      69                 :          0 :         lqh->link = UHCI_PTR_TERM(uhci);
      70                 :          0 : }
      71                 :            : 
      72                 :          0 : static void uhci_add_fsbr(struct uhci_hcd *uhci, struct urb *urb)
      73                 :            : {
      74                 :          0 :         struct urb_priv *urbp = urb->hcpriv;
      75                 :            : 
      76                 :          0 :         urbp->fsbr = 1;
      77                 :          0 : }
      78                 :            : 
      79                 :          0 : static void uhci_urbp_wants_fsbr(struct uhci_hcd *uhci, struct urb_priv *urbp)
      80                 :            : {
      81         [ #  # ]:          0 :         if (urbp->fsbr) {
      82                 :          0 :                 uhci->fsbr_is_wanted = 1;
      83         [ #  # ]:          0 :                 if (!uhci->fsbr_is_on)
      84                 :          0 :                         uhci_fsbr_on(uhci);
      85         [ #  # ]:          0 :                 else if (uhci->fsbr_expiring) {
      86                 :          0 :                         uhci->fsbr_expiring = 0;
      87                 :          0 :                         del_timer(&uhci->fsbr_timer);
      88                 :            :                 }
      89                 :            :         }
      90                 :          0 : }
      91                 :            : 
      92                 :          0 : static void uhci_fsbr_timeout(struct timer_list *t)
      93                 :            : {
      94                 :          0 :         struct uhci_hcd *uhci = from_timer(uhci, t, fsbr_timer);
      95                 :          0 :         unsigned long flags;
      96                 :            : 
      97                 :          0 :         spin_lock_irqsave(&uhci->lock, flags);
      98         [ #  # ]:          0 :         if (uhci->fsbr_expiring) {
      99                 :          0 :                 uhci->fsbr_expiring = 0;
     100                 :          0 :                 uhci_fsbr_off(uhci);
     101                 :            :         }
     102                 :          0 :         spin_unlock_irqrestore(&uhci->lock, flags);
     103                 :          0 : }
     104                 :            : 
     105                 :            : 
     106                 :            : static struct uhci_td *uhci_alloc_td(struct uhci_hcd *uhci)
     107                 :            : {
     108                 :            :         dma_addr_t dma_handle;
     109                 :            :         struct uhci_td *td;
     110                 :            : 
     111                 :            :         td = dma_pool_alloc(uhci->td_pool, GFP_ATOMIC, &dma_handle);
     112                 :            :         if (!td)
     113                 :            :                 return NULL;
     114                 :            : 
     115                 :            :         td->dma_handle = dma_handle;
     116                 :            :         td->frame = -1;
     117                 :            : 
     118                 :            :         INIT_LIST_HEAD(&td->list);
     119                 :            :         INIT_LIST_HEAD(&td->fl_list);
     120                 :            : 
     121                 :            :         return td;
     122                 :            : }
     123                 :            : 
     124                 :          0 : static void uhci_free_td(struct uhci_hcd *uhci, struct uhci_td *td)
     125                 :            : {
     126         [ #  # ]:          0 :         if (!list_empty(&td->list))
     127         [ #  # ]:          0 :                 dev_WARN(uhci_dev(uhci), "td %p still in list!\n", td);
     128         [ #  # ]:          0 :         if (!list_empty(&td->fl_list))
     129         [ #  # ]:          0 :                 dev_WARN(uhci_dev(uhci), "td %p still in fl_list!\n", td);
     130                 :            : 
     131                 :          0 :         dma_pool_free(uhci->td_pool, td, td->dma_handle);
     132                 :          0 : }
     133                 :            : 
     134                 :          0 : static inline void uhci_fill_td(struct uhci_hcd *uhci, struct uhci_td *td,
     135                 :            :                 u32 status, u32 token, u32 buffer)
     136                 :            : {
     137                 :          0 :         td->status = cpu_to_hc32(uhci, status);
     138                 :          0 :         td->token = cpu_to_hc32(uhci, token);
     139                 :          0 :         td->buffer = cpu_to_hc32(uhci, buffer);
     140                 :            : }
     141                 :            : 
     142                 :          0 : static void uhci_add_td_to_urbp(struct uhci_td *td, struct urb_priv *urbp)
     143                 :            : {
     144                 :          0 :         list_add_tail(&td->list, &urbp->td_list);
     145                 :            : }
     146                 :            : 
     147                 :          0 : static void uhci_remove_td_from_urbp(struct uhci_td *td)
     148                 :            : {
     149                 :          0 :         list_del_init(&td->list);
     150                 :            : }
     151                 :            : 
     152                 :            : /*
     153                 :            :  * We insert Isochronous URBs directly into the frame list at the beginning
     154                 :            :  */
     155                 :            : static inline void uhci_insert_td_in_frame_list(struct uhci_hcd *uhci,
     156                 :            :                 struct uhci_td *td, unsigned framenum)
     157                 :            : {
     158                 :            :         framenum &= (UHCI_NUMFRAMES - 1);
     159                 :            : 
     160                 :            :         td->frame = framenum;
     161                 :            : 
     162                 :            :         /* Is there a TD already mapped there? */
     163                 :            :         if (uhci->frame_cpu[framenum]) {
     164                 :            :                 struct uhci_td *ftd, *ltd;
     165                 :            : 
     166                 :            :                 ftd = uhci->frame_cpu[framenum];
     167                 :            :                 ltd = list_entry(ftd->fl_list.prev, struct uhci_td, fl_list);
     168                 :            : 
     169                 :            :                 list_add_tail(&td->fl_list, &ftd->fl_list);
     170                 :            : 
     171                 :            :                 td->link = ltd->link;
     172                 :            :                 wmb();
     173                 :            :                 ltd->link = LINK_TO_TD(uhci, td);
     174                 :            :         } else {
     175                 :            :                 td->link = uhci->frame[framenum];
     176                 :            :                 wmb();
     177                 :            :                 uhci->frame[framenum] = LINK_TO_TD(uhci, td);
     178                 :            :                 uhci->frame_cpu[framenum] = td;
     179                 :            :         }
     180                 :            : }
     181                 :            : 
     182                 :            : static inline void uhci_remove_td_from_frame_list(struct uhci_hcd *uhci,
     183                 :            :                 struct uhci_td *td)
     184                 :            : {
     185                 :            :         /* If it's not inserted, don't remove it */
     186                 :            :         if (td->frame == -1) {
     187                 :            :                 WARN_ON(!list_empty(&td->fl_list));
     188                 :            :                 return;
     189                 :            :         }
     190                 :            : 
     191                 :            :         if (uhci->frame_cpu[td->frame] == td) {
     192                 :            :                 if (list_empty(&td->fl_list)) {
     193                 :            :                         uhci->frame[td->frame] = td->link;
     194                 :            :                         uhci->frame_cpu[td->frame] = NULL;
     195                 :            :                 } else {
     196                 :            :                         struct uhci_td *ntd;
     197                 :            : 
     198                 :            :                         ntd = list_entry(td->fl_list.next,
     199                 :            :                                          struct uhci_td,
     200                 :            :                                          fl_list);
     201                 :            :                         uhci->frame[td->frame] = LINK_TO_TD(uhci, ntd);
     202                 :            :                         uhci->frame_cpu[td->frame] = ntd;
     203                 :            :                 }
     204                 :            :         } else {
     205                 :            :                 struct uhci_td *ptd;
     206                 :            : 
     207                 :            :                 ptd = list_entry(td->fl_list.prev, struct uhci_td, fl_list);
     208                 :            :                 ptd->link = td->link;
     209                 :            :         }
     210                 :            : 
     211                 :            :         list_del_init(&td->fl_list);
     212                 :            :         td->frame = -1;
     213                 :            : }
     214                 :            : 
     215                 :            : static inline void uhci_remove_tds_from_frame(struct uhci_hcd *uhci,
     216                 :            :                 unsigned int framenum)
     217                 :            : {
     218                 :            :         struct uhci_td *ftd, *ltd;
     219                 :            : 
     220                 :            :         framenum &= (UHCI_NUMFRAMES - 1);
     221                 :            : 
     222                 :            :         ftd = uhci->frame_cpu[framenum];
     223                 :            :         if (ftd) {
     224                 :            :                 ltd = list_entry(ftd->fl_list.prev, struct uhci_td, fl_list);
     225                 :            :                 uhci->frame[framenum] = ltd->link;
     226                 :            :                 uhci->frame_cpu[framenum] = NULL;
     227                 :            : 
     228                 :            :                 while (!list_empty(&ftd->fl_list))
     229                 :            :                         list_del_init(ftd->fl_list.prev);
     230                 :            :         }
     231                 :            : }
     232                 :            : 
     233                 :            : /*
     234                 :            :  * Remove all the TDs for an Isochronous URB from the frame list
     235                 :            :  */
     236                 :          0 : static void uhci_unlink_isochronous_tds(struct uhci_hcd *uhci, struct urb *urb)
     237                 :            : {
     238                 :          0 :         struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv;
     239                 :          0 :         struct uhci_td *td;
     240                 :            : 
     241         [ #  # ]:          0 :         list_for_each_entry(td, &urbp->td_list, list)
     242                 :          0 :                 uhci_remove_td_from_frame_list(uhci, td);
     243                 :            : }
     244                 :            : 
     245                 :          0 : static struct uhci_qh *uhci_alloc_qh(struct uhci_hcd *uhci,
     246                 :            :                 struct usb_device *udev, struct usb_host_endpoint *hep)
     247                 :            : {
     248                 :          0 :         dma_addr_t dma_handle;
     249                 :          0 :         struct uhci_qh *qh;
     250                 :            : 
     251                 :          0 :         qh = dma_pool_zalloc(uhci->qh_pool, GFP_ATOMIC, &dma_handle);
     252         [ #  # ]:          0 :         if (!qh)
     253                 :            :                 return NULL;
     254                 :            : 
     255                 :          0 :         qh->dma_handle = dma_handle;
     256                 :            : 
     257         [ #  # ]:          0 :         qh->element = UHCI_PTR_TERM(uhci);
     258                 :          0 :         qh->link = UHCI_PTR_TERM(uhci);
     259                 :            : 
     260         [ #  # ]:          0 :         INIT_LIST_HEAD(&qh->queue);
     261                 :          0 :         INIT_LIST_HEAD(&qh->node);
     262                 :            : 
     263         [ #  # ]:          0 :         if (udev) {             /* Normal QH */
     264         [ #  # ]:          0 :                 qh->type = usb_endpoint_type(&hep->desc);
     265         [ #  # ]:          0 :                 if (qh->type != USB_ENDPOINT_XFER_ISOC) {
     266                 :          0 :                         qh->dummy_td = uhci_alloc_td(uhci);
     267         [ #  # ]:          0 :                         if (!qh->dummy_td) {
     268                 :          0 :                                 dma_pool_free(uhci->qh_pool, qh, dma_handle);
     269                 :          0 :                                 return NULL;
     270                 :            :                         }
     271                 :            :                 }
     272                 :          0 :                 qh->state = QH_STATE_IDLE;
     273                 :          0 :                 qh->hep = hep;
     274                 :          0 :                 qh->udev = udev;
     275                 :          0 :                 hep->hcpriv = qh;
     276                 :            : 
     277         [ #  # ]:          0 :                 if (qh->type == USB_ENDPOINT_XFER_INT ||
     278                 :            :                                 qh->type == USB_ENDPOINT_XFER_ISOC)
     279                 :          0 :                         qh->load = usb_calc_bus_time(udev->speed,
     280                 :            :                                         usb_endpoint_dir_in(&hep->desc),
     281                 :            :                                         qh->type == USB_ENDPOINT_XFER_ISOC,
     282                 :            :                                         usb_endpoint_maxp(&hep->desc))
     283                 :          0 :                                 / 1000 + 1;
     284                 :            : 
     285                 :            :         } else {                /* Skeleton QH */
     286                 :          0 :                 qh->state = QH_STATE_ACTIVE;
     287                 :          0 :                 qh->type = -1;
     288                 :            :         }
     289                 :            :         return qh;
     290                 :            : }
     291                 :            : 
     292                 :          0 : static void uhci_free_qh(struct uhci_hcd *uhci, struct uhci_qh *qh)
     293                 :            : {
     294   [ #  #  #  #  :          0 :         WARN_ON(qh->state != QH_STATE_IDLE && qh->udev);
                   #  # ]
     295         [ #  # ]:          0 :         if (!list_empty(&qh->queue))
     296         [ #  # ]:          0 :                 dev_WARN(uhci_dev(uhci), "qh %p list not empty!\n", qh);
     297                 :            : 
     298         [ #  # ]:          0 :         list_del(&qh->node);
     299         [ #  # ]:          0 :         if (qh->udev) {
     300                 :          0 :                 qh->hep->hcpriv = NULL;
     301         [ #  # ]:          0 :                 if (qh->dummy_td)
     302                 :          0 :                         uhci_free_td(uhci, qh->dummy_td);
     303                 :            :         }
     304                 :          0 :         dma_pool_free(uhci->qh_pool, qh, qh->dma_handle);
     305                 :          0 : }
     306                 :            : 
     307                 :            : /*
     308                 :            :  * When a queue is stopped and a dequeued URB is given back, adjust
     309                 :            :  * the previous TD link (if the URB isn't first on the queue) or
     310                 :            :  * save its toggle value (if it is first and is currently executing).
     311                 :            :  *
     312                 :            :  * Returns 0 if the URB should not yet be given back, 1 otherwise.
     313                 :            :  */
     314                 :            : static int uhci_cleanup_queue(struct uhci_hcd *uhci, struct uhci_qh *qh,
     315                 :            :                 struct urb *urb)
     316                 :            : {
     317                 :            :         struct urb_priv *urbp = urb->hcpriv;
     318                 :            :         struct uhci_td *td;
     319                 :            :         int ret = 1;
     320                 :            : 
     321                 :            :         /* Isochronous pipes don't use toggles and their TD link pointers
     322                 :            :          * get adjusted during uhci_urb_dequeue().  But since their queues
     323                 :            :          * cannot truly be stopped, we have to watch out for dequeues
     324                 :            :          * occurring after the nominal unlink frame. */
     325                 :            :         if (qh->type == USB_ENDPOINT_XFER_ISOC) {
     326                 :            :                 ret = (uhci->frame_number + uhci->is_stopped !=
     327                 :            :                                 qh->unlink_frame);
     328                 :            :                 goto done;
     329                 :            :         }
     330                 :            : 
     331                 :            :         /* If the URB isn't first on its queue, adjust the link pointer
     332                 :            :          * of the last TD in the previous URB.  The toggle doesn't need
     333                 :            :          * to be saved since this URB can't be executing yet. */
     334                 :            :         if (qh->queue.next != &urbp->node) {
     335                 :            :                 struct urb_priv *purbp;
     336                 :            :                 struct uhci_td *ptd;
     337                 :            : 
     338                 :            :                 purbp = list_entry(urbp->node.prev, struct urb_priv, node);
     339                 :            :                 WARN_ON(list_empty(&purbp->td_list));
     340                 :            :                 ptd = list_entry(purbp->td_list.prev, struct uhci_td,
     341                 :            :                                 list);
     342                 :            :                 td = list_entry(urbp->td_list.prev, struct uhci_td,
     343                 :            :                                 list);
     344                 :            :                 ptd->link = td->link;
     345                 :            :                 goto done;
     346                 :            :         }
     347                 :            : 
     348                 :            :         /* If the QH element pointer is UHCI_PTR_TERM then then currently
     349                 :            :          * executing URB has already been unlinked, so this one isn't it. */
     350                 :            :         if (qh_element(qh) == UHCI_PTR_TERM(uhci))
     351                 :            :                 goto done;
     352                 :            :         qh->element = UHCI_PTR_TERM(uhci);
     353                 :            : 
     354                 :            :         /* Control pipes don't have to worry about toggles */
     355                 :            :         if (qh->type == USB_ENDPOINT_XFER_CONTROL)
     356                 :            :                 goto done;
     357                 :            : 
     358                 :            :         /* Save the next toggle value */
     359                 :            :         WARN_ON(list_empty(&urbp->td_list));
     360                 :            :         td = list_entry(urbp->td_list.next, struct uhci_td, list);
     361                 :            :         qh->needs_fixup = 1;
     362                 :            :         qh->initial_toggle = uhci_toggle(td_token(uhci, td));
     363                 :            : 
     364                 :            : done:
     365                 :            :         return ret;
     366                 :            : }
     367                 :            : 
     368                 :            : /*
     369                 :            :  * Fix up the data toggles for URBs in a queue, when one of them
     370                 :            :  * terminates early (short transfer, error, or dequeued).
     371                 :            :  */
     372                 :            : static void uhci_fixup_toggles(struct uhci_hcd *uhci, struct uhci_qh *qh,
     373                 :            :                         int skip_first)
     374                 :            : {
     375                 :            :         struct urb_priv *urbp = NULL;
     376                 :            :         struct uhci_td *td;
     377                 :            :         unsigned int toggle = qh->initial_toggle;
     378                 :            :         unsigned int pipe;
     379                 :            : 
     380                 :            :         /* Fixups for a short transfer start with the second URB in the
     381                 :            :          * queue (the short URB is the first). */
     382                 :            :         if (skip_first)
     383                 :            :                 urbp = list_entry(qh->queue.next, struct urb_priv, node);
     384                 :            : 
     385                 :            :         /* When starting with the first URB, if the QH element pointer is
     386                 :            :          * still valid then we know the URB's toggles are okay. */
     387                 :            :         else if (qh_element(qh) != UHCI_PTR_TERM(uhci))
     388                 :            :                 toggle = 2;
     389                 :            : 
     390                 :            :         /* Fix up the toggle for the URBs in the queue.  Normally this
     391                 :            :          * loop won't run more than once: When an error or short transfer
     392                 :            :          * occurs, the queue usually gets emptied. */
     393                 :            :         urbp = list_prepare_entry(urbp, &qh->queue, node);
     394                 :            :         list_for_each_entry_continue(urbp, &qh->queue, node) {
     395                 :            : 
     396                 :            :                 /* If the first TD has the right toggle value, we don't
     397                 :            :                  * need to change any toggles in this URB */
     398                 :            :                 td = list_entry(urbp->td_list.next, struct uhci_td, list);
     399                 :            :                 if (toggle > 1 || uhci_toggle(td_token(uhci, td)) == toggle) {
     400                 :            :                         td = list_entry(urbp->td_list.prev, struct uhci_td,
     401                 :            :                                         list);
     402                 :            :                         toggle = uhci_toggle(td_token(uhci, td)) ^ 1;
     403                 :            : 
     404                 :            :                 /* Otherwise all the toggles in the URB have to be switched */
     405                 :            :                 } else {
     406                 :            :                         list_for_each_entry(td, &urbp->td_list, list) {
     407                 :            :                                 td->token ^= cpu_to_hc32(uhci,
     408                 :            :                                                         TD_TOKEN_TOGGLE);
     409                 :            :                                 toggle ^= 1;
     410                 :            :                         }
     411                 :            :                 }
     412                 :            :         }
     413                 :            : 
     414                 :            :         wmb();
     415                 :            :         pipe = list_entry(qh->queue.next, struct urb_priv, node)->urb->pipe;
     416                 :            :         usb_settoggle(qh->udev, usb_pipeendpoint(pipe),
     417                 :            :                         usb_pipeout(pipe), toggle);
     418                 :            :         qh->needs_fixup = 0;
     419                 :            : }
     420                 :            : 
     421                 :            : /*
     422                 :            :  * Link an Isochronous QH into its skeleton's list
     423                 :            :  */
     424                 :          0 : static inline void link_iso(struct uhci_hcd *uhci, struct uhci_qh *qh)
     425                 :            : {
     426                 :          0 :         list_add_tail(&qh->node, &uhci->skel_iso_qh->node);
     427                 :            : 
     428                 :            :         /* Isochronous QHs aren't linked by the hardware */
     429                 :          0 : }
     430                 :            : 
     431                 :            : /*
     432                 :            :  * Link a high-period interrupt QH into the schedule at the end of its
     433                 :            :  * skeleton's list
     434                 :            :  */
     435                 :          0 : static void link_interrupt(struct uhci_hcd *uhci, struct uhci_qh *qh)
     436                 :            : {
     437                 :          0 :         struct uhci_qh *pqh;
     438                 :            : 
     439                 :          0 :         list_add_tail(&qh->node, &uhci->skelqh[qh->skel]->node);
     440                 :            : 
     441                 :          0 :         pqh = list_entry(qh->node.prev, struct uhci_qh, node);
     442                 :          0 :         qh->link = pqh->link;
     443                 :          0 :         wmb();
     444                 :          0 :         pqh->link = LINK_TO_QH(uhci, qh);
     445                 :          0 : }
     446                 :            : 
     447                 :            : /*
     448                 :            :  * Link a period-1 interrupt or async QH into the schedule at the
     449                 :            :  * correct spot in the async skeleton's list, and update the FSBR link
     450                 :            :  */
     451                 :            : static void link_async(struct uhci_hcd *uhci, struct uhci_qh *qh)
     452                 :            : {
     453                 :            :         struct uhci_qh *pqh;
     454                 :            :         __hc32 link_to_new_qh;
     455                 :            : 
     456                 :            :         /* Find the predecessor QH for our new one and insert it in the list.
     457                 :            :          * The list of QHs is expected to be short, so linear search won't
     458                 :            :          * take too long. */
     459                 :            :         list_for_each_entry_reverse(pqh, &uhci->skel_async_qh->node, node) {
     460                 :            :                 if (pqh->skel <= qh->skel)
     461                 :            :                         break;
     462                 :            :         }
     463                 :            :         list_add(&qh->node, &pqh->node);
     464                 :            : 
     465                 :            :         /* Link it into the schedule */
     466                 :            :         qh->link = pqh->link;
     467                 :            :         wmb();
     468                 :            :         link_to_new_qh = LINK_TO_QH(uhci, qh);
     469                 :            :         pqh->link = link_to_new_qh;
     470                 :            : 
     471                 :            :         /* If this is now the first FSBR QH, link the terminating skeleton
     472                 :            :          * QH to it. */
     473                 :            :         if (pqh->skel < SKEL_FSBR && qh->skel >= SKEL_FSBR)
     474                 :            :                 uhci->skel_term_qh->link = link_to_new_qh;
     475                 :            : }
     476                 :            : 
     477                 :            : /*
     478                 :            :  * Put a QH on the schedule in both hardware and software
     479                 :            :  */
     480                 :          0 : static void uhci_activate_qh(struct uhci_hcd *uhci, struct uhci_qh *qh)
     481                 :            : {
     482         [ #  # ]:          0 :         WARN_ON(list_empty(&qh->queue));
     483                 :            : 
     484                 :            :         /* Set the element pointer if it isn't set already.
     485                 :            :          * This isn't needed for Isochronous queues, but it doesn't hurt. */
     486         [ #  # ]:          0 :         if (qh_element(qh) == UHCI_PTR_TERM(uhci)) {
     487                 :          0 :                 struct urb_priv *urbp = list_entry(qh->queue.next,
     488                 :            :                                 struct urb_priv, node);
     489                 :          0 :                 struct uhci_td *td = list_entry(urbp->td_list.next,
     490                 :            :                                 struct uhci_td, list);
     491                 :            : 
     492                 :          0 :                 qh->element = LINK_TO_TD(uhci, td);
     493                 :            :         }
     494                 :            : 
     495                 :            :         /* Treat the queue as if it has just advanced */
     496                 :          0 :         qh->wait_expired = 0;
     497                 :          0 :         qh->advance_jiffies = jiffies;
     498                 :            : 
     499         [ #  # ]:          0 :         if (qh->state == QH_STATE_ACTIVE)
     500                 :            :                 return;
     501                 :          0 :         qh->state = QH_STATE_ACTIVE;
     502                 :            : 
     503                 :            :         /* Move the QH from its old list to the correct spot in the appropriate
     504                 :            :          * skeleton's list */
     505         [ #  # ]:          0 :         if (qh == uhci->next_qh)
     506                 :          0 :                 uhci->next_qh = list_entry(qh->node.next, struct uhci_qh,
     507                 :            :                                 node);
     508         [ #  # ]:          0 :         list_del(&qh->node);
     509                 :            : 
     510         [ #  # ]:          0 :         if (qh->skel == SKEL_ISO)
     511                 :          0 :                 link_iso(uhci, qh);
     512         [ #  # ]:          0 :         else if (qh->skel < SKEL_ASYNC)
     513                 :          0 :                 link_interrupt(uhci, qh);
     514                 :            :         else
     515                 :          0 :                 link_async(uhci, qh);
     516                 :            : }
     517                 :            : 
     518                 :            : /*
     519                 :            :  * Unlink a high-period interrupt QH from the schedule
     520                 :            :  */
     521                 :          0 : static void unlink_interrupt(struct uhci_hcd *uhci, struct uhci_qh *qh)
     522                 :            : {
     523                 :          0 :         struct uhci_qh *pqh;
     524                 :            : 
     525                 :          0 :         pqh = list_entry(qh->node.prev, struct uhci_qh, node);
     526                 :          0 :         pqh->link = qh->link;
     527                 :          0 :         mb();
     528                 :          0 : }
     529                 :            : 
     530                 :            : /*
     531                 :            :  * Unlink a period-1 interrupt or async QH from the schedule
     532                 :            :  */
     533                 :          0 : static void unlink_async(struct uhci_hcd *uhci, struct uhci_qh *qh)
     534                 :            : {
     535                 :          0 :         struct uhci_qh *pqh;
     536                 :          0 :         __hc32 link_to_next_qh = qh->link;
     537                 :            : 
     538                 :          0 :         pqh = list_entry(qh->node.prev, struct uhci_qh, node);
     539                 :          0 :         pqh->link = link_to_next_qh;
     540                 :            : 
     541                 :            :         /* If this was the old first FSBR QH, link the terminating skeleton
     542                 :            :          * QH to the next (new first FSBR) QH. */
     543         [ #  # ]:          0 :         if (pqh->skel < SKEL_FSBR && qh->skel >= SKEL_FSBR)
     544                 :          0 :                 uhci->skel_term_qh->link = link_to_next_qh;
     545                 :          0 :         mb();
     546                 :          0 : }
     547                 :            : 
     548                 :            : /*
     549                 :            :  * Take a QH off the hardware schedule
     550                 :            :  */
     551                 :          0 : static void uhci_unlink_qh(struct uhci_hcd *uhci, struct uhci_qh *qh)
     552                 :            : {
     553         [ #  # ]:          0 :         if (qh->state == QH_STATE_UNLINKING)
     554                 :            :                 return;
     555   [ #  #  #  #  :          0 :         WARN_ON(qh->state != QH_STATE_ACTIVE || !qh->udev);
                   #  # ]
     556                 :          0 :         qh->state = QH_STATE_UNLINKING;
     557                 :            : 
     558                 :            :         /* Unlink the QH from the schedule and record when we did it */
     559         [ #  # ]:          0 :         if (qh->skel == SKEL_ISO)
     560                 :            :                 ;
     561         [ #  # ]:          0 :         else if (qh->skel < SKEL_ASYNC)
     562                 :          0 :                 unlink_interrupt(uhci, qh);
     563                 :            :         else
     564         [ #  # ]:          0 :                 unlink_async(uhci, qh);
     565                 :            : 
     566         [ #  # ]:          0 :         uhci_get_current_frame_number(uhci);
     567                 :          0 :         qh->unlink_frame = uhci->frame_number;
     568                 :            : 
     569                 :            :         /* Force an interrupt so we know when the QH is fully unlinked */
     570   [ #  #  #  # ]:          0 :         if (list_empty(&uhci->skel_unlink_qh->node) || uhci->is_stopped)
     571                 :          0 :                 uhci_set_next_interrupt(uhci);
     572                 :            : 
     573                 :            :         /* Move the QH from its old list to the end of the unlinking list */
     574         [ #  # ]:          0 :         if (qh == uhci->next_qh)
     575                 :          0 :                 uhci->next_qh = list_entry(qh->node.next, struct uhci_qh,
     576                 :            :                                 node);
     577                 :          0 :         list_move_tail(&qh->node, &uhci->skel_unlink_qh->node);
     578                 :            : }
     579                 :            : 
     580                 :            : /*
     581                 :            :  * When we and the controller are through with a QH, it becomes IDLE.
     582                 :            :  * This happens when a QH has been off the schedule (on the unlinking
     583                 :            :  * list) for more than one frame, or when an error occurs while adding
     584                 :            :  * the first URB onto a new QH.
     585                 :            :  */
     586                 :          0 : static void uhci_make_qh_idle(struct uhci_hcd *uhci, struct uhci_qh *qh)
     587                 :            : {
     588         [ #  # ]:          0 :         WARN_ON(qh->state == QH_STATE_ACTIVE);
     589                 :            : 
     590         [ #  # ]:          0 :         if (qh == uhci->next_qh)
     591                 :          0 :                 uhci->next_qh = list_entry(qh->node.next, struct uhci_qh,
     592                 :            :                                 node);
     593         [ #  # ]:          0 :         list_move(&qh->node, &uhci->idle_qh_list);
     594                 :          0 :         qh->state = QH_STATE_IDLE;
     595                 :            : 
     596                 :            :         /* Now that the QH is idle, its post_td isn't being used */
     597         [ #  # ]:          0 :         if (qh->post_td) {
     598                 :          0 :                 uhci_free_td(uhci, qh->post_td);
     599                 :          0 :                 qh->post_td = NULL;
     600                 :            :         }
     601                 :            : 
     602                 :            :         /* If anyone is waiting for a QH to become idle, wake them up */
     603         [ #  # ]:          0 :         if (uhci->num_waiting)
     604                 :          0 :                 wake_up_all(&uhci->waitqh);
     605                 :          0 : }
     606                 :            : 
     607                 :            : /*
     608                 :            :  * Find the highest existing bandwidth load for a given phase and period.
     609                 :            :  */
     610                 :          0 : static int uhci_highest_load(struct uhci_hcd *uhci, int phase, int period)
     611                 :            : {
     612                 :          0 :         int highest_load = uhci->load[phase];
     613                 :            : 
     614   [ #  #  #  #  :          0 :         for (phase += period; phase < MAX_PHASE; phase += period)
                   #  # ]
     615                 :          0 :                 highest_load = max_t(int, highest_load, uhci->load[phase]);
     616                 :          0 :         return highest_load;
     617                 :            : }
     618                 :            : 
     619                 :            : /*
     620                 :            :  * Set qh->phase to the optimal phase for a periodic transfer and
     621                 :            :  * check whether the bandwidth requirement is acceptable.
     622                 :            :  */
     623                 :          0 : static int uhci_check_bandwidth(struct uhci_hcd *uhci, struct uhci_qh *qh)
     624                 :            : {
     625                 :          0 :         int minimax_load;
     626                 :            : 
     627                 :            :         /* Find the optimal phase (unless it is already set) and get
     628                 :            :          * its load value. */
     629         [ #  # ]:          0 :         if (qh->phase >= 0)
     630                 :          0 :                 minimax_load = uhci_highest_load(uhci, qh->phase, qh->period);
     631                 :            :         else {
     632                 :          0 :                 int phase, load;
     633                 :          0 :                 int max_phase = min_t(int, MAX_PHASE, qh->period);
     634                 :            : 
     635                 :          0 :                 qh->phase = 0;
     636                 :          0 :                 minimax_load = uhci_highest_load(uhci, qh->phase, qh->period);
     637         [ #  # ]:          0 :                 for (phase = 1; phase < max_phase; ++phase) {
     638                 :          0 :                         load = uhci_highest_load(uhci, phase, qh->period);
     639         [ #  # ]:          0 :                         if (load < minimax_load) {
     640                 :          0 :                                 minimax_load = load;
     641                 :          0 :                                 qh->phase = phase;
     642                 :            :                         }
     643                 :            :                 }
     644                 :            :         }
     645                 :            : 
     646                 :            :         /* Maximum allowable periodic bandwidth is 90%, or 900 us per frame */
     647         [ #  # ]:          0 :         if (minimax_load + qh->load > 900) {
     648                 :          0 :                 dev_dbg(uhci_dev(uhci), "bandwidth allocation failed: "
     649                 :            :                                 "period %d, phase %d, %d + %d us\n",
     650                 :            :                                 qh->period, qh->phase, minimax_load, qh->load);
     651                 :          0 :                 return -ENOSPC;
     652                 :            :         }
     653                 :            :         return 0;
     654                 :            : }
     655                 :            : 
     656                 :            : /*
     657                 :            :  * Reserve a periodic QH's bandwidth in the schedule
     658                 :            :  */
     659                 :          0 : static void uhci_reserve_bandwidth(struct uhci_hcd *uhci, struct uhci_qh *qh)
     660                 :            : {
     661                 :          0 :         int i;
     662                 :          0 :         int load = qh->load;
     663                 :          0 :         char *p = "??";
     664                 :            : 
     665         [ #  # ]:          0 :         for (i = qh->phase; i < MAX_PHASE; i += qh->period) {
     666                 :          0 :                 uhci->load[i] += load;
     667                 :          0 :                 uhci->total_load += load;
     668                 :            :         }
     669                 :          0 :         uhci_to_hcd(uhci)->self.bandwidth_allocated =
     670      [ #  #  # ]:          0 :                         uhci->total_load / MAX_PHASE;
     671      [ #  #  # ]:          0 :         switch (qh->type) {
     672                 :            :         case USB_ENDPOINT_XFER_INT:
     673                 :          0 :                 ++uhci_to_hcd(uhci)->self.bandwidth_int_reqs;
     674                 :          0 :                 p = "INT";
     675                 :          0 :                 break;
     676                 :            :         case USB_ENDPOINT_XFER_ISOC:
     677                 :          0 :                 ++uhci_to_hcd(uhci)->self.bandwidth_isoc_reqs;
     678                 :          0 :                 p = "ISO";
     679                 :          0 :                 break;
     680                 :            :         }
     681                 :          0 :         qh->bandwidth_reserved = 1;
     682                 :          0 :         dev_dbg(uhci_dev(uhci),
     683                 :            :                         "%s dev %d ep%02x-%s, period %d, phase %d, %d us\n",
     684                 :            :                         "reserve", qh->udev->devnum,
     685                 :            :                         qh->hep->desc.bEndpointAddress, p,
     686                 :            :                         qh->period, qh->phase, load);
     687                 :          0 : }
     688                 :            : 
     689                 :            : /*
     690                 :            :  * Release a periodic QH's bandwidth reservation
     691                 :            :  */
     692                 :          0 : static void uhci_release_bandwidth(struct uhci_hcd *uhci, struct uhci_qh *qh)
     693                 :            : {
     694                 :          0 :         int i;
     695                 :          0 :         int load = qh->load;
     696                 :          0 :         char *p = "??";
     697                 :            : 
     698         [ #  # ]:          0 :         for (i = qh->phase; i < MAX_PHASE; i += qh->period) {
     699                 :          0 :                 uhci->load[i] -= load;
     700                 :          0 :                 uhci->total_load -= load;
     701                 :            :         }
     702                 :          0 :         uhci_to_hcd(uhci)->self.bandwidth_allocated =
     703      [ #  #  # ]:          0 :                         uhci->total_load / MAX_PHASE;
     704      [ #  #  # ]:          0 :         switch (qh->type) {
     705                 :            :         case USB_ENDPOINT_XFER_INT:
     706                 :          0 :                 --uhci_to_hcd(uhci)->self.bandwidth_int_reqs;
     707                 :          0 :                 p = "INT";
     708                 :          0 :                 break;
     709                 :            :         case USB_ENDPOINT_XFER_ISOC:
     710                 :          0 :                 --uhci_to_hcd(uhci)->self.bandwidth_isoc_reqs;
     711                 :          0 :                 p = "ISO";
     712                 :          0 :                 break;
     713                 :            :         }
     714                 :          0 :         qh->bandwidth_reserved = 0;
     715                 :          0 :         dev_dbg(uhci_dev(uhci),
     716                 :            :                         "%s dev %d ep%02x-%s, period %d, phase %d, %d us\n",
     717                 :            :                         "release", qh->udev->devnum,
     718                 :            :                         qh->hep->desc.bEndpointAddress, p,
     719                 :            :                         qh->period, qh->phase, load);
     720                 :          0 : }
     721                 :            : 
     722                 :            : static inline struct urb_priv *uhci_alloc_urb_priv(struct uhci_hcd *uhci,
     723                 :            :                 struct urb *urb)
     724                 :            : {
     725                 :            :         struct urb_priv *urbp;
     726                 :            : 
     727                 :            :         urbp = kmem_cache_zalloc(uhci_up_cachep, GFP_ATOMIC);
     728                 :            :         if (!urbp)
     729                 :            :                 return NULL;
     730                 :            : 
     731                 :            :         urbp->urb = urb;
     732                 :            :         urb->hcpriv = urbp;
     733                 :            : 
     734                 :            :         INIT_LIST_HEAD(&urbp->node);
     735                 :            :         INIT_LIST_HEAD(&urbp->td_list);
     736                 :            : 
     737                 :            :         return urbp;
     738                 :            : }
     739                 :            : 
     740                 :          0 : static void uhci_free_urb_priv(struct uhci_hcd *uhci,
     741                 :            :                 struct urb_priv *urbp)
     742                 :            : {
     743                 :          0 :         struct uhci_td *td, *tmp;
     744                 :            : 
     745         [ #  # ]:          0 :         if (!list_empty(&urbp->node))
     746         [ #  # ]:          0 :                 dev_WARN(uhci_dev(uhci), "urb %p still on QH's list!\n",
     747                 :          0 :                                 urbp->urb);
     748                 :            : 
     749         [ #  # ]:          0 :         list_for_each_entry_safe(td, tmp, &urbp->td_list, list) {
     750                 :          0 :                 uhci_remove_td_from_urbp(td);
     751                 :          0 :                 uhci_free_td(uhci, td);
     752                 :            :         }
     753                 :            : 
     754                 :          0 :         kmem_cache_free(uhci_up_cachep, urbp);
     755                 :          0 : }
     756                 :            : 
     757                 :            : /*
     758                 :            :  * Map status to standard result codes
     759                 :            :  *
     760                 :            :  * <status> is (td_status(uhci, td) & 0xF60000), a.k.a.
     761                 :            :  * uhci_status_bits(td_status(uhci, td)).
     762                 :            :  * Note: <status> does not include the TD_CTRL_NAK bit.
     763                 :            :  * <dir_out> is True for output TDs and False for input TDs.
     764                 :            :  */
     765                 :          0 : static int uhci_map_status(int status, int dir_out)
     766                 :            : {
     767         [ #  # ]:          0 :         if (!status)
     768                 :            :                 return 0;
     769         [ #  # ]:          0 :         if (status & TD_CTRL_BITSTUFF)                      /* Bitstuff error */
     770                 :            :                 return -EPROTO;
     771         [ #  # ]:          0 :         if (status & TD_CTRL_CRCTIMEO) {            /* CRC/Timeout */
     772         [ #  # ]:          0 :                 if (dir_out)
     773                 :            :                         return -EPROTO;
     774                 :            :                 else
     775                 :          0 :                         return -EILSEQ;
     776                 :            :         }
     777         [ #  # ]:          0 :         if (status & TD_CTRL_BABBLE)                        /* Babble */
     778                 :            :                 return -EOVERFLOW;
     779         [ #  # ]:          0 :         if (status & TD_CTRL_DBUFERR)                       /* Buffer error */
     780                 :            :                 return -ENOSR;
     781         [ #  # ]:          0 :         if (status & TD_CTRL_STALLED)                       /* Stalled */
     782                 :          0 :                 return -EPIPE;
     783                 :            :         return 0;
     784                 :            : }
     785                 :            : 
     786                 :            : /*
     787                 :            :  * Control transfers
     788                 :            :  */
     789                 :          0 : static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb,
     790                 :            :                 struct uhci_qh *qh)
     791                 :            : {
     792                 :          0 :         struct uhci_td *td;
     793                 :          0 :         unsigned long destination, status;
     794         [ #  # ]:          0 :         int maxsze = usb_endpoint_maxp(&qh->hep->desc);
     795                 :          0 :         int len = urb->transfer_buffer_length;
     796                 :          0 :         dma_addr_t data = urb->transfer_dma;
     797                 :          0 :         __hc32 *plink;
     798                 :          0 :         struct urb_priv *urbp = urb->hcpriv;
     799                 :          0 :         int skel;
     800                 :            : 
     801                 :            :         /* The "pipe" thing contains the destination in bits 8--18 */
     802                 :          0 :         destination = (urb->pipe & PIPE_DEVEP_MASK) | USB_PID_SETUP;
     803                 :            : 
     804                 :            :         /* 3 errors, dummy TD remains inactive */
     805                 :          0 :         status = uhci_maxerr(3);
     806         [ #  # ]:          0 :         if (urb->dev->speed == USB_SPEED_LOW)
     807                 :          0 :                 status |= TD_CTRL_LS;
     808                 :            : 
     809                 :            :         /*
     810                 :            :          * Build the TD for the control request setup packet
     811                 :            :          */
     812                 :          0 :         td = qh->dummy_td;
     813         [ #  # ]:          0 :         uhci_add_td_to_urbp(td, urbp);
     814                 :          0 :         uhci_fill_td(uhci, td, status, destination | uhci_explen(8),
     815         [ #  # ]:          0 :                         urb->setup_dma);
     816                 :          0 :         plink = &td->link;
     817                 :          0 :         status |= TD_CTRL_ACTIVE;
     818                 :            : 
     819                 :            :         /*
     820                 :            :          * If direction is "send", change the packet ID from SETUP (0x2D)
     821                 :            :          * to OUT (0xE1).  Else change it from SETUP to IN (0x69) and
     822                 :            :          * set Short Packet Detect (SPD) for all data packets.
     823                 :            :          *
     824                 :            :          * 0-length transfers always get treated as "send".
     825                 :            :          */
     826   [ #  #  #  # ]:          0 :         if (usb_pipeout(urb->pipe) || len == 0)
     827                 :          0 :                 destination ^= (USB_PID_SETUP ^ USB_PID_OUT);
     828                 :            :         else {
     829                 :          0 :                 destination ^= (USB_PID_SETUP ^ USB_PID_IN);
     830                 :          0 :                 status |= TD_CTRL_SPD;
     831                 :            :         }
     832                 :            : 
     833                 :            :         /*
     834                 :            :          * Build the DATA TDs
     835                 :            :          */
     836         [ #  # ]:          0 :         while (len > 0) {
     837                 :          0 :                 int pktsze = maxsze;
     838                 :            : 
     839         [ #  # ]:          0 :                 if (len <= pktsze) {         /* The last data packet */
     840                 :          0 :                         pktsze = len;
     841                 :          0 :                         status &= ~TD_CTRL_SPD;
     842                 :            :                 }
     843                 :            : 
     844                 :          0 :                 td = uhci_alloc_td(uhci);
     845         [ #  # ]:          0 :                 if (!td)
     846                 :          0 :                         goto nomem;
     847                 :          0 :                 *plink = LINK_TO_TD(uhci, td);
     848                 :            : 
     849                 :            :                 /* Alternate Data0/1 (start with Data1) */
     850                 :          0 :                 destination ^= TD_TOKEN_TOGGLE;
     851                 :            : 
     852                 :          0 :                 uhci_add_td_to_urbp(td, urbp);
     853                 :          0 :                 uhci_fill_td(uhci, td, status,
     854                 :          0 :                         destination | uhci_explen(pktsze), data);
     855                 :          0 :                 plink = &td->link;
     856                 :            : 
     857                 :          0 :                 data += pktsze;
     858                 :          0 :                 len -= pktsze;
     859                 :            :         }
     860                 :            : 
     861                 :            :         /*
     862                 :            :          * Build the final TD for control status
     863                 :            :          */
     864                 :          0 :         td = uhci_alloc_td(uhci);
     865         [ #  # ]:          0 :         if (!td)
     866                 :          0 :                 goto nomem;
     867                 :          0 :         *plink = LINK_TO_TD(uhci, td);
     868                 :            : 
     869                 :            :         /* Change direction for the status transaction */
     870                 :          0 :         destination ^= (USB_PID_IN ^ USB_PID_OUT);
     871                 :          0 :         destination |= TD_TOKEN_TOGGLE;         /* End in Data1 */
     872                 :            : 
     873                 :          0 :         uhci_add_td_to_urbp(td, urbp);
     874                 :          0 :         uhci_fill_td(uhci, td, status | TD_CTRL_IOC,
     875                 :            :                         destination | uhci_explen(0), 0);
     876                 :          0 :         plink = &td->link;
     877                 :            : 
     878                 :            :         /*
     879                 :            :          * Build the new dummy TD and activate the old one
     880                 :            :          */
     881                 :          0 :         td = uhci_alloc_td(uhci);
     882         [ #  # ]:          0 :         if (!td)
     883                 :          0 :                 goto nomem;
     884                 :          0 :         *plink = LINK_TO_TD(uhci, td);
     885                 :            : 
     886                 :          0 :         uhci_fill_td(uhci, td, 0, USB_PID_OUT | uhci_explen(0), 0);
     887                 :          0 :         wmb();
     888         [ #  # ]:          0 :         qh->dummy_td->status |= cpu_to_hc32(uhci, TD_CTRL_ACTIVE);
     889                 :          0 :         qh->dummy_td = td;
     890                 :            : 
     891                 :            :         /* Low-speed transfers get a different queue, and won't hog the bus.
     892                 :            :          * Also, some devices enumerate better without FSBR; the easiest way
     893                 :            :          * to do that is to put URBs on the low-speed queue while the device
     894                 :            :          * isn't in the CONFIGURED state. */
     895         [ #  # ]:          0 :         if (urb->dev->speed == USB_SPEED_LOW ||
     896         [ #  # ]:          0 :                         urb->dev->state != USB_STATE_CONFIGURED)
     897                 :            :                 skel = SKEL_LS_CONTROL;
     898                 :            :         else {
     899                 :          0 :                 skel = SKEL_FS_CONTROL;
     900                 :          0 :                 uhci_add_fsbr(uhci, urb);
     901                 :            :         }
     902         [ #  # ]:          0 :         if (qh->state != QH_STATE_ACTIVE)
     903                 :          0 :                 qh->skel = skel;
     904                 :            :         return 0;
     905                 :            : 
     906                 :          0 : nomem:
     907                 :            :         /* Remove the dummy TD from the td_list so it doesn't get freed */
     908                 :          0 :         uhci_remove_td_from_urbp(qh->dummy_td);
     909                 :          0 :         return -ENOMEM;
     910                 :            : }
     911                 :            : 
     912                 :            : /*
     913                 :            :  * Common submit for bulk and interrupt
     914                 :            :  */
     915                 :            : static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb,
     916                 :            :                 struct uhci_qh *qh)
     917                 :            : {
     918                 :            :         struct uhci_td *td;
     919                 :            :         unsigned long destination, status;
     920                 :            :         int maxsze = usb_endpoint_maxp(&qh->hep->desc);
     921                 :            :         int len = urb->transfer_buffer_length;
     922                 :            :         int this_sg_len;
     923                 :            :         dma_addr_t data;
     924                 :            :         __hc32 *plink;
     925                 :            :         struct urb_priv *urbp = urb->hcpriv;
     926                 :            :         unsigned int toggle;
     927                 :            :         struct scatterlist  *sg;
     928                 :            :         int i;
     929                 :            : 
     930                 :            :         if (len < 0)
     931                 :            :                 return -EINVAL;
     932                 :            : 
     933                 :            :         /* The "pipe" thing contains the destination in bits 8--18 */
     934                 :            :         destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe);
     935                 :            :         toggle = usb_gettoggle(urb->dev, usb_pipeendpoint(urb->pipe),
     936                 :            :                          usb_pipeout(urb->pipe));
     937                 :            : 
     938                 :            :         /* 3 errors, dummy TD remains inactive */
     939                 :            :         status = uhci_maxerr(3);
     940                 :            :         if (urb->dev->speed == USB_SPEED_LOW)
     941                 :            :                 status |= TD_CTRL_LS;
     942                 :            :         if (usb_pipein(urb->pipe))
     943                 :            :                 status |= TD_CTRL_SPD;
     944                 :            : 
     945                 :            :         i = urb->num_mapped_sgs;
     946                 :            :         if (len > 0 && i > 0) {
     947                 :            :                 sg = urb->sg;
     948                 :            :                 data = sg_dma_address(sg);
     949                 :            : 
     950                 :            :                 /* urb->transfer_buffer_length may be smaller than the
     951                 :            :                  * size of the scatterlist (or vice versa)
     952                 :            :                  */
     953                 :            :                 this_sg_len = min_t(int, sg_dma_len(sg), len);
     954                 :            :         } else {
     955                 :            :                 sg = NULL;
     956                 :            :                 data = urb->transfer_dma;
     957                 :            :                 this_sg_len = len;
     958                 :            :         }
     959                 :            :         /*
     960                 :            :          * Build the DATA TDs
     961                 :            :          */
     962                 :            :         plink = NULL;
     963                 :            :         td = qh->dummy_td;
     964                 :            :         for (;;) {      /* Allow zero length packets */
     965                 :            :                 int pktsze = maxsze;
     966                 :            : 
     967                 :            :                 if (len <= pktsze) {         /* The last packet */
     968                 :            :                         pktsze = len;
     969                 :            :                         if (!(urb->transfer_flags & URB_SHORT_NOT_OK))
     970                 :            :                                 status &= ~TD_CTRL_SPD;
     971                 :            :                 }
     972                 :            : 
     973                 :            :                 if (plink) {
     974                 :            :                         td = uhci_alloc_td(uhci);
     975                 :            :                         if (!td)
     976                 :            :                                 goto nomem;
     977                 :            :                         *plink = LINK_TO_TD(uhci, td);
     978                 :            :                 }
     979                 :            :                 uhci_add_td_to_urbp(td, urbp);
     980                 :            :                 uhci_fill_td(uhci, td, status,
     981                 :            :                                 destination | uhci_explen(pktsze) |
     982                 :            :                                         (toggle << TD_TOKEN_TOGGLE_SHIFT),
     983                 :            :                                 data);
     984                 :            :                 plink = &td->link;
     985                 :            :                 status |= TD_CTRL_ACTIVE;
     986                 :            : 
     987                 :            :                 toggle ^= 1;
     988                 :            :                 data += pktsze;
     989                 :            :                 this_sg_len -= pktsze;
     990                 :            :                 len -= maxsze;
     991                 :            :                 if (this_sg_len <= 0) {
     992                 :            :                         if (--i <= 0 || len <= 0)
     993                 :            :                                 break;
     994                 :            :                         sg = sg_next(sg);
     995                 :            :                         data = sg_dma_address(sg);
     996                 :            :                         this_sg_len = min_t(int, sg_dma_len(sg), len);
     997                 :            :                 }
     998                 :            :         }
     999                 :            : 
    1000                 :            :         /*
    1001                 :            :          * URB_ZERO_PACKET means adding a 0-length packet, if direction
    1002                 :            :          * is OUT and the transfer_length was an exact multiple of maxsze,
    1003                 :            :          * hence (len = transfer_length - N * maxsze) == 0
    1004                 :            :          * however, if transfer_length == 0, the zero packet was already
    1005                 :            :          * prepared above.
    1006                 :            :          */
    1007                 :            :         if ((urb->transfer_flags & URB_ZERO_PACKET) &&
    1008                 :            :                         usb_pipeout(urb->pipe) && len == 0 &&
    1009                 :            :                         urb->transfer_buffer_length > 0) {
    1010                 :            :                 td = uhci_alloc_td(uhci);
    1011                 :            :                 if (!td)
    1012                 :            :                         goto nomem;
    1013                 :            :                 *plink = LINK_TO_TD(uhci, td);
    1014                 :            : 
    1015                 :            :                 uhci_add_td_to_urbp(td, urbp);
    1016                 :            :                 uhci_fill_td(uhci, td, status,
    1017                 :            :                                 destination | uhci_explen(0) |
    1018                 :            :                                         (toggle << TD_TOKEN_TOGGLE_SHIFT),
    1019                 :            :                                 data);
    1020                 :            :                 plink = &td->link;
    1021                 :            : 
    1022                 :            :                 toggle ^= 1;
    1023                 :            :         }
    1024                 :            : 
    1025                 :            :         /* Set the interrupt-on-completion flag on the last packet.
    1026                 :            :          * A more-or-less typical 4 KB URB (= size of one memory page)
    1027                 :            :          * will require about 3 ms to transfer; that's a little on the
    1028                 :            :          * fast side but not enough to justify delaying an interrupt
    1029                 :            :          * more than 2 or 3 URBs, so we will ignore the URB_NO_INTERRUPT
    1030                 :            :          * flag setting. */
    1031                 :            :         td->status |= cpu_to_hc32(uhci, TD_CTRL_IOC);
    1032                 :            : 
    1033                 :            :         /*
    1034                 :            :          * Build the new dummy TD and activate the old one
    1035                 :            :          */
    1036                 :            :         td = uhci_alloc_td(uhci);
    1037                 :            :         if (!td)
    1038                 :            :                 goto nomem;
    1039                 :            :         *plink = LINK_TO_TD(uhci, td);
    1040                 :            : 
    1041                 :            :         uhci_fill_td(uhci, td, 0, USB_PID_OUT | uhci_explen(0), 0);
    1042                 :            :         wmb();
    1043                 :            :         qh->dummy_td->status |= cpu_to_hc32(uhci, TD_CTRL_ACTIVE);
    1044                 :            :         qh->dummy_td = td;
    1045                 :            : 
    1046                 :            :         usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
    1047                 :            :                         usb_pipeout(urb->pipe), toggle);
    1048                 :            :         return 0;
    1049                 :            : 
    1050                 :            : nomem:
    1051                 :            :         /* Remove the dummy TD from the td_list so it doesn't get freed */
    1052                 :            :         uhci_remove_td_from_urbp(qh->dummy_td);
    1053                 :            :         return -ENOMEM;
    1054                 :            : }
    1055                 :            : 
    1056                 :          0 : static int uhci_submit_bulk(struct uhci_hcd *uhci, struct urb *urb,
    1057                 :            :                 struct uhci_qh *qh)
    1058                 :            : {
    1059                 :          0 :         int ret;
    1060                 :            : 
    1061                 :            :         /* Can't have low-speed bulk transfers */
    1062         [ #  # ]:          0 :         if (urb->dev->speed == USB_SPEED_LOW)
    1063                 :            :                 return -EINVAL;
    1064                 :            : 
    1065         [ #  # ]:          0 :         if (qh->state != QH_STATE_ACTIVE)
    1066                 :          0 :                 qh->skel = SKEL_BULK;
    1067                 :          0 :         ret = uhci_submit_common(uhci, urb, qh);
    1068         [ #  # ]:          0 :         if (ret == 0)
    1069                 :          0 :                 uhci_add_fsbr(uhci, urb);
    1070                 :            :         return ret;
    1071                 :            : }
    1072                 :            : 
    1073                 :          0 : static int uhci_submit_interrupt(struct uhci_hcd *uhci, struct urb *urb,
    1074                 :            :                 struct uhci_qh *qh)
    1075                 :            : {
    1076                 :          0 :         int ret;
    1077                 :            : 
    1078                 :            :         /* USB 1.1 interrupt transfers only involve one packet per interval.
    1079                 :            :          * Drivers can submit URBs of any length, but longer ones will need
    1080                 :            :          * multiple intervals to complete.
    1081                 :            :          */
    1082                 :            : 
    1083         [ #  # ]:          0 :         if (!qh->bandwidth_reserved) {
    1084                 :            :                 int exponent;
    1085                 :            : 
    1086                 :            :                 /* Figure out which power-of-two queue to use */
    1087         [ #  # ]:          0 :                 for (exponent = 7; exponent >= 0; --exponent) {
    1088         [ #  # ]:          0 :                         if ((1 << exponent) <= urb->interval)
    1089                 :            :                                 break;
    1090                 :            :                 }
    1091         [ #  # ]:          0 :                 if (exponent < 0)
    1092                 :            :                         return -EINVAL;
    1093                 :            : 
    1094                 :            :                 /* If the slot is full, try a lower period */
    1095                 :          0 :                 do {
    1096                 :          0 :                         qh->period = 1 << exponent;
    1097                 :          0 :                         qh->skel = SKEL_INDEX(exponent);
    1098                 :            : 
    1099                 :            :                         /* For now, interrupt phase is fixed by the layout
    1100                 :            :                          * of the QH lists.
    1101                 :            :                          */
    1102                 :          0 :                         qh->phase = (qh->period / 2) & (MAX_PHASE - 1);
    1103                 :          0 :                         ret = uhci_check_bandwidth(uhci, qh);
    1104   [ #  #  #  # ]:          0 :                 } while (ret != 0 && --exponent >= 0);
    1105         [ #  # ]:          0 :                 if (ret)
    1106                 :            :                         return ret;
    1107         [ #  # ]:          0 :         } else if (qh->period > urb->interval)
    1108                 :            :                 return -EINVAL;         /* Can't decrease the period */
    1109                 :            : 
    1110                 :          0 :         ret = uhci_submit_common(uhci, urb, qh);
    1111         [ #  # ]:          0 :         if (ret == 0) {
    1112                 :          0 :                 urb->interval = qh->period;
    1113         [ #  # ]:          0 :                 if (!qh->bandwidth_reserved)
    1114                 :          0 :                         uhci_reserve_bandwidth(uhci, qh);
    1115                 :            :         }
    1116                 :            :         return ret;
    1117                 :            : }
    1118                 :            : 
    1119                 :            : /*
    1120                 :            :  * Fix up the data structures following a short transfer
    1121                 :            :  */
    1122                 :          0 : static int uhci_fixup_short_transfer(struct uhci_hcd *uhci,
    1123                 :            :                 struct uhci_qh *qh, struct urb_priv *urbp)
    1124                 :            : {
    1125                 :          0 :         struct uhci_td *td;
    1126                 :          0 :         struct list_head *tmp;
    1127                 :          0 :         int ret;
    1128                 :            : 
    1129                 :          0 :         td = list_entry(urbp->td_list.prev, struct uhci_td, list);
    1130         [ #  # ]:          0 :         if (qh->type == USB_ENDPOINT_XFER_CONTROL) {
    1131                 :            : 
    1132                 :            :                 /* When a control transfer is short, we have to restart
    1133                 :            :                  * the queue at the status stage transaction, which is
    1134                 :            :                  * the last TD. */
    1135         [ #  # ]:          0 :                 WARN_ON(list_empty(&urbp->td_list));
    1136                 :          0 :                 qh->element = LINK_TO_TD(uhci, td);
    1137                 :          0 :                 tmp = td->list.prev;
    1138                 :          0 :                 ret = -EINPROGRESS;
    1139                 :            : 
    1140                 :            :         } else {
    1141                 :            : 
    1142                 :            :                 /* When a bulk/interrupt transfer is short, we have to
    1143                 :            :                  * fix up the toggles of the following URBs on the queue
    1144                 :            :                  * before restarting the queue at the next URB. */
    1145                 :          0 :                 qh->initial_toggle =
    1146                 :          0 :                         uhci_toggle(td_token(uhci, qh->post_td)) ^ 1;
    1147                 :          0 :                 uhci_fixup_toggles(uhci, qh, 1);
    1148                 :            : 
    1149         [ #  # ]:          0 :                 if (list_empty(&urbp->td_list))
    1150                 :          0 :                         td = qh->post_td;
    1151                 :          0 :                 qh->element = td->link;
    1152                 :          0 :                 tmp = urbp->td_list.prev;
    1153                 :          0 :                 ret = 0;
    1154                 :            :         }
    1155                 :            : 
    1156                 :            :         /* Remove all the TDs we skipped over, from tmp back to the start */
    1157         [ #  # ]:          0 :         while (tmp != &urbp->td_list) {
    1158                 :          0 :                 td = list_entry(tmp, struct uhci_td, list);
    1159                 :          0 :                 tmp = tmp->prev;
    1160                 :            : 
    1161                 :          0 :                 uhci_remove_td_from_urbp(td);
    1162                 :          0 :                 uhci_free_td(uhci, td);
    1163                 :            :         }
    1164                 :          0 :         return ret;
    1165                 :            : }
    1166                 :            : 
    1167                 :            : /*
    1168                 :            :  * Common result for control, bulk, and interrupt
    1169                 :            :  */
    1170                 :          0 : static int uhci_result_common(struct uhci_hcd *uhci, struct urb *urb)
    1171                 :            : {
    1172                 :          0 :         struct urb_priv *urbp = urb->hcpriv;
    1173                 :          0 :         struct uhci_qh *qh = urbp->qh;
    1174                 :          0 :         struct uhci_td *td, *tmp;
    1175                 :          0 :         unsigned status;
    1176                 :          0 :         int ret = 0;
    1177                 :            : 
    1178         [ #  # ]:          0 :         list_for_each_entry_safe(td, tmp, &urbp->td_list, list) {
    1179                 :          0 :                 unsigned int ctrlstat;
    1180                 :          0 :                 int len;
    1181                 :            : 
    1182         [ #  # ]:          0 :                 ctrlstat = td_status(uhci, td);
    1183                 :          0 :                 status = uhci_status_bits(ctrlstat);
    1184         [ #  # ]:          0 :                 if (status & TD_CTRL_ACTIVE)
    1185                 :            :                         return -EINPROGRESS;
    1186                 :            : 
    1187                 :          0 :                 len = uhci_actual_length(ctrlstat);
    1188                 :          0 :                 urb->actual_length += len;
    1189                 :            : 
    1190         [ #  # ]:          0 :                 if (status) {
    1191                 :          0 :                         ret = uhci_map_status(status,
    1192                 :          0 :                                         uhci_packetout(td_token(uhci, td)));
    1193                 :          0 :                         if ((debug == 1 && ret != -EPIPE) || debug > 1) {
    1194                 :            :                                 /* Some debugging code */
    1195                 :            :                                 dev_dbg(&urb->dev->dev,
    1196                 :            :                                                 "%s: failed with status %x\n",
    1197                 :            :                                                 __func__, status);
    1198                 :            : 
    1199                 :            :                                 if (debug > 1 && errbuf) {
    1200                 :            :                                         /* Print the chain for debugging */
    1201                 :            :                                         uhci_show_qh(uhci, urbp->qh, errbuf,
    1202                 :            :                                                 ERRBUF_LEN - EXTRA_SPACE, 0);
    1203                 :            :                                         lprintk(errbuf);
    1204                 :            :                                 }
    1205                 :            :                         }
    1206                 :            : 
    1207                 :            :                 /* Did we receive a short packet? */
    1208         [ #  # ]:          0 :                 } else if (len < uhci_expected_length(td_token(uhci, td))) {
    1209                 :            : 
    1210                 :            :                         /* For control transfers, go to the status TD if
    1211                 :            :                          * this isn't already the last data TD */
    1212         [ #  # ]:          0 :                         if (qh->type == USB_ENDPOINT_XFER_CONTROL) {
    1213         [ #  # ]:          0 :                                 if (td->list.next != urbp->td_list.prev)
    1214                 :          0 :                                         ret = 1;
    1215                 :            :                         }
    1216                 :            : 
    1217                 :            :                         /* For bulk and interrupt, this may be an error */
    1218         [ #  # ]:          0 :                         else if (urb->transfer_flags & URB_SHORT_NOT_OK)
    1219                 :            :                                 ret = -EREMOTEIO;
    1220                 :            : 
    1221                 :            :                         /* Fixup needed only if this isn't the URB's last TD */
    1222         [ #  # ]:          0 :                         else if (&td->list != urbp->td_list.prev)
    1223                 :          0 :                                 ret = 1;
    1224                 :            :                 }
    1225                 :            : 
    1226         [ #  # ]:          0 :                 uhci_remove_td_from_urbp(td);
    1227         [ #  # ]:          0 :                 if (qh->post_td)
    1228                 :          0 :                         uhci_free_td(uhci, qh->post_td);
    1229                 :          0 :                 qh->post_td = td;
    1230                 :            : 
    1231         [ #  # ]:          0 :                 if (ret != 0)
    1232                 :          0 :                         goto err;
    1233                 :            :         }
    1234                 :            :         return ret;
    1235                 :            : 
    1236                 :            : err:
    1237         [ #  # ]:          0 :         if (ret < 0) {
    1238                 :            :                 /* Note that the queue has stopped and save
    1239                 :            :                  * the next toggle value */
    1240                 :          0 :                 qh->element = UHCI_PTR_TERM(uhci);
    1241                 :          0 :                 qh->is_stopped = 1;
    1242                 :          0 :                 qh->needs_fixup = (qh->type != USB_ENDPOINT_XFER_CONTROL);
    1243                 :          0 :                 qh->initial_toggle = uhci_toggle(td_token(uhci, td)) ^
    1244                 :          0 :                                 (ret == -EREMOTEIO);
    1245                 :            : 
    1246                 :            :         } else          /* Short packet received */
    1247                 :          0 :                 ret = uhci_fixup_short_transfer(uhci, qh, urbp);
    1248                 :            :         return ret;
    1249                 :            : }
    1250                 :            : 
    1251                 :            : /*
    1252                 :            :  * Isochronous transfers
    1253                 :            :  */
    1254                 :          0 : static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb,
    1255                 :            :                 struct uhci_qh *qh)
    1256                 :            : {
    1257                 :          0 :         struct uhci_td *td = NULL;      /* Since urb->number_of_packets > 0 */
    1258                 :          0 :         int i;
    1259                 :          0 :         unsigned frame, next;
    1260                 :          0 :         unsigned long destination, status;
    1261                 :          0 :         struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv;
    1262                 :            : 
    1263                 :            :         /* Values must not be too big (could overflow below) */
    1264         [ #  # ]:          0 :         if (urb->interval >= UHCI_NUMFRAMES ||
    1265         [ #  # ]:          0 :                         urb->number_of_packets >= UHCI_NUMFRAMES)
    1266                 :            :                 return -EFBIG;
    1267                 :            : 
    1268         [ #  # ]:          0 :         uhci_get_current_frame_number(uhci);
    1269                 :            : 
    1270                 :            :         /* Check the period and figure out the starting frame number */
    1271         [ #  # ]:          0 :         if (!qh->bandwidth_reserved) {
    1272                 :          0 :                 qh->period = urb->interval;
    1273                 :          0 :                 qh->phase = -1;              /* Find the best phase */
    1274                 :          0 :                 i = uhci_check_bandwidth(uhci, qh);
    1275         [ #  # ]:          0 :                 if (i)
    1276                 :            :                         return i;
    1277                 :            : 
    1278                 :            :                 /* Allow a little time to allocate the TDs */
    1279                 :          0 :                 next = uhci->frame_number + 10;
    1280                 :          0 :                 frame = qh->phase;
    1281                 :            : 
    1282                 :            :                 /* Round up to the first available slot */
    1283                 :          0 :                 frame += (next - frame + qh->period - 1) & -qh->period;
    1284                 :            : 
    1285         [ #  # ]:          0 :         } else if (qh->period != urb->interval) {
    1286                 :            :                 return -EINVAL;         /* Can't change the period */
    1287                 :            : 
    1288                 :            :         } else {
    1289                 :          0 :                 next = uhci->frame_number + 1;
    1290                 :            : 
    1291                 :            :                 /* Find the next unused frame */
    1292         [ #  # ]:          0 :                 if (list_empty(&qh->queue)) {
    1293                 :          0 :                         frame = qh->iso_frame;
    1294                 :            :                 } else {
    1295                 :          0 :                         struct urb *lurb;
    1296                 :            : 
    1297                 :          0 :                         lurb = list_entry(qh->queue.prev,
    1298                 :            :                                         struct urb_priv, node)->urb;
    1299                 :          0 :                         frame = lurb->start_frame +
    1300                 :          0 :                                         lurb->number_of_packets *
    1301                 :          0 :                                         lurb->interval;
    1302                 :            :                 }
    1303                 :            : 
    1304                 :            :                 /* Fell behind? */
    1305         [ #  # ]:          0 :                 if (!uhci_frame_before_eq(next, frame)) {
    1306                 :            : 
    1307                 :            :                         /* USB_ISO_ASAP: Round up to the first available slot */
    1308         [ #  # ]:          0 :                         if (urb->transfer_flags & URB_ISO_ASAP)
    1309                 :          0 :                                 frame += (next - frame + qh->period - 1) &
    1310                 :          0 :                                                 -qh->period;
    1311                 :            : 
    1312                 :            :                         /*
    1313                 :            :                          * Not ASAP: Use the next slot in the stream,
    1314                 :            :                          * no matter what.
    1315                 :            :                          */
    1316                 :            :                         else if (!uhci_frame_before_eq(next,
    1317                 :            :                                         frame + (urb->number_of_packets - 1) *
    1318                 :            :                                                 qh->period))
    1319                 :            :                                 dev_dbg(uhci_dev(uhci), "iso underrun %p (%u+%u < %u)\n",
    1320                 :            :                                                 urb, frame,
    1321                 :            :                                                 (urb->number_of_packets - 1) *
    1322                 :            :                                                         qh->period,
    1323                 :            :                                                 next);
    1324                 :            :                 }
    1325                 :            :         }
    1326                 :            : 
    1327                 :            :         /* Make sure we won't have to go too far into the future */
    1328         [ #  # ]:          0 :         if (uhci_frame_before_eq(uhci->last_iso_frame + UHCI_NUMFRAMES,
    1329                 :            :                         frame + urb->number_of_packets * urb->interval))
    1330                 :            :                 return -EFBIG;
    1331                 :          0 :         urb->start_frame = frame;
    1332                 :            : 
    1333                 :          0 :         status = TD_CTRL_ACTIVE | TD_CTRL_IOS;
    1334         [ #  # ]:          0 :         destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe);
    1335                 :            : 
    1336         [ #  # ]:          0 :         for (i = 0; i < urb->number_of_packets; i++) {
    1337                 :          0 :                 td = uhci_alloc_td(uhci);
    1338         [ #  # ]:          0 :                 if (!td)
    1339                 :            :                         return -ENOMEM;
    1340                 :            : 
    1341                 :          0 :                 uhci_add_td_to_urbp(td, urbp);
    1342                 :          0 :                 uhci_fill_td(uhci, td, status, destination |
    1343                 :          0 :                                 uhci_explen(urb->iso_frame_desc[i].length),
    1344                 :          0 :                                 urb->transfer_dma +
    1345                 :          0 :                                         urb->iso_frame_desc[i].offset);
    1346                 :            :         }
    1347                 :            : 
    1348                 :            :         /* Set the interrupt-on-completion flag on the last packet. */
    1349                 :          0 :         td->status |= cpu_to_hc32(uhci, TD_CTRL_IOC);
    1350                 :            : 
    1351                 :            :         /* Add the TDs to the frame list */
    1352                 :          0 :         frame = urb->start_frame;
    1353         [ #  # ]:          0 :         list_for_each_entry(td, &urbp->td_list, list) {
    1354                 :          0 :                 uhci_insert_td_in_frame_list(uhci, td, frame);
    1355                 :          0 :                 frame += qh->period;
    1356                 :            :         }
    1357                 :            : 
    1358         [ #  # ]:          0 :         if (list_empty(&qh->queue)) {
    1359                 :          0 :                 qh->iso_packet_desc = &urb->iso_frame_desc[0];
    1360                 :          0 :                 qh->iso_frame = urb->start_frame;
    1361                 :            :         }
    1362                 :            : 
    1363                 :          0 :         qh->skel = SKEL_ISO;
    1364         [ #  # ]:          0 :         if (!qh->bandwidth_reserved)
    1365                 :          0 :                 uhci_reserve_bandwidth(uhci, qh);
    1366                 :            :         return 0;
    1367                 :            : }
    1368                 :            : 
    1369                 :          0 : static int uhci_result_isochronous(struct uhci_hcd *uhci, struct urb *urb)
    1370                 :            : {
    1371                 :          0 :         struct uhci_td *td, *tmp;
    1372                 :          0 :         struct urb_priv *urbp = urb->hcpriv;
    1373                 :          0 :         struct uhci_qh *qh = urbp->qh;
    1374                 :            : 
    1375         [ #  # ]:          0 :         list_for_each_entry_safe(td, tmp, &urbp->td_list, list) {
    1376                 :          0 :                 unsigned int ctrlstat;
    1377                 :          0 :                 int status;
    1378                 :          0 :                 int actlength;
    1379                 :            : 
    1380         [ #  # ]:          0 :                 if (uhci_frame_before_eq(uhci->cur_iso_frame, qh->iso_frame))
    1381                 :            :                         return -EINPROGRESS;
    1382                 :            : 
    1383                 :          0 :                 uhci_remove_tds_from_frame(uhci, qh->iso_frame);
    1384                 :            : 
    1385         [ #  # ]:          0 :                 ctrlstat = td_status(uhci, td);
    1386         [ #  # ]:          0 :                 if (ctrlstat & TD_CTRL_ACTIVE) {
    1387                 :            :                         status = -EXDEV;        /* TD was added too late? */
    1388                 :            :                 } else {
    1389                 :          0 :                         status = uhci_map_status(uhci_status_bits(ctrlstat),
    1390                 :          0 :                                         usb_pipeout(urb->pipe));
    1391                 :          0 :                         actlength = uhci_actual_length(ctrlstat);
    1392                 :            : 
    1393                 :          0 :                         urb->actual_length += actlength;
    1394                 :          0 :                         qh->iso_packet_desc->actual_length = actlength;
    1395                 :          0 :                         qh->iso_packet_desc->status = status;
    1396                 :            :                 }
    1397         [ #  # ]:          0 :                 if (status)
    1398                 :          0 :                         urb->error_count++;
    1399                 :            : 
    1400                 :          0 :                 uhci_remove_td_from_urbp(td);
    1401                 :          0 :                 uhci_free_td(uhci, td);
    1402                 :          0 :                 qh->iso_frame += qh->period;
    1403                 :          0 :                 ++qh->iso_packet_desc;
    1404                 :            :         }
    1405                 :            :         return 0;
    1406                 :            : }
    1407                 :            : 
    1408                 :          0 : static int uhci_urb_enqueue(struct usb_hcd *hcd,
    1409                 :            :                 struct urb *urb, gfp_t mem_flags)
    1410                 :            : {
    1411                 :          0 :         int ret;
    1412                 :          0 :         struct uhci_hcd *uhci = hcd_to_uhci(hcd);
    1413                 :          0 :         unsigned long flags;
    1414                 :          0 :         struct urb_priv *urbp;
    1415                 :          0 :         struct uhci_qh *qh;
    1416                 :            : 
    1417                 :          0 :         spin_lock_irqsave(&uhci->lock, flags);
    1418                 :            : 
    1419                 :          0 :         ret = usb_hcd_link_urb_to_ep(hcd, urb);
    1420         [ #  # ]:          0 :         if (ret)
    1421                 :          0 :                 goto done_not_linked;
    1422                 :            : 
    1423                 :          0 :         ret = -ENOMEM;
    1424                 :          0 :         urbp = uhci_alloc_urb_priv(uhci, urb);
    1425         [ #  # ]:          0 :         if (!urbp)
    1426                 :          0 :                 goto done;
    1427                 :            : 
    1428         [ #  # ]:          0 :         if (urb->ep->hcpriv)
    1429                 :            :                 qh = urb->ep->hcpriv;
    1430                 :            :         else {
    1431                 :          0 :                 qh = uhci_alloc_qh(uhci, urb->dev, urb->ep);
    1432         [ #  # ]:          0 :                 if (!qh)
    1433                 :          0 :                         goto err_no_qh;
    1434                 :            :         }
    1435                 :          0 :         urbp->qh = qh;
    1436                 :            : 
    1437   [ #  #  #  #  :          0 :         switch (qh->type) {
                      # ]
    1438                 :          0 :         case USB_ENDPOINT_XFER_CONTROL:
    1439                 :          0 :                 ret = uhci_submit_control(uhci, urb, qh);
    1440                 :          0 :                 break;
    1441                 :          0 :         case USB_ENDPOINT_XFER_BULK:
    1442                 :          0 :                 ret = uhci_submit_bulk(uhci, urb, qh);
    1443                 :          0 :                 break;
    1444                 :          0 :         case USB_ENDPOINT_XFER_INT:
    1445                 :          0 :                 ret = uhci_submit_interrupt(uhci, urb, qh);
    1446                 :          0 :                 break;
    1447                 :          0 :         case USB_ENDPOINT_XFER_ISOC:
    1448                 :          0 :                 urb->error_count = 0;
    1449                 :          0 :                 ret = uhci_submit_isochronous(uhci, urb, qh);
    1450                 :          0 :                 break;
    1451                 :            :         }
    1452         [ #  # ]:          0 :         if (ret != 0)
    1453                 :          0 :                 goto err_submit_failed;
    1454                 :            : 
    1455                 :            :         /* Add this URB to the QH */
    1456         [ #  # ]:          0 :         list_add_tail(&urbp->node, &qh->queue);
    1457                 :            : 
    1458                 :            :         /* If the new URB is the first and only one on this QH then either
    1459                 :            :          * the QH is new and idle or else it's unlinked and waiting to
    1460                 :            :          * become idle, so we can activate it right away.  But only if the
    1461                 :            :          * queue isn't stopped. */
    1462   [ #  #  #  # ]:          0 :         if (qh->queue.next == &urbp->node && !qh->is_stopped) {
    1463                 :          0 :                 uhci_activate_qh(uhci, qh);
    1464                 :          0 :                 uhci_urbp_wants_fsbr(uhci, urbp);
    1465                 :            :         }
    1466                 :          0 :         goto done;
    1467                 :            : 
    1468                 :            : err_submit_failed:
    1469         [ #  # ]:          0 :         if (qh->state == QH_STATE_IDLE)
    1470                 :          0 :                 uhci_make_qh_idle(uhci, qh);    /* Reclaim unused QH */
    1471                 :          0 : err_no_qh:
    1472                 :          0 :         uhci_free_urb_priv(uhci, urbp);
    1473                 :          0 : done:
    1474         [ #  # ]:          0 :         if (ret)
    1475                 :          0 :                 usb_hcd_unlink_urb_from_ep(hcd, urb);
    1476                 :          0 : done_not_linked:
    1477                 :          0 :         spin_unlock_irqrestore(&uhci->lock, flags);
    1478                 :          0 :         return ret;
    1479                 :            : }
    1480                 :            : 
    1481                 :          0 : static int uhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
    1482                 :            : {
    1483                 :          0 :         struct uhci_hcd *uhci = hcd_to_uhci(hcd);
    1484                 :          0 :         unsigned long flags;
    1485                 :          0 :         struct uhci_qh *qh;
    1486                 :          0 :         int rc;
    1487                 :            : 
    1488                 :          0 :         spin_lock_irqsave(&uhci->lock, flags);
    1489                 :          0 :         rc = usb_hcd_check_unlink_urb(hcd, urb, status);
    1490         [ #  # ]:          0 :         if (rc)
    1491                 :          0 :                 goto done;
    1492                 :            : 
    1493                 :          0 :         qh = ((struct urb_priv *) urb->hcpriv)->qh;
    1494                 :            : 
    1495                 :            :         /* Remove Isochronous TDs from the frame list ASAP */
    1496         [ #  # ]:          0 :         if (qh->type == USB_ENDPOINT_XFER_ISOC) {
    1497                 :          0 :                 uhci_unlink_isochronous_tds(uhci, urb);
    1498                 :          0 :                 mb();
    1499                 :            : 
    1500                 :            :                 /* If the URB has already started, update the QH unlink time */
    1501         [ #  # ]:          0 :                 uhci_get_current_frame_number(uhci);
    1502         [ #  # ]:          0 :                 if (uhci_frame_before_eq(urb->start_frame, uhci->frame_number))
    1503                 :          0 :                         qh->unlink_frame = uhci->frame_number;
    1504                 :            :         }
    1505                 :            : 
    1506                 :          0 :         uhci_unlink_qh(uhci, qh);
    1507                 :            : 
    1508                 :          0 : done:
    1509                 :          0 :         spin_unlock_irqrestore(&uhci->lock, flags);
    1510                 :          0 :         return rc;
    1511                 :            : }
    1512                 :            : 
    1513                 :            : /*
    1514                 :            :  * Finish unlinking an URB and give it back
    1515                 :            :  */
    1516                 :          0 : static void uhci_giveback_urb(struct uhci_hcd *uhci, struct uhci_qh *qh,
    1517                 :            :                 struct urb *urb, int status)
    1518                 :            : __releases(uhci->lock)
    1519                 :            : __acquires(uhci->lock)
    1520                 :            : {
    1521                 :          0 :         struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv;
    1522                 :            : 
    1523         [ #  # ]:          0 :         if (qh->type == USB_ENDPOINT_XFER_CONTROL) {
    1524                 :            : 
    1525                 :            :                 /* Subtract off the length of the SETUP packet from
    1526                 :            :                  * urb->actual_length.
    1527                 :            :                  */
    1528                 :          0 :                 urb->actual_length -= min_t(u32, 8, urb->actual_length);
    1529                 :            :         }
    1530                 :            : 
    1531                 :            :         /* When giving back the first URB in an Isochronous queue,
    1532                 :            :          * reinitialize the QH's iso-related members for the next URB. */
    1533         [ #  # ]:          0 :         else if (qh->type == USB_ENDPOINT_XFER_ISOC &&
    1534         [ #  # ]:          0 :                         urbp->node.prev == &qh->queue &&
    1535         [ #  # ]:          0 :                         urbp->node.next != &qh->queue) {
    1536                 :          0 :                 struct urb *nurb = list_entry(urbp->node.next,
    1537                 :            :                                 struct urb_priv, node)->urb;
    1538                 :            : 
    1539                 :          0 :                 qh->iso_packet_desc = &nurb->iso_frame_desc[0];
    1540                 :          0 :                 qh->iso_frame = nurb->start_frame;
    1541                 :            :         }
    1542                 :            : 
    1543                 :            :         /* Take the URB off the QH's queue.  If the queue is now empty,
    1544                 :            :          * this is a perfect time for a toggle fixup. */
    1545         [ #  # ]:          0 :         list_del_init(&urbp->node);
    1546   [ #  #  #  # ]:          0 :         if (list_empty(&qh->queue) && qh->needs_fixup) {
    1547                 :          0 :                 usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
    1548                 :            :                                 usb_pipeout(urb->pipe), qh->initial_toggle);
    1549                 :          0 :                 qh->needs_fixup = 0;
    1550                 :            :         }
    1551                 :            : 
    1552                 :          0 :         uhci_free_urb_priv(uhci, urbp);
    1553                 :          0 :         usb_hcd_unlink_urb_from_ep(uhci_to_hcd(uhci), urb);
    1554                 :            : 
    1555                 :          0 :         spin_unlock(&uhci->lock);
    1556                 :          0 :         usb_hcd_giveback_urb(uhci_to_hcd(uhci), urb, status);
    1557                 :          0 :         spin_lock(&uhci->lock);
    1558                 :            : 
    1559                 :            :         /* If the queue is now empty, we can unlink the QH and give up its
    1560                 :            :          * reserved bandwidth. */
    1561         [ #  # ]:          0 :         if (list_empty(&qh->queue)) {
    1562                 :          0 :                 uhci_unlink_qh(uhci, qh);
    1563         [ #  # ]:          0 :                 if (qh->bandwidth_reserved)
    1564                 :          0 :                         uhci_release_bandwidth(uhci, qh);
    1565                 :            :         }
    1566                 :          0 : }
    1567                 :            : 
    1568                 :            : /*
    1569                 :            :  * Scan the URBs in a QH's queue
    1570                 :            :  */
    1571                 :            : #define QH_FINISHED_UNLINKING(qh)                       \
    1572                 :            :                 (qh->state == QH_STATE_UNLINKING &&  \
    1573                 :            :                 uhci->frame_number + uhci->is_stopped != qh->unlink_frame)
    1574                 :            : 
    1575                 :          0 : static void uhci_scan_qh(struct uhci_hcd *uhci, struct uhci_qh *qh)
    1576                 :            : {
    1577                 :          0 :         struct urb_priv *urbp;
    1578                 :          0 :         struct urb *urb;
    1579                 :          0 :         int status;
    1580                 :            : 
    1581         [ #  # ]:          0 :         while (!list_empty(&qh->queue)) {
    1582                 :          0 :                 urbp = list_entry(qh->queue.next, struct urb_priv, node);
    1583                 :          0 :                 urb = urbp->urb;
    1584                 :            : 
    1585         [ #  # ]:          0 :                 if (qh->type == USB_ENDPOINT_XFER_ISOC)
    1586                 :          0 :                         status = uhci_result_isochronous(uhci, urb);
    1587                 :            :                 else
    1588                 :          0 :                         status = uhci_result_common(uhci, urb);
    1589         [ #  # ]:          0 :                 if (status == -EINPROGRESS)
    1590                 :            :                         break;
    1591                 :            : 
    1592                 :            :                 /* Dequeued but completed URBs can't be given back unless
    1593                 :            :                  * the QH is stopped or has finished unlinking. */
    1594         [ #  # ]:          0 :                 if (urb->unlinked) {
    1595   [ #  #  #  # ]:          0 :                         if (QH_FINISHED_UNLINKING(qh))
    1596                 :          0 :                                 qh->is_stopped = 1;
    1597         [ #  # ]:          0 :                         else if (!qh->is_stopped)
    1598                 :            :                                 return;
    1599                 :            :                 }
    1600                 :            : 
    1601                 :          0 :                 uhci_giveback_urb(uhci, qh, urb, status);
    1602         [ #  # ]:          0 :                 if (status < 0)
    1603                 :            :                         break;
    1604                 :            :         }
    1605                 :            : 
    1606                 :            :         /* If the QH is neither stopped nor finished unlinking (normal case),
    1607                 :            :          * our work here is done. */
    1608   [ #  #  #  # ]:          0 :         if (QH_FINISHED_UNLINKING(qh))
    1609                 :          0 :                 qh->is_stopped = 1;
    1610         [ #  # ]:          0 :         else if (!qh->is_stopped)
    1611                 :            :                 return;
    1612                 :            : 
    1613                 :            :         /* Otherwise give back each of the dequeued URBs */
    1614                 :          0 : restart:
    1615         [ #  # ]:          0 :         list_for_each_entry(urbp, &qh->queue, node) {
    1616                 :          0 :                 urb = urbp->urb;
    1617         [ #  # ]:          0 :                 if (urb->unlinked) {
    1618                 :            : 
    1619                 :            :                         /* Fix up the TD links and save the toggles for
    1620                 :            :                          * non-Isochronous queues.  For Isochronous queues,
    1621                 :            :                          * test for too-recent dequeues. */
    1622         [ #  # ]:          0 :                         if (!uhci_cleanup_queue(uhci, qh, urb)) {
    1623                 :          0 :                                 qh->is_stopped = 0;
    1624                 :          0 :                                 return;
    1625                 :            :                         }
    1626                 :          0 :                         uhci_giveback_urb(uhci, qh, urb, 0);
    1627                 :          0 :                         goto restart;
    1628                 :            :                 }
    1629                 :            :         }
    1630                 :          0 :         qh->is_stopped = 0;
    1631                 :            : 
    1632                 :            :         /* There are no more dequeued URBs.  If there are still URBs on the
    1633                 :            :          * queue, the QH can now be re-activated. */
    1634         [ #  # ]:          0 :         if (!list_empty(&qh->queue)) {
    1635         [ #  # ]:          0 :                 if (qh->needs_fixup)
    1636                 :          0 :                         uhci_fixup_toggles(uhci, qh, 0);
    1637                 :            : 
    1638                 :            :                 /* If the first URB on the queue wants FSBR but its time
    1639                 :            :                  * limit has expired, set the next TD to interrupt on
    1640                 :            :                  * completion before reactivating the QH. */
    1641                 :          0 :                 urbp = list_entry(qh->queue.next, struct urb_priv, node);
    1642   [ #  #  #  # ]:          0 :                 if (urbp->fsbr && qh->wait_expired) {
    1643                 :          0 :                         struct uhci_td *td = list_entry(urbp->td_list.next,
    1644                 :            :                                         struct uhci_td, list);
    1645                 :            : 
    1646                 :          0 :                         td->status |= cpu_to_hc32(uhci, TD_CTRL_IOC);
    1647                 :            :                 }
    1648                 :            : 
    1649                 :          0 :                 uhci_activate_qh(uhci, qh);
    1650                 :            :         }
    1651                 :            : 
    1652                 :            :         /* The queue is empty.  The QH can become idle if it is fully
    1653                 :            :          * unlinked. */
    1654   [ #  #  #  # ]:          0 :         else if (QH_FINISHED_UNLINKING(qh))
    1655                 :          0 :                 uhci_make_qh_idle(uhci, qh);
    1656                 :            : }
    1657                 :            : 
    1658                 :            : /*
    1659                 :            :  * Check for queues that have made some forward progress.
    1660                 :            :  * Returns 0 if the queue is not Isochronous, is ACTIVE, and
    1661                 :            :  * has not advanced since last examined; 1 otherwise.
    1662                 :            :  *
    1663                 :            :  * Early Intel controllers have a bug which causes qh->element sometimes
    1664                 :            :  * not to advance when a TD completes successfully.  The queue remains
    1665                 :            :  * stuck on the inactive completed TD.  We detect such cases and advance
    1666                 :            :  * the element pointer by hand.
    1667                 :            :  */
    1668                 :          0 : static int uhci_advance_check(struct uhci_hcd *uhci, struct uhci_qh *qh)
    1669                 :            : {
    1670                 :          0 :         struct urb_priv *urbp = NULL;
    1671                 :          0 :         struct uhci_td *td;
    1672                 :          0 :         int ret = 1;
    1673                 :          0 :         unsigned status;
    1674                 :            : 
    1675         [ #  # ]:          0 :         if (qh->type == USB_ENDPOINT_XFER_ISOC)
    1676                 :          0 :                 goto done;
    1677                 :            : 
    1678                 :            :         /* Treat an UNLINKING queue as though it hasn't advanced.
    1679                 :            :          * This is okay because reactivation will treat it as though
    1680                 :            :          * it has advanced, and if it is going to become IDLE then
    1681                 :            :          * this doesn't matter anyway.  Furthermore it's possible
    1682                 :            :          * for an UNLINKING queue not to have any URBs at all, or
    1683                 :            :          * for its first URB not to have any TDs (if it was dequeued
    1684                 :            :          * just as it completed).  So it's not easy in any case to
    1685                 :            :          * test whether such queues have advanced. */
    1686         [ #  # ]:          0 :         if (qh->state != QH_STATE_ACTIVE) {
    1687                 :            :                 urbp = NULL;
    1688                 :            :                 status = 0;
    1689                 :            : 
    1690                 :            :         } else {
    1691                 :          0 :                 urbp = list_entry(qh->queue.next, struct urb_priv, node);
    1692                 :          0 :                 td = list_entry(urbp->td_list.next, struct uhci_td, list);
    1693         [ #  # ]:          0 :                 status = td_status(uhci, td);
    1694         [ #  # ]:          0 :                 if (!(status & TD_CTRL_ACTIVE)) {
    1695                 :            : 
    1696                 :            :                         /* We're okay, the queue has advanced */
    1697                 :          0 :                         qh->wait_expired = 0;
    1698                 :          0 :                         qh->advance_jiffies = jiffies;
    1699                 :          0 :                         goto done;
    1700                 :            :                 }
    1701                 :          0 :                 ret = uhci->is_stopped;
    1702                 :            :         }
    1703                 :            : 
    1704                 :            :         /* The queue hasn't advanced; check for timeout */
    1705         [ #  # ]:          0 :         if (qh->wait_expired)
    1706                 :          0 :                 goto done;
    1707                 :            : 
    1708         [ #  # ]:          0 :         if (time_after(jiffies, qh->advance_jiffies + QH_WAIT_TIMEOUT)) {
    1709                 :            : 
    1710                 :            :                 /* Detect the Intel bug and work around it */
    1711   [ #  #  #  # ]:          0 :                 if (qh->post_td && qh_element(qh) ==
    1712         [ #  # ]:          0 :                         LINK_TO_TD(uhci, qh->post_td)) {
    1713                 :          0 :                         qh->element = qh->post_td->link;
    1714                 :          0 :                         qh->advance_jiffies = jiffies;
    1715                 :          0 :                         ret = 1;
    1716                 :          0 :                         goto done;
    1717                 :            :                 }
    1718                 :            : 
    1719                 :          0 :                 qh->wait_expired = 1;
    1720                 :            : 
    1721                 :            :                 /* If the current URB wants FSBR, unlink it temporarily
    1722                 :            :                  * so that we can safely set the next TD to interrupt on
    1723                 :            :                  * completion.  That way we'll know as soon as the queue
    1724                 :            :                  * starts moving again. */
    1725   [ #  #  #  #  :          0 :                 if (urbp && urbp->fsbr && !(status & TD_CTRL_IOC))
                   #  # ]
    1726                 :          0 :                         uhci_unlink_qh(uhci, qh);
    1727                 :            : 
    1728                 :            :         } else {
    1729                 :            :                 /* Unmoving but not-yet-expired queues keep FSBR alive */
    1730         [ #  # ]:          0 :                 if (urbp)
    1731                 :          0 :                         uhci_urbp_wants_fsbr(uhci, urbp);
    1732                 :            :         }
    1733                 :            : 
    1734                 :          0 : done:
    1735                 :          0 :         return ret;
    1736                 :            : }
    1737                 :            : 
    1738                 :            : /*
    1739                 :            :  * Process events in the schedule, but only in one thread at a time
    1740                 :            :  */
    1741                 :          0 : static void uhci_scan_schedule(struct uhci_hcd *uhci)
    1742                 :            : {
    1743                 :          0 :         int i;
    1744                 :          0 :         struct uhci_qh *qh;
    1745                 :            : 
    1746                 :            :         /* Don't allow re-entrant calls */
    1747         [ #  # ]:          0 :         if (uhci->scan_in_progress) {
    1748                 :          0 :                 uhci->need_rescan = 1;
    1749                 :          0 :                 return;
    1750                 :            :         }
    1751                 :          0 :         uhci->scan_in_progress = 1;
    1752                 :          0 : rescan:
    1753                 :          0 :         uhci->need_rescan = 0;
    1754                 :          0 :         uhci->fsbr_is_wanted = 0;
    1755                 :            : 
    1756         [ #  # ]:          0 :         uhci_clear_next_interrupt(uhci);
    1757         [ #  # ]:          0 :         uhci_get_current_frame_number(uhci);
    1758                 :          0 :         uhci->cur_iso_frame = uhci->frame_number;
    1759                 :            : 
    1760                 :            :         /* Go through all the QH queues and process the URBs in each one */
    1761         [ #  # ]:          0 :         for (i = 0; i < UHCI_NUM_SKELQH - 1; ++i) {
    1762                 :          0 :                 uhci->next_qh = list_entry(uhci->skelqh[i]->node.next,
    1763                 :            :                                 struct uhci_qh, node);
    1764         [ #  # ]:          0 :                 while ((qh = uhci->next_qh) != uhci->skelqh[i]) {
    1765                 :          0 :                         uhci->next_qh = list_entry(qh->node.next,
    1766                 :            :                                         struct uhci_qh, node);
    1767                 :            : 
    1768         [ #  # ]:          0 :                         if (uhci_advance_check(uhci, qh)) {
    1769                 :          0 :                                 uhci_scan_qh(uhci, qh);
    1770         [ #  # ]:          0 :                                 if (qh->state == QH_STATE_ACTIVE) {
    1771                 :          0 :                                         uhci_urbp_wants_fsbr(uhci,
    1772                 :          0 :         list_entry(qh->queue.next, struct urb_priv, node));
    1773                 :            :                                 }
    1774                 :            :                         }
    1775                 :            :                 }
    1776                 :            :         }
    1777                 :            : 
    1778                 :          0 :         uhci->last_iso_frame = uhci->cur_iso_frame;
    1779         [ #  # ]:          0 :         if (uhci->need_rescan)
    1780                 :          0 :                 goto rescan;
    1781                 :          0 :         uhci->scan_in_progress = 0;
    1782                 :            : 
    1783         [ #  # ]:          0 :         if (uhci->fsbr_is_on && !uhci->fsbr_is_wanted &&
    1784                 :            :                         !uhci->fsbr_expiring) {
    1785                 :          0 :                 uhci->fsbr_expiring = 1;
    1786                 :          0 :                 mod_timer(&uhci->fsbr_timer, jiffies + FSBR_OFF_DELAY);
    1787                 :            :         }
    1788                 :            : 
    1789         [ #  # ]:          0 :         if (list_empty(&uhci->skel_unlink_qh->node))
    1790                 :          0 :                 uhci_clear_next_interrupt(uhci);
    1791                 :            :         else
    1792                 :          0 :                 uhci_set_next_interrupt(uhci);
    1793                 :            : }

Generated by: LCOV version 1.14