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 */

Reply via email to