• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  * Revision 4.8  2003/07/09 19:39:00  Daniele Bellucci
46  * Audit some copy_*_user and minor cleanup.
47  *
48  * Revision 4.7  2001/08/13 06:19:33  craigs
49  * Added additional changes from Alan Cox and John Anderson for
50  * 2.2 to 2.4 cleanup and bounds checking
51  *
52  * Revision 4.6  2001/08/13 01:05:05  craigs
53  * Really fixed PHONE_QUERY_CODEC problem this time
54  *
55  * Revision 4.5  2001/08/13 00:11:03  craigs
56  * Fixed problem in handling of PHONE_QUERY_CODEC, thanks to Shane Anderson
57  *
58  * Revision 4.4  2001/08/07 07:58:12  craigs
59  * Changed back to three digit version numbers
60  * Added tagbuild target to allow automatic and easy tagging of versions
61  *
62  * Revision 4.3  2001/08/07 07:24:47  craigs
63  * Added ixj-ver.h to allow easy configuration management of driver
64  * Added display of version number in /prox/ixj
65  *
66  * Revision 4.2  2001/08/06 07:07:19  craigs
67  * Reverted IXJCTL_DSP_TYPE and IXJCTL_DSP_VERSION files to original
68  * behaviour of returning int rather than short *
69  *
70  * Revision 4.1  2001/08/05 00:17:37  craigs
71  * More changes for correct PCMCIA installation
72  * Start of changes for backward Linux compatibility
73  *
74  * Revision 4.0  2001/08/04 12:33:12  craigs
75  * New version using GNU autoconf
76  *
77  * Revision 3.105  2001/07/20 23:14:32  eokerson
78  * More work on CallerID generation when using ring cadences.
79  *
80  * Revision 3.104  2001/07/06 01:33:55  eokerson
81  * Some bugfixes from Robert Vojta <vojta@ipex.cz> and a few mods to the Makefile.
82  *
83  * Revision 3.103  2001/07/05 19:20:16  eokerson
84  * Updated HOWTO
85  * Changed mic gain to 30dB on Internet LineJACK mic/speaker port.
86  *
87  * Revision 3.102  2001/07/03 23:51:21  eokerson
88  * Un-mute mic on Internet LineJACK when in speakerphone mode.
89  *
90  * Revision 3.101  2001/07/02 19:26:56  eokerson
91  * Removed initialiazation of ixjdebug and ixj_convert_loaded so they will go in the .bss instead of the .data
92  *
93  * Revision 3.100  2001/07/02 19:18:27  eokerson
94  * Changed driver to make dynamic allocation possible.  We now pass IXJ * between functions instead of array indexes.
95  * Fixed the way the POTS and PSTN ports interact during a PSTN call to allow local answering.
96  * Fixed speaker mode on Internet LineJACK.
97  *
98  * Revision 3.99  2001/05/09 14:11:16  eokerson
99  * Fixed kmalloc error in ixj_build_filter_cadence.  Thanks David Chan <cat@waulogy.stanford.edu>.
100  *
101  * Revision 3.98  2001/05/08 19:55:33  eokerson
102  * Fixed POTS hookstate detection while it is connected to PSTN port.
103  *
104  * Revision 3.97  2001/05/08 00:01:04  eokerson
105  * Fixed kernel oops when sending caller ID data.
106  *
107  * Revision 3.96  2001/05/04 23:09:30  eokerson
108  * Now uses one kernel timer for each card, instead of one for the entire driver.
109  *
110  * Revision 3.95  2001/04/25 22:06:47  eokerson
111  * Fixed squawking at beginning of some G.723.1 calls.
112  *
113  * Revision 3.94  2001/04/03 23:42:00  eokerson
114  * Added linear volume ioctls
115  * Added raw filter load ioctl
116  *
117  * Revision 3.93  2001/02/27 01:00:06  eokerson
118  * Fixed blocking in CallerID.
119  * Reduced size of ixj structure for smaller driver footprint.
120  *
121  * Revision 3.92  2001/02/20 22:02:59  eokerson
122  * Fixed isapnp and pcmcia module compatibility for 2.4.x kernels.
123  * Improved PSTN ring detection.
124  * Fixed wink generation on POTS ports.
125  *
126  * Revision 3.91  2001/02/13 00:55:44  eokerson
127  * Turn AEC back on after changing frame sizes.
128  *
129  * Revision 3.90  2001/02/12 16:42:00  eokerson
130  * Added ALAW codec, thanks to Fabio Ferrari for the table based converters to make ALAW from ULAW.
131  *
132  * Revision 3.89  2001/02/12 15:41:16  eokerson
133  * Fix from Artis Kugevics - Tone gains were not being set correctly.
134  *
135  * Revision 3.88  2001/02/05 23:25:42  eokerson
136  * Fixed lockup bugs with deregister.
137  *
138  * Revision 3.87  2001/01/29 21:00:39  eokerson
139  * Fix from Fabio Ferrari <fabio.ferrari@digitro.com.br> to properly handle EAGAIN and EINTR during non-blocking write.
140  * Updated copyright date.
141  *
142  * Revision 3.86  2001/01/23 23:53:46  eokerson
143  * Fixes to G.729 compatibility.
144  *
145  * Revision 3.85  2001/01/23 21:30:36  eokerson
146  * Added verbage about cards supported.
147  * Removed commands that put the card in low power mode at some times that it should not be in low power mode.
148  *
149  * Revision 3.84  2001/01/22 23:32:10  eokerson
150  * Some bugfixes from David Huggins-Daines, <dhd@cepstral.com> and other cleanups.
151  *
152  * Revision 3.83  2001/01/19 14:51:41  eokerson
153  * Fixed ixj_WriteDSPCommand to decrement usage counter when command fails.
154  *
155  * Revision 3.82  2001/01/19 00:34:49  eokerson
156  * Added verbosity to write overlap errors.
157  *
158  * Revision 3.81  2001/01/18 23:56:54  eokerson
159  * Fixed PSTN line test functions.
160  *
161  * Revision 3.80  2001/01/18 22:29:27  eokerson
162  * Updated AEC/AGC values for different cards.
163  *
164  * Revision 3.79  2001/01/17 02:58:54  eokerson
165  * Fixed AEC reset after Caller ID.
166  * Fixed Codec lockup after Caller ID on Call Waiting when not using 30ms frames.
167  *
168  * Revision 3.78  2001/01/16 19:43:09  eokerson
169  * Added support for Linux 2.4.x kernels.
170  *
171  * Revision 3.77  2001/01/09 04:00:52  eokerson
172  * Linetest will now test the line, even if it has previously succeded.
173  *
174  * Revision 3.76  2001/01/08 19:27:00  eokerson
175  * Fixed problem with standard cable on Internet PhoneCARD.
176  *
177  * Revision 3.75  2000/12/22 16:52:14  eokerson
178  * Modified to allow hookstate detection on the POTS port when the PSTN port is selected.
179  *
180  * Revision 3.74  2000/12/08 22:41:50  eokerson
181  * Added capability for G729B.
182  *
183  * Revision 3.73  2000/12/07 23:35:16  eokerson
184  * Added capability to have different ring pattern before CallerID data.
185  * Added hookstate checks in CallerID routines to stop FSK.
186  *
187  * Revision 3.72  2000/12/06 19:31:31  eokerson
188  * Modified signal behavior to only send one signal per event.
189  *
190  * Revision 3.71  2000/12/06 03:23:08  eokerson
191  * Fixed CallerID on Call Waiting.
192  *
193  * Revision 3.70  2000/12/04 21:29:37  eokerson
194  * Added checking to Smart Cable gain functions.
195  *
196  * Revision 3.69  2000/12/04 21:05:20  eokerson
197  * Changed ixjdebug levels.
198  * Added ioctls to change gains in Internet Phone CARD Smart Cable.
199  *
200  * Revision 3.68  2000/12/04 00:17:21  craigs
201  * Changed mixer voice gain to +6dB rather than 0dB
202  *
203  * Revision 3.67  2000/11/30 21:25:51  eokerson
204  * Fixed write signal errors.
205  *
206  * Revision 3.66  2000/11/29 22:42:44  eokerson
207  * Fixed PSTN ring detect problems.
208  *
209  * Revision 3.65  2000/11/29 07:31:55  craigs
210  * Added new 425Hz filter co-efficients
211  * Added card-specific DTMF prescaler initialisation
212  *
213  * Revision 3.64  2000/11/28 14:03:32  craigs
214  * Changed certain mixer initialisations to be 0dB rather than 12dB
215  * Added additional information to /proc/ixj
216  *
217  * Revision 3.63  2000/11/28 11:38:41  craigs
218  * Added display of AEC modes in AUTO and AGC mode
219  *
220  * Revision 3.62  2000/11/28 04:05:44  eokerson
221  * Improved PSTN ring detection routine.
222  *
223  * Revision 3.61  2000/11/27 21:53:12  eokerson
224  * Fixed flash detection.
225  *
226  * Revision 3.60  2000/11/27 15:57:29  eokerson
227  * More work on G.729 load routines.
228  *
229  * Revision 3.59  2000/11/25 21:55:12  eokerson
230  * Fixed errors in G.729 load routine.
231  *
232  * Revision 3.58  2000/11/25 04:08:29  eokerson
233  * Added board locks around G.729 and TS85 load routines.
234  *
235  * Revision 3.57  2000/11/24 05:35:17  craigs
236  * Added ability to retrieve mixer values on LineJACK
237  * Added complete initialisation of all mixer values at startup
238  * Fixed spelling mistake
239  *
240  * Revision 3.56  2000/11/23 02:52:11  robertj
241  * Added cvs change log keyword.
242  * Fixed bug in capabilities list when using G.729 module.
243  *
244  */
245 
246 #include "ixj-ver.h"
247 
248 #define PERFMON_STATS
249 #define IXJDEBUG 0
250 #define MAXRINGS 5
251 
252 #include <linux/module.h>
253 
254 #include <linux/init.h>
255 #include <linux/sched.h>
256 #include <linux/kernel.h>	/* printk() */
257 #include <linux/fs.h>		/* everything... */
258 #include <linux/errno.h>	/* error codes */
259 #include <linux/slab.h>
260 #include <linux/mm.h>
261 #include <linux/ioport.h>
262 #include <linux/interrupt.h>
263 #include <linux/proc_fs.h>
264 #include <linux/poll.h>
265 #include <linux/timer.h>
266 #include <linux/delay.h>
267 #include <linux/pci.h>
268 
269 #include <asm/io.h>
270 #include <asm/uaccess.h>
271 
272 #include <linux/isapnp.h>
273 
274 #include "ixj.h"
275 
276 #define TYPE(inode) (iminor(inode) >> 4)
277 #define NUM(inode) (iminor(inode) & 0xf)
278 
279 static int ixjdebug;
280 static int hertz = HZ;
281 static int samplerate = 100;
282 
283 module_param(ixjdebug, int, 0);
284 
285 static struct pci_device_id ixj_pci_tbl[] __devinitdata = {
286 	{ PCI_VENDOR_ID_QUICKNET, PCI_DEVICE_ID_QUICKNET_XJ,
287 	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
288 	{ }
289 };
290 
291 MODULE_DEVICE_TABLE(pci, ixj_pci_tbl);
292 
293 /************************************************************************
294 *
295 * ixjdebug meanings are now bit mapped instead of level based
296 * Values can be or'ed together to turn on multiple messages
297 *
298 * bit  0 (0x0001) = any failure
299 * bit  1 (0x0002) = general messages
300 * bit  2 (0x0004) = POTS ringing related
301 * bit  3 (0x0008) = PSTN events
302 * bit  4 (0x0010) = PSTN Cadence state details
303 * bit  5 (0x0020) = Tone detection triggers
304 * bit  6 (0x0040) = Tone detection cadence details
305 * bit  7 (0x0080) = ioctl tracking
306 * bit  8 (0x0100) = signal tracking
307 * bit  9 (0x0200) = CallerID generation details
308 *
309 ************************************************************************/
310 
311 #ifdef IXJ_DYN_ALLOC
312 
313 static IXJ *ixj[IXJMAX];
314 #define	get_ixj(b)	ixj[(b)]
315 
316 /*
317  *	Allocate a free IXJ device
318  */
319 
ixj_alloc()320 static IXJ *ixj_alloc()
321 {
322 	for(cnt=0; cnt<IXJMAX; cnt++)
323 	{
324 		if(ixj[cnt] == NULL || !ixj[cnt]->DSPbase)
325 		{
326 			j = kmalloc(sizeof(IXJ), GFP_KERNEL);
327 			if (j == NULL)
328 				return NULL;
329 			ixj[cnt] = j;
330 			return j;
331 		}
332 	}
333 	return NULL;
334 }
335 
ixj_fsk_free(IXJ * j)336 static void ixj_fsk_free(IXJ *j)
337 {
338 	kfree(j->fskdata);
339 	j->fskdata = NULL;
340 }
341 
ixj_fsk_alloc(IXJ * j)342 static void ixj_fsk_alloc(IXJ *j)
343 {
344 	if(!j->fskdata) {
345 		j->fskdata = kmalloc(8000, GFP_KERNEL);
346 		if (!j->fskdata) {
347 			if(ixjdebug & 0x0200) {
348 				printk("IXJ phone%d - allocate failed\n", j->board);
349 			}
350 			return;
351 		} else {
352 			j->fsksize = 8000;
353 			if(ixjdebug & 0x0200) {
354 				printk("IXJ phone%d - allocate succeded\n", j->board);
355 			}
356 		}
357 	}
358 }
359 
360 #else
361 
362 static IXJ ixj[IXJMAX];
363 #define	get_ixj(b)	(&ixj[(b)])
364 
365 /*
366  *	Allocate a free IXJ device
367  */
368 
ixj_alloc(void)369 static IXJ *ixj_alloc(void)
370 {
371 	int cnt;
372 	for(cnt=0; cnt<IXJMAX; cnt++) {
373 		if(!ixj[cnt].DSPbase)
374 			return &ixj[cnt];
375 	}
376 	return NULL;
377 }
378 
ixj_fsk_free(IXJ * j)379 static inline void ixj_fsk_free(IXJ *j) {;}
380 
ixj_fsk_alloc(IXJ * j)381 static inline void ixj_fsk_alloc(IXJ *j)
382 {
383 	j->fsksize = 8000;
384 }
385 
386 #endif
387 
388 #ifdef PERFMON_STATS
389 #define ixj_perfmon(x)	((x)++)
390 #else
391 #define ixj_perfmon(x)	do { } while(0)
392 #endif
393 
394 static int ixj_convert_loaded;
395 
396 static int ixj_WriteDSPCommand(unsigned short, IXJ *j);
397 
398 /************************************************************************
399 *
400 * These are function definitions to allow external modules to register
401 * enhanced functionality call backs.
402 *
403 ************************************************************************/
404 
Stub(IXJ * J,unsigned long arg)405 static int Stub(IXJ * J, unsigned long arg)
406 {
407 	return 0;
408 }
409 
410 static IXJ_REGFUNC ixj_PreRead = &Stub;
411 static IXJ_REGFUNC ixj_PostRead = &Stub;
412 static IXJ_REGFUNC ixj_PreWrite = &Stub;
413 static IXJ_REGFUNC ixj_PostWrite = &Stub;
414 
415 static void ixj_read_frame(IXJ *j);
416 static void ixj_write_frame(IXJ *j);
417 static void ixj_init_timer(IXJ *j);
418 static void ixj_add_timer(IXJ *	j);
419 static void ixj_timeout(unsigned long ptr);
420 static int read_filters(IXJ *j);
421 static int LineMonitor(IXJ *j);
422 static int ixj_fasync(int fd, struct file *, int mode);
423 static int ixj_set_port(IXJ *j, int arg);
424 static int ixj_set_pots(IXJ *j, int arg);
425 static int ixj_hookstate(IXJ *j);
426 static int ixj_record_start(IXJ *j);
427 static void ixj_record_stop(IXJ *j);
428 static void set_rec_volume(IXJ *j, int volume);
429 static int get_rec_volume(IXJ *j);
430 static int set_rec_codec(IXJ *j, int rate);
431 static void ixj_vad(IXJ *j, int arg);
432 static int ixj_play_start(IXJ *j);
433 static void ixj_play_stop(IXJ *j);
434 static int ixj_set_tone_on(unsigned short arg, IXJ *j);
435 static int ixj_set_tone_off(unsigned short, IXJ *j);
436 static int ixj_play_tone(IXJ *j, char tone);
437 static void ixj_aec_start(IXJ *j, int level);
438 static int idle(IXJ *j);
439 static void ixj_ring_on(IXJ *j);
440 static void ixj_ring_off(IXJ *j);
441 static void aec_stop(IXJ *j);
442 static void ixj_ringback(IXJ *j);
443 static void ixj_busytone(IXJ *j);
444 static void ixj_dialtone(IXJ *j);
445 static void ixj_cpt_stop(IXJ *j);
446 static char daa_int_read(IXJ *j);
447 static char daa_CR_read(IXJ *j, int cr);
448 static int daa_set_mode(IXJ *j, int mode);
449 static int ixj_linetest(IXJ *j);
450 static int ixj_daa_write(IXJ *j);
451 static int ixj_daa_cid_read(IXJ *j);
452 static void DAA_Coeff_US(IXJ *j);
453 static void DAA_Coeff_UK(IXJ *j);
454 static void DAA_Coeff_France(IXJ *j);
455 static void DAA_Coeff_Germany(IXJ *j);
456 static void DAA_Coeff_Australia(IXJ *j);
457 static void DAA_Coeff_Japan(IXJ *j);
458 static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf);
459 static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr);
460 static int ixj_init_tone(IXJ *j, IXJ_TONE * ti);
461 static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp);
462 static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp);
463 /* Serial Control Interface funtions */
464 static int SCI_Control(IXJ *j, int control);
465 static int SCI_Prepare(IXJ *j);
466 static int SCI_WaitHighSCI(IXJ *j);
467 static int SCI_WaitLowSCI(IXJ *j);
468 static DWORD PCIEE_GetSerialNumber(WORD wAddress);
469 static int ixj_PCcontrol_wait(IXJ *j);
470 static void ixj_pre_cid(IXJ *j);
471 static void ixj_write_cid(IXJ *j);
472 static void ixj_write_cid_bit(IXJ *j, int bit);
473 static int set_base_frame(IXJ *j, int size);
474 static int set_play_codec(IXJ *j, int rate);
475 static void set_rec_depth(IXJ *j, int depth);
476 static int ixj_mixer(long val, IXJ *j);
477 
478 /************************************************************************
479 CT8020/CT8021 Host Programmers Model
480 Host address	Function					Access
481 DSPbase +
482 0-1		Aux Software Status Register (reserved)		Read Only
483 2-3		Software Status Register			Read Only
484 4-5		Aux Software Control Register (reserved)	Read Write
485 6-7		Software Control Register			Read Write
486 8-9		Hardware Status Register			Read Only
487 A-B		Hardware Control Register			Read Write
488 C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only
489 E-F Host Recieve (Read) Data Buffer Access Port (buffer input)	Read Only
490 ************************************************************************/
491 
ixj_read_HSR(IXJ * j)492 static inline void ixj_read_HSR(IXJ *j)
493 {
494 	j->hsr.bytes.low = inb_p(j->DSPbase + 8);
495 	j->hsr.bytes.high = inb_p(j->DSPbase + 9);
496 }
497 
IsControlReady(IXJ * j)498 static inline int IsControlReady(IXJ *j)
499 {
500 	ixj_read_HSR(j);
501 	return j->hsr.bits.controlrdy ? 1 : 0;
502 }
503 
IsPCControlReady(IXJ * j)504 static inline int IsPCControlReady(IXJ *j)
505 {
506 	j->pccr1.byte = inb_p(j->XILINXbase + 3);
507 	return j->pccr1.bits.crr ? 1 : 0;
508 }
509 
IsStatusReady(IXJ * j)510 static inline int IsStatusReady(IXJ *j)
511 {
512 	ixj_read_HSR(j);
513 	return j->hsr.bits.statusrdy ? 1 : 0;
514 }
515 
IsRxReady(IXJ * j)516 static inline int IsRxReady(IXJ *j)
517 {
518 	ixj_read_HSR(j);
519 	ixj_perfmon(j->rxreadycheck);
520 	return j->hsr.bits.rxrdy ? 1 : 0;
521 }
522 
IsTxReady(IXJ * j)523 static inline int IsTxReady(IXJ *j)
524 {
525 	ixj_read_HSR(j);
526 	ixj_perfmon(j->txreadycheck);
527 	return j->hsr.bits.txrdy ? 1 : 0;
528 }
529 
set_play_volume(IXJ * j,int volume)530 static inline void set_play_volume(IXJ *j, int volume)
531 {
532 	if (ixjdebug & 0x0002)
533 		printk(KERN_INFO "IXJ: /dev/phone%d Setting Play Volume to 0x%4.4x\n", j->board, volume);
534 	ixj_WriteDSPCommand(0xCF02, j);
535 	ixj_WriteDSPCommand(volume, j);
536 }
537 
set_play_volume_linear(IXJ * j,int volume)538 static int set_play_volume_linear(IXJ *j, int volume)
539 {
540 	int newvolume, dspplaymax;
541 
542 	if (ixjdebug & 0x0002)
543 		printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Play Volume to 0x%4.4x\n", j->board, volume);
544 	if(volume > 100 || volume < 0) {
545 		return -1;
546 	}
547 
548 	/* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
549 	switch (j->cardtype) {
550 	case QTI_PHONEJACK:
551 		dspplaymax = 0x380;
552 		break;
553 	case QTI_LINEJACK:
554 		if(j->port == PORT_PSTN) {
555 			dspplaymax = 0x48;
556 		} else {
557 			dspplaymax = 0x100;
558 		}
559 		break;
560 	case QTI_PHONEJACK_LITE:
561 		dspplaymax = 0x380;
562 		break;
563 	case QTI_PHONEJACK_PCI:
564 		dspplaymax = 0x6C;
565 		break;
566 	case QTI_PHONECARD:
567 		dspplaymax = 0x50;
568 		break;
569 	default:
570 		return -1;
571 	}
572 	newvolume = (dspplaymax * volume) / 100;
573 	set_play_volume(j, newvolume);
574 	return 0;
575 }
576 
set_play_depth(IXJ * j,int depth)577 static inline void set_play_depth(IXJ *j, int depth)
578 {
579 	if (depth > 60)
580 		depth = 60;
581 	if (depth < 0)
582 		depth = 0;
583 	ixj_WriteDSPCommand(0x5280 + depth, j);
584 }
585 
get_play_volume(IXJ * j)586 static inline int get_play_volume(IXJ *j)
587 {
588 	ixj_WriteDSPCommand(0xCF00, j);
589 	return j->ssr.high << 8 | j->ssr.low;
590 }
591 
get_play_volume_linear(IXJ * j)592 static int get_play_volume_linear(IXJ *j)
593 {
594 	int volume, newvolume, dspplaymax;
595 
596 	/* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
597 	switch (j->cardtype) {
598 	case QTI_PHONEJACK:
599 		dspplaymax = 0x380;
600 		break;
601 	case QTI_LINEJACK:
602 		if(j->port == PORT_PSTN) {
603 			dspplaymax = 0x48;
604 		} else {
605 			dspplaymax = 0x100;
606 		}
607 		break;
608 	case QTI_PHONEJACK_LITE:
609 		dspplaymax = 0x380;
610 		break;
611 	case QTI_PHONEJACK_PCI:
612 		dspplaymax = 0x6C;
613 		break;
614 	case QTI_PHONECARD:
615 		dspplaymax = 100;
616 		break;
617 	default:
618 		return -1;
619 	}
620 	volume = get_play_volume(j);
621 	newvolume = (volume * 100) / dspplaymax;
622 	if(newvolume > 100)
623 		newvolume = 100;
624 	return newvolume;
625 }
626 
SLIC_GetState(IXJ * j)627 static inline BYTE SLIC_GetState(IXJ *j)
628 {
629 	if (j->cardtype == QTI_PHONECARD) {
630 		j->pccr1.byte = 0;
631 		j->psccr.bits.dev = 3;
632 		j->psccr.bits.rw = 1;
633 		outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
634 		ixj_PCcontrol_wait(j);
635 		j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
636 		ixj_PCcontrol_wait(j);
637 		if (j->pslic.bits.powerdown)
638 			return PLD_SLIC_STATE_OC;
639 		else if (!j->pslic.bits.ring0 && !j->pslic.bits.ring1)
640 			return PLD_SLIC_STATE_ACTIVE;
641 		else
642 			return PLD_SLIC_STATE_RINGING;
643 	} else {
644 		j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
645 	}
646 	return j->pld_slicr.bits.state;
647 }
648 
SLIC_SetState(BYTE byState,IXJ * j)649 static bool SLIC_SetState(BYTE byState, IXJ *j)
650 {
651 	bool fRetVal = false;
652 
653 	if (j->cardtype == QTI_PHONECARD) {
654 		if (j->flags.pcmciasct) {
655 			switch (byState) {
656 			case PLD_SLIC_STATE_TIPOPEN:
657 			case PLD_SLIC_STATE_OC:
658 				j->pslic.bits.powerdown = 1;
659 				j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
660 				fRetVal = true;
661 				break;
662 			case PLD_SLIC_STATE_RINGING:
663 				if (j->readers || j->writers) {
664 					j->pslic.bits.powerdown = 0;
665 					j->pslic.bits.ring0 = 1;
666 					j->pslic.bits.ring1 = 0;
667 					fRetVal = true;
668 				}
669 				break;
670 			case PLD_SLIC_STATE_OHT:	/* On-hook transmit */
671 
672 			case PLD_SLIC_STATE_STANDBY:
673 			case PLD_SLIC_STATE_ACTIVE:
674 				if (j->readers || j->writers) {
675 					j->pslic.bits.powerdown = 0;
676 				} else {
677 					j->pslic.bits.powerdown = 1;
678 				}
679 				j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
680 				fRetVal = true;
681 				break;
682 			case PLD_SLIC_STATE_APR:	/* Active polarity reversal */
683 
684 			case PLD_SLIC_STATE_OHTPR:	/* OHT polarity reversal */
685 
686 			default:
687 				fRetVal = false;
688 				break;
689 			}
690 			j->psccr.bits.dev = 3;
691 			j->psccr.bits.rw = 0;
692 			outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
693 			ixj_PCcontrol_wait(j);
694 		}
695 	} else {
696 		/* Set the C1, C2, C3 & B2EN signals. */
697 		switch (byState) {
698 		case PLD_SLIC_STATE_OC:
699 			j->pld_slicw.bits.c1 = 0;
700 			j->pld_slicw.bits.c2 = 0;
701 			j->pld_slicw.bits.c3 = 0;
702 			j->pld_slicw.bits.b2en = 0;
703 			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
704 			fRetVal = true;
705 			break;
706 		case PLD_SLIC_STATE_RINGING:
707 			j->pld_slicw.bits.c1 = 1;
708 			j->pld_slicw.bits.c2 = 0;
709 			j->pld_slicw.bits.c3 = 0;
710 			j->pld_slicw.bits.b2en = 1;
711 			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
712 			fRetVal = true;
713 			break;
714 		case PLD_SLIC_STATE_ACTIVE:
715 			j->pld_slicw.bits.c1 = 0;
716 			j->pld_slicw.bits.c2 = 1;
717 			j->pld_slicw.bits.c3 = 0;
718 			j->pld_slicw.bits.b2en = 0;
719 			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
720 			fRetVal = true;
721 			break;
722 		case PLD_SLIC_STATE_OHT:	/* On-hook transmit */
723 
724 			j->pld_slicw.bits.c1 = 1;
725 			j->pld_slicw.bits.c2 = 1;
726 			j->pld_slicw.bits.c3 = 0;
727 			j->pld_slicw.bits.b2en = 0;
728 			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
729 			fRetVal = true;
730 			break;
731 		case PLD_SLIC_STATE_TIPOPEN:
732 			j->pld_slicw.bits.c1 = 0;
733 			j->pld_slicw.bits.c2 = 0;
734 			j->pld_slicw.bits.c3 = 1;
735 			j->pld_slicw.bits.b2en = 0;
736 			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
737 			fRetVal = true;
738 			break;
739 		case PLD_SLIC_STATE_STANDBY:
740 			j->pld_slicw.bits.c1 = 1;
741 			j->pld_slicw.bits.c2 = 0;
742 			j->pld_slicw.bits.c3 = 1;
743 			j->pld_slicw.bits.b2en = 1;
744 			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
745 			fRetVal = true;
746 			break;
747 		case PLD_SLIC_STATE_APR:	/* Active polarity reversal */
748 
749 			j->pld_slicw.bits.c1 = 0;
750 			j->pld_slicw.bits.c2 = 1;
751 			j->pld_slicw.bits.c3 = 1;
752 			j->pld_slicw.bits.b2en = 0;
753 			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
754 			fRetVal = true;
755 			break;
756 		case PLD_SLIC_STATE_OHTPR:	/* OHT polarity reversal */
757 
758 			j->pld_slicw.bits.c1 = 1;
759 			j->pld_slicw.bits.c2 = 1;
760 			j->pld_slicw.bits.c3 = 1;
761 			j->pld_slicw.bits.b2en = 0;
762 			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
763 			fRetVal = true;
764 			break;
765 		default:
766 			fRetVal = false;
767 			break;
768 		}
769 	}
770 
771 	return fRetVal;
772 }
773 
ixj_wink(IXJ * j)774 static int ixj_wink(IXJ *j)
775 {
776 	BYTE slicnow;
777 
778 	slicnow = SLIC_GetState(j);
779 
780 	j->pots_winkstart = jiffies;
781 	SLIC_SetState(PLD_SLIC_STATE_OC, j);
782 
783 	msleep(jiffies_to_msecs(j->winktime));
784 
785 	SLIC_SetState(slicnow, j);
786 	return 0;
787 }
788 
ixj_init_timer(IXJ * j)789 static void ixj_init_timer(IXJ *j)
790 {
791 	init_timer(&j->timer);
792 	j->timer.function = ixj_timeout;
793 	j->timer.data = (unsigned long)j;
794 }
795 
ixj_add_timer(IXJ * j)796 static void ixj_add_timer(IXJ *j)
797 {
798 	j->timer.expires = jiffies + (hertz / samplerate);
799 	add_timer(&j->timer);
800 }
801 
ixj_tone_timeout(IXJ * j)802 static void ixj_tone_timeout(IXJ *j)
803 {
804 	IXJ_TONE ti;
805 
806 	j->tone_state++;
807 	if (j->tone_state == 3) {
808 		j->tone_state = 0;
809 		if (j->cadence_t) {
810 			j->tone_cadence_state++;
811 			if (j->tone_cadence_state >= j->cadence_t->elements_used) {
812 				switch (j->cadence_t->termination) {
813 				case PLAY_ONCE:
814 					ixj_cpt_stop(j);
815 					break;
816 				case REPEAT_LAST_ELEMENT:
817 					j->tone_cadence_state--;
818 					ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
819 					break;
820 				case REPEAT_ALL:
821 					j->tone_cadence_state = 0;
822 					if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
823 						ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
824 						ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
825 						ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
826 						ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
827 						ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
828 						ixj_init_tone(j, &ti);
829 					}
830 					ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, j);
831 					ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, j);
832 					ixj_play_tone(j, j->cadence_t->ce[0].index);
833 					break;
834 				}
835 			} else {
836 				if (j->cadence_t->ce[j->tone_cadence_state].gain0) {
837 					ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
838 					ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
839 					ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
840 					ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
841 					ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
842 					ixj_init_tone(j, &ti);
843 				}
844 				ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, j);
845 				ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, j);
846 				ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
847 			}
848 		}
849 	}
850 }
851 
ixj_kill_fasync(IXJ * j,IXJ_SIGEVENT event,int dir)852 static inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir)
853 {
854 	if(j->ixj_signals[event]) {
855 		if(ixjdebug & 0x0100)
856 			printk("Sending signal for event %d\n", event);
857 			/* Send apps notice of change */
858 		/* see config.h for macro definition */
859 		kill_fasync(&(j->async_queue), j->ixj_signals[event], dir);
860 	}
861 }
862 
ixj_pstn_state(IXJ * j)863 static void ixj_pstn_state(IXJ *j)
864 {
865 	int var;
866 	union XOPXR0 XR0, daaint;
867 
868 	var = 10;
869 
870 	XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg;
871 	daaint.reg = 0;
872 	XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
873 
874 	j->pld_scrr.byte = inb_p(j->XILINXbase);
875 	if (j->pld_scrr.bits.daaflag) {
876 		daa_int_read(j);
877 		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) {
878 			if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {
879 				daaint.bitreg.RING = 1;
880 				if(ixjdebug & 0x0008) {
881 					printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
882 				}
883 			} else {
884 				daa_set_mode(j, SOP_PU_RESET);
885 			}
886 		}
887 		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) {
888 			daaint.bitreg.Caller_ID = 1;
889 			j->pstn_cid_intr = 1;
890 			j->pstn_cid_received = jiffies;
891 			if(ixjdebug & 0x0008) {
892 				printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
893 			}
894 		}
895 		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) {
896 			daaint.bitreg.Cadence = 1;
897 			if(ixjdebug & 0x0008) {
898 				printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
899 			}
900 		}
901 		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) {
902 			daaint.bitreg.VDD_OK = 1;
903 			daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK;
904 		}
905 	}
906 	daa_CR_read(j, 1);
907 	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)) {
908 		daaint.bitreg.RMR = 1;
909 		daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
910 		if(ixjdebug & 0x0008) {
911                         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);
912 		}
913 		j->pstn_prev_rmr = j->pstn_last_rmr;
914 		j->pstn_last_rmr = jiffies;
915 	}
916 	switch(j->daa_mode) {
917 		case SOP_PU_SLEEP:
918 			if (daaint.bitreg.RING) {
919 				if (!j->flags.pstn_ringing) {
920 					if (j->daa_mode != SOP_PU_RINGING) {
921 						j->pstn_ring_int = jiffies;
922 						daa_set_mode(j, SOP_PU_RINGING);
923 					}
924 				}
925 			}
926 			break;
927 		case SOP_PU_RINGING:
928 			if (daaint.bitreg.RMR) {
929 				if (ixjdebug & 0x0008) {
930 					printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
931 				}
932 				if (daaint.bitreg.SI_1) {                /* Rising edge of RMR */
933 					j->flags.pstn_rmr = 1;
934 					j->pstn_ring_start = jiffies;
935 					j->pstn_ring_stop = 0;
936 					j->ex.bits.pstn_ring = 0;
937 					if (j->cadence_f[4].state == 0) {
938 						j->cadence_f[4].state = 1;
939 						j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000);
940 						j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000);
941 						j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000);
942 					} else if (j->cadence_f[4].state == 2) {
943 						if((time_after(jiffies, j->cadence_f[4].off1min) &&
944 						    time_before(jiffies, j->cadence_f[4].off1max))) {
945 							if (j->cadence_f[4].on2) {
946 								j->cadence_f[4].state = 3;
947 								j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000));
948 								j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000));
949 								j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000));
950 							} else {
951 								j->cadence_f[4].state = 7;
952 							}
953 						} else {
954 							if (ixjdebug & 0x0008) {
955 								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
956 										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
957 										j->cadence_f[4].off1);
958 							}
959 							j->cadence_f[4].state = 0;
960 						}
961 					} else if (j->cadence_f[4].state == 4) {
962 						if((time_after(jiffies, j->cadence_f[4].off2min) &&
963 						    time_before(jiffies, j->cadence_f[4].off2max))) {
964 							if (j->cadence_f[4].on3) {
965 								j->cadence_f[4].state = 5;
966 								j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000));
967 								j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000));
968 								j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000));
969 							} else {
970 								j->cadence_f[4].state = 7;
971 							}
972 						} else {
973 							if (ixjdebug & 0x0008) {
974 								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
975 										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
976 										j->cadence_f[4].off2);
977 							}
978 							j->cadence_f[4].state = 0;
979 						}
980 					} else if (j->cadence_f[4].state == 6) {
981 						if((time_after(jiffies, j->cadence_f[4].off3min) &&
982 						    time_before(jiffies, j->cadence_f[4].off3max))) {
983 							j->cadence_f[4].state = 7;
984 						} else {
985 							if (ixjdebug & 0x0008) {
986 								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
987 										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
988 										j->cadence_f[4].off3);
989 							}
990 							j->cadence_f[4].state = 0;
991 						}
992 					} else {
993 						j->cadence_f[4].state = 0;
994 					}
995 				} else {                                /* Falling edge of RMR */
996 					j->pstn_ring_start = 0;
997 					j->pstn_ring_stop = jiffies;
998 					if (j->cadence_f[4].state == 1) {
999 						if(!j->cadence_f[4].on1) {
1000 							j->cadence_f[4].state = 7;
1001 						} else if((time_after(jiffies, j->cadence_f[4].on1min) &&
1002 					          time_before(jiffies, j->cadence_f[4].on1max))) {
1003 							if (j->cadence_f[4].off1) {
1004 								j->cadence_f[4].state = 2;
1005 								j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000));
1006 								j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000));
1007 								j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000));
1008 							} else {
1009 								j->cadence_f[4].state = 7;
1010 							}
1011 						} else {
1012 							if (ixjdebug & 0x0008) {
1013 								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1014 										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1015 										j->cadence_f[4].on1);
1016 							}
1017 							j->cadence_f[4].state = 0;
1018 						}
1019 					} else if (j->cadence_f[4].state == 3) {
1020 						if((time_after(jiffies, j->cadence_f[4].on2min) &&
1021 						    time_before(jiffies, j->cadence_f[4].on2max))) {
1022 							if (j->cadence_f[4].off2) {
1023 								j->cadence_f[4].state = 4;
1024 								j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000));
1025 								j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000));
1026 								j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000));
1027 							} else {
1028 								j->cadence_f[4].state = 7;
1029 							}
1030 						} else {
1031 							if (ixjdebug & 0x0008) {
1032 								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1033 										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1034 										j->cadence_f[4].on2);
1035 							}
1036 							j->cadence_f[4].state = 0;
1037 						}
1038 					} else if (j->cadence_f[4].state == 5) {
1039 						if((time_after(jiffies, j->cadence_f[4].on3min) &&
1040 						    time_before(jiffies, j->cadence_f[4].on3max))) {
1041 							if (j->cadence_f[4].off3) {
1042 								j->cadence_f[4].state = 6;
1043 								j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000));
1044 								j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000));
1045 								j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000));
1046 							} else {
1047 								j->cadence_f[4].state = 7;
1048 							}
1049 						} else {
1050 							j->cadence_f[4].state = 0;
1051 						}
1052 					} else {
1053 						if (ixjdebug & 0x0008) {
1054 							printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1055 									j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1056 									j->cadence_f[4].on3);
1057 						}
1058 						j->cadence_f[4].state = 0;
1059 					}
1060 				}
1061 				if (ixjdebug & 0x0010) {
1062 					printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
1063 				}
1064 				if (ixjdebug & 0x0010) {
1065 					switch(j->cadence_f[4].state) {
1066 						case 1:
1067 							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1068 						j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max);
1069 							break;
1070 						case 2:
1071 							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1072 						j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max);
1073 							break;
1074 						case 3:
1075 							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1076 						j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max);
1077 							break;
1078 						case 4:
1079 							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1080 						j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max);
1081 							break;
1082 						case 5:
1083 							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1084 						j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max);
1085 							break;
1086 						case 6:
1087 							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1088 						j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max);
1089 							break;
1090 					}
1091 				}
1092 			}
1093 			if (j->cadence_f[4].state == 7) {
1094 				j->cadence_f[4].state = 0;
1095 				j->pstn_ring_stop = jiffies;
1096 				j->ex.bits.pstn_ring = 1;
1097 				ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN);
1098 				if(ixjdebug & 0x0008) {
1099 					printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ld\n", j->board, jiffies);
1100 				}
1101 			}
1102 			if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) ||
1103 			   (j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) {
1104 				if(ixjdebug & 0x0008) {
1105 					printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j->board, jiffies);
1106 					printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j->board, j->pstn_ring_int);
1107 					printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j->board, j->pstn_ring_stop);
1108 				}
1109 				j->pstn_ring_stop = j->pstn_ring_int = 0;
1110 				daa_set_mode(j, SOP_PU_SLEEP);
1111 			}
1112 			outb_p(j->pld_scrw.byte, j->XILINXbase);
1113 			if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) {
1114 				ixj_daa_cid_read(j);
1115 				j->ex.bits.caller_id = 1;
1116 				ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN);
1117 				j->pstn_cid_intr = 0;
1118 			}
1119 			if (daaint.bitreg.Cadence) {
1120 				if(ixjdebug & 0x0008) {
1121 					printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j->board);
1122 				}
1123 				daa_set_mode(j, SOP_PU_SLEEP);
1124 				j->ex.bits.pstn_ring = 0;
1125 			}
1126 			break;
1127 		case SOP_PU_CONVERSATION:
1128 			if (daaint.bitreg.VDD_OK) {
1129 				if(!daaint.bitreg.SI_0) {
1130 					if (!j->pstn_winkstart) {
1131 						if(ixjdebug & 0x0008) {
1132 							printk("IXJ DAA possible wink /dev/phone%d %ld\n", j->board, jiffies);
1133 						}
1134 						j->pstn_winkstart = jiffies;
1135 					}
1136 				} else {
1137 					if (j->pstn_winkstart) {
1138 						if(ixjdebug & 0x0008) {
1139 							printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies);
1140 						}
1141 						j->pstn_winkstart = 0;
1142 					}
1143 				}
1144 			}
1145 			if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) {
1146 				if(ixjdebug & 0x0008) {
1147 					printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j->board, jiffies);
1148 				}
1149 				daa_set_mode(j, SOP_PU_SLEEP);
1150 				j->pstn_winkstart = 0;
1151 				j->ex.bits.pstn_wink = 1;
1152 				ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN);
1153 			}
1154 			break;
1155 	}
1156 }
1157 
ixj_timeout(unsigned long ptr)1158 static void ixj_timeout(unsigned long ptr)
1159 {
1160 	int board;
1161 	unsigned long jifon;
1162 	IXJ *j = (IXJ *)ptr;
1163 	board = j->board;
1164 
1165 	if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) {
1166 		ixj_perfmon(j->timerchecks);
1167 		j->hookstate = ixj_hookstate(j);
1168 		if (j->tone_state) {
1169 			if (!(j->hookstate)) {
1170 				ixj_cpt_stop(j);
1171 				if (j->m_hook) {
1172 					j->m_hook = 0;
1173 					j->ex.bits.hookstate = 1;
1174 					ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1175 				}
1176 				clear_bit(board, &j->busyflags);
1177 				ixj_add_timer(j);
1178 				return;
1179 			}
1180 			if (j->tone_state == 1)
1181 				jifon = ((hertz * j->tone_on_time) * 25 / 100000);
1182 			else
1183 				jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000);
1184 			if (time_before(jiffies, j->tone_start_jif + jifon)) {
1185 				if (j->tone_state == 1) {
1186 					ixj_play_tone(j, j->tone_index);
1187 					if (j->dsp.low == 0x20) {
1188 						clear_bit(board, &j->busyflags);
1189 						ixj_add_timer(j);
1190 						return;
1191 					}
1192 				} else {
1193 					ixj_play_tone(j, 0);
1194 					if (j->dsp.low == 0x20) {
1195 						clear_bit(board, &j->busyflags);
1196 						ixj_add_timer(j);
1197 						return;
1198 					}
1199 				}
1200 			} else {
1201 				ixj_tone_timeout(j);
1202 				if (j->flags.dialtone) {
1203 					ixj_dialtone(j);
1204 				}
1205 				if (j->flags.busytone) {
1206 					ixj_busytone(j);
1207 					if (j->dsp.low == 0x20) {
1208 						clear_bit(board, &j->busyflags);
1209 						ixj_add_timer(j);
1210 						return;
1211 					}
1212 				}
1213 				if (j->flags.ringback) {
1214 					ixj_ringback(j);
1215 					if (j->dsp.low == 0x20) {
1216 						clear_bit(board, &j->busyflags);
1217 						ixj_add_timer(j);
1218 						return;
1219 					}
1220 				}
1221 				if (!j->tone_state) {
1222 					ixj_cpt_stop(j);
1223 				}
1224 			}
1225 		}
1226 		if (!(j->tone_state && j->dsp.low == 0x20)) {
1227 			if (IsRxReady(j)) {
1228 				ixj_read_frame(j);
1229 			}
1230 			if (IsTxReady(j)) {
1231 				ixj_write_frame(j);
1232 			}
1233 		}
1234 		if (j->flags.cringing) {
1235 			if (j->hookstate & 1) {
1236 				j->flags.cringing = 0;
1237 				ixj_ring_off(j);
1238 			} else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) {
1239 				switch(j->cadence_f[5].state) {
1240 					case 0:
1241 						j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000));
1242 						if (time_before(jiffies, j->cadence_f[5].on1dot)) {
1243 							if(ixjdebug & 0x0004) {
1244 								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1245 							}
1246 							ixj_ring_on(j);
1247 						}
1248 						j->cadence_f[5].state = 1;
1249 						break;
1250 					case 1:
1251 						if (time_after(jiffies, j->cadence_f[5].on1dot)) {
1252 							j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000));
1253 							if(ixjdebug & 0x0004) {
1254 								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1255 							}
1256 							ixj_ring_off(j);
1257 							j->cadence_f[5].state = 2;
1258 						}
1259 						break;
1260 					case 2:
1261 						if (time_after(jiffies, j->cadence_f[5].off1dot)) {
1262 							if(ixjdebug & 0x0004) {
1263 								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1264 							}
1265 							ixj_ring_on(j);
1266 							if (j->cadence_f[5].on2) {
1267 								j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000));
1268 								j->cadence_f[5].state = 3;
1269 							} else {
1270 								j->cadence_f[5].state = 7;
1271 							}
1272 						}
1273 						break;
1274 					case 3:
1275 						if (time_after(jiffies, j->cadence_f[5].on2dot)) {
1276 							if(ixjdebug & 0x0004) {
1277 								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1278 							}
1279 							ixj_ring_off(j);
1280 							if (j->cadence_f[5].off2) {
1281 								j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000));
1282 								j->cadence_f[5].state = 4;
1283 							} else {
1284 								j->cadence_f[5].state = 7;
1285 							}
1286 						}
1287 						break;
1288 					case 4:
1289 						if (time_after(jiffies, j->cadence_f[5].off2dot)) {
1290 							if(ixjdebug & 0x0004) {
1291 								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1292 							}
1293 							ixj_ring_on(j);
1294 							if (j->cadence_f[5].on3) {
1295 								j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000));
1296 								j->cadence_f[5].state = 5;
1297 							} else {
1298 								j->cadence_f[5].state = 7;
1299 							}
1300 						}
1301 						break;
1302 					case 5:
1303 						if (time_after(jiffies, j->cadence_f[5].on3dot)) {
1304 							if(ixjdebug & 0x0004) {
1305 								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1306 							}
1307 							ixj_ring_off(j);
1308 							if (j->cadence_f[5].off3) {
1309 								j->cadence_f[5].off3dot = jiffies + (long)((j->cadence_f[5].off3 * (hertz * 100) / 10000));
1310 								j->cadence_f[5].state = 6;
1311 							} else {
1312 								j->cadence_f[5].state = 7;
1313 							}
1314 						}
1315 						break;
1316 					case 6:
1317 						if (time_after(jiffies, j->cadence_f[5].off3dot)) {
1318 							if(ixjdebug & 0x0004) {
1319 								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1320 							}
1321 							j->cadence_f[5].state = 7;
1322 						}
1323 						break;
1324 					case 7:
1325 						if(ixjdebug & 0x0004) {
1326 							printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1327 						}
1328 						j->flags.cidring = 1;
1329 						j->cadence_f[5].state = 0;
1330 						break;
1331 				}
1332 				if (j->flags.cidring && !j->flags.cidsent) {
1333 					j->flags.cidsent = 1;
1334 					if(j->fskdcnt) {
1335 						SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1336 						ixj_pre_cid(j);
1337 					}
1338 					j->flags.cidring = 0;
1339 				}
1340 				clear_bit(board, &j->busyflags);
1341 				ixj_add_timer(j);
1342 				return;
1343 			} else {
1344 				if (time_after(jiffies, j->ring_cadence_jif + (hertz / 2))) {
1345 					if (j->flags.cidring && !j->flags.cidsent) {
1346 						j->flags.cidsent = 1;
1347 						if(j->fskdcnt) {
1348 							SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1349 							ixj_pre_cid(j);
1350 						}
1351 						j->flags.cidring = 0;
1352 					}
1353 					j->ring_cadence_t--;
1354 					if (j->ring_cadence_t == -1)
1355 						j->ring_cadence_t = 15;
1356 					j->ring_cadence_jif = jiffies;
1357 
1358 					if (j->ring_cadence & 1 << j->ring_cadence_t) {
1359 						if(j->flags.cidsent && j->cadence_f[5].en_filter)
1360 							j->flags.firstring = 1;
1361 						else
1362 							ixj_ring_on(j);
1363 					} else {
1364 						ixj_ring_off(j);
1365 						if(!j->flags.cidsent)
1366 							j->flags.cidring = 1;
1367 					}
1368 				}
1369 				clear_bit(board, &j->busyflags);
1370 				ixj_add_timer(j);
1371 				return;
1372 			}
1373 		}
1374 		if (!j->flags.ringing) {
1375 			if (j->hookstate) { /* & 1) { */
1376 				if (j->dsp.low != 0x20 &&
1377 				    SLIC_GetState(j) != PLD_SLIC_STATE_ACTIVE) {
1378 					SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1379 				}
1380 				LineMonitor(j);
1381 				read_filters(j);
1382 				ixj_WriteDSPCommand(0x511B, j);
1383 				j->proc_load = j->ssr.high << 8 | j->ssr.low;
1384 				if (!j->m_hook && (j->hookstate & 1)) {
1385 					j->m_hook = j->ex.bits.hookstate = 1;
1386 					ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1387 				}
1388 			} else {
1389 				if (j->ex.bits.dtmf_ready) {
1390 					j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0;
1391 				}
1392 				if (j->m_hook) {
1393 					j->m_hook = 0;
1394 					j->ex.bits.hookstate = 1;
1395 					ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1396 				}
1397 			}
1398 		}
1399 		if (j->cardtype == QTI_LINEJACK && !j->flags.pstncheck && j->flags.pstn_present) {
1400 			ixj_pstn_state(j);
1401 		}
1402 		if (j->ex.bytes) {
1403 			wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */
1404 		}
1405 		clear_bit(board, &j->busyflags);
1406 	}
1407 	ixj_add_timer(j);
1408 }
1409 
ixj_status_wait(IXJ * j)1410 static int ixj_status_wait(IXJ *j)
1411 {
1412 	unsigned long jif;
1413 
1414 	jif = jiffies + ((60 * hertz) / 100);
1415 	while (!IsStatusReady(j)) {
1416 		ixj_perfmon(j->statuswait);
1417 		if (time_after(jiffies, jif)) {
1418 			ixj_perfmon(j->statuswaitfail);
1419 			return -1;
1420 		}
1421 	}
1422 	return 0;
1423 }
1424 
ixj_PCcontrol_wait(IXJ * j)1425 static int ixj_PCcontrol_wait(IXJ *j)
1426 {
1427 	unsigned long jif;
1428 
1429 	jif = jiffies + ((60 * hertz) / 100);
1430 	while (!IsPCControlReady(j)) {
1431 		ixj_perfmon(j->pcontrolwait);
1432 		if (time_after(jiffies, jif)) {
1433 			ixj_perfmon(j->pcontrolwaitfail);
1434 			return -1;
1435 		}
1436 	}
1437 	return 0;
1438 }
1439 
ixj_WriteDSPCommand(unsigned short cmd,IXJ * j)1440 static int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j)
1441 {
1442 	BYTES bytes;
1443 	unsigned long jif;
1444 
1445 	atomic_inc(&j->DSPWrite);
1446 	if(atomic_read(&j->DSPWrite) > 1) {
1447 		printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j->board, cmd);
1448 		return -1;
1449 	}
1450 	bytes.high = (cmd & 0xFF00) >> 8;
1451 	bytes.low = cmd & 0x00FF;
1452 	jif = jiffies + ((60 * hertz) / 100);
1453 	while (!IsControlReady(j)) {
1454 		ixj_perfmon(j->iscontrolready);
1455 		if (time_after(jiffies, jif)) {
1456 			ixj_perfmon(j->iscontrolreadyfail);
1457 			atomic_dec(&j->DSPWrite);
1458 			if(atomic_read(&j->DSPWrite) > 0) {
1459 				printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j->board, cmd);
1460 				while(atomic_read(&j->DSPWrite) > 0) {
1461 					atomic_dec(&j->DSPWrite);
1462 				}
1463 			}
1464 			return -1;
1465 		}
1466 	}
1467 	outb(bytes.low, j->DSPbase + 6);
1468 	outb(bytes.high, j->DSPbase + 7);
1469 
1470 	if (ixj_status_wait(j)) {
1471 		j->ssr.low = 0xFF;
1472 		j->ssr.high = 0xFF;
1473 		atomic_dec(&j->DSPWrite);
1474 		if(atomic_read(&j->DSPWrite) > 0) {
1475 			printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j->board, cmd);
1476 			while(atomic_read(&j->DSPWrite) > 0) {
1477 				atomic_dec(&j->DSPWrite);
1478 			}
1479 		}
1480 		return -1;
1481 	}
1482 /* Read Software Status Register */
1483 	j->ssr.low = inb_p(j->DSPbase + 2);
1484 	j->ssr.high = inb_p(j->DSPbase + 3);
1485 	atomic_dec(&j->DSPWrite);
1486 	if(atomic_read(&j->DSPWrite) > 0) {
1487 		printk("IXJ %d DSP overlaped command 0x%4.4x\n", j->board, cmd);
1488 		while(atomic_read(&j->DSPWrite) > 0) {
1489 			atomic_dec(&j->DSPWrite);
1490 		}
1491 	}
1492 	return 0;
1493 }
1494 
1495 /***************************************************************************
1496 *
1497 *  General Purpose IO Register read routine
1498 *
1499 ***************************************************************************/
ixj_gpio_read(IXJ * j)1500 static inline int ixj_gpio_read(IXJ *j)
1501 {
1502 	if (ixj_WriteDSPCommand(0x5143, j))
1503 		return -1;
1504 
1505 	j->gpio.bytes.low = j->ssr.low;
1506 	j->gpio.bytes.high = j->ssr.high;
1507 
1508 	return 0;
1509 }
1510 
LED_SetState(int state,IXJ * j)1511 static inline void LED_SetState(int state, IXJ *j)
1512 {
1513 	if (j->cardtype == QTI_LINEJACK) {
1514 		j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0;
1515 		j->pld_scrw.bits.led2 = state & 0x2 ? 1 : 0;
1516 		j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0;
1517 		j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0;
1518 
1519 		outb(j->pld_scrw.byte, j->XILINXbase);
1520 	}
1521 }
1522 
1523 /*********************************************************************
1524 *  GPIO Pins are configured as follows on the Quicknet Internet
1525 *  PhoneJACK Telephony Cards
1526 *
1527 * POTS Select        GPIO_6=0 GPIO_7=0
1528 * Mic/Speaker Select GPIO_6=0 GPIO_7=1
1529 * Handset Select     GPIO_6=1 GPIO_7=0
1530 *
1531 * SLIC Active        GPIO_1=0 GPIO_2=1 GPIO_5=0
1532 * SLIC Ringing       GPIO_1=1 GPIO_2=1 GPIO_5=0
1533 * SLIC Open Circuit  GPIO_1=0 GPIO_2=0 GPIO_5=0
1534 *
1535 * Hook Switch changes reported on GPIO_3
1536 *********************************************************************/
ixj_set_port(IXJ * j,int arg)1537 static int ixj_set_port(IXJ *j, int arg)
1538 {
1539 	if (j->cardtype == QTI_PHONEJACK_LITE) {
1540 		if (arg != PORT_POTS)
1541 			return 10;
1542 		else
1543 			return 0;
1544 	}
1545 	switch (arg) {
1546 	case PORT_POTS:
1547 		j->port = PORT_POTS;
1548 		switch (j->cardtype) {
1549 		case QTI_PHONECARD:
1550 			if (j->flags.pcmciasct == 1)
1551 				SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1552 			else
1553 				return 11;
1554 			break;
1555 		case QTI_PHONEJACK_PCI:
1556 			j->pld_slicw.pcib.mic = 0;
1557 			j->pld_slicw.pcib.spk = 0;
1558 			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1559 			break;
1560 		case QTI_LINEJACK:
1561 			ixj_set_pots(j, 0);			/* Disconnect POTS/PSTN relay */
1562 			if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to
1563 									   Software Control Register */
1564 				return 2;
1565 			j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
1566 
1567 			outb(j->pld_scrw.byte, j->XILINXbase);
1568 			j->pld_clock.byte = 0;
1569 			outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1570 			j->pld_slicw.bits.rly1 = 1;
1571 			j->pld_slicw.bits.spken = 0;
1572 			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1573 			ixj_mixer(0x1200, j);	/* Turn Off MIC switch on mixer left */
1574 			ixj_mixer(0x1401, j);	/* Turn On Mono1 switch on mixer left */
1575 			ixj_mixer(0x1300, j);       /* Turn Off MIC switch on mixer right */
1576 			ixj_mixer(0x1501, j);       /* Turn On Mono1 switch on mixer right */
1577 			ixj_mixer(0x0E80, j);	/*Mic mute */
1578 			ixj_mixer(0x0F00, j);	/* Set mono out (SLIC) to 0dB */
1579 			ixj_mixer(0x0080, j);	/* Mute Master Left volume */
1580 			ixj_mixer(0x0180, j);	/* Mute Master Right volume */
1581 			SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
1582 /*			SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
1583 			break;
1584 		case QTI_PHONEJACK:
1585 			j->gpio.bytes.high = 0x0B;
1586 			j->gpio.bits.gpio6 = 0;
1587 			j->gpio.bits.gpio7 = 0;
1588 			ixj_WriteDSPCommand(j->gpio.word, j);
1589 			break;
1590 		}
1591 		break;
1592 	case PORT_PSTN:
1593 		if (j->cardtype == QTI_LINEJACK) {
1594 			ixj_WriteDSPCommand(0xC534, j);	/* Write CODEC config to Software Control Register */
1595 
1596 			j->pld_slicw.bits.rly3 = 0;
1597 			j->pld_slicw.bits.rly1 = 1;
1598 			j->pld_slicw.bits.spken = 0;
1599 			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1600 			j->port = PORT_PSTN;
1601 		} else {
1602 			return 4;
1603 		}
1604 		break;
1605 	case PORT_SPEAKER:
1606 		j->port = PORT_SPEAKER;
1607 		switch (j->cardtype) {
1608 		case QTI_PHONECARD:
1609 			if (j->flags.pcmciasct) {
1610 				SLIC_SetState(PLD_SLIC_STATE_OC, j);
1611 			}
1612 			break;
1613 		case QTI_PHONEJACK_PCI:
1614 			j->pld_slicw.pcib.mic = 1;
1615 			j->pld_slicw.pcib.spk = 1;
1616 			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1617 			break;
1618 		case QTI_LINEJACK:
1619 			ixj_set_pots(j, 0);			/* Disconnect POTS/PSTN relay */
1620 			if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to
1621 									   Software Control Register */
1622 				return 2;
1623 			j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
1624 
1625 			outb(j->pld_scrw.byte, j->XILINXbase);
1626 			j->pld_clock.byte = 0;
1627 			outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1628 			j->pld_slicw.bits.rly1 = 1;
1629 			j->pld_slicw.bits.spken = 1;
1630 			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1631 			ixj_mixer(0x1201, j);	/* Turn On MIC switch on mixer left */
1632 			ixj_mixer(0x1400, j);	/* Turn Off Mono1 switch on mixer left */
1633 			ixj_mixer(0x1301, j);       /* Turn On MIC switch on mixer right */
1634 			ixj_mixer(0x1500, j);       /* Turn Off Mono1 switch on mixer right */
1635 			ixj_mixer(0x0E06, j);	/*Mic un-mute 0dB */
1636 			ixj_mixer(0x0F80, j);	/* Mute mono out (SLIC) */
1637 			ixj_mixer(0x0000, j);	/* Set Master Left volume to 0dB */
1638 			ixj_mixer(0x0100, j);	/* Set Master Right volume to 0dB */
1639 			break;
1640 		case QTI_PHONEJACK:
1641 			j->gpio.bytes.high = 0x0B;
1642 			j->gpio.bits.gpio6 = 0;
1643 			j->gpio.bits.gpio7 = 1;
1644 			ixj_WriteDSPCommand(j->gpio.word, j);
1645 			break;
1646 		}
1647 		break;
1648 	case PORT_HANDSET:
1649 		if (j->cardtype != QTI_PHONEJACK) {
1650 			return 5;
1651 		} else {
1652 			j->gpio.bytes.high = 0x0B;
1653 			j->gpio.bits.gpio6 = 1;
1654 			j->gpio.bits.gpio7 = 0;
1655 			ixj_WriteDSPCommand(j->gpio.word, j);
1656 			j->port = PORT_HANDSET;
1657 		}
1658 		break;
1659 	default:
1660 		return 6;
1661 		break;
1662 	}
1663 	return 0;
1664 }
1665 
ixj_set_pots(IXJ * j,int arg)1666 static int ixj_set_pots(IXJ *j, int arg)
1667 {
1668 	if (j->cardtype == QTI_LINEJACK) {
1669 		if (arg) {
1670 			if (j->port == PORT_PSTN) {
1671 				j->pld_slicw.bits.rly1 = 0;
1672 				outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1673 				j->flags.pots_pstn = 1;
1674 				return 1;
1675 			} else {
1676 				j->flags.pots_pstn = 0;
1677 				return 0;
1678 			}
1679 		} else {
1680 			j->pld_slicw.bits.rly1 = 1;
1681 			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1682 			j->flags.pots_pstn = 0;
1683 			return 1;
1684 		}
1685 	} else {
1686 		return 0;
1687 	}
1688 }
1689 
ixj_ring_on(IXJ * j)1690 static void ixj_ring_on(IXJ *j)
1691 {
1692 	if (j->dsp.low == 0x20)	/* Internet PhoneJACK */
1693 	 {
1694 		if (ixjdebug & 0x0004)
1695 			printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", 	j->board);
1696 
1697 		j->gpio.bytes.high = 0x0B;
1698 		j->gpio.bytes.low = 0x00;
1699 		j->gpio.bits.gpio1 = 1;
1700 		j->gpio.bits.gpio2 = 1;
1701 		j->gpio.bits.gpio5 = 0;
1702 		ixj_WriteDSPCommand(j->gpio.word, j);	/* send the ring signal */
1703 	} else			/* Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI */
1704 	{
1705 		if (ixjdebug & 0x0004)
1706 			printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
1707 
1708 		SLIC_SetState(PLD_SLIC_STATE_RINGING, j);
1709 	}
1710 }
1711 
ixj_siadc(IXJ * j,int val)1712 static int ixj_siadc(IXJ *j, int val)
1713 {
1714 	if(j->cardtype == QTI_PHONECARD){
1715 		if(j->flags.pcmciascp){
1716 			if(val == -1)
1717 				return j->siadc.bits.rxg;
1718 
1719 			if(val < 0 || val > 0x1F)
1720 				return -1;
1721 
1722 			j->siadc.bits.hom = 0;				/* Handset Out Mute */
1723 			j->siadc.bits.lom = 0;				/* Line Out Mute */
1724 			j->siadc.bits.rxg = val;			/*(0xC000 - 0x41C8) / 0x4EF;    RX PGA Gain */
1725 			j->psccr.bits.addr = 6;				/* R/W Smart Cable Register Address */
1726 			j->psccr.bits.rw = 0;				/* Read / Write flag */
1727 			j->psccr.bits.dev = 0;
1728 			outb(j->siadc.byte, j->XILINXbase + 0x00);
1729 			outb(j->psccr.byte, j->XILINXbase + 0x01);
1730 			ixj_PCcontrol_wait(j);
1731 			return j->siadc.bits.rxg;
1732 		}
1733 	}
1734 	return -1;
1735 }
1736 
ixj_sidac(IXJ * j,int val)1737 static int ixj_sidac(IXJ *j, int val)
1738 {
1739 	if(j->cardtype == QTI_PHONECARD){
1740 		if(j->flags.pcmciascp){
1741 			if(val == -1)
1742 				return j->sidac.bits.txg;
1743 
1744 			if(val < 0 || val > 0x1F)
1745 				return -1;
1746 
1747 			j->sidac.bits.srm = 1;				/* Speaker Right Mute */
1748 			j->sidac.bits.slm = 1;				/* Speaker Left Mute */
1749 			j->sidac.bits.txg = val;			/* (0xC000 - 0x45E4) / 0x5D3;	 TX PGA Gain */
1750 			j->psccr.bits.addr = 7;				/* R/W Smart Cable Register Address */
1751 			j->psccr.bits.rw = 0;				/* Read / Write flag */
1752 			j->psccr.bits.dev = 0;
1753 			outb(j->sidac.byte, j->XILINXbase + 0x00);
1754 			outb(j->psccr.byte, j->XILINXbase + 0x01);
1755 			ixj_PCcontrol_wait(j);
1756 			return j->sidac.bits.txg;
1757 		}
1758 	}
1759 	return -1;
1760 }
1761 
ixj_pcmcia_cable_check(IXJ * j)1762 static int ixj_pcmcia_cable_check(IXJ *j)
1763 {
1764 	j->pccr1.byte = inb_p(j->XILINXbase + 0x03);
1765 	if (!j->flags.pcmciastate) {
1766 		j->pccr2.byte = inb_p(j->XILINXbase + 0x02);
1767 		if (j->pccr1.bits.drf || j->pccr2.bits.rstc) {
1768 			j->flags.pcmciastate = 4;
1769 			return 0;
1770 		}
1771 		if (j->pccr1.bits.ed) {
1772 			j->pccr1.bits.ed = 0;
1773 			j->psccr.bits.dev = 3;
1774 			j->psccr.bits.rw = 1;
1775 			outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
1776 			ixj_PCcontrol_wait(j);
1777 			j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
1778 			j->pslic.bits.led2 = j->pslic.bits.det ? 1 : 0;
1779 			j->psccr.bits.dev = 3;
1780 			j->psccr.bits.rw = 0;
1781 			outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
1782 			ixj_PCcontrol_wait(j);
1783 			return j->pslic.bits.led2 ? 1 : 0;
1784 		} else if (j->flags.pcmciasct) {
1785 			return j->r_hook;
1786 		} else {
1787 			return 1;
1788 		}
1789 	} else if (j->flags.pcmciastate == 4) {
1790 		if (!j->pccr1.bits.drf) {
1791 			j->flags.pcmciastate = 3;
1792 		}
1793 		return 0;
1794 	} else if (j->flags.pcmciastate == 3) {
1795 		j->pccr2.bits.pwr = 0;
1796 		j->pccr2.bits.rstc = 1;
1797 		outb(j->pccr2.byte, j->XILINXbase + 0x02);
1798 		j->checkwait = jiffies + (hertz * 2);
1799 		j->flags.incheck = 1;
1800 		j->flags.pcmciastate = 2;
1801 		return 0;
1802 	} else if (j->flags.pcmciastate == 2) {
1803 		if (j->flags.incheck) {
1804 			if (time_before(jiffies, j->checkwait)) {
1805 				return 0;
1806 			} else {
1807 				j->flags.incheck = 0;
1808 			}
1809 		}
1810 		j->pccr2.bits.pwr = 0;
1811 		j->pccr2.bits.rstc = 0;
1812 		outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1813 		j->flags.pcmciastate = 1;
1814 		return 0;
1815 	} else if (j->flags.pcmciastate == 1) {
1816 		j->flags.pcmciastate = 0;
1817 		if (!j->pccr1.bits.drf) {
1818 			j->psccr.bits.dev = 3;
1819 			j->psccr.bits.rw = 1;
1820 			outb_p(j->psccr.byte, j->XILINXbase + 0x01);
1821 			ixj_PCcontrol_wait(j);
1822 			j->flags.pcmciascp = 1;		/* Set Cable Present Flag */
1823 
1824 			j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03;		/* Get Cable Type */
1825 
1826 			if (j->flags.pcmciasct == 3) {
1827 				j->flags.pcmciastate = 4;
1828 				return 0;
1829 			} else if (j->flags.pcmciasct == 0) {
1830 				j->pccr2.bits.pwr = 1;
1831 				j->pccr2.bits.rstc = 0;
1832 				outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1833 				j->port = PORT_SPEAKER;
1834 			} else {
1835 				j->port = PORT_POTS;
1836 			}
1837 			j->sic1.bits.cpd = 0;				/* Chip Power Down */
1838 			j->sic1.bits.mpd = 0;				/* MIC Bias Power Down */
1839 			j->sic1.bits.hpd = 0;				/* Handset Bias Power Down */
1840 			j->sic1.bits.lpd = 0;				/* Line Bias Power Down */
1841 			j->sic1.bits.spd = 1;				/* Speaker Drive Power Down */
1842 			j->psccr.bits.addr = 1;				/* R/W Smart Cable Register Address */
1843 			j->psccr.bits.rw = 0;				/* Read / Write flag */
1844 			j->psccr.bits.dev = 0;
1845 			outb(j->sic1.byte, j->XILINXbase + 0x00);
1846 			outb(j->psccr.byte, j->XILINXbase + 0x01);
1847 			ixj_PCcontrol_wait(j);
1848 
1849 			j->sic2.bits.al = 0;				/* Analog Loopback DAC analog -> ADC analog */
1850 			j->sic2.bits.dl2 = 0;				/* Digital Loopback DAC -> ADC one bit */
1851 			j->sic2.bits.dl1 = 0;				/* Digital Loopback ADC -> DAC one bit */
1852 			j->sic2.bits.pll = 0;				/* 1 = div 10, 0 = div 5 */
1853 			j->sic2.bits.hpd = 0;				/* HPF disable */
1854 			j->psccr.bits.addr = 2;				/* R/W Smart Cable Register Address */
1855 			j->psccr.bits.rw = 0;				/* Read / Write flag */
1856 			j->psccr.bits.dev = 0;
1857 			outb(j->sic2.byte, j->XILINXbase + 0x00);
1858 			outb(j->psccr.byte, j->XILINXbase + 0x01);
1859 			ixj_PCcontrol_wait(j);
1860 
1861 			j->psccr.bits.addr = 3;				/* R/W Smart Cable Register Address */
1862 			j->psccr.bits.rw = 0;				/* Read / Write flag */
1863 			j->psccr.bits.dev = 0;
1864 			outb(0x00, j->XILINXbase + 0x00);		/* PLL Divide N1 */
1865 			outb(j->psccr.byte, j->XILINXbase + 0x01);
1866 			ixj_PCcontrol_wait(j);
1867 
1868 			j->psccr.bits.addr = 4;				/* R/W Smart Cable Register Address */
1869 			j->psccr.bits.rw = 0;				/* Read / Write flag */
1870 			j->psccr.bits.dev = 0;
1871 			outb(0x09, j->XILINXbase + 0x00);		/* PLL Multiply M1 */
1872 			outb(j->psccr.byte, j->XILINXbase + 0x01);
1873 			ixj_PCcontrol_wait(j);
1874 
1875 			j->sirxg.bits.lig = 1;				/* Line In Gain */
1876 			j->sirxg.bits.lim = 1;				/* Line In Mute */
1877 			j->sirxg.bits.mcg = 0;				/* MIC In Gain was 3 */
1878 			j->sirxg.bits.mcm = 0;				/* MIC In Mute */
1879 			j->sirxg.bits.him = 0;				/* Handset In Mute */
1880 			j->sirxg.bits.iir = 1;				/* IIR */
1881 			j->psccr.bits.addr = 5;				/* R/W Smart Cable Register Address */
1882 			j->psccr.bits.rw = 0;				/* Read / Write flag */
1883 			j->psccr.bits.dev = 0;
1884 			outb(j->sirxg.byte, j->XILINXbase + 0x00);
1885 			outb(j->psccr.byte, j->XILINXbase + 0x01);
1886 			ixj_PCcontrol_wait(j);
1887 
1888 			ixj_siadc(j, 0x17);
1889 			ixj_sidac(j, 0x1D);
1890 
1891 			j->siaatt.bits.sot = 0;
1892 			j->psccr.bits.addr = 9;				/* R/W Smart Cable Register Address */
1893 			j->psccr.bits.rw = 0;				/* Read / Write flag */
1894 			j->psccr.bits.dev = 0;
1895 			outb(j->siaatt.byte, j->XILINXbase + 0x00);
1896 			outb(j->psccr.byte, j->XILINXbase + 0x01);
1897 			ixj_PCcontrol_wait(j);
1898 
1899 			if (j->flags.pcmciasct == 1 && !j->readers && !j->writers) {
1900 				j->psccr.byte = j->pslic.byte = 0;
1901 				j->pslic.bits.powerdown = 1;
1902 				j->psccr.bits.dev = 3;
1903 				j->psccr.bits.rw = 0;
1904 				outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
1905 				ixj_PCcontrol_wait(j);
1906 			}
1907 		}
1908 		return 0;
1909 	} else {
1910 		j->flags.pcmciascp = 0;
1911 		return 0;
1912 	}
1913 	return 0;
1914 }
1915 
ixj_hookstate(IXJ * j)1916 static int ixj_hookstate(IXJ *j)
1917 {
1918 	int fOffHook = 0;
1919 
1920 	switch (j->cardtype) {
1921 	case QTI_PHONEJACK:
1922 		ixj_gpio_read(j);
1923 		fOffHook = j->gpio.bits.gpio3read ? 1 : 0;
1924 		break;
1925 	case QTI_LINEJACK:
1926 	case QTI_PHONEJACK_LITE:
1927 	case QTI_PHONEJACK_PCI:
1928 		SLIC_GetState(j);
1929 		if(j->cardtype == QTI_LINEJACK && j->flags.pots_pstn == 1 && (j->readers || j->writers)) {
1930 			fOffHook = j->pld_slicr.bits.potspstn ? 1 : 0;
1931 			if(fOffHook != j->p_hook) {
1932 				if(!j->checkwait) {
1933 					j->checkwait = jiffies;
1934 				}
1935 				if(time_before(jiffies, j->checkwait + 2)) {
1936 					fOffHook ^= 1;
1937 				} else {
1938 					j->checkwait = 0;
1939 				}
1940 				j->p_hook = fOffHook;
1941 	 			printk("IXJ : /dev/phone%d pots-pstn hookstate check %d at %ld\n", j->board, fOffHook, jiffies);
1942 			}
1943 		} else {
1944 			if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE ||
1945 			    j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) {
1946 				if (j->flags.ringing || j->flags.cringing) {
1947 					if (!in_interrupt()) {
1948 						msleep(20);
1949 					}
1950 					SLIC_GetState(j);
1951 					if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) {
1952 						ixj_ring_on(j);
1953 					}
1954 				}
1955 				if (j->cardtype == QTI_PHONEJACK_PCI) {
1956 					j->pld_scrr.byte = inb_p(j->XILINXbase);
1957 					fOffHook = j->pld_scrr.pcib.det ? 1 : 0;
1958 				} else
1959 					fOffHook = j->pld_slicr.bits.det ? 1 : 0;
1960 			}
1961 		}
1962 		break;
1963 	case QTI_PHONECARD:
1964 		fOffHook = ixj_pcmcia_cable_check(j);
1965 		break;
1966 	}
1967 	if (j->r_hook != fOffHook) {
1968 		j->r_hook = fOffHook;
1969 		if (j->port == PORT_SPEAKER || j->port == PORT_HANDSET) { // || (j->port == PORT_PSTN && j->flags.pots_pstn == 0)) {
1970 			j->ex.bits.hookstate = 1;
1971 			ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1972 		} else if (!fOffHook) {
1973 			j->flash_end = jiffies + ((60 * hertz) / 100);
1974 		}
1975 	}
1976 	if (fOffHook) {
1977 		if(time_before(jiffies, j->flash_end)) {
1978 			j->ex.bits.flash = 1;
1979 			j->flash_end = 0;
1980 			ixj_kill_fasync(j, SIG_FLASH, POLL_IN);
1981 		}
1982 	} else {
1983 		if(time_before(jiffies, j->flash_end)) {
1984 			fOffHook = 1;
1985 		}
1986 	}
1987 
1988 	if (j->port == PORT_PSTN && j->daa_mode == SOP_PU_CONVERSATION)
1989 		fOffHook |= 2;
1990 
1991 	if (j->port == PORT_SPEAKER) {
1992 		if(j->cardtype == QTI_PHONECARD) {
1993 			if(j->flags.pcmciascp && j->flags.pcmciasct) {
1994 				fOffHook |= 2;
1995 			}
1996 		} else {
1997 			fOffHook |= 2;
1998 		}
1999 	}
2000 
2001 	if (j->port == PORT_HANDSET)
2002 		fOffHook |= 2;
2003 
2004 	return fOffHook;
2005 }
2006 
ixj_ring_off(IXJ * j)2007 static void ixj_ring_off(IXJ *j)
2008 {
2009 	if (j->dsp.low == 0x20)	/* Internet PhoneJACK */
2010 	 {
2011 		if (ixjdebug & 0x0004)
2012 			printk(KERN_INFO "IXJ Ring Off\n");
2013 		j->gpio.bytes.high = 0x0B;
2014 		j->gpio.bytes.low = 0x00;
2015 		j->gpio.bits.gpio1 = 0;
2016 		j->gpio.bits.gpio2 = 1;
2017 		j->gpio.bits.gpio5 = 0;
2018 		ixj_WriteDSPCommand(j->gpio.word, j);
2019 	} else			/* Internet LineJACK */
2020 	{
2021 		if (ixjdebug & 0x0004)
2022 			printk(KERN_INFO "IXJ Ring Off\n");
2023 
2024 		if(!j->flags.cidplay)
2025 			SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
2026 
2027 		SLIC_GetState(j);
2028 	}
2029 }
2030 
ixj_ring_start(IXJ * j)2031 static void ixj_ring_start(IXJ *j)
2032 {
2033 	j->flags.cringing = 1;
2034 	if (ixjdebug & 0x0004)
2035 		printk(KERN_INFO "IXJ Cadence Ringing Start /dev/phone%d\n", j->board);
2036 	if (ixj_hookstate(j) & 1) {
2037 		if (j->port == PORT_POTS)
2038 			ixj_ring_off(j);
2039 		j->flags.cringing = 0;
2040 		if (ixjdebug & 0x0004)
2041 			printk(KERN_INFO "IXJ Cadence Ringing Stopped /dev/phone%d off hook\n", j->board);
2042 	} else if(j->cadence_f[5].enable && (!j->cadence_f[5].en_filter)) {
2043 		j->ring_cadence_jif = jiffies;
2044 		j->flags.cidsent = j->flags.cidring = 0;
2045 		j->cadence_f[5].state = 0;
2046 		if(j->cadence_f[5].on1)
2047 			ixj_ring_on(j);
2048 	} else {
2049 		j->ring_cadence_jif = jiffies;
2050 		j->ring_cadence_t = 15;
2051 		if (j->ring_cadence & 1 << j->ring_cadence_t) {
2052 			ixj_ring_on(j);
2053 		} else {
2054 			ixj_ring_off(j);
2055 		}
2056 		j->flags.cidsent = j->flags.cidring = j->flags.firstring = 0;
2057 	}
2058 }
2059 
ixj_ring(IXJ * j)2060 static int ixj_ring(IXJ *j)
2061 {
2062 	char cntr;
2063 	unsigned long jif;
2064 
2065 	j->flags.ringing = 1;
2066 	if (ixj_hookstate(j) & 1) {
2067 		ixj_ring_off(j);
2068 		j->flags.ringing = 0;
2069 		return 1;
2070 	}
2071 	for (cntr = 0; cntr < j->maxrings; cntr++) {
2072 		jif = jiffies + (1 * hertz);
2073 		ixj_ring_on(j);
2074 		while (time_before(jiffies, jif)) {
2075 			if (ixj_hookstate(j) & 1) {
2076 				ixj_ring_off(j);
2077 				j->flags.ringing = 0;
2078 				return 1;
2079 			}
2080 			schedule_timeout_interruptible(1);
2081 			if (signal_pending(current))
2082 				break;
2083 		}
2084 		jif = jiffies + (3 * hertz);
2085 		ixj_ring_off(j);
2086 		while (time_before(jiffies, jif)) {
2087 			if (ixj_hookstate(j) & 1) {
2088 				msleep(10);
2089 				if (ixj_hookstate(j) & 1) {
2090 					j->flags.ringing = 0;
2091 					return 1;
2092 				}
2093 			}
2094 			schedule_timeout_interruptible(1);
2095 			if (signal_pending(current))
2096 				break;
2097 		}
2098 	}
2099 	ixj_ring_off(j);
2100 	j->flags.ringing = 0;
2101 	return 0;
2102 }
2103 
ixj_open(struct phone_device * p,struct file * file_p)2104 static int ixj_open(struct phone_device *p, struct file *file_p)
2105 {
2106 	IXJ *j = get_ixj(p->board);
2107 	file_p->private_data = j;
2108 
2109 	if (!j->DSPbase)
2110 		return -ENODEV;
2111 
2112         if (file_p->f_mode & FMODE_READ) {
2113 		if(!j->readers) {
2114 	                j->readers++;
2115         	} else {
2116                 	return -EBUSY;
2117 		}
2118         }
2119 
2120 	if (file_p->f_mode & FMODE_WRITE) {
2121 		if(!j->writers) {
2122 			j->writers++;
2123 		} else {
2124 			if (file_p->f_mode & FMODE_READ){
2125 				j->readers--;
2126 			}
2127 			return -EBUSY;
2128 		}
2129 	}
2130 
2131 	if (j->cardtype == QTI_PHONECARD) {
2132 		j->pslic.bits.powerdown = 0;
2133 		j->psccr.bits.dev = 3;
2134 		j->psccr.bits.rw = 0;
2135 		outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
2136 		ixj_PCcontrol_wait(j);
2137 	}
2138 
2139 	j->flags.cidplay = 0;
2140 	j->flags.cidcw_ack = 0;
2141 
2142 	if (ixjdebug & 0x0002)
2143 		printk(KERN_INFO "Opening board %d\n", p->board);
2144 
2145 	j->framesread = j->frameswritten = 0;
2146 	return 0;
2147 }
2148 
ixj_release(struct inode * inode,struct file * file_p)2149 static int ixj_release(struct inode *inode, struct file *file_p)
2150 {
2151 	IXJ_TONE ti;
2152 	int cnt;
2153 	IXJ *j = file_p->private_data;
2154 	int board = j->p.board;
2155 
2156 	/*
2157 	 *    Set up locks to ensure that only one process is talking to the DSP at a time.
2158 	 *    This is necessary to keep the DSP from locking up.
2159 	 */
2160 	while(test_and_set_bit(board, (void *)&j->busyflags) != 0)
2161 		schedule_timeout_interruptible(1);
2162 	if (ixjdebug & 0x0002)
2163 		printk(KERN_INFO "Closing board %d\n", NUM(inode));
2164 
2165 	if (j->cardtype == QTI_PHONECARD)
2166 		ixj_set_port(j, PORT_SPEAKER);
2167 	else
2168 		ixj_set_port(j, PORT_POTS);
2169 
2170 	aec_stop(j);
2171 	ixj_play_stop(j);
2172 	ixj_record_stop(j);
2173 	set_play_volume(j, 0x100);
2174 	set_rec_volume(j, 0x100);
2175 	ixj_ring_off(j);
2176 
2177 	/* Restore the tone table to default settings. */
2178 	ti.tone_index = 10;
2179 	ti.gain0 = 1;
2180 	ti.freq0 = hz941;
2181 	ti.gain1 = 0;
2182 	ti.freq1 = hz1209;
2183 	ixj_init_tone(j, &ti);
2184 	ti.tone_index = 11;
2185 	ti.gain0 = 1;
2186 	ti.freq0 = hz941;
2187 	ti.gain1 = 0;
2188 	ti.freq1 = hz1336;
2189 	ixj_init_tone(j, &ti);
2190 	ti.tone_index = 12;
2191 	ti.gain0 = 1;
2192 	ti.freq0 = hz941;
2193 	ti.gain1 = 0;
2194 	ti.freq1 = hz1477;
2195 	ixj_init_tone(j, &ti);
2196 	ti.tone_index = 13;
2197 	ti.gain0 = 1;
2198 	ti.freq0 = hz800;
2199 	ti.gain1 = 0;
2200 	ti.freq1 = 0;
2201 	ixj_init_tone(j, &ti);
2202 	ti.tone_index = 14;
2203 	ti.gain0 = 1;
2204 	ti.freq0 = hz1000;
2205 	ti.gain1 = 0;
2206 	ti.freq1 = 0;
2207 	ixj_init_tone(j, &ti);
2208 	ti.tone_index = 15;
2209 	ti.gain0 = 1;
2210 	ti.freq0 = hz1250;
2211 	ti.gain1 = 0;
2212 	ti.freq1 = 0;
2213 	ixj_init_tone(j, &ti);
2214 	ti.tone_index = 16;
2215 	ti.gain0 = 1;
2216 	ti.freq0 = hz950;
2217 	ti.gain1 = 0;
2218 	ti.freq1 = 0;
2219 	ixj_init_tone(j, &ti);
2220 	ti.tone_index = 17;
2221 	ti.gain0 = 1;
2222 	ti.freq0 = hz1100;
2223 	ti.gain1 = 0;
2224 	ti.freq1 = 0;
2225 	ixj_init_tone(j, &ti);
2226 	ti.tone_index = 18;
2227 	ti.gain0 = 1;
2228 	ti.freq0 = hz1400;
2229 	ti.gain1 = 0;
2230 	ti.freq1 = 0;
2231 	ixj_init_tone(j, &ti);
2232 	ti.tone_index = 19;
2233 	ti.gain0 = 1;
2234 	ti.freq0 = hz1500;
2235 	ti.gain1 = 0;
2236 	ti.freq1 = 0;
2237 	ixj_init_tone(j, &ti);
2238 	ti.tone_index = 20;
2239 	ti.gain0 = 1;
2240 	ti.freq0 = hz1600;
2241 	ti.gain1 = 0;
2242 	ti.freq1 = 0;
2243 	ixj_init_tone(j, &ti);
2244 	ti.tone_index = 21;
2245 	ti.gain0 = 1;
2246 	ti.freq0 = hz1800;
2247 	ti.gain1 = 0;
2248 	ti.freq1 = 0;
2249 	ixj_init_tone(j, &ti);
2250 	ti.tone_index = 22;
2251 	ti.gain0 = 1;
2252 	ti.freq0 = hz2100;
2253 	ti.gain1 = 0;
2254 	ti.freq1 = 0;
2255 	ixj_init_tone(j, &ti);
2256 	ti.tone_index = 23;
2257 	ti.gain0 = 1;
2258 	ti.freq0 = hz1300;
2259 	ti.gain1 = 0;
2260 	ti.freq1 = 0;
2261 	ixj_init_tone(j, &ti);
2262 	ti.tone_index = 24;
2263 	ti.gain0 = 1;
2264 	ti.freq0 = hz2450;
2265 	ti.gain1 = 0;
2266 	ti.freq1 = 0;
2267 	ixj_init_tone(j, &ti);
2268 	ti.tone_index = 25;
2269 	ti.gain0 = 1;
2270 	ti.freq0 = hz350;
2271 	ti.gain1 = 0;
2272 	ti.freq1 = hz440;
2273 	ixj_init_tone(j, &ti);
2274 	ti.tone_index = 26;
2275 	ti.gain0 = 1;
2276 	ti.freq0 = hz440;
2277 	ti.gain1 = 0;
2278 	ti.freq1 = hz480;
2279 	ixj_init_tone(j, &ti);
2280 	ti.tone_index = 27;
2281 	ti.gain0 = 1;
2282 	ti.freq0 = hz480;
2283 	ti.gain1 = 0;
2284 	ti.freq1 = hz620;
2285 	ixj_init_tone(j, &ti);
2286 
2287 	set_rec_depth(j, 2);	/* Set Record Channel Limit to 2 frames */
2288 
2289 	set_play_depth(j, 2);	/* Set Playback Channel Limit to 2 frames */
2290 
2291 	j->ex.bits.dtmf_ready = 0;
2292 	j->dtmf_state = 0;
2293 	j->dtmf_wp = j->dtmf_rp = 0;
2294 	j->rec_mode = j->play_mode = -1;
2295 	j->flags.ringing = 0;
2296 	j->maxrings = MAXRINGS;
2297 	j->ring_cadence = USA_RING_CADENCE;
2298 	if(j->cadence_f[5].enable) {
2299 		j->cadence_f[5].enable = j->cadence_f[5].en_filter = j->cadence_f[5].state = 0;
2300 	}
2301 	j->drybuffer = 0;
2302 	j->winktime = 320;
2303 	j->flags.dtmf_oob = 0;
2304 	for (cnt = 0; cnt < 4; cnt++)
2305 		j->cadence_f[cnt].enable = 0;
2306 
2307 	idle(j);
2308 
2309 	if(j->cardtype == QTI_PHONECARD) {
2310 		SLIC_SetState(PLD_SLIC_STATE_OC, j);
2311 	}
2312 
2313 	if (file_p->f_mode & FMODE_READ)
2314 		j->readers--;
2315 	if (file_p->f_mode & FMODE_WRITE)
2316 		j->writers--;
2317 
2318 	if (j->read_buffer && !j->readers) {
2319 		kfree(j->read_buffer);
2320 		j->read_buffer = NULL;
2321 		j->read_buffer_size = 0;
2322 	}
2323 	if (j->write_buffer && !j->writers) {
2324 		kfree(j->write_buffer);
2325 		j->write_buffer = NULL;
2326 		j->write_buffer_size = 0;
2327 	}
2328 	j->rec_codec = j->play_codec = 0;
2329 	j->rec_frame_size = j->play_frame_size = 0;
2330 	j->flags.cidsent = j->flags.cidring = 0;
2331 
2332 	if(j->cardtype == QTI_LINEJACK && !j->readers && !j->writers) {
2333 		ixj_set_port(j, PORT_PSTN);
2334 		daa_set_mode(j, SOP_PU_SLEEP);
2335 		ixj_set_pots(j, 1);
2336 	}
2337 	ixj_WriteDSPCommand(0x0FE3, j);	/* Put the DSP in 1/5 power mode. */
2338 
2339 	/* Set up the default signals for events */
2340 	for (cnt = 0; cnt < 35; cnt++)
2341 		j->ixj_signals[cnt] = SIGIO;
2342 
2343 	/* Set the excetion signal enable flags */
2344 	j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
2345 	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 =
2346 	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;
2347 
2348 	file_p->private_data = NULL;
2349 	clear_bit(board, &j->busyflags);
2350 	return 0;
2351 }
2352 
read_filters(IXJ * j)2353 static int read_filters(IXJ *j)
2354 {
2355 	unsigned short fc, cnt, trg;
2356 	int var;
2357 
2358 	trg = 0;
2359 	if (ixj_WriteDSPCommand(0x5144, j)) {
2360 		if(ixjdebug & 0x0001) {
2361 			printk(KERN_INFO "Read Frame Counter failed!\n");
2362 		}
2363 		return -1;
2364 	}
2365 	fc = j->ssr.high << 8 | j->ssr.low;
2366 	if (fc == j->frame_count)
2367 		return 1;
2368 
2369 	j->frame_count = fc;
2370 
2371 	if (j->dtmf_proc)
2372 		return 1;
2373 
2374 	var = 10;
2375 
2376 	for (cnt = 0; cnt < 4; cnt++) {
2377 		if (ixj_WriteDSPCommand(0x5154 + cnt, j)) {
2378 			if(ixjdebug & 0x0001) {
2379 				printk(KERN_INFO "Select Filter %d failed!\n", cnt);
2380 			}
2381 			return -1;
2382 		}
2383 		if (ixj_WriteDSPCommand(0x515C, j)) {
2384 			if(ixjdebug & 0x0001) {
2385 				printk(KERN_INFO "Read Filter History %d failed!\n", cnt);
2386 			}
2387 			return -1;
2388 		}
2389 		j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low;
2390 
2391 		if (j->cadence_f[cnt].enable) {
2392 			if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) {
2393 				if (j->cadence_f[cnt].state == 0) {
2394 					j->cadence_f[cnt].state = 1;
2395 					j->cadence_f[cnt].on1min = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 - var)) / 10000));
2396 					j->cadence_f[cnt].on1dot = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100)) / 10000));
2397 					j->cadence_f[cnt].on1max = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 + var)) / 10000));
2398 				} else if (j->cadence_f[cnt].state == 2 &&
2399 					   (time_after(jiffies, j->cadence_f[cnt].off1min) &&
2400 					    time_before(jiffies, j->cadence_f[cnt].off1max))) {
2401 					if (j->cadence_f[cnt].on2) {
2402 						j->cadence_f[cnt].state = 3;
2403 						j->cadence_f[cnt].on2min = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 - var)) / 10000));
2404 						j->cadence_f[cnt].on2dot = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100)) / 10000));
2405 						j->cadence_f[cnt].on2max = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 + var)) / 10000));
2406 					} else {
2407 						j->cadence_f[cnt].state = 7;
2408 					}
2409 				} else if (j->cadence_f[cnt].state == 4 &&
2410 					   (time_after(jiffies, j->cadence_f[cnt].off2min) &&
2411 					    time_before(jiffies, j->cadence_f[cnt].off2max))) {
2412 					if (j->cadence_f[cnt].on3) {
2413 						j->cadence_f[cnt].state = 5;
2414 						j->cadence_f[cnt].on3min = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 - var)) / 10000));
2415 						j->cadence_f[cnt].on3dot = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100)) / 10000));
2416 						j->cadence_f[cnt].on3max = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 + var)) / 10000));
2417 					} else {
2418 						j->cadence_f[cnt].state = 7;
2419 					}
2420 				} else {
2421 					j->cadence_f[cnt].state = 0;
2422 				}
2423 			} else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) {
2424 				if (j->cadence_f[cnt].state == 1) {
2425 					if(!j->cadence_f[cnt].on1) {
2426 						j->cadence_f[cnt].state = 7;
2427 					} else if((time_after(jiffies, j->cadence_f[cnt].on1min) &&
2428 					  time_before(jiffies, j->cadence_f[cnt].on1max))) {
2429 						if(j->cadence_f[cnt].off1) {
2430 							j->cadence_f[cnt].state = 2;
2431 							j->cadence_f[cnt].off1min = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 - var)) / 10000));
2432 							j->cadence_f[cnt].off1dot = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100)) / 10000));
2433 							j->cadence_f[cnt].off1max = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 + var)) / 10000));
2434 						} else {
2435 							j->cadence_f[cnt].state = 7;
2436 						}
2437 					} else {
2438 						j->cadence_f[cnt].state = 0;
2439 					}
2440 				} else if (j->cadence_f[cnt].state == 3) {
2441 					if((time_after(jiffies, j->cadence_f[cnt].on2min) &&
2442 					    time_before(jiffies, j->cadence_f[cnt].on2max))) {
2443 						if(j->cadence_f[cnt].off2) {
2444 							j->cadence_f[cnt].state = 4;
2445 							j->cadence_f[cnt].off2min = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 - var)) / 10000));
2446 							j->cadence_f[cnt].off2dot = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100)) / 10000));
2447 							j->cadence_f[cnt].off2max = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 + var)) / 10000));
2448 						} else {
2449 							j->cadence_f[cnt].state = 7;
2450 						}
2451 					} else {
2452 						j->cadence_f[cnt].state = 0;
2453 					}
2454 				} else if (j->cadence_f[cnt].state == 5) {
2455 					if ((time_after(jiffies, j->cadence_f[cnt].on3min) &&
2456 					    time_before(jiffies, j->cadence_f[cnt].on3max))) {
2457 						if(j->cadence_f[cnt].off3) {
2458 							j->cadence_f[cnt].state = 6;
2459 							j->cadence_f[cnt].off3min = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 - var)) / 10000));
2460 							j->cadence_f[cnt].off3dot = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100)) / 10000));
2461 							j->cadence_f[cnt].off3max = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 + var)) / 10000));
2462 						} else {
2463 							j->cadence_f[cnt].state = 7;
2464 						}
2465 					} else {
2466 						j->cadence_f[cnt].state = 0;
2467 					}
2468 				} else {
2469 					j->cadence_f[cnt].state = 0;
2470 				}
2471 			} else {
2472 				switch(j->cadence_f[cnt].state) {
2473 					case 1:
2474 						if(time_after(jiffies, j->cadence_f[cnt].on1dot) &&
2475 						   !j->cadence_f[cnt].off1 &&
2476 						   !j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 &&
2477 						   !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2478 							j->cadence_f[cnt].state = 7;
2479 						}
2480 						break;
2481 					case 3:
2482 						if(time_after(jiffies, j->cadence_f[cnt].on2dot) &&
2483 						   !j->cadence_f[cnt].off2 &&
2484 						   !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2485 							j->cadence_f[cnt].state = 7;
2486 						}
2487 						break;
2488 					case 5:
2489 						if(time_after(jiffies, j->cadence_f[cnt].on3dot) &&
2490 						   !j->cadence_f[cnt].off3) {
2491 							j->cadence_f[cnt].state = 7;
2492 						}
2493 						break;
2494 				}
2495 			}
2496 
2497 			if (ixjdebug & 0x0040) {
2498 				printk(KERN_INFO "IXJ Tone Cadence state = %d /dev/phone%d at %ld\n", j->cadence_f[cnt].state, j->board, jiffies);
2499 				switch(j->cadence_f[cnt].state) {
2500 					case 0:
2501 						printk(KERN_INFO "IXJ /dev/phone%d No Tone detected\n", j->board);
2502 						break;
2503 					case 1:
2504 						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %u %ld - %ld - %ld\n", j->board,
2505 					j->cadence_f[cnt].on1, j->cadence_f[cnt].on1min, j->cadence_f[cnt].on1dot, j->cadence_f[cnt].on1max);
2506 						break;
2507 					case 2:
2508 						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off1min,
2509 															j->cadence_f[cnt].off1max);
2510 						break;
2511 					case 3:
2512 						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on2min,
2513 															j->cadence_f[cnt].on2max);
2514 						break;
2515 					case 4:
2516 						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off2min,
2517 															j->cadence_f[cnt].off2max);
2518 						break;
2519 					case 5:
2520 						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on3min,
2521 															j->cadence_f[cnt].on3max);
2522 						break;
2523 					case 6:
2524 						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off3min,
2525 															j->cadence_f[cnt].off3max);
2526 						break;
2527 				}
2528 			}
2529 		}
2530 		if (j->cadence_f[cnt].state == 7) {
2531 			j->cadence_f[cnt].state = 0;
2532 			if (j->cadence_f[cnt].enable == 1)
2533 				j->cadence_f[cnt].enable = 0;
2534 			switch (cnt) {
2535 			case 0:
2536 				if(ixjdebug & 0x0020) {
2537 					printk(KERN_INFO "Filter Cadence 0 triggered %ld\n", jiffies);
2538 				}
2539 				j->ex.bits.fc0 = 1;
2540 				ixj_kill_fasync(j, SIG_FC0, POLL_IN);
2541 				break;
2542 			case 1:
2543 				if(ixjdebug & 0x0020) {
2544 					printk(KERN_INFO "Filter Cadence 1 triggered %ld\n", jiffies);
2545 				}
2546 				j->ex.bits.fc1 = 1;
2547 				ixj_kill_fasync(j, SIG_FC1, POLL_IN);
2548 				break;
2549 			case 2:
2550 				if(ixjdebug & 0x0020) {
2551 					printk(KERN_INFO "Filter Cadence 2 triggered %ld\n", jiffies);
2552 				}
2553 				j->ex.bits.fc2 = 1;
2554 				ixj_kill_fasync(j, SIG_FC2, POLL_IN);
2555 				break;
2556 			case 3:
2557 				if(ixjdebug & 0x0020) {
2558 					printk(KERN_INFO "Filter Cadence 3 triggered %ld\n", jiffies);
2559 				}
2560 				j->ex.bits.fc3 = 1;
2561 				ixj_kill_fasync(j, SIG_FC3, POLL_IN);
2562 				break;
2563 			}
2564 		}
2565 		if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) ||
2566 					  (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) {
2567 			if((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12))) {
2568 				trg = 1;
2569 			} else if((j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3))) {
2570 				trg = 0;
2571 			}
2572 			switch (cnt) {
2573 			case 0:
2574 				if(ixjdebug & 0x0020) {
2575 					printk(KERN_INFO "Filter 0 triggered %d at %ld\n", trg, jiffies);
2576 				}
2577 				j->ex.bits.f0 = 1;
2578 				ixj_kill_fasync(j, SIG_F0, POLL_IN);
2579 				break;
2580 			case 1:
2581 				if(ixjdebug & 0x0020) {
2582 					printk(KERN_INFO "Filter 1 triggered %d at %ld\n", trg, jiffies);
2583 				}
2584 				j->ex.bits.f1 = 1;
2585 				ixj_kill_fasync(j, SIG_F1, POLL_IN);
2586 				break;
2587 			case 2:
2588 				if(ixjdebug & 0x0020) {
2589 					printk(KERN_INFO "Filter 2 triggered %d at %ld\n", trg, jiffies);
2590 				}
2591 				j->ex.bits.f2 = 1;
2592 				ixj_kill_fasync(j, SIG_F2, POLL_IN);
2593 				break;
2594 			case 3:
2595 				if(ixjdebug & 0x0020) {
2596 					printk(KERN_INFO "Filter 3 triggered %d at %ld\n", trg, jiffies);
2597 				}
2598 				j->ex.bits.f3 = 1;
2599 				ixj_kill_fasync(j, SIG_F3, POLL_IN);
2600 				break;
2601 			}
2602 		}
2603 	}
2604 	return 0;
2605 }
2606 
LineMonitor(IXJ * j)2607 static int LineMonitor(IXJ *j)
2608 {
2609 	if (j->dtmf_proc) {
2610 		return -1;
2611 	}
2612 	j->dtmf_proc = 1;
2613 
2614 	if (ixj_WriteDSPCommand(0x7000, j))		/* Line Monitor */
2615 		return -1;
2616 
2617 	j->dtmf.bytes.high = j->ssr.high;
2618 	j->dtmf.bytes.low = j->ssr.low;
2619 	if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) {
2620 		j->dtmf_state = 1;
2621 		j->dtmf_current = j->dtmf.bits.digit;
2622 	}
2623 	if (j->dtmf_state && !j->dtmf.bits.dtmf_valid)	/* && j->dtmf_wp != j->dtmf_rp) */
2624 	 {
2625 		if(!j->cidcw_wait) {
2626 			j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current;
2627 			j->dtmf_wp++;
2628 			if (j->dtmf_wp == 79)
2629 				j->dtmf_wp = 0;
2630 			j->ex.bits.dtmf_ready = 1;
2631 			if(j->ex_sig.bits.dtmf_ready) {
2632 				ixj_kill_fasync(j, SIG_DTMF_READY, POLL_IN);
2633 			}
2634 		}
2635 		else if(j->dtmf_current == 0x00 || j->dtmf_current == 0x0D) {
2636 			if(ixjdebug & 0x0020) {
2637 				printk("IXJ phone%d saw CIDCW Ack DTMF %d from display at %ld\n", j->board, j->dtmf_current, jiffies);
2638 			}
2639 			j->flags.cidcw_ack = 1;
2640 		}
2641 		j->dtmf_state = 0;
2642 	}
2643 	j->dtmf_proc = 0;
2644 
2645 	return 0;
2646 }
2647 
2648 /************************************************************************
2649 *
2650 * Functions to allow alaw <-> ulaw conversions.
2651 *
2652 ************************************************************************/
2653 
ulaw2alaw(unsigned char * buff,unsigned long len)2654 static void ulaw2alaw(unsigned char *buff, unsigned long len)
2655 {
2656 	static unsigned char table_ulaw2alaw[] =
2657 	{
2658 		0x2A, 0x2B, 0x28, 0x29, 0x2E, 0x2F, 0x2C, 0x2D,
2659 		0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25,
2660 		0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D,
2661 		0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35,
2662 		0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 0x02,
2663 		0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x1A,
2664 		0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 0x12,
2665 		0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x6B,
2666 		0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 0x62, 0x63,
2667 		0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x7B, 0x79,
2668 		0x7E, 0x7F, 0x7C, 0x7D, 0x72, 0x73, 0x70, 0x71,
2669 		0x76, 0x77, 0x74, 0x75, 0x4B, 0x49, 0x4F, 0x4D,
2670 		0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45,
2671 		0x5A, 0x5B, 0x58, 0x59, 0x5E, 0x5F, 0x5C, 0x5D,
2672 		0x52, 0x52, 0x53, 0x53, 0x50, 0x50, 0x51, 0x51,
2673 		0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, 0xD5,
2674 		0xAA, 0xAB, 0xA8, 0xA9, 0xAE, 0xAF, 0xAC, 0xAD,
2675 		0xA2, 0xA3, 0xA0, 0xA1, 0xA6, 0xA7, 0xA4, 0xA5,
2676 		0xBA, 0xBB, 0xB8, 0xB9, 0xBE, 0xBF, 0xBC, 0xBD,
2677 		0xB2, 0xB3, 0xB0, 0xB1, 0xB6, 0xB7, 0xB4, 0xB5,
2678 		0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 0x82,
2679 		0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 0x9A,
2680 		0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 0x92,
2681 		0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0xEB,
2682 		0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 0xE2, 0xE3,
2683 		0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 0xFB, 0xF9,
2684 		0xFE, 0xFF, 0xFC, 0xFD, 0xF2, 0xF3, 0xF0, 0xF1,
2685 		0xF6, 0xF7, 0xF4, 0xF5, 0xCB, 0xC9, 0xCF, 0xCD,
2686 		0xC2, 0xC3, 0xC0, 0xC1, 0xC6, 0xC7, 0xC4, 0xC5,
2687 		0xDA, 0xDB, 0xD8, 0xD9, 0xDE, 0xDF, 0xDC, 0xDD,
2688 		0xD2, 0xD2, 0xD3, 0xD3, 0xD0, 0xD0, 0xD1, 0xD1,
2689 		0xD6, 0xD6, 0xD7, 0xD7, 0xD4, 0xD4, 0xD5, 0xD5
2690 	};
2691 
2692 	while (len--)
2693 	{
2694 		*buff = table_ulaw2alaw[*(unsigned char *)buff];
2695 		buff++;
2696 	}
2697 }
2698 
alaw2ulaw(unsigned char * buff,unsigned long len)2699 static void alaw2ulaw(unsigned char *buff, unsigned long len)
2700 {
2701 	static unsigned char table_alaw2ulaw[] =
2702 	{
2703 		0x29, 0x2A, 0x27, 0x28, 0x2D, 0x2E, 0x2B, 0x2C,
2704 		0x21, 0x22, 0x1F, 0x20, 0x25, 0x26, 0x23, 0x24,
2705 		0x39, 0x3A, 0x37, 0x38, 0x3D, 0x3E, 0x3B, 0x3C,
2706 		0x31, 0x32, 0x2F, 0x30, 0x35, 0x36, 0x33, 0x34,
2707 		0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D,
2708 		0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05,
2709 		0x1A, 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D,
2710 		0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15,
2711 		0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65,
2712 		0x5D, 0x5D, 0x5C, 0x5C, 0x5F, 0x5F, 0x5E, 0x5E,
2713 		0x74, 0x76, 0x70, 0x72, 0x7C, 0x7E, 0x78, 0x7A,
2714 		0x6A, 0x6B, 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D,
2715 		0x48, 0x49, 0x46, 0x47, 0x4C, 0x4D, 0x4A, 0x4B,
2716 		0x40, 0x41, 0x3F, 0x3F, 0x44, 0x45, 0x42, 0x43,
2717 		0x56, 0x57, 0x54, 0x55, 0x5A, 0x5B, 0x58, 0x59,
2718 		0x4F, 0x4F, 0x4E, 0x4E, 0x52, 0x53, 0x50, 0x51,
2719 		0xA9, 0xAA, 0xA7, 0xA8, 0xAD, 0xAE, 0xAB, 0xAC,
2720 		0xA1, 0xA2, 0x9F, 0xA0, 0xA5, 0xA6, 0xA3, 0xA4,
2721 		0xB9, 0xBA, 0xB7, 0xB8, 0xBD, 0xBE, 0xBB, 0xBC,
2722 		0xB1, 0xB2, 0xAF, 0xB0, 0xB5, 0xB6, 0xB3, 0xB4,
2723 		0x8A, 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D,
2724 		0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85,
2725 		0x9A, 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D,
2726 		0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95,
2727 		0xE2, 0xE3, 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5,
2728 		0xDD, 0xDD, 0xDC, 0xDC, 0xDF, 0xDF, 0xDE, 0xDE,
2729 		0xF4, 0xF6, 0xF0, 0xF2, 0xFC, 0xFE, 0xF8, 0xFA,
2730 		0xEA, 0xEB, 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED,
2731 		0xC8, 0xC9, 0xC6, 0xC7, 0xCC, 0xCD, 0xCA, 0xCB,
2732 		0xC0, 0xC1, 0xBF, 0xBF, 0xC4, 0xC5, 0xC2, 0xC3,
2733 		0xD6, 0xD7, 0xD4, 0xD5, 0xDA, 0xDB, 0xD8, 0xD9,
2734 		0xCF, 0xCF, 0xCE, 0xCE, 0xD2, 0xD3, 0xD0, 0xD1
2735 	};
2736 
2737         while (len--)
2738         {
2739                 *buff = table_alaw2ulaw[*(unsigned char *)buff];
2740                 buff++;
2741 	}
2742 }
2743 
ixj_read(struct file * file_p,char __user * buf,size_t length,loff_t * ppos)2744 static ssize_t ixj_read(struct file * file_p, char __user *buf, size_t length, loff_t * ppos)
2745 {
2746 	unsigned long i = *ppos;
2747 	IXJ * j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
2748 
2749 	DECLARE_WAITQUEUE(wait, current);
2750 
2751 	if (j->flags.inread)
2752 		return -EALREADY;
2753 
2754 	j->flags.inread = 1;
2755 
2756 	add_wait_queue(&j->read_q, &wait);
2757 	set_current_state(TASK_INTERRUPTIBLE);
2758 	mb();
2759 
2760 	while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) {
2761 		++j->read_wait;
2762 		if (file_p->f_flags & O_NONBLOCK) {
2763 			set_current_state(TASK_RUNNING);
2764 			remove_wait_queue(&j->read_q, &wait);
2765 			j->flags.inread = 0;
2766 			return -EAGAIN;
2767 		}
2768 		if (!ixj_hookstate(j)) {
2769 			set_current_state(TASK_RUNNING);
2770 			remove_wait_queue(&j->read_q, &wait);
2771 			j->flags.inread = 0;
2772 			return 0;
2773 		}
2774 		interruptible_sleep_on(&j->read_q);
2775 		if (signal_pending(current)) {
2776 			set_current_state(TASK_RUNNING);
2777 			remove_wait_queue(&j->read_q, &wait);
2778 			j->flags.inread = 0;
2779 			return -EINTR;
2780 		}
2781 	}
2782 
2783 	remove_wait_queue(&j->read_q, &wait);
2784 	set_current_state(TASK_RUNNING);
2785 	/* Don't ever copy more than the user asks */
2786 	if(j->rec_codec == ALAW)
2787 		ulaw2alaw(j->read_buffer, min(length, j->read_buffer_size));
2788 	i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size));
2789 	j->read_buffer_ready = 0;
2790 	if (i) {
2791 		j->flags.inread = 0;
2792 		return -EFAULT;
2793 	} else {
2794 		j->flags.inread = 0;
2795 		return min(length, j->read_buffer_size);
2796 	}
2797 }
2798 
ixj_enhanced_read(struct file * file_p,char __user * buf,size_t length,loff_t * ppos)2799 static ssize_t ixj_enhanced_read(struct file * file_p, char __user *buf, size_t length,
2800 			  loff_t * ppos)
2801 {
2802 	int pre_retval;
2803 	ssize_t read_retval = 0;
2804 	IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
2805 
2806 	pre_retval = ixj_PreRead(j, 0L);
2807 	switch (pre_retval) {
2808 	case NORMAL:
2809 		read_retval = ixj_read(file_p, buf, length, ppos);
2810 		ixj_PostRead(j, 0L);
2811 		break;
2812 	case NOPOST:
2813 		read_retval = ixj_read(file_p, buf, length, ppos);
2814 		break;
2815 	case POSTONLY:
2816 		ixj_PostRead(j, 0L);
2817 		break;
2818 	default:
2819 		read_retval = pre_retval;
2820 	}
2821 	return read_retval;
2822 }
2823 
ixj_write(struct file * file_p,const char __user * buf,size_t count,loff_t * ppos)2824 static ssize_t ixj_write(struct file *file_p, const char __user *buf, size_t count, loff_t * ppos)
2825 {
2826 	unsigned long i = *ppos;
2827 	IXJ *j = file_p->private_data;
2828 
2829 	DECLARE_WAITQUEUE(wait, current);
2830 
2831 	if (j->flags.inwrite)
2832 		return -EALREADY;
2833 
2834 	j->flags.inwrite = 1;
2835 
2836 	add_wait_queue(&j->write_q, &wait);
2837 	set_current_state(TASK_INTERRUPTIBLE);
2838 	mb();
2839 
2840 
2841 	while (!j->write_buffers_empty) {
2842 		++j->write_wait;
2843 		if (file_p->f_flags & O_NONBLOCK) {
2844 			set_current_state(TASK_RUNNING);
2845 			remove_wait_queue(&j->write_q, &wait);
2846 			j->flags.inwrite = 0;
2847 			return -EAGAIN;
2848 		}
2849 		if (!ixj_hookstate(j)) {
2850 			set_current_state(TASK_RUNNING);
2851 			remove_wait_queue(&j->write_q, &wait);
2852 			j->flags.inwrite = 0;
2853 			return 0;
2854 		}
2855 		interruptible_sleep_on(&j->write_q);
2856 		if (signal_pending(current)) {
2857 			set_current_state(TASK_RUNNING);
2858 			remove_wait_queue(&j->write_q, &wait);
2859 			j->flags.inwrite = 0;
2860 			return -EINTR;
2861 		}
2862 	}
2863 	set_current_state(TASK_RUNNING);
2864 	remove_wait_queue(&j->write_q, &wait);
2865 	if (j->write_buffer_wp + count >= j->write_buffer_end)
2866 		j->write_buffer_wp = j->write_buffer;
2867 	i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size));
2868 	if (i) {
2869 		j->flags.inwrite = 0;
2870 		return -EFAULT;
2871 	}
2872        if(j->play_codec == ALAW)
2873                alaw2ulaw(j->write_buffer_wp, min(count, j->write_buffer_size));
2874 	j->flags.inwrite = 0;
2875 	return min(count, j->write_buffer_size);
2876 }
2877 
ixj_enhanced_write(struct file * file_p,const char __user * buf,size_t count,loff_t * ppos)2878 static ssize_t ixj_enhanced_write(struct file * file_p, const char __user *buf, size_t count, loff_t * ppos)
2879 {
2880 	int pre_retval;
2881 	ssize_t write_retval = 0;
2882 
2883 	IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
2884 
2885 	pre_retval = ixj_PreWrite(j, 0L);
2886 	switch (pre_retval) {
2887 	case NORMAL:
2888 		write_retval = ixj_write(file_p, buf, count, ppos);
2889 		if (write_retval > 0) {
2890 			ixj_PostWrite(j, 0L);
2891 			j->write_buffer_wp += write_retval;
2892 			j->write_buffers_empty--;
2893 		}
2894 		break;
2895 	case NOPOST:
2896 		write_retval = ixj_write(file_p, buf, count, ppos);
2897 		if (write_retval > 0) {
2898 			j->write_buffer_wp += write_retval;
2899 			j->write_buffers_empty--;
2900 		}
2901 		break;
2902 	case POSTONLY:
2903 		ixj_PostWrite(j, 0L);
2904 		break;
2905 	default:
2906 		write_retval = pre_retval;
2907 	}
2908 	return write_retval;
2909 }
2910 
ixj_read_frame(IXJ * j)2911 static void ixj_read_frame(IXJ *j)
2912 {
2913 	int cnt, dly;
2914 
2915 	if (j->read_buffer) {
2916 		for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
2917 			if (!(cnt % 16) && !IsRxReady(j)) {
2918 				dly = 0;
2919 				while (!IsRxReady(j)) {
2920 					if (dly++ > 5) {
2921 						dly = 0;
2922 						break;
2923 					}
2924 					udelay(10);
2925 				}
2926 			}
2927 			/* Throw away word 0 of the 8021 compressed format to get standard G.729. */
2928 			if (j->rec_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
2929 				inb_p(j->DSPbase + 0x0E);
2930 				inb_p(j->DSPbase + 0x0F);
2931 			}
2932 			*(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E);
2933 			*(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F);
2934 		}
2935 		++j->framesread;
2936 		if (j->intercom != -1) {
2937 			if (IsTxReady(get_ixj(j->intercom))) {
2938 				for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
2939 					if (!(cnt % 16) && !IsTxReady(j)) {
2940 						dly = 0;
2941 						while (!IsTxReady(j)) {
2942 							if (dly++ > 5) {
2943 								dly = 0;
2944 								break;
2945 							}
2946 							udelay(10);
2947 						}
2948 					}
2949 					outb_p(*(j->read_buffer + cnt), get_ixj(j->intercom)->DSPbase + 0x0C);
2950 					outb_p(*(j->read_buffer + cnt + 1), get_ixj(j->intercom)->DSPbase + 0x0D);
2951 				}
2952 				get_ixj(j->intercom)->frameswritten++;
2953 			}
2954 		} else {
2955 			j->read_buffer_ready = 1;
2956 			wake_up_interruptible(&j->read_q);	/* Wake any blocked readers */
2957 
2958 			wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */
2959 
2960 			if(j->ixj_signals[SIG_READ_READY])
2961 				ixj_kill_fasync(j, SIG_READ_READY, POLL_OUT);
2962 		}
2963 	}
2964 }
2965 
2966 static short fsk[][6][20] =
2967 {
2968 	{
2969 		{
2970 			0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196,
2971 			-16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722
2972 		},
2973 		{
2974 			-28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481,
2975 			-32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876
2976 		},
2977 		{
2978 			-28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715,
2979 			-16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846
2980 		},
2981 		{
2982 			0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196,
2983 			16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722
2984 		},
2985 		{
2986 			28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481,
2987 			32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876
2988 		},
2989 		{
2990 			28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715,
2991 			16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846
2992 		}
2993 	},
2994 	{
2995 		{
2996 			0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126,
2997 			0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126
2998 		},
2999 		{
3000 			-28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051,
3001 			28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051
3002 		},
3003 		{
3004 			-28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925,
3005 			28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925
3006 		},
3007 		{
3008 			0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126,
3009 			0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126
3010 		},
3011 		{
3012 			28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051,
3013 			-28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051
3014 		},
3015 		{
3016 			28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925,
3017 			-28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925
3018 		}
3019 	}
3020 };
3021 
3022 
ixj_write_cid_bit(IXJ * j,int bit)3023 static void ixj_write_cid_bit(IXJ *j, int bit)
3024 {
3025 	while (j->fskcnt < 20) {
3026 		if(j->fskdcnt < (j->fsksize - 1))
3027 			j->fskdata[j->fskdcnt++] = fsk[bit][j->fskz][j->fskcnt];
3028 
3029 		j->fskcnt += 3;
3030 	}
3031 	j->fskcnt %= 20;
3032 
3033 	if (!bit)
3034 		j->fskz++;
3035 	if (j->fskz >= 6)
3036 		j->fskz = 0;
3037 
3038 }
3039 
ixj_write_cid_byte(IXJ * j,char byte)3040 static void ixj_write_cid_byte(IXJ *j, char byte)
3041 {
3042 	IXJ_CBYTE cb;
3043 
3044 		cb.cbyte = byte;
3045 		ixj_write_cid_bit(j, 0);
3046 		ixj_write_cid_bit(j, cb.cbits.b0 ? 1 : 0);
3047 		ixj_write_cid_bit(j, cb.cbits.b1 ? 1 : 0);
3048 		ixj_write_cid_bit(j, cb.cbits.b2 ? 1 : 0);
3049 		ixj_write_cid_bit(j, cb.cbits.b3 ? 1 : 0);
3050 		ixj_write_cid_bit(j, cb.cbits.b4 ? 1 : 0);
3051 		ixj_write_cid_bit(j, cb.cbits.b5 ? 1 : 0);
3052 		ixj_write_cid_bit(j, cb.cbits.b6 ? 1 : 0);
3053 		ixj_write_cid_bit(j, cb.cbits.b7 ? 1 : 0);
3054 		ixj_write_cid_bit(j, 1);
3055 }
3056 
ixj_write_cid_seize(IXJ * j)3057 static void ixj_write_cid_seize(IXJ *j)
3058 {
3059 	int cnt;
3060 
3061 	for (cnt = 0; cnt < 150; cnt++) {
3062 		ixj_write_cid_bit(j, 0);
3063 		ixj_write_cid_bit(j, 1);
3064 	}
3065 	for (cnt = 0; cnt < 180; cnt++) {
3066 		ixj_write_cid_bit(j, 1);
3067 	}
3068 }
3069 
ixj_write_cidcw_seize(IXJ * j)3070 static void ixj_write_cidcw_seize(IXJ *j)
3071 {
3072 	int cnt;
3073 
3074 	for (cnt = 0; cnt < 80; cnt++) {
3075 		ixj_write_cid_bit(j, 1);
3076 	}
3077 }
3078 
ixj_write_cid_string(IXJ * j,char * s,int checksum)3079 static int ixj_write_cid_string(IXJ *j, char *s, int checksum)
3080 {
3081 	int cnt;
3082 
3083 	for (cnt = 0; cnt < strlen(s); cnt++) {
3084 		ixj_write_cid_byte(j, s[cnt]);
3085 		checksum = (checksum + s[cnt]);
3086 	}
3087 	return checksum;
3088 }
3089 
ixj_pad_fsk(IXJ * j,int pad)3090 static void ixj_pad_fsk(IXJ *j, int pad)
3091 {
3092 	int cnt;
3093 
3094 	for (cnt = 0; cnt < pad; cnt++) {
3095 		if(j->fskdcnt < (j->fsksize - 1))
3096 			j->fskdata[j->fskdcnt++] = 0x0000;
3097 	}
3098 	for (cnt = 0; cnt < 720; cnt++) {
3099 		if(j->fskdcnt < (j->fsksize - 1))
3100 			j->fskdata[j->fskdcnt++] = 0x0000;
3101 	}
3102 }
3103 
ixj_pre_cid(IXJ * j)3104 static void ixj_pre_cid(IXJ *j)
3105 {
3106 	j->cid_play_codec = j->play_codec;
3107 	j->cid_play_frame_size = j->play_frame_size;
3108 	j->cid_play_volume = get_play_volume(j);
3109 	j->cid_play_flag = j->flags.playing;
3110 
3111 	j->cid_rec_codec = j->rec_codec;
3112 	j->cid_rec_volume = get_rec_volume(j);
3113 	j->cid_rec_flag = j->flags.recording;
3114 
3115 	j->cid_play_aec_level = j->aec_level;
3116 
3117 	switch(j->baseframe.low) {
3118 		case 0xA0:
3119 			j->cid_base_frame_size = 20;
3120 			break;
3121 		case 0x50:
3122 			j->cid_base_frame_size = 10;
3123 			break;
3124 		case 0xF0:
3125 			j->cid_base_frame_size = 30;
3126 			break;
3127 	}
3128 
3129 	ixj_play_stop(j);
3130 	ixj_cpt_stop(j);
3131 
3132 	j->flags.cidplay = 1;
3133 
3134 	set_base_frame(j, 30);
3135 	set_play_codec(j, LINEAR16);
3136 	set_play_volume(j, 0x1B);
3137 	ixj_play_start(j);
3138 }
3139 
ixj_post_cid(IXJ * j)3140 static void ixj_post_cid(IXJ *j)
3141 {
3142 	ixj_play_stop(j);
3143 
3144 	if(j->cidsize > 5000) {
3145 		SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
3146 	}
3147 	j->flags.cidplay = 0;
3148 	if(ixjdebug & 0x0200) {
3149 		printk("IXJ phone%d Finished Playing CallerID data %ld\n", j->board, jiffies);
3150 	}
3151 
3152 	ixj_fsk_free(j);
3153 
3154 	j->fskdcnt = 0;
3155 	set_base_frame(j, j->cid_base_frame_size);
3156 	set_play_codec(j, j->cid_play_codec);
3157 	ixj_aec_start(j, j->cid_play_aec_level);
3158 	set_play_volume(j, j->cid_play_volume);
3159 
3160 	set_rec_codec(j, j->cid_rec_codec);
3161 	set_rec_volume(j, j->cid_rec_volume);
3162 
3163 	if(j->cid_rec_flag)
3164 		ixj_record_start(j);
3165 
3166 	if(j->cid_play_flag)
3167 		ixj_play_start(j);
3168 
3169 	if(j->cid_play_flag) {
3170 		wake_up_interruptible(&j->write_q);	/* Wake any blocked writers */
3171 	}
3172 }
3173 
ixj_write_cid(IXJ * j)3174 static void ixj_write_cid(IXJ *j)
3175 {
3176 	char sdmf1[50];
3177 	char sdmf2[50];
3178 	char sdmf3[80];
3179 	char mdmflen, len1, len2, len3;
3180 	int pad;
3181 
3182 	int checksum = 0;
3183 
3184 	if (j->dsp.low == 0x20 || j->flags.cidplay)
3185 		return;
3186 
3187 	j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3188 	j->cidsize = j->cidcnt = 0;
3189 
3190 	ixj_fsk_alloc(j);
3191 
3192 	strcpy(sdmf1, j->cid_send.month);
3193 	strcat(sdmf1, j->cid_send.day);
3194 	strcat(sdmf1, j->cid_send.hour);
3195 	strcat(sdmf1, j->cid_send.min);
3196 	strcpy(sdmf2, j->cid_send.number);
3197 	strcpy(sdmf3, j->cid_send.name);
3198 
3199 	len1 = strlen(sdmf1);
3200 	len2 = strlen(sdmf2);
3201 	len3 = strlen(sdmf3);
3202 	mdmflen = len1 + len2 + len3 + 6;
3203 
3204 	while(1){
3205 		ixj_write_cid_seize(j);
3206 
3207 		ixj_write_cid_byte(j, 0x80);
3208 		checksum = 0x80;
3209 		ixj_write_cid_byte(j, mdmflen);
3210 		checksum = checksum + mdmflen;
3211 
3212 		ixj_write_cid_byte(j, 0x01);
3213 		checksum = checksum + 0x01;
3214 		ixj_write_cid_byte(j, len1);
3215 		checksum = checksum + len1;
3216 		checksum = ixj_write_cid_string(j, sdmf1, checksum);
3217 		if(ixj_hookstate(j) & 1)
3218 			break;
3219 
3220 		ixj_write_cid_byte(j, 0x02);
3221 		checksum = checksum + 0x02;
3222 		ixj_write_cid_byte(j, len2);
3223 		checksum = checksum + len2;
3224 		checksum = ixj_write_cid_string(j, sdmf2, checksum);
3225 		if(ixj_hookstate(j) & 1)
3226 			break;
3227 
3228 		ixj_write_cid_byte(j, 0x07);
3229 		checksum = checksum + 0x07;
3230 		ixj_write_cid_byte(j, len3);
3231 		checksum = checksum + len3;
3232 		checksum = ixj_write_cid_string(j, sdmf3, checksum);
3233 		if(ixj_hookstate(j) & 1)
3234 			break;
3235 
3236 		checksum %= 256;
3237 		checksum ^= 0xFF;
3238 		checksum += 1;
3239 
3240 		ixj_write_cid_byte(j, (char) checksum);
3241 
3242 		pad = j->fskdcnt % 240;
3243 		if (pad) {
3244 			pad = 240 - pad;
3245 		}
3246 		ixj_pad_fsk(j, pad);
3247 		break;
3248 	}
3249 
3250 	ixj_write_frame(j);
3251 }
3252 
ixj_write_cidcw(IXJ * j)3253 static void ixj_write_cidcw(IXJ *j)
3254 {
3255 	IXJ_TONE ti;
3256 
3257 	char sdmf1[50];
3258 	char sdmf2[50];
3259 	char sdmf3[80];
3260 	char mdmflen, len1, len2, len3;
3261 	int pad;
3262 
3263 	int checksum = 0;
3264 
3265 	if (j->dsp.low == 0x20 || j->flags.cidplay)
3266 		return;
3267 
3268 	j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3269 	j->cidsize = j->cidcnt = 0;
3270 
3271 	ixj_fsk_alloc(j);
3272 
3273 	j->flags.cidcw_ack = 0;
3274 
3275 	ti.tone_index = 23;
3276 	ti.gain0 = 1;
3277 	ti.freq0 = hz440;
3278 	ti.gain1 = 0;
3279 	ti.freq1 = 0;
3280 	ixj_init_tone(j, &ti);
3281 
3282 	ixj_set_tone_on(1500, j);
3283 	ixj_set_tone_off(32, j);
3284 	if(ixjdebug & 0x0200) {
3285 		printk("IXJ cidcw phone%d first tone start at %ld\n", j->board, jiffies);
3286 	}
3287 	ixj_play_tone(j, 23);
3288 
3289 	clear_bit(j->board, &j->busyflags);
3290 	while(j->tone_state)
3291 		schedule_timeout_interruptible(1);
3292 	while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3293 		schedule_timeout_interruptible(1);
3294 	if(ixjdebug & 0x0200) {
3295 		printk("IXJ cidcw phone%d first tone end at %ld\n", j->board, jiffies);
3296 	}
3297 
3298 	ti.tone_index = 24;
3299 	ti.gain0 = 1;
3300 	ti.freq0 = hz2130;
3301 	ti.gain1 = 0;
3302 	ti.freq1 = hz2750;
3303 	ixj_init_tone(j, &ti);
3304 
3305 	ixj_set_tone_off(10, j);
3306 	ixj_set_tone_on(600, j);
3307 	if(ixjdebug & 0x0200) {
3308 		printk("IXJ cidcw phone%d second tone start at %ld\n", j->board, jiffies);
3309 	}
3310 	ixj_play_tone(j, 24);
3311 
3312 	clear_bit(j->board, &j->busyflags);
3313 	while(j->tone_state)
3314 		schedule_timeout_interruptible(1);
3315 	while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3316 		schedule_timeout_interruptible(1);
3317 	if(ixjdebug & 0x0200) {
3318 		printk("IXJ cidcw phone%d sent second tone at %ld\n", j->board, jiffies);
3319 	}
3320 
3321 	j->cidcw_wait = jiffies + ((50 * hertz) / 100);
3322 
3323 	clear_bit(j->board, &j->busyflags);
3324 	while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait))
3325 		schedule_timeout_interruptible(1);
3326 	while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3327 		schedule_timeout_interruptible(1);
3328 	j->cidcw_wait = 0;
3329 	if(!j->flags.cidcw_ack) {
3330 		if(ixjdebug & 0x0200) {
3331 			printk("IXJ cidcw phone%d did not receive ACK from display %ld\n", j->board, jiffies);
3332 		}
3333 		ixj_post_cid(j);
3334 		if(j->cid_play_flag) {
3335 			wake_up_interruptible(&j->write_q);	/* Wake any blocked readers */
3336 		}
3337 		return;
3338 	} else {
3339 		ixj_pre_cid(j);
3340 	}
3341 	j->flags.cidcw_ack = 0;
3342 	strcpy(sdmf1, j->cid_send.month);
3343 	strcat(sdmf1, j->cid_send.day);
3344 	strcat(sdmf1, j->cid_send.hour);
3345 	strcat(sdmf1, j->cid_send.min);
3346 	strcpy(sdmf2, j->cid_send.number);
3347 	strcpy(sdmf3, j->cid_send.name);
3348 
3349 	len1 = strlen(sdmf1);
3350 	len2 = strlen(sdmf2);
3351 	len3 = strlen(sdmf3);
3352 	mdmflen = len1 + len2 + len3 + 6;
3353 
3354 	ixj_write_cidcw_seize(j);
3355 
3356 	ixj_write_cid_byte(j, 0x80);
3357 	checksum = 0x80;
3358 	ixj_write_cid_byte(j, mdmflen);
3359 	checksum = checksum + mdmflen;
3360 
3361 	ixj_write_cid_byte(j, 0x01);
3362 	checksum = checksum + 0x01;
3363 	ixj_write_cid_byte(j, len1);
3364 	checksum = checksum + len1;
3365 	checksum = ixj_write_cid_string(j, sdmf1, checksum);
3366 
3367 	ixj_write_cid_byte(j, 0x02);
3368 	checksum = checksum + 0x02;
3369 	ixj_write_cid_byte(j, len2);
3370 	checksum = checksum + len2;
3371 	checksum = ixj_write_cid_string(j, sdmf2, checksum);
3372 
3373 	ixj_write_cid_byte(j, 0x07);
3374 	checksum = checksum + 0x07;
3375 	ixj_write_cid_byte(j, len3);
3376 	checksum = checksum + len3;
3377 	checksum = ixj_write_cid_string(j, sdmf3, checksum);
3378 
3379 	checksum %= 256;
3380 	checksum ^= 0xFF;
3381 	checksum += 1;
3382 
3383 	ixj_write_cid_byte(j, (char) checksum);
3384 
3385 	pad = j->fskdcnt % 240;
3386 	if (pad) {
3387 		pad = 240 - pad;
3388 	}
3389 	ixj_pad_fsk(j, pad);
3390 	if(ixjdebug & 0x0200) {
3391 		printk("IXJ cidcw phone%d sent FSK data at %ld\n", j->board, jiffies);
3392 	}
3393 }
3394 
ixj_write_vmwi(IXJ * j,int msg)3395 static void ixj_write_vmwi(IXJ *j, int msg)
3396 {
3397 	char mdmflen;
3398 	int pad;
3399 
3400 	int checksum = 0;
3401 
3402 	if (j->dsp.low == 0x20 || j->flags.cidplay)
3403 		return;
3404 
3405 	j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3406 	j->cidsize = j->cidcnt = 0;
3407 
3408 	ixj_fsk_alloc(j);
3409 
3410 	mdmflen = 3;
3411 
3412 	if (j->port == PORT_POTS)
3413 		SLIC_SetState(PLD_SLIC_STATE_OHT, j);
3414 
3415 	ixj_write_cid_seize(j);
3416 
3417 	ixj_write_cid_byte(j, 0x82);
3418 	checksum = 0x82;
3419 	ixj_write_cid_byte(j, mdmflen);
3420 	checksum = checksum + mdmflen;
3421 
3422 	ixj_write_cid_byte(j, 0x0B);
3423 	checksum = checksum + 0x0B;
3424 	ixj_write_cid_byte(j, 1);
3425 	checksum = checksum + 1;
3426 
3427 	if(msg) {
3428 		ixj_write_cid_byte(j, 0xFF);
3429 		checksum = checksum + 0xFF;
3430 	}
3431 	else {
3432 		ixj_write_cid_byte(j, 0x00);
3433 		checksum = checksum + 0x00;
3434 	}
3435 
3436 	checksum %= 256;
3437 	checksum ^= 0xFF;
3438 	checksum += 1;
3439 
3440 	ixj_write_cid_byte(j, (char) checksum);
3441 
3442 	pad = j->fskdcnt % 240;
3443 	if (pad) {
3444 		pad = 240 - pad;
3445 	}
3446 	ixj_pad_fsk(j, pad);
3447 }
3448 
ixj_write_frame(IXJ * j)3449 static void ixj_write_frame(IXJ *j)
3450 {
3451 	int cnt, frame_count, dly;
3452 	IXJ_WORD dat;
3453 
3454 	frame_count = 0;
3455 	if(j->flags.cidplay) {
3456 		for(cnt = 0; cnt < 480; cnt++) {
3457 			if (!(cnt % 16) && !IsTxReady(j)) {
3458 				dly = 0;
3459 				while (!IsTxReady(j)) {
3460 					if (dly++ > 5) {
3461 						dly = 0;
3462 						break;
3463 					}
3464 					udelay(10);
3465 				}
3466 			}
3467 			dat.word = j->fskdata[j->cidcnt++];
3468 			outb_p(dat.bytes.low, j->DSPbase + 0x0C);
3469 			outb_p(dat.bytes.high, j->DSPbase + 0x0D);
3470 			cnt++;
3471 		}
3472 		if(j->cidcnt >= j->fskdcnt) {
3473 			ixj_post_cid(j);
3474 		}
3475 		/* This may seem rude, but if we just played one frame of FSK data for CallerID
3476 		   and there is real audio data in the buffer, we need to throw it away because
3477 		   we just used it's time slot */
3478 		if (j->write_buffer_rp > j->write_buffer_wp) {
3479 			j->write_buffer_rp += j->cid_play_frame_size * 2;
3480 			if (j->write_buffer_rp >= j->write_buffer_end) {
3481 				j->write_buffer_rp = j->write_buffer;
3482 			}
3483 			j->write_buffers_empty++;
3484 			wake_up_interruptible(&j->write_q);	/* Wake any blocked writers */
3485 
3486 			wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */
3487 		}
3488 	} else if (j->write_buffer && j->write_buffers_empty < 1) {
3489 		if (j->write_buffer_wp > j->write_buffer_rp) {
3490 			frame_count =
3491 			    (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2);
3492 		}
3493 		if (j->write_buffer_rp > j->write_buffer_wp) {
3494 			frame_count =
3495 			    (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) +
3496 			    (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2);
3497 		}
3498 		if (frame_count >= 1) {
3499 			if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) {
3500 				BYTES blankword;
3501 
3502 				switch (j->play_mode) {
3503 				case PLAYBACK_MODE_ULAW:
3504 				case PLAYBACK_MODE_ALAW:
3505 					blankword.low = blankword.high = 0xFF;
3506 					break;
3507 				case PLAYBACK_MODE_8LINEAR:
3508 				case PLAYBACK_MODE_16LINEAR:
3509 				default:
3510 					blankword.low = blankword.high = 0x00;
3511 					break;
3512 				case PLAYBACK_MODE_8LINEAR_WSS:
3513 					blankword.low = blankword.high = 0x80;
3514 					break;
3515 				}
3516 				for (cnt = 0; cnt < 16; cnt++) {
3517 					if (!(cnt % 16) && !IsTxReady(j)) {
3518 						dly = 0;
3519 						while (!IsTxReady(j)) {
3520 							if (dly++ > 5) {
3521 								dly = 0;
3522 								break;
3523 							}
3524 							udelay(10);
3525 						}
3526 					}
3527 					outb_p((blankword.low), j->DSPbase + 0x0C);
3528 					outb_p((blankword.high), j->DSPbase + 0x0D);
3529 				}
3530 				j->flags.play_first_frame = 0;
3531 			} else	if (j->play_codec == G723_63 && j->flags.play_first_frame) {
3532 				for (cnt = 0; cnt < 24; cnt++) {
3533 					BYTES blankword;
3534 
3535 					if(cnt == 12) {
3536 						blankword.low = 0x02;
3537 						blankword.high = 0x00;
3538 					}
3539 					else {
3540 						blankword.low = blankword.high = 0x00;
3541 					}
3542 					if (!(cnt % 16) && !IsTxReady(j)) {
3543 						dly = 0;
3544 						while (!IsTxReady(j)) {
3545 							if (dly++ > 5) {
3546 								dly = 0;
3547 								break;
3548 							}
3549 							udelay(10);
3550 						}
3551 					}
3552 					outb_p((blankword.low), j->DSPbase + 0x0C);
3553 					outb_p((blankword.high), j->DSPbase + 0x0D);
3554 				}
3555 				j->flags.play_first_frame = 0;
3556 			}
3557 			for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) {
3558 				if (!(cnt % 16) && !IsTxReady(j)) {
3559 					dly = 0;
3560 					while (!IsTxReady(j)) {
3561 						if (dly++ > 5) {
3562 							dly = 0;
3563 							break;
3564 						}
3565 						udelay(10);
3566 					}
3567 				}
3568 			/* Add word 0 to G.729 frames for the 8021.  Right now we don't do VAD/CNG  */
3569 				if (j->play_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
3570 					if (j->write_buffer_rp[cnt] == 0 &&
3571 					    j->write_buffer_rp[cnt + 1] == 0 &&
3572 					    j->write_buffer_rp[cnt + 2] == 0 &&
3573 					    j->write_buffer_rp[cnt + 3] == 0 &&
3574 					    j->write_buffer_rp[cnt + 4] == 0 &&
3575 					    j->write_buffer_rp[cnt + 5] == 0 &&
3576 					    j->write_buffer_rp[cnt + 6] == 0 &&
3577 					    j->write_buffer_rp[cnt + 7] == 0 &&
3578 					    j->write_buffer_rp[cnt + 8] == 0 &&
3579 					    j->write_buffer_rp[cnt + 9] == 0) {
3580 					/* someone is trying to write silence lets make this a type 0 frame. */
3581 						outb_p(0x00, j->DSPbase + 0x0C);
3582 						outb_p(0x00, j->DSPbase + 0x0D);
3583 					} else {
3584 					/* so all other frames are type 1. */
3585 						outb_p(0x01, j->DSPbase + 0x0C);
3586 						outb_p(0x00, j->DSPbase + 0x0D);
3587 					}
3588 				}
3589 				outb_p(*(j->write_buffer_rp + cnt), j->DSPbase + 0x0C);
3590 				outb_p(*(j->write_buffer_rp + cnt + 1), j->DSPbase + 0x0D);
3591 				*(j->write_buffer_rp + cnt) = 0;
3592 				*(j->write_buffer_rp + cnt + 1) = 0;
3593 			}
3594 			j->write_buffer_rp += j->play_frame_size * 2;
3595 			if (j->write_buffer_rp >= j->write_buffer_end) {
3596 				j->write_buffer_rp = j->write_buffer;
3597 			}
3598 			j->write_buffers_empty++;
3599 			wake_up_interruptible(&j->write_q);	/* Wake any blocked writers */
3600 
3601 			wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */
3602 
3603 			++j->frameswritten;
3604 		}
3605 	} else {
3606 		j->drybuffer++;
3607 	}
3608 	if(j->ixj_signals[SIG_WRITE_READY]) {
3609 		ixj_kill_fasync(j, SIG_WRITE_READY, POLL_OUT);
3610 	}
3611 }
3612 
idle(IXJ * j)3613 static int idle(IXJ *j)
3614 {
3615 	if (ixj_WriteDSPCommand(0x0000, j))		/* DSP Idle */
3616 
3617 		return 0;
3618 
3619 	if (j->ssr.high || j->ssr.low) {
3620 		return 0;
3621 	} else {
3622 		j->play_mode = -1;
3623 		j->flags.playing = 0;
3624 		j->rec_mode = -1;
3625 		j->flags.recording = 0;
3626 		return 1;
3627         }
3628 }
3629 
set_base_frame(IXJ * j,int size)3630 static int set_base_frame(IXJ *j, int size)
3631 {
3632 	unsigned short cmd;
3633 	int cnt;
3634 
3635 	idle(j);
3636 	j->cid_play_aec_level = j->aec_level;
3637 	aec_stop(j);
3638 	for (cnt = 0; cnt < 10; cnt++) {
3639 		if (idle(j))
3640 			break;
3641 	}
3642 	if (j->ssr.high || j->ssr.low)
3643 		return -1;
3644 	if (j->dsp.low != 0x20) {
3645 		switch (size) {
3646 		case 30:
3647 			cmd = 0x07F0;
3648 			/* Set Base Frame Size to 240 pg9-10 8021 */
3649 			break;
3650 		case 20:
3651 			cmd = 0x07A0;
3652 			/* Set Base Frame Size to 160 pg9-10 8021 */
3653 			break;
3654 		case 10:
3655 			cmd = 0x0750;
3656 			/* Set Base Frame Size to 80 pg9-10 8021 */
3657 			break;
3658 		default:
3659 			return -1;
3660 		}
3661 	} else {
3662 		if (size == 30)
3663 			return size;
3664 		else
3665 			return -1;
3666 	}
3667 	if (ixj_WriteDSPCommand(cmd, j)) {
3668 		j->baseframe.high = j->baseframe.low = 0xFF;
3669 		return -1;
3670 	} else {
3671 		j->baseframe.high = j->ssr.high;
3672 		j->baseframe.low = j->ssr.low;
3673 		/* If the status returned is 0x0000 (pg9-9 8021) the call failed */
3674 		if(j->baseframe.high == 0x00 && j->baseframe.low == 0x00) {
3675 			return -1;
3676 		}
3677 	}
3678 	ixj_aec_start(j, j->cid_play_aec_level);
3679 	return size;
3680 }
3681 
set_rec_codec(IXJ * j,int rate)3682 static int set_rec_codec(IXJ *j, int rate)
3683 {
3684 	int retval = 0;
3685 
3686 	j->rec_codec = rate;
3687 
3688 	switch (rate) {
3689 	case G723_63:
3690 		if (j->ver.low != 0x12 || ixj_convert_loaded) {
3691 			j->rec_frame_size = 12;
3692 			j->rec_mode = 0;
3693 		} else {
3694 			retval = 1;
3695 		}
3696 		break;
3697 	case G723_53:
3698 		if (j->ver.low != 0x12 || ixj_convert_loaded) {
3699 			j->rec_frame_size = 10;
3700 			j->rec_mode = 0;
3701 		} else {
3702 			retval = 1;
3703 		}
3704 		break;
3705 	case TS85:
3706 		if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
3707 			j->rec_frame_size = 16;
3708 			j->rec_mode = 0;
3709 		} else {
3710 			retval = 1;
3711 		}
3712 		break;
3713 	case TS48:
3714 		if (j->ver.low != 0x12 || ixj_convert_loaded) {
3715 			j->rec_frame_size = 9;
3716 			j->rec_mode = 0;
3717 		} else {
3718 			retval = 1;
3719 		}
3720 		break;
3721 	case TS41:
3722 		if (j->ver.low != 0x12 || ixj_convert_loaded) {
3723 			j->rec_frame_size = 8;
3724 			j->rec_mode = 0;
3725 		} else {
3726 			retval = 1;
3727 		}
3728 		break;
3729 	case G728:
3730 		if (j->dsp.low != 0x20) {
3731 			j->rec_frame_size = 48;
3732 			j->rec_mode = 0;
3733 		} else {
3734 			retval = 1;
3735 		}
3736 		break;
3737 	case G729:
3738 		if (j->dsp.low != 0x20) {
3739 			if (!j->flags.g729_loaded) {
3740 				retval = 1;
3741 				break;
3742 			}
3743 			switch (j->baseframe.low) {
3744 			case 0xA0:
3745 				j->rec_frame_size = 10;
3746 				break;
3747 			case 0x50:
3748 				j->rec_frame_size = 5;
3749 				break;
3750 			default:
3751 				j->rec_frame_size = 15;
3752 				break;
3753 			}
3754 			j->rec_mode = 0;
3755 		} else {
3756 			retval = 1;
3757 		}
3758 		break;
3759 	case G729B:
3760 		if (j->dsp.low != 0x20) {
3761 			if (!j->flags.g729_loaded) {
3762 				retval = 1;
3763 				break;
3764 			}
3765 			switch (j->baseframe.low) {
3766 			case 0xA0:
3767 				j->rec_frame_size = 12;
3768 				break;
3769 			case 0x50:
3770 				j->rec_frame_size = 6;
3771 				break;
3772 			default:
3773 				j->rec_frame_size = 18;
3774 				break;
3775 			}
3776 			j->rec_mode = 0;
3777 		} else {
3778 			retval = 1;
3779 		}
3780 		break;
3781 	case ULAW:
3782 		switch (j->baseframe.low) {
3783 		case 0xA0:
3784 			j->rec_frame_size = 80;
3785 			break;
3786 		case 0x50:
3787 			j->rec_frame_size = 40;
3788 			break;
3789 		default:
3790 			j->rec_frame_size = 120;
3791 			break;
3792 		}
3793 		j->rec_mode = 4;
3794 		break;
3795 	case ALAW:
3796 		switch (j->baseframe.low) {
3797 		case 0xA0:
3798 			j->rec_frame_size = 80;
3799 			break;
3800 		case 0x50:
3801 			j->rec_frame_size = 40;
3802 			break;
3803 		default:
3804 			j->rec_frame_size = 120;
3805 			break;
3806 		}
3807 		j->rec_mode = 4;
3808 		break;
3809 	case LINEAR16:
3810 		switch (j->baseframe.low) {
3811 		case 0xA0:
3812 			j->rec_frame_size = 160;
3813 			break;
3814 		case 0x50:
3815 			j->rec_frame_size = 80;
3816 			break;
3817 		default:
3818 			j->rec_frame_size = 240;
3819 			break;
3820 		}
3821 		j->rec_mode = 5;
3822 		break;
3823 	case LINEAR8:
3824 		switch (j->baseframe.low) {
3825 		case 0xA0:
3826 			j->rec_frame_size = 80;
3827 			break;
3828 		case 0x50:
3829 			j->rec_frame_size = 40;
3830 			break;
3831 		default:
3832 			j->rec_frame_size = 120;
3833 			break;
3834 		}
3835 		j->rec_mode = 6;
3836 		break;
3837 	case WSS:
3838 		switch (j->baseframe.low) {
3839 		case 0xA0:
3840 			j->rec_frame_size = 80;
3841 			break;
3842 		case 0x50:
3843 			j->rec_frame_size = 40;
3844 			break;
3845 		default:
3846 			j->rec_frame_size = 120;
3847 			break;
3848 		}
3849 		j->rec_mode = 7;
3850 		break;
3851 	default:
3852 		kfree(j->read_buffer);
3853 		j->rec_frame_size = 0;
3854 		j->rec_mode = -1;
3855 		j->read_buffer = NULL;
3856 		j->read_buffer_size = 0;
3857 		retval = 1;
3858 		break;
3859 	}
3860 	return retval;
3861 }
3862 
ixj_record_start(IXJ * j)3863 static int ixj_record_start(IXJ *j)
3864 {
3865 	unsigned short cmd = 0x0000;
3866 
3867 	if (j->read_buffer) {
3868 		ixj_record_stop(j);
3869 	}
3870 	j->flags.recording = 1;
3871 	ixj_WriteDSPCommand(0x0FE0, j);	/* Put the DSP in full power mode. */
3872 
3873 	if(ixjdebug & 0x0002)
3874 		printk("IXJ %d Starting Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
3875 
3876 	if (!j->rec_mode) {
3877 		switch (j->rec_codec) {
3878 		case G723_63:
3879 			cmd = 0x5131;
3880 			break;
3881 		case G723_53:
3882 			cmd = 0x5132;
3883 			break;
3884 		case TS85:
3885 			cmd = 0x5130;	/* TrueSpeech 8.5 */
3886 
3887 			break;
3888 		case TS48:
3889 			cmd = 0x5133;	/* TrueSpeech 4.8 */
3890 
3891 			break;
3892 		case TS41:
3893 			cmd = 0x5134;	/* TrueSpeech 4.1 */
3894 
3895 			break;
3896 		case G728:
3897 			cmd = 0x5135;
3898 			break;
3899 		case G729:
3900 		case G729B:
3901 			cmd = 0x5136;
3902 			break;
3903 		default:
3904 			return 1;
3905 		}
3906 		if (ixj_WriteDSPCommand(cmd, j))
3907 			return -1;
3908 	}
3909 	if (!j->read_buffer) {
3910 		if (!j->read_buffer)
3911 			j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_ATOMIC);
3912 		if (!j->read_buffer) {
3913 			printk("Read buffer allocation for ixj board %d failed!\n", j->board);
3914 			return -ENOMEM;
3915 		}
3916 	}
3917 	j->read_buffer_size = j->rec_frame_size * 2;
3918 
3919 	if (ixj_WriteDSPCommand(0x5102, j))		/* Set Poll sync mode */
3920 
3921 		return -1;
3922 
3923 	switch (j->rec_mode) {
3924 	case 0:
3925 		cmd = 0x1C03;	/* Record C1 */
3926 
3927 		break;
3928 	case 4:
3929 		if (j->ver.low == 0x12) {
3930 			cmd = 0x1E03;	/* Record C1 */
3931 
3932 		} else {
3933 			cmd = 0x1E01;	/* Record C1 */
3934 
3935 		}
3936 		break;
3937 	case 5:
3938 		if (j->ver.low == 0x12) {
3939 			cmd = 0x1E83;	/* Record C1 */
3940 
3941 		} else {
3942 			cmd = 0x1E81;	/* Record C1 */
3943 
3944 		}
3945 		break;
3946 	case 6:
3947 		if (j->ver.low == 0x12) {
3948 			cmd = 0x1F03;	/* Record C1 */
3949 
3950 		} else {
3951 			cmd = 0x1F01;	/* Record C1 */
3952 
3953 		}
3954 		break;
3955 	case 7:
3956 		if (j->ver.low == 0x12) {
3957 			cmd = 0x1F83;	/* Record C1 */
3958 		} else {
3959 			cmd = 0x1F81;	/* Record C1 */
3960 		}
3961 		break;
3962 	}
3963 	if (ixj_WriteDSPCommand(cmd, j))
3964 		return -1;
3965 
3966 	if (j->flags.playing) {
3967 		ixj_aec_start(j, j->aec_level);
3968 	}
3969 	return 0;
3970 }
3971 
ixj_record_stop(IXJ * j)3972 static void ixj_record_stop(IXJ *j)
3973 {
3974 	if (ixjdebug & 0x0002)
3975 		printk("IXJ %d Stopping Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
3976 
3977 	kfree(j->read_buffer);
3978 	j->read_buffer = NULL;
3979 	j->read_buffer_size = 0;
3980 	if (j->rec_mode > -1) {
3981 		ixj_WriteDSPCommand(0x5120, j);
3982 		j->rec_mode = -1;
3983 	}
3984 	j->flags.recording = 0;
3985 }
ixj_vad(IXJ * j,int arg)3986 static void ixj_vad(IXJ *j, int arg)
3987 {
3988 	if (arg)
3989 		ixj_WriteDSPCommand(0x513F, j);
3990 	else
3991 		ixj_WriteDSPCommand(0x513E, j);
3992 }
3993 
set_rec_depth(IXJ * j,int depth)3994 static void set_rec_depth(IXJ *j, int depth)
3995 {
3996 	if (depth > 60)
3997 		depth = 60;
3998 	if (depth < 0)
3999 		depth = 0;
4000 	ixj_WriteDSPCommand(0x5180 + depth, j);
4001 }
4002 
set_dtmf_prescale(IXJ * j,int volume)4003 static void set_dtmf_prescale(IXJ *j, int volume)
4004 {
4005 	ixj_WriteDSPCommand(0xCF07, j);
4006 	ixj_WriteDSPCommand(volume, j);
4007 }
4008 
get_dtmf_prescale(IXJ * j)4009 static int get_dtmf_prescale(IXJ *j)
4010 {
4011 	ixj_WriteDSPCommand(0xCF05, j);
4012 	return j->ssr.high << 8 | j->ssr.low;
4013 }
4014 
set_rec_volume(IXJ * j,int volume)4015 static void set_rec_volume(IXJ *j, int volume)
4016 {
4017 	if(j->aec_level == AEC_AGC) {
4018 		if (ixjdebug & 0x0002)
4019 			printk(KERN_INFO "IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4x\n", j->board, volume);
4020 		ixj_WriteDSPCommand(0xCF96, j);
4021 		ixj_WriteDSPCommand(volume, j);
4022 	} else {
4023 		if (ixjdebug & 0x0002)
4024 			printk(KERN_INFO "IXJ: /dev/phone %d Setting Record Volume to 0x%4.4x\n", j->board, volume);
4025 		ixj_WriteDSPCommand(0xCF03, j);
4026 		ixj_WriteDSPCommand(volume, j);
4027 	}
4028 }
4029 
set_rec_volume_linear(IXJ * j,int volume)4030 static int set_rec_volume_linear(IXJ *j, int volume)
4031 {
4032 	int newvolume, dsprecmax;
4033 
4034 	if (ixjdebug & 0x0002)
4035 		printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4x\n", j->board, volume);
4036 	if(volume > 100 || volume < 0) {
4037 	  return -1;
4038 	}
4039 
4040 	/* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
4041 	switch (j->cardtype) {
4042 	case QTI_PHONEJACK:
4043 		dsprecmax = 0x440;
4044 		break;
4045 	case QTI_LINEJACK:
4046 		dsprecmax = 0x180;
4047 		ixj_mixer(0x0203, j);	/*Voice Left Volume unmute 6db */
4048 		ixj_mixer(0x0303, j);	/*Voice Right Volume unmute 6db */
4049 		ixj_mixer(0x0C00, j);	/*Mono1 unmute 12db */
4050 		break;
4051 	case QTI_PHONEJACK_LITE:
4052 		dsprecmax = 0x4C0;
4053 		break;
4054 	case QTI_PHONEJACK_PCI:
4055 		dsprecmax = 0x100;
4056 		break;
4057 	case QTI_PHONECARD:
4058 		dsprecmax = 0x400;
4059 		break;
4060 	default:
4061 		return -1;
4062 	}
4063 	newvolume = (dsprecmax * volume) / 100;
4064 	set_rec_volume(j, newvolume);
4065 	return 0;
4066 }
4067 
get_rec_volume(IXJ * j)4068 static int get_rec_volume(IXJ *j)
4069 {
4070 	if(j->aec_level == AEC_AGC) {
4071 		if (ixjdebug & 0x0002)
4072 			printk(KERN_INFO "Getting AGC Threshold\n");
4073 		ixj_WriteDSPCommand(0xCF86, j);
4074 		if (ixjdebug & 0x0002)
4075 			printk(KERN_INFO "AGC Threshold is 0x%2.2x%2.2x\n", j->ssr.high, j->ssr.low);
4076 		return j->ssr.high << 8 | j->ssr.low;
4077 	} else {
4078 		if (ixjdebug & 0x0002)
4079 			printk(KERN_INFO "Getting Record Volume\n");
4080 		ixj_WriteDSPCommand(0xCF01, j);
4081 		return j->ssr.high << 8 | j->ssr.low;
4082 	}
4083 }
4084 
get_rec_volume_linear(IXJ * j)4085 static int get_rec_volume_linear(IXJ *j)
4086 {
4087 	int volume, newvolume, dsprecmax;
4088 
4089 	switch (j->cardtype) {
4090 	case QTI_PHONEJACK:
4091 		dsprecmax = 0x440;
4092 		break;
4093 	case QTI_LINEJACK:
4094 		dsprecmax = 0x180;
4095 		break;
4096 	case QTI_PHONEJACK_LITE:
4097 		dsprecmax = 0x4C0;
4098 		break;
4099 	case QTI_PHONEJACK_PCI:
4100 		dsprecmax = 0x100;
4101 		break;
4102 	case QTI_PHONECARD:
4103 		dsprecmax = 0x400;
4104 		break;
4105 	default:
4106 		return -1;
4107 	}
4108 	volume = get_rec_volume(j);
4109 	newvolume = (volume * 100) / dsprecmax;
4110 	if(newvolume > 100)
4111 		newvolume = 100;
4112 	return newvolume;
4113 }
4114 
get_rec_level(IXJ * j)4115 static int get_rec_level(IXJ *j)
4116 {
4117 	int retval;
4118 
4119 	ixj_WriteDSPCommand(0xCF88, j);
4120 
4121 	retval = j->ssr.high << 8 | j->ssr.low;
4122 	retval = (retval * 256) / 240;
4123 	return retval;
4124 }
4125 
ixj_aec_start(IXJ * j,int level)4126 static void ixj_aec_start(IXJ *j, int level)
4127 {
4128 	j->aec_level = level;
4129 	if (ixjdebug & 0x0002)
4130 		printk(KERN_INFO "AGC set = 0x%2.2x\n", j->aec_level);
4131 	if (!level) {
4132 		aec_stop(j);
4133 	} else {
4134 		if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4135 			ixj_WriteDSPCommand(0xE022, j);	/* Move AEC filter buffer */
4136 
4137 			ixj_WriteDSPCommand(0x0300, j);
4138 		}
4139 		ixj_WriteDSPCommand(0xB001, j);	/* AEC On */
4140 
4141 		ixj_WriteDSPCommand(0xE013, j);	/* Advanced AEC C1 */
4142 
4143 		switch (level) {
4144 		case AEC_LOW:
4145 			ixj_WriteDSPCommand(0x0000, j);	/* Advanced AEC C2 = off */
4146 
4147 			ixj_WriteDSPCommand(0xE011, j);
4148 			ixj_WriteDSPCommand(0xFFFF, j);
4149 
4150 			ixj_WriteDSPCommand(0xCF97, j);	/* Set AGC Enable */
4151 			ixj_WriteDSPCommand(0x0000, j);	/* to off */
4152 
4153 			break;
4154 
4155 		case AEC_MED:
4156 			ixj_WriteDSPCommand(0x0600, j);	/* Advanced AEC C2 = on medium */
4157 
4158 			ixj_WriteDSPCommand(0xE011, j);
4159 			ixj_WriteDSPCommand(0x0080, j);
4160 
4161 			ixj_WriteDSPCommand(0xCF97, j);	/* Set AGC Enable */
4162 			ixj_WriteDSPCommand(0x0000, j);	/* to off */
4163 
4164 			break;
4165 
4166 		case AEC_HIGH:
4167 			ixj_WriteDSPCommand(0x0C00, j);	/* Advanced AEC C2 = on high */
4168 
4169 			ixj_WriteDSPCommand(0xE011, j);
4170 			ixj_WriteDSPCommand(0x0080, j);
4171 
4172 			ixj_WriteDSPCommand(0xCF97, j);	/* Set AGC Enable */
4173 			ixj_WriteDSPCommand(0x0000, j);	/* to off */
4174 
4175 			break;
4176 
4177 		case AEC_AGC:
4178                         /* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */
4179 			ixj_WriteDSPCommand(0x0002, j);	/* Attenuation scaling factor of 2 */
4180 
4181 			ixj_WriteDSPCommand(0xE011, j);
4182 			ixj_WriteDSPCommand(0x0100, j);	/* Higher Threshold Floor */
4183 
4184 			ixj_WriteDSPCommand(0xE012, j);	/* Set Train and Lock */
4185 
4186 			if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4187 				ixj_WriteDSPCommand(0x0224, j);
4188 			else
4189 				ixj_WriteDSPCommand(0x1224, j);
4190 
4191 			ixj_WriteDSPCommand(0xE014, j);
4192 			ixj_WriteDSPCommand(0x0003, j);	/* Lock threashold at 3dB */
4193 
4194 			ixj_WriteDSPCommand(0xE338, j);	/* Set Echo Suppresser Attenuation to 0dB */
4195 
4196 			/* Now we can set the AGC initial parameters and turn it on */
4197 			ixj_WriteDSPCommand(0xCF90, j);	/* Set AGC Minumum gain */
4198 			ixj_WriteDSPCommand(0x0020, j);	/* to 0.125 (-18dB) */
4199 
4200 			ixj_WriteDSPCommand(0xCF91, j);	/* Set AGC Maximum gain */
4201 			ixj_WriteDSPCommand(0x1000, j);	/* to 16 (24dB) */
4202 
4203 			ixj_WriteDSPCommand(0xCF92, j);	/* Set AGC start gain */
4204 			ixj_WriteDSPCommand(0x0800, j);	/* to 8 (+18dB) */
4205 
4206 			ixj_WriteDSPCommand(0xCF93, j);	/* Set AGC hold time */
4207 			ixj_WriteDSPCommand(0x1F40, j);	/* to 2 seconds (units are 250us) */
4208 
4209 			ixj_WriteDSPCommand(0xCF94, j);	/* Set AGC Attack Time Constant */
4210 			ixj_WriteDSPCommand(0x0005, j);	/* to 8ms */
4211 
4212 			ixj_WriteDSPCommand(0xCF95, j);	/* Set AGC Decay Time Constant */
4213 			ixj_WriteDSPCommand(0x000D, j);	/* to 4096ms */
4214 
4215 			ixj_WriteDSPCommand(0xCF96, j);	/* Set AGC Attack Threshold */
4216 			ixj_WriteDSPCommand(0x1200, j);	/* to 25% */
4217 
4218 			ixj_WriteDSPCommand(0xCF97, j);	/* Set AGC Enable */
4219 			ixj_WriteDSPCommand(0x0001, j);	/* to on */
4220 
4221 			break;
4222 
4223 		case AEC_AUTO:
4224 			ixj_WriteDSPCommand(0x0002, j);	/* Attenuation scaling factor of 2 */
4225 
4226 			ixj_WriteDSPCommand(0xE011, j);
4227 			ixj_WriteDSPCommand(0x0100, j);	/* Higher Threshold Floor */
4228 
4229 			ixj_WriteDSPCommand(0xE012, j);	/* Set Train and Lock */
4230 
4231 			if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4232 				ixj_WriteDSPCommand(0x0224, j);
4233 			else
4234 				ixj_WriteDSPCommand(0x1224, j);
4235 
4236 			ixj_WriteDSPCommand(0xE014, j);
4237 			ixj_WriteDSPCommand(0x0003, j);	/* Lock threashold at 3dB */
4238 
4239 			ixj_WriteDSPCommand(0xE338, j);	/* Set Echo Suppresser Attenuation to 0dB */
4240 
4241 			break;
4242 		}
4243 	}
4244 }
4245 
aec_stop(IXJ * j)4246 static void aec_stop(IXJ *j)
4247 {
4248 	j->aec_level = AEC_OFF;
4249 	if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4250 		ixj_WriteDSPCommand(0xE022, j);	/* Move AEC filter buffer back */
4251 
4252 		ixj_WriteDSPCommand(0x0700, j);
4253 	}
4254 	if (j->play_mode != -1 && j->rec_mode != -1)
4255 	{
4256 		ixj_WriteDSPCommand(0xB002, j);	/* AEC Stop */
4257 	}
4258 }
4259 
set_play_codec(IXJ * j,int rate)4260 static int set_play_codec(IXJ *j, int rate)
4261 {
4262 	int retval = 0;
4263 
4264 	j->play_codec = rate;
4265 
4266 	switch (rate) {
4267 	case G723_63:
4268 		if (j->ver.low != 0x12 || ixj_convert_loaded) {
4269 			j->play_frame_size = 12;
4270 			j->play_mode = 0;
4271 		} else {
4272 			retval = 1;
4273 		}
4274 		break;
4275 	case G723_53:
4276 		if (j->ver.low != 0x12 || ixj_convert_loaded) {
4277 			j->play_frame_size = 10;
4278 			j->play_mode = 0;
4279 		} else {
4280 			retval = 1;
4281 		}
4282 		break;
4283 	case TS85:
4284 		if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
4285 			j->play_frame_size = 16;
4286 			j->play_mode = 0;
4287 		} else {
4288 			retval = 1;
4289 		}
4290 		break;
4291 	case TS48:
4292 		if (j->ver.low != 0x12 || ixj_convert_loaded) {
4293 			j->play_frame_size = 9;
4294 			j->play_mode = 0;
4295 		} else {
4296 			retval = 1;
4297 		}
4298 		break;
4299 	case TS41:
4300 		if (j->ver.low != 0x12 || ixj_convert_loaded) {
4301 			j->play_frame_size = 8;
4302 			j->play_mode = 0;
4303 		} else {
4304 			retval = 1;
4305 		}
4306 		break;
4307 	case G728:
4308 		if (j->dsp.low != 0x20) {
4309 			j->play_frame_size = 48;
4310 			j->play_mode = 0;
4311 		} else {
4312 			retval = 1;
4313 		}
4314 		break;
4315 	case G729:
4316 		if (j->dsp.low != 0x20) {
4317 			if (!j->flags.g729_loaded) {
4318 				retval = 1;
4319 				break;
4320 			}
4321 			switch (j->baseframe.low) {
4322 			case 0xA0:
4323 				j->play_frame_size = 10;
4324 				break;
4325 			case 0x50:
4326 				j->play_frame_size = 5;
4327 				break;
4328 			default:
4329 				j->play_frame_size = 15;
4330 				break;
4331 			}
4332 			j->play_mode = 0;
4333 		} else {
4334 			retval = 1;
4335 		}
4336 		break;
4337 	case G729B:
4338 		if (j->dsp.low != 0x20) {
4339 			if (!j->flags.g729_loaded) {
4340 				retval = 1;
4341 				break;
4342 			}
4343 			switch (j->baseframe.low) {
4344 			case 0xA0:
4345 				j->play_frame_size = 12;
4346 				break;
4347 			case 0x50:
4348 				j->play_frame_size = 6;
4349 				break;
4350 			default:
4351 				j->play_frame_size = 18;
4352 				break;
4353 			}
4354 			j->play_mode = 0;
4355 		} else {
4356 			retval = 1;
4357 		}
4358 		break;
4359 	case ULAW:
4360 		switch (j->baseframe.low) {
4361 		case 0xA0:
4362 			j->play_frame_size = 80;
4363 			break;
4364 		case 0x50:
4365 			j->play_frame_size = 40;
4366 			break;
4367 		default:
4368 			j->play_frame_size = 120;
4369 			break;
4370 		}
4371 		j->play_mode = 2;
4372 		break;
4373 	case ALAW:
4374 		switch (j->baseframe.low) {
4375 		case 0xA0:
4376 			j->play_frame_size = 80;
4377 			break;
4378 		case 0x50:
4379 			j->play_frame_size = 40;
4380 			break;
4381 		default:
4382 			j->play_frame_size = 120;
4383 			break;
4384 		}
4385 		j->play_mode = 2;
4386 		break;
4387 	case LINEAR16:
4388 		switch (j->baseframe.low) {
4389 		case 0xA0:
4390 			j->play_frame_size = 160;
4391 			break;
4392 		case 0x50:
4393 			j->play_frame_size = 80;
4394 			break;
4395 		default:
4396 			j->play_frame_size = 240;
4397 			break;
4398 		}
4399 		j->play_mode = 6;
4400 		break;
4401 	case LINEAR8:
4402 		switch (j->baseframe.low) {
4403 		case 0xA0:
4404 			j->play_frame_size = 80;
4405 			break;
4406 		case 0x50:
4407 			j->play_frame_size = 40;
4408 			break;
4409 		default:
4410 			j->play_frame_size = 120;
4411 			break;
4412 		}
4413 		j->play_mode = 4;
4414 		break;
4415 	case WSS:
4416 		switch (j->baseframe.low) {
4417 		case 0xA0:
4418 			j->play_frame_size = 80;
4419 			break;
4420 		case 0x50:
4421 			j->play_frame_size = 40;
4422 			break;
4423 		default:
4424 			j->play_frame_size = 120;
4425 			break;
4426 		}
4427 		j->play_mode = 5;
4428 		break;
4429 	default:
4430 		kfree(j->write_buffer);
4431 		j->play_frame_size = 0;
4432 		j->play_mode = -1;
4433 		j->write_buffer = NULL;
4434 		j->write_buffer_size = 0;
4435 		retval = 1;
4436 		break;
4437 	}
4438 	return retval;
4439 }
4440 
ixj_play_start(IXJ * j)4441 static int ixj_play_start(IXJ *j)
4442 {
4443 	unsigned short cmd = 0x0000;
4444 
4445 	if (j->write_buffer) {
4446 		ixj_play_stop(j);
4447 	}
4448 
4449 	if(ixjdebug & 0x0002)
4450 		printk("IXJ %d Starting Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4451 
4452 	j->flags.playing = 1;
4453 	ixj_WriteDSPCommand(0x0FE0, j);	/* Put the DSP in full power mode. */
4454 
4455 	j->flags.play_first_frame = 1;
4456 	j->drybuffer = 0;
4457 
4458 	if (!j->play_mode) {
4459 		switch (j->play_codec) {
4460 		case G723_63:
4461 			cmd = 0x5231;
4462 			break;
4463 		case G723_53:
4464 			cmd = 0x5232;
4465 			break;
4466 		case TS85:
4467 			cmd = 0x5230;	/* TrueSpeech 8.5 */
4468 
4469 			break;
4470 		case TS48:
4471 			cmd = 0x5233;	/* TrueSpeech 4.8 */
4472 
4473 			break;
4474 		case TS41:
4475 			cmd = 0x5234;	/* TrueSpeech 4.1 */
4476 
4477 			break;
4478 		case G728:
4479 			cmd = 0x5235;
4480 			break;
4481 		case G729:
4482 		case G729B:
4483 			cmd = 0x5236;
4484 			break;
4485 		default:
4486 			return 1;
4487 		}
4488 		if (ixj_WriteDSPCommand(cmd, j))
4489 			return -1;
4490 	}
4491 	j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC);
4492 	if (!j->write_buffer) {
4493 		printk("Write buffer allocation for ixj board %d failed!\n", j->board);
4494 		return -ENOMEM;
4495 	}
4496 /*	j->write_buffers_empty = 2; */
4497 	j->write_buffers_empty = 1;
4498 	j->write_buffer_size = j->play_frame_size * 2;
4499 	j->write_buffer_end = j->write_buffer + j->play_frame_size * 2;
4500 	j->write_buffer_rp = j->write_buffer_wp = j->write_buffer;
4501 
4502 	if (ixj_WriteDSPCommand(0x5202, j))		/* Set Poll sync mode */
4503 
4504 		return -1;
4505 
4506 	switch (j->play_mode) {
4507 	case 0:
4508 		cmd = 0x2C03;
4509 		break;
4510 	case 2:
4511 		if (j->ver.low == 0x12) {
4512 			cmd = 0x2C23;
4513 		} else {
4514 			cmd = 0x2C21;
4515 		}
4516 		break;
4517 	case 4:
4518 		if (j->ver.low == 0x12) {
4519 			cmd = 0x2C43;
4520 		} else {
4521 			cmd = 0x2C41;
4522 		}
4523 		break;
4524 	case 5:
4525 		if (j->ver.low == 0x12) {
4526 			cmd = 0x2C53;
4527 		} else {
4528 			cmd = 0x2C51;
4529 		}
4530 		break;
4531 	case 6:
4532 		if (j->ver.low == 0x12) {
4533 			cmd = 0x2C63;
4534 		} else {
4535 			cmd = 0x2C61;
4536 		}
4537 		break;
4538 	}
4539 	if (ixj_WriteDSPCommand(cmd, j))
4540 		return -1;
4541 
4542 	if (ixj_WriteDSPCommand(0x2000, j))		/* Playback C2 */
4543 		return -1;
4544 
4545 	if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j))	/* Playback C3 */
4546 		return -1;
4547 
4548 	if (j->flags.recording) {
4549 		ixj_aec_start(j, j->aec_level);
4550 	}
4551 
4552 	return 0;
4553 }
4554 
ixj_play_stop(IXJ * j)4555 static void ixj_play_stop(IXJ *j)
4556 {
4557 	if (ixjdebug & 0x0002)
4558 		printk("IXJ %d Stopping Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4559 
4560 	kfree(j->write_buffer);
4561 	j->write_buffer = NULL;
4562 	j->write_buffer_size = 0;
4563 	if (j->play_mode > -1) {
4564 		ixj_WriteDSPCommand(0x5221, j);	/* Stop playback and flush buffers.  8022 reference page 9-40 */
4565 
4566 		j->play_mode = -1;
4567 	}
4568 	j->flags.playing = 0;
4569 }
4570 
get_play_level(IXJ * j)4571 static inline int get_play_level(IXJ *j)
4572 {
4573 	int retval;
4574 
4575 	ixj_WriteDSPCommand(0xCF8F, j); /* 8022 Reference page 9-38 */
4576 	return j->ssr.high << 8 | j->ssr.low;
4577 	retval = j->ssr.high << 8 | j->ssr.low;
4578 	retval = (retval * 256) / 240;
4579 	return retval;
4580 }
4581 
ixj_poll(struct file * file_p,poll_table * wait)4582 static unsigned int ixj_poll(struct file *file_p, poll_table * wait)
4583 {
4584 	unsigned int mask = 0;
4585 
4586 	IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
4587 
4588 	poll_wait(file_p, &(j->poll_q), wait);
4589 	if (j->read_buffer_ready > 0)
4590 		mask |= POLLIN | POLLRDNORM;	/* readable */
4591 	if (j->write_buffers_empty > 0)
4592 		mask |= POLLOUT | POLLWRNORM;	/* writable */
4593 	if (j->ex.bytes)
4594 		mask |= POLLPRI;
4595 	return mask;
4596 }
4597 
ixj_play_tone(IXJ * j,char tone)4598 static int ixj_play_tone(IXJ *j, char tone)
4599 {
4600 	if (!j->tone_state) {
4601 		if(ixjdebug & 0x0002) {
4602 			printk("IXJ %d starting tone %d at %ld\n", j->board, tone, jiffies);
4603 		}
4604 		if (j->dsp.low == 0x20) {
4605 			idle(j);
4606 		}
4607 		j->tone_start_jif = jiffies;
4608 
4609 		j->tone_state = 1;
4610 	}
4611 
4612 	j->tone_index = tone;
4613 	if (ixj_WriteDSPCommand(0x6000 + j->tone_index, j))
4614 		return -1;
4615 
4616 	return 0;
4617 }
4618 
ixj_set_tone_on(unsigned short arg,IXJ * j)4619 static int ixj_set_tone_on(unsigned short arg, IXJ *j)
4620 {
4621 	j->tone_on_time = arg;
4622 
4623 	if (ixj_WriteDSPCommand(0x6E04, j))		/* Set Tone On Period */
4624 
4625 		return -1;
4626 
4627 	if (ixj_WriteDSPCommand(arg, j))
4628 		return -1;
4629 
4630 	return 0;
4631 }
4632 
SCI_WaitHighSCI(IXJ * j)4633 static int SCI_WaitHighSCI(IXJ *j)
4634 {
4635 	int cnt;
4636 
4637 	j->pld_scrr.byte = inb_p(j->XILINXbase);
4638 	if (!j->pld_scrr.bits.sci) {
4639 		for (cnt = 0; cnt < 10; cnt++) {
4640 			udelay(32);
4641 			j->pld_scrr.byte = inb_p(j->XILINXbase);
4642 
4643 			if ((j->pld_scrr.bits.sci))
4644 				return 1;
4645 		}
4646 		if (ixjdebug & 0x0001)
4647 			printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte);
4648 		return 0;
4649 	} else
4650 		return 1;
4651 }
4652 
SCI_WaitLowSCI(IXJ * j)4653 static int SCI_WaitLowSCI(IXJ *j)
4654 {
4655 	int cnt;
4656 
4657 	j->pld_scrr.byte = inb_p(j->XILINXbase);
4658 	if (j->pld_scrr.bits.sci) {
4659 		for (cnt = 0; cnt < 10; cnt++) {
4660 			udelay(32);
4661 			j->pld_scrr.byte = inb_p(j->XILINXbase);
4662 
4663 			if (!(j->pld_scrr.bits.sci))
4664 				return 1;
4665 		}
4666 		if (ixjdebug & 0x0001)
4667 			printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte);
4668 		return 0;
4669 	} else
4670 		return 1;
4671 }
4672 
SCI_Control(IXJ * j,int control)4673 static int SCI_Control(IXJ *j, int control)
4674 {
4675 	switch (control) {
4676 	case SCI_End:
4677 		j->pld_scrw.bits.c0 = 0;	/* Set PLD Serial control interface */
4678 
4679 		j->pld_scrw.bits.c1 = 0;	/* to no selection */
4680 
4681 		break;
4682 	case SCI_Enable_DAA:
4683 		j->pld_scrw.bits.c0 = 1;	/* Set PLD Serial control interface */
4684 
4685 		j->pld_scrw.bits.c1 = 0;	/* to write to DAA */
4686 
4687 		break;
4688 	case SCI_Enable_Mixer:
4689 		j->pld_scrw.bits.c0 = 0;	/* Set PLD Serial control interface */
4690 
4691 		j->pld_scrw.bits.c1 = 1;	/* to write to mixer */
4692 
4693 		break;
4694 	case SCI_Enable_EEPROM:
4695 		j->pld_scrw.bits.c0 = 1;	/* Set PLD Serial control interface */
4696 
4697 		j->pld_scrw.bits.c1 = 1;	/* to write to EEPROM */
4698 
4699 		break;
4700 	default:
4701 		return 0;
4702 		break;
4703 	}
4704 	outb_p(j->pld_scrw.byte, j->XILINXbase);
4705 
4706 	switch (control) {
4707 	case SCI_End:
4708 		return 1;
4709 		break;
4710 	case SCI_Enable_DAA:
4711 	case SCI_Enable_Mixer:
4712 	case SCI_Enable_EEPROM:
4713 		if (!SCI_WaitHighSCI(j))
4714 			return 0;
4715 		break;
4716 	default:
4717 		return 0;
4718 		break;
4719 	}
4720 	return 1;
4721 }
4722 
SCI_Prepare(IXJ * j)4723 static int SCI_Prepare(IXJ *j)
4724 {
4725 	if (!SCI_Control(j, SCI_End))
4726 		return 0;
4727 
4728 	if (!SCI_WaitLowSCI(j))
4729 		return 0;
4730 
4731 	return 1;
4732 }
4733 
ixj_get_mixer(long val,IXJ * j)4734 static int ixj_get_mixer(long val, IXJ *j)
4735 {
4736 	int reg = (val & 0x1F00) >> 8;
4737         return j->mix.vol[reg];
4738 }
4739 
ixj_mixer(long val,IXJ * j)4740 static int ixj_mixer(long val, IXJ *j)
4741 {
4742 	BYTES bytes;
4743 
4744 	bytes.high = (val & 0x1F00) >> 8;
4745 	bytes.low = val & 0x00FF;
4746 
4747         /* save mixer value so we can get back later on */
4748         j->mix.vol[bytes.high] = bytes.low;
4749 
4750 	outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03);	/* Load Mixer Address */
4751 
4752 	outb_p(bytes.low, j->XILINXbase + 0x02);	/* Load Mixer Data */
4753 
4754 	SCI_Control(j, SCI_Enable_Mixer);
4755 
4756 	SCI_Control(j, SCI_End);
4757 
4758 	return 0;
4759 }
4760 
daa_load(BYTES * p_bytes,IXJ * j)4761 static int daa_load(BYTES * p_bytes, IXJ *j)
4762 {
4763 	outb_p(p_bytes->high, j->XILINXbase + 0x03);
4764 	outb_p(p_bytes->low, j->XILINXbase + 0x02);
4765 	if (!SCI_Control(j, SCI_Enable_DAA))
4766 		return 0;
4767 	else
4768 		return 1;
4769 }
4770 
ixj_daa_cr4(IXJ * j,char reg)4771 static int ixj_daa_cr4(IXJ *j, char reg)
4772 {
4773 	BYTES bytes;
4774 
4775 	switch (j->daa_mode) {
4776 	case SOP_PU_SLEEP:
4777 		bytes.high = 0x14;
4778 		break;
4779 	case SOP_PU_RINGING:
4780 		bytes.high = 0x54;
4781 		break;
4782 	case SOP_PU_CONVERSATION:
4783 		bytes.high = 0x94;
4784 		break;
4785 	case SOP_PU_PULSEDIALING:
4786 		bytes.high = 0xD4;
4787 		break;
4788 	}
4789 
4790 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg;
4791 
4792 	switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) {
4793 	case 0:
4794 		j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0;
4795 		break;
4796 	case 1:
4797 		j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2;
4798 		break;
4799 	case 2:
4800 		j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1;
4801 		break;
4802 	case 3:
4803 		j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3;
4804 		break;
4805 	}
4806 
4807 	bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
4808 
4809 	if (!daa_load(&bytes, j))
4810 		return 0;
4811 
4812 	if (!SCI_Prepare(j))
4813 		return 0;
4814 
4815 	return 1;
4816 }
4817 
daa_int_read(IXJ * j)4818 static char daa_int_read(IXJ *j)
4819 {
4820 	BYTES bytes;
4821 
4822 	if (!SCI_Prepare(j))
4823 		return 0;
4824 
4825 	bytes.high = 0x38;
4826 	bytes.low = 0x00;
4827 	outb_p(bytes.high, j->XILINXbase + 0x03);
4828 	outb_p(bytes.low, j->XILINXbase + 0x02);
4829 
4830 	if (!SCI_Control(j, SCI_Enable_DAA))
4831 		return 0;
4832 
4833 	bytes.high = inb_p(j->XILINXbase + 0x03);
4834 	bytes.low = inb_p(j->XILINXbase + 0x02);
4835 	if (bytes.low != ALISDAA_ID_BYTE) {
4836 		if (ixjdebug & 0x0001)
4837 			printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4838 		return 0;
4839 	}
4840 	if (!SCI_Control(j, SCI_Enable_DAA))
4841 		return 0;
4842 	if (!SCI_Control(j, SCI_End))
4843 		return 0;
4844 
4845 	bytes.high = inb_p(j->XILINXbase + 0x03);
4846 	bytes.low = inb_p(j->XILINXbase + 0x02);
4847 
4848 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high;
4849 
4850 	return 1;
4851 }
4852 
daa_CR_read(IXJ * j,int cr)4853 static char daa_CR_read(IXJ *j, int cr)
4854 {
4855 	IXJ_WORD wdata;
4856 	BYTES bytes;
4857 
4858 	if (!SCI_Prepare(j))
4859 		return 0;
4860 
4861 	switch (j->daa_mode) {
4862 	case SOP_PU_SLEEP:
4863 		bytes.high = 0x30 + cr;
4864 		break;
4865 	case SOP_PU_RINGING:
4866 		bytes.high = 0x70 + cr;
4867 		break;
4868 	case SOP_PU_CONVERSATION:
4869 		bytes.high = 0xB0 + cr;
4870 		break;
4871 	case SOP_PU_PULSEDIALING:
4872 	default:
4873 		bytes.high = 0xF0 + cr;
4874 		break;
4875 	}
4876 
4877 	bytes.low = 0x00;
4878 
4879 	outb_p(bytes.high, j->XILINXbase + 0x03);
4880 	outb_p(bytes.low, j->XILINXbase + 0x02);
4881 
4882 	if (!SCI_Control(j, SCI_Enable_DAA))
4883 		return 0;
4884 
4885 	bytes.high = inb_p(j->XILINXbase + 0x03);
4886 	bytes.low = inb_p(j->XILINXbase + 0x02);
4887 	if (bytes.low != ALISDAA_ID_BYTE) {
4888 		if (ixjdebug & 0x0001)
4889 			printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4890 		return 0;
4891 	}
4892 	if (!SCI_Control(j, SCI_Enable_DAA))
4893 		return 0;
4894 	if (!SCI_Control(j, SCI_End))
4895 		return 0;
4896 
4897 	wdata.word = inw_p(j->XILINXbase + 0x02);
4898 
4899 	switch(cr){
4900 		case 5:
4901 			j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = wdata.bytes.high;
4902 			break;
4903 		case 4:
4904 			j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = wdata.bytes.high;
4905 			break;
4906 		case 3:
4907 			j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = wdata.bytes.high;
4908 			break;
4909 		case 2:
4910 			j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = wdata.bytes.high;
4911 			break;
4912 		case 1:
4913 			j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = wdata.bytes.high;
4914 			break;
4915 		case 0:
4916 			j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = wdata.bytes.high;
4917 			break;
4918 		default:
4919 			return 0;
4920 	}
4921 	return 1;
4922 }
4923 
ixj_daa_cid_reset(IXJ * j)4924 static int ixj_daa_cid_reset(IXJ *j)
4925 {
4926 	int i;
4927 	BYTES bytes;
4928 
4929 	if (ixjdebug & 0x0002)
4930 		printk("DAA Clearing CID ram\n");
4931 
4932 	if (!SCI_Prepare(j))
4933 		return 0;
4934 
4935 	bytes.high = 0x58;
4936 	bytes.low = 0x00;
4937 	outb_p(bytes.high, j->XILINXbase + 0x03);
4938 	outb_p(bytes.low, j->XILINXbase + 0x02);
4939 
4940 	if (!SCI_Control(j, SCI_Enable_DAA))
4941 		return 0;
4942 
4943 	if (!SCI_WaitHighSCI(j))
4944 		return 0;
4945 
4946 	for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) {
4947 		bytes.high = bytes.low = 0x00;
4948 		outb_p(bytes.high, j->XILINXbase + 0x03);
4949 
4950 		if (i < ALISDAA_CALLERID_SIZE - 1)
4951 			outb_p(bytes.low, j->XILINXbase + 0x02);
4952 
4953 		if (!SCI_Control(j, SCI_Enable_DAA))
4954 			return 0;
4955 
4956 		if (!SCI_WaitHighSCI(j))
4957 			return 0;
4958 
4959 	}
4960 
4961 	if (!SCI_Control(j, SCI_End))
4962 		return 0;
4963 
4964 	if (ixjdebug & 0x0002)
4965 		printk("DAA CID ram cleared\n");
4966 
4967 	return 1;
4968 }
4969 
ixj_daa_cid_read(IXJ * j)4970 static int ixj_daa_cid_read(IXJ *j)
4971 {
4972 	int i;
4973 	BYTES bytes;
4974 	char CID[ALISDAA_CALLERID_SIZE];
4975 	bool mContinue;
4976 	char *pIn, *pOut;
4977 
4978 	if (!SCI_Prepare(j))
4979 		return 0;
4980 
4981 	bytes.high = 0x78;
4982 	bytes.low = 0x00;
4983 	outb_p(bytes.high, j->XILINXbase + 0x03);
4984 	outb_p(bytes.low, j->XILINXbase + 0x02);
4985 
4986 	if (!SCI_Control(j, SCI_Enable_DAA))
4987 		return 0;
4988 
4989 	if (!SCI_WaitHighSCI(j))
4990 		return 0;
4991 
4992 	bytes.high = inb_p(j->XILINXbase + 0x03);
4993 	bytes.low = inb_p(j->XILINXbase + 0x02);
4994 	if (bytes.low != ALISDAA_ID_BYTE) {
4995 		if (ixjdebug & 0x0001)
4996 			printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4997 		return 0;
4998 	}
4999 	for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) {
5000 		bytes.high = bytes.low = 0x00;
5001 		outb_p(bytes.high, j->XILINXbase + 0x03);
5002 		outb_p(bytes.low, j->XILINXbase + 0x02);
5003 
5004 		if (!SCI_Control(j, SCI_Enable_DAA))
5005 			return 0;
5006 
5007 		if (!SCI_WaitHighSCI(j))
5008 			return 0;
5009 
5010 		CID[i + 0] = inb_p(j->XILINXbase + 0x03);
5011 		CID[i + 1] = inb_p(j->XILINXbase + 0x02);
5012 	}
5013 
5014 	if (!SCI_Control(j, SCI_End))
5015 		return 0;
5016 
5017 	pIn = CID;
5018 	pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5019 	mContinue = true;
5020 	while (mContinue) {
5021 		if ((pIn[1] & 0x03) == 0x01) {
5022 			pOut[0] = pIn[0];
5023 		}
5024 		if ((pIn[2] & 0x0c) == 0x04) {
5025 			pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2);
5026 		}
5027 		if ((pIn[3] & 0x30) == 0x10) {
5028 			pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4);
5029 		}
5030 		if ((pIn[4] & 0xc0) == 0x40) {
5031 			pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6);
5032 		} else {
5033 			mContinue = false;
5034 		}
5035 		pIn += 5, pOut += 4;
5036 	}
5037 	memset(&j->cid, 0, sizeof(PHONE_CID));
5038 	pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5039 	pOut += 4;
5040 	strncpy(j->cid.month, pOut, 2);
5041 	pOut += 2;
5042 	strncpy(j->cid.day, pOut, 2);
5043 	pOut += 2;
5044 	strncpy(j->cid.hour, pOut, 2);
5045 	pOut += 2;
5046 	strncpy(j->cid.min, pOut, 2);
5047 	pOut += 3;
5048 	j->cid.numlen = *pOut;
5049 	pOut += 1;
5050 	strncpy(j->cid.number, pOut, j->cid.numlen);
5051 	pOut += j->cid.numlen + 1;
5052 	j->cid.namelen = *pOut;
5053 	pOut += 1;
5054 	strncpy(j->cid.name, pOut, j->cid.namelen);
5055 
5056 	ixj_daa_cid_reset(j);
5057 	return 1;
5058 }
5059 
daa_get_version(IXJ * j)5060 static char daa_get_version(IXJ *j)
5061 {
5062 	BYTES bytes;
5063 
5064 	if (!SCI_Prepare(j))
5065 		return 0;
5066 
5067 	bytes.high = 0x35;
5068 	bytes.low = 0x00;
5069 	outb_p(bytes.high, j->XILINXbase + 0x03);
5070 	outb_p(bytes.low, j->XILINXbase + 0x02);
5071 
5072 	if (!SCI_Control(j, SCI_Enable_DAA))
5073 		return 0;
5074 
5075 	bytes.high = inb_p(j->XILINXbase + 0x03);
5076 	bytes.low = inb_p(j->XILINXbase + 0x02);
5077 	if (bytes.low != ALISDAA_ID_BYTE) {
5078 		if (ixjdebug & 0x0001)
5079 			printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
5080 		return 0;
5081 	}
5082 	if (!SCI_Control(j, SCI_Enable_DAA))
5083 		return 0;
5084 
5085 	if (!SCI_Control(j, SCI_End))
5086 		return 0;
5087 
5088 	bytes.high = inb_p(j->XILINXbase + 0x03);
5089 	bytes.low = inb_p(j->XILINXbase + 0x02);
5090 	if (ixjdebug & 0x0002)
5091 		printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes.high, bytes.low);
5092 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high;
5093 	return bytes.high;
5094 }
5095 
daa_set_mode(IXJ * j,int mode)5096 static int daa_set_mode(IXJ *j, int mode)
5097 {
5098 	/* NOTE:
5099 	      The DAA *MUST* be in the conversation mode if the
5100 	      PSTN line is to be seized (PSTN line off-hook).
5101 	      Taking the PSTN line off-hook while the DAA is in
5102 	      a mode other than conversation mode will cause a
5103 	      hardware failure of the ALIS-A part.
5104 
5105 	   NOTE:
5106 	      The DAA can only go to SLEEP, RINGING or PULSEDIALING modes
5107 	      if the PSTN line is on-hook.  Failure to have the PSTN line
5108 	      in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE
5109 	      ALIS-A part.
5110 	*/
5111 
5112 	BYTES bytes;
5113 
5114 	j->flags.pstn_rmr = 0;
5115 
5116 	if (!SCI_Prepare(j))
5117 		return 0;
5118 
5119 	switch (mode) {
5120 	case SOP_PU_RESET:
5121 		j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
5122 
5123 		outb_p(j->pld_scrw.byte, j->XILINXbase);
5124 		j->pld_slicw.bits.rly2 = 0;
5125 		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5126 		bytes.high = 0x10;
5127 		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5128 		daa_load(&bytes, j);
5129 		if (!SCI_Prepare(j))
5130 			return 0;
5131 
5132 		j->daa_mode = SOP_PU_SLEEP;
5133 		break;
5134 	case SOP_PU_SLEEP:
5135 		if(j->daa_mode == SOP_PU_SLEEP)
5136 		{
5137 			break;
5138 		}
5139 		if (ixjdebug & 0x0008)
5140 			printk(KERN_INFO "phone DAA: SOP_PU_SLEEP at %ld\n", jiffies);
5141 /*		if(j->daa_mode == SOP_PU_CONVERSATION) */
5142 		{
5143 			j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
5144 
5145 			outb_p(j->pld_scrw.byte, j->XILINXbase);
5146 			j->pld_slicw.bits.rly2 = 0;
5147 			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5148 			bytes.high = 0x10;
5149 			bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5150 			daa_load(&bytes, j);
5151 			if (!SCI_Prepare(j))
5152 				return 0;
5153 		}
5154 		j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
5155 
5156 		outb_p(j->pld_scrw.byte, j->XILINXbase);
5157 		j->pld_slicw.bits.rly2 = 0;
5158 		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5159 		bytes.high = 0x10;
5160 		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5161 		daa_load(&bytes, j);
5162 		if (!SCI_Prepare(j))
5163 			return 0;
5164 
5165 		j->daa_mode = SOP_PU_SLEEP;
5166 		j->flags.pstn_ringing = 0;
5167 		j->ex.bits.pstn_ring = 0;
5168 		j->pstn_sleeptil = jiffies + (hertz / 4);
5169 		wake_up_interruptible(&j->read_q);      /* Wake any blocked readers */
5170 		wake_up_interruptible(&j->write_q);     /* Wake any blocked writers */
5171 		wake_up_interruptible(&j->poll_q);      /* Wake any blocked selects */
5172  		break;
5173 	case SOP_PU_RINGING:
5174 		if (ixjdebug & 0x0008)
5175 			printk(KERN_INFO "phone DAA: SOP_PU_RINGING at %ld\n", jiffies);
5176 		j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
5177 
5178 		outb_p(j->pld_scrw.byte, j->XILINXbase);
5179 		j->pld_slicw.bits.rly2 = 0;
5180 		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5181 		bytes.high = 0x50;
5182 		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5183 		daa_load(&bytes, j);
5184 		if (!SCI_Prepare(j))
5185 			return 0;
5186 		j->daa_mode = SOP_PU_RINGING;
5187 		break;
5188 	case SOP_PU_CONVERSATION:
5189 		if (ixjdebug & 0x0008)
5190 			printk(KERN_INFO "phone DAA: SOP_PU_CONVERSATION at %ld\n", jiffies);
5191 		bytes.high = 0x90;
5192 		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5193 		daa_load(&bytes, j);
5194 		if (!SCI_Prepare(j))
5195 			return 0;
5196 		j->pld_slicw.bits.rly2 = 1;
5197 		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5198 		j->pld_scrw.bits.daafsyncen = 1;	/* Turn on DAA Frame Sync */
5199 
5200 		outb_p(j->pld_scrw.byte, j->XILINXbase);
5201 		j->daa_mode = SOP_PU_CONVERSATION;
5202 		j->flags.pstn_ringing = 0;
5203 		j->ex.bits.pstn_ring = 0;
5204 		j->pstn_sleeptil = jiffies;
5205 		j->pstn_ring_start = j->pstn_ring_stop = j->pstn_ring_int = 0;
5206 		break;
5207 	case SOP_PU_PULSEDIALING:
5208 		if (ixjdebug & 0x0008)
5209 			printk(KERN_INFO "phone DAA: SOP_PU_PULSEDIALING at %ld\n", jiffies);
5210 		j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
5211 
5212 		outb_p(j->pld_scrw.byte, j->XILINXbase);
5213 		j->pld_slicw.bits.rly2 = 0;
5214 		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5215 		bytes.high = 0xD0;
5216 		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5217 		daa_load(&bytes, j);
5218 		if (!SCI_Prepare(j))
5219 			return 0;
5220 		j->daa_mode = SOP_PU_PULSEDIALING;
5221 		break;
5222 	default:
5223 		break;
5224 	}
5225 	return 1;
5226 }
5227 
ixj_daa_write(IXJ * j)5228 static int ixj_daa_write(IXJ *j)
5229 {
5230 	BYTES bytes;
5231 
5232 	j->flags.pstncheck = 1;
5233 
5234 	daa_set_mode(j, SOP_PU_SLEEP);
5235 
5236 	if (!SCI_Prepare(j))
5237 		return 0;
5238 
5239 	outb_p(j->pld_scrw.byte, j->XILINXbase);
5240 
5241 	bytes.high = 0x14;
5242 	bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
5243 	if (!daa_load(&bytes, j))
5244 		return 0;
5245 
5246 	bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg;
5247 	bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg;
5248 	if (!daa_load(&bytes, j))
5249 		return 0;
5250 
5251 	bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg;
5252 	bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5253 	if (!daa_load(&bytes, j))
5254 		return 0;
5255 
5256 	if (!SCI_Prepare(j))
5257 		return 0;
5258 
5259 	bytes.high = 0x1F;
5260 	bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg;
5261 	if (!daa_load(&bytes, j))
5262 		return 0;
5263 
5264 	bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg;
5265 	bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg;
5266 	if (!daa_load(&bytes, j))
5267 		return 0;
5268 
5269 	bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg;
5270 	bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg;
5271 	if (!daa_load(&bytes, j))
5272 		return 0;
5273 
5274 	bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg;
5275 	bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg;
5276 	if (!daa_load(&bytes, j))
5277 		return 0;
5278 
5279 	bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg;
5280 	bytes.low = 0x00;
5281 	if (!daa_load(&bytes, j))
5282 		return 0;
5283 
5284 	if (!SCI_Prepare(j))
5285 		return 0;
5286 
5287 	bytes.high = 0x00;
5288 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7];
5289 	if (!daa_load(&bytes, j))
5290 		return 0;
5291 
5292 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6];
5293 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5];
5294 	if (!daa_load(&bytes, j))
5295 		return 0;
5296 
5297 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4];
5298 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3];
5299 	if (!daa_load(&bytes, j))
5300 		return 0;
5301 
5302 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2];
5303 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1];
5304 	if (!daa_load(&bytes, j))
5305 		return 0;
5306 
5307 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0];
5308 	bytes.low = 0x00;
5309 	if (!daa_load(&bytes, j))
5310 		return 0;
5311 
5312 	if (!SCI_Control(j, SCI_End))
5313 		return 0;
5314 	if (!SCI_WaitLowSCI(j))
5315 		return 0;
5316 
5317 	bytes.high = 0x01;
5318 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7];
5319 	if (!daa_load(&bytes, j))
5320 		return 0;
5321 
5322 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6];
5323 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5];
5324 	if (!daa_load(&bytes, j))
5325 		return 0;
5326 
5327 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4];
5328 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3];
5329 	if (!daa_load(&bytes, j))
5330 		return 0;
5331 
5332 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2];
5333 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1];
5334 	if (!daa_load(&bytes, j))
5335 		return 0;
5336 
5337 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0];
5338 	bytes.low = 0x00;
5339 	if (!daa_load(&bytes, j))
5340 		return 0;
5341 
5342 	if (!SCI_Control(j, SCI_End))
5343 		return 0;
5344 	if (!SCI_WaitLowSCI(j))
5345 		return 0;
5346 
5347 	bytes.high = 0x02;
5348 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7];
5349 	if (!daa_load(&bytes, j))
5350 		return 0;
5351 
5352 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6];
5353 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5];
5354 	if (!daa_load(&bytes, j))
5355 		return 0;
5356 
5357 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4];
5358 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3];
5359 	if (!daa_load(&bytes, j))
5360 		return 0;
5361 
5362 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2];
5363 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1];
5364 	if (!daa_load(&bytes, j))
5365 		return 0;
5366 
5367 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0];
5368 	bytes.low = 0x00;
5369 	if (!daa_load(&bytes, j))
5370 		return 0;
5371 
5372 	if (!SCI_Control(j, SCI_End))
5373 		return 0;
5374 	if (!SCI_WaitLowSCI(j))
5375 		return 0;
5376 
5377 	bytes.high = 0x03;
5378 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7];
5379 	if (!daa_load(&bytes, j))
5380 		return 0;
5381 
5382 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6];
5383 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5];
5384 	if (!daa_load(&bytes, j))
5385 		return 0;
5386 
5387 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4];
5388 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3];
5389 	if (!daa_load(&bytes, j))
5390 		return 0;
5391 
5392 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2];
5393 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1];
5394 	if (!daa_load(&bytes, j))
5395 		return 0;
5396 
5397 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0];
5398 	bytes.low = 0x00;
5399 	if (!daa_load(&bytes, j))
5400 		return 0;
5401 
5402 	if (!SCI_Control(j, SCI_End))
5403 		return 0;
5404 	if (!SCI_WaitLowSCI(j))
5405 		return 0;
5406 
5407 	bytes.high = 0x04;
5408 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7];
5409 	if (!daa_load(&bytes, j))
5410 		return 0;
5411 
5412 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6];
5413 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5];
5414 	if (!daa_load(&bytes, j))
5415 		return 0;
5416 
5417 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4];
5418 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3];
5419 	if (!daa_load(&bytes, j))
5420 		return 0;
5421 
5422 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2];
5423 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1];
5424 	if (!daa_load(&bytes, j))
5425 		return 0;
5426 
5427 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0];
5428 	bytes.low = 0x00;
5429 	if (!daa_load(&bytes, j))
5430 		return 0;
5431 
5432 	if (!SCI_Control(j, SCI_End))
5433 		return 0;
5434 	if (!SCI_WaitLowSCI(j))
5435 		return 0;
5436 
5437 	bytes.high = 0x05;
5438 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7];
5439 	if (!daa_load(&bytes, j))
5440 		return 0;
5441 
5442 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6];
5443 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5];
5444 	if (!daa_load(&bytes, j))
5445 		return 0;
5446 
5447 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4];
5448 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3];
5449 	if (!daa_load(&bytes, j))
5450 		return 0;
5451 
5452 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2];
5453 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1];
5454 	if (!daa_load(&bytes, j))
5455 		return 0;
5456 
5457 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0];
5458 	bytes.low = 0x00;
5459 	if (!daa_load(&bytes, j))
5460 		return 0;
5461 
5462 	if (!SCI_Control(j, SCI_End))
5463 		return 0;
5464 	if (!SCI_WaitLowSCI(j))
5465 		return 0;
5466 
5467 	bytes.high = 0x06;
5468 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7];
5469 	if (!daa_load(&bytes, j))
5470 		return 0;
5471 
5472 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6];
5473 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5];
5474 	if (!daa_load(&bytes, j))
5475 		return 0;
5476 
5477 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4];
5478 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3];
5479 	if (!daa_load(&bytes, j))
5480 		return 0;
5481 
5482 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2];
5483 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1];
5484 	if (!daa_load(&bytes, j))
5485 		return 0;
5486 
5487 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0];
5488 	bytes.low = 0x00;
5489 	if (!daa_load(&bytes, j))
5490 		return 0;
5491 
5492 	if (!SCI_Control(j, SCI_End))
5493 		return 0;
5494 	if (!SCI_WaitLowSCI(j))
5495 		return 0;
5496 
5497 	bytes.high = 0x07;
5498 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7];
5499 	if (!daa_load(&bytes, j))
5500 		return 0;
5501 
5502 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6];
5503 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5];
5504 	if (!daa_load(&bytes, j))
5505 		return 0;
5506 
5507 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4];
5508 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3];
5509 	if (!daa_load(&bytes, j))
5510 		return 0;
5511 
5512 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2];
5513 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1];
5514 	if (!daa_load(&bytes, j))
5515 		return 0;
5516 
5517 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0];
5518 	bytes.low = 0x00;
5519 	if (!daa_load(&bytes, j))
5520 		return 0;
5521 
5522 	if (!SCI_Control(j, SCI_End))
5523 		return 0;
5524 	if (!SCI_WaitLowSCI(j))
5525 		return 0;
5526 
5527 	bytes.high = 0x08;
5528 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7];
5529 	if (!daa_load(&bytes, j))
5530 		return 0;
5531 
5532 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6];
5533 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5];
5534 	if (!daa_load(&bytes, j))
5535 		return 0;
5536 
5537 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4];
5538 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3];
5539 	if (!daa_load(&bytes, j))
5540 		return 0;
5541 
5542 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2];
5543 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1];
5544 	if (!daa_load(&bytes, j))
5545 		return 0;
5546 
5547 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0];
5548 	bytes.low = 0x00;
5549 	if (!daa_load(&bytes, j))
5550 		return 0;
5551 
5552 	if (!SCI_Control(j, SCI_End))
5553 		return 0;
5554 	if (!SCI_WaitLowSCI(j))
5555 		return 0;
5556 
5557 	bytes.high = 0x09;
5558 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3];
5559 	if (!daa_load(&bytes, j))
5560 		return 0;
5561 
5562 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2];
5563 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1];
5564 	if (!daa_load(&bytes, j))
5565 		return 0;
5566 
5567 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0];
5568 	bytes.low = 0x00;
5569 	if (!daa_load(&bytes, j))
5570 		return 0;
5571 
5572 	if (!SCI_Control(j, SCI_End))
5573 		return 0;
5574 	if (!SCI_WaitLowSCI(j))
5575 		return 0;
5576 
5577 	bytes.high = 0x0A;
5578 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3];
5579 	if (!daa_load(&bytes, j))
5580 		return 0;
5581 
5582 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2];
5583 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1];
5584 	if (!daa_load(&bytes, j))
5585 		return 0;
5586 
5587 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0];
5588 	bytes.low = 0x00;
5589 	if (!daa_load(&bytes, j))
5590 		return 0;
5591 
5592 	if (!SCI_Control(j, SCI_End))
5593 		return 0;
5594 	if (!SCI_WaitLowSCI(j))
5595 		return 0;
5596 
5597 	bytes.high = 0x0B;
5598 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3];
5599 	if (!daa_load(&bytes, j))
5600 		return 0;
5601 
5602 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2];
5603 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1];
5604 	if (!daa_load(&bytes, j))
5605 		return 0;
5606 
5607 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0];
5608 	bytes.low = 0x00;
5609 	if (!daa_load(&bytes, j))
5610 		return 0;
5611 
5612 	if (!SCI_Control(j, SCI_End))
5613 		return 0;
5614 	if (!SCI_WaitLowSCI(j))
5615 		return 0;
5616 
5617 	bytes.high = 0x0C;
5618 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3];
5619 	if (!daa_load(&bytes, j))
5620 		return 0;
5621 
5622 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2];
5623 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1];
5624 	if (!daa_load(&bytes, j))
5625 		return 0;
5626 
5627 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0];
5628 	bytes.low = 0x00;
5629 	if (!daa_load(&bytes, j))
5630 		return 0;
5631 
5632 	if (!SCI_Control(j, SCI_End))
5633 		return 0;
5634 	if (!SCI_WaitLowSCI(j))
5635 		return 0;
5636 
5637 	bytes.high = 0x0D;
5638 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3];
5639 	if (!daa_load(&bytes, j))
5640 		return 0;
5641 
5642 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2];
5643 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1];
5644 	if (!daa_load(&bytes, j))
5645 		return 0;
5646 
5647 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0];
5648 	bytes.low = 0x00;
5649 	if (!daa_load(&bytes, j))
5650 		return 0;
5651 
5652 	if (!SCI_Control(j, SCI_End))
5653 		return 0;
5654 	if (!SCI_WaitLowSCI(j))
5655 		return 0;
5656 
5657 	bytes.high = 0x0E;
5658 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7];
5659 	if (!daa_load(&bytes, j))
5660 		return 0;
5661 
5662 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6];
5663 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5];
5664 	if (!daa_load(&bytes, j))
5665 		return 0;
5666 
5667 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4];
5668 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3];
5669 	if (!daa_load(&bytes, j))
5670 		return 0;
5671 
5672 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2];
5673 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1];
5674 	if (!daa_load(&bytes, j))
5675 		return 0;
5676 
5677 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0];
5678 	bytes.low = 0x00;
5679 	if (!daa_load(&bytes, j))
5680 		return 0;
5681 
5682 	if (!SCI_Control(j, SCI_End))
5683 		return 0;
5684 	if (!SCI_WaitLowSCI(j))
5685 		return 0;
5686 
5687 	bytes.high = 0x0F;
5688 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7];
5689 	if (!daa_load(&bytes, j))
5690 		return 0;
5691 
5692 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6];
5693 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5];
5694 	if (!daa_load(&bytes, j))
5695 		return 0;
5696 
5697 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4];
5698 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3];
5699 	if (!daa_load(&bytes, j))
5700 		return 0;
5701 
5702 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2];
5703 	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1];
5704 	if (!daa_load(&bytes, j))
5705 		return 0;
5706 
5707 	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0];
5708 	bytes.low = 0x00;
5709 	if (!daa_load(&bytes, j))
5710 		return 0;
5711 
5712 	udelay(32);
5713 	j->pld_scrr.byte = inb_p(j->XILINXbase);
5714 	if (!SCI_Control(j, SCI_End))
5715 		return 0;
5716 
5717 	outb_p(j->pld_scrw.byte, j->XILINXbase);
5718 
5719 	if (ixjdebug & 0x0002)
5720 		printk("DAA Coefficients Loaded\n");
5721 
5722 	j->flags.pstncheck = 0;
5723 	return 1;
5724 }
5725 
ixj_set_tone_off(unsigned short arg,IXJ * j)5726 static int ixj_set_tone_off(unsigned short arg, IXJ *j)
5727 {
5728 	j->tone_off_time = arg;
5729 	if (ixj_WriteDSPCommand(0x6E05, j))		/* Set Tone Off Period */
5730 
5731 		return -1;
5732 	if (ixj_WriteDSPCommand(arg, j))
5733 		return -1;
5734 	return 0;
5735 }
5736 
ixj_get_tone_on(IXJ * j)5737 static int ixj_get_tone_on(IXJ *j)
5738 {
5739 	if (ixj_WriteDSPCommand(0x6E06, j))		/* Get Tone On Period */
5740 
5741 		return -1;
5742 	return 0;
5743 }
5744 
ixj_get_tone_off(IXJ * j)5745 static int ixj_get_tone_off(IXJ *j)
5746 {
5747 	if (ixj_WriteDSPCommand(0x6E07, j))		/* Get Tone Off Period */
5748 
5749 		return -1;
5750 	return 0;
5751 }
5752 
ixj_busytone(IXJ * j)5753 static void ixj_busytone(IXJ *j)
5754 {
5755 	j->flags.ringback = 0;
5756 	j->flags.dialtone = 0;
5757 	j->flags.busytone = 1;
5758 	ixj_set_tone_on(0x07D0, j);
5759 	ixj_set_tone_off(0x07D0, j);
5760 	ixj_play_tone(j, 27);
5761 }
5762 
ixj_dialtone(IXJ * j)5763 static void ixj_dialtone(IXJ *j)
5764 {
5765 	j->flags.ringback = 0;
5766 	j->flags.dialtone = 1;
5767 	j->flags.busytone = 0;
5768 	if (j->dsp.low == 0x20) {
5769 		return;
5770 	} else {
5771 		ixj_set_tone_on(0xFFFF, j);
5772 		ixj_set_tone_off(0x0000, j);
5773 		ixj_play_tone(j, 25);
5774 	}
5775 }
5776 
ixj_cpt_stop(IXJ * j)5777 static void ixj_cpt_stop(IXJ *j)
5778 {
5779 	if(j->tone_state || j->tone_cadence_state)
5780 	{
5781 		j->flags.dialtone = 0;
5782 		j->flags.busytone = 0;
5783 		j->flags.ringback = 0;
5784 		ixj_set_tone_on(0x0001, j);
5785 		ixj_set_tone_off(0x0000, j);
5786 		ixj_play_tone(j, 0);
5787 		j->tone_state = j->tone_cadence_state = 0;
5788 		if (j->cadence_t) {
5789 			kfree(j->cadence_t->ce);
5790 			kfree(j->cadence_t);
5791 			j->cadence_t = NULL;
5792 		}
5793 	}
5794 	if (j->play_mode == -1 && j->rec_mode == -1)
5795 		idle(j);
5796 	if (j->play_mode != -1 && j->dsp.low == 0x20)
5797 		ixj_play_start(j);
5798 	if (j->rec_mode != -1 && j->dsp.low == 0x20)
5799 		ixj_record_start(j);
5800 }
5801 
ixj_ringback(IXJ * j)5802 static void ixj_ringback(IXJ *j)
5803 {
5804 	j->flags.busytone = 0;
5805 	j->flags.dialtone = 0;
5806 	j->flags.ringback = 1;
5807 	ixj_set_tone_on(0x0FA0, j);
5808 	ixj_set_tone_off(0x2EE0, j);
5809 	ixj_play_tone(j, 26);
5810 }
5811 
ixj_testram(IXJ * j)5812 static void ixj_testram(IXJ *j)
5813 {
5814 	ixj_WriteDSPCommand(0x3001, j);	/* Test External SRAM */
5815 }
5816 
ixj_build_cadence(IXJ * j,IXJ_CADENCE __user * cp)5817 static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp)
5818 {
5819 	ixj_cadence *lcp;
5820 	IXJ_CADENCE_ELEMENT __user *cep;
5821 	IXJ_CADENCE_ELEMENT *lcep;
5822 	IXJ_TONE ti;
5823 	int err;
5824 
5825 	lcp = kmalloc(sizeof(ixj_cadence), GFP_KERNEL);
5826 	if (lcp == NULL)
5827 		return -ENOMEM;
5828 
5829 	err = -EFAULT;
5830 	if (copy_from_user(&lcp->elements_used,
5831 			   &cp->elements_used, sizeof(int)))
5832 		goto out;
5833 	if (copy_from_user(&lcp->termination,
5834 			   &cp->termination, sizeof(IXJ_CADENCE_TERM)))
5835 		goto out;
5836 	if (get_user(cep, &cp->ce))
5837 		goto out;
5838 
5839 	err = -EINVAL;
5840 	if ((unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE_ELEMENT))
5841 		goto out;
5842 
5843 	err = -ENOMEM;
5844 	lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL);
5845 	if (!lcep)
5846 		goto out;
5847 
5848 	err = -EFAULT;
5849 	if (copy_from_user(lcep, cep, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used))
5850 		goto out1;
5851 
5852 	if (j->cadence_t) {
5853 		kfree(j->cadence_t->ce);
5854 		kfree(j->cadence_t);
5855 	}
5856 	lcp->ce = (void *) lcep;
5857 	j->cadence_t = lcp;
5858 	j->tone_cadence_state = 0;
5859 	ixj_set_tone_on(lcp->ce[0].tone_on_time, j);
5860 	ixj_set_tone_off(lcp->ce[0].tone_off_time, j);
5861 	if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
5862 		ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
5863 		ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
5864 		ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
5865 		ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
5866 		ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
5867 		ixj_init_tone(j, &ti);
5868 	}
5869 	ixj_play_tone(j, lcp->ce[0].index);
5870 	return 1;
5871 out1:
5872 	kfree(lcep);
5873 out:
5874 	kfree(lcp);
5875 	return err;
5876 }
5877 
ixj_build_filter_cadence(IXJ * j,IXJ_FILTER_CADENCE __user * cp)5878 static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp)
5879 {
5880 	IXJ_FILTER_CADENCE *lcp;
5881 	lcp = kmalloc(sizeof(IXJ_FILTER_CADENCE), GFP_KERNEL);
5882 	if (lcp == NULL) {
5883 		if(ixjdebug & 0x0001) {
5884 			printk(KERN_INFO "Could not allocate memory for cadence\n");
5885 		}
5886 		return -ENOMEM;
5887         }
5888 	if (copy_from_user(lcp, cp, sizeof(IXJ_FILTER_CADENCE))) {
5889 		if(ixjdebug & 0x0001) {
5890 			printk(KERN_INFO "Could not copy cadence to kernel\n");
5891 		}
5892 		kfree(lcp);
5893 		return -EFAULT;
5894 	}
5895 	if (lcp->filter > 5) {
5896 		if(ixjdebug & 0x0001) {
5897 			printk(KERN_INFO "Cadence out of range\n");
5898 		}
5899 		kfree(lcp);
5900 		return -1;
5901 	}
5902 	j->cadence_f[lcp->filter].state = 0;
5903 	j->cadence_f[lcp->filter].enable = lcp->enable;
5904 	j->filter_en[lcp->filter] = j->cadence_f[lcp->filter].en_filter = lcp->en_filter;
5905 	j->cadence_f[lcp->filter].on1 = lcp->on1;
5906 	j->cadence_f[lcp->filter].on1min = 0;
5907 	j->cadence_f[lcp->filter].on1max = 0;
5908 	j->cadence_f[lcp->filter].off1 = lcp->off1;
5909 	j->cadence_f[lcp->filter].off1min = 0;
5910 	j->cadence_f[lcp->filter].off1max = 0;
5911 	j->cadence_f[lcp->filter].on2 = lcp->on2;
5912 	j->cadence_f[lcp->filter].on2min = 0;
5913 	j->cadence_f[lcp->filter].on2max = 0;
5914 	j->cadence_f[lcp->filter].off2 = lcp->off2;
5915 	j->cadence_f[lcp->filter].off2min = 0;
5916 	j->cadence_f[lcp->filter].off2max = 0;
5917 	j->cadence_f[lcp->filter].on3 = lcp->on3;
5918 	j->cadence_f[lcp->filter].on3min = 0;
5919 	j->cadence_f[lcp->filter].on3max = 0;
5920 	j->cadence_f[lcp->filter].off3 = lcp->off3;
5921 	j->cadence_f[lcp->filter].off3min = 0;
5922 	j->cadence_f[lcp->filter].off3max = 0;
5923 	if(ixjdebug & 0x0002) {
5924 		printk(KERN_INFO "Cadence %d loaded\n", lcp->filter);
5925 	}
5926 	kfree(lcp);
5927 	return 0;
5928 }
5929 
add_caps(IXJ * j)5930 static void add_caps(IXJ *j)
5931 {
5932 	j->caps = 0;
5933 	j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET;
5934 	strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)");
5935 	j->caplist[j->caps].captype = vendor;
5936 	j->caplist[j->caps].handle = j->caps++;
5937 	j->caplist[j->caps].captype = device;
5938 	switch (j->cardtype) {
5939 	case QTI_PHONEJACK:
5940 		strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK");
5941 		break;
5942 	case QTI_LINEJACK:
5943 		strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK");
5944 		break;
5945 	case QTI_PHONEJACK_LITE:
5946 		strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite");
5947 		break;
5948 	case QTI_PHONEJACK_PCI:
5949 		strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI");
5950 		break;
5951 	case QTI_PHONECARD:
5952 		strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneCARD");
5953 		break;
5954 	}
5955 	j->caplist[j->caps].cap = j->cardtype;
5956 	j->caplist[j->caps].handle = j->caps++;
5957 	strcpy(j->caplist[j->caps].desc, "POTS");
5958 	j->caplist[j->caps].captype = port;
5959 	j->caplist[j->caps].cap = pots;
5960 	j->caplist[j->caps].handle = j->caps++;
5961 
5962  	/* add devices that can do speaker/mic */
5963 	switch (j->cardtype) {
5964 	case QTI_PHONEJACK:
5965 	case QTI_LINEJACK:
5966 	case QTI_PHONEJACK_PCI:
5967 	case QTI_PHONECARD:
5968 		strcpy(j->caplist[j->caps].desc, "SPEAKER");
5969 		j->caplist[j->caps].captype = port;
5970 		j->caplist[j->caps].cap = speaker;
5971 		j->caplist[j->caps].handle = j->caps++;
5972         default:
5973      		break;
5974 	}
5975 
5976  	/* add devices that can do handset */
5977 	switch (j->cardtype) {
5978 	case QTI_PHONEJACK:
5979 		strcpy(j->caplist[j->caps].desc, "HANDSET");
5980 		j->caplist[j->caps].captype = port;
5981 		j->caplist[j->caps].cap = handset;
5982 		j->caplist[j->caps].handle = j->caps++;
5983 		break;
5984         default:
5985      		break;
5986 	}
5987 
5988  	/* add devices that can do PSTN */
5989 	switch (j->cardtype) {
5990 	case QTI_LINEJACK:
5991 		strcpy(j->caplist[j->caps].desc, "PSTN");
5992 		j->caplist[j->caps].captype = port;
5993 		j->caplist[j->caps].cap = pstn;
5994 		j->caplist[j->caps].handle = j->caps++;
5995 		break;
5996         default:
5997      		break;
5998 	}
5999 
6000 	/* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */
6001 	strcpy(j->caplist[j->caps].desc, "ULAW");
6002 	j->caplist[j->caps].captype = codec;
6003 	j->caplist[j->caps].cap = ULAW;
6004 	j->caplist[j->caps].handle = j->caps++;
6005 
6006 	strcpy(j->caplist[j->caps].desc, "LINEAR 16 bit");
6007 	j->caplist[j->caps].captype = codec;
6008 	j->caplist[j->caps].cap = LINEAR16;
6009 	j->caplist[j->caps].handle = j->caps++;
6010 
6011 	strcpy(j->caplist[j->caps].desc, "LINEAR 8 bit");
6012 	j->caplist[j->caps].captype = codec;
6013 	j->caplist[j->caps].cap = LINEAR8;
6014 	j->caplist[j->caps].handle = j->caps++;
6015 
6016 	strcpy(j->caplist[j->caps].desc, "Windows Sound System");
6017 	j->caplist[j->caps].captype = codec;
6018 	j->caplist[j->caps].cap = WSS;
6019 	j->caplist[j->caps].handle = j->caps++;
6020 
6021 	/* software ALAW codec, made from ULAW */
6022 	strcpy(j->caplist[j->caps].desc, "ALAW");
6023 	j->caplist[j->caps].captype = codec;
6024 	j->caplist[j->caps].cap = ALAW;
6025 	j->caplist[j->caps].handle = j->caps++;
6026 
6027 	/* version 12 of the 8020 does the following codecs in a broken way */
6028 	if (j->dsp.low != 0x20 || j->ver.low != 0x12) {
6029 		strcpy(j->caplist[j->caps].desc, "G.723.1 6.3kbps");
6030 		j->caplist[j->caps].captype = codec;
6031 		j->caplist[j->caps].cap = G723_63;
6032 		j->caplist[j->caps].handle = j->caps++;
6033 
6034 		strcpy(j->caplist[j->caps].desc, "G.723.1 5.3kbps");
6035 		j->caplist[j->caps].captype = codec;
6036 		j->caplist[j->caps].cap = G723_53;
6037 		j->caplist[j->caps].handle = j->caps++;
6038 
6039 		strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.8kbps");
6040 		j->caplist[j->caps].captype = codec;
6041 		j->caplist[j->caps].cap = TS48;
6042 		j->caplist[j->caps].handle = j->caps++;
6043 
6044 		strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.1kbps");
6045 		j->caplist[j->caps].captype = codec;
6046 		j->caplist[j->caps].cap = TS41;
6047 		j->caplist[j->caps].handle = j->caps++;
6048 	}
6049 
6050 	/* 8020 chips can do TS8.5 native, and 8021/8022 can load it */
6051 	if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
6052 		strcpy(j->caplist[j->caps].desc, "TrueSpeech 8.5kbps");
6053 		j->caplist[j->caps].captype = codec;
6054 		j->caplist[j->caps].cap = TS85;
6055 		j->caplist[j->caps].handle = j->caps++;
6056 	}
6057 
6058 	/* 8021 chips can do G728 */
6059 	if (j->dsp.low == 0x21) {
6060 		strcpy(j->caplist[j->caps].desc, "G.728 16kbps");
6061 		j->caplist[j->caps].captype = codec;
6062 		j->caplist[j->caps].cap = G728;
6063 		j->caplist[j->caps].handle = j->caps++;
6064 	}
6065 
6066 	/* 8021/8022 chips can do G729 if loaded */
6067 	if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6068 		strcpy(j->caplist[j->caps].desc, "G.729A 8kbps");
6069 		j->caplist[j->caps].captype = codec;
6070 		j->caplist[j->caps].cap = G729;
6071 		j->caplist[j->caps].handle = j->caps++;
6072 	}
6073 	if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6074 		strcpy(j->caplist[j->caps].desc, "G.729B 8kbps");
6075 		j->caplist[j->caps].captype = codec;
6076 		j->caplist[j->caps].cap = G729B;
6077 		j->caplist[j->caps].handle = j->caps++;
6078 	}
6079 }
6080 
capabilities_check(IXJ * j,struct phone_capability * pcreq)6081 static int capabilities_check(IXJ *j, struct phone_capability *pcreq)
6082 {
6083 	int cnt;
6084 	int retval = 0;
6085 	for (cnt = 0; cnt < j->caps; cnt++) {
6086 		if (pcreq->captype == j->caplist[cnt].captype
6087 		    && pcreq->cap == j->caplist[cnt].cap) {
6088 			retval = 1;
6089 			break;
6090 		}
6091 	}
6092 	return retval;
6093 }
6094 
do_ixj_ioctl(struct file * file_p,unsigned int cmd,unsigned long arg)6095 static long do_ixj_ioctl(struct file *file_p, unsigned int cmd, unsigned long arg)
6096 {
6097 	IXJ_TONE ti;
6098 	IXJ_FILTER jf;
6099 	IXJ_FILTER_RAW jfr;
6100 	void __user *argp = (void __user *)arg;
6101 	struct inode *inode = file_p->f_path.dentry->d_inode;
6102 	unsigned int minor = iminor(inode);
6103 	unsigned int raise, mant;
6104 	int board = NUM(inode);
6105 
6106 	IXJ *j = get_ixj(NUM(inode));
6107 
6108 	int retval = 0;
6109 
6110 	/*
6111 	 *    Set up locks to ensure that only one process is talking to the DSP at a time.
6112 	 *    This is necessary to keep the DSP from locking up.
6113 	 */
6114 	while(test_and_set_bit(board, (void *)&j->busyflags) != 0)
6115 		schedule_timeout_interruptible(1);
6116 	if (ixjdebug & 0x0040)
6117 		printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6118 	if (minor >= IXJMAX) {
6119 		clear_bit(board, &j->busyflags);
6120 		return -ENODEV;
6121 	}
6122 	/*
6123 	 *    Check ioctls only root can use.
6124 	 */
6125 	if (!capable(CAP_SYS_ADMIN)) {
6126 		switch (cmd) {
6127 		case IXJCTL_TESTRAM:
6128 		case IXJCTL_HZ:
6129 			retval = -EPERM;
6130 		}
6131 	}
6132 	switch (cmd) {
6133 	case IXJCTL_TESTRAM:
6134 		ixj_testram(j);
6135 		retval = (j->ssr.high << 8) + j->ssr.low;
6136 		break;
6137 	case IXJCTL_CARDTYPE:
6138 		retval = j->cardtype;
6139 		break;
6140 	case IXJCTL_SERIAL:
6141 		retval = j->serial;
6142 		break;
6143 	case IXJCTL_VERSION:
6144 		{
6145 			char arg_str[100];
6146 			snprintf(arg_str, sizeof(arg_str),
6147 				"\nDriver version %i.%i.%i", IXJ_VER_MAJOR,
6148 				IXJ_VER_MINOR, IXJ_BLD_VER);
6149 			if (copy_to_user(argp, arg_str, strlen(arg_str)))
6150 				retval = -EFAULT;
6151 		}
6152 		break;
6153 	case PHONE_RING_CADENCE:
6154 		j->ring_cadence = arg;
6155 		break;
6156 	case IXJCTL_CIDCW:
6157 		if(arg) {
6158 			if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
6159 				retval = -EFAULT;
6160 				break;
6161 			}
6162 		} else {
6163 			memset(&j->cid_send, 0, sizeof(PHONE_CID));
6164 		}
6165 		ixj_write_cidcw(j);
6166 		break;
6167         /* Binary compatbility */
6168         case OLD_PHONE_RING_START:
6169                 arg = 0;
6170                 /* Fall through */
6171  	case PHONE_RING_START:
6172 		if(arg) {
6173 			if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
6174 				retval = -EFAULT;
6175 				break;
6176 			}
6177 			ixj_write_cid(j);
6178 		} else {
6179 			memset(&j->cid_send, 0, sizeof(PHONE_CID));
6180 		}
6181 		ixj_ring_start(j);
6182 		break;
6183 	case PHONE_RING_STOP:
6184 		j->flags.cringing = 0;
6185 		if(j->cadence_f[5].enable) {
6186 			j->cadence_f[5].state = 0;
6187 		}
6188 		ixj_ring_off(j);
6189 		break;
6190 	case PHONE_RING:
6191 		retval = ixj_ring(j);
6192 		break;
6193 	case PHONE_EXCEPTION:
6194 		retval = j->ex.bytes;
6195 		if(j->ex.bits.flash) {
6196 			j->flash_end = 0;
6197 			j->ex.bits.flash = 0;
6198 		}
6199 		j->ex.bits.pstn_ring = 0;
6200 		j->ex.bits.caller_id = 0;
6201 		j->ex.bits.pstn_wink = 0;
6202 		j->ex.bits.f0 = 0;
6203 		j->ex.bits.f1 = 0;
6204 		j->ex.bits.f2 = 0;
6205 		j->ex.bits.f3 = 0;
6206 		j->ex.bits.fc0 = 0;
6207 		j->ex.bits.fc1 = 0;
6208 		j->ex.bits.fc2 = 0;
6209 		j->ex.bits.fc3 = 0;
6210 		j->ex.bits.reserved = 0;
6211 		break;
6212 	case PHONE_HOOKSTATE:
6213 		j->ex.bits.hookstate = 0;
6214 		retval = j->hookstate;  //j->r_hook;
6215 		break;
6216 	case IXJCTL_SET_LED:
6217 		LED_SetState(arg, j);
6218 		break;
6219 	case PHONE_FRAME:
6220 		retval = set_base_frame(j, arg);
6221 		break;
6222 	case PHONE_REC_CODEC:
6223 		retval = set_rec_codec(j, arg);
6224 		break;
6225 	case PHONE_VAD:
6226 		ixj_vad(j, arg);
6227 		break;
6228 	case PHONE_REC_START:
6229 		ixj_record_start(j);
6230 		break;
6231 	case PHONE_REC_STOP:
6232 		ixj_record_stop(j);
6233 		break;
6234 	case PHONE_REC_DEPTH:
6235 		set_rec_depth(j, arg);
6236 		break;
6237 	case PHONE_REC_VOLUME:
6238 		if(arg == -1) {
6239 			retval = get_rec_volume(j);
6240 		}
6241 		else {
6242 			set_rec_volume(j, arg);
6243 			retval = arg;
6244 		}
6245 		break;
6246 	case PHONE_REC_VOLUME_LINEAR:
6247 		if(arg == -1) {
6248 			retval = get_rec_volume_linear(j);
6249 		}
6250 		else {
6251 			set_rec_volume_linear(j, arg);
6252 			retval = arg;
6253 		}
6254 		break;
6255 	case IXJCTL_DTMF_PRESCALE:
6256 		if(arg == -1) {
6257 			retval = get_dtmf_prescale(j);
6258 		}
6259 		else {
6260 			set_dtmf_prescale(j, arg);
6261 			retval = arg;
6262 		}
6263 		break;
6264 	case PHONE_REC_LEVEL:
6265 		retval = get_rec_level(j);
6266 		break;
6267 	case IXJCTL_SC_RXG:
6268 		retval = ixj_siadc(j, arg);
6269 		break;
6270 	case IXJCTL_SC_TXG:
6271 		retval = ixj_sidac(j, arg);
6272 		break;
6273 	case IXJCTL_AEC_START:
6274 		ixj_aec_start(j, arg);
6275 		break;
6276 	case IXJCTL_AEC_STOP:
6277 		aec_stop(j);
6278 		break;
6279 	case IXJCTL_AEC_GET_LEVEL:
6280 		retval = j->aec_level;
6281 		break;
6282 	case PHONE_PLAY_CODEC:
6283 		retval = set_play_codec(j, arg);
6284 		break;
6285 	case PHONE_PLAY_START:
6286 		retval = ixj_play_start(j);
6287 		break;
6288 	case PHONE_PLAY_STOP:
6289 		ixj_play_stop(j);
6290 		break;
6291 	case PHONE_PLAY_DEPTH:
6292 		set_play_depth(j, arg);
6293 		break;
6294 	case PHONE_PLAY_VOLUME:
6295 		if(arg == -1) {
6296 			retval = get_play_volume(j);
6297 		}
6298 		else {
6299 			set_play_volume(j, arg);
6300 			retval = arg;
6301 		}
6302 		break;
6303 	case PHONE_PLAY_VOLUME_LINEAR:
6304 		if(arg == -1) {
6305 			retval = get_play_volume_linear(j);
6306 		}
6307 		else {
6308 			set_play_volume_linear(j, arg);
6309 			retval = arg;
6310 		}
6311 		break;
6312 	case PHONE_PLAY_LEVEL:
6313 		retval = get_play_level(j);
6314 		break;
6315 	case IXJCTL_DSP_TYPE:
6316 		retval = (j->dsp.high << 8) + j->dsp.low;
6317 		break;
6318 	case IXJCTL_DSP_VERSION:
6319 		retval = (j->ver.high << 8) + j->ver.low;
6320 		break;
6321 	case IXJCTL_HZ:
6322 		hertz = arg;
6323 		break;
6324 	case IXJCTL_RATE:
6325 		if (arg > hertz)
6326 			retval = -1;
6327 		else
6328 			samplerate = arg;
6329 		break;
6330 	case IXJCTL_DRYBUFFER_READ:
6331 		put_user(j->drybuffer, (unsigned long __user *) argp);
6332 		break;
6333 	case IXJCTL_DRYBUFFER_CLEAR:
6334 		j->drybuffer = 0;
6335 		break;
6336 	case IXJCTL_FRAMES_READ:
6337 		put_user(j->framesread, (unsigned long __user *) argp);
6338 		break;
6339 	case IXJCTL_FRAMES_WRITTEN:
6340 		put_user(j->frameswritten, (unsigned long __user *) argp);
6341 		break;
6342 	case IXJCTL_READ_WAIT:
6343 		put_user(j->read_wait, (unsigned long __user *) argp);
6344 		break;
6345 	case IXJCTL_WRITE_WAIT:
6346 		put_user(j->write_wait, (unsigned long __user *) argp);
6347 		break;
6348 	case PHONE_MAXRINGS:
6349 		j->maxrings = arg;
6350 		break;
6351 	case PHONE_SET_TONE_ON_TIME:
6352 		ixj_set_tone_on(arg, j);
6353 		break;
6354 	case PHONE_SET_TONE_OFF_TIME:
6355 		ixj_set_tone_off(arg, j);
6356 		break;
6357 	case PHONE_GET_TONE_ON_TIME:
6358 		if (ixj_get_tone_on(j)) {
6359 			retval = -1;
6360 		} else {
6361 			retval = (j->ssr.high << 8) + j->ssr.low;
6362 		}
6363 		break;
6364 	case PHONE_GET_TONE_OFF_TIME:
6365 		if (ixj_get_tone_off(j)) {
6366 			retval = -1;
6367 		} else {
6368 			retval = (j->ssr.high << 8) + j->ssr.low;
6369 		}
6370 		break;
6371 	case PHONE_PLAY_TONE:
6372 		if (!j->tone_state)
6373 			retval = ixj_play_tone(j, arg);
6374 		else
6375 			retval = -1;
6376 		break;
6377 	case PHONE_GET_TONE_STATE:
6378 		retval = j->tone_state;
6379 		break;
6380 	case PHONE_DTMF_READY:
6381 		retval = j->ex.bits.dtmf_ready;
6382 		break;
6383 	case PHONE_GET_DTMF:
6384 		if (ixj_hookstate(j)) {
6385 			if (j->dtmf_rp != j->dtmf_wp) {
6386 				retval = j->dtmfbuffer[j->dtmf_rp];
6387 				j->dtmf_rp++;
6388 				if (j->dtmf_rp == 79)
6389 					j->dtmf_rp = 0;
6390 				if (j->dtmf_rp == j->dtmf_wp) {
6391 					j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6392 				}
6393 			}
6394 		}
6395 		break;
6396 	case PHONE_GET_DTMF_ASCII:
6397 		if (ixj_hookstate(j)) {
6398 			if (j->dtmf_rp != j->dtmf_wp) {
6399 				switch (j->dtmfbuffer[j->dtmf_rp]) {
6400 				case 10:
6401 					retval = 42;	/* '*'; */
6402 
6403 					break;
6404 				case 11:
6405 					retval = 48;	/*'0'; */
6406 
6407 					break;
6408 				case 12:
6409 					retval = 35;	/*'#'; */
6410 
6411 					break;
6412 				case 28:
6413 					retval = 65;	/*'A'; */
6414 
6415 					break;
6416 				case 29:
6417 					retval = 66;	/*'B'; */
6418 
6419 					break;
6420 				case 30:
6421 					retval = 67;	/*'C'; */
6422 
6423 					break;
6424 				case 31:
6425 					retval = 68;	/*'D'; */
6426 
6427 					break;
6428 				default:
6429 					retval = 48 + j->dtmfbuffer[j->dtmf_rp];
6430 					break;
6431 				}
6432 				j->dtmf_rp++;
6433 				if (j->dtmf_rp == 79)
6434 					j->dtmf_rp = 0;
6435 				if(j->dtmf_rp == j->dtmf_wp)
6436 				{
6437 					j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6438 				}
6439 			}
6440 		}
6441 		break;
6442 	case PHONE_DTMF_OOB:
6443 		j->flags.dtmf_oob = arg;
6444 		break;
6445 	case PHONE_DIALTONE:
6446 		ixj_dialtone(j);
6447 		break;
6448 	case PHONE_BUSY:
6449 		ixj_busytone(j);
6450 		break;
6451 	case PHONE_RINGBACK:
6452 		ixj_ringback(j);
6453 		break;
6454 	case PHONE_WINK:
6455 		if(j->cardtype == QTI_PHONEJACK)
6456 			retval = -1;
6457 		else
6458 			retval = ixj_wink(j);
6459 		break;
6460 	case PHONE_CPT_STOP:
6461 		ixj_cpt_stop(j);
6462 		break;
6463         case PHONE_QUERY_CODEC:
6464         {
6465                 struct phone_codec_data pd;
6466                 int val;
6467                 int proto_size[] = {
6468                         -1,
6469                         12, 10, 16, 9, 8, 48, 5,
6470                         40, 40, 80, 40, 40, 6
6471                 };
6472                 if(copy_from_user(&pd, argp, sizeof(pd))) {
6473                         retval = -EFAULT;
6474 			break;
6475 		}
6476                 if(pd.type<1 || pd.type>13) {
6477                         retval = -EPROTONOSUPPORT;
6478 			break;
6479 		}
6480                 if(pd.type<G729)
6481                         val=proto_size[pd.type];
6482                 else switch(j->baseframe.low)
6483                 {
6484                         case 0xA0:val=2*proto_size[pd.type];break;
6485                         case 0x50:val=proto_size[pd.type];break;
6486                         default:val=proto_size[pd.type]*3;break;
6487                 }
6488                 pd.buf_min=pd.buf_max=pd.buf_opt=val;
6489                 if(copy_to_user(argp, &pd, sizeof(pd)))
6490                         retval = -EFAULT;
6491         	break;
6492         }
6493 	case IXJCTL_DSP_IDLE:
6494 		idle(j);
6495 		break;
6496 	case IXJCTL_MIXER:
6497                 if ((arg & 0xff) == 0xff)
6498 			retval = ixj_get_mixer(arg, j);
6499                 else
6500 			ixj_mixer(arg, j);
6501 		break;
6502 	case IXJCTL_DAA_COEFF_SET:
6503 		switch (arg) {
6504 		case DAA_US:
6505 			DAA_Coeff_US(j);
6506 			retval = ixj_daa_write(j);
6507 			break;
6508 		case DAA_UK:
6509 			DAA_Coeff_UK(j);
6510 			retval = ixj_daa_write(j);
6511 			break;
6512 		case DAA_FRANCE:
6513 			DAA_Coeff_France(j);
6514 			retval = ixj_daa_write(j);
6515 			break;
6516 		case DAA_GERMANY:
6517 			DAA_Coeff_Germany(j);
6518 			retval = ixj_daa_write(j);
6519 			break;
6520 		case DAA_AUSTRALIA:
6521 			DAA_Coeff_Australia(j);
6522 			retval = ixj_daa_write(j);
6523 			break;
6524 		case DAA_JAPAN:
6525 			DAA_Coeff_Japan(j);
6526 			retval = ixj_daa_write(j);
6527 			break;
6528 		default:
6529 			retval = 1;
6530 			break;
6531 		}
6532 		break;
6533 	case IXJCTL_DAA_AGAIN:
6534 		ixj_daa_cr4(j, arg | 0x02);
6535 		break;
6536 	case IXJCTL_PSTN_LINETEST:
6537 		retval = ixj_linetest(j);
6538 		break;
6539 	case IXJCTL_VMWI:
6540 		ixj_write_vmwi(j, arg);
6541 		break;
6542 	case IXJCTL_CID:
6543 		if (copy_to_user(argp, &j->cid, sizeof(PHONE_CID)))
6544 			retval = -EFAULT;
6545 		j->ex.bits.caller_id = 0;
6546 		break;
6547 	case IXJCTL_WINK_DURATION:
6548 		j->winktime = arg;
6549 		break;
6550 	case IXJCTL_PORT:
6551 		if (arg)
6552 			retval = ixj_set_port(j, arg);
6553 		else
6554 			retval = j->port;
6555 		break;
6556 	case IXJCTL_POTS_PSTN:
6557 		retval = ixj_set_pots(j, arg);
6558 		break;
6559 	case PHONE_CAPABILITIES:
6560 		add_caps(j);
6561 		retval = j->caps;
6562 		break;
6563 	case PHONE_CAPABILITIES_LIST:
6564 		add_caps(j);
6565 		if (copy_to_user(argp, j->caplist, sizeof(struct phone_capability) * j->caps))
6566 			retval = -EFAULT;
6567 		break;
6568 	case PHONE_CAPABILITIES_CHECK:
6569 		{
6570 			struct phone_capability cap;
6571 			if (copy_from_user(&cap, argp, sizeof(cap)))
6572 				retval = -EFAULT;
6573 			else {
6574 				add_caps(j);
6575 				retval = capabilities_check(j, &cap);
6576 			}
6577 		}
6578 		break;
6579 	case PHONE_PSTN_SET_STATE:
6580 		daa_set_mode(j, arg);
6581 		break;
6582 	case PHONE_PSTN_GET_STATE:
6583 		retval = j->daa_mode;
6584 		j->ex.bits.pstn_ring = 0;
6585 		break;
6586 	case IXJCTL_SET_FILTER:
6587 		if (copy_from_user(&jf, argp, sizeof(jf)))
6588 			retval = -EFAULT;
6589 		retval = ixj_init_filter(j, &jf);
6590 		break;
6591 	case IXJCTL_SET_FILTER_RAW:
6592 		if (copy_from_user(&jfr, argp, sizeof(jfr)))
6593 			retval = -EFAULT;
6594 		else
6595 			retval = ixj_init_filter_raw(j, &jfr);
6596 		break;
6597 	case IXJCTL_GET_FILTER_HIST:
6598 		if(arg<0||arg>3)
6599 			retval = -EINVAL;
6600 		else
6601 			retval = j->filter_hist[arg];
6602 		break;
6603 	case IXJCTL_INIT_TONE:
6604 		if (copy_from_user(&ti, argp, sizeof(ti)))
6605 			retval = -EFAULT;
6606 		else
6607 			retval = ixj_init_tone(j, &ti);
6608 		break;
6609 	case IXJCTL_TONE_CADENCE:
6610 		retval = ixj_build_cadence(j, argp);
6611 		break;
6612 	case IXJCTL_FILTER_CADENCE:
6613 		retval = ixj_build_filter_cadence(j, argp);
6614 		break;
6615 	case IXJCTL_SIGCTL:
6616 		if (copy_from_user(&j->sigdef, argp, sizeof(IXJ_SIGDEF))) {
6617 			retval = -EFAULT;
6618 			break;
6619 		}
6620 		j->ixj_signals[j->sigdef.event] = j->sigdef.signal;
6621 		if(j->sigdef.event < 33) {
6622 			raise = 1;
6623 			for(mant = 0; mant < j->sigdef.event; mant++){
6624 				raise *= 2;
6625 			}
6626 			if(j->sigdef.signal)
6627 				j->ex_sig.bytes |= raise;
6628 			else
6629 				j->ex_sig.bytes &= (raise^0xffff);
6630 		}
6631 		break;
6632 	case IXJCTL_INTERCOM_STOP:
6633 		if(arg < 0 || arg >= IXJMAX)
6634 			return -EINVAL;
6635 		j->intercom = -1;
6636 		ixj_record_stop(j);
6637 		ixj_play_stop(j);
6638 		idle(j);
6639 		get_ixj(arg)->intercom = -1;
6640 		ixj_record_stop(get_ixj(arg));
6641 		ixj_play_stop(get_ixj(arg));
6642 		idle(get_ixj(arg));
6643 		break;
6644 	case IXJCTL_INTERCOM_START:
6645 		if(arg < 0 || arg >= IXJMAX)
6646 			return -EINVAL;
6647 		j->intercom = arg;
6648 		ixj_record_start(j);
6649 		ixj_play_start(j);
6650 		get_ixj(arg)->intercom = board;
6651 		ixj_play_start(get_ixj(arg));
6652 		ixj_record_start(get_ixj(arg));
6653 		break;
6654 	}
6655 	if (ixjdebug & 0x0040)
6656 		printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6657 	clear_bit(board, &j->busyflags);
6658 	return retval;
6659 }
6660 
ixj_ioctl(struct file * file_p,unsigned int cmd,unsigned long arg)6661 static long ixj_ioctl(struct file *file_p, unsigned int cmd, unsigned long arg)
6662 {
6663 	long ret;
6664 	lock_kernel();
6665 	ret = do_ixj_ioctl(file_p, cmd, arg);
6666 	unlock_kernel();
6667 	return ret;
6668 }
6669 
ixj_fasync(int fd,struct file * file_p,int mode)6670 static int ixj_fasync(int fd, struct file *file_p, int mode)
6671 {
6672 	IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
6673 
6674 	return fasync_helper(fd, file_p, mode, &j->async_queue);
6675 }
6676 
6677 static const struct file_operations ixj_fops =
6678 {
6679         .owner          = THIS_MODULE,
6680         .read           = ixj_enhanced_read,
6681         .write          = ixj_enhanced_write,
6682         .poll           = ixj_poll,
6683         .unlocked_ioctl = ixj_ioctl,
6684         .release        = ixj_release,
6685         .fasync         = ixj_fasync
6686 };
6687 
ixj_linetest(IXJ * j)6688 static int ixj_linetest(IXJ *j)
6689 {
6690 	j->flags.pstncheck = 1;	/* Testing */
6691 	j->flags.pstn_present = 0; /* Assume the line is not there */
6692 
6693 	daa_int_read(j);	/*Clear DAA Interrupt flags */
6694 	/* */
6695 	/* Hold all relays in the normally de-energized position. */
6696 	/* */
6697 
6698 	j->pld_slicw.bits.rly1 = 0;
6699 	j->pld_slicw.bits.rly2 = 0;
6700 	j->pld_slicw.bits.rly3 = 0;
6701 	outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6702 	j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
6703 
6704 	outb_p(j->pld_scrw.byte, j->XILINXbase);
6705 	j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
6706 	if (j->pld_slicr.bits.potspstn) {
6707 		j->flags.pots_pstn = 1;
6708 		j->flags.pots_correct = 0;
6709 		LED_SetState(0x4, j);
6710 	} else {
6711 		j->flags.pots_pstn = 0;
6712 		j->pld_slicw.bits.rly1 = 0;
6713 		j->pld_slicw.bits.rly2 = 0;
6714 		j->pld_slicw.bits.rly3 = 1;
6715 		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6716 		j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
6717 
6718 		outb_p(j->pld_scrw.byte, j->XILINXbase);
6719 		daa_set_mode(j, SOP_PU_CONVERSATION);
6720 		msleep(1000);
6721 		daa_int_read(j);
6722 		daa_set_mode(j, SOP_PU_RESET);
6723 		if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6724 			j->flags.pots_correct = 0;	/* Should not be line voltage on POTS port. */
6725 			LED_SetState(0x4, j);
6726 			j->pld_slicw.bits.rly3 = 0;
6727 			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6728 		} else {
6729 			j->flags.pots_correct = 1;
6730 			LED_SetState(0x8, j);
6731 			j->pld_slicw.bits.rly1 = 1;
6732 			j->pld_slicw.bits.rly2 = 0;
6733 			j->pld_slicw.bits.rly3 = 0;
6734 			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6735 		}
6736 	}
6737 	j->pld_slicw.bits.rly3 = 0;
6738 	outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6739 	daa_set_mode(j, SOP_PU_CONVERSATION);
6740 	msleep(1000);
6741 	daa_int_read(j);
6742 	daa_set_mode(j, SOP_PU_RESET);
6743 	if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6744 		j->pstn_sleeptil = jiffies + (hertz / 4);
6745 		j->flags.pstn_present = 1;
6746 	} else {
6747 		j->flags.pstn_present = 0;
6748 	}
6749 	if (j->flags.pstn_present) {
6750 		if (j->flags.pots_correct) {
6751 			LED_SetState(0xA, j);
6752 		} else {
6753 			LED_SetState(0x6, j);
6754 		}
6755 	} else {
6756 		if (j->flags.pots_correct) {
6757 			LED_SetState(0x9, j);
6758 		} else {
6759 			LED_SetState(0x5, j);
6760 		}
6761 	}
6762 	j->flags.pstncheck = 0;	/* Testing */
6763 	return j->flags.pstn_present;
6764 }
6765 
ixj_selfprobe(IXJ * j)6766 static int ixj_selfprobe(IXJ *j)
6767 {
6768 	unsigned short cmd;
6769 	int cnt;
6770 	BYTES bytes;
6771 
6772         init_waitqueue_head(&j->poll_q);
6773         init_waitqueue_head(&j->read_q);
6774         init_waitqueue_head(&j->write_q);
6775 
6776 	while(atomic_read(&j->DSPWrite) > 0)
6777 		atomic_dec(&j->DSPWrite);
6778 	if (ixjdebug & 0x0002)
6779 		printk(KERN_INFO "Write IDLE to Software Control Register\n");
6780 	ixj_WriteDSPCommand(0x0FE0, j);	/* Put the DSP in full power mode. */
6781 
6782 	if (ixj_WriteDSPCommand(0x0000, j))		/* Write IDLE to Software Control Register */
6783 		return -1;
6784 /* The read values of the SSR should be 0x00 for the IDLE command */
6785 	if (j->ssr.low || j->ssr.high)
6786 		return -1;
6787 	if (ixjdebug & 0x0002)
6788 		printk(KERN_INFO "Get Device ID Code\n");
6789 	if (ixj_WriteDSPCommand(0x3400, j))		/* Get Device ID Code */
6790 		return -1;
6791 	j->dsp.low = j->ssr.low;
6792 	j->dsp.high = j->ssr.high;
6793 	if (ixjdebug & 0x0002)
6794 		printk(KERN_INFO "Get Device Version Code\n");
6795 	if (ixj_WriteDSPCommand(0x3800, j))		/* Get Device Version Code */
6796 		return -1;
6797 	j->ver.low = j->ssr.low;
6798 	j->ver.high = j->ssr.high;
6799 	if (!j->cardtype) {
6800 		if (j->dsp.low == 0x21) {
6801 			bytes.high = bytes.low = inb_p(j->XILINXbase + 0x02);
6802 			outb_p(bytes.low ^ 0xFF, j->XILINXbase + 0x02);
6803 /* Test for Internet LineJACK or Internet PhoneJACK Lite */
6804 			bytes.low = inb_p(j->XILINXbase + 0x02);
6805 			if (bytes.low == bytes.high)	/*  Register is read only on */
6806 				/*  Internet PhoneJack Lite */
6807 			 {
6808 				j->cardtype = QTI_PHONEJACK_LITE;
6809 				if (!request_region(j->XILINXbase, 4, "ixj control")) {
6810 					printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6811 					return -1;
6812 				}
6813 				j->pld_slicw.pcib.e1 = 1;
6814 				outb_p(j->pld_slicw.byte, j->XILINXbase);
6815 			} else {
6816 				j->cardtype = QTI_LINEJACK;
6817 
6818 				if (!request_region(j->XILINXbase, 8, "ixj control")) {
6819 					printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6820 					return -1;
6821 				}
6822 			}
6823 		} else if (j->dsp.low == 0x22) {
6824 			j->cardtype = QTI_PHONEJACK_PCI;
6825 			request_region(j->XILINXbase, 4, "ixj control");
6826 			j->pld_slicw.pcib.e1 = 1;
6827 			outb_p(j->pld_slicw.byte, j->XILINXbase);
6828 		} else
6829 			j->cardtype = QTI_PHONEJACK;
6830 	} else {
6831 		switch (j->cardtype) {
6832 		case QTI_PHONEJACK:
6833 			if (!j->dsp.low != 0x20) {
6834 				j->dsp.high = 0x80;
6835 				j->dsp.low = 0x20;
6836 				ixj_WriteDSPCommand(0x3800, j);
6837 				j->ver.low = j->ssr.low;
6838 				j->ver.high = j->ssr.high;
6839 			}
6840 			break;
6841 		case QTI_LINEJACK:
6842 			if (!request_region(j->XILINXbase, 8, "ixj control")) {
6843 				printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6844 				return -1;
6845 			}
6846 			break;
6847 		case QTI_PHONEJACK_LITE:
6848 		case QTI_PHONEJACK_PCI:
6849 			if (!request_region(j->XILINXbase, 4, "ixj control")) {
6850 				printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6851 				return -1;
6852 			}
6853 			j->pld_slicw.pcib.e1 = 1;
6854 			outb_p(j->pld_slicw.byte, j->XILINXbase);
6855 			break;
6856 		case QTI_PHONECARD:
6857 			break;
6858 		}
6859 	}
6860 	if (j->dsp.low == 0x20 || j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
6861 		if (ixjdebug & 0x0002)
6862 			printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6863 		if (ixj_WriteDSPCommand(0xC462, j))		/* Write CODEC config to Software Control Register */
6864 			return -1;
6865 		if (ixjdebug & 0x0002)
6866 			printk(KERN_INFO "Write CODEC timing to Software Control Register\n");
6867 		if (j->cardtype == QTI_PHONEJACK) {
6868 			cmd = 0x9FF2;
6869 		} else {
6870 			cmd = 0x9FF5;
6871 		}
6872 		if (ixj_WriteDSPCommand(cmd, j))	/* Write CODEC timing to Software Control Register */
6873 			return -1;
6874 	} else {
6875 		if (set_base_frame(j, 30) != 30)
6876 			return -1;
6877 		if (ixjdebug & 0x0002)
6878 			printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6879 		if (j->cardtype == QTI_PHONECARD) {
6880 			if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to Software Control Register */
6881 				return -1;
6882 		}
6883 		if (j->cardtype == QTI_LINEJACK) {
6884 			if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to Software Control Register */
6885 				return -1;
6886 			if (ixjdebug & 0x0002)
6887 				printk(KERN_INFO "Turn on the PLD Clock at 8Khz\n");
6888 			j->pld_clock.byte = 0;
6889 			outb_p(j->pld_clock.byte, j->XILINXbase + 0x04);
6890 		}
6891 	}
6892 
6893 	if (j->dsp.low == 0x20) {
6894 		if (ixjdebug & 0x0002)
6895 			printk(KERN_INFO "Configure GPIO pins\n");
6896 		j->gpio.bytes.high = 0x09;
6897 /*  bytes.low = 0xEF;  0xF7 */
6898 		j->gpio.bits.gpio1 = 1;
6899 		j->gpio.bits.gpio2 = 1;
6900 		j->gpio.bits.gpio3 = 0;
6901 		j->gpio.bits.gpio4 = 1;
6902 		j->gpio.bits.gpio5 = 1;
6903 		j->gpio.bits.gpio6 = 1;
6904 		j->gpio.bits.gpio7 = 1;
6905 		ixj_WriteDSPCommand(j->gpio.word, j);	/* Set GPIO pin directions */
6906 		if (ixjdebug & 0x0002)
6907 			printk(KERN_INFO "Enable SLIC\n");
6908 		j->gpio.bytes.high = 0x0B;
6909 		j->gpio.bytes.low = 0x00;
6910 		j->gpio.bits.gpio1 = 0;
6911 		j->gpio.bits.gpio2 = 1;
6912 		j->gpio.bits.gpio5 = 0;
6913 		ixj_WriteDSPCommand(j->gpio.word, j);	/* send the ring stop signal */
6914 		j->port = PORT_POTS;
6915 	} else {
6916 		if (j->cardtype == QTI_LINEJACK) {
6917 			LED_SetState(0x1, j);
6918 			msleep(100);
6919 			LED_SetState(0x2, j);
6920 			msleep(100);
6921 			LED_SetState(0x4, j);
6922 			msleep(100);
6923 			LED_SetState(0x8, j);
6924 			msleep(100);
6925 			LED_SetState(0x0, j);
6926 			daa_get_version(j);
6927 			if (ixjdebug & 0x0002)
6928 				printk("Loading DAA Coefficients\n");
6929 			DAA_Coeff_US(j);
6930 			if (!ixj_daa_write(j)) {
6931 				printk("DAA write failed on board %d\n", j->board);
6932 				return -1;
6933 			}
6934 			if(!ixj_daa_cid_reset(j)) {
6935 				printk("DAA CID reset failed on board %d\n", j->board);
6936 				return -1;
6937 			}
6938 			j->flags.pots_correct = 0;
6939 			j->flags.pstn_present = 0;
6940 			ixj_linetest(j);
6941 			if (j->flags.pots_correct) {
6942 				j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
6943 
6944 				outb_p(j->pld_scrw.byte, j->XILINXbase);
6945 				j->pld_slicw.bits.rly1 = 1;
6946 				j->pld_slicw.bits.spken = 1;
6947 				outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6948 				SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
6949 /*				SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
6950 				j->port = PORT_POTS;
6951 			}
6952 			ixj_set_port(j, PORT_PSTN);
6953 			ixj_set_pots(j, 1);
6954 			if (ixjdebug & 0x0002)
6955 				printk(KERN_INFO "Enable Mixer\n");
6956 			ixj_mixer(0x0000, j);	/*Master Volume Left unmute 0db */
6957 			ixj_mixer(0x0100, j);	/*Master Volume Right unmute 0db */
6958 
6959 			ixj_mixer(0x0203, j);	/*Voice Left Volume unmute 6db */
6960 			ixj_mixer(0x0303, j);	/*Voice Right Volume unmute 6db */
6961 
6962 			ixj_mixer(0x0480, j);	/*FM Left mute */
6963 			ixj_mixer(0x0580, j);	/*FM Right mute */
6964 
6965 			ixj_mixer(0x0680, j);	/*CD Left mute */
6966 			ixj_mixer(0x0780, j);	/*CD Right mute */
6967 
6968 			ixj_mixer(0x0880, j);	/*Line Left mute */
6969 			ixj_mixer(0x0980, j);	/*Line Right mute */
6970 
6971 			ixj_mixer(0x0A80, j);	/*Aux left mute  */
6972 			ixj_mixer(0x0B80, j);	/*Aux right mute */
6973 
6974 			ixj_mixer(0x0C00, j);	/*Mono1 unmute 12db */
6975 			ixj_mixer(0x0D80, j);	/*Mono2 mute */
6976 
6977 			ixj_mixer(0x0E80, j);	/*Mic mute */
6978 
6979 			ixj_mixer(0x0F00, j);	/*Mono Out Volume unmute 0db */
6980 
6981 			ixj_mixer(0x1000, j);	/*Voice Left and Right out only */
6982 			ixj_mixer(0x110C, j);
6983 
6984 
6985 			ixj_mixer(0x1200, j);	/*Mono1 switch on mixer left */
6986 			ixj_mixer(0x1401, j);
6987 
6988 			ixj_mixer(0x1300, j);       /*Mono1 switch on mixer right */
6989 			ixj_mixer(0x1501, j);
6990 
6991 			ixj_mixer(0x1700, j);	/*Clock select */
6992 
6993 			ixj_mixer(0x1800, j);	/*ADC input from mixer */
6994 
6995 			ixj_mixer(0x1901, j);	/*Mic gain 30db */
6996 
6997 			if (ixjdebug & 0x0002)
6998 				printk(KERN_INFO "Setting Default US Ring Cadence Detection\n");
6999 			j->cadence_f[4].state = 0;
7000 			j->cadence_f[4].on1 = 0;	/*Cadence Filter 4 is used for PSTN ring cadence */
7001 			j->cadence_f[4].off1 = 0;
7002 			j->cadence_f[4].on2 = 0;
7003 			j->cadence_f[4].off2 = 0;
7004 			j->cadence_f[4].on3 = 0;
7005 			j->cadence_f[4].off3 = 0;	/* These should represent standard US ring pulse. */
7006 			j->pstn_last_rmr = jiffies;
7007 
7008 		} else {
7009 			if (j->cardtype == QTI_PHONECARD) {
7010 				ixj_WriteDSPCommand(0xCF07, j);
7011 				ixj_WriteDSPCommand(0x00B0, j);
7012 				ixj_set_port(j, PORT_SPEAKER);
7013 			} else {
7014 				ixj_set_port(j, PORT_POTS);
7015 				SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
7016 /*				SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
7017 			}
7018 		}
7019 	}
7020 
7021 	j->intercom = -1;
7022 	j->framesread = j->frameswritten = 0;
7023 	j->read_wait = j->write_wait = 0;
7024 	j->rxreadycheck = j->txreadycheck = 0;
7025 
7026 	/* initialise the DTMF prescale to a sensible value */
7027 	if (j->cardtype == QTI_LINEJACK) {
7028 		set_dtmf_prescale(j, 0x10);
7029 	} else {
7030 		set_dtmf_prescale(j, 0x40);
7031 	}
7032 	set_play_volume(j, 0x100);
7033 	set_rec_volume(j, 0x100);
7034 
7035 	if (ixj_WriteDSPCommand(0x0000, j))		/* Write IDLE to Software Control Register */
7036 		return -1;
7037 /* The read values of the SSR should be 0x00 for the IDLE command */
7038 	if (j->ssr.low || j->ssr.high)
7039 		return -1;
7040 
7041 	if (ixjdebug & 0x0002)
7042 		printk(KERN_INFO "Enable Line Monitor\n");
7043 
7044 	if (ixjdebug & 0x0002)
7045 		printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n");
7046 
7047 	if (ixj_WriteDSPCommand(0x7E01, j))		/* Asynchronous Line Monitor */
7048 		return -1;
7049 
7050 	if (ixjdebug & 0x002)
7051 		printk(KERN_INFO "Enable DTMF Detectors\n");
7052 
7053 	if (ixj_WriteDSPCommand(0x5151, j))		/* Enable DTMF detection */
7054 		return -1;
7055 
7056 	if (ixj_WriteDSPCommand(0x6E01, j))		/* Set Asyncronous Tone Generation */
7057 		return -1;
7058 
7059 	set_rec_depth(j, 2);	/* Set Record Channel Limit to 2 frames */
7060 
7061 	set_play_depth(j, 2);	/* Set Playback Channel Limit to 2 frames */
7062 
7063 	j->ex.bits.dtmf_ready = 0;
7064 	j->dtmf_state = 0;
7065 	j->dtmf_wp = j->dtmf_rp = 0;
7066 	j->rec_mode = j->play_mode = -1;
7067 	j->flags.ringing = 0;
7068 	j->maxrings = MAXRINGS;
7069 	j->ring_cadence = USA_RING_CADENCE;
7070 	j->drybuffer = 0;
7071 	j->winktime = 320;
7072 	j->flags.dtmf_oob = 0;
7073 	for (cnt = 0; cnt < 4; cnt++)
7074 		j->cadence_f[cnt].enable = 0;
7075 	/* must be a device on the specified address */
7076 	ixj_WriteDSPCommand(0x0FE3, j);	/* Put the DSP in 1/5 power mode. */
7077 
7078 	/* Set up the default signals for events */
7079 	for (cnt = 0; cnt < 35; cnt++)
7080 		j->ixj_signals[cnt] = SIGIO;
7081 
7082 	/* Set the excetion signal enable flags */
7083 	j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
7084 	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 =
7085 	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;
7086 #ifdef IXJ_DYN_ALLOC
7087 	j->fskdata = NULL;
7088 #endif
7089 	j->fskdcnt = 0;
7090 	j->cidcw_wait = 0;
7091 
7092 	/* Register with the Telephony for Linux subsystem */
7093 	j->p.f_op = &ixj_fops;
7094 	j->p.open = ixj_open;
7095 	j->p.board = j->board;
7096 	phone_register_device(&j->p, PHONE_UNIT_ANY);
7097 
7098 	ixj_init_timer(j);
7099 	ixj_add_timer(j);
7100 	return 0;
7101 }
7102 
7103 /*
7104  *	Exported service for pcmcia card handling
7105  */
7106 
ixj_pcmcia_probe(unsigned long dsp,unsigned long xilinx)7107 IXJ *ixj_pcmcia_probe(unsigned long dsp, unsigned long xilinx)
7108 {
7109 	IXJ *j = ixj_alloc();
7110 
7111 	j->board = 0;
7112 
7113 	j->DSPbase = dsp;
7114 	j->XILINXbase = xilinx;
7115 	j->cardtype = QTI_PHONECARD;
7116 	ixj_selfprobe(j);
7117 	return j;
7118 }
7119 
7120 EXPORT_SYMBOL(ixj_pcmcia_probe);		/* Fpr PCMCIA */
7121 
ixj_get_status_proc(char * buf)7122 static int ixj_get_status_proc(char *buf)
7123 {
7124 	int len;
7125 	int cnt;
7126 	IXJ *j;
7127 	len = 0;
7128 	len += sprintf(buf + len, "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, IXJ_VER_MINOR, IXJ_BLD_VER);
7129 	len += sprintf(buf + len, "\nsizeof IXJ struct %Zd bytes", sizeof(IXJ));
7130 	len += sprintf(buf + len, "\nsizeof DAA struct %Zd bytes", sizeof(DAA_REGS));
7131 	len += sprintf(buf + len, "\nUsing old telephony API");
7132 	len += sprintf(buf + len, "\nDebug Level %d\n", ixjdebug);
7133 
7134 	for (cnt = 0; cnt < IXJMAX; cnt++) {
7135 		j = get_ixj(cnt);
7136 		if(j==NULL)
7137 			continue;
7138 		if (j->DSPbase) {
7139 			len += sprintf(buf + len, "\nCard Num %d", cnt);
7140 			len += sprintf(buf + len, "\nDSP Base Address 0x%4.4x", j->DSPbase);
7141 			if (j->cardtype != QTI_PHONEJACK)
7142 				len += sprintf(buf + len, "\nXILINX Base Address 0x%4.4x", j->XILINXbase);
7143 			len += sprintf(buf + len, "\nDSP Type %2.2x%2.2x", j->dsp.high, j->dsp.low);
7144 			len += sprintf(buf + len, "\nDSP Version %2.2x.%2.2x", j->ver.high, j->ver.low);
7145 			len += sprintf(buf + len, "\nSerial Number %8.8x", j->serial);
7146 			switch (j->cardtype) {
7147 			case (QTI_PHONEJACK):
7148 				len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK");
7149 				break;
7150 			case (QTI_LINEJACK):
7151 				len += sprintf(buf + len, "\nCard Type = Internet LineJACK");
7152 				if (j->flags.g729_loaded)
7153 					len += sprintf(buf + len, " w/G.729 A/B");
7154 				len += sprintf(buf + len, " Country = %d", j->daa_country);
7155 				break;
7156 			case (QTI_PHONEJACK_LITE):
7157 				len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK Lite");
7158 				if (j->flags.g729_loaded)
7159 					len += sprintf(buf + len, " w/G.729 A/B");
7160 				break;
7161 			case (QTI_PHONEJACK_PCI):
7162 				len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK PCI");
7163 				if (j->flags.g729_loaded)
7164 					len += sprintf(buf + len, " w/G.729 A/B");
7165 				break;
7166 			case (QTI_PHONECARD):
7167 				len += sprintf(buf + len, "\nCard Type = Internet PhoneCARD");
7168 				if (j->flags.g729_loaded)
7169 					len += sprintf(buf + len, " w/G.729 A/B");
7170 				len += sprintf(buf + len, "\nSmart Cable %spresent", j->pccr1.bits.drf ? "not " : "");
7171 				if (!j->pccr1.bits.drf)
7172 					len += sprintf(buf + len, "\nSmart Cable type %d", j->flags.pcmciasct);
7173 				len += sprintf(buf + len, "\nSmart Cable state %d", j->flags.pcmciastate);
7174 				break;
7175 			default:
7176 				len += sprintf(buf + len, "\nCard Type = %d", j->cardtype);
7177 				break;
7178 			}
7179 			len += sprintf(buf + len, "\nReaders %d", j->readers);
7180 			len += sprintf(buf + len, "\nWriters %d", j->writers);
7181 			add_caps(j);
7182 			len += sprintf(buf + len, "\nCapabilities %d", j->caps);
7183 			if (j->dsp.low != 0x20)
7184 				len += sprintf(buf + len, "\nDSP Processor load %d", j->proc_load);
7185 			if (j->flags.cidsent)
7186 				len += sprintf(buf + len, "\nCaller ID data sent");
7187 			else
7188 				len += sprintf(buf + len, "\nCaller ID data not sent");
7189 
7190 			len += sprintf(buf + len, "\nPlay CODEC ");
7191 			switch (j->play_codec) {
7192 			case G723_63:
7193 				len += sprintf(buf + len, "G.723.1 6.3");
7194 				break;
7195 			case G723_53:
7196 				len += sprintf(buf + len, "G.723.1 5.3");
7197 				break;
7198 			case TS85:
7199 				len += sprintf(buf + len, "TrueSpeech 8.5");
7200 				break;
7201 			case TS48:
7202 				len += sprintf(buf + len, "TrueSpeech 4.8");
7203 				break;
7204 			case TS41:
7205 				len += sprintf(buf + len, "TrueSpeech 4.1");
7206 				break;
7207 			case G728:
7208 				len += sprintf(buf + len, "G.728");
7209 				break;
7210 			case G729:
7211 				len += sprintf(buf + len, "G.729");
7212 				break;
7213 			case G729B:
7214 				len += sprintf(buf + len, "G.729B");
7215 				break;
7216 			case ULAW:
7217 				len += sprintf(buf + len, "uLaw");
7218 				break;
7219 			case ALAW:
7220 				len += sprintf(buf + len, "aLaw");
7221 				break;
7222 			case LINEAR16:
7223 				len += sprintf(buf + len, "16 bit Linear");
7224 				break;
7225 			case LINEAR8:
7226 				len += sprintf(buf + len, "8 bit Linear");
7227 				break;
7228 			case WSS:
7229 				len += sprintf(buf + len, "Windows Sound System");
7230 				break;
7231 			default:
7232 				len += sprintf(buf + len, "NO CODEC CHOSEN");
7233 				break;
7234 			}
7235 			len += sprintf(buf + len, "\nRecord CODEC ");
7236 			switch (j->rec_codec) {
7237 			case G723_63:
7238 				len += sprintf(buf + len, "G.723.1 6.3");
7239 				break;
7240 			case G723_53:
7241 				len += sprintf(buf + len, "G.723.1 5.3");
7242 				break;
7243 			case TS85:
7244 				len += sprintf(buf + len, "TrueSpeech 8.5");
7245 				break;
7246 			case TS48:
7247 				len += sprintf(buf + len, "TrueSpeech 4.8");
7248 				break;
7249 			case TS41:
7250 				len += sprintf(buf + len, "TrueSpeech 4.1");
7251 				break;
7252 			case G728:
7253 				len += sprintf(buf + len, "G.728");
7254 				break;
7255 			case G729:
7256 				len += sprintf(buf + len, "G.729");
7257 				break;
7258 			case G729B:
7259 				len += sprintf(buf + len, "G.729B");
7260 				break;
7261 			case ULAW:
7262 				len += sprintf(buf + len, "uLaw");
7263 				break;
7264 			case ALAW:
7265 				len += sprintf(buf + len, "aLaw");
7266 				break;
7267 			case LINEAR16:
7268 				len += sprintf(buf + len, "16 bit Linear");
7269 				break;
7270 			case LINEAR8:
7271 				len += sprintf(buf + len, "8 bit Linear");
7272 				break;
7273 			case WSS:
7274 				len += sprintf(buf + len, "Windows Sound System");
7275 				break;
7276 			default:
7277 				len += sprintf(buf + len, "NO CODEC CHOSEN");
7278 				break;
7279 			}
7280 			len += sprintf(buf + len, "\nAEC ");
7281 			switch (j->aec_level) {
7282 			case AEC_OFF:
7283 				len += sprintf(buf + len, "Off");
7284 				break;
7285 			case AEC_LOW:
7286 				len += sprintf(buf + len, "Low");
7287 				break;
7288 			case AEC_MED:
7289 				len += sprintf(buf + len, "Med");
7290 				break;
7291 			case AEC_HIGH:
7292 				len += sprintf(buf + len, "High");
7293 				break;
7294 			case AEC_AUTO:
7295 				len += sprintf(buf + len, "Auto");
7296 				break;
7297 			case AEC_AGC:
7298 				len += sprintf(buf + len, "AEC/AGC");
7299 				break;
7300 			default:
7301 				len += sprintf(buf + len, "unknown(%i)", j->aec_level);
7302 				break;
7303 			}
7304 
7305 			len += sprintf(buf + len, "\nRec volume 0x%x", get_rec_volume(j));
7306 			len += sprintf(buf + len, "\nPlay volume 0x%x", get_play_volume(j));
7307 			len += sprintf(buf + len, "\nDTMF prescale 0x%x", get_dtmf_prescale(j));
7308 
7309 			len += sprintf(buf + len, "\nHook state %d", j->hookstate); /* j->r_hook);	*/
7310 
7311 			if (j->cardtype == QTI_LINEJACK) {
7312 				len += sprintf(buf + len, "\nPOTS Correct %d", j->flags.pots_correct);
7313 				len += sprintf(buf + len, "\nPSTN Present %d", j->flags.pstn_present);
7314 				len += sprintf(buf + len, "\nPSTN Check %d", j->flags.pstncheck);
7315 				len += sprintf(buf + len, "\nPOTS to PSTN %d", j->flags.pots_pstn);
7316 				switch (j->daa_mode) {
7317 				case SOP_PU_SLEEP:
7318 					len += sprintf(buf + len, "\nDAA PSTN On Hook");
7319 					break;
7320 				case SOP_PU_RINGING:
7321 					len += sprintf(buf + len, "\nDAA PSTN Ringing");
7322 					len += sprintf(buf + len, "\nRinging state = %d", j->cadence_f[4].state);
7323 					break;
7324 				case SOP_PU_CONVERSATION:
7325 					len += sprintf(buf + len, "\nDAA PSTN Off Hook");
7326 					break;
7327 				case SOP_PU_PULSEDIALING:
7328 					len += sprintf(buf + len, "\nDAA PSTN Pulse Dialing");
7329 					break;
7330 				}
7331 				len += sprintf(buf + len, "\nDAA RMR = %d", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR);
7332 				len += sprintf(buf + len, "\nDAA VDD OK = %d", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK);
7333 				len += sprintf(buf + len, "\nDAA CR0 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg);
7334 				len += sprintf(buf + len, "\nDAA CR1 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg);
7335 				len += sprintf(buf + len, "\nDAA CR2 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg);
7336 				len += sprintf(buf + len, "\nDAA CR3 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg);
7337 				len += sprintf(buf + len, "\nDAA CR4 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg);
7338 				len += sprintf(buf + len, "\nDAA CR5 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg);
7339 				len += sprintf(buf + len, "\nDAA XR0 = 0x%02x", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg);
7340 				len += sprintf(buf + len, "\nDAA ringstop %ld - jiffies %ld", j->pstn_ring_stop, jiffies);
7341 			}
7342 			switch (j->port) {
7343 			case PORT_POTS:
7344 				len += sprintf(buf + len, "\nPort POTS");
7345 				break;
7346 			case PORT_PSTN:
7347 				len += sprintf(buf + len, "\nPort PSTN");
7348 				break;
7349 			case PORT_SPEAKER:
7350 				len += sprintf(buf + len, "\nPort SPEAKER/MIC");
7351 				break;
7352 			case PORT_HANDSET:
7353 				len += sprintf(buf + len, "\nPort HANDSET");
7354 				break;
7355 			}
7356 			if (j->dsp.low == 0x21 || j->dsp.low == 0x22) {
7357 				len += sprintf(buf + len, "\nSLIC state ");
7358 				switch (SLIC_GetState(j)) {
7359 				case PLD_SLIC_STATE_OC:
7360 					len += sprintf(buf + len, "OC");
7361 					break;
7362 				case PLD_SLIC_STATE_RINGING:
7363 					len += sprintf(buf + len, "RINGING");
7364 					break;
7365 				case PLD_SLIC_STATE_ACTIVE:
7366 					len += sprintf(buf + len, "ACTIVE");
7367 					break;
7368 				case PLD_SLIC_STATE_OHT:	/* On-hook transmit */
7369 					len += sprintf(buf + len, "OHT");
7370 					break;
7371 				case PLD_SLIC_STATE_TIPOPEN:
7372 					len += sprintf(buf + len, "TIPOPEN");
7373 					break;
7374 				case PLD_SLIC_STATE_STANDBY:
7375 					len += sprintf(buf + len, "STANDBY");
7376 					break;
7377 				case PLD_SLIC_STATE_APR:	/* Active polarity reversal */
7378 					len += sprintf(buf + len, "APR");
7379 					break;
7380 				case PLD_SLIC_STATE_OHTPR:	/* OHT polarity reversal */
7381 					len += sprintf(buf + len, "OHTPR");
7382 					break;
7383 				default:
7384 					len += sprintf(buf + len, "%d", SLIC_GetState(j));
7385 					break;
7386 				}
7387 			}
7388 			len += sprintf(buf + len, "\nBase Frame %2.2x.%2.2x", j->baseframe.high, j->baseframe.low);
7389 			len += sprintf(buf + len, "\nCID Base Frame %2d", j->cid_base_frame_size);
7390 #ifdef PERFMON_STATS
7391 			len += sprintf(buf + len, "\nTimer Checks %ld", j->timerchecks);
7392 			len += sprintf(buf + len, "\nRX Ready Checks %ld", j->rxreadycheck);
7393 			len += sprintf(buf + len, "\nTX Ready Checks %ld", j->txreadycheck);
7394 			len += sprintf(buf + len, "\nFrames Read %ld", j->framesread);
7395 			len += sprintf(buf + len, "\nFrames Written %ld", j->frameswritten);
7396 			len += sprintf(buf + len, "\nDry Buffer %ld", j->drybuffer);
7397 			len += sprintf(buf + len, "\nRead Waits %ld", j->read_wait);
7398 			len += sprintf(buf + len, "\nWrite Waits %ld", j->write_wait);
7399                         len += sprintf(buf + len, "\nStatus Waits %ld", j->statuswait);
7400                         len += sprintf(buf + len, "\nStatus Wait Fails %ld", j->statuswaitfail);
7401                         len += sprintf(buf + len, "\nPControl Waits %ld", j->pcontrolwait);
7402                         len += sprintf(buf + len, "\nPControl Wait Fails %ld", j->pcontrolwaitfail);
7403                         len += sprintf(buf + len, "\nIs Control Ready Checks %ld", j->iscontrolready);
7404                         len += sprintf(buf + len, "\nIs Control Ready Check failures %ld", j->iscontrolreadyfail);
7405 
7406 #endif
7407 			len += sprintf(buf + len, "\n");
7408 		}
7409 	}
7410 	return len;
7411 }
7412 
ixj_read_proc(char * page,char ** start,off_t off,int count,int * eof,void * data)7413 static int ixj_read_proc(char *page, char **start, off_t off,
7414                               int count, int *eof, void *data)
7415 {
7416         int len = ixj_get_status_proc(page);
7417         if (len <= off+count) *eof = 1;
7418         *start = page + off;
7419         len -= off;
7420         if (len>count) len = count;
7421         if (len<0) len = 0;
7422         return len;
7423 }
7424 
7425 
cleanup(void)7426 static void cleanup(void)
7427 {
7428 	int cnt;
7429 	IXJ *j;
7430 
7431 	for (cnt = 0; cnt < IXJMAX; cnt++) {
7432 		j = get_ixj(cnt);
7433 		if(j != NULL && j->DSPbase) {
7434 			if (ixjdebug & 0x0002)
7435 				printk(KERN_INFO "IXJ: Deleting timer for /dev/phone%d\n", cnt);
7436 			del_timer(&j->timer);
7437 			if (j->cardtype == QTI_LINEJACK) {
7438 				j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
7439 
7440 				outb_p(j->pld_scrw.byte, j->XILINXbase);
7441 				j->pld_slicw.bits.rly1 = 0;
7442 				j->pld_slicw.bits.rly2 = 0;
7443 				j->pld_slicw.bits.rly3 = 0;
7444 				outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
7445 				LED_SetState(0x0, j);
7446 				if (ixjdebug & 0x0002)
7447 					printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7448 				release_region(j->XILINXbase, 8);
7449 			} else if (j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
7450 				if (ixjdebug & 0x0002)
7451 					printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7452 				release_region(j->XILINXbase, 4);
7453 			}
7454 			kfree(j->read_buffer);
7455 			kfree(j->write_buffer);
7456 			if (j->dev)
7457 				pnp_device_detach(j->dev);
7458 			if (ixjdebug & 0x0002)
7459 				printk(KERN_INFO "IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt);
7460 			phone_unregister_device(&j->p);
7461 			if (ixjdebug & 0x0002)
7462 				printk(KERN_INFO "IXJ: Releasing DSP address for /dev/phone%d\n", cnt);
7463 			release_region(j->DSPbase, 16);
7464 #ifdef IXJ_DYN_ALLOC
7465 			if (ixjdebug & 0x0002)
7466 				printk(KERN_INFO "IXJ: Freeing memory for /dev/phone%d\n", cnt);
7467 			kfree(j);
7468 			ixj[cnt] = NULL;
7469 #endif
7470 		}
7471 	}
7472 	if (ixjdebug & 0x0002)
7473 		printk(KERN_INFO "IXJ: Removing /proc/ixj\n");
7474 	remove_proc_entry ("ixj", NULL);
7475 }
7476 
7477 /* Typedefs */
7478 typedef struct {
7479 	BYTE length;
7480 	DWORD bits;
7481 } DATABLOCK;
7482 
PCIEE_WriteBit(WORD wEEPROMAddress,BYTE lastLCC,BYTE byData)7483 static void PCIEE_WriteBit(WORD wEEPROMAddress, BYTE lastLCC, BYTE byData)
7484 {
7485 	lastLCC = lastLCC & 0xfb;
7486 	lastLCC = lastLCC | (byData ? 4 : 0);
7487 	outb(lastLCC, wEEPROMAddress);	/*set data out bit as appropriate */
7488 
7489 	mdelay(1);
7490 	lastLCC = lastLCC | 0x01;
7491 	outb(lastLCC, wEEPROMAddress);	/*SK rising edge */
7492 
7493 	byData = byData << 1;
7494 	lastLCC = lastLCC & 0xfe;
7495 	mdelay(1);
7496 	outb(lastLCC, wEEPROMAddress);	/*after delay, SK falling edge */
7497 
7498 }
7499 
PCIEE_ReadBit(WORD wEEPROMAddress,BYTE lastLCC)7500 static BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC)
7501 {
7502 	mdelay(1);
7503 	lastLCC = lastLCC | 0x01;
7504 	outb(lastLCC, wEEPROMAddress);	/*SK rising edge */
7505 
7506 	lastLCC = lastLCC & 0xfe;
7507 	mdelay(1);
7508 	outb(lastLCC, wEEPROMAddress);	/*after delay, SK falling edge */
7509 
7510 	return ((inb(wEEPROMAddress) >> 3) & 1);
7511 }
7512 
PCIEE_ReadWord(WORD wAddress,WORD wLoc,WORD * pwResult)7513 static bool PCIEE_ReadWord(WORD wAddress, WORD wLoc, WORD * pwResult)
7514 {
7515 	BYTE lastLCC;
7516 	WORD wEEPROMAddress = wAddress + 3;
7517 	DWORD i;
7518 	BYTE byResult;
7519 	*pwResult = 0;
7520 	lastLCC = inb(wEEPROMAddress);
7521 	lastLCC = lastLCC | 0x02;
7522 	lastLCC = lastLCC & 0xfe;
7523 	outb(lastLCC, wEEPROMAddress);	/* CS hi, SK lo */
7524 
7525 	mdelay(1);		/* delay */
7526 
7527 	PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7528 	PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7529 	PCIEE_WriteBit(wEEPROMAddress, lastLCC, 0);
7530 	for (i = 0; i < 8; i++) {
7531 		PCIEE_WriteBit(wEEPROMAddress, lastLCC, wLoc & 0x80 ? 1 : 0);
7532 		wLoc <<= 1;
7533 	}
7534 
7535 	for (i = 0; i < 16; i++) {
7536 		byResult = PCIEE_ReadBit(wEEPROMAddress, lastLCC);
7537 		*pwResult = (*pwResult << 1) | byResult;
7538 	}
7539 
7540 	mdelay(1);		/* another delay */
7541 
7542 	lastLCC = lastLCC & 0xfd;
7543 	outb(lastLCC, wEEPROMAddress);	/* negate CS */
7544 
7545 	return 0;
7546 }
7547 
PCIEE_GetSerialNumber(WORD wAddress)7548 static DWORD PCIEE_GetSerialNumber(WORD wAddress)
7549 {
7550 	WORD wLo, wHi;
7551 	if (PCIEE_ReadWord(wAddress, 62, &wLo))
7552 		return 0;
7553 	if (PCIEE_ReadWord(wAddress, 63, &wHi))
7554 		return 0;
7555 	return (((DWORD) wHi << 16) | wLo);
7556 }
7557 
7558 static int dspio[IXJMAX + 1] =
7559 {
7560 	0,
7561 };
7562 static int xio[IXJMAX + 1] =
7563 {
7564 	0,
7565 };
7566 
7567 module_param_array(dspio, int, NULL, 0);
7568 module_param_array(xio, int, NULL, 0);
7569 MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net");
7570 MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
7571 MODULE_LICENSE("GPL");
7572 
ixj_exit(void)7573 static void __exit ixj_exit(void)
7574 {
7575         cleanup();
7576 }
7577 
new_ixj(unsigned long port)7578 static IXJ *new_ixj(unsigned long port)
7579 {
7580 	IXJ *res;
7581 	if (!request_region(port, 16, "ixj DSP")) {
7582 		printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", port);
7583 		return NULL;
7584 	}
7585 	res = ixj_alloc();
7586 	if (!res) {
7587 		release_region(port, 16);
7588 		printk(KERN_INFO "ixj: out of memory\n");
7589 		return NULL;
7590 	}
7591 	res->DSPbase = port;
7592 	return res;
7593 }
7594 
ixj_probe_isapnp(int * cnt)7595 static int __init ixj_probe_isapnp(int *cnt)
7596 {
7597 	int probe = 0;
7598 	int func = 0x110;
7599         struct pnp_dev *dev = NULL, *old_dev = NULL;
7600 
7601 	while (1) {
7602 		do {
7603 			IXJ *j;
7604 			int result;
7605 
7606 			old_dev = dev;
7607 			dev = pnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'),
7608 					 ISAPNP_FUNCTION(func), old_dev);
7609 			if (!dev || !dev->card)
7610 				break;
7611 			result = pnp_device_attach(dev);
7612 			if (result < 0) {
7613 				printk("pnp attach failed %d \n", result);
7614 				break;
7615 			}
7616 			if (pnp_activate_dev(dev) < 0) {
7617 				printk("pnp activate failed (out of resources?)\n");
7618 				pnp_device_detach(dev);
7619 				return -ENOMEM;
7620 			}
7621 
7622 			if (!pnp_port_valid(dev, 0)) {
7623 				pnp_device_detach(dev);
7624 				return -ENODEV;
7625 			}
7626 
7627 			j = new_ixj(pnp_port_start(dev, 0));
7628 			if (!j)
7629 				break;
7630 
7631 			if (func != 0x110)
7632 				j->XILINXbase = pnp_port_start(dev, 1);	/* get real port */
7633 
7634 			switch (func) {
7635 			case (0x110):
7636 				j->cardtype = QTI_PHONEJACK;
7637 				break;
7638 			case (0x310):
7639 				j->cardtype = QTI_LINEJACK;
7640 				break;
7641 			case (0x410):
7642 				j->cardtype = QTI_PHONEJACK_LITE;
7643 				break;
7644 			}
7645 			j->board = *cnt;
7646 			probe = ixj_selfprobe(j);
7647 			if(!probe) {
7648 				j->serial = dev->card->serial;
7649 				j->dev = dev;
7650 				switch (func) {
7651 				case 0x110:
7652 					printk(KERN_INFO "ixj: found Internet PhoneJACK at 0x%x\n", j->DSPbase);
7653 					break;
7654 				case 0x310:
7655 					printk(KERN_INFO "ixj: found Internet LineJACK at 0x%x\n", j->DSPbase);
7656 					break;
7657 				case 0x410:
7658 					printk(KERN_INFO "ixj: found Internet PhoneJACK Lite at 0x%x\n", j->DSPbase);
7659 					break;
7660 				}
7661 			}
7662 			++*cnt;
7663 		} while (dev);
7664 		if (func == 0x410)
7665 			break;
7666 		if (func == 0x310)
7667 			func = 0x410;
7668 		if (func == 0x110)
7669 			func = 0x310;
7670 		dev = NULL;
7671 	}
7672 	return probe;
7673 }
7674 
ixj_probe_isa(int * cnt)7675 static int __init ixj_probe_isa(int *cnt)
7676 {
7677 	int i, probe;
7678 
7679 	/* Use passed parameters for older kernels without PnP */
7680 	for (i = 0; i < IXJMAX; i++) {
7681 		if (dspio[i]) {
7682 			IXJ *j = new_ixj(dspio[i]);
7683 
7684 			if (!j)
7685 				break;
7686 
7687 			j->XILINXbase = xio[i];
7688 			j->cardtype = 0;
7689 
7690 			j->board = *cnt;
7691 			probe = ixj_selfprobe(j);
7692 			j->dev = NULL;
7693 			++*cnt;
7694 		}
7695 	}
7696 	return 0;
7697 }
7698 
ixj_probe_pci(int * cnt)7699 static int __init ixj_probe_pci(int *cnt)
7700 {
7701 	struct pci_dev *pci = NULL;
7702 	int i, probe = 0;
7703 	IXJ *j = NULL;
7704 
7705 	for (i = 0; i < IXJMAX - *cnt; i++) {
7706 		pci = pci_get_device(PCI_VENDOR_ID_QUICKNET,
7707 				      PCI_DEVICE_ID_QUICKNET_XJ, pci);
7708 		if (!pci)
7709 			break;
7710 
7711 		if (pci_enable_device(pci))
7712 			break;
7713 		j = new_ixj(pci_resource_start(pci, 0));
7714 		if (!j)
7715 			break;
7716 
7717 		j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2);
7718 		j->XILINXbase = j->DSPbase + 0x10;
7719 		j->cardtype = QTI_PHONEJACK_PCI;
7720 		j->board = *cnt;
7721 		probe = ixj_selfprobe(j);
7722 		if (!probe)
7723 			printk(KERN_INFO "ixj: found Internet PhoneJACK PCI at 0x%x\n", j->DSPbase);
7724 		++*cnt;
7725 	}
7726 	pci_dev_put(pci);
7727 	return probe;
7728 }
7729 
ixj_init(void)7730 static int __init ixj_init(void)
7731 {
7732 	int cnt = 0;
7733 	int probe = 0;
7734 
7735 	cnt = 0;
7736 
7737 	/* These might be no-ops, see above. */
7738 	if ((probe = ixj_probe_isapnp(&cnt)) < 0) {
7739 		return probe;
7740 	}
7741 	if ((probe = ixj_probe_isa(&cnt)) < 0) {
7742 		return probe;
7743 	}
7744 	if ((probe = ixj_probe_pci(&cnt)) < 0) {
7745 		return probe;
7746 	}
7747 	printk(KERN_INFO "ixj driver initialized.\n");
7748 	create_proc_read_entry ("ixj", 0, NULL, ixj_read_proc, NULL);
7749 	return probe;
7750 }
7751 
7752 module_init(ixj_init);
7753 module_exit(ixj_exit);
7754 
DAA_Coeff_US(IXJ * j)7755 static void DAA_Coeff_US(IXJ *j)
7756 {
7757 	int i;
7758 
7759 	j->daa_country = DAA_US;
7760 	/*----------------------------------------------- */
7761 	/* CAO */
7762 	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
7763 		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
7764 	}
7765 
7766 /* Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00 */
7767 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x03;
7768 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0x4B;
7769 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x5D;
7770 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xCD;
7771 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x24;
7772 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xC5;
7773 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
7774 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
7775 /* Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08 */
7776 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x71;
7777 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x1A;
7778 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
7779 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
7780 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xB5;
7781 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
7782 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
7783 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
7784 /* Bytes for FRX-filter       (08): 03,8F,48,F2,8F,48,70,08 */
7785 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x05;
7786 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xA3;
7787 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x72;
7788 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
7789 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x3F;
7790 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x3B;
7791 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
7792 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
7793 /* Bytes for FRR-filter       (07): 04,8F,38,7F,9B,EA,B0,08 */
7794 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x05;
7795 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
7796 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
7797 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x3E;
7798 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x32;
7799 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xDA;
7800 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
7801 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
7802 /* Bytes for AX-filter        (0A): 16,55,DD,CA */
7803 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x41;
7804 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
7805 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
7806 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
7807 /* Bytes for AR-filter        (09): 52,D3,11,42 */
7808 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
7809 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
7810 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
7811 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
7812 /* Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98 */
7813 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
7814 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
7815 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
7816 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
7817 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA5;
7818 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
7819 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
7820 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
7821 /* Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD */
7822 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
7823 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xA2;
7824 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2B;
7825 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
7826 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
7827 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAB;
7828 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
7829 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xCC;
7830 /* Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB */
7831 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
7832 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
7833 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xD2;
7834 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x24;
7835 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBA;
7836 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xA9;
7837 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x3B;
7838 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xA6;
7839 /* ;  (10K, 0.68uF) */
7840 	/*  */
7841 	/* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7842 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
7843 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
7844 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
7845 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
7846 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
7847 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
7848 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
7849 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
7850 	/* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7851 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
7852 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
7853 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
7854 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
7855 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
7856 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
7857 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
7858 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
7859 
7860 	/* Levelmetering Ringing        (0D):B2,45,0F,8E       */
7861 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
7862 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
7863 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
7864 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
7865 
7866 	/* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7867 /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1C; */
7868 /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0xB3; */
7869 /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0xAB; */
7870 /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xAB; */
7871 /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x54; */
7872 /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x2D; */
7873 /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0x62; */
7874 /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x2D; */
7875 	/* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7876 /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x2D; */
7877 /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x62; */
7878 /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; */
7879 /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBB; */
7880 /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x2A; */
7881 /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7D; */
7882 /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; */
7883 /*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD4; */
7884 /* */
7885 	/* Levelmetering Ringing        (0D):B2,45,0F,8E       */
7886 /*	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; */
7887 /*	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x05; */
7888 /*	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; */
7889 /*	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; */
7890 
7891 	/* Caller ID 1st Tone           (0E):CA,0E,CA,09,99,99,99,99 */
7892 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
7893 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
7894 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
7895 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
7896 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
7897 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
7898 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
7899 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
7900 /* Caller ID 2nd Tone           (0F):FD,B5,BA,07,DA,00,00,00 */
7901 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
7902 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
7903 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
7904 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
7905 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
7906 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
7907 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
7908 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
7909 /*  */
7910 	/* ;CR Registers */
7911 	/* Config. Reg. 0 (filters)       (cr0):FE ; CLK gen. by crystal */
7912 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
7913 /* Config. Reg. 1 (dialing)       (cr1):05 */
7914 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
7915 /* Config. Reg. 2 (caller ID)     (cr2):04 */
7916 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
7917 /* Config. Reg. 3 (testloops)     (cr3):03 ; SEL Bit==0, HP-disabled */
7918 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
7919 /* Config. Reg. 4 (analog gain)   (cr4):02 */
7920 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
7921 	/* Config. Reg. 5 (Version)       (cr5):02 */
7922 	/* Config. Reg. 6 (Reserved)      (cr6):00 */
7923 	/* Config. Reg. 7 (Reserved)      (cr7):00 */
7924 	/*  */
7925 	/* ;xr Registers */
7926 	/* Ext. Reg. 0 (Interrupt Reg.)   (xr0):02 */
7927 
7928 	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
7929 	/* Ext. Reg. 1 (Interrupt enable) (xr1):3C Cadence, RING, Caller ID, VDD_OK */
7930 
7931 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x3C;
7932 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
7933 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
7934 /* Ext. Reg. 3 (DC Char)          (xr3):32 ; B-Filter Off == 1 */
7935 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x3B;		/*0x32; */
7936 	/* Ext. Reg. 4 (Cadence)          (xr4):00 */
7937 
7938 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
7939 /* Ext. Reg. 5 (Ring timer)       (xr5):22 */
7940 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
7941 /* Ext. Reg. 6 (Power State)      (xr6):00 */
7942 	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
7943 /* Ext. Reg. 7 (Vdd)              (xr7):40 */
7944 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		/* 0x40 ??? Should it be 0x00? */
7945 	/*  */
7946 	/* DTMF Tone 1                     (0B): 11,B3,5A,2C ;   697 Hz   */
7947 	/*                                       12,33,5A,C3 ;  770 Hz   */
7948 	/*                                       13,3C,5B,32 ;  852 Hz   */
7949 	/*                                       1D,1B,5C,CC ;  941 Hz   */
7950 
7951 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
7952 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
7953 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
7954 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
7955 /* DTMF Tone 2                     (0C): 32,32,52,B3 ;  1209 Hz   */
7956 	/*                                       EC,1D,52,22 ;  1336 Hz   */
7957 	/*                                       AA,AC,51,D2 ;  1477 Hz   */
7958 	/*                                       9B,3B,51,25 ;  1633 Hz   */
7959 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
7960 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
7961 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
7962 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
7963 }
7964 
DAA_Coeff_UK(IXJ * j)7965 static void DAA_Coeff_UK(IXJ *j)
7966 {
7967 	int i;
7968 
7969 	j->daa_country = DAA_UK;
7970 	/*----------------------------------------------- */
7971 	/* CAO */
7972 	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
7973 		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
7974 	}
7975 
7976 /*  Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00 */
7977 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
7978 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xC2;
7979 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
7980 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xA8;
7981 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xCB;
7982 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
7983 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
7984 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
7985 /* Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08 */
7986 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x40;
7987 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x00;
7988 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
7989 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
7990 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xA4;
7991 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
7992 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
7993 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
7994 /* Bytes for FRX-filter       (08): 07,9B,ED,24,B2,A2,A0,08 */
7995 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
7996 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9B;
7997 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xED;
7998 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x24;
7999 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0xB2;
8000 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0xA2;
8001 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xA0;
8002 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8003 /* Bytes for FRR-filter       (07): 0F,92,F2,B2,87,D2,30,08 */
8004 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
8005 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x92;
8006 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF2;
8007 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0xB2;
8008 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8009 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xD2;
8010 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x30;
8011 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8012 /* Bytes for AX-filter        (0A): 1B,A5,DD,CA */
8013 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x1B;
8014 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xA5;
8015 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8016 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8017 /* Bytes for AR-filter        (09): E2,27,10,D6 */
8018 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8019 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x27;
8020 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8021 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8022 /* Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98 */
8023 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8024 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x2D;
8025 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x38;
8026 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x8B;
8027 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xD0;
8028 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x00;
8029 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8030 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8031 /* Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4 */
8032 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8033 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x5A;
8034 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x53;
8035 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xF0;
8036 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x0B;
8037 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5F;
8038 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x84;
8039 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xD4;
8040 /* Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32 */
8041 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8042 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8043 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x6A;
8044 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA4;
8045 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x8F;
8046 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x52;
8047 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xF5;
8048 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x32;
8049 /* ; idle */
8050 	/* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8051 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8052 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8053 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8054 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8055 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8056 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8057 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8058 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8059 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8060 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8061 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8062 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8063 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8064 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8065 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8066 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8067 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8068 /* Levelmetering Ringing           (0D):AA,35,0F,8E     ; 25Hz 30V less possible? */
8069 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8070 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8071 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8072 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8073 /* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
8074 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8075 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8076 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8077 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8078 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8079 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8080 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8081 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8082 /* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
8083 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8084 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8085 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8086 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8087 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8088 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8089 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8090 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8091 /* ;CR Registers */
8092 	/* Config. Reg. 0 (filters)        (cr0):FF */
8093 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8094 /* Config. Reg. 1 (dialing)        (cr1):05 */
8095 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8096 /* Config. Reg. 2 (caller ID)      (cr2):04 */
8097 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8098 /* Config. Reg. 3 (testloops)      (cr3):00        ;  */
8099 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8100 /* Config. Reg. 4 (analog gain)    (cr4):02 */
8101 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8102 	/* Config. Reg. 5 (Version)        (cr5):02 */
8103 	/* Config. Reg. 6 (Reserved)       (cr6):00 */
8104 	/* Config. Reg. 7 (Reserved)       (cr7):00 */
8105 	/* ;xr Registers */
8106 	/* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
8107 
8108 	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
8109 	/* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */
8110 
8111 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */
8112 	/* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
8113 
8114 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8115 /* Ext. Reg. 3 (DC Char)           (xr3):36        ;  */
8116 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8117 /* Ext. Reg. 4 (Cadence)           (xr4):00 */
8118 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8119 /* Ext. Reg. 5 (Ring timer)        (xr5):22 */
8120 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8121 /* Ext. Reg. 6 (Power State)       (xr6):00 */
8122 	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8123 /* Ext. Reg. 7 (Vdd)               (xr7):46 */
8124 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46;		/* 0x46 ??? Should it be 0x00? */
8125 	/* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
8126 	/*                                       12,33,5A,C3    ;  770 Hz   */
8127 	/*                                       13,3C,5B,32    ;  852 Hz   */
8128 	/*                                       1D,1B,5C,CC    ;  941 Hz   */
8129 
8130 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8131 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8132 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8133 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8134 /* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
8135 	/*                                       EC,1D,52,22    ;  1336 Hz   */
8136 	/*                                       AA,AC,51,D2    ;  1477 Hz   */
8137 	/*                                       9B,3B,51,25    ;  1633 Hz   */
8138 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8139 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8140 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8141 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8142 }
8143 
8144 
DAA_Coeff_France(IXJ * j)8145 static void DAA_Coeff_France(IXJ *j)
8146 {
8147 	int i;
8148 
8149 	j->daa_country = DAA_FRANCE;
8150 	/*----------------------------------------------- */
8151 	/* CAO */
8152 	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8153 		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8154 	}
8155 
8156 /* Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00 */
8157 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x02;
8158 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA2;
8159 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x43;
8160 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2C;
8161 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x22;
8162 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xAF;
8163 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8164 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8165 /* Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08 */
8166 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x67;
8167 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xCE;
8168 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8169 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x2C;
8170 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x22;
8171 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8172 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8173 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8174 /* Bytes for FRX-filter       (08): 07,9A,28,F6,23,4A,B0,08 */
8175 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8176 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9A;
8177 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x28;
8178 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0xF6;
8179 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x23;
8180 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x4A;
8181 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xB0;
8182 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8183 /* Bytes for FRR-filter       (07): 03,8F,F9,2F,9E,FA,20,08 */
8184 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8185 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8186 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
8187 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8188 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9E;
8189 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xFA;
8190 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8191 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8192 /* Bytes for AX-filter        (0A): 16,B5,DD,CA */
8193 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x16;
8194 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
8195 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8196 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8197 /* Bytes for AR-filter        (09): 52,C7,10,D6 */
8198 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8199 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
8200 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8201 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8202 /* Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98 */
8203 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8204 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8205 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8206 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8207 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA6;
8208 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8209 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8210 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8211 /* Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C */
8212 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8213 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAC;
8214 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8215 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x30;
8216 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x78;
8217 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAC;
8218 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x8A;
8219 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x2C;
8220 /* Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45 */
8221 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8222 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8223 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8224 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA5;
8225 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x22;
8226 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA;
8227 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2C;
8228 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x45;
8229 /* ; idle */
8230 	/* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8231 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8232 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8233 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8234 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8235 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8236 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8237 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8238 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8239 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8240 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8241 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8242 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8243 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8244 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8245 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8246 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8247 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8248 /* Levelmetering Ringing           (0D):32,45,B5,84     ; 50Hz 20V */
8249 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8250 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8251 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8252 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8253 /* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
8254 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8255 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8256 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8257 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8258 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8259 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8260 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8261 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8262 /* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
8263 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8264 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8265 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8266 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8267 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8268 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8269 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8270 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8271 /* ;CR Registers */
8272 	/* Config. Reg. 0 (filters)        (cr0):FF */
8273 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8274 /* Config. Reg. 1 (dialing)        (cr1):05 */
8275 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8276 /* Config. Reg. 2 (caller ID)      (cr2):04 */
8277 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8278 /* Config. Reg. 3 (testloops)      (cr3):00        ;  */
8279 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8280 /* Config. Reg. 4 (analog gain)    (cr4):02 */
8281 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8282 	/* Config. Reg. 5 (Version)        (cr5):02 */
8283 	/* Config. Reg. 6 (Reserved)       (cr6):00 */
8284 	/* Config. Reg. 7 (Reserved)       (cr7):00 */
8285 	/* ;xr Registers */
8286 	/* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
8287 
8288 	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
8289 	/* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */
8290 
8291 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */
8292 	/* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
8293 
8294 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8295 /* Ext. Reg. 3 (DC Char)           (xr3):36        ;  */
8296 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8297 /* Ext. Reg. 4 (Cadence)           (xr4):00 */
8298 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8299 /* Ext. Reg. 5 (Ring timer)        (xr5):22 */
8300 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8301 /* Ext. Reg. 6 (Power State)       (xr6):00 */
8302 	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8303 /* Ext. Reg. 7 (Vdd)               (xr7):46 */
8304 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46;		/* 0x46 ??? Should it be 0x00? */
8305 	/* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
8306 	/*                                       12,33,5A,C3    ;  770 Hz   */
8307 	/*                                       13,3C,5B,32    ;  852 Hz   */
8308 	/*                                       1D,1B,5C,CC    ;  941 Hz   */
8309 
8310 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8311 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8312 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8313 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8314 /* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
8315 	/*                                       EC,1D,52,22    ;  1336 Hz   */
8316 	/*                                       AA,AC,51,D2    ;  1477 Hz   */
8317 	/*                                       9B,3B,51,25    ;  1633 Hz   */
8318 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8319 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8320 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8321 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8322 }
8323 
8324 
DAA_Coeff_Germany(IXJ * j)8325 static void DAA_Coeff_Germany(IXJ *j)
8326 {
8327 	int i;
8328 
8329 	j->daa_country = DAA_GERMANY;
8330 	/*----------------------------------------------- */
8331 	/* CAO */
8332 	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8333 		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8334 	}
8335 
8336 /* Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00 */
8337 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8338 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xCE;
8339 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
8340 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xB8;
8341 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xD2;
8342 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
8343 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xB0;
8344 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8345 /* Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08 */
8346 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x45;
8347 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x8F;
8348 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8349 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0C;
8350 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xD2;
8351 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x3A;
8352 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xD0;
8353 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8354 /* Bytes for FRX-filter       (08): 07,AA,E2,34,24,89,20,08 */
8355 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8356 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xAA;
8357 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8358 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8359 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x24;
8360 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x89;
8361 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x20;
8362 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8363 /* Bytes for FRR-filter       (07): 02,87,FA,37,9A,CA,B0,08 */
8364 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x02;
8365 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
8366 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xFA;
8367 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x37;
8368 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9A;
8369 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCA;
8370 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
8371 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8372 /* Bytes for AX-filter        (0A): 72,D5,DD,CA */
8373 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x72;
8374 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xD5;
8375 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8376 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8377 /* Bytes for AR-filter        (09): 72,42,13,4B */
8378 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x72;
8379 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x42;
8380 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x13;
8381 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x4B;
8382 /* Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98 */
8383 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8384 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8385 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8386 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8387 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAD;
8388 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8389 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8390 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8391 /* Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27 */
8392 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8393 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x42;
8394 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x5A;
8395 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8396 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
8397 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x1A;
8398 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
8399 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x27;
8400 /* Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2 */
8401 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8402 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8403 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x63;
8404 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x26;
8405 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBD;
8406 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x4B;
8407 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xA3;
8408 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xC2;
8409 /* ;  (10K, 0.68uF) */
8410 	/* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
8411 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8412 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3B;
8413 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x9B;
8414 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xBA;
8415 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0xD4;
8416 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x1C;
8417 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xB3;
8418 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8419 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
8420 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x13;
8421 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42;
8422 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8423 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8424 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0xD4;
8425 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x73;
8426 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0xCA;
8427 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8428 /* Levelmetering Ringing        (0D):B2,45,0F,8E       */
8429 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xB2;
8430 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8431 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8432 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8433 /* Caller ID 1st Tone           (0E):CA,0E,CA,09,99,99,99,99 */
8434 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8435 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8436 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8437 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8438 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8439 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8440 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8441 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8442 /* Caller ID 2nd Tone           (0F):FD,B5,BA,07,DA,00,00,00 */
8443 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8444 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8445 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8446 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8447 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8448 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8449 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8450 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8451 /* ;CR Registers */
8452 	/* Config. Reg. 0 (filters)        (cr0):FF ; all Filters enabled, CLK from ext. source */
8453 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8454 /* Config. Reg. 1 (dialing)        (cr1):05 ; Manual Ring, Ring metering enabled */
8455 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8456 /* Config. Reg. 2 (caller ID)      (cr2):04 ; Analog Gain 0dB, FSC internal */
8457 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8458 /* Config. Reg. 3 (testloops)      (cr3):00 ; SEL Bit==0, HP-enabled */
8459 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8460 /* Config. Reg. 4 (analog gain)    (cr4):02 */
8461 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8462 	/* Config. Reg. 5 (Version)        (cr5):02 */
8463 	/* Config. Reg. 6 (Reserved)       (cr6):00 */
8464 	/* Config. Reg. 7 (Reserved)       (cr7):00 */
8465 	/* ;xr Registers */
8466 	/* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
8467 
8468 	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
8469 	/* Ext. Reg. 1 (Interrupt enable)  (xr1):1C ; Ring, CID, VDDOK Interrupts enabled */
8470 
8471 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */
8472 	/* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
8473 
8474 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8475 /* Ext. Reg. 3 (DC Char)           (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm */
8476 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x32;
8477 /* Ext. Reg. 4 (Cadence)           (xr4):00 */
8478 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8479 /* Ext. Reg. 5 (Ring timer)        (xr5):22 */
8480 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8481 /* Ext. Reg. 6 (Power State)       (xr6):00 */
8482 	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8483 /* Ext. Reg. 7 (Vdd)               (xr7):40 ; VDD=4.25 V */
8484 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		/* 0x40 ??? Should it be 0x00? */
8485 	/* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
8486 	/*                                       12,33,5A,C3    ;  770 Hz   */
8487 	/*                                       13,3C,5B,32    ;  852 Hz   */
8488 	/*                                       1D,1B,5C,CC    ;  941 Hz   */
8489 
8490 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8491 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8492 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8493 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8494 /* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
8495 	/*                                       EC,1D,52,22    ;  1336 Hz   */
8496 	/*                                       AA,AC,51,D2    ;  1477 Hz   */
8497 	/*                                       9B,3B,51,25    ;  1633 Hz   */
8498 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8499 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8500 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8501 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8502 }
8503 
8504 
DAA_Coeff_Australia(IXJ * j)8505 static void DAA_Coeff_Australia(IXJ *j)
8506 {
8507 	int i;
8508 
8509 	j->daa_country = DAA_AUSTRALIA;
8510 	/*----------------------------------------------- */
8511 	/* CAO */
8512 	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8513 		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8514 	}
8515 
8516 /* Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00 */
8517 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8518 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA3;
8519 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xAA;
8520 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x28;
8521 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xB3;
8522 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x82;
8523 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xD0;
8524 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8525 /* Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08 */
8526 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x70;
8527 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x96;
8528 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8529 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x09;
8530 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x32;
8531 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x6B;
8532 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xC0;
8533 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8534 /* Bytes for FRX-filter       (08): 07,96,E2,34,32,9B,30,08 */
8535 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8536 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x96;
8537 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8538 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8539 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x32;
8540 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x9B;
8541 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
8542 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8543 /* Bytes for FRR-filter       (07): 0F,9A,E9,2F,22,CC,A0,08 */
8544 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
8545 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x9A;
8546 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xE9;
8547 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8548 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x22;
8549 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCC;
8550 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xA0;
8551 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8552 /* Bytes for AX-filter        (0A): CB,45,DD,CA */
8553 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0xCB;
8554 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x45;
8555 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8556 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8557 /* Bytes for AR-filter        (09): 1B,67,10,D6 */
8558 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x1B;
8559 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x67;
8560 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8561 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8562 /* Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98 */
8563 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8564 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8565 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8566 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8567 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAF;
8568 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8569 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8570 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8571 /* Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC */
8572 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8573 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xDB;
8574 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x52;
8575 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
8576 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x38;
8577 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x01;
8578 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x82;
8579 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAC;
8580 /* Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46 */
8581 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8582 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8583 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x4A;
8584 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x3E;
8585 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x2C;
8586 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x3B;
8587 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x24;
8588 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x46;
8589 /* ;  idle */
8590 	/* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8591 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8592 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8593 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8594 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8595 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8596 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8597 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8598 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8599 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8600 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8601 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8602 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8603 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8604 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8605 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8606 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8607 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8608 /* Levelmetering Ringing           (0D):32,45,B5,84   ; 50Hz 20V */
8609 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8610 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8611 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8612 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8613 /* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
8614 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8615 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8616 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8617 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8618 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8619 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8620 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8621 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8622 /* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
8623 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8624 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8625 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8626 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8627 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8628 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8629 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8630 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8631 /* ;CR Registers */
8632 	/* Config. Reg. 0 (filters)        (cr0):FF */
8633 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8634 /* Config. Reg. 1 (dialing)        (cr1):05 */
8635 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8636 /* Config. Reg. 2 (caller ID)      (cr2):04 */
8637 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8638 /* Config. Reg. 3 (testloops)      (cr3):00        ;  */
8639 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8640 /* Config. Reg. 4 (analog gain)    (cr4):02 */
8641 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8642 	/* Config. Reg. 5 (Version)        (cr5):02 */
8643 	/* Config. Reg. 6 (Reserved)       (cr6):00 */
8644 	/* Config. Reg. 7 (Reserved)       (cr7):00 */
8645 	/* ;xr Registers */
8646 	/* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
8647 
8648 	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
8649 	/* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */
8650 
8651 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */
8652 	/* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
8653 
8654 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8655 /* Ext. Reg. 3 (DC Char)           (xr3):2B      ;  */
8656 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x2B;
8657 /* Ext. Reg. 4 (Cadence)           (xr4):00 */
8658 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8659 /* Ext. Reg. 5 (Ring timer)        (xr5):22 */
8660 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8661 /* Ext. Reg. 6 (Power State)       (xr6):00 */
8662 	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8663 /* Ext. Reg. 7 (Vdd)               (xr7):40 */
8664 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		/* 0x40 ??? Should it be 0x00? */
8665 
8666 	/* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;  697 Hz   */
8667 	/*                                       12,33,5A,C3    ;  770 Hz   */
8668 	/*                                       13,3C,5B,32    ;  852 Hz   */
8669 	/*                                       1D,1B,5C,CC    ;  941 Hz   */
8670 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8671 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8672 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8673 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8674 
8675 	/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
8676 	/*                                       EC,1D,52,22    ;  1336 Hz   */
8677 	/*                                       AA,AC,51,D2    ;  1477 Hz   */
8678 	/*                                       9B,3B,51,25    ;  1633 Hz   */
8679 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8680 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8681 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8682 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8683 }
8684 
DAA_Coeff_Japan(IXJ * j)8685 static void DAA_Coeff_Japan(IXJ *j)
8686 {
8687 	int i;
8688 
8689 	j->daa_country = DAA_JAPAN;
8690 	/*----------------------------------------------- */
8691 	/* CAO */
8692 	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8693 		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8694 	}
8695 
8696 /* Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00 */
8697 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x06;
8698 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xBD;
8699 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2;
8700 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2D;
8701 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xBA;
8702 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xF9;
8703 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8704 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8705 /* Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08 */
8706 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x6F;
8707 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xF7;
8708 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8709 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0E;
8710 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x34;
8711 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8712 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8713 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8714 /* Bytes for FRX-filter       (08): 02,8F,68,77,9C,58,F0,08 */
8715 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x02;
8716 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F;
8717 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x68;
8718 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x77;
8719 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x9C;
8720 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x58;
8721 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xF0;
8722 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8723 /* Bytes for FRR-filter       (07): 03,8F,38,73,87,EA,20,08 */
8724 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8725 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8726 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0x38;
8727 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x73;
8728 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8729 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA;
8730 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8731 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8732 /* Bytes for AX-filter        (0A): 51,C5,DD,CA */
8733 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x51;
8734 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xC5;
8735 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8736 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8737 /* Bytes for AR-filter        (09): 25,A7,10,D6 */
8738 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
8739 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xA7;
8740 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8741 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8742 /* Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98 */
8743 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8744 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8745 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8746 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8747 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAE;
8748 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8749 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8750 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8751 /* Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28 */
8752 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8753 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAB;
8754 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8755 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8756 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x99;
8757 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5B;
8758 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x89;
8759 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x28;
8760 /* Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA */
8761 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8762 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8763 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8764 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x25;
8765 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x34;
8766 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xC5;
8767 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x4C;
8768 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBA;
8769 /* ;  idle */
8770 	/* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8771 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8772 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8773 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8774 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8775 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8776 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8777 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8778 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8779 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8780 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8781 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8782 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8783 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8784 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8785 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8786 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8787 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8788 /* Levelmetering Ringing           (0D):AA,35,0F,8E    ; 25Hz 30V ????????? */
8789 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8790 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8791 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8792 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8793 /* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
8794 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8795 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8796 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8797 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8798 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8799 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8800 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8801 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8802 /* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
8803 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8804 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8805 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8806 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8807 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8808 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8809 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8810 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8811 /* ;CR Registers */
8812 	/* Config. Reg. 0 (filters)        (cr0):FF */
8813 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8814 /* Config. Reg. 1 (dialing)        (cr1):05 */
8815 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8816 /* Config. Reg. 2 (caller ID)      (cr2):04 */
8817 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8818 /* Config. Reg. 3 (testloops)      (cr3):00        ;  */
8819 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8820 /* Config. Reg. 4 (analog gain)    (cr4):02 */
8821 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8822 	/* Config. Reg. 5 (Version)        (cr5):02 */
8823 	/* Config. Reg. 6 (Reserved)       (cr6):00 */
8824 	/* Config. Reg. 7 (Reserved)       (cr7):00 */
8825 	/* ;xr Registers */
8826 	/* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
8827 
8828 	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
8829 	/* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */
8830 
8831 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */
8832 	/* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
8833 
8834 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8835 /* Ext. Reg. 3 (DC Char)           (xr3):22        ;  */
8836 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x22;
8837 /* Ext. Reg. 4 (Cadence)           (xr4):00 */
8838 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8839 /* Ext. Reg. 5 (Ring timer)        (xr5):22 */
8840 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8841 /* Ext. Reg. 6 (Power State)       (xr6):00 */
8842 	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8843 /* Ext. Reg. 7 (Vdd)               (xr7):40 */
8844 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		/* 0x40 ??? Should it be 0x00? */
8845 	/* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
8846 	/*                                       12,33,5A,C3    ;  770 Hz   */
8847 	/*                                       13,3C,5B,32    ;  852 Hz   */
8848 	/*                                       1D,1B,5C,CC    ;  941 Hz   */
8849 
8850 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8851 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8852 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8853 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8854 /* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
8855 	/*                                       EC,1D,52,22    ;  1336 Hz   */
8856 	/*                                       AA,AC,51,D2    ;  1477 Hz   */
8857 	/*                                       9B,3B,51,25    ;  1633 Hz   */
8858 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8859 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8860 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8861 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8862 }
8863 
8864 static s16 tone_table[][19] =
8865 {
8866 	{			/* f20_50[] 11 */
8867 		32538,		/* A1 = 1.985962 */
8868 		 -32325,	/* A2 = -0.986511 */
8869 		 -343,		/* B2 = -0.010493 */
8870 		 0,		/* B1 = 0 */
8871 		 343,		/* B0 = 0.010493 */
8872 		 32619,		/* A1 = 1.990906 */
8873 		 -32520,	/* A2 = -0.992462 */
8874 		 19179,		/* B2 = 0.585327 */
8875 		 -19178,	/* B1 = -1.170593 */
8876 		 19179,		/* B0 = 0.585327 */
8877 		 32723,		/* A1 = 1.997314 */
8878 		 -32686,	/* A2 = -0.997528 */
8879 		 9973,		/* B2 = 0.304352 */
8880 		 -9955,		/* B1 = -0.607605 */
8881 		 9973,		/* B0 = 0.304352 */
8882 		 7,		/* Internal filter scaling */
8883 		 159,		/* Minimum in-band energy threshold */
8884 		 21,		/* 21/32 in-band to broad-band ratio */
8885 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8886 	},
8887 	{			/* f133_200[] 12 */
8888 		32072,		/* A1 = 1.95752 */
8889 		 -31896,	/* A2 = -0.973419 */
8890 		 -435,		/* B2 = -0.013294 */
8891 		 0,		/* B1 = 0 */
8892 		 435,		/* B0 = 0.013294 */
8893 		 32188,		/* A1 = 1.9646 */
8894 		 -32400,	/* A2 = -0.98877 */
8895 		 15139,		/* B2 = 0.462036 */
8896 		 -14882,	/* B1 = -0.908356 */
8897 		 15139,		/* B0 = 0.462036 */
8898 		 32473,		/* A1 = 1.981995 */
8899 		 -32524,	/* A2 = -0.992584 */
8900 		 23200,		/* B2 = 0.708008 */
8901 		 -23113,	/* B1 = -1.410706 */
8902 		 23200,		/* B0 = 0.708008 */
8903 		 7,		/* Internal filter scaling */
8904 		 159,		/* Minimum in-band energy threshold */
8905 		 21,		/* 21/32 in-band to broad-band ratio */
8906 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8907 	},
8908 	{			/* f300 13 */
8909 		31769,		/* A1 = -1.939026 */
8910 		 -32584,	/* A2 = 0.994385 */
8911 		 -475,		/* B2 = -0.014522 */
8912 		 0,		/* B1 = 0.000000 */
8913 		 475,		/* B0 = 0.014522 */
8914 		 31789,		/* A1 = -1.940247 */
8915 		 -32679,	/* A2 = 0.997284 */
8916 		 17280,		/* B2 = 0.527344 */
8917 		 -16865,	/* B1 = -1.029358 */
8918 		 17280,		/* B0 = 0.527344 */
8919 		 31841,		/* A1 = -1.943481 */
8920 		 -32681,	/* A2 = 0.997345 */
8921 		 543,		/* B2 = 0.016579 */
8922 		 -525,		/* B1 = -0.032097 */
8923 		 543,		/* B0 = 0.016579 */
8924 		 5,		/* Internal filter scaling */
8925 		 159,		/* Minimum in-band energy threshold */
8926 		 21,		/* 21/32 in-band to broad-band ratio */
8927 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8928 	},
8929 	{			/* f300_420[] 14 */
8930 		30750,		/* A1 = 1.876892 */
8931 		 -31212,	/* A2 = -0.952515 */
8932 		 -804,		/* B2 = -0.024541 */
8933 		 0,		/* B1 = 0 */
8934 		 804,		/* B0 = 0.024541 */
8935 		 30686,		/* A1 = 1.872925 */
8936 		 -32145,	/* A2 = -0.980988 */
8937 		 14747,		/* B2 = 0.450043 */
8938 		 -13703,	/* B1 = -0.836395 */
8939 		 14747,		/* B0 = 0.450043 */
8940 		 31651,		/* A1 = 1.931824 */
8941 		 -32321,	/* A2 = -0.986389 */
8942 		 24425,		/* B2 = 0.745422 */
8943 		 -23914,	/* B1 = -1.459595 */
8944 		 24427,		/* B0 = 0.745483 */
8945 		 7,		/* Internal filter scaling */
8946 		 159,		/* Minimum in-band energy threshold */
8947 		 21,		/* 21/32 in-band to broad-band ratio */
8948 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8949 	},
8950 	{			/* f330 15 */
8951 		31613,		/* A1 = -1.929565 */
8952 		 -32646,	/* A2 = 0.996277 */
8953 		 -185,		/* B2 = -0.005657 */
8954 		 0,		/* B1 = 0.000000 */
8955 		 185,		/* B0 = 0.005657 */
8956 		 31620,		/* A1 = -1.929932 */
8957 		 -32713,	/* A2 = 0.998352 */
8958 		 19253,		/* B2 = 0.587585 */
8959 		 -18566,	/* B1 = -1.133179 */
8960 		 19253,		/* B0 = 0.587585 */
8961 		 31674,		/* A1 = -1.933228 */
8962 		 -32715,	/* A2 = 0.998413 */
8963 		 2575,		/* B2 = 0.078590 */
8964 		 -2495,		/* B1 = -0.152283 */
8965 		 2575,		/* B0 = 0.078590 */
8966 		 5,		/* Internal filter scaling */
8967 		 159,		/* Minimum in-band energy threshold */
8968 		 21,		/* 21/32 in-band to broad-band ratio */
8969 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8970 	},
8971 	{			/* f300_425[] 16 */
8972 		30741,		/* A1 = 1.876282 */
8973 		 -31475,	/* A2 = -0.960541 */
8974 		 -703,		/* B2 = -0.021484 */
8975 		 0,		/* B1 = 0 */
8976 		 703,		/* B0 = 0.021484 */
8977 		 30688,		/* A1 = 1.873047 */
8978 		 -32248,	/* A2 = -0.984161 */
8979 		 14542,		/* B2 = 0.443787 */
8980 		 -13523,	/* B1 = -0.825439 */
8981 		 14542,		/* B0 = 0.443817 */
8982 		 31494,		/* A1 = 1.922302 */
8983 		 -32366,	/* A2 = -0.987762 */
8984 		 21577,		/* B2 = 0.658508 */
8985 		 -21013,	/* B1 = -1.282532 */
8986 		 21577,		/* B0 = 0.658508 */
8987 		 7,		/* Internal filter scaling */
8988 		 159,		/* Minimum in-band energy threshold */
8989 		 21,		/* 21/32 in-band to broad-band ratio */
8990 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8991 	},
8992 	{			/* f330_440[] 17 */
8993 		30627,		/* A1 = 1.869324 */
8994 		 -31338,	/* A2 = -0.95636 */
8995 		 -843,		/* B2 = -0.025749 */
8996 		 0,		/* B1 = 0 */
8997 		 843,		/* B0 = 0.025749 */
8998 		 30550,		/* A1 = 1.864685 */
8999 		 -32221,	/* A2 = -0.983337 */
9000 		 13594,		/* B2 = 0.414886 */
9001 		 -12589,	/* B1 = -0.768402 */
9002 		 13594,		/* B0 = 0.414886 */
9003 		 31488,		/* A1 = 1.921936 */
9004 		 -32358,	/* A2 = -0.987518 */
9005 		 24684,		/* B2 = 0.753296 */
9006 		 -24029,	/* B1 = -1.466614 */
9007 		 24684,		/* B0 = 0.753296 */
9008 		 7,		/* Internal filter scaling */
9009 		 159,		/* Minimum in-band energy threshold */
9010 		 21,		/* 21/32 in-band to broad-band ratio */
9011 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9012 	},
9013 	{			/* f340 18 */
9014 		31546,		/* A1 = -1.925476 */
9015 		 -32646,	/* A2 = 0.996277 */
9016 		 -445,		/* B2 = -0.013588 */
9017 		 0,		/* B1 = 0.000000 */
9018 		 445,		/* B0 = 0.013588 */
9019 		 31551,		/* A1 = -1.925781 */
9020 		 -32713,	/* A2 = 0.998352 */
9021 		 23884,		/* B2 = 0.728882 */
9022 		 -22979,	/* B1 = -1.402527 */
9023 		 23884,		/* B0 = 0.728882 */
9024 		 31606,		/* A1 = -1.929138 */
9025 		 -32715,	/* A2 = 0.998413 */
9026 		 863,		/* B2 = 0.026367 */
9027 		 -835,		/* B1 = -0.050985 */
9028 		 863,		/* B0 = 0.026367 */
9029 		 5,		/* Internal filter scaling */
9030 		 159,		/* Minimum in-band energy threshold */
9031 		 21,		/* 21/32 in-band to broad-band ratio */
9032 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9033 	},
9034 	{			/* f350_400[] 19 */
9035 		31006,		/* A1 = 1.892517 */
9036 		 -32029,	/* A2 = -0.977448 */
9037 		 -461,		/* B2 = -0.014096 */
9038 		 0,		/* B1 = 0 */
9039 		 461,		/* B0 = 0.014096 */
9040 		 30999,		/* A1 = 1.892029 */
9041 		 -32487,	/* A2 = -0.991455 */
9042 		 11325,		/* B2 = 0.345612 */
9043 		 -10682,	/* B1 = -0.651978 */
9044 		 11325,		/* B0 = 0.345612 */
9045 		 31441,		/* A1 = 1.919067 */
9046 		 -32526,	/* A2 = -0.992615 */
9047 		 24324,		/* B2 = 0.74231 */
9048 		 -23535,	/* B1 = -1.436523 */
9049 		 24324,		/* B0 = 0.74231 */
9050 		 7,		/* Internal filter scaling */
9051 		 159,		/* Minimum in-band energy threshold */
9052 		 21,		/* 21/32 in-band to broad-band ratio */
9053 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9054 	},
9055 	{			/* f350_440[] */
9056 		30634,		/* A1 = 1.869751 */
9057 		 -31533,	/* A2 = -0.962341 */
9058 		 -680,		/* B2 = -0.020782 */
9059 		 0,		/* B1 = 0 */
9060 		 680,		/* B0 = 0.020782 */
9061 		 30571,		/* A1 = 1.865906 */
9062 		 -32277,	/* A2 = -0.985016 */
9063 		 12894,		/* B2 = 0.393524 */
9064 		 -11945,	/* B1 = -0.729065 */
9065 		 12894,		/* B0 = 0.393524 */
9066 		 31367,		/* A1 = 1.91449 */
9067 		 -32379,	/* A2 = -0.988129 */
9068 		 23820,		/* B2 = 0.726929 */
9069 		 -23104,	/* B1 = -1.410217 */
9070 		 23820,		/* B0 = 0.726929 */
9071 		 7,		/* Internal filter scaling */
9072 		 159,		/* Minimum in-band energy threshold */
9073 		 21,		/* 21/32 in-band to broad-band ratio */
9074 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9075 	},
9076 	{			/* f350_450[] */
9077 		30552,		/* A1 = 1.864807 */
9078 		 -31434,	/* A2 = -0.95929 */
9079 		 -690,		/* B2 = -0.021066 */
9080 		 0,		/* B1 = 0 */
9081 		 690,		/* B0 = 0.021066 */
9082 		 30472,		/* A1 = 1.859924 */
9083 		 -32248,	/* A2 = -0.984161 */
9084 		 13385,		/* B2 = 0.408478 */
9085 		 -12357,	/* B1 = -0.754242 */
9086 		 13385,		/* B0 = 0.408478 */
9087 		 31358,		/* A1 = 1.914001 */
9088 		 -32366,	/* A2 = -0.987732 */
9089 		 26488,		/* B2 = 0.80835 */
9090 		 -25692,	/* B1 = -1.568176 */
9091 		 26490,		/* B0 = 0.808411 */
9092 		 7,		/* Internal filter scaling */
9093 		 159,		/* Minimum in-band energy threshold */
9094 		 21,		/* 21/32 in-band to broad-band ratio */
9095 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9096 	},
9097 	{			/* f360 */
9098 		31397,		/* A1 = -1.916321 */
9099 		 -32623,	/* A2 = 0.995605 */
9100 		 -117,		/* B2 = -0.003598 */
9101 		 0,		/* B1 = 0.000000 */
9102 		 117,		/* B0 = 0.003598 */
9103 		 31403,		/* A1 = -1.916687 */
9104 		 -32700,	/* A2 = 0.997925 */
9105 		 3388,		/* B2 = 0.103401 */
9106 		 -3240,		/* B1 = -0.197784 */
9107 		 3388,		/* B0 = 0.103401 */
9108 		 31463,		/* A1 = -1.920410 */
9109 		 -32702,	/* A2 = 0.997986 */
9110 		 13346,		/* B2 = 0.407288 */
9111 		 -12863,	/* B1 = -0.785126 */
9112 		 13346,		/* B0 = 0.407288 */
9113 		 5,		/* Internal filter scaling */
9114 		 159,		/* Minimum in-band energy threshold */
9115 		 21,		/* 21/32 in-band to broad-band ratio */
9116 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9117 	},
9118 	{			/* f380_420[] */
9119 		30831,		/* A1 = 1.881775 */
9120 		 -32064,	/* A2 = -0.978546 */
9121 		 -367,		/* B2 = -0.01122 */
9122 		 0,		/* B1 = 0 */
9123 		 367,		/* B0 = 0.01122 */
9124 		 30813,		/* A1 = 1.880737 */
9125 		 -32456,	/* A2 = -0.990509 */
9126 		 11068,		/* B2 = 0.337769 */
9127 		 -10338,	/* B1 = -0.631042 */
9128 		 11068,		/* B0 = 0.337769 */
9129 		 31214,		/* A1 = 1.905212 */
9130 		 -32491,	/* A2 = -0.991577 */
9131 		 16374,		/* B2 = 0.499695 */
9132 		 -15781,	/* B1 = -0.963196 */
9133 		 16374,		/* B0 = 0.499695 */
9134 		 7,		/* Internal filter scaling */
9135 		 159,		/* Minimum in-band energy threshold */
9136 		 21,		/* 21/32 in-band to broad-band ratio */
9137 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9138 	},
9139 	{			/* f392 */
9140 		31152,		/* A1 = -1.901428 */
9141 		 -32613,	/* A2 = 0.995300 */
9142 		 -314,		/* B2 = -0.009605 */
9143 		 0,		/* B1 = 0.000000 */
9144 		 314,		/* B0 = 0.009605 */
9145 		 31156,		/* A1 = -1.901672 */
9146 		 -32694,	/* A2 = 0.997742 */
9147 		 28847,		/* B2 = 0.880371 */
9148 		 -2734,		/* B1 = -0.166901 */
9149 		 28847,		/* B0 = 0.880371 */
9150 		 31225,		/* A1 = -1.905823 */
9151 		 -32696,	/* A2 = 0.997803 */
9152 		 462,		/* B2 = 0.014108 */
9153 		 -442,		/* B1 = -0.027019 */
9154 		 462,		/* B0 = 0.014108 */
9155 		 5,		/* Internal filter scaling */
9156 		 159,		/* Minimum in-band energy threshold */
9157 		 21,		/* 21/32 in-band to broad-band ratio */
9158 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9159 	},
9160 	{			/* f400_425[] */
9161 		30836,		/* A1 = 1.882141 */
9162 		 -32296,	/* A2 = -0.985596 */
9163 		 -324,		/* B2 = -0.009903 */
9164 		 0,		/* B1 = 0 */
9165 		 324,		/* B0 = 0.009903 */
9166 		 30825,		/* A1 = 1.881409 */
9167 		 -32570,	/* A2 = -0.993958 */
9168 		 16847,		/* B2 = 0.51416 */
9169 		 -15792,	/* B1 = -0.963898 */
9170 		 16847,		/* B0 = 0.51416 */
9171 		 31106,		/* A1 = 1.89856 */
9172 		 -32584,	/* A2 = -0.994415 */
9173 		 9579,		/* B2 = 0.292328 */
9174 		 -9164,		/* B1 = -0.559357 */
9175 		 9579,		/* B0 = 0.292328 */
9176 		 7,		/* Internal filter scaling */
9177 		 159,		/* Minimum in-band energy threshold */
9178 		 21,		/* 21/32 in-band to broad-band ratio */
9179 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9180 	},
9181 	{			/* f400_440[] */
9182 		30702,		/* A1 = 1.873962 */
9183 		 -32134,	/* A2 = -0.980682 */
9184 		 -517,		/* B2 = -0.015793 */
9185 		 0,		/* B1 = 0 */
9186 		 517,		/* B0 = 0.015793 */
9187 		 30676,		/* A1 = 1.872375 */
9188 		 -32520,	/* A2 = -0.992462 */
9189 		 8144,		/* B2 = 0.24855 */
9190 		 -7596,		/* B1 = -0.463684 */
9191 		 8144,		/* B0 = 0.24855 */
9192 		 31084,		/* A1 = 1.897217 */
9193 		 -32547,	/* A2 = -0.993256 */
9194 		 22713,		/* B2 = 0.693176 */
9195 		 -21734,	/* B1 = -1.326599 */
9196 		 22713,		/* B0 = 0.693176 */
9197 		 7,		/* Internal filter scaling */
9198 		 159,		/* Minimum in-band energy threshold */
9199 		 21,		/* 21/32 in-band to broad-band ratio */
9200 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9201 	},
9202 	{			/* f400_450[] */
9203 		30613,		/* A1 = 1.86853 */
9204 		 -32031,	/* A2 = -0.977509 */
9205 		 -618,		/* B2 = -0.018866 */
9206 		 0,		/* B1 = 0 */
9207 		 618,		/* B0 = 0.018866 */
9208 		 30577,		/* A1 = 1.866272 */
9209 		 -32491,	/* A2 = -0.991577 */
9210 		 9612,		/* B2 = 0.293335 */
9211 		 -8935,		/* B1 = -0.54541 */
9212 		 9612,		/* B0 = 0.293335 */
9213 		 31071,		/* A1 = 1.896484 */
9214 		 -32524,	/* A2 = -0.992584 */
9215 		 21596,		/* B2 = 0.659058 */
9216 		 -20667,	/* B1 = -1.261414 */
9217 		 21596,		/* B0 = 0.659058 */
9218 		 7,		/* Internal filter scaling */
9219 		 159,		/* Minimum in-band energy threshold */
9220 		 21,		/* 21/32 in-band to broad-band ratio */
9221 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9222 	},
9223 	{			/* f420 */
9224 		30914,		/* A1 = -1.886841 */
9225 		 -32584,	/* A2 = 0.994385 */
9226 		 -426,		/* B2 = -0.013020 */
9227 		 0,		/* B1 = 0.000000 */
9228 		 426,		/* B0 = 0.013020 */
9229 		 30914,		/* A1 = -1.886841 */
9230 		 -32679,	/* A2 = 0.997314 */
9231 		 17520,		/* B2 = 0.534668 */
9232 		 -16471,	/* B1 = -1.005310 */
9233 		 17520,		/* B0 = 0.534668 */
9234 		 31004,		/* A1 = -1.892334 */
9235 		 -32683,	/* A2 = 0.997406 */
9236 		 819,		/* B2 = 0.025023 */
9237 		 -780,		/* B1 = -0.047619 */
9238 		 819,		/* B0 = 0.025023 */
9239 		 5,		/* Internal filter scaling */
9240 		 159,		/* Minimum in-band energy threshold */
9241 		 21,		/* 21/32 in-band to broad-band ratio */
9242 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9243 	},
9244 #if 0
9245 	{			/* f425 */
9246 		30881,		/* A1 = -1.884827 */
9247 		 -32603,	/* A2 = 0.994965 */
9248 		 -496,		/* B2 = -0.015144 */
9249 		 0,		/* B1 = 0.000000 */
9250 		 496,		/* B0 = 0.015144 */
9251 		 30880,		/* A1 = -1.884766 */
9252 		 -32692,	/* A2 = 0.997711 */
9253 		 24767,		/* B2 = 0.755859 */
9254 		 -23290,	/* B1 = -1.421509 */
9255 		 24767,		/* B0 = 0.755859 */
9256 		 30967,		/* A1 = -1.890076 */
9257 		 -32694,	/* A2 = 0.997772 */
9258 		 728,		/* B2 = 0.022232 */
9259 		 -691,		/* B1 = -0.042194 */
9260 		 728,		/* B0 = 0.022232 */
9261 		 5,		/* Internal filter scaling */
9262 		 159,		/* Minimum in-band energy threshold */
9263 		 21,		/* 21/32 in-band to broad-band ratio */
9264 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9265 	},
9266 #else
9267 	{
9268 		30850,
9269 		-32534,
9270 		-504,
9271 		0,
9272 		504,
9273 		30831,
9274 		-32669,
9275 		24303,
9276 		-22080,
9277 		24303,
9278 		30994,
9279 		-32673,
9280 		1905,
9281 		-1811,
9282 		1905,
9283 		5,
9284 		129,
9285 		17,
9286 		0xff5
9287 	},
9288 #endif
9289 	{			/* f425_450[] */
9290 		30646,		/* A1 = 1.870544 */
9291 		 -32327,	/* A2 = -0.986572 */
9292 		 -287,		/* B2 = -0.008769 */
9293 		 0,		/* B1 = 0 */
9294 		 287,		/* B0 = 0.008769 */
9295 		 30627,		/* A1 = 1.869324 */
9296 		 -32607,	/* A2 = -0.995087 */
9297 		 13269,		/* B2 = 0.404968 */
9298 		 -12376,	/* B1 = -0.755432 */
9299 		 13269,		/* B0 = 0.404968 */
9300 		 30924,		/* A1 = 1.887512 */
9301 		 -32619,	/* A2 = -0.995453 */
9302 		 19950,		/* B2 = 0.608826 */
9303 		 -18940,	/* B1 = -1.156006 */
9304 		 19950,		/* B0 = 0.608826 */
9305 		 7,		/* Internal filter scaling */
9306 		 159,		/* Minimum in-band energy threshold */
9307 		 21,		/* 21/32 in-band to broad-band ratio */
9308 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9309 	},
9310 	{			/* f425_475[] */
9311 		30396,		/* A1 = 1.855225 */
9312 		 -32014,	/* A2 = -0.97699 */
9313 		 -395,		/* B2 = -0.012055 */
9314 		 0,		/* B1 = 0 */
9315 		 395,		/* B0 = 0.012055 */
9316 		 30343,		/* A1 = 1.85199 */
9317 		 -32482,	/* A2 = -0.991302 */
9318 		 17823,		/* B2 = 0.543945 */
9319 		 -16431,	/* B1 = -1.002869 */
9320 		 17823,		/* B0 = 0.543945 */
9321 		 30872,		/* A1 = 1.884338 */
9322 		 -32516,	/* A2 = -0.99231 */
9323 		 18124,		/* B2 = 0.553101 */
9324 		 -17246,	/* B1 = -1.052673 */
9325 		 18124,		/* B0 = 0.553101 */
9326 		 7,		/* Internal filter scaling */
9327 		 159,		/* Minimum in-band energy threshold */
9328 		 21,		/* 21/32 in-band to broad-band ratio */
9329 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9330 	},
9331 	{			/* f435 */
9332 		30796,		/* A1 = -1.879639 */
9333 		 -32603,	/* A2 = 0.994965 */
9334 		 -254,		/* B2 = -0.007762 */
9335 		 0,		/* B1 = 0.000000 */
9336 		 254,		/* B0 = 0.007762 */
9337 		 30793,		/* A1 = -1.879456 */
9338 		 -32692,	/* A2 = 0.997711 */
9339 		 18934,		/* B2 = 0.577820 */
9340 		 -17751,	/* B1 = -1.083496 */
9341 		 18934,		/* B0 = 0.577820 */
9342 		 30882,		/* A1 = -1.884888 */
9343 		 -32694,	/* A2 = 0.997772 */
9344 		 1858,		/* B2 = 0.056713 */
9345 		 -1758,		/* B1 = -0.107357 */
9346 		 1858,		/* B0 = 0.056713 */
9347 		 5,		/* Internal filter scaling */
9348 		 159,		/* Minimum in-band energy threshold */
9349 		 21,		/* 21/32 in-band to broad-band ratio */
9350 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9351 	},
9352 	{			/* f440_450[] */
9353 		30641,		/* A1 = 1.870239 */
9354 		 -32458,	/* A2 = -0.99057 */
9355 		 -155,		/* B2 = -0.004735 */
9356 		 0,		/* B1 = 0 */
9357 		 155,		/* B0 = 0.004735 */
9358 		 30631,		/* A1 = 1.869568 */
9359 		 -32630,	/* A2 = -0.995789 */
9360 		 11453,		/* B2 = 0.349548 */
9361 		 -10666,	/* B1 = -0.651001 */
9362 		 11453,		/* B0 = 0.349548 */
9363 		 30810,		/* A1 = 1.880554 */
9364 		 -32634,	/* A2 = -0.995941 */
9365 		 12237,		/* B2 = 0.373474 */
9366 		 -11588,	/* B1 = -0.707336 */
9367 		 12237,		/* B0 = 0.373474 */
9368 		 7,		/* Internal filter scaling */
9369 		 159,		/* Minimum in-band energy threshold */
9370 		 21,		/* 21/32 in-band to broad-band ratio */
9371 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9372 	},
9373 	{			/* f440_480[] */
9374 		30367,		/* A1 = 1.853455 */
9375 		 -32147,	/* A2 = -0.981079 */
9376 		 -495,		/* B2 = -0.015113 */
9377 		 0,		/* B1 = 0 */
9378 		 495,		/* B0 = 0.015113 */
9379 		 30322,		/* A1 = 1.850769 */
9380 		 -32543,	/* A2 = -0.993134 */
9381 		 10031,		/* B2 = 0.306152 */
9382 		 -9252,		/* B1 = -0.564728 */
9383 		 10031,		/* B0 = 0.306152 */
9384 		 30770,		/* A1 = 1.878052 */
9385 		 -32563,	/* A2 = -0.993774 */
9386 		 22674,		/* B2 = 0.691956 */
9387 		 -21465,	/* B1 = -1.31012 */
9388 		 22674,		/* B0 = 0.691956 */
9389 		 7,		/* Internal filter scaling */
9390 		 159,		/* Minimum in-band energy threshold */
9391 		 21,		/* 21/32 in-band to broad-band ratio */
9392 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9393 	},
9394 	{			/* f445 */
9395 		30709,		/* A1 = -1.874329 */
9396 		 -32603,	/* A2 = 0.994965 */
9397 		 -83,		/* B2 = -0.002545 */
9398 		 0,		/* B1 = 0.000000 */
9399 		 83,		/* B0 = 0.002545 */
9400 		 30704,		/* A1 = -1.874084 */
9401 		 -32692,	/* A2 = 0.997711 */
9402 		 10641,		/* B2 = 0.324738 */
9403 		 -9947,		/* B1 = -0.607147 */
9404 		 10641,		/* B0 = 0.324738 */
9405 		 30796,		/* A1 = -1.879639 */
9406 		 -32694,	/* A2 = 0.997772 */
9407 		 10079,		/* B2 = 0.307587 */
9408 		 9513,		/* B1 = 0.580688 */
9409 		 10079,		/* B0 = 0.307587 */
9410 		 5,		/* Internal filter scaling */
9411 		 159,		/* Minimum in-band energy threshold */
9412 		 21,		/* 21/32 in-band to broad-band ratio */
9413 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9414 	},
9415 	{			/* f450 */
9416 		30664,		/* A1 = -1.871643 */
9417 		 -32603,	/* A2 = 0.994965 */
9418 		 -164,		/* B2 = -0.005029 */
9419 		 0,		/* B1 = 0.000000 */
9420 		 164,		/* B0 = 0.005029 */
9421 		 30661,		/* A1 = -1.871399 */
9422 		 -32692,	/* A2 = 0.997711 */
9423 		 15294,		/* B2 = 0.466736 */
9424 		 -14275,	/* B1 = -0.871307 */
9425 		 15294,		/* B0 = 0.466736 */
9426 		 30751,		/* A1 = -1.876953 */
9427 		 -32694,	/* A2 = 0.997772 */
9428 		 3548,		/* B2 = 0.108284 */
9429 		 -3344,		/* B1 = -0.204155 */
9430 		 3548,		/* B0 = 0.108284 */
9431 		 5,		/* Internal filter scaling */
9432 		 159,		/* Minimum in-band energy threshold */
9433 		 21,		/* 21/32 in-band to broad-band ratio */
9434 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9435 	},
9436 	{			/* f452 */
9437 		30653,		/* A1 = -1.870911 */
9438 		 -32615,	/* A2 = 0.995361 */
9439 		 -209,		/* B2 = -0.006382 */
9440 		 0,		/* B1 = 0.000000 */
9441 		 209,		/* B0 = 0.006382 */
9442 		 30647,		/* A1 = -1.870605 */
9443 		 -32702,	/* A2 = 0.997986 */
9444 		 18971,		/* B2 = 0.578979 */
9445 		 -17716,	/* B1 = -1.081299 */
9446 		 18971,		/* B0 = 0.578979 */
9447 		 30738,		/* A1 = -1.876099 */
9448 		 -32702,	/* A2 = 0.998016 */
9449 		 2967,		/* B2 = 0.090561 */
9450 		 -2793,		/* B1 = -0.170502 */
9451 		 2967,		/* B0 = 0.090561 */
9452 		 5,		/* Internal filter scaling */
9453 		 159,		/* Minimum in-band energy threshold */
9454 		 21,		/* 21/32 in-band to broad-band ratio */
9455 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9456 	},
9457 	{			/* f475 */
9458 		30437,		/* A1 = -1.857727 */
9459 		 -32603,	/* A2 = 0.994965 */
9460 		 -264,		/* B2 = -0.008062 */
9461 		 0,		/* B1 = 0.000000 */
9462 		 264,		/* B0 = 0.008062 */
9463 		 30430,		/* A1 = -1.857300 */
9464 		 -32692,	/* A2 = 0.997711 */
9465 		 21681,		/* B2 = 0.661682 */
9466 		 -20082,	/* B1 = -1.225708 */
9467 		 21681,		/* B0 = 0.661682 */
9468 		 30526,		/* A1 = -1.863220 */
9469 		 -32694,	/* A2 = 0.997742 */
9470 		 1559,		/* B2 = 0.047600 */
9471 		 -1459,		/* B1 = -0.089096 */
9472 		 1559,		/* B0 = 0.047600 */
9473 		 5,		/* Internal filter scaling */
9474 		 159,		/* Minimum in-band energy threshold */
9475 		 21,		/* 21/32 in-band to broad-band ratio */
9476 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9477 	},
9478 	{			/* f480_620[] */
9479 		28975,		/* A1 = 1.768494 */
9480 		 -30955,	/* A2 = -0.944672 */
9481 		 -1026,		/* B2 = -0.03133 */
9482 		 0,		/* B1 = 0 */
9483 		 1026,		/* B0 = 0.03133 */
9484 		 28613,		/* A1 = 1.746399 */
9485 		 -32089,	/* A2 = -0.979309 */
9486 		 14214,		/* B2 = 0.433807 */
9487 		 -12202,	/* B1 = -0.744812 */
9488 		 14214,		/* B0 = 0.433807 */
9489 		 30243,		/* A1 = 1.845947 */
9490 		 -32238,	/* A2 = -0.983856 */
9491 		 24825,		/* B2 = 0.757629 */
9492 		 -23402,	/* B1 = -1.428345 */
9493 		 24825,		/* B0 = 0.757629 */
9494 		 7,		/* Internal filter scaling */
9495 		 159,		/* Minimum in-band energy threshold */
9496 		 21,		/* 21/32 in-band to broad-band ratio */
9497 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9498 	},
9499 	{			/* f494 */
9500 		30257,		/* A1 = -1.846741 */
9501 		 -32605,	/* A2 = 0.995056 */
9502 		 -249,		/* B2 = -0.007625 */
9503 		 0,		/* B1 = 0.000000 */
9504 		 249,		/* B0 = 0.007625 */
9505 		 30247,		/* A1 = -1.846191 */
9506 		 -32694,	/* A2 = 0.997772 */
9507 		 18088,		/* B2 = 0.552002 */
9508 		 -16652,	/* B1 = -1.016418 */
9509 		 18088,		/* B0 = 0.552002 */
9510 		 30348,		/* A1 = -1.852295 */
9511 		 -32696,	/* A2 = 0.997803 */
9512 		 2099,		/* B2 = 0.064064 */
9513 		 -1953,		/* B1 = -0.119202 */
9514 		 2099,		/* B0 = 0.064064 */
9515 		 5,		/* Internal filter scaling */
9516 		 159,		/* Minimum in-band energy threshold */
9517 		 21,		/* 21/32 in-band to broad-band ratio */
9518 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9519 	},
9520 	{			/* f500 */
9521 		30202,		/* A1 = -1.843431 */
9522 		 -32624,	/* A2 = 0.995622 */
9523 		 -413,		/* B2 = -0.012622 */
9524 		 0,		/* B1 = 0.000000 */
9525 		 413,		/* B0 = 0.012622 */
9526 		 30191,		/* A1 = -1.842721 */
9527 		 -32714,	/* A2 = 0.998364 */
9528 		 25954,		/* B2 = 0.792057 */
9529 		 -23890,	/* B1 = -1.458131 */
9530 		 25954,		/* B0 = 0.792057 */
9531 		 30296,		/* A1 = -1.849172 */
9532 		 -32715,	/* A2 = 0.998397 */
9533 		 2007,		/* B2 = 0.061264 */
9534 		 -1860,		/* B1 = -0.113568 */
9535 		 2007,		/* B0 = 0.061264 */
9536 		 5,		/* Internal filter scaling */
9537 		 159,		/* Minimum in-band energy threshold */
9538 		 21,		/* 21/32 in-band to broad-band ratio */
9539 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9540 	},
9541 	{			/* f520 */
9542 		30001,		/* A1 = -1.831116 */
9543 		 -32613,	/* A2 = 0.995270 */
9544 		 -155,		/* B2 = -0.004750 */
9545 		 0,		/* B1 = 0.000000 */
9546 		 155,		/* B0 = 0.004750 */
9547 		 29985,		/* A1 = -1.830200 */
9548 		 -32710,	/* A2 = 0.998260 */
9549 		 6584,		/* B2 = 0.200928 */
9550 		 -6018,		/* B1 = -0.367355 */
9551 		 6584,		/* B0 = 0.200928 */
9552 		 30105,		/* A1 = -1.837524 */
9553 		 -32712,	/* A2 = 0.998291 */
9554 		 23812,		/* B2 = 0.726685 */
9555 		 -21936,	/* B1 = -1.338928 */
9556 		 23812,		/* B0 = 0.726685 */
9557 		 5,		/* Internal filter scaling */
9558 		 159,		/* Minimum in-band energy threshold */
9559 		 21,		/* 21/32 in-band to broad-band ratio */
9560 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9561 	},
9562 	{			/* f523 */
9563 		29964,		/* A1 = -1.828918 */
9564 		 -32601,	/* A2 = 0.994904 */
9565 		 -101,		/* B2 = -0.003110 */
9566 		 0,		/* B1 = 0.000000 */
9567 		 101,		/* B0 = 0.003110 */
9568 		 29949,		/* A1 = -1.827942 */
9569 		 -32700,	/* A2 = 0.997925 */
9570 		 11041,		/* B2 = 0.336975 */
9571 		 -10075,	/* B1 = -0.614960 */
9572 		 11041,		/* B0 = 0.336975 */
9573 		 30070,		/* A1 = -1.835388 */
9574 		 -32702,	/* A2 = 0.997986 */
9575 		 16762,		/* B2 = 0.511536 */
9576 		 -15437,	/* B1 = -0.942230 */
9577 		 16762,		/* B0 = 0.511536 */
9578 		 5,		/* Internal filter scaling */
9579 		 159,		/* Minimum in-band energy threshold */
9580 		 21,		/* 21/32 in-band to broad-band ratio */
9581 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9582 	},
9583 	{			/* f525 */
9584 		29936,		/* A1 = -1.827209 */
9585 		 -32584,	/* A2 = 0.994415 */
9586 		 -91,		/* B2 = -0.002806 */
9587 		 0,		/* B1 = 0.000000 */
9588 		 91,		/* B0 = 0.002806 */
9589 		 29921,		/* A1 = -1.826233 */
9590 		 -32688,	/* A2 = 0.997559 */
9591 		 11449,		/* B2 = 0.349396 */
9592 		 -10426,	/* B1 = -0.636383 */
9593 		 11449,		/* B0 = 0.349396 */
9594 		 30045,		/* A1 = -1.833862 */
9595 		 -32688,	/* A2 = 0.997589 */
9596 		 13055,		/* B2 = 0.398407 */
9597 		 -12028,	/* B1 = -0.734161 */
9598 		 13055,		/* B0 = 0.398407 */
9599 		 5,		/* Internal filter scaling */
9600 		 159,		/* Minimum in-band energy threshold */
9601 		 21,		/* 21/32 in-band to broad-band ratio */
9602 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9603 	},
9604 	{			/* f540_660[] */
9605 		28499,		/* A1 = 1.739441 */
9606 		 -31129,	/* A2 = -0.949982 */
9607 		 -849,		/* B2 = -0.025922 */
9608 		 0,		/* B1 = 0 */
9609 		 849,		/* B0 = 0.025922 */
9610 		 28128,		/* A1 = 1.716797 */
9611 		 -32130,	/* A2 = -0.98056 */
9612 		 14556,		/* B2 = 0.444214 */
9613 		 -12251,	/* B1 = -0.747772 */
9614 		 14556,		/* B0 = 0.444244 */
9615 		 29667,		/* A1 = 1.81073 */
9616 		 -32244,	/* A2 = -0.984039 */
9617 		 23038,		/* B2 = 0.703064 */
9618 		 -21358,	/* B1 = -1.303589 */
9619 		 23040,		/* B0 = 0.703125 */
9620 		 7,		/* Internal filter scaling */
9621 		 159,		/* Minimum in-band energy threshold */
9622 		 21,		/* 21/32 in-band to broad-band ratio */
9623 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9624 	},
9625 	{			/* f587 */
9626 		29271,		/* A1 = -1.786560 */
9627 		 -32599,	/* A2 = 0.994873 */
9628 		 -490,		/* B2 = -0.014957 */
9629 		 0,		/* B1 = 0.000000 */
9630 		 490,		/* B0 = 0.014957 */
9631 		 29246,		/* A1 = -1.785095 */
9632 		 -32700,	/* A2 = 0.997925 */
9633 		 28961,		/* B2 = 0.883850 */
9634 		 -25796,	/* B1 = -1.574463 */
9635 		 28961,		/* B0 = 0.883850 */
9636 		 29383,		/* A1 = -1.793396 */
9637 		 -32700,	/* A2 = 0.997955 */
9638 		 1299,		/* B2 = 0.039650 */
9639 		 -1169,		/* B1 = -0.071396 */
9640 		 1299,		/* B0 = 0.039650 */
9641 		 5,		/* Internal filter scaling */
9642 		 159,		/* Minimum in-band energy threshold */
9643 		 21,		/* 21/32 in-band to broad-band ratio */
9644 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9645 	},
9646 	{			/* f590 */
9647 		29230,		/* A1 = -1.784058 */
9648 		 -32584,	/* A2 = 0.994415 */
9649 		 -418,		/* B2 = -0.012757 */
9650 		 0,		/* B1 = 0.000000 */
9651 		 418,		/* B0 = 0.012757 */
9652 		 29206,		/* A1 = -1.782593 */
9653 		 -32688,	/* A2 = 0.997559 */
9654 		 36556,		/* B2 = 1.115601 */
9655 		 -32478,	/* B1 = -1.982300 */
9656 		 36556,		/* B0 = 1.115601 */
9657 		 29345,		/* A1 = -1.791077 */
9658 		 -32688,	/* A2 = 0.997589 */
9659 		 897,		/* B2 = 0.027397 */
9660 		 -808,		/* B1 = -0.049334 */
9661 		 897,		/* B0 = 0.027397 */
9662 		 5,		/* Internal filter scaling */
9663 		 159,		/* Minimum in-band energy threshold */
9664 		 21,		/* 21/32 in-band to broad-band ratio */
9665 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9666 	},
9667 	{			/* f600 */
9668 		29116,		/* A1 = -1.777100 */
9669 		 -32603,	/* A2 = 0.994965 */
9670 		 -165,		/* B2 = -0.005039 */
9671 		 0,		/* B1 = 0.000000 */
9672 		 165,		/* B0 = 0.005039 */
9673 		 29089,		/* A1 = -1.775452 */
9674 		 -32708,	/* A2 = 0.998199 */
9675 		 6963,		/* B2 = 0.212494 */
9676 		 -6172,		/* B1 = -0.376770 */
9677 		 6963,		/* B0 = 0.212494 */
9678 		 29237,		/* A1 = -1.784485 */
9679 		 -32710,	/* A2 = 0.998230 */
9680 		 24197,		/* B2 = 0.738464 */
9681 		 -21657,	/* B1 = -1.321899 */
9682 		 24197,		/* B0 = 0.738464 */
9683 		 5,		/* Internal filter scaling */
9684 		 159,		/* Minimum in-band energy threshold */
9685 		 21,		/* 21/32 in-band to broad-band ratio */
9686 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9687 	},
9688 	{			/* f660 */
9689 		28376,		/* A1 = -1.731934 */
9690 		 -32567,	/* A2 = 0.993896 */
9691 		 -363,		/* B2 = -0.011102 */
9692 		 0,		/* B1 = 0.000000 */
9693 		 363,		/* B0 = 0.011102 */
9694 		 28337,		/* A1 = -1.729614 */
9695 		 -32683,	/* A2 = 0.997434 */
9696 		 21766,		/* B2 = 0.664246 */
9697 		 -18761,	/* B1 = -1.145081 */
9698 		 21766,		/* B0 = 0.664246 */
9699 		 28513,		/* A1 = -1.740356 */
9700 		 -32686,	/* A2 = 0.997498 */
9701 		 2509,		/* B2 = 0.076584 */
9702 		 -2196,		/* B1 = -0.134041 */
9703 		 2509,		/* B0 = 0.076584 */
9704 		 5,		/* Internal filter scaling */
9705 		 159,		/* Minimum in-band energy threshold */
9706 		 21,		/* 21/32 in-band to broad-band ratio */
9707 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9708 	},
9709 	{			/* f700 */
9710 		27844,		/* A1 = -1.699463 */
9711 		 -32563,	/* A2 = 0.993744 */
9712 		 -366,		/* B2 = -0.011187 */
9713 		 0,		/* B1 = 0.000000 */
9714 		 366,		/* B0 = 0.011187 */
9715 		 27797,		/* A1 = -1.696655 */
9716 		 -32686,	/* A2 = 0.997498 */
9717 		 22748,		/* B2 = 0.694214 */
9718 		 -19235,	/* B1 = -1.174072 */
9719 		 22748,		/* B0 = 0.694214 */
9720 		 27995,		/* A1 = -1.708740 */
9721 		 -32688,	/* A2 = 0.997559 */
9722 		 2964,		/* B2 = 0.090477 */
9723 		 -2546,		/* B1 = -0.155449 */
9724 		 2964,		/* B0 = 0.090477 */
9725 		 5,		/* Internal filter scaling */
9726 		 159,		/* Minimum in-band energy threshold */
9727 		 21,		/* 21/32 in-band to broad-band ratio */
9728 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9729 	},
9730 	{			/* f740 */
9731 		27297,		/* A1 = -1.666077 */
9732 		 -32551,	/* A2 = 0.993408 */
9733 		 -345,		/* B2 = -0.010540 */
9734 		 0,		/* B1 = 0.000000 */
9735 		 345,		/* B0 = 0.010540 */
9736 		 27240,		/* A1 = -1.662598 */
9737 		 -32683,	/* A2 = 0.997406 */
9738 		 22560,		/* B2 = 0.688477 */
9739 		 -18688,	/* B1 = -1.140625 */
9740 		 22560,		/* B0 = 0.688477 */
9741 		 27461,		/* A1 = -1.676147 */
9742 		 -32684,	/* A2 = 0.997467 */
9743 		 3541,		/* B2 = 0.108086 */
9744 		 -2985,		/* B1 = -0.182220 */
9745 		 3541,		/* B0 = 0.108086 */
9746 		 5,		/* Internal filter scaling */
9747 		 159,		/* Minimum in-band energy threshold */
9748 		 21,		/* 21/32 in-band to broad-band ratio */
9749 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9750 	},
9751 	{			/* f750 */
9752 		27155,		/* A1 = -1.657410 */
9753 		 -32551,	/* A2 = 0.993408 */
9754 		 -462,		/* B2 = -0.014117 */
9755 		 0,		/* B1 = 0.000000 */
9756 		 462,		/* B0 = 0.014117 */
9757 		 27097,		/* A1 = -1.653870 */
9758 		 -32683,	/* A2 = 0.997406 */
9759 		 32495,		/* B2 = 0.991699 */
9760 		 -26776,	/* B1 = -1.634338 */
9761 		 32495,		/* B0 = 0.991699 */
9762 		 27321,		/* A1 = -1.667542 */
9763 		 -32684,	/* A2 = 0.997467 */
9764 		 1835,		/* B2 = 0.056007 */
9765 		 -1539,		/* B1 = -0.093948 */
9766 		 1835,		/* B0 = 0.056007 */
9767 		 5,		/* Internal filter scaling */
9768 		 159,		/* Minimum in-band energy threshold */
9769 		 21,		/* 21/32 in-band to broad-band ratio */
9770 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9771 	},
9772 	{			/* f750_1450[] */
9773 		19298,		/* A1 = 1.177917 */
9774 		 -24471,	/* A2 = -0.746796 */
9775 		 -4152,		/* B2 = -0.126709 */
9776 		 0,		/* B1 = 0 */
9777 		 4152,		/* B0 = 0.126709 */
9778 		 12902,		/* A1 = 0.787476 */
9779 		 -29091,	/* A2 = -0.887817 */
9780 		 12491,		/* B2 = 0.38121 */
9781 		 -1794,		/* B1 = -0.109528 */
9782 		 12494,		/* B0 = 0.381317 */
9783 		 26291,		/* A1 = 1.604736 */
9784 		 -30470,	/* A2 = -0.929901 */
9785 		 28859,		/* B2 = 0.880737 */
9786 		 -26084,	/* B1 = -1.592102 */
9787 		 28861,		/* B0 = 0.880798 */
9788 		 7,		/* Internal filter scaling */
9789 		 159,		/* Minimum in-band energy threshold */
9790 		 21,		/* 21/32 in-band to broad-band ratio */
9791 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9792 	},
9793 	{			/* f770 */
9794 		26867,		/* A1 = -1.639832 */
9795 		 -32551,	/* A2 = 0.993408 */
9796 		 -123,		/* B2 = -0.003755 */
9797 		 0,		/* B1 = 0.000000 */
9798 		 123,		/* B0 = 0.003755 */
9799 		 26805,		/* A1 = -1.636108 */
9800 		 -32683,	/* A2 = 0.997406 */
9801 		 17297,		/* B2 = 0.527863 */
9802 		 -14096,	/* B1 = -0.860382 */
9803 		 17297,		/* B0 = 0.527863 */
9804 		 27034,		/* A1 = -1.650085 */
9805 		 -32684,	/* A2 = 0.997467 */
9806 		 12958,		/* B2 = 0.395477 */
9807 		 -10756,	/* B1 = -0.656525 */
9808 		 12958,		/* B0 = 0.395477 */
9809 		 5,		/* Internal filter scaling */
9810 		 159,		/* Minimum in-band energy threshold */
9811 		 21,		/* 21/32 in-band to broad-band ratio */
9812 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9813 	},
9814 	{			/* f800 */
9815 		26413,		/* A1 = -1.612122 */
9816 		 -32547,	/* A2 = 0.993286 */
9817 		 -223,		/* B2 = -0.006825 */
9818 		 0,		/* B1 = 0.000000 */
9819 		 223,		/* B0 = 0.006825 */
9820 		 26342,		/* A1 = -1.607849 */
9821 		 -32686,	/* A2 = 0.997498 */
9822 		 6391,		/* B2 = 0.195053 */
9823 		 -5120,		/* B1 = -0.312531 */
9824 		 6391,		/* B0 = 0.195053 */
9825 		 26593,		/* A1 = -1.623108 */
9826 		 -32688,	/* A2 = 0.997559 */
9827 		 23681,		/* B2 = 0.722717 */
9828 		 -19328,	/* B1 = -1.179688 */
9829 		 23681,		/* B0 = 0.722717 */
9830 		 5,		/* Internal filter scaling */
9831 		 159,		/* Minimum in-band energy threshold */
9832 		 21,		/* 21/32 in-band to broad-band ratio */
9833 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9834 	},
9835 	{			/* f816 */
9836 		26168,		/* A1 = -1.597209 */
9837 		 -32528,	/* A2 = 0.992706 */
9838 		 -235,		/* B2 = -0.007182 */
9839 		 0,		/* B1 = 0.000000 */
9840 		 235,		/* B0 = 0.007182 */
9841 		 26092,		/* A1 = -1.592590 */
9842 		 -32675,	/* A2 = 0.997192 */
9843 		 20823,		/* B2 = 0.635498 */
9844 		 -16510,	/* B1 = -1.007751 */
9845 		 20823,		/* B0 = 0.635498 */
9846 		 26363,		/* A1 = -1.609070 */
9847 		 -32677,	/* A2 = 0.997253 */
9848 		 6739,		/* B2 = 0.205688 */
9849 		 -5459,		/* B1 = -0.333206 */
9850 		 6739,		/* B0 = 0.205688 */
9851 		 5,		/* Internal filter scaling */
9852 		 159,		/* Minimum in-band energy threshold */
9853 		 21,		/* 21/32 in-band to broad-band ratio */
9854 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9855 	},
9856 	{			/* f850 */
9857 		25641,		/* A1 = -1.565063 */
9858 		 -32536,	/* A2 = 0.992950 */
9859 		 -121,		/* B2 = -0.003707 */
9860 		 0,		/* B1 = 0.000000 */
9861 		 121,		/* B0 = 0.003707 */
9862 		 25560,		/* A1 = -1.560059 */
9863 		 -32684,	/* A2 = 0.997437 */
9864 		 18341,		/* B2 = 0.559753 */
9865 		 -14252,	/* B1 = -0.869904 */
9866 		 18341,		/* B0 = 0.559753 */
9867 		 25837,		/* A1 = -1.577026 */
9868 		 -32684,	/* A2 = 0.997467 */
9869 		 16679,		/* B2 = 0.509003 */
9870 		 -13232,	/* B1 = -0.807648 */
9871 		 16679,		/* B0 = 0.509003 */
9872 		 5,		/* Internal filter scaling */
9873 		 159,		/* Minimum in-band energy threshold */
9874 		 21,		/* 21/32 in-band to broad-band ratio */
9875 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9876 	},
9877 	{			/* f857_1645[] */
9878 		16415,		/* A1 = 1.001953 */
9879 		 -23669,	/* A2 = -0.722321 */
9880 		 -4549,		/* B2 = -0.138847 */
9881 		 0,		/* B1 = 0 */
9882 		 4549,		/* B0 = 0.138847 */
9883 		 8456,		/* A1 = 0.516174 */
9884 		 -28996,	/* A2 = -0.884918 */
9885 		 13753,		/* B2 = 0.419724 */
9886 		 -12,		/* B1 = -0.000763 */
9887 		 13757,		/* B0 = 0.419846 */
9888 		 24632,		/* A1 = 1.503418 */
9889 		 -30271,	/* A2 = -0.923828 */
9890 		 29070,		/* B2 = 0.887146 */
9891 		 -25265,	/* B1 = -1.542114 */
9892 		 29073,		/* B0 = 0.887268 */
9893 		 7,		/* Internal filter scaling */
9894 		 159,		/* Minimum in-band energy threshold */
9895 		 21,		/* 21/32 in-band to broad-band ratio */
9896 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9897 	},
9898 	{			/* f900 */
9899 		24806,		/* A1 = -1.514099 */
9900 		 -32501,	/* A2 = 0.991852 */
9901 		 -326,		/* B2 = -0.009969 */
9902 		 0,		/* B1 = 0.000000 */
9903 		 326,		/* B0 = 0.009969 */
9904 		 24709,		/* A1 = -1.508118 */
9905 		 -32659,	/* A2 = 0.996674 */
9906 		 20277,		/* B2 = 0.618835 */
9907 		 -15182,	/* B1 = -0.926636 */
9908 		 20277,		/* B0 = 0.618835 */
9909 		 25022,		/* A1 = -1.527222 */
9910 		 -32661,	/* A2 = 0.996735 */
9911 		 4320,		/* B2 = 0.131836 */
9912 		 -3331,		/* B1 = -0.203339 */
9913 		 4320,		/* B0 = 0.131836 */
9914 		 5,		/* Internal filter scaling */
9915 		 159,		/* Minimum in-band energy threshold */
9916 		 21,		/* 21/32 in-band to broad-band ratio */
9917 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9918 	},
9919 	{			/* f900_1300[] */
9920 		19776,		/* A1 = 1.207092 */
9921 		 -27437,	/* A2 = -0.837341 */
9922 		 -2666,		/* B2 = -0.081371 */
9923 		 0,		/* B1 = 0 */
9924 		 2666,		/* B0 = 0.081371 */
9925 		 16302,		/* A1 = 0.995026 */
9926 		 -30354,	/* A2 = -0.926361 */
9927 		 10389,		/* B2 = 0.317062 */
9928 		 -3327,		/* B1 = -0.203064 */
9929 		 10389,		/* B0 = 0.317062 */
9930 		 24299,		/* A1 = 1.483154 */
9931 		 -30930,	/* A2 = -0.943909 */
9932 		 25016,		/* B2 = 0.763428 */
9933 		 -21171,	/* B1 = -1.292236 */
9934 		 25016,		/* B0 = 0.763428 */
9935 		 7,		/* Internal filter scaling */
9936 		 159,		/* Minimum in-band energy threshold */
9937 		 21,		/* 21/32 in-band to broad-band ratio */
9938 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9939 	},
9940 	{			/* f935_1215[] */
9941 		20554,		/* A1 = 1.254517 */
9942 		 -28764,	/* A2 = -0.877838 */
9943 		 -2048,		/* B2 = -0.062515 */
9944 		 0,		/* B1 = 0 */
9945 		 2048,		/* B0 = 0.062515 */
9946 		 18209,		/* A1 = 1.11145 */
9947 		 -30951,	/* A2 = -0.94458 */
9948 		 9390,		/* B2 = 0.286575 */
9949 		 -3955,		/* B1 = -0.241455 */
9950 		 9390,		/* B0 = 0.286575 */
9951 		 23902,		/* A1 = 1.458923 */
9952 		 -31286,	/* A2 = -0.954803 */
9953 		 23252,		/* B2 = 0.709595 */
9954 		 -19132,	/* B1 = -1.167725 */
9955 		 23252,		/* B0 = 0.709595 */
9956 		 7,		/* Internal filter scaling */
9957 		 159,		/* Minimum in-band energy threshold */
9958 		 21,		/* 21/32 in-band to broad-band ratio */
9959 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9960 	},
9961 	{			/* f941_1477[] */
9962 		17543,		/* A1 = 1.07074 */
9963 		 -26220,	/* A2 = -0.800201 */
9964 		 -3298,		/* B2 = -0.100647 */
9965 		 0,		/* B1 = 0 */
9966 		 3298,		/* B0 = 0.100647 */
9967 		 12423,		/* A1 = 0.75827 */
9968 		 -30036,	/* A2 = -0.916626 */
9969 		 12651,		/* B2 = 0.386078 */
9970 		 -2444,		/* B1 = -0.14917 */
9971 		 12653,		/* B0 = 0.386154 */
9972 		 23518,		/* A1 = 1.435425 */
9973 		 -30745,	/* A2 = -0.938293 */
9974 		 27282,		/* B2 = 0.832581 */
9975 		 -22529,	/* B1 = -1.375122 */
9976 		 27286,		/* B0 = 0.832703 */
9977 		 7,		/* Internal filter scaling */
9978 		 159,		/* Minimum in-band energy threshold */
9979 		 21,		/* 21/32 in-band to broad-band ratio */
9980 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9981 	},
9982 	{			/* f942 */
9983 		24104,		/* A1 = -1.471252 */
9984 		 -32507,	/* A2 = 0.992065 */
9985 		 -351,		/* B2 = -0.010722 */
9986 		 0,		/* B1 = 0.000000 */
9987 		 351,		/* B0 = 0.010722 */
9988 		 23996,		/* A1 = -1.464600 */
9989 		 -32671,	/* A2 = 0.997040 */
9990 		 22848,		/* B2 = 0.697266 */
9991 		 -16639,	/* B1 = -1.015564 */
9992 		 22848,		/* B0 = 0.697266 */
9993 		 24332,		/* A1 = -1.485168 */
9994 		 -32673,	/* A2 = 0.997101 */
9995 		 4906,		/* B2 = 0.149727 */
9996 		 -3672,		/* B1 = -0.224174 */
9997 		 4906,		/* B0 = 0.149727 */
9998 		 5,		/* Internal filter scaling */
9999 		 159,		/* Minimum in-band energy threshold */
10000 		 21,		/* 21/32 in-band to broad-band ratio */
10001 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10002 	},
10003 	{			/* f950 */
10004 		23967,		/* A1 = -1.462830 */
10005 		 -32507,	/* A2 = 0.992065 */
10006 		 -518,		/* B2 = -0.015821 */
10007 		 0,		/* B1 = 0.000000 */
10008 		 518,		/* B0 = 0.015821 */
10009 		 23856,		/* A1 = -1.456055 */
10010 		 -32671,	/* A2 = 0.997040 */
10011 		 26287,		/* B2 = 0.802246 */
10012 		 -19031,	/* B1 = -1.161560 */
10013 		 26287,		/* B0 = 0.802246 */
10014 		 24195,		/* A1 = -1.476746 */
10015 		 -32673,	/* A2 = 0.997101 */
10016 		 2890,		/* B2 = 0.088196 */
10017 		 -2151,		/* B1 = -0.131317 */
10018 		 2890,		/* B0 = 0.088196 */
10019 		 5,		/* Internal filter scaling */
10020 		 159,		/* Minimum in-band energy threshold */
10021 		 21,		/* 21/32 in-band to broad-band ratio */
10022 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10023 	},
10024 	{			/* f950_1400[] */
10025 		18294,		/* A1 = 1.116638 */
10026 		 -26962,	/* A2 = -0.822845 */
10027 		 -2914,		/* B2 = -0.088936 */
10028 		 0,		/* B1 = 0 */
10029 		 2914,		/* B0 = 0.088936 */
10030 		 14119,		/* A1 = 0.861786 */
10031 		 -30227,	/* A2 = -0.922455 */
10032 		 11466,		/* B2 = 0.349945 */
10033 		 -2833,		/* B1 = -0.172943 */
10034 		 11466,		/* B0 = 0.349945 */
10035 		 23431,		/* A1 = 1.430115 */
10036 		 -30828,	/* A2 = -0.940796 */
10037 		 25331,		/* B2 = 0.773071 */
10038 		 -20911,	/* B1 = -1.276367 */
10039 		 25331,		/* B0 = 0.773071 */
10040 		 7,		/* Internal filter scaling */
10041 		 159,		/* Minimum in-band energy threshold */
10042 		 21,		/* 21/32 in-band to broad-band ratio */
10043 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10044 	},
10045 	{			/* f975 */
10046 		23521,		/* A1 = -1.435608 */
10047 		 -32489,	/* A2 = 0.991516 */
10048 		 -193,		/* B2 = -0.005915 */
10049 		 0,		/* B1 = 0.000000 */
10050 		 193,		/* B0 = 0.005915 */
10051 		 23404,		/* A1 = -1.428467 */
10052 		 -32655,	/* A2 = 0.996582 */
10053 		 17740,		/* B2 = 0.541412 */
10054 		 -12567,	/* B1 = -0.767029 */
10055 		 17740,		/* B0 = 0.541412 */
10056 		 23753,		/* A1 = -1.449829 */
10057 		 -32657,	/* A2 = 0.996613 */
10058 		 9090,		/* B2 = 0.277405 */
10059 		 -6662,		/* B1 = -0.406647 */
10060 		 9090,		/* B0 = 0.277405 */
10061 		 5,		/* Internal filter scaling */
10062 		 159,		/* Minimum in-band energy threshold */
10063 		 21,		/* 21/32 in-band to broad-band ratio */
10064 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10065 	},
10066 	{			/* f1000 */
10067 		23071,		/* A1 = -1.408203 */
10068 		 -32489,	/* A2 = 0.991516 */
10069 		 -293,		/* B2 = -0.008965 */
10070 		 0,		/* B1 = 0.000000 */
10071 		 293,		/* B0 = 0.008965 */
10072 		 22951,		/* A1 = -1.400818 */
10073 		 -32655,	/* A2 = 0.996582 */
10074 		 5689,		/* B2 = 0.173645 */
10075 		 -3951,		/* B1 = -0.241150 */
10076 		 5689,		/* B0 = 0.173645 */
10077 		 23307,		/* A1 = -1.422607 */
10078 		 -32657,	/* A2 = 0.996613 */
10079 		 18692,		/* B2 = 0.570435 */
10080 		 -13447,	/* B1 = -0.820770 */
10081 		 18692,		/* B0 = 0.570435 */
10082 		 5,		/* Internal filter scaling */
10083 		 159,		/* Minimum in-band energy threshold */
10084 		 21,		/* 21/32 in-band to broad-band ratio */
10085 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10086 	},
10087 	{			/* f1020 */
10088 		22701,		/* A1 = -1.385620 */
10089 		 -32474,	/* A2 = 0.991058 */
10090 		 -292,		/* B2 = -0.008933 */
10091 		 0,		/*163840      , B1 = 10.000000 */
10092 		 292,		/* B0 = 0.008933 */
10093 		 22564,		/* A1 = -1.377258 */
10094 		 -32655,	/* A2 = 0.996552 */
10095 		 20756,		/* B2 = 0.633423 */
10096 		 -14176,	/* B1 = -0.865295 */
10097 		 20756,		/* B0 = 0.633423 */
10098 		 22960,		/* A1 = -1.401428 */
10099 		 -32657,	/* A2 = 0.996613 */
10100 		 6520,		/* B2 = 0.198990 */
10101 		 -4619,		/* B1 = -0.281937 */
10102 		 6520,		/* B0 = 0.198990 */
10103 		 5,		/* Internal filter scaling */
10104 		 159,		/* Minimum in-band energy threshold */
10105 		 21,		/* 21/32 in-band to broad-band ratio */
10106 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10107 	},
10108 	{			/* f1050 */
10109 		22142,		/* A1 = -1.351501 */
10110 		 -32474,	/* A2 = 0.991058 */
10111 		 -147,		/* B2 = -0.004493 */
10112 		 0,		/* B1 = 0.000000 */
10113 		 147,		/* B0 = 0.004493 */
10114 		 22000,		/* A1 = -1.342834 */
10115 		 -32655,	/* A2 = 0.996552 */
10116 		 15379,		/* B2 = 0.469360 */
10117 		 -10237,	/* B1 = -0.624847 */
10118 		 15379,		/* B0 = 0.469360 */
10119 		 22406,		/* A1 = -1.367554 */
10120 		 -32657,	/* A2 = 0.996613 */
10121 		 17491,		/* B2 = 0.533783 */
10122 		 -12096,	/* B1 = -0.738312 */
10123 		 17491,		/* B0 = 0.533783 */
10124 		 5,		/* Internal filter scaling */
10125 		 159,		/* Minimum in-band energy threshold */
10126 		 21,		/* 21/32 in-band to broad-band ratio */
10127 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10128 	},
10129 	{			/* f1100_1750[] */
10130 		12973,		/* A1 = 0.79184 */
10131 		 -24916,	/* A2 = -0.760376 */
10132 		 6655,		/* B2 = 0.203102 */
10133 		 367,		/* B1 = 0.0224 */
10134 		 6657,		/* B0 = 0.203171 */
10135 		 5915,		/* A1 = 0.361053 */
10136 		 -29560,	/* A2 = -0.90213 */
10137 		 -7777,		/* B2 = -0.23735 */
10138 		 0,		/* B1 = 0 */
10139 		 7777,		/* B0 = 0.23735 */
10140 		 20510,		/* A1 = 1.251892 */
10141 		 -30260,	/* A2 = -0.923462 */
10142 		 26662,		/* B2 = 0.81366 */
10143 		 -20573,	/* B1 = -1.255737 */
10144 		 26668,		/* B0 = 0.813843 */
10145 		 7,		/* Internal filter scaling */
10146 		 159,		/* Minimum in-band energy threshold */
10147 		 21,		/* 21/32 in-band to broad-band ratio */
10148 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10149 	},
10150 	{			/* f1140 */
10151 		20392,		/* A1 = -1.244629 */
10152 		 -32460,	/* A2 = 0.990601 */
10153 		 -270,		/* B2 = -0.008240 */
10154 		 0,		/* B1 = 0.000000 */
10155 		 270,		/* B0 = 0.008240 */
10156 		 20218,		/* A1 = -1.234009 */
10157 		 -32655,	/* A2 = 0.996582 */
10158 		 21337,		/* B2 = 0.651154 */
10159 		 -13044,	/* B1 = -0.796143 */
10160 		 21337,		/* B0 = 0.651154 */
10161 		 20684,		/* A1 = -1.262512 */
10162 		 -32657,	/* A2 = 0.996643 */
10163 		 8572,		/* B2 = 0.261612 */
10164 		 -5476,		/* B1 = -0.334244 */
10165 		 8572,		/* B0 = 0.261612 */
10166 		 5,		/* Internal filter scaling */
10167 		 159,		/* Minimum in-band energy threshold */
10168 		 21,		/* 21/32 in-band to broad-band ratio */
10169 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10170 	},
10171 	{			/* f1200 */
10172 		19159,		/* A1 = -1.169373 */
10173 		 -32456,	/* A2 = 0.990509 */
10174 		 -335,		/* B2 = -0.010252 */
10175 		 0,		/* B1 = 0.000000 */
10176 		 335,		/* B0 = 0.010252 */
10177 		 18966,		/* A1 = -1.157593 */
10178 		 -32661,	/* A2 = 0.996735 */
10179 		 6802,		/* B2 = 0.207588 */
10180 		 -3900,		/* B1 = -0.238098 */
10181 		 6802,		/* B0 = 0.207588 */
10182 		 19467,		/* A1 = -1.188232 */
10183 		 -32661,	/* A2 = 0.996765 */
10184 		 25035,		/* B2 = 0.764008 */
10185 		 -15049,	/* B1 = -0.918579 */
10186 		 25035,		/* B0 = 0.764008 */
10187 		 5,		/* Internal filter scaling */
10188 		 159,		/* Minimum in-band energy threshold */
10189 		 21,		/* 21/32 in-band to broad-band ratio */
10190 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10191 	},
10192 	{			/* f1209 */
10193 		18976,		/* A1 = -1.158264 */
10194 		 -32439,	/* A2 = 0.989990 */
10195 		 -183,		/* B2 = -0.005588 */
10196 		 0,		/* B1 = 0.000000 */
10197 		 183,		/* B0 = 0.005588 */
10198 		 18774,		/* A1 = -1.145874 */
10199 		 -32650,	/* A2 = 0.996429 */
10200 		 15468,		/* B2 = 0.472076 */
10201 		 -8768,		/* B1 = -0.535217 */
10202 		 15468,		/* B0 = 0.472076 */
10203 		 19300,		/* A1 = -1.177979 */
10204 		 -32652,	/* A2 = 0.996490 */
10205 		 19840,		/* B2 = 0.605499 */
10206 		 -11842,	/* B1 = -0.722809 */
10207 		 19840,		/* B0 = 0.605499 */
10208 		 5,		/* Internal filter scaling */
10209 		 159,		/* Minimum in-band energy threshold */
10210 		 21,		/* 21/32 in-band to broad-band ratio */
10211 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10212 	},
10213 	{			/* f1330 */
10214 		16357,		/* A1 = -0.998413 */
10215 		 -32368,	/* A2 = 0.987793 */
10216 		 -217,		/* B2 = -0.006652 */
10217 		 0,		/* B1 = 0.000000 */
10218 		 217,		/* B0 = 0.006652 */
10219 		 16107,		/* A1 = -0.983126 */
10220 		 -32601,	/* A2 = 0.994904 */
10221 		 11602,		/* B2 = 0.354065 */
10222 		 -5555,		/* B1 = -0.339111 */
10223 		 11602,		/* B0 = 0.354065 */
10224 		 16722,		/* A1 = -1.020630 */
10225 		 -32603,	/* A2 = 0.994965 */
10226 		 15574,		/* B2 = 0.475311 */
10227 		 -8176,		/* B1 = -0.499069 */
10228 		 15574,		/* B0 = 0.475311 */
10229 		 5,		/* Internal filter scaling */
10230 		 159,		/* Minimum in-band energy threshold */
10231 		 21,		/* 21/32 in-band to broad-band ratio */
10232 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10233 	},
10234 	{			/* f1336 */
10235 		16234,		/* A1 = -0.990875 */
10236 		 32404,		/* A2 = -0.988922 */
10237 		 -193,		/* B2 = -0.005908 */
10238 		 0,		/* B1 = 0.000000 */
10239 		 193,		/* B0 = 0.005908 */
10240 		 15986,		/* A1 = -0.975769 */
10241 		 -32632,	/* A2 = 0.995880 */
10242 		 18051,		/* B2 = 0.550903 */
10243 		 -8658,		/* B1 = -0.528473 */
10244 		 18051,		/* B0 = 0.550903 */
10245 		 16591,		/* A1 = -1.012695 */
10246 		 -32634,	/* A2 = 0.995941 */
10247 		 15736,		/* B2 = 0.480240 */
10248 		 -8125,		/* B1 = -0.495926 */
10249 		 15736,		/* B0 = 0.480240 */
10250 		 5,		/* Internal filter scaling */
10251 		 159,		/* Minimum in-band energy threshold */
10252 		 21,		/* 21/32 in-band to broad-band ratio */
10253 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10254 	},
10255 	{			/* f1366 */
10256 		15564,		/* A1 = -0.949982 */
10257 		 -32404,	/* A2 = 0.988922 */
10258 		 -269,		/* B2 = -0.008216 */
10259 		 0,		/* B1 = 0.000000 */
10260 		 269,		/* B0 = 0.008216 */
10261 		 15310,		/* A1 = -0.934479 */
10262 		 -32632,	/* A2 = 0.995880 */
10263 		 10815,		/* B2 = 0.330063 */
10264 		 -4962,		/* B1 = -0.302887 */
10265 		 10815,		/* B0 = 0.330063 */
10266 		 15924,		/* A1 = -0.971924 */
10267 		 -32634,	/* A2 = 0.995941 */
10268 		 18880,		/* B2 = 0.576172 */
10269 		 -9364,		/* B1 = -0.571594 */
10270 		 18880,		/* B0 = 0.576172 */
10271 		 5,		/* Internal filter scaling */
10272 		 159,		/* Minimum in-band energy threshold */
10273 		 21,		/* 21/32 in-band to broad-band ratio */
10274 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10275 	},
10276 	{			/* f1380 */
10277 		15247,		/* A1 = -0.930603 */
10278 		 -32397,	/* A2 = 0.988708 */
10279 		 -244,		/* B2 = -0.007451 */
10280 		 0,		/* B1 = 0.000000 */
10281 		 244,		/* B0 = 0.007451 */
10282 		 14989,		/* A1 = -0.914886 */
10283 		 -32627,	/* A2 = 0.995697 */
10284 		 18961,		/* B2 = 0.578644 */
10285 		 -8498,		/* B1 = -0.518707 */
10286 		 18961,		/* B0 = 0.578644 */
10287 		 15608,		/* A1 = -0.952667 */
10288 		 -32628,	/* A2 = 0.995758 */
10289 		 11145,		/* B2 = 0.340134 */
10290 		 -5430,		/* B1 = -0.331467 */
10291 		 11145,		/* B0 = 0.340134 */
10292 		 5,		/* Internal filter scaling */
10293 		 159,		/* Minimum in-band energy threshold */
10294 		 21,		/* 21/32 in-band to broad-band ratio */
10295 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10296 	},
10297 	{			/* f1400 */
10298 		14780,		/* A1 = -0.902130 */
10299 		 -32393,	/* A2 = 0.988586 */
10300 		 -396,		/* B2 = -0.012086 */
10301 		 0,		/* B1 = 0.000000 */
10302 		 396,		/* B0 = 0.012086 */
10303 		 14510,		/* A1 = -0.885651 */
10304 		 -32630,	/* A2 = 0.995819 */
10305 		 6326,		/* B2 = 0.193069 */
10306 		 -2747,		/* B1 = -0.167671 */
10307 		 6326,		/* B0 = 0.193069 */
10308 		 15154,		/* A1 = -0.924957 */
10309 		 -32632,	/* A2 = 0.995850 */
10310 		 23235,		/* B2 = 0.709076 */
10311 		 -10983,	/* B1 = -0.670380 */
10312 		 23235,		/* B0 = 0.709076 */
10313 		 5,		/* Internal filter scaling */
10314 		 159,		/* Minimum in-band energy threshold */
10315 		 21,		/* 21/32 in-band to broad-band ratio */
10316 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10317 	},
10318 	{			/* f1477 */
10319 		13005,		/* A1 = -0.793793 */
10320 		 -32368,	/* A2 = 0.987823 */
10321 		 -500,		/* B2 = -0.015265 */
10322 		 0,		/* B1 = 0.000000 */
10323 		 500,		/* B0 = 0.015265 */
10324 		 12708,		/* A1 = -0.775665 */
10325 		 -32615,	/* A2 = 0.995331 */
10326 		 11420,		/* B2 = 0.348526 */
10327 		 -4306,		/* B1 = -0.262833 */
10328 		 11420,		/* B0 = 0.348526 */
10329 		 13397,		/* A1 = -0.817688 */
10330 		 -32615,	/* A2 = 0.995361 */
10331 		 9454,		/* B2 = 0.288528 */
10332 		 -3981,		/* B1 = -0.243027 */
10333 		 9454,		/* B0 = 0.288528 */
10334 		 5,		/* Internal filter scaling */
10335 		 159,		/* Minimum in-band energy threshold */
10336 		 21,		/* 21/32 in-band to broad-band ratio */
10337 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10338 	},
10339 	{			/* f1600 */
10340 		10046,		/* A1 = -0.613190 */
10341 		 -32331,	/* A2 = 0.986694 */
10342 		 -455,		/* B2 = -0.013915 */
10343 		 0,		/* B1 = 0.000000 */
10344 		 455,		/* B0 = 0.013915 */
10345 		 9694,		/* A1 = -0.591705 */
10346 		 -32601,	/* A2 = 0.994934 */
10347 		 6023,		/* B2 = 0.183815 */
10348 		 -1708,		/* B1 = -0.104279 */
10349 		 6023,		/* B0 = 0.183815 */
10350 		 10478,		/* A1 = -0.639587 */
10351 		 -32603,	/* A2 = 0.994965 */
10352 		 22031,		/* B2 = 0.672333 */
10353 		 -7342,		/* B1 = -0.448151 */
10354 		 22031,		/* B0 = 0.672333 */
10355 		 5,		/* Internal filter scaling */
10356 		 159,		/* Minimum in-band energy threshold */
10357 		 21,		/* 21/32 in-band to broad-band ratio */
10358 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10359 	},
10360 	{			/* f1633_1638[] */
10361 		9181,		/* A1 = 0.560394 */
10362 		 -32256,	/* A2 = -0.984375 */
10363 		 -556,		/* B2 = -0.016975 */
10364 		 0,		/* B1 = 0 */
10365 		 556,		/* B0 = 0.016975 */
10366 		 8757,		/* A1 = 0.534515 */
10367 		 -32574,	/* A2 = -0.99408 */
10368 		 8443,		/* B2 = 0.25769 */
10369 		 -2135,		/* B1 = -0.130341 */
10370 		 8443,		/* B0 = 0.25769 */
10371 		 9691,		/* A1 = 0.591522 */
10372 		 -32574,	/* A2 = -0.99411 */
10373 		 15446,		/* B2 = 0.471375 */
10374 		 -4809,		/* B1 = -0.293579 */
10375 		 15446,		/* B0 = 0.471375 */
10376 		 7,		/* Internal filter scaling */
10377 		 159,		/* Minimum in-band energy threshold */
10378 		 21,		/* 21/32 in-band to broad-band ratio */
10379 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10380 	},
10381 	{			/* f1800 */
10382 		5076,		/* A1 = -0.309875 */
10383 		 -32304,	/* A2 = 0.985840 */
10384 		 -508,		/* B2 = -0.015503 */
10385 		 0,		/* B1 = 0.000000 */
10386 		 508,		/* B0 = 0.015503 */
10387 		 4646,		/* A1 = -0.283600 */
10388 		 -32605,	/* A2 = 0.995026 */
10389 		 6742,		/* B2 = 0.205780 */
10390 		 -878,		/* B1 = -0.053635 */
10391 		 6742,		/* B0 = 0.205780 */
10392 		 5552,		/* A1 = -0.338928 */
10393 		 -32605,	/* A2 = 0.995056 */
10394 		 23667,		/* B2 = 0.722260 */
10395 		 -4297,		/* B1 = -0.262329 */
10396 		 23667,		/* B0 = 0.722260 */
10397 		 5,		/* Internal filter scaling */
10398 		 159,		/* Minimum in-band energy threshold */
10399 		 21,		/* 21/32 in-band to broad-band ratio */
10400 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10401 	},
10402 	{			/* f1860 */
10403 		3569,		/* A1 = -0.217865 */
10404 		 -32292,	/* A2 = 0.985504 */
10405 		 -239,		/* B2 = -0.007322 */
10406 		 0,		/* B1 = 0.000000 */
10407 		 239,		/* B0 = 0.007322 */
10408 		 3117,		/* A1 = -0.190277 */
10409 		 -32603,	/* A2 = 0.994965 */
10410 		 18658,		/* B2 = 0.569427 */
10411 		 -1557,		/* B1 = -0.095032 */
10412 		 18658,		/* B0 = 0.569427 */
10413 		 4054,		/* A1 = -0.247437 */
10414 		 -32603,	/* A2 = 0.994965 */
10415 		 18886,		/* B2 = 0.576385 */
10416 		 -2566,		/* B1 = -0.156647 */
10417 		 18886,		/* B0 = 0.576385 */
10418 		 5,		/* Internal filter scaling */
10419 		 159,		/* Minimum in-band energy threshold */
10420 		 21,		/* 21/32 in-band to broad-band ratio */
10421 		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10422 	},
10423 };
ixj_init_filter(IXJ * j,IXJ_FILTER * jf)10424 static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf)
10425 {
10426 	unsigned short cmd;
10427 	int cnt, max;
10428 
10429 	if (jf->filter > 3) {
10430 		return -1;
10431 	}
10432 	if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))	/* Select Filter */
10433 
10434 		return -1;
10435 	if (!jf->enable) {
10436 		if (ixj_WriteDSPCommand(0x5152, j))		/* Disable Filter */
10437 
10438 			return -1;
10439 		else
10440 			return 0;
10441 	} else {
10442 		if (ixj_WriteDSPCommand(0x5153, j))		/* Enable Filter */
10443 
10444 			return -1;
10445 		/* Select the filter (f0 - f3) to use. */
10446 		if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))
10447 			return -1;
10448 	}
10449 	if (jf->freq < 12 && jf->freq > 3) {
10450 		/* Select the frequency for the selected filter. */
10451 		if (ixj_WriteDSPCommand(0x5170 + jf->freq, j))
10452 			return -1;
10453 	} else if (jf->freq > 11) {
10454 		/* We need to load a programmable filter set for undefined */
10455 		/* frequencies.  So we will point the filter to a programmable set. */
10456 		/* Since there are only 4 filters and 4 programmable sets, we will */
10457 		/* just point the filter to the same number set and program it for the */
10458 		/* frequency we want. */
10459 		if (ixj_WriteDSPCommand(0x5170 + jf->filter, j))
10460 			return -1;
10461 		if (j->ver.low != 0x12) {
10462 			cmd = 0x515B;
10463 			max = 19;
10464 		} else {
10465 			cmd = 0x515E;
10466 			max = 15;
10467 		}
10468 		if (ixj_WriteDSPCommand(cmd, j))
10469 			return -1;
10470 		for (cnt = 0; cnt < max; cnt++) {
10471 			if (ixj_WriteDSPCommand(tone_table[jf->freq - 12][cnt], j))
10472 				return -1;
10473 		}
10474 	}
10475 	j->filter_en[jf->filter] = jf->enable;
10476 	return 0;
10477 }
10478 
ixj_init_filter_raw(IXJ * j,IXJ_FILTER_RAW * jfr)10479 static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr)
10480 {
10481 	unsigned short cmd;
10482 	int cnt, max;
10483 	if (jfr->filter > 3) {
10484 		return -1;
10485 	}
10486 	if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))	/* Select Filter */
10487 		return -1;
10488 
10489 	if (!jfr->enable) {
10490 		if (ixj_WriteDSPCommand(0x5152, j))		/* Disable Filter */
10491 			return -1;
10492 		else
10493 			return 0;
10494 	} else {
10495 		if (ixj_WriteDSPCommand(0x5153, j))		/* Enable Filter */
10496 			return -1;
10497 		/* Select the filter (f0 - f3) to use. */
10498 		if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))
10499 			return -1;
10500 	}
10501 	/* We need to load a programmable filter set for undefined */
10502 	/* frequencies.  So we will point the filter to a programmable set. */
10503 	/* Since there are only 4 filters and 4 programmable sets, we will */
10504 	/* just point the filter to the same number set and program it for the */
10505 	/* frequency we want. */
10506 	if (ixj_WriteDSPCommand(0x5170 + jfr->filter, j))
10507 		return -1;
10508 	if (j->ver.low != 0x12) {
10509 		cmd = 0x515B;
10510 		max = 19;
10511 	} else {
10512 		cmd = 0x515E;
10513 		max = 15;
10514 	}
10515 	if (ixj_WriteDSPCommand(cmd, j))
10516 		return -1;
10517 	for (cnt = 0; cnt < max; cnt++) {
10518 		if (ixj_WriteDSPCommand(jfr->coeff[cnt], j))
10519 			return -1;
10520 	}
10521 	j->filter_en[jfr->filter] = jfr->enable;
10522 	return 0;
10523 }
10524 
ixj_init_tone(IXJ * j,IXJ_TONE * ti)10525 static int ixj_init_tone(IXJ *j, IXJ_TONE * ti)
10526 {
10527 	int freq0, freq1;
10528 	unsigned short data;
10529 	if (ti->freq0) {
10530 		freq0 = ti->freq0;
10531 	} else {
10532 		freq0 = 0x7FFF;
10533 	}
10534 
10535 	if (ti->freq1) {
10536 		freq1 = ti->freq1;
10537 	} else {
10538 		freq1 = 0x7FFF;
10539 	}
10540 
10541 	if(ti->tone_index > 12 && ti->tone_index < 28)
10542 	{
10543 		if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, j))
10544 			return -1;
10545 		if (ixj_WriteDSPCommand(0x6000 + (ti->gain1 << 4) + ti->gain0, j))
10546 			return -1;
10547 		data = freq0;
10548 		if (ixj_WriteDSPCommand(data, j))
10549 			return -1;
10550 		data = freq1;
10551 		if (ixj_WriteDSPCommand(data, j))
10552 			return -1;
10553 	}
10554 	return freq0;
10555 }
10556 
10557