Restore I/O port resources to the condition before adv_isa_probe() is

called.

Submitted by:	yokota
This commit is contained in:
Yoshihiro Takahashi 2001-05-06 09:28:18 +00:00
parent 3c4848ae4a
commit 2f8a98e27b
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=76309

View file

@ -106,7 +106,8 @@ adv_isa_probe(device_t dev)
{ {
int port_index; int port_index;
int max_port_index; int max_port_index;
u_long iobase, irq; u_long iobase, iocount, irq;
int user_iobase = 0;
int rid = 0; int rid = 0;
void *ih; void *ih;
struct resource *iores, *irqres; struct resource *iores, *irqres;
@ -117,7 +118,8 @@ adv_isa_probe(device_t dev)
port_index = 0; port_index = 0;
max_port_index = MAX_ISA_IOPORT_INDEX; max_port_index = MAX_ISA_IOPORT_INDEX;
if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) == 0) { if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, &iocount) == 0) {
user_iobase = 1;
for (;port_index <= max_port_index; port_index++) for (;port_index <= max_port_index; port_index++)
if (iobase <= adv_isa_ioports[port_index]) if (iobase <= adv_isa_ioports[port_index])
break; break;
@ -172,7 +174,7 @@ adv_isa_probe(device_t dev)
rman_get_bushandle(iores)); rman_get_bushandle(iores));
if (adv == NULL) { if (adv == NULL) {
bus_release_resource(dev, SYS_RES_IOPORT, 0, iores); bus_release_resource(dev, SYS_RES_IOPORT, 0, iores);
return ENXIO; break;
} }
/* /*
@ -234,7 +236,7 @@ adv_isa_probe(device_t dev)
adv_name(adv), error); adv_name(adv), error);
adv_free(adv); adv_free(adv);
bus_release_resource(dev, SYS_RES_IOPORT, 0, iores); bus_release_resource(dev, SYS_RES_IOPORT, 0, iores);
return ENXIO; break;
} }
adv->init_level += 2; adv->init_level += 2;
@ -256,7 +258,7 @@ adv_isa_probe(device_t dev)
adv_free(adv); adv_free(adv);
bus_release_resource(dev, SYS_RES_IOPORT, 0, bus_release_resource(dev, SYS_RES_IOPORT, 0,
iores); iores);
return ENXIO; break;
} }
if (bus_dmamem_alloc(overrun_dmat, if (bus_dmamem_alloc(overrun_dmat,
(void **)&overrun_buf, (void **)&overrun_buf,
@ -266,7 +268,7 @@ adv_isa_probe(device_t dev)
adv_free(adv); adv_free(adv);
bus_release_resource(dev, SYS_RES_IOPORT, 0, bus_release_resource(dev, SYS_RES_IOPORT, 0,
iores); iores);
return ENXIO; break;
} }
/* And permanently map it in */ /* And permanently map it in */
bus_dmamap_load(overrun_dmat, overrun_dmamap, bus_dmamap_load(overrun_dmat, overrun_dmamap,
@ -284,7 +286,7 @@ adv_isa_probe(device_t dev)
bus_dma_tag_destroy(overrun_dmat); bus_dma_tag_destroy(overrun_dmat);
adv_free(adv); adv_free(adv);
bus_release_resource(dev, SYS_RES_IOPORT, 0, iores); bus_release_resource(dev, SYS_RES_IOPORT, 0, iores);
return ENXIO; break;
} }
switch (adv->type) { switch (adv->type) {
@ -319,15 +321,15 @@ adv_isa_probe(device_t dev)
irqres = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1, irqres = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1,
RF_ACTIVE); RF_ACTIVE);
if (irqres == NULL || if (irqres == NULL ||
bus_setup_intr(dev, irqres, INTR_TYPE_CAM|INTR_ENTROPY, adv_intr, adv, bus_setup_intr(dev, irqres, INTR_TYPE_CAM|INTR_ENTROPY,
&ih)) { adv_intr, adv, &ih)) {
bus_dmamap_unload(overrun_dmat, overrun_dmamap); bus_dmamap_unload(overrun_dmat, overrun_dmamap);
bus_dmamem_free(overrun_dmat, overrun_buf, bus_dmamem_free(overrun_dmat, overrun_buf,
overrun_dmamap); overrun_dmamap);
bus_dma_tag_destroy(overrun_dmat); bus_dma_tag_destroy(overrun_dmat);
adv_free(adv); adv_free(adv);
bus_release_resource(dev, SYS_RES_IOPORT, 0, iores); bus_release_resource(dev, SYS_RES_IOPORT, 0, iores);
return ENXIO; break;
} }
/* Mark as probed */ /* Mark as probed */
@ -335,6 +337,11 @@ adv_isa_probe(device_t dev)
return 0; return 0;
} }
if (user_iobase)
bus_set_resource(dev, SYS_RES_IOPORT, 0, iobase, iocount);
else
bus_delete_resource(dev, SYS_RES_IOPORT, 0);
return ENXIO; return ENXIO;
} }