From owner-freebsd-mobile Thu Jan 27 0:24:40 2000 Delivered-To: freebsd-mobile@freebsd.org Received: from rover.village.org (rover.village.org [204.144.255.49]) by hub.freebsd.org (Postfix) with ESMTP id 07EF414DCE for ; Thu, 27 Jan 2000 00:24:29 -0800 (PST) (envelope-from imp@harmony.village.org) Received: from harmony.village.org (harmony.village.org [10.0.0.6]) by rover.village.org (8.9.3/8.9.3) with ESMTP id BAA04125; Thu, 27 Jan 2000 01:24:27 -0700 (MST) (envelope-from imp@harmony.village.org) Received: from harmony.village.org (localhost.village.org [127.0.0.1]) by harmony.village.org (8.9.3/8.8.3) with ESMTP id BAA43895; Thu, 27 Jan 2000 01:24:27 -0700 (MST) Message-Id: <200001270824.BAA43895@harmony.village.org> To: Mitsuru IWASAKI Subject: Re: pc card removal lockup Cc: gallatin@cs.duke.edu, freebsd-mobile@FreeBSD.ORG In-reply-to: Your message of "Thu, 27 Jan 2000 13:36:14 +0900." <200001270436.NAA03328@tasogare.imasy.or.jp> References: <200001270436.NAA03328@tasogare.imasy.or.jp> <200001270031.RAA04501@harmony.village.org> Date: Thu, 27 Jan 2000 01:24:27 -0700 From: Warner Losh Sender: owner-freebsd-mobile@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org Hi isasaki-san, In message <200001270436.NAA03328@tasogare.imasy.or.jp> Mitsuru IWASAKI writes: : I thought that delay by disable_slot_spl0() cause some sort of race : condition and miss an interrupt as result... : I'm testing this patch and seem to solve the problem for my : environment so far. OK. IF that solves the problem, then what about this patch? It is the same as yours, except it also garbage collects the unused code. Getting rid of the spl0 code was on my list (since bruce pointed out to me that it wasn't really running at spl0), but I wasn't motivated until now to try to track it down. I also included removing the PCIC_RESUME_RESET option, at least partially. Users that have problems with resume reset can set it in their sysctl.conf file to be off. No need for both an option and a sysctl. It is whole contained in the first chunk of the diff. Let me know if this helps anybody with freeing problems... Warner Index: pccard.c =================================================================== RCS file: /home/imp/FreeBSD/CVS/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 08:19:57 @@ -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,7 @@ 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 void disable_slot_to(struct slot *); static int invalid_io_memory(unsigned long, int); static void power_off_slot(void *); @@ -185,10 +179,8 @@ } static void -disable_slot_to(void *argp) +disable_slot_to(struct slot *slt) { - struct slot *slt = (struct slot *) argp; - slt->state = empty; disable_slot(slt); printf("pccard: card removed, slot %d\n", slt->slotnum); @@ -197,15 +189,6 @@ } /* - * 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 * and initialises the data structures using the data provided. @@ -232,7 +215,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 +283,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); @@ -338,7 +320,7 @@ */ if (slt->state == filled) { slt->state = empty; - disable_slot_spl0(slt); + disable_slot_to(slt); } break; case card_inserted: @@ -705,7 +687,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/imp/FreeBSD/CVS/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 08:20:04 @@ -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