- 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
This commit is contained in:
nate 1997-10-28 17:51:25 +00:00
parent 2c7ba54db5
commit 2e553bc250
4 changed files with 17 additions and 11 deletions

View File

@ -54,7 +54,7 @@
/*
* Slot states for PIOCGSTATE
*/
enum cardstate { noslot, empty, filled };
enum cardstate { noslot, empty, suspend, filled };
/*
* Descriptor structure for memory map.

View File

@ -54,7 +54,7 @@
/*
* Slot states for PIOCGSTATE
*/
enum cardstate { noslot, empty, filled };
enum cardstate { noslot, empty, suspend, filled };
/*
* Descriptor structure for memory map.

View File

@ -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);

View File

@ -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;
}
}