[PATCH] translate dashes in filenames for headers install
[linux-2.6/mini2440.git] / drivers / telephony / ixj.c
blobdf4cc1fb5f68df840bfe9382a151862598046343
1 /****************************************************************************
2 * ixj.c
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
9 * (c) Copyright 1999-2001 Quicknet Technologies, Inc.
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.
16 * Author: Ed Okerson, <eokerson@quicknet.net>
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>
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>
28 * More information about the hardware related to this driver can be found
29 * at our website: http://www.quicknet.net
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.
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.
42 ***************************************************************************/
45 * $Log: ixj.c,v $
47 * Revision 4.8 2003/07/09 19:39:00 Daniele Bellucci
48 * Audit some copy_*_user and minor cleanup.
50 * Revision 4.7 2001/08/13 06:19:33 craigs
51 * Added additional changes from Alan Cox and John Anderson for
52 * 2.2 to 2.4 cleanup and bounds checking
54 * Revision 4.6 2001/08/13 01:05:05 craigs
55 * Really fixed PHONE_QUERY_CODEC problem this time
57 * Revision 4.5 2001/08/13 00:11:03 craigs
58 * Fixed problem in handling of PHONE_QUERY_CODEC, thanks to Shane Anderson
60 * Revision 4.4 2001/08/07 07:58:12 craigs
61 * Changed back to three digit version numbers
62 * Added tagbuild target to allow automatic and easy tagging of versions
64 * Revision 4.3 2001/08/07 07:24:47 craigs
65 * Added ixj-ver.h to allow easy configuration management of driver
66 * Added display of version number in /prox/ixj
68 * Revision 4.2 2001/08/06 07:07:19 craigs
69 * Reverted IXJCTL_DSP_TYPE and IXJCTL_DSP_VERSION files to original
70 * behaviour of returning int rather than short *
72 * Revision 4.1 2001/08/05 00:17:37 craigs
73 * More changes for correct PCMCIA installation
74 * Start of changes for backward Linux compatibility
76 * Revision 4.0 2001/08/04 12:33:12 craigs
77 * New version using GNU autoconf
79 * Revision 3.105 2001/07/20 23:14:32 eokerson
80 * More work on CallerID generation when using ring cadences.
82 * Revision 3.104 2001/07/06 01:33:55 eokerson
83 * Some bugfixes from Robert Vojta <vojta@ipex.cz> and a few mods to the Makefile.
85 * Revision 3.103 2001/07/05 19:20:16 eokerson
86 * Updated HOWTO
87 * Changed mic gain to 30dB on Internet LineJACK mic/speaker port.
89 * Revision 3.102 2001/07/03 23:51:21 eokerson
90 * Un-mute mic on Internet LineJACK when in speakerphone mode.
92 * Revision 3.101 2001/07/02 19:26:56 eokerson
93 * Removed initialiazation of ixjdebug and ixj_convert_loaded so they will go in the .bss instead of the .data
95 * Revision 3.100 2001/07/02 19:18:27 eokerson
96 * Changed driver to make dynamic allocation possible. We now pass IXJ * between functions instead of array indexes.
97 * Fixed the way the POTS and PSTN ports interact during a PSTN call to allow local answering.
98 * Fixed speaker mode on Internet LineJACK.
100 * Revision 3.99 2001/05/09 14:11:16 eokerson
101 * Fixed kmalloc error in ixj_build_filter_cadence. Thanks David Chan <cat@waulogy.stanford.edu>.
103 * Revision 3.98 2001/05/08 19:55:33 eokerson
104 * Fixed POTS hookstate detection while it is connected to PSTN port.
106 * Revision 3.97 2001/05/08 00:01:04 eokerson
107 * Fixed kernel oops when sending caller ID data.
109 * Revision 3.96 2001/05/04 23:09:30 eokerson
110 * Now uses one kernel timer for each card, instead of one for the entire driver.
112 * Revision 3.95 2001/04/25 22:06:47 eokerson
113 * Fixed squawking at beginning of some G.723.1 calls.
115 * Revision 3.94 2001/04/03 23:42:00 eokerson
116 * Added linear volume ioctls
117 * Added raw filter load ioctl
119 * Revision 3.93 2001/02/27 01:00:06 eokerson
120 * Fixed blocking in CallerID.
121 * Reduced size of ixj structure for smaller driver footprint.
123 * Revision 3.92 2001/02/20 22:02:59 eokerson
124 * Fixed isapnp and pcmcia module compatibility for 2.4.x kernels.
125 * Improved PSTN ring detection.
126 * Fixed wink generation on POTS ports.
128 * Revision 3.91 2001/02/13 00:55:44 eokerson
129 * Turn AEC back on after changing frame sizes.
131 * Revision 3.90 2001/02/12 16:42:00 eokerson
132 * Added ALAW codec, thanks to Fabio Ferrari for the table based converters to make ALAW from ULAW.
134 * Revision 3.89 2001/02/12 15:41:16 eokerson
135 * Fix from Artis Kugevics - Tone gains were not being set correctly.
137 * Revision 3.88 2001/02/05 23:25:42 eokerson
138 * Fixed lockup bugs with deregister.
140 * Revision 3.87 2001/01/29 21:00:39 eokerson
141 * Fix from Fabio Ferrari <fabio.ferrari@digitro.com.br> to properly handle EAGAIN and EINTR during non-blocking write.
142 * Updated copyright date.
144 * Revision 3.86 2001/01/23 23:53:46 eokerson
145 * Fixes to G.729 compatibility.
147 * Revision 3.85 2001/01/23 21:30:36 eokerson
148 * Added verbage about cards supported.
149 * Removed commands that put the card in low power mode at some times that it should not be in low power mode.
151 * Revision 3.84 2001/01/22 23:32:10 eokerson
152 * Some bugfixes from David Huggins-Daines, <dhd@cepstral.com> and other cleanups.
154 * Revision 3.83 2001/01/19 14:51:41 eokerson
155 * Fixed ixj_WriteDSPCommand to decrement usage counter when command fails.
157 * Revision 3.82 2001/01/19 00:34:49 eokerson
158 * Added verbosity to write overlap errors.
160 * Revision 3.81 2001/01/18 23:56:54 eokerson
161 * Fixed PSTN line test functions.
163 * Revision 3.80 2001/01/18 22:29:27 eokerson
164 * Updated AEC/AGC values for different cards.
166 * Revision 3.79 2001/01/17 02:58:54 eokerson
167 * Fixed AEC reset after Caller ID.
168 * Fixed Codec lockup after Caller ID on Call Waiting when not using 30ms frames.
170 * Revision 3.78 2001/01/16 19:43:09 eokerson
171 * Added support for Linux 2.4.x kernels.
173 * Revision 3.77 2001/01/09 04:00:52 eokerson
174 * Linetest will now test the line, even if it has previously succeded.
176 * Revision 3.76 2001/01/08 19:27:00 eokerson
177 * Fixed problem with standard cable on Internet PhoneCARD.
179 * Revision 3.75 2000/12/22 16:52:14 eokerson
180 * Modified to allow hookstate detection on the POTS port when the PSTN port is selected.
182 * Revision 3.74 2000/12/08 22:41:50 eokerson
183 * Added capability for G729B.
185 * Revision 3.73 2000/12/07 23:35:16 eokerson
186 * Added capability to have different ring pattern before CallerID data.
187 * Added hookstate checks in CallerID routines to stop FSK.
189 * Revision 3.72 2000/12/06 19:31:31 eokerson
190 * Modified signal behavior to only send one signal per event.
192 * Revision 3.71 2000/12/06 03:23:08 eokerson
193 * Fixed CallerID on Call Waiting.
195 * Revision 3.70 2000/12/04 21:29:37 eokerson
196 * Added checking to Smart Cable gain functions.
198 * Revision 3.69 2000/12/04 21:05:20 eokerson
199 * Changed ixjdebug levels.
200 * Added ioctls to change gains in Internet Phone CARD Smart Cable.
202 * Revision 3.68 2000/12/04 00:17:21 craigs
203 * Changed mixer voice gain to +6dB rather than 0dB
205 * Revision 3.67 2000/11/30 21:25:51 eokerson
206 * Fixed write signal errors.
208 * Revision 3.66 2000/11/29 22:42:44 eokerson
209 * Fixed PSTN ring detect problems.
211 * Revision 3.65 2000/11/29 07:31:55 craigs
212 * Added new 425Hz filter co-efficients
213 * Added card-specific DTMF prescaler initialisation
215 * Revision 3.64 2000/11/28 14:03:32 craigs
216 * Changed certain mixer initialisations to be 0dB rather than 12dB
217 * Added additional information to /proc/ixj
219 * Revision 3.63 2000/11/28 11:38:41 craigs
220 * Added display of AEC modes in AUTO and AGC mode
222 * Revision 3.62 2000/11/28 04:05:44 eokerson
223 * Improved PSTN ring detection routine.
225 * Revision 3.61 2000/11/27 21:53:12 eokerson
226 * Fixed flash detection.
228 * Revision 3.60 2000/11/27 15:57:29 eokerson
229 * More work on G.729 load routines.
231 * Revision 3.59 2000/11/25 21:55:12 eokerson
232 * Fixed errors in G.729 load routine.
234 * Revision 3.58 2000/11/25 04:08:29 eokerson
235 * Added board locks around G.729 and TS85 load routines.
237 * Revision 3.57 2000/11/24 05:35:17 craigs
238 * Added ability to retrieve mixer values on LineJACK
239 * Added complete initialisation of all mixer values at startup
240 * Fixed spelling mistake
242 * Revision 3.56 2000/11/23 02:52:11 robertj
243 * Added cvs change log keyword.
244 * Fixed bug in capabilities list when using G.729 module.
248 #include "ixj-ver.h"
250 #define PERFMON_STATS
251 #define IXJDEBUG 0
252 #define MAXRINGS 5
254 #include <linux/module.h>
256 #include <linux/init.h>
257 #include <linux/sched.h>
258 #include <linux/kernel.h> /* printk() */
259 #include <linux/fs.h> /* everything... */
260 #include <linux/errno.h> /* error codes */
261 #include <linux/slab.h>
262 #include <linux/mm.h>
263 #include <linux/ioport.h>
264 #include <linux/interrupt.h>
265 #include <linux/proc_fs.h>
266 #include <linux/poll.h>
267 #include <linux/timer.h>
268 #include <linux/delay.h>
269 #include <linux/pci.h>
271 #include <asm/io.h>
272 #include <asm/uaccess.h>
274 #include <linux/isapnp.h>
276 #include "ixj.h"
278 #define TYPE(inode) (iminor(inode) >> 4)
279 #define NUM(inode) (iminor(inode) & 0xf)
281 static int ixjdebug;
282 static int hertz = HZ;
283 static int samplerate = 100;
285 module_param(ixjdebug, int, 0);
287 static struct pci_device_id ixj_pci_tbl[] __devinitdata = {
288 { PCI_VENDOR_ID_QUICKNET, PCI_DEVICE_ID_QUICKNET_XJ,
289 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
293 MODULE_DEVICE_TABLE(pci, ixj_pci_tbl);
295 /************************************************************************
297 * ixjdebug meanings are now bit mapped instead of level based
298 * Values can be or'ed together to turn on multiple messages
300 * bit 0 (0x0001) = any failure
301 * bit 1 (0x0002) = general messages
302 * bit 2 (0x0004) = POTS ringing related
303 * bit 3 (0x0008) = PSTN events
304 * bit 4 (0x0010) = PSTN Cadence state details
305 * bit 5 (0x0020) = Tone detection triggers
306 * bit 6 (0x0040) = Tone detection cadence details
307 * bit 7 (0x0080) = ioctl tracking
308 * bit 8 (0x0100) = signal tracking
309 * bit 9 (0x0200) = CallerID generation details
311 ************************************************************************/
313 #ifdef IXJ_DYN_ALLOC
315 static IXJ *ixj[IXJMAX];
316 #define get_ixj(b) ixj[(b)]
319 * Allocate a free IXJ device
322 static IXJ *ixj_alloc()
324 for(cnt=0; cnt<IXJMAX; cnt++)
326 if(ixj[cnt] == NULL || !ixj[cnt]->DSPbase)
328 j = kmalloc(sizeof(IXJ), GFP_KERNEL);
329 if (j == NULL)
330 return NULL;
331 ixj[cnt] = j;
332 return j;
335 return NULL;
338 static void ixj_fsk_free(IXJ *j)
340 kfree(j->fskdata);
341 j->fskdata = NULL;
344 static void ixj_fsk_alloc(IXJ *j)
346 if(!j->fskdata) {
347 j->fskdata = kmalloc(8000, GFP_KERNEL);
348 if (!j->fskdata) {
349 if(ixjdebug & 0x0200) {
350 printk("IXJ phone%d - allocate failed\n", j->board);
352 return;
353 } else {
354 j->fsksize = 8000;
355 if(ixjdebug & 0x0200) {
356 printk("IXJ phone%d - allocate succeded\n", j->board);
362 #else
364 static IXJ ixj[IXJMAX];
365 #define get_ixj(b) (&ixj[(b)])
368 * Allocate a free IXJ device
371 static IXJ *ixj_alloc(void)
373 int cnt;
374 for(cnt=0; cnt<IXJMAX; cnt++) {
375 if(!ixj[cnt].DSPbase)
376 return &ixj[cnt];
378 return NULL;
381 static inline void ixj_fsk_free(IXJ *j) {;}
383 static inline void ixj_fsk_alloc(IXJ *j)
385 j->fsksize = 8000;
388 #endif
390 #ifdef PERFMON_STATS
391 #define ixj_perfmon(x) ((x)++)
392 #else
393 #define ixj_perfmon(x) do { } while(0)
394 #endif
396 static int ixj_convert_loaded;
398 static int ixj_WriteDSPCommand(unsigned short, IXJ *j);
400 /************************************************************************
402 * These are function definitions to allow external modules to register
403 * enhanced functionality call backs.
405 ************************************************************************/
407 static int Stub(IXJ * J, unsigned long arg)
409 return 0;
412 static IXJ_REGFUNC ixj_PreRead = &Stub;
413 static IXJ_REGFUNC ixj_PostRead = &Stub;
414 static IXJ_REGFUNC ixj_PreWrite = &Stub;
415 static IXJ_REGFUNC ixj_PostWrite = &Stub;
417 static void ixj_read_frame(IXJ *j);
418 static void ixj_write_frame(IXJ *j);
419 static void ixj_init_timer(IXJ *j);
420 static void ixj_add_timer(IXJ * j);
421 static void ixj_timeout(unsigned long ptr);
422 static int read_filters(IXJ *j);
423 static int LineMonitor(IXJ *j);
424 static int ixj_fasync(int fd, struct file *, int mode);
425 static int ixj_set_port(IXJ *j, int arg);
426 static int ixj_set_pots(IXJ *j, int arg);
427 static int ixj_hookstate(IXJ *j);
428 static int ixj_record_start(IXJ *j);
429 static void ixj_record_stop(IXJ *j);
430 static void set_rec_volume(IXJ *j, int volume);
431 static int get_rec_volume(IXJ *j);
432 static int set_rec_codec(IXJ *j, int rate);
433 static void ixj_vad(IXJ *j, int arg);
434 static int ixj_play_start(IXJ *j);
435 static void ixj_play_stop(IXJ *j);
436 static int ixj_set_tone_on(unsigned short arg, IXJ *j);
437 static int ixj_set_tone_off(unsigned short, IXJ *j);
438 static int ixj_play_tone(IXJ *j, char tone);
439 static void ixj_aec_start(IXJ *j, int level);
440 static int idle(IXJ *j);
441 static void ixj_ring_on(IXJ *j);
442 static void ixj_ring_off(IXJ *j);
443 static void aec_stop(IXJ *j);
444 static void ixj_ringback(IXJ *j);
445 static void ixj_busytone(IXJ *j);
446 static void ixj_dialtone(IXJ *j);
447 static void ixj_cpt_stop(IXJ *j);
448 static char daa_int_read(IXJ *j);
449 static char daa_CR_read(IXJ *j, int cr);
450 static int daa_set_mode(IXJ *j, int mode);
451 static int ixj_linetest(IXJ *j);
452 static int ixj_daa_write(IXJ *j);
453 static int ixj_daa_cid_read(IXJ *j);
454 static void DAA_Coeff_US(IXJ *j);
455 static void DAA_Coeff_UK(IXJ *j);
456 static void DAA_Coeff_France(IXJ *j);
457 static void DAA_Coeff_Germany(IXJ *j);
458 static void DAA_Coeff_Australia(IXJ *j);
459 static void DAA_Coeff_Japan(IXJ *j);
460 static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf);
461 static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr);
462 static int ixj_init_tone(IXJ *j, IXJ_TONE * ti);
463 static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp);
464 static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp);
465 /* Serial Control Interface funtions */
466 static int SCI_Control(IXJ *j, int control);
467 static int SCI_Prepare(IXJ *j);
468 static int SCI_WaitHighSCI(IXJ *j);
469 static int SCI_WaitLowSCI(IXJ *j);
470 static DWORD PCIEE_GetSerialNumber(WORD wAddress);
471 static int ixj_PCcontrol_wait(IXJ *j);
472 static void ixj_pre_cid(IXJ *j);
473 static void ixj_write_cid(IXJ *j);
474 static void ixj_write_cid_bit(IXJ *j, int bit);
475 static int set_base_frame(IXJ *j, int size);
476 static int set_play_codec(IXJ *j, int rate);
477 static void set_rec_depth(IXJ *j, int depth);
478 static int ixj_mixer(long val, IXJ *j);
480 /************************************************************************
481 CT8020/CT8021 Host Programmers Model
482 Host address Function Access
483 DSPbase +
484 0-1 Aux Software Status Register (reserved) Read Only
485 2-3 Software Status Register Read Only
486 4-5 Aux Software Control Register (reserved) Read Write
487 6-7 Software Control Register Read Write
488 8-9 Hardware Status Register Read Only
489 A-B Hardware Control Register Read Write
490 C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only
491 E-F Host Recieve (Read) Data Buffer Access Port (buffer input) Read Only
492 ************************************************************************/
494 static inline void ixj_read_HSR(IXJ *j)
496 j->hsr.bytes.low = inb_p(j->DSPbase + 8);
497 j->hsr.bytes.high = inb_p(j->DSPbase + 9);
500 static inline int IsControlReady(IXJ *j)
502 ixj_read_HSR(j);
503 return j->hsr.bits.controlrdy ? 1 : 0;
506 static inline int IsPCControlReady(IXJ *j)
508 j->pccr1.byte = inb_p(j->XILINXbase + 3);
509 return j->pccr1.bits.crr ? 1 : 0;
512 static inline int IsStatusReady(IXJ *j)
514 ixj_read_HSR(j);
515 return j->hsr.bits.statusrdy ? 1 : 0;
518 static inline int IsRxReady(IXJ *j)
520 ixj_read_HSR(j);
521 ixj_perfmon(j->rxreadycheck);
522 return j->hsr.bits.rxrdy ? 1 : 0;
525 static inline int IsTxReady(IXJ *j)
527 ixj_read_HSR(j);
528 ixj_perfmon(j->txreadycheck);
529 return j->hsr.bits.txrdy ? 1 : 0;
532 static inline void set_play_volume(IXJ *j, int volume)
534 if (ixjdebug & 0x0002)
535 printk(KERN_INFO "IXJ: /dev/phone%d Setting Play Volume to 0x%4.4x\n", j->board, volume);
536 ixj_WriteDSPCommand(0xCF02, j);
537 ixj_WriteDSPCommand(volume, j);
540 static int set_play_volume_linear(IXJ *j, int volume)
542 int newvolume, dspplaymax;
544 if (ixjdebug & 0x0002)
545 printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Play Volume to 0x%4.4x\n", j->board, volume);
546 if(volume > 100 || volume < 0) {
547 return -1;
550 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
551 switch (j->cardtype) {
552 case QTI_PHONEJACK:
553 dspplaymax = 0x380;
554 break;
555 case QTI_LINEJACK:
556 if(j->port == PORT_PSTN) {
557 dspplaymax = 0x48;
558 } else {
559 dspplaymax = 0x100;
561 break;
562 case QTI_PHONEJACK_LITE:
563 dspplaymax = 0x380;
564 break;
565 case QTI_PHONEJACK_PCI:
566 dspplaymax = 0x6C;
567 break;
568 case QTI_PHONECARD:
569 dspplaymax = 0x50;
570 break;
571 default:
572 return -1;
574 newvolume = (dspplaymax * volume) / 100;
575 set_play_volume(j, newvolume);
576 return 0;
579 static inline void set_play_depth(IXJ *j, int depth)
581 if (depth > 60)
582 depth = 60;
583 if (depth < 0)
584 depth = 0;
585 ixj_WriteDSPCommand(0x5280 + depth, j);
588 static inline int get_play_volume(IXJ *j)
590 ixj_WriteDSPCommand(0xCF00, j);
591 return j->ssr.high << 8 | j->ssr.low;
594 static int get_play_volume_linear(IXJ *j)
596 int volume, newvolume, dspplaymax;
598 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
599 switch (j->cardtype) {
600 case QTI_PHONEJACK:
601 dspplaymax = 0x380;
602 break;
603 case QTI_LINEJACK:
604 if(j->port == PORT_PSTN) {
605 dspplaymax = 0x48;
606 } else {
607 dspplaymax = 0x100;
609 break;
610 case QTI_PHONEJACK_LITE:
611 dspplaymax = 0x380;
612 break;
613 case QTI_PHONEJACK_PCI:
614 dspplaymax = 0x6C;
615 break;
616 case QTI_PHONECARD:
617 dspplaymax = 100;
618 break;
619 default:
620 return -1;
622 volume = get_play_volume(j);
623 newvolume = (volume * 100) / dspplaymax;
624 if(newvolume > 100)
625 newvolume = 100;
626 return newvolume;
629 static inline BYTE SLIC_GetState(IXJ *j)
631 if (j->cardtype == QTI_PHONECARD) {
632 j->pccr1.byte = 0;
633 j->psccr.bits.dev = 3;
634 j->psccr.bits.rw = 1;
635 outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
636 ixj_PCcontrol_wait(j);
637 j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
638 ixj_PCcontrol_wait(j);
639 if (j->pslic.bits.powerdown)
640 return PLD_SLIC_STATE_OC;
641 else if (!j->pslic.bits.ring0 && !j->pslic.bits.ring1)
642 return PLD_SLIC_STATE_ACTIVE;
643 else
644 return PLD_SLIC_STATE_RINGING;
645 } else {
646 j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
648 return j->pld_slicr.bits.state;
651 static BOOL SLIC_SetState(BYTE byState, IXJ *j)
653 BOOL fRetVal = FALSE;
655 if (j->cardtype == QTI_PHONECARD) {
656 if (j->flags.pcmciasct) {
657 switch (byState) {
658 case PLD_SLIC_STATE_TIPOPEN:
659 case PLD_SLIC_STATE_OC:
660 j->pslic.bits.powerdown = 1;
661 j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
662 fRetVal = TRUE;
663 break;
664 case PLD_SLIC_STATE_RINGING:
665 if (j->readers || j->writers) {
666 j->pslic.bits.powerdown = 0;
667 j->pslic.bits.ring0 = 1;
668 j->pslic.bits.ring1 = 0;
669 fRetVal = TRUE;
671 break;
672 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
674 case PLD_SLIC_STATE_STANDBY:
675 case PLD_SLIC_STATE_ACTIVE:
676 if (j->readers || j->writers) {
677 j->pslic.bits.powerdown = 0;
678 } else {
679 j->pslic.bits.powerdown = 1;
681 j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
682 fRetVal = TRUE;
683 break;
684 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
686 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
688 default:
689 fRetVal = FALSE;
690 break;
692 j->psccr.bits.dev = 3;
693 j->psccr.bits.rw = 0;
694 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
695 ixj_PCcontrol_wait(j);
697 } else {
698 /* Set the C1, C2, C3 & B2EN signals. */
699 switch (byState) {
700 case PLD_SLIC_STATE_OC:
701 j->pld_slicw.bits.c1 = 0;
702 j->pld_slicw.bits.c2 = 0;
703 j->pld_slicw.bits.c3 = 0;
704 j->pld_slicw.bits.b2en = 0;
705 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
706 fRetVal = TRUE;
707 break;
708 case PLD_SLIC_STATE_RINGING:
709 j->pld_slicw.bits.c1 = 1;
710 j->pld_slicw.bits.c2 = 0;
711 j->pld_slicw.bits.c3 = 0;
712 j->pld_slicw.bits.b2en = 1;
713 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
714 fRetVal = TRUE;
715 break;
716 case PLD_SLIC_STATE_ACTIVE:
717 j->pld_slicw.bits.c1 = 0;
718 j->pld_slicw.bits.c2 = 1;
719 j->pld_slicw.bits.c3 = 0;
720 j->pld_slicw.bits.b2en = 0;
721 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
722 fRetVal = TRUE;
723 break;
724 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
726 j->pld_slicw.bits.c1 = 1;
727 j->pld_slicw.bits.c2 = 1;
728 j->pld_slicw.bits.c3 = 0;
729 j->pld_slicw.bits.b2en = 0;
730 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
731 fRetVal = TRUE;
732 break;
733 case PLD_SLIC_STATE_TIPOPEN:
734 j->pld_slicw.bits.c1 = 0;
735 j->pld_slicw.bits.c2 = 0;
736 j->pld_slicw.bits.c3 = 1;
737 j->pld_slicw.bits.b2en = 0;
738 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
739 fRetVal = TRUE;
740 break;
741 case PLD_SLIC_STATE_STANDBY:
742 j->pld_slicw.bits.c1 = 1;
743 j->pld_slicw.bits.c2 = 0;
744 j->pld_slicw.bits.c3 = 1;
745 j->pld_slicw.bits.b2en = 1;
746 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
747 fRetVal = TRUE;
748 break;
749 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
751 j->pld_slicw.bits.c1 = 0;
752 j->pld_slicw.bits.c2 = 1;
753 j->pld_slicw.bits.c3 = 1;
754 j->pld_slicw.bits.b2en = 0;
755 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
756 fRetVal = TRUE;
757 break;
758 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
760 j->pld_slicw.bits.c1 = 1;
761 j->pld_slicw.bits.c2 = 1;
762 j->pld_slicw.bits.c3 = 1;
763 j->pld_slicw.bits.b2en = 0;
764 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
765 fRetVal = TRUE;
766 break;
767 default:
768 fRetVal = FALSE;
769 break;
773 return fRetVal;
776 static int ixj_wink(IXJ *j)
778 BYTE slicnow;
780 slicnow = SLIC_GetState(j);
782 j->pots_winkstart = jiffies;
783 SLIC_SetState(PLD_SLIC_STATE_OC, j);
785 msleep(jiffies_to_msecs(j->winktime));
787 SLIC_SetState(slicnow, j);
788 return 0;
791 static void ixj_init_timer(IXJ *j)
793 init_timer(&j->timer);
794 j->timer.function = ixj_timeout;
795 j->timer.data = (unsigned long)j;
798 static void ixj_add_timer(IXJ *j)
800 j->timer.expires = jiffies + (hertz / samplerate);
801 add_timer(&j->timer);
804 static void ixj_tone_timeout(IXJ *j)
806 IXJ_TONE ti;
808 j->tone_state++;
809 if (j->tone_state == 3) {
810 j->tone_state = 0;
811 if (j->cadence_t) {
812 j->tone_cadence_state++;
813 if (j->tone_cadence_state >= j->cadence_t->elements_used) {
814 switch (j->cadence_t->termination) {
815 case PLAY_ONCE:
816 ixj_cpt_stop(j);
817 break;
818 case REPEAT_LAST_ELEMENT:
819 j->tone_cadence_state--;
820 ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
821 break;
822 case REPEAT_ALL:
823 j->tone_cadence_state = 0;
824 if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
825 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
826 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
827 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
828 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
829 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
830 ixj_init_tone(j, &ti);
832 ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, j);
833 ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, j);
834 ixj_play_tone(j, j->cadence_t->ce[0].index);
835 break;
837 } else {
838 if (j->cadence_t->ce[j->tone_cadence_state].gain0) {
839 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
840 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
841 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
842 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
843 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
844 ixj_init_tone(j, &ti);
846 ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, j);
847 ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, j);
848 ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
854 static inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir)
856 if(j->ixj_signals[event]) {
857 if(ixjdebug & 0x0100)
858 printk("Sending signal for event %d\n", event);
859 /* Send apps notice of change */
860 /* see config.h for macro definition */
861 kill_fasync(&(j->async_queue), j->ixj_signals[event], dir);
865 static void ixj_pstn_state(IXJ *j)
867 int var;
868 union XOPXR0 XR0, daaint;
870 var = 10;
872 XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg;
873 daaint.reg = 0;
874 XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
876 j->pld_scrr.byte = inb_p(j->XILINXbase);
877 if (j->pld_scrr.bits.daaflag) {
878 daa_int_read(j);
879 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) {
880 if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {
881 daaint.bitreg.RING = 1;
882 if(ixjdebug & 0x0008) {
883 printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
885 } else {
886 daa_set_mode(j, SOP_PU_RESET);
889 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) {
890 daaint.bitreg.Caller_ID = 1;
891 j->pstn_cid_intr = 1;
892 j->pstn_cid_received = jiffies;
893 if(ixjdebug & 0x0008) {
894 printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
897 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) {
898 daaint.bitreg.Cadence = 1;
899 if(ixjdebug & 0x0008) {
900 printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
903 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) {
904 daaint.bitreg.VDD_OK = 1;
905 daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK;
908 daa_CR_read(j, 1);
909 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)) {
910 daaint.bitreg.RMR = 1;
911 daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
912 if(ixjdebug & 0x0008) {
913 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);
915 j->pstn_prev_rmr = j->pstn_last_rmr;
916 j->pstn_last_rmr = jiffies;
918 switch(j->daa_mode) {
919 case SOP_PU_SLEEP:
920 if (daaint.bitreg.RING) {
921 if (!j->flags.pstn_ringing) {
922 if (j->daa_mode != SOP_PU_RINGING) {
923 j->pstn_ring_int = jiffies;
924 daa_set_mode(j, SOP_PU_RINGING);
928 break;
929 case SOP_PU_RINGING:
930 if (daaint.bitreg.RMR) {
931 if (ixjdebug & 0x0008) {
932 printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
934 if (daaint.bitreg.SI_1) { /* Rising edge of RMR */
935 j->flags.pstn_rmr = 1;
936 j->pstn_ring_start = jiffies;
937 j->pstn_ring_stop = 0;
938 j->ex.bits.pstn_ring = 0;
939 if (j->cadence_f[4].state == 0) {
940 j->cadence_f[4].state = 1;
941 j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000);
942 j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000);
943 j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000);
944 } else if (j->cadence_f[4].state == 2) {
945 if((time_after(jiffies, j->cadence_f[4].off1min) &&
946 time_before(jiffies, j->cadence_f[4].off1max))) {
947 if (j->cadence_f[4].on2) {
948 j->cadence_f[4].state = 3;
949 j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000));
950 j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000));
951 j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000));
952 } else {
953 j->cadence_f[4].state = 7;
955 } else {
956 if (ixjdebug & 0x0008) {
957 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
958 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
959 j->cadence_f[4].off1);
961 j->cadence_f[4].state = 0;
963 } else if (j->cadence_f[4].state == 4) {
964 if((time_after(jiffies, j->cadence_f[4].off2min) &&
965 time_before(jiffies, j->cadence_f[4].off2max))) {
966 if (j->cadence_f[4].on3) {
967 j->cadence_f[4].state = 5;
968 j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000));
969 j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000));
970 j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000));
971 } else {
972 j->cadence_f[4].state = 7;
974 } else {
975 if (ixjdebug & 0x0008) {
976 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
977 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
978 j->cadence_f[4].off2);
980 j->cadence_f[4].state = 0;
982 } else if (j->cadence_f[4].state == 6) {
983 if((time_after(jiffies, j->cadence_f[4].off3min) &&
984 time_before(jiffies, j->cadence_f[4].off3max))) {
985 j->cadence_f[4].state = 7;
986 } else {
987 if (ixjdebug & 0x0008) {
988 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
989 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
990 j->cadence_f[4].off3);
992 j->cadence_f[4].state = 0;
994 } else {
995 j->cadence_f[4].state = 0;
997 } else { /* Falling edge of RMR */
998 j->pstn_ring_start = 0;
999 j->pstn_ring_stop = jiffies;
1000 if (j->cadence_f[4].state == 1) {
1001 if(!j->cadence_f[4].on1) {
1002 j->cadence_f[4].state = 7;
1003 } else if((time_after(jiffies, j->cadence_f[4].on1min) &&
1004 time_before(jiffies, j->cadence_f[4].on1max))) {
1005 if (j->cadence_f[4].off1) {
1006 j->cadence_f[4].state = 2;
1007 j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000));
1008 j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000));
1009 j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000));
1010 } else {
1011 j->cadence_f[4].state = 7;
1013 } else {
1014 if (ixjdebug & 0x0008) {
1015 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1016 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1017 j->cadence_f[4].on1);
1019 j->cadence_f[4].state = 0;
1021 } else if (j->cadence_f[4].state == 3) {
1022 if((time_after(jiffies, j->cadence_f[4].on2min) &&
1023 time_before(jiffies, j->cadence_f[4].on2max))) {
1024 if (j->cadence_f[4].off2) {
1025 j->cadence_f[4].state = 4;
1026 j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000));
1027 j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000));
1028 j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000));
1029 } else {
1030 j->cadence_f[4].state = 7;
1032 } else {
1033 if (ixjdebug & 0x0008) {
1034 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1035 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1036 j->cadence_f[4].on2);
1038 j->cadence_f[4].state = 0;
1040 } else if (j->cadence_f[4].state == 5) {
1041 if((time_after(jiffies, j->cadence_f[4].on3min) &&
1042 time_before(jiffies, j->cadence_f[4].on3max))) {
1043 if (j->cadence_f[4].off3) {
1044 j->cadence_f[4].state = 6;
1045 j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000));
1046 j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000));
1047 j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000));
1048 } else {
1049 j->cadence_f[4].state = 7;
1051 } else {
1052 j->cadence_f[4].state = 0;
1054 } else {
1055 if (ixjdebug & 0x0008) {
1056 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1057 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1058 j->cadence_f[4].on3);
1060 j->cadence_f[4].state = 0;
1063 if (ixjdebug & 0x0010) {
1064 printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
1066 if (ixjdebug & 0x0010) {
1067 switch(j->cadence_f[4].state) {
1068 case 1:
1069 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1070 j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max);
1071 break;
1072 case 2:
1073 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1074 j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max);
1075 break;
1076 case 3:
1077 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1078 j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max);
1079 break;
1080 case 4:
1081 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1082 j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max);
1083 break;
1084 case 5:
1085 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1086 j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max);
1087 break;
1088 case 6:
1089 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1090 j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max);
1091 break;
1095 if (j->cadence_f[4].state == 7) {
1096 j->cadence_f[4].state = 0;
1097 j->pstn_ring_stop = jiffies;
1098 j->ex.bits.pstn_ring = 1;
1099 ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN);
1100 if(ixjdebug & 0x0008) {
1101 printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ld\n", j->board, jiffies);
1104 if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) ||
1105 (j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) {
1106 if(ixjdebug & 0x0008) {
1107 printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j->board, jiffies);
1108 printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j->board, j->pstn_ring_int);
1109 printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j->board, j->pstn_ring_stop);
1111 j->pstn_ring_stop = j->pstn_ring_int = 0;
1112 daa_set_mode(j, SOP_PU_SLEEP);
1114 outb_p(j->pld_scrw.byte, j->XILINXbase);
1115 if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) {
1116 ixj_daa_cid_read(j);
1117 j->ex.bits.caller_id = 1;
1118 ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN);
1119 j->pstn_cid_intr = 0;
1121 if (daaint.bitreg.Cadence) {
1122 if(ixjdebug & 0x0008) {
1123 printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j->board);
1125 daa_set_mode(j, SOP_PU_SLEEP);
1126 j->ex.bits.pstn_ring = 0;
1128 break;
1129 case SOP_PU_CONVERSATION:
1130 if (daaint.bitreg.VDD_OK) {
1131 if(!daaint.bitreg.SI_0) {
1132 if (!j->pstn_winkstart) {
1133 if(ixjdebug & 0x0008) {
1134 printk("IXJ DAA possible wink /dev/phone%d %ld\n", j->board, jiffies);
1136 j->pstn_winkstart = jiffies;
1138 } else {
1139 if (j->pstn_winkstart) {
1140 if(ixjdebug & 0x0008) {
1141 printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies);
1143 j->pstn_winkstart = 0;
1147 if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) {
1148 if(ixjdebug & 0x0008) {
1149 printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j->board, jiffies);
1151 daa_set_mode(j, SOP_PU_SLEEP);
1152 j->pstn_winkstart = 0;
1153 j->ex.bits.pstn_wink = 1;
1154 ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN);
1156 break;
1160 static void ixj_timeout(unsigned long ptr)
1162 int board;
1163 unsigned long jifon;
1164 IXJ *j = (IXJ *)ptr;
1165 board = j->board;
1167 if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) {
1168 ixj_perfmon(j->timerchecks);
1169 j->hookstate = ixj_hookstate(j);
1170 if (j->tone_state) {
1171 if (!(j->hookstate)) {
1172 ixj_cpt_stop(j);
1173 if (j->m_hook) {
1174 j->m_hook = 0;
1175 j->ex.bits.hookstate = 1;
1176 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1178 clear_bit(board, &j->busyflags);
1179 ixj_add_timer(j);
1180 return;
1182 if (j->tone_state == 1)
1183 jifon = ((hertz * j->tone_on_time) * 25 / 100000);
1184 else
1185 jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000);
1186 if (time_before(jiffies, j->tone_start_jif + jifon)) {
1187 if (j->tone_state == 1) {
1188 ixj_play_tone(j, j->tone_index);
1189 if (j->dsp.low == 0x20) {
1190 clear_bit(board, &j->busyflags);
1191 ixj_add_timer(j);
1192 return;
1194 } else {
1195 ixj_play_tone(j, 0);
1196 if (j->dsp.low == 0x20) {
1197 clear_bit(board, &j->busyflags);
1198 ixj_add_timer(j);
1199 return;
1202 } else {
1203 ixj_tone_timeout(j);
1204 if (j->flags.dialtone) {
1205 ixj_dialtone(j);
1207 if (j->flags.busytone) {
1208 ixj_busytone(j);
1209 if (j->dsp.low == 0x20) {
1210 clear_bit(board, &j->busyflags);
1211 ixj_add_timer(j);
1212 return;
1215 if (j->flags.ringback) {
1216 ixj_ringback(j);
1217 if (j->dsp.low == 0x20) {
1218 clear_bit(board, &j->busyflags);
1219 ixj_add_timer(j);
1220 return;
1223 if (!j->tone_state) {
1224 ixj_cpt_stop(j);
1228 if (!(j->tone_state && j->dsp.low == 0x20)) {
1229 if (IsRxReady(j)) {
1230 ixj_read_frame(j);
1232 if (IsTxReady(j)) {
1233 ixj_write_frame(j);
1236 if (j->flags.cringing) {
1237 if (j->hookstate & 1) {
1238 j->flags.cringing = 0;
1239 ixj_ring_off(j);
1240 } else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) {
1241 switch(j->cadence_f[5].state) {
1242 case 0:
1243 j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000));
1244 if (time_before(jiffies, j->cadence_f[5].on1dot)) {
1245 if(ixjdebug & 0x0004) {
1246 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1248 ixj_ring_on(j);
1250 j->cadence_f[5].state = 1;
1251 break;
1252 case 1:
1253 if (time_after(jiffies, j->cadence_f[5].on1dot)) {
1254 j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000));
1255 if(ixjdebug & 0x0004) {
1256 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1258 ixj_ring_off(j);
1259 j->cadence_f[5].state = 2;
1261 break;
1262 case 2:
1263 if (time_after(jiffies, j->cadence_f[5].off1dot)) {
1264 if(ixjdebug & 0x0004) {
1265 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1267 ixj_ring_on(j);
1268 if (j->cadence_f[5].on2) {
1269 j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000));
1270 j->cadence_f[5].state = 3;
1271 } else {
1272 j->cadence_f[5].state = 7;
1275 break;
1276 case 3:
1277 if (time_after(jiffies, j->cadence_f[5].on2dot)) {
1278 if(ixjdebug & 0x0004) {
1279 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1281 ixj_ring_off(j);
1282 if (j->cadence_f[5].off2) {
1283 j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000));
1284 j->cadence_f[5].state = 4;
1285 } else {
1286 j->cadence_f[5].state = 7;
1289 break;
1290 case 4:
1291 if (time_after(jiffies, j->cadence_f[5].off2dot)) {
1292 if(ixjdebug & 0x0004) {
1293 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1295 ixj_ring_on(j);
1296 if (j->cadence_f[5].on3) {
1297 j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000));
1298 j->cadence_f[5].state = 5;
1299 } else {
1300 j->cadence_f[5].state = 7;
1303 break;
1304 case 5:
1305 if (time_after(jiffies, j->cadence_f[5].on3dot)) {
1306 if(ixjdebug & 0x0004) {
1307 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1309 ixj_ring_off(j);
1310 if (j->cadence_f[5].off3) {
1311 j->cadence_f[5].off3dot = jiffies + (long)((j->cadence_f[5].off3 * (hertz * 100) / 10000));
1312 j->cadence_f[5].state = 6;
1313 } else {
1314 j->cadence_f[5].state = 7;
1317 break;
1318 case 6:
1319 if (time_after(jiffies, j->cadence_f[5].off3dot)) {
1320 if(ixjdebug & 0x0004) {
1321 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1323 j->cadence_f[5].state = 7;
1325 break;
1326 case 7:
1327 if(ixjdebug & 0x0004) {
1328 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1330 j->flags.cidring = 1;
1331 j->cadence_f[5].state = 0;
1332 break;
1334 if (j->flags.cidring && !j->flags.cidsent) {
1335 j->flags.cidsent = 1;
1336 if(j->fskdcnt) {
1337 SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1338 ixj_pre_cid(j);
1340 j->flags.cidring = 0;
1342 clear_bit(board, &j->busyflags);
1343 ixj_add_timer(j);
1344 return;
1345 } else {
1346 if (time_after(jiffies, j->ring_cadence_jif + (hertz / 2))) {
1347 if (j->flags.cidring && !j->flags.cidsent) {
1348 j->flags.cidsent = 1;
1349 if(j->fskdcnt) {
1350 SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1351 ixj_pre_cid(j);
1353 j->flags.cidring = 0;
1355 j->ring_cadence_t--;
1356 if (j->ring_cadence_t == -1)
1357 j->ring_cadence_t = 15;
1358 j->ring_cadence_jif = jiffies;
1360 if (j->ring_cadence & 1 << j->ring_cadence_t) {
1361 if(j->flags.cidsent && j->cadence_f[5].en_filter)
1362 j->flags.firstring = 1;
1363 else
1364 ixj_ring_on(j);
1365 } else {
1366 ixj_ring_off(j);
1367 if(!j->flags.cidsent)
1368 j->flags.cidring = 1;
1371 clear_bit(board, &j->busyflags);
1372 ixj_add_timer(j);
1373 return;
1376 if (!j->flags.ringing) {
1377 if (j->hookstate) { /* & 1) { */
1378 if (j->dsp.low != 0x20 &&
1379 SLIC_GetState(j) != PLD_SLIC_STATE_ACTIVE) {
1380 SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1382 LineMonitor(j);
1383 read_filters(j);
1384 ixj_WriteDSPCommand(0x511B, j);
1385 j->proc_load = j->ssr.high << 8 | j->ssr.low;
1386 if (!j->m_hook && (j->hookstate & 1)) {
1387 j->m_hook = j->ex.bits.hookstate = 1;
1388 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1390 } else {
1391 if (j->ex.bits.dtmf_ready) {
1392 j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0;
1394 if (j->m_hook) {
1395 j->m_hook = 0;
1396 j->ex.bits.hookstate = 1;
1397 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1401 if (j->cardtype == QTI_LINEJACK && !j->flags.pstncheck && j->flags.pstn_present) {
1402 ixj_pstn_state(j);
1404 if (j->ex.bytes) {
1405 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
1407 clear_bit(board, &j->busyflags);
1409 ixj_add_timer(j);
1412 static int ixj_status_wait(IXJ *j)
1414 unsigned long jif;
1416 jif = jiffies + ((60 * hertz) / 100);
1417 while (!IsStatusReady(j)) {
1418 ixj_perfmon(j->statuswait);
1419 if (time_after(jiffies, jif)) {
1420 ixj_perfmon(j->statuswaitfail);
1421 return -1;
1424 return 0;
1427 static int ixj_PCcontrol_wait(IXJ *j)
1429 unsigned long jif;
1431 jif = jiffies + ((60 * hertz) / 100);
1432 while (!IsPCControlReady(j)) {
1433 ixj_perfmon(j->pcontrolwait);
1434 if (time_after(jiffies, jif)) {
1435 ixj_perfmon(j->pcontrolwaitfail);
1436 return -1;
1439 return 0;
1442 static int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j)
1444 BYTES bytes;
1445 unsigned long jif;
1447 atomic_inc(&j->DSPWrite);
1448 if(atomic_read(&j->DSPWrite) > 1) {
1449 printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j->board, cmd);
1450 return -1;
1452 bytes.high = (cmd & 0xFF00) >> 8;
1453 bytes.low = cmd & 0x00FF;
1454 jif = jiffies + ((60 * hertz) / 100);
1455 while (!IsControlReady(j)) {
1456 ixj_perfmon(j->iscontrolready);
1457 if (time_after(jiffies, jif)) {
1458 ixj_perfmon(j->iscontrolreadyfail);
1459 atomic_dec(&j->DSPWrite);
1460 if(atomic_read(&j->DSPWrite) > 0) {
1461 printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j->board, cmd);
1462 while(atomic_read(&j->DSPWrite) > 0) {
1463 atomic_dec(&j->DSPWrite);
1466 return -1;
1469 outb(bytes.low, j->DSPbase + 6);
1470 outb(bytes.high, j->DSPbase + 7);
1472 if (ixj_status_wait(j)) {
1473 j->ssr.low = 0xFF;
1474 j->ssr.high = 0xFF;
1475 atomic_dec(&j->DSPWrite);
1476 if(atomic_read(&j->DSPWrite) > 0) {
1477 printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j->board, cmd);
1478 while(atomic_read(&j->DSPWrite) > 0) {
1479 atomic_dec(&j->DSPWrite);
1482 return -1;
1484 /* Read Software Status Register */
1485 j->ssr.low = inb_p(j->DSPbase + 2);
1486 j->ssr.high = inb_p(j->DSPbase + 3);
1487 atomic_dec(&j->DSPWrite);
1488 if(atomic_read(&j->DSPWrite) > 0) {
1489 printk("IXJ %d DSP overlaped command 0x%4.4x\n", j->board, cmd);
1490 while(atomic_read(&j->DSPWrite) > 0) {
1491 atomic_dec(&j->DSPWrite);
1494 return 0;
1497 /***************************************************************************
1499 * General Purpose IO Register read routine
1501 ***************************************************************************/
1502 static inline int ixj_gpio_read(IXJ *j)
1504 if (ixj_WriteDSPCommand(0x5143, j))
1505 return -1;
1507 j->gpio.bytes.low = j->ssr.low;
1508 j->gpio.bytes.high = j->ssr.high;
1510 return 0;
1513 static inline void LED_SetState(int state, IXJ *j)
1515 if (j->cardtype == QTI_LINEJACK) {
1516 j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0;
1517 j->pld_scrw.bits.led2 = state & 0x2 ? 1 : 0;
1518 j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0;
1519 j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0;
1521 outb(j->pld_scrw.byte, j->XILINXbase);
1525 /*********************************************************************
1526 * GPIO Pins are configured as follows on the Quicknet Internet
1527 * PhoneJACK Telephony Cards
1529 * POTS Select GPIO_6=0 GPIO_7=0
1530 * Mic/Speaker Select GPIO_6=0 GPIO_7=1
1531 * Handset Select GPIO_6=1 GPIO_7=0
1533 * SLIC Active GPIO_1=0 GPIO_2=1 GPIO_5=0
1534 * SLIC Ringing GPIO_1=1 GPIO_2=1 GPIO_5=0
1535 * SLIC Open Circuit GPIO_1=0 GPIO_2=0 GPIO_5=0
1537 * Hook Switch changes reported on GPIO_3
1538 *********************************************************************/
1539 static int ixj_set_port(IXJ *j, int arg)
1541 if (j->cardtype == QTI_PHONEJACK_LITE) {
1542 if (arg != PORT_POTS)
1543 return 10;
1544 else
1545 return 0;
1547 switch (arg) {
1548 case PORT_POTS:
1549 j->port = PORT_POTS;
1550 switch (j->cardtype) {
1551 case QTI_PHONECARD:
1552 if (j->flags.pcmciasct == 1)
1553 SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1554 else
1555 return 11;
1556 break;
1557 case QTI_PHONEJACK_PCI:
1558 j->pld_slicw.pcib.mic = 0;
1559 j->pld_slicw.pcib.spk = 0;
1560 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1561 break;
1562 case QTI_LINEJACK:
1563 ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */
1564 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to
1565 Software Control Register */
1566 return 2;
1567 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
1569 outb(j->pld_scrw.byte, j->XILINXbase);
1570 j->pld_clock.byte = 0;
1571 outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1572 j->pld_slicw.bits.rly1 = 1;
1573 j->pld_slicw.bits.spken = 0;
1574 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1575 ixj_mixer(0x1200, j); /* Turn Off MIC switch on mixer left */
1576 ixj_mixer(0x1401, j); /* Turn On Mono1 switch on mixer left */
1577 ixj_mixer(0x1300, j); /* Turn Off MIC switch on mixer right */
1578 ixj_mixer(0x1501, j); /* Turn On Mono1 switch on mixer right */
1579 ixj_mixer(0x0E80, j); /*Mic mute */
1580 ixj_mixer(0x0F00, j); /* Set mono out (SLIC) to 0dB */
1581 ixj_mixer(0x0080, j); /* Mute Master Left volume */
1582 ixj_mixer(0x0180, j); /* Mute Master Right volume */
1583 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
1584 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
1585 break;
1586 case QTI_PHONEJACK:
1587 j->gpio.bytes.high = 0x0B;
1588 j->gpio.bits.gpio6 = 0;
1589 j->gpio.bits.gpio7 = 0;
1590 ixj_WriteDSPCommand(j->gpio.word, j);
1591 break;
1593 break;
1594 case PORT_PSTN:
1595 if (j->cardtype == QTI_LINEJACK) {
1596 ixj_WriteDSPCommand(0xC534, j); /* Write CODEC config to Software Control Register */
1598 j->pld_slicw.bits.rly3 = 0;
1599 j->pld_slicw.bits.rly1 = 1;
1600 j->pld_slicw.bits.spken = 0;
1601 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1602 j->port = PORT_PSTN;
1603 } else {
1604 return 4;
1606 break;
1607 case PORT_SPEAKER:
1608 j->port = PORT_SPEAKER;
1609 switch (j->cardtype) {
1610 case QTI_PHONECARD:
1611 if (j->flags.pcmciasct) {
1612 SLIC_SetState(PLD_SLIC_STATE_OC, j);
1614 break;
1615 case QTI_PHONEJACK_PCI:
1616 j->pld_slicw.pcib.mic = 1;
1617 j->pld_slicw.pcib.spk = 1;
1618 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1619 break;
1620 case QTI_LINEJACK:
1621 ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */
1622 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to
1623 Software Control Register */
1624 return 2;
1625 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
1627 outb(j->pld_scrw.byte, j->XILINXbase);
1628 j->pld_clock.byte = 0;
1629 outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1630 j->pld_slicw.bits.rly1 = 1;
1631 j->pld_slicw.bits.spken = 1;
1632 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1633 ixj_mixer(0x1201, j); /* Turn On MIC switch on mixer left */
1634 ixj_mixer(0x1400, j); /* Turn Off Mono1 switch on mixer left */
1635 ixj_mixer(0x1301, j); /* Turn On MIC switch on mixer right */
1636 ixj_mixer(0x1500, j); /* Turn Off Mono1 switch on mixer right */
1637 ixj_mixer(0x0E06, j); /*Mic un-mute 0dB */
1638 ixj_mixer(0x0F80, j); /* Mute mono out (SLIC) */
1639 ixj_mixer(0x0000, j); /* Set Master Left volume to 0dB */
1640 ixj_mixer(0x0100, j); /* Set Master Right volume to 0dB */
1641 break;
1642 case QTI_PHONEJACK:
1643 j->gpio.bytes.high = 0x0B;
1644 j->gpio.bits.gpio6 = 0;
1645 j->gpio.bits.gpio7 = 1;
1646 ixj_WriteDSPCommand(j->gpio.word, j);
1647 break;
1649 break;
1650 case PORT_HANDSET:
1651 if (j->cardtype != QTI_PHONEJACK) {
1652 return 5;
1653 } else {
1654 j->gpio.bytes.high = 0x0B;
1655 j->gpio.bits.gpio6 = 1;
1656 j->gpio.bits.gpio7 = 0;
1657 ixj_WriteDSPCommand(j->gpio.word, j);
1658 j->port = PORT_HANDSET;
1660 break;
1661 default:
1662 return 6;
1663 break;
1665 return 0;
1668 static int ixj_set_pots(IXJ *j, int arg)
1670 if (j->cardtype == QTI_LINEJACK) {
1671 if (arg) {
1672 if (j->port == PORT_PSTN) {
1673 j->pld_slicw.bits.rly1 = 0;
1674 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1675 j->flags.pots_pstn = 1;
1676 return 1;
1677 } else {
1678 j->flags.pots_pstn = 0;
1679 return 0;
1681 } else {
1682 j->pld_slicw.bits.rly1 = 1;
1683 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1684 j->flags.pots_pstn = 0;
1685 return 1;
1687 } else {
1688 return 0;
1692 static void ixj_ring_on(IXJ *j)
1694 if (j->dsp.low == 0x20) /* Internet PhoneJACK */
1696 if (ixjdebug & 0x0004)
1697 printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
1699 j->gpio.bytes.high = 0x0B;
1700 j->gpio.bytes.low = 0x00;
1701 j->gpio.bits.gpio1 = 1;
1702 j->gpio.bits.gpio2 = 1;
1703 j->gpio.bits.gpio5 = 0;
1704 ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring signal */
1705 } else /* Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI */
1707 if (ixjdebug & 0x0004)
1708 printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
1710 SLIC_SetState(PLD_SLIC_STATE_RINGING, j);
1714 static int ixj_siadc(IXJ *j, int val)
1716 if(j->cardtype == QTI_PHONECARD){
1717 if(j->flags.pcmciascp){
1718 if(val == -1)
1719 return j->siadc.bits.rxg;
1721 if(val < 0 || val > 0x1F)
1722 return -1;
1724 j->siadc.bits.hom = 0; /* Handset Out Mute */
1725 j->siadc.bits.lom = 0; /* Line Out Mute */
1726 j->siadc.bits.rxg = val; /*(0xC000 - 0x41C8) / 0x4EF; RX PGA Gain */
1727 j->psccr.bits.addr = 6; /* R/W Smart Cable Register Address */
1728 j->psccr.bits.rw = 0; /* Read / Write flag */
1729 j->psccr.bits.dev = 0;
1730 outb(j->siadc.byte, j->XILINXbase + 0x00);
1731 outb(j->psccr.byte, j->XILINXbase + 0x01);
1732 ixj_PCcontrol_wait(j);
1733 return j->siadc.bits.rxg;
1736 return -1;
1739 static int ixj_sidac(IXJ *j, int val)
1741 if(j->cardtype == QTI_PHONECARD){
1742 if(j->flags.pcmciascp){
1743 if(val == -1)
1744 return j->sidac.bits.txg;
1746 if(val < 0 || val > 0x1F)
1747 return -1;
1749 j->sidac.bits.srm = 1; /* Speaker Right Mute */
1750 j->sidac.bits.slm = 1; /* Speaker Left Mute */
1751 j->sidac.bits.txg = val; /* (0xC000 - 0x45E4) / 0x5D3; TX PGA Gain */
1752 j->psccr.bits.addr = 7; /* R/W Smart Cable Register Address */
1753 j->psccr.bits.rw = 0; /* Read / Write flag */
1754 j->psccr.bits.dev = 0;
1755 outb(j->sidac.byte, j->XILINXbase + 0x00);
1756 outb(j->psccr.byte, j->XILINXbase + 0x01);
1757 ixj_PCcontrol_wait(j);
1758 return j->sidac.bits.txg;
1761 return -1;
1764 static int ixj_pcmcia_cable_check(IXJ *j)
1766 j->pccr1.byte = inb_p(j->XILINXbase + 0x03);
1767 if (!j->flags.pcmciastate) {
1768 j->pccr2.byte = inb_p(j->XILINXbase + 0x02);
1769 if (j->pccr1.bits.drf || j->pccr2.bits.rstc) {
1770 j->flags.pcmciastate = 4;
1771 return 0;
1773 if (j->pccr1.bits.ed) {
1774 j->pccr1.bits.ed = 0;
1775 j->psccr.bits.dev = 3;
1776 j->psccr.bits.rw = 1;
1777 outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
1778 ixj_PCcontrol_wait(j);
1779 j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
1780 j->pslic.bits.led2 = j->pslic.bits.det ? 1 : 0;
1781 j->psccr.bits.dev = 3;
1782 j->psccr.bits.rw = 0;
1783 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
1784 ixj_PCcontrol_wait(j);
1785 return j->pslic.bits.led2 ? 1 : 0;
1786 } else if (j->flags.pcmciasct) {
1787 return j->r_hook;
1788 } else {
1789 return 1;
1791 } else if (j->flags.pcmciastate == 4) {
1792 if (!j->pccr1.bits.drf) {
1793 j->flags.pcmciastate = 3;
1795 return 0;
1796 } else if (j->flags.pcmciastate == 3) {
1797 j->pccr2.bits.pwr = 0;
1798 j->pccr2.bits.rstc = 1;
1799 outb(j->pccr2.byte, j->XILINXbase + 0x02);
1800 j->checkwait = jiffies + (hertz * 2);
1801 j->flags.incheck = 1;
1802 j->flags.pcmciastate = 2;
1803 return 0;
1804 } else if (j->flags.pcmciastate == 2) {
1805 if (j->flags.incheck) {
1806 if (time_before(jiffies, j->checkwait)) {
1807 return 0;
1808 } else {
1809 j->flags.incheck = 0;
1812 j->pccr2.bits.pwr = 0;
1813 j->pccr2.bits.rstc = 0;
1814 outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1815 j->flags.pcmciastate = 1;
1816 return 0;
1817 } else if (j->flags.pcmciastate == 1) {
1818 j->flags.pcmciastate = 0;
1819 if (!j->pccr1.bits.drf) {
1820 j->psccr.bits.dev = 3;
1821 j->psccr.bits.rw = 1;
1822 outb_p(j->psccr.byte, j->XILINXbase + 0x01);
1823 ixj_PCcontrol_wait(j);
1824 j->flags.pcmciascp = 1; /* Set Cable Present Flag */
1826 j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03; /* Get Cable Type */
1828 if (j->flags.pcmciasct == 3) {
1829 j->flags.pcmciastate = 4;
1830 return 0;
1831 } else if (j->flags.pcmciasct == 0) {
1832 j->pccr2.bits.pwr = 1;
1833 j->pccr2.bits.rstc = 0;
1834 outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1835 j->port = PORT_SPEAKER;
1836 } else {
1837 j->port = PORT_POTS;
1839 j->sic1.bits.cpd = 0; /* Chip Power Down */
1840 j->sic1.bits.mpd = 0; /* MIC Bias Power Down */
1841 j->sic1.bits.hpd = 0; /* Handset Bias Power Down */
1842 j->sic1.bits.lpd = 0; /* Line Bias Power Down */
1843 j->sic1.bits.spd = 1; /* Speaker Drive Power Down */
1844 j->psccr.bits.addr = 1; /* R/W Smart Cable Register Address */
1845 j->psccr.bits.rw = 0; /* Read / Write flag */
1846 j->psccr.bits.dev = 0;
1847 outb(j->sic1.byte, j->XILINXbase + 0x00);
1848 outb(j->psccr.byte, j->XILINXbase + 0x01);
1849 ixj_PCcontrol_wait(j);
1851 j->sic2.bits.al = 0; /* Analog Loopback DAC analog -> ADC analog */
1852 j->sic2.bits.dl2 = 0; /* Digital Loopback DAC -> ADC one bit */
1853 j->sic2.bits.dl1 = 0; /* Digital Loopback ADC -> DAC one bit */
1854 j->sic2.bits.pll = 0; /* 1 = div 10, 0 = div 5 */
1855 j->sic2.bits.hpd = 0; /* HPF disable */
1856 j->psccr.bits.addr = 2; /* R/W Smart Cable Register Address */
1857 j->psccr.bits.rw = 0; /* Read / Write flag */
1858 j->psccr.bits.dev = 0;
1859 outb(j->sic2.byte, j->XILINXbase + 0x00);
1860 outb(j->psccr.byte, j->XILINXbase + 0x01);
1861 ixj_PCcontrol_wait(j);
1863 j->psccr.bits.addr = 3; /* R/W Smart Cable Register Address */
1864 j->psccr.bits.rw = 0; /* Read / Write flag */
1865 j->psccr.bits.dev = 0;
1866 outb(0x00, j->XILINXbase + 0x00); /* PLL Divide N1 */
1867 outb(j->psccr.byte, j->XILINXbase + 0x01);
1868 ixj_PCcontrol_wait(j);
1870 j->psccr.bits.addr = 4; /* R/W Smart Cable Register Address */
1871 j->psccr.bits.rw = 0; /* Read / Write flag */
1872 j->psccr.bits.dev = 0;
1873 outb(0x09, j->XILINXbase + 0x00); /* PLL Multiply M1 */
1874 outb(j->psccr.byte, j->XILINXbase + 0x01);
1875 ixj_PCcontrol_wait(j);
1877 j->sirxg.bits.lig = 1; /* Line In Gain */
1878 j->sirxg.bits.lim = 1; /* Line In Mute */
1879 j->sirxg.bits.mcg = 0; /* MIC In Gain was 3 */
1880 j->sirxg.bits.mcm = 0; /* MIC In Mute */
1881 j->sirxg.bits.him = 0; /* Handset In Mute */
1882 j->sirxg.bits.iir = 1; /* IIR */
1883 j->psccr.bits.addr = 5; /* R/W Smart Cable Register Address */
1884 j->psccr.bits.rw = 0; /* Read / Write flag */
1885 j->psccr.bits.dev = 0;
1886 outb(j->sirxg.byte, j->XILINXbase + 0x00);
1887 outb(j->psccr.byte, j->XILINXbase + 0x01);
1888 ixj_PCcontrol_wait(j);
1890 ixj_siadc(j, 0x17);
1891 ixj_sidac(j, 0x1D);
1893 j->siaatt.bits.sot = 0;
1894 j->psccr.bits.addr = 9; /* R/W Smart Cable Register Address */
1895 j->psccr.bits.rw = 0; /* Read / Write flag */
1896 j->psccr.bits.dev = 0;
1897 outb(j->siaatt.byte, j->XILINXbase + 0x00);
1898 outb(j->psccr.byte, j->XILINXbase + 0x01);
1899 ixj_PCcontrol_wait(j);
1901 if (j->flags.pcmciasct == 1 && !j->readers && !j->writers) {
1902 j->psccr.byte = j->pslic.byte = 0;
1903 j->pslic.bits.powerdown = 1;
1904 j->psccr.bits.dev = 3;
1905 j->psccr.bits.rw = 0;
1906 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
1907 ixj_PCcontrol_wait(j);
1910 return 0;
1911 } else {
1912 j->flags.pcmciascp = 0;
1913 return 0;
1915 return 0;
1918 static int ixj_hookstate(IXJ *j)
1920 int fOffHook = 0;
1922 switch (j->cardtype) {
1923 case QTI_PHONEJACK:
1924 ixj_gpio_read(j);
1925 fOffHook = j->gpio.bits.gpio3read ? 1 : 0;
1926 break;
1927 case QTI_LINEJACK:
1928 case QTI_PHONEJACK_LITE:
1929 case QTI_PHONEJACK_PCI:
1930 SLIC_GetState(j);
1931 if(j->cardtype == QTI_LINEJACK && j->flags.pots_pstn == 1 && (j->readers || j->writers)) {
1932 fOffHook = j->pld_slicr.bits.potspstn ? 1 : 0;
1933 if(fOffHook != j->p_hook) {
1934 if(!j->checkwait) {
1935 j->checkwait = jiffies;
1937 if(time_before(jiffies, j->checkwait + 2)) {
1938 fOffHook ^= 1;
1939 } else {
1940 j->checkwait = 0;
1942 j->p_hook = fOffHook;
1943 printk("IXJ : /dev/phone%d pots-pstn hookstate check %d at %ld\n", j->board, fOffHook, jiffies);
1945 } else {
1946 if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE ||
1947 j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) {
1948 if (j->flags.ringing || j->flags.cringing) {
1949 if (!in_interrupt()) {
1950 msleep(20);
1952 SLIC_GetState(j);
1953 if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) {
1954 ixj_ring_on(j);
1957 if (j->cardtype == QTI_PHONEJACK_PCI) {
1958 j->pld_scrr.byte = inb_p(j->XILINXbase);
1959 fOffHook = j->pld_scrr.pcib.det ? 1 : 0;
1960 } else
1961 fOffHook = j->pld_slicr.bits.det ? 1 : 0;
1964 break;
1965 case QTI_PHONECARD:
1966 fOffHook = ixj_pcmcia_cable_check(j);
1967 break;
1969 if (j->r_hook != fOffHook) {
1970 j->r_hook = fOffHook;
1971 if (j->port == PORT_SPEAKER || j->port == PORT_HANDSET) { // || (j->port == PORT_PSTN && j->flags.pots_pstn == 0)) {
1972 j->ex.bits.hookstate = 1;
1973 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1974 } else if (!fOffHook) {
1975 j->flash_end = jiffies + ((60 * hertz) / 100);
1978 if (fOffHook) {
1979 if(time_before(jiffies, j->flash_end)) {
1980 j->ex.bits.flash = 1;
1981 j->flash_end = 0;
1982 ixj_kill_fasync(j, SIG_FLASH, POLL_IN);
1984 } else {
1985 if(time_before(jiffies, j->flash_end)) {
1986 fOffHook = 1;
1990 if (j->port == PORT_PSTN && j->daa_mode == SOP_PU_CONVERSATION)
1991 fOffHook |= 2;
1993 if (j->port == PORT_SPEAKER) {
1994 if(j->cardtype == QTI_PHONECARD) {
1995 if(j->flags.pcmciascp && j->flags.pcmciasct) {
1996 fOffHook |= 2;
1998 } else {
1999 fOffHook |= 2;
2003 if (j->port == PORT_HANDSET)
2004 fOffHook |= 2;
2006 return fOffHook;
2009 static void ixj_ring_off(IXJ *j)
2011 if (j->dsp.low == 0x20) /* Internet PhoneJACK */
2013 if (ixjdebug & 0x0004)
2014 printk(KERN_INFO "IXJ Ring Off\n");
2015 j->gpio.bytes.high = 0x0B;
2016 j->gpio.bytes.low = 0x00;
2017 j->gpio.bits.gpio1 = 0;
2018 j->gpio.bits.gpio2 = 1;
2019 j->gpio.bits.gpio5 = 0;
2020 ixj_WriteDSPCommand(j->gpio.word, j);
2021 } else /* Internet LineJACK */
2023 if (ixjdebug & 0x0004)
2024 printk(KERN_INFO "IXJ Ring Off\n");
2026 if(!j->flags.cidplay)
2027 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
2029 SLIC_GetState(j);
2033 static void ixj_ring_start(IXJ *j)
2035 j->flags.cringing = 1;
2036 if (ixjdebug & 0x0004)
2037 printk(KERN_INFO "IXJ Cadence Ringing Start /dev/phone%d\n", j->board);
2038 if (ixj_hookstate(j) & 1) {
2039 if (j->port == PORT_POTS)
2040 ixj_ring_off(j);
2041 j->flags.cringing = 0;
2042 if (ixjdebug & 0x0004)
2043 printk(KERN_INFO "IXJ Cadence Ringing Stopped /dev/phone%d off hook\n", j->board);
2044 } else if(j->cadence_f[5].enable && (!j->cadence_f[5].en_filter)) {
2045 j->ring_cadence_jif = jiffies;
2046 j->flags.cidsent = j->flags.cidring = 0;
2047 j->cadence_f[5].state = 0;
2048 if(j->cadence_f[5].on1)
2049 ixj_ring_on(j);
2050 } else {
2051 j->ring_cadence_jif = jiffies;
2052 j->ring_cadence_t = 15;
2053 if (j->ring_cadence & 1 << j->ring_cadence_t) {
2054 ixj_ring_on(j);
2055 } else {
2056 ixj_ring_off(j);
2058 j->flags.cidsent = j->flags.cidring = j->flags.firstring = 0;
2062 static int ixj_ring(IXJ *j)
2064 char cntr;
2065 unsigned long jif;
2067 j->flags.ringing = 1;
2068 if (ixj_hookstate(j) & 1) {
2069 ixj_ring_off(j);
2070 j->flags.ringing = 0;
2071 return 1;
2073 for (cntr = 0; cntr < j->maxrings; cntr++) {
2074 jif = jiffies + (1 * hertz);
2075 ixj_ring_on(j);
2076 while (time_before(jiffies, jif)) {
2077 if (ixj_hookstate(j) & 1) {
2078 ixj_ring_off(j);
2079 j->flags.ringing = 0;
2080 return 1;
2082 schedule_timeout_interruptible(1);
2083 if (signal_pending(current))
2084 break;
2086 jif = jiffies + (3 * hertz);
2087 ixj_ring_off(j);
2088 while (time_before(jiffies, jif)) {
2089 if (ixj_hookstate(j) & 1) {
2090 msleep(10);
2091 if (ixj_hookstate(j) & 1) {
2092 j->flags.ringing = 0;
2093 return 1;
2096 schedule_timeout_interruptible(1);
2097 if (signal_pending(current))
2098 break;
2101 ixj_ring_off(j);
2102 j->flags.ringing = 0;
2103 return 0;
2106 static int ixj_open(struct phone_device *p, struct file *file_p)
2108 IXJ *j = get_ixj(p->board);
2109 file_p->private_data = j;
2111 if (!j->DSPbase)
2112 return -ENODEV;
2114 if (file_p->f_mode & FMODE_READ) {
2115 if(!j->readers) {
2116 j->readers++;
2117 } else {
2118 return -EBUSY;
2122 if (file_p->f_mode & FMODE_WRITE) {
2123 if(!j->writers) {
2124 j->writers++;
2125 } else {
2126 if (file_p->f_mode & FMODE_READ){
2127 j->readers--;
2129 return -EBUSY;
2133 if (j->cardtype == QTI_PHONECARD) {
2134 j->pslic.bits.powerdown = 0;
2135 j->psccr.bits.dev = 3;
2136 j->psccr.bits.rw = 0;
2137 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
2138 ixj_PCcontrol_wait(j);
2141 j->flags.cidplay = 0;
2142 j->flags.cidcw_ack = 0;
2144 if (ixjdebug & 0x0002)
2145 printk(KERN_INFO "Opening board %d\n", p->board);
2147 j->framesread = j->frameswritten = 0;
2148 return 0;
2151 static int ixj_release(struct inode *inode, struct file *file_p)
2153 IXJ_TONE ti;
2154 int cnt;
2155 IXJ *j = file_p->private_data;
2156 int board = j->p.board;
2159 * Set up locks to ensure that only one process is talking to the DSP at a time.
2160 * This is necessary to keep the DSP from locking up.
2162 while(test_and_set_bit(board, (void *)&j->busyflags) != 0)
2163 schedule_timeout_interruptible(1);
2164 if (ixjdebug & 0x0002)
2165 printk(KERN_INFO "Closing board %d\n", NUM(inode));
2167 if (j->cardtype == QTI_PHONECARD)
2168 ixj_set_port(j, PORT_SPEAKER);
2169 else
2170 ixj_set_port(j, PORT_POTS);
2172 aec_stop(j);
2173 ixj_play_stop(j);
2174 ixj_record_stop(j);
2175 set_play_volume(j, 0x100);
2176 set_rec_volume(j, 0x100);
2177 ixj_ring_off(j);
2179 /* Restore the tone table to default settings. */
2180 ti.tone_index = 10;
2181 ti.gain0 = 1;
2182 ti.freq0 = hz941;
2183 ti.gain1 = 0;
2184 ti.freq1 = hz1209;
2185 ixj_init_tone(j, &ti);
2186 ti.tone_index = 11;
2187 ti.gain0 = 1;
2188 ti.freq0 = hz941;
2189 ti.gain1 = 0;
2190 ti.freq1 = hz1336;
2191 ixj_init_tone(j, &ti);
2192 ti.tone_index = 12;
2193 ti.gain0 = 1;
2194 ti.freq0 = hz941;
2195 ti.gain1 = 0;
2196 ti.freq1 = hz1477;
2197 ixj_init_tone(j, &ti);
2198 ti.tone_index = 13;
2199 ti.gain0 = 1;
2200 ti.freq0 = hz800;
2201 ti.gain1 = 0;
2202 ti.freq1 = 0;
2203 ixj_init_tone(j, &ti);
2204 ti.tone_index = 14;
2205 ti.gain0 = 1;
2206 ti.freq0 = hz1000;
2207 ti.gain1 = 0;
2208 ti.freq1 = 0;
2209 ixj_init_tone(j, &ti);
2210 ti.tone_index = 15;
2211 ti.gain0 = 1;
2212 ti.freq0 = hz1250;
2213 ti.gain1 = 0;
2214 ti.freq1 = 0;
2215 ixj_init_tone(j, &ti);
2216 ti.tone_index = 16;
2217 ti.gain0 = 1;
2218 ti.freq0 = hz950;
2219 ti.gain1 = 0;
2220 ti.freq1 = 0;
2221 ixj_init_tone(j, &ti);
2222 ti.tone_index = 17;
2223 ti.gain0 = 1;
2224 ti.freq0 = hz1100;
2225 ti.gain1 = 0;
2226 ti.freq1 = 0;
2227 ixj_init_tone(j, &ti);
2228 ti.tone_index = 18;
2229 ti.gain0 = 1;
2230 ti.freq0 = hz1400;
2231 ti.gain1 = 0;
2232 ti.freq1 = 0;
2233 ixj_init_tone(j, &ti);
2234 ti.tone_index = 19;
2235 ti.gain0 = 1;
2236 ti.freq0 = hz1500;
2237 ti.gain1 = 0;
2238 ti.freq1 = 0;
2239 ixj_init_tone(j, &ti);
2240 ti.tone_index = 20;
2241 ti.gain0 = 1;
2242 ti.freq0 = hz1600;
2243 ti.gain1 = 0;
2244 ti.freq1 = 0;
2245 ixj_init_tone(j, &ti);
2246 ti.tone_index = 21;
2247 ti.gain0 = 1;
2248 ti.freq0 = hz1800;
2249 ti.gain1 = 0;
2250 ti.freq1 = 0;
2251 ixj_init_tone(j, &ti);
2252 ti.tone_index = 22;
2253 ti.gain0 = 1;
2254 ti.freq0 = hz2100;
2255 ti.gain1 = 0;
2256 ti.freq1 = 0;
2257 ixj_init_tone(j, &ti);
2258 ti.tone_index = 23;
2259 ti.gain0 = 1;
2260 ti.freq0 = hz1300;
2261 ti.gain1 = 0;
2262 ti.freq1 = 0;
2263 ixj_init_tone(j, &ti);
2264 ti.tone_index = 24;
2265 ti.gain0 = 1;
2266 ti.freq0 = hz2450;
2267 ti.gain1 = 0;
2268 ti.freq1 = 0;
2269 ixj_init_tone(j, &ti);
2270 ti.tone_index = 25;
2271 ti.gain0 = 1;
2272 ti.freq0 = hz350;
2273 ti.gain1 = 0;
2274 ti.freq1 = hz440;
2275 ixj_init_tone(j, &ti);
2276 ti.tone_index = 26;
2277 ti.gain0 = 1;
2278 ti.freq0 = hz440;
2279 ti.gain1 = 0;
2280 ti.freq1 = hz480;
2281 ixj_init_tone(j, &ti);
2282 ti.tone_index = 27;
2283 ti.gain0 = 1;
2284 ti.freq0 = hz480;
2285 ti.gain1 = 0;
2286 ti.freq1 = hz620;
2287 ixj_init_tone(j, &ti);
2289 set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */
2291 set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */
2293 j->ex.bits.dtmf_ready = 0;
2294 j->dtmf_state = 0;
2295 j->dtmf_wp = j->dtmf_rp = 0;
2296 j->rec_mode = j->play_mode = -1;
2297 j->flags.ringing = 0;
2298 j->maxrings = MAXRINGS;
2299 j->ring_cadence = USA_RING_CADENCE;
2300 if(j->cadence_f[5].enable) {
2301 j->cadence_f[5].enable = j->cadence_f[5].en_filter = j->cadence_f[5].state = 0;
2303 j->drybuffer = 0;
2304 j->winktime = 320;
2305 j->flags.dtmf_oob = 0;
2306 for (cnt = 0; cnt < 4; cnt++)
2307 j->cadence_f[cnt].enable = 0;
2309 idle(j);
2311 if(j->cardtype == QTI_PHONECARD) {
2312 SLIC_SetState(PLD_SLIC_STATE_OC, j);
2315 if (file_p->f_mode & FMODE_READ)
2316 j->readers--;
2317 if (file_p->f_mode & FMODE_WRITE)
2318 j->writers--;
2320 if (j->read_buffer && !j->readers) {
2321 kfree(j->read_buffer);
2322 j->read_buffer = NULL;
2323 j->read_buffer_size = 0;
2325 if (j->write_buffer && !j->writers) {
2326 kfree(j->write_buffer);
2327 j->write_buffer = NULL;
2328 j->write_buffer_size = 0;
2330 j->rec_codec = j->play_codec = 0;
2331 j->rec_frame_size = j->play_frame_size = 0;
2332 j->flags.cidsent = j->flags.cidring = 0;
2333 ixj_fasync(-1, file_p, 0); /* remove from list of async notification */
2335 if(j->cardtype == QTI_LINEJACK && !j->readers && !j->writers) {
2336 ixj_set_port(j, PORT_PSTN);
2337 daa_set_mode(j, SOP_PU_SLEEP);
2338 ixj_set_pots(j, 1);
2340 ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
2342 /* Set up the default signals for events */
2343 for (cnt = 0; cnt < 35; cnt++)
2344 j->ixj_signals[cnt] = SIGIO;
2346 /* Set the excetion signal enable flags */
2347 j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
2348 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 =
2349 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;
2351 file_p->private_data = NULL;
2352 clear_bit(board, &j->busyflags);
2353 return 0;
2356 static int read_filters(IXJ *j)
2358 unsigned short fc, cnt, trg;
2359 int var;
2361 trg = 0;
2362 if (ixj_WriteDSPCommand(0x5144, j)) {
2363 if(ixjdebug & 0x0001) {
2364 printk(KERN_INFO "Read Frame Counter failed!\n");
2366 return -1;
2368 fc = j->ssr.high << 8 | j->ssr.low;
2369 if (fc == j->frame_count)
2370 return 1;
2372 j->frame_count = fc;
2374 if (j->dtmf_proc)
2375 return 1;
2377 var = 10;
2379 for (cnt = 0; cnt < 4; cnt++) {
2380 if (ixj_WriteDSPCommand(0x5154 + cnt, j)) {
2381 if(ixjdebug & 0x0001) {
2382 printk(KERN_INFO "Select Filter %d failed!\n", cnt);
2384 return -1;
2386 if (ixj_WriteDSPCommand(0x515C, j)) {
2387 if(ixjdebug & 0x0001) {
2388 printk(KERN_INFO "Read Filter History %d failed!\n", cnt);
2390 return -1;
2392 j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low;
2394 if (j->cadence_f[cnt].enable) {
2395 if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) {
2396 if (j->cadence_f[cnt].state == 0) {
2397 j->cadence_f[cnt].state = 1;
2398 j->cadence_f[cnt].on1min = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 - var)) / 10000));
2399 j->cadence_f[cnt].on1dot = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100)) / 10000));
2400 j->cadence_f[cnt].on1max = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 + var)) / 10000));
2401 } else if (j->cadence_f[cnt].state == 2 &&
2402 (time_after(jiffies, j->cadence_f[cnt].off1min) &&
2403 time_before(jiffies, j->cadence_f[cnt].off1max))) {
2404 if (j->cadence_f[cnt].on2) {
2405 j->cadence_f[cnt].state = 3;
2406 j->cadence_f[cnt].on2min = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 - var)) / 10000));
2407 j->cadence_f[cnt].on2dot = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100)) / 10000));
2408 j->cadence_f[cnt].on2max = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 + var)) / 10000));
2409 } else {
2410 j->cadence_f[cnt].state = 7;
2412 } else if (j->cadence_f[cnt].state == 4 &&
2413 (time_after(jiffies, j->cadence_f[cnt].off2min) &&
2414 time_before(jiffies, j->cadence_f[cnt].off2max))) {
2415 if (j->cadence_f[cnt].on3) {
2416 j->cadence_f[cnt].state = 5;
2417 j->cadence_f[cnt].on3min = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 - var)) / 10000));
2418 j->cadence_f[cnt].on3dot = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100)) / 10000));
2419 j->cadence_f[cnt].on3max = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 + var)) / 10000));
2420 } else {
2421 j->cadence_f[cnt].state = 7;
2423 } else {
2424 j->cadence_f[cnt].state = 0;
2426 } else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) {
2427 if (j->cadence_f[cnt].state == 1) {
2428 if(!j->cadence_f[cnt].on1) {
2429 j->cadence_f[cnt].state = 7;
2430 } else if((time_after(jiffies, j->cadence_f[cnt].on1min) &&
2431 time_before(jiffies, j->cadence_f[cnt].on1max))) {
2432 if(j->cadence_f[cnt].off1) {
2433 j->cadence_f[cnt].state = 2;
2434 j->cadence_f[cnt].off1min = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 - var)) / 10000));
2435 j->cadence_f[cnt].off1dot = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100)) / 10000));
2436 j->cadence_f[cnt].off1max = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 + var)) / 10000));
2437 } else {
2438 j->cadence_f[cnt].state = 7;
2440 } else {
2441 j->cadence_f[cnt].state = 0;
2443 } else if (j->cadence_f[cnt].state == 3) {
2444 if((time_after(jiffies, j->cadence_f[cnt].on2min) &&
2445 time_before(jiffies, j->cadence_f[cnt].on2max))) {
2446 if(j->cadence_f[cnt].off2) {
2447 j->cadence_f[cnt].state = 4;
2448 j->cadence_f[cnt].off2min = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 - var)) / 10000));
2449 j->cadence_f[cnt].off2dot = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100)) / 10000));
2450 j->cadence_f[cnt].off2max = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 + var)) / 10000));
2451 } else {
2452 j->cadence_f[cnt].state = 7;
2454 } else {
2455 j->cadence_f[cnt].state = 0;
2457 } else if (j->cadence_f[cnt].state == 5) {
2458 if ((time_after(jiffies, j->cadence_f[cnt].on3min) &&
2459 time_before(jiffies, j->cadence_f[cnt].on3max))) {
2460 if(j->cadence_f[cnt].off3) {
2461 j->cadence_f[cnt].state = 6;
2462 j->cadence_f[cnt].off3min = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 - var)) / 10000));
2463 j->cadence_f[cnt].off3dot = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100)) / 10000));
2464 j->cadence_f[cnt].off3max = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 + var)) / 10000));
2465 } else {
2466 j->cadence_f[cnt].state = 7;
2468 } else {
2469 j->cadence_f[cnt].state = 0;
2471 } else {
2472 j->cadence_f[cnt].state = 0;
2474 } else {
2475 switch(j->cadence_f[cnt].state) {
2476 case 1:
2477 if(time_after(jiffies, j->cadence_f[cnt].on1dot) &&
2478 !j->cadence_f[cnt].off1 &&
2479 !j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 &&
2480 !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2481 j->cadence_f[cnt].state = 7;
2483 break;
2484 case 3:
2485 if(time_after(jiffies, j->cadence_f[cnt].on2dot) &&
2486 !j->cadence_f[cnt].off2 &&
2487 !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2488 j->cadence_f[cnt].state = 7;
2490 break;
2491 case 5:
2492 if(time_after(jiffies, j->cadence_f[cnt].on3dot) &&
2493 !j->cadence_f[cnt].off3) {
2494 j->cadence_f[cnt].state = 7;
2496 break;
2500 if (ixjdebug & 0x0040) {
2501 printk(KERN_INFO "IXJ Tone Cadence state = %d /dev/phone%d at %ld\n", j->cadence_f[cnt].state, j->board, jiffies);
2502 switch(j->cadence_f[cnt].state) {
2503 case 0:
2504 printk(KERN_INFO "IXJ /dev/phone%d No Tone detected\n", j->board);
2505 break;
2506 case 1:
2507 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %u %ld - %ld - %ld\n", j->board,
2508 j->cadence_f[cnt].on1, j->cadence_f[cnt].on1min, j->cadence_f[cnt].on1dot, j->cadence_f[cnt].on1max);
2509 break;
2510 case 2:
2511 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off1min,
2512 j->cadence_f[cnt].off1max);
2513 break;
2514 case 3:
2515 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on2min,
2516 j->cadence_f[cnt].on2max);
2517 break;
2518 case 4:
2519 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off2min,
2520 j->cadence_f[cnt].off2max);
2521 break;
2522 case 5:
2523 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on3min,
2524 j->cadence_f[cnt].on3max);
2525 break;
2526 case 6:
2527 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off3min,
2528 j->cadence_f[cnt].off3max);
2529 break;
2533 if (j->cadence_f[cnt].state == 7) {
2534 j->cadence_f[cnt].state = 0;
2535 if (j->cadence_f[cnt].enable == 1)
2536 j->cadence_f[cnt].enable = 0;
2537 switch (cnt) {
2538 case 0:
2539 if(ixjdebug & 0x0020) {
2540 printk(KERN_INFO "Filter Cadence 0 triggered %ld\n", jiffies);
2542 j->ex.bits.fc0 = 1;
2543 ixj_kill_fasync(j, SIG_FC0, POLL_IN);
2544 break;
2545 case 1:
2546 if(ixjdebug & 0x0020) {
2547 printk(KERN_INFO "Filter Cadence 1 triggered %ld\n", jiffies);
2549 j->ex.bits.fc1 = 1;
2550 ixj_kill_fasync(j, SIG_FC1, POLL_IN);
2551 break;
2552 case 2:
2553 if(ixjdebug & 0x0020) {
2554 printk(KERN_INFO "Filter Cadence 2 triggered %ld\n", jiffies);
2556 j->ex.bits.fc2 = 1;
2557 ixj_kill_fasync(j, SIG_FC2, POLL_IN);
2558 break;
2559 case 3:
2560 if(ixjdebug & 0x0020) {
2561 printk(KERN_INFO "Filter Cadence 3 triggered %ld\n", jiffies);
2563 j->ex.bits.fc3 = 1;
2564 ixj_kill_fasync(j, SIG_FC3, POLL_IN);
2565 break;
2568 if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) ||
2569 (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) {
2570 if((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12))) {
2571 trg = 1;
2572 } else if((j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3))) {
2573 trg = 0;
2575 switch (cnt) {
2576 case 0:
2577 if(ixjdebug & 0x0020) {
2578 printk(KERN_INFO "Filter 0 triggered %d at %ld\n", trg, jiffies);
2580 j->ex.bits.f0 = 1;
2581 ixj_kill_fasync(j, SIG_F0, POLL_IN);
2582 break;
2583 case 1:
2584 if(ixjdebug & 0x0020) {
2585 printk(KERN_INFO "Filter 1 triggered %d at %ld\n", trg, jiffies);
2587 j->ex.bits.f1 = 1;
2588 ixj_kill_fasync(j, SIG_F1, POLL_IN);
2589 break;
2590 case 2:
2591 if(ixjdebug & 0x0020) {
2592 printk(KERN_INFO "Filter 2 triggered %d at %ld\n", trg, jiffies);
2594 j->ex.bits.f2 = 1;
2595 ixj_kill_fasync(j, SIG_F2, POLL_IN);
2596 break;
2597 case 3:
2598 if(ixjdebug & 0x0020) {
2599 printk(KERN_INFO "Filter 3 triggered %d at %ld\n", trg, jiffies);
2601 j->ex.bits.f3 = 1;
2602 ixj_kill_fasync(j, SIG_F3, POLL_IN);
2603 break;
2607 return 0;
2610 static int LineMonitor(IXJ *j)
2612 if (j->dtmf_proc) {
2613 return -1;
2615 j->dtmf_proc = 1;
2617 if (ixj_WriteDSPCommand(0x7000, j)) /* Line Monitor */
2618 return -1;
2620 j->dtmf.bytes.high = j->ssr.high;
2621 j->dtmf.bytes.low = j->ssr.low;
2622 if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) {
2623 j->dtmf_state = 1;
2624 j->dtmf_current = j->dtmf.bits.digit;
2626 if (j->dtmf_state && !j->dtmf.bits.dtmf_valid) /* && j->dtmf_wp != j->dtmf_rp) */
2628 if(!j->cidcw_wait) {
2629 j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current;
2630 j->dtmf_wp++;
2631 if (j->dtmf_wp == 79)
2632 j->dtmf_wp = 0;
2633 j->ex.bits.dtmf_ready = 1;
2634 if(j->ex_sig.bits.dtmf_ready) {
2635 ixj_kill_fasync(j, SIG_DTMF_READY, POLL_IN);
2638 else if(j->dtmf_current == 0x00 || j->dtmf_current == 0x0D) {
2639 if(ixjdebug & 0x0020) {
2640 printk("IXJ phone%d saw CIDCW Ack DTMF %d from display at %ld\n", j->board, j->dtmf_current, jiffies);
2642 j->flags.cidcw_ack = 1;
2644 j->dtmf_state = 0;
2646 j->dtmf_proc = 0;
2648 return 0;
2651 /************************************************************************
2653 * Functions to allow alaw <-> ulaw conversions.
2655 ************************************************************************/
2657 static void ulaw2alaw(unsigned char *buff, unsigned long len)
2659 static unsigned char table_ulaw2alaw[] =
2661 0x2A, 0x2B, 0x28, 0x29, 0x2E, 0x2F, 0x2C, 0x2D,
2662 0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25,
2663 0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D,
2664 0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35,
2665 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 0x02,
2666 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x1A,
2667 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 0x12,
2668 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x6B,
2669 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 0x62, 0x63,
2670 0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x7B, 0x79,
2671 0x7E, 0x7F, 0x7C, 0x7D, 0x72, 0x73, 0x70, 0x71,
2672 0x76, 0x77, 0x74, 0x75, 0x4B, 0x49, 0x4F, 0x4D,
2673 0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45,
2674 0x5A, 0x5B, 0x58, 0x59, 0x5E, 0x5F, 0x5C, 0x5D,
2675 0x52, 0x52, 0x53, 0x53, 0x50, 0x50, 0x51, 0x51,
2676 0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, 0xD5,
2677 0xAA, 0xAB, 0xA8, 0xA9, 0xAE, 0xAF, 0xAC, 0xAD,
2678 0xA2, 0xA3, 0xA0, 0xA1, 0xA6, 0xA7, 0xA4, 0xA5,
2679 0xBA, 0xBB, 0xB8, 0xB9, 0xBE, 0xBF, 0xBC, 0xBD,
2680 0xB2, 0xB3, 0xB0, 0xB1, 0xB6, 0xB7, 0xB4, 0xB5,
2681 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 0x82,
2682 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 0x9A,
2683 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 0x92,
2684 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0xEB,
2685 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 0xE2, 0xE3,
2686 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 0xFB, 0xF9,
2687 0xFE, 0xFF, 0xFC, 0xFD, 0xF2, 0xF3, 0xF0, 0xF1,
2688 0xF6, 0xF7, 0xF4, 0xF5, 0xCB, 0xC9, 0xCF, 0xCD,
2689 0xC2, 0xC3, 0xC0, 0xC1, 0xC6, 0xC7, 0xC4, 0xC5,
2690 0xDA, 0xDB, 0xD8, 0xD9, 0xDE, 0xDF, 0xDC, 0xDD,
2691 0xD2, 0xD2, 0xD3, 0xD3, 0xD0, 0xD0, 0xD1, 0xD1,
2692 0xD6, 0xD6, 0xD7, 0xD7, 0xD4, 0xD4, 0xD5, 0xD5
2695 while (len--)
2697 *buff = table_ulaw2alaw[*(unsigned char *)buff];
2698 buff++;
2702 static void alaw2ulaw(unsigned char *buff, unsigned long len)
2704 static unsigned char table_alaw2ulaw[] =
2706 0x29, 0x2A, 0x27, 0x28, 0x2D, 0x2E, 0x2B, 0x2C,
2707 0x21, 0x22, 0x1F, 0x20, 0x25, 0x26, 0x23, 0x24,
2708 0x39, 0x3A, 0x37, 0x38, 0x3D, 0x3E, 0x3B, 0x3C,
2709 0x31, 0x32, 0x2F, 0x30, 0x35, 0x36, 0x33, 0x34,
2710 0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D,
2711 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05,
2712 0x1A, 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D,
2713 0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15,
2714 0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65,
2715 0x5D, 0x5D, 0x5C, 0x5C, 0x5F, 0x5F, 0x5E, 0x5E,
2716 0x74, 0x76, 0x70, 0x72, 0x7C, 0x7E, 0x78, 0x7A,
2717 0x6A, 0x6B, 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D,
2718 0x48, 0x49, 0x46, 0x47, 0x4C, 0x4D, 0x4A, 0x4B,
2719 0x40, 0x41, 0x3F, 0x3F, 0x44, 0x45, 0x42, 0x43,
2720 0x56, 0x57, 0x54, 0x55, 0x5A, 0x5B, 0x58, 0x59,
2721 0x4F, 0x4F, 0x4E, 0x4E, 0x52, 0x53, 0x50, 0x51,
2722 0xA9, 0xAA, 0xA7, 0xA8, 0xAD, 0xAE, 0xAB, 0xAC,
2723 0xA1, 0xA2, 0x9F, 0xA0, 0xA5, 0xA6, 0xA3, 0xA4,
2724 0xB9, 0xBA, 0xB7, 0xB8, 0xBD, 0xBE, 0xBB, 0xBC,
2725 0xB1, 0xB2, 0xAF, 0xB0, 0xB5, 0xB6, 0xB3, 0xB4,
2726 0x8A, 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D,
2727 0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85,
2728 0x9A, 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D,
2729 0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95,
2730 0xE2, 0xE3, 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5,
2731 0xDD, 0xDD, 0xDC, 0xDC, 0xDF, 0xDF, 0xDE, 0xDE,
2732 0xF4, 0xF6, 0xF0, 0xF2, 0xFC, 0xFE, 0xF8, 0xFA,
2733 0xEA, 0xEB, 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED,
2734 0xC8, 0xC9, 0xC6, 0xC7, 0xCC, 0xCD, 0xCA, 0xCB,
2735 0xC0, 0xC1, 0xBF, 0xBF, 0xC4, 0xC5, 0xC2, 0xC3,
2736 0xD6, 0xD7, 0xD4, 0xD5, 0xDA, 0xDB, 0xD8, 0xD9,
2737 0xCF, 0xCF, 0xCE, 0xCE, 0xD2, 0xD3, 0xD0, 0xD1
2740 while (len--)
2742 *buff = table_alaw2ulaw[*(unsigned char *)buff];
2743 buff++;
2747 static ssize_t ixj_read(struct file * file_p, char __user *buf, size_t length, loff_t * ppos)
2749 unsigned long i = *ppos;
2750 IXJ * j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
2752 DECLARE_WAITQUEUE(wait, current);
2754 if (j->flags.inread)
2755 return -EALREADY;
2757 j->flags.inread = 1;
2759 add_wait_queue(&j->read_q, &wait);
2760 set_current_state(TASK_INTERRUPTIBLE);
2761 mb();
2763 while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) {
2764 ++j->read_wait;
2765 if (file_p->f_flags & O_NONBLOCK) {
2766 set_current_state(TASK_RUNNING);
2767 remove_wait_queue(&j->read_q, &wait);
2768 j->flags.inread = 0;
2769 return -EAGAIN;
2771 if (!ixj_hookstate(j)) {
2772 set_current_state(TASK_RUNNING);
2773 remove_wait_queue(&j->read_q, &wait);
2774 j->flags.inread = 0;
2775 return 0;
2777 interruptible_sleep_on(&j->read_q);
2778 if (signal_pending(current)) {
2779 set_current_state(TASK_RUNNING);
2780 remove_wait_queue(&j->read_q, &wait);
2781 j->flags.inread = 0;
2782 return -EINTR;
2786 remove_wait_queue(&j->read_q, &wait);
2787 set_current_state(TASK_RUNNING);
2788 /* Don't ever copy more than the user asks */
2789 if(j->rec_codec == ALAW)
2790 ulaw2alaw(j->read_buffer, min(length, j->read_buffer_size));
2791 i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size));
2792 j->read_buffer_ready = 0;
2793 if (i) {
2794 j->flags.inread = 0;
2795 return -EFAULT;
2796 } else {
2797 j->flags.inread = 0;
2798 return min(length, j->read_buffer_size);
2802 static ssize_t ixj_enhanced_read(struct file * file_p, char __user *buf, size_t length,
2803 loff_t * ppos)
2805 int pre_retval;
2806 ssize_t read_retval = 0;
2807 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
2809 pre_retval = ixj_PreRead(j, 0L);
2810 switch (pre_retval) {
2811 case NORMAL:
2812 read_retval = ixj_read(file_p, buf, length, ppos);
2813 ixj_PostRead(j, 0L);
2814 break;
2815 case NOPOST:
2816 read_retval = ixj_read(file_p, buf, length, ppos);
2817 break;
2818 case POSTONLY:
2819 ixj_PostRead(j, 0L);
2820 break;
2821 default:
2822 read_retval = pre_retval;
2824 return read_retval;
2827 static ssize_t ixj_write(struct file *file_p, const char __user *buf, size_t count, loff_t * ppos)
2829 unsigned long i = *ppos;
2830 IXJ *j = file_p->private_data;
2832 DECLARE_WAITQUEUE(wait, current);
2834 if (j->flags.inwrite)
2835 return -EALREADY;
2837 j->flags.inwrite = 1;
2839 add_wait_queue(&j->write_q, &wait);
2840 set_current_state(TASK_INTERRUPTIBLE);
2841 mb();
2844 while (!j->write_buffers_empty) {
2845 ++j->write_wait;
2846 if (file_p->f_flags & O_NONBLOCK) {
2847 set_current_state(TASK_RUNNING);
2848 remove_wait_queue(&j->write_q, &wait);
2849 j->flags.inwrite = 0;
2850 return -EAGAIN;
2852 if (!ixj_hookstate(j)) {
2853 set_current_state(TASK_RUNNING);
2854 remove_wait_queue(&j->write_q, &wait);
2855 j->flags.inwrite = 0;
2856 return 0;
2858 interruptible_sleep_on(&j->write_q);
2859 if (signal_pending(current)) {
2860 set_current_state(TASK_RUNNING);
2861 remove_wait_queue(&j->write_q, &wait);
2862 j->flags.inwrite = 0;
2863 return -EINTR;
2866 set_current_state(TASK_RUNNING);
2867 remove_wait_queue(&j->write_q, &wait);
2868 if (j->write_buffer_wp + count >= j->write_buffer_end)
2869 j->write_buffer_wp = j->write_buffer;
2870 i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size));
2871 if (i) {
2872 j->flags.inwrite = 0;
2873 return -EFAULT;
2875 if(j->play_codec == ALAW)
2876 alaw2ulaw(j->write_buffer_wp, min(count, j->write_buffer_size));
2877 j->flags.inwrite = 0;
2878 return min(count, j->write_buffer_size);
2881 static ssize_t ixj_enhanced_write(struct file * file_p, const char __user *buf, size_t count, loff_t * ppos)
2883 int pre_retval;
2884 ssize_t write_retval = 0;
2886 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
2888 pre_retval = ixj_PreWrite(j, 0L);
2889 switch (pre_retval) {
2890 case NORMAL:
2891 write_retval = ixj_write(file_p, buf, count, ppos);
2892 if (write_retval > 0) {
2893 ixj_PostWrite(j, 0L);
2894 j->write_buffer_wp += write_retval;
2895 j->write_buffers_empty--;
2897 break;
2898 case NOPOST:
2899 write_retval = ixj_write(file_p, buf, count, ppos);
2900 if (write_retval > 0) {
2901 j->write_buffer_wp += write_retval;
2902 j->write_buffers_empty--;
2904 break;
2905 case POSTONLY:
2906 ixj_PostWrite(j, 0L);
2907 break;
2908 default:
2909 write_retval = pre_retval;
2911 return write_retval;
2914 static void ixj_read_frame(IXJ *j)
2916 int cnt, dly;
2918 if (j->read_buffer) {
2919 for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
2920 if (!(cnt % 16) && !IsRxReady(j)) {
2921 dly = 0;
2922 while (!IsRxReady(j)) {
2923 if (dly++ > 5) {
2924 dly = 0;
2925 break;
2927 udelay(10);
2930 /* Throw away word 0 of the 8021 compressed format to get standard G.729. */
2931 if (j->rec_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
2932 inb_p(j->DSPbase + 0x0E);
2933 inb_p(j->DSPbase + 0x0F);
2935 *(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E);
2936 *(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F);
2938 ++j->framesread;
2939 if (j->intercom != -1) {
2940 if (IsTxReady(get_ixj(j->intercom))) {
2941 for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
2942 if (!(cnt % 16) && !IsTxReady(j)) {
2943 dly = 0;
2944 while (!IsTxReady(j)) {
2945 if (dly++ > 5) {
2946 dly = 0;
2947 break;
2949 udelay(10);
2952 outb_p(*(j->read_buffer + cnt), get_ixj(j->intercom)->DSPbase + 0x0C);
2953 outb_p(*(j->read_buffer + cnt + 1), get_ixj(j->intercom)->DSPbase + 0x0D);
2955 get_ixj(j->intercom)->frameswritten++;
2957 } else {
2958 j->read_buffer_ready = 1;
2959 wake_up_interruptible(&j->read_q); /* Wake any blocked readers */
2961 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
2963 if(j->ixj_signals[SIG_READ_READY])
2964 ixj_kill_fasync(j, SIG_READ_READY, POLL_OUT);
2969 static short fsk[][6][20] =
2973 0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196,
2974 -16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722
2977 -28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481,
2978 -32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876
2981 -28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715,
2982 -16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846
2985 0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196,
2986 16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722
2989 28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481,
2990 32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876
2993 28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715,
2994 16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846
2999 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126,
3000 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126
3003 -28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051,
3004 28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051
3007 -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925,
3008 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925
3011 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126,
3012 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126
3015 28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051,
3016 -28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051
3019 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925,
3020 -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925
3026 static void ixj_write_cid_bit(IXJ *j, int bit)
3028 while (j->fskcnt < 20) {
3029 if(j->fskdcnt < (j->fsksize - 1))
3030 j->fskdata[j->fskdcnt++] = fsk[bit][j->fskz][j->fskcnt];
3032 j->fskcnt += 3;
3034 j->fskcnt %= 20;
3036 if (!bit)
3037 j->fskz++;
3038 if (j->fskz >= 6)
3039 j->fskz = 0;
3043 static void ixj_write_cid_byte(IXJ *j, char byte)
3045 IXJ_CBYTE cb;
3047 cb.cbyte = byte;
3048 ixj_write_cid_bit(j, 0);
3049 ixj_write_cid_bit(j, cb.cbits.b0 ? 1 : 0);
3050 ixj_write_cid_bit(j, cb.cbits.b1 ? 1 : 0);
3051 ixj_write_cid_bit(j, cb.cbits.b2 ? 1 : 0);
3052 ixj_write_cid_bit(j, cb.cbits.b3 ? 1 : 0);
3053 ixj_write_cid_bit(j, cb.cbits.b4 ? 1 : 0);
3054 ixj_write_cid_bit(j, cb.cbits.b5 ? 1 : 0);
3055 ixj_write_cid_bit(j, cb.cbits.b6 ? 1 : 0);
3056 ixj_write_cid_bit(j, cb.cbits.b7 ? 1 : 0);
3057 ixj_write_cid_bit(j, 1);
3060 static void ixj_write_cid_seize(IXJ *j)
3062 int cnt;
3064 for (cnt = 0; cnt < 150; cnt++) {
3065 ixj_write_cid_bit(j, 0);
3066 ixj_write_cid_bit(j, 1);
3068 for (cnt = 0; cnt < 180; cnt++) {
3069 ixj_write_cid_bit(j, 1);
3073 static void ixj_write_cidcw_seize(IXJ *j)
3075 int cnt;
3077 for (cnt = 0; cnt < 80; cnt++) {
3078 ixj_write_cid_bit(j, 1);
3082 static int ixj_write_cid_string(IXJ *j, char *s, int checksum)
3084 int cnt;
3086 for (cnt = 0; cnt < strlen(s); cnt++) {
3087 ixj_write_cid_byte(j, s[cnt]);
3088 checksum = (checksum + s[cnt]);
3090 return checksum;
3093 static void ixj_pad_fsk(IXJ *j, int pad)
3095 int cnt;
3097 for (cnt = 0; cnt < pad; cnt++) {
3098 if(j->fskdcnt < (j->fsksize - 1))
3099 j->fskdata[j->fskdcnt++] = 0x0000;
3101 for (cnt = 0; cnt < 720; cnt++) {
3102 if(j->fskdcnt < (j->fsksize - 1))
3103 j->fskdata[j->fskdcnt++] = 0x0000;
3107 static void ixj_pre_cid(IXJ *j)
3109 j->cid_play_codec = j->play_codec;
3110 j->cid_play_frame_size = j->play_frame_size;
3111 j->cid_play_volume = get_play_volume(j);
3112 j->cid_play_flag = j->flags.playing;
3114 j->cid_rec_codec = j->rec_codec;
3115 j->cid_rec_volume = get_rec_volume(j);
3116 j->cid_rec_flag = j->flags.recording;
3118 j->cid_play_aec_level = j->aec_level;
3120 switch(j->baseframe.low) {
3121 case 0xA0:
3122 j->cid_base_frame_size = 20;
3123 break;
3124 case 0x50:
3125 j->cid_base_frame_size = 10;
3126 break;
3127 case 0xF0:
3128 j->cid_base_frame_size = 30;
3129 break;
3132 ixj_play_stop(j);
3133 ixj_cpt_stop(j);
3135 j->flags.cidplay = 1;
3137 set_base_frame(j, 30);
3138 set_play_codec(j, LINEAR16);
3139 set_play_volume(j, 0x1B);
3140 ixj_play_start(j);
3143 static void ixj_post_cid(IXJ *j)
3145 ixj_play_stop(j);
3147 if(j->cidsize > 5000) {
3148 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
3150 j->flags.cidplay = 0;
3151 if(ixjdebug & 0x0200) {
3152 printk("IXJ phone%d Finished Playing CallerID data %ld\n", j->board, jiffies);
3155 ixj_fsk_free(j);
3157 j->fskdcnt = 0;
3158 set_base_frame(j, j->cid_base_frame_size);
3159 set_play_codec(j, j->cid_play_codec);
3160 ixj_aec_start(j, j->cid_play_aec_level);
3161 set_play_volume(j, j->cid_play_volume);
3163 set_rec_codec(j, j->cid_rec_codec);
3164 set_rec_volume(j, j->cid_rec_volume);
3166 if(j->cid_rec_flag)
3167 ixj_record_start(j);
3169 if(j->cid_play_flag)
3170 ixj_play_start(j);
3172 if(j->cid_play_flag) {
3173 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3177 static void ixj_write_cid(IXJ *j)
3179 char sdmf1[50];
3180 char sdmf2[50];
3181 char sdmf3[80];
3182 char mdmflen, len1, len2, len3;
3183 int pad;
3185 int checksum = 0;
3187 if (j->dsp.low == 0x20 || j->flags.cidplay)
3188 return;
3190 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3191 j->cidsize = j->cidcnt = 0;
3193 ixj_fsk_alloc(j);
3195 strcpy(sdmf1, j->cid_send.month);
3196 strcat(sdmf1, j->cid_send.day);
3197 strcat(sdmf1, j->cid_send.hour);
3198 strcat(sdmf1, j->cid_send.min);
3199 strcpy(sdmf2, j->cid_send.number);
3200 strcpy(sdmf3, j->cid_send.name);
3202 len1 = strlen(sdmf1);
3203 len2 = strlen(sdmf2);
3204 len3 = strlen(sdmf3);
3205 mdmflen = len1 + len2 + len3 + 6;
3207 while(1){
3208 ixj_write_cid_seize(j);
3210 ixj_write_cid_byte(j, 0x80);
3211 checksum = 0x80;
3212 ixj_write_cid_byte(j, mdmflen);
3213 checksum = checksum + mdmflen;
3215 ixj_write_cid_byte(j, 0x01);
3216 checksum = checksum + 0x01;
3217 ixj_write_cid_byte(j, len1);
3218 checksum = checksum + len1;
3219 checksum = ixj_write_cid_string(j, sdmf1, checksum);
3220 if(ixj_hookstate(j) & 1)
3221 break;
3223 ixj_write_cid_byte(j, 0x02);
3224 checksum = checksum + 0x02;
3225 ixj_write_cid_byte(j, len2);
3226 checksum = checksum + len2;
3227 checksum = ixj_write_cid_string(j, sdmf2, checksum);
3228 if(ixj_hookstate(j) & 1)
3229 break;
3231 ixj_write_cid_byte(j, 0x07);
3232 checksum = checksum + 0x07;
3233 ixj_write_cid_byte(j, len3);
3234 checksum = checksum + len3;
3235 checksum = ixj_write_cid_string(j, sdmf3, checksum);
3236 if(ixj_hookstate(j) & 1)
3237 break;
3239 checksum %= 256;
3240 checksum ^= 0xFF;
3241 checksum += 1;
3243 ixj_write_cid_byte(j, (char) checksum);
3245 pad = j->fskdcnt % 240;
3246 if (pad) {
3247 pad = 240 - pad;
3249 ixj_pad_fsk(j, pad);
3250 break;
3253 ixj_write_frame(j);
3256 static void ixj_write_cidcw(IXJ *j)
3258 IXJ_TONE ti;
3260 char sdmf1[50];
3261 char sdmf2[50];
3262 char sdmf3[80];
3263 char mdmflen, len1, len2, len3;
3264 int pad;
3266 int checksum = 0;
3268 if (j->dsp.low == 0x20 || j->flags.cidplay)
3269 return;
3271 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3272 j->cidsize = j->cidcnt = 0;
3274 ixj_fsk_alloc(j);
3276 j->flags.cidcw_ack = 0;
3278 ti.tone_index = 23;
3279 ti.gain0 = 1;
3280 ti.freq0 = hz440;
3281 ti.gain1 = 0;
3282 ti.freq1 = 0;
3283 ixj_init_tone(j, &ti);
3285 ixj_set_tone_on(1500, j);
3286 ixj_set_tone_off(32, j);
3287 if(ixjdebug & 0x0200) {
3288 printk("IXJ cidcw phone%d first tone start at %ld\n", j->board, jiffies);
3290 ixj_play_tone(j, 23);
3292 clear_bit(j->board, &j->busyflags);
3293 while(j->tone_state)
3294 schedule_timeout_interruptible(1);
3295 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3296 schedule_timeout_interruptible(1);
3297 if(ixjdebug & 0x0200) {
3298 printk("IXJ cidcw phone%d first tone end at %ld\n", j->board, jiffies);
3301 ti.tone_index = 24;
3302 ti.gain0 = 1;
3303 ti.freq0 = hz2130;
3304 ti.gain1 = 0;
3305 ti.freq1 = hz2750;
3306 ixj_init_tone(j, &ti);
3308 ixj_set_tone_off(10, j);
3309 ixj_set_tone_on(600, j);
3310 if(ixjdebug & 0x0200) {
3311 printk("IXJ cidcw phone%d second tone start at %ld\n", j->board, jiffies);
3313 ixj_play_tone(j, 24);
3315 clear_bit(j->board, &j->busyflags);
3316 while(j->tone_state)
3317 schedule_timeout_interruptible(1);
3318 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3319 schedule_timeout_interruptible(1);
3320 if(ixjdebug & 0x0200) {
3321 printk("IXJ cidcw phone%d sent second tone at %ld\n", j->board, jiffies);
3324 j->cidcw_wait = jiffies + ((50 * hertz) / 100);
3326 clear_bit(j->board, &j->busyflags);
3327 while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait))
3328 schedule_timeout_interruptible(1);
3329 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3330 schedule_timeout_interruptible(1);
3331 j->cidcw_wait = 0;
3332 if(!j->flags.cidcw_ack) {
3333 if(ixjdebug & 0x0200) {
3334 printk("IXJ cidcw phone%d did not receive ACK from display %ld\n", j->board, jiffies);
3336 ixj_post_cid(j);
3337 if(j->cid_play_flag) {
3338 wake_up_interruptible(&j->write_q); /* Wake any blocked readers */
3340 return;
3341 } else {
3342 ixj_pre_cid(j);
3344 j->flags.cidcw_ack = 0;
3345 strcpy(sdmf1, j->cid_send.month);
3346 strcat(sdmf1, j->cid_send.day);
3347 strcat(sdmf1, j->cid_send.hour);
3348 strcat(sdmf1, j->cid_send.min);
3349 strcpy(sdmf2, j->cid_send.number);
3350 strcpy(sdmf3, j->cid_send.name);
3352 len1 = strlen(sdmf1);
3353 len2 = strlen(sdmf2);
3354 len3 = strlen(sdmf3);
3355 mdmflen = len1 + len2 + len3 + 6;
3357 ixj_write_cidcw_seize(j);
3359 ixj_write_cid_byte(j, 0x80);
3360 checksum = 0x80;
3361 ixj_write_cid_byte(j, mdmflen);
3362 checksum = checksum + mdmflen;
3364 ixj_write_cid_byte(j, 0x01);
3365 checksum = checksum + 0x01;
3366 ixj_write_cid_byte(j, len1);
3367 checksum = checksum + len1;
3368 checksum = ixj_write_cid_string(j, sdmf1, checksum);
3370 ixj_write_cid_byte(j, 0x02);
3371 checksum = checksum + 0x02;
3372 ixj_write_cid_byte(j, len2);
3373 checksum = checksum + len2;
3374 checksum = ixj_write_cid_string(j, sdmf2, checksum);
3376 ixj_write_cid_byte(j, 0x07);
3377 checksum = checksum + 0x07;
3378 ixj_write_cid_byte(j, len3);
3379 checksum = checksum + len3;
3380 checksum = ixj_write_cid_string(j, sdmf3, checksum);
3382 checksum %= 256;
3383 checksum ^= 0xFF;
3384 checksum += 1;
3386 ixj_write_cid_byte(j, (char) checksum);
3388 pad = j->fskdcnt % 240;
3389 if (pad) {
3390 pad = 240 - pad;
3392 ixj_pad_fsk(j, pad);
3393 if(ixjdebug & 0x0200) {
3394 printk("IXJ cidcw phone%d sent FSK data at %ld\n", j->board, jiffies);
3398 static void ixj_write_vmwi(IXJ *j, int msg)
3400 char mdmflen;
3401 int pad;
3403 int checksum = 0;
3405 if (j->dsp.low == 0x20 || j->flags.cidplay)
3406 return;
3408 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3409 j->cidsize = j->cidcnt = 0;
3411 ixj_fsk_alloc(j);
3413 mdmflen = 3;
3415 if (j->port == PORT_POTS)
3416 SLIC_SetState(PLD_SLIC_STATE_OHT, j);
3418 ixj_write_cid_seize(j);
3420 ixj_write_cid_byte(j, 0x82);
3421 checksum = 0x82;
3422 ixj_write_cid_byte(j, mdmflen);
3423 checksum = checksum + mdmflen;
3425 ixj_write_cid_byte(j, 0x0B);
3426 checksum = checksum + 0x0B;
3427 ixj_write_cid_byte(j, 1);
3428 checksum = checksum + 1;
3430 if(msg) {
3431 ixj_write_cid_byte(j, 0xFF);
3432 checksum = checksum + 0xFF;
3434 else {
3435 ixj_write_cid_byte(j, 0x00);
3436 checksum = checksum + 0x00;
3439 checksum %= 256;
3440 checksum ^= 0xFF;
3441 checksum += 1;
3443 ixj_write_cid_byte(j, (char) checksum);
3445 pad = j->fskdcnt % 240;
3446 if (pad) {
3447 pad = 240 - pad;
3449 ixj_pad_fsk(j, pad);
3452 static void ixj_write_frame(IXJ *j)
3454 int cnt, frame_count, dly;
3455 IXJ_WORD dat;
3456 BYTES blankword;
3458 frame_count = 0;
3459 if(j->flags.cidplay) {
3460 for(cnt = 0; cnt < 480; cnt++) {
3461 if (!(cnt % 16) && !IsTxReady(j)) {
3462 dly = 0;
3463 while (!IsTxReady(j)) {
3464 if (dly++ > 5) {
3465 dly = 0;
3466 break;
3468 udelay(10);
3471 dat.word = j->fskdata[j->cidcnt++];
3472 outb_p(dat.bytes.low, j->DSPbase + 0x0C);
3473 outb_p(dat.bytes.high, j->DSPbase + 0x0D);
3474 cnt++;
3476 if(j->cidcnt >= j->fskdcnt) {
3477 ixj_post_cid(j);
3479 /* This may seem rude, but if we just played one frame of FSK data for CallerID
3480 and there is real audio data in the buffer, we need to throw it away because
3481 we just used it's time slot */
3482 if (j->write_buffer_rp > j->write_buffer_wp) {
3483 j->write_buffer_rp += j->cid_play_frame_size * 2;
3484 if (j->write_buffer_rp >= j->write_buffer_end) {
3485 j->write_buffer_rp = j->write_buffer;
3487 j->write_buffers_empty++;
3488 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3490 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
3492 } else if (j->write_buffer && j->write_buffers_empty < 1) {
3493 if (j->write_buffer_wp > j->write_buffer_rp) {
3494 frame_count =
3495 (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2);
3497 if (j->write_buffer_rp > j->write_buffer_wp) {
3498 frame_count =
3499 (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) +
3500 (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2);
3502 if (frame_count >= 1) {
3503 if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) {
3504 switch (j->play_mode) {
3505 case PLAYBACK_MODE_ULAW:
3506 case PLAYBACK_MODE_ALAW:
3507 blankword.low = blankword.high = 0xFF;
3508 break;
3509 case PLAYBACK_MODE_8LINEAR:
3510 case PLAYBACK_MODE_16LINEAR:
3511 blankword.low = blankword.high = 0x00;
3512 break;
3513 case PLAYBACK_MODE_8LINEAR_WSS:
3514 blankword.low = blankword.high = 0x80;
3515 break;
3517 for (cnt = 0; cnt < 16; cnt++) {
3518 if (!(cnt % 16) && !IsTxReady(j)) {
3519 dly = 0;
3520 while (!IsTxReady(j)) {
3521 if (dly++ > 5) {
3522 dly = 0;
3523 break;
3525 udelay(10);
3528 outb_p((blankword.low), j->DSPbase + 0x0C);
3529 outb_p((blankword.high), j->DSPbase + 0x0D);
3531 j->flags.play_first_frame = 0;
3532 } else if (j->play_codec == G723_63 && j->flags.play_first_frame) {
3533 for (cnt = 0; cnt < 24; cnt++) {
3534 if(cnt == 12) {
3535 blankword.low = 0x02;
3536 blankword.high = 0x00;
3538 else {
3539 blankword.low = blankword.high = 0x00;
3541 if (!(cnt % 16) && !IsTxReady(j)) {
3542 dly = 0;
3543 while (!IsTxReady(j)) {
3544 if (dly++ > 5) {
3545 dly = 0;
3546 break;
3548 udelay(10);
3551 outb_p((blankword.low), j->DSPbase + 0x0C);
3552 outb_p((blankword.high), j->DSPbase + 0x0D);
3554 j->flags.play_first_frame = 0;
3556 for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) {
3557 if (!(cnt % 16) && !IsTxReady(j)) {
3558 dly = 0;
3559 while (!IsTxReady(j)) {
3560 if (dly++ > 5) {
3561 dly = 0;
3562 break;
3564 udelay(10);
3567 /* Add word 0 to G.729 frames for the 8021. Right now we don't do VAD/CNG */
3568 if (j->play_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
3569 if (j->write_buffer_rp[cnt] == 0 &&
3570 j->write_buffer_rp[cnt + 1] == 0 &&
3571 j->write_buffer_rp[cnt + 2] == 0 &&
3572 j->write_buffer_rp[cnt + 3] == 0 &&
3573 j->write_buffer_rp[cnt + 4] == 0 &&
3574 j->write_buffer_rp[cnt + 5] == 0 &&
3575 j->write_buffer_rp[cnt + 6] == 0 &&
3576 j->write_buffer_rp[cnt + 7] == 0 &&
3577 j->write_buffer_rp[cnt + 8] == 0 &&
3578 j->write_buffer_rp[cnt + 9] == 0) {
3579 /* someone is trying to write silence lets make this a type 0 frame. */
3580 outb_p(0x00, j->DSPbase + 0x0C);
3581 outb_p(0x00, j->DSPbase + 0x0D);
3582 } else {
3583 /* so all other frames are type 1. */
3584 outb_p(0x01, j->DSPbase + 0x0C);
3585 outb_p(0x00, j->DSPbase + 0x0D);
3588 outb_p(*(j->write_buffer_rp + cnt), j->DSPbase + 0x0C);
3589 outb_p(*(j->write_buffer_rp + cnt + 1), j->DSPbase + 0x0D);
3590 *(j->write_buffer_rp + cnt) = 0;
3591 *(j->write_buffer_rp + cnt + 1) = 0;
3593 j->write_buffer_rp += j->play_frame_size * 2;
3594 if (j->write_buffer_rp >= j->write_buffer_end) {
3595 j->write_buffer_rp = j->write_buffer;
3597 j->write_buffers_empty++;
3598 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3600 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
3602 ++j->frameswritten;
3604 } else {
3605 j->drybuffer++;
3607 if(j->ixj_signals[SIG_WRITE_READY]) {
3608 ixj_kill_fasync(j, SIG_WRITE_READY, POLL_OUT);
3612 static int idle(IXJ *j)
3614 if (ixj_WriteDSPCommand(0x0000, j)) /* DSP Idle */
3616 return 0;
3618 if (j->ssr.high || j->ssr.low) {
3619 return 0;
3620 } else {
3621 j->play_mode = -1;
3622 j->flags.playing = 0;
3623 j->rec_mode = -1;
3624 j->flags.recording = 0;
3625 return 1;
3629 static int set_base_frame(IXJ *j, int size)
3631 unsigned short cmd;
3632 int cnt;
3634 idle(j);
3635 j->cid_play_aec_level = j->aec_level;
3636 aec_stop(j);
3637 for (cnt = 0; cnt < 10; cnt++) {
3638 if (idle(j))
3639 break;
3641 if (j->ssr.high || j->ssr.low)
3642 return -1;
3643 if (j->dsp.low != 0x20) {
3644 switch (size) {
3645 case 30:
3646 cmd = 0x07F0;
3647 /* Set Base Frame Size to 240 pg9-10 8021 */
3648 break;
3649 case 20:
3650 cmd = 0x07A0;
3651 /* Set Base Frame Size to 160 pg9-10 8021 */
3652 break;
3653 case 10:
3654 cmd = 0x0750;
3655 /* Set Base Frame Size to 80 pg9-10 8021 */
3656 break;
3657 default:
3658 return -1;
3660 } else {
3661 if (size == 30)
3662 return size;
3663 else
3664 return -1;
3666 if (ixj_WriteDSPCommand(cmd, j)) {
3667 j->baseframe.high = j->baseframe.low = 0xFF;
3668 return -1;
3669 } else {
3670 j->baseframe.high = j->ssr.high;
3671 j->baseframe.low = j->ssr.low;
3672 /* If the status returned is 0x0000 (pg9-9 8021) the call failed */
3673 if(j->baseframe.high == 0x00 && j->baseframe.low == 0x00) {
3674 return -1;
3677 ixj_aec_start(j, j->cid_play_aec_level);
3678 return size;
3681 static int set_rec_codec(IXJ *j, int rate)
3683 int retval = 0;
3685 j->rec_codec = rate;
3687 switch (rate) {
3688 case G723_63:
3689 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3690 j->rec_frame_size = 12;
3691 j->rec_mode = 0;
3692 } else {
3693 retval = 1;
3695 break;
3696 case G723_53:
3697 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3698 j->rec_frame_size = 10;
3699 j->rec_mode = 0;
3700 } else {
3701 retval = 1;
3703 break;
3704 case TS85:
3705 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
3706 j->rec_frame_size = 16;
3707 j->rec_mode = 0;
3708 } else {
3709 retval = 1;
3711 break;
3712 case TS48:
3713 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3714 j->rec_frame_size = 9;
3715 j->rec_mode = 0;
3716 } else {
3717 retval = 1;
3719 break;
3720 case TS41:
3721 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3722 j->rec_frame_size = 8;
3723 j->rec_mode = 0;
3724 } else {
3725 retval = 1;
3727 break;
3728 case G728:
3729 if (j->dsp.low != 0x20) {
3730 j->rec_frame_size = 48;
3731 j->rec_mode = 0;
3732 } else {
3733 retval = 1;
3735 break;
3736 case G729:
3737 if (j->dsp.low != 0x20) {
3738 if (!j->flags.g729_loaded) {
3739 retval = 1;
3740 break;
3742 switch (j->baseframe.low) {
3743 case 0xA0:
3744 j->rec_frame_size = 10;
3745 break;
3746 case 0x50:
3747 j->rec_frame_size = 5;
3748 break;
3749 default:
3750 j->rec_frame_size = 15;
3751 break;
3753 j->rec_mode = 0;
3754 } else {
3755 retval = 1;
3757 break;
3758 case G729B:
3759 if (j->dsp.low != 0x20) {
3760 if (!j->flags.g729_loaded) {
3761 retval = 1;
3762 break;
3764 switch (j->baseframe.low) {
3765 case 0xA0:
3766 j->rec_frame_size = 12;
3767 break;
3768 case 0x50:
3769 j->rec_frame_size = 6;
3770 break;
3771 default:
3772 j->rec_frame_size = 18;
3773 break;
3775 j->rec_mode = 0;
3776 } else {
3777 retval = 1;
3779 break;
3780 case ULAW:
3781 switch (j->baseframe.low) {
3782 case 0xA0:
3783 j->rec_frame_size = 80;
3784 break;
3785 case 0x50:
3786 j->rec_frame_size = 40;
3787 break;
3788 default:
3789 j->rec_frame_size = 120;
3790 break;
3792 j->rec_mode = 4;
3793 break;
3794 case ALAW:
3795 switch (j->baseframe.low) {
3796 case 0xA0:
3797 j->rec_frame_size = 80;
3798 break;
3799 case 0x50:
3800 j->rec_frame_size = 40;
3801 break;
3802 default:
3803 j->rec_frame_size = 120;
3804 break;
3806 j->rec_mode = 4;
3807 break;
3808 case LINEAR16:
3809 switch (j->baseframe.low) {
3810 case 0xA0:
3811 j->rec_frame_size = 160;
3812 break;
3813 case 0x50:
3814 j->rec_frame_size = 80;
3815 break;
3816 default:
3817 j->rec_frame_size = 240;
3818 break;
3820 j->rec_mode = 5;
3821 break;
3822 case LINEAR8:
3823 switch (j->baseframe.low) {
3824 case 0xA0:
3825 j->rec_frame_size = 80;
3826 break;
3827 case 0x50:
3828 j->rec_frame_size = 40;
3829 break;
3830 default:
3831 j->rec_frame_size = 120;
3832 break;
3834 j->rec_mode = 6;
3835 break;
3836 case WSS:
3837 switch (j->baseframe.low) {
3838 case 0xA0:
3839 j->rec_frame_size = 80;
3840 break;
3841 case 0x50:
3842 j->rec_frame_size = 40;
3843 break;
3844 default:
3845 j->rec_frame_size = 120;
3846 break;
3848 j->rec_mode = 7;
3849 break;
3850 default:
3851 kfree(j->read_buffer);
3852 j->rec_frame_size = 0;
3853 j->rec_mode = -1;
3854 j->read_buffer = NULL;
3855 j->read_buffer_size = 0;
3856 retval = 1;
3857 break;
3859 return retval;
3862 static int ixj_record_start(IXJ *j)
3864 unsigned short cmd = 0x0000;
3866 if (j->read_buffer) {
3867 ixj_record_stop(j);
3869 j->flags.recording = 1;
3870 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
3872 if(ixjdebug & 0x0002)
3873 printk("IXJ %d Starting Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
3875 if (!j->rec_mode) {
3876 switch (j->rec_codec) {
3877 case G723_63:
3878 cmd = 0x5131;
3879 break;
3880 case G723_53:
3881 cmd = 0x5132;
3882 break;
3883 case TS85:
3884 cmd = 0x5130; /* TrueSpeech 8.5 */
3886 break;
3887 case TS48:
3888 cmd = 0x5133; /* TrueSpeech 4.8 */
3890 break;
3891 case TS41:
3892 cmd = 0x5134; /* TrueSpeech 4.1 */
3894 break;
3895 case G728:
3896 cmd = 0x5135;
3897 break;
3898 case G729:
3899 case G729B:
3900 cmd = 0x5136;
3901 break;
3902 default:
3903 return 1;
3905 if (ixj_WriteDSPCommand(cmd, j))
3906 return -1;
3908 if (!j->read_buffer) {
3909 if (!j->read_buffer)
3910 j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_ATOMIC);
3911 if (!j->read_buffer) {
3912 printk("Read buffer allocation for ixj board %d failed!\n", j->board);
3913 return -ENOMEM;
3916 j->read_buffer_size = j->rec_frame_size * 2;
3918 if (ixj_WriteDSPCommand(0x5102, j)) /* Set Poll sync mode */
3920 return -1;
3922 switch (j->rec_mode) {
3923 case 0:
3924 cmd = 0x1C03; /* Record C1 */
3926 break;
3927 case 4:
3928 if (j->ver.low == 0x12) {
3929 cmd = 0x1E03; /* Record C1 */
3931 } else {
3932 cmd = 0x1E01; /* Record C1 */
3935 break;
3936 case 5:
3937 if (j->ver.low == 0x12) {
3938 cmd = 0x1E83; /* Record C1 */
3940 } else {
3941 cmd = 0x1E81; /* Record C1 */
3944 break;
3945 case 6:
3946 if (j->ver.low == 0x12) {
3947 cmd = 0x1F03; /* Record C1 */
3949 } else {
3950 cmd = 0x1F01; /* Record C1 */
3953 break;
3954 case 7:
3955 if (j->ver.low == 0x12) {
3956 cmd = 0x1F83; /* Record C1 */
3957 } else {
3958 cmd = 0x1F81; /* Record C1 */
3960 break;
3962 if (ixj_WriteDSPCommand(cmd, j))
3963 return -1;
3965 if (j->flags.playing) {
3966 ixj_aec_start(j, j->aec_level);
3968 return 0;
3971 static void ixj_record_stop(IXJ *j)
3973 if (ixjdebug & 0x0002)
3974 printk("IXJ %d Stopping Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
3976 kfree(j->read_buffer);
3977 j->read_buffer = NULL;
3978 j->read_buffer_size = 0;
3979 if (j->rec_mode > -1) {
3980 ixj_WriteDSPCommand(0x5120, j);
3981 j->rec_mode = -1;
3983 j->flags.recording = 0;
3985 static void ixj_vad(IXJ *j, int arg)
3987 if (arg)
3988 ixj_WriteDSPCommand(0x513F, j);
3989 else
3990 ixj_WriteDSPCommand(0x513E, j);
3993 static void set_rec_depth(IXJ *j, int depth)
3995 if (depth > 60)
3996 depth = 60;
3997 if (depth < 0)
3998 depth = 0;
3999 ixj_WriteDSPCommand(0x5180 + depth, j);
4002 static void set_dtmf_prescale(IXJ *j, int volume)
4004 ixj_WriteDSPCommand(0xCF07, j);
4005 ixj_WriteDSPCommand(volume, j);
4008 static int get_dtmf_prescale(IXJ *j)
4010 ixj_WriteDSPCommand(0xCF05, j);
4011 return j->ssr.high << 8 | j->ssr.low;
4014 static void set_rec_volume(IXJ *j, int volume)
4016 if(j->aec_level == AEC_AGC) {
4017 if (ixjdebug & 0x0002)
4018 printk(KERN_INFO "IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4x\n", j->board, volume);
4019 ixj_WriteDSPCommand(0xCF96, j);
4020 ixj_WriteDSPCommand(volume, j);
4021 } else {
4022 if (ixjdebug & 0x0002)
4023 printk(KERN_INFO "IXJ: /dev/phone %d Setting Record Volume to 0x%4.4x\n", j->board, volume);
4024 ixj_WriteDSPCommand(0xCF03, j);
4025 ixj_WriteDSPCommand(volume, j);
4029 static int set_rec_volume_linear(IXJ *j, int volume)
4031 int newvolume, dsprecmax;
4033 if (ixjdebug & 0x0002)
4034 printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4x\n", j->board, volume);
4035 if(volume > 100 || volume < 0) {
4036 return -1;
4039 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
4040 switch (j->cardtype) {
4041 case QTI_PHONEJACK:
4042 dsprecmax = 0x440;
4043 break;
4044 case QTI_LINEJACK:
4045 dsprecmax = 0x180;
4046 ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
4047 ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
4048 ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
4049 break;
4050 case QTI_PHONEJACK_LITE:
4051 dsprecmax = 0x4C0;
4052 break;
4053 case QTI_PHONEJACK_PCI:
4054 dsprecmax = 0x100;
4055 break;
4056 case QTI_PHONECARD:
4057 dsprecmax = 0x400;
4058 break;
4059 default:
4060 return -1;
4062 newvolume = (dsprecmax * volume) / 100;
4063 set_rec_volume(j, newvolume);
4064 return 0;
4067 static int get_rec_volume(IXJ *j)
4069 if(j->aec_level == AEC_AGC) {
4070 if (ixjdebug & 0x0002)
4071 printk(KERN_INFO "Getting AGC Threshold\n");
4072 ixj_WriteDSPCommand(0xCF86, j);
4073 if (ixjdebug & 0x0002)
4074 printk(KERN_INFO "AGC Threshold is 0x%2.2x%2.2x\n", j->ssr.high, j->ssr.low);
4075 return j->ssr.high << 8 | j->ssr.low;
4076 } else {
4077 if (ixjdebug & 0x0002)
4078 printk(KERN_INFO "Getting Record Volume\n");
4079 ixj_WriteDSPCommand(0xCF01, j);
4080 return j->ssr.high << 8 | j->ssr.low;
4084 static int get_rec_volume_linear(IXJ *j)
4086 int volume, newvolume, dsprecmax;
4088 switch (j->cardtype) {
4089 case QTI_PHONEJACK:
4090 dsprecmax = 0x440;
4091 break;
4092 case QTI_LINEJACK:
4093 dsprecmax = 0x180;
4094 break;
4095 case QTI_PHONEJACK_LITE:
4096 dsprecmax = 0x4C0;
4097 break;
4098 case QTI_PHONEJACK_PCI:
4099 dsprecmax = 0x100;
4100 break;
4101 case QTI_PHONECARD:
4102 dsprecmax = 0x400;
4103 break;
4104 default:
4105 return -1;
4107 volume = get_rec_volume(j);
4108 newvolume = (volume * 100) / dsprecmax;
4109 if(newvolume > 100)
4110 newvolume = 100;
4111 return newvolume;
4114 static int get_rec_level(IXJ *j)
4116 int retval;
4118 ixj_WriteDSPCommand(0xCF88, j);
4120 retval = j->ssr.high << 8 | j->ssr.low;
4121 retval = (retval * 256) / 240;
4122 return retval;
4125 static void ixj_aec_start(IXJ *j, int level)
4127 j->aec_level = level;
4128 if (ixjdebug & 0x0002)
4129 printk(KERN_INFO "AGC set = 0x%2.2x\n", j->aec_level);
4130 if (!level) {
4131 aec_stop(j);
4132 } else {
4133 if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4134 ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer */
4136 ixj_WriteDSPCommand(0x0300, j);
4138 ixj_WriteDSPCommand(0xB001, j); /* AEC On */
4140 ixj_WriteDSPCommand(0xE013, j); /* Advanced AEC C1 */
4142 switch (level) {
4143 case AEC_LOW:
4144 ixj_WriteDSPCommand(0x0000, j); /* Advanced AEC C2 = off */
4146 ixj_WriteDSPCommand(0xE011, j);
4147 ixj_WriteDSPCommand(0xFFFF, j);
4149 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4150 ixj_WriteDSPCommand(0x0000, j); /* to off */
4152 break;
4154 case AEC_MED:
4155 ixj_WriteDSPCommand(0x0600, j); /* Advanced AEC C2 = on medium */
4157 ixj_WriteDSPCommand(0xE011, j);
4158 ixj_WriteDSPCommand(0x0080, j);
4160 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4161 ixj_WriteDSPCommand(0x0000, j); /* to off */
4163 break;
4165 case AEC_HIGH:
4166 ixj_WriteDSPCommand(0x0C00, j); /* Advanced AEC C2 = on high */
4168 ixj_WriteDSPCommand(0xE011, j);
4169 ixj_WriteDSPCommand(0x0080, j);
4171 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4172 ixj_WriteDSPCommand(0x0000, j); /* to off */
4174 break;
4176 case AEC_AGC:
4177 /* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */
4178 ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
4180 ixj_WriteDSPCommand(0xE011, j);
4181 ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
4183 ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
4185 if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4186 ixj_WriteDSPCommand(0x0224, j);
4187 else
4188 ixj_WriteDSPCommand(0x1224, j);
4190 ixj_WriteDSPCommand(0xE014, j);
4191 ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
4193 ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
4195 /* Now we can set the AGC initial parameters and turn it on */
4196 ixj_WriteDSPCommand(0xCF90, j); /* Set AGC Minumum gain */
4197 ixj_WriteDSPCommand(0x0020, j); /* to 0.125 (-18dB) */
4199 ixj_WriteDSPCommand(0xCF91, j); /* Set AGC Maximum gain */
4200 ixj_WriteDSPCommand(0x1000, j); /* to 16 (24dB) */
4202 ixj_WriteDSPCommand(0xCF92, j); /* Set AGC start gain */
4203 ixj_WriteDSPCommand(0x0800, j); /* to 8 (+18dB) */
4205 ixj_WriteDSPCommand(0xCF93, j); /* Set AGC hold time */
4206 ixj_WriteDSPCommand(0x1F40, j); /* to 2 seconds (units are 250us) */
4208 ixj_WriteDSPCommand(0xCF94, j); /* Set AGC Attack Time Constant */
4209 ixj_WriteDSPCommand(0x0005, j); /* to 8ms */
4211 ixj_WriteDSPCommand(0xCF95, j); /* Set AGC Decay Time Constant */
4212 ixj_WriteDSPCommand(0x000D, j); /* to 4096ms */
4214 ixj_WriteDSPCommand(0xCF96, j); /* Set AGC Attack Threshold */
4215 ixj_WriteDSPCommand(0x1200, j); /* to 25% */
4217 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4218 ixj_WriteDSPCommand(0x0001, j); /* to on */
4220 break;
4222 case AEC_AUTO:
4223 ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
4225 ixj_WriteDSPCommand(0xE011, j);
4226 ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
4228 ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
4230 if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4231 ixj_WriteDSPCommand(0x0224, j);
4232 else
4233 ixj_WriteDSPCommand(0x1224, j);
4235 ixj_WriteDSPCommand(0xE014, j);
4236 ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
4238 ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
4240 break;
4245 static void aec_stop(IXJ *j)
4247 j->aec_level = AEC_OFF;
4248 if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4249 ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer back */
4251 ixj_WriteDSPCommand(0x0700, j);
4253 if (j->play_mode != -1 && j->rec_mode != -1)
4255 ixj_WriteDSPCommand(0xB002, j); /* AEC Stop */
4259 static int set_play_codec(IXJ *j, int rate)
4261 int retval = 0;
4263 j->play_codec = rate;
4265 switch (rate) {
4266 case G723_63:
4267 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4268 j->play_frame_size = 12;
4269 j->play_mode = 0;
4270 } else {
4271 retval = 1;
4273 break;
4274 case G723_53:
4275 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4276 j->play_frame_size = 10;
4277 j->play_mode = 0;
4278 } else {
4279 retval = 1;
4281 break;
4282 case TS85:
4283 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
4284 j->play_frame_size = 16;
4285 j->play_mode = 0;
4286 } else {
4287 retval = 1;
4289 break;
4290 case TS48:
4291 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4292 j->play_frame_size = 9;
4293 j->play_mode = 0;
4294 } else {
4295 retval = 1;
4297 break;
4298 case TS41:
4299 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4300 j->play_frame_size = 8;
4301 j->play_mode = 0;
4302 } else {
4303 retval = 1;
4305 break;
4306 case G728:
4307 if (j->dsp.low != 0x20) {
4308 j->play_frame_size = 48;
4309 j->play_mode = 0;
4310 } else {
4311 retval = 1;
4313 break;
4314 case G729:
4315 if (j->dsp.low != 0x20) {
4316 if (!j->flags.g729_loaded) {
4317 retval = 1;
4318 break;
4320 switch (j->baseframe.low) {
4321 case 0xA0:
4322 j->play_frame_size = 10;
4323 break;
4324 case 0x50:
4325 j->play_frame_size = 5;
4326 break;
4327 default:
4328 j->play_frame_size = 15;
4329 break;
4331 j->play_mode = 0;
4332 } else {
4333 retval = 1;
4335 break;
4336 case G729B:
4337 if (j->dsp.low != 0x20) {
4338 if (!j->flags.g729_loaded) {
4339 retval = 1;
4340 break;
4342 switch (j->baseframe.low) {
4343 case 0xA0:
4344 j->play_frame_size = 12;
4345 break;
4346 case 0x50:
4347 j->play_frame_size = 6;
4348 break;
4349 default:
4350 j->play_frame_size = 18;
4351 break;
4353 j->play_mode = 0;
4354 } else {
4355 retval = 1;
4357 break;
4358 case ULAW:
4359 switch (j->baseframe.low) {
4360 case 0xA0:
4361 j->play_frame_size = 80;
4362 break;
4363 case 0x50:
4364 j->play_frame_size = 40;
4365 break;
4366 default:
4367 j->play_frame_size = 120;
4368 break;
4370 j->play_mode = 2;
4371 break;
4372 case ALAW:
4373 switch (j->baseframe.low) {
4374 case 0xA0:
4375 j->play_frame_size = 80;
4376 break;
4377 case 0x50:
4378 j->play_frame_size = 40;
4379 break;
4380 default:
4381 j->play_frame_size = 120;
4382 break;
4384 j->play_mode = 2;
4385 break;
4386 case LINEAR16:
4387 switch (j->baseframe.low) {
4388 case 0xA0:
4389 j->play_frame_size = 160;
4390 break;
4391 case 0x50:
4392 j->play_frame_size = 80;
4393 break;
4394 default:
4395 j->play_frame_size = 240;
4396 break;
4398 j->play_mode = 6;
4399 break;
4400 case LINEAR8:
4401 switch (j->baseframe.low) {
4402 case 0xA0:
4403 j->play_frame_size = 80;
4404 break;
4405 case 0x50:
4406 j->play_frame_size = 40;
4407 break;
4408 default:
4409 j->play_frame_size = 120;
4410 break;
4412 j->play_mode = 4;
4413 break;
4414 case WSS:
4415 switch (j->baseframe.low) {
4416 case 0xA0:
4417 j->play_frame_size = 80;
4418 break;
4419 case 0x50:
4420 j->play_frame_size = 40;
4421 break;
4422 default:
4423 j->play_frame_size = 120;
4424 break;
4426 j->play_mode = 5;
4427 break;
4428 default:
4429 kfree(j->write_buffer);
4430 j->play_frame_size = 0;
4431 j->play_mode = -1;
4432 j->write_buffer = NULL;
4433 j->write_buffer_size = 0;
4434 retval = 1;
4435 break;
4437 return retval;
4440 static int ixj_play_start(IXJ *j)
4442 unsigned short cmd = 0x0000;
4444 if (j->write_buffer) {
4445 ixj_play_stop(j);
4448 if(ixjdebug & 0x0002)
4449 printk("IXJ %d Starting Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4451 j->flags.playing = 1;
4452 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
4454 j->flags.play_first_frame = 1;
4455 j->drybuffer = 0;
4457 if (!j->play_mode) {
4458 switch (j->play_codec) {
4459 case G723_63:
4460 cmd = 0x5231;
4461 break;
4462 case G723_53:
4463 cmd = 0x5232;
4464 break;
4465 case TS85:
4466 cmd = 0x5230; /* TrueSpeech 8.5 */
4468 break;
4469 case TS48:
4470 cmd = 0x5233; /* TrueSpeech 4.8 */
4472 break;
4473 case TS41:
4474 cmd = 0x5234; /* TrueSpeech 4.1 */
4476 break;
4477 case G728:
4478 cmd = 0x5235;
4479 break;
4480 case G729:
4481 case G729B:
4482 cmd = 0x5236;
4483 break;
4484 default:
4485 return 1;
4487 if (ixj_WriteDSPCommand(cmd, j))
4488 return -1;
4490 j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC);
4491 if (!j->write_buffer) {
4492 printk("Write buffer allocation for ixj board %d failed!\n", j->board);
4493 return -ENOMEM;
4495 /* j->write_buffers_empty = 2; */
4496 j->write_buffers_empty = 1;
4497 j->write_buffer_size = j->play_frame_size * 2;
4498 j->write_buffer_end = j->write_buffer + j->play_frame_size * 2;
4499 j->write_buffer_rp = j->write_buffer_wp = j->write_buffer;
4501 if (ixj_WriteDSPCommand(0x5202, j)) /* Set Poll sync mode */
4503 return -1;
4505 switch (j->play_mode) {
4506 case 0:
4507 cmd = 0x2C03;
4508 break;
4509 case 2:
4510 if (j->ver.low == 0x12) {
4511 cmd = 0x2C23;
4512 } else {
4513 cmd = 0x2C21;
4515 break;
4516 case 4:
4517 if (j->ver.low == 0x12) {
4518 cmd = 0x2C43;
4519 } else {
4520 cmd = 0x2C41;
4522 break;
4523 case 5:
4524 if (j->ver.low == 0x12) {
4525 cmd = 0x2C53;
4526 } else {
4527 cmd = 0x2C51;
4529 break;
4530 case 6:
4531 if (j->ver.low == 0x12) {
4532 cmd = 0x2C63;
4533 } else {
4534 cmd = 0x2C61;
4536 break;
4538 if (ixj_WriteDSPCommand(cmd, j))
4539 return -1;
4541 if (ixj_WriteDSPCommand(0x2000, j)) /* Playback C2 */
4542 return -1;
4544 if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j)) /* Playback C3 */
4545 return -1;
4547 if (j->flags.recording) {
4548 ixj_aec_start(j, j->aec_level);
4551 return 0;
4554 static void ixj_play_stop(IXJ *j)
4556 if (ixjdebug & 0x0002)
4557 printk("IXJ %d Stopping Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4559 kfree(j->write_buffer);
4560 j->write_buffer = NULL;
4561 j->write_buffer_size = 0;
4562 if (j->play_mode > -1) {
4563 ixj_WriteDSPCommand(0x5221, j); /* Stop playback and flush buffers. 8022 reference page 9-40 */
4565 j->play_mode = -1;
4567 j->flags.playing = 0;
4570 static inline int get_play_level(IXJ *j)
4572 int retval;
4574 ixj_WriteDSPCommand(0xCF8F, j); /* 8022 Reference page 9-38 */
4575 return j->ssr.high << 8 | j->ssr.low;
4576 retval = j->ssr.high << 8 | j->ssr.low;
4577 retval = (retval * 256) / 240;
4578 return retval;
4581 static unsigned int ixj_poll(struct file *file_p, poll_table * wait)
4583 unsigned int mask = 0;
4585 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
4587 poll_wait(file_p, &(j->poll_q), wait);
4588 if (j->read_buffer_ready > 0)
4589 mask |= POLLIN | POLLRDNORM; /* readable */
4590 if (j->write_buffers_empty > 0)
4591 mask |= POLLOUT | POLLWRNORM; /* writable */
4592 if (j->ex.bytes)
4593 mask |= POLLPRI;
4594 return mask;
4597 static int ixj_play_tone(IXJ *j, char tone)
4599 if (!j->tone_state) {
4600 if(ixjdebug & 0x0002) {
4601 printk("IXJ %d starting tone %d at %ld\n", j->board, tone, jiffies);
4603 if (j->dsp.low == 0x20) {
4604 idle(j);
4606 j->tone_start_jif = jiffies;
4608 j->tone_state = 1;
4611 j->tone_index = tone;
4612 if (ixj_WriteDSPCommand(0x6000 + j->tone_index, j))
4613 return -1;
4615 return 0;
4618 static int ixj_set_tone_on(unsigned short arg, IXJ *j)
4620 j->tone_on_time = arg;
4622 if (ixj_WriteDSPCommand(0x6E04, j)) /* Set Tone On Period */
4624 return -1;
4626 if (ixj_WriteDSPCommand(arg, j))
4627 return -1;
4629 return 0;
4632 static int SCI_WaitHighSCI(IXJ *j)
4634 int cnt;
4636 j->pld_scrr.byte = inb_p(j->XILINXbase);
4637 if (!j->pld_scrr.bits.sci) {
4638 for (cnt = 0; cnt < 10; cnt++) {
4639 udelay(32);
4640 j->pld_scrr.byte = inb_p(j->XILINXbase);
4642 if ((j->pld_scrr.bits.sci))
4643 return 1;
4645 if (ixjdebug & 0x0001)
4646 printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte);
4647 return 0;
4648 } else
4649 return 1;
4652 static int SCI_WaitLowSCI(IXJ *j)
4654 int cnt;
4656 j->pld_scrr.byte = inb_p(j->XILINXbase);
4657 if (j->pld_scrr.bits.sci) {
4658 for (cnt = 0; cnt < 10; cnt++) {
4659 udelay(32);
4660 j->pld_scrr.byte = inb_p(j->XILINXbase);
4662 if (!(j->pld_scrr.bits.sci))
4663 return 1;
4665 if (ixjdebug & 0x0001)
4666 printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte);
4667 return 0;
4668 } else
4669 return 1;
4672 static int SCI_Control(IXJ *j, int control)
4674 switch (control) {
4675 case SCI_End:
4676 j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
4678 j->pld_scrw.bits.c1 = 0; /* to no selection */
4680 break;
4681 case SCI_Enable_DAA:
4682 j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
4684 j->pld_scrw.bits.c1 = 0; /* to write to DAA */
4686 break;
4687 case SCI_Enable_Mixer:
4688 j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
4690 j->pld_scrw.bits.c1 = 1; /* to write to mixer */
4692 break;
4693 case SCI_Enable_EEPROM:
4694 j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
4696 j->pld_scrw.bits.c1 = 1; /* to write to EEPROM */
4698 break;
4699 default:
4700 return 0;
4701 break;
4703 outb_p(j->pld_scrw.byte, j->XILINXbase);
4705 switch (control) {
4706 case SCI_End:
4707 return 1;
4708 break;
4709 case SCI_Enable_DAA:
4710 case SCI_Enable_Mixer:
4711 case SCI_Enable_EEPROM:
4712 if (!SCI_WaitHighSCI(j))
4713 return 0;
4714 break;
4715 default:
4716 return 0;
4717 break;
4719 return 1;
4722 static int SCI_Prepare(IXJ *j)
4724 if (!SCI_Control(j, SCI_End))
4725 return 0;
4727 if (!SCI_WaitLowSCI(j))
4728 return 0;
4730 return 1;
4733 static int ixj_get_mixer(long val, IXJ *j)
4735 int reg = (val & 0x1F00) >> 8;
4736 return j->mix.vol[reg];
4739 static int ixj_mixer(long val, IXJ *j)
4741 BYTES bytes;
4743 bytes.high = (val & 0x1F00) >> 8;
4744 bytes.low = val & 0x00FF;
4746 /* save mixer value so we can get back later on */
4747 j->mix.vol[bytes.high] = bytes.low;
4749 outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03); /* Load Mixer Address */
4751 outb_p(bytes.low, j->XILINXbase + 0x02); /* Load Mixer Data */
4753 SCI_Control(j, SCI_Enable_Mixer);
4755 SCI_Control(j, SCI_End);
4757 return 0;
4760 static int daa_load(BYTES * p_bytes, IXJ *j)
4762 outb_p(p_bytes->high, j->XILINXbase + 0x03);
4763 outb_p(p_bytes->low, j->XILINXbase + 0x02);
4764 if (!SCI_Control(j, SCI_Enable_DAA))
4765 return 0;
4766 else
4767 return 1;
4770 static int ixj_daa_cr4(IXJ *j, char reg)
4772 BYTES bytes;
4774 switch (j->daa_mode) {
4775 case SOP_PU_SLEEP:
4776 bytes.high = 0x14;
4777 break;
4778 case SOP_PU_RINGING:
4779 bytes.high = 0x54;
4780 break;
4781 case SOP_PU_CONVERSATION:
4782 bytes.high = 0x94;
4783 break;
4784 case SOP_PU_PULSEDIALING:
4785 bytes.high = 0xD4;
4786 break;
4789 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg;
4791 switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) {
4792 case 0:
4793 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0;
4794 break;
4795 case 1:
4796 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2;
4797 break;
4798 case 2:
4799 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1;
4800 break;
4801 case 3:
4802 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3;
4803 break;
4806 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
4808 if (!daa_load(&bytes, j))
4809 return 0;
4811 if (!SCI_Prepare(j))
4812 return 0;
4814 return 1;
4817 static char daa_int_read(IXJ *j)
4819 BYTES bytes;
4821 if (!SCI_Prepare(j))
4822 return 0;
4824 bytes.high = 0x38;
4825 bytes.low = 0x00;
4826 outb_p(bytes.high, j->XILINXbase + 0x03);
4827 outb_p(bytes.low, j->XILINXbase + 0x02);
4829 if (!SCI_Control(j, SCI_Enable_DAA))
4830 return 0;
4832 bytes.high = inb_p(j->XILINXbase + 0x03);
4833 bytes.low = inb_p(j->XILINXbase + 0x02);
4834 if (bytes.low != ALISDAA_ID_BYTE) {
4835 if (ixjdebug & 0x0001)
4836 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4837 return 0;
4839 if (!SCI_Control(j, SCI_Enable_DAA))
4840 return 0;
4841 if (!SCI_Control(j, SCI_End))
4842 return 0;
4844 bytes.high = inb_p(j->XILINXbase + 0x03);
4845 bytes.low = inb_p(j->XILINXbase + 0x02);
4847 j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high;
4849 return 1;
4852 static char daa_CR_read(IXJ *j, int cr)
4854 IXJ_WORD wdata;
4855 BYTES bytes;
4857 if (!SCI_Prepare(j))
4858 return 0;
4860 switch (j->daa_mode) {
4861 case SOP_PU_SLEEP:
4862 bytes.high = 0x30 + cr;
4863 break;
4864 case SOP_PU_RINGING:
4865 bytes.high = 0x70 + cr;
4866 break;
4867 case SOP_PU_CONVERSATION:
4868 bytes.high = 0xB0 + cr;
4869 break;
4870 case SOP_PU_PULSEDIALING:
4871 bytes.high = 0xF0 + cr;
4872 break;
4875 bytes.low = 0x00;
4877 outb_p(bytes.high, j->XILINXbase + 0x03);
4878 outb_p(bytes.low, j->XILINXbase + 0x02);
4880 if (!SCI_Control(j, SCI_Enable_DAA))
4881 return 0;
4883 bytes.high = inb_p(j->XILINXbase + 0x03);
4884 bytes.low = inb_p(j->XILINXbase + 0x02);
4885 if (bytes.low != ALISDAA_ID_BYTE) {
4886 if (ixjdebug & 0x0001)
4887 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4888 return 0;
4890 if (!SCI_Control(j, SCI_Enable_DAA))
4891 return 0;
4892 if (!SCI_Control(j, SCI_End))
4893 return 0;
4895 wdata.word = inw_p(j->XILINXbase + 0x02);
4897 switch(cr){
4898 case 5:
4899 j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = wdata.bytes.high;
4900 break;
4901 case 4:
4902 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = wdata.bytes.high;
4903 break;
4904 case 3:
4905 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = wdata.bytes.high;
4906 break;
4907 case 2:
4908 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = wdata.bytes.high;
4909 break;
4910 case 1:
4911 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = wdata.bytes.high;
4912 break;
4913 case 0:
4914 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = wdata.bytes.high;
4915 break;
4916 default:
4917 return 0;
4919 return 1;
4922 static int ixj_daa_cid_reset(IXJ *j)
4924 int i;
4925 BYTES bytes;
4927 if (ixjdebug & 0x0002)
4928 printk("DAA Clearing CID ram\n");
4930 if (!SCI_Prepare(j))
4931 return 0;
4933 bytes.high = 0x58;
4934 bytes.low = 0x00;
4935 outb_p(bytes.high, j->XILINXbase + 0x03);
4936 outb_p(bytes.low, j->XILINXbase + 0x02);
4938 if (!SCI_Control(j, SCI_Enable_DAA))
4939 return 0;
4941 if (!SCI_WaitHighSCI(j))
4942 return 0;
4944 for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) {
4945 bytes.high = bytes.low = 0x00;
4946 outb_p(bytes.high, j->XILINXbase + 0x03);
4948 if (i < ALISDAA_CALLERID_SIZE - 1)
4949 outb_p(bytes.low, j->XILINXbase + 0x02);
4951 if (!SCI_Control(j, SCI_Enable_DAA))
4952 return 0;
4954 if (!SCI_WaitHighSCI(j))
4955 return 0;
4959 if (!SCI_Control(j, SCI_End))
4960 return 0;
4962 if (ixjdebug & 0x0002)
4963 printk("DAA CID ram cleared\n");
4965 return 1;
4968 static int ixj_daa_cid_read(IXJ *j)
4970 int i;
4971 BYTES bytes;
4972 char CID[ALISDAA_CALLERID_SIZE], mContinue;
4973 char *pIn, *pOut;
4975 if (!SCI_Prepare(j))
4976 return 0;
4978 bytes.high = 0x78;
4979 bytes.low = 0x00;
4980 outb_p(bytes.high, j->XILINXbase + 0x03);
4981 outb_p(bytes.low, j->XILINXbase + 0x02);
4983 if (!SCI_Control(j, SCI_Enable_DAA))
4984 return 0;
4986 if (!SCI_WaitHighSCI(j))
4987 return 0;
4989 bytes.high = inb_p(j->XILINXbase + 0x03);
4990 bytes.low = inb_p(j->XILINXbase + 0x02);
4991 if (bytes.low != ALISDAA_ID_BYTE) {
4992 if (ixjdebug & 0x0001)
4993 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4994 return 0;
4996 for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) {
4997 bytes.high = bytes.low = 0x00;
4998 outb_p(bytes.high, j->XILINXbase + 0x03);
4999 outb_p(bytes.low, j->XILINXbase + 0x02);
5001 if (!SCI_Control(j, SCI_Enable_DAA))
5002 return 0;
5004 if (!SCI_WaitHighSCI(j))
5005 return 0;
5007 CID[i + 0] = inb_p(j->XILINXbase + 0x03);
5008 CID[i + 1] = inb_p(j->XILINXbase + 0x02);
5011 if (!SCI_Control(j, SCI_End))
5012 return 0;
5014 pIn = CID;
5015 pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5016 mContinue = 1;
5017 while (mContinue) {
5018 if ((pIn[1] & 0x03) == 0x01) {
5019 pOut[0] = pIn[0];
5021 if ((pIn[2] & 0x0c) == 0x04) {
5022 pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2);
5024 if ((pIn[3] & 0x30) == 0x10) {
5025 pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4);
5027 if ((pIn[4] & 0xc0) == 0x40) {
5028 pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6);
5029 } else {
5030 mContinue = FALSE;
5032 pIn += 5, pOut += 4;
5034 memset(&j->cid, 0, sizeof(PHONE_CID));
5035 pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5036 pOut += 4;
5037 strncpy(j->cid.month, pOut, 2);
5038 pOut += 2;
5039 strncpy(j->cid.day, pOut, 2);
5040 pOut += 2;
5041 strncpy(j->cid.hour, pOut, 2);
5042 pOut += 2;
5043 strncpy(j->cid.min, pOut, 2);
5044 pOut += 3;
5045 j->cid.numlen = *pOut;
5046 pOut += 1;
5047 strncpy(j->cid.number, pOut, j->cid.numlen);
5048 pOut += j->cid.numlen + 1;
5049 j->cid.namelen = *pOut;
5050 pOut += 1;
5051 strncpy(j->cid.name, pOut, j->cid.namelen);
5053 ixj_daa_cid_reset(j);
5054 return 1;
5057 static char daa_get_version(IXJ *j)
5059 BYTES bytes;
5061 if (!SCI_Prepare(j))
5062 return 0;
5064 bytes.high = 0x35;
5065 bytes.low = 0x00;
5066 outb_p(bytes.high, j->XILINXbase + 0x03);
5067 outb_p(bytes.low, j->XILINXbase + 0x02);
5069 if (!SCI_Control(j, SCI_Enable_DAA))
5070 return 0;
5072 bytes.high = inb_p(j->XILINXbase + 0x03);
5073 bytes.low = inb_p(j->XILINXbase + 0x02);
5074 if (bytes.low != ALISDAA_ID_BYTE) {
5075 if (ixjdebug & 0x0001)
5076 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
5077 return 0;
5079 if (!SCI_Control(j, SCI_Enable_DAA))
5080 return 0;
5082 if (!SCI_Control(j, SCI_End))
5083 return 0;
5085 bytes.high = inb_p(j->XILINXbase + 0x03);
5086 bytes.low = inb_p(j->XILINXbase + 0x02);
5087 if (ixjdebug & 0x0002)
5088 printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes.high, bytes.low);
5089 j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high;
5090 return bytes.high;
5093 static int daa_set_mode(IXJ *j, int mode)
5095 /* NOTE:
5096 The DAA *MUST* be in the conversation mode if the
5097 PSTN line is to be seized (PSTN line off-hook).
5098 Taking the PSTN line off-hook while the DAA is in
5099 a mode other than conversation mode will cause a
5100 hardware failure of the ALIS-A part.
5102 NOTE:
5103 The DAA can only go to SLEEP, RINGING or PULSEDIALING modes
5104 if the PSTN line is on-hook. Failure to have the PSTN line
5105 in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE
5106 ALIS-A part.
5109 BYTES bytes;
5111 j->flags.pstn_rmr = 0;
5113 if (!SCI_Prepare(j))
5114 return 0;
5116 switch (mode) {
5117 case SOP_PU_RESET:
5118 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5120 outb_p(j->pld_scrw.byte, j->XILINXbase);
5121 j->pld_slicw.bits.rly2 = 0;
5122 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5123 bytes.high = 0x10;
5124 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5125 daa_load(&bytes, j);
5126 if (!SCI_Prepare(j))
5127 return 0;
5129 j->daa_mode = SOP_PU_SLEEP;
5130 break;
5131 case SOP_PU_SLEEP:
5132 if(j->daa_mode == SOP_PU_SLEEP)
5134 break;
5136 if (ixjdebug & 0x0008)
5137 printk(KERN_INFO "phone DAA: SOP_PU_SLEEP at %ld\n", jiffies);
5138 /* if(j->daa_mode == SOP_PU_CONVERSATION) */
5140 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5142 outb_p(j->pld_scrw.byte, j->XILINXbase);
5143 j->pld_slicw.bits.rly2 = 0;
5144 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5145 bytes.high = 0x10;
5146 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5147 daa_load(&bytes, j);
5148 if (!SCI_Prepare(j))
5149 return 0;
5151 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5153 outb_p(j->pld_scrw.byte, j->XILINXbase);
5154 j->pld_slicw.bits.rly2 = 0;
5155 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5156 bytes.high = 0x10;
5157 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5158 daa_load(&bytes, j);
5159 if (!SCI_Prepare(j))
5160 return 0;
5162 j->daa_mode = SOP_PU_SLEEP;
5163 j->flags.pstn_ringing = 0;
5164 j->ex.bits.pstn_ring = 0;
5165 j->pstn_sleeptil = jiffies + (hertz / 4);
5166 wake_up_interruptible(&j->read_q); /* Wake any blocked readers */
5167 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
5168 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
5169 break;
5170 case SOP_PU_RINGING:
5171 if (ixjdebug & 0x0008)
5172 printk(KERN_INFO "phone DAA: SOP_PU_RINGING at %ld\n", jiffies);
5173 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5175 outb_p(j->pld_scrw.byte, j->XILINXbase);
5176 j->pld_slicw.bits.rly2 = 0;
5177 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5178 bytes.high = 0x50;
5179 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5180 daa_load(&bytes, j);
5181 if (!SCI_Prepare(j))
5182 return 0;
5183 j->daa_mode = SOP_PU_RINGING;
5184 break;
5185 case SOP_PU_CONVERSATION:
5186 if (ixjdebug & 0x0008)
5187 printk(KERN_INFO "phone DAA: SOP_PU_CONVERSATION at %ld\n", jiffies);
5188 bytes.high = 0x90;
5189 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5190 daa_load(&bytes, j);
5191 if (!SCI_Prepare(j))
5192 return 0;
5193 j->pld_slicw.bits.rly2 = 1;
5194 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5195 j->pld_scrw.bits.daafsyncen = 1; /* Turn on DAA Frame Sync */
5197 outb_p(j->pld_scrw.byte, j->XILINXbase);
5198 j->daa_mode = SOP_PU_CONVERSATION;
5199 j->flags.pstn_ringing = 0;
5200 j->ex.bits.pstn_ring = 0;
5201 j->pstn_sleeptil = jiffies;
5202 j->pstn_ring_start = j->pstn_ring_stop = j->pstn_ring_int = 0;
5203 break;
5204 case SOP_PU_PULSEDIALING:
5205 if (ixjdebug & 0x0008)
5206 printk(KERN_INFO "phone DAA: SOP_PU_PULSEDIALING at %ld\n", jiffies);
5207 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5209 outb_p(j->pld_scrw.byte, j->XILINXbase);
5210 j->pld_slicw.bits.rly2 = 0;
5211 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5212 bytes.high = 0xD0;
5213 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5214 daa_load(&bytes, j);
5215 if (!SCI_Prepare(j))
5216 return 0;
5217 j->daa_mode = SOP_PU_PULSEDIALING;
5218 break;
5219 default:
5220 break;
5222 return 1;
5225 static int ixj_daa_write(IXJ *j)
5227 BYTES bytes;
5229 j->flags.pstncheck = 1;
5231 daa_set_mode(j, SOP_PU_SLEEP);
5233 if (!SCI_Prepare(j))
5234 return 0;
5236 outb_p(j->pld_scrw.byte, j->XILINXbase);
5238 bytes.high = 0x14;
5239 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
5240 if (!daa_load(&bytes, j))
5241 return 0;
5243 bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg;
5244 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg;
5245 if (!daa_load(&bytes, j))
5246 return 0;
5248 bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg;
5249 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5250 if (!daa_load(&bytes, j))
5251 return 0;
5253 if (!SCI_Prepare(j))
5254 return 0;
5256 bytes.high = 0x1F;
5257 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg;
5258 if (!daa_load(&bytes, j))
5259 return 0;
5261 bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg;
5262 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg;
5263 if (!daa_load(&bytes, j))
5264 return 0;
5266 bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg;
5267 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg;
5268 if (!daa_load(&bytes, j))
5269 return 0;
5271 bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg;
5272 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg;
5273 if (!daa_load(&bytes, j))
5274 return 0;
5276 bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg;
5277 bytes.low = 0x00;
5278 if (!daa_load(&bytes, j))
5279 return 0;
5281 if (!SCI_Prepare(j))
5282 return 0;
5284 bytes.high = 0x00;
5285 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7];
5286 if (!daa_load(&bytes, j))
5287 return 0;
5289 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6];
5290 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5];
5291 if (!daa_load(&bytes, j))
5292 return 0;
5294 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4];
5295 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3];
5296 if (!daa_load(&bytes, j))
5297 return 0;
5299 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2];
5300 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1];
5301 if (!daa_load(&bytes, j))
5302 return 0;
5304 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0];
5305 bytes.low = 0x00;
5306 if (!daa_load(&bytes, j))
5307 return 0;
5309 if (!SCI_Control(j, SCI_End))
5310 return 0;
5311 if (!SCI_WaitLowSCI(j))
5312 return 0;
5314 bytes.high = 0x01;
5315 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7];
5316 if (!daa_load(&bytes, j))
5317 return 0;
5319 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6];
5320 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5];
5321 if (!daa_load(&bytes, j))
5322 return 0;
5324 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4];
5325 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3];
5326 if (!daa_load(&bytes, j))
5327 return 0;
5329 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2];
5330 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1];
5331 if (!daa_load(&bytes, j))
5332 return 0;
5334 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0];
5335 bytes.low = 0x00;
5336 if (!daa_load(&bytes, j))
5337 return 0;
5339 if (!SCI_Control(j, SCI_End))
5340 return 0;
5341 if (!SCI_WaitLowSCI(j))
5342 return 0;
5344 bytes.high = 0x02;
5345 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7];
5346 if (!daa_load(&bytes, j))
5347 return 0;
5349 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6];
5350 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5];
5351 if (!daa_load(&bytes, j))
5352 return 0;
5354 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4];
5355 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3];
5356 if (!daa_load(&bytes, j))
5357 return 0;
5359 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2];
5360 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1];
5361 if (!daa_load(&bytes, j))
5362 return 0;
5364 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0];
5365 bytes.low = 0x00;
5366 if (!daa_load(&bytes, j))
5367 return 0;
5369 if (!SCI_Control(j, SCI_End))
5370 return 0;
5371 if (!SCI_WaitLowSCI(j))
5372 return 0;
5374 bytes.high = 0x03;
5375 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7];
5376 if (!daa_load(&bytes, j))
5377 return 0;
5379 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6];
5380 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5];
5381 if (!daa_load(&bytes, j))
5382 return 0;
5384 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4];
5385 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3];
5386 if (!daa_load(&bytes, j))
5387 return 0;
5389 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2];
5390 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1];
5391 if (!daa_load(&bytes, j))
5392 return 0;
5394 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0];
5395 bytes.low = 0x00;
5396 if (!daa_load(&bytes, j))
5397 return 0;
5399 if (!SCI_Control(j, SCI_End))
5400 return 0;
5401 if (!SCI_WaitLowSCI(j))
5402 return 0;
5404 bytes.high = 0x04;
5405 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7];
5406 if (!daa_load(&bytes, j))
5407 return 0;
5409 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6];
5410 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5];
5411 if (!daa_load(&bytes, j))
5412 return 0;
5414 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4];
5415 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3];
5416 if (!daa_load(&bytes, j))
5417 return 0;
5419 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2];
5420 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1];
5421 if (!daa_load(&bytes, j))
5422 return 0;
5424 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0];
5425 bytes.low = 0x00;
5426 if (!daa_load(&bytes, j))
5427 return 0;
5429 if (!SCI_Control(j, SCI_End))
5430 return 0;
5431 if (!SCI_WaitLowSCI(j))
5432 return 0;
5434 bytes.high = 0x05;
5435 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7];
5436 if (!daa_load(&bytes, j))
5437 return 0;
5439 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6];
5440 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5];
5441 if (!daa_load(&bytes, j))
5442 return 0;
5444 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4];
5445 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3];
5446 if (!daa_load(&bytes, j))
5447 return 0;
5449 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2];
5450 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1];
5451 if (!daa_load(&bytes, j))
5452 return 0;
5454 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0];
5455 bytes.low = 0x00;
5456 if (!daa_load(&bytes, j))
5457 return 0;
5459 if (!SCI_Control(j, SCI_End))
5460 return 0;
5461 if (!SCI_WaitLowSCI(j))
5462 return 0;
5464 bytes.high = 0x06;
5465 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7];
5466 if (!daa_load(&bytes, j))
5467 return 0;
5469 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6];
5470 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5];
5471 if (!daa_load(&bytes, j))
5472 return 0;
5474 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4];
5475 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3];
5476 if (!daa_load(&bytes, j))
5477 return 0;
5479 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2];
5480 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1];
5481 if (!daa_load(&bytes, j))
5482 return 0;
5484 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0];
5485 bytes.low = 0x00;
5486 if (!daa_load(&bytes, j))
5487 return 0;
5489 if (!SCI_Control(j, SCI_End))
5490 return 0;
5491 if (!SCI_WaitLowSCI(j))
5492 return 0;
5494 bytes.high = 0x07;
5495 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7];
5496 if (!daa_load(&bytes, j))
5497 return 0;
5499 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6];
5500 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5];
5501 if (!daa_load(&bytes, j))
5502 return 0;
5504 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4];
5505 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3];
5506 if (!daa_load(&bytes, j))
5507 return 0;
5509 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2];
5510 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1];
5511 if (!daa_load(&bytes, j))
5512 return 0;
5514 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0];
5515 bytes.low = 0x00;
5516 if (!daa_load(&bytes, j))
5517 return 0;
5519 if (!SCI_Control(j, SCI_End))
5520 return 0;
5521 if (!SCI_WaitLowSCI(j))
5522 return 0;
5524 bytes.high = 0x08;
5525 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7];
5526 if (!daa_load(&bytes, j))
5527 return 0;
5529 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6];
5530 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5];
5531 if (!daa_load(&bytes, j))
5532 return 0;
5534 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4];
5535 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3];
5536 if (!daa_load(&bytes, j))
5537 return 0;
5539 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2];
5540 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1];
5541 if (!daa_load(&bytes, j))
5542 return 0;
5544 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0];
5545 bytes.low = 0x00;
5546 if (!daa_load(&bytes, j))
5547 return 0;
5549 if (!SCI_Control(j, SCI_End))
5550 return 0;
5551 if (!SCI_WaitLowSCI(j))
5552 return 0;
5554 bytes.high = 0x09;
5555 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3];
5556 if (!daa_load(&bytes, j))
5557 return 0;
5559 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2];
5560 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1];
5561 if (!daa_load(&bytes, j))
5562 return 0;
5564 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0];
5565 bytes.low = 0x00;
5566 if (!daa_load(&bytes, j))
5567 return 0;
5569 if (!SCI_Control(j, SCI_End))
5570 return 0;
5571 if (!SCI_WaitLowSCI(j))
5572 return 0;
5574 bytes.high = 0x0A;
5575 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3];
5576 if (!daa_load(&bytes, j))
5577 return 0;
5579 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2];
5580 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1];
5581 if (!daa_load(&bytes, j))
5582 return 0;
5584 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0];
5585 bytes.low = 0x00;
5586 if (!daa_load(&bytes, j))
5587 return 0;
5589 if (!SCI_Control(j, SCI_End))
5590 return 0;
5591 if (!SCI_WaitLowSCI(j))
5592 return 0;
5594 bytes.high = 0x0B;
5595 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3];
5596 if (!daa_load(&bytes, j))
5597 return 0;
5599 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2];
5600 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1];
5601 if (!daa_load(&bytes, j))
5602 return 0;
5604 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0];
5605 bytes.low = 0x00;
5606 if (!daa_load(&bytes, j))
5607 return 0;
5609 if (!SCI_Control(j, SCI_End))
5610 return 0;
5611 if (!SCI_WaitLowSCI(j))
5612 return 0;
5614 bytes.high = 0x0C;
5615 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3];
5616 if (!daa_load(&bytes, j))
5617 return 0;
5619 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2];
5620 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1];
5621 if (!daa_load(&bytes, j))
5622 return 0;
5624 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0];
5625 bytes.low = 0x00;
5626 if (!daa_load(&bytes, j))
5627 return 0;
5629 if (!SCI_Control(j, SCI_End))
5630 return 0;
5631 if (!SCI_WaitLowSCI(j))
5632 return 0;
5634 bytes.high = 0x0D;
5635 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3];
5636 if (!daa_load(&bytes, j))
5637 return 0;
5639 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2];
5640 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1];
5641 if (!daa_load(&bytes, j))
5642 return 0;
5644 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0];
5645 bytes.low = 0x00;
5646 if (!daa_load(&bytes, j))
5647 return 0;
5649 if (!SCI_Control(j, SCI_End))
5650 return 0;
5651 if (!SCI_WaitLowSCI(j))
5652 return 0;
5654 bytes.high = 0x0E;
5655 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7];
5656 if (!daa_load(&bytes, j))
5657 return 0;
5659 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6];
5660 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5];
5661 if (!daa_load(&bytes, j))
5662 return 0;
5664 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4];
5665 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3];
5666 if (!daa_load(&bytes, j))
5667 return 0;
5669 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2];
5670 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1];
5671 if (!daa_load(&bytes, j))
5672 return 0;
5674 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0];
5675 bytes.low = 0x00;
5676 if (!daa_load(&bytes, j))
5677 return 0;
5679 if (!SCI_Control(j, SCI_End))
5680 return 0;
5681 if (!SCI_WaitLowSCI(j))
5682 return 0;
5684 bytes.high = 0x0F;
5685 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7];
5686 if (!daa_load(&bytes, j))
5687 return 0;
5689 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6];
5690 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5];
5691 if (!daa_load(&bytes, j))
5692 return 0;
5694 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4];
5695 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3];
5696 if (!daa_load(&bytes, j))
5697 return 0;
5699 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2];
5700 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1];
5701 if (!daa_load(&bytes, j))
5702 return 0;
5704 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0];
5705 bytes.low = 0x00;
5706 if (!daa_load(&bytes, j))
5707 return 0;
5709 udelay(32);
5710 j->pld_scrr.byte = inb_p(j->XILINXbase);
5711 if (!SCI_Control(j, SCI_End))
5712 return 0;
5714 outb_p(j->pld_scrw.byte, j->XILINXbase);
5716 if (ixjdebug & 0x0002)
5717 printk("DAA Coefficients Loaded\n");
5719 j->flags.pstncheck = 0;
5720 return 1;
5723 static int ixj_set_tone_off(unsigned short arg, IXJ *j)
5725 j->tone_off_time = arg;
5726 if (ixj_WriteDSPCommand(0x6E05, j)) /* Set Tone Off Period */
5728 return -1;
5729 if (ixj_WriteDSPCommand(arg, j))
5730 return -1;
5731 return 0;
5734 static int ixj_get_tone_on(IXJ *j)
5736 if (ixj_WriteDSPCommand(0x6E06, j)) /* Get Tone On Period */
5738 return -1;
5739 return 0;
5742 static int ixj_get_tone_off(IXJ *j)
5744 if (ixj_WriteDSPCommand(0x6E07, j)) /* Get Tone Off Period */
5746 return -1;
5747 return 0;
5750 static void ixj_busytone(IXJ *j)
5752 j->flags.ringback = 0;
5753 j->flags.dialtone = 0;
5754 j->flags.busytone = 1;
5755 ixj_set_tone_on(0x07D0, j);
5756 ixj_set_tone_off(0x07D0, j);
5757 ixj_play_tone(j, 27);
5760 static void ixj_dialtone(IXJ *j)
5762 j->flags.ringback = 0;
5763 j->flags.dialtone = 1;
5764 j->flags.busytone = 0;
5765 if (j->dsp.low == 0x20) {
5766 return;
5767 } else {
5768 ixj_set_tone_on(0xFFFF, j);
5769 ixj_set_tone_off(0x0000, j);
5770 ixj_play_tone(j, 25);
5774 static void ixj_cpt_stop(IXJ *j)
5776 if(j->tone_state || j->tone_cadence_state)
5778 j->flags.dialtone = 0;
5779 j->flags.busytone = 0;
5780 j->flags.ringback = 0;
5781 ixj_set_tone_on(0x0001, j);
5782 ixj_set_tone_off(0x0000, j);
5783 ixj_play_tone(j, 0);
5784 j->tone_state = j->tone_cadence_state = 0;
5785 if (j->cadence_t) {
5786 kfree(j->cadence_t->ce);
5787 kfree(j->cadence_t);
5788 j->cadence_t = NULL;
5791 if (j->play_mode == -1 && j->rec_mode == -1)
5792 idle(j);
5793 if (j->play_mode != -1 && j->dsp.low == 0x20)
5794 ixj_play_start(j);
5795 if (j->rec_mode != -1 && j->dsp.low == 0x20)
5796 ixj_record_start(j);
5799 static void ixj_ringback(IXJ *j)
5801 j->flags.busytone = 0;
5802 j->flags.dialtone = 0;
5803 j->flags.ringback = 1;
5804 ixj_set_tone_on(0x0FA0, j);
5805 ixj_set_tone_off(0x2EE0, j);
5806 ixj_play_tone(j, 26);
5809 static void ixj_testram(IXJ *j)
5811 ixj_WriteDSPCommand(0x3001, j); /* Test External SRAM */
5814 static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp)
5816 ixj_cadence *lcp;
5817 IXJ_CADENCE_ELEMENT __user *cep;
5818 IXJ_CADENCE_ELEMENT *lcep;
5819 IXJ_TONE ti;
5820 int err;
5822 lcp = kmalloc(sizeof(ixj_cadence), GFP_KERNEL);
5823 if (lcp == NULL)
5824 return -ENOMEM;
5826 err = -EFAULT;
5827 if (copy_from_user(&lcp->elements_used,
5828 &cp->elements_used, sizeof(int)))
5829 goto out;
5830 if (copy_from_user(&lcp->termination,
5831 &cp->termination, sizeof(IXJ_CADENCE_TERM)))
5832 goto out;
5833 if (get_user(cep, &cp->ce))
5834 goto out;
5836 err = -EINVAL;
5837 if ((unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE_ELEMENT))
5838 goto out;
5840 err = -ENOMEM;
5841 lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL);
5842 if (!lcep)
5843 goto out;
5845 err = -EFAULT;
5846 if (copy_from_user(lcep, cep, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used))
5847 goto out1;
5849 if (j->cadence_t) {
5850 kfree(j->cadence_t->ce);
5851 kfree(j->cadence_t);
5853 lcp->ce = (void *) lcep;
5854 j->cadence_t = lcp;
5855 j->tone_cadence_state = 0;
5856 ixj_set_tone_on(lcp->ce[0].tone_on_time, j);
5857 ixj_set_tone_off(lcp->ce[0].tone_off_time, j);
5858 if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
5859 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
5860 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
5861 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
5862 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
5863 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
5864 ixj_init_tone(j, &ti);
5866 ixj_play_tone(j, lcp->ce[0].index);
5867 return 1;
5868 out1:
5869 kfree(lcep);
5870 out:
5871 kfree(lcp);
5872 return err;
5875 static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp)
5877 IXJ_FILTER_CADENCE *lcp;
5878 lcp = kmalloc(sizeof(IXJ_FILTER_CADENCE), GFP_KERNEL);
5879 if (lcp == NULL) {
5880 if(ixjdebug & 0x0001) {
5881 printk(KERN_INFO "Could not allocate memory for cadence\n");
5883 return -ENOMEM;
5885 if (copy_from_user(lcp, cp, sizeof(IXJ_FILTER_CADENCE))) {
5886 if(ixjdebug & 0x0001) {
5887 printk(KERN_INFO "Could not copy cadence to kernel\n");
5889 kfree(lcp);
5890 return -EFAULT;
5892 if (lcp->filter > 5) {
5893 if(ixjdebug & 0x0001) {
5894 printk(KERN_INFO "Cadence out of range\n");
5896 kfree(lcp);
5897 return -1;
5899 j->cadence_f[lcp->filter].state = 0;
5900 j->cadence_f[lcp->filter].enable = lcp->enable;
5901 j->filter_en[lcp->filter] = j->cadence_f[lcp->filter].en_filter = lcp->en_filter;
5902 j->cadence_f[lcp->filter].on1 = lcp->on1;
5903 j->cadence_f[lcp->filter].on1min = 0;
5904 j->cadence_f[lcp->filter].on1max = 0;
5905 j->cadence_f[lcp->filter].off1 = lcp->off1;
5906 j->cadence_f[lcp->filter].off1min = 0;
5907 j->cadence_f[lcp->filter].off1max = 0;
5908 j->cadence_f[lcp->filter].on2 = lcp->on2;
5909 j->cadence_f[lcp->filter].on2min = 0;
5910 j->cadence_f[lcp->filter].on2max = 0;
5911 j->cadence_f[lcp->filter].off2 = lcp->off2;
5912 j->cadence_f[lcp->filter].off2min = 0;
5913 j->cadence_f[lcp->filter].off2max = 0;
5914 j->cadence_f[lcp->filter].on3 = lcp->on3;
5915 j->cadence_f[lcp->filter].on3min = 0;
5916 j->cadence_f[lcp->filter].on3max = 0;
5917 j->cadence_f[lcp->filter].off3 = lcp->off3;
5918 j->cadence_f[lcp->filter].off3min = 0;
5919 j->cadence_f[lcp->filter].off3max = 0;
5920 if(ixjdebug & 0x0002) {
5921 printk(KERN_INFO "Cadence %d loaded\n", lcp->filter);
5923 kfree(lcp);
5924 return 0;
5927 static void add_caps(IXJ *j)
5929 j->caps = 0;
5930 j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET;
5931 strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)");
5932 j->caplist[j->caps].captype = vendor;
5933 j->caplist[j->caps].handle = j->caps++;
5934 j->caplist[j->caps].captype = device;
5935 switch (j->cardtype) {
5936 case QTI_PHONEJACK:
5937 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK");
5938 break;
5939 case QTI_LINEJACK:
5940 strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK");
5941 break;
5942 case QTI_PHONEJACK_LITE:
5943 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite");
5944 break;
5945 case QTI_PHONEJACK_PCI:
5946 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI");
5947 break;
5948 case QTI_PHONECARD:
5949 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneCARD");
5950 break;
5952 j->caplist[j->caps].cap = j->cardtype;
5953 j->caplist[j->caps].handle = j->caps++;
5954 strcpy(j->caplist[j->caps].desc, "POTS");
5955 j->caplist[j->caps].captype = port;
5956 j->caplist[j->caps].cap = pots;
5957 j->caplist[j->caps].handle = j->caps++;
5959 /* add devices that can do speaker/mic */
5960 switch (j->cardtype) {
5961 case QTI_PHONEJACK:
5962 case QTI_LINEJACK:
5963 case QTI_PHONEJACK_PCI:
5964 case QTI_PHONECARD:
5965 strcpy(j->caplist[j->caps].desc, "SPEAKER");
5966 j->caplist[j->caps].captype = port;
5967 j->caplist[j->caps].cap = speaker;
5968 j->caplist[j->caps].handle = j->caps++;
5969 default:
5970 break;
5973 /* add devices that can do handset */
5974 switch (j->cardtype) {
5975 case QTI_PHONEJACK:
5976 strcpy(j->caplist[j->caps].desc, "HANDSET");
5977 j->caplist[j->caps].captype = port;
5978 j->caplist[j->caps].cap = handset;
5979 j->caplist[j->caps].handle = j->caps++;
5980 break;
5981 default:
5982 break;
5985 /* add devices that can do PSTN */
5986 switch (j->cardtype) {
5987 case QTI_LINEJACK:
5988 strcpy(j->caplist[j->caps].desc, "PSTN");
5989 j->caplist[j->caps].captype = port;
5990 j->caplist[j->caps].cap = pstn;
5991 j->caplist[j->caps].handle = j->caps++;
5992 break;
5993 default:
5994 break;
5997 /* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */
5998 strcpy(j->caplist[j->caps].desc, "ULAW");
5999 j->caplist[j->caps].captype = codec;
6000 j->caplist[j->caps].cap = ULAW;
6001 j->caplist[j->caps].handle = j->caps++;
6003 strcpy(j->caplist[j->caps].desc, "LINEAR 16 bit");
6004 j->caplist[j->caps].captype = codec;
6005 j->caplist[j->caps].cap = LINEAR16;
6006 j->caplist[j->caps].handle = j->caps++;
6008 strcpy(j->caplist[j->caps].desc, "LINEAR 8 bit");
6009 j->caplist[j->caps].captype = codec;
6010 j->caplist[j->caps].cap = LINEAR8;
6011 j->caplist[j->caps].handle = j->caps++;
6013 strcpy(j->caplist[j->caps].desc, "Windows Sound System");
6014 j->caplist[j->caps].captype = codec;
6015 j->caplist[j->caps].cap = WSS;
6016 j->caplist[j->caps].handle = j->caps++;
6018 /* software ALAW codec, made from ULAW */
6019 strcpy(j->caplist[j->caps].desc, "ALAW");
6020 j->caplist[j->caps].captype = codec;
6021 j->caplist[j->caps].cap = ALAW;
6022 j->caplist[j->caps].handle = j->caps++;
6024 /* version 12 of the 8020 does the following codecs in a broken way */
6025 if (j->dsp.low != 0x20 || j->ver.low != 0x12) {
6026 strcpy(j->caplist[j->caps].desc, "G.723.1 6.3kbps");
6027 j->caplist[j->caps].captype = codec;
6028 j->caplist[j->caps].cap = G723_63;
6029 j->caplist[j->caps].handle = j->caps++;
6031 strcpy(j->caplist[j->caps].desc, "G.723.1 5.3kbps");
6032 j->caplist[j->caps].captype = codec;
6033 j->caplist[j->caps].cap = G723_53;
6034 j->caplist[j->caps].handle = j->caps++;
6036 strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.8kbps");
6037 j->caplist[j->caps].captype = codec;
6038 j->caplist[j->caps].cap = TS48;
6039 j->caplist[j->caps].handle = j->caps++;
6041 strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.1kbps");
6042 j->caplist[j->caps].captype = codec;
6043 j->caplist[j->caps].cap = TS41;
6044 j->caplist[j->caps].handle = j->caps++;
6047 /* 8020 chips can do TS8.5 native, and 8021/8022 can load it */
6048 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
6049 strcpy(j->caplist[j->caps].desc, "TrueSpeech 8.5kbps");
6050 j->caplist[j->caps].captype = codec;
6051 j->caplist[j->caps].cap = TS85;
6052 j->caplist[j->caps].handle = j->caps++;
6055 /* 8021 chips can do G728 */
6056 if (j->dsp.low == 0x21) {
6057 strcpy(j->caplist[j->caps].desc, "G.728 16kbps");
6058 j->caplist[j->caps].captype = codec;
6059 j->caplist[j->caps].cap = G728;
6060 j->caplist[j->caps].handle = j->caps++;
6063 /* 8021/8022 chips can do G729 if loaded */
6064 if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6065 strcpy(j->caplist[j->caps].desc, "G.729A 8kbps");
6066 j->caplist[j->caps].captype = codec;
6067 j->caplist[j->caps].cap = G729;
6068 j->caplist[j->caps].handle = j->caps++;
6070 if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6071 strcpy(j->caplist[j->caps].desc, "G.729B 8kbps");
6072 j->caplist[j->caps].captype = codec;
6073 j->caplist[j->caps].cap = G729B;
6074 j->caplist[j->caps].handle = j->caps++;
6078 static int capabilities_check(IXJ *j, struct phone_capability *pcreq)
6080 int cnt;
6081 int retval = 0;
6082 for (cnt = 0; cnt < j->caps; cnt++) {
6083 if (pcreq->captype == j->caplist[cnt].captype
6084 && pcreq->cap == j->caplist[cnt].cap) {
6085 retval = 1;
6086 break;
6089 return retval;
6092 static int ixj_ioctl(struct inode *inode, struct file *file_p, unsigned int cmd, unsigned long arg)
6094 IXJ_TONE ti;
6095 IXJ_FILTER jf;
6096 IXJ_FILTER_RAW jfr;
6097 void __user *argp = (void __user *)arg;
6099 unsigned int raise, mant;
6100 unsigned int minor = iminor(inode);
6101 int board = NUM(inode);
6103 IXJ *j = get_ixj(NUM(inode));
6105 int retval = 0;
6108 * Set up locks to ensure that only one process is talking to the DSP at a time.
6109 * This is necessary to keep the DSP from locking up.
6111 while(test_and_set_bit(board, (void *)&j->busyflags) != 0)
6112 schedule_timeout_interruptible(1);
6113 if (ixjdebug & 0x0040)
6114 printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6115 if (minor >= IXJMAX) {
6116 clear_bit(board, &j->busyflags);
6117 return -ENODEV;
6120 * Check ioctls only root can use.
6122 if (!capable(CAP_SYS_ADMIN)) {
6123 switch (cmd) {
6124 case IXJCTL_TESTRAM:
6125 case IXJCTL_HZ:
6126 retval = -EPERM;
6129 switch (cmd) {
6130 case IXJCTL_TESTRAM:
6131 ixj_testram(j);
6132 retval = (j->ssr.high << 8) + j->ssr.low;
6133 break;
6134 case IXJCTL_CARDTYPE:
6135 retval = j->cardtype;
6136 break;
6137 case IXJCTL_SERIAL:
6138 retval = j->serial;
6139 break;
6140 case IXJCTL_VERSION:
6142 char arg_str[100];
6143 snprintf(arg_str, sizeof(arg_str),
6144 "\nDriver version %i.%i.%i", IXJ_VER_MAJOR,
6145 IXJ_VER_MINOR, IXJ_BLD_VER);
6146 if (copy_to_user(argp, arg_str, strlen(arg_str)))
6147 retval = -EFAULT;
6149 break;
6150 case PHONE_RING_CADENCE:
6151 j->ring_cadence = arg;
6152 break;
6153 case IXJCTL_CIDCW:
6154 if(arg) {
6155 if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
6156 retval = -EFAULT;
6157 break;
6159 } else {
6160 memset(&j->cid_send, 0, sizeof(PHONE_CID));
6162 ixj_write_cidcw(j);
6163 break;
6164 /* Binary compatbility */
6165 case OLD_PHONE_RING_START:
6166 arg = 0;
6167 /* Fall through */
6168 case PHONE_RING_START:
6169 if(arg) {
6170 if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
6171 retval = -EFAULT;
6172 break;
6174 ixj_write_cid(j);
6175 } else {
6176 memset(&j->cid_send, 0, sizeof(PHONE_CID));
6178 ixj_ring_start(j);
6179 break;
6180 case PHONE_RING_STOP:
6181 j->flags.cringing = 0;
6182 if(j->cadence_f[5].enable) {
6183 j->cadence_f[5].state = 0;
6185 ixj_ring_off(j);
6186 break;
6187 case PHONE_RING:
6188 retval = ixj_ring(j);
6189 break;
6190 case PHONE_EXCEPTION:
6191 retval = j->ex.bytes;
6192 if(j->ex.bits.flash) {
6193 j->flash_end = 0;
6194 j->ex.bits.flash = 0;
6196 j->ex.bits.pstn_ring = 0;
6197 j->ex.bits.caller_id = 0;
6198 j->ex.bits.pstn_wink = 0;
6199 j->ex.bits.f0 = 0;
6200 j->ex.bits.f1 = 0;
6201 j->ex.bits.f2 = 0;
6202 j->ex.bits.f3 = 0;
6203 j->ex.bits.fc0 = 0;
6204 j->ex.bits.fc1 = 0;
6205 j->ex.bits.fc2 = 0;
6206 j->ex.bits.fc3 = 0;
6207 j->ex.bits.reserved = 0;
6208 break;
6209 case PHONE_HOOKSTATE:
6210 j->ex.bits.hookstate = 0;
6211 retval = j->hookstate; //j->r_hook;
6212 break;
6213 case IXJCTL_SET_LED:
6214 LED_SetState(arg, j);
6215 break;
6216 case PHONE_FRAME:
6217 retval = set_base_frame(j, arg);
6218 break;
6219 case PHONE_REC_CODEC:
6220 retval = set_rec_codec(j, arg);
6221 break;
6222 case PHONE_VAD:
6223 ixj_vad(j, arg);
6224 break;
6225 case PHONE_REC_START:
6226 ixj_record_start(j);
6227 break;
6228 case PHONE_REC_STOP:
6229 ixj_record_stop(j);
6230 break;
6231 case PHONE_REC_DEPTH:
6232 set_rec_depth(j, arg);
6233 break;
6234 case PHONE_REC_VOLUME:
6235 if(arg == -1) {
6236 retval = get_rec_volume(j);
6238 else {
6239 set_rec_volume(j, arg);
6240 retval = arg;
6242 break;
6243 case PHONE_REC_VOLUME_LINEAR:
6244 if(arg == -1) {
6245 retval = get_rec_volume_linear(j);
6247 else {
6248 set_rec_volume_linear(j, arg);
6249 retval = arg;
6251 break;
6252 case IXJCTL_DTMF_PRESCALE:
6253 if(arg == -1) {
6254 retval = get_dtmf_prescale(j);
6256 else {
6257 set_dtmf_prescale(j, arg);
6258 retval = arg;
6260 break;
6261 case PHONE_REC_LEVEL:
6262 retval = get_rec_level(j);
6263 break;
6264 case IXJCTL_SC_RXG:
6265 retval = ixj_siadc(j, arg);
6266 break;
6267 case IXJCTL_SC_TXG:
6268 retval = ixj_sidac(j, arg);
6269 break;
6270 case IXJCTL_AEC_START:
6271 ixj_aec_start(j, arg);
6272 break;
6273 case IXJCTL_AEC_STOP:
6274 aec_stop(j);
6275 break;
6276 case IXJCTL_AEC_GET_LEVEL:
6277 retval = j->aec_level;
6278 break;
6279 case PHONE_PLAY_CODEC:
6280 retval = set_play_codec(j, arg);
6281 break;
6282 case PHONE_PLAY_START:
6283 retval = ixj_play_start(j);
6284 break;
6285 case PHONE_PLAY_STOP:
6286 ixj_play_stop(j);
6287 break;
6288 case PHONE_PLAY_DEPTH:
6289 set_play_depth(j, arg);
6290 break;
6291 case PHONE_PLAY_VOLUME:
6292 if(arg == -1) {
6293 retval = get_play_volume(j);
6295 else {
6296 set_play_volume(j, arg);
6297 retval = arg;
6299 break;
6300 case PHONE_PLAY_VOLUME_LINEAR:
6301 if(arg == -1) {
6302 retval = get_play_volume_linear(j);
6304 else {
6305 set_play_volume_linear(j, arg);
6306 retval = arg;
6308 break;
6309 case PHONE_PLAY_LEVEL:
6310 retval = get_play_level(j);
6311 break;
6312 case IXJCTL_DSP_TYPE:
6313 retval = (j->dsp.high << 8) + j->dsp.low;
6314 break;
6315 case IXJCTL_DSP_VERSION:
6316 retval = (j->ver.high << 8) + j->ver.low;
6317 break;
6318 case IXJCTL_HZ:
6319 hertz = arg;
6320 break;
6321 case IXJCTL_RATE:
6322 if (arg > hertz)
6323 retval = -1;
6324 else
6325 samplerate = arg;
6326 break;
6327 case IXJCTL_DRYBUFFER_READ:
6328 put_user(j->drybuffer, (unsigned long __user *) argp);
6329 break;
6330 case IXJCTL_DRYBUFFER_CLEAR:
6331 j->drybuffer = 0;
6332 break;
6333 case IXJCTL_FRAMES_READ:
6334 put_user(j->framesread, (unsigned long __user *) argp);
6335 break;
6336 case IXJCTL_FRAMES_WRITTEN:
6337 put_user(j->frameswritten, (unsigned long __user *) argp);
6338 break;
6339 case IXJCTL_READ_WAIT:
6340 put_user(j->read_wait, (unsigned long __user *) argp);
6341 break;
6342 case IXJCTL_WRITE_WAIT:
6343 put_user(j->write_wait, (unsigned long __user *) argp);
6344 break;
6345 case PHONE_MAXRINGS:
6346 j->maxrings = arg;
6347 break;
6348 case PHONE_SET_TONE_ON_TIME:
6349 ixj_set_tone_on(arg, j);
6350 break;
6351 case PHONE_SET_TONE_OFF_TIME:
6352 ixj_set_tone_off(arg, j);
6353 break;
6354 case PHONE_GET_TONE_ON_TIME:
6355 if (ixj_get_tone_on(j)) {
6356 retval = -1;
6357 } else {
6358 retval = (j->ssr.high << 8) + j->ssr.low;
6360 break;
6361 case PHONE_GET_TONE_OFF_TIME:
6362 if (ixj_get_tone_off(j)) {
6363 retval = -1;
6364 } else {
6365 retval = (j->ssr.high << 8) + j->ssr.low;
6367 break;
6368 case PHONE_PLAY_TONE:
6369 if (!j->tone_state)
6370 retval = ixj_play_tone(j, arg);
6371 else
6372 retval = -1;
6373 break;
6374 case PHONE_GET_TONE_STATE:
6375 retval = j->tone_state;
6376 break;
6377 case PHONE_DTMF_READY:
6378 retval = j->ex.bits.dtmf_ready;
6379 break;
6380 case PHONE_GET_DTMF:
6381 if (ixj_hookstate(j)) {
6382 if (j->dtmf_rp != j->dtmf_wp) {
6383 retval = j->dtmfbuffer[j->dtmf_rp];
6384 j->dtmf_rp++;
6385 if (j->dtmf_rp == 79)
6386 j->dtmf_rp = 0;
6387 if (j->dtmf_rp == j->dtmf_wp) {
6388 j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6392 break;
6393 case PHONE_GET_DTMF_ASCII:
6394 if (ixj_hookstate(j)) {
6395 if (j->dtmf_rp != j->dtmf_wp) {
6396 switch (j->dtmfbuffer[j->dtmf_rp]) {
6397 case 10:
6398 retval = 42; /* '*'; */
6400 break;
6401 case 11:
6402 retval = 48; /*'0'; */
6404 break;
6405 case 12:
6406 retval = 35; /*'#'; */
6408 break;
6409 case 28:
6410 retval = 65; /*'A'; */
6412 break;
6413 case 29:
6414 retval = 66; /*'B'; */
6416 break;
6417 case 30:
6418 retval = 67; /*'C'; */
6420 break;
6421 case 31:
6422 retval = 68; /*'D'; */
6424 break;
6425 default:
6426 retval = 48 + j->dtmfbuffer[j->dtmf_rp];
6427 break;
6429 j->dtmf_rp++;
6430 if (j->dtmf_rp == 79)
6431 j->dtmf_rp = 0;
6432 if(j->dtmf_rp == j->dtmf_wp)
6434 j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6438 break;
6439 case PHONE_DTMF_OOB:
6440 j->flags.dtmf_oob = arg;
6441 break;
6442 case PHONE_DIALTONE:
6443 ixj_dialtone(j);
6444 break;
6445 case PHONE_BUSY:
6446 ixj_busytone(j);
6447 break;
6448 case PHONE_RINGBACK:
6449 ixj_ringback(j);
6450 break;
6451 case PHONE_WINK:
6452 if(j->cardtype == QTI_PHONEJACK)
6453 retval = -1;
6454 else
6455 retval = ixj_wink(j);
6456 break;
6457 case PHONE_CPT_STOP:
6458 ixj_cpt_stop(j);
6459 break;
6460 case PHONE_QUERY_CODEC:
6462 struct phone_codec_data pd;
6463 int val;
6464 int proto_size[] = {
6466 12, 10, 16, 9, 8, 48, 5,
6467 40, 40, 80, 40, 40, 6
6469 if(copy_from_user(&pd, argp, sizeof(pd))) {
6470 retval = -EFAULT;
6471 break;
6473 if(pd.type<1 || pd.type>13) {
6474 retval = -EPROTONOSUPPORT;
6475 break;
6477 if(pd.type<G729)
6478 val=proto_size[pd.type];
6479 else switch(j->baseframe.low)
6481 case 0xA0:val=2*proto_size[pd.type];break;
6482 case 0x50:val=proto_size[pd.type];break;
6483 default:val=proto_size[pd.type]*3;break;
6485 pd.buf_min=pd.buf_max=pd.buf_opt=val;
6486 if(copy_to_user(argp, &pd, sizeof(pd)))
6487 retval = -EFAULT;
6488 break;
6490 case IXJCTL_DSP_IDLE:
6491 idle(j);
6492 break;
6493 case IXJCTL_MIXER:
6494 if ((arg & 0xff) == 0xff)
6495 retval = ixj_get_mixer(arg, j);
6496 else
6497 ixj_mixer(arg, j);
6498 break;
6499 case IXJCTL_DAA_COEFF_SET:
6500 switch (arg) {
6501 case DAA_US:
6502 DAA_Coeff_US(j);
6503 retval = ixj_daa_write(j);
6504 break;
6505 case DAA_UK:
6506 DAA_Coeff_UK(j);
6507 retval = ixj_daa_write(j);
6508 break;
6509 case DAA_FRANCE:
6510 DAA_Coeff_France(j);
6511 retval = ixj_daa_write(j);
6512 break;
6513 case DAA_GERMANY:
6514 DAA_Coeff_Germany(j);
6515 retval = ixj_daa_write(j);
6516 break;
6517 case DAA_AUSTRALIA:
6518 DAA_Coeff_Australia(j);
6519 retval = ixj_daa_write(j);
6520 break;
6521 case DAA_JAPAN:
6522 DAA_Coeff_Japan(j);
6523 retval = ixj_daa_write(j);
6524 break;
6525 default:
6526 retval = 1;
6527 break;
6529 break;
6530 case IXJCTL_DAA_AGAIN:
6531 ixj_daa_cr4(j, arg | 0x02);
6532 break;
6533 case IXJCTL_PSTN_LINETEST:
6534 retval = ixj_linetest(j);
6535 break;
6536 case IXJCTL_VMWI:
6537 ixj_write_vmwi(j, arg);
6538 break;
6539 case IXJCTL_CID:
6540 if (copy_to_user(argp, &j->cid, sizeof(PHONE_CID)))
6541 retval = -EFAULT;
6542 j->ex.bits.caller_id = 0;
6543 break;
6544 case IXJCTL_WINK_DURATION:
6545 j->winktime = arg;
6546 break;
6547 case IXJCTL_PORT:
6548 if (arg)
6549 retval = ixj_set_port(j, arg);
6550 else
6551 retval = j->port;
6552 break;
6553 case IXJCTL_POTS_PSTN:
6554 retval = ixj_set_pots(j, arg);
6555 break;
6556 case PHONE_CAPABILITIES:
6557 add_caps(j);
6558 retval = j->caps;
6559 break;
6560 case PHONE_CAPABILITIES_LIST:
6561 add_caps(j);
6562 if (copy_to_user(argp, j->caplist, sizeof(struct phone_capability) * j->caps))
6563 retval = -EFAULT;
6564 break;
6565 case PHONE_CAPABILITIES_CHECK:
6567 struct phone_capability cap;
6568 if (copy_from_user(&cap, argp, sizeof(cap)))
6569 retval = -EFAULT;
6570 else {
6571 add_caps(j);
6572 retval = capabilities_check(j, &cap);
6575 break;
6576 case PHONE_PSTN_SET_STATE:
6577 daa_set_mode(j, arg);
6578 break;
6579 case PHONE_PSTN_GET_STATE:
6580 retval = j->daa_mode;
6581 j->ex.bits.pstn_ring = 0;
6582 break;
6583 case IXJCTL_SET_FILTER:
6584 if (copy_from_user(&jf, argp, sizeof(jf)))
6585 retval = -EFAULT;
6586 retval = ixj_init_filter(j, &jf);
6587 break;
6588 case IXJCTL_SET_FILTER_RAW:
6589 if (copy_from_user(&jfr, argp, sizeof(jfr)))
6590 retval = -EFAULT;
6591 else
6592 retval = ixj_init_filter_raw(j, &jfr);
6593 break;
6594 case IXJCTL_GET_FILTER_HIST:
6595 if(arg<0||arg>3)
6596 retval = -EINVAL;
6597 else
6598 retval = j->filter_hist[arg];
6599 break;
6600 case IXJCTL_INIT_TONE:
6601 if (copy_from_user(&ti, argp, sizeof(ti)))
6602 retval = -EFAULT;
6603 else
6604 retval = ixj_init_tone(j, &ti);
6605 break;
6606 case IXJCTL_TONE_CADENCE:
6607 retval = ixj_build_cadence(j, argp);
6608 break;
6609 case IXJCTL_FILTER_CADENCE:
6610 retval = ixj_build_filter_cadence(j, argp);
6611 break;
6612 case IXJCTL_SIGCTL:
6613 if (copy_from_user(&j->sigdef, argp, sizeof(IXJ_SIGDEF))) {
6614 retval = -EFAULT;
6615 break;
6617 j->ixj_signals[j->sigdef.event] = j->sigdef.signal;
6618 if(j->sigdef.event < 33) {
6619 raise = 1;
6620 for(mant = 0; mant < j->sigdef.event; mant++){
6621 raise *= 2;
6623 if(j->sigdef.signal)
6624 j->ex_sig.bytes |= raise;
6625 else
6626 j->ex_sig.bytes &= (raise^0xffff);
6628 break;
6629 case IXJCTL_INTERCOM_STOP:
6630 if(arg < 0 || arg >= IXJMAX)
6631 return -EINVAL;
6632 j->intercom = -1;
6633 ixj_record_stop(j);
6634 ixj_play_stop(j);
6635 idle(j);
6636 get_ixj(arg)->intercom = -1;
6637 ixj_record_stop(get_ixj(arg));
6638 ixj_play_stop(get_ixj(arg));
6639 idle(get_ixj(arg));
6640 break;
6641 case IXJCTL_INTERCOM_START:
6642 if(arg < 0 || arg >= IXJMAX)
6643 return -EINVAL;
6644 j->intercom = arg;
6645 ixj_record_start(j);
6646 ixj_play_start(j);
6647 get_ixj(arg)->intercom = board;
6648 ixj_play_start(get_ixj(arg));
6649 ixj_record_start(get_ixj(arg));
6650 break;
6652 if (ixjdebug & 0x0040)
6653 printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6654 clear_bit(board, &j->busyflags);
6655 return retval;
6658 static int ixj_fasync(int fd, struct file *file_p, int mode)
6660 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
6662 return fasync_helper(fd, file_p, mode, &j->async_queue);
6665 static struct file_operations ixj_fops =
6667 .owner = THIS_MODULE,
6668 .read = ixj_enhanced_read,
6669 .write = ixj_enhanced_write,
6670 .poll = ixj_poll,
6671 .ioctl = ixj_ioctl,
6672 .release = ixj_release,
6673 .fasync = ixj_fasync
6676 static int ixj_linetest(IXJ *j)
6678 j->flags.pstncheck = 1; /* Testing */
6679 j->flags.pstn_present = 0; /* Assume the line is not there */
6681 daa_int_read(j); /*Clear DAA Interrupt flags */
6682 /* */
6683 /* Hold all relays in the normally de-energized position. */
6684 /* */
6686 j->pld_slicw.bits.rly1 = 0;
6687 j->pld_slicw.bits.rly2 = 0;
6688 j->pld_slicw.bits.rly3 = 0;
6689 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6690 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6692 outb_p(j->pld_scrw.byte, j->XILINXbase);
6693 j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
6694 if (j->pld_slicr.bits.potspstn) {
6695 j->flags.pots_pstn = 1;
6696 j->flags.pots_correct = 0;
6697 LED_SetState(0x4, j);
6698 } else {
6699 j->flags.pots_pstn = 0;
6700 j->pld_slicw.bits.rly1 = 0;
6701 j->pld_slicw.bits.rly2 = 0;
6702 j->pld_slicw.bits.rly3 = 1;
6703 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6704 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6706 outb_p(j->pld_scrw.byte, j->XILINXbase);
6707 daa_set_mode(j, SOP_PU_CONVERSATION);
6708 msleep(1000);
6709 daa_int_read(j);
6710 daa_set_mode(j, SOP_PU_RESET);
6711 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6712 j->flags.pots_correct = 0; /* Should not be line voltage on POTS port. */
6713 LED_SetState(0x4, j);
6714 j->pld_slicw.bits.rly3 = 0;
6715 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6716 } else {
6717 j->flags.pots_correct = 1;
6718 LED_SetState(0x8, j);
6719 j->pld_slicw.bits.rly1 = 1;
6720 j->pld_slicw.bits.rly2 = 0;
6721 j->pld_slicw.bits.rly3 = 0;
6722 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6725 j->pld_slicw.bits.rly3 = 0;
6726 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6727 daa_set_mode(j, SOP_PU_CONVERSATION);
6728 msleep(1000);
6729 daa_int_read(j);
6730 daa_set_mode(j, SOP_PU_RESET);
6731 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6732 j->pstn_sleeptil = jiffies + (hertz / 4);
6733 j->flags.pstn_present = 1;
6734 } else {
6735 j->flags.pstn_present = 0;
6737 if (j->flags.pstn_present) {
6738 if (j->flags.pots_correct) {
6739 LED_SetState(0xA, j);
6740 } else {
6741 LED_SetState(0x6, j);
6743 } else {
6744 if (j->flags.pots_correct) {
6745 LED_SetState(0x9, j);
6746 } else {
6747 LED_SetState(0x5, j);
6750 j->flags.pstncheck = 0; /* Testing */
6751 return j->flags.pstn_present;
6754 static int ixj_selfprobe(IXJ *j)
6756 unsigned short cmd;
6757 int cnt;
6758 BYTES bytes;
6760 init_waitqueue_head(&j->poll_q);
6761 init_waitqueue_head(&j->read_q);
6762 init_waitqueue_head(&j->write_q);
6764 while(atomic_read(&j->DSPWrite) > 0)
6765 atomic_dec(&j->DSPWrite);
6766 if (ixjdebug & 0x0002)
6767 printk(KERN_INFO "Write IDLE to Software Control Register\n");
6768 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
6770 if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */
6771 return -1;
6772 /* The read values of the SSR should be 0x00 for the IDLE command */
6773 if (j->ssr.low || j->ssr.high)
6774 return -1;
6775 if (ixjdebug & 0x0002)
6776 printk(KERN_INFO "Get Device ID Code\n");
6777 if (ixj_WriteDSPCommand(0x3400, j)) /* Get Device ID Code */
6778 return -1;
6779 j->dsp.low = j->ssr.low;
6780 j->dsp.high = j->ssr.high;
6781 if (ixjdebug & 0x0002)
6782 printk(KERN_INFO "Get Device Version Code\n");
6783 if (ixj_WriteDSPCommand(0x3800, j)) /* Get Device Version Code */
6784 return -1;
6785 j->ver.low = j->ssr.low;
6786 j->ver.high = j->ssr.high;
6787 if (!j->cardtype) {
6788 if (j->dsp.low == 0x21) {
6789 bytes.high = bytes.low = inb_p(j->XILINXbase + 0x02);
6790 outb_p(bytes.low ^ 0xFF, j->XILINXbase + 0x02);
6791 /* Test for Internet LineJACK or Internet PhoneJACK Lite */
6792 bytes.low = inb_p(j->XILINXbase + 0x02);
6793 if (bytes.low == bytes.high) /* Register is read only on */
6794 /* Internet PhoneJack Lite */
6796 j->cardtype = QTI_PHONEJACK_LITE;
6797 if (!request_region(j->XILINXbase, 4, "ixj control")) {
6798 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6799 return -1;
6801 j->pld_slicw.pcib.e1 = 1;
6802 outb_p(j->pld_slicw.byte, j->XILINXbase);
6803 } else {
6804 j->cardtype = QTI_LINEJACK;
6806 if (!request_region(j->XILINXbase, 8, "ixj control")) {
6807 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6808 return -1;
6811 } else if (j->dsp.low == 0x22) {
6812 j->cardtype = QTI_PHONEJACK_PCI;
6813 request_region(j->XILINXbase, 4, "ixj control");
6814 j->pld_slicw.pcib.e1 = 1;
6815 outb_p(j->pld_slicw.byte, j->XILINXbase);
6816 } else
6817 j->cardtype = QTI_PHONEJACK;
6818 } else {
6819 switch (j->cardtype) {
6820 case QTI_PHONEJACK:
6821 if (!j->dsp.low != 0x20) {
6822 j->dsp.high = 0x80;
6823 j->dsp.low = 0x20;
6824 ixj_WriteDSPCommand(0x3800, j);
6825 j->ver.low = j->ssr.low;
6826 j->ver.high = j->ssr.high;
6828 break;
6829 case QTI_LINEJACK:
6830 if (!request_region(j->XILINXbase, 8, "ixj control")) {
6831 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6832 return -1;
6834 break;
6835 case QTI_PHONEJACK_LITE:
6836 case QTI_PHONEJACK_PCI:
6837 if (!request_region(j->XILINXbase, 4, "ixj control")) {
6838 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6839 return -1;
6841 j->pld_slicw.pcib.e1 = 1;
6842 outb_p(j->pld_slicw.byte, j->XILINXbase);
6843 break;
6844 case QTI_PHONECARD:
6845 break;
6848 if (j->dsp.low == 0x20 || j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
6849 if (ixjdebug & 0x0002)
6850 printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6851 if (ixj_WriteDSPCommand(0xC462, j)) /* Write CODEC config to Software Control Register */
6852 return -1;
6853 if (ixjdebug & 0x0002)
6854 printk(KERN_INFO "Write CODEC timing to Software Control Register\n");
6855 if (j->cardtype == QTI_PHONEJACK) {
6856 cmd = 0x9FF2;
6857 } else {
6858 cmd = 0x9FF5;
6860 if (ixj_WriteDSPCommand(cmd, j)) /* Write CODEC timing to Software Control Register */
6861 return -1;
6862 } else {
6863 if (set_base_frame(j, 30) != 30)
6864 return -1;
6865 if (ixjdebug & 0x0002)
6866 printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6867 if (j->cardtype == QTI_PHONECARD) {
6868 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
6869 return -1;
6871 if (j->cardtype == QTI_LINEJACK) {
6872 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
6873 return -1;
6874 if (ixjdebug & 0x0002)
6875 printk(KERN_INFO "Turn on the PLD Clock at 8Khz\n");
6876 j->pld_clock.byte = 0;
6877 outb_p(j->pld_clock.byte, j->XILINXbase + 0x04);
6881 if (j->dsp.low == 0x20) {
6882 if (ixjdebug & 0x0002)
6883 printk(KERN_INFO "Configure GPIO pins\n");
6884 j->gpio.bytes.high = 0x09;
6885 /* bytes.low = 0xEF; 0xF7 */
6886 j->gpio.bits.gpio1 = 1;
6887 j->gpio.bits.gpio2 = 1;
6888 j->gpio.bits.gpio3 = 0;
6889 j->gpio.bits.gpio4 = 1;
6890 j->gpio.bits.gpio5 = 1;
6891 j->gpio.bits.gpio6 = 1;
6892 j->gpio.bits.gpio7 = 1;
6893 ixj_WriteDSPCommand(j->gpio.word, j); /* Set GPIO pin directions */
6894 if (ixjdebug & 0x0002)
6895 printk(KERN_INFO "Enable SLIC\n");
6896 j->gpio.bytes.high = 0x0B;
6897 j->gpio.bytes.low = 0x00;
6898 j->gpio.bits.gpio1 = 0;
6899 j->gpio.bits.gpio2 = 1;
6900 j->gpio.bits.gpio5 = 0;
6901 ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring stop signal */
6902 j->port = PORT_POTS;
6903 } else {
6904 if (j->cardtype == QTI_LINEJACK) {
6905 LED_SetState(0x1, j);
6906 msleep(100);
6907 LED_SetState(0x2, j);
6908 msleep(100);
6909 LED_SetState(0x4, j);
6910 msleep(100);
6911 LED_SetState(0x8, j);
6912 msleep(100);
6913 LED_SetState(0x0, j);
6914 daa_get_version(j);
6915 if (ixjdebug & 0x0002)
6916 printk("Loading DAA Coefficients\n");
6917 DAA_Coeff_US(j);
6918 if (!ixj_daa_write(j)) {
6919 printk("DAA write failed on board %d\n", j->board);
6920 return -1;
6922 if(!ixj_daa_cid_reset(j)) {
6923 printk("DAA CID reset failed on board %d\n", j->board);
6924 return -1;
6926 j->flags.pots_correct = 0;
6927 j->flags.pstn_present = 0;
6928 ixj_linetest(j);
6929 if (j->flags.pots_correct) {
6930 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6932 outb_p(j->pld_scrw.byte, j->XILINXbase);
6933 j->pld_slicw.bits.rly1 = 1;
6934 j->pld_slicw.bits.spken = 1;
6935 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6936 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
6937 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
6938 j->port = PORT_POTS;
6940 ixj_set_port(j, PORT_PSTN);
6941 ixj_set_pots(j, 1);
6942 if (ixjdebug & 0x0002)
6943 printk(KERN_INFO "Enable Mixer\n");
6944 ixj_mixer(0x0000, j); /*Master Volume Left unmute 0db */
6945 ixj_mixer(0x0100, j); /*Master Volume Right unmute 0db */
6947 ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
6948 ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
6950 ixj_mixer(0x0480, j); /*FM Left mute */
6951 ixj_mixer(0x0580, j); /*FM Right mute */
6953 ixj_mixer(0x0680, j); /*CD Left mute */
6954 ixj_mixer(0x0780, j); /*CD Right mute */
6956 ixj_mixer(0x0880, j); /*Line Left mute */
6957 ixj_mixer(0x0980, j); /*Line Right mute */
6959 ixj_mixer(0x0A80, j); /*Aux left mute */
6960 ixj_mixer(0x0B80, j); /*Aux right mute */
6962 ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
6963 ixj_mixer(0x0D80, j); /*Mono2 mute */
6965 ixj_mixer(0x0E80, j); /*Mic mute */
6967 ixj_mixer(0x0F00, j); /*Mono Out Volume unmute 0db */
6969 ixj_mixer(0x1000, j); /*Voice Left and Right out only */
6970 ixj_mixer(0x110C, j);
6973 ixj_mixer(0x1200, j); /*Mono1 switch on mixer left */
6974 ixj_mixer(0x1401, j);
6976 ixj_mixer(0x1300, j); /*Mono1 switch on mixer right */
6977 ixj_mixer(0x1501, j);
6979 ixj_mixer(0x1700, j); /*Clock select */
6981 ixj_mixer(0x1800, j); /*ADC input from mixer */
6983 ixj_mixer(0x1901, j); /*Mic gain 30db */
6985 if (ixjdebug & 0x0002)
6986 printk(KERN_INFO "Setting Default US Ring Cadence Detection\n");
6987 j->cadence_f[4].state = 0;
6988 j->cadence_f[4].on1 = 0; /*Cadence Filter 4 is used for PSTN ring cadence */
6989 j->cadence_f[4].off1 = 0;
6990 j->cadence_f[4].on2 = 0;
6991 j->cadence_f[4].off2 = 0;
6992 j->cadence_f[4].on3 = 0;
6993 j->cadence_f[4].off3 = 0; /* These should represent standard US ring pulse. */
6994 j->pstn_last_rmr = jiffies;
6996 } else {
6997 if (j->cardtype == QTI_PHONECARD) {
6998 ixj_WriteDSPCommand(0xCF07, j);
6999 ixj_WriteDSPCommand(0x00B0, j);
7000 ixj_set_port(j, PORT_SPEAKER);
7001 } else {
7002 ixj_set_port(j, PORT_POTS);
7003 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
7004 /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
7009 j->intercom = -1;
7010 j->framesread = j->frameswritten = 0;
7011 j->read_wait = j->write_wait = 0;
7012 j->rxreadycheck = j->txreadycheck = 0;
7014 /* initialise the DTMF prescale to a sensible value */
7015 if (j->cardtype == QTI_LINEJACK) {
7016 set_dtmf_prescale(j, 0x10);
7017 } else {
7018 set_dtmf_prescale(j, 0x40);
7020 set_play_volume(j, 0x100);
7021 set_rec_volume(j, 0x100);
7023 if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */
7024 return -1;
7025 /* The read values of the SSR should be 0x00 for the IDLE command */
7026 if (j->ssr.low || j->ssr.high)
7027 return -1;
7029 if (ixjdebug & 0x0002)
7030 printk(KERN_INFO "Enable Line Monitor\n");
7032 if (ixjdebug & 0x0002)
7033 printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n");
7035 if (ixj_WriteDSPCommand(0x7E01, j)) /* Asynchronous Line Monitor */
7036 return -1;
7038 if (ixjdebug & 0x002)
7039 printk(KERN_INFO "Enable DTMF Detectors\n");
7041 if (ixj_WriteDSPCommand(0x5151, j)) /* Enable DTMF detection */
7042 return -1;
7044 if (ixj_WriteDSPCommand(0x6E01, j)) /* Set Asyncronous Tone Generation */
7045 return -1;
7047 set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */
7049 set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */
7051 j->ex.bits.dtmf_ready = 0;
7052 j->dtmf_state = 0;
7053 j->dtmf_wp = j->dtmf_rp = 0;
7054 j->rec_mode = j->play_mode = -1;
7055 j->flags.ringing = 0;
7056 j->maxrings = MAXRINGS;
7057 j->ring_cadence = USA_RING_CADENCE;
7058 j->drybuffer = 0;
7059 j->winktime = 320;
7060 j->flags.dtmf_oob = 0;
7061 for (cnt = 0; cnt < 4; cnt++)
7062 j->cadence_f[cnt].enable = 0;
7063 /* must be a device on the specified address */
7064 ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
7066 /* Set up the default signals for events */
7067 for (cnt = 0; cnt < 35; cnt++)
7068 j->ixj_signals[cnt] = SIGIO;
7070 /* Set the excetion signal enable flags */
7071 j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
7072 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 =
7073 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;
7074 #ifdef IXJ_DYN_ALLOC
7075 j->fskdata = NULL;
7076 #endif
7077 j->fskdcnt = 0;
7078 j->cidcw_wait = 0;
7080 /* Register with the Telephony for Linux subsystem */
7081 j->p.f_op = &ixj_fops;
7082 j->p.open = ixj_open;
7083 j->p.board = j->board;
7084 phone_register_device(&j->p, PHONE_UNIT_ANY);
7086 ixj_init_timer(j);
7087 ixj_add_timer(j);
7088 return 0;
7092 * Exported service for pcmcia card handling
7095 IXJ *ixj_pcmcia_probe(unsigned long dsp, unsigned long xilinx)
7097 IXJ *j = ixj_alloc();
7099 j->board = 0;
7101 j->DSPbase = dsp;
7102 j->XILINXbase = xilinx;
7103 j->cardtype = QTI_PHONECARD;
7104 ixj_selfprobe(j);
7105 return j;
7108 EXPORT_SYMBOL(ixj_pcmcia_probe); /* Fpr PCMCIA */
7110 static int ixj_get_status_proc(char *buf)
7112 int len;
7113 int cnt;
7114 IXJ *j;
7115 len = 0;
7116 len += sprintf(buf + len, "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, IXJ_VER_MINOR, IXJ_BLD_VER);
7117 len += sprintf(buf + len, "\nsizeof IXJ struct %Zd bytes", sizeof(IXJ));
7118 len += sprintf(buf + len, "\nsizeof DAA struct %Zd bytes", sizeof(DAA_REGS));
7119 len += sprintf(buf + len, "\nUsing old telephony API");
7120 len += sprintf(buf + len, "\nDebug Level %d\n", ixjdebug);
7122 for (cnt = 0; cnt < IXJMAX; cnt++) {
7123 j = get_ixj(cnt);
7124 if(j==NULL)
7125 continue;
7126 if (j->DSPbase) {
7127 len += sprintf(buf + len, "\nCard Num %d", cnt);
7128 len += sprintf(buf + len, "\nDSP Base Address 0x%4.4x", j->DSPbase);
7129 if (j->cardtype != QTI_PHONEJACK)
7130 len += sprintf(buf + len, "\nXILINX Base Address 0x%4.4x", j->XILINXbase);
7131 len += sprintf(buf + len, "\nDSP Type %2.2x%2.2x", j->dsp.high, j->dsp.low);
7132 len += sprintf(buf + len, "\nDSP Version %2.2x.%2.2x", j->ver.high, j->ver.low);
7133 len += sprintf(buf + len, "\nSerial Number %8.8x", j->serial);
7134 switch (j->cardtype) {
7135 case (QTI_PHONEJACK):
7136 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK");
7137 break;
7138 case (QTI_LINEJACK):
7139 len += sprintf(buf + len, "\nCard Type = Internet LineJACK");
7140 if (j->flags.g729_loaded)
7141 len += sprintf(buf + len, " w/G.729 A/B");
7142 len += sprintf(buf + len, " Country = %d", j->daa_country);
7143 break;
7144 case (QTI_PHONEJACK_LITE):
7145 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK Lite");
7146 if (j->flags.g729_loaded)
7147 len += sprintf(buf + len, " w/G.729 A/B");
7148 break;
7149 case (QTI_PHONEJACK_PCI):
7150 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK PCI");
7151 if (j->flags.g729_loaded)
7152 len += sprintf(buf + len, " w/G.729 A/B");
7153 break;
7154 case (QTI_PHONECARD):
7155 len += sprintf(buf + len, "\nCard Type = Internet PhoneCARD");
7156 if (j->flags.g729_loaded)
7157 len += sprintf(buf + len, " w/G.729 A/B");
7158 len += sprintf(buf + len, "\nSmart Cable %spresent", j->pccr1.bits.drf ? "not " : "");
7159 if (!j->pccr1.bits.drf)
7160 len += sprintf(buf + len, "\nSmart Cable type %d", j->flags.pcmciasct);
7161 len += sprintf(buf + len, "\nSmart Cable state %d", j->flags.pcmciastate);
7162 break;
7163 default:
7164 len += sprintf(buf + len, "\nCard Type = %d", j->cardtype);
7165 break;
7167 len += sprintf(buf + len, "\nReaders %d", j->readers);
7168 len += sprintf(buf + len, "\nWriters %d", j->writers);
7169 add_caps(j);
7170 len += sprintf(buf + len, "\nCapabilities %d", j->caps);
7171 if (j->dsp.low != 0x20)
7172 len += sprintf(buf + len, "\nDSP Processor load %d", j->proc_load);
7173 if (j->flags.cidsent)
7174 len += sprintf(buf + len, "\nCaller ID data sent");
7175 else
7176 len += sprintf(buf + len, "\nCaller ID data not sent");
7178 len += sprintf(buf + len, "\nPlay CODEC ");
7179 switch (j->play_codec) {
7180 case G723_63:
7181 len += sprintf(buf + len, "G.723.1 6.3");
7182 break;
7183 case G723_53:
7184 len += sprintf(buf + len, "G.723.1 5.3");
7185 break;
7186 case TS85:
7187 len += sprintf(buf + len, "TrueSpeech 8.5");
7188 break;
7189 case TS48:
7190 len += sprintf(buf + len, "TrueSpeech 4.8");
7191 break;
7192 case TS41:
7193 len += sprintf(buf + len, "TrueSpeech 4.1");
7194 break;
7195 case G728:
7196 len += sprintf(buf + len, "G.728");
7197 break;
7198 case G729:
7199 len += sprintf(buf + len, "G.729");
7200 break;
7201 case G729B:
7202 len += sprintf(buf + len, "G.729B");
7203 break;
7204 case ULAW:
7205 len += sprintf(buf + len, "uLaw");
7206 break;
7207 case ALAW:
7208 len += sprintf(buf + len, "aLaw");
7209 break;
7210 case LINEAR16:
7211 len += sprintf(buf + len, "16 bit Linear");
7212 break;
7213 case LINEAR8:
7214 len += sprintf(buf + len, "8 bit Linear");
7215 break;
7216 case WSS:
7217 len += sprintf(buf + len, "Windows Sound System");
7218 break;
7219 default:
7220 len += sprintf(buf + len, "NO CODEC CHOSEN");
7221 break;
7223 len += sprintf(buf + len, "\nRecord CODEC ");
7224 switch (j->rec_codec) {
7225 case G723_63:
7226 len += sprintf(buf + len, "G.723.1 6.3");
7227 break;
7228 case G723_53:
7229 len += sprintf(buf + len, "G.723.1 5.3");
7230 break;
7231 case TS85:
7232 len += sprintf(buf + len, "TrueSpeech 8.5");
7233 break;
7234 case TS48:
7235 len += sprintf(buf + len, "TrueSpeech 4.8");
7236 break;
7237 case TS41:
7238 len += sprintf(buf + len, "TrueSpeech 4.1");
7239 break;
7240 case G728:
7241 len += sprintf(buf + len, "G.728");
7242 break;
7243 case G729:
7244 len += sprintf(buf + len, "G.729");
7245 break;
7246 case G729B:
7247 len += sprintf(buf + len, "G.729B");
7248 break;
7249 case ULAW:
7250 len += sprintf(buf + len, "uLaw");
7251 break;
7252 case ALAW:
7253 len += sprintf(buf + len, "aLaw");
7254 break;
7255 case LINEAR16:
7256 len += sprintf(buf + len, "16 bit Linear");
7257 break;
7258 case LINEAR8:
7259 len += sprintf(buf + len, "8 bit Linear");
7260 break;
7261 case WSS:
7262 len += sprintf(buf + len, "Windows Sound System");
7263 break;
7264 default:
7265 len += sprintf(buf + len, "NO CODEC CHOSEN");
7266 break;
7268 len += sprintf(buf + len, "\nAEC ");
7269 switch (j->aec_level) {
7270 case AEC_OFF:
7271 len += sprintf(buf + len, "Off");
7272 break;
7273 case AEC_LOW:
7274 len += sprintf(buf + len, "Low");
7275 break;
7276 case AEC_MED:
7277 len += sprintf(buf + len, "Med");
7278 break;
7279 case AEC_HIGH:
7280 len += sprintf(buf + len, "High");
7281 break;
7282 case AEC_AUTO:
7283 len += sprintf(buf + len, "Auto");
7284 break;
7285 case AEC_AGC:
7286 len += sprintf(buf + len, "AEC/AGC");
7287 break;
7288 default:
7289 len += sprintf(buf + len, "unknown(%i)", j->aec_level);
7290 break;
7293 len += sprintf(buf + len, "\nRec volume 0x%x", get_rec_volume(j));
7294 len += sprintf(buf + len, "\nPlay volume 0x%x", get_play_volume(j));
7295 len += sprintf(buf + len, "\nDTMF prescale 0x%x", get_dtmf_prescale(j));
7297 len += sprintf(buf + len, "\nHook state %d", j->hookstate); /* j->r_hook); */
7299 if (j->cardtype == QTI_LINEJACK) {
7300 len += sprintf(buf + len, "\nPOTS Correct %d", j->flags.pots_correct);
7301 len += sprintf(buf + len, "\nPSTN Present %d", j->flags.pstn_present);
7302 len += sprintf(buf + len, "\nPSTN Check %d", j->flags.pstncheck);
7303 len += sprintf(buf + len, "\nPOTS to PSTN %d", j->flags.pots_pstn);
7304 switch (j->daa_mode) {
7305 case SOP_PU_SLEEP:
7306 len += sprintf(buf + len, "\nDAA PSTN On Hook");
7307 break;
7308 case SOP_PU_RINGING:
7309 len += sprintf(buf + len, "\nDAA PSTN Ringing");
7310 len += sprintf(buf + len, "\nRinging state = %d", j->cadence_f[4].state);
7311 break;
7312 case SOP_PU_CONVERSATION:
7313 len += sprintf(buf + len, "\nDAA PSTN Off Hook");
7314 break;
7315 case SOP_PU_PULSEDIALING:
7316 len += sprintf(buf + len, "\nDAA PSTN Pulse Dialing");
7317 break;
7319 len += sprintf(buf + len, "\nDAA RMR = %d", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR);
7320 len += sprintf(buf + len, "\nDAA VDD OK = %d", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK);
7321 len += sprintf(buf + len, "\nDAA CR0 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg);
7322 len += sprintf(buf + len, "\nDAA CR1 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg);
7323 len += sprintf(buf + len, "\nDAA CR2 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg);
7324 len += sprintf(buf + len, "\nDAA CR3 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg);
7325 len += sprintf(buf + len, "\nDAA CR4 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg);
7326 len += sprintf(buf + len, "\nDAA CR5 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg);
7327 len += sprintf(buf + len, "\nDAA XR0 = 0x%02x", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg);
7328 len += sprintf(buf + len, "\nDAA ringstop %ld - jiffies %ld", j->pstn_ring_stop, jiffies);
7330 switch (j->port) {
7331 case PORT_POTS:
7332 len += sprintf(buf + len, "\nPort POTS");
7333 break;
7334 case PORT_PSTN:
7335 len += sprintf(buf + len, "\nPort PSTN");
7336 break;
7337 case PORT_SPEAKER:
7338 len += sprintf(buf + len, "\nPort SPEAKER/MIC");
7339 break;
7340 case PORT_HANDSET:
7341 len += sprintf(buf + len, "\nPort HANDSET");
7342 break;
7344 if (j->dsp.low == 0x21 || j->dsp.low == 0x22) {
7345 len += sprintf(buf + len, "\nSLIC state ");
7346 switch (SLIC_GetState(j)) {
7347 case PLD_SLIC_STATE_OC:
7348 len += sprintf(buf + len, "OC");
7349 break;
7350 case PLD_SLIC_STATE_RINGING:
7351 len += sprintf(buf + len, "RINGING");
7352 break;
7353 case PLD_SLIC_STATE_ACTIVE:
7354 len += sprintf(buf + len, "ACTIVE");
7355 break;
7356 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
7357 len += sprintf(buf + len, "OHT");
7358 break;
7359 case PLD_SLIC_STATE_TIPOPEN:
7360 len += sprintf(buf + len, "TIPOPEN");
7361 break;
7362 case PLD_SLIC_STATE_STANDBY:
7363 len += sprintf(buf + len, "STANDBY");
7364 break;
7365 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
7366 len += sprintf(buf + len, "APR");
7367 break;
7368 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
7369 len += sprintf(buf + len, "OHTPR");
7370 break;
7371 default:
7372 len += sprintf(buf + len, "%d", SLIC_GetState(j));
7373 break;
7376 len += sprintf(buf + len, "\nBase Frame %2.2x.%2.2x", j->baseframe.high, j->baseframe.low);
7377 len += sprintf(buf + len, "\nCID Base Frame %2d", j->cid_base_frame_size);
7378 #ifdef PERFMON_STATS
7379 len += sprintf(buf + len, "\nTimer Checks %ld", j->timerchecks);
7380 len += sprintf(buf + len, "\nRX Ready Checks %ld", j->rxreadycheck);
7381 len += sprintf(buf + len, "\nTX Ready Checks %ld", j->txreadycheck);
7382 len += sprintf(buf + len, "\nFrames Read %ld", j->framesread);
7383 len += sprintf(buf + len, "\nFrames Written %ld", j->frameswritten);
7384 len += sprintf(buf + len, "\nDry Buffer %ld", j->drybuffer);
7385 len += sprintf(buf + len, "\nRead Waits %ld", j->read_wait);
7386 len += sprintf(buf + len, "\nWrite Waits %ld", j->write_wait);
7387 len += sprintf(buf + len, "\nStatus Waits %ld", j->statuswait);
7388 len += sprintf(buf + len, "\nStatus Wait Fails %ld", j->statuswaitfail);
7389 len += sprintf(buf + len, "\nPControl Waits %ld", j->pcontrolwait);
7390 len += sprintf(buf + len, "\nPControl Wait Fails %ld", j->pcontrolwaitfail);
7391 len += sprintf(buf + len, "\nIs Control Ready Checks %ld", j->iscontrolready);
7392 len += sprintf(buf + len, "\nIs Control Ready Check failures %ld", j->iscontrolreadyfail);
7394 #endif
7395 len += sprintf(buf + len, "\n");
7398 return len;
7401 static int ixj_read_proc(char *page, char **start, off_t off,
7402 int count, int *eof, void *data)
7404 int len = ixj_get_status_proc(page);
7405 if (len <= off+count) *eof = 1;
7406 *start = page + off;
7407 len -= off;
7408 if (len>count) len = count;
7409 if (len<0) len = 0;
7410 return len;
7414 static void cleanup(void)
7416 int cnt;
7417 IXJ *j;
7419 for (cnt = 0; cnt < IXJMAX; cnt++) {
7420 j = get_ixj(cnt);
7421 if(j != NULL && j->DSPbase) {
7422 if (ixjdebug & 0x0002)
7423 printk(KERN_INFO "IXJ: Deleting timer for /dev/phone%d\n", cnt);
7424 del_timer(&j->timer);
7425 if (j->cardtype == QTI_LINEJACK) {
7426 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
7428 outb_p(j->pld_scrw.byte, j->XILINXbase);
7429 j->pld_slicw.bits.rly1 = 0;
7430 j->pld_slicw.bits.rly2 = 0;
7431 j->pld_slicw.bits.rly3 = 0;
7432 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
7433 LED_SetState(0x0, j);
7434 if (ixjdebug & 0x0002)
7435 printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7436 release_region(j->XILINXbase, 8);
7437 } else if (j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
7438 if (ixjdebug & 0x0002)
7439 printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7440 release_region(j->XILINXbase, 4);
7442 kfree(j->read_buffer);
7443 kfree(j->write_buffer);
7444 if (j->dev)
7445 pnp_device_detach(j->dev);
7446 if (ixjdebug & 0x0002)
7447 printk(KERN_INFO "IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt);
7448 phone_unregister_device(&j->p);
7449 if (ixjdebug & 0x0002)
7450 printk(KERN_INFO "IXJ: Releasing DSP address for /dev/phone%d\n", cnt);
7451 release_region(j->DSPbase, 16);
7452 #ifdef IXJ_DYN_ALLOC
7453 if (ixjdebug & 0x0002)
7454 printk(KERN_INFO "IXJ: Freeing memory for /dev/phone%d\n", cnt);
7455 kfree(j);
7456 ixj[cnt] = NULL;
7457 #endif
7460 if (ixjdebug & 0x0002)
7461 printk(KERN_INFO "IXJ: Removing /proc/ixj\n");
7462 remove_proc_entry ("ixj", NULL);
7465 /* Typedefs */
7466 typedef struct {
7467 BYTE length;
7468 DWORD bits;
7469 } DATABLOCK;
7471 static void PCIEE_WriteBit(WORD wEEPROMAddress, BYTE lastLCC, BYTE byData)
7473 lastLCC = lastLCC & 0xfb;
7474 lastLCC = lastLCC | (byData ? 4 : 0);
7475 outb(lastLCC, wEEPROMAddress); /*set data out bit as appropriate */
7477 mdelay(1);
7478 lastLCC = lastLCC | 0x01;
7479 outb(lastLCC, wEEPROMAddress); /*SK rising edge */
7481 byData = byData << 1;
7482 lastLCC = lastLCC & 0xfe;
7483 mdelay(1);
7484 outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */
7488 static BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC)
7490 mdelay(1);
7491 lastLCC = lastLCC | 0x01;
7492 outb(lastLCC, wEEPROMAddress); /*SK rising edge */
7494 lastLCC = lastLCC & 0xfe;
7495 mdelay(1);
7496 outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */
7498 return ((inb(wEEPROMAddress) >> 3) & 1);
7501 static BOOL PCIEE_ReadWord(WORD wAddress, WORD wLoc, WORD * pwResult)
7503 BYTE lastLCC;
7504 WORD wEEPROMAddress = wAddress + 3;
7505 DWORD i;
7506 BYTE byResult;
7507 *pwResult = 0;
7508 lastLCC = inb(wEEPROMAddress);
7509 lastLCC = lastLCC | 0x02;
7510 lastLCC = lastLCC & 0xfe;
7511 outb(lastLCC, wEEPROMAddress); /* CS hi, SK lo */
7513 mdelay(1); /* delay */
7515 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7516 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7517 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 0);
7518 for (i = 0; i < 8; i++) {
7519 PCIEE_WriteBit(wEEPROMAddress, lastLCC, wLoc & 0x80 ? 1 : 0);
7520 wLoc <<= 1;
7523 for (i = 0; i < 16; i++) {
7524 byResult = PCIEE_ReadBit(wEEPROMAddress, lastLCC);
7525 *pwResult = (*pwResult << 1) | byResult;
7528 mdelay(1); /* another delay */
7530 lastLCC = lastLCC & 0xfd;
7531 outb(lastLCC, wEEPROMAddress); /* negate CS */
7533 return 0;
7536 static DWORD PCIEE_GetSerialNumber(WORD wAddress)
7538 WORD wLo, wHi;
7539 if (PCIEE_ReadWord(wAddress, 62, &wLo))
7540 return 0;
7541 if (PCIEE_ReadWord(wAddress, 63, &wHi))
7542 return 0;
7543 return (((DWORD) wHi << 16) | wLo);
7546 static int dspio[IXJMAX + 1] =
7550 static int xio[IXJMAX + 1] =
7555 module_param_array(dspio, int, NULL, 0);
7556 module_param_array(xio, int, NULL, 0);
7557 MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net");
7558 MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
7559 MODULE_LICENSE("GPL");
7561 static void __exit ixj_exit(void)
7563 cleanup();
7566 static IXJ *new_ixj(unsigned long port)
7568 IXJ *res;
7569 if (!request_region(port, 16, "ixj DSP")) {
7570 printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", port);
7571 return NULL;
7573 res = ixj_alloc();
7574 if (!res) {
7575 release_region(port, 16);
7576 printk(KERN_INFO "ixj: out of memory\n");
7577 return NULL;
7579 res->DSPbase = port;
7580 return res;
7583 static int __init ixj_probe_isapnp(int *cnt)
7585 int probe = 0;
7586 int func = 0x110;
7587 struct pnp_dev *dev = NULL, *old_dev = NULL;
7589 while (1) {
7590 do {
7591 IXJ *j;
7592 int result;
7594 old_dev = dev;
7595 dev = pnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'),
7596 ISAPNP_FUNCTION(func), old_dev);
7597 if (!dev || !dev->card)
7598 break;
7599 result = pnp_device_attach(dev);
7600 if (result < 0) {
7601 printk("pnp attach failed %d \n", result);
7602 break;
7604 if (pnp_activate_dev(dev) < 0) {
7605 printk("pnp activate failed (out of resources?)\n");
7606 pnp_device_detach(dev);
7607 return -ENOMEM;
7610 if (!pnp_port_valid(dev, 0)) {
7611 pnp_device_detach(dev);
7612 return -ENODEV;
7615 j = new_ixj(pnp_port_start(dev, 0));
7616 if (!j)
7617 break;
7619 if (func != 0x110)
7620 j->XILINXbase = pnp_port_start(dev, 1); /* get real port */
7622 switch (func) {
7623 case (0x110):
7624 j->cardtype = QTI_PHONEJACK;
7625 break;
7626 case (0x310):
7627 j->cardtype = QTI_LINEJACK;
7628 break;
7629 case (0x410):
7630 j->cardtype = QTI_PHONEJACK_LITE;
7631 break;
7633 j->board = *cnt;
7634 probe = ixj_selfprobe(j);
7635 if(!probe) {
7636 j->serial = dev->card->serial;
7637 j->dev = dev;
7638 switch (func) {
7639 case 0x110:
7640 printk(KERN_INFO "ixj: found Internet PhoneJACK at 0x%x\n", j->DSPbase);
7641 break;
7642 case 0x310:
7643 printk(KERN_INFO "ixj: found Internet LineJACK at 0x%x\n", j->DSPbase);
7644 break;
7645 case 0x410:
7646 printk(KERN_INFO "ixj: found Internet PhoneJACK Lite at 0x%x\n", j->DSPbase);
7647 break;
7650 ++*cnt;
7651 } while (dev);
7652 if (func == 0x410)
7653 break;
7654 if (func == 0x310)
7655 func = 0x410;
7656 if (func == 0x110)
7657 func = 0x310;
7658 dev = NULL;
7660 return probe;
7663 static int __init ixj_probe_isa(int *cnt)
7665 int i, probe;
7667 /* Use passed parameters for older kernels without PnP */
7668 for (i = 0; i < IXJMAX; i++) {
7669 if (dspio[i]) {
7670 IXJ *j = new_ixj(dspio[i]);
7672 if (!j)
7673 break;
7675 j->XILINXbase = xio[i];
7676 j->cardtype = 0;
7678 j->board = *cnt;
7679 probe = ixj_selfprobe(j);
7680 j->dev = NULL;
7681 ++*cnt;
7684 return 0;
7687 static int __init ixj_probe_pci(int *cnt)
7689 struct pci_dev *pci = NULL;
7690 int i, probe = 0;
7691 IXJ *j = NULL;
7693 for (i = 0; i < IXJMAX - *cnt; i++) {
7694 pci = pci_find_device(PCI_VENDOR_ID_QUICKNET,
7695 PCI_DEVICE_ID_QUICKNET_XJ, pci);
7696 if (!pci)
7697 break;
7699 if (pci_enable_device(pci))
7700 break;
7701 j = new_ixj(pci_resource_start(pci, 0));
7702 if (!j)
7703 break;
7705 j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2);
7706 j->XILINXbase = j->DSPbase + 0x10;
7707 j->cardtype = QTI_PHONEJACK_PCI;
7708 j->board = *cnt;
7709 probe = ixj_selfprobe(j);
7710 if (!probe)
7711 printk(KERN_INFO "ixj: found Internet PhoneJACK PCI at 0x%x\n", j->DSPbase);
7712 ++*cnt;
7714 return probe;
7717 static int __init ixj_init(void)
7719 int cnt = 0;
7720 int probe = 0;
7722 cnt = 0;
7724 /* These might be no-ops, see above. */
7725 if ((probe = ixj_probe_isapnp(&cnt)) < 0) {
7726 return probe;
7728 if ((probe = ixj_probe_isa(&cnt)) < 0) {
7729 return probe;
7731 if ((probe = ixj_probe_pci(&cnt)) < 0) {
7732 return probe;
7734 printk(KERN_INFO "ixj driver initialized.\n");
7735 create_proc_read_entry ("ixj", 0, NULL, ixj_read_proc, NULL);
7736 return probe;
7739 module_init(ixj_init);
7740 module_exit(ixj_exit);
7742 static void DAA_Coeff_US(IXJ *j)
7744 int i;
7746 j->daa_country = DAA_US;
7747 /*----------------------------------------------- */
7748 /* CAO */
7749 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
7750 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
7753 /* Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00 */
7754 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x03;
7755 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0x4B;
7756 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x5D;
7757 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xCD;
7758 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x24;
7759 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xC5;
7760 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
7761 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
7762 /* Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08 */
7763 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x71;
7764 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x1A;
7765 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
7766 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
7767 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xB5;
7768 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
7769 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
7770 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
7771 /* Bytes for FRX-filter (08): 03,8F,48,F2,8F,48,70,08 */
7772 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x05;
7773 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xA3;
7774 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x72;
7775 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
7776 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x3F;
7777 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x3B;
7778 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
7779 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
7780 /* Bytes for FRR-filter (07): 04,8F,38,7F,9B,EA,B0,08 */
7781 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x05;
7782 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
7783 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
7784 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x3E;
7785 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x32;
7786 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xDA;
7787 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
7788 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
7789 /* Bytes for AX-filter (0A): 16,55,DD,CA */
7790 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x41;
7791 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
7792 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
7793 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
7794 /* Bytes for AR-filter (09): 52,D3,11,42 */
7795 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
7796 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
7797 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
7798 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
7799 /* Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98 */
7800 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
7801 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
7802 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
7803 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
7804 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA5;
7805 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
7806 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
7807 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
7808 /* Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD */
7809 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
7810 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xA2;
7811 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2B;
7812 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
7813 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
7814 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAB;
7815 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
7816 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xCC;
7817 /* Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB */
7818 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
7819 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
7820 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xD2;
7821 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x24;
7822 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBA;
7823 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xA9;
7824 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x3B;
7825 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xA6;
7826 /* ; (10K, 0.68uF) */
7827 /* */
7828 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7829 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
7830 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
7831 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
7832 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
7833 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
7834 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
7835 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
7836 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
7837 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7838 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
7839 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
7840 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
7841 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
7842 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
7843 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
7844 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
7845 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
7847 /* Levelmetering Ringing (0D):B2,45,0F,8E */
7848 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
7849 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
7850 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
7851 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
7853 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7854 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1C; */
7855 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0xB3; */
7856 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0xAB; */
7857 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xAB; */
7858 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x54; */
7859 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x2D; */
7860 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0x62; */
7861 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x2D; */
7862 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7863 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x2D; */
7864 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x62; */
7865 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; */
7866 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBB; */
7867 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x2A; */
7868 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7D; */
7869 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; */
7870 /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD4; */
7871 /* */
7872 /* Levelmetering Ringing (0D):B2,45,0F,8E */
7873 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; */
7874 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x05; */
7875 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; */
7876 /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; */
7878 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
7879 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
7880 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
7881 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
7882 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
7883 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
7884 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
7885 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
7886 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
7887 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
7888 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
7889 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
7890 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
7891 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
7892 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
7893 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
7894 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
7895 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
7896 /* */
7897 /* ;CR Registers */
7898 /* Config. Reg. 0 (filters) (cr0):FE ; CLK gen. by crystal */
7899 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
7900 /* Config. Reg. 1 (dialing) (cr1):05 */
7901 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
7902 /* Config. Reg. 2 (caller ID) (cr2):04 */
7903 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
7904 /* Config. Reg. 3 (testloops) (cr3):03 ; SEL Bit==0, HP-disabled */
7905 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
7906 /* Config. Reg. 4 (analog gain) (cr4):02 */
7907 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
7908 /* Config. Reg. 5 (Version) (cr5):02 */
7909 /* Config. Reg. 6 (Reserved) (cr6):00 */
7910 /* Config. Reg. 7 (Reserved) (cr7):00 */
7911 /* */
7912 /* ;xr Registers */
7913 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
7915 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
7916 /* Ext. Reg. 1 (Interrupt enable) (xr1):3C Cadence, RING, Caller ID, VDD_OK */
7918 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x3C;
7919 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
7920 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
7921 /* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off == 1 */
7922 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x3B; /*0x32; */
7923 /* Ext. Reg. 4 (Cadence) (xr4):00 */
7925 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
7926 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
7927 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
7928 /* Ext. Reg. 6 (Power State) (xr6):00 */
7929 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
7930 /* Ext. Reg. 7 (Vdd) (xr7):40 */
7931 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
7932 /* */
7933 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
7934 /* 12,33,5A,C3 ; 770 Hz */
7935 /* 13,3C,5B,32 ; 852 Hz */
7936 /* 1D,1B,5C,CC ; 941 Hz */
7938 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
7939 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
7940 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
7941 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
7942 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
7943 /* EC,1D,52,22 ; 1336 Hz */
7944 /* AA,AC,51,D2 ; 1477 Hz */
7945 /* 9B,3B,51,25 ; 1633 Hz */
7946 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
7947 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
7948 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
7949 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
7952 static void DAA_Coeff_UK(IXJ *j)
7954 int i;
7956 j->daa_country = DAA_UK;
7957 /*----------------------------------------------- */
7958 /* CAO */
7959 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
7960 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
7963 /* Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00 */
7964 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
7965 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xC2;
7966 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
7967 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xA8;
7968 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xCB;
7969 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
7970 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
7971 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
7972 /* Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08 */
7973 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x40;
7974 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x00;
7975 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
7976 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
7977 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xA4;
7978 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
7979 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
7980 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
7981 /* Bytes for FRX-filter (08): 07,9B,ED,24,B2,A2,A0,08 */
7982 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
7983 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9B;
7984 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xED;
7985 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x24;
7986 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0xB2;
7987 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0xA2;
7988 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xA0;
7989 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
7990 /* Bytes for FRR-filter (07): 0F,92,F2,B2,87,D2,30,08 */
7991 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
7992 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x92;
7993 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF2;
7994 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0xB2;
7995 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
7996 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xD2;
7997 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x30;
7998 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
7999 /* Bytes for AX-filter (0A): 1B,A5,DD,CA */
8000 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x1B;
8001 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xA5;
8002 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8003 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8004 /* Bytes for AR-filter (09): E2,27,10,D6 */
8005 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8006 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x27;
8007 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8008 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8009 /* Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98 */
8010 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8011 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x2D;
8012 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x38;
8013 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x8B;
8014 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xD0;
8015 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x00;
8016 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8017 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8018 /* Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4 */
8019 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8020 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x5A;
8021 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x53;
8022 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xF0;
8023 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x0B;
8024 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5F;
8025 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x84;
8026 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xD4;
8027 /* Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32 */
8028 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8029 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8030 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x6A;
8031 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA4;
8032 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x8F;
8033 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x52;
8034 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xF5;
8035 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x32;
8036 /* ; idle */
8037 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8038 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8039 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8040 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8041 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8042 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8043 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8044 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8045 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8046 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8047 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8048 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8049 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8050 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8051 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8052 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8053 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8054 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8055 /* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V less possible? */
8056 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8057 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8058 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8059 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8060 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8061 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8062 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8063 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8064 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8065 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8066 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8067 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8068 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8069 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8070 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8071 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8072 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8073 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8074 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8075 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8076 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8077 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8078 /* ;CR Registers */
8079 /* Config. Reg. 0 (filters) (cr0):FF */
8080 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8081 /* Config. Reg. 1 (dialing) (cr1):05 */
8082 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8083 /* Config. Reg. 2 (caller ID) (cr2):04 */
8084 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8085 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8086 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8087 /* Config. Reg. 4 (analog gain) (cr4):02 */
8088 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8089 /* Config. Reg. 5 (Version) (cr5):02 */
8090 /* Config. Reg. 6 (Reserved) (cr6):00 */
8091 /* Config. Reg. 7 (Reserved) (cr7):00 */
8092 /* ;xr Registers */
8093 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8095 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8096 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8098 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8099 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8101 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8102 /* Ext. Reg. 3 (DC Char) (xr3):36 ; */
8103 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8104 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8105 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8106 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8107 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8108 /* Ext. Reg. 6 (Power State) (xr6):00 */
8109 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8110 /* Ext. Reg. 7 (Vdd) (xr7):46 */
8111 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */
8112 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8113 /* 12,33,5A,C3 ; 770 Hz */
8114 /* 13,3C,5B,32 ; 852 Hz */
8115 /* 1D,1B,5C,CC ; 941 Hz */
8117 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8118 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8119 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8120 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8121 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8122 /* EC,1D,52,22 ; 1336 Hz */
8123 /* AA,AC,51,D2 ; 1477 Hz */
8124 /* 9B,3B,51,25 ; 1633 Hz */
8125 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8126 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8127 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8128 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8132 static void DAA_Coeff_France(IXJ *j)
8134 int i;
8136 j->daa_country = DAA_FRANCE;
8137 /*----------------------------------------------- */
8138 /* CAO */
8139 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8140 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8143 /* Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00 */
8144 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x02;
8145 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA2;
8146 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x43;
8147 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2C;
8148 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x22;
8149 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xAF;
8150 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8151 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8152 /* Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08 */
8153 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x67;
8154 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xCE;
8155 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8156 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x2C;
8157 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x22;
8158 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8159 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8160 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8161 /* Bytes for FRX-filter (08): 07,9A,28,F6,23,4A,B0,08 */
8162 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8163 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9A;
8164 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x28;
8165 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0xF6;
8166 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x23;
8167 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x4A;
8168 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xB0;
8169 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8170 /* Bytes for FRR-filter (07): 03,8F,F9,2F,9E,FA,20,08 */
8171 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8172 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8173 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
8174 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8175 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9E;
8176 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xFA;
8177 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8178 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8179 /* Bytes for AX-filter (0A): 16,B5,DD,CA */
8180 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x16;
8181 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
8182 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8183 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8184 /* Bytes for AR-filter (09): 52,C7,10,D6 */
8185 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8186 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
8187 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8188 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8189 /* Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98 */
8190 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8191 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8192 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8193 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8194 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA6;
8195 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8196 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8197 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8198 /* Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C */
8199 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8200 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAC;
8201 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8202 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x30;
8203 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x78;
8204 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAC;
8205 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x8A;
8206 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x2C;
8207 /* Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45 */
8208 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8209 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8210 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8211 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA5;
8212 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x22;
8213 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA;
8214 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2C;
8215 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x45;
8216 /* ; idle */
8217 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8218 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8219 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8220 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8221 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8222 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8223 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8224 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8225 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8226 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8227 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8228 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8229 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8230 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8231 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8232 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8233 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8234 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8235 /* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
8236 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8237 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8238 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8239 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8240 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8241 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8242 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8243 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8244 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8245 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8246 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8247 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8248 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8249 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8250 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8251 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8252 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8253 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8254 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8255 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8256 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8257 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8258 /* ;CR Registers */
8259 /* Config. Reg. 0 (filters) (cr0):FF */
8260 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8261 /* Config. Reg. 1 (dialing) (cr1):05 */
8262 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8263 /* Config. Reg. 2 (caller ID) (cr2):04 */
8264 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8265 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8266 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8267 /* Config. Reg. 4 (analog gain) (cr4):02 */
8268 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8269 /* Config. Reg. 5 (Version) (cr5):02 */
8270 /* Config. Reg. 6 (Reserved) (cr6):00 */
8271 /* Config. Reg. 7 (Reserved) (cr7):00 */
8272 /* ;xr Registers */
8273 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8275 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8276 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8278 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8279 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8281 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8282 /* Ext. Reg. 3 (DC Char) (xr3):36 ; */
8283 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8284 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8285 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8286 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8287 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8288 /* Ext. Reg. 6 (Power State) (xr6):00 */
8289 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8290 /* Ext. Reg. 7 (Vdd) (xr7):46 */
8291 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */
8292 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8293 /* 12,33,5A,C3 ; 770 Hz */
8294 /* 13,3C,5B,32 ; 852 Hz */
8295 /* 1D,1B,5C,CC ; 941 Hz */
8297 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8298 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8299 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8300 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8301 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8302 /* EC,1D,52,22 ; 1336 Hz */
8303 /* AA,AC,51,D2 ; 1477 Hz */
8304 /* 9B,3B,51,25 ; 1633 Hz */
8305 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8306 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8307 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8308 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8312 static void DAA_Coeff_Germany(IXJ *j)
8314 int i;
8316 j->daa_country = DAA_GERMANY;
8317 /*----------------------------------------------- */
8318 /* CAO */
8319 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8320 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8323 /* Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00 */
8324 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8325 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xCE;
8326 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
8327 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xB8;
8328 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xD2;
8329 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
8330 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xB0;
8331 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8332 /* Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08 */
8333 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x45;
8334 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x8F;
8335 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8336 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0C;
8337 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xD2;
8338 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x3A;
8339 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xD0;
8340 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8341 /* Bytes for FRX-filter (08): 07,AA,E2,34,24,89,20,08 */
8342 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8343 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xAA;
8344 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8345 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8346 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x24;
8347 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x89;
8348 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x20;
8349 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8350 /* Bytes for FRR-filter (07): 02,87,FA,37,9A,CA,B0,08 */
8351 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x02;
8352 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
8353 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xFA;
8354 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x37;
8355 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9A;
8356 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCA;
8357 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
8358 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8359 /* Bytes for AX-filter (0A): 72,D5,DD,CA */
8360 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x72;
8361 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xD5;
8362 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8363 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8364 /* Bytes for AR-filter (09): 72,42,13,4B */
8365 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x72;
8366 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x42;
8367 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x13;
8368 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x4B;
8369 /* Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98 */
8370 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8371 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8372 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8373 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8374 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAD;
8375 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8376 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8377 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8378 /* Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27 */
8379 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8380 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x42;
8381 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x5A;
8382 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8383 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
8384 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x1A;
8385 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
8386 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x27;
8387 /* Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2 */
8388 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8389 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8390 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x63;
8391 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x26;
8392 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBD;
8393 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x4B;
8394 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xA3;
8395 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xC2;
8396 /* ; (10K, 0.68uF) */
8397 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
8398 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8399 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3B;
8400 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x9B;
8401 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xBA;
8402 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0xD4;
8403 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x1C;
8404 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xB3;
8405 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8406 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
8407 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x13;
8408 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42;
8409 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8410 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8411 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0xD4;
8412 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x73;
8413 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0xCA;
8414 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8415 /* Levelmetering Ringing (0D):B2,45,0F,8E */
8416 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xB2;
8417 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8418 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8419 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8420 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8421 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8422 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8423 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8424 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8425 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8426 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8427 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8428 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8429 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8430 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8431 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8432 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8433 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8434 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8435 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8436 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8437 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8438 /* ;CR Registers */
8439 /* Config. Reg. 0 (filters) (cr0):FF ; all Filters enabled, CLK from ext. source */
8440 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8441 /* Config. Reg. 1 (dialing) (cr1):05 ; Manual Ring, Ring metering enabled */
8442 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8443 /* Config. Reg. 2 (caller ID) (cr2):04 ; Analog Gain 0dB, FSC internal */
8444 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8445 /* Config. Reg. 3 (testloops) (cr3):00 ; SEL Bit==0, HP-enabled */
8446 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8447 /* Config. Reg. 4 (analog gain) (cr4):02 */
8448 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8449 /* Config. Reg. 5 (Version) (cr5):02 */
8450 /* Config. Reg. 6 (Reserved) (cr6):00 */
8451 /* Config. Reg. 7 (Reserved) (cr7):00 */
8452 /* ;xr Registers */
8453 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8455 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8456 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C ; Ring, CID, VDDOK Interrupts enabled */
8458 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8459 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8461 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8462 /* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm */
8463 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x32;
8464 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8465 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8466 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8467 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8468 /* Ext. Reg. 6 (Power State) (xr6):00 */
8469 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8470 /* Ext. Reg. 7 (Vdd) (xr7):40 ; VDD=4.25 V */
8471 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8472 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8473 /* 12,33,5A,C3 ; 770 Hz */
8474 /* 13,3C,5B,32 ; 852 Hz */
8475 /* 1D,1B,5C,CC ; 941 Hz */
8477 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8478 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8479 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8480 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8481 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8482 /* EC,1D,52,22 ; 1336 Hz */
8483 /* AA,AC,51,D2 ; 1477 Hz */
8484 /* 9B,3B,51,25 ; 1633 Hz */
8485 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8486 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8487 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8488 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8492 static void DAA_Coeff_Australia(IXJ *j)
8494 int i;
8496 j->daa_country = DAA_AUSTRALIA;
8497 /*----------------------------------------------- */
8498 /* CAO */
8499 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8500 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8503 /* Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00 */
8504 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8505 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA3;
8506 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xAA;
8507 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x28;
8508 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xB3;
8509 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x82;
8510 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xD0;
8511 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8512 /* Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08 */
8513 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x70;
8514 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x96;
8515 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8516 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x09;
8517 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x32;
8518 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x6B;
8519 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xC0;
8520 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8521 /* Bytes for FRX-filter (08): 07,96,E2,34,32,9B,30,08 */
8522 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8523 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x96;
8524 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8525 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8526 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x32;
8527 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x9B;
8528 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
8529 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8530 /* Bytes for FRR-filter (07): 0F,9A,E9,2F,22,CC,A0,08 */
8531 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
8532 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x9A;
8533 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xE9;
8534 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8535 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x22;
8536 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCC;
8537 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xA0;
8538 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8539 /* Bytes for AX-filter (0A): CB,45,DD,CA */
8540 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0xCB;
8541 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x45;
8542 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8543 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8544 /* Bytes for AR-filter (09): 1B,67,10,D6 */
8545 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x1B;
8546 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x67;
8547 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8548 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8549 /* Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98 */
8550 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8551 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8552 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8553 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8554 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAF;
8555 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8556 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8557 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8558 /* Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC */
8559 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8560 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xDB;
8561 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x52;
8562 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
8563 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x38;
8564 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x01;
8565 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x82;
8566 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAC;
8567 /* Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46 */
8568 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8569 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8570 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x4A;
8571 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x3E;
8572 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x2C;
8573 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x3B;
8574 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x24;
8575 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x46;
8576 /* ; idle */
8577 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8578 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8579 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8580 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8581 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8582 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8583 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8584 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8585 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8586 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8587 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8588 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8589 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8590 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8591 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8592 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8593 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8594 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8595 /* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
8596 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8597 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8598 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8599 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8600 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8601 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8602 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8603 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8604 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8605 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8606 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8607 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8608 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8609 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8610 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8611 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8612 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8613 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8614 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8615 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8616 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8617 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8618 /* ;CR Registers */
8619 /* Config. Reg. 0 (filters) (cr0):FF */
8620 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8621 /* Config. Reg. 1 (dialing) (cr1):05 */
8622 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8623 /* Config. Reg. 2 (caller ID) (cr2):04 */
8624 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8625 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8626 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8627 /* Config. Reg. 4 (analog gain) (cr4):02 */
8628 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8629 /* Config. Reg. 5 (Version) (cr5):02 */
8630 /* Config. Reg. 6 (Reserved) (cr6):00 */
8631 /* Config. Reg. 7 (Reserved) (cr7):00 */
8632 /* ;xr Registers */
8633 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8635 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8636 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8638 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8639 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8641 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8642 /* Ext. Reg. 3 (DC Char) (xr3):2B ; */
8643 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x2B;
8644 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8645 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8646 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8647 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8648 /* Ext. Reg. 6 (Power State) (xr6):00 */
8649 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8650 /* Ext. Reg. 7 (Vdd) (xr7):40 */
8651 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8653 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8654 /* 12,33,5A,C3 ; 770 Hz */
8655 /* 13,3C,5B,32 ; 852 Hz */
8656 /* 1D,1B,5C,CC ; 941 Hz */
8657 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8658 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8659 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8660 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8662 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8663 /* EC,1D,52,22 ; 1336 Hz */
8664 /* AA,AC,51,D2 ; 1477 Hz */
8665 /* 9B,3B,51,25 ; 1633 Hz */
8666 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8667 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8668 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8669 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8672 static void DAA_Coeff_Japan(IXJ *j)
8674 int i;
8676 j->daa_country = DAA_JAPAN;
8677 /*----------------------------------------------- */
8678 /* CAO */
8679 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8680 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8683 /* Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00 */
8684 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x06;
8685 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xBD;
8686 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2;
8687 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2D;
8688 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xBA;
8689 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xF9;
8690 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8691 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8692 /* Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08 */
8693 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x6F;
8694 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xF7;
8695 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8696 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0E;
8697 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x34;
8698 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8699 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8700 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8701 /* Bytes for FRX-filter (08): 02,8F,68,77,9C,58,F0,08 */
8702 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x02;
8703 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F;
8704 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x68;
8705 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x77;
8706 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x9C;
8707 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x58;
8708 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xF0;
8709 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8710 /* Bytes for FRR-filter (07): 03,8F,38,73,87,EA,20,08 */
8711 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8712 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8713 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0x38;
8714 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x73;
8715 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8716 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA;
8717 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8718 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8719 /* Bytes for AX-filter (0A): 51,C5,DD,CA */
8720 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x51;
8721 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xC5;
8722 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8723 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8724 /* Bytes for AR-filter (09): 25,A7,10,D6 */
8725 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
8726 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xA7;
8727 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8728 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8729 /* Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98 */
8730 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8731 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8732 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8733 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8734 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAE;
8735 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8736 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8737 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8738 /* Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28 */
8739 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8740 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAB;
8741 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8742 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8743 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x99;
8744 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5B;
8745 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x89;
8746 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x28;
8747 /* Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA */
8748 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8749 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8750 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8751 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x25;
8752 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x34;
8753 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xC5;
8754 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x4C;
8755 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBA;
8756 /* ; idle */
8757 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8758 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8759 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8760 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8761 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8762 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8763 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8764 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8765 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8766 /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8767 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8768 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8769 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8770 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8771 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8772 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8773 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8774 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8775 /* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V ????????? */
8776 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8777 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8778 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8779 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8780 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8781 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8782 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8783 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8784 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8785 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8786 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8787 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8788 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8789 /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8790 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8791 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8792 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8793 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8794 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8795 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8796 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8797 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8798 /* ;CR Registers */
8799 /* Config. Reg. 0 (filters) (cr0):FF */
8800 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8801 /* Config. Reg. 1 (dialing) (cr1):05 */
8802 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8803 /* Config. Reg. 2 (caller ID) (cr2):04 */
8804 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8805 /* Config. Reg. 3 (testloops) (cr3):00 ; */
8806 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8807 /* Config. Reg. 4 (analog gain) (cr4):02 */
8808 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8809 /* Config. Reg. 5 (Version) (cr5):02 */
8810 /* Config. Reg. 6 (Reserved) (cr6):00 */
8811 /* Config. Reg. 7 (Reserved) (cr7):00 */
8812 /* ;xr Registers */
8813 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8815 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8816 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8818 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8819 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8821 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8822 /* Ext. Reg. 3 (DC Char) (xr3):22 ; */
8823 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x22;
8824 /* Ext. Reg. 4 (Cadence) (xr4):00 */
8825 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8826 /* Ext. Reg. 5 (Ring timer) (xr5):22 */
8827 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8828 /* Ext. Reg. 6 (Power State) (xr6):00 */
8829 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8830 /* Ext. Reg. 7 (Vdd) (xr7):40 */
8831 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8832 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8833 /* 12,33,5A,C3 ; 770 Hz */
8834 /* 13,3C,5B,32 ; 852 Hz */
8835 /* 1D,1B,5C,CC ; 941 Hz */
8837 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8838 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8839 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8840 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8841 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8842 /* EC,1D,52,22 ; 1336 Hz */
8843 /* AA,AC,51,D2 ; 1477 Hz */
8844 /* 9B,3B,51,25 ; 1633 Hz */
8845 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8846 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8847 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8848 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8851 static s16 tone_table[][19] =
8853 { /* f20_50[] 11 */
8854 32538, /* A1 = 1.985962 */
8855 -32325, /* A2 = -0.986511 */
8856 -343, /* B2 = -0.010493 */
8857 0, /* B1 = 0 */
8858 343, /* B0 = 0.010493 */
8859 32619, /* A1 = 1.990906 */
8860 -32520, /* A2 = -0.992462 */
8861 19179, /* B2 = 0.585327 */
8862 -19178, /* B1 = -1.170593 */
8863 19179, /* B0 = 0.585327 */
8864 32723, /* A1 = 1.997314 */
8865 -32686, /* A2 = -0.997528 */
8866 9973, /* B2 = 0.304352 */
8867 -9955, /* B1 = -0.607605 */
8868 9973, /* B0 = 0.304352 */
8869 7, /* Internal filter scaling */
8870 159, /* Minimum in-band energy threshold */
8871 21, /* 21/32 in-band to broad-band ratio */
8872 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8874 { /* f133_200[] 12 */
8875 32072, /* A1 = 1.95752 */
8876 -31896, /* A2 = -0.973419 */
8877 -435, /* B2 = -0.013294 */
8878 0, /* B1 = 0 */
8879 435, /* B0 = 0.013294 */
8880 32188, /* A1 = 1.9646 */
8881 -32400, /* A2 = -0.98877 */
8882 15139, /* B2 = 0.462036 */
8883 -14882, /* B1 = -0.908356 */
8884 15139, /* B0 = 0.462036 */
8885 32473, /* A1 = 1.981995 */
8886 -32524, /* A2 = -0.992584 */
8887 23200, /* B2 = 0.708008 */
8888 -23113, /* B1 = -1.410706 */
8889 23200, /* B0 = 0.708008 */
8890 7, /* Internal filter scaling */
8891 159, /* Minimum in-band energy threshold */
8892 21, /* 21/32 in-band to broad-band ratio */
8893 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8895 { /* f300 13 */
8896 31769, /* A1 = -1.939026 */
8897 -32584, /* A2 = 0.994385 */
8898 -475, /* B2 = -0.014522 */
8899 0, /* B1 = 0.000000 */
8900 475, /* B0 = 0.014522 */
8901 31789, /* A1 = -1.940247 */
8902 -32679, /* A2 = 0.997284 */
8903 17280, /* B2 = 0.527344 */
8904 -16865, /* B1 = -1.029358 */
8905 17280, /* B0 = 0.527344 */
8906 31841, /* A1 = -1.943481 */
8907 -32681, /* A2 = 0.997345 */
8908 543, /* B2 = 0.016579 */
8909 -525, /* B1 = -0.032097 */
8910 543, /* B0 = 0.016579 */
8911 5, /* Internal filter scaling */
8912 159, /* Minimum in-band energy threshold */
8913 21, /* 21/32 in-band to broad-band ratio */
8914 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8916 { /* f300_420[] 14 */
8917 30750, /* A1 = 1.876892 */
8918 -31212, /* A2 = -0.952515 */
8919 -804, /* B2 = -0.024541 */
8920 0, /* B1 = 0 */
8921 804, /* B0 = 0.024541 */
8922 30686, /* A1 = 1.872925 */
8923 -32145, /* A2 = -0.980988 */
8924 14747, /* B2 = 0.450043 */
8925 -13703, /* B1 = -0.836395 */
8926 14747, /* B0 = 0.450043 */
8927 31651, /* A1 = 1.931824 */
8928 -32321, /* A2 = -0.986389 */
8929 24425, /* B2 = 0.745422 */
8930 -23914, /* B1 = -1.459595 */
8931 24427, /* B0 = 0.745483 */
8932 7, /* Internal filter scaling */
8933 159, /* Minimum in-band energy threshold */
8934 21, /* 21/32 in-band to broad-band ratio */
8935 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8937 { /* f330 15 */
8938 31613, /* A1 = -1.929565 */
8939 -32646, /* A2 = 0.996277 */
8940 -185, /* B2 = -0.005657 */
8941 0, /* B1 = 0.000000 */
8942 185, /* B0 = 0.005657 */
8943 31620, /* A1 = -1.929932 */
8944 -32713, /* A2 = 0.998352 */
8945 19253, /* B2 = 0.587585 */
8946 -18566, /* B1 = -1.133179 */
8947 19253, /* B0 = 0.587585 */
8948 31674, /* A1 = -1.933228 */
8949 -32715, /* A2 = 0.998413 */
8950 2575, /* B2 = 0.078590 */
8951 -2495, /* B1 = -0.152283 */
8952 2575, /* B0 = 0.078590 */
8953 5, /* Internal filter scaling */
8954 159, /* Minimum in-band energy threshold */
8955 21, /* 21/32 in-band to broad-band ratio */
8956 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8958 { /* f300_425[] 16 */
8959 30741, /* A1 = 1.876282 */
8960 -31475, /* A2 = -0.960541 */
8961 -703, /* B2 = -0.021484 */
8962 0, /* B1 = 0 */
8963 703, /* B0 = 0.021484 */
8964 30688, /* A1 = 1.873047 */
8965 -32248, /* A2 = -0.984161 */
8966 14542, /* B2 = 0.443787 */
8967 -13523, /* B1 = -0.825439 */
8968 14542, /* B0 = 0.443817 */
8969 31494, /* A1 = 1.922302 */
8970 -32366, /* A2 = -0.987762 */
8971 21577, /* B2 = 0.658508 */
8972 -21013, /* B1 = -1.282532 */
8973 21577, /* B0 = 0.658508 */
8974 7, /* Internal filter scaling */
8975 159, /* Minimum in-band energy threshold */
8976 21, /* 21/32 in-band to broad-band ratio */
8977 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8979 { /* f330_440[] 17 */
8980 30627, /* A1 = 1.869324 */
8981 -31338, /* A2 = -0.95636 */
8982 -843, /* B2 = -0.025749 */
8983 0, /* B1 = 0 */
8984 843, /* B0 = 0.025749 */
8985 30550, /* A1 = 1.864685 */
8986 -32221, /* A2 = -0.983337 */
8987 13594, /* B2 = 0.414886 */
8988 -12589, /* B1 = -0.768402 */
8989 13594, /* B0 = 0.414886 */
8990 31488, /* A1 = 1.921936 */
8991 -32358, /* A2 = -0.987518 */
8992 24684, /* B2 = 0.753296 */
8993 -24029, /* B1 = -1.466614 */
8994 24684, /* B0 = 0.753296 */
8995 7, /* Internal filter scaling */
8996 159, /* Minimum in-band energy threshold */
8997 21, /* 21/32 in-band to broad-band ratio */
8998 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9000 { /* f340 18 */
9001 31546, /* A1 = -1.925476 */
9002 -32646, /* A2 = 0.996277 */
9003 -445, /* B2 = -0.013588 */
9004 0, /* B1 = 0.000000 */
9005 445, /* B0 = 0.013588 */
9006 31551, /* A1 = -1.925781 */
9007 -32713, /* A2 = 0.998352 */
9008 23884, /* B2 = 0.728882 */
9009 -22979, /* B1 = -1.402527 */
9010 23884, /* B0 = 0.728882 */
9011 31606, /* A1 = -1.929138 */
9012 -32715, /* A2 = 0.998413 */
9013 863, /* B2 = 0.026367 */
9014 -835, /* B1 = -0.050985 */
9015 863, /* B0 = 0.026367 */
9016 5, /* Internal filter scaling */
9017 159, /* Minimum in-band energy threshold */
9018 21, /* 21/32 in-band to broad-band ratio */
9019 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9021 { /* f350_400[] 19 */
9022 31006, /* A1 = 1.892517 */
9023 -32029, /* A2 = -0.977448 */
9024 -461, /* B2 = -0.014096 */
9025 0, /* B1 = 0 */
9026 461, /* B0 = 0.014096 */
9027 30999, /* A1 = 1.892029 */
9028 -32487, /* A2 = -0.991455 */
9029 11325, /* B2 = 0.345612 */
9030 -10682, /* B1 = -0.651978 */
9031 11325, /* B0 = 0.345612 */
9032 31441, /* A1 = 1.919067 */
9033 -32526, /* A2 = -0.992615 */
9034 24324, /* B2 = 0.74231 */
9035 -23535, /* B1 = -1.436523 */
9036 24324, /* B0 = 0.74231 */
9037 7, /* Internal filter scaling */
9038 159, /* Minimum in-band energy threshold */
9039 21, /* 21/32 in-band to broad-band ratio */
9040 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9042 { /* f350_440[] */
9043 30634, /* A1 = 1.869751 */
9044 -31533, /* A2 = -0.962341 */
9045 -680, /* B2 = -0.020782 */
9046 0, /* B1 = 0 */
9047 680, /* B0 = 0.020782 */
9048 30571, /* A1 = 1.865906 */
9049 -32277, /* A2 = -0.985016 */
9050 12894, /* B2 = 0.393524 */
9051 -11945, /* B1 = -0.729065 */
9052 12894, /* B0 = 0.393524 */
9053 31367, /* A1 = 1.91449 */
9054 -32379, /* A2 = -0.988129 */
9055 23820, /* B2 = 0.726929 */
9056 -23104, /* B1 = -1.410217 */
9057 23820, /* B0 = 0.726929 */
9058 7, /* Internal filter scaling */
9059 159, /* Minimum in-band energy threshold */
9060 21, /* 21/32 in-band to broad-band ratio */
9061 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9063 { /* f350_450[] */
9064 30552, /* A1 = 1.864807 */
9065 -31434, /* A2 = -0.95929 */
9066 -690, /* B2 = -0.021066 */
9067 0, /* B1 = 0 */
9068 690, /* B0 = 0.021066 */
9069 30472, /* A1 = 1.859924 */
9070 -32248, /* A2 = -0.984161 */
9071 13385, /* B2 = 0.408478 */
9072 -12357, /* B1 = -0.754242 */
9073 13385, /* B0 = 0.408478 */
9074 31358, /* A1 = 1.914001 */
9075 -32366, /* A2 = -0.987732 */
9076 26488, /* B2 = 0.80835 */
9077 -25692, /* B1 = -1.568176 */
9078 26490, /* B0 = 0.808411 */
9079 7, /* Internal filter scaling */
9080 159, /* Minimum in-band energy threshold */
9081 21, /* 21/32 in-band to broad-band ratio */
9082 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9084 { /* f360 */
9085 31397, /* A1 = -1.916321 */
9086 -32623, /* A2 = 0.995605 */
9087 -117, /* B2 = -0.003598 */
9088 0, /* B1 = 0.000000 */
9089 117, /* B0 = 0.003598 */
9090 31403, /* A1 = -1.916687 */
9091 -32700, /* A2 = 0.997925 */
9092 3388, /* B2 = 0.103401 */
9093 -3240, /* B1 = -0.197784 */
9094 3388, /* B0 = 0.103401 */
9095 31463, /* A1 = -1.920410 */
9096 -32702, /* A2 = 0.997986 */
9097 13346, /* B2 = 0.407288 */
9098 -12863, /* B1 = -0.785126 */
9099 13346, /* B0 = 0.407288 */
9100 5, /* Internal filter scaling */
9101 159, /* Minimum in-band energy threshold */
9102 21, /* 21/32 in-band to broad-band ratio */
9103 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9105 { /* f380_420[] */
9106 30831, /* A1 = 1.881775 */
9107 -32064, /* A2 = -0.978546 */
9108 -367, /* B2 = -0.01122 */
9109 0, /* B1 = 0 */
9110 367, /* B0 = 0.01122 */
9111 30813, /* A1 = 1.880737 */
9112 -32456, /* A2 = -0.990509 */
9113 11068, /* B2 = 0.337769 */
9114 -10338, /* B1 = -0.631042 */
9115 11068, /* B0 = 0.337769 */
9116 31214, /* A1 = 1.905212 */
9117 -32491, /* A2 = -0.991577 */
9118 16374, /* B2 = 0.499695 */
9119 -15781, /* B1 = -0.963196 */
9120 16374, /* B0 = 0.499695 */
9121 7, /* Internal filter scaling */
9122 159, /* Minimum in-band energy threshold */
9123 21, /* 21/32 in-band to broad-band ratio */
9124 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9126 { /* f392 */
9127 31152, /* A1 = -1.901428 */
9128 -32613, /* A2 = 0.995300 */
9129 -314, /* B2 = -0.009605 */
9130 0, /* B1 = 0.000000 */
9131 314, /* B0 = 0.009605 */
9132 31156, /* A1 = -1.901672 */
9133 -32694, /* A2 = 0.997742 */
9134 28847, /* B2 = 0.880371 */
9135 -2734, /* B1 = -0.166901 */
9136 28847, /* B0 = 0.880371 */
9137 31225, /* A1 = -1.905823 */
9138 -32696, /* A2 = 0.997803 */
9139 462, /* B2 = 0.014108 */
9140 -442, /* B1 = -0.027019 */
9141 462, /* B0 = 0.014108 */
9142 5, /* Internal filter scaling */
9143 159, /* Minimum in-band energy threshold */
9144 21, /* 21/32 in-band to broad-band ratio */
9145 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9147 { /* f400_425[] */
9148 30836, /* A1 = 1.882141 */
9149 -32296, /* A2 = -0.985596 */
9150 -324, /* B2 = -0.009903 */
9151 0, /* B1 = 0 */
9152 324, /* B0 = 0.009903 */
9153 30825, /* A1 = 1.881409 */
9154 -32570, /* A2 = -0.993958 */
9155 16847, /* B2 = 0.51416 */
9156 -15792, /* B1 = -0.963898 */
9157 16847, /* B0 = 0.51416 */
9158 31106, /* A1 = 1.89856 */
9159 -32584, /* A2 = -0.994415 */
9160 9579, /* B2 = 0.292328 */
9161 -9164, /* B1 = -0.559357 */
9162 9579, /* B0 = 0.292328 */
9163 7, /* Internal filter scaling */
9164 159, /* Minimum in-band energy threshold */
9165 21, /* 21/32 in-band to broad-band ratio */
9166 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9168 { /* f400_440[] */
9169 30702, /* A1 = 1.873962 */
9170 -32134, /* A2 = -0.980682 */
9171 -517, /* B2 = -0.015793 */
9172 0, /* B1 = 0 */
9173 517, /* B0 = 0.015793 */
9174 30676, /* A1 = 1.872375 */
9175 -32520, /* A2 = -0.992462 */
9176 8144, /* B2 = 0.24855 */
9177 -7596, /* B1 = -0.463684 */
9178 8144, /* B0 = 0.24855 */
9179 31084, /* A1 = 1.897217 */
9180 -32547, /* A2 = -0.993256 */
9181 22713, /* B2 = 0.693176 */
9182 -21734, /* B1 = -1.326599 */
9183 22713, /* B0 = 0.693176 */
9184 7, /* Internal filter scaling */
9185 159, /* Minimum in-band energy threshold */
9186 21, /* 21/32 in-band to broad-band ratio */
9187 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9189 { /* f400_450[] */
9190 30613, /* A1 = 1.86853 */
9191 -32031, /* A2 = -0.977509 */
9192 -618, /* B2 = -0.018866 */
9193 0, /* B1 = 0 */
9194 618, /* B0 = 0.018866 */
9195 30577, /* A1 = 1.866272 */
9196 -32491, /* A2 = -0.991577 */
9197 9612, /* B2 = 0.293335 */
9198 -8935, /* B1 = -0.54541 */
9199 9612, /* B0 = 0.293335 */
9200 31071, /* A1 = 1.896484 */
9201 -32524, /* A2 = -0.992584 */
9202 21596, /* B2 = 0.659058 */
9203 -20667, /* B1 = -1.261414 */
9204 21596, /* B0 = 0.659058 */
9205 7, /* Internal filter scaling */
9206 159, /* Minimum in-band energy threshold */
9207 21, /* 21/32 in-band to broad-band ratio */
9208 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9210 { /* f420 */
9211 30914, /* A1 = -1.886841 */
9212 -32584, /* A2 = 0.994385 */
9213 -426, /* B2 = -0.013020 */
9214 0, /* B1 = 0.000000 */
9215 426, /* B0 = 0.013020 */
9216 30914, /* A1 = -1.886841 */
9217 -32679, /* A2 = 0.997314 */
9218 17520, /* B2 = 0.534668 */
9219 -16471, /* B1 = -1.005310 */
9220 17520, /* B0 = 0.534668 */
9221 31004, /* A1 = -1.892334 */
9222 -32683, /* A2 = 0.997406 */
9223 819, /* B2 = 0.025023 */
9224 -780, /* B1 = -0.047619 */
9225 819, /* B0 = 0.025023 */
9226 5, /* Internal filter scaling */
9227 159, /* Minimum in-band energy threshold */
9228 21, /* 21/32 in-band to broad-band ratio */
9229 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9231 #if 0
9232 { /* f425 */
9233 30881, /* A1 = -1.884827 */
9234 -32603, /* A2 = 0.994965 */
9235 -496, /* B2 = -0.015144 */
9236 0, /* B1 = 0.000000 */
9237 496, /* B0 = 0.015144 */
9238 30880, /* A1 = -1.884766 */
9239 -32692, /* A2 = 0.997711 */
9240 24767, /* B2 = 0.755859 */
9241 -23290, /* B1 = -1.421509 */
9242 24767, /* B0 = 0.755859 */
9243 30967, /* A1 = -1.890076 */
9244 -32694, /* A2 = 0.997772 */
9245 728, /* B2 = 0.022232 */
9246 -691, /* B1 = -0.042194 */
9247 728, /* B0 = 0.022232 */
9248 5, /* Internal filter scaling */
9249 159, /* Minimum in-band energy threshold */
9250 21, /* 21/32 in-band to broad-band ratio */
9251 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9253 #else
9255 30850,
9256 -32534,
9257 -504,
9259 504,
9260 30831,
9261 -32669,
9262 24303,
9263 -22080,
9264 24303,
9265 30994,
9266 -32673,
9267 1905,
9268 -1811,
9269 1905,
9271 129,
9273 0xff5
9275 #endif
9276 { /* f425_450[] */
9277 30646, /* A1 = 1.870544 */
9278 -32327, /* A2 = -0.986572 */
9279 -287, /* B2 = -0.008769 */
9280 0, /* B1 = 0 */
9281 287, /* B0 = 0.008769 */
9282 30627, /* A1 = 1.869324 */
9283 -32607, /* A2 = -0.995087 */
9284 13269, /* B2 = 0.404968 */
9285 -12376, /* B1 = -0.755432 */
9286 13269, /* B0 = 0.404968 */
9287 30924, /* A1 = 1.887512 */
9288 -32619, /* A2 = -0.995453 */
9289 19950, /* B2 = 0.608826 */
9290 -18940, /* B1 = -1.156006 */
9291 19950, /* B0 = 0.608826 */
9292 7, /* Internal filter scaling */
9293 159, /* Minimum in-band energy threshold */
9294 21, /* 21/32 in-band to broad-band ratio */
9295 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9297 { /* f425_475[] */
9298 30396, /* A1 = 1.855225 */
9299 -32014, /* A2 = -0.97699 */
9300 -395, /* B2 = -0.012055 */
9301 0, /* B1 = 0 */
9302 395, /* B0 = 0.012055 */
9303 30343, /* A1 = 1.85199 */
9304 -32482, /* A2 = -0.991302 */
9305 17823, /* B2 = 0.543945 */
9306 -16431, /* B1 = -1.002869 */
9307 17823, /* B0 = 0.543945 */
9308 30872, /* A1 = 1.884338 */
9309 -32516, /* A2 = -0.99231 */
9310 18124, /* B2 = 0.553101 */
9311 -17246, /* B1 = -1.052673 */
9312 18124, /* B0 = 0.553101 */
9313 7, /* Internal filter scaling */
9314 159, /* Minimum in-band energy threshold */
9315 21, /* 21/32 in-band to broad-band ratio */
9316 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9318 { /* f435 */
9319 30796, /* A1 = -1.879639 */
9320 -32603, /* A2 = 0.994965 */
9321 -254, /* B2 = -0.007762 */
9322 0, /* B1 = 0.000000 */
9323 254, /* B0 = 0.007762 */
9324 30793, /* A1 = -1.879456 */
9325 -32692, /* A2 = 0.997711 */
9326 18934, /* B2 = 0.577820 */
9327 -17751, /* B1 = -1.083496 */
9328 18934, /* B0 = 0.577820 */
9329 30882, /* A1 = -1.884888 */
9330 -32694, /* A2 = 0.997772 */
9331 1858, /* B2 = 0.056713 */
9332 -1758, /* B1 = -0.107357 */
9333 1858, /* B0 = 0.056713 */
9334 5, /* Internal filter scaling */
9335 159, /* Minimum in-band energy threshold */
9336 21, /* 21/32 in-band to broad-band ratio */
9337 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9339 { /* f440_450[] */
9340 30641, /* A1 = 1.870239 */
9341 -32458, /* A2 = -0.99057 */
9342 -155, /* B2 = -0.004735 */
9343 0, /* B1 = 0 */
9344 155, /* B0 = 0.004735 */
9345 30631, /* A1 = 1.869568 */
9346 -32630, /* A2 = -0.995789 */
9347 11453, /* B2 = 0.349548 */
9348 -10666, /* B1 = -0.651001 */
9349 11453, /* B0 = 0.349548 */
9350 30810, /* A1 = 1.880554 */
9351 -32634, /* A2 = -0.995941 */
9352 12237, /* B2 = 0.373474 */
9353 -11588, /* B1 = -0.707336 */
9354 12237, /* B0 = 0.373474 */
9355 7, /* Internal filter scaling */
9356 159, /* Minimum in-band energy threshold */
9357 21, /* 21/32 in-band to broad-band ratio */
9358 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9360 { /* f440_480[] */
9361 30367, /* A1 = 1.853455 */
9362 -32147, /* A2 = -0.981079 */
9363 -495, /* B2 = -0.015113 */
9364 0, /* B1 = 0 */
9365 495, /* B0 = 0.015113 */
9366 30322, /* A1 = 1.850769 */
9367 -32543, /* A2 = -0.993134 */
9368 10031, /* B2 = 0.306152 */
9369 -9252, /* B1 = -0.564728 */
9370 10031, /* B0 = 0.306152 */
9371 30770, /* A1 = 1.878052 */
9372 -32563, /* A2 = -0.993774 */
9373 22674, /* B2 = 0.691956 */
9374 -21465, /* B1 = -1.31012 */
9375 22674, /* B0 = 0.691956 */
9376 7, /* Internal filter scaling */
9377 159, /* Minimum in-band energy threshold */
9378 21, /* 21/32 in-band to broad-band ratio */
9379 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9381 { /* f445 */
9382 30709, /* A1 = -1.874329 */
9383 -32603, /* A2 = 0.994965 */
9384 -83, /* B2 = -0.002545 */
9385 0, /* B1 = 0.000000 */
9386 83, /* B0 = 0.002545 */
9387 30704, /* A1 = -1.874084 */
9388 -32692, /* A2 = 0.997711 */
9389 10641, /* B2 = 0.324738 */
9390 -9947, /* B1 = -0.607147 */
9391 10641, /* B0 = 0.324738 */
9392 30796, /* A1 = -1.879639 */
9393 -32694, /* A2 = 0.997772 */
9394 10079, /* B2 = 0.307587 */
9395 9513, /* B1 = 0.580688 */
9396 10079, /* B0 = 0.307587 */
9397 5, /* Internal filter scaling */
9398 159, /* Minimum in-band energy threshold */
9399 21, /* 21/32 in-band to broad-band ratio */
9400 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9402 { /* f450 */
9403 30664, /* A1 = -1.871643 */
9404 -32603, /* A2 = 0.994965 */
9405 -164, /* B2 = -0.005029 */
9406 0, /* B1 = 0.000000 */
9407 164, /* B0 = 0.005029 */
9408 30661, /* A1 = -1.871399 */
9409 -32692, /* A2 = 0.997711 */
9410 15294, /* B2 = 0.466736 */
9411 -14275, /* B1 = -0.871307 */
9412 15294, /* B0 = 0.466736 */
9413 30751, /* A1 = -1.876953 */
9414 -32694, /* A2 = 0.997772 */
9415 3548, /* B2 = 0.108284 */
9416 -3344, /* B1 = -0.204155 */
9417 3548, /* B0 = 0.108284 */
9418 5, /* Internal filter scaling */
9419 159, /* Minimum in-band energy threshold */
9420 21, /* 21/32 in-band to broad-band ratio */
9421 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9423 { /* f452 */
9424 30653, /* A1 = -1.870911 */
9425 -32615, /* A2 = 0.995361 */
9426 -209, /* B2 = -0.006382 */
9427 0, /* B1 = 0.000000 */
9428 209, /* B0 = 0.006382 */
9429 30647, /* A1 = -1.870605 */
9430 -32702, /* A2 = 0.997986 */
9431 18971, /* B2 = 0.578979 */
9432 -17716, /* B1 = -1.081299 */
9433 18971, /* B0 = 0.578979 */
9434 30738, /* A1 = -1.876099 */
9435 -32702, /* A2 = 0.998016 */
9436 2967, /* B2 = 0.090561 */
9437 -2793, /* B1 = -0.170502 */
9438 2967, /* B0 = 0.090561 */
9439 5, /* Internal filter scaling */
9440 159, /* Minimum in-band energy threshold */
9441 21, /* 21/32 in-band to broad-band ratio */
9442 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9444 { /* f475 */
9445 30437, /* A1 = -1.857727 */
9446 -32603, /* A2 = 0.994965 */
9447 -264, /* B2 = -0.008062 */
9448 0, /* B1 = 0.000000 */
9449 264, /* B0 = 0.008062 */
9450 30430, /* A1 = -1.857300 */
9451 -32692, /* A2 = 0.997711 */
9452 21681, /* B2 = 0.661682 */
9453 -20082, /* B1 = -1.225708 */
9454 21681, /* B0 = 0.661682 */
9455 30526, /* A1 = -1.863220 */
9456 -32694, /* A2 = 0.997742 */
9457 1559, /* B2 = 0.047600 */
9458 -1459, /* B1 = -0.089096 */
9459 1559, /* B0 = 0.047600 */
9460 5, /* Internal filter scaling */
9461 159, /* Minimum in-band energy threshold */
9462 21, /* 21/32 in-band to broad-band ratio */
9463 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9465 { /* f480_620[] */
9466 28975, /* A1 = 1.768494 */
9467 -30955, /* A2 = -0.944672 */
9468 -1026, /* B2 = -0.03133 */
9469 0, /* B1 = 0 */
9470 1026, /* B0 = 0.03133 */
9471 28613, /* A1 = 1.746399 */
9472 -32089, /* A2 = -0.979309 */
9473 14214, /* B2 = 0.433807 */
9474 -12202, /* B1 = -0.744812 */
9475 14214, /* B0 = 0.433807 */
9476 30243, /* A1 = 1.845947 */
9477 -32238, /* A2 = -0.983856 */
9478 24825, /* B2 = 0.757629 */
9479 -23402, /* B1 = -1.428345 */
9480 24825, /* B0 = 0.757629 */
9481 7, /* Internal filter scaling */
9482 159, /* Minimum in-band energy threshold */
9483 21, /* 21/32 in-band to broad-band ratio */
9484 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9486 { /* f494 */
9487 30257, /* A1 = -1.846741 */
9488 -32605, /* A2 = 0.995056 */
9489 -249, /* B2 = -0.007625 */
9490 0, /* B1 = 0.000000 */
9491 249, /* B0 = 0.007625 */
9492 30247, /* A1 = -1.846191 */
9493 -32694, /* A2 = 0.997772 */
9494 18088, /* B2 = 0.552002 */
9495 -16652, /* B1 = -1.016418 */
9496 18088, /* B0 = 0.552002 */
9497 30348, /* A1 = -1.852295 */
9498 -32696, /* A2 = 0.997803 */
9499 2099, /* B2 = 0.064064 */
9500 -1953, /* B1 = -0.119202 */
9501 2099, /* B0 = 0.064064 */
9502 5, /* Internal filter scaling */
9503 159, /* Minimum in-band energy threshold */
9504 21, /* 21/32 in-band to broad-band ratio */
9505 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9507 { /* f500 */
9508 30202, /* A1 = -1.843431 */
9509 -32624, /* A2 = 0.995622 */
9510 -413, /* B2 = -0.012622 */
9511 0, /* B1 = 0.000000 */
9512 413, /* B0 = 0.012622 */
9513 30191, /* A1 = -1.842721 */
9514 -32714, /* A2 = 0.998364 */
9515 25954, /* B2 = 0.792057 */
9516 -23890, /* B1 = -1.458131 */
9517 25954, /* B0 = 0.792057 */
9518 30296, /* A1 = -1.849172 */
9519 -32715, /* A2 = 0.998397 */
9520 2007, /* B2 = 0.061264 */
9521 -1860, /* B1 = -0.113568 */
9522 2007, /* B0 = 0.061264 */
9523 5, /* Internal filter scaling */
9524 159, /* Minimum in-band energy threshold */
9525 21, /* 21/32 in-band to broad-band ratio */
9526 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9528 { /* f520 */
9529 30001, /* A1 = -1.831116 */
9530 -32613, /* A2 = 0.995270 */
9531 -155, /* B2 = -0.004750 */
9532 0, /* B1 = 0.000000 */
9533 155, /* B0 = 0.004750 */
9534 29985, /* A1 = -1.830200 */
9535 -32710, /* A2 = 0.998260 */
9536 6584, /* B2 = 0.200928 */
9537 -6018, /* B1 = -0.367355 */
9538 6584, /* B0 = 0.200928 */
9539 30105, /* A1 = -1.837524 */
9540 -32712, /* A2 = 0.998291 */
9541 23812, /* B2 = 0.726685 */
9542 -21936, /* B1 = -1.338928 */
9543 23812, /* B0 = 0.726685 */
9544 5, /* Internal filter scaling */
9545 159, /* Minimum in-band energy threshold */
9546 21, /* 21/32 in-band to broad-band ratio */
9547 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9549 { /* f523 */
9550 29964, /* A1 = -1.828918 */
9551 -32601, /* A2 = 0.994904 */
9552 -101, /* B2 = -0.003110 */
9553 0, /* B1 = 0.000000 */
9554 101, /* B0 = 0.003110 */
9555 29949, /* A1 = -1.827942 */
9556 -32700, /* A2 = 0.997925 */
9557 11041, /* B2 = 0.336975 */
9558 -10075, /* B1 = -0.614960 */
9559 11041, /* B0 = 0.336975 */
9560 30070, /* A1 = -1.835388 */
9561 -32702, /* A2 = 0.997986 */
9562 16762, /* B2 = 0.511536 */
9563 -15437, /* B1 = -0.942230 */
9564 16762, /* B0 = 0.511536 */
9565 5, /* Internal filter scaling */
9566 159, /* Minimum in-band energy threshold */
9567 21, /* 21/32 in-band to broad-band ratio */
9568 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9570 { /* f525 */
9571 29936, /* A1 = -1.827209 */
9572 -32584, /* A2 = 0.994415 */
9573 -91, /* B2 = -0.002806 */
9574 0, /* B1 = 0.000000 */
9575 91, /* B0 = 0.002806 */
9576 29921, /* A1 = -1.826233 */
9577 -32688, /* A2 = 0.997559 */
9578 11449, /* B2 = 0.349396 */
9579 -10426, /* B1 = -0.636383 */
9580 11449, /* B0 = 0.349396 */
9581 30045, /* A1 = -1.833862 */
9582 -32688, /* A2 = 0.997589 */
9583 13055, /* B2 = 0.398407 */
9584 -12028, /* B1 = -0.734161 */
9585 13055, /* B0 = 0.398407 */
9586 5, /* Internal filter scaling */
9587 159, /* Minimum in-band energy threshold */
9588 21, /* 21/32 in-band to broad-band ratio */
9589 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9591 { /* f540_660[] */
9592 28499, /* A1 = 1.739441 */
9593 -31129, /* A2 = -0.949982 */
9594 -849, /* B2 = -0.025922 */
9595 0, /* B1 = 0 */
9596 849, /* B0 = 0.025922 */
9597 28128, /* A1 = 1.716797 */
9598 -32130, /* A2 = -0.98056 */
9599 14556, /* B2 = 0.444214 */
9600 -12251, /* B1 = -0.747772 */
9601 14556, /* B0 = 0.444244 */
9602 29667, /* A1 = 1.81073 */
9603 -32244, /* A2 = -0.984039 */
9604 23038, /* B2 = 0.703064 */
9605 -21358, /* B1 = -1.303589 */
9606 23040, /* B0 = 0.703125 */
9607 7, /* Internal filter scaling */
9608 159, /* Minimum in-band energy threshold */
9609 21, /* 21/32 in-band to broad-band ratio */
9610 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9612 { /* f587 */
9613 29271, /* A1 = -1.786560 */
9614 -32599, /* A2 = 0.994873 */
9615 -490, /* B2 = -0.014957 */
9616 0, /* B1 = 0.000000 */
9617 490, /* B0 = 0.014957 */
9618 29246, /* A1 = -1.785095 */
9619 -32700, /* A2 = 0.997925 */
9620 28961, /* B2 = 0.883850 */
9621 -25796, /* B1 = -1.574463 */
9622 28961, /* B0 = 0.883850 */
9623 29383, /* A1 = -1.793396 */
9624 -32700, /* A2 = 0.997955 */
9625 1299, /* B2 = 0.039650 */
9626 -1169, /* B1 = -0.071396 */
9627 1299, /* B0 = 0.039650 */
9628 5, /* Internal filter scaling */
9629 159, /* Minimum in-band energy threshold */
9630 21, /* 21/32 in-band to broad-band ratio */
9631 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9633 { /* f590 */
9634 29230, /* A1 = -1.784058 */
9635 -32584, /* A2 = 0.994415 */
9636 -418, /* B2 = -0.012757 */
9637 0, /* B1 = 0.000000 */
9638 418, /* B0 = 0.012757 */
9639 29206, /* A1 = -1.782593 */
9640 -32688, /* A2 = 0.997559 */
9641 36556, /* B2 = 1.115601 */
9642 -32478, /* B1 = -1.982300 */
9643 36556, /* B0 = 1.115601 */
9644 29345, /* A1 = -1.791077 */
9645 -32688, /* A2 = 0.997589 */
9646 897, /* B2 = 0.027397 */
9647 -808, /* B1 = -0.049334 */
9648 897, /* B0 = 0.027397 */
9649 5, /* Internal filter scaling */
9650 159, /* Minimum in-band energy threshold */
9651 21, /* 21/32 in-band to broad-band ratio */
9652 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9654 { /* f600 */
9655 29116, /* A1 = -1.777100 */
9656 -32603, /* A2 = 0.994965 */
9657 -165, /* B2 = -0.005039 */
9658 0, /* B1 = 0.000000 */
9659 165, /* B0 = 0.005039 */
9660 29089, /* A1 = -1.775452 */
9661 -32708, /* A2 = 0.998199 */
9662 6963, /* B2 = 0.212494 */
9663 -6172, /* B1 = -0.376770 */
9664 6963, /* B0 = 0.212494 */
9665 29237, /* A1 = -1.784485 */
9666 -32710, /* A2 = 0.998230 */
9667 24197, /* B2 = 0.738464 */
9668 -21657, /* B1 = -1.321899 */
9669 24197, /* B0 = 0.738464 */
9670 5, /* Internal filter scaling */
9671 159, /* Minimum in-band energy threshold */
9672 21, /* 21/32 in-band to broad-band ratio */
9673 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9675 { /* f660 */
9676 28376, /* A1 = -1.731934 */
9677 -32567, /* A2 = 0.993896 */
9678 -363, /* B2 = -0.011102 */
9679 0, /* B1 = 0.000000 */
9680 363, /* B0 = 0.011102 */
9681 28337, /* A1 = -1.729614 */
9682 -32683, /* A2 = 0.997434 */
9683 21766, /* B2 = 0.664246 */
9684 -18761, /* B1 = -1.145081 */
9685 21766, /* B0 = 0.664246 */
9686 28513, /* A1 = -1.740356 */
9687 -32686, /* A2 = 0.997498 */
9688 2509, /* B2 = 0.076584 */
9689 -2196, /* B1 = -0.134041 */
9690 2509, /* B0 = 0.076584 */
9691 5, /* Internal filter scaling */
9692 159, /* Minimum in-band energy threshold */
9693 21, /* 21/32 in-band to broad-band ratio */
9694 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9696 { /* f700 */
9697 27844, /* A1 = -1.699463 */
9698 -32563, /* A2 = 0.993744 */
9699 -366, /* B2 = -0.011187 */
9700 0, /* B1 = 0.000000 */
9701 366, /* B0 = 0.011187 */
9702 27797, /* A1 = -1.696655 */
9703 -32686, /* A2 = 0.997498 */
9704 22748, /* B2 = 0.694214 */
9705 -19235, /* B1 = -1.174072 */
9706 22748, /* B0 = 0.694214 */
9707 27995, /* A1 = -1.708740 */
9708 -32688, /* A2 = 0.997559 */
9709 2964, /* B2 = 0.090477 */
9710 -2546, /* B1 = -0.155449 */
9711 2964, /* B0 = 0.090477 */
9712 5, /* Internal filter scaling */
9713 159, /* Minimum in-band energy threshold */
9714 21, /* 21/32 in-band to broad-band ratio */
9715 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9717 { /* f740 */
9718 27297, /* A1 = -1.666077 */
9719 -32551, /* A2 = 0.993408 */
9720 -345, /* B2 = -0.010540 */
9721 0, /* B1 = 0.000000 */
9722 345, /* B0 = 0.010540 */
9723 27240, /* A1 = -1.662598 */
9724 -32683, /* A2 = 0.997406 */
9725 22560, /* B2 = 0.688477 */
9726 -18688, /* B1 = -1.140625 */
9727 22560, /* B0 = 0.688477 */
9728 27461, /* A1 = -1.676147 */
9729 -32684, /* A2 = 0.997467 */
9730 3541, /* B2 = 0.108086 */
9731 -2985, /* B1 = -0.182220 */
9732 3541, /* B0 = 0.108086 */
9733 5, /* Internal filter scaling */
9734 159, /* Minimum in-band energy threshold */
9735 21, /* 21/32 in-band to broad-band ratio */
9736 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9738 { /* f750 */
9739 27155, /* A1 = -1.657410 */
9740 -32551, /* A2 = 0.993408 */
9741 -462, /* B2 = -0.014117 */
9742 0, /* B1 = 0.000000 */
9743 462, /* B0 = 0.014117 */
9744 27097, /* A1 = -1.653870 */
9745 -32683, /* A2 = 0.997406 */
9746 32495, /* B2 = 0.991699 */
9747 -26776, /* B1 = -1.634338 */
9748 32495, /* B0 = 0.991699 */
9749 27321, /* A1 = -1.667542 */
9750 -32684, /* A2 = 0.997467 */
9751 1835, /* B2 = 0.056007 */
9752 -1539, /* B1 = -0.093948 */
9753 1835, /* B0 = 0.056007 */
9754 5, /* Internal filter scaling */
9755 159, /* Minimum in-band energy threshold */
9756 21, /* 21/32 in-band to broad-band ratio */
9757 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9759 { /* f750_1450[] */
9760 19298, /* A1 = 1.177917 */
9761 -24471, /* A2 = -0.746796 */
9762 -4152, /* B2 = -0.126709 */
9763 0, /* B1 = 0 */
9764 4152, /* B0 = 0.126709 */
9765 12902, /* A1 = 0.787476 */
9766 -29091, /* A2 = -0.887817 */
9767 12491, /* B2 = 0.38121 */
9768 -1794, /* B1 = -0.109528 */
9769 12494, /* B0 = 0.381317 */
9770 26291, /* A1 = 1.604736 */
9771 -30470, /* A2 = -0.929901 */
9772 28859, /* B2 = 0.880737 */
9773 -26084, /* B1 = -1.592102 */
9774 28861, /* B0 = 0.880798 */
9775 7, /* Internal filter scaling */
9776 159, /* Minimum in-band energy threshold */
9777 21, /* 21/32 in-band to broad-band ratio */
9778 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9780 { /* f770 */
9781 26867, /* A1 = -1.639832 */
9782 -32551, /* A2 = 0.993408 */
9783 -123, /* B2 = -0.003755 */
9784 0, /* B1 = 0.000000 */
9785 123, /* B0 = 0.003755 */
9786 26805, /* A1 = -1.636108 */
9787 -32683, /* A2 = 0.997406 */
9788 17297, /* B2 = 0.527863 */
9789 -14096, /* B1 = -0.860382 */
9790 17297, /* B0 = 0.527863 */
9791 27034, /* A1 = -1.650085 */
9792 -32684, /* A2 = 0.997467 */
9793 12958, /* B2 = 0.395477 */
9794 -10756, /* B1 = -0.656525 */
9795 12958, /* B0 = 0.395477 */
9796 5, /* Internal filter scaling */
9797 159, /* Minimum in-band energy threshold */
9798 21, /* 21/32 in-band to broad-band ratio */
9799 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9801 { /* f800 */
9802 26413, /* A1 = -1.612122 */
9803 -32547, /* A2 = 0.993286 */
9804 -223, /* B2 = -0.006825 */
9805 0, /* B1 = 0.000000 */
9806 223, /* B0 = 0.006825 */
9807 26342, /* A1 = -1.607849 */
9808 -32686, /* A2 = 0.997498 */
9809 6391, /* B2 = 0.195053 */
9810 -5120, /* B1 = -0.312531 */
9811 6391, /* B0 = 0.195053 */
9812 26593, /* A1 = -1.623108 */
9813 -32688, /* A2 = 0.997559 */
9814 23681, /* B2 = 0.722717 */
9815 -19328, /* B1 = -1.179688 */
9816 23681, /* B0 = 0.722717 */
9817 5, /* Internal filter scaling */
9818 159, /* Minimum in-band energy threshold */
9819 21, /* 21/32 in-band to broad-band ratio */
9820 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9822 { /* f816 */
9823 26168, /* A1 = -1.597209 */
9824 -32528, /* A2 = 0.992706 */
9825 -235, /* B2 = -0.007182 */
9826 0, /* B1 = 0.000000 */
9827 235, /* B0 = 0.007182 */
9828 26092, /* A1 = -1.592590 */
9829 -32675, /* A2 = 0.997192 */
9830 20823, /* B2 = 0.635498 */
9831 -16510, /* B1 = -1.007751 */
9832 20823, /* B0 = 0.635498 */
9833 26363, /* A1 = -1.609070 */
9834 -32677, /* A2 = 0.997253 */
9835 6739, /* B2 = 0.205688 */
9836 -5459, /* B1 = -0.333206 */
9837 6739, /* B0 = 0.205688 */
9838 5, /* Internal filter scaling */
9839 159, /* Minimum in-band energy threshold */
9840 21, /* 21/32 in-band to broad-band ratio */
9841 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9843 { /* f850 */
9844 25641, /* A1 = -1.565063 */
9845 -32536, /* A2 = 0.992950 */
9846 -121, /* B2 = -0.003707 */
9847 0, /* B1 = 0.000000 */
9848 121, /* B0 = 0.003707 */
9849 25560, /* A1 = -1.560059 */
9850 -32684, /* A2 = 0.997437 */
9851 18341, /* B2 = 0.559753 */
9852 -14252, /* B1 = -0.869904 */
9853 18341, /* B0 = 0.559753 */
9854 25837, /* A1 = -1.577026 */
9855 -32684, /* A2 = 0.997467 */
9856 16679, /* B2 = 0.509003 */
9857 -13232, /* B1 = -0.807648 */
9858 16679, /* B0 = 0.509003 */
9859 5, /* Internal filter scaling */
9860 159, /* Minimum in-band energy threshold */
9861 21, /* 21/32 in-band to broad-band ratio */
9862 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9864 { /* f857_1645[] */
9865 16415, /* A1 = 1.001953 */
9866 -23669, /* A2 = -0.722321 */
9867 -4549, /* B2 = -0.138847 */
9868 0, /* B1 = 0 */
9869 4549, /* B0 = 0.138847 */
9870 8456, /* A1 = 0.516174 */
9871 -28996, /* A2 = -0.884918 */
9872 13753, /* B2 = 0.419724 */
9873 -12, /* B1 = -0.000763 */
9874 13757, /* B0 = 0.419846 */
9875 24632, /* A1 = 1.503418 */
9876 -30271, /* A2 = -0.923828 */
9877 29070, /* B2 = 0.887146 */
9878 -25265, /* B1 = -1.542114 */
9879 29073, /* B0 = 0.887268 */
9880 7, /* Internal filter scaling */
9881 159, /* Minimum in-band energy threshold */
9882 21, /* 21/32 in-band to broad-band ratio */
9883 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9885 { /* f900 */
9886 24806, /* A1 = -1.514099 */
9887 -32501, /* A2 = 0.991852 */
9888 -326, /* B2 = -0.009969 */
9889 0, /* B1 = 0.000000 */
9890 326, /* B0 = 0.009969 */
9891 24709, /* A1 = -1.508118 */
9892 -32659, /* A2 = 0.996674 */
9893 20277, /* B2 = 0.618835 */
9894 -15182, /* B1 = -0.926636 */
9895 20277, /* B0 = 0.618835 */
9896 25022, /* A1 = -1.527222 */
9897 -32661, /* A2 = 0.996735 */
9898 4320, /* B2 = 0.131836 */
9899 -3331, /* B1 = -0.203339 */
9900 4320, /* B0 = 0.131836 */
9901 5, /* Internal filter scaling */
9902 159, /* Minimum in-band energy threshold */
9903 21, /* 21/32 in-band to broad-band ratio */
9904 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9906 { /* f900_1300[] */
9907 19776, /* A1 = 1.207092 */
9908 -27437, /* A2 = -0.837341 */
9909 -2666, /* B2 = -0.081371 */
9910 0, /* B1 = 0 */
9911 2666, /* B0 = 0.081371 */
9912 16302, /* A1 = 0.995026 */
9913 -30354, /* A2 = -0.926361 */
9914 10389, /* B2 = 0.317062 */
9915 -3327, /* B1 = -0.203064 */
9916 10389, /* B0 = 0.317062 */
9917 24299, /* A1 = 1.483154 */
9918 -30930, /* A2 = -0.943909 */
9919 25016, /* B2 = 0.763428 */
9920 -21171, /* B1 = -1.292236 */
9921 25016, /* B0 = 0.763428 */
9922 7, /* Internal filter scaling */
9923 159, /* Minimum in-band energy threshold */
9924 21, /* 21/32 in-band to broad-band ratio */
9925 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9927 { /* f935_1215[] */
9928 20554, /* A1 = 1.254517 */
9929 -28764, /* A2 = -0.877838 */
9930 -2048, /* B2 = -0.062515 */
9931 0, /* B1 = 0 */
9932 2048, /* B0 = 0.062515 */
9933 18209, /* A1 = 1.11145 */
9934 -30951, /* A2 = -0.94458 */
9935 9390, /* B2 = 0.286575 */
9936 -3955, /* B1 = -0.241455 */
9937 9390, /* B0 = 0.286575 */
9938 23902, /* A1 = 1.458923 */
9939 -31286, /* A2 = -0.954803 */
9940 23252, /* B2 = 0.709595 */
9941 -19132, /* B1 = -1.167725 */
9942 23252, /* B0 = 0.709595 */
9943 7, /* Internal filter scaling */
9944 159, /* Minimum in-band energy threshold */
9945 21, /* 21/32 in-band to broad-band ratio */
9946 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9948 { /* f941_1477[] */
9949 17543, /* A1 = 1.07074 */
9950 -26220, /* A2 = -0.800201 */
9951 -3298, /* B2 = -0.100647 */
9952 0, /* B1 = 0 */
9953 3298, /* B0 = 0.100647 */
9954 12423, /* A1 = 0.75827 */
9955 -30036, /* A2 = -0.916626 */
9956 12651, /* B2 = 0.386078 */
9957 -2444, /* B1 = -0.14917 */
9958 12653, /* B0 = 0.386154 */
9959 23518, /* A1 = 1.435425 */
9960 -30745, /* A2 = -0.938293 */
9961 27282, /* B2 = 0.832581 */
9962 -22529, /* B1 = -1.375122 */
9963 27286, /* B0 = 0.832703 */
9964 7, /* Internal filter scaling */
9965 159, /* Minimum in-band energy threshold */
9966 21, /* 21/32 in-band to broad-band ratio */
9967 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9969 { /* f942 */
9970 24104, /* A1 = -1.471252 */
9971 -32507, /* A2 = 0.992065 */
9972 -351, /* B2 = -0.010722 */
9973 0, /* B1 = 0.000000 */
9974 351, /* B0 = 0.010722 */
9975 23996, /* A1 = -1.464600 */
9976 -32671, /* A2 = 0.997040 */
9977 22848, /* B2 = 0.697266 */
9978 -16639, /* B1 = -1.015564 */
9979 22848, /* B0 = 0.697266 */
9980 24332, /* A1 = -1.485168 */
9981 -32673, /* A2 = 0.997101 */
9982 4906, /* B2 = 0.149727 */
9983 -3672, /* B1 = -0.224174 */
9984 4906, /* B0 = 0.149727 */
9985 5, /* Internal filter scaling */
9986 159, /* Minimum in-band energy threshold */
9987 21, /* 21/32 in-band to broad-band ratio */
9988 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9990 { /* f950 */
9991 23967, /* A1 = -1.462830 */
9992 -32507, /* A2 = 0.992065 */
9993 -518, /* B2 = -0.015821 */
9994 0, /* B1 = 0.000000 */
9995 518, /* B0 = 0.015821 */
9996 23856, /* A1 = -1.456055 */
9997 -32671, /* A2 = 0.997040 */
9998 26287, /* B2 = 0.802246 */
9999 -19031, /* B1 = -1.161560 */
10000 26287, /* B0 = 0.802246 */
10001 24195, /* A1 = -1.476746 */
10002 -32673, /* A2 = 0.997101 */
10003 2890, /* B2 = 0.088196 */
10004 -2151, /* B1 = -0.131317 */
10005 2890, /* B0 = 0.088196 */
10006 5, /* Internal filter scaling */
10007 159, /* Minimum in-band energy threshold */
10008 21, /* 21/32 in-band to broad-band ratio */
10009 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10011 { /* f950_1400[] */
10012 18294, /* A1 = 1.116638 */
10013 -26962, /* A2 = -0.822845 */
10014 -2914, /* B2 = -0.088936 */
10015 0, /* B1 = 0 */
10016 2914, /* B0 = 0.088936 */
10017 14119, /* A1 = 0.861786 */
10018 -30227, /* A2 = -0.922455 */
10019 11466, /* B2 = 0.349945 */
10020 -2833, /* B1 = -0.172943 */
10021 11466, /* B0 = 0.349945 */
10022 23431, /* A1 = 1.430115 */
10023 -30828, /* A2 = -0.940796 */
10024 25331, /* B2 = 0.773071 */
10025 -20911, /* B1 = -1.276367 */
10026 25331, /* B0 = 0.773071 */
10027 7, /* Internal filter scaling */
10028 159, /* Minimum in-band energy threshold */
10029 21, /* 21/32 in-band to broad-band ratio */
10030 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10032 { /* f975 */
10033 23521, /* A1 = -1.435608 */
10034 -32489, /* A2 = 0.991516 */
10035 -193, /* B2 = -0.005915 */
10036 0, /* B1 = 0.000000 */
10037 193, /* B0 = 0.005915 */
10038 23404, /* A1 = -1.428467 */
10039 -32655, /* A2 = 0.996582 */
10040 17740, /* B2 = 0.541412 */
10041 -12567, /* B1 = -0.767029 */
10042 17740, /* B0 = 0.541412 */
10043 23753, /* A1 = -1.449829 */
10044 -32657, /* A2 = 0.996613 */
10045 9090, /* B2 = 0.277405 */
10046 -6662, /* B1 = -0.406647 */
10047 9090, /* B0 = 0.277405 */
10048 5, /* Internal filter scaling */
10049 159, /* Minimum in-band energy threshold */
10050 21, /* 21/32 in-band to broad-band ratio */
10051 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10053 { /* f1000 */
10054 23071, /* A1 = -1.408203 */
10055 -32489, /* A2 = 0.991516 */
10056 -293, /* B2 = -0.008965 */
10057 0, /* B1 = 0.000000 */
10058 293, /* B0 = 0.008965 */
10059 22951, /* A1 = -1.400818 */
10060 -32655, /* A2 = 0.996582 */
10061 5689, /* B2 = 0.173645 */
10062 -3951, /* B1 = -0.241150 */
10063 5689, /* B0 = 0.173645 */
10064 23307, /* A1 = -1.422607 */
10065 -32657, /* A2 = 0.996613 */
10066 18692, /* B2 = 0.570435 */
10067 -13447, /* B1 = -0.820770 */
10068 18692, /* B0 = 0.570435 */
10069 5, /* Internal filter scaling */
10070 159, /* Minimum in-band energy threshold */
10071 21, /* 21/32 in-band to broad-band ratio */
10072 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10074 { /* f1020 */
10075 22701, /* A1 = -1.385620 */
10076 -32474, /* A2 = 0.991058 */
10077 -292, /* B2 = -0.008933 */
10078 0, /*163840 , B1 = 10.000000 */
10079 292, /* B0 = 0.008933 */
10080 22564, /* A1 = -1.377258 */
10081 -32655, /* A2 = 0.996552 */
10082 20756, /* B2 = 0.633423 */
10083 -14176, /* B1 = -0.865295 */
10084 20756, /* B0 = 0.633423 */
10085 22960, /* A1 = -1.401428 */
10086 -32657, /* A2 = 0.996613 */
10087 6520, /* B2 = 0.198990 */
10088 -4619, /* B1 = -0.281937 */
10089 6520, /* B0 = 0.198990 */
10090 5, /* Internal filter scaling */
10091 159, /* Minimum in-band energy threshold */
10092 21, /* 21/32 in-band to broad-band ratio */
10093 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10095 { /* f1050 */
10096 22142, /* A1 = -1.351501 */
10097 -32474, /* A2 = 0.991058 */
10098 -147, /* B2 = -0.004493 */
10099 0, /* B1 = 0.000000 */
10100 147, /* B0 = 0.004493 */
10101 22000, /* A1 = -1.342834 */
10102 -32655, /* A2 = 0.996552 */
10103 15379, /* B2 = 0.469360 */
10104 -10237, /* B1 = -0.624847 */
10105 15379, /* B0 = 0.469360 */
10106 22406, /* A1 = -1.367554 */
10107 -32657, /* A2 = 0.996613 */
10108 17491, /* B2 = 0.533783 */
10109 -12096, /* B1 = -0.738312 */
10110 17491, /* B0 = 0.533783 */
10111 5, /* Internal filter scaling */
10112 159, /* Minimum in-band energy threshold */
10113 21, /* 21/32 in-band to broad-band ratio */
10114 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10116 { /* f1100_1750[] */
10117 12973, /* A1 = 0.79184 */
10118 -24916, /* A2 = -0.760376 */
10119 6655, /* B2 = 0.203102 */
10120 367, /* B1 = 0.0224 */
10121 6657, /* B0 = 0.203171 */
10122 5915, /* A1 = 0.361053 */
10123 -29560, /* A2 = -0.90213 */
10124 -7777, /* B2 = -0.23735 */
10125 0, /* B1 = 0 */
10126 7777, /* B0 = 0.23735 */
10127 20510, /* A1 = 1.251892 */
10128 -30260, /* A2 = -0.923462 */
10129 26662, /* B2 = 0.81366 */
10130 -20573, /* B1 = -1.255737 */
10131 26668, /* B0 = 0.813843 */
10132 7, /* Internal filter scaling */
10133 159, /* Minimum in-band energy threshold */
10134 21, /* 21/32 in-band to broad-band ratio */
10135 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10137 { /* f1140 */
10138 20392, /* A1 = -1.244629 */
10139 -32460, /* A2 = 0.990601 */
10140 -270, /* B2 = -0.008240 */
10141 0, /* B1 = 0.000000 */
10142 270, /* B0 = 0.008240 */
10143 20218, /* A1 = -1.234009 */
10144 -32655, /* A2 = 0.996582 */
10145 21337, /* B2 = 0.651154 */
10146 -13044, /* B1 = -0.796143 */
10147 21337, /* B0 = 0.651154 */
10148 20684, /* A1 = -1.262512 */
10149 -32657, /* A2 = 0.996643 */
10150 8572, /* B2 = 0.261612 */
10151 -5476, /* B1 = -0.334244 */
10152 8572, /* B0 = 0.261612 */
10153 5, /* Internal filter scaling */
10154 159, /* Minimum in-band energy threshold */
10155 21, /* 21/32 in-band to broad-band ratio */
10156 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10158 { /* f1200 */
10159 19159, /* A1 = -1.169373 */
10160 -32456, /* A2 = 0.990509 */
10161 -335, /* B2 = -0.010252 */
10162 0, /* B1 = 0.000000 */
10163 335, /* B0 = 0.010252 */
10164 18966, /* A1 = -1.157593 */
10165 -32661, /* A2 = 0.996735 */
10166 6802, /* B2 = 0.207588 */
10167 -3900, /* B1 = -0.238098 */
10168 6802, /* B0 = 0.207588 */
10169 19467, /* A1 = -1.188232 */
10170 -32661, /* A2 = 0.996765 */
10171 25035, /* B2 = 0.764008 */
10172 -15049, /* B1 = -0.918579 */
10173 25035, /* B0 = 0.764008 */
10174 5, /* Internal filter scaling */
10175 159, /* Minimum in-band energy threshold */
10176 21, /* 21/32 in-band to broad-band ratio */
10177 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10179 { /* f1209 */
10180 18976, /* A1 = -1.158264 */
10181 -32439, /* A2 = 0.989990 */
10182 -183, /* B2 = -0.005588 */
10183 0, /* B1 = 0.000000 */
10184 183, /* B0 = 0.005588 */
10185 18774, /* A1 = -1.145874 */
10186 -32650, /* A2 = 0.996429 */
10187 15468, /* B2 = 0.472076 */
10188 -8768, /* B1 = -0.535217 */
10189 15468, /* B0 = 0.472076 */
10190 19300, /* A1 = -1.177979 */
10191 -32652, /* A2 = 0.996490 */
10192 19840, /* B2 = 0.605499 */
10193 -11842, /* B1 = -0.722809 */
10194 19840, /* B0 = 0.605499 */
10195 5, /* Internal filter scaling */
10196 159, /* Minimum in-band energy threshold */
10197 21, /* 21/32 in-band to broad-band ratio */
10198 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10200 { /* f1330 */
10201 16357, /* A1 = -0.998413 */
10202 -32368, /* A2 = 0.987793 */
10203 -217, /* B2 = -0.006652 */
10204 0, /* B1 = 0.000000 */
10205 217, /* B0 = 0.006652 */
10206 16107, /* A1 = -0.983126 */
10207 -32601, /* A2 = 0.994904 */
10208 11602, /* B2 = 0.354065 */
10209 -5555, /* B1 = -0.339111 */
10210 11602, /* B0 = 0.354065 */
10211 16722, /* A1 = -1.020630 */
10212 -32603, /* A2 = 0.994965 */
10213 15574, /* B2 = 0.475311 */
10214 -8176, /* B1 = -0.499069 */
10215 15574, /* B0 = 0.475311 */
10216 5, /* Internal filter scaling */
10217 159, /* Minimum in-band energy threshold */
10218 21, /* 21/32 in-band to broad-band ratio */
10219 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10221 { /* f1336 */
10222 16234, /* A1 = -0.990875 */
10223 32404, /* A2 = -0.988922 */
10224 -193, /* B2 = -0.005908 */
10225 0, /* B1 = 0.000000 */
10226 193, /* B0 = 0.005908 */
10227 15986, /* A1 = -0.975769 */
10228 -32632, /* A2 = 0.995880 */
10229 18051, /* B2 = 0.550903 */
10230 -8658, /* B1 = -0.528473 */
10231 18051, /* B0 = 0.550903 */
10232 16591, /* A1 = -1.012695 */
10233 -32634, /* A2 = 0.995941 */
10234 15736, /* B2 = 0.480240 */
10235 -8125, /* B1 = -0.495926 */
10236 15736, /* B0 = 0.480240 */
10237 5, /* Internal filter scaling */
10238 159, /* Minimum in-band energy threshold */
10239 21, /* 21/32 in-band to broad-band ratio */
10240 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10242 { /* f1366 */
10243 15564, /* A1 = -0.949982 */
10244 -32404, /* A2 = 0.988922 */
10245 -269, /* B2 = -0.008216 */
10246 0, /* B1 = 0.000000 */
10247 269, /* B0 = 0.008216 */
10248 15310, /* A1 = -0.934479 */
10249 -32632, /* A2 = 0.995880 */
10250 10815, /* B2 = 0.330063 */
10251 -4962, /* B1 = -0.302887 */
10252 10815, /* B0 = 0.330063 */
10253 15924, /* A1 = -0.971924 */
10254 -32634, /* A2 = 0.995941 */
10255 18880, /* B2 = 0.576172 */
10256 -9364, /* B1 = -0.571594 */
10257 18880, /* B0 = 0.576172 */
10258 5, /* Internal filter scaling */
10259 159, /* Minimum in-band energy threshold */
10260 21, /* 21/32 in-band to broad-band ratio */
10261 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10263 { /* f1380 */
10264 15247, /* A1 = -0.930603 */
10265 -32397, /* A2 = 0.988708 */
10266 -244, /* B2 = -0.007451 */
10267 0, /* B1 = 0.000000 */
10268 244, /* B0 = 0.007451 */
10269 14989, /* A1 = -0.914886 */
10270 -32627, /* A2 = 0.995697 */
10271 18961, /* B2 = 0.578644 */
10272 -8498, /* B1 = -0.518707 */
10273 18961, /* B0 = 0.578644 */
10274 15608, /* A1 = -0.952667 */
10275 -32628, /* A2 = 0.995758 */
10276 11145, /* B2 = 0.340134 */
10277 -5430, /* B1 = -0.331467 */
10278 11145, /* B0 = 0.340134 */
10279 5, /* Internal filter scaling */
10280 159, /* Minimum in-band energy threshold */
10281 21, /* 21/32 in-band to broad-band ratio */
10282 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10284 { /* f1400 */
10285 14780, /* A1 = -0.902130 */
10286 -32393, /* A2 = 0.988586 */
10287 -396, /* B2 = -0.012086 */
10288 0, /* B1 = 0.000000 */
10289 396, /* B0 = 0.012086 */
10290 14510, /* A1 = -0.885651 */
10291 -32630, /* A2 = 0.995819 */
10292 6326, /* B2 = 0.193069 */
10293 -2747, /* B1 = -0.167671 */
10294 6326, /* B0 = 0.193069 */
10295 15154, /* A1 = -0.924957 */
10296 -32632, /* A2 = 0.995850 */
10297 23235, /* B2 = 0.709076 */
10298 -10983, /* B1 = -0.670380 */
10299 23235, /* B0 = 0.709076 */
10300 5, /* Internal filter scaling */
10301 159, /* Minimum in-band energy threshold */
10302 21, /* 21/32 in-band to broad-band ratio */
10303 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10305 { /* f1477 */
10306 13005, /* A1 = -0.793793 */
10307 -32368, /* A2 = 0.987823 */
10308 -500, /* B2 = -0.015265 */
10309 0, /* B1 = 0.000000 */
10310 500, /* B0 = 0.015265 */
10311 12708, /* A1 = -0.775665 */
10312 -32615, /* A2 = 0.995331 */
10313 11420, /* B2 = 0.348526 */
10314 -4306, /* B1 = -0.262833 */
10315 11420, /* B0 = 0.348526 */
10316 13397, /* A1 = -0.817688 */
10317 -32615, /* A2 = 0.995361 */
10318 9454, /* B2 = 0.288528 */
10319 -3981, /* B1 = -0.243027 */
10320 9454, /* B0 = 0.288528 */
10321 5, /* Internal filter scaling */
10322 159, /* Minimum in-band energy threshold */
10323 21, /* 21/32 in-band to broad-band ratio */
10324 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10326 { /* f1600 */
10327 10046, /* A1 = -0.613190 */
10328 -32331, /* A2 = 0.986694 */
10329 -455, /* B2 = -0.013915 */
10330 0, /* B1 = 0.000000 */
10331 455, /* B0 = 0.013915 */
10332 9694, /* A1 = -0.591705 */
10333 -32601, /* A2 = 0.994934 */
10334 6023, /* B2 = 0.183815 */
10335 -1708, /* B1 = -0.104279 */
10336 6023, /* B0 = 0.183815 */
10337 10478, /* A1 = -0.639587 */
10338 -32603, /* A2 = 0.994965 */
10339 22031, /* B2 = 0.672333 */
10340 -7342, /* B1 = -0.448151 */
10341 22031, /* B0 = 0.672333 */
10342 5, /* Internal filter scaling */
10343 159, /* Minimum in-band energy threshold */
10344 21, /* 21/32 in-band to broad-band ratio */
10345 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10347 { /* f1633_1638[] */
10348 9181, /* A1 = 0.560394 */
10349 -32256, /* A2 = -0.984375 */
10350 -556, /* B2 = -0.016975 */
10351 0, /* B1 = 0 */
10352 556, /* B0 = 0.016975 */
10353 8757, /* A1 = 0.534515 */
10354 -32574, /* A2 = -0.99408 */
10355 8443, /* B2 = 0.25769 */
10356 -2135, /* B1 = -0.130341 */
10357 8443, /* B0 = 0.25769 */
10358 9691, /* A1 = 0.591522 */
10359 -32574, /* A2 = -0.99411 */
10360 15446, /* B2 = 0.471375 */
10361 -4809, /* B1 = -0.293579 */
10362 15446, /* B0 = 0.471375 */
10363 7, /* Internal filter scaling */
10364 159, /* Minimum in-band energy threshold */
10365 21, /* 21/32 in-band to broad-band ratio */
10366 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10368 { /* f1800 */
10369 5076, /* A1 = -0.309875 */
10370 -32304, /* A2 = 0.985840 */
10371 -508, /* B2 = -0.015503 */
10372 0, /* B1 = 0.000000 */
10373 508, /* B0 = 0.015503 */
10374 4646, /* A1 = -0.283600 */
10375 -32605, /* A2 = 0.995026 */
10376 6742, /* B2 = 0.205780 */
10377 -878, /* B1 = -0.053635 */
10378 6742, /* B0 = 0.205780 */
10379 5552, /* A1 = -0.338928 */
10380 -32605, /* A2 = 0.995056 */
10381 23667, /* B2 = 0.722260 */
10382 -4297, /* B1 = -0.262329 */
10383 23667, /* B0 = 0.722260 */
10384 5, /* Internal filter scaling */
10385 159, /* Minimum in-band energy threshold */
10386 21, /* 21/32 in-band to broad-band ratio */
10387 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10389 { /* f1860 */
10390 3569, /* A1 = -0.217865 */
10391 -32292, /* A2 = 0.985504 */
10392 -239, /* B2 = -0.007322 */
10393 0, /* B1 = 0.000000 */
10394 239, /* B0 = 0.007322 */
10395 3117, /* A1 = -0.190277 */
10396 -32603, /* A2 = 0.994965 */
10397 18658, /* B2 = 0.569427 */
10398 -1557, /* B1 = -0.095032 */
10399 18658, /* B0 = 0.569427 */
10400 4054, /* A1 = -0.247437 */
10401 -32603, /* A2 = 0.994965 */
10402 18886, /* B2 = 0.576385 */
10403 -2566, /* B1 = -0.156647 */
10404 18886, /* B0 = 0.576385 */
10405 5, /* Internal filter scaling */
10406 159, /* Minimum in-band energy threshold */
10407 21, /* 21/32 in-band to broad-band ratio */
10408 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10411 static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf)
10413 unsigned short cmd;
10414 int cnt, max;
10416 if (jf->filter > 3) {
10417 return -1;
10419 if (ixj_WriteDSPCommand(0x5154 + jf->filter, j)) /* Select Filter */
10421 return -1;
10422 if (!jf->enable) {
10423 if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */
10425 return -1;
10426 else
10427 return 0;
10428 } else {
10429 if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */
10431 return -1;
10432 /* Select the filter (f0 - f3) to use. */
10433 if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))
10434 return -1;
10436 if (jf->freq < 12 && jf->freq > 3) {
10437 /* Select the frequency for the selected filter. */
10438 if (ixj_WriteDSPCommand(0x5170 + jf->freq, j))
10439 return -1;
10440 } else if (jf->freq > 11) {
10441 /* We need to load a programmable filter set for undefined */
10442 /* frequencies. So we will point the filter to a programmable set. */
10443 /* Since there are only 4 filters and 4 programmable sets, we will */
10444 /* just point the filter to the same number set and program it for the */
10445 /* frequency we want. */
10446 if (ixj_WriteDSPCommand(0x5170 + jf->filter, j))
10447 return -1;
10448 if (j->ver.low != 0x12) {
10449 cmd = 0x515B;
10450 max = 19;
10451 } else {
10452 cmd = 0x515E;
10453 max = 15;
10455 if (ixj_WriteDSPCommand(cmd, j))
10456 return -1;
10457 for (cnt = 0; cnt < max; cnt++) {
10458 if (ixj_WriteDSPCommand(tone_table[jf->freq - 12][cnt], j))
10459 return -1;
10462 j->filter_en[jf->filter] = jf->enable;
10463 return 0;
10466 static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr)
10468 unsigned short cmd;
10469 int cnt, max;
10470 if (jfr->filter > 3) {
10471 return -1;
10473 if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j)) /* Select Filter */
10474 return -1;
10476 if (!jfr->enable) {
10477 if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */
10478 return -1;
10479 else
10480 return 0;
10481 } else {
10482 if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */
10483 return -1;
10484 /* Select the filter (f0 - f3) to use. */
10485 if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))
10486 return -1;
10488 /* We need to load a programmable filter set for undefined */
10489 /* frequencies. So we will point the filter to a programmable set. */
10490 /* Since there are only 4 filters and 4 programmable sets, we will */
10491 /* just point the filter to the same number set and program it for the */
10492 /* frequency we want. */
10493 if (ixj_WriteDSPCommand(0x5170 + jfr->filter, j))
10494 return -1;
10495 if (j->ver.low != 0x12) {
10496 cmd = 0x515B;
10497 max = 19;
10498 } else {
10499 cmd = 0x515E;
10500 max = 15;
10502 if (ixj_WriteDSPCommand(cmd, j))
10503 return -1;
10504 for (cnt = 0; cnt < max; cnt++) {
10505 if (ixj_WriteDSPCommand(jfr->coeff[cnt], j))
10506 return -1;
10508 j->filter_en[jfr->filter] = jfr->enable;
10509 return 0;
10512 static int ixj_init_tone(IXJ *j, IXJ_TONE * ti)
10514 int freq0, freq1;
10515 unsigned short data;
10516 if (ti->freq0) {
10517 freq0 = ti->freq0;
10518 } else {
10519 freq0 = 0x7FFF;
10522 if (ti->freq1) {
10523 freq1 = ti->freq1;
10524 } else {
10525 freq1 = 0x7FFF;
10528 if(ti->tone_index > 12 && ti->tone_index < 28)
10530 if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, j))
10531 return -1;
10532 if (ixj_WriteDSPCommand(0x6000 + (ti->gain1 << 4) + ti->gain0, j))
10533 return -1;
10534 data = freq0;
10535 if (ixj_WriteDSPCommand(data, j))
10536 return -1;
10537 data = freq1;
10538 if (ixj_WriteDSPCommand(data, j))
10539 return -1;
10541 return freq0;