Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 9 Aug 2013 18:50:01 GMT
From:      John Baldwin <jhb@freebsd.org>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: kern/181148: [ata] sas expanders not available in 9.2-RC1 [regression]
Message-ID:  <201308091850.r79Io1Pw056798@freefall.freebsd.org>

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

From: John Baldwin <jhb@freebsd.org>
To: "Christopher D. Harrison" <harrison@biostat.wisc.edu>
Cc: bug-followup@freebsd.org,
 scottl@freebsd.org,
 Doug White <dwhite@freebsd.org>,
 re@freebsd.org
Subject: Re: kern/181148: [ata] sas expanders not available in 9.2-RC1 [regression]
Date: Fri, 9 Aug 2013 14:40:35 -0400

 On Friday, August 09, 2013 2:15:23 pm Christopher D. Harrison wrote:
 > I upgraded the bios and it appears that this fixed the issue.   I wish I 
 > had a board running the old bios version now to test this new code.
 > Thanks for all your help in debugging this issue.
 >      -C
 
 Hmm, so actually a fair number of drivers check the command register in this
 fashion which did "work" in older versions.  I am working on a sweep of the
 tree to fix these, but we will probably want this fix in 9.2 if possible.
 
 Note that the relevant fix in 9.2 fixed a regression in 9.1, so backing out
 the PCI change from 9.2 isn't really a win. :(
 
 > On 08/09/13 13:05, John Baldwin wrote:
 > > The mps(4) driver is just broken.  9.2 includes a fix that if your BIOS
 > > writers can't do simple math and allocate conflicting resources, it disables
 > > decoding of the device where it finds the conflict.  Later if a device driver
 > > expicitly asks to use that resource, the PCI bus will allocate a fresh
 > > resource range that doesn't conflict if possible.  If it suceeds it re-enables
 > > decoding.  The mps(4) driver checks to see if decoding is enabled before it
 > > calls bus_alloc_resource().  It should not.  It should assume that if
 > > bus_alloc_resource() succeeds, everything is fine and decoding will be
 > > enabled.  Try this fix:
 > >
 > > Index: mps_pci.c
 > > ===================================================================
 > > --- mps_pci.c	(revision 254147)
 > > +++ mps_pci.c	(working copy)
 > > @@ -183,7 +183,6 @@ mps_pci_attach(device_t dev)
 > >   {
 > >   	struct mps_softc *sc;
 > >   	struct mps_ident *m;
 > > -	uint16_t command;
 > >   	int error;
 > >
 > >   	sc = device_get_softc(dev);
 > > @@ -193,18 +192,7 @@ mps_pci_attach(device_t dev)
 > >   	sc->mps_flags = m->flags;
 > >
 > >   	/* Twiddle basic PCI config bits for a sanity check */
 > > -	command = pci_read_config(dev, PCIR_COMMAND, 2);
 > > -	command |= PCIM_CMD_BUSMASTEREN;
 > > -	pci_write_config(dev, PCIR_COMMAND, command, 2);
 > > -	command = pci_read_config(dev, PCIR_COMMAND, 2);
 > > -	if ((command&  PCIM_CMD_BUSMASTEREN) == 0) {
 > > -		mps_printf(sc, "Cannot enable PCI busmaster\n");
 > > -		return (ENXIO);
 > > -	}
 > > -	if ((command&  PCIM_CMD_MEMEN) == 0) {
 > > -		mps_printf(sc, "PCI memory window not available\n");
 > > -		return (ENXIO);
 > > -	}
 > > +	pci_enable_busmaster(dev);
 > >
 > >   	/* Allocate the System Interface Register Set */
 > >   	sc->mps_regs_rid = PCIR_BAR(1);
 > >
 > 
 > 
 
 -- 
 John Baldwin



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