Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 12 Feb 2002 22:36:59 +0000
From:      David Taylor <davidt@yadt.co.uk>
To:        freebsd-current@freebsd.org
Subject:   Re: urio driver
Message-ID:  <20020212223659.GA2198@gattaca.yadt.co.uk>
In-Reply-To: <20020212195135.GA746@gattaca.yadt.co.uk>
References:  <20020212195135.GA746@gattaca.yadt.co.uk>

Next in thread | Previous in thread | Raw E-Mail | Index | Archive | Help

--SLDf9lqlvOQaIe6s
Content-Type: text/plain; charset=iso-8859-15
Content-Disposition: inline

On Tue, 12 Feb 2002, David Taylor wrote:
> I have approximately no experience with FreeBSD device drivers, but I'm
> currently attempting to see if I can figure out how the other u*.c files
> handle detaching... any hints would be appreciated :)
> 

Well.  I managed to create a patch which _works_.  I have some serious
doubts about its correctness, however.

-- 
David Taylor
davidt@yadt.co.uk
"The future just ain't what it used to be"

--SLDf9lqlvOQaIe6s
Content-Type: text/plain; charset=iso-8859-15
Content-Disposition: attachment; filename="urio.c.hack"

--- urio.c.old	Tue Feb 12 22:31:14 2002
+++ urio.c	Tue Feb 12 22:02:03 2002
@@ -160,6 +160,8 @@
 	int sc_refcnt;
 #if defined(__NetBSD__) || defined(__OpenBSD__)
 	u_char sc_dying;
+#elif defined(__FreeBSD__)
+        dev_t dev;
 #endif
 };
 
@@ -271,8 +273,7 @@
 
 #if defined(__FreeBSD__)
  #if (__FreeBSD__ >= 4)
-	/* XXX no error trapping, no storing of dev_t */
-	(void) make_dev(&urio_cdevsw, device_get_unit(self),
+	sc->dev = make_dev(&urio_cdevsw, device_get_unit(self),
 			UID_ROOT, GID_OPERATOR,
 			0644, "urio%d", device_get_unit(self));
  #endif
@@ -633,22 +634,25 @@
 	}
 	return (0);
 }
+#endif
 
 USB_DETACH(urio)
 {
 	USB_DETACH_START(urio, sc);
-	struct urio_endpoint *sce;
-	int i, dir;
-	int s;
+	struct vnode *vp;
+
 #if defined(__NetBSD__) || defined(__OpenBSD__)
-	int maj, mn;
+	struct urio_endpoit *sce;
+	int i, dir;
+	int s;
+	int maj, mn;
 
 	DPRINTF(("urio_detach: sc=%p flags=%d\n", sc, flags));
+	sc->sc_dying = 1;
 #elif defined(__FreeBSD__)
 	DPRINTF(("urio_detach: sc=%p\n", sc));
 #endif
 
-	sc->sc_dying = 1;
 	/* Abort all pipes.  Causes processes waiting for transfer to wake. */
 #if 0
 	for (i = 0; i < USB_MAX_ENDPOINTS; i++) {
@@ -668,7 +672,7 @@
 		usb_detach_wait(USBDEV(sc->sc_dev));
 	}
 	splx(s);
-#else
+/* #else */
 	if (sc->sc_pipeh_in) 
 		usbd_abort_pipe(sc->sc_pipeh_in);	
 
@@ -692,25 +696,20 @@
 	/* Nuke the vnodes for any open instances (calls close). */
 	mn = self->dv_unit * USB_MAX_ENDPOINTS;
 	vdevgone(maj, mn, mn + USB_MAX_ENDPOINTS - 1, VCHR);
-#elif defined(__FreeBSD__)
-	/* XXX not implemented yet */
-#endif
 
-	usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev,
-			   USBDEV(sc->sc_dev));
+	usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev,
+			   USBDEV(sc->sc_dev));
+#elif defined(__FreeBSD__)
+	device_set_desc(self, NULL);
+	vp = SLIST_FIRST(&sc->dev->si_hlist);
+	if (vp)
+		VOP_REVOKE(vp, REVOKEALL);
 
-	return (0);
+	destroy_dev(sc->dev);
+#endif
+	return (0);
 }
-#endif /* defined(__NetBSD__) || defined(__OpenBSD__) */
-
 #if defined(__FreeBSD__)
-Static int
-urio_detach(device_t self)
-{       
-	DPRINTF(("%s: disconnected\n", USBDEVNAME(self)));
-	device_set_desc(self, NULL);
-	return 0;
-}
 
 #if (__FreeBSD__ >= 4)
 DRIVER_MODULE(urio, uhub, urio_driver, urio_devclass, usbd_driver_load, 0);

--SLDf9lqlvOQaIe6s--

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <http://docs.FreeBSD.org/cgi/mid.cgi?20020212223659.GA2198>