Hi, I browsed the Internet for very long time, but I didn't see any discussion indicates a BIOS for fixing it. For this issue, I try to find a place with quirk data for specified laptop. The wmi driver is the only place I found. Please feel free to let me know if there is any further work I should try for fixing it. Thanks, 2016-09-11 22:50 GMT+08:00 Corentin Chary <corentin.chary@xxxxxxxxx>: > I'm not sure what this has to do with the acpi/wmi driver, but I'm > fine to merge it there if there isn't a better place. > > Kai-Chuan: > - Can you double-check that there is no BIOS update fixing this ? > - Can you double-check that there isn't similar code somewhere else in > the kernel ? > > Thanks ! > > On Fri, Sep 9, 2016 at 6:58 PM, Darren Hart <dvhart@xxxxxxxxxxxxx> wrote: >> On Thu, Sep 01, 2016 at 11:55:55PM +0800, Kai-Chuan Hsieh wrote: >>> The bluetooth adapter Atheros AR3012 can't be enumerated >>> and make the bluetooth function broken. >>> >>> T: Bus=02 Lev=01 Prnt=01 Port=05 Cnt=02 Dev#= 5 Spd=12 MxCh= 0 >>> D: Ver= 1.10 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1 >>> P: Vendor=13d3 ProdID=3362 Rev=00.02 >>> S: Manufacturer=Atheros Communications >>> S: Product=Bluetooth USB Host Controller >>> S: SerialNumber=Alaska Day 2006 >>> C: #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=100mA >>> I: If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb >>> I: If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb >>> >>> The error is: >>> >>> usb 2-6: device not accepting address 7, error -62 >>> usb usb2-port6: unable to enumerate USB device >>> >>> It is caused by adapter's connected port is mapped to xHC >>> controller, but the xHCI is not supported by the usb device. >>> >>> The output of 'sudo lspci -nnxxx -s 00:14.0': >>> >>> 00:14.0 USB controller [0c03]: Intel Corporation 8 Series USB xHCI HC [8086:9c31] (rev 04) >>> 00: 86 80 31 9c 06 04 90 02 04 30 03 0c 00 00 00 00 >>> 10: 04 00 a0 f7 00 00 00 00 00 00 00 00 00 00 00 00 >>> 20: 00 00 00 00 00 00 00 00 00 00 00 00 43 10 1f 20 >>> 30: 00 00 00 00 70 00 00 00 00 00 00 00 0b 01 00 00 >>> 40: fd 01 36 80 89 c6 0f 80 00 00 00 00 00 00 00 00 >>> 50: 5f 2e ce 0f 00 00 00 00 00 00 00 00 00 00 00 00 >>> 60: 30 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >>> 70: 01 80 c2 c1 08 00 00 00 00 00 00 00 00 00 00 00 >>> 80: 05 00 87 00 0c a0 e0 fe 00 00 00 00 a1 41 00 00 >>> 90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >>> a0: 00 01 04 00 00 00 00 00 00 00 00 00 00 00 00 00 >>> b0: 0f 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 >>> c0: 03 c0 30 00 00 00 00 00 03 0c 00 00 00 00 00 00 >>> d0: f9 01 00 00 f9 01 00 00 0f 00 00 00 0f 00 00 00 >>> e0: 00 08 00 00 00 00 00 00 00 00 00 00 d8 d8 00 00 >>> f0: 00 00 00 00 00 00 00 00 b1 0f 04 08 00 00 00 00 >>> >>> By referencing Intel Platform Controller Hub(PCH) datasheet, >>> the xHC USB 2.0 Port Routing(XUSB2PR) at offset 0xD0-0xD3h >>> decides the setting of mapping the port to EHCI controller or >>> xHC controller. And the port mapped to xHC will enable xHCI >>> during bus resume. >>> >>> The setting of disabling bluetooth adapter's connected port is >>> 0x000001D9. The value can be obtained by few times 1 bit flip >>> operation. The suited configuration should have the 'lsusb -t' >>> result with bluetooth using ehci: >>> >>> /: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M >>> /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/9p, 480M >>> |__ Port 5: Dev 2, If 0, Class=Video, Driver=uvcvideo, 480M >>> |__ Port 5: Dev 2, If 1, Class=Video, Driver=uvcvideo, 480M >>> /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M >>> |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M >>> |__ Port 6: Dev 3, If 0, Class=Wireless, Driver=btusb, 12M >>> |__ Port 6: Dev 3, If 1, Class=Wireless, Driver=btusb, 12M >>> >>> Signed-off-by: Kai-Chuan Hsieh <kai.chiuan@xxxxxxxxx> >>> --- >>> drivers/platform/x86/asus-nb-wmi.c | 13 +++++++++++++ >>> drivers/platform/x86/asus-wmi.c | 29 +++++++++++++++++++++++++++++ >>> drivers/platform/x86/asus-wmi.h | 1 + >>> 3 files changed, 43 insertions(+) >>> >>> diff --git a/drivers/platform/x86/asus-nb-wmi.c b/drivers/platform/x86/asus-nb-wmi.c >>> index adecc1c..b64dc16 100644 >>> --- a/drivers/platform/x86/asus-nb-wmi.c >>> +++ b/drivers/platform/x86/asus-nb-wmi.c >>> @@ -87,6 +87,10 @@ static struct quirk_entry quirk_no_rfkill_wapf4 = { >>> .no_rfkill = true, >>> }; >>> >>> +static struct quirk_entry quirk_asus_x550lb = { >>> + .xusb2pr = 0x01D9, >>> +}; >>> + >>> static int dmi_matched(const struct dmi_system_id *dmi) >>> { >>> quirks = dmi->driver_data; >>> @@ -351,6 +355,15 @@ static const struct dmi_system_id asus_quirks[] = { >>> }, >>> .driver_data = &quirk_no_rfkill, >>> }, >>> + { >>> + .callback = dmi_matched, >>> + .ident = "ASUSTeK COMPUTER INC. X550LB", >>> + .matches = { >>> + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), >>> + DMI_MATCH(DMI_PRODUCT_NAME, "X550LB"), >>> + }, >>> + .driver_data = &quirk_asus_x550lb, >>> + }, >>> {}, >>> }; >>> >>> diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c >>> index 7c093a0..8cd689a 100644 >>> --- a/drivers/platform/x86/asus-wmi.c >>> +++ b/drivers/platform/x86/asus-wmi.c >>> @@ -156,6 +156,9 @@ MODULE_LICENSE("GPL"); >>> #define ASUS_FAN_CTRL_MANUAL 1 >>> #define ASUS_FAN_CTRL_AUTO 2 >>> >>> +#define USB_INTEL_XUSB2PR 0xD0 >>> +#define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI 0x9c31 >>> + >>> struct bios_args { >>> u32 arg0; >>> u32 arg1; >>> @@ -1080,6 +1083,29 @@ exit: >>> return result; >>> } >>> >>> +static void asus_wmi_set_xusb2pr(struct asus_wmi *asus) >>> +{ >>> + struct pci_dev *xhci_pdev; >>> + u32 orig_ports_available; >>> + u32 ports_available = asus->driver->quirks->xusb2pr; >>> + >>> + xhci_pdev = pci_get_device(PCI_VENDOR_ID_INTEL, >>> + PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI, >>> + NULL); >>> + >>> + if (!xhci_pdev) >>> + return; >>> + >>> + pci_read_config_dword(xhci_pdev, USB_INTEL_XUSB2PR, >>> + &orig_ports_available); >>> + >>> + pci_write_config_dword(xhci_pdev, USB_INTEL_XUSB2PR, >>> + cpu_to_le32(ports_available)); >>> + >>> + pr_info("set USB_INTEL_XUSB2PR old: 0x%04x, new: 0x%04x\n", >>> + orig_ports_available, ports_available); >>> +} >> >> These seems more appropriate as a debug statement than an info statement to me. >> This certainly isn't at the level a user would need to see. >> >> Otherwise, this looks good to me. >> >> Corentin, any other concerns? >> >>> + >>> /* >>> * Hwmon device >>> */ >>> @@ -2084,6 +2110,9 @@ static int asus_wmi_add(struct platform_device *pdev) >>> if (asus->driver->quirks->wmi_backlight_power) >>> acpi_video_set_dmi_backlight_type(acpi_backlight_vendor); >>> >>> + if (asus->driver->quirks->xusb2pr) >>> + asus_wmi_set_xusb2pr(asus); >>> + >>> if (acpi_video_get_backlight_type() == acpi_backlight_vendor) { >>> err = asus_wmi_backlight_init(asus); >>> if (err && err != -ENODEV) >>> diff --git a/drivers/platform/x86/asus-wmi.h b/drivers/platform/x86/asus-wmi.h >>> index 5de1df5..cd6b108 100644 >>> --- a/drivers/platform/x86/asus-wmi.h >>> +++ b/drivers/platform/x86/asus-wmi.h >>> @@ -51,6 +51,7 @@ struct quirk_entry { >>> * and let the ACPI interrupt to send out the key event. >>> */ >>> int no_display_toggle; >>> + u32 xusb2pr; >>> }; >>> >>> struct asus_wmi_driver { >>> -- >>> 2.7.4 >>> >>> >> >> -- >> Darren Hart >> Intel Open Source Technology Center > > > > -- > Corentin Chary > http://xf.iksaif.net -- To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html