kern/56924: [Patch] ATA controller seems to have wrong ID for ServerWorks chipset

Simon Walton simonw at matteworld.com
Tue Sep 16 10:30:26 PDT 2003


>Number:         56924
>Category:       kern
>Synopsis:       [Patch] ATA controller seems to have wrong ID for ServerWorks chipset
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Sep 16 10:30:14 PDT 2003
>Closed-Date:
>Last-Modified:
>Originator:     Simon Walton
>Release:        FreeBSD 4.7-RELEASE i386
>Organization:
>Environment:
System: FreeBSD mongo 4.7-RELEASE FreeBSD 4.7-RELEASE #0: Mon Sep 15
17:24:01 PDT 2003 simonw at mongo:/usr/src/sys/compile/MONGO i386

Compaq/HP ProLiant ML310, Pentium 4, 2.2 GHz

>Description:
This server was fitted with two ATA-100 disks on a single IDE port.
According
to the atacontrol command the host was using PIO to access them, and
atacontrol
would not renegotiate to UDMA speeds. The disks gave poor performance.

Investiation shows that the ATA driver apparently checked for the
wrong value of the chip ID. When this was changed the kernel
automatically
negotiated to UDMA 100 and the disk performance was significantly
improved.

The current code seems to check for the chip's subid, not the chip id:

pciconf -lv
...
atapci0 at pci0:15:1:      class=0x01018a card=0x02121166 chip=0x02131166
rev=0xa0
hdr=0x00
    vendor   = 'Reliance Computer Corp./ServerWorks'
    class    = mass storage
    subclass = ATA


>How-To-Repeat:

Add ATA disks to the above-specified system. Use atacontrol to observe
the data-rate.

>Fix:

*** /sys/dev/ata/ata-dma.c.orig Tue Aug 26 11:53:22 2003
--- /sys/dev/ata/ata-dma.c      Tue Aug 26 11:54:32 2003
***************
*** 822,827 ****
--- 822,828 ----
        atadev->mode = ATA_PIO0 + apiomode;
        return;
  
+     case 0x02131166:  /* ServerWorks CSB5 ATA66/100 controller */
      case 0x02121166:  /* ServerWorks CSB5 ATA66/100 controller */
        if (udmamode >= 5 && pci_get_revid(parent) >= 0x92) {
            error = ata_command(atadev, ATA_C_SETFEATURES, 0,
*** /sys/dev/ata/ata-pci.c.orig Tue Aug 26 12:10:33 2003
--- /sys/dev/ata/ata-pci.c      Tue Aug 26 12:25:24 2003
***************
*** 242,247 ****
--- 242,248 ----
      case 0x02111166:
        return "ServerWorks ROSB4 ATA33 controller";
  
+     case 0x02131166:
      case 0x02121166:
        if (pci_get_revid(dev) >= 0x92)
            return "ServerWorks CSB5 ATA100 controller";
>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list