[svn-commits] sruffell: linux/trunk r9748 - /linux/trunk/drivers/dahdi/wctdm24xxp/base.c
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Wed Feb 9 12:57:56 CST 2011
Author: sruffell
Date: Wed Feb 9 12:57:53 2011
New Revision: 9748
URL: http://svnview.digium.com/svn/dahdi?view=rev&rev=9748
Log:
wctdm24xxp: Remove the wctdm_regs structure from the stack in wctdm_ioctl.
Drops the size of the wctdm_ioctl stack from 524 to 204 bytes.
Signed-off-by: Shaun Ruffell <sruffell at digium.com>
Modified:
linux/trunk/drivers/dahdi/wctdm24xxp/base.c
Modified: linux/trunk/drivers/dahdi/wctdm24xxp/base.c
URL: http://svnview.digium.com/svn/dahdi/linux/trunk/drivers/dahdi/wctdm24xxp/base.c?view=diff&rev=9748&r1=9747&r2=9748
==============================================================================
--- linux/trunk/drivers/dahdi/wctdm24xxp/base.c (original)
+++ linux/trunk/drivers/dahdi/wctdm24xxp/base.c Wed Feb 9 12:57:53 2011
@@ -3000,11 +3000,36 @@
return;
}
+static void wctdm24xxp_get_fxs_regs(struct wctdm *wc, struct dahdi_chan *chan,
+ struct wctdm_regs *regs)
+{
+ int x;
+ for (x = 0; x < NUM_INDIRECT_REGS; x++)
+ regs->indirect[x] = wctdm_proslic_getreg_indirect(wc,
+ chan->chanpos - 1, x);
+ for (x = 0; x < NUM_REGS; x++)
+ regs->direct[x] = wctdm_getreg(wc, chan->chanpos - 1, x);
+}
+
+static void wctdm24xxp_get_fxo_regs(struct wctdm *wc, struct dahdi_chan *chan,
+ struct wctdm_regs *regs)
+{
+ int x;
+ for (x = 0; x < NUM_FXO_REGS; x++)
+ regs->direct[x] = wctdm_getreg(wc, chan->chanpos - 1, x);
+}
+
+static void wctdm24xxp_get_qrv_regs(struct wctdm *wc, struct dahdi_chan *chan,
+ struct wctdm_regs *regs)
+{
+ int x;
+ for (x = 0; x < 0x32; x++)
+ regs->direct[x] = wctdm_getreg(wc, chan->chanpos - 1, x);
+}
static int wctdm_ioctl(struct dahdi_chan *chan, unsigned int cmd, unsigned long data)
{
struct wctdm_stats stats;
- struct wctdm_regs regs;
struct wctdm_regop regop;
struct wctdm_echo_coefs echoregs;
struct dahdi_hwgain hwgain;
@@ -3086,23 +3111,26 @@
return -EFAULT;
break;
case WCTDM_GET_REGS:
- if (wc->modtype[chan->chanpos - 1] == MOD_TYPE_FXS) {
- for (x=0;x<NUM_INDIRECT_REGS;x++)
- regs.indirect[x] = wctdm_proslic_getreg_indirect(wc, chan->chanpos -1, x);
- for (x=0;x<NUM_REGS;x++)
- regs.direct[x] = wctdm_getreg(wc, chan->chanpos - 1, x);
- } else if (wc->modtype[chan->chanpos - 1] == MOD_TYPE_QRV) {
- memset(®s, 0, sizeof(regs));
- for (x=0;x<0x32;x++)
- regs.direct[x] = wctdm_getreg(wc, chan->chanpos - 1, x);
- } else {
- memset(®s, 0, sizeof(regs));
- for (x=0;x<NUM_FXO_REGS;x++)
- regs.direct[x] = wctdm_getreg(wc, chan->chanpos - 1, x);
- }
- if (copy_to_user((__user void *)data, ®s, sizeof(regs)))
+ {
+ struct wctdm_regs *regs = kzalloc(sizeof(*regs), GFP_KERNEL);
+ if (!regs)
+ return -ENOMEM;
+
+ if (wc->modtype[chan->chanpos - 1] == MOD_TYPE_FXS)
+ wctdm24xxp_get_fxs_regs(wc, chan, regs);
+ else if (wc->modtype[chan->chanpos - 1] == MOD_TYPE_QRV)
+ wctdm24xxp_get_qrv_regs(wc, chan, regs);
+ else
+ wctdm24xxp_get_fxo_regs(wc, chan, regs);
+
+ if (copy_to_user((__user void *)data, regs, sizeof(*regs))) {
+ kfree(regs);
return -EFAULT;
+ }
+
+ kfree(regs);
break;
+ }
case WCTDM_SET_REG:
if (copy_from_user(®op, (__user void *) data, sizeof(regop)))
return -EFAULT;
More information about the svn-commits
mailing list