Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 19 Jun 2014 14:18:32 +0300
From:      Alexandr Krivulya <shuriku@shurik.kiev.ua>
To:        freebsd-current@freebsd.org
Subject:   Re: [patch] USB after second suspend/resume on ThinkPads.
Message-ID:  <53A2C708.6060304@shurik.kiev.ua>
In-Reply-To: <20140619104456.GB4651@brick.home>
References:  <20140616192155.GE13481@brick.home> <53A14910.2090303@shurik.kiev.ua> <20140618092901.GB7662@brick.home> <53A284C2.7070002@shurik.kiev.ua> <20140619104456.GB4651@brick.home>

next in thread | previous in thread | raw e-mail | index | archive | help
19.06.2014 13:44, Edward Tomasz Napierała пишет:
> 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@thinkpad:/home/shurik # kldstat|grep ibm
>>>> 9 1 0xffffffff82190000 77e8 acpi_ibm.ko
>>>>
>>>> root@thinkpad:/home/shurik # sysctl dev.acpi_ibm
>>>> root@thinkpad:/home/shurik #
>>>>
>>>> And in dmesg I see this errors:
>>>>
>>>> root@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?
>
This option is enabled by default on my laptop. It allows to charge
mobile devices when laptop in sleep state or powered off via USB 2.0 port.
Now, I reset BIOS to default settings and turned off "Always on USB",
boot to my old kernel without patch and do suspend/resume three times.
Both 3.0 and 2.0 USB ports works fine after each resume.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?53A2C708.6060304>