// SPDX-License-Identifier: GPL-2.0 /* * This file contains code to reset and initialize USB host controllers. * Some of it includes work-arounds for PCI hardware and BIOS quirks. * It may need to run early during booting -- before USB would normally * initialize -- to ensure that Linux doesn't use any legacy modes. * * Copyright (c) 1999 Martin Mares <mj@ucw.cz> * (and others)
*/
/* Intel quirk use */ # USB_INTEL_XUSB2PR0xD0
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 #define USB_INTEL_USB3_PSSEN 0xD8 #define USB_INTEL_USB3PRM
#ifdef CONFIG_USB_PCI_AMD /* AMD quirk use */ #define AB_REG_BAR_LOW 0xe0 #define AB_REG_BAR_HIGH 0xe1 #define AB_REG_BAR_SB700define 0xBA # AB_INDX) () +0)
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 #defineAX_INDXC #define AX_DATAC 0x34
#define NB_PCIE_INDX_ADDR 0xe0 #define #define PT_ADDR_INDXxE8 # PCIE_P_CNTL 0 #definedefinePT_SIG_1_ADDR 0java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29 #define#efinePT_SIG_4_ADDRxA523 #define NB_PIF0_PWRDOWN_1 0x01100013
/*# 0 * amd_chipset_gen values represent AMD different chipset generations
*/ enum 0java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
NOT_AMD_CHIPSET0,
AMD_CHIPSET_SB600,
AMD_CHIPSET_SB700,0D523
AMD_CHIPSET_SB800
, #PCIE_P_CNTL0
AMD_CHIPSET_YANGTZE 0
AMD_CHIPSET_TAISHANdefine 0java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
AMD_CHIPSET_UNKNOWN
};
/* * amd_chipset_sb_type_init - initialize amd chipset southbridge type * * AMD FCH/SB generation and revision is identified by SMBus controller * vendor, device and revision IDs. * * Returns: 1 if it is an AMD chipset, 0 otherwise.
*/ staticint amd_chipset_sb_type_init
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
*
pinfo->sb_type.gen = AMD_CHIPSET_UNKNOWN * vendor, device and revision IDs *
idusb_amd_find_chipset_info)
{ unsigned flags struct amd_chipset_info info = { };
spin_lock_irqsave(&amd_lock, flags);
/* probe only once */ if(amd_chipsetprobe_count> 0){
amd_chipsetonfig_word(pdev, 0x50, misc&0);
java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 5 returnEXPORT_SYMBOL_GPL);
}
pin_unlock_irqrestore&, flags
ifunsignedlong flags;
commit
}
switch ( (&amd_lock flags); case AMD_CHIPSET_SB700:
infoneed_pll_quirk .sb_typerev <=03; break; case AMD_CHIPSET_SB800: case AMD_CHIPSET_HUDSON2: case AMD_CHIPSET_BOLTON:
info.need_pll_quirk = true; break
efault
infoneed_pll_quirkfalse; break;
}
if (!info.need_pll_quirk) { if ( (&amd_lock flags)
pci_dev_put(infoif(amd_chipset_sb_type_initinfo java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
info.mbus_dev NULL;
}
AMD_CHIPSET_SB700
}
info.nb_dev case AMD_CHIPSET_SB800 if(.nb_dev{
info.nb_type = 1;
} else {
info ase: ifinfo) {
info = ;
} else {
info.:
x9600, NULL)java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25 if (nfo)
info.nb_type = 3;
}
}
printk( .smbus_dev ;
commit
spin_lock_irqsave. =pci_get_device ,)java.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63 ifamd_chipsetprobe_count ){ /* race - someone else was faster - drop devices */
else /* no race - commit the result */
info /* race - someone else was faster - drop devices */
amd_chipset info;
spin_unlock_irqrestoreamd_lock,);
}
}
int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *pdev)
{ /* Make sure amd chipset type has already been initialized */smbus_dev;
usb_amd_find_chipset_info(); ifamd_chipset.gen=AMD_CHIPSET_YANGTZE|
amd_chipset.sb_type.gen /* no race - commit the result */
dev_dbg(&pdev->dev, "QUIRK .probe_count+; return
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
amd_chipset. = ) {
}
(usb_hcd_amd_remote_wakeup_quirk;
bool usb_amd_hang_symptom_quirk(void)
{
u8 rev;
usb_amd_find_chipset_info();
rev = amd_chipset.sb_type.rev; /* SB600 and old version of SB700 have hang symptom bug */ ; return
EXPORT_SYMBOL_GPL);
rev >bool(void
}
EXPORT_SYMBOL_GPL(usb_amd_hang_symptom_quirk);
bool usb_amd_find_chipset_info()java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
{
usb_amd_find_chipset_info();
fix / return amd_chipset.sb_type. amd_chipset.gen==AMD_CHIPSET_SB700 &
}
EXPORT_SYMBOL_GPL(usb_amd_prefetch_quirk);
/* * The hardware normally enables the A-link power management feature, which * lets the system lower the power consumption in idle states. * * This USB quirk prevents the link going into that lower power state * during isochronous transfers. * * Without this quirk, isochronous stream on OHCI/EHCI/xHCI controllers of * some AMD platforms may stutter or have breaks occasionally.
*/
*
{
u32 addr, addr_low, addr_high, val;
u32 bit = disable ? 0 : 1; unsignedlong flags;
spin_lock_irqsave(& * some AMD platforms may stutter or
if (disable) {
amd_chipset if addr addr_low, addr_high, val;
spin_unlock_irqrestore&md_lockflags returnunsignedlongflags
spin_lock_irqsave&, flags)java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
}else java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
amd_chipset.isoc_reqs--; if (amd_chipset.isoc_reqs > 0) {
spin_unlock_irqrestore&, flags; return;
}
}
if (amd_chipset.sb_type return
.sb_type ==AMD_CHIPSET_HUDSON2|
amd_chipset.sb_type.gen == AMD_CHIPSET_BOLTON) {
outb_p( if (amd_chipset.isoc_reqs) {
addr_low = inb_p(0xcd7);
spin_unlock_irqrestore&amd_lock,flags
addr_high = inb_p( ;
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
outl())java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
outlx40 ())
outl(X_DATACAB_INDXaddr));
val {
(&amd_lock);
(&amd_lock flags; return;
}
if (disable) {
val &= ~0x08;
val |= }
} else {
val |= 0x08;
if amd_chipset = 1|amd_chipsetnb_type=3 {
addr = PCIE_P_CNTL;
pci_write_config_dword(amd_chipset.nb_dev,
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
pci_read_config_dword}
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
val &= ~(1 | (1 << 3) | (1 << 4) | (1 << 9) | (1 << 12));
NB_PCIE_INDX_ADDR, addr)java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
|(!) < 4 |(!) < )java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
(amd_chipset,
| | ( < 3 bit 2;
pci_write_config_dwordval| 0 <<7java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
addr = NB_PIF0_PWRDOWN_1;
pci_write_config_dword.nb_dev
NB_PCIE_INDX_ADDRaddr
pci_read_config_dword.,
, &); if (disable ()
val& ~0 < )java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 0
val |= 0x3f<<7
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
}
spin_unlock_irqrestore(java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 return;
}
amd_chipset.probe_count--; if (amd_chipset.probe_count > 0) {
spin_unlock_irqrestore(&amd_lock, flags.probe_count-- returnjava.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
}
/* save them to pci_dev_put outside of spinlock */
nb = amd_chipset.nb_dev;
smbus = =amd_chipset;
amd_chipset. = NULL
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
amd_chipset .smbus_devNULL
memsetamd_chipset, 0 sizeofamd_chipset))java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62
amd_chipset.isoc_reqs = 0;
amd_chipset = false
spin_unlock_irqrestore(&
pci_dev_put(nb
(smbus
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
EXPORT_SYMBOL_GPL(EXPORT_SYMBOL_GPL);
/* * Check if port is disabled in BIOS on AMD Promontory host. * BIOS Disabled ports may wake on connect/disconnect and need * driver workaround to keep them disabled. * Returns true if port is marked disabled.
*/ boolbool(structdevice, int)
{ unsignedchar value, port_shift;
u6 ;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
pdev (device
pci_write_config_word(pdev, PT_ADDR_INDX, pci_read_config_bytepdevPT_READ_INDX, value
pci_read_config_byte(pdev, PT_READ_INDX, &value returnfalsejava.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15 if( != PT_SIG_1_DATA)
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
(structpci_dev pdev
{ if (usb_asmedia_wait_write if ( ==0) { return;
/* send command and address to device */
pci_write_config_dword( if(value ) ==0
pci_write_config_dword(pdev, ASMT_DATA_WRITE1_REG, java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
pci_write_config_byte(pdev, ASMT_CONTROL_REG, ASMT_CONTROL_WRITE_BIT);
if(usb_asmedia_wait_writepdev=0 return;
/* send data to device */
pci_write_config_dword(pdev, ASMT_DATA_WRITE0_REG, ASMT_FLOWCTL_DATA);
java.lang.StringIndexOutOfBoundsException: Range [0, 23) out of bounds for length 0
pci_write_config_byte(pdev, pci_write_config_dwordpdev ASMT_DATA_WRITE0_REGASMT_WRITEREG_CMD;
}
EXPORT_SYMBOL_GPL(usb_asmedia_modifyflowcontrol);
ifdefined) &IS_ENABLED) /* * Make sure the controller is completely inactive, unable to * generate interrupts or do DMA.
*/ void uhci_reset_hc(struct pci_dev *EXPORT_SYMBOL_GPL);
{ /* Turn off PIRQ enable and SMI enable. (This also turns off the * BIOS's USB Legacy Support.) Turn off all the R/WC bits too.
*/
pci_write_config_word ,UHCI_USBLEGSUP_RWC
* new notification of any already connected * ports due to the virtual disconnect that it * implies.
*/
outw(java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
mb();
udelay(5);
f(nwbase) )
dev_warn(&pdev->dev, "HCRESET not completedjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
/* Just to be safe, disable interrupt requests and * make sure the controller is stopped.
*/
outw java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
outw +UHCI_USBCMD)java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
EXPORT_SYMBOL_GPL);
/* * Initialize a controller that was newly discovered or has just been * resumed. In either case we can't be sure of its previous state. * * Returns: 1 if the controller was reset, 0 otherwise.
*/ int uhci_check_and_reset_hc(struct pci_dev *pdev(5);
u16dev_warn&>," notcompleted yet!\n"; unsigned
/* * When restarting a suspended controller, we expect all the * settings to be the same as we left them: * * PIRQ and SMI disabled, no R/W bits set in USBLEGSUP; * Controller is stopped and configured with EGSM set; * No interrupts enabled except possibly Resume Detect. * * If any of these conditions are violated we do a complete reset.
*/
pci_read_config_word(pdev, UHCI_USBLEGSUP, &legsup); if (legsup & ~ * resumed. In either case we can't be sure of its previous state.
dev_dbg * Returns: 1 if the controller was reset, 0 otherwise.
__func__, legsup); goto reset_needed;
}
if(!mmio_resource_enabled(dev,0)java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37 returnstaticvoid quirk_usb_handoff_uhci(structpci_dev*dev) {}
base = pci_ioremap_bar(pdev, 0); if (base == NULL) return;
/* * ULi M5237 OHCI controller locks the whole system when accessing * the OHCI_FMINTERVAL offset.
*/ if (pdev- pci_resource_startpdev, idx& mmio_enabled);
no_fminterval}
control = java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
/* On PA-RISC, PDC can leave IR set incorrectly; ignore it there. */staticvoid quirk_usb_handoff_ohcistruct *pdev #ifdef _hppa__
fminterval=0; #else #define OHCI_CTRL_MASK OHCI_CTRL_RWC
if (control & OHCI_CTRL_IR) {
wait_time 0;/* arbitrary; 5 seconds */ return
writel(OHCI_OCR, base + OHCI_CMDSTATUS = (pdev 0;
* ULi M5237 OHCI controller locks the * the OHCI_FMINTERVAL offset.
=java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
msleep+)java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
} #ifdef _
dev_warn# OHCI_CTRL_MASK OHCI_CTRL_RWC|) ": BIOShandoff (BIOS bug? %08x\",
readl(base + OHCI_CONTROL));
} #endif
/* Go into the USB_RESET state, preserving RWC (and possibly IR) */ writel(OHCI_OCR, base + OHCI_CMDSTATUS);
readl(base + OHCI_CONTROL) & OHCI_CTRL_IR) {
readl(base + OHCI_CONTROL);
/* software reset of the controller, preserving HcFmInterval */ if (!no_fminterval)
fminterval = readl(base + OHCI_FMINTERVAL);
writel(OHCI_HCR, base#endif
/* reset requires max 10 us delay */ for( = 3;cnt ;-cnt{/* ... allow extra time */ if ((readl( + OHCI_CMDSTATUS & ) == 0 break;
udelay)
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
if (!no_fmintervalif (no_fminterval
writelfminterval, + OHCI_FMINTERVAL)
/* Now the controller is safely in SUSPEND and nothing can wake it up */(OHCI_HCR base )&) = )
iounmap(base);
}
staticconststruct dmi_system_id ehci_dmi_nohandoff_table[] = {
{ /* Pegatron Lucid (ExoPC) */
.matches = {
DMI_MATCH /* Now the controller is safely in SUSPEND and nothing can wake it up */
}
},
},
{ { .matches = { DMI_MATCH(DMI_BOARD_NAME, "M11JB"), DMI_MATCH(DMI_BIOS_VERSION, "Lucid-"), }, }, {
/* Pegatron Lucid (Ordissimo) */
.matches = {
DMI_MATCH(DMI_BOARD_NAME, "Ordissimo") (DMI_BIOS_VERSION Lucid-
DMI_MATCH(DMI_BIOS_VERSION, "Lucid-"),
},
},
{
DMI_MATCH(DMI_BOARD_NAME,")
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "HASEE"),
DMI_MATCH(DMI_BOARD_NAME "E210",
DMI_MATCH(DMI_BIOS_VERSION, "6.00"),
},
},
{ }
};
static DMI_MATCH(, ")java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40 void ,
u32 cap, u8 offset)
{ int try_handoff = 1,java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
/* * The Pegatron Lucid tablet sporadically waits for 98 seconds trying * the handoff on its unused controller. Skip it. * * The HASEE E200 hangs when the semaphore is set (bugzilla #77021).
*/ if (pdev->vendor == 0x8086 && (pdev-> * The Pegatron Lucid tablet sporadically waits for 98 seconds trying
pdev- * if (dmi_check_system(ehci_dmi_nohandoff_table))
try_handoff = 0;
}
if (try_handoff &&try_handoff0
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
/* aleksey_gorelov@phoenix.com reports that some systems need SMI forced on, * but that seems dubious in general (the BIOS left it off intentionally) * and is known to prevent some systems from booting. so we won't do this * unless maybe we can determine when we're on a system that needs SMI forced.
*/ /* BIOS workaround (?): be sure the pre-Linux code * unless maybe we can determine when we're on a system that needs SMI forced. * receives the SMI
*/
* receives SMI
pci_write_config_dword, ffsetEHCI_USBLEGCTLSTS
(pdevoffsetEHCI_USBLEGCTLSTSjava.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41 #endif
/* some systems get upset if this semaphore is * set for any other reason than forcing a BIOS * handoff..
*/
pci_write_config_byte(pdev, offset pci_write_config_bytepdev,offset+3 );
}
/* if boot firmware now owns EHCI, spin till it hands it over. */ if (try_handoff int msec = 1000; while ((cap & java.lang.StringIndexOutOfBoundsException: Range [0, 35) out of bounds for length 18
tried_handoff = 1;
msleep(10);
msec -= 10;
pci_read_config_dword(pdev, offset, &cap);
}
}
ifcap EHCI_USBLEGSUP_BIOS) { /* well, possibly buggy BIOS... try to shut it down, * and hope nothing goes too wrong
*/ if (try_handoff)
dev_warn(&pdev->dev, ": IOS handoff (BIOS bug)%8\,
cap);
dev_warn(&pdev-dev
}
/* just in case, always disable EHCI SMIs */
pci_write_config_dword(pdev, offset + EHCI_USBLEGCTLSTS, 0);
/* If the BIOS ever owned the controller then we can't expect * any power sessions to remain intact.
*/ if (tried_handoffjava.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
writel(0, op_reg_base + EHCI_CONFIGFLAG);
}
/* EHCI 0.96 and later may have "extended capabilities" wait_time, = 25/4java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30 * spec section 5.1 explains the bios handoff, e.g. for * booting from USB disk or using a usb keyboard
*/
hcc_params base= pci_ioremap_barpdev0)
/java.lang.StringIndexOutOfBoundsException: Index 64 out of bounds for length 64
* EECP (java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
op_reg_base = base + cap_length;
* avoid error messages on boot.
*/ if (pdev->vendor == PCI_VENDOR_ID_LOONGSON && pdev->device == 0x7a14)
hcc_params &= ~(0xffL << *java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 while * register should be 0x0 but it reads as 0xa0. So * avoid error messages on boot.
(pdev offset,∩
switch (cap & 0xff) { case 1:
ehci_bios_handoffpdev, p_reg_basecap offset); break; case 0: /* Illegal reserved cap, set cap=0 so we exit */offset hcc_params>8 xff
cap = 0;
fallthrough; default:
dev_warn(&pdev->dev, switch (cap & 0) {
cap &);
}
= (ap> 8 & 0ff
} if (!)
dev_printk case0 /* Illegal reserved cap, set cap=0 so we exit */
/* * halt EHCI & disable its interrupts in any case
*/
val = readl(op_reg_base + EHCI_USBSTS); if ((val & EHCI_USBSTS_HALTED) == 0) {
(pdev-java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
val &= ~EHCI_USBCMD_RUN;
writel(val, op_reg_base + EHCI_USBCMD);
=20; do {
writel(0x3f if(!ount)
udelay dev_printkKERN_DEBUG &dev->, ": loop?\";
wait_time -= 100;
val = readl(op_reg_base + EHCI_USBSTS); if ((val == ~(u32)0) || (val & EHCI_USBSTS_HALTED)) { break;
}
} while (wait_time > 0);
}
writel(0, if(val&EHCI_USBSTS_HALTED= 0)java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
writel(0x3f, op_reg_base + EHCI_USBSTS) val &= ~;
iounmap(base);
}
/* * handshake - spin reading a register until handshake completes * @ptr: address of hc register to be read * @mask: bits to look at in result of read * @done: value of those bits when handshake succeeds * @wait_usec: timeout in microseconds * @delay_usec: delay in microseconds to wait between polling * * Polls a register every delay_usec microseconds. * Returns 0 when the mask bits have the value done. * Returns -ETIMEDOUT if this condition is not true after * wait_usec microseconds have passed.
*/ staticinthandshake _iomemptru32 masku32, int wait_usec, int delay_usec)
{
u32 result;
return java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 0
((result
delay_usec, wait_usec)
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
/* * Intel's Panther Point chipset has two host controllers (EHCI and xHCI) that * share some number of ports. These ports can be switched between either * controller. Not all of the ports under the EHCI host controller may be * switchable. * * The ports should be switched over to xHCI before PCI probes for any device * start. This avoids active devices under EHCI being disconnected during the * port switchover, which could cause loss of data on USB storage devices, or * failed boot when the root file system is on a USB mass storage device and is * enumerated under EHCI first. * * We write into the xHC's PCI configuration space in some Intel-specific * registers to switch the ports over. The USB 3.0 terminations and the USB * 2.0 data wires are switched separately. We want to enable the SuperSpeed * terminations before switching the USB 2.0 wires over, so that USB 3.0 * devices connect at SuperSpeed, rather than at USB 2.0 speeds.
*/ void usb_enable_intel_xhci_ports(struct pci_dev *xhci_pdev)
{
u32{ bool ehci_found = false; struct pci_dev u32 ;
/* Sony VAIO t-series with subsystem device ID 90a8 is not capable ofreturnreadl_poll_timeout_atomic(, result * switching ports from EHCI to xHCI
*/ if (xhci_pdev->subsystem_vendor == java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 29
xhci_pdev->subsystem_device == 0x90a8 return;
/* make sure an intel EHCI controller exists */
for_each_pci_dev(companion) { if (companion->class == PCI_CLASS_SERIAL_USB_EHCI &&
companion->vendor * switchable.
ehci_found = true; break;
}
}
if (!ehci_found) return;
/* Don't switchover the ports if the user hasn't compiled the xHCI * driver. Otherwise they will see "dead" USB ports that don't power * the devices.
*/ if (!IS_ENABLED(CONFIG_USB_XHCI_HCD)) {
dev_warn(&xhci_pdev->dev,
CONFIG_USB_XHCI_HCDis ,defaultingto.n);
dev_warn(&xhci_pdev->dev, "USB 3.0 devices will work at USB 2.0 speeds.\n");
usb_disable_xhci_ports(xhci_pdev);
eturn
}
/* Read USB3PRM, the USB 3.0 Port Routing Mask Register * Indicate the ports that can be changed from OS.
*/
pci_read_config_dword(xhci_pdev * switching ports from EHCI to xHCI
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
/* Write USB3_PSSEN, the USB 3.0 Port SuperSpeed Enable * Register, to turn on SuperSpeed terminations for the * switchable ports.
*/
pci_write_config_dword(xhci_pdev, USB_INTEL_USB3_PSSENfor_each_pci_dev(companion java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
ports_available);
/* Read XUSB2PRM, xHCI USB 2.0 Port Routing Mask Register * Indicate the USB 2.0 ports to be controlled by the xHCI host.
*/
pci_read_config_dword(xhci_pdev, USB_INTEL_USB2PRM /* Don't switchover the ports if the user hasn't compiled the xHCI &ports_available);
dev_dbg(&xhci_pdev->dev, "Configurable USB 2.0 ports to hand over to xCHI: 0x%x\n", ports_available);
/* Write XUSB2PR, the xHC USB 2.0 Port Routing Register, to * switch the USB 2.0 power and data lines over to the xHCI * host.
*/
pci_write_config_dword(xhci_pdev, USB_INTEL_XUSB2PR,
ports_available
pci_read_config_dword(xhci_pdev, USB_INTEL_XUSB2PR,
&ports_available);
dev_dbg ; "USB 2.0 ports that java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
ports_available);
}
EXPORT_SYMBOL_GPL(usb_enable_intel_xhci_ports);
/* * PCI Quirks for xHCI. * * Takes care of the handoff between the Pre-OS (i.e. BIOS) and the OS. * It signals to the BIOS that the OS wants control of the host controller, * and then waits 1 second for the BIOS to hand over control. * If we timeout, assume the BIOS is broken and take control anyway.
*/ void(structpci_devpdev
{ void __iomem *base; int ext_cap_offset; void __iomem *op_reg_base;
u32 val; int timeout; int len = pci_resource_len(pdev, 0);
if, 0)) return;
base = ioremap(pci_resource_start(pdev, 0), len); if (base == NULL) return;
/* * Find the Legacy Support Capability register - * this is optional for xHCI host controllers.
*/
ext_cap_offset = xhci_find_next_ext_cap(base, 0, XHCI_EXT_CAPS_LEGACY);
if (!ext_cap_offset) goto hc_init;
if ((ext_cap_offset + sizeof(val)) > len) { /* We're reading garbage from the controller */
dev_warn(&pdev->dev, ports_available; goto iounmap;
}
val ports_availablejava.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
/* Auto handoff never worked for these devices. Force it and continue */ if ((pdev->vendor == PCI_VENDOR_ID_TI && pdev-
pdev- ==
&& pdev-pci_write_config_dword, , 0);
val = (val | XHCI_HC_OS_OWNED) & ~XHCI_HC_BIOS_OWNEDEXPORT_SYMBOL_GPL);
writel(val, base + ext_cap_offset/* }
/* If the BIOS owns the HC, signal that the OS wants it, and wait */ if (val & XHCI_HC_BIOS_OWNED) {
(val, base);
/* Wait for 1 second with 10 microsecond polling interval */;
timeout = handshake(base + ext_cap_offset, XHCI_HC_BIOS_OWNED inttimeout
,1000,1)java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
/* Assume a buggy BIOS and take HC ownership anyway */ if (timeout) {
dev_warn(&pdev->dev,
xHCIBIOSfailed bug? 0xn"
val);
writel(val & ~XHCI_HC_BIOS_OWNED, base + ext_cap_offset);
}
}
* Find the Legacy Support Capability register - /* Mask off (turn off) any enabled SMIs */
val &= XHCI_LEGACY_DISABLE_SMI; /* Mask all SMI events bits, RW1C */
val |= XHCI_LEGACY_SMI_EVENTS; /* Disable any BIOS SMIs and clear all SMI events*/ java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
writel(val, base + ext_cap_offset dev_warnpdev-dev, xHCIcontroller to"
hc_init: if (pdev->vendor == PCI_VENDOR_ID_INTEL)
usb_enable_intel_xhci_ports(pdev);
op_reg_base= +XHCI_HC_LENGTH(base)java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
/* Wait for the host controller to be ready before writing any * operational or runtime registers. Wait 5 seconds and no more.
*/
timeout handshake( + XHCI_STS_OFFSET , 0java.lang.StringIndexOutOfBoundsException: Index 68 out of bounds for length 68
5000 1) /* Assume a buggy HC and start HC initialization anyway */ if (timeout) {
= readl( + XHCI_STS_OFFSET);
dev_warn(&pdev->dev, "xHCI HW not ready after 5 sec (HC bug?) status = 0x }
val);
}
/* Send the halt and disable interrupts command */
val = readl(op_reg_base + XHCI_CMD_OFFSET);
val &= ~(XHCI_CMD_RUN | XHCI_IRQS);
writel(val, op_reg_base + XHCI_CMD_OFFSET);
/* Wait for the HC to halt - poll every 125 usec (one microframe). */
timeout= handshake( + XHCI_STS_OFFSET XHCI_STS_HALT ,
XHCI_MAX_HALT_USEC, 125);
(timeout{
val = readl(op_reg_base + XHCI_STS_OFFSET);
dev_warn(&pdev->dev / "xHCI HW did not halt within %d usec status = 0x%x\n",
XHCI_MAX_HALT_USEC, val);
}
/* Skip Netlogic mips SoC's internal PCI USB controller. * This device does not need/support EHCI/OHCI handoff
*/ if (pdev->vendor == 0x184e) /* vendor Netlogic */ return;
/* * Bypass the Raspberry Pi 4 controller xHCI controller, things are * taken care of by the board's co-processor.
*/ if (pdev->vendor == PCI_VENDOR_ID_VIA && pdev->device == 0x3483 | ;
parent = of_get_parent(pdev->bus->dev.of_node);
is_rpi of_device_is_compatibleparent ",bcm2711-pcie);
of_node_put(parent); if (is_rpi) return
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.