xhci: factor out parts of xhci_gen_setup()
authorHeiner Kallweit <hkallweit1@gmail.com>
Wed, 11 May 2022 22:04:42 +0000 (01:04 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 12 May 2022 16:30:50 +0000 (18:30 +0200)
Factoring out parts of xhci_gen_setup() has two motivations:
- When adding functionaliy to omit shared hcd if not needed in a
  subsequent patch, we'll have to call xhci_hcd_init_usb3_data()
  from two places.
- It reduces size of xhci_gen_setup() and makes it better readable.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20220511220450.85367-2-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci.c

index 2be38d9..9f801de 100644 (file)
@@ -5209,6 +5209,57 @@ static int xhci_get_frame(struct usb_hcd *hcd)
        return readl(&xhci->run_regs->microframe_index) >> 3;
 }
 
+static void xhci_hcd_init_usb2_data(struct xhci_hcd *xhci, struct usb_hcd *hcd)
+{
+       xhci->usb2_rhub.hcd = hcd;
+       hcd->speed = HCD_USB2;
+       hcd->self.root_hub->speed = USB_SPEED_HIGH;
+       /*
+        * USB 2.0 roothub under xHCI has an integrated TT,
+        * (rate matching hub) as opposed to having an OHCI/UHCI
+        * companion controller.
+        */
+       hcd->has_tt = 1;
+}
+
+static void xhci_hcd_init_usb3_data(struct xhci_hcd *xhci, struct usb_hcd *hcd)
+{
+       unsigned int minor_rev;
+
+       /*
+        * Early xHCI 1.1 spec did not mention USB 3.1 capable hosts
+        * should return 0x31 for sbrn, or that the minor revision
+        * is a two digit BCD containig minor and sub-minor numbers.
+        * This was later clarified in xHCI 1.2.
+        *
+        * Some USB 3.1 capable hosts therefore have sbrn 0x30, and
+        * minor revision set to 0x1 instead of 0x10.
+        */
+       if (xhci->usb3_rhub.min_rev == 0x1)
+               minor_rev = 1;
+       else
+               minor_rev = xhci->usb3_rhub.min_rev / 0x10;
+
+       switch (minor_rev) {
+       case 2:
+               hcd->speed = HCD_USB32;
+               hcd->self.root_hub->speed = USB_SPEED_SUPER_PLUS;
+               hcd->self.root_hub->rx_lanes = 2;
+               hcd->self.root_hub->tx_lanes = 2;
+               hcd->self.root_hub->ssp_rate = USB_SSP_GEN_2x2;
+               break;
+       case 1:
+               hcd->speed = HCD_USB31;
+               hcd->self.root_hub->speed = USB_SPEED_SUPER_PLUS;
+               hcd->self.root_hub->ssp_rate = USB_SSP_GEN_2x1;
+               break;
+       }
+       xhci_info(xhci, "Host supports USB 3.%x %sSuperSpeed\n",
+                 minor_rev, minor_rev ? "Enhanced " : "");
+
+       xhci->usb3_rhub.hcd = hcd;
+}
+
 int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)
 {
        struct xhci_hcd         *xhci;
@@ -5217,7 +5268,6 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)
         * quirks
         */
        struct device           *dev = hcd->self.sysdev;
-       unsigned int            minor_rev;
        int                     retval;
 
        /* Accept arbitrarily long scatter-gather lists */
@@ -5232,60 +5282,14 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)
        xhci = hcd_to_xhci(hcd);
 
        if (usb_hcd_is_primary_hcd(hcd)) {
-               xhci->main_hcd = hcd;
-               xhci->usb2_rhub.hcd = hcd;
-               /* Mark the first roothub as being USB 2.0.
-                * The xHCI driver will register the USB 3.0 roothub.
-                */
-               hcd->speed = HCD_USB2;
-               hcd->self.root_hub->speed = USB_SPEED_HIGH;
-               /*
-                * USB 2.0 roothub under xHCI has an integrated TT,
-                * (rate matching hub) as opposed to having an OHCI/UHCI
-                * companion controller.
-                */
-               hcd->has_tt = 1;
+               xhci_hcd_init_usb2_data(xhci, hcd);
        } else {
-               /*
-                * Early xHCI 1.1 spec did not mention USB 3.1 capable hosts
-                * should return 0x31 for sbrn, or that the minor revision
-                * is a two digit BCD containig minor and sub-minor numbers.
-                * This was later clarified in xHCI 1.2.
-                *
-                * Some USB 3.1 capable hosts therefore have sbrn 0x30, and
-                * minor revision set to 0x1 instead of 0x10.
-                */
-               if (xhci->usb3_rhub.min_rev == 0x1)
-                       minor_rev = 1;
-               else
-                       minor_rev = xhci->usb3_rhub.min_rev / 0x10;
-
-               switch (minor_rev) {
-               case 2:
-                       hcd->speed = HCD_USB32;
-                       hcd->self.root_hub->speed = USB_SPEED_SUPER_PLUS;
-                       hcd->self.root_hub->rx_lanes = 2;
-                       hcd->self.root_hub->tx_lanes = 2;
-                       hcd->self.root_hub->ssp_rate = USB_SSP_GEN_2x2;
-                       break;
-               case 1:
-                       hcd->speed = HCD_USB31;
-                       hcd->self.root_hub->speed = USB_SPEED_SUPER_PLUS;
-                       hcd->self.root_hub->ssp_rate = USB_SSP_GEN_2x1;
-                       break;
-               }
-               xhci_info(xhci, "Host supports USB 3.%x %sSuperSpeed\n",
-                         minor_rev,
-                         minor_rev ? "Enhanced " : "");
-
-               xhci->usb3_rhub.hcd = hcd;
-               /* xHCI private pointer was set in xhci_pci_probe for the second
-                * registered roothub.
-                */
+               xhci_hcd_init_usb3_data(xhci, hcd);
                return 0;
        }
 
        mutex_init(&xhci->mutex);
+       xhci->main_hcd = hcd;
        xhci->cap_regs = hcd->regs;
        xhci->op_regs = hcd->regs +
                HC_LENGTH(readl(&xhci->cap_regs->hc_capbase));