diff options
author | Kevin P. Fleming <kpfleming@digium.com> | 2008-05-21 15:11:48 +0000 |
---|---|---|
committer | Kevin P. Fleming <kpfleming@digium.com> | 2008-05-21 15:11:48 +0000 |
commit | 802b567e6c7ba7803a950324cbed13f7d57944cb (patch) | |
tree | 6b90ca3119aaa2e4073d3b651ac965dea5d3430e /drivers/dahdi/hpec | |
parent | ec5ce88e015b41c2f46f6c9b783339b945f9502a (diff) |
start copying kernel bits
git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@4315 a0bf4364-ded3-4de4-8d8a-66a801d63aff
Diffstat (limited to 'drivers/dahdi/hpec')
-rw-r--r-- | drivers/dahdi/hpec/hpec.h | 47 | ||||
-rw-r--r-- | drivers/dahdi/hpec/hpec_user.h | 40 | ||||
-rw-r--r-- | drivers/dahdi/hpec/hpec_zaptel.h | 146 |
3 files changed, 233 insertions, 0 deletions
diff --git a/drivers/dahdi/hpec/hpec.h b/drivers/dahdi/hpec/hpec.h new file mode 100644 index 0000000..7e90f12 --- /dev/null +++ b/drivers/dahdi/hpec/hpec.h @@ -0,0 +1,47 @@ +/* + * Zapata Telephony Interface to Digium High-Performance Echo Canceller + * + * Copyright (C) 2006 Digium, Inc. + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#if !defined(_HPEC_H) +#define _HPEC_H + +struct echo_can_state; + +void __attribute__((regparm(0))) hpec_init(int __attribute__((regparm(0))) __attribute__((format (printf, 1, 2))) (*logger)(const char *format, ...), + unsigned int debug, + unsigned int chunk_size, + void * (*memalloc)(size_t len), + void (*memfree)(void *ptr)); + +void __attribute__((regparm(0))) hpec_shutdown(void); + +int __attribute__((regparm(0))) hpec_license_challenge(struct hpec_challenge *challenge); + +int __attribute__((regparm(0))) hpec_license_check(struct hpec_license *license); + +struct echo_can_state __attribute__((regparm(0))) *hpec_channel_alloc(unsigned int len); + +void __attribute__((regparm(0))) hpec_channel_free(struct echo_can_state *channel); + +void __attribute__((regparm(0))) hpec_channel_update(struct echo_can_state *channel, short *iref, short *isig); + +#endif /* !defined(_HPEC_H) */ + diff --git a/drivers/dahdi/hpec/hpec_user.h b/drivers/dahdi/hpec/hpec_user.h new file mode 100644 index 0000000..bf006eb --- /dev/null +++ b/drivers/dahdi/hpec/hpec_user.h @@ -0,0 +1,40 @@ +/* + * Zapata Telephony Interface to Digium High-Performance Echo Canceller + * + * Copyright (C) 2006 Digium, Inc. + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#if !defined(_HPEC_USER_H) +#define _HPEC_USER_H + +struct hpec_challenge { + __u8 challenge[16]; +}; + +struct hpec_license { + __u32 numchannels; + __u8 userinfo[256]; + __u8 response[16]; +}; + +#define ZT_EC_LICENSE_CHALLENGE _IOR(ZT_CODE, 60, struct hpec_challenge) +#define ZT_EC_LICENSE_RESPONSE _IOW(ZT_CODE, 61, struct hpec_license) + +#endif /* !defined(_HPEC_USER_H) */ + diff --git a/drivers/dahdi/hpec/hpec_zaptel.h b/drivers/dahdi/hpec/hpec_zaptel.h new file mode 100644 index 0000000..2f90571 --- /dev/null +++ b/drivers/dahdi/hpec/hpec_zaptel.h @@ -0,0 +1,146 @@ +/* + * Zapata Telephony Interface to Digium High-Performance Echo Canceller + * + * Copyright (C) 2006 Digium, Inc. + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#if !defined(_HPEC_ZAPTEL_H) +#define _HPEC_ZAPTEL_H + +#define ZT_EC_ARRAY_UPDATE + +#include "hpec_user.h" +#include "hpec.h" + +static int __attribute__((regparm(0))) __attribute__((format (printf, 1, 2))) logger(const char *format, ...) +{ + int res; + va_list args; + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,9) + va_start(args, format); + res = vprintk(format, args); + va_end(args); +#else + char buf[256]; + + va_start(args, format); + res = vsnprintf(buf, sizeof(buf), format, args); + va_end(args); + printk(buf); +#endif + + return res; +} + +static void *memalloc(size_t len) +{ + return kmalloc(len, GFP_KERNEL); +} + +static void memfree(void *ptr) +{ + kfree(ptr); +} + +static void echo_can_init(void) +{ + printk("Zaptel Echo Canceller: Digium High-Performance Echo Canceller\n"); + hpec_init(logger, debug, ZT_CHUNKSIZE, memalloc, memfree); +} + +static void echo_can_identify(char *buf, size_t len) +{ + zap_copy_string(buf, "HPEC", len); +} + +static void echo_can_shutdown(void) +{ + hpec_shutdown(); +} + +static inline void echo_can_free(struct echo_can_state *ec) +{ + hpec_channel_free(ec); +} + +static inline void echo_can_array_update(struct echo_can_state *ec, short *iref, short *isig) +{ + hpec_channel_update(ec, iref, isig); +} + +DECLARE_MUTEX(alloc_lock); + +static int echo_can_create(struct zt_echocanparams *ecp, struct zt_echocanparam *p, + struct echo_can_state **ec) +{ + if (ecp->param_count > 0) { + printk(KERN_WARNING "HPEC does not support parameters; failing request\n"); + return -EINVAL; + } + + if (down_interruptible(&alloc_lock)) + return -ENOTTY; + + *ec = hpec_channel_alloc(ecp->tap_length); + + up(&alloc_lock); + + return *ec ? 0 : -ENOTTY; +} + +static inline int echo_can_traintap(struct echo_can_state *ec, int pos, short val) +{ + return 1; +} + +DECLARE_MUTEX(license_lock); + +static int hpec_license_ioctl(unsigned int cmd, unsigned long data) +{ + struct hpec_challenge challenge; + struct hpec_license license; + int result = 0; + + switch (cmd) { + case ZT_EC_LICENSE_CHALLENGE: + if (down_interruptible(&license_lock)) + return -EINTR; + memset(&challenge, 0, sizeof(challenge)); + if (hpec_license_challenge(&challenge)) + result = -ENODEV; + if (!result && copy_to_user((unsigned char *) data, &challenge, sizeof(challenge))) + result = -EFAULT; + up(&license_lock); + return result; + case ZT_EC_LICENSE_RESPONSE: + if (down_interruptible(&license_lock)) + return -EINTR; + if (copy_from_user(&license, (unsigned char *) data, sizeof(license))) + result = -EFAULT; + if (!result && hpec_license_check(&license)) + result = -EACCES; + up(&license_lock); + return result; + default: + return -ENOSYS; + } +} + +#endif /* !defined(_HPEC_ZAPTEL_H) */ |