|  | /**************************************************************************** | 
|  | *    ixj.c | 
|  | * | 
|  | * Device Driver for Quicknet Technologies, Inc.'s Telephony cards | 
|  | * including the Internet PhoneJACK, Internet PhoneJACK Lite, | 
|  | * Internet PhoneJACK PCI, Internet LineJACK, Internet PhoneCARD and | 
|  | * SmartCABLE | 
|  | * | 
|  | *    (c) Copyright 1999-2001  Quicknet Technologies, Inc. | 
|  | * | 
|  | *    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. | 
|  | * | 
|  | * Author:          Ed Okerson, <eokerson@quicknet.net> | 
|  | * | 
|  | * Contributors:    Greg Herlein, <gherlein@quicknet.net> | 
|  | *                  David W. Erhart, <derhart@quicknet.net> | 
|  | *                  John Sellers, <jsellers@quicknet.net> | 
|  | *                  Mike Preston, <mpreston@quicknet.net> | 
|  | * | 
|  | * Fixes:           David Huggins-Daines, <dhd@cepstral.com> | 
|  | *                  Fabio Ferrari, <fabio.ferrari@digitro.com.br> | 
|  | *                  Artis Kugevics, <artis@mt.lv> | 
|  | *                  Daniele Bellucci, <bellucda@tiscali.it> | 
|  | * | 
|  | * More information about the hardware related to this driver can be found | 
|  | * at our website:    http://www.quicknet.net | 
|  | * | 
|  | * IN NO EVENT SHALL QUICKNET TECHNOLOGIES, INC. BE LIABLE TO ANY PARTY FOR | 
|  | * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT | 
|  | * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF QUICKNET | 
|  | * TECHNOLOGIES, INC. HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
|  | * | 
|  | * QUICKNET TECHNOLOGIES, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES, | 
|  | * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY | 
|  | * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS | 
|  | * ON AN "AS IS" BASIS, AND QUICKNET TECHNOLOGIES, INC. HAS NO OBLIGATION | 
|  | * TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. | 
|  | * | 
|  | ***************************************************************************/ | 
|  |  | 
|  | /* | 
|  | * $Log: ixj.c,v $ | 
|  | * | 
|  | * Revision 4.8  2003/07/09 19:39:00  Daniele Bellucci | 
|  | * Audit some copy_*_user and minor cleanup. | 
|  | * | 
|  | * Revision 4.7  2001/08/13 06:19:33  craigs | 
|  | * Added additional changes from Alan Cox and John Anderson for | 
|  | * 2.2 to 2.4 cleanup and bounds checking | 
|  | * | 
|  | * Revision 4.6  2001/08/13 01:05:05  craigs | 
|  | * Really fixed PHONE_QUERY_CODEC problem this time | 
|  | * | 
|  | * Revision 4.5  2001/08/13 00:11:03  craigs | 
|  | * Fixed problem in handling of PHONE_QUERY_CODEC, thanks to Shane Anderson | 
|  | * | 
|  | * Revision 4.4  2001/08/07 07:58:12  craigs | 
|  | * Changed back to three digit version numbers | 
|  | * Added tagbuild target to allow automatic and easy tagging of versions | 
|  | * | 
|  | * Revision 4.3  2001/08/07 07:24:47  craigs | 
|  | * Added ixj-ver.h to allow easy configuration management of driver | 
|  | * Added display of version number in /prox/ixj | 
|  | * | 
|  | * Revision 4.2  2001/08/06 07:07:19  craigs | 
|  | * Reverted IXJCTL_DSP_TYPE and IXJCTL_DSP_VERSION files to original | 
|  | * behaviour of returning int rather than short * | 
|  | * | 
|  | * Revision 4.1  2001/08/05 00:17:37  craigs | 
|  | * More changes for correct PCMCIA installation | 
|  | * Start of changes for backward Linux compatibility | 
|  | * | 
|  | * Revision 4.0  2001/08/04 12:33:12  craigs | 
|  | * New version using GNU autoconf | 
|  | * | 
|  | * Revision 3.105  2001/07/20 23:14:32  eokerson | 
|  | * More work on CallerID generation when using ring cadences. | 
|  | * | 
|  | * Revision 3.104  2001/07/06 01:33:55  eokerson | 
|  | * Some bugfixes from Robert Vojta <vojta@ipex.cz> and a few mods to the Makefile. | 
|  | * | 
|  | * Revision 3.103  2001/07/05 19:20:16  eokerson | 
|  | * Updated HOWTO | 
|  | * Changed mic gain to 30dB on Internet LineJACK mic/speaker port. | 
|  | * | 
|  | * Revision 3.102  2001/07/03 23:51:21  eokerson | 
|  | * Un-mute mic on Internet LineJACK when in speakerphone mode. | 
|  | * | 
|  | * Revision 3.101  2001/07/02 19:26:56  eokerson | 
|  | * Removed initialiazation of ixjdebug and ixj_convert_loaded so they will go in the .bss instead of the .data | 
|  | * | 
|  | * Revision 3.100  2001/07/02 19:18:27  eokerson | 
|  | * Changed driver to make dynamic allocation possible.  We now pass IXJ * between functions instead of array indexes. | 
|  | * Fixed the way the POTS and PSTN ports interact during a PSTN call to allow local answering. | 
|  | * Fixed speaker mode on Internet LineJACK. | 
|  | * | 
|  | * Revision 3.99  2001/05/09 14:11:16  eokerson | 
|  | * Fixed kmalloc error in ixj_build_filter_cadence.  Thanks David Chan <cat@waulogy.stanford.edu>. | 
|  | * | 
|  | * Revision 3.98  2001/05/08 19:55:33  eokerson | 
|  | * Fixed POTS hookstate detection while it is connected to PSTN port. | 
|  | * | 
|  | * Revision 3.97  2001/05/08 00:01:04  eokerson | 
|  | * Fixed kernel oops when sending caller ID data. | 
|  | * | 
|  | * Revision 3.96  2001/05/04 23:09:30  eokerson | 
|  | * Now uses one kernel timer for each card, instead of one for the entire driver. | 
|  | * | 
|  | * Revision 3.95  2001/04/25 22:06:47  eokerson | 
|  | * Fixed squawking at beginning of some G.723.1 calls. | 
|  | * | 
|  | * Revision 3.94  2001/04/03 23:42:00  eokerson | 
|  | * Added linear volume ioctls | 
|  | * Added raw filter load ioctl | 
|  | * | 
|  | * Revision 3.93  2001/02/27 01:00:06  eokerson | 
|  | * Fixed blocking in CallerID. | 
|  | * Reduced size of ixj structure for smaller driver footprint. | 
|  | * | 
|  | * Revision 3.92  2001/02/20 22:02:59  eokerson | 
|  | * Fixed isapnp and pcmcia module compatibility for 2.4.x kernels. | 
|  | * Improved PSTN ring detection. | 
|  | * Fixed wink generation on POTS ports. | 
|  | * | 
|  | * Revision 3.91  2001/02/13 00:55:44  eokerson | 
|  | * Turn AEC back on after changing frame sizes. | 
|  | * | 
|  | * Revision 3.90  2001/02/12 16:42:00  eokerson | 
|  | * Added ALAW codec, thanks to Fabio Ferrari for the table based converters to make ALAW from ULAW. | 
|  | * | 
|  | * Revision 3.89  2001/02/12 15:41:16  eokerson | 
|  | * Fix from Artis Kugevics - Tone gains were not being set correctly. | 
|  | * | 
|  | * Revision 3.88  2001/02/05 23:25:42  eokerson | 
|  | * Fixed lockup bugs with deregister. | 
|  | * | 
|  | * Revision 3.87  2001/01/29 21:00:39  eokerson | 
|  | * Fix from Fabio Ferrari <fabio.ferrari@digitro.com.br> to properly handle EAGAIN and EINTR during non-blocking write. | 
|  | * Updated copyright date. | 
|  | * | 
|  | * Revision 3.86  2001/01/23 23:53:46  eokerson | 
|  | * Fixes to G.729 compatibility. | 
|  | * | 
|  | * Revision 3.85  2001/01/23 21:30:36  eokerson | 
|  | * Added verbage about cards supported. | 
|  | * Removed commands that put the card in low power mode at some times that it should not be in low power mode. | 
|  | * | 
|  | * Revision 3.84  2001/01/22 23:32:10  eokerson | 
|  | * Some bugfixes from David Huggins-Daines, <dhd@cepstral.com> and other cleanups. | 
|  | * | 
|  | * Revision 3.83  2001/01/19 14:51:41  eokerson | 
|  | * Fixed ixj_WriteDSPCommand to decrement usage counter when command fails. | 
|  | * | 
|  | * Revision 3.82  2001/01/19 00:34:49  eokerson | 
|  | * Added verbosity to write overlap errors. | 
|  | * | 
|  | * Revision 3.81  2001/01/18 23:56:54  eokerson | 
|  | * Fixed PSTN line test functions. | 
|  | * | 
|  | * Revision 3.80  2001/01/18 22:29:27  eokerson | 
|  | * Updated AEC/AGC values for different cards. | 
|  | * | 
|  | * Revision 3.79  2001/01/17 02:58:54  eokerson | 
|  | * Fixed AEC reset after Caller ID. | 
|  | * Fixed Codec lockup after Caller ID on Call Waiting when not using 30ms frames. | 
|  | * | 
|  | * Revision 3.78  2001/01/16 19:43:09  eokerson | 
|  | * Added support for Linux 2.4.x kernels. | 
|  | * | 
|  | * Revision 3.77  2001/01/09 04:00:52  eokerson | 
|  | * Linetest will now test the line, even if it has previously succeded. | 
|  | * | 
|  | * Revision 3.76  2001/01/08 19:27:00  eokerson | 
|  | * Fixed problem with standard cable on Internet PhoneCARD. | 
|  | * | 
|  | * Revision 3.75  2000/12/22 16:52:14  eokerson | 
|  | * Modified to allow hookstate detection on the POTS port when the PSTN port is selected. | 
|  | * | 
|  | * Revision 3.74  2000/12/08 22:41:50  eokerson | 
|  | * Added capability for G729B. | 
|  | * | 
|  | * Revision 3.73  2000/12/07 23:35:16  eokerson | 
|  | * Added capability to have different ring pattern before CallerID data. | 
|  | * Added hookstate checks in CallerID routines to stop FSK. | 
|  | * | 
|  | * Revision 3.72  2000/12/06 19:31:31  eokerson | 
|  | * Modified signal behavior to only send one signal per event. | 
|  | * | 
|  | * Revision 3.71  2000/12/06 03:23:08  eokerson | 
|  | * Fixed CallerID on Call Waiting. | 
|  | * | 
|  | * Revision 3.70  2000/12/04 21:29:37  eokerson | 
|  | * Added checking to Smart Cable gain functions. | 
|  | * | 
|  | * Revision 3.69  2000/12/04 21:05:20  eokerson | 
|  | * Changed ixjdebug levels. | 
|  | * Added ioctls to change gains in Internet Phone CARD Smart Cable. | 
|  | * | 
|  | * Revision 3.68  2000/12/04 00:17:21  craigs | 
|  | * Changed mixer voice gain to +6dB rather than 0dB | 
|  | * | 
|  | * Revision 3.67  2000/11/30 21:25:51  eokerson | 
|  | * Fixed write signal errors. | 
|  | * | 
|  | * Revision 3.66  2000/11/29 22:42:44  eokerson | 
|  | * Fixed PSTN ring detect problems. | 
|  | * | 
|  | * Revision 3.65  2000/11/29 07:31:55  craigs | 
|  | * Added new 425Hz filter co-efficients | 
|  | * Added card-specific DTMF prescaler initialisation | 
|  | * | 
|  | * Revision 3.64  2000/11/28 14:03:32  craigs | 
|  | * Changed certain mixer initialisations to be 0dB rather than 12dB | 
|  | * Added additional information to /proc/ixj | 
|  | * | 
|  | * Revision 3.63  2000/11/28 11:38:41  craigs | 
|  | * Added display of AEC modes in AUTO and AGC mode | 
|  | * | 
|  | * Revision 3.62  2000/11/28 04:05:44  eokerson | 
|  | * Improved PSTN ring detection routine. | 
|  | * | 
|  | * Revision 3.61  2000/11/27 21:53:12  eokerson | 
|  | * Fixed flash detection. | 
|  | * | 
|  | * Revision 3.60  2000/11/27 15:57:29  eokerson | 
|  | * More work on G.729 load routines. | 
|  | * | 
|  | * Revision 3.59  2000/11/25 21:55:12  eokerson | 
|  | * Fixed errors in G.729 load routine. | 
|  | * | 
|  | * Revision 3.58  2000/11/25 04:08:29  eokerson | 
|  | * Added board locks around G.729 and TS85 load routines. | 
|  | * | 
|  | * Revision 3.57  2000/11/24 05:35:17  craigs | 
|  | * Added ability to retrieve mixer values on LineJACK | 
|  | * Added complete initialisation of all mixer values at startup | 
|  | * Fixed spelling mistake | 
|  | * | 
|  | * Revision 3.56  2000/11/23 02:52:11  robertj | 
|  | * Added cvs change log keyword. | 
|  | * Fixed bug in capabilities list when using G.729 module. | 
|  | * | 
|  | */ | 
|  |  | 
|  | #include "ixj-ver.h" | 
|  |  | 
|  | #define PERFMON_STATS | 
|  | #define IXJDEBUG 0 | 
|  | #define MAXRINGS 5 | 
|  |  | 
|  | #include <linux/module.h> | 
|  |  | 
|  | #include <linux/init.h> | 
|  | #include <linux/sched.h> | 
|  | #include <linux/kernel.h>	/* printk() */ | 
|  | #include <linux/fs.h>		/* everything... */ | 
|  | #include <linux/errno.h>	/* error codes */ | 
|  | #include <linux/slab.h> | 
|  | #include <linux/mm.h> | 
|  | #include <linux/ioport.h> | 
|  | #include <linux/interrupt.h> | 
|  | #include <linux/proc_fs.h> | 
|  | #include <linux/poll.h> | 
|  | #include <linux/timer.h> | 
|  | #include <linux/delay.h> | 
|  | #include <linux/pci.h> | 
|  |  | 
|  | #include <asm/io.h> | 
|  | #include <asm/uaccess.h> | 
|  |  | 
|  | #include <linux/isapnp.h> | 
|  |  | 
|  | #include "ixj.h" | 
|  |  | 
|  | #define TYPE(inode) (iminor(inode) >> 4) | 
|  | #define NUM(inode) (iminor(inode) & 0xf) | 
|  |  | 
|  | static int ixjdebug; | 
|  | static int hertz = HZ; | 
|  | static int samplerate = 100; | 
|  |  | 
|  | module_param(ixjdebug, int, 0); | 
|  |  | 
|  | /************************************************************************ | 
|  | * | 
|  | * ixjdebug meanings are now bit mapped instead of level based | 
|  | * Values can be or'ed together to turn on multiple messages | 
|  | * | 
|  | * bit  0 (0x0001) = any failure | 
|  | * bit  1 (0x0002) = general messages | 
|  | * bit  2 (0x0004) = POTS ringing related | 
|  | * bit  3 (0x0008) = PSTN events | 
|  | * bit  4 (0x0010) = PSTN Cadence state details | 
|  | * bit  5 (0x0020) = Tone detection triggers | 
|  | * bit  6 (0x0040) = Tone detection cadence details | 
|  | * bit  7 (0x0080) = ioctl tracking | 
|  | * bit  8 (0x0100) = signal tracking | 
|  | * bit  9 (0x0200) = CallerID generation details | 
|  | * | 
|  | ************************************************************************/ | 
|  |  | 
|  | #ifdef IXJ_DYN_ALLOC | 
|  |  | 
|  | static IXJ *ixj[IXJMAX]; | 
|  | #define	get_ixj(b)	ixj[(b)] | 
|  |  | 
|  | /* | 
|  | *	Allocate a free IXJ device | 
|  | */ | 
|  |  | 
|  | static IXJ *ixj_alloc() | 
|  | { | 
|  | for(cnt=0; cnt<IXJMAX; cnt++) | 
|  | { | 
|  | if(ixj[cnt] == NULL || !ixj[cnt]->DSPbase) | 
|  | { | 
|  | j = kmalloc(sizeof(IXJ), GFP_KERNEL); | 
|  | if (j == NULL) | 
|  | return NULL; | 
|  | ixj[cnt] = j; | 
|  | return j; | 
|  | } | 
|  | } | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | static void ixj_fsk_free(IXJ *j) | 
|  | { | 
|  | kfree(j->fskdata); | 
|  | j->fskdata = NULL; | 
|  | } | 
|  |  | 
|  | static void ixj_fsk_alloc(IXJ *j) | 
|  | { | 
|  | if(!j->fskdata) { | 
|  | j->fskdata = kmalloc(8000, GFP_KERNEL); | 
|  | if (!j->fskdata) { | 
|  | if(ixjdebug & 0x0200) { | 
|  | printk("IXJ phone%d - allocate failed\n", j->board); | 
|  | } | 
|  | return; | 
|  | } else { | 
|  | j->fsksize = 8000; | 
|  | if(ixjdebug & 0x0200) { | 
|  | printk("IXJ phone%d - allocate succeded\n", j->board); | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | #else | 
|  |  | 
|  | static IXJ ixj[IXJMAX]; | 
|  | #define	get_ixj(b)	(&ixj[(b)]) | 
|  |  | 
|  | /* | 
|  | *	Allocate a free IXJ device | 
|  | */ | 
|  |  | 
|  | static IXJ *ixj_alloc(void) | 
|  | { | 
|  | int cnt; | 
|  | for(cnt=0; cnt<IXJMAX; cnt++) { | 
|  | if(!ixj[cnt].DSPbase) | 
|  | return &ixj[cnt]; | 
|  | } | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | static inline void ixj_fsk_free(IXJ *j) {;} | 
|  |  | 
|  | static inline void ixj_fsk_alloc(IXJ *j) | 
|  | { | 
|  | j->fsksize = 8000; | 
|  | } | 
|  |  | 
|  | #endif | 
|  |  | 
|  | #ifdef PERFMON_STATS | 
|  | #define ixj_perfmon(x)	((x)++) | 
|  | #else | 
|  | #define ixj_perfmon(x)	do { } while(0) | 
|  | #endif | 
|  |  | 
|  | static int ixj_convert_loaded; | 
|  |  | 
|  | static int ixj_WriteDSPCommand(unsigned short, IXJ *j); | 
|  |  | 
|  | /************************************************************************ | 
|  | * | 
|  | * These are function definitions to allow external modules to register | 
|  | * enhanced functionality call backs. | 
|  | * | 
|  | ************************************************************************/ | 
|  |  | 
|  | static int Stub(IXJ * J, unsigned long arg) | 
|  | { | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static IXJ_REGFUNC ixj_PreRead = &Stub; | 
|  | static IXJ_REGFUNC ixj_PostRead = &Stub; | 
|  | static IXJ_REGFUNC ixj_PreWrite = &Stub; | 
|  | static IXJ_REGFUNC ixj_PostWrite = &Stub; | 
|  |  | 
|  | static void ixj_read_frame(IXJ *j); | 
|  | static void ixj_write_frame(IXJ *j); | 
|  | static void ixj_init_timer(IXJ *j); | 
|  | static void ixj_add_timer(IXJ *	j); | 
|  | static void ixj_timeout(unsigned long ptr); | 
|  | static int read_filters(IXJ *j); | 
|  | static int LineMonitor(IXJ *j); | 
|  | static int ixj_fasync(int fd, struct file *, int mode); | 
|  | static int ixj_set_port(IXJ *j, int arg); | 
|  | static int ixj_set_pots(IXJ *j, int arg); | 
|  | static int ixj_hookstate(IXJ *j); | 
|  | static int ixj_record_start(IXJ *j); | 
|  | static void ixj_record_stop(IXJ *j); | 
|  | static void set_rec_volume(IXJ *j, int volume); | 
|  | static int get_rec_volume(IXJ *j); | 
|  | static int set_rec_codec(IXJ *j, int rate); | 
|  | static void ixj_vad(IXJ *j, int arg); | 
|  | static int ixj_play_start(IXJ *j); | 
|  | static void ixj_play_stop(IXJ *j); | 
|  | static int ixj_set_tone_on(unsigned short arg, IXJ *j); | 
|  | static int ixj_set_tone_off(unsigned short, IXJ *j); | 
|  | static int ixj_play_tone(IXJ *j, char tone); | 
|  | static void ixj_aec_start(IXJ *j, int level); | 
|  | static int idle(IXJ *j); | 
|  | static void ixj_ring_on(IXJ *j); | 
|  | static void ixj_ring_off(IXJ *j); | 
|  | static void aec_stop(IXJ *j); | 
|  | static void ixj_ringback(IXJ *j); | 
|  | static void ixj_busytone(IXJ *j); | 
|  | static void ixj_dialtone(IXJ *j); | 
|  | static void ixj_cpt_stop(IXJ *j); | 
|  | static char daa_int_read(IXJ *j); | 
|  | static char daa_CR_read(IXJ *j, int cr); | 
|  | static int daa_set_mode(IXJ *j, int mode); | 
|  | static int ixj_linetest(IXJ *j); | 
|  | static int ixj_daa_write(IXJ *j); | 
|  | static int ixj_daa_cid_read(IXJ *j); | 
|  | static void DAA_Coeff_US(IXJ *j); | 
|  | static void DAA_Coeff_UK(IXJ *j); | 
|  | static void DAA_Coeff_France(IXJ *j); | 
|  | static void DAA_Coeff_Germany(IXJ *j); | 
|  | static void DAA_Coeff_Australia(IXJ *j); | 
|  | static void DAA_Coeff_Japan(IXJ *j); | 
|  | static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf); | 
|  | static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr); | 
|  | static int ixj_init_tone(IXJ *j, IXJ_TONE * ti); | 
|  | static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp); | 
|  | static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp); | 
|  | /* Serial Control Interface funtions */ | 
|  | static int SCI_Control(IXJ *j, int control); | 
|  | static int SCI_Prepare(IXJ *j); | 
|  | static int SCI_WaitHighSCI(IXJ *j); | 
|  | static int SCI_WaitLowSCI(IXJ *j); | 
|  | static DWORD PCIEE_GetSerialNumber(WORD wAddress); | 
|  | static int ixj_PCcontrol_wait(IXJ *j); | 
|  | static void ixj_pre_cid(IXJ *j); | 
|  | static void ixj_write_cid(IXJ *j); | 
|  | static void ixj_write_cid_bit(IXJ *j, int bit); | 
|  | static int set_base_frame(IXJ *j, int size); | 
|  | static int set_play_codec(IXJ *j, int rate); | 
|  | static void set_rec_depth(IXJ *j, int depth); | 
|  | static int ixj_mixer(long val, IXJ *j); | 
|  |  | 
|  | /************************************************************************ | 
|  | CT8020/CT8021 Host Programmers Model | 
|  | Host address	Function					Access | 
|  | DSPbase + | 
|  | 0-1		Aux Software Status Register (reserved)		Read Only | 
|  | 2-3		Software Status Register			Read Only | 
|  | 4-5		Aux Software Control Register (reserved)	Read Write | 
|  | 6-7		Software Control Register			Read Write | 
|  | 8-9		Hardware Status Register			Read Only | 
|  | A-B		Hardware Control Register			Read Write | 
|  | C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only | 
|  | E-F Host Recieve (Read) Data Buffer Access Port (buffer input)	Read Only | 
|  | ************************************************************************/ | 
|  |  | 
|  | static inline void ixj_read_HSR(IXJ *j) | 
|  | { | 
|  | j->hsr.bytes.low = inb_p(j->DSPbase + 8); | 
|  | j->hsr.bytes.high = inb_p(j->DSPbase + 9); | 
|  | } | 
|  |  | 
|  | static inline int IsControlReady(IXJ *j) | 
|  | { | 
|  | ixj_read_HSR(j); | 
|  | return j->hsr.bits.controlrdy ? 1 : 0; | 
|  | } | 
|  |  | 
|  | static inline int IsPCControlReady(IXJ *j) | 
|  | { | 
|  | j->pccr1.byte = inb_p(j->XILINXbase + 3); | 
|  | return j->pccr1.bits.crr ? 1 : 0; | 
|  | } | 
|  |  | 
|  | static inline int IsStatusReady(IXJ *j) | 
|  | { | 
|  | ixj_read_HSR(j); | 
|  | return j->hsr.bits.statusrdy ? 1 : 0; | 
|  | } | 
|  |  | 
|  | static inline int IsRxReady(IXJ *j) | 
|  | { | 
|  | ixj_read_HSR(j); | 
|  | ixj_perfmon(j->rxreadycheck); | 
|  | return j->hsr.bits.rxrdy ? 1 : 0; | 
|  | } | 
|  |  | 
|  | static inline int IsTxReady(IXJ *j) | 
|  | { | 
|  | ixj_read_HSR(j); | 
|  | ixj_perfmon(j->txreadycheck); | 
|  | return j->hsr.bits.txrdy ? 1 : 0; | 
|  | } | 
|  |  | 
|  | static inline void set_play_volume(IXJ *j, int volume) | 
|  | { | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "IXJ: /dev/phone%d Setting Play Volume to 0x%4.4x\n", j->board, volume); | 
|  | ixj_WriteDSPCommand(0xCF02, j); | 
|  | ixj_WriteDSPCommand(volume, j); | 
|  | } | 
|  |  | 
|  | static int set_play_volume_linear(IXJ *j, int volume) | 
|  | { | 
|  | int newvolume, dspplaymax; | 
|  |  | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Play Volume to 0x%4.4x\n", j->board, volume); | 
|  | if(volume > 100 || volume < 0) { | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */ | 
|  | switch (j->cardtype) { | 
|  | case QTI_PHONEJACK: | 
|  | dspplaymax = 0x380; | 
|  | break; | 
|  | case QTI_LINEJACK: | 
|  | if(j->port == PORT_PSTN) { | 
|  | dspplaymax = 0x48; | 
|  | } else { | 
|  | dspplaymax = 0x100; | 
|  | } | 
|  | break; | 
|  | case QTI_PHONEJACK_LITE: | 
|  | dspplaymax = 0x380; | 
|  | break; | 
|  | case QTI_PHONEJACK_PCI: | 
|  | dspplaymax = 0x6C; | 
|  | break; | 
|  | case QTI_PHONECARD: | 
|  | dspplaymax = 0x50; | 
|  | break; | 
|  | default: | 
|  | return -1; | 
|  | } | 
|  | newvolume = (dspplaymax * volume) / 100; | 
|  | set_play_volume(j, newvolume); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static inline void set_play_depth(IXJ *j, int depth) | 
|  | { | 
|  | if (depth > 60) | 
|  | depth = 60; | 
|  | if (depth < 0) | 
|  | depth = 0; | 
|  | ixj_WriteDSPCommand(0x5280 + depth, j); | 
|  | } | 
|  |  | 
|  | static inline int get_play_volume(IXJ *j) | 
|  | { | 
|  | ixj_WriteDSPCommand(0xCF00, j); | 
|  | return j->ssr.high << 8 | j->ssr.low; | 
|  | } | 
|  |  | 
|  | static int get_play_volume_linear(IXJ *j) | 
|  | { | 
|  | int volume, newvolume, dspplaymax; | 
|  |  | 
|  | /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */ | 
|  | switch (j->cardtype) { | 
|  | case QTI_PHONEJACK: | 
|  | dspplaymax = 0x380; | 
|  | break; | 
|  | case QTI_LINEJACK: | 
|  | if(j->port == PORT_PSTN) { | 
|  | dspplaymax = 0x48; | 
|  | } else { | 
|  | dspplaymax = 0x100; | 
|  | } | 
|  | break; | 
|  | case QTI_PHONEJACK_LITE: | 
|  | dspplaymax = 0x380; | 
|  | break; | 
|  | case QTI_PHONEJACK_PCI: | 
|  | dspplaymax = 0x6C; | 
|  | break; | 
|  | case QTI_PHONECARD: | 
|  | dspplaymax = 100; | 
|  | break; | 
|  | default: | 
|  | return -1; | 
|  | } | 
|  | volume = get_play_volume(j); | 
|  | newvolume = (volume * 100) / dspplaymax; | 
|  | if(newvolume > 100) | 
|  | newvolume = 100; | 
|  | return newvolume; | 
|  | } | 
|  |  | 
|  | static inline BYTE SLIC_GetState(IXJ *j) | 
|  | { | 
|  | if (j->cardtype == QTI_PHONECARD) { | 
|  | j->pccr1.byte = 0; | 
|  | j->psccr.bits.dev = 3; | 
|  | j->psccr.bits.rw = 1; | 
|  | outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00); | 
|  | ixj_PCcontrol_wait(j); | 
|  | j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF; | 
|  | ixj_PCcontrol_wait(j); | 
|  | if (j->pslic.bits.powerdown) | 
|  | return PLD_SLIC_STATE_OC; | 
|  | else if (!j->pslic.bits.ring0 && !j->pslic.bits.ring1) | 
|  | return PLD_SLIC_STATE_ACTIVE; | 
|  | else | 
|  | return PLD_SLIC_STATE_RINGING; | 
|  | } else { | 
|  | j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01); | 
|  | } | 
|  | return j->pld_slicr.bits.state; | 
|  | } | 
|  |  | 
|  | static BOOL SLIC_SetState(BYTE byState, IXJ *j) | 
|  | { | 
|  | BOOL fRetVal = FALSE; | 
|  |  | 
|  | if (j->cardtype == QTI_PHONECARD) { | 
|  | if (j->flags.pcmciasct) { | 
|  | switch (byState) { | 
|  | case PLD_SLIC_STATE_TIPOPEN: | 
|  | case PLD_SLIC_STATE_OC: | 
|  | j->pslic.bits.powerdown = 1; | 
|  | j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0; | 
|  | fRetVal = TRUE; | 
|  | break; | 
|  | case PLD_SLIC_STATE_RINGING: | 
|  | if (j->readers || j->writers) { | 
|  | j->pslic.bits.powerdown = 0; | 
|  | j->pslic.bits.ring0 = 1; | 
|  | j->pslic.bits.ring1 = 0; | 
|  | fRetVal = TRUE; | 
|  | } | 
|  | break; | 
|  | case PLD_SLIC_STATE_OHT:	/* On-hook transmit */ | 
|  |  | 
|  | case PLD_SLIC_STATE_STANDBY: | 
|  | case PLD_SLIC_STATE_ACTIVE: | 
|  | if (j->readers || j->writers) { | 
|  | j->pslic.bits.powerdown = 0; | 
|  | } else { | 
|  | j->pslic.bits.powerdown = 1; | 
|  | } | 
|  | j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0; | 
|  | fRetVal = TRUE; | 
|  | break; | 
|  | case PLD_SLIC_STATE_APR:	/* Active polarity reversal */ | 
|  |  | 
|  | case PLD_SLIC_STATE_OHTPR:	/* OHT polarity reversal */ | 
|  |  | 
|  | default: | 
|  | fRetVal = FALSE; | 
|  | break; | 
|  | } | 
|  | j->psccr.bits.dev = 3; | 
|  | j->psccr.bits.rw = 0; | 
|  | outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00); | 
|  | ixj_PCcontrol_wait(j); | 
|  | } | 
|  | } else { | 
|  | /* Set the C1, C2, C3 & B2EN signals. */ | 
|  | switch (byState) { | 
|  | case PLD_SLIC_STATE_OC: | 
|  | j->pld_slicw.bits.c1 = 0; | 
|  | j->pld_slicw.bits.c2 = 0; | 
|  | j->pld_slicw.bits.c3 = 0; | 
|  | j->pld_slicw.bits.b2en = 0; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | fRetVal = TRUE; | 
|  | break; | 
|  | case PLD_SLIC_STATE_RINGING: | 
|  | j->pld_slicw.bits.c1 = 1; | 
|  | j->pld_slicw.bits.c2 = 0; | 
|  | j->pld_slicw.bits.c3 = 0; | 
|  | j->pld_slicw.bits.b2en = 1; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | fRetVal = TRUE; | 
|  | break; | 
|  | case PLD_SLIC_STATE_ACTIVE: | 
|  | j->pld_slicw.bits.c1 = 0; | 
|  | j->pld_slicw.bits.c2 = 1; | 
|  | j->pld_slicw.bits.c3 = 0; | 
|  | j->pld_slicw.bits.b2en = 0; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | fRetVal = TRUE; | 
|  | break; | 
|  | case PLD_SLIC_STATE_OHT:	/* On-hook transmit */ | 
|  |  | 
|  | j->pld_slicw.bits.c1 = 1; | 
|  | j->pld_slicw.bits.c2 = 1; | 
|  | j->pld_slicw.bits.c3 = 0; | 
|  | j->pld_slicw.bits.b2en = 0; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | fRetVal = TRUE; | 
|  | break; | 
|  | case PLD_SLIC_STATE_TIPOPEN: | 
|  | j->pld_slicw.bits.c1 = 0; | 
|  | j->pld_slicw.bits.c2 = 0; | 
|  | j->pld_slicw.bits.c3 = 1; | 
|  | j->pld_slicw.bits.b2en = 0; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | fRetVal = TRUE; | 
|  | break; | 
|  | case PLD_SLIC_STATE_STANDBY: | 
|  | j->pld_slicw.bits.c1 = 1; | 
|  | j->pld_slicw.bits.c2 = 0; | 
|  | j->pld_slicw.bits.c3 = 1; | 
|  | j->pld_slicw.bits.b2en = 1; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | fRetVal = TRUE; | 
|  | break; | 
|  | case PLD_SLIC_STATE_APR:	/* Active polarity reversal */ | 
|  |  | 
|  | j->pld_slicw.bits.c1 = 0; | 
|  | j->pld_slicw.bits.c2 = 1; | 
|  | j->pld_slicw.bits.c3 = 1; | 
|  | j->pld_slicw.bits.b2en = 0; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | fRetVal = TRUE; | 
|  | break; | 
|  | case PLD_SLIC_STATE_OHTPR:	/* OHT polarity reversal */ | 
|  |  | 
|  | j->pld_slicw.bits.c1 = 1; | 
|  | j->pld_slicw.bits.c2 = 1; | 
|  | j->pld_slicw.bits.c3 = 1; | 
|  | j->pld_slicw.bits.b2en = 0; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | fRetVal = TRUE; | 
|  | break; | 
|  | default: | 
|  | fRetVal = FALSE; | 
|  | break; | 
|  | } | 
|  | } | 
|  |  | 
|  | return fRetVal; | 
|  | } | 
|  |  | 
|  | static int ixj_wink(IXJ *j) | 
|  | { | 
|  | BYTE slicnow; | 
|  |  | 
|  | slicnow = SLIC_GetState(j); | 
|  |  | 
|  | j->pots_winkstart = jiffies; | 
|  | SLIC_SetState(PLD_SLIC_STATE_OC, j); | 
|  |  | 
|  | msleep(jiffies_to_msecs(j->winktime)); | 
|  |  | 
|  | SLIC_SetState(slicnow, j); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static void ixj_init_timer(IXJ *j) | 
|  | { | 
|  | init_timer(&j->timer); | 
|  | j->timer.function = ixj_timeout; | 
|  | j->timer.data = (unsigned long)j; | 
|  | } | 
|  |  | 
|  | static void ixj_add_timer(IXJ *j) | 
|  | { | 
|  | j->timer.expires = jiffies + (hertz / samplerate); | 
|  | add_timer(&j->timer); | 
|  | } | 
|  |  | 
|  | static void ixj_tone_timeout(IXJ *j) | 
|  | { | 
|  | IXJ_TONE ti; | 
|  |  | 
|  | j->tone_state++; | 
|  | if (j->tone_state == 3) { | 
|  | j->tone_state = 0; | 
|  | if (j->cadence_t) { | 
|  | j->tone_cadence_state++; | 
|  | if (j->tone_cadence_state >= j->cadence_t->elements_used) { | 
|  | switch (j->cadence_t->termination) { | 
|  | case PLAY_ONCE: | 
|  | ixj_cpt_stop(j); | 
|  | break; | 
|  | case REPEAT_LAST_ELEMENT: | 
|  | j->tone_cadence_state--; | 
|  | ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index); | 
|  | break; | 
|  | case REPEAT_ALL: | 
|  | j->tone_cadence_state = 0; | 
|  | if (j->cadence_t->ce[j->tone_cadence_state].freq0) { | 
|  | ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index; | 
|  | ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0; | 
|  | ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0; | 
|  | ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1; | 
|  | ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1; | 
|  | ixj_init_tone(j, &ti); | 
|  | } | 
|  | ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, j); | 
|  | ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, j); | 
|  | ixj_play_tone(j, j->cadence_t->ce[0].index); | 
|  | break; | 
|  | } | 
|  | } else { | 
|  | if (j->cadence_t->ce[j->tone_cadence_state].gain0) { | 
|  | ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index; | 
|  | ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0; | 
|  | ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0; | 
|  | ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1; | 
|  | ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1; | 
|  | ixj_init_tone(j, &ti); | 
|  | } | 
|  | ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, j); | 
|  | ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, j); | 
|  | ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index); | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | static inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir) | 
|  | { | 
|  | if(j->ixj_signals[event]) { | 
|  | if(ixjdebug & 0x0100) | 
|  | printk("Sending signal for event %d\n", event); | 
|  | /* Send apps notice of change */ | 
|  | /* see config.h for macro definition */ | 
|  | kill_fasync(&(j->async_queue), j->ixj_signals[event], dir); | 
|  | } | 
|  | } | 
|  |  | 
|  | static void ixj_pstn_state(IXJ *j) | 
|  | { | 
|  | int var; | 
|  | union XOPXR0 XR0, daaint; | 
|  |  | 
|  | var = 10; | 
|  |  | 
|  | XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg; | 
|  | daaint.reg = 0; | 
|  | XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR; | 
|  |  | 
|  | j->pld_scrr.byte = inb_p(j->XILINXbase); | 
|  | if (j->pld_scrr.bits.daaflag) { | 
|  | daa_int_read(j); | 
|  | if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) { | 
|  | if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) { | 
|  | daaint.bitreg.RING = 1; | 
|  | if(ixjdebug & 0x0008) { | 
|  | printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j->board, jiffies); | 
|  | } | 
|  | } else { | 
|  | daa_set_mode(j, SOP_PU_RESET); | 
|  | } | 
|  | } | 
|  | if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) { | 
|  | daaint.bitreg.Caller_ID = 1; | 
|  | j->pstn_cid_intr = 1; | 
|  | j->pstn_cid_received = jiffies; | 
|  | if(ixjdebug & 0x0008) { | 
|  | printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j->board, jiffies); | 
|  | } | 
|  | } | 
|  | if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) { | 
|  | daaint.bitreg.Cadence = 1; | 
|  | if(ixjdebug & 0x0008) { | 
|  | printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j->board, jiffies); | 
|  | } | 
|  | } | 
|  | if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) { | 
|  | daaint.bitreg.VDD_OK = 1; | 
|  | daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK; | 
|  | } | 
|  | } | 
|  | daa_CR_read(j, 1); | 
|  | if(j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR != XR0.bitreg.RMR && time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) { | 
|  | daaint.bitreg.RMR = 1; | 
|  | daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR; | 
|  | if(ixjdebug & 0x0008) { | 
|  | printk(KERN_INFO "IXJ DAA RMR /dev/phone%d was %s for %ld\n", j->board, XR0.bitreg.RMR?"on":"off", jiffies - j->pstn_last_rmr); | 
|  | } | 
|  | j->pstn_prev_rmr = j->pstn_last_rmr; | 
|  | j->pstn_last_rmr = jiffies; | 
|  | } | 
|  | switch(j->daa_mode) { | 
|  | case SOP_PU_SLEEP: | 
|  | if (daaint.bitreg.RING) { | 
|  | if (!j->flags.pstn_ringing) { | 
|  | if (j->daa_mode != SOP_PU_RINGING) { | 
|  | j->pstn_ring_int = jiffies; | 
|  | daa_set_mode(j, SOP_PU_RINGING); | 
|  | } | 
|  | } | 
|  | } | 
|  | break; | 
|  | case SOP_PU_RINGING: | 
|  | if (daaint.bitreg.RMR) { | 
|  | if (ixjdebug & 0x0008) { | 
|  | printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies); | 
|  | } | 
|  | if (daaint.bitreg.SI_1) {                /* Rising edge of RMR */ | 
|  | j->flags.pstn_rmr = 1; | 
|  | j->pstn_ring_start = jiffies; | 
|  | j->pstn_ring_stop = 0; | 
|  | j->ex.bits.pstn_ring = 0; | 
|  | if (j->cadence_f[4].state == 0) { | 
|  | j->cadence_f[4].state = 1; | 
|  | j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000); | 
|  | j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000); | 
|  | j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000); | 
|  | } else if (j->cadence_f[4].state == 2) { | 
|  | if((time_after(jiffies, j->cadence_f[4].off1min) && | 
|  | time_before(jiffies, j->cadence_f[4].off1max))) { | 
|  | if (j->cadence_f[4].on2) { | 
|  | j->cadence_f[4].state = 3; | 
|  | j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000)); | 
|  | j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000)); | 
|  | j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000)); | 
|  | } else { | 
|  | j->cadence_f[4].state = 7; | 
|  | } | 
|  | } else { | 
|  | if (ixjdebug & 0x0008) { | 
|  | printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", | 
|  | j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, | 
|  | j->cadence_f[4].off1); | 
|  | } | 
|  | j->cadence_f[4].state = 0; | 
|  | } | 
|  | } else if (j->cadence_f[4].state == 4) { | 
|  | if((time_after(jiffies, j->cadence_f[4].off2min) && | 
|  | time_before(jiffies, j->cadence_f[4].off2max))) { | 
|  | if (j->cadence_f[4].on3) { | 
|  | j->cadence_f[4].state = 5; | 
|  | j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000)); | 
|  | j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000)); | 
|  | j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000)); | 
|  | } else { | 
|  | j->cadence_f[4].state = 7; | 
|  | } | 
|  | } else { | 
|  | if (ixjdebug & 0x0008) { | 
|  | printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", | 
|  | j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, | 
|  | j->cadence_f[4].off2); | 
|  | } | 
|  | j->cadence_f[4].state = 0; | 
|  | } | 
|  | } else if (j->cadence_f[4].state == 6) { | 
|  | if((time_after(jiffies, j->cadence_f[4].off3min) && | 
|  | time_before(jiffies, j->cadence_f[4].off3max))) { | 
|  | j->cadence_f[4].state = 7; | 
|  | } else { | 
|  | if (ixjdebug & 0x0008) { | 
|  | printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", | 
|  | j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, | 
|  | j->cadence_f[4].off3); | 
|  | } | 
|  | j->cadence_f[4].state = 0; | 
|  | } | 
|  | } else { | 
|  | j->cadence_f[4].state = 0; | 
|  | } | 
|  | } else {                                /* Falling edge of RMR */ | 
|  | j->pstn_ring_start = 0; | 
|  | j->pstn_ring_stop = jiffies; | 
|  | if (j->cadence_f[4].state == 1) { | 
|  | if(!j->cadence_f[4].on1) { | 
|  | j->cadence_f[4].state = 7; | 
|  | } else if((time_after(jiffies, j->cadence_f[4].on1min) && | 
|  | time_before(jiffies, j->cadence_f[4].on1max))) { | 
|  | if (j->cadence_f[4].off1) { | 
|  | j->cadence_f[4].state = 2; | 
|  | j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000)); | 
|  | j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000)); | 
|  | j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000)); | 
|  | } else { | 
|  | j->cadence_f[4].state = 7; | 
|  | } | 
|  | } else { | 
|  | if (ixjdebug & 0x0008) { | 
|  | printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", | 
|  | j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, | 
|  | j->cadence_f[4].on1); | 
|  | } | 
|  | j->cadence_f[4].state = 0; | 
|  | } | 
|  | } else if (j->cadence_f[4].state == 3) { | 
|  | if((time_after(jiffies, j->cadence_f[4].on2min) && | 
|  | time_before(jiffies, j->cadence_f[4].on2max))) { | 
|  | if (j->cadence_f[4].off2) { | 
|  | j->cadence_f[4].state = 4; | 
|  | j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000)); | 
|  | j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000)); | 
|  | j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000)); | 
|  | } else { | 
|  | j->cadence_f[4].state = 7; | 
|  | } | 
|  | } else { | 
|  | if (ixjdebug & 0x0008) { | 
|  | printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", | 
|  | j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, | 
|  | j->cadence_f[4].on2); | 
|  | } | 
|  | j->cadence_f[4].state = 0; | 
|  | } | 
|  | } else if (j->cadence_f[4].state == 5) { | 
|  | if((time_after(jiffies, j->cadence_f[4].on3min) && | 
|  | time_before(jiffies, j->cadence_f[4].on3max))) { | 
|  | if (j->cadence_f[4].off3) { | 
|  | j->cadence_f[4].state = 6; | 
|  | j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000)); | 
|  | j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000)); | 
|  | j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000)); | 
|  | } else { | 
|  | j->cadence_f[4].state = 7; | 
|  | } | 
|  | } else { | 
|  | j->cadence_f[4].state = 0; | 
|  | } | 
|  | } else { | 
|  | if (ixjdebug & 0x0008) { | 
|  | printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", | 
|  | j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, | 
|  | j->cadence_f[4].on3); | 
|  | } | 
|  | j->cadence_f[4].state = 0; | 
|  | } | 
|  | } | 
|  | if (ixjdebug & 0x0010) { | 
|  | printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies); | 
|  | } | 
|  | if (ixjdebug & 0x0010) { | 
|  | switch(j->cadence_f[4].state) { | 
|  | case 1: | 
|  | printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, | 
|  | j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max); | 
|  | break; | 
|  | case 2: | 
|  | printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, | 
|  | j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max); | 
|  | break; | 
|  | case 3: | 
|  | printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, | 
|  | j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max); | 
|  | break; | 
|  | case 4: | 
|  | printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, | 
|  | j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max); | 
|  | break; | 
|  | case 5: | 
|  | printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, | 
|  | j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max); | 
|  | break; | 
|  | case 6: | 
|  | printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, | 
|  | j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max); | 
|  | break; | 
|  | } | 
|  | } | 
|  | } | 
|  | if (j->cadence_f[4].state == 7) { | 
|  | j->cadence_f[4].state = 0; | 
|  | j->pstn_ring_stop = jiffies; | 
|  | j->ex.bits.pstn_ring = 1; | 
|  | ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN); | 
|  | if(ixjdebug & 0x0008) { | 
|  | printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ld\n", j->board, jiffies); | 
|  | } | 
|  | } | 
|  | if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) || | 
|  | (j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) { | 
|  | if(ixjdebug & 0x0008) { | 
|  | printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j->board, jiffies); | 
|  | printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j->board, j->pstn_ring_int); | 
|  | printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j->board, j->pstn_ring_stop); | 
|  | } | 
|  | j->pstn_ring_stop = j->pstn_ring_int = 0; | 
|  | daa_set_mode(j, SOP_PU_SLEEP); | 
|  | } | 
|  | outb_p(j->pld_scrw.byte, j->XILINXbase); | 
|  | if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) { | 
|  | ixj_daa_cid_read(j); | 
|  | j->ex.bits.caller_id = 1; | 
|  | ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN); | 
|  | j->pstn_cid_intr = 0; | 
|  | } | 
|  | if (daaint.bitreg.Cadence) { | 
|  | if(ixjdebug & 0x0008) { | 
|  | printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j->board); | 
|  | } | 
|  | daa_set_mode(j, SOP_PU_SLEEP); | 
|  | j->ex.bits.pstn_ring = 0; | 
|  | } | 
|  | break; | 
|  | case SOP_PU_CONVERSATION: | 
|  | if (daaint.bitreg.VDD_OK) { | 
|  | if(!daaint.bitreg.SI_0) { | 
|  | if (!j->pstn_winkstart) { | 
|  | if(ixjdebug & 0x0008) { | 
|  | printk("IXJ DAA possible wink /dev/phone%d %ld\n", j->board, jiffies); | 
|  | } | 
|  | j->pstn_winkstart = jiffies; | 
|  | } | 
|  | } else { | 
|  | if (j->pstn_winkstart) { | 
|  | if(ixjdebug & 0x0008) { | 
|  | printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies); | 
|  | } | 
|  | j->pstn_winkstart = 0; | 
|  | } | 
|  | } | 
|  | } | 
|  | if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) { | 
|  | if(ixjdebug & 0x0008) { | 
|  | printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j->board, jiffies); | 
|  | } | 
|  | daa_set_mode(j, SOP_PU_SLEEP); | 
|  | j->pstn_winkstart = 0; | 
|  | j->ex.bits.pstn_wink = 1; | 
|  | ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN); | 
|  | } | 
|  | break; | 
|  | } | 
|  | } | 
|  |  | 
|  | static void ixj_timeout(unsigned long ptr) | 
|  | { | 
|  | int board; | 
|  | unsigned long jifon; | 
|  | IXJ *j = (IXJ *)ptr; | 
|  | board = j->board; | 
|  |  | 
|  | if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) { | 
|  | ixj_perfmon(j->timerchecks); | 
|  | j->hookstate = ixj_hookstate(j); | 
|  | if (j->tone_state) { | 
|  | if (!(j->hookstate)) { | 
|  | ixj_cpt_stop(j); | 
|  | if (j->m_hook) { | 
|  | j->m_hook = 0; | 
|  | j->ex.bits.hookstate = 1; | 
|  | ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN); | 
|  | } | 
|  | clear_bit(board, &j->busyflags); | 
|  | ixj_add_timer(j); | 
|  | return; | 
|  | } | 
|  | if (j->tone_state == 1) | 
|  | jifon = ((hertz * j->tone_on_time) * 25 / 100000); | 
|  | else | 
|  | jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000); | 
|  | if (time_before(jiffies, j->tone_start_jif + jifon)) { | 
|  | if (j->tone_state == 1) { | 
|  | ixj_play_tone(j, j->tone_index); | 
|  | if (j->dsp.low == 0x20) { | 
|  | clear_bit(board, &j->busyflags); | 
|  | ixj_add_timer(j); | 
|  | return; | 
|  | } | 
|  | } else { | 
|  | ixj_play_tone(j, 0); | 
|  | if (j->dsp.low == 0x20) { | 
|  | clear_bit(board, &j->busyflags); | 
|  | ixj_add_timer(j); | 
|  | return; | 
|  | } | 
|  | } | 
|  | } else { | 
|  | ixj_tone_timeout(j); | 
|  | if (j->flags.dialtone) { | 
|  | ixj_dialtone(j); | 
|  | } | 
|  | if (j->flags.busytone) { | 
|  | ixj_busytone(j); | 
|  | if (j->dsp.low == 0x20) { | 
|  | clear_bit(board, &j->busyflags); | 
|  | ixj_add_timer(j); | 
|  | return; | 
|  | } | 
|  | } | 
|  | if (j->flags.ringback) { | 
|  | ixj_ringback(j); | 
|  | if (j->dsp.low == 0x20) { | 
|  | clear_bit(board, &j->busyflags); | 
|  | ixj_add_timer(j); | 
|  | return; | 
|  | } | 
|  | } | 
|  | if (!j->tone_state) { | 
|  | ixj_cpt_stop(j); | 
|  | } | 
|  | } | 
|  | } | 
|  | if (!(j->tone_state && j->dsp.low == 0x20)) { | 
|  | if (IsRxReady(j)) { | 
|  | ixj_read_frame(j); | 
|  | } | 
|  | if (IsTxReady(j)) { | 
|  | ixj_write_frame(j); | 
|  | } | 
|  | } | 
|  | if (j->flags.cringing) { | 
|  | if (j->hookstate & 1) { | 
|  | j->flags.cringing = 0; | 
|  | ixj_ring_off(j); | 
|  | } else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) { | 
|  | switch(j->cadence_f[5].state) { | 
|  | case 0: | 
|  | j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000)); | 
|  | if (time_before(jiffies, j->cadence_f[5].on1dot)) { | 
|  | if(ixjdebug & 0x0004) { | 
|  | printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); | 
|  | } | 
|  | ixj_ring_on(j); | 
|  | } | 
|  | j->cadence_f[5].state = 1; | 
|  | break; | 
|  | case 1: | 
|  | if (time_after(jiffies, j->cadence_f[5].on1dot)) { | 
|  | j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000)); | 
|  | if(ixjdebug & 0x0004) { | 
|  | printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); | 
|  | } | 
|  | ixj_ring_off(j); | 
|  | j->cadence_f[5].state = 2; | 
|  | } | 
|  | break; | 
|  | case 2: | 
|  | if (time_after(jiffies, j->cadence_f[5].off1dot)) { | 
|  | if(ixjdebug & 0x0004) { | 
|  | printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); | 
|  | } | 
|  | ixj_ring_on(j); | 
|  | if (j->cadence_f[5].on2) { | 
|  | j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000)); | 
|  | j->cadence_f[5].state = 3; | 
|  | } else { | 
|  | j->cadence_f[5].state = 7; | 
|  | } | 
|  | } | 
|  | break; | 
|  | case 3: | 
|  | if (time_after(jiffies, j->cadence_f[5].on2dot)) { | 
|  | if(ixjdebug & 0x0004) { | 
|  | printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); | 
|  | } | 
|  | ixj_ring_off(j); | 
|  | if (j->cadence_f[5].off2) { | 
|  | j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000)); | 
|  | j->cadence_f[5].state = 4; | 
|  | } else { | 
|  | j->cadence_f[5].state = 7; | 
|  | } | 
|  | } | 
|  | break; | 
|  | case 4: | 
|  | if (time_after(jiffies, j->cadence_f[5].off2dot)) { | 
|  | if(ixjdebug & 0x0004) { | 
|  | printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); | 
|  | } | 
|  | ixj_ring_on(j); | 
|  | if (j->cadence_f[5].on3) { | 
|  | j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000)); | 
|  | j->cadence_f[5].state = 5; | 
|  | } else { | 
|  | j->cadence_f[5].state = 7; | 
|  | } | 
|  | } | 
|  | break; | 
|  | case 5: | 
|  | if (time_after(jiffies, j->cadence_f[5].on3dot)) { | 
|  | if(ixjdebug & 0x0004) { | 
|  | printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); | 
|  | } | 
|  | ixj_ring_off(j); | 
|  | if (j->cadence_f[5].off3) { | 
|  | j->cadence_f[5].off3dot = jiffies + (long)((j->cadence_f[5].off3 * (hertz * 100) / 10000)); | 
|  | j->cadence_f[5].state = 6; | 
|  | } else { | 
|  | j->cadence_f[5].state = 7; | 
|  | } | 
|  | } | 
|  | break; | 
|  | case 6: | 
|  | if (time_after(jiffies, j->cadence_f[5].off3dot)) { | 
|  | if(ixjdebug & 0x0004) { | 
|  | printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); | 
|  | } | 
|  | j->cadence_f[5].state = 7; | 
|  | } | 
|  | break; | 
|  | case 7: | 
|  | if(ixjdebug & 0x0004) { | 
|  | printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); | 
|  | } | 
|  | j->flags.cidring = 1; | 
|  | j->cadence_f[5].state = 0; | 
|  | break; | 
|  | } | 
|  | if (j->flags.cidring && !j->flags.cidsent) { | 
|  | j->flags.cidsent = 1; | 
|  | if(j->fskdcnt) { | 
|  | SLIC_SetState(PLD_SLIC_STATE_OHT, j); | 
|  | ixj_pre_cid(j); | 
|  | } | 
|  | j->flags.cidring = 0; | 
|  | } | 
|  | clear_bit(board, &j->busyflags); | 
|  | ixj_add_timer(j); | 
|  | return; | 
|  | } else { | 
|  | if (time_after(jiffies, j->ring_cadence_jif + (hertz / 2))) { | 
|  | if (j->flags.cidring && !j->flags.cidsent) { | 
|  | j->flags.cidsent = 1; | 
|  | if(j->fskdcnt) { | 
|  | SLIC_SetState(PLD_SLIC_STATE_OHT, j); | 
|  | ixj_pre_cid(j); | 
|  | } | 
|  | j->flags.cidring = 0; | 
|  | } | 
|  | j->ring_cadence_t--; | 
|  | if (j->ring_cadence_t == -1) | 
|  | j->ring_cadence_t = 15; | 
|  | j->ring_cadence_jif = jiffies; | 
|  |  | 
|  | if (j->ring_cadence & 1 << j->ring_cadence_t) { | 
|  | if(j->flags.cidsent && j->cadence_f[5].en_filter) | 
|  | j->flags.firstring = 1; | 
|  | else | 
|  | ixj_ring_on(j); | 
|  | } else { | 
|  | ixj_ring_off(j); | 
|  | if(!j->flags.cidsent) | 
|  | j->flags.cidring = 1; | 
|  | } | 
|  | } | 
|  | clear_bit(board, &j->busyflags); | 
|  | ixj_add_timer(j); | 
|  | return; | 
|  | } | 
|  | } | 
|  | if (!j->flags.ringing) { | 
|  | if (j->hookstate) { /* & 1) { */ | 
|  | if (j->dsp.low != 0x20 && | 
|  | SLIC_GetState(j) != PLD_SLIC_STATE_ACTIVE) { | 
|  | SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); | 
|  | } | 
|  | LineMonitor(j); | 
|  | read_filters(j); | 
|  | ixj_WriteDSPCommand(0x511B, j); | 
|  | j->proc_load = j->ssr.high << 8 | j->ssr.low; | 
|  | if (!j->m_hook && (j->hookstate & 1)) { | 
|  | j->m_hook = j->ex.bits.hookstate = 1; | 
|  | ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN); | 
|  | } | 
|  | } else { | 
|  | if (j->ex.bits.dtmf_ready) { | 
|  | j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0; | 
|  | } | 
|  | if (j->m_hook) { | 
|  | j->m_hook = 0; | 
|  | j->ex.bits.hookstate = 1; | 
|  | ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN); | 
|  | } | 
|  | } | 
|  | } | 
|  | if (j->cardtype == QTI_LINEJACK && !j->flags.pstncheck && j->flags.pstn_present) { | 
|  | ixj_pstn_state(j); | 
|  | } | 
|  | if (j->ex.bytes) { | 
|  | wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */ | 
|  | } | 
|  | clear_bit(board, &j->busyflags); | 
|  | } | 
|  | ixj_add_timer(j); | 
|  | } | 
|  |  | 
|  | static int ixj_status_wait(IXJ *j) | 
|  | { | 
|  | unsigned long jif; | 
|  |  | 
|  | jif = jiffies + ((60 * hertz) / 100); | 
|  | while (!IsStatusReady(j)) { | 
|  | ixj_perfmon(j->statuswait); | 
|  | if (time_after(jiffies, jif)) { | 
|  | ixj_perfmon(j->statuswaitfail); | 
|  | return -1; | 
|  | } | 
|  | } | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static int ixj_PCcontrol_wait(IXJ *j) | 
|  | { | 
|  | unsigned long jif; | 
|  |  | 
|  | jif = jiffies + ((60 * hertz) / 100); | 
|  | while (!IsPCControlReady(j)) { | 
|  | ixj_perfmon(j->pcontrolwait); | 
|  | if (time_after(jiffies, jif)) { | 
|  | ixj_perfmon(j->pcontrolwaitfail); | 
|  | return -1; | 
|  | } | 
|  | } | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j) | 
|  | { | 
|  | BYTES bytes; | 
|  | unsigned long jif; | 
|  |  | 
|  | atomic_inc(&j->DSPWrite); | 
|  | if(atomic_read(&j->DSPWrite) > 1) { | 
|  | printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j->board, cmd); | 
|  | return -1; | 
|  | } | 
|  | bytes.high = (cmd & 0xFF00) >> 8; | 
|  | bytes.low = cmd & 0x00FF; | 
|  | jif = jiffies + ((60 * hertz) / 100); | 
|  | while (!IsControlReady(j)) { | 
|  | ixj_perfmon(j->iscontrolready); | 
|  | if (time_after(jiffies, jif)) { | 
|  | ixj_perfmon(j->iscontrolreadyfail); | 
|  | atomic_dec(&j->DSPWrite); | 
|  | if(atomic_read(&j->DSPWrite) > 0) { | 
|  | printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j->board, cmd); | 
|  | while(atomic_read(&j->DSPWrite) > 0) { | 
|  | atomic_dec(&j->DSPWrite); | 
|  | } | 
|  | } | 
|  | return -1; | 
|  | } | 
|  | } | 
|  | outb(bytes.low, j->DSPbase + 6); | 
|  | outb(bytes.high, j->DSPbase + 7); | 
|  |  | 
|  | if (ixj_status_wait(j)) { | 
|  | j->ssr.low = 0xFF; | 
|  | j->ssr.high = 0xFF; | 
|  | atomic_dec(&j->DSPWrite); | 
|  | if(atomic_read(&j->DSPWrite) > 0) { | 
|  | printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j->board, cmd); | 
|  | while(atomic_read(&j->DSPWrite) > 0) { | 
|  | atomic_dec(&j->DSPWrite); | 
|  | } | 
|  | } | 
|  | return -1; | 
|  | } | 
|  | /* Read Software Status Register */ | 
|  | j->ssr.low = inb_p(j->DSPbase + 2); | 
|  | j->ssr.high = inb_p(j->DSPbase + 3); | 
|  | atomic_dec(&j->DSPWrite); | 
|  | if(atomic_read(&j->DSPWrite) > 0) { | 
|  | printk("IXJ %d DSP overlaped command 0x%4.4x\n", j->board, cmd); | 
|  | while(atomic_read(&j->DSPWrite) > 0) { | 
|  | atomic_dec(&j->DSPWrite); | 
|  | } | 
|  | } | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | /*************************************************************************** | 
|  | * | 
|  | *  General Purpose IO Register read routine | 
|  | * | 
|  | ***************************************************************************/ | 
|  | static inline int ixj_gpio_read(IXJ *j) | 
|  | { | 
|  | if (ixj_WriteDSPCommand(0x5143, j)) | 
|  | return -1; | 
|  |  | 
|  | j->gpio.bytes.low = j->ssr.low; | 
|  | j->gpio.bytes.high = j->ssr.high; | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static inline void LED_SetState(int state, IXJ *j) | 
|  | { | 
|  | if (j->cardtype == QTI_LINEJACK) { | 
|  | j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0; | 
|  | j->pld_scrw.bits.led2 = state & 0x2 ? 1 : 0; | 
|  | j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0; | 
|  | j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0; | 
|  |  | 
|  | outb(j->pld_scrw.byte, j->XILINXbase); | 
|  | } | 
|  | } | 
|  |  | 
|  | /********************************************************************* | 
|  | *  GPIO Pins are configured as follows on the Quicknet Internet | 
|  | *  PhoneJACK Telephony Cards | 
|  | * | 
|  | * POTS Select        GPIO_6=0 GPIO_7=0 | 
|  | * Mic/Speaker Select GPIO_6=0 GPIO_7=1 | 
|  | * Handset Select     GPIO_6=1 GPIO_7=0 | 
|  | * | 
|  | * SLIC Active        GPIO_1=0 GPIO_2=1 GPIO_5=0 | 
|  | * SLIC Ringing       GPIO_1=1 GPIO_2=1 GPIO_5=0 | 
|  | * SLIC Open Circuit  GPIO_1=0 GPIO_2=0 GPIO_5=0 | 
|  | * | 
|  | * Hook Switch changes reported on GPIO_3 | 
|  | *********************************************************************/ | 
|  | static int ixj_set_port(IXJ *j, int arg) | 
|  | { | 
|  | if (j->cardtype == QTI_PHONEJACK_LITE) { | 
|  | if (arg != PORT_POTS) | 
|  | return 10; | 
|  | else | 
|  | return 0; | 
|  | } | 
|  | switch (arg) { | 
|  | case PORT_POTS: | 
|  | j->port = PORT_POTS; | 
|  | switch (j->cardtype) { | 
|  | case QTI_PHONECARD: | 
|  | if (j->flags.pcmciasct == 1) | 
|  | SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); | 
|  | else | 
|  | return 11; | 
|  | break; | 
|  | case QTI_PHONEJACK_PCI: | 
|  | j->pld_slicw.pcib.mic = 0; | 
|  | j->pld_slicw.pcib.spk = 0; | 
|  | outb(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | break; | 
|  | case QTI_LINEJACK: | 
|  | ixj_set_pots(j, 0);			/* Disconnect POTS/PSTN relay */ | 
|  | if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to | 
|  | Software Control Register */ | 
|  | return 2; | 
|  | j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */ | 
|  |  | 
|  | outb(j->pld_scrw.byte, j->XILINXbase); | 
|  | j->pld_clock.byte = 0; | 
|  | outb(j->pld_clock.byte, j->XILINXbase + 0x04); | 
|  | j->pld_slicw.bits.rly1 = 1; | 
|  | j->pld_slicw.bits.spken = 0; | 
|  | outb(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | ixj_mixer(0x1200, j);	/* Turn Off MIC switch on mixer left */ | 
|  | ixj_mixer(0x1401, j);	/* Turn On Mono1 switch on mixer left */ | 
|  | ixj_mixer(0x1300, j);       /* Turn Off MIC switch on mixer right */ | 
|  | ixj_mixer(0x1501, j);       /* Turn On Mono1 switch on mixer right */ | 
|  | ixj_mixer(0x0E80, j);	/*Mic mute */ | 
|  | ixj_mixer(0x0F00, j);	/* Set mono out (SLIC) to 0dB */ | 
|  | ixj_mixer(0x0080, j);	/* Mute Master Left volume */ | 
|  | ixj_mixer(0x0180, j);	/* Mute Master Right volume */ | 
|  | SLIC_SetState(PLD_SLIC_STATE_STANDBY, j); | 
|  | /*			SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */ | 
|  | break; | 
|  | case QTI_PHONEJACK: | 
|  | j->gpio.bytes.high = 0x0B; | 
|  | j->gpio.bits.gpio6 = 0; | 
|  | j->gpio.bits.gpio7 = 0; | 
|  | ixj_WriteDSPCommand(j->gpio.word, j); | 
|  | break; | 
|  | } | 
|  | break; | 
|  | case PORT_PSTN: | 
|  | if (j->cardtype == QTI_LINEJACK) { | 
|  | ixj_WriteDSPCommand(0xC534, j);	/* Write CODEC config to Software Control Register */ | 
|  |  | 
|  | j->pld_slicw.bits.rly3 = 0; | 
|  | j->pld_slicw.bits.rly1 = 1; | 
|  | j->pld_slicw.bits.spken = 0; | 
|  | outb(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | j->port = PORT_PSTN; | 
|  | } else { | 
|  | return 4; | 
|  | } | 
|  | break; | 
|  | case PORT_SPEAKER: | 
|  | j->port = PORT_SPEAKER; | 
|  | switch (j->cardtype) { | 
|  | case QTI_PHONECARD: | 
|  | if (j->flags.pcmciasct) { | 
|  | SLIC_SetState(PLD_SLIC_STATE_OC, j); | 
|  | } | 
|  | break; | 
|  | case QTI_PHONEJACK_PCI: | 
|  | j->pld_slicw.pcib.mic = 1; | 
|  | j->pld_slicw.pcib.spk = 1; | 
|  | outb(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | break; | 
|  | case QTI_LINEJACK: | 
|  | ixj_set_pots(j, 0);			/* Disconnect POTS/PSTN relay */ | 
|  | if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to | 
|  | Software Control Register */ | 
|  | return 2; | 
|  | j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */ | 
|  |  | 
|  | outb(j->pld_scrw.byte, j->XILINXbase); | 
|  | j->pld_clock.byte = 0; | 
|  | outb(j->pld_clock.byte, j->XILINXbase + 0x04); | 
|  | j->pld_slicw.bits.rly1 = 1; | 
|  | j->pld_slicw.bits.spken = 1; | 
|  | outb(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | ixj_mixer(0x1201, j);	/* Turn On MIC switch on mixer left */ | 
|  | ixj_mixer(0x1400, j);	/* Turn Off Mono1 switch on mixer left */ | 
|  | ixj_mixer(0x1301, j);       /* Turn On MIC switch on mixer right */ | 
|  | ixj_mixer(0x1500, j);       /* Turn Off Mono1 switch on mixer right */ | 
|  | ixj_mixer(0x0E06, j);	/*Mic un-mute 0dB */ | 
|  | ixj_mixer(0x0F80, j);	/* Mute mono out (SLIC) */ | 
|  | ixj_mixer(0x0000, j);	/* Set Master Left volume to 0dB */ | 
|  | ixj_mixer(0x0100, j);	/* Set Master Right volume to 0dB */ | 
|  | break; | 
|  | case QTI_PHONEJACK: | 
|  | j->gpio.bytes.high = 0x0B; | 
|  | j->gpio.bits.gpio6 = 0; | 
|  | j->gpio.bits.gpio7 = 1; | 
|  | ixj_WriteDSPCommand(j->gpio.word, j); | 
|  | break; | 
|  | } | 
|  | break; | 
|  | case PORT_HANDSET: | 
|  | if (j->cardtype != QTI_PHONEJACK) { | 
|  | return 5; | 
|  | } else { | 
|  | j->gpio.bytes.high = 0x0B; | 
|  | j->gpio.bits.gpio6 = 1; | 
|  | j->gpio.bits.gpio7 = 0; | 
|  | ixj_WriteDSPCommand(j->gpio.word, j); | 
|  | j->port = PORT_HANDSET; | 
|  | } | 
|  | break; | 
|  | default: | 
|  | return 6; | 
|  | break; | 
|  | } | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static int ixj_set_pots(IXJ *j, int arg) | 
|  | { | 
|  | if (j->cardtype == QTI_LINEJACK) { | 
|  | if (arg) { | 
|  | if (j->port == PORT_PSTN) { | 
|  | j->pld_slicw.bits.rly1 = 0; | 
|  | outb(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | j->flags.pots_pstn = 1; | 
|  | return 1; | 
|  | } else { | 
|  | j->flags.pots_pstn = 0; | 
|  | return 0; | 
|  | } | 
|  | } else { | 
|  | j->pld_slicw.bits.rly1 = 1; | 
|  | outb(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | j->flags.pots_pstn = 0; | 
|  | return 1; | 
|  | } | 
|  | } else { | 
|  | return 0; | 
|  | } | 
|  | } | 
|  |  | 
|  | static void ixj_ring_on(IXJ *j) | 
|  | { | 
|  | if (j->dsp.low == 0x20)	/* Internet PhoneJACK */ | 
|  | { | 
|  | if (ixjdebug & 0x0004) | 
|  | printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", 	j->board); | 
|  |  | 
|  | j->gpio.bytes.high = 0x0B; | 
|  | j->gpio.bytes.low = 0x00; | 
|  | j->gpio.bits.gpio1 = 1; | 
|  | j->gpio.bits.gpio2 = 1; | 
|  | j->gpio.bits.gpio5 = 0; | 
|  | ixj_WriteDSPCommand(j->gpio.word, j);	/* send the ring signal */ | 
|  | } else			/* Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI */ | 
|  | { | 
|  | if (ixjdebug & 0x0004) | 
|  | printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board); | 
|  |  | 
|  | SLIC_SetState(PLD_SLIC_STATE_RINGING, j); | 
|  | } | 
|  | } | 
|  |  | 
|  | static int ixj_siadc(IXJ *j, int val) | 
|  | { | 
|  | if(j->cardtype == QTI_PHONECARD){ | 
|  | if(j->flags.pcmciascp){ | 
|  | if(val == -1) | 
|  | return j->siadc.bits.rxg; | 
|  |  | 
|  | if(val < 0 || val > 0x1F) | 
|  | return -1; | 
|  |  | 
|  | j->siadc.bits.hom = 0;				/* Handset Out Mute */ | 
|  | j->siadc.bits.lom = 0;				/* Line Out Mute */ | 
|  | j->siadc.bits.rxg = val;			/*(0xC000 - 0x41C8) / 0x4EF;    RX PGA Gain */ | 
|  | j->psccr.bits.addr = 6;				/* R/W Smart Cable Register Address */ | 
|  | j->psccr.bits.rw = 0;				/* Read / Write flag */ | 
|  | j->psccr.bits.dev = 0; | 
|  | outb(j->siadc.byte, j->XILINXbase + 0x00); | 
|  | outb(j->psccr.byte, j->XILINXbase + 0x01); | 
|  | ixj_PCcontrol_wait(j); | 
|  | return j->siadc.bits.rxg; | 
|  | } | 
|  | } | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | static int ixj_sidac(IXJ *j, int val) | 
|  | { | 
|  | if(j->cardtype == QTI_PHONECARD){ | 
|  | if(j->flags.pcmciascp){ | 
|  | if(val == -1) | 
|  | return j->sidac.bits.txg; | 
|  |  | 
|  | if(val < 0 || val > 0x1F) | 
|  | return -1; | 
|  |  | 
|  | j->sidac.bits.srm = 1;				/* Speaker Right Mute */ | 
|  | j->sidac.bits.slm = 1;				/* Speaker Left Mute */ | 
|  | j->sidac.bits.txg = val;			/* (0xC000 - 0x45E4) / 0x5D3;	 TX PGA Gain */ | 
|  | j->psccr.bits.addr = 7;				/* R/W Smart Cable Register Address */ | 
|  | j->psccr.bits.rw = 0;				/* Read / Write flag */ | 
|  | j->psccr.bits.dev = 0; | 
|  | outb(j->sidac.byte, j->XILINXbase + 0x00); | 
|  | outb(j->psccr.byte, j->XILINXbase + 0x01); | 
|  | ixj_PCcontrol_wait(j); | 
|  | return j->sidac.bits.txg; | 
|  | } | 
|  | } | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | static int ixj_pcmcia_cable_check(IXJ *j) | 
|  | { | 
|  | j->pccr1.byte = inb_p(j->XILINXbase + 0x03); | 
|  | if (!j->flags.pcmciastate) { | 
|  | j->pccr2.byte = inb_p(j->XILINXbase + 0x02); | 
|  | if (j->pccr1.bits.drf || j->pccr2.bits.rstc) { | 
|  | j->flags.pcmciastate = 4; | 
|  | return 0; | 
|  | } | 
|  | if (j->pccr1.bits.ed) { | 
|  | j->pccr1.bits.ed = 0; | 
|  | j->psccr.bits.dev = 3; | 
|  | j->psccr.bits.rw = 1; | 
|  | outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00); | 
|  | ixj_PCcontrol_wait(j); | 
|  | j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF; | 
|  | j->pslic.bits.led2 = j->pslic.bits.det ? 1 : 0; | 
|  | j->psccr.bits.dev = 3; | 
|  | j->psccr.bits.rw = 0; | 
|  | outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00); | 
|  | ixj_PCcontrol_wait(j); | 
|  | return j->pslic.bits.led2 ? 1 : 0; | 
|  | } else if (j->flags.pcmciasct) { | 
|  | return j->r_hook; | 
|  | } else { | 
|  | return 1; | 
|  | } | 
|  | } else if (j->flags.pcmciastate == 4) { | 
|  | if (!j->pccr1.bits.drf) { | 
|  | j->flags.pcmciastate = 3; | 
|  | } | 
|  | return 0; | 
|  | } else if (j->flags.pcmciastate == 3) { | 
|  | j->pccr2.bits.pwr = 0; | 
|  | j->pccr2.bits.rstc = 1; | 
|  | outb(j->pccr2.byte, j->XILINXbase + 0x02); | 
|  | j->checkwait = jiffies + (hertz * 2); | 
|  | j->flags.incheck = 1; | 
|  | j->flags.pcmciastate = 2; | 
|  | return 0; | 
|  | } else if (j->flags.pcmciastate == 2) { | 
|  | if (j->flags.incheck) { | 
|  | if (time_before(jiffies, j->checkwait)) { | 
|  | return 0; | 
|  | } else { | 
|  | j->flags.incheck = 0; | 
|  | } | 
|  | } | 
|  | j->pccr2.bits.pwr = 0; | 
|  | j->pccr2.bits.rstc = 0; | 
|  | outb_p(j->pccr2.byte, j->XILINXbase + 0x02); | 
|  | j->flags.pcmciastate = 1; | 
|  | return 0; | 
|  | } else if (j->flags.pcmciastate == 1) { | 
|  | j->flags.pcmciastate = 0; | 
|  | if (!j->pccr1.bits.drf) { | 
|  | j->psccr.bits.dev = 3; | 
|  | j->psccr.bits.rw = 1; | 
|  | outb_p(j->psccr.byte, j->XILINXbase + 0x01); | 
|  | ixj_PCcontrol_wait(j); | 
|  | j->flags.pcmciascp = 1;		/* Set Cable Present Flag */ | 
|  |  | 
|  | j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03;		/* Get Cable Type */ | 
|  |  | 
|  | if (j->flags.pcmciasct == 3) { | 
|  | j->flags.pcmciastate = 4; | 
|  | return 0; | 
|  | } else if (j->flags.pcmciasct == 0) { | 
|  | j->pccr2.bits.pwr = 1; | 
|  | j->pccr2.bits.rstc = 0; | 
|  | outb_p(j->pccr2.byte, j->XILINXbase + 0x02); | 
|  | j->port = PORT_SPEAKER; | 
|  | } else { | 
|  | j->port = PORT_POTS; | 
|  | } | 
|  | j->sic1.bits.cpd = 0;				/* Chip Power Down */ | 
|  | j->sic1.bits.mpd = 0;				/* MIC Bias Power Down */ | 
|  | j->sic1.bits.hpd = 0;				/* Handset Bias Power Down */ | 
|  | j->sic1.bits.lpd = 0;				/* Line Bias Power Down */ | 
|  | j->sic1.bits.spd = 1;				/* Speaker Drive Power Down */ | 
|  | j->psccr.bits.addr = 1;				/* R/W Smart Cable Register Address */ | 
|  | j->psccr.bits.rw = 0;				/* Read / Write flag */ | 
|  | j->psccr.bits.dev = 0; | 
|  | outb(j->sic1.byte, j->XILINXbase + 0x00); | 
|  | outb(j->psccr.byte, j->XILINXbase + 0x01); | 
|  | ixj_PCcontrol_wait(j); | 
|  |  | 
|  | j->sic2.bits.al = 0;				/* Analog Loopback DAC analog -> ADC analog */ | 
|  | j->sic2.bits.dl2 = 0;				/* Digital Loopback DAC -> ADC one bit */ | 
|  | j->sic2.bits.dl1 = 0;				/* Digital Loopback ADC -> DAC one bit */ | 
|  | j->sic2.bits.pll = 0;				/* 1 = div 10, 0 = div 5 */ | 
|  | j->sic2.bits.hpd = 0;				/* HPF disable */ | 
|  | j->psccr.bits.addr = 2;				/* R/W Smart Cable Register Address */ | 
|  | j->psccr.bits.rw = 0;				/* Read / Write flag */ | 
|  | j->psccr.bits.dev = 0; | 
|  | outb(j->sic2.byte, j->XILINXbase + 0x00); | 
|  | outb(j->psccr.byte, j->XILINXbase + 0x01); | 
|  | ixj_PCcontrol_wait(j); | 
|  |  | 
|  | j->psccr.bits.addr = 3;				/* R/W Smart Cable Register Address */ | 
|  | j->psccr.bits.rw = 0;				/* Read / Write flag */ | 
|  | j->psccr.bits.dev = 0; | 
|  | outb(0x00, j->XILINXbase + 0x00);		/* PLL Divide N1 */ | 
|  | outb(j->psccr.byte, j->XILINXbase + 0x01); | 
|  | ixj_PCcontrol_wait(j); | 
|  |  | 
|  | j->psccr.bits.addr = 4;				/* R/W Smart Cable Register Address */ | 
|  | j->psccr.bits.rw = 0;				/* Read / Write flag */ | 
|  | j->psccr.bits.dev = 0; | 
|  | outb(0x09, j->XILINXbase + 0x00);		/* PLL Multiply M1 */ | 
|  | outb(j->psccr.byte, j->XILINXbase + 0x01); | 
|  | ixj_PCcontrol_wait(j); | 
|  |  | 
|  | j->sirxg.bits.lig = 1;				/* Line In Gain */ | 
|  | j->sirxg.bits.lim = 1;				/* Line In Mute */ | 
|  | j->sirxg.bits.mcg = 0;				/* MIC In Gain was 3 */ | 
|  | j->sirxg.bits.mcm = 0;				/* MIC In Mute */ | 
|  | j->sirxg.bits.him = 0;				/* Handset In Mute */ | 
|  | j->sirxg.bits.iir = 1;				/* IIR */ | 
|  | j->psccr.bits.addr = 5;				/* R/W Smart Cable Register Address */ | 
|  | j->psccr.bits.rw = 0;				/* Read / Write flag */ | 
|  | j->psccr.bits.dev = 0; | 
|  | outb(j->sirxg.byte, j->XILINXbase + 0x00); | 
|  | outb(j->psccr.byte, j->XILINXbase + 0x01); | 
|  | ixj_PCcontrol_wait(j); | 
|  |  | 
|  | ixj_siadc(j, 0x17); | 
|  | ixj_sidac(j, 0x1D); | 
|  |  | 
|  | j->siaatt.bits.sot = 0; | 
|  | j->psccr.bits.addr = 9;				/* R/W Smart Cable Register Address */ | 
|  | j->psccr.bits.rw = 0;				/* Read / Write flag */ | 
|  | j->psccr.bits.dev = 0; | 
|  | outb(j->siaatt.byte, j->XILINXbase + 0x00); | 
|  | outb(j->psccr.byte, j->XILINXbase + 0x01); | 
|  | ixj_PCcontrol_wait(j); | 
|  |  | 
|  | if (j->flags.pcmciasct == 1 && !j->readers && !j->writers) { | 
|  | j->psccr.byte = j->pslic.byte = 0; | 
|  | j->pslic.bits.powerdown = 1; | 
|  | j->psccr.bits.dev = 3; | 
|  | j->psccr.bits.rw = 0; | 
|  | outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00); | 
|  | ixj_PCcontrol_wait(j); | 
|  | } | 
|  | } | 
|  | return 0; | 
|  | } else { | 
|  | j->flags.pcmciascp = 0; | 
|  | return 0; | 
|  | } | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static int ixj_hookstate(IXJ *j) | 
|  | { | 
|  | int fOffHook = 0; | 
|  |  | 
|  | switch (j->cardtype) { | 
|  | case QTI_PHONEJACK: | 
|  | ixj_gpio_read(j); | 
|  | fOffHook = j->gpio.bits.gpio3read ? 1 : 0; | 
|  | break; | 
|  | case QTI_LINEJACK: | 
|  | case QTI_PHONEJACK_LITE: | 
|  | case QTI_PHONEJACK_PCI: | 
|  | SLIC_GetState(j); | 
|  | if(j->cardtype == QTI_LINEJACK && j->flags.pots_pstn == 1 && (j->readers || j->writers)) { | 
|  | fOffHook = j->pld_slicr.bits.potspstn ? 1 : 0; | 
|  | if(fOffHook != j->p_hook) { | 
|  | if(!j->checkwait) { | 
|  | j->checkwait = jiffies; | 
|  | } | 
|  | if(time_before(jiffies, j->checkwait + 2)) { | 
|  | fOffHook ^= 1; | 
|  | } else { | 
|  | j->checkwait = 0; | 
|  | } | 
|  | j->p_hook = fOffHook; | 
|  | printk("IXJ : /dev/phone%d pots-pstn hookstate check %d at %ld\n", j->board, fOffHook, jiffies); | 
|  | } | 
|  | } else { | 
|  | if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE || | 
|  | j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) { | 
|  | if (j->flags.ringing || j->flags.cringing) { | 
|  | if (!in_interrupt()) { | 
|  | msleep(20); | 
|  | } | 
|  | SLIC_GetState(j); | 
|  | if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) { | 
|  | ixj_ring_on(j); | 
|  | } | 
|  | } | 
|  | if (j->cardtype == QTI_PHONEJACK_PCI) { | 
|  | j->pld_scrr.byte = inb_p(j->XILINXbase); | 
|  | fOffHook = j->pld_scrr.pcib.det ? 1 : 0; | 
|  | } else | 
|  | fOffHook = j->pld_slicr.bits.det ? 1 : 0; | 
|  | } | 
|  | } | 
|  | break; | 
|  | case QTI_PHONECARD: | 
|  | fOffHook = ixj_pcmcia_cable_check(j); | 
|  | break; | 
|  | } | 
|  | if (j->r_hook != fOffHook) { | 
|  | j->r_hook = fOffHook; | 
|  | if (j->port == PORT_SPEAKER || j->port == PORT_HANDSET) { // || (j->port == PORT_PSTN && j->flags.pots_pstn == 0)) { | 
|  | j->ex.bits.hookstate = 1; | 
|  | ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN); | 
|  | } else if (!fOffHook) { | 
|  | j->flash_end = jiffies + ((60 * hertz) / 100); | 
|  | } | 
|  | } | 
|  | if (fOffHook) { | 
|  | if(time_before(jiffies, j->flash_end)) { | 
|  | j->ex.bits.flash = 1; | 
|  | j->flash_end = 0; | 
|  | ixj_kill_fasync(j, SIG_FLASH, POLL_IN); | 
|  | } | 
|  | } else { | 
|  | if(time_before(jiffies, j->flash_end)) { | 
|  | fOffHook = 1; | 
|  | } | 
|  | } | 
|  |  | 
|  | if (j->port == PORT_PSTN && j->daa_mode == SOP_PU_CONVERSATION) | 
|  | fOffHook |= 2; | 
|  |  | 
|  | if (j->port == PORT_SPEAKER) { | 
|  | if(j->cardtype == QTI_PHONECARD) { | 
|  | if(j->flags.pcmciascp && j->flags.pcmciasct) { | 
|  | fOffHook |= 2; | 
|  | } | 
|  | } else { | 
|  | fOffHook |= 2; | 
|  | } | 
|  | } | 
|  |  | 
|  | if (j->port == PORT_HANDSET) | 
|  | fOffHook |= 2; | 
|  |  | 
|  | return fOffHook; | 
|  | } | 
|  |  | 
|  | static void ixj_ring_off(IXJ *j) | 
|  | { | 
|  | if (j->dsp.low == 0x20)	/* Internet PhoneJACK */ | 
|  | { | 
|  | if (ixjdebug & 0x0004) | 
|  | printk(KERN_INFO "IXJ Ring Off\n"); | 
|  | j->gpio.bytes.high = 0x0B; | 
|  | j->gpio.bytes.low = 0x00; | 
|  | j->gpio.bits.gpio1 = 0; | 
|  | j->gpio.bits.gpio2 = 1; | 
|  | j->gpio.bits.gpio5 = 0; | 
|  | ixj_WriteDSPCommand(j->gpio.word, j); | 
|  | } else			/* Internet LineJACK */ | 
|  | { | 
|  | if (ixjdebug & 0x0004) | 
|  | printk(KERN_INFO "IXJ Ring Off\n"); | 
|  |  | 
|  | if(!j->flags.cidplay) | 
|  | SLIC_SetState(PLD_SLIC_STATE_STANDBY, j); | 
|  |  | 
|  | SLIC_GetState(j); | 
|  | } | 
|  | } | 
|  |  | 
|  | static void ixj_ring_start(IXJ *j) | 
|  | { | 
|  | j->flags.cringing = 1; | 
|  | if (ixjdebug & 0x0004) | 
|  | printk(KERN_INFO "IXJ Cadence Ringing Start /dev/phone%d\n", j->board); | 
|  | if (ixj_hookstate(j) & 1) { | 
|  | if (j->port == PORT_POTS) | 
|  | ixj_ring_off(j); | 
|  | j->flags.cringing = 0; | 
|  | if (ixjdebug & 0x0004) | 
|  | printk(KERN_INFO "IXJ Cadence Ringing Stopped /dev/phone%d off hook\n", j->board); | 
|  | } else if(j->cadence_f[5].enable && (!j->cadence_f[5].en_filter)) { | 
|  | j->ring_cadence_jif = jiffies; | 
|  | j->flags.cidsent = j->flags.cidring = 0; | 
|  | j->cadence_f[5].state = 0; | 
|  | if(j->cadence_f[5].on1) | 
|  | ixj_ring_on(j); | 
|  | } else { | 
|  | j->ring_cadence_jif = jiffies; | 
|  | j->ring_cadence_t = 15; | 
|  | if (j->ring_cadence & 1 << j->ring_cadence_t) { | 
|  | ixj_ring_on(j); | 
|  | } else { | 
|  | ixj_ring_off(j); | 
|  | } | 
|  | j->flags.cidsent = j->flags.cidring = j->flags.firstring = 0; | 
|  | } | 
|  | } | 
|  |  | 
|  | static int ixj_ring(IXJ *j) | 
|  | { | 
|  | char cntr; | 
|  | unsigned long jif; | 
|  |  | 
|  | j->flags.ringing = 1; | 
|  | if (ixj_hookstate(j) & 1) { | 
|  | ixj_ring_off(j); | 
|  | j->flags.ringing = 0; | 
|  | return 1; | 
|  | } | 
|  | for (cntr = 0; cntr < j->maxrings; cntr++) { | 
|  | jif = jiffies + (1 * hertz); | 
|  | ixj_ring_on(j); | 
|  | while (time_before(jiffies, jif)) { | 
|  | if (ixj_hookstate(j) & 1) { | 
|  | ixj_ring_off(j); | 
|  | j->flags.ringing = 0; | 
|  | return 1; | 
|  | } | 
|  | schedule_timeout_interruptible(1); | 
|  | if (signal_pending(current)) | 
|  | break; | 
|  | } | 
|  | jif = jiffies + (3 * hertz); | 
|  | ixj_ring_off(j); | 
|  | while (time_before(jiffies, jif)) { | 
|  | if (ixj_hookstate(j) & 1) { | 
|  | msleep(10); | 
|  | if (ixj_hookstate(j) & 1) { | 
|  | j->flags.ringing = 0; | 
|  | return 1; | 
|  | } | 
|  | } | 
|  | schedule_timeout_interruptible(1); | 
|  | if (signal_pending(current)) | 
|  | break; | 
|  | } | 
|  | } | 
|  | ixj_ring_off(j); | 
|  | j->flags.ringing = 0; | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static int ixj_open(struct phone_device *p, struct file *file_p) | 
|  | { | 
|  | IXJ *j = get_ixj(p->board); | 
|  | file_p->private_data = j; | 
|  |  | 
|  | if (!j->DSPbase) | 
|  | return -ENODEV; | 
|  |  | 
|  | if (file_p->f_mode & FMODE_READ) { | 
|  | if(!j->readers) { | 
|  | j->readers++; | 
|  | } else { | 
|  | return -EBUSY; | 
|  | } | 
|  | } | 
|  |  | 
|  | if (file_p->f_mode & FMODE_WRITE) { | 
|  | if(!j->writers) { | 
|  | j->writers++; | 
|  | } else { | 
|  | if (file_p->f_mode & FMODE_READ){ | 
|  | j->readers--; | 
|  | } | 
|  | return -EBUSY; | 
|  | } | 
|  | } | 
|  |  | 
|  | if (j->cardtype == QTI_PHONECARD) { | 
|  | j->pslic.bits.powerdown = 0; | 
|  | j->psccr.bits.dev = 3; | 
|  | j->psccr.bits.rw = 0; | 
|  | outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00); | 
|  | ixj_PCcontrol_wait(j); | 
|  | } | 
|  |  | 
|  | j->flags.cidplay = 0; | 
|  | j->flags.cidcw_ack = 0; | 
|  |  | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "Opening board %d\n", p->board); | 
|  |  | 
|  | j->framesread = j->frameswritten = 0; | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static int ixj_release(struct inode *inode, struct file *file_p) | 
|  | { | 
|  | IXJ_TONE ti; | 
|  | int cnt; | 
|  | IXJ *j = file_p->private_data; | 
|  | int board = j->p.board; | 
|  |  | 
|  | /* | 
|  | *    Set up locks to ensure that only one process is talking to the DSP at a time. | 
|  | *    This is necessary to keep the DSP from locking up. | 
|  | */ | 
|  | while(test_and_set_bit(board, (void *)&j->busyflags) != 0) | 
|  | schedule_timeout_interruptible(1); | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "Closing board %d\n", NUM(inode)); | 
|  |  | 
|  | if (j->cardtype == QTI_PHONECARD) | 
|  | ixj_set_port(j, PORT_SPEAKER); | 
|  | else | 
|  | ixj_set_port(j, PORT_POTS); | 
|  |  | 
|  | aec_stop(j); | 
|  | ixj_play_stop(j); | 
|  | ixj_record_stop(j); | 
|  | set_play_volume(j, 0x100); | 
|  | set_rec_volume(j, 0x100); | 
|  | ixj_ring_off(j); | 
|  |  | 
|  | /* Restore the tone table to default settings. */ | 
|  | ti.tone_index = 10; | 
|  | ti.gain0 = 1; | 
|  | ti.freq0 = hz941; | 
|  | ti.gain1 = 0; | 
|  | ti.freq1 = hz1209; | 
|  | ixj_init_tone(j, &ti); | 
|  | ti.tone_index = 11; | 
|  | ti.gain0 = 1; | 
|  | ti.freq0 = hz941; | 
|  | ti.gain1 = 0; | 
|  | ti.freq1 = hz1336; | 
|  | ixj_init_tone(j, &ti); | 
|  | ti.tone_index = 12; | 
|  | ti.gain0 = 1; | 
|  | ti.freq0 = hz941; | 
|  | ti.gain1 = 0; | 
|  | ti.freq1 = hz1477; | 
|  | ixj_init_tone(j, &ti); | 
|  | ti.tone_index = 13; | 
|  | ti.gain0 = 1; | 
|  | ti.freq0 = hz800; | 
|  | ti.gain1 = 0; | 
|  | ti.freq1 = 0; | 
|  | ixj_init_tone(j, &ti); | 
|  | ti.tone_index = 14; | 
|  | ti.gain0 = 1; | 
|  | ti.freq0 = hz1000; | 
|  | ti.gain1 = 0; | 
|  | ti.freq1 = 0; | 
|  | ixj_init_tone(j, &ti); | 
|  | ti.tone_index = 15; | 
|  | ti.gain0 = 1; | 
|  | ti.freq0 = hz1250; | 
|  | ti.gain1 = 0; | 
|  | ti.freq1 = 0; | 
|  | ixj_init_tone(j, &ti); | 
|  | ti.tone_index = 16; | 
|  | ti.gain0 = 1; | 
|  | ti.freq0 = hz950; | 
|  | ti.gain1 = 0; | 
|  | ti.freq1 = 0; | 
|  | ixj_init_tone(j, &ti); | 
|  | ti.tone_index = 17; | 
|  | ti.gain0 = 1; | 
|  | ti.freq0 = hz1100; | 
|  | ti.gain1 = 0; | 
|  | ti.freq1 = 0; | 
|  | ixj_init_tone(j, &ti); | 
|  | ti.tone_index = 18; | 
|  | ti.gain0 = 1; | 
|  | ti.freq0 = hz1400; | 
|  | ti.gain1 = 0; | 
|  | ti.freq1 = 0; | 
|  | ixj_init_tone(j, &ti); | 
|  | ti.tone_index = 19; | 
|  | ti.gain0 = 1; | 
|  | ti.freq0 = hz1500; | 
|  | ti.gain1 = 0; | 
|  | ti.freq1 = 0; | 
|  | ixj_init_tone(j, &ti); | 
|  | ti.tone_index = 20; | 
|  | ti.gain0 = 1; | 
|  | ti.freq0 = hz1600; | 
|  | ti.gain1 = 0; | 
|  | ti.freq1 = 0; | 
|  | ixj_init_tone(j, &ti); | 
|  | ti.tone_index = 21; | 
|  | ti.gain0 = 1; | 
|  | ti.freq0 = hz1800; | 
|  | ti.gain1 = 0; | 
|  | ti.freq1 = 0; | 
|  | ixj_init_tone(j, &ti); | 
|  | ti.tone_index = 22; | 
|  | ti.gain0 = 1; | 
|  | ti.freq0 = hz2100; | 
|  | ti.gain1 = 0; | 
|  | ti.freq1 = 0; | 
|  | ixj_init_tone(j, &ti); | 
|  | ti.tone_index = 23; | 
|  | ti.gain0 = 1; | 
|  | ti.freq0 = hz1300; | 
|  | ti.gain1 = 0; | 
|  | ti.freq1 = 0; | 
|  | ixj_init_tone(j, &ti); | 
|  | ti.tone_index = 24; | 
|  | ti.gain0 = 1; | 
|  | ti.freq0 = hz2450; | 
|  | ti.gain1 = 0; | 
|  | ti.freq1 = 0; | 
|  | ixj_init_tone(j, &ti); | 
|  | ti.tone_index = 25; | 
|  | ti.gain0 = 1; | 
|  | ti.freq0 = hz350; | 
|  | ti.gain1 = 0; | 
|  | ti.freq1 = hz440; | 
|  | ixj_init_tone(j, &ti); | 
|  | ti.tone_index = 26; | 
|  | ti.gain0 = 1; | 
|  | ti.freq0 = hz440; | 
|  | ti.gain1 = 0; | 
|  | ti.freq1 = hz480; | 
|  | ixj_init_tone(j, &ti); | 
|  | ti.tone_index = 27; | 
|  | ti.gain0 = 1; | 
|  | ti.freq0 = hz480; | 
|  | ti.gain1 = 0; | 
|  | ti.freq1 = hz620; | 
|  | ixj_init_tone(j, &ti); | 
|  |  | 
|  | set_rec_depth(j, 2);	/* Set Record Channel Limit to 2 frames */ | 
|  |  | 
|  | set_play_depth(j, 2);	/* Set Playback Channel Limit to 2 frames */ | 
|  |  | 
|  | j->ex.bits.dtmf_ready = 0; | 
|  | j->dtmf_state = 0; | 
|  | j->dtmf_wp = j->dtmf_rp = 0; | 
|  | j->rec_mode = j->play_mode = -1; | 
|  | j->flags.ringing = 0; | 
|  | j->maxrings = MAXRINGS; | 
|  | j->ring_cadence = USA_RING_CADENCE; | 
|  | if(j->cadence_f[5].enable) { | 
|  | j->cadence_f[5].enable = j->cadence_f[5].en_filter = j->cadence_f[5].state = 0; | 
|  | } | 
|  | j->drybuffer = 0; | 
|  | j->winktime = 320; | 
|  | j->flags.dtmf_oob = 0; | 
|  | for (cnt = 0; cnt < 4; cnt++) | 
|  | j->cadence_f[cnt].enable = 0; | 
|  |  | 
|  | idle(j); | 
|  |  | 
|  | if(j->cardtype == QTI_PHONECARD) { | 
|  | SLIC_SetState(PLD_SLIC_STATE_OC, j); | 
|  | } | 
|  |  | 
|  | if (file_p->f_mode & FMODE_READ) | 
|  | j->readers--; | 
|  | if (file_p->f_mode & FMODE_WRITE) | 
|  | j->writers--; | 
|  |  | 
|  | if (j->read_buffer && !j->readers) { | 
|  | kfree(j->read_buffer); | 
|  | j->read_buffer = NULL; | 
|  | j->read_buffer_size = 0; | 
|  | } | 
|  | if (j->write_buffer && !j->writers) { | 
|  | kfree(j->write_buffer); | 
|  | j->write_buffer = NULL; | 
|  | j->write_buffer_size = 0; | 
|  | } | 
|  | j->rec_codec = j->play_codec = 0; | 
|  | j->rec_frame_size = j->play_frame_size = 0; | 
|  | j->flags.cidsent = j->flags.cidring = 0; | 
|  | ixj_fasync(-1, file_p, 0);	/* remove from list of async notification */ | 
|  |  | 
|  | if(j->cardtype == QTI_LINEJACK && !j->readers && !j->writers) { | 
|  | ixj_set_port(j, PORT_PSTN); | 
|  | daa_set_mode(j, SOP_PU_SLEEP); | 
|  | ixj_set_pots(j, 1); | 
|  | } | 
|  | ixj_WriteDSPCommand(0x0FE3, j);	/* Put the DSP in 1/5 power mode. */ | 
|  |  | 
|  | /* Set up the default signals for events */ | 
|  | for (cnt = 0; cnt < 35; cnt++) | 
|  | j->ixj_signals[cnt] = SIGIO; | 
|  |  | 
|  | /* Set the excetion signal enable flags */ | 
|  | j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring = | 
|  | j->ex_sig.bits.caller_id = j->ex_sig.bits.pstn_wink = j->ex_sig.bits.f0 = j->ex_sig.bits.f1 = j->ex_sig.bits.f2 = | 
|  | j->ex_sig.bits.f3 = j->ex_sig.bits.fc0 = j->ex_sig.bits.fc1 = j->ex_sig.bits.fc2 = j->ex_sig.bits.fc3 = 1; | 
|  |  | 
|  | file_p->private_data = NULL; | 
|  | clear_bit(board, &j->busyflags); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static int read_filters(IXJ *j) | 
|  | { | 
|  | unsigned short fc, cnt, trg; | 
|  | int var; | 
|  |  | 
|  | trg = 0; | 
|  | if (ixj_WriteDSPCommand(0x5144, j)) { | 
|  | if(ixjdebug & 0x0001) { | 
|  | printk(KERN_INFO "Read Frame Counter failed!\n"); | 
|  | } | 
|  | return -1; | 
|  | } | 
|  | fc = j->ssr.high << 8 | j->ssr.low; | 
|  | if (fc == j->frame_count) | 
|  | return 1; | 
|  |  | 
|  | j->frame_count = fc; | 
|  |  | 
|  | if (j->dtmf_proc) | 
|  | return 1; | 
|  |  | 
|  | var = 10; | 
|  |  | 
|  | for (cnt = 0; cnt < 4; cnt++) { | 
|  | if (ixj_WriteDSPCommand(0x5154 + cnt, j)) { | 
|  | if(ixjdebug & 0x0001) { | 
|  | printk(KERN_INFO "Select Filter %d failed!\n", cnt); | 
|  | } | 
|  | return -1; | 
|  | } | 
|  | if (ixj_WriteDSPCommand(0x515C, j)) { | 
|  | if(ixjdebug & 0x0001) { | 
|  | printk(KERN_INFO "Read Filter History %d failed!\n", cnt); | 
|  | } | 
|  | return -1; | 
|  | } | 
|  | j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low; | 
|  |  | 
|  | if (j->cadence_f[cnt].enable) { | 
|  | if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) { | 
|  | if (j->cadence_f[cnt].state == 0) { | 
|  | j->cadence_f[cnt].state = 1; | 
|  | j->cadence_f[cnt].on1min = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 - var)) / 10000)); | 
|  | j->cadence_f[cnt].on1dot = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100)) / 10000)); | 
|  | j->cadence_f[cnt].on1max = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 + var)) / 10000)); | 
|  | } else if (j->cadence_f[cnt].state == 2 && | 
|  | (time_after(jiffies, j->cadence_f[cnt].off1min) && | 
|  | time_before(jiffies, j->cadence_f[cnt].off1max))) { | 
|  | if (j->cadence_f[cnt].on2) { | 
|  | j->cadence_f[cnt].state = 3; | 
|  | j->cadence_f[cnt].on2min = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 - var)) / 10000)); | 
|  | j->cadence_f[cnt].on2dot = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100)) / 10000)); | 
|  | j->cadence_f[cnt].on2max = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 + var)) / 10000)); | 
|  | } else { | 
|  | j->cadence_f[cnt].state = 7; | 
|  | } | 
|  | } else if (j->cadence_f[cnt].state == 4 && | 
|  | (time_after(jiffies, j->cadence_f[cnt].off2min) && | 
|  | time_before(jiffies, j->cadence_f[cnt].off2max))) { | 
|  | if (j->cadence_f[cnt].on3) { | 
|  | j->cadence_f[cnt].state = 5; | 
|  | j->cadence_f[cnt].on3min = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 - var)) / 10000)); | 
|  | j->cadence_f[cnt].on3dot = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100)) / 10000)); | 
|  | j->cadence_f[cnt].on3max = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 + var)) / 10000)); | 
|  | } else { | 
|  | j->cadence_f[cnt].state = 7; | 
|  | } | 
|  | } else { | 
|  | j->cadence_f[cnt].state = 0; | 
|  | } | 
|  | } else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) { | 
|  | if (j->cadence_f[cnt].state == 1) { | 
|  | if(!j->cadence_f[cnt].on1) { | 
|  | j->cadence_f[cnt].state = 7; | 
|  | } else if((time_after(jiffies, j->cadence_f[cnt].on1min) && | 
|  | time_before(jiffies, j->cadence_f[cnt].on1max))) { | 
|  | if(j->cadence_f[cnt].off1) { | 
|  | j->cadence_f[cnt].state = 2; | 
|  | j->cadence_f[cnt].off1min = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 - var)) / 10000)); | 
|  | j->cadence_f[cnt].off1dot = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100)) / 10000)); | 
|  | j->cadence_f[cnt].off1max = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 + var)) / 10000)); | 
|  | } else { | 
|  | j->cadence_f[cnt].state = 7; | 
|  | } | 
|  | } else { | 
|  | j->cadence_f[cnt].state = 0; | 
|  | } | 
|  | } else if (j->cadence_f[cnt].state == 3) { | 
|  | if((time_after(jiffies, j->cadence_f[cnt].on2min) && | 
|  | time_before(jiffies, j->cadence_f[cnt].on2max))) { | 
|  | if(j->cadence_f[cnt].off2) { | 
|  | j->cadence_f[cnt].state = 4; | 
|  | j->cadence_f[cnt].off2min = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 - var)) / 10000)); | 
|  | j->cadence_f[cnt].off2dot = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100)) / 10000)); | 
|  | j->cadence_f[cnt].off2max = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 + var)) / 10000)); | 
|  | } else { | 
|  | j->cadence_f[cnt].state = 7; | 
|  | } | 
|  | } else { | 
|  | j->cadence_f[cnt].state = 0; | 
|  | } | 
|  | } else if (j->cadence_f[cnt].state == 5) { | 
|  | if ((time_after(jiffies, j->cadence_f[cnt].on3min) && | 
|  | time_before(jiffies, j->cadence_f[cnt].on3max))) { | 
|  | if(j->cadence_f[cnt].off3) { | 
|  | j->cadence_f[cnt].state = 6; | 
|  | j->cadence_f[cnt].off3min = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 - var)) / 10000)); | 
|  | j->cadence_f[cnt].off3dot = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100)) / 10000)); | 
|  | j->cadence_f[cnt].off3max = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 + var)) / 10000)); | 
|  | } else { | 
|  | j->cadence_f[cnt].state = 7; | 
|  | } | 
|  | } else { | 
|  | j->cadence_f[cnt].state = 0; | 
|  | } | 
|  | } else { | 
|  | j->cadence_f[cnt].state = 0; | 
|  | } | 
|  | } else { | 
|  | switch(j->cadence_f[cnt].state) { | 
|  | case 1: | 
|  | if(time_after(jiffies, j->cadence_f[cnt].on1dot) && | 
|  | !j->cadence_f[cnt].off1 && | 
|  | !j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 && | 
|  | !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) { | 
|  | j->cadence_f[cnt].state = 7; | 
|  | } | 
|  | break; | 
|  | case 3: | 
|  | if(time_after(jiffies, j->cadence_f[cnt].on2dot) && | 
|  | !j->cadence_f[cnt].off2 && | 
|  | !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) { | 
|  | j->cadence_f[cnt].state = 7; | 
|  | } | 
|  | break; | 
|  | case 5: | 
|  | if(time_after(jiffies, j->cadence_f[cnt].on3dot) && | 
|  | !j->cadence_f[cnt].off3) { | 
|  | j->cadence_f[cnt].state = 7; | 
|  | } | 
|  | break; | 
|  | } | 
|  | } | 
|  |  | 
|  | if (ixjdebug & 0x0040) { | 
|  | printk(KERN_INFO "IXJ Tone Cadence state = %d /dev/phone%d at %ld\n", j->cadence_f[cnt].state, j->board, jiffies); | 
|  | switch(j->cadence_f[cnt].state) { | 
|  | case 0: | 
|  | printk(KERN_INFO "IXJ /dev/phone%d No Tone detected\n", j->board); | 
|  | break; | 
|  | case 1: | 
|  | printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %u %ld - %ld - %ld\n", j->board, | 
|  | j->cadence_f[cnt].on1, j->cadence_f[cnt].on1min, j->cadence_f[cnt].on1dot, j->cadence_f[cnt].on1max); | 
|  | break; | 
|  | case 2: | 
|  | printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off1min, | 
|  | j->cadence_f[cnt].off1max); | 
|  | break; | 
|  | case 3: | 
|  | printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on2min, | 
|  | j->cadence_f[cnt].on2max); | 
|  | break; | 
|  | case 4: | 
|  | printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off2min, | 
|  | j->cadence_f[cnt].off2max); | 
|  | break; | 
|  | case 5: | 
|  | printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on3min, | 
|  | j->cadence_f[cnt].on3max); | 
|  | break; | 
|  | case 6: | 
|  | printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off3min, | 
|  | j->cadence_f[cnt].off3max); | 
|  | break; | 
|  | } | 
|  | } | 
|  | } | 
|  | if (j->cadence_f[cnt].state == 7) { | 
|  | j->cadence_f[cnt].state = 0; | 
|  | if (j->cadence_f[cnt].enable == 1) | 
|  | j->cadence_f[cnt].enable = 0; | 
|  | switch (cnt) { | 
|  | case 0: | 
|  | if(ixjdebug & 0x0020) { | 
|  | printk(KERN_INFO "Filter Cadence 0 triggered %ld\n", jiffies); | 
|  | } | 
|  | j->ex.bits.fc0 = 1; | 
|  | ixj_kill_fasync(j, SIG_FC0, POLL_IN); | 
|  | break; | 
|  | case 1: | 
|  | if(ixjdebug & 0x0020) { | 
|  | printk(KERN_INFO "Filter Cadence 1 triggered %ld\n", jiffies); | 
|  | } | 
|  | j->ex.bits.fc1 = 1; | 
|  | ixj_kill_fasync(j, SIG_FC1, POLL_IN); | 
|  | break; | 
|  | case 2: | 
|  | if(ixjdebug & 0x0020) { | 
|  | printk(KERN_INFO "Filter Cadence 2 triggered %ld\n", jiffies); | 
|  | } | 
|  | j->ex.bits.fc2 = 1; | 
|  | ixj_kill_fasync(j, SIG_FC2, POLL_IN); | 
|  | break; | 
|  | case 3: | 
|  | if(ixjdebug & 0x0020) { | 
|  | printk(KERN_INFO "Filter Cadence 3 triggered %ld\n", jiffies); | 
|  | } | 
|  | j->ex.bits.fc3 = 1; | 
|  | ixj_kill_fasync(j, SIG_FC3, POLL_IN); | 
|  | break; | 
|  | } | 
|  | } | 
|  | if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) || | 
|  | (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) { | 
|  | if((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12))) { | 
|  | trg = 1; | 
|  | } else if((j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3))) { | 
|  | trg = 0; | 
|  | } | 
|  | switch (cnt) { | 
|  | case 0: | 
|  | if(ixjdebug & 0x0020) { | 
|  | printk(KERN_INFO "Filter 0 triggered %d at %ld\n", trg, jiffies); | 
|  | } | 
|  | j->ex.bits.f0 = 1; | 
|  | ixj_kill_fasync(j, SIG_F0, POLL_IN); | 
|  | break; | 
|  | case 1: | 
|  | if(ixjdebug & 0x0020) { | 
|  | printk(KERN_INFO "Filter 1 triggered %d at %ld\n", trg, jiffies); | 
|  | } | 
|  | j->ex.bits.f1 = 1; | 
|  | ixj_kill_fasync(j, SIG_F1, POLL_IN); | 
|  | break; | 
|  | case 2: | 
|  | if(ixjdebug & 0x0020) { | 
|  | printk(KERN_INFO "Filter 2 triggered %d at %ld\n", trg, jiffies); | 
|  | } | 
|  | j->ex.bits.f2 = 1; | 
|  | ixj_kill_fasync(j, SIG_F2, POLL_IN); | 
|  | break; | 
|  | case 3: | 
|  | if(ixjdebug & 0x0020) { | 
|  | printk(KERN_INFO "Filter 3 triggered %d at %ld\n", trg, jiffies); | 
|  | } | 
|  | j->ex.bits.f3 = 1; | 
|  | ixj_kill_fasync(j, SIG_F3, POLL_IN); | 
|  | break; | 
|  | } | 
|  | } | 
|  | } | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static int LineMonitor(IXJ *j) | 
|  | { | 
|  | if (j->dtmf_proc) { | 
|  | return -1; | 
|  | } | 
|  | j->dtmf_proc = 1; | 
|  |  | 
|  | if (ixj_WriteDSPCommand(0x7000, j))		/* Line Monitor */ | 
|  | return -1; | 
|  |  | 
|  | j->dtmf.bytes.high = j->ssr.high; | 
|  | j->dtmf.bytes.low = j->ssr.low; | 
|  | if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) { | 
|  | j->dtmf_state = 1; | 
|  | j->dtmf_current = j->dtmf.bits.digit; | 
|  | } | 
|  | if (j->dtmf_state && !j->dtmf.bits.dtmf_valid)	/* && j->dtmf_wp != j->dtmf_rp) */ | 
|  | { | 
|  | if(!j->cidcw_wait) { | 
|  | j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current; | 
|  | j->dtmf_wp++; | 
|  | if (j->dtmf_wp == 79) | 
|  | j->dtmf_wp = 0; | 
|  | j->ex.bits.dtmf_ready = 1; | 
|  | if(j->ex_sig.bits.dtmf_ready) { | 
|  | ixj_kill_fasync(j, SIG_DTMF_READY, POLL_IN); | 
|  | } | 
|  | } | 
|  | else if(j->dtmf_current == 0x00 || j->dtmf_current == 0x0D) { | 
|  | if(ixjdebug & 0x0020) { | 
|  | printk("IXJ phone%d saw CIDCW Ack DTMF %d from display at %ld\n", j->board, j->dtmf_current, jiffies); | 
|  | } | 
|  | j->flags.cidcw_ack = 1; | 
|  | } | 
|  | j->dtmf_state = 0; | 
|  | } | 
|  | j->dtmf_proc = 0; | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | /************************************************************************ | 
|  | * | 
|  | * Functions to allow alaw <-> ulaw conversions. | 
|  | * | 
|  | ************************************************************************/ | 
|  |  | 
|  | static void ulaw2alaw(unsigned char *buff, unsigned long len) | 
|  | { | 
|  | static unsigned char table_ulaw2alaw[] = | 
|  | { | 
|  | 0x2A, 0x2B, 0x28, 0x29, 0x2E, 0x2F, 0x2C, 0x2D, | 
|  | 0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25, | 
|  | 0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D, | 
|  | 0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35, | 
|  | 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 0x02, | 
|  | 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x1A, | 
|  | 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 0x12, | 
|  | 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x6B, | 
|  | 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 0x62, 0x63, | 
|  | 0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x7B, 0x79, | 
|  | 0x7E, 0x7F, 0x7C, 0x7D, 0x72, 0x73, 0x70, 0x71, | 
|  | 0x76, 0x77, 0x74, 0x75, 0x4B, 0x49, 0x4F, 0x4D, | 
|  | 0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45, | 
|  | 0x5A, 0x5B, 0x58, 0x59, 0x5E, 0x5F, 0x5C, 0x5D, | 
|  | 0x52, 0x52, 0x53, 0x53, 0x50, 0x50, 0x51, 0x51, | 
|  | 0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, 0xD5, | 
|  | 0xAA, 0xAB, 0xA8, 0xA9, 0xAE, 0xAF, 0xAC, 0xAD, | 
|  | 0xA2, 0xA3, 0xA0, 0xA1, 0xA6, 0xA7, 0xA4, 0xA5, | 
|  | 0xBA, 0xBB, 0xB8, 0xB9, 0xBE, 0xBF, 0xBC, 0xBD, | 
|  | 0xB2, 0xB3, 0xB0, 0xB1, 0xB6, 0xB7, 0xB4, 0xB5, | 
|  | 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 0x82, | 
|  | 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 0x9A, | 
|  | 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 0x92, | 
|  | 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0xEB, | 
|  | 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 0xE2, 0xE3, | 
|  | 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 0xFB, 0xF9, | 
|  | 0xFE, 0xFF, 0xFC, 0xFD, 0xF2, 0xF3, 0xF0, 0xF1, | 
|  | 0xF6, 0xF7, 0xF4, 0xF5, 0xCB, 0xC9, 0xCF, 0xCD, | 
|  | 0xC2, 0xC3, 0xC0, 0xC1, 0xC6, 0xC7, 0xC4, 0xC5, | 
|  | 0xDA, 0xDB, 0xD8, 0xD9, 0xDE, 0xDF, 0xDC, 0xDD, | 
|  | 0xD2, 0xD2, 0xD3, 0xD3, 0xD0, 0xD0, 0xD1, 0xD1, | 
|  | 0xD6, 0xD6, 0xD7, 0xD7, 0xD4, 0xD4, 0xD5, 0xD5 | 
|  | }; | 
|  |  | 
|  | while (len--) | 
|  | { | 
|  | *buff = table_ulaw2alaw[*(unsigned char *)buff]; | 
|  | buff++; | 
|  | } | 
|  | } | 
|  |  | 
|  | static void alaw2ulaw(unsigned char *buff, unsigned long len) | 
|  | { | 
|  | static unsigned char table_alaw2ulaw[] = | 
|  | { | 
|  | 0x29, 0x2A, 0x27, 0x28, 0x2D, 0x2E, 0x2B, 0x2C, | 
|  | 0x21, 0x22, 0x1F, 0x20, 0x25, 0x26, 0x23, 0x24, | 
|  | 0x39, 0x3A, 0x37, 0x38, 0x3D, 0x3E, 0x3B, 0x3C, | 
|  | 0x31, 0x32, 0x2F, 0x30, 0x35, 0x36, 0x33, 0x34, | 
|  | 0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, | 
|  | 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, | 
|  | 0x1A, 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, | 
|  | 0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, | 
|  | 0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65, | 
|  | 0x5D, 0x5D, 0x5C, 0x5C, 0x5F, 0x5F, 0x5E, 0x5E, | 
|  | 0x74, 0x76, 0x70, 0x72, 0x7C, 0x7E, 0x78, 0x7A, | 
|  | 0x6A, 0x6B, 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, | 
|  | 0x48, 0x49, 0x46, 0x47, 0x4C, 0x4D, 0x4A, 0x4B, | 
|  | 0x40, 0x41, 0x3F, 0x3F, 0x44, 0x45, 0x42, 0x43, | 
|  | 0x56, 0x57, 0x54, 0x55, 0x5A, 0x5B, 0x58, 0x59, | 
|  | 0x4F, 0x4F, 0x4E, 0x4E, 0x52, 0x53, 0x50, 0x51, | 
|  | 0xA9, 0xAA, 0xA7, 0xA8, 0xAD, 0xAE, 0xAB, 0xAC, | 
|  | 0xA1, 0xA2, 0x9F, 0xA0, 0xA5, 0xA6, 0xA3, 0xA4, | 
|  | 0xB9, 0xBA, 0xB7, 0xB8, 0xBD, 0xBE, 0xBB, 0xBC, | 
|  | 0xB1, 0xB2, 0xAF, 0xB0, 0xB5, 0xB6, 0xB3, 0xB4, | 
|  | 0x8A, 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, | 
|  | 0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, | 
|  | 0x9A, 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, | 
|  | 0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, | 
|  | 0xE2, 0xE3, 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, | 
|  | 0xDD, 0xDD, 0xDC, 0xDC, 0xDF, 0xDF, 0xDE, 0xDE, | 
|  | 0xF4, 0xF6, 0xF0, 0xF2, 0xFC, 0xFE, 0xF8, 0xFA, | 
|  | 0xEA, 0xEB, 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, | 
|  | 0xC8, 0xC9, 0xC6, 0xC7, 0xCC, 0xCD, 0xCA, 0xCB, | 
|  | 0xC0, 0xC1, 0xBF, 0xBF, 0xC4, 0xC5, 0xC2, 0xC3, | 
|  | 0xD6, 0xD7, 0xD4, 0xD5, 0xDA, 0xDB, 0xD8, 0xD9, | 
|  | 0xCF, 0xCF, 0xCE, 0xCE, 0xD2, 0xD3, 0xD0, 0xD1 | 
|  | }; | 
|  |  | 
|  | while (len--) | 
|  | { | 
|  | *buff = table_alaw2ulaw[*(unsigned char *)buff]; | 
|  | buff++; | 
|  | } | 
|  | } | 
|  |  | 
|  | static ssize_t ixj_read(struct file * file_p, char __user *buf, size_t length, loff_t * ppos) | 
|  | { | 
|  | unsigned long i = *ppos; | 
|  | IXJ * j = get_ixj(NUM(file_p->f_dentry->d_inode)); | 
|  |  | 
|  | DECLARE_WAITQUEUE(wait, current); | 
|  |  | 
|  | if (j->flags.inread) | 
|  | return -EALREADY; | 
|  |  | 
|  | j->flags.inread = 1; | 
|  |  | 
|  | add_wait_queue(&j->read_q, &wait); | 
|  | set_current_state(TASK_INTERRUPTIBLE); | 
|  | mb(); | 
|  |  | 
|  | while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) { | 
|  | ++j->read_wait; | 
|  | if (file_p->f_flags & O_NONBLOCK) { | 
|  | set_current_state(TASK_RUNNING); | 
|  | remove_wait_queue(&j->read_q, &wait); | 
|  | j->flags.inread = 0; | 
|  | return -EAGAIN; | 
|  | } | 
|  | if (!ixj_hookstate(j)) { | 
|  | set_current_state(TASK_RUNNING); | 
|  | remove_wait_queue(&j->read_q, &wait); | 
|  | j->flags.inread = 0; | 
|  | return 0; | 
|  | } | 
|  | interruptible_sleep_on(&j->read_q); | 
|  | if (signal_pending(current)) { | 
|  | set_current_state(TASK_RUNNING); | 
|  | remove_wait_queue(&j->read_q, &wait); | 
|  | j->flags.inread = 0; | 
|  | return -EINTR; | 
|  | } | 
|  | } | 
|  |  | 
|  | remove_wait_queue(&j->read_q, &wait); | 
|  | set_current_state(TASK_RUNNING); | 
|  | /* Don't ever copy more than the user asks */ | 
|  | if(j->rec_codec == ALAW) | 
|  | ulaw2alaw(j->read_buffer, min(length, j->read_buffer_size)); | 
|  | i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size)); | 
|  | j->read_buffer_ready = 0; | 
|  | if (i) { | 
|  | j->flags.inread = 0; | 
|  | return -EFAULT; | 
|  | } else { | 
|  | j->flags.inread = 0; | 
|  | return min(length, j->read_buffer_size); | 
|  | } | 
|  | } | 
|  |  | 
|  | static ssize_t ixj_enhanced_read(struct file * file_p, char __user *buf, size_t length, | 
|  | loff_t * ppos) | 
|  | { | 
|  | int pre_retval; | 
|  | ssize_t read_retval = 0; | 
|  | IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode)); | 
|  |  | 
|  | pre_retval = ixj_PreRead(j, 0L); | 
|  | switch (pre_retval) { | 
|  | case NORMAL: | 
|  | read_retval = ixj_read(file_p, buf, length, ppos); | 
|  | ixj_PostRead(j, 0L); | 
|  | break; | 
|  | case NOPOST: | 
|  | read_retval = ixj_read(file_p, buf, length, ppos); | 
|  | break; | 
|  | case POSTONLY: | 
|  | ixj_PostRead(j, 0L); | 
|  | break; | 
|  | default: | 
|  | read_retval = pre_retval; | 
|  | } | 
|  | return read_retval; | 
|  | } | 
|  |  | 
|  | static ssize_t ixj_write(struct file *file_p, const char __user *buf, size_t count, loff_t * ppos) | 
|  | { | 
|  | unsigned long i = *ppos; | 
|  | IXJ *j = file_p->private_data; | 
|  |  | 
|  | DECLARE_WAITQUEUE(wait, current); | 
|  |  | 
|  | if (j->flags.inwrite) | 
|  | return -EALREADY; | 
|  |  | 
|  | j->flags.inwrite = 1; | 
|  |  | 
|  | add_wait_queue(&j->write_q, &wait); | 
|  | set_current_state(TASK_INTERRUPTIBLE); | 
|  | mb(); | 
|  |  | 
|  |  | 
|  | while (!j->write_buffers_empty) { | 
|  | ++j->write_wait; | 
|  | if (file_p->f_flags & O_NONBLOCK) { | 
|  | set_current_state(TASK_RUNNING); | 
|  | remove_wait_queue(&j->write_q, &wait); | 
|  | j->flags.inwrite = 0; | 
|  | return -EAGAIN; | 
|  | } | 
|  | if (!ixj_hookstate(j)) { | 
|  | set_current_state(TASK_RUNNING); | 
|  | remove_wait_queue(&j->write_q, &wait); | 
|  | j->flags.inwrite = 0; | 
|  | return 0; | 
|  | } | 
|  | interruptible_sleep_on(&j->write_q); | 
|  | if (signal_pending(current)) { | 
|  | set_current_state(TASK_RUNNING); | 
|  | remove_wait_queue(&j->write_q, &wait); | 
|  | j->flags.inwrite = 0; | 
|  | return -EINTR; | 
|  | } | 
|  | } | 
|  | set_current_state(TASK_RUNNING); | 
|  | remove_wait_queue(&j->write_q, &wait); | 
|  | if (j->write_buffer_wp + count >= j->write_buffer_end) | 
|  | j->write_buffer_wp = j->write_buffer; | 
|  | i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size)); | 
|  | if (i) { | 
|  | j->flags.inwrite = 0; | 
|  | return -EFAULT; | 
|  | } | 
|  | if(j->play_codec == ALAW) | 
|  | alaw2ulaw(j->write_buffer_wp, min(count, j->write_buffer_size)); | 
|  | j->flags.inwrite = 0; | 
|  | return min(count, j->write_buffer_size); | 
|  | } | 
|  |  | 
|  | static ssize_t ixj_enhanced_write(struct file * file_p, const char __user *buf, size_t count, loff_t * ppos) | 
|  | { | 
|  | int pre_retval; | 
|  | ssize_t write_retval = 0; | 
|  |  | 
|  | IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode)); | 
|  |  | 
|  | pre_retval = ixj_PreWrite(j, 0L); | 
|  | switch (pre_retval) { | 
|  | case NORMAL: | 
|  | write_retval = ixj_write(file_p, buf, count, ppos); | 
|  | if (write_retval > 0) { | 
|  | ixj_PostWrite(j, 0L); | 
|  | j->write_buffer_wp += write_retval; | 
|  | j->write_buffers_empty--; | 
|  | } | 
|  | break; | 
|  | case NOPOST: | 
|  | write_retval = ixj_write(file_p, buf, count, ppos); | 
|  | if (write_retval > 0) { | 
|  | j->write_buffer_wp += write_retval; | 
|  | j->write_buffers_empty--; | 
|  | } | 
|  | break; | 
|  | case POSTONLY: | 
|  | ixj_PostWrite(j, 0L); | 
|  | break; | 
|  | default: | 
|  | write_retval = pre_retval; | 
|  | } | 
|  | return write_retval; | 
|  | } | 
|  |  | 
|  | static void ixj_read_frame(IXJ *j) | 
|  | { | 
|  | int cnt, dly; | 
|  |  | 
|  | if (j->read_buffer) { | 
|  | for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) { | 
|  | if (!(cnt % 16) && !IsRxReady(j)) { | 
|  | dly = 0; | 
|  | while (!IsRxReady(j)) { | 
|  | if (dly++ > 5) { | 
|  | dly = 0; | 
|  | break; | 
|  | } | 
|  | udelay(10); | 
|  | } | 
|  | } | 
|  | /* Throw away word 0 of the 8021 compressed format to get standard G.729. */ | 
|  | if (j->rec_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) { | 
|  | inb_p(j->DSPbase + 0x0E); | 
|  | inb_p(j->DSPbase + 0x0F); | 
|  | } | 
|  | *(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E); | 
|  | *(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F); | 
|  | } | 
|  | ++j->framesread; | 
|  | if (j->intercom != -1) { | 
|  | if (IsTxReady(get_ixj(j->intercom))) { | 
|  | for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) { | 
|  | if (!(cnt % 16) && !IsTxReady(j)) { | 
|  | dly = 0; | 
|  | while (!IsTxReady(j)) { | 
|  | if (dly++ > 5) { | 
|  | dly = 0; | 
|  | break; | 
|  | } | 
|  | udelay(10); | 
|  | } | 
|  | } | 
|  | outb_p(*(j->read_buffer + cnt), get_ixj(j->intercom)->DSPbase + 0x0C); | 
|  | outb_p(*(j->read_buffer + cnt + 1), get_ixj(j->intercom)->DSPbase + 0x0D); | 
|  | } | 
|  | get_ixj(j->intercom)->frameswritten++; | 
|  | } | 
|  | } else { | 
|  | j->read_buffer_ready = 1; | 
|  | wake_up_interruptible(&j->read_q);	/* Wake any blocked readers */ | 
|  |  | 
|  | wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */ | 
|  |  | 
|  | if(j->ixj_signals[SIG_READ_READY]) | 
|  | ixj_kill_fasync(j, SIG_READ_READY, POLL_OUT); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | static short fsk[][6][20] = | 
|  | { | 
|  | { | 
|  | { | 
|  | 0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196, | 
|  | -16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722 | 
|  | }, | 
|  | { | 
|  | -28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481, | 
|  | -32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876 | 
|  | }, | 
|  | { | 
|  | -28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715, | 
|  | -16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846 | 
|  | }, | 
|  | { | 
|  | 0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196, | 
|  | 16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722 | 
|  | }, | 
|  | { | 
|  | 28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481, | 
|  | 32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876 | 
|  | }, | 
|  | { | 
|  | 28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715, | 
|  | 16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846 | 
|  | } | 
|  | }, | 
|  | { | 
|  | { | 
|  | 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126, | 
|  | 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126 | 
|  | }, | 
|  | { | 
|  | -28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051, | 
|  | 28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051 | 
|  | }, | 
|  | { | 
|  | -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925, | 
|  | 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925 | 
|  | }, | 
|  | { | 
|  | 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126, | 
|  | 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126 | 
|  | }, | 
|  | { | 
|  | 28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051, | 
|  | -28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051 | 
|  | }, | 
|  | { | 
|  | 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925, | 
|  | -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925 | 
|  | } | 
|  | } | 
|  | }; | 
|  |  | 
|  |  | 
|  | static void ixj_write_cid_bit(IXJ *j, int bit) | 
|  | { | 
|  | while (j->fskcnt < 20) { | 
|  | if(j->fskdcnt < (j->fsksize - 1)) | 
|  | j->fskdata[j->fskdcnt++] = fsk[bit][j->fskz][j->fskcnt]; | 
|  |  | 
|  | j->fskcnt += 3; | 
|  | } | 
|  | j->fskcnt %= 20; | 
|  |  | 
|  | if (!bit) | 
|  | j->fskz++; | 
|  | if (j->fskz >= 6) | 
|  | j->fskz = 0; | 
|  |  | 
|  | } | 
|  |  | 
|  | static void ixj_write_cid_byte(IXJ *j, char byte) | 
|  | { | 
|  | IXJ_CBYTE cb; | 
|  |  | 
|  | cb.cbyte = byte; | 
|  | ixj_write_cid_bit(j, 0); | 
|  | ixj_write_cid_bit(j, cb.cbits.b0 ? 1 : 0); | 
|  | ixj_write_cid_bit(j, cb.cbits.b1 ? 1 : 0); | 
|  | ixj_write_cid_bit(j, cb.cbits.b2 ? 1 : 0); | 
|  | ixj_write_cid_bit(j, cb.cbits.b3 ? 1 : 0); | 
|  | ixj_write_cid_bit(j, cb.cbits.b4 ? 1 : 0); | 
|  | ixj_write_cid_bit(j, cb.cbits.b5 ? 1 : 0); | 
|  | ixj_write_cid_bit(j, cb.cbits.b6 ? 1 : 0); | 
|  | ixj_write_cid_bit(j, cb.cbits.b7 ? 1 : 0); | 
|  | ixj_write_cid_bit(j, 1); | 
|  | } | 
|  |  | 
|  | static void ixj_write_cid_seize(IXJ *j) | 
|  | { | 
|  | int cnt; | 
|  |  | 
|  | for (cnt = 0; cnt < 150; cnt++) { | 
|  | ixj_write_cid_bit(j, 0); | 
|  | ixj_write_cid_bit(j, 1); | 
|  | } | 
|  | for (cnt = 0; cnt < 180; cnt++) { | 
|  | ixj_write_cid_bit(j, 1); | 
|  | } | 
|  | } | 
|  |  | 
|  | static void ixj_write_cidcw_seize(IXJ *j) | 
|  | { | 
|  | int cnt; | 
|  |  | 
|  | for (cnt = 0; cnt < 80; cnt++) { | 
|  | ixj_write_cid_bit(j, 1); | 
|  | } | 
|  | } | 
|  |  | 
|  | static int ixj_write_cid_string(IXJ *j, char *s, int checksum) | 
|  | { | 
|  | int cnt; | 
|  |  | 
|  | for (cnt = 0; cnt < strlen(s); cnt++) { | 
|  | ixj_write_cid_byte(j, s[cnt]); | 
|  | checksum = (checksum + s[cnt]); | 
|  | } | 
|  | return checksum; | 
|  | } | 
|  |  | 
|  | static void ixj_pad_fsk(IXJ *j, int pad) | 
|  | { | 
|  | int cnt; | 
|  |  | 
|  | for (cnt = 0; cnt < pad; cnt++) { | 
|  | if(j->fskdcnt < (j->fsksize - 1)) | 
|  | j->fskdata[j->fskdcnt++] = 0x0000; | 
|  | } | 
|  | for (cnt = 0; cnt < 720; cnt++) { | 
|  | if(j->fskdcnt < (j->fsksize - 1)) | 
|  | j->fskdata[j->fskdcnt++] = 0x0000; | 
|  | } | 
|  | } | 
|  |  | 
|  | static void ixj_pre_cid(IXJ *j) | 
|  | { | 
|  | j->cid_play_codec = j->play_codec; | 
|  | j->cid_play_frame_size = j->play_frame_size; | 
|  | j->cid_play_volume = get_play_volume(j); | 
|  | j->cid_play_flag = j->flags.playing; | 
|  |  | 
|  | j->cid_rec_codec = j->rec_codec; | 
|  | j->cid_rec_volume = get_rec_volume(j); | 
|  | j->cid_rec_flag = j->flags.recording; | 
|  |  | 
|  | j->cid_play_aec_level = j->aec_level; | 
|  |  | 
|  | switch(j->baseframe.low) { | 
|  | case 0xA0: | 
|  | j->cid_base_frame_size = 20; | 
|  | break; | 
|  | case 0x50: | 
|  | j->cid_base_frame_size = 10; | 
|  | break; | 
|  | case 0xF0: | 
|  | j->cid_base_frame_size = 30; | 
|  | break; | 
|  | } | 
|  |  | 
|  | ixj_play_stop(j); | 
|  | ixj_cpt_stop(j); | 
|  |  | 
|  | j->flags.cidplay = 1; | 
|  |  | 
|  | set_base_frame(j, 30); | 
|  | set_play_codec(j, LINEAR16); | 
|  | set_play_volume(j, 0x1B); | 
|  | ixj_play_start(j); | 
|  | } | 
|  |  | 
|  | static void ixj_post_cid(IXJ *j) | 
|  | { | 
|  | ixj_play_stop(j); | 
|  |  | 
|  | if(j->cidsize > 5000) { | 
|  | SLIC_SetState(PLD_SLIC_STATE_STANDBY, j); | 
|  | } | 
|  | j->flags.cidplay = 0; | 
|  | if(ixjdebug & 0x0200) { | 
|  | printk("IXJ phone%d Finished Playing CallerID data %ld\n", j->board, jiffies); | 
|  | } | 
|  |  | 
|  | ixj_fsk_free(j); | 
|  |  | 
|  | j->fskdcnt = 0; | 
|  | set_base_frame(j, j->cid_base_frame_size); | 
|  | set_play_codec(j, j->cid_play_codec); | 
|  | ixj_aec_start(j, j->cid_play_aec_level); | 
|  | set_play_volume(j, j->cid_play_volume); | 
|  |  | 
|  | set_rec_codec(j, j->cid_rec_codec); | 
|  | set_rec_volume(j, j->cid_rec_volume); | 
|  |  | 
|  | if(j->cid_rec_flag) | 
|  | ixj_record_start(j); | 
|  |  | 
|  | if(j->cid_play_flag) | 
|  | ixj_play_start(j); | 
|  |  | 
|  | if(j->cid_play_flag) { | 
|  | wake_up_interruptible(&j->write_q);	/* Wake any blocked writers */ | 
|  | } | 
|  | } | 
|  |  | 
|  | static void ixj_write_cid(IXJ *j) | 
|  | { | 
|  | char sdmf1[50]; | 
|  | char sdmf2[50]; | 
|  | char sdmf3[80]; | 
|  | char mdmflen, len1, len2, len3; | 
|  | int pad; | 
|  |  | 
|  | int checksum = 0; | 
|  |  | 
|  | if (j->dsp.low == 0x20 || j->flags.cidplay) | 
|  | return; | 
|  |  | 
|  | j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0; | 
|  | j->cidsize = j->cidcnt = 0; | 
|  |  | 
|  | ixj_fsk_alloc(j); | 
|  |  | 
|  | strcpy(sdmf1, j->cid_send.month); | 
|  | strcat(sdmf1, j->cid_send.day); | 
|  | strcat(sdmf1, j->cid_send.hour); | 
|  | strcat(sdmf1, j->cid_send.min); | 
|  | strcpy(sdmf2, j->cid_send.number); | 
|  | strcpy(sdmf3, j->cid_send.name); | 
|  |  | 
|  | len1 = strlen(sdmf1); | 
|  | len2 = strlen(sdmf2); | 
|  | len3 = strlen(sdmf3); | 
|  | mdmflen = len1 + len2 + len3 + 6; | 
|  |  | 
|  | while(1){ | 
|  | ixj_write_cid_seize(j); | 
|  |  | 
|  | ixj_write_cid_byte(j, 0x80); | 
|  | checksum = 0x80; | 
|  | ixj_write_cid_byte(j, mdmflen); | 
|  | checksum = checksum + mdmflen; | 
|  |  | 
|  | ixj_write_cid_byte(j, 0x01); | 
|  | checksum = checksum + 0x01; | 
|  | ixj_write_cid_byte(j, len1); | 
|  | checksum = checksum + len1; | 
|  | checksum = ixj_write_cid_string(j, sdmf1, checksum); | 
|  | if(ixj_hookstate(j) & 1) | 
|  | break; | 
|  |  | 
|  | ixj_write_cid_byte(j, 0x02); | 
|  | checksum = checksum + 0x02; | 
|  | ixj_write_cid_byte(j, len2); | 
|  | checksum = checksum + len2; | 
|  | checksum = ixj_write_cid_string(j, sdmf2, checksum); | 
|  | if(ixj_hookstate(j) & 1) | 
|  | break; | 
|  |  | 
|  | ixj_write_cid_byte(j, 0x07); | 
|  | checksum = checksum + 0x07; | 
|  | ixj_write_cid_byte(j, len3); | 
|  | checksum = checksum + len3; | 
|  | checksum = ixj_write_cid_string(j, sdmf3, checksum); | 
|  | if(ixj_hookstate(j) & 1) | 
|  | break; | 
|  |  | 
|  | checksum %= 256; | 
|  | checksum ^= 0xFF; | 
|  | checksum += 1; | 
|  |  | 
|  | ixj_write_cid_byte(j, (char) checksum); | 
|  |  | 
|  | pad = j->fskdcnt % 240; | 
|  | if (pad) { | 
|  | pad = 240 - pad; | 
|  | } | 
|  | ixj_pad_fsk(j, pad); | 
|  | break; | 
|  | } | 
|  |  | 
|  | ixj_write_frame(j); | 
|  | } | 
|  |  | 
|  | static void ixj_write_cidcw(IXJ *j) | 
|  | { | 
|  | IXJ_TONE ti; | 
|  |  | 
|  | char sdmf1[50]; | 
|  | char sdmf2[50]; | 
|  | char sdmf3[80]; | 
|  | char mdmflen, len1, len2, len3; | 
|  | int pad; | 
|  |  | 
|  | int checksum = 0; | 
|  |  | 
|  | if (j->dsp.low == 0x20 || j->flags.cidplay) | 
|  | return; | 
|  |  | 
|  | j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0; | 
|  | j->cidsize = j->cidcnt = 0; | 
|  |  | 
|  | ixj_fsk_alloc(j); | 
|  |  | 
|  | j->flags.cidcw_ack = 0; | 
|  |  | 
|  | ti.tone_index = 23; | 
|  | ti.gain0 = 1; | 
|  | ti.freq0 = hz440; | 
|  | ti.gain1 = 0; | 
|  | ti.freq1 = 0; | 
|  | ixj_init_tone(j, &ti); | 
|  |  | 
|  | ixj_set_tone_on(1500, j); | 
|  | ixj_set_tone_off(32, j); | 
|  | if(ixjdebug & 0x0200) { | 
|  | printk("IXJ cidcw phone%d first tone start at %ld\n", j->board, jiffies); | 
|  | } | 
|  | ixj_play_tone(j, 23); | 
|  |  | 
|  | clear_bit(j->board, &j->busyflags); | 
|  | while(j->tone_state) | 
|  | schedule_timeout_interruptible(1); | 
|  | while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) | 
|  | schedule_timeout_interruptible(1); | 
|  | if(ixjdebug & 0x0200) { | 
|  | printk("IXJ cidcw phone%d first tone end at %ld\n", j->board, jiffies); | 
|  | } | 
|  |  | 
|  | ti.tone_index = 24; | 
|  | ti.gain0 = 1; | 
|  | ti.freq0 = hz2130; | 
|  | ti.gain1 = 0; | 
|  | ti.freq1 = hz2750; | 
|  | ixj_init_tone(j, &ti); | 
|  |  | 
|  | ixj_set_tone_off(10, j); | 
|  | ixj_set_tone_on(600, j); | 
|  | if(ixjdebug & 0x0200) { | 
|  | printk("IXJ cidcw phone%d second tone start at %ld\n", j->board, jiffies); | 
|  | } | 
|  | ixj_play_tone(j, 24); | 
|  |  | 
|  | clear_bit(j->board, &j->busyflags); | 
|  | while(j->tone_state) | 
|  | schedule_timeout_interruptible(1); | 
|  | while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) | 
|  | schedule_timeout_interruptible(1); | 
|  | if(ixjdebug & 0x0200) { | 
|  | printk("IXJ cidcw phone%d sent second tone at %ld\n", j->board, jiffies); | 
|  | } | 
|  |  | 
|  | j->cidcw_wait = jiffies + ((50 * hertz) / 100); | 
|  |  | 
|  | clear_bit(j->board, &j->busyflags); | 
|  | while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait)) | 
|  | schedule_timeout_interruptible(1); | 
|  | while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) | 
|  | schedule_timeout_interruptible(1); | 
|  | j->cidcw_wait = 0; | 
|  | if(!j->flags.cidcw_ack) { | 
|  | if(ixjdebug & 0x0200) { | 
|  | printk("IXJ cidcw phone%d did not receive ACK from display %ld\n", j->board, jiffies); | 
|  | } | 
|  | ixj_post_cid(j); | 
|  | if(j->cid_play_flag) { | 
|  | wake_up_interruptible(&j->write_q);	/* Wake any blocked readers */ | 
|  | } | 
|  | return; | 
|  | } else { | 
|  | ixj_pre_cid(j); | 
|  | } | 
|  | j->flags.cidcw_ack = 0; | 
|  | strcpy(sdmf1, j->cid_send.month); | 
|  | strcat(sdmf1, j->cid_send.day); | 
|  | strcat(sdmf1, j->cid_send.hour); | 
|  | strcat(sdmf1, j->cid_send.min); | 
|  | strcpy(sdmf2, j->cid_send.number); | 
|  | strcpy(sdmf3, j->cid_send.name); | 
|  |  | 
|  | len1 = strlen(sdmf1); | 
|  | len2 = strlen(sdmf2); | 
|  | len3 = strlen(sdmf3); | 
|  | mdmflen = len1 + len2 + len3 + 6; | 
|  |  | 
|  | ixj_write_cidcw_seize(j); | 
|  |  | 
|  | ixj_write_cid_byte(j, 0x80); | 
|  | checksum = 0x80; | 
|  | ixj_write_cid_byte(j, mdmflen); | 
|  | checksum = checksum + mdmflen; | 
|  |  | 
|  | ixj_write_cid_byte(j, 0x01); | 
|  | checksum = checksum + 0x01; | 
|  | ixj_write_cid_byte(j, len1); | 
|  | checksum = checksum + len1; | 
|  | checksum = ixj_write_cid_string(j, sdmf1, checksum); | 
|  |  | 
|  | ixj_write_cid_byte(j, 0x02); | 
|  | checksum = checksum + 0x02; | 
|  | ixj_write_cid_byte(j, len2); | 
|  | checksum = checksum + len2; | 
|  | checksum = ixj_write_cid_string(j, sdmf2, checksum); | 
|  |  | 
|  | ixj_write_cid_byte(j, 0x07); | 
|  | checksum = checksum + 0x07; | 
|  | ixj_write_cid_byte(j, len3); | 
|  | checksum = checksum + len3; | 
|  | checksum = ixj_write_cid_string(j, sdmf3, checksum); | 
|  |  | 
|  | checksum %= 256; | 
|  | checksum ^= 0xFF; | 
|  | checksum += 1; | 
|  |  | 
|  | ixj_write_cid_byte(j, (char) checksum); | 
|  |  | 
|  | pad = j->fskdcnt % 240; | 
|  | if (pad) { | 
|  | pad = 240 - pad; | 
|  | } | 
|  | ixj_pad_fsk(j, pad); | 
|  | if(ixjdebug & 0x0200) { | 
|  | printk("IXJ cidcw phone%d sent FSK data at %ld\n", j->board, jiffies); | 
|  | } | 
|  | } | 
|  |  | 
|  | static void ixj_write_vmwi(IXJ *j, int msg) | 
|  | { | 
|  | char mdmflen; | 
|  | int pad; | 
|  |  | 
|  | int checksum = 0; | 
|  |  | 
|  | if (j->dsp.low == 0x20 || j->flags.cidplay) | 
|  | return; | 
|  |  | 
|  | j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0; | 
|  | j->cidsize = j->cidcnt = 0; | 
|  |  | 
|  | ixj_fsk_alloc(j); | 
|  |  | 
|  | mdmflen = 3; | 
|  |  | 
|  | if (j->port == PORT_POTS) | 
|  | SLIC_SetState(PLD_SLIC_STATE_OHT, j); | 
|  |  | 
|  | ixj_write_cid_seize(j); | 
|  |  | 
|  | ixj_write_cid_byte(j, 0x82); | 
|  | checksum = 0x82; | 
|  | ixj_write_cid_byte(j, mdmflen); | 
|  | checksum = checksum + mdmflen; | 
|  |  | 
|  | ixj_write_cid_byte(j, 0x0B); | 
|  | checksum = checksum + 0x0B; | 
|  | ixj_write_cid_byte(j, 1); | 
|  | checksum = checksum + 1; | 
|  |  | 
|  | if(msg) { | 
|  | ixj_write_cid_byte(j, 0xFF); | 
|  | checksum = checksum + 0xFF; | 
|  | } | 
|  | else { | 
|  | ixj_write_cid_byte(j, 0x00); | 
|  | checksum = checksum + 0x00; | 
|  | } | 
|  |  | 
|  | checksum %= 256; | 
|  | checksum ^= 0xFF; | 
|  | checksum += 1; | 
|  |  | 
|  | ixj_write_cid_byte(j, (char) checksum); | 
|  |  | 
|  | pad = j->fskdcnt % 240; | 
|  | if (pad) { | 
|  | pad = 240 - pad; | 
|  | } | 
|  | ixj_pad_fsk(j, pad); | 
|  | } | 
|  |  | 
|  | static void ixj_write_frame(IXJ *j) | 
|  | { | 
|  | int cnt, frame_count, dly; | 
|  | IXJ_WORD dat; | 
|  | BYTES blankword; | 
|  |  | 
|  | frame_count = 0; | 
|  | if(j->flags.cidplay) { | 
|  | for(cnt = 0; cnt < 480; cnt++) { | 
|  | if (!(cnt % 16) && !IsTxReady(j)) { | 
|  | dly = 0; | 
|  | while (!IsTxReady(j)) { | 
|  | if (dly++ > 5) { | 
|  | dly = 0; | 
|  | break; | 
|  | } | 
|  | udelay(10); | 
|  | } | 
|  | } | 
|  | dat.word = j->fskdata[j->cidcnt++]; | 
|  | outb_p(dat.bytes.low, j->DSPbase + 0x0C); | 
|  | outb_p(dat.bytes.high, j->DSPbase + 0x0D); | 
|  | cnt++; | 
|  | } | 
|  | if(j->cidcnt >= j->fskdcnt) { | 
|  | ixj_post_cid(j); | 
|  | } | 
|  | /* This may seem rude, but if we just played one frame of FSK data for CallerID | 
|  | and there is real audio data in the buffer, we need to throw it away because | 
|  | we just used it's time slot */ | 
|  | if (j->write_buffer_rp > j->write_buffer_wp) { | 
|  | j->write_buffer_rp += j->cid_play_frame_size * 2; | 
|  | if (j->write_buffer_rp >= j->write_buffer_end) { | 
|  | j->write_buffer_rp = j->write_buffer; | 
|  | } | 
|  | j->write_buffers_empty++; | 
|  | wake_up_interruptible(&j->write_q);	/* Wake any blocked writers */ | 
|  |  | 
|  | wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */ | 
|  | } | 
|  | } else if (j->write_buffer && j->write_buffers_empty < 1) { | 
|  | if (j->write_buffer_wp > j->write_buffer_rp) { | 
|  | frame_count = | 
|  | (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2); | 
|  | } | 
|  | if (j->write_buffer_rp > j->write_buffer_wp) { | 
|  | frame_count = | 
|  | (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) + | 
|  | (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2); | 
|  | } | 
|  | if (frame_count >= 1) { | 
|  | if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) { | 
|  | switch (j->play_mode) { | 
|  | case PLAYBACK_MODE_ULAW: | 
|  | case PLAYBACK_MODE_ALAW: | 
|  | blankword.low = blankword.high = 0xFF; | 
|  | break; | 
|  | case PLAYBACK_MODE_8LINEAR: | 
|  | case PLAYBACK_MODE_16LINEAR: | 
|  | blankword.low = blankword.high = 0x00; | 
|  | break; | 
|  | case PLAYBACK_MODE_8LINEAR_WSS: | 
|  | blankword.low = blankword.high = 0x80; | 
|  | break; | 
|  | } | 
|  | for (cnt = 0; cnt < 16; cnt++) { | 
|  | if (!(cnt % 16) && !IsTxReady(j)) { | 
|  | dly = 0; | 
|  | while (!IsTxReady(j)) { | 
|  | if (dly++ > 5) { | 
|  | dly = 0; | 
|  | break; | 
|  | } | 
|  | udelay(10); | 
|  | } | 
|  | } | 
|  | outb_p((blankword.low), j->DSPbase + 0x0C); | 
|  | outb_p((blankword.high), j->DSPbase + 0x0D); | 
|  | } | 
|  | j->flags.play_first_frame = 0; | 
|  | } else	if (j->play_codec == G723_63 && j->flags.play_first_frame) { | 
|  | for (cnt = 0; cnt < 24; cnt++) { | 
|  | if(cnt == 12) { | 
|  | blankword.low = 0x02; | 
|  | blankword.high = 0x00; | 
|  | } | 
|  | else { | 
|  | blankword.low = blankword.high = 0x00; | 
|  | } | 
|  | if (!(cnt % 16) && !IsTxReady(j)) { | 
|  | dly = 0; | 
|  | while (!IsTxReady(j)) { | 
|  | if (dly++ > 5) { | 
|  | dly = 0; | 
|  | break; | 
|  | } | 
|  | udelay(10); | 
|  | } | 
|  | } | 
|  | outb_p((blankword.low), j->DSPbase + 0x0C); | 
|  | outb_p((blankword.high), j->DSPbase + 0x0D); | 
|  | } | 
|  | j->flags.play_first_frame = 0; | 
|  | } | 
|  | for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) { | 
|  | if (!(cnt % 16) && !IsTxReady(j)) { | 
|  | dly = 0; | 
|  | while (!IsTxReady(j)) { | 
|  | if (dly++ > 5) { | 
|  | dly = 0; | 
|  | break; | 
|  | } | 
|  | udelay(10); | 
|  | } | 
|  | } | 
|  | /* Add word 0 to G.729 frames for the 8021.  Right now we don't do VAD/CNG  */ | 
|  | if (j->play_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) { | 
|  | if (j->write_buffer_rp[cnt] == 0 && | 
|  | j->write_buffer_rp[cnt + 1] == 0 && | 
|  | j->write_buffer_rp[cnt + 2] == 0 && | 
|  | j->write_buffer_rp[cnt + 3] == 0 && | 
|  | j->write_buffer_rp[cnt + 4] == 0 && | 
|  | j->write_buffer_rp[cnt + 5] == 0 && | 
|  | j->write_buffer_rp[cnt + 6] == 0 && | 
|  | j->write_buffer_rp[cnt + 7] == 0 && | 
|  | j->write_buffer_rp[cnt + 8] == 0 && | 
|  | j->write_buffer_rp[cnt + 9] == 0) { | 
|  | /* someone is trying to write silence lets make this a type 0 frame. */ | 
|  | outb_p(0x00, j->DSPbase + 0x0C); | 
|  | outb_p(0x00, j->DSPbase + 0x0D); | 
|  | } else { | 
|  | /* so all other frames are type 1. */ | 
|  | outb_p(0x01, j->DSPbase + 0x0C); | 
|  | outb_p(0x00, j->DSPbase + 0x0D); | 
|  | } | 
|  | } | 
|  | outb_p(*(j->write_buffer_rp + cnt), j->DSPbase + 0x0C); | 
|  | outb_p(*(j->write_buffer_rp + cnt + 1), j->DSPbase + 0x0D); | 
|  | *(j->write_buffer_rp + cnt) = 0; | 
|  | *(j->write_buffer_rp + cnt + 1) = 0; | 
|  | } | 
|  | j->write_buffer_rp += j->play_frame_size * 2; | 
|  | if (j->write_buffer_rp >= j->write_buffer_end) { | 
|  | j->write_buffer_rp = j->write_buffer; | 
|  | } | 
|  | j->write_buffers_empty++; | 
|  | wake_up_interruptible(&j->write_q);	/* Wake any blocked writers */ | 
|  |  | 
|  | wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */ | 
|  |  | 
|  | ++j->frameswritten; | 
|  | } | 
|  | } else { | 
|  | j->drybuffer++; | 
|  | } | 
|  | if(j->ixj_signals[SIG_WRITE_READY]) { | 
|  | ixj_kill_fasync(j, SIG_WRITE_READY, POLL_OUT); | 
|  | } | 
|  | } | 
|  |  | 
|  | static int idle(IXJ *j) | 
|  | { | 
|  | if (ixj_WriteDSPCommand(0x0000, j))		/* DSP Idle */ | 
|  |  | 
|  | return 0; | 
|  |  | 
|  | if (j->ssr.high || j->ssr.low) { | 
|  | return 0; | 
|  | } else { | 
|  | j->play_mode = -1; | 
|  | j->flags.playing = 0; | 
|  | j->rec_mode = -1; | 
|  | j->flags.recording = 0; | 
|  | return 1; | 
|  | } | 
|  | } | 
|  |  | 
|  | static int set_base_frame(IXJ *j, int size) | 
|  | { | 
|  | unsigned short cmd; | 
|  | int cnt; | 
|  |  | 
|  | idle(j); | 
|  | j->cid_play_aec_level = j->aec_level; | 
|  | aec_stop(j); | 
|  | for (cnt = 0; cnt < 10; cnt++) { | 
|  | if (idle(j)) | 
|  | break; | 
|  | } | 
|  | if (j->ssr.high || j->ssr.low) | 
|  | return -1; | 
|  | if (j->dsp.low != 0x20) { | 
|  | switch (size) { | 
|  | case 30: | 
|  | cmd = 0x07F0; | 
|  | /* Set Base Frame Size to 240 pg9-10 8021 */ | 
|  | break; | 
|  | case 20: | 
|  | cmd = 0x07A0; | 
|  | /* Set Base Frame Size to 160 pg9-10 8021 */ | 
|  | break; | 
|  | case 10: | 
|  | cmd = 0x0750; | 
|  | /* Set Base Frame Size to 80 pg9-10 8021 */ | 
|  | break; | 
|  | default: | 
|  | return -1; | 
|  | } | 
|  | } else { | 
|  | if (size == 30) | 
|  | return size; | 
|  | else | 
|  | return -1; | 
|  | } | 
|  | if (ixj_WriteDSPCommand(cmd, j)) { | 
|  | j->baseframe.high = j->baseframe.low = 0xFF; | 
|  | return -1; | 
|  | } else { | 
|  | j->baseframe.high = j->ssr.high; | 
|  | j->baseframe.low = j->ssr.low; | 
|  | /* If the status returned is 0x0000 (pg9-9 8021) the call failed */ | 
|  | if(j->baseframe.high == 0x00 && j->baseframe.low == 0x00) { | 
|  | return -1; | 
|  | } | 
|  | } | 
|  | ixj_aec_start(j, j->cid_play_aec_level); | 
|  | return size; | 
|  | } | 
|  |  | 
|  | static int set_rec_codec(IXJ *j, int rate) | 
|  | { | 
|  | int retval = 0; | 
|  |  | 
|  | j->rec_codec = rate; | 
|  |  | 
|  | switch (rate) { | 
|  | case G723_63: | 
|  | if (j->ver.low != 0x12 || ixj_convert_loaded) { | 
|  | j->rec_frame_size = 12; | 
|  | j->rec_mode = 0; | 
|  | } else { | 
|  | retval = 1; | 
|  | } | 
|  | break; | 
|  | case G723_53: | 
|  | if (j->ver.low != 0x12 || ixj_convert_loaded) { | 
|  | j->rec_frame_size = 10; | 
|  | j->rec_mode = 0; | 
|  | } else { | 
|  | retval = 1; | 
|  | } | 
|  | break; | 
|  | case TS85: | 
|  | if (j->dsp.low == 0x20 || j->flags.ts85_loaded) { | 
|  | j->rec_frame_size = 16; | 
|  | j->rec_mode = 0; | 
|  | } else { | 
|  | retval = 1; | 
|  | } | 
|  | break; | 
|  | case TS48: | 
|  | if (j->ver.low != 0x12 || ixj_convert_loaded) { | 
|  | j->rec_frame_size = 9; | 
|  | j->rec_mode = 0; | 
|  | } else { | 
|  | retval = 1; | 
|  | } | 
|  | break; | 
|  | case TS41: | 
|  | if (j->ver.low != 0x12 || ixj_convert_loaded) { | 
|  | j->rec_frame_size = 8; | 
|  | j->rec_mode = 0; | 
|  | } else { | 
|  | retval = 1; | 
|  | } | 
|  | break; | 
|  | case G728: | 
|  | if (j->dsp.low != 0x20) { | 
|  | j->rec_frame_size = 48; | 
|  | j->rec_mode = 0; | 
|  | } else { | 
|  | retval = 1; | 
|  | } | 
|  | break; | 
|  | case G729: | 
|  | if (j->dsp.low != 0x20) { | 
|  | if (!j->flags.g729_loaded) { | 
|  | retval = 1; | 
|  | break; | 
|  | } | 
|  | switch (j->baseframe.low) { | 
|  | case 0xA0: | 
|  | j->rec_frame_size = 10; | 
|  | break; | 
|  | case 0x50: | 
|  | j->rec_frame_size = 5; | 
|  | break; | 
|  | default: | 
|  | j->rec_frame_size = 15; | 
|  | break; | 
|  | } | 
|  | j->rec_mode = 0; | 
|  | } else { | 
|  | retval = 1; | 
|  | } | 
|  | break; | 
|  | case G729B: | 
|  | if (j->dsp.low != 0x20) { | 
|  | if (!j->flags.g729_loaded) { | 
|  | retval = 1; | 
|  | break; | 
|  | } | 
|  | switch (j->baseframe.low) { | 
|  | case 0xA0: | 
|  | j->rec_frame_size = 12; | 
|  | break; | 
|  | case 0x50: | 
|  | j->rec_frame_size = 6; | 
|  | break; | 
|  | default: | 
|  | j->rec_frame_size = 18; | 
|  | break; | 
|  | } | 
|  | j->rec_mode = 0; | 
|  | } else { | 
|  | retval = 1; | 
|  | } | 
|  | break; | 
|  | case ULAW: | 
|  | switch (j->baseframe.low) { | 
|  | case 0xA0: | 
|  | j->rec_frame_size = 80; | 
|  | break; | 
|  | case 0x50: | 
|  | j->rec_frame_size = 40; | 
|  | break; | 
|  | default: | 
|  | j->rec_frame_size = 120; | 
|  | break; | 
|  | } | 
|  | j->rec_mode = 4; | 
|  | break; | 
|  | case ALAW: | 
|  | switch (j->baseframe.low) { | 
|  | case 0xA0: | 
|  | j->rec_frame_size = 80; | 
|  | break; | 
|  | case 0x50: | 
|  | j->rec_frame_size = 40; | 
|  | break; | 
|  | default: | 
|  | j->rec_frame_size = 120; | 
|  | break; | 
|  | } | 
|  | j->rec_mode = 4; | 
|  | break; | 
|  | case LINEAR16: | 
|  | switch (j->baseframe.low) { | 
|  | case 0xA0: | 
|  | j->rec_frame_size = 160; | 
|  | break; | 
|  | case 0x50: | 
|  | j->rec_frame_size = 80; | 
|  | break; | 
|  | default: | 
|  | j->rec_frame_size = 240; | 
|  | break; | 
|  | } | 
|  | j->rec_mode = 5; | 
|  | break; | 
|  | case LINEAR8: | 
|  | switch (j->baseframe.low) { | 
|  | case 0xA0: | 
|  | j->rec_frame_size = 80; | 
|  | break; | 
|  | case 0x50: | 
|  | j->rec_frame_size = 40; | 
|  | break; | 
|  | default: | 
|  | j->rec_frame_size = 120; | 
|  | break; | 
|  | } | 
|  | j->rec_mode = 6; | 
|  | break; | 
|  | case WSS: | 
|  | switch (j->baseframe.low) { | 
|  | case 0xA0: | 
|  | j->rec_frame_size = 80; | 
|  | break; | 
|  | case 0x50: | 
|  | j->rec_frame_size = 40; | 
|  | break; | 
|  | default: | 
|  | j->rec_frame_size = 120; | 
|  | break; | 
|  | } | 
|  | j->rec_mode = 7; | 
|  | break; | 
|  | default: | 
|  | kfree(j->read_buffer); | 
|  | j->rec_frame_size = 0; | 
|  | j->rec_mode = -1; | 
|  | j->read_buffer = NULL; | 
|  | j->read_buffer_size = 0; | 
|  | retval = 1; | 
|  | break; | 
|  | } | 
|  | return retval; | 
|  | } | 
|  |  | 
|  | static int ixj_record_start(IXJ *j) | 
|  | { | 
|  | unsigned short cmd = 0x0000; | 
|  |  | 
|  | if (j->read_buffer) { | 
|  | ixj_record_stop(j); | 
|  | } | 
|  | j->flags.recording = 1; | 
|  | ixj_WriteDSPCommand(0x0FE0, j);	/* Put the DSP in full power mode. */ | 
|  |  | 
|  | if(ixjdebug & 0x0002) | 
|  | printk("IXJ %d Starting Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies); | 
|  |  | 
|  | if (!j->rec_mode) { | 
|  | switch (j->rec_codec) { | 
|  | case G723_63: | 
|  | cmd = 0x5131; | 
|  | break; | 
|  | case G723_53: | 
|  | cmd = 0x5132; | 
|  | break; | 
|  | case TS85: | 
|  | cmd = 0x5130;	/* TrueSpeech 8.5 */ | 
|  |  | 
|  | break; | 
|  | case TS48: | 
|  | cmd = 0x5133;	/* TrueSpeech 4.8 */ | 
|  |  | 
|  | break; | 
|  | case TS41: | 
|  | cmd = 0x5134;	/* TrueSpeech 4.1 */ | 
|  |  | 
|  | break; | 
|  | case G728: | 
|  | cmd = 0x5135; | 
|  | break; | 
|  | case G729: | 
|  | case G729B: | 
|  | cmd = 0x5136; | 
|  | break; | 
|  | default: | 
|  | return 1; | 
|  | } | 
|  | if (ixj_WriteDSPCommand(cmd, j)) | 
|  | return -1; | 
|  | } | 
|  | if (!j->read_buffer) { | 
|  | if (!j->read_buffer) | 
|  | j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_ATOMIC); | 
|  | if (!j->read_buffer) { | 
|  | printk("Read buffer allocation for ixj board %d failed!\n", j->board); | 
|  | return -ENOMEM; | 
|  | } | 
|  | } | 
|  | j->read_buffer_size = j->rec_frame_size * 2; | 
|  |  | 
|  | if (ixj_WriteDSPCommand(0x5102, j))		/* Set Poll sync mode */ | 
|  |  | 
|  | return -1; | 
|  |  | 
|  | switch (j->rec_mode) { | 
|  | case 0: | 
|  | cmd = 0x1C03;	/* Record C1 */ | 
|  |  | 
|  | break; | 
|  | case 4: | 
|  | if (j->ver.low == 0x12) { | 
|  | cmd = 0x1E03;	/* Record C1 */ | 
|  |  | 
|  | } else { | 
|  | cmd = 0x1E01;	/* Record C1 */ | 
|  |  | 
|  | } | 
|  | break; | 
|  | case 5: | 
|  | if (j->ver.low == 0x12) { | 
|  | cmd = 0x1E83;	/* Record C1 */ | 
|  |  | 
|  | } else { | 
|  | cmd = 0x1E81;	/* Record C1 */ | 
|  |  | 
|  | } | 
|  | break; | 
|  | case 6: | 
|  | if (j->ver.low == 0x12) { | 
|  | cmd = 0x1F03;	/* Record C1 */ | 
|  |  | 
|  | } else { | 
|  | cmd = 0x1F01;	/* Record C1 */ | 
|  |  | 
|  | } | 
|  | break; | 
|  | case 7: | 
|  | if (j->ver.low == 0x12) { | 
|  | cmd = 0x1F83;	/* Record C1 */ | 
|  | } else { | 
|  | cmd = 0x1F81;	/* Record C1 */ | 
|  | } | 
|  | break; | 
|  | } | 
|  | if (ixj_WriteDSPCommand(cmd, j)) | 
|  | return -1; | 
|  |  | 
|  | if (j->flags.playing) { | 
|  | ixj_aec_start(j, j->aec_level); | 
|  | } | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static void ixj_record_stop(IXJ *j) | 
|  | { | 
|  | if (ixjdebug & 0x0002) | 
|  | printk("IXJ %d Stopping Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies); | 
|  |  | 
|  | kfree(j->read_buffer); | 
|  | j->read_buffer = NULL; | 
|  | j->read_buffer_size = 0; | 
|  | if (j->rec_mode > -1) { | 
|  | ixj_WriteDSPCommand(0x5120, j); | 
|  | j->rec_mode = -1; | 
|  | } | 
|  | j->flags.recording = 0; | 
|  | } | 
|  | static void ixj_vad(IXJ *j, int arg) | 
|  | { | 
|  | if (arg) | 
|  | ixj_WriteDSPCommand(0x513F, j); | 
|  | else | 
|  | ixj_WriteDSPCommand(0x513E, j); | 
|  | } | 
|  |  | 
|  | static void set_rec_depth(IXJ *j, int depth) | 
|  | { | 
|  | if (depth > 60) | 
|  | depth = 60; | 
|  | if (depth < 0) | 
|  | depth = 0; | 
|  | ixj_WriteDSPCommand(0x5180 + depth, j); | 
|  | } | 
|  |  | 
|  | static void set_dtmf_prescale(IXJ *j, int volume) | 
|  | { | 
|  | ixj_WriteDSPCommand(0xCF07, j); | 
|  | ixj_WriteDSPCommand(volume, j); | 
|  | } | 
|  |  | 
|  | static int get_dtmf_prescale(IXJ *j) | 
|  | { | 
|  | ixj_WriteDSPCommand(0xCF05, j); | 
|  | return j->ssr.high << 8 | j->ssr.low; | 
|  | } | 
|  |  | 
|  | static void set_rec_volume(IXJ *j, int volume) | 
|  | { | 
|  | if(j->aec_level == AEC_AGC) { | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4x\n", j->board, volume); | 
|  | ixj_WriteDSPCommand(0xCF96, j); | 
|  | ixj_WriteDSPCommand(volume, j); | 
|  | } else { | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "IXJ: /dev/phone %d Setting Record Volume to 0x%4.4x\n", j->board, volume); | 
|  | ixj_WriteDSPCommand(0xCF03, j); | 
|  | ixj_WriteDSPCommand(volume, j); | 
|  | } | 
|  | } | 
|  |  | 
|  | static int set_rec_volume_linear(IXJ *j, int volume) | 
|  | { | 
|  | int newvolume, dsprecmax; | 
|  |  | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4x\n", j->board, volume); | 
|  | if(volume > 100 || volume < 0) { | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */ | 
|  | switch (j->cardtype) { | 
|  | case QTI_PHONEJACK: | 
|  | dsprecmax = 0x440; | 
|  | break; | 
|  | case QTI_LINEJACK: | 
|  | dsprecmax = 0x180; | 
|  | ixj_mixer(0x0203, j);	/*Voice Left Volume unmute 6db */ | 
|  | ixj_mixer(0x0303, j);	/*Voice Right Volume unmute 6db */ | 
|  | ixj_mixer(0x0C00, j);	/*Mono1 unmute 12db */ | 
|  | break; | 
|  | case QTI_PHONEJACK_LITE: | 
|  | dsprecmax = 0x4C0; | 
|  | break; | 
|  | case QTI_PHONEJACK_PCI: | 
|  | dsprecmax = 0x100; | 
|  | break; | 
|  | case QTI_PHONECARD: | 
|  | dsprecmax = 0x400; | 
|  | break; | 
|  | default: | 
|  | return -1; | 
|  | } | 
|  | newvolume = (dsprecmax * volume) / 100; | 
|  | set_rec_volume(j, newvolume); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static int get_rec_volume(IXJ *j) | 
|  | { | 
|  | if(j->aec_level == AEC_AGC) { | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "Getting AGC Threshold\n"); | 
|  | ixj_WriteDSPCommand(0xCF86, j); | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "AGC Threshold is 0x%2.2x%2.2x\n", j->ssr.high, j->ssr.low); | 
|  | return j->ssr.high << 8 | j->ssr.low; | 
|  | } else { | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "Getting Record Volume\n"); | 
|  | ixj_WriteDSPCommand(0xCF01, j); | 
|  | return j->ssr.high << 8 | j->ssr.low; | 
|  | } | 
|  | } | 
|  |  | 
|  | static int get_rec_volume_linear(IXJ *j) | 
|  | { | 
|  | int volume, newvolume, dsprecmax; | 
|  |  | 
|  | switch (j->cardtype) { | 
|  | case QTI_PHONEJACK: | 
|  | dsprecmax = 0x440; | 
|  | break; | 
|  | case QTI_LINEJACK: | 
|  | dsprecmax = 0x180; | 
|  | break; | 
|  | case QTI_PHONEJACK_LITE: | 
|  | dsprecmax = 0x4C0; | 
|  | break; | 
|  | case QTI_PHONEJACK_PCI: | 
|  | dsprecmax = 0x100; | 
|  | break; | 
|  | case QTI_PHONECARD: | 
|  | dsprecmax = 0x400; | 
|  | break; | 
|  | default: | 
|  | return -1; | 
|  | } | 
|  | volume = get_rec_volume(j); | 
|  | newvolume = (volume * 100) / dsprecmax; | 
|  | if(newvolume > 100) | 
|  | newvolume = 100; | 
|  | return newvolume; | 
|  | } | 
|  |  | 
|  | static int get_rec_level(IXJ *j) | 
|  | { | 
|  | int retval; | 
|  |  | 
|  | ixj_WriteDSPCommand(0xCF88, j); | 
|  |  | 
|  | retval = j->ssr.high << 8 | j->ssr.low; | 
|  | retval = (retval * 256) / 240; | 
|  | return retval; | 
|  | } | 
|  |  | 
|  | static void ixj_aec_start(IXJ *j, int level) | 
|  | { | 
|  | j->aec_level = level; | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "AGC set = 0x%2.2x\n", j->aec_level); | 
|  | if (!level) { | 
|  | aec_stop(j); | 
|  | } else { | 
|  | if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) { | 
|  | ixj_WriteDSPCommand(0xE022, j);	/* Move AEC filter buffer */ | 
|  |  | 
|  | ixj_WriteDSPCommand(0x0300, j); | 
|  | } | 
|  | ixj_WriteDSPCommand(0xB001, j);	/* AEC On */ | 
|  |  | 
|  | ixj_WriteDSPCommand(0xE013, j);	/* Advanced AEC C1 */ | 
|  |  | 
|  | switch (level) { | 
|  | case AEC_LOW: | 
|  | ixj_WriteDSPCommand(0x0000, j);	/* Advanced AEC C2 = off */ | 
|  |  | 
|  | ixj_WriteDSPCommand(0xE011, j); | 
|  | ixj_WriteDSPCommand(0xFFFF, j); | 
|  |  | 
|  | ixj_WriteDSPCommand(0xCF97, j);	/* Set AGC Enable */ | 
|  | ixj_WriteDSPCommand(0x0000, j);	/* to off */ | 
|  |  | 
|  | break; | 
|  |  | 
|  | case AEC_MED: | 
|  | ixj_WriteDSPCommand(0x0600, j);	/* Advanced AEC C2 = on medium */ | 
|  |  | 
|  | ixj_WriteDSPCommand(0xE011, j); | 
|  | ixj_WriteDSPCommand(0x0080, j); | 
|  |  | 
|  | ixj_WriteDSPCommand(0xCF97, j);	/* Set AGC Enable */ | 
|  | ixj_WriteDSPCommand(0x0000, j);	/* to off */ | 
|  |  | 
|  | break; | 
|  |  | 
|  | case AEC_HIGH: | 
|  | ixj_WriteDSPCommand(0x0C00, j);	/* Advanced AEC C2 = on high */ | 
|  |  | 
|  | ixj_WriteDSPCommand(0xE011, j); | 
|  | ixj_WriteDSPCommand(0x0080, j); | 
|  |  | 
|  | ixj_WriteDSPCommand(0xCF97, j);	/* Set AGC Enable */ | 
|  | ixj_WriteDSPCommand(0x0000, j);	/* to off */ | 
|  |  | 
|  | break; | 
|  |  | 
|  | case AEC_AGC: | 
|  | /* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */ | 
|  | ixj_WriteDSPCommand(0x0002, j);	/* Attenuation scaling factor of 2 */ | 
|  |  | 
|  | ixj_WriteDSPCommand(0xE011, j); | 
|  | ixj_WriteDSPCommand(0x0100, j);	/* Higher Threshold Floor */ | 
|  |  | 
|  | ixj_WriteDSPCommand(0xE012, j);	/* Set Train and Lock */ | 
|  |  | 
|  | if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD) | 
|  | ixj_WriteDSPCommand(0x0224, j); | 
|  | else | 
|  | ixj_WriteDSPCommand(0x1224, j); | 
|  |  | 
|  | ixj_WriteDSPCommand(0xE014, j); | 
|  | ixj_WriteDSPCommand(0x0003, j);	/* Lock threashold at 3dB */ | 
|  |  | 
|  | ixj_WriteDSPCommand(0xE338, j);	/* Set Echo Suppresser Attenuation to 0dB */ | 
|  |  | 
|  | /* Now we can set the AGC initial parameters and turn it on */ | 
|  | ixj_WriteDSPCommand(0xCF90, j);	/* Set AGC Minumum gain */ | 
|  | ixj_WriteDSPCommand(0x0020, j);	/* to 0.125 (-18dB) */ | 
|  |  | 
|  | ixj_WriteDSPCommand(0xCF91, j);	/* Set AGC Maximum gain */ | 
|  | ixj_WriteDSPCommand(0x1000, j);	/* to 16 (24dB) */ | 
|  |  | 
|  | ixj_WriteDSPCommand(0xCF92, j);	/* Set AGC start gain */ | 
|  | ixj_WriteDSPCommand(0x0800, j);	/* to 8 (+18dB) */ | 
|  |  | 
|  | ixj_WriteDSPCommand(0xCF93, j);	/* Set AGC hold time */ | 
|  | ixj_WriteDSPCommand(0x1F40, j);	/* to 2 seconds (units are 250us) */ | 
|  |  | 
|  | ixj_WriteDSPCommand(0xCF94, j);	/* Set AGC Attack Time Constant */ | 
|  | ixj_WriteDSPCommand(0x0005, j);	/* to 8ms */ | 
|  |  | 
|  | ixj_WriteDSPCommand(0xCF95, j);	/* Set AGC Decay Time Constant */ | 
|  | ixj_WriteDSPCommand(0x000D, j);	/* to 4096ms */ | 
|  |  | 
|  | ixj_WriteDSPCommand(0xCF96, j);	/* Set AGC Attack Threshold */ | 
|  | ixj_WriteDSPCommand(0x1200, j);	/* to 25% */ | 
|  |  | 
|  | ixj_WriteDSPCommand(0xCF97, j);	/* Set AGC Enable */ | 
|  | ixj_WriteDSPCommand(0x0001, j);	/* to on */ | 
|  |  | 
|  | break; | 
|  |  | 
|  | case AEC_AUTO: | 
|  | ixj_WriteDSPCommand(0x0002, j);	/* Attenuation scaling factor of 2 */ | 
|  |  | 
|  | ixj_WriteDSPCommand(0xE011, j); | 
|  | ixj_WriteDSPCommand(0x0100, j);	/* Higher Threshold Floor */ | 
|  |  | 
|  | ixj_WriteDSPCommand(0xE012, j);	/* Set Train and Lock */ | 
|  |  | 
|  | if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD) | 
|  | ixj_WriteDSPCommand(0x0224, j); | 
|  | else | 
|  | ixj_WriteDSPCommand(0x1224, j); | 
|  |  | 
|  | ixj_WriteDSPCommand(0xE014, j); | 
|  | ixj_WriteDSPCommand(0x0003, j);	/* Lock threashold at 3dB */ | 
|  |  | 
|  | ixj_WriteDSPCommand(0xE338, j);	/* Set Echo Suppresser Attenuation to 0dB */ | 
|  |  | 
|  | break; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | static void aec_stop(IXJ *j) | 
|  | { | 
|  | j->aec_level = AEC_OFF; | 
|  | if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) { | 
|  | ixj_WriteDSPCommand(0xE022, j);	/* Move AEC filter buffer back */ | 
|  |  | 
|  | ixj_WriteDSPCommand(0x0700, j); | 
|  | } | 
|  | if (j->play_mode != -1 && j->rec_mode != -1) | 
|  | { | 
|  | ixj_WriteDSPCommand(0xB002, j);	/* AEC Stop */ | 
|  | } | 
|  | } | 
|  |  | 
|  | static int set_play_codec(IXJ *j, int rate) | 
|  | { | 
|  | int retval = 0; | 
|  |  | 
|  | j->play_codec = rate; | 
|  |  | 
|  | switch (rate) { | 
|  | case G723_63: | 
|  | if (j->ver.low != 0x12 || ixj_convert_loaded) { | 
|  | j->play_frame_size = 12; | 
|  | j->play_mode = 0; | 
|  | } else { | 
|  | retval = 1; | 
|  | } | 
|  | break; | 
|  | case G723_53: | 
|  | if (j->ver.low != 0x12 || ixj_convert_loaded) { | 
|  | j->play_frame_size = 10; | 
|  | j->play_mode = 0; | 
|  | } else { | 
|  | retval = 1; | 
|  | } | 
|  | break; | 
|  | case TS85: | 
|  | if (j->dsp.low == 0x20 || j->flags.ts85_loaded) { | 
|  | j->play_frame_size = 16; | 
|  | j->play_mode = 0; | 
|  | } else { | 
|  | retval = 1; | 
|  | } | 
|  | break; | 
|  | case TS48: | 
|  | if (j->ver.low != 0x12 || ixj_convert_loaded) { | 
|  | j->play_frame_size = 9; | 
|  | j->play_mode = 0; | 
|  | } else { | 
|  | retval = 1; | 
|  | } | 
|  | break; | 
|  | case TS41: | 
|  | if (j->ver.low != 0x12 || ixj_convert_loaded) { | 
|  | j->play_frame_size = 8; | 
|  | j->play_mode = 0; | 
|  | } else { | 
|  | retval = 1; | 
|  | } | 
|  | break; | 
|  | case G728: | 
|  | if (j->dsp.low != 0x20) { | 
|  | j->play_frame_size = 48; | 
|  | j->play_mode = 0; | 
|  | } else { | 
|  | retval = 1; | 
|  | } | 
|  | break; | 
|  | case G729: | 
|  | if (j->dsp.low != 0x20) { | 
|  | if (!j->flags.g729_loaded) { | 
|  | retval = 1; | 
|  | break; | 
|  | } | 
|  | switch (j->baseframe.low) { | 
|  | case 0xA0: | 
|  | j->play_frame_size = 10; | 
|  | break; | 
|  | case 0x50: | 
|  | j->play_frame_size = 5; | 
|  | break; | 
|  | default: | 
|  | j->play_frame_size = 15; | 
|  | break; | 
|  | } | 
|  | j->play_mode = 0; | 
|  | } else { | 
|  | retval = 1; | 
|  | } | 
|  | break; | 
|  | case G729B: | 
|  | if (j->dsp.low != 0x20) { | 
|  | if (!j->flags.g729_loaded) { | 
|  | retval = 1; | 
|  | break; | 
|  | } | 
|  | switch (j->baseframe.low) { | 
|  | case 0xA0: | 
|  | j->play_frame_size = 12; | 
|  | break; | 
|  | case 0x50: | 
|  | j->play_frame_size = 6; | 
|  | break; | 
|  | default: | 
|  | j->play_frame_size = 18; | 
|  | break; | 
|  | } | 
|  | j->play_mode = 0; | 
|  | } else { | 
|  | retval = 1; | 
|  | } | 
|  | break; | 
|  | case ULAW: | 
|  | switch (j->baseframe.low) { | 
|  | case 0xA0: | 
|  | j->play_frame_size = 80; | 
|  | break; | 
|  | case 0x50: | 
|  | j->play_frame_size = 40; | 
|  | break; | 
|  | default: | 
|  | j->play_frame_size = 120; | 
|  | break; | 
|  | } | 
|  | j->play_mode = 2; | 
|  | break; | 
|  | case ALAW: | 
|  | switch (j->baseframe.low) { | 
|  | case 0xA0: | 
|  | j->play_frame_size = 80; | 
|  | break; | 
|  | case 0x50: | 
|  | j->play_frame_size = 40; | 
|  | break; | 
|  | default: | 
|  | j->play_frame_size = 120; | 
|  | break; | 
|  | } | 
|  | j->play_mode = 2; | 
|  | break; | 
|  | case LINEAR16: | 
|  | switch (j->baseframe.low) { | 
|  | case 0xA0: | 
|  | j->play_frame_size = 160; | 
|  | break; | 
|  | case 0x50: | 
|  | j->play_frame_size = 80; | 
|  | break; | 
|  | default: | 
|  | j->play_frame_size = 240; | 
|  | break; | 
|  | } | 
|  | j->play_mode = 6; | 
|  | break; | 
|  | case LINEAR8: | 
|  | switch (j->baseframe.low) { | 
|  | case 0xA0: | 
|  | j->play_frame_size = 80; | 
|  | break; | 
|  | case 0x50: | 
|  | j->play_frame_size = 40; | 
|  | break; | 
|  | default: | 
|  | j->play_frame_size = 120; | 
|  | break; | 
|  | } | 
|  | j->play_mode = 4; | 
|  | break; | 
|  | case WSS: | 
|  | switch (j->baseframe.low) { | 
|  | case 0xA0: | 
|  | j->play_frame_size = 80; | 
|  | break; | 
|  | case 0x50: | 
|  | j->play_frame_size = 40; | 
|  | break; | 
|  | default: | 
|  | j->play_frame_size = 120; | 
|  | break; | 
|  | } | 
|  | j->play_mode = 5; | 
|  | break; | 
|  | default: | 
|  | kfree(j->write_buffer); | 
|  | j->play_frame_size = 0; | 
|  | j->play_mode = -1; | 
|  | j->write_buffer = NULL; | 
|  | j->write_buffer_size = 0; | 
|  | retval = 1; | 
|  | break; | 
|  | } | 
|  | return retval; | 
|  | } | 
|  |  | 
|  | static int ixj_play_start(IXJ *j) | 
|  | { | 
|  | unsigned short cmd = 0x0000; | 
|  |  | 
|  | if (j->write_buffer) { | 
|  | ixj_play_stop(j); | 
|  | } | 
|  |  | 
|  | if(ixjdebug & 0x0002) | 
|  | printk("IXJ %d Starting Play Codec %d at %ld\n", j->board, j->play_codec, jiffies); | 
|  |  | 
|  | j->flags.playing = 1; | 
|  | ixj_WriteDSPCommand(0x0FE0, j);	/* Put the DSP in full power mode. */ | 
|  |  | 
|  | j->flags.play_first_frame = 1; | 
|  | j->drybuffer = 0; | 
|  |  | 
|  | if (!j->play_mode) { | 
|  | switch (j->play_codec) { | 
|  | case G723_63: | 
|  | cmd = 0x5231; | 
|  | break; | 
|  | case G723_53: | 
|  | cmd = 0x5232; | 
|  | break; | 
|  | case TS85: | 
|  | cmd = 0x5230;	/* TrueSpeech 8.5 */ | 
|  |  | 
|  | break; | 
|  | case TS48: | 
|  | cmd = 0x5233;	/* TrueSpeech 4.8 */ | 
|  |  | 
|  | break; | 
|  | case TS41: | 
|  | cmd = 0x5234;	/* TrueSpeech 4.1 */ | 
|  |  | 
|  | break; | 
|  | case G728: | 
|  | cmd = 0x5235; | 
|  | break; | 
|  | case G729: | 
|  | case G729B: | 
|  | cmd = 0x5236; | 
|  | break; | 
|  | default: | 
|  | return 1; | 
|  | } | 
|  | if (ixj_WriteDSPCommand(cmd, j)) | 
|  | return -1; | 
|  | } | 
|  | j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC); | 
|  | if (!j->write_buffer) { | 
|  | printk("Write buffer allocation for ixj board %d failed!\n", j->board); | 
|  | return -ENOMEM; | 
|  | } | 
|  | /*	j->write_buffers_empty = 2; */ | 
|  | j->write_buffers_empty = 1; | 
|  | j->write_buffer_size = j->play_frame_size * 2; | 
|  | j->write_buffer_end = j->write_buffer + j->play_frame_size * 2; | 
|  | j->write_buffer_rp = j->write_buffer_wp = j->write_buffer; | 
|  |  | 
|  | if (ixj_WriteDSPCommand(0x5202, j))		/* Set Poll sync mode */ | 
|  |  | 
|  | return -1; | 
|  |  | 
|  | switch (j->play_mode) { | 
|  | case 0: | 
|  | cmd = 0x2C03; | 
|  | break; | 
|  | case 2: | 
|  | if (j->ver.low == 0x12) { | 
|  | cmd = 0x2C23; | 
|  | } else { | 
|  | cmd = 0x2C21; | 
|  | } | 
|  | break; | 
|  | case 4: | 
|  | if (j->ver.low == 0x12) { | 
|  | cmd = 0x2C43; | 
|  | } else { | 
|  | cmd = 0x2C41; | 
|  | } | 
|  | break; | 
|  | case 5: | 
|  | if (j->ver.low == 0x12) { | 
|  | cmd = 0x2C53; | 
|  | } else { | 
|  | cmd = 0x2C51; | 
|  | } | 
|  | break; | 
|  | case 6: | 
|  | if (j->ver.low == 0x12) { | 
|  | cmd = 0x2C63; | 
|  | } else { | 
|  | cmd = 0x2C61; | 
|  | } | 
|  | break; | 
|  | } | 
|  | if (ixj_WriteDSPCommand(cmd, j)) | 
|  | return -1; | 
|  |  | 
|  | if (ixj_WriteDSPCommand(0x2000, j))		/* Playback C2 */ | 
|  | return -1; | 
|  |  | 
|  | if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j))	/* Playback C3 */ | 
|  | return -1; | 
|  |  | 
|  | if (j->flags.recording) { | 
|  | ixj_aec_start(j, j->aec_level); | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static void ixj_play_stop(IXJ *j) | 
|  | { | 
|  | if (ixjdebug & 0x0002) | 
|  | printk("IXJ %d Stopping Play Codec %d at %ld\n", j->board, j->play_codec, jiffies); | 
|  |  | 
|  | kfree(j->write_buffer); | 
|  | j->write_buffer = NULL; | 
|  | j->write_buffer_size = 0; | 
|  | if (j->play_mode > -1) { | 
|  | ixj_WriteDSPCommand(0x5221, j);	/* Stop playback and flush buffers.  8022 reference page 9-40 */ | 
|  |  | 
|  | j->play_mode = -1; | 
|  | } | 
|  | j->flags.playing = 0; | 
|  | } | 
|  |  | 
|  | static inline int get_play_level(IXJ *j) | 
|  | { | 
|  | int retval; | 
|  |  | 
|  | ixj_WriteDSPCommand(0xCF8F, j); /* 8022 Reference page 9-38 */ | 
|  | return j->ssr.high << 8 | j->ssr.low; | 
|  | retval = j->ssr.high << 8 | j->ssr.low; | 
|  | retval = (retval * 256) / 240; | 
|  | return retval; | 
|  | } | 
|  |  | 
|  | static unsigned int ixj_poll(struct file *file_p, poll_table * wait) | 
|  | { | 
|  | unsigned int mask = 0; | 
|  |  | 
|  | IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode)); | 
|  |  | 
|  | poll_wait(file_p, &(j->poll_q), wait); | 
|  | if (j->read_buffer_ready > 0) | 
|  | mask |= POLLIN | POLLRDNORM;	/* readable */ | 
|  | if (j->write_buffers_empty > 0) | 
|  | mask |= POLLOUT | POLLWRNORM;	/* writable */ | 
|  | if (j->ex.bytes) | 
|  | mask |= POLLPRI; | 
|  | return mask; | 
|  | } | 
|  |  | 
|  | static int ixj_play_tone(IXJ *j, char tone) | 
|  | { | 
|  | if (!j->tone_state) { | 
|  | if(ixjdebug & 0x0002) { | 
|  | printk("IXJ %d starting tone %d at %ld\n", j->board, tone, jiffies); | 
|  | } | 
|  | if (j->dsp.low == 0x20) { | 
|  | idle(j); | 
|  | } | 
|  | j->tone_start_jif = jiffies; | 
|  |  | 
|  | j->tone_state = 1; | 
|  | } | 
|  |  | 
|  | j->tone_index = tone; | 
|  | if (ixj_WriteDSPCommand(0x6000 + j->tone_index, j)) | 
|  | return -1; | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static int ixj_set_tone_on(unsigned short arg, IXJ *j) | 
|  | { | 
|  | j->tone_on_time = arg; | 
|  |  | 
|  | if (ixj_WriteDSPCommand(0x6E04, j))		/* Set Tone On Period */ | 
|  |  | 
|  | return -1; | 
|  |  | 
|  | if (ixj_WriteDSPCommand(arg, j)) | 
|  | return -1; | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static int SCI_WaitHighSCI(IXJ *j) | 
|  | { | 
|  | int cnt; | 
|  |  | 
|  | j->pld_scrr.byte = inb_p(j->XILINXbase); | 
|  | if (!j->pld_scrr.bits.sci) { | 
|  | for (cnt = 0; cnt < 10; cnt++) { | 
|  | udelay(32); | 
|  | j->pld_scrr.byte = inb_p(j->XILINXbase); | 
|  |  | 
|  | if ((j->pld_scrr.bits.sci)) | 
|  | return 1; | 
|  | } | 
|  | if (ixjdebug & 0x0001) | 
|  | printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte); | 
|  | return 0; | 
|  | } else | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | static int SCI_WaitLowSCI(IXJ *j) | 
|  | { | 
|  | int cnt; | 
|  |  | 
|  | j->pld_scrr.byte = inb_p(j->XILINXbase); | 
|  | if (j->pld_scrr.bits.sci) { | 
|  | for (cnt = 0; cnt < 10; cnt++) { | 
|  | udelay(32); | 
|  | j->pld_scrr.byte = inb_p(j->XILINXbase); | 
|  |  | 
|  | if (!(j->pld_scrr.bits.sci)) | 
|  | return 1; | 
|  | } | 
|  | if (ixjdebug & 0x0001) | 
|  | printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte); | 
|  | return 0; | 
|  | } else | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | static int SCI_Control(IXJ *j, int control) | 
|  | { | 
|  | switch (control) { | 
|  | case SCI_End: | 
|  | j->pld_scrw.bits.c0 = 0;	/* Set PLD Serial control interface */ | 
|  |  | 
|  | j->pld_scrw.bits.c1 = 0;	/* to no selection */ | 
|  |  | 
|  | break; | 
|  | case SCI_Enable_DAA: | 
|  | j->pld_scrw.bits.c0 = 1;	/* Set PLD Serial control interface */ | 
|  |  | 
|  | j->pld_scrw.bits.c1 = 0;	/* to write to DAA */ | 
|  |  | 
|  | break; | 
|  | case SCI_Enable_Mixer: | 
|  | j->pld_scrw.bits.c0 = 0;	/* Set PLD Serial control interface */ | 
|  |  | 
|  | j->pld_scrw.bits.c1 = 1;	/* to write to mixer */ | 
|  |  | 
|  | break; | 
|  | case SCI_Enable_EEPROM: | 
|  | j->pld_scrw.bits.c0 = 1;	/* Set PLD Serial control interface */ | 
|  |  | 
|  | j->pld_scrw.bits.c1 = 1;	/* to write to EEPROM */ | 
|  |  | 
|  | break; | 
|  | default: | 
|  | return 0; | 
|  | break; | 
|  | } | 
|  | outb_p(j->pld_scrw.byte, j->XILINXbase); | 
|  |  | 
|  | switch (control) { | 
|  | case SCI_End: | 
|  | return 1; | 
|  | break; | 
|  | case SCI_Enable_DAA: | 
|  | case SCI_Enable_Mixer: | 
|  | case SCI_Enable_EEPROM: | 
|  | if (!SCI_WaitHighSCI(j)) | 
|  | return 0; | 
|  | break; | 
|  | default: | 
|  | return 0; | 
|  | break; | 
|  | } | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | static int SCI_Prepare(IXJ *j) | 
|  | { | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_WaitLowSCI(j)) | 
|  | return 0; | 
|  |  | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | static int ixj_get_mixer(long val, IXJ *j) | 
|  | { | 
|  | int reg = (val & 0x1F00) >> 8; | 
|  | return j->mix.vol[reg]; | 
|  | } | 
|  |  | 
|  | static int ixj_mixer(long val, IXJ *j) | 
|  | { | 
|  | BYTES bytes; | 
|  |  | 
|  | bytes.high = (val & 0x1F00) >> 8; | 
|  | bytes.low = val & 0x00FF; | 
|  |  | 
|  | /* save mixer value so we can get back later on */ | 
|  | j->mix.vol[bytes.high] = bytes.low; | 
|  |  | 
|  | outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03);	/* Load Mixer Address */ | 
|  |  | 
|  | outb_p(bytes.low, j->XILINXbase + 0x02);	/* Load Mixer Data */ | 
|  |  | 
|  | SCI_Control(j, SCI_Enable_Mixer); | 
|  |  | 
|  | SCI_Control(j, SCI_End); | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static int daa_load(BYTES * p_bytes, IXJ *j) | 
|  | { | 
|  | outb_p(p_bytes->high, j->XILINXbase + 0x03); | 
|  | outb_p(p_bytes->low, j->XILINXbase + 0x02); | 
|  | if (!SCI_Control(j, SCI_Enable_DAA)) | 
|  | return 0; | 
|  | else | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | static int ixj_daa_cr4(IXJ *j, char reg) | 
|  | { | 
|  | BYTES bytes; | 
|  |  | 
|  | switch (j->daa_mode) { | 
|  | case SOP_PU_SLEEP: | 
|  | bytes.high = 0x14; | 
|  | break; | 
|  | case SOP_PU_RINGING: | 
|  | bytes.high = 0x54; | 
|  | break; | 
|  | case SOP_PU_CONVERSATION: | 
|  | bytes.high = 0x94; | 
|  | break; | 
|  | case SOP_PU_PULSEDIALING: | 
|  | bytes.high = 0xD4; | 
|  | break; | 
|  | } | 
|  |  | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg; | 
|  |  | 
|  | switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) { | 
|  | case 0: | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0; | 
|  | break; | 
|  | case 1: | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2; | 
|  | break; | 
|  | case 2: | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1; | 
|  | break; | 
|  | case 3: | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3; | 
|  | break; | 
|  | } | 
|  |  | 
|  | bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg; | 
|  |  | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_Prepare(j)) | 
|  | return 0; | 
|  |  | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | static char daa_int_read(IXJ *j) | 
|  | { | 
|  | BYTES bytes; | 
|  |  | 
|  | if (!SCI_Prepare(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = 0x38; | 
|  | bytes.low = 0x00; | 
|  | outb_p(bytes.high, j->XILINXbase + 0x03); | 
|  | outb_p(bytes.low, j->XILINXbase + 0x02); | 
|  |  | 
|  | if (!SCI_Control(j, SCI_Enable_DAA)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = inb_p(j->XILINXbase + 0x03); | 
|  | bytes.low = inb_p(j->XILINXbase + 0x02); | 
|  | if (bytes.low != ALISDAA_ID_BYTE) { | 
|  | if (ixjdebug & 0x0001) | 
|  | printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low); | 
|  | return 0; | 
|  | } | 
|  | if (!SCI_Control(j, SCI_Enable_DAA)) | 
|  | return 0; | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = inb_p(j->XILINXbase + 0x03); | 
|  | bytes.low = inb_p(j->XILINXbase + 0x02); | 
|  |  | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high; | 
|  |  | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | static char daa_CR_read(IXJ *j, int cr) | 
|  | { | 
|  | IXJ_WORD wdata; | 
|  | BYTES bytes; | 
|  |  | 
|  | if (!SCI_Prepare(j)) | 
|  | return 0; | 
|  |  | 
|  | switch (j->daa_mode) { | 
|  | case SOP_PU_SLEEP: | 
|  | bytes.high = 0x30 + cr; | 
|  | break; | 
|  | case SOP_PU_RINGING: | 
|  | bytes.high = 0x70 + cr; | 
|  | break; | 
|  | case SOP_PU_CONVERSATION: | 
|  | bytes.high = 0xB0 + cr; | 
|  | break; | 
|  | case SOP_PU_PULSEDIALING: | 
|  | bytes.high = 0xF0 + cr; | 
|  | break; | 
|  | } | 
|  |  | 
|  | bytes.low = 0x00; | 
|  |  | 
|  | outb_p(bytes.high, j->XILINXbase + 0x03); | 
|  | outb_p(bytes.low, j->XILINXbase + 0x02); | 
|  |  | 
|  | if (!SCI_Control(j, SCI_Enable_DAA)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = inb_p(j->XILINXbase + 0x03); | 
|  | bytes.low = inb_p(j->XILINXbase + 0x02); | 
|  | if (bytes.low != ALISDAA_ID_BYTE) { | 
|  | if (ixjdebug & 0x0001) | 
|  | printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low); | 
|  | return 0; | 
|  | } | 
|  | if (!SCI_Control(j, SCI_Enable_DAA)) | 
|  | return 0; | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  |  | 
|  | wdata.word = inw_p(j->XILINXbase + 0x02); | 
|  |  | 
|  | switch(cr){ | 
|  | case 5: | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = wdata.bytes.high; | 
|  | break; | 
|  | case 4: | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = wdata.bytes.high; | 
|  | break; | 
|  | case 3: | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = wdata.bytes.high; | 
|  | break; | 
|  | case 2: | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = wdata.bytes.high; | 
|  | break; | 
|  | case 1: | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = wdata.bytes.high; | 
|  | break; | 
|  | case 0: | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = wdata.bytes.high; | 
|  | break; | 
|  | default: | 
|  | return 0; | 
|  | } | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | static int ixj_daa_cid_reset(IXJ *j) | 
|  | { | 
|  | int i; | 
|  | BYTES bytes; | 
|  |  | 
|  | if (ixjdebug & 0x0002) | 
|  | printk("DAA Clearing CID ram\n"); | 
|  |  | 
|  | if (!SCI_Prepare(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = 0x58; | 
|  | bytes.low = 0x00; | 
|  | outb_p(bytes.high, j->XILINXbase + 0x03); | 
|  | outb_p(bytes.low, j->XILINXbase + 0x02); | 
|  |  | 
|  | if (!SCI_Control(j, SCI_Enable_DAA)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_WaitHighSCI(j)) | 
|  | return 0; | 
|  |  | 
|  | for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) { | 
|  | bytes.high = bytes.low = 0x00; | 
|  | outb_p(bytes.high, j->XILINXbase + 0x03); | 
|  |  | 
|  | if (i < ALISDAA_CALLERID_SIZE - 1) | 
|  | outb_p(bytes.low, j->XILINXbase + 0x02); | 
|  |  | 
|  | if (!SCI_Control(j, SCI_Enable_DAA)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_WaitHighSCI(j)) | 
|  | return 0; | 
|  |  | 
|  | } | 
|  |  | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  |  | 
|  | if (ixjdebug & 0x0002) | 
|  | printk("DAA CID ram cleared\n"); | 
|  |  | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | static int ixj_daa_cid_read(IXJ *j) | 
|  | { | 
|  | int i; | 
|  | BYTES bytes; | 
|  | char CID[ALISDAA_CALLERID_SIZE], mContinue; | 
|  | char *pIn, *pOut; | 
|  |  | 
|  | if (!SCI_Prepare(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = 0x78; | 
|  | bytes.low = 0x00; | 
|  | outb_p(bytes.high, j->XILINXbase + 0x03); | 
|  | outb_p(bytes.low, j->XILINXbase + 0x02); | 
|  |  | 
|  | if (!SCI_Control(j, SCI_Enable_DAA)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_WaitHighSCI(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = inb_p(j->XILINXbase + 0x03); | 
|  | bytes.low = inb_p(j->XILINXbase + 0x02); | 
|  | if (bytes.low != ALISDAA_ID_BYTE) { | 
|  | if (ixjdebug & 0x0001) | 
|  | printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low); | 
|  | return 0; | 
|  | } | 
|  | for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) { | 
|  | bytes.high = bytes.low = 0x00; | 
|  | outb_p(bytes.high, j->XILINXbase + 0x03); | 
|  | outb_p(bytes.low, j->XILINXbase + 0x02); | 
|  |  | 
|  | if (!SCI_Control(j, SCI_Enable_DAA)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_WaitHighSCI(j)) | 
|  | return 0; | 
|  |  | 
|  | CID[i + 0] = inb_p(j->XILINXbase + 0x03); | 
|  | CID[i + 1] = inb_p(j->XILINXbase + 0x02); | 
|  | } | 
|  |  | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  |  | 
|  | pIn = CID; | 
|  | pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID; | 
|  | mContinue = 1; | 
|  | while (mContinue) { | 
|  | if ((pIn[1] & 0x03) == 0x01) { | 
|  | pOut[0] = pIn[0]; | 
|  | } | 
|  | if ((pIn[2] & 0x0c) == 0x04) { | 
|  | pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2); | 
|  | } | 
|  | if ((pIn[3] & 0x30) == 0x10) { | 
|  | pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4); | 
|  | } | 
|  | if ((pIn[4] & 0xc0) == 0x40) { | 
|  | pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6); | 
|  | } else { | 
|  | mContinue = FALSE; | 
|  | } | 
|  | pIn += 5, pOut += 4; | 
|  | } | 
|  | memset(&j->cid, 0, sizeof(PHONE_CID)); | 
|  | pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID; | 
|  | pOut += 4; | 
|  | strncpy(j->cid.month, pOut, 2); | 
|  | pOut += 2; | 
|  | strncpy(j->cid.day, pOut, 2); | 
|  | pOut += 2; | 
|  | strncpy(j->cid.hour, pOut, 2); | 
|  | pOut += 2; | 
|  | strncpy(j->cid.min, pOut, 2); | 
|  | pOut += 3; | 
|  | j->cid.numlen = *pOut; | 
|  | pOut += 1; | 
|  | strncpy(j->cid.number, pOut, j->cid.numlen); | 
|  | pOut += j->cid.numlen + 1; | 
|  | j->cid.namelen = *pOut; | 
|  | pOut += 1; | 
|  | strncpy(j->cid.name, pOut, j->cid.namelen); | 
|  |  | 
|  | ixj_daa_cid_reset(j); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | static char daa_get_version(IXJ *j) | 
|  | { | 
|  | BYTES bytes; | 
|  |  | 
|  | if (!SCI_Prepare(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = 0x35; | 
|  | bytes.low = 0x00; | 
|  | outb_p(bytes.high, j->XILINXbase + 0x03); | 
|  | outb_p(bytes.low, j->XILINXbase + 0x02); | 
|  |  | 
|  | if (!SCI_Control(j, SCI_Enable_DAA)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = inb_p(j->XILINXbase + 0x03); | 
|  | bytes.low = inb_p(j->XILINXbase + 0x02); | 
|  | if (bytes.low != ALISDAA_ID_BYTE) { | 
|  | if (ixjdebug & 0x0001) | 
|  | printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low); | 
|  | return 0; | 
|  | } | 
|  | if (!SCI_Control(j, SCI_Enable_DAA)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = inb_p(j->XILINXbase + 0x03); | 
|  | bytes.low = inb_p(j->XILINXbase + 0x02); | 
|  | if (ixjdebug & 0x0002) | 
|  | printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes.high, bytes.low); | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high; | 
|  | return bytes.high; | 
|  | } | 
|  |  | 
|  | static int daa_set_mode(IXJ *j, int mode) | 
|  | { | 
|  | /* NOTE: | 
|  | The DAA *MUST* be in the conversation mode if the | 
|  | PSTN line is to be seized (PSTN line off-hook). | 
|  | Taking the PSTN line off-hook while the DAA is in | 
|  | a mode other than conversation mode will cause a | 
|  | hardware failure of the ALIS-A part. | 
|  |  | 
|  | NOTE: | 
|  | The DAA can only go to SLEEP, RINGING or PULSEDIALING modes | 
|  | if the PSTN line is on-hook.  Failure to have the PSTN line | 
|  | in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE | 
|  | ALIS-A part. | 
|  | */ | 
|  |  | 
|  | BYTES bytes; | 
|  |  | 
|  | j->flags.pstn_rmr = 0; | 
|  |  | 
|  | if (!SCI_Prepare(j)) | 
|  | return 0; | 
|  |  | 
|  | switch (mode) { | 
|  | case SOP_PU_RESET: | 
|  | j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */ | 
|  |  | 
|  | outb_p(j->pld_scrw.byte, j->XILINXbase); | 
|  | j->pld_slicw.bits.rly2 = 0; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | bytes.high = 0x10; | 
|  | bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg; | 
|  | daa_load(&bytes, j); | 
|  | if (!SCI_Prepare(j)) | 
|  | return 0; | 
|  |  | 
|  | j->daa_mode = SOP_PU_SLEEP; | 
|  | break; | 
|  | case SOP_PU_SLEEP: | 
|  | if(j->daa_mode == SOP_PU_SLEEP) | 
|  | { | 
|  | break; | 
|  | } | 
|  | if (ixjdebug & 0x0008) | 
|  | printk(KERN_INFO "phone DAA: SOP_PU_SLEEP at %ld\n", jiffies); | 
|  | /*		if(j->daa_mode == SOP_PU_CONVERSATION) */ | 
|  | { | 
|  | j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */ | 
|  |  | 
|  | outb_p(j->pld_scrw.byte, j->XILINXbase); | 
|  | j->pld_slicw.bits.rly2 = 0; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | bytes.high = 0x10; | 
|  | bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg; | 
|  | daa_load(&bytes, j); | 
|  | if (!SCI_Prepare(j)) | 
|  | return 0; | 
|  | } | 
|  | j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */ | 
|  |  | 
|  | outb_p(j->pld_scrw.byte, j->XILINXbase); | 
|  | j->pld_slicw.bits.rly2 = 0; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | bytes.high = 0x10; | 
|  | bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg; | 
|  | daa_load(&bytes, j); | 
|  | if (!SCI_Prepare(j)) | 
|  | return 0; | 
|  |  | 
|  | j->daa_mode = SOP_PU_SLEEP; | 
|  | j->flags.pstn_ringing = 0; | 
|  | j->ex.bits.pstn_ring = 0; | 
|  | j->pstn_sleeptil = jiffies + (hertz / 4); | 
|  | wake_up_interruptible(&j->read_q);      /* Wake any blocked readers */ | 
|  | wake_up_interruptible(&j->write_q);     /* Wake any blocked writers */ | 
|  | wake_up_interruptible(&j->poll_q);      /* Wake any blocked selects */ | 
|  | break; | 
|  | case SOP_PU_RINGING: | 
|  | if (ixjdebug & 0x0008) | 
|  | printk(KERN_INFO "phone DAA: SOP_PU_RINGING at %ld\n", jiffies); | 
|  | j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */ | 
|  |  | 
|  | outb_p(j->pld_scrw.byte, j->XILINXbase); | 
|  | j->pld_slicw.bits.rly2 = 0; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | bytes.high = 0x50; | 
|  | bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg; | 
|  | daa_load(&bytes, j); | 
|  | if (!SCI_Prepare(j)) | 
|  | return 0; | 
|  | j->daa_mode = SOP_PU_RINGING; | 
|  | break; | 
|  | case SOP_PU_CONVERSATION: | 
|  | if (ixjdebug & 0x0008) | 
|  | printk(KERN_INFO "phone DAA: SOP_PU_CONVERSATION at %ld\n", jiffies); | 
|  | bytes.high = 0x90; | 
|  | bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg; | 
|  | daa_load(&bytes, j); | 
|  | if (!SCI_Prepare(j)) | 
|  | return 0; | 
|  | j->pld_slicw.bits.rly2 = 1; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | j->pld_scrw.bits.daafsyncen = 1;	/* Turn on DAA Frame Sync */ | 
|  |  | 
|  | outb_p(j->pld_scrw.byte, j->XILINXbase); | 
|  | j->daa_mode = SOP_PU_CONVERSATION; | 
|  | j->flags.pstn_ringing = 0; | 
|  | j->ex.bits.pstn_ring = 0; | 
|  | j->pstn_sleeptil = jiffies; | 
|  | j->pstn_ring_start = j->pstn_ring_stop = j->pstn_ring_int = 0; | 
|  | break; | 
|  | case SOP_PU_PULSEDIALING: | 
|  | if (ixjdebug & 0x0008) | 
|  | printk(KERN_INFO "phone DAA: SOP_PU_PULSEDIALING at %ld\n", jiffies); | 
|  | j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */ | 
|  |  | 
|  | outb_p(j->pld_scrw.byte, j->XILINXbase); | 
|  | j->pld_slicw.bits.rly2 = 0; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | bytes.high = 0xD0; | 
|  | bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg; | 
|  | daa_load(&bytes, j); | 
|  | if (!SCI_Prepare(j)) | 
|  | return 0; | 
|  | j->daa_mode = SOP_PU_PULSEDIALING; | 
|  | break; | 
|  | default: | 
|  | break; | 
|  | } | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | static int ixj_daa_write(IXJ *j) | 
|  | { | 
|  | BYTES bytes; | 
|  |  | 
|  | j->flags.pstncheck = 1; | 
|  |  | 
|  | daa_set_mode(j, SOP_PU_SLEEP); | 
|  |  | 
|  | if (!SCI_Prepare(j)) | 
|  | return 0; | 
|  |  | 
|  | outb_p(j->pld_scrw.byte, j->XILINXbase); | 
|  |  | 
|  | bytes.high = 0x14; | 
|  | bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg; | 
|  | bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg; | 
|  | bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_Prepare(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = 0x1F; | 
|  | bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg; | 
|  | bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg; | 
|  | bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg; | 
|  | bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg; | 
|  | bytes.low = 0x00; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_Prepare(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = 0x00; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0]; | 
|  | bytes.low = 0x00; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  | if (!SCI_WaitLowSCI(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = 0x01; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0]; | 
|  | bytes.low = 0x00; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  | if (!SCI_WaitLowSCI(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = 0x02; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0]; | 
|  | bytes.low = 0x00; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  | if (!SCI_WaitLowSCI(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = 0x03; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0]; | 
|  | bytes.low = 0x00; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  | if (!SCI_WaitLowSCI(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = 0x04; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0]; | 
|  | bytes.low = 0x00; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  | if (!SCI_WaitLowSCI(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = 0x05; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0]; | 
|  | bytes.low = 0x00; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  | if (!SCI_WaitLowSCI(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = 0x06; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0]; | 
|  | bytes.low = 0x00; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  | if (!SCI_WaitLowSCI(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = 0x07; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0]; | 
|  | bytes.low = 0x00; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  | if (!SCI_WaitLowSCI(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = 0x08; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0]; | 
|  | bytes.low = 0x00; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  | if (!SCI_WaitLowSCI(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = 0x09; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0]; | 
|  | bytes.low = 0x00; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  | if (!SCI_WaitLowSCI(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = 0x0A; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0]; | 
|  | bytes.low = 0x00; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  | if (!SCI_WaitLowSCI(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = 0x0B; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0]; | 
|  | bytes.low = 0x00; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  | if (!SCI_WaitLowSCI(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = 0x0C; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0]; | 
|  | bytes.low = 0x00; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  | if (!SCI_WaitLowSCI(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = 0x0D; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0]; | 
|  | bytes.low = 0x00; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  | if (!SCI_WaitLowSCI(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = 0x0E; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0]; | 
|  | bytes.low = 0x00; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  | if (!SCI_WaitLowSCI(j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = 0x0F; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2]; | 
|  | bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1]; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0]; | 
|  | bytes.low = 0x00; | 
|  | if (!daa_load(&bytes, j)) | 
|  | return 0; | 
|  |  | 
|  | udelay(32); | 
|  | j->pld_scrr.byte = inb_p(j->XILINXbase); | 
|  | if (!SCI_Control(j, SCI_End)) | 
|  | return 0; | 
|  |  | 
|  | outb_p(j->pld_scrw.byte, j->XILINXbase); | 
|  |  | 
|  | if (ixjdebug & 0x0002) | 
|  | printk("DAA Coefficients Loaded\n"); | 
|  |  | 
|  | j->flags.pstncheck = 0; | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | int ixj_set_tone_off(unsigned short arg, IXJ *j) | 
|  | { | 
|  | j->tone_off_time = arg; | 
|  | if (ixj_WriteDSPCommand(0x6E05, j))		/* Set Tone Off Period */ | 
|  |  | 
|  | return -1; | 
|  | if (ixj_WriteDSPCommand(arg, j)) | 
|  | return -1; | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static int ixj_get_tone_on(IXJ *j) | 
|  | { | 
|  | if (ixj_WriteDSPCommand(0x6E06, j))		/* Get Tone On Period */ | 
|  |  | 
|  | return -1; | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static int ixj_get_tone_off(IXJ *j) | 
|  | { | 
|  | if (ixj_WriteDSPCommand(0x6E07, j))		/* Get Tone Off Period */ | 
|  |  | 
|  | return -1; | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static void ixj_busytone(IXJ *j) | 
|  | { | 
|  | j->flags.ringback = 0; | 
|  | j->flags.dialtone = 0; | 
|  | j->flags.busytone = 1; | 
|  | ixj_set_tone_on(0x07D0, j); | 
|  | ixj_set_tone_off(0x07D0, j); | 
|  | ixj_play_tone(j, 27); | 
|  | } | 
|  |  | 
|  | static void ixj_dialtone(IXJ *j) | 
|  | { | 
|  | j->flags.ringback = 0; | 
|  | j->flags.dialtone = 1; | 
|  | j->flags.busytone = 0; | 
|  | if (j->dsp.low == 0x20) { | 
|  | return; | 
|  | } else { | 
|  | ixj_set_tone_on(0xFFFF, j); | 
|  | ixj_set_tone_off(0x0000, j); | 
|  | ixj_play_tone(j, 25); | 
|  | } | 
|  | } | 
|  |  | 
|  | static void ixj_cpt_stop(IXJ *j) | 
|  | { | 
|  | if(j->tone_state || j->tone_cadence_state) | 
|  | { | 
|  | j->flags.dialtone = 0; | 
|  | j->flags.busytone = 0; | 
|  | j->flags.ringback = 0; | 
|  | ixj_set_tone_on(0x0001, j); | 
|  | ixj_set_tone_off(0x0000, j); | 
|  | ixj_play_tone(j, 0); | 
|  | j->tone_state = j->tone_cadence_state = 0; | 
|  | if (j->cadence_t) { | 
|  | kfree(j->cadence_t->ce); | 
|  | kfree(j->cadence_t); | 
|  | j->cadence_t = NULL; | 
|  | } | 
|  | } | 
|  | if (j->play_mode == -1 && j->rec_mode == -1) | 
|  | idle(j); | 
|  | if (j->play_mode != -1 && j->dsp.low == 0x20) | 
|  | ixj_play_start(j); | 
|  | if (j->rec_mode != -1 && j->dsp.low == 0x20) | 
|  | ixj_record_start(j); | 
|  | } | 
|  |  | 
|  | static void ixj_ringback(IXJ *j) | 
|  | { | 
|  | j->flags.busytone = 0; | 
|  | j->flags.dialtone = 0; | 
|  | j->flags.ringback = 1; | 
|  | ixj_set_tone_on(0x0FA0, j); | 
|  | ixj_set_tone_off(0x2EE0, j); | 
|  | ixj_play_tone(j, 26); | 
|  | } | 
|  |  | 
|  | static void ixj_testram(IXJ *j) | 
|  | { | 
|  | ixj_WriteDSPCommand(0x3001, j);	/* Test External SRAM */ | 
|  | } | 
|  |  | 
|  | static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp) | 
|  | { | 
|  | ixj_cadence *lcp; | 
|  | IXJ_CADENCE_ELEMENT __user *cep; | 
|  | IXJ_CADENCE_ELEMENT *lcep; | 
|  | IXJ_TONE ti; | 
|  | int err; | 
|  |  | 
|  | lcp = kmalloc(sizeof(ixj_cadence), GFP_KERNEL); | 
|  | if (lcp == NULL) | 
|  | return -ENOMEM; | 
|  |  | 
|  | err = -EFAULT; | 
|  | if (copy_from_user(&lcp->elements_used, | 
|  | &cp->elements_used, sizeof(int))) | 
|  | goto out; | 
|  | if (copy_from_user(&lcp->termination, | 
|  | &cp->termination, sizeof(IXJ_CADENCE_TERM))) | 
|  | goto out; | 
|  | if (get_user(cep, &cp->ce)) | 
|  | goto out; | 
|  |  | 
|  | err = -EINVAL; | 
|  | if ((unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE_ELEMENT)) | 
|  | goto out; | 
|  |  | 
|  | err = -ENOMEM; | 
|  | lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL); | 
|  | if (!lcep) | 
|  | goto out; | 
|  |  | 
|  | err = -EFAULT; | 
|  | if (copy_from_user(lcep, cep, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used)) | 
|  | goto out1; | 
|  |  | 
|  | if (j->cadence_t) { | 
|  | kfree(j->cadence_t->ce); | 
|  | kfree(j->cadence_t); | 
|  | } | 
|  | lcp->ce = (void *) lcep; | 
|  | j->cadence_t = lcp; | 
|  | j->tone_cadence_state = 0; | 
|  | ixj_set_tone_on(lcp->ce[0].tone_on_time, j); | 
|  | ixj_set_tone_off(lcp->ce[0].tone_off_time, j); | 
|  | if (j->cadence_t->ce[j->tone_cadence_state].freq0) { | 
|  | ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index; | 
|  | ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0; | 
|  | ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0; | 
|  | ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1; | 
|  | ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1; | 
|  | ixj_init_tone(j, &ti); | 
|  | } | 
|  | ixj_play_tone(j, lcp->ce[0].index); | 
|  | return 1; | 
|  | out1: | 
|  | kfree(lcep); | 
|  | out: | 
|  | kfree(lcp); | 
|  | return err; | 
|  | } | 
|  |  | 
|  | static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp) | 
|  | { | 
|  | IXJ_FILTER_CADENCE *lcp; | 
|  | lcp = kmalloc(sizeof(IXJ_FILTER_CADENCE), GFP_KERNEL); | 
|  | if (lcp == NULL) { | 
|  | if(ixjdebug & 0x0001) { | 
|  | printk(KERN_INFO "Could not allocate memory for cadence\n"); | 
|  | } | 
|  | return -ENOMEM; | 
|  | } | 
|  | if (copy_from_user(lcp, cp, sizeof(IXJ_FILTER_CADENCE))) { | 
|  | if(ixjdebug & 0x0001) { | 
|  | printk(KERN_INFO "Could not copy cadence to kernel\n"); | 
|  | } | 
|  | kfree(lcp); | 
|  | return -EFAULT; | 
|  | } | 
|  | if (lcp->filter > 5) { | 
|  | if(ixjdebug & 0x0001) { | 
|  | printk(KERN_INFO "Cadence out of range\n"); | 
|  | } | 
|  | kfree(lcp); | 
|  | return -1; | 
|  | } | 
|  | j->cadence_f[lcp->filter].state = 0; | 
|  | j->cadence_f[lcp->filter].enable = lcp->enable; | 
|  | j->filter_en[lcp->filter] = j->cadence_f[lcp->filter].en_filter = lcp->en_filter; | 
|  | j->cadence_f[lcp->filter].on1 = lcp->on1; | 
|  | j->cadence_f[lcp->filter].on1min = 0; | 
|  | j->cadence_f[lcp->filter].on1max = 0; | 
|  | j->cadence_f[lcp->filter].off1 = lcp->off1; | 
|  | j->cadence_f[lcp->filter].off1min = 0; | 
|  | j->cadence_f[lcp->filter].off1max = 0; | 
|  | j->cadence_f[lcp->filter].on2 = lcp->on2; | 
|  | j->cadence_f[lcp->filter].on2min = 0; | 
|  | j->cadence_f[lcp->filter].on2max = 0; | 
|  | j->cadence_f[lcp->filter].off2 = lcp->off2; | 
|  | j->cadence_f[lcp->filter].off2min = 0; | 
|  | j->cadence_f[lcp->filter].off2max = 0; | 
|  | j->cadence_f[lcp->filter].on3 = lcp->on3; | 
|  | j->cadence_f[lcp->filter].on3min = 0; | 
|  | j->cadence_f[lcp->filter].on3max = 0; | 
|  | j->cadence_f[lcp->filter].off3 = lcp->off3; | 
|  | j->cadence_f[lcp->filter].off3min = 0; | 
|  | j->cadence_f[lcp->filter].off3max = 0; | 
|  | if(ixjdebug & 0x0002) { | 
|  | printk(KERN_INFO "Cadence %d loaded\n", lcp->filter); | 
|  | } | 
|  | kfree(lcp); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static void add_caps(IXJ *j) | 
|  | { | 
|  | j->caps = 0; | 
|  | j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET; | 
|  | strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)"); | 
|  | j->caplist[j->caps].captype = vendor; | 
|  | j->caplist[j->caps].handle = j->caps++; | 
|  | j->caplist[j->caps].captype = device; | 
|  | switch (j->cardtype) { | 
|  | case QTI_PHONEJACK: | 
|  | strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK"); | 
|  | break; | 
|  | case QTI_LINEJACK: | 
|  | strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK"); | 
|  | break; | 
|  | case QTI_PHONEJACK_LITE: | 
|  | strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite"); | 
|  | break; | 
|  | case QTI_PHONEJACK_PCI: | 
|  | strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI"); | 
|  | break; | 
|  | case QTI_PHONECARD: | 
|  | strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneCARD"); | 
|  | break; | 
|  | } | 
|  | j->caplist[j->caps].cap = j->cardtype; | 
|  | j->caplist[j->caps].handle = j->caps++; | 
|  | strcpy(j->caplist[j->caps].desc, "POTS"); | 
|  | j->caplist[j->caps].captype = port; | 
|  | j->caplist[j->caps].cap = pots; | 
|  | j->caplist[j->caps].handle = j->caps++; | 
|  |  | 
|  | /* add devices that can do speaker/mic */ | 
|  | switch (j->cardtype) { | 
|  | case QTI_PHONEJACK: | 
|  | case QTI_LINEJACK: | 
|  | case QTI_PHONEJACK_PCI: | 
|  | case QTI_PHONECARD: | 
|  | strcpy(j->caplist[j->caps].desc, "SPEAKER"); | 
|  | j->caplist[j->caps].captype = port; | 
|  | j->caplist[j->caps].cap = speaker; | 
|  | j->caplist[j->caps].handle = j->caps++; | 
|  | default: | 
|  | break; | 
|  | } | 
|  |  | 
|  | /* add devices that can do handset */ | 
|  | switch (j->cardtype) { | 
|  | case QTI_PHONEJACK: | 
|  | strcpy(j->caplist[j->caps].desc, "HANDSET"); | 
|  | j->caplist[j->caps].captype = port; | 
|  | j->caplist[j->caps].cap = handset; | 
|  | j->caplist[j->caps].handle = j->caps++; | 
|  | break; | 
|  | default: | 
|  | break; | 
|  | } | 
|  |  | 
|  | /* add devices that can do PSTN */ | 
|  | switch (j->cardtype) { | 
|  | case QTI_LINEJACK: | 
|  | strcpy(j->caplist[j->caps].desc, "PSTN"); | 
|  | j->caplist[j->caps].captype = port; | 
|  | j->caplist[j->caps].cap = pstn; | 
|  | j->caplist[j->caps].handle = j->caps++; | 
|  | break; | 
|  | default: | 
|  | break; | 
|  | } | 
|  |  | 
|  | /* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */ | 
|  | strcpy(j->caplist[j->caps].desc, "ULAW"); | 
|  | j->caplist[j->caps].captype = codec; | 
|  | j->caplist[j->caps].cap = ULAW; | 
|  | j->caplist[j->caps].handle = j->caps++; | 
|  |  | 
|  | strcpy(j->caplist[j->caps].desc, "LINEAR 16 bit"); | 
|  | j->caplist[j->caps].captype = codec; | 
|  | j->caplist[j->caps].cap = LINEAR16; | 
|  | j->caplist[j->caps].handle = j->caps++; | 
|  |  | 
|  | strcpy(j->caplist[j->caps].desc, "LINEAR 8 bit"); | 
|  | j->caplist[j->caps].captype = codec; | 
|  | j->caplist[j->caps].cap = LINEAR8; | 
|  | j->caplist[j->caps].handle = j->caps++; | 
|  |  | 
|  | strcpy(j->caplist[j->caps].desc, "Windows Sound System"); | 
|  | j->caplist[j->caps].captype = codec; | 
|  | j->caplist[j->caps].cap = WSS; | 
|  | j->caplist[j->caps].handle = j->caps++; | 
|  |  | 
|  | /* software ALAW codec, made from ULAW */ | 
|  | strcpy(j->caplist[j->caps].desc, "ALAW"); | 
|  | j->caplist[j->caps].captype = codec; | 
|  | j->caplist[j->caps].cap = ALAW; | 
|  | j->caplist[j->caps].handle = j->caps++; | 
|  |  | 
|  | /* version 12 of the 8020 does the following codecs in a broken way */ | 
|  | if (j->dsp.low != 0x20 || j->ver.low != 0x12) { | 
|  | strcpy(j->caplist[j->caps].desc, "G.723.1 6.3kbps"); | 
|  | j->caplist[j->caps].captype = codec; | 
|  | j->caplist[j->caps].cap = G723_63; | 
|  | j->caplist[j->caps].handle = j->caps++; | 
|  |  | 
|  | strcpy(j->caplist[j->caps].desc, "G.723.1 5.3kbps"); | 
|  | j->caplist[j->caps].captype = codec; | 
|  | j->caplist[j->caps].cap = G723_53; | 
|  | j->caplist[j->caps].handle = j->caps++; | 
|  |  | 
|  | strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.8kbps"); | 
|  | j->caplist[j->caps].captype = codec; | 
|  | j->caplist[j->caps].cap = TS48; | 
|  | j->caplist[j->caps].handle = j->caps++; | 
|  |  | 
|  | strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.1kbps"); | 
|  | j->caplist[j->caps].captype = codec; | 
|  | j->caplist[j->caps].cap = TS41; | 
|  | j->caplist[j->caps].handle = j->caps++; | 
|  | } | 
|  |  | 
|  | /* 8020 chips can do TS8.5 native, and 8021/8022 can load it */ | 
|  | if (j->dsp.low == 0x20 || j->flags.ts85_loaded) { | 
|  | strcpy(j->caplist[j->caps].desc, "TrueSpeech 8.5kbps"); | 
|  | j->caplist[j->caps].captype = codec; | 
|  | j->caplist[j->caps].cap = TS85; | 
|  | j->caplist[j->caps].handle = j->caps++; | 
|  | } | 
|  |  | 
|  | /* 8021 chips can do G728 */ | 
|  | if (j->dsp.low == 0x21) { | 
|  | strcpy(j->caplist[j->caps].desc, "G.728 16kbps"); | 
|  | j->caplist[j->caps].captype = codec; | 
|  | j->caplist[j->caps].cap = G728; | 
|  | j->caplist[j->caps].handle = j->caps++; | 
|  | } | 
|  |  | 
|  | /* 8021/8022 chips can do G729 if loaded */ | 
|  | if (j->dsp.low != 0x20 && j->flags.g729_loaded) { | 
|  | strcpy(j->caplist[j->caps].desc, "G.729A 8kbps"); | 
|  | j->caplist[j->caps].captype = codec; | 
|  | j->caplist[j->caps].cap = G729; | 
|  | j->caplist[j->caps].handle = j->caps++; | 
|  | } | 
|  | if (j->dsp.low != 0x20 && j->flags.g729_loaded) { | 
|  | strcpy(j->caplist[j->caps].desc, "G.729B 8kbps"); | 
|  | j->caplist[j->caps].captype = codec; | 
|  | j->caplist[j->caps].cap = G729B; | 
|  | j->caplist[j->caps].handle = j->caps++; | 
|  | } | 
|  | } | 
|  |  | 
|  | static int capabilities_check(IXJ *j, struct phone_capability *pcreq) | 
|  | { | 
|  | int cnt; | 
|  | int retval = 0; | 
|  | for (cnt = 0; cnt < j->caps; cnt++) { | 
|  | if (pcreq->captype == j->caplist[cnt].captype | 
|  | && pcreq->cap == j->caplist[cnt].cap) { | 
|  | retval = 1; | 
|  | break; | 
|  | } | 
|  | } | 
|  | return retval; | 
|  | } | 
|  |  | 
|  | static int ixj_ioctl(struct inode *inode, struct file *file_p, unsigned int cmd, unsigned long arg) | 
|  | { | 
|  | IXJ_TONE ti; | 
|  | IXJ_FILTER jf; | 
|  | IXJ_FILTER_RAW jfr; | 
|  | void __user *argp = (void __user *)arg; | 
|  |  | 
|  | unsigned int raise, mant; | 
|  | unsigned int minor = iminor(inode); | 
|  | int board = NUM(inode); | 
|  |  | 
|  | IXJ *j = get_ixj(NUM(inode)); | 
|  |  | 
|  | int retval = 0; | 
|  |  | 
|  | /* | 
|  | *    Set up locks to ensure that only one process is talking to the DSP at a time. | 
|  | *    This is necessary to keep the DSP from locking up. | 
|  | */ | 
|  | while(test_and_set_bit(board, (void *)&j->busyflags) != 0) | 
|  | schedule_timeout_interruptible(1); | 
|  | if (ixjdebug & 0x0040) | 
|  | printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg); | 
|  | if (minor >= IXJMAX) { | 
|  | clear_bit(board, &j->busyflags); | 
|  | return -ENODEV; | 
|  | } | 
|  | /* | 
|  | *    Check ioctls only root can use. | 
|  | */ | 
|  | if (!capable(CAP_SYS_ADMIN)) { | 
|  | switch (cmd) { | 
|  | case IXJCTL_TESTRAM: | 
|  | case IXJCTL_HZ: | 
|  | retval = -EPERM; | 
|  | } | 
|  | } | 
|  | switch (cmd) { | 
|  | case IXJCTL_TESTRAM: | 
|  | ixj_testram(j); | 
|  | retval = (j->ssr.high << 8) + j->ssr.low; | 
|  | break; | 
|  | case IXJCTL_CARDTYPE: | 
|  | retval = j->cardtype; | 
|  | break; | 
|  | case IXJCTL_SERIAL: | 
|  | retval = j->serial; | 
|  | break; | 
|  | case IXJCTL_VERSION: | 
|  | { | 
|  | char arg_str[100]; | 
|  | snprintf(arg_str, sizeof(arg_str), | 
|  | "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, | 
|  | IXJ_VER_MINOR, IXJ_BLD_VER); | 
|  | if (copy_to_user(argp, arg_str, strlen(arg_str))) | 
|  | retval = -EFAULT; | 
|  | } | 
|  | break; | 
|  | case PHONE_RING_CADENCE: | 
|  | j->ring_cadence = arg; | 
|  | break; | 
|  | case IXJCTL_CIDCW: | 
|  | if(arg) { | 
|  | if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) { | 
|  | retval = -EFAULT; | 
|  | break; | 
|  | } | 
|  | } else { | 
|  | memset(&j->cid_send, 0, sizeof(PHONE_CID)); | 
|  | } | 
|  | ixj_write_cidcw(j); | 
|  | break; | 
|  | /* Binary compatbility */ | 
|  | case OLD_PHONE_RING_START: | 
|  | arg = 0; | 
|  | /* Fall through */ | 
|  | case PHONE_RING_START: | 
|  | if(arg) { | 
|  | if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) { | 
|  | retval = -EFAULT; | 
|  | break; | 
|  | } | 
|  | ixj_write_cid(j); | 
|  | } else { | 
|  | memset(&j->cid_send, 0, sizeof(PHONE_CID)); | 
|  | } | 
|  | ixj_ring_start(j); | 
|  | break; | 
|  | case PHONE_RING_STOP: | 
|  | j->flags.cringing = 0; | 
|  | if(j->cadence_f[5].enable) { | 
|  | j->cadence_f[5].state = 0; | 
|  | } | 
|  | ixj_ring_off(j); | 
|  | break; | 
|  | case PHONE_RING: | 
|  | retval = ixj_ring(j); | 
|  | break; | 
|  | case PHONE_EXCEPTION: | 
|  | retval = j->ex.bytes; | 
|  | if(j->ex.bits.flash) { | 
|  | j->flash_end = 0; | 
|  | j->ex.bits.flash = 0; | 
|  | } | 
|  | j->ex.bits.pstn_ring = 0; | 
|  | j->ex.bits.caller_id = 0; | 
|  | j->ex.bits.pstn_wink = 0; | 
|  | j->ex.bits.f0 = 0; | 
|  | j->ex.bits.f1 = 0; | 
|  | j->ex.bits.f2 = 0; | 
|  | j->ex.bits.f3 = 0; | 
|  | j->ex.bits.fc0 = 0; | 
|  | j->ex.bits.fc1 = 0; | 
|  | j->ex.bits.fc2 = 0; | 
|  | j->ex.bits.fc3 = 0; | 
|  | j->ex.bits.reserved = 0; | 
|  | break; | 
|  | case PHONE_HOOKSTATE: | 
|  | j->ex.bits.hookstate = 0; | 
|  | retval = j->hookstate;  //j->r_hook; | 
|  | break; | 
|  | case IXJCTL_SET_LED: | 
|  | LED_SetState(arg, j); | 
|  | break; | 
|  | case PHONE_FRAME: | 
|  | retval = set_base_frame(j, arg); | 
|  | break; | 
|  | case PHONE_REC_CODEC: | 
|  | retval = set_rec_codec(j, arg); | 
|  | break; | 
|  | case PHONE_VAD: | 
|  | ixj_vad(j, arg); | 
|  | break; | 
|  | case PHONE_REC_START: | 
|  | ixj_record_start(j); | 
|  | break; | 
|  | case PHONE_REC_STOP: | 
|  | ixj_record_stop(j); | 
|  | break; | 
|  | case PHONE_REC_DEPTH: | 
|  | set_rec_depth(j, arg); | 
|  | break; | 
|  | case PHONE_REC_VOLUME: | 
|  | if(arg == -1) { | 
|  | retval = get_rec_volume(j); | 
|  | } | 
|  | else { | 
|  | set_rec_volume(j, arg); | 
|  | retval = arg; | 
|  | } | 
|  | break; | 
|  | case PHONE_REC_VOLUME_LINEAR: | 
|  | if(arg == -1) { | 
|  | retval = get_rec_volume_linear(j); | 
|  | } | 
|  | else { | 
|  | set_rec_volume_linear(j, arg); | 
|  | retval = arg; | 
|  | } | 
|  | break; | 
|  | case IXJCTL_DTMF_PRESCALE: | 
|  | if(arg == -1) { | 
|  | retval = get_dtmf_prescale(j); | 
|  | } | 
|  | else { | 
|  | set_dtmf_prescale(j, arg); | 
|  | retval = arg; | 
|  | } | 
|  | break; | 
|  | case PHONE_REC_LEVEL: | 
|  | retval = get_rec_level(j); | 
|  | break; | 
|  | case IXJCTL_SC_RXG: | 
|  | retval = ixj_siadc(j, arg); | 
|  | break; | 
|  | case IXJCTL_SC_TXG: | 
|  | retval = ixj_sidac(j, arg); | 
|  | break; | 
|  | case IXJCTL_AEC_START: | 
|  | ixj_aec_start(j, arg); | 
|  | break; | 
|  | case IXJCTL_AEC_STOP: | 
|  | aec_stop(j); | 
|  | break; | 
|  | case IXJCTL_AEC_GET_LEVEL: | 
|  | retval = j->aec_level; | 
|  | break; | 
|  | case PHONE_PLAY_CODEC: | 
|  | retval = set_play_codec(j, arg); | 
|  | break; | 
|  | case PHONE_PLAY_START: | 
|  | retval = ixj_play_start(j); | 
|  | break; | 
|  | case PHONE_PLAY_STOP: | 
|  | ixj_play_stop(j); | 
|  | break; | 
|  | case PHONE_PLAY_DEPTH: | 
|  | set_play_depth(j, arg); | 
|  | break; | 
|  | case PHONE_PLAY_VOLUME: | 
|  | if(arg == -1) { | 
|  | retval = get_play_volume(j); | 
|  | } | 
|  | else { | 
|  | set_play_volume(j, arg); | 
|  | retval = arg; | 
|  | } | 
|  | break; | 
|  | case PHONE_PLAY_VOLUME_LINEAR: | 
|  | if(arg == -1) { | 
|  | retval = get_play_volume_linear(j); | 
|  | } | 
|  | else { | 
|  | set_play_volume_linear(j, arg); | 
|  | retval = arg; | 
|  | } | 
|  | break; | 
|  | case PHONE_PLAY_LEVEL: | 
|  | retval = get_play_level(j); | 
|  | break; | 
|  | case IXJCTL_DSP_TYPE: | 
|  | retval = (j->dsp.high << 8) + j->dsp.low; | 
|  | break; | 
|  | case IXJCTL_DSP_VERSION: | 
|  | retval = (j->ver.high << 8) + j->ver.low; | 
|  | break; | 
|  | case IXJCTL_HZ: | 
|  | hertz = arg; | 
|  | break; | 
|  | case IXJCTL_RATE: | 
|  | if (arg > hertz) | 
|  | retval = -1; | 
|  | else | 
|  | samplerate = arg; | 
|  | break; | 
|  | case IXJCTL_DRYBUFFER_READ: | 
|  | put_user(j->drybuffer, (unsigned long __user *) argp); | 
|  | break; | 
|  | case IXJCTL_DRYBUFFER_CLEAR: | 
|  | j->drybuffer = 0; | 
|  | break; | 
|  | case IXJCTL_FRAMES_READ: | 
|  | put_user(j->framesread, (unsigned long __user *) argp); | 
|  | break; | 
|  | case IXJCTL_FRAMES_WRITTEN: | 
|  | put_user(j->frameswritten, (unsigned long __user *) argp); | 
|  | break; | 
|  | case IXJCTL_READ_WAIT: | 
|  | put_user(j->read_wait, (unsigned long __user *) argp); | 
|  | break; | 
|  | case IXJCTL_WRITE_WAIT: | 
|  | put_user(j->write_wait, (unsigned long __user *) argp); | 
|  | break; | 
|  | case PHONE_MAXRINGS: | 
|  | j->maxrings = arg; | 
|  | break; | 
|  | case PHONE_SET_TONE_ON_TIME: | 
|  | ixj_set_tone_on(arg, j); | 
|  | break; | 
|  | case PHONE_SET_TONE_OFF_TIME: | 
|  | ixj_set_tone_off(arg, j); | 
|  | break; | 
|  | case PHONE_GET_TONE_ON_TIME: | 
|  | if (ixj_get_tone_on(j)) { | 
|  | retval = -1; | 
|  | } else { | 
|  | retval = (j->ssr.high << 8) + j->ssr.low; | 
|  | } | 
|  | break; | 
|  | case PHONE_GET_TONE_OFF_TIME: | 
|  | if (ixj_get_tone_off(j)) { | 
|  | retval = -1; | 
|  | } else { | 
|  | retval = (j->ssr.high << 8) + j->ssr.low; | 
|  | } | 
|  | break; | 
|  | case PHONE_PLAY_TONE: | 
|  | if (!j->tone_state) | 
|  | retval = ixj_play_tone(j, arg); | 
|  | else | 
|  | retval = -1; | 
|  | break; | 
|  | case PHONE_GET_TONE_STATE: | 
|  | retval = j->tone_state; | 
|  | break; | 
|  | case PHONE_DTMF_READY: | 
|  | retval = j->ex.bits.dtmf_ready; | 
|  | break; | 
|  | case PHONE_GET_DTMF: | 
|  | if (ixj_hookstate(j)) { | 
|  | if (j->dtmf_rp != j->dtmf_wp) { | 
|  | retval = j->dtmfbuffer[j->dtmf_rp]; | 
|  | j->dtmf_rp++; | 
|  | if (j->dtmf_rp == 79) | 
|  | j->dtmf_rp = 0; | 
|  | if (j->dtmf_rp == j->dtmf_wp) { | 
|  | j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0; | 
|  | } | 
|  | } | 
|  | } | 
|  | break; | 
|  | case PHONE_GET_DTMF_ASCII: | 
|  | if (ixj_hookstate(j)) { | 
|  | if (j->dtmf_rp != j->dtmf_wp) { | 
|  | switch (j->dtmfbuffer[j->dtmf_rp]) { | 
|  | case 10: | 
|  | retval = 42;	/* '*'; */ | 
|  |  | 
|  | break; | 
|  | case 11: | 
|  | retval = 48;	/*'0'; */ | 
|  |  | 
|  | break; | 
|  | case 12: | 
|  | retval = 35;	/*'#'; */ | 
|  |  | 
|  | break; | 
|  | case 28: | 
|  | retval = 65;	/*'A'; */ | 
|  |  | 
|  | break; | 
|  | case 29: | 
|  | retval = 66;	/*'B'; */ | 
|  |  | 
|  | break; | 
|  | case 30: | 
|  | retval = 67;	/*'C'; */ | 
|  |  | 
|  | break; | 
|  | case 31: | 
|  | retval = 68;	/*'D'; */ | 
|  |  | 
|  | break; | 
|  | default: | 
|  | retval = 48 + j->dtmfbuffer[j->dtmf_rp]; | 
|  | break; | 
|  | } | 
|  | j->dtmf_rp++; | 
|  | if (j->dtmf_rp == 79) | 
|  | j->dtmf_rp = 0; | 
|  | if(j->dtmf_rp == j->dtmf_wp) | 
|  | { | 
|  | j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0; | 
|  | } | 
|  | } | 
|  | } | 
|  | break; | 
|  | case PHONE_DTMF_OOB: | 
|  | j->flags.dtmf_oob = arg; | 
|  | break; | 
|  | case PHONE_DIALTONE: | 
|  | ixj_dialtone(j); | 
|  | break; | 
|  | case PHONE_BUSY: | 
|  | ixj_busytone(j); | 
|  | break; | 
|  | case PHONE_RINGBACK: | 
|  | ixj_ringback(j); | 
|  | break; | 
|  | case PHONE_WINK: | 
|  | if(j->cardtype == QTI_PHONEJACK) | 
|  | retval = -1; | 
|  | else | 
|  | retval = ixj_wink(j); | 
|  | break; | 
|  | case PHONE_CPT_STOP: | 
|  | ixj_cpt_stop(j); | 
|  | break; | 
|  | case PHONE_QUERY_CODEC: | 
|  | { | 
|  | struct phone_codec_data pd; | 
|  | int val; | 
|  | int proto_size[] = { | 
|  | -1, | 
|  | 12, 10, 16, 9, 8, 48, 5, | 
|  | 40, 40, 80, 40, 40, 6 | 
|  | }; | 
|  | if(copy_from_user(&pd, argp, sizeof(pd))) { | 
|  | retval = -EFAULT; | 
|  | break; | 
|  | } | 
|  | if(pd.type<1 || pd.type>13) { | 
|  | retval = -EPROTONOSUPPORT; | 
|  | break; | 
|  | } | 
|  | if(pd.type<G729) | 
|  | val=proto_size[pd.type]; | 
|  | else switch(j->baseframe.low) | 
|  | { | 
|  | case 0xA0:val=2*proto_size[pd.type];break; | 
|  | case 0x50:val=proto_size[pd.type];break; | 
|  | default:val=proto_size[pd.type]*3;break; | 
|  | } | 
|  | pd.buf_min=pd.buf_max=pd.buf_opt=val; | 
|  | if(copy_to_user(argp, &pd, sizeof(pd))) | 
|  | retval = -EFAULT; | 
|  | break; | 
|  | } | 
|  | case IXJCTL_DSP_IDLE: | 
|  | idle(j); | 
|  | break; | 
|  | case IXJCTL_MIXER: | 
|  | if ((arg & 0xff) == 0xff) | 
|  | retval = ixj_get_mixer(arg, j); | 
|  | else | 
|  | ixj_mixer(arg, j); | 
|  | break; | 
|  | case IXJCTL_DAA_COEFF_SET: | 
|  | switch (arg) { | 
|  | case DAA_US: | 
|  | DAA_Coeff_US(j); | 
|  | retval = ixj_daa_write(j); | 
|  | break; | 
|  | case DAA_UK: | 
|  | DAA_Coeff_UK(j); | 
|  | retval = ixj_daa_write(j); | 
|  | break; | 
|  | case DAA_FRANCE: | 
|  | DAA_Coeff_France(j); | 
|  | retval = ixj_daa_write(j); | 
|  | break; | 
|  | case DAA_GERMANY: | 
|  | DAA_Coeff_Germany(j); | 
|  | retval = ixj_daa_write(j); | 
|  | break; | 
|  | case DAA_AUSTRALIA: | 
|  | DAA_Coeff_Australia(j); | 
|  | retval = ixj_daa_write(j); | 
|  | break; | 
|  | case DAA_JAPAN: | 
|  | DAA_Coeff_Japan(j); | 
|  | retval = ixj_daa_write(j); | 
|  | break; | 
|  | default: | 
|  | retval = 1; | 
|  | break; | 
|  | } | 
|  | break; | 
|  | case IXJCTL_DAA_AGAIN: | 
|  | ixj_daa_cr4(j, arg | 0x02); | 
|  | break; | 
|  | case IXJCTL_PSTN_LINETEST: | 
|  | retval = ixj_linetest(j); | 
|  | break; | 
|  | case IXJCTL_VMWI: | 
|  | ixj_write_vmwi(j, arg); | 
|  | break; | 
|  | case IXJCTL_CID: | 
|  | if (copy_to_user(argp, &j->cid, sizeof(PHONE_CID))) | 
|  | retval = -EFAULT; | 
|  | j->ex.bits.caller_id = 0; | 
|  | break; | 
|  | case IXJCTL_WINK_DURATION: | 
|  | j->winktime = arg; | 
|  | break; | 
|  | case IXJCTL_PORT: | 
|  | if (arg) | 
|  | retval = ixj_set_port(j, arg); | 
|  | else | 
|  | retval = j->port; | 
|  | break; | 
|  | case IXJCTL_POTS_PSTN: | 
|  | retval = ixj_set_pots(j, arg); | 
|  | break; | 
|  | case PHONE_CAPABILITIES: | 
|  | add_caps(j); | 
|  | retval = j->caps; | 
|  | break; | 
|  | case PHONE_CAPABILITIES_LIST: | 
|  | add_caps(j); | 
|  | if (copy_to_user(argp, j->caplist, sizeof(struct phone_capability) * j->caps)) | 
|  | retval = -EFAULT; | 
|  | break; | 
|  | case PHONE_CAPABILITIES_CHECK: | 
|  | { | 
|  | struct phone_capability cap; | 
|  | if (copy_from_user(&cap, argp, sizeof(cap))) | 
|  | retval = -EFAULT; | 
|  | else { | 
|  | add_caps(j); | 
|  | retval = capabilities_check(j, &cap); | 
|  | } | 
|  | } | 
|  | break; | 
|  | case PHONE_PSTN_SET_STATE: | 
|  | daa_set_mode(j, arg); | 
|  | break; | 
|  | case PHONE_PSTN_GET_STATE: | 
|  | retval = j->daa_mode; | 
|  | j->ex.bits.pstn_ring = 0; | 
|  | break; | 
|  | case IXJCTL_SET_FILTER: | 
|  | if (copy_from_user(&jf, argp, sizeof(jf))) | 
|  | retval = -EFAULT; | 
|  | retval = ixj_init_filter(j, &jf); | 
|  | break; | 
|  | case IXJCTL_SET_FILTER_RAW: | 
|  | if (copy_from_user(&jfr, argp, sizeof(jfr))) | 
|  | retval = -EFAULT; | 
|  | else | 
|  | retval = ixj_init_filter_raw(j, &jfr); | 
|  | break; | 
|  | case IXJCTL_GET_FILTER_HIST: | 
|  | if(arg<0||arg>3) | 
|  | retval = -EINVAL; | 
|  | else | 
|  | retval = j->filter_hist[arg]; | 
|  | break; | 
|  | case IXJCTL_INIT_TONE: | 
|  | if (copy_from_user(&ti, argp, sizeof(ti))) | 
|  | retval = -EFAULT; | 
|  | else | 
|  | retval = ixj_init_tone(j, &ti); | 
|  | break; | 
|  | case IXJCTL_TONE_CADENCE: | 
|  | retval = ixj_build_cadence(j, argp); | 
|  | break; | 
|  | case IXJCTL_FILTER_CADENCE: | 
|  | retval = ixj_build_filter_cadence(j, argp); | 
|  | break; | 
|  | case IXJCTL_SIGCTL: | 
|  | if (copy_from_user(&j->sigdef, argp, sizeof(IXJ_SIGDEF))) { | 
|  | retval = -EFAULT; | 
|  | break; | 
|  | } | 
|  | j->ixj_signals[j->sigdef.event] = j->sigdef.signal; | 
|  | if(j->sigdef.event < 33) { | 
|  | raise = 1; | 
|  | for(mant = 0; mant < j->sigdef.event; mant++){ | 
|  | raise *= 2; | 
|  | } | 
|  | if(j->sigdef.signal) | 
|  | j->ex_sig.bytes |= raise; | 
|  | else | 
|  | j->ex_sig.bytes &= (raise^0xffff); | 
|  | } | 
|  | break; | 
|  | case IXJCTL_INTERCOM_STOP: | 
|  | if(arg < 0 || arg >= IXJMAX) | 
|  | return -EINVAL; | 
|  | j->intercom = -1; | 
|  | ixj_record_stop(j); | 
|  | ixj_play_stop(j); | 
|  | idle(j); | 
|  | get_ixj(arg)->intercom = -1; | 
|  | ixj_record_stop(get_ixj(arg)); | 
|  | ixj_play_stop(get_ixj(arg)); | 
|  | idle(get_ixj(arg)); | 
|  | break; | 
|  | case IXJCTL_INTERCOM_START: | 
|  | if(arg < 0 || arg >= IXJMAX) | 
|  | return -EINVAL; | 
|  | j->intercom = arg; | 
|  | ixj_record_start(j); | 
|  | ixj_play_start(j); | 
|  | get_ixj(arg)->intercom = board; | 
|  | ixj_play_start(get_ixj(arg)); | 
|  | ixj_record_start(get_ixj(arg)); | 
|  | break; | 
|  | } | 
|  | if (ixjdebug & 0x0040) | 
|  | printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg); | 
|  | clear_bit(board, &j->busyflags); | 
|  | return retval; | 
|  | } | 
|  |  | 
|  | static int ixj_fasync(int fd, struct file *file_p, int mode) | 
|  | { | 
|  | IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode)); | 
|  |  | 
|  | return fasync_helper(fd, file_p, mode, &j->async_queue); | 
|  | } | 
|  |  | 
|  | static struct file_operations ixj_fops = | 
|  | { | 
|  | .owner          = THIS_MODULE, | 
|  | .read           = ixj_enhanced_read, | 
|  | .write          = ixj_enhanced_write, | 
|  | .poll           = ixj_poll, | 
|  | .ioctl          = ixj_ioctl, | 
|  | .release        = ixj_release, | 
|  | .fasync         = ixj_fasync | 
|  | }; | 
|  |  | 
|  | static int ixj_linetest(IXJ *j) | 
|  | { | 
|  | j->flags.pstncheck = 1;	/* Testing */ | 
|  | j->flags.pstn_present = 0; /* Assume the line is not there */ | 
|  |  | 
|  | daa_int_read(j);	/*Clear DAA Interrupt flags */ | 
|  | /* */ | 
|  | /* Hold all relays in the normally de-energized position. */ | 
|  | /* */ | 
|  |  | 
|  | j->pld_slicw.bits.rly1 = 0; | 
|  | j->pld_slicw.bits.rly2 = 0; | 
|  | j->pld_slicw.bits.rly3 = 0; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */ | 
|  |  | 
|  | outb_p(j->pld_scrw.byte, j->XILINXbase); | 
|  | j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01); | 
|  | if (j->pld_slicr.bits.potspstn) { | 
|  | j->flags.pots_pstn = 1; | 
|  | j->flags.pots_correct = 0; | 
|  | LED_SetState(0x4, j); | 
|  | } else { | 
|  | j->flags.pots_pstn = 0; | 
|  | j->pld_slicw.bits.rly1 = 0; | 
|  | j->pld_slicw.bits.rly2 = 0; | 
|  | j->pld_slicw.bits.rly3 = 1; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */ | 
|  |  | 
|  | outb_p(j->pld_scrw.byte, j->XILINXbase); | 
|  | daa_set_mode(j, SOP_PU_CONVERSATION); | 
|  | msleep(1000); | 
|  | daa_int_read(j); | 
|  | daa_set_mode(j, SOP_PU_RESET); | 
|  | if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) { | 
|  | j->flags.pots_correct = 0;	/* Should not be line voltage on POTS port. */ | 
|  | LED_SetState(0x4, j); | 
|  | j->pld_slicw.bits.rly3 = 0; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | } else { | 
|  | j->flags.pots_correct = 1; | 
|  | LED_SetState(0x8, j); | 
|  | j->pld_slicw.bits.rly1 = 1; | 
|  | j->pld_slicw.bits.rly2 = 0; | 
|  | j->pld_slicw.bits.rly3 = 0; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | } | 
|  | } | 
|  | j->pld_slicw.bits.rly3 = 0; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | daa_set_mode(j, SOP_PU_CONVERSATION); | 
|  | msleep(1000); | 
|  | daa_int_read(j); | 
|  | daa_set_mode(j, SOP_PU_RESET); | 
|  | if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) { | 
|  | j->pstn_sleeptil = jiffies + (hertz / 4); | 
|  | j->flags.pstn_present = 1; | 
|  | } else { | 
|  | j->flags.pstn_present = 0; | 
|  | } | 
|  | if (j->flags.pstn_present) { | 
|  | if (j->flags.pots_correct) { | 
|  | LED_SetState(0xA, j); | 
|  | } else { | 
|  | LED_SetState(0x6, j); | 
|  | } | 
|  | } else { | 
|  | if (j->flags.pots_correct) { | 
|  | LED_SetState(0x9, j); | 
|  | } else { | 
|  | LED_SetState(0x5, j); | 
|  | } | 
|  | } | 
|  | j->flags.pstncheck = 0;	/* Testing */ | 
|  | return j->flags.pstn_present; | 
|  | } | 
|  |  | 
|  | static int ixj_selfprobe(IXJ *j) | 
|  | { | 
|  | unsigned short cmd; | 
|  | int cnt; | 
|  | BYTES bytes; | 
|  |  | 
|  | init_waitqueue_head(&j->poll_q); | 
|  | init_waitqueue_head(&j->read_q); | 
|  | init_waitqueue_head(&j->write_q); | 
|  |  | 
|  | while(atomic_read(&j->DSPWrite) > 0) | 
|  | atomic_dec(&j->DSPWrite); | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "Write IDLE to Software Control Register\n"); | 
|  | ixj_WriteDSPCommand(0x0FE0, j);	/* Put the DSP in full power mode. */ | 
|  |  | 
|  | if (ixj_WriteDSPCommand(0x0000, j))		/* Write IDLE to Software Control Register */ | 
|  | return -1; | 
|  | /* The read values of the SSR should be 0x00 for the IDLE command */ | 
|  | if (j->ssr.low || j->ssr.high) | 
|  | return -1; | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "Get Device ID Code\n"); | 
|  | if (ixj_WriteDSPCommand(0x3400, j))		/* Get Device ID Code */ | 
|  | return -1; | 
|  | j->dsp.low = j->ssr.low; | 
|  | j->dsp.high = j->ssr.high; | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "Get Device Version Code\n"); | 
|  | if (ixj_WriteDSPCommand(0x3800, j))		/* Get Device Version Code */ | 
|  | return -1; | 
|  | j->ver.low = j->ssr.low; | 
|  | j->ver.high = j->ssr.high; | 
|  | if (!j->cardtype) { | 
|  | if (j->dsp.low == 0x21) { | 
|  | bytes.high = bytes.low = inb_p(j->XILINXbase + 0x02); | 
|  | outb_p(bytes.low ^ 0xFF, j->XILINXbase + 0x02); | 
|  | /* Test for Internet LineJACK or Internet PhoneJACK Lite */ | 
|  | bytes.low = inb_p(j->XILINXbase + 0x02); | 
|  | if (bytes.low == bytes.high)	/*  Register is read only on */ | 
|  | /*  Internet PhoneJack Lite */ | 
|  | { | 
|  | j->cardtype = QTI_PHONEJACK_LITE; | 
|  | if (!request_region(j->XILINXbase, 4, "ixj control")) { | 
|  | printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase); | 
|  | return -1; | 
|  | } | 
|  | j->pld_slicw.pcib.e1 = 1; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase); | 
|  | } else { | 
|  | j->cardtype = QTI_LINEJACK; | 
|  |  | 
|  | if (!request_region(j->XILINXbase, 8, "ixj control")) { | 
|  | printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase); | 
|  | return -1; | 
|  | } | 
|  | } | 
|  | } else if (j->dsp.low == 0x22) { | 
|  | j->cardtype = QTI_PHONEJACK_PCI; | 
|  | request_region(j->XILINXbase, 4, "ixj control"); | 
|  | j->pld_slicw.pcib.e1 = 1; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase); | 
|  | } else | 
|  | j->cardtype = QTI_PHONEJACK; | 
|  | } else { | 
|  | switch (j->cardtype) { | 
|  | case QTI_PHONEJACK: | 
|  | if (!j->dsp.low != 0x20) { | 
|  | j->dsp.high = 0x80; | 
|  | j->dsp.low = 0x20; | 
|  | ixj_WriteDSPCommand(0x3800, j); | 
|  | j->ver.low = j->ssr.low; | 
|  | j->ver.high = j->ssr.high; | 
|  | } | 
|  | break; | 
|  | case QTI_LINEJACK: | 
|  | if (!request_region(j->XILINXbase, 8, "ixj control")) { | 
|  | printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase); | 
|  | return -1; | 
|  | } | 
|  | break; | 
|  | case QTI_PHONEJACK_LITE: | 
|  | case QTI_PHONEJACK_PCI: | 
|  | if (!request_region(j->XILINXbase, 4, "ixj control")) { | 
|  | printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase); | 
|  | return -1; | 
|  | } | 
|  | j->pld_slicw.pcib.e1 = 1; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase); | 
|  | break; | 
|  | case QTI_PHONECARD: | 
|  | break; | 
|  | } | 
|  | } | 
|  | if (j->dsp.low == 0x20 || j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) { | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "Write CODEC config to Software Control Register\n"); | 
|  | if (ixj_WriteDSPCommand(0xC462, j))		/* Write CODEC config to Software Control Register */ | 
|  | return -1; | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "Write CODEC timing to Software Control Register\n"); | 
|  | if (j->cardtype == QTI_PHONEJACK) { | 
|  | cmd = 0x9FF2; | 
|  | } else { | 
|  | cmd = 0x9FF5; | 
|  | } | 
|  | if (ixj_WriteDSPCommand(cmd, j))	/* Write CODEC timing to Software Control Register */ | 
|  | return -1; | 
|  | } else { | 
|  | if (set_base_frame(j, 30) != 30) | 
|  | return -1; | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "Write CODEC config to Software Control Register\n"); | 
|  | if (j->cardtype == QTI_PHONECARD) { | 
|  | if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to Software Control Register */ | 
|  | return -1; | 
|  | } | 
|  | if (j->cardtype == QTI_LINEJACK) { | 
|  | if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to Software Control Register */ | 
|  | return -1; | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "Turn on the PLD Clock at 8Khz\n"); | 
|  | j->pld_clock.byte = 0; | 
|  | outb_p(j->pld_clock.byte, j->XILINXbase + 0x04); | 
|  | } | 
|  | } | 
|  |  | 
|  | if (j->dsp.low == 0x20) { | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "Configure GPIO pins\n"); | 
|  | j->gpio.bytes.high = 0x09; | 
|  | /*  bytes.low = 0xEF;  0xF7 */ | 
|  | j->gpio.bits.gpio1 = 1; | 
|  | j->gpio.bits.gpio2 = 1; | 
|  | j->gpio.bits.gpio3 = 0; | 
|  | j->gpio.bits.gpio4 = 1; | 
|  | j->gpio.bits.gpio5 = 1; | 
|  | j->gpio.bits.gpio6 = 1; | 
|  | j->gpio.bits.gpio7 = 1; | 
|  | ixj_WriteDSPCommand(j->gpio.word, j);	/* Set GPIO pin directions */ | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "Enable SLIC\n"); | 
|  | j->gpio.bytes.high = 0x0B; | 
|  | j->gpio.bytes.low = 0x00; | 
|  | j->gpio.bits.gpio1 = 0; | 
|  | j->gpio.bits.gpio2 = 1; | 
|  | j->gpio.bits.gpio5 = 0; | 
|  | ixj_WriteDSPCommand(j->gpio.word, j);	/* send the ring stop signal */ | 
|  | j->port = PORT_POTS; | 
|  | } else { | 
|  | if (j->cardtype == QTI_LINEJACK) { | 
|  | LED_SetState(0x1, j); | 
|  | msleep(100); | 
|  | LED_SetState(0x2, j); | 
|  | msleep(100); | 
|  | LED_SetState(0x4, j); | 
|  | msleep(100); | 
|  | LED_SetState(0x8, j); | 
|  | msleep(100); | 
|  | LED_SetState(0x0, j); | 
|  | daa_get_version(j); | 
|  | if (ixjdebug & 0x0002) | 
|  | printk("Loading DAA Coefficients\n"); | 
|  | DAA_Coeff_US(j); | 
|  | if (!ixj_daa_write(j)) { | 
|  | printk("DAA write failed on board %d\n", j->board); | 
|  | return -1; | 
|  | } | 
|  | if(!ixj_daa_cid_reset(j)) { | 
|  | printk("DAA CID reset failed on board %d\n", j->board); | 
|  | return -1; | 
|  | } | 
|  | j->flags.pots_correct = 0; | 
|  | j->flags.pstn_present = 0; | 
|  | ixj_linetest(j); | 
|  | if (j->flags.pots_correct) { | 
|  | j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */ | 
|  |  | 
|  | outb_p(j->pld_scrw.byte, j->XILINXbase); | 
|  | j->pld_slicw.bits.rly1 = 1; | 
|  | j->pld_slicw.bits.spken = 1; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | SLIC_SetState(PLD_SLIC_STATE_STANDBY, j); | 
|  | /*				SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */ | 
|  | j->port = PORT_POTS; | 
|  | } | 
|  | ixj_set_port(j, PORT_PSTN); | 
|  | ixj_set_pots(j, 1); | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "Enable Mixer\n"); | 
|  | ixj_mixer(0x0000, j);	/*Master Volume Left unmute 0db */ | 
|  | ixj_mixer(0x0100, j);	/*Master Volume Right unmute 0db */ | 
|  |  | 
|  | ixj_mixer(0x0203, j);	/*Voice Left Volume unmute 6db */ | 
|  | ixj_mixer(0x0303, j);	/*Voice Right Volume unmute 6db */ | 
|  |  | 
|  | ixj_mixer(0x0480, j);	/*FM Left mute */ | 
|  | ixj_mixer(0x0580, j);	/*FM Right mute */ | 
|  |  | 
|  | ixj_mixer(0x0680, j);	/*CD Left mute */ | 
|  | ixj_mixer(0x0780, j);	/*CD Right mute */ | 
|  |  | 
|  | ixj_mixer(0x0880, j);	/*Line Left mute */ | 
|  | ixj_mixer(0x0980, j);	/*Line Right mute */ | 
|  |  | 
|  | ixj_mixer(0x0A80, j);	/*Aux left mute  */ | 
|  | ixj_mixer(0x0B80, j);	/*Aux right mute */ | 
|  |  | 
|  | ixj_mixer(0x0C00, j);	/*Mono1 unmute 12db */ | 
|  | ixj_mixer(0x0D80, j);	/*Mono2 mute */ | 
|  |  | 
|  | ixj_mixer(0x0E80, j);	/*Mic mute */ | 
|  |  | 
|  | ixj_mixer(0x0F00, j);	/*Mono Out Volume unmute 0db */ | 
|  |  | 
|  | ixj_mixer(0x1000, j);	/*Voice Left and Right out only */ | 
|  | ixj_mixer(0x110C, j); | 
|  |  | 
|  |  | 
|  | ixj_mixer(0x1200, j);	/*Mono1 switch on mixer left */ | 
|  | ixj_mixer(0x1401, j); | 
|  |  | 
|  | ixj_mixer(0x1300, j);       /*Mono1 switch on mixer right */ | 
|  | ixj_mixer(0x1501, j); | 
|  |  | 
|  | ixj_mixer(0x1700, j);	/*Clock select */ | 
|  |  | 
|  | ixj_mixer(0x1800, j);	/*ADC input from mixer */ | 
|  |  | 
|  | ixj_mixer(0x1901, j);	/*Mic gain 30db */ | 
|  |  | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "Setting Default US Ring Cadence Detection\n"); | 
|  | j->cadence_f[4].state = 0; | 
|  | j->cadence_f[4].on1 = 0;	/*Cadence Filter 4 is used for PSTN ring cadence */ | 
|  | j->cadence_f[4].off1 = 0; | 
|  | j->cadence_f[4].on2 = 0; | 
|  | j->cadence_f[4].off2 = 0; | 
|  | j->cadence_f[4].on3 = 0; | 
|  | j->cadence_f[4].off3 = 0;	/* These should represent standard US ring pulse. */ | 
|  | j->pstn_last_rmr = jiffies; | 
|  |  | 
|  | } else { | 
|  | if (j->cardtype == QTI_PHONECARD) { | 
|  | ixj_WriteDSPCommand(0xCF07, j); | 
|  | ixj_WriteDSPCommand(0x00B0, j); | 
|  | ixj_set_port(j, PORT_SPEAKER); | 
|  | } else { | 
|  | ixj_set_port(j, PORT_POTS); | 
|  | SLIC_SetState(PLD_SLIC_STATE_STANDBY, j); | 
|  | /*				SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */ | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | j->intercom = -1; | 
|  | j->framesread = j->frameswritten = 0; | 
|  | j->read_wait = j->write_wait = 0; | 
|  | j->rxreadycheck = j->txreadycheck = 0; | 
|  |  | 
|  | /* initialise the DTMF prescale to a sensible value */ | 
|  | if (j->cardtype == QTI_LINEJACK) { | 
|  | set_dtmf_prescale(j, 0x10); | 
|  | } else { | 
|  | set_dtmf_prescale(j, 0x40); | 
|  | } | 
|  | set_play_volume(j, 0x100); | 
|  | set_rec_volume(j, 0x100); | 
|  |  | 
|  | if (ixj_WriteDSPCommand(0x0000, j))		/* Write IDLE to Software Control Register */ | 
|  | return -1; | 
|  | /* The read values of the SSR should be 0x00 for the IDLE command */ | 
|  | if (j->ssr.low || j->ssr.high) | 
|  | return -1; | 
|  |  | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "Enable Line Monitor\n"); | 
|  |  | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n"); | 
|  |  | 
|  | if (ixj_WriteDSPCommand(0x7E01, j))		/* Asynchronous Line Monitor */ | 
|  | return -1; | 
|  |  | 
|  | if (ixjdebug & 0x002) | 
|  | printk(KERN_INFO "Enable DTMF Detectors\n"); | 
|  |  | 
|  | if (ixj_WriteDSPCommand(0x5151, j))		/* Enable DTMF detection */ | 
|  | return -1; | 
|  |  | 
|  | if (ixj_WriteDSPCommand(0x6E01, j))		/* Set Asyncronous Tone Generation */ | 
|  | return -1; | 
|  |  | 
|  | set_rec_depth(j, 2);	/* Set Record Channel Limit to 2 frames */ | 
|  |  | 
|  | set_play_depth(j, 2);	/* Set Playback Channel Limit to 2 frames */ | 
|  |  | 
|  | j->ex.bits.dtmf_ready = 0; | 
|  | j->dtmf_state = 0; | 
|  | j->dtmf_wp = j->dtmf_rp = 0; | 
|  | j->rec_mode = j->play_mode = -1; | 
|  | j->flags.ringing = 0; | 
|  | j->maxrings = MAXRINGS; | 
|  | j->ring_cadence = USA_RING_CADENCE; | 
|  | j->drybuffer = 0; | 
|  | j->winktime = 320; | 
|  | j->flags.dtmf_oob = 0; | 
|  | for (cnt = 0; cnt < 4; cnt++) | 
|  | j->cadence_f[cnt].enable = 0; | 
|  | /* must be a device on the specified address */ | 
|  | ixj_WriteDSPCommand(0x0FE3, j);	/* Put the DSP in 1/5 power mode. */ | 
|  |  | 
|  | /* Set up the default signals for events */ | 
|  | for (cnt = 0; cnt < 35; cnt++) | 
|  | j->ixj_signals[cnt] = SIGIO; | 
|  |  | 
|  | /* Set the excetion signal enable flags */ | 
|  | j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring = | 
|  | j->ex_sig.bits.caller_id = j->ex_sig.bits.pstn_wink = j->ex_sig.bits.f0 = j->ex_sig.bits.f1 = j->ex_sig.bits.f2 = | 
|  | j->ex_sig.bits.f3 = j->ex_sig.bits.fc0 = j->ex_sig.bits.fc1 = j->ex_sig.bits.fc2 = j->ex_sig.bits.fc3 = 1; | 
|  | #ifdef IXJ_DYN_ALLOC | 
|  | j->fskdata = NULL; | 
|  | #endif | 
|  | j->fskdcnt = 0; | 
|  | j->cidcw_wait = 0; | 
|  |  | 
|  | /* Register with the Telephony for Linux subsystem */ | 
|  | j->p.f_op = &ixj_fops; | 
|  | j->p.open = ixj_open; | 
|  | j->p.board = j->board; | 
|  | phone_register_device(&j->p, PHONE_UNIT_ANY); | 
|  |  | 
|  | ixj_init_timer(j); | 
|  | ixj_add_timer(j); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | /* | 
|  | *	Exported service for pcmcia card handling | 
|  | */ | 
|  |  | 
|  | IXJ *ixj_pcmcia_probe(unsigned long dsp, unsigned long xilinx) | 
|  | { | 
|  | IXJ *j = ixj_alloc(); | 
|  |  | 
|  | j->board = 0; | 
|  |  | 
|  | j->DSPbase = dsp; | 
|  | j->XILINXbase = xilinx; | 
|  | j->cardtype = QTI_PHONECARD; | 
|  | ixj_selfprobe(j); | 
|  | return j; | 
|  | } | 
|  |  | 
|  | EXPORT_SYMBOL(ixj_pcmcia_probe);		/* Fpr PCMCIA */ | 
|  |  | 
|  | static int ixj_get_status_proc(char *buf) | 
|  | { | 
|  | int len; | 
|  | int cnt; | 
|  | IXJ *j; | 
|  | len = 0; | 
|  | len += sprintf(buf + len, "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, IXJ_VER_MINOR, IXJ_BLD_VER); | 
|  | len += sprintf(buf + len, "\nsizeof IXJ struct %Zd bytes", sizeof(IXJ)); | 
|  | len += sprintf(buf + len, "\nsizeof DAA struct %Zd bytes", sizeof(DAA_REGS)); | 
|  | len += sprintf(buf + len, "\nUsing old telephony API"); | 
|  | len += sprintf(buf + len, "\nDebug Level %d\n", ixjdebug); | 
|  |  | 
|  | for (cnt = 0; cnt < IXJMAX; cnt++) { | 
|  | j = get_ixj(cnt); | 
|  | if(j==NULL) | 
|  | continue; | 
|  | if (j->DSPbase) { | 
|  | len += sprintf(buf + len, "\nCard Num %d", cnt); | 
|  | len += sprintf(buf + len, "\nDSP Base Address 0x%4.4x", j->DSPbase); | 
|  | if (j->cardtype != QTI_PHONEJACK) | 
|  | len += sprintf(buf + len, "\nXILINX Base Address 0x%4.4x", j->XILINXbase); | 
|  | len += sprintf(buf + len, "\nDSP Type %2.2x%2.2x", j->dsp.high, j->dsp.low); | 
|  | len += sprintf(buf + len, "\nDSP Version %2.2x.%2.2x", j->ver.high, j->ver.low); | 
|  | len += sprintf(buf + len, "\nSerial Number %8.8x", j->serial); | 
|  | switch (j->cardtype) { | 
|  | case (QTI_PHONEJACK): | 
|  | len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK"); | 
|  | break; | 
|  | case (QTI_LINEJACK): | 
|  | len += sprintf(buf + len, "\nCard Type = Internet LineJACK"); | 
|  | if (j->flags.g729_loaded) | 
|  | len += sprintf(buf + len, " w/G.729 A/B"); | 
|  | len += sprintf(buf + len, " Country = %d", j->daa_country); | 
|  | break; | 
|  | case (QTI_PHONEJACK_LITE): | 
|  | len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK Lite"); | 
|  | if (j->flags.g729_loaded) | 
|  | len += sprintf(buf + len, " w/G.729 A/B"); | 
|  | break; | 
|  | case (QTI_PHONEJACK_PCI): | 
|  | len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK PCI"); | 
|  | if (j->flags.g729_loaded) | 
|  | len += sprintf(buf + len, " w/G.729 A/B"); | 
|  | break; | 
|  | case (QTI_PHONECARD): | 
|  | len += sprintf(buf + len, "\nCard Type = Internet PhoneCARD"); | 
|  | if (j->flags.g729_loaded) | 
|  | len += sprintf(buf + len, " w/G.729 A/B"); | 
|  | len += sprintf(buf + len, "\nSmart Cable %spresent", j->pccr1.bits.drf ? "not " : ""); | 
|  | if (!j->pccr1.bits.drf) | 
|  | len += sprintf(buf + len, "\nSmart Cable type %d", j->flags.pcmciasct); | 
|  | len += sprintf(buf + len, "\nSmart Cable state %d", j->flags.pcmciastate); | 
|  | break; | 
|  | default: | 
|  | len += sprintf(buf + len, "\nCard Type = %d", j->cardtype); | 
|  | break; | 
|  | } | 
|  | len += sprintf(buf + len, "\nReaders %d", j->readers); | 
|  | len += sprintf(buf + len, "\nWriters %d", j->writers); | 
|  | add_caps(j); | 
|  | len += sprintf(buf + len, "\nCapabilities %d", j->caps); | 
|  | if (j->dsp.low != 0x20) | 
|  | len += sprintf(buf + len, "\nDSP Processor load %d", j->proc_load); | 
|  | if (j->flags.cidsent) | 
|  | len += sprintf(buf + len, "\nCaller ID data sent"); | 
|  | else | 
|  | len += sprintf(buf + len, "\nCaller ID data not sent"); | 
|  |  | 
|  | len += sprintf(buf + len, "\nPlay CODEC "); | 
|  | switch (j->play_codec) { | 
|  | case G723_63: | 
|  | len += sprintf(buf + len, "G.723.1 6.3"); | 
|  | break; | 
|  | case G723_53: | 
|  | len += sprintf(buf + len, "G.723.1 5.3"); | 
|  | break; | 
|  | case TS85: | 
|  | len += sprintf(buf + len, "TrueSpeech 8.5"); | 
|  | break; | 
|  | case TS48: | 
|  | len += sprintf(buf + len, "TrueSpeech 4.8"); | 
|  | break; | 
|  | case TS41: | 
|  | len += sprintf(buf + len, "TrueSpeech 4.1"); | 
|  | break; | 
|  | case G728: | 
|  | len += sprintf(buf + len, "G.728"); | 
|  | break; | 
|  | case G729: | 
|  | len += sprintf(buf + len, "G.729"); | 
|  | break; | 
|  | case G729B: | 
|  | len += sprintf(buf + len, "G.729B"); | 
|  | break; | 
|  | case ULAW: | 
|  | len += sprintf(buf + len, "uLaw"); | 
|  | break; | 
|  | case ALAW: | 
|  | len += sprintf(buf + len, "aLaw"); | 
|  | break; | 
|  | case LINEAR16: | 
|  | len += sprintf(buf + len, "16 bit Linear"); | 
|  | break; | 
|  | case LINEAR8: | 
|  | len += sprintf(buf + len, "8 bit Linear"); | 
|  | break; | 
|  | case WSS: | 
|  | len += sprintf(buf + len, "Windows Sound System"); | 
|  | break; | 
|  | default: | 
|  | len += sprintf(buf + len, "NO CODEC CHOSEN"); | 
|  | break; | 
|  | } | 
|  | len += sprintf(buf + len, "\nRecord CODEC "); | 
|  | switch (j->rec_codec) { | 
|  | case G723_63: | 
|  | len += sprintf(buf + len, "G.723.1 6.3"); | 
|  | break; | 
|  | case G723_53: | 
|  | len += sprintf(buf + len, "G.723.1 5.3"); | 
|  | break; | 
|  | case TS85: | 
|  | len += sprintf(buf + len, "TrueSpeech 8.5"); | 
|  | break; | 
|  | case TS48: | 
|  | len += sprintf(buf + len, "TrueSpeech 4.8"); | 
|  | break; | 
|  | case TS41: | 
|  | len += sprintf(buf + len, "TrueSpeech 4.1"); | 
|  | break; | 
|  | case G728: | 
|  | len += sprintf(buf + len, "G.728"); | 
|  | break; | 
|  | case G729: | 
|  | len += sprintf(buf + len, "G.729"); | 
|  | break; | 
|  | case G729B: | 
|  | len += sprintf(buf + len, "G.729B"); | 
|  | break; | 
|  | case ULAW: | 
|  | len += sprintf(buf + len, "uLaw"); | 
|  | break; | 
|  | case ALAW: | 
|  | len += sprintf(buf + len, "aLaw"); | 
|  | break; | 
|  | case LINEAR16: | 
|  | len += sprintf(buf + len, "16 bit Linear"); | 
|  | break; | 
|  | case LINEAR8: | 
|  | len += sprintf(buf + len, "8 bit Linear"); | 
|  | break; | 
|  | case WSS: | 
|  | len += sprintf(buf + len, "Windows Sound System"); | 
|  | break; | 
|  | default: | 
|  | len += sprintf(buf + len, "NO CODEC CHOSEN"); | 
|  | break; | 
|  | } | 
|  | len += sprintf(buf + len, "\nAEC "); | 
|  | switch (j->aec_level) { | 
|  | case AEC_OFF: | 
|  | len += sprintf(buf + len, "Off"); | 
|  | break; | 
|  | case AEC_LOW: | 
|  | len += sprintf(buf + len, "Low"); | 
|  | break; | 
|  | case AEC_MED: | 
|  | len += sprintf(buf + len, "Med"); | 
|  | break; | 
|  | case AEC_HIGH: | 
|  | len += sprintf(buf + len, "High"); | 
|  | break; | 
|  | case AEC_AUTO: | 
|  | len += sprintf(buf + len, "Auto"); | 
|  | break; | 
|  | case AEC_AGC: | 
|  | len += sprintf(buf + len, "AEC/AGC"); | 
|  | break; | 
|  | default: | 
|  | len += sprintf(buf + len, "unknown(%i)", j->aec_level); | 
|  | break; | 
|  | } | 
|  |  | 
|  | len += sprintf(buf + len, "\nRec volume 0x%x", get_rec_volume(j)); | 
|  | len += sprintf(buf + len, "\nPlay volume 0x%x", get_play_volume(j)); | 
|  | len += sprintf(buf + len, "\nDTMF prescale 0x%x", get_dtmf_prescale(j)); | 
|  |  | 
|  | len += sprintf(buf + len, "\nHook state %d", j->hookstate); /* j->r_hook);	*/ | 
|  |  | 
|  | if (j->cardtype == QTI_LINEJACK) { | 
|  | len += sprintf(buf + len, "\nPOTS Correct %d", j->flags.pots_correct); | 
|  | len += sprintf(buf + len, "\nPSTN Present %d", j->flags.pstn_present); | 
|  | len += sprintf(buf + len, "\nPSTN Check %d", j->flags.pstncheck); | 
|  | len += sprintf(buf + len, "\nPOTS to PSTN %d", j->flags.pots_pstn); | 
|  | switch (j->daa_mode) { | 
|  | case SOP_PU_SLEEP: | 
|  | len += sprintf(buf + len, "\nDAA PSTN On Hook"); | 
|  | break; | 
|  | case SOP_PU_RINGING: | 
|  | len += sprintf(buf + len, "\nDAA PSTN Ringing"); | 
|  | len += sprintf(buf + len, "\nRinging state = %d", j->cadence_f[4].state); | 
|  | break; | 
|  | case SOP_PU_CONVERSATION: | 
|  | len += sprintf(buf + len, "\nDAA PSTN Off Hook"); | 
|  | break; | 
|  | case SOP_PU_PULSEDIALING: | 
|  | len += sprintf(buf + len, "\nDAA PSTN Pulse Dialing"); | 
|  | break; | 
|  | } | 
|  | len += sprintf(buf + len, "\nDAA RMR = %d", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR); | 
|  | len += sprintf(buf + len, "\nDAA VDD OK = %d", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK); | 
|  | len += sprintf(buf + len, "\nDAA CR0 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg); | 
|  | len += sprintf(buf + len, "\nDAA CR1 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg); | 
|  | len += sprintf(buf + len, "\nDAA CR2 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg); | 
|  | len += sprintf(buf + len, "\nDAA CR3 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg); | 
|  | len += sprintf(buf + len, "\nDAA CR4 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg); | 
|  | len += sprintf(buf + len, "\nDAA CR5 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg); | 
|  | len += sprintf(buf + len, "\nDAA XR0 = 0x%02x", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg); | 
|  | len += sprintf(buf + len, "\nDAA ringstop %ld - jiffies %ld", j->pstn_ring_stop, jiffies); | 
|  | } | 
|  | switch (j->port) { | 
|  | case PORT_POTS: | 
|  | len += sprintf(buf + len, "\nPort POTS"); | 
|  | break; | 
|  | case PORT_PSTN: | 
|  | len += sprintf(buf + len, "\nPort PSTN"); | 
|  | break; | 
|  | case PORT_SPEAKER: | 
|  | len += sprintf(buf + len, "\nPort SPEAKER/MIC"); | 
|  | break; | 
|  | case PORT_HANDSET: | 
|  | len += sprintf(buf + len, "\nPort HANDSET"); | 
|  | break; | 
|  | } | 
|  | if (j->dsp.low == 0x21 || j->dsp.low == 0x22) { | 
|  | len += sprintf(buf + len, "\nSLIC state "); | 
|  | switch (SLIC_GetState(j)) { | 
|  | case PLD_SLIC_STATE_OC: | 
|  | len += sprintf(buf + len, "OC"); | 
|  | break; | 
|  | case PLD_SLIC_STATE_RINGING: | 
|  | len += sprintf(buf + len, "RINGING"); | 
|  | break; | 
|  | case PLD_SLIC_STATE_ACTIVE: | 
|  | len += sprintf(buf + len, "ACTIVE"); | 
|  | break; | 
|  | case PLD_SLIC_STATE_OHT:	/* On-hook transmit */ | 
|  | len += sprintf(buf + len, "OHT"); | 
|  | break; | 
|  | case PLD_SLIC_STATE_TIPOPEN: | 
|  | len += sprintf(buf + len, "TIPOPEN"); | 
|  | break; | 
|  | case PLD_SLIC_STATE_STANDBY: | 
|  | len += sprintf(buf + len, "STANDBY"); | 
|  | break; | 
|  | case PLD_SLIC_STATE_APR:	/* Active polarity reversal */ | 
|  | len += sprintf(buf + len, "APR"); | 
|  | break; | 
|  | case PLD_SLIC_STATE_OHTPR:	/* OHT polarity reversal */ | 
|  | len += sprintf(buf + len, "OHTPR"); | 
|  | break; | 
|  | default: | 
|  | len += sprintf(buf + len, "%d", SLIC_GetState(j)); | 
|  | break; | 
|  | } | 
|  | } | 
|  | len += sprintf(buf + len, "\nBase Frame %2.2x.%2.2x", j->baseframe.high, j->baseframe.low); | 
|  | len += sprintf(buf + len, "\nCID Base Frame %2d", j->cid_base_frame_size); | 
|  | #ifdef PERFMON_STATS | 
|  | len += sprintf(buf + len, "\nTimer Checks %ld", j->timerchecks); | 
|  | len += sprintf(buf + len, "\nRX Ready Checks %ld", j->rxreadycheck); | 
|  | len += sprintf(buf + len, "\nTX Ready Checks %ld", j->txreadycheck); | 
|  | len += sprintf(buf + len, "\nFrames Read %ld", j->framesread); | 
|  | len += sprintf(buf + len, "\nFrames Written %ld", j->frameswritten); | 
|  | len += sprintf(buf + len, "\nDry Buffer %ld", j->drybuffer); | 
|  | len += sprintf(buf + len, "\nRead Waits %ld", j->read_wait); | 
|  | len += sprintf(buf + len, "\nWrite Waits %ld", j->write_wait); | 
|  | len += sprintf(buf + len, "\nStatus Waits %ld", j->statuswait); | 
|  | len += sprintf(buf + len, "\nStatus Wait Fails %ld", j->statuswaitfail); | 
|  | len += sprintf(buf + len, "\nPControl Waits %ld", j->pcontrolwait); | 
|  | len += sprintf(buf + len, "\nPControl Wait Fails %ld", j->pcontrolwaitfail); | 
|  | len += sprintf(buf + len, "\nIs Control Ready Checks %ld", j->iscontrolready); | 
|  | len += sprintf(buf + len, "\nIs Control Ready Check failures %ld", j->iscontrolreadyfail); | 
|  |  | 
|  | #endif | 
|  | len += sprintf(buf + len, "\n"); | 
|  | } | 
|  | } | 
|  | return len; | 
|  | } | 
|  |  | 
|  | static int ixj_read_proc(char *page, char **start, off_t off, | 
|  | int count, int *eof, void *data) | 
|  | { | 
|  | int len = ixj_get_status_proc(page); | 
|  | if (len <= off+count) *eof = 1; | 
|  | *start = page + off; | 
|  | len -= off; | 
|  | if (len>count) len = count; | 
|  | if (len<0) len = 0; | 
|  | return len; | 
|  | } | 
|  |  | 
|  |  | 
|  | static void cleanup(void) | 
|  | { | 
|  | int cnt; | 
|  | IXJ *j; | 
|  |  | 
|  | for (cnt = 0; cnt < IXJMAX; cnt++) { | 
|  | j = get_ixj(cnt); | 
|  | if(j != NULL && j->DSPbase) { | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "IXJ: Deleting timer for /dev/phone%d\n", cnt); | 
|  | del_timer(&j->timer); | 
|  | if (j->cardtype == QTI_LINEJACK) { | 
|  | j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */ | 
|  |  | 
|  | outb_p(j->pld_scrw.byte, j->XILINXbase); | 
|  | j->pld_slicw.bits.rly1 = 0; | 
|  | j->pld_slicw.bits.rly2 = 0; | 
|  | j->pld_slicw.bits.rly3 = 0; | 
|  | outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); | 
|  | LED_SetState(0x0, j); | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt); | 
|  | release_region(j->XILINXbase, 8); | 
|  | } else if (j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) { | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt); | 
|  | release_region(j->XILINXbase, 4); | 
|  | } | 
|  | kfree(j->read_buffer); | 
|  | kfree(j->write_buffer); | 
|  | if (j->dev) | 
|  | pnp_device_detach(j->dev); | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt); | 
|  | phone_unregister_device(&j->p); | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "IXJ: Releasing DSP address for /dev/phone%d\n", cnt); | 
|  | release_region(j->DSPbase, 16); | 
|  | #ifdef IXJ_DYN_ALLOC | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "IXJ: Freeing memory for /dev/phone%d\n", cnt); | 
|  | kfree(j); | 
|  | ixj[cnt] = NULL; | 
|  | #endif | 
|  | } | 
|  | } | 
|  | if (ixjdebug & 0x0002) | 
|  | printk(KERN_INFO "IXJ: Removing /proc/ixj\n"); | 
|  | remove_proc_entry ("ixj", NULL); | 
|  | } | 
|  |  | 
|  | /* Typedefs */ | 
|  | typedef struct { | 
|  | BYTE length; | 
|  | DWORD bits; | 
|  | } DATABLOCK; | 
|  |  | 
|  | static void PCIEE_WriteBit(WORD wEEPROMAddress, BYTE lastLCC, BYTE byData) | 
|  | { | 
|  | lastLCC = lastLCC & 0xfb; | 
|  | lastLCC = lastLCC | (byData ? 4 : 0); | 
|  | outb(lastLCC, wEEPROMAddress);	/*set data out bit as appropriate */ | 
|  |  | 
|  | mdelay(1); | 
|  | lastLCC = lastLCC | 0x01; | 
|  | outb(lastLCC, wEEPROMAddress);	/*SK rising edge */ | 
|  |  | 
|  | byData = byData << 1; | 
|  | lastLCC = lastLCC & 0xfe; | 
|  | mdelay(1); | 
|  | outb(lastLCC, wEEPROMAddress);	/*after delay, SK falling edge */ | 
|  |  | 
|  | } | 
|  |  | 
|  | static BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC) | 
|  | { | 
|  | mdelay(1); | 
|  | lastLCC = lastLCC | 0x01; | 
|  | outb(lastLCC, wEEPROMAddress);	/*SK rising edge */ | 
|  |  | 
|  | lastLCC = lastLCC & 0xfe; | 
|  | mdelay(1); | 
|  | outb(lastLCC, wEEPROMAddress);	/*after delay, SK falling edge */ | 
|  |  | 
|  | return ((inb(wEEPROMAddress) >> 3) & 1); | 
|  | } | 
|  |  | 
|  | static BOOL PCIEE_ReadWord(WORD wAddress, WORD wLoc, WORD * pwResult) | 
|  | { | 
|  | BYTE lastLCC; | 
|  | WORD wEEPROMAddress = wAddress + 3; | 
|  | DWORD i; | 
|  | BYTE byResult; | 
|  | *pwResult = 0; | 
|  | lastLCC = inb(wEEPROMAddress); | 
|  | lastLCC = lastLCC | 0x02; | 
|  | lastLCC = lastLCC & 0xfe; | 
|  | outb(lastLCC, wEEPROMAddress);	/* CS hi, SK lo */ | 
|  |  | 
|  | mdelay(1);		/* delay */ | 
|  |  | 
|  | PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1); | 
|  | PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1); | 
|  | PCIEE_WriteBit(wEEPROMAddress, lastLCC, 0); | 
|  | for (i = 0; i < 8; i++) { | 
|  | PCIEE_WriteBit(wEEPROMAddress, lastLCC, wLoc & 0x80 ? 1 : 0); | 
|  | wLoc <<= 1; | 
|  | } | 
|  |  | 
|  | for (i = 0; i < 16; i++) { | 
|  | byResult = PCIEE_ReadBit(wEEPROMAddress, lastLCC); | 
|  | *pwResult = (*pwResult << 1) | byResult; | 
|  | } | 
|  |  | 
|  | mdelay(1);		/* another delay */ | 
|  |  | 
|  | lastLCC = lastLCC & 0xfd; | 
|  | outb(lastLCC, wEEPROMAddress);	/* negate CS */ | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static DWORD PCIEE_GetSerialNumber(WORD wAddress) | 
|  | { | 
|  | WORD wLo, wHi; | 
|  | if (PCIEE_ReadWord(wAddress, 62, &wLo)) | 
|  | return 0; | 
|  | if (PCIEE_ReadWord(wAddress, 63, &wHi)) | 
|  | return 0; | 
|  | return (((DWORD) wHi << 16) | wLo); | 
|  | } | 
|  |  | 
|  | static int dspio[IXJMAX + 1] = | 
|  | { | 
|  | 0, | 
|  | }; | 
|  | static int xio[IXJMAX + 1] = | 
|  | { | 
|  | 0, | 
|  | }; | 
|  |  | 
|  | module_param_array(dspio, int, NULL, 0); | 
|  | module_param_array(xio, int, NULL, 0); | 
|  | MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net"); | 
|  | MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>"); | 
|  | MODULE_LICENSE("GPL"); | 
|  |  | 
|  | static void __exit ixj_exit(void) | 
|  | { | 
|  | cleanup(); | 
|  | } | 
|  |  | 
|  | static IXJ *new_ixj(unsigned long port) | 
|  | { | 
|  | IXJ *res; | 
|  | if (!request_region(port, 16, "ixj DSP")) { | 
|  | printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", port); | 
|  | return NULL; | 
|  | } | 
|  | res = ixj_alloc(); | 
|  | if (!res) { | 
|  | release_region(port, 16); | 
|  | printk(KERN_INFO "ixj: out of memory\n"); | 
|  | return NULL; | 
|  | } | 
|  | res->DSPbase = port; | 
|  | return res; | 
|  | } | 
|  |  | 
|  | static int __init ixj_probe_isapnp(int *cnt) | 
|  | { | 
|  | int probe = 0; | 
|  | int func = 0x110; | 
|  | struct pnp_dev *dev = NULL, *old_dev = NULL; | 
|  |  | 
|  | while (1) { | 
|  | do { | 
|  | IXJ *j; | 
|  | int result; | 
|  |  | 
|  | old_dev = dev; | 
|  | dev = pnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'), | 
|  | ISAPNP_FUNCTION(func), old_dev); | 
|  | if (!dev || !dev->card) | 
|  | break; | 
|  | result = pnp_device_attach(dev); | 
|  | if (result < 0) { | 
|  | printk("pnp attach failed %d \n", result); | 
|  | break; | 
|  | } | 
|  | if (pnp_activate_dev(dev) < 0) { | 
|  | printk("pnp activate failed (out of resources?)\n"); | 
|  | pnp_device_detach(dev); | 
|  | return -ENOMEM; | 
|  | } | 
|  |  | 
|  | if (!pnp_port_valid(dev, 0)) { | 
|  | pnp_device_detach(dev); | 
|  | return -ENODEV; | 
|  | } | 
|  |  | 
|  | j = new_ixj(pnp_port_start(dev, 0)); | 
|  | if (!j) | 
|  | break; | 
|  |  | 
|  | if (func != 0x110) | 
|  | j->XILINXbase = pnp_port_start(dev, 1);	/* get real port */ | 
|  |  | 
|  | switch (func) { | 
|  | case (0x110): | 
|  | j->cardtype = QTI_PHONEJACK; | 
|  | break; | 
|  | case (0x310): | 
|  | j->cardtype = QTI_LINEJACK; | 
|  | break; | 
|  | case (0x410): | 
|  | j->cardtype = QTI_PHONEJACK_LITE; | 
|  | break; | 
|  | } | 
|  | j->board = *cnt; | 
|  | probe = ixj_selfprobe(j); | 
|  | if(!probe) { | 
|  | j->serial = dev->card->serial; | 
|  | j->dev = dev; | 
|  | switch (func) { | 
|  | case 0x110: | 
|  | printk(KERN_INFO "ixj: found Internet PhoneJACK at 0x%x\n", j->DSPbase); | 
|  | break; | 
|  | case 0x310: | 
|  | printk(KERN_INFO "ixj: found Internet LineJACK at 0x%x\n", j->DSPbase); | 
|  | break; | 
|  | case 0x410: | 
|  | printk(KERN_INFO "ixj: found Internet PhoneJACK Lite at 0x%x\n", j->DSPbase); | 
|  | break; | 
|  | } | 
|  | } | 
|  | ++*cnt; | 
|  | } while (dev); | 
|  | if (func == 0x410) | 
|  | break; | 
|  | if (func == 0x310) | 
|  | func = 0x410; | 
|  | if (func == 0x110) | 
|  | func = 0x310; | 
|  | dev = NULL; | 
|  | } | 
|  | return probe; | 
|  | } | 
|  |  | 
|  | static int __init ixj_probe_isa(int *cnt) | 
|  | { | 
|  | int i, probe; | 
|  |  | 
|  | /* Use passed parameters for older kernels without PnP */ | 
|  | for (i = 0; i < IXJMAX; i++) { | 
|  | if (dspio[i]) { | 
|  | IXJ *j = new_ixj(dspio[i]); | 
|  |  | 
|  | if (!j) | 
|  | break; | 
|  |  | 
|  | j->XILINXbase = xio[i]; | 
|  | j->cardtype = 0; | 
|  |  | 
|  | j->board = *cnt; | 
|  | probe = ixj_selfprobe(j); | 
|  | j->dev = NULL; | 
|  | ++*cnt; | 
|  | } | 
|  | } | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static int __init ixj_probe_pci(int *cnt) | 
|  | { | 
|  | struct pci_dev *pci = NULL; | 
|  | int i, probe = 0; | 
|  | IXJ *j = NULL; | 
|  |  | 
|  | for (i = 0; i < IXJMAX - *cnt; i++) { | 
|  | pci = pci_find_device(0x15E2, 0x0500, pci); | 
|  | if (!pci) | 
|  | break; | 
|  |  | 
|  | if (pci_enable_device(pci)) | 
|  | break; | 
|  | j = new_ixj(pci_resource_start(pci, 0)); | 
|  | if (!j) | 
|  | break; | 
|  |  | 
|  | j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2); | 
|  | j->XILINXbase = j->DSPbase + 0x10; | 
|  | j->cardtype = QTI_PHONEJACK_PCI; | 
|  | j->board = *cnt; | 
|  | probe = ixj_selfprobe(j); | 
|  | if (!probe) | 
|  | printk(KERN_INFO "ixj: found Internet PhoneJACK PCI at 0x%x\n", j->DSPbase); | 
|  | ++*cnt; | 
|  | } | 
|  | return probe; | 
|  | } | 
|  |  | 
|  | static int __init ixj_init(void) | 
|  | { | 
|  | int cnt = 0; | 
|  | int probe = 0; | 
|  |  | 
|  | cnt = 0; | 
|  |  | 
|  | /* These might be no-ops, see above. */ | 
|  | if ((probe = ixj_probe_isapnp(&cnt)) < 0) { | 
|  | return probe; | 
|  | } | 
|  | if ((probe = ixj_probe_isa(&cnt)) < 0) { | 
|  | return probe; | 
|  | } | 
|  | if ((probe = ixj_probe_pci(&cnt)) < 0) { | 
|  | return probe; | 
|  | } | 
|  | printk(KERN_INFO "ixj driver initialized.\n"); | 
|  | create_proc_read_entry ("ixj", 0, NULL, ixj_read_proc, NULL); | 
|  | return probe; | 
|  | } | 
|  |  | 
|  | module_init(ixj_init); | 
|  | module_exit(ixj_exit); | 
|  |  | 
|  | static void DAA_Coeff_US(IXJ *j) | 
|  | { | 
|  | int i; | 
|  |  | 
|  | j->daa_country = DAA_US; | 
|  | /*----------------------------------------------- */ | 
|  | /* CAO */ | 
|  | for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) { | 
|  | j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0; | 
|  | } | 
|  |  | 
|  | /* Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x03; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0x4B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x5D; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xCD; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x24; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xC5; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00; | 
|  | /* Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x71; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x1A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xB5; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08; | 
|  | /* Bytes for FRX-filter       (08): 03,8F,48,F2,8F,48,70,08 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x05; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xA3; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x72; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x3F; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x3B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08; | 
|  | /* Bytes for FRR-filter       (07): 04,8F,38,7F,9B,EA,B0,08 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x05; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x3E; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x32; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xDA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08; | 
|  | /* Bytes for AX-filter        (0A): 16,55,DD,CA */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x41; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA; | 
|  | /* Bytes for AR-filter        (09): 52,D3,11,42 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6; | 
|  | /* Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA5; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98; | 
|  | /* Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xA2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAB; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xCC; | 
|  | /* Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xD2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x24; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xA9; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x3B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xA6; | 
|  | /* ;  (10K, 0.68uF) */ | 
|  | /*  */ | 
|  | /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23; | 
|  | /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5; | 
|  |  | 
|  | /* Levelmetering Ringing        (0D):B2,45,0F,8E       */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; | 
|  |  | 
|  | /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */ | 
|  | /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1C; */ | 
|  | /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0xB3; */ | 
|  | /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0xAB; */ | 
|  | /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xAB; */ | 
|  | /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x54; */ | 
|  | /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x2D; */ | 
|  | /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0x62; */ | 
|  | /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x2D; */ | 
|  | /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */ | 
|  | /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x2D; */ | 
|  | /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x62; */ | 
|  | /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; */ | 
|  | /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBB; */ | 
|  | /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x2A; */ | 
|  | /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7D; */ | 
|  | /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; */ | 
|  | /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD4; */ | 
|  | /* */ | 
|  | /* Levelmetering Ringing        (0D):B2,45,0F,8E       */ | 
|  | /*	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; */ | 
|  | /*	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x05; */ | 
|  | /*	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; */ | 
|  | /*	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; */ | 
|  |  | 
|  | /* Caller ID 1st Tone           (0E):CA,0E,CA,09,99,99,99,99 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99; | 
|  | /* Caller ID 2nd Tone           (0F):FD,B5,BA,07,DA,00,00,00 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00; | 
|  | /*  */ | 
|  | /* ;CR Registers */ | 
|  | /* Config. Reg. 0 (filters)       (cr0):FE ; CLK gen. by crystal */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF; | 
|  | /* Config. Reg. 1 (dialing)       (cr1):05 */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05; | 
|  | /* Config. Reg. 2 (caller ID)     (cr2):04 */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04; | 
|  | /* Config. Reg. 3 (testloops)     (cr3):03 ; SEL Bit==0, HP-disabled */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00; | 
|  | /* Config. Reg. 4 (analog gain)   (cr4):02 */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02; | 
|  | /* Config. Reg. 5 (Version)       (cr5):02 */ | 
|  | /* Config. Reg. 6 (Reserved)      (cr6):00 */ | 
|  | /* Config. Reg. 7 (Reserved)      (cr7):00 */ | 
|  | /*  */ | 
|  | /* ;xr Registers */ | 
|  | /* Ext. Reg. 0 (Interrupt Reg.)   (xr0):02 */ | 
|  |  | 
|  | j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */ | 
|  | /* Ext. Reg. 1 (Interrupt enable) (xr1):3C Cadence, RING, Caller ID, VDD_OK */ | 
|  |  | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x3C; | 
|  | /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D; | 
|  | /* Ext. Reg. 3 (DC Char)          (xr3):32 ; B-Filter Off == 1 */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x3B;		/*0x32; */ | 
|  | /* Ext. Reg. 4 (Cadence)          (xr4):00 */ | 
|  |  | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00; | 
|  | /* Ext. Reg. 5 (Ring timer)       (xr5):22 */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22; | 
|  | /* Ext. Reg. 6 (Power State)      (xr6):00 */ | 
|  | j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00; | 
|  | /* Ext. Reg. 7 (Vdd)              (xr7):40 */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		/* 0x40 ??? Should it be 0x00? */ | 
|  | /*  */ | 
|  | /* DTMF Tone 1                     (0B): 11,B3,5A,2C ;   697 Hz   */ | 
|  | /*                                       12,33,5A,C3 ;  770 Hz   */ | 
|  | /*                                       13,3C,5B,32 ;  852 Hz   */ | 
|  | /*                                       1D,1B,5C,CC ;  941 Hz   */ | 
|  |  | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C; | 
|  | /* DTMF Tone 2                     (0C): 32,32,52,B3 ;  1209 Hz   */ | 
|  | /*                                       EC,1D,52,22 ;  1336 Hz   */ | 
|  | /*                                       AA,AC,51,D2 ;  1477 Hz   */ | 
|  | /*                                       9B,3B,51,25 ;  1633 Hz   */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3; | 
|  | } | 
|  |  | 
|  | static void DAA_Coeff_UK(IXJ *j) | 
|  | { | 
|  | int i; | 
|  |  | 
|  | j->daa_country = DAA_UK; | 
|  | /*----------------------------------------------- */ | 
|  | /* CAO */ | 
|  | for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) { | 
|  | j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0; | 
|  | } | 
|  |  | 
|  | /*  Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xC2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xA8; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xCB; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00; | 
|  | /* Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x40; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xA4; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08; | 
|  | /* Bytes for FRX-filter       (08): 07,9B,ED,24,B2,A2,A0,08 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xED; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x24; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0xB2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0xA2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xA0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08; | 
|  | /* Bytes for FRR-filter       (07): 0F,92,F2,B2,87,D2,30,08 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x92; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0xB2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xD2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x30; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08; | 
|  | /* Bytes for AX-filter        (0A): 1B,A5,DD,CA */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x1B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xA5; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA; | 
|  | /* Bytes for AR-filter        (09): E2,27,10,D6 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x27; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6; | 
|  | /* Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x2D; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x38; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x8B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xD0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98; | 
|  | /* Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x5A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x53; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xF0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x0B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5F; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x84; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xD4; | 
|  | /* Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x6A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA4; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x8F; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x52; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xF5; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x32; | 
|  | /* ; idle */ | 
|  | /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23; | 
|  | /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5; | 
|  | /* Levelmetering Ringing           (0D):AA,35,0F,8E     ; 25Hz 30V less possible? */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; | 
|  | /* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99; | 
|  | /* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00; | 
|  | /* ;CR Registers */ | 
|  | /* Config. Reg. 0 (filters)        (cr0):FF */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF; | 
|  | /* Config. Reg. 1 (dialing)        (cr1):05 */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05; | 
|  | /* Config. Reg. 2 (caller ID)      (cr2):04 */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04; | 
|  | /* Config. Reg. 3 (testloops)      (cr3):00        ;  */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00; | 
|  | /* Config. Reg. 4 (analog gain)    (cr4):02 */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02; | 
|  | /* Config. Reg. 5 (Version)        (cr5):02 */ | 
|  | /* Config. Reg. 6 (Reserved)       (cr6):00 */ | 
|  | /* Config. Reg. 7 (Reserved)       (cr7):00 */ | 
|  | /* ;xr Registers */ | 
|  | /* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */ | 
|  |  | 
|  | j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */ | 
|  | /* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */ | 
|  |  | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */ | 
|  | /* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */ | 
|  |  | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D; | 
|  | /* Ext. Reg. 3 (DC Char)           (xr3):36        ;  */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36; | 
|  | /* Ext. Reg. 4 (Cadence)           (xr4):00 */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00; | 
|  | /* Ext. Reg. 5 (Ring timer)        (xr5):22 */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22; | 
|  | /* Ext. Reg. 6 (Power State)       (xr6):00 */ | 
|  | j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00; | 
|  | /* Ext. Reg. 7 (Vdd)               (xr7):46 */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46;		/* 0x46 ??? Should it be 0x00? */ | 
|  | /* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */ | 
|  | /*                                       12,33,5A,C3    ;  770 Hz   */ | 
|  | /*                                       13,3C,5B,32    ;  852 Hz   */ | 
|  | /*                                       1D,1B,5C,CC    ;  941 Hz   */ | 
|  |  | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C; | 
|  | /* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */ | 
|  | /*                                       EC,1D,52,22    ;  1336 Hz   */ | 
|  | /*                                       AA,AC,51,D2    ;  1477 Hz   */ | 
|  | /*                                       9B,3B,51,25    ;  1633 Hz   */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3; | 
|  | } | 
|  |  | 
|  |  | 
|  | static void DAA_Coeff_France(IXJ *j) | 
|  | { | 
|  | int i; | 
|  |  | 
|  | j->daa_country = DAA_FRANCE; | 
|  | /*----------------------------------------------- */ | 
|  | /* CAO */ | 
|  | for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) { | 
|  | j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0; | 
|  | } | 
|  |  | 
|  | /* Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x02; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x43; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2C; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x22; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xAF; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00; | 
|  | /* Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x67; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xCE; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x2C; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x22; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08; | 
|  | /* Bytes for FRX-filter       (08): 07,9A,28,F6,23,4A,B0,08 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x28; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0xF6; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x23; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x4A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xB0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08; | 
|  | /* Bytes for FRR-filter       (07): 03,8F,F9,2F,9E,FA,20,08 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9E; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xFA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08; | 
|  | /* Bytes for AX-filter        (0A): 16,B5,DD,CA */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x16; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA; | 
|  | /* Bytes for AR-filter        (09): 52,C7,10,D6 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6; | 
|  | /* Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA6; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98; | 
|  | /* Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAC; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x30; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x78; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAC; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x8A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x2C; | 
|  | /* Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA5; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x22; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2C; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x45; | 
|  | /* ; idle */ | 
|  | /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23; | 
|  | /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5; | 
|  | /* Levelmetering Ringing           (0D):32,45,B5,84     ; 50Hz 20V */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84; | 
|  | /* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99; | 
|  | /* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00; | 
|  | /* ;CR Registers */ | 
|  | /* Config. Reg. 0 (filters)        (cr0):FF */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF; | 
|  | /* Config. Reg. 1 (dialing)        (cr1):05 */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05; | 
|  | /* Config. Reg. 2 (caller ID)      (cr2):04 */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04; | 
|  | /* Config. Reg. 3 (testloops)      (cr3):00        ;  */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00; | 
|  | /* Config. Reg. 4 (analog gain)    (cr4):02 */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02; | 
|  | /* Config. Reg. 5 (Version)        (cr5):02 */ | 
|  | /* Config. Reg. 6 (Reserved)       (cr6):00 */ | 
|  | /* Config. Reg. 7 (Reserved)       (cr7):00 */ | 
|  | /* ;xr Registers */ | 
|  | /* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */ | 
|  |  | 
|  | j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */ | 
|  | /* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */ | 
|  |  | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */ | 
|  | /* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */ | 
|  |  | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D; | 
|  | /* Ext. Reg. 3 (DC Char)           (xr3):36        ;  */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36; | 
|  | /* Ext. Reg. 4 (Cadence)           (xr4):00 */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00; | 
|  | /* Ext. Reg. 5 (Ring timer)        (xr5):22 */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22; | 
|  | /* Ext. Reg. 6 (Power State)       (xr6):00 */ | 
|  | j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00; | 
|  | /* Ext. Reg. 7 (Vdd)               (xr7):46 */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46;		/* 0x46 ??? Should it be 0x00? */ | 
|  | /* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */ | 
|  | /*                                       12,33,5A,C3    ;  770 Hz   */ | 
|  | /*                                       13,3C,5B,32    ;  852 Hz   */ | 
|  | /*                                       1D,1B,5C,CC    ;  941 Hz   */ | 
|  |  | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C; | 
|  | /* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */ | 
|  | /*                                       EC,1D,52,22    ;  1336 Hz   */ | 
|  | /*                                       AA,AC,51,D2    ;  1477 Hz   */ | 
|  | /*                                       9B,3B,51,25    ;  1633 Hz   */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3; | 
|  | } | 
|  |  | 
|  |  | 
|  | static void DAA_Coeff_Germany(IXJ *j) | 
|  | { | 
|  | int i; | 
|  |  | 
|  | j->daa_country = DAA_GERMANY; | 
|  | /*----------------------------------------------- */ | 
|  | /* CAO */ | 
|  | for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) { | 
|  | j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0; | 
|  | } | 
|  |  | 
|  | /* Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xCE; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xB8; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xD2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xB0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00; | 
|  | /* Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x45; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x8F; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0C; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xD2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x3A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xD0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08; | 
|  | /* Bytes for FRX-filter       (08): 07,AA,E2,34,24,89,20,08 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xAA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x24; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x89; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x20; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08; | 
|  | /* Bytes for FRR-filter       (07): 02,87,FA,37,9A,CA,B0,08 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x02; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xFA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x37; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08; | 
|  | /* Bytes for AX-filter        (0A): 72,D5,DD,CA */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x72; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xD5; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA; | 
|  | /* Bytes for AR-filter        (09): 72,42,13,4B */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x72; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x42; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x13; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x4B; | 
|  | /* Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAD; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98; | 
|  | /* Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x42; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x5A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x1A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x27; | 
|  | /* Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x63; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x26; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBD; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x4B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xA3; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xC2; | 
|  | /* ;  (10K, 0.68uF) */ | 
|  | /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x9B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xBA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0xD4; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x1C; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xB3; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23; | 
|  | /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x13; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0xD4; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x73; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0xCA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5; | 
|  | /* Levelmetering Ringing        (0D):B2,45,0F,8E       */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xB2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; | 
|  | /* Caller ID 1st Tone           (0E):CA,0E,CA,09,99,99,99,99 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99; | 
|  | /* Caller ID 2nd Tone           (0F):FD,B5,BA,07,DA,00,00,00 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00; | 
|  | /* ;CR Registers */ | 
|  | /* Config. Reg. 0 (filters)        (cr0):FF ; all Filters enabled, CLK from ext. source */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF; | 
|  | /* Config. Reg. 1 (dialing)        (cr1):05 ; Manual Ring, Ring metering enabled */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05; | 
|  | /* Config. Reg. 2 (caller ID)      (cr2):04 ; Analog Gain 0dB, FSC internal */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04; | 
|  | /* Config. Reg. 3 (testloops)      (cr3):00 ; SEL Bit==0, HP-enabled */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00; | 
|  | /* Config. Reg. 4 (analog gain)    (cr4):02 */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02; | 
|  | /* Config. Reg. 5 (Version)        (cr5):02 */ | 
|  | /* Config. Reg. 6 (Reserved)       (cr6):00 */ | 
|  | /* Config. Reg. 7 (Reserved)       (cr7):00 */ | 
|  | /* ;xr Registers */ | 
|  | /* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */ | 
|  |  | 
|  | j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */ | 
|  | /* Ext. Reg. 1 (Interrupt enable)  (xr1):1C ; Ring, CID, VDDOK Interrupts enabled */ | 
|  |  | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */ | 
|  | /* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */ | 
|  |  | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D; | 
|  | /* Ext. Reg. 3 (DC Char)           (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x32; | 
|  | /* Ext. Reg. 4 (Cadence)           (xr4):00 */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00; | 
|  | /* Ext. Reg. 5 (Ring timer)        (xr5):22 */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22; | 
|  | /* Ext. Reg. 6 (Power State)       (xr6):00 */ | 
|  | j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00; | 
|  | /* Ext. Reg. 7 (Vdd)               (xr7):40 ; VDD=4.25 V */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		/* 0x40 ??? Should it be 0x00? */ | 
|  | /* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */ | 
|  | /*                                       12,33,5A,C3    ;  770 Hz   */ | 
|  | /*                                       13,3C,5B,32    ;  852 Hz   */ | 
|  | /*                                       1D,1B,5C,CC    ;  941 Hz   */ | 
|  |  | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C; | 
|  | /* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */ | 
|  | /*                                       EC,1D,52,22    ;  1336 Hz   */ | 
|  | /*                                       AA,AC,51,D2    ;  1477 Hz   */ | 
|  | /*                                       9B,3B,51,25    ;  1633 Hz   */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3; | 
|  | } | 
|  |  | 
|  |  | 
|  | static void DAA_Coeff_Australia(IXJ *j) | 
|  | { | 
|  | int i; | 
|  |  | 
|  | j->daa_country = DAA_AUSTRALIA; | 
|  | /*----------------------------------------------- */ | 
|  | /* CAO */ | 
|  | for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) { | 
|  | j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0; | 
|  | } | 
|  |  | 
|  | /* Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA3; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xAA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x28; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xB3; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x82; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xD0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00; | 
|  | /* Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x70; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x96; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x09; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x32; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x6B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xC0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08; | 
|  | /* Bytes for FRX-filter       (08): 07,96,E2,34,32,9B,30,08 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x96; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x32; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x9B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08; | 
|  | /* Bytes for FRR-filter       (07): 0F,9A,E9,2F,22,CC,A0,08 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x9A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xE9; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x22; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCC; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xA0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08; | 
|  | /* Bytes for AX-filter        (0A): CB,45,DD,CA */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0xCB; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x45; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA; | 
|  | /* Bytes for AR-filter        (09): 1B,67,10,D6 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x1B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x67; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6; | 
|  | /* Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAF; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98; | 
|  | /* Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xDB; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x52; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x38; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x01; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x82; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAC; | 
|  | /* Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x4A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x3E; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x2C; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x3B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x24; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x46; | 
|  | /* ;  idle */ | 
|  | /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23; | 
|  | /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5; | 
|  | /* Levelmetering Ringing           (0D):32,45,B5,84   ; 50Hz 20V */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84; | 
|  | /* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99; | 
|  | /* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00; | 
|  | /* ;CR Registers */ | 
|  | /* Config. Reg. 0 (filters)        (cr0):FF */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF; | 
|  | /* Config. Reg. 1 (dialing)        (cr1):05 */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05; | 
|  | /* Config. Reg. 2 (caller ID)      (cr2):04 */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04; | 
|  | /* Config. Reg. 3 (testloops)      (cr3):00        ;  */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00; | 
|  | /* Config. Reg. 4 (analog gain)    (cr4):02 */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02; | 
|  | /* Config. Reg. 5 (Version)        (cr5):02 */ | 
|  | /* Config. Reg. 6 (Reserved)       (cr6):00 */ | 
|  | /* Config. Reg. 7 (Reserved)       (cr7):00 */ | 
|  | /* ;xr Registers */ | 
|  | /* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */ | 
|  |  | 
|  | j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */ | 
|  | /* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */ | 
|  |  | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */ | 
|  | /* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */ | 
|  |  | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D; | 
|  | /* Ext. Reg. 3 (DC Char)           (xr3):2B      ;  */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x2B; | 
|  | /* Ext. Reg. 4 (Cadence)           (xr4):00 */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00; | 
|  | /* Ext. Reg. 5 (Ring timer)        (xr5):22 */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22; | 
|  | /* Ext. Reg. 6 (Power State)       (xr6):00 */ | 
|  | j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00; | 
|  | /* Ext. Reg. 7 (Vdd)               (xr7):40 */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		/* 0x40 ??? Should it be 0x00? */ | 
|  |  | 
|  | /* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;  697 Hz   */ | 
|  | /*                                       12,33,5A,C3    ;  770 Hz   */ | 
|  | /*                                       13,3C,5B,32    ;  852 Hz   */ | 
|  | /*                                       1D,1B,5C,CC    ;  941 Hz   */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C; | 
|  |  | 
|  | /* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */ | 
|  | /*                                       EC,1D,52,22    ;  1336 Hz   */ | 
|  | /*                                       AA,AC,51,D2    ;  1477 Hz   */ | 
|  | /*                                       9B,3B,51,25    ;  1633 Hz   */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3; | 
|  | } | 
|  |  | 
|  | static void DAA_Coeff_Japan(IXJ *j) | 
|  | { | 
|  | int i; | 
|  |  | 
|  | j->daa_country = DAA_JAPAN; | 
|  | /*----------------------------------------------- */ | 
|  | /* CAO */ | 
|  | for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) { | 
|  | j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0; | 
|  | } | 
|  |  | 
|  | /* Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x06; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xBD; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2D; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xBA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xF9; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00; | 
|  | /* Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x6F; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xF7; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0E; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x34; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08; | 
|  | /* Bytes for FRX-filter       (08): 02,8F,68,77,9C,58,F0,08 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x02; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x68; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x77; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x9C; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x58; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xF0; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08; | 
|  | /* Bytes for FRR-filter       (07): 03,8F,38,73,87,EA,20,08 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0x38; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x73; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08; | 
|  | /* Bytes for AX-filter        (0A): 51,C5,DD,CA */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x51; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xC5; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA; | 
|  | /* Bytes for AR-filter        (09): 25,A7,10,D6 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xA7; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6; | 
|  | /* Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAE; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98; | 
|  | /* Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAB; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x99; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x89; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x28; | 
|  | /* Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x25; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x34; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xC5; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x4C; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBA; | 
|  | /* ;  idle */ | 
|  | /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23; | 
|  | /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5; | 
|  | /* Levelmetering Ringing           (0D):AA,35,0F,8E    ; 25Hz 30V ????????? */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; | 
|  | /* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99; | 
|  | /* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00; | 
|  | /* ;CR Registers */ | 
|  | /* Config. Reg. 0 (filters)        (cr0):FF */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF; | 
|  | /* Config. Reg. 1 (dialing)        (cr1):05 */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05; | 
|  | /* Config. Reg. 2 (caller ID)      (cr2):04 */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04; | 
|  | /* Config. Reg. 3 (testloops)      (cr3):00        ;  */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00; | 
|  | /* Config. Reg. 4 (analog gain)    (cr4):02 */ | 
|  | j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02; | 
|  | /* Config. Reg. 5 (Version)        (cr5):02 */ | 
|  | /* Config. Reg. 6 (Reserved)       (cr6):00 */ | 
|  | /* Config. Reg. 7 (Reserved)       (cr7):00 */ | 
|  | /* ;xr Registers */ | 
|  | /* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */ | 
|  |  | 
|  | j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */ | 
|  | /* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */ | 
|  |  | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */ | 
|  | /* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */ | 
|  |  | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D; | 
|  | /* Ext. Reg. 3 (DC Char)           (xr3):22        ;  */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x22; | 
|  | /* Ext. Reg. 4 (Cadence)           (xr4):00 */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00; | 
|  | /* Ext. Reg. 5 (Ring timer)        (xr5):22 */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22; | 
|  | /* Ext. Reg. 6 (Power State)       (xr6):00 */ | 
|  | j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00; | 
|  | /* Ext. Reg. 7 (Vdd)               (xr7):40 */ | 
|  | j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		/* 0x40 ??? Should it be 0x00? */ | 
|  | /* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */ | 
|  | /*                                       12,33,5A,C3    ;  770 Hz   */ | 
|  | /*                                       13,3C,5B,32    ;  852 Hz   */ | 
|  | /*                                       1D,1B,5C,CC    ;  941 Hz   */ | 
|  |  | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C; | 
|  | /* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */ | 
|  | /*                                       EC,1D,52,22    ;  1336 Hz   */ | 
|  | /*                                       AA,AC,51,D2    ;  1477 Hz   */ | 
|  | /*                                       9B,3B,51,25    ;  1633 Hz   */ | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52; | 
|  | j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3; | 
|  | } | 
|  |  | 
|  | static s16 tone_table[][19] = | 
|  | { | 
|  | {			/* f20_50[] 11 */ | 
|  | 32538,		/* A1 = 1.985962 */ | 
|  | -32325,	/* A2 = -0.986511 */ | 
|  | -343,		/* B2 = -0.010493 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 343,		/* B0 = 0.010493 */ | 
|  | 32619,		/* A1 = 1.990906 */ | 
|  | -32520,	/* A2 = -0.992462 */ | 
|  | 19179,		/* B2 = 0.585327 */ | 
|  | -19178,	/* B1 = -1.170593 */ | 
|  | 19179,		/* B0 = 0.585327 */ | 
|  | 32723,		/* A1 = 1.997314 */ | 
|  | -32686,	/* A2 = -0.997528 */ | 
|  | 9973,		/* B2 = 0.304352 */ | 
|  | -9955,		/* B1 = -0.607605 */ | 
|  | 9973,		/* B0 = 0.304352 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f133_200[] 12 */ | 
|  | 32072,		/* A1 = 1.95752 */ | 
|  | -31896,	/* A2 = -0.973419 */ | 
|  | -435,		/* B2 = -0.013294 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 435,		/* B0 = 0.013294 */ | 
|  | 32188,		/* A1 = 1.9646 */ | 
|  | -32400,	/* A2 = -0.98877 */ | 
|  | 15139,		/* B2 = 0.462036 */ | 
|  | -14882,	/* B1 = -0.908356 */ | 
|  | 15139,		/* B0 = 0.462036 */ | 
|  | 32473,		/* A1 = 1.981995 */ | 
|  | -32524,	/* A2 = -0.992584 */ | 
|  | 23200,		/* B2 = 0.708008 */ | 
|  | -23113,	/* B1 = -1.410706 */ | 
|  | 23200,		/* B0 = 0.708008 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f300 13 */ | 
|  | 31769,		/* A1 = -1.939026 */ | 
|  | -32584,	/* A2 = 0.994385 */ | 
|  | -475,		/* B2 = -0.014522 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 475,		/* B0 = 0.014522 */ | 
|  | 31789,		/* A1 = -1.940247 */ | 
|  | -32679,	/* A2 = 0.997284 */ | 
|  | 17280,		/* B2 = 0.527344 */ | 
|  | -16865,	/* B1 = -1.029358 */ | 
|  | 17280,		/* B0 = 0.527344 */ | 
|  | 31841,		/* A1 = -1.943481 */ | 
|  | -32681,	/* A2 = 0.997345 */ | 
|  | 543,		/* B2 = 0.016579 */ | 
|  | -525,		/* B1 = -0.032097 */ | 
|  | 543,		/* B0 = 0.016579 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f300_420[] 14 */ | 
|  | 30750,		/* A1 = 1.876892 */ | 
|  | -31212,	/* A2 = -0.952515 */ | 
|  | -804,		/* B2 = -0.024541 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 804,		/* B0 = 0.024541 */ | 
|  | 30686,		/* A1 = 1.872925 */ | 
|  | -32145,	/* A2 = -0.980988 */ | 
|  | 14747,		/* B2 = 0.450043 */ | 
|  | -13703,	/* B1 = -0.836395 */ | 
|  | 14747,		/* B0 = 0.450043 */ | 
|  | 31651,		/* A1 = 1.931824 */ | 
|  | -32321,	/* A2 = -0.986389 */ | 
|  | 24425,		/* B2 = 0.745422 */ | 
|  | -23914,	/* B1 = -1.459595 */ | 
|  | 24427,		/* B0 = 0.745483 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f330 15 */ | 
|  | 31613,		/* A1 = -1.929565 */ | 
|  | -32646,	/* A2 = 0.996277 */ | 
|  | -185,		/* B2 = -0.005657 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 185,		/* B0 = 0.005657 */ | 
|  | 31620,		/* A1 = -1.929932 */ | 
|  | -32713,	/* A2 = 0.998352 */ | 
|  | 19253,		/* B2 = 0.587585 */ | 
|  | -18566,	/* B1 = -1.133179 */ | 
|  | 19253,		/* B0 = 0.587585 */ | 
|  | 31674,		/* A1 = -1.933228 */ | 
|  | -32715,	/* A2 = 0.998413 */ | 
|  | 2575,		/* B2 = 0.078590 */ | 
|  | -2495,		/* B1 = -0.152283 */ | 
|  | 2575,		/* B0 = 0.078590 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f300_425[] 16 */ | 
|  | 30741,		/* A1 = 1.876282 */ | 
|  | -31475,	/* A2 = -0.960541 */ | 
|  | -703,		/* B2 = -0.021484 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 703,		/* B0 = 0.021484 */ | 
|  | 30688,		/* A1 = 1.873047 */ | 
|  | -32248,	/* A2 = -0.984161 */ | 
|  | 14542,		/* B2 = 0.443787 */ | 
|  | -13523,	/* B1 = -0.825439 */ | 
|  | 14542,		/* B0 = 0.443817 */ | 
|  | 31494,		/* A1 = 1.922302 */ | 
|  | -32366,	/* A2 = -0.987762 */ | 
|  | 21577,		/* B2 = 0.658508 */ | 
|  | -21013,	/* B1 = -1.282532 */ | 
|  | 21577,		/* B0 = 0.658508 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f330_440[] 17 */ | 
|  | 30627,		/* A1 = 1.869324 */ | 
|  | -31338,	/* A2 = -0.95636 */ | 
|  | -843,		/* B2 = -0.025749 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 843,		/* B0 = 0.025749 */ | 
|  | 30550,		/* A1 = 1.864685 */ | 
|  | -32221,	/* A2 = -0.983337 */ | 
|  | 13594,		/* B2 = 0.414886 */ | 
|  | -12589,	/* B1 = -0.768402 */ | 
|  | 13594,		/* B0 = 0.414886 */ | 
|  | 31488,		/* A1 = 1.921936 */ | 
|  | -32358,	/* A2 = -0.987518 */ | 
|  | 24684,		/* B2 = 0.753296 */ | 
|  | -24029,	/* B1 = -1.466614 */ | 
|  | 24684,		/* B0 = 0.753296 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f340 18 */ | 
|  | 31546,		/* A1 = -1.925476 */ | 
|  | -32646,	/* A2 = 0.996277 */ | 
|  | -445,		/* B2 = -0.013588 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 445,		/* B0 = 0.013588 */ | 
|  | 31551,		/* A1 = -1.925781 */ | 
|  | -32713,	/* A2 = 0.998352 */ | 
|  | 23884,		/* B2 = 0.728882 */ | 
|  | -22979,	/* B1 = -1.402527 */ | 
|  | 23884,		/* B0 = 0.728882 */ | 
|  | 31606,		/* A1 = -1.929138 */ | 
|  | -32715,	/* A2 = 0.998413 */ | 
|  | 863,		/* B2 = 0.026367 */ | 
|  | -835,		/* B1 = -0.050985 */ | 
|  | 863,		/* B0 = 0.026367 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f350_400[] 19 */ | 
|  | 31006,		/* A1 = 1.892517 */ | 
|  | -32029,	/* A2 = -0.977448 */ | 
|  | -461,		/* B2 = -0.014096 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 461,		/* B0 = 0.014096 */ | 
|  | 30999,		/* A1 = 1.892029 */ | 
|  | -32487,	/* A2 = -0.991455 */ | 
|  | 11325,		/* B2 = 0.345612 */ | 
|  | -10682,	/* B1 = -0.651978 */ | 
|  | 11325,		/* B0 = 0.345612 */ | 
|  | 31441,		/* A1 = 1.919067 */ | 
|  | -32526,	/* A2 = -0.992615 */ | 
|  | 24324,		/* B2 = 0.74231 */ | 
|  | -23535,	/* B1 = -1.436523 */ | 
|  | 24324,		/* B0 = 0.74231 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f350_440[] */ | 
|  | 30634,		/* A1 = 1.869751 */ | 
|  | -31533,	/* A2 = -0.962341 */ | 
|  | -680,		/* B2 = -0.020782 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 680,		/* B0 = 0.020782 */ | 
|  | 30571,		/* A1 = 1.865906 */ | 
|  | -32277,	/* A2 = -0.985016 */ | 
|  | 12894,		/* B2 = 0.393524 */ | 
|  | -11945,	/* B1 = -0.729065 */ | 
|  | 12894,		/* B0 = 0.393524 */ | 
|  | 31367,		/* A1 = 1.91449 */ | 
|  | -32379,	/* A2 = -0.988129 */ | 
|  | 23820,		/* B2 = 0.726929 */ | 
|  | -23104,	/* B1 = -1.410217 */ | 
|  | 23820,		/* B0 = 0.726929 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f350_450[] */ | 
|  | 30552,		/* A1 = 1.864807 */ | 
|  | -31434,	/* A2 = -0.95929 */ | 
|  | -690,		/* B2 = -0.021066 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 690,		/* B0 = 0.021066 */ | 
|  | 30472,		/* A1 = 1.859924 */ | 
|  | -32248,	/* A2 = -0.984161 */ | 
|  | 13385,		/* B2 = 0.408478 */ | 
|  | -12357,	/* B1 = -0.754242 */ | 
|  | 13385,		/* B0 = 0.408478 */ | 
|  | 31358,		/* A1 = 1.914001 */ | 
|  | -32366,	/* A2 = -0.987732 */ | 
|  | 26488,		/* B2 = 0.80835 */ | 
|  | -25692,	/* B1 = -1.568176 */ | 
|  | 26490,		/* B0 = 0.808411 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f360 */ | 
|  | 31397,		/* A1 = -1.916321 */ | 
|  | -32623,	/* A2 = 0.995605 */ | 
|  | -117,		/* B2 = -0.003598 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 117,		/* B0 = 0.003598 */ | 
|  | 31403,		/* A1 = -1.916687 */ | 
|  | -32700,	/* A2 = 0.997925 */ | 
|  | 3388,		/* B2 = 0.103401 */ | 
|  | -3240,		/* B1 = -0.197784 */ | 
|  | 3388,		/* B0 = 0.103401 */ | 
|  | 31463,		/* A1 = -1.920410 */ | 
|  | -32702,	/* A2 = 0.997986 */ | 
|  | 13346,		/* B2 = 0.407288 */ | 
|  | -12863,	/* B1 = -0.785126 */ | 
|  | 13346,		/* B0 = 0.407288 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f380_420[] */ | 
|  | 30831,		/* A1 = 1.881775 */ | 
|  | -32064,	/* A2 = -0.978546 */ | 
|  | -367,		/* B2 = -0.01122 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 367,		/* B0 = 0.01122 */ | 
|  | 30813,		/* A1 = 1.880737 */ | 
|  | -32456,	/* A2 = -0.990509 */ | 
|  | 11068,		/* B2 = 0.337769 */ | 
|  | -10338,	/* B1 = -0.631042 */ | 
|  | 11068,		/* B0 = 0.337769 */ | 
|  | 31214,		/* A1 = 1.905212 */ | 
|  | -32491,	/* A2 = -0.991577 */ | 
|  | 16374,		/* B2 = 0.499695 */ | 
|  | -15781,	/* B1 = -0.963196 */ | 
|  | 16374,		/* B0 = 0.499695 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f392 */ | 
|  | 31152,		/* A1 = -1.901428 */ | 
|  | -32613,	/* A2 = 0.995300 */ | 
|  | -314,		/* B2 = -0.009605 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 314,		/* B0 = 0.009605 */ | 
|  | 31156,		/* A1 = -1.901672 */ | 
|  | -32694,	/* A2 = 0.997742 */ | 
|  | 28847,		/* B2 = 0.880371 */ | 
|  | -2734,		/* B1 = -0.166901 */ | 
|  | 28847,		/* B0 = 0.880371 */ | 
|  | 31225,		/* A1 = -1.905823 */ | 
|  | -32696,	/* A2 = 0.997803 */ | 
|  | 462,		/* B2 = 0.014108 */ | 
|  | -442,		/* B1 = -0.027019 */ | 
|  | 462,		/* B0 = 0.014108 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f400_425[] */ | 
|  | 30836,		/* A1 = 1.882141 */ | 
|  | -32296,	/* A2 = -0.985596 */ | 
|  | -324,		/* B2 = -0.009903 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 324,		/* B0 = 0.009903 */ | 
|  | 30825,		/* A1 = 1.881409 */ | 
|  | -32570,	/* A2 = -0.993958 */ | 
|  | 16847,		/* B2 = 0.51416 */ | 
|  | -15792,	/* B1 = -0.963898 */ | 
|  | 16847,		/* B0 = 0.51416 */ | 
|  | 31106,		/* A1 = 1.89856 */ | 
|  | -32584,	/* A2 = -0.994415 */ | 
|  | 9579,		/* B2 = 0.292328 */ | 
|  | -9164,		/* B1 = -0.559357 */ | 
|  | 9579,		/* B0 = 0.292328 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f400_440[] */ | 
|  | 30702,		/* A1 = 1.873962 */ | 
|  | -32134,	/* A2 = -0.980682 */ | 
|  | -517,		/* B2 = -0.015793 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 517,		/* B0 = 0.015793 */ | 
|  | 30676,		/* A1 = 1.872375 */ | 
|  | -32520,	/* A2 = -0.992462 */ | 
|  | 8144,		/* B2 = 0.24855 */ | 
|  | -7596,		/* B1 = -0.463684 */ | 
|  | 8144,		/* B0 = 0.24855 */ | 
|  | 31084,		/* A1 = 1.897217 */ | 
|  | -32547,	/* A2 = -0.993256 */ | 
|  | 22713,		/* B2 = 0.693176 */ | 
|  | -21734,	/* B1 = -1.326599 */ | 
|  | 22713,		/* B0 = 0.693176 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f400_450[] */ | 
|  | 30613,		/* A1 = 1.86853 */ | 
|  | -32031,	/* A2 = -0.977509 */ | 
|  | -618,		/* B2 = -0.018866 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 618,		/* B0 = 0.018866 */ | 
|  | 30577,		/* A1 = 1.866272 */ | 
|  | -32491,	/* A2 = -0.991577 */ | 
|  | 9612,		/* B2 = 0.293335 */ | 
|  | -8935,		/* B1 = -0.54541 */ | 
|  | 9612,		/* B0 = 0.293335 */ | 
|  | 31071,		/* A1 = 1.896484 */ | 
|  | -32524,	/* A2 = -0.992584 */ | 
|  | 21596,		/* B2 = 0.659058 */ | 
|  | -20667,	/* B1 = -1.261414 */ | 
|  | 21596,		/* B0 = 0.659058 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f420 */ | 
|  | 30914,		/* A1 = -1.886841 */ | 
|  | -32584,	/* A2 = 0.994385 */ | 
|  | -426,		/* B2 = -0.013020 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 426,		/* B0 = 0.013020 */ | 
|  | 30914,		/* A1 = -1.886841 */ | 
|  | -32679,	/* A2 = 0.997314 */ | 
|  | 17520,		/* B2 = 0.534668 */ | 
|  | -16471,	/* B1 = -1.005310 */ | 
|  | 17520,		/* B0 = 0.534668 */ | 
|  | 31004,		/* A1 = -1.892334 */ | 
|  | -32683,	/* A2 = 0.997406 */ | 
|  | 819,		/* B2 = 0.025023 */ | 
|  | -780,		/* B1 = -0.047619 */ | 
|  | 819,		/* B0 = 0.025023 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | #if 0 | 
|  | {			/* f425 */ | 
|  | 30881,		/* A1 = -1.884827 */ | 
|  | -32603,	/* A2 = 0.994965 */ | 
|  | -496,		/* B2 = -0.015144 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 496,		/* B0 = 0.015144 */ | 
|  | 30880,		/* A1 = -1.884766 */ | 
|  | -32692,	/* A2 = 0.997711 */ | 
|  | 24767,		/* B2 = 0.755859 */ | 
|  | -23290,	/* B1 = -1.421509 */ | 
|  | 24767,		/* B0 = 0.755859 */ | 
|  | 30967,		/* A1 = -1.890076 */ | 
|  | -32694,	/* A2 = 0.997772 */ | 
|  | 728,		/* B2 = 0.022232 */ | 
|  | -691,		/* B1 = -0.042194 */ | 
|  | 728,		/* B0 = 0.022232 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | #else | 
|  | { | 
|  | 30850, | 
|  | -32534, | 
|  | -504, | 
|  | 0, | 
|  | 504, | 
|  | 30831, | 
|  | -32669, | 
|  | 24303, | 
|  | -22080, | 
|  | 24303, | 
|  | 30994, | 
|  | -32673, | 
|  | 1905, | 
|  | -1811, | 
|  | 1905, | 
|  | 5, | 
|  | 129, | 
|  | 17, | 
|  | 0xff5 | 
|  | }, | 
|  | #endif | 
|  | {			/* f425_450[] */ | 
|  | 30646,		/* A1 = 1.870544 */ | 
|  | -32327,	/* A2 = -0.986572 */ | 
|  | -287,		/* B2 = -0.008769 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 287,		/* B0 = 0.008769 */ | 
|  | 30627,		/* A1 = 1.869324 */ | 
|  | -32607,	/* A2 = -0.995087 */ | 
|  | 13269,		/* B2 = 0.404968 */ | 
|  | -12376,	/* B1 = -0.755432 */ | 
|  | 13269,		/* B0 = 0.404968 */ | 
|  | 30924,		/* A1 = 1.887512 */ | 
|  | -32619,	/* A2 = -0.995453 */ | 
|  | 19950,		/* B2 = 0.608826 */ | 
|  | -18940,	/* B1 = -1.156006 */ | 
|  | 19950,		/* B0 = 0.608826 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f425_475[] */ | 
|  | 30396,		/* A1 = 1.855225 */ | 
|  | -32014,	/* A2 = -0.97699 */ | 
|  | -395,		/* B2 = -0.012055 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 395,		/* B0 = 0.012055 */ | 
|  | 30343,		/* A1 = 1.85199 */ | 
|  | -32482,	/* A2 = -0.991302 */ | 
|  | 17823,		/* B2 = 0.543945 */ | 
|  | -16431,	/* B1 = -1.002869 */ | 
|  | 17823,		/* B0 = 0.543945 */ | 
|  | 30872,		/* A1 = 1.884338 */ | 
|  | -32516,	/* A2 = -0.99231 */ | 
|  | 18124,		/* B2 = 0.553101 */ | 
|  | -17246,	/* B1 = -1.052673 */ | 
|  | 18124,		/* B0 = 0.553101 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f435 */ | 
|  | 30796,		/* A1 = -1.879639 */ | 
|  | -32603,	/* A2 = 0.994965 */ | 
|  | -254,		/* B2 = -0.007762 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 254,		/* B0 = 0.007762 */ | 
|  | 30793,		/* A1 = -1.879456 */ | 
|  | -32692,	/* A2 = 0.997711 */ | 
|  | 18934,		/* B2 = 0.577820 */ | 
|  | -17751,	/* B1 = -1.083496 */ | 
|  | 18934,		/* B0 = 0.577820 */ | 
|  | 30882,		/* A1 = -1.884888 */ | 
|  | -32694,	/* A2 = 0.997772 */ | 
|  | 1858,		/* B2 = 0.056713 */ | 
|  | -1758,		/* B1 = -0.107357 */ | 
|  | 1858,		/* B0 = 0.056713 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f440_450[] */ | 
|  | 30641,		/* A1 = 1.870239 */ | 
|  | -32458,	/* A2 = -0.99057 */ | 
|  | -155,		/* B2 = -0.004735 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 155,		/* B0 = 0.004735 */ | 
|  | 30631,		/* A1 = 1.869568 */ | 
|  | -32630,	/* A2 = -0.995789 */ | 
|  | 11453,		/* B2 = 0.349548 */ | 
|  | -10666,	/* B1 = -0.651001 */ | 
|  | 11453,		/* B0 = 0.349548 */ | 
|  | 30810,		/* A1 = 1.880554 */ | 
|  | -32634,	/* A2 = -0.995941 */ | 
|  | 12237,		/* B2 = 0.373474 */ | 
|  | -11588,	/* B1 = -0.707336 */ | 
|  | 12237,		/* B0 = 0.373474 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f440_480[] */ | 
|  | 30367,		/* A1 = 1.853455 */ | 
|  | -32147,	/* A2 = -0.981079 */ | 
|  | -495,		/* B2 = -0.015113 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 495,		/* B0 = 0.015113 */ | 
|  | 30322,		/* A1 = 1.850769 */ | 
|  | -32543,	/* A2 = -0.993134 */ | 
|  | 10031,		/* B2 = 0.306152 */ | 
|  | -9252,		/* B1 = -0.564728 */ | 
|  | 10031,		/* B0 = 0.306152 */ | 
|  | 30770,		/* A1 = 1.878052 */ | 
|  | -32563,	/* A2 = -0.993774 */ | 
|  | 22674,		/* B2 = 0.691956 */ | 
|  | -21465,	/* B1 = -1.31012 */ | 
|  | 22674,		/* B0 = 0.691956 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f445 */ | 
|  | 30709,		/* A1 = -1.874329 */ | 
|  | -32603,	/* A2 = 0.994965 */ | 
|  | -83,		/* B2 = -0.002545 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 83,		/* B0 = 0.002545 */ | 
|  | 30704,		/* A1 = -1.874084 */ | 
|  | -32692,	/* A2 = 0.997711 */ | 
|  | 10641,		/* B2 = 0.324738 */ | 
|  | -9947,		/* B1 = -0.607147 */ | 
|  | 10641,		/* B0 = 0.324738 */ | 
|  | 30796,		/* A1 = -1.879639 */ | 
|  | -32694,	/* A2 = 0.997772 */ | 
|  | 10079,		/* B2 = 0.307587 */ | 
|  | 9513,		/* B1 = 0.580688 */ | 
|  | 10079,		/* B0 = 0.307587 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f450 */ | 
|  | 30664,		/* A1 = -1.871643 */ | 
|  | -32603,	/* A2 = 0.994965 */ | 
|  | -164,		/* B2 = -0.005029 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 164,		/* B0 = 0.005029 */ | 
|  | 30661,		/* A1 = -1.871399 */ | 
|  | -32692,	/* A2 = 0.997711 */ | 
|  | 15294,		/* B2 = 0.466736 */ | 
|  | -14275,	/* B1 = -0.871307 */ | 
|  | 15294,		/* B0 = 0.466736 */ | 
|  | 30751,		/* A1 = -1.876953 */ | 
|  | -32694,	/* A2 = 0.997772 */ | 
|  | 3548,		/* B2 = 0.108284 */ | 
|  | -3344,		/* B1 = -0.204155 */ | 
|  | 3548,		/* B0 = 0.108284 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f452 */ | 
|  | 30653,		/* A1 = -1.870911 */ | 
|  | -32615,	/* A2 = 0.995361 */ | 
|  | -209,		/* B2 = -0.006382 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 209,		/* B0 = 0.006382 */ | 
|  | 30647,		/* A1 = -1.870605 */ | 
|  | -32702,	/* A2 = 0.997986 */ | 
|  | 18971,		/* B2 = 0.578979 */ | 
|  | -17716,	/* B1 = -1.081299 */ | 
|  | 18971,		/* B0 = 0.578979 */ | 
|  | 30738,		/* A1 = -1.876099 */ | 
|  | -32702,	/* A2 = 0.998016 */ | 
|  | 2967,		/* B2 = 0.090561 */ | 
|  | -2793,		/* B1 = -0.170502 */ | 
|  | 2967,		/* B0 = 0.090561 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f475 */ | 
|  | 30437,		/* A1 = -1.857727 */ | 
|  | -32603,	/* A2 = 0.994965 */ | 
|  | -264,		/* B2 = -0.008062 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 264,		/* B0 = 0.008062 */ | 
|  | 30430,		/* A1 = -1.857300 */ | 
|  | -32692,	/* A2 = 0.997711 */ | 
|  | 21681,		/* B2 = 0.661682 */ | 
|  | -20082,	/* B1 = -1.225708 */ | 
|  | 21681,		/* B0 = 0.661682 */ | 
|  | 30526,		/* A1 = -1.863220 */ | 
|  | -32694,	/* A2 = 0.997742 */ | 
|  | 1559,		/* B2 = 0.047600 */ | 
|  | -1459,		/* B1 = -0.089096 */ | 
|  | 1559,		/* B0 = 0.047600 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f480_620[] */ | 
|  | 28975,		/* A1 = 1.768494 */ | 
|  | -30955,	/* A2 = -0.944672 */ | 
|  | -1026,		/* B2 = -0.03133 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 1026,		/* B0 = 0.03133 */ | 
|  | 28613,		/* A1 = 1.746399 */ | 
|  | -32089,	/* A2 = -0.979309 */ | 
|  | 14214,		/* B2 = 0.433807 */ | 
|  | -12202,	/* B1 = -0.744812 */ | 
|  | 14214,		/* B0 = 0.433807 */ | 
|  | 30243,		/* A1 = 1.845947 */ | 
|  | -32238,	/* A2 = -0.983856 */ | 
|  | 24825,		/* B2 = 0.757629 */ | 
|  | -23402,	/* B1 = -1.428345 */ | 
|  | 24825,		/* B0 = 0.757629 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f494 */ | 
|  | 30257,		/* A1 = -1.846741 */ | 
|  | -32605,	/* A2 = 0.995056 */ | 
|  | -249,		/* B2 = -0.007625 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 249,		/* B0 = 0.007625 */ | 
|  | 30247,		/* A1 = -1.846191 */ | 
|  | -32694,	/* A2 = 0.997772 */ | 
|  | 18088,		/* B2 = 0.552002 */ | 
|  | -16652,	/* B1 = -1.016418 */ | 
|  | 18088,		/* B0 = 0.552002 */ | 
|  | 30348,		/* A1 = -1.852295 */ | 
|  | -32696,	/* A2 = 0.997803 */ | 
|  | 2099,		/* B2 = 0.064064 */ | 
|  | -1953,		/* B1 = -0.119202 */ | 
|  | 2099,		/* B0 = 0.064064 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f500 */ | 
|  | 30202,		/* A1 = -1.843431 */ | 
|  | -32624,	/* A2 = 0.995622 */ | 
|  | -413,		/* B2 = -0.012622 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 413,		/* B0 = 0.012622 */ | 
|  | 30191,		/* A1 = -1.842721 */ | 
|  | -32714,	/* A2 = 0.998364 */ | 
|  | 25954,		/* B2 = 0.792057 */ | 
|  | -23890,	/* B1 = -1.458131 */ | 
|  | 25954,		/* B0 = 0.792057 */ | 
|  | 30296,		/* A1 = -1.849172 */ | 
|  | -32715,	/* A2 = 0.998397 */ | 
|  | 2007,		/* B2 = 0.061264 */ | 
|  | -1860,		/* B1 = -0.113568 */ | 
|  | 2007,		/* B0 = 0.061264 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f520 */ | 
|  | 30001,		/* A1 = -1.831116 */ | 
|  | -32613,	/* A2 = 0.995270 */ | 
|  | -155,		/* B2 = -0.004750 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 155,		/* B0 = 0.004750 */ | 
|  | 29985,		/* A1 = -1.830200 */ | 
|  | -32710,	/* A2 = 0.998260 */ | 
|  | 6584,		/* B2 = 0.200928 */ | 
|  | -6018,		/* B1 = -0.367355 */ | 
|  | 6584,		/* B0 = 0.200928 */ | 
|  | 30105,		/* A1 = -1.837524 */ | 
|  | -32712,	/* A2 = 0.998291 */ | 
|  | 23812,		/* B2 = 0.726685 */ | 
|  | -21936,	/* B1 = -1.338928 */ | 
|  | 23812,		/* B0 = 0.726685 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f523 */ | 
|  | 29964,		/* A1 = -1.828918 */ | 
|  | -32601,	/* A2 = 0.994904 */ | 
|  | -101,		/* B2 = -0.003110 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 101,		/* B0 = 0.003110 */ | 
|  | 29949,		/* A1 = -1.827942 */ | 
|  | -32700,	/* A2 = 0.997925 */ | 
|  | 11041,		/* B2 = 0.336975 */ | 
|  | -10075,	/* B1 = -0.614960 */ | 
|  | 11041,		/* B0 = 0.336975 */ | 
|  | 30070,		/* A1 = -1.835388 */ | 
|  | -32702,	/* A2 = 0.997986 */ | 
|  | 16762,		/* B2 = 0.511536 */ | 
|  | -15437,	/* B1 = -0.942230 */ | 
|  | 16762,		/* B0 = 0.511536 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f525 */ | 
|  | 29936,		/* A1 = -1.827209 */ | 
|  | -32584,	/* A2 = 0.994415 */ | 
|  | -91,		/* B2 = -0.002806 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 91,		/* B0 = 0.002806 */ | 
|  | 29921,		/* A1 = -1.826233 */ | 
|  | -32688,	/* A2 = 0.997559 */ | 
|  | 11449,		/* B2 = 0.349396 */ | 
|  | -10426,	/* B1 = -0.636383 */ | 
|  | 11449,		/* B0 = 0.349396 */ | 
|  | 30045,		/* A1 = -1.833862 */ | 
|  | -32688,	/* A2 = 0.997589 */ | 
|  | 13055,		/* B2 = 0.398407 */ | 
|  | -12028,	/* B1 = -0.734161 */ | 
|  | 13055,		/* B0 = 0.398407 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f540_660[] */ | 
|  | 28499,		/* A1 = 1.739441 */ | 
|  | -31129,	/* A2 = -0.949982 */ | 
|  | -849,		/* B2 = -0.025922 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 849,		/* B0 = 0.025922 */ | 
|  | 28128,		/* A1 = 1.716797 */ | 
|  | -32130,	/* A2 = -0.98056 */ | 
|  | 14556,		/* B2 = 0.444214 */ | 
|  | -12251,	/* B1 = -0.747772 */ | 
|  | 14556,		/* B0 = 0.444244 */ | 
|  | 29667,		/* A1 = 1.81073 */ | 
|  | -32244,	/* A2 = -0.984039 */ | 
|  | 23038,		/* B2 = 0.703064 */ | 
|  | -21358,	/* B1 = -1.303589 */ | 
|  | 23040,		/* B0 = 0.703125 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f587 */ | 
|  | 29271,		/* A1 = -1.786560 */ | 
|  | -32599,	/* A2 = 0.994873 */ | 
|  | -490,		/* B2 = -0.014957 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 490,		/* B0 = 0.014957 */ | 
|  | 29246,		/* A1 = -1.785095 */ | 
|  | -32700,	/* A2 = 0.997925 */ | 
|  | 28961,		/* B2 = 0.883850 */ | 
|  | -25796,	/* B1 = -1.574463 */ | 
|  | 28961,		/* B0 = 0.883850 */ | 
|  | 29383,		/* A1 = -1.793396 */ | 
|  | -32700,	/* A2 = 0.997955 */ | 
|  | 1299,		/* B2 = 0.039650 */ | 
|  | -1169,		/* B1 = -0.071396 */ | 
|  | 1299,		/* B0 = 0.039650 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f590 */ | 
|  | 29230,		/* A1 = -1.784058 */ | 
|  | -32584,	/* A2 = 0.994415 */ | 
|  | -418,		/* B2 = -0.012757 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 418,		/* B0 = 0.012757 */ | 
|  | 29206,		/* A1 = -1.782593 */ | 
|  | -32688,	/* A2 = 0.997559 */ | 
|  | 36556,		/* B2 = 1.115601 */ | 
|  | -32478,	/* B1 = -1.982300 */ | 
|  | 36556,		/* B0 = 1.115601 */ | 
|  | 29345,		/* A1 = -1.791077 */ | 
|  | -32688,	/* A2 = 0.997589 */ | 
|  | 897,		/* B2 = 0.027397 */ | 
|  | -808,		/* B1 = -0.049334 */ | 
|  | 897,		/* B0 = 0.027397 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f600 */ | 
|  | 29116,		/* A1 = -1.777100 */ | 
|  | -32603,	/* A2 = 0.994965 */ | 
|  | -165,		/* B2 = -0.005039 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 165,		/* B0 = 0.005039 */ | 
|  | 29089,		/* A1 = -1.775452 */ | 
|  | -32708,	/* A2 = 0.998199 */ | 
|  | 6963,		/* B2 = 0.212494 */ | 
|  | -6172,		/* B1 = -0.376770 */ | 
|  | 6963,		/* B0 = 0.212494 */ | 
|  | 29237,		/* A1 = -1.784485 */ | 
|  | -32710,	/* A2 = 0.998230 */ | 
|  | 24197,		/* B2 = 0.738464 */ | 
|  | -21657,	/* B1 = -1.321899 */ | 
|  | 24197,		/* B0 = 0.738464 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f660 */ | 
|  | 28376,		/* A1 = -1.731934 */ | 
|  | -32567,	/* A2 = 0.993896 */ | 
|  | -363,		/* B2 = -0.011102 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 363,		/* B0 = 0.011102 */ | 
|  | 28337,		/* A1 = -1.729614 */ | 
|  | -32683,	/* A2 = 0.997434 */ | 
|  | 21766,		/* B2 = 0.664246 */ | 
|  | -18761,	/* B1 = -1.145081 */ | 
|  | 21766,		/* B0 = 0.664246 */ | 
|  | 28513,		/* A1 = -1.740356 */ | 
|  | -32686,	/* A2 = 0.997498 */ | 
|  | 2509,		/* B2 = 0.076584 */ | 
|  | -2196,		/* B1 = -0.134041 */ | 
|  | 2509,		/* B0 = 0.076584 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f700 */ | 
|  | 27844,		/* A1 = -1.699463 */ | 
|  | -32563,	/* A2 = 0.993744 */ | 
|  | -366,		/* B2 = -0.011187 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 366,		/* B0 = 0.011187 */ | 
|  | 27797,		/* A1 = -1.696655 */ | 
|  | -32686,	/* A2 = 0.997498 */ | 
|  | 22748,		/* B2 = 0.694214 */ | 
|  | -19235,	/* B1 = -1.174072 */ | 
|  | 22748,		/* B0 = 0.694214 */ | 
|  | 27995,		/* A1 = -1.708740 */ | 
|  | -32688,	/* A2 = 0.997559 */ | 
|  | 2964,		/* B2 = 0.090477 */ | 
|  | -2546,		/* B1 = -0.155449 */ | 
|  | 2964,		/* B0 = 0.090477 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f740 */ | 
|  | 27297,		/* A1 = -1.666077 */ | 
|  | -32551,	/* A2 = 0.993408 */ | 
|  | -345,		/* B2 = -0.010540 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 345,		/* B0 = 0.010540 */ | 
|  | 27240,		/* A1 = -1.662598 */ | 
|  | -32683,	/* A2 = 0.997406 */ | 
|  | 22560,		/* B2 = 0.688477 */ | 
|  | -18688,	/* B1 = -1.140625 */ | 
|  | 22560,		/* B0 = 0.688477 */ | 
|  | 27461,		/* A1 = -1.676147 */ | 
|  | -32684,	/* A2 = 0.997467 */ | 
|  | 3541,		/* B2 = 0.108086 */ | 
|  | -2985,		/* B1 = -0.182220 */ | 
|  | 3541,		/* B0 = 0.108086 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f750 */ | 
|  | 27155,		/* A1 = -1.657410 */ | 
|  | -32551,	/* A2 = 0.993408 */ | 
|  | -462,		/* B2 = -0.014117 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 462,		/* B0 = 0.014117 */ | 
|  | 27097,		/* A1 = -1.653870 */ | 
|  | -32683,	/* A2 = 0.997406 */ | 
|  | 32495,		/* B2 = 0.991699 */ | 
|  | -26776,	/* B1 = -1.634338 */ | 
|  | 32495,		/* B0 = 0.991699 */ | 
|  | 27321,		/* A1 = -1.667542 */ | 
|  | -32684,	/* A2 = 0.997467 */ | 
|  | 1835,		/* B2 = 0.056007 */ | 
|  | -1539,		/* B1 = -0.093948 */ | 
|  | 1835,		/* B0 = 0.056007 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f750_1450[] */ | 
|  | 19298,		/* A1 = 1.177917 */ | 
|  | -24471,	/* A2 = -0.746796 */ | 
|  | -4152,		/* B2 = -0.126709 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 4152,		/* B0 = 0.126709 */ | 
|  | 12902,		/* A1 = 0.787476 */ | 
|  | -29091,	/* A2 = -0.887817 */ | 
|  | 12491,		/* B2 = 0.38121 */ | 
|  | -1794,		/* B1 = -0.109528 */ | 
|  | 12494,		/* B0 = 0.381317 */ | 
|  | 26291,		/* A1 = 1.604736 */ | 
|  | -30470,	/* A2 = -0.929901 */ | 
|  | 28859,		/* B2 = 0.880737 */ | 
|  | -26084,	/* B1 = -1.592102 */ | 
|  | 28861,		/* B0 = 0.880798 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f770 */ | 
|  | 26867,		/* A1 = -1.639832 */ | 
|  | -32551,	/* A2 = 0.993408 */ | 
|  | -123,		/* B2 = -0.003755 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 123,		/* B0 = 0.003755 */ | 
|  | 26805,		/* A1 = -1.636108 */ | 
|  | -32683,	/* A2 = 0.997406 */ | 
|  | 17297,		/* B2 = 0.527863 */ | 
|  | -14096,	/* B1 = -0.860382 */ | 
|  | 17297,		/* B0 = 0.527863 */ | 
|  | 27034,		/* A1 = -1.650085 */ | 
|  | -32684,	/* A2 = 0.997467 */ | 
|  | 12958,		/* B2 = 0.395477 */ | 
|  | -10756,	/* B1 = -0.656525 */ | 
|  | 12958,		/* B0 = 0.395477 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f800 */ | 
|  | 26413,		/* A1 = -1.612122 */ | 
|  | -32547,	/* A2 = 0.993286 */ | 
|  | -223,		/* B2 = -0.006825 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 223,		/* B0 = 0.006825 */ | 
|  | 26342,		/* A1 = -1.607849 */ | 
|  | -32686,	/* A2 = 0.997498 */ | 
|  | 6391,		/* B2 = 0.195053 */ | 
|  | -5120,		/* B1 = -0.312531 */ | 
|  | 6391,		/* B0 = 0.195053 */ | 
|  | 26593,		/* A1 = -1.623108 */ | 
|  | -32688,	/* A2 = 0.997559 */ | 
|  | 23681,		/* B2 = 0.722717 */ | 
|  | -19328,	/* B1 = -1.179688 */ | 
|  | 23681,		/* B0 = 0.722717 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f816 */ | 
|  | 26168,		/* A1 = -1.597209 */ | 
|  | -32528,	/* A2 = 0.992706 */ | 
|  | -235,		/* B2 = -0.007182 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 235,		/* B0 = 0.007182 */ | 
|  | 26092,		/* A1 = -1.592590 */ | 
|  | -32675,	/* A2 = 0.997192 */ | 
|  | 20823,		/* B2 = 0.635498 */ | 
|  | -16510,	/* B1 = -1.007751 */ | 
|  | 20823,		/* B0 = 0.635498 */ | 
|  | 26363,		/* A1 = -1.609070 */ | 
|  | -32677,	/* A2 = 0.997253 */ | 
|  | 6739,		/* B2 = 0.205688 */ | 
|  | -5459,		/* B1 = -0.333206 */ | 
|  | 6739,		/* B0 = 0.205688 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f850 */ | 
|  | 25641,		/* A1 = -1.565063 */ | 
|  | -32536,	/* A2 = 0.992950 */ | 
|  | -121,		/* B2 = -0.003707 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 121,		/* B0 = 0.003707 */ | 
|  | 25560,		/* A1 = -1.560059 */ | 
|  | -32684,	/* A2 = 0.997437 */ | 
|  | 18341,		/* B2 = 0.559753 */ | 
|  | -14252,	/* B1 = -0.869904 */ | 
|  | 18341,		/* B0 = 0.559753 */ | 
|  | 25837,		/* A1 = -1.577026 */ | 
|  | -32684,	/* A2 = 0.997467 */ | 
|  | 16679,		/* B2 = 0.509003 */ | 
|  | -13232,	/* B1 = -0.807648 */ | 
|  | 16679,		/* B0 = 0.509003 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f857_1645[] */ | 
|  | 16415,		/* A1 = 1.001953 */ | 
|  | -23669,	/* A2 = -0.722321 */ | 
|  | -4549,		/* B2 = -0.138847 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 4549,		/* B0 = 0.138847 */ | 
|  | 8456,		/* A1 = 0.516174 */ | 
|  | -28996,	/* A2 = -0.884918 */ | 
|  | 13753,		/* B2 = 0.419724 */ | 
|  | -12,		/* B1 = -0.000763 */ | 
|  | 13757,		/* B0 = 0.419846 */ | 
|  | 24632,		/* A1 = 1.503418 */ | 
|  | -30271,	/* A2 = -0.923828 */ | 
|  | 29070,		/* B2 = 0.887146 */ | 
|  | -25265,	/* B1 = -1.542114 */ | 
|  | 29073,		/* B0 = 0.887268 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f900 */ | 
|  | 24806,		/* A1 = -1.514099 */ | 
|  | -32501,	/* A2 = 0.991852 */ | 
|  | -326,		/* B2 = -0.009969 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 326,		/* B0 = 0.009969 */ | 
|  | 24709,		/* A1 = -1.508118 */ | 
|  | -32659,	/* A2 = 0.996674 */ | 
|  | 20277,		/* B2 = 0.618835 */ | 
|  | -15182,	/* B1 = -0.926636 */ | 
|  | 20277,		/* B0 = 0.618835 */ | 
|  | 25022,		/* A1 = -1.527222 */ | 
|  | -32661,	/* A2 = 0.996735 */ | 
|  | 4320,		/* B2 = 0.131836 */ | 
|  | -3331,		/* B1 = -0.203339 */ | 
|  | 4320,		/* B0 = 0.131836 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f900_1300[] */ | 
|  | 19776,		/* A1 = 1.207092 */ | 
|  | -27437,	/* A2 = -0.837341 */ | 
|  | -2666,		/* B2 = -0.081371 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 2666,		/* B0 = 0.081371 */ | 
|  | 16302,		/* A1 = 0.995026 */ | 
|  | -30354,	/* A2 = -0.926361 */ | 
|  | 10389,		/* B2 = 0.317062 */ | 
|  | -3327,		/* B1 = -0.203064 */ | 
|  | 10389,		/* B0 = 0.317062 */ | 
|  | 24299,		/* A1 = 1.483154 */ | 
|  | -30930,	/* A2 = -0.943909 */ | 
|  | 25016,		/* B2 = 0.763428 */ | 
|  | -21171,	/* B1 = -1.292236 */ | 
|  | 25016,		/* B0 = 0.763428 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f935_1215[] */ | 
|  | 20554,		/* A1 = 1.254517 */ | 
|  | -28764,	/* A2 = -0.877838 */ | 
|  | -2048,		/* B2 = -0.062515 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 2048,		/* B0 = 0.062515 */ | 
|  | 18209,		/* A1 = 1.11145 */ | 
|  | -30951,	/* A2 = -0.94458 */ | 
|  | 9390,		/* B2 = 0.286575 */ | 
|  | -3955,		/* B1 = -0.241455 */ | 
|  | 9390,		/* B0 = 0.286575 */ | 
|  | 23902,		/* A1 = 1.458923 */ | 
|  | -31286,	/* A2 = -0.954803 */ | 
|  | 23252,		/* B2 = 0.709595 */ | 
|  | -19132,	/* B1 = -1.167725 */ | 
|  | 23252,		/* B0 = 0.709595 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f941_1477[] */ | 
|  | 17543,		/* A1 = 1.07074 */ | 
|  | -26220,	/* A2 = -0.800201 */ | 
|  | -3298,		/* B2 = -0.100647 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 3298,		/* B0 = 0.100647 */ | 
|  | 12423,		/* A1 = 0.75827 */ | 
|  | -30036,	/* A2 = -0.916626 */ | 
|  | 12651,		/* B2 = 0.386078 */ | 
|  | -2444,		/* B1 = -0.14917 */ | 
|  | 12653,		/* B0 = 0.386154 */ | 
|  | 23518,		/* A1 = 1.435425 */ | 
|  | -30745,	/* A2 = -0.938293 */ | 
|  | 27282,		/* B2 = 0.832581 */ | 
|  | -22529,	/* B1 = -1.375122 */ | 
|  | 27286,		/* B0 = 0.832703 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f942 */ | 
|  | 24104,		/* A1 = -1.471252 */ | 
|  | -32507,	/* A2 = 0.992065 */ | 
|  | -351,		/* B2 = -0.010722 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 351,		/* B0 = 0.010722 */ | 
|  | 23996,		/* A1 = -1.464600 */ | 
|  | -32671,	/* A2 = 0.997040 */ | 
|  | 22848,		/* B2 = 0.697266 */ | 
|  | -16639,	/* B1 = -1.015564 */ | 
|  | 22848,		/* B0 = 0.697266 */ | 
|  | 24332,		/* A1 = -1.485168 */ | 
|  | -32673,	/* A2 = 0.997101 */ | 
|  | 4906,		/* B2 = 0.149727 */ | 
|  | -3672,		/* B1 = -0.224174 */ | 
|  | 4906,		/* B0 = 0.149727 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f950 */ | 
|  | 23967,		/* A1 = -1.462830 */ | 
|  | -32507,	/* A2 = 0.992065 */ | 
|  | -518,		/* B2 = -0.015821 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 518,		/* B0 = 0.015821 */ | 
|  | 23856,		/* A1 = -1.456055 */ | 
|  | -32671,	/* A2 = 0.997040 */ | 
|  | 26287,		/* B2 = 0.802246 */ | 
|  | -19031,	/* B1 = -1.161560 */ | 
|  | 26287,		/* B0 = 0.802246 */ | 
|  | 24195,		/* A1 = -1.476746 */ | 
|  | -32673,	/* A2 = 0.997101 */ | 
|  | 2890,		/* B2 = 0.088196 */ | 
|  | -2151,		/* B1 = -0.131317 */ | 
|  | 2890,		/* B0 = 0.088196 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f950_1400[] */ | 
|  | 18294,		/* A1 = 1.116638 */ | 
|  | -26962,	/* A2 = -0.822845 */ | 
|  | -2914,		/* B2 = -0.088936 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 2914,		/* B0 = 0.088936 */ | 
|  | 14119,		/* A1 = 0.861786 */ | 
|  | -30227,	/* A2 = -0.922455 */ | 
|  | 11466,		/* B2 = 0.349945 */ | 
|  | -2833,		/* B1 = -0.172943 */ | 
|  | 11466,		/* B0 = 0.349945 */ | 
|  | 23431,		/* A1 = 1.430115 */ | 
|  | -30828,	/* A2 = -0.940796 */ | 
|  | 25331,		/* B2 = 0.773071 */ | 
|  | -20911,	/* B1 = -1.276367 */ | 
|  | 25331,		/* B0 = 0.773071 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f975 */ | 
|  | 23521,		/* A1 = -1.435608 */ | 
|  | -32489,	/* A2 = 0.991516 */ | 
|  | -193,		/* B2 = -0.005915 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 193,		/* B0 = 0.005915 */ | 
|  | 23404,		/* A1 = -1.428467 */ | 
|  | -32655,	/* A2 = 0.996582 */ | 
|  | 17740,		/* B2 = 0.541412 */ | 
|  | -12567,	/* B1 = -0.767029 */ | 
|  | 17740,		/* B0 = 0.541412 */ | 
|  | 23753,		/* A1 = -1.449829 */ | 
|  | -32657,	/* A2 = 0.996613 */ | 
|  | 9090,		/* B2 = 0.277405 */ | 
|  | -6662,		/* B1 = -0.406647 */ | 
|  | 9090,		/* B0 = 0.277405 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f1000 */ | 
|  | 23071,		/* A1 = -1.408203 */ | 
|  | -32489,	/* A2 = 0.991516 */ | 
|  | -293,		/* B2 = -0.008965 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 293,		/* B0 = 0.008965 */ | 
|  | 22951,		/* A1 = -1.400818 */ | 
|  | -32655,	/* A2 = 0.996582 */ | 
|  | 5689,		/* B2 = 0.173645 */ | 
|  | -3951,		/* B1 = -0.241150 */ | 
|  | 5689,		/* B0 = 0.173645 */ | 
|  | 23307,		/* A1 = -1.422607 */ | 
|  | -32657,	/* A2 = 0.996613 */ | 
|  | 18692,		/* B2 = 0.570435 */ | 
|  | -13447,	/* B1 = -0.820770 */ | 
|  | 18692,		/* B0 = 0.570435 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f1020 */ | 
|  | 22701,		/* A1 = -1.385620 */ | 
|  | -32474,	/* A2 = 0.991058 */ | 
|  | -292,		/* B2 = -0.008933 */ | 
|  | 0,		/*163840      , B1 = 10.000000 */ | 
|  | 292,		/* B0 = 0.008933 */ | 
|  | 22564,		/* A1 = -1.377258 */ | 
|  | -32655,	/* A2 = 0.996552 */ | 
|  | 20756,		/* B2 = 0.633423 */ | 
|  | -14176,	/* B1 = -0.865295 */ | 
|  | 20756,		/* B0 = 0.633423 */ | 
|  | 22960,		/* A1 = -1.401428 */ | 
|  | -32657,	/* A2 = 0.996613 */ | 
|  | 6520,		/* B2 = 0.198990 */ | 
|  | -4619,		/* B1 = -0.281937 */ | 
|  | 6520,		/* B0 = 0.198990 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f1050 */ | 
|  | 22142,		/* A1 = -1.351501 */ | 
|  | -32474,	/* A2 = 0.991058 */ | 
|  | -147,		/* B2 = -0.004493 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 147,		/* B0 = 0.004493 */ | 
|  | 22000,		/* A1 = -1.342834 */ | 
|  | -32655,	/* A2 = 0.996552 */ | 
|  | 15379,		/* B2 = 0.469360 */ | 
|  | -10237,	/* B1 = -0.624847 */ | 
|  | 15379,		/* B0 = 0.469360 */ | 
|  | 22406,		/* A1 = -1.367554 */ | 
|  | -32657,	/* A2 = 0.996613 */ | 
|  | 17491,		/* B2 = 0.533783 */ | 
|  | -12096,	/* B1 = -0.738312 */ | 
|  | 17491,		/* B0 = 0.533783 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f1100_1750[] */ | 
|  | 12973,		/* A1 = 0.79184 */ | 
|  | -24916,	/* A2 = -0.760376 */ | 
|  | 6655,		/* B2 = 0.203102 */ | 
|  | 367,		/* B1 = 0.0224 */ | 
|  | 6657,		/* B0 = 0.203171 */ | 
|  | 5915,		/* A1 = 0.361053 */ | 
|  | -29560,	/* A2 = -0.90213 */ | 
|  | -7777,		/* B2 = -0.23735 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 7777,		/* B0 = 0.23735 */ | 
|  | 20510,		/* A1 = 1.251892 */ | 
|  | -30260,	/* A2 = -0.923462 */ | 
|  | 26662,		/* B2 = 0.81366 */ | 
|  | -20573,	/* B1 = -1.255737 */ | 
|  | 26668,		/* B0 = 0.813843 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f1140 */ | 
|  | 20392,		/* A1 = -1.244629 */ | 
|  | -32460,	/* A2 = 0.990601 */ | 
|  | -270,		/* B2 = -0.008240 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 270,		/* B0 = 0.008240 */ | 
|  | 20218,		/* A1 = -1.234009 */ | 
|  | -32655,	/* A2 = 0.996582 */ | 
|  | 21337,		/* B2 = 0.651154 */ | 
|  | -13044,	/* B1 = -0.796143 */ | 
|  | 21337,		/* B0 = 0.651154 */ | 
|  | 20684,		/* A1 = -1.262512 */ | 
|  | -32657,	/* A2 = 0.996643 */ | 
|  | 8572,		/* B2 = 0.261612 */ | 
|  | -5476,		/* B1 = -0.334244 */ | 
|  | 8572,		/* B0 = 0.261612 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f1200 */ | 
|  | 19159,		/* A1 = -1.169373 */ | 
|  | -32456,	/* A2 = 0.990509 */ | 
|  | -335,		/* B2 = -0.010252 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 335,		/* B0 = 0.010252 */ | 
|  | 18966,		/* A1 = -1.157593 */ | 
|  | -32661,	/* A2 = 0.996735 */ | 
|  | 6802,		/* B2 = 0.207588 */ | 
|  | -3900,		/* B1 = -0.238098 */ | 
|  | 6802,		/* B0 = 0.207588 */ | 
|  | 19467,		/* A1 = -1.188232 */ | 
|  | -32661,	/* A2 = 0.996765 */ | 
|  | 25035,		/* B2 = 0.764008 */ | 
|  | -15049,	/* B1 = -0.918579 */ | 
|  | 25035,		/* B0 = 0.764008 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f1209 */ | 
|  | 18976,		/* A1 = -1.158264 */ | 
|  | -32439,	/* A2 = 0.989990 */ | 
|  | -183,		/* B2 = -0.005588 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 183,		/* B0 = 0.005588 */ | 
|  | 18774,		/* A1 = -1.145874 */ | 
|  | -32650,	/* A2 = 0.996429 */ | 
|  | 15468,		/* B2 = 0.472076 */ | 
|  | -8768,		/* B1 = -0.535217 */ | 
|  | 15468,		/* B0 = 0.472076 */ | 
|  | 19300,		/* A1 = -1.177979 */ | 
|  | -32652,	/* A2 = 0.996490 */ | 
|  | 19840,		/* B2 = 0.605499 */ | 
|  | -11842,	/* B1 = -0.722809 */ | 
|  | 19840,		/* B0 = 0.605499 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f1330 */ | 
|  | 16357,		/* A1 = -0.998413 */ | 
|  | -32368,	/* A2 = 0.987793 */ | 
|  | -217,		/* B2 = -0.006652 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 217,		/* B0 = 0.006652 */ | 
|  | 16107,		/* A1 = -0.983126 */ | 
|  | -32601,	/* A2 = 0.994904 */ | 
|  | 11602,		/* B2 = 0.354065 */ | 
|  | -5555,		/* B1 = -0.339111 */ | 
|  | 11602,		/* B0 = 0.354065 */ | 
|  | 16722,		/* A1 = -1.020630 */ | 
|  | -32603,	/* A2 = 0.994965 */ | 
|  | 15574,		/* B2 = 0.475311 */ | 
|  | -8176,		/* B1 = -0.499069 */ | 
|  | 15574,		/* B0 = 0.475311 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f1336 */ | 
|  | 16234,		/* A1 = -0.990875 */ | 
|  | 32404,		/* A2 = -0.988922 */ | 
|  | -193,		/* B2 = -0.005908 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 193,		/* B0 = 0.005908 */ | 
|  | 15986,		/* A1 = -0.975769 */ | 
|  | -32632,	/* A2 = 0.995880 */ | 
|  | 18051,		/* B2 = 0.550903 */ | 
|  | -8658,		/* B1 = -0.528473 */ | 
|  | 18051,		/* B0 = 0.550903 */ | 
|  | 16591,		/* A1 = -1.012695 */ | 
|  | -32634,	/* A2 = 0.995941 */ | 
|  | 15736,		/* B2 = 0.480240 */ | 
|  | -8125,		/* B1 = -0.495926 */ | 
|  | 15736,		/* B0 = 0.480240 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f1366 */ | 
|  | 15564,		/* A1 = -0.949982 */ | 
|  | -32404,	/* A2 = 0.988922 */ | 
|  | -269,		/* B2 = -0.008216 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 269,		/* B0 = 0.008216 */ | 
|  | 15310,		/* A1 = -0.934479 */ | 
|  | -32632,	/* A2 = 0.995880 */ | 
|  | 10815,		/* B2 = 0.330063 */ | 
|  | -4962,		/* B1 = -0.302887 */ | 
|  | 10815,		/* B0 = 0.330063 */ | 
|  | 15924,		/* A1 = -0.971924 */ | 
|  | -32634,	/* A2 = 0.995941 */ | 
|  | 18880,		/* B2 = 0.576172 */ | 
|  | -9364,		/* B1 = -0.571594 */ | 
|  | 18880,		/* B0 = 0.576172 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f1380 */ | 
|  | 15247,		/* A1 = -0.930603 */ | 
|  | -32397,	/* A2 = 0.988708 */ | 
|  | -244,		/* B2 = -0.007451 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 244,		/* B0 = 0.007451 */ | 
|  | 14989,		/* A1 = -0.914886 */ | 
|  | -32627,	/* A2 = 0.995697 */ | 
|  | 18961,		/* B2 = 0.578644 */ | 
|  | -8498,		/* B1 = -0.518707 */ | 
|  | 18961,		/* B0 = 0.578644 */ | 
|  | 15608,		/* A1 = -0.952667 */ | 
|  | -32628,	/* A2 = 0.995758 */ | 
|  | 11145,		/* B2 = 0.340134 */ | 
|  | -5430,		/* B1 = -0.331467 */ | 
|  | 11145,		/* B0 = 0.340134 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f1400 */ | 
|  | 14780,		/* A1 = -0.902130 */ | 
|  | -32393,	/* A2 = 0.988586 */ | 
|  | -396,		/* B2 = -0.012086 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 396,		/* B0 = 0.012086 */ | 
|  | 14510,		/* A1 = -0.885651 */ | 
|  | -32630,	/* A2 = 0.995819 */ | 
|  | 6326,		/* B2 = 0.193069 */ | 
|  | -2747,		/* B1 = -0.167671 */ | 
|  | 6326,		/* B0 = 0.193069 */ | 
|  | 15154,		/* A1 = -0.924957 */ | 
|  | -32632,	/* A2 = 0.995850 */ | 
|  | 23235,		/* B2 = 0.709076 */ | 
|  | -10983,	/* B1 = -0.670380 */ | 
|  | 23235,		/* B0 = 0.709076 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f1477 */ | 
|  | 13005,		/* A1 = -0.793793 */ | 
|  | -32368,	/* A2 = 0.987823 */ | 
|  | -500,		/* B2 = -0.015265 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 500,		/* B0 = 0.015265 */ | 
|  | 12708,		/* A1 = -0.775665 */ | 
|  | -32615,	/* A2 = 0.995331 */ | 
|  | 11420,		/* B2 = 0.348526 */ | 
|  | -4306,		/* B1 = -0.262833 */ | 
|  | 11420,		/* B0 = 0.348526 */ | 
|  | 13397,		/* A1 = -0.817688 */ | 
|  | -32615,	/* A2 = 0.995361 */ | 
|  | 9454,		/* B2 = 0.288528 */ | 
|  | -3981,		/* B1 = -0.243027 */ | 
|  | 9454,		/* B0 = 0.288528 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f1600 */ | 
|  | 10046,		/* A1 = -0.613190 */ | 
|  | -32331,	/* A2 = 0.986694 */ | 
|  | -455,		/* B2 = -0.013915 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 455,		/* B0 = 0.013915 */ | 
|  | 9694,		/* A1 = -0.591705 */ | 
|  | -32601,	/* A2 = 0.994934 */ | 
|  | 6023,		/* B2 = 0.183815 */ | 
|  | -1708,		/* B1 = -0.104279 */ | 
|  | 6023,		/* B0 = 0.183815 */ | 
|  | 10478,		/* A1 = -0.639587 */ | 
|  | -32603,	/* A2 = 0.994965 */ | 
|  | 22031,		/* B2 = 0.672333 */ | 
|  | -7342,		/* B1 = -0.448151 */ | 
|  | 22031,		/* B0 = 0.672333 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f1633_1638[] */ | 
|  | 9181,		/* A1 = 0.560394 */ | 
|  | -32256,	/* A2 = -0.984375 */ | 
|  | -556,		/* B2 = -0.016975 */ | 
|  | 0,		/* B1 = 0 */ | 
|  | 556,		/* B0 = 0.016975 */ | 
|  | 8757,		/* A1 = 0.534515 */ | 
|  | -32574,	/* A2 = -0.99408 */ | 
|  | 8443,		/* B2 = 0.25769 */ | 
|  | -2135,		/* B1 = -0.130341 */ | 
|  | 8443,		/* B0 = 0.25769 */ | 
|  | 9691,		/* A1 = 0.591522 */ | 
|  | -32574,	/* A2 = -0.99411 */ | 
|  | 15446,		/* B2 = 0.471375 */ | 
|  | -4809,		/* B1 = -0.293579 */ | 
|  | 15446,		/* B0 = 0.471375 */ | 
|  | 7,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f1800 */ | 
|  | 5076,		/* A1 = -0.309875 */ | 
|  | -32304,	/* A2 = 0.985840 */ | 
|  | -508,		/* B2 = -0.015503 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 508,		/* B0 = 0.015503 */ | 
|  | 4646,		/* A1 = -0.283600 */ | 
|  | -32605,	/* A2 = 0.995026 */ | 
|  | 6742,		/* B2 = 0.205780 */ | 
|  | -878,		/* B1 = -0.053635 */ | 
|  | 6742,		/* B0 = 0.205780 */ | 
|  | 5552,		/* A1 = -0.338928 */ | 
|  | -32605,	/* A2 = 0.995056 */ | 
|  | 23667,		/* B2 = 0.722260 */ | 
|  | -4297,		/* B1 = -0.262329 */ | 
|  | 23667,		/* B0 = 0.722260 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | {			/* f1860 */ | 
|  | 3569,		/* A1 = -0.217865 */ | 
|  | -32292,	/* A2 = 0.985504 */ | 
|  | -239,		/* B2 = -0.007322 */ | 
|  | 0,		/* B1 = 0.000000 */ | 
|  | 239,		/* B0 = 0.007322 */ | 
|  | 3117,		/* A1 = -0.190277 */ | 
|  | -32603,	/* A2 = 0.994965 */ | 
|  | 18658,		/* B2 = 0.569427 */ | 
|  | -1557,		/* B1 = -0.095032 */ | 
|  | 18658,		/* B0 = 0.569427 */ | 
|  | 4054,		/* A1 = -0.247437 */ | 
|  | -32603,	/* A2 = 0.994965 */ | 
|  | 18886,		/* B2 = 0.576385 */ | 
|  | -2566,		/* B1 = -0.156647 */ | 
|  | 18886,		/* B0 = 0.576385 */ | 
|  | 5,		/* Internal filter scaling */ | 
|  | 159,		/* Minimum in-band energy threshold */ | 
|  | 21,		/* 21/32 in-band to broad-band ratio */ | 
|  | 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ | 
|  | }, | 
|  | }; | 
|  | static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf) | 
|  | { | 
|  | unsigned short cmd; | 
|  | int cnt, max; | 
|  |  | 
|  | if (jf->filter > 3) { | 
|  | return -1; | 
|  | } | 
|  | if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))	/* Select Filter */ | 
|  |  | 
|  | return -1; | 
|  | if (!jf->enable) { | 
|  | if (ixj_WriteDSPCommand(0x5152, j))		/* Disable Filter */ | 
|  |  | 
|  | return -1; | 
|  | else | 
|  | return 0; | 
|  | } else { | 
|  | if (ixj_WriteDSPCommand(0x5153, j))		/* Enable Filter */ | 
|  |  | 
|  | return -1; | 
|  | /* Select the filter (f0 - f3) to use. */ | 
|  | if (ixj_WriteDSPCommand(0x5154 + jf->filter, j)) | 
|  | return -1; | 
|  | } | 
|  | if (jf->freq < 12 && jf->freq > 3) { | 
|  | /* Select the frequency for the selected filter. */ | 
|  | if (ixj_WriteDSPCommand(0x5170 + jf->freq, j)) | 
|  | return -1; | 
|  | } else if (jf->freq > 11) { | 
|  | /* We need to load a programmable filter set for undefined */ | 
|  | /* frequencies.  So we will point the filter to a programmable set. */ | 
|  | /* Since there are only 4 filters and 4 programmable sets, we will */ | 
|  | /* just point the filter to the same number set and program it for the */ | 
|  | /* frequency we want. */ | 
|  | if (ixj_WriteDSPCommand(0x5170 + jf->filter, j)) | 
|  | return -1; | 
|  | if (j->ver.low != 0x12) { | 
|  | cmd = 0x515B; | 
|  | max = 19; | 
|  | } else { | 
|  | cmd = 0x515E; | 
|  | max = 15; | 
|  | } | 
|  | if (ixj_WriteDSPCommand(cmd, j)) | 
|  | return -1; | 
|  | for (cnt = 0; cnt < max; cnt++) { | 
|  | if (ixj_WriteDSPCommand(tone_table[jf->freq - 12][cnt], j)) | 
|  | return -1; | 
|  | } | 
|  | } | 
|  | j->filter_en[jf->filter] = jf->enable; | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr) | 
|  | { | 
|  | unsigned short cmd; | 
|  | int cnt, max; | 
|  | if (jfr->filter > 3) { | 
|  | return -1; | 
|  | } | 
|  | if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))	/* Select Filter */ | 
|  | return -1; | 
|  |  | 
|  | if (!jfr->enable) { | 
|  | if (ixj_WriteDSPCommand(0x5152, j))		/* Disable Filter */ | 
|  | return -1; | 
|  | else | 
|  | return 0; | 
|  | } else { | 
|  | if (ixj_WriteDSPCommand(0x5153, j))		/* Enable Filter */ | 
|  | return -1; | 
|  | /* Select the filter (f0 - f3) to use. */ | 
|  | if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j)) | 
|  | return -1; | 
|  | } | 
|  | /* We need to load a programmable filter set for undefined */ | 
|  | /* frequencies.  So we will point the filter to a programmable set. */ | 
|  | /* Since there are only 4 filters and 4 programmable sets, we will */ | 
|  | /* just point the filter to the same number set and program it for the */ | 
|  | /* frequency we want. */ | 
|  | if (ixj_WriteDSPCommand(0x5170 + jfr->filter, j)) | 
|  | return -1; | 
|  | if (j->ver.low != 0x12) { | 
|  | cmd = 0x515B; | 
|  | max = 19; | 
|  | } else { | 
|  | cmd = 0x515E; | 
|  | max = 15; | 
|  | } | 
|  | if (ixj_WriteDSPCommand(cmd, j)) | 
|  | return -1; | 
|  | for (cnt = 0; cnt < max; cnt++) { | 
|  | if (ixj_WriteDSPCommand(jfr->coeff[cnt], j)) | 
|  | return -1; | 
|  | } | 
|  | j->filter_en[jfr->filter] = jfr->enable; | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static int ixj_init_tone(IXJ *j, IXJ_TONE * ti) | 
|  | { | 
|  | int freq0, freq1; | 
|  | unsigned short data; | 
|  | if (ti->freq0) { | 
|  | freq0 = ti->freq0; | 
|  | } else { | 
|  | freq0 = 0x7FFF; | 
|  | } | 
|  |  | 
|  | if (ti->freq1) { | 
|  | freq1 = ti->freq1; | 
|  | } else { | 
|  | freq1 = 0x7FFF; | 
|  | } | 
|  |  | 
|  | if(ti->tone_index > 12 && ti->tone_index < 28) | 
|  | { | 
|  | if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, j)) | 
|  | return -1; | 
|  | if (ixj_WriteDSPCommand(0x6000 + (ti->gain1 << 4) + ti->gain0, j)) | 
|  | return -1; | 
|  | data = freq0; | 
|  | if (ixj_WriteDSPCommand(data, j)) | 
|  | return -1; | 
|  | data = freq1; | 
|  | if (ixj_WriteDSPCommand(data, j)) | 
|  | return -1; | 
|  | } | 
|  | return freq0; | 
|  | } | 
|  |  |