diff --git a/sys/dev/pci/if_re_pci.c b/sys/dev/pci/if_re_pci.c index 89252454154d..013e734a8abd 100644 --- a/sys/dev/pci/if_re_pci.c +++ b/sys/dev/pci/if_re_pci.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_re_pci.c,v 1.21 2006/11/24 19:38:55 christos Exp $ */ +/* $NetBSD: if_re_pci.c,v 1.22 2007/02/04 03:20:23 tsutsui Exp $ */ /* * Copyright (c) 1997, 1998-2003 @@ -76,11 +76,6 @@ #include #include -/* - * Default to using PIO access for this driver. - */ -#define RE_USEIOSPACE - #include #include #include @@ -180,13 +175,14 @@ CFATTACH_DECL(re_pci, sizeof(struct re_pci_softc), re_pci_match, re_pci_attach, static int re_pci_match(struct device *parent, struct cfdata *match, void *aux) { - const struct rtk_type *t; + const struct rtk_type *t; struct pci_attach_args *pa = aux; - bus_space_tag_t rtk_btag; - bus_space_handle_t rtk_bhandle; - bus_size_t bsize; + bus_space_tag_t iot, memt, bst; + bus_space_handle_t ioh, memh, bsh; + bus_size_t memsize, iosize, bsize; u_int32_t hwrev; pcireg_t subid; + boolean_t ioh_valid, memh_valid; subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG); @@ -206,24 +202,25 @@ re_pci_match(struct device *parent, struct cfdata *match, void *aux) * Temporarily map the I/O space * so we can read the chip ID register. */ -#ifdef RE_USEIOSPACE - if (pci_mapreg_map(pa, RTK_PCI_LOIO, - PCI_MAPREG_TYPE_IO, 0, &rtk_btag, - &rtk_bhandle, NULL, &bsize)) { - aprint_error("can't map i/o space\n"); + ioh_valid = (pci_mapreg_map(pa, RTK_PCI_LOIO, + PCI_MAPREG_TYPE_IO, 0, &iot, &ioh, + NULL, &iosize) == 0); + memh_valid = (pci_mapreg_map(pa, RTK_PCI_LOMEM, + PCI_MAPREG_TYPE_MEM, 0, &memt, &memh, + NULL, &memsize) == 0); + if (ioh_valid) { + bst = iot; + bsh = ioh; + bsize = iosize; + } else if (memh_valid) { + bst = memt; + bsh = memh; + bsize = memsize; + } else return 0; - } -#else - if (pci_mapreg_map(pa, RTK_PCI_LOMEM, - PCI_MAPREG_TYPE_MEM, 0, &rtk_btag, - &rtk_bhandle, NULL, &bsize)) { - aprint_error("can't map mem space\n"); - return 0; - } -#endif - hwrev = bus_space_read_4(rtk_btag, rtk_bhandle, - RTK_TXCFG) & RTK_TXCFG_HWREV; - bus_space_unmap(rtk_btag, rtk_bhandle, bsize); + hwrev = bus_space_read_4(bst, bsh, RTK_TXCFG) & + RTK_TXCFG_HWREV; + bus_space_unmap(bst, bsh, bsize); if (t->rtk_basetype == hwrev) return 2; /* defeat rtk(4) */ } @@ -244,11 +241,14 @@ re_pci_attach(struct device *parent, struct device *self, void *aux) const char *intrstr = NULL; const struct rtk_type *t; const struct rtk_hwrev *hw_rev; - int hwrev; + uint32_t hwrev; int error = 0; int pmreg; + boolean_t ioh_valid, memh_valid; pcireg_t command; - bus_size_t bsize; + bus_space_tag_t iot, memt; + bus_space_handle_t ioh, memh; + bus_size_t iosize, memsize, bsize; /* @@ -287,19 +287,23 @@ re_pci_attach(struct device *parent, struct device *self, void *aux) command |= PCI_COMMAND_MASTER_ENABLE; pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, command); -#ifdef RE_USEIOSPACE - if (pci_mapreg_map(pa, RTK_PCI_LOIO, PCI_MAPREG_TYPE_IO, 0, - &sc->rtk_btag, &sc->rtk_bhandle, NULL, &bsize)) { - aprint_error("%s: can't map i/o space\n", sc->sc_dev.dv_xname); + ioh_valid = (pci_mapreg_map(pa, RTK_PCI_LOIO, PCI_MAPREG_TYPE_IO, 0, + &iot, &ioh, NULL, &iosize) == 0); + memh_valid = (pci_mapreg_map(pa, RTK_PCI_LOMEM, PCI_MAPREG_TYPE_MEM, 0, + &memt, &memh, NULL, &memsize) == 0); + if (ioh_valid) { + sc->rtk_btag = iot; + sc->rtk_bhandle = ioh; + bsize = iosize; + } else if (memh_valid) { + sc->rtk_btag = memt; + sc->rtk_bhandle = memh; + bsize = memsize; + } else { + aprint_error("%s: can't map registers\n", sc->sc_dev.dv_xname); return; } -#else - if (pci_mapreg_map(pa, RTK_PCI_LOMEM, PCI_MAPREG_TYPE_MEM, 0, - &sc->rtk_btag, &sc->rtk_bhandle, NULL, &bsize)) { - aprint_error("%s: can't map mem space\n", sc->sc_dev.dv_xname); - return; - } -#endif + t = re_devs; hwrev = CSR_READ_4(sc, RTK_TXCFG) & RTK_TXCFG_HWREV;