Date: Tue, 20 Apr 1999 01:57:30 +0800 From: Peter Wemm <peter@netplex.com.au> To: John Hay <jhay@mikom.csir.co.za> Cc: dfr@nlsystems.com (Doug Rabson), current@freebsd.org Subject: Re: newbus and isa auto irq Message-ID: <19990419175732.49D401F5E@spinner.netplex.com.au> In-Reply-To: Your message of "Sat, 19 Apr 1999 19:38:31 %2B0200." <199904191738.TAA97791@zibbi.mikom.csir.co.za>
next in thread | previous in thread | raw e-mail | index | archive | help
John Hay wrote:
[..]
> Apr 19 19:22:28 orca /kernel.doug: ppc0: interrupting at irq 7
> Apr 19 19:22:28 orca /kernel.doug: ed0 at port 0x280-0x29f on isa0
> Apr 19 19:22:28 orca /kernel.doug: ed0: address 00:00:c0:1d:43:db, type SMC82
16/
> SMC8216C (16 bit)
> Apr 19 19:22:28 orca /kernel.doug: Intel Pentium detected, installing workaro
und
> for F00F bug
> --------
>
> > - if (dvp->id_irq != (1 << isa_get_irq(dev)))
> > + if (dvp->id_irq != (1 << isa_get_irq(dev))) {
> > +printf("isa_compat_probe: old irq=%d, new mask=%x, new irq=%d\n",
> > + irq_get_irq(dev), dvp->id_irq, ffs(dvp->id_irq) - 1);
> > isa_set_irq(dev, ffs(dvp->id_irq) - 1);
> > + }
>
> I assume the irq_get_irq() should be isa_get_irq().
>
> I have tried the patch that Luoqi posted and that works for me. Although
> even with that the the userconfig by booting with -c don't work. It just
> plain ignores what you do there.
An additional datapoint... We have:
dvp->id_maddr = (void *)isa_get_maddr(dev);
[..]
void *maddr;
isa_compat_alloc_resources(dev, &res);
if (res.memory)
maddr = rman_get_virtual(res.memory);
else
maddr = 0;
dvp->id_maddr = maddr;
portsize = dvp->id_driver->probe(dvp);
isa_compat_release_resources(dev, &res);
if (portsize != 0) {
if (portsize > 0)
isa_set_portsize(dev, portsize);
if (dvp->id_iobase != isa_get_port(dev))
isa_set_port(dev, dvp->id_iobase);
if (dvp->id_irq != (1 << isa_get_irq(dev)))
isa_set_irq(dev, ffs(dvp->id_irq) - 1);
if (dvp->id_drq != isa_get_drq(dev))
isa_set_drq(dev, dvp->id_drq);
if (dvp->id_maddr != maddr)
isa_set_maddr(dev,
(int) dvp->id_maddr - KERNBASE);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
if (dvp->id_msize != isa_get_msize(dev))
isa_set_msize(dev, dvp->id_msize);
There is the problem.. isa_compat_release_resources() is clearing the
hints. The only reason it works for the other devices is things like:
if (dvp->id_iobase != isa_get_port(dev))
isa_set_port(dev, dvp->id_iobase);
.. ie: if (id_iobase != <freshly cleared value>)
reset_hint(id_iobase);
.. etc.
This is not happening for the maddr stuff.
I suspect this would do better:
if (portsize > 0)
isa_set_portsize(dev, portsize);
if (dvp->id_iobase >= 0)
isa_set_port(dev, dvp->id_iobase);
if (dvp->id_irq != 0)
isa_set_irq(dev, ffs(dvp->id_irq) - 1);
if (dvp->id_drq != -1)
isa_set_drq(dev, dvp->id_drq);
if (dvp->id_maddr != 0)
isa_set_maddr(dev,
(int) dvp->id_maddr - KERNBASE);
if (dvp->id_msize != 0)
isa_set_msize(dev, dvp->id_msize);
I'm not sure about the "nothing" value for id_drq though, it might need to
be 0 - but that's a valid dma channel.
IMHO, isa_release_resources() clearing of the default values for the probe
hints is a timebomb... I thought about adding a seperate store for the
"hint" values rather than using the id_foo[0] entries, and leaving the
tracked resource entries for alloc/free without risking the hints.
Cheers,
-Peter
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19990419175732.49D401F5E>
