summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShaun Ruffell <sruffell@digium.com>2010-09-20 20:34:11 +0000
committerShaun Ruffell <sruffell@digium.com>2010-09-20 20:34:11 +0000
commit721ffd5ee1505ebb3c8cee041ec85f503f6bdf86 (patch)
tree21e4c99e81f19ef29b0e204d73d99b8ce6a444cc
parentc639efc69dade86a441cbdcd52bb8e597a8d9f79 (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.c300
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);