[FreeBSD] We need to call drm_detach before we free dev->driver.
authorRobert Noland <rnoland@2hip.net>
Mon, 8 Sep 2008 20:40:52 +0000 (16:40 -0400)
committerRobert Noland <rnoland@2hip.net>
Mon, 8 Sep 2008 20:40:52 +0000 (16:40 -0400)
The driver is in control of the show, so when you try and unload a module
the driver detach routine is called first.  It is what drives the whole
unload process and so lots of panics occur if dev->driver is already
free.

bsd-core/i915_drv.c
bsd-core/mach64_drv.c
bsd-core/mga_drv.c
bsd-core/r128_drv.c
bsd-core/radeon_drv.c
bsd-core/savage_drv.c
bsd-core/sis_drv.c
bsd-core/tdfx_drv.c
bsd-core/via_drv.c

index 71a8d64..7e74519 100644 (file)
@@ -122,10 +122,13 @@ static int
 i915_detach(device_t nbdev)
 {
        struct drm_device *dev = device_get_softc(nbdev);
+       int ret;
+
+       ret = drm_detach(nbdev);
 
        free(dev->driver, M_DRM);
 
-       return drm_detach(nbdev);
+       return ret;
 }
 
 static device_method_t i915_methods[] = {
index f940e90..36f3cec 100644 (file)
@@ -96,10 +96,13 @@ static int
 mach64_detach(device_t nbdev)
 {
        struct drm_device *dev = device_get_softc(nbdev);
+       int ret;
+
+       ret = drm_detach(nbdev);
 
        free(dev->driver, M_DRM);
 
-       return drm_detach(nbdev);
+       return ret;
 }
 
 static device_method_t mach64_methods[] = {
index 7abf2b0..8580960 100644 (file)
@@ -142,10 +142,13 @@ static int
 mga_detach(device_t nbdev)
 {
        struct drm_device *dev = device_get_softc(nbdev);
+       int ret;
+
+       ret = drm_detach(nbdev);
 
        free(dev->driver, M_DRM);
 
-       return drm_detach(nbdev);
+       return ret;
 }
 
 static device_method_t mga_methods[] = {
index 03a97da..5d4dfed 100644 (file)
@@ -95,10 +95,13 @@ static int
 r128_detach(device_t nbdev)
 {
        struct drm_device *dev = device_get_softc(nbdev);
+       int ret;
+
+       ret = drm_detach(nbdev);
 
        free(dev->driver, M_DRM);
 
-       return drm_detach(nbdev);
+       return ret;
 }
 
 static device_method_t r128_methods[] = {
index 019f705..50a2f6b 100644 (file)
@@ -100,10 +100,13 @@ static int
 radeon_detach(device_t nbdev)
 {
        struct drm_device *dev = device_get_softc(nbdev);
+       int ret;
+
+       ret = drm_detach(nbdev);
 
        free(dev->driver, M_DRM);
 
-       return drm_detach(nbdev);
+       return ret;
 }
 
 static device_method_t radeon_methods[] = {
index f0c6c06..36dd34a 100644 (file)
@@ -86,10 +86,13 @@ static int
 savage_detach(device_t nbdev)
 {
        struct drm_device *dev = device_get_softc(nbdev);
+       int ret;
+
+       ret = drm_detach(nbdev);
 
        free(dev->driver, M_DRM);
 
-       return drm_detach(nbdev);
+       return ret;
 }
 
 static device_method_t savage_methods[] = {
index 8ad6414..bcf4ffd 100644 (file)
@@ -80,10 +80,13 @@ static int
 sis_detach(device_t nbdev)
 {
        struct drm_device *dev = device_get_softc(nbdev);
+       int ret;
+
+       ret = drm_detach(nbdev);
 
        free(dev->driver, M_DRM);
 
-       return drm_detach(nbdev);
+       return ret;
 }
 
 static device_method_t sis_methods[] = {
index 8fafe0f..8d9e272 100644 (file)
@@ -82,10 +82,13 @@ static int
 tdfx_detach(device_t nbdev)
 {
        struct drm_device *dev = device_get_softc(nbdev);
+       int ret;
+
+       ret = drm_detach(nbdev);
 
        free(dev->driver, M_DRM);
 
-       return drm_detach(nbdev);
+       return ret;
 }
 
 static device_method_t tdfx_methods[] = {
index cdd78d1..402b374 100644 (file)
@@ -93,10 +93,13 @@ static int
 via_detach(device_t nbdev)
 {
        struct drm_device *dev = device_get_softc(nbdev);
+       int ret;
+
+       ret = drm_detach(nbdev);
 
        free(dev->driver, M_DRM);
 
-       return drm_detach(nbdev);
+       return ret;
 }
 
 static device_method_t via_methods[] = {