summaryrefslogtreecommitdiffstats
path: root/sys/powerpc/powermac
diff options
context:
space:
mode:
authorandreast <andreast@FreeBSD.org>2013-10-15 18:59:32 +0000
committerandreast <andreast@FreeBSD.org>2013-10-15 18:59:32 +0000
commit0769a0f4945f8aaf8c475dbcbdb0e6951fa360e2 (patch)
tree52985577f2d0868a99fce94be658c10ab944000f /sys/powerpc/powermac
parent7057c4d3ee312190bf2505bcf951fa07774f6adf (diff)
downloadFreeBSD-src-0769a0f4945f8aaf8c475dbcbdb0e6951fa360e2.zip
FreeBSD-src-0769a0f4945f8aaf8c475dbcbdb0e6951fa360e2.tar.gz
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
Diffstat (limited to 'sys/powerpc/powermac')
-rw-r--r--sys/powerpc/powermac/ata_kauai.c60
-rw-r--r--sys/powerpc/powermac/ata_macio.c28
2 files changed, 47 insertions, 41 deletions
diff --git a/sys/powerpc/powermac/ata_kauai.c b/sys/powerpc/powermac/ata_kauai.c
index 1d72f75..33b6434 100644
--- a/sys/powerpc/powermac/ata_kauai.c
+++ b/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 */
diff --git a/sys/powerpc/powermac/ata_macio.c b/sys/powerpc/powermac/ata_macio.c
index e15ab00..8505664 100644
--- a/sys/powerpc/powermac/ata_macio.c
+++ b/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;
OpenPOWER on IntegriCloud