From owner-freebsd-stable@FreeBSD.ORG Thu Sep 25 10:50:03 2003 Return-Path: Delivered-To: freebsd-stable@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 8FA2E16A4B3 for ; Thu, 25 Sep 2003 10:50:03 -0700 (PDT) Received: from salmon.maths.tcd.ie (salmon.maths.tcd.ie [134.226.81.11]) by mx1.FreeBSD.org (Postfix) with SMTP id 3FDB343FCB for ; Thu, 25 Sep 2003 10:50:02 -0700 (PDT) (envelope-from iedowse@maths.tcd.ie) Received: from walton.maths.tcd.ie by salmon.maths.tcd.ie with SMTP id ; 25 Sep 2003 18:50:01 +0100 (BST) To: Andrew Atrens In-Reply-To: Your message of "Wed, 24 Sep 2003 23:48:46 EDT." <3F72659E.8090809@nortelnetworks.com> Date: Thu, 25 Sep 2003 18:50:00 +0100 From: Ian Dowse Message-ID: <200309251850.aa69426@salmon.maths.tcd.ie> cc: stable@freebsd.org Subject: Re: fix/workaround for usb probe lockups on nForce2 mbs X-BeenThere: freebsd-stable@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Production branch of FreeBSD source code List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 25 Sep 2003 17:50:03 -0000 In message <3F72659E.8090809@nortelnetworks.com>, Andrew Atrens writes: > >The attached patch fixes the boot lockups I've been experiencing on my >nForce2 (A7N8X-Deluxe) motherboards when usb devices are on the bus at >boot time. > >Looks like something in usb_explore is (inadvertently?) enabling >interrupts if it detects a device on a port. The fix is, during hub >attach, to not assume that interrupts are off when we access the hub in >'polling' mode. Great, thanks for tracking it down! It sounds very similar to a problem people were having before with FAST_IPSEC where interrupts were being enabled and confusing the USB code. You have a "uhci" rather than an "ohci" controller I assume? If so, coould you try the following patch instead? Unfortunately I don't have anything to test this on, but it in theory it should work around this class of problems by backporting from -CURRENT some logic for avoiding interrupts in polling mode. Ian Index: uhci.c =================================================================== RCS file: /home/iedowse/CVS/src/sys/dev/usb/uhci.c,v retrieving revision 1.40.2.11 diff -u -r1.40.2.11 uhci.c --- uhci.c 22 Aug 2003 06:59:11 -0000 1.40.2.11 +++ uhci.c 25 Sep 2003 17:34:03 -0000 @@ -908,10 +908,26 @@ sc->sc_bulk_end = pqh; } +Static int uhci_intr1(uhci_softc_t *); + int uhci_intr(void *arg) { uhci_softc_t *sc = arg; + + DPRINTFN(15,("uhci_intr: real interrupt\n")); + if (sc->sc_bus.use_polling) { +#ifdef DIAGNOSTIC + printf("uhci_intr: ignored interrupt while polling\n"); +#endif + return (0); + } + return (uhci_intr1(sc)); +} + +int +uhci_intr1(uhci_softc_t *sc) +{ int status; int ack; uhci_intr_info_t *ii; @@ -934,7 +950,7 @@ #ifdef USB_DEBUG if (uhcidebug > 15) { - DPRINTF(("%s: uhci_intr\n", USBDEVNAME(sc->sc_bus.bdev))); + DPRINTF(("%s: uhci_intr1\n", USBDEVNAME(sc->sc_bus.bdev))); uhci_dumpregs(sc); } #endif @@ -1203,7 +1219,7 @@ usb_delay_ms(&sc->sc_bus, 1); DPRINTFN(20,("uhci_waitintr: 0x%04x\n", UREAD2(sc, UHCI_STS))); if (UREAD2(sc, UHCI_STS) & UHCI_STS_USBINT) - uhci_intr(sc); + uhci_intr1(sc); if (xfer->status != USBD_IN_PROGRESS) return; } @@ -1227,7 +1243,7 @@ uhci_softc_t *sc = (uhci_softc_t *)bus; if (UREAD2(sc, UHCI_STS) & UHCI_STS_USBINT) - uhci_intr(sc); + uhci_intr1(sc); } #if 0