1/****************************************************************************
2 *    ixj.c
3 *
4 * Device Driver for Quicknet Technologies, Inc.'s Telephony cards
5 * including the Internet PhoneJACK, Internet PhoneJACK Lite,
6 * Internet PhoneJACK PCI, Internet LineJACK, Internet PhoneCARD and
7 * SmartCABLE
8 *
9 *    (c) Copyright 1999-2001  Quicknet Technologies, Inc.
10 *
11 *    This program is free software; you can redistribute it and/or
12 *    modify it under the terms of the GNU General Public License
13 *    as published by the Free Software Foundation; either version
14 *    2 of the License, or (at your option) any later version.
15 *
16 * Author:          Ed Okerson, <eokerson@quicknet.net>
17 *
18 * Contributors:    Greg Herlein, <gherlein@quicknet.net>
19 *                  David W. Erhart, <derhart@quicknet.net>
20 *                  John Sellers, <jsellers@quicknet.net>
21 *                  Mike Preston, <mpreston@quicknet.net>
22 *
23 * Fixes:           David Huggins-Daines, <dhd@cepstral.com>
24 *                  Fabio Ferrari, <fabio.ferrari@digitro.com.br>
25 *                  Artis Kugevics, <artis@mt.lv>
26 *                  Daniele Bellucci, <bellucda@tiscali.it>
27 *
28 * More information about the hardware related to this driver can be found
29 * at our website:    http://www.quicknet.net
30 *
31 * IN NO EVENT SHALL QUICKNET TECHNOLOGIES, INC. BE LIABLE TO ANY PARTY FOR
32 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
33 * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF QUICKNET
34 * TECHNOLOGIES, INC. HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 *
36 * QUICKNET TECHNOLOGIES, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES,
37 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
38 * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
39 * ON AN "AS IS" BASIS, AND QUICKNET TECHNOLOGIES, INC. HAS NO OBLIGATION
40 * TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
41 *
42 ***************************************************************************/
43
44/*
45 * $Log: ixj.c,v $
46 * Revision 1.1.1.1  2007/08/03 18:53:01  rnuti
47 * Importing Linux MIPS Kernel 2.6.22
48 *
49 *
50 * Revision 4.8  2003/07/09 19:39:00  Daniele Bellucci
51 * Audit some copy_*_user and minor cleanup.
52 *
53 * Revision 4.7  2001/08/13 06:19:33  craigs
54 * Added additional changes from Alan Cox and John Anderson for
55 * 2.2 to 2.4 cleanup and bounds checking
56 *
57 * Revision 4.6  2001/08/13 01:05:05  craigs
58 * Really fixed PHONE_QUERY_CODEC problem this time
59 *
60 * Revision 4.5  2001/08/13 00:11:03  craigs
61 * Fixed problem in handling of PHONE_QUERY_CODEC, thanks to Shane Anderson
62 *
63 * Revision 4.4  2001/08/07 07:58:12  craigs
64 * Changed back to three digit version numbers
65 * Added tagbuild target to allow automatic and easy tagging of versions
66 *
67 * Revision 4.3  2001/08/07 07:24:47  craigs
68 * Added ixj-ver.h to allow easy configuration management of driver
69 * Added display of version number in /prox/ixj
70 *
71 * Revision 4.2  2001/08/06 07:07:19  craigs
72 * Reverted IXJCTL_DSP_TYPE and IXJCTL_DSP_VERSION files to original
73 * behaviour of returning int rather than short *
74 *
75 * Revision 4.1  2001/08/05 00:17:37  craigs
76 * More changes for correct PCMCIA installation
77 * Start of changes for backward Linux compatibility
78 *
79 * Revision 4.0  2001/08/04 12:33:12  craigs
80 * New version using GNU autoconf
81 *
82 * Revision 3.105  2001/07/20 23:14:32  eokerson
83 * More work on CallerID generation when using ring cadences.
84 *
85 * Revision 3.104  2001/07/06 01:33:55  eokerson
86 * Some bugfixes from Robert Vojta <vojta@ipex.cz> and a few mods to the Makefile.
87 *
88 * Revision 3.103  2001/07/05 19:20:16  eokerson
89 * Updated HOWTO
90 * Changed mic gain to 30dB on Internet LineJACK mic/speaker port.
91 *
92 * Revision 3.102  2001/07/03 23:51:21  eokerson
93 * Un-mute mic on Internet LineJACK when in speakerphone mode.
94 *
95 * Revision 3.101  2001/07/02 19:26:56  eokerson
96 * Removed initialiazation of ixjdebug and ixj_convert_loaded so they will go in the .bss instead of the .data
97 *
98 * Revision 3.100  2001/07/02 19:18:27  eokerson
99 * Changed driver to make dynamic allocation possible.  We now pass IXJ * between functions instead of array indexes.
100 * Fixed the way the POTS and PSTN ports interact during a PSTN call to allow local answering.
101 * Fixed speaker mode on Internet LineJACK.
102 *
103 * Revision 3.99  2001/05/09 14:11:16  eokerson
104 * Fixed kmalloc error in ixj_build_filter_cadence.  Thanks David Chan <cat@waulogy.stanford.edu>.
105 *
106 * Revision 3.98  2001/05/08 19:55:33  eokerson
107 * Fixed POTS hookstate detection while it is connected to PSTN port.
108 *
109 * Revision 3.97  2001/05/08 00:01:04  eokerson
110 * Fixed kernel oops when sending caller ID data.
111 *
112 * Revision 3.96  2001/05/04 23:09:30  eokerson
113 * Now uses one kernel timer for each card, instead of one for the entire driver.
114 *
115 * Revision 3.95  2001/04/25 22:06:47  eokerson
116 * Fixed squawking at beginning of some G.723.1 calls.
117 *
118 * Revision 3.94  2001/04/03 23:42:00  eokerson
119 * Added linear volume ioctls
120 * Added raw filter load ioctl
121 *
122 * Revision 3.93  2001/02/27 01:00:06  eokerson
123 * Fixed blocking in CallerID.
124 * Reduced size of ixj structure for smaller driver footprint.
125 *
126 * Revision 3.92  2001/02/20 22:02:59  eokerson
127 * Fixed isapnp and pcmcia module compatibility for 2.4.x kernels.
128 * Improved PSTN ring detection.
129 * Fixed wink generation on POTS ports.
130 *
131 * Revision 3.91  2001/02/13 00:55:44  eokerson
132 * Turn AEC back on after changing frame sizes.
133 *
134 * Revision 3.90  2001/02/12 16:42:00  eokerson
135 * Added ALAW codec, thanks to Fabio Ferrari for the table based converters to make ALAW from ULAW.
136 *
137 * Revision 3.89  2001/02/12 15:41:16  eokerson
138 * Fix from Artis Kugevics - Tone gains were not being set correctly.
139 *
140 * Revision 3.88  2001/02/05 23:25:42  eokerson
141 * Fixed lockup bugs with deregister.
142 *
143 * Revision 3.87  2001/01/29 21:00:39  eokerson
144 * Fix from Fabio Ferrari <fabio.ferrari@digitro.com.br> to properly handle EAGAIN and EINTR during non-blocking write.
145 * Updated copyright date.
146 *
147 * Revision 3.86  2001/01/23 23:53:46  eokerson
148 * Fixes to G.729 compatibility.
149 *
150 * Revision 3.85  2001/01/23 21:30:36  eokerson
151 * Added verbage about cards supported.
152 * Removed commands that put the card in low power mode at some times that it should not be in low power mode.
153 *
154 * Revision 3.84  2001/01/22 23:32:10  eokerson
155 * Some bugfixes from David Huggins-Daines, <dhd@cepstral.com> and other cleanups.
156 *
157 * Revision 3.83  2001/01/19 14:51:41  eokerson
158 * Fixed ixj_WriteDSPCommand to decrement usage counter when command fails.
159 *
160 * Revision 3.82  2001/01/19 00:34:49  eokerson
161 * Added verbosity to write overlap errors.
162 *
163 * Revision 3.81  2001/01/18 23:56:54  eokerson
164 * Fixed PSTN line test functions.
165 *
166 * Revision 3.80  2001/01/18 22:29:27  eokerson
167 * Updated AEC/AGC values for different cards.
168 *
169 * Revision 3.79  2001/01/17 02:58:54  eokerson
170 * Fixed AEC reset after Caller ID.
171 * Fixed Codec lockup after Caller ID on Call Waiting when not using 30ms frames.
172 *
173 * Revision 3.78  2001/01/16 19:43:09  eokerson
174 * Added support for Linux 2.4.x kernels.
175 *
176 * Revision 3.77  2001/01/09 04:00:52  eokerson
177 * Linetest will now test the line, even if it has previously succeded.
178 *
179 * Revision 3.76  2001/01/08 19:27:00  eokerson
180 * Fixed problem with standard cable on Internet PhoneCARD.
181 *
182 * Revision 3.75  2000/12/22 16:52:14  eokerson
183 * Modified to allow hookstate detection on the POTS port when the PSTN port is selected.
184 *
185 * Revision 3.74  2000/12/08 22:41:50  eokerson
186 * Added capability for G729B.
187 *
188 * Revision 3.73  2000/12/07 23:35:16  eokerson
189 * Added capability to have different ring pattern before CallerID data.
190 * Added hookstate checks in CallerID routines to stop FSK.
191 *
192 * Revision 3.72  2000/12/06 19:31:31  eokerson
193 * Modified signal behavior to only send one signal per event.
194 *
195 * Revision 3.71  2000/12/06 03:23:08  eokerson
196 * Fixed CallerID on Call Waiting.
197 *
198 * Revision 3.70  2000/12/04 21:29:37  eokerson
199 * Added checking to Smart Cable gain functions.
200 *
201 * Revision 3.69  2000/12/04 21:05:20  eokerson
202 * Changed ixjdebug levels.
203 * Added ioctls to change gains in Internet Phone CARD Smart Cable.
204 *
205 * Revision 3.68  2000/12/04 00:17:21  craigs
206 * Changed mixer voice gain to +6dB rather than 0dB
207 *
208 * Revision 3.67  2000/11/30 21:25:51  eokerson
209 * Fixed write signal errors.
210 *
211 * Revision 3.66  2000/11/29 22:42:44  eokerson
212 * Fixed PSTN ring detect problems.
213 *
214 * Revision 3.65  2000/11/29 07:31:55  craigs
215 * Added new 425Hz filter co-efficients
216 * Added card-specific DTMF prescaler initialisation
217 *
218 * Revision 3.64  2000/11/28 14:03:32  craigs
219 * Changed certain mixer initialisations to be 0dB rather than 12dB
220 * Added additional information to /proc/ixj
221 *
222 * Revision 3.63  2000/11/28 11:38:41  craigs
223 * Added display of AEC modes in AUTO and AGC mode
224 *
225 * Revision 3.62  2000/11/28 04:05:44  eokerson
226 * Improved PSTN ring detection routine.
227 *
228 * Revision 3.61  2000/11/27 21:53:12  eokerson
229 * Fixed flash detection.
230 *
231 * Revision 3.60  2000/11/27 15:57:29  eokerson
232 * More work on G.729 load routines.
233 *
234 * Revision 3.59  2000/11/25 21:55:12  eokerson
235 * Fixed errors in G.729 load routine.
236 *
237 * Revision 3.58  2000/11/25 04:08:29  eokerson
238 * Added board locks around G.729 and TS85 load routines.
239 *
240 * Revision 3.57  2000/11/24 05:35:17  craigs
241 * Added ability to retrieve mixer values on LineJACK
242 * Added complete initialisation of all mixer values at startup
243 * Fixed spelling mistake
244 *
245 * Revision 3.56  2000/11/23 02:52:11  robertj
246 * Added cvs change log keyword.
247 * Fixed bug in capabilities list when using G.729 module.
248 *
249 */
250
251#include "ixj-ver.h"
252
253#define PERFMON_STATS
254#define IXJDEBUG 0
255#define MAXRINGS 5
256
257#include <linux/module.h>
258
259#include <linux/init.h>
260#include <linux/sched.h>
261#include <linux/kernel.h>	/* printk() */
262#include <linux/fs.h>		/* everything... */
263#include <linux/errno.h>	/* error codes */
264#include <linux/slab.h>
265#include <linux/mm.h>
266#include <linux/ioport.h>
267#include <linux/interrupt.h>
268#include <linux/proc_fs.h>
269#include <linux/poll.h>
270#include <linux/timer.h>
271#include <linux/delay.h>
272#include <linux/pci.h>
273
274#include <asm/io.h>
275#include <asm/uaccess.h>
276
277#include <linux/isapnp.h>
278
279#include "ixj.h"
280
281#define TYPE(inode) (iminor(inode) >> 4)
282#define NUM(inode) (iminor(inode) & 0xf)
283
284static int ixjdebug;
285static int hertz = HZ;
286static int samplerate = 100;
287
288module_param(ixjdebug, int, 0);
289
290static struct pci_device_id ixj_pci_tbl[] __devinitdata = {
291	{ PCI_VENDOR_ID_QUICKNET, PCI_DEVICE_ID_QUICKNET_XJ,
292	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
293	{ }
294};
295
296MODULE_DEVICE_TABLE(pci, ixj_pci_tbl);
297
298/************************************************************************
299*
300* ixjdebug meanings are now bit mapped instead of level based
301* Values can be or'ed together to turn on multiple messages
302*
303* bit  0 (0x0001) = any failure
304* bit  1 (0x0002) = general messages
305* bit  2 (0x0004) = POTS ringing related
306* bit  3 (0x0008) = PSTN events
307* bit  4 (0x0010) = PSTN Cadence state details
308* bit  5 (0x0020) = Tone detection triggers
309* bit  6 (0x0040) = Tone detection cadence details
310* bit  7 (0x0080) = ioctl tracking
311* bit  8 (0x0100) = signal tracking
312* bit  9 (0x0200) = CallerID generation details
313*
314************************************************************************/
315
316#ifdef IXJ_DYN_ALLOC
317
318static IXJ *ixj[IXJMAX];
319#define	get_ixj(b)	ixj[(b)]
320
321/*
322 *	Allocate a free IXJ device
323 */
324
325static IXJ *ixj_alloc()
326{
327	for(cnt=0; cnt<IXJMAX; cnt++)
328	{
329		if(ixj[cnt] == NULL || !ixj[cnt]->DSPbase)
330		{
331			j = kmalloc(sizeof(IXJ), GFP_KERNEL);
332			if (j == NULL)
333				return NULL;
334			ixj[cnt] = j;
335			return j;
336		}
337	}
338	return NULL;
339}
340
341static void ixj_fsk_free(IXJ *j)
342{
343	kfree(j->fskdata);
344	j->fskdata = NULL;
345}
346
347static void ixj_fsk_alloc(IXJ *j)
348{
349	if(!j->fskdata) {
350		j->fskdata = kmalloc(8000, GFP_KERNEL);
351		if (!j->fskdata) {
352			if(ixjdebug & 0x0200) {
353				printk("IXJ phone%d - allocate failed\n", j->board);
354			}
355			return;
356		} else {
357			j->fsksize = 8000;
358			if(ixjdebug & 0x0200) {
359				printk("IXJ phone%d - allocate succeded\n", j->board);
360			}
361		}
362	}
363}
364
365#else
366
367static IXJ ixj[IXJMAX];
368#define	get_ixj(b)	(&ixj[(b)])
369
370/*
371 *	Allocate a free IXJ device
372 */
373
374static IXJ *ixj_alloc(void)
375{
376	int cnt;
377	for(cnt=0; cnt<IXJMAX; cnt++) {
378		if(!ixj[cnt].DSPbase)
379			return &ixj[cnt];
380	}
381	return NULL;
382}
383
384static inline void ixj_fsk_free(IXJ *j) {;}
385
386static inline void ixj_fsk_alloc(IXJ *j)
387{
388	j->fsksize = 8000;
389}
390
391#endif
392
393#ifdef PERFMON_STATS
394#define ixj_perfmon(x)	((x)++)
395#else
396#define ixj_perfmon(x)	do { } while(0)
397#endif
398
399static int ixj_convert_loaded;
400
401static int ixj_WriteDSPCommand(unsigned short, IXJ *j);
402
403/************************************************************************
404*
405* These are function definitions to allow external modules to register
406* enhanced functionality call backs.
407*
408************************************************************************/
409
410static int Stub(IXJ * J, unsigned long arg)
411{
412	return 0;
413}
414
415static IXJ_REGFUNC ixj_PreRead = &Stub;
416static IXJ_REGFUNC ixj_PostRead = &Stub;
417static IXJ_REGFUNC ixj_PreWrite = &Stub;
418static IXJ_REGFUNC ixj_PostWrite = &Stub;
419
420static void ixj_read_frame(IXJ *j);
421static void ixj_write_frame(IXJ *j);
422static void ixj_init_timer(IXJ *j);
423static void ixj_add_timer(IXJ *	j);
424static void ixj_timeout(unsigned long ptr);
425static int read_filters(IXJ *j);
426static int LineMonitor(IXJ *j);
427static int ixj_fasync(int fd, struct file *, int mode);
428static int ixj_set_port(IXJ *j, int arg);
429static int ixj_set_pots(IXJ *j, int arg);
430static int ixj_hookstate(IXJ *j);
431static int ixj_record_start(IXJ *j);
432static void ixj_record_stop(IXJ *j);
433static void set_rec_volume(IXJ *j, int volume);
434static int get_rec_volume(IXJ *j);
435static int set_rec_codec(IXJ *j, int rate);
436static void ixj_vad(IXJ *j, int arg);
437static int ixj_play_start(IXJ *j);
438static void ixj_play_stop(IXJ *j);
439static int ixj_set_tone_on(unsigned short arg, IXJ *j);
440static int ixj_set_tone_off(unsigned short, IXJ *j);
441static int ixj_play_tone(IXJ *j, char tone);
442static void ixj_aec_start(IXJ *j, int level);
443static int idle(IXJ *j);
444static void ixj_ring_on(IXJ *j);
445static void ixj_ring_off(IXJ *j);
446static void aec_stop(IXJ *j);
447static void ixj_ringback(IXJ *j);
448static void ixj_busytone(IXJ *j);
449static void ixj_dialtone(IXJ *j);
450static void ixj_cpt_stop(IXJ *j);
451static char daa_int_read(IXJ *j);
452static char daa_CR_read(IXJ *j, int cr);
453static int daa_set_mode(IXJ *j, int mode);
454static int ixj_linetest(IXJ *j);
455static int ixj_daa_write(IXJ *j);
456static int ixj_daa_cid_read(IXJ *j);
457static void DAA_Coeff_US(IXJ *j);
458static void DAA_Coeff_UK(IXJ *j);
459static void DAA_Coeff_France(IXJ *j);
460static void DAA_Coeff_Germany(IXJ *j);
461static void DAA_Coeff_Australia(IXJ *j);
462static void DAA_Coeff_Japan(IXJ *j);
463static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf);
464static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr);
465static int ixj_init_tone(IXJ *j, IXJ_TONE * ti);
466static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp);
467static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp);
468/* Serial Control Interface funtions */
469static int SCI_Control(IXJ *j, int control);
470static int SCI_Prepare(IXJ *j);
471static int SCI_WaitHighSCI(IXJ *j);
472static int SCI_WaitLowSCI(IXJ *j);
473static DWORD PCIEE_GetSerialNumber(WORD wAddress);
474static int ixj_PCcontrol_wait(IXJ *j);
475static void ixj_pre_cid(IXJ *j);
476static void ixj_write_cid(IXJ *j);
477static void ixj_write_cid_bit(IXJ *j, int bit);
478static int set_base_frame(IXJ *j, int size);
479static int set_play_codec(IXJ *j, int rate);
480static void set_rec_depth(IXJ *j, int depth);
481static int ixj_mixer(long val, IXJ *j);
482
483/************************************************************************
484CT8020/CT8021 Host Programmers Model
485Host address	Function					Access
486DSPbase +
4870-1		Aux Software Status Register (reserved)		Read Only
4882-3		Software Status Register			Read Only
4894-5		Aux Software Control Register (reserved)	Read Write
4906-7		Software Control Register			Read Write
4918-9		Hardware Status Register			Read Only
492A-B		Hardware Control Register			Read Write
493C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only
494E-F Host Recieve (Read) Data Buffer Access Port (buffer input)	Read Only
495************************************************************************/
496
497static inline void ixj_read_HSR(IXJ *j)
498{
499	j->hsr.bytes.low = inb_p(j->DSPbase + 8);
500	j->hsr.bytes.high = inb_p(j->DSPbase + 9);
501}
502
503static inline int IsControlReady(IXJ *j)
504{
505	ixj_read_HSR(j);
506	return j->hsr.bits.controlrdy ? 1 : 0;
507}
508
509static inline int IsPCControlReady(IXJ *j)
510{
511	j->pccr1.byte = inb_p(j->XILINXbase + 3);
512	return j->pccr1.bits.crr ? 1 : 0;
513}
514
515static inline int IsStatusReady(IXJ *j)
516{
517	ixj_read_HSR(j);
518	return j->hsr.bits.statusrdy ? 1 : 0;
519}
520
521static inline int IsRxReady(IXJ *j)
522{
523	ixj_read_HSR(j);
524	ixj_perfmon(j->rxreadycheck);
525	return j->hsr.bits.rxrdy ? 1 : 0;
526}
527
528static inline int IsTxReady(IXJ *j)
529{
530	ixj_read_HSR(j);
531	ixj_perfmon(j->txreadycheck);
532	return j->hsr.bits.txrdy ? 1 : 0;
533}
534
535static inline void set_play_volume(IXJ *j, int volume)
536{
537	if (ixjdebug & 0x0002)
538		printk(KERN_INFO "IXJ: /dev/phone%d Setting Play Volume to 0x%4.4x\n", j->board, volume);
539	ixj_WriteDSPCommand(0xCF02, j);
540	ixj_WriteDSPCommand(volume, j);
541}
542
543static int set_play_volume_linear(IXJ *j, int volume)
544{
545	int newvolume, dspplaymax;
546
547	if (ixjdebug & 0x0002)
548		printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Play Volume to 0x%4.4x\n", j->board, volume);
549	if(volume > 100 || volume < 0) {
550		return -1;
551	}
552
553	/* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
554	switch (j->cardtype) {
555	case QTI_PHONEJACK:
556		dspplaymax = 0x380;
557		break;
558	case QTI_LINEJACK:
559		if(j->port == PORT_PSTN) {
560			dspplaymax = 0x48;
561		} else {
562			dspplaymax = 0x100;
563		}
564		break;
565	case QTI_PHONEJACK_LITE:
566		dspplaymax = 0x380;
567		break;
568	case QTI_PHONEJACK_PCI:
569		dspplaymax = 0x6C;
570		break;
571	case QTI_PHONECARD:
572		dspplaymax = 0x50;
573		break;
574	default:
575		return -1;
576	}
577	newvolume = (dspplaymax * volume) / 100;
578	set_play_volume(j, newvolume);
579	return 0;
580}
581
582static inline void set_play_depth(IXJ *j, int depth)
583{
584	if (depth > 60)
585		depth = 60;
586	if (depth < 0)
587		depth = 0;
588	ixj_WriteDSPCommand(0x5280 + depth, j);
589}
590
591static inline int get_play_volume(IXJ *j)
592{
593	ixj_WriteDSPCommand(0xCF00, j);
594	return j->ssr.high << 8 | j->ssr.low;
595}
596
597static int get_play_volume_linear(IXJ *j)
598{
599	int volume, newvolume, dspplaymax;
600
601	/* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
602	switch (j->cardtype) {
603	case QTI_PHONEJACK:
604		dspplaymax = 0x380;
605		break;
606	case QTI_LINEJACK:
607		if(j->port == PORT_PSTN) {
608			dspplaymax = 0x48;
609		} else {
610			dspplaymax = 0x100;
611		}
612		break;
613	case QTI_PHONEJACK_LITE:
614		dspplaymax = 0x380;
615		break;
616	case QTI_PHONEJACK_PCI:
617		dspplaymax = 0x6C;
618		break;
619	case QTI_PHONECARD:
620		dspplaymax = 100;
621		break;
622	default:
623		return -1;
624	}
625	volume = get_play_volume(j);
626	newvolume = (volume * 100) / dspplaymax;
627	if(newvolume > 100)
628		newvolume = 100;
629	return newvolume;
630}
631
632static inline BYTE SLIC_GetState(IXJ *j)
633{
634	if (j->cardtype == QTI_PHONECARD) {
635		j->pccr1.byte = 0;
636		j->psccr.bits.dev = 3;
637		j->psccr.bits.rw = 1;
638		outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
639		ixj_PCcontrol_wait(j);
640		j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
641		ixj_PCcontrol_wait(j);
642		if (j->pslic.bits.powerdown)
643			return PLD_SLIC_STATE_OC;
644		else if (!j->pslic.bits.ring0 && !j->pslic.bits.ring1)
645			return PLD_SLIC_STATE_ACTIVE;
646		else
647			return PLD_SLIC_STATE_RINGING;
648	} else {
649		j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
650	}
651	return j->pld_slicr.bits.state;
652}
653
654static bool SLIC_SetState(BYTE byState, IXJ *j)
655{
656	bool fRetVal = false;
657
658	if (j->cardtype == QTI_PHONECARD) {
659		if (j->flags.pcmciasct) {
660			switch (byState) {
661			case PLD_SLIC_STATE_TIPOPEN:
662			case PLD_SLIC_STATE_OC:
663				j->pslic.bits.powerdown = 1;
664				j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
665				fRetVal = true;
666				break;
667			case PLD_SLIC_STATE_RINGING:
668				if (j->readers || j->writers) {
669					j->pslic.bits.powerdown = 0;
670					j->pslic.bits.ring0 = 1;
671					j->pslic.bits.ring1 = 0;
672					fRetVal = true;
673				}
674				break;
675			case PLD_SLIC_STATE_OHT:	/* On-hook transmit */
676
677			case PLD_SLIC_STATE_STANDBY:
678			case PLD_SLIC_STATE_ACTIVE:
679				if (j->readers || j->writers) {
680					j->pslic.bits.powerdown = 0;
681				} else {
682					j->pslic.bits.powerdown = 1;
683				}
684				j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
685				fRetVal = true;
686				break;
687			case PLD_SLIC_STATE_APR:	/* Active polarity reversal */
688
689			case PLD_SLIC_STATE_OHTPR:	/* OHT polarity reversal */
690
691			default:
692				fRetVal = false;
693				break;
694			}
695			j->psccr.bits.dev = 3;
696			j->psccr.bits.rw = 0;
697			outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
698			ixj_PCcontrol_wait(j);
699		}
700	} else {
701		/* Set the C1, C2, C3 & B2EN signals. */
702		switch (byState) {
703		case PLD_SLIC_STATE_OC:
704			j->pld_slicw.bits.c1 = 0;
705			j->pld_slicw.bits.c2 = 0;
706			j->pld_slicw.bits.c3 = 0;
707			j->pld_slicw.bits.b2en = 0;
708			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
709			fRetVal = true;
710			break;
711		case PLD_SLIC_STATE_RINGING:
712			j->pld_slicw.bits.c1 = 1;
713			j->pld_slicw.bits.c2 = 0;
714			j->pld_slicw.bits.c3 = 0;
715			j->pld_slicw.bits.b2en = 1;
716			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
717			fRetVal = true;
718			break;
719		case PLD_SLIC_STATE_ACTIVE:
720			j->pld_slicw.bits.c1 = 0;
721			j->pld_slicw.bits.c2 = 1;
722			j->pld_slicw.bits.c3 = 0;
723			j->pld_slicw.bits.b2en = 0;
724			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
725			fRetVal = true;
726			break;
727		case PLD_SLIC_STATE_OHT:	/* On-hook transmit */
728
729			j->pld_slicw.bits.c1 = 1;
730			j->pld_slicw.bits.c2 = 1;
731			j->pld_slicw.bits.c3 = 0;
732			j->pld_slicw.bits.b2en = 0;
733			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
734			fRetVal = true;
735			break;
736		case PLD_SLIC_STATE_TIPOPEN:
737			j->pld_slicw.bits.c1 = 0;
738			j->pld_slicw.bits.c2 = 0;
739			j->pld_slicw.bits.c3 = 1;
740			j->pld_slicw.bits.b2en = 0;
741			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
742			fRetVal = true;
743			break;
744		case PLD_SLIC_STATE_STANDBY:
745			j->pld_slicw.bits.c1 = 1;
746			j->pld_slicw.bits.c2 = 0;
747			j->pld_slicw.bits.c3 = 1;
748			j->pld_slicw.bits.b2en = 1;
749			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
750			fRetVal = true;
751			break;
752		case PLD_SLIC_STATE_APR:	/* Active polarity reversal */
753
754			j->pld_slicw.bits.c1 = 0;
755			j->pld_slicw.bits.c2 = 1;
756			j->pld_slicw.bits.c3 = 1;
757			j->pld_slicw.bits.b2en = 0;
758			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
759			fRetVal = true;
760			break;
761		case PLD_SLIC_STATE_OHTPR:	/* OHT polarity reversal */
762
763			j->pld_slicw.bits.c1 = 1;
764			j->pld_slicw.bits.c2 = 1;
765			j->pld_slicw.bits.c3 = 1;
766			j->pld_slicw.bits.b2en = 0;
767			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
768			fRetVal = true;
769			break;
770		default:
771			fRetVal = false;
772			break;
773		}
774	}
775
776	return fRetVal;
777}
778
779static int ixj_wink(IXJ *j)
780{
781	BYTE slicnow;
782
783	slicnow = SLIC_GetState(j);
784
785	j->pots_winkstart = jiffies;
786	SLIC_SetState(PLD_SLIC_STATE_OC, j);
787
788	msleep(jiffies_to_msecs(j->winktime));
789
790	SLIC_SetState(slicnow, j);
791	return 0;
792}
793
794static void ixj_init_timer(IXJ *j)
795{
796	init_timer(&j->timer);
797	j->timer.function = ixj_timeout;
798	j->timer.data = (unsigned long)j;
799}
800
801static void ixj_add_timer(IXJ *j)
802{
803	j->timer.expires = jiffies + (hertz / samplerate);
804	add_timer(&j->timer);
805}
806
807static void ixj_tone_timeout(IXJ *j)
808{
809	IXJ_TONE ti;
810
811	j->tone_state++;
812	if (j->tone_state == 3) {
813		j->tone_state = 0;
814		if (j->cadence_t) {
815			j->tone_cadence_state++;
816			if (j->tone_cadence_state >= j->cadence_t->elements_used) {
817				switch (j->cadence_t->termination) {
818				case PLAY_ONCE:
819					ixj_cpt_stop(j);
820					break;
821				case REPEAT_LAST_ELEMENT:
822					j->tone_cadence_state--;
823					ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
824					break;
825				case REPEAT_ALL:
826					j->tone_cadence_state = 0;
827					if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
828						ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
829						ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
830						ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
831						ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
832						ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
833						ixj_init_tone(j, &ti);
834					}
835					ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, j);
836					ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, j);
837					ixj_play_tone(j, j->cadence_t->ce[0].index);
838					break;
839				}
840			} else {
841				if (j->cadence_t->ce[j->tone_cadence_state].gain0) {
842					ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
843					ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
844					ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
845					ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
846					ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
847					ixj_init_tone(j, &ti);
848				}
849				ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, j);
850				ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, j);
851				ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
852			}
853		}
854	}
855}
856
857static inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir)
858{
859	if(j->ixj_signals[event]) {
860		if(ixjdebug & 0x0100)
861			printk("Sending signal for event %d\n", event);
862			/* Send apps notice of change */
863		/* see config.h for macro definition */
864		kill_fasync(&(j->async_queue), j->ixj_signals[event], dir);
865	}
866}
867
868static void ixj_pstn_state(IXJ *j)
869{
870	int var;
871	union XOPXR0 XR0, daaint;
872
873	var = 10;
874
875	XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg;
876	daaint.reg = 0;
877	XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
878
879	j->pld_scrr.byte = inb_p(j->XILINXbase);
880	if (j->pld_scrr.bits.daaflag) {
881		daa_int_read(j);
882		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) {
883			if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {
884				daaint.bitreg.RING = 1;
885				if(ixjdebug & 0x0008) {
886					printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
887				}
888			} else {
889				daa_set_mode(j, SOP_PU_RESET);
890			}
891		}
892		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) {
893			daaint.bitreg.Caller_ID = 1;
894			j->pstn_cid_intr = 1;
895			j->pstn_cid_received = jiffies;
896			if(ixjdebug & 0x0008) {
897				printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
898			}
899		}
900		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) {
901			daaint.bitreg.Cadence = 1;
902			if(ixjdebug & 0x0008) {
903				printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
904			}
905		}
906		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) {
907			daaint.bitreg.VDD_OK = 1;
908			daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK;
909		}
910	}
911	daa_CR_read(j, 1);
912	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)) {
913		daaint.bitreg.RMR = 1;
914		daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
915		if(ixjdebug & 0x0008) {
916                        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);
917		}
918		j->pstn_prev_rmr = j->pstn_last_rmr;
919		j->pstn_last_rmr = jiffies;
920	}
921	switch(j->daa_mode) {
922		case SOP_PU_SLEEP:
923			if (daaint.bitreg.RING) {
924				if (!j->flags.pstn_ringing) {
925					if (j->daa_mode != SOP_PU_RINGING) {
926						j->pstn_ring_int = jiffies;
927						daa_set_mode(j, SOP_PU_RINGING);
928					}
929				}
930			}
931			break;
932		case SOP_PU_RINGING:
933			if (daaint.bitreg.RMR) {
934				if (ixjdebug & 0x0008) {
935					printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
936				}
937				if (daaint.bitreg.SI_1) {                /* Rising edge of RMR */
938					j->flags.pstn_rmr = 1;
939					j->pstn_ring_start = jiffies;
940					j->pstn_ring_stop = 0;
941					j->ex.bits.pstn_ring = 0;
942					if (j->cadence_f[4].state == 0) {
943						j->cadence_f[4].state = 1;
944						j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000);
945						j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000);
946						j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000);
947					} else if (j->cadence_f[4].state == 2) {
948						if((time_after(jiffies, j->cadence_f[4].off1min) &&
949						    time_before(jiffies, j->cadence_f[4].off1max))) {
950							if (j->cadence_f[4].on2) {
951								j->cadence_f[4].state = 3;
952								j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000));
953								j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000));
954								j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000));
955							} else {
956								j->cadence_f[4].state = 7;
957							}
958						} else {
959							if (ixjdebug & 0x0008) {
960								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
961										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
962										j->cadence_f[4].off1);
963							}
964							j->cadence_f[4].state = 0;
965						}
966					} else if (j->cadence_f[4].state == 4) {
967						if((time_after(jiffies, j->cadence_f[4].off2min) &&
968						    time_before(jiffies, j->cadence_f[4].off2max))) {
969							if (j->cadence_f[4].on3) {
970								j->cadence_f[4].state = 5;
971								j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000));
972								j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000));
973								j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000));
974							} else {
975								j->cadence_f[4].state = 7;
976							}
977						} else {
978							if (ixjdebug & 0x0008) {
979								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
980										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
981										j->cadence_f[4].off2);
982							}
983							j->cadence_f[4].state = 0;
984						}
985					} else if (j->cadence_f[4].state == 6) {
986						if((time_after(jiffies, j->cadence_f[4].off3min) &&
987						    time_before(jiffies, j->cadence_f[4].off3max))) {
988							j->cadence_f[4].state = 7;
989						} else {
990							if (ixjdebug & 0x0008) {
991								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
992										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
993										j->cadence_f[4].off3);
994							}
995							j->cadence_f[4].state = 0;
996						}
997					} else {
998						j->cadence_f[4].state = 0;
999					}
1000				} else {                                /* Falling edge of RMR */
1001					j->pstn_ring_start = 0;
1002					j->pstn_ring_stop = jiffies;
1003					if (j->cadence_f[4].state == 1) {
1004						if(!j->cadence_f[4].on1) {
1005							j->cadence_f[4].state = 7;
1006						} else if((time_after(jiffies, j->cadence_f[4].on1min) &&
1007					          time_before(jiffies, j->cadence_f[4].on1max))) {
1008							if (j->cadence_f[4].off1) {
1009								j->cadence_f[4].state = 2;
1010								j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000));
1011								j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000));
1012								j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000));
1013							} else {
1014								j->cadence_f[4].state = 7;
1015							}
1016						} else {
1017							if (ixjdebug & 0x0008) {
1018								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1019										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1020										j->cadence_f[4].on1);
1021							}
1022							j->cadence_f[4].state = 0;
1023						}
1024					} else if (j->cadence_f[4].state == 3) {
1025						if((time_after(jiffies, j->cadence_f[4].on2min) &&
1026						    time_before(jiffies, j->cadence_f[4].on2max))) {
1027							if (j->cadence_f[4].off2) {
1028								j->cadence_f[4].state = 4;
1029								j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000));
1030								j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000));
1031								j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000));
1032							} else {
1033								j->cadence_f[4].state = 7;
1034							}
1035						} else {
1036							if (ixjdebug & 0x0008) {
1037								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1038										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1039										j->cadence_f[4].on2);
1040							}
1041							j->cadence_f[4].state = 0;
1042						}
1043					} else if (j->cadence_f[4].state == 5) {
1044						if((time_after(jiffies, j->cadence_f[4].on3min) &&
1045						    time_before(jiffies, j->cadence_f[4].on3max))) {
1046							if (j->cadence_f[4].off3) {
1047								j->cadence_f[4].state = 6;
1048								j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000));
1049								j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000));
1050								j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000));
1051							} else {
1052								j->cadence_f[4].state = 7;
1053							}
1054						} else {
1055							j->cadence_f[4].state = 0;
1056						}
1057					} else {
1058						if (ixjdebug & 0x0008) {
1059							printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1060									j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1061									j->cadence_f[4].on3);
1062						}
1063						j->cadence_f[4].state = 0;
1064					}
1065				}
1066				if (ixjdebug & 0x0010) {
1067					printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
1068				}
1069				if (ixjdebug & 0x0010) {
1070					switch(j->cadence_f[4].state) {
1071						case 1:
1072							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1073						j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max);
1074							break;
1075						case 2:
1076							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1077						j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max);
1078							break;
1079						case 3:
1080							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1081						j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max);
1082							break;
1083						case 4:
1084							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1085						j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max);
1086							break;
1087						case 5:
1088							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1089						j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max);
1090							break;
1091						case 6:
1092							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1093						j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max);
1094							break;
1095					}
1096				}
1097			}
1098			if (j->cadence_f[4].state == 7) {
1099				j->cadence_f[4].state = 0;
1100				j->pstn_ring_stop = jiffies;
1101				j->ex.bits.pstn_ring = 1;
1102				ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN);
1103				if(ixjdebug & 0x0008) {
1104					printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ld\n", j->board, jiffies);
1105				}
1106			}
1107			if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) ||
1108			   (j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) {
1109				if(ixjdebug & 0x0008) {
1110					printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j->board, jiffies);
1111					printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j->board, j->pstn_ring_int);
1112					printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j->board, j->pstn_ring_stop);
1113				}
1114				j->pstn_ring_stop = j->pstn_ring_int = 0;
1115				daa_set_mode(j, SOP_PU_SLEEP);
1116			}
1117			outb_p(j->pld_scrw.byte, j->XILINXbase);
1118			if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) {
1119				ixj_daa_cid_read(j);
1120				j->ex.bits.caller_id = 1;
1121				ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN);
1122				j->pstn_cid_intr = 0;
1123			}
1124			if (daaint.bitreg.Cadence) {
1125				if(ixjdebug & 0x0008) {
1126					printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j->board);
1127				}
1128				daa_set_mode(j, SOP_PU_SLEEP);
1129				j->ex.bits.pstn_ring = 0;
1130			}
1131			break;
1132		case SOP_PU_CONVERSATION:
1133			if (daaint.bitreg.VDD_OK) {
1134				if(!daaint.bitreg.SI_0) {
1135					if (!j->pstn_winkstart) {
1136						if(ixjdebug & 0x0008) {
1137							printk("IXJ DAA possible wink /dev/phone%d %ld\n", j->board, jiffies);
1138						}
1139						j->pstn_winkstart = jiffies;
1140					}
1141				} else {
1142					if (j->pstn_winkstart) {
1143						if(ixjdebug & 0x0008) {
1144							printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies);
1145						}
1146						j->pstn_winkstart = 0;
1147					}
1148				}
1149			}
1150			if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) {
1151				if(ixjdebug & 0x0008) {
1152					printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j->board, jiffies);
1153				}
1154				daa_set_mode(j, SOP_PU_SLEEP);
1155				j->pstn_winkstart = 0;
1156				j->ex.bits.pstn_wink = 1;
1157				ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN);
1158			}
1159			break;
1160	}
1161}
1162
1163static void ixj_timeout(unsigned long ptr)
1164{
1165	int board;
1166	unsigned long jifon;
1167	IXJ *j = (IXJ *)ptr;
1168	board = j->board;
1169
1170	if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) {
1171		ixj_perfmon(j->timerchecks);
1172		j->hookstate = ixj_hookstate(j);
1173		if (j->tone_state) {
1174			if (!(j->hookstate)) {
1175				ixj_cpt_stop(j);
1176				if (j->m_hook) {
1177					j->m_hook = 0;
1178					j->ex.bits.hookstate = 1;
1179					ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1180				}
1181				clear_bit(board, &j->busyflags);
1182				ixj_add_timer(j);
1183				return;
1184			}
1185			if (j->tone_state == 1)
1186				jifon = ((hertz * j->tone_on_time) * 25 / 100000);
1187			else
1188				jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000);
1189			if (time_before(jiffies, j->tone_start_jif + jifon)) {
1190				if (j->tone_state == 1) {
1191					ixj_play_tone(j, j->tone_index);
1192					if (j->dsp.low == 0x20) {
1193						clear_bit(board, &j->busyflags);
1194						ixj_add_timer(j);
1195						return;
1196					}
1197				} else {
1198					ixj_play_tone(j, 0);
1199					if (j->dsp.low == 0x20) {
1200						clear_bit(board, &j->busyflags);
1201						ixj_add_timer(j);
1202						return;
1203					}
1204				}
1205			} else {
1206				ixj_tone_timeout(j);
1207				if (j->flags.dialtone) {
1208					ixj_dialtone(j);
1209				}
1210				if (j->flags.busytone) {
1211					ixj_busytone(j);
1212					if (j->dsp.low == 0x20) {
1213						clear_bit(board, &j->busyflags);
1214						ixj_add_timer(j);
1215						return;
1216					}
1217				}
1218				if (j->flags.ringback) {
1219					ixj_ringback(j);
1220					if (j->dsp.low == 0x20) {
1221						clear_bit(board, &j->busyflags);
1222						ixj_add_timer(j);
1223						return;
1224					}
1225				}
1226				if (!j->tone_state) {
1227					ixj_cpt_stop(j);
1228				}
1229			}
1230		}
1231		if (!(j->tone_state && j->dsp.low == 0x20)) {
1232			if (IsRxReady(j)) {
1233				ixj_read_frame(j);
1234			}
1235			if (IsTxReady(j)) {
1236				ixj_write_frame(j);
1237			}
1238		}
1239		if (j->flags.cringing) {
1240			if (j->hookstate & 1) {
1241				j->flags.cringing = 0;
1242				ixj_ring_off(j);
1243			} else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) {
1244				switch(j->cadence_f[5].state) {
1245					case 0:
1246						j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000));
1247						if (time_before(jiffies, j->cadence_f[5].on1dot)) {
1248							if(ixjdebug & 0x0004) {
1249								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1250							}
1251							ixj_ring_on(j);
1252						}
1253						j->cadence_f[5].state = 1;
1254						break;
1255					case 1:
1256						if (time_after(jiffies, j->cadence_f[5].on1dot)) {
1257							j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000));
1258							if(ixjdebug & 0x0004) {
1259								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1260							}
1261							ixj_ring_off(j);
1262							j->cadence_f[5].state = 2;
1263						}
1264						break;
1265					case 2:
1266						if (time_after(jiffies, j->cadence_f[5].off1dot)) {
1267							if(ixjdebug & 0x0004) {
1268								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1269							}
1270							ixj_ring_on(j);
1271							if (j->cadence_f[5].on2) {
1272								j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000));
1273								j->cadence_f[5].state = 3;
1274							} else {
1275								j->cadence_f[5].state = 7;
1276							}
1277						}
1278						break;
1279					case 3:
1280						if (time_after(jiffies, j->cadence_f[5].on2dot)) {
1281							if(ixjdebug & 0x0004) {
1282								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1283							}
1284							ixj_ring_off(j);
1285							if (j->cadence_f[5].off2) {
1286								j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000));
1287								j->cadence_f[5].state = 4;
1288							} else {
1289								j->cadence_f[5].state = 7;
1290							}
1291						}
1292						break;
1293					case 4:
1294						if (time_after(jiffies, j->cadence_f[5].off2dot)) {
1295							if(ixjdebug & 0x0004) {
1296								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1297							}
1298							ixj_ring_on(j);
1299							if (j->cadence_f[5].on3) {
1300								j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000));
1301								j->cadence_f[5].state = 5;
1302							} else {
1303								j->cadence_f[5].state = 7;
1304							}
1305						}
1306						break;
1307					case 5:
1308						if (time_after(jiffies, j->cadence_f[5].on3dot)) {
1309							if(ixjdebug & 0x0004) {
1310								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1311							}
1312							ixj_ring_off(j);
1313							if (j->cadence_f[5].off3) {
1314								j->cadence_f[5].off3dot = jiffies + (long)((j->cadence_f[5].off3 * (hertz * 100) / 10000));
1315								j->cadence_f[5].state = 6;
1316							} else {
1317								j->cadence_f[5].state = 7;
1318							}
1319						}
1320						break;
1321					case 6:
1322						if (time_after(jiffies, j->cadence_f[5].off3dot)) {
1323							if(ixjdebug & 0x0004) {
1324								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1325							}
1326							j->cadence_f[5].state = 7;
1327						}
1328						break;
1329					case 7:
1330						if(ixjdebug & 0x0004) {
1331							printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1332						}
1333						j->flags.cidring = 1;
1334						j->cadence_f[5].state = 0;
1335						break;
1336				}
1337				if (j->flags.cidring && !j->flags.cidsent) {
1338					j->flags.cidsent = 1;
1339					if(j->fskdcnt) {
1340						SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1341						ixj_pre_cid(j);
1342					}
1343					j->flags.cidring = 0;
1344				}
1345				clear_bit(board, &j->busyflags);
1346				ixj_add_timer(j);
1347				return;
1348			} else {
1349				if (time_after(jiffies, j->ring_cadence_jif + (hertz / 2))) {
1350					if (j->flags.cidring && !j->flags.cidsent) {
1351						j->flags.cidsent = 1;
1352						if(j->fskdcnt) {
1353							SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1354							ixj_pre_cid(j);
1355						}
1356						j->flags.cidring = 0;
1357					}
1358					j->ring_cadence_t--;
1359					if (j->ring_cadence_t == -1)
1360						j->ring_cadence_t = 15;
1361					j->ring_cadence_jif = jiffies;
1362
1363					if (j->ring_cadence & 1 << j->ring_cadence_t) {
1364						if(j->flags.cidsent && j->cadence_f[5].en_filter)
1365							j->flags.firstring = 1;
1366						else
1367							ixj_ring_on(j);
1368					} else {
1369						ixj_ring_off(j);
1370						if(!j->flags.cidsent)
1371							j->flags.cidring = 1;
1372					}
1373				}
1374				clear_bit(board, &j->busyflags);
1375				ixj_add_timer(j);
1376				return;
1377			}
1378		}
1379		if (!j->flags.ringing) {
1380			if (j->hookstate) { /* & 1) { */
1381				if (j->dsp.low != 0x20 &&
1382				    SLIC_GetState(j) != PLD_SLIC_STATE_ACTIVE) {
1383					SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1384				}
1385				LineMonitor(j);
1386				read_filters(j);
1387				ixj_WriteDSPCommand(0x511B, j);
1388				j->proc_load = j->ssr.high << 8 | j->ssr.low;
1389				if (!j->m_hook && (j->hookstate & 1)) {
1390					j->m_hook = j->ex.bits.hookstate = 1;
1391					ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1392				}
1393			} else {
1394				if (j->ex.bits.dtmf_ready) {
1395					j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0;
1396				}
1397				if (j->m_hook) {
1398					j->m_hook = 0;
1399					j->ex.bits.hookstate = 1;
1400					ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1401				}
1402			}
1403		}
1404		if (j->cardtype == QTI_LINEJACK && !j->flags.pstncheck && j->flags.pstn_present) {
1405			ixj_pstn_state(j);
1406		}
1407		if (j->ex.bytes) {
1408			wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */
1409		}
1410		clear_bit(board, &j->busyflags);
1411	}
1412	ixj_add_timer(j);
1413}
1414
1415static int ixj_status_wait(IXJ *j)
1416{
1417	unsigned long jif;
1418
1419	jif = jiffies + ((60 * hertz) / 100);
1420	while (!IsStatusReady(j)) {
1421		ixj_perfmon(j->statuswait);
1422		if (time_after(jiffies, jif)) {
1423			ixj_perfmon(j->statuswaitfail);
1424			return -1;
1425		}
1426	}
1427	return 0;
1428}
1429
1430static int ixj_PCcontrol_wait(IXJ *j)
1431{
1432	unsigned long jif;
1433
1434	jif = jiffies + ((60 * hertz) / 100);
1435	while (!IsPCControlReady(j)) {
1436		ixj_perfmon(j->pcontrolwait);
1437		if (time_after(jiffies, jif)) {
1438			ixj_perfmon(j->pcontrolwaitfail);
1439			return -1;
1440		}
1441	}
1442	return 0;
1443}
1444
1445static int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j)
1446{
1447	BYTES bytes;
1448	unsigned long jif;
1449
1450	atomic_inc(&j->DSPWrite);
1451	if(atomic_read(&j->DSPWrite) > 1) {
1452		printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j->board, cmd);
1453		return -1;
1454	}
1455	bytes.high = (cmd & 0xFF00) >> 8;
1456	bytes.low = cmd & 0x00FF;
1457	jif = jiffies + ((60 * hertz) / 100);
1458	while (!IsControlReady(j)) {
1459		ixj_perfmon(j->iscontrolready);
1460		if (time_after(jiffies, jif)) {
1461			ixj_perfmon(j->iscontrolreadyfail);
1462			atomic_dec(&j->DSPWrite);
1463			if(atomic_read(&j->DSPWrite) > 0) {
1464				printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j->board, cmd);
1465				while(atomic_read(&j->DSPWrite) > 0) {
1466					atomic_dec(&j->DSPWrite);
1467				}
1468			}
1469			return -1;
1470		}
1471	}
1472	outb(bytes.low, j->DSPbase + 6);
1473	outb(bytes.high, j->DSPbase + 7);
1474
1475	if (ixj_status_wait(j)) {
1476		j->ssr.low = 0xFF;
1477		j->ssr.high = 0xFF;
1478		atomic_dec(&j->DSPWrite);
1479		if(atomic_read(&j->DSPWrite) > 0) {
1480			printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j->board, cmd);
1481			while(atomic_read(&j->DSPWrite) > 0) {
1482				atomic_dec(&j->DSPWrite);
1483			}
1484		}
1485		return -1;
1486	}
1487/* Read Software Status Register */
1488	j->ssr.low = inb_p(j->DSPbase + 2);
1489	j->ssr.high = inb_p(j->DSPbase + 3);
1490	atomic_dec(&j->DSPWrite);
1491	if(atomic_read(&j->DSPWrite) > 0) {
1492		printk("IXJ %d DSP overlaped command 0x%4.4x\n", j->board, cmd);
1493		while(atomic_read(&j->DSPWrite) > 0) {
1494			atomic_dec(&j->DSPWrite);
1495		}
1496	}
1497	return 0;
1498}
1499
1500/***************************************************************************
1501*
1502*  General Purpose IO Register read routine
1503*
1504***************************************************************************/
1505static inline int ixj_gpio_read(IXJ *j)
1506{
1507	if (ixj_WriteDSPCommand(0x5143, j))
1508		return -1;
1509
1510	j->gpio.bytes.low = j->ssr.low;
1511	j->gpio.bytes.high = j->ssr.high;
1512
1513	return 0;
1514}
1515
1516static inline void LED_SetState(int state, IXJ *j)
1517{
1518	if (j->cardtype == QTI_LINEJACK) {
1519		j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0;
1520		j->pld_scrw.bits.led2 = state & 0x2 ? 1 : 0;
1521		j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0;
1522		j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0;
1523
1524		outb(j->pld_scrw.byte, j->XILINXbase);
1525	}
1526}
1527
1528/*********************************************************************
1529*  GPIO Pins are configured as follows on the Quicknet Internet
1530*  PhoneJACK Telephony Cards
1531*
1532* POTS Select        GPIO_6=0 GPIO_7=0
1533* Mic/Speaker Select GPIO_6=0 GPIO_7=1
1534* Handset Select     GPIO_6=1 GPIO_7=0
1535*
1536* SLIC Active        GPIO_1=0 GPIO_2=1 GPIO_5=0
1537* SLIC Ringing       GPIO_1=1 GPIO_2=1 GPIO_5=0
1538* SLIC Open Circuit  GPIO_1=0 GPIO_2=0 GPIO_5=0
1539*
1540* Hook Switch changes reported on GPIO_3
1541*********************************************************************/
1542static int ixj_set_port(IXJ *j, int arg)
1543{
1544	if (j->cardtype == QTI_PHONEJACK_LITE) {
1545		if (arg != PORT_POTS)
1546			return 10;
1547		else
1548			return 0;
1549	}
1550	switch (arg) {
1551	case PORT_POTS:
1552		j->port = PORT_POTS;
1553		switch (j->cardtype) {
1554		case QTI_PHONECARD:
1555			if (j->flags.pcmciasct == 1)
1556				SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1557			else
1558				return 11;
1559			break;
1560		case QTI_PHONEJACK_PCI:
1561			j->pld_slicw.pcib.mic = 0;
1562			j->pld_slicw.pcib.spk = 0;
1563			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1564			break;
1565		case QTI_LINEJACK:
1566			ixj_set_pots(j, 0);			/* Disconnect POTS/PSTN relay */
1567			if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to
1568									   Software Control Register */
1569				return 2;
1570			j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
1571
1572			outb(j->pld_scrw.byte, j->XILINXbase);
1573			j->pld_clock.byte = 0;
1574			outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1575			j->pld_slicw.bits.rly1 = 1;
1576			j->pld_slicw.bits.spken = 0;
1577			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1578			ixj_mixer(0x1200, j);	/* Turn Off MIC switch on mixer left */
1579			ixj_mixer(0x1401, j);	/* Turn On Mono1 switch on mixer left */
1580			ixj_mixer(0x1300, j);       /* Turn Off MIC switch on mixer right */
1581			ixj_mixer(0x1501, j);       /* Turn On Mono1 switch on mixer right */
1582			ixj_mixer(0x0E80, j);	/*Mic mute */
1583			ixj_mixer(0x0F00, j);	/* Set mono out (SLIC) to 0dB */
1584			ixj_mixer(0x0080, j);	/* Mute Master Left volume */
1585			ixj_mixer(0x0180, j);	/* Mute Master Right volume */
1586			SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
1587/*			SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
1588			break;
1589		case QTI_PHONEJACK:
1590			j->gpio.bytes.high = 0x0B;
1591			j->gpio.bits.gpio6 = 0;
1592			j->gpio.bits.gpio7 = 0;
1593			ixj_WriteDSPCommand(j->gpio.word, j);
1594			break;
1595		}
1596		break;
1597	case PORT_PSTN:
1598		if (j->cardtype == QTI_LINEJACK) {
1599			ixj_WriteDSPCommand(0xC534, j);	/* Write CODEC config to Software Control Register */
1600
1601			j->pld_slicw.bits.rly3 = 0;
1602			j->pld_slicw.bits.rly1 = 1;
1603			j->pld_slicw.bits.spken = 0;
1604			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1605			j->port = PORT_PSTN;
1606		} else {
1607			return 4;
1608		}
1609		break;
1610	case PORT_SPEAKER:
1611		j->port = PORT_SPEAKER;
1612		switch (j->cardtype) {
1613		case QTI_PHONECARD:
1614			if (j->flags.pcmciasct) {
1615				SLIC_SetState(PLD_SLIC_STATE_OC, j);
1616			}
1617			break;
1618		case QTI_PHONEJACK_PCI:
1619			j->pld_slicw.pcib.mic = 1;
1620			j->pld_slicw.pcib.spk = 1;
1621			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1622			break;
1623		case QTI_LINEJACK:
1624			ixj_set_pots(j, 0);			/* Disconnect POTS/PSTN relay */
1625			if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to
1626									   Software Control Register */
1627				return 2;
1628			j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
1629
1630			outb(j->pld_scrw.byte, j->XILINXbase);
1631			j->pld_clock.byte = 0;
1632			outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1633			j->pld_slicw.bits.rly1 = 1;
1634			j->pld_slicw.bits.spken = 1;
1635			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1636			ixj_mixer(0x1201, j);	/* Turn On MIC switch on mixer left */
1637			ixj_mixer(0x1400, j);	/* Turn Off Mono1 switch on mixer left */
1638			ixj_mixer(0x1301, j);       /* Turn On MIC switch on mixer right */
1639			ixj_mixer(0x1500, j);       /* Turn Off Mono1 switch on mixer right */
1640			ixj_mixer(0x0E06, j);	/*Mic un-mute 0dB */
1641			ixj_mixer(0x0F80, j);	/* Mute mono out (SLIC) */
1642			ixj_mixer(0x0000, j);	/* Set Master Left volume to 0dB */
1643			ixj_mixer(0x0100, j);	/* Set Master Right volume to 0dB */
1644			break;
1645		case QTI_PHONEJACK:
1646			j->gpio.bytes.high = 0x0B;
1647			j->gpio.bits.gpio6 = 0;
1648			j->gpio.bits.gpio7 = 1;
1649			ixj_WriteDSPCommand(j->gpio.word, j);
1650			break;
1651		}
1652		break;
1653	case PORT_HANDSET:
1654		if (j->cardtype != QTI_PHONEJACK) {
1655			return 5;
1656		} else {
1657			j->gpio.bytes.high = 0x0B;
1658			j->gpio.bits.gpio6 = 1;
1659			j->gpio.bits.gpio7 = 0;
1660			ixj_WriteDSPCommand(j->gpio.word, j);
1661			j->port = PORT_HANDSET;
1662		}
1663		break;
1664	default:
1665		return 6;
1666		break;
1667	}
1668	return 0;
1669}
1670
1671static int ixj_set_pots(IXJ *j, int arg)
1672{
1673	if (j->cardtype == QTI_LINEJACK) {
1674		if (arg) {
1675			if (j->port == PORT_PSTN) {
1676				j->pld_slicw.bits.rly1 = 0;
1677				outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1678				j->flags.pots_pstn = 1;
1679				return 1;
1680			} else {
1681				j->flags.pots_pstn = 0;
1682				return 0;
1683			}
1684		} else {
1685			j->pld_slicw.bits.rly1 = 1;
1686			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1687			j->flags.pots_pstn = 0;
1688			return 1;
1689		}
1690	} else {
1691		return 0;
1692	}
1693}
1694
1695static void ixj_ring_on(IXJ *j)
1696{
1697	if (j->dsp.low == 0x20)	/* Internet PhoneJACK */
1698	 {
1699		if (ixjdebug & 0x0004)
1700			printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", 	j->board);
1701
1702		j->gpio.bytes.high = 0x0B;
1703		j->gpio.bytes.low = 0x00;
1704		j->gpio.bits.gpio1 = 1;
1705		j->gpio.bits.gpio2 = 1;
1706		j->gpio.bits.gpio5 = 0;
1707		ixj_WriteDSPCommand(j->gpio.word, j);	/* send the ring signal */
1708	} else			/* Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI */
1709	{
1710		if (ixjdebug & 0x0004)
1711			printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
1712
1713		SLIC_SetState(PLD_SLIC_STATE_RINGING, j);
1714	}
1715}
1716
1717static int ixj_siadc(IXJ *j, int val)
1718{
1719	if(j->cardtype == QTI_PHONECARD){
1720		if(j->flags.pcmciascp){
1721			if(val == -1)
1722				return j->siadc.bits.rxg;
1723
1724			if(val < 0 || val > 0x1F)
1725				return -1;
1726
1727			j->siadc.bits.hom = 0;				/* Handset Out Mute */
1728			j->siadc.bits.lom = 0;				/* Line Out Mute */
1729			j->siadc.bits.rxg = val;			/*(0xC000 - 0x41C8) / 0x4EF;    RX PGA Gain */
1730			j->psccr.bits.addr = 6;				/* R/W Smart Cable Register Address */
1731			j->psccr.bits.rw = 0;				/* Read / Write flag */
1732			j->psccr.bits.dev = 0;
1733			outb(j->siadc.byte, j->XILINXbase + 0x00);
1734			outb(j->psccr.byte, j->XILINXbase + 0x01);
1735			ixj_PCcontrol_wait(j);
1736			return j->siadc.bits.rxg;
1737		}
1738	}
1739	return -1;
1740}
1741
1742static int ixj_sidac(IXJ *j, int val)
1743{
1744	if(j->cardtype == QTI_PHONECARD){
1745		if(j->flags.pcmciascp){
1746			if(val == -1)
1747				return j->sidac.bits.txg;
1748
1749			if(val < 0 || val > 0x1F)
1750				return -1;
1751
1752			j->sidac.bits.srm = 1;				/* Speaker Right Mute */
1753			j->sidac.bits.slm = 1;				/* Speaker Left Mute */
1754			j->sidac.bits.txg = val;			/* (0xC000 - 0x45E4) / 0x5D3;	 TX PGA Gain */
1755			j->psccr.bits.addr = 7;				/* R/W Smart Cable Register Address */
1756			j->psccr.bits.rw = 0;				/* Read / Write flag */
1757			j->psccr.bits.dev = 0;
1758			outb(j->sidac.byte, j->XILINXbase + 0x00);
1759			outb(j->psccr.byte, j->XILINXbase + 0x01);
1760			ixj_PCcontrol_wait(j);
1761			return j->sidac.bits.txg;
1762		}
1763	}
1764	return -1;
1765}
1766
1767static int ixj_pcmcia_cable_check(IXJ *j)
1768{
1769	j->pccr1.byte = inb_p(j->XILINXbase + 0x03);
1770	if (!j->flags.pcmciastate) {
1771		j->pccr2.byte = inb_p(j->XILINXbase + 0x02);
1772		if (j->pccr1.bits.drf || j->pccr2.bits.rstc) {
1773			j->flags.pcmciastate = 4;
1774			return 0;
1775		}
1776		if (j->pccr1.bits.ed) {
1777			j->pccr1.bits.ed = 0;
1778			j->psccr.bits.dev = 3;
1779			j->psccr.bits.rw = 1;
1780			outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
1781			ixj_PCcontrol_wait(j);
1782			j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
1783			j->pslic.bits.led2 = j->pslic.bits.det ? 1 : 0;
1784			j->psccr.bits.dev = 3;
1785			j->psccr.bits.rw = 0;
1786			outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
1787			ixj_PCcontrol_wait(j);
1788			return j->pslic.bits.led2 ? 1 : 0;
1789		} else if (j->flags.pcmciasct) {
1790			return j->r_hook;
1791		} else {
1792			return 1;
1793		}
1794	} else if (j->flags.pcmciastate == 4) {
1795		if (!j->pccr1.bits.drf) {
1796			j->flags.pcmciastate = 3;
1797		}
1798		return 0;
1799	} else if (j->flags.pcmciastate == 3) {
1800		j->pccr2.bits.pwr = 0;
1801		j->pccr2.bits.rstc = 1;
1802		outb(j->pccr2.byte, j->XILINXbase + 0x02);
1803		j->checkwait = jiffies + (hertz * 2);
1804		j->flags.incheck = 1;
1805		j->flags.pcmciastate = 2;
1806		return 0;
1807	} else if (j->flags.pcmciastate == 2) {
1808		if (j->flags.incheck) {
1809			if (time_before(jiffies, j->checkwait)) {
1810				return 0;
1811			} else {
1812				j->flags.incheck = 0;
1813			}
1814		}
1815		j->pccr2.bits.pwr = 0;
1816		j->pccr2.bits.rstc = 0;
1817		outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1818		j->flags.pcmciastate = 1;
1819		return 0;
1820	} else if (j->flags.pcmciastate == 1) {
1821		j->flags.pcmciastate = 0;
1822		if (!j->pccr1.bits.drf) {
1823			j->psccr.bits.dev = 3;
1824			j->psccr.bits.rw = 1;
1825			outb_p(j->psccr.byte, j->XILINXbase + 0x01);
1826			ixj_PCcontrol_wait(j);
1827			j->flags.pcmciascp = 1;		/* Set Cable Present Flag */
1828
1829			j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03;		/* Get Cable Type */
1830
1831			if (j->flags.pcmciasct == 3) {
1832				j->flags.pcmciastate = 4;
1833				return 0;
1834			} else if (j->flags.pcmciasct == 0) {
1835				j->pccr2.bits.pwr = 1;
1836				j->pccr2.bits.rstc = 0;
1837				outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1838				j->port = PORT_SPEAKER;
1839			} else {
1840				j->port = PORT_POTS;
1841			}
1842			j->sic1.bits.cpd = 0;				/* Chip Power Down */
1843			j->sic1.bits.mpd = 0;				/* MIC Bias Power Down */
1844			j->sic1.bits.hpd = 0;				/* Handset Bias Power Down */
1845			j->sic1.bits.lpd = 0;				/* Line Bias Power Down */
1846			j->sic1.bits.spd = 1;				/* Speaker Drive Power Down */
1847			j->psccr.bits.addr = 1;				/* R/W Smart Cable Register Address */
1848			j->psccr.bits.rw = 0;				/* Read / Write flag */
1849			j->psccr.bits.dev = 0;
1850			outb(j->sic1.byte, j->XILINXbase + 0x00);
1851			outb(j->psccr.byte, j->XILINXbase + 0x01);
1852			ixj_PCcontrol_wait(j);
1853
1854			j->sic2.bits.al = 0;				/* Analog Loopback DAC analog -> ADC analog */
1855			j->sic2.bits.dl2 = 0;				/* Digital Loopback DAC -> ADC one bit */
1856			j->sic2.bits.dl1 = 0;				/* Digital Loopback ADC -> DAC one bit */
1857			j->sic2.bits.pll = 0;				/* 1 = div 10, 0 = div 5 */
1858			j->sic2.bits.hpd = 0;				/* HPF disable */
1859			j->psccr.bits.addr = 2;				/* R/W Smart Cable Register Address */
1860			j->psccr.bits.rw = 0;				/* Read / Write flag */
1861			j->psccr.bits.dev = 0;
1862			outb(j->sic2.byte, j->XILINXbase + 0x00);
1863			outb(j->psccr.byte, j->XILINXbase + 0x01);
1864			ixj_PCcontrol_wait(j);
1865
1866			j->psccr.bits.addr = 3;				/* R/W Smart Cable Register Address */
1867			j->psccr.bits.rw = 0;				/* Read / Write flag */
1868			j->psccr.bits.dev = 0;
1869			outb(0x00, j->XILINXbase + 0x00);		/* PLL Divide N1 */
1870			outb(j->psccr.byte, j->XILINXbase + 0x01);
1871			ixj_PCcontrol_wait(j);
1872
1873			j->psccr.bits.addr = 4;				/* R/W Smart Cable Register Address */
1874			j->psccr.bits.rw = 0;				/* Read / Write flag */
1875			j->psccr.bits.dev = 0;
1876			outb(0x09, j->XILINXbase + 0x00);		/* PLL Multiply M1 */
1877			outb(j->psccr.byte, j->XILINXbase + 0x01);
1878			ixj_PCcontrol_wait(j);
1879
1880			j->sirxg.bits.lig = 1;				/* Line In Gain */
1881			j->sirxg.bits.lim = 1;				/* Line In Mute */
1882			j->sirxg.bits.mcg = 0;				/* MIC In Gain was 3 */
1883			j->sirxg.bits.mcm = 0;				/* MIC In Mute */
1884			j->sirxg.bits.him = 0;				/* Handset In Mute */
1885			j->sirxg.bits.iir = 1;				/* IIR */
1886			j->psccr.bits.addr = 5;				/* R/W Smart Cable Register Address */
1887			j->psccr.bits.rw = 0;				/* Read / Write flag */
1888			j->psccr.bits.dev = 0;
1889			outb(j->sirxg.byte, j->XILINXbase + 0x00);
1890			outb(j->psccr.byte, j->XILINXbase + 0x01);
1891			ixj_PCcontrol_wait(j);
1892
1893			ixj_siadc(j, 0x17);
1894			ixj_sidac(j, 0x1D);
1895
1896			j->siaatt.bits.sot = 0;
1897			j->psccr.bits.addr = 9;				/* R/W Smart Cable Register Address */
1898			j->psccr.bits.rw = 0;				/* Read / Write flag */
1899			j->psccr.bits.dev = 0;
1900			outb(j->siaatt.byte, j->XILINXbase + 0x00);
1901			outb(j->psccr.byte, j->XILINXbase + 0x01);
1902			ixj_PCcontrol_wait(j);
1903
1904			if (j->flags.pcmciasct == 1 && !j->readers && !j->writers) {
1905				j->psccr.byte = j->pslic.byte = 0;
1906				j->pslic.bits.powerdown = 1;
1907				j->psccr.bits.dev = 3;
1908				j->psccr.bits.rw = 0;
1909				outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
1910				ixj_PCcontrol_wait(j);
1911			}
1912		}
1913		return 0;
1914	} else {
1915		j->flags.pcmciascp = 0;
1916		return 0;
1917	}
1918	return 0;
1919}
1920
1921static int ixj_hookstate(IXJ *j)
1922{
1923	int fOffHook = 0;
1924
1925	switch (j->cardtype) {
1926	case QTI_PHONEJACK:
1927		ixj_gpio_read(j);
1928		fOffHook = j->gpio.bits.gpio3read ? 1 : 0;
1929		break;
1930	case QTI_LINEJACK:
1931	case QTI_PHONEJACK_LITE:
1932	case QTI_PHONEJACK_PCI:
1933		SLIC_GetState(j);
1934		if(j->cardtype == QTI_LINEJACK && j->flags.pots_pstn == 1 && (j->readers || j->writers)) {
1935			fOffHook = j->pld_slicr.bits.potspstn ? 1 : 0;
1936			if(fOffHook != j->p_hook) {
1937				if(!j->checkwait) {
1938					j->checkwait = jiffies;
1939				}
1940				if(time_before(jiffies, j->checkwait + 2)) {
1941					fOffHook ^= 1;
1942				} else {
1943					j->checkwait = 0;
1944				}
1945				j->p_hook = fOffHook;
1946	 			printk("IXJ : /dev/phone%d pots-pstn hookstate check %d at %ld\n", j->board, fOffHook, jiffies);
1947			}
1948		} else {
1949			if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE ||
1950			    j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) {
1951				if (j->flags.ringing || j->flags.cringing) {
1952					if (!in_interrupt()) {
1953						msleep(20);
1954					}
1955					SLIC_GetState(j);
1956					if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) {
1957						ixj_ring_on(j);
1958					}
1959				}
1960				if (j->cardtype == QTI_PHONEJACK_PCI) {
1961					j->pld_scrr.byte = inb_p(j->XILINXbase);
1962					fOffHook = j->pld_scrr.pcib.det ? 1 : 0;
1963				} else
1964					fOffHook = j->pld_slicr.bits.det ? 1 : 0;
1965			}
1966		}
1967		break;
1968	case QTI_PHONECARD:
1969		fOffHook = ixj_pcmcia_cable_check(j);
1970		break;
1971	}
1972	if (j->r_hook != fOffHook) {
1973		j->r_hook = fOffHook;
1974		if (j->port == PORT_SPEAKER || j->port == PORT_HANDSET) { // || (j->port == PORT_PSTN && j->flags.pots_pstn == 0)) {
1975			j->ex.bits.hookstate = 1;
1976			ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1977		} else if (!fOffHook) {
1978			j->flash_end = jiffies + ((60 * hertz) / 100);
1979		}
1980	}
1981	if (fOffHook) {
1982		if(time_before(jiffies, j->flash_end)) {
1983			j->ex.bits.flash = 1;
1984			j->flash_end = 0;
1985			ixj_kill_fasync(j, SIG_FLASH, POLL_IN);
1986		}
1987	} else {
1988		if(time_before(jiffies, j->flash_end)) {
1989			fOffHook = 1;
1990		}
1991	}
1992
1993	if (j->port == PORT_PSTN && j->daa_mode == SOP_PU_CONVERSATION)
1994		fOffHook |= 2;
1995
1996	if (j->port == PORT_SPEAKER) {
1997		if(j->cardtype == QTI_PHONECARD) {
1998			if(j->flags.pcmciascp && j->flags.pcmciasct) {
1999				fOffHook |= 2;
2000			}
2001		} else {
2002			fOffHook |= 2;
2003		}
2004	}
2005
2006	if (j->port == PORT_HANDSET)
2007		fOffHook |= 2;
2008
2009	return fOffHook;
2010}
2011
2012static void ixj_ring_off(IXJ *j)
2013{
2014	if (j->dsp.low == 0x20)	/* Internet PhoneJACK */
2015	 {
2016		if (ixjdebug & 0x0004)
2017			printk(KERN_INFO "IXJ Ring Off\n");
2018		j->gpio.bytes.high = 0x0B;
2019		j->gpio.bytes.low = 0x00;
2020		j->gpio.bits.gpio1 = 0;
2021		j->gpio.bits.gpio2 = 1;
2022		j->gpio.bits.gpio5 = 0;
2023		ixj_WriteDSPCommand(j->gpio.word, j);
2024	} else			/* Internet LineJACK */
2025	{
2026		if (ixjdebug & 0x0004)
2027			printk(KERN_INFO "IXJ Ring Off\n");
2028
2029		if(!j->flags.cidplay)
2030			SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
2031
2032		SLIC_GetState(j);
2033	}
2034}
2035
2036static void ixj_ring_start(IXJ *j)
2037{
2038	j->flags.cringing = 1;
2039	if (ixjdebug & 0x0004)
2040		printk(KERN_INFO "IXJ Cadence Ringing Start /dev/phone%d\n", j->board);
2041	if (ixj_hookstate(j) & 1) {
2042		if (j->port == PORT_POTS)
2043			ixj_ring_off(j);
2044		j->flags.cringing = 0;
2045		if (ixjdebug & 0x0004)
2046			printk(KERN_INFO "IXJ Cadence Ringing Stopped /dev/phone%d off hook\n", j->board);
2047	} else if(j->cadence_f[5].enable && (!j->cadence_f[5].en_filter)) {
2048		j->ring_cadence_jif = jiffies;
2049		j->flags.cidsent = j->flags.cidring = 0;
2050		j->cadence_f[5].state = 0;
2051		if(j->cadence_f[5].on1)
2052			ixj_ring_on(j);
2053	} else {
2054		j->ring_cadence_jif = jiffies;
2055		j->ring_cadence_t = 15;
2056		if (j->ring_cadence & 1 << j->ring_cadence_t) {
2057			ixj_ring_on(j);
2058		} else {
2059			ixj_ring_off(j);
2060		}
2061		j->flags.cidsent = j->flags.cidring = j->flags.firstring = 0;
2062	}
2063}
2064
2065static int ixj_ring(IXJ *j)
2066{
2067	char cntr;
2068	unsigned long jif;
2069
2070	j->flags.ringing = 1;
2071	if (ixj_hookstate(j) & 1) {
2072		ixj_ring_off(j);
2073		j->flags.ringing = 0;
2074		return 1;
2075	}
2076	for (cntr = 0; cntr < j->maxrings; cntr++) {
2077		jif = jiffies + (1 * hertz);
2078		ixj_ring_on(j);
2079		while (time_before(jiffies, jif)) {
2080			if (ixj_hookstate(j) & 1) {
2081				ixj_ring_off(j);
2082				j->flags.ringing = 0;
2083				return 1;
2084			}
2085			schedule_timeout_interruptible(1);
2086			if (signal_pending(current))
2087				break;
2088		}
2089		jif = jiffies + (3 * hertz);
2090		ixj_ring_off(j);
2091		while (time_before(jiffies, jif)) {
2092			if (ixj_hookstate(j) & 1) {
2093				msleep(10);
2094				if (ixj_hookstate(j) & 1) {
2095					j->flags.ringing = 0;
2096					return 1;
2097				}
2098			}
2099			schedule_timeout_interruptible(1);
2100			if (signal_pending(current))
2101				break;
2102		}
2103	}
2104	ixj_ring_off(j);
2105	j->flags.ringing = 0;
2106	return 0;
2107}
2108
2109static int ixj_open(struct phone_device *p, struct file *file_p)
2110{
2111	IXJ *j = get_ixj(p->board);
2112	file_p->private_data = j;
2113
2114	if (!j->DSPbase)
2115		return -ENODEV;
2116
2117        if (file_p->f_mode & FMODE_READ) {
2118		if(!j->readers) {
2119	                j->readers++;
2120        	} else {
2121                	return -EBUSY;
2122		}
2123        }
2124
2125	if (file_p->f_mode & FMODE_WRITE) {
2126		if(!j->writers) {
2127			j->writers++;
2128		} else {
2129			if (file_p->f_mode & FMODE_READ){
2130				j->readers--;
2131			}
2132			return -EBUSY;
2133		}
2134	}
2135
2136	if (j->cardtype == QTI_PHONECARD) {
2137		j->pslic.bits.powerdown = 0;
2138		j->psccr.bits.dev = 3;
2139		j->psccr.bits.rw = 0;
2140		outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
2141		ixj_PCcontrol_wait(j);
2142	}
2143
2144	j->flags.cidplay = 0;
2145	j->flags.cidcw_ack = 0;
2146
2147	if (ixjdebug & 0x0002)
2148		printk(KERN_INFO "Opening board %d\n", p->board);
2149
2150	j->framesread = j->frameswritten = 0;
2151	return 0;
2152}
2153
2154static int ixj_release(struct inode *inode, struct file *file_p)
2155{
2156	IXJ_TONE ti;
2157	int cnt;
2158	IXJ *j = file_p->private_data;
2159	int board = j->p.board;
2160
2161	/*
2162	 *    Set up locks to ensure that only one process is talking to the DSP at a time.
2163	 *    This is necessary to keep the DSP from locking up.
2164	 */
2165	while(test_and_set_bit(board, (void *)&j->busyflags) != 0)
2166		schedule_timeout_interruptible(1);
2167	if (ixjdebug & 0x0002)
2168		printk(KERN_INFO "Closing board %d\n", NUM(inode));
2169
2170	if (j->cardtype == QTI_PHONECARD)
2171		ixj_set_port(j, PORT_SPEAKER);
2172	else
2173		ixj_set_port(j, PORT_POTS);
2174
2175	aec_stop(j);
2176	ixj_play_stop(j);
2177	ixj_record_stop(j);
2178	set_play_volume(j, 0x100);
2179	set_rec_volume(j, 0x100);
2180	ixj_ring_off(j);
2181
2182	/* Restore the tone table to default settings. */
2183	ti.tone_index = 10;
2184	ti.gain0 = 1;
2185	ti.freq0 = hz941;
2186	ti.gain1 = 0;
2187	ti.freq1 = hz1209;
2188	ixj_init_tone(j, &ti);
2189	ti.tone_index = 11;
2190	ti.gain0 = 1;
2191	ti.freq0 = hz941;
2192	ti.gain1 = 0;
2193	ti.freq1 = hz1336;
2194	ixj_init_tone(j, &ti);
2195	ti.tone_index = 12;
2196	ti.gain0 = 1;
2197	ti.freq0 = hz941;
2198	ti.gain1 = 0;
2199	ti.freq1 = hz1477;
2200	ixj_init_tone(j, &ti);
2201	ti.tone_index = 13;
2202	ti.gain0 = 1;
2203	ti.freq0 = hz800;
2204	ti.gain1 = 0;
2205	ti.freq1 = 0;
2206	ixj_init_tone(j, &ti);
2207	ti.tone_index = 14;
2208	ti.gain0 = 1;
2209	ti.freq0 = hz1000;
2210	ti.gain1 = 0;
2211	ti.freq1 = 0;
2212	ixj_init_tone(j, &ti);
2213	ti.tone_index = 15;
2214	ti.gain0 = 1;
2215	ti.freq0 = hz1250;
2216	ti.gain1 = 0;
2217	ti.freq1 = 0;
2218	ixj_init_tone(j, &ti);
2219	ti.tone_index = 16;
2220	ti.gain0 = 1;
2221	ti.freq0 = hz950;
2222	ti.gain1 = 0;
2223	ti.freq1 = 0;
2224	ixj_init_tone(j, &ti);
2225	ti.tone_index = 17;
2226	ti.gain0 = 1;
2227	ti.freq0 = hz1100;
2228	ti.gain1 = 0;
2229	ti.freq1 = 0;
2230	ixj_init_tone(j, &ti);
2231	ti.tone_index = 18;
2232	ti.gain0 = 1;
2233	ti.freq0 = hz1400;
2234	ti.gain1 = 0;
2235	ti.freq1 = 0;
2236	ixj_init_tone(j, &ti);
2237	ti.tone_index = 19;
2238	ti.gain0 = 1;
2239	ti.freq0 = hz1500;
2240	ti.gain1 = 0;
2241	ti.freq1 = 0;
2242	ixj_init_tone(j, &ti);
2243	ti.tone_index = 20;
2244	ti.gain0 = 1;
2245	ti.freq0 = hz1600;
2246	ti.gain1 = 0;
2247	ti.freq1 = 0;
2248	ixj_init_tone(j, &ti);
2249	ti.tone_index = 21;
2250	ti.gain0 = 1;
2251	ti.freq0 = hz1800;
2252	ti.gain1 = 0;
2253	ti.freq1 = 0;
2254	ixj_init_tone(j, &ti);
2255	ti.tone_index = 22;
2256	ti.gain0 = 1;
2257	ti.freq0 = hz2100;
2258	ti.gain1 = 0;
2259	ti.freq1 = 0;
2260	ixj_init_tone(j, &ti);
2261	ti.tone_index = 23;
2262	ti.gain0 = 1;
2263	ti.freq0 = hz1300;
2264	ti.gain1 = 0;
2265	ti.freq1 = 0;
2266	ixj_init_tone(j, &ti);
2267	ti.tone_index = 24;
2268	ti.gain0 = 1;
2269	ti.freq0 = hz2450;
2270	ti.gain1 = 0;
2271	ti.freq1 = 0;
2272	ixj_init_tone(j, &ti);
2273	ti.tone_index = 25;
2274	ti.gain0 = 1;
2275	ti.freq0 = hz350;
2276	ti.gain1 = 0;
2277	ti.freq1 = hz440;
2278	ixj_init_tone(j, &ti);
2279	ti.tone_index = 26;
2280	ti.gain0 = 1;
2281	ti.freq0 = hz440;
2282	ti.gain1 = 0;
2283	ti.freq1 = hz480;
2284	ixj_init_tone(j, &ti);
2285	ti.tone_index = 27;
2286	ti.gain0 = 1;
2287	ti.freq0 = hz480;
2288	ti.gain1 = 0;
2289	ti.freq1 = hz620;
2290	ixj_init_tone(j, &ti);
2291
2292	set_rec_depth(j, 2);	/* Set Record Channel Limit to 2 frames */
2293
2294	set_play_depth(j, 2);	/* Set Playback Channel Limit to 2 frames */
2295
2296	j->ex.bits.dtmf_ready = 0;
2297	j->dtmf_state = 0;
2298	j->dtmf_wp = j->dtmf_rp = 0;
2299	j->rec_mode = j->play_mode = -1;
2300	j->flags.ringing = 0;
2301	j->maxrings = MAXRINGS;
2302	j->ring_cadence = USA_RING_CADENCE;
2303	if(j->cadence_f[5].enable) {
2304		j->cadence_f[5].enable = j->cadence_f[5].en_filter = j->cadence_f[5].state = 0;
2305	}
2306	j->drybuffer = 0;
2307	j->winktime = 320;
2308	j->flags.dtmf_oob = 0;
2309	for (cnt = 0; cnt < 4; cnt++)
2310		j->cadence_f[cnt].enable = 0;
2311
2312	idle(j);
2313
2314	if(j->cardtype == QTI_PHONECARD) {
2315		SLIC_SetState(PLD_SLIC_STATE_OC, j);
2316	}
2317
2318	if (file_p->f_mode & FMODE_READ)
2319		j->readers--;
2320	if (file_p->f_mode & FMODE_WRITE)
2321		j->writers--;
2322
2323	if (j->read_buffer && !j->readers) {
2324		kfree(j->read_buffer);
2325		j->read_buffer = NULL;
2326		j->read_buffer_size = 0;
2327	}
2328	if (j->write_buffer && !j->writers) {
2329		kfree(j->write_buffer);
2330		j->write_buffer = NULL;
2331		j->write_buffer_size = 0;
2332	}
2333	j->rec_codec = j->play_codec = 0;
2334	j->rec_frame_size = j->play_frame_size = 0;
2335	j->flags.cidsent = j->flags.cidring = 0;
2336	ixj_fasync(-1, file_p, 0);	/* remove from list of async notification */
2337
2338	if(j->cardtype == QTI_LINEJACK && !j->readers && !j->writers) {
2339		ixj_set_port(j, PORT_PSTN);
2340		daa_set_mode(j, SOP_PU_SLEEP);
2341		ixj_set_pots(j, 1);
2342	}
2343	ixj_WriteDSPCommand(0x0FE3, j);	/* Put the DSP in 1/5 power mode. */
2344
2345	/* Set up the default signals for events */
2346	for (cnt = 0; cnt < 35; cnt++)
2347		j->ixj_signals[cnt] = SIGIO;
2348
2349	/* Set the excetion signal enable flags */
2350	j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
2351	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 =
2352	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;
2353
2354	file_p->private_data = NULL;
2355	clear_bit(board, &j->busyflags);
2356	return 0;
2357}
2358
2359static int read_filters(IXJ *j)
2360{
2361	unsigned short fc, cnt, trg;
2362	int var;
2363
2364	trg = 0;
2365	if (ixj_WriteDSPCommand(0x5144, j)) {
2366		if(ixjdebug & 0x0001) {
2367			printk(KERN_INFO "Read Frame Counter failed!\n");
2368		}
2369		return -1;
2370	}
2371	fc = j->ssr.high << 8 | j->ssr.low;
2372	if (fc == j->frame_count)
2373		return 1;
2374
2375	j->frame_count = fc;
2376
2377	if (j->dtmf_proc)
2378		return 1;
2379
2380	var = 10;
2381
2382	for (cnt = 0; cnt < 4; cnt++) {
2383		if (ixj_WriteDSPCommand(0x5154 + cnt, j)) {
2384			if(ixjdebug & 0x0001) {
2385				printk(KERN_INFO "Select Filter %d failed!\n", cnt);
2386			}
2387			return -1;
2388		}
2389		if (ixj_WriteDSPCommand(0x515C, j)) {
2390			if(ixjdebug & 0x0001) {
2391				printk(KERN_INFO "Read Filter History %d failed!\n", cnt);
2392			}
2393			return -1;
2394		}
2395		j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low;
2396
2397		if (j->cadence_f[cnt].enable) {
2398			if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) {
2399				if (j->cadence_f[cnt].state == 0) {
2400					j->cadence_f[cnt].state = 1;
2401					j->cadence_f[cnt].on1min = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 - var)) / 10000));
2402					j->cadence_f[cnt].on1dot = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100)) / 10000));
2403					j->cadence_f[cnt].on1max = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 + var)) / 10000));
2404				} else if (j->cadence_f[cnt].state == 2 &&
2405					   (time_after(jiffies, j->cadence_f[cnt].off1min) &&
2406					    time_before(jiffies, j->cadence_f[cnt].off1max))) {
2407					if (j->cadence_f[cnt].on2) {
2408						j->cadence_f[cnt].state = 3;
2409						j->cadence_f[cnt].on2min = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 - var)) / 10000));
2410						j->cadence_f[cnt].on2dot = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100)) / 10000));
2411						j->cadence_f[cnt].on2max = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 + var)) / 10000));
2412					} else {
2413						j->cadence_f[cnt].state = 7;
2414					}
2415				} else if (j->cadence_f[cnt].state == 4 &&
2416					   (time_after(jiffies, j->cadence_f[cnt].off2min) &&
2417					    time_before(jiffies, j->cadence_f[cnt].off2max))) {
2418					if (j->cadence_f[cnt].on3) {
2419						j->cadence_f[cnt].state = 5;
2420						j->cadence_f[cnt].on3min = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 - var)) / 10000));
2421						j->cadence_f[cnt].on3dot = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100)) / 10000));
2422						j->cadence_f[cnt].on3max = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 + var)) / 10000));
2423					} else {
2424						j->cadence_f[cnt].state = 7;
2425					}
2426				} else {
2427					j->cadence_f[cnt].state = 0;
2428				}
2429			} else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) {
2430				if (j->cadence_f[cnt].state == 1) {
2431					if(!j->cadence_f[cnt].on1) {
2432						j->cadence_f[cnt].state = 7;
2433					} else if((time_after(jiffies, j->cadence_f[cnt].on1min) &&
2434					  time_before(jiffies, j->cadence_f[cnt].on1max))) {
2435						if(j->cadence_f[cnt].off1) {
2436							j->cadence_f[cnt].state = 2;
2437							j->cadence_f[cnt].off1min = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 - var)) / 10000));
2438							j->cadence_f[cnt].off1dot = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100)) / 10000));
2439							j->cadence_f[cnt].off1max = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 + var)) / 10000));
2440						} else {
2441							j->cadence_f[cnt].state = 7;
2442						}
2443					} else {
2444						j->cadence_f[cnt].state = 0;
2445					}
2446				} else if (j->cadence_f[cnt].state == 3) {
2447					if((time_after(jiffies, j->cadence_f[cnt].on2min) &&
2448					    time_before(jiffies, j->cadence_f[cnt].on2max))) {
2449						if(j->cadence_f[cnt].off2) {
2450							j->cadence_f[cnt].state = 4;
2451							j->cadence_f[cnt].off2min = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 - var)) / 10000));
2452							j->cadence_f[cnt].off2dot = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100)) / 10000));
2453							j->cadence_f[cnt].off2max = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 + var)) / 10000));
2454						} else {
2455							j->cadence_f[cnt].state = 7;
2456						}
2457					} else {
2458						j->cadence_f[cnt].state = 0;
2459					}
2460				} else if (j->cadence_f[cnt].state == 5) {
2461					if ((time_after(jiffies, j->cadence_f[cnt].on3min) &&
2462					    time_before(jiffies, j->cadence_f[cnt].on3max))) {
2463						if(j->cadence_f[cnt].off3) {
2464							j->cadence_f[cnt].state = 6;
2465							j->cadence_f[cnt].off3min = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 - var)) / 10000));
2466							j->cadence_f[cnt].off3dot = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100)) / 10000));
2467							j->cadence_f[cnt].off3max = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 + var)) / 10000));
2468						} else {
2469							j->cadence_f[cnt].state = 7;
2470						}
2471					} else {
2472						j->cadence_f[cnt].state = 0;
2473					}
2474				} else {
2475					j->cadence_f[cnt].state = 0;
2476				}
2477			} else {
2478				switch(j->cadence_f[cnt].state) {
2479					case 1:
2480						if(time_after(jiffies, j->cadence_f[cnt].on1dot) &&
2481						   !j->cadence_f[cnt].off1 &&
2482						   !j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 &&
2483						   !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2484							j->cadence_f[cnt].state = 7;
2485						}
2486						break;
2487					case 3:
2488						if(time_after(jiffies, j->cadence_f[cnt].on2dot) &&
2489						   !j->cadence_f[cnt].off2 &&
2490						   !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2491							j->cadence_f[cnt].state = 7;
2492						}
2493						break;
2494					case 5:
2495						if(time_after(jiffies, j->cadence_f[cnt].on3dot) &&
2496						   !j->cadence_f[cnt].off3) {
2497							j->cadence_f[cnt].state = 7;
2498						}
2499						break;
2500				}
2501			}
2502
2503			if (ixjdebug & 0x0040) {
2504				printk(KERN_INFO "IXJ Tone Cadence state = %d /dev/phone%d at %ld\n", j->cadence_f[cnt].state, j->board, jiffies);
2505				switch(j->cadence_f[cnt].state) {
2506					case 0:
2507						printk(KERN_INFO "IXJ /dev/phone%d No Tone detected\n", j->board);
2508						break;
2509					case 1:
2510						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %u %ld - %ld - %ld\n", j->board,
2511					j->cadence_f[cnt].on1, j->cadence_f[cnt].on1min, j->cadence_f[cnt].on1dot, j->cadence_f[cnt].on1max);
2512						break;
2513					case 2:
2514						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off1min,
2515															j->cadence_f[cnt].off1max);
2516						break;
2517					case 3:
2518						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on2min,
2519															j->cadence_f[cnt].on2max);
2520						break;
2521					case 4:
2522						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off2min,
2523															j->cadence_f[cnt].off2max);
2524						break;
2525					case 5:
2526						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on3min,
2527															j->cadence_f[cnt].on3max);
2528						break;
2529					case 6:
2530						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off3min,
2531															j->cadence_f[cnt].off3max);
2532						break;
2533				}
2534			}
2535		}
2536		if (j->cadence_f[cnt].state == 7) {
2537			j->cadence_f[cnt].state = 0;
2538			if (j->cadence_f[cnt].enable == 1)
2539				j->cadence_f[cnt].enable = 0;
2540			switch (cnt) {
2541			case 0:
2542				if(ixjdebug & 0x0020) {
2543					printk(KERN_INFO "Filter Cadence 0 triggered %ld\n", jiffies);
2544				}
2545				j->ex.bits.fc0 = 1;
2546				ixj_kill_fasync(j, SIG_FC0, POLL_IN);
2547				break;
2548			case 1:
2549				if(ixjdebug & 0x0020) {
2550					printk(KERN_INFO "Filter Cadence 1 triggered %ld\n", jiffies);
2551				}
2552				j->ex.bits.fc1 = 1;
2553				ixj_kill_fasync(j, SIG_FC1, POLL_IN);
2554				break;
2555			case 2:
2556				if(ixjdebug & 0x0020) {
2557					printk(KERN_INFO "Filter Cadence 2 triggered %ld\n", jiffies);
2558				}
2559				j->ex.bits.fc2 = 1;
2560				ixj_kill_fasync(j, SIG_FC2, POLL_IN);
2561				break;
2562			case 3:
2563				if(ixjdebug & 0x0020) {
2564					printk(KERN_INFO "Filter Cadence 3 triggered %ld\n", jiffies);
2565				}
2566				j->ex.bits.fc3 = 1;
2567				ixj_kill_fasync(j, SIG_FC3, POLL_IN);
2568				break;
2569			}
2570		}
2571		if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) ||
2572					  (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) {
2573			if((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12))) {
2574				trg = 1;
2575			} else if((j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3))) {
2576				trg = 0;
2577			}
2578			switch (cnt) {
2579			case 0:
2580				if(ixjdebug & 0x0020) {
2581					printk(KERN_INFO "Filter 0 triggered %d at %ld\n", trg, jiffies);
2582				}
2583				j->ex.bits.f0 = 1;
2584				ixj_kill_fasync(j, SIG_F0, POLL_IN);
2585				break;
2586			case 1:
2587				if(ixjdebug & 0x0020) {
2588					printk(KERN_INFO "Filter 1 triggered %d at %ld\n", trg, jiffies);
2589				}
2590				j->ex.bits.f1 = 1;
2591				ixj_kill_fasync(j, SIG_F1, POLL_IN);
2592				break;
2593			case 2:
2594				if(ixjdebug & 0x0020) {
2595					printk(KERN_INFO "Filter 2 triggered %d at %ld\n", trg, jiffies);
2596				}
2597				j->ex.bits.f2 = 1;
2598				ixj_kill_fasync(j, SIG_F2, POLL_IN);
2599				break;
2600			case 3:
2601				if(ixjdebug & 0x0020) {
2602					printk(KERN_INFO "Filter 3 triggered %d at %ld\n", trg, jiffies);
2603				}
2604				j->ex.bits.f3 = 1;
2605				ixj_kill_fasync(j, SIG_F3, POLL_IN);
2606				break;
2607			}
2608		}
2609	}
2610	return 0;
2611}
2612
2613static int LineMonitor(IXJ *j)
2614{
2615	if (j->dtmf_proc) {
2616		return -1;
2617	}
2618	j->dtmf_proc = 1;
2619
2620	if (ixj_WriteDSPCommand(0x7000, j))		/* Line Monitor */
2621		return -1;
2622
2623	j->dtmf.bytes.high = j->ssr.high;
2624	j->dtmf.bytes.low = j->ssr.low;
2625	if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) {
2626		j->dtmf_state = 1;
2627		j->dtmf_current = j->dtmf.bits.digit;
2628	}
2629	if (j->dtmf_state && !j->dtmf.bits.dtmf_valid)	/* && j->dtmf_wp != j->dtmf_rp) */
2630	 {
2631		if(!j->cidcw_wait) {
2632			j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current;
2633			j->dtmf_wp++;
2634			if (j->dtmf_wp == 79)
2635				j->dtmf_wp = 0;
2636			j->ex.bits.dtmf_ready = 1;
2637			if(j->ex_sig.bits.dtmf_ready) {
2638				ixj_kill_fasync(j, SIG_DTMF_READY, POLL_IN);
2639			}
2640		}
2641		else if(j->dtmf_current == 0x00 || j->dtmf_current == 0x0D) {
2642			if(ixjdebug & 0x0020) {
2643				printk("IXJ phone%d saw CIDCW Ack DTMF %d from display at %ld\n", j->board, j->dtmf_current, jiffies);
2644			}
2645			j->flags.cidcw_ack = 1;
2646		}
2647		j->dtmf_state = 0;
2648	}
2649	j->dtmf_proc = 0;
2650
2651	return 0;
2652}
2653
2654/************************************************************************
2655*
2656* Functions to allow alaw <-> ulaw conversions.
2657*
2658************************************************************************/
2659
2660static void ulaw2alaw(unsigned char *buff, unsigned long len)
2661{
2662	static unsigned char table_ulaw2alaw[] =
2663	{
2664		0x2A, 0x2B, 0x28, 0x29, 0x2E, 0x2F, 0x2C, 0x2D,
2665		0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25,
2666		0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D,
2667		0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35,
2668		0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 0x02,
2669		0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x1A,
2670		0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 0x12,
2671		0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x6B,
2672		0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 0x62, 0x63,
2673		0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x7B, 0x79,
2674		0x7E, 0x7F, 0x7C, 0x7D, 0x72, 0x73, 0x70, 0x71,
2675		0x76, 0x77, 0x74, 0x75, 0x4B, 0x49, 0x4F, 0x4D,
2676		0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45,
2677		0x5A, 0x5B, 0x58, 0x59, 0x5E, 0x5F, 0x5C, 0x5D,
2678		0x52, 0x52, 0x53, 0x53, 0x50, 0x50, 0x51, 0x51,
2679		0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, 0xD5,
2680		0xAA, 0xAB, 0xA8, 0xA9, 0xAE, 0xAF, 0xAC, 0xAD,
2681		0xA2, 0xA3, 0xA0, 0xA1, 0xA6, 0xA7, 0xA4, 0xA5,
2682		0xBA, 0xBB, 0xB8, 0xB9, 0xBE, 0xBF, 0xBC, 0xBD,
2683		0xB2, 0xB3, 0xB0, 0xB1, 0xB6, 0xB7, 0xB4, 0xB5,
2684		0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 0x82,
2685		0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 0x9A,
2686		0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 0x92,
2687		0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0xEB,
2688		0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 0xE2, 0xE3,
2689		0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 0xFB, 0xF9,
2690		0xFE, 0xFF, 0xFC, 0xFD, 0xF2, 0xF3, 0xF0, 0xF1,
2691		0xF6, 0xF7, 0xF4, 0xF5, 0xCB, 0xC9, 0xCF, 0xCD,
2692		0xC2, 0xC3, 0xC0, 0xC1, 0xC6, 0xC7, 0xC4, 0xC5,
2693		0xDA, 0xDB, 0xD8, 0xD9, 0xDE, 0xDF, 0xDC, 0xDD,
2694		0xD2, 0xD2, 0xD3, 0xD3, 0xD0, 0xD0, 0xD1, 0xD1,
2695		0xD6, 0xD6, 0xD7, 0xD7, 0xD4, 0xD4, 0xD5, 0xD5
2696	};
2697
2698	while (len--)
2699	{
2700		*buff = table_ulaw2alaw[*(unsigned char *)buff];
2701		buff++;
2702	}
2703}
2704
2705static void alaw2ulaw(unsigned char *buff, unsigned long len)
2706{
2707	static unsigned char table_alaw2ulaw[] =
2708	{
2709		0x29, 0x2A, 0x27, 0x28, 0x2D, 0x2E, 0x2B, 0x2C,
2710		0x21, 0x22, 0x1F, 0x20, 0x25, 0x26, 0x23, 0x24,
2711		0x39, 0x3A, 0x37, 0x38, 0x3D, 0x3E, 0x3B, 0x3C,
2712		0x31, 0x32, 0x2F, 0x30, 0x35, 0x36, 0x33, 0x34,
2713		0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D,
2714		0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05,
2715		0x1A, 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D,
2716		0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15,
2717		0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65,
2718		0x5D, 0x5D, 0x5C, 0x5C, 0x5F, 0x5F, 0x5E, 0x5E,
2719		0x74, 0x76, 0x70, 0x72, 0x7C, 0x7E, 0x78, 0x7A,
2720		0x6A, 0x6B, 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D,
2721		0x48, 0x49, 0x46, 0x47, 0x4C, 0x4D, 0x4A, 0x4B,
2722		0x40, 0x41, 0x3F, 0x3F, 0x44, 0x45, 0x42, 0x43,
2723		0x56, 0x57, 0x54, 0x55, 0x5A, 0x5B, 0x58, 0x59,
2724		0x4F, 0x4F, 0x4E, 0x4E, 0x52, 0x53, 0x50, 0x51,
2725		0xA9, 0xAA, 0xA7, 0xA8, 0xAD, 0xAE, 0xAB, 0xAC,
2726		0xA1, 0xA2, 0x9F, 0xA0, 0xA5, 0xA6, 0xA3, 0xA4,
2727		0xB9, 0xBA, 0xB7, 0xB8, 0xBD, 0xBE, 0xBB, 0xBC,
2728		0xB1, 0xB2, 0xAF, 0xB0, 0xB5, 0xB6, 0xB3, 0xB4,
2729		0x8A, 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D,
2730		0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85,
2731		0x9A, 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D,
2732		0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95,
2733		0xE2, 0xE3, 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5,
2734		0xDD, 0xDD, 0xDC, 0xDC, 0xDF, 0xDF, 0xDE, 0xDE,
2735		0xF4, 0xF6, 0xF0, 0xF2, 0xFC, 0xFE, 0xF8, 0xFA,
2736		0xEA, 0xEB, 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED,
2737		0xC8, 0xC9, 0xC6, 0xC7, 0xCC, 0xCD, 0xCA, 0xCB,
2738		0xC0, 0xC1, 0xBF, 0xBF, 0xC4, 0xC5, 0xC2, 0xC3,
2739		0xD6, 0xD7, 0xD4, 0xD5, 0xDA, 0xDB, 0xD8, 0xD9,
2740		0xCF, 0xCF, 0xCE, 0xCE, 0xD2, 0xD3, 0xD0, 0xD1
2741	};
2742
2743        while (len--)
2744        {
2745                *buff = table_alaw2ulaw[*(unsigned char *)buff];
2746                buff++;
2747	}
2748}
2749
2750static ssize_t ixj_read(struct file * file_p, char __user *buf, size_t length, loff_t * ppos)
2751{
2752	unsigned long i = *ppos;
2753	IXJ * j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
2754
2755	DECLARE_WAITQUEUE(wait, current);
2756
2757	if (j->flags.inread)
2758		return -EALREADY;
2759
2760	j->flags.inread = 1;
2761
2762	add_wait_queue(&j->read_q, &wait);
2763	set_current_state(TASK_INTERRUPTIBLE);
2764	mb();
2765
2766	while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) {
2767		++j->read_wait;
2768		if (file_p->f_flags & O_NONBLOCK) {
2769			set_current_state(TASK_RUNNING);
2770			remove_wait_queue(&j->read_q, &wait);
2771			j->flags.inread = 0;
2772			return -EAGAIN;
2773		}
2774		if (!ixj_hookstate(j)) {
2775			set_current_state(TASK_RUNNING);
2776			remove_wait_queue(&j->read_q, &wait);
2777			j->flags.inread = 0;
2778			return 0;
2779		}
2780		interruptible_sleep_on(&j->read_q);
2781		if (signal_pending(current)) {
2782			set_current_state(TASK_RUNNING);
2783			remove_wait_queue(&j->read_q, &wait);
2784			j->flags.inread = 0;
2785			return -EINTR;
2786		}
2787	}
2788
2789	remove_wait_queue(&j->read_q, &wait);
2790	set_current_state(TASK_RUNNING);
2791	/* Don't ever copy more than the user asks */
2792	if(j->rec_codec == ALAW)
2793		ulaw2alaw(j->read_buffer, min(length, j->read_buffer_size));
2794	i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size));
2795	j->read_buffer_ready = 0;
2796	if (i) {
2797		j->flags.inread = 0;
2798		return -EFAULT;
2799	} else {
2800		j->flags.inread = 0;
2801		return min(length, j->read_buffer_size);
2802	}
2803}
2804
2805static ssize_t ixj_enhanced_read(struct file * file_p, char __user *buf, size_t length,
2806			  loff_t * ppos)
2807{
2808	int pre_retval;
2809	ssize_t read_retval = 0;
2810	IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
2811
2812	pre_retval = ixj_PreRead(j, 0L);
2813	switch (pre_retval) {
2814	case NORMAL:
2815		read_retval = ixj_read(file_p, buf, length, ppos);
2816		ixj_PostRead(j, 0L);
2817		break;
2818	case NOPOST:
2819		read_retval = ixj_read(file_p, buf, length, ppos);
2820		break;
2821	case POSTONLY:
2822		ixj_PostRead(j, 0L);
2823		break;
2824	default:
2825		read_retval = pre_retval;
2826	}
2827	return read_retval;
2828}
2829
2830static ssize_t ixj_write(struct file *file_p, const char __user *buf, size_t count, loff_t * ppos)
2831{
2832	unsigned long i = *ppos;
2833	IXJ *j = file_p->private_data;
2834
2835	DECLARE_WAITQUEUE(wait, current);
2836
2837	if (j->flags.inwrite)
2838		return -EALREADY;
2839
2840	j->flags.inwrite = 1;
2841
2842	add_wait_queue(&j->write_q, &wait);
2843	set_current_state(TASK_INTERRUPTIBLE);
2844	mb();
2845
2846
2847	while (!j->write_buffers_empty) {
2848		++j->write_wait;
2849		if (file_p->f_flags & O_NONBLOCK) {
2850			set_current_state(TASK_RUNNING);
2851			remove_wait_queue(&j->write_q, &wait);
2852			j->flags.inwrite = 0;
2853			return -EAGAIN;
2854		}
2855		if (!ixj_hookstate(j)) {
2856			set_current_state(TASK_RUNNING);
2857			remove_wait_queue(&j->write_q, &wait);
2858			j->flags.inwrite = 0;
2859			return 0;
2860		}
2861		interruptible_sleep_on(&j->write_q);
2862		if (signal_pending(current)) {
2863			set_current_state(TASK_RUNNING);
2864			remove_wait_queue(&j->write_q, &wait);
2865			j->flags.inwrite = 0;
2866			return -EINTR;
2867		}
2868	}
2869	set_current_state(TASK_RUNNING);
2870	remove_wait_queue(&j->write_q, &wait);
2871	if (j->write_buffer_wp + count >= j->write_buffer_end)
2872		j->write_buffer_wp = j->write_buffer;
2873	i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size));
2874	if (i) {
2875		j->flags.inwrite = 0;
2876		return -EFAULT;
2877	}
2878       if(j->play_codec == ALAW)
2879               alaw2ulaw(j->write_buffer_wp, min(count, j->write_buffer_size));
2880	j->flags.inwrite = 0;
2881	return min(count, j->write_buffer_size);
2882}
2883
2884static ssize_t ixj_enhanced_write(struct file * file_p, const char __user *buf, size_t count, loff_t * ppos)
2885{
2886	int pre_retval;
2887	ssize_t write_retval = 0;
2888
2889	IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
2890
2891	pre_retval = ixj_PreWrite(j, 0L);
2892	switch (pre_retval) {
2893	case NORMAL:
2894		write_retval = ixj_write(file_p, buf, count, ppos);
2895		if (write_retval > 0) {
2896			ixj_PostWrite(j, 0L);
2897			j->write_buffer_wp += write_retval;
2898			j->write_buffers_empty--;
2899		}
2900		break;
2901	case NOPOST:
2902		write_retval = ixj_write(file_p, buf, count, ppos);
2903		if (write_retval > 0) {
2904			j->write_buffer_wp += write_retval;
2905			j->write_buffers_empty--;
2906		}
2907		break;
2908	case POSTONLY:
2909		ixj_PostWrite(j, 0L);
2910		break;
2911	default:
2912		write_retval = pre_retval;
2913	}
2914	return write_retval;
2915}
2916
2917static void ixj_read_frame(IXJ *j)
2918{
2919	int cnt, dly;
2920
2921	if (j->read_buffer) {
2922		for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
2923			if (!(cnt % 16) && !IsRxReady(j)) {
2924				dly = 0;
2925				while (!IsRxReady(j)) {
2926					if (dly++ > 5) {
2927						dly = 0;
2928						break;
2929					}
2930					udelay(10);
2931				}
2932			}
2933			/* Throw away word 0 of the 8021 compressed format to get standard G.729. */
2934			if (j->rec_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
2935				inb_p(j->DSPbase + 0x0E);
2936				inb_p(j->DSPbase + 0x0F);
2937			}
2938			*(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E);
2939			*(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F);
2940		}
2941		++j->framesread;
2942		if (j->intercom != -1) {
2943			if (IsTxReady(get_ixj(j->intercom))) {
2944				for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
2945					if (!(cnt % 16) && !IsTxReady(j)) {
2946						dly = 0;
2947						while (!IsTxReady(j)) {
2948							if (dly++ > 5) {
2949								dly = 0;
2950								break;
2951							}
2952							udelay(10);
2953						}
2954					}
2955					outb_p(*(j->read_buffer + cnt), get_ixj(j->intercom)->DSPbase + 0x0C);
2956					outb_p(*(j->read_buffer + cnt + 1), get_ixj(j->intercom)->DSPbase + 0x0D);
2957				}
2958				get_ixj(j->intercom)->frameswritten++;
2959			}
2960		} else {
2961			j->read_buffer_ready = 1;
2962			wake_up_interruptible(&j->read_q);	/* Wake any blocked readers */
2963
2964			wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */
2965
2966			if(j->ixj_signals[SIG_READ_READY])
2967				ixj_kill_fasync(j, SIG_READ_READY, POLL_OUT);
2968		}
2969	}
2970}
2971
2972static short fsk[][6][20] =
2973{
2974	{
2975		{
2976			0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196,
2977			-16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722
2978		},
2979		{
2980			-28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481,
2981			-32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876
2982		},
2983		{
2984			-28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715,
2985			-16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846
2986		},
2987		{
2988			0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196,
2989			16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722
2990		},
2991		{
2992			28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481,
2993			32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876
2994		},
2995		{
2996			28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715,
2997			16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846
2998		}
2999	},
3000	{
3001		{
3002			0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126,
3003			0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126
3004		},
3005		{
3006			-28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051,
3007			28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051
3008		},
3009		{
3010			-28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925,
3011			28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925
3012		},
3013		{
3014			0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126,
3015			0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126
3016		},
3017		{
3018			28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051,
3019			-28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051
3020		},
3021		{
3022			28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925,
3023			-28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925
3024		}
3025	}
3026};
3027
3028
3029static void ixj_write_cid_bit(IXJ *j, int bit)
3030{
3031	while (j->fskcnt < 20) {
3032		if(j->fskdcnt < (j->fsksize - 1))
3033			j->fskdata[j->fskdcnt++] = fsk[bit][j->fskz][j->fskcnt];
3034
3035		j->fskcnt += 3;
3036	}
3037	j->fskcnt %= 20;
3038
3039	if (!bit)
3040		j->fskz++;
3041	if (j->fskz >= 6)
3042		j->fskz = 0;
3043
3044}
3045
3046static void ixj_write_cid_byte(IXJ *j, char byte)
3047{
3048	IXJ_CBYTE cb;
3049
3050		cb.cbyte = byte;
3051		ixj_write_cid_bit(j, 0);
3052		ixj_write_cid_bit(j, cb.cbits.b0 ? 1 : 0);
3053		ixj_write_cid_bit(j, cb.cbits.b1 ? 1 : 0);
3054		ixj_write_cid_bit(j, cb.cbits.b2 ? 1 : 0);
3055		ixj_write_cid_bit(j, cb.cbits.b3 ? 1 : 0);
3056		ixj_write_cid_bit(j, cb.cbits.b4 ? 1 : 0);
3057		ixj_write_cid_bit(j, cb.cbits.b5 ? 1 : 0);
3058		ixj_write_cid_bit(j, cb.cbits.b6 ? 1 : 0);
3059		ixj_write_cid_bit(j, cb.cbits.b7 ? 1 : 0);
3060		ixj_write_cid_bit(j, 1);
3061}
3062
3063static void ixj_write_cid_seize(IXJ *j)
3064{
3065	int cnt;
3066
3067	for (cnt = 0; cnt < 150; cnt++) {
3068		ixj_write_cid_bit(j, 0);
3069		ixj_write_cid_bit(j, 1);
3070	}
3071	for (cnt = 0; cnt < 180; cnt++) {
3072		ixj_write_cid_bit(j, 1);
3073	}
3074}
3075
3076static void ixj_write_cidcw_seize(IXJ *j)
3077{
3078	int cnt;
3079
3080	for (cnt = 0; cnt < 80; cnt++) {
3081		ixj_write_cid_bit(j, 1);
3082	}
3083}
3084
3085static int ixj_write_cid_string(IXJ *j, char *s, int checksum)
3086{
3087	int cnt;
3088
3089	for (cnt = 0; cnt < strlen(s); cnt++) {
3090		ixj_write_cid_byte(j, s[cnt]);
3091		checksum = (checksum + s[cnt]);
3092	}
3093	return checksum;
3094}
3095
3096static void ixj_pad_fsk(IXJ *j, int pad)
3097{
3098	int cnt;
3099
3100	for (cnt = 0; cnt < pad; cnt++) {
3101		if(j->fskdcnt < (j->fsksize - 1))
3102			j->fskdata[j->fskdcnt++] = 0x0000;
3103	}
3104	for (cnt = 0; cnt < 720; cnt++) {
3105		if(j->fskdcnt < (j->fsksize - 1))
3106			j->fskdata[j->fskdcnt++] = 0x0000;
3107	}
3108}
3109
3110static void ixj_pre_cid(IXJ *j)
3111{
3112	j->cid_play_codec = j->play_codec;
3113	j->cid_play_frame_size = j->play_frame_size;
3114	j->cid_play_volume = get_play_volume(j);
3115	j->cid_play_flag = j->flags.playing;
3116
3117	j->cid_rec_codec = j->rec_codec;
3118	j->cid_rec_volume = get_rec_volume(j);
3119	j->cid_rec_flag = j->flags.recording;
3120
3121	j->cid_play_aec_level = j->aec_level;
3122
3123	switch(j->baseframe.low) {
3124		case 0xA0:
3125			j->cid_base_frame_size = 20;
3126			break;
3127		case 0x50:
3128			j->cid_base_frame_size = 10;
3129			break;
3130		case 0xF0:
3131			j->cid_base_frame_size = 30;
3132			break;
3133	}
3134
3135	ixj_play_stop(j);
3136	ixj_cpt_stop(j);
3137
3138	j->flags.cidplay = 1;
3139
3140	set_base_frame(j, 30);
3141	set_play_codec(j, LINEAR16);
3142	set_play_volume(j, 0x1B);
3143	ixj_play_start(j);
3144}
3145
3146static void ixj_post_cid(IXJ *j)
3147{
3148	ixj_play_stop(j);
3149
3150	if(j->cidsize > 5000) {
3151		SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
3152	}
3153	j->flags.cidplay = 0;
3154	if(ixjdebug & 0x0200) {
3155		printk("IXJ phone%d Finished Playing CallerID data %ld\n", j->board, jiffies);
3156	}
3157
3158	ixj_fsk_free(j);
3159
3160	j->fskdcnt = 0;
3161	set_base_frame(j, j->cid_base_frame_size);
3162	set_play_codec(j, j->cid_play_codec);
3163	ixj_aec_start(j, j->cid_play_aec_level);
3164	set_play_volume(j, j->cid_play_volume);
3165
3166	set_rec_codec(j, j->cid_rec_codec);
3167	set_rec_volume(j, j->cid_rec_volume);
3168
3169	if(j->cid_rec_flag)
3170		ixj_record_start(j);
3171
3172	if(j->cid_play_flag)
3173		ixj_play_start(j);
3174
3175	if(j->cid_play_flag) {
3176		wake_up_interruptible(&j->write_q);	/* Wake any blocked writers */
3177	}
3178}
3179
3180static void ixj_write_cid(IXJ *j)
3181{
3182	char sdmf1[50];
3183	char sdmf2[50];
3184	char sdmf3[80];
3185	char mdmflen, len1, len2, len3;
3186	int pad;
3187
3188	int checksum = 0;
3189
3190	if (j->dsp.low == 0x20 || j->flags.cidplay)
3191		return;
3192
3193	j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3194	j->cidsize = j->cidcnt = 0;
3195
3196	ixj_fsk_alloc(j);
3197
3198	strcpy(sdmf1, j->cid_send.month);
3199	strcat(sdmf1, j->cid_send.day);
3200	strcat(sdmf1, j->cid_send.hour);
3201	strcat(sdmf1, j->cid_send.min);
3202	strcpy(sdmf2, j->cid_send.number);
3203	strcpy(sdmf3, j->cid_send.name);
3204
3205	len1 = strlen(sdmf1);
3206	len2 = strlen(sdmf2);
3207	len3 = strlen(sdmf3);
3208	mdmflen = len1 + len2 + len3 + 6;
3209
3210	while(1){
3211		ixj_write_cid_seize(j);
3212
3213		ixj_write_cid_byte(j, 0x80);
3214		checksum = 0x80;
3215		ixj_write_cid_byte(j, mdmflen);
3216		checksum = checksum + mdmflen;
3217
3218		ixj_write_cid_byte(j, 0x01);
3219		checksum = checksum + 0x01;
3220		ixj_write_cid_byte(j, len1);
3221		checksum = checksum + len1;
3222		checksum = ixj_write_cid_string(j, sdmf1, checksum);
3223		if(ixj_hookstate(j) & 1)
3224			break;
3225
3226		ixj_write_cid_byte(j, 0x02);
3227		checksum = checksum + 0x02;
3228		ixj_write_cid_byte(j, len2);
3229		checksum = checksum + len2;
3230		checksum = ixj_write_cid_string(j, sdmf2, checksum);
3231		if(ixj_hookstate(j) & 1)
3232			break;
3233
3234		ixj_write_cid_byte(j, 0x07);
3235		checksum = checksum + 0x07;
3236		ixj_write_cid_byte(j, len3);
3237		checksum = checksum + len3;
3238		checksum = ixj_write_cid_string(j, sdmf3, checksum);
3239		if(ixj_hookstate(j) & 1)
3240			break;
3241
3242		checksum %= 256;
3243		checksum ^= 0xFF;
3244		checksum += 1;
3245
3246		ixj_write_cid_byte(j, (char) checksum);
3247
3248		pad = j->fskdcnt % 240;
3249		if (pad) {
3250			pad = 240 - pad;
3251		}
3252		ixj_pad_fsk(j, pad);
3253		break;
3254	}
3255
3256	ixj_write_frame(j);
3257}
3258
3259static void ixj_write_cidcw(IXJ *j)
3260{
3261	IXJ_TONE ti;
3262
3263	char sdmf1[50];
3264	char sdmf2[50];
3265	char sdmf3[80];
3266	char mdmflen, len1, len2, len3;
3267	int pad;
3268
3269	int checksum = 0;
3270
3271	if (j->dsp.low == 0x20 || j->flags.cidplay)
3272		return;
3273
3274	j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3275	j->cidsize = j->cidcnt = 0;
3276
3277	ixj_fsk_alloc(j);
3278
3279	j->flags.cidcw_ack = 0;
3280
3281	ti.tone_index = 23;
3282	ti.gain0 = 1;
3283	ti.freq0 = hz440;
3284	ti.gain1 = 0;
3285	ti.freq1 = 0;
3286	ixj_init_tone(j, &ti);
3287
3288	ixj_set_tone_on(1500, j);
3289	ixj_set_tone_off(32, j);
3290	if(ixjdebug & 0x0200) {
3291		printk("IXJ cidcw phone%d first tone start at %ld\n", j->board, jiffies);
3292	}
3293	ixj_play_tone(j, 23);
3294
3295	clear_bit(j->board, &j->busyflags);
3296	while(j->tone_state)
3297		schedule_timeout_interruptible(1);
3298	while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3299		schedule_timeout_interruptible(1);
3300	if(ixjdebug & 0x0200) {
3301		printk("IXJ cidcw phone%d first tone end at %ld\n", j->board, jiffies);
3302	}
3303
3304	ti.tone_index = 24;
3305	ti.gain0 = 1;
3306	ti.freq0 = hz2130;
3307	ti.gain1 = 0;
3308	ti.freq1 = hz2750;
3309	ixj_init_tone(j, &ti);
3310
3311	ixj_set_tone_off(10, j);
3312	ixj_set_tone_on(600, j);
3313	if(ixjdebug & 0x0200) {
3314		printk("IXJ cidcw phone%d second tone start at %ld\n", j->board, jiffies);
3315	}
3316	ixj_play_tone(j, 24);
3317
3318	clear_bit(j->board, &j->busyflags);
3319	while(j->tone_state)
3320		schedule_timeout_interruptible(1);
3321	while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3322		schedule_timeout_interruptible(1);
3323	if(ixjdebug & 0x0200) {
3324		printk("IXJ cidcw phone%d sent second tone at %ld\n", j->board, jiffies);
3325	}
3326
3327	j->cidcw_wait = jiffies + ((50 * hertz) / 100);
3328
3329	clear_bit(j->board, &j->busyflags);
3330	while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait))
3331		schedule_timeout_interruptible(1);
3332	while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3333		schedule_timeout_interruptible(1);
3334	j->cidcw_wait = 0;
3335	if(!j->flags.cidcw_ack) {
3336		if(ixjdebug & 0x0200) {
3337			printk("IXJ cidcw phone%d did not receive ACK from display %ld\n", j->board, jiffies);
3338		}
3339		ixj_post_cid(j);
3340		if(j->cid_play_flag) {
3341			wake_up_interruptible(&j->write_q);	/* Wake any blocked readers */
3342		}
3343		return;
3344	} else {
3345		ixj_pre_cid(j);
3346	}
3347	j->flags.cidcw_ack = 0;
3348	strcpy(sdmf1, j->cid_send.month);
3349	strcat(sdmf1, j->cid_send.day);
3350	strcat(sdmf1, j->cid_send.hour);
3351	strcat(sdmf1, j->cid_send.min);
3352	strcpy(sdmf2, j->cid_send.number);
3353	strcpy(sdmf3, j->cid_send.name);
3354
3355	len1 = strlen(sdmf1);
3356	len2 = strlen(sdmf2);
3357	len3 = strlen(sdmf3);
3358	mdmflen = len1 + len2 + len3 + 6;
3359
3360	ixj_write_cidcw_seize(j);
3361
3362	ixj_write_cid_byte(j, 0x80);
3363	checksum = 0x80;
3364	ixj_write_cid_byte(j, mdmflen);
3365	checksum = checksum + mdmflen;
3366
3367	ixj_write_cid_byte(j, 0x01);
3368	checksum = checksum + 0x01;
3369	ixj_write_cid_byte(j, len1);
3370	checksum = checksum + len1;
3371	checksum = ixj_write_cid_string(j, sdmf1, checksum);
3372
3373	ixj_write_cid_byte(j, 0x02);
3374	checksum = checksum + 0x02;
3375	ixj_write_cid_byte(j, len2);
3376	checksum = checksum + len2;
3377	checksum = ixj_write_cid_string(j, sdmf2, checksum);
3378
3379	ixj_write_cid_byte(j, 0x07);
3380	checksum = checksum + 0x07;
3381	ixj_write_cid_byte(j, len3);
3382	checksum = checksum + len3;
3383	checksum = ixj_write_cid_string(j, sdmf3, checksum);
3384
3385	checksum %= 256;
3386	checksum ^= 0xFF;
3387	checksum += 1;
3388
3389	ixj_write_cid_byte(j, (char) checksum);
3390
3391	pad = j->fskdcnt % 240;
3392	if (pad) {
3393		pad = 240 - pad;
3394	}
3395	ixj_pad_fsk(j, pad);
3396	if(ixjdebug & 0x0200) {
3397		printk("IXJ cidcw phone%d sent FSK data at %ld\n", j->board, jiffies);
3398	}
3399}
3400
3401static void ixj_write_vmwi(IXJ *j, int msg)
3402{
3403	char mdmflen;
3404	int pad;
3405
3406	int checksum = 0;
3407
3408	if (j->dsp.low == 0x20 || j->flags.cidplay)
3409		return;
3410
3411	j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3412	j->cidsize = j->cidcnt = 0;
3413
3414	ixj_fsk_alloc(j);
3415
3416	mdmflen = 3;
3417
3418	if (j->port == PORT_POTS)
3419		SLIC_SetState(PLD_SLIC_STATE_OHT, j);
3420
3421	ixj_write_cid_seize(j);
3422
3423	ixj_write_cid_byte(j, 0x82);
3424	checksum = 0x82;
3425	ixj_write_cid_byte(j, mdmflen);
3426	checksum = checksum + mdmflen;
3427
3428	ixj_write_cid_byte(j, 0x0B);
3429	checksum = checksum + 0x0B;
3430	ixj_write_cid_byte(j, 1);
3431	checksum = checksum + 1;
3432
3433	if(msg) {
3434		ixj_write_cid_byte(j, 0xFF);
3435		checksum = checksum + 0xFF;
3436	}
3437	else {
3438		ixj_write_cid_byte(j, 0x00);
3439		checksum = checksum + 0x00;
3440	}
3441
3442	checksum %= 256;
3443	checksum ^= 0xFF;
3444	checksum += 1;
3445
3446	ixj_write_cid_byte(j, (char) checksum);
3447
3448	pad = j->fskdcnt % 240;
3449	if (pad) {
3450		pad = 240 - pad;
3451	}
3452	ixj_pad_fsk(j, pad);
3453}
3454
3455static void ixj_write_frame(IXJ *j)
3456{
3457	int cnt, frame_count, dly;
3458	IXJ_WORD dat;
3459	BYTES blankword;
3460
3461	frame_count = 0;
3462	if(j->flags.cidplay) {
3463		for(cnt = 0; cnt < 480; cnt++) {
3464			if (!(cnt % 16) && !IsTxReady(j)) {
3465				dly = 0;
3466				while (!IsTxReady(j)) {
3467					if (dly++ > 5) {
3468						dly = 0;
3469						break;
3470					}
3471					udelay(10);
3472				}
3473			}
3474			dat.word = j->fskdata[j->cidcnt++];
3475			outb_p(dat.bytes.low, j->DSPbase + 0x0C);
3476			outb_p(dat.bytes.high, j->DSPbase + 0x0D);
3477			cnt++;
3478		}
3479		if(j->cidcnt >= j->fskdcnt) {
3480			ixj_post_cid(j);
3481		}
3482		/* This may seem rude, but if we just played one frame of FSK data for CallerID
3483		   and there is real audio data in the buffer, we need to throw it away because
3484		   we just used it's time slot */
3485		if (j->write_buffer_rp > j->write_buffer_wp) {
3486			j->write_buffer_rp += j->cid_play_frame_size * 2;
3487			if (j->write_buffer_rp >= j->write_buffer_end) {
3488				j->write_buffer_rp = j->write_buffer;
3489			}
3490			j->write_buffers_empty++;
3491			wake_up_interruptible(&j->write_q);	/* Wake any blocked writers */
3492
3493			wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */
3494		}
3495	} else if (j->write_buffer && j->write_buffers_empty < 1) {
3496		if (j->write_buffer_wp > j->write_buffer_rp) {
3497			frame_count =
3498			    (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2);
3499		}
3500		if (j->write_buffer_rp > j->write_buffer_wp) {
3501			frame_count =
3502			    (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) +
3503			    (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2);
3504		}
3505		if (frame_count >= 1) {
3506			if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) {
3507				switch (j->play_mode) {
3508				case PLAYBACK_MODE_ULAW:
3509				case PLAYBACK_MODE_ALAW:
3510					blankword.low = blankword.high = 0xFF;
3511					break;
3512				case PLAYBACK_MODE_8LINEAR:
3513				case PLAYBACK_MODE_16LINEAR:
3514					blankword.low = blankword.high = 0x00;
3515					break;
3516				case PLAYBACK_MODE_8LINEAR_WSS:
3517					blankword.low = blankword.high = 0x80;
3518					break;
3519				}
3520				for (cnt = 0; cnt < 16; cnt++) {
3521					if (!(cnt % 16) && !IsTxReady(j)) {
3522						dly = 0;
3523						while (!IsTxReady(j)) {
3524							if (dly++ > 5) {
3525								dly = 0;
3526								break;
3527							}
3528							udelay(10);
3529						}
3530					}
3531					outb_p((blankword.low), j->DSPbase + 0x0C);
3532					outb_p((blankword.high), j->DSPbase + 0x0D);
3533				}
3534				j->flags.play_first_frame = 0;
3535			} else	if (j->play_codec == G723_63 && j->flags.play_first_frame) {
3536				for (cnt = 0; cnt < 24; cnt++) {
3537					if(cnt == 12) {
3538						blankword.low = 0x02;
3539						blankword.high = 0x00;
3540					}
3541					else {
3542						blankword.low = blankword.high = 0x00;
3543					}
3544					if (!(cnt % 16) && !IsTxReady(j)) {
3545						dly = 0;
3546						while (!IsTxReady(j)) {
3547							if (dly++ > 5) {
3548								dly = 0;
3549								break;
3550							}
3551							udelay(10);
3552						}
3553					}
3554					outb_p((blankword.low), j->DSPbase + 0x0C);
3555					outb_p((blankword.high), j->DSPbase + 0x0D);
3556				}
3557				j->flags.play_first_frame = 0;
3558			}
3559			for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) {
3560				if (!(cnt % 16) && !IsTxReady(j)) {
3561					dly = 0;
3562					while (!IsTxReady(j)) {
3563						if (dly++ > 5) {
3564							dly = 0;
3565							break;
3566						}
3567						udelay(10);
3568					}
3569				}
3570			/* Add word 0 to G.729 frames for the 8021.  Right now we don't do VAD/CNG  */
3571				if (j->play_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
3572					if (j->write_buffer_rp[cnt] == 0 &&
3573					    j->write_buffer_rp[cnt + 1] == 0 &&
3574					    j->write_buffer_rp[cnt + 2] == 0 &&
3575					    j->write_buffer_rp[cnt + 3] == 0 &&
3576					    j->write_buffer_rp[cnt + 4] == 0 &&
3577					    j->write_buffer_rp[cnt + 5] == 0 &&
3578					    j->write_buffer_rp[cnt + 6] == 0 &&
3579					    j->write_buffer_rp[cnt + 7] == 0 &&
3580					    j->write_buffer_rp[cnt + 8] == 0 &&
3581					    j->write_buffer_rp[cnt + 9] == 0) {
3582					/* someone is trying to write silence lets make this a type 0 frame. */
3583						outb_p(0x00, j->DSPbase + 0x0C);
3584						outb_p(0x00, j->DSPbase + 0x0D);
3585					} else {
3586					/* so all other frames are type 1. */
3587						outb_p(0x01, j->DSPbase + 0x0C);
3588						outb_p(0x00, j->DSPbase + 0x0D);
3589					}
3590				}
3591				outb_p(*(j->write_buffer_rp + cnt), j->DSPbase + 0x0C);
3592				outb_p(*(j->write_buffer_rp + cnt + 1), j->DSPbase + 0x0D);
3593				*(j->write_buffer_rp + cnt) = 0;
3594				*(j->write_buffer_rp + cnt + 1) = 0;
3595			}
3596			j->write_buffer_rp += j->play_frame_size * 2;
3597			if (j->write_buffer_rp >= j->write_buffer_end) {
3598				j->write_buffer_rp = j->write_buffer;
3599			}
3600			j->write_buffers_empty++;
3601			wake_up_interruptible(&j->write_q);	/* Wake any blocked writers */
3602
3603			wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */
3604
3605			++j->frameswritten;
3606		}
3607	} else {
3608		j->drybuffer++;
3609	}
3610	if(j->ixj_signals[SIG_WRITE_READY]) {
3611		ixj_kill_fasync(j, SIG_WRITE_READY, POLL_OUT);
3612	}
3613}
3614
3615static int idle(IXJ *j)
3616{
3617	if (ixj_WriteDSPCommand(0x0000, j))		/* DSP Idle */
3618
3619		return 0;
3620
3621	if (j->ssr.high || j->ssr.low) {
3622		return 0;
3623	} else {
3624		j->play_mode = -1;
3625		j->flags.playing = 0;
3626		j->rec_mode = -1;
3627		j->flags.recording = 0;
3628		return 1;
3629        }
3630}
3631
3632static int set_base_frame(IXJ *j, int size)
3633{
3634	unsigned short cmd;
3635	int cnt;
3636
3637	idle(j);
3638	j->cid_play_aec_level = j->aec_level;
3639	aec_stop(j);
3640	for (cnt = 0; cnt < 10; cnt++) {
3641		if (idle(j))
3642			break;
3643	}
3644	if (j->ssr.high || j->ssr.low)
3645		return -1;
3646	if (j->dsp.low != 0x20) {
3647		switch (size) {
3648		case 30:
3649			cmd = 0x07F0;
3650			/* Set Base Frame Size to 240 pg9-10 8021 */
3651			break;
3652		case 20:
3653			cmd = 0x07A0;
3654			/* Set Base Frame Size to 160 pg9-10 8021 */
3655			break;
3656		case 10:
3657			cmd = 0x0750;
3658			/* Set Base Frame Size to 80 pg9-10 8021 */
3659			break;
3660		default:
3661			return -1;
3662		}
3663	} else {
3664		if (size == 30)
3665			return size;
3666		else
3667			return -1;
3668	}
3669	if (ixj_WriteDSPCommand(cmd, j)) {
3670		j->baseframe.high = j->baseframe.low = 0xFF;
3671		return -1;
3672	} else {
3673		j->baseframe.high = j->ssr.high;
3674		j->baseframe.low = j->ssr.low;
3675		/* If the status returned is 0x0000 (pg9-9 8021) the call failed */
3676		if(j->baseframe.high == 0x00 && j->baseframe.low == 0x00) {
3677			return -1;
3678		}
3679	}
3680	ixj_aec_start(j, j->cid_play_aec_level);
3681	return size;
3682}
3683
3684static int set_rec_codec(IXJ *j, int rate)
3685{
3686	int retval = 0;
3687
3688	j->rec_codec = rate;
3689
3690	switch (rate) {
3691	case G723_63:
3692		if (j->ver.low != 0x12 || ixj_convert_loaded) {
3693			j->rec_frame_size = 12;
3694			j->rec_mode = 0;
3695		} else {
3696			retval = 1;
3697		}
3698		break;
3699	case G723_53:
3700		if (j->ver.low != 0x12 || ixj_convert_loaded) {
3701			j->rec_frame_size = 10;
3702			j->rec_mode = 0;
3703		} else {
3704			retval = 1;
3705		}
3706		break;
3707	case TS85:
3708		if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
3709			j->rec_frame_size = 16;
3710			j->rec_mode = 0;
3711		} else {
3712			retval = 1;
3713		}
3714		break;
3715	case TS48:
3716		if (j->ver.low != 0x12 || ixj_convert_loaded) {
3717			j->rec_frame_size = 9;
3718			j->rec_mode = 0;
3719		} else {
3720			retval = 1;
3721		}
3722		break;
3723	case TS41:
3724		if (j->ver.low != 0x12 || ixj_convert_loaded) {
3725			j->rec_frame_size = 8;
3726			j->rec_mode = 0;
3727		} else {
3728			retval = 1;
3729		}
3730		break;
3731	case G728:
3732		if (j->dsp.low != 0x20) {
3733			j->rec_frame_size = 48;
3734			j->rec_mode = 0;
3735		} else {
3736			retval = 1;
3737		}
3738		break;
3739	case G729:
3740		if (j->dsp.low != 0x20) {
3741			if (!j->flags.g729_loaded) {
3742				retval = 1;
3743				break;
3744			}
3745			switch (j->baseframe.low) {
3746			case 0xA0:
3747				j->rec_frame_size = 10;
3748				break;
3749			case 0x50:
3750				j->rec_frame_size = 5;
3751				break;
3752			default:
3753				j->rec_frame_size = 15;
3754				break;
3755			}
3756			j->rec_mode = 0;
3757		} else {
3758			retval = 1;
3759		}
3760		break;
3761	case G729B:
3762		if (j->dsp.low != 0x20) {
3763			if (!j->flags.g729_loaded) {
3764				retval = 1;
3765				break;
3766			}
3767			switch (j->baseframe.low) {
3768			case 0xA0:
3769				j->rec_frame_size = 12;
3770				break;
3771			case 0x50:
3772				j->rec_frame_size = 6;
3773				break;
3774			default:
3775				j->rec_frame_size = 18;
3776				break;
3777			}
3778			j->rec_mode = 0;
3779		} else {
3780			retval = 1;
3781		}
3782		break;
3783	case ULAW:
3784		switch (j->baseframe.low) {
3785		case 0xA0:
3786			j->rec_frame_size = 80;
3787			break;
3788		case 0x50:
3789			j->rec_frame_size = 40;
3790			break;
3791		default:
3792			j->rec_frame_size = 120;
3793			break;
3794		}
3795		j->rec_mode = 4;
3796		break;
3797	case ALAW:
3798		switch (j->baseframe.low) {
3799		case 0xA0:
3800			j->rec_frame_size = 80;
3801			break;
3802		case 0x50:
3803			j->rec_frame_size = 40;
3804			break;
3805		default:
3806			j->rec_frame_size = 120;
3807			break;
3808		}
3809		j->rec_mode = 4;
3810		break;
3811	case LINEAR16:
3812		switch (j->baseframe.low) {
3813		case 0xA0:
3814			j->rec_frame_size = 160;
3815			break;
3816		case 0x50:
3817			j->rec_frame_size = 80;
3818			break;
3819		default:
3820			j->rec_frame_size = 240;
3821			break;
3822		}
3823		j->rec_mode = 5;
3824		break;
3825	case LINEAR8:
3826		switch (j->baseframe.low) {
3827		case 0xA0:
3828			j->rec_frame_size = 80;
3829			break;
3830		case 0x50:
3831			j->rec_frame_size = 40;
3832			break;
3833		default:
3834			j->rec_frame_size = 120;
3835			break;
3836		}
3837		j->rec_mode = 6;
3838		break;
3839	case WSS:
3840		switch (j->baseframe.low) {
3841		case 0xA0:
3842			j->rec_frame_size = 80;
3843			break;
3844		case 0x50:
3845			j->rec_frame_size = 40;
3846			break;
3847		default:
3848			j->rec_frame_size = 120;
3849			break;
3850		}
3851		j->rec_mode = 7;
3852		break;
3853	default:
3854		kfree(j->read_buffer);
3855		j->rec_frame_size = 0;
3856		j->rec_mode = -1;
3857		j->read_buffer = NULL;
3858		j->read_buffer_size = 0;
3859		retval = 1;
3860		break;
3861	}
3862	return retval;
3863}
3864
3865static int ixj_record_start(IXJ *j)
3866{
3867	unsigned short cmd = 0x0000;
3868
3869	if (j->read_buffer) {
3870		ixj_record_stop(j);
3871	}
3872	j->flags.recording = 1;
3873	ixj_WriteDSPCommand(0x0FE0, j);	/* Put the DSP in full power mode. */
3874
3875	if(ixjdebug & 0x0002)
3876		printk("IXJ %d Starting Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
3877
3878	if (!j->rec_mode) {
3879		switch (j->rec_codec) {
3880		case G723_63:
3881			cmd = 0x5131;
3882			break;
3883		case G723_53:
3884			cmd = 0x5132;
3885			break;
3886		case TS85:
3887			cmd = 0x5130;	/* TrueSpeech 8.5 */
3888
3889			break;
3890		case TS48:
3891			cmd = 0x5133;	/* TrueSpeech 4.8 */
3892
3893			break;
3894		case TS41:
3895			cmd = 0x5134;	/* TrueSpeech 4.1 */
3896
3897			break;
3898		case G728:
3899			cmd = 0x5135;
3900			break;
3901		case G729:
3902		case G729B:
3903			cmd = 0x5136;
3904			break;
3905		default:
3906			return 1;
3907		}
3908		if (ixj_WriteDSPCommand(cmd, j))
3909			return -1;
3910	}
3911	if (!j->read_buffer) {
3912		if (!j->read_buffer)
3913			j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_ATOMIC);
3914		if (!j->read_buffer) {
3915			printk("Read buffer allocation for ixj board %d failed!\n", j->board);
3916			return -ENOMEM;
3917		}
3918	}
3919	j->read_buffer_size = j->rec_frame_size * 2;
3920
3921	if (ixj_WriteDSPCommand(0x5102, j))		/* Set Poll sync mode */
3922
3923		return -1;
3924
3925	switch (j->rec_mode) {
3926	case 0:
3927		cmd = 0x1C03;	/* Record C1 */
3928
3929		break;
3930	case 4:
3931		if (j->ver.low == 0x12) {
3932			cmd = 0x1E03;	/* Record C1 */
3933
3934		} else {
3935			cmd = 0x1E01;	/* Record C1 */
3936
3937		}
3938		break;
3939	case 5:
3940		if (j->ver.low == 0x12) {
3941			cmd = 0x1E83;	/* Record C1 */
3942
3943		} else {
3944			cmd = 0x1E81;	/* Record C1 */
3945
3946		}
3947		break;
3948	case 6:
3949		if (j->ver.low == 0x12) {
3950			cmd = 0x1F03;	/* Record C1 */
3951
3952		} else {
3953			cmd = 0x1F01;	/* Record C1 */
3954
3955		}
3956		break;
3957	case 7:
3958		if (j->ver.low == 0x12) {
3959			cmd = 0x1F83;	/* Record C1 */
3960		} else {
3961			cmd = 0x1F81;	/* Record C1 */
3962		}
3963		break;
3964	}
3965	if (ixj_WriteDSPCommand(cmd, j))
3966		return -1;
3967
3968	if (j->flags.playing) {
3969		ixj_aec_start(j, j->aec_level);
3970	}
3971	return 0;
3972}
3973
3974static void ixj_record_stop(IXJ *j)
3975{
3976	if (ixjdebug & 0x0002)
3977		printk("IXJ %d Stopping Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
3978
3979	kfree(j->read_buffer);
3980	j->read_buffer = NULL;
3981	j->read_buffer_size = 0;
3982	if (j->rec_mode > -1) {
3983		ixj_WriteDSPCommand(0x5120, j);
3984		j->rec_mode = -1;
3985	}
3986	j->flags.recording = 0;
3987}
3988static void ixj_vad(IXJ *j, int arg)
3989{
3990	if (arg)
3991		ixj_WriteDSPCommand(0x513F, j);
3992	else
3993		ixj_WriteDSPCommand(0x513E, j);
3994}
3995
3996static void set_rec_depth(IXJ *j, int depth)
3997{
3998	if (depth > 60)
3999		depth = 60;
4000	if (depth < 0)
4001		depth = 0;
4002	ixj_WriteDSPCommand(0x5180 + depth, j);
4003}
4004
4005static void set_dtmf_prescale(IXJ *j, int volume)
4006{
4007	ixj_WriteDSPCommand(0xCF07, j);
4008	ixj_WriteDSPCommand(volume, j);
4009}
4010
4011static int get_dtmf_prescale(IXJ *j)
4012{
4013	ixj_WriteDSPCommand(0xCF05, j);
4014	return j->ssr.high << 8 | j->ssr.low;
4015}
4016
4017static void set_rec_volume(IXJ *j, int volume)
4018{
4019	if(j->aec_level == AEC_AGC) {
4020		if (ixjdebug & 0x0002)
4021			printk(KERN_INFO "IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4x\n", j->board, volume);
4022		ixj_WriteDSPCommand(0xCF96, j);
4023		ixj_WriteDSPCommand(volume, j);
4024	} else {
4025		if (ixjdebug & 0x0002)
4026			printk(KERN_INFO "IXJ: /dev/phone %d Setting Record Volume to 0x%4.4x\n", j->board, volume);
4027		ixj_WriteDSPCommand(0xCF03, j);
4028		ixj_WriteDSPCommand(volume, j);
4029	}
4030}
4031
4032static int set_rec_volume_linear(IXJ *j, int volume)
4033{
4034	int newvolume, dsprecmax;
4035
4036	if (ixjdebug & 0x0002)
4037		printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4x\n", j->board, volume);
4038	if(volume > 100 || volume < 0) {
4039	  return -1;
4040	}
4041
4042	/* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
4043	switch (j->cardtype) {
4044	case QTI_PHONEJACK:
4045		dsprecmax = 0x440;
4046		break;
4047	case QTI_LINEJACK:
4048		dsprecmax = 0x180;
4049		ixj_mixer(0x0203, j);	/*Voice Left Volume unmute 6db */
4050		ixj_mixer(0x0303, j);	/*Voice Right Volume unmute 6db */
4051		ixj_mixer(0x0C00, j);	/*Mono1 unmute 12db */
4052		break;
4053	case QTI_PHONEJACK_LITE:
4054		dsprecmax = 0x4C0;
4055		break;
4056	case QTI_PHONEJACK_PCI:
4057		dsprecmax = 0x100;
4058		break;
4059	case QTI_PHONECARD:
4060		dsprecmax = 0x400;
4061		break;
4062	default:
4063		return -1;
4064	}
4065	newvolume = (dsprecmax * volume) / 100;
4066	set_rec_volume(j, newvolume);
4067	return 0;
4068}
4069
4070static int get_rec_volume(IXJ *j)
4071{
4072	if(j->aec_level == AEC_AGC) {
4073		if (ixjdebug & 0x0002)
4074			printk(KERN_INFO "Getting AGC Threshold\n");
4075		ixj_WriteDSPCommand(0xCF86, j);
4076		if (ixjdebug & 0x0002)
4077			printk(KERN_INFO "AGC Threshold is 0x%2.2x%2.2x\n", j->ssr.high, j->ssr.low);
4078		return j->ssr.high << 8 | j->ssr.low;
4079	} else {
4080		if (ixjdebug & 0x0002)
4081			printk(KERN_INFO "Getting Record Volume\n");
4082		ixj_WriteDSPCommand(0xCF01, j);
4083		return j->ssr.high << 8 | j->ssr.low;
4084	}
4085}
4086
4087static int get_rec_volume_linear(IXJ *j)
4088{
4089	int volume, newvolume, dsprecmax;
4090
4091	switch (j->cardtype) {
4092	case QTI_PHONEJACK:
4093		dsprecmax = 0x440;
4094		break;
4095	case QTI_LINEJACK:
4096		dsprecmax = 0x180;
4097		break;
4098	case QTI_PHONEJACK_LITE:
4099		dsprecmax = 0x4C0;
4100		break;
4101	case QTI_PHONEJACK_PCI:
4102		dsprecmax = 0x100;
4103		break;
4104	case QTI_PHONECARD:
4105		dsprecmax = 0x400;
4106		break;
4107	default:
4108		return -1;
4109	}
4110	volume = get_rec_volume(j);
4111	newvolume = (volume * 100) / dsprecmax;
4112	if(newvolume > 100)
4113		newvolume = 100;
4114	return newvolume;
4115}
4116
4117static int get_rec_level(IXJ *j)
4118{
4119	int retval;
4120
4121	ixj_WriteDSPCommand(0xCF88, j);
4122
4123	retval = j->ssr.high << 8 | j->ssr.low;
4124	retval = (retval * 256) / 240;
4125	return retval;
4126}
4127
4128static void ixj_aec_start(IXJ *j, int level)
4129{
4130	j->aec_level = level;
4131	if (ixjdebug & 0x0002)
4132		printk(KERN_INFO "AGC set = 0x%2.2x\n", j->aec_level);
4133	if (!level) {
4134		aec_stop(j);
4135	} else {
4136		if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4137			ixj_WriteDSPCommand(0xE022, j);	/* Move AEC filter buffer */
4138
4139			ixj_WriteDSPCommand(0x0300, j);
4140		}
4141		ixj_WriteDSPCommand(0xB001, j);	/* AEC On */
4142
4143		ixj_WriteDSPCommand(0xE013, j);	/* Advanced AEC C1 */
4144
4145		switch (level) {
4146		case AEC_LOW:
4147			ixj_WriteDSPCommand(0x0000, j);	/* Advanced AEC C2 = off */
4148
4149			ixj_WriteDSPCommand(0xE011, j);
4150			ixj_WriteDSPCommand(0xFFFF, j);
4151
4152			ixj_WriteDSPCommand(0xCF97, j);	/* Set AGC Enable */
4153			ixj_WriteDSPCommand(0x0000, j);	/* to off */
4154
4155			break;
4156
4157		case AEC_MED:
4158			ixj_WriteDSPCommand(0x0600, j);	/* Advanced AEC C2 = on medium */
4159
4160			ixj_WriteDSPCommand(0xE011, j);
4161			ixj_WriteDSPCommand(0x0080, j);
4162
4163			ixj_WriteDSPCommand(0xCF97, j);	/* Set AGC Enable */
4164			ixj_WriteDSPCommand(0x0000, j);	/* to off */
4165
4166			break;
4167
4168		case AEC_HIGH:
4169			ixj_WriteDSPCommand(0x0C00, j);	/* Advanced AEC C2 = on high */
4170
4171			ixj_WriteDSPCommand(0xE011, j);
4172			ixj_WriteDSPCommand(0x0080, j);
4173
4174			ixj_WriteDSPCommand(0xCF97, j);	/* Set AGC Enable */
4175			ixj_WriteDSPCommand(0x0000, j);	/* to off */
4176
4177			break;
4178
4179		case AEC_AGC:
4180                        /* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */
4181			ixj_WriteDSPCommand(0x0002, j);	/* Attenuation scaling factor of 2 */
4182
4183			ixj_WriteDSPCommand(0xE011, j);
4184			ixj_WriteDSPCommand(0x0100, j);	/* Higher Threshold Floor */
4185
4186			ixj_WriteDSPCommand(0xE012, j);	/* Set Train and Lock */
4187
4188			if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4189				ixj_WriteDSPCommand(0x0224, j);
4190			else
4191				ixj_WriteDSPCommand(0x1224, j);
4192
4193			ixj_WriteDSPCommand(0xE014, j);
4194			ixj_WriteDSPCommand(0x0003, j);	/* Lock threashold at 3dB */
4195
4196			ixj_WriteDSPCommand(0xE338, j);	/* Set Echo Suppresser Attenuation to 0dB */
4197
4198			/* Now we can set the AGC initial parameters and turn it on */
4199			ixj_WriteDSPCommand(0xCF90, j);	/* Set AGC Minumum gain */
4200			ixj_WriteDSPCommand(0x0020, j);	/* to 0.125 (-18dB) */
4201
4202			ixj_WriteDSPCommand(0xCF91, j);	/* Set AGC Maximum gain */
4203			ixj_WriteDSPCommand(0x1000, j);	/* to 16 (24dB) */
4204
4205			ixj_WriteDSPCommand(0xCF92, j);	/* Set AGC start gain */
4206			ixj_WriteDSPCommand(0x0800, j);	/* to 8 (+18dB) */
4207
4208			ixj_WriteDSPCommand(0xCF93, j);	/* Set AGC hold time */
4209			ixj_WriteDSPCommand(0x1F40, j);	/* to 2 seconds (units are 250us) */
4210
4211			ixj_WriteDSPCommand(0xCF94, j);	/* Set AGC Attack Time Constant */
4212			ixj_WriteDSPCommand(0x0005, j);	/* to 8ms */
4213
4214			ixj_WriteDSPCommand(0xCF95, j);	/* Set AGC Decay Time Constant */
4215			ixj_WriteDSPCommand(0x000D, j);	/* to 4096ms */
4216
4217			ixj_WriteDSPCommand(0xCF96, j);	/* Set AGC Attack Threshold */
4218			ixj_WriteDSPCommand(0x1200, j);	/* to 25% */
4219
4220			ixj_WriteDSPCommand(0xCF97, j);	/* Set AGC Enable */
4221			ixj_WriteDSPCommand(0x0001, j);	/* to on */
4222
4223			break;
4224
4225		case AEC_AUTO:
4226			ixj_WriteDSPCommand(0x0002, j);	/* Attenuation scaling factor of 2 */
4227
4228			ixj_WriteDSPCommand(0xE011, j);
4229			ixj_WriteDSPCommand(0x0100, j);	/* Higher Threshold Floor */
4230
4231			ixj_WriteDSPCommand(0xE012, j);	/* Set Train and Lock */
4232
4233			if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4234				ixj_WriteDSPCommand(0x0224, j);
4235			else
4236				ixj_WriteDSPCommand(0x1224, j);
4237
4238			ixj_WriteDSPCommand(0xE014, j);
4239			ixj_WriteDSPCommand(0x0003, j);	/* Lock threashold at 3dB */
4240
4241			ixj_WriteDSPCommand(0xE338, j);	/* Set Echo Suppresser Attenuation to 0dB */
4242
4243			break;
4244		}
4245	}
4246}
4247
4248static void aec_stop(IXJ *j)
4249{
4250	j->aec_level = AEC_OFF;
4251	if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4252		ixj_WriteDSPCommand(0xE022, j);	/* Move AEC filter buffer back */
4253
4254		ixj_WriteDSPCommand(0x0700, j);
4255	}
4256	if (j->play_mode != -1 && j->rec_mode != -1)
4257	{
4258		ixj_WriteDSPCommand(0xB002, j);	/* AEC Stop */
4259	}
4260}
4261
4262static int set_play_codec(IXJ *j, int rate)
4263{
4264	int retval = 0;
4265
4266	j->play_codec = rate;
4267
4268	switch (rate) {
4269	case G723_63:
4270		if (j->ver.low != 0x12 || ixj_convert_loaded) {
4271			j->play_frame_size = 12;
4272			j->play_mode = 0;
4273		} else {
4274			retval = 1;
4275		}
4276		break;
4277	case G723_53:
4278		if (j->ver.low != 0x12 || ixj_convert_loaded) {
4279			j->play_frame_size = 10;
4280			j->play_mode = 0;
4281		} else {
4282			retval = 1;
4283		}
4284		break;
4285	case TS85:
4286		if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
4287			j->play_frame_size = 16;
4288			j->play_mode = 0;
4289		} else {
4290			retval = 1;
4291		}
4292		break;
4293	case TS48:
4294		if (j->ver.low != 0x12 || ixj_convert_loaded) {
4295			j->play_frame_size = 9;
4296			j->play_mode = 0;
4297		} else {
4298			retval = 1;
4299		}
4300		break;
4301	case TS41:
4302		if (j->ver.low != 0x12 || ixj_convert_loaded) {
4303			j->play_frame_size = 8;
4304			j->play_mode = 0;
4305		} else {
4306			retval = 1;
4307		}
4308		break;
4309	case G728:
4310		if (j->dsp.low != 0x20) {
4311			j->play_frame_size = 48;
4312			j->play_mode = 0;
4313		} else {
4314			retval = 1;
4315		}
4316		break;
4317	case G729:
4318		if (j->dsp.low != 0x20) {
4319			if (!j->flags.g729_loaded) {
4320				retval = 1;
4321				break;
4322			}
4323			switch (j->baseframe.low) {
4324			case 0xA0:
4325				j->play_frame_size = 10;
4326				break;
4327			case 0x50:
4328				j->play_frame_size = 5;
4329				break;
4330			default:
4331				j->play_frame_size = 15;
4332				break;
4333			}
4334			j->play_mode = 0;
4335		} else {
4336			retval = 1;
4337		}
4338		break;
4339	case G729B:
4340		if (j->dsp.low != 0x20) {
4341			if (!j->flags.g729_loaded) {
4342				retval = 1;
4343				break;
4344			}
4345			switch (j->baseframe.low) {
4346			case 0xA0:
4347				j->play_frame_size = 12;
4348				break;
4349			case 0x50:
4350				j->play_frame_size = 6;
4351				break;
4352			default:
4353				j->play_frame_size = 18;
4354				break;
4355			}
4356			j->play_mode = 0;
4357		} else {
4358			retval = 1;
4359		}
4360		break;
4361	case ULAW:
4362		switch (j->baseframe.low) {
4363		case 0xA0:
4364			j->play_frame_size = 80;
4365			break;
4366		case 0x50:
4367			j->play_frame_size = 40;
4368			break;
4369		default:
4370			j->play_frame_size = 120;
4371			break;
4372		}
4373		j->play_mode = 2;
4374		break;
4375	case ALAW:
4376		switch (j->baseframe.low) {
4377		case 0xA0:
4378			j->play_frame_size = 80;
4379			break;
4380		case 0x50:
4381			j->play_frame_size = 40;
4382			break;
4383		default:
4384			j->play_frame_size = 120;
4385			break;
4386		}
4387		j->play_mode = 2;
4388		break;
4389	case LINEAR16:
4390		switch (j->baseframe.low) {
4391		case 0xA0:
4392			j->play_frame_size = 160;
4393			break;
4394		case 0x50:
4395			j->play_frame_size = 80;
4396			break;
4397		default:
4398			j->play_frame_size = 240;
4399			break;
4400		}
4401		j->play_mode = 6;
4402		break;
4403	case LINEAR8:
4404		switch (j->baseframe.low) {
4405		case 0xA0:
4406			j->play_frame_size = 80;
4407			break;
4408		case 0x50:
4409			j->play_frame_size = 40;
4410			break;
4411		default:
4412			j->play_frame_size = 120;
4413			break;
4414		}
4415		j->play_mode = 4;
4416		break;
4417	case WSS:
4418		switch (j->baseframe.low) {
4419		case 0xA0:
4420			j->play_frame_size = 80;
4421			break;
4422		case 0x50:
4423			j->play_frame_size = 40;
4424			break;
4425		default:
4426			j->play_frame_size = 120;
4427			break;
4428		}
4429		j->play_mode = 5;
4430		break;
4431	default:
4432		kfree(j->write_buffer);
4433		j->play_frame_size = 0;
4434		j->play_mode = -1;
4435		j->write_buffer = NULL;
4436		j->write_buffer_size = 0;
4437		retval = 1;
4438		break;
4439	}
4440	return retval;
4441}
4442
4443static int ixj_play_start(IXJ *j)
4444{
4445	unsigned short cmd = 0x0000;
4446
4447	if (j->write_buffer) {
4448		ixj_play_stop(j);
4449	}
4450
4451	if(ixjdebug & 0x0002)
4452		printk("IXJ %d Starting Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4453
4454	j->flags.playing = 1;
4455	ixj_WriteDSPCommand(0x0FE0, j);	/* Put the DSP in full power mode. */
4456
4457	j->flags.play_first_frame = 1;
4458	j->drybuffer = 0;
4459
4460	if (!j->play_mode) {
4461		switch (j->play_codec) {
4462		case G723_63:
4463			cmd = 0x5231;
4464			break;
4465		case G723_53:
4466			cmd = 0x5232;
4467			break;
4468		case TS85:
4469			cmd = 0x5230;	/* TrueSpeech 8.5 */
4470
4471			break;
4472		case TS48:
4473			cmd = 0x5233;	/* TrueSpeech 4.8 */
4474
4475			break;
4476		case TS41:
4477			cmd = 0x5234;	/* TrueSpeech 4.1 */
4478
4479			break;
4480		case G728:
4481			cmd = 0x5235;
4482			break;
4483		case G729:
4484		case G729B:
4485			cmd = 0x5236;
4486			break;
4487		default:
4488			return 1;
4489		}
4490		if (ixj_WriteDSPCommand(cmd, j))
4491			return -1;
4492	}
4493	j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC);
4494	if (!j->write_buffer) {
4495		printk("Write buffer allocation for ixj board %d failed!\n", j->board);
4496		return -ENOMEM;
4497	}
4498/*	j->write_buffers_empty = 2; */
4499	j->write_buffers_empty = 1;
4500	j->write_buffer_size = j->play_frame_size * 2;
4501	j->write_buffer_end = j->write_buffer + j->play_frame_size * 2;
4502	j->write_buffer_rp = j->write_buffer_wp = j->write_buffer;
4503
4504	if (ixj_WriteDSPCommand(0x5202, j))		/* Set Poll sync mode */
4505
4506		return -1;
4507
4508	switch (j->play_mode) {
4509	case 0:
4510		cmd = 0x2C03;
4511		break;
4512	case 2:
4513		if (j->ver.low == 0x12) {
4514			cmd = 0x2C23;
4515		} else {
4516			cmd = 0x2C21;
4517		}
4518		break;
4519	case 4:
4520		if (j->ver.low == 0x12) {
4521			cmd = 0x2C43;
4522		} else {
4523			cmd = 0x2C41;
4524		}
4525		break;
4526	case 5:
4527		if (j->ver.low == 0x12) {
4528			cmd = 0x2C53;
4529		} else {
4530			cmd = 0x2C51;
4531		}
4532		break;
4533	case 6:
4534		if (j->ver.low == 0x12) {
4535			cmd = 0x2C63;
4536		} else {
4537			cmd = 0x2C61;
4538		}
4539		break;
4540	}
4541	if (ixj_WriteDSPCommand(cmd, j))
4542		return -1;
4543
4544	if (ixj_WriteDSPCommand(0x2000, j))		/* Playback C2 */
4545		return -1;
4546
4547	if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j))	/* Playback C3 */
4548		return -1;
4549
4550	if (j->flags.recording) {
4551		ixj_aec_start(j, j->aec_level);
4552	}
4553
4554	return 0;
4555}
4556
4557static void ixj_play_stop(IXJ *j)
4558{
4559	if (ixjdebug & 0x0002)
4560		printk("IXJ %d Stopping Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4561
4562	kfree(j->write_buffer);
4563	j->write_buffer = NULL;
4564	j->write_buffer_size = 0;
4565	if (j->play_mode > -1) {
4566		ixj_WriteDSPCommand(0x5221, j);	/* Stop playback and flush buffers.  8022 reference page 9-40 */
4567
4568		j->play_mode = -1;
4569	}
4570	j->flags.playing = 0;
4571}
4572
4573static inline int get_play_level(IXJ *j)
4574{
4575	int retval;
4576
4577	ixj_WriteDSPCommand(0xCF8F, j); /* 8022 Reference page 9-38 */
4578	return j->ssr.high << 8 | j->ssr.low;
4579	retval = j->ssr.high << 8 | j->ssr.low;
4580	retval = (retval * 256) / 240;
4581	return retval;
4582}
4583
4584static unsigned int ixj_poll(struct file *file_p, poll_table * wait)
4585{
4586	unsigned int mask = 0;
4587
4588	IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
4589
4590	poll_wait(file_p, &(j->poll_q), wait);
4591	if (j->read_buffer_ready > 0)
4592		mask |= POLLIN | POLLRDNORM;	/* readable */
4593	if (j->write_buffers_empty > 0)
4594		mask |= POLLOUT | POLLWRNORM;	/* writable */
4595	if (j->ex.bytes)
4596		mask |= POLLPRI;
4597	return mask;
4598}
4599
4600static int ixj_play_tone(IXJ *j, char tone)
4601{
4602	if (!j->tone_state) {
4603		if(ixjdebug & 0x0002) {
4604			printk("IXJ %d starting tone %d at %ld\n", j->board, tone, jiffies);
4605		}
4606		if (j->dsp.low == 0x20) {
4607			idle(j);
4608		}
4609		j->tone_start_jif = jiffies;
4610
4611		j->tone_state = 1;
4612	}
4613
4614	j->tone_index = tone;
4615	if (ixj_WriteDSPCommand(0x6000 + j->tone_index, j))
4616		return -1;
4617
4618	return 0;
4619}
4620
4621static int ixj_set_tone_on(unsigned short arg, IXJ *j)
4622{
4623	j->tone_on_time = arg;
4624
4625	if (ixj_WriteDSPCommand(0x6E04, j))		/* Set Tone On Period */
4626
4627		return -1;
4628
4629	if (ixj_WriteDSPCommand(arg, j))
4630		return -1;
4631
4632	return 0;
4633}
4634
4635static int SCI_WaitHighSCI(IXJ *j)
4636{
4637	int cnt;
4638
4639	j->pld_scrr.byte = inb_p(j->XILINXbase);
4640	if (!j->pld_scrr.bits.sci) {
4641		for (cnt = 0; cnt < 10; cnt++) {
4642			udelay(32);
4643			j->pld_scrr.byte = inb_p(j->XILINXbase);
4644
4645			if ((j->pld_scrr.bits.sci))
4646				return 1;
4647		}
4648		if (ixjdebug & 0x0001)
4649			printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte);
4650		return 0;
4651	} else
4652		return 1;
4653}
4654
4655static int SCI_WaitLowSCI(IXJ *j)
4656{
4657	int cnt;
4658
4659	j->pld_scrr.byte = inb_p(j->XILINXbase);
4660	if (j->pld_scrr.bits.sci) {
4661		for (cnt = 0; cnt < 10; cnt++) {
4662			udelay(32);
4663			j->pld_scrr.byte = inb_p(j->XILINXbase);
4664
4665			if (!(j->pld_scrr.bits.sci))
4666				return 1;
4667		}
4668		if (ixjdebug & 0x0001)
4669			printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte);
4670		return 0;
4671	} else
4672		return 1;
4673}
4674
4675static int SCI_Control(IXJ *j, int control)
4676{
4677	switch (control) {
4678	case SCI_End:
4679		j->pld_scrw.bits.c0 = 0;	/* Set PLD Serial control interface */
4680
4681		j->pld_scrw.bits.c1 = 0;	/* to no selection */
4682
4683		break;
4684	case SCI_Enable_DAA:
4685		j->pld_scrw.bits.c0 = 1;	/* Set PLD Serial control interface */
4686
4687		j->pld_scrw.bits.c1 = 0;	/* to write to DAA */
4688
4689		break;
4690	case SCI_Enable_Mixer:
4691		j->pld_scrw.bits.c0 = 0;	/* Set PLD Serial control interface */
4692
4693		j->pld_scrw.bits.c1 = 1;	/* to write to mixer */
4694
4695		break;
4696	case SCI_Enable_EEPROM:
4697		j->pld_scrw.bits.c0 = 1;	/* Set PLD Serial control interface */
4698
4699		j->pld_scrw.bits.c1 = 1;	/* to write to EEPROM */
4700
4701		break;
4702	default:
4703		return 0;
4704		break;
4705	}
4706	outb_p(j->pld_scrw.byte, j->XILINXbase);
4707
4708	switch (control) {
4709	case SCI_End:
4710		return 1;
4711		break;
4712	case SCI_Enable_DAA:
4713	case SCI_Enable_Mixer:
4714	case SCI_Enable_EEPROM:
4715		if (!SCI_WaitHighSCI(j))
4716			return 0;
4717		break;
4718	default:
4719		return 0;
4720		break;
4721	}
4722	return 1;
4723}
4724
4725static int SCI_Prepare(IXJ *j)
4726{
4727	if (!SCI_Control(j, SCI_End))
4728		return 0;
4729
4730	if (!SCI_WaitLowSCI(j))
4731		return 0;
4732
4733	return 1;
4734}
4735
4736static int ixj_get_mixer(long val, IXJ *j)
4737{
4738	int reg = (val & 0x1F00) >> 8;
4739        return j->mix.vol[reg];
4740}
4741
4742static int ixj_mixer(long val, IXJ *j)
4743{
4744	BYTES bytes;
4745
4746	bytes.high = (val & 0x1F00) >> 8;
4747	bytes.low = val & 0x00FF;
4748
4749        /* save mixer value so we can get back later on */
4750        j->mix.vol[bytes.high] = bytes.low;
4751
4752	outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03);	/* Load Mixer Address */
4753
4754	outb_p(bytes.low, j->XILINXbase + 0x02);	/* Load Mixer Data */
4755
4756	SCI_Control(j, SCI_Enable_Mixer);
4757
4758	SCI_Control(j, SCI_End);
4759
4760	return 0;
4761}
4762
4763static int daa_load(BYTES * p_bytes, IXJ *j)
4764{
4765	outb_p(p_bytes->high, j->XILINXbase + 0x03);
4766	outb_p(p_bytes->low, j->XILINXbase + 0x02);
4767	if (!SCI_Control(j, SCI_Enable_DAA))
4768		return 0;
4769	else
4770		return 1;
4771}
4772
4773static int ixj_daa_cr4(IXJ *j, char reg)
4774{
4775	BYTES bytes;
4776
4777	switch (j->daa_mode) {
4778	case SOP_PU_SLEEP:
4779		bytes.high = 0x14;
4780		break;
4781	case SOP_PU_RINGING:
4782		bytes.high = 0x54;
4783		break;
4784	case SOP_PU_CONVERSATION:
4785		bytes.high = 0x94;
4786		break;
4787	case SOP_PU_PULSEDIALING:
4788		bytes.high = 0xD4;
4789		break;
4790	}
4791
4792	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg;
4793
4794	switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) {
4795	case 0:
4796		j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0;
4797		break;
4798	case 1:
4799		j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2;
4800		break;
4801	case 2:
4802		j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1;
4803		break;
4804	case 3:
4805		j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3;
4806		break;
4807	}
4808
4809	bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
4810
4811	if (!daa_load(&bytes, j))
4812		return 0;
4813
4814	if (!SCI_Prepare(j))
4815		return 0;
4816
4817	return 1;
4818}
4819
4820static char daa_int_read(IXJ *j)
4821{
4822	BYTES bytes;
4823
4824	if (!SCI_Prepare(j))
4825		return 0;
4826
4827	bytes.high = 0x38;
4828	bytes.low = 0x00;
4829	outb_p(bytes.high, j->XILINXbase + 0x03);
4830	outb_p(bytes.low, j->XILINXbase + 0x02);
4831
4832	if (!SCI_Control(j, SCI_Enable_DAA))
4833		return 0;
4834
4835	bytes.high = inb_p(j->XILINXbase + 0x03);
4836	bytes.low = inb_p(j->XILINXbase + 0x02);
4837	if (bytes.low != ALISDAA_ID_BYTE) {
4838		if (ixjdebug & 0x0001)
4839			printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4840		return 0;
4841	}
4842	if (!SCI_Control(j, SCI_Enable_DAA))
4843		return 0;
4844	if (!SCI_Control(j, SCI_End))
4845		return 0;
4846
4847	bytes.high = inb_p(j->XILINXbase + 0x03);
4848	bytes.low = inb_p(j->XILINXbase + 0x02);
4849
4850	j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high;
4851
4852	return 1;
4853}
4854
4855static char daa_CR_read(IXJ *j, int cr)
4856{
4857	IXJ_WORD wdata;
4858	BYTES bytes;
4859
4860	if (!SCI_Prepare(j))
4861		return 0;
4862
4863	switch (j->daa_mode) {
4864	case SOP_PU_SLEEP:
4865		bytes.high = 0x30 + cr;
4866		break;
4867	case SOP_PU_RINGING:
4868		bytes.high = 0x70 + cr;
4869		break;
4870	case SOP_PU_CONVERSATION:
4871		bytes.high = 0xB0 + cr;
4872		break;
4873	case SOP_PU_PULSEDIALING:
4874		bytes.high = 0xF0 + cr;
4875		break;
4876	}
4877
4878	bytes.low = 0x00;
4879
4880	outb_p(bytes.high, j->XILINXbase + 0x03);
4881	outb_p(bytes.low, j->XILINXbase + 0x02);
4882
4883	if (!SCI_Control(j, SCI_Enable_DAA))
4884		return 0;
4885
4886	bytes.high = inb_p(j->XILINXbase + 0x03);
4887	bytes.low = inb_p(j->XILINXbase + 0x02);
4888	if (bytes.low != ALISDAA_ID_BYTE) {
4889		if (ixjdebug & 0x0001)
4890			printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4891		return 0;
4892	}
4893	if (!SCI_Control(j, SCI_Enable_DAA))
4894		return 0;
4895	if (!SCI_Control(j, SCI_End))
4896		return 0;
4897
4898	wdata.word = inw_p(j->XILINXbase + 0x02);
4899
4900	switch(cr){
4901		case 5:
4902			j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = wdata.bytes.high;
4903			break;
4904		case 4:
4905			j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = wdata.bytes.high;
4906			break;
4907		case 3:
4908			j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = wdata.bytes.high;
4909			break;
4910		case 2:
4911			j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = wdata.bytes.high;
4912			break;
4913		case 1:
4914			j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = wdata.bytes.high;
4915			break;
4916		case 0:
4917			j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = wdata.bytes.high;
4918			break;
4919		default:
4920			return 0;
4921	}
4922	return 1;
4923}
4924
4925static int ixj_daa_cid_reset(IXJ *j)
4926{
4927	int i;
4928	BYTES bytes;
4929
4930	if (ixjdebug & 0x0002)
4931		printk("DAA Clearing CID ram\n");
4932
4933	if (!SCI_Prepare(j))
4934		return 0;
4935
4936	bytes.high = 0x58;
4937	bytes.low = 0x00;
4938	outb_p(bytes.high, j->XILINXbase + 0x03);
4939	outb_p(bytes.low, j->XILINXbase + 0x02);
4940
4941	if (!SCI_Control(j, SCI_Enable_DAA))
4942		return 0;
4943
4944	if (!SCI_WaitHighSCI(j))
4945		return 0;
4946
4947	for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) {
4948		bytes.high = bytes.low = 0x00;
4949		outb_p(bytes.high, j->XILINXbase + 0x03);
4950
4951		if (i < ALISDAA_CALLERID_SIZE - 1)
4952			outb_p(bytes.low, j->XILINXbase + 0x02);
4953
4954		if (!SCI_Control(j, SCI_Enable_DAA))
4955			return 0;
4956
4957		if (!SCI_WaitHighSCI(j))
4958			return 0;
4959
4960	}
4961
4962	if (!SCI_Control(j, SCI_End))
4963		return 0;
4964
4965	if (ixjdebug & 0x0002)
4966		printk("DAA CID ram cleared\n");
4967
4968	return 1;
4969}
4970
4971static int ixj_daa_cid_read(IXJ *j)
4972{
4973	int i;
4974	BYTES bytes;
4975	char CID[ALISDAA_CALLERID_SIZE];
4976	bool mContinue;
4977	char *pIn, *pOut;
4978
4979	if (!SCI_Prepare(j))
4980		return 0;
4981
4982	bytes.high = 0x78;
4983	bytes.low = 0x00;
4984	outb_p(bytes.high, j->XILINXbase + 0x03);
4985	outb_p(bytes.low, j->XILINXbase + 0x02);
4986
4987	if (!SCI_Control(j, SCI_Enable_DAA))
4988		return 0;
4989
4990	if (!SCI_WaitHighSCI(j))
4991		return 0;
4992
4993	bytes.high = inb_p(j->XILINXbase + 0x03);
4994	bytes.low = inb_p(j->XILINXbase + 0x02);
4995	if (bytes.low != ALISDAA_ID_BYTE) {
4996		if (ixjdebug & 0x0001)
4997			printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4998		return 0;
4999	}
5000	for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) {
5001		bytes.high = bytes.low = 0x00;
5002		outb_p(bytes.high, j->XILINXbase + 0x03);
5003		outb_p(bytes.low, j->XILINXbase + 0x02);
5004
5005		if (!SCI_Control(j, SCI_Enable_DAA))
5006			return 0;
5007
5008		if (!SCI_WaitHighSCI(j))
5009			return 0;
5010
5011		CID[i + 0] = inb_p(j->XILINXbase + 0x03);
5012		CID[i + 1] = inb_p(j->XILINXbase + 0x02);
5013	}
5014
5015	if (!SCI_Control(j, SCI_End))
5016		return 0;
5017
5018	pIn = CID;
5019	pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5020	mContinue = true;
5021	while (mContinue) {
5022		if ((pIn[1] & 0x03) == 0x01) {
5023			pOut[0] = pIn[0];
5024		}
5025		if ((pIn[2] & 0x0c) == 0x04) {
5026			pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2);
5027		}
5028		if ((pIn[3] & 0x30) == 0x10) {
5029			pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4);
5030		}
5031		if ((pIn[4] & 0xc0) == 0x40) {
5032			pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6);
5033		} else {
5034			mContinue = false;
5035		}
5036		pIn += 5, pOut += 4;
5037	}
5038	memset(&j->cid, 0, sizeof(PHONE_CID));
5039	pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5040	pOut += 4;
5041	strncpy(j->cid.month, pOut, 2);
5042	pOut += 2;
5043	strncpy(j->cid.day, pOut, 2);
5044	pOut += 2;
5045	strncpy(j->cid.hour, pOut, 2);
5046	pOut += 2;
5047	strncpy(j->cid.min, pOut, 2);
5048	pOut += 3;
5049	j->cid.numlen = *pOut;
5050	pOut += 1;
5051	strncpy(j->cid.number, pOut, j->cid.numlen);
5052	pOut += j->cid.numlen + 1;
5053	j->cid.namelen = *pOut;
5054	pOut += 1;
5055	strncpy(j->cid.name, pOut, j->cid.namelen);
5056
5057	ixj_daa_cid_reset(j);
5058	return 1;
5059}
5060
5061static char daa_get_version(IXJ *j)
5062{
5063	BYTES bytes;
5064
5065	if (!SCI_Prepare(j))
5066		return 0;
5067
5068	bytes.high = 0x35;
5069	bytes.low = 0x00;
5070	outb_p(bytes.high, j->XILINXbase + 0x03);
5071	outb_p(bytes.low, j->XILINXbase + 0x02);
5072
5073	if (!SCI_Control(j, SCI_Enable_DAA))
5074		return 0;
5075
5076	bytes.high = inb_p(j->XILINXbase + 0x03);
5077	bytes.low = inb_p(j->XILINXbase + 0x02);
5078	if (bytes.low != ALISDAA_ID_BYTE) {
5079		if (ixjdebug & 0x0001)
5080			printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
5081		return 0;
5082	}
5083	if (!SCI_Control(j, SCI_Enable_DAA))
5084		return 0;
5085
5086	if (!SCI_Control(j, SCI_End))
5087		return 0;
5088
5089	bytes.high = inb_p(j->XILINXbase + 0x03);
5090	bytes.low = inb_p(j->XILINXbase + 0x02);
5091	if (ixjdebug & 0x0002)
5092		printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes.high, bytes.low);
5093	j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high;
5094	return bytes.high;
5095}
5096
5097static int daa_set_mode(IXJ *j, int mode)
5098{
5099	/* NOTE:
5100	      The DAA *MUST* be in the conversation mode if the
5101	      PSTN line is to be seized (PSTN line off-hook).
5102	      Taking the PSTN line off-hook while the DAA is in
5103	      a mode other than conversation mode will cause a
5104	      hardware failure of the ALIS-A part.
5105
5106	   NOTE:
5107	      The DAA can only go to SLEEP, RINGING or PULSEDIALING modes
5108	      if the PSTN line is on-hook.  Failure to have the PSTN line
5109	      in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE
5110	      ALIS-A part.
5111	*/
5112
5113	BYTES bytes;
5114
5115	j->flags.pstn_rmr = 0;
5116
5117	if (!SCI_Prepare(j))
5118		return 0;
5119
5120	switch (mode) {
5121	case SOP_PU_RESET:
5122		j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
5123
5124		outb_p(j->pld_scrw.byte, j->XILINXbase);
5125		j->pld_slicw.bits.rly2 = 0;
5126		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5127		bytes.high = 0x10;
5128		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5129		daa_load(&bytes, j);
5130		if (!SCI_Prepare(j))
5131			return 0;
5132
5133		j->daa_mode = SOP_PU_SLEEP;
5134		break;
5135	case SOP_PU_SLEEP:
5136		if(j->daa_mode == SOP_PU_SLEEP)
5137		{
5138			break;
5139		}
5140		if (ixjdebug & 0x0008)
5141			printk(KERN_INFO "phone DAA: SOP_PU_SLEEP at %ld\n", jiffies);
5142/*		if(j->daa_mode == SOP_PU_CONVERSATION) */
5143		{
5144			j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
5145
5146			outb_p(j->pld_scrw.byte, j->XILINXbase);
5147			j->pld_slicw.bits.rly2 = 0;
5148			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5149			bytes.high = 0x10;
5150			bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5151			daa_load(&bytes, j);
5152			if (!SCI_Prepare(j))
5153				return 0;
5154		}
5155		j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
5156
5157		outb_p(j->pld_scrw.byte, j->XILINXbase);
5158		j->pld_slicw.bits.rly2 = 0;
5159		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5160		bytes.high = 0x10;
5161		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5162		daa_load(&bytes, j);
5163		if (!SCI_Prepare(j))
5164			return 0;
5165
5166		j->daa_mode = SOP_PU_SLEEP;
5167		j->flags.pstn_ringing = 0;
5168		j->ex.bits.pstn_ring = 0;
5169		j->pstn_sleeptil = jiffies + (hertz / 4);
5170		wake_up_interruptible(&j->read_q);      /* Wake any blocked readers */
5171		wake_up_interruptible(&j->write_q);     /* Wake any blocked writers */
5172		wake_up_interruptible(&j->poll_q);      /* Wake any blocked selects */
5173 		break;
5174	case SOP_PU_RINGING:
5175		if (ixjdebug & 0x0008)
5176			printk(KERN_INFO "phone DAA: SOP_PU_RINGING at %ld\n", jiffies);
5177		j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
5178
5179		outb_p(j->pld_scrw.byte, j->XILINXbase);
5180		j->pld_slicw.bits.rly2 = 0;
5181		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5182		bytes.high = 0x50;
5183		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5184		daa_load(&bytes, j);
5185		if (!SCI_Prepare(j))
5186			return 0;
5187		j->daa_mode = SOP_PU_RINGING;
5188		break;
5189	case SOP_PU_CONVERSATION:
5190		if (ixjdebug & 0x0008)
5191			printk(KERN_INFO "phone DAA: SOP_PU_CONVERSATION at %ld\n", jiffies);
5192		bytes.high = 0x90;
5193		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5194		daa_load(&bytes, j);
5195		if (!SCI_Prepare(j))
5196			return 0;
5197		j->pld_slicw.bits.rly2 = 1;
5198		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5199		j->pld_scrw.bits.daafsyncen = 1;	/* Turn on DAA Frame Sync */
5200
5201		outb_p(j->pld_scrw.byte, j->XILINXbase);
5202		j->daa_mode = SOP_PU_CONVERSATION;
5203		j->flags.pstn_ringing = 0;
5204		j->ex.bits.pstn_ring = 0;
5205		j->pstn_sleeptil = jiffies;
5206		j->pstn_ring_start = j->pstn_ring_stop = j->pstn_ring_int = 0;
5207		break;
5208	case SOP_PU_PULSEDIALING:
5209		if (ixjdebug & 0x0008)
5210			printk(KERN_INFO "phone DAA: SOP_PU_PULSEDIALING at %ld\n", jiffies);
5211		j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
5212
5213		outb_p(j->pld_scrw.byte, j->XILINXbase);
5214		j->pld_slicw.bits.rly2 = 0;
5215		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5216		bytes.high = 0xD0;
5217		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5218		daa_load(&bytes, j);
5219		if (!SCI_Prepare(j))
5220			return 0;
5221		j->daa_mode = SOP_PU_PULSEDIALING;
5222		break;
5223	default:
5224		break;
5225	}
5226	return 1;
5227}
5228
5229static int ixj_daa_write(IXJ *j)
5230{
5231	BYTES bytes;
5232
5233	j->flags.pstncheck = 1;
5234
5235	daa_set_mode(j, SOP_PU_SLEEP);
5236
5237	if (!SCI_Prepare(j))
5238		return 0;
5239
5240	outb_p(j->pld_scrw.byte, j->XILINXbase);
5241
5242	bytes.high = 0x14;
5243	bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
5244	if (!daa_load(&bytes, j))
5245		return 0;
5246
5247	bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg;
5248	bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg;
5249	if (!daa_load(&bytes, j))
5250		return 0;
5251
5252	bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg;
5253	bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5254	if (!daa_load(&bytes, j))
5255		return 0;
5256
5257	if (!SCI_Prepare(j))
5258		return 0;
5259
5260	bytes.high = 0x1F;
5261	bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg;
5262	if (!daa_load(&bytes, j))
5263		return 0;
5264
5265	bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg;
5266	bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg;
5267	if (!daa_load(&bytes, j))
5268		return 0;
5269
5270	bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg;
5271	bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg;
5272	if (!daa_load(&bytes, j))
5273		return 0;
5274
5275	bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg;
5276	bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg;
5277	if (!daa_load(&bytes, j))
5278		return 0;
5279
5280	bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg;
5281	bytes.low = 0x00;
5282	if (!daa_load(&bytes, j))
5283		return 0;
5284
5285	if (!SCI_Prepare(j))
5286		return 0;
5287
5288	bytes.high = 0x00;
5289	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7];
5290	if (!daa_load(&bytes, j))
5291		return 0;
5292
5293	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6];
5294	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5];
5295	if (!daa_load(&bytes, j))
5296		return 0;
5297
5298	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4];
5299	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3];
5300	if (!daa_load(&bytes, j))
5301		return 0;
5302
5303	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2];
5304	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1];
5305	if (!daa_load(&bytes, j))
5306		return 0;
5307
5308	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0];
5309	bytes.low = 0x00;
5310	if (!daa_load(&bytes, j))
5311		return 0;
5312
5313	if (!SCI_Control(j, SCI_End))
5314		return 0;
5315	if (!SCI_WaitLowSCI(j))
5316		return 0;
5317
5318	bytes.high = 0x01;
5319	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7];
5320	if (!daa_load(&bytes, j))
5321		return 0;
5322
5323	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6];
5324	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5];
5325	if (!daa_load(&bytes, j))
5326		return 0;
5327
5328	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4];
5329	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3];
5330	if (!daa_load(&bytes, j))
5331		return 0;
5332
5333	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2];
5334	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1];
5335	if (!daa_load(&bytes, j))
5336		return 0;
5337
5338	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0];
5339	bytes.low = 0x00;
5340	if (!daa_load(&bytes, j))
5341		return 0;
5342
5343	if (!SCI_Control(j, SCI_End))
5344		return 0;
5345	if (!SCI_WaitLowSCI(j))
5346		return 0;
5347
5348	bytes.high = 0x02;
5349	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7];
5350	if (!daa_load(&bytes, j))
5351		return 0;
5352
5353	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6];
5354	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5];
5355	if (!daa_load(&bytes, j))
5356		return 0;
5357
5358	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4];
5359	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3];
5360	if (!daa_load(&bytes, j))
5361		return 0;
5362
5363	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2];
5364	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1];
5365	if (!daa_load(&bytes, j))
5366		return 0;
5367
5368	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0];
5369	bytes.low = 0x00;
5370	if (!daa_load(&bytes, j))
5371		return 0;
5372
5373	if (!SCI_Control(j, SCI_End))
5374		return 0;
5375	if (!SCI_WaitLowSCI(j))
5376		return 0;
5377
5378	bytes.high = 0x03;
5379	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7];
5380	if (!daa_load(&bytes, j))
5381		return 0;
5382
5383	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6];
5384	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5];
5385	if (!daa_load(&bytes, j))
5386		return 0;
5387
5388	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4];
5389	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3];
5390	if (!daa_load(&bytes, j))
5391		return 0;
5392
5393	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2];
5394	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1];
5395	if (!daa_load(&bytes, j))
5396		return 0;
5397
5398	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0];
5399	bytes.low = 0x00;
5400	if (!daa_load(&bytes, j))
5401		return 0;
5402
5403	if (!SCI_Control(j, SCI_End))
5404		return 0;
5405	if (!SCI_WaitLowSCI(j))
5406		return 0;
5407
5408	bytes.high = 0x04;
5409	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7];
5410	if (!daa_load(&bytes, j))
5411		return 0;
5412
5413	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6];
5414	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5];
5415	if (!daa_load(&bytes, j))
5416		return 0;
5417
5418	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4];
5419	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3];
5420	if (!daa_load(&bytes, j))
5421		return 0;
5422
5423	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2];
5424	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1];
5425	if (!daa_load(&bytes, j))
5426		return 0;
5427
5428	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0];
5429	bytes.low = 0x00;
5430	if (!daa_load(&bytes, j))
5431		return 0;
5432
5433	if (!SCI_Control(j, SCI_End))
5434		return 0;
5435	if (!SCI_WaitLowSCI(j))
5436		return 0;
5437
5438	bytes.high = 0x05;
5439	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7];
5440	if (!daa_load(&bytes, j))
5441		return 0;
5442
5443	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6];
5444	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5];
5445	if (!daa_load(&bytes, j))
5446		return 0;
5447
5448	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4];
5449	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3];
5450	if (!daa_load(&bytes, j))
5451		return 0;
5452
5453	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2];
5454	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1];
5455	if (!daa_load(&bytes, j))
5456		return 0;
5457
5458	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0];
5459	bytes.low = 0x00;
5460	if (!daa_load(&bytes, j))
5461		return 0;
5462
5463	if (!SCI_Control(j, SCI_End))
5464		return 0;
5465	if (!SCI_WaitLowSCI(j))
5466		return 0;
5467
5468	bytes.high = 0x06;
5469	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7];
5470	if (!daa_load(&bytes, j))
5471		return 0;
5472
5473	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6];
5474	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5];
5475	if (!daa_load(&bytes, j))
5476		return 0;
5477
5478	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4];
5479	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3];
5480	if (!daa_load(&bytes, j))
5481		return 0;
5482
5483	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2];
5484	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1];
5485	if (!daa_load(&bytes, j))
5486		return 0;
5487
5488	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0];
5489	bytes.low = 0x00;
5490	if (!daa_load(&bytes, j))
5491		return 0;
5492
5493	if (!SCI_Control(j, SCI_End))
5494		return 0;
5495	if (!SCI_WaitLowSCI(j))
5496		return 0;
5497
5498	bytes.high = 0x07;
5499	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7];
5500	if (!daa_load(&bytes, j))
5501		return 0;
5502
5503	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6];
5504	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5];
5505	if (!daa_load(&bytes, j))
5506		return 0;
5507
5508	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4];
5509	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3];
5510	if (!daa_load(&bytes, j))
5511		return 0;
5512
5513	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2];
5514	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1];
5515	if (!daa_load(&bytes, j))
5516		return 0;
5517
5518	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0];
5519	bytes.low = 0x00;
5520	if (!daa_load(&bytes, j))
5521		return 0;
5522
5523	if (!SCI_Control(j, SCI_End))
5524		return 0;
5525	if (!SCI_WaitLowSCI(j))
5526		return 0;
5527
5528	bytes.high = 0x08;
5529	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7];
5530	if (!daa_load(&bytes, j))
5531		return 0;
5532
5533	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6];
5534	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5];
5535	if (!daa_load(&bytes, j))
5536		return 0;
5537
5538	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4];
5539	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3];
5540	if (!daa_load(&bytes, j))
5541		return 0;
5542
5543	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2];
5544	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1];
5545	if (!daa_load(&bytes, j))
5546		return 0;
5547
5548	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0];
5549	bytes.low = 0x00;
5550	if (!daa_load(&bytes, j))
5551		return 0;
5552
5553	if (!SCI_Control(j, SCI_End))
5554		return 0;
5555	if (!SCI_WaitLowSCI(j))
5556		return 0;
5557
5558	bytes.high = 0x09;
5559	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3];
5560	if (!daa_load(&bytes, j))
5561		return 0;
5562
5563	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2];
5564	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1];
5565	if (!daa_load(&bytes, j))
5566		return 0;
5567
5568	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0];
5569	bytes.low = 0x00;
5570	if (!daa_load(&bytes, j))
5571		return 0;
5572
5573	if (!SCI_Control(j, SCI_End))
5574		return 0;
5575	if (!SCI_WaitLowSCI(j))
5576		return 0;
5577
5578	bytes.high = 0x0A;
5579	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3];
5580	if (!daa_load(&bytes, j))
5581		return 0;
5582
5583	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2];
5584	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1];
5585	if (!daa_load(&bytes, j))
5586		return 0;
5587
5588	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0];
5589	bytes.low = 0x00;
5590	if (!daa_load(&bytes, j))
5591		return 0;
5592
5593	if (!SCI_Control(j, SCI_End))
5594		return 0;
5595	if (!SCI_WaitLowSCI(j))
5596		return 0;
5597
5598	bytes.high = 0x0B;
5599	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3];
5600	if (!daa_load(&bytes, j))
5601		return 0;
5602
5603	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2];
5604	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1];
5605	if (!daa_load(&bytes, j))
5606		return 0;
5607
5608	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0];
5609	bytes.low = 0x00;
5610	if (!daa_load(&bytes, j))
5611		return 0;
5612
5613	if (!SCI_Control(j, SCI_End))
5614		return 0;
5615	if (!SCI_WaitLowSCI(j))
5616		return 0;
5617
5618	bytes.high = 0x0C;
5619	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3];
5620	if (!daa_load(&bytes, j))
5621		return 0;
5622
5623	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2];
5624	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1];
5625	if (!daa_load(&bytes, j))
5626		return 0;
5627
5628	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0];
5629	bytes.low = 0x00;
5630	if (!daa_load(&bytes, j))
5631		return 0;
5632
5633	if (!SCI_Control(j, SCI_End))
5634		return 0;
5635	if (!SCI_WaitLowSCI(j))
5636		return 0;
5637
5638	bytes.high = 0x0D;
5639	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3];
5640	if (!daa_load(&bytes, j))
5641		return 0;
5642
5643	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2];
5644	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1];
5645	if (!daa_load(&bytes, j))
5646		return 0;
5647
5648	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0];
5649	bytes.low = 0x00;
5650	if (!daa_load(&bytes, j))
5651		return 0;
5652
5653	if (!SCI_Control(j, SCI_End))
5654		return 0;
5655	if (!SCI_WaitLowSCI(j))
5656		return 0;
5657
5658	bytes.high = 0x0E;
5659	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7];
5660	if (!daa_load(&bytes, j))
5661		return 0;
5662
5663	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6];
5664	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5];
5665	if (!daa_load(&bytes, j))
5666		return 0;
5667
5668	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4];
5669	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3];
5670	if (!daa_load(&bytes, j))
5671		return 0;
5672
5673	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2];
5674	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1];
5675	if (!daa_load(&bytes, j))
5676		return 0;
5677
5678	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0];
5679	bytes.low = 0x00;
5680	if (!daa_load(&bytes, j))
5681		return 0;
5682
5683	if (!SCI_Control(j, SCI_End))
5684		return 0;
5685	if (!SCI_WaitLowSCI(j))
5686		return 0;
5687
5688	bytes.high = 0x0F;
5689	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7];
5690	if (!daa_load(&bytes, j))
5691		return 0;
5692
5693	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6];
5694	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5];
5695	if (!daa_load(&bytes, j))
5696		return 0;
5697
5698	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4];
5699	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3];
5700	if (!daa_load(&bytes, j))
5701		return 0;
5702
5703	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2];
5704	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1];
5705	if (!daa_load(&bytes, j))
5706		return 0;
5707
5708	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0];
5709	bytes.low = 0x00;
5710	if (!daa_load(&bytes, j))
5711		return 0;
5712
5713	udelay(32);
5714	j->pld_scrr.byte = inb_p(j->XILINXbase);
5715	if (!SCI_Control(j, SCI_End))
5716		return 0;
5717
5718	outb_p(j->pld_scrw.byte, j->XILINXbase);
5719
5720	if (ixjdebug & 0x0002)
5721		printk("DAA Coefficients Loaded\n");
5722
5723	j->flags.pstncheck = 0;
5724	return 1;
5725}
5726
5727static int ixj_set_tone_off(unsigned short arg, IXJ *j)
5728{
5729	j->tone_off_time = arg;
5730	if (ixj_WriteDSPCommand(0x6E05, j))		/* Set Tone Off Period */
5731
5732		return -1;
5733	if (ixj_WriteDSPCommand(arg, j))
5734		return -1;
5735	return 0;
5736}
5737
5738static int ixj_get_tone_on(IXJ *j)
5739{
5740	if (ixj_WriteDSPCommand(0x6E06, j))		/* Get Tone On Period */
5741
5742		return -1;
5743	return 0;
5744}
5745
5746static int ixj_get_tone_off(IXJ *j)
5747{
5748	if (ixj_WriteDSPCommand(0x6E07, j))		/* Get Tone Off Period */
5749
5750		return -1;
5751	return 0;
5752}
5753
5754static void ixj_busytone(IXJ *j)
5755{
5756	j->flags.ringback = 0;
5757	j->flags.dialtone = 0;
5758	j->flags.busytone = 1;
5759	ixj_set_tone_on(0x07D0, j);
5760	ixj_set_tone_off(0x07D0, j);
5761	ixj_play_tone(j, 27);
5762}
5763
5764static void ixj_dialtone(IXJ *j)
5765{
5766	j->flags.ringback = 0;
5767	j->flags.dialtone = 1;
5768	j->flags.busytone = 0;
5769	if (j->dsp.low == 0x20) {
5770		return;
5771	} else {
5772		ixj_set_tone_on(0xFFFF, j);
5773		ixj_set_tone_off(0x0000, j);
5774		ixj_play_tone(j, 25);
5775	}
5776}
5777
5778static void ixj_cpt_stop(IXJ *j)
5779{
5780	if(j->tone_state || j->tone_cadence_state)
5781	{
5782		j->flags.dialtone = 0;
5783		j->flags.busytone = 0;
5784		j->flags.ringback = 0;
5785		ixj_set_tone_on(0x0001, j);
5786		ixj_set_tone_off(0x0000, j);
5787		ixj_play_tone(j, 0);
5788		j->tone_state = j->tone_cadence_state = 0;
5789		if (j->cadence_t) {
5790			kfree(j->cadence_t->ce);
5791			kfree(j->cadence_t);
5792			j->cadence_t = NULL;
5793		}
5794	}
5795	if (j->play_mode == -1 && j->rec_mode == -1)
5796		idle(j);
5797	if (j->play_mode != -1 && j->dsp.low == 0x20)
5798		ixj_play_start(j);
5799	if (j->rec_mode != -1 && j->dsp.low == 0x20)
5800		ixj_record_start(j);
5801}
5802
5803static void ixj_ringback(IXJ *j)
5804{
5805	j->flags.busytone = 0;
5806	j->flags.dialtone = 0;
5807	j->flags.ringback = 1;
5808	ixj_set_tone_on(0x0FA0, j);
5809	ixj_set_tone_off(0x2EE0, j);
5810	ixj_play_tone(j, 26);
5811}
5812
5813static void ixj_testram(IXJ *j)
5814{
5815	ixj_WriteDSPCommand(0x3001, j);	/* Test External SRAM */
5816}
5817
5818static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp)
5819{
5820	ixj_cadence *lcp;
5821	IXJ_CADENCE_ELEMENT __user *cep;
5822	IXJ_CADENCE_ELEMENT *lcep;
5823	IXJ_TONE ti;
5824	int err;
5825
5826	lcp = kmalloc(sizeof(ixj_cadence), GFP_KERNEL);
5827	if (lcp == NULL)
5828		return -ENOMEM;
5829
5830	err = -EFAULT;
5831	if (copy_from_user(&lcp->elements_used,
5832			   &cp->elements_used, sizeof(int)))
5833		goto out;
5834	if (copy_from_user(&lcp->termination,
5835			   &cp->termination, sizeof(IXJ_CADENCE_TERM)))
5836		goto out;
5837	if (get_user(cep, &cp->ce))
5838		goto out;
5839
5840	err = -EINVAL;
5841	if ((unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE_ELEMENT))
5842		goto out;
5843
5844	err = -ENOMEM;
5845	lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL);
5846	if (!lcep)
5847		goto out;
5848
5849	err = -EFAULT;
5850	if (copy_from_user(lcep, cep, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used))
5851		goto out1;
5852
5853	if (j->cadence_t) {
5854		kfree(j->cadence_t->ce);
5855		kfree(j->cadence_t);
5856	}
5857	lcp->ce = (void *) lcep;
5858	j->cadence_t = lcp;
5859	j->tone_cadence_state = 0;
5860	ixj_set_tone_on(lcp->ce[0].tone_on_time, j);
5861	ixj_set_tone_off(lcp->ce[0].tone_off_time, j);
5862	if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
5863		ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
5864		ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
5865		ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
5866		ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
5867		ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
5868		ixj_init_tone(j, &ti);
5869	}
5870	ixj_play_tone(j, lcp->ce[0].index);
5871	return 1;
5872out1:
5873	kfree(lcep);
5874out:
5875	kfree(lcp);
5876	return err;
5877}
5878
5879static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp)
5880{
5881	IXJ_FILTER_CADENCE *lcp;
5882	lcp = kmalloc(sizeof(IXJ_FILTER_CADENCE), GFP_KERNEL);
5883	if (lcp == NULL) {
5884		if(ixjdebug & 0x0001) {
5885			printk(KERN_INFO "Could not allocate memory for cadence\n");
5886		}
5887		return -ENOMEM;
5888        }
5889	if (copy_from_user(lcp, cp, sizeof(IXJ_FILTER_CADENCE))) {
5890		if(ixjdebug & 0x0001) {
5891			printk(KERN_INFO "Could not copy cadence to kernel\n");
5892		}
5893		kfree(lcp);
5894		return -EFAULT;
5895	}
5896	if (lcp->filter > 5) {
5897		if(ixjdebug & 0x0001) {
5898			printk(KERN_INFO "Cadence out of range\n");
5899		}
5900		kfree(lcp);
5901		return -1;
5902	}
5903	j->cadence_f[lcp->filter].state = 0;
5904	j->cadence_f[lcp->filter].enable = lcp->enable;
5905	j->filter_en[lcp->filter] = j->cadence_f[lcp->filter].en_filter = lcp->en_filter;
5906	j->cadence_f[lcp->filter].on1 = lcp->on1;
5907	j->cadence_f[lcp->filter].on1min = 0;
5908	j->cadence_f[lcp->filter].on1max = 0;
5909	j->cadence_f[lcp->filter].off1 = lcp->off1;
5910	j->cadence_f[lcp->filter].off1min = 0;
5911	j->cadence_f[lcp->filter].off1max = 0;
5912	j->cadence_f[lcp->filter].on2 = lcp->on2;
5913	j->cadence_f[lcp->filter].on2min = 0;
5914	j->cadence_f[lcp->filter].on2max = 0;
5915	j->cadence_f[lcp->filter].off2 = lcp->off2;
5916	j->cadence_f[lcp->filter].off2min = 0;
5917	j->cadence_f[lcp->filter].off2max = 0;
5918	j->cadence_f[lcp->filter].on3 = lcp->on3;
5919	j->cadence_f[lcp->filter].on3min = 0;
5920	j->cadence_f[lcp->filter].on3max = 0;
5921	j->cadence_f[lcp->filter].off3 = lcp->off3;
5922	j->cadence_f[lcp->filter].off3min = 0;
5923	j->cadence_f[lcp->filter].off3max = 0;
5924	if(ixjdebug & 0x0002) {
5925		printk(KERN_INFO "Cadence %d loaded\n", lcp->filter);
5926	}
5927	kfree(lcp);
5928	return 0;
5929}
5930
5931static void add_caps(IXJ *j)
5932{
5933	j->caps = 0;
5934	j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET;
5935	strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)");
5936	j->caplist[j->caps].captype = vendor;
5937	j->caplist[j->caps].handle = j->caps++;
5938	j->caplist[j->caps].captype = device;
5939	switch (j->cardtype) {
5940	case QTI_PHONEJACK:
5941		strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK");
5942		break;
5943	case QTI_LINEJACK:
5944		strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK");
5945		break;
5946	case QTI_PHONEJACK_LITE:
5947		strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite");
5948		break;
5949	case QTI_PHONEJACK_PCI:
5950		strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI");
5951		break;
5952	case QTI_PHONECARD:
5953		strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneCARD");
5954		break;
5955	}
5956	j->caplist[j->caps].cap = j->cardtype;
5957	j->caplist[j->caps].handle = j->caps++;
5958	strcpy(j->caplist[j->caps].desc, "POTS");
5959	j->caplist[j->caps].captype = port;
5960	j->caplist[j->caps].cap = pots;
5961	j->caplist[j->caps].handle = j->caps++;
5962
5963 	/* add devices that can do speaker/mic */
5964	switch (j->cardtype) {
5965	case QTI_PHONEJACK:
5966	case QTI_LINEJACK:
5967	case QTI_PHONEJACK_PCI:
5968	case QTI_PHONECARD:
5969		strcpy(j->caplist[j->caps].desc, "SPEAKER");
5970		j->caplist[j->caps].captype = port;
5971		j->caplist[j->caps].cap = speaker;
5972		j->caplist[j->caps].handle = j->caps++;
5973        default:
5974     		break;
5975	}
5976
5977 	/* add devices that can do handset */
5978	switch (j->cardtype) {
5979	case QTI_PHONEJACK:
5980		strcpy(j->caplist[j->caps].desc, "HANDSET");
5981		j->caplist[j->caps].captype = port;
5982		j->caplist[j->caps].cap = handset;
5983		j->caplist[j->caps].handle = j->caps++;
5984		break;
5985        default:
5986     		break;
5987	}
5988
5989 	/* add devices that can do PSTN */
5990	switch (j->cardtype) {
5991	case QTI_LINEJACK:
5992		strcpy(j->caplist[j->caps].desc, "PSTN");
5993		j->caplist[j->caps].captype = port;
5994		j->caplist[j->caps].cap = pstn;
5995		j->caplist[j->caps].handle = j->caps++;
5996		break;
5997        default:
5998     		break;
5999	}
6000
6001	/* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */
6002	strcpy(j->caplist[j->caps].desc, "ULAW");
6003	j->caplist[j->caps].captype = codec;
6004	j->caplist[j->caps].cap = ULAW;
6005	j->caplist[j->caps].handle = j->caps++;
6006
6007	strcpy(j->caplist[j->caps].desc, "LINEAR 16 bit");
6008	j->caplist[j->caps].captype = codec;
6009	j->caplist[j->caps].cap = LINEAR16;
6010	j->caplist[j->caps].handle = j->caps++;
6011
6012	strcpy(j->caplist[j->caps].desc, "LINEAR 8 bit");
6013	j->caplist[j->caps].captype = codec;
6014	j->caplist[j->caps].cap = LINEAR8;
6015	j->caplist[j->caps].handle = j->caps++;
6016
6017	strcpy(j->caplist[j->caps].desc, "Windows Sound System");
6018	j->caplist[j->caps].captype = codec;
6019	j->caplist[j->caps].cap = WSS;
6020	j->caplist[j->caps].handle = j->caps++;
6021
6022	/* software ALAW codec, made from ULAW */
6023	strcpy(j->caplist[j->caps].desc, "ALAW");
6024	j->caplist[j->caps].captype = codec;
6025	j->caplist[j->caps].cap = ALAW;
6026	j->caplist[j->caps].handle = j->caps++;
6027
6028	/* version 12 of the 8020 does the following codecs in a broken way */
6029	if (j->dsp.low != 0x20 || j->ver.low != 0x12) {
6030		strcpy(j->caplist[j->caps].desc, "G.723.1 6.3kbps");
6031		j->caplist[j->caps].captype = codec;
6032		j->caplist[j->caps].cap = G723_63;
6033		j->caplist[j->caps].handle = j->caps++;
6034
6035		strcpy(j->caplist[j->caps].desc, "G.723.1 5.3kbps");
6036		j->caplist[j->caps].captype = codec;
6037		j->caplist[j->caps].cap = G723_53;
6038		j->caplist[j->caps].handle = j->caps++;
6039
6040		strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.8kbps");
6041		j->caplist[j->caps].captype = codec;
6042		j->caplist[j->caps].cap = TS48;
6043		j->caplist[j->caps].handle = j->caps++;
6044
6045		strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.1kbps");
6046		j->caplist[j->caps].captype = codec;
6047		j->caplist[j->caps].cap = TS41;
6048		j->caplist[j->caps].handle = j->caps++;
6049	}
6050
6051	/* 8020 chips can do TS8.5 native, and 8021/8022 can load it */
6052	if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
6053		strcpy(j->caplist[j->caps].desc, "TrueSpeech 8.5kbps");
6054		j->caplist[j->caps].captype = codec;
6055		j->caplist[j->caps].cap = TS85;
6056		j->caplist[j->caps].handle = j->caps++;
6057	}
6058
6059	/* 8021 chips can do G728 */
6060	if (j->dsp.low == 0x21) {
6061		strcpy(j->caplist[j->caps].desc, "G.728 16kbps");
6062		j->caplist[j->caps].captype = codec;
6063		j->caplist[j->caps].cap = G728;
6064		j->caplist[j->caps].handle = j->caps++;
6065	}
6066
6067	/* 8021/8022 chips can do G729 if loaded */
6068	if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6069		strcpy(j->caplist[j->caps].desc, "G.729A 8kbps");
6070		j->caplist[j->caps].captype = codec;
6071		j->caplist[j->caps].cap = G729;
6072		j->caplist[j->caps].handle = j->caps++;
6073	}
6074	if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6075		strcpy(j->caplist[j->caps].desc, "G.729B 8kbps");
6076		j->caplist[j->caps].captype = codec;
6077		j->caplist[j->caps].cap = G729B;
6078		j->caplist[j->caps].handle = j->caps++;
6079	}
6080}
6081
6082static int capabilities_check(IXJ *j, struct phone_capability *pcreq)
6083{
6084	int cnt;
6085	int retval = 0;
6086	for (cnt = 0; cnt < j->caps; cnt++) {
6087		if (pcreq->captype == j->caplist[cnt].captype
6088		    && pcreq->cap == j->caplist[cnt].cap) {
6089			retval = 1;
6090			break;
6091		}
6092	}
6093	return retval;
6094}
6095
6096static int ixj_ioctl(struct inode *inode, struct file *file_p, unsigned int cmd, unsigned long arg)
6097{
6098	IXJ_TONE ti;
6099	IXJ_FILTER jf;
6100	IXJ_FILTER_RAW jfr;
6101	void __user *argp = (void __user *)arg;
6102
6103	unsigned int raise, mant;
6104	unsigned int minor = iminor(inode);
6105	int board = NUM(inode);
6106
6107	IXJ *j = get_ixj(NUM(inode));
6108
6109	int retval = 0;
6110
6111	/*
6112	 *    Set up locks to ensure that only one process is talking to the DSP at a time.
6113	 *    This is necessary to keep the DSP from locking up.
6114	 */
6115	while(test_and_set_bit(board, (void *)&j->busyflags) != 0)
6116		schedule_timeout_interruptible(1);
6117	if (ixjdebug & 0x0040)
6118		printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6119	if (minor >= IXJMAX) {
6120		clear_bit(board, &j->busyflags);
6121		return -ENODEV;
6122	}
6123	/*
6124	 *    Check ioctls only root can use.
6125	 */
6126	if (!capable(CAP_SYS_ADMIN)) {
6127		switch (cmd) {
6128		case IXJCTL_TESTRAM:
6129		case IXJCTL_HZ:
6130			retval = -EPERM;
6131		}
6132	}
6133	switch (cmd) {
6134	case IXJCTL_TESTRAM:
6135		ixj_testram(j);
6136		retval = (j->ssr.high << 8) + j->ssr.low;
6137		break;
6138	case IXJCTL_CARDTYPE:
6139		retval = j->cardtype;
6140		break;
6141	case IXJCTL_SERIAL:
6142		retval = j->serial;
6143		break;
6144	case IXJCTL_VERSION:
6145		{
6146			char arg_str[100];
6147			snprintf(arg_str, sizeof(arg_str),
6148				"\nDriver version %i.%i.%i", IXJ_VER_MAJOR,
6149				IXJ_VER_MINOR, IXJ_BLD_VER);
6150			if (copy_to_user(argp, arg_str, strlen(arg_str)))
6151				retval = -EFAULT;
6152		}
6153		break;
6154	case PHONE_RING_CADENCE:
6155		j->ring_cadence = arg;
6156		break;
6157	case IXJCTL_CIDCW:
6158		if(arg) {
6159			if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
6160				retval = -EFAULT;
6161				break;
6162			}
6163		} else {
6164			memset(&j->cid_send, 0, sizeof(PHONE_CID));
6165		}
6166		ixj_write_cidcw(j);
6167		break;
6168        /* Binary compatbility */
6169        case OLD_PHONE_RING_START:
6170                arg = 0;
6171                /* Fall through */
6172 	case PHONE_RING_START:
6173		if(arg) {
6174			if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
6175				retval = -EFAULT;
6176				break;
6177			}
6178			ixj_write_cid(j);
6179		} else {
6180			memset(&j->cid_send, 0, sizeof(PHONE_CID));
6181		}
6182		ixj_ring_start(j);
6183		break;
6184	case PHONE_RING_STOP:
6185		j->flags.cringing = 0;
6186		if(j->cadence_f[5].enable) {
6187			j->cadence_f[5].state = 0;
6188		}
6189		ixj_ring_off(j);
6190		break;
6191	case PHONE_RING:
6192		retval = ixj_ring(j);
6193		break;
6194	case PHONE_EXCEPTION:
6195		retval = j->ex.bytes;
6196		if(j->ex.bits.flash) {
6197			j->flash_end = 0;
6198			j->ex.bits.flash = 0;
6199		}
6200		j->ex.bits.pstn_ring = 0;
6201		j->ex.bits.caller_id = 0;
6202		j->ex.bits.pstn_wink = 0;
6203		j->ex.bits.f0 = 0;
6204		j->ex.bits.f1 = 0;
6205		j->ex.bits.f2 = 0;
6206		j->ex.bits.f3 = 0;
6207		j->ex.bits.fc0 = 0;
6208		j->ex.bits.fc1 = 0;
6209		j->ex.bits.fc2 = 0;
6210		j->ex.bits.fc3 = 0;
6211		j->ex.bits.reserved = 0;
6212		break;
6213	case PHONE_HOOKSTATE:
6214		j->ex.bits.hookstate = 0;
6215		retval = j->hookstate;  //j->r_hook;
6216		break;
6217	case IXJCTL_SET_LED:
6218		LED_SetState(arg, j);
6219		break;
6220	case PHONE_FRAME:
6221		retval = set_base_frame(j, arg);
6222		break;
6223	case PHONE_REC_CODEC:
6224		retval = set_rec_codec(j, arg);
6225		break;
6226	case PHONE_VAD:
6227		ixj_vad(j, arg);
6228		break;
6229	case PHONE_REC_START:
6230		ixj_record_start(j);
6231		break;
6232	case PHONE_REC_STOP:
6233		ixj_record_stop(j);
6234		break;
6235	case PHONE_REC_DEPTH:
6236		set_rec_depth(j, arg);
6237		break;
6238	case PHONE_REC_VOLUME:
6239		if(arg == -1) {
6240			retval = get_rec_volume(j);
6241		}
6242		else {
6243			set_rec_volume(j, arg);
6244			retval = arg;
6245		}
6246		break;
6247	case PHONE_REC_VOLUME_LINEAR:
6248		if(arg == -1) {
6249			retval = get_rec_volume_linear(j);
6250		}
6251		else {
6252			set_rec_volume_linear(j, arg);
6253			retval = arg;
6254		}
6255		break;
6256	case IXJCTL_DTMF_PRESCALE:
6257		if(arg == -1) {
6258			retval = get_dtmf_prescale(j);
6259		}
6260		else {
6261			set_dtmf_prescale(j, arg);
6262			retval = arg;
6263		}
6264		break;
6265	case PHONE_REC_LEVEL:
6266		retval = get_rec_level(j);
6267		break;
6268	case IXJCTL_SC_RXG:
6269		retval = ixj_siadc(j, arg);
6270		break;
6271	case IXJCTL_SC_TXG:
6272		retval = ixj_sidac(j, arg);
6273		break;
6274	case IXJCTL_AEC_START:
6275		ixj_aec_start(j, arg);
6276		break;
6277	case IXJCTL_AEC_STOP:
6278		aec_stop(j);
6279		break;
6280	case IXJCTL_AEC_GET_LEVEL:
6281		retval = j->aec_level;
6282		break;
6283	case PHONE_PLAY_CODEC:
6284		retval = set_play_codec(j, arg);
6285		break;
6286	case PHONE_PLAY_START:
6287		retval = ixj_play_start(j);
6288		break;
6289	case PHONE_PLAY_STOP:
6290		ixj_play_stop(j);
6291		break;
6292	case PHONE_PLAY_DEPTH:
6293		set_play_depth(j, arg);
6294		break;
6295	case PHONE_PLAY_VOLUME:
6296		if(arg == -1) {
6297			retval = get_play_volume(j);
6298		}
6299		else {
6300			set_play_volume(j, arg);
6301			retval = arg;
6302		}
6303		break;
6304	case PHONE_PLAY_VOLUME_LINEAR:
6305		if(arg == -1) {
6306			retval = get_play_volume_linear(j);
6307		}
6308		else {
6309			set_play_volume_linear(j, arg);
6310			retval = arg;
6311		}
6312		break;
6313	case PHONE_PLAY_LEVEL:
6314		retval = get_play_level(j);
6315		break;
6316	case IXJCTL_DSP_TYPE:
6317		retval = (j->dsp.high << 8) + j->dsp.low;
6318		break;
6319	case IXJCTL_DSP_VERSION:
6320		retval = (j->ver.high << 8) + j->ver.low;
6321		break;
6322	case IXJCTL_HZ:
6323		hertz = arg;
6324		break;
6325	case IXJCTL_RATE:
6326		if (arg > hertz)
6327			retval = -1;
6328		else
6329			samplerate = arg;
6330		break;
6331	case IXJCTL_DRYBUFFER_READ:
6332		put_user(j->drybuffer, (unsigned long __user *) argp);
6333		break;
6334	case IXJCTL_DRYBUFFER_CLEAR:
6335		j->drybuffer = 0;
6336		break;
6337	case IXJCTL_FRAMES_READ:
6338		put_user(j->framesread, (unsigned long __user *) argp);
6339		break;
6340	case IXJCTL_FRAMES_WRITTEN:
6341		put_user(j->frameswritten, (unsigned long __user *) argp);
6342		break;
6343	case IXJCTL_READ_WAIT:
6344		put_user(j->read_wait, (unsigned long __user *) argp);
6345		break;
6346	case IXJCTL_WRITE_WAIT:
6347		put_user(j->write_wait, (unsigned long __user *) argp);
6348		break;
6349	case PHONE_MAXRINGS:
6350		j->maxrings = arg;
6351		break;
6352	case PHONE_SET_TONE_ON_TIME:
6353		ixj_set_tone_on(arg, j);
6354		break;
6355	case PHONE_SET_TONE_OFF_TIME:
6356		ixj_set_tone_off(arg, j);
6357		break;
6358	case PHONE_GET_TONE_ON_TIME:
6359		if (ixj_get_tone_on(j)) {
6360			retval = -1;
6361		} else {
6362			retval = (j->ssr.high << 8) + j->ssr.low;
6363		}
6364		break;
6365	case PHONE_GET_TONE_OFF_TIME:
6366		if (ixj_get_tone_off(j)) {
6367			retval = -1;
6368		} else {
6369			retval = (j->ssr.high << 8) + j->ssr.low;
6370		}
6371		break;
6372	case PHONE_PLAY_TONE:
6373		if (!j->tone_state)
6374			retval = ixj_play_tone(j, arg);
6375		else
6376			retval = -1;
6377		break;
6378	case PHONE_GET_TONE_STATE:
6379		retval = j->tone_state;
6380		break;
6381	case PHONE_DTMF_READY:
6382		retval = j->ex.bits.dtmf_ready;
6383		break;
6384	case PHONE_GET_DTMF:
6385		if (ixj_hookstate(j)) {
6386			if (j->dtmf_rp != j->dtmf_wp) {
6387				retval = j->dtmfbuffer[j->dtmf_rp];
6388				j->dtmf_rp++;
6389				if (j->dtmf_rp == 79)
6390					j->dtmf_rp = 0;
6391				if (j->dtmf_rp == j->dtmf_wp) {
6392					j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6393				}
6394			}
6395		}
6396		break;
6397	case PHONE_GET_DTMF_ASCII:
6398		if (ixj_hookstate(j)) {
6399			if (j->dtmf_rp != j->dtmf_wp) {
6400				switch (j->dtmfbuffer[j->dtmf_rp]) {
6401				case 10:
6402					retval = 42;	/* '*'; */
6403
6404					break;
6405				case 11:
6406					retval = 48;	/*'0'; */
6407
6408					break;
6409				case 12:
6410					retval = 35;	/*'#'; */
6411
6412					break;
6413				case 28:
6414					retval = 65;	/*'A'; */
6415
6416					break;
6417				case 29:
6418					retval = 66;	/*'B'; */
6419
6420					break;
6421				case 30:
6422					retval = 67;	/*'C'; */
6423
6424					break;
6425				case 31:
6426					retval = 68;	/*'D'; */
6427
6428					break;
6429				default:
6430					retval = 48 + j->dtmfbuffer[j->dtmf_rp];
6431					break;
6432				}
6433				j->dtmf_rp++;
6434				if (j->dtmf_rp == 79)
6435					j->dtmf_rp = 0;
6436				if(j->dtmf_rp == j->dtmf_wp)
6437				{
6438					j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6439				}
6440			}
6441		}
6442		break;
6443	case PHONE_DTMF_OOB:
6444		j->flags.dtmf_oob = arg;
6445		break;
6446	case PHONE_DIALTONE:
6447		ixj_dialtone(j);
6448		break;
6449	case PHONE_BUSY:
6450		ixj_busytone(j);
6451		break;
6452	case PHONE_RINGBACK:
6453		ixj_ringback(j);
6454		break;
6455	case PHONE_WINK:
6456		if(j->cardtype == QTI_PHONEJACK)
6457			retval = -1;
6458		else
6459			retval = ixj_wink(j);
6460		break;
6461	case PHONE_CPT_STOP:
6462		ixj_cpt_stop(j);
6463		break;
6464        case PHONE_QUERY_CODEC:
6465        {
6466                struct phone_codec_data pd;
6467                int val;
6468                int proto_size[] = {
6469                        -1,
6470                        12, 10, 16, 9, 8, 48, 5,
6471                        40, 40, 80, 40, 40, 6
6472                };
6473                if(copy_from_user(&pd, argp, sizeof(pd))) {
6474                        retval = -EFAULT;
6475			break;
6476		}
6477                if(pd.type<1 || pd.type>13) {
6478                        retval = -EPROTONOSUPPORT;
6479			break;
6480		}
6481                if(pd.type<G729)
6482                        val=proto_size[pd.type];
6483                else switch(j->baseframe.low)
6484                {
6485                        case 0xA0:val=2*proto_size[pd.type];break;
6486                        case 0x50:val=proto_size[pd.type];break;
6487                        default:val=proto_size[pd.type]*3;break;
6488                }
6489                pd.buf_min=pd.buf_max=pd.buf_opt=val;
6490                if(copy_to_user(argp, &pd, sizeof(pd)))
6491                        retval = -EFAULT;
6492        	break;
6493        }
6494	case IXJCTL_DSP_IDLE:
6495		idle(j);
6496		break;
6497	case IXJCTL_MIXER:
6498                if ((arg & 0xff) == 0xff)
6499			retval = ixj_get_mixer(arg, j);
6500                else
6501			ixj_mixer(arg, j);
6502		break;
6503	case IXJCTL_DAA_COEFF_SET:
6504		switch (arg) {
6505		case DAA_US:
6506			DAA_Coeff_US(j);
6507			retval = ixj_daa_write(j);
6508			break;
6509		case DAA_UK:
6510			DAA_Coeff_UK(j);
6511			retval = ixj_daa_write(j);
6512			break;
6513		case DAA_FRANCE:
6514			DAA_Coeff_France(j);
6515			retval = ixj_daa_write(j);
6516			break;
6517		case DAA_GERMANY:
6518			DAA_Coeff_Germany(j);
6519			retval = ixj_daa_write(j);
6520			break;
6521		case DAA_AUSTRALIA:
6522			DAA_Coeff_Australia(j);
6523			retval = ixj_daa_write(j);
6524			break;
6525		case DAA_JAPAN:
6526			DAA_Coeff_Japan(j);
6527			retval = ixj_daa_write(j);
6528			break;
6529		default:
6530			retval = 1;
6531			break;
6532		}
6533		break;
6534	case IXJCTL_DAA_AGAIN:
6535		ixj_daa_cr4(j, arg | 0x02);
6536		break;
6537	case IXJCTL_PSTN_LINETEST:
6538		retval = ixj_linetest(j);
6539		break;
6540	case IXJCTL_VMWI:
6541		ixj_write_vmwi(j, arg);
6542		break;
6543	case IXJCTL_CID:
6544		if (copy_to_user(argp, &j->cid, sizeof(PHONE_CID)))
6545			retval = -EFAULT;
6546		j->ex.bits.caller_id = 0;
6547		break;
6548	case IXJCTL_WINK_DURATION:
6549		j->winktime = arg;
6550		break;
6551	case IXJCTL_PORT:
6552		if (arg)
6553			retval = ixj_set_port(j, arg);
6554		else
6555			retval = j->port;
6556		break;
6557	case IXJCTL_POTS_PSTN:
6558		retval = ixj_set_pots(j, arg);
6559		break;
6560	case PHONE_CAPABILITIES:
6561		add_caps(j);
6562		retval = j->caps;
6563		break;
6564	case PHONE_CAPABILITIES_LIST:
6565		add_caps(j);
6566		if (copy_to_user(argp, j->caplist, sizeof(struct phone_capability) * j->caps))
6567			retval = -EFAULT;
6568		break;
6569	case PHONE_CAPABILITIES_CHECK:
6570		{
6571			struct phone_capability cap;
6572			if (copy_from_user(&cap, argp, sizeof(cap)))
6573				retval = -EFAULT;
6574			else {
6575				add_caps(j);
6576				retval = capabilities_check(j, &cap);
6577			}
6578		}
6579		break;
6580	case PHONE_PSTN_SET_STATE:
6581		daa_set_mode(j, arg);
6582		break;
6583	case PHONE_PSTN_GET_STATE:
6584		retval = j->daa_mode;
6585		j->ex.bits.pstn_ring = 0;
6586		break;
6587	case IXJCTL_SET_FILTER:
6588		if (copy_from_user(&jf, argp, sizeof(jf)))
6589			retval = -EFAULT;
6590		retval = ixj_init_filter(j, &jf);
6591		break;
6592	case IXJCTL_SET_FILTER_RAW:
6593		if (copy_from_user(&jfr, argp, sizeof(jfr)))
6594			retval = -EFAULT;
6595		else
6596			retval = ixj_init_filter_raw(j, &jfr);
6597		break;
6598	case IXJCTL_GET_FILTER_HIST:
6599		if(arg<0||arg>3)
6600			retval = -EINVAL;
6601		else
6602			retval = j->filter_hist[arg];
6603		break;
6604	case IXJCTL_INIT_TONE:
6605		if (copy_from_user(&ti, argp, sizeof(ti)))
6606			retval = -EFAULT;
6607		else
6608			retval = ixj_init_tone(j, &ti);
6609		break;
6610	case IXJCTL_TONE_CADENCE:
6611		retval = ixj_build_cadence(j, argp);
6612		break;
6613	case IXJCTL_FILTER_CADENCE:
6614		retval = ixj_build_filter_cadence(j, argp);
6615		break;
6616	case IXJCTL_SIGCTL:
6617		if (copy_from_user(&j->sigdef, argp, sizeof(IXJ_SIGDEF))) {
6618			retval = -EFAULT;
6619			break;
6620		}
6621		j->ixj_signals[j->sigdef.event] = j->sigdef.signal;
6622		if(j->sigdef.event < 33) {
6623			raise = 1;
6624			for(mant = 0; mant < j->sigdef.event; mant++){
6625				raise *= 2;
6626			}
6627			if(j->sigdef.signal)
6628				j->ex_sig.bytes |= raise;
6629			else
6630				j->ex_sig.bytes &= (raise^0xffff);
6631		}
6632		break;
6633	case IXJCTL_INTERCOM_STOP:
6634		if(arg < 0 || arg >= IXJMAX)
6635			return -EINVAL;
6636		j->intercom = -1;
6637		ixj_record_stop(j);
6638		ixj_play_stop(j);
6639		idle(j);
6640		get_ixj(arg)->intercom = -1;
6641		ixj_record_stop(get_ixj(arg));
6642		ixj_play_stop(get_ixj(arg));
6643		idle(get_ixj(arg));
6644		break;
6645	case IXJCTL_INTERCOM_START:
6646		if(arg < 0 || arg >= IXJMAX)
6647			return -EINVAL;
6648		j->intercom = arg;
6649		ixj_record_start(j);
6650		ixj_play_start(j);
6651		get_ixj(arg)->intercom = board;
6652		ixj_play_start(get_ixj(arg));
6653		ixj_record_start(get_ixj(arg));
6654		break;
6655	}
6656	if (ixjdebug & 0x0040)
6657		printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6658	clear_bit(board, &j->busyflags);
6659	return retval;
6660}
6661
6662static int ixj_fasync(int fd, struct file *file_p, int mode)
6663{
6664	IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
6665
6666	return fasync_helper(fd, file_p, mode, &j->async_queue);
6667}
6668
6669static const struct file_operations ixj_fops =
6670{
6671        .owner          = THIS_MODULE,
6672        .read           = ixj_enhanced_read,
6673        .write          = ixj_enhanced_write,
6674        .poll           = ixj_poll,
6675        .ioctl          = ixj_ioctl,
6676        .release        = ixj_release,
6677        .fasync         = ixj_fasync
6678};
6679
6680static int ixj_linetest(IXJ *j)
6681{
6682	j->flags.pstncheck = 1;	/* Testing */
6683	j->flags.pstn_present = 0; /* Assume the line is not there */
6684
6685	daa_int_read(j);	/*Clear DAA Interrupt flags */
6686	/* */
6687	/* Hold all relays in the normally de-energized position. */
6688	/* */
6689
6690	j->pld_slicw.bits.rly1 = 0;
6691	j->pld_slicw.bits.rly2 = 0;
6692	j->pld_slicw.bits.rly3 = 0;
6693	outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6694	j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
6695
6696	outb_p(j->pld_scrw.byte, j->XILINXbase);
6697	j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
6698	if (j->pld_slicr.bits.potspstn) {
6699		j->flags.pots_pstn = 1;
6700		j->flags.pots_correct = 0;
6701		LED_SetState(0x4, j);
6702	} else {
6703		j->flags.pots_pstn = 0;
6704		j->pld_slicw.bits.rly1 = 0;
6705		j->pld_slicw.bits.rly2 = 0;
6706		j->pld_slicw.bits.rly3 = 1;
6707		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6708		j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
6709
6710		outb_p(j->pld_scrw.byte, j->XILINXbase);
6711		daa_set_mode(j, SOP_PU_CONVERSATION);
6712		msleep(1000);
6713		daa_int_read(j);
6714		daa_set_mode(j, SOP_PU_RESET);
6715		if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6716			j->flags.pots_correct = 0;	/* Should not be line voltage on POTS port. */
6717			LED_SetState(0x4, j);
6718			j->pld_slicw.bits.rly3 = 0;
6719			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6720		} else {
6721			j->flags.pots_correct = 1;
6722			LED_SetState(0x8, j);
6723			j->pld_slicw.bits.rly1 = 1;
6724			j->pld_slicw.bits.rly2 = 0;
6725			j->pld_slicw.bits.rly3 = 0;
6726			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6727		}
6728	}
6729	j->pld_slicw.bits.rly3 = 0;
6730	outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6731	daa_set_mode(j, SOP_PU_CONVERSATION);
6732	msleep(1000);
6733	daa_int_read(j);
6734	daa_set_mode(j, SOP_PU_RESET);
6735	if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6736		j->pstn_sleeptil = jiffies + (hertz / 4);
6737		j->flags.pstn_present = 1;
6738	} else {
6739		j->flags.pstn_present = 0;
6740	}
6741	if (j->flags.pstn_present) {
6742		if (j->flags.pots_correct) {
6743			LED_SetState(0xA, j);
6744		} else {
6745			LED_SetState(0x6, j);
6746		}
6747	} else {
6748		if (j->flags.pots_correct) {
6749			LED_SetState(0x9, j);
6750		} else {
6751			LED_SetState(0x5, j);
6752		}
6753	}
6754	j->flags.pstncheck = 0;	/* Testing */
6755	return j->flags.pstn_present;
6756}
6757
6758static int ixj_selfprobe(IXJ *j)
6759{
6760	unsigned short cmd;
6761	int cnt;
6762	BYTES bytes;
6763
6764        init_waitqueue_head(&j->poll_q);
6765        init_waitqueue_head(&j->read_q);
6766        init_waitqueue_head(&j->write_q);
6767
6768	while(atomic_read(&j->DSPWrite) > 0)
6769		atomic_dec(&j->DSPWrite);
6770	if (ixjdebug & 0x0002)
6771		printk(KERN_INFO "Write IDLE to Software Control Register\n");
6772	ixj_WriteDSPCommand(0x0FE0, j);	/* Put the DSP in full power mode. */
6773
6774	if (ixj_WriteDSPCommand(0x0000, j))		/* Write IDLE to Software Control Register */
6775		return -1;
6776/* The read values of the SSR should be 0x00 for the IDLE command */
6777	if (j->ssr.low || j->ssr.high)
6778		return -1;
6779	if (ixjdebug & 0x0002)
6780		printk(KERN_INFO "Get Device ID Code\n");
6781	if (ixj_WriteDSPCommand(0x3400, j))		/* Get Device ID Code */
6782		return -1;
6783	j->dsp.low = j->ssr.low;
6784	j->dsp.high = j->ssr.high;
6785	if (ixjdebug & 0x0002)
6786		printk(KERN_INFO "Get Device Version Code\n");
6787	if (ixj_WriteDSPCommand(0x3800, j))		/* Get Device Version Code */
6788		return -1;
6789	j->ver.low = j->ssr.low;
6790	j->ver.high = j->ssr.high;
6791	if (!j->cardtype) {
6792		if (j->dsp.low == 0x21) {
6793			bytes.high = bytes.low = inb_p(j->XILINXbase + 0x02);
6794			outb_p(bytes.low ^ 0xFF, j->XILINXbase + 0x02);
6795/* Test for Internet LineJACK or Internet PhoneJACK Lite */
6796			bytes.low = inb_p(j->XILINXbase + 0x02);
6797			if (bytes.low == bytes.high)	/*  Register is read only on */
6798				/*  Internet PhoneJack Lite */
6799			 {
6800				j->cardtype = QTI_PHONEJACK_LITE;
6801				if (!request_region(j->XILINXbase, 4, "ixj control")) {
6802					printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6803					return -1;
6804				}
6805				j->pld_slicw.pcib.e1 = 1;
6806				outb_p(j->pld_slicw.byte, j->XILINXbase);
6807			} else {
6808				j->cardtype = QTI_LINEJACK;
6809
6810				if (!request_region(j->XILINXbase, 8, "ixj control")) {
6811					printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6812					return -1;
6813				}
6814			}
6815		} else if (j->dsp.low == 0x22) {
6816			j->cardtype = QTI_PHONEJACK_PCI;
6817			request_region(j->XILINXbase, 4, "ixj control");
6818			j->pld_slicw.pcib.e1 = 1;
6819			outb_p(j->pld_slicw.byte, j->XILINXbase);
6820		} else
6821			j->cardtype = QTI_PHONEJACK;
6822	} else {
6823		switch (j->cardtype) {
6824		case QTI_PHONEJACK:
6825			if (!j->dsp.low != 0x20) {
6826				j->dsp.high = 0x80;
6827				j->dsp.low = 0x20;
6828				ixj_WriteDSPCommand(0x3800, j);
6829				j->ver.low = j->ssr.low;
6830				j->ver.high = j->ssr.high;
6831			}
6832			break;
6833		case QTI_LINEJACK:
6834			if (!request_region(j->XILINXbase, 8, "ixj control")) {
6835				printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6836				return -1;
6837			}
6838			break;
6839		case QTI_PHONEJACK_LITE:
6840		case QTI_PHONEJACK_PCI:
6841			if (!request_region(j->XILINXbase, 4, "ixj control")) {
6842				printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6843				return -1;
6844			}
6845			j->pld_slicw.pcib.e1 = 1;
6846			outb_p(j->pld_slicw.byte, j->XILINXbase);
6847			break;
6848		case QTI_PHONECARD:
6849			break;
6850		}
6851	}
6852	if (j->dsp.low == 0x20 || j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
6853		if (ixjdebug & 0x0002)
6854			printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6855		if (ixj_WriteDSPCommand(0xC462, j))		/* Write CODEC config to Software Control Register */
6856			return -1;
6857		if (ixjdebug & 0x0002)
6858			printk(KERN_INFO "Write CODEC timing to Software Control Register\n");
6859		if (j->cardtype == QTI_PHONEJACK) {
6860			cmd = 0x9FF2;
6861		} else {
6862			cmd = 0x9FF5;
6863		}
6864		if (ixj_WriteDSPCommand(cmd, j))	/* Write CODEC timing to Software Control Register */
6865			return -1;
6866	} else {
6867		if (set_base_frame(j, 30) != 30)
6868			return -1;
6869		if (ixjdebug & 0x0002)
6870			printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6871		if (j->cardtype == QTI_PHONECARD) {
6872			if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to Software Control Register */
6873				return -1;
6874		}
6875		if (j->cardtype == QTI_LINEJACK) {
6876			if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to Software Control Register */
6877				return -1;
6878			if (ixjdebug & 0x0002)
6879				printk(KERN_INFO "Turn on the PLD Clock at 8Khz\n");
6880			j->pld_clock.byte = 0;
6881			outb_p(j->pld_clock.byte, j->XILINXbase + 0x04);
6882		}
6883	}
6884
6885	if (j->dsp.low == 0x20) {
6886		if (ixjdebug & 0x0002)
6887			printk(KERN_INFO "Configure GPIO pins\n");
6888		j->gpio.bytes.high = 0x09;
6889/*  bytes.low = 0xEF;  0xF7 */
6890		j->gpio.bits.gpio1 = 1;
6891		j->gpio.bits.gpio2 = 1;
6892		j->gpio.bits.gpio3 = 0;
6893		j->gpio.bits.gpio4 = 1;
6894		j->gpio.bits.gpio5 = 1;
6895		j->gpio.bits.gpio6 = 1;
6896		j->gpio.bits.gpio7 = 1;
6897		ixj_WriteDSPCommand(j->gpio.word, j);	/* Set GPIO pin directions */
6898		if (ixjdebug & 0x0002)
6899			printk(KERN_INFO "Enable SLIC\n");
6900		j->gpio.bytes.high = 0x0B;
6901		j->gpio.bytes.low = 0x00;
6902		j->gpio.bits.gpio1 = 0;
6903		j->gpio.bits.gpio2 = 1;
6904		j->gpio.bits.gpio5 = 0;
6905		ixj_WriteDSPCommand(j->gpio.word, j);	/* send the ring stop signal */
6906		j->port = PORT_POTS;
6907	} else {
6908		if (j->cardtype == QTI_LINEJACK) {
6909			LED_SetState(0x1, j);
6910			msleep(100);
6911			LED_SetState(0x2, j);
6912			msleep(100);
6913			LED_SetState(0x4, j);
6914			msleep(100);
6915			LED_SetState(0x8, j);
6916			msleep(100);
6917			LED_SetState(0x0, j);
6918			daa_get_version(j);
6919			if (ixjdebug & 0x0002)
6920				printk("Loading DAA Coefficients\n");
6921			DAA_Coeff_US(j);
6922			if (!ixj_daa_write(j)) {
6923				printk("DAA write failed on board %d\n", j->board);
6924				return -1;
6925			}
6926			if(!ixj_daa_cid_reset(j)) {
6927				printk("DAA CID reset failed on board %d\n", j->board);
6928				return -1;
6929			}
6930			j->flags.pots_correct = 0;
6931			j->flags.pstn_present = 0;
6932			ixj_linetest(j);
6933			if (j->flags.pots_correct) {
6934				j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
6935
6936				outb_p(j->pld_scrw.byte, j->XILINXbase);
6937				j->pld_slicw.bits.rly1 = 1;
6938				j->pld_slicw.bits.spken = 1;
6939				outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6940				SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
6941/*				SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
6942				j->port = PORT_POTS;
6943			}
6944			ixj_set_port(j, PORT_PSTN);
6945			ixj_set_pots(j, 1);
6946			if (ixjdebug & 0x0002)
6947				printk(KERN_INFO "Enable Mixer\n");
6948			ixj_mixer(0x0000, j);	/*Master Volume Left unmute 0db */
6949			ixj_mixer(0x0100, j);	/*Master Volume Right unmute 0db */
6950
6951			ixj_mixer(0x0203, j);	/*Voice Left Volume unmute 6db */
6952			ixj_mixer(0x0303, j);	/*Voice Right Volume unmute 6db */
6953
6954			ixj_mixer(0x0480, j);	/*FM Left mute */
6955			ixj_mixer(0x0580, j);	/*FM Right mute */
6956
6957			ixj_mixer(0x0680, j);	/*CD Left mute */
6958			ixj_mixer(0x0780, j);	/*CD Right mute */
6959
6960			ixj_mixer(0x0880, j);	/*Line Left mute */
6961			ixj_mixer(0x0980, j);	/*Line Right mute */
6962
6963			ixj_mixer(0x0A80, j);	/*Aux left mute  */
6964			ixj_mixer(0x0B80, j);	/*Aux right mute */
6965
6966			ixj_mixer(0x0C00, j);	/*Mono1 unmute 12db */
6967			ixj_mixer(0x0D80, j);	/*Mono2 mute */
6968
6969			ixj_mixer(0x0E80, j);	/*Mic mute */
6970
6971			ixj_mixer(0x0F00, j);	/*Mono Out Volume unmute 0db */
6972
6973			ixj_mixer(0x1000, j);	/*Voice Left and Right out only */
6974			ixj_mixer(0x110C, j);
6975
6976
6977			ixj_mixer(0x1200, j);	/*Mono1 switch on mixer left */
6978			ixj_mixer(0x1401, j);
6979
6980			ixj_mixer(0x1300, j);       /*Mono1 switch on mixer right */
6981			ixj_mixer(0x1501, j);
6982
6983			ixj_mixer(0x1700, j);	/*Clock select */
6984
6985			ixj_mixer(0x1800, j);	/*ADC input from mixer */
6986
6987			ixj_mixer(0x1901, j);	/*Mic gain 30db */
6988
6989			if (ixjdebug & 0x0002)
6990				printk(KERN_INFO "Setting Default US Ring Cadence Detection\n");
6991			j->cadence_f[4].state = 0;
6992			j->cadence_f[4].on1 = 0;	/*Cadence Filter 4 is used for PSTN ring cadence */
6993			j->cadence_f[4].off1 = 0;
6994			j->cadence_f[4].on2 = 0;
6995			j->cadence_f[4].off2 = 0;
6996			j->cadence_f[4].on3 = 0;
6997			j->cadence_f[4].off3 = 0;	/* These should represent standard US ring pulse. */
6998			j->pstn_last_rmr = jiffies;
6999
7000		} else {
7001			if (j->cardtype == QTI_PHONECARD) {
7002				ixj_WriteDSPCommand(0xCF07, j);
7003				ixj_WriteDSPCommand(0x00B0, j);
7004				ixj_set_port(j, PORT_SPEAKER);
7005			} else {
7006				ixj_set_port(j, PORT_POTS);
7007				SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
7008/*				SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
7009			}
7010		}
7011	}
7012
7013	j->intercom = -1;
7014	j->framesread = j->frameswritten = 0;
7015	j->read_wait = j->write_wait = 0;
7016	j->rxreadycheck = j->txreadycheck = 0;
7017
7018	/* initialise the DTMF prescale to a sensible value */
7019	if (j->cardtype == QTI_LINEJACK) {
7020		set_dtmf_prescale(j, 0x10);
7021	} else {
7022		set_dtmf_prescale(j, 0x40);
7023	}
7024	set_play_volume(j, 0x100);
7025	set_rec_volume(j, 0x100);
7026
7027	if (ixj_WriteDSPCommand(0x0000, j))		/* Write IDLE to Software Control Register */
7028		return -1;
7029/* The read values of the SSR should be 0x00 for the IDLE command */
7030	if (j->ssr.low || j->ssr.high)
7031		return -1;
7032
7033	if (ixjdebug & 0x0002)
7034		printk(KERN_INFO "Enable Line Monitor\n");
7035
7036	if (ixjdebug & 0x0002)
7037		printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n");
7038
7039	if (ixj_WriteDSPCommand(0x7E01, j))		/* Asynchronous Line Monitor */
7040		return -1;
7041
7042	if (ixjdebug & 0x002)
7043		printk(KERN_INFO "Enable DTMF Detectors\n");
7044
7045	if (ixj_WriteDSPCommand(0x5151, j))		/* Enable DTMF detection */
7046		return -1;
7047
7048	if (ixj_WriteDSPCommand(0x6E01, j))		/* Set Asyncronous Tone Generation */
7049		return -1;
7050
7051	set_rec_depth(j, 2);	/* Set Record Channel Limit to 2 frames */
7052
7053	set_play_depth(j, 2);	/* Set Playback Channel Limit to 2 frames */
7054
7055	j->ex.bits.dtmf_ready = 0;
7056	j->dtmf_state = 0;
7057	j->dtmf_wp = j->dtmf_rp = 0;
7058	j->rec_mode = j->play_mode = -1;
7059	j->flags.ringing = 0;
7060	j->maxrings = MAXRINGS;
7061	j->ring_cadence = USA_RING_CADENCE;
7062	j->drybuffer = 0;
7063	j->winktime = 320;
7064	j->flags.dtmf_oob = 0;
7065	for (cnt = 0; cnt < 4; cnt++)
7066		j->cadence_f[cnt].enable = 0;
7067	/* must be a device on the specified address */
7068	ixj_WriteDSPCommand(0x0FE3, j);	/* Put the DSP in 1/5 power mode. */
7069
7070	/* Set up the default signals for events */
7071	for (cnt = 0; cnt < 35; cnt++)
7072		j->ixj_signals[cnt] = SIGIO;
7073
7074	/* Set the excetion signal enable flags */
7075	j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
7076	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 =
7077	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;
7078#ifdef IXJ_DYN_ALLOC
7079	j->fskdata = NULL;
7080#endif
7081	j->fskdcnt = 0;
7082	j->cidcw_wait = 0;
7083
7084	/* Register with the Telephony for Linux subsystem */
7085	j->p.f_op = &ixj_fops;
7086	j->p.open = ixj_open;
7087	j->p.board = j->board;
7088	phone_register_device(&j->p, PHONE_UNIT_ANY);
7089
7090	ixj_init_timer(j);
7091	ixj_add_timer(j);
7092	return 0;
7093}
7094
7095/*
7096 *	Exported service for pcmcia card handling
7097 */
7098
7099IXJ *ixj_pcmcia_probe(unsigned long dsp, unsigned long xilinx)
7100{
7101	IXJ *j = ixj_alloc();
7102
7103	j->board = 0;
7104
7105	j->DSPbase = dsp;
7106	j->XILINXbase = xilinx;
7107	j->cardtype = QTI_PHONECARD;
7108	ixj_selfprobe(j);
7109	return j;
7110}
7111
7112EXPORT_SYMBOL(ixj_pcmcia_probe);		/* Fpr PCMCIA */
7113
7114static int ixj_get_status_proc(char *buf)
7115{
7116	int len;
7117	int cnt;
7118	IXJ *j;
7119	len = 0;
7120	len += sprintf(buf + len, "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, IXJ_VER_MINOR, IXJ_BLD_VER);
7121	len += sprintf(buf + len, "\nsizeof IXJ struct %Zd bytes", sizeof(IXJ));
7122	len += sprintf(buf + len, "\nsizeof DAA struct %Zd bytes", sizeof(DAA_REGS));
7123	len += sprintf(buf + len, "\nUsing old telephony API");
7124	len += sprintf(buf + len, "\nDebug Level %d\n", ixjdebug);
7125
7126	for (cnt = 0; cnt < IXJMAX; cnt++) {
7127		j = get_ixj(cnt);
7128		if(j==NULL)
7129			continue;
7130		if (j->DSPbase) {
7131			len += sprintf(buf + len, "\nCard Num %d", cnt);
7132			len += sprintf(buf + len, "\nDSP Base Address 0x%4.4x", j->DSPbase);
7133			if (j->cardtype != QTI_PHONEJACK)
7134				len += sprintf(buf + len, "\nXILINX Base Address 0x%4.4x", j->XILINXbase);
7135			len += sprintf(buf + len, "\nDSP Type %2.2x%2.2x", j->dsp.high, j->dsp.low);
7136			len += sprintf(buf + len, "\nDSP Version %2.2x.%2.2x", j->ver.high, j->ver.low);
7137			len += sprintf(buf + len, "\nSerial Number %8.8x", j->serial);
7138			switch (j->cardtype) {
7139			case (QTI_PHONEJACK):
7140				len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK");
7141				break;
7142			case (QTI_LINEJACK):
7143				len += sprintf(buf + len, "\nCard Type = Internet LineJACK");
7144				if (j->flags.g729_loaded)
7145					len += sprintf(buf + len, " w/G.729 A/B");
7146				len += sprintf(buf + len, " Country = %d", j->daa_country);
7147				break;
7148			case (QTI_PHONEJACK_LITE):
7149				len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK Lite");
7150				if (j->flags.g729_loaded)
7151					len += sprintf(buf + len, " w/G.729 A/B");
7152				break;
7153			case (QTI_PHONEJACK_PCI):
7154				len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK PCI");
7155				if (j->flags.g729_loaded)
7156					len += sprintf(buf + len, " w/G.729 A/B");
7157				break;
7158			case (QTI_PHONECARD):
7159				len += sprintf(buf + len, "\nCard Type = Internet PhoneCARD");
7160				if (j->flags.g729_loaded)
7161					len += sprintf(buf + len, " w/G.729 A/B");
7162				len += sprintf(buf + len, "\nSmart Cable %spresent", j->pccr1.bits.drf ? "not " : "");
7163				if (!j->pccr1.bits.drf)
7164					len += sprintf(buf + len, "\nSmart Cable type %d", j->flags.pcmciasct);
7165				len += sprintf(buf + len, "\nSmart Cable state %d", j->flags.pcmciastate);
7166				break;
7167			default:
7168				len += sprintf(buf + len, "\nCard Type = %d", j->cardtype);
7169				break;
7170			}
7171			len += sprintf(buf + len, "\nReaders %d", j->readers);
7172			len += sprintf(buf + len, "\nWriters %d", j->writers);
7173			add_caps(j);
7174			len += sprintf(buf + len, "\nCapabilities %d", j->caps);
7175			if (j->dsp.low != 0x20)
7176				len += sprintf(buf + len, "\nDSP Processor load %d", j->proc_load);
7177			if (j->flags.cidsent)
7178				len += sprintf(buf + len, "\nCaller ID data sent");
7179			else
7180				len += sprintf(buf + len, "\nCaller ID data not sent");
7181
7182			len += sprintf(buf + len, "\nPlay CODEC ");
7183			switch (j->play_codec) {
7184			case G723_63:
7185				len += sprintf(buf + len, "G.723.1 6.3");
7186				break;
7187			case G723_53:
7188				len += sprintf(buf + len, "G.723.1 5.3");
7189				break;
7190			case TS85:
7191				len += sprintf(buf + len, "TrueSpeech 8.5");
7192				break;
7193			case TS48:
7194				len += sprintf(buf + len, "TrueSpeech 4.8");
7195				break;
7196			case TS41:
7197				len += sprintf(buf + len, "TrueSpeech 4.1");
7198				break;
7199			case G728:
7200				len += sprintf(buf + len, "G.728");
7201				break;
7202			case G729:
7203				len += sprintf(buf + len, "G.729");
7204				break;
7205			case G729B:
7206				len += sprintf(buf + len, "G.729B");
7207				break;
7208			case ULAW:
7209				len += sprintf(buf + len, "uLaw");
7210				break;
7211			case ALAW:
7212				len += sprintf(buf + len, "aLaw");
7213				break;
7214			case LINEAR16:
7215				len += sprintf(buf + len, "16 bit Linear");
7216				break;
7217			case LINEAR8:
7218				len += sprintf(buf + len, "8 bit Linear");
7219				break;
7220			case WSS:
7221				len += sprintf(buf + len, "Windows Sound System");
7222				break;
7223			default:
7224				len += sprintf(buf + len, "NO CODEC CHOSEN");
7225				break;
7226			}
7227			len += sprintf(buf + len, "\nRecord CODEC ");
7228			switch (j->rec_codec) {
7229			case G723_63:
7230				len += sprintf(buf + len, "G.723.1 6.3");
7231				break;
7232			case G723_53:
7233				len += sprintf(buf + len, "G.723.1 5.3");
7234				break;
7235			case TS85:
7236				len += sprintf(buf + len, "TrueSpeech 8.5");
7237				break;
7238			case TS48:
7239				len += sprintf(buf + len, "TrueSpeech 4.8");
7240				break;
7241			case TS41:
7242				len += sprintf(buf + len, "TrueSpeech 4.1");
7243				break;
7244			case G728:
7245				len += sprintf(buf + len, "G.728");
7246				break;
7247			case G729:
7248				len += sprintf(buf + len, "G.729");
7249				break;
7250			case G729B:
7251				len += sprintf(buf + len, "G.729B");
7252				break;
7253			case ULAW:
7254				len += sprintf(buf + len, "uLaw");
7255				break;
7256			case ALAW:
7257				len += sprintf(buf + len, "aLaw");
7258				break;
7259			case LINEAR16:
7260				len += sprintf(buf + len, "16 bit Linear");
7261				break;
7262			case LINEAR8:
7263				len += sprintf(buf + len, "8 bit Linear");
7264				break;
7265			case WSS:
7266				len += sprintf(buf + len, "Windows Sound System");
7267				break;
7268			default:
7269				len += sprintf(buf + len, "NO CODEC CHOSEN");
7270				break;
7271			}
7272			len += sprintf(buf + len, "\nAEC ");
7273			switch (j->aec_level) {
7274			case AEC_OFF:
7275				len += sprintf(buf + len, "Off");
7276				break;
7277			case AEC_LOW:
7278				len += sprintf(buf + len, "Low");
7279				break;
7280			case AEC_MED:
7281				len += sprintf(buf + len, "Med");
7282				break;
7283			case AEC_HIGH:
7284				len += sprintf(buf + len, "High");
7285				break;
7286			case AEC_AUTO:
7287				len += sprintf(buf + len, "Auto");
7288				break;
7289			case AEC_AGC:
7290				len += sprintf(buf + len, "AEC/AGC");
7291				break;
7292			default:
7293				len += sprintf(buf + len, "unknown(%i)", j->aec_level);
7294				break;
7295			}
7296
7297			len += sprintf(buf + len, "\nRec volume 0x%x", get_rec_volume(j));
7298			len += sprintf(buf + len, "\nPlay volume 0x%x", get_play_volume(j));
7299			len += sprintf(buf + len, "\nDTMF prescale 0x%x", get_dtmf_prescale(j));
7300
7301			len += sprintf(buf + len, "\nHook state %d", j->hookstate); /* j->r_hook);	*/
7302
7303			if (j->cardtype == QTI_LINEJACK) {
7304				len += sprintf(buf + len, "\nPOTS Correct %d", j->flags.pots_correct);
7305				len += sprintf(buf + len, "\nPSTN Present %d", j->flags.pstn_present);
7306				len += sprintf(buf + len, "\nPSTN Check %d", j->flags.pstncheck);
7307				len += sprintf(buf + len, "\nPOTS to PSTN %d", j->flags.pots_pstn);
7308				switch (j->daa_mode) {
7309				case SOP_PU_SLEEP:
7310					len += sprintf(buf + len, "\nDAA PSTN On Hook");
7311					break;
7312				case SOP_PU_RINGING:
7313					len += sprintf(buf + len, "\nDAA PSTN Ringing");
7314					len += sprintf(buf + len, "\nRinging state = %d", j->cadence_f[4].state);
7315					break;
7316				case SOP_PU_CONVERSATION:
7317					len += sprintf(buf + len, "\nDAA PSTN Off Hook");
7318					break;
7319				case SOP_PU_PULSEDIALING:
7320					len += sprintf(buf + len, "\nDAA PSTN Pulse Dialing");
7321					break;
7322				}
7323				len += sprintf(buf + len, "\nDAA RMR = %d", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR);
7324				len += sprintf(buf + len, "\nDAA VDD OK = %d", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK);
7325				len += sprintf(buf + len, "\nDAA CR0 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg);
7326				len += sprintf(buf + len, "\nDAA CR1 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg);
7327				len += sprintf(buf + len, "\nDAA CR2 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg);
7328				len += sprintf(buf + len, "\nDAA CR3 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg);
7329				len += sprintf(buf + len, "\nDAA CR4 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg);
7330				len += sprintf(buf + len, "\nDAA CR5 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg);
7331				len += sprintf(buf + len, "\nDAA XR0 = 0x%02x", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg);
7332				len += sprintf(buf + len, "\nDAA ringstop %ld - jiffies %ld", j->pstn_ring_stop, jiffies);
7333			}
7334			switch (j->port) {
7335			case PORT_POTS:
7336				len += sprintf(buf + len, "\nPort POTS");
7337				break;
7338			case PORT_PSTN:
7339				len += sprintf(buf + len, "\nPort PSTN");
7340				break;
7341			case PORT_SPEAKER:
7342				len += sprintf(buf + len, "\nPort SPEAKER/MIC");
7343				break;
7344			case PORT_HANDSET:
7345				len += sprintf(buf + len, "\nPort HANDSET");
7346				break;
7347			}
7348			if (j->dsp.low == 0x21 || j->dsp.low == 0x22) {
7349				len += sprintf(buf + len, "\nSLIC state ");
7350				switch (SLIC_GetState(j)) {
7351				case PLD_SLIC_STATE_OC:
7352					len += sprintf(buf + len, "OC");
7353					break;
7354				case PLD_SLIC_STATE_RINGING:
7355					len += sprintf(buf + len, "RINGING");
7356					break;
7357				case PLD_SLIC_STATE_ACTIVE:
7358					len += sprintf(buf + len, "ACTIVE");
7359					break;
7360				case PLD_SLIC_STATE_OHT:	/* On-hook transmit */
7361					len += sprintf(buf + len, "OHT");
7362					break;
7363				case PLD_SLIC_STATE_TIPOPEN:
7364					len += sprintf(buf + len, "TIPOPEN");
7365					break;
7366				case PLD_SLIC_STATE_STANDBY:
7367					len += sprintf(buf + len, "STANDBY");
7368					break;
7369				case PLD_SLIC_STATE_APR:	/* Active polarity reversal */
7370					len += sprintf(buf + len, "APR");
7371					break;
7372				case PLD_SLIC_STATE_OHTPR:	/* OHT polarity reversal */
7373					len += sprintf(buf + len, "OHTPR");
7374					break;
7375				default:
7376					len += sprintf(buf + len, "%d", SLIC_GetState(j));
7377					break;
7378				}
7379			}
7380			len += sprintf(buf + len, "\nBase Frame %2.2x.%2.2x", j->baseframe.high, j->baseframe.low);
7381			len += sprintf(buf + len, "\nCID Base Frame %2d", j->cid_base_frame_size);
7382#ifdef PERFMON_STATS
7383			len += sprintf(buf + len, "\nTimer Checks %ld", j->timerchecks);
7384			len += sprintf(buf + len, "\nRX Ready Checks %ld", j->rxreadycheck);
7385			len += sprintf(buf + len, "\nTX Ready Checks %ld", j->txreadycheck);
7386			len += sprintf(buf + len, "\nFrames Read %ld", j->framesread);
7387			len += sprintf(buf + len, "\nFrames Written %ld", j->frameswritten);
7388			len += sprintf(buf + len, "\nDry Buffer %ld", j->drybuffer);
7389			len += sprintf(buf + len, "\nRead Waits %ld", j->read_wait);
7390			len += sprintf(buf + len, "\nWrite Waits %ld", j->write_wait);
7391                        len += sprintf(buf + len, "\nStatus Waits %ld", j->statuswait);
7392                        len += sprintf(buf + len, "\nStatus Wait Fails %ld", j->statuswaitfail);
7393                        len += sprintf(buf + len, "\nPControl Waits %ld", j->pcontrolwait);
7394                        len += sprintf(buf + len, "\nPControl Wait Fails %ld", j->pcontrolwaitfail);
7395                        len += sprintf(buf + len, "\nIs Control Ready Checks %ld", j->iscontrolready);
7396                        len += sprintf(buf + len, "\nIs Control Ready Check failures %ld", j->iscontrolreadyfail);
7397
7398#endif
7399			len += sprintf(buf + len, "\n");
7400		}
7401	}
7402	return len;
7403}
7404
7405static int ixj_read_proc(char *page, char **start, off_t off,
7406                              int count, int *eof, void *data)
7407{
7408        int len = ixj_get_status_proc(page);
7409        if (len <= off+count) *eof = 1;
7410        *start = page + off;
7411        len -= off;
7412        if (len>count) len = count;
7413        if (len<0) len = 0;
7414        return len;
7415}
7416
7417
7418static void cleanup(void)
7419{
7420	int cnt;
7421	IXJ *j;
7422
7423	for (cnt = 0; cnt < IXJMAX; cnt++) {
7424		j = get_ixj(cnt);
7425		if(j != NULL && j->DSPbase) {
7426			if (ixjdebug & 0x0002)
7427				printk(KERN_INFO "IXJ: Deleting timer for /dev/phone%d\n", cnt);
7428			del_timer(&j->timer);
7429			if (j->cardtype == QTI_LINEJACK) {
7430				j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
7431
7432				outb_p(j->pld_scrw.byte, j->XILINXbase);
7433				j->pld_slicw.bits.rly1 = 0;
7434				j->pld_slicw.bits.rly2 = 0;
7435				j->pld_slicw.bits.rly3 = 0;
7436				outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
7437				LED_SetState(0x0, j);
7438				if (ixjdebug & 0x0002)
7439					printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7440				release_region(j->XILINXbase, 8);
7441			} else if (j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
7442				if (ixjdebug & 0x0002)
7443					printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7444				release_region(j->XILINXbase, 4);
7445			}
7446			kfree(j->read_buffer);
7447			kfree(j->write_buffer);
7448			if (j->dev)
7449				pnp_device_detach(j->dev);
7450			if (ixjdebug & 0x0002)
7451				printk(KERN_INFO "IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt);
7452			phone_unregister_device(&j->p);
7453			if (ixjdebug & 0x0002)
7454				printk(KERN_INFO "IXJ: Releasing DSP address for /dev/phone%d\n", cnt);
7455			release_region(j->DSPbase, 16);
7456#ifdef IXJ_DYN_ALLOC
7457			if (ixjdebug & 0x0002)
7458				printk(KERN_INFO "IXJ: Freeing memory for /dev/phone%d\n", cnt);
7459			kfree(j);
7460			ixj[cnt] = NULL;
7461#endif
7462		}
7463	}
7464	if (ixjdebug & 0x0002)
7465		printk(KERN_INFO "IXJ: Removing /proc/ixj\n");
7466	remove_proc_entry ("ixj", NULL);
7467}
7468
7469/* Typedefs */
7470typedef struct {
7471	BYTE length;
7472	DWORD bits;
7473} DATABLOCK;
7474
7475static void PCIEE_WriteBit(WORD wEEPROMAddress, BYTE lastLCC, BYTE byData)
7476{
7477	lastLCC = lastLCC & 0xfb;
7478	lastLCC = lastLCC | (byData ? 4 : 0);
7479	outb(lastLCC, wEEPROMAddress);	/*set data out bit as appropriate */
7480
7481	mdelay(1);
7482	lastLCC = lastLCC | 0x01;
7483	outb(lastLCC, wEEPROMAddress);	/*SK rising edge */
7484
7485	byData = byData << 1;
7486	lastLCC = lastLCC & 0xfe;
7487	mdelay(1);
7488	outb(lastLCC, wEEPROMAddress);	/*after delay, SK falling edge */
7489
7490}
7491
7492static BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC)
7493{
7494	mdelay(1);
7495	lastLCC = lastLCC | 0x01;
7496	outb(lastLCC, wEEPROMAddress);	/*SK rising edge */
7497
7498	lastLCC = lastLCC & 0xfe;
7499	mdelay(1);
7500	outb(lastLCC, wEEPROMAddress);	/*after delay, SK falling edge */
7501
7502	return ((inb(wEEPROMAddress) >> 3) & 1);
7503}
7504
7505static bool PCIEE_ReadWord(WORD wAddress, WORD wLoc, WORD * pwResult)
7506{
7507	BYTE lastLCC;
7508	WORD wEEPROMAddress = wAddress + 3;
7509	DWORD i;
7510	BYTE byResult;
7511	*pwResult = 0;
7512	lastLCC = inb(wEEPROMAddress);
7513	lastLCC = lastLCC | 0x02;
7514	lastLCC = lastLCC & 0xfe;
7515	outb(lastLCC, wEEPROMAddress);	/* CS hi, SK lo */
7516
7517	mdelay(1);		/* delay */
7518
7519	PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7520	PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7521	PCIEE_WriteBit(wEEPROMAddress, lastLCC, 0);
7522	for (i = 0; i < 8; i++) {
7523		PCIEE_WriteBit(wEEPROMAddress, lastLCC, wLoc & 0x80 ? 1 : 0);
7524		wLoc <<= 1;
7525	}
7526
7527	for (i = 0; i < 16; i++) {
7528		byResult = PCIEE_ReadBit(wEEPROMAddress, lastLCC);
7529		*pwResult = (*pwResult << 1) | byResult;
7530	}
7531
7532	mdelay(1);		/* another delay */
7533
7534	lastLCC = lastLCC & 0xfd;
7535	outb(lastLCC, wEEPROMAddress);	/* negate CS */
7536
7537	return 0;
7538}
7539
7540static DWORD PCIEE_GetSerialNumber(WORD wAddress)
7541{
7542	WORD wLo, wHi;
7543	if (PCIEE_ReadWord(wAddress, 62, &wLo))
7544		return 0;
7545	if (PCIEE_ReadWord(wAddress, 63, &wHi))
7546		return 0;
7547	return (((DWORD) wHi << 16) | wLo);
7548}
7549
7550static int dspio[IXJMAX + 1] =
7551{
7552	0,
7553};
7554static int xio[IXJMAX + 1] =
7555{
7556	0,
7557};
7558
7559module_param_array(dspio, int, NULL, 0);
7560module_param_array(xio, int, NULL, 0);
7561MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net");
7562MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
7563MODULE_LICENSE("GPL");
7564
7565static void __exit ixj_exit(void)
7566{
7567        cleanup();
7568}
7569
7570static IXJ *new_ixj(unsigned long port)
7571{
7572	IXJ *res;
7573	if (!request_region(port, 16, "ixj DSP")) {
7574		printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", port);
7575		return NULL;
7576	}
7577	res = ixj_alloc();
7578	if (!res) {
7579		release_region(port, 16);
7580		printk(KERN_INFO "ixj: out of memory\n");
7581		return NULL;
7582	}
7583	res->DSPbase = port;
7584	return res;
7585}
7586
7587static int __init ixj_probe_isapnp(int *cnt)
7588{
7589	int probe = 0;
7590	int func = 0x110;
7591        struct pnp_dev *dev = NULL, *old_dev = NULL;
7592
7593	while (1) {
7594		do {
7595			IXJ *j;
7596			int result;
7597
7598			old_dev = dev;
7599			dev = pnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'),
7600					 ISAPNP_FUNCTION(func), old_dev);
7601			if (!dev || !dev->card)
7602				break;
7603			result = pnp_device_attach(dev);
7604			if (result < 0) {
7605				printk("pnp attach failed %d \n", result);
7606				break;
7607			}
7608			if (pnp_activate_dev(dev) < 0) {
7609				printk("pnp activate failed (out of resources?)\n");
7610				pnp_device_detach(dev);
7611				return -ENOMEM;
7612			}
7613
7614			if (!pnp_port_valid(dev, 0)) {
7615				pnp_device_detach(dev);
7616				return -ENODEV;
7617			}
7618
7619			j = new_ixj(pnp_port_start(dev, 0));
7620			if (!j)
7621				break;
7622
7623			if (func != 0x110)
7624				j->XILINXbase = pnp_port_start(dev, 1);	/* get real port */
7625
7626			switch (func) {
7627			case (0x110):
7628				j->cardtype = QTI_PHONEJACK;
7629				break;
7630			case (0x310):
7631				j->cardtype = QTI_LINEJACK;
7632				break;
7633			case (0x410):
7634				j->cardtype = QTI_PHONEJACK_LITE;
7635				break;
7636			}
7637			j->board = *cnt;
7638			probe = ixj_selfprobe(j);
7639			if(!probe) {
7640				j->serial = dev->card->serial;
7641				j->dev = dev;
7642				switch (func) {
7643				case 0x110:
7644					printk(KERN_INFO "ixj: found Internet PhoneJACK at 0x%x\n", j->DSPbase);
7645					break;
7646				case 0x310:
7647					printk(KERN_INFO "ixj: found Internet LineJACK at 0x%x\n", j->DSPbase);
7648					break;
7649				case 0x410:
7650					printk(KERN_INFO "ixj: found Internet PhoneJACK Lite at 0x%x\n", j->DSPbase);
7651					break;
7652				}
7653			}
7654			++*cnt;
7655		} while (dev);
7656		if (func == 0x410)
7657			break;
7658		if (func == 0x310)
7659			func = 0x410;
7660		if (func == 0x110)
7661			func = 0x310;
7662		dev = NULL;
7663	}
7664	return probe;
7665}
7666
7667static int __init ixj_probe_isa(int *cnt)
7668{
7669	int i, probe;
7670
7671	/* Use passed parameters for older kernels without PnP */
7672	for (i = 0; i < IXJMAX; i++) {
7673		if (dspio[i]) {
7674			IXJ *j = new_ixj(dspio[i]);
7675
7676			if (!j)
7677				break;
7678
7679			j->XILINXbase = xio[i];
7680			j->cardtype = 0;
7681
7682			j->board = *cnt;
7683			probe = ixj_selfprobe(j);
7684			j->dev = NULL;
7685			++*cnt;
7686		}
7687	}
7688	return 0;
7689}
7690
7691static int __init ixj_probe_pci(int *cnt)
7692{
7693	struct pci_dev *pci = NULL;
7694	int i, probe = 0;
7695	IXJ *j = NULL;
7696
7697	for (i = 0; i < IXJMAX - *cnt; i++) {
7698		pci = pci_get_device(PCI_VENDOR_ID_QUICKNET,
7699				      PCI_DEVICE_ID_QUICKNET_XJ, pci);
7700		if (!pci)
7701			break;
7702
7703		if (pci_enable_device(pci))
7704			break;
7705		j = new_ixj(pci_resource_start(pci, 0));
7706		if (!j)
7707			break;
7708
7709		j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2);
7710		j->XILINXbase = j->DSPbase + 0x10;
7711		j->cardtype = QTI_PHONEJACK_PCI;
7712		j->board = *cnt;
7713		probe = ixj_selfprobe(j);
7714		if (!probe)
7715			printk(KERN_INFO "ixj: found Internet PhoneJACK PCI at 0x%x\n", j->DSPbase);
7716		++*cnt;
7717	}
7718	pci_dev_put(pci);
7719	return probe;
7720}
7721
7722static int __init ixj_init(void)
7723{
7724	int cnt = 0;
7725	int probe = 0;
7726
7727	cnt = 0;
7728
7729	/* These might be no-ops, see above. */
7730	if ((probe = ixj_probe_isapnp(&cnt)) < 0) {
7731		return probe;
7732	}
7733	if ((probe = ixj_probe_isa(&cnt)) < 0) {
7734		return probe;
7735	}
7736	if ((probe = ixj_probe_pci(&cnt)) < 0) {
7737		return probe;
7738	}
7739	printk(KERN_INFO "ixj driver initialized.\n");
7740	create_proc_read_entry ("ixj", 0, NULL, ixj_read_proc, NULL);
7741	return probe;
7742}
7743
7744module_init(ixj_init);
7745module_exit(ixj_exit);
7746
7747static void DAA_Coeff_US(IXJ *j)
7748{
7749	int i;
7750
7751	j->daa_country = DAA_US;
7752	/*----------------------------------------------- */
7753	/* CAO */
7754	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
7755		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
7756	}
7757
7758/* Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00 */
7759	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x03;
7760	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0x4B;
7761	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x5D;
7762	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xCD;
7763	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x24;
7764	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xC5;
7765	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
7766	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
7767/* Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08 */
7768	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x71;
7769	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x1A;
7770	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
7771	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
7772	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xB5;
7773	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
7774	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
7775	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
7776/* Bytes for FRX-filter       (08): 03,8F,48,F2,8F,48,70,08 */
7777	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x05;
7778	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xA3;
7779	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x72;
7780	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
7781	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x3F;
7782	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x3B;
7783	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
7784	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
7785/* Bytes for FRR-filter       (07): 04,8F,38,7F,9B,EA,B0,08 */
7786	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x05;
7787	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
7788	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
7789	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x3E;
7790	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x32;
7791	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xDA;
7792	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
7793	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
7794/* Bytes for AX-filter        (0A): 16,55,DD,CA */
7795	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x41;
7796	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
7797	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
7798	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
7799/* Bytes for AR-filter        (09): 52,D3,11,42 */
7800	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
7801	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
7802	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
7803	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
7804/* Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98 */
7805	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
7806	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
7807	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
7808	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
7809	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA5;
7810	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
7811	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
7812	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
7813/* Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD */
7814	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
7815	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xA2;
7816	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2B;
7817	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
7818	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
7819	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAB;
7820	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
7821	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xCC;
7822/* Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB */
7823	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
7824	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
7825	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xD2;
7826	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x24;
7827	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBA;
7828	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xA9;
7829	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x3B;
7830	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xA6;
7831/* ;  (10K, 0.68uF) */
7832	/*  */
7833	/* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7834	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
7835	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
7836	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
7837	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
7838	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
7839	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
7840	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
7841	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
7842	/* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7843	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
7844	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
7845	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
7846	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
7847	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
7848	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
7849	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
7850	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
7851
7852	/* Levelmetering Ringing        (0D):B2,45,0F,8E       */
7853	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
7854	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
7855	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
7856	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
7857
7858	/* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7859/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1C; */
7860/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0xB3; */
7861/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0xAB; */
7862/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xAB; */
7863/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x54; */
7864/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x2D; */
7865/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0x62; */
7866/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x2D; */
7867	/* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7868/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x2D; */
7869/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x62; */
7870/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; */
7871/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBB; */
7872/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x2A; */
7873/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7D; */
7874/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; */
7875/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD4; */
7876/* */
7877	/* Levelmetering Ringing        (0D):B2,45,0F,8E       */
7878/*	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; */
7879/*	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x05; */
7880/*	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; */
7881/*	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; */
7882
7883	/* Caller ID 1st Tone           (0E):CA,0E,CA,09,99,99,99,99 */
7884	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
7885	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
7886	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
7887	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
7888	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
7889	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
7890	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
7891	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
7892/* Caller ID 2nd Tone           (0F):FD,B5,BA,07,DA,00,00,00 */
7893	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
7894	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
7895	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
7896	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
7897	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
7898	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
7899	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
7900	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
7901/*  */
7902	/* ;CR Registers */
7903	/* Config. Reg. 0 (filters)       (cr0):FE ; CLK gen. by crystal */
7904	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
7905/* Config. Reg. 1 (dialing)       (cr1):05 */
7906	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
7907/* Config. Reg. 2 (caller ID)     (cr2):04 */
7908	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
7909/* Config. Reg. 3 (testloops)     (cr3):03 ; SEL Bit==0, HP-disabled */
7910	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
7911/* Config. Reg. 4 (analog gain)   (cr4):02 */
7912	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
7913	/* Config. Reg. 5 (Version)       (cr5):02 */
7914	/* Config. Reg. 6 (Reserved)      (cr6):00 */
7915	/* Config. Reg. 7 (Reserved)      (cr7):00 */
7916	/*  */
7917	/* ;xr Registers */
7918	/* Ext. Reg. 0 (Interrupt Reg.)   (xr0):02 */
7919
7920	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
7921	/* Ext. Reg. 1 (Interrupt enable) (xr1):3C Cadence, RING, Caller ID, VDD_OK */
7922
7923	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x3C;
7924/* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
7925	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
7926/* Ext. Reg. 3 (DC Char)          (xr3):32 ; B-Filter Off == 1 */
7927	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x3B;		/*0x32; */
7928	/* Ext. Reg. 4 (Cadence)          (xr4):00 */
7929
7930	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
7931/* Ext. Reg. 5 (Ring timer)       (xr5):22 */
7932	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
7933/* Ext. Reg. 6 (Power State)      (xr6):00 */
7934	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
7935/* Ext. Reg. 7 (Vdd)              (xr7):40 */
7936	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		/* 0x40 ??? Should it be 0x00? */
7937	/*  */
7938	/* DTMF Tone 1                     (0B): 11,B3,5A,2C ;   697 Hz   */
7939	/*                                       12,33,5A,C3 ;  770 Hz   */
7940	/*                                       13,3C,5B,32 ;  852 Hz   */
7941	/*                                       1D,1B,5C,CC ;  941 Hz   */
7942
7943	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
7944	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
7945	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
7946	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
7947/* DTMF Tone 2                     (0C): 32,32,52,B3 ;  1209 Hz   */
7948	/*                                       EC,1D,52,22 ;  1336 Hz   */
7949	/*                                       AA,AC,51,D2 ;  1477 Hz   */
7950	/*                                       9B,3B,51,25 ;  1633 Hz   */
7951	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
7952	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
7953	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
7954	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
7955}
7956
7957static void DAA_Coeff_UK(IXJ *j)
7958{
7959	int i;
7960
7961	j->daa_country = DAA_UK;
7962	/*----------------------------------------------- */
7963	/* CAO */
7964	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
7965		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
7966	}
7967
7968/*  Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00 */
7969	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
7970	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xC2;
7971	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
7972	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xA8;
7973	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xCB;
7974	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
7975	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
7976	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
7977/* Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08 */
7978	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x40;
7979	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x00;
7980	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
7981	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
7982	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xA4;
7983	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
7984	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
7985	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
7986/* Bytes for FRX-filter       (08): 07,9B,ED,24,B2,A2,A0,08 */
7987	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
7988	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9B;
7989	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xED;
7990	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x24;
7991	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0xB2;
7992	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0xA2;
7993	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xA0;
7994	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
7995/* Bytes for FRR-filter       (07): 0F,92,F2,B2,87,D2,30,08 */
7996	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
7997	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x92;
7998	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF2;
7999	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0xB2;
8000	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8001	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xD2;
8002	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x30;
8003	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8004/* Bytes for AX-filter        (0A): 1B,A5,DD,CA */
8005	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x1B;
8006	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xA5;
8007	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8008	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8009/* Bytes for AR-filter        (09): E2,27,10,D6 */
8010	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8011	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x27;
8012	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8013	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8014/* Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98 */
8015	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8016	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x2D;
8017	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x38;
8018	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x8B;
8019	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xD0;
8020	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x00;
8021	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8022	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8023/* Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4 */
8024	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8025	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x5A;
8026	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x53;
8027	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xF0;
8028	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x0B;
8029	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5F;
8030	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x84;
8031	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xD4;
8032/* Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32 */
8033	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8034	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8035	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x6A;
8036	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA4;
8037	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x8F;
8038	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x52;
8039	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xF5;
8040	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x32;
8041/* ; idle */
8042	/* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8043	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8044	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8045	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8046	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8047	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8048	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8049	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8050	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8051/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8052	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8053	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8054	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8055	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8056	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8057	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8058	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8059	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8060/* Levelmetering Ringing           (0D):AA,35,0F,8E     ; 25Hz 30V less possible? */
8061	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8062	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8063	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8064	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8065/* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
8066	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8067	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8068	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8069	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8070	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8071	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8072	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8073	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8074/* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
8075	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8076	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8077	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8078	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8079	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8080	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8081	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8082	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8083/* ;CR Registers */
8084	/* Config. Reg. 0 (filters)        (cr0):FF */
8085	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8086/* Config. Reg. 1 (dialing)        (cr1):05 */
8087	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8088/* Config. Reg. 2 (caller ID)      (cr2):04 */
8089	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8090/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
8091	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8092/* Config. Reg. 4 (analog gain)    (cr4):02 */
8093	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8094	/* Config. Reg. 5 (Version)        (cr5):02 */
8095	/* Config. Reg. 6 (Reserved)       (cr6):00 */
8096	/* Config. Reg. 7 (Reserved)       (cr7):00 */
8097	/* ;xr Registers */
8098	/* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
8099
8100	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
8101	/* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */
8102
8103	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */
8104	/* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
8105
8106	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8107/* Ext. Reg. 3 (DC Char)           (xr3):36        ;  */
8108	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8109/* Ext. Reg. 4 (Cadence)           (xr4):00 */
8110	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8111/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
8112	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8113/* Ext. Reg. 6 (Power State)       (xr6):00 */
8114	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8115/* Ext. Reg. 7 (Vdd)               (xr7):46 */
8116	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46;		/* 0x46 ??? Should it be 0x00? */
8117	/* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
8118	/*                                       12,33,5A,C3    ;  770 Hz   */
8119	/*                                       13,3C,5B,32    ;  852 Hz   */
8120	/*                                       1D,1B,5C,CC    ;  941 Hz   */
8121
8122	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8123	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8124	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8125	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8126/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
8127	/*                                       EC,1D,52,22    ;  1336 Hz   */
8128	/*                                       AA,AC,51,D2    ;  1477 Hz   */
8129	/*                                       9B,3B,51,25    ;  1633 Hz   */
8130	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8131	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8132	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8133	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8134}
8135
8136
8137static void DAA_Coeff_France(IXJ *j)
8138{
8139	int i;
8140
8141	j->daa_country = DAA_FRANCE;
8142	/*----------------------------------------------- */
8143	/* CAO */
8144	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8145		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8146	}
8147
8148/* Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00 */
8149	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x02;
8150	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA2;
8151	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x43;
8152	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2C;
8153	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x22;
8154	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xAF;
8155	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8156	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8157/* Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08 */
8158	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x67;
8159	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xCE;
8160	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8161	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x2C;
8162	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x22;
8163	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8164	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8165	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8166/* Bytes for FRX-filter       (08): 07,9A,28,F6,23,4A,B0,08 */
8167	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8168	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9A;
8169	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x28;
8170	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0xF6;
8171	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x23;
8172	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x4A;
8173	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xB0;
8174	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8175/* Bytes for FRR-filter       (07): 03,8F,F9,2F,9E,FA,20,08 */
8176	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8177	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8178	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
8179	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8180	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9E;
8181	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xFA;
8182	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8183	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8184/* Bytes for AX-filter        (0A): 16,B5,DD,CA */
8185	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x16;
8186	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
8187	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8188	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8189/* Bytes for AR-filter        (09): 52,C7,10,D6 */
8190	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8191	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
8192	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8193	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8194/* Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98 */
8195	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8196	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8197	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8198	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8199	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA6;
8200	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8201	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8202	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8203/* Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C */
8204	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8205	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAC;
8206	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8207	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x30;
8208	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x78;
8209	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAC;
8210	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x8A;
8211	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x2C;
8212/* Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45 */
8213	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8214	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8215	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8216	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA5;
8217	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x22;
8218	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA;
8219	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2C;
8220	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x45;
8221/* ; idle */
8222	/* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8223	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8224	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8225	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8226	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8227	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8228	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8229	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8230	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8231/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8232	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8233	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8234	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8235	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8236	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8237	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8238	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8239	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8240/* Levelmetering Ringing           (0D):32,45,B5,84     ; 50Hz 20V */
8241	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8242	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8243	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8244	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8245/* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
8246	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8247	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8248	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8249	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8250	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8251	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8252	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8253	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8254/* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
8255	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8256	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8257	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8258	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8259	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8260	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8261	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8262	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8263/* ;CR Registers */
8264	/* Config. Reg. 0 (filters)        (cr0):FF */
8265	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8266/* Config. Reg. 1 (dialing)        (cr1):05 */
8267	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8268/* Config. Reg. 2 (caller ID)      (cr2):04 */
8269	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8270/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
8271	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8272/* Config. Reg. 4 (analog gain)    (cr4):02 */
8273	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8274	/* Config. Reg. 5 (Version)        (cr5):02 */
8275	/* Config. Reg. 6 (Reserved)       (cr6):00 */
8276	/* Config. Reg. 7 (Reserved)       (cr7):00 */
8277	/* ;xr Registers */
8278	/* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
8279
8280	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
8281	/* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */
8282
8283	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */
8284	/* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
8285
8286	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8287/* Ext. Reg. 3 (DC Char)           (xr3):36        ;  */
8288	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8289/* Ext. Reg. 4 (Cadence)           (xr4):00 */
8290	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8291/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
8292	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8293/* Ext. Reg. 6 (Power State)       (xr6):00 */
8294	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8295/* Ext. Reg. 7 (Vdd)               (xr7):46 */
8296	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46;		/* 0x46 ??? Should it be 0x00? */
8297	/* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
8298	/*                                       12,33,5A,C3    ;  770 Hz   */
8299	/*                                       13,3C,5B,32    ;  852 Hz   */
8300	/*                                       1D,1B,5C,CC    ;  941 Hz   */
8301
8302	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8303	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8304	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8305	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8306/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
8307	/*                                       EC,1D,52,22    ;  1336 Hz   */
8308	/*                                       AA,AC,51,D2    ;  1477 Hz   */
8309	/*                                       9B,3B,51,25    ;  1633 Hz   */
8310	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8311	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8312	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8313	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8314}
8315
8316
8317static void DAA_Coeff_Germany(IXJ *j)
8318{
8319	int i;
8320
8321	j->daa_country = DAA_GERMANY;
8322	/*----------------------------------------------- */
8323	/* CAO */
8324	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8325		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8326	}
8327
8328/* Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00 */
8329	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8330	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xCE;
8331	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
8332	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xB8;
8333	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xD2;
8334	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
8335	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xB0;
8336	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8337/* Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08 */
8338	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x45;
8339	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x8F;
8340	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8341	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0C;
8342	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xD2;
8343	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x3A;
8344	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xD0;
8345	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8346/* Bytes for FRX-filter       (08): 07,AA,E2,34,24,89,20,08 */
8347	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8348	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xAA;
8349	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8350	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8351	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x24;
8352	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x89;
8353	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x20;
8354	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8355/* Bytes for FRR-filter       (07): 02,87,FA,37,9A,CA,B0,08 */
8356	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x02;
8357	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
8358	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xFA;
8359	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x37;
8360	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9A;
8361	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCA;
8362	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
8363	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8364/* Bytes for AX-filter        (0A): 72,D5,DD,CA */
8365	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x72;
8366	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xD5;
8367	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8368	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8369/* Bytes for AR-filter        (09): 72,42,13,4B */
8370	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x72;
8371	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x42;
8372	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x13;
8373	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x4B;
8374/* Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98 */
8375	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8376	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8377	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8378	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8379	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAD;
8380	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8381	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8382	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8383/* Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27 */
8384	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8385	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x42;
8386	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x5A;
8387	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8388	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
8389	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x1A;
8390	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
8391	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x27;
8392/* Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2 */
8393	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8394	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8395	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x63;
8396	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x26;
8397	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBD;
8398	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x4B;
8399	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xA3;
8400	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xC2;
8401/* ;  (10K, 0.68uF) */
8402	/* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
8403	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8404	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3B;
8405	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x9B;
8406	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xBA;
8407	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0xD4;
8408	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x1C;
8409	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xB3;
8410	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8411/* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
8412	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x13;
8413	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42;
8414	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8415	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8416	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0xD4;
8417	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x73;
8418	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0xCA;
8419	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8420/* Levelmetering Ringing        (0D):B2,45,0F,8E       */
8421	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xB2;
8422	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8423	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8424	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8425/* Caller ID 1st Tone           (0E):CA,0E,CA,09,99,99,99,99 */
8426	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8427	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8428	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8429	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8430	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8431	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8432	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8433	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8434/* Caller ID 2nd Tone           (0F):FD,B5,BA,07,DA,00,00,00 */
8435	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8436	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8437	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8438	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8439	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8440	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8441	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8442	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8443/* ;CR Registers */
8444	/* Config. Reg. 0 (filters)        (cr0):FF ; all Filters enabled, CLK from ext. source */
8445	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8446/* Config. Reg. 1 (dialing)        (cr1):05 ; Manual Ring, Ring metering enabled */
8447	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8448/* Config. Reg. 2 (caller ID)      (cr2):04 ; Analog Gain 0dB, FSC internal */
8449	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8450/* Config. Reg. 3 (testloops)      (cr3):00 ; SEL Bit==0, HP-enabled */
8451	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8452/* Config. Reg. 4 (analog gain)    (cr4):02 */
8453	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8454	/* Config. Reg. 5 (Version)        (cr5):02 */
8455	/* Config. Reg. 6 (Reserved)       (cr6):00 */
8456	/* Config. Reg. 7 (Reserved)       (cr7):00 */
8457	/* ;xr Registers */
8458	/* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
8459
8460	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
8461	/* Ext. Reg. 1 (Interrupt enable)  (xr1):1C ; Ring, CID, VDDOK Interrupts enabled */
8462
8463	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */
8464	/* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
8465
8466	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8467/* Ext. Reg. 3 (DC Char)           (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm */
8468	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x32;
8469/* Ext. Reg. 4 (Cadence)           (xr4):00 */
8470	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8471/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
8472	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8473/* Ext. Reg. 6 (Power State)       (xr6):00 */
8474	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8475/* Ext. Reg. 7 (Vdd)               (xr7):40 ; VDD=4.25 V */
8476	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		/* 0x40 ??? Should it be 0x00? */
8477	/* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
8478	/*                                       12,33,5A,C3    ;  770 Hz   */
8479	/*                                       13,3C,5B,32    ;  852 Hz   */
8480	/*                                       1D,1B,5C,CC    ;  941 Hz   */
8481
8482	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8483	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8484	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8485	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8486/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
8487	/*                                       EC,1D,52,22    ;  1336 Hz   */
8488	/*                                       AA,AC,51,D2    ;  1477 Hz   */
8489	/*                                       9B,3B,51,25    ;  1633 Hz   */
8490	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8491	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8492	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8493	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8494}
8495
8496
8497static void DAA_Coeff_Australia(IXJ *j)
8498{
8499	int i;
8500
8501	j->daa_country = DAA_AUSTRALIA;
8502	/*----------------------------------------------- */
8503	/* CAO */
8504	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8505		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8506	}
8507
8508/* Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00 */
8509	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8510	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA3;
8511	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xAA;
8512	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x28;
8513	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xB3;
8514	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x82;
8515	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xD0;
8516	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8517/* Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08 */
8518	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x70;
8519	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x96;
8520	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8521	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x09;
8522	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x32;
8523	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x6B;
8524	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xC0;
8525	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8526/* Bytes for FRX-filter       (08): 07,96,E2,34,32,9B,30,08 */
8527	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8528	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x96;
8529	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8530	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8531	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x32;
8532	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x9B;
8533	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
8534	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8535/* Bytes for FRR-filter       (07): 0F,9A,E9,2F,22,CC,A0,08 */
8536	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
8537	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x9A;
8538	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xE9;
8539	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8540	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x22;
8541	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCC;
8542	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xA0;
8543	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8544/* Bytes for AX-filter        (0A): CB,45,DD,CA */
8545	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0xCB;
8546	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x45;
8547	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8548	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8549/* Bytes for AR-filter        (09): 1B,67,10,D6 */
8550	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x1B;
8551	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x67;
8552	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8553	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8554/* Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98 */
8555	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8556	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8557	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8558	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8559	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAF;
8560	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8561	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8562	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8563/* Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC */
8564	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8565	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xDB;
8566	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x52;
8567	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
8568	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x38;
8569	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x01;
8570	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x82;
8571	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAC;
8572/* Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46 */
8573	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8574	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8575	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x4A;
8576	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x3E;
8577	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x2C;
8578	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x3B;
8579	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x24;
8580	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x46;
8581/* ;  idle */
8582	/* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8583	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8584	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8585	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8586	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8587	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8588	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8589	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8590	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8591/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8592	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8593	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8594	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8595	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8596	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8597	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8598	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8599	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8600/* Levelmetering Ringing           (0D):32,45,B5,84   ; 50Hz 20V */
8601	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8602	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8603	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8604	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8605/* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
8606	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8607	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8608	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8609	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8610	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8611	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8612	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8613	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8614/* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
8615	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8616	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8617	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8618	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8619	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8620	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8621	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8622	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8623/* ;CR Registers */
8624	/* Config. Reg. 0 (filters)        (cr0):FF */
8625	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8626/* Config. Reg. 1 (dialing)        (cr1):05 */
8627	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8628/* Config. Reg. 2 (caller ID)      (cr2):04 */
8629	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8630/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
8631	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8632/* Config. Reg. 4 (analog gain)    (cr4):02 */
8633	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8634	/* Config. Reg. 5 (Version)        (cr5):02 */
8635	/* Config. Reg. 6 (Reserved)       (cr6):00 */
8636	/* Config. Reg. 7 (Reserved)       (cr7):00 */
8637	/* ;xr Registers */
8638	/* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
8639
8640	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
8641	/* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */
8642
8643	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */
8644	/* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
8645
8646	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8647/* Ext. Reg. 3 (DC Char)           (xr3):2B      ;  */
8648	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x2B;
8649/* Ext. Reg. 4 (Cadence)           (xr4):00 */
8650	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8651/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
8652	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8653/* Ext. Reg. 6 (Power State)       (xr6):00 */
8654	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8655/* Ext. Reg. 7 (Vdd)               (xr7):40 */
8656	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		/* 0x40 ??? Should it be 0x00? */
8657
8658	/* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;  697 Hz   */
8659	/*                                       12,33,5A,C3    ;  770 Hz   */
8660	/*                                       13,3C,5B,32    ;  852 Hz   */
8661	/*                                       1D,1B,5C,CC    ;  941 Hz   */
8662	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8663	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8664	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8665	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8666
8667	/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
8668	/*                                       EC,1D,52,22    ;  1336 Hz   */
8669	/*                                       AA,AC,51,D2    ;  1477 Hz   */
8670	/*                                       9B,3B,51,25    ;  1633 Hz   */
8671	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8672	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8673	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8674	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8675}
8676
8677static void DAA_Coeff_Japan(IXJ *j)
8678{
8679	int i;
8680
8681	j->daa_country = DAA_JAPAN;
8682	/*----------------------------------------------- */
8683	/* CAO */
8684	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8685		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8686	}
8687
8688/* Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00 */
8689	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x06;
8690	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xBD;
8691	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2;
8692	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2D;
8693	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xBA;
8694	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xF9;
8695	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8696	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8697/* Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08 */
8698	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x6F;
8699	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xF7;
8700	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8701	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0E;
8702	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x34;
8703	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8704	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8705	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8706/* Bytes for FRX-filter       (08): 02,8F,68,77,9C,58,F0,08 */
8707	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x02;
8708	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F;
8709	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x68;
8710	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x77;
8711	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x9C;
8712	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x58;
8713	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xF0;
8714	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8715/* Bytes for FRR-filter       (07): 03,8F,38,73,87,EA,20,08 */
8716	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8717	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8718	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0x38;
8719	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x73;
8720	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8721	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA;
8722	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8723	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8724/* Bytes for AX-filter        (0A): 51,C5,DD,CA */
8725	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x51;
8726	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xC5;
8727	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8728	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8729/* Bytes for AR-filter        (09): 25,A7,10,D6 */
8730	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
8731	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xA7;
8732	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8733	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8734/* Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98 */
8735	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8736	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8737	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8738	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8739	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAE;
8740	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8741	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8742	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8743/* Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28 */
8744	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8745	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAB;
8746	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8747	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8748	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x99;
8749	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5B;
8750	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x89;
8751	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x28;
8752/* Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA */
8753	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8754	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8755	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8756	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x25;
8757	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x34;
8758	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xC5;
8759	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x4C;
8760	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBA;
8761/* ;  idle */
8762	/* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8763	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8764	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8765	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8766	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8767	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8768	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8769	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8770	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8771/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8772	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8773	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8774	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8775	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8776	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8777	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8778	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8779	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8780/* Levelmetering Ringing           (0D):AA,35,0F,8E    ; 25Hz 30V ????????? */
8781	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8782	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8783	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8784	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8785/* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
8786	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8787	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8788	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8789	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8790	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8791	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8792	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8793	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8794/* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
8795	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8796	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8797	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8798	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8799	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8800	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8801	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8802	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8803/* ;CR Registers */
8804	/* Config. Reg. 0 (filters)        (cr0):FF */
8805	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8806/* Config. Reg. 1 (dialing)        (cr1):05 */
8807	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8808/* Config. Reg. 2 (caller ID)      (cr2):04 */
8809	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8810/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
8811	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8812/* Config. Reg. 4 (analog gain)    (cr4):02 */
8813	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8814	/* Config. Reg. 5 (Version)        (cr5):02 */
8815	/* Config. Reg. 6 (Reserved)       (cr6):00 */
8816	/* Config. Reg. 7 (Reserved)       (cr7):00 */
8817	/* ;xr Registers */
8818	/* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
8819
8820	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
8821	/* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */
8822
8823	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */
8824	/* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
8825
8826	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8827/* Ext. Reg. 3 (DC Char)           (xr3):22        ;  */
8828	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x22;
8829/* Ext. Reg. 4 (Cadence)           (xr4):00 */
8830	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8831/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
8832	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8833/* Ext. Reg. 6 (Power State)       (xr6):00 */
8834	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8835/* Ext. Reg. 7 (Vdd)               (xr7):40 */
8836	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		/* 0x40 ??? Should it be 0x00? */
8837	/* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
8838	/*                                       12,33,5A,C3    ;  770 Hz   */
8839	/*                                       13,3C,5B,32    ;  852 Hz   */
8840	/*                                       1D,1B,5C,CC    ;  941 Hz   */
8841
8842	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8843	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8844	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8845	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8846/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
8847	/*                                       EC,1D,52,22    ;  1336 Hz   */
8848	/*                                       AA,AC,51,D2    ;  1477 Hz   */
8849	/*                                       9B,3B,51,25    ;  1633 Hz   */
8850	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8851	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8852	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8853	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8854}
8855
8856static s16 tone_table[][19] =
8857{
8858	{			/* f20_50[] 11 */
8859		32538,		/* A1 = 1.985962 */
8860		 -32325,	/* A2 = -0.986511 */
8861		 -343,		/* B2 = -0.010493 */
8862		 0,		/* B1 = 0 */
8863		 343,		/* B0 = 0.010493 */
8864		 32619,		/* A1 = 1.990906 */
8865		 -32520,	/* A2 = -0.992462 */
8866		 19179,		/* B2 = 0.585327 */
8867		 -19178,	/* B1 = -1.170593 */
8868		 19179,		/* B0 = 0.585327 */
8869		 32723,		/* A1 = 1.997314 */
8870		 -32686,	/* A2 = -0.997528 */
8871		 9973,		/* B2 = 0.304352 */
8872		 -9955,		/* B1 = -0.607605 */
8873		 9973,		/* B0 = 0.304352 */
8874		 7,		/* Internal filter scaling */
8875		 159,		/* Minimum in-band energy threshold */
8876		 21,		/* 21/32 in-band to broad-band ratio */
8877		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8878	},
8879	{			/* f133_200[] 12 */
8880		32072,		/* A1 = 1.95752 */
8881		 -31896,	/* A2 = -0.973419 */
8882		 -435,		/* B2 = -0.013294 */
8883		 0,		/* B1 = 0 */
8884		 435,		/* B0 = 0.013294 */
8885		 32188,		/* A1 = 1.9646 */
8886		 -32400,	/* A2 = -0.98877 */
8887		 15139,		/* B2 = 0.462036 */
8888		 -14882,	/* B1 = -0.908356 */
8889		 15139,		/* B0 = 0.462036 */
8890		 32473,		/* A1 = 1.981995 */
8891		 -32524,	/* A2 = -0.992584 */
8892		 23200,		/* B2 = 0.708008 */
8893		 -23113,	/* B1 = -1.410706 */
8894		 23200,		/* B0 = 0.708008 */
8895		 7,		/* Internal filter scaling */
8896		 159,		/* Minimum in-band energy threshold */
8897		 21,		/* 21/32 in-band to broad-band ratio */
8898		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8899	},
8900	{			/* f300 13 */
8901		31769,		/* A1 = -1.939026 */
8902		 -32584,	/* A2 = 0.994385 */
8903		 -475,		/* B2 = -0.014522 */
8904		 0,		/* B1 = 0.000000 */
8905		 475,		/* B0 = 0.014522 */
8906		 31789,		/* A1 = -1.940247 */
8907		 -32679,	/* A2 = 0.997284 */
8908		 17280,		/* B2 = 0.527344 */
8909		 -16865,	/* B1 = -1.029358 */
8910		 17280,		/* B0 = 0.527344 */
8911		 31841,		/* A1 = -1.943481 */
8912		 -32681,	/* A2 = 0.997345 */
8913		 543,		/* B2 = 0.016579 */
8914		 -525,		/* B1 = -0.032097 */
8915		 543,		/* B0 = 0.016579 */
8916		 5,		/* Internal filter scaling */
8917		 159,		/* Minimum in-band energy threshold */
8918		 21,		/* 21/32 in-band to broad-band ratio */
8919		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8920	},
8921	{			/* f300_420[] 14 */
8922		30750,		/* A1 = 1.876892 */
8923		 -31212,	/* A2 = -0.952515 */
8924		 -804,		/* B2 = -0.024541 */
8925		 0,		/* B1 = 0 */
8926		 804,		/* B0 = 0.024541 */
8927		 30686,		/* A1 = 1.872925 */
8928		 -32145,	/* A2 = -0.980988 */
8929		 14747,		/* B2 = 0.450043 */
8930		 -13703,	/* B1 = -0.836395 */
8931		 14747,		/* B0 = 0.450043 */
8932		 31651,		/* A1 = 1.931824 */
8933		 -32321,	/* A2 = -0.986389 */
8934		 24425,		/* B2 = 0.745422 */
8935		 -23914,	/* B1 = -1.459595 */
8936		 24427,		/* B0 = 0.745483 */
8937		 7,		/* Internal filter scaling */
8938		 159,		/* Minimum in-band energy threshold */
8939		 21,		/* 21/32 in-band to broad-band ratio */
8940		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8941	},
8942	{			/* f330 15 */
8943		31613,		/* A1 = -1.929565 */
8944		 -32646,	/* A2 = 0.996277 */
8945		 -185,		/* B2 = -0.005657 */
8946		 0,		/* B1 = 0.000000 */
8947		 185,		/* B0 = 0.005657 */
8948		 31620,		/* A1 = -1.929932 */
8949		 -32713,	/* A2 = 0.998352 */
8950		 19253,		/* B2 = 0.587585 */
8951		 -18566,	/* B1 = -1.133179 */
8952		 19253,		/* B0 = 0.587585 */
8953		 31674,		/* A1 = -1.933228 */
8954		 -32715,	/* A2 = 0.998413 */
8955		 2575,		/* B2 = 0.078590 */
8956		 -2495,		/* B1 = -0.152283 */
8957		 2575,		/* B0 = 0.078590 */
8958		 5,		/* Internal filter scaling */
8959		 159,		/* Minimum in-band energy threshold */
8960		 21,		/* 21/32 in-band to broad-band ratio */
8961		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8962	},
8963	{			/* f300_425[] 16 */
8964		30741,		/* A1 = 1.876282 */
8965		 -31475,	/* A2 = -0.960541 */
8966		 -703,		/* B2 = -0.021484 */
8967		 0,		/* B1 = 0 */
8968		 703,		/* B0 = 0.021484 */
8969		 30688,		/* A1 = 1.873047 */
8970		 -32248,	/* A2 = -0.984161 */
8971		 14542,		/* B2 = 0.443787 */
8972		 -13523,	/* B1 = -0.825439 */
8973		 14542,		/* B0 = 0.443817 */
8974		 31494,		/* A1 = 1.922302 */
8975		 -32366,	/* A2 = -0.987762 */
8976		 21577,		/* B2 = 0.658508 */
8977		 -21013,	/* B1 = -1.282532 */
8978		 21577,		/* B0 = 0.658508 */
8979		 7,		/* Internal filter scaling */
8980		 159,		/* Minimum in-band energy threshold */
8981		 21,		/* 21/32 in-band to broad-band ratio */
8982		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8983	},
8984	{			/* f330_440[] 17 */
8985		30627,		/* A1 = 1.869324 */
8986		 -31338,	/* A2 = -0.95636 */
8987		 -843,		/* B2 = -0.025749 */
8988		 0,		/* B1 = 0 */
8989		 843,		/* B0 = 0.025749 */
8990		 30550,		/* A1 = 1.864685 */
8991		 -32221,	/* A2 = -0.983337 */
8992		 13594,		/* B2 = 0.414886 */
8993		 -12589,	/* B1 = -0.768402 */
8994		 13594,		/* B0 = 0.414886 */
8995		 31488,		/* A1 = 1.921936 */
8996		 -32358,	/* A2 = -0.987518 */
8997		 24684,		/* B2 = 0.753296 */
8998		 -24029,	/* B1 = -1.466614 */
8999		 24684,		/* B0 = 0.753296 */
9000		 7,		/* Internal filter scaling */
9001		 159,		/* Minimum in-band energy threshold */
9002		 21,		/* 21/32 in-band to broad-band ratio */
9003		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9004	},
9005	{			/* f340 18 */
9006		31546,		/* A1 = -1.925476 */
9007		 -32646,	/* A2 = 0.996277 */
9008		 -445,		/* B2 = -0.013588 */
9009		 0,		/* B1 = 0.000000 */
9010		 445,		/* B0 = 0.013588 */
9011		 31551,		/* A1 = -1.925781 */
9012		 -32713,	/* A2 = 0.998352 */
9013		 23884,		/* B2 = 0.728882 */
9014		 -22979,	/* B1 = -1.402527 */
9015		 23884,		/* B0 = 0.728882 */
9016		 31606,		/* A1 = -1.929138 */
9017		 -32715,	/* A2 = 0.998413 */
9018		 863,		/* B2 = 0.026367 */
9019		 -835,		/* B1 = -0.050985 */
9020		 863,		/* B0 = 0.026367 */
9021		 5,		/* Internal filter scaling */
9022		 159,		/* Minimum in-band energy threshold */
9023		 21,		/* 21/32 in-band to broad-band ratio */
9024		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9025	},
9026	{			/* f350_400[] 19 */
9027		31006,		/* A1 = 1.892517 */
9028		 -32029,	/* A2 = -0.977448 */
9029		 -461,		/* B2 = -0.014096 */
9030		 0,		/* B1 = 0 */
9031		 461,		/* B0 = 0.014096 */
9032		 30999,		/* A1 = 1.892029 */
9033		 -32487,	/* A2 = -0.991455 */
9034		 11325,		/* B2 = 0.345612 */
9035		 -10682,	/* B1 = -0.651978 */
9036		 11325,		/* B0 = 0.345612 */
9037		 31441,		/* A1 = 1.919067 */
9038		 -32526,	/* A2 = -0.992615 */
9039		 24324,		/* B2 = 0.74231 */
9040		 -23535,	/* B1 = -1.436523 */
9041		 24324,		/* B0 = 0.74231 */
9042		 7,		/* Internal filter scaling */
9043		 159,		/* Minimum in-band energy threshold */
9044		 21,		/* 21/32 in-band to broad-band ratio */
9045		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9046	},
9047	{			/* f350_440[] */
9048		30634,		/* A1 = 1.869751 */
9049		 -31533,	/* A2 = -0.962341 */
9050		 -680,		/* B2 = -0.020782 */
9051		 0,		/* B1 = 0 */
9052		 680,		/* B0 = 0.020782 */
9053		 30571,		/* A1 = 1.865906 */
9054		 -32277,	/* A2 = -0.985016 */
9055		 12894,		/* B2 = 0.393524 */
9056		 -11945,	/* B1 = -0.729065 */
9057		 12894,		/* B0 = 0.393524 */
9058		 31367,		/* A1 = 1.91449 */
9059		 -32379,	/* A2 = -0.988129 */
9060		 23820,		/* B2 = 0.726929 */
9061		 -23104,	/* B1 = -1.410217 */
9062		 23820,		/* B0 = 0.726929 */
9063		 7,		/* Internal filter scaling */
9064		 159,		/* Minimum in-band energy threshold */
9065		 21,		/* 21/32 in-band to broad-band ratio */
9066		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9067	},
9068	{			/* f350_450[] */
9069		30552,		/* A1 = 1.864807 */
9070		 -31434,	/* A2 = -0.95929 */
9071		 -690,		/* B2 = -0.021066 */
9072		 0,		/* B1 = 0 */
9073		 690,		/* B0 = 0.021066 */
9074		 30472,		/* A1 = 1.859924 */
9075		 -32248,	/* A2 = -0.984161 */
9076		 13385,		/* B2 = 0.408478 */
9077		 -12357,	/* B1 = -0.754242 */
9078		 13385,		/* B0 = 0.408478 */
9079		 31358,		/* A1 = 1.914001 */
9080		 -32366,	/* A2 = -0.987732 */
9081		 26488,		/* B2 = 0.80835 */
9082		 -25692,	/* B1 = -1.568176 */
9083		 26490,		/* B0 = 0.808411 */
9084		 7,		/* Internal filter scaling */
9085		 159,		/* Minimum in-band energy threshold */
9086		 21,		/* 21/32 in-band to broad-band ratio */
9087		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9088	},
9089	{			/* f360 */
9090		31397,		/* A1 = -1.916321 */
9091		 -32623,	/* A2 = 0.995605 */
9092		 -117,		/* B2 = -0.003598 */
9093		 0,		/* B1 = 0.000000 */
9094		 117,		/* B0 = 0.003598 */
9095		 31403,		/* A1 = -1.916687 */
9096		 -32700,	/* A2 = 0.997925 */
9097		 3388,		/* B2 = 0.103401 */
9098		 -3240,		/* B1 = -0.197784 */
9099		 3388,		/* B0 = 0.103401 */
9100		 31463,		/* A1 = -1.920410 */
9101		 -32702,	/* A2 = 0.997986 */
9102		 13346,		/* B2 = 0.407288 */
9103		 -12863,	/* B1 = -0.785126 */
9104		 13346,		/* B0 = 0.407288 */
9105		 5,		/* Internal filter scaling */
9106		 159,		/* Minimum in-band energy threshold */
9107		 21,		/* 21/32 in-band to broad-band ratio */
9108		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9109	},
9110	{			/* f380_420[] */
9111		30831,		/* A1 = 1.881775 */
9112		 -32064,	/* A2 = -0.978546 */
9113		 -367,		/* B2 = -0.01122 */
9114		 0,		/* B1 = 0 */
9115		 367,		/* B0 = 0.01122 */
9116		 30813,		/* A1 = 1.880737 */
9117		 -32456,	/* A2 = -0.990509 */
9118		 11068,		/* B2 = 0.337769 */
9119		 -10338,	/* B1 = -0.631042 */
9120		 11068,		/* B0 = 0.337769 */
9121		 31214,		/* A1 = 1.905212 */
9122		 -32491,	/* A2 = -0.991577 */
9123		 16374,		/* B2 = 0.499695 */
9124		 -15781,	/* B1 = -0.963196 */
9125		 16374,		/* B0 = 0.499695 */
9126		 7,		/* Internal filter scaling */
9127		 159,		/* Minimum in-band energy threshold */
9128		 21,		/* 21/32 in-band to broad-band ratio */
9129		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9130	},
9131	{			/* f392 */
9132		31152,		/* A1 = -1.901428 */
9133		 -32613,	/* A2 = 0.995300 */
9134		 -314,		/* B2 = -0.009605 */
9135		 0,		/* B1 = 0.000000 */
9136		 314,		/* B0 = 0.009605 */
9137		 31156,		/* A1 = -1.901672 */
9138		 -32694,	/* A2 = 0.997742 */
9139		 28847,		/* B2 = 0.880371 */
9140		 -2734,		/* B1 = -0.166901 */
9141		 28847,		/* B0 = 0.880371 */
9142		 31225,		/* A1 = -1.905823 */
9143		 -32696,	/* A2 = 0.997803 */
9144		 462,		/* B2 = 0.014108 */
9145		 -442,		/* B1 = -0.027019 */
9146		 462,		/* B0 = 0.014108 */
9147		 5,		/* Internal filter scaling */
9148		 159,		/* Minimum in-band energy threshold */
9149		 21,		/* 21/32 in-band to broad-band ratio */
9150		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9151	},
9152	{			/* f400_425[] */
9153		30836,		/* A1 = 1.882141 */
9154		 -32296,	/* A2 = -0.985596 */
9155		 -324,		/* B2 = -0.009903 */
9156		 0,		/* B1 = 0 */
9157		 324,		/* B0 = 0.009903 */
9158		 30825,		/* A1 = 1.881409 */
9159		 -32570,	/* A2 = -0.993958 */
9160		 16847,		/* B2 = 0.51416 */
9161		 -15792,	/* B1 = -0.963898 */
9162		 16847,		/* B0 = 0.51416 */
9163		 31106,		/* A1 = 1.89856 */
9164		 -32584,	/* A2 = -0.994415 */
9165		 9579,		/* B2 = 0.292328 */
9166		 -9164,		/* B1 = -0.559357 */
9167		 9579,		/* B0 = 0.292328 */
9168		 7,		/* Internal filter scaling */
9169		 159,		/* Minimum in-band energy threshold */
9170		 21,		/* 21/32 in-band to broad-band ratio */
9171		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9172	},
9173	{			/* f400_440[] */
9174		30702,		/* A1 = 1.873962 */
9175		 -32134,	/* A2 = -0.980682 */
9176		 -517,		/* B2 = -0.015793 */
9177		 0,		/* B1 = 0 */
9178		 517,		/* B0 = 0.015793 */
9179		 30676,		/* A1 = 1.872375 */
9180		 -32520,	/* A2 = -0.992462 */
9181		 8144,		/* B2 = 0.24855 */
9182		 -7596,		/* B1 = -0.463684 */
9183		 8144,		/* B0 = 0.24855 */
9184		 31084,		/* A1 = 1.897217 */
9185		 -32547,	/* A2 = -0.993256 */
9186		 22713,		/* B2 = 0.693176 */
9187		 -21734,	/* B1 = -1.326599 */
9188		 22713,		/* B0 = 0.693176 */
9189		 7,		/* Internal filter scaling */
9190		 159,		/* Minimum in-band energy threshold */
9191		 21,		/* 21/32 in-band to broad-band ratio */
9192		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9193	},
9194	{			/* f400_450[] */
9195		30613,		/* A1 = 1.86853 */
9196		 -32031,	/* A2 = -0.977509 */
9197		 -618,		/* B2 = -0.018866 */
9198		 0,		/* B1 = 0 */
9199		 618,		/* B0 = 0.018866 */
9200		 30577,		/* A1 = 1.866272 */
9201		 -32491,	/* A2 = -0.991577 */
9202		 9612,		/* B2 = 0.293335 */
9203		 -8935,		/* B1 = -0.54541 */
9204		 9612,		/* B0 = 0.293335 */
9205		 31071,		/* A1 = 1.896484 */
9206		 -32524,	/* A2 = -0.992584 */
9207		 21596,		/* B2 = 0.659058 */
9208		 -20667,	/* B1 = -1.261414 */
9209		 21596,		/* B0 = 0.659058 */
9210		 7,		/* Internal filter scaling */
9211		 159,		/* Minimum in-band energy threshold */
9212		 21,		/* 21/32 in-band to broad-band ratio */
9213		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9214	},
9215	{			/* f420 */
9216		30914,		/* A1 = -1.886841 */
9217		 -32584,	/* A2 = 0.994385 */
9218		 -426,		/* B2 = -0.013020 */
9219		 0,		/* B1 = 0.000000 */
9220		 426,		/* B0 = 0.013020 */
9221		 30914,		/* A1 = -1.886841 */
9222		 -32679,	/* A2 = 0.997314 */
9223		 17520,		/* B2 = 0.534668 */
9224		 -16471,	/* B1 = -1.005310 */
9225		 17520,		/* B0 = 0.534668 */
9226		 31004,		/* A1 = -1.892334 */
9227		 -32683,	/* A2 = 0.997406 */
9228		 819,		/* B2 = 0.025023 */
9229		 -780,		/* B1 = -0.047619 */
9230		 819,		/* B0 = 0.025023 */
9231		 5,		/* Internal filter scaling */
9232		 159,		/* Minimum in-band energy threshold */
9233		 21,		/* 21/32 in-band to broad-band ratio */
9234		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9235	},
9236	{
9237		30850,
9238		-32534,
9239		-504,
9240		0,
9241		504,
9242		30831,
9243		-32669,
9244		24303,
9245		-22080,
9246		24303,
9247		30994,
9248		-32673,
9249		1905,
9250		-1811,
9251		1905,
9252		5,
9253		129,
9254		17,
9255		0xff5
9256	},
9257	{			/* f425_450[] */
9258		30646,		/* A1 = 1.870544 */
9259		 -32327,	/* A2 = -0.986572 */
9260		 -287,		/* B2 = -0.008769 */
9261		 0,		/* B1 = 0 */
9262		 287,		/* B0 = 0.008769 */
9263		 30627,		/* A1 = 1.869324 */
9264		 -32607,	/* A2 = -0.995087 */
9265		 13269,		/* B2 = 0.404968 */
9266		 -12376,	/* B1 = -0.755432 */
9267		 13269,		/* B0 = 0.404968 */
9268		 30924,		/* A1 = 1.887512 */
9269		 -32619,	/* A2 = -0.995453 */
9270		 19950,		/* B2 = 0.608826 */
9271		 -18940,	/* B1 = -1.156006 */
9272		 19950,		/* B0 = 0.608826 */
9273		 7,		/* Internal filter scaling */
9274		 159,		/* Minimum in-band energy threshold */
9275		 21,		/* 21/32 in-band to broad-band ratio */
9276		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9277	},
9278	{			/* f425_475[] */
9279		30396,		/* A1 = 1.855225 */
9280		 -32014,	/* A2 = -0.97699 */
9281		 -395,		/* B2 = -0.012055 */
9282		 0,		/* B1 = 0 */
9283		 395,		/* B0 = 0.012055 */
9284		 30343,		/* A1 = 1.85199 */
9285		 -32482,	/* A2 = -0.991302 */
9286		 17823,		/* B2 = 0.543945 */
9287		 -16431,	/* B1 = -1.002869 */
9288		 17823,		/* B0 = 0.543945 */
9289		 30872,		/* A1 = 1.884338 */
9290		 -32516,	/* A2 = -0.99231 */
9291		 18124,		/* B2 = 0.553101 */
9292		 -17246,	/* B1 = -1.052673 */
9293		 18124,		/* B0 = 0.553101 */
9294		 7,		/* Internal filter scaling */
9295		 159,		/* Minimum in-band energy threshold */
9296		 21,		/* 21/32 in-band to broad-band ratio */
9297		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9298	},
9299	{			/* f435 */
9300		30796,		/* A1 = -1.879639 */
9301		 -32603,	/* A2 = 0.994965 */
9302		 -254,		/* B2 = -0.007762 */
9303		 0,		/* B1 = 0.000000 */
9304		 254,		/* B0 = 0.007762 */
9305		 30793,		/* A1 = -1.879456 */
9306		 -32692,	/* A2 = 0.997711 */
9307		 18934,		/* B2 = 0.577820 */
9308		 -17751,	/* B1 = -1.083496 */
9309		 18934,		/* B0 = 0.577820 */
9310		 30882,		/* A1 = -1.884888 */
9311		 -32694,	/* A2 = 0.997772 */
9312		 1858,		/* B2 = 0.056713 */
9313		 -1758,		/* B1 = -0.107357 */
9314		 1858,		/* B0 = 0.056713 */
9315		 5,		/* Internal filter scaling */
9316		 159,		/* Minimum in-band energy threshold */
9317		 21,		/* 21/32 in-band to broad-band ratio */
9318		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9319	},
9320	{			/* f440_450[] */
9321		30641,		/* A1 = 1.870239 */
9322		 -32458,	/* A2 = -0.99057 */
9323		 -155,		/* B2 = -0.004735 */
9324		 0,		/* B1 = 0 */
9325		 155,		/* B0 = 0.004735 */
9326		 30631,		/* A1 = 1.869568 */
9327		 -32630,	/* A2 = -0.995789 */
9328		 11453,		/* B2 = 0.349548 */
9329		 -10666,	/* B1 = -0.651001 */
9330		 11453,		/* B0 = 0.349548 */
9331		 30810,		/* A1 = 1.880554 */
9332		 -32634,	/* A2 = -0.995941 */
9333		 12237,		/* B2 = 0.373474 */
9334		 -11588,	/* B1 = -0.707336 */
9335		 12237,		/* B0 = 0.373474 */
9336		 7,		/* Internal filter scaling */
9337		 159,		/* Minimum in-band energy threshold */
9338		 21,		/* 21/32 in-band to broad-band ratio */
9339		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9340	},
9341	{			/* f440_480[] */
9342		30367,		/* A1 = 1.853455 */
9343		 -32147,	/* A2 = -0.981079 */
9344		 -495,		/* B2 = -0.015113 */
9345		 0,		/* B1 = 0 */
9346		 495,		/* B0 = 0.015113 */
9347		 30322,		/* A1 = 1.850769 */
9348		 -32543,	/* A2 = -0.993134 */
9349		 10031,		/* B2 = 0.306152 */
9350		 -9252,		/* B1 = -0.564728 */
9351		 10031,		/* B0 = 0.306152 */
9352		 30770,		/* A1 = 1.878052 */
9353		 -32563,	/* A2 = -0.993774 */
9354		 22674,		/* B2 = 0.691956 */
9355		 -21465,	/* B1 = -1.31012 */
9356		 22674,		/* B0 = 0.691956 */
9357		 7,		/* Internal filter scaling */
9358		 159,		/* Minimum in-band energy threshold */
9359		 21,		/* 21/32 in-band to broad-band ratio */
9360		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9361	},
9362	{			/* f445 */
9363		30709,		/* A1 = -1.874329 */
9364		 -32603,	/* A2 = 0.994965 */
9365		 -83,		/* B2 = -0.002545 */
9366		 0,		/* B1 = 0.000000 */
9367		 83,		/* B0 = 0.002545 */
9368		 30704,		/* A1 = -1.874084 */
9369		 -32692,	/* A2 = 0.997711 */
9370		 10641,		/* B2 = 0.324738 */
9371		 -9947,		/* B1 = -0.607147 */
9372		 10641,		/* B0 = 0.324738 */
9373		 30796,		/* A1 = -1.879639 */
9374		 -32694,	/* A2 = 0.997772 */
9375		 10079,		/* B2 = 0.307587 */
9376		 9513,		/* B1 = 0.580688 */
9377		 10079,		/* B0 = 0.307587 */
9378		 5,		/* Internal filter scaling */
9379		 159,		/* Minimum in-band energy threshold */
9380		 21,		/* 21/32 in-band to broad-band ratio */
9381		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9382	},
9383	{			/* f450 */
9384		30664,		/* A1 = -1.871643 */
9385		 -32603,	/* A2 = 0.994965 */
9386		 -164,		/* B2 = -0.005029 */
9387		 0,		/* B1 = 0.000000 */
9388		 164,		/* B0 = 0.005029 */
9389		 30661,		/* A1 = -1.871399 */
9390		 -32692,	/* A2 = 0.997711 */
9391		 15294,		/* B2 = 0.466736 */
9392		 -14275,	/* B1 = -0.871307 */
9393		 15294,		/* B0 = 0.466736 */
9394		 30751,		/* A1 = -1.876953 */
9395		 -32694,	/* A2 = 0.997772 */
9396		 3548,		/* B2 = 0.108284 */
9397		 -3344,		/* B1 = -0.204155 */
9398		 3548,		/* B0 = 0.108284 */
9399		 5,		/* Internal filter scaling */
9400		 159,		/* Minimum in-band energy threshold */
9401		 21,		/* 21/32 in-band to broad-band ratio */
9402		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9403	},
9404	{			/* f452 */
9405		30653,		/* A1 = -1.870911 */
9406		 -32615,	/* A2 = 0.995361 */
9407		 -209,		/* B2 = -0.006382 */
9408		 0,		/* B1 = 0.000000 */
9409		 209,		/* B0 = 0.006382 */
9410		 30647,		/* A1 = -1.870605 */
9411		 -32702,	/* A2 = 0.997986 */
9412		 18971,		/* B2 = 0.578979 */
9413		 -17716,	/* B1 = -1.081299 */
9414		 18971,		/* B0 = 0.578979 */
9415		 30738,		/* A1 = -1.876099 */
9416		 -32702,	/* A2 = 0.998016 */
9417		 2967,		/* B2 = 0.090561 */
9418		 -2793,		/* B1 = -0.170502 */
9419		 2967,		/* B0 = 0.090561 */
9420		 5,		/* Internal filter scaling */
9421		 159,		/* Minimum in-band energy threshold */
9422		 21,		/* 21/32 in-band to broad-band ratio */
9423		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9424	},
9425	{			/* f475 */
9426		30437,		/* A1 = -1.857727 */
9427		 -32603,	/* A2 = 0.994965 */
9428		 -264,		/* B2 = -0.008062 */
9429		 0,		/* B1 = 0.000000 */
9430		 264,		/* B0 = 0.008062 */
9431		 30430,		/* A1 = -1.857300 */
9432		 -32692,	/* A2 = 0.997711 */
9433		 21681,		/* B2 = 0.661682 */
9434		 -20082,	/* B1 = -1.225708 */
9435		 21681,		/* B0 = 0.661682 */
9436		 30526,		/* A1 = -1.863220 */
9437		 -32694,	/* A2 = 0.997742 */
9438		 1559,		/* B2 = 0.047600 */
9439		 -1459,		/* B1 = -0.089096 */
9440		 1559,		/* B0 = 0.047600 */
9441		 5,		/* Internal filter scaling */
9442		 159,		/* Minimum in-band energy threshold */
9443		 21,		/* 21/32 in-band to broad-band ratio */
9444		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9445	},
9446	{			/* f480_620[] */
9447		28975,		/* A1 = 1.768494 */
9448		 -30955,	/* A2 = -0.944672 */
9449		 -1026,		/* B2 = -0.03133 */
9450		 0,		/* B1 = 0 */
9451		 1026,		/* B0 = 0.03133 */
9452		 28613,		/* A1 = 1.746399 */
9453		 -32089,	/* A2 = -0.979309 */
9454		 14214,		/* B2 = 0.433807 */
9455		 -12202,	/* B1 = -0.744812 */
9456		 14214,		/* B0 = 0.433807 */
9457		 30243,		/* A1 = 1.845947 */
9458		 -32238,	/* A2 = -0.983856 */
9459		 24825,		/* B2 = 0.757629 */
9460		 -23402,	/* B1 = -1.428345 */
9461		 24825,		/* B0 = 0.757629 */
9462		 7,		/* Internal filter scaling */
9463		 159,		/* Minimum in-band energy threshold */
9464		 21,		/* 21/32 in-band to broad-band ratio */
9465		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9466	},
9467	{			/* f494 */
9468		30257,		/* A1 = -1.846741 */
9469		 -32605,	/* A2 = 0.995056 */
9470		 -249,		/* B2 = -0.007625 */
9471		 0,		/* B1 = 0.000000 */
9472		 249,		/* B0 = 0.007625 */
9473		 30247,		/* A1 = -1.846191 */
9474		 -32694,	/* A2 = 0.997772 */
9475		 18088,		/* B2 = 0.552002 */
9476		 -16652,	/* B1 = -1.016418 */
9477		 18088,		/* B0 = 0.552002 */
9478		 30348,		/* A1 = -1.852295 */
9479		 -32696,	/* A2 = 0.997803 */
9480		 2099,		/* B2 = 0.064064 */
9481		 -1953,		/* B1 = -0.119202 */
9482		 2099,		/* B0 = 0.064064 */
9483		 5,		/* Internal filter scaling */
9484		 159,		/* Minimum in-band energy threshold */
9485		 21,		/* 21/32 in-band to broad-band ratio */
9486		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9487	},
9488	{			/* f500 */
9489		30202,		/* A1 = -1.843431 */
9490		 -32624,	/* A2 = 0.995622 */
9491		 -413,		/* B2 = -0.012622 */
9492		 0,		/* B1 = 0.000000 */
9493		 413,		/* B0 = 0.012622 */
9494		 30191,		/* A1 = -1.842721 */
9495		 -32714,	/* A2 = 0.998364 */
9496		 25954,		/* B2 = 0.792057 */
9497		 -23890,	/* B1 = -1.458131 */
9498		 25954,		/* B0 = 0.792057 */
9499		 30296,		/* A1 = -1.849172 */
9500		 -32715,	/* A2 = 0.998397 */
9501		 2007,		/* B2 = 0.061264 */
9502		 -1860,		/* B1 = -0.113568 */
9503		 2007,		/* B0 = 0.061264 */
9504		 5,		/* Internal filter scaling */
9505		 159,		/* Minimum in-band energy threshold */
9506		 21,		/* 21/32 in-band to broad-band ratio */
9507		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9508	},
9509	{			/* f520 */
9510		30001,		/* A1 = -1.831116 */
9511		 -32613,	/* A2 = 0.995270 */
9512		 -155,		/* B2 = -0.004750 */
9513		 0,		/* B1 = 0.000000 */
9514		 155,		/* B0 = 0.004750 */
9515		 29985,		/* A1 = -1.830200 */
9516		 -32710,	/* A2 = 0.998260 */
9517		 6584,		/* B2 = 0.200928 */
9518		 -6018,		/* B1 = -0.367355 */
9519		 6584,		/* B0 = 0.200928 */
9520		 30105,		/* A1 = -1.837524 */
9521		 -32712,	/* A2 = 0.998291 */
9522		 23812,		/* B2 = 0.726685 */
9523		 -21936,	/* B1 = -1.338928 */
9524		 23812,		/* B0 = 0.726685 */
9525		 5,		/* Internal filter scaling */
9526		 159,		/* Minimum in-band energy threshold */
9527		 21,		/* 21/32 in-band to broad-band ratio */
9528		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9529	},
9530	{			/* f523 */
9531		29964,		/* A1 = -1.828918 */
9532		 -32601,	/* A2 = 0.994904 */
9533		 -101,		/* B2 = -0.003110 */
9534		 0,		/* B1 = 0.000000 */
9535		 101,		/* B0 = 0.003110 */
9536		 29949,		/* A1 = -1.827942 */
9537		 -32700,	/* A2 = 0.997925 */
9538		 11041,		/* B2 = 0.336975 */
9539		 -10075,	/* B1 = -0.614960 */
9540		 11041,		/* B0 = 0.336975 */
9541		 30070,		/* A1 = -1.835388 */
9542		 -32702,	/* A2 = 0.997986 */
9543		 16762,		/* B2 = 0.511536 */
9544		 -15437,	/* B1 = -0.942230 */
9545		 16762,		/* B0 = 0.511536 */
9546		 5,		/* Internal filter scaling */
9547		 159,		/* Minimum in-band energy threshold */
9548		 21,		/* 21/32 in-band to broad-band ratio */
9549		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9550	},
9551	{			/* f525 */
9552		29936,		/* A1 = -1.827209 */
9553		 -32584,	/* A2 = 0.994415 */
9554		 -91,		/* B2 = -0.002806 */
9555		 0,		/* B1 = 0.000000 */
9556		 91,		/* B0 = 0.002806 */
9557		 29921,		/* A1 = -1.826233 */
9558		 -32688,	/* A2 = 0.997559 */
9559		 11449,		/* B2 = 0.349396 */
9560		 -10426,	/* B1 = -0.636383 */
9561		 11449,		/* B0 = 0.349396 */
9562		 30045,		/* A1 = -1.833862 */
9563		 -32688,	/* A2 = 0.997589 */
9564		 13055,		/* B2 = 0.398407 */
9565		 -12028,	/* B1 = -0.734161 */
9566		 13055,		/* B0 = 0.398407 */
9567		 5,		/* Internal filter scaling */
9568		 159,		/* Minimum in-band energy threshold */
9569		 21,		/* 21/32 in-band to broad-band ratio */
9570		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9571	},
9572	{			/* f540_660[] */
9573		28499,		/* A1 = 1.739441 */
9574		 -31129,	/* A2 = -0.949982 */
9575		 -849,		/* B2 = -0.025922 */
9576		 0,		/* B1 = 0 */
9577		 849,		/* B0 = 0.025922 */
9578		 28128,		/* A1 = 1.716797 */
9579		 -32130,	/* A2 = -0.98056 */
9580		 14556,		/* B2 = 0.444214 */
9581		 -12251,	/* B1 = -0.747772 */
9582		 14556,		/* B0 = 0.444244 */
9583		 29667,		/* A1 = 1.81073 */
9584		 -32244,	/* A2 = -0.984039 */
9585		 23038,		/* B2 = 0.703064 */
9586		 -21358,	/* B1 = -1.303589 */
9587		 23040,		/* B0 = 0.703125 */
9588		 7,		/* Internal filter scaling */
9589		 159,		/* Minimum in-band energy threshold */
9590		 21,		/* 21/32 in-band to broad-band ratio */
9591		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9592	},
9593	{			/* f587 */
9594		29271,		/* A1 = -1.786560 */
9595		 -32599,	/* A2 = 0.994873 */
9596		 -490,		/* B2 = -0.014957 */
9597		 0,		/* B1 = 0.000000 */
9598		 490,		/* B0 = 0.014957 */
9599		 29246,		/* A1 = -1.785095 */
9600		 -32700,	/* A2 = 0.997925 */
9601		 28961,		/* B2 = 0.883850 */
9602		 -25796,	/* B1 = -1.574463 */
9603		 28961,		/* B0 = 0.883850 */
9604		 29383,		/* A1 = -1.793396 */
9605		 -32700,	/* A2 = 0.997955 */
9606		 1299,		/* B2 = 0.039650 */
9607		 -1169,		/* B1 = -0.071396 */
9608		 1299,		/* B0 = 0.039650 */
9609		 5,		/* Internal filter scaling */
9610		 159,		/* Minimum in-band energy threshold */
9611		 21,		/* 21/32 in-band to broad-band ratio */
9612		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9613	},
9614	{			/* f590 */
9615		29230,		/* A1 = -1.784058 */
9616		 -32584,	/* A2 = 0.994415 */
9617		 -418,		/* B2 = -0.012757 */
9618		 0,		/* B1 = 0.000000 */
9619		 418,		/* B0 = 0.012757 */
9620		 29206,		/* A1 = -1.782593 */
9621		 -32688,	/* A2 = 0.997559 */
9622		 36556,		/* B2 = 1.115601 */
9623		 -32478,	/* B1 = -1.982300 */
9624		 36556,		/* B0 = 1.115601 */
9625		 29345,		/* A1 = -1.791077 */
9626		 -32688,	/* A2 = 0.997589 */
9627		 897,		/* B2 = 0.027397 */
9628		 -808,		/* B1 = -0.049334 */
9629		 897,		/* B0 = 0.027397 */
9630		 5,		/* Internal filter scaling */
9631		 159,		/* Minimum in-band energy threshold */
9632		 21,		/* 21/32 in-band to broad-band ratio */
9633		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9634	},
9635	{			/* f600 */
9636		29116,		/* A1 = -1.777100 */
9637		 -32603,	/* A2 = 0.994965 */
9638		 -165,		/* B2 = -0.005039 */
9639		 0,		/* B1 = 0.000000 */
9640		 165,		/* B0 = 0.005039 */
9641		 29089,		/* A1 = -1.775452 */
9642		 -32708,	/* A2 = 0.998199 */
9643		 6963,		/* B2 = 0.212494 */
9644		 -6172,		/* B1 = -0.376770 */
9645		 6963,		/* B0 = 0.212494 */
9646		 29237,		/* A1 = -1.784485 */
9647		 -32710,	/* A2 = 0.998230 */
9648		 24197,		/* B2 = 0.738464 */
9649		 -21657,	/* B1 = -1.321899 */
9650		 24197,		/* B0 = 0.738464 */
9651		 5,		/* Internal filter scaling */
9652		 159,		/* Minimum in-band energy threshold */
9653		 21,		/* 21/32 in-band to broad-band ratio */
9654		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9655	},
9656	{			/* f660 */
9657		28376,		/* A1 = -1.731934 */
9658		 -32567,	/* A2 = 0.993896 */
9659		 -363,		/* B2 = -0.011102 */
9660		 0,		/* B1 = 0.000000 */
9661		 363,		/* B0 = 0.011102 */
9662		 28337,		/* A1 = -1.729614 */
9663		 -32683,	/* A2 = 0.997434 */
9664		 21766,		/* B2 = 0.664246 */
9665		 -18761,	/* B1 = -1.145081 */
9666		 21766,		/* B0 = 0.664246 */
9667		 28513,		/* A1 = -1.740356 */
9668		 -32686,	/* A2 = 0.997498 */
9669		 2509,		/* B2 = 0.076584 */
9670		 -2196,		/* B1 = -0.134041 */
9671		 2509,		/* B0 = 0.076584 */
9672		 5,		/* Internal filter scaling */
9673		 159,		/* Minimum in-band energy threshold */
9674		 21,		/* 21/32 in-band to broad-band ratio */
9675		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9676	},
9677	{			/* f700 */
9678		27844,		/* A1 = -1.699463 */
9679		 -32563,	/* A2 = 0.993744 */
9680		 -366,		/* B2 = -0.011187 */
9681		 0,		/* B1 = 0.000000 */
9682		 366,		/* B0 = 0.011187 */
9683		 27797,		/* A1 = -1.696655 */
9684		 -32686,	/* A2 = 0.997498 */
9685		 22748,		/* B2 = 0.694214 */
9686		 -19235,	/* B1 = -1.174072 */
9687		 22748,		/* B0 = 0.694214 */
9688		 27995,		/* A1 = -1.708740 */
9689		 -32688,	/* A2 = 0.997559 */
9690		 2964,		/* B2 = 0.090477 */
9691		 -2546,		/* B1 = -0.155449 */
9692		 2964,		/* B0 = 0.090477 */
9693		 5,		/* Internal filter scaling */
9694		 159,		/* Minimum in-band energy threshold */
9695		 21,		/* 21/32 in-band to broad-band ratio */
9696		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9697	},
9698	{			/* f740 */
9699		27297,		/* A1 = -1.666077 */
9700		 -32551,	/* A2 = 0.993408 */
9701		 -345,		/* B2 = -0.010540 */
9702		 0,		/* B1 = 0.000000 */
9703		 345,		/* B0 = 0.010540 */
9704		 27240,		/* A1 = -1.662598 */
9705		 -32683,	/* A2 = 0.997406 */
9706		 22560,		/* B2 = 0.688477 */
9707		 -18688,	/* B1 = -1.140625 */
9708		 22560,		/* B0 = 0.688477 */
9709		 27461,		/* A1 = -1.676147 */
9710		 -32684,	/* A2 = 0.997467 */
9711		 3541,		/* B2 = 0.108086 */
9712		 -2985,		/* B1 = -0.182220 */
9713		 3541,		/* B0 = 0.108086 */
9714		 5,		/* Internal filter scaling */
9715		 159,		/* Minimum in-band energy threshold */
9716		 21,		/* 21/32 in-band to broad-band ratio */
9717		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9718	},
9719	{			/* f750 */
9720		27155,		/* A1 = -1.657410 */
9721		 -32551,	/* A2 = 0.993408 */
9722		 -462,		/* B2 = -0.014117 */
9723		 0,		/* B1 = 0.000000 */
9724		 462,		/* B0 = 0.014117 */
9725		 27097,		/* A1 = -1.653870 */
9726		 -32683,	/* A2 = 0.997406 */
9727		 32495,		/* B2 = 0.991699 */
9728		 -26776,	/* B1 = -1.634338 */
9729		 32495,		/* B0 = 0.991699 */
9730		 27321,		/* A1 = -1.667542 */
9731		 -32684,	/* A2 = 0.997467 */
9732		 1835,		/* B2 = 0.056007 */
9733		 -1539,		/* B1 = -0.093948 */
9734		 1835,		/* B0 = 0.056007 */
9735		 5,		/* Internal filter scaling */
9736		 159,		/* Minimum in-band energy threshold */
9737		 21,		/* 21/32 in-band to broad-band ratio */
9738		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9739	},
9740	{			/* f750_1450[] */
9741		19298,		/* A1 = 1.177917 */
9742		 -24471,	/* A2 = -0.746796 */
9743		 -4152,		/* B2 = -0.126709 */
9744		 0,		/* B1 = 0 */
9745		 4152,		/* B0 = 0.126709 */
9746		 12902,		/* A1 = 0.787476 */
9747		 -29091,	/* A2 = -0.887817 */
9748		 12491,		/* B2 = 0.38121 */
9749		 -1794,		/* B1 = -0.109528 */
9750		 12494,		/* B0 = 0.381317 */
9751		 26291,		/* A1 = 1.604736 */
9752		 -30470,	/* A2 = -0.929901 */
9753		 28859,		/* B2 = 0.880737 */
9754		 -26084,	/* B1 = -1.592102 */
9755		 28861,		/* B0 = 0.880798 */
9756		 7,		/* Internal filter scaling */
9757		 159,		/* Minimum in-band energy threshold */
9758		 21,		/* 21/32 in-band to broad-band ratio */
9759		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9760	},
9761	{			/* f770 */
9762		26867,		/* A1 = -1.639832 */
9763		 -32551,	/* A2 = 0.993408 */
9764		 -123,		/* B2 = -0.003755 */
9765		 0,		/* B1 = 0.000000 */
9766		 123,		/* B0 = 0.003755 */
9767		 26805,		/* A1 = -1.636108 */
9768		 -32683,	/* A2 = 0.997406 */
9769		 17297,		/* B2 = 0.527863 */
9770		 -14096,	/* B1 = -0.860382 */
9771		 17297,		/* B0 = 0.527863 */
9772		 27034,		/* A1 = -1.650085 */
9773		 -32684,	/* A2 = 0.997467 */
9774		 12958,		/* B2 = 0.395477 */
9775		 -10756,	/* B1 = -0.656525 */
9776		 12958,		/* B0 = 0.395477 */
9777		 5,		/* Internal filter scaling */
9778		 159,		/* Minimum in-band energy threshold */
9779		 21,		/* 21/32 in-band to broad-band ratio */
9780		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9781	},
9782	{			/* f800 */
9783		26413,		/* A1 = -1.612122 */
9784		 -32547,	/* A2 = 0.993286 */
9785		 -223,		/* B2 = -0.006825 */
9786		 0,		/* B1 = 0.000000 */
9787		 223,		/* B0 = 0.006825 */
9788		 26342,		/* A1 = -1.607849 */
9789		 -32686,	/* A2 = 0.997498 */
9790		 6391,		/* B2 = 0.195053 */
9791		 -5120,		/* B1 = -0.312531 */
9792		 6391,		/* B0 = 0.195053 */
9793		 26593,		/* A1 = -1.623108 */
9794		 -32688,	/* A2 = 0.997559 */
9795		 23681,		/* B2 = 0.722717 */
9796		 -19328,	/* B1 = -1.179688 */
9797		 23681,		/* B0 = 0.722717 */
9798		 5,		/* Internal filter scaling */
9799		 159,		/* Minimum in-band energy threshold */
9800		 21,		/* 21/32 in-band to broad-band ratio */
9801		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9802	},
9803	{			/* f816 */
9804		26168,		/* A1 = -1.597209 */
9805		 -32528,	/* A2 = 0.992706 */
9806		 -235,		/* B2 = -0.007182 */
9807		 0,		/* B1 = 0.000000 */
9808		 235,		/* B0 = 0.007182 */
9809		 26092,		/* A1 = -1.592590 */
9810		 -32675,	/* A2 = 0.997192 */
9811		 20823,		/* B2 = 0.635498 */
9812		 -16510,	/* B1 = -1.007751 */
9813		 20823,		/* B0 = 0.635498 */
9814		 26363,		/* A1 = -1.609070 */
9815		 -32677,	/* A2 = 0.997253 */
9816		 6739,		/* B2 = 0.205688 */
9817		 -5459,		/* B1 = -0.333206 */
9818		 6739,		/* B0 = 0.205688 */
9819		 5,		/* Internal filter scaling */
9820		 159,		/* Minimum in-band energy threshold */
9821		 21,		/* 21/32 in-band to broad-band ratio */
9822		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9823	},
9824	{			/* f850 */
9825		25641,		/* A1 = -1.565063 */
9826		 -32536,	/* A2 = 0.992950 */
9827		 -121,		/* B2 = -0.003707 */
9828		 0,		/* B1 = 0.000000 */
9829		 121,		/* B0 = 0.003707 */
9830		 25560,		/* A1 = -1.560059 */
9831		 -32684,	/* A2 = 0.997437 */
9832		 18341,		/* B2 = 0.559753 */
9833		 -14252,	/* B1 = -0.869904 */
9834		 18341,		/* B0 = 0.559753 */
9835		 25837,		/* A1 = -1.577026 */
9836		 -32684,	/* A2 = 0.997467 */
9837		 16679,		/* B2 = 0.509003 */
9838		 -13232,	/* B1 = -0.807648 */
9839		 16679,		/* B0 = 0.509003 */
9840		 5,		/* Internal filter scaling */
9841		 159,		/* Minimum in-band energy threshold */
9842		 21,		/* 21/32 in-band to broad-band ratio */
9843		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9844	},
9845	{			/* f857_1645[] */
9846		16415,		/* A1 = 1.001953 */
9847		 -23669,	/* A2 = -0.722321 */
9848		 -4549,		/* B2 = -0.138847 */
9849		 0,		/* B1 = 0 */
9850		 4549,		/* B0 = 0.138847 */
9851		 8456,		/* A1 = 0.516174 */
9852		 -28996,	/* A2 = -0.884918 */
9853		 13753,		/* B2 = 0.419724 */
9854		 -12,		/* B1 = -0.000763 */
9855		 13757,		/* B0 = 0.419846 */
9856		 24632,		/* A1 = 1.503418 */
9857		 -30271,	/* A2 = -0.923828 */
9858		 29070,		/* B2 = 0.887146 */
9859		 -25265,	/* B1 = -1.542114 */
9860		 29073,		/* B0 = 0.887268 */
9861		 7,		/* Internal filter scaling */
9862		 159,		/* Minimum in-band energy threshold */
9863		 21,		/* 21/32 in-band to broad-band ratio */
9864		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9865	},
9866	{			/* f900 */
9867		24806,		/* A1 = -1.514099 */
9868		 -32501,	/* A2 = 0.991852 */
9869		 -326,		/* B2 = -0.009969 */
9870		 0,		/* B1 = 0.000000 */
9871		 326,		/* B0 = 0.009969 */
9872		 24709,		/* A1 = -1.508118 */
9873		 -32659,	/* A2 = 0.996674 */
9874		 20277,		/* B2 = 0.618835 */
9875		 -15182,	/* B1 = -0.926636 */
9876		 20277,		/* B0 = 0.618835 */
9877		 25022,		/* A1 = -1.527222 */
9878		 -32661,	/* A2 = 0.996735 */
9879		 4320,		/* B2 = 0.131836 */
9880		 -3331,		/* B1 = -0.203339 */
9881		 4320,		/* B0 = 0.131836 */
9882		 5,		/* Internal filter scaling */
9883		 159,		/* Minimum in-band energy threshold */
9884		 21,		/* 21/32 in-band to broad-band ratio */
9885		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9886	},
9887	{			/* f900_1300[] */
9888		19776,		/* A1 = 1.207092 */
9889		 -27437,	/* A2 = -0.837341 */
9890		 -2666,		/* B2 = -0.081371 */
9891		 0,		/* B1 = 0 */
9892		 2666,		/* B0 = 0.081371 */
9893		 16302,		/* A1 = 0.995026 */
9894		 -30354,	/* A2 = -0.926361 */
9895		 10389,		/* B2 = 0.317062 */
9896		 -3327,		/* B1 = -0.203064 */
9897		 10389,		/* B0 = 0.317062 */
9898		 24299,		/* A1 = 1.483154 */
9899		 -30930,	/* A2 = -0.943909 */
9900		 25016,		/* B2 = 0.763428 */
9901		 -21171,	/* B1 = -1.292236 */
9902		 25016,		/* B0 = 0.763428 */
9903		 7,		/* Internal filter scaling */
9904		 159,		/* Minimum in-band energy threshold */
9905		 21,		/* 21/32 in-band to broad-band ratio */
9906		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9907	},
9908	{			/* f935_1215[] */
9909		20554,		/* A1 = 1.254517 */
9910		 -28764,	/* A2 = -0.877838 */
9911		 -2048,		/* B2 = -0.062515 */
9912		 0,		/* B1 = 0 */
9913		 2048,		/* B0 = 0.062515 */
9914		 18209,		/* A1 = 1.11145 */
9915		 -30951,	/* A2 = -0.94458 */
9916		 9390,		/* B2 = 0.286575 */
9917		 -3955,		/* B1 = -0.241455 */
9918		 9390,		/* B0 = 0.286575 */
9919		 23902,		/* A1 = 1.458923 */
9920		 -31286,	/* A2 = -0.954803 */
9921		 23252,		/* B2 = 0.709595 */
9922		 -19132,	/* B1 = -1.167725 */
9923		 23252,		/* B0 = 0.709595 */
9924		 7,		/* Internal filter scaling */
9925		 159,		/* Minimum in-band energy threshold */
9926		 21,		/* 21/32 in-band to broad-band ratio */
9927		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9928	},
9929	{			/* f941_1477[] */
9930		17543,		/* A1 = 1.07074 */
9931		 -26220,	/* A2 = -0.800201 */
9932		 -3298,		/* B2 = -0.100647 */
9933		 0,		/* B1 = 0 */
9934		 3298,		/* B0 = 0.100647 */
9935		 12423,		/* A1 = 0.75827 */
9936		 -30036,	/* A2 = -0.916626 */
9937		 12651,		/* B2 = 0.386078 */
9938		 -2444,		/* B1 = -0.14917 */
9939		 12653,		/* B0 = 0.386154 */
9940		 23518,		/* A1 = 1.435425 */
9941		 -30745,	/* A2 = -0.938293 */
9942		 27282,		/* B2 = 0.832581 */
9943		 -22529,	/* B1 = -1.375122 */
9944		 27286,		/* B0 = 0.832703 */
9945		 7,		/* Internal filter scaling */
9946		 159,		/* Minimum in-band energy threshold */
9947		 21,		/* 21/32 in-band to broad-band ratio */
9948		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9949	},
9950	{			/* f942 */
9951		24104,		/* A1 = -1.471252 */
9952		 -32507,	/* A2 = 0.992065 */
9953		 -351,		/* B2 = -0.010722 */
9954		 0,		/* B1 = 0.000000 */
9955		 351,		/* B0 = 0.010722 */
9956		 23996,		/* A1 = -1.464600 */
9957		 -32671,	/* A2 = 0.997040 */
9958		 22848,		/* B2 = 0.697266 */
9959		 -16639,	/* B1 = -1.015564 */
9960		 22848,		/* B0 = 0.697266 */
9961		 24332,		/* A1 = -1.485168 */
9962		 -32673,	/* A2 = 0.997101 */
9963		 4906,		/* B2 = 0.149727 */
9964		 -3672,		/* B1 = -0.224174 */
9965		 4906,		/* B0 = 0.149727 */
9966		 5,		/* Internal filter scaling */
9967		 159,		/* Minimum in-band energy threshold */
9968		 21,		/* 21/32 in-band to broad-band ratio */
9969		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9970	},
9971	{			/* f950 */
9972		23967,		/* A1 = -1.462830 */
9973		 -32507,	/* A2 = 0.992065 */
9974		 -518,		/* B2 = -0.015821 */
9975		 0,		/* B1 = 0.000000 */
9976		 518,		/* B0 = 0.015821 */
9977		 23856,		/* A1 = -1.456055 */
9978		 -32671,	/* A2 = 0.997040 */
9979		 26287,		/* B2 = 0.802246 */
9980		 -19031,	/* B1 = -1.161560 */
9981		 26287,		/* B0 = 0.802246 */
9982		 24195,		/* A1 = -1.476746 */
9983		 -32673,	/* A2 = 0.997101 */
9984		 2890,		/* B2 = 0.088196 */
9985		 -2151,		/* B1 = -0.131317 */
9986		 2890,		/* B0 = 0.088196 */
9987		 5,		/* Internal filter scaling */
9988		 159,		/* Minimum in-band energy threshold */
9989		 21,		/* 21/32 in-band to broad-band ratio */
9990		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9991	},
9992	{			/* f950_1400[] */
9993		18294,		/* A1 = 1.116638 */
9994		 -26962,	/* A2 = -0.822845 */
9995		 -2914,		/* B2 = -0.088936 */
9996		 0,		/* B1 = 0 */
9997		 2914,		/* B0 = 0.088936 */
9998		 14119,		/* A1 = 0.861786 */
9999		 -30227,	/* A2 = -0.922455 */
10000		 11466,		/* B2 = 0.349945 */
10001		 -2833,		/* B1 = -0.172943 */
10002		 11466,		/* B0 = 0.349945 */
10003		 23431,		/* A1 = 1.430115 */
10004		 -30828,	/* A2 = -0.940796 */
10005		 25331,		/* B2 = 0.773071 */
10006		 -20911,	/* B1 = -1.276367 */
10007		 25331,		/* B0 = 0.773071 */
10008		 7,		/* Internal filter scaling */
10009		 159,		/* Minimum in-band energy threshold */
10010		 21,		/* 21/32 in-band to broad-band ratio */
10011		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10012	},
10013	{			/* f975 */
10014		23521,		/* A1 = -1.435608 */
10015		 -32489,	/* A2 = 0.991516 */
10016		 -193,		/* B2 = -0.005915 */
10017		 0,		/* B1 = 0.000000 */
10018		 193,		/* B0 = 0.005915 */
10019		 23404,		/* A1 = -1.428467 */
10020		 -32655,	/* A2 = 0.996582 */
10021		 17740,		/* B2 = 0.541412 */
10022		 -12567,	/* B1 = -0.767029 */
10023		 17740,		/* B0 = 0.541412 */
10024		 23753,		/* A1 = -1.449829 */
10025		 -32657,	/* A2 = 0.996613 */
10026		 9090,		/* B2 = 0.277405 */
10027		 -6662,		/* B1 = -0.406647 */
10028		 9090,		/* B0 = 0.277405 */
10029		 5,		/* Internal filter scaling */
10030		 159,		/* Minimum in-band energy threshold */
10031		 21,		/* 21/32 in-band to broad-band ratio */
10032		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10033	},
10034	{			/* f1000 */
10035		23071,		/* A1 = -1.408203 */
10036		 -32489,	/* A2 = 0.991516 */
10037		 -293,		/* B2 = -0.008965 */
10038		 0,		/* B1 = 0.000000 */
10039		 293,		/* B0 = 0.008965 */
10040		 22951,		/* A1 = -1.400818 */
10041		 -32655,	/* A2 = 0.996582 */
10042		 5689,		/* B2 = 0.173645 */
10043		 -3951,		/* B1 = -0.241150 */
10044		 5689,		/* B0 = 0.173645 */
10045		 23307,		/* A1 = -1.422607 */
10046		 -32657,	/* A2 = 0.996613 */
10047		 18692,		/* B2 = 0.570435 */
10048		 -13447,	/* B1 = -0.820770 */
10049		 18692,		/* B0 = 0.570435 */
10050		 5,		/* Internal filter scaling */
10051		 159,		/* Minimum in-band energy threshold */
10052		 21,		/* 21/32 in-band to broad-band ratio */
10053		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10054	},
10055	{			/* f1020 */
10056		22701,		/* A1 = -1.385620 */
10057		 -32474,	/* A2 = 0.991058 */
10058		 -292,		/* B2 = -0.008933 */
10059		 0,		/*163840      , B1 = 10.000000 */
10060		 292,		/* B0 = 0.008933 */
10061		 22564,		/* A1 = -1.377258 */
10062		 -32655,	/* A2 = 0.996552 */
10063		 20756,		/* B2 = 0.633423 */
10064		 -14176,	/* B1 = -0.865295 */
10065		 20756,		/* B0 = 0.633423 */
10066		 22960,		/* A1 = -1.401428 */
10067		 -32657,	/* A2 = 0.996613 */
10068		 6520,		/* B2 = 0.198990 */
10069		 -4619,		/* B1 = -0.281937 */
10070		 6520,		/* B0 = 0.198990 */
10071		 5,		/* Internal filter scaling */
10072		 159,		/* Minimum in-band energy threshold */
10073		 21,		/* 21/32 in-band to broad-band ratio */
10074		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10075	},
10076	{			/* f1050 */
10077		22142,		/* A1 = -1.351501 */
10078		 -32474,	/* A2 = 0.991058 */
10079		 -147,		/* B2 = -0.004493 */
10080		 0,		/* B1 = 0.000000 */
10081		 147,		/* B0 = 0.004493 */
10082		 22000,		/* A1 = -1.342834 */
10083		 -32655,	/* A2 = 0.996552 */
10084		 15379,		/* B2 = 0.469360 */
10085		 -10237,	/* B1 = -0.624847 */
10086		 15379,		/* B0 = 0.469360 */
10087		 22406,		/* A1 = -1.367554 */
10088		 -32657,	/* A2 = 0.996613 */
10089		 17491,		/* B2 = 0.533783 */
10090		 -12096,	/* B1 = -0.738312 */
10091		 17491,		/* B0 = 0.533783 */
10092		 5,		/* Internal filter scaling */
10093		 159,		/* Minimum in-band energy threshold */
10094		 21,		/* 21/32 in-band to broad-band ratio */
10095		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10096	},
10097	{			/* f1100_1750[] */
10098		12973,		/* A1 = 0.79184 */
10099		 -24916,	/* A2 = -0.760376 */
10100		 6655,		/* B2 = 0.203102 */
10101		 367,		/* B1 = 0.0224 */
10102		 6657,		/* B0 = 0.203171 */
10103		 5915,		/* A1 = 0.361053 */
10104		 -29560,	/* A2 = -0.90213 */
10105		 -7777,		/* B2 = -0.23735 */
10106		 0,		/* B1 = 0 */
10107		 7777,		/* B0 = 0.23735 */
10108		 20510,		/* A1 = 1.251892 */
10109		 -30260,	/* A2 = -0.923462 */
10110		 26662,		/* B2 = 0.81366 */
10111		 -20573,	/* B1 = -1.255737 */
10112		 26668,		/* B0 = 0.813843 */
10113		 7,		/* Internal filter scaling */
10114		 159,		/* Minimum in-band energy threshold */
10115		 21,		/* 21/32 in-band to broad-band ratio */
10116		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10117	},
10118	{			/* f1140 */
10119		20392,		/* A1 = -1.244629 */
10120		 -32460,	/* A2 = 0.990601 */
10121		 -270,		/* B2 = -0.008240 */
10122		 0,		/* B1 = 0.000000 */
10123		 270,		/* B0 = 0.008240 */
10124		 20218,		/* A1 = -1.234009 */
10125		 -32655,	/* A2 = 0.996582 */
10126		 21337,		/* B2 = 0.651154 */
10127		 -13044,	/* B1 = -0.796143 */
10128		 21337,		/* B0 = 0.651154 */
10129		 20684,		/* A1 = -1.262512 */
10130		 -32657,	/* A2 = 0.996643 */
10131		 8572,		/* B2 = 0.261612 */
10132		 -5476,		/* B1 = -0.334244 */
10133		 8572,		/* B0 = 0.261612 */
10134		 5,		/* Internal filter scaling */
10135		 159,		/* Minimum in-band energy threshold */
10136		 21,		/* 21/32 in-band to broad-band ratio */
10137		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10138	},
10139	{			/* f1200 */
10140		19159,		/* A1 = -1.169373 */
10141		 -32456,	/* A2 = 0.990509 */
10142		 -335,		/* B2 = -0.010252 */
10143		 0,		/* B1 = 0.000000 */
10144		 335,		/* B0 = 0.010252 */
10145		 18966,		/* A1 = -1.157593 */
10146		 -32661,	/* A2 = 0.996735 */
10147		 6802,		/* B2 = 0.207588 */
10148		 -3900,		/* B1 = -0.238098 */
10149		 6802,		/* B0 = 0.207588 */
10150		 19467,		/* A1 = -1.188232 */
10151		 -32661,	/* A2 = 0.996765 */
10152		 25035,		/* B2 = 0.764008 */
10153		 -15049,	/* B1 = -0.918579 */
10154		 25035,		/* B0 = 0.764008 */
10155		 5,		/* Internal filter scaling */
10156		 159,		/* Minimum in-band energy threshold */
10157		 21,		/* 21/32 in-band to broad-band ratio */
10158		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10159	},
10160	{			/* f1209 */
10161		18976,		/* A1 = -1.158264 */
10162		 -32439,	/* A2 = 0.989990 */
10163		 -183,		/* B2 = -0.005588 */
10164		 0,		/* B1 = 0.000000 */
10165		 183,		/* B0 = 0.005588 */
10166		 18774,		/* A1 = -1.145874 */
10167		 -32650,	/* A2 = 0.996429 */
10168		 15468,		/* B2 = 0.472076 */
10169		 -8768,		/* B1 = -0.535217 */
10170		 15468,		/* B0 = 0.472076 */
10171		 19300,		/* A1 = -1.177979 */
10172		 -32652,	/* A2 = 0.996490 */
10173		 19840,		/* B2 = 0.605499 */
10174		 -11842,	/* B1 = -0.722809 */
10175		 19840,		/* B0 = 0.605499 */
10176		 5,		/* Internal filter scaling */
10177		 159,		/* Minimum in-band energy threshold */
10178		 21,		/* 21/32 in-band to broad-band ratio */
10179		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10180	},
10181	{			/* f1330 */
10182		16357,		/* A1 = -0.998413 */
10183		 -32368,	/* A2 = 0.987793 */
10184		 -217,		/* B2 = -0.006652 */
10185		 0,		/* B1 = 0.000000 */
10186		 217,		/* B0 = 0.006652 */
10187		 16107,		/* A1 = -0.983126 */
10188		 -32601,	/* A2 = 0.994904 */
10189		 11602,		/* B2 = 0.354065 */
10190		 -5555,		/* B1 = -0.339111 */
10191		 11602,		/* B0 = 0.354065 */
10192		 16722,		/* A1 = -1.020630 */
10193		 -32603,	/* A2 = 0.994965 */
10194		 15574,		/* B2 = 0.475311 */
10195		 -8176,		/* B1 = -0.499069 */
10196		 15574,		/* B0 = 0.475311 */
10197		 5,		/* Internal filter scaling */
10198		 159,		/* Minimum in-band energy threshold */
10199		 21,		/* 21/32 in-band to broad-band ratio */
10200		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10201	},
10202	{			/* f1336 */
10203		16234,		/* A1 = -0.990875 */
10204		 32404,		/* A2 = -0.988922 */
10205		 -193,		/* B2 = -0.005908 */
10206		 0,		/* B1 = 0.000000 */
10207		 193,		/* B0 = 0.005908 */
10208		 15986,		/* A1 = -0.975769 */
10209		 -32632,	/* A2 = 0.995880 */
10210		 18051,		/* B2 = 0.550903 */
10211		 -8658,		/* B1 = -0.528473 */
10212		 18051,		/* B0 = 0.550903 */
10213		 16591,		/* A1 = -1.012695 */
10214		 -32634,	/* A2 = 0.995941 */
10215		 15736,		/* B2 = 0.480240 */
10216		 -8125,		/* B1 = -0.495926 */
10217		 15736,		/* B0 = 0.480240 */
10218		 5,		/* Internal filter scaling */
10219		 159,		/* Minimum in-band energy threshold */
10220		 21,		/* 21/32 in-band to broad-band ratio */
10221		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10222	},
10223	{			/* f1366 */
10224		15564,		/* A1 = -0.949982 */
10225		 -32404,	/* A2 = 0.988922 */
10226		 -269,		/* B2 = -0.008216 */
10227		 0,		/* B1 = 0.000000 */
10228		 269,		/* B0 = 0.008216 */
10229		 15310,		/* A1 = -0.934479 */
10230		 -32632,	/* A2 = 0.995880 */
10231		 10815,		/* B2 = 0.330063 */
10232		 -4962,		/* B1 = -0.302887 */
10233		 10815,		/* B0 = 0.330063 */
10234		 15924,		/* A1 = -0.971924 */
10235		 -32634,	/* A2 = 0.995941 */
10236		 18880,		/* B2 = 0.576172 */
10237		 -9364,		/* B1 = -0.571594 */
10238		 18880,		/* B0 = 0.576172 */
10239		 5,		/* Internal filter scaling */
10240		 159,		/* Minimum in-band energy threshold */
10241		 21,		/* 21/32 in-band to broad-band ratio */
10242		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10243	},
10244	{			/* f1380 */
10245		15247,		/* A1 = -0.930603 */
10246		 -32397,	/* A2 = 0.988708 */
10247		 -244,		/* B2 = -0.007451 */
10248		 0,		/* B1 = 0.000000 */
10249		 244,		/* B0 = 0.007451 */
10250		 14989,		/* A1 = -0.914886 */
10251		 -32627,	/* A2 = 0.995697 */
10252		 18961,		/* B2 = 0.578644 */
10253		 -8498,		/* B1 = -0.518707 */
10254		 18961,		/* B0 = 0.578644 */
10255		 15608,		/* A1 = -0.952667 */
10256		 -32628,	/* A2 = 0.995758 */
10257		 11145,		/* B2 = 0.340134 */
10258		 -5430,		/* B1 = -0.331467 */
10259		 11145,		/* B0 = 0.340134 */
10260		 5,		/* Internal filter scaling */
10261		 159,		/* Minimum in-band energy threshold */
10262		 21,		/* 21/32 in-band to broad-band ratio */
10263		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10264	},
10265	{			/* f1400 */
10266		14780,		/* A1 = -0.902130 */
10267		 -32393,	/* A2 = 0.988586 */
10268		 -396,		/* B2 = -0.012086 */
10269		 0,		/* B1 = 0.000000 */
10270		 396,		/* B0 = 0.012086 */
10271		 14510,		/* A1 = -0.885651 */
10272		 -32630,	/* A2 = 0.995819 */
10273		 6326,		/* B2 = 0.193069 */
10274		 -2747,		/* B1 = -0.167671 */
10275		 6326,		/* B0 = 0.193069 */
10276		 15154,		/* A1 = -0.924957 */
10277		 -32632,	/* A2 = 0.995850 */
10278		 23235,		/* B2 = 0.709076 */
10279		 -10983,	/* B1 = -0.670380 */
10280		 23235,		/* B0 = 0.709076 */
10281		 5,		/* Internal filter scaling */
10282		 159,		/* Minimum in-band energy threshold */
10283		 21,		/* 21/32 in-band to broad-band ratio */
10284		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10285	},
10286	{			/* f1477 */
10287		13005,		/* A1 = -0.793793 */
10288		 -32368,	/* A2 = 0.987823 */
10289		 -500,		/* B2 = -0.015265 */
10290		 0,		/* B1 = 0.000000 */
10291		 500,		/* B0 = 0.015265 */
10292		 12708,		/* A1 = -0.775665 */
10293		 -32615,	/* A2 = 0.995331 */
10294		 11420,		/* B2 = 0.348526 */
10295		 -4306,		/* B1 = -0.262833 */
10296		 11420,		/* B0 = 0.348526 */
10297		 13397,		/* A1 = -0.817688 */
10298		 -32615,	/* A2 = 0.995361 */
10299		 9454,		/* B2 = 0.288528 */
10300		 -3981,		/* B1 = -0.243027 */
10301		 9454,		/* B0 = 0.288528 */
10302		 5,		/* Internal filter scaling */
10303		 159,		/* Minimum in-band energy threshold */
10304		 21,		/* 21/32 in-band to broad-band ratio */
10305		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10306	},
10307	{			/* f1600 */
10308		10046,		/* A1 = -0.613190 */
10309		 -32331,	/* A2 = 0.986694 */
10310		 -455,		/* B2 = -0.013915 */
10311		 0,		/* B1 = 0.000000 */
10312		 455,		/* B0 = 0.013915 */
10313		 9694,		/* A1 = -0.591705 */
10314		 -32601,	/* A2 = 0.994934 */
10315		 6023,		/* B2 = 0.183815 */
10316		 -1708,		/* B1 = -0.104279 */
10317		 6023,		/* B0 = 0.183815 */
10318		 10478,		/* A1 = -0.639587 */
10319		 -32603,	/* A2 = 0.994965 */
10320		 22031,		/* B2 = 0.672333 */
10321		 -7342,		/* B1 = -0.448151 */
10322		 22031,		/* B0 = 0.672333 */
10323		 5,		/* Internal filter scaling */
10324		 159,		/* Minimum in-band energy threshold */
10325		 21,		/* 21/32 in-band to broad-band ratio */
10326		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10327	},
10328	{			/* f1633_1638[] */
10329		9181,		/* A1 = 0.560394 */
10330		 -32256,	/* A2 = -0.984375 */
10331		 -556,		/* B2 = -0.016975 */
10332		 0,		/* B1 = 0 */
10333		 556,		/* B0 = 0.016975 */
10334		 8757,		/* A1 = 0.534515 */
10335		 -32574,	/* A2 = -0.99408 */
10336		 8443,		/* B2 = 0.25769 */
10337		 -2135,		/* B1 = -0.130341 */
10338		 8443,		/* B0 = 0.25769 */
10339		 9691,		/* A1 = 0.591522 */
10340		 -32574,	/* A2 = -0.99411 */
10341		 15446,		/* B2 = 0.471375 */
10342		 -4809,		/* B1 = -0.293579 */
10343		 15446,		/* B0 = 0.471375 */
10344		 7,		/* Internal filter scaling */
10345		 159,		/* Minimum in-band energy threshold */
10346		 21,		/* 21/32 in-band to broad-band ratio */
10347		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10348	},
10349	{			/* f1800 */
10350		5076,		/* A1 = -0.309875 */
10351		 -32304,	/* A2 = 0.985840 */
10352		 -508,		/* B2 = -0.015503 */
10353		 0,		/* B1 = 0.000000 */
10354		 508,		/* B0 = 0.015503 */
10355		 4646,		/* A1 = -0.283600 */
10356		 -32605,	/* A2 = 0.995026 */
10357		 6742,		/* B2 = 0.205780 */
10358		 -878,		/* B1 = -0.053635 */
10359		 6742,		/* B0 = 0.205780 */
10360		 5552,		/* A1 = -0.338928 */
10361		 -32605,	/* A2 = 0.995056 */
10362		 23667,		/* B2 = 0.722260 */
10363		 -4297,		/* B1 = -0.262329 */
10364		 23667,		/* B0 = 0.722260 */
10365		 5,		/* Internal filter scaling */
10366		 159,		/* Minimum in-band energy threshold */
10367		 21,		/* 21/32 in-band to broad-band ratio */
10368		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10369	},
10370	{			/* f1860 */
10371		3569,		/* A1 = -0.217865 */
10372		 -32292,	/* A2 = 0.985504 */
10373		 -239,		/* B2 = -0.007322 */
10374		 0,		/* B1 = 0.000000 */
10375		 239,		/* B0 = 0.007322 */
10376		 3117,		/* A1 = -0.190277 */
10377		 -32603,	/* A2 = 0.994965 */
10378		 18658,		/* B2 = 0.569427 */
10379		 -1557,		/* B1 = -0.095032 */
10380		 18658,		/* B0 = 0.569427 */
10381		 4054,		/* A1 = -0.247437 */
10382		 -32603,	/* A2 = 0.994965 */
10383		 18886,		/* B2 = 0.576385 */
10384		 -2566,		/* B1 = -0.156647 */
10385		 18886,		/* B0 = 0.576385 */
10386		 5,		/* Internal filter scaling */
10387		 159,		/* Minimum in-band energy threshold */
10388		 21,		/* 21/32 in-band to broad-band ratio */
10389		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10390	},
10391};
10392static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf)
10393{
10394	unsigned short cmd;
10395	int cnt, max;
10396
10397	if (jf->filter > 3) {
10398		return -1;
10399	}
10400	if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))	/* Select Filter */
10401
10402		return -1;
10403	if (!jf->enable) {
10404		if (ixj_WriteDSPCommand(0x5152, j))		/* Disable Filter */
10405
10406			return -1;
10407		else
10408			return 0;
10409	} else {
10410		if (ixj_WriteDSPCommand(0x5153, j))		/* Enable Filter */
10411
10412			return -1;
10413		/* Select the filter (f0 - f3) to use. */
10414		if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))
10415			return -1;
10416	}
10417	if (jf->freq < 12 && jf->freq > 3) {
10418		/* Select the frequency for the selected filter. */
10419		if (ixj_WriteDSPCommand(0x5170 + jf->freq, j))
10420			return -1;
10421	} else if (jf->freq > 11) {
10422		/* We need to load a programmable filter set for undefined */
10423		/* frequencies.  So we will point the filter to a programmable set. */
10424		/* Since there are only 4 filters and 4 programmable sets, we will */
10425		/* just point the filter to the same number set and program it for the */
10426		/* frequency we want. */
10427		if (ixj_WriteDSPCommand(0x5170 + jf->filter, j))
10428			return -1;
10429		if (j->ver.low != 0x12) {
10430			cmd = 0x515B;
10431			max = 19;
10432		} else {
10433			cmd = 0x515E;
10434			max = 15;
10435		}
10436		if (ixj_WriteDSPCommand(cmd, j))
10437			return -1;
10438		for (cnt = 0; cnt < max; cnt++) {
10439			if (ixj_WriteDSPCommand(tone_table[jf->freq - 12][cnt], j))
10440				return -1;
10441		}
10442	}
10443	j->filter_en[jf->filter] = jf->enable;
10444	return 0;
10445}
10446
10447static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr)
10448{
10449	unsigned short cmd;
10450	int cnt, max;
10451	if (jfr->filter > 3) {
10452		return -1;
10453	}
10454	if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))	/* Select Filter */
10455		return -1;
10456
10457	if (!jfr->enable) {
10458		if (ixj_WriteDSPCommand(0x5152, j))		/* Disable Filter */
10459			return -1;
10460		else
10461			return 0;
10462	} else {
10463		if (ixj_WriteDSPCommand(0x5153, j))		/* Enable Filter */
10464			return -1;
10465		/* Select the filter (f0 - f3) to use. */
10466		if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))
10467			return -1;
10468	}
10469	/* We need to load a programmable filter set for undefined */
10470	/* frequencies.  So we will point the filter to a programmable set. */
10471	/* Since there are only 4 filters and 4 programmable sets, we will */
10472	/* just point the filter to the same number set and program it for the */
10473	/* frequency we want. */
10474	if (ixj_WriteDSPCommand(0x5170 + jfr->filter, j))
10475		return -1;
10476	if (j->ver.low != 0x12) {
10477		cmd = 0x515B;
10478		max = 19;
10479	} else {
10480		cmd = 0x515E;
10481		max = 15;
10482	}
10483	if (ixj_WriteDSPCommand(cmd, j))
10484		return -1;
10485	for (cnt = 0; cnt < max; cnt++) {
10486		if (ixj_WriteDSPCommand(jfr->coeff[cnt], j))
10487			return -1;
10488	}
10489	j->filter_en[jfr->filter] = jfr->enable;
10490	return 0;
10491}
10492
10493static int ixj_init_tone(IXJ *j, IXJ_TONE * ti)
10494{
10495	int freq0, freq1;
10496	unsigned short data;
10497	if (ti->freq0) {
10498		freq0 = ti->freq0;
10499	} else {
10500		freq0 = 0x7FFF;
10501	}
10502
10503	if (ti->freq1) {
10504		freq1 = ti->freq1;
10505	} else {
10506		freq1 = 0x7FFF;
10507	}
10508
10509	if(ti->tone_index > 12 && ti->tone_index < 28)
10510	{
10511		if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, j))
10512			return -1;
10513		if (ixj_WriteDSPCommand(0x6000 + (ti->gain1 << 4) + ti->gain0, j))
10514			return -1;
10515		data = freq0;
10516		if (ixj_WriteDSPCommand(data, j))
10517			return -1;
10518		data = freq1;
10519		if (ixj_WriteDSPCommand(data, j))
10520			return -1;
10521	}
10522	return freq0;
10523}
10524