Ok Steve, update your kernel sources again just to sync up the patch
    I committed to if_wi (which is the same one you already have), and 
    then try this patch on top of that.

    The issue is that the cardbus code's handling of BUS_SETUP_INTR ignores
    the serializer passed into it from IF_WI.  I think this will deal with
    the case properly but I can't test it.

                                                -Matt

Index: bus/pccard/pccard.c
===================================================================
RCS file: /cvs/src/sys/bus/pccard/pccard.c,v
retrieving revision 1.14
diff -u -r1.14 pccard.c
--- bus/pccard/pccard.c 27 Jun 2005 02:27:10 -0000      1.14
+++ bus/pccard/pccard.c 16 Dec 2005 20:58:17 -0000
@@ -1222,7 +1222,7 @@
        if (func->intr_handler != NULL)
                panic("Only one interrupt handler per function allowed");
        err = bus_generic_setup_intr(dev, child, irq, flags, pccard_intr,
-                                    func, cookiep, NULL);
+                                    func, cookiep, serializer);
        if (err != 0)
                return (err);
        func->intr_handler = intr;
Index: dev/pccard/pccbb/pccbb.c
===================================================================
RCS file: /cvs/src/sys/dev/pccard/pccbb/pccbb.c,v
retrieving revision 1.11
diff -u -r1.11 pccbb.c
--- dev/pccard/pccbb/pccbb.c    12 Oct 2005 17:35:54 -0000      1.11
+++ dev/pccard/pccbb/pccbb.c    16 Dec 2005 21:03:41 -0000
@@ -803,6 +803,7 @@
        *cookiep = ih;
        ih->intr = intr;
        ih->arg = arg;
+       ih->serializer = serializer;
        KKASSERT(serializer == NULL);   /* not yet supported */
        STAILQ_INSERT_TAIL(&sc->intr_handlers, ih, entries);
        /*
@@ -1057,7 +1058,13 @@
        }
        if (sc->flags & CBB_CARD_OK) {
                STAILQ_FOREACH(ih, &sc->intr_handlers, entries) {
-                       (*ih->intr)(ih->arg);
+                       if (ih->serializer) {
+                               lwkt_serialize_handler_call(ih->serializer,
+                                               (inthand2_t)ih->intr, ih->arg,
+                                               NULL);
+                       } else {
+                               (*ih->intr)(ih->arg);
+                       }
                }
                
        }
Index: dev/pccard/pccbb/pccbbvar.h
===================================================================
RCS file: /cvs/src/sys/dev/pccard/pccbb/pccbbvar.h,v
retrieving revision 1.1
diff -u -r1.1 pccbbvar.h
--- dev/pccard/pccbb/pccbbvar.h 10 Feb 2004 07:55:47 -0000      1.1
+++ dev/pccard/pccbb/pccbbvar.h 16 Dec 2005 21:01:05 -0000
@@ -36,6 +36,7 @@
 struct cbb_intrhand {
        driver_intr_t *intr;
        void    *arg;
+       struct lwkt_serialize *serializer;
        STAILQ_ENTRY(cbb_intrhand) entries;
 };
 

Reply via email to