Apply by doing: cd /usr/src patch -p0 < 004_arc.patch And then rebuild your kernel. Index: sys/dev/pci/arc.c =================================================================== RCS file: /cvs/src/sys/dev/pci/arc.c,v retrieving revision 1.48 retrieving revision 1.48.2.1 diff -u -p -r1.48 -r1.48.2.1 --- sys/dev/pci/arc.c 28 Aug 2006 05:36:00 -0000 1.48 +++ sys/dev/pci/arc.c 2 Nov 2006 01:52:08 -0000 1.48.2.1 @@ -350,6 +350,7 @@ struct arc_fw_sysinfo { int arc_match(struct device *, void *, void *); void arc_attach(struct device *, struct device *, void *); int arc_detach(struct device *, int); +void arc_shutdown(void *); int arc_intr(void *); struct arc_ccb; @@ -369,6 +370,8 @@ struct arc_softc { void *sc_ih; + void *sc_shutdownhook; + int sc_req_count; struct arc_dmamem *sc_requests; @@ -517,6 +520,10 @@ arc_attach(struct device *parent, struct return; } + sc->sc_shutdownhook = shutdownhook_establish(arc_shutdown, sc); + if (sc->sc_shutdownhook == NULL) + panic("unable to establish arc powerhook"); + sc->sc_link.device = &arc_dev; sc->sc_link.adapter = &arc_switch; sc->sc_link.adapter_softc = sc; @@ -544,6 +551,8 @@ arc_detach(struct device *self, int flag { struct arc_softc *sc = (struct arc_softc *)self; + shutdownhook_disestablish(sc->sc_shutdownhook); + if (arc_msg0(sc, ARC_REG_INB_MSG0_STOP_BGRB) != 0) printf("%s: timeout waiting to stop bg rebuild\n"); @@ -551,6 +560,18 @@ arc_detach(struct device *self, int flag printf("%s: timeout waiting to flush cache\n"); return (0); +} + +void +arc_shutdown(void *xsc) +{ + struct arc_softc *sc = xsc; + + if (arc_msg0(sc, ARC_REG_INB_MSG0_STOP_BGRB) != 0) + printf("%s: timeout waiting to stop bg rebuild\n"); + + if (arc_msg0(sc, ARC_REG_INB_MSG0_FLUSH_CACHE) != 0) + printf("%s: timeout waiting to flush cache\n"); } int