patch: udma5 support for Intel 82801FB ICH6 Ultra ATA Controller

Florian Le Goff bletofarine at
Sat Oct 9 04:48:45 PDT 2004


I've got an ASUS P5GD1 [1] Motherboard, with a 915P chipset and a
ICH6R [2] southbridge.

Since the UDMA controller was recognized as an "GENERIC ATA
controller", I was stuck in UDMA33 mode for my Seagate Ultra ATA/100
IDE hard drive, and I wasn't able to change the settings using
"atacontrol mode". Since there is already a great list of Intel
supported chipsets in src/sys/dev/ata/ata-chipset.c, I've added the
references of the chip in ata-chipset.c and ata-pci.h, on a fresh
cvsuped 6.0-CURRENT.

Please, someone could review it ? My first patch :/

pciconf -lv give the following output for this chip :

atapci0 at pci0:31:1:      class=0x01018a card=0x26408086 chip=0x266f8086
rev=0x03 hdr=0x00
    vendor   = 'Intel Corporation'
    device   = '82801FB ICH6 Ultra ATA Storage Controller'
    class    = mass storage
    subclass = ATA

The Intel's datasheet is speaking of this chip as :
Integrated IDE Controller
 -- Independent timing of up to two drives
 -- Ultra ATA/100/66/33, BMIDE and PIO modes
 -- Tri-state modes to enable swap bay

So, it doesn't seem to be really different from other Intel IDE controllers.

My two-lines patch :

ble# pwd

ble# diff -u ata-pci.h~ ata-pci.h 
--- ata-pci.h~  Wed Oct  6 23:27:39 2004
+++ ata-pci.h   Sat Oct  9 11:31:10 2004
@@ -118,6 +118,7 @@
 #define ATA_I82801EB           0x24db8086
 #define ATA_I82801EB_S1                0x24d18086
 #define ATA_I82801EB_R1                0x24df8086
+#define ATA_I82801FB           0x266f8086
 #define ATA_I6300ESB           0x25a28086
 #define ATA_I6300ESB_S1                0x25a38086
 #define ATA_I6300ESB_R1                0x25b08086

ble# diff -u ata-chipset.c~ ata-chipset.c
--- ata-chipset.c~      Wed Oct  6 23:27:39 2004
+++ ata-chipset.c       Sat Oct  9 11:16:54 2004
@@ -830,6 +830,7 @@
      { ATA_I82801EB,   0, 0, 0x00, ATA_UDMA5, "Intel ICH5" },
      { ATA_I82801EB_S1,0, 0, 0x00, ATA_SA150, "Intel ICH5" },
      { ATA_I82801EB_R1,0, 0, 0x00, ATA_SA150, "Intel ICH5" },
+     { ATA_I82801FB,   0, 0, 0x00, ATA_UDMA5, "Intel ICH6" },
      { ATA_I6300ESB,   0, 0, 0x00, ATA_UDMA5, "Intel 6300ESB" },
      { ATA_I6300ESB_S1,0, 0, 0x00, ATA_SA150, "Intel 6300ESB" },
      { ATA_I6300ESB_R1,0, 0, 0x00, ATA_SA150, "Intel 6300ESB" },

Now, when the kernel is loading, the controller is recognized (output
of dmesg) :
atapci0: <Intel ICH6 UDMA100 controller> port
6,0x1f0-0x1f7 at device 31.1 on pci0
ata0: channel #0 on atapci0
ata1: channel #1 on atapci0

And my hard drive works like a charm :
ad0: 38166MB <ST340014A/3.04> [77545/16/63] at ata0-master UDMA100

Note that there is always, on that board, another driver spotted as
"GENERIC", for this chip :

atapci1 at pci0:31:2:      class=0x01018f card=0x26011043 chip=0x26528086
rev=0x03 hdr=0x00
    vendor   = 'Intel Corporation'
    device   = '82801FR/FRW ICH6R/ICH6RW SATA Controller'
    class    = mass storage
    subclass = ATA

I'll try to add it, as soon I will have a SATA-compliant drive to test it :-)

[1] :
[2] :

Florian "madflo" Le Goff
- madflo at

More information about the freebsd-current mailing list