Date: Tue, 23 Sep 1997 16:46:56 -0600 (MDT) From: Nate Williams <nate@mt.sri.com> To: Stefan Esser <se@freebsd.org> Cc: Nate Williams <nate@mt.sri.com>, mobile@freebsd.org, current@freebsd.org Subject: Re: PCCARD in -current broken Message-ID: <199709232246.QAA09189@rocky.mt.sri.com> In-Reply-To: <19970923230018.00034@mi.uni-koeln.de> References: <199709231929.NAA08312@rocky.mt.sri.com> <19970923230018.00034@mi.uni-koeln.de>
next in thread | previous in thread | raw e-mail | index | archive | help
> > It has been for some time (May). If it works on your box, you're
> > lucky! (PHK is one of the lucky ones, and it may be related to using
> > more PCI-like machines, unlike older 'straight-ISA' laptops).
>
> Hmmm, I'm surprised to hear that ...
> You are the first to report such a problem.
Most folks don't use current on their laptops. :)
> > The change to the 'generic' shared interrupt code broke some assumptions
> > I had about 'register_intr()' and 'unregister_intr()' in
> > /sys/pccard/pcic.c. Basically, I had assumed the register_intr() would
> > fail if I wanted access to an interrupt that was already taken, and now
> > it succeeds so I add it to my list of 'available' IRQ's (I'd give it
> > back, but at this point the freemask is really hosed). This assumption
> > leads to all sorts of problems, of which I haven't completely thought
> > about.
>
> There should not be a problem. ISA does not
> (should not, I didn't check the sources
> recently) register the handler as shared,
> and this will prevent another handler (both
> shared or exclusive) to be registered.
register_intr() sets the INTR_EXCL flag just before it calls
intr_create() (so far so good), but in intr_connect(), the code to check
for that flag is ifdef's out:
int
intr_connect(intrec *idesc)
{
...
#ifdef RESOURCE_CHECK
int resflag;
#endif /* RESOURCE_CHECK */
....
#ifdef RESOURCE_CHECK
resflag = (idesc->flags & INTR_EXCL) ? RESF_NONE : RESF_SHARED;
if (resource_claim(idesc->devdata, REST_INT, resflag, irq, irq) == 0)
#endif /* RESOURCE_CHECK */
{
So, we don't even check to see if INTR_EXCL is used.
> I assume this does not work for you ?
See above.
> > In any case, until the code in /sys/kern/kern_intr.c ifdef'd out by
> > 'RESOURCE_CHECK' is finished, or something else is done to make sure
>
> The code is finished, but I did not commit
> it to -current, since I was waiting for the
> new ISA device probe/attach code to become
> available.
How does the new code realize that the interrupt is exclusive then?
> > that 'ISA/Exclusive' interrupts are not allowed to be registered as
> > 'shared' resources, I think there are potential problems with the
>
> Well, ISA interrupts should be registered in
> a way that guarantees they are not shared.
How?
> Hmmm, I just checked the sources and I can't
> see what's wrong. Please tell me why the
> following is not sufficient:
Hmm, never mind. I never walked enough down into the sources to see
what's going on.
So, can I rely on register_intr() return a negative # for failure?
(Here's the code in question.)
static u_int
build_freelist(u_int pcic_mask)
{
inthand2_t *nullfunc;
int irq;
u_int mask, freemask;
/* No free IRQs (yet). */
freemask = 0;
/* Walk through all of the IRQ's and find any that aren't allocated. */
for (irq = 0; irq < ICU_LEN; irq++) {
/*
* If the PCIC controller can't generate it, don't
* bother checking to see if it it's free.
*/
mask = 1 << irq;
if (!(mask & pcic_mask)) continue;
/* See if the IRQ is free. */
if (register_intr(irq, 0, 0, nullfunc, NULL, irq) == 0) {
/* Give it back, but add it to the mask */
INTRMASK(freemask, mask);
unregister_intr(irq, nullfunc);
}
}
#ifdef PCIC_DEBUG
printf("Freelist of IRQ's <0x%x>\n", freemask);
#endif
return freemask;
}
> Please tell me what's wrong with this ...
Maybe nothing, and maybe I'm a geek who likes to blame everyone else for
my problems! :(
Nate
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199709232246.QAA09189>
