diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/dahdi/dahdi_dynamic_eth.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/drivers/dahdi/dahdi_dynamic_eth.c b/drivers/dahdi/dahdi_dynamic_eth.c index 5ad0484..fd3a8cd 100644 --- a/drivers/dahdi/dahdi_dynamic_eth.c +++ b/drivers/dahdi/dahdi_dynamic_eth.c @@ -146,7 +146,7 @@ static void ztdeth_transmit(struct dahdi_dynamic *dyn, u8 *msg, size_t msglen) spin_lock_irqsave(&zlock, flags); z = dyn->pvt; - if (z->dev) { + if (z && z->dev) { /* Copy fields to local variables to remove spinlock ASAP */ dev = z->dev; memcpy(addr, z->addr, sizeof(z->addr)); @@ -307,11 +307,12 @@ static void ztdeth_destroy(struct dahdi_dynamic *dyn) prev = cur; cur = cur->next; } - spin_unlock_irqrestore(&zlock, flags); if (cur == z) { /* Successfully removed */ + dyn->pvt = NULL; printk(KERN_INFO "TDMoE: Removed interface for %s\n", z->span->name); kfree(z); } + spin_unlock_irqrestore(&zlock, flags); } static int ztdeth_create(struct dahdi_dynamic *dyn, const char *addr) @@ -434,12 +435,12 @@ static struct notifier_block ztdeth_nblock = { static int __init ztdeth_init(void) { + skb_queue_head_init(&skbs); + dev_add_pack(&ztdeth_ptype); register_netdevice_notifier(&ztdeth_nblock); dahdi_dynamic_register_driver(&ztd_eth); - skb_queue_head_init(&skbs); - return 0; } @@ -450,9 +451,11 @@ static void __exit ztdeth_exit(void) #else cancel_work_sync(&dahdi_dynamic_eth_flush_work); #endif - dev_remove_pack(&ztdeth_ptype); - unregister_netdevice_notifier(&ztdeth_nblock); dahdi_dynamic_unregister_driver(&ztd_eth); + unregister_netdevice_notifier(&ztdeth_nblock); + dev_remove_pack(&ztdeth_ptype); + + skb_queue_purge(&skbs); } MODULE_DESCRIPTION("DAHDI Dynamic TDMoE Support"); |