Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 15 Oct 2013 19:00:02 GMT
From:      dfilter@FreeBSD.ORG (dfilter service)
To:        freebsd-ppc@FreeBSD.org
Subject:   Re: powerpc/182978: commit references a PR
Message-ID:  <201310151900.r9FJ02Io021977@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR powerpc/182978; it has been noted by GNATS.

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: powerpc/182978: commit references a PR
Date: Tue, 15 Oct 2013 18:59:40 +0000 (UTC)

 Author: andreast
 Date: Tue Oct 15 18:59:32 2013
 New Revision: 256555
 URL: http://svnweb.freebsd.org/changeset/base/256555
 
 Log:
   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
 
 Modified:
   head/sys/powerpc/powermac/ata_kauai.c
   head/sys/powerpc/powermac/ata_macio.c
 
 Modified: head/sys/powerpc/powermac/ata_kauai.c
 ==============================================================================
 --- head/sys/powerpc/powermac/ata_kauai.c	Tue Oct 15 18:07:23 2013	(r256554)
 +++ head/sys/powerpc/powermac/ata_kauai.c	Tue Oct 15 18:59:32 2013	(r256555)
 @@ -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 */
 
 Modified: head/sys/powerpc/powermac/ata_macio.c
 ==============================================================================
 --- head/sys/powerpc/powermac/ata_macio.c	Tue Oct 15 18:07:23 2013	(r256554)
 +++ head/sys/powerpc/powermac/ata_macio.c	Tue Oct 15 18:59:32 2013	(r256555)
 @@ -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;
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201310151900.r9FJ02Io021977>