From owner-svn-src-head@FreeBSD.ORG Mon Dec 5 16:08:18 2011 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B1613106564A; Mon, 5 Dec 2011 16:08:18 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id A14028FC12; Mon, 5 Dec 2011 16:08:18 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pB5G8IL3044250; Mon, 5 Dec 2011 16:08:18 GMT (envelope-from ed@svn.freebsd.org) Received: (from ed@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pB5G8IbS044248; Mon, 5 Dec 2011 16:08:18 GMT (envelope-from ed@svn.freebsd.org) Message-Id: <201112051608.pB5G8IbS044248@svn.freebsd.org> From: Ed Schouten Date: Mon, 5 Dec 2011 16:08:18 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r228283 - head/sys/x86/acpica X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 05 Dec 2011 16:08:18 -0000 Author: ed Date: Mon Dec 5 16:08:18 2011 New Revision: 228283 URL: http://svn.freebsd.org/changeset/base/228283 Log: Get rid of kludgy per-descriptor state handling in acpi_apm. Where i386/bios/apm.c requires no per-descriptor state, the ACPI version of these device do. Instead of using hackish clone lists that leave stale device nodes lying around, use the cdevpriv API. Modified: head/sys/x86/acpica/acpi_apm.c Modified: head/sys/x86/acpica/acpi_apm.c ============================================================================== --- head/sys/x86/acpica/acpi_apm.c Mon Dec 5 16:06:12 2011 (r228282) +++ head/sys/x86/acpica/acpi_apm.c Mon Dec 5 16:08:18 2011 (r228283) @@ -51,12 +51,10 @@ __FBSDID("$FreeBSD$"); #define APM_UNKNOWN 0xff static int apm_active; -static struct clonedevs *apm_clones; static MALLOC_DEFINE(M_APMDEV, "apmdev", "APM device emulation"); static d_open_t apmopen; -static d_close_t apmclose; static d_write_t apmwrite; static d_ioctl_t apmioctl; static d_poll_t apmpoll; @@ -71,9 +69,7 @@ static struct filterops apm_readfiltops static struct cdevsw apm_cdevsw = { .d_version = D_VERSION, - .d_flags = D_TRACKCLOSE | D_NEEDMINOR, .d_open = apmopen, - .d_close = apmclose, .d_write = apmwrite, .d_ioctl = apmioctl, .d_poll = apmpoll, @@ -202,39 +198,6 @@ acpi_capm_get_pwstatus(apm_pwstatus_t ap return (0); } -/* Create single-use devices for /dev/apm and /dev/apmctl. */ -static void -apm_clone(void *arg, struct ucred *cred, char *name, int namelen, - struct cdev **dev) -{ - int ctl_dev, unit; - - if (*dev != NULL) - return; - if (strcmp(name, "apmctl") == 0) - ctl_dev = TRUE; - else if (strcmp(name, "apm") == 0) - ctl_dev = FALSE; - else - return; - - /* Always create a new device and unit number. */ - unit = -1; - if (clone_create(&apm_clones, &apm_cdevsw, &unit, dev, 0)) { - if (ctl_dev) { - *dev = make_dev(&apm_cdevsw, unit, - UID_ROOT, GID_OPERATOR, 0660, "apmctl%d", unit); - } else { - *dev = make_dev(&apm_cdevsw, unit, - UID_ROOT, GID_OPERATOR, 0664, "apm%d", unit); - } - if (*dev != NULL) { - dev_ref(*dev); - (*dev)->si_flags |= SI_CHEAPCLONE; - } - } -} - /* Create a struct for tracking per-device suspend notification. */ static struct apm_clone_data * apm_create_clone(struct cdev *dev, struct acpi_softc *acpi_sc) @@ -263,30 +226,13 @@ apm_create_clone(struct cdev *dev, struc return (clone); } -static int -apmopen(struct cdev *dev, int flag, int fmt, struct thread *td) -{ - struct acpi_softc *acpi_sc; - struct apm_clone_data *clone; - - acpi_sc = devclass_get_softc(devclass_find("acpi"), 0); - clone = apm_create_clone(dev, acpi_sc); - dev->si_drv1 = clone; - - /* If the device is opened for write, record that. */ - if ((flag & FWRITE) != 0) - clone->flags |= ACPI_EVF_WRITE; - - return (0); -} - -static int -apmclose(struct cdev *dev, int flag, int fmt, struct thread *td) +static void +apmdtor(void *data) { struct apm_clone_data *clone; struct acpi_softc *acpi_sc; - clone = dev->si_drv1; + clone = data; acpi_sc = clone->acpi_sc; /* We are about to lose a reference so check if suspend should occur */ @@ -301,7 +247,22 @@ apmclose(struct cdev *dev, int flag, int knlist_destroy(&clone->sel_read.si_note); ACPI_UNLOCK(acpi); free(clone, M_APMDEV); - destroy_dev_sched(dev); +} + +static int +apmopen(struct cdev *dev, int flag, int fmt, struct thread *td) +{ + struct acpi_softc *acpi_sc; + struct apm_clone_data *clone; + + acpi_sc = devclass_get_softc(devclass_find("acpi"), 0); + clone = apm_create_clone(dev, acpi_sc); + devfs_set_cdevpriv(clone, apmdtor); + + /* If the device is opened for write, record that. */ + if ((flag & FWRITE) != 0) + clone->flags |= ACPI_EVF_WRITE; + return (0); } @@ -316,7 +277,7 @@ apmioctl(struct cdev *dev, u_long cmd, c apm_info_old_t aiop; error = 0; - clone = dev->si_drv1; + devfs_get_cdevpriv((void **)&clone); acpi_sc = clone->acpi_sc; switch (cmd) { @@ -430,8 +391,8 @@ apmpoll(struct cdev *dev, int events, st int revents; revents = 0; + devfs_get_cdevpriv((void **)&clone); ACPI_LOCK(acpi); - clone = dev->si_drv1; if (clone->acpi_sc->acpi_next_sstate) revents |= events & (POLLIN | POLLRDNORM); else @@ -445,8 +406,8 @@ apmkqfilter(struct cdev *dev, struct kno { struct apm_clone_data *clone; + devfs_get_cdevpriv((void **)&clone); ACPI_LOCK(acpi); - clone = dev->si_drv1; kn->kn_hook = clone; kn->kn_fop = &apm_readfiltops; knlist_add(&clone->sel_read.si_note, kn, 0); @@ -485,6 +446,7 @@ acpi_apm_init(struct acpi_softc *sc) /* Create a clone for /dev/acpi also. */ STAILQ_INIT(&sc->apm_cdevs); sc->acpi_clone = apm_create_clone(sc->acpi_dev_t, sc); - clone_setup(&apm_clones); - EVENTHANDLER_REGISTER(dev_clone, apm_clone, 0, 1000); + + make_dev(&apm_cdevsw, 0, UID_ROOT, GID_OPERATOR, 0660, "apmctl"); + make_dev(&apm_cdevsw, 0, UID_ROOT, GID_OPERATOR, 0664, "apm"); }