diff options
author | nate <nate@FreeBSD.org> | 1997-10-28 17:51:25 +0000 |
---|---|---|
committer | nate <nate@FreeBSD.org> | 1997-10-28 17:51:25 +0000 |
commit | 2e553bc25069eeeaf344cab2b006655cb04de92c (patch) | |
tree | 4f829903a1b524d022289ea0992e0747e13fb2b1 | |
parent | 2c7ba54db583d15a410c146cd4501196e769b97c (diff) | |
download | FreeBSD-src-2e553bc25069eeeaf344cab2b006655cb04de92c.zip FreeBSD-src-2e553bc25069eeeaf344cab2b006655cb04de92c.tar.gz |
- Disable cards when doing a suspend by emulating that they have been
removed. Add a new state 'suspend' so we 'fake' insertion events at
resume time for the cards that have been suspended.
[
The code still works if you remove the card during suspend, switch the
card during suspend, or combinations of both.
]
Reviewed by: frf@xocolatl.com
-rw-r--r-- | sys/pccard/card.h | 2 | ||||
-rw-r--r-- | sys/pccard/cardinfo.h | 2 | ||||
-rw-r--r-- | sys/pccard/pccard.c | 19 | ||||
-rw-r--r-- | usr.sbin/pccard/pccardd/cardd.c | 5 |
4 files changed, 17 insertions, 11 deletions
diff --git a/sys/pccard/card.h b/sys/pccard/card.h index 159a8e7..91da726 100644 --- a/sys/pccard/card.h +++ b/sys/pccard/card.h @@ -54,7 +54,7 @@ /* * Slot states for PIOCGSTATE */ -enum cardstate { noslot, empty, filled }; +enum cardstate { noslot, empty, suspend, filled }; /* * Descriptor structure for memory map. diff --git a/sys/pccard/cardinfo.h b/sys/pccard/cardinfo.h index 159a8e7..91da726 100644 --- a/sys/pccard/cardinfo.h +++ b/sys/pccard/cardinfo.h @@ -54,7 +54,7 @@ /* * Slot states for PIOCGSTATE */ -enum cardstate { noslot, empty, filled }; +enum cardstate { noslot, empty, suspend, filled }; /* * Descriptor structure for memory map. diff --git a/sys/pccard/pccard.c b/sys/pccard/pccard.c index 549f215..d0507b3 100644 --- a/sys/pccard/pccard.c +++ b/sys/pccard/pccard.c @@ -372,6 +372,14 @@ slot_suspend(void *arg) { struct slot *slt = arg; + /* This code stolen from pccard_event:card_removed */ + if (slt->state == filled) { + int s = splhigh(); + disable_slot(slt); + slt->state = suspend; + splx(s); + printf("Card disabled, slot %d\n", slt->slotnum); + } slt->ctrl->disable(slt); return (0); } @@ -383,16 +391,11 @@ slot_resume(void *arg) if (pcic_resume_reset) slt->ctrl->resume(slt); - /* Fake card removal/insertion events */ - if (slt->state == filled) { - int s; - - s = splhigh(); - disable_slot(slt); + /* This code stolen from pccard_event:card_inserted */ + if (slt->state == suspend) { slt->state = empty; - splx(s); slt->insert_seq = 1; - slt->insert_ch = timeout(inserted, (void *)slt, hz); + slt->insert_ch = timeout(inserted, (void *)slt, hz/4); selwakeup(&slt->selp); } return (0); diff --git a/usr.sbin/pccard/pccardd/cardd.c b/usr.sbin/pccard/pccardd/cardd.c index e2237f3..64c31a0 100644 --- a/usr.sbin/pccard/pccardd/cardd.c +++ b/usr.sbin/pccard/pccardd/cardd.c @@ -26,7 +26,7 @@ #ifndef lint static const char rcsid[] = - "$Id: cardd.c,v 1.18 1997/10/06 11:36:06 charnier Exp $"; + "$Id: cardd.c,v 1.19 1997/10/26 04:36:24 nate Exp $"; #endif /* not lint */ #include <fcntl.h> @@ -227,6 +227,9 @@ slot_change(struct slot *sp) case filled: card_inserted(sp); break; + case suspend: + /* ignored */ + break; } } |