Module Name:    src
Committed By:   martin
Date:           Tue May  7 18:47:01 UTC 2019

Modified Files:
        src/sys/dev/usb [netbsd-8]: ucom.c umodem_common.c umodemvar.h

Log Message:
Backout the following changes (requested by mrg in ticket #1240):

        sys/dev/usb/umodem_common.c: revision 1.27
        sys/dev/usb/umodemvar.h: revision 1.10
        sys/dev/usb/ucom.c: revision 1.122

fix umodem(4) detach.
There are different fixes upcoming.


To generate a diff of this commit:
cvs rdiff -u -r1.118.8.3 -r1.118.8.4 src/sys/dev/usb/ucom.c
cvs rdiff -u -r1.25.8.1 -r1.25.8.2 src/sys/dev/usb/umodem_common.c
cvs rdiff -u -r1.9.10.1 -r1.9.10.2 src/sys/dev/usb/umodemvar.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/ucom.c
diff -u src/sys/dev/usb/ucom.c:1.118.8.3 src/sys/dev/usb/ucom.c:1.118.8.4
--- src/sys/dev/usb/ucom.c:1.118.8.3	Mon Apr 22 08:17:50 2019
+++ src/sys/dev/usb/ucom.c	Tue May  7 18:47:01 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: ucom.c,v 1.118.8.3 2019/04/22 08:17:50 martin Exp $	*/
+/*	$NetBSD: ucom.c,v 1.118.8.4 2019/05/07 18:47:01 martin Exp $	*/
 
 /*
  * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ucom.c,v 1.118.8.3 2019/04/22 08:17:50 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ucom.c,v 1.118.8.4 2019/05/07 18:47:01 martin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -441,8 +441,10 @@ ucom_detach(device_t self, int flags)
 			mutex_spin_exit(&tty_lock);
 		}
 		/* Wait for processes to go away. */
-		if (cv_timedwait(&sc->sc_detachcv, &sc->sc_lock, hz * 60))
-			aprint_error_dev(self, ": didn't detach\n");
+		if (cv_timedwait(&sc->sc_detachcv, &sc->sc_lock, hz * 60)) {
+			printf("%s: %s didn't detach\n", __func__,
+			    device_xname(sc->sc_dev));
+		}
 	}
 
 	softint_disestablish(sc->sc_si);
@@ -1269,9 +1271,7 @@ ucomhwiflow(struct tty *tp, int block)
 
 	if (old && !block) {
 		sc->sc_rx_unblock = 1;
-		kpreempt_disable();
 		softint_schedule(sc->sc_si);
-		kpreempt_enable();
 	}
 	mutex_exit(&sc->sc_lock);
 
@@ -1339,9 +1339,7 @@ ucomstart(struct tty *tp)
 
 	SIMPLEQ_INSERT_TAIL(&sc->sc_obuff_full, ub, ub_link);
 
-	kpreempt_disable();
 	softint_schedule(sc->sc_si);
-	kpreempt_enable();
 
  out:
 	DPRINTF("... done", 0, 0, 0, 0);
@@ -1383,9 +1381,7 @@ ucom_write_status(struct ucom_softc *sc,
 		break;
 	case USBD_STALLED:
 		ub->ub_index = 0;
-		kpreempt_disable();
 		softint_schedule(sc->sc_si);
-		kpreempt_enable();
 		break;
 	case USBD_NORMAL_COMPLETION:
 		usbd_get_xfer_status(ub->ub_xfer, NULL, NULL, &cc, NULL);

Index: src/sys/dev/usb/umodem_common.c
diff -u src/sys/dev/usb/umodem_common.c:1.25.8.1 src/sys/dev/usb/umodem_common.c:1.25.8.2
--- src/sys/dev/usb/umodem_common.c:1.25.8.1	Mon Apr 22 08:17:50 2019
+++ src/sys/dev/usb/umodem_common.c	Tue May  7 18:47:01 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: umodem_common.c,v 1.25.8.1 2019/04/22 08:17:50 martin Exp $	*/
+/*	$NetBSD: umodem_common.c,v 1.25.8.2 2019/05/07 18:47:01 martin Exp $	*/
 
 /*
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -44,7 +44,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: umodem_common.c,v 1.25.8.1 2019/04/22 08:17:50 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: umodem_common.c,v 1.25.8.2 2019/05/07 18:47:01 martin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -94,16 +94,16 @@ int	umodemdebug = 0;
 #define UMODEMIBUFSIZE 4096
 #define UMODEMOBUFSIZE 4096
 
-static usbd_status umodem_set_comm_feature(struct umodem_softc *,
+Static usbd_status umodem_set_comm_feature(struct umodem_softc *,
 					   int, int);
-static usbd_status umodem_set_line_coding(struct umodem_softc *,
+Static usbd_status umodem_set_line_coding(struct umodem_softc *,
 					  usb_cdc_line_state_t *);
 
-static void	umodem_dtr(struct umodem_softc *, int);
-static void	umodem_rts(struct umodem_softc *, int);
-static void	umodem_break(struct umodem_softc *, int);
-static void	umodem_set_line_state(struct umodem_softc *);
-static void	umodem_intr(struct usbd_xfer *, void *, usbd_status);
+Static void	umodem_dtr(struct umodem_softc *, int);
+Static void	umodem_rts(struct umodem_softc *, int);
+Static void	umodem_break(struct umodem_softc *, int);
+Static void	umodem_set_line_state(struct umodem_softc *);
+Static void	umodem_intr(struct usbd_xfer *, void *, usbd_status);
 
 int
 umodem_common_attach(device_t self, struct umodem_softc *sc,
@@ -120,15 +120,10 @@ umodem_common_attach(device_t self, stru
 	sc->sc_dev = self;
 	sc->sc_udev = dev;
 	sc->sc_ctl_iface = uiaa->uiaa_iface;
-	sc->sc_refcnt = 0;
-	sc->sc_dying = false;
 
 	aprint_naive("\n");
 	aprint_normal("\n");
 
-	mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTUSB);
-	cv_init(&sc->sc_detach_cv, "umodemdet");
-
 	id = usbd_get_interface_descriptor(sc->sc_ctl_iface);
 	devinfop = usbd_devinfo_alloc(uiaa->uiaa_device, 0);
 	aprint_normal_dev(self, "%s, iclass %d/%d\n",
@@ -261,7 +256,7 @@ umodem_common_attach(device_t self, stru
 	return 0;
 
  bad:
-	sc->sc_dying = true;
+	sc->sc_dying = 1;
 	return 1;
 }
 
@@ -271,15 +266,6 @@ umodem_open(void *addr, int portno)
 	struct umodem_softc *sc = addr;
 	int err;
 
-	mutex_enter(&sc->sc_lock);
-	if (sc->sc_dying) {
-		mutex_exit(&sc->sc_lock);
-		return EIO;
-	}
-
-	sc->sc_refcnt++;
-	mutex_exit(&sc->sc_lock);
-
 	DPRINTF(("umodem_open: sc=%p\n", sc));
 
 	if (sc->sc_ctl_notify != -1 && sc->sc_notify_pipe == NULL) {
@@ -291,10 +277,6 @@ umodem_open(void *addr, int portno)
 		if (err) {
 			DPRINTF(("Failed to establish notify pipe: %s\n",
 				usbd_errstr(err)));
-			mutex_enter(&sc->sc_lock);
-			if (--sc->sc_refcnt < 0)
-				cv_broadcast(&sc->sc_detach_cv);
-			mutex_exit(&sc->sc_lock);
 			return EIO;
 		}
 	}
@@ -308,11 +290,6 @@ umodem_close(void *addr, int portno)
 	struct umodem_softc *sc = addr;
 	int err;
 
-	mutex_enter(&sc->sc_lock);
-	if (sc->sc_dying)
-		goto out;
-	mutex_exit(&sc->sc_lock);
-
 	DPRINTF(("umodem_close: sc=%p\n", sc));
 
 	if (sc->sc_notify_pipe != NULL) {
@@ -326,15 +303,9 @@ umodem_close(void *addr, int portno)
 			    device_xname(sc->sc_dev), usbd_errstr(err));
 		sc->sc_notify_pipe = NULL;
 	}
-
-	mutex_enter(&sc->sc_lock);
-out:
-	if (--sc->sc_refcnt < 0)
-		cv_broadcast(&sc->sc_detach_cv);
-	mutex_exit(&sc->sc_lock);
 }
 
-static void
+Static void
 umodem_intr(struct usbd_xfer *xfer, void *priv,
     usbd_status status)
 {
@@ -467,11 +438,6 @@ umodem_param(void *addr, int portno, str
 	usbd_status err;
 	usb_cdc_line_state_t ls;
 
-	mutex_enter(&sc->sc_lock);
-	if (sc->sc_dying)
-		return EIO;
-	mutex_exit(&sc->sc_lock);
-
 	DPRINTF(("umodem_param: sc=%p\n", sc));
 
 	USETDW(ls.dwDTERate, t->c_ospeed);
@@ -516,10 +482,8 @@ umodem_ioctl(void *addr, int portno, u_l
 	struct umodem_softc *sc = addr;
 	int error = 0;
 
-	mutex_enter(&sc->sc_lock);
 	if (sc->sc_dying)
 		return EIO;
-	mutex_exit(&sc->sc_lock);
 
 	DPRINTF(("umodem_ioctl: cmd=0x%08lx\n", cmd));
 
@@ -543,7 +507,7 @@ umodem_ioctl(void *addr, int portno, u_l
 	return error;
 }
 
-static void
+void
 umodem_dtr(struct umodem_softc *sc, int onoff)
 {
 	DPRINTF(("umodem_dtr: onoff=%d\n", onoff));
@@ -555,7 +519,7 @@ umodem_dtr(struct umodem_softc *sc, int 
 	umodem_set_line_state(sc);
 }
 
-static void
+void
 umodem_rts(struct umodem_softc *sc, int onoff)
 {
 	DPRINTF(("umodem_rts: onoff=%d\n", onoff));
@@ -567,7 +531,7 @@ umodem_rts(struct umodem_softc *sc, int 
 	umodem_set_line_state(sc);
 }
 
-static void
+void
 umodem_set_line_state(struct umodem_softc *sc)
 {
 	usb_device_request_t req;
@@ -585,7 +549,7 @@ umodem_set_line_state(struct umodem_soft
 
 }
 
-static void
+void
 umodem_break(struct umodem_softc *sc, int onoff)
 {
 	usb_device_request_t req;
@@ -609,11 +573,6 @@ umodem_set(void *addr, int portno, int r
 {
 	struct umodem_softc *sc = addr;
 
-	mutex_enter(&sc->sc_lock);
-	if (sc->sc_dying)
-		return;
-	mutex_exit(&sc->sc_lock);
-
 	switch (reg) {
 	case UCOM_SET_DTR:
 		umodem_dtr(sc, onoff);
@@ -629,7 +588,7 @@ umodem_set(void *addr, int portno, int r
 	}
 }
 
-static usbd_status
+usbd_status
 umodem_set_line_coding(struct umodem_softc *sc, usb_cdc_line_state_t *state)
 {
 	usb_device_request_t req;
@@ -662,7 +621,7 @@ umodem_set_line_coding(struct umodem_sof
 	return USBD_NORMAL_COMPLETION;
 }
 
-static usbd_status
+usbd_status
 umodem_set_comm_feature(struct umodem_softc *sc, int feature, int state)
 {
 	usb_device_request_t req;
@@ -694,9 +653,7 @@ umodem_common_activate(struct umodem_sof
 {
 	switch (act) {
 	case DVACT_DEACTIVATE:
-		mutex_enter(&sc->sc_lock);
-		sc->sc_dying = true;
-		mutex_exit(&sc->sc_lock);
+		sc->sc_dying = 1;
 		return 0;
 	default:
 		return EOPNOTSUPP;
@@ -717,23 +674,12 @@ umodem_common_detach(struct umodem_softc
 
 	DPRINTF(("umodem_common_detach: sc=%p flags=%d\n", sc, flags));
 
-	mutex_enter(&sc->sc_lock);
-	sc->sc_dying = true;
-
-	sc->sc_refcnt--;
-	while (sc->sc_refcnt > 0) {
-		if (cv_timedwait(&sc->sc_detach_cv, &sc->sc_lock, hz * 60))
-			aprint_error_dev(sc->sc_dev, ": didn't detach\n");
-	}
-	mutex_exit(&sc->sc_lock);
+	sc->sc_dying = 1;
 
 	if (sc->sc_subdev != NULL)
 		rv = config_detach(sc->sc_subdev, flags);
 
 	usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev, sc->sc_dev);
 
-	mutex_destroy(&sc->sc_lock);
-	cv_destroy(&sc->sc_detach_cv);
-
 	return rv;
 }

Index: src/sys/dev/usb/umodemvar.h
diff -u src/sys/dev/usb/umodemvar.h:1.9.10.1 src/sys/dev/usb/umodemvar.h:1.9.10.2
--- src/sys/dev/usb/umodemvar.h:1.9.10.1	Mon Apr 22 08:17:50 2019
+++ src/sys/dev/usb/umodemvar.h	Tue May  7 18:47:01 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: umodemvar.h,v 1.9.10.1 2019/04/22 08:17:50 martin Exp $	*/
+/*	$NetBSD: umodemvar.h,v 1.9.10.2 2019/05/07 18:47:01 martin Exp $	*/
 
 /*
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -51,11 +51,8 @@ struct umodem_softc {
 
 	device_t		sc_subdev;	/* ucom device */
 
-	bool			sc_dying;	/* disconnecting */
-
-	kmutex_t		sc_lock;
-	kcondvar_t		sc_detach_cv;
-	int			sc_refcnt;
+	u_char			sc_opening;	/* lock during open */
+	u_char			sc_dying;	/* disconnecting */
 
 	int			sc_ctl_notify;	/* Notification endpoint */
 	struct usbd_pipe *	sc_notify_pipe; /* Notification pipe */

Reply via email to