diff options
author | Shaun Ruffell <sruffell@digium.com> | 2011-01-03 18:25:56 +0000 |
---|---|---|
committer | Shaun Ruffell <sruffell@digium.com> | 2011-01-03 18:25:56 +0000 |
commit | 217c8f524c98befd2b13e2f3ec7cb8cdcf5ff5ff (patch) | |
tree | 55b30899788c0ac82b63e9834838b36a012e9db0 /drivers/dahdi/dahdi_dynamic_eth.c | |
parent | d7d5fbd8c1f1b2bf8361e23d07708fb96079b353 (diff) |
dahdi_dynamic: Pass the dahdi_dynamic to create/destroy functions.
This allows the pvt member to be set under lock without holding the lock
through the call to create destroy.
Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Acked-by: Kinsey Moore <kmoore@digium.com>
git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@9578 a0bf4364-ded3-4de4-8d8a-66a801d63aff
Diffstat (limited to 'drivers/dahdi/dahdi_dynamic_eth.c')
-rw-r--r-- | drivers/dahdi/dahdi_dynamic_eth.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/drivers/dahdi/dahdi_dynamic_eth.c b/drivers/dahdi/dahdi_dynamic_eth.c index fb5c1e1..2f8aa51 100644 --- a/drivers/dahdi/dahdi_dynamic_eth.c +++ b/drivers/dahdi/dahdi_dynamic_eth.c @@ -140,7 +140,7 @@ static int ztdeth_notifier(struct notifier_block *block, unsigned long event, vo return 0; } -static void ztdeth_transmit(void *pvt, unsigned char *msg, int msglen) +static void ztdeth_transmit(struct dahdi_dynamic *dyn, u8 *msg, size_t msglen) { struct ztdeth *z; struct sk_buff *skb; @@ -151,7 +151,7 @@ static void ztdeth_transmit(void *pvt, unsigned char *msg, int msglen) unsigned short subaddr; /* Network byte order */ spin_lock_irqsave(&zlock, flags); - z = pvt; + z = dyn->pvt; if (z->dev) { /* Copy fields to local variables to remove spinlock ASAP */ dev = z->dev; @@ -266,9 +266,9 @@ static int hex2int(char *s) return tmp; } -static void ztdeth_destroy(void *pvt) +static void ztdeth_destroy(struct dahdi_dynamic *dyn) { - struct ztdeth *z = pvt; + struct ztdeth *z = dyn->pvt; unsigned long flags; struct ztdeth *prev=NULL, *cur; spin_lock_irqsave(&zlock, flags); @@ -291,13 +291,14 @@ static void ztdeth_destroy(void *pvt) } } -static void *ztdeth_create(struct dahdi_span *span, const char *addr) +static int ztdeth_create(struct dahdi_dynamic *dyn, const char *addr) { struct ztdeth *z; char src[256]; char tmp[256], *tmp2, *tmp3, *tmp4 = NULL; int res,x; unsigned long flags; + struct dahdi_span *const span = &dyn->span; z = kmalloc(sizeof(struct ztdeth), GFP_KERNEL); if (z) { @@ -314,7 +315,7 @@ static void *ztdeth_create(struct dahdi_span *span, const char *addr) } else { printk(KERN_NOTICE "Invalid TDMoE address (no device) '%s'\n", addr); kfree(z); - return NULL; + return -EINVAL; } if (tmp2) { tmp4 = strchr(tmp2+1, '/'); @@ -342,12 +343,12 @@ static void *ztdeth_create(struct dahdi_span *span, const char *addr) if (x != 6) { printk(KERN_NOTICE "TDMoE: Invalid MAC address in: %s\n", addr); kfree(z); - return NULL; + return -EINVAL; } } else { printk(KERN_NOTICE "TDMoE: Missing MAC address\n"); kfree(z); - return NULL; + return -EINVAL; } if (tmp4) { int sub = 0; @@ -361,7 +362,7 @@ static void *ztdeth_create(struct dahdi_span *span, const char *addr) } else { printk(KERN_NOTICE "TDMoE: Invalid subaddress\n"); kfree(z); - return NULL; + return -EINVAL; } mul *= 10; tmp3--; @@ -376,7 +377,7 @@ static void *ztdeth_create(struct dahdi_span *span, const char *addr) if (!z->dev) { printk(KERN_NOTICE "TDMoE: Invalid device '%s'\n", z->ethdev); kfree(z); - return NULL; + return -EINVAL; } z->span = span; src[0] ='\0'; @@ -388,9 +389,10 @@ static void *ztdeth_create(struct dahdi_span *span, const char *addr) spin_lock_irqsave(&zlock, flags); z->next = zdevs; zdevs = z; + dyn->pvt = z; spin_unlock_irqrestore(&zlock, flags); } - return z; + return (z) ? 0 : -ENOMEM; } static struct dahdi_dynamic_driver ztd_eth = { |