tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: power management and pseudo-devices



On Sun, Jul 18, 2010 at 12:35:31PM -0700, Paul Goyette wrote:
> (Resent, this time with attachment!)
> 
> On Sun, 18 Jul 2010, Quentin Garnier wrote:
> 
> >On Sun, Jul 18, 2010 at 07:14:57AM -0700, Paul Goyette wrote:
> >>Currently, pseudo-devices are silently attached to the device tree
> >>without giving the driver any access to the associated device_t
> >>structure.  As a result, the pseudo-device driver is unable to
> >>access much of the pmf framework.  In particular, the pseudo-device
> >>cannot register a suspend/resume/shutdown handler, nor can it
> >>register to receive pmf event notifications.
> >>
> >>It seems to me that it would be reasonably useful for pseudo-devices
> >>to be capabile of participating in pmf.  One particular example I've
> >>run into recently is the swwdog pseudo-device.  Other watchdog
> >>drivers can prevent a suspend if their timer is armed, but since
> >>swwdog is only a pseudo-device it cannot register a pmf handler.
> >
> >Convert it to a defpseudodev then.
> 
> I've done this, and it works!  Diffs attached.  Any objections to
> committing them?

Not really objections, just a few comments.

> +struct swwdog_softc *sc_swwdog = NULL;

That can't possibly be needed (and, if it was, you'd have to mutexify it
wouldn't you?).

> +
> +extern struct cfdriver swwdog_cd;

Include "ioconf.h" I think.

> +swwdogattach(int n)
>  {
> -     int i;
> +     int err;
> +     cfdata_t cf;
> +
> +     if (n > 1)
> +             aprint_verbose("%s: ignoring count of %d\n",
> +                 swwdog_cd.cd_name, n);
> +
> +     err = config_cfattach_attach(swwdog_cd.cd_name, &swwdog_ca);
> +     if (err) {
> +             aprint_error("%s: couldn't register cfattach: %d\n",
> +                 swwdog_cd.cd_name, err);
> +             config_cfdriver_detach(&swwdog_cd);
> +             return;
> +     }
> +
> +     cf = kmem_alloc(sizeof(struct cfdata), KM_NOSLEEP);
> +     if (cf == NULL)
> +             aprint_error("%s: couldn't allocate cfdata\n",
> +                 swwdog_cd.cd_name);
> +     else {
> +             cf->cf_name = swwdog_cd.cd_name;
> +             cf->cf_atname = swwdog_cd.cd_name;
> +             cf->cf_unit = 0;
> +             cf->cf_fstate = FSTATE_STAR;
>  
> -     for (i = 0; i < NSWWDOG; i++) {
> -             struct swwdog_softc *sc = &sc_wdog[i];
> +             (void)config_attach_pseudo(cf);

Ok, so you should be aware here that you're changing the logic of that
function, and you're only allowing for the creation of one swwdog(4).

That feature of the old code--implemented with needs-count no less,
brrr--is highly debatable, and the manual page actually says it's
pointless.

So yeah, go ahead and kill it (you can keep the __unused on int count by
the way), but change the manual page.

Also, you don't have to allocate a struct cfdata, you can use a static
one (indepedently of the fact that you only use it once, by the way, all
the other pseudo-devices could be changed in that respect).

> +static int
> +swwdog_match(device_t parent, cfdata_t data, void *aux)
> +{
> +     /* Match unless we already have a swwdog */
> +     if (sc_swwdog == NULL)
> +             return 1;
> +
> +     return 0;
> +}

What could possibly trigger another config_attach_pseudo?  I know that
config(9) is special, but not magic :-)

> +             if (!pmf_device_register(self, NULL, NULL))
> +                     aprint_error_dev(self, "couldn't establish power "
> +                         "handler\n");

So what was your initial point about swwdog(4) and pmf(9), anyway?

While you're there, I guess you could make swwdog_reboot a sysctl node.

-- 
Quentin Garnier - cube%cubidou.net@localhost - cube%NetBSD.org@localhost
"See the look on my face from staying too long in one place
[...] every time the morning breaks I know I'm closer to falling"
KT Tunstall, Saving My Face, Drastic Fantastic, 2007.

Attachment: pgp_VgmQNbymB.pgp
Description: PGP signature



Home | Main Index | Thread Index | Old Index