kern/113195: [PATCH] add support for ATI IXP SB600 non-RAID
SATA/PATA controllers
Artem Naluzhny
tut at nhamon.com.ua
Thu May 31 13:00:12 UTC 2007
>Number: 113195
>Category: kern
>Synopsis: [PATCH] add support for ATI IXP SB600 non-RAID SATA/PATA controllers
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Thu May 31 13:00:11 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator: Artem Naluzhny
>Release: 7.0-CURRENT
>Organization:
>Environment:
FreeBSD tut.intra 7.0-CURRENT FreeBSD 7.0-CURRENT #4: Thu May 31 13:58:38 EEST 2007 root at tut.intra:/usr/obj/usr/src/sys/TUT i386
>Description:
$ pciconf -clv
atapci0 at pci0:18:0: class=0x01018f card=0x01f51028 chip=0x43801002 rev=0x00 hdr=0x00
vendor = 'ATI Technologies Inc.'
device = 'IXP SB600 Serial ATA Controller'
class = mass storage
subclass = ATA
cap 01[60] = powerspec 2 supports D0 D3 current D0
cap 12[70] = unknown
atapci1 at pci0:20:1: class=0x01018a card=0x01f51028 chip=0x438c1002 rev=0x00 hdr=0x00
vendor = 'ATI Technologies Inc.'
device = 'IXP SB600 ATA Controller'
class = mass storage
subclass = ATA
cap 05[70] = MSI supports 1 message
-----------------------------------------------------------------------------
Before the patch:
atapci0: <GENERIC ATA controller> port 0x8438-0x843f,0x8454-0x8457,0x8430-0x8437,0x8450-0x8453,0x8400-0x840f mem 0xc0004000-0xc00043ff irq 22 at device 18.0 on pci0
atapci0: Reserved 0x10 bytes for rid 0x20 type 4 at 0x8400
ioapic0: routing intpin 22 (PCI IRQ 22) to vector 49
atapci0: [MPSAFE]
atapci0: [ITHREAD]
ata2: <ATA channel 0> on atapci0
atapci0: Reserved 0x8 bytes for rid 0x10 type 4 at 0x8438
atapci0: Reserved 0x4 bytes for rid 0x14 type 4 at 0x8454
ata2: reset tp1 mask=03 ostat0=50 ostat1=00
ata2: stat0=0x50 err=0x01 lsb=0x00 msb=0x00
ata2: stat1=0x00 err=0x00 lsb=0x00 msb=0x00
ata2: reset tp2 stat0=50 stat1=00 devices=0x1<ATA_MASTER>
ata2: [MPSAFE]
ata2: [ITHREAD]
ata3: <ATA channel 1> on atapci0
atapci0: Reserved 0x8 bytes for rid 0x18 type 4 at 0x8430
atapci0: Reserved 0x4 bytes for rid 0x1c type 4 at 0x8450
ata3: reset tp1 mask=03 ostat0=7f ostat1=7f
ata3: stat0=0x7f err=0x7f lsb=0x7f msb=0x7f
ata3: stat1=0x7f err=0x7f lsb=0x7f msb=0x7f
ata3: reset tp2 stat0=ff stat1=ff devices=0x0
ata3: [MPSAFE]
ata3: [ITHREAD]
atapci1: <GENERIC ATA controller> port 0x1f0-0x1f7,0x3f6,0x170-0x177,0x376,0x8420-0x842f at device 20.1 on pci0
atapci1: Reserved 0x10 bytes for rid 0x20 type 4 at 0x8420
ata0: <ATA channel 0> on atapci1
atapci1: Reserved 0x8 bytes for rid 0x10 type 4 at 0x1f0
atapci1: Reserved 0x1 bytes for rid 0x14 type 4 at 0x3f6
ata0: reset tp1 mask=03 ostat0=50 ostat1=01
ata0: stat0=0x10 err=0x01 lsb=0x14 msb=0xeb
ata0: stat1=0x01 err=0x04 lsb=0x00 msb=0x00
ata0: reset tp2 stat0=10 stat1=01 devices=0x4<ATAPI_MASTER>
ioapic0: routing intpin 14 (ISA IRQ 14) to vector 54
ata0: [MPSAFE]
ata0: [ITHREAD]
ata1: <ATA channel 1> on atapci1
atapci1: Reserved 0x8 bytes for rid 0x18 type 4 at 0x170
atapci1: Reserved 0x1 bytes for rid 0x1c type 4 at 0x376
ata1: reset tp1 mask=00 ostat0=ff ostat1=ff
ioapic0: routing intpin 15 (ISA IRQ 15) to vector 55
ata1: [MPSAFE]
ata1: [ITHREAD]
ata0-master: pio=PIO4 wdma=WDMA2 udma=UDMA33 cable=40 wire
acd0: <TSSTcorp DVD+/-RW TS-L632D/DE04> DVDR drive at ata0 as master
acd0: read 4134KB/s (4134KB/s) write 172KB/s (4134KB/s), 2048KB buffer, UDMA33
acd0: Reads: CDR, CDRW, CDDA stream, DVDROM, DVDR, packet
acd0: Writes: CDR, CDRW, DVDR, test write, burnproof
acd0: Audio: play, 256 volume levels
acd0: Mechanism: ejectable tray, unlocked
acd0: Medium: no/blank disc
ata2-master: pio=PIO4 wdma=WDMA2 udma=UDMA133 cable=40 wire
ad4: 57231MB <Seagate ST96812AS 8.04> at ata2-master UDMA33
ad4: 117210240 sectors [116280C/16H/63S] 16 sectors/interrupt 1 depth queue
$ atacontrol list
ATA channel 0:
Master: acd0 <TSSTcorp DVD+/-RW TS-L632D/DE04> ATA/ATAPI revision 0
Slave: no device present
ATA channel 1:
Master: no device present
Slave: no device present
ATA channel 2:
Master: ad4 <ST96812AS/8.04> Serial ATA v1.0
Slave: no device present
ATA channel 3:
Master: no device present
Slave: no device present
$ atacontrol mode acd0
current mode = UDMA33
$ atacontrol mode ad4
current mode = UDMA33
-----------------------------------------------------------------------------
After the patch:
atapci0: <ATI IXP600 SATA300 controller> port 0x8438-0x843f,0x8454-0x8457,0x8430-0x8437,0x8450-0x8453,0x8400-0x840f mem 0xc0004000-0xc00043ff irq 22 at device 18.0 on pci0
atapci0: Reserved 0x10 bytes for rid 0x20 type 4 at 0x8400
ioapic0: routing intpin 22 (PCI IRQ 22) to vector 49
atapci0: [MPSAFE]
atapci0: [ITHREAD]
atapci0: Reserved 0x400 bytes for rid 0x24 type 3 at 0xc0004000
atapci0: AHCI Version 01.10 controller with 4 ports detected
ata2: <ATA channel 0> on atapci0
ata2: SATA connect time=0ms
ata2: [MPSAFE]
ata2: [ITHREAD]
ata3: <ATA channel 1> on atapci0
ata3: SATA connect status=00000000
ata3: [MPSAFE]
ata3: [ITHREAD]
ata4: <ATA channel 2> on atapci0
ata4: SATA connect status=00000000
ata4: [MPSAFE]
ata4: [ITHREAD]
ata5: <ATA channel 3> on atapci0
ata5: SATA connect status=00000000
ata5: [MPSAFE]
ata5: [ITHREAD]
atapci1: <ATI IXP600 UDMA133 controller> port 0x1f0-0x1f7,0x3f6,0x170-0x177,0x376,0x8420-0x842f at device 20.1 on pci0
atapci1: Reserved 0x10 bytes for rid 0x20 type 4 at 0x8420
ata0: <ATA channel 0> on atapci1
atapci1: Reserved 0x8 bytes for rid 0x10 type 4 at 0x1f0
atapci1: Reserved 0x1 bytes for rid 0x14 type 4 at 0x3f6
ata0: reset tp1 mask=03 ostat0=50 ostat1=01
ata0: stat0=0x10 err=0x01 lsb=0x14 msb=0xeb
ata0: stat1=0x01 err=0x04 lsb=0x00 msb=0x00
ata0: reset tp2 stat0=10 stat1=01 devices=0x4<ATAPI_MASTER>
ioapic0: routing intpin 14 (ISA IRQ 14) to vector 54
ata0: [MPSAFE]
ata0: [ITHREAD]
ata1: <ATA channel 1> on atapci1
atapci1: Reserved 0x8 bytes for rid 0x18 type 4 at 0x170
atapci1: Reserved 0x1 bytes for rid 0x1c type 4 at 0x376
ata1: reset tp1 mask=00 ostat0=ff ostat1=ff
ioapic0: routing intpin 15 (ISA IRQ 15) to vector 55
ata1: [MPSAFE]
ata1: [ITHREAD]
ata0-master: pio=PIO4 wdma=WDMA2 udma=UDMA33 cable=40 wire
acd0: setting PIO4 on IXP600 chip
acd0: setting UDMA33 on IXP600 chip
acd0: <TSSTcorp DVD+/-RW TS-L632D/DE04> DVDR drive at ata0 as master
acd0: read 4134KB/s (4134KB/s) write 172KB/s (4134KB/s), 2048KB buffer, UDMA33
acd0: Reads: CDR, CDRW, CDDA stream, DVDROM, DVDR, packet
acd0: Writes: CDR, CDRW, DVDR, test write, burnproof
acd0: Audio: play, 256 volume levels
acd0: Mechanism: ejectable tray, unlocked
acd0: Medium: no/blank disc
ata2-master: pio=PIO4 wdma=WDMA2 udma=UDMA133 cable=40 wire
ad4: 57231MB <Seagate ST96812AS 8.04> at ata2-master SATA150
ad4: 117210240 sectors [116280C/16H/63S] 16 sectors/interrupt 1 depth queue
$ atacontrol list
ATA channel 0:
Master: acd0 <TSSTcorp DVD+/-RW TS-L632D/DE04> ATA/ATAPI revision 0
Slave: no device present
ATA channel 1:
Master: no device present
Slave: no device present
ATA channel 2:
Master: ad4 <ST96812AS/8.04> Serial ATA v1.0
Slave: no device present
ATA channel 3:
Master: no device present
Slave: no device present
ATA channel 4:
Master: no device present
Slave: no device present
ATA channel 5:
Master: no device present
Slave: no device present
$ atacontrol mode acd0
current mode = UDMA33
$ atacontrol mode ad4
current mode = SATA150
>How-To-Repeat:
>Fix:
--- sys/dev/ata/ata-pci.h.orig Sat Mar 10 00:23:39 2007
+++ sys/dev/ata/ata-pci.h Wed May 30 19:40:45 2007
@@ -102,6 +102,8 @@
#define ATA_ATI_IXP300_S1 0x436e1002
#define ATA_ATI_IXP400_S1 0x43791002
#define ATA_ATI_IXP400_S2 0x437a1002
+#define ATA_ATI_IXP600_S1 0x43801002
+#define ATA_ATI_IXP600 0x438c1002
#define ATA_CENATEK_ID 0x16ca
#define ATA_CENATEK_ROCKET 0x000116ca
--- sys/dev/ata/ata-chipset.c.orig Sun Apr 8 22:18:51 2007
+++ sys/dev/ata/ata-chipset.c Thu May 31 13:48:38 2007
@@ -1261,6 +1261,8 @@
{ ATA_ATI_IXP300_S1, 0x00, SIIMEMIO, 0, ATA_SA150, "IXP300" },
{ ATA_ATI_IXP400_S1, 0x00, SIIMEMIO, 0, ATA_SA150, "IXP400" },
{ ATA_ATI_IXP400_S2, 0x00, SIIMEMIO, 0, ATA_SA150, "IXP400" },
+ { ATA_ATI_IXP600, 0x00, 0, 0, ATA_UDMA6, "IXP600" },
+ { ATA_ATI_IXP600_S1, 0x00, 0, 0, ATA_SA300, "IXP600" },
{ 0, 0, 0, 0, 0, 0}};
char buffer[64];
@@ -1288,7 +1290,20 @@
if (ata_setup_interrupt(dev))
return ENXIO;
- ctlr->setmode = ata_ati_setmode;
+ /* ATI IXP SB600 Serial ATA is actually an AHCI compatible controller */
+ if (ctlr->chip->chipid == ATA_ATI_IXP600_S1) {
+ ctlr->r_type2 = SYS_RES_MEMORY;
+ ctlr->r_rid2 = PCIR_BAR(5);
+ if ((ctlr->r_res2 = bus_alloc_resource_any(dev, ctlr->r_type2,
+ &ctlr->r_rid2, RF_ACTIVE))) {
+ return ata_ahci_chipinit(dev);
+ }
+ else
+ return ENXIO;
+ }
+ else
+ ctlr->setmode = ata_ati_setmode;
+
return 0;
}
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list