Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

MFC: 256555

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
Approved by:	re(gjb)
  • Loading branch information...
commit 44f5357aec14c32040c49f1703b1d4c2cac5d080 1 parent 71c5e06
andreast authored
Showing with 47 additions and 41 deletions.
  1. +31 −29 sys/powerpc/powermac/ata_kauai.c
  2. +16 −12 sys/powerpc/powermac/ata_macio.c
View
60 sys/powerpc/powermac/ata_kauai.c
@@ -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,32 +225,6 @@ ata_kauai_probe(device_t dev)
(compatstring == NULL || strcmp(compatstring, "K2-UATA") != 0))
bus_set_resource(dev, SYS_RES_IRQ, 0, 39, 1);
- rid = PCIR_BARS;
- sc->sc_memr = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
- RF_ACTIVE);
- if (sc->sc_memr == NULL) {
- device_printf(dev, "could not allocate memory\n");
- return (ENXIO);
- }
-
- /*
- * Set up the resource vectors
- */
- for (i = ATA_DATA; i <= ATA_COMMAND; i++) {
- ch->r_io[i].res = sc->sc_memr;
- ch->r_io[i].offset = i*ATA_KAUAI_REGGAP + ATA_KAUAI_REGOFFSET;
- }
- ch->r_io[ATA_CONTROL].res = sc->sc_memr;
- ch->r_io[ATA_CONTROL].offset = ATA_KAUAI_ALTOFFSET;
- ata_default_registers(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));
}
@@ -272,12 +244,42 @@ 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);
+ if (sc->sc_memr == NULL) {
+ device_printf(dev, "could not allocate memory\n");
+ return (ENXIO);
+ }
+
+ /*
+ * Set up the resource vectors
+ */
+ for (i = ATA_DATA; i <= ATA_COMMAND; i++) {
+ ch->r_io[i].res = sc->sc_memr;
+ ch->r_io[i].offset = i*ATA_KAUAI_REGGAP + ATA_KAUAI_REGOFFSET;
+ }
+ ch->r_io[ATA_CONTROL].res = sc->sc_memr;
+ ch->r_io[ATA_CONTROL].offset = ATA_KAUAI_ALTOFFSET;
+ ata_default_registers(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);
+
pci_enable_busmaster(dev);
/* Init DMA engine */
View
28 sys/powerpc/powermac/ata_macio.c
@@ -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;
Please sign in to comment.
Something went wrong with that request. Please try again.