summaryrefslogtreecommitdiffstats
path: root/sys/i386/isa/isa_compat.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1999-04-19 20:31:53 +0000
committerpeter <peter@FreeBSD.org>1999-04-19 20:31:53 +0000
commit2f00a09c0903e7d4e3059b437896b13a130a981c (patch)
tree124562619bada698aef5b6c069c78a514f3e8465 /sys/i386/isa/isa_compat.c
parentd87a4625d23a7d6d44f08604ad70eb25f4e26f3c (diff)
downloadFreeBSD-src-2f00a09c0903e7d4e3059b437896b13a130a981c.zip
FreeBSD-src-2f00a09c0903e7d4e3059b437896b13a130a981c.tar.gz
Always reset the isa hints after releasing the resources after probe,
because the act of doing the release kills the hints(!). A quirk of the wrapper caused it to reset all the settings, except perhaps for the memory address. I've tested this with a real SMC 8013EPC - which uses shared memory addresses - it seems to work OK.
Diffstat (limited to 'sys/i386/isa/isa_compat.c')
-rw-r--r--sys/i386/isa/isa_compat.c32
1 files changed, 16 insertions, 16 deletions
diff --git a/sys/i386/isa/isa_compat.c b/sys/i386/isa/isa_compat.c
index b1d84ac..43a7ae2 100644
--- a/sys/i386/isa/isa_compat.c
+++ b/sys/i386/isa/isa_compat.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: isa_compat.c,v 1.3 1999/04/19 08:42:39 dfr Exp $
+ * $Id: isa_compat.c,v 1.4 1999/04/19 18:03:51 peter Exp $
*/
#include <sys/param.h>
@@ -160,6 +160,7 @@ isa_compat_probe(device_t dev)
if (dvp->id_driver->probe) {
int portsize;
void *maddr;
+
isa_compat_alloc_resources(dev, &res);
if (res.memory)
maddr = rman_get_virtual(res.memory);
@@ -168,22 +169,21 @@ isa_compat_probe(device_t dev)
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 != irqmask(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);
+ /* isa_release_resource clobbers the hints - reset them! */
+ if (dvp->id_iobase > 0)
+ isa_set_port(dev, dvp->id_iobase);
+ if (portsize > 0)
+ isa_set_portsize(dev, portsize);
+ 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)kvtop(dvp->id_maddr)); /* XXX */
+ if (dvp->id_msize != 0)
+ isa_set_msize(dev, dvp->id_msize);
+ if (portsize != 0)
return 0;
- }
}
return ENXIO;
}
OpenPOWER on IntegriCloud