Module Name: src Committed By: jmcneill Date: Thu Jan 30 00:36:29 UTC 2020
Modified Files: src/sys/dev/pci: if_re_pci.c Log Message: Prefer memory space register mapping over IO space. Make an exception for RTL8169SC, as the FreeBSD driver says memory mapped IO doesn't work there. To generate a diff of this commit: cvs rdiff -u -r1.50 -r1.51 src/sys/dev/pci/if_re_pci.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/if_re_pci.c diff -u src/sys/dev/pci/if_re_pci.c:1.50 src/sys/dev/pci/if_re_pci.c:1.51 --- src/sys/dev/pci/if_re_pci.c:1.50 Thu Nov 14 09:11:35 2019 +++ src/sys/dev/pci/if_re_pci.c Thu Jan 30 00:36:29 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: if_re_pci.c,v 1.50 2019/11/14 09:11:35 msaitoh Exp $ */ +/* $NetBSD: if_re_pci.c,v 1.51 2020/01/30 00:36:29 jmcneill Exp $ */ /* * Copyright (c) 1997, 1998-2003 @@ -46,7 +46,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_re_pci.c,v 1.50 2019/11/14 09:11:35 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_re_pci.c,v 1.51 2020/01/30 00:36:29 jmcneill Exp $"); #include <sys/types.h> @@ -190,6 +190,7 @@ re_pci_attach(device_t parent, device_t bus_space_handle_t ioh, memh; bus_size_t iosize, memsize; char intrbuf[PCI_INTRSTR_LEN]; + bool prefer_io = false; sc->sc_dev = self; psc->sc_pc = pa->pa_pc; @@ -219,16 +220,38 @@ re_pci_attach(device_t parent, device_t break; } - if (ioh_valid) { + switch (PCI_VENDOR(pa->pa_id)) { + case PCI_VENDOR_REALTEK: + switch (PCI_PRODUCT(pa->pa_id)) { + case PCI_PRODUCT_REALTEK_RT8169SC: + prefer_io = true; + break; + } + break; + } + if (!memh_valid) + prefer_io = true; + + if (ioh_valid && prefer_io) { sc->rtk_btag = iot; sc->rtk_bhandle = ioh; sc->rtk_bsize = iosize; if (memh_valid) bus_space_unmap(memt, memh, memsize); + + command = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG); + command |= PCI_COMMAND_IO_ENABLE; + pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, command); } else if (memh_valid) { sc->rtk_btag = memt; sc->rtk_bhandle = memh; sc->rtk_bsize = memsize; + if (ioh_valid) + bus_space_unmap(iot, ioh, iosize); + + command = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG); + command |= PCI_COMMAND_MEM_ENABLE; + pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, command); } else { aprint_error(": can't map registers\n"); return;