Date: Thu, 12 Sep 2002 13:25:05 -0400 (EDT) From: John Baldwin <jhb@FreeBSD.org> To: Mark Santcroos <marks@ripe.net> Cc: mobile@freebsd.org Subject: RE: pccard re-attach after ACPI S1 resume Message-ID: <XFMail.20020912132505.jhb@FreeBSD.org> In-Reply-To: <20020912125118.GA1343@laptop.6bone.nl>
next in thread | previous in thread | raw e-mail | index | archive | help
On 12-Sep-2002 Mark Santcroos wrote: > This patch fixes the re-attaching of pccards after suspending(S1) with > ACPI on my laptop. > > Although it is tested it might not be the most clean solution. The same > thing could be done for cardbus also, but I don't have any hardware to > test that. > > Please let me know if this should be fixed differently. > > Mark > > > diff -u -r /usr/src/sys/dev/pccard/pccard.c ./pccard.c > --- /usr/src/sys/dev/pccard/pccard.c Thu Sep 12 12:46:13 2002 > +++ ./pccard.c Thu Sep 12 14:05:10 2002 > @@ -155,6 +155,8 @@ > device_t child; > int i; > > + sc->suspended = 0; /* XXX initialize, maybe not here */ > + > /* > * this is here so that when socket_enable calls gettype, trt happens > */ This part you don't need because softc's are zero'd when they are allocated. What if you just had pccard_resume() always call pccard_attach_card(self), does that work? If not, you do have one bug, you should clear sc_suspended after the pccard_attach_card() in pccard_resume(). > @@ -251,6 +253,7 @@ > return (0); > } > > +#define PCCARD_DETACH_FOR_SUSPEND 0x01 > static int > pccard_detach_card(device_t dev, int flags) > { > @@ -265,8 +268,11 @@ > STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) { > int state = device_get_state(pf->dev); > > - if (state == DS_ATTACHED || state == DS_BUSY) > + if (state == DS_ATTACHED || state == DS_BUSY) { > device_detach(pf->dev); > + if(flags & PCCARD_DETACH_FOR_SUSPEND) > + sc->suspended = 1; > + } > if (pf->cfe != NULL) > pccard_function_disable(pf); > pccard_function_free(pf); > @@ -776,14 +782,18 @@ > static int > pccard_suspend(device_t self) > { > - pccard_detach_card(self, 0); > + pccard_detach_card(self, PCCARD_DETACH_FOR_SUSPEND); > return (0); > } > > static > int > -pccard_resume(device_t self) > +pccard_resume(device_t dev) > { > + struct pccard_softc *sc = PCCARD_SOFTC(dev); > + > + if (sc->suspended == 1) > + pccard_attach_card(dev); > return (0); > } > > diff -u -r /usr/src/sys/dev/pccard/pccardvar.h ./pccardvar.h > --- /usr/src/sys/dev/pccard/pccardvar.h Wed Jul 17 07:20:43 2002 > +++ ./pccardvar.h Thu Sep 12 14:06:42 2002 > @@ -205,6 +205,8 @@ > /* this stuff is for the card */ > struct pccard_card card; > int sc_enabled_count; /* num functions enabled */ > + /* was there a device active on time of suspension */ > + int suspended; > }; > > void > > > -- > Mark Santcroos RIPE Network Coordination Centre > http://www.ripe.net/home/mark/ New Projects Group/TTM -- John Baldwin <jhb@FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/ "Power Users Use the Power to Serve!" - http://www.FreeBSD.org/ To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-mobile" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?XFMail.20020912132505.jhb>