Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 8 Jul 2005 20:20:16 GMT
From:      Sebastian Koehler <acex5@syncer.de>
To:        freebsd-sparc64@FreeBSD.org
Subject:   Re: sparc64/82261: DMA-support on Sparc64 broken
Message-ID:  <200507082020.j68KKGUG038757@freefall.freebsd.org>

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

From: Sebastian Koehler <acex5@syncer.de>
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: sparc64/82261: DMA-support on Sparc64 broken
Date: Fri, 08 Jul 2005 22:19:10 +0200

 This is a multi-part message in MIME format.
 --------------010204070008030302060306
 Content-Type: text/plain; charset=ISO-8859-15
 Content-Transfer-Encoding: 7bit
 
 Hi list,
 
 got the attached patch from Marius Strobl. Unfortunately problem was not
 fixed trough it. When ata_generic_reset(dev) is below if (ctlr...) in
 ata_ali_reset() and system is booting up with hw.ata.ata_dma=1 still
 data corruption occurs. See the next lines for details.
 
 ...
 Additional routing options:.
 Starting devd.
 Mounting NFS file systems:.
 Creating and/or trimming log files:.
 Starting syslogd.
 Checking for core dump on /dev/ad0b...
 /libexec/ld-elf.so.1: /lib/libz.so.2: invalid file format
 ELF ldconfig path: /lib /usr/lib /usr/lib/compat /usr/local/lib
 Starting local daemons:.
 ...
 
 sunshine# sysctl -a | grep ata_dma
 hw.ata.ata_dma: 1
 sunshine#
 
 sunshine# dmesg
 ...
 uart1: <16550 or compatible> at port 0x2e8-0x2ef irq 43 on isa0
 Timecounters tick every 1.000 msec
 ad0: 38166MB <Seagate ST340824A 3.28> at ata2-master UDMA66
 Trying to mount root from ufs:/dev/ad0a
 ad0: TIMEOUT - WRITE_DMA retrying (1 retry left) LBA=256
 ad0: TIMEOUT - WRITE_DMA retrying (1 retry left) LBA=394976
 ad0: TIMEOUT - WRITE_DMA retrying (1 retry left) LBA=3635040
 dc0: failed to force tx and rx to idle state
 dc0: failed to force tx and rx to idle state
 dc0: failed to force tx and rx to idle state
 dc0: failed to force tx and rx to idle state
 ad0: TIMEOUT - WRITE_DMA retrying (1 retry left) LBA=224
 
 Sebastian
 
 --------------010204070008030302060306
 Content-Type: text/plain;
  name="ata-chipset.c.diff"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline;
  filename="ata-chipset.c.diff"
 
 Index: ata-chipset.c
 ===================================================================
 RCS file: /mnt/futile/usr/data/bsd/cvs/fbsd/src/sys/dev/ata/ata-chipset.c,v
 retrieving revision 1.126
 diff -u -r1.126 ata-chipset.c
 --- ata-chipset.c	10 Jun 2005 07:43:10 -0000	1.126
 +++ ata-chipset.c	25 Jun 2005 11:10:56 -0000
 @@ -74,6 +74,7 @@
  static void ata_acard_86X_setmode(device_t dev, int mode);
  static int ata_ali_chipinit(device_t dev);
  static int ata_ali_allocate(device_t dev);
 +static void ata_ali_reset(device_t dev);
  static void ata_ali_setmode(device_t dev, int mode);
  static int ata_amd_chipinit(device_t dev);
  static int ata_cyrix_chipinit(device_t dev);
 @@ -853,6 +854,7 @@
      device_set_desc_copy(dev, buffer);
      ctlr->chip = idx;
      ctlr->chipinit = ata_ali_chipinit;
 +    ctlr->reset = ata_ali_reset;
      return 0;
  }
  
 @@ -937,6 +939,35 @@
  }
  
  static void
 +ata_ali_reset(device_t dev)
 +{
 +    device_t parent = device_get_parent(dev);
 +    struct ata_pci_controller *ctlr = device_get_softc(parent);
 +    struct ata_channel *ch = device_get_softc(dev);
 +    device_t *children;
 +    int nchildren, i;
 +    u_int8_t ideic;
 +
 +    ata_generic_reset(dev);
 +    if (ctlr->chip->cfg2 & ALINEW && ctlr->chip->chiprev < 0xc4) {
 +	if (!device_get_children(device_get_parent(parent), &children,
 +				 &nchildren)) {
 +	    for (i = 0; i < nchildren; i++) {
 +		if (pci_get_devid(children[i]) == 0x153310b9) {
 +		    ideic = pci_read_config(children[i], 0x58, 1);
 +		    pci_write_config(children[i], 0x58,
 +				     ideic & ~(0x04 << ch->unit), 1);
 +		    ata_udelay(1000);
 +		    pci_write_config(children[i], 0x58, ideic, 1);
 +		    break;
 +		}
 +	    }
 +	    free(children, M_TEMP);
 +	}
 +    }
 +}
 +
 +static void
  ata_ali_setmode(device_t dev, int mode)
  {
      device_t gparent = GRANDPARENT(dev);
 
 --------------010204070008030302060306--



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