Date: Wed, 23 Feb 2000 02:40:01 +0900 (JST) From: sakichan@lares.dti.ne.jp To: FreeBSD-gnats-submit@freebsd.org Subject: kern/16912: ATA66 support for Intel ICH Message-ID: <200002221739.CAA21478@shrike.dti.ad.jp>
next in thread | raw e-mail | index | archive | help
>Number: 16912 >Category: kern >Synopsis: add UDMA4 mode for Intel ICH >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Tue Feb 22 09:40:01 PST 2000 >Closed-Date: >Last-Modified: >Originator: SAKIYAMA Nobuo >Release: FreeBSD 4.0-current i386 >Organization: none >Environment: i386 systems on i810/820/840 chipsets platform, with Ultra ATA66 hard disks. >Description: IDE controller in Intel 82801AA (ICH) can handle ATA66 mode, but the current ATA driver does not try to ATA66. >How-To-Repeat: Every boot on i386 systems on i810/820/840 chipsets platform, with Ultra ATA66 hard disks connected to the IDE interface on the motherboard wired to ICH by the ATA66 cable. >Fix: Patch below fix the problem. PCI Config register 0x54 is "IDE I/O Configuration Register". Bit 0-3 is the base clock flag of each drive for UDMA timings. '1' means 66MHz, and '0' means 33MHz. bit 4-7 is set/reset for each drive by BIOS in the startup, which reports whether the ATA cable is the 80-pin or the 40-pin. --- src/sys/dev/ata/ata-dma.c-orig Sat Feb 19 05:57:29 2000 +++ src/sys/dev/ata/ata-dma.c Tue Feb 22 02:46:56 2000 @@ -96,9 +96,33 @@ switch (scp->chiptype) { + case 0x24118086: /* Intel ICH */ + if (udmamode >= 4) { + int32_t mask48, new48, new54; + + new54 = pci_read_config(parent, 0x54, 2); + if (new54 & ( 1<< (devno+4))) { + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY); + if (bootverbose) + ata_printf(scp, device, "ICH setting up UDMA4 mode on %s chip\n", + (error) ? "failed" : "success"); + if (!error) { + mask48 = (1 << devno) + (3 << (16 + (devno << 2))); + new48 = (1 << devno) + (2 << (16 + (devno << 2))); + pci_write_config(parent, 0x48, + (pci_read_config(parent, 0x48, 4) & + ~mask48) | new48, 4); + pci_write_config(parent, 0x54, new54 | (1 << devno), 2); + scp->mode[ATA_DEV(device)] = ATA_UDMA4; + return; + } + } + } + /* FALLTHROUGH */ + case 0x71118086: /* Intel PIIX4 */ case 0x71998086: /* Intel PIIX4e */ - case 0x24118086: /* Intel ICH */ case 0x24218086: /* Intel ICH0 */ if (udmamode >= 2) { int32_t mask48, new48; >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?200002221739.CAA21478>