RE: pccard re-attach after ACPI S1 resume

John Baldwin <[email protected]>
Newsgroups gmane.os.freebsd.devel.mobile
Message-ID <[email protected]>
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 <[email protected]>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve!"  -  http://www.FreeBSD.org/

To Unsubscribe: send mail to [email protected]
with "unsubscribe freebsd-mobile" in the body of the message
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.