From owner-freebsd-arch@FreeBSD.ORG Wed Sep 6 04:01:28 2006 Return-Path: X-Original-To: arch@freebsd.org Delivered-To: freebsd-arch@FreeBSD.ORG Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 3F36816A4DA for ; Wed, 6 Sep 2006 04:01:28 +0000 (UTC) (envelope-from imp@bsdimp.com) Received: from harmony.bsdimp.com (vc4-2-0-87.dsl.netrack.net [199.45.160.85]) by mx1.FreeBSD.org (Postfix) with ESMTP id A589D43D46 for ; Wed, 6 Sep 2006 04:01:27 +0000 (GMT) (envelope-from imp@bsdimp.com) Received: from localhost (localhost.village.org [127.0.0.1] (may be forged)) by harmony.bsdimp.com (8.13.4/8.13.4) with ESMTP id k8641I5l019022 for ; Tue, 5 Sep 2006 22:01:18 -0600 (MDT) (envelope-from imp@bsdimp.com) Date: Tue, 05 Sep 2006 22:01:37 -0600 (MDT) Message-Id: <20060905.220137.1973602740.imp@bsdimp.com> To: arch@freebsd.org From: "M. Warner Losh" In-Reply-To: <20060905.215047.-494097326.imp@bsdimp.com> References: <20060905.215047.-494097326.imp@bsdimp.com> X-Mailer: Mew version 4.2 on Emacs 21.3 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Multipart/Mixed; boundary="--Next_Part(Tue_Sep__5_22_01_37_2006_642)--" Content-Transfer-Encoding: 7bit X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-2.0 (harmony.bsdimp.com [127.0.0.1]); Tue, 05 Sep 2006 22:01:19 -0600 (MDT) Cc: Subject: Re: USB changes X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 06 Sep 2006 04:01:28 -0000 ----Next_Part(Tue_Sep__5_22_01_37_2006_642)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit In message: <20060905.215047.-494097326.imp@bsdimp.com> "M. Warner Losh" writes: : The time has come to reduce the #ifdefs that have grown to infest the : usb code. The other BSDs have already done this to a greater or : lessor extent. Many of the #ifdef sections have decayed and no longer : work on the target system. There's been a number of cases where bugs : have resulted, and they generally make the code harder to read and : understand. : : I'd like to remove many of the ifdefs, as well as expand many of the : portability hacks that are there. I'll do my best to make sure that : each of the changes bring the files closer to style(9) as well as not : change the md5 of the .o file. : : Comments? Here's ugen.c that I've partially converted that retains the same md5 for ugen.o when compiled as a module. Warner ----Next_Part(Tue_Sep__5_22_01_37_2006_642)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="ugen.diff" Index: ugen.c =================================================================== RCS file: /cache/ncvs/src/sys/dev/usb/ugen.c,v retrieving revision 1.106 diff -u -r1.106 ugen.c --- ugen.c 5 Jun 2006 14:44:39 -0000 1.106 +++ ugen.c 6 Sep 2006 03:57:03 -0000 @@ -52,24 +52,15 @@ #include #include #include -#if defined(__NetBSD__) || defined(__OpenBSD__) -#include -#include -#elif defined(__FreeBSD__) #include #include #include #include #include #include -#endif #include #include -#if __FreeBSD_version >= 500014 #include -#else -#include -#endif #include #include #include @@ -100,9 +91,7 @@ struct ugen_endpoint { struct ugen_softc *sc; -#if defined(__FreeBSD__) struct cdev *dev; -#endif usb_endpoint_descriptor_t *edesc; usbd_interface_handle iface; int state; @@ -127,16 +116,13 @@ struct ugen_softc { USBBASEDEVICE sc_dev; /* base device */ usbd_device_handle sc_udev; -#if defined(__FreeBSD__) struct cdev *dev; -#endif char sc_is_open[USB_MAX_ENDPOINTS]; struct ugen_endpoint sc_endpoints[USB_MAX_ENDPOINTS][2]; #define OUT 0 #define IN 1 -#ifdef __FreeBSD__ #define UGEN_DEV_REF(dev, sc) \ if ((sc)->sc_dying || dev_refthread(dev) == NULL) \ return (ENXIO) @@ -146,26 +132,9 @@ /* handled by dev layer */ #define UGEN_DEV_CLOSE(dev, sc) \ /* handled by dev layer */ -#else - int sc_refcnt; -#define UGEN_DEV_REF(dev, sc) \ - if ((sc)->sc_dying) \ - return (ENXIO); \ - (sc)->sc_refcnt++ -#define UGEN_DEV_RELE(dev, sc) \ - if (--(sc)->sc_refcnt < 0) \ - usb_detach_wakeup(USBDEV((sc)->sc_dev)) -#define UGEN_DEV_OPEN(dev, sc) \ - (sc)->sc_refcnt++ -#define UGEN_DEV_CLOSE(dev, sc) \ - UGEN_DEV_RELE(dev, sc) -#endif u_char sc_dying; }; -#if defined(__NetBSD__) || defined(__OpenBSD__) -cdev_decl(ugen); -#elif defined(__FreeBSD__) d_open_t ugenopen; d_close_t ugenclose; d_read_t ugenread; @@ -174,7 +143,7 @@ d_poll_t ugenpoll; d_purge_t ugenpurge; -Static struct cdevsw ugenctl_cdevsw = { +static struct cdevsw ugenctl_cdevsw = { .d_version = D_VERSION, .d_flags = D_NEEDGIANT, .d_open = ugenopen, @@ -182,12 +151,9 @@ .d_ioctl = ugenioctl, .d_purge = ugenpurge, .d_name = "ugenctl", -#if __FreeBSD_version < 500014 - .d_bmaj -1 -#endif }; -Static struct cdevsw ugen_cdevsw = { +static struct cdevsw ugen_cdevsw = { .d_version = D_VERSION, .d_flags = D_NEEDGIANT, .d_open = ugenopen, @@ -198,29 +164,23 @@ .d_poll = ugenpoll, .d_purge = ugenpurge, .d_name = "ugen", -#if __FreeBSD_version < 500014 - .d_bmaj -1 -#endif }; -#endif -Static void ugenintr(usbd_xfer_handle xfer, usbd_private_handle addr, +static void ugenintr(usbd_xfer_handle xfer, usbd_private_handle addr, usbd_status status); -Static void ugen_isoc_rintr(usbd_xfer_handle xfer, usbd_private_handle addr, +static void ugen_isoc_rintr(usbd_xfer_handle xfer, usbd_private_handle addr, usbd_status status); -Static int ugen_do_read(struct ugen_softc *, int, struct uio *, int); -Static int ugen_do_write(struct ugen_softc *, int, struct uio *, int); -Static int ugen_do_ioctl(struct ugen_softc *, int, u_long, +static int ugen_do_read(struct ugen_softc *, int, struct uio *, int); +static int ugen_do_write(struct ugen_softc *, int, struct uio *, int); +static int ugen_do_ioctl(struct ugen_softc *, int, u_long, caddr_t, int, usb_proc_ptr); -#if defined(__FreeBSD__) -Static void ugen_make_devnodes(struct ugen_softc *sc); -Static void ugen_destroy_devnodes(struct ugen_softc *sc); -#endif -Static int ugen_set_config(struct ugen_softc *sc, int configno); -Static usb_config_descriptor_t *ugen_get_cdesc(struct ugen_softc *sc, +static void ugen_make_devnodes(struct ugen_softc *sc); +static void ugen_destroy_devnodes(struct ugen_softc *sc); +static int ugen_set_config(struct ugen_softc *sc, int configno); +static usb_config_descriptor_t *ugen_get_cdesc(struct ugen_softc *sc, int index, int *lenp); -Static usbd_status ugen_set_interface(struct ugen_softc *, int, int); -Static int ugen_get_alt_index(struct ugen_softc *sc, int ifaceidx); +static usbd_status ugen_set_interface(struct ugen_softc *, int, int); +static int ugen_get_alt_index(struct ugen_softc *sc, int ifaceidx); #define UGENUNIT(n) ((minor(n) >> 4) & 0xf) #define UGENENDPOINT(n) (minor(n) & 0xf) @@ -276,13 +236,11 @@ USB_ATTACH_ERROR_RETURN; } -#if defined(__FreeBSD__) /* the main device, ctrl endpoint */ sc->dev = make_dev(&ugenctl_cdevsw, UGENMINOR(USBDEVUNIT(sc->sc_dev), 0), UID_ROOT, GID_OPERATOR, 0644, "%s", USBDEVNAME(sc->sc_dev)); ugen_make_devnodes(sc); -#endif usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH, sc->sc_udev, USBDEV(sc->sc_dev)); @@ -290,8 +248,7 @@ USB_ATTACH_SUCCESS_RETURN; } -#if defined(__FreeBSD__) -Static void +static void ugen_make_devnodes(struct ugen_softc *sc) { int endptno; @@ -322,7 +279,7 @@ } } -Static void +static void ugen_destroy_devnodes(struct ugen_softc *sc) { int endptno, prev_sc_dying; @@ -358,9 +315,8 @@ } sc->sc_dying = prev_sc_dying; } -#endif -Static int +static int ugen_set_config(struct ugen_softc *sc, int configno) { usbd_device_handle dev = sc->sc_udev; @@ -433,9 +389,7 @@ } } -#if defined(__FreeBSD__) ugen_destroy_devnodes(sc); -#endif /* now we can clear the old interface's ugen_endpoints */ for(ifaceno = 0; ifaceno < niface_cache; ifaceno++) { @@ -698,7 +652,7 @@ return (0); } -Static int +static int ugen_do_read(struct ugen_softc *sc, int endpt, struct uio *uio, int flag) { struct ugen_endpoint *sce = &sc->sc_endpoints[endpt][IN]; @@ -858,7 +812,7 @@ return (error); } -Static int +static int ugen_do_write(struct ugen_softc *sc, int endpt, struct uio *uio, int flag) { struct ugen_endpoint *sce = &sc->sc_endpoints[endpt][OUT]; @@ -962,25 +916,6 @@ return (error); } -#if defined(__NetBSD__) || defined(__OpenBSD__) -int -ugen_activate(device_ptr_t self, enum devact act) -{ - struct ugen_softc *sc = (struct ugen_softc *)self; - - switch (act) { - case DVACT_ACTIVATE: - return (EOPNOTSUPP); - - case DVACT_DEACTIVATE: - sc->sc_dying = 1; - break; - } - return (0); -} -#endif - -#ifdef __FreeBSD__ void ugenpurge(struct cdev *dev) { @@ -1009,22 +944,14 @@ } selwakeuppri(&sce->rsel, PZERO); } -#endif USB_DETACH(ugen) { USB_DETACH_START(ugen, sc); struct ugen_endpoint *sce; int i, dir; -#if defined(__NetBSD__) || defined(__OpenBSD__) - int maj, mn, c, s; -#endif -#if defined(__NetBSD__) || defined(__OpenBSD__) - DPRINTF(("ugen_detach: sc=%p flags=%d\n", sc, flags)); -#elif defined(__FreeBSD__) DPRINTF(("ugen_detach: sc=%p\n", sc)); -#endif sc->sc_dying = 1; /* Abort all pipes. Causes processes waiting for transfer to wake. */ @@ -1037,41 +964,8 @@ } } -#if defined(__NetBSD__) || defined(__OpenBSD__) - s = splusb(); - if (sc->sc_refcnt > 0) { - /* Wake everyone */ - for (i = 0; i < USB_MAX_ENDPOINTS; i++) - wakeup(&sc->sc_endpoints[i][IN]); - /* Wait for processes to go away. */ - while (sc->sc_refcnt > 0) - usb_detach_wait(USBDEV(sc->sc_dev)); - } - splx(s); - - /* Wait for opens to go away. */ - do { - c = 0; - for (i = 0; i < USB_MAX_ENDPOINTS; i++) { - if (sc->sc_is_open[i]) - c++; - } - if (c != 0) - tsleep(&sc->sc_dying, PZERO, "ugendr", hz); - } while (c != 0); - - /* locate the major number */ - for (maj = 0; maj < nchrdev; maj++) - if (cdevsw[maj].d_open == ugenopen) - break; - - /* 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__) /* destroy the device for the control endpoint */ destroy_dev(sc->dev); -#endif usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev, USBDEV(sc->sc_dev)); @@ -1079,7 +973,7 @@ return (0); } -Static void +static void ugenintr(usbd_xfer_handle xfer, usbd_private_handle addr, usbd_status status) { struct ugen_endpoint *sce = addr; @@ -1115,7 +1009,7 @@ selwakeuppri(&sce->rsel, PZERO); } -Static void +static void ugen_isoc_rintr(usbd_xfer_handle xfer, usbd_private_handle addr, usbd_status status) { @@ -1174,7 +1068,7 @@ selwakeuppri(&sce->rsel, PZERO); } -Static usbd_status +static usbd_status ugen_set_interface(struct ugen_softc *sc, int ifaceidx, int altno) { usbd_interface_handle iface; @@ -1222,10 +1116,8 @@ if (err) panic("ugen_set_interface: endpoint count failed"); -#if defined(__FreeBSD__) /* destroy the existing devices, we remake the new ones in a moment */ ugen_destroy_devnodes(sc); -#endif /* now we can clear the old interface's ugen_endpoints */ for (endptno = 0; endptno < nendpt_cache; endptno++) { @@ -1247,16 +1139,14 @@ sce->iface = iface; } -#if defined(__FreeBSD__) /* make the new devices */ ugen_make_devnodes(sc); -#endif return (0); } /* Retrieve a complete descriptor for a certain device and index. */ -Static usb_config_descriptor_t * +static usb_config_descriptor_t * ugen_get_cdesc(struct ugen_softc *sc, int index, int *lenp) { usb_config_descriptor_t *cdesc, *tdesc, cdescr; @@ -1289,7 +1179,7 @@ return (cdesc); } -Static int +static int ugen_get_alt_index(struct ugen_softc *sc, int ifaceidx) { usbd_interface_handle iface; @@ -1301,7 +1191,7 @@ return (usbd_get_interface_altindex(iface)); } -Static int +static int ugen_do_ioctl(struct ugen_softc *sc, int endpt, u_long cmd, caddr_t addr, int flag, usb_proc_ptr p) { @@ -1374,9 +1264,7 @@ err = ugen_set_config(sc, *(int *)addr); switch (err) { case USBD_NORMAL_COMPLETION: -#if defined(__FreeBSD__) ugen_make_devnodes(sc); -#endif break; case USBD_IN_USE: return (EBUSY); @@ -1666,6 +1554,4 @@ return (revents); } -#if defined(__FreeBSD__) DRIVER_MODULE(ugen, uhub, ugen_driver, ugen_devclass, usbd_driver_load, 0); -#endif ----Next_Part(Tue_Sep__5_22_01_37_2006_642)----