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;

Reply via email to