xhci: factor out parts of xhci_gen_setup()
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>
This commit is contained in:
parent
b7a4f9b5d0
commit
57f23cd0bf
|
@ -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));
|
||||
|
|
Loading…
Reference in New Issue