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
[EMAIL PROTECTED]
"The future just ain't what it used to be"
--- 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);

Reply via email to