patch-2.4.10 linux/drivers/telephony/ixj.c

Next file: linux/drivers/telephony/ixj.h
Previous file: linux/drivers/telephony/ixj-ver.h
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.9/linux/drivers/telephony/ixj.c linux/drivers/telephony/ixj.c
@@ -1,10 +1,12 @@
 /****************************************************************************
  *    ixj.c
  *
- *    Device Driver for the Internet PhoneJACK and
- *    Internet LineJACK Telephony Cards.
+ * 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-2000  Quicknet Technologies, Inc.
+ *    (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
@@ -18,17 +20,17 @@
  *                  John Sellers, <jsellers@quicknet.net>
  *                  Mike Preston, <mpreston@quicknet.net>
  *    
- * Fixes:
- *                  Marc Boucher, <marc@mbsi.ca>
- *		    David Huggins-Daines <dhd@cepstral.com>
- * 
+ * Fixes:           David Huggins-Daines, <dhd@cepstral.com>
+ *                  Fabio Ferrari, <fabio.ferrari@digitro.com.br>
+ *                  Artis Kugevics, <artis@mt.lv>
+ *
  * 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.
+ * 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
@@ -38,14 +40,215 @@
  *
  ***************************************************************************/
 
-static char ixj_c_rcsid[] = "$Id: ixj.c,v 3.31 2000/04/14 19:24:47 jaugenst Exp $";
-static char ixj_c_revision[] = "$Revision: 3.31 $";
+static char ixj_c_rcsid[] = "$Id: ixj.c,v 4.7 2001/08/13 06:19:33 craigs Exp $";
+static char ixj_c_revision[] = "$Revision: 4.7 $";
 
-//#define PERFMON_STATS
+/*
+ * $Log: ixj.c,v $
+ * 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/config.h>
 #include <linux/module.h>
 
 #include <linux/init.h>
@@ -68,34 +271,128 @@
 #include <asm/segment.h>
 #include <asm/uaccess.h>
 
-#if defined(CONFIG_PCMCIA) || defined(CONFIG_PCMCIA_MODULE)
-#include <pcmcia/version.h>
-#include <pcmcia/cs_types.h>
-#include <pcmcia/cs.h>
-#include <pcmcia/cistpl.h>
-#include <pcmcia/ds.h>
-#endif
-
-#ifdef CONFIG_ISAPNP
 #include <linux/isapnp.h>
-#endif
 
 #include "ixj.h"
 
 #define TYPE(dev) (MINOR(dev) >> 4)
 #define NUM(dev) (MINOR(dev) & 0xf)
 
-static int ixjdebug = 0;
+static int ixjdebug;
 static int hertz = HZ;
 static int samplerate = 100;
 
 MODULE_PARM(ixjdebug, "i");
 
-static IXJ* ixj[IXJMAX];
+/************************************************************************
+*
+* 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 struct timer_list ixj_timer;
+static IXJ *ixj[IXJMAX];
+#define	get_ixj(b)	ixj[(b)]
 
-int ixj_convert_loaded = 0;
+/*
+ *	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)
+{
+	if(j->fskdata != NULL) {
+		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
+#deifne ixj_perfmon(x)	do {} while(0);
+#endif
+
+static int ixj_convert_loaded;
+
+static int ixj_WriteDSPCommand(unsigned short, IXJ *j);
 
 /************************************************************************
 *
@@ -104,7 +401,7 @@
 *
 ************************************************************************/
 
-static int Stub(IXJ * j, unsigned long arg)
+static int Stub(IXJ * J, unsigned long arg)
 {
 	return 0;
 }
@@ -120,8 +417,8 @@
 
 static void ixj_read_frame(IXJ *j);
 static void ixj_write_frame(IXJ *j);
-static void ixj_init_timer(void);
-static void ixj_add_timer(void);
+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);
@@ -132,12 +429,15 @@
 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);
@@ -147,6 +447,7 @@
 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);
@@ -158,22 +459,24 @@
 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 * cp);
 static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE * cp);
-// Serial Control Interface funtions
+/* 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 void set_play_depth(IXJ *j, int depth);
+static int ixj_mixer(long val, IXJ *j);
 
 /************************************************************************
 CT8020/CT8021 Host Programmers Model
@@ -186,58 +489,95 @@
 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 Receive (Read) Data Buffer Access Port (buffer input)	Read Only
+E-F Host Recieve (Read) Data Buffer Access Port (buffer input)	Read Only
 ************************************************************************/
 
-extern __inline__ void ixj_read_HSR(IXJ *j)
+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);
 }
 
-extern __inline__ int IsControlReady(IXJ *j)
+static inline int IsControlReady(IXJ *j)
 {
 	ixj_read_HSR(j);
 	return j->hsr.bits.controlrdy ? 1 : 0;
 }
 
-extern __inline__ int IsPCControlReady(IXJ *j)
+static inline int IsPCControlReady(IXJ *j)
 {
 	j->pccr1.byte = inb_p(j->XILINXbase + 3);
 	return j->pccr1.bits.crr ? 1 : 0;
 }
 
-extern __inline__ int IsStatusReady(IXJ *j)
+static inline int IsStatusReady(IXJ *j)
 {
 	ixj_read_HSR(j);
 	return j->hsr.bits.statusrdy ? 1 : 0;
 }
 
-extern __inline__ int IsRxReady(IXJ *j)
+static inline int IsRxReady(IXJ *j)
 {
 	ixj_read_HSR(j);
-#ifdef PERFMON_STATS
-	++j->rxreadycheck;
-#endif
+	ixj_perfmon(j->rxreadycheck);
 	return j->hsr.bits.rxrdy ? 1 : 0;
 }
 
-extern __inline__ int IsTxReady(IXJ *j)
+static inline int IsTxReady(IXJ *j)
 {
 	ixj_read_HSR(j);
-#ifdef PERFMON_STATS
-	++j->txreadycheck;
-#endif
+	ixj_perfmon(j->txreadycheck);
 	return j->hsr.bits.txrdy ? 1 : 0;
 }
 
-extern __inline__ void set_play_volume(IXJ *j, int volume)
+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);
 }
 
-extern __inline__ void set_play_depth(IXJ *j, int depth)
+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;
@@ -246,13 +586,48 @@
 	ixj_WriteDSPCommand(0x5280 + depth, j);
 }
 
-extern __inline__ int get_play_volume(IXJ *j)
+static inline int get_play_volume(IXJ *j)
 {
 	ixj_WriteDSPCommand(0xCF00, j);
 	return j->ssr.high << 8 | j->ssr.low;
 }
 
-extern __inline__ BYTE SLIC_GetState(IXJ *j)
+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;
@@ -295,7 +670,7 @@
 					fRetVal = TRUE;
 				}
 				break;
-			case PLD_SLIC_STATE_OHT:	// On-hook transmit
+			case PLD_SLIC_STATE_OHT:	/* On-hook transmit */
 
 			case PLD_SLIC_STATE_STANDBY:
 			case PLD_SLIC_STATE_ACTIVE:
@@ -307,9 +682,9 @@
 				j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
 				fRetVal = TRUE;
 				break;
-			case PLD_SLIC_STATE_APR:	// Active polarity reversal
+			case PLD_SLIC_STATE_APR:	/* Active polarity reversal */
 
-			case PLD_SLIC_STATE_OHTPR:	// OHT polarity reversal
+			case PLD_SLIC_STATE_OHTPR:	/* OHT polarity reversal */
 
 			default:
 				fRetVal = FALSE;
@@ -321,7 +696,7 @@
 			ixj_PCcontrol_wait(j);
 		}
 	} else {
-		// Set the C1, C2, C3 & B2EN signals.
+		/* Set the C1, C2, C3 & B2EN signals. */
 		switch (byState) {
 		case PLD_SLIC_STATE_OC:
 			j->pld_slicw.bits.c1 = 0;
@@ -347,7 +722,7 @@
 			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
 			fRetVal = TRUE;
 			break;
-		case PLD_SLIC_STATE_OHT:	// On-hook transmit
+		case PLD_SLIC_STATE_OHT:	/* On-hook transmit */
 
 			j->pld_slicw.bits.c1 = 1;
 			j->pld_slicw.bits.c2 = 1;
@@ -372,7 +747,7 @@
 			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
 			fRetVal = TRUE;
 			break;
-		case PLD_SLIC_STATE_APR:	// Active polarity reversal
+		case PLD_SLIC_STATE_APR:	/* Active polarity reversal */
 
 			j->pld_slicw.bits.c1 = 0;
 			j->pld_slicw.bits.c2 = 1;
@@ -381,7 +756,7 @@
 			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
 			fRetVal = TRUE;
 			break;
-		case PLD_SLIC_STATE_OHTPR:	// OHT polarity reversal
+		case PLD_SLIC_STATE_OHTPR:	/* OHT polarity reversal */
 
 			j->pld_slicw.bits.c1 = 1;
 			j->pld_slicw.bits.c2 = 1;
@@ -399,22 +774,52 @@
 	return fRetVal;
 }
 
-int ixj_register(int index, IXJ_REGFUNC regfunc)
+static int ixj_wink(IXJ *j)
+{
+	BYTE slicnow;
+
+	slicnow = SLIC_GetState(j);
+
+	j->pots_winkstart = jiffies;
+	SLIC_SetState(PLD_SLIC_STATE_OC, j);
+
+	while (time_before(jiffies, j->pots_winkstart + j->winktime)) {
+		set_current_state(TASK_INTERRUPTIBLE);
+		schedule_timeout(1);
+	}
+
+	SLIC_SetState(slicnow, j);
+	return 0;
+}
+
+static int ixj_register(int index, IXJ_REGFUNC regfunc)
 {
 	int cnt;
 	int retval = 0;
 	switch (index) {
 	case G729LOADER:
 		ixj_DownloadG729 = regfunc;
-		for (cnt = 0; cnt < IXJMAX; cnt++)
-			if (ixj[cnt] != NULL)
-				ixj_DownloadG729(ixj[cnt], 0L);
+		for (cnt = 0; cnt < IXJMAX; cnt++) {
+			IXJ *j = get_ixj(cnt);
+			while(test_and_set_bit(cnt, (void *)&j->busyflags) != 0) {
+				set_current_state(TASK_INTERRUPTIBLE);
+				schedule_timeout(1);
+			}
+			ixj_DownloadG729(j, 0L);
+			clear_bit(cnt, &j->busyflags);
+		}
 		break;
 	case TS85LOADER:
 		ixj_DownloadTS85 = regfunc;
-		for (cnt = 0; cnt < IXJMAX; cnt++)
-			if (ixj[cnt] != NULL)
-				ixj_DownloadTS85(ixj[cnt], 0L);
+		for (cnt = 0; cnt < IXJMAX; cnt++) {
+			IXJ *j = get_ixj(cnt);
+			while(test_and_set_bit(cnt, (void *)&j->busyflags) != 0) {
+				set_current_state(TASK_INTERRUPTIBLE);
+				schedule_timeout(1);
+			}
+			ixj_DownloadTS85(j, 0L);
+			clear_bit(cnt, &j->busyflags);
+		}
 		break;
 	case PRE_READ:
 		ixj_PreRead = regfunc;
@@ -440,7 +845,9 @@
 	return retval;
 }
 
-int ixj_unregister(int index)
+EXPORT_SYMBOL(ixj_register);
+
+static int ixj_unregister(int index)
 {
 	int retval = 0;
 	switch (index) {
@@ -474,17 +881,19 @@
 	return retval;
 }
 
-static void ixj_init_timer(void)
+EXPORT_SYMBOL(ixj_unregister);
+
+static void ixj_init_timer(IXJ *j)
 {
-	init_timer(&ixj_timer);
-	ixj_timer.function = ixj_timeout;
-	ixj_timer.data = (int) NULL;
+	init_timer(&j->timer);
+	j->timer.function = ixj_timeout;
+	j->timer.data = (unsigned long)j;
 }
 
-static void ixj_add_timer(void)
+static void ixj_add_timer(IXJ *j)
 {
-	ixj_timer.expires = jiffies + (hertz / samplerate);
-	add_timer(&ixj_timer);
+	j->timer.expires = jiffies + (hertz / samplerate);
+	add_timer(&j->timer);
 }
 
 static void ixj_tone_timeout(IXJ *j)
@@ -537,268 +946,573 @@
 	}
 }
 
-extern __inline__ void ixj_kill_fasync(IXJ *j, int band)
+static inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir)
 {
-	kill_fasync(&j->async_queue, SIGIO, band);
+	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_timeout(unsigned long ptr)
+static void ixj_pstn_state(IXJ *j)
 {
-	int board;
-	unsigned long jifon;
+	int var;
+	union XOPXR0 XR0, daaint;
 
-	for (board = 0; board < IXJMAX; board++) {
-		IXJ *j = ixj[board];
+	var = 10;
 
-		if (j == NULL)
-			continue;
+	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;
 
-		if (j->DSPbase) {
-#ifdef PERFMON_STATS
-			j->timerchecks++;
-#endif
-			if (j->tone_state) {
-				if (!ixj_hookstate(j)) {
-					ixj_cpt_stop(j);
-					if (j->m_hook) {
-						j->m_hook = 0;
-						j->ex.bits.hookstate = 1;
-						ixj_kill_fasync(j, POLL_PRI);
+	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);
 					}
-					continue;
 				}
-				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) {
-							continue;
+			}
+			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 {
-						ixj_play_tone(j, 0);
-						if (j->dsp.low == 0x20) {
-							continue;
+					} 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 {
-					ixj_tone_timeout(j);
-					if (j->flags.dialtone) {
-						ixj_dialtone(j);
-					}
-					if (j->flags.busytone) {
-						ixj_busytone(j);
-						if (j->dsp.low == 0x20) {
-							continue;
+					} 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;
 					}
-					if (j->flags.ringback) {
-						ixj_ringback(j);
-						if (j->dsp.low == 0x20) {
-							continue;
+				} 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 (!j->tone_state) {
-						if (j->dsp.low == 0x20 || (j->play_mode == -1 && j->rec_mode == -1))
-							idle(j);
-						if (j->dsp.low == 0x20 && j->play_mode != -1)
-							ixj_play_start(j);
-						if (j->dsp.low == 0x20 && j->rec_mode != -1)
-							ixj_record_start(j);
+				}
+				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->tone_state && j->dsp.low == 0x20)) {
-				if (IsRxReady(j)) {
-					ixj_read_frame(j);
+			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);
 				}
-				if (IsTxReady(j) && !j->flags.cidplay) {
-					ixj_write_frame(j);
+				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;
 			}
-			if (j->flags.cringing) {
-				if (ixj_hookstate(j) & 1) {
-					j->flags.cringing = 0;
-					ixj_ring_off(j);
+			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 (jiffies - j->ring_cadence_jif >= (hertz/2)) {
-						if (j->flags.cidring && !j->flags.cidsent) {
-							j->flags.cidsent = 1;
-							ixj_write_cid(j);
-							j->flags.cidring = 0;
+					if (j->pstn_winkstart) {
+						if(ixjdebug & 0x0008) {
+							printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies);
 						}
-						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) {
-						ixj_ring_on(j);
-					} else {
-						ixj_ring_off(j);
-						j->flags.cidring = 1;
+						j->pstn_winkstart = 0;
 					}
-					continue;
 				}
 			}
-			if (!j->flags.ringing) {
-				if (ixj_hookstate(j)) {
-					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->m_hook = j->ex.bits.hookstate = 1;
-						ixj_kill_fasync(j, POLL_PRI);
+			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 {
-					if (j->dsp.low != 0x20 &&
-					    SLIC_GetState(j) == PLD_SLIC_STATE_ACTIVE)
-						// Internet LineJACK
-					{
-						SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
+					ixj_play_tone(j, 0);
+					if (j->dsp.low == 0x20) {
+						clear_bit(board, &j->busyflags);
+						ixj_add_timer(j);
+						return;
 					}
-					if (j->ex.bits.dtmf_ready) {
-						j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0;
+				}
+			} 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->m_hook) {
-						j->m_hook = 0;
-						j->ex.bits.hookstate = 1;
-						ixj_kill_fasync(j, POLL_PRI);
+				}
+				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->cardtype == 300 && !j->flags.incheck) {
-				if (j->flags.pstn_present) {
-					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 (!j->flags.pstn_ringing) {
-								j->flags.pstn_ringing = 1;
-								if (j->daa_mode != SOP_PU_RINGING)
-									daa_set_mode(j, SOP_PU_RINGING);
+		}
+		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);
 						}
-						if (time_after(jiffies, j->pstn_sleeptil) && j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
-							j->pstn_winkstart = 0;
-							j->pstn_ring_stop = 0;
-							j->pld_scrw.bits.led1 = 1;
-							if (j->flags.pstn_ringing && !j->pstn_envelope) {
-								if (j->daa_mode != SOP_PU_RINGING) {
-									j->flags.pstn_ringing = 0;
-								} else {
-									j->pld_scrw.bits.led2 = 0;
-									j->pstn_envelope = 1;
-									j->pstn_ring_start = jiffies;
-									j->pstn_ring_stop = 0;
-								}
-								j->ex.bits.pstn_ring = 0;
+						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);
 							}
-							outb_p(j->pld_scrw.byte, j->XILINXbase);
-						} else {
-							j->pld_scrw.bits.led1 = 0;
-							j->pld_scrw.bits.led2 = 1;
-							outb_p(j->pld_scrw.byte, j->XILINXbase);
-							if (j->flags.pstn_ringing && j->pstn_envelope) {
-								if(!j->pstn_ring_stop) {
-									j->pstn_ring_stop = jiffies;
-								} else if (time_after(jiffies, j->pstn_ring_stop + ((hertz * 5) / 100))){
-									j->pstn_ring_stop = 0;
-									j->ex.bits.pstn_ring = 1;
-									j->pstn_envelope = 0;
-								}
-							} else if (j->daa_mode == SOP_PU_CONVERSATION) {
-								if (!j->pstn_winkstart) {
-									j->pstn_winkstart = jiffies;
-								} else if (time_after(jiffies, j->pstn_winkstart + (hertz * j->winktime / 1000))) {
-									daa_set_mode(j, SOP_PU_SLEEP);
-									j->pstn_winkstart = 0;
-									j->ex.bits.pstn_wink = 1;
-								}
+							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->ex.bits.pstn_ring = 0;
+								j->cadence_f[5].state = 7;
 							}
 						}
-						if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) {
-							if (j->daa_mode == SOP_PU_RINGING) {
-								daa_set_mode(j, SOP_PU_SLEEP);
-								j->flags.pstn_ringing = 0;
-								j->ex.bits.pstn_ring = 0;
+						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);
 							}
-						}
-						if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) {
-							if (j->daa_mode == SOP_PU_RINGING && j->flags.pstn_ringing) {
-								j->pstn_cid_intr = 1;
-								j->pstn_cid_received = 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;
 							}
 						}
-					} else {
-						if (j->pld_scrr.bits.daaflag) {
-							daa_int_read(j);
+						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;
+							}
 						}
-						j->ex.bits.pstn_ring = 0;
-						if (j->pstn_cid_intr && jiffies > j->pstn_cid_received + (hertz * 3)) {
-							if (j->daa_mode == SOP_PU_RINGING) {
-								ixj_daa_cid_read(j);
-								j->ex.bits.caller_id = 1;
+						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;
 							}
-							j->pstn_cid_intr = 0;
-						} else {
-							j->ex.bits.caller_id = 0;
 						}
-						if (!j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
-							j->pld_scrw.bits.led1 = 0;
-							j->pld_scrw.bits.led2 = 1;
-							outb_p(j->pld_scrw.byte, j->XILINXbase);
-							if (j->flags.pstn_ringing && j->pstn_envelope) {
-								if(!j->pstn_ring_stop) {
-									j->pstn_ring_stop = jiffies;
-								} else if (time_after(jiffies, j->pstn_ring_stop + ((hertz * 5) / 100))){
-									j->pstn_ring_stop = 0;
-									j->ex.bits.pstn_ring = 1;
-									j->pstn_envelope = 0;
-								}
-								j->pld_scrw.bits.led1 = 0;
-								outb_p(j->pld_scrw.byte, j->XILINXbase);
-							} else if (j->daa_mode == SOP_PU_CONVERSATION) {
-								if (!j->pstn_winkstart) {
-									j->pstn_winkstart = jiffies;
-								} else if (time_after(jiffies, j->pstn_winkstart + (hertz * j->winktime / 1000))) {
-									daa_set_mode(j, SOP_PU_SLEEP);
-									j->pstn_winkstart = 0;
-									j->ex.bits.pstn_wink = 1;
-								}
+						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->ex.bytes) {
-				wake_up_interruptible(&j->poll_q);	// Wake any blocked selects
-				ixj_kill_fasync(j, POLL_PRI);
+		}
+		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);
+				}
 			}
-		} else {
-			break;
 		}
+		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();
+	ixj_add_timer(j);
 }
 
 static int ixj_status_wait(IXJ *j)
 {
 	unsigned long jif;
 
-	jif = jiffies;
+	jif = jiffies + ((60 * hertz) / 100);
 	while (!IsStatusReady(j)) {
-		if (jiffies - jif > (60 * (hertz / 100))) {
+		ixj_perfmon(j->statuswait);
+		if (time_after(jiffies, jif)) {
+			ixj_perfmon(j->statuswaitfail);
 			return -1;
 		}
 	}
@@ -809,39 +1523,69 @@
 {
 	unsigned long jif;
 
-	jif = jiffies;
+	jif = jiffies + ((60 * hertz) / 100);
 	while (!IsPCControlReady(j)) {
-		if (jiffies - jif > (60 * (hertz / 100))) {
+		ixj_perfmon(j->pcontrolwait);
+		if (time_after(jiffies, jif)) {
+			ixj_perfmon(j->pcontrolwaitfail);
 			return -1;
 		}
 	}
 	return 0;
 }
 
-int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j)
+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;
+	jif = jiffies + ((60 * hertz) / 100);
 	while (!IsControlReady(j)) {
-		if (jiffies - jif > (60 * (hertz / 100))) {
+		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_p(bytes.low, j->DSPbase + 6);
-	outb_p(bytes.high, j->DSPbase + 7);
+	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;
 }
 
@@ -850,7 +1594,7 @@
 *  General Purpose IO Register read routine
 *
 ***************************************************************************/
-extern __inline__ int ixj_gpio_read(IXJ *j)
+static inline int ixj_gpio_read(IXJ *j)
 {
 	if (ixj_WriteDSPCommand(0x5143, j))
 		return -1;
@@ -861,7 +1605,7 @@
 	return 0;
 }
 
-extern __inline__ void LED_SetState(int state, IXJ *j)
+static inline void LED_SetState(int state, IXJ *j)
 {
 	if (j->cardtype == QTI_LINEJACK) {
 		j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0;
@@ -869,7 +1613,7 @@
 		j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0;
 		j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0;
 
-		outb_p(j->pld_scrw.byte, j->XILINXbase);
+		outb(j->pld_scrw.byte, j->XILINXbase);
 	}
 }
 
@@ -908,22 +1652,31 @@
 		case QTI_PHONEJACK_PCI:
 			j->pld_slicw.pcib.mic = 0;
 			j->pld_slicw.pcib.spk = 0;
-			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
+			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
 			break;
 		case QTI_LINEJACK:
-			ixj_set_pots(j, 0);
+			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
+			j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
 
-			outb_p(j->pld_scrw.byte, j->XILINXbase);
+			outb(j->pld_scrw.byte, j->XILINXbase);
 			j->pld_clock.byte = 0;
-			outb_p(j->pld_clock.byte, j->XILINXbase + 0x04);
+			outb(j->pld_clock.byte, j->XILINXbase + 0x04);
 			j->pld_slicw.bits.rly1 = 1;
 			j->pld_slicw.bits.spken = 0;
-			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
+			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;
@@ -940,7 +1693,7 @@
 			j->pld_slicw.bits.rly3 = 0;
 			j->pld_slicw.bits.rly1 = 1;
 			j->pld_slicw.bits.spken = 0;
-			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
+			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
 			j->port = PORT_PSTN;
 		} else {
 			return 4;
@@ -957,10 +1710,29 @@
 		case QTI_PHONEJACK_PCI:
 			j->pld_slicw.pcib.mic = 1;
 			j->pld_slicw.pcib.spk = 1;
-			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
+			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
 			break;
 		case QTI_LINEJACK:
-			ixj_set_pots(j, 0);
+			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;
@@ -971,7 +1743,7 @@
 		}
 		break;
 	case PORT_HANDSET:
-		if (j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONEJACK_PCI) {
+		if (j->cardtype != QTI_PHONEJACK) {
 			return 5;
 		} else {
 			j->gpio.bytes.high = 0x0B;
@@ -994,14 +1766,17 @@
 		if (arg) {
 			if (j->port == PORT_PSTN) {
 				j->pld_slicw.bits.rly1 = 0;
-				outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
+				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_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
+			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
+			j->flags.pots_pstn = 0;
 			return 1;
 		}
 	} else {
@@ -1011,18 +1786,76 @@
 
 static void ixj_ring_on(IXJ *j)
 {
-	if (j->dsp.low == 0x20) { // Internet PhoneJACK
+	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
+	} 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);
@@ -1058,8 +1891,8 @@
 	} else if (j->flags.pcmciastate == 3) {
 		j->pccr2.bits.pwr = 0;
 		j->pccr2.bits.rstc = 1;
-		outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
-		j->checkwait = jiffies + hertz * 2;
+		outb(j->pccr2.byte, j->XILINXbase + 0x02);
+		j->checkwait = jiffies + (hertz * 2);
 		j->flags.incheck = 1;
 		j->flags.pcmciastate = 2;
 		return 0;
@@ -1083,9 +1916,9 @@
 			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.pcmciascp = 1;		/* Set Cable Present Flag */
 
-			j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03;		// Get Cable Type
+			j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03;		/* Get Cable Type */
 
 			if (j->flags.pcmciasct == 3) {
 				j->flags.pcmciastate = 4;
@@ -1098,113 +1931,63 @@
 			} 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->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->sic1.byte, j->XILINXbase + 0x00);
 			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->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(0x09, j->XILINXbase + 0x00);	// PLL Multiply M1
-
+			outb(j->sic2.byte, j->XILINXbase + 0x00);
 			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.addr = 3;				/* 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(0x00, j->XILINXbase + 0x00);		/* PLL Divide N1 */
 			outb(j->psccr.byte, j->XILINXbase + 0x01);
 			ixj_PCcontrol_wait(j);
-			j->siadc.bits.hom = 0;	// Handset Out Mute
-
-			j->siadc.bits.lom = 0;	// Line Out Mute
-
-			j->siadc.bits.rxg = 23;		//(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.addr = 4;				/* 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(0x09, j->XILINXbase + 0x00);		/* PLL Multiply M1 */
 			outb(j->psccr.byte, j->XILINXbase + 0x01);
 			ixj_PCcontrol_wait(j);
-			j->sidac.bits.srm = 1;	// Speaker Right Mute
-
-			j->sidac.bits.slm = 1;	// Speaker Left Mute
-
-			j->sidac.bits.txg = (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->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->sidac.byte, j->XILINXbase + 0x00);
+			outb(j->sirxg.byte, j->XILINXbase + 0x00);
 			outb(j->psccr.byte, j->XILINXbase + 0x01);
 			ixj_PCcontrol_wait(j);
-			j->siaatt.bits.sot = 0;
-			j->psccr.bits.addr = 9;		// R/W Smart Cable Register Address
 
-			j->psccr.bits.rw = 0;	// Read / Write flag
+			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);
@@ -1241,26 +2024,42 @@
 	case QTI_PHONEJACK_LITE:
 	case QTI_PHONEJACK_PCI:
 		SLIC_GetState(j);
-		if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE ||
-		    j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) {
-			if (j->flags.ringing) {
-				if (!in_interrupt()) {
-					det = jiffies + (hertz / 50);
-					while (time_before(jiffies, det)) {
-						set_current_state(TASK_INTERRUPTIBLE);
-						schedule_timeout(1);
-					}
+		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;
 				}
-				SLIC_GetState(j);
-				if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) {
-					ixj_ring_on(j);
+				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()) {
+						det = jiffies + (hertz / 50);
+						while (time_before(jiffies, det)) {
+							set_current_state(TASK_INTERRUPTIBLE);
+							schedule_timeout(1);
+						}
+					}
+					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;
 			}
-			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:
@@ -1269,34 +2068,49 @@
 	}
 	if (j->r_hook != fOffHook) {
 		j->r_hook = fOffHook;
-		if (j->port != PORT_POTS) {
+		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, POLL_PRI);
+			ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
 		} else if (!fOffHook) {
-			j->flash_end = jiffies + (hertz / 10 * 6);
+			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)
-		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;
 
-	if (fOffHook && time_before(jiffies, j->flash_end))
-		return 0;
-	else
-		return fOffHook;
+	return fOffHook;
 }
 
 static void ixj_ring_off(IXJ *j)
 {
-
-	if (j->dsp.low == 0x20)	// Internet PhoneJACK
+	if (j->dsp.low == 0x20)	/* Internet PhoneJACK */
 	 {
-		if (ixjdebug > 0)
+		if (ixjdebug & 0x0004)
 			printk(KERN_INFO "IXJ Ring Off\n");
 		j->gpio.bytes.high = 0x0B;
 		j->gpio.bytes.low = 0x00;
@@ -1304,12 +2118,13 @@
 		j->gpio.bits.gpio2 = 1;
 		j->gpio.bits.gpio5 = 0;
 		ixj_WriteDSPCommand(j->gpio.word, j);
-	} else			// Internet LineJACK
-	 {
-		if (ixjdebug > 0)
+	} else			/* Internet LineJACK */
+	{
+		if (ixjdebug & 0x0004)
 			printk(KERN_INFO "IXJ Ring Off\n");
 
-		SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
+		if(!j->flags.cidplay)
+			SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
 
 		SLIC_GetState(j);
 	}
@@ -1318,10 +2133,20 @@
 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;
@@ -1330,6 +2155,7 @@
 		} else {
 			ixj_ring_off(j);
 		}
+		j->flags.cidsent = j->flags.cidring = j->flags.firstring = 0;
 	}
 }
 
@@ -1386,12 +2212,10 @@
 	return 0;
 }
 
-int ixj_open(struct phone_device *p, struct file *file_p)
+static int ixj_open(struct phone_device *p, struct file *file_p)
 {
-	IXJ *j = file_p->private_data = ixj[p->board];
-
-	if (j == NULL)
-		return -ENODEV;
+	IXJ *j = get_ixj(p->board);
+	file_p->private_data = j;
 
 	if (!j->DSPbase)
 		return -ENODEV;
@@ -1423,7 +2247,12 @@
 		ixj_PCcontrol_wait(j);
 	}
 
-	if (ixjdebug > 0)
+	j->flags.cidplay = 0;
+	j->flags.cidcw_ack = 0;
+
+	MOD_INC_USE_COUNT;
+
+	if (ixjdebug & 0x0002)
 		printk(KERN_INFO "Opening board %d\n", p->board);
 
 	j->framesread = j->frameswritten = 0;
@@ -1435,14 +2264,24 @@
 	IXJ_TONE ti;
 	int cnt;
 	IXJ *j = file_p->private_data;
+	int board = j->p.board;
 
-	if (ixjdebug > 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) {
+		set_current_state(TASK_INTERRUPTIBLE);
+		schedule_timeout(1);
+	}
+	if (ixjdebug & 0x0002)
 		printk(KERN_INFO "Closing board %d\n", NUM(inode->i_rdev));
 
 	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);
@@ -1450,22 +2289,25 @@
 	set_rec_volume(j, 0x100);
 	ixj_ring_off(j);
 
-	// Restore the tone table to default settings.
+	/* 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;
@@ -1557,9 +2399,9 @@
 	ti.freq1 = hz620;
 	ixj_init_tone(j, &ti);
 
-	set_rec_depth(j, 2);	// Set Record Channel Limit to 2 frames
+	set_rec_depth(j, 2);	/* Set Record Channel Limit to 2 frames */
 
-	set_play_depth(j, 2);	// Set Playback 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;
@@ -1568,6 +2410,9 @@
 	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;
@@ -1598,27 +2443,42 @@
 	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
+	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.
+	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);
+	MOD_DEC_USE_COUNT;
 	return 0;
 }
 
 static int read_filters(IXJ *j)
 {
-	unsigned short fc, cnt;
+	unsigned short fc, cnt, trg;
 	int var;
 
-	if (ixj_WriteDSPCommand(0x5144, j))
+	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;
@@ -1631,65 +2491,97 @@
 	var = 10;
 
 	for (cnt = 0; cnt < 4; cnt++) {
-		if (ixj_WriteDSPCommand(0x5154 + cnt, j))
+		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 (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 + (j->cadence_f[cnt].on1 * hertz * (100 - var) / 10000);
-					j->cadence_f[cnt].on1dot = jiffies + (j->cadence_f[cnt].on1 * hertz * (100) / 10000);
-					j->cadence_f[cnt].on1max = jiffies + (j->cadence_f[cnt].on1 * hertz * (100 + var) / 10000);
+					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 + (j->cadence_f[cnt].on2 * hertz * (100 - var) / 10000);
-						j->cadence_f[cnt].on2dot = jiffies + (j->cadence_f[cnt].on2 * hertz * (100) / 10000);
-						j->cadence_f[cnt].on2max = jiffies + (j->cadence_f[cnt].on2 * hertz * (100 + var) / 10000);
+						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 = 6;
+						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].on2) {
+					if (j->cadence_f[cnt].on3) {
 						j->cadence_f[cnt].state = 5;
-						j->cadence_f[cnt].on3min = jiffies + (j->cadence_f[cnt].on3 * hertz * (100 - var) / 10000);
-						j->cadence_f[cnt].on3dot = jiffies + (j->cadence_f[cnt].on3 * hertz * (100) / 10000);
-						j->cadence_f[cnt].on3max = jiffies + (j->cadence_f[cnt].on3 * hertz * (100 + var) / 10000);
+						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 = 6;
+						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 &&
-				    (time_after(jiffies, j->cadence_f[cnt].on1min) &&
-				     time_before(jiffies, j->cadence_f[cnt].on1max))) {
-					j->cadence_f[cnt].state = 2;
-					j->cadence_f[cnt].off1min = jiffies + (j->cadence_f[cnt].off1 * hertz * (100 - var) / 10000);
-					j->cadence_f[cnt].off1max = jiffies + (j->cadence_f[cnt].off1 * hertz * (100 + var) / 10000);
-				} else if (j->cadence_f[cnt].state == 3 &&
-					   (time_after(jiffies, j->cadence_f[cnt].on2min) &&
+				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))) {
-					j->cadence_f[cnt].state = 4;
-					j->cadence_f[cnt].off2min = jiffies + (j->cadence_f[cnt].off2 * hertz * (100 - var) / 10000);
-					j->cadence_f[cnt].off2max = jiffies + (j->cadence_f[cnt].off2 * hertz * (100 + var) / 10000);
-				} else if (j->cadence_f[cnt].state == 5 &&
-					   (time_after(jiffies, j->cadence_f[cnt].on3min) &&
+						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))) {
-					j->cadence_f[cnt].state = 6;
-					j->cadence_f[cnt].off3min = jiffies + (j->cadence_f[cnt].off3 * hertz * (100 - var) / 10000);
-					j->cadence_f[cnt].off3max = jiffies + (j->cadence_f[cnt].off3 * hertz * (100 + var) / 10000);
+						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;
 				}
@@ -1700,58 +2592,128 @@
 						   !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 = 6;
+							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 = 6;
+							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 = 6;
+							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 == 6) {
+		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;
 			}
 		}
@@ -1766,7 +2728,7 @@
 	}
 	j->dtmf_proc = 1;
 
-	if (ixj_WriteDSPCommand(0x7000, j))		// Line Monitor
+	if (ixj_WriteDSPCommand(0x7000, j))		/* Line Monitor */
 		return -1;
 
 	j->dtmf.bytes.high = j->ssr.high;
@@ -1775,16 +2737,22 @@
 		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->dtmf_state && !j->dtmf.bits.dtmf_valid)	/* && j->dtmf_wp != j->dtmf_rp) */
 	 {
-		if(!j->flags.cidplay) {
+		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 == 25 || j->dtmf_current == 31) {
+		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;
@@ -1794,14 +2762,102 @@
 	return 0;
 }
 
-ssize_t ixj_read(struct file * file_p, char *buf, size_t length, loff_t * ppos)
+/************************************************************************
+*
+* 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];
+}
+
+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];
+}
+
+static ssize_t ixj_read(struct file * file_p, char *buf, size_t length, loff_t * ppos)
 {
 	unsigned long i = *ppos;
-	IXJ *j = ixj[NUM(file_p->f_dentry->d_inode->i_rdev)];
-	DECLARE_WAITQUEUE(wait, current);
+	IXJ * j = get_ixj(NUM(file_p->f_dentry->d_inode->i_rdev));
 
-	if (j == NULL) /* shouldn't happen! */
-		return -ENODEV;
+	DECLARE_WAITQUEUE(wait, current);
 
 	if (j->flags.inread)
 		return -EALREADY;
@@ -1814,12 +2870,6 @@
 
 	while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) {
 		++j->read_wait;
-		if(j->tone_state) {
-			set_current_state(TASK_RUNNING);
-			remove_wait_queue(&j->read_q, &wait);
-			j->flags.inread = 0;
-			return -EAGAIN;
-		}
 		if (file_p->f_flags & O_NONBLOCK) {
 			set_current_state(TASK_RUNNING);
 			remove_wait_queue(&j->read_q, &wait);
@@ -1844,27 +2894,25 @@
 	remove_wait_queue(&j->read_q, &wait);
 	set_current_state(TASK_RUNNING);
 	/* Don't ever copy more than the user asks */
-	i = copy_to_user(buf, j->read_buffer,
-			 min(unsigned int, length, j->read_buffer_size));
+	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(unsigned int, length, j->read_buffer_size);
+		return min(length, j->read_buffer_size);
 	}
 }
 
-ssize_t ixj_enhanced_read(struct file * file_p, char *buf, size_t length,
+static ssize_t ixj_enhanced_read(struct file * file_p, char *buf, size_t length,
 			  loff_t * ppos)
 {
 	int pre_retval;
 	ssize_t read_retval = 0;
-	IXJ *j = ixj[NUM(file_p->f_dentry->d_inode->i_rdev)];
-
-	if (j == NULL) /* shouldn't happen! */
-		return -ENODEV;
+	IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode->i_rdev));
 
 	pre_retval = ixj_PreRead(j, 0L);
 	switch (pre_retval) {
@@ -1884,14 +2932,12 @@
 	return read_retval;
 }
 
-ssize_t ixj_write(struct file *file_p, const char *buf, size_t count, loff_t * ppos)
+static ssize_t ixj_write(struct file *file_p, const char *buf, size_t count, loff_t * ppos)
 {
 	unsigned long i = *ppos;
 	IXJ *j = file_p->private_data;
-	DECLARE_WAITQUEUE(wait, current);
 
-	if (j == NULL) /* shouldn't happen! */
-		return -ENODEV;
+	DECLARE_WAITQUEUE(wait, current);
 
 	if (j->flags.inwrite)
 		return -EALREADY;
@@ -1905,12 +2951,6 @@
 
 	while (!j->write_buffers_empty) {
 		++j->write_wait;
-		if(j->tone_state) {
-			set_current_state(TASK_RUNNING);
-			remove_wait_queue(&j->write_q, &wait);
-			j->flags.inwrite = 0;
-			return -EAGAIN;
-		}
 		if (file_p->f_flags & O_NONBLOCK) {
 			set_current_state(TASK_RUNNING);
 			remove_wait_queue(&j->write_q, &wait);
@@ -1935,30 +2975,29 @@
 	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(unsigned int, count, j->write_buffer_size));
+	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(unsigned int, count, j->write_buffer_size);
+	return min(count, j->write_buffer_size);
 }
 
-ssize_t ixj_enhanced_write(struct file * file_p, const char *buf, size_t count, loff_t * ppos)
+static ssize_t ixj_enhanced_write(struct file * file_p, const char *buf, size_t count, loff_t * ppos)
 {
 	int pre_retval;
 	ssize_t write_retval = 0;
-	IXJ *j = ixj[NUM(file_p->f_dentry->d_inode->i_rdev)];
 
-	if (j == NULL) /* shouldn't happen! */
-		return -ENODEV;
+	IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode->i_rdev));
 
 	pre_retval = ixj_PreWrite(j, 0L);
 	switch (pre_retval) {
 	case NORMAL:
 		write_retval = ixj_write(file_p, buf, count, ppos);
-		if (write_retval != -EFAULT) {
+		if (write_retval > 0) {
 			ixj_PostWrite(j, 0L);
 			j->write_buffer_wp += write_retval;
 			j->write_buffers_empty--;
@@ -1966,7 +3005,7 @@
 		break;
 	case NOPOST:
 		write_retval = ixj_write(file_p, buf, count, ppos);
-		if (write_retval != -EFAULT) {
+		if (write_retval > 0) {
 			j->write_buffer_wp += write_retval;
 			j->write_buffers_empty--;
 		}
@@ -1996,8 +3035,8 @@
 					udelay(10);
 				}
 			}
-			// Throw away word 0 of the 8021 compressed format to get standard G.729.
-			if (j->rec_codec == G729 && (cnt == 0 || cnt == 5 || cnt == 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);
 			}
@@ -2006,15 +3045,7 @@
 		}
 		++j->framesread;
 		if (j->intercom != -1) {
-			IXJ *icom = ixj[j->intercom];
-
-			if (icom == NULL) { /* shouldn't happen! */
-				printk(KERN_ERR "ixj_read_frame(): j->intercom = %d = NULL!",
-				       j->intercom);
-				return;
-			}
-
-			if (IsTxReady(icom)) {
+			if (IsTxReady(get_ixj(j->intercom))) {
 				for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
 					if (!(cnt % 16) && !IsTxReady(j)) {
 						dly = 0;
@@ -2026,18 +3057,19 @@
 							udelay(10);
 						}
 					}
-					outb_p(*(j->read_buffer + cnt), icom->DSPbase + 0x0C);
-					outb_p(*(j->read_buffer + cnt + 1), icom->DSPbase + 0x0D);
+					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);
 				}
-				++icom->frameswritten;
+				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->read_q);	/* Wake any blocked readers */
 
-			wake_up_interruptible(&j->poll_q);	// Wake any blocked selects
+			wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */
 
-			ixj_kill_fasync(j, POLL_IN);
+			if(j->ixj_signals[SIG_READ_READY])
+				ixj_kill_fasync(j, SIG_READ_READY, POLL_OUT);
 		}
 	}
 }
@@ -2101,25 +3133,10 @@
 
 static void ixj_write_cid_bit(IXJ *j, int bit)
 {
-	int dly;
-	IXJ_WORD dat;
-
 	while (j->fskcnt < 20) {
-		if (!IsTxReady(j)) {
-			dly = 0;
-			while (!IsTxReady(j)) {
-				if (dly++ > 5) {
-					dly = 0;
-					//      break;
-					//      printk("CID delay\n");
-				}
-				udelay(10);
-			}
-		}
-		dat.word = j->fskdata[j->fskdcnt++] =
-		    fsk[bit][j->fskz][j->fskcnt];
-		outb_p(dat.bytes.low, j->DSPbase + 0x0C);
-		outb_p(dat.bytes.high, j->DSPbase + 0x0D);
+		if(j->fskdcnt < (j->fsksize - 1))
+			j->fskdata[j->fskdcnt++] = fsk[bit][j->fskz][j->fskcnt];
+
 		j->fskcnt += 3;
 	}
 	j->fskcnt %= 20;
@@ -2131,52 +3148,51 @@
 
 }
 
-static void ixj_write_cid_byte(IXJ *board, char byte)
+static void ixj_write_cid_byte(IXJ *j, char byte)
 {
 	IXJ_CBYTE cb;
 
-//  printk("Writing CID data %x - %c\n", byte, byte);
-	cb.cbyte = byte;
-	ixj_write_cid_bit(board, 0);
-	ixj_write_cid_bit(board, cb.cbits.b0 ? 1 : 0);
-	ixj_write_cid_bit(board, cb.cbits.b1 ? 1 : 0);
-	ixj_write_cid_bit(board, cb.cbits.b2 ? 1 : 0);
-	ixj_write_cid_bit(board, cb.cbits.b3 ? 1 : 0);
-	ixj_write_cid_bit(board, cb.cbits.b4 ? 1 : 0);
-	ixj_write_cid_bit(board, cb.cbits.b5 ? 1 : 0);
-	ixj_write_cid_bit(board, cb.cbits.b6 ? 1 : 0);
-	ixj_write_cid_bit(board, cb.cbits.b7 ? 1 : 0);
-	ixj_write_cid_bit(board, 1);
+		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 *board)
+static void ixj_write_cid_seize(IXJ *j)
 {
 	int cnt;
 
 	for (cnt = 0; cnt < 150; cnt++) {
-		ixj_write_cid_bit(board, 0);
-		ixj_write_cid_bit(board, 1);
+		ixj_write_cid_bit(j, 0);
+		ixj_write_cid_bit(j, 1);
 	}
 	for (cnt = 0; cnt < 180; cnt++) {
-		ixj_write_cid_bit(board, 1);
+		ixj_write_cid_bit(j, 1);
 	}
 }
 
-static void ixj_write_cidcw_seize(IXJ *board)
+static void ixj_write_cidcw_seize(IXJ *j)
 {
 	int cnt;
 
 	for (cnt = 0; cnt < 80; cnt++) {
-		ixj_write_cid_bit(board, 1);
+		ixj_write_cid_bit(j, 1);
 	}
 }
 
-static int ixj_write_cid_string(IXJ *board, char *s, int checksum)
+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(board, s[cnt]);
+		ixj_write_cid_byte(j, s[cnt]);
 		checksum = (checksum + s[cnt]);
 	}
 	return checksum;
@@ -2184,33 +3200,85 @@
 
 static void ixj_pad_fsk(IXJ *j, int pad)
 {
-	int cnt, dly;
+	int cnt; 
 
 	for (cnt = 0; cnt < pad; cnt++) {
-		if (!IsTxReady(j)) {
-			dly = 0;
-			while (!IsTxReady(j)) {
-				if (dly++ > 5) {
-					dly = 0;
-				}
-				udelay(10);
-			}
-		}
-		outb_p(0x00, j->DSPbase + 0x0C);
-		outb_p(0x00, j->DSPbase + 0x0D);
+		if(j->fskdcnt < (j->fsksize - 1))
+			j->fskdata[j->fskdcnt++] = 0x0000;
 	}
 	for (cnt = 0; cnt < 720; cnt++) {
-		if (!IsTxReady(j)) {
-			dly = 0;
-			while (!IsTxReady(j)) {
-				if (dly++ > 5) {
-					dly = 0;
-				}
-				udelay(10);
-			}
-		}
-		outb_p(0x00, j->DSPbase + 0x0C);
-		outb_p(0x00, j->DSPbase + 0x0D);
+		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 */
 	}
 }
 
@@ -2224,13 +3292,13 @@
 
 	int checksum = 0;
 
-	if (j->dsp.low == 0x20)
+	if (j->dsp.low == 0x20 || j->flags.cidplay)
 		return;
 
-	j->fskz = j->fskphase = j->fskcnt =
-	    j->fskdcnt = 0;
+	j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
+	j->cidsize = j->cidcnt = 0;
 
-	j->flags.cidplay = 1;
+	ixj_fsk_alloc(j);
 
 	strcpy(sdmf1, j->cid_send.month);
 	strcat(sdmf1, j->cid_send.day);
@@ -2244,54 +3312,53 @@
 	len3 = strlen(sdmf3);
 	mdmflen = len1 + len2 + len3 + 6;
 
-	set_base_frame(j, 30);
-	set_play_codec(j, LINEAR16);
-
-	if (j->port == PORT_POTS)
-		if(!j->r_hook)
-			SLIC_SetState(PLD_SLIC_STATE_OHT, j);
-
-	set_play_volume(j, 0x1B);
-	ixj_play_start(j);
-	ixj_write_cid_seize(j);
-
-	ixj_write_cid_byte(j, 0x80);
-	checksum = 0x80;
-	ixj_write_cid_byte(j, mdmflen);
-	checksum = checksum + mdmflen;
+	while(1){
+		ixj_write_cid_seize(j);
 
-	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, 0x80);
+		checksum = 0x80;
+		ixj_write_cid_byte(j, mdmflen);
+		checksum = checksum + mdmflen;
 
-	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, 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, 0x07);
-	checksum = checksum + 0x07;
-	ixj_write_cid_byte(j, len3);
-	checksum = checksum + len3;
-	checksum = ixj_write_cid_string(j, sdmf3, 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);
+		if(ixj_hookstate(j) & 1)
+			break;
 
-	checksum %= 256;
-	checksum ^= 0xFF;
-	checksum += 1;
+		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;
 
-	ixj_write_cid_byte(j, (char) checksum);
+		checksum %= 256;
+		checksum ^= 0xFF;
+		checksum += 1;
 
-	pad = j->fskdcnt % 240;
-	if (pad) {
-		pad = 240 - pad;
+		ixj_write_cid_byte(j, (char) checksum);
+
+		pad = j->fskdcnt % 240;
+		if (pad) {
+			pad = 240 - pad;
+		}
+		ixj_pad_fsk(j, pad);
+		break;
 	}
-	ixj_pad_fsk(j, pad);
-	SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
-	j->flags.cidplay = 0;
-	ixj_play_stop(j);
+
+	ixj_write_frame(j);
 }
 
 static void ixj_write_cidcw(IXJ *j)
@@ -2306,12 +3373,15 @@
 
 	int checksum = 0;
 
-	if (j->dsp.low == 0x20)
+	if (j->dsp.low == 0x20 || j->flags.cidplay)
 		return;
 
 	j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
+	j->cidsize = j->cidcnt = 0;
 
-	j->flags.cidplay = 1;
+	ixj_fsk_alloc(j);
+
+	j->flags.cidcw_ack = 0;
 
 	ti.tone_index = 23;
 	ti.gain0 = 1;
@@ -2320,6 +3390,26 @@
 	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) {
+		set_current_state(TASK_INTERRUPTIBLE);
+		schedule_timeout(1);
+	}
+	while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
+		set_current_state(TASK_INTERRUPTIBLE);
+		schedule_timeout(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;
@@ -2327,33 +3417,51 @@
 	ti.freq1 = hz2750;
 	ixj_init_tone(j, &ti);
 
-	ixj_set_tone_on(1200, j);
-	ixj_play_tone(j, 23);
+	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) {
 		set_current_state(TASK_INTERRUPTIBLE);
 		schedule_timeout(1);
 	}
-
-	ixj_set_tone_on(320, j);
-	ixj_play_tone(j, 24);
-
-	while(j->tone_state) {
+	while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
 		set_current_state(TASK_INTERRUPTIBLE);
 		schedule_timeout(1);
 	}
+	if(ixjdebug & 0x0200) {
+		printk("IXJ cidcw phone%d sent second tone at %ld\n", j->board, jiffies);
+	}
 
-	j->cidcw_wait = jiffies + (200 * hertz / 100000);
+	j->cidcw_wait = jiffies + ((50 * hertz) / 100);
 
+	clear_bit(j->board, &j->busyflags);
 	while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait)) {
 		set_current_state(TASK_INTERRUPTIBLE);
 		schedule_timeout(1);
 	}
-
+	while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
+		set_current_state(TASK_INTERRUPTIBLE);
+		schedule_timeout(1);
+	}
+	j->cidcw_wait = 0;
 	if(!j->flags.cidcw_ack) {
+		if(ixjdebug & 0x0200) {
+			printk("IXJ cidcw phone%d did not recieve 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);
@@ -2366,25 +3474,6 @@
 	len3 = strlen(sdmf3);
 	mdmflen = len1 + len2 + len3 + 6;
 
-	j->cid_play_codec = j->play_codec;
-	ixj_play_stop(j);
-
-	switch(j->baseframe.low) {
-		case 0xA0:
-			j->cid_base_frame_size = 20;
-			break;
-		case 0x50:
-			j->cid_base_frame_size = 10;
-			break;
-		default:
-			j->cid_base_frame_size = 30;
-			break;
-	}
-	set_base_frame(j, 30);
-	set_play_codec(j, LINEAR16);
-
-	set_play_volume(j, 0x1B);
-	ixj_play_start(j);
 	ixj_write_cidcw_seize(j);
 
 	ixj_write_cid_byte(j, 0x80);
@@ -2421,11 +3510,9 @@
 		pad = 240 - pad;
 	}
 	ixj_pad_fsk(j, pad);
-	j->flags.cidplay = 0;
-	ixj_play_stop(j);
-
-	set_base_frame(j, j->cid_base_frame_size);
-	set_play_codec(j, j->cid_play_codec);
+	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)
@@ -2435,23 +3522,19 @@
 
 	int checksum = 0;
 
-	if (j->dsp.low == 0x20)
+	if (j->dsp.low == 0x20 || j->flags.cidplay)
 		return;
 
 	j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
+	j->cidsize = j->cidcnt = 0;
 
-	j->flags.cidplay = 1;
+	ixj_fsk_alloc(j);
 
 	mdmflen = 3;
 
-	set_base_frame(j, 30);
-	set_play_codec(j, LINEAR16);
-
 	if (j->port == PORT_POTS)
 		SLIC_SetState(PLD_SLIC_STATE_OHT, j);
 
-	set_play_volume(j, 0x1B);
-	ixj_play_start(j);
 	ixj_write_cid_seize(j);
 
 	ixj_write_cid_byte(j, 0x82);
@@ -2484,18 +3567,49 @@
 		pad = 240 - pad;
 	}
 	ixj_pad_fsk(j, pad);
-	SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
-	j->flags.cidplay = 0;
-	ixj_play_stop(j);
 }
 
 static void ixj_write_frame(IXJ *j)
 {
 	int cnt, frame_count, dly;
+	IXJ_WORD dat;
 	BYTES blankword;
 
 	frame_count = 0;
-	if (j->write_buffer && j->write_buffers_empty < 2) {
+	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);
@@ -2535,6 +3649,29 @@
 					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)) {
@@ -2547,11 +3684,20 @@
 						udelay(10);
 					}
 				}
-// Add word 0 to G.729 frames for the 8021.  Right now we don't do VAD/CNG 
-				// so all frames are type 1.
-				if (j->play_codec == G729 && (cnt == 0 || cnt == 5 || cnt == 10)) {
-					outb_p(0x01, j->DSPbase + 0x0C);
-					outb_p(0x00, j->DSPbase + 0x0D);
+			/* 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);
@@ -2563,27 +3709,35 @@
 				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->write_q);	/* Wake any blocked writers */
 
-			wake_up_interruptible(&j->poll_q);	// Wake any blocked selects
+			wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */
 
-			ixj_kill_fasync(j, POLL_OUT);
 			++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
+	if (ixj_WriteDSPCommand(0x0000, j))		/* DSP Idle */
 
 		return 0;
-	if (j->ssr.high || j->ssr.low)
+
+	if (j->ssr.high || j->ssr.low) {
 		return 0;
-	else
+	} 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)
@@ -2591,6 +3745,8 @@
 	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))
@@ -2627,7 +3783,12 @@
 	} 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;
 }
 
@@ -2708,6 +3869,28 @@
 			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:
@@ -2800,7 +3983,10 @@
 		ixj_record_stop(j);
 	}
 	j->flags.recording = 1;
-	ixj_WriteDSPCommand(0x0FE0, j);	// Put the DSP in full power mode.
+	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) {
@@ -2811,21 +3997,22 @@
 			cmd = 0x5132;
 			break;
 		case TS85:
-			cmd = 0x5130;	// TrueSpeech 8.5
+			cmd = 0x5130;	/* TrueSpeech 8.5 */
 
 			break;
 		case TS48:
-			cmd = 0x5133;	// TrueSpeech 4.8
+			cmd = 0x5133;	/* TrueSpeech 4.8 */
 
 			break;
 		case TS41:
-			cmd = 0x5134;	// TrueSpeech 4.1
+			cmd = 0x5134;	/* TrueSpeech 4.1 */
 
 			break;
 		case G728:
 			cmd = 0x5135;
 			break;
 		case G729:
+		case G729B:
 			cmd = 0x5136;
 			break;
 		default:
@@ -2838,67 +4025,70 @@
 		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->p.board);
+			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
+	if (ixj_WriteDSPCommand(0x5102, j))		/* Set Poll sync mode */
 
 		return -1;
 
 	switch (j->rec_mode) {
 	case 0:
-		cmd = 0x1C03;	// Record C1
+		cmd = 0x1C03;	/* Record C1 */
 
 		break;
 	case 4:
 		if (j->ver.low == 0x12) {
-			cmd = 0x1E03;	// Record C1
+			cmd = 0x1E03;	/* Record C1 */
 
 		} else {
-			cmd = 0x1E01;	// Record C1
+			cmd = 0x1E01;	/* Record C1 */
 
 		}
 		break;
 	case 5:
 		if (j->ver.low == 0x12) {
-			cmd = 0x1E83;	// Record C1
+			cmd = 0x1E83;	/* Record C1 */
 
 		} else {
-			cmd = 0x1E81;	// Record C1
+			cmd = 0x1E81;	/* Record C1 */
 
 		}
 		break;
 	case 6:
 		if (j->ver.low == 0x12) {
-			cmd = 0x1F03;	// Record C1
+			cmd = 0x1F03;	/* Record C1 */
 
 		} else {
-			cmd = 0x1F01;	// Record C1
+			cmd = 0x1F01;	/* Record C1 */
 
 		}
 		break;
 	case 7:
 		if (j->ver.low == 0x12) {
-			cmd = 0x1F83;	// Record C1
-
+			cmd = 0x1F83;	/* Record C1 */
 		} else {
-			cmd = 0x1F81;	// Record C1
-
+			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);
+
 	if (j->read_buffer) {
 		kfree(j->read_buffer);
 		j->read_buffer = NULL;
@@ -2909,9 +4099,6 @@
 		j->rec_mode = -1;
 	}
 	j->flags.recording = 0;
-	if (!j->flags.playing)
-		ixj_WriteDSPCommand(0x0FE3, j);	// Put the DSP in 1/5 power mode.
-
 }
 static void ixj_vad(IXJ *j, int arg)
 {
@@ -2930,18 +4117,118 @@
 	ixj_WriteDSPCommand(0x5180 + depth, j);
 }
 
-static void set_rec_volume(IXJ *j, int volume)
+static void set_dtmf_prescale(IXJ *j, int volume)
 {
-	ixj_WriteDSPCommand(0xCF03, j);
+	ixj_WriteDSPCommand(0xCF07, j);
 	ixj_WriteDSPCommand(volume, j);
 }
 
-static int get_rec_volume(IXJ *j)
+static int get_dtmf_prescale(IXJ *j)
 {
-	ixj_WriteDSPCommand(0xCF01, 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;
@@ -2956,52 +4243,117 @@
 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) {
-			ixj_WriteDSPCommand(0xE022, j);	// Move AEC filter buffer
+		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(0xB001, j);	/* AEC On */
 
-		ixj_WriteDSPCommand(0xE013, j);	// Advanced AEC C1
+		ixj_WriteDSPCommand(0xE013, j);	/* Advanced AEC C1 */
 
 		switch (level) {
 		case AEC_LOW:
-			ixj_WriteDSPCommand(0x0000, j);	// Advanced AEC C2 = off
+			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(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(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(0x0002, j);	/* Attenuation scaling factor of 2 */
 
 			ixj_WriteDSPCommand(0xE011, j);
-			ixj_WriteDSPCommand(0x0100, j);	// Higher Threshold Floor
+			ixj_WriteDSPCommand(0x0100, j);	/* Higher Threshold Floor */
 
-			ixj_WriteDSPCommand(0xE012, j);	// Set Train and Lock
+			ixj_WriteDSPCommand(0xE012, j);	/* Set Train and Lock */
 
-			ixj_WriteDSPCommand(0x0023, j);
+			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(0x0003, j);	/* Lock threashold at 3dB */
+
+			ixj_WriteDSPCommand(0xE338, j);	/* Set Echo Suppresser Attenuation to 0dB */
 
 			break;
 		}
@@ -3010,15 +4362,15 @@
 
 static void aec_stop(IXJ *j)
 {
-	if (j->rec_codec == G729 || j->play_codec == G729) {
-		ixj_WriteDSPCommand(0xE022, j);	// Move AEC filter buffer back
+	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
-
+		ixj_WriteDSPCommand(0xB002, j);	/* AEC Stop */
 	}
 }
 
@@ -3099,6 +4451,28 @@
 			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:
@@ -3190,8 +4564,12 @@
 	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.
+	ixj_WriteDSPCommand(0x0FE0, j);	/* Put the DSP in full power mode. */
 
 	j->flags.play_first_frame = 1;
 	j->drybuffer = 0;
@@ -3205,21 +4583,22 @@
 			cmd = 0x5232;
 			break;
 		case TS85:
-			cmd = 0x5230;	// TrueSpeech 8.5
+			cmd = 0x5230;	/* TrueSpeech 8.5 */
 
 			break;
 		case TS48:
-			cmd = 0x5233;	// TrueSpeech 4.8
+			cmd = 0x5233;	/* TrueSpeech 4.8 */
 
 			break;
 		case TS41:
-			cmd = 0x5234;	// TrueSpeech 4.1
+			cmd = 0x5234;	/* TrueSpeech 4.1 */
 
 			break;
 		case G728:
 			cmd = 0x5235;
 			break;
 		case G729:
+		case G729B:
 			cmd = 0x5236;
 			break;
 		default:
@@ -3230,16 +4609,16 @@
 	}
 	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->p.board);
+		printk("Write buffer allocation for ixj board %d failed!\n", j->board);
 		return -ENOMEM;
 	}
-	j->write_buffers_empty = 2;
+/*	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
+	if (ixj_WriteDSPCommand(0x5202, j))		/* Set Poll sync mode */
 
 		return -1;
 
@@ -3279,42 +4658,42 @@
 	if (ixj_WriteDSPCommand(cmd, j))
 		return -1;
 
-	if (ixj_WriteDSPCommand(0x2000, j))		// Playback C2
-
+	if (ixj_WriteDSPCommand(0x2000, j))		/* Playback C2 */
 		return -1;
 
-	if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j))	// Playback C3
-
+	if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j))	/* Playback C3 */
 		return -1;
 
+	if (j->flags.recording) {
+		ixj_aec_start(j, j->aec_level);
+	}
 
-	ixj_kill_fasync(j, POLL_OUT);
 	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);
+
 	if (j->write_buffer) {
 		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
+		ixj_WriteDSPCommand(0x5221, j);	/* Stop playback and flush buffers.  8022 reference page 9-40 */
 
 		j->play_mode = -1;
 	}
 	j->flags.playing = 0;
-	if (!j->flags.recording)
-		ixj_WriteDSPCommand(0x0FE3, j);	// Put the DSP in 1/5 power mode.
-
 }
 
-extern __inline__ int get_play_level(IXJ *j)
+static inline int get_play_level(IXJ *j)
 {
 	int retval;
 
-	ixj_WriteDSPCommand(0xCF8F, j); // 8022 Reference page 9-38
+	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;
@@ -3324,10 +4703,8 @@
 static unsigned int ixj_poll(struct file *file_p, poll_table * wait)
 {
 	unsigned int mask = 0;
-	IXJ *j = ixj[NUM(file_p->f_dentry->d_inode->i_rdev)];
 
-	if (j == NULL) /* shouldn't happen! */
-		return -ENODEV;
+	IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode->i_rdev));
 
 	poll_wait(file_p, &(j->poll_q), wait);
 	if (j->read_buffer_ready > 0)
@@ -3341,18 +4718,22 @@
 
 static int ixj_play_tone(IXJ *j, char tone)
 {
-	if (!j->tone_state && j->dsp.low == 0x20)
-		idle(j);
-
-	j->tone_index = tone;
-	if (ixj_WriteDSPCommand(0x6000 + j->tone_index, j))
-		return -1;
-
 	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;
 }
 
@@ -3360,7 +4741,7 @@
 {
 	j->tone_on_time = arg;
 
-	if (ixj_WriteDSPCommand(0x6E04, j))		// Set Tone On Period
+	if (ixj_WriteDSPCommand(0x6E04, j))		/* Set Tone On Period */
 
 		return -1;
 
@@ -3383,7 +4764,7 @@
 			if ((j->pld_scrr.bits.sci))
 				return 1;
 		}
-		if (ixjdebug > 1)
+		if (ixjdebug & 0x0001)
 			printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte);
 		return 0;
 	} else
@@ -3403,7 +4784,7 @@
 			if (!(j->pld_scrr.bits.sci))
 				return 1;
 		}
-		if (ixjdebug > 1)
+		if (ixjdebug & 0x0001)
 			printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte);
 		return 0;
 	} else
@@ -3414,27 +4795,27 @@
 {
 	switch (control) {
 	case SCI_End:
-		j->pld_scrw.bits.c0 = 0;	// Set PLD Serial control interface
+		j->pld_scrw.bits.c0 = 0;	/* Set PLD Serial control interface */
 
-		j->pld_scrw.bits.c1 = 0;	// to no selection 
+		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.c0 = 1;	/* Set PLD Serial control interface */
 
-		j->pld_scrw.bits.c1 = 0;	// to write to DAA
+		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.c0 = 0;	/* Set PLD Serial control interface */
 
-		j->pld_scrw.bits.c1 = 1;	// to write to mixer 
+		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.c0 = 1;	/* Set PLD Serial control interface */
 
-		j->pld_scrw.bits.c1 = 1;	// to write to EEPROM 
+		j->pld_scrw.bits.c1 = 1;	/* to write to EEPROM */
 
 		break;
 	default:
@@ -3471,16 +4852,25 @@
 	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 & 0xFF00) >> 8;
+	bytes.high = (val & 0x1F00) >> 8;
 	bytes.low = val & 0x00FF;
 
-	outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03);	// Load Mixer Address
+        /* save mixer value so we can get back later on */
+        j->mix.vol[bytes.high] = bytes.low;
 
-	outb_p(bytes.low, j->XILINXbase + 0x02);	// Load Mixer Data
+	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);
 
@@ -3564,7 +4954,7 @@
 	bytes.high = inb_p(j->XILINXbase + 0x03);
 	bytes.low = inb_p(j->XILINXbase + 0x02);
 	if (bytes.low != ALISDAA_ID_BYTE) {
-		if (ixjdebug > 0)
+		if (ixjdebug & 0x0001)
 			printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
 		return 0;
 	}
@@ -3577,6 +4967,77 @@
 	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;
 }
 
@@ -3585,6 +5046,9 @@
 	int i;
 	BYTES bytes;
 
+	if (ixjdebug & 0x0002)
+		printk("DAA Clearing CID ram\n");
+
 	if (!SCI_Prepare(j))
 		return 0;
 
@@ -3617,6 +5081,9 @@
 	if (!SCI_Control(j, SCI_End))
 		return 0;
 
+	if (ixjdebug & 0x0002)
+		printk("DAA CID ram cleared\n");
+
 	return 1;
 }
 
@@ -3644,7 +5111,7 @@
 	bytes.high = inb_p(j->XILINXbase + 0x03);
 	bytes.low = inb_p(j->XILINXbase + 0x02);
 	if (bytes.low != ALISDAA_ID_BYTE) {
-		if (ixjdebug > 0)
+		if (ixjdebug & 0x0001)
 			printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
 		return 0;
 	}
@@ -3727,7 +5194,7 @@
 	bytes.high = inb_p(j->XILINXbase + 0x03);
 	bytes.low = inb_p(j->XILINXbase + 0x02);
 	if (bytes.low != ALISDAA_ID_BYTE) {
-		if (ixjdebug > 0)
+		if (ixjdebug & 0x0001)
 			printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
 		return 0;
 	}
@@ -3739,7 +5206,7 @@
 
 	bytes.high = inb_p(j->XILINXbase + 0x03);
 	bytes.low = inb_p(j->XILINXbase + 0x02);
-	if (ixjdebug > 0)
+	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;
@@ -3747,30 +5214,52 @@
 
 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.
-	//
+	/* 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_CONVERSATION)
+		if(j->daa_mode == SOP_PU_SLEEP)
 		{
-			j->pld_scrw.bits.daafsyncen = 0;	// Turn off DAA Frame Sync
+			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;
@@ -3781,7 +5270,7 @@
 			if (!SCI_Prepare(j))
 				return 0;
 		}
-		j->pld_scrw.bits.daafsyncen = 0;	// Turn off DAA Frame Sync
+		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;
@@ -3795,13 +5284,15 @@
 		j->daa_mode = SOP_PU_SLEEP;
 		j->flags.pstn_ringing = 0;
 		j->ex.bits.pstn_ring = 0;
-		j->pstn_sleeptil = jiffies + (hertz / 2);
-		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
+		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:
-		j->pld_scrw.bits.daafsyncen = 0;	// Turn off DAA Frame Sync
+		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;
@@ -3814,6 +5305,8 @@
 		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);
@@ -3821,17 +5314,19 @@
 			return 0;
 		j->pld_slicw.bits.rly2 = 1;
 		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
-		j->pld_scrw.bits.led1 = 0;
-		j->pld_scrw.bits.led2 = 1;
-		j->pld_scrw.bits.daafsyncen = 1;	// Turn on DAA Frame Sync
+		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:
-		j->pld_scrw.bits.daafsyncen = 0;	// Turn off DAA Frame Sync
+		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;
@@ -3853,9 +5348,15 @@
 {
 	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))
@@ -4332,13 +5833,19 @@
 	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
+	if (ixj_WriteDSPCommand(0x6E05, j))		/* Set Tone Off Period */
 
 		return -1;
 	if (ixj_WriteDSPCommand(arg, j))
@@ -4348,7 +5855,7 @@
 
 static int ixj_get_tone_on(IXJ *j)
 {
-	if (ixj_WriteDSPCommand(0x6E06, j))		// Get Tone On Period
+	if (ixj_WriteDSPCommand(0x6E06, j))		/* Get Tone On Period */
 
 		return -1;
 	return 0;
@@ -4356,7 +5863,8 @@
 
 static int ixj_get_tone_off(IXJ *j)
 {
-	if (ixj_WriteDSPCommand(0x6E07, j))		// Get Tone Off Period
+	if (ixj_WriteDSPCommand(0x6E07, j))		/* Get Tone Off Period */
+
 		return -1;
 	return 0;
 }
@@ -4387,7 +5895,7 @@
 
 static void ixj_cpt_stop(IXJ *j)
 {
-	if(j->tone_state)
+	if(j->tone_state || j->tone_cadence_state)
 	{
 		j->flags.dialtone = 0;
 		j->flags.busytone = 0;
@@ -4395,7 +5903,7 @@
 		ixj_set_tone_on(0x0001, j);
 		ixj_set_tone_off(0x0000, j);
 		ixj_play_tone(j, 0);
-		j->tone_state = 0;
+		j->tone_state = j->tone_cadence_state = 0;
 		if (j->cadence_t) {
 			if (j->cadence_t->ce) {
 				kfree(j->cadence_t->ce);
@@ -4436,12 +5944,11 @@
 	lcp = kmalloc(sizeof(IXJ_CADENCE), GFP_KERNEL);
 	if (lcp == NULL)
 		return -ENOMEM;
-	if (copy_from_user(lcp, (char *) cp, sizeof(IXJ_CADENCE)) ||
-	    (unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE) )
-	{
-		kfree(lcp);
-		return -EFAULT;
-	}
+	if (copy_from_user(lcp, (char *) cp, sizeof(IXJ_CADENCE)) || (unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE) )
+        {
+                kfree(lcp);
+                return -EFAULT;
+        }
 	lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL);
 	if (lcep == NULL) {
 		kfree(lcp);
@@ -4477,18 +5984,23 @@
 static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE * cp)
 {
 	IXJ_FILTER_CADENCE *lcp;
-
 	lcp = kmalloc(sizeof(IXJ_FILTER_CADENCE), GFP_KERNEL);
-	if (lcp == NULL)
+	if (lcp == NULL) {
+		if(ixjdebug & 0x0001) {
+			printk(KERN_INFO "Could not allocate memory for cadence\n");
+		}
 		return -ENOMEM;
-	if (copy_from_user(lcp, (char *) cp, sizeof(IXJ_FILTER_CADENCE)))
-	{
-		kfree(lcp);
+        }
+	if (copy_from_user(lcp, (char *) cp, sizeof(IXJ_FILTER_CADENCE))) {
+		if(ixjdebug & 0x0001) {
+			printk(KERN_INFO "Could not copy cadence to kernel\n");
+		}
 		return -EFAULT;
 	}
-	if (lcp->filter >= 4)
-	{
-		kfree(lcp);
+	if (lcp->filter > 5) {
+		if(ixjdebug & 0x0001) {
+			printk(KERN_INFO "Cadence out of range\n");
+		}
 		return -1;
 	}
 	j->cadence_f[lcp->filter].state = 0;
@@ -4513,6 +6025,9 @@
 	j->cadence_f[lcp->filter].off3min = 0;
 	j->cadence_f[lcp->filter].off3max = 0;
 	kfree(lcp);
+	if(ixjdebug & 0x0002) {
+		printk(KERN_INFO "Cadence %d loaded\n", lcp->filter);
+	}
 	return 0;
 }
 
@@ -4548,7 +6063,7 @@
 	j->caplist[j->caps].cap = pots;
 	j->caplist[j->caps].handle = j->caps++;
 
- 	// add devices that can do speaker/mic
+ 	/* add devices that can do speaker/mic */
 	switch (j->cardtype) {
 	case QTI_PHONEJACK:
 	case QTI_LINEJACK:
@@ -4562,7 +6077,7 @@
      		break;
 	}
 
- 	// add devices that can do handset
+ 	/* add devices that can do handset */
 	switch (j->cardtype) {
 	case QTI_PHONEJACK:
 		strcpy(j->caplist[j->caps].desc, "HANDSET");
@@ -4574,7 +6089,7 @@
      		break;
 	}
 
- 	// add devices that can do PSTN
+ 	/* add devices that can do PSTN */
 	switch (j->cardtype) {
 	case QTI_LINEJACK:
 		strcpy(j->caplist[j->caps].desc, "PSTN");
@@ -4586,7 +6101,7 @@
      		break;
 	}
 
-	// add codecs - all cards can do uLaw, linear 8/16, and Windows sound system
+	/* 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;
@@ -4607,66 +6122,73 @@
 	j->caplist[j->caps].cap = WSS;
 	j->caplist[j->caps].handle = j->caps++;
 
-	// version 12 of the 8020 does the following codecs in a broken way
+	/* 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");
+		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");
+		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");
+		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");
+		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
+	/* 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");
+		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
+	/* 8021 chips can do G728 */
 	if (j->dsp.low == 0x21) {
-		strcpy(j->caplist[j->caps].desc, "G.728 16Kbps");
+		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
+	/* 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/B");
+		strcpy(j->caplist[j->caps].desc, "G.729A 8kbps");
 		j->caplist[j->caps].captype = codec;
-		j->caplist[j->caps].cap = G728;
+		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 *u_pcreq)
+static int capabilities_check(IXJ *j, struct phone_capability *pcreq)
 {
 	int cnt;
 	int retval = 0;
-	struct phone_capability pcreq;
-	
-	if(copy_from_user(&pcreq, u_pcreq, sizeof(struct phone_capability)))
-		return -EFAULT;
-		
 	for (cnt = 0; cnt < j->caps; cnt++) {
-		if (pcreq.captype == j->caplist[cnt].captype
-		    && pcreq.cap == j->caplist[cnt].cap) {
+		if (pcreq->captype == j->caplist[cnt].captype
+		    && pcreq->cap == j->caplist[cnt].cap) {
 			retval = 1;
 			break;
 		}
@@ -4674,31 +6196,42 @@
 	return retval;
 }
 
-int ixj_ioctl(struct inode *inode, struct file *file_p, unsigned int cmd, unsigned long arg)
+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;
+
+	unsigned int raise, mant;
 	unsigned int minor = MINOR(inode->i_rdev);
-	unsigned int board = NUM(inode->i_rdev);
-	IXJ *j = ixj[board];
-	int retval = 0;
+	int board = NUM(inode->i_rdev);
 
-	if (ixjdebug > 1)
-		printk(KERN_DEBUG "phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
-	if (minor >= IXJMAX)
-		return -ENODEV;
+	IXJ *j = get_ixj(NUM(inode->i_rdev));
 
-	if (j == NULL) /* shouldn't happen! */
-		return -ENODEV;
+	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) {
+		set_current_state(TASK_INTERRUPTIBLE);
+		schedule_timeout(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:
-			return -EPERM;
+			retval = -EPERM;
 		}
 	}
 	switch (cmd) {
@@ -4713,12 +6246,11 @@
 		retval = j->serial;
 		break;
 	case IXJCTL_VERSION:
-		if (copy_to_user((char *) arg, ixj_c_revision, strlen(ixj_c_revision)))
-			return -EFAULT;
+		if (copy_to_user((char *) arg, ixj_c_revision, strlen(ixj_c_revision))) 
+			retval = -EFAULT;
 		break;
 	case PHONE_RING_CADENCE:
-		if(get_user(j->ring_cadence, (int *)arg))
-			return -EFAULT;
+		j->ring_cadence = arg;
 		break;
 	case IXJCTL_CIDCW:
 		if(arg) {
@@ -4729,13 +6261,18 @@
 		}
 		ixj_write_cidcw(j);
 		break;
-	/* Binary compatbility */
-	case OLD_PHONE_RING_START:
-		arg = 0;
-		/* Fall through */
-	case PHONE_RING_START:
+        /* Binary compatbility */
+        case OLD_PHONE_RING_START:
+                arg = 0;
+                /* Fall through */
+ 	case PHONE_RING_START:
 		if(arg) {
-			copy_from_user(&j->cid_send, (char *)arg, sizeof(PHONE_CID));
+			if(copy_from_user(&j->cid_send, (char *)arg, sizeof(PHONE_CID)))
+			{
+				retval = -EFAULT;
+				break;
+			}
+			ixj_write_cid(j);
 		}
 		else {
 			memset(&j->cid_send, 0, sizeof(PHONE_CID));
@@ -4744,6 +6281,9 @@
 		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:
@@ -4751,7 +6291,10 @@
 		break;
 	case PHONE_EXCEPTION:
 		retval = j->ex.bytes;
-		j->ex.bits.flash = 0;
+		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;
@@ -4767,7 +6310,7 @@
 		break;
 	case PHONE_HOOKSTATE:
 		j->ex.bits.hookstate = 0;
-		retval = j->r_hook;
+		retval = j->hookstate;  //j->r_hook;
 		break;
 	case IXJCTL_SET_LED:
 		LED_SetState(arg, j);
@@ -4799,9 +6342,33 @@
 			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;
@@ -4832,6 +6399,15 @@
 			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;
@@ -4921,31 +6497,31 @@
 			if (j->dtmf_rp != j->dtmf_wp) {
 				switch (j->dtmfbuffer[j->dtmf_rp]) {
 				case 10:
-					retval = 42;	//'*';
+					retval = 42;	/* '*'; */
 
 					break;
 				case 11:
-					retval = 48;	//'0';
+					retval = 48;	/*'0'; */
 
 					break;
 				case 12:
-					retval = 35;	//'#';
+					retval = 35;	/*'#'; */
 
 					break;
 				case 28:
-					retval = 65;	//'A';
+					retval = 65;	/*'A'; */
 
 					break;
 				case 29:
-					retval = 66;	//'B';
+					retval = 66;	/*'B'; */
 
 					break;
 				case 30:
-					retval = 67;	//'C';
+					retval = 67;	/*'C'; */
 
 					break;
 				case 31:
-					retval = 68;	//'D';
+					retval = 68;	/*'D'; */
 
 					break;
 				default:
@@ -4955,7 +6531,7 @@
 				j->dtmf_rp++;
 				if (j->dtmf_rp == 79)
 					j->dtmf_rp = 0;
-//          if(j->dtmf_rp == j->dtmf_wp)
+				if(j->dtmf_rp == j->dtmf_wp)
 				{
 					j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
 				}
@@ -4974,40 +6550,53 @@
 	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
-		};
-		if(copy_from_user(&pd, (void *)arg, sizeof(pd)))
-			return -EFAULT;
-		if(pd.type<1 || pd.type>12)
-			return -EPROTONOSUPPORT;
-		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((void *)arg, &pd, sizeof(pd)))
-			return -EFAULT;
-		return 0;
-	}
+        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, (void *)arg, 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((void *)arg, &pd, sizeof(pd)))
+                        retval = -EFAULT;
+        	break;
+        }
 	case IXJCTL_DSP_IDLE:
 		idle(j);
 		break;
 	case IXJCTL_MIXER:
-		ixj_mixer(arg, j);
+                if ((arg & 0xff) == 0xff)
+			retval = ixj_get_mixer(arg, j);
+                else
+			ixj_mixer(arg, j);
 		break;
 	case IXJCTL_DAA_COEFF_SET:
 		switch (arg) {
@@ -5039,7 +6628,6 @@
 			retval = 1;
 			break;
 		}
-		j->country = arg;
 		break;
 	case IXJCTL_DAA_AGAIN:
 		ixj_daa_cr4(j, arg | 0x02);
@@ -5051,8 +6639,8 @@
 		ixj_write_vmwi(j, arg);
 		break;
 	case IXJCTL_CID:
-		if (copy_to_user((char *) arg, &j->cid, sizeof(PHONE_CID)))
-			return -EFAULT;
+		if (copy_to_user((char *) arg, &j->cid, sizeof(PHONE_CID))) 
+			retval = -EFAULT;
 		j->ex.bits.caller_id = 0;
 		break;
 	case IXJCTL_WINK_DURATION:
@@ -5068,14 +6656,24 @@
 		retval = ixj_set_pots(j, arg);
 		break;
 	case PHONE_CAPABILITIES:
+		add_caps(j);
 		retval = j->caps;
 		break;
 	case PHONE_CAPABILITIES_LIST:
-		if (copy_to_user((char *) arg, j->caplist, sizeof(struct phone_capability) * j->caps))
-			 return -EFAULT;
+		add_caps(j);
+		if (copy_to_user((char *) arg, j->caplist, sizeof(struct phone_capability) * j->caps)) 
+			retval = -EFAULT;
 		break;
 	case PHONE_CAPABILITIES_CHECK:
-		retval = capabilities_check(j, (struct phone_capability *) arg);
+		{
+			struct phone_capability cap;
+			if (copy_from_user(&cap, (char *) arg, sizeof(cap))) 
+				retval = -EFAULT;
+			else {
+				add_caps(j);
+				retval = capabilities_check(j, &cap);
+			}
+		}
 		break;
 	case PHONE_PSTN_SET_STATE:
 		daa_set_mode(j, arg);
@@ -5085,12 +6683,20 @@
 		j->ex.bits.pstn_ring = 0;
 		break;
 	case IXJCTL_SET_FILTER:
-		if (copy_from_user(&jf, (char *) arg, sizeof(jf)))
-			return -EFAULT;
+		if (copy_from_user(&jf, (char *) arg, sizeof(jf))) 
+			retval = -EFAULT;
 		retval = ixj_init_filter(j, &jf);
 		break;
+	case IXJCTL_SET_FILTER_RAW:
+		if (copy_from_user(&jfr, (char *) arg, sizeof(jfr))) 
+			retval = -EFAULT;
+		retval = ixj_init_filter_raw(j, &jfr);
+		break;
 	case IXJCTL_GET_FILTER_HIST:
-		retval = j->filter_hist[arg];
+		if(arg<0||arg>3)
+			retval = -EINVAL;
+		else
+			retval = j->filter_hist[arg];
 		break;
 	case IXJCTL_INIT_TONE:
 		copy_from_user(&ti, (char *) arg, sizeof(ti));
@@ -5102,117 +6708,123 @@
 	case IXJCTL_FILTER_CADENCE:
 		retval = ixj_build_filter_cadence(j, (IXJ_FILTER_CADENCE *) arg);
 		break;
+	case IXJCTL_SIGCTL:
+		if (copy_from_user(&j->sigdef, (char *)arg, sizeof(IXJ_SIGDEF)))
+			retval = -EFAULT;
+		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 != j->intercom
-		    || ixj[arg]->intercom != board)
+		if(arg < 0 || arg >= IXJMAX)
 			return -EINVAL;
-
 		j->intercom = -1;
-		ixj[arg]->intercom = -1;
 		ixj_record_stop(j);
-		ixj_record_stop(ixj[arg]);
 		ixj_play_stop(j);
-		ixj_play_stop(ixj[arg]);
 		idle(j);
-		idle(ixj[arg]);
+		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 (ixj[arg] == NULL)
-			return -ENODEV;
-
+		if(arg < 0 || arg >= IXJMAX)
+			return -EINVAL;
 		j->intercom = arg;
-		ixj[arg]->intercom = board;
-		ixj_play_start(ixj[arg]);
 		ixj_record_start(j);
 		ixj_play_start(j);
-		ixj_record_start(ixj[arg]);
-		idle(j);
-		idle(ixj[arg]);
+		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 = ixj[NUM(file_p->f_dentry->d_inode->i_rdev)];
-
-	if (j == NULL) /* shouldn't happen! */
-		return -ENODEV;
+	IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode->i_rdev));
 
 	return fasync_helper(fd, file_p, mode, &j->async_queue);
 }
 
 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
+        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)
 {
 	unsigned long jifwait;
 
-	j->flags.incheck = 1;	// Testing
-	if (!j->flags.pots_correct) {
-		j->flags.pots_correct = 1;
-
-		daa_int_read(j);	//Clear DAA Interrupt flags
-		//
-		// Hold all relays in the normally de-energized position.
-		//
+	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 = 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
+		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;
+		daa_set_mode(j, SOP_PU_CONVERSATION);
+		jifwait = jiffies + hertz;
+		while (time_before(jiffies, jifwait)) {
+			set_current_state(TASK_INTERRUPTIBLE);
+			schedule_timeout(1);
+		}
+		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_pstn = 0;
-			j->pld_slicw.bits.rly1 = 0;
+			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 = 1;
+			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);
-			daa_set_mode(j, SOP_PU_CONVERSATION);
-			jifwait = jiffies + hertz;
-			while (time_before(jiffies, jifwait)) {
-				set_current_state(TASK_INTERRUPTIBLE);
-				schedule_timeout(1);
-			}
-			daa_int_read(j);
-			daa_set_mode(j, SOP_PU_SLEEP);
-			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);
-			}
 		}
 	}
-//      if (!j->flags.pstn_present) {
 	j->pld_slicw.bits.rly3 = 0;
 	outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
 	daa_set_mode(j, SOP_PU_CONVERSATION);
@@ -5222,13 +6834,13 @@
 		schedule_timeout(1);
 	}
 	daa_int_read(j);
-	daa_set_mode(j, SOP_PU_SLEEP);
+	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);
@@ -5242,36 +6854,39 @@
 			LED_SetState(0x5, j);
 		}
 	}
-	j->flags.incheck = 0;	// Testing
+	j->flags.pstncheck = 0;	/* Testing */
 	return j->flags.pstn_present;
 }
 
-static int ixj_selfprobe(IXJ *j, int cnt)
+static int ixj_selfprobe(IXJ *j)
 {
 	unsigned short cmd;
 	unsigned long jif;
-	int i;
+	int cnt;
 	BYTES bytes;
-	
-	init_waitqueue_head(&j->poll_q);
-	init_waitqueue_head(&j->read_q);
-	init_waitqueue_head(&j->write_q);
-	if (ixjdebug > 0)
+
+        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.
+	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
+/* The read values of the SSR should be 0x00 for the IDLE command */
 	if (j->ssr.low || j->ssr.high)
 		return -1;
-	if (ixjdebug > 0)
+	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 > 0)
+	if (ixjdebug & 0x0002)
 		printk(KERN_INFO "Get Device Version Code\n");
 	if (ixj_WriteDSPCommand(0x3800, j))		/* Get Device Version Code */
 		return -1;
@@ -5279,13 +6894,12 @@
 	j->ver.high = j->ssr.high;
 	if (!j->cardtype) {
 		if (j->dsp.low == 0x21) {
-//      j->XILINXbase = j->DSPbase + 0x10;
 			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
+/* 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
+			if (bytes.low == bytes.high)	/*  Register is read only on */
+				/*  Internet PhoneJack Lite */
 			 {
 				j->cardtype = QTI_PHONEJACK_LITE;
 				if (check_region(j->XILINXbase, 4)) {
@@ -5343,14 +6957,12 @@
 			break;
 		}
 	}
-	if (j->dsp.low == 0x20
-	    || j->cardtype == QTI_PHONEJACK_LITE
-	    || j->cardtype == QTI_PHONEJACK_PCI) {
-		if (ixjdebug > 0)
+	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 > 0)
+		if (ixjdebug & 0x0002)
 			printk(KERN_INFO "Write CODEC timing to Software Control Register\n");
 		if (j->cardtype == QTI_PHONEJACK) {
 			cmd = 0x9FF2;
@@ -5362,7 +6974,7 @@
 	} else {
 		if (set_base_frame(j, 30) != 30)
 			return -1;
-		if (ixjdebug > 0)
+		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 */
@@ -5371,7 +6983,7 @@
 		if (j->cardtype == QTI_LINEJACK) {
 			if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to Software Control Register */
 				return -1;
-			if (ixjdebug > 0)
+			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);
@@ -5379,7 +6991,7 @@
 	}
 
 	if (j->dsp.low == 0x20) {
-		if (ixjdebug > 0)
+		if (ixjdebug & 0x0002)
 			printk(KERN_INFO "Configure GPIO pins\n");
 		j->gpio.bytes.high = 0x09;
 /*  bytes.low = 0xEF;  0xF7 */
@@ -5391,7 +7003,7 @@
 		j->gpio.bits.gpio6 = 1;
 		j->gpio.bits.gpio7 = 1;
 		ixj_WriteDSPCommand(j->gpio.word, j);	/* Set GPIO pin directions */
-		if (ixjdebug > 0)
+		if (ixjdebug & 0x0002)
 			printk(KERN_INFO "Enable SLIC\n");
 		j->gpio.bytes.high = 0x0B;
 		j->gpio.bytes.low = 0x00;
@@ -5428,51 +7040,86 @@
 			}
 			LED_SetState(0x0, j);
 			daa_get_version(j);
-			if (ixjdebug > 0)
+			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->p.board);
-			ixj_daa_cid_reset(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
+				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 > 0)
+			if (ixjdebug & 0x0002)
 				printk(KERN_INFO "Enable Mixer\n");
-			ixj_mixer(0x0000, j);	//Master Volume Left unmute 0db
+			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(0x0100, j);	//Master Volume Right unmute 0db
+			ixj_mixer(0x0480, j);	/*FM Left mute */
+			ixj_mixer(0x0580, j);	/*FM Right mute */
 
-			ixj_mixer(0x0F00, j);	//Mono Out Volume unmute 0db
+			ixj_mixer(0x0680, j);	/*CD Left mute */
+			ixj_mixer(0x0780, j);	/*CD Right mute */
 
-			ixj_mixer(0x0C00, j);	//Mono1 Volume unmute 0db
+			ixj_mixer(0x0880, j);	/*Line Left mute */
+			ixj_mixer(0x0980, j);	/*Line Right mute */
 
-			ixj_mixer(0x0200, j);	//Voice Left Volume unmute 0db
+			ixj_mixer(0x0A80, j);	/*Aux left mute  */
+			ixj_mixer(0x0B80, j);	/*Aux right mute */
 
-			ixj_mixer(0x0300, j);	//Voice Right Volume unmute 0db
+			ixj_mixer(0x0C00, j);	/*Mono1 unmute 12db */
+			ixj_mixer(0x0D80, j);	/*Mono2 mute */
 
-			ixj_mixer(0x110C, j);	//Voice Left and Right out
+			ixj_mixer(0x0E80, j);	/*Mic mute */
 
-			ixj_mixer(0x1401, j);	//Mono1 switch on mixer left
+			ixj_mixer(0x0F00, j);	/*Mono Out Volume unmute 0db */
 
-			ixj_mixer(0x1501, j);	//Mono1 switch on mixer right
+			ixj_mixer(0x1000, j);	/*Voice Left and Right out only */
+			ixj_mixer(0x110C, j);
 
-			ixj_mixer(0x1700, j);	//Clock select
 
-			ixj_mixer(0x1800, j);	//ADC Source select
+			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) {
@@ -5482,6 +7129,7 @@
 			} else {
 				ixj_set_port(j, PORT_POTS);
 				SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
+/*				SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
 			}
 		}
 	}
@@ -5490,31 +7138,43 @@
 	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
+/* The read values of the SSR should be 0x00 for the IDLE command */
 	if (j->ssr.low || j->ssr.high)
 		return -1;
-	if (ixjdebug > 0)
+
+	if (ixjdebug & 0x0002)
 		printk(KERN_INFO "Enable Line Monitor\n");
-	if (ixjdebug > 0)
+
+	if (ixjdebug & 0x0002)
 		printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n");
-	if (ixj_WriteDSPCommand(0x7E01, j))		// Asynchronous Line Monitor
 
+	if (ixj_WriteDSPCommand(0x7E01, j))		/* Asynchronous Line Monitor */
 		return -1;
-	if (ixjdebug > 0)
+
+	if (ixjdebug & 0x002)
 		printk(KERN_INFO "Enable DTMF Detectors\n");
-	if (ixj_WriteDSPCommand(0x5151, j))		// Enable DTMF detection
 
+	if (ixj_WriteDSPCommand(0x5151, j))		/* Enable DTMF detection */
 		return -1;
-	if (ixj_WriteDSPCommand(0x6E01, j))		// Set Asyncronous Tone Generation
 
+	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
+	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;
@@ -5526,34 +7186,74 @@
 	j->drybuffer = 0;
 	j->winktime = 320;
 	j->flags.dtmf_oob = 0;
-	for (i = 0; i < 4; i++)
-		j->cadence_f[i].enable = 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.
+	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 = cnt;
+	j->p.board = j->board;
 	phone_register_device(&j->p, PHONE_UNIT_ANY);
-	add_caps(j);
+
+	ixj_init_timer(j);
+	ixj_add_timer(j);
 	return 0;
 }
 
-int ixj_get_status_proc(char *buf)
+/*
+ *	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, "\n%s", ixj_c_rcsid);
+	len += sprintf(buf + len, "%s", ixj_c_rcsid);
 	len += sprintf(buf + len, "\n%s", ixj_h_rcsid);
 	len += sprintf(buf + len, "\n%s", ixjuser_h_rcsid);
-	for (cnt = 0; cnt < IXJMAX; cnt++) {
-		j = ixj[cnt];
+	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 %d bytes", sizeof(IXJ));
+	len += sprintf(buf + len, "\nsizeof DAA struct %d bytes", sizeof(DAA_REGS));
+	len += sprintf(buf + len, "\nUsing old telephony API");
+	len += sprintf(buf + len, "\nDebug Level %d\n", ixjdebug);
 
-		if (j == NULL)
+	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);
@@ -5570,7 +7270,7 @@
 				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->country);
+				len += sprintf(buf + len, " Country = %d", j->daa_country);
 				break;
 			case (QTI_PHONEJACK_LITE):
 				len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK Lite");
@@ -5597,8 +7297,7 @@
 			}
 			len += sprintf(buf + len, "\nReaders %d", j->readers);
 			len += sprintf(buf + len, "\nWriters %d", j->writers);
-			/* FIXME: This makes no sense! */
-			len += sprintf(buf + len, "\nFSK words %d", ixj[2] ? ixj[2]->fskdcnt : 0);
+			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);
@@ -5607,11 +7306,6 @@
 			else
 				len += sprintf(buf + len, "\nCaller ID data not sent");
 
-			len += sprintf(buf + len, "\nCaller ID Date %s%s", j->cid_send.month, j->cid_send.day);
-			len += sprintf(buf + len, "\nCaller ID Time %s%s", j->cid_send.hour, j->cid_send.min);
-			len += sprintf(buf + len, "\nCaller ID Name %s", j->cid_send.name);
-			len += sprintf(buf + len, "\nCaller ID Number %s", j->cid_send.number);
-
 			len += sprintf(buf + len, "\nPlay CODEC ");
 			switch (j->play_codec) {
 			case G723_63:
@@ -5635,6 +7329,9 @@
 			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;
@@ -5677,6 +7374,9 @@
 			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;
@@ -5696,33 +7396,49 @@
 				len += sprintf(buf + len, "NO CODEC CHOSEN");
 				break;
 			}
+			len += sprintf(buf + len, "\nAEC ");
 			switch (j->aec_level) {
 			case AEC_OFF:
-				len += sprintf(buf + len, "\n AEC OFF");
+				len += sprintf(buf + len, "Off");
 				break;
 			case AEC_LOW:
-				len += sprintf(buf + len, "\n AEC LOW");
+				len += sprintf(buf + len, "Low");
 				break;
 			case AEC_MED:
-				len += sprintf(buf + len, "\n AEC MED");
+				len += sprintf(buf + len, "Med");
 				break;
 			case AEC_HIGH:
-				len += sprintf(buf + len, "\n 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, "\nHook state %d", j->r_hook);	// ixj_hookstate(cnt));
+
+			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);
-				len += sprintf(buf + len, "\nPSTN sleeptil %ld - jiffies %ld", j->pstn_sleeptil, jiffies);
 				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");
@@ -5731,6 +7447,16 @@
 					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:
@@ -5758,8 +7484,7 @@
 				case PLD_SLIC_STATE_ACTIVE:
 					len += sprintf(buf + len, "ACTIVE");
 					break;
-				case PLD_SLIC_STATE_OHT:	// On-hook transmit
-
+				case PLD_SLIC_STATE_OHT:	/* On-hook transmit */
 					len += sprintf(buf + len, "OHT");
 					break;
 				case PLD_SLIC_STATE_TIPOPEN:
@@ -5768,12 +7493,10 @@
 				case PLD_SLIC_STATE_STANDBY:
 					len += sprintf(buf + len, "STANDBY");
 					break;
-				case PLD_SLIC_STATE_APR:	// Active polarity reversal
-
+				case PLD_SLIC_STATE_APR:	/* Active polarity reversal */
 					len += sprintf(buf + len, "APR");
 					break;
-				case PLD_SLIC_STATE_OHTPR:	// OHT polarity reversal
-
+				case PLD_SLIC_STATE_OHTPR:	/* OHT polarity reversal */
 					len += sprintf(buf + len, "OHTPR");
 					break;
 				default:
@@ -5781,16 +7504,24 @@
 					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, "\nBase Frame %2.2x.%2.2x", j->baseframe.high, j->baseframe.low);
 			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");
 		}
@@ -5798,19 +7529,6 @@
 	return len;
 }
 
-int ixj_get_status_proc_fsk(char *buf)
-{
-	int len;
-	len = 0;
-
-	/* This makes no sense - why is ixj[2] special? */
-	if (ixj[2] != NULL && ixj[2]->fskdcnt) {
-		memcpy(buf, &ixj[2]->fskdata, (ixj[2]->fskdcnt) * 2);
-		len += ixj[2]->fskdcnt * 2;
-	}
-	return len;
-}
-
 static int ixj_read_proc(char *page, char **start, off_t off,
                               int count, int *eof, void *data)
 {
@@ -5823,409 +7541,92 @@
         return len;
 }
 
-static int ixj_read_proc_fsk(char *page, char **start, off_t off,
-                              int count, int *eof, void *data)
-{
-        int len = ixj_get_status_proc_fsk(page);
-        if (len <= off+count) *eof = 1;
-        *start = page + off;
-        len -= off;
-        if (len>count) len = count;
-        if (len<0) len = 0;
-        return len;
-}
-
-MODULE_DESCRIPTION("Internet Phone/Internet LineJack module - www.quicknet.net");
-MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
-
-#if defined(CONFIG_PCMCIA) || defined(CONFIG_PCMCIA_MODULE)
-
-#ifdef PCMCIA_DEBUG
-static int pc_debug = PCMCIA_DEBUG;
-MODULE_PARM(pc_debug, "i");
-#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
-#else
-#define DEBUG(n, args...)
-#endif /* PCMCIA_DEBUG */
-
-typedef struct ixj_info_t {
-	int ndev;
-	dev_node_t node;
-	struct ixj *port;
-} ixj_info_t;
-static dev_link_t *ixj_attach(void);
-static void ixj_detach(dev_link_t *);
-static void ixj_config(dev_link_t * link);
-static void ixj_cs_release(u_long arg);
-static int ixj_event(event_t event, int priority, event_callback_args_t * args);
-static dev_info_t dev_info = "ixj_cs";
-static dev_link_t *dev_list = NULL;
-static void cs_error(client_handle_t handle, int func, int ret)
-{
-	error_info_t err =
-	{
-		func, ret
-	};
-	CardServices(ReportError, handle, &err);
-}
-
-static dev_link_t *ixj_attach(void)
-{
-	client_reg_t client_reg;
-	dev_link_t *link;
-	int ret;
-	DEBUG(0, "ixj_attach()\n");
-	/* Create new ixj device */
-	link = kmalloc(sizeof(struct dev_link_t), GFP_KERNEL);
-	if (!link)
-		return NULL;
-	memset(link, 0, sizeof(struct dev_link_t));
-	link->release.function = &ixj_cs_release;
-	link->release.data = (u_long) link;
-	link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-	link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
-	link->io.IOAddrLines = 3;
-	link->conf.Vcc = 50;
-	link->conf.IntType = INT_MEMORY_AND_IO;
-	link->priv = kmalloc(sizeof(struct ixj_info_t), GFP_KERNEL);
-	if (!link->priv)
-		return NULL;
-	memset(link->priv, 0, sizeof(struct ixj_info_t));
-	/* Register with Card Services */
-	link->next = dev_list;
-	dev_list = link;
-	client_reg.dev_info = &dev_info;
-	client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE;
-	client_reg.EventMask =
-	    CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL |
-	    CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET |
-	    CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;
-	client_reg.event_handler = &ixj_event;
-	client_reg.Version = 0x0210;
-	client_reg.event_callback_args.client_data = link;
-	ret = CardServices(RegisterClient, &link->handle, &client_reg);
-	if (ret != CS_SUCCESS) {
-		cs_error(link->handle, RegisterClient, ret);
-		ixj_detach(link);
-		return NULL;
-	}
-	return link;
-}
-
-static void ixj_detach(dev_link_t * link)
-{
-	dev_link_t **linkp;
-	long flags;
-	int ret;
-	DEBUG(0, "ixj_detach(0x%p)\n", link);
-	for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next)
-		if (*linkp == link)
-			break;
-	if (*linkp == NULL)
-		return;
-	save_flags(flags);
-	cli();
-	if (link->state & DEV_RELEASE_PENDING) {
-		del_timer(&link->release);
-		link->state &= ~DEV_RELEASE_PENDING;
-	}
-	restore_flags(flags);
-	if (link->state & DEV_CONFIG)
-		ixj_cs_release((u_long) link);
-	if (link->handle) {
-		ret = CardServices(DeregisterClient, link->handle);
-		if (ret != CS_SUCCESS)
-			cs_error(link->handle, DeregisterClient, ret);
-	}
-	/* Unlink device structure, free bits */
-	*linkp = link->next;
-	kfree(link->priv);
-	kfree(link);
-}
-
-#define CS_CHECK(fn, args...) \
-while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
-
-#define CFG_CHECK(fn, args...) \
-if (CardServices(fn, args) != 0) goto next_entry
-
-void ixj_get_serial(dev_link_t * link, IXJ * j)
-{
-	client_handle_t handle;
-	tuple_t tuple;
-	u_short buf[128];
-	char *str;
-	int last_ret, last_fn, i, place;
-	handle = link->handle;
-	DEBUG(0, "ixj_get_serial(0x%p)\n", link);
-	tuple.TupleData = (cisdata_t *) buf;
-	tuple.TupleOffset = 0;
-	tuple.TupleDataMax = 80;
-	tuple.Attributes = 0;
-	tuple.DesiredTuple = CISTPL_VERS_1;
-	CS_CHECK(GetFirstTuple, handle, &tuple);
-	CS_CHECK(GetTupleData, handle, &tuple);
-	str = (char *) buf;
-	printk("PCMCIA Version %d.%d\n", str[0], str[1]);
-	str += 2;
-	printk("%s", str);
-	str = str + strlen(str) + 1;
-	printk(" %s", str);
-	str = str + strlen(str) + 1;
-	place = 1;
-	for (i = strlen(str) - 1; i >= 0; i--) {
-		switch (str[i]) {
-		case '0':
-		case '1':
-		case '2':
-		case '3':
-		case '4':
-		case '5':
-		case '6':
-		case '7':
-		case '8':
-		case '9':
-			j->serial += (str[i] - 48) * place;
-			break;
-		case 'A':
-		case 'B':
-		case 'C':
-		case 'D':
-		case 'E':
-		case 'F':
-			j->serial += (str[i] - 55) * place;
-			break;
-		case 'a':
-		case 'b':
-		case 'c':
-		case 'd':
-		case 'e':
-		case 'f':
-			j->serial += (str[i] - 87) * place;
-			break;
-		}
-		place = place * 0x10;
-	}
-	str = str + strlen(str) + 1;
-	printk(" version %s\n", str);
-      cs_failed:
-	return;
-}
-
-void ixj_config(dev_link_t * link)
-{
-	IXJ *j;
-	client_handle_t handle;
-	ixj_info_t *info;
-	tuple_t tuple;
-	u_short buf[128];
-	cisparse_t parse;
-	config_info_t conf;
-	cistpl_cftable_entry_t *cfg = &parse.cftable_entry;
-	cistpl_cftable_entry_t dflt =
-	{
-		0
-	};
-	int last_ret, last_fn;
-	handle = link->handle;
-	info = link->priv;
-	DEBUG(0, "ixj_config(0x%p)\n", link);
-	tuple.TupleData = (cisdata_t *) buf;
-	tuple.TupleOffset = 0;
-	tuple.TupleDataMax = 255;
-	tuple.Attributes = 0;
-	tuple.DesiredTuple = CISTPL_CONFIG;
-	CS_CHECK(GetFirstTuple, handle, &tuple);
-	CS_CHECK(GetTupleData, handle, &tuple);
-	CS_CHECK(ParseTuple, handle, &tuple, &parse);
-	link->conf.ConfigBase = parse.config.base;
-	link->conf.Present = parse.config.rmask[0];
-	link->state |= DEV_CONFIG;
-	CS_CHECK(GetConfigurationInfo, handle, &conf);
-	tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
-	tuple.Attributes = 0;
-	CS_CHECK(GetFirstTuple, handle, &tuple);
-	while (1) {
-		CFG_CHECK(GetTupleData, handle, &tuple);
-		CFG_CHECK(ParseTuple, handle, &tuple, &parse);
-		if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) {
-			cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io;
-			link->conf.ConfigIndex = cfg->index;
-			link->io.BasePort1 = io->win[0].base;
-			link->io.NumPorts1 = io->win[0].len;
-			if (io->nwin == 2) {
-				link->io.BasePort2 = io->win[1].base;
-				link->io.NumPorts2 = io->win[1].len;
-			}
-			CFG_CHECK(RequestIO, link->handle, &link->io);
-			/* If we've got this far, we're done */
-			break;
-		}
-	      next_entry:
-		if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
-			dflt = *cfg;
-		CS_CHECK(GetNextTuple, handle, &tuple);
-	}
-
-	CS_CHECK(RequestConfiguration, handle, &link->conf);
-
-	
-	if ((j = kmalloc(sizeof(*j), GFP_KERNEL)) == NULL)
-		goto cs_failed;
-
-	ixj[0] = j;
-
-	j->DSPbase = link->io.BasePort1;
-	j->XILINXbase = link->io.BasePort1 + 0x10;
-	j->cardtype = QTI_PHONECARD;
-	ixj_selfprobe(j, 0);
-
-	info->ndev = 1;
-	info->node.major = PHONE_MAJOR;
-	link->dev = &info->node;
-	ixj_get_serial(link, j);
-	link->state &= ~DEV_CONFIG_PENDING;
-	return;
-
-      cs_failed:
-	cs_error(link->handle, last_fn, last_ret);
-	ixj_cs_release((u_long) link);
-}
-
-void ixj_cs_release(u_long arg)
-{
-	dev_link_t *link = (dev_link_t *) arg;
-	ixj_info_t *info = link->priv;
-	DEBUG(0, "ixj_cs_release(0x%p)\n", link);
-	info->ndev = 0;
-	link->dev = NULL;
-	CardServices(ReleaseConfiguration, link->handle);
-	CardServices(ReleaseIO, link->handle, &link->io);
-	link->state &= ~DEV_CONFIG;
-
-	kfree(ixj[0]);
-	ixj[0] = NULL;
-}
-
-int ixj_event(event_t event, int priority, event_callback_args_t * args)
-{
-	dev_link_t *link = args->client_data;
-	DEBUG(1, "ixj_event(0x%06x)\n", event);
-	switch (event) {
-	case CS_EVENT_CARD_REMOVAL:
-		link->state &= ~DEV_PRESENT;
-		if (link->state & DEV_CONFIG) {
-			link->release.expires = jiffies + (HZ / 20);
-			link->state |= DEV_RELEASE_PENDING;
-			add_timer(&link->release);
-		}
-		break;
-	case CS_EVENT_CARD_INSERTION:
-		link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
-		ixj_config(link);
-		break;
-	case CS_EVENT_PM_SUSPEND:
-		link->state |= DEV_SUSPEND;
-		/* Fall through... */
-	case CS_EVENT_RESET_PHYSICAL:
-		if (link->state & DEV_CONFIG)
-			CardServices(ReleaseConfiguration, link->handle);
-		break;
-	case CS_EVENT_PM_RESUME:
-		link->state &= ~DEV_SUSPEND;
-		/* Fall through... */
-	case CS_EVENT_CARD_RESET:
-		if (DEV_OK(link))
-			CardServices(RequestConfiguration, link->handle, &link->conf);
-		break;
-	}
-	return 0;
-}
-
-#endif /* CONFIG_PCMCIA */
 
 static void cleanup(void)
 {
 	int cnt;
-	del_timer(&ixj_timer);
-	for (cnt = 0; cnt < IXJMAX; cnt++) {
-		IXJ *j = ixj[cnt];
-
-		if (j == NULL)
-			continue;
+	IXJ *j;
 
-		if (j->cardtype == QTI_LINEJACK) {
-			j->pld_scrw.bits.daafsyncen = 0;	// Turn off DAA Frame Sync
+	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);
-			release_region(j->XILINXbase, 8);
-		}
-		if (j->cardtype == QTI_PHONEJACK_LITE
-		    || j->cardtype == QTI_PHONEJACK_PCI) {
-			release_region(j->XILINXbase, 4);
-		}
-		if (j->DSPbase) {
-			release_region(j->DSPbase, 16);
+				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);
+			}
+			if (j->read_buffer)
+				kfree(j->read_buffer);
+			if (j->write_buffer)
+				kfree(j->write_buffer);
+			if (j->dev && j->dev->deactivate)
+				j->dev->deactivate(j->dev);
+			if (ixjdebug & 0x0002)
+				printk(KERN_INFO "IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt);
 			phone_unregister_device(&j->p);
-		}
-		if (j->read_buffer)
-			kfree(j->read_buffer);
-		if (j->write_buffer)
-			kfree(j->write_buffer);
-#ifdef CONFIG_ISAPNP
-		if (j->dev)
-			j->dev->deactivate(j->dev);
-#endif
-#ifdef CONFIG_PCMCIA
-		DEBUG(0, "ixj_cs: unloading\n");
-		unregister_pcmcia_driver(&dev_info);
-		while (dev_list != NULL)
-			ixj_detach(dev_list);
+			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
-
-		kfree(j);
-		ixj[cnt] = NULL;
+		}
 	}
+	if (ixjdebug & 0x0002)
+		printk(KERN_INFO "IXJ: Removing /proc/ixj\n");
 	remove_proc_entry ("ixj", NULL);
-	remove_proc_entry ("ixjfsk", NULL);
 }
 
-// Typedefs
+/* 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
+	outb(lastLCC, wEEPROMAddress);	/*set data out bit as appropriate */
 
-	udelay(1000);
+	mdelay(1);
 	lastLCC = lastLCC | 0x01;
-	outb(lastLCC, wEEPROMAddress);	//SK rising edge
+	outb(lastLCC, wEEPROMAddress);	/*SK rising edge */
 
 	byData = byData << 1;
 	lastLCC = lastLCC & 0xfe;
-	udelay(1000);
-	outb(lastLCC, wEEPROMAddress);	//after delay, SK falling edge
+	mdelay(1);
+	outb(lastLCC, wEEPROMAddress);	/*after delay, SK falling edge */
 
 }
 
 static BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC)
 {
-	udelay(1000);
+	mdelay(1);
 	lastLCC = lastLCC | 0x01;
-	outb(lastLCC, wEEPROMAddress);	//SK rising edge
+	outb(lastLCC, wEEPROMAddress);	/*SK rising edge */
 
 	lastLCC = lastLCC & 0xfe;
-	udelay(1000);
-	outb(lastLCC, wEEPROMAddress);	//after delay, SK falling edge
+	mdelay(1);
+	outb(lastLCC, wEEPROMAddress);	/*after delay, SK falling edge */
 
 	return ((inb(wEEPROMAddress) >> 3) & 1);
 }
@@ -6240,9 +7641,9 @@
 	lastLCC = inb(wEEPROMAddress);
 	lastLCC = lastLCC | 0x02;
 	lastLCC = lastLCC & 0xfe;
-	outb(lastLCC, wEEPROMAddress);	// CS hi, SK lo
+	outb(lastLCC, wEEPROMAddress);	/* CS hi, SK lo */
 
-	udelay(1000);		// delay
+	mdelay(1);		/* delay */
 
 	PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
 	PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
@@ -6257,10 +7658,10 @@
 		*pwResult = (*pwResult << 1) | byResult;
 	}
 
-	udelay(1000);		// another delay
+	mdelay(1);		/* another delay */
 
 	lastLCC = lastLCC & 0xfd;
-	outb(lastLCC, wEEPROMAddress);	// negate CS
+	outb(lastLCC, wEEPROMAddress);	/* negate CS */
 
 	return 0;
 }
@@ -6275,51 +7676,31 @@
 	return (((DWORD) wHi << 16) | wLo);
 }
 
-#ifndef CONFIG_ISAPNP
-static int dspio[IXJMAX + 1];
-static int xio[IXJMAX + 1];
+static int dspio[IXJMAX + 1] =
+{
+	0,
+};
+static int xio[IXJMAX + 1] =
+{
+	0,
+};
 
 MODULE_PARM(dspio, "1-" __MODULE_STRING(IXJMAX) "i");
 MODULE_PARM(xio, "1-" __MODULE_STRING(IXJMAX) "i");
-#endif
+MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net");
+MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
+MODULE_LICENSE("GPL");
 
 void ixj_exit(void)
 {
-	cleanup();
-}
-
-#if defined(CONFIG_PCMCIA)
-int __init ixj_register_pcmcia(void)
-{
-	servinfo_t serv;
-
-	DEBUG(0, "%s\n", version);
-	CardServices(GetCardServicesInfo, &serv);
-	if (serv.Revision != CS_RELEASE_CODE) {
-		printk(KERN_NOTICE "ixj_cs: Card Services release does not match!\n");
-		return -EINVAL;
-	}
-	register_pcmcia_driver(&dev_info, &ixj_attach, &ixj_detach);
-	return 0;
-}
-#else
-extern __inline__ int ixj_register_pcmcia(void)
-{
-	return 0;
-}
-#endif /* CONFIG_PCMCIA */
-
-#if defined(CONFIG_ISAPNP)
-extern __inline__ int ixj_probe_isa(int *cnt)
-{
-	return 0;
+        cleanup();
 }
 
 int __init ixj_probe_isapnp(int *cnt)
-{
+{               
 	int probe = 0;
 	int func = 0x110;
-	struct pci_dev *dev = NULL, *old_dev = NULL;
+        struct pci_dev *dev = NULL, *old_dev = NULL;
 
 	while (1) {
 		do {
@@ -6328,7 +7709,7 @@
 
 			old_dev = dev;
 			dev = isapnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'),
-					      ISAPNP_FUNCTION(func), old_dev);
+					 ISAPNP_FUNCTION(func), old_dev);
 			if (!dev)
 				break;
 			result = dev->prepare(dev);
@@ -6348,28 +7729,17 @@
 				return -ENOMEM;
 			}
 
-			/* DSP base */
-			if ((result = check_region(dev->resource[0].start, 16)) < 0) {
-				printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n",
-				       dev->resource[0].start);
-				cleanup();
-				return result;
-			}
-
-			if ((j = kmalloc(sizeof(*j), GFP_KERNEL)) == NULL) {
-				cleanup();
-				return -ENOMEM;
+			result = check_region(dev->resource[0].start, 16);
+			if (result) {
+				printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", dev->resource[0].start);
+				break;
 			}
 
-			ixj[*cnt] = j;
-
-			j->DSPbase = dev->resource[0].start;
-
-			/* XXX is this racy? */
+			j = ixj_alloc();
 			request_region(j->DSPbase, 16, "ixj DSP");
 
 			if (func != 0x110)
-				j->XILINXbase = dev->resource[1].start;
+				j->XILINXbase = dev->resource[1].start;	/* get real port */
 
 			switch (func) {
 			case (0x110):
@@ -6382,23 +7752,22 @@
 				j->cardtype = QTI_PHONEJACK_LITE;
 				break;
 			}
-			probe = ixj_selfprobe(j, *cnt);
-			
-			j->serial = dev->bus->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;
+			j->board = *cnt;
+			probe = ixj_selfprobe(j);
+			if(!probe) {
+				j->serial = dev->bus->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);
@@ -6410,15 +7779,9 @@
 			func = 0x310;
 		dev = NULL;
 	}
-
 	return probe;
 }
-#else
-extern __inline__ int ixj_probe_isapnp(int *cnt)
-{
-	return 0;
-}
-
+                        
 int __init ixj_probe_isa(int *cnt)
 {
 	int i, result, probe;
@@ -6428,17 +7791,12 @@
 		if (dspio[i]) {
 			IXJ *j;
 
-			if ((result = check_region(dspio[i], 16)) < 0) {
-				printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", dspio[i]);
-				cleanup();
-				return result;
+			if ((result = check_region(ixj[*cnt].DSPbase, 16)) < 0) {
+				printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", ixj[*cnt].DSPbase);
+				break;
 			}
 
-			if ((j = kmalloc(sizeof(*j), GFP_KERNEL)) == NULL) {
-				cleanup();
-				return -ENOMEM;
-			}
-			ixj[*cnt] = j;
+			j = ixj_alloc();
 
 			j->DSPbase = dspio[i];
 			request_region(j->DSPbase, 16, "ixj DSP");
@@ -6446,78 +7804,64 @@
 			j->XILINXbase = xio[i];
 			j->cardtype = 0;
 
-			probe = ixj_selfprobe(j, *cnt);
+			j->board = *cnt;
+			probe = ixj_selfprobe(j);
 			j->dev = NULL;
-
 			++*cnt;
 		}
 	}
-
 	return 0;
 }
-#endif /* CONFIG_ISAPNP */
 
-#if defined(CONFIG_PCI)
 int __init ixj_probe_pci(int *cnt)
 {
-	struct pci_dev *pci = NULL;
+	struct pci_dev *pci = NULL;   
 	int i, probe = 0;
+	IXJ *j = NULL;
+	int result;
+
+	if(!pci_present())
+		return 0;
 
 	for (i = 0; i < IXJMAX - *cnt; i++) {
 		pci = pci_find_device(0x15E2, 0x0500, pci);
 		if (!pci)
 			break;
+
 		if (pci_enable_device(pci))
 			break;
-		{
-			IXJ *j;
-			int result;
-
-			if ((result = check_region(pci_resource_start(pci, 0), 16)) < 0) {
-				printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n",
-				       pci_resource_start(pci, 0));
-				cleanup();
-				return result;
-			}
-
-			if ((j = kmalloc(sizeof(*j), GFP_KERNEL)) == NULL) {
-				cleanup();
-				return -ENOMEM;
-			}
-			ixj[*cnt] = j;
-
-			j->DSPbase = pci_resource_start(pci, 0);
-			request_region(j->DSPbase, 16, "ixj DSP");
-
-			j->XILINXbase = j->DSPbase + 0x10;
-			j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2);
-			j->cardtype = QTI_PHONEJACK_PCI;
-
-			probe = ixj_selfprobe(j, *cnt);
-			if (probe)
-				printk(KERN_INFO "ixj: found Internet PhoneJACK PCI at 0x%x\n", j->DSPbase);
-			++*cnt;
+		if ((result = check_region(pci_resource_start(pci, 0), 16)) < 0) {
+			printk(KERN_INFO "ixj: can't get I/O address\n");
+			break;
 		}
-	}
 
+		/* Grab a device slot */	
+		j = ixj_alloc();
+		if(j == NULL)
+			break;
+	
+		j->DSPbase = pci_resource_start(pci, 0);
+		j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2);
+		j->XILINXbase = j->DSPbase + 0x10;
+		request_region(j->DSPbase, 16, "ixj DSP");
+		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;
 }
-#else
-extern __inline__ int ixj_probe_pci(int *cnt)
-{
-	return 0;
-}
-#endif /* CONFIG_PCI */
 
 int __init ixj_init(void)
 {
 	int cnt = 0;
-	int probe = 0;
+	int probe = 0;   
+
+	cnt = 0;
 
 	/* These might be no-ops, see above. */
-	if ((probe = ixj_register_pcmcia()) < 0) {
-		return probe;
-	}
 	if ((probe = ixj_probe_isapnp(&cnt)) < 0) {
 		return probe;
 	}
@@ -6528,16 +7872,9 @@
 		if ((probe = ixj_probe_pci(&cnt)) < 0) {
 			return probe;
 		}
-      	}
-
+	}
 	printk("%s\n", ixj_c_rcsid);
-
 	create_proc_read_entry ("ixj", 0, NULL, ixj_read_proc, NULL);
-	create_proc_read_entry ("ixjfsk", 0, NULL, ixj_read_proc_fsk, NULL);
-
-	ixj_init_timer();
-	ixj_add_timer();
-
 	return probe;
 }
 
@@ -6549,112 +7886,138 @@
 	int i;
 
 	j->daa_country = DAA_US;
-	//-----------------------------------------------
-	// CAO
+	/*----------------------------------------------- */
+	/* 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] = 0x0E;
-	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0x32;
-	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2;
-	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2F;
-	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xC2;
-	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x5A;
-	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xC0;
+/* 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] = 0x72;
-	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x85;
+/* 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] = 0x0E;
-	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x2B;
-	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[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] = 0x03;
-	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F;
-	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x48;
-	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0xF2;
-	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x8F;
-	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x48;
-	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x70;
+/* 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] = 0x04;
-	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] = 0x7F;
-	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9B;
-	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA;
+/* 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] = 0x16;
-	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x55;
+/* 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] = 0x52;
-	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xD3;
-	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x11;
-	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x42;
-// Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98
+/* 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] = 0xB3;
+	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
+/* 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] = 0xF2;
-	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x33;
-	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xA0;
-	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x68;
+	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] = 0x8A;
-	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAD;
-// Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB
+	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] = 0xDA;
-	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x54;
-	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xA4;
-	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA;
-	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2D;
-	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBB;
-// ;  (10K, 0.68uF)
-	// 
-	// Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23
+	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] = 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[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] = 0x13;
-	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42;
+	/* 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] = 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[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] = 0xB2;
-	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
+
+	/* 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;
-// Caller ID 1st Tone           (0E):CA,0E,CA,09,99,99,99,99
+
+	/* 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;
@@ -6663,7 +8026,7 @@
 	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
+/* 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;
@@ -6672,56 +8035,56 @@
 	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
+/*  */
+	/* ;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
+/* Config. Reg. 1 (dialing)       (cr1):05 */
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
-// Config. Reg. 2 (caller ID)     (cr2):04
+/* 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 = 0x03;
-// Config. Reg. 4 (analog gain)   (cr4):01
-	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;		//0x01;
-	// 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
+/* 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):1C // Cadence, RING, Caller ID, VDD_OK
+	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
+/* 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 = 0x12;		//0x32;
-	// Ext. Reg. 4 (Cadence)          (xr4):00
+/* 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
+/* Ext. Reg. 5 (Ring timer)       (xr5):22 */
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
-// Ext. Reg. 6 (Power State)      (xr6):00
+/* 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  
+/* 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  
+/* 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;
@@ -6733,13 +8096,13 @@
 	int i;
 
 	j->daa_country = DAA_UK;
-	//-----------------------------------------------
-	// CAO
+	/*----------------------------------------------- */
+	/* 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
+/*  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;
@@ -6748,7 +8111,7 @@
 	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
+/* 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;
@@ -6757,7 +8120,7 @@
 	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
+/* 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;
@@ -6766,7 +8129,7 @@
 	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
+/* 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;
@@ -6775,17 +8138,17 @@
 	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
+/* 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
+/* 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
+/* 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;
@@ -6794,7 +8157,7 @@
 	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
+/* 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;
@@ -6803,7 +8166,7 @@
 	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
+/* 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;
@@ -6812,8 +8175,8 @@
 	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
+/* ; 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;
@@ -6822,7 +8185,7 @@
 	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
+/* 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;
@@ -6831,12 +8194,12 @@
 	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?
+/* 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
+/* 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;
@@ -6845,7 +8208,7 @@
 	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
+/* 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;
@@ -6854,53 +8217,53 @@
 	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 = 0xFE;
-// Config. Reg. 1 (dialing)        (cr1):05
+/* ;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
+/* Config. Reg. 2 (caller ID)      (cr2):04 */
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
-// Config. Reg. 3 (testloops)      (cr3):00        ; 
+/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
-// Config. Reg. 4 (analog gain)    (cr4):01
-	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;		//0x01;
-	// 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
+/* 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_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.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        ; 
+/* Ext. Reg. 3 (DC Char)           (xr3):36        ;  */
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
-// Ext. Reg. 4 (Cadence)           (xr4):00
+/* Ext. Reg. 4 (Cadence)           (xr4):00 */
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
-// Ext. Reg. 5 (Ring timer)        (xr5):22
+/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
-// Ext. Reg. 6 (Power State)       (xr6):00
+/* 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  
+/* 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  
+/* 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;
@@ -6913,13 +8276,13 @@
 	int i;
 
 	j->daa_country = DAA_FRANCE;
-	//-----------------------------------------------
-	// CAO
+	/*----------------------------------------------- */
+	/* 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
+/* 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;
@@ -6928,7 +8291,7 @@
 	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
+/* 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;
@@ -6937,7 +8300,7 @@
 	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
+/* 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;
@@ -6946,7 +8309,7 @@
 	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
+/* 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;
@@ -6955,17 +8318,17 @@
 	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
+/* 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
+/* 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
+/* 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;
@@ -6974,7 +8337,7 @@
 	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
+/* 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;
@@ -6983,7 +8346,7 @@
 	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
+/* 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;
@@ -6992,8 +8355,8 @@
 	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
+/* ; 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;
@@ -7002,7 +8365,7 @@
 	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
+/* 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;
@@ -7011,12 +8374,12 @@
 	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
+/* 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
+/* 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;
@@ -7025,7 +8388,7 @@
 	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
+/* 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;
@@ -7034,53 +8397,53 @@
 	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 = 0xFE;
-// Config. Reg. 1 (dialing)        (cr1):05
+/* ;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
+/* Config. Reg. 2 (caller ID)      (cr2):04 */
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
-// Config. Reg. 3 (testloops)      (cr3):00        ; 
+/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
-// Config. Reg. 4 (analog gain)    (cr4):01
-	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;		//0x01;
-	// 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
+/* 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_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.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        ; 
+/* Ext. Reg. 3 (DC Char)           (xr3):36        ;  */
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
-// Ext. Reg. 4 (Cadence)           (xr4):00
+/* Ext. Reg. 4 (Cadence)           (xr4):00 */
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
-// Ext. Reg. 5 (Ring timer)        (xr5):22
+/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
-// Ext. Reg. 6 (Power State)       (xr6):00
+/* 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  
+/* 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  
+/* 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;
@@ -7093,13 +8456,13 @@
 	int i;
 
 	j->daa_country = DAA_GERMANY;
-	//-----------------------------------------------
-	// CAO
+	/*----------------------------------------------- */
+	/* 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
+/* 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;
@@ -7108,7 +8471,7 @@
 	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
+/* 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;
@@ -7117,7 +8480,7 @@
 	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
+/* 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;
@@ -7126,7 +8489,7 @@
 	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
+/* 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;
@@ -7135,17 +8498,17 @@
 	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
+/* 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
+/* 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
+/* 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;
@@ -7154,7 +8517,7 @@
 	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
+/* 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;
@@ -7163,7 +8526,7 @@
 	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
+/* 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;
@@ -7172,8 +8535,8 @@
 	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
+/* ;  (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;
@@ -7182,7 +8545,7 @@
 	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
+/* 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;
@@ -7191,12 +8554,12 @@
 	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      
+/* 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
+/* 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;
@@ -7205,7 +8568,7 @@
 	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
+/* 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;
@@ -7214,53 +8577,53 @@
 	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 = 0xFE;
-// Config. Reg. 1 (dialing)        (cr1):05 ; Manual Ring, Ring metering enabled
+/* ;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
+/* 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
+/* 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):01
-	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;		//0x01;
-	// 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
+/* 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_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.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
+/* 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
+/* Ext. Reg. 4 (Cadence)           (xr4):00 */
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
-// Ext. Reg. 5 (Ring timer)        (xr5):22
+/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
-// Ext. Reg. 6 (Power State)       (xr6):00
+/* 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  
+/* 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  
+/* 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;
@@ -7273,13 +8636,13 @@
 	int i;
 
 	j->daa_country = DAA_AUSTRALIA;
-	//-----------------------------------------------
-	// CAO
+	/*----------------------------------------------- */
+	/* 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
+/* 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;
@@ -7288,7 +8651,7 @@
 	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
+/* 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;
@@ -7297,7 +8660,7 @@
 	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
+/* 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;
@@ -7306,7 +8669,7 @@
 	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
+/* 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;
@@ -7315,17 +8678,17 @@
 	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
+/* 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
+/* 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
+/* 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;
@@ -7334,7 +8697,7 @@
 	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
+/* 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;
@@ -7343,7 +8706,7 @@
 	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
+/* 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;
@@ -7352,8 +8715,8 @@
 	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
+/* ;  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;
@@ -7362,7 +8725,7 @@
 	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
+/* 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;
@@ -7371,12 +8734,12 @@
 	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
+/* 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
+/* 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;
@@ -7385,7 +8748,7 @@
 	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
+/* 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;
@@ -7394,53 +8757,54 @@
 	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
+/* ;CR Registers */
+	/* Config. Reg. 0 (filters)        (cr0):FF */
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
-// Config. Reg. 1 (dialing)        (cr1):05
+/* Config. Reg. 1 (dialing)        (cr1):05 */
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
-// Config. Reg. 2 (caller ID)      (cr2):04
+/* Config. Reg. 2 (caller ID)      (cr2):04 */
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
-// Config. Reg. 3 (testloops)      (cr3):00        ; 
+/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
-// Config. Reg. 4 (analog gain)    (cr4):01
-	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;		//0x01;
-	// 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
+/* 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_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.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      ; 
+/* Ext. Reg. 3 (DC Char)           (xr3):2B      ;  */
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x2B;
-// Ext. Reg. 4 (Cadence)           (xr4):00
+/* Ext. Reg. 4 (Cadence)           (xr4):00 */
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
-// Ext. Reg. 5 (Ring timer)        (xr5):22
+/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
-// Ext. Reg. 6 (Power State)       (xr6):00
+/* 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  
+/* 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  
+
+	/* 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;
@@ -7452,13 +8816,13 @@
 	int i;
 
 	j->daa_country = DAA_JAPAN;
-	//-----------------------------------------------
-	// CAO
+	/*----------------------------------------------- */
+	/* 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
+/* 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;
@@ -7467,7 +8831,7 @@
 	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
+/* 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;
@@ -7476,7 +8840,7 @@
 	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
+/* 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;
@@ -7485,7 +8849,7 @@
 	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
+/* 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;
@@ -7494,17 +8858,17 @@
 	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
+/* 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
+/* 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
+/* 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;
@@ -7513,7 +8877,7 @@
 	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
+/* 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;
@@ -7522,7 +8886,7 @@
 	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
+/* 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;
@@ -7531,8 +8895,8 @@
 	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
+/* ;  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;
@@ -7541,7 +8905,7 @@
 	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
+/* 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;
@@ -7550,12 +8914,12 @@
 	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 ?????????
+/* 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
+/* 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;
@@ -7564,7 +8928,7 @@
 	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
+/* 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;
@@ -7573,53 +8937,53 @@
 	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 = 0xFE;
-// Config. Reg. 1 (dialing)        (cr1):05
+/* ;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
+/* Config. Reg. 2 (caller ID)      (cr2):04 */
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
-// Config. Reg. 3 (testloops)      (cr3):00        ; 
+/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
-// Config. Reg. 4 (analog gain)    (cr4):01
-	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;		//0x01;
-	// 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
+/* 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_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.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        ; 
+/* Ext. Reg. 3 (DC Char)           (xr3):22        ;  */
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x22;
-// Ext. Reg. 4 (Cadence)           (xr4):00
+/* Ext. Reg. 4 (Cadence)           (xr4):00 */
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
-// Ext. Reg. 5 (Ring timer)        (xr5):22
+/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
-// Ext. Reg. 6 (Power State)       (xr6):00
+/* 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  
+/* 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  
+/* 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;
@@ -7628,1538 +8992,1562 @@
 
 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
-	},
-	{			// 300.txt 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
-	},
-	{			// 330.txt 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
-	},
-	{			// 340.txt 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
-	},
-	{			// 360.txt
-		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
-	},
-	{			// 392.txt
-		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
-	},
-	{			// 420.txt
-		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
-	},
-	{			// 425.txt
-		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
-	},
-	{			// 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
-	},
-	{			// 435.txt
-		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
-	},
-	{			// 445.txt
-		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
-	},
-	{			// 450.txt
-		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
-	},
-	{			// 452.txt
-		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
-	},
-	{			// 475.txt
-		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
-	},
-	{			// 494.txt
-		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
-	},
-	{			// 500.txt
-		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
-	},
-	{			// 520.txt
-		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
-	},
-	{			// 523.txt
-		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
-	},
-	{			// 525.txt
-		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
-	},
-	{			// 587.txt
-		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
-	},
-	{			// 590.txt
-		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
-	},
-	{			// 600.txt
-		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
-	},
-	{			// 660.txt
-		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
-	},
-	{			// 700.txt
-		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
-	},
-	{			// 740.txt
-		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
-	},
-	{			// 750.txt
-		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
-	},
-	{			// 770.txt
-		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
-	},
-	{			// 800.txt
-		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
-	},
-	{			// 816.txt
-		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
-	},
-	{			// 850.txt
-		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
-	},
-	{			// 900.txt
-		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
-	},
-	{			// 942.txt
-		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
-	},
-	{			// 950.txt
-		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
-	},
-	{			// 975.txt
-		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
-	},
-	{			// 1000.txt
-		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
-	},
-	{			// 1020.txt
-		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
-	},
-	{			// 1050.txt
-		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
-	},
-	{			// 1140.txt
-		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
-	},
-	{			// 1200.txt
-		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
-	},
-	{			// 1209.txt
-		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
-	},
-	{			// 1330.txt
-		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
-	},
-	{			// 1336.txt
-		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
-	},
-	{			// 1366.txt
-		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
-	},
-	{			// 1380.txt
-		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
-	},
-	{			// 1400.txt
-		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
-	},
-	{			// 1477.txt
-		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
-	},
-	{			// 1600.txt
-		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
-	},
-	{			// 1800.txt
-		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
-	},
-	{			// 1860.txt
-		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
+	{			/* 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)
@@ -9170,33 +10558,33 @@
 	if (jf->filter > 3) {
 		return -1;
 	}
-	if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))	// Select Filter
+	if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))	/* Select Filter */
 
 		return -1;
 	if (!jf->enable) {
-		if (ixj_WriteDSPCommand(0x5152, j))		// Disable Filter
+		if (ixj_WriteDSPCommand(0x5152, j))		/* Disable Filter */
 
 			return -1;
 		else
 			return 0;
 	} else {
-		if (ixj_WriteDSPCommand(0x5153, j))		// Enable Filter
+		if (ixj_WriteDSPCommand(0x5153, j))		/* Enable Filter */
 
 			return -1;
-		// Select the filter (f0 - f3) to use.
+		/* 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.
+		/* 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.
+		/* 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) {
@@ -9217,6 +10605,52 @@
 	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;
@@ -9237,7 +10671,7 @@
 	{
 		if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, j))
 			return -1;
-		if (ixj_WriteDSPCommand(0x6000 + (ti->gain0 << 4) + ti->gain1, j))
+		if (ixj_WriteDSPCommand(0x6000 + (ti->gain1 << 4) + ti->gain0, j))
 			return -1;
 		data = freq0;
 		if (ixj_WriteDSPCommand(data, j))
@@ -9248,3 +10682,4 @@
 	}
 	return freq0;
 }
+

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)