aic79xx_pci.c:

aic7xxx_pci.c:
	When performing our register test, be careful
	to avoid resetting the chip when pausing the
	controller.  The test reads the HCNTRL register
	and then writes it back with the PAUSE bit
	explicitly set.  If the last write to the controller
	before our probe is to reset it, the CHIPRST
	bit will still be set, so we must mask it off
	before the PAUSE operation.  On some chip versions,
	we cannot access registers for a few 100us after
	a reset, so this inadvertant reset was causing PCI
	errors to occur on the read to check for paused
	status.

Submitted by:	gibbs
This commit is contained in:
Scott Long 2003-09-25 23:36:41 +00:00
parent f018fde49c
commit ba079c0d9f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=120445
2 changed files with 8 additions and 4 deletions

View file

@ -38,7 +38,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#76 $
* $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#80 $
*/
#include <sys/cdefs.h>
@ -453,8 +453,10 @@ ahd_pci_test_register_access(struct ahd_softc *ahd)
* or read prefetching could be initiated by the
* CPU or host bridge. Our device does not support
* either, so look for data corruption and/or flaged
* PCI errors.
* PCI errors. First pause without causing another
* chip reset.
*/
hcntrl &= ~CHIPRST;
ahd_outb(ahd, HCNTRL, hcntrl|PAUSE);
while (ahd_is_paused(ahd) == 0)
;

View file

@ -39,7 +39,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* $Id: //depot/aic7xxx/aic7xxx/aic7xxx_pci.c#69 $
* $Id: //depot/aic7xxx/aic7xxx/aic7xxx_pci.c#72 $
*/
#include <sys/cdefs.h>
@ -1285,8 +1285,10 @@ ahc_pci_test_register_access(struct ahc_softc *ahc)
* or read prefetching could be initiated by the
* CPU or host bridge. Our device does not support
* either, so look for data corruption and/or flagged
* PCI errors.
* PCI errors. First pause without causing another
* chip reset.
*/
hcntrl &= ~CHIPRST;
ahc_outb(ahc, HCNTRL, hcntrl|PAUSE);
while (ahc_is_paused(ahc) == 0)
;