From owner-freebsd-current@FreeBSD.ORG Tue Jun 17 14:45:39 2014 Return-Path: Delivered-To: freebsd-current@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 3D67634A; Tue, 17 Jun 2014 14:45:39 +0000 (UTC) Received: from mail.ignoranthack.me (ignoranthack.me [199.102.79.106]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 1DE1C2716; Tue, 17 Jun 2014 14:45:38 +0000 (UTC) Received: from [192.168.200.204] (c-50-131-5-126.hsd1.ca.comcast.net [50.131.5.126]) (using SSLv3 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) (Authenticated sender: sbruno@ignoranthack.me) by mail.ignoranthack.me (Postfix) with ESMTPSA id 06FD01936DE; Tue, 17 Jun 2014 14:45:37 +0000 (UTC) Subject: Re: [patch] USB after second suspend/resume on ThinkPads. From: Sean Bruno Reply-To: sbruno@freebsd.org To: Edward Tomasz =?iso-8859-2?Q?Napiera=B3a?= In-Reply-To: <20140616192155.GE13481@brick.home> References: <20140616192155.GE13481@brick.home> Content-Type: text/plain; charset="iso-8859-2" Date: Tue, 17 Jun 2014 07:45:37 -0700 Message-ID: <1403016337.39699.0.camel@bruno> Mime-Version: 1.0 X-Mailer: Evolution 2.32.1 FreeBSD GNOME Team Port Content-Transfer-Encoding: 8bit Cc: freebsd-current@FreeBSD.org X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 17 Jun 2014 14:45:39 -0000 On Mon, 2014-06-16 at 21:21 +0200, Edward Tomasz Napierała wrote: > 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); > ________________________________ T61 reporting in (even though this is the one you have). It does indeed work and I can access my USB ports after more than 2 suspend resumes. sean