summaryrefslogtreecommitdiff
path: root/drivers/dahdi/dahdi_dynamic_eth.c
diff options
context:
space:
mode:
authorShaun Ruffell <sruffell@digium.com>2011-01-03 18:25:56 +0000
committerShaun Ruffell <sruffell@digium.com>2011-01-03 18:25:56 +0000
commit217c8f524c98befd2b13e2f3ec7cb8cdcf5ff5ff (patch)
tree55b30899788c0ac82b63e9834838b36a012e9db0 /drivers/dahdi/dahdi_dynamic_eth.c
parentd7d5fbd8c1f1b2bf8361e23d07708fb96079b353 (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.c24
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 = {