[prev in list] [next in list] [prev in thread] [next in thread] 

List:       freebsd-bugs
Subject:    kern/45637: wi0 device_probe_and_attach returns 6
From:       Matt Emmerton <matt () gsicomp ! on ! ca>
Date:       2002-11-23 8:00:32
[Download RAW message or body]


> Number:         45637
> Category:       kern
> Synopsis:       wi0 device_probe_and_attach returns 6
> Confidential:   no
> Severity:       serious
> Priority:       high
> Responsible:    freebsd-bugs
> State:          open
> Quarter:        
> Keywords:       
> Date-Required:
> Class:          sw-bug
> Submitter-Id:   current-users
> Arrival-Date:   Sat Nov 23 00:10:01 PST 2002
> Closed-Date:
> Last-Modified:
> Originator:     Matt Emmerton
> Release:        FreeBSD 5.0-CURRENT i386
> Organization:
> Environment:
System: FreeBSD laptop.gsicomp.on.ca 5.0-CURRENT FreeBSD 5.0-CURRENT #42: Sat Nov 23 \
02:12:36 EST 2002 root@laptop.gsicomp.on.ca:/usr/obj/usr/src/sys/LAPTOP.20020914.01 \
i386

> Description:

> In message: <20021123004026.GE1766@unixpages.org>
> Christian Brueffer <chris@unixpages.org> writes:
> > Hi,
> > 
> > just installed DP2 on my IBM Thinkpad R32 and updated to the latest
> > -CURRENT.
> > My wlan device (Prism 2.5, internal, no pccard) fails at bootup:
> > 
> > wi0: <Intersil Prism2.5> mem 0xf8000000-0xf8000fff irq 11 at device 7.0
on pci2
> > wi0: No Mem space on prism2.5?
> > device_probe_and_attach: wi0 attach returned 6
> > 
> > Used to work fine with 4.7-STABLE.
> > 
> > Any ideas?
> 
> Nope.  More details?

The same wlan device has been broken for me on -CURRENT for a couple of
months now on a ThinkPad T23.  I never paid it much attention since I have a
PCMCIA wireless NIC which works fine.

Here's some useful output from boot -v:

pcib2: <PCIBIOS PCI-PCI bridge> at device 30.0 on pci0
pcib2:   secondary bus     2
pcib2:   subordinate bus   8
pcib2:   I/O decode     0x3000-0x7fff
pcib2:   memory decode 0xc02000000-0xcfffffff
pcib2:   prefetched decode 0xec000000-0xf7fffffff
pci2: <PCI bus> on pcib2
...
wi0:  <Intersil Prism2.5> mem 0xec000000-0xec000fff irq 11 at device 2.0 on
pci2
pcib2: device wi0 requesting range 0xec000000-0xec000fff (**)
pcib2: device wi0 requested unsupported memory range 0x0-0xcfffffff
(decoding 0xc0200000-0xcfffffff, 0xec000000-0xf7ffffff)
wi0: No Mem space on prism2.5?
device_probe_and_attach: wi0 attach returned 6

The line marked with (**) is from my own debug code in
sys/dev/pci/pci_pci.c, positioned upon entry to the pcib_alloc_resource()
function.

The code inside of #ifndef PCI_ALLOW_UNSUPPORTED_IO_RANGE (shouldn't that be
MEM_RANGE?) looks suspect since it doesn't check the start/end parameters
against the prefetched decode memory range.  The attached patch checks fixes
this, as well as cleans up the #ifdefs.

--
Matt Emmerton

> How-To-Repeat:

Boot a ThinkPad R32 or T23 with an integrated wlan card.

> Fix:

--- sys/dev/pci/pci_pci.c.orig	Sat Nov 23 01:34:54 2002
+++ sys/dev/pci/pci_pci.c	Sat Nov 23 02:16:15 2002
@@ -310,7 +310,9 @@
 			      " (decoding 0x%x-0x%x)\n",
 			      device_get_name(child), device_get_unit(child), start, end,
 			      sc->iobase, sc->iolimit);
+#ifndef PCI_ALLOW_UNSUPPORTED_IO_RANGE
 		return (NULL);
+#endif
 	    }
 	    if (bootverbose)
 		device_printf(sc->dev, "device %s%d requested decoded I/O range 0x%lx-0x%lx\n",
@@ -325,18 +327,34 @@
 	     */
 	case SYS_RES_MEMORY:
 	    if (!pcib_is_isa_mem(start)) {
-#ifndef PCI_ALLOW_UNSUPPORTED_IO_RANGE
-		if (start < sc->membase && end >= sc->membase)
-		    start = sc->membase;
-		if (end > sc->memlimit)
-		    end = sc->memlimit;
-		if (end < start)
-		    start = 0;
+#ifndef PCI_ALLOW_UNSUPPORTED_MEM_RANGE
+		if (((start < sc->membase)  || (end > sc->memlimit)) &&
+                    ((start < sc->pmembase) || (end > sc->pmemlimit))) {
+
+		    /* We've been given a request that falls outside   */
+		    /* of both the memory decode and prefetched decode */
+		    /* ranges. Force it to the memory decode range,    */
+		    /* but for no reason in particular.                */
+
+		    if (start < sc->membase && end >= sc->membase) {
+			start = sc->membase;
+                    }
+		    if (end > sc->memlimit) {
+			end = sc->memlimit;
+                    }
+		    if (end < start) {
+			start = 0;
+                    }
+		}
 #else
 		if (start < sc->membase && end > sc->membase)
 		    printf("start (%lx) < sc->membase (%x)\n", start, sc->membase);
+		if (start < sc->pmembase && end > sc->pmembase)
+		    printf("start (%lx) < sc->pmembase (%x)\n", start, sc->pmembase);
 		if (end > sc->memlimit)
 		    printf("end (%lx) > sc->memlimit (%x)\n", end, sc->memlimit);
+		if (end > sc->pmemlimit)
+		    printf("end (%lx) > sc->pmemlimit (%x)\n", end, sc->pmemlimit);
 		if (end < start) 
 		    printf("end (%lx) < start (%lx)\n", end, start);
 #endif
@@ -351,7 +369,7 @@
 			device_get_name(child), device_get_unit(child), start,
 			end, sc->membase, sc->memlimit, sc->pmembase,
 			sc->pmemlimit);
-#ifndef PCI_ALLOW_UNSUPPORTED_IO_RANGE
+#ifndef PCI_ALLOW_UNSUPPORTED_MEM_RANGE
 		return(NULL);
 #endif
 	    }

> Release-Note:
> Audit-Trail:
> Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic