diff options
author | Shaun Ruffell <sruffell@digium.com> | 2010-09-20 20:34:11 +0000 |
---|---|---|
committer | Shaun Ruffell <sruffell@digium.com> | 2010-09-20 20:34:11 +0000 |
commit | 721ffd5ee1505ebb3c8cee041ec85f503f6bdf86 (patch) | |
tree | 21e4c99e81f19ef29b0e204d73d99b8ce6a444cc | |
parent | c639efc69dade86a441cbdcd52bb8e597a8d9f79 (diff) |
dahdi: Move DAHDI_SPANSTAT ioctl handlers into separate functions.
Review: https://reviewboard.asterisk.org/r/905/
Signed-off-by: Shaun Ruffell <sruffell@digium.com>
git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@9378 a0bf4364-ded3-4de4-8d8a-66a801d63aff
-rw-r--r-- | drivers/dahdi/dahdi-base.c | 300 |
1 files changed, 170 insertions, 130 deletions
diff --git a/drivers/dahdi/dahdi-base.c b/drivers/dahdi/dahdi-base.c index b7be744..94e01d6 100644 --- a/drivers/dahdi/dahdi-base.c +++ b/drivers/dahdi/dahdi-base.c @@ -4000,18 +4000,176 @@ static int dahdi_ioctl_setparams(struct file *file, unsigned long data) return 0; } -static int dahdi_common_ioctl(struct file *file, unsigned int cmd, unsigned long data, int unit) +/** + * dahdi_ioctl_spanstat() - Return statistics for a span. + * + */ +static int dahdi_ioctl_spanstat(struct file *file, unsigned long data) { - union { - struct dahdi_spaninfo_v1 spaninfo_v1; - struct dahdi_spaninfo spaninfo; - } stack; - + struct dahdi_spaninfo spaninfo; struct dahdi_span *s; - int i,j; + int j; size_t size_to_copy; - void __user * const user_data = (void __user *)data; + size_to_copy = sizeof(struct dahdi_spaninfo); + if (copy_from_user(&spaninfo, (void __user *)data, size_to_copy)) + return -EFAULT; + if (!spaninfo.spanno) { + struct dahdi_chan *const chan = chan_from_file(file); + if (!chan) + return -EINVAL; + + s = chan->span; + } else { + s = find_span(spaninfo.spanno); + } + if (!s) + return -EINVAL; + + spaninfo.spanno = s->spanno; /* put the span # in here */ + spaninfo.totalspans = span_count(); + dahdi_copy_string(spaninfo.desc, s->desc, sizeof(spaninfo.desc)); + dahdi_copy_string(spaninfo.name, s->name, sizeof(spaninfo.name)); + spaninfo.alarms = s->alarms; /* get alarm status */ + spaninfo.rxlevel = s->rxlevel; /* get rx level */ + spaninfo.txlevel = s->txlevel; /* get tx level */ + + spaninfo.bpvcount = s->count.bpv; + spaninfo.crc4count = s->count.crc4; + spaninfo.ebitcount = s->count.ebit; + spaninfo.fascount = s->count.fas; + spaninfo.fecount = s->count.fe; + spaninfo.cvcount = s->count.cv; + spaninfo.becount = s->count.be; + spaninfo.prbs = s->count.prbs; + spaninfo.errsec = s->count.errsec; + + spaninfo.irqmisses = s->irqmisses; /* get IRQ miss count */ + spaninfo.syncsrc = s->syncsrc; /* get active sync source */ + spaninfo.totalchans = s->channels; + spaninfo.numchans = 0; + for (j = 0; j < s->channels; j++) { + if (s->chans[j]->sig) + spaninfo.numchans++; + } + spaninfo.lbo = s->lbo; + spaninfo.lineconfig = s->lineconfig; + spaninfo.irq = s->irq; + spaninfo.linecompat = s->linecompat; + dahdi_copy_string(spaninfo.lboname, dahdi_lboname(s->lbo), + sizeof(spaninfo.lboname)); + if (s->manufacturer) { + dahdi_copy_string(spaninfo.manufacturer, s->manufacturer, + sizeof(spaninfo.manufacturer)); + } + if (s->devicetype) { + dahdi_copy_string(spaninfo.devicetype, s->devicetype, + sizeof(spaninfo.devicetype)); + } + dahdi_copy_string(spaninfo.location, s->location, + sizeof(spaninfo.location)); + if (s->spantype) { + dahdi_copy_string(spaninfo.spantype, s->spantype, + sizeof(spaninfo.spantype)); + } + + if (copy_to_user((void __user *)data, &spaninfo, size_to_copy)) + return -EFAULT; + return 0; +} + +/** + * dahdi_ioctl_spanstat_v1() - Return statistics for a span in a legacy format. + * + */ +static int dahdi_ioctl_spanstat_v1(struct file *file, unsigned long data) +{ + struct dahdi_spaninfo_v1 spaninfo_v1; + struct dahdi_span *s; + int j; + + if (copy_from_user(&spaninfo_v1, (void __user *)data, + sizeof(spaninfo_v1))) { + return -EFAULT; + } + + if (!spaninfo_v1.spanno) { + struct dahdi_chan *const chan = chan_from_file(file); + if (!chan) + return -EINVAL; + + s = chan->span; + } else { + s = find_span(spaninfo_v1.spanno); + } + + if (!s) + return -EINVAL; + + spaninfo_v1.spanno = s->spanno; /* put the span # in here */ + spaninfo_v1.totalspans = 0; + spaninfo_v1.totalspans = span_count(); + dahdi_copy_string(spaninfo_v1.desc, + s->desc, + sizeof(spaninfo_v1.desc)); + dahdi_copy_string(spaninfo_v1.name, + s->name, + sizeof(spaninfo_v1.name)); + spaninfo_v1.alarms = s->alarms; + spaninfo_v1.bpvcount = s->count.bpv; + spaninfo_v1.rxlevel = s->rxlevel; + spaninfo_v1.txlevel = s->txlevel; + spaninfo_v1.crc4count = s->count.crc4; + spaninfo_v1.ebitcount = s->count.ebit; + spaninfo_v1.fascount = s->count.fas; + spaninfo_v1.irqmisses = s->irqmisses; + spaninfo_v1.syncsrc = s->syncsrc; + spaninfo_v1.totalchans = s->channels; + spaninfo_v1.numchans = 0; + for (j = 0; j < s->channels; j++) { + if (s->chans[j]->sig) + spaninfo_v1.numchans++; + } + spaninfo_v1.lbo = s->lbo; + spaninfo_v1.lineconfig = s->lineconfig; + spaninfo_v1.irq = s->irq; + spaninfo_v1.linecompat = s->linecompat; + dahdi_copy_string(spaninfo_v1.lboname, + dahdi_lboname(s->lbo), + sizeof(spaninfo_v1.lboname)); + + if (s->manufacturer) { + dahdi_copy_string(spaninfo_v1.manufacturer, + s->manufacturer, + sizeof(spaninfo_v1.manufacturer)); + } + + if (s->devicetype) { + dahdi_copy_string(spaninfo_v1.devicetype, + s->devicetype, + sizeof(spaninfo_v1.devicetype)); + } + + dahdi_copy_string(spaninfo_v1.location, + s->location, + sizeof(spaninfo_v1.location)); + + if (s->spantype) { + dahdi_copy_string(spaninfo_v1.spantype, + s->spantype, + sizeof(spaninfo_v1.spantype)); + } + + if (copy_to_user((void __user *)data, &spaninfo_v1, + sizeof(spaninfo_v1))) { + return -EFAULT; + } + return 0; +} + +static int dahdi_common_ioctl(struct file *file, unsigned int cmd, + unsigned long data, int unit) +{ switch (cmd) { /* get channel parameters */ case DAHDI_GET_PARAMS_V1: /* Intentional drop through. */ @@ -4029,129 +4187,11 @@ static int dahdi_common_ioctl(struct file *file, unsigned int cmd, unsigned long return dahdi_ioctl_setgains(file, data); case DAHDI_SPANSTAT: - size_to_copy = sizeof(struct dahdi_spaninfo); - if (copy_from_user(&stack.spaninfo, user_data, size_to_copy)) - return -EFAULT; - i = stack.spaninfo.spanno; /* get specified span number */ - if (i == 0) { - /* if to figure it out for this chan */ - if (!chans[unit]) - return -EINVAL; - i = chans[unit]->span->spanno; - } - s = find_span(i); - if (!s) - return -EINVAL; - stack.spaninfo.spanno = i; /* put the span # in here */ - stack.spaninfo.totalspans = span_count(); - dahdi_copy_string(stack.spaninfo.desc, s->desc, sizeof(stack.spaninfo.desc)); - dahdi_copy_string(stack.spaninfo.name, s->name, sizeof(stack.spaninfo.name)); - stack.spaninfo.alarms = s->alarms; /* get alarm status */ - stack.spaninfo.rxlevel = s->rxlevel; /* get rx level */ - stack.spaninfo.txlevel = s->txlevel; /* get tx level */ - - stack.spaninfo.bpvcount = s->count.bpv; - stack.spaninfo.crc4count = s->count.crc4; - stack.spaninfo.ebitcount = s->count.ebit; - stack.spaninfo.fascount = s->count.fas; - stack.spaninfo.fecount = s->count.fe; - stack.spaninfo.cvcount = s->count.cv; - stack.spaninfo.becount = s->count.be; - stack.spaninfo.prbs = s->count.prbs; - stack.spaninfo.errsec = s->count.errsec; - - stack.spaninfo.irqmisses = s->irqmisses; /* get IRQ miss count */ - stack.spaninfo.syncsrc = s->syncsrc; /* get active sync source */ - stack.spaninfo.totalchans = s->channels; - stack.spaninfo.numchans = 0; - for (j = 0; j < s->channels; j++) { - if (s->chans[j]->sig) - stack.spaninfo.numchans++; - } - stack.spaninfo.lbo = s->lbo; - stack.spaninfo.lineconfig = s->lineconfig; - stack.spaninfo.irq = s->irq; - stack.spaninfo.linecompat = s->linecompat; - dahdi_copy_string(stack.spaninfo.lboname, dahdi_lboname(s->lbo), sizeof(stack.spaninfo.lboname)); - if (s->manufacturer) - dahdi_copy_string(stack.spaninfo.manufacturer, s->manufacturer, - sizeof(stack.spaninfo.manufacturer)); - if (s->devicetype) - dahdi_copy_string(stack.spaninfo.devicetype, s->devicetype, sizeof(stack.spaninfo.devicetype)); - dahdi_copy_string(stack.spaninfo.location, s->location, sizeof(stack.spaninfo.location)); - if (s->spantype) - dahdi_copy_string(stack.spaninfo.spantype, s->spantype, sizeof(stack.spaninfo.spantype)); - - if (copy_to_user(user_data, &stack.spaninfo, size_to_copy)) - return -EFAULT; - break; + return dahdi_ioctl_spanstat(file, data); + case DAHDI_SPANSTAT_V1: - size_to_copy = sizeof(struct dahdi_spaninfo_v1); - if (copy_from_user(&stack.spaninfo_v1, - (__user struct dahdi_spaninfo_v1 *) data, - size_to_copy)) - return -EFAULT; - i = stack.spaninfo_v1.spanno; /* get specified span number */ - if (i == 0) { - /* if to figure it out for this chan */ - if (!chans[unit]) - return -EINVAL; - i = chans[unit]->span->spanno; - } - s = find_span(i); - if (!s) - return -EINVAL; - stack.spaninfo_v1.spanno = i; /* put the span # in here */ - stack.spaninfo_v1.totalspans = 0; - stack.spaninfo_v1.totalspans = span_count(); - dahdi_copy_string(stack.spaninfo_v1.desc, - s->desc, - sizeof(stack.spaninfo_v1.desc)); - dahdi_copy_string(stack.spaninfo_v1.name, - s->name, - sizeof(stack.spaninfo_v1.name)); - stack.spaninfo_v1.alarms = s->alarms; - stack.spaninfo_v1.bpvcount = s->count.bpv; - stack.spaninfo_v1.rxlevel = s->rxlevel; - stack.spaninfo_v1.txlevel = s->txlevel; - stack.spaninfo_v1.crc4count = s->count.crc4; - stack.spaninfo_v1.ebitcount = s->count.ebit; - stack.spaninfo_v1.fascount = s->count.fas; - stack.spaninfo_v1.irqmisses = s->irqmisses; - stack.spaninfo_v1.syncsrc = s->syncsrc; - stack.spaninfo_v1.totalchans = s->channels; - stack.spaninfo_v1.numchans = 0; - for (j = 0; j < s->channels; j++) { - if (s->chans[j]->sig) - stack.spaninfo_v1.numchans++; - } - stack.spaninfo_v1.lbo = s->lbo; - stack.spaninfo_v1.lineconfig = s->lineconfig; - stack.spaninfo_v1.irq = s->irq; - stack.spaninfo_v1.linecompat = s->linecompat; - dahdi_copy_string(stack.spaninfo_v1.lboname, - dahdi_lboname(s->lbo), - sizeof(stack.spaninfo_v1.lboname)); - if (s->manufacturer) - dahdi_copy_string(stack.spaninfo_v1.manufacturer, - s->manufacturer, - sizeof(stack.spaninfo_v1.manufacturer)); - if (s->devicetype) - dahdi_copy_string(stack.spaninfo_v1.devicetype, - s->devicetype, - sizeof(stack.spaninfo_v1.devicetype)); - dahdi_copy_string(stack.spaninfo_v1.location, - s->location, - sizeof(stack.spaninfo_v1.location)); - if (s->spantype) - dahdi_copy_string(stack.spaninfo_v1.spantype, - s->spantype, - sizeof(stack.spaninfo_v1.spantype)); - - if (copy_to_user((__user struct dahdi_spaninfo_v1 *) data, - &stack.spaninfo_v1, size_to_copy)) - return -EFAULT; - break; + return dahdi_ioctl_spanstat_v1(file, data); + case DAHDI_CHANDIAG_V1: /* Intentional drop through. */ case DAHDI_CHANDIAG: return dahdi_ioctl_chandiag(file, data); |