ixj.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:316k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  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.  *
  27.  * More information about the hardware related to this driver can be found  
  28.  * at our website:    http://www.quicknet.net
  29.  *
  30.  * IN NO EVENT SHALL QUICKNET TECHNOLOGIES, INC. BE LIABLE TO ANY PARTY FOR
  31.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  32.  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF QUICKNET
  33.  * TECHNOLOGIES, INC. HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  34.  *    
  35.  * QUICKNET TECHNOLOGIES, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  36.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  37.  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  38.  * ON AN "AS IS" BASIS, AND QUICKNET TECHNOLOGIES, INC. HAS NO OBLIGATION
  39.  * TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  40.  *
  41.  ***************************************************************************/
  42. static char ixj_c_rcsid[] = "$Id: ixj.c,v 4.7 2001/08/13 06:19:33 craigs Exp $";
  43. static char ixj_c_revision[] = "$Revision: 4.7 $";
  44. /*
  45.  * $Log: ixj.c,v $
  46.  * Revision 4.7  2001/08/13 06:19:33  craigs
  47.  * Added additional changes from Alan Cox and John Anderson for
  48.  * 2.2 to 2.4 cleanup and bounds checking
  49.  *
  50.  * Revision 4.6  2001/08/13 01:05:05  craigs
  51.  * Really fixed PHONE_QUERY_CODEC problem this time
  52.  *
  53.  * Revision 4.5  2001/08/13 00:11:03  craigs
  54.  * Fixed problem in handling of PHONE_QUERY_CODEC, thanks to Shane Anderson
  55.  *
  56.  * Revision 4.4  2001/08/07 07:58:12  craigs
  57.  * Changed back to three digit version numbers
  58.  * Added tagbuild target to allow automatic and easy tagging of versions
  59.  *
  60.  * Revision 4.3  2001/08/07 07:24:47  craigs
  61.  * Added ixj-ver.h to allow easy configuration management of driver
  62.  * Added display of version number in /prox/ixj
  63.  *
  64.  * Revision 4.2  2001/08/06 07:07:19  craigs
  65.  * Reverted IXJCTL_DSP_TYPE and IXJCTL_DSP_VERSION files to original
  66.  * behaviour of returning int rather than short *
  67.  *
  68.  * Revision 4.1  2001/08/05 00:17:37  craigs
  69.  * More changes for correct PCMCIA installation
  70.  * Start of changes for backward Linux compatibility
  71.  *
  72.  * Revision 4.0  2001/08/04 12:33:12  craigs
  73.  * New version using GNU autoconf
  74.  *
  75.  * Revision 3.105  2001/07/20 23:14:32  eokerson
  76.  * More work on CallerID generation when using ring cadences.
  77.  *
  78.  * Revision 3.104  2001/07/06 01:33:55  eokerson
  79.  * Some bugfixes from Robert Vojta <vojta@ipex.cz> and a few mods to the Makefile.
  80.  *
  81.  * Revision 3.103  2001/07/05 19:20:16  eokerson
  82.  * Updated HOWTO
  83.  * Changed mic gain to 30dB on Internet LineJACK mic/speaker port.
  84.  *
  85.  * Revision 3.102  2001/07/03 23:51:21  eokerson
  86.  * Un-mute mic on Internet LineJACK when in speakerphone mode.
  87.  *
  88.  * Revision 3.101  2001/07/02 19:26:56  eokerson
  89.  * Removed initialiazation of ixjdebug and ixj_convert_loaded so they will go in the .bss instead of the .data
  90.  *
  91.  * Revision 3.100  2001/07/02 19:18:27  eokerson
  92.  * Changed driver to make dynamic allocation possible.  We now pass IXJ * between functions instead of array indexes.
  93.  * Fixed the way the POTS and PSTN ports interact during a PSTN call to allow local answering.
  94.  * Fixed speaker mode on Internet LineJACK.
  95.  *
  96.  * Revision 3.99  2001/05/09 14:11:16  eokerson
  97.  * Fixed kmalloc error in ixj_build_filter_cadence.  Thanks David Chan <cat@waulogy.stanford.edu>.
  98.  *
  99.  * Revision 3.98  2001/05/08 19:55:33  eokerson
  100.  * Fixed POTS hookstate detection while it is connected to PSTN port.
  101.  *
  102.  * Revision 3.97  2001/05/08 00:01:04  eokerson
  103.  * Fixed kernel oops when sending caller ID data.
  104.  *
  105.  * Revision 3.96  2001/05/04 23:09:30  eokerson
  106.  * Now uses one kernel timer for each card, instead of one for the entire driver.
  107.  *
  108.  * Revision 3.95  2001/04/25 22:06:47  eokerson
  109.  * Fixed squawking at beginning of some G.723.1 calls.
  110.  *
  111.  * Revision 3.94  2001/04/03 23:42:00  eokerson
  112.  * Added linear volume ioctls
  113.  * Added raw filter load ioctl
  114.  *
  115.  * Revision 3.93  2001/02/27 01:00:06  eokerson
  116.  * Fixed blocking in CallerID.
  117.  * Reduced size of ixj structure for smaller driver footprint.
  118.  *
  119.  * Revision 3.92  2001/02/20 22:02:59  eokerson
  120.  * Fixed isapnp and pcmcia module compatibility for 2.4.x kernels.
  121.  * Improved PSTN ring detection.
  122.  * Fixed wink generation on POTS ports.
  123.  *
  124.  * Revision 3.91  2001/02/13 00:55:44  eokerson
  125.  * Turn AEC back on after changing frame sizes.
  126.  *
  127.  * Revision 3.90  2001/02/12 16:42:00  eokerson
  128.  * Added ALAW codec, thanks to Fabio Ferrari for the table based converters to make ALAW from ULAW.
  129.  *
  130.  * Revision 3.89  2001/02/12 15:41:16  eokerson
  131.  * Fix from Artis Kugevics - Tone gains were not being set correctly.
  132.  *
  133.  * Revision 3.88  2001/02/05 23:25:42  eokerson
  134.  * Fixed lockup bugs with deregister.
  135.  *
  136.  * Revision 3.87  2001/01/29 21:00:39  eokerson
  137.  * Fix from Fabio Ferrari <fabio.ferrari@digitro.com.br> to properly handle EAGAIN and EINTR during non-blocking write.
  138.  * Updated copyright date.
  139.  *
  140.  * Revision 3.86  2001/01/23 23:53:46  eokerson
  141.  * Fixes to G.729 compatibility.
  142.  *
  143.  * Revision 3.85  2001/01/23 21:30:36  eokerson
  144.  * Added verbage about cards supported.
  145.  * Removed commands that put the card in low power mode at some times that it should not be in low power mode.
  146.  *
  147.  * Revision 3.84  2001/01/22 23:32:10  eokerson
  148.  * Some bugfixes from David Huggins-Daines, <dhd@cepstral.com> and other cleanups.
  149.  *
  150.  * Revision 3.83  2001/01/19 14:51:41  eokerson
  151.  * Fixed ixj_WriteDSPCommand to decrement usage counter when command fails.
  152.  *
  153.  * Revision 3.82  2001/01/19 00:34:49  eokerson
  154.  * Added verbosity to write overlap errors.
  155.  *
  156.  * Revision 3.81  2001/01/18 23:56:54  eokerson
  157.  * Fixed PSTN line test functions.
  158.  *
  159.  * Revision 3.80  2001/01/18 22:29:27  eokerson
  160.  * Updated AEC/AGC values for different cards.
  161.  *
  162.  * Revision 3.79  2001/01/17 02:58:54  eokerson
  163.  * Fixed AEC reset after Caller ID.
  164.  * Fixed Codec lockup after Caller ID on Call Waiting when not using 30ms frames.
  165.  *
  166.  * Revision 3.78  2001/01/16 19:43:09  eokerson
  167.  * Added support for Linux 2.4.x kernels.
  168.  *
  169.  * Revision 3.77  2001/01/09 04:00:52  eokerson
  170.  * Linetest will now test the line, even if it has previously succeded.
  171.  *
  172.  * Revision 3.76  2001/01/08 19:27:00  eokerson
  173.  * Fixed problem with standard cable on Internet PhoneCARD.
  174.  *
  175.  * Revision 3.75  2000/12/22 16:52:14  eokerson
  176.  * Modified to allow hookstate detection on the POTS port when the PSTN port is selected.
  177.  *
  178.  * Revision 3.74  2000/12/08 22:41:50  eokerson
  179.  * Added capability for G729B.
  180.  *
  181.  * Revision 3.73  2000/12/07 23:35:16  eokerson
  182.  * Added capability to have different ring pattern before CallerID data.
  183.  * Added hookstate checks in CallerID routines to stop FSK.
  184.  *
  185.  * Revision 3.72  2000/12/06 19:31:31  eokerson
  186.  * Modified signal behavior to only send one signal per event.
  187.  *
  188.  * Revision 3.71  2000/12/06 03:23:08  eokerson
  189.  * Fixed CallerID on Call Waiting.
  190.  *
  191.  * Revision 3.70  2000/12/04 21:29:37  eokerson
  192.  * Added checking to Smart Cable gain functions.
  193.  *
  194.  * Revision 3.69  2000/12/04 21:05:20  eokerson
  195.  * Changed ixjdebug levels.
  196.  * Added ioctls to change gains in Internet Phone CARD Smart Cable.
  197.  *
  198.  * Revision 3.68  2000/12/04 00:17:21  craigs
  199.  * Changed mixer voice gain to +6dB rather than 0dB
  200.  *
  201.  * Revision 3.67  2000/11/30 21:25:51  eokerson
  202.  * Fixed write signal errors.
  203.  *
  204.  * Revision 3.66  2000/11/29 22:42:44  eokerson
  205.  * Fixed PSTN ring detect problems.
  206.  *
  207.  * Revision 3.65  2000/11/29 07:31:55  craigs
  208.  * Added new 425Hz filter co-efficients
  209.  * Added card-specific DTMF prescaler initialisation
  210.  *
  211.  * Revision 3.64  2000/11/28 14:03:32  craigs
  212.  * Changed certain mixer initialisations to be 0dB rather than 12dB
  213.  * Added additional information to /proc/ixj
  214.  *
  215.  * Revision 3.63  2000/11/28 11:38:41  craigs
  216.  * Added display of AEC modes in AUTO and AGC mode
  217.  *
  218.  * Revision 3.62  2000/11/28 04:05:44  eokerson
  219.  * Improved PSTN ring detection routine.
  220.  *
  221.  * Revision 3.61  2000/11/27 21:53:12  eokerson
  222.  * Fixed flash detection.
  223.  *
  224.  * Revision 3.60  2000/11/27 15:57:29  eokerson
  225.  * More work on G.729 load routines.
  226.  *
  227.  * Revision 3.59  2000/11/25 21:55:12  eokerson
  228.  * Fixed errors in G.729 load routine.
  229.  *
  230.  * Revision 3.58  2000/11/25 04:08:29  eokerson
  231.  * Added board locks around G.729 and TS85 load routines.
  232.  *
  233.  * Revision 3.57  2000/11/24 05:35:17  craigs
  234.  * Added ability to retrieve mixer values on LineJACK
  235.  * Added complete initialisation of all mixer values at startup
  236.  * Fixed spelling mistake
  237.  *
  238.  * Revision 3.56  2000/11/23 02:52:11  robertj
  239.  * Added cvs change log keyword.
  240.  * Fixed bug in capabilities list when using G.729 module.
  241.  *
  242.  */
  243. #include "ixj-ver.h"
  244. #define PERFMON_STATS
  245. #define IXJDEBUG 0
  246. #define MAXRINGS 5
  247. #include <linux/module.h>
  248. #include <linux/init.h>
  249. #include <linux/sched.h>
  250. #include <linux/kernel.h> /* printk() */
  251. #include <linux/fs.h> /* everything... */
  252. #include <linux/errno.h> /* error codes */
  253. #include <linux/slab.h>
  254. #include <linux/mm.h>
  255. #include <linux/ioport.h>
  256. #include <linux/interrupt.h>
  257. #include <linux/tqueue.h>
  258. #include <linux/proc_fs.h>
  259. #include <linux/poll.h>
  260. #include <linux/timer.h>
  261. #include <linux/delay.h>
  262. #include <linux/pci.h>
  263. #include <asm/io.h>
  264. #include <asm/segment.h>
  265. #include <asm/uaccess.h>
  266. #include <linux/isapnp.h>
  267. #include "ixj.h"
  268. #define TYPE(dev) (MINOR(dev) >> 4)
  269. #define NUM(dev) (MINOR(dev) & 0xf)
  270. static int ixjdebug;
  271. static int hertz = HZ;
  272. static int samplerate = 100;
  273. MODULE_PARM(ixjdebug, "i");
  274. /************************************************************************
  275. *
  276. * ixjdebug meanings are now bit mapped instead of level based
  277. * Values can be or'ed together to turn on multiple messages
  278. *
  279. * bit  0 (0x0001) = any failure
  280. * bit  1 (0x0002) = general messages
  281. * bit  2 (0x0004) = POTS ringing related
  282. * bit  3 (0x0008) = PSTN events
  283. * bit  4 (0x0010) = PSTN Cadence state details
  284. * bit  5 (0x0020) = Tone detection triggers
  285. * bit  6 (0x0040) = Tone detection cadence details
  286. * bit  7 (0x0080) = ioctl tracking
  287. * bit  8 (0x0100) = signal tracking
  288. * bit  9 (0x0200) = CallerID generation details
  289. *
  290. ************************************************************************/
  291. #ifdef IXJ_DYN_ALLOC
  292. static IXJ *ixj[IXJMAX];
  293. #define get_ixj(b) ixj[(b)]
  294. /*
  295.  * Allocate a free IXJ device
  296.  */
  297.  
  298. static IXJ *ixj_alloc()
  299. {
  300. for(cnt=0; cnt<IXJMAX; cnt++)
  301. {
  302. if(ixj[cnt] == NULL || !ixj[cnt]->DSPbase)
  303. {
  304. j = kmalloc(sizeof(IXJ), GFP_KERNEL);
  305. if (j == NULL)
  306. return NULL;
  307. ixj[cnt] = j;
  308. return j;
  309. }
  310. }
  311. return NULL;
  312. }
  313. static void ixj_fsk_free(IXJ *j)
  314. {
  315. if(j->fskdata != NULL) {
  316. kfree(j->fskdata);
  317. j->fskdata = NULL;
  318. }
  319. }
  320. static void ixj_fsk_alloc(IXJ *j)
  321. {
  322. if(!j->fskdata) {
  323. j->fskdata = kmalloc(8000, GFP_KERNEL);
  324. if (!j->fskdata) {
  325. if(ixjdebug & 0x0200) {
  326. printk("IXJ phone%d - allocate failedn", j->board);
  327. }
  328. return;
  329. } else {
  330. j->fsksize = 8000;
  331. if(ixjdebug & 0x0200) {
  332. printk("IXJ phone%d - allocate succededn", j->board);
  333. }
  334. }
  335. }
  336. }
  337. #else
  338. static IXJ ixj[IXJMAX];
  339. #define get_ixj(b) (&ixj[(b)])
  340. /*
  341.  * Allocate a free IXJ device
  342.  */
  343.  
  344. static IXJ *ixj_alloc(void)
  345. {
  346. int cnt;
  347. for(cnt=0; cnt<IXJMAX; cnt++)
  348. {
  349. if(!ixj[cnt].DSPbase)
  350. {
  351. return &ixj[cnt];
  352. }
  353. }
  354. return NULL;
  355. }
  356. static inline void ixj_fsk_free(IXJ *j) {;}
  357. static inline void ixj_fsk_alloc(IXJ *j)
  358. {
  359. j->fsksize = 8000;
  360. }
  361. #endif
  362. #ifdef PERFMON_STATS
  363. #define ixj_perfmon(x) ((x)++)
  364. #else
  365. #define ixj_perfmon(x) do { } while(0)
  366. #endif
  367. static int ixj_convert_loaded;
  368. static int ixj_WriteDSPCommand(unsigned short, IXJ *j);
  369. /************************************************************************
  370. *
  371. * These are function definitions to allow external modules to register
  372. * enhanced functionality call backs.
  373. *
  374. ************************************************************************/
  375. static int Stub(IXJ * J, unsigned long arg)
  376. {
  377. return 0;
  378. }
  379. static IXJ_REGFUNC ixj_DownloadG729 = &Stub;
  380. static IXJ_REGFUNC ixj_DownloadTS85 = &Stub;
  381. static IXJ_REGFUNC ixj_PreRead = &Stub;
  382. static IXJ_REGFUNC ixj_PostRead = &Stub;
  383. static IXJ_REGFUNC ixj_PreWrite = &Stub;
  384. static IXJ_REGFUNC ixj_PostWrite = &Stub;
  385. static IXJ_REGFUNC ixj_PreIoctl = &Stub;
  386. static IXJ_REGFUNC ixj_PostIoctl = &Stub;
  387. static void ixj_read_frame(IXJ *j);
  388. static void ixj_write_frame(IXJ *j);
  389. static void ixj_init_timer(IXJ *j);
  390. static void ixj_add_timer(IXJ * j);
  391. static void ixj_timeout(unsigned long ptr);
  392. static int read_filters(IXJ *j);
  393. static int LineMonitor(IXJ *j);
  394. static int ixj_fasync(int fd, struct file *, int mode);
  395. static int ixj_set_port(IXJ *j, int arg);
  396. static int ixj_set_pots(IXJ *j, int arg);
  397. static int ixj_hookstate(IXJ *j);
  398. static int ixj_record_start(IXJ *j);
  399. static void ixj_record_stop(IXJ *j);
  400. static void set_rec_volume(IXJ *j, int volume);
  401. static int get_rec_volume(IXJ *j);
  402. static int set_rec_codec(IXJ *j, int rate);
  403. static void ixj_vad(IXJ *j, int arg);
  404. static int ixj_play_start(IXJ *j);
  405. static void ixj_play_stop(IXJ *j);
  406. static int ixj_set_tone_on(unsigned short arg, IXJ *j);
  407. static int ixj_set_tone_off(unsigned short, IXJ *j);
  408. static int ixj_play_tone(IXJ *j, char tone);
  409. static void ixj_aec_start(IXJ *j, int level);
  410. static int idle(IXJ *j);
  411. static void ixj_ring_on(IXJ *j);
  412. static void ixj_ring_off(IXJ *j);
  413. static void aec_stop(IXJ *j);
  414. static void ixj_ringback(IXJ *j);
  415. static void ixj_busytone(IXJ *j);
  416. static void ixj_dialtone(IXJ *j);
  417. static void ixj_cpt_stop(IXJ *j);
  418. static char daa_int_read(IXJ *j);
  419. static char daa_CR_read(IXJ *j, int cr);
  420. static int daa_set_mode(IXJ *j, int mode);
  421. static int ixj_linetest(IXJ *j);
  422. static int ixj_daa_write(IXJ *j);
  423. static int ixj_daa_cid_read(IXJ *j);
  424. static void DAA_Coeff_US(IXJ *j);
  425. static void DAA_Coeff_UK(IXJ *j);
  426. static void DAA_Coeff_France(IXJ *j);
  427. static void DAA_Coeff_Germany(IXJ *j);
  428. static void DAA_Coeff_Australia(IXJ *j);
  429. static void DAA_Coeff_Japan(IXJ *j);
  430. static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf);
  431. static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr);
  432. static int ixj_init_tone(IXJ *j, IXJ_TONE * ti);
  433. static int ixj_build_cadence(IXJ *j, IXJ_CADENCE * cp);
  434. static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE * cp);
  435. /* Serial Control Interface funtions */
  436. static int SCI_Control(IXJ *j, int control);
  437. static int SCI_Prepare(IXJ *j);
  438. static int SCI_WaitHighSCI(IXJ *j);
  439. static int SCI_WaitLowSCI(IXJ *j);
  440. static DWORD PCIEE_GetSerialNumber(WORD wAddress);
  441. static int ixj_PCcontrol_wait(IXJ *j);
  442. static void ixj_pre_cid(IXJ *j);
  443. static void ixj_write_cid(IXJ *j);
  444. static void ixj_write_cid_bit(IXJ *j, int bit);
  445. static int set_base_frame(IXJ *j, int size);
  446. static int set_play_codec(IXJ *j, int rate);
  447. static void set_rec_depth(IXJ *j, int depth);
  448. static int ixj_mixer(long val, IXJ *j);
  449. /************************************************************************
  450. CT8020/CT8021 Host Programmers Model
  451. Host address Function Access
  452. DSPbase +
  453. 0-1 Aux Software Status Register (reserved) Read Only
  454. 2-3 Software Status Register Read Only
  455. 4-5 Aux Software Control Register (reserved) Read Write
  456. 6-7 Software Control Register Read Write
  457. 8-9 Hardware Status Register Read Only
  458. A-B Hardware Control Register Read Write
  459. C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only
  460. E-F Host Recieve (Read) Data Buffer Access Port (buffer input) Read Only
  461. ************************************************************************/
  462. static inline void ixj_read_HSR(IXJ *j)
  463. {
  464. j->hsr.bytes.low = inb_p(j->DSPbase + 8);
  465. j->hsr.bytes.high = inb_p(j->DSPbase + 9);
  466. }
  467. static inline int IsControlReady(IXJ *j)
  468. {
  469. ixj_read_HSR(j);
  470. return j->hsr.bits.controlrdy ? 1 : 0;
  471. }
  472. static inline int IsPCControlReady(IXJ *j)
  473. {
  474. j->pccr1.byte = inb_p(j->XILINXbase + 3);
  475. return j->pccr1.bits.crr ? 1 : 0;
  476. }
  477. static inline int IsStatusReady(IXJ *j)
  478. {
  479. ixj_read_HSR(j);
  480. return j->hsr.bits.statusrdy ? 1 : 0;
  481. }
  482. static inline int IsRxReady(IXJ *j)
  483. {
  484. ixj_read_HSR(j);
  485. ixj_perfmon(j->rxreadycheck);
  486. return j->hsr.bits.rxrdy ? 1 : 0;
  487. }
  488. static inline int IsTxReady(IXJ *j)
  489. {
  490. ixj_read_HSR(j);
  491. ixj_perfmon(j->txreadycheck);
  492. return j->hsr.bits.txrdy ? 1 : 0;
  493. }
  494. static inline void set_play_volume(IXJ *j, int volume)
  495. {
  496. if (ixjdebug & 0x0002)
  497. printk(KERN_INFO "IXJ: /dev/phone%d Setting Play Volume to 0x%4.4xn", j->board, volume);
  498. ixj_WriteDSPCommand(0xCF02, j);
  499. ixj_WriteDSPCommand(volume, j);
  500. }
  501. static int set_play_volume_linear(IXJ *j, int volume)
  502. {
  503. int newvolume, dspplaymax;
  504. if (ixjdebug & 0x0002)
  505. printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Play Volume to 0x%4.4xn", j->board, volume);
  506. if(volume > 100 || volume < 0) {
  507. return -1;
  508. }
  509. /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
  510. switch (j->cardtype) {
  511. case QTI_PHONEJACK:
  512. dspplaymax = 0x380;
  513. break;
  514. case QTI_LINEJACK:
  515. if(j->port == PORT_PSTN) {
  516. dspplaymax = 0x48;
  517. } else {
  518. dspplaymax = 0x100;
  519. }
  520. break;
  521. case QTI_PHONEJACK_LITE:
  522. dspplaymax = 0x380;
  523. break;
  524. case QTI_PHONEJACK_PCI:
  525. dspplaymax = 0x6C;
  526. break;
  527. case QTI_PHONECARD:
  528. dspplaymax = 0x50;
  529. break;
  530. default:
  531. return -1;
  532. }
  533. newvolume = (dspplaymax * volume) / 100;
  534. set_play_volume(j, newvolume);
  535. return 0;
  536. }
  537. static inline void set_play_depth(IXJ *j, int depth)
  538. {
  539. if (depth > 60)
  540. depth = 60;
  541. if (depth < 0)
  542. depth = 0;
  543. ixj_WriteDSPCommand(0x5280 + depth, j);
  544. }
  545. static inline int get_play_volume(IXJ *j)
  546. {
  547. ixj_WriteDSPCommand(0xCF00, j);
  548. return j->ssr.high << 8 | j->ssr.low;
  549. }
  550. static int get_play_volume_linear(IXJ *j)
  551. {
  552. int volume, newvolume, dspplaymax;
  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 = 100;
  573. break;
  574. default:
  575. return -1;
  576. }
  577. volume = get_play_volume(j);
  578. newvolume = (volume * 100) / dspplaymax;
  579. if(newvolume > 100)
  580. newvolume = 100;
  581. return newvolume;
  582. }
  583. static inline BYTE SLIC_GetState(IXJ *j)
  584. {
  585. if (j->cardtype == QTI_PHONECARD) {
  586. j->pccr1.byte = 0;
  587. j->psccr.bits.dev = 3;
  588. j->psccr.bits.rw = 1;
  589. outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
  590. ixj_PCcontrol_wait(j);
  591. j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
  592. ixj_PCcontrol_wait(j);
  593. if (j->pslic.bits.powerdown)
  594. return PLD_SLIC_STATE_OC;
  595. else if (!j->pslic.bits.ring0 && !j->pslic.bits.ring1)
  596. return PLD_SLIC_STATE_ACTIVE;
  597. else
  598. return PLD_SLIC_STATE_RINGING;
  599. } else {
  600. j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
  601. }
  602. return j->pld_slicr.bits.state;
  603. }
  604. static BOOL SLIC_SetState(BYTE byState, IXJ *j)
  605. {
  606. BOOL fRetVal = FALSE;
  607. if (j->cardtype == QTI_PHONECARD) {
  608. if (j->flags.pcmciasct) {
  609. switch (byState) {
  610. case PLD_SLIC_STATE_TIPOPEN:
  611. case PLD_SLIC_STATE_OC:
  612. j->pslic.bits.powerdown = 1;
  613. j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
  614. fRetVal = TRUE;
  615. break;
  616. case PLD_SLIC_STATE_RINGING:
  617. if (j->readers || j->writers) {
  618. j->pslic.bits.powerdown = 0;
  619. j->pslic.bits.ring0 = 1;
  620. j->pslic.bits.ring1 = 0;
  621. fRetVal = TRUE;
  622. }
  623. break;
  624. case PLD_SLIC_STATE_OHT: /* On-hook transmit */
  625. case PLD_SLIC_STATE_STANDBY:
  626. case PLD_SLIC_STATE_ACTIVE:
  627. if (j->readers || j->writers) {
  628. j->pslic.bits.powerdown = 0;
  629. } else {
  630. j->pslic.bits.powerdown = 1;
  631. }
  632. j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
  633. fRetVal = TRUE;
  634. break;
  635. case PLD_SLIC_STATE_APR: /* Active polarity reversal */
  636. case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
  637. default:
  638. fRetVal = FALSE;
  639. break;
  640. }
  641. j->psccr.bits.dev = 3;
  642. j->psccr.bits.rw = 0;
  643. outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
  644. ixj_PCcontrol_wait(j);
  645. }
  646. } else {
  647. /* Set the C1, C2, C3 & B2EN signals. */
  648. switch (byState) {
  649. case PLD_SLIC_STATE_OC:
  650. j->pld_slicw.bits.c1 = 0;
  651. j->pld_slicw.bits.c2 = 0;
  652. j->pld_slicw.bits.c3 = 0;
  653. j->pld_slicw.bits.b2en = 0;
  654. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  655. fRetVal = TRUE;
  656. break;
  657. case PLD_SLIC_STATE_RINGING:
  658. j->pld_slicw.bits.c1 = 1;
  659. j->pld_slicw.bits.c2 = 0;
  660. j->pld_slicw.bits.c3 = 0;
  661. j->pld_slicw.bits.b2en = 1;
  662. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  663. fRetVal = TRUE;
  664. break;
  665. case PLD_SLIC_STATE_ACTIVE:
  666. j->pld_slicw.bits.c1 = 0;
  667. j->pld_slicw.bits.c2 = 1;
  668. j->pld_slicw.bits.c3 = 0;
  669. j->pld_slicw.bits.b2en = 0;
  670. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  671. fRetVal = TRUE;
  672. break;
  673. case PLD_SLIC_STATE_OHT: /* On-hook transmit */
  674. j->pld_slicw.bits.c1 = 1;
  675. j->pld_slicw.bits.c2 = 1;
  676. j->pld_slicw.bits.c3 = 0;
  677. j->pld_slicw.bits.b2en = 0;
  678. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  679. fRetVal = TRUE;
  680. break;
  681. case PLD_SLIC_STATE_TIPOPEN:
  682. j->pld_slicw.bits.c1 = 0;
  683. j->pld_slicw.bits.c2 = 0;
  684. j->pld_slicw.bits.c3 = 1;
  685. j->pld_slicw.bits.b2en = 0;
  686. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  687. fRetVal = TRUE;
  688. break;
  689. case PLD_SLIC_STATE_STANDBY:
  690. j->pld_slicw.bits.c1 = 1;
  691. j->pld_slicw.bits.c2 = 0;
  692. j->pld_slicw.bits.c3 = 1;
  693. j->pld_slicw.bits.b2en = 1;
  694. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  695. fRetVal = TRUE;
  696. break;
  697. case PLD_SLIC_STATE_APR: /* Active polarity reversal */
  698. j->pld_slicw.bits.c1 = 0;
  699. j->pld_slicw.bits.c2 = 1;
  700. j->pld_slicw.bits.c3 = 1;
  701. j->pld_slicw.bits.b2en = 0;
  702. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  703. fRetVal = TRUE;
  704. break;
  705. case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
  706. j->pld_slicw.bits.c1 = 1;
  707. j->pld_slicw.bits.c2 = 1;
  708. j->pld_slicw.bits.c3 = 1;
  709. j->pld_slicw.bits.b2en = 0;
  710. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  711. fRetVal = TRUE;
  712. break;
  713. default:
  714. fRetVal = FALSE;
  715. break;
  716. }
  717. }
  718. return fRetVal;
  719. }
  720. static int ixj_wink(IXJ *j)
  721. {
  722. BYTE slicnow;
  723. slicnow = SLIC_GetState(j);
  724. j->pots_winkstart = jiffies;
  725. SLIC_SetState(PLD_SLIC_STATE_OC, j);
  726. while (time_before(jiffies, j->pots_winkstart + j->winktime)) {
  727. set_current_state(TASK_INTERRUPTIBLE);
  728. schedule_timeout(1);
  729. }
  730. SLIC_SetState(slicnow, j);
  731. return 0;
  732. }
  733. static int ixj_register(int index, IXJ_REGFUNC regfunc)
  734. {
  735. int cnt;
  736. int retval = 0;
  737. switch (index) {
  738. case G729LOADER:
  739. ixj_DownloadG729 = regfunc;
  740. for (cnt = 0; cnt < IXJMAX; cnt++) {
  741. IXJ *j = get_ixj(cnt);
  742. while(test_and_set_bit(cnt, (void *)&j->busyflags) != 0) {
  743. set_current_state(TASK_INTERRUPTIBLE);
  744. schedule_timeout(1);
  745. }
  746. ixj_DownloadG729(j, 0L);
  747. clear_bit(cnt, &j->busyflags);
  748. }
  749. break;
  750. case TS85LOADER:
  751. ixj_DownloadTS85 = regfunc;
  752. for (cnt = 0; cnt < IXJMAX; cnt++) {
  753. IXJ *j = get_ixj(cnt);
  754. while(test_and_set_bit(cnt, (void *)&j->busyflags) != 0) {
  755. set_current_state(TASK_INTERRUPTIBLE);
  756. schedule_timeout(1);
  757. }
  758. ixj_DownloadTS85(j, 0L);
  759. clear_bit(cnt, &j->busyflags);
  760. }
  761. break;
  762. case PRE_READ:
  763. ixj_PreRead = regfunc;
  764. break;
  765. case POST_READ:
  766. ixj_PostRead = regfunc;
  767. break;
  768. case PRE_WRITE:
  769. ixj_PreWrite = regfunc;
  770. break;
  771. case POST_WRITE:
  772. ixj_PostWrite = regfunc;
  773. break;
  774. case PRE_IOCTL:
  775. ixj_PreIoctl = regfunc;
  776. break;
  777. case POST_IOCTL:
  778. ixj_PostIoctl = regfunc;
  779. break;
  780. default:
  781. retval = 1;
  782. }
  783. return retval;
  784. }
  785. EXPORT_SYMBOL(ixj_register);
  786. static int ixj_unregister(int index)
  787. {
  788. int retval = 0;
  789. switch (index) {
  790. case G729LOADER:
  791. ixj_DownloadG729 = &Stub;
  792. break;
  793. case TS85LOADER:
  794. ixj_DownloadTS85 = &Stub;
  795. break;
  796. case PRE_READ:
  797. ixj_PreRead = &Stub;
  798. break;
  799. case POST_READ:
  800. ixj_PostRead = &Stub;
  801. break;
  802. case PRE_WRITE:
  803. ixj_PreWrite = &Stub;
  804. break;
  805. case POST_WRITE:
  806. ixj_PostWrite = &Stub;
  807. break;
  808. case PRE_IOCTL:
  809. ixj_PreIoctl = &Stub;
  810. break;
  811. case POST_IOCTL:
  812. ixj_PostIoctl = &Stub;
  813. break;
  814. default:
  815. retval = 1;
  816. }
  817. return retval;
  818. }
  819. EXPORT_SYMBOL(ixj_unregister);
  820. static void ixj_init_timer(IXJ *j)
  821. {
  822. init_timer(&j->timer);
  823. j->timer.function = ixj_timeout;
  824. j->timer.data = (unsigned long)j;
  825. }
  826. static void ixj_add_timer(IXJ *j)
  827. {
  828. j->timer.expires = jiffies + (hertz / samplerate);
  829. add_timer(&j->timer);
  830. }
  831. static void ixj_tone_timeout(IXJ *j)
  832. {
  833. IXJ_TONE ti;
  834. j->tone_state++;
  835. if (j->tone_state == 3) {
  836. j->tone_state = 0;
  837. if (j->cadence_t) {
  838. j->tone_cadence_state++;
  839. if (j->tone_cadence_state >= j->cadence_t->elements_used) {
  840. switch (j->cadence_t->termination) {
  841. case PLAY_ONCE:
  842. ixj_cpt_stop(j);
  843. break;
  844. case REPEAT_LAST_ELEMENT:
  845. j->tone_cadence_state--;
  846. ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
  847. break;
  848. case REPEAT_ALL:
  849. j->tone_cadence_state = 0;
  850. if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
  851. ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
  852. ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
  853. ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
  854. ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
  855. ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
  856. ixj_init_tone(j, &ti);
  857. }
  858. ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, j);
  859. ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, j);
  860. ixj_play_tone(j, j->cadence_t->ce[0].index);
  861. break;
  862. }
  863. } else {
  864. if (j->cadence_t->ce[j->tone_cadence_state].gain0) {
  865. ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
  866. ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
  867. ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
  868. ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
  869. ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
  870. ixj_init_tone(j, &ti);
  871. }
  872. ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, j);
  873. ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, j);
  874. ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
  875. }
  876. }
  877. }
  878. }
  879. static inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir)
  880. {
  881. if(j->ixj_signals[event]) {
  882. if(ixjdebug & 0x0100)
  883. printk("Sending signal for event %dn", event);
  884. /* Send apps notice of change */
  885. /* see config.h for macro definition */
  886. kill_fasync(&(j->async_queue), j->ixj_signals[event], dir);
  887. }
  888. }
  889. static void ixj_pstn_state(IXJ *j)
  890. {
  891. int var;
  892. union XOPXR0 XR0, daaint;
  893. var = 10;
  894. XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg;
  895. daaint.reg = 0;
  896. XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
  897. j->pld_scrr.byte = inb_p(j->XILINXbase);
  898. if (j->pld_scrr.bits.daaflag) {
  899. daa_int_read(j);
  900. if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) {
  901. if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {
  902. daaint.bitreg.RING = 1;
  903. if(ixjdebug & 0x0008) {
  904. printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ldn", j->board, jiffies);
  905. }
  906. } else {
  907. daa_set_mode(j, SOP_PU_RESET);
  908. }
  909. }
  910. if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) {
  911. daaint.bitreg.Caller_ID = 1;
  912. j->pstn_cid_intr = 1;
  913. j->pstn_cid_received = jiffies;
  914. if(ixjdebug & 0x0008) {
  915. printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ldn", j->board, jiffies);
  916. }
  917. }
  918. if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) {
  919. daaint.bitreg.Cadence = 1;
  920. if(ixjdebug & 0x0008) {
  921. printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ldn", j->board, jiffies);
  922. }
  923. }
  924. if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) {
  925. daaint.bitreg.VDD_OK = 1;
  926. daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK;
  927. }
  928. }
  929. daa_CR_read(j, 1);
  930. 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)) {
  931. daaint.bitreg.RMR = 1;
  932. daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
  933. if(ixjdebug & 0x0008) {
  934.                         printk(KERN_INFO "IXJ DAA RMR /dev/phone%d was %s for %ldn", j->board, XR0.bitreg.RMR?"on":"off", jiffies - j->pstn_last_rmr);
  935. }
  936. j->pstn_prev_rmr = j->pstn_last_rmr;
  937. j->pstn_last_rmr = jiffies;
  938. }
  939. switch(j->daa_mode) {
  940. case SOP_PU_SLEEP:
  941. if (daaint.bitreg.RING) {
  942. if (!j->flags.pstn_ringing) {
  943. if (j->daa_mode != SOP_PU_RINGING) {
  944. j->pstn_ring_int = jiffies;
  945. daa_set_mode(j, SOP_PU_RINGING);
  946. }
  947. }
  948. }
  949. break;
  950. case SOP_PU_RINGING:
  951. if (daaint.bitreg.RMR) {
  952. if (ixjdebug & 0x0008) {
  953. printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ldn", j->cadence_f[4].state, j->board, jiffies);
  954. }
  955. if (daaint.bitreg.SI_1) {                /* Rising edge of RMR */
  956. j->flags.pstn_rmr = 1;
  957. j->pstn_ring_start = jiffies;
  958. j->pstn_ring_stop = 0;
  959. j->ex.bits.pstn_ring = 0;
  960. if (j->cadence_f[4].state == 0) {
  961. j->cadence_f[4].state = 1;
  962. j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000);
  963. j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000);
  964. j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000);
  965. } else if (j->cadence_f[4].state == 2) {
  966. if((time_after(jiffies, j->cadence_f[4].off1min) &&
  967.     time_before(jiffies, j->cadence_f[4].off1max))) {
  968. if (j->cadence_f[4].on2) {
  969. j->cadence_f[4].state = 3;
  970. j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000));
  971. j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000));
  972. j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000));
  973. } else {
  974. j->cadence_f[4].state = 7;
  975. }
  976. } else {
  977. if (ixjdebug & 0x0008) {
  978. printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %dn",
  979. j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
  980. j->cadence_f[4].off1);
  981. }
  982. j->cadence_f[4].state = 0;
  983. }
  984. } else if (j->cadence_f[4].state == 4) {
  985. if((time_after(jiffies, j->cadence_f[4].off2min) &&
  986.     time_before(jiffies, j->cadence_f[4].off2max))) {
  987. if (j->cadence_f[4].on3) {
  988. j->cadence_f[4].state = 5;
  989. j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000));
  990. j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000));
  991. j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000));
  992. } else {
  993. j->cadence_f[4].state = 7;
  994. }
  995. } else {
  996. if (ixjdebug & 0x0008) {
  997. printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %dn",
  998. j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
  999. j->cadence_f[4].off2);
  1000. }
  1001. j->cadence_f[4].state = 0;
  1002. }
  1003. } else if (j->cadence_f[4].state == 6) {
  1004. if((time_after(jiffies, j->cadence_f[4].off3min) &&
  1005.     time_before(jiffies, j->cadence_f[4].off3max))) {
  1006. j->cadence_f[4].state = 7;
  1007. } else {
  1008. if (ixjdebug & 0x0008) {
  1009. printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %dn",
  1010. j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
  1011. j->cadence_f[4].off3);
  1012. }
  1013. j->cadence_f[4].state = 0;
  1014. }
  1015. } else {
  1016. j->cadence_f[4].state = 0;
  1017. }
  1018. } else {                                /* Falling edge of RMR */
  1019. j->pstn_ring_start = 0;
  1020. j->pstn_ring_stop = jiffies;
  1021. if (j->cadence_f[4].state == 1) {
  1022. if(!j->cadence_f[4].on1) {
  1023. j->cadence_f[4].state = 7;
  1024. } else if((time_after(jiffies, j->cadence_f[4].on1min) &&
  1025.           time_before(jiffies, j->cadence_f[4].on1max))) {
  1026. if (j->cadence_f[4].off1) {
  1027. j->cadence_f[4].state = 2;
  1028. j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000));
  1029. j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000));
  1030. j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000));
  1031. } else {
  1032. j->cadence_f[4].state = 7;
  1033. }
  1034. } else {
  1035. if (ixjdebug & 0x0008) {
  1036. printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %dn",
  1037. j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
  1038. j->cadence_f[4].on1);
  1039. }
  1040. j->cadence_f[4].state = 0;
  1041. }
  1042. } else if (j->cadence_f[4].state == 3) {
  1043. if((time_after(jiffies, j->cadence_f[4].on2min) &&
  1044.     time_before(jiffies, j->cadence_f[4].on2max))) {
  1045. if (j->cadence_f[4].off2) {
  1046. j->cadence_f[4].state = 4;
  1047. j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000));
  1048. j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000));
  1049. j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000));
  1050. } else {
  1051. j->cadence_f[4].state = 7;
  1052. }
  1053. } else {
  1054. if (ixjdebug & 0x0008) {
  1055. printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %dn",
  1056. j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
  1057. j->cadence_f[4].on2);
  1058. }
  1059. j->cadence_f[4].state = 0;
  1060. }
  1061. } else if (j->cadence_f[4].state == 5) {
  1062. if((time_after(jiffies, j->cadence_f[4].on3min) &&
  1063.     time_before(jiffies, j->cadence_f[4].on3max))) {
  1064. if (j->cadence_f[4].off3) {
  1065. j->cadence_f[4].state = 6;
  1066. j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000));
  1067. j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000));
  1068. j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000));
  1069. } else {
  1070. j->cadence_f[4].state = 7;
  1071. }
  1072. } else {
  1073. j->cadence_f[4].state = 0;
  1074. }
  1075. } else {
  1076. if (ixjdebug & 0x0008) {
  1077. printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %dn",
  1078. j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
  1079. j->cadence_f[4].on3);
  1080. }
  1081. j->cadence_f[4].state = 0;
  1082. }
  1083. }
  1084. if (ixjdebug & 0x0010) {
  1085. printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ldn", j->cadence_f[4].state, j->board, jiffies);
  1086. }
  1087. if (ixjdebug & 0x0010) {
  1088. switch(j->cadence_f[4].state) {
  1089. case 1:
  1090. printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ldn", j->board,
  1091. j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max);
  1092. break;
  1093. case 2:
  1094. printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ldn", j->board,
  1095. j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max);
  1096. break;
  1097. case 3:
  1098. printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ldn", j->board,
  1099. j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max);
  1100. break;
  1101. case 4:
  1102. printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ldn", j->board,
  1103. j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max);
  1104. break;
  1105. case 5:
  1106. printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ldn", j->board,
  1107. j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max);
  1108. break;
  1109. case 6:
  1110. printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ldn", j->board,
  1111. j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max);
  1112. break;
  1113. }
  1114. }
  1115. }
  1116. if (j->cadence_f[4].state == 7) {
  1117. j->cadence_f[4].state = 0;
  1118. j->pstn_ring_stop = jiffies;
  1119. j->ex.bits.pstn_ring = 1;
  1120. ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN);
  1121. if(ixjdebug & 0x0008) {
  1122. printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ldn", j->board, jiffies);
  1123. }
  1124. }
  1125. if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) ||
  1126.    (j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) {
  1127. if(ixjdebug & 0x0008) {
  1128. printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ldn", j->board, jiffies);
  1129. printk("IXJ DAA pstn ring int /dev/phone%d at %ldn", j->board, j->pstn_ring_int);
  1130. printk("IXJ DAA pstn ring stop /dev/phone%d at %ldn", j->board, j->pstn_ring_stop);
  1131. }
  1132. j->pstn_ring_stop = j->pstn_ring_int = 0;
  1133. daa_set_mode(j, SOP_PU_SLEEP);
  1134. outb_p(j->pld_scrw.byte, j->XILINXbase);
  1135. if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) {
  1136. ixj_daa_cid_read(j);
  1137. j->ex.bits.caller_id = 1;
  1138. ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN);
  1139. j->pstn_cid_intr = 0;
  1140. }
  1141. if (daaint.bitreg.Cadence) {
  1142. if(ixjdebug & 0x0008) {
  1143. printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%dn", j->board);
  1144. }
  1145. daa_set_mode(j, SOP_PU_SLEEP);
  1146. j->ex.bits.pstn_ring = 0;
  1147. }
  1148. break;
  1149. case SOP_PU_CONVERSATION:
  1150. if (daaint.bitreg.VDD_OK) {
  1151. if(!daaint.bitreg.SI_0) {
  1152. if (!j->pstn_winkstart) {
  1153. if(ixjdebug & 0x0008) {
  1154. printk("IXJ DAA possible wink /dev/phone%d %ldn", j->board, jiffies);
  1155. }
  1156. j->pstn_winkstart = jiffies;
  1157. } else {
  1158. if (j->pstn_winkstart) {
  1159. if(ixjdebug & 0x0008) {
  1160. printk("IXJ DAA possible wink end /dev/phone%d %ldn", j->board, jiffies);
  1161. }
  1162. j->pstn_winkstart = 0;
  1163. }
  1164. }
  1165. }
  1166. if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) {
  1167. if(ixjdebug & 0x0008) {
  1168. printk("IXJ DAA wink detected going to sleep /dev/phone%d %ldn", j->board, jiffies);
  1169. }
  1170. daa_set_mode(j, SOP_PU_SLEEP);
  1171. j->pstn_winkstart = 0;
  1172. j->ex.bits.pstn_wink = 1;
  1173. ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN);
  1174. }
  1175. break;
  1176. }
  1177. }
  1178. static void ixj_timeout(unsigned long ptr)
  1179. {
  1180. int board;
  1181. unsigned long jifon;
  1182. IXJ *j = (IXJ *)ptr;
  1183. board = j->board;
  1184. if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) {
  1185. ixj_perfmon(j->timerchecks);
  1186. j->hookstate = ixj_hookstate(j);
  1187. if (j->tone_state) {
  1188. if (!(j->hookstate)) {
  1189. ixj_cpt_stop(j);
  1190. if (j->m_hook) {
  1191. j->m_hook = 0;
  1192. j->ex.bits.hookstate = 1;
  1193. ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
  1194. }
  1195. clear_bit(board, &j->busyflags);
  1196. ixj_add_timer(j);
  1197. return;
  1198. }
  1199. if (j->tone_state == 1)
  1200. jifon = ((hertz * j->tone_on_time) * 25 / 100000);
  1201. else
  1202. jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000);
  1203. if (time_before(jiffies, j->tone_start_jif + jifon)) {
  1204. if (j->tone_state == 1) {
  1205. ixj_play_tone(j, j->tone_index);
  1206. if (j->dsp.low == 0x20) {
  1207. clear_bit(board, &j->busyflags);
  1208. ixj_add_timer(j);
  1209. return;
  1210. }
  1211. } else {
  1212. ixj_play_tone(j, 0);
  1213. if (j->dsp.low == 0x20) {
  1214. clear_bit(board, &j->busyflags);
  1215. ixj_add_timer(j);
  1216. return;
  1217. }
  1218. }
  1219. } else {
  1220. ixj_tone_timeout(j);
  1221. if (j->flags.dialtone) {
  1222. ixj_dialtone(j);
  1223. }
  1224. if (j->flags.busytone) {
  1225. ixj_busytone(j);
  1226. if (j->dsp.low == 0x20) {
  1227. clear_bit(board, &j->busyflags);
  1228. ixj_add_timer(j);
  1229. return;
  1230. }
  1231. }
  1232. if (j->flags.ringback) {
  1233. ixj_ringback(j);
  1234. if (j->dsp.low == 0x20) {
  1235. clear_bit(board, &j->busyflags);
  1236. ixj_add_timer(j);
  1237. return;
  1238. }
  1239. }
  1240. if (!j->tone_state) {
  1241. ixj_cpt_stop(j);
  1242. }
  1243. }
  1244. }
  1245. if (!(j->tone_state && j->dsp.low == 0x20)) {
  1246. if (IsRxReady(j)) {
  1247. ixj_read_frame(j);
  1248. }
  1249. if (IsTxReady(j)) {
  1250. ixj_write_frame(j);
  1251. }
  1252. }
  1253. if (j->flags.cringing) {
  1254. if (j->hookstate & 1) {
  1255. j->flags.cringing = 0;
  1256. ixj_ring_off(j);
  1257. } else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) {
  1258. switch(j->cadence_f[5].state) {
  1259. case 0:
  1260. j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000));
  1261. if (time_before(jiffies, j->cadence_f[5].on1dot)) {
  1262. if(ixjdebug & 0x0004) {
  1263. printk("Ringing cadence state = %d - %ldn", j->cadence_f[5].state, jiffies);
  1264. }
  1265. ixj_ring_on(j);
  1266. }
  1267. j->cadence_f[5].state = 1;
  1268. break;
  1269. case 1:
  1270. if (time_after(jiffies, j->cadence_f[5].on1dot)) {
  1271. j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000));
  1272. if(ixjdebug & 0x0004) {
  1273. printk("Ringing cadence state = %d - %ldn", j->cadence_f[5].state, jiffies);
  1274. }
  1275. ixj_ring_off(j);
  1276. j->cadence_f[5].state = 2;
  1277. }
  1278. break;
  1279. case 2:
  1280. if (time_after(jiffies, j->cadence_f[5].off1dot)) {
  1281. if(ixjdebug & 0x0004) {
  1282. printk("Ringing cadence state = %d - %ldn", j->cadence_f[5].state, jiffies);
  1283. }
  1284. ixj_ring_on(j);
  1285. if (j->cadence_f[5].on2) {
  1286. j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000));
  1287. j->cadence_f[5].state = 3;
  1288. } else {
  1289. j->cadence_f[5].state = 7;
  1290. }
  1291. }
  1292. break;
  1293. case 3:
  1294. if (time_after(jiffies, j->cadence_f[5].on2dot)) {
  1295. if(ixjdebug & 0x0004) {
  1296. printk("Ringing cadence state = %d - %ldn", j->cadence_f[5].state, jiffies);
  1297. }
  1298. ixj_ring_off(j);
  1299. if (j->cadence_f[5].off2) {
  1300. j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000));
  1301. j->cadence_f[5].state = 4;
  1302. } else {
  1303. j->cadence_f[5].state = 7;
  1304. }
  1305. }
  1306. break;
  1307. case 4:
  1308. if (time_after(jiffies, j->cadence_f[5].off2dot)) {
  1309. if(ixjdebug & 0x0004) {
  1310. printk("Ringing cadence state = %d - %ldn", j->cadence_f[5].state, jiffies);
  1311. }
  1312. ixj_ring_on(j);
  1313. if (j->cadence_f[5].on3) {
  1314. j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000));
  1315. j->cadence_f[5].state = 5;
  1316. } else {
  1317. j->cadence_f[5].state = 7;
  1318. }
  1319. }
  1320. break;
  1321. case 5:
  1322. if (time_after(jiffies, j->cadence_f[5].on3dot)) {
  1323. if(ixjdebug & 0x0004) {
  1324. printk("Ringing cadence state = %d - %ldn", j->cadence_f[5].state, jiffies);
  1325. }
  1326. ixj_ring_off(j);
  1327. if (j->cadence_f[5].off3) {
  1328. j->cadence_f[5].off3dot = jiffies + (long)((j->cadence_f[5].off3 * (hertz * 100) / 10000));
  1329. j->cadence_f[5].state = 6;
  1330. } else {
  1331. j->cadence_f[5].state = 7;
  1332. }
  1333. }
  1334. break;
  1335. case 6:
  1336. if (time_after(jiffies, j->cadence_f[5].off3dot)) {
  1337. if(ixjdebug & 0x0004) {
  1338. printk("Ringing cadence state = %d - %ldn", j->cadence_f[5].state, jiffies);
  1339. }
  1340. j->cadence_f[5].state = 7;
  1341. }
  1342. break;
  1343. case 7:
  1344. if(ixjdebug & 0x0004) {
  1345. printk("Ringing cadence state = %d - %ldn", j->cadence_f[5].state, jiffies);
  1346. }
  1347. j->flags.cidring = 1;
  1348. j->cadence_f[5].state = 0;
  1349. break;
  1350. }
  1351. if (j->flags.cidring && !j->flags.cidsent) {
  1352. j->flags.cidsent = 1;
  1353. if(j->fskdcnt) {
  1354. SLIC_SetState(PLD_SLIC_STATE_OHT, j);
  1355. ixj_pre_cid(j);
  1356. }
  1357. j->flags.cidring = 0;
  1358. }
  1359. clear_bit(board, &j->busyflags);
  1360. ixj_add_timer(j);
  1361. return;
  1362. } else {
  1363. if (time_after(jiffies, j->ring_cadence_jif + (hertz / 2))) {
  1364. if (j->flags.cidring && !j->flags.cidsent) {
  1365. j->flags.cidsent = 1;
  1366. if(j->fskdcnt) {
  1367. SLIC_SetState(PLD_SLIC_STATE_OHT, j);
  1368. ixj_pre_cid(j);
  1369. }
  1370. j->flags.cidring = 0;
  1371. }
  1372. j->ring_cadence_t--;
  1373. if (j->ring_cadence_t == -1)
  1374. j->ring_cadence_t = 15;
  1375. j->ring_cadence_jif = jiffies;
  1376. if (j->ring_cadence & 1 << j->ring_cadence_t) {
  1377. if(j->flags.cidsent && j->cadence_f[5].en_filter)
  1378. j->flags.firstring = 1;
  1379. else
  1380. ixj_ring_on(j);
  1381. } else {
  1382. ixj_ring_off(j);
  1383. if(!j->flags.cidsent)
  1384. j->flags.cidring = 1;
  1385. }
  1386. }
  1387. clear_bit(board, &j->busyflags);
  1388. ixj_add_timer(j);
  1389. return;
  1390. }
  1391. }
  1392. if (!j->flags.ringing) {
  1393. if (j->hookstate) { /* & 1) { */
  1394. if (j->dsp.low != 0x20 &&
  1395.     SLIC_GetState(j) != PLD_SLIC_STATE_ACTIVE) {
  1396. SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
  1397. }
  1398. LineMonitor(j);
  1399. read_filters(j);
  1400. ixj_WriteDSPCommand(0x511B, j);
  1401. j->proc_load = j->ssr.high << 8 | j->ssr.low;
  1402. if (!j->m_hook && (j->hookstate & 1)) {
  1403. j->m_hook = j->ex.bits.hookstate = 1;
  1404. ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
  1405. }
  1406. } else {
  1407. if (j->ex.bits.dtmf_ready) {
  1408. j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0;
  1409. }
  1410. if (j->m_hook) {
  1411. j->m_hook = 0;
  1412. j->ex.bits.hookstate = 1;
  1413. ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
  1414. }
  1415. }
  1416. }
  1417. if (j->cardtype == QTI_LINEJACK && !j->flags.pstncheck && j->flags.pstn_present) {
  1418. ixj_pstn_state(j);
  1419. }
  1420. if (j->ex.bytes) {
  1421. wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
  1422. }
  1423. clear_bit(board, &j->busyflags);
  1424. }
  1425. ixj_add_timer(j);
  1426. }
  1427. static int ixj_status_wait(IXJ *j)
  1428. {
  1429. unsigned long jif;
  1430. jif = jiffies + ((60 * hertz) / 100);
  1431. while (!IsStatusReady(j)) {
  1432. ixj_perfmon(j->statuswait);
  1433. if (time_after(jiffies, jif)) {
  1434. ixj_perfmon(j->statuswaitfail);
  1435. return -1;
  1436. }
  1437. }
  1438. return 0;
  1439. }
  1440. static int ixj_PCcontrol_wait(IXJ *j)
  1441. {
  1442. unsigned long jif;
  1443. jif = jiffies + ((60 * hertz) / 100);
  1444. while (!IsPCControlReady(j)) {
  1445. ixj_perfmon(j->pcontrolwait);
  1446. if (time_after(jiffies, jif)) {
  1447. ixj_perfmon(j->pcontrolwaitfail);
  1448. return -1;
  1449. }
  1450. }
  1451. return 0;
  1452. }
  1453. static int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j)
  1454. {
  1455. BYTES bytes;
  1456. unsigned long jif;
  1457. atomic_inc(&j->DSPWrite);
  1458. if(atomic_read(&j->DSPWrite) > 1) {
  1459. printk("IXJ %d DSP write overlap attempting command 0x%4.4xn", j->board, cmd);
  1460. return -1;
  1461. }
  1462. bytes.high = (cmd & 0xFF00) >> 8;
  1463. bytes.low = cmd & 0x00FF;
  1464. jif = jiffies + ((60 * hertz) / 100);
  1465. while (!IsControlReady(j)) {
  1466. ixj_perfmon(j->iscontrolready);
  1467. if (time_after(jiffies, jif)) {
  1468. ixj_perfmon(j->iscontrolreadyfail);
  1469. atomic_dec(&j->DSPWrite);
  1470. if(atomic_read(&j->DSPWrite) > 0) {
  1471. printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.n", j->board, cmd);
  1472. while(atomic_read(&j->DSPWrite) > 0) {
  1473. atomic_dec(&j->DSPWrite);
  1474. }
  1475. }
  1476. return -1;
  1477. }
  1478. }
  1479. outb(bytes.low, j->DSPbase + 6);
  1480. outb(bytes.high, j->DSPbase + 7);
  1481. if (ixj_status_wait(j)) {
  1482. j->ssr.low = 0xFF;
  1483. j->ssr.high = 0xFF;
  1484. atomic_dec(&j->DSPWrite);
  1485. if(atomic_read(&j->DSPWrite) > 0) {
  1486. printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.n", j->board, cmd);
  1487. while(atomic_read(&j->DSPWrite) > 0) {
  1488. atomic_dec(&j->DSPWrite);
  1489. }
  1490. }
  1491. return -1;
  1492. }
  1493. /* Read Software Status Register */
  1494. j->ssr.low = inb_p(j->DSPbase + 2);
  1495. j->ssr.high = inb_p(j->DSPbase + 3);
  1496. atomic_dec(&j->DSPWrite);
  1497. if(atomic_read(&j->DSPWrite) > 0) {
  1498. printk("IXJ %d DSP overlaped command 0x%4.4xn", j->board, cmd);
  1499. while(atomic_read(&j->DSPWrite) > 0) {
  1500. atomic_dec(&j->DSPWrite);
  1501. }
  1502. }
  1503. return 0;
  1504. }
  1505. /***************************************************************************
  1506. *
  1507. *  General Purpose IO Register read routine
  1508. *
  1509. ***************************************************************************/
  1510. static inline int ixj_gpio_read(IXJ *j)
  1511. {
  1512. if (ixj_WriteDSPCommand(0x5143, j))
  1513. return -1;
  1514. j->gpio.bytes.low = j->ssr.low;
  1515. j->gpio.bytes.high = j->ssr.high;
  1516. return 0;
  1517. }
  1518. static inline void LED_SetState(int state, IXJ *j)
  1519. {
  1520. if (j->cardtype == QTI_LINEJACK) {
  1521. j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0;
  1522. j->pld_scrw.bits.led2 = state & 0x2 ? 1 : 0;
  1523. j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0;
  1524. j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0;
  1525. outb(j->pld_scrw.byte, j->XILINXbase);
  1526. }
  1527. }
  1528. /*********************************************************************
  1529. *  GPIO Pins are configured as follows on the Quicknet Internet
  1530. *  PhoneJACK Telephony Cards
  1531. * POTS Select        GPIO_6=0 GPIO_7=0
  1532. * Mic/Speaker Select GPIO_6=0 GPIO_7=1
  1533. * Handset Select     GPIO_6=1 GPIO_7=0
  1534. *
  1535. * SLIC Active        GPIO_1=0 GPIO_2=1 GPIO_5=0
  1536. * SLIC Ringing       GPIO_1=1 GPIO_2=1 GPIO_5=0
  1537. * SLIC Open Circuit  GPIO_1=0 GPIO_2=0 GPIO_5=0
  1538. *
  1539. * Hook Switch changes reported on GPIO_3
  1540. *********************************************************************/
  1541. static int ixj_set_port(IXJ *j, int arg)
  1542. {
  1543. if (j->cardtype == QTI_PHONEJACK_LITE) {
  1544. if (arg != PORT_POTS)
  1545. return 10;
  1546. else
  1547. return 0;
  1548. }
  1549. switch (arg) {
  1550. case PORT_POTS:
  1551. j->port = PORT_POTS;
  1552. switch (j->cardtype) {
  1553. case QTI_PHONECARD:
  1554. if (j->flags.pcmciasct == 1)
  1555. SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
  1556. else
  1557. return 11;
  1558. break;
  1559. case QTI_PHONEJACK_PCI:
  1560. j->pld_slicw.pcib.mic = 0;
  1561. j->pld_slicw.pcib.spk = 0;
  1562. outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
  1563. break;
  1564. case QTI_LINEJACK:
  1565. ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */
  1566. if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to
  1567.    Software Control Register */
  1568. return 2;
  1569. j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
  1570. outb(j->pld_scrw.byte, j->XILINXbase);
  1571. j->pld_clock.byte = 0;
  1572. outb(j->pld_clock.byte, j->XILINXbase + 0x04);
  1573. j->pld_slicw.bits.rly1 = 1;
  1574. j->pld_slicw.bits.spken = 0;
  1575. outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
  1576. ixj_mixer(0x1200, j); /* Turn Off MIC switch on mixer left */
  1577. ixj_mixer(0x1401, j); /* Turn On Mono1 switch on mixer left */
  1578. ixj_mixer(0x1300, j);       /* Turn Off MIC switch on mixer right */
  1579. ixj_mixer(0x1501, j);       /* Turn On Mono1 switch on mixer right */
  1580. ixj_mixer(0x0E80, j); /*Mic mute */
  1581. ixj_mixer(0x0F00, j); /* Set mono out (SLIC) to 0dB */
  1582. ixj_mixer(0x0080, j); /* Mute Master Left volume */
  1583. ixj_mixer(0x0180, j); /* Mute Master Right volume */
  1584. SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
  1585. /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
  1586. break;
  1587. case QTI_PHONEJACK:
  1588. j->gpio.bytes.high = 0x0B;
  1589. j->gpio.bits.gpio6 = 0;
  1590. j->gpio.bits.gpio7 = 0;
  1591. ixj_WriteDSPCommand(j->gpio.word, j);
  1592. break;
  1593. }
  1594. break;
  1595. case PORT_PSTN:
  1596. if (j->cardtype == QTI_LINEJACK) {
  1597. ixj_WriteDSPCommand(0xC534, j); /* Write CODEC config to Software Control Register */
  1598. j->pld_slicw.bits.rly3 = 0;
  1599. j->pld_slicw.bits.rly1 = 1;
  1600. j->pld_slicw.bits.spken = 0;
  1601. outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
  1602. j->port = PORT_PSTN;
  1603. } else {
  1604. return 4;
  1605. }
  1606. break;
  1607. case PORT_SPEAKER:
  1608. j->port = PORT_SPEAKER;
  1609. switch (j->cardtype) {
  1610. case QTI_PHONECARD:
  1611. if (j->flags.pcmciasct) {
  1612. SLIC_SetState(PLD_SLIC_STATE_OC, j);
  1613. }
  1614. break;
  1615. case QTI_PHONEJACK_PCI:
  1616. j->pld_slicw.pcib.mic = 1;
  1617. j->pld_slicw.pcib.spk = 1;
  1618. outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
  1619. break;
  1620. case QTI_LINEJACK:
  1621. ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */
  1622. if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to
  1623.    Software Control Register */
  1624. return 2;
  1625. j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
  1626. outb(j->pld_scrw.byte, j->XILINXbase);
  1627. j->pld_clock.byte = 0;
  1628. outb(j->pld_clock.byte, j->XILINXbase + 0x04);
  1629. j->pld_slicw.bits.rly1 = 1;
  1630. j->pld_slicw.bits.spken = 1;
  1631. outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
  1632. ixj_mixer(0x1201, j); /* Turn On MIC switch on mixer left */
  1633. ixj_mixer(0x1400, j); /* Turn Off Mono1 switch on mixer left */
  1634. ixj_mixer(0x1301, j);       /* Turn On MIC switch on mixer right */
  1635. ixj_mixer(0x1500, j);       /* Turn Off Mono1 switch on mixer right */
  1636. ixj_mixer(0x0E06, j); /*Mic un-mute 0dB */
  1637. ixj_mixer(0x0F80, j); /* Mute mono out (SLIC) */
  1638. ixj_mixer(0x0000, j); /* Set Master Left volume to 0dB */
  1639. ixj_mixer(0x0100, j); /* Set Master Right volume to 0dB */
  1640. break;
  1641. case QTI_PHONEJACK:
  1642. j->gpio.bytes.high = 0x0B;
  1643. j->gpio.bits.gpio6 = 0;
  1644. j->gpio.bits.gpio7 = 1;
  1645. ixj_WriteDSPCommand(j->gpio.word, j);
  1646. break;
  1647. }
  1648. break;
  1649. case PORT_HANDSET:
  1650. if (j->cardtype != QTI_PHONEJACK) {
  1651. return 5;
  1652. } else {
  1653. j->gpio.bytes.high = 0x0B;
  1654. j->gpio.bits.gpio6 = 1;
  1655. j->gpio.bits.gpio7 = 0;
  1656. ixj_WriteDSPCommand(j->gpio.word, j);
  1657. j->port = PORT_HANDSET;
  1658. }
  1659. break;
  1660. default:
  1661. return 6;
  1662. break;
  1663. }
  1664. return 0;
  1665. }
  1666. static int ixj_set_pots(IXJ *j, int arg)
  1667. {
  1668. if (j->cardtype == QTI_LINEJACK) {
  1669. if (arg) {
  1670. if (j->port == PORT_PSTN) {
  1671. j->pld_slicw.bits.rly1 = 0;
  1672. outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
  1673. j->flags.pots_pstn = 1;
  1674. return 1;
  1675. } else {
  1676. j->flags.pots_pstn = 0;
  1677. return 0;
  1678. }
  1679. } else {
  1680. j->pld_slicw.bits.rly1 = 1;
  1681. outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
  1682. j->flags.pots_pstn = 0;
  1683. return 1;
  1684. }
  1685. } else {
  1686. return 0;
  1687. }
  1688. }
  1689. static void ixj_ring_on(IXJ *j)
  1690. {
  1691. if (j->dsp.low == 0x20) /* Internet PhoneJACK */
  1692.  {
  1693. if (ixjdebug & 0x0004)
  1694. printk(KERN_INFO "IXJ Ring On /dev/phone%dn",  j->board);
  1695. j->gpio.bytes.high = 0x0B;
  1696. j->gpio.bytes.low = 0x00;
  1697. j->gpio.bits.gpio1 = 1;
  1698. j->gpio.bits.gpio2 = 1;
  1699. j->gpio.bits.gpio5 = 0;
  1700. ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring signal */
  1701. } else /* Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI */
  1702. {
  1703. if (ixjdebug & 0x0004)
  1704. printk(KERN_INFO "IXJ Ring On /dev/phone%dn", j->board);
  1705. SLIC_SetState(PLD_SLIC_STATE_RINGING, j);
  1706. }
  1707. }
  1708. static int ixj_siadc(IXJ *j, int val)
  1709. {
  1710. if(j->cardtype == QTI_PHONECARD){
  1711. if(j->flags.pcmciascp){
  1712. if(val == -1)
  1713. return j->siadc.bits.rxg;
  1714. if(val < 0 || val > 0x1F)
  1715. return -1;
  1716. j->siadc.bits.hom = 0; /* Handset Out Mute */
  1717. j->siadc.bits.lom = 0; /* Line Out Mute */
  1718. j->siadc.bits.rxg = val; /*(0xC000 - 0x41C8) / 0x4EF;    RX PGA Gain */
  1719. j->psccr.bits.addr = 6; /* R/W Smart Cable Register Address */
  1720. j->psccr.bits.rw = 0; /* Read / Write flag */
  1721. j->psccr.bits.dev = 0;
  1722. outb(j->siadc.byte, j->XILINXbase + 0x00);
  1723. outb(j->psccr.byte, j->XILINXbase + 0x01);
  1724. ixj_PCcontrol_wait(j);
  1725. return j->siadc.bits.rxg;
  1726. }
  1727. }
  1728. return -1;
  1729. }
  1730. static int ixj_sidac(IXJ *j, int val)
  1731. {
  1732. if(j->cardtype == QTI_PHONECARD){
  1733. if(j->flags.pcmciascp){
  1734. if(val == -1)
  1735. return j->sidac.bits.txg;
  1736. if(val < 0 || val > 0x1F)
  1737. return -1;
  1738. j->sidac.bits.srm = 1; /* Speaker Right Mute */
  1739. j->sidac.bits.slm = 1; /* Speaker Left Mute */
  1740. j->sidac.bits.txg = val; /* (0xC000 - 0x45E4) / 0x5D3;  TX PGA Gain */
  1741. j->psccr.bits.addr = 7; /* R/W Smart Cable Register Address */
  1742. j->psccr.bits.rw = 0; /* Read / Write flag */
  1743. j->psccr.bits.dev = 0;
  1744. outb(j->sidac.byte, j->XILINXbase + 0x00);
  1745. outb(j->psccr.byte, j->XILINXbase + 0x01);
  1746. ixj_PCcontrol_wait(j);
  1747. return j->sidac.bits.txg;
  1748. }
  1749. }
  1750. return -1;
  1751. }
  1752. static int ixj_pcmcia_cable_check(IXJ *j)
  1753. {
  1754. j->pccr1.byte = inb_p(j->XILINXbase + 0x03);
  1755. if (!j->flags.pcmciastate) {
  1756. j->pccr2.byte = inb_p(j->XILINXbase + 0x02);
  1757. if (j->pccr1.bits.drf || j->pccr2.bits.rstc) {
  1758. j->flags.pcmciastate = 4;
  1759. return 0;
  1760. }
  1761. if (j->pccr1.bits.ed) {
  1762. j->pccr1.bits.ed = 0;
  1763. j->psccr.bits.dev = 3;
  1764. j->psccr.bits.rw = 1;
  1765. outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
  1766. ixj_PCcontrol_wait(j);
  1767. j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
  1768. j->pslic.bits.led2 = j->pslic.bits.det ? 1 : 0;
  1769. j->psccr.bits.dev = 3;
  1770. j->psccr.bits.rw = 0;
  1771. outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
  1772. ixj_PCcontrol_wait(j);
  1773. return j->pslic.bits.led2 ? 1 : 0;
  1774. } else if (j->flags.pcmciasct) {
  1775. return j->r_hook;
  1776. } else {
  1777. return 1;
  1778. }
  1779. } else if (j->flags.pcmciastate == 4) {
  1780. if (!j->pccr1.bits.drf) {
  1781. j->flags.pcmciastate = 3;
  1782. }
  1783. return 0;
  1784. } else if (j->flags.pcmciastate == 3) {
  1785. j->pccr2.bits.pwr = 0;
  1786. j->pccr2.bits.rstc = 1;
  1787. outb(j->pccr2.byte, j->XILINXbase + 0x02);
  1788. j->checkwait = jiffies + (hertz * 2);
  1789. j->flags.incheck = 1;
  1790. j->flags.pcmciastate = 2;
  1791. return 0;
  1792. } else if (j->flags.pcmciastate == 2) {
  1793. if (j->flags.incheck) {
  1794. if (time_before(jiffies, j->checkwait)) {
  1795. return 0;
  1796. } else {
  1797. j->flags.incheck = 0;
  1798. }
  1799. }
  1800. j->pccr2.bits.pwr = 0;
  1801. j->pccr2.bits.rstc = 0;
  1802. outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
  1803. j->flags.pcmciastate = 1;
  1804. return 0;
  1805. } else if (j->flags.pcmciastate == 1) {
  1806. j->flags.pcmciastate = 0;
  1807. if (!j->pccr1.bits.drf) {
  1808. j->psccr.bits.dev = 3;
  1809. j->psccr.bits.rw = 1;
  1810. outb_p(j->psccr.byte, j->XILINXbase + 0x01);
  1811. ixj_PCcontrol_wait(j);
  1812. j->flags.pcmciascp = 1; /* Set Cable Present Flag */
  1813. j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03; /* Get Cable Type */
  1814. if (j->flags.pcmciasct == 3) {
  1815. j->flags.pcmciastate = 4;
  1816. return 0;
  1817. } else if (j->flags.pcmciasct == 0) {
  1818. j->pccr2.bits.pwr = 1;
  1819. j->pccr2.bits.rstc = 0;
  1820. outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
  1821. j->port = PORT_SPEAKER;
  1822. } else {
  1823. j->port = PORT_POTS;
  1824. }
  1825. j->sic1.bits.cpd = 0; /* Chip Power Down */
  1826. j->sic1.bits.mpd = 0; /* MIC Bias Power Down */
  1827. j->sic1.bits.hpd = 0; /* Handset Bias Power Down */
  1828. j->sic1.bits.lpd = 0; /* Line Bias Power Down */
  1829. j->sic1.bits.spd = 1; /* Speaker Drive Power Down */
  1830. j->psccr.bits.addr = 1; /* R/W Smart Cable Register Address */
  1831. j->psccr.bits.rw = 0; /* Read / Write flag */
  1832. j->psccr.bits.dev = 0;
  1833. outb(j->sic1.byte, j->XILINXbase + 0x00);
  1834. outb(j->psccr.byte, j->XILINXbase + 0x01);
  1835. ixj_PCcontrol_wait(j);
  1836. j->sic2.bits.al = 0; /* Analog Loopback DAC analog -> ADC analog */
  1837. j->sic2.bits.dl2 = 0; /* Digital Loopback DAC -> ADC one bit */
  1838. j->sic2.bits.dl1 = 0; /* Digital Loopback ADC -> DAC one bit */
  1839. j->sic2.bits.pll = 0; /* 1 = div 10, 0 = div 5 */
  1840. j->sic2.bits.hpd = 0; /* HPF disable */
  1841. j->psccr.bits.addr = 2; /* R/W Smart Cable Register Address */
  1842. j->psccr.bits.rw = 0; /* Read / Write flag */
  1843. j->psccr.bits.dev = 0;
  1844. outb(j->sic2.byte, j->XILINXbase + 0x00);
  1845. outb(j->psccr.byte, j->XILINXbase + 0x01);
  1846. ixj_PCcontrol_wait(j);
  1847. j->psccr.bits.addr = 3; /* R/W Smart Cable Register Address */
  1848. j->psccr.bits.rw = 0; /* Read / Write flag */
  1849. j->psccr.bits.dev = 0;
  1850. outb(0x00, j->XILINXbase + 0x00); /* PLL Divide N1 */
  1851. outb(j->psccr.byte, j->XILINXbase + 0x01);
  1852. ixj_PCcontrol_wait(j);
  1853. j->psccr.bits.addr = 4; /* R/W Smart Cable Register Address */
  1854. j->psccr.bits.rw = 0; /* Read / Write flag */
  1855. j->psccr.bits.dev = 0;
  1856. outb(0x09, j->XILINXbase + 0x00); /* PLL Multiply M1 */
  1857. outb(j->psccr.byte, j->XILINXbase + 0x01);
  1858. ixj_PCcontrol_wait(j);
  1859. j->sirxg.bits.lig = 1; /* Line In Gain */
  1860. j->sirxg.bits.lim = 1; /* Line In Mute */
  1861. j->sirxg.bits.mcg = 0; /* MIC In Gain was 3 */
  1862. j->sirxg.bits.mcm = 0; /* MIC In Mute */
  1863. j->sirxg.bits.him = 0; /* Handset In Mute */
  1864. j->sirxg.bits.iir = 1; /* IIR */
  1865. j->psccr.bits.addr = 5; /* R/W Smart Cable Register Address */
  1866. j->psccr.bits.rw = 0; /* Read / Write flag */
  1867. j->psccr.bits.dev = 0;
  1868. outb(j->sirxg.byte, j->XILINXbase + 0x00);
  1869. outb(j->psccr.byte, j->XILINXbase + 0x01);
  1870. ixj_PCcontrol_wait(j);
  1871. ixj_siadc(j, 0x17);
  1872. ixj_sidac(j, 0x1D);
  1873. j->siaatt.bits.sot = 0;
  1874. j->psccr.bits.addr = 9; /* R/W Smart Cable Register Address */
  1875. j->psccr.bits.rw = 0; /* Read / Write flag */
  1876. j->psccr.bits.dev = 0;
  1877. outb(j->siaatt.byte, j->XILINXbase + 0x00);
  1878. outb(j->psccr.byte, j->XILINXbase + 0x01);
  1879. ixj_PCcontrol_wait(j);
  1880. if (j->flags.pcmciasct == 1 && !j->readers && !j->writers) {
  1881. j->psccr.byte = j->pslic.byte = 0;
  1882. j->pslic.bits.powerdown = 1;
  1883. j->psccr.bits.dev = 3;
  1884. j->psccr.bits.rw = 0;
  1885. outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
  1886. ixj_PCcontrol_wait(j);
  1887. }
  1888. }
  1889. return 0;
  1890. } else {
  1891. j->flags.pcmciascp = 0;
  1892. return 0;
  1893. }
  1894. return 0;
  1895. }
  1896. static int ixj_hookstate(IXJ *j)
  1897. {
  1898. unsigned long det;
  1899. int fOffHook = 0;
  1900. switch (j->cardtype) {
  1901. case QTI_PHONEJACK:
  1902. ixj_gpio_read(j);
  1903. fOffHook = j->gpio.bits.gpio3read ? 1 : 0;
  1904. break;
  1905. case QTI_LINEJACK:
  1906. case QTI_PHONEJACK_LITE:
  1907. case QTI_PHONEJACK_PCI:
  1908. SLIC_GetState(j);
  1909. if(j->cardtype == QTI_LINEJACK && j->flags.pots_pstn == 1 && (j->readers || j->writers)) {
  1910. fOffHook = j->pld_slicr.bits.potspstn ? 1 : 0;
  1911. if(fOffHook != j->p_hook) {
  1912. if(!j->checkwait) {
  1913. j->checkwait = jiffies;
  1914. if(time_before(jiffies, j->checkwait + 2)) {
  1915. fOffHook ^= 1;
  1916. } else {
  1917. j->checkwait = 0;
  1918. }
  1919. j->p_hook = fOffHook;
  1920.   printk("IXJ : /dev/phone%d pots-pstn hookstate check %d at %ldn", j->board, fOffHook, jiffies);
  1921. }
  1922. } else {
  1923. if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE ||
  1924.     j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) {
  1925. if (j->flags.ringing || j->flags.cringing) {
  1926. if (!in_interrupt()) {
  1927. det = jiffies + (hertz / 50);
  1928. while (time_before(jiffies, det)) {
  1929. set_current_state(TASK_INTERRUPTIBLE);
  1930. schedule_timeout(1);
  1931. }
  1932. }
  1933. SLIC_GetState(j);
  1934. if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) {
  1935. ixj_ring_on(j);
  1936. }
  1937. }
  1938. if (j->cardtype == QTI_PHONEJACK_PCI) {
  1939. j->pld_scrr.byte = inb_p(j->XILINXbase);
  1940. fOffHook = j->pld_scrr.pcib.det ? 1 : 0;
  1941. } else
  1942. fOffHook = j->pld_slicr.bits.det ? 1 : 0;
  1943. }
  1944. }
  1945. break;
  1946. case QTI_PHONECARD:
  1947. fOffHook = ixj_pcmcia_cable_check(j);
  1948. break;
  1949. }
  1950. if (j->r_hook != fOffHook) {
  1951. j->r_hook = fOffHook;
  1952. if (j->port == PORT_SPEAKER || j->port == PORT_HANDSET) { // || (j->port == PORT_PSTN && j->flags.pots_pstn == 0)) {
  1953. j->ex.bits.hookstate = 1;
  1954. ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
  1955. } else if (!fOffHook) {
  1956. j->flash_end = jiffies + ((60 * hertz) / 100);
  1957. }
  1958. }
  1959. if (fOffHook) {
  1960. if(time_before(jiffies, j->flash_end)) {
  1961. j->ex.bits.flash = 1;
  1962. j->flash_end = 0;
  1963. ixj_kill_fasync(j, SIG_FLASH, POLL_IN);
  1964. }
  1965. } else {
  1966. if(time_before(jiffies, j->flash_end)) {
  1967. fOffHook = 1;
  1968. }
  1969. }
  1970. if (j->port == PORT_PSTN && j->daa_mode == SOP_PU_CONVERSATION)
  1971. fOffHook |= 2;
  1972. if (j->port == PORT_SPEAKER) {
  1973. if(j->cardtype == QTI_PHONECARD) {
  1974. if(j->flags.pcmciascp && j->flags.pcmciasct) {
  1975. fOffHook |= 2;
  1976. }
  1977. } else {
  1978. fOffHook |= 2;
  1979. }
  1980. }
  1981. if (j->port == PORT_HANDSET)
  1982. fOffHook |= 2;
  1983. return fOffHook;
  1984. }
  1985. static void ixj_ring_off(IXJ *j)
  1986. {
  1987. if (j->dsp.low == 0x20) /* Internet PhoneJACK */
  1988.  {
  1989. if (ixjdebug & 0x0004)
  1990. printk(KERN_INFO "IXJ Ring Offn");
  1991. j->gpio.bytes.high = 0x0B;
  1992. j->gpio.bytes.low = 0x00;
  1993. j->gpio.bits.gpio1 = 0;
  1994. j->gpio.bits.gpio2 = 1;
  1995. j->gpio.bits.gpio5 = 0;
  1996. ixj_WriteDSPCommand(j->gpio.word, j);
  1997. } else /* Internet LineJACK */
  1998. {
  1999. if (ixjdebug & 0x0004)
  2000. printk(KERN_INFO "IXJ Ring Offn");
  2001. if(!j->flags.cidplay)
  2002. SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
  2003. SLIC_GetState(j);
  2004. }
  2005. }
  2006. static void ixj_ring_start(IXJ *j)
  2007. {
  2008. j->flags.cringing = 1;
  2009. if (ixjdebug & 0x0004)
  2010. printk(KERN_INFO "IXJ Cadence Ringing Start /dev/phone%dn", j->board);
  2011. if (ixj_hookstate(j) & 1) {
  2012. if (j->port == PORT_POTS)
  2013. ixj_ring_off(j);
  2014. j->flags.cringing = 0;
  2015. if (ixjdebug & 0x0004)
  2016. printk(KERN_INFO "IXJ Cadence Ringing Stopped /dev/phone%d off hookn", j->board);
  2017. } else if(j->cadence_f[5].enable && (!j->cadence_f[5].en_filter)) {
  2018. j->ring_cadence_jif = jiffies;
  2019. j->flags.cidsent = j->flags.cidring = 0;
  2020. j->cadence_f[5].state = 0;
  2021. if(j->cadence_f[5].on1)
  2022. ixj_ring_on(j);
  2023. } else {
  2024. j->ring_cadence_jif = jiffies;
  2025. j->ring_cadence_t = 15;
  2026. if (j->ring_cadence & 1 << j->ring_cadence_t) {
  2027. ixj_ring_on(j);
  2028. } else {
  2029. ixj_ring_off(j);
  2030. }
  2031. j->flags.cidsent = j->flags.cidring = j->flags.firstring = 0;
  2032. }
  2033. }
  2034. static int ixj_ring(IXJ *j)
  2035. {
  2036. char cntr;
  2037. unsigned long jif, det;
  2038. j->flags.ringing = 1;
  2039. if (ixj_hookstate(j) & 1) {
  2040. ixj_ring_off(j);
  2041. j->flags.ringing = 0;
  2042. return 1;
  2043. }
  2044. det = 0;
  2045. for (cntr = 0; cntr < j->maxrings; cntr++) {
  2046. jif = jiffies + (1 * hertz);
  2047. ixj_ring_on(j);
  2048. while (time_before(jiffies, jif)) {
  2049. if (ixj_hookstate(j) & 1) {
  2050. ixj_ring_off(j);
  2051. j->flags.ringing = 0;
  2052. return 1;
  2053. }
  2054. set_current_state(TASK_INTERRUPTIBLE);
  2055. schedule_timeout(1);
  2056. if (signal_pending(current))
  2057. break;
  2058. }
  2059. jif = jiffies + (3 * hertz);
  2060. ixj_ring_off(j);
  2061. while (time_before(jiffies, jif)) {
  2062. if (ixj_hookstate(j) & 1) {
  2063. det = jiffies + (hertz / 100);
  2064. while (time_before(jiffies, det)) {
  2065. set_current_state(TASK_INTERRUPTIBLE);
  2066. schedule_timeout(1);
  2067. if (signal_pending(current))
  2068. break;
  2069. }
  2070. if (ixj_hookstate(j) & 1) {
  2071. j->flags.ringing = 0;
  2072. return 1;
  2073. }
  2074. }
  2075. set_current_state(TASK_INTERRUPTIBLE);
  2076. schedule_timeout(1);
  2077. if (signal_pending(current))
  2078. break;
  2079. }
  2080. }
  2081. ixj_ring_off(j);
  2082. j->flags.ringing = 0;
  2083. return 0;
  2084. }
  2085. static int ixj_open(struct phone_device *p, struct file *file_p)
  2086. {
  2087. IXJ *j = get_ixj(p->board);
  2088. file_p->private_data = j;
  2089. if (!j->DSPbase)
  2090. return -ENODEV;
  2091.         if (file_p->f_mode & FMODE_READ) {
  2092. if(!j->readers) {
  2093.                 j->readers++;
  2094.          } else {
  2095.                  return -EBUSY;
  2096. }
  2097.         }
  2098. if (file_p->f_mode & FMODE_WRITE) {
  2099. if(!j->writers) {
  2100. j->writers++;
  2101. } else {
  2102. if (file_p->f_mode & FMODE_READ){
  2103. j->readers--;
  2104. }
  2105. return -EBUSY;
  2106. }
  2107. }
  2108. if (j->cardtype == QTI_PHONECARD) {
  2109. j->pslic.bits.powerdown = 0;
  2110. j->psccr.bits.dev = 3;
  2111. j->psccr.bits.rw = 0;
  2112. outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
  2113. ixj_PCcontrol_wait(j);
  2114. }
  2115. j->flags.cidplay = 0;
  2116. j->flags.cidcw_ack = 0;
  2117. MOD_INC_USE_COUNT;
  2118. if (ixjdebug & 0x0002)
  2119. printk(KERN_INFO "Opening board %dn", p->board);
  2120. j->framesread = j->frameswritten = 0;
  2121. return 0;
  2122. }
  2123. int ixj_release(struct inode *inode, struct file *file_p)
  2124. {
  2125. IXJ_TONE ti;
  2126. int cnt;
  2127. IXJ *j = file_p->private_data;
  2128. int board = j->p.board;
  2129. /*
  2130.  *    Set up locks to ensure that only one process is talking to the DSP at a time.
  2131.  *    This is necessary to keep the DSP from locking up.
  2132.  */
  2133. while(test_and_set_bit(board, (void *)&j->busyflags) != 0) {
  2134. set_current_state(TASK_INTERRUPTIBLE);
  2135. schedule_timeout(1);
  2136. }
  2137. if (ixjdebug & 0x0002)
  2138. printk(KERN_INFO "Closing board %dn", NUM(inode->i_rdev));
  2139. if (j->cardtype == QTI_PHONECARD)
  2140. ixj_set_port(j, PORT_SPEAKER);
  2141. else
  2142. ixj_set_port(j, PORT_POTS);
  2143. aec_stop(j);
  2144. ixj_play_stop(j);
  2145. ixj_record_stop(j);
  2146. set_play_volume(j, 0x100);
  2147. set_rec_volume(j, 0x100);
  2148. ixj_ring_off(j);
  2149. /* Restore the tone table to default settings. */
  2150. ti.tone_index = 10;
  2151. ti.gain0 = 1;
  2152. ti.freq0 = hz941;
  2153. ti.gain1 = 0;
  2154. ti.freq1 = hz1209;
  2155. ixj_init_tone(j, &ti);
  2156. ti.tone_index = 11;
  2157. ti.gain0 = 1;
  2158. ti.freq0 = hz941;
  2159. ti.gain1 = 0;
  2160. ti.freq1 = hz1336;
  2161. ixj_init_tone(j, &ti);
  2162. ti.tone_index = 12;
  2163. ti.gain0 = 1;
  2164. ti.freq0 = hz941;
  2165. ti.gain1 = 0;
  2166. ti.freq1 = hz1477;
  2167. ixj_init_tone(j, &ti);
  2168. ti.tone_index = 13;
  2169. ti.gain0 = 1;
  2170. ti.freq0 = hz800;
  2171. ti.gain1 = 0;
  2172. ti.freq1 = 0;
  2173. ixj_init_tone(j, &ti);
  2174. ti.tone_index = 14;
  2175. ti.gain0 = 1;
  2176. ti.freq0 = hz1000;
  2177. ti.gain1 = 0;
  2178. ti.freq1 = 0;
  2179. ixj_init_tone(j, &ti);
  2180. ti.tone_index = 15;
  2181. ti.gain0 = 1;
  2182. ti.freq0 = hz1250;
  2183. ti.gain1 = 0;
  2184. ti.freq1 = 0;
  2185. ixj_init_tone(j, &ti);
  2186. ti.tone_index = 16;
  2187. ti.gain0 = 1;
  2188. ti.freq0 = hz950;
  2189. ti.gain1 = 0;
  2190. ti.freq1 = 0;
  2191. ixj_init_tone(j, &ti);
  2192. ti.tone_index = 17;
  2193. ti.gain0 = 1;
  2194. ti.freq0 = hz1100;
  2195. ti.gain1 = 0;
  2196. ti.freq1 = 0;
  2197. ixj_init_tone(j, &ti);
  2198. ti.tone_index = 18;
  2199. ti.gain0 = 1;
  2200. ti.freq0 = hz1400;
  2201. ti.gain1 = 0;
  2202. ti.freq1 = 0;
  2203. ixj_init_tone(j, &ti);
  2204. ti.tone_index = 19;
  2205. ti.gain0 = 1;
  2206. ti.freq0 = hz1500;
  2207. ti.gain1 = 0;
  2208. ti.freq1 = 0;
  2209. ixj_init_tone(j, &ti);
  2210. ti.tone_index = 20;
  2211. ti.gain0 = 1;
  2212. ti.freq0 = hz1600;
  2213. ti.gain1 = 0;
  2214. ti.freq1 = 0;
  2215. ixj_init_tone(j, &ti);
  2216. ti.tone_index = 21;
  2217. ti.gain0 = 1;
  2218. ti.freq0 = hz1800;
  2219. ti.gain1 = 0;
  2220. ti.freq1 = 0;
  2221. ixj_init_tone(j, &ti);
  2222. ti.tone_index = 22;
  2223. ti.gain0 = 1;
  2224. ti.freq0 = hz2100;
  2225. ti.gain1 = 0;
  2226. ti.freq1 = 0;
  2227. ixj_init_tone(j, &ti);
  2228. ti.tone_index = 23;
  2229. ti.gain0 = 1;
  2230. ti.freq0 = hz1300;
  2231. ti.gain1 = 0;
  2232. ti.freq1 = 0;
  2233. ixj_init_tone(j, &ti);
  2234. ti.tone_index = 24;
  2235. ti.gain0 = 1;
  2236. ti.freq0 = hz2450;
  2237. ti.gain1 = 0;
  2238. ti.freq1 = 0;
  2239. ixj_init_tone(j, &ti);
  2240. ti.tone_index = 25;
  2241. ti.gain0 = 1;
  2242. ti.freq0 = hz350;
  2243. ti.gain1 = 0;
  2244. ti.freq1 = hz440;
  2245. ixj_init_tone(j, &ti);
  2246. ti.tone_index = 26;
  2247. ti.gain0 = 1;
  2248. ti.freq0 = hz440;
  2249. ti.gain1 = 0;
  2250. ti.freq1 = hz480;
  2251. ixj_init_tone(j, &ti);
  2252. ti.tone_index = 27;
  2253. ti.gain0 = 1;
  2254. ti.freq0 = hz480;
  2255. ti.gain1 = 0;
  2256. ti.freq1 = hz620;
  2257. ixj_init_tone(j, &ti);
  2258. set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */
  2259. set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */
  2260. j->ex.bits.dtmf_ready = 0;
  2261. j->dtmf_state = 0;
  2262. j->dtmf_wp = j->dtmf_rp = 0;
  2263. j->rec_mode = j->play_mode = -1;
  2264. j->flags.ringing = 0;
  2265. j->maxrings = MAXRINGS;
  2266. j->ring_cadence = USA_RING_CADENCE;
  2267. if(j->cadence_f[5].enable) {
  2268. j->cadence_f[5].enable = j->cadence_f[5].en_filter = j->cadence_f[5].state = 0;
  2269. }
  2270. j->drybuffer = 0;
  2271. j->winktime = 320;
  2272. j->flags.dtmf_oob = 0;
  2273. for (cnt = 0; cnt < 4; cnt++)
  2274. j->cadence_f[cnt].enable = 0;
  2275. idle(j);
  2276. if(j->cardtype == QTI_PHONECARD) {
  2277. SLIC_SetState(PLD_SLIC_STATE_OC, j);
  2278. }
  2279. if (file_p->f_mode & FMODE_READ)
  2280. j->readers--;
  2281. if (file_p->f_mode & FMODE_WRITE)
  2282. j->writers--;
  2283. if (j->read_buffer && !j->readers) {
  2284. kfree(j->read_buffer);
  2285. j->read_buffer = NULL;
  2286. j->read_buffer_size = 0;
  2287. }
  2288. if (j->write_buffer && !j->writers) {
  2289. kfree(j->write_buffer);
  2290. j->write_buffer = NULL;
  2291. j->write_buffer_size = 0;
  2292. }
  2293. j->rec_codec = j->play_codec = 0;
  2294. j->rec_frame_size = j->play_frame_size = 0;
  2295. j->flags.cidsent = j->flags.cidring = 0;
  2296. ixj_fasync(-1, file_p, 0); /* remove from list of async notification */
  2297. if(j->cardtype == QTI_LINEJACK && !j->readers && !j->writers) {
  2298. ixj_set_port(j, PORT_PSTN);
  2299. daa_set_mode(j, SOP_PU_SLEEP);
  2300. ixj_set_pots(j, 1);
  2301. }
  2302. ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
  2303. /* Set up the default signals for events */
  2304. for (cnt = 0; cnt < 35; cnt++)
  2305. j->ixj_signals[cnt] = SIGIO;
  2306. /* Set the excetion signal enable flags */
  2307. j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring = 
  2308. 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 = 
  2309. 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;
  2310. file_p->private_data = NULL;
  2311. clear_bit(board, &j->busyflags);
  2312. MOD_DEC_USE_COUNT;
  2313. return 0;
  2314. }
  2315. static int read_filters(IXJ *j)
  2316. {
  2317. unsigned short fc, cnt, trg;
  2318. int var;
  2319. trg = 0;
  2320. if (ixj_WriteDSPCommand(0x5144, j)) {
  2321. if(ixjdebug & 0x0001) {
  2322. printk(KERN_INFO "Read Frame Counter failed!n");
  2323. }
  2324. return -1;
  2325. }
  2326. fc = j->ssr.high << 8 | j->ssr.low;
  2327. if (fc == j->frame_count)
  2328. return 1;
  2329. j->frame_count = fc;
  2330. if (j->dtmf_proc)
  2331. return 1;
  2332. var = 10;
  2333. for (cnt = 0; cnt < 4; cnt++) {
  2334. if (ixj_WriteDSPCommand(0x5154 + cnt, j)) {
  2335. if(ixjdebug & 0x0001) {
  2336. printk(KERN_INFO "Select Filter %d failed!n", cnt);
  2337. }
  2338. return -1;
  2339. }
  2340. if (ixj_WriteDSPCommand(0x515C, j)) {
  2341. if(ixjdebug & 0x0001) {
  2342. printk(KERN_INFO "Read Filter History %d failed!n", cnt);
  2343. }
  2344. return -1;
  2345. }
  2346. j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low;
  2347. if (j->cadence_f[cnt].enable) {
  2348. if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) {
  2349. if (j->cadence_f[cnt].state == 0) {
  2350. j->cadence_f[cnt].state = 1;
  2351. j->cadence_f[cnt].on1min = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 - var)) / 10000));
  2352. j->cadence_f[cnt].on1dot = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100)) / 10000));
  2353. j->cadence_f[cnt].on1max = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 + var)) / 10000));
  2354. } else if (j->cadence_f[cnt].state == 2 &&
  2355.    (time_after(jiffies, j->cadence_f[cnt].off1min) &&
  2356.     time_before(jiffies, j->cadence_f[cnt].off1max))) {
  2357. if (j->cadence_f[cnt].on2) {
  2358. j->cadence_f[cnt].state = 3;
  2359. j->cadence_f[cnt].on2min = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 - var)) / 10000));
  2360. j->cadence_f[cnt].on2dot = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100)) / 10000));
  2361. j->cadence_f[cnt].on2max = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 + var)) / 10000));
  2362. } else {
  2363. j->cadence_f[cnt].state = 7;
  2364. }
  2365. } else if (j->cadence_f[cnt].state == 4 &&
  2366.    (time_after(jiffies, j->cadence_f[cnt].off2min) &&
  2367.     time_before(jiffies, j->cadence_f[cnt].off2max))) {
  2368. if (j->cadence_f[cnt].on3) {
  2369. j->cadence_f[cnt].state = 5;
  2370. j->cadence_f[cnt].on3min = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 - var)) / 10000));
  2371. j->cadence_f[cnt].on3dot = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100)) / 10000));
  2372. j->cadence_f[cnt].on3max = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 + var)) / 10000));
  2373. } else {
  2374. j->cadence_f[cnt].state = 7;
  2375. }
  2376. } else {
  2377. j->cadence_f[cnt].state = 0;
  2378. }
  2379. } else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) {
  2380. if (j->cadence_f[cnt].state == 1) {
  2381. if(!j->cadence_f[cnt].on1) {
  2382. j->cadence_f[cnt].state = 7;
  2383. } else if((time_after(jiffies, j->cadence_f[cnt].on1min) &&
  2384.   time_before(jiffies, j->cadence_f[cnt].on1max))) {
  2385. if(j->cadence_f[cnt].off1) {
  2386. j->cadence_f[cnt].state = 2;
  2387. j->cadence_f[cnt].off1min = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 - var)) / 10000));
  2388. j->cadence_f[cnt].off1dot = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100)) / 10000));
  2389. j->cadence_f[cnt].off1max = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 + var)) / 10000));
  2390. } else {
  2391. j->cadence_f[cnt].state = 7;
  2392. }
  2393. } else {
  2394. j->cadence_f[cnt].state = 0;
  2395. }
  2396. } else if (j->cadence_f[cnt].state == 3) {
  2397. if((time_after(jiffies, j->cadence_f[cnt].on2min) &&
  2398.     time_before(jiffies, j->cadence_f[cnt].on2max))) {
  2399. if(j->cadence_f[cnt].off2) {
  2400. j->cadence_f[cnt].state = 4;
  2401. j->cadence_f[cnt].off2min = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 - var)) / 10000));
  2402. j->cadence_f[cnt].off2dot = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100)) / 10000));
  2403. j->cadence_f[cnt].off2max = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 + var)) / 10000));
  2404. } else {
  2405. j->cadence_f[cnt].state = 7;
  2406. }
  2407. } else {
  2408. j->cadence_f[cnt].state = 0;
  2409. }
  2410. } else if (j->cadence_f[cnt].state == 5) {
  2411. if ((time_after(jiffies, j->cadence_f[cnt].on3min) &&
  2412.     time_before(jiffies, j->cadence_f[cnt].on3max))) {
  2413. if(j->cadence_f[cnt].off3) {
  2414. j->cadence_f[cnt].state = 6;
  2415. j->cadence_f[cnt].off3min = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 - var)) / 10000));
  2416. j->cadence_f[cnt].off3dot = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100)) / 10000));
  2417. j->cadence_f[cnt].off3max = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 + var)) / 10000));
  2418. } else {
  2419. j->cadence_f[cnt].state = 7;
  2420. }
  2421. } else {
  2422. j->cadence_f[cnt].state = 0;
  2423. }
  2424. } else {
  2425. j->cadence_f[cnt].state = 0;
  2426. }
  2427. } else {
  2428. switch(j->cadence_f[cnt].state) {
  2429. case 1:
  2430. if(time_after(jiffies, j->cadence_f[cnt].on1dot) &&
  2431.    !j->cadence_f[cnt].off1 &&
  2432.    !j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 &&
  2433.    !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
  2434. j->cadence_f[cnt].state = 7;
  2435. }
  2436. break;
  2437. case 3:
  2438. if(time_after(jiffies, j->cadence_f[cnt].on2dot) &&
  2439.    !j->cadence_f[cnt].off2 &&
  2440.    !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
  2441. j->cadence_f[cnt].state = 7;
  2442. }
  2443. break;
  2444. case 5:
  2445. if(time_after(jiffies, j->cadence_f[cnt].on3dot) &&
  2446.    !j->cadence_f[cnt].off3) {
  2447. j->cadence_f[cnt].state = 7;
  2448. }
  2449. break;
  2450. }
  2451. }
  2452. if (ixjdebug & 0x0040) {
  2453. printk(KERN_INFO "IXJ Tone Cadence state = %d /dev/phone%d at %ldn", j->cadence_f[cnt].state, j->board, jiffies);
  2454. switch(j->cadence_f[cnt].state) {
  2455. case 0:
  2456. printk(KERN_INFO "IXJ /dev/phone%d No Tone detectedn", j->board);
  2457. break;
  2458. case 1:
  2459. printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %u %ld - %ld - %ldn", j->board,
  2460. j->cadence_f[cnt].on1, j->cadence_f[cnt].on1min, j->cadence_f[cnt].on1dot, j->cadence_f[cnt].on1max);
  2461. break;
  2462. case 2:
  2463. printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ldn", j->board, j->cadence_f[cnt].off1min, 
  2464. j->cadence_f[cnt].off1max);
  2465. break;
  2466. case 3:
  2467. printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ldn", j->board, j->cadence_f[cnt].on2min,
  2468. j->cadence_f[cnt].on2max);
  2469. break;
  2470. case 4:
  2471. printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ldn", j->board, j->cadence_f[cnt].off2min,
  2472. j->cadence_f[cnt].off2max);
  2473. break;
  2474. case 5:
  2475. printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ldn", j->board, j->cadence_f[cnt].on3min,
  2476. j->cadence_f[cnt].on3max);
  2477. break;
  2478. case 6:
  2479. printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ldn", j->board, j->cadence_f[cnt].off3min,
  2480. j->cadence_f[cnt].off3max);
  2481. break;
  2482. }
  2483. }
  2484. if (j->cadence_f[cnt].state == 7) {
  2485. j->cadence_f[cnt].state = 0;
  2486. if (j->cadence_f[cnt].enable == 1)
  2487. j->cadence_f[cnt].enable = 0;
  2488. switch (cnt) {
  2489. case 0:
  2490. if(ixjdebug & 0x0020) {
  2491. printk(KERN_INFO "Filter Cadence 0 triggered %ldn", jiffies);
  2492. }
  2493. j->ex.bits.fc0 = 1;
  2494. ixj_kill_fasync(j, SIG_FC0, POLL_IN);
  2495. break;
  2496. case 1:
  2497. if(ixjdebug & 0x0020) {
  2498. printk(KERN_INFO "Filter Cadence 1 triggered %ldn", jiffies);
  2499. }
  2500. j->ex.bits.fc1 = 1;
  2501. ixj_kill_fasync(j, SIG_FC1, POLL_IN);
  2502. break;
  2503. case 2:
  2504. if(ixjdebug & 0x0020) {
  2505. printk(KERN_INFO "Filter Cadence 2 triggered %ldn", jiffies);
  2506. }
  2507. j->ex.bits.fc2 = 1;
  2508. ixj_kill_fasync(j, SIG_FC2, POLL_IN);
  2509. break;
  2510. case 3:
  2511. if(ixjdebug & 0x0020) {
  2512. printk(KERN_INFO "Filter Cadence 3 triggered %ldn", jiffies);
  2513. }
  2514. j->ex.bits.fc3 = 1;
  2515. ixj_kill_fasync(j, SIG_FC3, POLL_IN);
  2516. break;
  2517. }
  2518. }
  2519. if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) ||
  2520.   (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) {
  2521. if((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12))) {
  2522. trg = 1;
  2523. } else if((j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3))) {
  2524. trg = 0;
  2525. }
  2526. switch (cnt) {
  2527. case 0:
  2528. if(ixjdebug & 0x0020) {
  2529. printk(KERN_INFO "Filter 0 triggered %d at %ldn", trg, jiffies);
  2530. }
  2531. j->ex.bits.f0 = 1;
  2532. ixj_kill_fasync(j, SIG_F0, POLL_IN);
  2533. break;
  2534. case 1:
  2535. if(ixjdebug & 0x0020) {
  2536. printk(KERN_INFO "Filter 1 triggered %d at %ldn", trg, jiffies);
  2537. }
  2538. j->ex.bits.f1 = 1;
  2539. ixj_kill_fasync(j, SIG_F1, POLL_IN);
  2540. break;
  2541. case 2:
  2542. if(ixjdebug & 0x0020) {
  2543. printk(KERN_INFO "Filter 2 triggered %d at %ldn", trg, jiffies);
  2544. }
  2545. j->ex.bits.f2 = 1;
  2546. ixj_kill_fasync(j, SIG_F2, POLL_IN);
  2547. break;
  2548. case 3:
  2549. if(ixjdebug & 0x0020) {
  2550. printk(KERN_INFO "Filter 3 triggered %d at %ldn", trg, jiffies);
  2551. }
  2552. j->ex.bits.f3 = 1;
  2553. ixj_kill_fasync(j, SIG_F3, POLL_IN);
  2554. break;
  2555. }
  2556. }
  2557. }
  2558. return 0;
  2559. }
  2560. static int LineMonitor(IXJ *j)
  2561. {
  2562. if (j->dtmf_proc) {
  2563. return -1;
  2564. }
  2565. j->dtmf_proc = 1;
  2566. if (ixj_WriteDSPCommand(0x7000, j)) /* Line Monitor */
  2567. return -1;
  2568. j->dtmf.bytes.high = j->ssr.high;
  2569. j->dtmf.bytes.low = j->ssr.low;
  2570. if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) {
  2571. j->dtmf_state = 1;
  2572. j->dtmf_current = j->dtmf.bits.digit;
  2573. }
  2574. if (j->dtmf_state && !j->dtmf.bits.dtmf_valid) /* && j->dtmf_wp != j->dtmf_rp) */
  2575.  {
  2576. if(!j->cidcw_wait) {
  2577. j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current;
  2578. j->dtmf_wp++;
  2579. if (j->dtmf_wp == 79)
  2580. j->dtmf_wp = 0;
  2581. j->ex.bits.dtmf_ready = 1;
  2582. if(j->ex_sig.bits.dtmf_ready) {
  2583. ixj_kill_fasync(j, SIG_DTMF_READY, POLL_IN);
  2584. }
  2585. }
  2586. else if(j->dtmf_current == 0x00 || j->dtmf_current == 0x0D) {
  2587. if(ixjdebug & 0x0020) {
  2588. printk("IXJ phone%d saw CIDCW Ack DTMF %d from display at %ldn", j->board, j->dtmf_current, jiffies);
  2589. }
  2590. j->flags.cidcw_ack = 1;
  2591. }
  2592. j->dtmf_state = 0;
  2593. }
  2594. j->dtmf_proc = 0;
  2595. return 0;
  2596. }
  2597. /************************************************************************
  2598. *
  2599. * Functions to allow alaw <-> ulaw conversions.
  2600. *
  2601. ************************************************************************/
  2602. static void ulaw2alaw(unsigned char *buff, unsigned long len)
  2603. {
  2604. static unsigned char table_ulaw2alaw[] =
  2605. {
  2606. 0x2A, 0x2B, 0x28, 0x29, 0x2E, 0x2F, 0x2C, 0x2D, 
  2607. 0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25, 
  2608. 0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D, 
  2609. 0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35, 
  2610. 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 0x02, 
  2611. 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x1A, 
  2612. 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 0x12, 
  2613. 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x6B, 
  2614. 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 0x62, 0x63, 
  2615. 0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x7B, 0x79, 
  2616. 0x7E, 0x7F, 0x7C, 0x7D, 0x72, 0x73, 0x70, 0x71, 
  2617. 0x76, 0x77, 0x74, 0x75, 0x4B, 0x49, 0x4F, 0x4D, 
  2618. 0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45, 
  2619. 0x5A, 0x5B, 0x58, 0x59, 0x5E, 0x5F, 0x5C, 0x5D, 
  2620. 0x52, 0x52, 0x53, 0x53, 0x50, 0x50, 0x51, 0x51, 
  2621. 0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, 0xD5, 
  2622. 0xAA, 0xAB, 0xA8, 0xA9, 0xAE, 0xAF, 0xAC, 0xAD, 
  2623. 0xA2, 0xA3, 0xA0, 0xA1, 0xA6, 0xA7, 0xA4, 0xA5, 
  2624. 0xBA, 0xBB, 0xB8, 0xB9, 0xBE, 0xBF, 0xBC, 0xBD, 
  2625. 0xB2, 0xB3, 0xB0, 0xB1, 0xB6, 0xB7, 0xB4, 0xB5, 
  2626. 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 0x82, 
  2627. 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 0x9A, 
  2628. 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 0x92, 
  2629. 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0xEB, 
  2630. 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 0xE2, 0xE3, 
  2631. 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 0xFB, 0xF9, 
  2632. 0xFE, 0xFF, 0xFC, 0xFD, 0xF2, 0xF3, 0xF0, 0xF1, 
  2633. 0xF6, 0xF7, 0xF4, 0xF5, 0xCB, 0xC9, 0xCF, 0xCD, 
  2634. 0xC2, 0xC3, 0xC0, 0xC1, 0xC6, 0xC7, 0xC4, 0xC5, 
  2635. 0xDA, 0xDB, 0xD8, 0xD9, 0xDE, 0xDF, 0xDC, 0xDD, 
  2636. 0xD2, 0xD2, 0xD3, 0xD3, 0xD0, 0xD0, 0xD1, 0xD1, 
  2637. 0xD6, 0xD6, 0xD7, 0xD7, 0xD4, 0xD4, 0xD5, 0xD5
  2638. };
  2639. while (len--)
  2640. {
  2641. *buff = table_ulaw2alaw[*(unsigned char *)buff];
  2642. buff++;
  2643. }
  2644. }
  2645. static void alaw2ulaw(unsigned char *buff, unsigned long len)
  2646. {
  2647. static unsigned char table_alaw2ulaw[] =
  2648. {
  2649. 0x29, 0x2A, 0x27, 0x28, 0x2D, 0x2E, 0x2B, 0x2C, 
  2650. 0x21, 0x22, 0x1F, 0x20, 0x25, 0x26, 0x23, 0x24, 
  2651. 0x39, 0x3A, 0x37, 0x38, 0x3D, 0x3E, 0x3B, 0x3C, 
  2652. 0x31, 0x32, 0x2F, 0x30, 0x35, 0x36, 0x33, 0x34, 
  2653. 0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 
  2654. 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 
  2655. 0x1A, 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 
  2656. 0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 
  2657. 0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 
  2658. 0x5D, 0x5D, 0x5C, 0x5C, 0x5F, 0x5F, 0x5E, 0x5E, 
  2659. 0x74, 0x76, 0x70, 0x72, 0x7C, 0x7E, 0x78, 0x7A, 
  2660. 0x6A, 0x6B, 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 
  2661. 0x48, 0x49, 0x46, 0x47, 0x4C, 0x4D, 0x4A, 0x4B, 
  2662. 0x40, 0x41, 0x3F, 0x3F, 0x44, 0x45, 0x42, 0x43, 
  2663. 0x56, 0x57, 0x54, 0x55, 0x5A, 0x5B, 0x58, 0x59, 
  2664. 0x4F, 0x4F, 0x4E, 0x4E, 0x52, 0x53, 0x50, 0x51, 
  2665. 0xA9, 0xAA, 0xA7, 0xA8, 0xAD, 0xAE, 0xAB, 0xAC, 
  2666. 0xA1, 0xA2, 0x9F, 0xA0, 0xA5, 0xA6, 0xA3, 0xA4, 
  2667. 0xB9, 0xBA, 0xB7, 0xB8, 0xBD, 0xBE, 0xBB, 0xBC, 
  2668. 0xB1, 0xB2, 0xAF, 0xB0, 0xB5, 0xB6, 0xB3, 0xB4, 
  2669. 0x8A, 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 
  2670. 0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 
  2671. 0x9A, 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 
  2672. 0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 
  2673. 0xE2, 0xE3, 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 
  2674. 0xDD, 0xDD, 0xDC, 0xDC, 0xDF, 0xDF, 0xDE, 0xDE, 
  2675. 0xF4, 0xF6, 0xF0, 0xF2, 0xFC, 0xFE, 0xF8, 0xFA, 
  2676. 0xEA, 0xEB, 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 
  2677. 0xC8, 0xC9, 0xC6, 0xC7, 0xCC, 0xCD, 0xCA, 0xCB, 
  2678. 0xC0, 0xC1, 0xBF, 0xBF, 0xC4, 0xC5, 0xC2, 0xC3, 
  2679. 0xD6, 0xD7, 0xD4, 0xD5, 0xDA, 0xDB, 0xD8, 0xD9, 
  2680. 0xCF, 0xCF, 0xCE, 0xCE, 0xD2, 0xD3, 0xD0, 0xD1
  2681. };
  2682.         while (len--)
  2683.         {
  2684.                 *buff = table_alaw2ulaw[*(unsigned char *)buff];
  2685.                 buff++;
  2686. }
  2687. }
  2688. static ssize_t ixj_read(struct file * file_p, char *buf, size_t length, loff_t * ppos)
  2689. {
  2690. unsigned long i = *ppos;
  2691. IXJ * j = get_ixj(NUM(file_p->f_dentry->d_inode->i_rdev));
  2692. DECLARE_WAITQUEUE(wait, current);
  2693. if (j->flags.inread)
  2694. return -EALREADY;
  2695. j->flags.inread = 1;
  2696. add_wait_queue(&j->read_q, &wait);
  2697. set_current_state(TASK_INTERRUPTIBLE);
  2698. mb();
  2699. while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) {
  2700. ++j->read_wait;
  2701. if (file_p->f_flags & O_NONBLOCK) {
  2702. set_current_state(TASK_RUNNING);
  2703. remove_wait_queue(&j->read_q, &wait);
  2704. j->flags.inread = 0;
  2705. return -EAGAIN;
  2706. }
  2707. if (!ixj_hookstate(j)) {
  2708. set_current_state(TASK_RUNNING);
  2709. remove_wait_queue(&j->read_q, &wait);
  2710. j->flags.inread = 0;
  2711. return 0;
  2712. }
  2713. interruptible_sleep_on(&j->read_q);
  2714. if (signal_pending(current)) {
  2715. set_current_state(TASK_RUNNING);
  2716. remove_wait_queue(&j->read_q, &wait);
  2717. j->flags.inread = 0;
  2718. return -EINTR;
  2719. }
  2720. }
  2721. remove_wait_queue(&j->read_q, &wait);
  2722. set_current_state(TASK_RUNNING);
  2723. /* Don't ever copy more than the user asks */
  2724. if(j->rec_codec == ALAW)
  2725. ulaw2alaw(j->read_buffer, min(length, j->read_buffer_size));
  2726. i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size));
  2727. j->read_buffer_ready = 0;
  2728. if (i) {
  2729. j->flags.inread = 0;
  2730. return -EFAULT;
  2731. } else {
  2732. j->flags.inread = 0;
  2733. return min(length, j->read_buffer_size);
  2734. }
  2735. }
  2736. static ssize_t ixj_enhanced_read(struct file * file_p, char *buf, size_t length,
  2737.   loff_t * ppos)
  2738. {
  2739. int pre_retval;
  2740. ssize_t read_retval = 0;
  2741. IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode->i_rdev));
  2742. pre_retval = ixj_PreRead(j, 0L);
  2743. switch (pre_retval) {
  2744. case NORMAL:
  2745. read_retval = ixj_read(file_p, buf, length, ppos);
  2746. ixj_PostRead(j, 0L);
  2747. break;
  2748. case NOPOST:
  2749. read_retval = ixj_read(file_p, buf, length, ppos);
  2750. break;
  2751. case POSTONLY:
  2752. ixj_PostRead(j, 0L);
  2753. break;
  2754. default:
  2755. read_retval = pre_retval;
  2756. }
  2757. return read_retval;
  2758. }
  2759. static ssize_t ixj_write(struct file *file_p, const char *buf, size_t count, loff_t * ppos)
  2760. {
  2761. unsigned long i = *ppos;
  2762. IXJ *j = file_p->private_data;
  2763. DECLARE_WAITQUEUE(wait, current);
  2764. if (j->flags.inwrite)
  2765. return -EALREADY;
  2766. j->flags.inwrite = 1;
  2767. add_wait_queue(&j->write_q, &wait);
  2768. set_current_state(TASK_INTERRUPTIBLE);
  2769. mb();
  2770. while (!j->write_buffers_empty) {
  2771. ++j->write_wait;
  2772. if (file_p->f_flags & O_NONBLOCK) {
  2773. set_current_state(TASK_RUNNING);
  2774. remove_wait_queue(&j->write_q, &wait);
  2775. j->flags.inwrite = 0;
  2776. return -EAGAIN;
  2777. }
  2778. if (!ixj_hookstate(j)) {
  2779. set_current_state(TASK_RUNNING);
  2780. remove_wait_queue(&j->write_q, &wait);
  2781. j->flags.inwrite = 0;
  2782. return 0;
  2783. }
  2784. interruptible_sleep_on(&j->write_q);
  2785. if (signal_pending(current)) {
  2786. set_current_state(TASK_RUNNING);
  2787. remove_wait_queue(&j->write_q, &wait);
  2788. j->flags.inwrite = 0;
  2789. return -EINTR;
  2790. }
  2791. }
  2792. set_current_state(TASK_RUNNING);
  2793. remove_wait_queue(&j->write_q, &wait);
  2794. if (j->write_buffer_wp + count >= j->write_buffer_end)
  2795. j->write_buffer_wp = j->write_buffer;
  2796. i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size));
  2797. if (i) {
  2798. j->flags.inwrite = 0;
  2799. return -EFAULT;
  2800. }
  2801.        if(j->play_codec == ALAW)
  2802.                alaw2ulaw(j->write_buffer_wp, min(count, j->write_buffer_size));
  2803. j->flags.inwrite = 0;
  2804. return min(count, j->write_buffer_size);
  2805. }
  2806. static ssize_t ixj_enhanced_write(struct file * file_p, const char *buf, size_t count, loff_t * ppos)
  2807. {
  2808. int pre_retval;
  2809. ssize_t write_retval = 0;
  2810. IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode->i_rdev));
  2811. pre_retval = ixj_PreWrite(j, 0L);
  2812. switch (pre_retval) {
  2813. case NORMAL:
  2814. write_retval = ixj_write(file_p, buf, count, ppos);
  2815. if (write_retval > 0) {
  2816. ixj_PostWrite(j, 0L);
  2817. j->write_buffer_wp += write_retval;
  2818. j->write_buffers_empty--;
  2819. }
  2820. break;
  2821. case NOPOST:
  2822. write_retval = ixj_write(file_p, buf, count, ppos);
  2823. if (write_retval > 0) {
  2824. j->write_buffer_wp += write_retval;
  2825. j->write_buffers_empty--;
  2826. }
  2827. break;
  2828. case POSTONLY:
  2829. ixj_PostWrite(j, 0L);
  2830. break;
  2831. default:
  2832. write_retval = pre_retval;
  2833. }
  2834. return write_retval;
  2835. }
  2836. static void ixj_read_frame(IXJ *j)
  2837. {
  2838. int cnt, dly;
  2839. if (j->read_buffer) {
  2840. for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
  2841. if (!(cnt % 16) && !IsRxReady(j)) {
  2842. dly = 0;
  2843. while (!IsRxReady(j)) {
  2844. if (dly++ > 5) {
  2845. dly = 0;
  2846. break;
  2847. }
  2848. udelay(10);
  2849. }
  2850. }
  2851. /* Throw away word 0 of the 8021 compressed format to get standard G.729. */
  2852. if (j->rec_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
  2853. inb_p(j->DSPbase + 0x0E);
  2854. inb_p(j->DSPbase + 0x0F);
  2855. }
  2856. *(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E);
  2857. *(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F);
  2858. }
  2859. ++j->framesread;
  2860. if (j->intercom != -1) {
  2861. if (IsTxReady(get_ixj(j->intercom))) {
  2862. for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
  2863. if (!(cnt % 16) && !IsTxReady(j)) {
  2864. dly = 0;
  2865. while (!IsTxReady(j)) {
  2866. if (dly++ > 5) {
  2867. dly = 0;
  2868. break;
  2869. }
  2870. udelay(10);
  2871. }
  2872. }
  2873. outb_p(*(j->read_buffer + cnt), get_ixj(j->intercom)->DSPbase + 0x0C);
  2874. outb_p(*(j->read_buffer + cnt + 1), get_ixj(j->intercom)->DSPbase + 0x0D);
  2875. }
  2876. get_ixj(j->intercom)->frameswritten++;
  2877. }
  2878. } else {
  2879. j->read_buffer_ready = 1;
  2880. wake_up_interruptible(&j->read_q); /* Wake any blocked readers */
  2881. wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
  2882. if(j->ixj_signals[SIG_READ_READY])
  2883. ixj_kill_fasync(j, SIG_READ_READY, POLL_OUT);
  2884. }
  2885. }
  2886. }
  2887. static short fsk[][6][20] =
  2888. {
  2889. {
  2890. {
  2891. 0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196,
  2892. -16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722
  2893. },
  2894. {
  2895. -28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481,
  2896. -32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876
  2897. },
  2898. {
  2899. -28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715,
  2900. -16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846
  2901. },
  2902. {
  2903. 0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196,
  2904. 16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722
  2905. },
  2906. {
  2907. 28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481,
  2908. 32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876
  2909. },
  2910. {
  2911. 28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715,
  2912. 16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846
  2913. }
  2914. },
  2915. {
  2916. {
  2917. 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126,
  2918. 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126
  2919. },
  2920. {
  2921. -28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051,
  2922. 28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051
  2923. },
  2924. {
  2925. -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925,
  2926. 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925
  2927. },
  2928. {
  2929. 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126,
  2930. 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126
  2931. },
  2932. {
  2933. 28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051,
  2934. -28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051
  2935. },
  2936. {
  2937. 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925,
  2938. -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925
  2939. }
  2940. }
  2941. };
  2942. static void ixj_write_cid_bit(IXJ *j, int bit)
  2943. {
  2944. while (j->fskcnt < 20) {
  2945. if(j->fskdcnt < (j->fsksize - 1))
  2946. j->fskdata[j->fskdcnt++] = fsk[bit][j->fskz][j->fskcnt];
  2947. j->fskcnt += 3;
  2948. }
  2949. j->fskcnt %= 20;
  2950. if (!bit)
  2951. j->fskz++;
  2952. if (j->fskz >= 6)
  2953. j->fskz = 0;
  2954. }
  2955. static void ixj_write_cid_byte(IXJ *j, char byte)
  2956. {
  2957. IXJ_CBYTE cb;
  2958. cb.cbyte = byte;
  2959. ixj_write_cid_bit(j, 0);
  2960. ixj_write_cid_bit(j, cb.cbits.b0 ? 1 : 0);
  2961. ixj_write_cid_bit(j, cb.cbits.b1 ? 1 : 0);
  2962. ixj_write_cid_bit(j, cb.cbits.b2 ? 1 : 0);
  2963. ixj_write_cid_bit(j, cb.cbits.b3 ? 1 : 0);
  2964. ixj_write_cid_bit(j, cb.cbits.b4 ? 1 : 0);
  2965. ixj_write_cid_bit(j, cb.cbits.b5 ? 1 : 0);
  2966. ixj_write_cid_bit(j, cb.cbits.b6 ? 1 : 0);
  2967. ixj_write_cid_bit(j, cb.cbits.b7 ? 1 : 0);
  2968. ixj_write_cid_bit(j, 1);
  2969. }
  2970. static void ixj_write_cid_seize(IXJ *j)
  2971. {
  2972. int cnt;
  2973. for (cnt = 0; cnt < 150; cnt++) {
  2974. ixj_write_cid_bit(j, 0);
  2975. ixj_write_cid_bit(j, 1);
  2976. }
  2977. for (cnt = 0; cnt < 180; cnt++) {
  2978. ixj_write_cid_bit(j, 1);
  2979. }
  2980. }
  2981. static void ixj_write_cidcw_seize(IXJ *j)
  2982. {
  2983. int cnt;
  2984. for (cnt = 0; cnt < 80; cnt++) {
  2985. ixj_write_cid_bit(j, 1);
  2986. }
  2987. }
  2988. static int ixj_write_cid_string(IXJ *j, char *s, int checksum)
  2989. {
  2990. int cnt;
  2991. for (cnt = 0; cnt < strlen(s); cnt++) {
  2992. ixj_write_cid_byte(j, s[cnt]);
  2993. checksum = (checksum + s[cnt]);
  2994. }
  2995. return checksum;
  2996. }
  2997. static void ixj_pad_fsk(IXJ *j, int pad)
  2998. {
  2999. int cnt; 
  3000. for (cnt = 0; cnt < pad; cnt++) {
  3001. if(j->fskdcnt < (j->fsksize - 1))
  3002. j->fskdata[j->fskdcnt++] = 0x0000;
  3003. }
  3004. for (cnt = 0; cnt < 720; cnt++) {
  3005. if(j->fskdcnt < (j->fsksize - 1))
  3006. j->fskdata[j->fskdcnt++] = 0x0000;
  3007. }
  3008. }
  3009. static void ixj_pre_cid(IXJ *j)
  3010. {
  3011. j->cid_play_codec = j->play_codec;
  3012. j->cid_play_frame_size = j->play_frame_size;
  3013. j->cid_play_volume = get_play_volume(j);
  3014. j->cid_play_flag = j->flags.playing;
  3015. j->cid_rec_codec = j->rec_codec;
  3016. j->cid_rec_volume = get_rec_volume(j);
  3017. j->cid_rec_flag = j->flags.recording;
  3018. j->cid_play_aec_level = j->aec_level;
  3019. switch(j->baseframe.low) {
  3020. case 0xA0:
  3021. j->cid_base_frame_size = 20;
  3022. break;
  3023. case 0x50:
  3024. j->cid_base_frame_size = 10;
  3025. break;
  3026. case 0xF0:
  3027. j->cid_base_frame_size = 30;
  3028. break;
  3029. }
  3030. ixj_play_stop(j);
  3031. ixj_cpt_stop(j);
  3032. j->flags.cidplay = 1;
  3033. set_base_frame(j, 30);
  3034. set_play_codec(j, LINEAR16);
  3035. set_play_volume(j, 0x1B);
  3036. ixj_play_start(j);
  3037. }
  3038. static void ixj_post_cid(IXJ *j)
  3039. {
  3040. ixj_play_stop(j);
  3041. if(j->cidsize > 5000) {
  3042. SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
  3043. }
  3044. j->flags.cidplay = 0;
  3045. if(ixjdebug & 0x0200) {
  3046. printk("IXJ phone%d Finished Playing CallerID data %ldn", j->board, jiffies);
  3047. }
  3048. ixj_fsk_free(j);
  3049. j->fskdcnt = 0;
  3050. set_base_frame(j, j->cid_base_frame_size);
  3051. set_play_codec(j, j->cid_play_codec);
  3052. ixj_aec_start(j, j->cid_play_aec_level);
  3053. set_play_volume(j, j->cid_play_volume);
  3054. set_rec_codec(j, j->cid_rec_codec);
  3055. set_rec_volume(j, j->cid_rec_volume);
  3056. if(j->cid_rec_flag)
  3057. ixj_record_start(j);
  3058. if(j->cid_play_flag)
  3059. ixj_play_start(j);
  3060. if(j->cid_play_flag) {
  3061. wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
  3062. }
  3063. }
  3064. static void ixj_write_cid(IXJ *j)
  3065. {
  3066. char sdmf1[50];
  3067. char sdmf2[50];
  3068. char sdmf3[80];
  3069. char mdmflen, len1, len2, len3;
  3070. int pad;
  3071. int checksum = 0;
  3072. if (j->dsp.low == 0x20 || j->flags.cidplay)
  3073. return;
  3074. j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
  3075. j->cidsize = j->cidcnt = 0;
  3076. ixj_fsk_alloc(j);
  3077. strcpy(sdmf1, j->cid_send.month);
  3078. strcat(sdmf1, j->cid_send.day);
  3079. strcat(sdmf1, j->cid_send.hour);
  3080. strcat(sdmf1, j->cid_send.min);
  3081. strcpy(sdmf2, j->cid_send.number);
  3082. strcpy(sdmf3, j->cid_send.name);
  3083. len1 = strlen(sdmf1);
  3084. len2 = strlen(sdmf2);
  3085. len3 = strlen(sdmf3);
  3086. mdmflen = len1 + len2 + len3 + 6;
  3087. while(1){
  3088. ixj_write_cid_seize(j);
  3089. ixj_write_cid_byte(j, 0x80);
  3090. checksum = 0x80;
  3091. ixj_write_cid_byte(j, mdmflen);
  3092. checksum = checksum + mdmflen;
  3093. ixj_write_cid_byte(j, 0x01);
  3094. checksum = checksum + 0x01;
  3095. ixj_write_cid_byte(j, len1);
  3096. checksum = checksum + len1;
  3097. checksum = ixj_write_cid_string(j, sdmf1, checksum);
  3098. if(ixj_hookstate(j) & 1)
  3099. break;
  3100. ixj_write_cid_byte(j, 0x02);
  3101. checksum = checksum + 0x02;
  3102. ixj_write_cid_byte(j, len2);
  3103. checksum = checksum + len2;
  3104. checksum = ixj_write_cid_string(j, sdmf2, checksum);
  3105. if(ixj_hookstate(j) & 1)
  3106. break;
  3107. ixj_write_cid_byte(j, 0x07);
  3108. checksum = checksum + 0x07;
  3109. ixj_write_cid_byte(j, len3);
  3110. checksum = checksum + len3;
  3111. checksum = ixj_write_cid_string(j, sdmf3, checksum);
  3112. if(ixj_hookstate(j) & 1)
  3113. break;
  3114. checksum %= 256;
  3115. checksum ^= 0xFF;
  3116. checksum += 1;
  3117. ixj_write_cid_byte(j, (char) checksum);
  3118. pad = j->fskdcnt % 240;
  3119. if (pad) {
  3120. pad = 240 - pad;
  3121. }
  3122. ixj_pad_fsk(j, pad);
  3123. break;
  3124. }
  3125. ixj_write_frame(j);
  3126. }
  3127. static void ixj_write_cidcw(IXJ *j)
  3128. {
  3129. IXJ_TONE ti;
  3130. char sdmf1[50];
  3131. char sdmf2[50];
  3132. char sdmf3[80];
  3133. char mdmflen, len1, len2, len3;
  3134. int pad;
  3135. int checksum = 0;
  3136. if (j->dsp.low == 0x20 || j->flags.cidplay)
  3137. return;
  3138. j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
  3139. j->cidsize = j->cidcnt = 0;
  3140. ixj_fsk_alloc(j);
  3141. j->flags.cidcw_ack = 0;
  3142. ti.tone_index = 23;
  3143. ti.gain0 = 1;
  3144. ti.freq0 = hz440;
  3145. ti.gain1 = 0;
  3146. ti.freq1 = 0;
  3147. ixj_init_tone(j, &ti);
  3148. ixj_set_tone_on(1500, j);
  3149. ixj_set_tone_off(32, j);
  3150. if(ixjdebug & 0x0200) {
  3151. printk("IXJ cidcw phone%d first tone start at %ldn", j->board, jiffies);
  3152. }
  3153. ixj_play_tone(j, 23);
  3154. clear_bit(j->board, &j->busyflags);
  3155. while(j->tone_state) {
  3156. set_current_state(TASK_INTERRUPTIBLE);
  3157. schedule_timeout(1);
  3158. }
  3159. while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
  3160. set_current_state(TASK_INTERRUPTIBLE);
  3161. schedule_timeout(1);
  3162. }
  3163. if(ixjdebug & 0x0200) {
  3164. printk("IXJ cidcw phone%d first tone end at %ldn", j->board, jiffies);
  3165. }
  3166. ti.tone_index = 24;
  3167. ti.gain0 = 1;
  3168. ti.freq0 = hz2130;
  3169. ti.gain1 = 0;
  3170. ti.freq1 = hz2750;
  3171. ixj_init_tone(j, &ti);
  3172. ixj_set_tone_off(10, j);
  3173. ixj_set_tone_on(600, j);
  3174. if(ixjdebug & 0x0200) {
  3175. printk("IXJ cidcw phone%d second tone start at %ldn", j->board, jiffies);
  3176. }
  3177. ixj_play_tone(j, 24);
  3178. clear_bit(j->board, &j->busyflags);
  3179. while(j->tone_state) {
  3180. set_current_state(TASK_INTERRUPTIBLE);
  3181. schedule_timeout(1);
  3182. }
  3183. while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
  3184. set_current_state(TASK_INTERRUPTIBLE);
  3185. schedule_timeout(1);
  3186. }
  3187. if(ixjdebug & 0x0200) {
  3188. printk("IXJ cidcw phone%d sent second tone at %ldn", j->board, jiffies);
  3189. }
  3190. j->cidcw_wait = jiffies + ((50 * hertz) / 100);
  3191. clear_bit(j->board, &j->busyflags);
  3192. while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait)) {
  3193. set_current_state(TASK_INTERRUPTIBLE);
  3194. schedule_timeout(1);
  3195. }
  3196. while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
  3197. set_current_state(TASK_INTERRUPTIBLE);
  3198. schedule_timeout(1);
  3199. }
  3200. j->cidcw_wait = 0;
  3201. if(!j->flags.cidcw_ack) {
  3202. if(ixjdebug & 0x0200) {
  3203. printk("IXJ cidcw phone%d did not receive ACK from display %ldn", j->board, jiffies);
  3204. }
  3205. ixj_post_cid(j);
  3206. if(j->cid_play_flag) {
  3207. wake_up_interruptible(&j->write_q); /* Wake any blocked readers */
  3208. }
  3209. return;
  3210. } else {
  3211. ixj_pre_cid(j);
  3212. }
  3213. j->flags.cidcw_ack = 0;
  3214. strcpy(sdmf1, j->cid_send.month);
  3215. strcat(sdmf1, j->cid_send.day);
  3216. strcat(sdmf1, j->cid_send.hour);
  3217. strcat(sdmf1, j->cid_send.min);
  3218. strcpy(sdmf2, j->cid_send.number);
  3219. strcpy(sdmf3, j->cid_send.name);
  3220. len1 = strlen(sdmf1);
  3221. len2 = strlen(sdmf2);
  3222. len3 = strlen(sdmf3);
  3223. mdmflen = len1 + len2 + len3 + 6;
  3224. ixj_write_cidcw_seize(j);
  3225. ixj_write_cid_byte(j, 0x80);
  3226. checksum = 0x80;
  3227. ixj_write_cid_byte(j, mdmflen);
  3228. checksum = checksum + mdmflen;
  3229. ixj_write_cid_byte(j, 0x01);
  3230. checksum = checksum + 0x01;
  3231. ixj_write_cid_byte(j, len1);
  3232. checksum = checksum + len1;
  3233. checksum = ixj_write_cid_string(j, sdmf1, checksum);
  3234. ixj_write_cid_byte(j, 0x02);
  3235. checksum = checksum + 0x02;
  3236. ixj_write_cid_byte(j, len2);
  3237. checksum = checksum + len2;
  3238. checksum = ixj_write_cid_string(j, sdmf2, checksum);
  3239. ixj_write_cid_byte(j, 0x07);
  3240. checksum = checksum + 0x07;
  3241. ixj_write_cid_byte(j, len3);
  3242. checksum = checksum + len3;
  3243. checksum = ixj_write_cid_string(j, sdmf3, checksum);
  3244. checksum %= 256;
  3245. checksum ^= 0xFF;
  3246. checksum += 1;
  3247. ixj_write_cid_byte(j, (char) checksum);
  3248. pad = j->fskdcnt % 240;
  3249. if (pad) {
  3250. pad = 240 - pad;
  3251. }
  3252. ixj_pad_fsk(j, pad);
  3253. if(ixjdebug & 0x0200) {
  3254. printk("IXJ cidcw phone%d sent FSK data at %ldn", j->board, jiffies);
  3255. }
  3256. }
  3257. static void ixj_write_vmwi(IXJ *j, int msg)
  3258. {
  3259. char mdmflen;
  3260. int pad;
  3261. int checksum = 0;
  3262. if (j->dsp.low == 0x20 || j->flags.cidplay)
  3263. return;
  3264. j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
  3265. j->cidsize = j->cidcnt = 0;
  3266. ixj_fsk_alloc(j);
  3267. mdmflen = 3;
  3268. if (j->port == PORT_POTS)
  3269. SLIC_SetState(PLD_SLIC_STATE_OHT, j);
  3270. ixj_write_cid_seize(j);
  3271. ixj_write_cid_byte(j, 0x82);
  3272. checksum = 0x82;
  3273. ixj_write_cid_byte(j, mdmflen);
  3274. checksum = checksum + mdmflen;
  3275. ixj_write_cid_byte(j, 0x0B);
  3276. checksum = checksum + 0x0B;
  3277. ixj_write_cid_byte(j, 1);
  3278. checksum = checksum + 1;
  3279. if(msg) {
  3280. ixj_write_cid_byte(j, 0xFF);
  3281. checksum = checksum + 0xFF;
  3282. }
  3283. else {
  3284. ixj_write_cid_byte(j, 0x00);
  3285. checksum = checksum + 0x00;
  3286. }