kern/132082: [ patch ] ATA driver does not find PATA drives attached to JMB363 controller

Dieter freebsd at sopwith.solgatos.com
Tue Feb 24 17:50:02 PST 2009


>Number:         132082
>Category:       kern
>Synopsis:       [ patch ] ATA driver does not find PATA drives attached to JMB363 controller
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Feb 25 01:50:01 UTC 2009
>Closed-Date:
>Last-Modified:
>Originator:     Dieter
>Release:        7.1 amd64
>Organization:
>Environment:
7.1-RELEASE amd64
>Description:
FreeBSD 7.1
amd64
nforce4-ultra (ad2 - ad10)
2 JMicron JMB363 controllers (ad12 and above)

7.1 kernel (without my patch)

# dmesg | grep 363
atapci4: <JMicron JMB363 SATA300 controller> port 0x5c00-0x5c07,0x5800-0x5803,0x
5400-0x5407,0x5000-0x5003,0x4c00-0x4c0f mem 0xfe3fe000-0xfe3fffff irq 12 at devi
ce 0.0 on pci6
# dmesg | grep ^ad
ad2: 305245MB <Seagate ST3320620A 3.AAC> at ata1-master UDMA100
ad4: 715404MB <Seagate ST3750640AS 3.AAE> at ata2-master SATA300
ad6: 715404MB <Seagate ST3750640AS 3.AAE> at ata3-master SATA300
ad8: 953869MB <Hitachi HDT721010SLA360 ST6OA31B> at ata4-master SATA300
ad10: 953869MB <SAMSUNG HD103UJ 1AA01113> at ata5-master SATA300
ad12: 238475MB <Seagate ST3250823AS 3.03> at ata6-master SATA150
ad14: 715404MB <Seagate ST3750330AS SD15> at ata7-master SATA300
ad16: 953869MB <WDC WD10EACS-00ZJB0 01.01B01> at ata8-master SATA300
#

The stock 7.1 kernel (7.0 was the same) does not see any PATA devices
connected to the JMicron JMB363 controllers.  It does see PATA and SATA
devices connected to the nforce4-ultra controller, and they work.  It does
see SATA devices connected to the JMicron JMB363 controllers and they
work.

I added a quick-and-dirty patch to ata-pci.c that tries ata_jmicron_ident()
before ata_ahci_ident().

# dmesg | grep 363
atapci3: <JMicron JMB363 SATA300 controller> at device 0.0 on pci3
atapci4: <JMicron JMB363 SATA300 controller> port 0x5c00-0x5c07,0x5800-0x5803,0x5400-0x5407,0x5000-0x5003,0x4c00-0x4c0f mem \
0xfe3fe000-0xfe3fffff irq 12 at device 0.0 on pci6
# dmesg | grep ^ad
ad2: 305245MB <Seagate ST3320620A 3.AAC> at ata1-master UDMA100
ad4: 715404MB <Seagate ST3750640AS 3.AAE> at ata2-master SATA300
ad6: 715404MB <Seagate ST3750640AS 3.AAE> at ata3-master SATA300
ad8: 953869MB <Hitachi HDT721010SLA360 ST6OA31B> at ata4-master SATA300
ad10: 953869MB <SAMSUNG HD103UJ 1AA01113> at ata5-master SATA300
ad12: 238475MB <Seagate ST3250823AS 3.03> at ata6-master SATA150
ad14: 715404MB <Seagate ST3750330AS SD15> at ata7-master SATA300
ad16: 305245MB <Seagate ST3320620A 3.AAC> at ata8-master UDMA100
ad18: 953869MB <WDC WD10EACS-00ZJB0 01.01B01> at ata9-master SATA300

With my patch, the kernel does see PATA devices (ad16) connected to the
JMicron JMB363 controllers.  The WDC SATA drive gets moved from
ad16 to ad18.

Perhaps unrelated, the Seagate PATA drive connects at UDMA100.
Reading works fine, but writing consistantly fails:

ad16: WARNING - WRITE_DMA UDMA ICRC error (retrying request) LBA=191
ad16: WARNING - WRITE_DMA UDMA ICRC error (retrying request) LBA=191
ad16: FAILURE - WRITE_DMA status=51<READY,DSC,ERROR> error=84<ICRC,ABORTED> LBA=191

I downgraded it from 100 to 66
# atacontrol mode ad16 UDMA66

and at 66 writing works ok.  The same disk works fine at 100
with other controllers.  Standard 80 wire flat ribbon cable,
not round or extra long or anything wierd.

My patch might not be the best way to fix this problem.  For all
I know it might even break something on other systems.  All I
can say is it works for me.  :-)

>How-To-Repeat:
Connect a PATA device to a JMB363 controller.  Boot 7.0 or 7.1 and observe
that the kernel does not find the drive.

>Fix:
My patch works for me.


Patch attached with submission follows:

--- ata-pci.c	2008/04/21 23:14:03	1.1
+++ ata-pci.c	2008/04/21 23:15:41
@@ -76,6 +76,13 @@
     if (pci_get_class(dev) != PCIC_STORAGE)
 	return ENXIO;
 
+    if ( pci_get_vendor(dev) == ATA_JMICRON_ID )
+      {
+	printf("DEBUG ata-pci.c ata_pci_probe() trying ata_jmicron_ident() before ata_ahci_ident()\n");
+	if (!ata_jmicron_ident(dev))
+	    return ATA_PROBE_OK;
+      }
+
     /* if this is an AHCI chipset grab it */
     if (pci_get_subclass(dev) == PCIS_STORAGE_SATA) {
 	if (!ata_ahci_ident(dev))


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


More information about the freebsd-bugs mailing list