Date: Sat, 11 May 2002 00:10:16 +0900 (JST) From: Toshikazu ICHINOSEKI <t.ichinoseki@nifty.com> To: FreeBSD-gnats-submit@FreeBSD.org Subject: kern/37928: [PATCH] can't go single user mode after usb mouse attached Message-ID: <20020511.001016.74758161.toshi@altair.weganet.jp>
index | next in thread | raw e-mail
>Number: 37928
>Category: kern
>Synopsis: [PATCH] can't go single user mode after usb mouse attached
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Fri May 10 08:20:01 PDT 2002
>Closed-Date:
>Last-Modified:
>Originator: Toshikazu Ichinoseki
>Release: FreeBSD 5.0-CURRENT i386
>Organization:
>Environment:
System: FreeBSD altair 5.0-CURRENT FreeBSD 5.0-CURRENT #33: Fri May 10 21:22:34 JST 2002 toshi@altair:/usr/src/sys/i386/compile/ALTAIR i386
Machine: Aopen AX59pro + AMD K6-2 450MHz + 512MB Mem
(Chip set is Apollo MVP3, uhci0: <VIA 83C572 USB controller>)
>Description:
When I try to go single user mode after usb mouse attached, I get
following message on console:
init: some process would not die; ps axl advised
init: can't get /dev/console for controlling terminal: Operation not permitted.
<This message repeats until I reboot with ctrl+alt+delete.>
In DDB, ps shows that moused sleeps with wmesg "uhciab". This
means uhci driver sleeps in uhci_abort_xfer() and is not waken
up.
>How-To-Repeat:
Whenever I try to go single user mode, after usb mouse is attached .
>Fix:
Following patch fixes this problem. And I can use HP Diskjet 957c
USB printer after this patch applied. Before I apply this patch,
lpr fails to open /dev/ulpt0, so I can print nothing.
I don't have a FreeBSD box which has ohci device, so patch to
ohci.c and ohciver.h is not tested.
On recent change to usb_port.h, USB_USE_SOFTINTR is defined.
Patched uhci driver works whether USB_USE_SOFTINTR is defined or
not.
------------------------------------------------------------
Index: ohci.c
===================================================================
RCS file: /local/cvsroot/src/sys/dev/usb/ohci.c,v
retrieving revision 1.104
diff -u -r1.104 ohci.c
--- ohci.c 29 Apr 2002 16:23:14 -0000 1.104
+++ ohci.c 9 May 2002 15:05:30 -0000
@@ -140,6 +140,7 @@
#endif
Static usbd_status ohci_open(usbd_pipe_handle);
Static void ohci_poll(struct usbd_bus *);
+Static void ohci_softintr_do_wakeup(void *ident);
Static void ohci_softintr(void *);
Static void ohci_waitintr(ohci_softc_t *, usbd_xfer_handle);
Static void ohci_add_done(ohci_softc_t *, ohci_physaddr_t);
@@ -891,6 +892,7 @@
#endif
usb_callout_init(sc->sc_tmo_rhsc);
+ usb_callout_init(sc->sc_softintr_handle);
return (USBD_NORMAL_COMPLETION);
@@ -1301,9 +1303,24 @@
}
void
+ohci_softintr_do_wakeup(void *ident)
+{
+ int s;
+
+ s = splusb();
+ wakeup(ident);
+ splx(s);
+}
+
+void
ohci_softintr(void *v)
{
+#if defined(__FreeBSD__)
+ struct usbd_bus *bus = v;
+ ohci_softc_t *sc = device_get_ivars(bus->bdev);
+#else
ohci_softc_t *sc = v;
+#endif
ohci_soft_itd_t *sitd, *sidone, *sitdnext;
ohci_soft_td_t *std, *sdone, *stdnext;
usbd_xfer_handle xfer;
@@ -1456,7 +1473,9 @@
if (sc->sc_softwake) {
sc->sc_softwake = 0;
- wakeup(&sc->sc_softwake);
+ /* wake up after 1 tick */
+ usb_callout(sc->sc_softintr_handle, 1,
+ ohci_softintr_do_wakeup, &sc->sc_softwake);
}
sc->sc_bus.intr_context--;
Index: ohcivar.h
===================================================================
RCS file: /local/cvsroot/src/sys/dev/usb/ohcivar.h,v
retrieving revision 1.32
diff -u -r1.32 ohcivar.h
--- ohcivar.h 7 Apr 2002 15:16:31 -0000 1.32
+++ ohcivar.h 9 May 2002 14:37:17 -0000
@@ -141,6 +141,8 @@
device_ptr_t sc_child;
char sc_dying;
+
+ usb_callout_t sc_softintr_handle;
} ohci_softc_t;
struct ohci_xfer {
Index: uhci.c
===================================================================
RCS file: /local/cvsroot/src/sys/dev/usb/uhci.c,v
retrieving revision 1.120
diff -u -r1.120 uhci.c
--- uhci.c 26 Apr 2002 22:48:22 -0000 1.120
+++ uhci.c 9 May 2002 15:04:11 -0000
@@ -247,6 +247,7 @@
Static usbd_status uhci_open(usbd_pipe_handle);
Static void uhci_poll(struct usbd_bus *);
+Static void uhci_softintr_do_wakeup(void *ident);
Static void uhci_softintr(void *);
Static usbd_status uhci_device_request(usbd_xfer_handle xfer);
@@ -506,6 +507,7 @@
SIMPLEQ_INIT(&sc->sc_free_xfers);
usb_callout_init(sc->sc_poll_handle);
+ usb_callout_init(sc->sc_softintr_handle);
/* Set up the bus struct. */
sc->sc_bus.methods = &uhci_bus_methods;
@@ -1262,9 +1264,24 @@
}
void
+uhci_softintr_do_wakeup(void *ident)
+{
+ int s;
+
+ s = splusb();
+ wakeup(ident);
+ splx(s);
+}
+
+void
uhci_softintr(void *v)
{
+#if defined(__FreeBSD__)
+ struct usbd_bus *bus = v;
+ uhci_softc_t *sc = device_get_ivars(bus->bdev);
+#else
uhci_softc_t *sc = v;
+#endif
uhci_intr_info_t *ii;
DPRINTFN(10,("%s: uhci_softintr (%d)\n", USBDEVNAME(sc->sc_bus.bdev),
@@ -1288,7 +1305,9 @@
if (sc->sc_softwake) {
sc->sc_softwake = 0;
- wakeup(&sc->sc_softwake);
+ /* wake up after 1 tick */
+ usb_callout(sc->sc_softintr_handle, 1,
+ uhci_softintr_do_wakeup, &sc->sc_softwake);
}
sc->sc_bus.intr_context--;
Index: uhcivar.h
===================================================================
RCS file: /local/cvsroot/src/sys/dev/usb/uhcivar.h,v
retrieving revision 1.33
diff -u -r1.33 uhcivar.h
--- uhcivar.h 7 Apr 2002 18:06:34 -0000 1.33
+++ uhcivar.h 9 May 2002 14:22:29 -0000
@@ -188,6 +188,8 @@
#endif
device_ptr_t sc_child; /* /dev/usb# device */
+
+ usb_callout_t sc_softintr_handle;
} uhci_softc_t;
usbd_status uhci_init(uhci_softc_t *);
---------------------------------------------------------------
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020511.001016.74758161.toshi>
