Date: Thu, 27 Jan 2000 21:21:19 +0900 From: Mitsuru IWASAKI <iwasaki@jp.FreeBSD.org> To: iwasaki@jp.freebsd.org Cc: imp@village.org, gallatin@cs.duke.edu, freebsd-mobile@FreeBSD.ORG Subject: Re: pc card removal lockup Message-ID: <200001271221.VAA21926@tasogare.imasy.or.jp> In-Reply-To: Your message of "Thu, 27 Jan 2000 17:56:26 %2B0900" <200001270856.RAA07853@tasogare.imasy.or.jp> References: <200001270856.RAA07853@tasogare.imasy.or.jp>
next in thread | previous in thread | raw e-mail | index | archive | help
> I basically agree with you. I have two things to say.
>
> How about adding splhigh() and splx() around calling disable_slot() as
> same as pccard_suspend()? It will make removal event handling more
> safty, I beleave.
>
> And Is disable_slot_to() necessary if we don't use spl0 code?
> I think calling disable_slot() would be almost the same as the code in
> pccard_suspend().
>
> # I'm sorry, no time to make pactch...
I've just made the patch including the latest patch from Warner-san.
Mr. Andrew Gallatin, could you try this again and see if the machine
locking up when you remove ep0 while the machine is running?
# spl stuff have been added against the last patch.
Warner-san, I'd like to add this to 4.0-RELEASE.
Index: pccard.c
===================================================================
RCS file: /home/ncvs/src/sys/pccard/pccard.c,v
retrieving revision 1.104
diff -u -r1.104 pccard.c
--- pccard.c 2000/01/16 06:44:45 1.104
+++ pccard.c 2000/01/27 11:16:50
@@ -71,12 +71,7 @@
SYSCTL_NODE(_machdep, OID_AUTO, pccard, CTLFLAG_RW, 0, "pccard");
-static int pcic_resume_reset =
-#ifdef PCIC_RESUME_RESET /* opt_pcic.h */
- 1;
-#else
- 0;
-#endif
+static int pcic_resume_reset = 1;
SYSCTL_INT(_machdep_pccard, OID_AUTO, pcic_resume_reset, CTLFLAG_RW,
&pcic_resume_reset, 0, "");
@@ -88,8 +83,6 @@
static int allocate_driver(struct slot *, struct dev_desc *);
static void inserted(void *);
static void disable_slot(struct slot *);
-static void disable_slot_spl0(struct slot *);
-static void disable_slot_to(void *);
static int invalid_io_memory(unsigned long, int);
static void power_off_slot(void *);
@@ -184,27 +177,6 @@
slt->pwr_off_pending = 1;
}
-static void
-disable_slot_to(void *argp)
-{
- struct slot *slt = (struct slot *) argp;
-
- slt->state = empty;
- disable_slot(slt);
- printf("pccard: card removed, slot %d\n", slt->slotnum);
- pccard_remove_beep();
- selwakeup(&slt->selp);
-}
-
-/*
- * Disables the slot later when we drop to spl0 via a timeout.
- */
-static void
-disable_slot_spl0(struct slot *slt)
-{
- slt->disable_ch = timeout(disable_slot_to, (caddr_t) slt, 0);
-}
-
/*
* pccard_alloc_slot - Called from controller probe
* routine, this function allocates a new PC-CARD slot
@@ -232,7 +204,6 @@
pccard_slots[slotno] = slt;
callout_handle_init(&slt->insert_ch);
callout_handle_init(&slt->poff_ch);
- callout_handle_init(&slt->disable_ch);
return(slt);
}
@@ -301,12 +272,12 @@
*/
slt->pwr.vcc = 50;
slt->pwr.vpp = 0;
+
/*
* Disable any pending timeouts for this slot, and explicitly
* power it off right now. Then, re-enable the power using
* the (possibly new) power settings.
*/
- untimeout(power_off_slot, (caddr_t)slt, slt->disable_ch);
untimeout(power_off_slot, (caddr_t)slt, slt->poff_ch);
power_off_slot(slt);
slt->ctrl->power(slt);
@@ -337,8 +308,13 @@
* data structures are not unlinked.
*/
if (slt->state == filled) {
+ int s = splhigh();
slt->state = empty;
- disable_slot_spl0(slt);
+ disable_slot(slt);
+ splx(s);
+ printf("pccard: card removed, slot %d\n", slt->slotnum);
+ pccard_remove_beep();
+ selwakeup(&slt->selp);
}
break;
case card_inserted:
@@ -705,7 +681,6 @@
* Disable any pending timeouts for this slot since we're
* powering it down/disabling now.
*/
- untimeout(power_off_slot, (caddr_t)slt, slt->disable_ch);
untimeout(power_off_slot, (caddr_t)slt, slt->poff_ch);
slt->ctrl->disable(slt);
return (0);
Index: slot.h
===================================================================
RCS file: /home/ncvs/src/sys/pccard/slot.h,v
retrieving revision 1.22
diff -u -r1.22 slot.h
--- slot.h 1999/12/08 07:55:20 1.22
+++ slot.h 2000/01/27 11:15:14
@@ -110,7 +110,6 @@
unsigned int insert_seq; /* Firing up under the card */
struct callout_handle insert_ch;/* Insert event timeout handle */
struct callout_handle poff_ch; /* Power Off timeout handle */
- struct callout_handle disable_ch; /* Disable spl0 kludge */
enum cardstate state, laststate; /* Current/last card states */
struct selinfo selp; /* Info for select */
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?200001271221.VAA21926>
