Date: Thu, 27 Jan 2000 22:22:54 -0500 (EST) From: Andrew Gallatin <gallatin@cs.duke.edu> To: Mitsuru IWASAKI <iwasaki@jp.FreeBSD.org> Cc: imp@village.org, freebsd-mobile@FreeBSD.ORG Subject: Re: pc card removal lockup Message-ID: <14481.2747.280858.521937@grasshopper.cs.duke.edu> In-Reply-To: <200001271221.VAA21926@tasogare.imasy.or.jp> References: <200001270856.RAA07853@tasogare.imasy.or.jp> <200001271221.VAA21926@tasogare.imasy.or.jp>
next in thread | previous in thread | raw e-mail | index | archive | help
Mitsuru IWASAKI writes: > > 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. Thank you! This almost works! I now can remove ep0 about 50% of the time. The other 50% the machine locks solid & emits a loud, continuous beep... It does not seem to matter if the network is quiet -- I unplugged the NICs cable before removing it & that does not seem to help. This is certainly progress! Drew > 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?14481.2747.280858.521937>