Author: avg
Date: Wed Sep 21 16:27:09 2016
New Revision: 306123
URL: https://svnweb.freebsd.org/changeset/base/306123

Log:
  MFC r305604: intpm: better clean up resources after a failed attachment

Modified:
  stable/10/sys/pci/intpm.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/pci/intpm.c
==============================================================================
--- stable/10/sys/pci/intpm.c   Wed Sep 21 16:26:59 2016        (r306122)
+++ stable/10/sys/pci/intpm.c   Wed Sep 21 16:27:09 2016        (r306123)
@@ -199,6 +199,23 @@ sb8xx_attach(device_t dev)
        return (0);
 }
 
+static void
+intsmb_release_resources(device_t dev)
+{
+       struct intsmb_softc *sc = device_get_softc(dev);
+
+       if (sc->smbus)
+               device_delete_child(dev, sc->smbus);
+       if (sc->irq_hand)
+               bus_teardown_intr(dev, sc->irq_res, sc->irq_hand);
+       if (sc->irq_res)
+               bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq_res);
+       if (sc->io_res)
+               bus_release_resource(dev, SYS_RES_IOPORT, sc->io_rid,
+                   sc->io_res);
+       mtx_destroy(&sc->lock);
+}
+
 static int
 intsmb_attach(device_t dev)
 {
@@ -309,12 +326,15 @@ no_intr:
        sc->isbusy = 0;
        sc->smbus = device_add_child(dev, "smbus", -1);
        if (sc->smbus == NULL) {
+               device_printf(dev, "failed to add smbus child\n");
                error = ENXIO;
                goto fail;
        }
        error = device_probe_and_attach(sc->smbus);
-       if (error)
+       if (error) {
+               device_printf(dev, "failed to probe+attach smbus child\n");
                goto fail;
+       }
 
 #ifdef ENABLE_ALART
        /* Enable Arart */
@@ -323,30 +343,22 @@ no_intr:
        return (0);
 
 fail:
-       intsmb_detach(dev);
+       intsmb_release_resources(dev);
        return (error);
 }
 
 static int
 intsmb_detach(device_t dev)
 {
-       struct intsmb_softc *sc = device_get_softc(dev);
        int error;
 
        error = bus_generic_detach(dev);
-       if (error)
+       if (error) {
+               device_printf(dev, "bus detach failed\n");
                return (error);
+       }
 
-       if (sc->smbus)
-               device_delete_child(dev, sc->smbus);
-       if (sc->irq_hand)
-               bus_teardown_intr(dev, sc->irq_res, sc->irq_hand);
-       if (sc->irq_res)
-               bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq_res);
-       if (sc->io_res)
-               bus_release_resource(dev, SYS_RES_IOPORT, sc->io_rid,
-                   sc->io_res);
-       mtx_destroy(&sc->lock);
+       intsmb_release_resources(dev);
        return (0);
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to