Author: marius
Date: Sat Mar  2 13:04:58 2013
New Revision: 247620
URL: http://svnweb.freebsd.org/changeset/base/247620

Log:
  Revert the part of r247600 which turned the overtemperature and power fail
  interrupt shutdown handlers into filters. Shutdown_nice(9) acquires a sleep
  lock, which filters shouldn't do. It also seems that kern_reboot(9) still
  may require Giant to be hold.
  
  Submitted by: bde

Modified:
  head/sys/sparc64/pci/psycho.c

Modified: head/sys/sparc64/pci/psycho.c
==============================================================================
--- head/sys/sparc64/pci/psycho.c       Sat Mar  2 12:42:23 2013        
(r247619)
+++ head/sys/sparc64/pci/psycho.c       Sat Mar  2 13:04:58 2013        
(r247620)
@@ -81,7 +81,7 @@ static const struct psycho_desc *psycho_
     const char *);
 static const struct psycho_desc *psycho_get_desc(device_t);
 static void psycho_set_intr(struct psycho_softc *, u_int, bus_addr_t,
-    driver_filter_t);
+    driver_filter_t, driver_intr_t);
 static int psycho_find_intrmap(struct psycho_softc *, u_int, bus_addr_t *,
     bus_addr_t *, u_long *);
 static void sabre_dmamap_sync(bus_dma_tag_t dt, bus_dmamap_t map,
@@ -96,8 +96,8 @@ static driver_filter_t psycho_ue;
 static driver_filter_t psycho_ce;
 static driver_filter_t psycho_pci_bus;
 static driver_filter_t psycho_powerdebug;
-static driver_filter_t psycho_powerdown;
-static driver_filter_t psycho_overtemp;
+static driver_intr_t psycho_powerdown;
+static driver_intr_t psycho_overtemp;
 #ifdef PSYCHO_MAP_WAKEUP
 static driver_filter_t psycho_wakeup;
 #endif
@@ -619,17 +619,17 @@ psycho_attach(device_t dev)
                 * XXX Not all controllers have these, but installing them
                 * is better than trying to sort through this mess.
                 */
-               psycho_set_intr(sc, 1, PSR_UE_INT_MAP, psycho_ue);
-               psycho_set_intr(sc, 2, PSR_CE_INT_MAP, psycho_ce);
+               psycho_set_intr(sc, 1, PSR_UE_INT_MAP, psycho_ue, NULL);
+               psycho_set_intr(sc, 2, PSR_CE_INT_MAP, psycho_ce, NULL);
                switch (psycho_powerfail) {
                case 0:
                        break;
                case 2:
                        psycho_set_intr(sc, 3, PSR_POWER_INT_MAP,
-                           psycho_powerdebug);
+                           psycho_powerdebug, NULL);
                        break;
                default:
-                       psycho_set_intr(sc, 3, PSR_POWER_INT_MAP,
+                       psycho_set_intr(sc, 3, PSR_POWER_INT_MAP, NULL,
                            psycho_powerdown);
                        break;
                }
@@ -643,7 +643,7 @@ psycho_attach(device_t dev)
                         * The spare hardware interrupt is used for the
                         * over-temperature interrupt.
                         */
-                       psycho_set_intr(sc, 4, PSR_SPARE_INT_MAP,
+                       psycho_set_intr(sc, 4, PSR_SPARE_INT_MAP, NULL,
                            psycho_overtemp);
 #ifdef PSYCHO_MAP_WAKEUP
                        /*
@@ -651,7 +651,7 @@ psycho_attach(device_t dev)
                         * now.
                         */
                        psycho_set_intr(sc, 5, PSR_PWRMGT_INT_MAP,
-                           psycho_wakeup);
+                           psycho_wakeup, NULL);
 #endif /* PSYCHO_MAP_WAKEUP */
                }
        }
@@ -661,7 +661,7 @@ psycho_attach(device_t dev)
         * interrupt but they are also only used for PCI bus A.
         */
        psycho_set_intr(sc, 0, sc->sc_half == 0 ? PSR_PCIAERR_INT_MAP :
-           PSR_PCIBERR_INT_MAP, psycho_pci_bus);
+           PSR_PCIBERR_INT_MAP, psycho_pci_bus, NULL);
 
        /*
         * Set the latency timer register as this isn't always done by the
@@ -701,7 +701,7 @@ psycho_attach(device_t dev)
 
 static void
 psycho_set_intr(struct psycho_softc *sc, u_int index, bus_addr_t intrmap,
-    driver_filter_t handler)
+    driver_filter_t filt, driver_intr_t intr)
 {
        u_long vec;
        int rid;
@@ -722,7 +722,7 @@ psycho_set_intr(struct psycho_softc *sc,
            INTVEC(PSYCHO_READ8(sc, intrmap)) != vec ||
            intr_vectors[vec].iv_ic != &psycho_ic ||
            bus_setup_intr(sc->sc_dev, sc->sc_irq_res[index],
-           INTR_TYPE_MISC | INTR_BRIDGE, handler, NULL, sc,
+           INTR_TYPE_MISC | INTR_BRIDGE, filt, intr, sc,
            &sc->sc_ihand[index]) != 0)
                panic("%s: failed to set up interrupt %d", __func__, index);
 }
@@ -858,32 +858,30 @@ psycho_powerdebug(void *arg __unused)
        return (FILTER_HANDLED);
 }
 
-static int
+static void
 psycho_powerdown(void *arg __unused)
 {
        static int shutdown;
 
        /* As the interrupt is cleared we may be called multiple times. */
        if (shutdown != 0)
-               return (FILTER_HANDLED);
+               return;
        shutdown++;
        printf("Power Failure Detected: Shutting down NOW.\n");
        shutdown_nice(RB_POWEROFF);
-       return (FILTER_HANDLED);
 }
 
-static int
+static void
 psycho_overtemp(void *arg __unused)
 {
        static int shutdown;
 
        /* As the interrupt is cleared we may be called multiple times. */
        if (shutdown != 0)
-               return (FILTER_HANDLED);
+               return;
        shutdown++;
        printf("DANGER: OVER TEMPERATURE detected.\nShutting down NOW.\n");
        shutdown_nice(RB_POWEROFF);
-       return (FILTER_HANDLED);
 }
 
 #ifdef PSYCHO_MAP_WAKEUP
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to