diff options
author | rik <rik@FreeBSD.org> | 2005-09-27 16:57:44 +0000 |
---|---|---|
committer | rik <rik@FreeBSD.org> | 2005-09-27 16:57:44 +0000 |
commit | aa790ae8700e7fed7ef83f2549c6bc53d6ae7f8f (patch) | |
tree | 8cdae507cb4db630749f512fed7b7da9a9611439 /sys/dev/cp | |
parent | 332a994af0394ebb13aaf28c43c8ee56ea7b75aa (diff) | |
download | FreeBSD-src-aa790ae8700e7fed7ef83f2549c6bc53d6ae7f8f.zip FreeBSD-src-aa790ae8700e7fed7ef83f2549c6bc53d6ae7f8f.tar.gz |
Restore if_cp.c 1.27
----------------------------
revision 1.27
date: 2005/09/19 03:10:16; author: imp; state: Exp; lines: +3 -2
Make sure that we call if_free(ifp) after bus_teardown_intr. Since we
could get an interrupt after we free the ifp, and the interrupt
handler depended on the ifp being still alive, this could, in theory,
cause a crash. Eliminate this possibility by moving the if_free to
after the bus_teardown_intr() call.
In fact, this change do nothing for this driver. It is protected from
this by cp_destroy variable. This variable also protects driver from initiation
of any activity from network stack with disabled intr handler with this change
applied.
Diffstat (limited to 'sys/dev/cp')
-rw-r--r-- | sys/dev/cp/if_cp.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/sys/dev/cp/if_cp.c b/sys/dev/cp/if_cp.c index 2adcfd6..d995c01 100644 --- a/sys/dev/cp/if_cp.c +++ b/sys/dev/cp/if_cp.c @@ -614,6 +614,9 @@ static int cp_detach (device_t dev) cp_reset (b, 0 ,0); callout_stop (&led_timo[b->num]); + /* Disable the interrupt request. */ + bus_teardown_intr (dev, bd->cp_irq, bd->cp_intrhand); + for (c=b->chan; c<b->chan+NCHAN; ++c) { drv_t *d = (drv_t*) c->sys; @@ -646,8 +649,6 @@ static int cp_detach (device_t dev) b->sys = NULL; CP_UNLOCK (bd); - /* Disable the interrupt request. */ - bus_teardown_intr (dev, bd->cp_irq, bd->cp_intrhand); bus_deactivate_resource (dev, SYS_RES_IRQ, 0, bd->cp_irq); bus_release_resource (dev, SYS_RES_IRQ, 0, bd->cp_irq); bus_release_resource (dev, SYS_RES_MEMORY, PCIR_BAR(0), bd->cp_res); |