svn commit: r305604 - head/sys/dev/intpm
Andriy Gapon
avg at FreeBSD.org
Thu Sep 8 12:27:35 UTC 2016
Author: avg
Date: Thu Sep 8 12:27:34 2016
New Revision: 305604
URL: https://svnweb.freebsd.org/changeset/base/305604
Log:
intpm: better clean up resources after a failed attachment
bus_generic_detach() fails when called from attach method
thus preventing further clean up actions.
MFC after: 1 week
Modified:
head/sys/dev/intpm/intpm.c
Modified: head/sys/dev/intpm/intpm.c
==============================================================================
--- head/sys/dev/intpm/intpm.c Thu Sep 8 12:24:46 2016 (r305603)
+++ head/sys/dev/intpm/intpm.c Thu Sep 8 12:27:34 2016 (r305604)
@@ -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)
{
@@ -311,12 +328,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 */
@@ -325,30 +345,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);
}
More information about the svn-src-all
mailing list