diff options
| author | chs <chs@NetBSD.org> | 2003-11-28 20:08:29 +0000 |
|---|---|---|
| committer | chs <chs@NetBSD.org> | 2003-11-28 20:08:29 +0000 |
| commit | 669d2bb92c4aad732168eb1702ced5d760ae2af5 (patch) | |
| tree | 54a3cd5da8e957f29f0b44f6f8a2ea5eba4cc356 /sys/dev | |
| parent | 3bf428ce2375559abff4dfc814d6421aa3b7fd1d (diff) | |
add support for HPT302 and HPT371. simplify timing selection.
adapted from OpenBSD. tested on an HPT302, review by bouyer@.
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/pci/hptide.c | 161 |
1 files changed, 81 insertions, 80 deletions
diff --git a/sys/dev/pci/hptide.c b/sys/dev/pci/hptide.c index cffa328665c..fc43d254f76 100644 --- a/sys/dev/pci/hptide.c +++ b/sys/dev/pci/hptide.c @@ -1,4 +1,4 @@ -/* $NetBSD: hptide.c,v 1.6 2003/11/27 23:02:40 fvdl Exp $ */ +/* $NetBSD: hptide.c,v 1.7 2003/11/28 20:08:29 chs Exp $ */ /* * Copyright (c) 1999, 2000, 2001 Manuel Bouyer. @@ -49,12 +49,22 @@ CFATTACH_DECL(hptide, sizeof(struct pciide_softc), hptide_match, hptide_attach, NULL, NULL); static const struct pciide_product_desc pciide_triones_products[] = { + { PCI_PRODUCT_TRIONES_HPT302, + 0, + NULL, + hpt_chip_map + }, { PCI_PRODUCT_TRIONES_HPT366, 0, NULL, hpt_chip_map, }, - { PCI_PRODUCT_TRIONES_HPT372, + { PCI_PRODUCT_TRIONES_HPT371, + 0, + NULL, + hpt_chip_map, + }, + { PCI_PRODUCT_TRIONES_HPT372A, 0, NULL, hpt_chip_map @@ -108,11 +118,20 @@ hpt_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa) revision = PCI_REVISION(pa->pa_class); aprint_normal("%s: Triones/Highpoint ", sc->sc_wdcdev.sc_dev.dv_xname); - if (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT374) + switch (sc->sc_pp->ide_product) { + case PCI_PRODUCT_TRIONES_HPT302: + aprint_normal("HPT302 IDE Controller\n"); + break; + case PCI_PRODUCT_TRIONES_HPT371: + aprint_normal("HPT371 IDE Controller\n"); + break; + case PCI_PRODUCT_TRIONES_HPT374: aprint_normal("HPT374 IDE Controller\n"); - else if (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372) - aprint_normal("HPT372 IDE Controller\n"); - else if (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366) { + break; + case PCI_PRODUCT_TRIONES_HPT372A: + aprint_normal("HPT372A IDE Controller\n"); + break; + case PCI_PRODUCT_TRIONES_HPT366: if (revision == HPT372_REV) aprint_normal("HPT372 IDE Controller\n"); else if (revision == HPT370_REV) @@ -124,9 +143,11 @@ hpt_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa) else aprint_normal("unknown HPT IDE controller rev %d\n", revision); - } else + break; + default: aprint_normal("unknown HPT IDE controller 0x%x\n", sc->sc_pp->ide_product); + } /* * when the chip is in native mode it identifies itself as a @@ -140,7 +161,9 @@ hpt_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa) if ((sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366 && (revision == HPT370_REV || revision == HPT370A_REV || revision == HPT372_REV)) || - sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372 || + sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT302 || + sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT371 || + sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372A || sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT374) interface |= PCIIDE_INTERFACE_PCI(1); } @@ -168,7 +191,9 @@ hpt_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa) } else { sc->sc_wdcdev.nchannels = 2; if (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT374 || - sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372 || + sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372A || + sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT371 || + sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT302 || (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366 && revision == HPT372_REV)) sc->sc_wdcdev.UDMA_cap = 6; @@ -217,7 +242,9 @@ hpt_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa) if ((sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366 && (revision == HPT370_REV || revision == HPT370A_REV || revision == HPT372_REV)) || - sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372 || + sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT302 || + sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT371 || + sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372A || sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT374) { /* * HPT370_REV and highter has a bit to disable interrupts, @@ -230,7 +257,9 @@ hpt_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa) /* set clocks, etc (mandatory on 372/4, optional otherwise) */ if ((sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366 && revision == HPT372_REV ) || - sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372 || + sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT302 || + sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT371 || + sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372A || sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT374) pciide_pci_write(sc->sc_pc, sc->sc_tag, HPT_SC2, (pciide_pci_read(sc->sc_pc, sc->sc_tag, HPT_SC2) & @@ -250,6 +279,7 @@ hpt_setup_channel(struct channel_softc *chp) struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc; int revision = PCI_REVISION(pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_CLASS_REG)); + const u_int32_t *tim_pio, *tim_dma, *tim_udma; cable = pciide_pci_read(sc->sc_pc, sc->sc_tag, HPT_CSEL); @@ -258,6 +288,43 @@ hpt_setup_channel(struct channel_softc *chp) idedma_ctl = 0; + /* select the timing arrays for the chip */ + switch (sc->sc_pp->ide_product) { + case PCI_PRODUCT_TRIONES_HPT374: + tim_udma = hpt374_udma; + tim_dma = hpt374_dma; + tim_pio = hpt374_pio; + break; + case PCI_PRODUCT_TRIONES_HPT302: + case PCI_PRODUCT_TRIONES_HPT371: + case PCI_PRODUCT_TRIONES_HPT372A: + tim_udma = hpt372_udma; + tim_dma = hpt372_dma; + tim_pio = hpt372_pio; + break; + case PCI_PRODUCT_TRIONES_HPT366: + default: + switch (revision) { + case HPT372_REV: + tim_udma = hpt372_udma; + tim_dma = hpt372_dma; + tim_pio = hpt372_pio; + break; + case HPT370_REV: + case HPT370A_REV: + tim_udma = hpt370_udma; + tim_dma = hpt370_dma; + tim_pio = hpt370_pio; + break; + case HPT366_REV: + default: + tim_udma = hpt366_udma; + tim_dma = hpt366_dma; + tim_pio = hpt366_pio; + break; + } + } + /* Per drive settings */ for (drive = 0; drive < 2; drive++) { drvp = &chp->ch_drive[drive]; @@ -274,29 +341,7 @@ hpt_setup_channel(struct channel_softc *chp) if ((cable & HPT_CSEL_CBLID(chp->channel)) != 0 && drvp->UDMA_mode > 2) drvp->UDMA_mode = 2; - switch (sc->sc_pp->ide_product) { - case PCI_PRODUCT_TRIONES_HPT374: - after = hpt374_udma[drvp->UDMA_mode]; - break; - case PCI_PRODUCT_TRIONES_HPT372: - after = hpt372_udma[drvp->UDMA_mode]; - break; - case PCI_PRODUCT_TRIONES_HPT366: - default: - switch(revision) { - case HPT372_REV: - after = hpt372_udma[drvp->UDMA_mode]; - break; - case HPT370_REV: - case HPT370A_REV: - after = hpt370_udma[drvp->UDMA_mode]; - break; - case HPT366_REV: - default: - after = hpt366_udma[drvp->UDMA_mode]; - break; - } - } + after = tim_udma[drvp->UDMA_mode]; idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); } else if (drvp->drive_flags & DRIVE_DMA) { /* @@ -308,55 +353,11 @@ hpt_setup_channel(struct channel_softc *chp) (drvp->DMA_mode + 2) > drvp->PIO_mode) { drvp->DMA_mode = drvp->PIO_mode - 2; } - switch (sc->sc_pp->ide_product) { - case PCI_PRODUCT_TRIONES_HPT374: - after = hpt374_dma[drvp->DMA_mode]; - break; - case PCI_PRODUCT_TRIONES_HPT372: - after = hpt372_dma[drvp->DMA_mode]; - break; - case PCI_PRODUCT_TRIONES_HPT366: - default: - switch(revision) { - case HPT372_REV: - after = hpt372_dma[drvp->DMA_mode]; - break; - case HPT370_REV: - case HPT370A_REV: - after = hpt370_dma[drvp->DMA_mode]; - break; - case HPT366_REV: - default: - after = hpt366_dma[drvp->DMA_mode]; - break; - } - } + after = tim_dma[drvp->DMA_mode]; idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive); } else { /* PIO only */ - switch (sc->sc_pp->ide_product) { - case PCI_PRODUCT_TRIONES_HPT374: - after = hpt374_pio[drvp->PIO_mode]; - break; - case PCI_PRODUCT_TRIONES_HPT372: - after = hpt372_pio[drvp->PIO_mode]; - break; - case PCI_PRODUCT_TRIONES_HPT366: - default: - switch(revision) { - case HPT372_REV: - after = hpt372_pio[drvp->PIO_mode]; - break; - case HPT370_REV: - case HPT370A_REV: - after = hpt370_pio[drvp->PIO_mode]; - break; - case HPT366_REV: - default: - after = hpt366_pio[drvp->PIO_mode]; - break; - } - } + after = tim_pio[drvp->PIO_mode]; } pci_conf_write(sc->sc_pc, sc->sc_tag, HPT_IDETIM(chp->channel, drive), after); |
