[patch] USB after second suspend/resume on ThinkPads.

Edward Tomasz Napierała trasz at FreeBSD.org
Thu Jun 19 10:45:02 UTC 2014


On 0619T0935, Alexandr Krivulya wrote:
> 18.06.2014 12:29, Edward Tomasz Napierała пишет:
> > On 0618T1108, Alexandr Krivulya wrote:
> >> 16.06.2014 22:21, Edward Tomasz Napierała пишет:
> >>> Hi.  Patch below should fix a problem where USB stops working after
> >>> _second_ suspend/resume, which happens on various ThinkPad models.
> >>> Please test, and report both success stories and failures.  If nothing
> >>> comes up, I'll commit it in a week or so.
> >>>
> >>> (Btw, has anyone encountered the problem on hardware other than ThinkPads?)
> >>>
> >>>
> >>> Index: sys/dev/acpi_support/acpi_ibm.c
> >>> ===================================================================
> >>> --- sys/dev/acpi_support/acpi_ibm.c	(revision 267417)
> >>> +++ sys/dev/acpi_support/acpi_ibm.c	(working copy)
> >>> @@ -169,6 +169,9 @@ struct acpi_ibm_softc {
> >>>  	int		light_get_supported;
> >>>  	int		light_set_supported;
> >>>  
> >>> +	/* USB power workaround */
> >>> +	ACPI_HANDLE	power_handle;
> >>> +
> >>>  	/* led(4) interface */
> >>>  	struct cdev	*led_dev;
> >>>  	int		led_busy;
> >>> @@ -365,6 +368,7 @@ acpi_ibm_attach(device_t dev)
> >>>  {
> >>>  	struct acpi_ibm_softc	*sc;
> >>>  	devclass_t		ec_devclass;
> >>> +	ACPI_STATUS		status;
> >>>  
> >>>  	ACPI_FUNCTION_TRACE((char *)(uintptr_t) __func__);
> >>>  
> >>> @@ -448,6 +452,17 @@ acpi_ibm_attach(device_t dev)
> >>>  	if (sc->light_set_supported)
> >>>  		sc->led_dev = led_create_state(ibm_led, sc, "thinklight", sc->light_val);
> >>>  
> >>> +	/*
> >>> +	 * Obtain a handle to the power resource available on many models.
> >>> +	 * This must be turned on manually upon resume. Otherwise the system
> >>> +	 * may, for instance, resume from S3 with usb(4) powered down.
> >>> +	 */
> >>> +	status = AcpiGetHandle(sc->handle, "\\_SB.PCI0.LPC.EC.PUBS", &sc->power_handle);
> >>> +	if (ACPI_FAILURE(status)) {
> >>> +		device_printf(dev, "Failed to get power handle\n");
> >>> +		return (status);
> >>> +	}
> >>> +
> >>>  	return (0);
> >>>  }
> >>>  
> >>> @@ -476,6 +491,7 @@ static int
> >>>  acpi_ibm_resume(device_t dev)
> >>>  {
> >>>  	struct acpi_ibm_softc *sc = device_get_softc(dev);
> >>> +	ACPI_STATUS status;
> >>>  
> >>>  	ACPI_FUNCTION_TRACE((char *)(uintptr_t) __func__);
> >>>  
> >>> @@ -495,6 +511,15 @@ acpi_ibm_resume(device_t dev)
> >>>  
> >>>  		acpi_ibm_sysctl_set(sc, i, val);
> >>>  	}
> >>> +	if (sc->power_handle != NULL) {
> >>> +		status = AcpiEvaluateObject(sc->power_handle,
> >>> +		    "_ON", NULL, NULL);
> >>> +		if (ACPI_FAILURE(status)) {
> >>> +			device_printf(dev, "failed to switch %s on - %s\n",
> >>> +			    acpi_name(sc->power_handle),
> >>> +			    AcpiFormatException(status));
> >>> +		}
> >>> +	}
> >>>  	ACPI_SERIAL_END(ibm);
> >>>  
> >>>  	return (0);
> >> Hi. I've never seen this problem before on my ThinkPad E530. However, I
> >> have applied this patch and after reboot all sysctl oids related to
> >> acpi_ibm disappeared.
> >>
> >> root at thinkpad:/home/shurik # kldstat|grep ibm
> >> 9 1 0xffffffff82190000 77e8 acpi_ibm.ko
> >>
> >> root at thinkpad:/home/shurik # sysctl dev.acpi_ibm
> >> root at thinkpad:/home/shurik #
> >>
> >> And in dmesg I see this errors:
> >>
> >> root at thinkpad:/home/shurik # dmesg -a|grep ibm
> >> acpi_ibm0: <IBM ThinkPad ACPI Extras> on acpi0
> >> acpi_ibm0: Failed to get power handle
> >> device_attach: acpi_ibm0 attach returned 5
> > Ok, I'll make that attach problem non-fatal.
> >
> > Just to make sure: without the patch you don't have any problems
> > with USB after multiple suspend/resume cycles, and you don't use
> > any workarounds to make it work, eg. setting the dev.uhci.0.wake=1,
> > or making USB ports always powered on in BIOS?
> >
> Exactly. I have no any problems with USB. Average uptime is two-three
> weeks with everyday suspend/resume cycle. And I don't use any special
> settings related to usb in loader.conf or sysctl.conf. The only
> difference with GENERIC - all usb support built and loaded as modules.
> In my BIOS i have turned on such settings:
> 
> - USB Support
> - UEFI BIOS Support
> - Always On USB

The last one is off by default, right?  Turning it on actually
works around the problem in earlier Thinkpad models.  Could you
try to set it to default (disable) and see if the problem still
doesn't occur?



More information about the freebsd-current mailing list