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: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020212223659.GA2198>