Date: Sat, 1 Dec 2001 00:00:03 -0800 (PST) From: Tamotsu HATTORI <hattori@kta.att.ne.jp> To: freebsd-bugs@FreeBSD.org Subject: Re: kern/32421: patch to support ATA66 Mode (UDMA4) on SiS 630 chips Message-ID: <200112010800.fB1803t44342@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/32421; it has been noted by GNATS.
From: Tamotsu HATTORI <hattori@kta.att.ne.jp>
To: freebsd-gnats-submit@FreeBSD.org, john@utzweb.net
Cc: athlete@kta.att.ne.jp
Subject: Re: kern/32421: patch to support ATA66 Mode (UDMA4) on SiS 630
chips
Date: Sat, 01 Dec 2001 17:13:25 +0900
I have another patch to ata-all.c and ata-dma.c.
This patch supports ATA100 mode on SiS630S/633/635/730/733/735 chipsets.
--- ata-all.c.orig Wed Aug 29 02:56:14 2001
+++ ata-all.c Sat Nov 10 12:47:09 2001
@@ -228,8 +228,7 @@
child = children[i];
/* check that it's on the same silicon and the device we want */
- if (pci_get_slot(dev) == pci_get_slot(child) &&
- pci_get_vendor(child) == (type & 0xffff) &&
+ if (pci_get_vendor(child) == (type & 0xffff) &&
pci_get_device(child) == ((type & 0xffff0000) >> 16) &&
pci_get_revid(child) >= revid) {
free(children, M_TEMP);
@@ -291,6 +290,18 @@
return "VIA Apollo ATA controller";
case 0x55131039:
+ if (ata_find_dev(dev, 0x06301039, 0x30) ||
+ ata_find_dev(dev, 0x06331039, 0x00) ||
+ ata_find_dev(dev, 0x06351039, 0x00) ||
+ ata_find_dev(dev, 0x07301039, 0x00) ||
+ ata_find_dev(dev, 0x07331039, 0x00) ||
+ ata_find_dev(dev, 0x07351039, 0x00))
+ return "SiS 5591 ATA100 controller";
+ if (ata_find_dev(dev, 0x05301039, 0x00) ||
+ ata_find_dev(dev, 0x05401039, 0x00) ||
+ ata_find_dev(dev, 0x06201039, 0x00) ||
+ ata_find_dev(dev, 0x06301039, 0x00))
+ return "SiS 5591 ATA66 controller";
return "SiS 5591 ATA33 controller";
case 0x06491095:
--- ata-dma.c.orig Wed Aug 29 02:56:14 2001
+++ ata-dma.c Sat Nov 10 12:57:54 2001
@@ -514,18 +514,107 @@
/* we could set PIO mode timings, but we assume the BIOS did that */
break;
- case 0x55131039: /* SiS 5591 */
- if (udmamode >= 2 && pci_get_revid(parent) > 0xc1) {
- error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
- ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
- if (bootverbose)
- ata_printf(scp, device,
- "%s setting UDMA2 on SiS chip\n",
- (error) ? "failed" : "success");
- if (!error) {
- pci_write_config(parent, 0x40 + (devno << 1), 0xa301, 2);
- scp->mode[ATA_DEV(device)] = ATA_UDMA2;
- return;
+ case 0x55131039: /* SiS 5591, 530/540, 620/630/633/635, 730/733/735 */
+ if (ata_find_dev(parent, 0x06301039, 0x30) || /* SiS630S */
+ ata_find_dev(parent, 0x06331039, 0x00) || /* SiS633 */
+ ata_find_dev(parent, 0x06351039, 0x00) || /* SiS635 */
+ ata_find_dev(parent, 0x07301039, 0x00) || /* SiS730 */
+ ata_find_dev(parent, 0x07331039, 0x00) || /* SiS733 */
+ ata_find_dev(parent, 0x07351039, 0x00)) { /* SiS735 */
+ int16_t reg = 0;
+ if (udmamode >= 5) {
+ error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
+ ATA_UDMA5, ATA_C_F_SETXFER, ATA_WAIT_READY);
+ if (bootverbose)
+ ata_printf(scp, device,
+ "%s setting UDMA5 on SiS chip\n",
+ (error) ? "failed" : "success");
+ if (!error) {
+ reg = pci_read_config(parent, 0x40 + (devno << 1), 2);
+ reg &= 0x0fff;
+ pci_write_config(parent, 0x40 + (devno << 1), reg|0x8000, 2);
+ scp->mode[ATA_DEV(device)] = ATA_UDMA5;
+ return;
+ }
+ }
+ if (udmamode >= 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,
+ "%s setting UDMA4 on SiS chip\n",
+ (error) ? "failed" : "success");
+ if (!error) {
+ reg = pci_read_config(parent, 0x40 + (devno << 1), 2);
+ reg &= 0x0fff;
+ pci_write_config(parent, 0x40 + (devno << 1), reg|0x9000, 2);
+ scp->mode[ATA_DEV(device)] = ATA_UDMA4;
+ return;
+ }
+ }
+ if (udmamode >= 2) {
+ error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
+ ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
+ if (bootverbose)
+ ata_printf(scp, device,
+ "%s setting UDMA2 on SiS chip\n",
+ (error) ? "failed" : "success");
+ if (!error) {
+ reg = pci_read_config(parent, 0x40 + (devno << 1), 2);
+ reg &= 0x0fff;
+ pci_write_config(parent, 0x40 + (devno << 1), reg|0xb000, 2);
+ scp->mode[ATA_DEV(device)] = ATA_UDMA2;
+ return;
+ }
+ }
+ } else if (ata_find_dev(parent, 0x05301039, 0) || /* SiS530 */
+ ata_find_dev(parent, 0x05401039, 0) || /* SiS540 */
+ ata_find_dev(parent, 0x06201039, 0) || /* SiS620 */
+ ata_find_dev(parent, 0x06301039, 0)) { /* SiS630/E */
+ int16_t reg = 0;
+ if (udmamode >= 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,
+ "%s setting UDMA4 on SiS chip\n",
+ (error) ? "failed" : "success");
+ if (!error) {
+ reg = pci_read_config(parent, 0x40 + (devno << 1), 2);
+ reg &= 0x0fff;
+ pci_write_config(parent, 0x40 + (devno << 1), reg|0xa000, 2);
+ scp->mode[ATA_DEV(device)] = ATA_UDMA4;
+ return;
+ }
+ }
+ if (udmamode >= 2) {
+ error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
+ ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
+ if (bootverbose)
+ ata_printf(scp, device,
+ "%s setting UDMA2 on SiS chip\n",
+ (error) ? "failed" : "success");
+ if (!error) {
+ reg = pci_read_config(parent, 0x40 + (devno << 1), 2);
+ reg &= 0x0fff;
+ pci_write_config(parent, 0x40 + (devno << 1), reg|0xb000, 2);
+ scp->mode[ATA_DEV(device)] = ATA_UDMA2;
+ return;
+ }
+ }
+ } else {
+ if (udmamode >= 2 && pci_get_revid(parent) > 0xc1) {
+ error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
+ ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
+ if (bootverbose)
+ ata_printf(scp, device,
+ "%s setting UDMA2 on SiS chip\n",
+ (error) ? "failed" : "success");
+ if (!error) {
+ pci_write_config(parent, 0x40 + (devno << 1), 0xa301, 2);
+ scp->mode[ATA_DEV(device)] = ATA_UDMA2;
+ return;
+ }
}
}
if (wdmamode >=2 && apiomode >= 4) {
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?200112010800.fB1803t44342>
