Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 7 Oct 2000 14:45:25 +0900 (JST)
From:      Junichi Satoh <junichi@junichi.org>
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   kern/21810: SiS5571 ATA controller does not work on ATA mode.
Message-ID:  <200010070545.OAA00485@norn.pn.junichi.org>

next in thread | raw e-mail | index | archive | help

>Number:         21810
>Category:       kern
>Synopsis:       SiS5571 ATA controller does not work on ATA mode.
>Confidential:   yes
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Oct 06 22:50:01 PDT 2000
>Closed-Date:
>Last-Modified:
>Originator:     Junichi Satoh
>Release:        FreeBSD 4.1-STABLE i386 and FreeBSD 5.0-CURRENT i386
>Organization:
>Environment:

SiS5571 ATA controller with ATA hard drive.

>Description:

SiS5571 does not have ATA33 mode.
But, it is probed as SiS5591 ATA33 controller like below.
------
atapci0: <SiS 5591 ATA33 controller> port 0x4000-0x400f,0x374-0x377,0x170-0x177,0x3f4-0x3f7,0x1f0-0x1f7 irq 14 at device 1.1 on pci0
ata0: at 0x1f0 irq 14 on atapci0
------

It fallback to PIO mode. So it does not work on ATA mode.


>How-To-Repeat:

# mount /dev/ad0s1e /mnt
ad0: READ command timeout tag=0 serv=0 - resetting
ata0: resetting devices .. done
ad0: READ command timeout tag=0 serv=0 - resetting
ata0: resetting devices .. done
ad0: READ command timeout tag=0 serv=0 - resetting
ata0: resetting devices .. done
ad0: READ command timeout tag=0 serv=0 - resetting
ata0-master: WARNING: WAIT_READY active=ATA_ACTIVE_ATA
ad0: trying fallback to PIO mode
ata0: resetting devices .. done


>Fix:

*** ata-all.c.org	Tue Sep 19 20:08:37 2000
--- ata-all.c	Sat Oct  7 14:32:52 2000
***************
*** 233,238 ****
--- 233,263 ----
      return 0;
  }
  
+ int
+ ata_find_maindev(device_t dev, u_int32_t type, u_int32_t revid)
+ {
+     device_t *children, child;
+     int nchildren, i;
+ 
+     if (device_get_children(device_get_parent(dev), &children, &nchildren))
+ 	return 0;
+ 
+     for (i = 0; i < nchildren; i++) {
+ 	child = children[i];
+ 
+     /* check that it's on the same silicon and the device we want */
+         if (pci_get_slot(child) == 0 &&
+ 	    pci_get_vendor(child) == (type & 0xffff) &&
+ 	    pci_get_device(child) == ((type & 0xffff0000) >> 16) &&
+ 	    pci_get_revid(child) >= revid) {
+ 	    free(children, M_TEMP);
+ 	    return 1;
+ 	}
+     }
+     free(children, M_TEMP);
+     return 0;
+ }
+ 
  static const char *
  ata_pci_match(device_t dev)
  {
***************
*** 275,280 ****
--- 300,307 ----
  	return "VIA Apollo ATA controller";
  
      case 0x55131039:
+ 	if (ata_find_maindev(dev, 0x55711039, 0))
+ 	    return "SiS 5571 ATA controller";
  	return "SiS 5591 ATA33 controller";
  
      case 0x06461095:


*** ata-all.h.org	Tue Sep 19 20:08:37 2000
--- ata-all.h	Sat Oct  7 14:10:48 2000
***************
*** 350,355 ****
--- 350,356 ----
  int ata_umode(struct ata_params *);
  #if NPCI > 0
  int ata_find_dev(device_t, u_int32_t, u_int32_t);
+ int ata_find_maindev(device_t, u_int32_t, u_int32_t);
  #endif
  
  void *ata_dmaalloc(struct ata_softc *, int);


*** ata-dma.c.org	Tue Sep 19 20:08:37 2000
--- ata-dma.c	Sat Oct  7 14:33:02 2000
***************
*** 413,420 ****
  	/* we could set PIO mode timings, but we assume the BIOS did that */
  	break;
  
!     case 0x55131039:	/* SiS 5591 */
! 	if (udmamode >= 2) {
  	    error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
  				ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
  	    if (bootverbose)
--- 413,420 ----
  	/* we could set PIO mode timings, but we assume the BIOS did that */
  	break;
  
!     case 0x55131039:	/* SiS 5571, 5591 */
! 	if (!ata_find_maindev(parent, 0x55711039, 0) && udmamode >= 2) {
  	    error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
  				ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
  	    if (bootverbose)

>Release-Note:
>Audit-Trail:
>Unformatted:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




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