Move the resource allocation from the ata_*_probe section to the ata_*_attach
section. This prevents a boot crash on nearly all iMacs and PowerMacs/Books. The allocation in the probe section was working before because ata_probe was returning 0 which did not invoke a second DEVICE_PROBE. Now it returns a BUS_PROBE_DEFAULT which can invoke a second DEVICE_PROBE which results in a "failed to reserve resource" exit. PR: powerpc/182978 Discussed with: grehan@ MFC after: 1 Week
This commit is contained in:
parent
7057c4d3ee
commit
0769a0f494
@ -194,12 +194,11 @@ static const u_int udma_timing_shasta[] = {
|
||||
static int
|
||||
ata_kauai_probe(device_t dev)
|
||||
{
|
||||
struct ata_channel *ch;
|
||||
struct ata_kauai_softc *sc;
|
||||
u_int32_t devid;
|
||||
phandle_t node;
|
||||
const char *compatstring = NULL;
|
||||
int i, found, rid;
|
||||
int i, found;
|
||||
|
||||
found = 0;
|
||||
devid = pci_get_devid(dev);
|
||||
@ -216,7 +215,6 @@ ata_kauai_probe(device_t dev)
|
||||
node = ofw_bus_get_node(dev);
|
||||
sc = device_get_softc(dev);
|
||||
bzero(sc, sizeof(struct ata_kauai_softc));
|
||||
ch = &sc->sc_ch.sc_ch;
|
||||
|
||||
compatstring = ofw_bus_get_compat(dev);
|
||||
if (compatstring != NULL && strcmp(compatstring,"shasta-ata") == 0)
|
||||
@ -227,6 +225,35 @@ ata_kauai_probe(device_t dev)
|
||||
(compatstring == NULL || strcmp(compatstring, "K2-UATA") != 0))
|
||||
bus_set_resource(dev, SYS_RES_IRQ, 0, 39, 1);
|
||||
|
||||
return (ata_probe(dev));
|
||||
}
|
||||
|
||||
#if USE_DBDMA_IRQ
|
||||
static int
|
||||
ata_kauai_dma_interrupt(struct ata_kauai_softc *sc)
|
||||
{
|
||||
/* Clear the DMA interrupt bits */
|
||||
|
||||
bus_write_4(sc->sc_memr, DMA_IRQ_REG, 0x80000000);
|
||||
|
||||
return ata_interrupt(sc);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
ata_kauai_attach(device_t dev)
|
||||
{
|
||||
struct ata_kauai_softc *sc = device_get_softc(dev);
|
||||
struct ata_channel *ch;
|
||||
int i, rid;
|
||||
#if USE_DBDMA_IRQ
|
||||
int dbdma_irq_rid = 1;
|
||||
struct resource *dbdma_irq;
|
||||
void *cookie;
|
||||
#endif
|
||||
|
||||
ch = &sc->sc_ch.sc_ch;
|
||||
|
||||
rid = PCIR_BARS;
|
||||
sc->sc_memr = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
|
||||
RF_ACTIVE);
|
||||
@ -248,36 +275,11 @@ ata_kauai_probe(device_t dev)
|
||||
|
||||
ch->unit = 0;
|
||||
ch->flags |= ATA_USE_16BIT;
|
||||
|
||||
|
||||
/* XXX: ATAPI DMA is unreliable. We should find out why. */
|
||||
ch->flags |= ATA_NO_ATAPI_DMA;
|
||||
ata_generic_hw(dev);
|
||||
|
||||
return (ata_probe(dev));
|
||||
}
|
||||
|
||||
#if USE_DBDMA_IRQ
|
||||
static int
|
||||
ata_kauai_dma_interrupt(struct ata_kauai_softc *sc)
|
||||
{
|
||||
/* Clear the DMA interrupt bits */
|
||||
|
||||
bus_write_4(sc->sc_memr, DMA_IRQ_REG, 0x80000000);
|
||||
|
||||
return ata_interrupt(sc);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
ata_kauai_attach(device_t dev)
|
||||
{
|
||||
struct ata_kauai_softc *sc = device_get_softc(dev);
|
||||
#if USE_DBDMA_IRQ
|
||||
int dbdma_irq_rid = 1;
|
||||
struct resource *dbdma_irq;
|
||||
void *cookie;
|
||||
#endif
|
||||
|
||||
pci_enable_busmaster(dev);
|
||||
|
||||
/* Init DMA engine */
|
||||
|
@ -152,8 +152,6 @@ ata_macio_probe(device_t dev)
|
||||
const char *type = ofw_bus_get_type(dev);
|
||||
const char *name = ofw_bus_get_name(dev);
|
||||
struct ata_macio_softc *sc;
|
||||
struct ata_channel *ch;
|
||||
int rid, i;
|
||||
|
||||
if (strcmp(type, "ata") != 0 &&
|
||||
strcmp(type, "ide") != 0)
|
||||
@ -161,7 +159,6 @@ ata_macio_probe(device_t dev)
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
bzero(sc, sizeof(struct ata_macio_softc));
|
||||
ch = &sc->sc_ch.sc_ch;
|
||||
|
||||
if (strcmp(name,"ata-4") == 0) {
|
||||
device_set_desc(dev,"Apple MacIO Ultra ATA Controller");
|
||||
@ -173,7 +170,23 @@ ata_macio_probe(device_t dev)
|
||||
sc->max_mode = ATA_WDMA2;
|
||||
}
|
||||
|
||||
return (ata_probe(dev));
|
||||
}
|
||||
|
||||
static int
|
||||
ata_macio_attach(device_t dev)
|
||||
{
|
||||
struct ata_macio_softc *sc = device_get_softc(dev);
|
||||
uint32_t timingreg;
|
||||
struct ata_channel *ch;
|
||||
int rid, i;
|
||||
|
||||
/*
|
||||
* Allocate resources
|
||||
*/
|
||||
|
||||
rid = 0;
|
||||
ch = &sc->sc_ch.sc_ch;
|
||||
sc->sc_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
|
||||
RF_ACTIVE);
|
||||
if (sc->sc_mem == NULL) {
|
||||
@ -196,15 +209,6 @@ ata_macio_probe(device_t dev)
|
||||
ch->flags |= ATA_USE_16BIT | ATA_NO_ATAPI_DMA;
|
||||
ata_generic_hw(dev);
|
||||
|
||||
return (ata_probe(dev));
|
||||
}
|
||||
|
||||
static int
|
||||
ata_macio_attach(device_t dev)
|
||||
{
|
||||
struct ata_macio_softc *sc = device_get_softc(dev);
|
||||
uint32_t timingreg;
|
||||
|
||||
#if USE_DBDMA_IRQ
|
||||
int dbdma_irq_rid = 1;
|
||||
struct resource *dbdma_irq;
|
||||
|
Loading…
x
Reference in New Issue
Block a user