1/**************************************************************************** 2 * ixj.c 3 * 4 * Device Driver for Quicknet Technologies, Inc.'s Telephony cards 5 * including the Internet PhoneJACK, Internet PhoneJACK Lite, 6 * Internet PhoneJACK PCI, Internet LineJACK, Internet PhoneCARD and 7 * SmartCABLE 8 * 9 * (c) Copyright 1999-2001 Quicknet Technologies, Inc. 10 * 11 * This program is free software; you can redistribute it and/or 12 * modify it under the terms of the GNU General Public License 13 * as published by the Free Software Foundation; either version 14 * 2 of the License, or (at your option) any later version. 15 * 16 * Author: Ed Okerson, <eokerson@quicknet.net> 17 * 18 * Contributors: Greg Herlein, <gherlein@quicknet.net> 19 * David W. Erhart, <derhart@quicknet.net> 20 * John Sellers, <jsellers@quicknet.net> 21 * Mike Preston, <mpreston@quicknet.net> 22 * 23 * Fixes: David Huggins-Daines, <dhd@cepstral.com> 24 * Fabio Ferrari, <fabio.ferrari@digitro.com.br> 25 * Artis Kugevics, <artis@mt.lv> 26 * Daniele Bellucci, <bellucda@tiscali.it> 27 * 28 * More information about the hardware related to this driver can be found 29 * at our website: http://www.quicknet.net 30 * 31 * IN NO EVENT SHALL QUICKNET TECHNOLOGIES, INC. BE LIABLE TO ANY PARTY FOR 32 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT 33 * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF QUICKNET 34 * TECHNOLOGIES, INC. HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 35 * 36 * QUICKNET TECHNOLOGIES, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES, 37 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 38 * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 39 * ON AN "AS IS" BASIS, AND QUICKNET TECHNOLOGIES, INC. HAS NO OBLIGATION 40 * TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 41 * 42 ***************************************************************************/ 43 44/* 45 * $Log: ixj.c,v $ 46 * Revision 1.1.1.1 2007/08/03 18:53:01 rnuti 47 * Importing Linux MIPS Kernel 2.6.22 48 * 49 * 50 * Revision 4.8 2003/07/09 19:39:00 Daniele Bellucci 51 * Audit some copy_*_user and minor cleanup. 52 * 53 * Revision 4.7 2001/08/13 06:19:33 craigs 54 * Added additional changes from Alan Cox and John Anderson for 55 * 2.2 to 2.4 cleanup and bounds checking 56 * 57 * Revision 4.6 2001/08/13 01:05:05 craigs 58 * Really fixed PHONE_QUERY_CODEC problem this time 59 * 60 * Revision 4.5 2001/08/13 00:11:03 craigs 61 * Fixed problem in handling of PHONE_QUERY_CODEC, thanks to Shane Anderson 62 * 63 * Revision 4.4 2001/08/07 07:58:12 craigs 64 * Changed back to three digit version numbers 65 * Added tagbuild target to allow automatic and easy tagging of versions 66 * 67 * Revision 4.3 2001/08/07 07:24:47 craigs 68 * Added ixj-ver.h to allow easy configuration management of driver 69 * Added display of version number in /prox/ixj 70 * 71 * Revision 4.2 2001/08/06 07:07:19 craigs 72 * Reverted IXJCTL_DSP_TYPE and IXJCTL_DSP_VERSION files to original 73 * behaviour of returning int rather than short * 74 * 75 * Revision 4.1 2001/08/05 00:17:37 craigs 76 * More changes for correct PCMCIA installation 77 * Start of changes for backward Linux compatibility 78 * 79 * Revision 4.0 2001/08/04 12:33:12 craigs 80 * New version using GNU autoconf 81 * 82 * Revision 3.105 2001/07/20 23:14:32 eokerson 83 * More work on CallerID generation when using ring cadences. 84 * 85 * Revision 3.104 2001/07/06 01:33:55 eokerson 86 * Some bugfixes from Robert Vojta <vojta@ipex.cz> and a few mods to the Makefile. 87 * 88 * Revision 3.103 2001/07/05 19:20:16 eokerson 89 * Updated HOWTO 90 * Changed mic gain to 30dB on Internet LineJACK mic/speaker port. 91 * 92 * Revision 3.102 2001/07/03 23:51:21 eokerson 93 * Un-mute mic on Internet LineJACK when in speakerphone mode. 94 * 95 * Revision 3.101 2001/07/02 19:26:56 eokerson 96 * Removed initialiazation of ixjdebug and ixj_convert_loaded so they will go in the .bss instead of the .data 97 * 98 * Revision 3.100 2001/07/02 19:18:27 eokerson 99 * Changed driver to make dynamic allocation possible. We now pass IXJ * between functions instead of array indexes. 100 * Fixed the way the POTS and PSTN ports interact during a PSTN call to allow local answering. 101 * Fixed speaker mode on Internet LineJACK. 102 * 103 * Revision 3.99 2001/05/09 14:11:16 eokerson 104 * Fixed kmalloc error in ixj_build_filter_cadence. Thanks David Chan <cat@waulogy.stanford.edu>. 105 * 106 * Revision 3.98 2001/05/08 19:55:33 eokerson 107 * Fixed POTS hookstate detection while it is connected to PSTN port. 108 * 109 * Revision 3.97 2001/05/08 00:01:04 eokerson 110 * Fixed kernel oops when sending caller ID data. 111 * 112 * Revision 3.96 2001/05/04 23:09:30 eokerson 113 * Now uses one kernel timer for each card, instead of one for the entire driver. 114 * 115 * Revision 3.95 2001/04/25 22:06:47 eokerson 116 * Fixed squawking at beginning of some G.723.1 calls. 117 * 118 * Revision 3.94 2001/04/03 23:42:00 eokerson 119 * Added linear volume ioctls 120 * Added raw filter load ioctl 121 * 122 * Revision 3.93 2001/02/27 01:00:06 eokerson 123 * Fixed blocking in CallerID. 124 * Reduced size of ixj structure for smaller driver footprint. 125 * 126 * Revision 3.92 2001/02/20 22:02:59 eokerson 127 * Fixed isapnp and pcmcia module compatibility for 2.4.x kernels. 128 * Improved PSTN ring detection. 129 * Fixed wink generation on POTS ports. 130 * 131 * Revision 3.91 2001/02/13 00:55:44 eokerson 132 * Turn AEC back on after changing frame sizes. 133 * 134 * Revision 3.90 2001/02/12 16:42:00 eokerson 135 * Added ALAW codec, thanks to Fabio Ferrari for the table based converters to make ALAW from ULAW. 136 * 137 * Revision 3.89 2001/02/12 15:41:16 eokerson 138 * Fix from Artis Kugevics - Tone gains were not being set correctly. 139 * 140 * Revision 3.88 2001/02/05 23:25:42 eokerson 141 * Fixed lockup bugs with deregister. 142 * 143 * Revision 3.87 2001/01/29 21:00:39 eokerson 144 * Fix from Fabio Ferrari <fabio.ferrari@digitro.com.br> to properly handle EAGAIN and EINTR during non-blocking write. 145 * Updated copyright date. 146 * 147 * Revision 3.86 2001/01/23 23:53:46 eokerson 148 * Fixes to G.729 compatibility. 149 * 150 * Revision 3.85 2001/01/23 21:30:36 eokerson 151 * Added verbage about cards supported. 152 * Removed commands that put the card in low power mode at some times that it should not be in low power mode. 153 * 154 * Revision 3.84 2001/01/22 23:32:10 eokerson 155 * Some bugfixes from David Huggins-Daines, <dhd@cepstral.com> and other cleanups. 156 * 157 * Revision 3.83 2001/01/19 14:51:41 eokerson 158 * Fixed ixj_WriteDSPCommand to decrement usage counter when command fails. 159 * 160 * Revision 3.82 2001/01/19 00:34:49 eokerson 161 * Added verbosity to write overlap errors. 162 * 163 * Revision 3.81 2001/01/18 23:56:54 eokerson 164 * Fixed PSTN line test functions. 165 * 166 * Revision 3.80 2001/01/18 22:29:27 eokerson 167 * Updated AEC/AGC values for different cards. 168 * 169 * Revision 3.79 2001/01/17 02:58:54 eokerson 170 * Fixed AEC reset after Caller ID. 171 * Fixed Codec lockup after Caller ID on Call Waiting when not using 30ms frames. 172 * 173 * Revision 3.78 2001/01/16 19:43:09 eokerson 174 * Added support for Linux 2.4.x kernels. 175 * 176 * Revision 3.77 2001/01/09 04:00:52 eokerson 177 * Linetest will now test the line, even if it has previously succeded. 178 * 179 * Revision 3.76 2001/01/08 19:27:00 eokerson 180 * Fixed problem with standard cable on Internet PhoneCARD. 181 * 182 * Revision 3.75 2000/12/22 16:52:14 eokerson 183 * Modified to allow hookstate detection on the POTS port when the PSTN port is selected. 184 * 185 * Revision 3.74 2000/12/08 22:41:50 eokerson 186 * Added capability for G729B. 187 * 188 * Revision 3.73 2000/12/07 23:35:16 eokerson 189 * Added capability to have different ring pattern before CallerID data. 190 * Added hookstate checks in CallerID routines to stop FSK. 191 * 192 * Revision 3.72 2000/12/06 19:31:31 eokerson 193 * Modified signal behavior to only send one signal per event. 194 * 195 * Revision 3.71 2000/12/06 03:23:08 eokerson 196 * Fixed CallerID on Call Waiting. 197 * 198 * Revision 3.70 2000/12/04 21:29:37 eokerson 199 * Added checking to Smart Cable gain functions. 200 * 201 * Revision 3.69 2000/12/04 21:05:20 eokerson 202 * Changed ixjdebug levels. 203 * Added ioctls to change gains in Internet Phone CARD Smart Cable. 204 * 205 * Revision 3.68 2000/12/04 00:17:21 craigs 206 * Changed mixer voice gain to +6dB rather than 0dB 207 * 208 * Revision 3.67 2000/11/30 21:25:51 eokerson 209 * Fixed write signal errors. 210 * 211 * Revision 3.66 2000/11/29 22:42:44 eokerson 212 * Fixed PSTN ring detect problems. 213 * 214 * Revision 3.65 2000/11/29 07:31:55 craigs 215 * Added new 425Hz filter co-efficients 216 * Added card-specific DTMF prescaler initialisation 217 * 218 * Revision 3.64 2000/11/28 14:03:32 craigs 219 * Changed certain mixer initialisations to be 0dB rather than 12dB 220 * Added additional information to /proc/ixj 221 * 222 * Revision 3.63 2000/11/28 11:38:41 craigs 223 * Added display of AEC modes in AUTO and AGC mode 224 * 225 * Revision 3.62 2000/11/28 04:05:44 eokerson 226 * Improved PSTN ring detection routine. 227 * 228 * Revision 3.61 2000/11/27 21:53:12 eokerson 229 * Fixed flash detection. 230 * 231 * Revision 3.60 2000/11/27 15:57:29 eokerson 232 * More work on G.729 load routines. 233 * 234 * Revision 3.59 2000/11/25 21:55:12 eokerson 235 * Fixed errors in G.729 load routine. 236 * 237 * Revision 3.58 2000/11/25 04:08:29 eokerson 238 * Added board locks around G.729 and TS85 load routines. 239 * 240 * Revision 3.57 2000/11/24 05:35:17 craigs 241 * Added ability to retrieve mixer values on LineJACK 242 * Added complete initialisation of all mixer values at startup 243 * Fixed spelling mistake 244 * 245 * Revision 3.56 2000/11/23 02:52:11 robertj 246 * Added cvs change log keyword. 247 * Fixed bug in capabilities list when using G.729 module. 248 * 249 */ 250 251#include "ixj-ver.h" 252 253#define PERFMON_STATS 254#define IXJDEBUG 0 255#define MAXRINGS 5 256 257#include <linux/module.h> 258 259#include <linux/init.h> 260#include <linux/sched.h> 261#include <linux/kernel.h> /* printk() */ 262#include <linux/fs.h> /* everything... */ 263#include <linux/errno.h> /* error codes */ 264#include <linux/slab.h> 265#include <linux/mm.h> 266#include <linux/ioport.h> 267#include <linux/interrupt.h> 268#include <linux/proc_fs.h> 269#include <linux/poll.h> 270#include <linux/timer.h> 271#include <linux/delay.h> 272#include <linux/pci.h> 273 274#include <asm/io.h> 275#include <asm/uaccess.h> 276 277#include <linux/isapnp.h> 278 279#include "ixj.h" 280 281#define TYPE(inode) (iminor(inode) >> 4) 282#define NUM(inode) (iminor(inode) & 0xf) 283 284static int ixjdebug; 285static int hertz = HZ; 286static int samplerate = 100; 287 288module_param(ixjdebug, int, 0); 289 290static struct pci_device_id ixj_pci_tbl[] __devinitdata = { 291 { PCI_VENDOR_ID_QUICKNET, PCI_DEVICE_ID_QUICKNET_XJ, 292 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 293 { } 294}; 295 296MODULE_DEVICE_TABLE(pci, ixj_pci_tbl); 297 298/************************************************************************ 299* 300* ixjdebug meanings are now bit mapped instead of level based 301* Values can be or'ed together to turn on multiple messages 302* 303* bit 0 (0x0001) = any failure 304* bit 1 (0x0002) = general messages 305* bit 2 (0x0004) = POTS ringing related 306* bit 3 (0x0008) = PSTN events 307* bit 4 (0x0010) = PSTN Cadence state details 308* bit 5 (0x0020) = Tone detection triggers 309* bit 6 (0x0040) = Tone detection cadence details 310* bit 7 (0x0080) = ioctl tracking 311* bit 8 (0x0100) = signal tracking 312* bit 9 (0x0200) = CallerID generation details 313* 314************************************************************************/ 315 316#ifdef IXJ_DYN_ALLOC 317 318static IXJ *ixj[IXJMAX]; 319#define get_ixj(b) ixj[(b)] 320 321/* 322 * Allocate a free IXJ device 323 */ 324 325static IXJ *ixj_alloc() 326{ 327 for(cnt=0; cnt<IXJMAX; cnt++) 328 { 329 if(ixj[cnt] == NULL || !ixj[cnt]->DSPbase) 330 { 331 j = kmalloc(sizeof(IXJ), GFP_KERNEL); 332 if (j == NULL) 333 return NULL; 334 ixj[cnt] = j; 335 return j; 336 } 337 } 338 return NULL; 339} 340 341static void ixj_fsk_free(IXJ *j) 342{ 343 kfree(j->fskdata); 344 j->fskdata = NULL; 345} 346 347static void ixj_fsk_alloc(IXJ *j) 348{ 349 if(!j->fskdata) { 350 j->fskdata = kmalloc(8000, GFP_KERNEL); 351 if (!j->fskdata) { 352 if(ixjdebug & 0x0200) { 353 printk("IXJ phone%d - allocate failed\n", j->board); 354 } 355 return; 356 } else { 357 j->fsksize = 8000; 358 if(ixjdebug & 0x0200) { 359 printk("IXJ phone%d - allocate succeded\n", j->board); 360 } 361 } 362 } 363} 364 365#else 366 367static IXJ ixj[IXJMAX]; 368#define get_ixj(b) (&ixj[(b)]) 369 370/* 371 * Allocate a free IXJ device 372 */ 373 374static IXJ *ixj_alloc(void) 375{ 376 int cnt; 377 for(cnt=0; cnt<IXJMAX; cnt++) { 378 if(!ixj[cnt].DSPbase) 379 return &ixj[cnt]; 380 } 381 return NULL; 382} 383 384static inline void ixj_fsk_free(IXJ *j) {;} 385 386static inline void ixj_fsk_alloc(IXJ *j) 387{ 388 j->fsksize = 8000; 389} 390 391#endif 392 393#ifdef PERFMON_STATS 394#define ixj_perfmon(x) ((x)++) 395#else 396#define ixj_perfmon(x) do { } while(0) 397#endif 398 399static int ixj_convert_loaded; 400 401static int ixj_WriteDSPCommand(unsigned short, IXJ *j); 402 403/************************************************************************ 404* 405* These are function definitions to allow external modules to register 406* enhanced functionality call backs. 407* 408************************************************************************/ 409 410static int Stub(IXJ * J, unsigned long arg) 411{ 412 return 0; 413} 414 415static IXJ_REGFUNC ixj_PreRead = &Stub; 416static IXJ_REGFUNC ixj_PostRead = &Stub; 417static IXJ_REGFUNC ixj_PreWrite = &Stub; 418static IXJ_REGFUNC ixj_PostWrite = &Stub; 419 420static void ixj_read_frame(IXJ *j); 421static void ixj_write_frame(IXJ *j); 422static void ixj_init_timer(IXJ *j); 423static void ixj_add_timer(IXJ * j); 424static void ixj_timeout(unsigned long ptr); 425static int read_filters(IXJ *j); 426static int LineMonitor(IXJ *j); 427static int ixj_fasync(int fd, struct file *, int mode); 428static int ixj_set_port(IXJ *j, int arg); 429static int ixj_set_pots(IXJ *j, int arg); 430static int ixj_hookstate(IXJ *j); 431static int ixj_record_start(IXJ *j); 432static void ixj_record_stop(IXJ *j); 433static void set_rec_volume(IXJ *j, int volume); 434static int get_rec_volume(IXJ *j); 435static int set_rec_codec(IXJ *j, int rate); 436static void ixj_vad(IXJ *j, int arg); 437static int ixj_play_start(IXJ *j); 438static void ixj_play_stop(IXJ *j); 439static int ixj_set_tone_on(unsigned short arg, IXJ *j); 440static int ixj_set_tone_off(unsigned short, IXJ *j); 441static int ixj_play_tone(IXJ *j, char tone); 442static void ixj_aec_start(IXJ *j, int level); 443static int idle(IXJ *j); 444static void ixj_ring_on(IXJ *j); 445static void ixj_ring_off(IXJ *j); 446static void aec_stop(IXJ *j); 447static void ixj_ringback(IXJ *j); 448static void ixj_busytone(IXJ *j); 449static void ixj_dialtone(IXJ *j); 450static void ixj_cpt_stop(IXJ *j); 451static char daa_int_read(IXJ *j); 452static char daa_CR_read(IXJ *j, int cr); 453static int daa_set_mode(IXJ *j, int mode); 454static int ixj_linetest(IXJ *j); 455static int ixj_daa_write(IXJ *j); 456static int ixj_daa_cid_read(IXJ *j); 457static void DAA_Coeff_US(IXJ *j); 458static void DAA_Coeff_UK(IXJ *j); 459static void DAA_Coeff_France(IXJ *j); 460static void DAA_Coeff_Germany(IXJ *j); 461static void DAA_Coeff_Australia(IXJ *j); 462static void DAA_Coeff_Japan(IXJ *j); 463static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf); 464static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr); 465static int ixj_init_tone(IXJ *j, IXJ_TONE * ti); 466static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp); 467static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp); 468/* Serial Control Interface funtions */ 469static int SCI_Control(IXJ *j, int control); 470static int SCI_Prepare(IXJ *j); 471static int SCI_WaitHighSCI(IXJ *j); 472static int SCI_WaitLowSCI(IXJ *j); 473static DWORD PCIEE_GetSerialNumber(WORD wAddress); 474static int ixj_PCcontrol_wait(IXJ *j); 475static void ixj_pre_cid(IXJ *j); 476static void ixj_write_cid(IXJ *j); 477static void ixj_write_cid_bit(IXJ *j, int bit); 478static int set_base_frame(IXJ *j, int size); 479static int set_play_codec(IXJ *j, int rate); 480static void set_rec_depth(IXJ *j, int depth); 481static int ixj_mixer(long val, IXJ *j); 482 483/************************************************************************ 484CT8020/CT8021 Host Programmers Model 485Host address Function Access 486DSPbase + 4870-1 Aux Software Status Register (reserved) Read Only 4882-3 Software Status Register Read Only 4894-5 Aux Software Control Register (reserved) Read Write 4906-7 Software Control Register Read Write 4918-9 Hardware Status Register Read Only 492A-B Hardware Control Register Read Write 493C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only 494E-F Host Recieve (Read) Data Buffer Access Port (buffer input) Read Only 495************************************************************************/ 496 497static inline void ixj_read_HSR(IXJ *j) 498{ 499 j->hsr.bytes.low = inb_p(j->DSPbase + 8); 500 j->hsr.bytes.high = inb_p(j->DSPbase + 9); 501} 502 503static inline int IsControlReady(IXJ *j) 504{ 505 ixj_read_HSR(j); 506 return j->hsr.bits.controlrdy ? 1 : 0; 507} 508 509static inline int IsPCControlReady(IXJ *j) 510{ 511 j->pccr1.byte = inb_p(j->XILINXbase + 3); 512 return j->pccr1.bits.crr ? 1 : 0; 513} 514 515static inline int IsStatusReady(IXJ *j) 516{ 517 ixj_read_HSR(j); 518 return j->hsr.bits.statusrdy ? 1 : 0; 519} 520 521static inline int IsRxReady(IXJ *j) 522{ 523 ixj_read_HSR(j); 524 ixj_perfmon(j->rxreadycheck); 525 return j->hsr.bits.rxrdy ? 1 : 0; 526} 527 528static inline int IsTxReady(IXJ *j) 529{ 530 ixj_read_HSR(j); 531 ixj_perfmon(j->txreadycheck); 532 return j->hsr.bits.txrdy ? 1 : 0; 533} 534 535static inline void set_play_volume(IXJ *j, int volume) 536{ 537 if (ixjdebug & 0x0002) 538 printk(KERN_INFO "IXJ: /dev/phone%d Setting Play Volume to 0x%4.4x\n", j->board, volume); 539 ixj_WriteDSPCommand(0xCF02, j); 540 ixj_WriteDSPCommand(volume, j); 541} 542 543static int set_play_volume_linear(IXJ *j, int volume) 544{ 545 int newvolume, dspplaymax; 546 547 if (ixjdebug & 0x0002) 548 printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Play Volume to 0x%4.4x\n", j->board, volume); 549 if(volume > 100 || volume < 0) { 550 return -1; 551 } 552 553 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */ 554 switch (j->cardtype) { 555 case QTI_PHONEJACK: 556 dspplaymax = 0x380; 557 break; 558 case QTI_LINEJACK: 559 if(j->port == PORT_PSTN) { 560 dspplaymax = 0x48; 561 } else { 562 dspplaymax = 0x100; 563 } 564 break; 565 case QTI_PHONEJACK_LITE: 566 dspplaymax = 0x380; 567 break; 568 case QTI_PHONEJACK_PCI: 569 dspplaymax = 0x6C; 570 break; 571 case QTI_PHONECARD: 572 dspplaymax = 0x50; 573 break; 574 default: 575 return -1; 576 } 577 newvolume = (dspplaymax * volume) / 100; 578 set_play_volume(j, newvolume); 579 return 0; 580} 581 582static inline void set_play_depth(IXJ *j, int depth) 583{ 584 if (depth > 60) 585 depth = 60; 586 if (depth < 0) 587 depth = 0; 588 ixj_WriteDSPCommand(0x5280 + depth, j); 589} 590 591static inline int get_play_volume(IXJ *j) 592{ 593 ixj_WriteDSPCommand(0xCF00, j); 594 return j->ssr.high << 8 | j->ssr.low; 595} 596 597static int get_play_volume_linear(IXJ *j) 598{ 599 int volume, newvolume, dspplaymax; 600 601 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */ 602 switch (j->cardtype) { 603 case QTI_PHONEJACK: 604 dspplaymax = 0x380; 605 break; 606 case QTI_LINEJACK: 607 if(j->port == PORT_PSTN) { 608 dspplaymax = 0x48; 609 } else { 610 dspplaymax = 0x100; 611 } 612 break; 613 case QTI_PHONEJACK_LITE: 614 dspplaymax = 0x380; 615 break; 616 case QTI_PHONEJACK_PCI: 617 dspplaymax = 0x6C; 618 break; 619 case QTI_PHONECARD: 620 dspplaymax = 100; 621 break; 622 default: 623 return -1; 624 } 625 volume = get_play_volume(j); 626 newvolume = (volume * 100) / dspplaymax; 627 if(newvolume > 100) 628 newvolume = 100; 629 return newvolume; 630} 631 632static inline BYTE SLIC_GetState(IXJ *j) 633{ 634 if (j->cardtype == QTI_PHONECARD) { 635 j->pccr1.byte = 0; 636 j->psccr.bits.dev = 3; 637 j->psccr.bits.rw = 1; 638 outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00); 639 ixj_PCcontrol_wait(j); 640 j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF; 641 ixj_PCcontrol_wait(j); 642 if (j->pslic.bits.powerdown) 643 return PLD_SLIC_STATE_OC; 644 else if (!j->pslic.bits.ring0 && !j->pslic.bits.ring1) 645 return PLD_SLIC_STATE_ACTIVE; 646 else 647 return PLD_SLIC_STATE_RINGING; 648 } else { 649 j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01); 650 } 651 return j->pld_slicr.bits.state; 652} 653 654static bool SLIC_SetState(BYTE byState, IXJ *j) 655{ 656 bool fRetVal = false; 657 658 if (j->cardtype == QTI_PHONECARD) { 659 if (j->flags.pcmciasct) { 660 switch (byState) { 661 case PLD_SLIC_STATE_TIPOPEN: 662 case PLD_SLIC_STATE_OC: 663 j->pslic.bits.powerdown = 1; 664 j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0; 665 fRetVal = true; 666 break; 667 case PLD_SLIC_STATE_RINGING: 668 if (j->readers || j->writers) { 669 j->pslic.bits.powerdown = 0; 670 j->pslic.bits.ring0 = 1; 671 j->pslic.bits.ring1 = 0; 672 fRetVal = true; 673 } 674 break; 675 case PLD_SLIC_STATE_OHT: /* On-hook transmit */ 676 677 case PLD_SLIC_STATE_STANDBY: 678 case PLD_SLIC_STATE_ACTIVE: 679 if (j->readers || j->writers) { 680 j->pslic.bits.powerdown = 0; 681 } else { 682 j->pslic.bits.powerdown = 1; 683 } 684 j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0; 685 fRetVal = true; 686 break; 687 case PLD_SLIC_STATE_APR: /* Active polarity reversal */ 688 689 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */ 690 691 default: 692 fRetVal = false; 693 break; 694 } 695 j->psccr.bits.dev = 3; 696 j->psccr.bits.rw = 0; 697 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00); 698 ixj_PCcontrol_wait(j); 699 } 700 } else { 701 /* Set the C1, C2, C3 & B2EN signals. */ 702 switch (byState) { 703 case PLD_SLIC_STATE_OC: 704 j->pld_slicw.bits.c1 = 0; 705 j->pld_slicw.bits.c2 = 0; 706 j->pld_slicw.bits.c3 = 0; 707 j->pld_slicw.bits.b2en = 0; 708 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 709 fRetVal = true; 710 break; 711 case PLD_SLIC_STATE_RINGING: 712 j->pld_slicw.bits.c1 = 1; 713 j->pld_slicw.bits.c2 = 0; 714 j->pld_slicw.bits.c3 = 0; 715 j->pld_slicw.bits.b2en = 1; 716 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 717 fRetVal = true; 718 break; 719 case PLD_SLIC_STATE_ACTIVE: 720 j->pld_slicw.bits.c1 = 0; 721 j->pld_slicw.bits.c2 = 1; 722 j->pld_slicw.bits.c3 = 0; 723 j->pld_slicw.bits.b2en = 0; 724 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 725 fRetVal = true; 726 break; 727 case PLD_SLIC_STATE_OHT: /* On-hook transmit */ 728 729 j->pld_slicw.bits.c1 = 1; 730 j->pld_slicw.bits.c2 = 1; 731 j->pld_slicw.bits.c3 = 0; 732 j->pld_slicw.bits.b2en = 0; 733 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 734 fRetVal = true; 735 break; 736 case PLD_SLIC_STATE_TIPOPEN: 737 j->pld_slicw.bits.c1 = 0; 738 j->pld_slicw.bits.c2 = 0; 739 j->pld_slicw.bits.c3 = 1; 740 j->pld_slicw.bits.b2en = 0; 741 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 742 fRetVal = true; 743 break; 744 case PLD_SLIC_STATE_STANDBY: 745 j->pld_slicw.bits.c1 = 1; 746 j->pld_slicw.bits.c2 = 0; 747 j->pld_slicw.bits.c3 = 1; 748 j->pld_slicw.bits.b2en = 1; 749 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 750 fRetVal = true; 751 break; 752 case PLD_SLIC_STATE_APR: /* Active polarity reversal */ 753 754 j->pld_slicw.bits.c1 = 0; 755 j->pld_slicw.bits.c2 = 1; 756 j->pld_slicw.bits.c3 = 1; 757 j->pld_slicw.bits.b2en = 0; 758 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 759 fRetVal = true; 760 break; 761 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */ 762 763 j->pld_slicw.bits.c1 = 1; 764 j->pld_slicw.bits.c2 = 1; 765 j->pld_slicw.bits.c3 = 1; 766 j->pld_slicw.bits.b2en = 0; 767 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 768 fRetVal = true; 769 break; 770 default: 771 fRetVal = false; 772 break; 773 } 774 } 775 776 return fRetVal; 777} 778 779static int ixj_wink(IXJ *j) 780{ 781 BYTE slicnow; 782 783 slicnow = SLIC_GetState(j); 784 785 j->pots_winkstart = jiffies; 786 SLIC_SetState(PLD_SLIC_STATE_OC, j); 787 788 msleep(jiffies_to_msecs(j->winktime)); 789 790 SLIC_SetState(slicnow, j); 791 return 0; 792} 793 794static void ixj_init_timer(IXJ *j) 795{ 796 init_timer(&j->timer); 797 j->timer.function = ixj_timeout; 798 j->timer.data = (unsigned long)j; 799} 800 801static void ixj_add_timer(IXJ *j) 802{ 803 j->timer.expires = jiffies + (hertz / samplerate); 804 add_timer(&j->timer); 805} 806 807static void ixj_tone_timeout(IXJ *j) 808{ 809 IXJ_TONE ti; 810 811 j->tone_state++; 812 if (j->tone_state == 3) { 813 j->tone_state = 0; 814 if (j->cadence_t) { 815 j->tone_cadence_state++; 816 if (j->tone_cadence_state >= j->cadence_t->elements_used) { 817 switch (j->cadence_t->termination) { 818 case PLAY_ONCE: 819 ixj_cpt_stop(j); 820 break; 821 case REPEAT_LAST_ELEMENT: 822 j->tone_cadence_state--; 823 ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index); 824 break; 825 case REPEAT_ALL: 826 j->tone_cadence_state = 0; 827 if (j->cadence_t->ce[j->tone_cadence_state].freq0) { 828 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index; 829 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0; 830 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0; 831 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1; 832 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1; 833 ixj_init_tone(j, &ti); 834 } 835 ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, j); 836 ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, j); 837 ixj_play_tone(j, j->cadence_t->ce[0].index); 838 break; 839 } 840 } else { 841 if (j->cadence_t->ce[j->tone_cadence_state].gain0) { 842 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index; 843 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0; 844 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0; 845 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1; 846 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1; 847 ixj_init_tone(j, &ti); 848 } 849 ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, j); 850 ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, j); 851 ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index); 852 } 853 } 854 } 855} 856 857static inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir) 858{ 859 if(j->ixj_signals[event]) { 860 if(ixjdebug & 0x0100) 861 printk("Sending signal for event %d\n", event); 862 /* Send apps notice of change */ 863 /* see config.h for macro definition */ 864 kill_fasync(&(j->async_queue), j->ixj_signals[event], dir); 865 } 866} 867 868static void ixj_pstn_state(IXJ *j) 869{ 870 int var; 871 union XOPXR0 XR0, daaint; 872 873 var = 10; 874 875 XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg; 876 daaint.reg = 0; 877 XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR; 878 879 j->pld_scrr.byte = inb_p(j->XILINXbase); 880 if (j->pld_scrr.bits.daaflag) { 881 daa_int_read(j); 882 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) { 883 if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) { 884 daaint.bitreg.RING = 1; 885 if(ixjdebug & 0x0008) { 886 printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j->board, jiffies); 887 } 888 } else { 889 daa_set_mode(j, SOP_PU_RESET); 890 } 891 } 892 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) { 893 daaint.bitreg.Caller_ID = 1; 894 j->pstn_cid_intr = 1; 895 j->pstn_cid_received = jiffies; 896 if(ixjdebug & 0x0008) { 897 printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j->board, jiffies); 898 } 899 } 900 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) { 901 daaint.bitreg.Cadence = 1; 902 if(ixjdebug & 0x0008) { 903 printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j->board, jiffies); 904 } 905 } 906 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) { 907 daaint.bitreg.VDD_OK = 1; 908 daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK; 909 } 910 } 911 daa_CR_read(j, 1); 912 if(j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR != XR0.bitreg.RMR && time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) { 913 daaint.bitreg.RMR = 1; 914 daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR; 915 if(ixjdebug & 0x0008) { 916 printk(KERN_INFO "IXJ DAA RMR /dev/phone%d was %s for %ld\n", j->board, XR0.bitreg.RMR?"on":"off", jiffies - j->pstn_last_rmr); 917 } 918 j->pstn_prev_rmr = j->pstn_last_rmr; 919 j->pstn_last_rmr = jiffies; 920 } 921 switch(j->daa_mode) { 922 case SOP_PU_SLEEP: 923 if (daaint.bitreg.RING) { 924 if (!j->flags.pstn_ringing) { 925 if (j->daa_mode != SOP_PU_RINGING) { 926 j->pstn_ring_int = jiffies; 927 daa_set_mode(j, SOP_PU_RINGING); 928 } 929 } 930 } 931 break; 932 case SOP_PU_RINGING: 933 if (daaint.bitreg.RMR) { 934 if (ixjdebug & 0x0008) { 935 printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies); 936 } 937 if (daaint.bitreg.SI_1) { /* Rising edge of RMR */ 938 j->flags.pstn_rmr = 1; 939 j->pstn_ring_start = jiffies; 940 j->pstn_ring_stop = 0; 941 j->ex.bits.pstn_ring = 0; 942 if (j->cadence_f[4].state == 0) { 943 j->cadence_f[4].state = 1; 944 j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000); 945 j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000); 946 j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000); 947 } else if (j->cadence_f[4].state == 2) { 948 if((time_after(jiffies, j->cadence_f[4].off1min) && 949 time_before(jiffies, j->cadence_f[4].off1max))) { 950 if (j->cadence_f[4].on2) { 951 j->cadence_f[4].state = 3; 952 j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000)); 953 j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000)); 954 j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000)); 955 } else { 956 j->cadence_f[4].state = 7; 957 } 958 } else { 959 if (ixjdebug & 0x0008) { 960 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", 961 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, 962 j->cadence_f[4].off1); 963 } 964 j->cadence_f[4].state = 0; 965 } 966 } else if (j->cadence_f[4].state == 4) { 967 if((time_after(jiffies, j->cadence_f[4].off2min) && 968 time_before(jiffies, j->cadence_f[4].off2max))) { 969 if (j->cadence_f[4].on3) { 970 j->cadence_f[4].state = 5; 971 j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000)); 972 j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000)); 973 j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000)); 974 } else { 975 j->cadence_f[4].state = 7; 976 } 977 } else { 978 if (ixjdebug & 0x0008) { 979 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", 980 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, 981 j->cadence_f[4].off2); 982 } 983 j->cadence_f[4].state = 0; 984 } 985 } else if (j->cadence_f[4].state == 6) { 986 if((time_after(jiffies, j->cadence_f[4].off3min) && 987 time_before(jiffies, j->cadence_f[4].off3max))) { 988 j->cadence_f[4].state = 7; 989 } else { 990 if (ixjdebug & 0x0008) { 991 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", 992 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, 993 j->cadence_f[4].off3); 994 } 995 j->cadence_f[4].state = 0; 996 } 997 } else { 998 j->cadence_f[4].state = 0; 999 } 1000 } else { /* Falling edge of RMR */ 1001 j->pstn_ring_start = 0; 1002 j->pstn_ring_stop = jiffies; 1003 if (j->cadence_f[4].state == 1) { 1004 if(!j->cadence_f[4].on1) { 1005 j->cadence_f[4].state = 7; 1006 } else if((time_after(jiffies, j->cadence_f[4].on1min) && 1007 time_before(jiffies, j->cadence_f[4].on1max))) { 1008 if (j->cadence_f[4].off1) { 1009 j->cadence_f[4].state = 2; 1010 j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000)); 1011 j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000)); 1012 j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000)); 1013 } else { 1014 j->cadence_f[4].state = 7; 1015 } 1016 } else { 1017 if (ixjdebug & 0x0008) { 1018 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", 1019 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, 1020 j->cadence_f[4].on1); 1021 } 1022 j->cadence_f[4].state = 0; 1023 } 1024 } else if (j->cadence_f[4].state == 3) { 1025 if((time_after(jiffies, j->cadence_f[4].on2min) && 1026 time_before(jiffies, j->cadence_f[4].on2max))) { 1027 if (j->cadence_f[4].off2) { 1028 j->cadence_f[4].state = 4; 1029 j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000)); 1030 j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000)); 1031 j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000)); 1032 } else { 1033 j->cadence_f[4].state = 7; 1034 } 1035 } else { 1036 if (ixjdebug & 0x0008) { 1037 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", 1038 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, 1039 j->cadence_f[4].on2); 1040 } 1041 j->cadence_f[4].state = 0; 1042 } 1043 } else if (j->cadence_f[4].state == 5) { 1044 if((time_after(jiffies, j->cadence_f[4].on3min) && 1045 time_before(jiffies, j->cadence_f[4].on3max))) { 1046 if (j->cadence_f[4].off3) { 1047 j->cadence_f[4].state = 6; 1048 j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000)); 1049 j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000)); 1050 j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000)); 1051 } else { 1052 j->cadence_f[4].state = 7; 1053 } 1054 } else { 1055 j->cadence_f[4].state = 0; 1056 } 1057 } else { 1058 if (ixjdebug & 0x0008) { 1059 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n", 1060 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr, 1061 j->cadence_f[4].on3); 1062 } 1063 j->cadence_f[4].state = 0; 1064 } 1065 } 1066 if (ixjdebug & 0x0010) { 1067 printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies); 1068 } 1069 if (ixjdebug & 0x0010) { 1070 switch(j->cadence_f[4].state) { 1071 case 1: 1072 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, 1073 j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max); 1074 break; 1075 case 2: 1076 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, 1077 j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max); 1078 break; 1079 case 3: 1080 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, 1081 j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max); 1082 break; 1083 case 4: 1084 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, 1085 j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max); 1086 break; 1087 case 5: 1088 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, 1089 j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max); 1090 break; 1091 case 6: 1092 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board, 1093 j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max); 1094 break; 1095 } 1096 } 1097 } 1098 if (j->cadence_f[4].state == 7) { 1099 j->cadence_f[4].state = 0; 1100 j->pstn_ring_stop = jiffies; 1101 j->ex.bits.pstn_ring = 1; 1102 ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN); 1103 if(ixjdebug & 0x0008) { 1104 printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ld\n", j->board, jiffies); 1105 } 1106 } 1107 if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) || 1108 (j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) { 1109 if(ixjdebug & 0x0008) { 1110 printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j->board, jiffies); 1111 printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j->board, j->pstn_ring_int); 1112 printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j->board, j->pstn_ring_stop); 1113 } 1114 j->pstn_ring_stop = j->pstn_ring_int = 0; 1115 daa_set_mode(j, SOP_PU_SLEEP); 1116 } 1117 outb_p(j->pld_scrw.byte, j->XILINXbase); 1118 if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) { 1119 ixj_daa_cid_read(j); 1120 j->ex.bits.caller_id = 1; 1121 ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN); 1122 j->pstn_cid_intr = 0; 1123 } 1124 if (daaint.bitreg.Cadence) { 1125 if(ixjdebug & 0x0008) { 1126 printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j->board); 1127 } 1128 daa_set_mode(j, SOP_PU_SLEEP); 1129 j->ex.bits.pstn_ring = 0; 1130 } 1131 break; 1132 case SOP_PU_CONVERSATION: 1133 if (daaint.bitreg.VDD_OK) { 1134 if(!daaint.bitreg.SI_0) { 1135 if (!j->pstn_winkstart) { 1136 if(ixjdebug & 0x0008) { 1137 printk("IXJ DAA possible wink /dev/phone%d %ld\n", j->board, jiffies); 1138 } 1139 j->pstn_winkstart = jiffies; 1140 } 1141 } else { 1142 if (j->pstn_winkstart) { 1143 if(ixjdebug & 0x0008) { 1144 printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies); 1145 } 1146 j->pstn_winkstart = 0; 1147 } 1148 } 1149 } 1150 if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) { 1151 if(ixjdebug & 0x0008) { 1152 printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j->board, jiffies); 1153 } 1154 daa_set_mode(j, SOP_PU_SLEEP); 1155 j->pstn_winkstart = 0; 1156 j->ex.bits.pstn_wink = 1; 1157 ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN); 1158 } 1159 break; 1160 } 1161} 1162 1163static void ixj_timeout(unsigned long ptr) 1164{ 1165 int board; 1166 unsigned long jifon; 1167 IXJ *j = (IXJ *)ptr; 1168 board = j->board; 1169 1170 if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) { 1171 ixj_perfmon(j->timerchecks); 1172 j->hookstate = ixj_hookstate(j); 1173 if (j->tone_state) { 1174 if (!(j->hookstate)) { 1175 ixj_cpt_stop(j); 1176 if (j->m_hook) { 1177 j->m_hook = 0; 1178 j->ex.bits.hookstate = 1; 1179 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN); 1180 } 1181 clear_bit(board, &j->busyflags); 1182 ixj_add_timer(j); 1183 return; 1184 } 1185 if (j->tone_state == 1) 1186 jifon = ((hertz * j->tone_on_time) * 25 / 100000); 1187 else 1188 jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000); 1189 if (time_before(jiffies, j->tone_start_jif + jifon)) { 1190 if (j->tone_state == 1) { 1191 ixj_play_tone(j, j->tone_index); 1192 if (j->dsp.low == 0x20) { 1193 clear_bit(board, &j->busyflags); 1194 ixj_add_timer(j); 1195 return; 1196 } 1197 } else { 1198 ixj_play_tone(j, 0); 1199 if (j->dsp.low == 0x20) { 1200 clear_bit(board, &j->busyflags); 1201 ixj_add_timer(j); 1202 return; 1203 } 1204 } 1205 } else { 1206 ixj_tone_timeout(j); 1207 if (j->flags.dialtone) { 1208 ixj_dialtone(j); 1209 } 1210 if (j->flags.busytone) { 1211 ixj_busytone(j); 1212 if (j->dsp.low == 0x20) { 1213 clear_bit(board, &j->busyflags); 1214 ixj_add_timer(j); 1215 return; 1216 } 1217 } 1218 if (j->flags.ringback) { 1219 ixj_ringback(j); 1220 if (j->dsp.low == 0x20) { 1221 clear_bit(board, &j->busyflags); 1222 ixj_add_timer(j); 1223 return; 1224 } 1225 } 1226 if (!j->tone_state) { 1227 ixj_cpt_stop(j); 1228 } 1229 } 1230 } 1231 if (!(j->tone_state && j->dsp.low == 0x20)) { 1232 if (IsRxReady(j)) { 1233 ixj_read_frame(j); 1234 } 1235 if (IsTxReady(j)) { 1236 ixj_write_frame(j); 1237 } 1238 } 1239 if (j->flags.cringing) { 1240 if (j->hookstate & 1) { 1241 j->flags.cringing = 0; 1242 ixj_ring_off(j); 1243 } else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) { 1244 switch(j->cadence_f[5].state) { 1245 case 0: 1246 j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000)); 1247 if (time_before(jiffies, j->cadence_f[5].on1dot)) { 1248 if(ixjdebug & 0x0004) { 1249 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); 1250 } 1251 ixj_ring_on(j); 1252 } 1253 j->cadence_f[5].state = 1; 1254 break; 1255 case 1: 1256 if (time_after(jiffies, j->cadence_f[5].on1dot)) { 1257 j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000)); 1258 if(ixjdebug & 0x0004) { 1259 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); 1260 } 1261 ixj_ring_off(j); 1262 j->cadence_f[5].state = 2; 1263 } 1264 break; 1265 case 2: 1266 if (time_after(jiffies, j->cadence_f[5].off1dot)) { 1267 if(ixjdebug & 0x0004) { 1268 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); 1269 } 1270 ixj_ring_on(j); 1271 if (j->cadence_f[5].on2) { 1272 j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000)); 1273 j->cadence_f[5].state = 3; 1274 } else { 1275 j->cadence_f[5].state = 7; 1276 } 1277 } 1278 break; 1279 case 3: 1280 if (time_after(jiffies, j->cadence_f[5].on2dot)) { 1281 if(ixjdebug & 0x0004) { 1282 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); 1283 } 1284 ixj_ring_off(j); 1285 if (j->cadence_f[5].off2) { 1286 j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000)); 1287 j->cadence_f[5].state = 4; 1288 } else { 1289 j->cadence_f[5].state = 7; 1290 } 1291 } 1292 break; 1293 case 4: 1294 if (time_after(jiffies, j->cadence_f[5].off2dot)) { 1295 if(ixjdebug & 0x0004) { 1296 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); 1297 } 1298 ixj_ring_on(j); 1299 if (j->cadence_f[5].on3) { 1300 j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000)); 1301 j->cadence_f[5].state = 5; 1302 } else { 1303 j->cadence_f[5].state = 7; 1304 } 1305 } 1306 break; 1307 case 5: 1308 if (time_after(jiffies, j->cadence_f[5].on3dot)) { 1309 if(ixjdebug & 0x0004) { 1310 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); 1311 } 1312 ixj_ring_off(j); 1313 if (j->cadence_f[5].off3) { 1314 j->cadence_f[5].off3dot = jiffies + (long)((j->cadence_f[5].off3 * (hertz * 100) / 10000)); 1315 j->cadence_f[5].state = 6; 1316 } else { 1317 j->cadence_f[5].state = 7; 1318 } 1319 } 1320 break; 1321 case 6: 1322 if (time_after(jiffies, j->cadence_f[5].off3dot)) { 1323 if(ixjdebug & 0x0004) { 1324 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); 1325 } 1326 j->cadence_f[5].state = 7; 1327 } 1328 break; 1329 case 7: 1330 if(ixjdebug & 0x0004) { 1331 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies); 1332 } 1333 j->flags.cidring = 1; 1334 j->cadence_f[5].state = 0; 1335 break; 1336 } 1337 if (j->flags.cidring && !j->flags.cidsent) { 1338 j->flags.cidsent = 1; 1339 if(j->fskdcnt) { 1340 SLIC_SetState(PLD_SLIC_STATE_OHT, j); 1341 ixj_pre_cid(j); 1342 } 1343 j->flags.cidring = 0; 1344 } 1345 clear_bit(board, &j->busyflags); 1346 ixj_add_timer(j); 1347 return; 1348 } else { 1349 if (time_after(jiffies, j->ring_cadence_jif + (hertz / 2))) { 1350 if (j->flags.cidring && !j->flags.cidsent) { 1351 j->flags.cidsent = 1; 1352 if(j->fskdcnt) { 1353 SLIC_SetState(PLD_SLIC_STATE_OHT, j); 1354 ixj_pre_cid(j); 1355 } 1356 j->flags.cidring = 0; 1357 } 1358 j->ring_cadence_t--; 1359 if (j->ring_cadence_t == -1) 1360 j->ring_cadence_t = 15; 1361 j->ring_cadence_jif = jiffies; 1362 1363 if (j->ring_cadence & 1 << j->ring_cadence_t) { 1364 if(j->flags.cidsent && j->cadence_f[5].en_filter) 1365 j->flags.firstring = 1; 1366 else 1367 ixj_ring_on(j); 1368 } else { 1369 ixj_ring_off(j); 1370 if(!j->flags.cidsent) 1371 j->flags.cidring = 1; 1372 } 1373 } 1374 clear_bit(board, &j->busyflags); 1375 ixj_add_timer(j); 1376 return; 1377 } 1378 } 1379 if (!j->flags.ringing) { 1380 if (j->hookstate) { /* & 1) { */ 1381 if (j->dsp.low != 0x20 && 1382 SLIC_GetState(j) != PLD_SLIC_STATE_ACTIVE) { 1383 SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); 1384 } 1385 LineMonitor(j); 1386 read_filters(j); 1387 ixj_WriteDSPCommand(0x511B, j); 1388 j->proc_load = j->ssr.high << 8 | j->ssr.low; 1389 if (!j->m_hook && (j->hookstate & 1)) { 1390 j->m_hook = j->ex.bits.hookstate = 1; 1391 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN); 1392 } 1393 } else { 1394 if (j->ex.bits.dtmf_ready) { 1395 j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0; 1396 } 1397 if (j->m_hook) { 1398 j->m_hook = 0; 1399 j->ex.bits.hookstate = 1; 1400 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN); 1401 } 1402 } 1403 } 1404 if (j->cardtype == QTI_LINEJACK && !j->flags.pstncheck && j->flags.pstn_present) { 1405 ixj_pstn_state(j); 1406 } 1407 if (j->ex.bytes) { 1408 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */ 1409 } 1410 clear_bit(board, &j->busyflags); 1411 } 1412 ixj_add_timer(j); 1413} 1414 1415static int ixj_status_wait(IXJ *j) 1416{ 1417 unsigned long jif; 1418 1419 jif = jiffies + ((60 * hertz) / 100); 1420 while (!IsStatusReady(j)) { 1421 ixj_perfmon(j->statuswait); 1422 if (time_after(jiffies, jif)) { 1423 ixj_perfmon(j->statuswaitfail); 1424 return -1; 1425 } 1426 } 1427 return 0; 1428} 1429 1430static int ixj_PCcontrol_wait(IXJ *j) 1431{ 1432 unsigned long jif; 1433 1434 jif = jiffies + ((60 * hertz) / 100); 1435 while (!IsPCControlReady(j)) { 1436 ixj_perfmon(j->pcontrolwait); 1437 if (time_after(jiffies, jif)) { 1438 ixj_perfmon(j->pcontrolwaitfail); 1439 return -1; 1440 } 1441 } 1442 return 0; 1443} 1444 1445static int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j) 1446{ 1447 BYTES bytes; 1448 unsigned long jif; 1449 1450 atomic_inc(&j->DSPWrite); 1451 if(atomic_read(&j->DSPWrite) > 1) { 1452 printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j->board, cmd); 1453 return -1; 1454 } 1455 bytes.high = (cmd & 0xFF00) >> 8; 1456 bytes.low = cmd & 0x00FF; 1457 jif = jiffies + ((60 * hertz) / 100); 1458 while (!IsControlReady(j)) { 1459 ixj_perfmon(j->iscontrolready); 1460 if (time_after(jiffies, jif)) { 1461 ixj_perfmon(j->iscontrolreadyfail); 1462 atomic_dec(&j->DSPWrite); 1463 if(atomic_read(&j->DSPWrite) > 0) { 1464 printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j->board, cmd); 1465 while(atomic_read(&j->DSPWrite) > 0) { 1466 atomic_dec(&j->DSPWrite); 1467 } 1468 } 1469 return -1; 1470 } 1471 } 1472 outb(bytes.low, j->DSPbase + 6); 1473 outb(bytes.high, j->DSPbase + 7); 1474 1475 if (ixj_status_wait(j)) { 1476 j->ssr.low = 0xFF; 1477 j->ssr.high = 0xFF; 1478 atomic_dec(&j->DSPWrite); 1479 if(atomic_read(&j->DSPWrite) > 0) { 1480 printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j->board, cmd); 1481 while(atomic_read(&j->DSPWrite) > 0) { 1482 atomic_dec(&j->DSPWrite); 1483 } 1484 } 1485 return -1; 1486 } 1487/* Read Software Status Register */ 1488 j->ssr.low = inb_p(j->DSPbase + 2); 1489 j->ssr.high = inb_p(j->DSPbase + 3); 1490 atomic_dec(&j->DSPWrite); 1491 if(atomic_read(&j->DSPWrite) > 0) { 1492 printk("IXJ %d DSP overlaped command 0x%4.4x\n", j->board, cmd); 1493 while(atomic_read(&j->DSPWrite) > 0) { 1494 atomic_dec(&j->DSPWrite); 1495 } 1496 } 1497 return 0; 1498} 1499 1500/*************************************************************************** 1501* 1502* General Purpose IO Register read routine 1503* 1504***************************************************************************/ 1505static inline int ixj_gpio_read(IXJ *j) 1506{ 1507 if (ixj_WriteDSPCommand(0x5143, j)) 1508 return -1; 1509 1510 j->gpio.bytes.low = j->ssr.low; 1511 j->gpio.bytes.high = j->ssr.high; 1512 1513 return 0; 1514} 1515 1516static inline void LED_SetState(int state, IXJ *j) 1517{ 1518 if (j->cardtype == QTI_LINEJACK) { 1519 j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0; 1520 j->pld_scrw.bits.led2 = state & 0x2 ? 1 : 0; 1521 j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0; 1522 j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0; 1523 1524 outb(j->pld_scrw.byte, j->XILINXbase); 1525 } 1526} 1527 1528/********************************************************************* 1529* GPIO Pins are configured as follows on the Quicknet Internet 1530* PhoneJACK Telephony Cards 1531* 1532* POTS Select GPIO_6=0 GPIO_7=0 1533* Mic/Speaker Select GPIO_6=0 GPIO_7=1 1534* Handset Select GPIO_6=1 GPIO_7=0 1535* 1536* SLIC Active GPIO_1=0 GPIO_2=1 GPIO_5=0 1537* SLIC Ringing GPIO_1=1 GPIO_2=1 GPIO_5=0 1538* SLIC Open Circuit GPIO_1=0 GPIO_2=0 GPIO_5=0 1539* 1540* Hook Switch changes reported on GPIO_3 1541*********************************************************************/ 1542static int ixj_set_port(IXJ *j, int arg) 1543{ 1544 if (j->cardtype == QTI_PHONEJACK_LITE) { 1545 if (arg != PORT_POTS) 1546 return 10; 1547 else 1548 return 0; 1549 } 1550 switch (arg) { 1551 case PORT_POTS: 1552 j->port = PORT_POTS; 1553 switch (j->cardtype) { 1554 case QTI_PHONECARD: 1555 if (j->flags.pcmciasct == 1) 1556 SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); 1557 else 1558 return 11; 1559 break; 1560 case QTI_PHONEJACK_PCI: 1561 j->pld_slicw.pcib.mic = 0; 1562 j->pld_slicw.pcib.spk = 0; 1563 outb(j->pld_slicw.byte, j->XILINXbase + 0x01); 1564 break; 1565 case QTI_LINEJACK: 1566 ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */ 1567 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to 1568 Software Control Register */ 1569 return 2; 1570 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ 1571 1572 outb(j->pld_scrw.byte, j->XILINXbase); 1573 j->pld_clock.byte = 0; 1574 outb(j->pld_clock.byte, j->XILINXbase + 0x04); 1575 j->pld_slicw.bits.rly1 = 1; 1576 j->pld_slicw.bits.spken = 0; 1577 outb(j->pld_slicw.byte, j->XILINXbase + 0x01); 1578 ixj_mixer(0x1200, j); /* Turn Off MIC switch on mixer left */ 1579 ixj_mixer(0x1401, j); /* Turn On Mono1 switch on mixer left */ 1580 ixj_mixer(0x1300, j); /* Turn Off MIC switch on mixer right */ 1581 ixj_mixer(0x1501, j); /* Turn On Mono1 switch on mixer right */ 1582 ixj_mixer(0x0E80, j); /*Mic mute */ 1583 ixj_mixer(0x0F00, j); /* Set mono out (SLIC) to 0dB */ 1584 ixj_mixer(0x0080, j); /* Mute Master Left volume */ 1585 ixj_mixer(0x0180, j); /* Mute Master Right volume */ 1586 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j); 1587/* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */ 1588 break; 1589 case QTI_PHONEJACK: 1590 j->gpio.bytes.high = 0x0B; 1591 j->gpio.bits.gpio6 = 0; 1592 j->gpio.bits.gpio7 = 0; 1593 ixj_WriteDSPCommand(j->gpio.word, j); 1594 break; 1595 } 1596 break; 1597 case PORT_PSTN: 1598 if (j->cardtype == QTI_LINEJACK) { 1599 ixj_WriteDSPCommand(0xC534, j); /* Write CODEC config to Software Control Register */ 1600 1601 j->pld_slicw.bits.rly3 = 0; 1602 j->pld_slicw.bits.rly1 = 1; 1603 j->pld_slicw.bits.spken = 0; 1604 outb(j->pld_slicw.byte, j->XILINXbase + 0x01); 1605 j->port = PORT_PSTN; 1606 } else { 1607 return 4; 1608 } 1609 break; 1610 case PORT_SPEAKER: 1611 j->port = PORT_SPEAKER; 1612 switch (j->cardtype) { 1613 case QTI_PHONECARD: 1614 if (j->flags.pcmciasct) { 1615 SLIC_SetState(PLD_SLIC_STATE_OC, j); 1616 } 1617 break; 1618 case QTI_PHONEJACK_PCI: 1619 j->pld_slicw.pcib.mic = 1; 1620 j->pld_slicw.pcib.spk = 1; 1621 outb(j->pld_slicw.byte, j->XILINXbase + 0x01); 1622 break; 1623 case QTI_LINEJACK: 1624 ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */ 1625 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to 1626 Software Control Register */ 1627 return 2; 1628 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ 1629 1630 outb(j->pld_scrw.byte, j->XILINXbase); 1631 j->pld_clock.byte = 0; 1632 outb(j->pld_clock.byte, j->XILINXbase + 0x04); 1633 j->pld_slicw.bits.rly1 = 1; 1634 j->pld_slicw.bits.spken = 1; 1635 outb(j->pld_slicw.byte, j->XILINXbase + 0x01); 1636 ixj_mixer(0x1201, j); /* Turn On MIC switch on mixer left */ 1637 ixj_mixer(0x1400, j); /* Turn Off Mono1 switch on mixer left */ 1638 ixj_mixer(0x1301, j); /* Turn On MIC switch on mixer right */ 1639 ixj_mixer(0x1500, j); /* Turn Off Mono1 switch on mixer right */ 1640 ixj_mixer(0x0E06, j); /*Mic un-mute 0dB */ 1641 ixj_mixer(0x0F80, j); /* Mute mono out (SLIC) */ 1642 ixj_mixer(0x0000, j); /* Set Master Left volume to 0dB */ 1643 ixj_mixer(0x0100, j); /* Set Master Right volume to 0dB */ 1644 break; 1645 case QTI_PHONEJACK: 1646 j->gpio.bytes.high = 0x0B; 1647 j->gpio.bits.gpio6 = 0; 1648 j->gpio.bits.gpio7 = 1; 1649 ixj_WriteDSPCommand(j->gpio.word, j); 1650 break; 1651 } 1652 break; 1653 case PORT_HANDSET: 1654 if (j->cardtype != QTI_PHONEJACK) { 1655 return 5; 1656 } else { 1657 j->gpio.bytes.high = 0x0B; 1658 j->gpio.bits.gpio6 = 1; 1659 j->gpio.bits.gpio7 = 0; 1660 ixj_WriteDSPCommand(j->gpio.word, j); 1661 j->port = PORT_HANDSET; 1662 } 1663 break; 1664 default: 1665 return 6; 1666 break; 1667 } 1668 return 0; 1669} 1670 1671static int ixj_set_pots(IXJ *j, int arg) 1672{ 1673 if (j->cardtype == QTI_LINEJACK) { 1674 if (arg) { 1675 if (j->port == PORT_PSTN) { 1676 j->pld_slicw.bits.rly1 = 0; 1677 outb(j->pld_slicw.byte, j->XILINXbase + 0x01); 1678 j->flags.pots_pstn = 1; 1679 return 1; 1680 } else { 1681 j->flags.pots_pstn = 0; 1682 return 0; 1683 } 1684 } else { 1685 j->pld_slicw.bits.rly1 = 1; 1686 outb(j->pld_slicw.byte, j->XILINXbase + 0x01); 1687 j->flags.pots_pstn = 0; 1688 return 1; 1689 } 1690 } else { 1691 return 0; 1692 } 1693} 1694 1695static void ixj_ring_on(IXJ *j) 1696{ 1697 if (j->dsp.low == 0x20) /* Internet PhoneJACK */ 1698 { 1699 if (ixjdebug & 0x0004) 1700 printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board); 1701 1702 j->gpio.bytes.high = 0x0B; 1703 j->gpio.bytes.low = 0x00; 1704 j->gpio.bits.gpio1 = 1; 1705 j->gpio.bits.gpio2 = 1; 1706 j->gpio.bits.gpio5 = 0; 1707 ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring signal */ 1708 } else /* Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI */ 1709 { 1710 if (ixjdebug & 0x0004) 1711 printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board); 1712 1713 SLIC_SetState(PLD_SLIC_STATE_RINGING, j); 1714 } 1715} 1716 1717static int ixj_siadc(IXJ *j, int val) 1718{ 1719 if(j->cardtype == QTI_PHONECARD){ 1720 if(j->flags.pcmciascp){ 1721 if(val == -1) 1722 return j->siadc.bits.rxg; 1723 1724 if(val < 0 || val > 0x1F) 1725 return -1; 1726 1727 j->siadc.bits.hom = 0; /* Handset Out Mute */ 1728 j->siadc.bits.lom = 0; /* Line Out Mute */ 1729 j->siadc.bits.rxg = val; /*(0xC000 - 0x41C8) / 0x4EF; RX PGA Gain */ 1730 j->psccr.bits.addr = 6; /* R/W Smart Cable Register Address */ 1731 j->psccr.bits.rw = 0; /* Read / Write flag */ 1732 j->psccr.bits.dev = 0; 1733 outb(j->siadc.byte, j->XILINXbase + 0x00); 1734 outb(j->psccr.byte, j->XILINXbase + 0x01); 1735 ixj_PCcontrol_wait(j); 1736 return j->siadc.bits.rxg; 1737 } 1738 } 1739 return -1; 1740} 1741 1742static int ixj_sidac(IXJ *j, int val) 1743{ 1744 if(j->cardtype == QTI_PHONECARD){ 1745 if(j->flags.pcmciascp){ 1746 if(val == -1) 1747 return j->sidac.bits.txg; 1748 1749 if(val < 0 || val > 0x1F) 1750 return -1; 1751 1752 j->sidac.bits.srm = 1; /* Speaker Right Mute */ 1753 j->sidac.bits.slm = 1; /* Speaker Left Mute */ 1754 j->sidac.bits.txg = val; /* (0xC000 - 0x45E4) / 0x5D3; TX PGA Gain */ 1755 j->psccr.bits.addr = 7; /* R/W Smart Cable Register Address */ 1756 j->psccr.bits.rw = 0; /* Read / Write flag */ 1757 j->psccr.bits.dev = 0; 1758 outb(j->sidac.byte, j->XILINXbase + 0x00); 1759 outb(j->psccr.byte, j->XILINXbase + 0x01); 1760 ixj_PCcontrol_wait(j); 1761 return j->sidac.bits.txg; 1762 } 1763 } 1764 return -1; 1765} 1766 1767static int ixj_pcmcia_cable_check(IXJ *j) 1768{ 1769 j->pccr1.byte = inb_p(j->XILINXbase + 0x03); 1770 if (!j->flags.pcmciastate) { 1771 j->pccr2.byte = inb_p(j->XILINXbase + 0x02); 1772 if (j->pccr1.bits.drf || j->pccr2.bits.rstc) { 1773 j->flags.pcmciastate = 4; 1774 return 0; 1775 } 1776 if (j->pccr1.bits.ed) { 1777 j->pccr1.bits.ed = 0; 1778 j->psccr.bits.dev = 3; 1779 j->psccr.bits.rw = 1; 1780 outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00); 1781 ixj_PCcontrol_wait(j); 1782 j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF; 1783 j->pslic.bits.led2 = j->pslic.bits.det ? 1 : 0; 1784 j->psccr.bits.dev = 3; 1785 j->psccr.bits.rw = 0; 1786 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00); 1787 ixj_PCcontrol_wait(j); 1788 return j->pslic.bits.led2 ? 1 : 0; 1789 } else if (j->flags.pcmciasct) { 1790 return j->r_hook; 1791 } else { 1792 return 1; 1793 } 1794 } else if (j->flags.pcmciastate == 4) { 1795 if (!j->pccr1.bits.drf) { 1796 j->flags.pcmciastate = 3; 1797 } 1798 return 0; 1799 } else if (j->flags.pcmciastate == 3) { 1800 j->pccr2.bits.pwr = 0; 1801 j->pccr2.bits.rstc = 1; 1802 outb(j->pccr2.byte, j->XILINXbase + 0x02); 1803 j->checkwait = jiffies + (hertz * 2); 1804 j->flags.incheck = 1; 1805 j->flags.pcmciastate = 2; 1806 return 0; 1807 } else if (j->flags.pcmciastate == 2) { 1808 if (j->flags.incheck) { 1809 if (time_before(jiffies, j->checkwait)) { 1810 return 0; 1811 } else { 1812 j->flags.incheck = 0; 1813 } 1814 } 1815 j->pccr2.bits.pwr = 0; 1816 j->pccr2.bits.rstc = 0; 1817 outb_p(j->pccr2.byte, j->XILINXbase + 0x02); 1818 j->flags.pcmciastate = 1; 1819 return 0; 1820 } else if (j->flags.pcmciastate == 1) { 1821 j->flags.pcmciastate = 0; 1822 if (!j->pccr1.bits.drf) { 1823 j->psccr.bits.dev = 3; 1824 j->psccr.bits.rw = 1; 1825 outb_p(j->psccr.byte, j->XILINXbase + 0x01); 1826 ixj_PCcontrol_wait(j); 1827 j->flags.pcmciascp = 1; /* Set Cable Present Flag */ 1828 1829 j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03; /* Get Cable Type */ 1830 1831 if (j->flags.pcmciasct == 3) { 1832 j->flags.pcmciastate = 4; 1833 return 0; 1834 } else if (j->flags.pcmciasct == 0) { 1835 j->pccr2.bits.pwr = 1; 1836 j->pccr2.bits.rstc = 0; 1837 outb_p(j->pccr2.byte, j->XILINXbase + 0x02); 1838 j->port = PORT_SPEAKER; 1839 } else { 1840 j->port = PORT_POTS; 1841 } 1842 j->sic1.bits.cpd = 0; /* Chip Power Down */ 1843 j->sic1.bits.mpd = 0; /* MIC Bias Power Down */ 1844 j->sic1.bits.hpd = 0; /* Handset Bias Power Down */ 1845 j->sic1.bits.lpd = 0; /* Line Bias Power Down */ 1846 j->sic1.bits.spd = 1; /* Speaker Drive Power Down */ 1847 j->psccr.bits.addr = 1; /* R/W Smart Cable Register Address */ 1848 j->psccr.bits.rw = 0; /* Read / Write flag */ 1849 j->psccr.bits.dev = 0; 1850 outb(j->sic1.byte, j->XILINXbase + 0x00); 1851 outb(j->psccr.byte, j->XILINXbase + 0x01); 1852 ixj_PCcontrol_wait(j); 1853 1854 j->sic2.bits.al = 0; /* Analog Loopback DAC analog -> ADC analog */ 1855 j->sic2.bits.dl2 = 0; /* Digital Loopback DAC -> ADC one bit */ 1856 j->sic2.bits.dl1 = 0; /* Digital Loopback ADC -> DAC one bit */ 1857 j->sic2.bits.pll = 0; /* 1 = div 10, 0 = div 5 */ 1858 j->sic2.bits.hpd = 0; /* HPF disable */ 1859 j->psccr.bits.addr = 2; /* R/W Smart Cable Register Address */ 1860 j->psccr.bits.rw = 0; /* Read / Write flag */ 1861 j->psccr.bits.dev = 0; 1862 outb(j->sic2.byte, j->XILINXbase + 0x00); 1863 outb(j->psccr.byte, j->XILINXbase + 0x01); 1864 ixj_PCcontrol_wait(j); 1865 1866 j->psccr.bits.addr = 3; /* R/W Smart Cable Register Address */ 1867 j->psccr.bits.rw = 0; /* Read / Write flag */ 1868 j->psccr.bits.dev = 0; 1869 outb(0x00, j->XILINXbase + 0x00); /* PLL Divide N1 */ 1870 outb(j->psccr.byte, j->XILINXbase + 0x01); 1871 ixj_PCcontrol_wait(j); 1872 1873 j->psccr.bits.addr = 4; /* R/W Smart Cable Register Address */ 1874 j->psccr.bits.rw = 0; /* Read / Write flag */ 1875 j->psccr.bits.dev = 0; 1876 outb(0x09, j->XILINXbase + 0x00); /* PLL Multiply M1 */ 1877 outb(j->psccr.byte, j->XILINXbase + 0x01); 1878 ixj_PCcontrol_wait(j); 1879 1880 j->sirxg.bits.lig = 1; /* Line In Gain */ 1881 j->sirxg.bits.lim = 1; /* Line In Mute */ 1882 j->sirxg.bits.mcg = 0; /* MIC In Gain was 3 */ 1883 j->sirxg.bits.mcm = 0; /* MIC In Mute */ 1884 j->sirxg.bits.him = 0; /* Handset In Mute */ 1885 j->sirxg.bits.iir = 1; /* IIR */ 1886 j->psccr.bits.addr = 5; /* R/W Smart Cable Register Address */ 1887 j->psccr.bits.rw = 0; /* Read / Write flag */ 1888 j->psccr.bits.dev = 0; 1889 outb(j->sirxg.byte, j->XILINXbase + 0x00); 1890 outb(j->psccr.byte, j->XILINXbase + 0x01); 1891 ixj_PCcontrol_wait(j); 1892 1893 ixj_siadc(j, 0x17); 1894 ixj_sidac(j, 0x1D); 1895 1896 j->siaatt.bits.sot = 0; 1897 j->psccr.bits.addr = 9; /* R/W Smart Cable Register Address */ 1898 j->psccr.bits.rw = 0; /* Read / Write flag */ 1899 j->psccr.bits.dev = 0; 1900 outb(j->siaatt.byte, j->XILINXbase + 0x00); 1901 outb(j->psccr.byte, j->XILINXbase + 0x01); 1902 ixj_PCcontrol_wait(j); 1903 1904 if (j->flags.pcmciasct == 1 && !j->readers && !j->writers) { 1905 j->psccr.byte = j->pslic.byte = 0; 1906 j->pslic.bits.powerdown = 1; 1907 j->psccr.bits.dev = 3; 1908 j->psccr.bits.rw = 0; 1909 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00); 1910 ixj_PCcontrol_wait(j); 1911 } 1912 } 1913 return 0; 1914 } else { 1915 j->flags.pcmciascp = 0; 1916 return 0; 1917 } 1918 return 0; 1919} 1920 1921static int ixj_hookstate(IXJ *j) 1922{ 1923 int fOffHook = 0; 1924 1925 switch (j->cardtype) { 1926 case QTI_PHONEJACK: 1927 ixj_gpio_read(j); 1928 fOffHook = j->gpio.bits.gpio3read ? 1 : 0; 1929 break; 1930 case QTI_LINEJACK: 1931 case QTI_PHONEJACK_LITE: 1932 case QTI_PHONEJACK_PCI: 1933 SLIC_GetState(j); 1934 if(j->cardtype == QTI_LINEJACK && j->flags.pots_pstn == 1 && (j->readers || j->writers)) { 1935 fOffHook = j->pld_slicr.bits.potspstn ? 1 : 0; 1936 if(fOffHook != j->p_hook) { 1937 if(!j->checkwait) { 1938 j->checkwait = jiffies; 1939 } 1940 if(time_before(jiffies, j->checkwait + 2)) { 1941 fOffHook ^= 1; 1942 } else { 1943 j->checkwait = 0; 1944 } 1945 j->p_hook = fOffHook; 1946 printk("IXJ : /dev/phone%d pots-pstn hookstate check %d at %ld\n", j->board, fOffHook, jiffies); 1947 } 1948 } else { 1949 if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE || 1950 j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) { 1951 if (j->flags.ringing || j->flags.cringing) { 1952 if (!in_interrupt()) { 1953 msleep(20); 1954 } 1955 SLIC_GetState(j); 1956 if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) { 1957 ixj_ring_on(j); 1958 } 1959 } 1960 if (j->cardtype == QTI_PHONEJACK_PCI) { 1961 j->pld_scrr.byte = inb_p(j->XILINXbase); 1962 fOffHook = j->pld_scrr.pcib.det ? 1 : 0; 1963 } else 1964 fOffHook = j->pld_slicr.bits.det ? 1 : 0; 1965 } 1966 } 1967 break; 1968 case QTI_PHONECARD: 1969 fOffHook = ixj_pcmcia_cable_check(j); 1970 break; 1971 } 1972 if (j->r_hook != fOffHook) { 1973 j->r_hook = fOffHook; 1974 if (j->port == PORT_SPEAKER || j->port == PORT_HANDSET) { // || (j->port == PORT_PSTN && j->flags.pots_pstn == 0)) { 1975 j->ex.bits.hookstate = 1; 1976 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN); 1977 } else if (!fOffHook) { 1978 j->flash_end = jiffies + ((60 * hertz) / 100); 1979 } 1980 } 1981 if (fOffHook) { 1982 if(time_before(jiffies, j->flash_end)) { 1983 j->ex.bits.flash = 1; 1984 j->flash_end = 0; 1985 ixj_kill_fasync(j, SIG_FLASH, POLL_IN); 1986 } 1987 } else { 1988 if(time_before(jiffies, j->flash_end)) { 1989 fOffHook = 1; 1990 } 1991 } 1992 1993 if (j->port == PORT_PSTN && j->daa_mode == SOP_PU_CONVERSATION) 1994 fOffHook |= 2; 1995 1996 if (j->port == PORT_SPEAKER) { 1997 if(j->cardtype == QTI_PHONECARD) { 1998 if(j->flags.pcmciascp && j->flags.pcmciasct) { 1999 fOffHook |= 2; 2000 } 2001 } else { 2002 fOffHook |= 2; 2003 } 2004 } 2005 2006 if (j->port == PORT_HANDSET) 2007 fOffHook |= 2; 2008 2009 return fOffHook; 2010} 2011 2012static void ixj_ring_off(IXJ *j) 2013{ 2014 if (j->dsp.low == 0x20) /* Internet PhoneJACK */ 2015 { 2016 if (ixjdebug & 0x0004) 2017 printk(KERN_INFO "IXJ Ring Off\n"); 2018 j->gpio.bytes.high = 0x0B; 2019 j->gpio.bytes.low = 0x00; 2020 j->gpio.bits.gpio1 = 0; 2021 j->gpio.bits.gpio2 = 1; 2022 j->gpio.bits.gpio5 = 0; 2023 ixj_WriteDSPCommand(j->gpio.word, j); 2024 } else /* Internet LineJACK */ 2025 { 2026 if (ixjdebug & 0x0004) 2027 printk(KERN_INFO "IXJ Ring Off\n"); 2028 2029 if(!j->flags.cidplay) 2030 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j); 2031 2032 SLIC_GetState(j); 2033 } 2034} 2035 2036static void ixj_ring_start(IXJ *j) 2037{ 2038 j->flags.cringing = 1; 2039 if (ixjdebug & 0x0004) 2040 printk(KERN_INFO "IXJ Cadence Ringing Start /dev/phone%d\n", j->board); 2041 if (ixj_hookstate(j) & 1) { 2042 if (j->port == PORT_POTS) 2043 ixj_ring_off(j); 2044 j->flags.cringing = 0; 2045 if (ixjdebug & 0x0004) 2046 printk(KERN_INFO "IXJ Cadence Ringing Stopped /dev/phone%d off hook\n", j->board); 2047 } else if(j->cadence_f[5].enable && (!j->cadence_f[5].en_filter)) { 2048 j->ring_cadence_jif = jiffies; 2049 j->flags.cidsent = j->flags.cidring = 0; 2050 j->cadence_f[5].state = 0; 2051 if(j->cadence_f[5].on1) 2052 ixj_ring_on(j); 2053 } else { 2054 j->ring_cadence_jif = jiffies; 2055 j->ring_cadence_t = 15; 2056 if (j->ring_cadence & 1 << j->ring_cadence_t) { 2057 ixj_ring_on(j); 2058 } else { 2059 ixj_ring_off(j); 2060 } 2061 j->flags.cidsent = j->flags.cidring = j->flags.firstring = 0; 2062 } 2063} 2064 2065static int ixj_ring(IXJ *j) 2066{ 2067 char cntr; 2068 unsigned long jif; 2069 2070 j->flags.ringing = 1; 2071 if (ixj_hookstate(j) & 1) { 2072 ixj_ring_off(j); 2073 j->flags.ringing = 0; 2074 return 1; 2075 } 2076 for (cntr = 0; cntr < j->maxrings; cntr++) { 2077 jif = jiffies + (1 * hertz); 2078 ixj_ring_on(j); 2079 while (time_before(jiffies, jif)) { 2080 if (ixj_hookstate(j) & 1) { 2081 ixj_ring_off(j); 2082 j->flags.ringing = 0; 2083 return 1; 2084 } 2085 schedule_timeout_interruptible(1); 2086 if (signal_pending(current)) 2087 break; 2088 } 2089 jif = jiffies + (3 * hertz); 2090 ixj_ring_off(j); 2091 while (time_before(jiffies, jif)) { 2092 if (ixj_hookstate(j) & 1) { 2093 msleep(10); 2094 if (ixj_hookstate(j) & 1) { 2095 j->flags.ringing = 0; 2096 return 1; 2097 } 2098 } 2099 schedule_timeout_interruptible(1); 2100 if (signal_pending(current)) 2101 break; 2102 } 2103 } 2104 ixj_ring_off(j); 2105 j->flags.ringing = 0; 2106 return 0; 2107} 2108 2109static int ixj_open(struct phone_device *p, struct file *file_p) 2110{ 2111 IXJ *j = get_ixj(p->board); 2112 file_p->private_data = j; 2113 2114 if (!j->DSPbase) 2115 return -ENODEV; 2116 2117 if (file_p->f_mode & FMODE_READ) { 2118 if(!j->readers) { 2119 j->readers++; 2120 } else { 2121 return -EBUSY; 2122 } 2123 } 2124 2125 if (file_p->f_mode & FMODE_WRITE) { 2126 if(!j->writers) { 2127 j->writers++; 2128 } else { 2129 if (file_p->f_mode & FMODE_READ){ 2130 j->readers--; 2131 } 2132 return -EBUSY; 2133 } 2134 } 2135 2136 if (j->cardtype == QTI_PHONECARD) { 2137 j->pslic.bits.powerdown = 0; 2138 j->psccr.bits.dev = 3; 2139 j->psccr.bits.rw = 0; 2140 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00); 2141 ixj_PCcontrol_wait(j); 2142 } 2143 2144 j->flags.cidplay = 0; 2145 j->flags.cidcw_ack = 0; 2146 2147 if (ixjdebug & 0x0002) 2148 printk(KERN_INFO "Opening board %d\n", p->board); 2149 2150 j->framesread = j->frameswritten = 0; 2151 return 0; 2152} 2153 2154static int ixj_release(struct inode *inode, struct file *file_p) 2155{ 2156 IXJ_TONE ti; 2157 int cnt; 2158 IXJ *j = file_p->private_data; 2159 int board = j->p.board; 2160 2161 /* 2162 * Set up locks to ensure that only one process is talking to the DSP at a time. 2163 * This is necessary to keep the DSP from locking up. 2164 */ 2165 while(test_and_set_bit(board, (void *)&j->busyflags) != 0) 2166 schedule_timeout_interruptible(1); 2167 if (ixjdebug & 0x0002) 2168 printk(KERN_INFO "Closing board %d\n", NUM(inode)); 2169 2170 if (j->cardtype == QTI_PHONECARD) 2171 ixj_set_port(j, PORT_SPEAKER); 2172 else 2173 ixj_set_port(j, PORT_POTS); 2174 2175 aec_stop(j); 2176 ixj_play_stop(j); 2177 ixj_record_stop(j); 2178 set_play_volume(j, 0x100); 2179 set_rec_volume(j, 0x100); 2180 ixj_ring_off(j); 2181 2182 /* Restore the tone table to default settings. */ 2183 ti.tone_index = 10; 2184 ti.gain0 = 1; 2185 ti.freq0 = hz941; 2186 ti.gain1 = 0; 2187 ti.freq1 = hz1209; 2188 ixj_init_tone(j, &ti); 2189 ti.tone_index = 11; 2190 ti.gain0 = 1; 2191 ti.freq0 = hz941; 2192 ti.gain1 = 0; 2193 ti.freq1 = hz1336; 2194 ixj_init_tone(j, &ti); 2195 ti.tone_index = 12; 2196 ti.gain0 = 1; 2197 ti.freq0 = hz941; 2198 ti.gain1 = 0; 2199 ti.freq1 = hz1477; 2200 ixj_init_tone(j, &ti); 2201 ti.tone_index = 13; 2202 ti.gain0 = 1; 2203 ti.freq0 = hz800; 2204 ti.gain1 = 0; 2205 ti.freq1 = 0; 2206 ixj_init_tone(j, &ti); 2207 ti.tone_index = 14; 2208 ti.gain0 = 1; 2209 ti.freq0 = hz1000; 2210 ti.gain1 = 0; 2211 ti.freq1 = 0; 2212 ixj_init_tone(j, &ti); 2213 ti.tone_index = 15; 2214 ti.gain0 = 1; 2215 ti.freq0 = hz1250; 2216 ti.gain1 = 0; 2217 ti.freq1 = 0; 2218 ixj_init_tone(j, &ti); 2219 ti.tone_index = 16; 2220 ti.gain0 = 1; 2221 ti.freq0 = hz950; 2222 ti.gain1 = 0; 2223 ti.freq1 = 0; 2224 ixj_init_tone(j, &ti); 2225 ti.tone_index = 17; 2226 ti.gain0 = 1; 2227 ti.freq0 = hz1100; 2228 ti.gain1 = 0; 2229 ti.freq1 = 0; 2230 ixj_init_tone(j, &ti); 2231 ti.tone_index = 18; 2232 ti.gain0 = 1; 2233 ti.freq0 = hz1400; 2234 ti.gain1 = 0; 2235 ti.freq1 = 0; 2236 ixj_init_tone(j, &ti); 2237 ti.tone_index = 19; 2238 ti.gain0 = 1; 2239 ti.freq0 = hz1500; 2240 ti.gain1 = 0; 2241 ti.freq1 = 0; 2242 ixj_init_tone(j, &ti); 2243 ti.tone_index = 20; 2244 ti.gain0 = 1; 2245 ti.freq0 = hz1600; 2246 ti.gain1 = 0; 2247 ti.freq1 = 0; 2248 ixj_init_tone(j, &ti); 2249 ti.tone_index = 21; 2250 ti.gain0 = 1; 2251 ti.freq0 = hz1800; 2252 ti.gain1 = 0; 2253 ti.freq1 = 0; 2254 ixj_init_tone(j, &ti); 2255 ti.tone_index = 22; 2256 ti.gain0 = 1; 2257 ti.freq0 = hz2100; 2258 ti.gain1 = 0; 2259 ti.freq1 = 0; 2260 ixj_init_tone(j, &ti); 2261 ti.tone_index = 23; 2262 ti.gain0 = 1; 2263 ti.freq0 = hz1300; 2264 ti.gain1 = 0; 2265 ti.freq1 = 0; 2266 ixj_init_tone(j, &ti); 2267 ti.tone_index = 24; 2268 ti.gain0 = 1; 2269 ti.freq0 = hz2450; 2270 ti.gain1 = 0; 2271 ti.freq1 = 0; 2272 ixj_init_tone(j, &ti); 2273 ti.tone_index = 25; 2274 ti.gain0 = 1; 2275 ti.freq0 = hz350; 2276 ti.gain1 = 0; 2277 ti.freq1 = hz440; 2278 ixj_init_tone(j, &ti); 2279 ti.tone_index = 26; 2280 ti.gain0 = 1; 2281 ti.freq0 = hz440; 2282 ti.gain1 = 0; 2283 ti.freq1 = hz480; 2284 ixj_init_tone(j, &ti); 2285 ti.tone_index = 27; 2286 ti.gain0 = 1; 2287 ti.freq0 = hz480; 2288 ti.gain1 = 0; 2289 ti.freq1 = hz620; 2290 ixj_init_tone(j, &ti); 2291 2292 set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */ 2293 2294 set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */ 2295 2296 j->ex.bits.dtmf_ready = 0; 2297 j->dtmf_state = 0; 2298 j->dtmf_wp = j->dtmf_rp = 0; 2299 j->rec_mode = j->play_mode = -1; 2300 j->flags.ringing = 0; 2301 j->maxrings = MAXRINGS; 2302 j->ring_cadence = USA_RING_CADENCE; 2303 if(j->cadence_f[5].enable) { 2304 j->cadence_f[5].enable = j->cadence_f[5].en_filter = j->cadence_f[5].state = 0; 2305 } 2306 j->drybuffer = 0; 2307 j->winktime = 320; 2308 j->flags.dtmf_oob = 0; 2309 for (cnt = 0; cnt < 4; cnt++) 2310 j->cadence_f[cnt].enable = 0; 2311 2312 idle(j); 2313 2314 if(j->cardtype == QTI_PHONECARD) { 2315 SLIC_SetState(PLD_SLIC_STATE_OC, j); 2316 } 2317 2318 if (file_p->f_mode & FMODE_READ) 2319 j->readers--; 2320 if (file_p->f_mode & FMODE_WRITE) 2321 j->writers--; 2322 2323 if (j->read_buffer && !j->readers) { 2324 kfree(j->read_buffer); 2325 j->read_buffer = NULL; 2326 j->read_buffer_size = 0; 2327 } 2328 if (j->write_buffer && !j->writers) { 2329 kfree(j->write_buffer); 2330 j->write_buffer = NULL; 2331 j->write_buffer_size = 0; 2332 } 2333 j->rec_codec = j->play_codec = 0; 2334 j->rec_frame_size = j->play_frame_size = 0; 2335 j->flags.cidsent = j->flags.cidring = 0; 2336 ixj_fasync(-1, file_p, 0); /* remove from list of async notification */ 2337 2338 if(j->cardtype == QTI_LINEJACK && !j->readers && !j->writers) { 2339 ixj_set_port(j, PORT_PSTN); 2340 daa_set_mode(j, SOP_PU_SLEEP); 2341 ixj_set_pots(j, 1); 2342 } 2343 ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */ 2344 2345 /* Set up the default signals for events */ 2346 for (cnt = 0; cnt < 35; cnt++) 2347 j->ixj_signals[cnt] = SIGIO; 2348 2349 /* Set the excetion signal enable flags */ 2350 j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring = 2351 j->ex_sig.bits.caller_id = j->ex_sig.bits.pstn_wink = j->ex_sig.bits.f0 = j->ex_sig.bits.f1 = j->ex_sig.bits.f2 = 2352 j->ex_sig.bits.f3 = j->ex_sig.bits.fc0 = j->ex_sig.bits.fc1 = j->ex_sig.bits.fc2 = j->ex_sig.bits.fc3 = 1; 2353 2354 file_p->private_data = NULL; 2355 clear_bit(board, &j->busyflags); 2356 return 0; 2357} 2358 2359static int read_filters(IXJ *j) 2360{ 2361 unsigned short fc, cnt, trg; 2362 int var; 2363 2364 trg = 0; 2365 if (ixj_WriteDSPCommand(0x5144, j)) { 2366 if(ixjdebug & 0x0001) { 2367 printk(KERN_INFO "Read Frame Counter failed!\n"); 2368 } 2369 return -1; 2370 } 2371 fc = j->ssr.high << 8 | j->ssr.low; 2372 if (fc == j->frame_count) 2373 return 1; 2374 2375 j->frame_count = fc; 2376 2377 if (j->dtmf_proc) 2378 return 1; 2379 2380 var = 10; 2381 2382 for (cnt = 0; cnt < 4; cnt++) { 2383 if (ixj_WriteDSPCommand(0x5154 + cnt, j)) { 2384 if(ixjdebug & 0x0001) { 2385 printk(KERN_INFO "Select Filter %d failed!\n", cnt); 2386 } 2387 return -1; 2388 } 2389 if (ixj_WriteDSPCommand(0x515C, j)) { 2390 if(ixjdebug & 0x0001) { 2391 printk(KERN_INFO "Read Filter History %d failed!\n", cnt); 2392 } 2393 return -1; 2394 } 2395 j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low; 2396 2397 if (j->cadence_f[cnt].enable) { 2398 if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) { 2399 if (j->cadence_f[cnt].state == 0) { 2400 j->cadence_f[cnt].state = 1; 2401 j->cadence_f[cnt].on1min = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 - var)) / 10000)); 2402 j->cadence_f[cnt].on1dot = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100)) / 10000)); 2403 j->cadence_f[cnt].on1max = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 + var)) / 10000)); 2404 } else if (j->cadence_f[cnt].state == 2 && 2405 (time_after(jiffies, j->cadence_f[cnt].off1min) && 2406 time_before(jiffies, j->cadence_f[cnt].off1max))) { 2407 if (j->cadence_f[cnt].on2) { 2408 j->cadence_f[cnt].state = 3; 2409 j->cadence_f[cnt].on2min = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 - var)) / 10000)); 2410 j->cadence_f[cnt].on2dot = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100)) / 10000)); 2411 j->cadence_f[cnt].on2max = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 + var)) / 10000)); 2412 } else { 2413 j->cadence_f[cnt].state = 7; 2414 } 2415 } else if (j->cadence_f[cnt].state == 4 && 2416 (time_after(jiffies, j->cadence_f[cnt].off2min) && 2417 time_before(jiffies, j->cadence_f[cnt].off2max))) { 2418 if (j->cadence_f[cnt].on3) { 2419 j->cadence_f[cnt].state = 5; 2420 j->cadence_f[cnt].on3min = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 - var)) / 10000)); 2421 j->cadence_f[cnt].on3dot = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100)) / 10000)); 2422 j->cadence_f[cnt].on3max = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 + var)) / 10000)); 2423 } else { 2424 j->cadence_f[cnt].state = 7; 2425 } 2426 } else { 2427 j->cadence_f[cnt].state = 0; 2428 } 2429 } else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) { 2430 if (j->cadence_f[cnt].state == 1) { 2431 if(!j->cadence_f[cnt].on1) { 2432 j->cadence_f[cnt].state = 7; 2433 } else if((time_after(jiffies, j->cadence_f[cnt].on1min) && 2434 time_before(jiffies, j->cadence_f[cnt].on1max))) { 2435 if(j->cadence_f[cnt].off1) { 2436 j->cadence_f[cnt].state = 2; 2437 j->cadence_f[cnt].off1min = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 - var)) / 10000)); 2438 j->cadence_f[cnt].off1dot = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100)) / 10000)); 2439 j->cadence_f[cnt].off1max = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 + var)) / 10000)); 2440 } else { 2441 j->cadence_f[cnt].state = 7; 2442 } 2443 } else { 2444 j->cadence_f[cnt].state = 0; 2445 } 2446 } else if (j->cadence_f[cnt].state == 3) { 2447 if((time_after(jiffies, j->cadence_f[cnt].on2min) && 2448 time_before(jiffies, j->cadence_f[cnt].on2max))) { 2449 if(j->cadence_f[cnt].off2) { 2450 j->cadence_f[cnt].state = 4; 2451 j->cadence_f[cnt].off2min = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 - var)) / 10000)); 2452 j->cadence_f[cnt].off2dot = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100)) / 10000)); 2453 j->cadence_f[cnt].off2max = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 + var)) / 10000)); 2454 } else { 2455 j->cadence_f[cnt].state = 7; 2456 } 2457 } else { 2458 j->cadence_f[cnt].state = 0; 2459 } 2460 } else if (j->cadence_f[cnt].state == 5) { 2461 if ((time_after(jiffies, j->cadence_f[cnt].on3min) && 2462 time_before(jiffies, j->cadence_f[cnt].on3max))) { 2463 if(j->cadence_f[cnt].off3) { 2464 j->cadence_f[cnt].state = 6; 2465 j->cadence_f[cnt].off3min = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 - var)) / 10000)); 2466 j->cadence_f[cnt].off3dot = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100)) / 10000)); 2467 j->cadence_f[cnt].off3max = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 + var)) / 10000)); 2468 } else { 2469 j->cadence_f[cnt].state = 7; 2470 } 2471 } else { 2472 j->cadence_f[cnt].state = 0; 2473 } 2474 } else { 2475 j->cadence_f[cnt].state = 0; 2476 } 2477 } else { 2478 switch(j->cadence_f[cnt].state) { 2479 case 1: 2480 if(time_after(jiffies, j->cadence_f[cnt].on1dot) && 2481 !j->cadence_f[cnt].off1 && 2482 !j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 && 2483 !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) { 2484 j->cadence_f[cnt].state = 7; 2485 } 2486 break; 2487 case 3: 2488 if(time_after(jiffies, j->cadence_f[cnt].on2dot) && 2489 !j->cadence_f[cnt].off2 && 2490 !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) { 2491 j->cadence_f[cnt].state = 7; 2492 } 2493 break; 2494 case 5: 2495 if(time_after(jiffies, j->cadence_f[cnt].on3dot) && 2496 !j->cadence_f[cnt].off3) { 2497 j->cadence_f[cnt].state = 7; 2498 } 2499 break; 2500 } 2501 } 2502 2503 if (ixjdebug & 0x0040) { 2504 printk(KERN_INFO "IXJ Tone Cadence state = %d /dev/phone%d at %ld\n", j->cadence_f[cnt].state, j->board, jiffies); 2505 switch(j->cadence_f[cnt].state) { 2506 case 0: 2507 printk(KERN_INFO "IXJ /dev/phone%d No Tone detected\n", j->board); 2508 break; 2509 case 1: 2510 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %u %ld - %ld - %ld\n", j->board, 2511 j->cadence_f[cnt].on1, j->cadence_f[cnt].on1min, j->cadence_f[cnt].on1dot, j->cadence_f[cnt].on1max); 2512 break; 2513 case 2: 2514 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off1min, 2515 j->cadence_f[cnt].off1max); 2516 break; 2517 case 3: 2518 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on2min, 2519 j->cadence_f[cnt].on2max); 2520 break; 2521 case 4: 2522 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off2min, 2523 j->cadence_f[cnt].off2max); 2524 break; 2525 case 5: 2526 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on3min, 2527 j->cadence_f[cnt].on3max); 2528 break; 2529 case 6: 2530 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off3min, 2531 j->cadence_f[cnt].off3max); 2532 break; 2533 } 2534 } 2535 } 2536 if (j->cadence_f[cnt].state == 7) { 2537 j->cadence_f[cnt].state = 0; 2538 if (j->cadence_f[cnt].enable == 1) 2539 j->cadence_f[cnt].enable = 0; 2540 switch (cnt) { 2541 case 0: 2542 if(ixjdebug & 0x0020) { 2543 printk(KERN_INFO "Filter Cadence 0 triggered %ld\n", jiffies); 2544 } 2545 j->ex.bits.fc0 = 1; 2546 ixj_kill_fasync(j, SIG_FC0, POLL_IN); 2547 break; 2548 case 1: 2549 if(ixjdebug & 0x0020) { 2550 printk(KERN_INFO "Filter Cadence 1 triggered %ld\n", jiffies); 2551 } 2552 j->ex.bits.fc1 = 1; 2553 ixj_kill_fasync(j, SIG_FC1, POLL_IN); 2554 break; 2555 case 2: 2556 if(ixjdebug & 0x0020) { 2557 printk(KERN_INFO "Filter Cadence 2 triggered %ld\n", jiffies); 2558 } 2559 j->ex.bits.fc2 = 1; 2560 ixj_kill_fasync(j, SIG_FC2, POLL_IN); 2561 break; 2562 case 3: 2563 if(ixjdebug & 0x0020) { 2564 printk(KERN_INFO "Filter Cadence 3 triggered %ld\n", jiffies); 2565 } 2566 j->ex.bits.fc3 = 1; 2567 ixj_kill_fasync(j, SIG_FC3, POLL_IN); 2568 break; 2569 } 2570 } 2571 if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) || 2572 (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) { 2573 if((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12))) { 2574 trg = 1; 2575 } else if((j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3))) { 2576 trg = 0; 2577 } 2578 switch (cnt) { 2579 case 0: 2580 if(ixjdebug & 0x0020) { 2581 printk(KERN_INFO "Filter 0 triggered %d at %ld\n", trg, jiffies); 2582 } 2583 j->ex.bits.f0 = 1; 2584 ixj_kill_fasync(j, SIG_F0, POLL_IN); 2585 break; 2586 case 1: 2587 if(ixjdebug & 0x0020) { 2588 printk(KERN_INFO "Filter 1 triggered %d at %ld\n", trg, jiffies); 2589 } 2590 j->ex.bits.f1 = 1; 2591 ixj_kill_fasync(j, SIG_F1, POLL_IN); 2592 break; 2593 case 2: 2594 if(ixjdebug & 0x0020) { 2595 printk(KERN_INFO "Filter 2 triggered %d at %ld\n", trg, jiffies); 2596 } 2597 j->ex.bits.f2 = 1; 2598 ixj_kill_fasync(j, SIG_F2, POLL_IN); 2599 break; 2600 case 3: 2601 if(ixjdebug & 0x0020) { 2602 printk(KERN_INFO "Filter 3 triggered %d at %ld\n", trg, jiffies); 2603 } 2604 j->ex.bits.f3 = 1; 2605 ixj_kill_fasync(j, SIG_F3, POLL_IN); 2606 break; 2607 } 2608 } 2609 } 2610 return 0; 2611} 2612 2613static int LineMonitor(IXJ *j) 2614{ 2615 if (j->dtmf_proc) { 2616 return -1; 2617 } 2618 j->dtmf_proc = 1; 2619 2620 if (ixj_WriteDSPCommand(0x7000, j)) /* Line Monitor */ 2621 return -1; 2622 2623 j->dtmf.bytes.high = j->ssr.high; 2624 j->dtmf.bytes.low = j->ssr.low; 2625 if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) { 2626 j->dtmf_state = 1; 2627 j->dtmf_current = j->dtmf.bits.digit; 2628 } 2629 if (j->dtmf_state && !j->dtmf.bits.dtmf_valid) /* && j->dtmf_wp != j->dtmf_rp) */ 2630 { 2631 if(!j->cidcw_wait) { 2632 j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current; 2633 j->dtmf_wp++; 2634 if (j->dtmf_wp == 79) 2635 j->dtmf_wp = 0; 2636 j->ex.bits.dtmf_ready = 1; 2637 if(j->ex_sig.bits.dtmf_ready) { 2638 ixj_kill_fasync(j, SIG_DTMF_READY, POLL_IN); 2639 } 2640 } 2641 else if(j->dtmf_current == 0x00 || j->dtmf_current == 0x0D) { 2642 if(ixjdebug & 0x0020) { 2643 printk("IXJ phone%d saw CIDCW Ack DTMF %d from display at %ld\n", j->board, j->dtmf_current, jiffies); 2644 } 2645 j->flags.cidcw_ack = 1; 2646 } 2647 j->dtmf_state = 0; 2648 } 2649 j->dtmf_proc = 0; 2650 2651 return 0; 2652} 2653 2654/************************************************************************ 2655* 2656* Functions to allow alaw <-> ulaw conversions. 2657* 2658************************************************************************/ 2659 2660static void ulaw2alaw(unsigned char *buff, unsigned long len) 2661{ 2662 static unsigned char table_ulaw2alaw[] = 2663 { 2664 0x2A, 0x2B, 0x28, 0x29, 0x2E, 0x2F, 0x2C, 0x2D, 2665 0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25, 2666 0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D, 2667 0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35, 2668 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 0x02, 2669 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x1A, 2670 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 0x12, 2671 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x6B, 2672 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 0x62, 0x63, 2673 0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x7B, 0x79, 2674 0x7E, 0x7F, 0x7C, 0x7D, 0x72, 0x73, 0x70, 0x71, 2675 0x76, 0x77, 0x74, 0x75, 0x4B, 0x49, 0x4F, 0x4D, 2676 0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45, 2677 0x5A, 0x5B, 0x58, 0x59, 0x5E, 0x5F, 0x5C, 0x5D, 2678 0x52, 0x52, 0x53, 0x53, 0x50, 0x50, 0x51, 0x51, 2679 0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, 0xD5, 2680 0xAA, 0xAB, 0xA8, 0xA9, 0xAE, 0xAF, 0xAC, 0xAD, 2681 0xA2, 0xA3, 0xA0, 0xA1, 0xA6, 0xA7, 0xA4, 0xA5, 2682 0xBA, 0xBB, 0xB8, 0xB9, 0xBE, 0xBF, 0xBC, 0xBD, 2683 0xB2, 0xB3, 0xB0, 0xB1, 0xB6, 0xB7, 0xB4, 0xB5, 2684 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 0x82, 2685 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 0x9A, 2686 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 0x92, 2687 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0xEB, 2688 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 0xE2, 0xE3, 2689 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 0xFB, 0xF9, 2690 0xFE, 0xFF, 0xFC, 0xFD, 0xF2, 0xF3, 0xF0, 0xF1, 2691 0xF6, 0xF7, 0xF4, 0xF5, 0xCB, 0xC9, 0xCF, 0xCD, 2692 0xC2, 0xC3, 0xC0, 0xC1, 0xC6, 0xC7, 0xC4, 0xC5, 2693 0xDA, 0xDB, 0xD8, 0xD9, 0xDE, 0xDF, 0xDC, 0xDD, 2694 0xD2, 0xD2, 0xD3, 0xD3, 0xD0, 0xD0, 0xD1, 0xD1, 2695 0xD6, 0xD6, 0xD7, 0xD7, 0xD4, 0xD4, 0xD5, 0xD5 2696 }; 2697 2698 while (len--) 2699 { 2700 *buff = table_ulaw2alaw[*(unsigned char *)buff]; 2701 buff++; 2702 } 2703} 2704 2705static void alaw2ulaw(unsigned char *buff, unsigned long len) 2706{ 2707 static unsigned char table_alaw2ulaw[] = 2708 { 2709 0x29, 0x2A, 0x27, 0x28, 0x2D, 0x2E, 0x2B, 0x2C, 2710 0x21, 0x22, 0x1F, 0x20, 0x25, 0x26, 0x23, 0x24, 2711 0x39, 0x3A, 0x37, 0x38, 0x3D, 0x3E, 0x3B, 0x3C, 2712 0x31, 0x32, 0x2F, 0x30, 0x35, 0x36, 0x33, 0x34, 2713 0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 2714 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 2715 0x1A, 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 2716 0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 2717 0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 2718 0x5D, 0x5D, 0x5C, 0x5C, 0x5F, 0x5F, 0x5E, 0x5E, 2719 0x74, 0x76, 0x70, 0x72, 0x7C, 0x7E, 0x78, 0x7A, 2720 0x6A, 0x6B, 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 2721 0x48, 0x49, 0x46, 0x47, 0x4C, 0x4D, 0x4A, 0x4B, 2722 0x40, 0x41, 0x3F, 0x3F, 0x44, 0x45, 0x42, 0x43, 2723 0x56, 0x57, 0x54, 0x55, 0x5A, 0x5B, 0x58, 0x59, 2724 0x4F, 0x4F, 0x4E, 0x4E, 0x52, 0x53, 0x50, 0x51, 2725 0xA9, 0xAA, 0xA7, 0xA8, 0xAD, 0xAE, 0xAB, 0xAC, 2726 0xA1, 0xA2, 0x9F, 0xA0, 0xA5, 0xA6, 0xA3, 0xA4, 2727 0xB9, 0xBA, 0xB7, 0xB8, 0xBD, 0xBE, 0xBB, 0xBC, 2728 0xB1, 0xB2, 0xAF, 0xB0, 0xB5, 0xB6, 0xB3, 0xB4, 2729 0x8A, 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 2730 0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 2731 0x9A, 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 2732 0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 2733 0xE2, 0xE3, 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 2734 0xDD, 0xDD, 0xDC, 0xDC, 0xDF, 0xDF, 0xDE, 0xDE, 2735 0xF4, 0xF6, 0xF0, 0xF2, 0xFC, 0xFE, 0xF8, 0xFA, 2736 0xEA, 0xEB, 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 2737 0xC8, 0xC9, 0xC6, 0xC7, 0xCC, 0xCD, 0xCA, 0xCB, 2738 0xC0, 0xC1, 0xBF, 0xBF, 0xC4, 0xC5, 0xC2, 0xC3, 2739 0xD6, 0xD7, 0xD4, 0xD5, 0xDA, 0xDB, 0xD8, 0xD9, 2740 0xCF, 0xCF, 0xCE, 0xCE, 0xD2, 0xD3, 0xD0, 0xD1 2741 }; 2742 2743 while (len--) 2744 { 2745 *buff = table_alaw2ulaw[*(unsigned char *)buff]; 2746 buff++; 2747 } 2748} 2749 2750static ssize_t ixj_read(struct file * file_p, char __user *buf, size_t length, loff_t * ppos) 2751{ 2752 unsigned long i = *ppos; 2753 IXJ * j = get_ixj(NUM(file_p->f_path.dentry->d_inode)); 2754 2755 DECLARE_WAITQUEUE(wait, current); 2756 2757 if (j->flags.inread) 2758 return -EALREADY; 2759 2760 j->flags.inread = 1; 2761 2762 add_wait_queue(&j->read_q, &wait); 2763 set_current_state(TASK_INTERRUPTIBLE); 2764 mb(); 2765 2766 while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) { 2767 ++j->read_wait; 2768 if (file_p->f_flags & O_NONBLOCK) { 2769 set_current_state(TASK_RUNNING); 2770 remove_wait_queue(&j->read_q, &wait); 2771 j->flags.inread = 0; 2772 return -EAGAIN; 2773 } 2774 if (!ixj_hookstate(j)) { 2775 set_current_state(TASK_RUNNING); 2776 remove_wait_queue(&j->read_q, &wait); 2777 j->flags.inread = 0; 2778 return 0; 2779 } 2780 interruptible_sleep_on(&j->read_q); 2781 if (signal_pending(current)) { 2782 set_current_state(TASK_RUNNING); 2783 remove_wait_queue(&j->read_q, &wait); 2784 j->flags.inread = 0; 2785 return -EINTR; 2786 } 2787 } 2788 2789 remove_wait_queue(&j->read_q, &wait); 2790 set_current_state(TASK_RUNNING); 2791 /* Don't ever copy more than the user asks */ 2792 if(j->rec_codec == ALAW) 2793 ulaw2alaw(j->read_buffer, min(length, j->read_buffer_size)); 2794 i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size)); 2795 j->read_buffer_ready = 0; 2796 if (i) { 2797 j->flags.inread = 0; 2798 return -EFAULT; 2799 } else { 2800 j->flags.inread = 0; 2801 return min(length, j->read_buffer_size); 2802 } 2803} 2804 2805static ssize_t ixj_enhanced_read(struct file * file_p, char __user *buf, size_t length, 2806 loff_t * ppos) 2807{ 2808 int pre_retval; 2809 ssize_t read_retval = 0; 2810 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode)); 2811 2812 pre_retval = ixj_PreRead(j, 0L); 2813 switch (pre_retval) { 2814 case NORMAL: 2815 read_retval = ixj_read(file_p, buf, length, ppos); 2816 ixj_PostRead(j, 0L); 2817 break; 2818 case NOPOST: 2819 read_retval = ixj_read(file_p, buf, length, ppos); 2820 break; 2821 case POSTONLY: 2822 ixj_PostRead(j, 0L); 2823 break; 2824 default: 2825 read_retval = pre_retval; 2826 } 2827 return read_retval; 2828} 2829 2830static ssize_t ixj_write(struct file *file_p, const char __user *buf, size_t count, loff_t * ppos) 2831{ 2832 unsigned long i = *ppos; 2833 IXJ *j = file_p->private_data; 2834 2835 DECLARE_WAITQUEUE(wait, current); 2836 2837 if (j->flags.inwrite) 2838 return -EALREADY; 2839 2840 j->flags.inwrite = 1; 2841 2842 add_wait_queue(&j->write_q, &wait); 2843 set_current_state(TASK_INTERRUPTIBLE); 2844 mb(); 2845 2846 2847 while (!j->write_buffers_empty) { 2848 ++j->write_wait; 2849 if (file_p->f_flags & O_NONBLOCK) { 2850 set_current_state(TASK_RUNNING); 2851 remove_wait_queue(&j->write_q, &wait); 2852 j->flags.inwrite = 0; 2853 return -EAGAIN; 2854 } 2855 if (!ixj_hookstate(j)) { 2856 set_current_state(TASK_RUNNING); 2857 remove_wait_queue(&j->write_q, &wait); 2858 j->flags.inwrite = 0; 2859 return 0; 2860 } 2861 interruptible_sleep_on(&j->write_q); 2862 if (signal_pending(current)) { 2863 set_current_state(TASK_RUNNING); 2864 remove_wait_queue(&j->write_q, &wait); 2865 j->flags.inwrite = 0; 2866 return -EINTR; 2867 } 2868 } 2869 set_current_state(TASK_RUNNING); 2870 remove_wait_queue(&j->write_q, &wait); 2871 if (j->write_buffer_wp + count >= j->write_buffer_end) 2872 j->write_buffer_wp = j->write_buffer; 2873 i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size)); 2874 if (i) { 2875 j->flags.inwrite = 0; 2876 return -EFAULT; 2877 } 2878 if(j->play_codec == ALAW) 2879 alaw2ulaw(j->write_buffer_wp, min(count, j->write_buffer_size)); 2880 j->flags.inwrite = 0; 2881 return min(count, j->write_buffer_size); 2882} 2883 2884static ssize_t ixj_enhanced_write(struct file * file_p, const char __user *buf, size_t count, loff_t * ppos) 2885{ 2886 int pre_retval; 2887 ssize_t write_retval = 0; 2888 2889 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode)); 2890 2891 pre_retval = ixj_PreWrite(j, 0L); 2892 switch (pre_retval) { 2893 case NORMAL: 2894 write_retval = ixj_write(file_p, buf, count, ppos); 2895 if (write_retval > 0) { 2896 ixj_PostWrite(j, 0L); 2897 j->write_buffer_wp += write_retval; 2898 j->write_buffers_empty--; 2899 } 2900 break; 2901 case NOPOST: 2902 write_retval = ixj_write(file_p, buf, count, ppos); 2903 if (write_retval > 0) { 2904 j->write_buffer_wp += write_retval; 2905 j->write_buffers_empty--; 2906 } 2907 break; 2908 case POSTONLY: 2909 ixj_PostWrite(j, 0L); 2910 break; 2911 default: 2912 write_retval = pre_retval; 2913 } 2914 return write_retval; 2915} 2916 2917static void ixj_read_frame(IXJ *j) 2918{ 2919 int cnt, dly; 2920 2921 if (j->read_buffer) { 2922 for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) { 2923 if (!(cnt % 16) && !IsRxReady(j)) { 2924 dly = 0; 2925 while (!IsRxReady(j)) { 2926 if (dly++ > 5) { 2927 dly = 0; 2928 break; 2929 } 2930 udelay(10); 2931 } 2932 } 2933 /* Throw away word 0 of the 8021 compressed format to get standard G.729. */ 2934 if (j->rec_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) { 2935 inb_p(j->DSPbase + 0x0E); 2936 inb_p(j->DSPbase + 0x0F); 2937 } 2938 *(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E); 2939 *(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F); 2940 } 2941 ++j->framesread; 2942 if (j->intercom != -1) { 2943 if (IsTxReady(get_ixj(j->intercom))) { 2944 for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) { 2945 if (!(cnt % 16) && !IsTxReady(j)) { 2946 dly = 0; 2947 while (!IsTxReady(j)) { 2948 if (dly++ > 5) { 2949 dly = 0; 2950 break; 2951 } 2952 udelay(10); 2953 } 2954 } 2955 outb_p(*(j->read_buffer + cnt), get_ixj(j->intercom)->DSPbase + 0x0C); 2956 outb_p(*(j->read_buffer + cnt + 1), get_ixj(j->intercom)->DSPbase + 0x0D); 2957 } 2958 get_ixj(j->intercom)->frameswritten++; 2959 } 2960 } else { 2961 j->read_buffer_ready = 1; 2962 wake_up_interruptible(&j->read_q); /* Wake any blocked readers */ 2963 2964 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */ 2965 2966 if(j->ixj_signals[SIG_READ_READY]) 2967 ixj_kill_fasync(j, SIG_READ_READY, POLL_OUT); 2968 } 2969 } 2970} 2971 2972static short fsk[][6][20] = 2973{ 2974 { 2975 { 2976 0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196, 2977 -16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722 2978 }, 2979 { 2980 -28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481, 2981 -32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876 2982 }, 2983 { 2984 -28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715, 2985 -16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846 2986 }, 2987 { 2988 0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196, 2989 16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722 2990 }, 2991 { 2992 28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481, 2993 32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876 2994 }, 2995 { 2996 28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715, 2997 16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846 2998 } 2999 }, 3000 { 3001 { 3002 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126, 3003 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126 3004 }, 3005 { 3006 -28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051, 3007 28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051 3008 }, 3009 { 3010 -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925, 3011 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925 3012 }, 3013 { 3014 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126, 3015 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126 3016 }, 3017 { 3018 28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051, 3019 -28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051 3020 }, 3021 { 3022 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925, 3023 -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925 3024 } 3025 } 3026}; 3027 3028 3029static void ixj_write_cid_bit(IXJ *j, int bit) 3030{ 3031 while (j->fskcnt < 20) { 3032 if(j->fskdcnt < (j->fsksize - 1)) 3033 j->fskdata[j->fskdcnt++] = fsk[bit][j->fskz][j->fskcnt]; 3034 3035 j->fskcnt += 3; 3036 } 3037 j->fskcnt %= 20; 3038 3039 if (!bit) 3040 j->fskz++; 3041 if (j->fskz >= 6) 3042 j->fskz = 0; 3043 3044} 3045 3046static void ixj_write_cid_byte(IXJ *j, char byte) 3047{ 3048 IXJ_CBYTE cb; 3049 3050 cb.cbyte = byte; 3051 ixj_write_cid_bit(j, 0); 3052 ixj_write_cid_bit(j, cb.cbits.b0 ? 1 : 0); 3053 ixj_write_cid_bit(j, cb.cbits.b1 ? 1 : 0); 3054 ixj_write_cid_bit(j, cb.cbits.b2 ? 1 : 0); 3055 ixj_write_cid_bit(j, cb.cbits.b3 ? 1 : 0); 3056 ixj_write_cid_bit(j, cb.cbits.b4 ? 1 : 0); 3057 ixj_write_cid_bit(j, cb.cbits.b5 ? 1 : 0); 3058 ixj_write_cid_bit(j, cb.cbits.b6 ? 1 : 0); 3059 ixj_write_cid_bit(j, cb.cbits.b7 ? 1 : 0); 3060 ixj_write_cid_bit(j, 1); 3061} 3062 3063static void ixj_write_cid_seize(IXJ *j) 3064{ 3065 int cnt; 3066 3067 for (cnt = 0; cnt < 150; cnt++) { 3068 ixj_write_cid_bit(j, 0); 3069 ixj_write_cid_bit(j, 1); 3070 } 3071 for (cnt = 0; cnt < 180; cnt++) { 3072 ixj_write_cid_bit(j, 1); 3073 } 3074} 3075 3076static void ixj_write_cidcw_seize(IXJ *j) 3077{ 3078 int cnt; 3079 3080 for (cnt = 0; cnt < 80; cnt++) { 3081 ixj_write_cid_bit(j, 1); 3082 } 3083} 3084 3085static int ixj_write_cid_string(IXJ *j, char *s, int checksum) 3086{ 3087 int cnt; 3088 3089 for (cnt = 0; cnt < strlen(s); cnt++) { 3090 ixj_write_cid_byte(j, s[cnt]); 3091 checksum = (checksum + s[cnt]); 3092 } 3093 return checksum; 3094} 3095 3096static void ixj_pad_fsk(IXJ *j, int pad) 3097{ 3098 int cnt; 3099 3100 for (cnt = 0; cnt < pad; cnt++) { 3101 if(j->fskdcnt < (j->fsksize - 1)) 3102 j->fskdata[j->fskdcnt++] = 0x0000; 3103 } 3104 for (cnt = 0; cnt < 720; cnt++) { 3105 if(j->fskdcnt < (j->fsksize - 1)) 3106 j->fskdata[j->fskdcnt++] = 0x0000; 3107 } 3108} 3109 3110static void ixj_pre_cid(IXJ *j) 3111{ 3112 j->cid_play_codec = j->play_codec; 3113 j->cid_play_frame_size = j->play_frame_size; 3114 j->cid_play_volume = get_play_volume(j); 3115 j->cid_play_flag = j->flags.playing; 3116 3117 j->cid_rec_codec = j->rec_codec; 3118 j->cid_rec_volume = get_rec_volume(j); 3119 j->cid_rec_flag = j->flags.recording; 3120 3121 j->cid_play_aec_level = j->aec_level; 3122 3123 switch(j->baseframe.low) { 3124 case 0xA0: 3125 j->cid_base_frame_size = 20; 3126 break; 3127 case 0x50: 3128 j->cid_base_frame_size = 10; 3129 break; 3130 case 0xF0: 3131 j->cid_base_frame_size = 30; 3132 break; 3133 } 3134 3135 ixj_play_stop(j); 3136 ixj_cpt_stop(j); 3137 3138 j->flags.cidplay = 1; 3139 3140 set_base_frame(j, 30); 3141 set_play_codec(j, LINEAR16); 3142 set_play_volume(j, 0x1B); 3143 ixj_play_start(j); 3144} 3145 3146static void ixj_post_cid(IXJ *j) 3147{ 3148 ixj_play_stop(j); 3149 3150 if(j->cidsize > 5000) { 3151 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j); 3152 } 3153 j->flags.cidplay = 0; 3154 if(ixjdebug & 0x0200) { 3155 printk("IXJ phone%d Finished Playing CallerID data %ld\n", j->board, jiffies); 3156 } 3157 3158 ixj_fsk_free(j); 3159 3160 j->fskdcnt = 0; 3161 set_base_frame(j, j->cid_base_frame_size); 3162 set_play_codec(j, j->cid_play_codec); 3163 ixj_aec_start(j, j->cid_play_aec_level); 3164 set_play_volume(j, j->cid_play_volume); 3165 3166 set_rec_codec(j, j->cid_rec_codec); 3167 set_rec_volume(j, j->cid_rec_volume); 3168 3169 if(j->cid_rec_flag) 3170 ixj_record_start(j); 3171 3172 if(j->cid_play_flag) 3173 ixj_play_start(j); 3174 3175 if(j->cid_play_flag) { 3176 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */ 3177 } 3178} 3179 3180static void ixj_write_cid(IXJ *j) 3181{ 3182 char sdmf1[50]; 3183 char sdmf2[50]; 3184 char sdmf3[80]; 3185 char mdmflen, len1, len2, len3; 3186 int pad; 3187 3188 int checksum = 0; 3189 3190 if (j->dsp.low == 0x20 || j->flags.cidplay) 3191 return; 3192 3193 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0; 3194 j->cidsize = j->cidcnt = 0; 3195 3196 ixj_fsk_alloc(j); 3197 3198 strcpy(sdmf1, j->cid_send.month); 3199 strcat(sdmf1, j->cid_send.day); 3200 strcat(sdmf1, j->cid_send.hour); 3201 strcat(sdmf1, j->cid_send.min); 3202 strcpy(sdmf2, j->cid_send.number); 3203 strcpy(sdmf3, j->cid_send.name); 3204 3205 len1 = strlen(sdmf1); 3206 len2 = strlen(sdmf2); 3207 len3 = strlen(sdmf3); 3208 mdmflen = len1 + len2 + len3 + 6; 3209 3210 while(1){ 3211 ixj_write_cid_seize(j); 3212 3213 ixj_write_cid_byte(j, 0x80); 3214 checksum = 0x80; 3215 ixj_write_cid_byte(j, mdmflen); 3216 checksum = checksum + mdmflen; 3217 3218 ixj_write_cid_byte(j, 0x01); 3219 checksum = checksum + 0x01; 3220 ixj_write_cid_byte(j, len1); 3221 checksum = checksum + len1; 3222 checksum = ixj_write_cid_string(j, sdmf1, checksum); 3223 if(ixj_hookstate(j) & 1) 3224 break; 3225 3226 ixj_write_cid_byte(j, 0x02); 3227 checksum = checksum + 0x02; 3228 ixj_write_cid_byte(j, len2); 3229 checksum = checksum + len2; 3230 checksum = ixj_write_cid_string(j, sdmf2, checksum); 3231 if(ixj_hookstate(j) & 1) 3232 break; 3233 3234 ixj_write_cid_byte(j, 0x07); 3235 checksum = checksum + 0x07; 3236 ixj_write_cid_byte(j, len3); 3237 checksum = checksum + len3; 3238 checksum = ixj_write_cid_string(j, sdmf3, checksum); 3239 if(ixj_hookstate(j) & 1) 3240 break; 3241 3242 checksum %= 256; 3243 checksum ^= 0xFF; 3244 checksum += 1; 3245 3246 ixj_write_cid_byte(j, (char) checksum); 3247 3248 pad = j->fskdcnt % 240; 3249 if (pad) { 3250 pad = 240 - pad; 3251 } 3252 ixj_pad_fsk(j, pad); 3253 break; 3254 } 3255 3256 ixj_write_frame(j); 3257} 3258 3259static void ixj_write_cidcw(IXJ *j) 3260{ 3261 IXJ_TONE ti; 3262 3263 char sdmf1[50]; 3264 char sdmf2[50]; 3265 char sdmf3[80]; 3266 char mdmflen, len1, len2, len3; 3267 int pad; 3268 3269 int checksum = 0; 3270 3271 if (j->dsp.low == 0x20 || j->flags.cidplay) 3272 return; 3273 3274 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0; 3275 j->cidsize = j->cidcnt = 0; 3276 3277 ixj_fsk_alloc(j); 3278 3279 j->flags.cidcw_ack = 0; 3280 3281 ti.tone_index = 23; 3282 ti.gain0 = 1; 3283 ti.freq0 = hz440; 3284 ti.gain1 = 0; 3285 ti.freq1 = 0; 3286 ixj_init_tone(j, &ti); 3287 3288 ixj_set_tone_on(1500, j); 3289 ixj_set_tone_off(32, j); 3290 if(ixjdebug & 0x0200) { 3291 printk("IXJ cidcw phone%d first tone start at %ld\n", j->board, jiffies); 3292 } 3293 ixj_play_tone(j, 23); 3294 3295 clear_bit(j->board, &j->busyflags); 3296 while(j->tone_state) 3297 schedule_timeout_interruptible(1); 3298 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) 3299 schedule_timeout_interruptible(1); 3300 if(ixjdebug & 0x0200) { 3301 printk("IXJ cidcw phone%d first tone end at %ld\n", j->board, jiffies); 3302 } 3303 3304 ti.tone_index = 24; 3305 ti.gain0 = 1; 3306 ti.freq0 = hz2130; 3307 ti.gain1 = 0; 3308 ti.freq1 = hz2750; 3309 ixj_init_tone(j, &ti); 3310 3311 ixj_set_tone_off(10, j); 3312 ixj_set_tone_on(600, j); 3313 if(ixjdebug & 0x0200) { 3314 printk("IXJ cidcw phone%d second tone start at %ld\n", j->board, jiffies); 3315 } 3316 ixj_play_tone(j, 24); 3317 3318 clear_bit(j->board, &j->busyflags); 3319 while(j->tone_state) 3320 schedule_timeout_interruptible(1); 3321 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) 3322 schedule_timeout_interruptible(1); 3323 if(ixjdebug & 0x0200) { 3324 printk("IXJ cidcw phone%d sent second tone at %ld\n", j->board, jiffies); 3325 } 3326 3327 j->cidcw_wait = jiffies + ((50 * hertz) / 100); 3328 3329 clear_bit(j->board, &j->busyflags); 3330 while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait)) 3331 schedule_timeout_interruptible(1); 3332 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) 3333 schedule_timeout_interruptible(1); 3334 j->cidcw_wait = 0; 3335 if(!j->flags.cidcw_ack) { 3336 if(ixjdebug & 0x0200) { 3337 printk("IXJ cidcw phone%d did not receive ACK from display %ld\n", j->board, jiffies); 3338 } 3339 ixj_post_cid(j); 3340 if(j->cid_play_flag) { 3341 wake_up_interruptible(&j->write_q); /* Wake any blocked readers */ 3342 } 3343 return; 3344 } else { 3345 ixj_pre_cid(j); 3346 } 3347 j->flags.cidcw_ack = 0; 3348 strcpy(sdmf1, j->cid_send.month); 3349 strcat(sdmf1, j->cid_send.day); 3350 strcat(sdmf1, j->cid_send.hour); 3351 strcat(sdmf1, j->cid_send.min); 3352 strcpy(sdmf2, j->cid_send.number); 3353 strcpy(sdmf3, j->cid_send.name); 3354 3355 len1 = strlen(sdmf1); 3356 len2 = strlen(sdmf2); 3357 len3 = strlen(sdmf3); 3358 mdmflen = len1 + len2 + len3 + 6; 3359 3360 ixj_write_cidcw_seize(j); 3361 3362 ixj_write_cid_byte(j, 0x80); 3363 checksum = 0x80; 3364 ixj_write_cid_byte(j, mdmflen); 3365 checksum = checksum + mdmflen; 3366 3367 ixj_write_cid_byte(j, 0x01); 3368 checksum = checksum + 0x01; 3369 ixj_write_cid_byte(j, len1); 3370 checksum = checksum + len1; 3371 checksum = ixj_write_cid_string(j, sdmf1, checksum); 3372 3373 ixj_write_cid_byte(j, 0x02); 3374 checksum = checksum + 0x02; 3375 ixj_write_cid_byte(j, len2); 3376 checksum = checksum + len2; 3377 checksum = ixj_write_cid_string(j, sdmf2, checksum); 3378 3379 ixj_write_cid_byte(j, 0x07); 3380 checksum = checksum + 0x07; 3381 ixj_write_cid_byte(j, len3); 3382 checksum = checksum + len3; 3383 checksum = ixj_write_cid_string(j, sdmf3, checksum); 3384 3385 checksum %= 256; 3386 checksum ^= 0xFF; 3387 checksum += 1; 3388 3389 ixj_write_cid_byte(j, (char) checksum); 3390 3391 pad = j->fskdcnt % 240; 3392 if (pad) { 3393 pad = 240 - pad; 3394 } 3395 ixj_pad_fsk(j, pad); 3396 if(ixjdebug & 0x0200) { 3397 printk("IXJ cidcw phone%d sent FSK data at %ld\n", j->board, jiffies); 3398 } 3399} 3400 3401static void ixj_write_vmwi(IXJ *j, int msg) 3402{ 3403 char mdmflen; 3404 int pad; 3405 3406 int checksum = 0; 3407 3408 if (j->dsp.low == 0x20 || j->flags.cidplay) 3409 return; 3410 3411 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0; 3412 j->cidsize = j->cidcnt = 0; 3413 3414 ixj_fsk_alloc(j); 3415 3416 mdmflen = 3; 3417 3418 if (j->port == PORT_POTS) 3419 SLIC_SetState(PLD_SLIC_STATE_OHT, j); 3420 3421 ixj_write_cid_seize(j); 3422 3423 ixj_write_cid_byte(j, 0x82); 3424 checksum = 0x82; 3425 ixj_write_cid_byte(j, mdmflen); 3426 checksum = checksum + mdmflen; 3427 3428 ixj_write_cid_byte(j, 0x0B); 3429 checksum = checksum + 0x0B; 3430 ixj_write_cid_byte(j, 1); 3431 checksum = checksum + 1; 3432 3433 if(msg) { 3434 ixj_write_cid_byte(j, 0xFF); 3435 checksum = checksum + 0xFF; 3436 } 3437 else { 3438 ixj_write_cid_byte(j, 0x00); 3439 checksum = checksum + 0x00; 3440 } 3441 3442 checksum %= 256; 3443 checksum ^= 0xFF; 3444 checksum += 1; 3445 3446 ixj_write_cid_byte(j, (char) checksum); 3447 3448 pad = j->fskdcnt % 240; 3449 if (pad) { 3450 pad = 240 - pad; 3451 } 3452 ixj_pad_fsk(j, pad); 3453} 3454 3455static void ixj_write_frame(IXJ *j) 3456{ 3457 int cnt, frame_count, dly; 3458 IXJ_WORD dat; 3459 BYTES blankword; 3460 3461 frame_count = 0; 3462 if(j->flags.cidplay) { 3463 for(cnt = 0; cnt < 480; cnt++) { 3464 if (!(cnt % 16) && !IsTxReady(j)) { 3465 dly = 0; 3466 while (!IsTxReady(j)) { 3467 if (dly++ > 5) { 3468 dly = 0; 3469 break; 3470 } 3471 udelay(10); 3472 } 3473 } 3474 dat.word = j->fskdata[j->cidcnt++]; 3475 outb_p(dat.bytes.low, j->DSPbase + 0x0C); 3476 outb_p(dat.bytes.high, j->DSPbase + 0x0D); 3477 cnt++; 3478 } 3479 if(j->cidcnt >= j->fskdcnt) { 3480 ixj_post_cid(j); 3481 } 3482 /* This may seem rude, but if we just played one frame of FSK data for CallerID 3483 and there is real audio data in the buffer, we need to throw it away because 3484 we just used it's time slot */ 3485 if (j->write_buffer_rp > j->write_buffer_wp) { 3486 j->write_buffer_rp += j->cid_play_frame_size * 2; 3487 if (j->write_buffer_rp >= j->write_buffer_end) { 3488 j->write_buffer_rp = j->write_buffer; 3489 } 3490 j->write_buffers_empty++; 3491 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */ 3492 3493 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */ 3494 } 3495 } else if (j->write_buffer && j->write_buffers_empty < 1) { 3496 if (j->write_buffer_wp > j->write_buffer_rp) { 3497 frame_count = 3498 (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2); 3499 } 3500 if (j->write_buffer_rp > j->write_buffer_wp) { 3501 frame_count = 3502 (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) + 3503 (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2); 3504 } 3505 if (frame_count >= 1) { 3506 if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) { 3507 switch (j->play_mode) { 3508 case PLAYBACK_MODE_ULAW: 3509 case PLAYBACK_MODE_ALAW: 3510 blankword.low = blankword.high = 0xFF; 3511 break; 3512 case PLAYBACK_MODE_8LINEAR: 3513 case PLAYBACK_MODE_16LINEAR: 3514 blankword.low = blankword.high = 0x00; 3515 break; 3516 case PLAYBACK_MODE_8LINEAR_WSS: 3517 blankword.low = blankword.high = 0x80; 3518 break; 3519 } 3520 for (cnt = 0; cnt < 16; cnt++) { 3521 if (!(cnt % 16) && !IsTxReady(j)) { 3522 dly = 0; 3523 while (!IsTxReady(j)) { 3524 if (dly++ > 5) { 3525 dly = 0; 3526 break; 3527 } 3528 udelay(10); 3529 } 3530 } 3531 outb_p((blankword.low), j->DSPbase + 0x0C); 3532 outb_p((blankword.high), j->DSPbase + 0x0D); 3533 } 3534 j->flags.play_first_frame = 0; 3535 } else if (j->play_codec == G723_63 && j->flags.play_first_frame) { 3536 for (cnt = 0; cnt < 24; cnt++) { 3537 if(cnt == 12) { 3538 blankword.low = 0x02; 3539 blankword.high = 0x00; 3540 } 3541 else { 3542 blankword.low = blankword.high = 0x00; 3543 } 3544 if (!(cnt % 16) && !IsTxReady(j)) { 3545 dly = 0; 3546 while (!IsTxReady(j)) { 3547 if (dly++ > 5) { 3548 dly = 0; 3549 break; 3550 } 3551 udelay(10); 3552 } 3553 } 3554 outb_p((blankword.low), j->DSPbase + 0x0C); 3555 outb_p((blankword.high), j->DSPbase + 0x0D); 3556 } 3557 j->flags.play_first_frame = 0; 3558 } 3559 for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) { 3560 if (!(cnt % 16) && !IsTxReady(j)) { 3561 dly = 0; 3562 while (!IsTxReady(j)) { 3563 if (dly++ > 5) { 3564 dly = 0; 3565 break; 3566 } 3567 udelay(10); 3568 } 3569 } 3570 /* Add word 0 to G.729 frames for the 8021. Right now we don't do VAD/CNG */ 3571 if (j->play_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) { 3572 if (j->write_buffer_rp[cnt] == 0 && 3573 j->write_buffer_rp[cnt + 1] == 0 && 3574 j->write_buffer_rp[cnt + 2] == 0 && 3575 j->write_buffer_rp[cnt + 3] == 0 && 3576 j->write_buffer_rp[cnt + 4] == 0 && 3577 j->write_buffer_rp[cnt + 5] == 0 && 3578 j->write_buffer_rp[cnt + 6] == 0 && 3579 j->write_buffer_rp[cnt + 7] == 0 && 3580 j->write_buffer_rp[cnt + 8] == 0 && 3581 j->write_buffer_rp[cnt + 9] == 0) { 3582 /* someone is trying to write silence lets make this a type 0 frame. */ 3583 outb_p(0x00, j->DSPbase + 0x0C); 3584 outb_p(0x00, j->DSPbase + 0x0D); 3585 } else { 3586 /* so all other frames are type 1. */ 3587 outb_p(0x01, j->DSPbase + 0x0C); 3588 outb_p(0x00, j->DSPbase + 0x0D); 3589 } 3590 } 3591 outb_p(*(j->write_buffer_rp + cnt), j->DSPbase + 0x0C); 3592 outb_p(*(j->write_buffer_rp + cnt + 1), j->DSPbase + 0x0D); 3593 *(j->write_buffer_rp + cnt) = 0; 3594 *(j->write_buffer_rp + cnt + 1) = 0; 3595 } 3596 j->write_buffer_rp += j->play_frame_size * 2; 3597 if (j->write_buffer_rp >= j->write_buffer_end) { 3598 j->write_buffer_rp = j->write_buffer; 3599 } 3600 j->write_buffers_empty++; 3601 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */ 3602 3603 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */ 3604 3605 ++j->frameswritten; 3606 } 3607 } else { 3608 j->drybuffer++; 3609 } 3610 if(j->ixj_signals[SIG_WRITE_READY]) { 3611 ixj_kill_fasync(j, SIG_WRITE_READY, POLL_OUT); 3612 } 3613} 3614 3615static int idle(IXJ *j) 3616{ 3617 if (ixj_WriteDSPCommand(0x0000, j)) /* DSP Idle */ 3618 3619 return 0; 3620 3621 if (j->ssr.high || j->ssr.low) { 3622 return 0; 3623 } else { 3624 j->play_mode = -1; 3625 j->flags.playing = 0; 3626 j->rec_mode = -1; 3627 j->flags.recording = 0; 3628 return 1; 3629 } 3630} 3631 3632static int set_base_frame(IXJ *j, int size) 3633{ 3634 unsigned short cmd; 3635 int cnt; 3636 3637 idle(j); 3638 j->cid_play_aec_level = j->aec_level; 3639 aec_stop(j); 3640 for (cnt = 0; cnt < 10; cnt++) { 3641 if (idle(j)) 3642 break; 3643 } 3644 if (j->ssr.high || j->ssr.low) 3645 return -1; 3646 if (j->dsp.low != 0x20) { 3647 switch (size) { 3648 case 30: 3649 cmd = 0x07F0; 3650 /* Set Base Frame Size to 240 pg9-10 8021 */ 3651 break; 3652 case 20: 3653 cmd = 0x07A0; 3654 /* Set Base Frame Size to 160 pg9-10 8021 */ 3655 break; 3656 case 10: 3657 cmd = 0x0750; 3658 /* Set Base Frame Size to 80 pg9-10 8021 */ 3659 break; 3660 default: 3661 return -1; 3662 } 3663 } else { 3664 if (size == 30) 3665 return size; 3666 else 3667 return -1; 3668 } 3669 if (ixj_WriteDSPCommand(cmd, j)) { 3670 j->baseframe.high = j->baseframe.low = 0xFF; 3671 return -1; 3672 } else { 3673 j->baseframe.high = j->ssr.high; 3674 j->baseframe.low = j->ssr.low; 3675 /* If the status returned is 0x0000 (pg9-9 8021) the call failed */ 3676 if(j->baseframe.high == 0x00 && j->baseframe.low == 0x00) { 3677 return -1; 3678 } 3679 } 3680 ixj_aec_start(j, j->cid_play_aec_level); 3681 return size; 3682} 3683 3684static int set_rec_codec(IXJ *j, int rate) 3685{ 3686 int retval = 0; 3687 3688 j->rec_codec = rate; 3689 3690 switch (rate) { 3691 case G723_63: 3692 if (j->ver.low != 0x12 || ixj_convert_loaded) { 3693 j->rec_frame_size = 12; 3694 j->rec_mode = 0; 3695 } else { 3696 retval = 1; 3697 } 3698 break; 3699 case G723_53: 3700 if (j->ver.low != 0x12 || ixj_convert_loaded) { 3701 j->rec_frame_size = 10; 3702 j->rec_mode = 0; 3703 } else { 3704 retval = 1; 3705 } 3706 break; 3707 case TS85: 3708 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) { 3709 j->rec_frame_size = 16; 3710 j->rec_mode = 0; 3711 } else { 3712 retval = 1; 3713 } 3714 break; 3715 case TS48: 3716 if (j->ver.low != 0x12 || ixj_convert_loaded) { 3717 j->rec_frame_size = 9; 3718 j->rec_mode = 0; 3719 } else { 3720 retval = 1; 3721 } 3722 break; 3723 case TS41: 3724 if (j->ver.low != 0x12 || ixj_convert_loaded) { 3725 j->rec_frame_size = 8; 3726 j->rec_mode = 0; 3727 } else { 3728 retval = 1; 3729 } 3730 break; 3731 case G728: 3732 if (j->dsp.low != 0x20) { 3733 j->rec_frame_size = 48; 3734 j->rec_mode = 0; 3735 } else { 3736 retval = 1; 3737 } 3738 break; 3739 case G729: 3740 if (j->dsp.low != 0x20) { 3741 if (!j->flags.g729_loaded) { 3742 retval = 1; 3743 break; 3744 } 3745 switch (j->baseframe.low) { 3746 case 0xA0: 3747 j->rec_frame_size = 10; 3748 break; 3749 case 0x50: 3750 j->rec_frame_size = 5; 3751 break; 3752 default: 3753 j->rec_frame_size = 15; 3754 break; 3755 } 3756 j->rec_mode = 0; 3757 } else { 3758 retval = 1; 3759 } 3760 break; 3761 case G729B: 3762 if (j->dsp.low != 0x20) { 3763 if (!j->flags.g729_loaded) { 3764 retval = 1; 3765 break; 3766 } 3767 switch (j->baseframe.low) { 3768 case 0xA0: 3769 j->rec_frame_size = 12; 3770 break; 3771 case 0x50: 3772 j->rec_frame_size = 6; 3773 break; 3774 default: 3775 j->rec_frame_size = 18; 3776 break; 3777 } 3778 j->rec_mode = 0; 3779 } else { 3780 retval = 1; 3781 } 3782 break; 3783 case ULAW: 3784 switch (j->baseframe.low) { 3785 case 0xA0: 3786 j->rec_frame_size = 80; 3787 break; 3788 case 0x50: 3789 j->rec_frame_size = 40; 3790 break; 3791 default: 3792 j->rec_frame_size = 120; 3793 break; 3794 } 3795 j->rec_mode = 4; 3796 break; 3797 case ALAW: 3798 switch (j->baseframe.low) { 3799 case 0xA0: 3800 j->rec_frame_size = 80; 3801 break; 3802 case 0x50: 3803 j->rec_frame_size = 40; 3804 break; 3805 default: 3806 j->rec_frame_size = 120; 3807 break; 3808 } 3809 j->rec_mode = 4; 3810 break; 3811 case LINEAR16: 3812 switch (j->baseframe.low) { 3813 case 0xA0: 3814 j->rec_frame_size = 160; 3815 break; 3816 case 0x50: 3817 j->rec_frame_size = 80; 3818 break; 3819 default: 3820 j->rec_frame_size = 240; 3821 break; 3822 } 3823 j->rec_mode = 5; 3824 break; 3825 case LINEAR8: 3826 switch (j->baseframe.low) { 3827 case 0xA0: 3828 j->rec_frame_size = 80; 3829 break; 3830 case 0x50: 3831 j->rec_frame_size = 40; 3832 break; 3833 default: 3834 j->rec_frame_size = 120; 3835 break; 3836 } 3837 j->rec_mode = 6; 3838 break; 3839 case WSS: 3840 switch (j->baseframe.low) { 3841 case 0xA0: 3842 j->rec_frame_size = 80; 3843 break; 3844 case 0x50: 3845 j->rec_frame_size = 40; 3846 break; 3847 default: 3848 j->rec_frame_size = 120; 3849 break; 3850 } 3851 j->rec_mode = 7; 3852 break; 3853 default: 3854 kfree(j->read_buffer); 3855 j->rec_frame_size = 0; 3856 j->rec_mode = -1; 3857 j->read_buffer = NULL; 3858 j->read_buffer_size = 0; 3859 retval = 1; 3860 break; 3861 } 3862 return retval; 3863} 3864 3865static int ixj_record_start(IXJ *j) 3866{ 3867 unsigned short cmd = 0x0000; 3868 3869 if (j->read_buffer) { 3870 ixj_record_stop(j); 3871 } 3872 j->flags.recording = 1; 3873 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */ 3874 3875 if(ixjdebug & 0x0002) 3876 printk("IXJ %d Starting Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies); 3877 3878 if (!j->rec_mode) { 3879 switch (j->rec_codec) { 3880 case G723_63: 3881 cmd = 0x5131; 3882 break; 3883 case G723_53: 3884 cmd = 0x5132; 3885 break; 3886 case TS85: 3887 cmd = 0x5130; /* TrueSpeech 8.5 */ 3888 3889 break; 3890 case TS48: 3891 cmd = 0x5133; /* TrueSpeech 4.8 */ 3892 3893 break; 3894 case TS41: 3895 cmd = 0x5134; /* TrueSpeech 4.1 */ 3896 3897 break; 3898 case G728: 3899 cmd = 0x5135; 3900 break; 3901 case G729: 3902 case G729B: 3903 cmd = 0x5136; 3904 break; 3905 default: 3906 return 1; 3907 } 3908 if (ixj_WriteDSPCommand(cmd, j)) 3909 return -1; 3910 } 3911 if (!j->read_buffer) { 3912 if (!j->read_buffer) 3913 j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_ATOMIC); 3914 if (!j->read_buffer) { 3915 printk("Read buffer allocation for ixj board %d failed!\n", j->board); 3916 return -ENOMEM; 3917 } 3918 } 3919 j->read_buffer_size = j->rec_frame_size * 2; 3920 3921 if (ixj_WriteDSPCommand(0x5102, j)) /* Set Poll sync mode */ 3922 3923 return -1; 3924 3925 switch (j->rec_mode) { 3926 case 0: 3927 cmd = 0x1C03; /* Record C1 */ 3928 3929 break; 3930 case 4: 3931 if (j->ver.low == 0x12) { 3932 cmd = 0x1E03; /* Record C1 */ 3933 3934 } else { 3935 cmd = 0x1E01; /* Record C1 */ 3936 3937 } 3938 break; 3939 case 5: 3940 if (j->ver.low == 0x12) { 3941 cmd = 0x1E83; /* Record C1 */ 3942 3943 } else { 3944 cmd = 0x1E81; /* Record C1 */ 3945 3946 } 3947 break; 3948 case 6: 3949 if (j->ver.low == 0x12) { 3950 cmd = 0x1F03; /* Record C1 */ 3951 3952 } else { 3953 cmd = 0x1F01; /* Record C1 */ 3954 3955 } 3956 break; 3957 case 7: 3958 if (j->ver.low == 0x12) { 3959 cmd = 0x1F83; /* Record C1 */ 3960 } else { 3961 cmd = 0x1F81; /* Record C1 */ 3962 } 3963 break; 3964 } 3965 if (ixj_WriteDSPCommand(cmd, j)) 3966 return -1; 3967 3968 if (j->flags.playing) { 3969 ixj_aec_start(j, j->aec_level); 3970 } 3971 return 0; 3972} 3973 3974static void ixj_record_stop(IXJ *j) 3975{ 3976 if (ixjdebug & 0x0002) 3977 printk("IXJ %d Stopping Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies); 3978 3979 kfree(j->read_buffer); 3980 j->read_buffer = NULL; 3981 j->read_buffer_size = 0; 3982 if (j->rec_mode > -1) { 3983 ixj_WriteDSPCommand(0x5120, j); 3984 j->rec_mode = -1; 3985 } 3986 j->flags.recording = 0; 3987} 3988static void ixj_vad(IXJ *j, int arg) 3989{ 3990 if (arg) 3991 ixj_WriteDSPCommand(0x513F, j); 3992 else 3993 ixj_WriteDSPCommand(0x513E, j); 3994} 3995 3996static void set_rec_depth(IXJ *j, int depth) 3997{ 3998 if (depth > 60) 3999 depth = 60; 4000 if (depth < 0) 4001 depth = 0; 4002 ixj_WriteDSPCommand(0x5180 + depth, j); 4003} 4004 4005static void set_dtmf_prescale(IXJ *j, int volume) 4006{ 4007 ixj_WriteDSPCommand(0xCF07, j); 4008 ixj_WriteDSPCommand(volume, j); 4009} 4010 4011static int get_dtmf_prescale(IXJ *j) 4012{ 4013 ixj_WriteDSPCommand(0xCF05, j); 4014 return j->ssr.high << 8 | j->ssr.low; 4015} 4016 4017static void set_rec_volume(IXJ *j, int volume) 4018{ 4019 if(j->aec_level == AEC_AGC) { 4020 if (ixjdebug & 0x0002) 4021 printk(KERN_INFO "IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4x\n", j->board, volume); 4022 ixj_WriteDSPCommand(0xCF96, j); 4023 ixj_WriteDSPCommand(volume, j); 4024 } else { 4025 if (ixjdebug & 0x0002) 4026 printk(KERN_INFO "IXJ: /dev/phone %d Setting Record Volume to 0x%4.4x\n", j->board, volume); 4027 ixj_WriteDSPCommand(0xCF03, j); 4028 ixj_WriteDSPCommand(volume, j); 4029 } 4030} 4031 4032static int set_rec_volume_linear(IXJ *j, int volume) 4033{ 4034 int newvolume, dsprecmax; 4035 4036 if (ixjdebug & 0x0002) 4037 printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4x\n", j->board, volume); 4038 if(volume > 100 || volume < 0) { 4039 return -1; 4040 } 4041 4042 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */ 4043 switch (j->cardtype) { 4044 case QTI_PHONEJACK: 4045 dsprecmax = 0x440; 4046 break; 4047 case QTI_LINEJACK: 4048 dsprecmax = 0x180; 4049 ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */ 4050 ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */ 4051 ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */ 4052 break; 4053 case QTI_PHONEJACK_LITE: 4054 dsprecmax = 0x4C0; 4055 break; 4056 case QTI_PHONEJACK_PCI: 4057 dsprecmax = 0x100; 4058 break; 4059 case QTI_PHONECARD: 4060 dsprecmax = 0x400; 4061 break; 4062 default: 4063 return -1; 4064 } 4065 newvolume = (dsprecmax * volume) / 100; 4066 set_rec_volume(j, newvolume); 4067 return 0; 4068} 4069 4070static int get_rec_volume(IXJ *j) 4071{ 4072 if(j->aec_level == AEC_AGC) { 4073 if (ixjdebug & 0x0002) 4074 printk(KERN_INFO "Getting AGC Threshold\n"); 4075 ixj_WriteDSPCommand(0xCF86, j); 4076 if (ixjdebug & 0x0002) 4077 printk(KERN_INFO "AGC Threshold is 0x%2.2x%2.2x\n", j->ssr.high, j->ssr.low); 4078 return j->ssr.high << 8 | j->ssr.low; 4079 } else { 4080 if (ixjdebug & 0x0002) 4081 printk(KERN_INFO "Getting Record Volume\n"); 4082 ixj_WriteDSPCommand(0xCF01, j); 4083 return j->ssr.high << 8 | j->ssr.low; 4084 } 4085} 4086 4087static int get_rec_volume_linear(IXJ *j) 4088{ 4089 int volume, newvolume, dsprecmax; 4090 4091 switch (j->cardtype) { 4092 case QTI_PHONEJACK: 4093 dsprecmax = 0x440; 4094 break; 4095 case QTI_LINEJACK: 4096 dsprecmax = 0x180; 4097 break; 4098 case QTI_PHONEJACK_LITE: 4099 dsprecmax = 0x4C0; 4100 break; 4101 case QTI_PHONEJACK_PCI: 4102 dsprecmax = 0x100; 4103 break; 4104 case QTI_PHONECARD: 4105 dsprecmax = 0x400; 4106 break; 4107 default: 4108 return -1; 4109 } 4110 volume = get_rec_volume(j); 4111 newvolume = (volume * 100) / dsprecmax; 4112 if(newvolume > 100) 4113 newvolume = 100; 4114 return newvolume; 4115} 4116 4117static int get_rec_level(IXJ *j) 4118{ 4119 int retval; 4120 4121 ixj_WriteDSPCommand(0xCF88, j); 4122 4123 retval = j->ssr.high << 8 | j->ssr.low; 4124 retval = (retval * 256) / 240; 4125 return retval; 4126} 4127 4128static void ixj_aec_start(IXJ *j, int level) 4129{ 4130 j->aec_level = level; 4131 if (ixjdebug & 0x0002) 4132 printk(KERN_INFO "AGC set = 0x%2.2x\n", j->aec_level); 4133 if (!level) { 4134 aec_stop(j); 4135 } else { 4136 if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) { 4137 ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer */ 4138 4139 ixj_WriteDSPCommand(0x0300, j); 4140 } 4141 ixj_WriteDSPCommand(0xB001, j); /* AEC On */ 4142 4143 ixj_WriteDSPCommand(0xE013, j); /* Advanced AEC C1 */ 4144 4145 switch (level) { 4146 case AEC_LOW: 4147 ixj_WriteDSPCommand(0x0000, j); /* Advanced AEC C2 = off */ 4148 4149 ixj_WriteDSPCommand(0xE011, j); 4150 ixj_WriteDSPCommand(0xFFFF, j); 4151 4152 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */ 4153 ixj_WriteDSPCommand(0x0000, j); /* to off */ 4154 4155 break; 4156 4157 case AEC_MED: 4158 ixj_WriteDSPCommand(0x0600, j); /* Advanced AEC C2 = on medium */ 4159 4160 ixj_WriteDSPCommand(0xE011, j); 4161 ixj_WriteDSPCommand(0x0080, j); 4162 4163 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */ 4164 ixj_WriteDSPCommand(0x0000, j); /* to off */ 4165 4166 break; 4167 4168 case AEC_HIGH: 4169 ixj_WriteDSPCommand(0x0C00, j); /* Advanced AEC C2 = on high */ 4170 4171 ixj_WriteDSPCommand(0xE011, j); 4172 ixj_WriteDSPCommand(0x0080, j); 4173 4174 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */ 4175 ixj_WriteDSPCommand(0x0000, j); /* to off */ 4176 4177 break; 4178 4179 case AEC_AGC: 4180 /* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */ 4181 ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */ 4182 4183 ixj_WriteDSPCommand(0xE011, j); 4184 ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */ 4185 4186 ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */ 4187 4188 if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD) 4189 ixj_WriteDSPCommand(0x0224, j); 4190 else 4191 ixj_WriteDSPCommand(0x1224, j); 4192 4193 ixj_WriteDSPCommand(0xE014, j); 4194 ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */ 4195 4196 ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */ 4197 4198 /* Now we can set the AGC initial parameters and turn it on */ 4199 ixj_WriteDSPCommand(0xCF90, j); /* Set AGC Minumum gain */ 4200 ixj_WriteDSPCommand(0x0020, j); /* to 0.125 (-18dB) */ 4201 4202 ixj_WriteDSPCommand(0xCF91, j); /* Set AGC Maximum gain */ 4203 ixj_WriteDSPCommand(0x1000, j); /* to 16 (24dB) */ 4204 4205 ixj_WriteDSPCommand(0xCF92, j); /* Set AGC start gain */ 4206 ixj_WriteDSPCommand(0x0800, j); /* to 8 (+18dB) */ 4207 4208 ixj_WriteDSPCommand(0xCF93, j); /* Set AGC hold time */ 4209 ixj_WriteDSPCommand(0x1F40, j); /* to 2 seconds (units are 250us) */ 4210 4211 ixj_WriteDSPCommand(0xCF94, j); /* Set AGC Attack Time Constant */ 4212 ixj_WriteDSPCommand(0x0005, j); /* to 8ms */ 4213 4214 ixj_WriteDSPCommand(0xCF95, j); /* Set AGC Decay Time Constant */ 4215 ixj_WriteDSPCommand(0x000D, j); /* to 4096ms */ 4216 4217 ixj_WriteDSPCommand(0xCF96, j); /* Set AGC Attack Threshold */ 4218 ixj_WriteDSPCommand(0x1200, j); /* to 25% */ 4219 4220 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */ 4221 ixj_WriteDSPCommand(0x0001, j); /* to on */ 4222 4223 break; 4224 4225 case AEC_AUTO: 4226 ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */ 4227 4228 ixj_WriteDSPCommand(0xE011, j); 4229 ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */ 4230 4231 ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */ 4232 4233 if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD) 4234 ixj_WriteDSPCommand(0x0224, j); 4235 else 4236 ixj_WriteDSPCommand(0x1224, j); 4237 4238 ixj_WriteDSPCommand(0xE014, j); 4239 ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */ 4240 4241 ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */ 4242 4243 break; 4244 } 4245 } 4246} 4247 4248static void aec_stop(IXJ *j) 4249{ 4250 j->aec_level = AEC_OFF; 4251 if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) { 4252 ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer back */ 4253 4254 ixj_WriteDSPCommand(0x0700, j); 4255 } 4256 if (j->play_mode != -1 && j->rec_mode != -1) 4257 { 4258 ixj_WriteDSPCommand(0xB002, j); /* AEC Stop */ 4259 } 4260} 4261 4262static int set_play_codec(IXJ *j, int rate) 4263{ 4264 int retval = 0; 4265 4266 j->play_codec = rate; 4267 4268 switch (rate) { 4269 case G723_63: 4270 if (j->ver.low != 0x12 || ixj_convert_loaded) { 4271 j->play_frame_size = 12; 4272 j->play_mode = 0; 4273 } else { 4274 retval = 1; 4275 } 4276 break; 4277 case G723_53: 4278 if (j->ver.low != 0x12 || ixj_convert_loaded) { 4279 j->play_frame_size = 10; 4280 j->play_mode = 0; 4281 } else { 4282 retval = 1; 4283 } 4284 break; 4285 case TS85: 4286 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) { 4287 j->play_frame_size = 16; 4288 j->play_mode = 0; 4289 } else { 4290 retval = 1; 4291 } 4292 break; 4293 case TS48: 4294 if (j->ver.low != 0x12 || ixj_convert_loaded) { 4295 j->play_frame_size = 9; 4296 j->play_mode = 0; 4297 } else { 4298 retval = 1; 4299 } 4300 break; 4301 case TS41: 4302 if (j->ver.low != 0x12 || ixj_convert_loaded) { 4303 j->play_frame_size = 8; 4304 j->play_mode = 0; 4305 } else { 4306 retval = 1; 4307 } 4308 break; 4309 case G728: 4310 if (j->dsp.low != 0x20) { 4311 j->play_frame_size = 48; 4312 j->play_mode = 0; 4313 } else { 4314 retval = 1; 4315 } 4316 break; 4317 case G729: 4318 if (j->dsp.low != 0x20) { 4319 if (!j->flags.g729_loaded) { 4320 retval = 1; 4321 break; 4322 } 4323 switch (j->baseframe.low) { 4324 case 0xA0: 4325 j->play_frame_size = 10; 4326 break; 4327 case 0x50: 4328 j->play_frame_size = 5; 4329 break; 4330 default: 4331 j->play_frame_size = 15; 4332 break; 4333 } 4334 j->play_mode = 0; 4335 } else { 4336 retval = 1; 4337 } 4338 break; 4339 case G729B: 4340 if (j->dsp.low != 0x20) { 4341 if (!j->flags.g729_loaded) { 4342 retval = 1; 4343 break; 4344 } 4345 switch (j->baseframe.low) { 4346 case 0xA0: 4347 j->play_frame_size = 12; 4348 break; 4349 case 0x50: 4350 j->play_frame_size = 6; 4351 break; 4352 default: 4353 j->play_frame_size = 18; 4354 break; 4355 } 4356 j->play_mode = 0; 4357 } else { 4358 retval = 1; 4359 } 4360 break; 4361 case ULAW: 4362 switch (j->baseframe.low) { 4363 case 0xA0: 4364 j->play_frame_size = 80; 4365 break; 4366 case 0x50: 4367 j->play_frame_size = 40; 4368 break; 4369 default: 4370 j->play_frame_size = 120; 4371 break; 4372 } 4373 j->play_mode = 2; 4374 break; 4375 case ALAW: 4376 switch (j->baseframe.low) { 4377 case 0xA0: 4378 j->play_frame_size = 80; 4379 break; 4380 case 0x50: 4381 j->play_frame_size = 40; 4382 break; 4383 default: 4384 j->play_frame_size = 120; 4385 break; 4386 } 4387 j->play_mode = 2; 4388 break; 4389 case LINEAR16: 4390 switch (j->baseframe.low) { 4391 case 0xA0: 4392 j->play_frame_size = 160; 4393 break; 4394 case 0x50: 4395 j->play_frame_size = 80; 4396 break; 4397 default: 4398 j->play_frame_size = 240; 4399 break; 4400 } 4401 j->play_mode = 6; 4402 break; 4403 case LINEAR8: 4404 switch (j->baseframe.low) { 4405 case 0xA0: 4406 j->play_frame_size = 80; 4407 break; 4408 case 0x50: 4409 j->play_frame_size = 40; 4410 break; 4411 default: 4412 j->play_frame_size = 120; 4413 break; 4414 } 4415 j->play_mode = 4; 4416 break; 4417 case WSS: 4418 switch (j->baseframe.low) { 4419 case 0xA0: 4420 j->play_frame_size = 80; 4421 break; 4422 case 0x50: 4423 j->play_frame_size = 40; 4424 break; 4425 default: 4426 j->play_frame_size = 120; 4427 break; 4428 } 4429 j->play_mode = 5; 4430 break; 4431 default: 4432 kfree(j->write_buffer); 4433 j->play_frame_size = 0; 4434 j->play_mode = -1; 4435 j->write_buffer = NULL; 4436 j->write_buffer_size = 0; 4437 retval = 1; 4438 break; 4439 } 4440 return retval; 4441} 4442 4443static int ixj_play_start(IXJ *j) 4444{ 4445 unsigned short cmd = 0x0000; 4446 4447 if (j->write_buffer) { 4448 ixj_play_stop(j); 4449 } 4450 4451 if(ixjdebug & 0x0002) 4452 printk("IXJ %d Starting Play Codec %d at %ld\n", j->board, j->play_codec, jiffies); 4453 4454 j->flags.playing = 1; 4455 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */ 4456 4457 j->flags.play_first_frame = 1; 4458 j->drybuffer = 0; 4459 4460 if (!j->play_mode) { 4461 switch (j->play_codec) { 4462 case G723_63: 4463 cmd = 0x5231; 4464 break; 4465 case G723_53: 4466 cmd = 0x5232; 4467 break; 4468 case TS85: 4469 cmd = 0x5230; /* TrueSpeech 8.5 */ 4470 4471 break; 4472 case TS48: 4473 cmd = 0x5233; /* TrueSpeech 4.8 */ 4474 4475 break; 4476 case TS41: 4477 cmd = 0x5234; /* TrueSpeech 4.1 */ 4478 4479 break; 4480 case G728: 4481 cmd = 0x5235; 4482 break; 4483 case G729: 4484 case G729B: 4485 cmd = 0x5236; 4486 break; 4487 default: 4488 return 1; 4489 } 4490 if (ixj_WriteDSPCommand(cmd, j)) 4491 return -1; 4492 } 4493 j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC); 4494 if (!j->write_buffer) { 4495 printk("Write buffer allocation for ixj board %d failed!\n", j->board); 4496 return -ENOMEM; 4497 } 4498/* j->write_buffers_empty = 2; */ 4499 j->write_buffers_empty = 1; 4500 j->write_buffer_size = j->play_frame_size * 2; 4501 j->write_buffer_end = j->write_buffer + j->play_frame_size * 2; 4502 j->write_buffer_rp = j->write_buffer_wp = j->write_buffer; 4503 4504 if (ixj_WriteDSPCommand(0x5202, j)) /* Set Poll sync mode */ 4505 4506 return -1; 4507 4508 switch (j->play_mode) { 4509 case 0: 4510 cmd = 0x2C03; 4511 break; 4512 case 2: 4513 if (j->ver.low == 0x12) { 4514 cmd = 0x2C23; 4515 } else { 4516 cmd = 0x2C21; 4517 } 4518 break; 4519 case 4: 4520 if (j->ver.low == 0x12) { 4521 cmd = 0x2C43; 4522 } else { 4523 cmd = 0x2C41; 4524 } 4525 break; 4526 case 5: 4527 if (j->ver.low == 0x12) { 4528 cmd = 0x2C53; 4529 } else { 4530 cmd = 0x2C51; 4531 } 4532 break; 4533 case 6: 4534 if (j->ver.low == 0x12) { 4535 cmd = 0x2C63; 4536 } else { 4537 cmd = 0x2C61; 4538 } 4539 break; 4540 } 4541 if (ixj_WriteDSPCommand(cmd, j)) 4542 return -1; 4543 4544 if (ixj_WriteDSPCommand(0x2000, j)) /* Playback C2 */ 4545 return -1; 4546 4547 if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j)) /* Playback C3 */ 4548 return -1; 4549 4550 if (j->flags.recording) { 4551 ixj_aec_start(j, j->aec_level); 4552 } 4553 4554 return 0; 4555} 4556 4557static void ixj_play_stop(IXJ *j) 4558{ 4559 if (ixjdebug & 0x0002) 4560 printk("IXJ %d Stopping Play Codec %d at %ld\n", j->board, j->play_codec, jiffies); 4561 4562 kfree(j->write_buffer); 4563 j->write_buffer = NULL; 4564 j->write_buffer_size = 0; 4565 if (j->play_mode > -1) { 4566 ixj_WriteDSPCommand(0x5221, j); /* Stop playback and flush buffers. 8022 reference page 9-40 */ 4567 4568 j->play_mode = -1; 4569 } 4570 j->flags.playing = 0; 4571} 4572 4573static inline int get_play_level(IXJ *j) 4574{ 4575 int retval; 4576 4577 ixj_WriteDSPCommand(0xCF8F, j); /* 8022 Reference page 9-38 */ 4578 return j->ssr.high << 8 | j->ssr.low; 4579 retval = j->ssr.high << 8 | j->ssr.low; 4580 retval = (retval * 256) / 240; 4581 return retval; 4582} 4583 4584static unsigned int ixj_poll(struct file *file_p, poll_table * wait) 4585{ 4586 unsigned int mask = 0; 4587 4588 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode)); 4589 4590 poll_wait(file_p, &(j->poll_q), wait); 4591 if (j->read_buffer_ready > 0) 4592 mask |= POLLIN | POLLRDNORM; /* readable */ 4593 if (j->write_buffers_empty > 0) 4594 mask |= POLLOUT | POLLWRNORM; /* writable */ 4595 if (j->ex.bytes) 4596 mask |= POLLPRI; 4597 return mask; 4598} 4599 4600static int ixj_play_tone(IXJ *j, char tone) 4601{ 4602 if (!j->tone_state) { 4603 if(ixjdebug & 0x0002) { 4604 printk("IXJ %d starting tone %d at %ld\n", j->board, tone, jiffies); 4605 } 4606 if (j->dsp.low == 0x20) { 4607 idle(j); 4608 } 4609 j->tone_start_jif = jiffies; 4610 4611 j->tone_state = 1; 4612 } 4613 4614 j->tone_index = tone; 4615 if (ixj_WriteDSPCommand(0x6000 + j->tone_index, j)) 4616 return -1; 4617 4618 return 0; 4619} 4620 4621static int ixj_set_tone_on(unsigned short arg, IXJ *j) 4622{ 4623 j->tone_on_time = arg; 4624 4625 if (ixj_WriteDSPCommand(0x6E04, j)) /* Set Tone On Period */ 4626 4627 return -1; 4628 4629 if (ixj_WriteDSPCommand(arg, j)) 4630 return -1; 4631 4632 return 0; 4633} 4634 4635static int SCI_WaitHighSCI(IXJ *j) 4636{ 4637 int cnt; 4638 4639 j->pld_scrr.byte = inb_p(j->XILINXbase); 4640 if (!j->pld_scrr.bits.sci) { 4641 for (cnt = 0; cnt < 10; cnt++) { 4642 udelay(32); 4643 j->pld_scrr.byte = inb_p(j->XILINXbase); 4644 4645 if ((j->pld_scrr.bits.sci)) 4646 return 1; 4647 } 4648 if (ixjdebug & 0x0001) 4649 printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte); 4650 return 0; 4651 } else 4652 return 1; 4653} 4654 4655static int SCI_WaitLowSCI(IXJ *j) 4656{ 4657 int cnt; 4658 4659 j->pld_scrr.byte = inb_p(j->XILINXbase); 4660 if (j->pld_scrr.bits.sci) { 4661 for (cnt = 0; cnt < 10; cnt++) { 4662 udelay(32); 4663 j->pld_scrr.byte = inb_p(j->XILINXbase); 4664 4665 if (!(j->pld_scrr.bits.sci)) 4666 return 1; 4667 } 4668 if (ixjdebug & 0x0001) 4669 printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte); 4670 return 0; 4671 } else 4672 return 1; 4673} 4674 4675static int SCI_Control(IXJ *j, int control) 4676{ 4677 switch (control) { 4678 case SCI_End: 4679 j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */ 4680 4681 j->pld_scrw.bits.c1 = 0; /* to no selection */ 4682 4683 break; 4684 case SCI_Enable_DAA: 4685 j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */ 4686 4687 j->pld_scrw.bits.c1 = 0; /* to write to DAA */ 4688 4689 break; 4690 case SCI_Enable_Mixer: 4691 j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */ 4692 4693 j->pld_scrw.bits.c1 = 1; /* to write to mixer */ 4694 4695 break; 4696 case SCI_Enable_EEPROM: 4697 j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */ 4698 4699 j->pld_scrw.bits.c1 = 1; /* to write to EEPROM */ 4700 4701 break; 4702 default: 4703 return 0; 4704 break; 4705 } 4706 outb_p(j->pld_scrw.byte, j->XILINXbase); 4707 4708 switch (control) { 4709 case SCI_End: 4710 return 1; 4711 break; 4712 case SCI_Enable_DAA: 4713 case SCI_Enable_Mixer: 4714 case SCI_Enable_EEPROM: 4715 if (!SCI_WaitHighSCI(j)) 4716 return 0; 4717 break; 4718 default: 4719 return 0; 4720 break; 4721 } 4722 return 1; 4723} 4724 4725static int SCI_Prepare(IXJ *j) 4726{ 4727 if (!SCI_Control(j, SCI_End)) 4728 return 0; 4729 4730 if (!SCI_WaitLowSCI(j)) 4731 return 0; 4732 4733 return 1; 4734} 4735 4736static int ixj_get_mixer(long val, IXJ *j) 4737{ 4738 int reg = (val & 0x1F00) >> 8; 4739 return j->mix.vol[reg]; 4740} 4741 4742static int ixj_mixer(long val, IXJ *j) 4743{ 4744 BYTES bytes; 4745 4746 bytes.high = (val & 0x1F00) >> 8; 4747 bytes.low = val & 0x00FF; 4748 4749 /* save mixer value so we can get back later on */ 4750 j->mix.vol[bytes.high] = bytes.low; 4751 4752 outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03); /* Load Mixer Address */ 4753 4754 outb_p(bytes.low, j->XILINXbase + 0x02); /* Load Mixer Data */ 4755 4756 SCI_Control(j, SCI_Enable_Mixer); 4757 4758 SCI_Control(j, SCI_End); 4759 4760 return 0; 4761} 4762 4763static int daa_load(BYTES * p_bytes, IXJ *j) 4764{ 4765 outb_p(p_bytes->high, j->XILINXbase + 0x03); 4766 outb_p(p_bytes->low, j->XILINXbase + 0x02); 4767 if (!SCI_Control(j, SCI_Enable_DAA)) 4768 return 0; 4769 else 4770 return 1; 4771} 4772 4773static int ixj_daa_cr4(IXJ *j, char reg) 4774{ 4775 BYTES bytes; 4776 4777 switch (j->daa_mode) { 4778 case SOP_PU_SLEEP: 4779 bytes.high = 0x14; 4780 break; 4781 case SOP_PU_RINGING: 4782 bytes.high = 0x54; 4783 break; 4784 case SOP_PU_CONVERSATION: 4785 bytes.high = 0x94; 4786 break; 4787 case SOP_PU_PULSEDIALING: 4788 bytes.high = 0xD4; 4789 break; 4790 } 4791 4792 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg; 4793 4794 switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) { 4795 case 0: 4796 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0; 4797 break; 4798 case 1: 4799 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2; 4800 break; 4801 case 2: 4802 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1; 4803 break; 4804 case 3: 4805 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3; 4806 break; 4807 } 4808 4809 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg; 4810 4811 if (!daa_load(&bytes, j)) 4812 return 0; 4813 4814 if (!SCI_Prepare(j)) 4815 return 0; 4816 4817 return 1; 4818} 4819 4820static char daa_int_read(IXJ *j) 4821{ 4822 BYTES bytes; 4823 4824 if (!SCI_Prepare(j)) 4825 return 0; 4826 4827 bytes.high = 0x38; 4828 bytes.low = 0x00; 4829 outb_p(bytes.high, j->XILINXbase + 0x03); 4830 outb_p(bytes.low, j->XILINXbase + 0x02); 4831 4832 if (!SCI_Control(j, SCI_Enable_DAA)) 4833 return 0; 4834 4835 bytes.high = inb_p(j->XILINXbase + 0x03); 4836 bytes.low = inb_p(j->XILINXbase + 0x02); 4837 if (bytes.low != ALISDAA_ID_BYTE) { 4838 if (ixjdebug & 0x0001) 4839 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low); 4840 return 0; 4841 } 4842 if (!SCI_Control(j, SCI_Enable_DAA)) 4843 return 0; 4844 if (!SCI_Control(j, SCI_End)) 4845 return 0; 4846 4847 bytes.high = inb_p(j->XILINXbase + 0x03); 4848 bytes.low = inb_p(j->XILINXbase + 0x02); 4849 4850 j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high; 4851 4852 return 1; 4853} 4854 4855static char daa_CR_read(IXJ *j, int cr) 4856{ 4857 IXJ_WORD wdata; 4858 BYTES bytes; 4859 4860 if (!SCI_Prepare(j)) 4861 return 0; 4862 4863 switch (j->daa_mode) { 4864 case SOP_PU_SLEEP: 4865 bytes.high = 0x30 + cr; 4866 break; 4867 case SOP_PU_RINGING: 4868 bytes.high = 0x70 + cr; 4869 break; 4870 case SOP_PU_CONVERSATION: 4871 bytes.high = 0xB0 + cr; 4872 break; 4873 case SOP_PU_PULSEDIALING: 4874 bytes.high = 0xF0 + cr; 4875 break; 4876 } 4877 4878 bytes.low = 0x00; 4879 4880 outb_p(bytes.high, j->XILINXbase + 0x03); 4881 outb_p(bytes.low, j->XILINXbase + 0x02); 4882 4883 if (!SCI_Control(j, SCI_Enable_DAA)) 4884 return 0; 4885 4886 bytes.high = inb_p(j->XILINXbase + 0x03); 4887 bytes.low = inb_p(j->XILINXbase + 0x02); 4888 if (bytes.low != ALISDAA_ID_BYTE) { 4889 if (ixjdebug & 0x0001) 4890 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low); 4891 return 0; 4892 } 4893 if (!SCI_Control(j, SCI_Enable_DAA)) 4894 return 0; 4895 if (!SCI_Control(j, SCI_End)) 4896 return 0; 4897 4898 wdata.word = inw_p(j->XILINXbase + 0x02); 4899 4900 switch(cr){ 4901 case 5: 4902 j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = wdata.bytes.high; 4903 break; 4904 case 4: 4905 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = wdata.bytes.high; 4906 break; 4907 case 3: 4908 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = wdata.bytes.high; 4909 break; 4910 case 2: 4911 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = wdata.bytes.high; 4912 break; 4913 case 1: 4914 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = wdata.bytes.high; 4915 break; 4916 case 0: 4917 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = wdata.bytes.high; 4918 break; 4919 default: 4920 return 0; 4921 } 4922 return 1; 4923} 4924 4925static int ixj_daa_cid_reset(IXJ *j) 4926{ 4927 int i; 4928 BYTES bytes; 4929 4930 if (ixjdebug & 0x0002) 4931 printk("DAA Clearing CID ram\n"); 4932 4933 if (!SCI_Prepare(j)) 4934 return 0; 4935 4936 bytes.high = 0x58; 4937 bytes.low = 0x00; 4938 outb_p(bytes.high, j->XILINXbase + 0x03); 4939 outb_p(bytes.low, j->XILINXbase + 0x02); 4940 4941 if (!SCI_Control(j, SCI_Enable_DAA)) 4942 return 0; 4943 4944 if (!SCI_WaitHighSCI(j)) 4945 return 0; 4946 4947 for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) { 4948 bytes.high = bytes.low = 0x00; 4949 outb_p(bytes.high, j->XILINXbase + 0x03); 4950 4951 if (i < ALISDAA_CALLERID_SIZE - 1) 4952 outb_p(bytes.low, j->XILINXbase + 0x02); 4953 4954 if (!SCI_Control(j, SCI_Enable_DAA)) 4955 return 0; 4956 4957 if (!SCI_WaitHighSCI(j)) 4958 return 0; 4959 4960 } 4961 4962 if (!SCI_Control(j, SCI_End)) 4963 return 0; 4964 4965 if (ixjdebug & 0x0002) 4966 printk("DAA CID ram cleared\n"); 4967 4968 return 1; 4969} 4970 4971static int ixj_daa_cid_read(IXJ *j) 4972{ 4973 int i; 4974 BYTES bytes; 4975 char CID[ALISDAA_CALLERID_SIZE]; 4976 bool mContinue; 4977 char *pIn, *pOut; 4978 4979 if (!SCI_Prepare(j)) 4980 return 0; 4981 4982 bytes.high = 0x78; 4983 bytes.low = 0x00; 4984 outb_p(bytes.high, j->XILINXbase + 0x03); 4985 outb_p(bytes.low, j->XILINXbase + 0x02); 4986 4987 if (!SCI_Control(j, SCI_Enable_DAA)) 4988 return 0; 4989 4990 if (!SCI_WaitHighSCI(j)) 4991 return 0; 4992 4993 bytes.high = inb_p(j->XILINXbase + 0x03); 4994 bytes.low = inb_p(j->XILINXbase + 0x02); 4995 if (bytes.low != ALISDAA_ID_BYTE) { 4996 if (ixjdebug & 0x0001) 4997 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low); 4998 return 0; 4999 } 5000 for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) { 5001 bytes.high = bytes.low = 0x00; 5002 outb_p(bytes.high, j->XILINXbase + 0x03); 5003 outb_p(bytes.low, j->XILINXbase + 0x02); 5004 5005 if (!SCI_Control(j, SCI_Enable_DAA)) 5006 return 0; 5007 5008 if (!SCI_WaitHighSCI(j)) 5009 return 0; 5010 5011 CID[i + 0] = inb_p(j->XILINXbase + 0x03); 5012 CID[i + 1] = inb_p(j->XILINXbase + 0x02); 5013 } 5014 5015 if (!SCI_Control(j, SCI_End)) 5016 return 0; 5017 5018 pIn = CID; 5019 pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID; 5020 mContinue = true; 5021 while (mContinue) { 5022 if ((pIn[1] & 0x03) == 0x01) { 5023 pOut[0] = pIn[0]; 5024 } 5025 if ((pIn[2] & 0x0c) == 0x04) { 5026 pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2); 5027 } 5028 if ((pIn[3] & 0x30) == 0x10) { 5029 pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4); 5030 } 5031 if ((pIn[4] & 0xc0) == 0x40) { 5032 pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6); 5033 } else { 5034 mContinue = false; 5035 } 5036 pIn += 5, pOut += 4; 5037 } 5038 memset(&j->cid, 0, sizeof(PHONE_CID)); 5039 pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID; 5040 pOut += 4; 5041 strncpy(j->cid.month, pOut, 2); 5042 pOut += 2; 5043 strncpy(j->cid.day, pOut, 2); 5044 pOut += 2; 5045 strncpy(j->cid.hour, pOut, 2); 5046 pOut += 2; 5047 strncpy(j->cid.min, pOut, 2); 5048 pOut += 3; 5049 j->cid.numlen = *pOut; 5050 pOut += 1; 5051 strncpy(j->cid.number, pOut, j->cid.numlen); 5052 pOut += j->cid.numlen + 1; 5053 j->cid.namelen = *pOut; 5054 pOut += 1; 5055 strncpy(j->cid.name, pOut, j->cid.namelen); 5056 5057 ixj_daa_cid_reset(j); 5058 return 1; 5059} 5060 5061static char daa_get_version(IXJ *j) 5062{ 5063 BYTES bytes; 5064 5065 if (!SCI_Prepare(j)) 5066 return 0; 5067 5068 bytes.high = 0x35; 5069 bytes.low = 0x00; 5070 outb_p(bytes.high, j->XILINXbase + 0x03); 5071 outb_p(bytes.low, j->XILINXbase + 0x02); 5072 5073 if (!SCI_Control(j, SCI_Enable_DAA)) 5074 return 0; 5075 5076 bytes.high = inb_p(j->XILINXbase + 0x03); 5077 bytes.low = inb_p(j->XILINXbase + 0x02); 5078 if (bytes.low != ALISDAA_ID_BYTE) { 5079 if (ixjdebug & 0x0001) 5080 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low); 5081 return 0; 5082 } 5083 if (!SCI_Control(j, SCI_Enable_DAA)) 5084 return 0; 5085 5086 if (!SCI_Control(j, SCI_End)) 5087 return 0; 5088 5089 bytes.high = inb_p(j->XILINXbase + 0x03); 5090 bytes.low = inb_p(j->XILINXbase + 0x02); 5091 if (ixjdebug & 0x0002) 5092 printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes.high, bytes.low); 5093 j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high; 5094 return bytes.high; 5095} 5096 5097static int daa_set_mode(IXJ *j, int mode) 5098{ 5099 /* NOTE: 5100 The DAA *MUST* be in the conversation mode if the 5101 PSTN line is to be seized (PSTN line off-hook). 5102 Taking the PSTN line off-hook while the DAA is in 5103 a mode other than conversation mode will cause a 5104 hardware failure of the ALIS-A part. 5105 5106 NOTE: 5107 The DAA can only go to SLEEP, RINGING or PULSEDIALING modes 5108 if the PSTN line is on-hook. Failure to have the PSTN line 5109 in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE 5110 ALIS-A part. 5111 */ 5112 5113 BYTES bytes; 5114 5115 j->flags.pstn_rmr = 0; 5116 5117 if (!SCI_Prepare(j)) 5118 return 0; 5119 5120 switch (mode) { 5121 case SOP_PU_RESET: 5122 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ 5123 5124 outb_p(j->pld_scrw.byte, j->XILINXbase); 5125 j->pld_slicw.bits.rly2 = 0; 5126 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 5127 bytes.high = 0x10; 5128 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg; 5129 daa_load(&bytes, j); 5130 if (!SCI_Prepare(j)) 5131 return 0; 5132 5133 j->daa_mode = SOP_PU_SLEEP; 5134 break; 5135 case SOP_PU_SLEEP: 5136 if(j->daa_mode == SOP_PU_SLEEP) 5137 { 5138 break; 5139 } 5140 if (ixjdebug & 0x0008) 5141 printk(KERN_INFO "phone DAA: SOP_PU_SLEEP at %ld\n", jiffies); 5142/* if(j->daa_mode == SOP_PU_CONVERSATION) */ 5143 { 5144 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ 5145 5146 outb_p(j->pld_scrw.byte, j->XILINXbase); 5147 j->pld_slicw.bits.rly2 = 0; 5148 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 5149 bytes.high = 0x10; 5150 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg; 5151 daa_load(&bytes, j); 5152 if (!SCI_Prepare(j)) 5153 return 0; 5154 } 5155 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ 5156 5157 outb_p(j->pld_scrw.byte, j->XILINXbase); 5158 j->pld_slicw.bits.rly2 = 0; 5159 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 5160 bytes.high = 0x10; 5161 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg; 5162 daa_load(&bytes, j); 5163 if (!SCI_Prepare(j)) 5164 return 0; 5165 5166 j->daa_mode = SOP_PU_SLEEP; 5167 j->flags.pstn_ringing = 0; 5168 j->ex.bits.pstn_ring = 0; 5169 j->pstn_sleeptil = jiffies + (hertz / 4); 5170 wake_up_interruptible(&j->read_q); /* Wake any blocked readers */ 5171 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */ 5172 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */ 5173 break; 5174 case SOP_PU_RINGING: 5175 if (ixjdebug & 0x0008) 5176 printk(KERN_INFO "phone DAA: SOP_PU_RINGING at %ld\n", jiffies); 5177 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ 5178 5179 outb_p(j->pld_scrw.byte, j->XILINXbase); 5180 j->pld_slicw.bits.rly2 = 0; 5181 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 5182 bytes.high = 0x50; 5183 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg; 5184 daa_load(&bytes, j); 5185 if (!SCI_Prepare(j)) 5186 return 0; 5187 j->daa_mode = SOP_PU_RINGING; 5188 break; 5189 case SOP_PU_CONVERSATION: 5190 if (ixjdebug & 0x0008) 5191 printk(KERN_INFO "phone DAA: SOP_PU_CONVERSATION at %ld\n", jiffies); 5192 bytes.high = 0x90; 5193 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg; 5194 daa_load(&bytes, j); 5195 if (!SCI_Prepare(j)) 5196 return 0; 5197 j->pld_slicw.bits.rly2 = 1; 5198 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 5199 j->pld_scrw.bits.daafsyncen = 1; /* Turn on DAA Frame Sync */ 5200 5201 outb_p(j->pld_scrw.byte, j->XILINXbase); 5202 j->daa_mode = SOP_PU_CONVERSATION; 5203 j->flags.pstn_ringing = 0; 5204 j->ex.bits.pstn_ring = 0; 5205 j->pstn_sleeptil = jiffies; 5206 j->pstn_ring_start = j->pstn_ring_stop = j->pstn_ring_int = 0; 5207 break; 5208 case SOP_PU_PULSEDIALING: 5209 if (ixjdebug & 0x0008) 5210 printk(KERN_INFO "phone DAA: SOP_PU_PULSEDIALING at %ld\n", jiffies); 5211 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ 5212 5213 outb_p(j->pld_scrw.byte, j->XILINXbase); 5214 j->pld_slicw.bits.rly2 = 0; 5215 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 5216 bytes.high = 0xD0; 5217 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg; 5218 daa_load(&bytes, j); 5219 if (!SCI_Prepare(j)) 5220 return 0; 5221 j->daa_mode = SOP_PU_PULSEDIALING; 5222 break; 5223 default: 5224 break; 5225 } 5226 return 1; 5227} 5228 5229static int ixj_daa_write(IXJ *j) 5230{ 5231 BYTES bytes; 5232 5233 j->flags.pstncheck = 1; 5234 5235 daa_set_mode(j, SOP_PU_SLEEP); 5236 5237 if (!SCI_Prepare(j)) 5238 return 0; 5239 5240 outb_p(j->pld_scrw.byte, j->XILINXbase); 5241 5242 bytes.high = 0x14; 5243 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg; 5244 if (!daa_load(&bytes, j)) 5245 return 0; 5246 5247 bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg; 5248 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg; 5249 if (!daa_load(&bytes, j)) 5250 return 0; 5251 5252 bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg; 5253 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg; 5254 if (!daa_load(&bytes, j)) 5255 return 0; 5256 5257 if (!SCI_Prepare(j)) 5258 return 0; 5259 5260 bytes.high = 0x1F; 5261 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg; 5262 if (!daa_load(&bytes, j)) 5263 return 0; 5264 5265 bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg; 5266 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg; 5267 if (!daa_load(&bytes, j)) 5268 return 0; 5269 5270 bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg; 5271 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg; 5272 if (!daa_load(&bytes, j)) 5273 return 0; 5274 5275 bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg; 5276 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg; 5277 if (!daa_load(&bytes, j)) 5278 return 0; 5279 5280 bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg; 5281 bytes.low = 0x00; 5282 if (!daa_load(&bytes, j)) 5283 return 0; 5284 5285 if (!SCI_Prepare(j)) 5286 return 0; 5287 5288 bytes.high = 0x00; 5289 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7]; 5290 if (!daa_load(&bytes, j)) 5291 return 0; 5292 5293 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6]; 5294 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5]; 5295 if (!daa_load(&bytes, j)) 5296 return 0; 5297 5298 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4]; 5299 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3]; 5300 if (!daa_load(&bytes, j)) 5301 return 0; 5302 5303 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2]; 5304 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1]; 5305 if (!daa_load(&bytes, j)) 5306 return 0; 5307 5308 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0]; 5309 bytes.low = 0x00; 5310 if (!daa_load(&bytes, j)) 5311 return 0; 5312 5313 if (!SCI_Control(j, SCI_End)) 5314 return 0; 5315 if (!SCI_WaitLowSCI(j)) 5316 return 0; 5317 5318 bytes.high = 0x01; 5319 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7]; 5320 if (!daa_load(&bytes, j)) 5321 return 0; 5322 5323 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6]; 5324 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5]; 5325 if (!daa_load(&bytes, j)) 5326 return 0; 5327 5328 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4]; 5329 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3]; 5330 if (!daa_load(&bytes, j)) 5331 return 0; 5332 5333 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2]; 5334 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1]; 5335 if (!daa_load(&bytes, j)) 5336 return 0; 5337 5338 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0]; 5339 bytes.low = 0x00; 5340 if (!daa_load(&bytes, j)) 5341 return 0; 5342 5343 if (!SCI_Control(j, SCI_End)) 5344 return 0; 5345 if (!SCI_WaitLowSCI(j)) 5346 return 0; 5347 5348 bytes.high = 0x02; 5349 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7]; 5350 if (!daa_load(&bytes, j)) 5351 return 0; 5352 5353 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6]; 5354 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5]; 5355 if (!daa_load(&bytes, j)) 5356 return 0; 5357 5358 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4]; 5359 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3]; 5360 if (!daa_load(&bytes, j)) 5361 return 0; 5362 5363 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2]; 5364 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1]; 5365 if (!daa_load(&bytes, j)) 5366 return 0; 5367 5368 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0]; 5369 bytes.low = 0x00; 5370 if (!daa_load(&bytes, j)) 5371 return 0; 5372 5373 if (!SCI_Control(j, SCI_End)) 5374 return 0; 5375 if (!SCI_WaitLowSCI(j)) 5376 return 0; 5377 5378 bytes.high = 0x03; 5379 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7]; 5380 if (!daa_load(&bytes, j)) 5381 return 0; 5382 5383 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6]; 5384 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5]; 5385 if (!daa_load(&bytes, j)) 5386 return 0; 5387 5388 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4]; 5389 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3]; 5390 if (!daa_load(&bytes, j)) 5391 return 0; 5392 5393 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2]; 5394 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1]; 5395 if (!daa_load(&bytes, j)) 5396 return 0; 5397 5398 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0]; 5399 bytes.low = 0x00; 5400 if (!daa_load(&bytes, j)) 5401 return 0; 5402 5403 if (!SCI_Control(j, SCI_End)) 5404 return 0; 5405 if (!SCI_WaitLowSCI(j)) 5406 return 0; 5407 5408 bytes.high = 0x04; 5409 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7]; 5410 if (!daa_load(&bytes, j)) 5411 return 0; 5412 5413 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6]; 5414 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5]; 5415 if (!daa_load(&bytes, j)) 5416 return 0; 5417 5418 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4]; 5419 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3]; 5420 if (!daa_load(&bytes, j)) 5421 return 0; 5422 5423 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2]; 5424 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1]; 5425 if (!daa_load(&bytes, j)) 5426 return 0; 5427 5428 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0]; 5429 bytes.low = 0x00; 5430 if (!daa_load(&bytes, j)) 5431 return 0; 5432 5433 if (!SCI_Control(j, SCI_End)) 5434 return 0; 5435 if (!SCI_WaitLowSCI(j)) 5436 return 0; 5437 5438 bytes.high = 0x05; 5439 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7]; 5440 if (!daa_load(&bytes, j)) 5441 return 0; 5442 5443 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6]; 5444 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5]; 5445 if (!daa_load(&bytes, j)) 5446 return 0; 5447 5448 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4]; 5449 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3]; 5450 if (!daa_load(&bytes, j)) 5451 return 0; 5452 5453 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2]; 5454 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1]; 5455 if (!daa_load(&bytes, j)) 5456 return 0; 5457 5458 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0]; 5459 bytes.low = 0x00; 5460 if (!daa_load(&bytes, j)) 5461 return 0; 5462 5463 if (!SCI_Control(j, SCI_End)) 5464 return 0; 5465 if (!SCI_WaitLowSCI(j)) 5466 return 0; 5467 5468 bytes.high = 0x06; 5469 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7]; 5470 if (!daa_load(&bytes, j)) 5471 return 0; 5472 5473 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6]; 5474 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5]; 5475 if (!daa_load(&bytes, j)) 5476 return 0; 5477 5478 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4]; 5479 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3]; 5480 if (!daa_load(&bytes, j)) 5481 return 0; 5482 5483 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2]; 5484 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1]; 5485 if (!daa_load(&bytes, j)) 5486 return 0; 5487 5488 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0]; 5489 bytes.low = 0x00; 5490 if (!daa_load(&bytes, j)) 5491 return 0; 5492 5493 if (!SCI_Control(j, SCI_End)) 5494 return 0; 5495 if (!SCI_WaitLowSCI(j)) 5496 return 0; 5497 5498 bytes.high = 0x07; 5499 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7]; 5500 if (!daa_load(&bytes, j)) 5501 return 0; 5502 5503 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6]; 5504 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5]; 5505 if (!daa_load(&bytes, j)) 5506 return 0; 5507 5508 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4]; 5509 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3]; 5510 if (!daa_load(&bytes, j)) 5511 return 0; 5512 5513 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2]; 5514 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1]; 5515 if (!daa_load(&bytes, j)) 5516 return 0; 5517 5518 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0]; 5519 bytes.low = 0x00; 5520 if (!daa_load(&bytes, j)) 5521 return 0; 5522 5523 if (!SCI_Control(j, SCI_End)) 5524 return 0; 5525 if (!SCI_WaitLowSCI(j)) 5526 return 0; 5527 5528 bytes.high = 0x08; 5529 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7]; 5530 if (!daa_load(&bytes, j)) 5531 return 0; 5532 5533 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6]; 5534 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5]; 5535 if (!daa_load(&bytes, j)) 5536 return 0; 5537 5538 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4]; 5539 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3]; 5540 if (!daa_load(&bytes, j)) 5541 return 0; 5542 5543 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2]; 5544 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1]; 5545 if (!daa_load(&bytes, j)) 5546 return 0; 5547 5548 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0]; 5549 bytes.low = 0x00; 5550 if (!daa_load(&bytes, j)) 5551 return 0; 5552 5553 if (!SCI_Control(j, SCI_End)) 5554 return 0; 5555 if (!SCI_WaitLowSCI(j)) 5556 return 0; 5557 5558 bytes.high = 0x09; 5559 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3]; 5560 if (!daa_load(&bytes, j)) 5561 return 0; 5562 5563 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2]; 5564 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1]; 5565 if (!daa_load(&bytes, j)) 5566 return 0; 5567 5568 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0]; 5569 bytes.low = 0x00; 5570 if (!daa_load(&bytes, j)) 5571 return 0; 5572 5573 if (!SCI_Control(j, SCI_End)) 5574 return 0; 5575 if (!SCI_WaitLowSCI(j)) 5576 return 0; 5577 5578 bytes.high = 0x0A; 5579 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3]; 5580 if (!daa_load(&bytes, j)) 5581 return 0; 5582 5583 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2]; 5584 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1]; 5585 if (!daa_load(&bytes, j)) 5586 return 0; 5587 5588 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0]; 5589 bytes.low = 0x00; 5590 if (!daa_load(&bytes, j)) 5591 return 0; 5592 5593 if (!SCI_Control(j, SCI_End)) 5594 return 0; 5595 if (!SCI_WaitLowSCI(j)) 5596 return 0; 5597 5598 bytes.high = 0x0B; 5599 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3]; 5600 if (!daa_load(&bytes, j)) 5601 return 0; 5602 5603 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2]; 5604 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1]; 5605 if (!daa_load(&bytes, j)) 5606 return 0; 5607 5608 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0]; 5609 bytes.low = 0x00; 5610 if (!daa_load(&bytes, j)) 5611 return 0; 5612 5613 if (!SCI_Control(j, SCI_End)) 5614 return 0; 5615 if (!SCI_WaitLowSCI(j)) 5616 return 0; 5617 5618 bytes.high = 0x0C; 5619 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3]; 5620 if (!daa_load(&bytes, j)) 5621 return 0; 5622 5623 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2]; 5624 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1]; 5625 if (!daa_load(&bytes, j)) 5626 return 0; 5627 5628 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0]; 5629 bytes.low = 0x00; 5630 if (!daa_load(&bytes, j)) 5631 return 0; 5632 5633 if (!SCI_Control(j, SCI_End)) 5634 return 0; 5635 if (!SCI_WaitLowSCI(j)) 5636 return 0; 5637 5638 bytes.high = 0x0D; 5639 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3]; 5640 if (!daa_load(&bytes, j)) 5641 return 0; 5642 5643 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2]; 5644 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1]; 5645 if (!daa_load(&bytes, j)) 5646 return 0; 5647 5648 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0]; 5649 bytes.low = 0x00; 5650 if (!daa_load(&bytes, j)) 5651 return 0; 5652 5653 if (!SCI_Control(j, SCI_End)) 5654 return 0; 5655 if (!SCI_WaitLowSCI(j)) 5656 return 0; 5657 5658 bytes.high = 0x0E; 5659 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7]; 5660 if (!daa_load(&bytes, j)) 5661 return 0; 5662 5663 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6]; 5664 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5]; 5665 if (!daa_load(&bytes, j)) 5666 return 0; 5667 5668 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4]; 5669 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3]; 5670 if (!daa_load(&bytes, j)) 5671 return 0; 5672 5673 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2]; 5674 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1]; 5675 if (!daa_load(&bytes, j)) 5676 return 0; 5677 5678 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0]; 5679 bytes.low = 0x00; 5680 if (!daa_load(&bytes, j)) 5681 return 0; 5682 5683 if (!SCI_Control(j, SCI_End)) 5684 return 0; 5685 if (!SCI_WaitLowSCI(j)) 5686 return 0; 5687 5688 bytes.high = 0x0F; 5689 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7]; 5690 if (!daa_load(&bytes, j)) 5691 return 0; 5692 5693 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6]; 5694 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5]; 5695 if (!daa_load(&bytes, j)) 5696 return 0; 5697 5698 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4]; 5699 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3]; 5700 if (!daa_load(&bytes, j)) 5701 return 0; 5702 5703 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2]; 5704 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1]; 5705 if (!daa_load(&bytes, j)) 5706 return 0; 5707 5708 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0]; 5709 bytes.low = 0x00; 5710 if (!daa_load(&bytes, j)) 5711 return 0; 5712 5713 udelay(32); 5714 j->pld_scrr.byte = inb_p(j->XILINXbase); 5715 if (!SCI_Control(j, SCI_End)) 5716 return 0; 5717 5718 outb_p(j->pld_scrw.byte, j->XILINXbase); 5719 5720 if (ixjdebug & 0x0002) 5721 printk("DAA Coefficients Loaded\n"); 5722 5723 j->flags.pstncheck = 0; 5724 return 1; 5725} 5726 5727static int ixj_set_tone_off(unsigned short arg, IXJ *j) 5728{ 5729 j->tone_off_time = arg; 5730 if (ixj_WriteDSPCommand(0x6E05, j)) /* Set Tone Off Period */ 5731 5732 return -1; 5733 if (ixj_WriteDSPCommand(arg, j)) 5734 return -1; 5735 return 0; 5736} 5737 5738static int ixj_get_tone_on(IXJ *j) 5739{ 5740 if (ixj_WriteDSPCommand(0x6E06, j)) /* Get Tone On Period */ 5741 5742 return -1; 5743 return 0; 5744} 5745 5746static int ixj_get_tone_off(IXJ *j) 5747{ 5748 if (ixj_WriteDSPCommand(0x6E07, j)) /* Get Tone Off Period */ 5749 5750 return -1; 5751 return 0; 5752} 5753 5754static void ixj_busytone(IXJ *j) 5755{ 5756 j->flags.ringback = 0; 5757 j->flags.dialtone = 0; 5758 j->flags.busytone = 1; 5759 ixj_set_tone_on(0x07D0, j); 5760 ixj_set_tone_off(0x07D0, j); 5761 ixj_play_tone(j, 27); 5762} 5763 5764static void ixj_dialtone(IXJ *j) 5765{ 5766 j->flags.ringback = 0; 5767 j->flags.dialtone = 1; 5768 j->flags.busytone = 0; 5769 if (j->dsp.low == 0x20) { 5770 return; 5771 } else { 5772 ixj_set_tone_on(0xFFFF, j); 5773 ixj_set_tone_off(0x0000, j); 5774 ixj_play_tone(j, 25); 5775 } 5776} 5777 5778static void ixj_cpt_stop(IXJ *j) 5779{ 5780 if(j->tone_state || j->tone_cadence_state) 5781 { 5782 j->flags.dialtone = 0; 5783 j->flags.busytone = 0; 5784 j->flags.ringback = 0; 5785 ixj_set_tone_on(0x0001, j); 5786 ixj_set_tone_off(0x0000, j); 5787 ixj_play_tone(j, 0); 5788 j->tone_state = j->tone_cadence_state = 0; 5789 if (j->cadence_t) { 5790 kfree(j->cadence_t->ce); 5791 kfree(j->cadence_t); 5792 j->cadence_t = NULL; 5793 } 5794 } 5795 if (j->play_mode == -1 && j->rec_mode == -1) 5796 idle(j); 5797 if (j->play_mode != -1 && j->dsp.low == 0x20) 5798 ixj_play_start(j); 5799 if (j->rec_mode != -1 && j->dsp.low == 0x20) 5800 ixj_record_start(j); 5801} 5802 5803static void ixj_ringback(IXJ *j) 5804{ 5805 j->flags.busytone = 0; 5806 j->flags.dialtone = 0; 5807 j->flags.ringback = 1; 5808 ixj_set_tone_on(0x0FA0, j); 5809 ixj_set_tone_off(0x2EE0, j); 5810 ixj_play_tone(j, 26); 5811} 5812 5813static void ixj_testram(IXJ *j) 5814{ 5815 ixj_WriteDSPCommand(0x3001, j); /* Test External SRAM */ 5816} 5817 5818static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp) 5819{ 5820 ixj_cadence *lcp; 5821 IXJ_CADENCE_ELEMENT __user *cep; 5822 IXJ_CADENCE_ELEMENT *lcep; 5823 IXJ_TONE ti; 5824 int err; 5825 5826 lcp = kmalloc(sizeof(ixj_cadence), GFP_KERNEL); 5827 if (lcp == NULL) 5828 return -ENOMEM; 5829 5830 err = -EFAULT; 5831 if (copy_from_user(&lcp->elements_used, 5832 &cp->elements_used, sizeof(int))) 5833 goto out; 5834 if (copy_from_user(&lcp->termination, 5835 &cp->termination, sizeof(IXJ_CADENCE_TERM))) 5836 goto out; 5837 if (get_user(cep, &cp->ce)) 5838 goto out; 5839 5840 err = -EINVAL; 5841 if ((unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE_ELEMENT)) 5842 goto out; 5843 5844 err = -ENOMEM; 5845 lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL); 5846 if (!lcep) 5847 goto out; 5848 5849 err = -EFAULT; 5850 if (copy_from_user(lcep, cep, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used)) 5851 goto out1; 5852 5853 if (j->cadence_t) { 5854 kfree(j->cadence_t->ce); 5855 kfree(j->cadence_t); 5856 } 5857 lcp->ce = (void *) lcep; 5858 j->cadence_t = lcp; 5859 j->tone_cadence_state = 0; 5860 ixj_set_tone_on(lcp->ce[0].tone_on_time, j); 5861 ixj_set_tone_off(lcp->ce[0].tone_off_time, j); 5862 if (j->cadence_t->ce[j->tone_cadence_state].freq0) { 5863 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index; 5864 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0; 5865 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0; 5866 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1; 5867 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1; 5868 ixj_init_tone(j, &ti); 5869 } 5870 ixj_play_tone(j, lcp->ce[0].index); 5871 return 1; 5872out1: 5873 kfree(lcep); 5874out: 5875 kfree(lcp); 5876 return err; 5877} 5878 5879static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp) 5880{ 5881 IXJ_FILTER_CADENCE *lcp; 5882 lcp = kmalloc(sizeof(IXJ_FILTER_CADENCE), GFP_KERNEL); 5883 if (lcp == NULL) { 5884 if(ixjdebug & 0x0001) { 5885 printk(KERN_INFO "Could not allocate memory for cadence\n"); 5886 } 5887 return -ENOMEM; 5888 } 5889 if (copy_from_user(lcp, cp, sizeof(IXJ_FILTER_CADENCE))) { 5890 if(ixjdebug & 0x0001) { 5891 printk(KERN_INFO "Could not copy cadence to kernel\n"); 5892 } 5893 kfree(lcp); 5894 return -EFAULT; 5895 } 5896 if (lcp->filter > 5) { 5897 if(ixjdebug & 0x0001) { 5898 printk(KERN_INFO "Cadence out of range\n"); 5899 } 5900 kfree(lcp); 5901 return -1; 5902 } 5903 j->cadence_f[lcp->filter].state = 0; 5904 j->cadence_f[lcp->filter].enable = lcp->enable; 5905 j->filter_en[lcp->filter] = j->cadence_f[lcp->filter].en_filter = lcp->en_filter; 5906 j->cadence_f[lcp->filter].on1 = lcp->on1; 5907 j->cadence_f[lcp->filter].on1min = 0; 5908 j->cadence_f[lcp->filter].on1max = 0; 5909 j->cadence_f[lcp->filter].off1 = lcp->off1; 5910 j->cadence_f[lcp->filter].off1min = 0; 5911 j->cadence_f[lcp->filter].off1max = 0; 5912 j->cadence_f[lcp->filter].on2 = lcp->on2; 5913 j->cadence_f[lcp->filter].on2min = 0; 5914 j->cadence_f[lcp->filter].on2max = 0; 5915 j->cadence_f[lcp->filter].off2 = lcp->off2; 5916 j->cadence_f[lcp->filter].off2min = 0; 5917 j->cadence_f[lcp->filter].off2max = 0; 5918 j->cadence_f[lcp->filter].on3 = lcp->on3; 5919 j->cadence_f[lcp->filter].on3min = 0; 5920 j->cadence_f[lcp->filter].on3max = 0; 5921 j->cadence_f[lcp->filter].off3 = lcp->off3; 5922 j->cadence_f[lcp->filter].off3min = 0; 5923 j->cadence_f[lcp->filter].off3max = 0; 5924 if(ixjdebug & 0x0002) { 5925 printk(KERN_INFO "Cadence %d loaded\n", lcp->filter); 5926 } 5927 kfree(lcp); 5928 return 0; 5929} 5930 5931static void add_caps(IXJ *j) 5932{ 5933 j->caps = 0; 5934 j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET; 5935 strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)"); 5936 j->caplist[j->caps].captype = vendor; 5937 j->caplist[j->caps].handle = j->caps++; 5938 j->caplist[j->caps].captype = device; 5939 switch (j->cardtype) { 5940 case QTI_PHONEJACK: 5941 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK"); 5942 break; 5943 case QTI_LINEJACK: 5944 strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK"); 5945 break; 5946 case QTI_PHONEJACK_LITE: 5947 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite"); 5948 break; 5949 case QTI_PHONEJACK_PCI: 5950 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI"); 5951 break; 5952 case QTI_PHONECARD: 5953 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneCARD"); 5954 break; 5955 } 5956 j->caplist[j->caps].cap = j->cardtype; 5957 j->caplist[j->caps].handle = j->caps++; 5958 strcpy(j->caplist[j->caps].desc, "POTS"); 5959 j->caplist[j->caps].captype = port; 5960 j->caplist[j->caps].cap = pots; 5961 j->caplist[j->caps].handle = j->caps++; 5962 5963 /* add devices that can do speaker/mic */ 5964 switch (j->cardtype) { 5965 case QTI_PHONEJACK: 5966 case QTI_LINEJACK: 5967 case QTI_PHONEJACK_PCI: 5968 case QTI_PHONECARD: 5969 strcpy(j->caplist[j->caps].desc, "SPEAKER"); 5970 j->caplist[j->caps].captype = port; 5971 j->caplist[j->caps].cap = speaker; 5972 j->caplist[j->caps].handle = j->caps++; 5973 default: 5974 break; 5975 } 5976 5977 /* add devices that can do handset */ 5978 switch (j->cardtype) { 5979 case QTI_PHONEJACK: 5980 strcpy(j->caplist[j->caps].desc, "HANDSET"); 5981 j->caplist[j->caps].captype = port; 5982 j->caplist[j->caps].cap = handset; 5983 j->caplist[j->caps].handle = j->caps++; 5984 break; 5985 default: 5986 break; 5987 } 5988 5989 /* add devices that can do PSTN */ 5990 switch (j->cardtype) { 5991 case QTI_LINEJACK: 5992 strcpy(j->caplist[j->caps].desc, "PSTN"); 5993 j->caplist[j->caps].captype = port; 5994 j->caplist[j->caps].cap = pstn; 5995 j->caplist[j->caps].handle = j->caps++; 5996 break; 5997 default: 5998 break; 5999 } 6000 6001 /* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */ 6002 strcpy(j->caplist[j->caps].desc, "ULAW"); 6003 j->caplist[j->caps].captype = codec; 6004 j->caplist[j->caps].cap = ULAW; 6005 j->caplist[j->caps].handle = j->caps++; 6006 6007 strcpy(j->caplist[j->caps].desc, "LINEAR 16 bit"); 6008 j->caplist[j->caps].captype = codec; 6009 j->caplist[j->caps].cap = LINEAR16; 6010 j->caplist[j->caps].handle = j->caps++; 6011 6012 strcpy(j->caplist[j->caps].desc, "LINEAR 8 bit"); 6013 j->caplist[j->caps].captype = codec; 6014 j->caplist[j->caps].cap = LINEAR8; 6015 j->caplist[j->caps].handle = j->caps++; 6016 6017 strcpy(j->caplist[j->caps].desc, "Windows Sound System"); 6018 j->caplist[j->caps].captype = codec; 6019 j->caplist[j->caps].cap = WSS; 6020 j->caplist[j->caps].handle = j->caps++; 6021 6022 /* software ALAW codec, made from ULAW */ 6023 strcpy(j->caplist[j->caps].desc, "ALAW"); 6024 j->caplist[j->caps].captype = codec; 6025 j->caplist[j->caps].cap = ALAW; 6026 j->caplist[j->caps].handle = j->caps++; 6027 6028 /* version 12 of the 8020 does the following codecs in a broken way */ 6029 if (j->dsp.low != 0x20 || j->ver.low != 0x12) { 6030 strcpy(j->caplist[j->caps].desc, "G.723.1 6.3kbps"); 6031 j->caplist[j->caps].captype = codec; 6032 j->caplist[j->caps].cap = G723_63; 6033 j->caplist[j->caps].handle = j->caps++; 6034 6035 strcpy(j->caplist[j->caps].desc, "G.723.1 5.3kbps"); 6036 j->caplist[j->caps].captype = codec; 6037 j->caplist[j->caps].cap = G723_53; 6038 j->caplist[j->caps].handle = j->caps++; 6039 6040 strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.8kbps"); 6041 j->caplist[j->caps].captype = codec; 6042 j->caplist[j->caps].cap = TS48; 6043 j->caplist[j->caps].handle = j->caps++; 6044 6045 strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.1kbps"); 6046 j->caplist[j->caps].captype = codec; 6047 j->caplist[j->caps].cap = TS41; 6048 j->caplist[j->caps].handle = j->caps++; 6049 } 6050 6051 /* 8020 chips can do TS8.5 native, and 8021/8022 can load it */ 6052 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) { 6053 strcpy(j->caplist[j->caps].desc, "TrueSpeech 8.5kbps"); 6054 j->caplist[j->caps].captype = codec; 6055 j->caplist[j->caps].cap = TS85; 6056 j->caplist[j->caps].handle = j->caps++; 6057 } 6058 6059 /* 8021 chips can do G728 */ 6060 if (j->dsp.low == 0x21) { 6061 strcpy(j->caplist[j->caps].desc, "G.728 16kbps"); 6062 j->caplist[j->caps].captype = codec; 6063 j->caplist[j->caps].cap = G728; 6064 j->caplist[j->caps].handle = j->caps++; 6065 } 6066 6067 /* 8021/8022 chips can do G729 if loaded */ 6068 if (j->dsp.low != 0x20 && j->flags.g729_loaded) { 6069 strcpy(j->caplist[j->caps].desc, "G.729A 8kbps"); 6070 j->caplist[j->caps].captype = codec; 6071 j->caplist[j->caps].cap = G729; 6072 j->caplist[j->caps].handle = j->caps++; 6073 } 6074 if (j->dsp.low != 0x20 && j->flags.g729_loaded) { 6075 strcpy(j->caplist[j->caps].desc, "G.729B 8kbps"); 6076 j->caplist[j->caps].captype = codec; 6077 j->caplist[j->caps].cap = G729B; 6078 j->caplist[j->caps].handle = j->caps++; 6079 } 6080} 6081 6082static int capabilities_check(IXJ *j, struct phone_capability *pcreq) 6083{ 6084 int cnt; 6085 int retval = 0; 6086 for (cnt = 0; cnt < j->caps; cnt++) { 6087 if (pcreq->captype == j->caplist[cnt].captype 6088 && pcreq->cap == j->caplist[cnt].cap) { 6089 retval = 1; 6090 break; 6091 } 6092 } 6093 return retval; 6094} 6095 6096static int ixj_ioctl(struct inode *inode, struct file *file_p, unsigned int cmd, unsigned long arg) 6097{ 6098 IXJ_TONE ti; 6099 IXJ_FILTER jf; 6100 IXJ_FILTER_RAW jfr; 6101 void __user *argp = (void __user *)arg; 6102 6103 unsigned int raise, mant; 6104 unsigned int minor = iminor(inode); 6105 int board = NUM(inode); 6106 6107 IXJ *j = get_ixj(NUM(inode)); 6108 6109 int retval = 0; 6110 6111 /* 6112 * Set up locks to ensure that only one process is talking to the DSP at a time. 6113 * This is necessary to keep the DSP from locking up. 6114 */ 6115 while(test_and_set_bit(board, (void *)&j->busyflags) != 0) 6116 schedule_timeout_interruptible(1); 6117 if (ixjdebug & 0x0040) 6118 printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg); 6119 if (minor >= IXJMAX) { 6120 clear_bit(board, &j->busyflags); 6121 return -ENODEV; 6122 } 6123 /* 6124 * Check ioctls only root can use. 6125 */ 6126 if (!capable(CAP_SYS_ADMIN)) { 6127 switch (cmd) { 6128 case IXJCTL_TESTRAM: 6129 case IXJCTL_HZ: 6130 retval = -EPERM; 6131 } 6132 } 6133 switch (cmd) { 6134 case IXJCTL_TESTRAM: 6135 ixj_testram(j); 6136 retval = (j->ssr.high << 8) + j->ssr.low; 6137 break; 6138 case IXJCTL_CARDTYPE: 6139 retval = j->cardtype; 6140 break; 6141 case IXJCTL_SERIAL: 6142 retval = j->serial; 6143 break; 6144 case IXJCTL_VERSION: 6145 { 6146 char arg_str[100]; 6147 snprintf(arg_str, sizeof(arg_str), 6148 "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, 6149 IXJ_VER_MINOR, IXJ_BLD_VER); 6150 if (copy_to_user(argp, arg_str, strlen(arg_str))) 6151 retval = -EFAULT; 6152 } 6153 break; 6154 case PHONE_RING_CADENCE: 6155 j->ring_cadence = arg; 6156 break; 6157 case IXJCTL_CIDCW: 6158 if(arg) { 6159 if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) { 6160 retval = -EFAULT; 6161 break; 6162 } 6163 } else { 6164 memset(&j->cid_send, 0, sizeof(PHONE_CID)); 6165 } 6166 ixj_write_cidcw(j); 6167 break; 6168 /* Binary compatbility */ 6169 case OLD_PHONE_RING_START: 6170 arg = 0; 6171 /* Fall through */ 6172 case PHONE_RING_START: 6173 if(arg) { 6174 if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) { 6175 retval = -EFAULT; 6176 break; 6177 } 6178 ixj_write_cid(j); 6179 } else { 6180 memset(&j->cid_send, 0, sizeof(PHONE_CID)); 6181 } 6182 ixj_ring_start(j); 6183 break; 6184 case PHONE_RING_STOP: 6185 j->flags.cringing = 0; 6186 if(j->cadence_f[5].enable) { 6187 j->cadence_f[5].state = 0; 6188 } 6189 ixj_ring_off(j); 6190 break; 6191 case PHONE_RING: 6192 retval = ixj_ring(j); 6193 break; 6194 case PHONE_EXCEPTION: 6195 retval = j->ex.bytes; 6196 if(j->ex.bits.flash) { 6197 j->flash_end = 0; 6198 j->ex.bits.flash = 0; 6199 } 6200 j->ex.bits.pstn_ring = 0; 6201 j->ex.bits.caller_id = 0; 6202 j->ex.bits.pstn_wink = 0; 6203 j->ex.bits.f0 = 0; 6204 j->ex.bits.f1 = 0; 6205 j->ex.bits.f2 = 0; 6206 j->ex.bits.f3 = 0; 6207 j->ex.bits.fc0 = 0; 6208 j->ex.bits.fc1 = 0; 6209 j->ex.bits.fc2 = 0; 6210 j->ex.bits.fc3 = 0; 6211 j->ex.bits.reserved = 0; 6212 break; 6213 case PHONE_HOOKSTATE: 6214 j->ex.bits.hookstate = 0; 6215 retval = j->hookstate; //j->r_hook; 6216 break; 6217 case IXJCTL_SET_LED: 6218 LED_SetState(arg, j); 6219 break; 6220 case PHONE_FRAME: 6221 retval = set_base_frame(j, arg); 6222 break; 6223 case PHONE_REC_CODEC: 6224 retval = set_rec_codec(j, arg); 6225 break; 6226 case PHONE_VAD: 6227 ixj_vad(j, arg); 6228 break; 6229 case PHONE_REC_START: 6230 ixj_record_start(j); 6231 break; 6232 case PHONE_REC_STOP: 6233 ixj_record_stop(j); 6234 break; 6235 case PHONE_REC_DEPTH: 6236 set_rec_depth(j, arg); 6237 break; 6238 case PHONE_REC_VOLUME: 6239 if(arg == -1) { 6240 retval = get_rec_volume(j); 6241 } 6242 else { 6243 set_rec_volume(j, arg); 6244 retval = arg; 6245 } 6246 break; 6247 case PHONE_REC_VOLUME_LINEAR: 6248 if(arg == -1) { 6249 retval = get_rec_volume_linear(j); 6250 } 6251 else { 6252 set_rec_volume_linear(j, arg); 6253 retval = arg; 6254 } 6255 break; 6256 case IXJCTL_DTMF_PRESCALE: 6257 if(arg == -1) { 6258 retval = get_dtmf_prescale(j); 6259 } 6260 else { 6261 set_dtmf_prescale(j, arg); 6262 retval = arg; 6263 } 6264 break; 6265 case PHONE_REC_LEVEL: 6266 retval = get_rec_level(j); 6267 break; 6268 case IXJCTL_SC_RXG: 6269 retval = ixj_siadc(j, arg); 6270 break; 6271 case IXJCTL_SC_TXG: 6272 retval = ixj_sidac(j, arg); 6273 break; 6274 case IXJCTL_AEC_START: 6275 ixj_aec_start(j, arg); 6276 break; 6277 case IXJCTL_AEC_STOP: 6278 aec_stop(j); 6279 break; 6280 case IXJCTL_AEC_GET_LEVEL: 6281 retval = j->aec_level; 6282 break; 6283 case PHONE_PLAY_CODEC: 6284 retval = set_play_codec(j, arg); 6285 break; 6286 case PHONE_PLAY_START: 6287 retval = ixj_play_start(j); 6288 break; 6289 case PHONE_PLAY_STOP: 6290 ixj_play_stop(j); 6291 break; 6292 case PHONE_PLAY_DEPTH: 6293 set_play_depth(j, arg); 6294 break; 6295 case PHONE_PLAY_VOLUME: 6296 if(arg == -1) { 6297 retval = get_play_volume(j); 6298 } 6299 else { 6300 set_play_volume(j, arg); 6301 retval = arg; 6302 } 6303 break; 6304 case PHONE_PLAY_VOLUME_LINEAR: 6305 if(arg == -1) { 6306 retval = get_play_volume_linear(j); 6307 } 6308 else { 6309 set_play_volume_linear(j, arg); 6310 retval = arg; 6311 } 6312 break; 6313 case PHONE_PLAY_LEVEL: 6314 retval = get_play_level(j); 6315 break; 6316 case IXJCTL_DSP_TYPE: 6317 retval = (j->dsp.high << 8) + j->dsp.low; 6318 break; 6319 case IXJCTL_DSP_VERSION: 6320 retval = (j->ver.high << 8) + j->ver.low; 6321 break; 6322 case IXJCTL_HZ: 6323 hertz = arg; 6324 break; 6325 case IXJCTL_RATE: 6326 if (arg > hertz) 6327 retval = -1; 6328 else 6329 samplerate = arg; 6330 break; 6331 case IXJCTL_DRYBUFFER_READ: 6332 put_user(j->drybuffer, (unsigned long __user *) argp); 6333 break; 6334 case IXJCTL_DRYBUFFER_CLEAR: 6335 j->drybuffer = 0; 6336 break; 6337 case IXJCTL_FRAMES_READ: 6338 put_user(j->framesread, (unsigned long __user *) argp); 6339 break; 6340 case IXJCTL_FRAMES_WRITTEN: 6341 put_user(j->frameswritten, (unsigned long __user *) argp); 6342 break; 6343 case IXJCTL_READ_WAIT: 6344 put_user(j->read_wait, (unsigned long __user *) argp); 6345 break; 6346 case IXJCTL_WRITE_WAIT: 6347 put_user(j->write_wait, (unsigned long __user *) argp); 6348 break; 6349 case PHONE_MAXRINGS: 6350 j->maxrings = arg; 6351 break; 6352 case PHONE_SET_TONE_ON_TIME: 6353 ixj_set_tone_on(arg, j); 6354 break; 6355 case PHONE_SET_TONE_OFF_TIME: 6356 ixj_set_tone_off(arg, j); 6357 break; 6358 case PHONE_GET_TONE_ON_TIME: 6359 if (ixj_get_tone_on(j)) { 6360 retval = -1; 6361 } else { 6362 retval = (j->ssr.high << 8) + j->ssr.low; 6363 } 6364 break; 6365 case PHONE_GET_TONE_OFF_TIME: 6366 if (ixj_get_tone_off(j)) { 6367 retval = -1; 6368 } else { 6369 retval = (j->ssr.high << 8) + j->ssr.low; 6370 } 6371 break; 6372 case PHONE_PLAY_TONE: 6373 if (!j->tone_state) 6374 retval = ixj_play_tone(j, arg); 6375 else 6376 retval = -1; 6377 break; 6378 case PHONE_GET_TONE_STATE: 6379 retval = j->tone_state; 6380 break; 6381 case PHONE_DTMF_READY: 6382 retval = j->ex.bits.dtmf_ready; 6383 break; 6384 case PHONE_GET_DTMF: 6385 if (ixj_hookstate(j)) { 6386 if (j->dtmf_rp != j->dtmf_wp) { 6387 retval = j->dtmfbuffer[j->dtmf_rp]; 6388 j->dtmf_rp++; 6389 if (j->dtmf_rp == 79) 6390 j->dtmf_rp = 0; 6391 if (j->dtmf_rp == j->dtmf_wp) { 6392 j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0; 6393 } 6394 } 6395 } 6396 break; 6397 case PHONE_GET_DTMF_ASCII: 6398 if (ixj_hookstate(j)) { 6399 if (j->dtmf_rp != j->dtmf_wp) { 6400 switch (j->dtmfbuffer[j->dtmf_rp]) { 6401 case 10: 6402 retval = 42; /* '*'; */ 6403 6404 break; 6405 case 11: 6406 retval = 48; /*'0'; */ 6407 6408 break; 6409 case 12: 6410 retval = 35; /*'#'; */ 6411 6412 break; 6413 case 28: 6414 retval = 65; /*'A'; */ 6415 6416 break; 6417 case 29: 6418 retval = 66; /*'B'; */ 6419 6420 break; 6421 case 30: 6422 retval = 67; /*'C'; */ 6423 6424 break; 6425 case 31: 6426 retval = 68; /*'D'; */ 6427 6428 break; 6429 default: 6430 retval = 48 + j->dtmfbuffer[j->dtmf_rp]; 6431 break; 6432 } 6433 j->dtmf_rp++; 6434 if (j->dtmf_rp == 79) 6435 j->dtmf_rp = 0; 6436 if(j->dtmf_rp == j->dtmf_wp) 6437 { 6438 j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0; 6439 } 6440 } 6441 } 6442 break; 6443 case PHONE_DTMF_OOB: 6444 j->flags.dtmf_oob = arg; 6445 break; 6446 case PHONE_DIALTONE: 6447 ixj_dialtone(j); 6448 break; 6449 case PHONE_BUSY: 6450 ixj_busytone(j); 6451 break; 6452 case PHONE_RINGBACK: 6453 ixj_ringback(j); 6454 break; 6455 case PHONE_WINK: 6456 if(j->cardtype == QTI_PHONEJACK) 6457 retval = -1; 6458 else 6459 retval = ixj_wink(j); 6460 break; 6461 case PHONE_CPT_STOP: 6462 ixj_cpt_stop(j); 6463 break; 6464 case PHONE_QUERY_CODEC: 6465 { 6466 struct phone_codec_data pd; 6467 int val; 6468 int proto_size[] = { 6469 -1, 6470 12, 10, 16, 9, 8, 48, 5, 6471 40, 40, 80, 40, 40, 6 6472 }; 6473 if(copy_from_user(&pd, argp, sizeof(pd))) { 6474 retval = -EFAULT; 6475 break; 6476 } 6477 if(pd.type<1 || pd.type>13) { 6478 retval = -EPROTONOSUPPORT; 6479 break; 6480 } 6481 if(pd.type<G729) 6482 val=proto_size[pd.type]; 6483 else switch(j->baseframe.low) 6484 { 6485 case 0xA0:val=2*proto_size[pd.type];break; 6486 case 0x50:val=proto_size[pd.type];break; 6487 default:val=proto_size[pd.type]*3;break; 6488 } 6489 pd.buf_min=pd.buf_max=pd.buf_opt=val; 6490 if(copy_to_user(argp, &pd, sizeof(pd))) 6491 retval = -EFAULT; 6492 break; 6493 } 6494 case IXJCTL_DSP_IDLE: 6495 idle(j); 6496 break; 6497 case IXJCTL_MIXER: 6498 if ((arg & 0xff) == 0xff) 6499 retval = ixj_get_mixer(arg, j); 6500 else 6501 ixj_mixer(arg, j); 6502 break; 6503 case IXJCTL_DAA_COEFF_SET: 6504 switch (arg) { 6505 case DAA_US: 6506 DAA_Coeff_US(j); 6507 retval = ixj_daa_write(j); 6508 break; 6509 case DAA_UK: 6510 DAA_Coeff_UK(j); 6511 retval = ixj_daa_write(j); 6512 break; 6513 case DAA_FRANCE: 6514 DAA_Coeff_France(j); 6515 retval = ixj_daa_write(j); 6516 break; 6517 case DAA_GERMANY: 6518 DAA_Coeff_Germany(j); 6519 retval = ixj_daa_write(j); 6520 break; 6521 case DAA_AUSTRALIA: 6522 DAA_Coeff_Australia(j); 6523 retval = ixj_daa_write(j); 6524 break; 6525 case DAA_JAPAN: 6526 DAA_Coeff_Japan(j); 6527 retval = ixj_daa_write(j); 6528 break; 6529 default: 6530 retval = 1; 6531 break; 6532 } 6533 break; 6534 case IXJCTL_DAA_AGAIN: 6535 ixj_daa_cr4(j, arg | 0x02); 6536 break; 6537 case IXJCTL_PSTN_LINETEST: 6538 retval = ixj_linetest(j); 6539 break; 6540 case IXJCTL_VMWI: 6541 ixj_write_vmwi(j, arg); 6542 break; 6543 case IXJCTL_CID: 6544 if (copy_to_user(argp, &j->cid, sizeof(PHONE_CID))) 6545 retval = -EFAULT; 6546 j->ex.bits.caller_id = 0; 6547 break; 6548 case IXJCTL_WINK_DURATION: 6549 j->winktime = arg; 6550 break; 6551 case IXJCTL_PORT: 6552 if (arg) 6553 retval = ixj_set_port(j, arg); 6554 else 6555 retval = j->port; 6556 break; 6557 case IXJCTL_POTS_PSTN: 6558 retval = ixj_set_pots(j, arg); 6559 break; 6560 case PHONE_CAPABILITIES: 6561 add_caps(j); 6562 retval = j->caps; 6563 break; 6564 case PHONE_CAPABILITIES_LIST: 6565 add_caps(j); 6566 if (copy_to_user(argp, j->caplist, sizeof(struct phone_capability) * j->caps)) 6567 retval = -EFAULT; 6568 break; 6569 case PHONE_CAPABILITIES_CHECK: 6570 { 6571 struct phone_capability cap; 6572 if (copy_from_user(&cap, argp, sizeof(cap))) 6573 retval = -EFAULT; 6574 else { 6575 add_caps(j); 6576 retval = capabilities_check(j, &cap); 6577 } 6578 } 6579 break; 6580 case PHONE_PSTN_SET_STATE: 6581 daa_set_mode(j, arg); 6582 break; 6583 case PHONE_PSTN_GET_STATE: 6584 retval = j->daa_mode; 6585 j->ex.bits.pstn_ring = 0; 6586 break; 6587 case IXJCTL_SET_FILTER: 6588 if (copy_from_user(&jf, argp, sizeof(jf))) 6589 retval = -EFAULT; 6590 retval = ixj_init_filter(j, &jf); 6591 break; 6592 case IXJCTL_SET_FILTER_RAW: 6593 if (copy_from_user(&jfr, argp, sizeof(jfr))) 6594 retval = -EFAULT; 6595 else 6596 retval = ixj_init_filter_raw(j, &jfr); 6597 break; 6598 case IXJCTL_GET_FILTER_HIST: 6599 if(arg<0||arg>3) 6600 retval = -EINVAL; 6601 else 6602 retval = j->filter_hist[arg]; 6603 break; 6604 case IXJCTL_INIT_TONE: 6605 if (copy_from_user(&ti, argp, sizeof(ti))) 6606 retval = -EFAULT; 6607 else 6608 retval = ixj_init_tone(j, &ti); 6609 break; 6610 case IXJCTL_TONE_CADENCE: 6611 retval = ixj_build_cadence(j, argp); 6612 break; 6613 case IXJCTL_FILTER_CADENCE: 6614 retval = ixj_build_filter_cadence(j, argp); 6615 break; 6616 case IXJCTL_SIGCTL: 6617 if (copy_from_user(&j->sigdef, argp, sizeof(IXJ_SIGDEF))) { 6618 retval = -EFAULT; 6619 break; 6620 } 6621 j->ixj_signals[j->sigdef.event] = j->sigdef.signal; 6622 if(j->sigdef.event < 33) { 6623 raise = 1; 6624 for(mant = 0; mant < j->sigdef.event; mant++){ 6625 raise *= 2; 6626 } 6627 if(j->sigdef.signal) 6628 j->ex_sig.bytes |= raise; 6629 else 6630 j->ex_sig.bytes &= (raise^0xffff); 6631 } 6632 break; 6633 case IXJCTL_INTERCOM_STOP: 6634 if(arg < 0 || arg >= IXJMAX) 6635 return -EINVAL; 6636 j->intercom = -1; 6637 ixj_record_stop(j); 6638 ixj_play_stop(j); 6639 idle(j); 6640 get_ixj(arg)->intercom = -1; 6641 ixj_record_stop(get_ixj(arg)); 6642 ixj_play_stop(get_ixj(arg)); 6643 idle(get_ixj(arg)); 6644 break; 6645 case IXJCTL_INTERCOM_START: 6646 if(arg < 0 || arg >= IXJMAX) 6647 return -EINVAL; 6648 j->intercom = arg; 6649 ixj_record_start(j); 6650 ixj_play_start(j); 6651 get_ixj(arg)->intercom = board; 6652 ixj_play_start(get_ixj(arg)); 6653 ixj_record_start(get_ixj(arg)); 6654 break; 6655 } 6656 if (ixjdebug & 0x0040) 6657 printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg); 6658 clear_bit(board, &j->busyflags); 6659 return retval; 6660} 6661 6662static int ixj_fasync(int fd, struct file *file_p, int mode) 6663{ 6664 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode)); 6665 6666 return fasync_helper(fd, file_p, mode, &j->async_queue); 6667} 6668 6669static const struct file_operations ixj_fops = 6670{ 6671 .owner = THIS_MODULE, 6672 .read = ixj_enhanced_read, 6673 .write = ixj_enhanced_write, 6674 .poll = ixj_poll, 6675 .ioctl = ixj_ioctl, 6676 .release = ixj_release, 6677 .fasync = ixj_fasync 6678}; 6679 6680static int ixj_linetest(IXJ *j) 6681{ 6682 j->flags.pstncheck = 1; /* Testing */ 6683 j->flags.pstn_present = 0; /* Assume the line is not there */ 6684 6685 daa_int_read(j); /*Clear DAA Interrupt flags */ 6686 /* */ 6687 /* Hold all relays in the normally de-energized position. */ 6688 /* */ 6689 6690 j->pld_slicw.bits.rly1 = 0; 6691 j->pld_slicw.bits.rly2 = 0; 6692 j->pld_slicw.bits.rly3 = 0; 6693 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 6694 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ 6695 6696 outb_p(j->pld_scrw.byte, j->XILINXbase); 6697 j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01); 6698 if (j->pld_slicr.bits.potspstn) { 6699 j->flags.pots_pstn = 1; 6700 j->flags.pots_correct = 0; 6701 LED_SetState(0x4, j); 6702 } else { 6703 j->flags.pots_pstn = 0; 6704 j->pld_slicw.bits.rly1 = 0; 6705 j->pld_slicw.bits.rly2 = 0; 6706 j->pld_slicw.bits.rly3 = 1; 6707 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 6708 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ 6709 6710 outb_p(j->pld_scrw.byte, j->XILINXbase); 6711 daa_set_mode(j, SOP_PU_CONVERSATION); 6712 msleep(1000); 6713 daa_int_read(j); 6714 daa_set_mode(j, SOP_PU_RESET); 6715 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) { 6716 j->flags.pots_correct = 0; /* Should not be line voltage on POTS port. */ 6717 LED_SetState(0x4, j); 6718 j->pld_slicw.bits.rly3 = 0; 6719 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 6720 } else { 6721 j->flags.pots_correct = 1; 6722 LED_SetState(0x8, j); 6723 j->pld_slicw.bits.rly1 = 1; 6724 j->pld_slicw.bits.rly2 = 0; 6725 j->pld_slicw.bits.rly3 = 0; 6726 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 6727 } 6728 } 6729 j->pld_slicw.bits.rly3 = 0; 6730 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 6731 daa_set_mode(j, SOP_PU_CONVERSATION); 6732 msleep(1000); 6733 daa_int_read(j); 6734 daa_set_mode(j, SOP_PU_RESET); 6735 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) { 6736 j->pstn_sleeptil = jiffies + (hertz / 4); 6737 j->flags.pstn_present = 1; 6738 } else { 6739 j->flags.pstn_present = 0; 6740 } 6741 if (j->flags.pstn_present) { 6742 if (j->flags.pots_correct) { 6743 LED_SetState(0xA, j); 6744 } else { 6745 LED_SetState(0x6, j); 6746 } 6747 } else { 6748 if (j->flags.pots_correct) { 6749 LED_SetState(0x9, j); 6750 } else { 6751 LED_SetState(0x5, j); 6752 } 6753 } 6754 j->flags.pstncheck = 0; /* Testing */ 6755 return j->flags.pstn_present; 6756} 6757 6758static int ixj_selfprobe(IXJ *j) 6759{ 6760 unsigned short cmd; 6761 int cnt; 6762 BYTES bytes; 6763 6764 init_waitqueue_head(&j->poll_q); 6765 init_waitqueue_head(&j->read_q); 6766 init_waitqueue_head(&j->write_q); 6767 6768 while(atomic_read(&j->DSPWrite) > 0) 6769 atomic_dec(&j->DSPWrite); 6770 if (ixjdebug & 0x0002) 6771 printk(KERN_INFO "Write IDLE to Software Control Register\n"); 6772 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */ 6773 6774 if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */ 6775 return -1; 6776/* The read values of the SSR should be 0x00 for the IDLE command */ 6777 if (j->ssr.low || j->ssr.high) 6778 return -1; 6779 if (ixjdebug & 0x0002) 6780 printk(KERN_INFO "Get Device ID Code\n"); 6781 if (ixj_WriteDSPCommand(0x3400, j)) /* Get Device ID Code */ 6782 return -1; 6783 j->dsp.low = j->ssr.low; 6784 j->dsp.high = j->ssr.high; 6785 if (ixjdebug & 0x0002) 6786 printk(KERN_INFO "Get Device Version Code\n"); 6787 if (ixj_WriteDSPCommand(0x3800, j)) /* Get Device Version Code */ 6788 return -1; 6789 j->ver.low = j->ssr.low; 6790 j->ver.high = j->ssr.high; 6791 if (!j->cardtype) { 6792 if (j->dsp.low == 0x21) { 6793 bytes.high = bytes.low = inb_p(j->XILINXbase + 0x02); 6794 outb_p(bytes.low ^ 0xFF, j->XILINXbase + 0x02); 6795/* Test for Internet LineJACK or Internet PhoneJACK Lite */ 6796 bytes.low = inb_p(j->XILINXbase + 0x02); 6797 if (bytes.low == bytes.high) /* Register is read only on */ 6798 /* Internet PhoneJack Lite */ 6799 { 6800 j->cardtype = QTI_PHONEJACK_LITE; 6801 if (!request_region(j->XILINXbase, 4, "ixj control")) { 6802 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase); 6803 return -1; 6804 } 6805 j->pld_slicw.pcib.e1 = 1; 6806 outb_p(j->pld_slicw.byte, j->XILINXbase); 6807 } else { 6808 j->cardtype = QTI_LINEJACK; 6809 6810 if (!request_region(j->XILINXbase, 8, "ixj control")) { 6811 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase); 6812 return -1; 6813 } 6814 } 6815 } else if (j->dsp.low == 0x22) { 6816 j->cardtype = QTI_PHONEJACK_PCI; 6817 request_region(j->XILINXbase, 4, "ixj control"); 6818 j->pld_slicw.pcib.e1 = 1; 6819 outb_p(j->pld_slicw.byte, j->XILINXbase); 6820 } else 6821 j->cardtype = QTI_PHONEJACK; 6822 } else { 6823 switch (j->cardtype) { 6824 case QTI_PHONEJACK: 6825 if (!j->dsp.low != 0x20) { 6826 j->dsp.high = 0x80; 6827 j->dsp.low = 0x20; 6828 ixj_WriteDSPCommand(0x3800, j); 6829 j->ver.low = j->ssr.low; 6830 j->ver.high = j->ssr.high; 6831 } 6832 break; 6833 case QTI_LINEJACK: 6834 if (!request_region(j->XILINXbase, 8, "ixj control")) { 6835 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase); 6836 return -1; 6837 } 6838 break; 6839 case QTI_PHONEJACK_LITE: 6840 case QTI_PHONEJACK_PCI: 6841 if (!request_region(j->XILINXbase, 4, "ixj control")) { 6842 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase); 6843 return -1; 6844 } 6845 j->pld_slicw.pcib.e1 = 1; 6846 outb_p(j->pld_slicw.byte, j->XILINXbase); 6847 break; 6848 case QTI_PHONECARD: 6849 break; 6850 } 6851 } 6852 if (j->dsp.low == 0x20 || j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) { 6853 if (ixjdebug & 0x0002) 6854 printk(KERN_INFO "Write CODEC config to Software Control Register\n"); 6855 if (ixj_WriteDSPCommand(0xC462, j)) /* Write CODEC config to Software Control Register */ 6856 return -1; 6857 if (ixjdebug & 0x0002) 6858 printk(KERN_INFO "Write CODEC timing to Software Control Register\n"); 6859 if (j->cardtype == QTI_PHONEJACK) { 6860 cmd = 0x9FF2; 6861 } else { 6862 cmd = 0x9FF5; 6863 } 6864 if (ixj_WriteDSPCommand(cmd, j)) /* Write CODEC timing to Software Control Register */ 6865 return -1; 6866 } else { 6867 if (set_base_frame(j, 30) != 30) 6868 return -1; 6869 if (ixjdebug & 0x0002) 6870 printk(KERN_INFO "Write CODEC config to Software Control Register\n"); 6871 if (j->cardtype == QTI_PHONECARD) { 6872 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */ 6873 return -1; 6874 } 6875 if (j->cardtype == QTI_LINEJACK) { 6876 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */ 6877 return -1; 6878 if (ixjdebug & 0x0002) 6879 printk(KERN_INFO "Turn on the PLD Clock at 8Khz\n"); 6880 j->pld_clock.byte = 0; 6881 outb_p(j->pld_clock.byte, j->XILINXbase + 0x04); 6882 } 6883 } 6884 6885 if (j->dsp.low == 0x20) { 6886 if (ixjdebug & 0x0002) 6887 printk(KERN_INFO "Configure GPIO pins\n"); 6888 j->gpio.bytes.high = 0x09; 6889/* bytes.low = 0xEF; 0xF7 */ 6890 j->gpio.bits.gpio1 = 1; 6891 j->gpio.bits.gpio2 = 1; 6892 j->gpio.bits.gpio3 = 0; 6893 j->gpio.bits.gpio4 = 1; 6894 j->gpio.bits.gpio5 = 1; 6895 j->gpio.bits.gpio6 = 1; 6896 j->gpio.bits.gpio7 = 1; 6897 ixj_WriteDSPCommand(j->gpio.word, j); /* Set GPIO pin directions */ 6898 if (ixjdebug & 0x0002) 6899 printk(KERN_INFO "Enable SLIC\n"); 6900 j->gpio.bytes.high = 0x0B; 6901 j->gpio.bytes.low = 0x00; 6902 j->gpio.bits.gpio1 = 0; 6903 j->gpio.bits.gpio2 = 1; 6904 j->gpio.bits.gpio5 = 0; 6905 ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring stop signal */ 6906 j->port = PORT_POTS; 6907 } else { 6908 if (j->cardtype == QTI_LINEJACK) { 6909 LED_SetState(0x1, j); 6910 msleep(100); 6911 LED_SetState(0x2, j); 6912 msleep(100); 6913 LED_SetState(0x4, j); 6914 msleep(100); 6915 LED_SetState(0x8, j); 6916 msleep(100); 6917 LED_SetState(0x0, j); 6918 daa_get_version(j); 6919 if (ixjdebug & 0x0002) 6920 printk("Loading DAA Coefficients\n"); 6921 DAA_Coeff_US(j); 6922 if (!ixj_daa_write(j)) { 6923 printk("DAA write failed on board %d\n", j->board); 6924 return -1; 6925 } 6926 if(!ixj_daa_cid_reset(j)) { 6927 printk("DAA CID reset failed on board %d\n", j->board); 6928 return -1; 6929 } 6930 j->flags.pots_correct = 0; 6931 j->flags.pstn_present = 0; 6932 ixj_linetest(j); 6933 if (j->flags.pots_correct) { 6934 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ 6935 6936 outb_p(j->pld_scrw.byte, j->XILINXbase); 6937 j->pld_slicw.bits.rly1 = 1; 6938 j->pld_slicw.bits.spken = 1; 6939 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 6940 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j); 6941/* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */ 6942 j->port = PORT_POTS; 6943 } 6944 ixj_set_port(j, PORT_PSTN); 6945 ixj_set_pots(j, 1); 6946 if (ixjdebug & 0x0002) 6947 printk(KERN_INFO "Enable Mixer\n"); 6948 ixj_mixer(0x0000, j); /*Master Volume Left unmute 0db */ 6949 ixj_mixer(0x0100, j); /*Master Volume Right unmute 0db */ 6950 6951 ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */ 6952 ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */ 6953 6954 ixj_mixer(0x0480, j); /*FM Left mute */ 6955 ixj_mixer(0x0580, j); /*FM Right mute */ 6956 6957 ixj_mixer(0x0680, j); /*CD Left mute */ 6958 ixj_mixer(0x0780, j); /*CD Right mute */ 6959 6960 ixj_mixer(0x0880, j); /*Line Left mute */ 6961 ixj_mixer(0x0980, j); /*Line Right mute */ 6962 6963 ixj_mixer(0x0A80, j); /*Aux left mute */ 6964 ixj_mixer(0x0B80, j); /*Aux right mute */ 6965 6966 ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */ 6967 ixj_mixer(0x0D80, j); /*Mono2 mute */ 6968 6969 ixj_mixer(0x0E80, j); /*Mic mute */ 6970 6971 ixj_mixer(0x0F00, j); /*Mono Out Volume unmute 0db */ 6972 6973 ixj_mixer(0x1000, j); /*Voice Left and Right out only */ 6974 ixj_mixer(0x110C, j); 6975 6976 6977 ixj_mixer(0x1200, j); /*Mono1 switch on mixer left */ 6978 ixj_mixer(0x1401, j); 6979 6980 ixj_mixer(0x1300, j); /*Mono1 switch on mixer right */ 6981 ixj_mixer(0x1501, j); 6982 6983 ixj_mixer(0x1700, j); /*Clock select */ 6984 6985 ixj_mixer(0x1800, j); /*ADC input from mixer */ 6986 6987 ixj_mixer(0x1901, j); /*Mic gain 30db */ 6988 6989 if (ixjdebug & 0x0002) 6990 printk(KERN_INFO "Setting Default US Ring Cadence Detection\n"); 6991 j->cadence_f[4].state = 0; 6992 j->cadence_f[4].on1 = 0; /*Cadence Filter 4 is used for PSTN ring cadence */ 6993 j->cadence_f[4].off1 = 0; 6994 j->cadence_f[4].on2 = 0; 6995 j->cadence_f[4].off2 = 0; 6996 j->cadence_f[4].on3 = 0; 6997 j->cadence_f[4].off3 = 0; /* These should represent standard US ring pulse. */ 6998 j->pstn_last_rmr = jiffies; 6999 7000 } else { 7001 if (j->cardtype == QTI_PHONECARD) { 7002 ixj_WriteDSPCommand(0xCF07, j); 7003 ixj_WriteDSPCommand(0x00B0, j); 7004 ixj_set_port(j, PORT_SPEAKER); 7005 } else { 7006 ixj_set_port(j, PORT_POTS); 7007 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j); 7008/* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */ 7009 } 7010 } 7011 } 7012 7013 j->intercom = -1; 7014 j->framesread = j->frameswritten = 0; 7015 j->read_wait = j->write_wait = 0; 7016 j->rxreadycheck = j->txreadycheck = 0; 7017 7018 /* initialise the DTMF prescale to a sensible value */ 7019 if (j->cardtype == QTI_LINEJACK) { 7020 set_dtmf_prescale(j, 0x10); 7021 } else { 7022 set_dtmf_prescale(j, 0x40); 7023 } 7024 set_play_volume(j, 0x100); 7025 set_rec_volume(j, 0x100); 7026 7027 if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */ 7028 return -1; 7029/* The read values of the SSR should be 0x00 for the IDLE command */ 7030 if (j->ssr.low || j->ssr.high) 7031 return -1; 7032 7033 if (ixjdebug & 0x0002) 7034 printk(KERN_INFO "Enable Line Monitor\n"); 7035 7036 if (ixjdebug & 0x0002) 7037 printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n"); 7038 7039 if (ixj_WriteDSPCommand(0x7E01, j)) /* Asynchronous Line Monitor */ 7040 return -1; 7041 7042 if (ixjdebug & 0x002) 7043 printk(KERN_INFO "Enable DTMF Detectors\n"); 7044 7045 if (ixj_WriteDSPCommand(0x5151, j)) /* Enable DTMF detection */ 7046 return -1; 7047 7048 if (ixj_WriteDSPCommand(0x6E01, j)) /* Set Asyncronous Tone Generation */ 7049 return -1; 7050 7051 set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */ 7052 7053 set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */ 7054 7055 j->ex.bits.dtmf_ready = 0; 7056 j->dtmf_state = 0; 7057 j->dtmf_wp = j->dtmf_rp = 0; 7058 j->rec_mode = j->play_mode = -1; 7059 j->flags.ringing = 0; 7060 j->maxrings = MAXRINGS; 7061 j->ring_cadence = USA_RING_CADENCE; 7062 j->drybuffer = 0; 7063 j->winktime = 320; 7064 j->flags.dtmf_oob = 0; 7065 for (cnt = 0; cnt < 4; cnt++) 7066 j->cadence_f[cnt].enable = 0; 7067 /* must be a device on the specified address */ 7068 ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */ 7069 7070 /* Set up the default signals for events */ 7071 for (cnt = 0; cnt < 35; cnt++) 7072 j->ixj_signals[cnt] = SIGIO; 7073 7074 /* Set the excetion signal enable flags */ 7075 j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring = 7076 j->ex_sig.bits.caller_id = j->ex_sig.bits.pstn_wink = j->ex_sig.bits.f0 = j->ex_sig.bits.f1 = j->ex_sig.bits.f2 = 7077 j->ex_sig.bits.f3 = j->ex_sig.bits.fc0 = j->ex_sig.bits.fc1 = j->ex_sig.bits.fc2 = j->ex_sig.bits.fc3 = 1; 7078#ifdef IXJ_DYN_ALLOC 7079 j->fskdata = NULL; 7080#endif 7081 j->fskdcnt = 0; 7082 j->cidcw_wait = 0; 7083 7084 /* Register with the Telephony for Linux subsystem */ 7085 j->p.f_op = &ixj_fops; 7086 j->p.open = ixj_open; 7087 j->p.board = j->board; 7088 phone_register_device(&j->p, PHONE_UNIT_ANY); 7089 7090 ixj_init_timer(j); 7091 ixj_add_timer(j); 7092 return 0; 7093} 7094 7095/* 7096 * Exported service for pcmcia card handling 7097 */ 7098 7099IXJ *ixj_pcmcia_probe(unsigned long dsp, unsigned long xilinx) 7100{ 7101 IXJ *j = ixj_alloc(); 7102 7103 j->board = 0; 7104 7105 j->DSPbase = dsp; 7106 j->XILINXbase = xilinx; 7107 j->cardtype = QTI_PHONECARD; 7108 ixj_selfprobe(j); 7109 return j; 7110} 7111 7112EXPORT_SYMBOL(ixj_pcmcia_probe); /* Fpr PCMCIA */ 7113 7114static int ixj_get_status_proc(char *buf) 7115{ 7116 int len; 7117 int cnt; 7118 IXJ *j; 7119 len = 0; 7120 len += sprintf(buf + len, "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, IXJ_VER_MINOR, IXJ_BLD_VER); 7121 len += sprintf(buf + len, "\nsizeof IXJ struct %Zd bytes", sizeof(IXJ)); 7122 len += sprintf(buf + len, "\nsizeof DAA struct %Zd bytes", sizeof(DAA_REGS)); 7123 len += sprintf(buf + len, "\nUsing old telephony API"); 7124 len += sprintf(buf + len, "\nDebug Level %d\n", ixjdebug); 7125 7126 for (cnt = 0; cnt < IXJMAX; cnt++) { 7127 j = get_ixj(cnt); 7128 if(j==NULL) 7129 continue; 7130 if (j->DSPbase) { 7131 len += sprintf(buf + len, "\nCard Num %d", cnt); 7132 len += sprintf(buf + len, "\nDSP Base Address 0x%4.4x", j->DSPbase); 7133 if (j->cardtype != QTI_PHONEJACK) 7134 len += sprintf(buf + len, "\nXILINX Base Address 0x%4.4x", j->XILINXbase); 7135 len += sprintf(buf + len, "\nDSP Type %2.2x%2.2x", j->dsp.high, j->dsp.low); 7136 len += sprintf(buf + len, "\nDSP Version %2.2x.%2.2x", j->ver.high, j->ver.low); 7137 len += sprintf(buf + len, "\nSerial Number %8.8x", j->serial); 7138 switch (j->cardtype) { 7139 case (QTI_PHONEJACK): 7140 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK"); 7141 break; 7142 case (QTI_LINEJACK): 7143 len += sprintf(buf + len, "\nCard Type = Internet LineJACK"); 7144 if (j->flags.g729_loaded) 7145 len += sprintf(buf + len, " w/G.729 A/B"); 7146 len += sprintf(buf + len, " Country = %d", j->daa_country); 7147 break; 7148 case (QTI_PHONEJACK_LITE): 7149 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK Lite"); 7150 if (j->flags.g729_loaded) 7151 len += sprintf(buf + len, " w/G.729 A/B"); 7152 break; 7153 case (QTI_PHONEJACK_PCI): 7154 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK PCI"); 7155 if (j->flags.g729_loaded) 7156 len += sprintf(buf + len, " w/G.729 A/B"); 7157 break; 7158 case (QTI_PHONECARD): 7159 len += sprintf(buf + len, "\nCard Type = Internet PhoneCARD"); 7160 if (j->flags.g729_loaded) 7161 len += sprintf(buf + len, " w/G.729 A/B"); 7162 len += sprintf(buf + len, "\nSmart Cable %spresent", j->pccr1.bits.drf ? "not " : ""); 7163 if (!j->pccr1.bits.drf) 7164 len += sprintf(buf + len, "\nSmart Cable type %d", j->flags.pcmciasct); 7165 len += sprintf(buf + len, "\nSmart Cable state %d", j->flags.pcmciastate); 7166 break; 7167 default: 7168 len += sprintf(buf + len, "\nCard Type = %d", j->cardtype); 7169 break; 7170 } 7171 len += sprintf(buf + len, "\nReaders %d", j->readers); 7172 len += sprintf(buf + len, "\nWriters %d", j->writers); 7173 add_caps(j); 7174 len += sprintf(buf + len, "\nCapabilities %d", j->caps); 7175 if (j->dsp.low != 0x20) 7176 len += sprintf(buf + len, "\nDSP Processor load %d", j->proc_load); 7177 if (j->flags.cidsent) 7178 len += sprintf(buf + len, "\nCaller ID data sent"); 7179 else 7180 len += sprintf(buf + len, "\nCaller ID data not sent"); 7181 7182 len += sprintf(buf + len, "\nPlay CODEC "); 7183 switch (j->play_codec) { 7184 case G723_63: 7185 len += sprintf(buf + len, "G.723.1 6.3"); 7186 break; 7187 case G723_53: 7188 len += sprintf(buf + len, "G.723.1 5.3"); 7189 break; 7190 case TS85: 7191 len += sprintf(buf + len, "TrueSpeech 8.5"); 7192 break; 7193 case TS48: 7194 len += sprintf(buf + len, "TrueSpeech 4.8"); 7195 break; 7196 case TS41: 7197 len += sprintf(buf + len, "TrueSpeech 4.1"); 7198 break; 7199 case G728: 7200 len += sprintf(buf + len, "G.728"); 7201 break; 7202 case G729: 7203 len += sprintf(buf + len, "G.729"); 7204 break; 7205 case G729B: 7206 len += sprintf(buf + len, "G.729B"); 7207 break; 7208 case ULAW: 7209 len += sprintf(buf + len, "uLaw"); 7210 break; 7211 case ALAW: 7212 len += sprintf(buf + len, "aLaw"); 7213 break; 7214 case LINEAR16: 7215 len += sprintf(buf + len, "16 bit Linear"); 7216 break; 7217 case LINEAR8: 7218 len += sprintf(buf + len, "8 bit Linear"); 7219 break; 7220 case WSS: 7221 len += sprintf(buf + len, "Windows Sound System"); 7222 break; 7223 default: 7224 len += sprintf(buf + len, "NO CODEC CHOSEN"); 7225 break; 7226 } 7227 len += sprintf(buf + len, "\nRecord CODEC "); 7228 switch (j->rec_codec) { 7229 case G723_63: 7230 len += sprintf(buf + len, "G.723.1 6.3"); 7231 break; 7232 case G723_53: 7233 len += sprintf(buf + len, "G.723.1 5.3"); 7234 break; 7235 case TS85: 7236 len += sprintf(buf + len, "TrueSpeech 8.5"); 7237 break; 7238 case TS48: 7239 len += sprintf(buf + len, "TrueSpeech 4.8"); 7240 break; 7241 case TS41: 7242 len += sprintf(buf + len, "TrueSpeech 4.1"); 7243 break; 7244 case G728: 7245 len += sprintf(buf + len, "G.728"); 7246 break; 7247 case G729: 7248 len += sprintf(buf + len, "G.729"); 7249 break; 7250 case G729B: 7251 len += sprintf(buf + len, "G.729B"); 7252 break; 7253 case ULAW: 7254 len += sprintf(buf + len, "uLaw"); 7255 break; 7256 case ALAW: 7257 len += sprintf(buf + len, "aLaw"); 7258 break; 7259 case LINEAR16: 7260 len += sprintf(buf + len, "16 bit Linear"); 7261 break; 7262 case LINEAR8: 7263 len += sprintf(buf + len, "8 bit Linear"); 7264 break; 7265 case WSS: 7266 len += sprintf(buf + len, "Windows Sound System"); 7267 break; 7268 default: 7269 len += sprintf(buf + len, "NO CODEC CHOSEN"); 7270 break; 7271 } 7272 len += sprintf(buf + len, "\nAEC "); 7273 switch (j->aec_level) { 7274 case AEC_OFF: 7275 len += sprintf(buf + len, "Off"); 7276 break; 7277 case AEC_LOW: 7278 len += sprintf(buf + len, "Low"); 7279 break; 7280 case AEC_MED: 7281 len += sprintf(buf + len, "Med"); 7282 break; 7283 case AEC_HIGH: 7284 len += sprintf(buf + len, "High"); 7285 break; 7286 case AEC_AUTO: 7287 len += sprintf(buf + len, "Auto"); 7288 break; 7289 case AEC_AGC: 7290 len += sprintf(buf + len, "AEC/AGC"); 7291 break; 7292 default: 7293 len += sprintf(buf + len, "unknown(%i)", j->aec_level); 7294 break; 7295 } 7296 7297 len += sprintf(buf + len, "\nRec volume 0x%x", get_rec_volume(j)); 7298 len += sprintf(buf + len, "\nPlay volume 0x%x", get_play_volume(j)); 7299 len += sprintf(buf + len, "\nDTMF prescale 0x%x", get_dtmf_prescale(j)); 7300 7301 len += sprintf(buf + len, "\nHook state %d", j->hookstate); /* j->r_hook); */ 7302 7303 if (j->cardtype == QTI_LINEJACK) { 7304 len += sprintf(buf + len, "\nPOTS Correct %d", j->flags.pots_correct); 7305 len += sprintf(buf + len, "\nPSTN Present %d", j->flags.pstn_present); 7306 len += sprintf(buf + len, "\nPSTN Check %d", j->flags.pstncheck); 7307 len += sprintf(buf + len, "\nPOTS to PSTN %d", j->flags.pots_pstn); 7308 switch (j->daa_mode) { 7309 case SOP_PU_SLEEP: 7310 len += sprintf(buf + len, "\nDAA PSTN On Hook"); 7311 break; 7312 case SOP_PU_RINGING: 7313 len += sprintf(buf + len, "\nDAA PSTN Ringing"); 7314 len += sprintf(buf + len, "\nRinging state = %d", j->cadence_f[4].state); 7315 break; 7316 case SOP_PU_CONVERSATION: 7317 len += sprintf(buf + len, "\nDAA PSTN Off Hook"); 7318 break; 7319 case SOP_PU_PULSEDIALING: 7320 len += sprintf(buf + len, "\nDAA PSTN Pulse Dialing"); 7321 break; 7322 } 7323 len += sprintf(buf + len, "\nDAA RMR = %d", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR); 7324 len += sprintf(buf + len, "\nDAA VDD OK = %d", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK); 7325 len += sprintf(buf + len, "\nDAA CR0 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg); 7326 len += sprintf(buf + len, "\nDAA CR1 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg); 7327 len += sprintf(buf + len, "\nDAA CR2 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg); 7328 len += sprintf(buf + len, "\nDAA CR3 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg); 7329 len += sprintf(buf + len, "\nDAA CR4 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg); 7330 len += sprintf(buf + len, "\nDAA CR5 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg); 7331 len += sprintf(buf + len, "\nDAA XR0 = 0x%02x", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg); 7332 len += sprintf(buf + len, "\nDAA ringstop %ld - jiffies %ld", j->pstn_ring_stop, jiffies); 7333 } 7334 switch (j->port) { 7335 case PORT_POTS: 7336 len += sprintf(buf + len, "\nPort POTS"); 7337 break; 7338 case PORT_PSTN: 7339 len += sprintf(buf + len, "\nPort PSTN"); 7340 break; 7341 case PORT_SPEAKER: 7342 len += sprintf(buf + len, "\nPort SPEAKER/MIC"); 7343 break; 7344 case PORT_HANDSET: 7345 len += sprintf(buf + len, "\nPort HANDSET"); 7346 break; 7347 } 7348 if (j->dsp.low == 0x21 || j->dsp.low == 0x22) { 7349 len += sprintf(buf + len, "\nSLIC state "); 7350 switch (SLIC_GetState(j)) { 7351 case PLD_SLIC_STATE_OC: 7352 len += sprintf(buf + len, "OC"); 7353 break; 7354 case PLD_SLIC_STATE_RINGING: 7355 len += sprintf(buf + len, "RINGING"); 7356 break; 7357 case PLD_SLIC_STATE_ACTIVE: 7358 len += sprintf(buf + len, "ACTIVE"); 7359 break; 7360 case PLD_SLIC_STATE_OHT: /* On-hook transmit */ 7361 len += sprintf(buf + len, "OHT"); 7362 break; 7363 case PLD_SLIC_STATE_TIPOPEN: 7364 len += sprintf(buf + len, "TIPOPEN"); 7365 break; 7366 case PLD_SLIC_STATE_STANDBY: 7367 len += sprintf(buf + len, "STANDBY"); 7368 break; 7369 case PLD_SLIC_STATE_APR: /* Active polarity reversal */ 7370 len += sprintf(buf + len, "APR"); 7371 break; 7372 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */ 7373 len += sprintf(buf + len, "OHTPR"); 7374 break; 7375 default: 7376 len += sprintf(buf + len, "%d", SLIC_GetState(j)); 7377 break; 7378 } 7379 } 7380 len += sprintf(buf + len, "\nBase Frame %2.2x.%2.2x", j->baseframe.high, j->baseframe.low); 7381 len += sprintf(buf + len, "\nCID Base Frame %2d", j->cid_base_frame_size); 7382#ifdef PERFMON_STATS 7383 len += sprintf(buf + len, "\nTimer Checks %ld", j->timerchecks); 7384 len += sprintf(buf + len, "\nRX Ready Checks %ld", j->rxreadycheck); 7385 len += sprintf(buf + len, "\nTX Ready Checks %ld", j->txreadycheck); 7386 len += sprintf(buf + len, "\nFrames Read %ld", j->framesread); 7387 len += sprintf(buf + len, "\nFrames Written %ld", j->frameswritten); 7388 len += sprintf(buf + len, "\nDry Buffer %ld", j->drybuffer); 7389 len += sprintf(buf + len, "\nRead Waits %ld", j->read_wait); 7390 len += sprintf(buf + len, "\nWrite Waits %ld", j->write_wait); 7391 len += sprintf(buf + len, "\nStatus Waits %ld", j->statuswait); 7392 len += sprintf(buf + len, "\nStatus Wait Fails %ld", j->statuswaitfail); 7393 len += sprintf(buf + len, "\nPControl Waits %ld", j->pcontrolwait); 7394 len += sprintf(buf + len, "\nPControl Wait Fails %ld", j->pcontrolwaitfail); 7395 len += sprintf(buf + len, "\nIs Control Ready Checks %ld", j->iscontrolready); 7396 len += sprintf(buf + len, "\nIs Control Ready Check failures %ld", j->iscontrolreadyfail); 7397 7398#endif 7399 len += sprintf(buf + len, "\n"); 7400 } 7401 } 7402 return len; 7403} 7404 7405static int ixj_read_proc(char *page, char **start, off_t off, 7406 int count, int *eof, void *data) 7407{ 7408 int len = ixj_get_status_proc(page); 7409 if (len <= off+count) *eof = 1; 7410 *start = page + off; 7411 len -= off; 7412 if (len>count) len = count; 7413 if (len<0) len = 0; 7414 return len; 7415} 7416 7417 7418static void cleanup(void) 7419{ 7420 int cnt; 7421 IXJ *j; 7422 7423 for (cnt = 0; cnt < IXJMAX; cnt++) { 7424 j = get_ixj(cnt); 7425 if(j != NULL && j->DSPbase) { 7426 if (ixjdebug & 0x0002) 7427 printk(KERN_INFO "IXJ: Deleting timer for /dev/phone%d\n", cnt); 7428 del_timer(&j->timer); 7429 if (j->cardtype == QTI_LINEJACK) { 7430 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */ 7431 7432 outb_p(j->pld_scrw.byte, j->XILINXbase); 7433 j->pld_slicw.bits.rly1 = 0; 7434 j->pld_slicw.bits.rly2 = 0; 7435 j->pld_slicw.bits.rly3 = 0; 7436 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 7437 LED_SetState(0x0, j); 7438 if (ixjdebug & 0x0002) 7439 printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt); 7440 release_region(j->XILINXbase, 8); 7441 } else if (j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) { 7442 if (ixjdebug & 0x0002) 7443 printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt); 7444 release_region(j->XILINXbase, 4); 7445 } 7446 kfree(j->read_buffer); 7447 kfree(j->write_buffer); 7448 if (j->dev) 7449 pnp_device_detach(j->dev); 7450 if (ixjdebug & 0x0002) 7451 printk(KERN_INFO "IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt); 7452 phone_unregister_device(&j->p); 7453 if (ixjdebug & 0x0002) 7454 printk(KERN_INFO "IXJ: Releasing DSP address for /dev/phone%d\n", cnt); 7455 release_region(j->DSPbase, 16); 7456#ifdef IXJ_DYN_ALLOC 7457 if (ixjdebug & 0x0002) 7458 printk(KERN_INFO "IXJ: Freeing memory for /dev/phone%d\n", cnt); 7459 kfree(j); 7460 ixj[cnt] = NULL; 7461#endif 7462 } 7463 } 7464 if (ixjdebug & 0x0002) 7465 printk(KERN_INFO "IXJ: Removing /proc/ixj\n"); 7466 remove_proc_entry ("ixj", NULL); 7467} 7468 7469/* Typedefs */ 7470typedef struct { 7471 BYTE length; 7472 DWORD bits; 7473} DATABLOCK; 7474 7475static void PCIEE_WriteBit(WORD wEEPROMAddress, BYTE lastLCC, BYTE byData) 7476{ 7477 lastLCC = lastLCC & 0xfb; 7478 lastLCC = lastLCC | (byData ? 4 : 0); 7479 outb(lastLCC, wEEPROMAddress); /*set data out bit as appropriate */ 7480 7481 mdelay(1); 7482 lastLCC = lastLCC | 0x01; 7483 outb(lastLCC, wEEPROMAddress); /*SK rising edge */ 7484 7485 byData = byData << 1; 7486 lastLCC = lastLCC & 0xfe; 7487 mdelay(1); 7488 outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */ 7489 7490} 7491 7492static BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC) 7493{ 7494 mdelay(1); 7495 lastLCC = lastLCC | 0x01; 7496 outb(lastLCC, wEEPROMAddress); /*SK rising edge */ 7497 7498 lastLCC = lastLCC & 0xfe; 7499 mdelay(1); 7500 outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */ 7501 7502 return ((inb(wEEPROMAddress) >> 3) & 1); 7503} 7504 7505static bool PCIEE_ReadWord(WORD wAddress, WORD wLoc, WORD * pwResult) 7506{ 7507 BYTE lastLCC; 7508 WORD wEEPROMAddress = wAddress + 3; 7509 DWORD i; 7510 BYTE byResult; 7511 *pwResult = 0; 7512 lastLCC = inb(wEEPROMAddress); 7513 lastLCC = lastLCC | 0x02; 7514 lastLCC = lastLCC & 0xfe; 7515 outb(lastLCC, wEEPROMAddress); /* CS hi, SK lo */ 7516 7517 mdelay(1); /* delay */ 7518 7519 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1); 7520 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1); 7521 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 0); 7522 for (i = 0; i < 8; i++) { 7523 PCIEE_WriteBit(wEEPROMAddress, lastLCC, wLoc & 0x80 ? 1 : 0); 7524 wLoc <<= 1; 7525 } 7526 7527 for (i = 0; i < 16; i++) { 7528 byResult = PCIEE_ReadBit(wEEPROMAddress, lastLCC); 7529 *pwResult = (*pwResult << 1) | byResult; 7530 } 7531 7532 mdelay(1); /* another delay */ 7533 7534 lastLCC = lastLCC & 0xfd; 7535 outb(lastLCC, wEEPROMAddress); /* negate CS */ 7536 7537 return 0; 7538} 7539 7540static DWORD PCIEE_GetSerialNumber(WORD wAddress) 7541{ 7542 WORD wLo, wHi; 7543 if (PCIEE_ReadWord(wAddress, 62, &wLo)) 7544 return 0; 7545 if (PCIEE_ReadWord(wAddress, 63, &wHi)) 7546 return 0; 7547 return (((DWORD) wHi << 16) | wLo); 7548} 7549 7550static int dspio[IXJMAX + 1] = 7551{ 7552 0, 7553}; 7554static int xio[IXJMAX + 1] = 7555{ 7556 0, 7557}; 7558 7559module_param_array(dspio, int, NULL, 0); 7560module_param_array(xio, int, NULL, 0); 7561MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net"); 7562MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>"); 7563MODULE_LICENSE("GPL"); 7564 7565static void __exit ixj_exit(void) 7566{ 7567 cleanup(); 7568} 7569 7570static IXJ *new_ixj(unsigned long port) 7571{ 7572 IXJ *res; 7573 if (!request_region(port, 16, "ixj DSP")) { 7574 printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", port); 7575 return NULL; 7576 } 7577 res = ixj_alloc(); 7578 if (!res) { 7579 release_region(port, 16); 7580 printk(KERN_INFO "ixj: out of memory\n"); 7581 return NULL; 7582 } 7583 res->DSPbase = port; 7584 return res; 7585} 7586 7587static int __init ixj_probe_isapnp(int *cnt) 7588{ 7589 int probe = 0; 7590 int func = 0x110; 7591 struct pnp_dev *dev = NULL, *old_dev = NULL; 7592 7593 while (1) { 7594 do { 7595 IXJ *j; 7596 int result; 7597 7598 old_dev = dev; 7599 dev = pnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'), 7600 ISAPNP_FUNCTION(func), old_dev); 7601 if (!dev || !dev->card) 7602 break; 7603 result = pnp_device_attach(dev); 7604 if (result < 0) { 7605 printk("pnp attach failed %d \n", result); 7606 break; 7607 } 7608 if (pnp_activate_dev(dev) < 0) { 7609 printk("pnp activate failed (out of resources?)\n"); 7610 pnp_device_detach(dev); 7611 return -ENOMEM; 7612 } 7613 7614 if (!pnp_port_valid(dev, 0)) { 7615 pnp_device_detach(dev); 7616 return -ENODEV; 7617 } 7618 7619 j = new_ixj(pnp_port_start(dev, 0)); 7620 if (!j) 7621 break; 7622 7623 if (func != 0x110) 7624 j->XILINXbase = pnp_port_start(dev, 1); /* get real port */ 7625 7626 switch (func) { 7627 case (0x110): 7628 j->cardtype = QTI_PHONEJACK; 7629 break; 7630 case (0x310): 7631 j->cardtype = QTI_LINEJACK; 7632 break; 7633 case (0x410): 7634 j->cardtype = QTI_PHONEJACK_LITE; 7635 break; 7636 } 7637 j->board = *cnt; 7638 probe = ixj_selfprobe(j); 7639 if(!probe) { 7640 j->serial = dev->card->serial; 7641 j->dev = dev; 7642 switch (func) { 7643 case 0x110: 7644 printk(KERN_INFO "ixj: found Internet PhoneJACK at 0x%x\n", j->DSPbase); 7645 break; 7646 case 0x310: 7647 printk(KERN_INFO "ixj: found Internet LineJACK at 0x%x\n", j->DSPbase); 7648 break; 7649 case 0x410: 7650 printk(KERN_INFO "ixj: found Internet PhoneJACK Lite at 0x%x\n", j->DSPbase); 7651 break; 7652 } 7653 } 7654 ++*cnt; 7655 } while (dev); 7656 if (func == 0x410) 7657 break; 7658 if (func == 0x310) 7659 func = 0x410; 7660 if (func == 0x110) 7661 func = 0x310; 7662 dev = NULL; 7663 } 7664 return probe; 7665} 7666 7667static int __init ixj_probe_isa(int *cnt) 7668{ 7669 int i, probe; 7670 7671 /* Use passed parameters for older kernels without PnP */ 7672 for (i = 0; i < IXJMAX; i++) { 7673 if (dspio[i]) { 7674 IXJ *j = new_ixj(dspio[i]); 7675 7676 if (!j) 7677 break; 7678 7679 j->XILINXbase = xio[i]; 7680 j->cardtype = 0; 7681 7682 j->board = *cnt; 7683 probe = ixj_selfprobe(j); 7684 j->dev = NULL; 7685 ++*cnt; 7686 } 7687 } 7688 return 0; 7689} 7690 7691static int __init ixj_probe_pci(int *cnt) 7692{ 7693 struct pci_dev *pci = NULL; 7694 int i, probe = 0; 7695 IXJ *j = NULL; 7696 7697 for (i = 0; i < IXJMAX - *cnt; i++) { 7698 pci = pci_get_device(PCI_VENDOR_ID_QUICKNET, 7699 PCI_DEVICE_ID_QUICKNET_XJ, pci); 7700 if (!pci) 7701 break; 7702 7703 if (pci_enable_device(pci)) 7704 break; 7705 j = new_ixj(pci_resource_start(pci, 0)); 7706 if (!j) 7707 break; 7708 7709 j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2); 7710 j->XILINXbase = j->DSPbase + 0x10; 7711 j->cardtype = QTI_PHONEJACK_PCI; 7712 j->board = *cnt; 7713 probe = ixj_selfprobe(j); 7714 if (!probe) 7715 printk(KERN_INFO "ixj: found Internet PhoneJACK PCI at 0x%x\n", j->DSPbase); 7716 ++*cnt; 7717 } 7718 pci_dev_put(pci); 7719 return probe; 7720} 7721 7722static int __init ixj_init(void) 7723{ 7724 int cnt = 0; 7725 int probe = 0; 7726 7727 cnt = 0; 7728 7729 /* These might be no-ops, see above. */ 7730 if ((probe = ixj_probe_isapnp(&cnt)) < 0) { 7731 return probe; 7732 } 7733 if ((probe = ixj_probe_isa(&cnt)) < 0) { 7734 return probe; 7735 } 7736 if ((probe = ixj_probe_pci(&cnt)) < 0) { 7737 return probe; 7738 } 7739 printk(KERN_INFO "ixj driver initialized.\n"); 7740 create_proc_read_entry ("ixj", 0, NULL, ixj_read_proc, NULL); 7741 return probe; 7742} 7743 7744module_init(ixj_init); 7745module_exit(ixj_exit); 7746 7747static void DAA_Coeff_US(IXJ *j) 7748{ 7749 int i; 7750 7751 j->daa_country = DAA_US; 7752 /*----------------------------------------------- */ 7753 /* CAO */ 7754 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) { 7755 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0; 7756 } 7757 7758/* Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00 */ 7759 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x03; 7760 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0x4B; 7761 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x5D; 7762 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xCD; 7763 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x24; 7764 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xC5; 7765 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0; 7766 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00; 7767/* Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08 */ 7768 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x71; 7769 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x1A; 7770 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00; 7771 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A; 7772 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xB5; 7773 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33; 7774 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0; 7775 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08; 7776/* Bytes for FRX-filter (08): 03,8F,48,F2,8F,48,70,08 */ 7777 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x05; 7778 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xA3; 7779 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x72; 7780 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34; 7781 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x3F; 7782 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x3B; 7783 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30; 7784 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08; 7785/* Bytes for FRR-filter (07): 04,8F,38,7F,9B,EA,B0,08 */ 7786 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x05; 7787 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87; 7788 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9; 7789 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x3E; 7790 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x32; 7791 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xDA; 7792 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0; 7793 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08; 7794/* Bytes for AX-filter (0A): 16,55,DD,CA */ 7795 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x41; 7796 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5; 7797 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD; 7798 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA; 7799/* Bytes for AR-filter (09): 52,D3,11,42 */ 7800 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25; 7801 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7; 7802 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10; 7803 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6; 7804/* Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98 */ 7805 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00; 7806 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42; 7807 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48; 7808 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81; 7809 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA5; 7810 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80; 7811 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00; 7812 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98; 7813/* Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD */ 7814 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02; 7815 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xA2; 7816 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2B; 7817 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0; 7818 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8; 7819 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAB; 7820 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81; 7821 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xCC; 7822/* Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB */ 7823 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00; 7824 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88; 7825 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xD2; 7826 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x24; 7827 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBA; 7828 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xA9; 7829 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x3B; 7830 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xA6; 7831/* ; (10K, 0.68uF) */ 7832 /* */ 7833 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */ 7834 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B; 7835 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C; 7836 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93; 7837 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A; 7838 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22; 7839 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12; 7840 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3; 7841 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23; 7842 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */ 7843 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12; 7844 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2; 7845 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; 7846 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA; 7847 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22; 7848 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A; 7849 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; 7850 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5; 7851 7852 /* Levelmetering Ringing (0D):B2,45,0F,8E */ 7853 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; 7854 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35; 7855 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; 7856 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; 7857 7858 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */ 7859/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1C; */ 7860/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0xB3; */ 7861/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0xAB; */ 7862/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xAB; */ 7863/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x54; */ 7864/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x2D; */ 7865/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0x62; */ 7866/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x2D; */ 7867 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */ 7868/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x2D; */ 7869/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x62; */ 7870/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; */ 7871/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBB; */ 7872/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x2A; */ 7873/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7D; */ 7874/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; */ 7875/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD4; */ 7876/* */ 7877 /* Levelmetering Ringing (0D):B2,45,0F,8E */ 7878/* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; */ 7879/* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x05; */ 7880/* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; */ 7881/* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; */ 7882 7883 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */ 7884 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA; 7885 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E; 7886 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA; 7887 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09; 7888 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99; 7889 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99; 7890 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99; 7891 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99; 7892/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */ 7893 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD; 7894 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5; 7895 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA; 7896 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07; 7897 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA; 7898 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00; 7899 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00; 7900 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00; 7901/* */ 7902 /* ;CR Registers */ 7903 /* Config. Reg. 0 (filters) (cr0):FE ; CLK gen. by crystal */ 7904 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF; 7905/* Config. Reg. 1 (dialing) (cr1):05 */ 7906 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05; 7907/* Config. Reg. 2 (caller ID) (cr2):04 */ 7908 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04; 7909/* Config. Reg. 3 (testloops) (cr3):03 ; SEL Bit==0, HP-disabled */ 7910 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00; 7911/* Config. Reg. 4 (analog gain) (cr4):02 */ 7912 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02; 7913 /* Config. Reg. 5 (Version) (cr5):02 */ 7914 /* Config. Reg. 6 (Reserved) (cr6):00 */ 7915 /* Config. Reg. 7 (Reserved) (cr7):00 */ 7916 /* */ 7917 /* ;xr Registers */ 7918 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */ 7919 7920 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */ 7921 /* Ext. Reg. 1 (Interrupt enable) (xr1):3C Cadence, RING, Caller ID, VDD_OK */ 7922 7923 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x3C; 7924/* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */ 7925 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D; 7926/* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off == 1 */ 7927 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x3B; /*0x32; */ 7928 /* Ext. Reg. 4 (Cadence) (xr4):00 */ 7929 7930 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00; 7931/* Ext. Reg. 5 (Ring timer) (xr5):22 */ 7932 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22; 7933/* Ext. Reg. 6 (Power State) (xr6):00 */ 7934 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00; 7935/* Ext. Reg. 7 (Vdd) (xr7):40 */ 7936 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */ 7937 /* */ 7938 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */ 7939 /* 12,33,5A,C3 ; 770 Hz */ 7940 /* 13,3C,5B,32 ; 852 Hz */ 7941 /* 1D,1B,5C,CC ; 941 Hz */ 7942 7943 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11; 7944 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3; 7945 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A; 7946 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C; 7947/* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */ 7948 /* EC,1D,52,22 ; 1336 Hz */ 7949 /* AA,AC,51,D2 ; 1477 Hz */ 7950 /* 9B,3B,51,25 ; 1633 Hz */ 7951 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32; 7952 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32; 7953 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52; 7954 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3; 7955} 7956 7957static void DAA_Coeff_UK(IXJ *j) 7958{ 7959 int i; 7960 7961 j->daa_country = DAA_UK; 7962 /*----------------------------------------------- */ 7963 /* CAO */ 7964 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) { 7965 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0; 7966 } 7967 7968/* Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00 */ 7969 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00; 7970 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xC2; 7971 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB; 7972 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xA8; 7973 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xCB; 7974 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81; 7975 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0; 7976 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00; 7977/* Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08 */ 7978 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x40; 7979 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x00; 7980 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00; 7981 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A; 7982 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xA4; 7983 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33; 7984 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0; 7985 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08; 7986/* Bytes for FRX-filter (08): 07,9B,ED,24,B2,A2,A0,08 */ 7987 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07; 7988 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9B; 7989 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xED; 7990 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x24; 7991 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0xB2; 7992 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0xA2; 7993 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xA0; 7994 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08; 7995/* Bytes for FRR-filter (07): 0F,92,F2,B2,87,D2,30,08 */ 7996 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F; 7997 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x92; 7998 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF2; 7999 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0xB2; 8000 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87; 8001 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xD2; 8002 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x30; 8003 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08; 8004/* Bytes for AX-filter (0A): 1B,A5,DD,CA */ 8005 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x1B; 8006 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xA5; 8007 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD; 8008 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA; 8009/* Bytes for AR-filter (09): E2,27,10,D6 */ 8010 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2; 8011 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x27; 8012 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10; 8013 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6; 8014/* Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98 */ 8015 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80; 8016 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x2D; 8017 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x38; 8018 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x8B; 8019 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xD0; 8020 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x00; 8021 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00; 8022 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98; 8023/* Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4 */ 8024 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02; 8025 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x5A; 8026 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x53; 8027 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xF0; 8028 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x0B; 8029 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5F; 8030 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x84; 8031 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xD4; 8032/* Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32 */ 8033 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00; 8034 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88; 8035 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x6A; 8036 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA4; 8037 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x8F; 8038 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x52; 8039 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xF5; 8040 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x32; 8041/* ; idle */ 8042 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */ 8043 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B; 8044 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C; 8045 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93; 8046 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A; 8047 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22; 8048 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12; 8049 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3; 8050 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23; 8051/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */ 8052 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12; 8053 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2; 8054 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; 8055 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA; 8056 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22; 8057 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A; 8058 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; 8059 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5; 8060/* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V less possible? */ 8061 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; 8062 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35; 8063 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; 8064 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; 8065/* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */ 8066 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA; 8067 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E; 8068 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA; 8069 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09; 8070 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99; 8071 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99; 8072 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99; 8073 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99; 8074/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */ 8075 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD; 8076 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5; 8077 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA; 8078 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07; 8079 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA; 8080 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00; 8081 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00; 8082 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00; 8083/* ;CR Registers */ 8084 /* Config. Reg. 0 (filters) (cr0):FF */ 8085 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF; 8086/* Config. Reg. 1 (dialing) (cr1):05 */ 8087 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05; 8088/* Config. Reg. 2 (caller ID) (cr2):04 */ 8089 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04; 8090/* Config. Reg. 3 (testloops) (cr3):00 ; */ 8091 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00; 8092/* Config. Reg. 4 (analog gain) (cr4):02 */ 8093 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02; 8094 /* Config. Reg. 5 (Version) (cr5):02 */ 8095 /* Config. Reg. 6 (Reserved) (cr6):00 */ 8096 /* Config. Reg. 7 (Reserved) (cr7):00 */ 8097 /* ;xr Registers */ 8098 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */ 8099 8100 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */ 8101 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */ 8102 8103 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */ 8104 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */ 8105 8106 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D; 8107/* Ext. Reg. 3 (DC Char) (xr3):36 ; */ 8108 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36; 8109/* Ext. Reg. 4 (Cadence) (xr4):00 */ 8110 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00; 8111/* Ext. Reg. 5 (Ring timer) (xr5):22 */ 8112 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22; 8113/* Ext. Reg. 6 (Power State) (xr6):00 */ 8114 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00; 8115/* Ext. Reg. 7 (Vdd) (xr7):46 */ 8116 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */ 8117 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */ 8118 /* 12,33,5A,C3 ; 770 Hz */ 8119 /* 13,3C,5B,32 ; 852 Hz */ 8120 /* 1D,1B,5C,CC ; 941 Hz */ 8121 8122 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11; 8123 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3; 8124 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A; 8125 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C; 8126/* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */ 8127 /* EC,1D,52,22 ; 1336 Hz */ 8128 /* AA,AC,51,D2 ; 1477 Hz */ 8129 /* 9B,3B,51,25 ; 1633 Hz */ 8130 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32; 8131 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32; 8132 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52; 8133 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3; 8134} 8135 8136 8137static void DAA_Coeff_France(IXJ *j) 8138{ 8139 int i; 8140 8141 j->daa_country = DAA_FRANCE; 8142 /*----------------------------------------------- */ 8143 /* CAO */ 8144 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) { 8145 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0; 8146 } 8147 8148/* Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00 */ 8149 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x02; 8150 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA2; 8151 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x43; 8152 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2C; 8153 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x22; 8154 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xAF; 8155 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0; 8156 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00; 8157/* Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08 */ 8158 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x67; 8159 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xCE; 8160 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00; 8161 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x2C; 8162 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x22; 8163 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33; 8164 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0; 8165 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08; 8166/* Bytes for FRX-filter (08): 07,9A,28,F6,23,4A,B0,08 */ 8167 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07; 8168 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9A; 8169 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x28; 8170 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0xF6; 8171 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x23; 8172 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x4A; 8173 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xB0; 8174 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08; 8175/* Bytes for FRR-filter (07): 03,8F,F9,2F,9E,FA,20,08 */ 8176 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03; 8177 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F; 8178 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9; 8179 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F; 8180 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9E; 8181 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xFA; 8182 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20; 8183 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08; 8184/* Bytes for AX-filter (0A): 16,B5,DD,CA */ 8185 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x16; 8186 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5; 8187 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD; 8188 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA; 8189/* Bytes for AR-filter (09): 52,C7,10,D6 */ 8190 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2; 8191 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7; 8192 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10; 8193 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6; 8194/* Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98 */ 8195 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00; 8196 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42; 8197 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48; 8198 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81; 8199 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA6; 8200 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80; 8201 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00; 8202 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98; 8203/* Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C */ 8204 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02; 8205 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAC; 8206 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A; 8207 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x30; 8208 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x78; 8209 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAC; 8210 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x8A; 8211 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x2C; 8212/* Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45 */ 8213 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00; 8214 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88; 8215 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA; 8216 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA5; 8217 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x22; 8218 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA; 8219 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2C; 8220 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x45; 8221/* ; idle */ 8222 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */ 8223 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B; 8224 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C; 8225 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93; 8226 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A; 8227 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22; 8228 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12; 8229 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3; 8230 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23; 8231/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */ 8232 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12; 8233 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2; 8234 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; 8235 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA; 8236 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22; 8237 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A; 8238 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; 8239 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5; 8240/* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */ 8241 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32; 8242 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45; 8243 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5; 8244 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84; 8245/* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */ 8246 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA; 8247 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E; 8248 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA; 8249 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09; 8250 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99; 8251 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99; 8252 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99; 8253 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99; 8254/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */ 8255 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD; 8256 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5; 8257 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA; 8258 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07; 8259 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA; 8260 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00; 8261 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00; 8262 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00; 8263/* ;CR Registers */ 8264 /* Config. Reg. 0 (filters) (cr0):FF */ 8265 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF; 8266/* Config. Reg. 1 (dialing) (cr1):05 */ 8267 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05; 8268/* Config. Reg. 2 (caller ID) (cr2):04 */ 8269 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04; 8270/* Config. Reg. 3 (testloops) (cr3):00 ; */ 8271 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00; 8272/* Config. Reg. 4 (analog gain) (cr4):02 */ 8273 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02; 8274 /* Config. Reg. 5 (Version) (cr5):02 */ 8275 /* Config. Reg. 6 (Reserved) (cr6):00 */ 8276 /* Config. Reg. 7 (Reserved) (cr7):00 */ 8277 /* ;xr Registers */ 8278 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */ 8279 8280 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */ 8281 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */ 8282 8283 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */ 8284 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */ 8285 8286 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D; 8287/* Ext. Reg. 3 (DC Char) (xr3):36 ; */ 8288 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36; 8289/* Ext. Reg. 4 (Cadence) (xr4):00 */ 8290 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00; 8291/* Ext. Reg. 5 (Ring timer) (xr5):22 */ 8292 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22; 8293/* Ext. Reg. 6 (Power State) (xr6):00 */ 8294 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00; 8295/* Ext. Reg. 7 (Vdd) (xr7):46 */ 8296 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */ 8297 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */ 8298 /* 12,33,5A,C3 ; 770 Hz */ 8299 /* 13,3C,5B,32 ; 852 Hz */ 8300 /* 1D,1B,5C,CC ; 941 Hz */ 8301 8302 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11; 8303 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3; 8304 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A; 8305 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C; 8306/* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */ 8307 /* EC,1D,52,22 ; 1336 Hz */ 8308 /* AA,AC,51,D2 ; 1477 Hz */ 8309 /* 9B,3B,51,25 ; 1633 Hz */ 8310 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32; 8311 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32; 8312 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52; 8313 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3; 8314} 8315 8316 8317static void DAA_Coeff_Germany(IXJ *j) 8318{ 8319 int i; 8320 8321 j->daa_country = DAA_GERMANY; 8322 /*----------------------------------------------- */ 8323 /* CAO */ 8324 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) { 8325 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0; 8326 } 8327 8328/* Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00 */ 8329 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00; 8330 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xCE; 8331 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB; 8332 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xB8; 8333 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xD2; 8334 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81; 8335 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xB0; 8336 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00; 8337/* Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08 */ 8338 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x45; 8339 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x8F; 8340 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00; 8341 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0C; 8342 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xD2; 8343 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x3A; 8344 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xD0; 8345 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08; 8346/* Bytes for FRX-filter (08): 07,AA,E2,34,24,89,20,08 */ 8347 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07; 8348 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xAA; 8349 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2; 8350 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34; 8351 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x24; 8352 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x89; 8353 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x20; 8354 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08; 8355/* Bytes for FRR-filter (07): 02,87,FA,37,9A,CA,B0,08 */ 8356 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x02; 8357 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87; 8358 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xFA; 8359 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x37; 8360 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9A; 8361 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCA; 8362 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0; 8363 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08; 8364/* Bytes for AX-filter (0A): 72,D5,DD,CA */ 8365 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x72; 8366 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xD5; 8367 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD; 8368 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA; 8369/* Bytes for AR-filter (09): 72,42,13,4B */ 8370 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x72; 8371 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x42; 8372 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x13; 8373 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x4B; 8374/* Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98 */ 8375 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80; 8376 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52; 8377 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48; 8378 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81; 8379 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAD; 8380 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80; 8381 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00; 8382 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98; 8383/* Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27 */ 8384 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02; 8385 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x42; 8386 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x5A; 8387 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20; 8388 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8; 8389 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x1A; 8390 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81; 8391 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x27; 8392/* Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2 */ 8393 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00; 8394 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88; 8395 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x63; 8396 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x26; 8397 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBD; 8398 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x4B; 8399 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xA3; 8400 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xC2; 8401/* ; (10K, 0.68uF) */ 8402 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */ 8403 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B; 8404 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3B; 8405 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x9B; 8406 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xBA; 8407 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0xD4; 8408 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x1C; 8409 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xB3; 8410 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23; 8411/* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */ 8412 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x13; 8413 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42; 8414 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; 8415 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA; 8416 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0xD4; 8417 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x73; 8418 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0xCA; 8419 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5; 8420/* Levelmetering Ringing (0D):B2,45,0F,8E */ 8421 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xB2; 8422 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45; 8423 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; 8424 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; 8425/* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */ 8426 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA; 8427 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E; 8428 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA; 8429 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09; 8430 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99; 8431 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99; 8432 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99; 8433 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99; 8434/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */ 8435 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD; 8436 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5; 8437 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA; 8438 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07; 8439 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA; 8440 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00; 8441 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00; 8442 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00; 8443/* ;CR Registers */ 8444 /* Config. Reg. 0 (filters) (cr0):FF ; all Filters enabled, CLK from ext. source */ 8445 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF; 8446/* Config. Reg. 1 (dialing) (cr1):05 ; Manual Ring, Ring metering enabled */ 8447 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05; 8448/* Config. Reg. 2 (caller ID) (cr2):04 ; Analog Gain 0dB, FSC internal */ 8449 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04; 8450/* Config. Reg. 3 (testloops) (cr3):00 ; SEL Bit==0, HP-enabled */ 8451 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00; 8452/* Config. Reg. 4 (analog gain) (cr4):02 */ 8453 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02; 8454 /* Config. Reg. 5 (Version) (cr5):02 */ 8455 /* Config. Reg. 6 (Reserved) (cr6):00 */ 8456 /* Config. Reg. 7 (Reserved) (cr7):00 */ 8457 /* ;xr Registers */ 8458 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */ 8459 8460 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */ 8461 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C ; Ring, CID, VDDOK Interrupts enabled */ 8462 8463 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */ 8464 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */ 8465 8466 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D; 8467/* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm */ 8468 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x32; 8469/* Ext. Reg. 4 (Cadence) (xr4):00 */ 8470 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00; 8471/* Ext. Reg. 5 (Ring timer) (xr5):22 */ 8472 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22; 8473/* Ext. Reg. 6 (Power State) (xr6):00 */ 8474 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00; 8475/* Ext. Reg. 7 (Vdd) (xr7):40 ; VDD=4.25 V */ 8476 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */ 8477 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */ 8478 /* 12,33,5A,C3 ; 770 Hz */ 8479 /* 13,3C,5B,32 ; 852 Hz */ 8480 /* 1D,1B,5C,CC ; 941 Hz */ 8481 8482 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11; 8483 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3; 8484 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A; 8485 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C; 8486/* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */ 8487 /* EC,1D,52,22 ; 1336 Hz */ 8488 /* AA,AC,51,D2 ; 1477 Hz */ 8489 /* 9B,3B,51,25 ; 1633 Hz */ 8490 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32; 8491 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32; 8492 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52; 8493 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3; 8494} 8495 8496 8497static void DAA_Coeff_Australia(IXJ *j) 8498{ 8499 int i; 8500 8501 j->daa_country = DAA_AUSTRALIA; 8502 /*----------------------------------------------- */ 8503 /* CAO */ 8504 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) { 8505 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0; 8506 } 8507 8508/* Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00 */ 8509 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00; 8510 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA3; 8511 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xAA; 8512 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x28; 8513 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xB3; 8514 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x82; 8515 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xD0; 8516 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00; 8517/* Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08 */ 8518 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x70; 8519 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x96; 8520 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00; 8521 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x09; 8522 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x32; 8523 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x6B; 8524 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xC0; 8525 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08; 8526/* Bytes for FRX-filter (08): 07,96,E2,34,32,9B,30,08 */ 8527 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07; 8528 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x96; 8529 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2; 8530 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34; 8531 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x32; 8532 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x9B; 8533 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30; 8534 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08; 8535/* Bytes for FRR-filter (07): 0F,9A,E9,2F,22,CC,A0,08 */ 8536 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F; 8537 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x9A; 8538 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xE9; 8539 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F; 8540 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x22; 8541 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCC; 8542 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xA0; 8543 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08; 8544/* Bytes for AX-filter (0A): CB,45,DD,CA */ 8545 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0xCB; 8546 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x45; 8547 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD; 8548 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA; 8549/* Bytes for AR-filter (09): 1B,67,10,D6 */ 8550 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x1B; 8551 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x67; 8552 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10; 8553 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6; 8554/* Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98 */ 8555 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80; 8556 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52; 8557 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48; 8558 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81; 8559 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAF; 8560 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80; 8561 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00; 8562 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98; 8563/* Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC */ 8564 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02; 8565 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xDB; 8566 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x52; 8567 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0; 8568 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x38; 8569 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x01; 8570 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x82; 8571 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAC; 8572/* Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46 */ 8573 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00; 8574 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88; 8575 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x4A; 8576 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x3E; 8577 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x2C; 8578 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x3B; 8579 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x24; 8580 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x46; 8581/* ; idle */ 8582 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */ 8583 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B; 8584 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C; 8585 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93; 8586 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A; 8587 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22; 8588 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12; 8589 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3; 8590 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23; 8591/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */ 8592 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12; 8593 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2; 8594 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; 8595 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA; 8596 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22; 8597 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A; 8598 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; 8599 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5; 8600/* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */ 8601 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32; 8602 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45; 8603 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5; 8604 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84; 8605/* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */ 8606 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA; 8607 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E; 8608 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA; 8609 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09; 8610 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99; 8611 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99; 8612 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99; 8613 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99; 8614/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */ 8615 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD; 8616 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5; 8617 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA; 8618 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07; 8619 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA; 8620 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00; 8621 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00; 8622 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00; 8623/* ;CR Registers */ 8624 /* Config. Reg. 0 (filters) (cr0):FF */ 8625 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF; 8626/* Config. Reg. 1 (dialing) (cr1):05 */ 8627 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05; 8628/* Config. Reg. 2 (caller ID) (cr2):04 */ 8629 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04; 8630/* Config. Reg. 3 (testloops) (cr3):00 ; */ 8631 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00; 8632/* Config. Reg. 4 (analog gain) (cr4):02 */ 8633 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02; 8634 /* Config. Reg. 5 (Version) (cr5):02 */ 8635 /* Config. Reg. 6 (Reserved) (cr6):00 */ 8636 /* Config. Reg. 7 (Reserved) (cr7):00 */ 8637 /* ;xr Registers */ 8638 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */ 8639 8640 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */ 8641 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */ 8642 8643 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */ 8644 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */ 8645 8646 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D; 8647/* Ext. Reg. 3 (DC Char) (xr3):2B ; */ 8648 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x2B; 8649/* Ext. Reg. 4 (Cadence) (xr4):00 */ 8650 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00; 8651/* Ext. Reg. 5 (Ring timer) (xr5):22 */ 8652 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22; 8653/* Ext. Reg. 6 (Power State) (xr6):00 */ 8654 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00; 8655/* Ext. Reg. 7 (Vdd) (xr7):40 */ 8656 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */ 8657 8658 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */ 8659 /* 12,33,5A,C3 ; 770 Hz */ 8660 /* 13,3C,5B,32 ; 852 Hz */ 8661 /* 1D,1B,5C,CC ; 941 Hz */ 8662 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11; 8663 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3; 8664 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A; 8665 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C; 8666 8667 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */ 8668 /* EC,1D,52,22 ; 1336 Hz */ 8669 /* AA,AC,51,D2 ; 1477 Hz */ 8670 /* 9B,3B,51,25 ; 1633 Hz */ 8671 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32; 8672 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32; 8673 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52; 8674 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3; 8675} 8676 8677static void DAA_Coeff_Japan(IXJ *j) 8678{ 8679 int i; 8680 8681 j->daa_country = DAA_JAPAN; 8682 /*----------------------------------------------- */ 8683 /* CAO */ 8684 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) { 8685 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0; 8686 } 8687 8688/* Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00 */ 8689 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x06; 8690 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xBD; 8691 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2; 8692 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2D; 8693 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xBA; 8694 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xF9; 8695 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0; 8696 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00; 8697/* Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08 */ 8698 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x6F; 8699 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xF7; 8700 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00; 8701 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0E; 8702 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x34; 8703 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33; 8704 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0; 8705 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08; 8706/* Bytes for FRX-filter (08): 02,8F,68,77,9C,58,F0,08 */ 8707 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x02; 8708 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F; 8709 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x68; 8710 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x77; 8711 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x9C; 8712 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x58; 8713 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xF0; 8714 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08; 8715/* Bytes for FRR-filter (07): 03,8F,38,73,87,EA,20,08 */ 8716 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03; 8717 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F; 8718 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0x38; 8719 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x73; 8720 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87; 8721 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA; 8722 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20; 8723 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08; 8724/* Bytes for AX-filter (0A): 51,C5,DD,CA */ 8725 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x51; 8726 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xC5; 8727 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD; 8728 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA; 8729/* Bytes for AR-filter (09): 25,A7,10,D6 */ 8730 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25; 8731 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xA7; 8732 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10; 8733 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6; 8734/* Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98 */ 8735 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00; 8736 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42; 8737 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48; 8738 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81; 8739 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAE; 8740 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80; 8741 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00; 8742 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98; 8743/* Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28 */ 8744 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02; 8745 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAB; 8746 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A; 8747 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20; 8748 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x99; 8749 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5B; 8750 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x89; 8751 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x28; 8752/* Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA */ 8753 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00; 8754 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88; 8755 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA; 8756 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x25; 8757 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x34; 8758 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xC5; 8759 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x4C; 8760 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBA; 8761/* ; idle */ 8762 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */ 8763 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B; 8764 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C; 8765 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93; 8766 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A; 8767 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22; 8768 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12; 8769 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3; 8770 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23; 8771/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */ 8772 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12; 8773 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2; 8774 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; 8775 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA; 8776 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22; 8777 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A; 8778 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; 8779 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5; 8780/* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V ????????? */ 8781 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; 8782 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35; 8783 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; 8784 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; 8785/* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */ 8786 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA; 8787 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E; 8788 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA; 8789 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09; 8790 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99; 8791 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99; 8792 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99; 8793 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99; 8794/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */ 8795 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD; 8796 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5; 8797 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA; 8798 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07; 8799 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA; 8800 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00; 8801 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00; 8802 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00; 8803/* ;CR Registers */ 8804 /* Config. Reg. 0 (filters) (cr0):FF */ 8805 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF; 8806/* Config. Reg. 1 (dialing) (cr1):05 */ 8807 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05; 8808/* Config. Reg. 2 (caller ID) (cr2):04 */ 8809 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04; 8810/* Config. Reg. 3 (testloops) (cr3):00 ; */ 8811 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00; 8812/* Config. Reg. 4 (analog gain) (cr4):02 */ 8813 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02; 8814 /* Config. Reg. 5 (Version) (cr5):02 */ 8815 /* Config. Reg. 6 (Reserved) (cr6):00 */ 8816 /* Config. Reg. 7 (Reserved) (cr7):00 */ 8817 /* ;xr Registers */ 8818 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */ 8819 8820 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */ 8821 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */ 8822 8823 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */ 8824 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */ 8825 8826 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D; 8827/* Ext. Reg. 3 (DC Char) (xr3):22 ; */ 8828 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x22; 8829/* Ext. Reg. 4 (Cadence) (xr4):00 */ 8830 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00; 8831/* Ext. Reg. 5 (Ring timer) (xr5):22 */ 8832 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22; 8833/* Ext. Reg. 6 (Power State) (xr6):00 */ 8834 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00; 8835/* Ext. Reg. 7 (Vdd) (xr7):40 */ 8836 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */ 8837 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */ 8838 /* 12,33,5A,C3 ; 770 Hz */ 8839 /* 13,3C,5B,32 ; 852 Hz */ 8840 /* 1D,1B,5C,CC ; 941 Hz */ 8841 8842 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11; 8843 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3; 8844 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A; 8845 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C; 8846/* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */ 8847 /* EC,1D,52,22 ; 1336 Hz */ 8848 /* AA,AC,51,D2 ; 1477 Hz */ 8849 /* 9B,3B,51,25 ; 1633 Hz */ 8850 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32; 8851 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32; 8852 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52; 8853 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3; 8854} 8855 8856static s16 tone_table[][19] = 8857{ 8858 { /* f20_50[] 11 */ 8859 32538, /* A1 = 1.985962 */ 8860 -32325, /* A2 = -0.986511 */ 8861 -343, /* B2 = -0.010493 */ 8862 0, /* B1 = 0 */ 8863 343, /* B0 = 0.010493 */ 8864 32619, /* A1 = 1.990906 */ 8865 -32520, /* A2 = -0.992462 */ 8866 19179, /* B2 = 0.585327 */ 8867 -19178, /* B1 = -1.170593 */ 8868 19179, /* B0 = 0.585327 */ 8869 32723, /* A1 = 1.997314 */ 8870 -32686, /* A2 = -0.997528 */ 8871 9973, /* B2 = 0.304352 */ 8872 -9955, /* B1 = -0.607605 */ 8873 9973, /* B0 = 0.304352 */ 8874 7, /* Internal filter scaling */ 8875 159, /* Minimum in-band energy threshold */ 8876 21, /* 21/32 in-band to broad-band ratio */ 8877 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 8878 }, 8879 { /* f133_200[] 12 */ 8880 32072, /* A1 = 1.95752 */ 8881 -31896, /* A2 = -0.973419 */ 8882 -435, /* B2 = -0.013294 */ 8883 0, /* B1 = 0 */ 8884 435, /* B0 = 0.013294 */ 8885 32188, /* A1 = 1.9646 */ 8886 -32400, /* A2 = -0.98877 */ 8887 15139, /* B2 = 0.462036 */ 8888 -14882, /* B1 = -0.908356 */ 8889 15139, /* B0 = 0.462036 */ 8890 32473, /* A1 = 1.981995 */ 8891 -32524, /* A2 = -0.992584 */ 8892 23200, /* B2 = 0.708008 */ 8893 -23113, /* B1 = -1.410706 */ 8894 23200, /* B0 = 0.708008 */ 8895 7, /* Internal filter scaling */ 8896 159, /* Minimum in-band energy threshold */ 8897 21, /* 21/32 in-band to broad-band ratio */ 8898 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 8899 }, 8900 { /* f300 13 */ 8901 31769, /* A1 = -1.939026 */ 8902 -32584, /* A2 = 0.994385 */ 8903 -475, /* B2 = -0.014522 */ 8904 0, /* B1 = 0.000000 */ 8905 475, /* B0 = 0.014522 */ 8906 31789, /* A1 = -1.940247 */ 8907 -32679, /* A2 = 0.997284 */ 8908 17280, /* B2 = 0.527344 */ 8909 -16865, /* B1 = -1.029358 */ 8910 17280, /* B0 = 0.527344 */ 8911 31841, /* A1 = -1.943481 */ 8912 -32681, /* A2 = 0.997345 */ 8913 543, /* B2 = 0.016579 */ 8914 -525, /* B1 = -0.032097 */ 8915 543, /* B0 = 0.016579 */ 8916 5, /* Internal filter scaling */ 8917 159, /* Minimum in-band energy threshold */ 8918 21, /* 21/32 in-band to broad-band ratio */ 8919 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 8920 }, 8921 { /* f300_420[] 14 */ 8922 30750, /* A1 = 1.876892 */ 8923 -31212, /* A2 = -0.952515 */ 8924 -804, /* B2 = -0.024541 */ 8925 0, /* B1 = 0 */ 8926 804, /* B0 = 0.024541 */ 8927 30686, /* A1 = 1.872925 */ 8928 -32145, /* A2 = -0.980988 */ 8929 14747, /* B2 = 0.450043 */ 8930 -13703, /* B1 = -0.836395 */ 8931 14747, /* B0 = 0.450043 */ 8932 31651, /* A1 = 1.931824 */ 8933 -32321, /* A2 = -0.986389 */ 8934 24425, /* B2 = 0.745422 */ 8935 -23914, /* B1 = -1.459595 */ 8936 24427, /* B0 = 0.745483 */ 8937 7, /* Internal filter scaling */ 8938 159, /* Minimum in-band energy threshold */ 8939 21, /* 21/32 in-band to broad-band ratio */ 8940 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 8941 }, 8942 { /* f330 15 */ 8943 31613, /* A1 = -1.929565 */ 8944 -32646, /* A2 = 0.996277 */ 8945 -185, /* B2 = -0.005657 */ 8946 0, /* B1 = 0.000000 */ 8947 185, /* B0 = 0.005657 */ 8948 31620, /* A1 = -1.929932 */ 8949 -32713, /* A2 = 0.998352 */ 8950 19253, /* B2 = 0.587585 */ 8951 -18566, /* B1 = -1.133179 */ 8952 19253, /* B0 = 0.587585 */ 8953 31674, /* A1 = -1.933228 */ 8954 -32715, /* A2 = 0.998413 */ 8955 2575, /* B2 = 0.078590 */ 8956 -2495, /* B1 = -0.152283 */ 8957 2575, /* B0 = 0.078590 */ 8958 5, /* Internal filter scaling */ 8959 159, /* Minimum in-band energy threshold */ 8960 21, /* 21/32 in-band to broad-band ratio */ 8961 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 8962 }, 8963 { /* f300_425[] 16 */ 8964 30741, /* A1 = 1.876282 */ 8965 -31475, /* A2 = -0.960541 */ 8966 -703, /* B2 = -0.021484 */ 8967 0, /* B1 = 0 */ 8968 703, /* B0 = 0.021484 */ 8969 30688, /* A1 = 1.873047 */ 8970 -32248, /* A2 = -0.984161 */ 8971 14542, /* B2 = 0.443787 */ 8972 -13523, /* B1 = -0.825439 */ 8973 14542, /* B0 = 0.443817 */ 8974 31494, /* A1 = 1.922302 */ 8975 -32366, /* A2 = -0.987762 */ 8976 21577, /* B2 = 0.658508 */ 8977 -21013, /* B1 = -1.282532 */ 8978 21577, /* B0 = 0.658508 */ 8979 7, /* Internal filter scaling */ 8980 159, /* Minimum in-band energy threshold */ 8981 21, /* 21/32 in-band to broad-band ratio */ 8982 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 8983 }, 8984 { /* f330_440[] 17 */ 8985 30627, /* A1 = 1.869324 */ 8986 -31338, /* A2 = -0.95636 */ 8987 -843, /* B2 = -0.025749 */ 8988 0, /* B1 = 0 */ 8989 843, /* B0 = 0.025749 */ 8990 30550, /* A1 = 1.864685 */ 8991 -32221, /* A2 = -0.983337 */ 8992 13594, /* B2 = 0.414886 */ 8993 -12589, /* B1 = -0.768402 */ 8994 13594, /* B0 = 0.414886 */ 8995 31488, /* A1 = 1.921936 */ 8996 -32358, /* A2 = -0.987518 */ 8997 24684, /* B2 = 0.753296 */ 8998 -24029, /* B1 = -1.466614 */ 8999 24684, /* B0 = 0.753296 */ 9000 7, /* Internal filter scaling */ 9001 159, /* Minimum in-band energy threshold */ 9002 21, /* 21/32 in-band to broad-band ratio */ 9003 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9004 }, 9005 { /* f340 18 */ 9006 31546, /* A1 = -1.925476 */ 9007 -32646, /* A2 = 0.996277 */ 9008 -445, /* B2 = -0.013588 */ 9009 0, /* B1 = 0.000000 */ 9010 445, /* B0 = 0.013588 */ 9011 31551, /* A1 = -1.925781 */ 9012 -32713, /* A2 = 0.998352 */ 9013 23884, /* B2 = 0.728882 */ 9014 -22979, /* B1 = -1.402527 */ 9015 23884, /* B0 = 0.728882 */ 9016 31606, /* A1 = -1.929138 */ 9017 -32715, /* A2 = 0.998413 */ 9018 863, /* B2 = 0.026367 */ 9019 -835, /* B1 = -0.050985 */ 9020 863, /* B0 = 0.026367 */ 9021 5, /* Internal filter scaling */ 9022 159, /* Minimum in-band energy threshold */ 9023 21, /* 21/32 in-band to broad-band ratio */ 9024 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9025 }, 9026 { /* f350_400[] 19 */ 9027 31006, /* A1 = 1.892517 */ 9028 -32029, /* A2 = -0.977448 */ 9029 -461, /* B2 = -0.014096 */ 9030 0, /* B1 = 0 */ 9031 461, /* B0 = 0.014096 */ 9032 30999, /* A1 = 1.892029 */ 9033 -32487, /* A2 = -0.991455 */ 9034 11325, /* B2 = 0.345612 */ 9035 -10682, /* B1 = -0.651978 */ 9036 11325, /* B0 = 0.345612 */ 9037 31441, /* A1 = 1.919067 */ 9038 -32526, /* A2 = -0.992615 */ 9039 24324, /* B2 = 0.74231 */ 9040 -23535, /* B1 = -1.436523 */ 9041 24324, /* B0 = 0.74231 */ 9042 7, /* Internal filter scaling */ 9043 159, /* Minimum in-band energy threshold */ 9044 21, /* 21/32 in-band to broad-band ratio */ 9045 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9046 }, 9047 { /* f350_440[] */ 9048 30634, /* A1 = 1.869751 */ 9049 -31533, /* A2 = -0.962341 */ 9050 -680, /* B2 = -0.020782 */ 9051 0, /* B1 = 0 */ 9052 680, /* B0 = 0.020782 */ 9053 30571, /* A1 = 1.865906 */ 9054 -32277, /* A2 = -0.985016 */ 9055 12894, /* B2 = 0.393524 */ 9056 -11945, /* B1 = -0.729065 */ 9057 12894, /* B0 = 0.393524 */ 9058 31367, /* A1 = 1.91449 */ 9059 -32379, /* A2 = -0.988129 */ 9060 23820, /* B2 = 0.726929 */ 9061 -23104, /* B1 = -1.410217 */ 9062 23820, /* B0 = 0.726929 */ 9063 7, /* Internal filter scaling */ 9064 159, /* Minimum in-band energy threshold */ 9065 21, /* 21/32 in-band to broad-band ratio */ 9066 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9067 }, 9068 { /* f350_450[] */ 9069 30552, /* A1 = 1.864807 */ 9070 -31434, /* A2 = -0.95929 */ 9071 -690, /* B2 = -0.021066 */ 9072 0, /* B1 = 0 */ 9073 690, /* B0 = 0.021066 */ 9074 30472, /* A1 = 1.859924 */ 9075 -32248, /* A2 = -0.984161 */ 9076 13385, /* B2 = 0.408478 */ 9077 -12357, /* B1 = -0.754242 */ 9078 13385, /* B0 = 0.408478 */ 9079 31358, /* A1 = 1.914001 */ 9080 -32366, /* A2 = -0.987732 */ 9081 26488, /* B2 = 0.80835 */ 9082 -25692, /* B1 = -1.568176 */ 9083 26490, /* B0 = 0.808411 */ 9084 7, /* Internal filter scaling */ 9085 159, /* Minimum in-band energy threshold */ 9086 21, /* 21/32 in-band to broad-band ratio */ 9087 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9088 }, 9089 { /* f360 */ 9090 31397, /* A1 = -1.916321 */ 9091 -32623, /* A2 = 0.995605 */ 9092 -117, /* B2 = -0.003598 */ 9093 0, /* B1 = 0.000000 */ 9094 117, /* B0 = 0.003598 */ 9095 31403, /* A1 = -1.916687 */ 9096 -32700, /* A2 = 0.997925 */ 9097 3388, /* B2 = 0.103401 */ 9098 -3240, /* B1 = -0.197784 */ 9099 3388, /* B0 = 0.103401 */ 9100 31463, /* A1 = -1.920410 */ 9101 -32702, /* A2 = 0.997986 */ 9102 13346, /* B2 = 0.407288 */ 9103 -12863, /* B1 = -0.785126 */ 9104 13346, /* B0 = 0.407288 */ 9105 5, /* Internal filter scaling */ 9106 159, /* Minimum in-band energy threshold */ 9107 21, /* 21/32 in-band to broad-band ratio */ 9108 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9109 }, 9110 { /* f380_420[] */ 9111 30831, /* A1 = 1.881775 */ 9112 -32064, /* A2 = -0.978546 */ 9113 -367, /* B2 = -0.01122 */ 9114 0, /* B1 = 0 */ 9115 367, /* B0 = 0.01122 */ 9116 30813, /* A1 = 1.880737 */ 9117 -32456, /* A2 = -0.990509 */ 9118 11068, /* B2 = 0.337769 */ 9119 -10338, /* B1 = -0.631042 */ 9120 11068, /* B0 = 0.337769 */ 9121 31214, /* A1 = 1.905212 */ 9122 -32491, /* A2 = -0.991577 */ 9123 16374, /* B2 = 0.499695 */ 9124 -15781, /* B1 = -0.963196 */ 9125 16374, /* B0 = 0.499695 */ 9126 7, /* Internal filter scaling */ 9127 159, /* Minimum in-band energy threshold */ 9128 21, /* 21/32 in-band to broad-band ratio */ 9129 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9130 }, 9131 { /* f392 */ 9132 31152, /* A1 = -1.901428 */ 9133 -32613, /* A2 = 0.995300 */ 9134 -314, /* B2 = -0.009605 */ 9135 0, /* B1 = 0.000000 */ 9136 314, /* B0 = 0.009605 */ 9137 31156, /* A1 = -1.901672 */ 9138 -32694, /* A2 = 0.997742 */ 9139 28847, /* B2 = 0.880371 */ 9140 -2734, /* B1 = -0.166901 */ 9141 28847, /* B0 = 0.880371 */ 9142 31225, /* A1 = -1.905823 */ 9143 -32696, /* A2 = 0.997803 */ 9144 462, /* B2 = 0.014108 */ 9145 -442, /* B1 = -0.027019 */ 9146 462, /* B0 = 0.014108 */ 9147 5, /* Internal filter scaling */ 9148 159, /* Minimum in-band energy threshold */ 9149 21, /* 21/32 in-band to broad-band ratio */ 9150 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9151 }, 9152 { /* f400_425[] */ 9153 30836, /* A1 = 1.882141 */ 9154 -32296, /* A2 = -0.985596 */ 9155 -324, /* B2 = -0.009903 */ 9156 0, /* B1 = 0 */ 9157 324, /* B0 = 0.009903 */ 9158 30825, /* A1 = 1.881409 */ 9159 -32570, /* A2 = -0.993958 */ 9160 16847, /* B2 = 0.51416 */ 9161 -15792, /* B1 = -0.963898 */ 9162 16847, /* B0 = 0.51416 */ 9163 31106, /* A1 = 1.89856 */ 9164 -32584, /* A2 = -0.994415 */ 9165 9579, /* B2 = 0.292328 */ 9166 -9164, /* B1 = -0.559357 */ 9167 9579, /* B0 = 0.292328 */ 9168 7, /* Internal filter scaling */ 9169 159, /* Minimum in-band energy threshold */ 9170 21, /* 21/32 in-band to broad-band ratio */ 9171 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9172 }, 9173 { /* f400_440[] */ 9174 30702, /* A1 = 1.873962 */ 9175 -32134, /* A2 = -0.980682 */ 9176 -517, /* B2 = -0.015793 */ 9177 0, /* B1 = 0 */ 9178 517, /* B0 = 0.015793 */ 9179 30676, /* A1 = 1.872375 */ 9180 -32520, /* A2 = -0.992462 */ 9181 8144, /* B2 = 0.24855 */ 9182 -7596, /* B1 = -0.463684 */ 9183 8144, /* B0 = 0.24855 */ 9184 31084, /* A1 = 1.897217 */ 9185 -32547, /* A2 = -0.993256 */ 9186 22713, /* B2 = 0.693176 */ 9187 -21734, /* B1 = -1.326599 */ 9188 22713, /* B0 = 0.693176 */ 9189 7, /* Internal filter scaling */ 9190 159, /* Minimum in-band energy threshold */ 9191 21, /* 21/32 in-band to broad-band ratio */ 9192 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9193 }, 9194 { /* f400_450[] */ 9195 30613, /* A1 = 1.86853 */ 9196 -32031, /* A2 = -0.977509 */ 9197 -618, /* B2 = -0.018866 */ 9198 0, /* B1 = 0 */ 9199 618, /* B0 = 0.018866 */ 9200 30577, /* A1 = 1.866272 */ 9201 -32491, /* A2 = -0.991577 */ 9202 9612, /* B2 = 0.293335 */ 9203 -8935, /* B1 = -0.54541 */ 9204 9612, /* B0 = 0.293335 */ 9205 31071, /* A1 = 1.896484 */ 9206 -32524, /* A2 = -0.992584 */ 9207 21596, /* B2 = 0.659058 */ 9208 -20667, /* B1 = -1.261414 */ 9209 21596, /* B0 = 0.659058 */ 9210 7, /* Internal filter scaling */ 9211 159, /* Minimum in-band energy threshold */ 9212 21, /* 21/32 in-band to broad-band ratio */ 9213 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9214 }, 9215 { /* f420 */ 9216 30914, /* A1 = -1.886841 */ 9217 -32584, /* A2 = 0.994385 */ 9218 -426, /* B2 = -0.013020 */ 9219 0, /* B1 = 0.000000 */ 9220 426, /* B0 = 0.013020 */ 9221 30914, /* A1 = -1.886841 */ 9222 -32679, /* A2 = 0.997314 */ 9223 17520, /* B2 = 0.534668 */ 9224 -16471, /* B1 = -1.005310 */ 9225 17520, /* B0 = 0.534668 */ 9226 31004, /* A1 = -1.892334 */ 9227 -32683, /* A2 = 0.997406 */ 9228 819, /* B2 = 0.025023 */ 9229 -780, /* B1 = -0.047619 */ 9230 819, /* B0 = 0.025023 */ 9231 5, /* Internal filter scaling */ 9232 159, /* Minimum in-band energy threshold */ 9233 21, /* 21/32 in-band to broad-band ratio */ 9234 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9235 }, 9236 { 9237 30850, 9238 -32534, 9239 -504, 9240 0, 9241 504, 9242 30831, 9243 -32669, 9244 24303, 9245 -22080, 9246 24303, 9247 30994, 9248 -32673, 9249 1905, 9250 -1811, 9251 1905, 9252 5, 9253 129, 9254 17, 9255 0xff5 9256 }, 9257 { /* f425_450[] */ 9258 30646, /* A1 = 1.870544 */ 9259 -32327, /* A2 = -0.986572 */ 9260 -287, /* B2 = -0.008769 */ 9261 0, /* B1 = 0 */ 9262 287, /* B0 = 0.008769 */ 9263 30627, /* A1 = 1.869324 */ 9264 -32607, /* A2 = -0.995087 */ 9265 13269, /* B2 = 0.404968 */ 9266 -12376, /* B1 = -0.755432 */ 9267 13269, /* B0 = 0.404968 */ 9268 30924, /* A1 = 1.887512 */ 9269 -32619, /* A2 = -0.995453 */ 9270 19950, /* B2 = 0.608826 */ 9271 -18940, /* B1 = -1.156006 */ 9272 19950, /* B0 = 0.608826 */ 9273 7, /* Internal filter scaling */ 9274 159, /* Minimum in-band energy threshold */ 9275 21, /* 21/32 in-band to broad-band ratio */ 9276 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9277 }, 9278 { /* f425_475[] */ 9279 30396, /* A1 = 1.855225 */ 9280 -32014, /* A2 = -0.97699 */ 9281 -395, /* B2 = -0.012055 */ 9282 0, /* B1 = 0 */ 9283 395, /* B0 = 0.012055 */ 9284 30343, /* A1 = 1.85199 */ 9285 -32482, /* A2 = -0.991302 */ 9286 17823, /* B2 = 0.543945 */ 9287 -16431, /* B1 = -1.002869 */ 9288 17823, /* B0 = 0.543945 */ 9289 30872, /* A1 = 1.884338 */ 9290 -32516, /* A2 = -0.99231 */ 9291 18124, /* B2 = 0.553101 */ 9292 -17246, /* B1 = -1.052673 */ 9293 18124, /* B0 = 0.553101 */ 9294 7, /* Internal filter scaling */ 9295 159, /* Minimum in-band energy threshold */ 9296 21, /* 21/32 in-band to broad-band ratio */ 9297 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9298 }, 9299 { /* f435 */ 9300 30796, /* A1 = -1.879639 */ 9301 -32603, /* A2 = 0.994965 */ 9302 -254, /* B2 = -0.007762 */ 9303 0, /* B1 = 0.000000 */ 9304 254, /* B0 = 0.007762 */ 9305 30793, /* A1 = -1.879456 */ 9306 -32692, /* A2 = 0.997711 */ 9307 18934, /* B2 = 0.577820 */ 9308 -17751, /* B1 = -1.083496 */ 9309 18934, /* B0 = 0.577820 */ 9310 30882, /* A1 = -1.884888 */ 9311 -32694, /* A2 = 0.997772 */ 9312 1858, /* B2 = 0.056713 */ 9313 -1758, /* B1 = -0.107357 */ 9314 1858, /* B0 = 0.056713 */ 9315 5, /* Internal filter scaling */ 9316 159, /* Minimum in-band energy threshold */ 9317 21, /* 21/32 in-band to broad-band ratio */ 9318 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9319 }, 9320 { /* f440_450[] */ 9321 30641, /* A1 = 1.870239 */ 9322 -32458, /* A2 = -0.99057 */ 9323 -155, /* B2 = -0.004735 */ 9324 0, /* B1 = 0 */ 9325 155, /* B0 = 0.004735 */ 9326 30631, /* A1 = 1.869568 */ 9327 -32630, /* A2 = -0.995789 */ 9328 11453, /* B2 = 0.349548 */ 9329 -10666, /* B1 = -0.651001 */ 9330 11453, /* B0 = 0.349548 */ 9331 30810, /* A1 = 1.880554 */ 9332 -32634, /* A2 = -0.995941 */ 9333 12237, /* B2 = 0.373474 */ 9334 -11588, /* B1 = -0.707336 */ 9335 12237, /* B0 = 0.373474 */ 9336 7, /* Internal filter scaling */ 9337 159, /* Minimum in-band energy threshold */ 9338 21, /* 21/32 in-band to broad-band ratio */ 9339 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9340 }, 9341 { /* f440_480[] */ 9342 30367, /* A1 = 1.853455 */ 9343 -32147, /* A2 = -0.981079 */ 9344 -495, /* B2 = -0.015113 */ 9345 0, /* B1 = 0 */ 9346 495, /* B0 = 0.015113 */ 9347 30322, /* A1 = 1.850769 */ 9348 -32543, /* A2 = -0.993134 */ 9349 10031, /* B2 = 0.306152 */ 9350 -9252, /* B1 = -0.564728 */ 9351 10031, /* B0 = 0.306152 */ 9352 30770, /* A1 = 1.878052 */ 9353 -32563, /* A2 = -0.993774 */ 9354 22674, /* B2 = 0.691956 */ 9355 -21465, /* B1 = -1.31012 */ 9356 22674, /* B0 = 0.691956 */ 9357 7, /* Internal filter scaling */ 9358 159, /* Minimum in-band energy threshold */ 9359 21, /* 21/32 in-band to broad-band ratio */ 9360 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9361 }, 9362 { /* f445 */ 9363 30709, /* A1 = -1.874329 */ 9364 -32603, /* A2 = 0.994965 */ 9365 -83, /* B2 = -0.002545 */ 9366 0, /* B1 = 0.000000 */ 9367 83, /* B0 = 0.002545 */ 9368 30704, /* A1 = -1.874084 */ 9369 -32692, /* A2 = 0.997711 */ 9370 10641, /* B2 = 0.324738 */ 9371 -9947, /* B1 = -0.607147 */ 9372 10641, /* B0 = 0.324738 */ 9373 30796, /* A1 = -1.879639 */ 9374 -32694, /* A2 = 0.997772 */ 9375 10079, /* B2 = 0.307587 */ 9376 9513, /* B1 = 0.580688 */ 9377 10079, /* B0 = 0.307587 */ 9378 5, /* Internal filter scaling */ 9379 159, /* Minimum in-band energy threshold */ 9380 21, /* 21/32 in-band to broad-band ratio */ 9381 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9382 }, 9383 { /* f450 */ 9384 30664, /* A1 = -1.871643 */ 9385 -32603, /* A2 = 0.994965 */ 9386 -164, /* B2 = -0.005029 */ 9387 0, /* B1 = 0.000000 */ 9388 164, /* B0 = 0.005029 */ 9389 30661, /* A1 = -1.871399 */ 9390 -32692, /* A2 = 0.997711 */ 9391 15294, /* B2 = 0.466736 */ 9392 -14275, /* B1 = -0.871307 */ 9393 15294, /* B0 = 0.466736 */ 9394 30751, /* A1 = -1.876953 */ 9395 -32694, /* A2 = 0.997772 */ 9396 3548, /* B2 = 0.108284 */ 9397 -3344, /* B1 = -0.204155 */ 9398 3548, /* B0 = 0.108284 */ 9399 5, /* Internal filter scaling */ 9400 159, /* Minimum in-band energy threshold */ 9401 21, /* 21/32 in-band to broad-band ratio */ 9402 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9403 }, 9404 { /* f452 */ 9405 30653, /* A1 = -1.870911 */ 9406 -32615, /* A2 = 0.995361 */ 9407 -209, /* B2 = -0.006382 */ 9408 0, /* B1 = 0.000000 */ 9409 209, /* B0 = 0.006382 */ 9410 30647, /* A1 = -1.870605 */ 9411 -32702, /* A2 = 0.997986 */ 9412 18971, /* B2 = 0.578979 */ 9413 -17716, /* B1 = -1.081299 */ 9414 18971, /* B0 = 0.578979 */ 9415 30738, /* A1 = -1.876099 */ 9416 -32702, /* A2 = 0.998016 */ 9417 2967, /* B2 = 0.090561 */ 9418 -2793, /* B1 = -0.170502 */ 9419 2967, /* B0 = 0.090561 */ 9420 5, /* Internal filter scaling */ 9421 159, /* Minimum in-band energy threshold */ 9422 21, /* 21/32 in-band to broad-band ratio */ 9423 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9424 }, 9425 { /* f475 */ 9426 30437, /* A1 = -1.857727 */ 9427 -32603, /* A2 = 0.994965 */ 9428 -264, /* B2 = -0.008062 */ 9429 0, /* B1 = 0.000000 */ 9430 264, /* B0 = 0.008062 */ 9431 30430, /* A1 = -1.857300 */ 9432 -32692, /* A2 = 0.997711 */ 9433 21681, /* B2 = 0.661682 */ 9434 -20082, /* B1 = -1.225708 */ 9435 21681, /* B0 = 0.661682 */ 9436 30526, /* A1 = -1.863220 */ 9437 -32694, /* A2 = 0.997742 */ 9438 1559, /* B2 = 0.047600 */ 9439 -1459, /* B1 = -0.089096 */ 9440 1559, /* B0 = 0.047600 */ 9441 5, /* Internal filter scaling */ 9442 159, /* Minimum in-band energy threshold */ 9443 21, /* 21/32 in-band to broad-band ratio */ 9444 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9445 }, 9446 { /* f480_620[] */ 9447 28975, /* A1 = 1.768494 */ 9448 -30955, /* A2 = -0.944672 */ 9449 -1026, /* B2 = -0.03133 */ 9450 0, /* B1 = 0 */ 9451 1026, /* B0 = 0.03133 */ 9452 28613, /* A1 = 1.746399 */ 9453 -32089, /* A2 = -0.979309 */ 9454 14214, /* B2 = 0.433807 */ 9455 -12202, /* B1 = -0.744812 */ 9456 14214, /* B0 = 0.433807 */ 9457 30243, /* A1 = 1.845947 */ 9458 -32238, /* A2 = -0.983856 */ 9459 24825, /* B2 = 0.757629 */ 9460 -23402, /* B1 = -1.428345 */ 9461 24825, /* B0 = 0.757629 */ 9462 7, /* Internal filter scaling */ 9463 159, /* Minimum in-band energy threshold */ 9464 21, /* 21/32 in-band to broad-band ratio */ 9465 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9466 }, 9467 { /* f494 */ 9468 30257, /* A1 = -1.846741 */ 9469 -32605, /* A2 = 0.995056 */ 9470 -249, /* B2 = -0.007625 */ 9471 0, /* B1 = 0.000000 */ 9472 249, /* B0 = 0.007625 */ 9473 30247, /* A1 = -1.846191 */ 9474 -32694, /* A2 = 0.997772 */ 9475 18088, /* B2 = 0.552002 */ 9476 -16652, /* B1 = -1.016418 */ 9477 18088, /* B0 = 0.552002 */ 9478 30348, /* A1 = -1.852295 */ 9479 -32696, /* A2 = 0.997803 */ 9480 2099, /* B2 = 0.064064 */ 9481 -1953, /* B1 = -0.119202 */ 9482 2099, /* B0 = 0.064064 */ 9483 5, /* Internal filter scaling */ 9484 159, /* Minimum in-band energy threshold */ 9485 21, /* 21/32 in-band to broad-band ratio */ 9486 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9487 }, 9488 { /* f500 */ 9489 30202, /* A1 = -1.843431 */ 9490 -32624, /* A2 = 0.995622 */ 9491 -413, /* B2 = -0.012622 */ 9492 0, /* B1 = 0.000000 */ 9493 413, /* B0 = 0.012622 */ 9494 30191, /* A1 = -1.842721 */ 9495 -32714, /* A2 = 0.998364 */ 9496 25954, /* B2 = 0.792057 */ 9497 -23890, /* B1 = -1.458131 */ 9498 25954, /* B0 = 0.792057 */ 9499 30296, /* A1 = -1.849172 */ 9500 -32715, /* A2 = 0.998397 */ 9501 2007, /* B2 = 0.061264 */ 9502 -1860, /* B1 = -0.113568 */ 9503 2007, /* B0 = 0.061264 */ 9504 5, /* Internal filter scaling */ 9505 159, /* Minimum in-band energy threshold */ 9506 21, /* 21/32 in-band to broad-band ratio */ 9507 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9508 }, 9509 { /* f520 */ 9510 30001, /* A1 = -1.831116 */ 9511 -32613, /* A2 = 0.995270 */ 9512 -155, /* B2 = -0.004750 */ 9513 0, /* B1 = 0.000000 */ 9514 155, /* B0 = 0.004750 */ 9515 29985, /* A1 = -1.830200 */ 9516 -32710, /* A2 = 0.998260 */ 9517 6584, /* B2 = 0.200928 */ 9518 -6018, /* B1 = -0.367355 */ 9519 6584, /* B0 = 0.200928 */ 9520 30105, /* A1 = -1.837524 */ 9521 -32712, /* A2 = 0.998291 */ 9522 23812, /* B2 = 0.726685 */ 9523 -21936, /* B1 = -1.338928 */ 9524 23812, /* B0 = 0.726685 */ 9525 5, /* Internal filter scaling */ 9526 159, /* Minimum in-band energy threshold */ 9527 21, /* 21/32 in-band to broad-band ratio */ 9528 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9529 }, 9530 { /* f523 */ 9531 29964, /* A1 = -1.828918 */ 9532 -32601, /* A2 = 0.994904 */ 9533 -101, /* B2 = -0.003110 */ 9534 0, /* B1 = 0.000000 */ 9535 101, /* B0 = 0.003110 */ 9536 29949, /* A1 = -1.827942 */ 9537 -32700, /* A2 = 0.997925 */ 9538 11041, /* B2 = 0.336975 */ 9539 -10075, /* B1 = -0.614960 */ 9540 11041, /* B0 = 0.336975 */ 9541 30070, /* A1 = -1.835388 */ 9542 -32702, /* A2 = 0.997986 */ 9543 16762, /* B2 = 0.511536 */ 9544 -15437, /* B1 = -0.942230 */ 9545 16762, /* B0 = 0.511536 */ 9546 5, /* Internal filter scaling */ 9547 159, /* Minimum in-band energy threshold */ 9548 21, /* 21/32 in-band to broad-band ratio */ 9549 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9550 }, 9551 { /* f525 */ 9552 29936, /* A1 = -1.827209 */ 9553 -32584, /* A2 = 0.994415 */ 9554 -91, /* B2 = -0.002806 */ 9555 0, /* B1 = 0.000000 */ 9556 91, /* B0 = 0.002806 */ 9557 29921, /* A1 = -1.826233 */ 9558 -32688, /* A2 = 0.997559 */ 9559 11449, /* B2 = 0.349396 */ 9560 -10426, /* B1 = -0.636383 */ 9561 11449, /* B0 = 0.349396 */ 9562 30045, /* A1 = -1.833862 */ 9563 -32688, /* A2 = 0.997589 */ 9564 13055, /* B2 = 0.398407 */ 9565 -12028, /* B1 = -0.734161 */ 9566 13055, /* B0 = 0.398407 */ 9567 5, /* Internal filter scaling */ 9568 159, /* Minimum in-band energy threshold */ 9569 21, /* 21/32 in-band to broad-band ratio */ 9570 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9571 }, 9572 { /* f540_660[] */ 9573 28499, /* A1 = 1.739441 */ 9574 -31129, /* A2 = -0.949982 */ 9575 -849, /* B2 = -0.025922 */ 9576 0, /* B1 = 0 */ 9577 849, /* B0 = 0.025922 */ 9578 28128, /* A1 = 1.716797 */ 9579 -32130, /* A2 = -0.98056 */ 9580 14556, /* B2 = 0.444214 */ 9581 -12251, /* B1 = -0.747772 */ 9582 14556, /* B0 = 0.444244 */ 9583 29667, /* A1 = 1.81073 */ 9584 -32244, /* A2 = -0.984039 */ 9585 23038, /* B2 = 0.703064 */ 9586 -21358, /* B1 = -1.303589 */ 9587 23040, /* B0 = 0.703125 */ 9588 7, /* Internal filter scaling */ 9589 159, /* Minimum in-band energy threshold */ 9590 21, /* 21/32 in-band to broad-band ratio */ 9591 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9592 }, 9593 { /* f587 */ 9594 29271, /* A1 = -1.786560 */ 9595 -32599, /* A2 = 0.994873 */ 9596 -490, /* B2 = -0.014957 */ 9597 0, /* B1 = 0.000000 */ 9598 490, /* B0 = 0.014957 */ 9599 29246, /* A1 = -1.785095 */ 9600 -32700, /* A2 = 0.997925 */ 9601 28961, /* B2 = 0.883850 */ 9602 -25796, /* B1 = -1.574463 */ 9603 28961, /* B0 = 0.883850 */ 9604 29383, /* A1 = -1.793396 */ 9605 -32700, /* A2 = 0.997955 */ 9606 1299, /* B2 = 0.039650 */ 9607 -1169, /* B1 = -0.071396 */ 9608 1299, /* B0 = 0.039650 */ 9609 5, /* Internal filter scaling */ 9610 159, /* Minimum in-band energy threshold */ 9611 21, /* 21/32 in-band to broad-band ratio */ 9612 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9613 }, 9614 { /* f590 */ 9615 29230, /* A1 = -1.784058 */ 9616 -32584, /* A2 = 0.994415 */ 9617 -418, /* B2 = -0.012757 */ 9618 0, /* B1 = 0.000000 */ 9619 418, /* B0 = 0.012757 */ 9620 29206, /* A1 = -1.782593 */ 9621 -32688, /* A2 = 0.997559 */ 9622 36556, /* B2 = 1.115601 */ 9623 -32478, /* B1 = -1.982300 */ 9624 36556, /* B0 = 1.115601 */ 9625 29345, /* A1 = -1.791077 */ 9626 -32688, /* A2 = 0.997589 */ 9627 897, /* B2 = 0.027397 */ 9628 -808, /* B1 = -0.049334 */ 9629 897, /* B0 = 0.027397 */ 9630 5, /* Internal filter scaling */ 9631 159, /* Minimum in-band energy threshold */ 9632 21, /* 21/32 in-band to broad-band ratio */ 9633 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9634 }, 9635 { /* f600 */ 9636 29116, /* A1 = -1.777100 */ 9637 -32603, /* A2 = 0.994965 */ 9638 -165, /* B2 = -0.005039 */ 9639 0, /* B1 = 0.000000 */ 9640 165, /* B0 = 0.005039 */ 9641 29089, /* A1 = -1.775452 */ 9642 -32708, /* A2 = 0.998199 */ 9643 6963, /* B2 = 0.212494 */ 9644 -6172, /* B1 = -0.376770 */ 9645 6963, /* B0 = 0.212494 */ 9646 29237, /* A1 = -1.784485 */ 9647 -32710, /* A2 = 0.998230 */ 9648 24197, /* B2 = 0.738464 */ 9649 -21657, /* B1 = -1.321899 */ 9650 24197, /* B0 = 0.738464 */ 9651 5, /* Internal filter scaling */ 9652 159, /* Minimum in-band energy threshold */ 9653 21, /* 21/32 in-band to broad-band ratio */ 9654 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9655 }, 9656 { /* f660 */ 9657 28376, /* A1 = -1.731934 */ 9658 -32567, /* A2 = 0.993896 */ 9659 -363, /* B2 = -0.011102 */ 9660 0, /* B1 = 0.000000 */ 9661 363, /* B0 = 0.011102 */ 9662 28337, /* A1 = -1.729614 */ 9663 -32683, /* A2 = 0.997434 */ 9664 21766, /* B2 = 0.664246 */ 9665 -18761, /* B1 = -1.145081 */ 9666 21766, /* B0 = 0.664246 */ 9667 28513, /* A1 = -1.740356 */ 9668 -32686, /* A2 = 0.997498 */ 9669 2509, /* B2 = 0.076584 */ 9670 -2196, /* B1 = -0.134041 */ 9671 2509, /* B0 = 0.076584 */ 9672 5, /* Internal filter scaling */ 9673 159, /* Minimum in-band energy threshold */ 9674 21, /* 21/32 in-band to broad-band ratio */ 9675 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9676 }, 9677 { /* f700 */ 9678 27844, /* A1 = -1.699463 */ 9679 -32563, /* A2 = 0.993744 */ 9680 -366, /* B2 = -0.011187 */ 9681 0, /* B1 = 0.000000 */ 9682 366, /* B0 = 0.011187 */ 9683 27797, /* A1 = -1.696655 */ 9684 -32686, /* A2 = 0.997498 */ 9685 22748, /* B2 = 0.694214 */ 9686 -19235, /* B1 = -1.174072 */ 9687 22748, /* B0 = 0.694214 */ 9688 27995, /* A1 = -1.708740 */ 9689 -32688, /* A2 = 0.997559 */ 9690 2964, /* B2 = 0.090477 */ 9691 -2546, /* B1 = -0.155449 */ 9692 2964, /* B0 = 0.090477 */ 9693 5, /* Internal filter scaling */ 9694 159, /* Minimum in-band energy threshold */ 9695 21, /* 21/32 in-band to broad-band ratio */ 9696 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9697 }, 9698 { /* f740 */ 9699 27297, /* A1 = -1.666077 */ 9700 -32551, /* A2 = 0.993408 */ 9701 -345, /* B2 = -0.010540 */ 9702 0, /* B1 = 0.000000 */ 9703 345, /* B0 = 0.010540 */ 9704 27240, /* A1 = -1.662598 */ 9705 -32683, /* A2 = 0.997406 */ 9706 22560, /* B2 = 0.688477 */ 9707 -18688, /* B1 = -1.140625 */ 9708 22560, /* B0 = 0.688477 */ 9709 27461, /* A1 = -1.676147 */ 9710 -32684, /* A2 = 0.997467 */ 9711 3541, /* B2 = 0.108086 */ 9712 -2985, /* B1 = -0.182220 */ 9713 3541, /* B0 = 0.108086 */ 9714 5, /* Internal filter scaling */ 9715 159, /* Minimum in-band energy threshold */ 9716 21, /* 21/32 in-band to broad-band ratio */ 9717 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9718 }, 9719 { /* f750 */ 9720 27155, /* A1 = -1.657410 */ 9721 -32551, /* A2 = 0.993408 */ 9722 -462, /* B2 = -0.014117 */ 9723 0, /* B1 = 0.000000 */ 9724 462, /* B0 = 0.014117 */ 9725 27097, /* A1 = -1.653870 */ 9726 -32683, /* A2 = 0.997406 */ 9727 32495, /* B2 = 0.991699 */ 9728 -26776, /* B1 = -1.634338 */ 9729 32495, /* B0 = 0.991699 */ 9730 27321, /* A1 = -1.667542 */ 9731 -32684, /* A2 = 0.997467 */ 9732 1835, /* B2 = 0.056007 */ 9733 -1539, /* B1 = -0.093948 */ 9734 1835, /* B0 = 0.056007 */ 9735 5, /* Internal filter scaling */ 9736 159, /* Minimum in-band energy threshold */ 9737 21, /* 21/32 in-band to broad-band ratio */ 9738 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9739 }, 9740 { /* f750_1450[] */ 9741 19298, /* A1 = 1.177917 */ 9742 -24471, /* A2 = -0.746796 */ 9743 -4152, /* B2 = -0.126709 */ 9744 0, /* B1 = 0 */ 9745 4152, /* B0 = 0.126709 */ 9746 12902, /* A1 = 0.787476 */ 9747 -29091, /* A2 = -0.887817 */ 9748 12491, /* B2 = 0.38121 */ 9749 -1794, /* B1 = -0.109528 */ 9750 12494, /* B0 = 0.381317 */ 9751 26291, /* A1 = 1.604736 */ 9752 -30470, /* A2 = -0.929901 */ 9753 28859, /* B2 = 0.880737 */ 9754 -26084, /* B1 = -1.592102 */ 9755 28861, /* B0 = 0.880798 */ 9756 7, /* Internal filter scaling */ 9757 159, /* Minimum in-band energy threshold */ 9758 21, /* 21/32 in-band to broad-band ratio */ 9759 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9760 }, 9761 { /* f770 */ 9762 26867, /* A1 = -1.639832 */ 9763 -32551, /* A2 = 0.993408 */ 9764 -123, /* B2 = -0.003755 */ 9765 0, /* B1 = 0.000000 */ 9766 123, /* B0 = 0.003755 */ 9767 26805, /* A1 = -1.636108 */ 9768 -32683, /* A2 = 0.997406 */ 9769 17297, /* B2 = 0.527863 */ 9770 -14096, /* B1 = -0.860382 */ 9771 17297, /* B0 = 0.527863 */ 9772 27034, /* A1 = -1.650085 */ 9773 -32684, /* A2 = 0.997467 */ 9774 12958, /* B2 = 0.395477 */ 9775 -10756, /* B1 = -0.656525 */ 9776 12958, /* B0 = 0.395477 */ 9777 5, /* Internal filter scaling */ 9778 159, /* Minimum in-band energy threshold */ 9779 21, /* 21/32 in-band to broad-band ratio */ 9780 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9781 }, 9782 { /* f800 */ 9783 26413, /* A1 = -1.612122 */ 9784 -32547, /* A2 = 0.993286 */ 9785 -223, /* B2 = -0.006825 */ 9786 0, /* B1 = 0.000000 */ 9787 223, /* B0 = 0.006825 */ 9788 26342, /* A1 = -1.607849 */ 9789 -32686, /* A2 = 0.997498 */ 9790 6391, /* B2 = 0.195053 */ 9791 -5120, /* B1 = -0.312531 */ 9792 6391, /* B0 = 0.195053 */ 9793 26593, /* A1 = -1.623108 */ 9794 -32688, /* A2 = 0.997559 */ 9795 23681, /* B2 = 0.722717 */ 9796 -19328, /* B1 = -1.179688 */ 9797 23681, /* B0 = 0.722717 */ 9798 5, /* Internal filter scaling */ 9799 159, /* Minimum in-band energy threshold */ 9800 21, /* 21/32 in-band to broad-band ratio */ 9801 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9802 }, 9803 { /* f816 */ 9804 26168, /* A1 = -1.597209 */ 9805 -32528, /* A2 = 0.992706 */ 9806 -235, /* B2 = -0.007182 */ 9807 0, /* B1 = 0.000000 */ 9808 235, /* B0 = 0.007182 */ 9809 26092, /* A1 = -1.592590 */ 9810 -32675, /* A2 = 0.997192 */ 9811 20823, /* B2 = 0.635498 */ 9812 -16510, /* B1 = -1.007751 */ 9813 20823, /* B0 = 0.635498 */ 9814 26363, /* A1 = -1.609070 */ 9815 -32677, /* A2 = 0.997253 */ 9816 6739, /* B2 = 0.205688 */ 9817 -5459, /* B1 = -0.333206 */ 9818 6739, /* B0 = 0.205688 */ 9819 5, /* Internal filter scaling */ 9820 159, /* Minimum in-band energy threshold */ 9821 21, /* 21/32 in-band to broad-band ratio */ 9822 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9823 }, 9824 { /* f850 */ 9825 25641, /* A1 = -1.565063 */ 9826 -32536, /* A2 = 0.992950 */ 9827 -121, /* B2 = -0.003707 */ 9828 0, /* B1 = 0.000000 */ 9829 121, /* B0 = 0.003707 */ 9830 25560, /* A1 = -1.560059 */ 9831 -32684, /* A2 = 0.997437 */ 9832 18341, /* B2 = 0.559753 */ 9833 -14252, /* B1 = -0.869904 */ 9834 18341, /* B0 = 0.559753 */ 9835 25837, /* A1 = -1.577026 */ 9836 -32684, /* A2 = 0.997467 */ 9837 16679, /* B2 = 0.509003 */ 9838 -13232, /* B1 = -0.807648 */ 9839 16679, /* B0 = 0.509003 */ 9840 5, /* Internal filter scaling */ 9841 159, /* Minimum in-band energy threshold */ 9842 21, /* 21/32 in-band to broad-band ratio */ 9843 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9844 }, 9845 { /* f857_1645[] */ 9846 16415, /* A1 = 1.001953 */ 9847 -23669, /* A2 = -0.722321 */ 9848 -4549, /* B2 = -0.138847 */ 9849 0, /* B1 = 0 */ 9850 4549, /* B0 = 0.138847 */ 9851 8456, /* A1 = 0.516174 */ 9852 -28996, /* A2 = -0.884918 */ 9853 13753, /* B2 = 0.419724 */ 9854 -12, /* B1 = -0.000763 */ 9855 13757, /* B0 = 0.419846 */ 9856 24632, /* A1 = 1.503418 */ 9857 -30271, /* A2 = -0.923828 */ 9858 29070, /* B2 = 0.887146 */ 9859 -25265, /* B1 = -1.542114 */ 9860 29073, /* B0 = 0.887268 */ 9861 7, /* Internal filter scaling */ 9862 159, /* Minimum in-band energy threshold */ 9863 21, /* 21/32 in-band to broad-band ratio */ 9864 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9865 }, 9866 { /* f900 */ 9867 24806, /* A1 = -1.514099 */ 9868 -32501, /* A2 = 0.991852 */ 9869 -326, /* B2 = -0.009969 */ 9870 0, /* B1 = 0.000000 */ 9871 326, /* B0 = 0.009969 */ 9872 24709, /* A1 = -1.508118 */ 9873 -32659, /* A2 = 0.996674 */ 9874 20277, /* B2 = 0.618835 */ 9875 -15182, /* B1 = -0.926636 */ 9876 20277, /* B0 = 0.618835 */ 9877 25022, /* A1 = -1.527222 */ 9878 -32661, /* A2 = 0.996735 */ 9879 4320, /* B2 = 0.131836 */ 9880 -3331, /* B1 = -0.203339 */ 9881 4320, /* B0 = 0.131836 */ 9882 5, /* Internal filter scaling */ 9883 159, /* Minimum in-band energy threshold */ 9884 21, /* 21/32 in-band to broad-band ratio */ 9885 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9886 }, 9887 { /* f900_1300[] */ 9888 19776, /* A1 = 1.207092 */ 9889 -27437, /* A2 = -0.837341 */ 9890 -2666, /* B2 = -0.081371 */ 9891 0, /* B1 = 0 */ 9892 2666, /* B0 = 0.081371 */ 9893 16302, /* A1 = 0.995026 */ 9894 -30354, /* A2 = -0.926361 */ 9895 10389, /* B2 = 0.317062 */ 9896 -3327, /* B1 = -0.203064 */ 9897 10389, /* B0 = 0.317062 */ 9898 24299, /* A1 = 1.483154 */ 9899 -30930, /* A2 = -0.943909 */ 9900 25016, /* B2 = 0.763428 */ 9901 -21171, /* B1 = -1.292236 */ 9902 25016, /* B0 = 0.763428 */ 9903 7, /* Internal filter scaling */ 9904 159, /* Minimum in-band energy threshold */ 9905 21, /* 21/32 in-band to broad-band ratio */ 9906 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9907 }, 9908 { /* f935_1215[] */ 9909 20554, /* A1 = 1.254517 */ 9910 -28764, /* A2 = -0.877838 */ 9911 -2048, /* B2 = -0.062515 */ 9912 0, /* B1 = 0 */ 9913 2048, /* B0 = 0.062515 */ 9914 18209, /* A1 = 1.11145 */ 9915 -30951, /* A2 = -0.94458 */ 9916 9390, /* B2 = 0.286575 */ 9917 -3955, /* B1 = -0.241455 */ 9918 9390, /* B0 = 0.286575 */ 9919 23902, /* A1 = 1.458923 */ 9920 -31286, /* A2 = -0.954803 */ 9921 23252, /* B2 = 0.709595 */ 9922 -19132, /* B1 = -1.167725 */ 9923 23252, /* B0 = 0.709595 */ 9924 7, /* Internal filter scaling */ 9925 159, /* Minimum in-band energy threshold */ 9926 21, /* 21/32 in-band to broad-band ratio */ 9927 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9928 }, 9929 { /* f941_1477[] */ 9930 17543, /* A1 = 1.07074 */ 9931 -26220, /* A2 = -0.800201 */ 9932 -3298, /* B2 = -0.100647 */ 9933 0, /* B1 = 0 */ 9934 3298, /* B0 = 0.100647 */ 9935 12423, /* A1 = 0.75827 */ 9936 -30036, /* A2 = -0.916626 */ 9937 12651, /* B2 = 0.386078 */ 9938 -2444, /* B1 = -0.14917 */ 9939 12653, /* B0 = 0.386154 */ 9940 23518, /* A1 = 1.435425 */ 9941 -30745, /* A2 = -0.938293 */ 9942 27282, /* B2 = 0.832581 */ 9943 -22529, /* B1 = -1.375122 */ 9944 27286, /* B0 = 0.832703 */ 9945 7, /* Internal filter scaling */ 9946 159, /* Minimum in-band energy threshold */ 9947 21, /* 21/32 in-band to broad-band ratio */ 9948 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9949 }, 9950 { /* f942 */ 9951 24104, /* A1 = -1.471252 */ 9952 -32507, /* A2 = 0.992065 */ 9953 -351, /* B2 = -0.010722 */ 9954 0, /* B1 = 0.000000 */ 9955 351, /* B0 = 0.010722 */ 9956 23996, /* A1 = -1.464600 */ 9957 -32671, /* A2 = 0.997040 */ 9958 22848, /* B2 = 0.697266 */ 9959 -16639, /* B1 = -1.015564 */ 9960 22848, /* B0 = 0.697266 */ 9961 24332, /* A1 = -1.485168 */ 9962 -32673, /* A2 = 0.997101 */ 9963 4906, /* B2 = 0.149727 */ 9964 -3672, /* B1 = -0.224174 */ 9965 4906, /* B0 = 0.149727 */ 9966 5, /* Internal filter scaling */ 9967 159, /* Minimum in-band energy threshold */ 9968 21, /* 21/32 in-band to broad-band ratio */ 9969 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9970 }, 9971 { /* f950 */ 9972 23967, /* A1 = -1.462830 */ 9973 -32507, /* A2 = 0.992065 */ 9974 -518, /* B2 = -0.015821 */ 9975 0, /* B1 = 0.000000 */ 9976 518, /* B0 = 0.015821 */ 9977 23856, /* A1 = -1.456055 */ 9978 -32671, /* A2 = 0.997040 */ 9979 26287, /* B2 = 0.802246 */ 9980 -19031, /* B1 = -1.161560 */ 9981 26287, /* B0 = 0.802246 */ 9982 24195, /* A1 = -1.476746 */ 9983 -32673, /* A2 = 0.997101 */ 9984 2890, /* B2 = 0.088196 */ 9985 -2151, /* B1 = -0.131317 */ 9986 2890, /* B0 = 0.088196 */ 9987 5, /* Internal filter scaling */ 9988 159, /* Minimum in-band energy threshold */ 9989 21, /* 21/32 in-band to broad-band ratio */ 9990 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 9991 }, 9992 { /* f950_1400[] */ 9993 18294, /* A1 = 1.116638 */ 9994 -26962, /* A2 = -0.822845 */ 9995 -2914, /* B2 = -0.088936 */ 9996 0, /* B1 = 0 */ 9997 2914, /* B0 = 0.088936 */ 9998 14119, /* A1 = 0.861786 */ 9999 -30227, /* A2 = -0.922455 */ 10000 11466, /* B2 = 0.349945 */ 10001 -2833, /* B1 = -0.172943 */ 10002 11466, /* B0 = 0.349945 */ 10003 23431, /* A1 = 1.430115 */ 10004 -30828, /* A2 = -0.940796 */ 10005 25331, /* B2 = 0.773071 */ 10006 -20911, /* B1 = -1.276367 */ 10007 25331, /* B0 = 0.773071 */ 10008 7, /* Internal filter scaling */ 10009 159, /* Minimum in-band energy threshold */ 10010 21, /* 21/32 in-band to broad-band ratio */ 10011 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 10012 }, 10013 { /* f975 */ 10014 23521, /* A1 = -1.435608 */ 10015 -32489, /* A2 = 0.991516 */ 10016 -193, /* B2 = -0.005915 */ 10017 0, /* B1 = 0.000000 */ 10018 193, /* B0 = 0.005915 */ 10019 23404, /* A1 = -1.428467 */ 10020 -32655, /* A2 = 0.996582 */ 10021 17740, /* B2 = 0.541412 */ 10022 -12567, /* B1 = -0.767029 */ 10023 17740, /* B0 = 0.541412 */ 10024 23753, /* A1 = -1.449829 */ 10025 -32657, /* A2 = 0.996613 */ 10026 9090, /* B2 = 0.277405 */ 10027 -6662, /* B1 = -0.406647 */ 10028 9090, /* B0 = 0.277405 */ 10029 5, /* Internal filter scaling */ 10030 159, /* Minimum in-band energy threshold */ 10031 21, /* 21/32 in-band to broad-band ratio */ 10032 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 10033 }, 10034 { /* f1000 */ 10035 23071, /* A1 = -1.408203 */ 10036 -32489, /* A2 = 0.991516 */ 10037 -293, /* B2 = -0.008965 */ 10038 0, /* B1 = 0.000000 */ 10039 293, /* B0 = 0.008965 */ 10040 22951, /* A1 = -1.400818 */ 10041 -32655, /* A2 = 0.996582 */ 10042 5689, /* B2 = 0.173645 */ 10043 -3951, /* B1 = -0.241150 */ 10044 5689, /* B0 = 0.173645 */ 10045 23307, /* A1 = -1.422607 */ 10046 -32657, /* A2 = 0.996613 */ 10047 18692, /* B2 = 0.570435 */ 10048 -13447, /* B1 = -0.820770 */ 10049 18692, /* B0 = 0.570435 */ 10050 5, /* Internal filter scaling */ 10051 159, /* Minimum in-band energy threshold */ 10052 21, /* 21/32 in-band to broad-band ratio */ 10053 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 10054 }, 10055 { /* f1020 */ 10056 22701, /* A1 = -1.385620 */ 10057 -32474, /* A2 = 0.991058 */ 10058 -292, /* B2 = -0.008933 */ 10059 0, /*163840 , B1 = 10.000000 */ 10060 292, /* B0 = 0.008933 */ 10061 22564, /* A1 = -1.377258 */ 10062 -32655, /* A2 = 0.996552 */ 10063 20756, /* B2 = 0.633423 */ 10064 -14176, /* B1 = -0.865295 */ 10065 20756, /* B0 = 0.633423 */ 10066 22960, /* A1 = -1.401428 */ 10067 -32657, /* A2 = 0.996613 */ 10068 6520, /* B2 = 0.198990 */ 10069 -4619, /* B1 = -0.281937 */ 10070 6520, /* B0 = 0.198990 */ 10071 5, /* Internal filter scaling */ 10072 159, /* Minimum in-band energy threshold */ 10073 21, /* 21/32 in-band to broad-band ratio */ 10074 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 10075 }, 10076 { /* f1050 */ 10077 22142, /* A1 = -1.351501 */ 10078 -32474, /* A2 = 0.991058 */ 10079 -147, /* B2 = -0.004493 */ 10080 0, /* B1 = 0.000000 */ 10081 147, /* B0 = 0.004493 */ 10082 22000, /* A1 = -1.342834 */ 10083 -32655, /* A2 = 0.996552 */ 10084 15379, /* B2 = 0.469360 */ 10085 -10237, /* B1 = -0.624847 */ 10086 15379, /* B0 = 0.469360 */ 10087 22406, /* A1 = -1.367554 */ 10088 -32657, /* A2 = 0.996613 */ 10089 17491, /* B2 = 0.533783 */ 10090 -12096, /* B1 = -0.738312 */ 10091 17491, /* B0 = 0.533783 */ 10092 5, /* Internal filter scaling */ 10093 159, /* Minimum in-band energy threshold */ 10094 21, /* 21/32 in-band to broad-band ratio */ 10095 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 10096 }, 10097 { /* f1100_1750[] */ 10098 12973, /* A1 = 0.79184 */ 10099 -24916, /* A2 = -0.760376 */ 10100 6655, /* B2 = 0.203102 */ 10101 367, /* B1 = 0.0224 */ 10102 6657, /* B0 = 0.203171 */ 10103 5915, /* A1 = 0.361053 */ 10104 -29560, /* A2 = -0.90213 */ 10105 -7777, /* B2 = -0.23735 */ 10106 0, /* B1 = 0 */ 10107 7777, /* B0 = 0.23735 */ 10108 20510, /* A1 = 1.251892 */ 10109 -30260, /* A2 = -0.923462 */ 10110 26662, /* B2 = 0.81366 */ 10111 -20573, /* B1 = -1.255737 */ 10112 26668, /* B0 = 0.813843 */ 10113 7, /* Internal filter scaling */ 10114 159, /* Minimum in-band energy threshold */ 10115 21, /* 21/32 in-band to broad-band ratio */ 10116 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 10117 }, 10118 { /* f1140 */ 10119 20392, /* A1 = -1.244629 */ 10120 -32460, /* A2 = 0.990601 */ 10121 -270, /* B2 = -0.008240 */ 10122 0, /* B1 = 0.000000 */ 10123 270, /* B0 = 0.008240 */ 10124 20218, /* A1 = -1.234009 */ 10125 -32655, /* A2 = 0.996582 */ 10126 21337, /* B2 = 0.651154 */ 10127 -13044, /* B1 = -0.796143 */ 10128 21337, /* B0 = 0.651154 */ 10129 20684, /* A1 = -1.262512 */ 10130 -32657, /* A2 = 0.996643 */ 10131 8572, /* B2 = 0.261612 */ 10132 -5476, /* B1 = -0.334244 */ 10133 8572, /* B0 = 0.261612 */ 10134 5, /* Internal filter scaling */ 10135 159, /* Minimum in-band energy threshold */ 10136 21, /* 21/32 in-band to broad-band ratio */ 10137 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 10138 }, 10139 { /* f1200 */ 10140 19159, /* A1 = -1.169373 */ 10141 -32456, /* A2 = 0.990509 */ 10142 -335, /* B2 = -0.010252 */ 10143 0, /* B1 = 0.000000 */ 10144 335, /* B0 = 0.010252 */ 10145 18966, /* A1 = -1.157593 */ 10146 -32661, /* A2 = 0.996735 */ 10147 6802, /* B2 = 0.207588 */ 10148 -3900, /* B1 = -0.238098 */ 10149 6802, /* B0 = 0.207588 */ 10150 19467, /* A1 = -1.188232 */ 10151 -32661, /* A2 = 0.996765 */ 10152 25035, /* B2 = 0.764008 */ 10153 -15049, /* B1 = -0.918579 */ 10154 25035, /* B0 = 0.764008 */ 10155 5, /* Internal filter scaling */ 10156 159, /* Minimum in-band energy threshold */ 10157 21, /* 21/32 in-band to broad-band ratio */ 10158 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 10159 }, 10160 { /* f1209 */ 10161 18976, /* A1 = -1.158264 */ 10162 -32439, /* A2 = 0.989990 */ 10163 -183, /* B2 = -0.005588 */ 10164 0, /* B1 = 0.000000 */ 10165 183, /* B0 = 0.005588 */ 10166 18774, /* A1 = -1.145874 */ 10167 -32650, /* A2 = 0.996429 */ 10168 15468, /* B2 = 0.472076 */ 10169 -8768, /* B1 = -0.535217 */ 10170 15468, /* B0 = 0.472076 */ 10171 19300, /* A1 = -1.177979 */ 10172 -32652, /* A2 = 0.996490 */ 10173 19840, /* B2 = 0.605499 */ 10174 -11842, /* B1 = -0.722809 */ 10175 19840, /* B0 = 0.605499 */ 10176 5, /* Internal filter scaling */ 10177 159, /* Minimum in-band energy threshold */ 10178 21, /* 21/32 in-band to broad-band ratio */ 10179 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 10180 }, 10181 { /* f1330 */ 10182 16357, /* A1 = -0.998413 */ 10183 -32368, /* A2 = 0.987793 */ 10184 -217, /* B2 = -0.006652 */ 10185 0, /* B1 = 0.000000 */ 10186 217, /* B0 = 0.006652 */ 10187 16107, /* A1 = -0.983126 */ 10188 -32601, /* A2 = 0.994904 */ 10189 11602, /* B2 = 0.354065 */ 10190 -5555, /* B1 = -0.339111 */ 10191 11602, /* B0 = 0.354065 */ 10192 16722, /* A1 = -1.020630 */ 10193 -32603, /* A2 = 0.994965 */ 10194 15574, /* B2 = 0.475311 */ 10195 -8176, /* B1 = -0.499069 */ 10196 15574, /* B0 = 0.475311 */ 10197 5, /* Internal filter scaling */ 10198 159, /* Minimum in-band energy threshold */ 10199 21, /* 21/32 in-band to broad-band ratio */ 10200 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 10201 }, 10202 { /* f1336 */ 10203 16234, /* A1 = -0.990875 */ 10204 32404, /* A2 = -0.988922 */ 10205 -193, /* B2 = -0.005908 */ 10206 0, /* B1 = 0.000000 */ 10207 193, /* B0 = 0.005908 */ 10208 15986, /* A1 = -0.975769 */ 10209 -32632, /* A2 = 0.995880 */ 10210 18051, /* B2 = 0.550903 */ 10211 -8658, /* B1 = -0.528473 */ 10212 18051, /* B0 = 0.550903 */ 10213 16591, /* A1 = -1.012695 */ 10214 -32634, /* A2 = 0.995941 */ 10215 15736, /* B2 = 0.480240 */ 10216 -8125, /* B1 = -0.495926 */ 10217 15736, /* B0 = 0.480240 */ 10218 5, /* Internal filter scaling */ 10219 159, /* Minimum in-band energy threshold */ 10220 21, /* 21/32 in-band to broad-band ratio */ 10221 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 10222 }, 10223 { /* f1366 */ 10224 15564, /* A1 = -0.949982 */ 10225 -32404, /* A2 = 0.988922 */ 10226 -269, /* B2 = -0.008216 */ 10227 0, /* B1 = 0.000000 */ 10228 269, /* B0 = 0.008216 */ 10229 15310, /* A1 = -0.934479 */ 10230 -32632, /* A2 = 0.995880 */ 10231 10815, /* B2 = 0.330063 */ 10232 -4962, /* B1 = -0.302887 */ 10233 10815, /* B0 = 0.330063 */ 10234 15924, /* A1 = -0.971924 */ 10235 -32634, /* A2 = 0.995941 */ 10236 18880, /* B2 = 0.576172 */ 10237 -9364, /* B1 = -0.571594 */ 10238 18880, /* B0 = 0.576172 */ 10239 5, /* Internal filter scaling */ 10240 159, /* Minimum in-band energy threshold */ 10241 21, /* 21/32 in-band to broad-band ratio */ 10242 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 10243 }, 10244 { /* f1380 */ 10245 15247, /* A1 = -0.930603 */ 10246 -32397, /* A2 = 0.988708 */ 10247 -244, /* B2 = -0.007451 */ 10248 0, /* B1 = 0.000000 */ 10249 244, /* B0 = 0.007451 */ 10250 14989, /* A1 = -0.914886 */ 10251 -32627, /* A2 = 0.995697 */ 10252 18961, /* B2 = 0.578644 */ 10253 -8498, /* B1 = -0.518707 */ 10254 18961, /* B0 = 0.578644 */ 10255 15608, /* A1 = -0.952667 */ 10256 -32628, /* A2 = 0.995758 */ 10257 11145, /* B2 = 0.340134 */ 10258 -5430, /* B1 = -0.331467 */ 10259 11145, /* B0 = 0.340134 */ 10260 5, /* Internal filter scaling */ 10261 159, /* Minimum in-band energy threshold */ 10262 21, /* 21/32 in-band to broad-band ratio */ 10263 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 10264 }, 10265 { /* f1400 */ 10266 14780, /* A1 = -0.902130 */ 10267 -32393, /* A2 = 0.988586 */ 10268 -396, /* B2 = -0.012086 */ 10269 0, /* B1 = 0.000000 */ 10270 396, /* B0 = 0.012086 */ 10271 14510, /* A1 = -0.885651 */ 10272 -32630, /* A2 = 0.995819 */ 10273 6326, /* B2 = 0.193069 */ 10274 -2747, /* B1 = -0.167671 */ 10275 6326, /* B0 = 0.193069 */ 10276 15154, /* A1 = -0.924957 */ 10277 -32632, /* A2 = 0.995850 */ 10278 23235, /* B2 = 0.709076 */ 10279 -10983, /* B1 = -0.670380 */ 10280 23235, /* B0 = 0.709076 */ 10281 5, /* Internal filter scaling */ 10282 159, /* Minimum in-band energy threshold */ 10283 21, /* 21/32 in-band to broad-band ratio */ 10284 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 10285 }, 10286 { /* f1477 */ 10287 13005, /* A1 = -0.793793 */ 10288 -32368, /* A2 = 0.987823 */ 10289 -500, /* B2 = -0.015265 */ 10290 0, /* B1 = 0.000000 */ 10291 500, /* B0 = 0.015265 */ 10292 12708, /* A1 = -0.775665 */ 10293 -32615, /* A2 = 0.995331 */ 10294 11420, /* B2 = 0.348526 */ 10295 -4306, /* B1 = -0.262833 */ 10296 11420, /* B0 = 0.348526 */ 10297 13397, /* A1 = -0.817688 */ 10298 -32615, /* A2 = 0.995361 */ 10299 9454, /* B2 = 0.288528 */ 10300 -3981, /* B1 = -0.243027 */ 10301 9454, /* B0 = 0.288528 */ 10302 5, /* Internal filter scaling */ 10303 159, /* Minimum in-band energy threshold */ 10304 21, /* 21/32 in-band to broad-band ratio */ 10305 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 10306 }, 10307 { /* f1600 */ 10308 10046, /* A1 = -0.613190 */ 10309 -32331, /* A2 = 0.986694 */ 10310 -455, /* B2 = -0.013915 */ 10311 0, /* B1 = 0.000000 */ 10312 455, /* B0 = 0.013915 */ 10313 9694, /* A1 = -0.591705 */ 10314 -32601, /* A2 = 0.994934 */ 10315 6023, /* B2 = 0.183815 */ 10316 -1708, /* B1 = -0.104279 */ 10317 6023, /* B0 = 0.183815 */ 10318 10478, /* A1 = -0.639587 */ 10319 -32603, /* A2 = 0.994965 */ 10320 22031, /* B2 = 0.672333 */ 10321 -7342, /* B1 = -0.448151 */ 10322 22031, /* B0 = 0.672333 */ 10323 5, /* Internal filter scaling */ 10324 159, /* Minimum in-band energy threshold */ 10325 21, /* 21/32 in-band to broad-band ratio */ 10326 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 10327 }, 10328 { /* f1633_1638[] */ 10329 9181, /* A1 = 0.560394 */ 10330 -32256, /* A2 = -0.984375 */ 10331 -556, /* B2 = -0.016975 */ 10332 0, /* B1 = 0 */ 10333 556, /* B0 = 0.016975 */ 10334 8757, /* A1 = 0.534515 */ 10335 -32574, /* A2 = -0.99408 */ 10336 8443, /* B2 = 0.25769 */ 10337 -2135, /* B1 = -0.130341 */ 10338 8443, /* B0 = 0.25769 */ 10339 9691, /* A1 = 0.591522 */ 10340 -32574, /* A2 = -0.99411 */ 10341 15446, /* B2 = 0.471375 */ 10342 -4809, /* B1 = -0.293579 */ 10343 15446, /* B0 = 0.471375 */ 10344 7, /* Internal filter scaling */ 10345 159, /* Minimum in-band energy threshold */ 10346 21, /* 21/32 in-band to broad-band ratio */ 10347 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 10348 }, 10349 { /* f1800 */ 10350 5076, /* A1 = -0.309875 */ 10351 -32304, /* A2 = 0.985840 */ 10352 -508, /* B2 = -0.015503 */ 10353 0, /* B1 = 0.000000 */ 10354 508, /* B0 = 0.015503 */ 10355 4646, /* A1 = -0.283600 */ 10356 -32605, /* A2 = 0.995026 */ 10357 6742, /* B2 = 0.205780 */ 10358 -878, /* B1 = -0.053635 */ 10359 6742, /* B0 = 0.205780 */ 10360 5552, /* A1 = -0.338928 */ 10361 -32605, /* A2 = 0.995056 */ 10362 23667, /* B2 = 0.722260 */ 10363 -4297, /* B1 = -0.262329 */ 10364 23667, /* B0 = 0.722260 */ 10365 5, /* Internal filter scaling */ 10366 159, /* Minimum in-band energy threshold */ 10367 21, /* 21/32 in-band to broad-band ratio */ 10368 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 10369 }, 10370 { /* f1860 */ 10371 3569, /* A1 = -0.217865 */ 10372 -32292, /* A2 = 0.985504 */ 10373 -239, /* B2 = -0.007322 */ 10374 0, /* B1 = 0.000000 */ 10375 239, /* B0 = 0.007322 */ 10376 3117, /* A1 = -0.190277 */ 10377 -32603, /* A2 = 0.994965 */ 10378 18658, /* B2 = 0.569427 */ 10379 -1557, /* B1 = -0.095032 */ 10380 18658, /* B0 = 0.569427 */ 10381 4054, /* A1 = -0.247437 */ 10382 -32603, /* A2 = 0.994965 */ 10383 18886, /* B2 = 0.576385 */ 10384 -2566, /* B1 = -0.156647 */ 10385 18886, /* B0 = 0.576385 */ 10386 5, /* Internal filter scaling */ 10387 159, /* Minimum in-band energy threshold */ 10388 21, /* 21/32 in-band to broad-band ratio */ 10389 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */ 10390 }, 10391}; 10392static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf) 10393{ 10394 unsigned short cmd; 10395 int cnt, max; 10396 10397 if (jf->filter > 3) { 10398 return -1; 10399 } 10400 if (ixj_WriteDSPCommand(0x5154 + jf->filter, j)) /* Select Filter */ 10401 10402 return -1; 10403 if (!jf->enable) { 10404 if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */ 10405 10406 return -1; 10407 else 10408 return 0; 10409 } else { 10410 if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */ 10411 10412 return -1; 10413 /* Select the filter (f0 - f3) to use. */ 10414 if (ixj_WriteDSPCommand(0x5154 + jf->filter, j)) 10415 return -1; 10416 } 10417 if (jf->freq < 12 && jf->freq > 3) { 10418 /* Select the frequency for the selected filter. */ 10419 if (ixj_WriteDSPCommand(0x5170 + jf->freq, j)) 10420 return -1; 10421 } else if (jf->freq > 11) { 10422 /* We need to load a programmable filter set for undefined */ 10423 /* frequencies. So we will point the filter to a programmable set. */ 10424 /* Since there are only 4 filters and 4 programmable sets, we will */ 10425 /* just point the filter to the same number set and program it for the */ 10426 /* frequency we want. */ 10427 if (ixj_WriteDSPCommand(0x5170 + jf->filter, j)) 10428 return -1; 10429 if (j->ver.low != 0x12) { 10430 cmd = 0x515B; 10431 max = 19; 10432 } else { 10433 cmd = 0x515E; 10434 max = 15; 10435 } 10436 if (ixj_WriteDSPCommand(cmd, j)) 10437 return -1; 10438 for (cnt = 0; cnt < max; cnt++) { 10439 if (ixj_WriteDSPCommand(tone_table[jf->freq - 12][cnt], j)) 10440 return -1; 10441 } 10442 } 10443 j->filter_en[jf->filter] = jf->enable; 10444 return 0; 10445} 10446 10447static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr) 10448{ 10449 unsigned short cmd; 10450 int cnt, max; 10451 if (jfr->filter > 3) { 10452 return -1; 10453 } 10454 if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j)) /* Select Filter */ 10455 return -1; 10456 10457 if (!jfr->enable) { 10458 if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */ 10459 return -1; 10460 else 10461 return 0; 10462 } else { 10463 if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */ 10464 return -1; 10465 /* Select the filter (f0 - f3) to use. */ 10466 if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j)) 10467 return -1; 10468 } 10469 /* We need to load a programmable filter set for undefined */ 10470 /* frequencies. So we will point the filter to a programmable set. */ 10471 /* Since there are only 4 filters and 4 programmable sets, we will */ 10472 /* just point the filter to the same number set and program it for the */ 10473 /* frequency we want. */ 10474 if (ixj_WriteDSPCommand(0x5170 + jfr->filter, j)) 10475 return -1; 10476 if (j->ver.low != 0x12) { 10477 cmd = 0x515B; 10478 max = 19; 10479 } else { 10480 cmd = 0x515E; 10481 max = 15; 10482 } 10483 if (ixj_WriteDSPCommand(cmd, j)) 10484 return -1; 10485 for (cnt = 0; cnt < max; cnt++) { 10486 if (ixj_WriteDSPCommand(jfr->coeff[cnt], j)) 10487 return -1; 10488 } 10489 j->filter_en[jfr->filter] = jfr->enable; 10490 return 0; 10491} 10492 10493static int ixj_init_tone(IXJ *j, IXJ_TONE * ti) 10494{ 10495 int freq0, freq1; 10496 unsigned short data; 10497 if (ti->freq0) { 10498 freq0 = ti->freq0; 10499 } else { 10500 freq0 = 0x7FFF; 10501 } 10502 10503 if (ti->freq1) { 10504 freq1 = ti->freq1; 10505 } else { 10506 freq1 = 0x7FFF; 10507 } 10508 10509 if(ti->tone_index > 12 && ti->tone_index < 28) 10510 { 10511 if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, j)) 10512 return -1; 10513 if (ixj_WriteDSPCommand(0x6000 + (ti->gain1 << 4) + ti->gain0, j)) 10514 return -1; 10515 data = freq0; 10516 if (ixj_WriteDSPCommand(data, j)) 10517 return -1; 10518 data = freq1; 10519 if (ixj_WriteDSPCommand(data, j)) 10520 return -1; 10521 } 10522 return freq0; 10523} 10524