LCOV - code coverage report
Current view: top level - drivers/usb/host - ehci-hub.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 0 565 0.0 %
Date: 2022-03-28 16:04:14 Functions: 0 12 0.0 %
Branches: 0 396 0.0 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0+
       2                 :            : /*
       3                 :            :  * Copyright (C) 2001-2004 by David Brownell
       4                 :            :  */
       5                 :            : 
       6                 :            : /* this file is part of ehci-hcd.c */
       7                 :            : 
       8                 :            : /*-------------------------------------------------------------------------*/
       9                 :            : 
      10                 :            : /*
      11                 :            :  * EHCI Root Hub ... the nonsharable stuff
      12                 :            :  *
      13                 :            :  * Registers don't need cpu_to_le32, that happens transparently
      14                 :            :  */
      15                 :            : 
      16                 :            : /*-------------------------------------------------------------------------*/
      17                 :            : #include <linux/usb/otg.h>
      18                 :            : 
      19                 :            : #define PORT_WAKE_BITS  (PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E)
      20                 :            : 
      21                 :            : #ifdef  CONFIG_PM
      22                 :            : 
      23                 :            : static void unlink_empty_async_suspended(struct ehci_hcd *ehci);
      24                 :            : 
      25                 :          0 : static int persist_enabled_on_companion(struct usb_device *udev, void *unused)
      26                 :            : {
      27   [ #  #  #  # ]:          0 :         return !udev->maxchild && udev->persist_enabled &&
      28         [ #  # ]:          0 :                 udev->bus->root_hub->speed < USB_SPEED_HIGH;
      29                 :            : }
      30                 :            : 
      31                 :            : /* After a power loss, ports that were owned by the companion must be
      32                 :            :  * reset so that the companion can still own them.
      33                 :            :  */
      34                 :          0 : static void ehci_handover_companion_ports(struct ehci_hcd *ehci)
      35                 :            : {
      36                 :          0 :         u32 __iomem     *reg;
      37                 :          0 :         u32             status;
      38                 :          0 :         int             port;
      39                 :          0 :         __le32          buf;
      40         [ #  # ]:          0 :         struct usb_hcd  *hcd = ehci_to_hcd(ehci);
      41                 :            : 
      42         [ #  # ]:          0 :         if (!ehci->owned_ports)
      43                 :          0 :                 return;
      44                 :            : 
      45                 :            :         /*
      46                 :            :          * USB 1.1 devices are mostly HIDs, which don't need to persist across
      47                 :            :          * suspends. If we ensure that none of our companion's devices have
      48                 :            :          * persist_enabled (by looking through all USB 1.1 buses in the system),
      49                 :            :          * we can skip this and avoid slowing resume down. Devices without
      50                 :            :          * persist will just get reenumerated shortly after resume anyway.
      51                 :            :          */
      52         [ #  # ]:          0 :         if (!usb_for_each_dev(NULL, persist_enabled_on_companion))
      53                 :            :                 return;
      54                 :            : 
      55                 :            :         /* Make sure the ports are powered */
      56                 :          0 :         port = HCS_N_PORTS(ehci->hcs_params);
      57         [ #  # ]:          0 :         while (port--) {
      58         [ #  # ]:          0 :                 if (test_bit(port, &ehci->owned_ports)) {
      59                 :          0 :                         reg = &ehci->regs->port_status[port];
      60                 :          0 :                         status = ehci_readl(ehci, reg) & ~PORT_RWC_BITS;
      61         [ #  # ]:          0 :                         if (!(status & PORT_POWER))
      62                 :          0 :                                 ehci_port_power(ehci, port, true);
      63                 :            :                 }
      64                 :            :         }
      65                 :            : 
      66                 :            :         /* Give the connections some time to appear */
      67                 :          0 :         msleep(20);
      68                 :            : 
      69                 :          0 :         spin_lock_irq(&ehci->lock);
      70                 :          0 :         port = HCS_N_PORTS(ehci->hcs_params);
      71         [ #  # ]:          0 :         while (port--) {
      72         [ #  # ]:          0 :                 if (test_bit(port, &ehci->owned_ports)) {
      73                 :          0 :                         reg = &ehci->regs->port_status[port];
      74                 :          0 :                         status = ehci_readl(ehci, reg) & ~PORT_RWC_BITS;
      75                 :            : 
      76                 :            :                         /* Port already owned by companion? */
      77         [ #  # ]:          0 :                         if (status & PORT_OWNER)
      78                 :          0 :                                 clear_bit(port, &ehci->owned_ports);
      79         [ #  # ]:          0 :                         else if (test_bit(port, &ehci->companion_ports))
      80         [ #  # ]:          0 :                                 ehci_writel(ehci, status & ~PORT_PE, reg);
      81                 :            :                         else {
      82                 :          0 :                                 spin_unlock_irq(&ehci->lock);
      83                 :          0 :                                 ehci_hub_control(hcd, SetPortFeature,
      84                 :          0 :                                                 USB_PORT_FEAT_RESET, port + 1,
      85                 :            :                                                 NULL, 0);
      86                 :          0 :                                 spin_lock_irq(&ehci->lock);
      87                 :            :                         }
      88                 :            :                 }
      89                 :            :         }
      90                 :          0 :         spin_unlock_irq(&ehci->lock);
      91                 :            : 
      92         [ #  # ]:          0 :         if (!ehci->owned_ports)
      93                 :            :                 return;
      94                 :          0 :         msleep(90);             /* Wait for resets to complete */
      95                 :            : 
      96                 :          0 :         spin_lock_irq(&ehci->lock);
      97                 :          0 :         port = HCS_N_PORTS(ehci->hcs_params);
      98         [ #  # ]:          0 :         while (port--) {
      99         [ #  # ]:          0 :                 if (test_bit(port, &ehci->owned_ports)) {
     100                 :          0 :                         spin_unlock_irq(&ehci->lock);
     101                 :          0 :                         ehci_hub_control(hcd, GetPortStatus,
     102                 :          0 :                                         0, port + 1,
     103                 :            :                                         (char *) &buf, sizeof(buf));
     104                 :          0 :                         spin_lock_irq(&ehci->lock);
     105                 :            : 
     106                 :            :                         /* The companion should now own the port,
     107                 :            :                          * but if something went wrong the port must not
     108                 :            :                          * remain enabled.
     109                 :            :                          */
     110                 :          0 :                         reg = &ehci->regs->port_status[port];
     111                 :          0 :                         status = ehci_readl(ehci, reg) & ~PORT_RWC_BITS;
     112         [ #  # ]:          0 :                         if (status & PORT_OWNER)
     113         [ #  # ]:          0 :                                 ehci_writel(ehci, status | PORT_CSC, reg);
     114                 :            :                         else {
     115                 :          0 :                                 ehci_dbg(ehci, "failed handover port %d: %x\n",
     116                 :            :                                                 port + 1, status);
     117         [ #  # ]:          0 :                                 ehci_writel(ehci, status & ~PORT_PE, reg);
     118                 :            :                         }
     119                 :            :                 }
     120                 :            :         }
     121                 :            : 
     122                 :          0 :         ehci->owned_ports = 0;
     123                 :          0 :         spin_unlock_irq(&ehci->lock);
     124                 :            : }
     125                 :            : 
     126                 :          0 : static int ehci_port_change(struct ehci_hcd *ehci)
     127                 :            : {
     128                 :          0 :         int i = HCS_N_PORTS(ehci->hcs_params);
     129                 :            : 
     130                 :            :         /* First check if the controller indicates a change event */
     131                 :            : 
     132         [ #  # ]:          0 :         if (ehci_readl(ehci, &ehci->regs->status) & STS_PCD)
     133                 :            :                 return 1;
     134                 :            : 
     135                 :            :         /*
     136                 :            :          * Not all controllers appear to update this while going from D3 to D0,
     137                 :            :          * so check the individual port status registers as well
     138                 :            :          */
     139                 :            : 
     140         [ #  # ]:          0 :         while (i--)
     141         [ #  # ]:          0 :                 if (ehci_readl(ehci, &ehci->regs->port_status[i]) & PORT_CSC)
     142                 :            :                         return 1;
     143                 :            : 
     144                 :            :         return 0;
     145                 :            : }
     146                 :            : 
     147                 :          0 : void ehci_adjust_port_wakeup_flags(struct ehci_hcd *ehci,
     148                 :            :                 bool suspending, bool do_wakeup)
     149                 :            : {
     150                 :          0 :         int             port;
     151                 :          0 :         u32             temp;
     152                 :            : 
     153                 :            :         /* If remote wakeup is enabled for the root hub but disabled
     154                 :            :          * for the controller, we must adjust all the port wakeup flags
     155                 :            :          * when the controller is suspended or resumed.  In all other
     156                 :            :          * cases they don't need to be changed.
     157                 :            :          */
     158   [ #  #  #  # ]:          0 :         if (!ehci_to_hcd(ehci)->self.root_hub->do_remote_wakeup || do_wakeup)
     159                 :            :                 return;
     160                 :            : 
     161                 :          0 :         spin_lock_irq(&ehci->lock);
     162                 :            : 
     163                 :            :         /* clear phy low-power mode before changing wakeup flags */
     164         [ #  # ]:          0 :         if (ehci->has_tdi_phy_lpm) {
     165                 :          0 :                 port = HCS_N_PORTS(ehci->hcs_params);
     166         [ #  # ]:          0 :                 while (port--) {
     167                 :          0 :                         u32 __iomem     *hostpc_reg = &ehci->regs->hostpc[port];
     168                 :            : 
     169                 :          0 :                         temp = ehci_readl(ehci, hostpc_reg);
     170         [ #  # ]:          0 :                         ehci_writel(ehci, temp & ~HOSTPC_PHCD, hostpc_reg);
     171                 :            :                 }
     172                 :          0 :                 spin_unlock_irq(&ehci->lock);
     173                 :          0 :                 msleep(5);
     174                 :          0 :                 spin_lock_irq(&ehci->lock);
     175                 :            :         }
     176                 :            : 
     177                 :          0 :         port = HCS_N_PORTS(ehci->hcs_params);
     178         [ #  # ]:          0 :         while (port--) {
     179                 :          0 :                 u32 __iomem     *reg = &ehci->regs->port_status[port];
     180                 :          0 :                 u32             t1 = ehci_readl(ehci, reg) & ~PORT_RWC_BITS;
     181                 :          0 :                 u32             t2 = t1 & ~PORT_WAKE_BITS;
     182                 :            : 
     183                 :            :                 /* If we are suspending the controller, clear the flags.
     184                 :            :                  * If we are resuming the controller, set the wakeup flags.
     185                 :            :                  */
     186         [ #  # ]:          0 :                 if (!suspending) {
     187         [ #  # ]:          0 :                         if (t1 & PORT_CONNECT)
     188                 :          0 :                                 t2 |= PORT_WKOC_E | PORT_WKDISC_E;
     189                 :            :                         else
     190                 :          0 :                                 t2 |= PORT_WKOC_E | PORT_WKCONN_E;
     191                 :            :                 }
     192         [ #  # ]:          0 :                 ehci_writel(ehci, t2, reg);
     193                 :            :         }
     194                 :            : 
     195                 :            :         /* enter phy low-power mode again */
     196         [ #  # ]:          0 :         if (ehci->has_tdi_phy_lpm) {
     197                 :          0 :                 port = HCS_N_PORTS(ehci->hcs_params);
     198         [ #  # ]:          0 :                 while (port--) {
     199                 :          0 :                         u32 __iomem     *hostpc_reg = &ehci->regs->hostpc[port];
     200                 :            : 
     201                 :          0 :                         temp = ehci_readl(ehci, hostpc_reg);
     202         [ #  # ]:          0 :                         ehci_writel(ehci, temp | HOSTPC_PHCD, hostpc_reg);
     203                 :            :                 }
     204                 :            :         }
     205                 :            : 
     206                 :            :         /* Does the root hub have a port wakeup pending? */
     207   [ #  #  #  # ]:          0 :         if (!suspending && ehci_port_change(ehci))
     208                 :          0 :                 usb_hcd_resume_root_hub(ehci_to_hcd(ehci));
     209                 :            : 
     210                 :          0 :         spin_unlock_irq(&ehci->lock);
     211                 :            : }
     212                 :            : EXPORT_SYMBOL_GPL(ehci_adjust_port_wakeup_flags);
     213                 :            : 
     214                 :          0 : static int ehci_bus_suspend (struct usb_hcd *hcd)
     215                 :            : {
     216         [ #  # ]:          0 :         struct ehci_hcd         *ehci = hcd_to_ehci (hcd);
     217                 :          0 :         int                     port;
     218                 :          0 :         int                     mask;
     219                 :          0 :         int                     changed;
     220                 :          0 :         bool                    fs_idle_delay;
     221                 :            : 
     222                 :          0 :         ehci_dbg(ehci, "suspend root hub\n");
     223                 :            : 
     224         [ #  # ]:          0 :         if (time_before (jiffies, ehci->next_statechange))
     225                 :          0 :                 msleep(5);
     226                 :            : 
     227                 :            :         /* stop the schedules */
     228                 :          0 :         ehci_quiesce(ehci);
     229                 :            : 
     230                 :          0 :         spin_lock_irq (&ehci->lock);
     231         [ #  # ]:          0 :         if (ehci->rh_state < EHCI_RH_RUNNING)
     232                 :          0 :                 goto done;
     233                 :            : 
     234                 :            :         /* Once the controller is stopped, port resumes that are already
     235                 :            :          * in progress won't complete.  Hence if remote wakeup is enabled
     236                 :            :          * for the root hub and any ports are in the middle of a resume or
     237                 :            :          * remote wakeup, we must fail the suspend.
     238                 :            :          */
     239         [ #  # ]:          0 :         if (hcd->self.root_hub->do_remote_wakeup) {
     240         [ #  # ]:          0 :                 if (ehci->resuming_ports) {
     241                 :          0 :                         spin_unlock_irq(&ehci->lock);
     242                 :          0 :                         ehci_dbg(ehci, "suspend failed because a port is resuming\n");
     243                 :          0 :                         return -EBUSY;
     244                 :            :                 }
     245                 :            :         }
     246                 :            : 
     247                 :            :         /* Unlike other USB host controller types, EHCI doesn't have
     248                 :            :          * any notion of "global" or bus-wide suspend.  The driver has
     249                 :            :          * to manually suspend all the active unsuspended ports, and
     250                 :            :          * then manually resume them in the bus_resume() routine.
     251                 :            :          */
     252                 :          0 :         ehci->bus_suspended = 0;
     253                 :          0 :         ehci->owned_ports = 0;
     254                 :          0 :         changed = 0;
     255                 :          0 :         fs_idle_delay = false;
     256                 :          0 :         port = HCS_N_PORTS(ehci->hcs_params);
     257         [ #  # ]:          0 :         while (port--) {
     258                 :          0 :                 u32 __iomem     *reg = &ehci->regs->port_status [port];
     259                 :          0 :                 u32             t1 = ehci_readl(ehci, reg) & ~PORT_RWC_BITS;
     260                 :          0 :                 u32             t2 = t1 & ~PORT_WAKE_BITS;
     261                 :            : 
     262                 :            :                 /* keep track of which ports we suspend */
     263         [ #  # ]:          0 :                 if (t1 & PORT_OWNER)
     264                 :          0 :                         set_bit(port, &ehci->owned_ports);
     265         [ #  # ]:          0 :                 else if ((t1 & PORT_PE) && !(t1 & PORT_SUSPEND)) {
     266                 :          0 :                         t2 |= PORT_SUSPEND;
     267                 :          0 :                         set_bit(port, &ehci->bus_suspended);
     268                 :            :                 }
     269                 :            : 
     270                 :            :                 /* enable remote wakeup on all ports, if told to do so */
     271         [ #  # ]:          0 :                 if (hcd->self.root_hub->do_remote_wakeup) {
     272                 :            :                         /* only enable appropriate wake bits, otherwise the
     273                 :            :                          * hardware can not go phy low power mode. If a race
     274                 :            :                          * condition happens here(connection change during bits
     275                 :            :                          * set), the port change detection will finally fix it.
     276                 :            :                          */
     277         [ #  # ]:          0 :                         if (t1 & PORT_CONNECT)
     278                 :          0 :                                 t2 |= PORT_WKOC_E | PORT_WKDISC_E;
     279                 :            :                         else
     280                 :          0 :                                 t2 |= PORT_WKOC_E | PORT_WKCONN_E;
     281                 :            :                 }
     282                 :            : 
     283         [ #  # ]:          0 :                 if (t1 != t2) {
     284                 :            :                         /*
     285                 :            :                          * On some controllers, Wake-On-Disconnect will
     286                 :            :                          * generate false wakeup signals until the bus
     287                 :            :                          * switches over to full-speed idle.  For their
     288                 :            :                          * sake, add a delay if we need one.
     289                 :            :                          */
     290         [ #  # ]:          0 :                         if ((t2 & PORT_WKDISC_E) &&
     291                 :            :                                         ehci_port_speed(ehci, t2) ==
     292                 :            :                                                 USB_PORT_STAT_HIGH_SPEED)
     293                 :          0 :                                 fs_idle_delay = true;
     294         [ #  # ]:          0 :                         ehci_writel(ehci, t2, reg);
     295                 :            :                         changed = 1;
     296                 :            :                 }
     297                 :            :         }
     298                 :          0 :         spin_unlock_irq(&ehci->lock);
     299                 :            : 
     300   [ #  #  #  # ]:          0 :         if (changed && ehci_has_fsl_susp_errata(ehci))
     301                 :            :                 /*
     302                 :            :                  * Wait for at least 10 millisecondes to ensure the controller
     303                 :            :                  * enter the suspend status before initiating a port resume
     304                 :            :                  * using the Force Port Resume bit (Not-EHCI compatible).
     305                 :            :                  */
     306                 :          0 :                 usleep_range(10000, 20000);
     307                 :            : 
     308   [ #  #  #  #  :          0 :         if ((changed && ehci->has_tdi_phy_lpm) || fs_idle_delay) {
                   #  # ]
     309                 :            :                 /*
     310                 :            :                  * Wait for HCD to enter low-power mode or for the bus
     311                 :            :                  * to switch to full-speed idle.
     312                 :            :                  */
     313                 :          0 :                 usleep_range(5000, 5500);
     314                 :            :         }
     315                 :            : 
     316   [ #  #  #  # ]:          0 :         if (changed && ehci->has_tdi_phy_lpm) {
     317                 :          0 :                 spin_lock_irq(&ehci->lock);
     318                 :          0 :                 port = HCS_N_PORTS(ehci->hcs_params);
     319         [ #  # ]:          0 :                 while (port--) {
     320                 :          0 :                         u32 __iomem     *hostpc_reg = &ehci->regs->hostpc[port];
     321                 :          0 :                         u32             t3;
     322                 :            : 
     323                 :          0 :                         t3 = ehci_readl(ehci, hostpc_reg);
     324         [ #  # ]:          0 :                         ehci_writel(ehci, t3 | HOSTPC_PHCD, hostpc_reg);
     325                 :          0 :                         t3 = ehci_readl(ehci, hostpc_reg);
     326                 :          0 :                         ehci_dbg(ehci, "Port %d phy low-power mode %s\n",
     327                 :            :                                         port, (t3 & HOSTPC_PHCD) ?
     328                 :            :                                         "succeeded" : "failed");
     329                 :            :                 }
     330                 :          0 :                 spin_unlock_irq(&ehci->lock);
     331                 :            :         }
     332                 :            : 
     333                 :            :         /* Apparently some devices need a >= 1-uframe delay here */
     334         [ #  # ]:          0 :         if (ehci->bus_suspended)
     335                 :          0 :                 udelay(150);
     336                 :            : 
     337                 :            :         /* turn off now-idle HC */
     338                 :          0 :         ehci_halt (ehci);
     339                 :            : 
     340                 :          0 :         spin_lock_irq(&ehci->lock);
     341         [ #  # ]:          0 :         if (ehci->enabled_hrtimer_events & BIT(EHCI_HRTIMER_POLL_DEAD))
     342                 :          0 :                 ehci_handle_controller_death(ehci);
     343         [ #  # ]:          0 :         if (ehci->rh_state != EHCI_RH_RUNNING)
     344                 :          0 :                 goto done;
     345                 :          0 :         ehci->rh_state = EHCI_RH_SUSPENDED;
     346                 :            : 
     347                 :          0 :         unlink_empty_async_suspended(ehci);
     348                 :            : 
     349                 :            :         /* Any IAA cycle that started before the suspend is now invalid */
     350                 :          0 :         end_iaa_cycle(ehci);
     351                 :          0 :         ehci_handle_start_intr_unlinks(ehci);
     352                 :          0 :         ehci_handle_intr_unlinks(ehci);
     353                 :          0 :         end_free_itds(ehci);
     354                 :            : 
     355                 :            :         /* allow remote wakeup */
     356                 :          0 :         mask = INTR_MASK;
     357         [ #  # ]:          0 :         if (!hcd->self.root_hub->do_remote_wakeup)
     358                 :          0 :                 mask &= ~STS_PCD;
     359         [ #  # ]:          0 :         ehci_writel(ehci, mask, &ehci->regs->intr_enable);
     360                 :          0 :         ehci_readl(ehci, &ehci->regs->intr_enable);
     361                 :            : 
     362                 :          0 :  done:
     363                 :          0 :         ehci->next_statechange = jiffies + msecs_to_jiffies(10);
     364                 :          0 :         ehci->enabled_hrtimer_events = 0;
     365                 :          0 :         ehci->next_hrtimer_event = EHCI_HRTIMER_NO_EVENT;
     366                 :          0 :         spin_unlock_irq (&ehci->lock);
     367                 :            : 
     368                 :          0 :         hrtimer_cancel(&ehci->hrtimer);
     369                 :          0 :         return 0;
     370                 :            : }
     371                 :            : 
     372                 :            : 
     373                 :            : /* caller has locked the root hub, and should reset/reinit on error */
     374                 :          0 : static int ehci_bus_resume (struct usb_hcd *hcd)
     375                 :            : {
     376         [ #  # ]:          0 :         struct ehci_hcd         *ehci = hcd_to_ehci (hcd);
     377                 :          0 :         u32                     temp;
     378                 :          0 :         u32                     power_okay;
     379                 :          0 :         int                     i;
     380                 :          0 :         unsigned long           resume_needed = 0;
     381                 :            : 
     382         [ #  # ]:          0 :         if (time_before (jiffies, ehci->next_statechange))
     383                 :          0 :                 msleep(5);
     384                 :          0 :         spin_lock_irq (&ehci->lock);
     385   [ #  #  #  # ]:          0 :         if (!HCD_HW_ACCESSIBLE(hcd) || ehci->shutdown)
     386                 :          0 :                 goto shutdown;
     387                 :            : 
     388         [ #  # ]:          0 :         if (unlikely(ehci->debug)) {
     389         [ #  # ]:          0 :                 if (!dbgp_reset_prep(hcd))
     390                 :          0 :                         ehci->debug = NULL;
     391                 :            :                 else
     392                 :          0 :                         dbgp_external_startup(hcd);
     393                 :            :         }
     394                 :            : 
     395                 :            :         /* Ideally and we've got a real resume here, and no port's power
     396                 :            :          * was lost.  (For PCI, that means Vaux was maintained.)  But we
     397                 :            :          * could instead be restoring a swsusp snapshot -- so that BIOS was
     398                 :            :          * the last user of the controller, not reset/pm hardware keeping
     399                 :            :          * state we gave to it.
     400                 :            :          */
     401                 :          0 :         power_okay = ehci_readl(ehci, &ehci->regs->intr_enable);
     402                 :          0 :         ehci_dbg(ehci, "resume root hub%s\n",
     403                 :            :                         power_okay ? "" : " after power loss");
     404                 :            : 
     405                 :            :         /* at least some APM implementations will try to deliver
     406                 :            :          * IRQs right away, so delay them until we're ready.
     407                 :            :          */
     408         [ #  # ]:          0 :         ehci_writel(ehci, 0, &ehci->regs->intr_enable);
     409                 :            : 
     410                 :            :         /* re-init operational registers */
     411         [ #  # ]:          0 :         ehci_writel(ehci, 0, &ehci->regs->segment);
     412         [ #  # ]:          0 :         ehci_writel(ehci, ehci->periodic_dma, &ehci->regs->frame_list);
     413         [ #  # ]:          0 :         ehci_writel(ehci, (u32) ehci->async->qh_dma, &ehci->regs->async_next);
     414                 :            : 
     415                 :            :         /* restore CMD_RUN, framelist size, and irq threshold */
     416                 :          0 :         ehci->command |= CMD_RUN;
     417         [ #  # ]:          0 :         ehci_writel(ehci, ehci->command, &ehci->regs->command);
     418                 :          0 :         ehci->rh_state = EHCI_RH_RUNNING;
     419                 :            : 
     420                 :            :         /*
     421                 :            :          * According to Bugzilla #8190, the port status for some controllers
     422                 :            :          * will be wrong without a delay. At their wrong status, the port
     423                 :            :          * is enabled, but not suspended neither resumed.
     424                 :            :          */
     425                 :          0 :         i = HCS_N_PORTS(ehci->hcs_params);
     426         [ #  # ]:          0 :         while (i--) {
     427                 :          0 :                 temp = ehci_readl(ehci, &ehci->regs->port_status[i]);
     428         [ #  # ]:          0 :                 if ((temp & PORT_PE) &&
     429                 :            :                                 !(temp & (PORT_SUSPEND | PORT_RESUME))) {
     430                 :          0 :                         ehci_dbg(ehci, "Port status(0x%x) is wrong\n", temp);
     431                 :          0 :                         spin_unlock_irq(&ehci->lock);
     432                 :          0 :                         msleep(8);
     433                 :          0 :                         spin_lock_irq(&ehci->lock);
     434                 :            :                         break;
     435                 :            :                 }
     436                 :            :         }
     437                 :            : 
     438         [ #  # ]:          0 :         if (ehci->shutdown)
     439                 :          0 :                 goto shutdown;
     440                 :            : 
     441                 :            :         /* clear phy low-power mode before resume */
     442   [ #  #  #  # ]:          0 :         if (ehci->bus_suspended && ehci->has_tdi_phy_lpm) {
     443                 :          0 :                 i = HCS_N_PORTS(ehci->hcs_params);
     444         [ #  # ]:          0 :                 while (i--) {
     445         [ #  # ]:          0 :                         if (test_bit(i, &ehci->bus_suspended)) {
     446                 :          0 :                                 u32 __iomem     *hostpc_reg =
     447                 :          0 :                                                         &ehci->regs->hostpc[i];
     448                 :            : 
     449                 :          0 :                                 temp = ehci_readl(ehci, hostpc_reg);
     450         [ #  # ]:          0 :                                 ehci_writel(ehci, temp & ~HOSTPC_PHCD,
     451                 :            :                                                 hostpc_reg);
     452                 :            :                         }
     453                 :            :                 }
     454                 :          0 :                 spin_unlock_irq(&ehci->lock);
     455                 :          0 :                 msleep(5);
     456                 :          0 :                 spin_lock_irq(&ehci->lock);
     457         [ #  # ]:          0 :                 if (ehci->shutdown)
     458                 :          0 :                         goto shutdown;
     459                 :            :         }
     460                 :            : 
     461                 :            :         /* manually resume the ports we suspended during bus_suspend() */
     462                 :          0 :         i = HCS_N_PORTS (ehci->hcs_params);
     463         [ #  # ]:          0 :         while (i--) {
     464                 :          0 :                 temp = ehci_readl(ehci, &ehci->regs->port_status [i]);
     465                 :          0 :                 temp &= ~(PORT_RWC_BITS | PORT_WAKE_BITS);
     466         [ #  # ]:          0 :                 if (test_bit(i, &ehci->bus_suspended) &&
     467         [ #  # ]:          0 :                                 (temp & PORT_SUSPEND)) {
     468                 :          0 :                         temp |= PORT_RESUME;
     469                 :          0 :                         set_bit(i, &resume_needed);
     470                 :            :                 }
     471         [ #  # ]:          0 :                 ehci_writel(ehci, temp, &ehci->regs->port_status [i]);
     472                 :            :         }
     473                 :            : 
     474                 :            :         /*
     475                 :            :          * msleep for USB_RESUME_TIMEOUT ms only if code is trying to resume
     476                 :            :          * port
     477                 :            :          */
     478         [ #  # ]:          0 :         if (resume_needed) {
     479                 :          0 :                 spin_unlock_irq(&ehci->lock);
     480                 :          0 :                 msleep(USB_RESUME_TIMEOUT);
     481                 :          0 :                 spin_lock_irq(&ehci->lock);
     482         [ #  # ]:          0 :                 if (ehci->shutdown)
     483                 :          0 :                         goto shutdown;
     484                 :            :         }
     485                 :            : 
     486                 :          0 :         i = HCS_N_PORTS (ehci->hcs_params);
     487         [ #  # ]:          0 :         while (i--) {
     488                 :          0 :                 temp = ehci_readl(ehci, &ehci->regs->port_status [i]);
     489         [ #  # ]:          0 :                 if (test_bit(i, &resume_needed)) {
     490                 :          0 :                         temp &= ~(PORT_RWC_BITS | PORT_SUSPEND | PORT_RESUME);
     491         [ #  # ]:          0 :                         ehci_writel(ehci, temp, &ehci->regs->port_status [i]);
     492                 :            :                 }
     493                 :            :         }
     494                 :            : 
     495                 :          0 :         ehci->next_statechange = jiffies + msecs_to_jiffies(5);
     496                 :          0 :         spin_unlock_irq(&ehci->lock);
     497                 :            : 
     498                 :          0 :         ehci_handover_companion_ports(ehci);
     499                 :            : 
     500                 :            :         /* Now we can safely re-enable irqs */
     501                 :          0 :         spin_lock_irq(&ehci->lock);
     502         [ #  # ]:          0 :         if (ehci->shutdown)
     503                 :          0 :                 goto shutdown;
     504         [ #  # ]:          0 :         ehci_writel(ehci, INTR_MASK, &ehci->regs->intr_enable);
     505                 :          0 :         (void) ehci_readl(ehci, &ehci->regs->intr_enable);
     506                 :          0 :         spin_unlock_irq(&ehci->lock);
     507                 :            : 
     508                 :          0 :         return 0;
     509                 :            : 
     510                 :          0 :  shutdown:
     511                 :          0 :         spin_unlock_irq(&ehci->lock);
     512                 :          0 :         return -ESHUTDOWN;
     513                 :            : }
     514                 :            : 
     515                 :          0 : static unsigned long ehci_get_resuming_ports(struct usb_hcd *hcd)
     516                 :            : {
     517                 :          0 :         struct ehci_hcd         *ehci = hcd_to_ehci(hcd);
     518                 :            : 
     519                 :          0 :         return ehci->resuming_ports;
     520                 :            : }
     521                 :            : 
     522                 :            : #else
     523                 :            : 
     524                 :            : #define ehci_bus_suspend        NULL
     525                 :            : #define ehci_bus_resume         NULL
     526                 :            : #define ehci_get_resuming_ports NULL
     527                 :            : 
     528                 :            : #endif  /* CONFIG_PM */
     529                 :            : 
     530                 :            : /*-------------------------------------------------------------------------*/
     531                 :            : 
     532                 :            : /*
     533                 :            :  * Sets the owner of a port
     534                 :            :  */
     535                 :          0 : static void set_owner(struct ehci_hcd *ehci, int portnum, int new_owner)
     536                 :            : {
     537                 :          0 :         u32 __iomem             *status_reg;
     538                 :          0 :         u32                     port_status;
     539                 :          0 :         int                     try;
     540                 :            : 
     541                 :          0 :         status_reg = &ehci->regs->port_status[portnum];
     542                 :            : 
     543                 :            :         /*
     544                 :            :          * The controller won't set the OWNER bit if the port is
     545                 :            :          * enabled, so this loop will sometimes require at least two
     546                 :            :          * iterations: one to disable the port and one to set OWNER.
     547                 :            :          */
     548         [ #  # ]:          0 :         for (try = 4; try > 0; --try) {
     549                 :          0 :                 spin_lock_irq(&ehci->lock);
     550                 :          0 :                 port_status = ehci_readl(ehci, status_reg);
     551         [ #  # ]:          0 :                 if ((port_status & PORT_OWNER) == new_owner
     552         [ #  # ]:          0 :                                 || (port_status & (PORT_OWNER | PORT_CONNECT))
     553                 :            :                                         == 0)
     554                 :            :                         try = 0;
     555                 :            :                 else {
     556                 :          0 :                         port_status ^= PORT_OWNER;
     557                 :          0 :                         port_status &= ~(PORT_PE | PORT_RWC_BITS);
     558         [ #  # ]:          0 :                         ehci_writel(ehci, port_status, status_reg);
     559                 :            :                 }
     560                 :          0 :                 spin_unlock_irq(&ehci->lock);
     561         [ #  # ]:          0 :                 if (try > 1)
     562                 :          0 :                         msleep(5);
     563                 :            :         }
     564                 :          0 : }
     565                 :            : 
     566                 :            : /*-------------------------------------------------------------------------*/
     567                 :            : 
     568                 :          0 : static int check_reset_complete (
     569                 :            :         struct ehci_hcd *ehci,
     570                 :            :         int             index,
     571                 :            :         u32 __iomem     *status_reg,
     572                 :            :         int             port_status
     573                 :            : ) {
     574                 :          0 :         if (!(port_status & PORT_CONNECT))
     575                 :            :                 return port_status;
     576                 :            : 
     577                 :            :         /* if reset finished and it's still not enabled -- handoff */
     578         [ #  # ]:          0 :         if (!(port_status & PORT_PE)) {
     579                 :            : 
     580                 :            :                 /* with integrated TT, there's nobody to hand it to! */
     581                 :          0 :                 if (ehci_is_TDI(ehci)) {
     582                 :            :                         ehci_dbg (ehci,
     583                 :            :                                 "Failed to enable port %d on root hub TT\n",
     584                 :            :                                 index+1);
     585                 :            :                         return port_status;
     586                 :            :                 }
     587                 :            : 
     588                 :          0 :                 ehci_dbg (ehci, "port %d full speed --> companion\n",
     589                 :            :                         index + 1);
     590                 :            : 
     591                 :            :                 // what happens if HCS_N_CC(params) == 0 ?
     592                 :          0 :                 port_status |= PORT_OWNER;
     593                 :          0 :                 port_status &= ~PORT_RWC_BITS;
     594         [ #  # ]:          0 :                 ehci_writel(ehci, port_status, status_reg);
     595                 :            : 
     596                 :            :                 /* ensure 440EPX ohci controller state is operational */
     597                 :            :                 if (ehci->has_amcc_usb23)
     598                 :            :                         set_ohci_hcfs(ehci, 1);
     599                 :            :         } else {
     600                 :            :                 ehci_dbg(ehci, "port %d reset complete, port enabled\n",
     601                 :            :                         index + 1);
     602                 :            :                 /* ensure 440EPx ohci controller state is suspended */
     603                 :            :                 if (ehci->has_amcc_usb23)
     604                 :            :                         set_ohci_hcfs(ehci, 0);
     605                 :            :         }
     606                 :            : 
     607                 :            :         return port_status;
     608                 :            : }
     609                 :            : 
     610                 :            : /*-------------------------------------------------------------------------*/
     611                 :            : 
     612                 :            : 
     613                 :            : /* build "status change" packet (one or two bytes) from HC registers */
     614                 :            : 
     615                 :            : static int
     616                 :          0 : ehci_hub_status_data (struct usb_hcd *hcd, char *buf)
     617                 :            : {
     618         [ #  # ]:          0 :         struct ehci_hcd *ehci = hcd_to_ehci (hcd);
     619                 :          0 :         u32             temp, status;
     620                 :          0 :         u32             mask;
     621                 :          0 :         int             ports, i, retval = 1;
     622                 :          0 :         unsigned long   flags;
     623                 :          0 :         u32             ppcd = ~0;
     624                 :            : 
     625                 :            :         /* init status to no-changes */
     626                 :          0 :         buf [0] = 0;
     627                 :          0 :         ports = HCS_N_PORTS (ehci->hcs_params);
     628         [ #  # ]:          0 :         if (ports > 7) {
     629                 :          0 :                 buf [1] = 0;
     630                 :          0 :                 retval++;
     631                 :            :         }
     632                 :            : 
     633                 :            :         /* Inform the core about resumes-in-progress by returning
     634                 :            :          * a non-zero value even if there are no status changes.
     635                 :            :          */
     636                 :          0 :         status = ehci->resuming_ports;
     637                 :            : 
     638                 :            :         /* Some boards (mostly VIA?) report bogus overcurrent indications,
     639                 :            :          * causing massive log spam unless we completely ignore them.  It
     640                 :            :          * may be relevant that VIA VT8235 controllers, where PORT_POWER is
     641                 :            :          * always set, seem to clear PORT_OCC and PORT_CSC when writing to
     642                 :            :          * PORT_POWER; that's surprising, but maybe within-spec.
     643                 :            :          */
     644         [ #  # ]:          0 :         if (!ignore_oc)
     645                 :            :                 mask = PORT_CSC | PORT_PEC | PORT_OCC;
     646                 :            :         else
     647                 :          0 :                 mask = PORT_CSC | PORT_PEC;
     648                 :            :         // PORT_RESUME from hardware ~= PORT_STAT_C_SUSPEND
     649                 :            : 
     650                 :            :         /* no hub change reports (bit 0) for now (power, ...) */
     651                 :            : 
     652                 :            :         /* port N changes (bit N)? */
     653                 :          0 :         spin_lock_irqsave (&ehci->lock, flags);
     654                 :            : 
     655                 :            :         /* get per-port change detect bits */
     656         [ #  # ]:          0 :         if (ehci->has_ppcd)
     657                 :          0 :                 ppcd = ehci_readl(ehci, &ehci->regs->status) >> 16;
     658                 :            : 
     659         [ #  # ]:          0 :         for (i = 0; i < ports; i++) {
     660                 :            :                 /* leverage per-port change bits feature */
     661         [ #  # ]:          0 :                 if (ppcd & (1 << i))
     662                 :          0 :                         temp = ehci_readl(ehci, &ehci->regs->port_status[i]);
     663                 :            :                 else
     664                 :            :                         temp = 0;
     665                 :            : 
     666                 :            :                 /*
     667                 :            :                  * Return status information even for ports with OWNER set.
     668                 :            :                  * Otherwise hub_wq wouldn't see the disconnect event when a
     669                 :            :                  * high-speed device is switched over to the companion
     670                 :            :                  * controller by the user.
     671                 :            :                  */
     672                 :            : 
     673   [ #  #  #  # ]:          0 :                 if ((temp & mask) != 0 || test_bit(i, &ehci->port_c_suspend)
     674   [ #  #  #  # ]:          0 :                                 || (ehci->reset_done[i] && time_after_eq(
     675                 :            :                                         jiffies, ehci->reset_done[i]))) {
     676         [ #  # ]:          0 :                         if (i < 7)
     677                 :          0 :                             buf [0] |= 1 << (i + 1);
     678                 :            :                         else
     679                 :          0 :                             buf [1] |= 1 << (i - 7);
     680                 :            :                         status = STS_PCD;
     681                 :            :                 }
     682                 :            :         }
     683                 :            : 
     684                 :            :         /* If a resume is in progress, make sure it can finish */
     685         [ #  # ]:          0 :         if (ehci->resuming_ports)
     686                 :          0 :                 mod_timer(&hcd->rh_timer, jiffies + msecs_to_jiffies(25));
     687                 :            : 
     688                 :          0 :         spin_unlock_irqrestore (&ehci->lock, flags);
     689         [ #  # ]:          0 :         return status ? retval : 0;
     690                 :            : }
     691                 :            : 
     692                 :            : /*-------------------------------------------------------------------------*/
     693                 :            : 
     694                 :            : static void
     695                 :            : ehci_hub_descriptor (
     696                 :            :         struct ehci_hcd                 *ehci,
     697                 :            :         struct usb_hub_descriptor       *desc
     698                 :            : ) {
     699                 :            :         int             ports = HCS_N_PORTS (ehci->hcs_params);
     700                 :            :         u16             temp;
     701                 :            : 
     702                 :            :         desc->bDescriptorType = USB_DT_HUB;
     703                 :            :         desc->bPwrOn2PwrGood = 10;   /* ehci 1.0, 2.3.9 says 20ms max */
     704                 :            :         desc->bHubContrCurrent = 0;
     705                 :            : 
     706                 :            :         desc->bNbrPorts = ports;
     707                 :            :         temp = 1 + (ports / 8);
     708                 :            :         desc->bDescLength = 7 + 2 * temp;
     709                 :            : 
     710                 :            :         /* two bitmaps:  ports removable, and usb 1.0 legacy PortPwrCtrlMask */
     711                 :            :         memset(&desc->u.hs.DeviceRemovable[0], 0, temp);
     712                 :            :         memset(&desc->u.hs.DeviceRemovable[temp], 0xff, temp);
     713                 :            : 
     714                 :            :         temp = HUB_CHAR_INDV_PORT_OCPM; /* per-port overcurrent reporting */
     715                 :            :         if (HCS_PPC (ehci->hcs_params))
     716                 :            :                 temp |= HUB_CHAR_INDV_PORT_LPSM; /* per-port power control */
     717                 :            :         else
     718                 :            :                 temp |= HUB_CHAR_NO_LPSM; /* no power switching */
     719                 :            : #if 0
     720                 :            : // re-enable when we support USB_PORT_FEAT_INDICATOR below.
     721                 :            :         if (HCS_INDICATOR (ehci->hcs_params))
     722                 :            :                 temp |= HUB_CHAR_PORTIND; /* per-port indicators (LEDs) */
     723                 :            : #endif
     724                 :            :         desc->wHubCharacteristics = cpu_to_le16(temp);
     725                 :            : }
     726                 :            : 
     727                 :            : /*-------------------------------------------------------------------------*/
     728                 :            : #ifdef CONFIG_USB_HCD_TEST_MODE
     729                 :            : 
     730                 :            : #define EHSET_TEST_SINGLE_STEP_SET_FEATURE 0x06
     731                 :            : 
     732                 :            : static void usb_ehset_completion(struct urb *urb)
     733                 :            : {
     734                 :            :         struct completion  *done = urb->context;
     735                 :            : 
     736                 :            :         complete(done);
     737                 :            : }
     738                 :            : static int submit_single_step_set_feature(
     739                 :            :         struct usb_hcd  *hcd,
     740                 :            :         struct urb      *urb,
     741                 :            :         int             is_setup
     742                 :            : );
     743                 :            : 
     744                 :            : /*
     745                 :            :  * Allocate and initialize a control URB. This request will be used by the
     746                 :            :  * EHSET SINGLE_STEP_SET_FEATURE test in which the DATA and STATUS stages
     747                 :            :  * of the GetDescriptor request are sent 15 seconds after the SETUP stage.
     748                 :            :  * Return NULL if failed.
     749                 :            :  */
     750                 :            : static struct urb *request_single_step_set_feature_urb(
     751                 :            :         struct usb_device       *udev,
     752                 :            :         void                    *dr,
     753                 :            :         void                    *buf,
     754                 :            :         struct completion       *done
     755                 :            : ) {
     756                 :            :         struct urb *urb;
     757                 :            :         struct usb_hcd *hcd = bus_to_hcd(udev->bus);
     758                 :            :         struct usb_host_endpoint *ep;
     759                 :            : 
     760                 :            :         urb = usb_alloc_urb(0, GFP_KERNEL);
     761                 :            :         if (!urb)
     762                 :            :                 return NULL;
     763                 :            : 
     764                 :            :         urb->pipe = usb_rcvctrlpipe(udev, 0);
     765                 :            :         ep = (usb_pipein(urb->pipe) ? udev->ep_in : udev->ep_out)
     766                 :            :                                 [usb_pipeendpoint(urb->pipe)];
     767                 :            :         if (!ep) {
     768                 :            :                 usb_free_urb(urb);
     769                 :            :                 return NULL;
     770                 :            :         }
     771                 :            : 
     772                 :            :         urb->ep = ep;
     773                 :            :         urb->dev = udev;
     774                 :            :         urb->setup_packet = (void *)dr;
     775                 :            :         urb->transfer_buffer = buf;
     776                 :            :         urb->transfer_buffer_length = USB_DT_DEVICE_SIZE;
     777                 :            :         urb->complete = usb_ehset_completion;
     778                 :            :         urb->status = -EINPROGRESS;
     779                 :            :         urb->actual_length = 0;
     780                 :            :         urb->transfer_flags = URB_DIR_IN;
     781                 :            :         usb_get_urb(urb);
     782                 :            :         atomic_inc(&urb->use_count);
     783                 :            :         atomic_inc(&urb->dev->urbnum);
     784                 :            :         urb->setup_dma = dma_map_single(
     785                 :            :                         hcd->self.sysdev,
     786                 :            :                         urb->setup_packet,
     787                 :            :                         sizeof(struct usb_ctrlrequest),
     788                 :            :                         DMA_TO_DEVICE);
     789                 :            :         urb->transfer_dma = dma_map_single(
     790                 :            :                         hcd->self.sysdev,
     791                 :            :                         urb->transfer_buffer,
     792                 :            :                         urb->transfer_buffer_length,
     793                 :            :                         DMA_FROM_DEVICE);
     794                 :            :         urb->context = done;
     795                 :            :         return urb;
     796                 :            : }
     797                 :            : 
     798                 :            : static int ehset_single_step_set_feature(struct usb_hcd *hcd, int port)
     799                 :            : {
     800                 :            :         int retval = -ENOMEM;
     801                 :            :         struct usb_ctrlrequest *dr;
     802                 :            :         struct urb *urb;
     803                 :            :         struct usb_device *udev;
     804                 :            :         struct ehci_hcd *ehci = hcd_to_ehci(hcd);
     805                 :            :         struct usb_device_descriptor *buf;
     806                 :            :         DECLARE_COMPLETION_ONSTACK(done);
     807                 :            : 
     808                 :            :         /* Obtain udev of the rhub's child port */
     809                 :            :         udev = usb_hub_find_child(hcd->self.root_hub, port);
     810                 :            :         if (!udev) {
     811                 :            :                 ehci_err(ehci, "No device attached to the RootHub\n");
     812                 :            :                 return -ENODEV;
     813                 :            :         }
     814                 :            :         buf = kmalloc(USB_DT_DEVICE_SIZE, GFP_KERNEL);
     815                 :            :         if (!buf)
     816                 :            :                 return -ENOMEM;
     817                 :            : 
     818                 :            :         dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
     819                 :            :         if (!dr) {
     820                 :            :                 kfree(buf);
     821                 :            :                 return -ENOMEM;
     822                 :            :         }
     823                 :            : 
     824                 :            :         /* Fill Setup packet for GetDescriptor */
     825                 :            :         dr->bRequestType = USB_DIR_IN;
     826                 :            :         dr->bRequest = USB_REQ_GET_DESCRIPTOR;
     827                 :            :         dr->wValue = cpu_to_le16(USB_DT_DEVICE << 8);
     828                 :            :         dr->wIndex = 0;
     829                 :            :         dr->wLength = cpu_to_le16(USB_DT_DEVICE_SIZE);
     830                 :            :         urb = request_single_step_set_feature_urb(udev, dr, buf, &done);
     831                 :            :         if (!urb)
     832                 :            :                 goto cleanup;
     833                 :            : 
     834                 :            :         /* Submit just the SETUP stage */
     835                 :            :         retval = submit_single_step_set_feature(hcd, urb, 1);
     836                 :            :         if (retval)
     837                 :            :                 goto out1;
     838                 :            :         if (!wait_for_completion_timeout(&done, msecs_to_jiffies(2000))) {
     839                 :            :                 usb_kill_urb(urb);
     840                 :            :                 retval = -ETIMEDOUT;
     841                 :            :                 ehci_err(ehci, "%s SETUP stage timed out on ep0\n", __func__);
     842                 :            :                 goto out1;
     843                 :            :         }
     844                 :            :         msleep(15 * 1000);
     845                 :            : 
     846                 :            :         /* Complete remaining DATA and STATUS stages using the same URB */
     847                 :            :         urb->status = -EINPROGRESS;
     848                 :            :         usb_get_urb(urb);
     849                 :            :         atomic_inc(&urb->use_count);
     850                 :            :         atomic_inc(&urb->dev->urbnum);
     851                 :            :         retval = submit_single_step_set_feature(hcd, urb, 0);
     852                 :            :         if (!retval && !wait_for_completion_timeout(&done,
     853                 :            :                                                 msecs_to_jiffies(2000))) {
     854                 :            :                 usb_kill_urb(urb);
     855                 :            :                 retval = -ETIMEDOUT;
     856                 :            :                 ehci_err(ehci, "%s IN stage timed out on ep0\n", __func__);
     857                 :            :         }
     858                 :            : out1:
     859                 :            :         usb_free_urb(urb);
     860                 :            : cleanup:
     861                 :            :         kfree(dr);
     862                 :            :         kfree(buf);
     863                 :            :         return retval;
     864                 :            : }
     865                 :            : #endif /* CONFIG_USB_HCD_TEST_MODE */
     866                 :            : /*-------------------------------------------------------------------------*/
     867                 :            : 
     868                 :          0 : int ehci_hub_control(
     869                 :            :         struct usb_hcd  *hcd,
     870                 :            :         u16             typeReq,
     871                 :            :         u16             wValue,
     872                 :            :         u16             wIndex,
     873                 :            :         char            *buf,
     874                 :            :         u16             wLength
     875                 :            : ) {
     876                 :          0 :         struct ehci_hcd *ehci = hcd_to_ehci (hcd);
     877                 :          0 :         int             ports = HCS_N_PORTS (ehci->hcs_params);
     878                 :          0 :         u32 __iomem     *status_reg, *hostpc_reg;
     879                 :          0 :         u32             temp, temp1, status;
     880                 :          0 :         unsigned long   flags;
     881                 :          0 :         int             retval = 0;
     882                 :          0 :         unsigned        selector;
     883                 :            : 
     884                 :            :         /*
     885                 :            :          * Avoid underflow while calculating (wIndex & 0xff) - 1.
     886                 :            :          * The compiler might deduce that wIndex can never be 0 and then
     887                 :            :          * optimize away the tests for !wIndex below.
     888                 :            :          */
     889                 :          0 :         temp = wIndex & 0xff;
     890                 :          0 :         temp -= (temp > 0);
     891                 :          0 :         status_reg = &ehci->regs->port_status[temp];
     892                 :          0 :         hostpc_reg = &ehci->regs->hostpc[temp];
     893                 :            : 
     894                 :            :         /*
     895                 :            :          * FIXME:  support SetPortFeatures USB_PORT_FEAT_INDICATOR.
     896                 :            :          * HCS_INDICATOR may say we can change LEDs to off/amber/green.
     897                 :            :          * (track current state ourselves) ... blink for diagnostics,
     898                 :            :          * power, "this is the one", etc.  EHCI spec supports this.
     899                 :            :          */
     900                 :            : 
     901                 :          0 :         spin_lock_irqsave (&ehci->lock, flags);
     902   [ #  #  #  #  :          0 :         switch (typeReq) {
             #  #  #  # ]
     903                 :          0 :         case ClearHubFeature:
     904         [ #  # ]:          0 :                 switch (wValue) {
     905                 :            :                 case C_HUB_LOCAL_POWER:
     906                 :            :                 case C_HUB_OVER_CURRENT:
     907                 :            :                         /* no hub-wide feature/status flags */
     908                 :            :                         break;
     909                 :          0 :                 default:
     910                 :          0 :                         goto error;
     911                 :            :                 }
     912                 :            :                 break;
     913                 :          0 :         case ClearPortFeature:
     914   [ #  #  #  # ]:          0 :                 if (!wIndex || wIndex > ports)
     915                 :          0 :                         goto error;
     916                 :          0 :                 wIndex--;
     917                 :          0 :                 temp = ehci_readl(ehci, status_reg);
     918                 :          0 :                 temp &= ~PORT_RWC_BITS;
     919                 :            : 
     920                 :            :                 /*
     921                 :            :                  * Even if OWNER is set, so the port is owned by the
     922                 :            :                  * companion controller, hub_wq needs to be able to clear
     923                 :            :                  * the port-change status bits (especially
     924                 :            :                  * USB_PORT_STAT_C_CONNECTION).
     925                 :            :                  */
     926                 :            : 
     927   [ #  #  #  #  :          0 :                 switch (wValue) {
             #  #  #  #  
                      # ]
     928                 :          0 :                 case USB_PORT_FEAT_ENABLE:
     929         [ #  # ]:          0 :                         ehci_writel(ehci, temp & ~PORT_PE, status_reg);
     930                 :            :                         break;
     931                 :          0 :                 case USB_PORT_FEAT_C_ENABLE:
     932         [ #  # ]:          0 :                         ehci_writel(ehci, temp | PORT_PEC, status_reg);
     933                 :            :                         break;
     934                 :          0 :                 case USB_PORT_FEAT_SUSPEND:
     935         [ #  # ]:          0 :                         if (temp & PORT_RESET)
     936                 :          0 :                                 goto error;
     937         [ #  # ]:          0 :                         if (ehci->no_selective_suspend)
     938                 :            :                                 break;
     939                 :            : #ifdef CONFIG_USB_OTG
     940                 :            :                         if ((hcd->self.otg_port == (wIndex + 1))
     941                 :            :                             && hcd->self.b_hnp_enable) {
     942                 :            :                                 otg_start_hnp(hcd->usb_phy->otg);
     943                 :            :                                 break;
     944                 :            :                         }
     945                 :            : #endif
     946         [ #  # ]:          0 :                         if (!(temp & PORT_SUSPEND))
     947                 :            :                                 break;
     948         [ #  # ]:          0 :                         if ((temp & PORT_PE) == 0)
     949                 :          0 :                                 goto error;
     950                 :            : 
     951                 :            :                         /* clear phy low-power mode before resume */
     952         [ #  # ]:          0 :                         if (ehci->has_tdi_phy_lpm) {
     953                 :          0 :                                 temp1 = ehci_readl(ehci, hostpc_reg);
     954         [ #  # ]:          0 :                                 ehci_writel(ehci, temp1 & ~HOSTPC_PHCD,
     955                 :            :                                                 hostpc_reg);
     956                 :          0 :                                 spin_unlock_irqrestore(&ehci->lock, flags);
     957                 :          0 :                                 msleep(5);/* wait to leave low-power mode */
     958                 :          0 :                                 spin_lock_irqsave(&ehci->lock, flags);
     959                 :            :                         }
     960                 :            :                         /* resume signaling for 20 msec */
     961                 :          0 :                         temp &= ~PORT_WAKE_BITS;
     962         [ #  # ]:          0 :                         ehci_writel(ehci, temp | PORT_RESUME, status_reg);
     963                 :          0 :                         ehci->reset_done[wIndex] = jiffies
     964                 :          0 :                                         + msecs_to_jiffies(USB_RESUME_TIMEOUT);
     965                 :          0 :                         set_bit(wIndex, &ehci->resuming_ports);
     966                 :          0 :                         usb_hcd_start_port_resume(&hcd->self, wIndex);
     967                 :          0 :                         break;
     968                 :          0 :                 case USB_PORT_FEAT_C_SUSPEND:
     969                 :          0 :                         clear_bit(wIndex, &ehci->port_c_suspend);
     970                 :          0 :                         break;
     971                 :          0 :                 case USB_PORT_FEAT_POWER:
     972         [ #  # ]:          0 :                         if (HCS_PPC(ehci->hcs_params)) {
     973                 :          0 :                                 spin_unlock_irqrestore(&ehci->lock, flags);
     974                 :          0 :                                 ehci_port_power(ehci, wIndex, false);
     975                 :          0 :                                 spin_lock_irqsave(&ehci->lock, flags);
     976                 :            :                         }
     977                 :            :                         break;
     978                 :          0 :                 case USB_PORT_FEAT_C_CONNECTION:
     979         [ #  # ]:          0 :                         ehci_writel(ehci, temp | PORT_CSC, status_reg);
     980                 :            :                         break;
     981                 :          0 :                 case USB_PORT_FEAT_C_OVER_CURRENT:
     982         [ #  # ]:          0 :                         ehci_writel(ehci, temp | PORT_OCC, status_reg);
     983                 :            :                         break;
     984                 :            :                 case USB_PORT_FEAT_C_RESET:
     985                 :            :                         /* GetPortStatus clears reset */
     986                 :            :                         break;
     987                 :          0 :                 default:
     988                 :          0 :                         goto error;
     989                 :            :                 }
     990                 :          0 :                 ehci_readl(ehci, &ehci->regs->command);       /* unblock posted write */
     991                 :            :                 break;
     992                 :          0 :         case GetHubDescriptor:
     993                 :          0 :                 ehci_hub_descriptor (ehci, (struct usb_hub_descriptor *)
     994                 :            :                         buf);
     995                 :          0 :                 break;
     996                 :          0 :         case GetHubStatus:
     997                 :            :                 /* no hub-wide feature/status flags */
     998                 :          0 :                 memset (buf, 0, 4);
     999                 :            :                 //cpu_to_le32s ((u32 *) buf);
    1000                 :          0 :                 break;
    1001                 :          0 :         case GetPortStatus:
    1002   [ #  #  #  # ]:          0 :                 if (!wIndex || wIndex > ports)
    1003                 :          0 :                         goto error;
    1004                 :          0 :                 wIndex--;
    1005                 :          0 :                 status = 0;
    1006                 :          0 :                 temp = ehci_readl(ehci, status_reg);
    1007                 :            : 
    1008                 :            :                 // wPortChange bits
    1009         [ #  # ]:          0 :                 if (temp & PORT_CSC)
    1010                 :          0 :                         status |= USB_PORT_STAT_C_CONNECTION << 16;
    1011         [ #  # ]:          0 :                 if (temp & PORT_PEC)
    1012                 :          0 :                         status |= USB_PORT_STAT_C_ENABLE << 16;
    1013                 :            : 
    1014   [ #  #  #  # ]:          0 :                 if ((temp & PORT_OCC) && !ignore_oc){
    1015                 :          0 :                         status |= USB_PORT_STAT_C_OVERCURRENT << 16;
    1016                 :            : 
    1017                 :            :                         /*
    1018                 :            :                          * Hubs should disable port power on over-current.
    1019                 :            :                          * However, not all EHCI implementations do this
    1020                 :            :                          * automatically, even if they _do_ support per-port
    1021                 :            :                          * power switching; they're allowed to just limit the
    1022                 :            :                          * current.  hub_wq will turn the power back on.
    1023                 :            :                          */
    1024   [ #  #  #  # ]:          0 :                         if (((temp & PORT_OC) || (ehci->need_oc_pp_cycle))
    1025         [ #  # ]:          0 :                                         && HCS_PPC(ehci->hcs_params)) {
    1026                 :          0 :                                 spin_unlock_irqrestore(&ehci->lock, flags);
    1027                 :          0 :                                 ehci_port_power(ehci, wIndex, false);
    1028                 :          0 :                                 spin_lock_irqsave(&ehci->lock, flags);
    1029                 :          0 :                                 temp = ehci_readl(ehci, status_reg);
    1030                 :            :                         }
    1031                 :            :                 }
    1032                 :            : 
    1033                 :            :                 /* no reset or resume pending */
    1034         [ #  # ]:          0 :                 if (!ehci->reset_done[wIndex]) {
    1035                 :            : 
    1036                 :            :                         /* Remote Wakeup received? */
    1037         [ #  # ]:          0 :                         if (temp & PORT_RESUME) {
    1038                 :            :                                 /* resume signaling for 20 msec */
    1039                 :          0 :                                 ehci->reset_done[wIndex] = jiffies
    1040                 :          0 :                                                 + msecs_to_jiffies(20);
    1041                 :          0 :                                 usb_hcd_start_port_resume(&hcd->self, wIndex);
    1042                 :          0 :                                 set_bit(wIndex, &ehci->resuming_ports);
    1043                 :            :                                 /* check the port again */
    1044                 :          0 :                                 mod_timer(&ehci_to_hcd(ehci)->rh_timer,
    1045                 :            :                                                 ehci->reset_done[wIndex]);
    1046                 :            :                         }
    1047                 :            : 
    1048                 :            :                 /* reset or resume not yet complete */
    1049         [ #  # ]:          0 :                 } else if (!time_after_eq(jiffies, ehci->reset_done[wIndex])) {
    1050                 :            :                         ;       /* wait until it is complete */
    1051                 :            : 
    1052                 :            :                 /* resume completed */
    1053         [ #  # ]:          0 :                 } else if (test_bit(wIndex, &ehci->resuming_ports)) {
    1054                 :          0 :                         clear_bit(wIndex, &ehci->suspended_ports);
    1055                 :          0 :                         set_bit(wIndex, &ehci->port_c_suspend);
    1056                 :          0 :                         ehci->reset_done[wIndex] = 0;
    1057                 :          0 :                         usb_hcd_end_port_resume(&hcd->self, wIndex);
    1058                 :            : 
    1059                 :            :                         /* stop resume signaling */
    1060                 :          0 :                         temp &= ~(PORT_RWC_BITS | PORT_SUSPEND | PORT_RESUME);
    1061         [ #  # ]:          0 :                         ehci_writel(ehci, temp, status_reg);
    1062                 :          0 :                         clear_bit(wIndex, &ehci->resuming_ports);
    1063                 :          0 :                         retval = ehci_handshake(ehci, status_reg,
    1064                 :            :                                         PORT_RESUME, 0, 2000 /* 2msec */);
    1065         [ #  # ]:          0 :                         if (retval != 0) {
    1066                 :          0 :                                 ehci_err(ehci, "port %d resume error %d\n",
    1067                 :            :                                                 wIndex + 1, retval);
    1068                 :          0 :                                 goto error;
    1069                 :            :                         }
    1070                 :          0 :                         temp = ehci_readl(ehci, status_reg);
    1071                 :            : 
    1072                 :            :                 /* whoever resets must GetPortStatus to complete it!! */
    1073                 :            :                 } else {
    1074                 :          0 :                         status |= USB_PORT_STAT_C_RESET << 16;
    1075                 :          0 :                         ehci->reset_done [wIndex] = 0;
    1076                 :            : 
    1077                 :            :                         /* force reset to complete */
    1078         [ #  # ]:          0 :                         ehci_writel(ehci, temp & ~(PORT_RWC_BITS | PORT_RESET),
    1079                 :            :                                         status_reg);
    1080                 :            :                         /* REVISIT:  some hardware needs 550+ usec to clear
    1081                 :            :                          * this bit; seems too long to spin routinely...
    1082                 :            :                          */
    1083                 :            :                         retval = ehci_handshake(ehci, status_reg,
    1084                 :            :                                         PORT_RESET, 0, 1000);
    1085         [ #  # ]:          0 :                         if (retval != 0) {
    1086                 :          0 :                                 ehci_err (ehci, "port %d reset error %d\n",
    1087                 :            :                                         wIndex + 1, retval);
    1088                 :          0 :                                 goto error;
    1089                 :            :                         }
    1090                 :            : 
    1091                 :            :                         /* see what we found out */
    1092         [ #  # ]:          0 :                         temp = check_reset_complete (ehci, wIndex, status_reg,
    1093                 :            :                                         ehci_readl(ehci, status_reg));
    1094                 :            :                 }
    1095                 :            : 
    1096                 :            :                 /* transfer dedicated ports to the companion hc */
    1097   [ #  #  #  # ]:          0 :                 if ((temp & PORT_CONNECT) &&
    1098                 :          0 :                                 test_bit(wIndex, &ehci->companion_ports)) {
    1099                 :          0 :                         temp &= ~PORT_RWC_BITS;
    1100                 :          0 :                         temp |= PORT_OWNER;
    1101         [ #  # ]:          0 :                         ehci_writel(ehci, temp, status_reg);
    1102                 :          0 :                         ehci_dbg(ehci, "port %d --> companion\n", wIndex + 1);
    1103                 :          0 :                         temp = ehci_readl(ehci, status_reg);
    1104                 :            :                 }
    1105                 :            : 
    1106                 :            :                 /*
    1107                 :            :                  * Even if OWNER is set, there's no harm letting hub_wq
    1108                 :            :                  * see the wPortStatus values (they should all be 0 except
    1109                 :            :                  * for PORT_POWER anyway).
    1110                 :            :                  */
    1111                 :            : 
    1112         [ #  # ]:          0 :                 if (temp & PORT_CONNECT) {
    1113                 :          0 :                         status |= USB_PORT_STAT_CONNECTION;
    1114                 :            :                         // status may be from integrated TT
    1115         [ #  # ]:          0 :                         if (ehci->has_hostpc) {
    1116                 :          0 :                                 temp1 = ehci_readl(ehci, hostpc_reg);
    1117                 :          0 :                                 status |= ehci_port_speed(ehci, temp1);
    1118                 :            :                         } else
    1119                 :          0 :                                 status |= ehci_port_speed(ehci, temp);
    1120                 :            :                 }
    1121         [ #  # ]:          0 :                 if (temp & PORT_PE)
    1122                 :          0 :                         status |= USB_PORT_STAT_ENABLE;
    1123                 :            : 
    1124                 :            :                 /* maybe the port was unsuspended without our knowledge */
    1125         [ #  # ]:          0 :                 if (temp & (PORT_SUSPEND|PORT_RESUME)) {
    1126                 :          0 :                         status |= USB_PORT_STAT_SUSPEND;
    1127         [ #  # ]:          0 :                 } else if (test_bit(wIndex, &ehci->suspended_ports)) {
    1128                 :          0 :                         clear_bit(wIndex, &ehci->suspended_ports);
    1129                 :          0 :                         clear_bit(wIndex, &ehci->resuming_ports);
    1130                 :          0 :                         ehci->reset_done[wIndex] = 0;
    1131         [ #  # ]:          0 :                         if (temp & PORT_PE)
    1132                 :          0 :                                 set_bit(wIndex, &ehci->port_c_suspend);
    1133                 :          0 :                         usb_hcd_end_port_resume(&hcd->self, wIndex);
    1134                 :            :                 }
    1135                 :            : 
    1136         [ #  # ]:          0 :                 if (temp & PORT_OC)
    1137                 :          0 :                         status |= USB_PORT_STAT_OVERCURRENT;
    1138         [ #  # ]:          0 :                 if (temp & PORT_RESET)
    1139                 :          0 :                         status |= USB_PORT_STAT_RESET;
    1140         [ #  # ]:          0 :                 if (temp & PORT_POWER)
    1141                 :          0 :                         status |= USB_PORT_STAT_POWER;
    1142         [ #  # ]:          0 :                 if (test_bit(wIndex, &ehci->port_c_suspend))
    1143                 :          0 :                         status |= USB_PORT_STAT_C_SUSPEND << 16;
    1144                 :            : 
    1145                 :          0 :                 if (status & ~0xffff)       /* only if wPortChange is interesting */
    1146                 :            :                         dbg_port(ehci, "GetStatus", wIndex + 1, temp);
    1147                 :          0 :                 put_unaligned_le32(status, buf);
    1148                 :            :                 break;
    1149                 :          0 :         case SetHubFeature:
    1150         [ #  # ]:          0 :                 switch (wValue) {
    1151                 :            :                 case C_HUB_LOCAL_POWER:
    1152                 :            :                 case C_HUB_OVER_CURRENT:
    1153                 :            :                         /* no hub-wide feature/status flags */
    1154                 :            :                         break;
    1155                 :          0 :                 default:
    1156                 :          0 :                         goto error;
    1157                 :            :                 }
    1158                 :            :                 break;
    1159                 :          0 :         case SetPortFeature:
    1160                 :          0 :                 selector = wIndex >> 8;
    1161                 :          0 :                 wIndex &= 0xff;
    1162         [ #  # ]:          0 :                 if (unlikely(ehci->debug)) {
    1163                 :            :                         /* If the debug port is active any port
    1164                 :            :                          * feature requests should get denied */
    1165         [ #  # ]:          0 :                         if (wIndex == HCS_DEBUG_PORT(ehci->hcs_params) &&
    1166         [ #  # ]:          0 :                             (readl(&ehci->debug->control) & DBGP_ENABLED)) {
    1167                 :          0 :                                 retval = -ENODEV;
    1168                 :          0 :                                 goto error_exit;
    1169                 :            :                         }
    1170                 :            :                 }
    1171   [ #  #  #  # ]:          0 :                 if (!wIndex || wIndex > ports)
    1172                 :          0 :                         goto error;
    1173                 :          0 :                 wIndex--;
    1174                 :          0 :                 temp = ehci_readl(ehci, status_reg);
    1175         [ #  # ]:          0 :                 if (temp & PORT_OWNER)
    1176                 :            :                         break;
    1177                 :            : 
    1178                 :          0 :                 temp &= ~PORT_RWC_BITS;
    1179   [ #  #  #  #  :          0 :                 switch (wValue) {
                      # ]
    1180                 :          0 :                 case USB_PORT_FEAT_SUSPEND:
    1181         [ #  # ]:          0 :                         if (ehci->no_selective_suspend)
    1182                 :            :                                 break;
    1183                 :          0 :                         if ((temp & PORT_PE) == 0
    1184         [ #  # ]:          0 :                                         || (temp & PORT_RESET) != 0)
    1185                 :          0 :                                 goto error;
    1186                 :            : 
    1187                 :            :                         /* After above check the port must be connected.
    1188                 :            :                          * Set appropriate bit thus could put phy into low power
    1189                 :            :                          * mode if we have tdi_phy_lpm feature
    1190                 :            :                          */
    1191                 :          0 :                         temp &= ~PORT_WKCONN_E;
    1192                 :          0 :                         temp |= PORT_WKDISC_E | PORT_WKOC_E;
    1193         [ #  # ]:          0 :                         ehci_writel(ehci, temp | PORT_SUSPEND, status_reg);
    1194         [ #  # ]:          0 :                         if (ehci->has_tdi_phy_lpm) {
    1195                 :          0 :                                 spin_unlock_irqrestore(&ehci->lock, flags);
    1196                 :          0 :                                 msleep(5);/* 5ms for HCD enter low pwr mode */
    1197                 :          0 :                                 spin_lock_irqsave(&ehci->lock, flags);
    1198                 :          0 :                                 temp1 = ehci_readl(ehci, hostpc_reg);
    1199         [ #  # ]:          0 :                                 ehci_writel(ehci, temp1 | HOSTPC_PHCD,
    1200                 :            :                                         hostpc_reg);
    1201                 :          0 :                                 temp1 = ehci_readl(ehci, hostpc_reg);
    1202                 :          0 :                                 ehci_dbg(ehci, "Port%d phy low pwr mode %s\n",
    1203                 :            :                                         wIndex, (temp1 & HOSTPC_PHCD) ?
    1204                 :            :                                         "succeeded" : "failed");
    1205                 :            :                         }
    1206         [ #  # ]:          0 :                         if (ehci_has_fsl_susp_errata(ehci)) {
    1207                 :            :                                 /* 10ms for HCD enter suspend */
    1208                 :          0 :                                 spin_unlock_irqrestore(&ehci->lock, flags);
    1209                 :          0 :                                 usleep_range(10000, 20000);
    1210                 :          0 :                                 spin_lock_irqsave(&ehci->lock, flags);
    1211                 :            :                         }
    1212                 :          0 :                         set_bit(wIndex, &ehci->suspended_ports);
    1213                 :          0 :                         break;
    1214                 :          0 :                 case USB_PORT_FEAT_POWER:
    1215         [ #  # ]:          0 :                         if (HCS_PPC(ehci->hcs_params)) {
    1216                 :          0 :                                 spin_unlock_irqrestore(&ehci->lock, flags);
    1217                 :          0 :                                 ehci_port_power(ehci, wIndex, true);
    1218                 :          0 :                                 spin_lock_irqsave(&ehci->lock, flags);
    1219                 :            :                         }
    1220                 :            :                         break;
    1221                 :          0 :                 case USB_PORT_FEAT_RESET:
    1222         [ #  # ]:          0 :                         if (temp & (PORT_SUSPEND|PORT_RESUME))
    1223                 :          0 :                                 goto error;
    1224                 :            :                         /* line status bits may report this as low speed,
    1225                 :            :                          * which can be fine if this root hub has a
    1226                 :            :                          * transaction translator built in.
    1227                 :            :                          */
    1228                 :          0 :                         if ((temp & (PORT_PE|PORT_CONNECT)) == PORT_CONNECT
    1229                 :            :                                         && !ehci_is_TDI(ehci)
    1230         [ #  # ]:          0 :                                         && PORT_USB11 (temp)) {
    1231                 :          0 :                                 ehci_dbg (ehci,
    1232                 :            :                                         "port %d low speed --> companion\n",
    1233                 :            :                                         wIndex + 1);
    1234                 :          0 :                                 temp |= PORT_OWNER;
    1235                 :            :                         } else {
    1236                 :          0 :                                 temp |= PORT_RESET;
    1237                 :          0 :                                 temp &= ~PORT_PE;
    1238                 :            : 
    1239                 :            :                                 /*
    1240                 :            :                                  * caller must wait, then call GetPortStatus
    1241                 :            :                                  * usb 2.0 spec says 50 ms resets on root
    1242                 :            :                                  */
    1243                 :          0 :                                 ehci->reset_done [wIndex] = jiffies
    1244                 :          0 :                                                 + msecs_to_jiffies (50);
    1245                 :            : 
    1246                 :            :                                 /*
    1247                 :            :                                  * Force full-speed connect for FSL high-speed
    1248                 :            :                                  * erratum; disable HS Chirp by setting PFSC bit
    1249                 :            :                                  */
    1250                 :          0 :                                 if (ehci_has_fsl_hs_errata(ehci))
    1251                 :            :                                         temp |= (1 << PORTSC_FSL_PFSC);
    1252                 :            :                         }
    1253         [ #  # ]:          0 :                         ehci_writel(ehci, temp, status_reg);
    1254                 :            :                         break;
    1255                 :            : 
    1256                 :            :                 /* For downstream facing ports (these):  one hub port is put
    1257                 :            :                  * into test mode according to USB2 11.24.2.13, then the hub
    1258                 :            :                  * must be reset (which for root hub now means rmmod+modprobe,
    1259                 :            :                  * or else system reboot).  See EHCI 2.3.9 and 4.14 for info
    1260                 :            :                  * about the EHCI-specific stuff.
    1261                 :            :                  */
    1262                 :          0 :                 case USB_PORT_FEAT_TEST:
    1263                 :            : #ifdef CONFIG_USB_HCD_TEST_MODE
    1264                 :            :                         if (selector == EHSET_TEST_SINGLE_STEP_SET_FEATURE) {
    1265                 :            :                                 spin_unlock_irqrestore(&ehci->lock, flags);
    1266                 :            :                                 retval = ehset_single_step_set_feature(hcd,
    1267                 :            :                                                                 wIndex + 1);
    1268                 :            :                                 spin_lock_irqsave(&ehci->lock, flags);
    1269                 :            :                                 break;
    1270                 :            :                         }
    1271                 :            : #endif
    1272         [ #  # ]:          0 :                         if (!selector || selector > 5)
    1273                 :          0 :                                 goto error;
    1274                 :          0 :                         spin_unlock_irqrestore(&ehci->lock, flags);
    1275                 :          0 :                         ehci_quiesce(ehci);
    1276                 :          0 :                         spin_lock_irqsave(&ehci->lock, flags);
    1277                 :            : 
    1278                 :            :                         /* Put all enabled ports into suspend */
    1279         [ #  # ]:          0 :                         while (ports--) {
    1280                 :          0 :                                 u32 __iomem *sreg =
    1281                 :          0 :                                                 &ehci->regs->port_status[ports];
    1282                 :            : 
    1283                 :          0 :                                 temp = ehci_readl(ehci, sreg) & ~PORT_RWC_BITS;
    1284         [ #  # ]:          0 :                                 if (temp & PORT_PE)
    1285         [ #  # ]:          0 :                                         ehci_writel(ehci, temp | PORT_SUSPEND,
    1286                 :            :                                                         sreg);
    1287                 :            :                         }
    1288                 :            : 
    1289                 :          0 :                         spin_unlock_irqrestore(&ehci->lock, flags);
    1290                 :          0 :                         ehci_halt(ehci);
    1291                 :          0 :                         spin_lock_irqsave(&ehci->lock, flags);
    1292                 :            : 
    1293                 :          0 :                         temp = ehci_readl(ehci, status_reg);
    1294                 :          0 :                         temp |= selector << 16;
    1295         [ #  # ]:          0 :                         ehci_writel(ehci, temp, status_reg);
    1296                 :            :                         break;
    1297                 :            : 
    1298                 :          0 :                 default:
    1299                 :          0 :                         goto error;
    1300                 :            :                 }
    1301                 :          0 :                 ehci_readl(ehci, &ehci->regs->command);       /* unblock posted writes */
    1302                 :            :                 break;
    1303                 :            : 
    1304                 :            :         default:
    1305                 :            : error:
    1306                 :            :                 /* "stall" on error */
    1307                 :            :                 retval = -EPIPE;
    1308                 :            :         }
    1309                 :          0 : error_exit:
    1310                 :          0 :         spin_unlock_irqrestore (&ehci->lock, flags);
    1311                 :          0 :         return retval;
    1312                 :            : }
    1313                 :            : EXPORT_SYMBOL_GPL(ehci_hub_control);
    1314                 :            : 
    1315                 :          0 : static void ehci_relinquish_port(struct usb_hcd *hcd, int portnum)
    1316                 :            : {
    1317                 :          0 :         struct ehci_hcd         *ehci = hcd_to_ehci(hcd);
    1318                 :            : 
    1319                 :          0 :         if (ehci_is_TDI(ehci))
    1320                 :            :                 return;
    1321                 :          0 :         set_owner(ehci, --portnum, PORT_OWNER);
    1322                 :            : }
    1323                 :            : 
    1324                 :          0 : static int ehci_port_handed_over(struct usb_hcd *hcd, int portnum)
    1325                 :            : {
    1326                 :          0 :         struct ehci_hcd         *ehci = hcd_to_ehci(hcd);
    1327                 :          0 :         u32 __iomem             *reg;
    1328                 :            : 
    1329                 :          0 :         if (ehci_is_TDI(ehci))
    1330                 :            :                 return 0;
    1331                 :          0 :         reg = &ehci->regs->port_status[portnum - 1];
    1332                 :          0 :         return ehci_readl(ehci, reg) & PORT_OWNER;
    1333                 :            : }
    1334                 :            : 
    1335                 :          0 : static int ehci_port_power(struct ehci_hcd *ehci, int portnum, bool enable)
    1336                 :            : {
    1337                 :          0 :         struct usb_hcd *hcd = ehci_to_hcd(ehci);
    1338                 :          0 :         u32 __iomem *status_reg = &ehci->regs->port_status[portnum];
    1339                 :          0 :         u32 temp = ehci_readl(ehci, status_reg) & ~PORT_RWC_BITS;
    1340                 :            : 
    1341         [ #  # ]:          0 :         if (enable)
    1342         [ #  # ]:          0 :                 ehci_writel(ehci, temp | PORT_POWER, status_reg);
    1343                 :            :         else
    1344         [ #  # ]:          0 :                 ehci_writel(ehci, temp & ~PORT_POWER, status_reg);
    1345                 :            : 
    1346         [ #  # ]:          0 :         if (hcd->driver->port_power)
    1347                 :          0 :                 hcd->driver->port_power(hcd, portnum, enable);
    1348                 :            : 
    1349                 :          0 :         return 0;
    1350                 :            : }

Generated by: LCOV version 1.14