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