Module Name: src
Committed By: skrll
Date: Tue Jun 17 09:35:46 UTC 2014
Modified Files:
src/sys/dev/usb: uhidev.c uhidev.h
Log Message:
PR/48908: Cannot open /dev/uhid? when another report id at the same uhidev
was already opened.
Restore the sc reference counting lost in usbmp merge.
To generate a diff of this commit:
cvs rdiff -u -r1.59 -r1.60 src/sys/dev/usb/uhidev.c
cvs rdiff -u -r1.14 -r1.15 src/sys/dev/usb/uhidev.h
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/usb/uhidev.c
diff -u src/sys/dev/usb/uhidev.c:1.59 src/sys/dev/usb/uhidev.c:1.60
--- src/sys/dev/usb/uhidev.c:1.59 Thu Dec 26 15:32:48 2013
+++ src/sys/dev/usb/uhidev.c Tue Jun 17 09:35:46 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: uhidev.c,v 1.59 2013/12/26 15:32:48 christos Exp $ */
+/* $NetBSD: uhidev.c,v 1.60 2014/06/17 09:35:46 skrll Exp $ */
/*
* Copyright (c) 2001, 2012 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uhidev.c,v 1.59 2013/12/26 15:32:48 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uhidev.c,v 1.60 2014/06/17 09:35:46 skrll Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -545,6 +545,10 @@ uhidev_open(struct uhidev *scd)
return (EBUSY);
}
scd->sc_state |= UHIDEV_OPEN;
+ if (sc->sc_refcnt++) {
+ mutex_exit(&sc->sc_lock);
+ return (0);
+ }
mutex_exit(&sc->sc_lock);
if (sc->sc_isize == 0)
@@ -604,6 +608,7 @@ out1:
free(sc->sc_ibuf, M_USBDEV);
mutex_enter(&sc->sc_lock);
scd->sc_state &= ~UHIDEV_OPEN;
+ sc->sc_refcnt = 0;
sc->sc_ibuf = NULL;
sc->sc_ipipe = NULL;
sc->sc_opipe = NULL;
@@ -623,6 +628,10 @@ uhidev_close(struct uhidev *scd)
return;
}
scd->sc_state &= ~UHIDEV_OPEN;
+ if (--sc->sc_refcnt) {
+ mutex_exit(&sc->sc_lock);
+ return;
+ }
mutex_exit(&sc->sc_lock);
DPRINTF(("uhidev_close: close pipe\n"));
Index: src/sys/dev/usb/uhidev.h
diff -u src/sys/dev/usb/uhidev.h:1.14 src/sys/dev/usb/uhidev.h:1.15
--- src/sys/dev/usb/uhidev.h:1.14 Thu Sep 26 07:25:31 2013
+++ src/sys/dev/usb/uhidev.h Tue Jun 17 09:35:46 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: uhidev.h,v 1.14 2013/09/26 07:25:31 skrll Exp $ */
+/* $NetBSD: uhidev.h,v 1.15 2014/06/17 09:35:46 skrll Exp $ */
/*
* Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -53,6 +53,7 @@ struct uhidev_softc {
u_int sc_nrepid;
device_t *sc_subdevs;
+ int sc_refcnt;
u_char sc_dying;
kmutex_t sc_lock; /* protects writes to sc_state */