Module Name:    src
Committed By:   phx
Date:           Wed Dec 28 20:28:04 UTC 2011

Modified Files:
        src/sys/dev/pci: viaide.c

Log Message:
Add VT6410 support, heavily based on a patch by Takahiro Kambe:
  http://mail-index.netbsd.org/port-i386/2007/03/30/0000.html
The VT6410 is special, because it may exist without a VIA PCI-ISA bridge.


To generate a diff of this commit:
cvs rdiff -u -r1.76 -r1.77 src/sys/dev/pci/viaide.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/pci/viaide.c
diff -u src/sys/dev/pci/viaide.c:1.76 src/sys/dev/pci/viaide.c:1.77
--- src/sys/dev/pci/viaide.c:1.76	Sun Jul 10 20:01:37 2011
+++ src/sys/dev/pci/viaide.c	Wed Dec 28 20:28:04 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: viaide.c,v 1.76 2011/07/10 20:01:37 jakllsch Exp $	*/
+/*	$NetBSD: viaide.c,v 1.77 2011/12/28 20:28:04 phx Exp $	*/
 
 /*
  * Copyright (c) 1999, 2000, 2001 Manuel Bouyer.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: viaide.c,v 1.76 2011/07/10 20:01:37 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: viaide.c,v 1.77 2011/12/28 20:28:04 phx Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -310,6 +310,11 @@ static const struct pciide_product_desc 
 	  NULL,
 	  via_chip_map,
 	},
+	{ PCI_PRODUCT_VIATECH_VT6410_RAID,
+	  0,
+	  NULL,
+	  via_chip_map,
+	},
 	{ PCI_PRODUCT_VIATECH_VT6421_RAID,
 	  0,
 	  "VIA Technologies VT6421 Serial ATA RAID Controller",
@@ -451,82 +456,93 @@ via_chip_map(struct pciide_softc *sc, co
 
 	switch (vendor) {
 	case PCI_VENDOR_VIATECH:
-		/*
-		 * get a PCI tag for the ISA bridge.
-		 */
-		if (pci_find_device(&pcib_pa, via_pcib_match) == 0)
-			goto unknown;
-		pcib_id = pcib_pa.pa_id;
-		pcib_class = pcib_pa.pa_class;
-		aprint_normal_dev(sc->sc_wdcdev.sc_atac.atac_dev,
-		    "VIA Technologies ");
-		switch (PCI_PRODUCT(pcib_id)) {
-		case PCI_PRODUCT_VIATECH_VT82C586_ISA:
-			aprint_normal("VT82C586 (Apollo VP) ");
-			if(PCI_REVISION(pcib_class) >= 0x02) {
-				aprint_normal("ATA33 controller\n");
-				sc->sc_wdcdev.sc_atac.atac_udma_cap = 2;
-			} else {
-				aprint_normal("controller\n");
-				sc->sc_wdcdev.sc_atac.atac_udma_cap = 0;
-			}
-			break;
-		case PCI_PRODUCT_VIATECH_VT82C596A:
-			aprint_normal("VT82C596A (Apollo Pro) ");
-			if (PCI_REVISION(pcib_class) >= 0x12) {
-				aprint_normal("ATA66 controller\n");
-				sc->sc_wdcdev.sc_atac.atac_udma_cap = 4;
-			} else {
-				aprint_normal("ATA33 controller\n");
-				sc->sc_wdcdev.sc_atac.atac_udma_cap = 2;
-			}
+		switch (PCI_PRODUCT(pa->pa_id)) {
+		case PCI_PRODUCT_VIATECH_VT6410_RAID:
+			aprint_normal_dev(sc->sc_wdcdev.sc_atac.atac_dev,
+			    "VIA Technologies VT6410 IDE controller\n");
+			sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
+			interface = PCIIDE_INTERFACE_BUS_MASTER_DMA |
+			    PCIIDE_INTERFACE_PCI(0) | PCIIDE_INTERFACE_PCI(1);
 			break;
-		case PCI_PRODUCT_VIATECH_VT82C686A_ISA:
-			aprint_normal("VT82C686A (Apollo KX133) ");
-			if (PCI_REVISION(pcib_class) >= 0x40) {
-				aprint_normal("ATA100 controller\n");
+		default:
+			/*
+			 * get a PCI tag for the ISA bridge.
+			 */
+			if (pci_find_device(&pcib_pa, via_pcib_match) == 0)
+				goto unknown;
+			pcib_id = pcib_pa.pa_id;
+			pcib_class = pcib_pa.pa_class;
+			aprint_normal_dev(sc->sc_wdcdev.sc_atac.atac_dev,
+			    "VIA Technologies ");
+			switch (PCI_PRODUCT(pcib_id)) {
+			case PCI_PRODUCT_VIATECH_VT82C586_ISA:
+				aprint_normal("VT82C586 (Apollo VP) ");
+				if(PCI_REVISION(pcib_class) >= 0x02) {
+					aprint_normal("ATA33 controller\n");
+					sc->sc_wdcdev.sc_atac.atac_udma_cap = 2;
+				} else {
+					aprint_normal("controller\n");
+					sc->sc_wdcdev.sc_atac.atac_udma_cap = 0;
+				}
+				break;
+			case PCI_PRODUCT_VIATECH_VT82C596A:
+				aprint_normal("VT82C596A (Apollo Pro) ");
+				if (PCI_REVISION(pcib_class) >= 0x12) {
+					aprint_normal("ATA66 controller\n");
+					sc->sc_wdcdev.sc_atac.atac_udma_cap = 4;
+				} else {
+					aprint_normal("ATA33 controller\n");
+					sc->sc_wdcdev.sc_atac.atac_udma_cap = 2;
+				}
+				break;
+			case PCI_PRODUCT_VIATECH_VT82C686A_ISA:
+				aprint_normal("VT82C686A (Apollo KX133) ");
+				if (PCI_REVISION(pcib_class) >= 0x40) {
+					aprint_normal("ATA100 controller\n");
+					sc->sc_wdcdev.sc_atac.atac_udma_cap = 5;
+				} else {
+					aprint_normal("ATA66 controller\n");
+					sc->sc_wdcdev.sc_atac.atac_udma_cap = 4;
+				}
+				break;
+			case PCI_PRODUCT_VIATECH_VT8231:
+				aprint_normal("VT8231 ATA100 controller\n");
+				sc->sc_wdcdev.sc_atac.atac_udma_cap = 5;
+				break;
+			case PCI_PRODUCT_VIATECH_VT8233:
+				aprint_normal("VT8233 ATA100 controller\n");
 				sc->sc_wdcdev.sc_atac.atac_udma_cap = 5;
-			} else {
-				aprint_normal("ATA66 controller\n");
-				sc->sc_wdcdev.sc_atac.atac_udma_cap = 4;
+				break;
+			case PCI_PRODUCT_VIATECH_VT8233A:
+				aprint_normal("VT8233A ATA133 controller\n");
+				sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
+				break;
+			case PCI_PRODUCT_VIATECH_VT8235:
+				aprint_normal("VT8235 ATA133 controller\n");
+				sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
+				break;
+			case PCI_PRODUCT_VIATECH_VT8237:
+				aprint_normal("VT8237 ATA133 controller\n");
+				sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
+				break;
+			case PCI_PRODUCT_VIATECH_VT8237A_ISA:
+				aprint_normal("VT8237A ATA133 controller\n");
+				sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
+				break;
+			case PCI_PRODUCT_VIATECH_CX700:
+				aprint_normal("CX700 ATA133 controller\n");
+				sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
+				break;
+			case PCI_PRODUCT_VIATECH_VT8251:
+				aprint_normal("VT8251 ATA133 controller\n");
+				sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
+				break;
+			default:
+		unknown:
+				aprint_normal("unknown VIA ATA controller\n");
+				sc->sc_wdcdev.sc_atac.atac_udma_cap = 0;
 			}
 			break;
-		case PCI_PRODUCT_VIATECH_VT8231:
-			aprint_normal("VT8231 ATA100 controller\n");
-			sc->sc_wdcdev.sc_atac.atac_udma_cap = 5;
-			break;
-		case PCI_PRODUCT_VIATECH_VT8233:
-			aprint_normal("VT8233 ATA100 controller\n");
-			sc->sc_wdcdev.sc_atac.atac_udma_cap = 5;
-			break;
-		case PCI_PRODUCT_VIATECH_VT8233A:
-			aprint_normal("VT8233A ATA133 controller\n");
-			sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
-			break;
-		case PCI_PRODUCT_VIATECH_VT8235:
-			aprint_normal("VT8235 ATA133 controller\n");
-			sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
-			break;
-		case PCI_PRODUCT_VIATECH_VT8237:
-			aprint_normal("VT8237 ATA133 controller\n");
-			sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
-			break;
-		case PCI_PRODUCT_VIATECH_VT8237A_ISA:
-			aprint_normal("VT8237A ATA133 controller\n");
-			sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
-			break;
-		case PCI_PRODUCT_VIATECH_CX700:
-			aprint_normal("CX700 ATA133 controller\n");
-			sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
-			break;
-		case PCI_PRODUCT_VIATECH_VT8251:
-			aprint_normal("VT8251 ATA133 controller\n");
-			sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
-			break;
-		default:
-unknown:
-			aprint_normal("unknown VIA ATA controller\n");
-			sc->sc_wdcdev.sc_atac.atac_udma_cap = 0;
 		}
 		sc->sc_apo_regbase = APO_VIA_REGBASE;
 		break;

Reply via email to