Power hook for ath pci front end.
Written and tested by George Michaelson [ggm at apnic.net]
This commit is contained in:
parent
aab3cbfbad
commit
97da3b129c
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: if_ath_pci.c,v 1.13 2006/06/05 05:15:31 gdamore Exp $ */
|
/* $NetBSD: if_ath_pci.c,v 1.14 2006/06/20 14:38:34 perry Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
|
* Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
|
||||||
@ -41,7 +41,7 @@
|
|||||||
__FBSDID("$FreeBSD: src/sys/dev/ath/if_ath_pci.c,v 1.11 2005/01/18 18:08:16 sam Exp $");
|
__FBSDID("$FreeBSD: src/sys/dev/ath/if_ath_pci.c,v 1.11 2005/01/18 18:08:16 sam Exp $");
|
||||||
#endif
|
#endif
|
||||||
#ifdef __NetBSD__
|
#ifdef __NetBSD__
|
||||||
__KERNEL_RCSID(0, "$NetBSD: if_ath_pci.c,v 1.13 2006/06/05 05:15:31 gdamore Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: if_ath_pci.c,v 1.14 2006/06/20 14:38:34 perry Exp $");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -91,6 +91,8 @@ __KERNEL_RCSID(0, "$NetBSD: if_ath_pci.c,v 1.13 2006/06/05 05:15:31 gdamore Exp
|
|||||||
struct ath_pci_softc {
|
struct ath_pci_softc {
|
||||||
struct ath_softc sc_sc;
|
struct ath_softc sc_sc;
|
||||||
pci_chipset_tag_t sc_pc;
|
pci_chipset_tag_t sc_pc;
|
||||||
|
pcitag_t sc_pcitag;
|
||||||
|
struct pci_conf_state sc_pciconf;
|
||||||
void *sc_ih; /* interrupt handler */
|
void *sc_ih; /* interrupt handler */
|
||||||
bus_space_tag_t sc_iot;
|
bus_space_tag_t sc_iot;
|
||||||
bus_space_handle_t sc_ioh;
|
bus_space_handle_t sc_ioh;
|
||||||
@ -103,6 +105,7 @@ struct ath_pci_softc {
|
|||||||
static int ath_pci_match(struct device *, struct cfdata *, void *);
|
static int ath_pci_match(struct device *, struct cfdata *, void *);
|
||||||
static void ath_pci_attach(struct device *, struct device *, void *);
|
static void ath_pci_attach(struct device *, struct device *, void *);
|
||||||
static void ath_pci_shutdown(void *);
|
static void ath_pci_shutdown(void *);
|
||||||
|
static void ath_pci_powerhook(int, void *);
|
||||||
static int ath_pci_detach(struct device *, int);
|
static int ath_pci_detach(struct device *, int);
|
||||||
|
|
||||||
CFATTACH_DECL(ath_pci,
|
CFATTACH_DECL(ath_pci,
|
||||||
@ -165,11 +168,14 @@ ath_pci_attach(struct device *parent, struct device *self, void *aux)
|
|||||||
struct pci_attach_args *pa = aux;
|
struct pci_attach_args *pa = aux;
|
||||||
pci_chipset_tag_t pc = pa->pa_pc;
|
pci_chipset_tag_t pc = pa->pa_pc;
|
||||||
pci_intr_handle_t ih;
|
pci_intr_handle_t ih;
|
||||||
void *hook;
|
void *shook;
|
||||||
|
void *phook;
|
||||||
const char *intrstr = NULL;
|
const char *intrstr = NULL;
|
||||||
|
|
||||||
psc->sc_pc = pc;
|
psc->sc_pc = pc;
|
||||||
|
|
||||||
|
psc->sc_pcitag = pa->pa_tag;
|
||||||
|
|
||||||
if (!ath_pci_setup(pa))
|
if (!ath_pci_setup(pa))
|
||||||
goto bad;
|
goto bad;
|
||||||
|
|
||||||
@ -207,16 +213,23 @@ ath_pci_attach(struct device *parent, struct device *self, void *aux)
|
|||||||
|
|
||||||
sc->sc_dmat = pa->pa_dmat;
|
sc->sc_dmat = pa->pa_dmat;
|
||||||
|
|
||||||
hook = shutdownhook_establish(ath_pci_shutdown, psc);
|
shook = shutdownhook_establish(ath_pci_shutdown, psc);
|
||||||
if (hook == NULL) {
|
if (shook == NULL) {
|
||||||
aprint_error("couldn't make shutdown hook\n");
|
aprint_error("couldn't make shutdown hook\n");
|
||||||
goto bad3;
|
goto bad3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
phook = powerhook_establish(ath_pci_powerhook, psc);
|
||||||
|
if (phook == NULL) {
|
||||||
|
aprint_error("couldn't make power hook\n");
|
||||||
|
goto bad3;
|
||||||
|
}
|
||||||
|
|
||||||
if (ath_attach(PCI_PRODUCT(pa->pa_id), sc) == 0)
|
if (ath_attach(PCI_PRODUCT(pa->pa_id), sc) == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
shutdownhook_disestablish(hook);
|
shutdownhook_disestablish(shook);
|
||||||
|
powerhook_disestablish(phook);
|
||||||
|
|
||||||
bad3: pci_intr_disestablish(pc, psc->sc_ih);
|
bad3: pci_intr_disestablish(pc, psc->sc_ih);
|
||||||
bad2: /* XXX */
|
bad2: /* XXX */
|
||||||
@ -243,3 +256,25 @@ ath_pci_shutdown(void *self)
|
|||||||
|
|
||||||
ath_shutdown(&psc->sc_sc);
|
ath_shutdown(&psc->sc_sc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ath_pci_powerhook(int why, void *arg)
|
||||||
|
{
|
||||||
|
struct ath_pci_softc *sc = arg;
|
||||||
|
pci_chipset_tag_t pc = sc->sc_pc;
|
||||||
|
pcitag_t tag = sc->sc_pcitag;
|
||||||
|
|
||||||
|
switch (why) {
|
||||||
|
case PWR_SOFTSUSPEND:
|
||||||
|
ath_pci_shutdown(sc);
|
||||||
|
break;
|
||||||
|
case PWR_SUSPEND:
|
||||||
|
pci_conf_capture(pc, tag, &sc->sc_pciconf);
|
||||||
|
break;
|
||||||
|
case PWR_RESUME:
|
||||||
|
pci_conf_restore(pc, tag, &sc->sc_pciconf);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user