Subject: Re: patch for updated VIA and nVidia IDE support
To: None <port-i386@netbsd.org, port-amd64@netbsd.org>
From: Frank van der Linden <fvdl@netbsd.org>
List: port-amd64
Date: 10/22/2003 13:57:54
Oops, it was pointed out to me that I made an obvious error in the
patch (misplaced paren). Here's the corrected version:


Index: viaide.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/viaide.c,v
retrieving revision 1.4
diff -c -r1.4 viaide.c
*** viaide.c	18 Oct 2003 12:40:09 -0000	1.4
--- viaide.c	22 Oct 2003 11:34:49 -0000
***************
*** 39,44 ****
--- 39,45 ----
  #include <dev/pci/pciidevar.h>
  #include <dev/pci/pciide_apollo_reg.h>
  
+ static int	via_pcib_match(struct pci_attach_args *);
  static void	via_chip_map(struct pciide_softc *, struct pci_attach_args *);
  static void	via_sata_chip_map(struct pciide_softc *,
  		    struct pci_attach_args *);
***************
*** 161,166 ****
--- 162,177 ----
  	pciide_common_attach(sc, pa, pp);
  }
  
+ static int
+ via_pcib_match(struct pci_attach_args *pa)
+ {
+ 	if (PCI_CLASS(pa->pa_class) == PCI_CLASS_BRIDGE &&
+ 	    PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_BRIDGE_ISA &&
+ 	    PCI_VENDOR(pa->pa_id) == PCI_VENDOR_VIATECH)
+ 		return (1);
+ 	return 0;
+ }
+ 
  static void
  via_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
  {
***************
*** 170,177 ****
  	int channel;
  	u_int32_t ideconf;
  	bus_size_t cmdsize, ctlsize;
- 	pcitag_t pcib_tag;
  	pcireg_t pcib_id, pcib_class;
  
  	if (pciide_chipen(sc, pa) == 0)
  		return;
--- 181,188 ----
  	int channel;
  	u_int32_t ideconf;
  	bus_size_t cmdsize, ctlsize;
  	pcireg_t pcib_id, pcib_class;
+ 	struct pci_attach_args pcib_pa;
  
  	if (pciide_chipen(sc, pa) == 0)
  		return;
***************
*** 179,192 ****
  	switch (vendor) {
  	case PCI_VENDOR_VIATECH:
  		/*
! 		 * get a PCI tag for the ISA bridge (function 0 of the
! 		 * same device)
  		 */
! 		pcib_tag =
! 		    pci_make_tag(pa->pa_pc, pa->pa_bus, pa->pa_device, 0);
! 		/* and read ID and rev of the ISA bridge */
! 		pcib_id = pci_conf_read(sc->sc_pc, pcib_tag, PCI_ID_REG);
! 		pcib_class = pci_conf_read(sc->sc_pc, pcib_tag, PCI_CLASS_REG);
  		aprint_normal("%s: VIA Technologies ",
  		    sc->sc_wdcdev.sc_dev.dv_xname);
  		switch (PCI_PRODUCT(pcib_id)) {
--- 190,203 ----
  	switch (vendor) {
  	case PCI_VENDOR_VIATECH:
  		/*
! 		 * get a PCI tag for the ISA bridge.
  		 */
! 		if (pci_enumerate_bus(
! 		    (struct pci_softc *)sc->sc_wdcdev.sc_dev.dv_parent,
! 		    via_pcib_match, &pcib_pa) == 0)
! 			goto unknown;
! 		pcib_id = pcib_pa.pa_id;
! 		pcib_class = pcib_pa.pa_class;
  		aprint_normal("%s: VIA Technologies ",
  		    sc->sc_wdcdev.sc_dev.dv_xname);
  		switch (PCI_PRODUCT(pcib_id)) {
***************
*** 236,246 ****
--- 247,259 ----
  			aprint_normal("VT8235 ATA133 controller\n");
  			sc->sc_wdcdev.UDMA_cap = 6;
  			break;
+ 		case PCI_PRODUCT_VIATECH_VT8237:
  		case PCI_PRODUCT_VIATECH_VT8237_SATA:
  			aprint_normal("VT8237 ATA133 controller\n");
  			sc->sc_wdcdev.UDMA_cap = 6;
  			break;
  		default:
+ unknown:
  			aprint_normal("unknown VIA ATA controller\n");
  			sc->sc_wdcdev.UDMA_cap = 0;
  		}
***************
*** 264,269 ****
--- 277,283 ----
  			sc->sc_wdcdev.UDMA_cap = 5;
  			break;
  		case PCI_PRODUCT_NVIDIA_NFORCE2_ATA133:
+ 		case PCI_PRODUCT_NVIDIA_NFORCE3_ATA133:
  			sc->sc_wdcdev.UDMA_cap = 6;
  			break;
  		}