cvs commit: src/sys/dev/fxp if_fxp.c

M. Warner Losh imp at bsdimp.com
Tue Apr 15 07:27:56 PDT 2003


In message: <20030414124016.O39446 at sasami.jurai.net>
            "Matthew N. Dodd" <mdodd at FreeBSD.org> writes:
: On Mon, 14 Apr 2003, M. Warner Losh wrote:
: > In message: <200304140945.h3E9jPCe005099 at repoman.freebsd.org>
: >             Maxim Sobolev <sobomax at FreeBSD.org> writes:
: > :   Before attaching device set PCIM_CMD_PORTEN in addition to
: > :   PCIM_CMD_MEMEN and PCIM_CMD_BUSMASTEREN, becaise some braindead
: > :   BIOSes (such as one found in my vprmatrix notebook) forget
: > :   to initialize it properly resulting in attachment failure.
: >
: > Actually, code like this should be the pci bus, since all driver have
: > this issue...
: 
: Likely this could be added to the bus_alloc_resource() path...  Doing a
: sanity check on requests and then enabling the resource seems like the
: correct solution.

Yup.  Here's the patch I came up with.  Care to review?

Index: pci.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/pci/pci.c,v
retrieving revision 1.212
diff -u -r1.212 pci.c
--- pci.c	19 Feb 2003 05:47:09 -0000	1.212
+++ pci.c	15 Apr 2003 14:23:03 -0000
@@ -1301,21 +1301,33 @@
 	 * XXX add support here for SYS_RES_IOPORT and SYS_RES_MEMORY
 	 */
 	if (device_get_parent(child) == dev) {
-		/*
-		 * If the child device doesn't have an interrupt routed
-		 * and is deserving of an interrupt, try to assign it one.
-		 */
-		if ((type == SYS_RES_IRQ) &&
-		    !PCI_INTERRUPT_VALID(cfg->intline) &&
-		    (cfg->intpin != 0)) {
-			cfg->intline = PCIB_ROUTE_INTERRUPT(
-				device_get_parent(dev), child, cfg->intpin);
-			if (PCI_INTERRUPT_VALID(cfg->intline)) {
-				pci_write_config(child, PCIR_INTLINE,
-				    cfg->intline, 1);
-				resource_list_add(rl, SYS_RES_IRQ, 0,
-				    cfg->intline, cfg->intline, 1);
+		switch (type) {
+		case SYS_RES_IRQ:
+			/*
+			 * If the child device doesn't have an
+			 * interrupt routed and is deserving of an
+			 * interrupt, try to assign it one.
+			 */
+			if (!PCI_INTERRUPT_VALID(cfg->intline) &&
+			    (cfg->intpin != 0)) {
+				cfg->intline = PCIB_ROUTE_INTERRUPT(
+				    device_get_parent(dev), child, cfg->intpin);
+				if (PCI_INTERRUPT_VALID(cfg->intline)) {
+					pci_write_config(child, PCIR_INTLINE,
+					    cfg->intline, 1);
+					resource_list_add(rl, SYS_RES_IRQ, 0,
+					    cfg->intline, cfg->intline, 1);
+				}
 			}
+			break;
+		case SYS_RES_IOPORT:
+		case SYS_RES_MEMORY:
+			/*
+			 * Enable the I/O mode.  We should also be allocating
+			 * resources too. XXX
+			 */
+			pci_enable_io_method(dev, child, type);
+			break;
 		}
 	}
 


More information about the cvs-src mailing list